From ab3f8bb444895ad187ad4d47a6720e4b04ce051a Mon Sep 17 00:00:00 2001 From: liyulin <501351981@qq.com> Date: Wed, 23 Aug 2023 17:20:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20js=E9=A2=84=E8=A7=88pdf=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E6=80=A7=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/packages/js-pdf/package.json | 2 +- core/packages/js-pdf/src/pdf.js | 2 +- core/packages/js-pdf/src/worker.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/packages/js-pdf/package.json b/core/packages/js-pdf/package.json index ba460b9..9d1f2e8 100644 --- a/core/packages/js-pdf/package.json +++ b/core/packages/js-pdf/package.json @@ -1,7 +1,7 @@ { "name": "@js-preview/pdf", "type" :"module", - "version": "1.4.1", + "version": "1.5.0", "description": "", "main": "lib/index.js", "files": [ diff --git a/core/packages/js-pdf/src/pdf.js b/core/packages/js-pdf/src/pdf.js index 5d77c7c..e6bb151 100644 --- a/core/packages/js-pdf/src/pdf.js +++ b/core/packages/js-pdf/src/pdf.js @@ -1 +1 @@ -export const pdfLibJsStr = 'IWZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoInBkZmpzLWRpc3QvYnVpbGQvcGRmIixbXSxlKToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1sicGRmanMtZGlzdC9idWlsZC9wZGYiXT1lKCk6dFsicGRmanMtZGlzdC9idWlsZC9wZGYiXT10LnBkZmpzTGliPWUoKX0oZ2xvYmFsVGhpcywoKCk9PigoKT0+e3ZhciBfX3dlYnBhY2tfbW9kdWxlc19fPVssKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5WZXJib3NpdHlMZXZlbD1lLlV0aWw9ZS5Vbmtub3duRXJyb3JFeGNlcHRpb249ZS5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb249ZS5UZXh0UmVuZGVyaW5nTW9kZT1lLlJlbmRlcmluZ0ludGVudEZsYWc9ZS5Qcm9taXNlQ2FwYWJpbGl0eT1lLlBlcm1pc3Npb25GbGFnPWUuUGFzc3dvcmRSZXNwb25zZXM9ZS5QYXNzd29yZEV4Y2VwdGlvbj1lLlBhZ2VBY3Rpb25FdmVudFR5cGU9ZS5PUFM9ZS5NaXNzaW5nUERGRXhjZXB0aW9uPWUuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEU9ZS5MSU5FX0ZBQ1RPUj1lLkxJTkVfREVTQ0VOVF9GQUNUT1I9ZS5JbnZhbGlkUERGRXhjZXB0aW9uPWUuSW1hZ2VLaW5kPWUuSURFTlRJVFlfTUFUUklYPWUuRm9ybWF0RXJyb3I9ZS5GZWF0dXJlVGVzdD1lLkZPTlRfSURFTlRJVFlfTUFUUklYPWUuRG9jdW1lbnRBY3Rpb25FdmVudFR5cGU9ZS5DTWFwQ29tcHJlc3Npb25UeXBlPWUuQmFzZUV4Y2VwdGlvbj1lLkJBU0VMSU5FX0ZBQ1RPUj1lLkFubm90YXRpb25UeXBlPWUuQW5ub3RhdGlvblJlcGx5VHlwZT1lLkFubm90YXRpb25Nb2RlPWUuQW5ub3RhdGlvbkZsYWc9ZS5Bbm5vdGF0aW9uRmllbGRGbGFnPWUuQW5ub3RhdGlvbkVkaXRvclR5cGU9ZS5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4PWUuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGU9ZS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlPWUuQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZT1lLkFib3J0RXhjZXB0aW9uPXZvaWQgMDtlLmFzc2VydD1mdW5jdGlvbiBhc3NlcnQodCxlKXt0fHx1bnJlYWNoYWJsZShlKX07ZS5ieXRlc1RvU3RyaW5nPWJ5dGVzVG9TdHJpbmc7ZS5jcmVhdGVWYWxpZEFic29sdXRlVXJsPWZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwsbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZighdClyZXR1cm4gbnVsbDt0cnl7aWYobiYmInN0cmluZyI9PXR5cGVvZiB0KXtpZihuLmFkZERlZmF1bHRQcm90b2NvbCYmdC5zdGFydHNXaXRoKCJ3d3cuIikpe2NvbnN0IGU9dC5tYXRjaCgvXC4vZyk7ZT8ubGVuZ3RoPj0yJiYodD1gaHR0cDovLyR7dH1gKX1pZihuLnRyeUNvbnZlcnRFbmNvZGluZyl0cnl7dD1zdHJpbmdUb1VURjhTdHJpbmcodCl9Y2F0Y2h7fX1jb25zdCBpPWU/bmV3IFVSTCh0LGUpOm5ldyBVUkwodCk7aWYoZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh0KXtzd2l0Y2godD8ucHJvdG9jb2wpe2Nhc2UiaHR0cDoiOmNhc2UiaHR0cHM6IjpjYXNlImZ0cDoiOmNhc2UibWFpbHRvOiI6Y2FzZSJ0ZWw6IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0oaSkpcmV0dXJuIGl9Y2F0Y2h7fXJldHVybiBudWxsfTtlLmdldE1vZGlmaWNhdGlvbkRhdGU9ZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpuZXcgRGF0ZTtyZXR1cm5bdC5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksKHQuZ2V0VVRDTW9udGgoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSx0LmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSx0LmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksdC5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksdC5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIildLmpvaW4oIiIpfTtlLmdldFV1aWQ9ZnVuY3Rpb24gZ2V0VXVpZCgpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgY3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YgY3J5cHRvPy5yYW5kb21VVUlEKXJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO2NvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkoMzIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgY3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YgY3J5cHRvPy5nZXRSYW5kb21WYWx1ZXMpY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh0KTtlbHNlIGZvcihsZXQgZT0wO2U8MzI7ZSsrKXRbZV09TWF0aC5mbG9vcigyNTUqTWF0aC5yYW5kb20oKSk7cmV0dXJuIGJ5dGVzVG9TdHJpbmcodCl9O2UuZ2V0VmVyYm9zaXR5TGV2ZWw9ZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKXtyZXR1cm4gc307ZS5pbmZvPWZ1bmN0aW9uIGluZm8odCl7cz49ci5JTkZPUyYmY29uc29sZS5sb2coYEluZm86ICR7dH1gKX07ZS5pc0FycmF5QnVmZmVyPWZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZ2b2lkIDAhPT10Py5ieXRlTGVuZ3RofTtlLmlzQXJyYXlFcXVhbD1mdW5jdGlvbiBpc0FycmF5RXF1YWwodCxlKXtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKylpZih0W25dIT09ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH07ZS5pc05vZGVKUz12b2lkIDA7ZS5ub3JtYWxpemVVbmljb2RlPWZ1bmN0aW9uIG5vcm1hbGl6ZVVuaWNvZGUodCl7aWYoIWMpe2M9LyhbXHUwMGEwXHUwMGI1XHUwMzdlXHUwZWIzXHUyMDAwLVx1MjAwYVx1MjAyZlx1MjEyNlx1ZmIwMC1cdWZiMDRcdWZiMDZcdWZiMjAtXHVmYjM2XHVmYjM4LVx1ZmIzY1x1ZmIzZVx1ZmI0MC1cdWZiNDFcdWZiNDMtXHVmYjQ0XHVmYjQ2LVx1ZmJhMVx1ZmJhNC1cdWZiYTlcdWZiYWUtXHVmYmIxXHVmYmQzLVx1ZmJkY1x1ZmJkZS1cdWZiZTdcdWZiZWEtXHVmYmY4XHVmYmZjLVx1ZmJmZFx1ZmMwMC1cdWZjNWRcdWZjNjQtXHVmY2YxXHVmY2Y1LVx1ZmQzZFx1ZmQ4OFx1ZmRmNFx1ZmRmYS1cdWZkZmJcdWZlNzFcdWZlNzdcdWZlNzlcdWZlN2JcdWZlN2RdKyl8KFx1ZmIwNSspL2d1O2g9bmV3IE1hcChbWyLvrIUiLCLFv3QiXV0pfXJldHVybiB0LnJlcGxhY2VBbGwoYywoKHQsZSxuKT0+ZT9lLm5vcm1hbGl6ZSgiTkZLQyIpOmguZ2V0KG4pKSl9O2Uub2JqZWN0RnJvbU1hcD1mdW5jdGlvbiBvYmplY3RGcm9tTWFwKHQpe2NvbnN0IGU9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3RbbixpXW9mIHQpZVtuXT1pO3JldHVybiBlfTtlLm9iamVjdFNpemU9ZnVuY3Rpb24gb2JqZWN0U2l6ZSh0KXtyZXR1cm4gT2JqZWN0LmtleXModCkubGVuZ3RofTtlLnNldFZlcmJvc2l0eUxldmVsPWZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKHQpe051bWJlci5pc0ludGVnZXIodCkmJihzPXQpfTtlLnNoYWRvdz1zaGFkb3c7ZS5zdHJpbmczMj1mdW5jdGlvbiBzdHJpbmczMih0KXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4yNCYyNTUsdD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0KX07ZS5zdHJpbmdUb0J5dGVzPXN0cmluZ1RvQnl0ZXM7ZS5zdHJpbmdUb1BERlN0cmluZz1mdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyh0KXtpZih0WzBdPj0iw68iKXtsZXQgZTsiw74iPT09dFswXSYmIsO/Ij09PXRbMV0/ZT0idXRmLTE2YmUiOiLDvyI9PT10WzBdJiYiw74iPT09dFsxXT9lPSJ1dGYtMTZsZSI6IsOvIj09PXRbMF0mJiLCuyI9PT10WzFdJiYiwr8iPT09dFsyXSYmKGU9InV0Zi04Iik7aWYoZSl0cnl7Y29uc3Qgbj1uZXcgVGV4dERlY29kZXIoZSx7ZmF0YWw6ITB9KSxpPXN0cmluZ1RvQnl0ZXModCk7cmV0dXJuIG4uZGVjb2RlKGkpfWNhdGNoKHQpe3dhcm4oYHN0cmluZ1RvUERGU3RyaW5nOiAiJHt0fSIuYCl9fWNvbnN0IGU9W107Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPWxbdC5jaGFyQ29kZUF0KG4pXTtlLnB1c2goaT9TdHJpbmcuZnJvbUNoYXJDb2RlKGkpOnQuY2hhckF0KG4pKX1yZXR1cm4gZS5qb2luKCIiKX07ZS5zdHJpbmdUb1VURjhTdHJpbmc9c3RyaW5nVG9VVEY4U3RyaW5nO2UudW5yZWFjaGFibGU9dW5yZWFjaGFibGU7ZS51dGY4U3RyaW5nVG9TdHJpbmc9ZnVuY3Rpb24gdXRmOFN0cmluZ1RvU3RyaW5nKHQpe3JldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodCkpfTtlLndhcm49d2FybjtuKDIpO24oODQpO24oODYpO24oODcpO24oODkpO24oOTMpO24oMTAxKTtuKDEwMik7bigxMDUpO24oMTA3KTtuKDEwOSk7bigxMTMpO24oMTE2KTtuKDEyMyk7Y29uc3QgaT0hKCJvYmplY3QiIT10eXBlb2YgcHJvY2Vzc3x8cHJvY2VzcysiIiE9IltvYmplY3QgcHJvY2Vzc10ifHxwcm9jZXNzLnZlcnNpb25zLm53fHxwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uJiZwcm9jZXNzLnR5cGUmJiJicm93c2VyIiE9PXByb2Nlc3MudHlwZSk7ZS5pc05vZGVKUz1pO2UuSURFTlRJVFlfTUFUUklYPVsxLDAsMCwxLDAsMF07ZS5GT05UX0lERU5USVRZX01BVFJJWD1bLjAwMSwwLDAsLjAwMSwwLDBdO2UuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEU9MWU3O2UuTElORV9GQUNUT1I9MS4zNTtlLkxJTkVfREVTQ0VOVF9GQUNUT1I9LjM1O2UuQkFTRUxJTkVfRkFDVE9SPS4yNTkyNTkyNTkyNTkyNTkyNDtlLlJlbmRlcmluZ0ludGVudEZsYWc9e0FOWToxLERJU1BMQVk6MixQUklOVDo0LFNBVkU6OCxBTk5PVEFUSU9OU19GT1JNUzoxNixBTk5PVEFUSU9OU19TVE9SQUdFOjMyLEFOTk9UQVRJT05TX0RJU0FCTEU6NjQsT1BMSVNUOjI1Nn07ZS5Bbm5vdGF0aW9uTW9kZT17RElTQUJMRTowLEVOQUJMRToxLEVOQUJMRV9GT1JNUzoyLEVOQUJMRV9TVE9SQUdFOjN9O2UuQW5ub3RhdGlvbkVkaXRvclByZWZpeD0icGRmanNfaW50ZXJuYWxfZWRpdG9yXyI7ZS5Bbm5vdGF0aW9uRWRpdG9yVHlwZT17RElTQUJMRTotMSxOT05FOjAsRlJFRVRFWFQ6MyxTVEFNUDoxMyxJTks6MTV9O2UuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGU9e1JFU0laRToxLEZSRUVURVhUX1NJWkU6MTEsRlJFRVRFWFRfQ09MT1I6MTIsRlJFRVRFWFRfT1BBQ0lUWToxMyxJTktfQ09MT1I6MjEsSU5LX1RISUNLTkVTUzoyMixJTktfT1BBQ0lUWToyM307ZS5QZXJtaXNzaW9uRmxhZz17UFJJTlQ6NCxNT0RJRllfQ09OVEVOVFM6OCxDT1BZOjE2LE1PRElGWV9BTk5PVEFUSU9OUzozMixGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOjI1NixDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOjUxMixBU1NFTUJMRToxMDI0LFBSSU5UX0hJR0hfUVVBTElUWToyMDQ4fTtlLlRleHRSZW5kZXJpbmdNb2RlPXtGSUxMOjAsU1RST0tFOjEsRklMTF9TVFJPS0U6MixJTlZJU0lCTEU6MyxGSUxMX0FERF9UT19QQVRIOjQsU1RST0tFX0FERF9UT19QQVRIOjUsRklMTF9TVFJPS0VfQUREX1RPX1BBVEg6NixBRERfVE9fUEFUSDo3LEZJTExfU1RST0tFX01BU0s6MyxBRERfVE9fUEFUSF9GTEFHOjR9O2UuSW1hZ2VLaW5kPXtHUkFZU0NBTEVfMUJQUDoxLFJHQl8yNEJQUDoyLFJHQkFfMzJCUFA6M307ZS5Bbm5vdGF0aW9uVHlwZT17VEVYVDoxLExJTks6MixGUkVFVEVYVDozLExJTkU6NCxTUVVBUkU6NSxDSVJDTEU6NixQT0xZR09OOjcsUE9MWUxJTkU6OCxISUdITElHSFQ6OSxVTkRFUkxJTkU6MTAsU1FVSUdHTFk6MTEsU1RSSUtFT1VUOjEyLFNUQU1QOjEzLENBUkVUOjE0LElOSzoxNSxQT1BVUDoxNixGSUxFQVRUQUNITUVOVDoxNyxTT1VORDoxOCxNT1ZJRToxOSxXSURHRVQ6MjAsU0NSRUVOOjIxLFBSSU5URVJNQVJLOjIyLFRSQVBORVQ6MjMsV0FURVJNQVJLOjI0LFRIUkVFRDoyNSxSRURBQ1Q6MjZ9O2UuQW5ub3RhdGlvblJlcGx5VHlwZT17R1JPVVA6Ikdyb3VwIixSRVBMWToiUiJ9O2UuQW5ub3RhdGlvbkZsYWc9e0lOVklTSUJMRToxLEhJRERFTjoyLFBSSU5UOjQsTk9aT09NOjgsTk9ST1RBVEU6MTYsTk9WSUVXOjMyLFJFQURPTkxZOjY0LExPQ0tFRDoxMjgsVE9HR0xFTk9WSUVXOjI1NixMT0NLRURDT05URU5UUzo1MTJ9O2UuQW5ub3RhdGlvbkZpZWxkRmxhZz17UkVBRE9OTFk6MSxSRVFVSVJFRDoyLE5PRVhQT1JUOjQsTVVMVElMSU5FOjQwOTYsUEFTU1dPUkQ6ODE5MixOT1RPR0dMRVRPT0ZGOjE2Mzg0LFJBRElPOjMyNzY4LFBVU0hCVVRUT046NjU1MzYsQ09NQk86MTMxMDcyLEVESVQ6MjYyMTQ0LFNPUlQ6NTI0Mjg4LEZJTEVTRUxFQ1Q6MTA0ODU3NixNVUxUSVNFTEVDVDoyMDk3MTUyLERPTk9UU1BFTExDSEVDSzo0MTk0MzA0LERPTk9UU0NST0xMOjgzODg2MDgsQ09NQjoxNjc3NzIxNixSSUNIVEVYVDozMzU1NDQzMixSQURJT1NJTlVOSVNPTjozMzU1NDQzMixDT01NSVRPTlNFTENIQU5HRTo2NzEwODg2NH07ZS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlPXtTT0xJRDoxLERBU0hFRDoyLEJFVkVMRUQ6MyxJTlNFVDo0LFVOREVSTElORTo1fTtlLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGU9e0U6Ik1vdXNlIEVudGVyIixYOiJNb3VzZSBFeGl0IixEOiJNb3VzZSBEb3duIixVOiJNb3VzZSBVcCIsRm86IkZvY3VzIixCbDoiQmx1ciIsUE86IlBhZ2VPcGVuIixQQzoiUGFnZUNsb3NlIixQVjoiUGFnZVZpc2libGUiLFBJOiJQYWdlSW52aXNpYmxlIixLOiJLZXlzdHJva2UiLEY6IkZvcm1hdCIsVjoiVmFsaWRhdGUiLEM6IkNhbGN1bGF0ZSJ9O2UuRG9jdW1lbnRBY3Rpb25FdmVudFR5cGU9e1dDOiJXaWxsQ2xvc2UiLFdTOiJXaWxsU2F2ZSIsRFM6IkRpZFNhdmUiLFdQOiJXaWxsUHJpbnQiLERQOiJEaWRQcmludCJ9O2UuUGFnZUFjdGlvbkV2ZW50VHlwZT17TzoiUGFnZU9wZW4iLEM6IlBhZ2VDbG9zZSJ9O2NvbnN0IHI9e0VSUk9SUzowLFdBUk5JTkdTOjEsSU5GT1M6NX07ZS5WZXJib3NpdHlMZXZlbD1yO2UuQ01hcENvbXByZXNzaW9uVHlwZT17Tk9ORTowLEJJTkFSWToxfTtlLk9QUz17ZGVwZW5kZW5jeToxLHNldExpbmVXaWR0aDoyLHNldExpbmVDYXA6MyxzZXRMaW5lSm9pbjo0LHNldE1pdGVyTGltaXQ6NSxzZXREYXNoOjYsc2V0UmVuZGVyaW5nSW50ZW50Ojcsc2V0RmxhdG5lc3M6OCxzZXRHU3RhdGU6OSxzYXZlOjEwLHJlc3RvcmU6MTEsdHJhbnNmb3JtOjEyLG1vdmVUbzoxMyxsaW5lVG86MTQsY3VydmVUbzoxNSxjdXJ2ZVRvMjoxNixjdXJ2ZVRvMzoxNyxjbG9zZVBhdGg6MTgscmVjdGFuZ2xlOjE5LHN0cm9rZToyMCxjbG9zZVN0cm9rZToyMSxmaWxsOjIyLGVvRmlsbDoyMyxmaWxsU3Ryb2tlOjI0LGVvRmlsbFN0cm9rZToyNSxjbG9zZUZpbGxTdHJva2U6MjYsY2xvc2VFT0ZpbGxTdHJva2U6MjcsZW5kUGF0aDoyOCxjbGlwOjI5LGVvQ2xpcDozMCxiZWdpblRleHQ6MzEsZW5kVGV4dDozMixzZXRDaGFyU3BhY2luZzozMyxzZXRXb3JkU3BhY2luZzozNCxzZXRIU2NhbGU6MzUsc2V0TGVhZGluZzozNixzZXRGb250OjM3LHNldFRleHRSZW5kZXJpbmdNb2RlOjM4LHNldFRleHRSaXNlOjM5LG1vdmVUZXh0OjQwLHNldExlYWRpbmdNb3ZlVGV4dDo0MSxzZXRUZXh0TWF0cml4OjQyLG5leHRMaW5lOjQzLHNob3dUZXh0OjQ0LHNob3dTcGFjZWRUZXh0OjQ1LG5leHRMaW5lU2hvd1RleHQ6NDYsbmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6NDcsc2V0Q2hhcldpZHRoOjQ4LHNldENoYXJXaWR0aEFuZEJvdW5kczo0OSxzZXRTdHJva2VDb2xvclNwYWNlOjUwLHNldEZpbGxDb2xvclNwYWNlOjUxLHNldFN0cm9rZUNvbG9yOjUyLHNldFN0cm9rZUNvbG9yTjo1MyxzZXRGaWxsQ29sb3I6NTQsc2V0RmlsbENvbG9yTjo1NSxzZXRTdHJva2VHcmF5OjU2LHNldEZpbGxHcmF5OjU3LHNldFN0cm9rZVJHQkNvbG9yOjU4LHNldEZpbGxSR0JDb2xvcjo1OSxzZXRTdHJva2VDTVlLQ29sb3I6NjAsc2V0RmlsbENNWUtDb2xvcjo2MSxzaGFkaW5nRmlsbDo2MixiZWdpbklubGluZUltYWdlOjYzLGJlZ2luSW1hZ2VEYXRhOjY0LGVuZElubGluZUltYWdlOjY1LHBhaW50WE9iamVjdDo2NixtYXJrUG9pbnQ6NjcsbWFya1BvaW50UHJvcHM6NjgsYmVnaW5NYXJrZWRDb250ZW50OjY5LGJlZ2luTWFya2VkQ29udGVudFByb3BzOjcwLGVuZE1hcmtlZENvbnRlbnQ6NzEsYmVnaW5Db21wYXQ6NzIsZW5kQ29tcGF0OjczLHBhaW50Rm9ybVhPYmplY3RCZWdpbjo3NCxwYWludEZvcm1YT2JqZWN0RW5kOjc1LGJlZ2luR3JvdXA6NzYsZW5kR3JvdXA6NzcsYmVnaW5Bbm5vdGF0aW9uOjgwLGVuZEFubm90YXRpb246ODEscGFpbnRJbWFnZU1hc2tYT2JqZWN0OjgzLHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOjg0LHBhaW50SW1hZ2VYT2JqZWN0Ojg1LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0Ojg2LHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6ODcscGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6ODgscGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0Ojg5LHBhaW50U29saWRDb2xvckltYWdlTWFzazo5MCxjb25zdHJ1Y3RQYXRoOjkxfTtlLlBhc3N3b3JkUmVzcG9uc2VzPXtORUVEX1BBU1NXT1JEOjEsSU5DT1JSRUNUX1BBU1NXT1JEOjJ9O2xldCBzPXIuV0FSTklOR1M7ZnVuY3Rpb24gd2Fybih0KXtzPj1yLldBUk5JTkdTJiZjb25zb2xlLmxvZyhgV2FybmluZzogJHt0fWApfWZ1bmN0aW9uIHVucmVhY2hhYmxlKHQpe3Rocm93IG5ldyBFcnJvcih0KX1mdW5jdGlvbiBzaGFkb3codCxlLG4pe2xldCBpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiFpLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMX0pO3JldHVybiBufWNvbnN0IGE9ZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbkNsb3N1cmUoKXtmdW5jdGlvbiBCYXNlRXhjZXB0aW9uKHQsZSl7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VFeGNlcHRpb24mJnVucmVhY2hhYmxlKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRXhjZXB0aW9uLiIpO3RoaXMubWVzc2FnZT10O3RoaXMubmFtZT1lfUJhc2VFeGNlcHRpb24ucHJvdG90eXBlPW5ldyBFcnJvcjtCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yPUJhc2VFeGNlcHRpb247cmV0dXJuIEJhc2VFeGNlcHRpb259KCk7ZS5CYXNlRXhjZXB0aW9uPWE7ZS5QYXNzd29yZEV4Y2VwdGlvbj1jbGFzcyBQYXNzd29yZEV4Y2VwdGlvbiBleHRlbmRzIGF7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LCJQYXNzd29yZEV4Y2VwdGlvbiIpO3RoaXMuY29kZT1lfX07ZS5Vbmtub3duRXJyb3JFeGNlcHRpb249Y2xhc3MgVW5rbm93bkVycm9yRXhjZXB0aW9uIGV4dGVuZHMgYXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsIlVua25vd25FcnJvckV4Y2VwdGlvbiIpO3RoaXMuZGV0YWlscz1lfX07ZS5JbnZhbGlkUERGRXhjZXB0aW9uPWNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBhe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsIkludmFsaWRQREZFeGNlcHRpb24iKX19O2UuTWlzc2luZ1BERkV4Y2VwdGlvbj1jbGFzcyBNaXNzaW5nUERGRXhjZXB0aW9uIGV4dGVuZHMgYXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LCJNaXNzaW5nUERGRXhjZXB0aW9uIil9fTtlLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbj1jbGFzcyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gZXh0ZW5kcyBhe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIik7dGhpcy5zdGF0dXM9ZX19O2UuRm9ybWF0RXJyb3I9Y2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBhe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsIkZvcm1hdEVycm9yIil9fTtlLkFib3J0RXhjZXB0aW9uPWNsYXNzIEFib3J0RXhjZXB0aW9uIGV4dGVuZHMgYXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LCJBYm9ydEV4Y2VwdGlvbiIpfX07ZnVuY3Rpb24gYnl0ZXNUb1N0cmluZyh0KXsib2JqZWN0Ij09dHlwZW9mIHQmJnZvaWQgMCE9PXQ/Lmxlbmd0aHx8dW5yZWFjaGFibGUoIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmciKTtjb25zdCBlPXQubGVuZ3RoLG49ODE5MjtpZihlPG4pcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCx0KTtjb25zdCBpPVtdO2ZvcihsZXQgcj0wO3I8ZTtyKz1uKXtjb25zdCBzPU1hdGgubWluKHIrbixlKSxhPXQuc3ViYXJyYXkocixzKTtpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEpKX1yZXR1cm4gaS5qb2luKCIiKX1mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHQpeyJzdHJpbmciIT10eXBlb2YgdCYmdW5yZWFjaGFibGUoIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXMiKTtjb25zdCBlPXQubGVuZ3RoLG49bmV3IFVpbnQ4QXJyYXkoZSk7Zm9yKGxldCBpPTA7aTxlOysraSluW2ldPTI1NSZ0LmNoYXJDb2RlQXQoaSk7cmV0dXJuIG59ZS5GZWF0dXJlVGVzdD1jbGFzcyBGZWF0dXJlVGVzdHtzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJpc0xpdHRsZUVuZGlhbiIsZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKXtjb25zdCB0PW5ldyBVaW50OEFycmF5KDQpO3RbMF09MTtyZXR1cm4gMT09PW5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlciwwLDEpWzBdfSgpKX1zdGF0aWMgZ2V0IGlzRXZhbFN1cHBvcnRlZCgpe3JldHVybiBzaGFkb3codGhpcywiaXNFdmFsU3VwcG9ydGVkIixmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKXt0cnl7bmV3IEZ1bmN0aW9uKCIiKTtyZXR1cm4hMH1jYXRjaHtyZXR1cm4hMX19KCkpfXN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKXtyZXR1cm4gc2hhZG93KHRoaXMsImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIiwidW5kZWZpbmVkIiE9dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyl9c3RhdGljIGdldCBwbGF0Zm9ybSgpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yP3NoYWRvdyh0aGlzLCJwbGF0Zm9ybSIse2lzV2luOiExLGlzTWFjOiExfSk6c2hhZG93KHRoaXMsInBsYXRmb3JtIix7aXNXaW46bmF2aWdhdG9yLnBsYXRmb3JtLmluY2x1ZGVzKCJXaW4iKSxpc01hYzpuYXZpZ2F0b3IucGxhdGZvcm0uaW5jbHVkZXMoIk1hYyIpfSl9fTtjb25zdCBvPVsuLi5BcnJheSgyNTYpLmtleXMoKV0ubWFwKCh0PT50LnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpKTtlLlV0aWw9Y2xhc3MgVXRpbHtzdGF0aWMgbWFrZUhleENvbG9yKHQsZSxuKXtyZXR1cm5gIyR7b1t0XX0ke29bZV19JHtvW25dfWB9c3RhdGljIHNjYWxlTWluTWF4KHQsZSl7bGV0IG47aWYodFswXSl7aWYodFswXTwwKXtuPWVbMF07ZVswXT1lWzFdO2VbMV09bn1lWzBdKj10WzBdO2VbMV0qPXRbMF07aWYodFszXTwwKXtuPWVbMl07ZVsyXT1lWzNdO2VbM109bn1lWzJdKj10WzNdO2VbM10qPXRbM119ZWxzZXtuPWVbMF07ZVswXT1lWzJdO2VbMl09bjtuPWVbMV07ZVsxXT1lWzNdO2VbM109bjtpZih0WzFdPDApe249ZVsyXTtlWzJdPWVbM107ZVszXT1ufWVbMl0qPXRbMV07ZVszXSo9dFsxXTtpZih0WzJdPDApe249ZVswXTtlWzBdPWVbMV07ZVsxXT1ufWVbMF0qPXRbMl07ZVsxXSo9dFsyXX1lWzBdKz10WzRdO2VbMV0rPXRbNF07ZVsyXSs9dFs1XTtlWzNdKz10WzVdfXN0YXRpYyB0cmFuc2Zvcm0odCxlKXtyZXR1cm5bdFswXSplWzBdK3RbMl0qZVsxXSx0WzFdKmVbMF0rdFszXSplWzFdLHRbMF0qZVsyXSt0WzJdKmVbM10sdFsxXSplWzJdK3RbM10qZVszXSx0WzBdKmVbNF0rdFsyXSplWzVdK3RbNF0sdFsxXSplWzRdK3RbM10qZVs1XSt0WzVdXX1zdGF0aWMgYXBwbHlUcmFuc2Zvcm0odCxlKXtyZXR1cm5bdFswXSplWzBdK3RbMV0qZVsyXStlWzRdLHRbMF0qZVsxXSt0WzFdKmVbM10rZVs1XV19c3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybSh0LGUpe2NvbnN0IG49ZVswXSplWzNdLWVbMV0qZVsyXTtyZXR1cm5bKHRbMF0qZVszXS10WzFdKmVbMl0rZVsyXSplWzVdLWVbNF0qZVszXSkvbiwoLXRbMF0qZVsxXSt0WzFdKmVbMF0rZVs0XSplWzFdLWVbNV0qZVswXSkvbl19c3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHQsZSl7Y29uc3Qgbj10aGlzLmFwcGx5VHJhbnNmb3JtKHQsZSksaT10aGlzLmFwcGx5VHJhbnNmb3JtKHQuc2xpY2UoMiw0KSxlKSxyPXRoaXMuYXBwbHlUcmFuc2Zvcm0oW3RbMF0sdFszXV0sZSkscz10aGlzLmFwcGx5VHJhbnNmb3JtKFt0WzJdLHRbMV1dLGUpO3JldHVybltNYXRoLm1pbihuWzBdLGlbMF0sclswXSxzWzBdKSxNYXRoLm1pbihuWzFdLGlbMV0sclsxXSxzWzFdKSxNYXRoLm1heChuWzBdLGlbMF0sclswXSxzWzBdKSxNYXRoLm1heChuWzFdLGlbMV0sclsxXSxzWzFdKV19c3RhdGljIGludmVyc2VUcmFuc2Zvcm0odCl7Y29uc3QgZT10WzBdKnRbM10tdFsxXSp0WzJdO3JldHVyblt0WzNdL2UsLXRbMV0vZSwtdFsyXS9lLHRbMF0vZSwodFsyXSp0WzVdLXRbNF0qdFszXSkvZSwodFs0XSp0WzFdLXRbNV0qdFswXSkvZV19c3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHQpe2NvbnN0IGU9W3RbMF0sdFsyXSx0WzFdLHRbM11dLG49dFswXSplWzBdK3RbMV0qZVsyXSxpPXRbMF0qZVsxXSt0WzFdKmVbM10scj10WzJdKmVbMF0rdFszXSplWzJdLHM9dFsyXSplWzFdK3RbM10qZVszXSxhPShuK3MpLzIsbz1NYXRoLnNxcnQoKG4rcykqKjItNCoobipzLXIqaSkpLzIsbD1hK298fDEsYz1hLW98fDE7cmV0dXJuW01hdGguc3FydChsKSxNYXRoLnNxcnQoYyldfXN0YXRpYyBub3JtYWxpemVSZWN0KHQpe2NvbnN0IGU9dC5zbGljZSgwKTtpZih0WzBdPnRbMl0pe2VbMF09dFsyXTtlWzJdPXRbMF19aWYodFsxXT50WzNdKXtlWzFdPXRbM107ZVszXT10WzFdfXJldHVybiBlfXN0YXRpYyBpbnRlcnNlY3QodCxlKXtjb25zdCBuPU1hdGgubWF4KE1hdGgubWluKHRbMF0sdFsyXSksTWF0aC5taW4oZVswXSxlWzJdKSksaT1NYXRoLm1pbihNYXRoLm1heCh0WzBdLHRbMl0pLE1hdGgubWF4KGVbMF0sZVsyXSkpO2lmKG4+aSlyZXR1cm4gbnVsbDtjb25zdCByPU1hdGgubWF4KE1hdGgubWluKHRbMV0sdFszXSksTWF0aC5taW4oZVsxXSxlWzNdKSkscz1NYXRoLm1pbihNYXRoLm1heCh0WzFdLHRbM10pLE1hdGgubWF4KGVbMV0sZVszXSkpO3JldHVybiByPnM/bnVsbDpbbixyLGksc119c3RhdGljIGJlemllckJvdW5kaW5nQm94KHQsZSxuLGkscixzLGEsbyl7Y29uc3QgbD1bXSxjPVtbXSxbXV07bGV0IGgsZCx1LHAsZixnLG0sYjtmb3IobGV0IGM9MDtjPDI7KytjKXtpZigwPT09Yyl7ZD02KnQtMTIqbis2KnI7aD0tMyp0Kzkqbi05KnIrMyphO3U9MypuLTMqdH1lbHNle2Q9NiplLTEyKmkrNipzO2g9LTMqZSs5KmktOSpzKzMqbzt1PTMqaS0zKmV9aWYoTWF0aC5hYnMoaCk8MWUtMTIpe2lmKE1hdGguYWJzKGQpPDFlLTEyKWNvbnRpbnVlO3A9LXUvZDswPHAmJnA8MSYmbC5wdXNoKHApfWVsc2V7bT1kKmQtNCp1Kmg7Yj1NYXRoLnNxcnQobSk7aWYoIShtPDApKXtmPSgtZCtiKS8oMipoKTswPGYmJmY8MSYmbC5wdXNoKGYpO2c9KC1kLWIpLygyKmgpOzA8ZyYmZzwxJiZsLnB1c2goZyl9fX1sZXQgdix5PWwubGVuZ3RoO2NvbnN0IEE9eTtmb3IoO3ktLTspe3A9bFt5XTt2PTEtcDtjWzBdW3ldPXYqdip2KnQrMyp2KnYqcCpuKzMqdipwKnAqcitwKnAqcCphO2NbMV1beV09dip2KnYqZSszKnYqdipwKmkrMyp2KnAqcCpzK3AqcCpwKm99Y1swXVtBXT10O2NbMV1bQV09ZTtjWzBdW0ErMV09YTtjWzFdW0ErMV09bztjWzBdLmxlbmd0aD1jWzFdLmxlbmd0aD1BKzI7cmV0dXJuW01hdGgubWluKC4uLmNbMF0pLE1hdGgubWluKC4uLmNbMV0pLE1hdGgubWF4KC4uLmNbMF0pLE1hdGgubWF4KC4uLmNbMV0pXX19O2NvbnN0IGw9WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDcyOCw3MTEsNzEwLDcyOSw3MzMsNzMxLDczMCw3MzIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsODIyNiw4MjI0LDgyMjUsODIzMCw4MjEyLDgyMTEsNDAyLDgyNjAsODI0OSw4MjUwLDg3MjIsODI0MCw4MjIyLDgyMjAsODIyMSw4MjE2LDgyMTcsODIxOCw4NDgyLDY0MjU3LDY0MjU4LDMyMSwzMzgsMzUyLDM3NiwzODEsMzA1LDMyMiwzMzksMzUzLDM4MiwwLDgzNjRdO2Z1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyh0KXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZSh0KSl9ZS5Qcm9taXNlQ2FwYWJpbGl0eT1jbGFzcyBQcm9taXNlQ2FwYWJpbGl0eXsjdD0hMTtjb25zdHJ1Y3Rvcigpe3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZSgoKHQsZSk9Pnt0aGlzLnJlc29sdmU9ZT0+e3RoaXMuI3Q9ITA7dChlKX07dGhpcy5yZWplY3Q9dD0+e3RoaXMuI3Q9ITA7ZSh0KX19KSl9Z2V0IHNldHRsZWQoKXtyZXR1cm4gdGhpcy4jdH19O2xldCBjPW51bGwsaD1udWxsfSwodCxlLG4pPT57dmFyIGk9bigzKSxyPW4oNCkscz1uKDY5KSxhPW4oNzApLG89IldlYkFzc2VtYmx5IixsPXJbb10sYz03IT09RXJyb3IoImUiLHtjYXVzZTo3fSkuY2F1c2UsZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtuW3RdPWEodCxlLGMpO2koe2dsb2JhbDohMCxjb25zdHJ1Y3RvcjohMCxhcml0eToxLGZvcmNlZDpjfSxuKX0sZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcj1mdW5jdGlvbih0LGUpe2lmKGwmJmxbdF0pe3ZhciBuPXt9O25bdF09YShvKyIuIit0LGUsYyk7aSh7dGFyZ2V0Om8sc3RhdDohMCxjb25zdHJ1Y3RvcjohMCxhcml0eToxLGZvcmNlZDpjfSxuKX19O2V4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCJFcnJvciIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBFcnJvcihlKXtyZXR1cm4gcyh0LHRoaXMsYXJndW1lbnRzKX19KSk7ZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoIkV2YWxFcnJvciIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBFdmFsRXJyb3IoZSl7cmV0dXJuIHModCx0aGlzLGFyZ3VtZW50cyl9fSkpO2V4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCJSYW5nZUVycm9yIiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFJhbmdlRXJyb3IoZSl7cmV0dXJuIHModCx0aGlzLGFyZ3VtZW50cyl9fSkpO2V4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCJSZWZlcmVuY2VFcnJvciIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBSZWZlcmVuY2VFcnJvcihlKXtyZXR1cm4gcyh0LHRoaXMsYXJndW1lbnRzKX19KSk7ZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoIlN5bnRheEVycm9yIiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFN5bnRheEVycm9yKGUpe3JldHVybiBzKHQsdGhpcyxhcmd1bWVudHMpfX0pKTtleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcigiVHlwZUVycm9yIiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFR5cGVFcnJvcihlKXtyZXR1cm4gcyh0LHRoaXMsYXJndW1lbnRzKX19KSk7ZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoIlVSSUVycm9yIiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIFVSSUVycm9yKGUpe3JldHVybiBzKHQsdGhpcyxhcmd1bWVudHMpfX0pKTtleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKCJDb21waWxlRXJyb3IiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gQ29tcGlsZUVycm9yKGUpe3JldHVybiBzKHQsdGhpcyxhcmd1bWVudHMpfX0pKTtleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKCJMaW5rRXJyb3IiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gTGlua0Vycm9yKGUpe3JldHVybiBzKHQsdGhpcyxhcmd1bWVudHMpfX0pKTtleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKCJSdW50aW1lRXJyb3IiLChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gUnVudGltZUVycm9yKGUpe3JldHVybiBzKHQsdGhpcyxhcmd1bWVudHMpfX0pKX0sKHQsZSxuKT0+e3ZhciBpPW4oNCkscj1uKDUpLmYscz1uKDQ0KSxhPW4oNDgpLG89bigzOCksbD1uKDU2KSxjPW4oNjgpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGgsZCx1LHAsZj10LnRhcmdldCxnPXQuZ2xvYmFsLG09dC5zdGF0O2lmKG49Zz9pOm0/aVtmXXx8byhmLHt9KTooaVtmXXx8e30pLnByb3RvdHlwZSlmb3IoaCBpbiBlKXt1PWVbaF07ZD10LmRvbnRDYWxsR2V0U2V0PyhwPXIobixoKSkmJnAudmFsdWU6bltoXTtpZighYyhnP2g6ZisobT8iLiI6IiMiKStoLHQuZm9yY2VkKSYmdm9pZCAwIT09ZCl7aWYodHlwZW9mIHU9PXR5cGVvZiBkKWNvbnRpbnVlO2wodSxkKX0odC5zaGFtfHxkJiZkLnNoYW0pJiZzKHUsInNoYW0iLCEwKTthKG4saCx1LHQpfX19LGZ1bmN0aW9uKHQpe3ZhciBjaGVjaz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5NYXRoPT1NYXRoJiZ0fTt0LmV4cG9ydHM9Y2hlY2soIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzKXx8Y2hlY2soIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyl8fGNoZWNrKCJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZil8fGNoZWNrKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWwpfHxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfHx0aGlzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfSwodCxlLG4pPT57dmFyIGk9big2KSxyPW4oOCkscz1uKDEwKSxhPW4oMTEpLG89bigxMiksbD1uKDE4KSxjPW4oMzkpLGg9big0MiksZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2UuZj1pP2Q6ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSl7dD1vKHQpO2U9bChlKTtpZihoKXRyeXtyZXR1cm4gZCh0LGUpfWNhdGNoKHQpe31pZihjKHQsZSkpcmV0dXJuIGEoIXIocy5mLHQsZSksdFtlXSl9fSwodCxlLG4pPT57dmFyIGk9big3KTt0LmV4cG9ydHM9IWkoKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwxLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KVsxXX0pKX0sdD0+e3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2godCl7cmV0dXJuITB9fX0sKHQsZSxuKT0+e3ZhciBpPW4oOSkscj1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbDt0LmV4cG9ydHM9aT9yLmJpbmQocik6ZnVuY3Rpb24oKXtyZXR1cm4gci5hcHBseShyLGFyZ3VtZW50cyl9fSwodCxlLG4pPT57dmFyIGk9big3KTt0LmV4cG9ydHM9IWkoKGZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24oKXt9LmJpbmQoKTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdHx8dC5oYXNPd25Qcm9wZXJ0eSgicHJvdG90eXBlIil9KSl9LCh0LGUpPT57InVzZSBzdHJpY3QiO3ZhciBuPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLGk9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixyPWkmJiFuLmNhbGwoezE6Mn0sMSk7ZS5mPXI/ZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUodCl7dmFyIGU9aSh0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpufSx0PT57dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sKHQsZSxuKT0+e3ZhciBpPW4oMTMpLHI9bigxNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHIodCkpfX0sKHQsZSxuKT0+e3ZhciBpPW4oMTQpLHI9big3KSxzPW4oMTUpLGE9T2JqZWN0LG89aSgiIi5zcGxpdCk7dC5leHBvcnRzPXIoKGZ1bmN0aW9uKCl7cmV0dXJuIWEoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKX0pKT9mdW5jdGlvbih0KXtyZXR1cm4iU3RyaW5nIj09cyh0KT9vKHQsIiIpOmEodCl9OmF9LCh0LGUsbik9Pnt2YXIgaT1uKDkpLHI9RnVuY3Rpb24ucHJvdG90eXBlLHM9ci5jYWxsLGE9aSYmci5iaW5kLmJpbmQocyxzKTt0LmV4cG9ydHM9aT9hOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBzLmFwcGx5KHQsYXJndW1lbnRzKX19fSwodCxlLG4pPT57dmFyIGk9bigxNCkscj1pKHt9LnRvU3RyaW5nKSxzPWkoIiIuc2xpY2UpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcyhyKHQpLDgsLTEpfX0sKHQsZSxuKT0+e3ZhciBpPW4oMTcpLHI9VHlwZUVycm9yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihpKHQpKXRocm93IHIoIkNhbid0IGNhbGwgbWV0aG9kIG9uICIrdCk7cmV0dXJuIHR9fSx0PT57dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fX0sKHQsZSxuKT0+e3ZhciBpPW4oMTkpLHI9bigyMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPWkodCwic3RyaW5nIik7cmV0dXJuIHIoZSk/ZTplKyIifX0sKHQsZSxuKT0+e3ZhciBpPW4oOCkscj1uKDIwKSxzPW4oMjMpLGE9bigzMCksbz1uKDMzKSxsPW4oMzQpLGM9VHlwZUVycm9yLGg9bCgidG9QcmltaXRpdmUiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KXx8cyh0KSlyZXR1cm4gdDt2YXIgbixsPWEodCxoKTtpZihsKXt2b2lkIDA9PT1lJiYoZT0iZGVmYXVsdCIpO249aShsLHQsZSk7aWYoIXIobil8fHMobikpcmV0dXJuIG47dGhyb3cgYygiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9dm9pZCAwPT09ZSYmKGU9Im51bWJlciIpO3JldHVybiBvKHQsZSl9fSwodCxlLG4pPT57dmFyIGk9bigyMSkscj1uKDIyKSxzPXIuYWxsO3QuZXhwb3J0cz1yLklTX0hUTUxEREE/ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P251bGwhPT10OmkodCl8fHQ9PT1zfTpmdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQ/bnVsbCE9PXQ6aSh0KX19LCh0LGUsbik9Pnt2YXIgaT1uKDIyKSxyPWkuYWxsO3QuZXhwb3J0cz1pLklTX0hUTUxEREE/ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR8fHQ9PT1yfTpmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH19LHQ9Pnt2YXIgZT0ib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5hbGwsbj12b2lkIDA9PT1lJiZ2b2lkIDAhPT1lO3QuZXhwb3J0cz17YWxsOmUsSVNfSFRNTEREQTpufX0sKHQsZSxuKT0+e3ZhciBpPW4oMjQpLHI9bigyMSkscz1uKDI1KSxhPW4oMjYpLG89T2JqZWN0O3QuZXhwb3J0cz1hP2Z1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdH06ZnVuY3Rpb24odCl7dmFyIGU9aSgiU3ltYm9sIik7cmV0dXJuIHIoZSkmJnMoZS5wcm90b3R5cGUsbyh0KSl9fSwodCxlLG4pPT57dmFyIGk9big0KSxyPW4oMjEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/KG49aVt0XSxyKG4pP246dm9pZCAwKTppW3RdJiZpW3RdW2VdO3ZhciBufX0sKHQsZSxuKT0+e3ZhciBpPW4oMTQpO3QuZXhwb3J0cz1pKHt9LmlzUHJvdG90eXBlT2YpfSwodCxlLG4pPT57dmFyIGk9bigyNyk7dC5leHBvcnRzPWkmJiFTeW1ib2wuc2hhbSYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3J9LCh0LGUsbik9Pnt2YXIgaT1uKDI4KSxyPW4oNykscz1uKDQpLlN0cmluZzt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcigoZnVuY3Rpb24oKXt2YXIgdD1TeW1ib2woKTtyZXR1cm4hcyh0KXx8IShPYmplY3QodClpbnN0YW5jZW9mIFN5bWJvbCl8fCFTeW1ib2wuc2hhbSYmaSYmaTw0MX0pKX0sKHQsZSxuKT0+e3ZhciBpLHIscz1uKDQpLGE9bigyOSksbz1zLnByb2Nlc3MsbD1zLkRlbm8sYz1vJiZvLnZlcnNpb25zfHxsJiZsLnZlcnNpb24saD1jJiZjLnY4O2gmJihyPShpPWguc3BsaXQoIi4iKSlbMF0+MCYmaVswXTw0PzE6KyhpWzBdK2lbMV0pKTshciYmYSYmKCEoaT1hLm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8aVsxXT49NzQpJiYoaT1hLm1hdGNoKC9DaHJvbWVcLyhcZCspLykpJiYocj0raVsxXSk7dC5leHBvcnRzPXJ9LHQ9Pnt0LmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3ImJlN0cmluZyhuYXZpZ2F0b3IudXNlckFnZW50KXx8IiJ9LCh0LGUsbik9Pnt2YXIgaT1uKDMxKSxyPW4oMTcpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXRbZV07cmV0dXJuIHIobik/dm9pZCAwOmkobil9fSwodCxlLG4pPT57dmFyIGk9bigyMSkscj1uKDMyKSxzPVR5cGVFcnJvcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoaSh0KSlyZXR1cm4gdDt0aHJvdyBzKHIodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpfX0sdD0+e3ZhciBlPVN0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBlKHQpfWNhdGNoKHQpe3JldHVybiJPYmplY3QifX19LCh0LGUsbik9Pnt2YXIgaT1uKDgpLHI9bigyMSkscz1uKDIwKSxhPVR5cGVFcnJvcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixvO2lmKCJzdHJpbmciPT09ZSYmcihuPXQudG9TdHJpbmcpJiYhcyhvPWkobix0KSkpcmV0dXJuIG87aWYocihuPXQudmFsdWVPZikmJiFzKG89aShuLHQpKSlyZXR1cm4gbztpZigic3RyaW5nIiE9PWUmJnIobj10LnRvU3RyaW5nKSYmIXMobz1pKG4sdCkpKXJldHVybiBvO3Rocm93IGEoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfX0sKHQsZSxuKT0+e3ZhciBpPW4oNCkscj1uKDM1KSxzPW4oMzkpLGE9big0MSksbz1uKDI3KSxsPW4oMjYpLGM9aS5TeW1ib2wsaD1yKCJ3a3MiKSxkPWw/Yy5mb3J8fGM6YyYmYy53aXRob3V0U2V0dGVyfHxhO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtzKGgsdCl8fChoW3RdPW8mJnMoYyx0KT9jW3RdOmQoIlN5bWJvbC4iK3QpKTtyZXR1cm4gaFt0XX19LCh0LGUsbik9Pnt2YXIgaT1uKDM2KSxyPW4oMzcpOyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gclt0XXx8KHJbdF09dm9pZCAwIT09ZT9lOnt9KX0pKCJ2ZXJzaW9ucyIsW10pLnB1c2goe3ZlcnNpb246IjMuMzEuMSIsbW9kZTppPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTQtMjAyMyBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSIsbGljZW5zZToiaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zMS4xL0xJQ0VOU0UiLHNvdXJjZToiaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMifSl9LHQ9Pnt0LmV4cG9ydHM9ITF9LCh0LGUsbik9Pnt2YXIgaT1uKDQpLHI9bigzOCkscz0iX19jb3JlLWpzX3NoYXJlZF9fIixhPWlbc118fHIocyx7fSk7dC5leHBvcnRzPWF9LCh0LGUsbik9Pnt2YXIgaT1uKDQpLHI9T2JqZWN0LmRlZmluZVByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3RyeXtyKGksdCx7dmFsdWU6ZSxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KX1jYXRjaChuKXtpW3RdPWV9cmV0dXJuIGV9fSwodCxlLG4pPT57dmFyIGk9bigxNCkscj1uKDQwKSxzPWkoe30uaGFzT3duUHJvcGVydHkpO3QuZXhwb3J0cz1PYmplY3QuaGFzT3dufHxmdW5jdGlvbiBoYXNPd24odCxlKXtyZXR1cm4gcyhyKHQpLGUpfX0sKHQsZSxuKT0+e3ZhciBpPW4oMTYpLHI9T2JqZWN0O3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihpKHQpKX19LCh0LGUsbik9Pnt2YXIgaT1uKDE0KSxyPTAscz1NYXRoLnJhbmRvbSgpLGE9aSgxLi50b1N0cmluZyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIisodm9pZCAwPT09dD8iIjp0KSsiKV8iK2EoKytyK3MsMzYpfX0sKHQsZSxuKT0+e3ZhciBpPW4oNikscj1uKDcpLHM9big0Myk7dC5leHBvcnRzPSFpJiYhcigoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHMoImRpdiIpLCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pKX0sKHQsZSxuKT0+e3ZhciBpPW4oNCkscj1uKDIwKSxzPWkuZG9jdW1lbnQsYT1yKHMpJiZyKHMuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP3MuY3JlYXRlRWxlbWVudCh0KTp7fX19LCh0LGUsbik9Pnt2YXIgaT1uKDYpLHI9big0NSkscz1uKDExKTt0LmV4cG9ydHM9aT9mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuZih0LGUscygxLG4pKX06ZnVuY3Rpb24odCxlLG4pe3RbZV09bjtyZXR1cm4gdH19LCh0LGUsbik9Pnt2YXIgaT1uKDYpLHI9big0Mikscz1uKDQ2KSxhPW4oNDcpLG89bigxOCksbD1UeXBlRXJyb3IsYz1PYmplY3QuZGVmaW5lUHJvcGVydHksaD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGQ9ImVudW1lcmFibGUiLHU9ImNvbmZpZ3VyYWJsZSIscD0id3JpdGFibGUiO2UuZj1pP3M/ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCxlLG4pe2EodCk7ZT1vKGUpO2Eobik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJiJwcm90b3R5cGUiPT09ZSYmInZhbHVlImluIG4mJnAgaW4gbiYmIW5bcF0pe3ZhciBpPWgodCxlKTtpZihpJiZpW3BdKXt0W2VdPW4udmFsdWU7bj17Y29uZmlndXJhYmxlOnUgaW4gbj9uW3VdOmlbdV0sZW51bWVyYWJsZTpkIGluIG4/bltkXTppW2RdLHdyaXRhYmxlOiExfX19cmV0dXJuIGModCxlLG4pfTpjOmZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHQsZSxuKXthKHQpO2U9byhlKTthKG4pO2lmKHIpdHJ5e3JldHVybiBjKHQsZSxuKX1jYXRjaCh0KXt9aWYoImdldCJpbiBufHwic2V0ImluIG4pdGhyb3cgbCgiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQiKTsidmFsdWUiaW4gbiYmKHRbZV09bi52YWx1ZSk7cmV0dXJuIHR9fSwodCxlLG4pPT57dmFyIGk9big2KSxyPW4oNyk7dC5leHBvcnRzPWkmJnIoKGZ1bmN0aW9uKCl7cmV0dXJuIDQyIT1PYmplY3QuZGVmaW5lUHJvcGVydHkoKGZ1bmN0aW9uKCl7fSksInByb3RvdHlwZSIse3ZhbHVlOjQyLHdyaXRhYmxlOiExfSkucHJvdG90eXBlfSkpfSwodCxlLG4pPT57dmFyIGk9bigyMCkscj1TdHJpbmcscz1UeXBlRXJyb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKGkodCkpcmV0dXJuIHQ7dGhyb3cgcyhyKHQpKyIgaXMgbm90IGFuIG9iamVjdCIpfX0sKHQsZSxuKT0+e3ZhciBpPW4oMjEpLHI9big0NSkscz1uKDQ5KSxhPW4oMzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixvKXtvfHwobz17fSk7dmFyIGw9by5lbnVtZXJhYmxlLGM9dm9pZCAwIT09by5uYW1lP28ubmFtZTplO2kobikmJnMobixjLG8pO2lmKG8uZ2xvYmFsKWw/dFtlXT1uOmEoZSxuKTtlbHNle3RyeXtvLnVuc2FmZT90W2VdJiYobD0hMCk6ZGVsZXRlIHRbZV19Y2F0Y2godCl7fWw/dFtlXT1uOnIuZih0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6IW8ubm9uQ29uZmlndXJhYmxlLHdyaXRhYmxlOiFvLm5vbldyaXRhYmxlfSl9cmV0dXJuIHR9fSwodCxlLG4pPT57dmFyIGk9bigxNCkscj1uKDcpLHM9bigyMSksYT1uKDM5KSxvPW4oNiksbD1uKDUwKS5DT05GSUdVUkFCTEUsYz1uKDUxKSxoPW4oNTIpLGQ9aC5lbmZvcmNlLHU9aC5nZXQscD1TdHJpbmcsZj1PYmplY3QuZGVmaW5lUHJvcGVydHksZz1pKCIiLnNsaWNlKSxtPWkoIiIucmVwbGFjZSksYj1pKFtdLmpvaW4pLHY9byYmIXIoKGZ1bmN0aW9uKCl7cmV0dXJuIDghPT1mKChmdW5jdGlvbigpe30pLCJsZW5ndGgiLHt2YWx1ZTo4fSkubGVuZ3RofSkpLHk9U3RyaW5nKFN0cmluZykuc3BsaXQoIlN0cmluZyIpLEE9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXsiU3ltYm9sKCI9PT1nKHAoZSksMCw3KSYmKGU9IlsiK20ocChlKSwvXlN5bWJvbFwoKFteKV0qKVwpLywiJDEiKSsiXSIpO24mJm4uZ2V0dGVyJiYoZT0iZ2V0ICIrZSk7biYmbi5zZXR0ZXImJihlPSJzZXQgIitlKTsoIWEodCwibmFtZSIpfHxsJiZ0Lm5hbWUhPT1lKSYmKG8/Zih0LCJuYW1lIix7dmFsdWU6ZSxjb25maWd1cmFibGU6ITB9KTp0Lm5hbWU9ZSk7diYmbiYmYShuLCJhcml0eSIpJiZ0Lmxlbmd0aCE9PW4uYXJpdHkmJmYodCwibGVuZ3RoIix7dmFsdWU6bi5hcml0eX0pO3RyeXtuJiZhKG4sImNvbnN0cnVjdG9yIikmJm4uY29uc3RydWN0b3I/byYmZih0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pOnQucHJvdG90eXBlJiYodC5wcm90b3R5cGU9dm9pZCAwKX1jYXRjaCh0KXt9dmFyIGk9ZCh0KTthKGksInNvdXJjZSIpfHwoaS5zb3VyY2U9Yih5LCJzdHJpbmciPT10eXBlb2YgZT9lOiIiKSk7cmV0dXJuIHR9O0Z1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz1BKChmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiBzKHRoaXMpJiZ1KHRoaXMpLnNvdXJjZXx8Yyh0aGlzKX0pLCJ0b1N0cmluZyIpfSwodCxlLG4pPT57dmFyIGk9big2KSxyPW4oMzkpLHM9RnVuY3Rpb24ucHJvdG90eXBlLGE9aSYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixvPXIocywibmFtZSIpLGw9byYmInNvbWV0aGluZyI9PT1mdW5jdGlvbiBzb21ldGhpbmcoKXt9Lm5hbWUsYz1vJiYoIWl8fGkmJmEocywibmFtZSIpLmNvbmZpZ3VyYWJsZSk7dC5leHBvcnRzPXtFWElTVFM6byxQUk9QRVI6bCxDT05GSUdVUkFCTEU6Y319LCh0LGUsbik9Pnt2YXIgaT1uKDE0KSxyPW4oMjEpLHM9bigzNyksYT1pKEZ1bmN0aW9uLnRvU3RyaW5nKTtyKHMuaW5zcGVjdFNvdXJjZSl8fChzLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGEodCl9KTt0LmV4cG9ydHM9cy5pbnNwZWN0U291cmNlfSwodCxlLG4pPT57dmFyIGkscixzLGE9big1Myksbz1uKDQpLGw9bigyMCksYz1uKDQ0KSxoPW4oMzkpLGQ9bigzNyksdT1uKDU0KSxwPW4oNTUpLGY9Ik9iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkIixnPW8uVHlwZUVycm9yLG09by5XZWFrTWFwO2lmKGF8fGQuc3RhdGUpe3ZhciBiPWQuc3RhdGV8fChkLnN0YXRlPW5ldyBtKTtiLmdldD1iLmdldDtiLmhhcz1iLmhhcztiLnNldD1iLnNldDtpPWZ1bmN0aW9uKHQsZSl7aWYoYi5oYXModCkpdGhyb3cgZyhmKTtlLmZhY2FkZT10O2Iuc2V0KHQsZSk7cmV0dXJuIGV9O3I9ZnVuY3Rpb24odCl7cmV0dXJuIGIuZ2V0KHQpfHx7fX07cz1mdW5jdGlvbih0KXtyZXR1cm4gYi5oYXModCl9fWVsc2V7dmFyIHY9dSgic3RhdGUiKTtwW3ZdPSEwO2k9ZnVuY3Rpb24odCxlKXtpZihoKHQsdikpdGhyb3cgZyhmKTtlLmZhY2FkZT10O2ModCx2LGUpO3JldHVybiBlfTtyPWZ1bmN0aW9uKHQpe3JldHVybiBoKHQsdik/dFt2XTp7fX07cz1mdW5jdGlvbih0KXtyZXR1cm4gaCh0LHYpfX10LmV4cG9ydHM9e3NldDppLGdldDpyLGhhczpzLGVuZm9yY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHModCk/cih0KTppKHQse30pfSxnZXR0ZXJGb3I6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuO2lmKCFsKGUpfHwobj1yKGUpKS50eXBlIT09dCl0aHJvdyBnKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICIrdCsiIHJlcXVpcmVkIik7cmV0dXJuIG59fX19LCh0LGUsbik9Pnt2YXIgaT1uKDQpLHI9bigyMSkscz1pLldlYWtNYXA7dC5leHBvcnRzPXIocykmJi9uYXRpdmUgY29kZS8udGVzdChTdHJpbmcocykpfSwodCxlLG4pPT57dmFyIGk9bigzNSkscj1uKDQxKSxzPWkoImtleXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHNbdF18fChzW3RdPXIodCkpfX0sdD0+e3QuZXhwb3J0cz17fX0sKHQsZSxuKT0+e3ZhciBpPW4oMzkpLHI9big1Nykscz1uKDUpLGE9big0NSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIG89cihlKSxsPWEuZixjPXMuZixoPTA7aDxvLmxlbmd0aDtoKyspe3ZhciBkPW9baF07aSh0LGQpfHxuJiZpKG4sZCl8fGwodCxkLGMoZSxkKSl9fX0sKHQsZSxuKT0+e3ZhciBpPW4oMjQpLHI9bigxNCkscz1uKDU4KSxhPW4oNjcpLG89big0NyksbD1yKFtdLmNvbmNhdCk7dC5leHBvcnRzPWkoIlJlZmxlY3QiLCJvd25LZXlzIil8fGZ1bmN0aW9uIG93bktleXModCl7dmFyIGU9cy5mKG8odCkpLG49YS5mO3JldHVybiBuP2woZSxuKHQpKTplfX0sKHQsZSxuKT0+e3ZhciBpPW4oNTkpLHI9big2NikuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTtlLmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXModCl7cmV0dXJuIGkodCxyKX19LCh0LGUsbik9Pnt2YXIgaT1uKDE0KSxyPW4oMzkpLHM9bigxMiksYT1uKDYwKS5pbmRleE9mLG89big1NSksbD1pKFtdLnB1c2gpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGk9cyh0KSxjPTAsaD1bXTtmb3IobiBpbiBpKSFyKG8sbikmJnIoaSxuKSYmbChoLG4pO2Zvcig7ZS5sZW5ndGg+YzspcihpLG49ZVtjKytdKSYmKH5hKGgsbil8fGwoaCxuKSk7cmV0dXJuIGh9fSwodCxlLG4pPT57dmFyIGk9bigxMikscj1uKDYxKSxzPW4oNjQpLGNyZWF0ZU1ldGhvZD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBvLGw9aShlKSxjPXMobCksaD1yKGEsYyk7aWYodCYmbiE9bil7Zm9yKDtjPmg7KWlmKChvPWxbaCsrXSkhPW8pcmV0dXJuITB9ZWxzZSBmb3IoO2M+aDtoKyspaWYoKHR8fGggaW4gbCkmJmxbaF09PT1uKXJldHVybiB0fHxofHwwO3JldHVybiF0JiYtMX19O3QuZXhwb3J0cz17aW5jbHVkZXM6Y3JlYXRlTWV0aG9kKCEwKSxpbmRleE9mOmNyZWF0ZU1ldGhvZCghMSl9fSwodCxlLG4pPT57dmFyIGk9big2Mikscj1NYXRoLm1heCxzPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPWkodCk7cmV0dXJuIG48MD9yKG4rZSwwKTpzKG4sZSl9fSwodCxlLG4pPT57dmFyIGk9big2Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPSt0O3JldHVybiBlIT1lfHwwPT09ZT8wOmkoZSl9fSx0PT57dmFyIGU9TWF0aC5jZWlsLG49TWF0aC5mbG9vcjt0LmV4cG9ydHM9TWF0aC50cnVuY3x8ZnVuY3Rpb24gdHJ1bmModCl7dmFyIGk9K3Q7cmV0dXJuKGk+MD9uOmUpKGkpfX0sKHQsZSxuKT0+e3ZhciBpPW4oNjUpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0Lmxlbmd0aCl9fSwodCxlLG4pPT57dmFyIGk9big2Mikscj1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9yKGkodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LHQ9Pnt0LmV4cG9ydHM9WyJjb25zdHJ1Y3RvciIsImhhc093blByb3BlcnR5IiwiaXNQcm90b3R5cGVPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidG9Mb2NhbGVTdHJpbmciLCJ0b1N0cmluZyIsInZhbHVlT2YiXX0sKHQsZSk9PntlLmY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sKHQsZSxuKT0+e3ZhciBpPW4oNykscj1uKDIxKSxzPS8jfFwucHJvdG90eXBlXC4vLGlzRm9yY2VkPWZ1bmN0aW9uKHQsZSl7dmFyIG49b1thKHQpXTtyZXR1cm4gbj09Y3x8biE9bCYmKHIoZSk/aShlKTohIWUpfSxhPWlzRm9yY2VkLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UocywiLiIpLnRvTG93ZXJDYXNlKCl9LG89aXNGb3JjZWQuZGF0YT17fSxsPWlzRm9yY2VkLk5BVElWRT0iTiIsYz1pc0ZvcmNlZC5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWlzRm9yY2VkfSwodCxlLG4pPT57dmFyIGk9big5KSxyPUZ1bmN0aW9uLnByb3RvdHlwZSxzPXIuYXBwbHksYT1yLmNhbGw7dC5leHBvcnRzPSJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5hcHBseXx8KGk/YS5iaW5kKHMpOmZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkocyxhcmd1bWVudHMpfSl9LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9bigyNCkscj1uKDM5KSxzPW4oNDQpLGE9bigyNSksbz1uKDcxKSxsPW4oNTYpLGM9big3NCksaD1uKDc1KSxkPW4oNzYpLHU9big4MCkscD1uKDgxKSxmPW4oNiksZz1uKDM2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbSl7dmFyIGI9InN0YWNrVHJhY2VMaW1pdCIsdj1tPzI6MSx5PXQuc3BsaXQoIi4iKSxBPXlbeS5sZW5ndGgtMV0sXz1pLmFwcGx5KG51bGwseSk7aWYoXyl7dmFyIFM9Xy5wcm90b3R5cGU7IWcmJnIoUywiY2F1c2UiKSYmZGVsZXRlIFMuY2F1c2U7aWYoIW4pcmV0dXJuIF87dmFyIEU9aSgiRXJyb3IiKSx4PWUoKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZChtP2U6dCx2b2lkIDApLGk9bT9uZXcgXyh0KTpuZXcgXzt2b2lkIDAhPT1uJiZzKGksIm1lc3NhZ2UiLG4pO3AoaSx4LGkuc3RhY2ssMik7dGhpcyYmYShTLHRoaXMpJiZoKGksdGhpcyx4KTthcmd1bWVudHMubGVuZ3RoPnYmJnUoaSxhcmd1bWVudHNbdl0pO3JldHVybiBpfSkpO3gucHJvdG90eXBlPVM7aWYoIkVycm9yIiE9PUEpbz9vKHgsRSk6bCh4LEUse25hbWU6ITB9KTtlbHNlIGlmKGYmJmIgaW4gXyl7Yyh4LF8sYik7Yyh4LF8sInByZXBhcmVTdGFja1RyYWNlIil9bCh4LF8pO2lmKCFnKXRyeXtTLm5hbWUhPT1BJiZzKFMsIm5hbWUiLEEpO1MuY29uc3RydWN0b3I9eH1jYXRjaCh0KXt9cmV0dXJuIHh9fX0sKHQsZSxuKT0+e3ZhciBpPW4oNzIpLHI9big0Nykscz1uKDczKTt0LmV4cG9ydHM9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIHQsZT0hMSxuPXt9O3RyeXsodD1pKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIsInNldCIpKShuLFtdKTtlPW4gaW5zdGFuY2VvZiBBcnJheX1jYXRjaCh0KXt9cmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKG4saSl7cihuKTtzKGkpO2U/dChuLGkpOm4uX19wcm90b19fPWk7cmV0dXJuIG59fSgpOnZvaWQgMCl9LCh0LGUsbik9Pnt2YXIgaT1uKDE0KSxyPW4oMzEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dHJ5e3JldHVybiBpKHIoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpW25dKSl9Y2F0Y2godCl7fX19LCh0LGUsbik9Pnt2YXIgaT1uKDIxKSxyPVN0cmluZyxzPVR5cGVFcnJvcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIm9iamVjdCI9PXR5cGVvZiB0fHxpKHQpKXJldHVybiB0O3Rocm93IHMoIkNhbid0IHNldCAiK3IodCkrIiBhcyBhIHByb3RvdHlwZSIpfX0sKHQsZSxuKT0+e3ZhciBpPW4oNDUpLmY7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtuIGluIHR8fGkodCxuLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbbl19LHNldDpmdW5jdGlvbih0KXtlW25dPXR9fSl9fSwodCxlLG4pPT57dmFyIGk9bigyMSkscj1uKDIwKSxzPW4oNzEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGEsbztzJiZpKGE9ZS5jb25zdHJ1Y3RvcikmJmEhPT1uJiZyKG89YS5wcm90b3R5cGUpJiZvIT09bi5wcm90b3R5cGUmJnModCxvKTtyZXR1cm4gdH19LCh0LGUsbik9Pnt2YXIgaT1uKDc3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09dD9hcmd1bWVudHMubGVuZ3RoPDI/IiI6ZTppKHQpfX0sKHQsZSxuKT0+e3ZhciBpPW4oNzgpLHI9U3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZigiU3ltYm9sIj09PWkodCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyIpO3JldHVybiByKHQpfX0sKHQsZSxuKT0+e3ZhciBpPW4oNzkpLHI9bigyMSkscz1uKDE1KSxhPW4oMzQpKCJ0b1N0cmluZ1RhZyIpLG89T2JqZWN0LGw9IkFyZ3VtZW50cyI9PXMoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKTt0LmV4cG9ydHM9aT9zOmZ1bmN0aW9uKHQpe3ZhciBlLG4saTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9byh0KSxhKSk/bjpsP3MoZSk6Ik9iamVjdCI9PShpPXMoZSkpJiZyKGUuY2FsbGVlKT8iQXJndW1lbnRzIjppfX0sKHQsZSxuKT0+e3ZhciBpPXt9O2lbbigzNCkoInRvU3RyaW5nVGFnIildPSJ6Ijt0LmV4cG9ydHM9IltvYmplY3Qgel0iPT09U3RyaW5nKGkpfSwodCxlLG4pPT57dmFyIGk9bigyMCkscj1uKDQ0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpKGUpJiYiY2F1c2UiaW4gZSYmcih0LCJjYXVzZSIsZS5jYXVzZSl9fSwodCxlLG4pPT57dmFyIGk9big0NCkscj1uKDgyKSxzPW4oODMpLGE9RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3MmJihhP2EodCxlKTppKHQsInN0YWNrIixyKG4sbykpKX19LCh0LGUsbik9Pnt2YXIgaT1uKDE0KSxyPUVycm9yLHM9aSgiIi5yZXBsYWNlKSxhPVN0cmluZyhyKCJ6eGNhc2QiKS5zdGFjayksbz0vXG5ccyphdCBbXjpdKjpbXlxuXSovLGw9by50ZXN0KGEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKGwmJiJzdHJpbmciPT10eXBlb2YgdCYmIXIucHJlcGFyZVN0YWNrVHJhY2UpZm9yKDtlLS07KXQ9cyh0LG8sIiIpO3JldHVybiB0fX0sKHQsZSxuKT0+e3ZhciBpPW4oNykscj1uKDExKTt0LmV4cG9ydHM9IWkoKGZ1bmN0aW9uKCl7dmFyIHQ9RXJyb3IoImEiKTtpZighKCJzdGFjayJpbiB0KSlyZXR1cm4hMDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwic3RhY2siLHIoMSw3KSk7cmV0dXJuIDchPT10LnN0YWNrfSkpfSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oNDgpLHI9bigxNCkscz1uKDc3KSxhPW4oODUpLG89VVJMU2VhcmNoUGFyYW1zLGw9by5wcm90b3R5cGUsYz1yKGwuYXBwZW5kKSxoPXIobC5kZWxldGUpLGQ9cihsLmZvckVhY2gpLHU9cihbXS5wdXNoKSxwPW5ldyBvKCJhPTEmYT0yIik7cC5kZWxldGUoImEiLDEpO3ArIiIhPSJhPTIiJiZpKGwsImRlbGV0ZSIsKGZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1lPDI/dm9pZCAwOmFyZ3VtZW50c1sxXTtpZihlJiZ2b2lkIDA9PT1uKXJldHVybiBoKHRoaXMsdCk7dmFyIGk9W107ZCh0aGlzLChmdW5jdGlvbih0LGUpe3UoaSx7a2V5OmUsdmFsdWU6dH0pfSkpO2EoZSwxKTtmb3IodmFyIHIsbz1zKHQpLGw9cyhuKSxwPTAsZj0wLGc9ITEsbT1pLmxlbmd0aDtwPG07KXtyPWlbcCsrXTtpZihnfHxyLmtleT09PW8pe2c9ITA7aCh0aGlzLHIua2V5KX1lbHNlIGYrK31mb3IoO2Y8bTspKHI9aVtmKytdKS5rZXk9PT1vJiZyLnZhbHVlPT09bHx8Yyh0aGlzLHIua2V5LHIudmFsdWUpfSkse2VudW1lcmFibGU6ITAsdW5zYWZlOiEwfSl9LHQ9Pnt2YXIgZT1UeXBlRXJyb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7aWYodDxuKXRocm93IGUoIk5vdCBlbm91Z2ggYXJndW1lbnRzIik7cmV0dXJuIHR9fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oNDgpLHI9bigxNCkscz1uKDc3KSxhPW4oODUpLG89VVJMU2VhcmNoUGFyYW1zLGw9by5wcm90b3R5cGUsYz1yKGwuZ2V0QWxsKSxoPXIobC5oYXMpO25ldyBvKCJhPTEiKS5oYXMoImEiLDIpJiZpKGwsImhhcyIsKGZ1bmN0aW9uIGhhcyh0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49ZTwyP3ZvaWQgMDphcmd1bWVudHNbMV07aWYoZSYmdm9pZCAwPT09bilyZXR1cm4gaCh0aGlzLHQpO3ZhciBpPWModGhpcyx0KTthKGUsMSk7Zm9yKHZhciByPXMobiksbz0wO288aS5sZW5ndGg7KWlmKGlbbysrXT09PXIpcmV0dXJuITA7cmV0dXJuITF9KSx7ZW51bWVyYWJsZTohMCx1bnNhZmU6ITB9KX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDYpLHI9bigxNCkscz1uKDg4KSxhPVVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUsbz1yKGEuZm9yRWFjaCk7aSYmISgic2l6ZSJpbiBhKSYmcyhhLCJzaXplIix7Z2V0OmZ1bmN0aW9uIHNpemUoKXt2YXIgdD0wO28odGhpcywoZnVuY3Rpb24oKXt0Kyt9KSk7cmV0dXJuIHR9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9LCh0LGUsbik9Pnt2YXIgaT1uKDQ5KSxyPW4oNDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7bi5nZXQmJmkobi5nZXQsZSx7Z2V0dGVyOiEwfSk7bi5zZXQmJmkobi5zZXQsZSx7c2V0dGVyOiEwfSk7cmV0dXJuIHIuZih0LGUsbil9fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oMykscj1uKDQwKSxzPW4oNjQpLGE9big5MCksbz1uKDkyKTtpKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxhcml0eToxLGZvcmNlZDpuKDcpKChmdW5jdGlvbigpe3JldHVybiA0Mjk0OTY3Mjk3IT09W10ucHVzaC5jYWxsKHtsZW5ndGg6NDI5NDk2NzI5Nn0sMSl9KSl8fCFmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sImxlbmd0aCIse3dyaXRhYmxlOiExfSkucHVzaCgpfWNhdGNoKHQpe3JldHVybiB0IGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKX0se3B1c2g6ZnVuY3Rpb24gcHVzaCh0KXt2YXIgZT1yKHRoaXMpLG49cyhlKSxpPWFyZ3VtZW50cy5sZW5ndGg7byhuK2kpO2Zvcih2YXIgbD0wO2w8aTtsKyspe2Vbbl09YXJndW1lbnRzW2xdO24rK31hKGUsbik7cmV0dXJuIG59fSl9LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9big2KSxyPW4oOTEpLHM9VHlwZUVycm9yLGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixvPWkmJiFmdW5jdGlvbigpe2lmKHZvaWQgMCE9PXRoaXMpcmV0dXJuITA7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwibGVuZ3RoIix7d3JpdGFibGU6ITF9KS5sZW5ndGg9MX1jYXRjaCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFR5cGVFcnJvcn19KCk7dC5leHBvcnRzPW8/ZnVuY3Rpb24odCxlKXtpZihyKHQpJiYhYSh0LCJsZW5ndGgiKS53cml0YWJsZSl0aHJvdyBzKCJDYW5ub3Qgc2V0IHJlYWQgb25seSAubGVuZ3RoIik7cmV0dXJuIHQubGVuZ3RoPWV9OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGVuZ3RoPWV9fSwodCxlLG4pPT57dmFyIGk9bigxNSk7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uIGlzQXJyYXkodCl7cmV0dXJuIkFycmF5Ij09aSh0KX19LHQ9Pnt2YXIgZT1UeXBlRXJyb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHQ+OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBlKCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQiKTtyZXR1cm4gdH19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9big5NCkscj1uKDk4KS5maW5kTGFzdCxzPWkuYVR5cGVkQXJyYXk7KDAsaS5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZmluZExhc3QiLChmdW5jdGlvbiBmaW5kTGFzdCh0KXtyZXR1cm4gcihzKHRoaXMpLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpfSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpLHIscyxhPW4oOTUpLG89big2KSxsPW4oNCksYz1uKDIxKSxoPW4oMjApLGQ9bigzOSksdT1uKDc4KSxwPW4oMzIpLGY9big0NCksZz1uKDQ4KSxtPW4oODgpLGI9bigyNSksdj1uKDk2KSx5PW4oNzEpLEE9bigzNCksXz1uKDQxKSxTPW4oNTIpLEU9Uy5lbmZvcmNlLHg9Uy5nZXQsdz1sLkludDhBcnJheSxDPXcmJncucHJvdG90eXBlLFQ9bC5VaW50OENsYW1wZWRBcnJheSxQPVQmJlQucHJvdG90eXBlLGs9dyYmdih3KSxNPUMmJnYoQyksUj1PYmplY3QucHJvdG90eXBlLEk9bC5UeXBlRXJyb3IsRD1BKCJ0b1N0cmluZ1RhZyIpLE89XygiVFlQRURfQVJSQVlfVEFHIiksTD0iVHlwZWRBcnJheUNvbnN0cnVjdG9yIixOPWEmJiEheSYmIk9wZXJhIiE9PXUobC5vcGVyYSksQj0hMSxqPXtJbnQ4QXJyYXk6MSxVaW50OEFycmF5OjEsVWludDhDbGFtcGVkQXJyYXk6MSxJbnQxNkFycmF5OjIsVWludDE2QXJyYXk6MixJbnQzMkFycmF5OjQsVWludDMyQXJyYXk6NCxGbG9hdDMyQXJyYXk6NCxGbG9hdDY0QXJyYXk6OH0sVT17QmlnSW50NjRBcnJheTo4LEJpZ1VpbnQ2NEFycmF5Ojh9LGdldFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcj1mdW5jdGlvbih0KXt2YXIgZT12KHQpO2lmKGgoZSkpe3ZhciBuPXgoZSk7cmV0dXJuIG4mJmQobixMKT9uW0xdOmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcihlKX19LGlzVHlwZWRBcnJheT1mdW5jdGlvbih0KXtpZighaCh0KSlyZXR1cm4hMTt2YXIgZT11KHQpO3JldHVybiBkKGosZSl8fGQoVSxlKX07Zm9yKGkgaW4gaikocz0ocj1sW2ldKSYmci5wcm90b3R5cGUpP0UocylbTF09cjpOPSExO2ZvcihpIGluIFUpKHM9KHI9bFtpXSkmJnIucHJvdG90eXBlKSYmKEUocylbTF09cik7aWYoIU58fCFjKGspfHxrPT09RnVuY3Rpb24ucHJvdG90eXBlKXtrPWZ1bmN0aW9uIFR5cGVkQXJyYXkoKXt0aHJvdyBJKCJJbmNvcnJlY3QgaW52b2NhdGlvbiIpfTtpZihOKWZvcihpIGluIGopbFtpXSYmeShsW2ldLGspfWlmKCFOfHwhTXx8TT09PVIpe009ay5wcm90b3R5cGU7aWYoTilmb3IoaSBpbiBqKWxbaV0mJnkobFtpXS5wcm90b3R5cGUsTSl9TiYmdihQKSE9PU0mJnkoUCxNKTtpZihvJiYhZChNLEQpKXtCPSEwO20oTSxELHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcyk/dGhpc1tPXTp2b2lkIDB9fSk7Zm9yKGkgaW4gailsW2ldJiZmKGxbaV0sTyxpKX10LmV4cG9ydHM9e05BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M6TixUWVBFRF9BUlJBWV9UQUc6QiYmTyxhVHlwZWRBcnJheTpmdW5jdGlvbih0KXtpZihpc1R5cGVkQXJyYXkodCkpcmV0dXJuIHQ7dGhyb3cgSSgiVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Iil9LGFUeXBlZEFycmF5Q29uc3RydWN0b3I6ZnVuY3Rpb24odCl7aWYoYyh0KSYmKCF5fHxiKGssdCkpKXJldHVybiB0O3Rocm93IEkocCh0KSsiIGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIil9LGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6ZnVuY3Rpb24odCxlLG4saSl7aWYobyl7aWYobilmb3IodmFyIHIgaW4gail7dmFyIHM9bFtyXTtpZihzJiZkKHMucHJvdG90eXBlLHQpKXRyeXtkZWxldGUgcy5wcm90b3R5cGVbdF19Y2F0Y2gobil7dHJ5e3MucHJvdG90eXBlW3RdPWV9Y2F0Y2godCl7fX19TVt0XSYmIW58fGcoTSx0LG4/ZTpOJiZDW3RdfHxlLGkpfX0sZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZDpmdW5jdGlvbih0LGUsbil7dmFyIGkscjtpZihvKXtpZih5KXtpZihuKWZvcihpIGluIGopaWYoKHI9bFtpXSkmJmQocix0KSl0cnl7ZGVsZXRlIHJbdF19Y2F0Y2godCl7fWlmKGtbdF0mJiFuKXJldHVybjt0cnl7cmV0dXJuIGcoayx0LG4/ZTpOJiZrW3RdfHxlKX1jYXRjaCh0KXt9fWZvcihpIGluIGopIShyPWxbaV0pfHxyW3RdJiYhbnx8ZyhyLHQsZSl9fSxnZXRUeXBlZEFycmF5Q29uc3RydWN0b3I6Z2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yLGlzVmlldzpmdW5jdGlvbiBpc1ZpZXcodCl7aWYoIWgodCkpcmV0dXJuITE7dmFyIGU9dSh0KTtyZXR1cm4iRGF0YVZpZXciPT09ZXx8ZChqLGUpfHxkKFUsZSl9LGlzVHlwZWRBcnJheTppc1R5cGVkQXJyYXksVHlwZWRBcnJheTprLFR5cGVkQXJyYXlQcm90b3R5cGU6TX19LHQ9Pnt0LmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBEYXRhVmlld30sKHQsZSxuKT0+e3ZhciBpPW4oMzkpLHI9bigyMSkscz1uKDQwKSxhPW4oNTQpLG89big5NyksbD1hKCJJRV9QUk9UTyIpLGM9T2JqZWN0LGg9Yy5wcm90b3R5cGU7dC5leHBvcnRzPW8/Yy5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXt2YXIgZT1zKHQpO2lmKGkoZSxsKSlyZXR1cm4gZVtsXTt2YXIgbj1lLmNvbnN0cnVjdG9yO3JldHVybiByKG4pJiZlIGluc3RhbmNlb2Ygbj9uLnByb3RvdHlwZTplIGluc3RhbmNlb2YgYz9oOm51bGx9fSwodCxlLG4pPT57dmFyIGk9big3KTt0LmV4cG9ydHM9IWkoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gRigpe31GLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYpIT09Ri5wcm90b3R5cGV9KSl9LCh0LGUsbik9Pnt2YXIgaT1uKDk5KSxyPW4oMTMpLHM9big0MCksYT1uKDY0KSxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24odCl7dmFyIGU9MT09dDtyZXR1cm4gZnVuY3Rpb24obixvLGwpe2Zvcih2YXIgYyxoPXMobiksZD1yKGgpLHU9aShvLGwpLHA9YShkKTtwLS0gPjA7KWlmKHUoYz1kW3BdLHAsaCkpc3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gYztjYXNlIDE6cmV0dXJuIHB9cmV0dXJuIGU/LTE6dm9pZCAwfX07dC5leHBvcnRzPXtmaW5kTGFzdDpjcmVhdGVNZXRob2QoMCksZmluZExhc3RJbmRleDpjcmVhdGVNZXRob2QoMSl9fSwodCxlLG4pPT57dmFyIGk9bigxMDApLHI9bigzMSkscz1uKDkpLGE9aShpLmJpbmQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3IodCk7cmV0dXJuIHZvaWQgMD09PWU/dDpzP2EodCxlKTpmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19fSwodCxlLG4pPT57dmFyIGk9bigxNSkscj1uKDE0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIkZ1bmN0aW9uIj09PWkodCkpcmV0dXJuIHIodCl9fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oOTQpLHI9big5OCkuZmluZExhc3RJbmRleCxzPWkuYVR5cGVkQXJyYXk7KDAsaS5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZmluZExhc3RJbmRleCIsKGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgodCl7cmV0dXJuIHIocyh0aGlzKSx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0pKX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDQpLHI9big4KSxzPW4oOTQpLGE9big2NCksbz1uKDEwMyksbD1uKDQwKSxjPW4oNyksaD1pLlJhbmdlRXJyb3IsZD1pLkludDhBcnJheSx1PWQmJmQucHJvdG90eXBlLHA9dSYmdS5zZXQsZj1zLmFUeXBlZEFycmF5LGc9cy5leHBvcnRUeXBlZEFycmF5TWV0aG9kLG09IWMoKGZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDIpO3IocCx0LHtsZW5ndGg6MSwwOjN9LDEpO3JldHVybiAzIT09dFsxXX0pKSxiPW0mJnMuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyYmYygoZnVuY3Rpb24oKXt2YXIgdD1uZXcgZCgyKTt0LnNldCgxKTt0LnNldCgiMiIsMSk7cmV0dXJuIDAhPT10WzBdfHwyIT09dFsxXX0pKTtnKCJzZXQiLChmdW5jdGlvbiBzZXQodCl7Zih0aGlzKTt2YXIgZT1vKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDEpLG49bCh0KTtpZihtKXJldHVybiByKHAsdGhpcyxuLGUpO3ZhciBpPXRoaXMubGVuZ3RoLHM9YShuKSxjPTA7aWYocytlPmkpdGhyb3cgaCgiV3JvbmcgbGVuZ3RoIik7Zm9yKDtjPHM7KXRoaXNbZStjXT1uW2MrK119KSwhbXx8Yil9LCh0LGUsbik9Pnt2YXIgaT1uKDEwNCkscj1SYW5nZUVycm9yO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPWkodCk7aWYobiVlKXRocm93IHIoIldyb25nIG9mZnNldCIpO3JldHVybiBufX0sKHQsZSxuKT0+e3ZhciBpPW4oNjIpLHI9UmFuZ2VFcnJvcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9aSh0KTtpZihlPDApdGhyb3cgcigiVGhlIGFyZ3VtZW50IGNhbid0IGJlIGxlc3MgdGhhbiAwIik7cmV0dXJuIGV9fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oMTA2KSxyPW4oOTQpLHM9ci5hVHlwZWRBcnJheSxhPXIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxvPXIuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yO2EoInRvUmV2ZXJzZWQiLChmdW5jdGlvbiB0b1JldmVyc2VkKCl7cmV0dXJuIGkocyh0aGlzKSxvKHRoaXMpKX0pKX0sKHQsZSxuKT0+e3ZhciBpPW4oNjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1pKHQpLHI9bmV3IGUobikscz0wO3M8bjtzKyspcltzXT10W24tcy0xXTtyZXR1cm4gcn19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9big5NCkscj1uKDE0KSxzPW4oMzEpLGE9bigxMDgpLG89aS5hVHlwZWRBcnJheSxsPWkuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yLGM9aS5leHBvcnRUeXBlZEFycmF5TWV0aG9kLGg9cihpLlR5cGVkQXJyYXlQcm90b3R5cGUuc29ydCk7YygidG9Tb3J0ZWQiLChmdW5jdGlvbiB0b1NvcnRlZCh0KXt2b2lkIDAhPT10JiZzKHQpO3ZhciBlPW8odGhpcyksbj1hKGwoZSksZSk7cmV0dXJuIGgobix0KX0pKX0sKHQsZSxuKT0+e3ZhciBpPW4oNjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9aShlKSxzPW5ldyB0KHIpO3I+bjspc1tuXT1lW24rK107cmV0dXJuIHN9fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oMTEwKSxyPW4oOTQpLHM9bigxMTEpLGE9big2Miksbz1uKDExMiksbD1yLmFUeXBlZEFycmF5LGM9ci5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsaD1yLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsZD0hIWZ1bmN0aW9uKCl7dHJ5e25ldyBJbnQ4QXJyYXkoMSkud2l0aCgyLHt2YWx1ZU9mOmZ1bmN0aW9uKCl7dGhyb3cgOH19KX1jYXRjaCh0KXtyZXR1cm4gOD09PXR9fSgpO2goIndpdGgiLHt3aXRoOmZ1bmN0aW9uKHQsZSl7dmFyIG49bCh0aGlzKSxyPWEodCksaD1zKG4pP28oZSk6K2U7cmV0dXJuIGkobixjKG4pLHIsaCl9fS53aXRoLCFkKX0sKHQsZSxuKT0+e3ZhciBpPW4oNjQpLHI9big2Mikscz1SYW5nZUVycm9yO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixhKXt2YXIgbz1pKHQpLGw9cihuKSxjPWw8MD9vK2w6bDtpZihjPj1vfHxjPDApdGhyb3cgcygiSW5jb3JyZWN0IGluZGV4Iik7Zm9yKHZhciBoPW5ldyBlKG8pLGQ9MDtkPG87ZCsrKWhbZF09ZD09PWM/YTp0W2RdO3JldHVybiBofX0sKHQsZSxuKT0+e3ZhciBpPW4oNzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1pKHQpO3JldHVybiJCaWdJbnQ2NEFycmF5Ij09ZXx8IkJpZ1VpbnQ2NEFycmF5Ij09ZX19LCh0LGUsbik9Pnt2YXIgaT1uKDE5KSxyPVR5cGVFcnJvcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9aSh0LCJudW1iZXIiKTtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgcigiQ2FuJ3QgY29udmVydCBudW1iZXIgdG8gYmlnaW50Iik7cmV0dXJuIEJpZ0ludChlKX19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9big2KSxyPW4oODgpLHM9bigxMTQpLGE9QXJyYXlCdWZmZXIucHJvdG90eXBlO2kmJiEoImRldGFjaGVkImluIGEpJiZyKGEsImRldGFjaGVkIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbiBkZXRhY2hlZCgpe3JldHVybiBzKHRoaXMpfX0pfSwodCxlLG4pPT57dmFyIGk9bigxNCkscj1uKDExNSkscz1pKEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKDAhPT1yKHQpKXJldHVybiExO3RyeXtzKHQsMCwwKTtyZXR1cm4hMX1jYXRjaCh0KXtyZXR1cm4hMH19fSwodCxlLG4pPT57dmFyIGk9big3Mikscj1uKDE1KSxzPVR5cGVFcnJvcjt0LmV4cG9ydHM9aShBcnJheUJ1ZmZlci5wcm90b3R5cGUsImJ5dGVMZW5ndGgiLCJnZXQiKXx8ZnVuY3Rpb24odCl7aWYoIkFycmF5QnVmZmVyIiE9cih0KSl0aHJvdyBzKCJBcnJheUJ1ZmZlciBleHBlY3RlZCIpO3JldHVybiB0LmJ5dGVMZW5ndGh9fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oMykscj1uKDExNyk7ciYmaSh7dGFyZ2V0OiJBcnJheUJ1ZmZlciIscHJvdG86ITB9LHt0cmFuc2ZlcjpmdW5jdGlvbiB0cmFuc2Zlcigpe3JldHVybiByKHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwLCEwKX19KX0sKHQsZSxuKT0+e3ZhciBpPW4oNCkscj1uKDE0KSxzPW4oNzIpLGE9bigxMTgpLG89bigxMTQpLGw9bigxMTUpLGM9bigxMTkpLGg9aS5UeXBlRXJyb3IsZD1pLnN0cnVjdHVyZWRDbG9uZSx1PWkuQXJyYXlCdWZmZXIscD1pLkRhdGFWaWV3LGY9TWF0aC5taW4sZz11LnByb3RvdHlwZSxtPXAucHJvdG90eXBlLGI9cihnLnNsaWNlKSx2PXMoZywicmVzaXphYmxlIiwiZ2V0IikseT1zKGcsIm1heEJ5dGVMZW5ndGgiLCJnZXQiKSxBPXIobS5nZXRJbnQ4KSxfPXIobS5zZXRJbnQ4KTt0LmV4cG9ydHM9YyYmZnVuY3Rpb24odCxlLG4pe3ZhciBpPWwodCkscj12b2lkIDA9PT1lP2k6YShlKSxzPSF2fHwhdih0KTtpZihvKHQpKXRocm93IGgoIkFycmF5QnVmZmVyIGlzIGRldGFjaGVkIik7dmFyIGM9ZCh0LHt0cmFuc2ZlcjpbdF19KTtpZihpPT1yJiYobnx8cykpcmV0dXJuIGM7aWYoaT49ciYmKCFufHxzKSlyZXR1cm4gYihjLDAscik7Zm9yKHZhciBnPW4mJiFzJiZ5P3ttYXhCeXRlTGVuZ3RoOnkoYyl9OnZvaWQgMCxtPW5ldyB1KHIsZyksUz1uZXcgcChjKSxFPW5ldyBwKG0pLHg9ZihyLGkpLHc9MDt3PHg7dysrKV8oRSx3LEEoUyx3KSk7cmV0dXJuIG19fSwodCxlLG4pPT57dmFyIGk9big2Mikscj1uKDY1KSxzPVJhbmdlRXJyb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIDA7dmFyIGU9aSh0KSxuPXIoZSk7aWYoZSE9PW4pdGhyb3cgcygiV3JvbmcgbGVuZ3RoIG9yIGluZGV4Iik7cmV0dXJuIG59fSwodCxlLG4pPT57dmFyIGk9big0KSxyPW4oNykscz1uKDI4KSxhPW4oMTIwKSxvPW4oMTIxKSxsPW4oMTIyKSxjPWkuc3RydWN0dXJlZENsb25lO3QuZXhwb3J0cz0hIWMmJiFyKChmdW5jdGlvbigpe2lmKG8mJnM+OTJ8fGwmJnM+OTR8fGEmJnM+OTcpcmV0dXJuITE7dmFyIHQ9bmV3IEFycmF5QnVmZmVyKDgpLGU9Yyh0LHt0cmFuc2ZlcjpbdF19KTtyZXR1cm4gMCE9dC5ieXRlTGVuZ3RofHw4IT1lLmJ5dGVMZW5ndGh9KSl9LCh0LGUsbik9Pnt2YXIgaT1uKDEyMSkscj1uKDEyMik7dC5leHBvcnRzPSFpJiYhciYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnR9LHQ9Pnt0LmV4cG9ydHM9Im9iamVjdCI9PXR5cGVvZiBEZW5vJiZEZW5vJiYib2JqZWN0Ij09dHlwZW9mIERlbm8udmVyc2lvbn0sKHQsZSxuKT0+e3ZhciBpPW4oMTUpO3QuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJiJwcm9jZXNzIj09aShwcm9jZXNzKX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDMpLHI9bigxMTcpO3ImJmkoe3RhcmdldDoiQXJyYXlCdWZmZXIiLHByb3RvOiEwfSx7dHJhbnNmZXJUb0ZpeGVkTGVuZ3RoOmZ1bmN0aW9uIHRyYW5zZmVyVG9GaXhlZExlbmd0aCgpe3JldHVybiByKHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwLCExKX19KX0sKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193X3BkZmpzX3JlcXVpcmVfXyk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2V4cG9ydHMuUmVuZGVyVGFzaz1leHBvcnRzLlBERldvcmtlclV0aWw9ZXhwb3J0cy5QREZXb3JrZXI9ZXhwb3J0cy5QREZQYWdlUHJveHk9ZXhwb3J0cy5QREZEb2N1bWVudFByb3h5PWV4cG9ydHMuUERGRG9jdW1lbnRMb2FkaW5nVGFzaz1leHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydD1leHBvcnRzLkxvb3BiYWNrUG9ydD1leHBvcnRzLkRlZmF1bHRTdGFuZGFyZEZvbnREYXRhRmFjdG9yeT1leHBvcnRzLkRlZmF1bHRGaWx0ZXJGYWN0b3J5PWV4cG9ydHMuRGVmYXVsdENhbnZhc0ZhY3Rvcnk9ZXhwb3J0cy5EZWZhdWx0Q01hcFJlYWRlckZhY3Rvcnk9dm9pZCAwO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJTVkdHcmFwaGljcyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIF9kaXNwbGF5U3ZnLlNWR0dyYXBoaWNzfX0pO2V4cG9ydHMuYnVpbGQ9dm9pZCAwO2V4cG9ydHMuZ2V0RG9jdW1lbnQ9Z2V0RG9jdW1lbnQ7ZXhwb3J0cy52ZXJzaW9uPXZvaWQgMDtfX3dfcGRmanNfcmVxdWlyZV9fKDg0KTtfX3dfcGRmanNfcmVxdWlyZV9fKDg2KTtfX3dfcGRmanNfcmVxdWlyZV9fKDg3KTtfX3dfcGRmanNfcmVxdWlyZV9fKDIpO19fd19wZGZqc19yZXF1aXJlX18oOTMpO19fd19wZGZqc19yZXF1aXJlX18oMTAxKTtfX3dfcGRmanNfcmVxdWlyZV9fKDEwMik7X193X3BkZmpzX3JlcXVpcmVfXygxMDUpO19fd19wZGZqc19yZXF1aXJlX18oMTA3KTtfX3dfcGRmanNfcmVxdWlyZV9fKDEwOSk7X193X3BkZmpzX3JlcXVpcmVfXygxMTMpO19fd19wZGZqc19yZXF1aXJlX18oMTE2KTtfX3dfcGRmanNfcmVxdWlyZV9fKDEyMyk7X193X3BkZmpzX3JlcXVpcmVfXyg4OSk7X193X3BkZmpzX3JlcXVpcmVfXygxMjUpO19fd19wZGZqc19yZXF1aXJlX18oMTM1KTtfX3dfcGRmanNfcmVxdWlyZV9fKDEzNyk7X193X3BkZmpzX3JlcXVpcmVfXygxNDApO19fd19wZGZqc19yZXF1aXJlX18oMTQyKTtfX3dfcGRmanNfcmVxdWlyZV9fKDE0NCk7X193X3BkZmpzX3JlcXVpcmVfXygxNDYpO19fd19wZGZqc19yZXF1aXJlX18oMTQ4KTtfX3dfcGRmanNfcmVxdWlyZV9fKDE1MSk7dmFyIF91dGlsPV9fd19wZGZqc19yZXF1aXJlX18oMSksX2Fubm90YXRpb25fc3RvcmFnZT1fX3dfcGRmanNfcmVxdWlyZV9fKDE2MiksX2Rpc3BsYXlfdXRpbHM9X193X3BkZmpzX3JlcXVpcmVfXygxNjcpLF9mb250X2xvYWRlcj1fX3dfcGRmanNfcmVxdWlyZV9fKDE3MCksX2Rpc3BsYXlOb2RlX3V0aWxzPV9fd19wZGZqc19yZXF1aXJlX18oMTcxKSxfY2FudmFzPV9fd19wZGZqc19yZXF1aXJlX18oMTcyKSxfd29ya2VyX29wdGlvbnM9X193X3BkZmpzX3JlcXVpcmVfXygxNzUpLF9tZXNzYWdlX2hhbmRsZXI9X193X3BkZmpzX3JlcXVpcmVfXygxNzYpLF9tZXRhZGF0YT1fX3dfcGRmanNfcmVxdWlyZV9fKDE3NyksX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnPV9fd19wZGZqc19yZXF1aXJlX18oMTc4KSxfdHJhbnNwb3J0X3N0cmVhbT1fX3dfcGRmanNfcmVxdWlyZV9fKDE3OSksX2Rpc3BsYXlGZXRjaF9zdHJlYW09X193X3BkZmpzX3JlcXVpcmVfXygxODApLF9kaXNwbGF5TmV0d29yaz1fX3dfcGRmanNfcmVxdWlyZV9fKDE4MyksX2Rpc3BsYXlOb2RlX3N0cmVhbT1fX3dfcGRmanNfcmVxdWlyZV9fKDE4NCksX2Rpc3BsYXlTdmc9X193X3BkZmpzX3JlcXVpcmVfXygxODUpLF94ZmFfdGV4dD1fX3dfcGRmanNfcmVxdWlyZV9fKDE5Myk7Y29uc3QgREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFPTY1NTM2LFJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVD0xMDAsREVMQVlFRF9DTEVBTlVQX1RJTUVPVVQ9NWUzLERlZmF1bHRDYW52YXNGYWN0b3J5PV91dGlsLmlzTm9kZUpTP19kaXNwbGF5Tm9kZV91dGlscy5Ob2RlQ2FudmFzRmFjdG9yeTpfZGlzcGxheV91dGlscy5ET01DYW52YXNGYWN0b3J5O2V4cG9ydHMuRGVmYXVsdENhbnZhc0ZhY3Rvcnk9RGVmYXVsdENhbnZhc0ZhY3Rvcnk7Y29uc3QgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5PV91dGlsLmlzTm9kZUpTP19kaXNwbGF5Tm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3Rvcnk6X2Rpc3BsYXlfdXRpbHMuRE9NQ01hcFJlYWRlckZhY3Rvcnk7ZXhwb3J0cy5EZWZhdWx0Q01hcFJlYWRlckZhY3Rvcnk9RGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O2NvbnN0IERlZmF1bHRGaWx0ZXJGYWN0b3J5PV91dGlsLmlzTm9kZUpTP19kaXNwbGF5Tm9kZV91dGlscy5Ob2RlRmlsdGVyRmFjdG9yeTpfZGlzcGxheV91dGlscy5ET01GaWx0ZXJGYWN0b3J5O2V4cG9ydHMuRGVmYXVsdEZpbHRlckZhY3Rvcnk9RGVmYXVsdEZpbHRlckZhY3Rvcnk7Y29uc3QgRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5PV91dGlsLmlzTm9kZUpTP19kaXNwbGF5Tm9kZV91dGlscy5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk6X2Rpc3BsYXlfdXRpbHMuRE9NU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7ZXhwb3J0cy5EZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3Rvcnk9RGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5O2Z1bmN0aW9uIGdldERvY3VtZW50KHQpeyJzdHJpbmciPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIFVSTD90PXt1cmw6dH06KDAsX3V0aWwuaXNBcnJheUJ1ZmZlcikodCkmJih0PXtkYXRhOnR9KTtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciBpbiBnZXREb2N1bWVudCwgbmVlZCBwYXJhbWV0ZXIgb2JqZWN0LiIpO2lmKCF0LnVybCYmIXQuZGF0YSYmIXQucmFuZ2UpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcmFtZXRlciBvYmplY3Q6IG5lZWQgZWl0aGVyIC5kYXRhLCAucmFuZ2Ugb3IgLnVybCIpO2NvbnN0IGU9bmV3IFBERkRvY3VtZW50TG9hZGluZ1Rhc2sse2RvY0lkOm59PWUsaT10LnVybD9nZXRVcmxQcm9wKHQudXJsKTpudWxsLHI9dC5kYXRhP2dldERhdGFQcm9wKHQuZGF0YSk6bnVsbCxzPXQuaHR0cEhlYWRlcnN8fG51bGwsYT0hMD09PXQud2l0aENyZWRlbnRpYWxzLG89dC5wYXNzd29yZD8/bnVsbCxsPXQucmFuZ2UgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQ/dC5yYW5nZTpudWxsLGM9TnVtYmVyLmlzSW50ZWdlcih0LnJhbmdlQ2h1bmtTaXplKSYmdC5yYW5nZUNodW5rU2l6ZT4wP3QucmFuZ2VDaHVua1NpemU6REVGQVVMVF9SQU5HRV9DSFVOS19TSVpFO2xldCBoPXQud29ya2VyIGluc3RhbmNlb2YgUERGV29ya2VyP3Qud29ya2VyOm51bGw7Y29uc3QgZD10LnZlcmJvc2l0eSx1PSJzdHJpbmciIT10eXBlb2YgdC5kb2NCYXNlVXJsfHwoMCxfZGlzcGxheV91dGlscy5pc0RhdGFTY2hlbWUpKHQuZG9jQmFzZVVybCk/bnVsbDp0LmRvY0Jhc2VVcmwscD0ic3RyaW5nIj09dHlwZW9mIHQuY01hcFVybD90LmNNYXBVcmw6bnVsbCxmPSExIT09dC5jTWFwUGFja2VkLGc9dC5DTWFwUmVhZGVyRmFjdG9yeXx8RGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5LG09InN0cmluZyI9PXR5cGVvZiB0LnN0YW5kYXJkRm9udERhdGFVcmw/dC5zdGFuZGFyZEZvbnREYXRhVXJsOm51bGwsYj10LlN0YW5kYXJkRm9udERhdGFGYWN0b3J5fHxEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3Rvcnksdj0hMCE9PXQuc3RvcEF0RXJyb3JzLHk9TnVtYmVyLmlzSW50ZWdlcih0Lm1heEltYWdlU2l6ZSkmJnQubWF4SW1hZ2VTaXplPi0xP3QubWF4SW1hZ2VTaXplOi0xLEE9ITEhPT10LmlzRXZhbFN1cHBvcnRlZCxfPSJib29sZWFuIj09dHlwZW9mIHQuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ/dC5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDohX3V0aWwuaXNOb2RlSlMsUz1OdW1iZXIuaXNJbnRlZ2VyKHQuY2FudmFzTWF4QXJlYUluQnl0ZXMpP3QuY2FudmFzTWF4QXJlYUluQnl0ZXM6LTEsRT0iYm9vbGVhbiI9PXR5cGVvZiB0LmRpc2FibGVGb250RmFjZT90LmRpc2FibGVGb250RmFjZTpfdXRpbC5pc05vZGVKUyx4PSEwPT09dC5mb250RXh0cmFQcm9wZXJ0aWVzLHc9ITA9PT10LmVuYWJsZVhmYSxDPXQub3duZXJEb2N1bWVudHx8Z2xvYmFsVGhpcy5kb2N1bWVudCxUPSEwPT09dC5kaXNhYmxlUmFuZ2UsUD0hMD09PXQuZGlzYWJsZVN0cmVhbSxrPSEwPT09dC5kaXNhYmxlQXV0b0ZldGNoLE09ITA9PT10LnBkZkJ1ZyxSPWw/bC5sZW5ndGg6dC5sZW5ndGg/P05hTixJPSJib29sZWFuIj09dHlwZW9mIHQudXNlU3lzdGVtRm9udHM/dC51c2VTeXN0ZW1Gb250czohX3V0aWwuaXNOb2RlSlMmJiFFLEQ9ImJvb2xlYW4iPT10eXBlb2YgdC51c2VXb3JrZXJGZXRjaD90LnVzZVdvcmtlckZldGNoOmc9PT1fZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeSYmYj09PV9kaXNwbGF5X3V0aWxzLkRPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5JiZwJiZtJiYoMCxfZGlzcGxheV91dGlscy5pc1ZhbGlkRmV0Y2hVcmwpKHAsZG9jdW1lbnQuYmFzZVVSSSkmJigwLF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkobSxkb2N1bWVudC5iYXNlVVJJKSxPPXQuY2FudmFzRmFjdG9yeXx8bmV3IERlZmF1bHRDYW52YXNGYWN0b3J5KHtvd25lckRvY3VtZW50OkN9KSxMPXQuZmlsdGVyRmFjdG9yeXx8bmV3IERlZmF1bHRGaWx0ZXJGYWN0b3J5KHtkb2NJZDpuLG93bmVyRG9jdW1lbnQ6Q30pOygwLF91dGlsLnNldFZlcmJvc2l0eUxldmVsKShkKTtjb25zdCBOPXtjYW52YXNGYWN0b3J5Ok8sZmlsdGVyRmFjdG9yeTpMfTtpZighRCl7Ti5jTWFwUmVhZGVyRmFjdG9yeT1uZXcgZyh7YmFzZVVybDpwLGlzQ29tcHJlc3NlZDpmfSk7Ti5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeT1uZXcgYih7YmFzZVVybDptfSl9aWYoIWgpe2NvbnN0IHQ9e3ZlcmJvc2l0eTpkLHBvcnQ6X3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyUG9ydH07aD10LnBvcnQ/UERGV29ya2VyLmZyb21Qb3J0KHQpOm5ldyBQREZXb3JrZXIodCk7ZS5fd29ya2VyPWh9Y29uc3QgQj17ZG9jSWQ6bixhcGlWZXJzaW9uOiIzLjkuMTc5IixkYXRhOnIscGFzc3dvcmQ6byxkaXNhYmxlQXV0b0ZldGNoOmsscmFuZ2VDaHVua1NpemU6YyxsZW5ndGg6Uixkb2NCYXNlVXJsOnUsZW5hYmxlWGZhOncsZXZhbHVhdG9yT3B0aW9uczp7bWF4SW1hZ2VTaXplOnksZGlzYWJsZUZvbnRGYWNlOkUsaWdub3JlRXJyb3JzOnYsaXNFdmFsU3VwcG9ydGVkOkEsaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6XyxjYW52YXNNYXhBcmVhSW5CeXRlczpTLGZvbnRFeHRyYVByb3BlcnRpZXM6eCx1c2VTeXN0ZW1Gb250czpJLGNNYXBVcmw6RD9wOm51bGwsc3RhbmRhcmRGb250RGF0YVVybDpEP206bnVsbH19LGo9e2lnbm9yZUVycm9yczp2LGlzRXZhbFN1cHBvcnRlZDpBLGRpc2FibGVGb250RmFjZTpFLGZvbnRFeHRyYVByb3BlcnRpZXM6eCxlbmFibGVYZmE6dyxvd25lckRvY3VtZW50OkMsZGlzYWJsZUF1dG9GZXRjaDprLHBkZkJ1ZzpNLHN0eWxlRWxlbWVudDpudWxsfTtoLnByb21pc2UudGhlbigoZnVuY3Rpb24oKXtpZihlLmRlc3Ryb3llZCl0aHJvdyBuZXcgRXJyb3IoIkxvYWRpbmcgYWJvcnRlZCIpO2NvbnN0IHQ9X2ZldGNoRG9jdW1lbnQoaCxCKSxvPW5ldyBQcm9taXNlKChmdW5jdGlvbih0KXtsZXQgZTtpZihsKWU9bmV3IF90cmFuc3BvcnRfc3RyZWFtLlBERkRhdGFUcmFuc3BvcnRTdHJlYW0oe2xlbmd0aDpSLGluaXRpYWxEYXRhOmwuaW5pdGlhbERhdGEscHJvZ3Jlc3NpdmVEb25lOmwucHJvZ3Jlc3NpdmVEb25lLGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOmwuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUsZGlzYWJsZVJhbmdlOlQsZGlzYWJsZVN0cmVhbTpQfSxsKTtlbHNlIGlmKCFyKXtlPSh0PT5fdXRpbC5pc05vZGVKUz9uZXcgX2Rpc3BsYXlOb2RlX3N0cmVhbS5QREZOb2RlU3RyZWFtKHQpOigwLF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkodC51cmwpP25ldyBfZGlzcGxheUZldGNoX3N0cmVhbS5QREZGZXRjaFN0cmVhbSh0KTpuZXcgX2Rpc3BsYXlOZXR3b3JrLlBERk5ldHdvcmtTdHJlYW0odCkpKHt1cmw6aSxsZW5ndGg6UixodHRwSGVhZGVyczpzLHdpdGhDcmVkZW50aWFsczphLHJhbmdlQ2h1bmtTaXplOmMsZGlzYWJsZVJhbmdlOlQsZGlzYWJsZVN0cmVhbTpQfSl9dChlKX0pKTtyZXR1cm4gUHJvbWlzZS5hbGwoW3Qsb10pLnRoZW4oKGZ1bmN0aW9uKHQpe2xldFtpLHJdPXQ7aWYoZS5kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJMb2FkaW5nIGFib3J0ZWQiKTtjb25zdCBzPW5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4saSxoLnBvcnQpLGE9bmV3IFdvcmtlclRyYW5zcG9ydChzLGUscixqLE4pO2UuX3RyYW5zcG9ydD1hO3Muc2VuZCgiUmVhZHkiLG51bGwpfSkpfSkpLmNhdGNoKGUuX2NhcGFiaWxpdHkucmVqZWN0KTtyZXR1cm4gZX1hc3luYyBmdW5jdGlvbiBfZmV0Y2hEb2N1bWVudCh0LGUpe2lmKHQuZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQiKTtjb25zdCBuPWF3YWl0IHQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXREb2NSZXF1ZXN0IixlLGUuZGF0YT9bZS5kYXRhLmJ1ZmZlcl06bnVsbCk7aWYodC5kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCIpO3JldHVybiBufWZ1bmN0aW9uIGdldFVybFByb3AodCl7aWYodCBpbnN0YW5jZW9mIFVSTClyZXR1cm4gdC5ocmVmO3RyeXtyZXR1cm4gbmV3IFVSTCh0LHdpbmRvdy5sb2NhdGlvbikuaHJlZn1jYXRjaHtpZihfdXRpbC5pc05vZGVKUyYmInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0fXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBQREYgdXJsIGRhdGE6IGVpdGhlciBzdHJpbmcgb3IgVVJMLW9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgdXJsIHByb3BlcnR5LiIpfWZ1bmN0aW9uIGdldERhdGFQcm9wKHQpe2lmKF91dGlsLmlzTm9kZUpTJiYidW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmdCBpbnN0YW5jZW9mIEJ1ZmZlcil0aHJvdyBuZXcgRXJyb3IoIlBsZWFzZSBwcm92aWRlIGJpbmFyeSBkYXRhIGFzIGBVaW50OEFycmF5YCwgcmF0aGVyIHRoYW4gYEJ1ZmZlcmAuIik7aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJnQuYnl0ZUxlbmd0aD09PXQuYnVmZmVyLmJ5dGVMZW5ndGgpcmV0dXJuIHQ7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybigwLF91dGlsLnN0cmluZ1RvQnl0ZXMpKHQpO2lmKCJvYmplY3QiPT10eXBlb2YgdCYmIWlzTmFOKHQ/Lmxlbmd0aCl8fCgwLF91dGlsLmlzQXJyYXlCdWZmZXIpKHQpKXJldHVybiBuZXcgVWludDhBcnJheSh0KTt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgUERGIGJpbmFyeSBkYXRhOiBlaXRoZXIgVHlwZWRBcnJheSwgc3RyaW5nLCBvciBhcnJheS1saWtlIG9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgZGF0YSBwcm9wZXJ0eS4iKX1jbGFzcyBQREZEb2N1bWVudExvYWRpbmdUYXNre3N0YXRpYyNlPTA7Y29uc3RydWN0b3IoKXt0aGlzLl9jYXBhYmlsaXR5PW5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLl90cmFuc3BvcnQ9bnVsbDt0aGlzLl93b3JrZXI9bnVsbDt0aGlzLmRvY0lkPSJkIitQREZEb2N1bWVudExvYWRpbmdUYXNrLiNlKys7dGhpcy5kZXN0cm95ZWQ9ITE7dGhpcy5vblBhc3N3b3JkPW51bGw7dGhpcy5vblByb2dyZXNzPW51bGx9Z2V0IHByb21pc2UoKXtyZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlfWFzeW5jIGRlc3Ryb3koKXt0aGlzLmRlc3Ryb3llZD0hMDthd2FpdCh0aGlzLl90cmFuc3BvcnQ/LmRlc3Ryb3koKSk7dGhpcy5fdHJhbnNwb3J0PW51bGw7aWYodGhpcy5fd29ya2VyKXt0aGlzLl93b3JrZXIuZGVzdHJveSgpO3RoaXMuX3dvcmtlcj1udWxsfX19ZXhwb3J0cy5QREZEb2N1bWVudExvYWRpbmdUYXNrPVBERkRvY3VtZW50TG9hZGluZ1Rhc2s7Y2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0e2NvbnN0cnVjdG9yKHQsZSl7bGV0IG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsO3RoaXMubGVuZ3RoPXQ7dGhpcy5pbml0aWFsRGF0YT1lO3RoaXMucHJvZ3Jlc3NpdmVEb25lPW47dGhpcy5jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZT1pO3RoaXMuX3JhbmdlTGlzdGVuZXJzPVtdO3RoaXMuX3Byb2dyZXNzTGlzdGVuZXJzPVtdO3RoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycz1bXTt0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnM9W107dGhpcy5fcmVhZHlDYXBhYmlsaXR5PW5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eX1hZGRSYW5nZUxpc3RlbmVyKHQpe3RoaXMuX3JhbmdlTGlzdGVuZXJzLnB1c2godCl9YWRkUHJvZ3Jlc3NMaXN0ZW5lcih0KXt0aGlzLl9wcm9ncmVzc0xpc3RlbmVycy5wdXNoKHQpfWFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKHQpe3RoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycy5wdXNoKHQpfWFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKHQpe3RoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycy5wdXNoKHQpfW9uRGF0YVJhbmdlKHQsZSl7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMpbih0LGUpfW9uRGF0YVByb2dyZXNzKHQsZSl7dGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKCk9Pntmb3IoY29uc3QgbiBvZiB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycyluKHQsZSl9KSl9b25EYXRhUHJvZ3Jlc3NpdmVSZWFkKHQpe3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCgpPT57Zm9yKGNvbnN0IGUgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzKWUodCl9KSl9b25EYXRhUHJvZ3Jlc3NpdmVEb25lKCl7dGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKCk9Pntmb3IoY29uc3QgdCBvZiB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMpdCgpfSkpfXRyYW5zcG9ydFJlYWR5KCl7dGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKX1yZXF1ZXN0RGF0YVJhbmdlKHQsZSl7KDAsX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgUERGRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2UiKX1hYm9ydCgpe319ZXhwb3J0cy5QREZEYXRhUmFuZ2VUcmFuc3BvcnQ9UERGRGF0YVJhbmdlVHJhbnNwb3J0O2NsYXNzIFBERkRvY3VtZW50UHJveHl7Y29uc3RydWN0b3IodCxlKXt0aGlzLl9wZGZJbmZvPXQ7dGhpcy5fdHJhbnNwb3J0PWV9Z2V0IGFubm90YXRpb25TdG9yYWdlKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5hbm5vdGF0aW9uU3RvcmFnZX1nZXQgZmlsdGVyRmFjdG9yeSgpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeX1nZXQgbnVtUGFnZXMoKXtyZXR1cm4gdGhpcy5fcGRmSW5mby5udW1QYWdlc31nZXQgZmluZ2VycHJpbnRzKCl7cmV0dXJuIHRoaXMuX3BkZkluZm8uZmluZ2VycHJpbnRzfWdldCBpc1B1cmVYZmEoKXtyZXR1cm4oMCxfdXRpbC5zaGFkb3cpKHRoaXMsImlzUHVyZVhmYSIsISF0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpfWdldCBhbGxYZmFIdG1sKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYX1nZXRQYWdlKHQpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZSh0KX1nZXRQYWdlSW5kZXgodCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSW5kZXgodCl9Z2V0RGVzdGluYXRpb25zKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbnMoKX1nZXREZXN0aW5hdGlvbih0KXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERlc3RpbmF0aW9uKHQpfWdldFBhZ2VMYWJlbHMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKX1nZXRQYWdlTGF5b3V0KCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTGF5b3V0KCl9Z2V0UGFnZU1vZGUoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VNb2RlKCl9Z2V0Vmlld2VyUHJlZmVyZW5jZXMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFZpZXdlclByZWZlcmVuY2VzKCl9Z2V0T3BlbkFjdGlvbigpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3BlbkFjdGlvbigpfWdldEF0dGFjaG1lbnRzKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBdHRhY2htZW50cygpfWdldEphdmFTY3JpcHQoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEphdmFTY3JpcHQoKX1nZXRKU0FjdGlvbnMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERvY0pTQWN0aW9ucygpfWdldE91dGxpbmUoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE91dGxpbmUoKX1nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpfWdldFBlcm1pc3Npb25zKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQZXJtaXNzaW9ucygpfWdldE1ldGFkYXRhKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNZXRhZGF0YSgpfWdldE1hcmtJbmZvKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNYXJrSW5mbygpfWdldERhdGEoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERhdGEoKX1zYXZlRG9jdW1lbnQoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnNhdmVEb2N1bWVudCgpfWdldERvd25sb2FkSW5mbygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5wcm9taXNlfWNsZWFudXAoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl90cmFuc3BvcnQuc3RhcnRDbGVhbnVwKHR8fHRoaXMuaXNQdXJlWGZhKX1kZXN0cm95KCl7cmV0dXJuIHRoaXMubG9hZGluZ1Rhc2suZGVzdHJveSgpfWdldCBsb2FkaW5nUGFyYW1zKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zfWdldCBsb2FkaW5nVGFzaygpe3JldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1Rhc2t9Z2V0RmllbGRPYmplY3RzKCl7cmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRGaWVsZE9iamVjdHMoKX1oYXNKU0FjdGlvbnMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lmhhc0pTQWN0aW9ucygpfWdldENhbGN1bGF0aW9uT3JkZXJJZHMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldENhbGN1bGF0aW9uT3JkZXJJZHMoKX19ZXhwb3J0cy5QREZEb2N1bWVudFByb3h5PVBERkRvY3VtZW50UHJveHk7Y2xhc3MgUERGUGFnZVByb3h5eyNuPW51bGw7I2k9ITE7Y29uc3RydWN0b3IodCxlLG4pe2xldCBpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107dGhpcy5fcGFnZUluZGV4PXQ7dGhpcy5fcGFnZUluZm89ZTt0aGlzLl90cmFuc3BvcnQ9bjt0aGlzLl9zdGF0cz1pP25ldyBfZGlzcGxheV91dGlscy5TdGF0VGltZXI6bnVsbDt0aGlzLl9wZGZCdWc9aTt0aGlzLmNvbW1vbk9ianM9bi5jb21tb25PYmpzO3RoaXMub2Jqcz1uZXcgUERGT2JqZWN0czt0aGlzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlcj0hMTt0aGlzLl9pbnRlbnRTdGF0ZXM9bmV3IE1hcDt0aGlzLmRlc3Ryb3llZD0hMX1nZXQgcGFnZU51bWJlcigpe3JldHVybiB0aGlzLl9wYWdlSW5kZXgrMX1nZXQgcm90YXRlKCl7cmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJvdGF0ZX1nZXQgcmVmKCl7cmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJlZn1nZXQgdXNlclVuaXQoKXtyZXR1cm4gdGhpcy5fcGFnZUluZm8udXNlclVuaXR9Z2V0IHZpZXcoKXtyZXR1cm4gdGhpcy5fcGFnZUluZm8udmlld31nZXRWaWV3cG9ydCgpe2xldHtzY2FsZTp0LHJvdGF0aW9uOmU9dGhpcy5yb3RhdGUsb2Zmc2V0WDpuPTAsb2Zmc2V0WTppPTAsZG9udEZsaXA6cj0hMX09YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3JldHVybiBuZXcgX2Rpc3BsYXlfdXRpbHMuUGFnZVZpZXdwb3J0KHt2aWV3Qm94OnRoaXMudmlldyxzY2FsZTp0LHJvdGF0aW9uOmUsb2Zmc2V0WDpuLG9mZnNldFk6aSxkb250RmxpcDpyfSl9Z2V0QW5ub3RhdGlvbnMoKXtsZXR7aW50ZW50OnQ9ImRpc3BsYXkifT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e307Y29uc3QgZT10aGlzLl90cmFuc3BvcnQuZ2V0UmVuZGVyaW5nSW50ZW50KHQpO3JldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0QW5ub3RhdGlvbnModGhpcy5fcGFnZUluZGV4LGUucmVuZGVyaW5nSW50ZW50KX1nZXRKU0FjdGlvbnMoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VKU0FjdGlvbnModGhpcy5fcGFnZUluZGV4KX1nZXQgZmlsdGVyRmFjdG9yeSgpe3JldHVybiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeX1nZXQgaXNQdXJlWGZhKCl7cmV0dXJuKDAsX3V0aWwuc2hhZG93KSh0aGlzLCJpc1B1cmVYZmEiLCEhdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKX1hc3luYyBnZXRYZmEoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhPy5jaGlsZHJlblt0aGlzLl9wYWdlSW5kZXhdfHxudWxsfXJlbmRlcih0KXtsZXR7Y2FudmFzQ29udGV4dDplLHZpZXdwb3J0Om4saW50ZW50Omk9ImRpc3BsYXkiLGFubm90YXRpb25Nb2RlOnI9X3V0aWwuQW5ub3RhdGlvbk1vZGUuRU5BQkxFLHRyYW5zZm9ybTpzPW51bGwsYmFja2dyb3VuZDphPW51bGwsb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTpvPW51bGwsYW5ub3RhdGlvbkNhbnZhc01hcDpsPW51bGwscGFnZUNvbG9yczpjPW51bGwscHJpbnRBbm5vdGF0aW9uU3RvcmFnZTpoPW51bGx9PXQ7dGhpcy5fc3RhdHM/LnRpbWUoIk92ZXJhbGwiKTtjb25zdCBkPXRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaSxyLGgpO3RoaXMuI2k9ITE7dGhpcy4jcigpO298fChvPXRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSk7bGV0IHU9dGhpcy5faW50ZW50U3RhdGVzLmdldChkLmNhY2hlS2V5KTtpZighdSl7dT1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuX2ludGVudFN0YXRlcy5zZXQoZC5jYWNoZUtleSx1KX1pZih1LnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpe2NsZWFyVGltZW91dCh1LnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpO3Uuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dD1udWxsfWNvbnN0IHA9ISEoZC5yZW5kZXJpbmdJbnRlbnQmX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7aWYoIXUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSl7dS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5PW5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eTt1Lm9wZXJhdG9yTGlzdD17Zm5BcnJheTpbXSxhcmdzQXJyYXk6W10sbGFzdENodW5rOiExLHNlcGFyYXRlQW5ub3RzOm51bGx9O3RoaXMuX3N0YXRzPy50aW1lKCJQYWdlIFJlcXVlc3QiKTt0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGQpfWNvbnN0IGNvbXBsZXRlPXQ9Pnt1LnJlbmRlclRhc2tzLmRlbGV0ZShmKTsodGhpcy5fbWF5YmVDbGVhbnVwQWZ0ZXJSZW5kZXJ8fHApJiYodGhpcy4jaT0hMCk7dGhpcy4jcyghcCk7aWYodCl7Zi5jYXBhYmlsaXR5LnJlamVjdCh0KTt0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7aW50ZW50U3RhdGU6dSxyZWFzb246dCBpbnN0YW5jZW9mIEVycm9yP3Q6bmV3IEVycm9yKHQpfSl9ZWxzZSBmLmNhcGFiaWxpdHkucmVzb2x2ZSgpO3RoaXMuX3N0YXRzPy50aW1lRW5kKCJSZW5kZXJpbmciKTt0aGlzLl9zdGF0cz8udGltZUVuZCgiT3ZlcmFsbCIpfSxmPW5ldyBJbnRlcm5hbFJlbmRlclRhc2soe2NhbGxiYWNrOmNvbXBsZXRlLHBhcmFtczp7Y2FudmFzQ29udGV4dDplLHZpZXdwb3J0Om4sdHJhbnNmb3JtOnMsYmFja2dyb3VuZDphfSxvYmpzOnRoaXMub2Jqcyxjb21tb25PYmpzOnRoaXMuY29tbW9uT2Jqcyxhbm5vdGF0aW9uQ2FudmFzTWFwOmwsb3BlcmF0b3JMaXN0OnUub3BlcmF0b3JMaXN0LHBhZ2VJbmRleDp0aGlzLl9wYWdlSW5kZXgsY2FudmFzRmFjdG9yeTp0aGlzLl90cmFuc3BvcnQuY2FudmFzRmFjdG9yeSxmaWx0ZXJGYWN0b3J5OnRoaXMuX3RyYW5zcG9ydC5maWx0ZXJGYWN0b3J5LHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZTohcCxwZGZCdWc6dGhpcy5fcGRmQnVnLHBhZ2VDb2xvcnM6Y30pOyh1LnJlbmRlclRhc2tzfHw9bmV3IFNldCkuYWRkKGYpO2NvbnN0IGc9Zi50YXNrO1Byb21pc2UuYWxsKFt1LmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkucHJvbWlzZSxvXSkudGhlbigodD0+e2xldFtlLG5dPXQ7aWYodGhpcy5kZXN0cm95ZWQpY29tcGxldGUoKTtlbHNle3RoaXMuX3N0YXRzPy50aW1lKCJSZW5kZXJpbmciKTtmLmluaXRpYWxpemVHcmFwaGljcyh7dHJhbnNwYXJlbmN5OmUsb3B0aW9uYWxDb250ZW50Q29uZmlnOm59KTtmLm9wZXJhdG9yTGlzdENoYW5nZWQoKX19KSkuY2F0Y2goY29tcGxldGUpO3JldHVybiBnfWdldE9wZXJhdG9yTGlzdCgpe2xldHtpbnRlbnQ6dD0iZGlzcGxheSIsYW5ub3RhdGlvbk1vZGU6ZT1fdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEUscHJpbnRBbm5vdGF0aW9uU3RvcmFnZTpuPW51bGx9PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtjb25zdCBpPXRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQodCxlLG4sITApO2xldCByLHM9dGhpcy5faW50ZW50U3RhdGVzLmdldChpLmNhY2hlS2V5KTtpZighcyl7cz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuX2ludGVudFN0YXRlcy5zZXQoaS5jYWNoZUtleSxzKX1pZighcy5vcExpc3RSZWFkQ2FwYWJpbGl0eSl7cj1PYmplY3QuY3JlYXRlKG51bGwpO3Iub3BlcmF0b3JMaXN0Q2hhbmdlZD1mdW5jdGlvbiBvcGVyYXRvckxpc3RDaGFuZ2VkKCl7aWYocy5vcGVyYXRvckxpc3QubGFzdENodW5rKXtzLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlc29sdmUocy5vcGVyYXRvckxpc3QpO3MucmVuZGVyVGFza3MuZGVsZXRlKHIpfX07cy5vcExpc3RSZWFkQ2FwYWJpbGl0eT1uZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHk7KHMucmVuZGVyVGFza3N8fD1uZXcgU2V0KS5hZGQocik7cy5vcGVyYXRvckxpc3Q9e2ZuQXJyYXk6W10sYXJnc0FycmF5OltdLGxhc3RDaHVuazohMSxzZXBhcmF0ZUFubm90czpudWxsfTt0aGlzLl9zdGF0cz8udGltZSgiUGFnZSBSZXF1ZXN0Iik7dGhpcy5fcHVtcE9wZXJhdG9yTGlzdChpKX1yZXR1cm4gcy5vcExpc3RSZWFkQ2FwYWJpbGl0eS5wcm9taXNlfXN0cmVhbVRleHRDb250ZW50KCl7bGV0e2luY2x1ZGVNYXJrZWRDb250ZW50OnQ9ITEsZGlzYWJsZU5vcm1hbGl6YXRpb246ZT0hMX09YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3JldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFRleHRDb250ZW50Iix7cGFnZUluZGV4OnRoaXMuX3BhZ2VJbmRleCxpbmNsdWRlTWFya2VkQ29udGVudDohMD09PXQsZGlzYWJsZU5vcm1hbGl6YXRpb246ITA9PT1lfSx7aGlnaFdhdGVyTWFyazoxMDAsc2l6ZTp0PT50Lml0ZW1zLmxlbmd0aH0pfWdldFRleHRDb250ZW50KCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O2lmKHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSlyZXR1cm4gdGhpcy5nZXRYZmEoKS50aGVuKCh0PT5feGZhX3RleHQuWGZhVGV4dC50ZXh0Q29udGVudCh0KSkpO2NvbnN0IGU9dGhpcy5zdHJlYW1UZXh0Q29udGVudCh0KTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7Y29uc3QgaT1lLmdldFJlYWRlcigpLHI9e2l0ZW1zOltdLHN0eWxlczpPYmplY3QuY3JlYXRlKG51bGwpfTshZnVuY3Rpb24gcHVtcCgpe2kucmVhZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe2xldHt2YWx1ZTpuLGRvbmU6aX09ZTtpZihpKXQocik7ZWxzZXtPYmplY3QuYXNzaWduKHIuc3R5bGVzLG4uc3R5bGVzKTtyLml0ZW1zLnB1c2goLi4ubi5pdGVtcyk7cHVtcCgpfX0pLG4pfSgpfSkpfWdldFN0cnVjdFRyZWUoKXtyZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFN0cnVjdFRyZWUodGhpcy5fcGFnZUluZGV4KX1fZGVzdHJveSgpe3RoaXMuZGVzdHJveWVkPSEwO2NvbnN0IHQ9W107Zm9yKGNvbnN0IGUgb2YgdGhpcy5faW50ZW50U3RhdGVzLnZhbHVlcygpKXt0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7aW50ZW50U3RhdGU6ZSxyZWFzb246bmV3IEVycm9yKCJQYWdlIHdhcyBkZXN0cm95ZWQuIiksZm9yY2U6ITB9KTtpZighZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSlmb3IoY29uc3QgbiBvZiBlLnJlbmRlclRhc2tzKXt0LnB1c2gobi5jb21wbGV0ZWQpO24uY2FuY2VsKCl9fXRoaXMub2Jqcy5jbGVhcigpO3RoaXMuI2k9ITE7dGhpcy4jcigpO3JldHVybiBQcm9taXNlLmFsbCh0KX1jbGVhbnVwKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTt0aGlzLiNpPSEwO2NvbnN0IGU9dGhpcy4jcyghMSk7dCYmZSYmKHRoaXMuX3N0YXRzJiY9bmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcik7cmV0dXJuIGV9I3MoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO3RoaXMuI3IoKTtpZighdGhpcy4jaXx8dGhpcy5kZXN0cm95ZWQpcmV0dXJuITE7aWYodCl7dGhpcy4jbj1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuI249bnVsbDt0aGlzLiNzKCExKX0pLERFTEFZRURfQ0xFQU5VUF9USU1FT1VUKTtyZXR1cm4hMX1mb3IoY29uc3R7cmVuZGVyVGFza3M6dCxvcGVyYXRvckxpc3Q6ZX1vZiB0aGlzLl9pbnRlbnRTdGF0ZXMudmFsdWVzKCkpaWYodC5zaXplPjB8fCFlLmxhc3RDaHVuaylyZXR1cm4hMTt0aGlzLl9pbnRlbnRTdGF0ZXMuY2xlYXIoKTt0aGlzLm9ianMuY2xlYXIoKTt0aGlzLiNpPSExO3JldHVybiEwfSNyKCl7aWYodGhpcy4jbil7Y2xlYXJUaW1lb3V0KHRoaXMuI24pO3RoaXMuI249bnVsbH19X3N0YXJ0UmVuZGVyUGFnZSh0LGUpe2NvbnN0IG49dGhpcy5faW50ZW50U3RhdGVzLmdldChlKTtpZihuKXt0aGlzLl9zdGF0cz8udGltZUVuZCgiUGFnZSBSZXF1ZXN0Iik7bi5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5Py5yZXNvbHZlKHQpfX1fcmVuZGVyUGFnZUNodW5rKHQsZSl7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXtlLm9wZXJhdG9yTGlzdC5mbkFycmF5LnB1c2godC5mbkFycmF5W25dKTtlLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkucHVzaCh0LmFyZ3NBcnJheVtuXSl9ZS5vcGVyYXRvckxpc3QubGFzdENodW5rPXQubGFzdENodW5rO2Uub3BlcmF0b3JMaXN0LnNlcGFyYXRlQW5ub3RzPXQuc2VwYXJhdGVBbm5vdHM7Zm9yKGNvbnN0IHQgb2YgZS5yZW5kZXJUYXNrcyl0Lm9wZXJhdG9yTGlzdENoYW5nZWQoKTt0Lmxhc3RDaHVuayYmdGhpcy4jcyghMCl9X3B1bXBPcGVyYXRvckxpc3QodCl7bGV0e3JlbmRlcmluZ0ludGVudDplLGNhY2hlS2V5Om4sYW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGU6aX09dDtjb25zdHttYXA6cix0cmFuc2ZlcnM6c309aSxhPXRoaXMuX3RyYW5zcG9ydC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0T3BlcmF0b3JMaXN0Iix7cGFnZUluZGV4OnRoaXMuX3BhZ2VJbmRleCxpbnRlbnQ6ZSxjYWNoZUtleTpuLGFubm90YXRpb25TdG9yYWdlOnJ9LHMpLmdldFJlYWRlcigpLG89dGhpcy5faW50ZW50U3RhdGVzLmdldChuKTtvLnN0cmVhbVJlYWRlcj1hO2NvbnN0IHB1bXA9KCk9PnthLnJlYWQoKS50aGVuKCh0PT57bGV0e3ZhbHVlOmUsZG9uZTpufT10O2lmKG4pby5zdHJlYW1SZWFkZXI9bnVsbDtlbHNlIGlmKCF0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKXt0aGlzLl9yZW5kZXJQYWdlQ2h1bmsoZSxvKTtwdW1wKCl9fSksKHQ9PntvLnN0cmVhbVJlYWRlcj1udWxsO2lmKCF0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKXtpZihvLm9wZXJhdG9yTGlzdCl7by5vcGVyYXRvckxpc3QubGFzdENodW5rPSEwO2Zvcihjb25zdCB0IG9mIG8ucmVuZGVyVGFza3MpdC5vcGVyYXRvckxpc3RDaGFuZ2VkKCk7dGhpcy4jcyghMCl9aWYoby5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KW8uZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZWplY3QodCk7ZWxzZXtpZighby5vcExpc3RSZWFkQ2FwYWJpbGl0eSl0aHJvdyB0O28ub3BMaXN0UmVhZENhcGFiaWxpdHkucmVqZWN0KHQpfX19KSl9O3B1bXAoKX1fYWJvcnRPcGVyYXRvckxpc3QodCl7bGV0e2ludGVudFN0YXRlOmUscmVhc29uOm4sZm9yY2U6aT0hMX09dDtpZihlLnN0cmVhbVJlYWRlcil7aWYoZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KXtjbGVhclRpbWVvdXQoZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQ9bnVsbH1pZighaSl7aWYoZS5yZW5kZXJUYXNrcy5zaXplPjApcmV0dXJuO2lmKG4gaW5zdGFuY2VvZiBfZGlzcGxheV91dGlscy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pe2xldCB0PVJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVDtuLmV4dHJhRGVsYXk+MCYmbi5leHRyYURlbGF5PDFlMyYmKHQrPW4uZXh0cmFEZWxheSk7ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0PXNldFRpbWVvdXQoKCgpPT57ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0PW51bGw7dGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe2ludGVudFN0YXRlOmUscmVhc29uOm4sZm9yY2U6ITB9KX0pLHQpO3JldHVybn19ZS5zdHJlYW1SZWFkZXIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbihuLm1lc3NhZ2UpKS5jYXRjaCgoKCk9Pnt9KSk7ZS5zdHJlYW1SZWFkZXI9bnVsbDtpZighdGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCl7Zm9yKGNvbnN0W3Qsbl1vZiB0aGlzLl9pbnRlbnRTdGF0ZXMpaWYobj09PWUpe3RoaXMuX2ludGVudFN0YXRlcy5kZWxldGUodCk7YnJlYWt9dGhpcy5jbGVhbnVwKCl9fX1nZXQgc3RhdHMoKXtyZXR1cm4gdGhpcy5fc3RhdHN9fWV4cG9ydHMuUERGUGFnZVByb3h5PVBERlBhZ2VQcm94eTtjbGFzcyBMb29wYmFja1BvcnR7I2E9bmV3IFNldDsjbz1Qcm9taXNlLnJlc29sdmUoKTtwb3N0TWVzc2FnZSh0LGUpe2NvbnN0IG49e2RhdGE6c3RydWN0dXJlZENsb25lKHQsbnVsbCl9O3RoaXMuI28udGhlbigoKCk9Pntmb3IoY29uc3QgdCBvZiB0aGlzLiNhKXQuY2FsbCh0aGlzLG4pfSkpfWFkZEV2ZW50TGlzdGVuZXIodCxlKXt0aGlzLiNhLmFkZChlKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7dGhpcy4jYS5kZWxldGUoZSl9dGVybWluYXRlKCl7dGhpcy4jYS5jbGVhcigpfX1leHBvcnRzLkxvb3BiYWNrUG9ydD1Mb29wYmFja1BvcnQ7Y29uc3QgUERGV29ya2VyVXRpbD17aXNXb3JrZXJEaXNhYmxlZDohMSxmYWxsYmFja1dvcmtlclNyYzpudWxsLGZha2VXb3JrZXJJZDowfTtleHBvcnRzLlBERldvcmtlclV0aWw9UERGV29ya2VyVXRpbDtpZihfdXRpbC5pc05vZGVKUyYmImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUpe1BERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZD0hMDtQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjPSIuL3BkZi53b3JrZXIuanMifWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCl7Y29uc3QgdD1kb2N1bWVudD8uY3VycmVudFNjcmlwdD8uc3JjO3QmJihQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjPXQucmVwbGFjZSgvKFwuKD86bWluXC4pP2pzKShcPy4qKT8kL2ksIi53b3JrZXIkMSQyIikpfVBERldvcmtlclV0aWwuaXNTYW1lT3JpZ2luPWZ1bmN0aW9uKHQsZSl7bGV0IG47dHJ5e249bmV3IFVSTCh0KTtpZighbi5vcmlnaW58fCJudWxsIj09PW4ub3JpZ2luKXJldHVybiExfWNhdGNoe3JldHVybiExfWNvbnN0IGk9bmV3IFVSTChlLG4pO3JldHVybiBuLm9yaWdpbj09PWkub3JpZ2lufTtQREZXb3JrZXJVdGlsLmNyZWF0ZUNETldyYXBwZXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1gaW1wb3J0U2NyaXB0cygiJHt0fSIpO2A7cmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2VdKSl9O2NsYXNzIFBERldvcmtlcntzdGF0aWMjbD1uZXcgV2Vha01hcDtjb25zdHJ1Y3Rvcigpe2xldHtuYW1lOnQ9bnVsbCxwb3J0OmU9bnVsbCx2ZXJib3NpdHk6bj0oMCxfdXRpbC5nZXRWZXJib3NpdHlMZXZlbCkoKX09YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O2lmKGUmJlBERldvcmtlci4jbC5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdXNlIG1vcmUgdGhhbiBvbmUgUERGV29ya2VyIHBlciBwb3J0LiIpO3RoaXMubmFtZT10O3RoaXMuZGVzdHJveWVkPSExO3RoaXMudmVyYm9zaXR5PW47dGhpcy5fcmVhZHlDYXBhYmlsaXR5PW5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLl9wb3J0PW51bGw7dGhpcy5fd2ViV29ya2VyPW51bGw7dGhpcy5fbWVzc2FnZUhhbmRsZXI9bnVsbDtpZihlKXtQREZXb3JrZXIuI2wuc2V0KGUsdGhpcyk7dGhpcy5faW5pdGlhbGl6ZUZyb21Qb3J0KGUpfWVsc2UgdGhpcy5faW5pdGlhbGl6ZSgpfWdldCBwcm9taXNlKCl7cmV0dXJuIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlfWdldCBwb3J0KCl7cmV0dXJuIHRoaXMuX3BvcnR9Z2V0IG1lc3NhZ2VIYW5kbGVyKCl7cmV0dXJuIHRoaXMuX21lc3NhZ2VIYW5kbGVyfV9pbml0aWFsaXplRnJvbVBvcnQodCl7dGhpcy5fcG9ydD10O3RoaXMuX21lc3NhZ2VIYW5kbGVyPW5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKCJtYWluIiwid29ya2VyIix0KTt0aGlzLl9tZXNzYWdlSGFuZGxlci5vbigicmVhZHkiLChmdW5jdGlvbigpe30pKTt0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO3RoaXMuX21lc3NhZ2VIYW5kbGVyLnNlbmQoImNvbmZpZ3VyZSIse3ZlcmJvc2l0eTp0aGlzLnZlcmJvc2l0eX0pfV9pbml0aWFsaXplKCl7aWYoIVBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCYmIVBERldvcmtlci5fbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKXtsZXR7d29ya2VyU3JjOnR9PVBERldvcmtlcjt0cnl7UERGV29ya2VyVXRpbC5pc1NhbWVPcmlnaW4od2luZG93LmxvY2F0aW9uLmhyZWYsdCl8fCh0PVBERldvcmtlclV0aWwuY3JlYXRlQ0ROV3JhcHBlcihuZXcgVVJMKHQsd2luZG93LmxvY2F0aW9uKS5ocmVmKSk7Y29uc3QgZT1uZXcgV29ya2VyKHQpLG49bmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIm1haW4iLCJ3b3JrZXIiLGUpLHRlcm1pbmF0ZUVhcmx5PSgpPT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsb25Xb3JrZXJFcnJvcik7bi5kZXN0cm95KCk7ZS50ZXJtaW5hdGUoKTt0aGlzLmRlc3Ryb3llZD90aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQiKSk6dGhpcy5fc2V0dXBGYWtlV29ya2VyKCl9LG9uV29ya2VyRXJyb3I9KCk9Pnt0aGlzLl93ZWJXb3JrZXJ8fHRlcm1pbmF0ZUVhcmx5KCl9O2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG9uV29ya2VyRXJyb3IpO24ub24oInRlc3QiLCh0PT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsb25Xb3JrZXJFcnJvcik7aWYodGhpcy5kZXN0cm95ZWQpdGVybWluYXRlRWFybHkoKTtlbHNlIGlmKHQpe3RoaXMuX21lc3NhZ2VIYW5kbGVyPW47dGhpcy5fcG9ydD1lO3RoaXMuX3dlYldvcmtlcj1lO3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7bi5zZW5kKCJjb25maWd1cmUiLHt2ZXJib3NpdHk6dGhpcy52ZXJib3NpdHl9KX1lbHNle3RoaXMuX3NldHVwRmFrZVdvcmtlcigpO24uZGVzdHJveSgpO2UudGVybWluYXRlKCl9fSkpO24ub24oInJlYWR5IiwodD0+e2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG9uV29ya2VyRXJyb3IpO2lmKHRoaXMuZGVzdHJveWVkKXRlcm1pbmF0ZUVhcmx5KCk7ZWxzZSB0cnl7c2VuZFRlc3QoKX1jYXRjaHt0aGlzLl9zZXR1cEZha2VXb3JrZXIoKX19KSk7Y29uc3Qgc2VuZFRlc3Q9KCk9Pntjb25zdCB0PW5ldyBVaW50OEFycmF5O24uc2VuZCgidGVzdCIsdCxbdC5idWZmZXJdKX07c2VuZFRlc3QoKTtyZXR1cm59Y2F0Y2h7KDAsX3V0aWwuaW5mbykoIlRoZSB3b3JrZXIgaGFzIGJlZW4gZGlzYWJsZWQuIil9fXRoaXMuX3NldHVwRmFrZVdvcmtlcigpfV9zZXR1cEZha2VXb3JrZXIoKXtpZighUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkKXsoMCxfdXRpbC53YXJuKSgiU2V0dGluZyB1cCBmYWtlIHdvcmtlci4iKTtQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQ9ITB9UERGV29ya2VyLl9zZXR1cEZha2VXb3JrZXJHbG9iYWwudGhlbigodD0+e2lmKHRoaXMuZGVzdHJveWVkKXt0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQiKSk7cmV0dXJufWNvbnN0IGU9bmV3IExvb3BiYWNrUG9ydDt0aGlzLl9wb3J0PWU7Y29uc3Qgbj0iZmFrZSIrUERGV29ya2VyVXRpbC5mYWtlV29ya2VySWQrKyxpPW5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4rIl93b3JrZXIiLG4sZSk7dC5zZXR1cChpLGUpO2NvbnN0IHI9bmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIobixuKyJfd29ya2VyIixlKTt0aGlzLl9tZXNzYWdlSGFuZGxlcj1yO3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7ci5zZW5kKCJjb25maWd1cmUiLHt2ZXJib3NpdHk6dGhpcy52ZXJib3NpdHl9KX0pKS5jYXRjaCgodD0+e3RoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKGBTZXR0aW5nIHVwIGZha2Ugd29ya2VyIGZhaWxlZDogIiR7dC5tZXNzYWdlfSIuYCkpfSkpfWRlc3Ryb3koKXt0aGlzLmRlc3Ryb3llZD0hMDtpZih0aGlzLl93ZWJXb3JrZXIpe3RoaXMuX3dlYldvcmtlci50ZXJtaW5hdGUoKTt0aGlzLl93ZWJXb3JrZXI9bnVsbH1QREZXb3JrZXIuI2wuZGVsZXRlKHRoaXMuX3BvcnQpO3RoaXMuX3BvcnQ9bnVsbDtpZih0aGlzLl9tZXNzYWdlSGFuZGxlcil7dGhpcy5fbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO3RoaXMuX21lc3NhZ2VIYW5kbGVyPW51bGx9fXN0YXRpYyBmcm9tUG9ydCh0KXtpZighdD8ucG9ydCl0aHJvdyBuZXcgRXJyb3IoIlBERldvcmtlci5mcm9tUG9ydCAtIGludmFsaWQgbWV0aG9kIHNpZ25hdHVyZS4iKTtyZXR1cm4gdGhpcy4jbC5oYXModC5wb3J0KT90aGlzLiNsLmdldCh0LnBvcnQpOm5ldyBQREZXb3JrZXIodCl9c3RhdGljIGdldCB3b3JrZXJTcmMoKXtpZihfd29ya2VyX29wdGlvbnMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMpcmV0dXJuIF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYztpZihudWxsIT09UERGV29ya2VyVXRpbC5mYWxsYmFja1dvcmtlclNyYyl7X3V0aWwuaXNOb2RlSlN8fCgwLF9kaXNwbGF5X3V0aWxzLmRlcHJlY2F0ZWQpKCdObyAiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMiIHNwZWNpZmllZC4nKTtyZXR1cm4gUERGV29ya2VyVXRpbC5mYWxsYmFja1dvcmtlclNyY310aHJvdyBuZXcgRXJyb3IoJ05vICJHbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyIgc3BlY2lmaWVkLicpfXN0YXRpYyBnZXQgX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpe3RyeXtyZXR1cm4gZ2xvYmFsVGhpcy5wZGZqc1dvcmtlcj8uV29ya2VyTWVzc2FnZUhhbmRsZXJ8fG51bGx9Y2F0Y2h7cmV0dXJuIG51bGx9fXN0YXRpYyBnZXQgX3NldHVwRmFrZVdvcmtlckdsb2JhbCgpe2NvbnN0IGxvYWRlcj1hc3luYygpPT57Y29uc3QgbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyPXRoaXMuX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcjtpZihtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIpcmV0dXJuIG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtpZihfdXRpbC5pc05vZGVKUyYmImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUpe2NvbnN0IHdvcmtlcj1ldmFsKCJyZXF1aXJlIikodGhpcy53b3JrZXJTcmMpO3JldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXJ9YXdhaXQoMCxfZGlzcGxheV91dGlscy5sb2FkU2NyaXB0KSh0aGlzLndvcmtlclNyYyk7cmV0dXJuIHdpbmRvdy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcn07cmV0dXJuKDAsX3V0aWwuc2hhZG93KSh0aGlzLCJfc2V0dXBGYWtlV29ya2VyR2xvYmFsIixsb2FkZXIoKSl9fWV4cG9ydHMuUERGV29ya2VyPVBERldvcmtlcjtjbGFzcyBXb3JrZXJUcmFuc3BvcnR7I2M9bmV3IE1hcDsjaD1uZXcgTWFwOyNkPW5ldyBNYXA7I3U9bnVsbDtjb25zdHJ1Y3Rvcih0LGUsbixpLHIpe3RoaXMubWVzc2FnZUhhbmRsZXI9dDt0aGlzLmxvYWRpbmdUYXNrPWU7dGhpcy5jb21tb25PYmpzPW5ldyBQREZPYmplY3RzO3RoaXMuZm9udExvYWRlcj1uZXcgX2ZvbnRfbG9hZGVyLkZvbnRMb2FkZXIoe293bmVyRG9jdW1lbnQ6aS5vd25lckRvY3VtZW50LHN0eWxlRWxlbWVudDppLnN0eWxlRWxlbWVudH0pO3RoaXMuX3BhcmFtcz1pO3RoaXMuY2FudmFzRmFjdG9yeT1yLmNhbnZhc0ZhY3Rvcnk7dGhpcy5maWx0ZXJGYWN0b3J5PXIuZmlsdGVyRmFjdG9yeTt0aGlzLmNNYXBSZWFkZXJGYWN0b3J5PXIuY01hcFJlYWRlckZhY3Rvcnk7dGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeT1yLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5O3RoaXMuZGVzdHJveWVkPSExO3RoaXMuZGVzdHJveUNhcGFiaWxpdHk9bnVsbDt0aGlzLl9uZXR3b3JrU3RyZWFtPW47dGhpcy5fZnVsbFJlYWRlcj1udWxsO3RoaXMuX2xhc3RQcm9ncmVzcz1udWxsO3RoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eT1uZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVyKCl9I3AodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGw7Y29uc3Qgbj10aGlzLiNjLmdldCh0KTtpZihuKXJldHVybiBuO2NvbnN0IGk9dGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UodCxlKTt0aGlzLiNjLnNldCh0LGkpO3JldHVybiBpfWdldCBhbm5vdGF0aW9uU3RvcmFnZSgpe3JldHVybigwLF91dGlsLnNoYWRvdykodGhpcywiYW5ub3RhdGlvblN0b3JhZ2UiLG5ldyBfYW5ub3RhdGlvbl9zdG9yYWdlLkFubm90YXRpb25TdG9yYWdlKX1nZXRSZW5kZXJpbmdJbnRlbnQodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOl91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRSxuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXSxyPV91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSxzPV9hbm5vdGF0aW9uX3N0b3JhZ2UuU2VyaWFsaXphYmxlRW1wdHk7c3dpdGNoKHQpe2Nhc2UiYW55IjpyPV91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5ZO2JyZWFrO2Nhc2UiZGlzcGxheSI6YnJlYWs7Y2FzZSJwcmludCI6cj1fdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UO2JyZWFrO2RlZmF1bHQ6KDAsX3V0aWwud2FybikoYGdldFJlbmRlcmluZ0ludGVudCAtIGludmFsaWQgaW50ZW50OiAke3R9YCl9c3dpdGNoKGUpe2Nhc2UgX3V0aWwuQW5ub3RhdGlvbk1vZGUuRElTQUJMRTpyKz1fdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0RJU0FCTEU7YnJlYWs7Y2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEU6YnJlYWs7Y2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEVfRk9STVM6cis9X3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19GT1JNUzticmVhaztjYXNlIF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRV9TVE9SQUdFOnIrPV91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfU1RPUkFHRTtzPShyJl91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQmJm4gaW5zdGFuY2VvZiBfYW5ub3RhdGlvbl9zdG9yYWdlLlByaW50QW5ub3RhdGlvblN0b3JhZ2U/bjp0aGlzLmFubm90YXRpb25TdG9yYWdlKS5zZXJpYWxpemFibGU7YnJlYWs7ZGVmYXVsdDooMCxfdXRpbC53YXJuKShgZ2V0UmVuZGVyaW5nSW50ZW50IC0gaW52YWxpZCBhbm5vdGF0aW9uTW9kZTogJHtlfWApfWkmJihyKz1fdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLk9QTElTVCk7cmV0dXJue3JlbmRlcmluZ0ludGVudDpyLGNhY2hlS2V5OmAke3J9XyR7cy5oYXNofWAsYW5ub3RhdGlvblN0b3JhZ2VTZXJpYWxpemFibGU6c319ZGVzdHJveSgpe2lmKHRoaXMuZGVzdHJveUNhcGFiaWxpdHkpcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTt0aGlzLmRlc3Ryb3llZD0hMDt0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5PW5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLiN1Py5yZWplY3QobmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZCBkdXJpbmcgb25QYXNzd29yZCBjYWxsYmFjayIpKTtjb25zdCB0PVtdO2Zvcihjb25zdCBlIG9mIHRoaXMuI2gudmFsdWVzKCkpdC5wdXNoKGUuX2Rlc3Ryb3koKSk7dGhpcy4jaC5jbGVhcigpO3RoaXMuI2QuY2xlYXIoKTt0aGlzLmhhc093blByb3BlcnR5KCJhbm5vdGF0aW9uU3RvcmFnZSIpJiZ0aGlzLmFubm90YXRpb25TdG9yYWdlLnJlc2V0TW9kaWZpZWQoKTtjb25zdCBlPXRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJUZXJtaW5hdGUiLG51bGwpO3QucHVzaChlKTtQcm9taXNlLmFsbCh0KS50aGVuKCgoKT0+e3RoaXMuY29tbW9uT2Jqcy5jbGVhcigpO3RoaXMuZm9udExvYWRlci5jbGVhcigpO3RoaXMuI2MuY2xlYXIoKTt0aGlzLmZpbHRlckZhY3RvcnkuZGVzdHJveSgpO3RoaXMuX25ldHdvcmtTdHJlYW0mJnRoaXMuX25ldHdvcmtTdHJlYW0uY2FuY2VsQWxsUmVxdWVzdHMobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpO2lmKHRoaXMubWVzc2FnZUhhbmRsZXIpe3RoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO3RoaXMubWVzc2FnZUhhbmRsZXI9bnVsbH10aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlc29sdmUoKX0pLHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVqZWN0KTtyZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlfXNldHVwTWVzc2FnZUhhbmRsZXIoKXtjb25zdHttZXNzYWdlSGFuZGxlcjp0LGxvYWRpbmdUYXNrOmV9PXRoaXM7dC5vbigiR2V0UmVhZGVyIiwoKHQsZSk9PnsoMCxfdXRpbC5hc3NlcnQpKHRoaXMuX25ldHdvcmtTdHJlYW0sIkdldFJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuIik7dGhpcy5fZnVsbFJlYWRlcj10aGlzLl9uZXR3b3JrU3RyZWFtLmdldEZ1bGxSZWFkZXIoKTt0aGlzLl9mdWxsUmVhZGVyLm9uUHJvZ3Jlc3M9dD0+e3RoaXMuX2xhc3RQcm9ncmVzcz17bG9hZGVkOnQubG9hZGVkLHRvdGFsOnQudG90YWx9fTtlLm9uUHVsbD0oKT0+e3RoaXMuX2Z1bGxSZWFkZXIucmVhZCgpLnRoZW4oKGZ1bmN0aW9uKHQpe2xldHt2YWx1ZTpuLGRvbmU6aX09dDtpZihpKWUuY2xvc2UoKTtlbHNleygwLF91dGlsLmFzc2VydCkobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLCJHZXRSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci4iKTtlLmVucXVldWUobmV3IFVpbnQ4QXJyYXkobiksMSxbbl0pfX0pKS5jYXRjaCgodD0+e2UuZXJyb3IodCl9KSl9O2Uub25DYW5jZWw9dD0+e3RoaXMuX2Z1bGxSZWFkZXIuY2FuY2VsKHQpO2UucmVhZHkuY2F0Y2goKHQ9PntpZighdGhpcy5kZXN0cm95ZWQpdGhyb3cgdH0pKX19KSk7dC5vbigiUmVhZGVySGVhZGVyc1JlYWR5IiwodD0+e2NvbnN0IG49bmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5LGk9dGhpcy5fZnVsbFJlYWRlcjtpLmhlYWRlcnNSZWFkeS50aGVuKCgoKT0+e2lmKCFpLmlzU3RyZWFtaW5nU3VwcG9ydGVkfHwhaS5pc1JhbmdlU3VwcG9ydGVkKXt0aGlzLl9sYXN0UHJvZ3Jlc3MmJmUub25Qcm9ncmVzcz8uKHRoaXMuX2xhc3RQcm9ncmVzcyk7aS5vblByb2dyZXNzPXQ9PntlLm9uUHJvZ3Jlc3M/Lih7bG9hZGVkOnQubG9hZGVkLHRvdGFsOnQudG90YWx9KX19bi5yZXNvbHZlKHtpc1N0cmVhbWluZ1N1cHBvcnRlZDppLmlzU3RyZWFtaW5nU3VwcG9ydGVkLGlzUmFuZ2VTdXBwb3J0ZWQ6aS5pc1JhbmdlU3VwcG9ydGVkLGNvbnRlbnRMZW5ndGg6aS5jb250ZW50TGVuZ3RofSl9KSxuLnJlamVjdCk7cmV0dXJuIG4ucHJvbWlzZX0pKTt0Lm9uKCJHZXRSYW5nZVJlYWRlciIsKCh0LGUpPT57KDAsX3V0aWwuYXNzZXJ0KSh0aGlzLl9uZXR3b3JrU3RyZWFtLCJHZXRSYW5nZVJlYWRlciAtIG5vIGBJUERGU3RyZWFtYCBpbnN0YW5jZSBhdmFpbGFibGUuIik7Y29uc3Qgbj10aGlzLl9uZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKHQuYmVnaW4sdC5lbmQpO2lmKG4pe2Uub25QdWxsPSgpPT57bi5yZWFkKCkudGhlbigoZnVuY3Rpb24odCl7bGV0e3ZhbHVlOm4sZG9uZTppfT10O2lmKGkpZS5jbG9zZSgpO2Vsc2V7KDAsX3V0aWwuYXNzZXJ0KShuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsIkdldFJhbmdlUmVhZGVyIC0gZXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuIik7ZS5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KG4pLDEsW25dKX19KSkuY2F0Y2goKHQ9PntlLmVycm9yKHQpfSkpfTtlLm9uQ2FuY2VsPXQ9PntuLmNhbmNlbCh0KTtlLnJlYWR5LmNhdGNoKCh0PT57aWYoIXRoaXMuZGVzdHJveWVkKXRocm93IHR9KSl9fWVsc2UgZS5jbG9zZSgpfSkpO3Qub24oIkdldERvYyIsKHQ9PntsZXR7cGRmSW5mbzpufT10O3RoaXMuX251bVBhZ2VzPW4ubnVtUGFnZXM7dGhpcy5faHRtbEZvclhmYT1uLmh0bWxGb3JYZmE7ZGVsZXRlIG4uaHRtbEZvclhmYTtlLl9jYXBhYmlsaXR5LnJlc29sdmUobmV3IFBERkRvY3VtZW50UHJveHkobix0aGlzKSl9KSk7dC5vbigiRG9jRXhjZXB0aW9uIiwoZnVuY3Rpb24odCl7bGV0IG47c3dpdGNoKHQubmFtZSl7Y2FzZSJQYXNzd29yZEV4Y2VwdGlvbiI6bj1uZXcgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24odC5tZXNzYWdlLHQuY29kZSk7YnJlYWs7Y2FzZSJJbnZhbGlkUERGRXhjZXB0aW9uIjpuPW5ldyBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7YnJlYWs7Y2FzZSJNaXNzaW5nUERGRXhjZXB0aW9uIjpuPW5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7YnJlYWs7Y2FzZSJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24iOm49bmV3IF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbih0Lm1lc3NhZ2UsdC5zdGF0dXMpO2JyZWFrO2Nhc2UiVW5rbm93bkVycm9yRXhjZXB0aW9uIjpuPW5ldyBfdXRpbC5Vbmtub3duRXJyb3JFeGNlcHRpb24odC5tZXNzYWdlLHQuZGV0YWlscyk7YnJlYWs7ZGVmYXVsdDooMCxfdXRpbC51bnJlYWNoYWJsZSkoIkRvY0V4Y2VwdGlvbiAtIGV4cGVjdGVkIGEgdmFsaWQgRXJyb3IuIil9ZS5fY2FwYWJpbGl0eS5yZWplY3Qobil9KSk7dC5vbigiUGFzc3dvcmRSZXF1ZXN0IiwodD0+e3RoaXMuI3U9bmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5O2lmKGUub25QYXNzd29yZCl7Y29uc3QgdXBkYXRlUGFzc3dvcmQ9dD0+e3QgaW5zdGFuY2VvZiBFcnJvcj90aGlzLiN1LnJlamVjdCh0KTp0aGlzLiN1LnJlc29sdmUoe3Bhc3N3b3JkOnR9KX07dHJ5e2Uub25QYXNzd29yZCh1cGRhdGVQYXNzd29yZCx0LmNvZGUpfWNhdGNoKHQpe3RoaXMuI3UucmVqZWN0KHQpfX1lbHNlIHRoaXMuI3UucmVqZWN0KG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbih0Lm1lc3NhZ2UsdC5jb2RlKSk7cmV0dXJuIHRoaXMuI3UucHJvbWlzZX0pKTt0Lm9uKCJEYXRhTG9hZGVkIiwodD0+e2Uub25Qcm9ncmVzcz8uKHtsb2FkZWQ6dC5sZW5ndGgsdG90YWw6dC5sZW5ndGh9KTt0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucmVzb2x2ZSh0KX0pKTt0Lm9uKCJTdGFydFJlbmRlclBhZ2UiLCh0PT57aWYodGhpcy5kZXN0cm95ZWQpcmV0dXJuO3RoaXMuI2guZ2V0KHQucGFnZUluZGV4KS5fc3RhcnRSZW5kZXJQYWdlKHQudHJhbnNwYXJlbmN5LHQuY2FjaGVLZXkpfSkpO3Qub24oImNvbW1vbm9iaiIsKGU9PntsZXRbbixpLHJdPWU7aWYoIXRoaXMuZGVzdHJveWVkJiYhdGhpcy5jb21tb25PYmpzLmhhcyhuKSlzd2l0Y2goaSl7Y2FzZSJGb250Ijpjb25zdCBlPXRoaXMuX3BhcmFtcztpZigiZXJyb3IiaW4gcil7Y29uc3QgdD1yLmVycm9yOygwLF91dGlsLndhcm4pKGBFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiAke3R9YCk7dGhpcy5jb21tb25PYmpzLnJlc29sdmUobix0KTticmVha31jb25zdCBzPWUucGRmQnVnJiZnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3I/LmVuYWJsZWQ/KHQsZSk9Pmdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQodCxlKTpudWxsLGE9bmV3IF9mb250X2xvYWRlci5Gb250RmFjZU9iamVjdChyLHtpc0V2YWxTdXBwb3J0ZWQ6ZS5pc0V2YWxTdXBwb3J0ZWQsZGlzYWJsZUZvbnRGYWNlOmUuZGlzYWJsZUZvbnRGYWNlLGlnbm9yZUVycm9yczplLmlnbm9yZUVycm9ycyxpbnNwZWN0Rm9udDpzfSk7dGhpcy5mb250TG9hZGVyLmJpbmQoYSkuY2F0Y2goKGU9PnQuc2VuZFdpdGhQcm9taXNlKCJGb250RmFsbGJhY2siLHtpZDpufSkpKS5maW5hbGx5KCgoKT0+eyFlLmZvbnRFeHRyYVByb3BlcnRpZXMmJmEuZGF0YSYmKGEuZGF0YT1udWxsKTt0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShuLGEpfSkpO2JyZWFrO2Nhc2UiRm9udFBhdGgiOmNhc2UiSW1hZ2UiOmNhc2UiUGF0dGVybiI6dGhpcy5jb21tb25PYmpzLnJlc29sdmUobixyKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgR290IHVua25vd24gY29tbW9uIG9iamVjdCB0eXBlICR7aX1gKX19KSk7dC5vbigib2JqIiwodD0+e2xldFtlLG4saSxyXT10O2lmKHRoaXMuZGVzdHJveWVkKXJldHVybjtjb25zdCBzPXRoaXMuI2guZ2V0KG4pO2lmKCFzLm9ianMuaGFzKGUpKXN3aXRjaChpKXtjYXNlIkltYWdlIjpzLm9ianMucmVzb2x2ZShlLHIpO2lmKHIpe2xldCB0O2lmKHIuYml0bWFwKXtjb25zdHt3aWR0aDplLGhlaWdodDpufT1yO3Q9ZSpuKjR9ZWxzZSB0PXIuZGF0YT8ubGVuZ3RofHwwO3Q+X3V0aWwuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUmJihzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlcj0hMCl9YnJlYWs7Y2FzZSJQYXR0ZXJuIjpzLm9ianMucmVzb2x2ZShlLHIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBHb3QgdW5rbm93biBvYmplY3QgdHlwZSAke2l9YCl9fSkpO3Qub24oIkRvY1Byb2dyZXNzIiwodD0+e3RoaXMuZGVzdHJveWVkfHxlLm9uUHJvZ3Jlc3M/Lih7bG9hZGVkOnQubG9hZGVkLHRvdGFsOnQudG90YWx9KX0pKTt0Lm9uKCJGZXRjaEJ1aWx0SW5DTWFwIiwodD0+dGhpcy5kZXN0cm95ZWQ/UHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJXb3JrZXIgd2FzIGRlc3Ryb3llZC4iKSk6dGhpcy5jTWFwUmVhZGVyRmFjdG9yeT90aGlzLmNNYXBSZWFkZXJGYWN0b3J5LmZldGNoKHQpOlByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiQ01hcFJlYWRlckZhY3Rvcnkgbm90IGluaXRpYWxpemVkLCBzZWUgdGhlIGB1c2VXb3JrZXJGZXRjaGAgcGFyYW1ldGVyLiIpKSkpO3Qub24oIkZldGNoU3RhbmRhcmRGb250RGF0YSIsKHQ9PnRoaXMuZGVzdHJveWVkP1Byb21pc2UucmVqZWN0KG5ldyBFcnJvcigiV29ya2VyIHdhcyBkZXN0cm95ZWQuIikpOnRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3Rvcnk/dGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeS5mZXRjaCh0KTpQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIlN0YW5kYXJkRm9udERhdGFGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci4iKSkpKX1nZXREYXRhKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXREYXRhIixudWxsKX1zYXZlRG9jdW1lbnQoKXt0aGlzLmFubm90YXRpb25TdG9yYWdlLnNpemU8PTAmJigwLF91dGlsLndhcm4pKCJzYXZlRG9jdW1lbnQgY2FsbGVkIHdoaWxlIGBhbm5vdGF0aW9uU3RvcmFnZWAgaXMgZW1wdHksIHBsZWFzZSB1c2UgdGhlIGdldERhdGEtbWV0aG9kIGluc3RlYWQuIik7Y29uc3R7bWFwOnQsdHJhbnNmZXJzOmV9PXRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2VyaWFsaXphYmxlO3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiU2F2ZURvY3VtZW50Iix7aXNQdXJlWGZhOiEhdGhpcy5faHRtbEZvclhmYSxudW1QYWdlczp0aGlzLl9udW1QYWdlcyxhbm5vdGF0aW9uU3RvcmFnZTp0LGZpbGVuYW1lOnRoaXMuX2Z1bGxSZWFkZXI/LmZpbGVuYW1lPz9udWxsfSxlKS5maW5hbGx5KCgoKT0+e3RoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpfSkpfWdldFBhZ2UodCl7aWYoIU51bWJlci5pc0ludGVnZXIodCl8fHQ8PTB8fHQ+dGhpcy5fbnVtUGFnZXMpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiSW52YWxpZCBwYWdlIHJlcXVlc3QuIikpO2NvbnN0IGU9dC0xLG49dGhpcy4jZC5nZXQoZSk7aWYobilyZXR1cm4gbjtjb25zdCBpPXRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlIix7cGFnZUluZGV4OmV9KS50aGVuKCh0PT57aWYodGhpcy5kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJUcmFuc3BvcnQgZGVzdHJveWVkIik7Y29uc3Qgbj1uZXcgUERGUGFnZVByb3h5KGUsdCx0aGlzLHRoaXMuX3BhcmFtcy5wZGZCdWcpO3RoaXMuI2guc2V0KGUsbik7cmV0dXJuIG59KSk7dGhpcy4jZC5zZXQoZSxpKTtyZXR1cm4gaX1nZXRQYWdlSW5kZXgodCl7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiB0fHxudWxsPT09dHx8IU51bWJlci5pc0ludGVnZXIodC5udW0pfHx0Lm51bTwwfHwhTnVtYmVyLmlzSW50ZWdlcih0Lmdlbil8fHQuZ2VuPDA/UHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJJbnZhbGlkIHBhZ2VJbmRleCByZXF1ZXN0LiIpKTp0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGFnZUluZGV4Iix7bnVtOnQubnVtLGdlbjp0Lmdlbn0pfWdldEFubm90YXRpb25zKHQsZSl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRBbm5vdGF0aW9ucyIse3BhZ2VJbmRleDp0LGludGVudDplfSl9Z2V0RmllbGRPYmplY3RzKCl7cmV0dXJuIHRoaXMuI3AoIkdldEZpZWxkT2JqZWN0cyIpfWhhc0pTQWN0aW9ucygpe3JldHVybiB0aGlzLiNwKCJIYXNKU0FjdGlvbnMiKX1nZXRDYWxjdWxhdGlvbk9yZGVySWRzKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRDYWxjdWxhdGlvbk9yZGVySWRzIixudWxsKX1nZXREZXN0aW5hdGlvbnMoKXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldERlc3RpbmF0aW9ucyIsbnVsbCl9Z2V0RGVzdGluYXRpb24odCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0P1Byb21pc2UucmVqZWN0KG5ldyBFcnJvcigiSW52YWxpZCBkZXN0aW5hdGlvbiByZXF1ZXN0LiIpKTp0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0RGVzdGluYXRpb24iLHtpZDp0fSl9Z2V0UGFnZUxhYmVscygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGFnZUxhYmVscyIsbnVsbCl9Z2V0UGFnZUxheW91dCgpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0UGFnZUxheW91dCIsbnVsbCl9Z2V0UGFnZU1vZGUoKXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBhZ2VNb2RlIixudWxsKX1nZXRWaWV3ZXJQcmVmZXJlbmNlcygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0Vmlld2VyUHJlZmVyZW5jZXMiLG51bGwpfWdldE9wZW5BY3Rpb24oKXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldE9wZW5BY3Rpb24iLG51bGwpfWdldEF0dGFjaG1lbnRzKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRBdHRhY2htZW50cyIsbnVsbCl9Z2V0SmF2YVNjcmlwdCgpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0SmF2YVNjcmlwdCIsbnVsbCl9Z2V0RG9jSlNBY3Rpb25zKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXREb2NKU0FjdGlvbnMiLG51bGwpfWdldFBhZ2VKU0FjdGlvbnModCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRQYWdlSlNBY3Rpb25zIix7cGFnZUluZGV4OnR9KX1nZXRTdHJ1Y3RUcmVlKHQpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0U3RydWN0VHJlZSIse3BhZ2VJbmRleDp0fSl9Z2V0T3V0bGluZSgpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0T3V0bGluZSIsbnVsbCl9Z2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCl7cmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJHZXRPcHRpb25hbENvbnRlbnRDb25maWciLG51bGwpLnRoZW4oKHQ9Pm5ldyBfb3B0aW9uYWxfY29udGVudF9jb25maWcuT3B0aW9uYWxDb250ZW50Q29uZmlnKHQpKSl9Z2V0UGVybWlzc2lvbnMoKXtyZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkdldFBlcm1pc3Npb25zIixudWxsKX1nZXRNZXRhZGF0YSgpe2NvbnN0IHQ9IkdldE1ldGFkYXRhIixlPXRoaXMuI2MuZ2V0KHQpO2lmKGUpcmV0dXJuIGU7Y29uc3Qgbj10aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSh0LG51bGwpLnRoZW4oKHQ9Pih7aW5mbzp0WzBdLG1ldGFkYXRhOnRbMV0/bmV3IF9tZXRhZGF0YS5NZXRhZGF0YSh0WzFdKTpudWxsLGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOnRoaXMuX2Z1bGxSZWFkZXI/LmZpbGVuYW1lPz9udWxsLGNvbnRlbnRMZW5ndGg6dGhpcy5fZnVsbFJlYWRlcj8uY29udGVudExlbmd0aD8/bnVsbH0pKSk7dGhpcy4jYy5zZXQodCxuKTtyZXR1cm4gbn1nZXRNYXJrSW5mbygpe3JldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiR2V0TWFya0luZm8iLG51bGwpfWFzeW5jIHN0YXJ0Q2xlYW51cCgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07aWYoIXRoaXMuZGVzdHJveWVkKXthd2FpdCB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiQ2xlYW51cCIsbnVsbCk7Zm9yKGNvbnN0IHQgb2YgdGhpcy4jaC52YWx1ZXMoKSl7aWYoIXQuY2xlYW51cCgpKXRocm93IG5ldyBFcnJvcihgc3RhcnRDbGVhbnVwOiBQYWdlICR7dC5wYWdlTnVtYmVyfSBpcyBjdXJyZW50bHkgcmVuZGVyaW5nLmApfXRoaXMuY29tbW9uT2Jqcy5jbGVhcigpO3R8fHRoaXMuZm9udExvYWRlci5jbGVhcigpO3RoaXMuI2MuY2xlYXIoKTt0aGlzLmZpbHRlckZhY3RvcnkuZGVzdHJveSghMCl9fWdldCBsb2FkaW5nUGFyYW1zKCl7Y29uc3R7ZGlzYWJsZUF1dG9GZXRjaDp0LGVuYWJsZVhmYTplfT10aGlzLl9wYXJhbXM7cmV0dXJuKDAsX3V0aWwuc2hhZG93KSh0aGlzLCJsb2FkaW5nUGFyYW1zIix7ZGlzYWJsZUF1dG9GZXRjaDp0LGVuYWJsZVhmYTplfSl9fWNsYXNzIFBERk9iamVjdHN7I2Y9T2JqZWN0LmNyZWF0ZShudWxsKTsjZyh0KXtjb25zdCBlPXRoaXMuI2ZbdF07cmV0dXJuIGV8fCh0aGlzLiNmW3RdPXtjYXBhYmlsaXR5Om5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSxkYXRhOm51bGx9KX1nZXQodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGw7aWYoZSl7Y29uc3Qgbj10aGlzLiNnKHQpO24uY2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCgpPT5lKG4uZGF0YSkpKTtyZXR1cm4gbnVsbH1jb25zdCBuPXRoaXMuI2ZbdF07aWYoIW4/LmNhcGFiaWxpdHkuc2V0dGxlZCl0aHJvdyBuZXcgRXJyb3IoYFJlcXVlc3Rpbmcgb2JqZWN0IHRoYXQgaXNuJ3QgcmVzb2x2ZWQgeWV0ICR7dH0uYCk7cmV0dXJuIG4uZGF0YX1oYXModCl7Y29uc3QgZT10aGlzLiNmW3RdO3JldHVybiBlPy5jYXBhYmlsaXR5LnNldHRsZWR8fCExfXJlc29sdmUodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGw7Y29uc3Qgbj10aGlzLiNnKHQpO24uZGF0YT1lO24uY2FwYWJpbGl0eS5yZXNvbHZlKCl9Y2xlYXIoKXtmb3IoY29uc3QgdCBpbiB0aGlzLiNmKXtjb25zdHtkYXRhOmV9PXRoaXMuI2ZbdF07ZT8uYml0bWFwPy5jbG9zZSgpfXRoaXMuI2Y9T2JqZWN0LmNyZWF0ZShudWxsKX19Y2xhc3MgUmVuZGVyVGFza3sjbT1udWxsO2NvbnN0cnVjdG9yKHQpe3RoaXMuI209dDt0aGlzLm9uQ29udGludWU9bnVsbH1nZXQgcHJvbWlzZSgpe3JldHVybiB0aGlzLiNtLmNhcGFiaWxpdHkucHJvbWlzZX1jYW5jZWwoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MDt0aGlzLiNtLmNhbmNlbChudWxsLHQpfWdldCBzZXBhcmF0ZUFubm90cygpe2NvbnN0e3NlcGFyYXRlQW5ub3RzOnR9PXRoaXMuI20ub3BlcmF0b3JMaXN0O2lmKCF0KXJldHVybiExO2NvbnN0e2Fubm90YXRpb25DYW52YXNNYXA6ZX09dGhpcy4jbTtyZXR1cm4gdC5mb3JtfHx0LmNhbnZhcyYmZT8uc2l6ZT4wfX1leHBvcnRzLlJlbmRlclRhc2s9UmVuZGVyVGFzaztjbGFzcyBJbnRlcm5hbFJlbmRlclRhc2t7c3RhdGljI2I9bmV3IFdlYWtTZXQ7Y29uc3RydWN0b3IodCl7bGV0e2NhbGxiYWNrOmUscGFyYW1zOm4sb2JqczppLGNvbW1vbk9ianM6cixhbm5vdGF0aW9uQ2FudmFzTWFwOnMsb3BlcmF0b3JMaXN0OmEscGFnZUluZGV4Om8sY2FudmFzRmFjdG9yeTpsLGZpbHRlckZhY3Rvcnk6Yyx1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWU6aD0hMSxwZGZCdWc6ZD0hMSxwYWdlQ29sb3JzOnU9bnVsbH09dDt0aGlzLmNhbGxiYWNrPWU7dGhpcy5wYXJhbXM9bjt0aGlzLm9ianM9aTt0aGlzLmNvbW1vbk9ianM9cjt0aGlzLmFubm90YXRpb25DYW52YXNNYXA9czt0aGlzLm9wZXJhdG9yTGlzdElkeD1udWxsO3RoaXMub3BlcmF0b3JMaXN0PWE7dGhpcy5fcGFnZUluZGV4PW87dGhpcy5jYW52YXNGYWN0b3J5PWw7dGhpcy5maWx0ZXJGYWN0b3J5PWM7dGhpcy5fcGRmQnVnPWQ7dGhpcy5wYWdlQ29sb3JzPXU7dGhpcy5ydW5uaW5nPSExO3RoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrPW51bGw7dGhpcy5ncmFwaGljc1JlYWR5PSExO3RoaXMuX3VzZVJlcXVlc3RBbmltYXRpb25GcmFtZT0hMD09PWgmJiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93O3RoaXMuY2FuY2VsbGVkPSExO3RoaXMuY2FwYWJpbGl0eT1uZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy50YXNrPW5ldyBSZW5kZXJUYXNrKHRoaXMpO3RoaXMuX2NhbmNlbEJvdW5kPXRoaXMuY2FuY2VsLmJpbmQodGhpcyk7dGhpcy5fY29udGludWVCb3VuZD10aGlzLl9jb250aW51ZS5iaW5kKHRoaXMpO3RoaXMuX3NjaGVkdWxlTmV4dEJvdW5kPXRoaXMuX3NjaGVkdWxlTmV4dC5iaW5kKHRoaXMpO3RoaXMuX25leHRCb3VuZD10aGlzLl9uZXh0LmJpbmQodGhpcyk7dGhpcy5fY2FudmFzPW4uY2FudmFzQ29udGV4dC5jYW52YXN9Z2V0IGNvbXBsZXRlZCgpe3JldHVybiB0aGlzLmNhcGFiaWxpdHkucHJvbWlzZS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9aW5pdGlhbGl6ZUdyYXBoaWNzKHQpe2xldHt0cmFuc3BhcmVuY3k6ZT0hMSxvcHRpb25hbENvbnRlbnRDb25maWc6bn09dDtpZih0aGlzLmNhbmNlbGxlZClyZXR1cm47aWYodGhpcy5fY2FudmFzKXtpZihJbnRlcm5hbFJlbmRlclRhc2suI2IuaGFzKHRoaXMuX2NhbnZhcykpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdXNlIHRoZSBzYW1lIGNhbnZhcyBkdXJpbmcgbXVsdGlwbGUgcmVuZGVyKCkgb3BlcmF0aW9ucy4gVXNlIGRpZmZlcmVudCBjYW52YXMgb3IgZW5zdXJlIHByZXZpb3VzIG9wZXJhdGlvbnMgd2VyZSBjYW5jZWxsZWQgb3IgY29tcGxldGVkLiIpO0ludGVybmFsUmVuZGVyVGFzay4jYi5hZGQodGhpcy5fY2FudmFzKX1pZih0aGlzLl9wZGZCdWcmJmdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXI/LmVuYWJsZWQpe3RoaXMuc3RlcHBlcj1nbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyLmNyZWF0ZSh0aGlzLl9wYWdlSW5kZXgpO3RoaXMuc3RlcHBlci5pbml0KHRoaXMub3BlcmF0b3JMaXN0KTt0aGlzLnN0ZXBwZXIubmV4dEJyZWFrUG9pbnQ9dGhpcy5zdGVwcGVyLmdldE5leHRCcmVha1BvaW50KCl9Y29uc3R7Y2FudmFzQ29udGV4dDppLHZpZXdwb3J0OnIsdHJhbnNmb3JtOnMsYmFja2dyb3VuZDphfT10aGlzLnBhcmFtczt0aGlzLmdmeD1uZXcgX2NhbnZhcy5DYW52YXNHcmFwaGljcyhpLHRoaXMuY29tbW9uT2Jqcyx0aGlzLm9ianMsdGhpcy5jYW52YXNGYWN0b3J5LHRoaXMuZmlsdGVyRmFjdG9yeSx7b3B0aW9uYWxDb250ZW50Q29uZmlnOm59LHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCx0aGlzLnBhZ2VDb2xvcnMpO3RoaXMuZ2Z4LmJlZ2luRHJhd2luZyh7dHJhbnNmb3JtOnMsdmlld3BvcnQ6cix0cmFuc3BhcmVuY3k6ZSxiYWNrZ3JvdW5kOmF9KTt0aGlzLm9wZXJhdG9yTGlzdElkeD0wO3RoaXMuZ3JhcGhpY3NSZWFkeT0hMDt0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaz8uKCl9Y2FuY2VsKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGwsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDt0aGlzLnJ1bm5pbmc9ITE7dGhpcy5jYW5jZWxsZWQ9ITA7dGhpcy5nZng/LmVuZERyYXdpbmcoKTt0aGlzLl9jYW52YXMmJkludGVybmFsUmVuZGVyVGFzay4jYi5kZWxldGUodGhpcy5fY2FudmFzKTt0aGlzLmNhbGxiYWNrKHR8fG5ldyBfZGlzcGxheV91dGlscy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24oYFJlbmRlcmluZyBjYW5jZWxsZWQsIHBhZ2UgJHt0aGlzLl9wYWdlSW5kZXgrMX1gLGUpKX1vcGVyYXRvckxpc3RDaGFuZ2VkKCl7aWYodGhpcy5ncmFwaGljc1JlYWR5KXt0aGlzLnN0ZXBwZXI/LnVwZGF0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCk7dGhpcy5ydW5uaW5nfHx0aGlzLl9jb250aW51ZSgpfWVsc2UgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2t8fD10aGlzLl9jb250aW51ZUJvdW5kfV9jb250aW51ZSgpe3RoaXMucnVubmluZz0hMDt0aGlzLmNhbmNlbGxlZHx8KHRoaXMudGFzay5vbkNvbnRpbnVlP3RoaXMudGFzay5vbkNvbnRpbnVlKHRoaXMuX3NjaGVkdWxlTmV4dEJvdW5kKTp0aGlzLl9zY2hlZHVsZU5leHQoKSl9X3NjaGVkdWxlTmV4dCgpe3RoaXMuX3VzZVJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuX25leHRCb3VuZCgpLmNhdGNoKHRoaXMuX2NhbmNlbEJvdW5kKX0pKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMuX25leHRCb3VuZCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpfWFzeW5jIF9uZXh0KCl7aWYoIXRoaXMuY2FuY2VsbGVkKXt0aGlzLm9wZXJhdG9yTGlzdElkeD10aGlzLmdmeC5leGVjdXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0LHRoaXMub3BlcmF0b3JMaXN0SWR4LHRoaXMuX2NvbnRpbnVlQm91bmQsdGhpcy5zdGVwcGVyKTtpZih0aGlzLm9wZXJhdG9yTGlzdElkeD09PXRoaXMub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5sZW5ndGgpe3RoaXMucnVubmluZz0hMTtpZih0aGlzLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspe3RoaXMuZ2Z4LmVuZERyYXdpbmcodGhpcy5wYWdlQ29sb3JzKTt0aGlzLl9jYW52YXMmJkludGVybmFsUmVuZGVyVGFzay4jYi5kZWxldGUodGhpcy5fY2FudmFzKTt0aGlzLmNhbGxiYWNrKCl9fX19fWNvbnN0IHZlcnNpb249IjMuOS4xNzkiO2V4cG9ydHMudmVyc2lvbj12ZXJzaW9uO2NvbnN0IGJ1aWxkPSIxZWY2ZmJjNTIiO2V4cG9ydHMuYnVpbGQ9YnVpbGR9LCh0LGUsbik9Pnt2YXIgaT1uKDMpLHI9bigxMjYpO2koe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohbigxMzQpKCJkaWZmZXJlbmNlIil9LHtkaWZmZXJlbmNlOnJ9KX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDEyNykscj1uKDEyOCkscz1uKDEyOSksYT1uKDEzMiksbz1uKDEzMyksbD1uKDEzMCksYz1uKDEzMSksaD1yLmhhcyxkPXIucmVtb3ZlO3QuZXhwb3J0cz1mdW5jdGlvbiBkaWZmZXJlbmNlKHQpe3ZhciBlPWkodGhpcyksbj1vKHQpLHI9cyhlKTthKGUpPD1uLnNpemU/bChlLChmdW5jdGlvbih0KXtuLmluY2x1ZGVzKHQpJiZkKHIsdCl9KSk6YyhuLmdldEl0ZXJhdG9yKCksKGZ1bmN0aW9uKHQpe2goZSx0KSYmZChyLHQpfSkpO3JldHVybiByfX0sKHQsZSxuKT0+e3ZhciBpPW4oMTI4KS5oYXM7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2kodCk7cmV0dXJuIHR9fSwodCxlLG4pPT57dmFyIGk9bigxNCkscj1TZXQucHJvdG90eXBlO3QuZXhwb3J0cz17U2V0OlNldCxhZGQ6aShyLmFkZCksaGFzOmkoci5oYXMpLHJlbW92ZTppKHIuZGVsZXRlKSxwcm90bzpyfX0sKHQsZSxuKT0+e3ZhciBpPW4oMTI4KSxyPW4oMTMwKSxzPWkuU2V0LGE9aS5hZGQ7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBzO3IodCwoZnVuY3Rpb24odCl7YShlLHQpfSkpO3JldHVybiBlfX0sKHQsZSxuKT0+e3ZhciBpPW4oMTQpLHI9bigxMzEpLHM9bigxMjgpLGE9cy5TZXQsbz1zLnByb3RvLGw9aShvLmZvckVhY2gpLGM9aShvLmtleXMpLGg9YyhuZXcgYSkubmV4dDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuP3IoYyh0KSxlLGgpOmwodCxlKX19LCh0LGUsbik9Pnt2YXIgaT1uKDgpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLHMsYT1ufHx0Lm5leHQ7IShyPWkoYSx0KSkuZG9uZTspaWYodm9pZCAwIT09KHM9ZShyLnZhbHVlKSkpcmV0dXJuIHN9fSwodCxlLG4pPT57dmFyIGk9big3Mikscj1uKDEyOCk7dC5leHBvcnRzPWkoci5wcm90bywic2l6ZSIsImdldCIpfHxmdW5jdGlvbih0KXtyZXR1cm4gdC5zaXplfX0sKHQsZSxuKT0+e3ZhciBpPW4oMzEpLHI9big0Nykscz1uKDgpLGE9big2Miksbz1UeXBlRXJyb3IsbD1NYXRoLm1heCxTZXRSZWNvcmQ9ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5zZXQ9dDt0aGlzLnNpemU9ZTt0aGlzLmhhcz1uO3RoaXMua2V5cz1pfTtTZXRSZWNvcmQucHJvdG90eXBlPXtnZXRJdGVyYXRvcjpmdW5jdGlvbigpe3JldHVybiByKHModGhpcy5rZXlzLHRoaXMuc2V0KSl9LGluY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiBzKHRoaXMuaGFzLHRoaXMuc2V0LHQpfX07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3IodCk7dmFyIGU9K3Quc2l6ZTtpZihlIT1lKXRocm93IG8oIkludmFsaWQgc2l6ZSIpO3JldHVybiBuZXcgU2V0UmVjb3JkKHQsbChhKGUpLDApLGkodC5oYXMpLGkodC5rZXlzKSl9fSwodCxlLG4pPT57dmFyIGk9bigyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXsobmV3KGkoIlNldCIpKSlbdF0oe3NpemU6MCxoYXM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sa2V5czpmdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ITB9fX19fSk7cmV0dXJuITB9Y2F0Y2godCl7cmV0dXJuITF9fX0sKHQsZSxuKT0+e3ZhciBpPW4oMykscj1uKDcpLHM9bigxMzYpO2koe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohbigxMzQpKCJpbnRlcnNlY3Rpb24iKXx8cigoZnVuY3Rpb24oKXtyZXR1cm4iMywyIiE9QXJyYXkuZnJvbShuZXcgU2V0KFsxLDIsM10pLmludGVyc2VjdGlvbihuZXcgU2V0KFszLDJdKSkpfSkpfSx7aW50ZXJzZWN0aW9uOnN9KX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDEyNykscj1uKDEyOCkscz1uKDEzMiksYT1uKDEzMyksbz1uKDEzMCksbD1uKDEzMSksYz1yLlNldCxoPXIuYWRkLGQ9ci5oYXM7dC5leHBvcnRzPWZ1bmN0aW9uIGludGVyc2VjdGlvbih0KXt2YXIgZT1pKHRoaXMpLG49YSh0KSxyPW5ldyBjO3MoZSk+bi5zaXplP2wobi5nZXRJdGVyYXRvcigpLChmdW5jdGlvbih0KXtkKGUsdCkmJmgocix0KX0pKTpvKGUsKGZ1bmN0aW9uKHQpe24uaW5jbHVkZXModCkmJmgocix0KX0pKTtyZXR1cm4gcn19LCh0LGUsbik9Pnt2YXIgaT1uKDMpLHI9bigxMzgpO2koe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohbigxMzQpKCJpc0Rpc2pvaW50RnJvbSIpfSx7aXNEaXNqb2ludEZyb206cn0pfSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oMTI3KSxyPW4oMTI4KS5oYXMscz1uKDEzMiksYT1uKDEzMyksbz1uKDEzMCksbD1uKDEzMSksYz1uKDEzOSk7dC5leHBvcnRzPWZ1bmN0aW9uIGlzRGlzam9pbnRGcm9tKHQpe3ZhciBlPWkodGhpcyksbj1hKHQpO2lmKHMoZSk8PW4uc2l6ZSlyZXR1cm4hMSE9PW8oZSwoZnVuY3Rpb24odCl7aWYobi5pbmNsdWRlcyh0KSlyZXR1cm4hMX0pLCEwKTt2YXIgaD1uLmdldEl0ZXJhdG9yKCk7cmV0dXJuITEhPT1sKGgsKGZ1bmN0aW9uKHQpe2lmKHIoZSx0KSlyZXR1cm4gYyhoLCJub3JtYWwiLCExKX0pKX19LCh0LGUsbik9Pnt2YXIgaT1uKDgpLHI9big0Nykscz1uKDMwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBhLG87cih0KTt0cnl7aWYoIShhPXModCwicmV0dXJuIikpKXtpZigidGhyb3ciPT09ZSl0aHJvdyBuO3JldHVybiBufWE9aShhLHQpfWNhdGNoKHQpe289ITA7YT10fWlmKCJ0aHJvdyI9PT1lKXRocm93IG47aWYobyl0aHJvdyBhO3IoYSk7cmV0dXJuIG59fSwodCxlLG4pPT57dmFyIGk9bigzKSxyPW4oMTQxKTtpKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IW4oMTM0KSgiaXNTdWJzZXRPZiIpfSx7aXNTdWJzZXRPZjpyfSl9LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9bigxMjcpLHI9bigxMzIpLHM9bigxMzApLGE9bigxMzMpO3QuZXhwb3J0cz1mdW5jdGlvbiBpc1N1YnNldE9mKHQpe3ZhciBlPWkodGhpcyksbj1hKHQpO3JldHVybiEocihlKT5uLnNpemUpJiYhMSE9PXMoZSwoZnVuY3Rpb24odCl7aWYoIW4uaW5jbHVkZXModCkpcmV0dXJuITF9KSwhMCl9fSwodCxlLG4pPT57dmFyIGk9bigzKSxyPW4oMTQzKTtpKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IW4oMTM0KSgiaXNTdXBlcnNldE9mIil9LHtpc1N1cGVyc2V0T2Y6cn0pfSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oMTI3KSxyPW4oMTI4KS5oYXMscz1uKDEzMiksYT1uKDEzMyksbz1uKDEzMSksbD1uKDEzOSk7dC5leHBvcnRzPWZ1bmN0aW9uIGlzU3VwZXJzZXRPZih0KXt2YXIgZT1pKHRoaXMpLG49YSh0KTtpZihzKGUpPG4uc2l6ZSlyZXR1cm4hMTt2YXIgYz1uLmdldEl0ZXJhdG9yKCk7cmV0dXJuITEhPT1vKGMsKGZ1bmN0aW9uKHQpe2lmKCFyKGUsdCkpcmV0dXJuIGwoYywibm9ybWFsIiwhMSl9KSl9fSwodCxlLG4pPT57dmFyIGk9bigzKSxyPW4oMTQ1KTtpKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IW4oMTM0KSgic3ltbWV0cmljRGlmZmVyZW5jZSIpfSx7c3ltbWV0cmljRGlmZmVyZW5jZTpyfSl9LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9bigxMjcpLHI9bigxMjgpLHM9bigxMjkpLGE9bigxMzMpLG89bigxMzEpLGw9ci5hZGQsYz1yLmhhcyxoPXIucmVtb3ZlO3QuZXhwb3J0cz1mdW5jdGlvbiBzeW1tZXRyaWNEaWZmZXJlbmNlKHQpe3ZhciBlPWkodGhpcyksbj1hKHQpLmdldEl0ZXJhdG9yKCkscj1zKGUpO28obiwoZnVuY3Rpb24odCl7YyhlLHQpP2gocix0KTpsKHIsdCl9KSk7cmV0dXJuIHJ9fSwodCxlLG4pPT57dmFyIGk9bigzKSxyPW4oMTQ3KTtpKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IW4oMTM0KSgidW5pb24iKX0se3VuaW9uOnJ9KX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDEyNykscj1uKDEyOCkuYWRkLHM9bigxMjkpLGE9bigxMzMpLG89bigxMzEpO3QuZXhwb3J0cz1mdW5jdGlvbiB1bmlvbih0KXt2YXIgZT1pKHRoaXMpLG49YSh0KS5nZXRJdGVyYXRvcigpLGw9cyhlKTtvKG4sKGZ1bmN0aW9uKHQpe3IobCx0KX0pKTtyZXR1cm4gbH19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9bigzKSxyPW4oNCkscz1uKDI0KSxhPW4oMTEpLG89big0NSkuZixsPW4oMzkpLGM9bigxNDkpLGg9big3NSksZD1uKDc2KSx1PW4oMTUwKSxwPW4oODIpLGY9big2KSxnPW4oMzYpLG09IkRPTUV4Y2VwdGlvbiIsYj1zKCJFcnJvciIpLHY9cyhtKSx5PWZ1bmN0aW9uIERPTUV4Y2VwdGlvbigpe2ModGhpcyxBKTt2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9ZCh0PDE/dm9pZCAwOmFyZ3VtZW50c1swXSksbj1kKHQ8Mj92b2lkIDA6YXJndW1lbnRzWzFdLCJFcnJvciIpLGk9bmV3IHYoZSxuKSxyPWIoZSk7ci5uYW1lPW07byhpLCJzdGFjayIsYSgxLHAoci5zdGFjaywxKSkpO2goaSx0aGlzLHkpO3JldHVybiBpfSxBPXkucHJvdG90eXBlPXYucHJvdG90eXBlLF89InN0YWNrImluIGIobSksUz0ic3RhY2siaW4gbmV3IHYoMSwyKSxFPXYmJmYmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixtKSx4PSEoIUV8fEUud3JpdGFibGUmJkUuY29uZmlndXJhYmxlKSx3PV8mJiF4JiYhUztpKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZm9yY2VkOmd8fHd9LHtET01FeGNlcHRpb246dz95OnZ9KTt2YXIgQz1zKG0pLFQ9Qy5wcm90b3R5cGU7aWYoVC5jb25zdHJ1Y3RvciE9PUMpe2d8fG8oVCwiY29uc3RydWN0b3IiLGEoMSxDKSk7Zm9yKHZhciBQIGluIHUpaWYobCh1LFApKXt2YXIgaz11W1BdLE09ay5zO2woQyxNKXx8byhDLE0sYSg2LGsuYykpfX19LCh0LGUsbik9Pnt2YXIgaT1uKDI1KSxyPVR5cGVFcnJvcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihpKGUsdCkpcmV0dXJuIHQ7dGhyb3cgcigiSW5jb3JyZWN0IGludm9jYXRpb24iKX19LHQ9Pnt0LmV4cG9ydHM9e0luZGV4U2l6ZUVycm9yOntzOiJJTkRFWF9TSVpFX0VSUiIsYzoxLG06MX0sRE9NU3RyaW5nU2l6ZUVycm9yOntzOiJET01TVFJJTkdfU0laRV9FUlIiLGM6MixtOjB9LEhpZXJhcmNoeVJlcXVlc3RFcnJvcjp7czoiSElFUkFSQ0hZX1JFUVVFU1RfRVJSIixjOjMsbToxfSxXcm9uZ0RvY3VtZW50RXJyb3I6e3M6IldST05HX0RPQ1VNRU5UX0VSUiIsYzo0LG06MX0sSW52YWxpZENoYXJhY3RlckVycm9yOntzOiJJTlZBTElEX0NIQVJBQ1RFUl9FUlIiLGM6NSxtOjF9LE5vRGF0YUFsbG93ZWRFcnJvcjp7czoiTk9fREFUQV9BTExPV0VEX0VSUiIsYzo2LG06MH0sTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyb3I6e3M6Ik5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiIsYzo3LG06MX0sTm90Rm91bmRFcnJvcjp7czoiTk9UX0ZPVU5EX0VSUiIsYzo4LG06MX0sTm90U3VwcG9ydGVkRXJyb3I6e3M6Ik5PVF9TVVBQT1JURURfRVJSIixjOjksbToxfSxJblVzZUF0dHJpYnV0ZUVycm9yOntzOiJJTlVTRV9BVFRSSUJVVEVfRVJSIixjOjEwLG06MX0sSW52YWxpZFN0YXRlRXJyb3I6e3M6IklOVkFMSURfU1RBVEVfRVJSIixjOjExLG06MX0sU3ludGF4RXJyb3I6e3M6IlNZTlRBWF9FUlIiLGM6MTIsbToxfSxJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3I6e3M6IklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiIsYzoxMyxtOjF9LE5hbWVzcGFjZUVycm9yOntzOiJOQU1FU1BBQ0VfRVJSIixjOjE0LG06MX0sSW52YWxpZEFjY2Vzc0Vycm9yOntzOiJJTlZBTElEX0FDQ0VTU19FUlIiLGM6MTUsbToxfSxWYWxpZGF0aW9uRXJyb3I6e3M6IlZBTElEQVRJT05fRVJSIixjOjE2LG06MH0sVHlwZU1pc21hdGNoRXJyb3I6e3M6IlRZUEVfTUlTTUFUQ0hfRVJSIixjOjE3LG06MX0sU2VjdXJpdHlFcnJvcjp7czoiU0VDVVJJVFlfRVJSIixjOjE4LG06MX0sTmV0d29ya0Vycm9yOntzOiJORVRXT1JLX0VSUiIsYzoxOSxtOjF9LEFib3J0RXJyb3I6e3M6IkFCT1JUX0VSUiIsYzoyMCxtOjF9LFVSTE1pc21hdGNoRXJyb3I6e3M6IlVSTF9NSVNNQVRDSF9FUlIiLGM6MjEsbToxfSxRdW90YUV4Y2VlZGVkRXJyb3I6e3M6IlFVT1RBX0VYQ0VFREVEX0VSUiIsYzoyMixtOjF9LFRpbWVvdXRFcnJvcjp7czoiVElNRU9VVF9FUlIiLGM6MjMsbToxfSxJbnZhbGlkTm9kZVR5cGVFcnJvcjp7czoiSU5WQUxJRF9OT0RFX1RZUEVfRVJSIixjOjI0LG06MX0sRGF0YUNsb25lRXJyb3I6e3M6IkRBVEFfQ0xPTkVfRVJSIixjOjI1LG06MX19fSwodCxlLG4pPT57dmFyIGkscj1uKDM2KSxzPW4oMyksYT1uKDQpLG89bigyNCksbD1uKDE0KSxjPW4oNyksaD1uKDQxKSxkPW4oMjEpLHU9bigxNTIpLHA9bigxNyksZj1uKDIwKSxnPW4oMjMpLG09bigxNTMpLGI9big0Nyksdj1uKDc4KSx5PW4oMzkpLEE9bigxNTgpLF89big0NCksUz1uKDY0KSxFPW4oODUpLHg9bigxNTkpLHc9bigxNjEpLEM9bigxMjgpLFQ9big4MyksUD1uKDExOSksaz1hLk9iamVjdCxNPWEuQXJyYXksUj1hLkRhdGUsST1hLkVycm9yLEQ9YS5FdmFsRXJyb3IsTz1hLlJhbmdlRXJyb3IsTD1hLlJlZmVyZW5jZUVycm9yLE49YS5TeW50YXhFcnJvcixCPWEuVHlwZUVycm9yLGo9YS5VUklFcnJvcixVPWEuUGVyZm9ybWFuY2VNYXJrLHo9YS5XZWJBc3NlbWJseSxIPXomJnouQ29tcGlsZUVycm9yfHxJLHE9eiYmei5MaW5rRXJyb3J8fEksVz16JiZ6LlJ1bnRpbWVFcnJvcnx8SSxHPW8oIkRPTUV4Y2VwdGlvbiIpLFY9dy5NYXAsJD13LmhhcyxYPXcuZ2V0LEs9dy5zZXQsWT1DLlNldCxKPUMuYWRkLFE9bygiT2JqZWN0Iiwia2V5cyIpLFo9bChbXS5wdXNoKSx0dD1sKCghMCkudmFsdWVPZiksZXQ9bCgxLi52YWx1ZU9mKSxudD1sKCIiLnZhbHVlT2YpLGl0PWwoUi5wcm90b3R5cGUuZ2V0VGltZSkscnQ9aCgic3RydWN0dXJlZENsb25lIiksc3Q9IkRhdGFDbG9uZUVycm9yIixhdD0iVHJhbnNmZXJyaW5nIixjaGVja0Jhc2ljU2VtYW50aWM9ZnVuY3Rpb24odCl7cmV0dXJuIWMoKGZ1bmN0aW9uKCl7dmFyIGU9bmV3IGEuU2V0KFs3XSksbj10KGUpLGk9dChrKDcpKTtyZXR1cm4gbj09ZXx8IW4uaGFzKDcpfHwib2JqZWN0IiE9dHlwZW9mIGl8fDchPWl9KSkmJnR9LGNoZWNrRXJyb3JzQ2xvbmluZz1mdW5jdGlvbih0LGUpe3JldHVybiFjKChmdW5jdGlvbigpe3ZhciBuPW5ldyBlLGk9dCh7YTpuLGI6bn0pO3JldHVybiEoaSYmaS5hPT09aS5iJiZpLmEgaW5zdGFuY2VvZiBlJiZpLmEuc3RhY2s9PT1uLnN0YWNrKX0pKX0sb3Q9YS5zdHJ1Y3R1cmVkQ2xvbmUsbHQ9cnx8IWNoZWNrRXJyb3JzQ2xvbmluZyhvdCxJKXx8IWNoZWNrRXJyb3JzQ2xvbmluZyhvdCxHKXx8IShpPW90LCFjKChmdW5jdGlvbigpe3ZhciB0PWkobmV3IGEuQWdncmVnYXRlRXJyb3IoWzFdLHJ0LHtjYXVzZTozfSkpO3JldHVybiJBZ2dyZWdhdGVFcnJvciIhPXQubmFtZXx8MSE9dC5lcnJvcnNbMF18fHQubWVzc2FnZSE9cnR8fDMhPXQuY2F1c2V9KSkpLGN0PSFvdCYmY2hlY2tCYXNpY1NlbWFudGljKChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IFUocnQse2RldGFpbDp0fSkuZGV0YWlsfSkpLGh0PWNoZWNrQmFzaWNTZW1hbnRpYyhvdCl8fGN0LHRocm93VW5jbG9uZWFibGU9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEcoIlVuY2xvbmVhYmxlIHR5cGU6ICIrdCxzdCl9LHRocm93VW5wb2x5ZmlsbGFibGU9ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRygoZXx8IkNsb25pbmciKSsiIG9mICIrdCsiIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIHRoaXMgZW5naW5lIixzdCl9LHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmU9ZnVuY3Rpb24odCxlKXtodHx8dGhyb3dVbnBvbHlmaWxsYWJsZShlKTtyZXR1cm4gaHQodCl9LGNsb25lQnVmZmVyPWZ1bmN0aW9uKHQsZSxuKXtpZigkKGUsdCkpcmV0dXJuIFgoZSx0KTt2YXIgaSxyLHMsbyxsLGM7aWYoIlNoYXJlZEFycmF5QnVmZmVyIj09PShufHx2KHQpKSlpPWh0P2h0KHQpOnQ7ZWxzZXt2YXIgaD1hLkRhdGFWaWV3O2h8fCJmdW5jdGlvbiI9PXR5cGVvZiB0LnNsaWNlfHx0aHJvd1VucG9seWZpbGxhYmxlKCJBcnJheUJ1ZmZlciIpO3RyeXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdC5zbGljZXx8dC5yZXNpemFibGUpe3I9dC5ieXRlTGVuZ3RoO3M9Im1heEJ5dGVMZW5ndGgiaW4gdD97bWF4Qnl0ZUxlbmd0aDp0Lm1heEJ5dGVMZW5ndGh9OnZvaWQgMDtpPW5ldyBBcnJheUJ1ZmZlcihyLHMpO289bmV3IGgodCk7bD1uZXcgaChpKTtmb3IoYz0wO2M8cjtjKyspbC5zZXRVaW50OChjLG8uZ2V0VWludDgoYykpfWVsc2UgaT10LnNsaWNlKDApfWNhdGNoKHQpe3Rocm93IG5ldyBHKCJBcnJheUJ1ZmZlciBpcyBkZXRhY2hlZCIsc3QpfX1LKGUsdCxpKTtyZXR1cm4gaX0sY2xvbmVWaWV3PWZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIHM9YVtlXTtmKHMpfHx0aHJvd1VucG9seWZpbGxhYmxlKGUpO3JldHVybiBuZXcgcyhjbG9uZUJ1ZmZlcih0LmJ1ZmZlcixyKSxuLGkpfSxQbGFjZWhvbGRlcj1mdW5jdGlvbih0LGUsbil7dGhpcy5vYmplY3Q9dDt0aGlzLnR5cGU9ZTt0aGlzLm1ldGFkYXRhPW59LHN0cnVjdHVyZWRDbG9uZUludGVybmFsPWZ1bmN0aW9uKHQsZSxuKXtnKHQpJiZ0aHJvd1VuY2xvbmVhYmxlKCJTeW1ib2wiKTtpZighZih0KSlyZXR1cm4gdDtpZihlKXtpZigkKGUsdCkpcmV0dXJuIFgoZSx0KX1lbHNlIGU9bmV3IFY7dmFyIGkscixzLGwsYyxoLHUscCxtPXYodCk7c3dpdGNoKG0pe2Nhc2UiQXJyYXkiOnM9TShTKHQpKTticmVhaztjYXNlIk9iamVjdCI6cz17fTticmVhaztjYXNlIk1hcCI6cz1uZXcgVjticmVhaztjYXNlIlNldCI6cz1uZXcgWTticmVhaztjYXNlIlJlZ0V4cCI6cz1uZXcgUmVnRXhwKHQuc291cmNlLHgodCkpO2JyZWFrO2Nhc2UiRXJyb3IiOnN3aXRjaChyPXQubmFtZSl7Y2FzZSJBZ2dyZWdhdGVFcnJvciI6cz1vKCJBZ2dyZWdhdGVFcnJvciIpKFtdKTticmVhaztjYXNlIkV2YWxFcnJvciI6cz1EKCk7YnJlYWs7Y2FzZSJSYW5nZUVycm9yIjpzPU8oKTticmVhaztjYXNlIlJlZmVyZW5jZUVycm9yIjpzPUwoKTticmVhaztjYXNlIlN5bnRheEVycm9yIjpzPU4oKTticmVhaztjYXNlIlR5cGVFcnJvciI6cz1CKCk7YnJlYWs7Y2FzZSJVUklFcnJvciI6cz1qKCk7YnJlYWs7Y2FzZSJDb21waWxlRXJyb3IiOnM9SCgpO2JyZWFrO2Nhc2UiTGlua0Vycm9yIjpzPXEoKTticmVhaztjYXNlIlJ1bnRpbWVFcnJvciI6cz1XKCk7YnJlYWs7ZGVmYXVsdDpzPUkoKX1icmVhaztjYXNlIkRPTUV4Y2VwdGlvbiI6cz1uZXcgRyh0Lm1lc3NhZ2UsdC5uYW1lKTticmVhaztjYXNlIkFycmF5QnVmZmVyIjpjYXNlIlNoYXJlZEFycmF5QnVmZmVyIjpzPW4/bmV3IFBsYWNlaG9sZGVyKHQsbSk6Y2xvbmVCdWZmZXIodCxlLG0pO2JyZWFrO2Nhc2UiRGF0YVZpZXciOmNhc2UiSW50OEFycmF5IjpjYXNlIlVpbnQ4QXJyYXkiOmNhc2UiVWludDhDbGFtcGVkQXJyYXkiOmNhc2UiSW50MTZBcnJheSI6Y2FzZSJVaW50MTZBcnJheSI6Y2FzZSJJbnQzMkFycmF5IjpjYXNlIlVpbnQzMkFycmF5IjpjYXNlIkZsb2F0MTZBcnJheSI6Y2FzZSJGbG9hdDMyQXJyYXkiOmNhc2UiRmxvYXQ2NEFycmF5IjpjYXNlIkJpZ0ludDY0QXJyYXkiOmNhc2UiQmlnVWludDY0QXJyYXkiOmg9IkRhdGFWaWV3Ij09PW0/dC5ieXRlTGVuZ3RoOnQubGVuZ3RoO3M9bj9uZXcgUGxhY2Vob2xkZXIodCxtLHtvZmZzZXQ6dC5ieXRlT2Zmc2V0LGxlbmd0aDpofSk6Y2xvbmVWaWV3KHQsbSx0LmJ5dGVPZmZzZXQsaCxlKTticmVhaztjYXNlIkRPTVF1YWQiOnRyeXtzPW5ldyBET01RdWFkKHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQucDEsZSxuKSxzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LnAyLGUsbiksc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5wMyxlLG4pLHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQucDQsZSxuKSl9Y2F0Y2goZSl7cz10cnlOYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHQsbSl9YnJlYWs7Y2FzZSJGaWxlIjppZihodCl0cnl7cz1odCh0KTt2KHMpIT09bSYmKHM9dm9pZCAwKX1jYXRjaCh0KXt9aWYoIXMpdHJ5e3M9bmV3IEZpbGUoW3RdLHQubmFtZSx0KX1jYXRjaCh0KXt9c3x8dGhyb3dVbnBvbHlmaWxsYWJsZShtKTticmVhaztjYXNlIkZpbGVMaXN0IjppZihsPWZ1bmN0aW9uKCl7dmFyIHQ7dHJ5e3Q9bmV3IGEuRGF0YVRyYW5zZmVyfWNhdGNoKGUpe3RyeXt0PW5ldyBhLkNsaXBib2FyZEV2ZW50KCIiKS5jbGlwYm9hcmREYXRhfWNhdGNoKHQpe319cmV0dXJuIHQmJnQuaXRlbXMmJnQuZmlsZXM/dDpudWxsfSgpKXtmb3IoYz0wLGg9Uyh0KTtjPGg7YysrKWwuaXRlbXMuYWRkKHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHRbY10sZSxuKSk7cz1sLmZpbGVzfWVsc2Ugcz10cnlOYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHQsbSk7YnJlYWs7Y2FzZSJJbWFnZURhdGEiOnRyeXtzPW5ldyBJbWFnZURhdGEoc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5kYXRhLGUsbiksdC53aWR0aCx0LmhlaWdodCx7Y29sb3JTcGFjZTp0LmNvbG9yU3BhY2V9KX1jYXRjaChlKXtzPXRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodCxtKX1icmVhaztkZWZhdWx0OmlmKGh0KXM9aHQodCk7ZWxzZSBzd2l0Y2gobSl7Y2FzZSJCaWdJbnQiOnM9ayh0LnZhbHVlT2YoKSk7YnJlYWs7Y2FzZSJCb29sZWFuIjpzPWsodHQodCkpO2JyZWFrO2Nhc2UiTnVtYmVyIjpzPWsoZXQodCkpO2JyZWFrO2Nhc2UiU3RyaW5nIjpzPWsobnQodCkpO2JyZWFrO2Nhc2UiRGF0ZSI6cz1uZXcgUihpdCh0KSk7YnJlYWs7Y2FzZSJCbG9iIjp0cnl7cz10LnNsaWNlKDAsdC5zaXplLHQudHlwZSl9Y2F0Y2godCl7dGhyb3dVbnBvbHlmaWxsYWJsZShtKX1icmVhaztjYXNlIkRPTVBvaW50IjpjYXNlIkRPTVBvaW50UmVhZE9ubHkiOmk9YVttXTt0cnl7cz1pLmZyb21Qb2ludD9pLmZyb21Qb2ludCh0KTpuZXcgaSh0LngsdC55LHQueix0LncpfWNhdGNoKHQpe3Rocm93VW5wb2x5ZmlsbGFibGUobSl9YnJlYWs7Y2FzZSJET01SZWN0IjpjYXNlIkRPTVJlY3RSZWFkT25seSI6aT1hW21dO3RyeXtzPWkuZnJvbVJlY3Q/aS5mcm9tUmVjdCh0KTpuZXcgaSh0LngsdC55LHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKHQpe3Rocm93VW5wb2x5ZmlsbGFibGUobSl9YnJlYWs7Y2FzZSJET01NYXRyaXgiOmNhc2UiRE9NTWF0cml4UmVhZE9ubHkiOmk9YVttXTt0cnl7cz1pLmZyb21NYXRyaXg/aS5mcm9tTWF0cml4KHQpOm5ldyBpKHQpfWNhdGNoKHQpe3Rocm93VW5wb2x5ZmlsbGFibGUobSl9YnJlYWs7Y2FzZSJBdWRpb0RhdGEiOmNhc2UiVmlkZW9GcmFtZSI6ZCh0LmNsb25lKXx8dGhyb3dVbnBvbHlmaWxsYWJsZShtKTt0cnl7cz10LmNsb25lKCl9Y2F0Y2godCl7dGhyb3dVbmNsb25lYWJsZShtKX1icmVhaztjYXNlIkNyb3BUYXJnZXQiOmNhc2UiQ3J5cHRvS2V5IjpjYXNlIkZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUiOmNhc2UiRmlsZVN5c3RlbUZpbGVIYW5kbGUiOmNhc2UiRmlsZVN5c3RlbUhhbmRsZSI6Y2FzZSJHUFVDb21waWxhdGlvbkluZm8iOmNhc2UiR1BVQ29tcGlsYXRpb25NZXNzYWdlIjpjYXNlIkltYWdlQml0bWFwIjpjYXNlIlJUQ0NlcnRpZmljYXRlIjpjYXNlIldlYkFzc2VtYmx5Lk1vZHVsZSI6dGhyb3dVbnBvbHlmaWxsYWJsZShtKTtkZWZhdWx0OnRocm93VW5jbG9uZWFibGUobSl9fUsoZSx0LHMpO3N3aXRjaChtKXtjYXNlIkFycmF5IjpjYXNlIk9iamVjdCI6dT1RKHQpO2ZvcihjPTAsaD1TKHUpO2M8aDtjKyspe3A9dVtjXTtBKHMscCxzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0W3BdLGUsbikpfWJyZWFrO2Nhc2UiTWFwIjp0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7SyhzLHN0cnVjdHVyZWRDbG9uZUludGVybmFsKGksZSxuKSxzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LGUsbikpfSkpO2JyZWFrO2Nhc2UiU2V0Ijp0LmZvckVhY2goKGZ1bmN0aW9uKHQpe0oocyxzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LGUsbikpfSkpO2JyZWFrO2Nhc2UiRXJyb3IiOl8ocywibWVzc2FnZSIsc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5tZXNzYWdlLGUsbikpO3kodCwiY2F1c2UiKSYmXyhzLCJjYXVzZSIsc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5jYXVzZSxlLG4pKTsiQWdncmVnYXRlRXJyb3IiPT1yJiYocy5lcnJvcnM9c3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5lcnJvcnMsZSxuKSk7Y2FzZSJET01FeGNlcHRpb24iOlQmJl8ocywic3RhY2siLHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQuc3RhY2ssZSxuKSl9cmV0dXJuIHN9LHJlcGxhY2VQbGFjZWhvbGRlcnM9ZnVuY3Rpb24odCxlKXtpZighZih0KSlyZXR1cm4gdDtpZigkKGUsdCkpcmV0dXJuIFgoZSx0KTt2YXIgbixpLHIscyxhLG8sbCxjO2lmKHQgaW5zdGFuY2VvZiBQbGFjZWhvbGRlcil7bj10LnR5cGU7aT10Lm9iamVjdDtzd2l0Y2gobil7Y2FzZSJBcnJheUJ1ZmZlciI6Y2FzZSJTaGFyZWRBcnJheUJ1ZmZlciI6Yz1jbG9uZUJ1ZmZlcihpLGUsbik7YnJlYWs7Y2FzZSJEYXRhVmlldyI6Y2FzZSJJbnQ4QXJyYXkiOmNhc2UiVWludDhBcnJheSI6Y2FzZSJVaW50OENsYW1wZWRBcnJheSI6Y2FzZSJJbnQxNkFycmF5IjpjYXNlIlVpbnQxNkFycmF5IjpjYXNlIkludDMyQXJyYXkiOmNhc2UiVWludDMyQXJyYXkiOmNhc2UiRmxvYXQxNkFycmF5IjpjYXNlIkZsb2F0MzJBcnJheSI6Y2FzZSJGbG9hdDY0QXJyYXkiOmNhc2UiQmlnSW50NjRBcnJheSI6Y2FzZSJCaWdVaW50NjRBcnJheSI6cj10Lm1ldGFkYXRhO2M9Y2xvbmVWaWV3KGksbixyLm9mZnNldCxyLmxlbmd0aCxlKX19ZWxzZSBzd2l0Y2godih0KSl7Y2FzZSJBcnJheSI6Y2FzZSJPYmplY3QiOm89USh0KTtmb3Iocz0wLGE9UyhvKTtzPGE7cysrKXRbbD1vW3NdXT1yZXBsYWNlUGxhY2Vob2xkZXJzKHRbbF0sZSk7YnJlYWs7Y2FzZSJNYXAiOmM9bmV3IFY7dC5mb3JFYWNoKChmdW5jdGlvbih0LG4pe0soYyxyZXBsYWNlUGxhY2Vob2xkZXJzKG4sZSkscmVwbGFjZVBsYWNlaG9sZGVycyh0LGUpKX0pKTticmVhaztjYXNlIlNldCI6Yz1uZXcgWTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe0ooYyxyZXBsYWNlUGxhY2Vob2xkZXJzKHQsZSkpfSkpO2JyZWFrO2Nhc2UiRXJyb3IiOnQubWVzc2FnZT1yZXBsYWNlUGxhY2Vob2xkZXJzKHQubWVzc2FnZSxlKTt5KHQsImNhdXNlIikmJih0LmNhdXNlPXJlcGxhY2VQbGFjZWhvbGRlcnModC5jYXVzZSxlKSk7IkFnZ3JlZ2F0ZUVycm9yIj09dC5uYW1lJiYodC5lcnJvcnM9cmVwbGFjZVBsYWNlaG9sZGVycyh0LmVycm9ycyxlKSk7Y2FzZSJET01FeGNlcHRpb24iOlQmJih0LnN0YWNrPXJlcGxhY2VQbGFjZWhvbGRlcnModC5zdGFjayxlKSl9SyhlLHQsY3x8dCk7cmV0dXJuIGN8fHR9O3Moe2dsb2JhbDohMCxlbnVtZXJhYmxlOiEwLHNoYW06IVAsZm9yY2VkOmx0fSx7c3RydWN0dXJlZENsb25lOmZ1bmN0aW9uIHN0cnVjdHVyZWRDbG9uZSh0KXt2YXIgZSxuLGk9RShhcmd1bWVudHMubGVuZ3RoLDEpPjEmJiFwKGFyZ3VtZW50c1sxXSk/Yihhcmd1bWVudHNbMV0pOnZvaWQgMCxyPWk/aS50cmFuc2Zlcjp2b2lkIDAscz0hMTtpZih2b2lkIDAhPT1yKXtuPWZ1bmN0aW9uKHQsZSl7aWYoIWYodCkpdGhyb3cgQigiVHJhbnNmZXIgb3B0aW9uIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYSBzZXF1ZW5jZSIpO3ZhciBuPVtdO20odCwoZnVuY3Rpb24odCl7WihuLGIodCkpfSkpO2Zvcih2YXIgaSxyLHMsbyxsLGM9MCxoPVMobikscD1bXTtjPGg7KXtpPW5bYysrXTtpZigiQXJyYXlCdWZmZXIiIT09KHI9dihpKSkpe2lmKCQoZSxpKSl0aHJvdyBuZXcgRygiRHVwbGljYXRlIHRyYW5zZmVyYWJsZSIsc3QpO2lmKFApbz1vdChpLHt0cmFuc2ZlcjpbaV19KTtlbHNlIHN3aXRjaChyKXtjYXNlIkltYWdlQml0bWFwIjpzPWEuT2Zmc2NyZWVuQ2FudmFzO3Uocyl8fHRocm93VW5wb2x5ZmlsbGFibGUocixhdCk7dHJ5eyhsPW5ldyBzKGkud2lkdGgsaS5oZWlnaHQpKS5nZXRDb250ZXh0KCJiaXRtYXByZW5kZXJlciIpLnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKGkpO289bC50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKX1jYXRjaCh0KXt9YnJlYWs7Y2FzZSJBdWRpb0RhdGEiOmNhc2UiVmlkZW9GcmFtZSI6ZChpLmNsb25lKSYmZChpLmNsb3NlKXx8dGhyb3dVbnBvbHlmaWxsYWJsZShyLGF0KTt0cnl7bz1pLmNsb25lKCk7aS5jbG9zZSgpfWNhdGNoKHQpe31icmVhaztjYXNlIk1lZGlhU291cmNlSGFuZGxlIjpjYXNlIk1lc3NhZ2VQb3J0IjpjYXNlIk9mZnNjcmVlbkNhbnZhcyI6Y2FzZSJSZWFkYWJsZVN0cmVhbSI6Y2FzZSJUcmFuc2Zvcm1TdHJlYW0iOmNhc2UiV3JpdGFibGVTdHJlYW0iOnRocm93VW5wb2x5ZmlsbGFibGUocixhdCl9aWYodm9pZCAwPT09byl0aHJvdyBuZXcgRygiVGhpcyBvYmplY3QgY2Fubm90IGJlIHRyYW5zZmVycmVkOiAiK3Isc3QpO0soZSxpLG8pfWVsc2UgWihwLGkpfXJldHVybiBwfShyLGU9bmV3IFYpO3M9ISFTKG4pfXZhciBvPXN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQsZSxzKTtpZihzKXshZnVuY3Rpb24odCxlKXtmb3IodmFyIG4saSxyPTAscz1TKHQpO3I8czspe249dFtyKytdO2lmKCQoZSxuKSl0aHJvdyBuZXcgRygiRHVwbGljYXRlIHRyYW5zZmVyYWJsZSIsc3QpO2lmKFApaT1vdChuLHt0cmFuc2Zlcjpbbl19KTtlbHNle2Qobi50cmFuc2Zlcil8fHRocm93VW5wb2x5ZmlsbGFibGUoIkFycmF5QnVmZmVyIixhdCk7aT1uLnRyYW5zZmVyKCl9SyhlLG4saSl9fShyLGU9bmV3IFYpO289cmVwbGFjZVBsYWNlaG9sZGVycyhvLGUpfXJldHVybiBvfX0pfSwodCxlLG4pPT57dmFyIGk9bigxNCkscj1uKDcpLHM9bigyMSksYT1uKDc4KSxvPW4oMjQpLGw9big1MSksbm9vcD1mdW5jdGlvbigpe30sYz1bXSxoPW8oIlJlZmxlY3QiLCJjb25zdHJ1Y3QiKSxkPS9eXHMqKD86Y2xhc3N8ZnVuY3Rpb24pXGIvLHU9aShkLmV4ZWMpLHA9IWQuZXhlYyhub29wKSxmPWZ1bmN0aW9uIGlzQ29uc3RydWN0b3IodCl7aWYoIXModCkpcmV0dXJuITE7dHJ5e2gobm9vcCxjLHQpO3JldHVybiEwfWNhdGNoKHQpe3JldHVybiExfX0sZz1mdW5jdGlvbiBpc0NvbnN0cnVjdG9yKHQpe2lmKCFzKHQpKXJldHVybiExO3N3aXRjaChhKHQpKXtjYXNlIkFzeW5jRnVuY3Rpb24iOmNhc2UiR2VuZXJhdG9yRnVuY3Rpb24iOmNhc2UiQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiI6cmV0dXJuITF9dHJ5e3JldHVybiBwfHwhIXUoZCxsKHQpKX1jYXRjaCh0KXtyZXR1cm4hMH19O2cuc2hhbT0hMDt0LmV4cG9ydHM9IWh8fHIoKGZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIGYoZi5jYWxsKXx8IWYoT2JqZWN0KXx8IWYoKGZ1bmN0aW9uKCl7dD0hMH0pKXx8dH0pKT9nOmZ9LCh0LGUsbik9Pnt2YXIgaT1uKDk5KSxyPW4oOCkscz1uKDQ3KSxhPW4oMzIpLG89bigxNTQpLGw9big2NCksYz1uKDI1KSxoPW4oMTU2KSxkPW4oMTU3KSx1PW4oMTM5KSxwPVR5cGVFcnJvcixSZXN1bHQ9ZnVuY3Rpb24odCxlKXt0aGlzLnN0b3BwZWQ9dDt0aGlzLnJlc3VsdD1lfSxmPVJlc3VsdC5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgZyxtLGIsdix5LEEsXyxTPW4mJm4udGhhdCxFPSEoIW58fCFuLkFTX0VOVFJJRVMpLHg9ISghbnx8IW4uSVNfUkVDT1JEKSx3PSEoIW58fCFuLklTX0lURVJBVE9SKSxDPSEoIW58fCFuLklOVEVSUlVQVEVEKSxUPWkoZSxTKSxzdG9wPWZ1bmN0aW9uKHQpe2cmJnUoZywibm9ybWFsIix0KTtyZXR1cm4gbmV3IFJlc3VsdCghMCx0KX0sY2FsbEZuPWZ1bmN0aW9uKHQpe2lmKEUpe3ModCk7cmV0dXJuIEM/VCh0WzBdLHRbMV0sc3RvcCk6VCh0WzBdLHRbMV0pfXJldHVybiBDP1QodCxzdG9wKTpUKHQpfTtpZih4KWc9dC5pdGVyYXRvcjtlbHNlIGlmKHcpZz10O2Vsc2V7aWYoIShtPWQodCkpKXRocm93IHAoYSh0KSsiIGlzIG5vdCBpdGVyYWJsZSIpO2lmKG8obSkpe2ZvcihiPTAsdj1sKHQpO3Y+YjtiKyspaWYoKHk9Y2FsbEZuKHRbYl0pKSYmYyhmLHkpKXJldHVybiB5O3JldHVybiBuZXcgUmVzdWx0KCExKX1nPWgodCxtKX1BPXg/dC5uZXh0OmcubmV4dDtmb3IoOyEoXz1yKEEsZykpLmRvbmU7KXt0cnl7eT1jYWxsRm4oXy52YWx1ZSl9Y2F0Y2godCl7dShnLCJ0aHJvdyIsdCl9aWYoIm9iamVjdCI9PXR5cGVvZiB5JiZ5JiZjKGYseSkpcmV0dXJuIHl9cmV0dXJuIG5ldyBSZXN1bHQoITEpfX0sKHQsZSxuKT0+e3ZhciBpPW4oMzQpLHI9bigxNTUpLHM9aSgiaXRlcmF0b3IiKSxhPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihyLkFycmF5PT09dHx8YVtzXT09PXQpfX0sdD0+e3QuZXhwb3J0cz17fX0sKHQsZSxuKT0+e3ZhciBpPW4oOCkscj1uKDMxKSxzPW4oNDcpLGE9bigzMiksbz1uKDE1NyksbD1UeXBlRXJyb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwyP28odCk6ZTtpZihyKG4pKXJldHVybiBzKGkobix0KSk7dGhyb3cgbChhKHQpKyIgaXMgbm90IGl0ZXJhYmxlIil9fSwodCxlLG4pPT57dmFyIGk9big3OCkscj1uKDMwKSxzPW4oMTcpLGE9bigxNTUpLG89bigzNCkoIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFzKHQpKXJldHVybiByKHQsbyl8fHIodCwiQEBpdGVyYXRvciIpfHxhW2kodCldfX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgaT1uKDE4KSxyPW4oNDUpLHM9bigxMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1pKGUpO2EgaW4gdD9yLmYodCxhLHMoMCxuKSk6dFthXT1ufX0sKHQsZSxuKT0+e3ZhciBpPW4oOCkscj1uKDM5KSxzPW4oMjUpLGE9bigxNjApLG89UmVnRXhwLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5mbGFncztyZXR1cm4gdm9pZCAwIT09ZXx8ImZsYWdzImluIG98fHIodCwiZmxhZ3MiKXx8IXMobyx0KT9lOmkoYSx0KX19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9big0Nyk7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIHQ9aSh0aGlzKSxlPSIiO3QuaGFzSW5kaWNlcyYmKGUrPSJkIik7dC5nbG9iYWwmJihlKz0iZyIpO3QuaWdub3JlQ2FzZSYmKGUrPSJpIik7dC5tdWx0aWxpbmUmJihlKz0ibSIpO3QuZG90QWxsJiYoZSs9InMiKTt0LnVuaWNvZGUmJihlKz0idSIpO3QudW5pY29kZVNldHMmJihlKz0idiIpO3Quc3RpY2t5JiYoZSs9InkiKTtyZXR1cm4gZX19LCh0LGUsbik9Pnt2YXIgaT1uKDE0KSxyPU1hcC5wcm90b3R5cGU7dC5leHBvcnRzPXtNYXA6TWFwLHNldDppKHIuc2V0KSxnZXQ6aShyLmdldCksaGFzOmkoci5oYXMpLHJlbW92ZTppKHIuZGVsZXRlKSxwcm90bzpyfX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5TZXJpYWxpemFibGVFbXB0eT1lLlByaW50QW5ub3RhdGlvblN0b3JhZ2U9ZS5Bbm5vdGF0aW9uU3RvcmFnZT12b2lkIDA7big4OSk7bigxNDgpO24oMTUxKTt2YXIgaT1uKDEpLHI9bigxNjMpLHM9bigxNjkpO2NvbnN0IGE9T2JqZWN0LmZyZWV6ZSh7bWFwOm51bGwsaGFzaDoiIix0cmFuc2ZlcnM6dm9pZCAwfSk7ZS5TZXJpYWxpemFibGVFbXB0eT1hO2NsYXNzIEFubm90YXRpb25TdG9yYWdleyN2PSExOyN5PW5ldyBNYXA7Y29uc3RydWN0b3IoKXt0aGlzLm9uU2V0TW9kaWZpZWQ9bnVsbDt0aGlzLm9uUmVzZXRNb2RpZmllZD1udWxsO3RoaXMub25Bbm5vdGF0aW9uRWRpdG9yPW51bGx9Z2V0VmFsdWUodCxlKXtjb25zdCBuPXRoaXMuI3kuZ2V0KHQpO3JldHVybiB2b2lkIDA9PT1uP2U6T2JqZWN0LmFzc2lnbihlLG4pfWdldFJhd1ZhbHVlKHQpe3JldHVybiB0aGlzLiN5LmdldCh0KX1yZW1vdmUodCl7dGhpcy4jeS5kZWxldGUodCk7MD09PXRoaXMuI3kuc2l6ZSYmdGhpcy5yZXNldE1vZGlmaWVkKCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKXtmb3IoY29uc3QgdCBvZiB0aGlzLiN5LnZhbHVlcygpKWlmKHQgaW5zdGFuY2VvZiByLkFubm90YXRpb25FZGl0b3IpcmV0dXJuO3RoaXMub25Bbm5vdGF0aW9uRWRpdG9yKG51bGwpfX1zZXRWYWx1ZSh0LGUpe2NvbnN0IG49dGhpcy4jeS5nZXQodCk7bGV0IGk9ITE7aWYodm9pZCAwIT09bil7Zm9yKGNvbnN0W3Qscl1vZiBPYmplY3QuZW50cmllcyhlKSlpZihuW3RdIT09cil7aT0hMDtuW3RdPXJ9fWVsc2V7aT0hMDt0aGlzLiN5LnNldCh0LGUpfWkmJnRoaXMuI0EoKTtlIGluc3RhbmNlb2Ygci5Bbm5vdGF0aW9uRWRpdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5vbkFubm90YXRpb25FZGl0b3ImJnRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKGUuY29uc3RydWN0b3IuX3R5cGUpfWhhcyh0KXtyZXR1cm4gdGhpcy4jeS5oYXModCl9Z2V0QWxsKCl7cmV0dXJuIHRoaXMuI3kuc2l6ZT4wPygwLGkub2JqZWN0RnJvbU1hcCkodGhpcy4jeSk6bnVsbH1zZXRBbGwodCl7Zm9yKGNvbnN0W2Usbl1vZiBPYmplY3QuZW50cmllcyh0KSl0aGlzLnNldFZhbHVlKGUsbil9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy4jeS5zaXplfSNBKCl7aWYoIXRoaXMuI3Ype3RoaXMuI3Y9ITA7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMub25TZXRNb2RpZmllZCYmdGhpcy5vblNldE1vZGlmaWVkKCl9fXJlc2V0TW9kaWZpZWQoKXtpZih0aGlzLiN2KXt0aGlzLiN2PSExOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9uUmVzZXRNb2RpZmllZCYmdGhpcy5vblJlc2V0TW9kaWZpZWQoKX19Z2V0IHByaW50KCl7cmV0dXJuIG5ldyBQcmludEFubm90YXRpb25TdG9yYWdlKHRoaXMpfWdldCBzZXJpYWxpemFibGUoKXtpZigwPT09dGhpcy4jeS5zaXplKXJldHVybiBhO2NvbnN0IHQ9bmV3IE1hcCxlPW5ldyBzLk11cm11ckhhc2gzXzY0LG49W10saT1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBvPSExO2Zvcihjb25zdFtuLHNdb2YgdGhpcy4jeSl7Y29uc3QgYT1zIGluc3RhbmNlb2Ygci5Bbm5vdGF0aW9uRWRpdG9yP3Muc2VyaWFsaXplKCExLGkpOnM7aWYoYSl7dC5zZXQobixhKTtlLnVwZGF0ZShgJHtufToke0pTT04uc3RyaW5naWZ5KGEpfWApO298fD0hIWEuYml0bWFwfX1pZihvKWZvcihjb25zdCBlIG9mIHQudmFsdWVzKCkpZS5iaXRtYXAmJm4ucHVzaChlLmJpdG1hcCk7cmV0dXJuIHQuc2l6ZT4wP3ttYXA6dCxoYXNoOmUuaGV4ZGlnZXN0KCksdHJhbnNmZXJzOm59OmF9fWUuQW5ub3RhdGlvblN0b3JhZ2U9QW5ub3RhdGlvblN0b3JhZ2U7Y2xhc3MgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBleHRlbmRzIEFubm90YXRpb25TdG9yYWdleyNfO2NvbnN0cnVjdG9yKHQpe3N1cGVyKCk7Y29uc3R7bWFwOmUsaGFzaDpuLHRyYW5zZmVyczppfT10LnNlcmlhbGl6YWJsZSxyPXN0cnVjdHVyZWRDbG9uZShlLG51bGwpO3RoaXMuI189e21hcDpyLGhhc2g6bix0cmFuc2ZlcnM6aX19Z2V0IHByaW50KCl7KDAsaS51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBQcmludEFubm90YXRpb25TdG9yYWdlLnByaW50Iil9Z2V0IHNlcmlhbGl6YWJsZSgpe3JldHVybiB0aGlzLiNffX1lLlByaW50QW5ub3RhdGlvblN0b3JhZ2U9UHJpbnRBbm5vdGF0aW9uU3RvcmFnZX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5Bbm5vdGF0aW9uRWRpdG9yPXZvaWQgMDtuKDg5KTtuKDIpO3ZhciBpPW4oMSkscj1uKDE2NCk7Y2xhc3MgQW5ub3RhdGlvbkVkaXRvcnsjUz0hMTsjRT1udWxsOyN4PW51bGw7I3c9dGhpcy5mb2N1c2luLmJpbmQodGhpcyk7I0M9dGhpcy5mb2N1c291dC5iaW5kKHRoaXMpOyNUPSExOyNQPSExOyNrPSExO191aU1hbmFnZXI9bnVsbDsjTT1Bbm5vdGF0aW9uRWRpdG9yLl96SW5kZXgrKztzdGF0aWMgX2NvbG9yTWFuYWdlcj1uZXcgci5Db2xvck1hbmFnZXI7c3RhdGljIF96SW5kZXg9MTtjb25zdHJ1Y3Rvcih0KXt0aGlzLmNvbnN0cnVjdG9yPT09QW5ub3RhdGlvbkVkaXRvciYmKDAsaS51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEFubm90YXRpb25FZGl0b3IuIik7dGhpcy5wYXJlbnQ9dC5wYXJlbnQ7dGhpcy5pZD10LmlkO3RoaXMud2lkdGg9dGhpcy5oZWlnaHQ9bnVsbDt0aGlzLnBhZ2VJbmRleD10LnBhcmVudC5wYWdlSW5kZXg7dGhpcy5uYW1lPXQubmFtZTt0aGlzLmRpdj1udWxsO3RoaXMuX3VpTWFuYWdlcj10LnVpTWFuYWdlcjt0aGlzLmFubm90YXRpb25FbGVtZW50SWQ9bnVsbDt0aGlzLl93aWxsS2VlcEFzcGVjdFJhdGlvPSExO2NvbnN0e3JvdGF0aW9uOmUscmF3RGltczp7cGFnZVdpZHRoOm4scGFnZUhlaWdodDpyLHBhZ2VYOnMscGFnZVk6YX19PXRoaXMucGFyZW50LnZpZXdwb3J0O3RoaXMucm90YXRpb249ZTt0aGlzLnBhZ2VSb3RhdGlvbj0oMzYwK2UtdGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uKSUzNjA7dGhpcy5wYWdlRGltZW5zaW9ucz1bbixyXTt0aGlzLnBhZ2VUcmFuc2xhdGlvbj1bcyxhXTtjb25zdFtvLGxdPXRoaXMucGFyZW50RGltZW5zaW9uczt0aGlzLng9dC54L287dGhpcy55PXQueS9sO3RoaXMuaXNBdHRhY2hlZFRvRE9NPSExO3RoaXMuZGVsZXRlZD0hMX1zdGF0aWMgZ2V0IF9kZWZhdWx0TGluZUNvbG9yKCl7cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsIl9kZWZhdWx0TGluZUNvbG9yIix0aGlzLl9jb2xvck1hbmFnZXIuZ2V0SGV4Q29kZSgiQ2FudmFzVGV4dCIpKX1zdGF0aWMgZGVsZXRlQW5ub3RhdGlvbkVsZW1lbnQodCl7Y29uc3QgZT1uZXcgRmFrZUVkaXRvcih7aWQ6dC5wYXJlbnQuZ2V0TmV4dElkKCkscGFyZW50OnQucGFyZW50LHVpTWFuYWdlcjp0Ll91aU1hbmFnZXJ9KTtlLmFubm90YXRpb25FbGVtZW50SWQ9dC5hbm5vdGF0aW9uRWxlbWVudElkO2UuZGVsZXRlZD0hMDtlLl91aU1hbmFnZXIuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShlKX1zdGF0aWMgaW5pdGlhbGl6ZSh0KXt9c3RhdGljIHVwZGF0ZURlZmF1bHRQYXJhbXModCxlKXt9c3RhdGljIGdldCBkZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKCl7cmV0dXJuW119Z2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpe3JldHVybltdfWFkZENvbW1hbmRzKHQpe3RoaXMuX3VpTWFuYWdlci5hZGRDb21tYW5kcyh0KX1nZXQgY3VycmVudExheWVyKCl7cmV0dXJuIHRoaXMuX3VpTWFuYWdlci5jdXJyZW50TGF5ZXJ9c2V0SW5CYWNrZ3JvdW5kKCl7dGhpcy5kaXYuc3R5bGUuekluZGV4PTB9c2V0SW5Gb3JlZ3JvdW5kKCl7dGhpcy5kaXYuc3R5bGUuekluZGV4PXRoaXMuI019c2V0UGFyZW50KHQpe2lmKG51bGwhPT10KXt0aGlzLnBhZ2VJbmRleD10LnBhZ2VJbmRleDt0aGlzLnBhZ2VEaW1lbnNpb25zPXQucGFnZURpbWVuc2lvbnN9dGhpcy5wYXJlbnQ9dH1mb2N1c2luKHQpe3RoaXMuI1Q/dGhpcy4jVD0hMTp0aGlzLnBhcmVudC5zZXRTZWxlY3RlZCh0aGlzKX1mb2N1c291dCh0KXtpZighdGhpcy5pc0F0dGFjaGVkVG9ET00pcmV0dXJuO2NvbnN0IGU9dC5yZWxhdGVkVGFyZ2V0O2lmKCFlPy5jbG9zZXN0KGAjJHt0aGlzLmlkfWApKXt0LnByZXZlbnREZWZhdWx0KCk7dGhpcy5wYXJlbnQ/LmlzTXVsdGlwbGVTZWxlY3Rpb258fHRoaXMuY29tbWl0T3JSZW1vdmUoKX19Y29tbWl0T3JSZW1vdmUoKXt0aGlzLmlzRW1wdHkoKT90aGlzLnJlbW92ZSgpOnRoaXMuY29tbWl0KCl9Y29tbWl0KCl7dGhpcy5hZGRUb0Fubm90YXRpb25TdG9yYWdlKCl9YWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpe3RoaXMuX3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKHRoaXMpfWRyYWdzdGFydCh0KXtjb25zdCBlPXRoaXMucGFyZW50LmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLnN0YXJ0WD10LmNsaWVudFgtZS54O3RoaXMuc3RhcnRZPXQuY2xpZW50WS1lLnk7dC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dC9wbGFpbiIsdGhpcy5pZCk7dC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZD0ibW92ZSJ9c2V0QXQodCxlLG4saSl7Y29uc3RbcixzXT10aGlzLnBhcmVudERpbWVuc2lvbnM7W24saV09dGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbihuLGkpO3RoaXMueD0odCtuKS9yO3RoaXMueT0oZStpKS9zO3RoaXMuZml4QW5kU2V0UG9zaXRpb24oKX0jUih0LGUsbil7bGV0W2kscl09dDtbZSxuXT10aGlzLnNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKGUsbik7dGhpcy54Kz1lL2k7dGhpcy55Kz1uL3I7dGhpcy5maXhBbmRTZXRQb3NpdGlvbigpfXRyYW5zbGF0ZSh0LGUpe3RoaXMuI1IodGhpcy5wYXJlbnREaW1lbnNpb25zLHQsZSl9dHJhbnNsYXRlSW5QYWdlKHQsZSl7dGhpcy4jUih0aGlzLnBhZ2VEaW1lbnNpb25zLHQsZSk7dGhpcy5kaXYuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJuZWFyZXN0In0pfWZpeEFuZFNldFBvc2l0aW9uKCl7Y29uc3RbdCxlXT10aGlzLnBhZ2VEaW1lbnNpb25zO2xldHt4Om4seTppLHdpZHRoOnIsaGVpZ2h0OnN9PXRoaXM7cio9dDtzKj1lO24qPXQ7aSo9ZTtzd2l0Y2godGhpcy5yb3RhdGlvbil7Y2FzZSAwOm49TWF0aC5tYXgoMCxNYXRoLm1pbih0LXIsbikpO2k9TWF0aC5tYXgoMCxNYXRoLm1pbihlLXMsaSkpO2JyZWFrO2Nhc2UgOTA6bj1NYXRoLm1heCgwLE1hdGgubWluKHQtcyxuKSk7aT1NYXRoLm1pbihlLE1hdGgubWF4KHIsaSkpO2JyZWFrO2Nhc2UgMTgwOm49TWF0aC5taW4odCxNYXRoLm1heChyLG4pKTtpPU1hdGgubWluKGUsTWF0aC5tYXgocyxpKSk7YnJlYWs7Y2FzZSAyNzA6bj1NYXRoLm1pbih0LE1hdGgubWF4KHMsbikpO2k9TWF0aC5tYXgoMCxNYXRoLm1pbihlLXIsaSkpfXRoaXMueD1uL3Q7dGhpcy55PWkvZTt0aGlzLmRpdi5zdHlsZS5sZWZ0PWAkeygxMDAqdGhpcy54KS50b0ZpeGVkKDIpfSVgO3RoaXMuZGl2LnN0eWxlLnRvcD1gJHsoMTAwKnRoaXMueSkudG9GaXhlZCgyKX0lYH1zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih0LGUpe3N3aXRjaCh0aGlzLnBhcmVudFJvdGF0aW9uKXtjYXNlIDkwOnJldHVybltlLC10XTtjYXNlIDE4MDpyZXR1cm5bLXQsLWVdO2Nhc2UgMjcwOnJldHVyblstZSx0XTtkZWZhdWx0OnJldHVyblt0LGVdfX1wYWdlVHJhbnNsYXRpb25Ub1NjcmVlbih0LGUpe3N3aXRjaCh0aGlzLnBhcmVudFJvdGF0aW9uKXtjYXNlIDkwOnJldHVyblstZSx0XTtjYXNlIDE4MDpyZXR1cm5bLXQsLWVdO2Nhc2UgMjcwOnJldHVybltlLC10XTtkZWZhdWx0OnJldHVyblt0LGVdfX1nZXQgcGFyZW50U2NhbGUoKXtyZXR1cm4gdGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJlYWxTY2FsZX1nZXQgcGFyZW50Um90YXRpb24oKXtyZXR1cm4odGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uK3RoaXMucGFnZVJvdGF0aW9uKSUzNjB9Z2V0IHBhcmVudERpbWVuc2lvbnMoKXtjb25zdHtyZWFsU2NhbGU6dH09dGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLFtlLG5dPXRoaXMucGFnZURpbWVuc2lvbnM7cmV0dXJuW2UqdCxuKnRdfXNldERpbXModCxlKXtjb25zdFtuLGldPXRoaXMucGFyZW50RGltZW5zaW9uczt0aGlzLmRpdi5zdHlsZS53aWR0aD1gJHsoMTAwKnQvbikudG9GaXhlZCgyKX0lYDt0aGlzLiNTfHwodGhpcy5kaXYuc3R5bGUuaGVpZ2h0PWAkeygxMDAqZS9pKS50b0ZpeGVkKDIpfSVgKX1maXhEaW1zKCl7Y29uc3R7c3R5bGU6dH09dGhpcy5kaXYse2hlaWdodDplLHdpZHRoOm59PXQsaT1uLmVuZHNXaXRoKCIlIikscj0hdGhpcy4jUyYmZS5lbmRzV2l0aCgiJSIpO2lmKGkmJnIpcmV0dXJuO2NvbnN0W3MsYV09dGhpcy5wYXJlbnREaW1lbnNpb25zO2l8fCh0LndpZHRoPWAkeygxMDAqcGFyc2VGbG9hdChuKS9zKS50b0ZpeGVkKDIpfSVgKTt0aGlzLiNTfHxyfHwodC5oZWlnaHQ9YCR7KDEwMCpwYXJzZUZsb2F0KGUpL2EpLnRvRml4ZWQoMil9JWApfWdldEluaXRpYWxUcmFuc2xhdGlvbigpe3JldHVyblswLDBdfSNGKCl7aWYodGhpcy4jRSlyZXR1cm47dGhpcy4jRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLiNFLmNsYXNzTGlzdC5hZGQoInJlc2l6ZXJzIik7Y29uc3QgdD1bInRvcExlZnQiLCJ0b3BSaWdodCIsImJvdHRvbVJpZ2h0IiwiYm90dG9tTGVmdCJdO3RoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW98fHQucHVzaCgidG9wTWlkZGxlIiwibWlkZGxlUmlnaHQiLCJib3R0b21NaWRkbGUiLCJtaWRkbGVMZWZ0Iik7Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLiNFLmFwcGVuZCh0KTt0LmNsYXNzTGlzdC5hZGQoInJlc2l6ZXIiLGUpO3QuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLHRoaXMuI0kuYmluZCh0aGlzLGUpKX10aGlzLmRpdi5wcmVwZW5kKHRoaXMuI0UpfSNJKHQsZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuI3g9W2UuY2xpZW50WCxlLmNsaWVudFldO2NvbnN0IG49dGhpcy4jRC5iaW5kKHRoaXMsdCksaT10aGlzLmRpdi5kcmFnZ2FibGU7dGhpcy5kaXYuZHJhZ2dhYmxlPSExO2NvbnN0IHI9YHJlc2l6aW5nJHt0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7dC5zbGljZSgxKX1gO3RoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKHIpO2NvbnN0IHM9e3Bhc3NpdmU6ITAsY2FwdHVyZTohMH07d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixuLHMpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLCgoKT0+e3RoaXMuX3VpTWFuYWdlci5zdG9wVW5kb0FjY3VtdWxhdGlvbigpO3RoaXMuZGl2LmRyYWdnYWJsZT1pO3RoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QucmVtb3ZlKHIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsbixzKX0pLHtvbmNlOiEwfSl9I0QodCxlKXtjb25zdHtjbGllbnRYOm4sY2xpZW50WTpyfT1lLHM9bi10aGlzLiN4WzBdLGE9ci10aGlzLiN4WzFdO3RoaXMuI3hbMF09bjt0aGlzLiN4WzFdPXI7Y29uc3RbbyxsXT10aGlzLnBhcmVudERpbWVuc2lvbnMsYz10aGlzLngsaD10aGlzLnksZD10aGlzLndpZHRoLHU9dGhpcy5oZWlnaHQscD1Bbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFL28sZj1Bbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFL2w7bGV0IGc7Y29uc3Qgcm91bmQ9dD0+TWF0aC5yb3VuZCgxZTQqdCkvMWU0LHVwZGF0ZVBvc2l0aW9uPSh0LGUpPT57Y29uc3RbbixpXT10aGlzLnBhcmVudERpbWVuc2lvbnM7dGhpcy5zZXREaW1zKG4qdCxpKmUpO3RoaXMuZml4QW5kU2V0UG9zaXRpb24oKX07c3dpdGNoKHQpe2Nhc2UidG9wTGVmdCI6e2lmKE1hdGguc2lnbihzKSpNYXRoLnNpZ24oYSk8MClyZXR1cm47Y29uc3QgdD1NYXRoLmh5cG90KHMsYSksZT1NYXRoLmh5cG90KGQqbyx1KmwpLG49cm91bmQoYytkKSxpPXJvdW5kKGgrdSkscj1NYXRoLm1heChNYXRoLm1pbigxLU1hdGguc2lnbihzKSoodC9lKSwxL2QsMS91KSxwL2QsZi91KSxtPXJvdW5kKGQqciksYj1yb3VuZCh1KnIpLHY9bi1tLHk9aS1iO2c9KCk9Pnt0aGlzLndpZHRoPW07dGhpcy5oZWlnaHQ9Yjt0aGlzLng9djt0aGlzLnk9eTt1cGRhdGVQb3NpdGlvbihtLGIpfTticmVha31jYXNlInRvcE1pZGRsZSI6e2NvbnN0IHQ9cm91bmQodGhpcy55K3UpLGU9cm91bmQoTWF0aC5tYXgoZixNYXRoLm1pbigxLHUtYS9sKSkpLG49dC1lO2c9KCk9Pnt0aGlzLmhlaWdodD1lO3RoaXMueT1uO3VwZGF0ZVBvc2l0aW9uKGQsZSl9O2JyZWFrfWNhc2UidG9wUmlnaHQiOntpZihNYXRoLnNpZ24ocykqTWF0aC5zaWduKGEpPjApcmV0dXJuO2NvbnN0IHQ9TWF0aC5oeXBvdChzLGEpLGU9TWF0aC5oeXBvdCh0aGlzLndpZHRoKm8sdGhpcy5oZWlnaHQqbCksbj1yb3VuZChoK3RoaXMuaGVpZ2h0KSxpPU1hdGgubWF4KE1hdGgubWluKDErTWF0aC5zaWduKHMpKih0L2UpLDEvZCwxL3UpLHAvZCxmL3UpLHI9cm91bmQoZCppKSxjPXJvdW5kKHUqaSksbT1uLWM7Zz0oKT0+e3RoaXMud2lkdGg9cjt0aGlzLmhlaWdodD1jO3RoaXMueT1tO3VwZGF0ZVBvc2l0aW9uKHIsYyl9O2JyZWFrfWNhc2UibWlkZGxlUmlnaHQiOntjb25zdCB0PXJvdW5kKE1hdGgubWF4KHAsTWF0aC5taW4oMSxkK3MvbykpKTtnPSgpPT57dGhpcy53aWR0aD10O3VwZGF0ZVBvc2l0aW9uKHQsdSl9O2JyZWFrfWNhc2UiYm90dG9tUmlnaHQiOntpZihNYXRoLnNpZ24ocykqTWF0aC5zaWduKGEpPDApcmV0dXJuO2NvbnN0IHQ9TWF0aC5oeXBvdChzLGEpLGU9TWF0aC5oeXBvdCh0aGlzLndpZHRoKm8sdGhpcy5oZWlnaHQqbCksbj1NYXRoLm1heChNYXRoLm1pbigxK01hdGguc2lnbihzKSoodC9lKSwxL2QsMS91KSxwL2QsZi91KSxpPXJvdW5kKGQqbikscj1yb3VuZCh1Km4pO2c9KCk9Pnt0aGlzLndpZHRoPWk7dGhpcy5oZWlnaHQ9cjt1cGRhdGVQb3NpdGlvbihpLHIpfTticmVha31jYXNlImJvdHRvbU1pZGRsZSI6e2NvbnN0IHQ9cm91bmQoTWF0aC5tYXgoZixNYXRoLm1pbigxLHUrYS9sKSkpO2c9KCk9Pnt0aGlzLmhlaWdodD10O3VwZGF0ZVBvc2l0aW9uKGQsdCl9O2JyZWFrfWNhc2UiYm90dG9tTGVmdCI6e2lmKE1hdGguc2lnbihzKSpNYXRoLnNpZ24oYSk+MClyZXR1cm47Y29uc3QgdD1NYXRoLmh5cG90KHMsYSksZT1NYXRoLmh5cG90KHRoaXMud2lkdGgqbyx0aGlzLmhlaWdodCpsKSxuPXJvdW5kKGMrdGhpcy53aWR0aCksaT1NYXRoLm1heChNYXRoLm1pbigxLU1hdGguc2lnbihzKSoodC9lKSwxL2QsMS91KSxwL2QsZi91KSxyPXJvdW5kKGQqaSksaD1yb3VuZCh1KmkpLG09bi1yO2c9KCk9Pnt0aGlzLndpZHRoPXI7dGhpcy5oZWlnaHQ9aDt0aGlzLng9bTt1cGRhdGVQb3NpdGlvbihyLGgpfTticmVha31jYXNlIm1pZGRsZUxlZnQiOntjb25zdCB0PXJvdW5kKGMrZCksZT1yb3VuZChNYXRoLm1heChwLE1hdGgubWluKDEsZC1zL28pKSksbj10LWU7Zz0oKT0+e3RoaXMud2lkdGg9ZTt0aGlzLng9bjt1cGRhdGVQb3NpdGlvbihlLHUpfTticmVha319dGhpcy5hZGRDb21tYW5kcyh7Y21kOmcsdW5kbzooKT0+e3RoaXMud2lkdGg9ZDt0aGlzLmhlaWdodD11O3RoaXMueD1jO3RoaXMueT1oO3VwZGF0ZVBvc2l0aW9uKGQsdSl9LG11c3RFeGVjOiEwLHR5cGU6aS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5SRVNJWkUsb3ZlcndyaXRlSWZTYW1lVHlwZTohMCxrZWVwVW5kbzohMH0pfXJlbmRlcigpe3RoaXMuZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuZGl2LnNldEF0dHJpYnV0ZSgiZGF0YS1lZGl0b3Itcm90YXRpb24iLCgzNjAtdGhpcy5yb3RhdGlvbiklMzYwKTt0aGlzLmRpdi5jbGFzc05hbWU9dGhpcy5uYW1lO3RoaXMuZGl2LnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWQpO3RoaXMuZGl2LnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLDApO3RoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7dGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsdGhpcy4jdyk7dGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNvdXQiLHRoaXMuI0MpO2NvbnN0W3QsZV09dGhpcy5wYXJlbnREaW1lbnNpb25zO2lmKHRoaXMucGFyZW50Um90YXRpb24lMTgwIT0wKXt0aGlzLmRpdi5zdHlsZS5tYXhXaWR0aD1gJHsoMTAwKmUvdCkudG9GaXhlZCgyKX0lYDt0aGlzLmRpdi5zdHlsZS5tYXhIZWlnaHQ9YCR7KDEwMCp0L2UpLnRvRml4ZWQoMil9JWB9Y29uc3RbbixpXT10aGlzLmdldEluaXRpYWxUcmFuc2xhdGlvbigpO3RoaXMudHJhbnNsYXRlKG4saSk7KDAsci5iaW5kRXZlbnRzKSh0aGlzLHRoaXMuZGl2LFsiZHJhZ3N0YXJ0IiwicG9pbnRlcmRvd24iXSk7cmV0dXJuIHRoaXMuZGl2fXBvaW50ZXJkb3duKHQpe2NvbnN0e2lzTWFjOmV9PWkuRmVhdHVyZVRlc3QucGxhdGZvcm07aWYoMCE9PXQuYnV0dG9ufHx0LmN0cmxLZXkmJmUpdC5wcmV2ZW50RGVmYXVsdCgpO2Vsc2V7dC5jdHJsS2V5JiYhZXx8dC5zaGlmdEtleXx8dC5tZXRhS2V5JiZlP3RoaXMucGFyZW50LnRvZ2dsZVNlbGVjdGVkKHRoaXMpOnRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO3RoaXMuI1Q9ITB9fWdldFJlY3QodCxlKXtjb25zdCBuPXRoaXMucGFyZW50U2NhbGUsW2kscl09dGhpcy5wYWdlRGltZW5zaW9ucyxbcyxhXT10aGlzLnBhZ2VUcmFuc2xhdGlvbixvPXQvbixsPWUvbixjPXRoaXMueCppLGg9dGhpcy55KnIsZD10aGlzLndpZHRoKmksdT10aGlzLmhlaWdodCpyO3N3aXRjaCh0aGlzLnJvdGF0aW9uKXtjYXNlIDA6cmV0dXJuW2MrbytzLHItaC1sLXUrYSxjK28rZCtzLHItaC1sK2FdO2Nhc2UgOTA6cmV0dXJuW2MrbCtzLHItaCtvK2EsYytsK3UrcyxyLWgrbytkK2FdO2Nhc2UgMTgwOnJldHVybltjLW8tZCtzLHItaCtsK2EsYy1vK3Msci1oK2wrdSthXTtjYXNlIDI3MDpyZXR1cm5bYy1sLXUrcyxyLWgtby1kK2EsYy1sK3Msci1oLW8rYV07ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcm90YXRpb24iKX19Z2V0UmVjdEluQ3VycmVudENvb3Jkcyh0LGUpe2NvbnN0W24saSxyLHNdPXQsYT1yLW4sbz1zLWk7c3dpdGNoKHRoaXMucm90YXRpb24pe2Nhc2UgMDpyZXR1cm5bbixlLXMsYSxvXTtjYXNlIDkwOnJldHVybltuLGUtaSxvLGFdO2Nhc2UgMTgwOnJldHVybltyLGUtaSxhLG9dO2Nhc2UgMjcwOnJldHVybltyLGUtcyxvLGFdO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJvdGF0aW9uIil9fW9uY2VBZGRlZCgpe31pc0VtcHR5KCl7cmV0dXJuITF9ZW5hYmxlRWRpdE1vZGUoKXt0aGlzLiNrPSEwfWRpc2FibGVFZGl0TW9kZSgpe3RoaXMuI2s9ITF9aXNJbkVkaXRNb2RlKCl7cmV0dXJuIHRoaXMuI2t9c2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKXtyZXR1cm4hMX1uZWVkc1RvQmVSZWJ1aWx0KCl7cmV0dXJuIHRoaXMuZGl2JiYhdGhpcy5pc0F0dGFjaGVkVG9ET019cmVidWlsZCgpe3RoaXMuZGl2Py5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIix0aGlzLiN3KTt0aGlzLmRpdj8uYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNvdXQiLHRoaXMuI0MpfXNlcmlhbGl6ZSgpeygwLGkudW5yZWFjaGFibGUpKCJBbiBlZGl0b3IgbXVzdCBiZSBzZXJpYWxpemFibGUiKX1zdGF0aWMgZGVzZXJpYWxpemUodCxlLG4pe2NvbnN0IGk9bmV3IHRoaXMucHJvdG90eXBlLmNvbnN0cnVjdG9yKHtwYXJlbnQ6ZSxpZDplLmdldE5leHRJZCgpLHVpTWFuYWdlcjpufSk7aS5yb3RhdGlvbj10LnJvdGF0aW9uO2NvbnN0W3Isc109aS5wYWdlRGltZW5zaW9ucyxbYSxvLGwsY109aS5nZXRSZWN0SW5DdXJyZW50Q29vcmRzKHQucmVjdCxzKTtpLng9YS9yO2kueT1vL3M7aS53aWR0aD1sL3I7aS5oZWlnaHQ9Yy9zO3JldHVybiBpfXJlbW92ZSgpe3RoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLHRoaXMuI3cpO3RoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0Iix0aGlzLiNDKTt0aGlzLmlzRW1wdHkoKXx8dGhpcy5jb21taXQoKTt0aGlzLnBhcmVudD90aGlzLnBhcmVudC5yZW1vdmUodGhpcyk6dGhpcy5fdWlNYW5hZ2VyLnJlbW92ZUVkaXRvcih0aGlzKX1nZXQgaXNSZXNpemFibGUoKXtyZXR1cm4hMX1tYWtlUmVzaXphYmxlKCl7aWYodGhpcy5pc1Jlc2l6YWJsZSl7dGhpcy4jRigpO3RoaXMuI0UuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIil9fXNlbGVjdCgpe3RoaXMubWFrZVJlc2l6YWJsZSgpO3RoaXMuZGl2Py5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZEVkaXRvciIpfXVuc2VsZWN0KCl7dGhpcy4jRT8uY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7dGhpcy5kaXY/LmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkRWRpdG9yIik7dGhpcy5kaXY/LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJiZ0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyLmRpdi5mb2N1cygpfXVwZGF0ZVBhcmFtcyh0LGUpe31kaXNhYmxlRWRpdGluZygpe31lbmFibGVFZGl0aW5nKCl7fWVudGVySW5FZGl0TW9kZSgpe31nZXQgY29udGVudERpdigpe3JldHVybiB0aGlzLmRpdn1nZXQgaXNFZGl0aW5nKCl7cmV0dXJuIHRoaXMuI1B9c2V0IGlzRWRpdGluZyh0KXt0aGlzLiNQPXQ7aWYodGhpcy5wYXJlbnQpaWYodCl7dGhpcy5wYXJlbnQuc2V0U2VsZWN0ZWQodGhpcyk7dGhpcy5wYXJlbnQuc2V0QWN0aXZlRWRpdG9yKHRoaXMpfWVsc2UgdGhpcy5wYXJlbnQuc2V0QWN0aXZlRWRpdG9yKG51bGwpfXNldEFzcGVjdFJhdGlvKHQsZSl7dGhpcy4jUz0hMDtjb25zdCBuPXQvZSx7c3R5bGU6aX09dGhpcy5kaXY7aS5hc3BlY3RSYXRpbz1uO2kuaGVpZ2h0PSJhdXRvIn1zdGF0aWMgZ2V0IE1JTl9TSVpFKCl7cmV0dXJuIDE2fX1lLkFubm90YXRpb25FZGl0b3I9QW5ub3RhdGlvbkVkaXRvcjtjbGFzcyBGYWtlRWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTt0aGlzLmFubm90YXRpb25FbGVtZW50SWQ9dC5hbm5vdGF0aW9uRWxlbWVudElkO3RoaXMuZGVsZXRlZD0hMH1zZXJpYWxpemUoKXtyZXR1cm57aWQ6dGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLGRlbGV0ZWQ6ITAscGFnZUluZGV4OnRoaXMucGFnZUluZGV4fX19fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLktleWJvYXJkTWFuYWdlcj1lLkNvbW1hbmRNYW5hZ2VyPWUuQ29sb3JNYW5hZ2VyPWUuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcj12b2lkIDA7ZS5iaW5kRXZlbnRzPWZ1bmN0aW9uIGJpbmRFdmVudHModCxlLG4pe2Zvcihjb25zdCBpIG9mIG4pZS5hZGRFdmVudExpc3RlbmVyKGksdFtpXS5iaW5kKHQpKX07ZS5vcGFjaXR5VG9IZXg9ZnVuY3Rpb24gb3BhY2l0eVRvSGV4KHQpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgubWluKDI1NSxNYXRoLm1heCgxLDI1NSp0KSkpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9O24oMik7big4OSk7bigxMjUpO24oMTM1KTtuKDEzNyk7bigxNDApO24oMTQyKTtuKDE0NCk7bigxNDYpO24oMTY1KTt2YXIgaT1uKDEpLHI9bigxNjcpO2NsYXNzIElkTWFuYWdlcnsjTz0wO2dldElkKCl7cmV0dXJuYCR7aS5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4fSR7dGhpcy4jTysrfWB9fWNsYXNzIEltYWdlTWFuYWdlcnsjTD0oMCxpLmdldFV1aWQpKCk7I089MDsjTj1udWxsO2FzeW5jI0IodCxlKXt0aGlzLiNOfHw9bmV3IE1hcDtsZXQgbj10aGlzLiNOLmdldCh0KTtpZihudWxsPT09bilyZXR1cm4gbnVsbDtpZihuPy5iaXRtYXApe24ucmVmQ291bnRlcis9MTtyZXR1cm4gbn10cnl7bnx8PXtiaXRtYXA6bnVsbCxpZDpgaW1hZ2VfJHt0aGlzLiNMfV8ke3RoaXMuI08rK31gLHJlZkNvdW50ZXI6MCxpc1N2ZzohMX07bGV0IHQ7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtuLnVybD1lO2NvbnN0IGk9YXdhaXQgZmV0Y2goZSk7aWYoIWkub2spdGhyb3cgbmV3IEVycm9yKGkuc3RhdHVzVGV4dCk7dD1hd2FpdCBpLmJsb2IoKX1lbHNlIHQ9bi5maWxlPWU7aWYoImltYWdlL3N2Zyt4bWwiPT09dC50eXBlKXtjb25zdCBlPW5ldyBGaWxlUmVhZGVyLGk9bmV3IEltYWdlLHI9bmV3IFByb21pc2UoKCh0LHIpPT57aS5vbmxvYWQ9KCk9PntuLmJpdG1hcD1pO24uaXNTdmc9ITA7dCgpfTtlLm9ubG9hZD0oKT0+e2kuc3JjPW4uc3ZnVXJsPWUucmVzdWx0fTtpLm9uZXJyb3I9ZS5vbmVycm9yPXJ9KSk7ZS5yZWFkQXNEYXRhVVJMKHQpO2F3YWl0IHJ9ZWxzZSBuLmJpdG1hcD1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcCh0KTtuLnJlZkNvdW50ZXI9MX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpO249bnVsbH10aGlzLiNOLnNldCh0LG4pO24mJnRoaXMuI04uc2V0KG4uaWQsbik7cmV0dXJuIG59YXN5bmMgZ2V0RnJvbUZpbGUodCl7Y29uc3R7bGFzdE1vZGlmaWVkOmUsbmFtZTpuLHNpemU6aSx0eXBlOnJ9PXQ7cmV0dXJuIHRoaXMuI0IoYCR7ZX1fJHtufV8ke2l9XyR7cn1gLHQpfWFzeW5jIGdldEZyb21VcmwodCl7cmV0dXJuIHRoaXMuI0IodCx0KX1hc3luYyBnZXRGcm9tSWQodCl7dGhpcy4jTnx8PW5ldyBNYXA7Y29uc3QgZT10aGlzLiNOLmdldCh0KTtpZighZSlyZXR1cm4gbnVsbDtpZihlLmJpdG1hcCl7ZS5yZWZDb3VudGVyKz0xO3JldHVybiBlfXJldHVybiBlLmZpbGU/dGhpcy5nZXRGcm9tRmlsZShlLmZpbGUpOnRoaXMuZ2V0RnJvbVVybChlLnVybCl9Z2V0U3ZnVXJsKHQpe2NvbnN0IGU9dGhpcy4jTi5nZXQodCk7cmV0dXJuIGU/LmlzU3ZnP2Uuc3ZnVXJsOm51bGx9ZGVsZXRlSWQodCl7dGhpcy4jTnx8PW5ldyBNYXA7Y29uc3QgZT10aGlzLiNOLmdldCh0KTtpZihlKXtlLnJlZkNvdW50ZXItPTE7MD09PWUucmVmQ291bnRlciYmKGUuYml0bWFwPW51bGwpfX1pc1ZhbGlkSWQodCl7cmV0dXJuIHQuc3RhcnRzV2l0aChgaW1hZ2VfJHt0aGlzLiNMfV9gKX19Y2xhc3MgQ29tbWFuZE1hbmFnZXJ7I2o9W107I1U9ITE7I3o7I0g9LTE7Y29uc3RydWN0b3IoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MTI4O3RoaXMuI3o9dH1hZGQodCl7bGV0e2NtZDplLHVuZG86bixtdXN0RXhlYzppLHR5cGU6cj1OYU4sb3ZlcndyaXRlSWZTYW1lVHlwZTpzPSExLGtlZXBVbmRvOmE9ITF9PXQ7aSYmZSgpO2lmKHRoaXMuI1UpcmV0dXJuO2NvbnN0IG89e2NtZDplLHVuZG86bix0eXBlOnJ9O2lmKC0xPT09dGhpcy4jSCl7dGhpcy4jai5sZW5ndGg+MCYmKHRoaXMuI2oubGVuZ3RoPTApO3RoaXMuI0g9MDt0aGlzLiNqLnB1c2gobyk7cmV0dXJufWlmKHMmJnRoaXMuI2pbdGhpcy4jSF0udHlwZT09PXIpe2EmJihvLnVuZG89dGhpcy4jalt0aGlzLiNIXS51bmRvKTt0aGlzLiNqW3RoaXMuI0hdPW87cmV0dXJufWNvbnN0IGw9dGhpcy4jSCsxO2lmKGw9PT10aGlzLiN6KXRoaXMuI2ouc3BsaWNlKDAsMSk7ZWxzZXt0aGlzLiNIPWw7bDx0aGlzLiNqLmxlbmd0aCYmdGhpcy4jai5zcGxpY2UobCl9dGhpcy4jai5wdXNoKG8pfXN0b3BVbmRvQWNjdW11bGF0aW9uKCl7LTEhPT10aGlzLiNIJiYodGhpcy4jalt0aGlzLiNIXS50eXBlPU5hTil9dW5kbygpe2lmKC0xIT09dGhpcy4jSCl7dGhpcy4jVT0hMDt0aGlzLiNqW3RoaXMuI0hdLnVuZG8oKTt0aGlzLiNVPSExO3RoaXMuI0gtPTF9fXJlZG8oKXtpZih0aGlzLiNIPHRoaXMuI2oubGVuZ3RoLTEpe3RoaXMuI0grPTE7dGhpcy4jVT0hMDt0aGlzLiNqW3RoaXMuI0hdLmNtZCgpO3RoaXMuI1U9ITF9fWhhc1NvbWV0aGluZ1RvVW5kbygpe3JldHVybi0xIT09dGhpcy4jSH1oYXNTb21ldGhpbmdUb1JlZG8oKXtyZXR1cm4gdGhpcy4jSDx0aGlzLiNqLmxlbmd0aC0xfWRlc3Ryb3koKXt0aGlzLiNqPW51bGx9fWUuQ29tbWFuZE1hbmFnZXI9Q29tbWFuZE1hbmFnZXI7Y2xhc3MgS2V5Ym9hcmRNYW5hZ2Vye2NvbnN0cnVjdG9yKHQpe3RoaXMuYnVmZmVyPVtdO3RoaXMuY2FsbGJhY2tzPW5ldyBNYXA7dGhpcy5hbGxLZXlzPW5ldyBTZXQ7Y29uc3R7aXNNYWM6ZX09aS5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtmb3IoY29uc3RbbixpLHI9e31db2YgdClmb3IoY29uc3QgdCBvZiBuKXtjb25zdCBuPXQuc3RhcnRzV2l0aCgibWFjKyIpO2lmKGUmJm4pe3RoaXMuY2FsbGJhY2tzLnNldCh0LnNsaWNlKDQpLHtjYWxsYmFjazppLG9wdGlvbnM6cn0pO3RoaXMuYWxsS2V5cy5hZGQodC5zcGxpdCgiKyIpLmF0KC0xKSl9ZWxzZSBpZighZSYmIW4pe3RoaXMuY2FsbGJhY2tzLnNldCh0LHtjYWxsYmFjazppLG9wdGlvbnM6cn0pO3RoaXMuYWxsS2V5cy5hZGQodC5zcGxpdCgiKyIpLmF0KC0xKSl9fX0jcSh0KXt0LmFsdEtleSYmdGhpcy5idWZmZXIucHVzaCgiYWx0Iik7dC5jdHJsS2V5JiZ0aGlzLmJ1ZmZlci5wdXNoKCJjdHJsIik7dC5tZXRhS2V5JiZ0aGlzLmJ1ZmZlci5wdXNoKCJtZXRhIik7dC5zaGlmdEtleSYmdGhpcy5idWZmZXIucHVzaCgic2hpZnQiKTt0aGlzLmJ1ZmZlci5wdXNoKHQua2V5KTtjb25zdCBlPXRoaXMuYnVmZmVyLmpvaW4oIisiKTt0aGlzLmJ1ZmZlci5sZW5ndGg9MDtyZXR1cm4gZX1leGVjKHQsZSl7aWYoIXRoaXMuYWxsS2V5cy5oYXMoZS5rZXkpKXJldHVybjtjb25zdCBuPXRoaXMuY2FsbGJhY2tzLmdldCh0aGlzLiNxKGUpKTtpZighbilyZXR1cm47Y29uc3R7Y2FsbGJhY2s6aSxvcHRpb25zOntidWJibGVzOnI9ITEsYXJnczpzPVtdLGNoZWNrZXI6YT1udWxsfX09bjtpZighYXx8YSh0LGUpKXtpLmJpbmQodCwuLi5zKSgpO2lmKCFyKXtlLnN0b3BQcm9wYWdhdGlvbigpO2UucHJldmVudERlZmF1bHQoKX19fX1lLktleWJvYXJkTWFuYWdlcj1LZXlib2FyZE1hbmFnZXI7Y2xhc3MgQ29sb3JNYW5hZ2Vye3N0YXRpYyBfY29sb3JzTWFwcGluZz1uZXcgTWFwKFtbIkNhbnZhc1RleHQiLFswLDAsMF1dLFsiQ2FudmFzIixbMjU1LDI1NSwyNTVdXV0pO2dldCBfY29sb3JzKCl7Y29uc3QgdD1uZXcgTWFwKFtbIkNhbnZhc1RleHQiLG51bGxdLFsiQ2FudmFzIixudWxsXV0pOygwLHIuZ2V0Q29sb3JWYWx1ZXMpKHQpO3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJfY29sb3JzIix0KX1jb252ZXJ0KHQpe2NvbnN0IGU9KDAsci5nZXRSR0IpKHQpO2lmKCF3aW5kb3cubWF0Y2hNZWRpYSgiKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSkiKS5tYXRjaGVzKXJldHVybiBlO2Zvcihjb25zdFt0LG5db2YgdGhpcy5fY29sb3JzKWlmKG4uZXZlcnkoKCh0LG4pPT50PT09ZVtuXSkpKXJldHVybiBDb2xvck1hbmFnZXIuX2NvbG9yc01hcHBpbmcuZ2V0KHQpO3JldHVybiBlfWdldEhleENvZGUodCl7Y29uc3QgZT10aGlzLl9jb2xvcnMuZ2V0KHQpO3JldHVybiBlP2kuVXRpbC5tYWtlSGV4Q29sb3IoLi4uZSk6dH19ZS5Db2xvck1hbmFnZXI9Q29sb3JNYW5hZ2VyO2NsYXNzIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXJ7I1c9bnVsbDsjRz1uZXcgTWFwOyNWPW5ldyBNYXA7IyQ9bnVsbDsjWD1uZXcgQ29tbWFuZE1hbmFnZXI7I0s9MDsjWT1uZXcgU2V0OyNKPW51bGw7I1E9bmV3IFNldDsjWj1udWxsOyN0dD1udWxsOyNldD1uZXcgSWRNYW5hZ2VyOyNudD0hMTsjaXQ9aS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FOyNydD1uZXcgU2V0OyNzdD1udWxsOyNhdD10aGlzLmNvcHkuYmluZCh0aGlzKTsjb3Q9dGhpcy5jdXQuYmluZCh0aGlzKTsjbHQ9dGhpcy5wYXN0ZS5iaW5kKHRoaXMpOyNjdD10aGlzLmtleWRvd24uYmluZCh0aGlzKTsjaHQ9dGhpcy5vbkVkaXRpbmdBY3Rpb24uYmluZCh0aGlzKTsjZHQ9dGhpcy5vblBhZ2VDaGFuZ2luZy5iaW5kKHRoaXMpOyN1dD10aGlzLm9uU2NhbGVDaGFuZ2luZy5iaW5kKHRoaXMpOyNwdD10aGlzLm9uUm90YXRpb25DaGFuZ2luZy5iaW5kKHRoaXMpOyNmdD17aXNFZGl0aW5nOiExLGlzRW1wdHk6ITAsaGFzU29tZXRoaW5nVG9VbmRvOiExLGhhc1NvbWV0aGluZ1RvUmVkbzohMSxoYXNTZWxlY3RlZEVkaXRvcjohMX07I2d0PVswLDBdOyNtdD1udWxsOyNidD1udWxsO3N0YXRpYyBUUkFOU0xBVEVfU01BTEw9MTtzdGF0aWMgVFJBTlNMQVRFX0JJRz0xMDtzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKXtjb25zdCB0PUFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlLGFycm93Q2hlY2tlcj10PT57Y29uc3R7YWN0aXZlRWxlbWVudDplfT1kb2N1bWVudDtyZXR1cm4gZSYmdC4jYnQuY29udGFpbnMoZSkmJnQuaGFzU29tZXRoaW5nVG9Db250cm9sKCl9LGU9dGhpcy5UUkFOU0xBVEVfU01BTEwsbj10aGlzLlRSQU5TTEFURV9CSUc7cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsIl9rZXlib2FyZE1hbmFnZXIiLG5ldyBLZXlib2FyZE1hbmFnZXIoW1tbImN0cmwrYSIsIm1hYyttZXRhK2EiXSx0LnNlbGVjdEFsbF0sW1siY3RybCt6IiwibWFjK21ldGEreiJdLHQudW5kb10sW1siY3RybCt5IiwiY3RybCtzaGlmdCt6IiwibWFjK21ldGErc2hpZnQreiIsImN0cmwrc2hpZnQrWiIsIm1hYyttZXRhK3NoaWZ0K1oiXSx0LnJlZG9dLFtbIkJhY2tzcGFjZSIsImFsdCtCYWNrc3BhY2UiLCJjdHJsK0JhY2tzcGFjZSIsInNoaWZ0K0JhY2tzcGFjZSIsIm1hYytCYWNrc3BhY2UiLCJtYWMrYWx0K0JhY2tzcGFjZSIsIm1hYytjdHJsK0JhY2tzcGFjZSIsIkRlbGV0ZSIsImN0cmwrRGVsZXRlIiwic2hpZnQrRGVsZXRlIiwibWFjK0RlbGV0ZSJdLHQuZGVsZXRlXSxbWyJFc2NhcGUiLCJtYWMrRXNjYXBlIl0sdC51bnNlbGVjdEFsbF0sW1siQXJyb3dMZWZ0IiwibWFjK0Fycm93TGVmdCJdLHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLHthcmdzOlstZSwwXSxjaGVja2VyOmFycm93Q2hlY2tlcn1dLFtbImN0cmwrQXJyb3dMZWZ0IiwibWFjK3NoaWZ0K0Fycm93TGVmdCJdLHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLHthcmdzOlstbiwwXSxjaGVja2VyOmFycm93Q2hlY2tlcn1dLFtbIkFycm93UmlnaHQiLCJtYWMrQXJyb3dSaWdodCJdLHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLHthcmdzOltlLDBdLGNoZWNrZXI6YXJyb3dDaGVja2VyfV0sW1siY3RybCtBcnJvd1JpZ2h0IiwibWFjK3NoaWZ0K0Fycm93UmlnaHQiXSx0LnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycyx7YXJnczpbbiwwXSxjaGVja2VyOmFycm93Q2hlY2tlcn1dLFtbIkFycm93VXAiLCJtYWMrQXJyb3dVcCJdLHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLHthcmdzOlswLC1lXSxjaGVja2VyOmFycm93Q2hlY2tlcn1dLFtbImN0cmwrQXJyb3dVcCIsIm1hYytzaGlmdCtBcnJvd1VwIl0sdC50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMse2FyZ3M6WzAsLW5dLGNoZWNrZXI6YXJyb3dDaGVja2VyfV0sW1siQXJyb3dEb3duIiwibWFjK0Fycm93RG93biJdLHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLHthcmdzOlswLGVdLGNoZWNrZXI6YXJyb3dDaGVja2VyfV0sW1siY3RybCtBcnJvd0Rvd24iLCJtYWMrc2hpZnQrQXJyb3dEb3duIl0sdC50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMse2FyZ3M6WzAsbl0sY2hlY2tlcjphcnJvd0NoZWNrZXJ9XV0pKX1jb25zdHJ1Y3Rvcih0LGUsbixpKXt0aGlzLiNidD10O3RoaXMuI1o9ZTt0aGlzLiNaLl9vbigiZWRpdGluZ2FjdGlvbiIsdGhpcy4jaHQpO3RoaXMuI1ouX29uKCJwYWdlY2hhbmdpbmciLHRoaXMuI2R0KTt0aGlzLiNaLl9vbigic2NhbGVjaGFuZ2luZyIsdGhpcy4jdXQpO3RoaXMuI1ouX29uKCJyb3RhdGlvbmNoYW5naW5nIix0aGlzLiNwdCk7dGhpcy4jJD1uLmFubm90YXRpb25TdG9yYWdlO3RoaXMuI3R0PW4uZmlsdGVyRmFjdG9yeTt0aGlzLiNzdD1pO3RoaXMudmlld1BhcmFtZXRlcnM9e3JlYWxTY2FsZTpyLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyxyb3RhdGlvbjowfX1kZXN0cm95KCl7dGhpcy4jdnQoKTt0aGlzLiNaLl9vZmYoImVkaXRpbmdhY3Rpb24iLHRoaXMuI2h0KTt0aGlzLiNaLl9vZmYoInBhZ2VjaGFuZ2luZyIsdGhpcy4jZHQpO3RoaXMuI1ouX29mZigic2NhbGVjaGFuZ2luZyIsdGhpcy4jdXQpO3RoaXMuI1ouX29mZigicm90YXRpb25jaGFuZ2luZyIsdGhpcy4jcHQpO2Zvcihjb25zdCB0IG9mIHRoaXMuI1YudmFsdWVzKCkpdC5kZXN0cm95KCk7dGhpcy4jVi5jbGVhcigpO3RoaXMuI0cuY2xlYXIoKTt0aGlzLiNRLmNsZWFyKCk7dGhpcy4jVz1udWxsO3RoaXMuI3J0LmNsZWFyKCk7dGhpcy4jWC5kZXN0cm95KCl9Z2V0IGhjbUZpbHRlcigpe3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJoY21GaWx0ZXIiLHRoaXMuI3N0P3RoaXMuI3R0LmFkZEhDTUZpbHRlcih0aGlzLiNzdC5mb3JlZ3JvdW5kLHRoaXMuI3N0LmJhY2tncm91bmQpOiJub25lIil9b25QYWdlQ2hhbmdpbmcodCl7bGV0e3BhZ2VOdW1iZXI6ZX09dDt0aGlzLiNLPWUtMX1mb2N1c01haW5Db250YWluZXIoKXt0aGlzLiNidC5mb2N1cygpfWFkZFNob3VsZFJlc2NhbGUodCl7dGhpcy4jUS5hZGQodCl9cmVtb3ZlU2hvdWxkUmVzY2FsZSh0KXt0aGlzLiNRLmRlbGV0ZSh0KX1vblNjYWxlQ2hhbmdpbmcodCl7bGV0e3NjYWxlOmV9PXQ7dGhpcy5jb21taXRPclJlbW92ZSgpO3RoaXMudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlPWUqci5QaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFM7Zm9yKGNvbnN0IHQgb2YgdGhpcy4jUSl0Lm9uU2NhbGVDaGFuZ2luZygpfW9uUm90YXRpb25DaGFuZ2luZyh0KXtsZXR7cGFnZXNSb3RhdGlvbjplfT10O3RoaXMuY29tbWl0T3JSZW1vdmUoKTt0aGlzLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uPWV9YWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSh0KXt0LmlzRW1wdHkoKXx8IXRoaXMuIyR8fHRoaXMuIyQuaGFzKHQuaWQpfHx0aGlzLiMkLnNldFZhbHVlKHQuaWQsdCl9I3l0KCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuI2N0LHtjYXB0dXJlOiEwfSl9I3Z0KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuI2N0LHtjYXB0dXJlOiEwfSl9I0F0KCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29weSIsdGhpcy4jYXQpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImN1dCIsdGhpcy4jb3QpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBhc3RlIix0aGlzLiNsdCl9I190KCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29weSIsdGhpcy4jYXQpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImN1dCIsdGhpcy4jb3QpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBhc3RlIix0aGlzLiNsdCl9Y29weSh0KXt0LnByZXZlbnREZWZhdWx0KCk7dGhpcy4jVyYmdGhpcy4jVy5jb21taXRPclJlbW92ZSgpO2lmKCF0aGlzLmhhc1NlbGVjdGlvbilyZXR1cm47Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiB0aGlzLiNydCl7Y29uc3Qgbj10LnNlcmlhbGl6ZSghMCk7biYmZS5wdXNoKG4pfTAhPT1lLmxlbmd0aCYmdC5jbGlwYm9hcmREYXRhLnNldERhdGEoImFwcGxpY2F0aW9uL3BkZmpzIixKU09OLnN0cmluZ2lmeShlKSl9Y3V0KHQpe3RoaXMuY29weSh0KTt0aGlzLmRlbGV0ZSgpfXBhc3RlKHQpe3QucHJldmVudERlZmF1bHQoKTtsZXQgZT10LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgiYXBwbGljYXRpb24vcGRmanMiKTtpZighZSlyZXR1cm47dHJ5e2U9SlNPTi5wYXJzZShlKX1jYXRjaCh0KXsoMCxpLndhcm4pKGBwYXN0ZTogIiR7dC5tZXNzYWdlfSIuYCk7cmV0dXJufWlmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybjt0aGlzLnVuc2VsZWN0QWxsKCk7Y29uc3Qgbj10aGlzLmN1cnJlbnRMYXllcjt0cnl7Y29uc3QgdD1bXTtmb3IoY29uc3QgaSBvZiBlKXtjb25zdCBlPW4uZGVzZXJpYWxpemUoaSk7aWYoIWUpcmV0dXJuO3QucHVzaChlKX1jb25zdCBjbWQ9KCk9Pntmb3IoY29uc3QgZSBvZiB0KXRoaXMuI1N0KGUpO3RoaXMuI0V0KHQpfSx1bmRvPSgpPT57Zm9yKGNvbnN0IGUgb2YgdCllLnJlbW92ZSgpfTt0aGlzLmFkZENvbW1hbmRzKHtjbWQ6Y21kLHVuZG86dW5kbyxtdXN0RXhlYzohMH0pfWNhdGNoKHQpeygwLGkud2FybikoYHBhc3RlOiAiJHt0Lm1lc3NhZ2V9Ii5gKX19a2V5ZG93bih0KXt0aGlzLmdldEFjdGl2ZSgpPy5zaG91bGRHZXRLZXlib2FyZEV2ZW50cygpfHxBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLHQpfW9uRWRpdGluZ0FjdGlvbih0KXtbInVuZG8iLCJyZWRvIiwiZGVsZXRlIiwic2VsZWN0QWxsIl0uaW5jbHVkZXModC5uYW1lKSYmdGhpc1t0Lm5hbWVdKCl9I3h0KHQpe09iamVjdC5lbnRyaWVzKHQpLnNvbWUoKHQ9PntsZXRbZSxuXT10O3JldHVybiB0aGlzLiNmdFtlXSE9PW59KSkmJnRoaXMuI1ouZGlzcGF0Y2goImFubm90YXRpb25lZGl0b3JzdGF0ZXNjaGFuZ2VkIix7c291cmNlOnRoaXMsZGV0YWlsczpPYmplY3QuYXNzaWduKHRoaXMuI2Z0LHQpfSl9I3d0KHQpe3RoaXMuI1ouZGlzcGF0Y2goImFubm90YXRpb25lZGl0b3JwYXJhbXNjaGFuZ2VkIix7c291cmNlOnRoaXMsZGV0YWlsczp0fSl9c2V0RWRpdGluZ1N0YXRlKHQpe2lmKHQpe3RoaXMuI3l0KCk7dGhpcy4jQXQoKTt0aGlzLiN4dCh7aXNFZGl0aW5nOnRoaXMuI2l0IT09aS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FLGlzRW1wdHk6dGhpcy4jQ3QoKSxoYXNTb21ldGhpbmdUb1VuZG86dGhpcy4jWC5oYXNTb21ldGhpbmdUb1VuZG8oKSxoYXNTb21ldGhpbmdUb1JlZG86dGhpcy4jWC5oYXNTb21ldGhpbmdUb1JlZG8oKSxoYXNTZWxlY3RlZEVkaXRvcjohMX0pfWVsc2V7dGhpcy4jdnQoKTt0aGlzLiNfdCgpO3RoaXMuI3h0KHtpc0VkaXRpbmc6ITF9KX19cmVnaXN0ZXJFZGl0b3JUeXBlcyh0KXtpZighdGhpcy4jSil7dGhpcy4jSj10O2Zvcihjb25zdCB0IG9mIHRoaXMuI0opdGhpcy4jd3QodC5kZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKX19Z2V0SWQoKXtyZXR1cm4gdGhpcy4jZXQuZ2V0SWQoKX1nZXQgY3VycmVudExheWVyKCl7cmV0dXJuIHRoaXMuI1YuZ2V0KHRoaXMuI0spfWdldCBjdXJyZW50UGFnZUluZGV4KCl7cmV0dXJuIHRoaXMuI0t9YWRkTGF5ZXIodCl7dGhpcy4jVi5zZXQodC5wYWdlSW5kZXgsdCk7dGhpcy4jbnQ/dC5lbmFibGUoKTp0LmRpc2FibGUoKX1yZW1vdmVMYXllcih0KXt0aGlzLiNWLmRlbGV0ZSh0LnBhZ2VJbmRleCl9dXBkYXRlTW9kZSh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbDt0aGlzLiNpdD10O2lmKHQhPT1pLkFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpe3RoaXMuc2V0RWRpdGluZ1N0YXRlKCEwKTt0aGlzLiNUdCgpO2Zvcihjb25zdCBlIG9mIHRoaXMuI1YudmFsdWVzKCkpZS51cGRhdGVNb2RlKHQpO2lmKGUpZm9yKGNvbnN0IHQgb2YgdGhpcy4jRy52YWx1ZXMoKSlpZih0LmFubm90YXRpb25FbGVtZW50SWQ9PT1lKXt0aGlzLnNldFNlbGVjdGVkKHQpO3QuZW50ZXJJbkVkaXRNb2RlKCk7YnJlYWt9fWVsc2V7dGhpcy5zZXRFZGl0aW5nU3RhdGUoITEpO3RoaXMuI1B0KCl9fXVwZGF0ZVRvb2xiYXIodCl7dCE9PXRoaXMuI2l0JiZ0aGlzLiNaLmRpc3BhdGNoKCJzd2l0Y2hhbm5vdGF0aW9uZWRpdG9ybW9kZSIse3NvdXJjZTp0aGlzLG1vZGU6dH0pfXVwZGF0ZVBhcmFtcyh0LGUpe2lmKHRoaXMuI0ope2Zvcihjb25zdCBuIG9mIHRoaXMuI3J0KW4udXBkYXRlUGFyYW1zKHQsZSk7Zm9yKGNvbnN0IG4gb2YgdGhpcy4jSiluLnVwZGF0ZURlZmF1bHRQYXJhbXModCxlKX19I1R0KCl7aWYoIXRoaXMuI250KXt0aGlzLiNudD0hMDtmb3IoY29uc3QgdCBvZiB0aGlzLiNWLnZhbHVlcygpKXQuZW5hYmxlKCl9fSNQdCgpe3RoaXMudW5zZWxlY3RBbGwoKTtpZih0aGlzLiNudCl7dGhpcy4jbnQ9ITE7Zm9yKGNvbnN0IHQgb2YgdGhpcy4jVi52YWx1ZXMoKSl0LmRpc2FibGUoKX19Z2V0RWRpdG9ycyh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHRoaXMuI0cudmFsdWVzKCkpbi5wYWdlSW5kZXg9PT10JiZlLnB1c2gobik7cmV0dXJuIGV9Z2V0RWRpdG9yKHQpe3JldHVybiB0aGlzLiNHLmdldCh0KX1hZGRFZGl0b3IodCl7dGhpcy4jRy5zZXQodC5pZCx0KX1yZW1vdmVFZGl0b3IodCl7dGhpcy4jRy5kZWxldGUodC5pZCk7dGhpcy51bnNlbGVjdCh0KTt0LmFubm90YXRpb25FbGVtZW50SWQmJnRoaXMuI1kuaGFzKHQuYW5ub3RhdGlvbkVsZW1lbnRJZCl8fHRoaXMuIyQ/LnJlbW92ZSh0LmlkKX1hZGREZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQodCl7dGhpcy4jWS5hZGQodC5hbm5vdGF0aW9uRWxlbWVudElkKTt0LmRlbGV0ZWQ9ITB9aXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQodCl7cmV0dXJuIHRoaXMuI1kuaGFzKHQpfXJlbW92ZURlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KXt0aGlzLiNZLmRlbGV0ZSh0LmFubm90YXRpb25FbGVtZW50SWQpO3QuZGVsZXRlZD0hMX0jU3QodCl7Y29uc3QgZT10aGlzLiNWLmdldCh0LnBhZ2VJbmRleCk7ZT9lLmFkZE9yUmVidWlsZCh0KTp0aGlzLmFkZEVkaXRvcih0KX1zZXRBY3RpdmVFZGl0b3IodCl7aWYodGhpcy4jVyE9PXQpe3RoaXMuI1c9dDt0JiZ0aGlzLiN3dCh0LnByb3BlcnRpZXNUb1VwZGF0ZSl9fXRvZ2dsZVNlbGVjdGVkKHQpe2lmKHRoaXMuI3J0Lmhhcyh0KSl7dGhpcy4jcnQuZGVsZXRlKHQpO3QudW5zZWxlY3QoKTt0aGlzLiN4dCh7aGFzU2VsZWN0ZWRFZGl0b3I6dGhpcy5oYXNTZWxlY3Rpb259KX1lbHNle3RoaXMuI3J0LmFkZCh0KTt0LnNlbGVjdCgpO3RoaXMuI3d0KHQucHJvcGVydGllc1RvVXBkYXRlKTt0aGlzLiN4dCh7aGFzU2VsZWN0ZWRFZGl0b3I6ITB9KX19c2V0U2VsZWN0ZWQodCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy4jcnQpZSE9PXQmJmUudW5zZWxlY3QoKTt0aGlzLiNydC5jbGVhcigpO3RoaXMuI3J0LmFkZCh0KTt0LnNlbGVjdCgpO3RoaXMuI3d0KHQucHJvcGVydGllc1RvVXBkYXRlKTt0aGlzLiN4dCh7aGFzU2VsZWN0ZWRFZGl0b3I6ITB9KX1pc1NlbGVjdGVkKHQpe3JldHVybiB0aGlzLiNydC5oYXModCl9dW5zZWxlY3QodCl7dC51bnNlbGVjdCgpO3RoaXMuI3J0LmRlbGV0ZSh0KTt0aGlzLiN4dCh7aGFzU2VsZWN0ZWRFZGl0b3I6dGhpcy5oYXNTZWxlY3Rpb259KX1nZXQgaGFzU2VsZWN0aW9uKCl7cmV0dXJuIDAhPT10aGlzLiNydC5zaXplfXN0b3BVbmRvQWNjdW11bGF0aW9uKCl7dGhpcy4jWC5zdG9wVW5kb0FjY3VtdWxhdGlvbigpfXVuZG8oKXt0aGlzLiNYLnVuZG8oKTt0aGlzLiN4dCh7aGFzU29tZXRoaW5nVG9VbmRvOnRoaXMuI1guaGFzU29tZXRoaW5nVG9VbmRvKCksaGFzU29tZXRoaW5nVG9SZWRvOiEwLGlzRW1wdHk6dGhpcy4jQ3QoKX0pfXJlZG8oKXt0aGlzLiNYLnJlZG8oKTt0aGlzLiN4dCh7aGFzU29tZXRoaW5nVG9VbmRvOiEwLGhhc1NvbWV0aGluZ1RvUmVkbzp0aGlzLiNYLmhhc1NvbWV0aGluZ1RvUmVkbygpLGlzRW1wdHk6dGhpcy4jQ3QoKX0pfWFkZENvbW1hbmRzKHQpe3RoaXMuI1guYWRkKHQpO3RoaXMuI3h0KHtoYXNTb21ldGhpbmdUb1VuZG86ITAsaGFzU29tZXRoaW5nVG9SZWRvOiExLGlzRW1wdHk6dGhpcy4jQ3QoKX0pfSNDdCgpe2lmKDA9PT10aGlzLiNHLnNpemUpcmV0dXJuITA7aWYoMT09PXRoaXMuI0cuc2l6ZSlmb3IoY29uc3QgdCBvZiB0aGlzLiNHLnZhbHVlcygpKXJldHVybiB0LmlzRW1wdHkoKTtyZXR1cm4hMX1kZWxldGUoKXt0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7aWYoIXRoaXMuaGFzU2VsZWN0aW9uKXJldHVybjtjb25zdCB0PVsuLi50aGlzLiNydF07dGhpcy5hZGRDb21tYW5kcyh7Y21kOigpPT57Zm9yKGNvbnN0IGUgb2YgdCllLnJlbW92ZSgpfSx1bmRvOigpPT57Zm9yKGNvbnN0IGUgb2YgdCl0aGlzLiNTdChlKX0sbXVzdEV4ZWM6ITB9KX1jb21taXRPclJlbW92ZSgpe3RoaXMuI1c/LmNvbW1pdE9yUmVtb3ZlKCl9aGFzU29tZXRoaW5nVG9Db250cm9sKCl7cmV0dXJuIHRoaXMuI1d8fHRoaXMuaGFzU2VsZWN0aW9ufSNFdCh0KXt0aGlzLiNydC5jbGVhcigpO2Zvcihjb25zdCBlIG9mIHQpaWYoIWUuaXNFbXB0eSgpKXt0aGlzLiNydC5hZGQoZSk7ZS5zZWxlY3QoKX10aGlzLiN4dCh7aGFzU2VsZWN0ZWRFZGl0b3I6ITB9KX1zZWxlY3RBbGwoKXtmb3IoY29uc3QgdCBvZiB0aGlzLiNydCl0LmNvbW1pdCgpO3RoaXMuI0V0KHRoaXMuI0cudmFsdWVzKCkpfXVuc2VsZWN0QWxsKCl7aWYodGhpcy4jVyl0aGlzLiNXLmNvbW1pdE9yUmVtb3ZlKCk7ZWxzZSBpZih0aGlzLmhhc1NlbGVjdGlvbil7Zm9yKGNvbnN0IHQgb2YgdGhpcy4jcnQpdC51bnNlbGVjdCgpO3RoaXMuI3J0LmNsZWFyKCk7dGhpcy4jeHQoe2hhc1NlbGVjdGVkRWRpdG9yOiExfSl9fXRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycyh0LGUpe2FyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl18fHRoaXMuY29tbWl0T3JSZW1vdmUoKTtpZighdGhpcy5oYXNTZWxlY3Rpb24pcmV0dXJuO3RoaXMuI2d0WzBdKz10O3RoaXMuI2d0WzFdKz1lO2NvbnN0W24saV09dGhpcy4jZ3Qscj1bLi4udGhpcy4jcnRdO3RoaXMuI210JiZjbGVhclRpbWVvdXQodGhpcy4jbXQpO3RoaXMuI210PXNldFRpbWVvdXQoKCgpPT57dGhpcy4jbXQ9bnVsbDt0aGlzLiNndFswXT10aGlzLiNndFsxXT0wO3RoaXMuYWRkQ29tbWFuZHMoe2NtZDooKT0+e2Zvcihjb25zdCB0IG9mIHIpdGhpcy4jRy5oYXModC5pZCkmJnQudHJhbnNsYXRlSW5QYWdlKG4saSl9LHVuZG86KCk9Pntmb3IoY29uc3QgdCBvZiByKXRoaXMuI0cuaGFzKHQuaWQpJiZ0LnRyYW5zbGF0ZUluUGFnZSgtbiwtaSl9LG11c3RFeGVjOiExfSl9KSwxZTMpO2Zvcihjb25zdCBuIG9mIHIpbi50cmFuc2xhdGVJblBhZ2UodCxlKX1pc0FjdGl2ZSh0KXtyZXR1cm4gdGhpcy4jVz09PXR9Z2V0QWN0aXZlKCl7cmV0dXJuIHRoaXMuI1d9Z2V0TW9kZSgpe3JldHVybiB0aGlzLiNpdH1nZXQgaW1hZ2VNYW5hZ2VyKCl7cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsImltYWdlTWFuYWdlciIsbmV3IEltYWdlTWFuYWdlcil9fWUuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcj1Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyfSwodCxlLG4pPT57InVzZSBzdHJpY3QiO3ZhciBpPW4oMykscj1uKDYpLHM9big0KSxhPW4oMjQpLG89bigxNCksbD1uKDgpLGM9bigyMSksaD1uKDIwKSxkPW4oOTEpLHU9bigzOSkscD1uKDc3KSxmPW4oNjQpLGc9bigxNTgpLG09big3KSxiPW4oMTY2KSx2PW4oMjcpLHk9cy5KU09OLEE9cy5OdW1iZXIsXz1zLlN5bnRheEVycm9yLFM9eSYmeS5wYXJzZSxFPWEoIk9iamVjdCIsImtleXMiKSx4PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isdz1vKCIiLmNoYXJBdCksQz1vKCIiLnNsaWNlKSxUPW8oLy4vLmV4ZWMpLFA9byhbXS5wdXNoKSxrPS9eXGQkLyxNPS9eWzEtOV0kLyxSPS9eKC18XGQpJC8sST0vXltcdFxuXHIgXSQvLGludGVybmFsaXplPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByLHMsYSxvLGMscD10W2VdLGc9aSYmcD09PWkudmFsdWUsbT1nJiYic3RyaW5nIj09dHlwZW9mIGkuc291cmNlP3tzb3VyY2U6aS5zb3VyY2V9Ont9O2lmKGgocCkpe3ZhciBiPWQocCksdj1nP2kubm9kZXM6Yj9bXTp7fTtpZihiKXtyPXYubGVuZ3RoO2E9ZihwKTtmb3Iobz0wO288YTtvKyspaW50ZXJuYWxpemVQcm9wZXJ0eShwLG8saW50ZXJuYWxpemUocCwiIitvLG4sbzxyP3Zbb106dm9pZCAwKSl9ZWxzZXtzPUUocCk7YT1mKHMpO2ZvcihvPTA7bzxhO28rKyl7Yz1zW29dO2ludGVybmFsaXplUHJvcGVydHkocCxjLGludGVybmFsaXplKHAsYyxuLHUodixjKT92W2NdOnZvaWQgMCkpfX19cmV0dXJuIGwobix0LGUscCxtKX0saW50ZXJuYWxpemVQcm9wZXJ0eT1mdW5jdGlvbih0LGUsbil7aWYocil7dmFyIGk9eCh0LGUpO2lmKGkmJiFpLmNvbmZpZ3VyYWJsZSlyZXR1cm59dm9pZCAwPT09bj9kZWxldGUgdFtlXTpnKHQsZSxuKX0sTm9kZT1mdW5jdGlvbih0LGUsbixpKXt0aGlzLnZhbHVlPXQ7dGhpcy5lbmQ9ZTt0aGlzLnNvdXJjZT1uO3RoaXMubm9kZXM9aX0sQ29udGV4dD1mdW5jdGlvbih0LGUpe3RoaXMuc291cmNlPXQ7dGhpcy5pbmRleD1lfTtDb250ZXh0LnByb3RvdHlwZT17Zm9yazpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IENvbnRleHQodGhpcy5zb3VyY2UsdCl9LHBhcnNlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zb3VyY2UsZT10aGlzLnNraXAoSSx0aGlzLmluZGV4KSxuPXRoaXMuZm9yayhlKSxpPXcodCxlKTtpZihUKFIsaSkpcmV0dXJuIG4ubnVtYmVyKCk7c3dpdGNoKGkpe2Nhc2UieyI6cmV0dXJuIG4ub2JqZWN0KCk7Y2FzZSJbIjpyZXR1cm4gbi5hcnJheSgpO2Nhc2UnIic6cmV0dXJuIG4uc3RyaW5nKCk7Y2FzZSJ0IjpyZXR1cm4gbi5rZXl3b3JkKCEwKTtjYXNlImYiOnJldHVybiBuLmtleXdvcmQoITEpO2Nhc2UibiI6cmV0dXJuIG4ua2V5d29yZChudWxsKX10aHJvdyBfKCdVbmV4cGVjdGVkIGNoYXJhY3RlcjogIicraSsnIiBhdDogJytlKX0sbm9kZTpmdW5jdGlvbih0LGUsbixpLHIpe3JldHVybiBuZXcgTm9kZShlLGksdD9udWxsOkModGhpcy5zb3VyY2UsbixpKSxyKX0sb2JqZWN0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuc291cmNlLGU9dGhpcy5pbmRleCsxLG49ITEsaT17fSxyPXt9O2U8dC5sZW5ndGg7KXtlPXRoaXMudW50aWwoWyciJywifSJdLGUpO2lmKCJ9Ij09dyh0LGUpJiYhbil7ZSsrO2JyZWFrfXZhciBzPXRoaXMuZm9yayhlKS5zdHJpbmcoKSxhPXMudmFsdWU7ZT1zLmVuZDtlPXRoaXMudW50aWwoWyI6Il0sZSkrMTtlPXRoaXMuc2tpcChJLGUpO3M9dGhpcy5mb3JrKGUpLnBhcnNlKCk7ZyhyLGEscyk7ZyhpLGEscy52YWx1ZSk7ZT10aGlzLnVudGlsKFsiLCIsIn0iXSxzLmVuZCk7dmFyIG89dyh0LGUpO2lmKCIsIj09byl7bj0hMDtlKyt9ZWxzZSBpZigifSI9PW8pe2UrKzticmVha319cmV0dXJuIHRoaXMubm9kZSgxLGksdGhpcy5pbmRleCxlLHIpfSxhcnJheTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnNvdXJjZSxlPXRoaXMuaW5kZXgrMSxuPSExLGk9W10scj1bXTtlPHQubGVuZ3RoOyl7ZT10aGlzLnNraXAoSSxlKTtpZigiXSI9PXcodCxlKSYmIW4pe2UrKzticmVha312YXIgcz10aGlzLmZvcmsoZSkucGFyc2UoKTtQKHIscyk7UChpLHMudmFsdWUpO2U9dGhpcy51bnRpbChbIiwiLCJdIl0scy5lbmQpO2lmKCIsIj09dyh0LGUpKXtuPSEwO2UrK31lbHNlIGlmKCJdIj09dyh0LGUpKXtlKys7YnJlYWt9fXJldHVybiB0aGlzLm5vZGUoMSxpLHRoaXMuaW5kZXgsZSxyKX0sc3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pbmRleCxlPWIodGhpcy5zb3VyY2UsdGhpcy5pbmRleCsxKTtyZXR1cm4gdGhpcy5ub2RlKDAsZS52YWx1ZSx0LGUuZW5kKX0sbnVtYmVyOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zb3VyY2UsZT10aGlzLmluZGV4LG49ZTsiLSI9PXcodCxuKSYmbisrO2lmKCIwIj09dyh0LG4pKW4rKztlbHNle2lmKCFUKE0sdyh0LG4pKSl0aHJvdyBfKCJGYWlsZWQgdG8gcGFyc2UgbnVtYmVyIGF0OiAiK24pO249dGhpcy5za2lwKGssKytuKX0iLiI9PXcodCxuKSYmKG49dGhpcy5za2lwKGssKytuKSk7aWYoImUiPT13KHQsbil8fCJFIj09dyh0LG4pKXtuKys7IisiIT13KHQsbikmJiItIiE9dyh0LG4pfHxuKys7aWYobj09KG49dGhpcy5za2lwKGssbikpKXRocm93IF8oIkZhaWxlZCB0byBwYXJzZSBudW1iZXIncyBleHBvbmVudCB2YWx1ZSBhdDogIituKX1yZXR1cm4gdGhpcy5ub2RlKDAsQShDKHQsZSxuKSksZSxuKX0sa2V5d29yZDpmdW5jdGlvbih0KXt2YXIgZT0iIit0LG49dGhpcy5pbmRleCxpPW4rZS5sZW5ndGg7aWYoQyh0aGlzLnNvdXJjZSxuLGkpIT1lKXRocm93IF8oIkZhaWxlZCB0byBwYXJzZSB2YWx1ZSBhdDogIituKTtyZXR1cm4gdGhpcy5ub2RlKDAsdCxuLGkpfSxza2lwOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuc291cmNlO2U8bi5sZW5ndGgmJlQodCx3KG4sZSkpO2UrKyk7cmV0dXJuIGV9LHVudGlsOmZ1bmN0aW9uKHQsZSl7ZT10aGlzLnNraXAoSSxlKTtmb3IodmFyIG49dyh0aGlzLnNvdXJjZSxlKSxpPTA7aTx0Lmxlbmd0aDtpKyspaWYodFtpXT09bilyZXR1cm4gZTt0aHJvdyBfKCdVbmV4cGVjdGVkIGNoYXJhY3RlcjogIicrbisnIiBhdDogJytlKX19O3ZhciBEPW0oKGZ1bmN0aW9uKCl7dmFyIHQsZT0iOTAwNzE5OTI1NDc0MDk5MyI7UyhlLChmdW5jdGlvbihlLG4saSl7dD1pLnNvdXJjZX0pKTtyZXR1cm4gdCE9PWV9KSksTz12JiYhbSgoZnVuY3Rpb24oKXtyZXR1cm4gMS9TKCItMCBcdCIpIT0tMS8wfSkpO2koe3RhcmdldDoiSlNPTiIsc3RhdDohMCxmb3JjZWQ6RH0se3BhcnNlOmZ1bmN0aW9uIHBhcnNlKHQsZSl7cmV0dXJuIE8mJiFjKGUpP1ModCk6ZnVuY3Rpb24odCxlKXt0PXAodCk7dmFyIG49bmV3IENvbnRleHQodCwwLCIiKSxpPW4ucGFyc2UoKSxyPWkudmFsdWUscz1uLnNraXAoSSxpLmVuZCk7aWYoczx0Lmxlbmd0aCl0aHJvdyBfKCdVbmV4cGVjdGVkIGV4dHJhIGNoYXJhY3RlcjogIicrdyh0LHMpKyciIGFmdGVyIHRoZSBwYXJzZWQgZGF0YSBhdDogJytzKTtyZXR1cm4gYyhlKT9pbnRlcm5hbGl6ZSh7IiI6cn0sIiIsZSxpKTpyfSh0LGUpfX0pfSwodCxlLG4pPT57dmFyIGk9bigxNCkscj1uKDM5KSxzPVN5bnRheEVycm9yLGE9cGFyc2VJbnQsbz1TdHJpbmcuZnJvbUNoYXJDb2RlLGw9aSgiIi5jaGFyQXQpLGM9aSgiIi5zbGljZSksaD1pKC8uLy5leGVjKSxkPXsnXFwiJzonIicsIlxcXFwiOiJcXCIsIlxcLyI6Ii8iLCJcXGIiOiJcYiIsIlxcZiI6IlxmIiwiXFxuIjoiXG4iLCJcXHIiOiJcciIsIlxcdCI6Ilx0In0sdT0vXltcZGEtZl17NH0kL2kscD0vXltcdTAwMDAtXHUwMDFGXSQvO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0hMCxpPSIiO2U8dC5sZW5ndGg7KXt2YXIgZj1sKHQsZSk7aWYoIlxcIj09Zil7dmFyIGc9Yyh0LGUsZSsyKTtpZihyKGQsZykpe2krPWRbZ107ZSs9Mn1lbHNle2lmKCJcXHUiIT1nKXRocm93IHMoJ1Vua25vd24gZXNjYXBlIHNlcXVlbmNlOiAiJytnKyciJyk7dmFyIG09Yyh0LGUrPTIsZSs0KTtpZighaCh1LG0pKXRocm93IHMoIkJhZCBVbmljb2RlIGVzY2FwZSBhdDogIitlKTtpKz1vKGEobSwxNikpO2UrPTR9fWVsc2V7aWYoJyInPT1mKXtuPSExO2UrKzticmVha31pZihoKHAsZikpdGhyb3cgcygiQmFkIGNvbnRyb2wgY2hhcmFjdGVyIGluIHN0cmluZyBsaXRlcmFsIGF0OiAiK2UpO2krPWY7ZSsrfX1pZihuKXRocm93IHMoIlVudGVybWluYXRlZCBzdHJpbmcgYXQ6ICIrZSk7cmV0dXJue3ZhbHVlOmksZW5kOmV9fX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5TdGF0VGltZXI9ZS5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb249ZS5QaXhlbHNQZXJJbmNoPWUuUGFnZVZpZXdwb3J0PWUuUERGRGF0ZVN0cmluZz1lLkRPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5PWUuRE9NU1ZHRmFjdG9yeT1lLkRPTUZpbHRlckZhY3Rvcnk9ZS5ET01DYW52YXNGYWN0b3J5PWUuRE9NQ01hcFJlYWRlckZhY3Rvcnk9ZS5Bbm5vdGF0aW9uUHJlZml4PXZvaWQgMDtlLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24gZGVwcmVjYXRlZCh0KXtjb25zb2xlLmxvZygiRGVwcmVjYXRlZCBBUEkgdXNhZ2U6ICIrdCl9O2UuZ2V0Q29sb3JWYWx1ZXM9ZnVuY3Rpb24gZ2V0Q29sb3JWYWx1ZXModCl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7ZS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO2RvY3VtZW50LmJvZHkuYXBwZW5kKGUpO2Zvcihjb25zdCBuIG9mIHQua2V5cygpKXtlLnN0eWxlLmNvbG9yPW47Y29uc3QgaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5jb2xvcjt0LnNldChuLGdldFJHQihpKSl9ZS5yZW1vdmUoKX07ZS5nZXRDdXJyZW50VHJhbnNmb3JtPWZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm0odCl7Y29uc3R7YTplLGI6bixjOmksZDpyLGU6cyxmOmF9PXQuZ2V0VHJhbnNmb3JtKCk7cmV0dXJuW2UsbixpLHIscyxhXX07ZS5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZT1mdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSh0KXtjb25zdHthOmUsYjpuLGM6aSxkOnIsZTpzLGY6YX09dC5nZXRUcmFuc2Zvcm0oKS5pbnZlcnRTZWxmKCk7cmV0dXJuW2UsbixpLHIscyxhXX07ZS5nZXRGaWxlbmFtZUZyb21Vcmw9ZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tVXJsKHQpe2FyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV18fChbdF09dC5zcGxpdCgvWyM/XS8sMSkpO3JldHVybiB0LnN1YnN0cmluZyh0Lmxhc3RJbmRleE9mKCIvIikrMSl9O2UuZ2V0UGRmRmlsZW5hbWVGcm9tVXJsPWZ1bmN0aW9uIGdldFBkZkZpbGVuYW1lRnJvbVVybCh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ImRvY3VtZW50LnBkZiI7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBlO2lmKGlzRGF0YVNjaGVtZSh0KSl7KDAsci53YXJuKSgnZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiBpZ25vcmUgImRhdGE6Ii1VUkwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuJyk7cmV0dXJuIGV9Y29uc3Qgbj0vW14vPyM9XStcLnBkZlxiKD8hLipcLnBkZlxiKS9pLGk9L14oPzooPzpbXjpdKzopP1wvXC9bXi9dKyk/KFtePyNdKikoXD9bXiNdKik/KCMuKik/JC8uZXhlYyh0KTtsZXQgcz1uLmV4ZWMoaVsxXSl8fG4uZXhlYyhpWzJdKXx8bi5leGVjKGlbM10pO2lmKHMpe3M9c1swXTtpZihzLmluY2x1ZGVzKCIlIikpdHJ5e3M9bi5leGVjKGRlY29kZVVSSUNvbXBvbmVudChzKSlbMF19Y2F0Y2h7fX1yZXR1cm4gc3x8ZX07ZS5nZXRSR0I9Z2V0UkdCO2UuZ2V0WGZhUGFnZVZpZXdwb3J0PWZ1bmN0aW9uIGdldFhmYVBhZ2VWaWV3cG9ydCh0LGUpe2xldHtzY2FsZTpuPTEscm90YXRpb246aT0wfT1lO2NvbnN0e3dpZHRoOnIsaGVpZ2h0OnN9PXQuYXR0cmlidXRlcy5zdHlsZSxhPVswLDAscGFyc2VJbnQocikscGFyc2VJbnQocyldO3JldHVybiBuZXcgUGFnZVZpZXdwb3J0KHt2aWV3Qm94OmEsc2NhbGU6bixyb3RhdGlvbjppfSl9O2UuaXNEYXRhU2NoZW1lPWlzRGF0YVNjaGVtZTtlLmlzUGRmRmlsZT1mdW5jdGlvbiBpc1BkZkZpbGUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYvXC5wZGYkL2kudGVzdCh0KX07ZS5pc1ZhbGlkRmV0Y2hVcmw9aXNWYWxpZEZldGNoVXJsO2UubG9hZFNjcmlwdD1mdW5jdGlvbiBsb2FkU2NyaXB0KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07cmV0dXJuIG5ldyBQcm9taXNlKCgobixpKT0+e2NvbnN0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ci5zcmM9dDtyLm9ubG9hZD1mdW5jdGlvbih0KXtlJiZyLnJlbW92ZSgpO24odCl9O3Iub25lcnJvcj1mdW5jdGlvbigpe2kobmV3IEVycm9yKGBDYW5ub3QgbG9hZCBzY3JpcHQgYXQ6ICR7ci5zcmN9YCkpfTsoZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmQocil9KSl9O2Uuc2V0TGF5ZXJEaW1lbnNpb25zPWZ1bmN0aW9uIHNldExheWVyRGltZW5zaW9ucyh0LGUpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0saT0hKGFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdKXx8YXJndW1lbnRzWzNdO2lmKGUgaW5zdGFuY2VvZiBQYWdlVmlld3BvcnQpe2NvbnN0e3BhZ2VXaWR0aDppLHBhZ2VIZWlnaHQ6cn09ZS5yYXdEaW1zLHtzdHlsZTpzfT10LGE9YGNhbGModmFyKC0tc2NhbGUtZmFjdG9yKSAqICR7aX1weClgLG89YGNhbGModmFyKC0tc2NhbGUtZmFjdG9yKSAqICR7cn1weClgO2lmKG4mJmUucm90YXRpb24lMTgwIT0wKXtzLndpZHRoPW87cy5oZWlnaHQ9YX1lbHNle3Mud2lkdGg9YTtzLmhlaWdodD1vfX1pJiZ0LnNldEF0dHJpYnV0ZSgiZGF0YS1tYWluLXJvdGF0aW9uIixlLnJvdGF0aW9uKX07bigyKTtuKDkzKTtuKDEwMSk7bigxMDIpO24oMTA1KTtuKDEwNyk7bigxMDkpO24oMTEzKTtuKDExNik7bigxMjMpO24oODkpO24oODQpO24oODYpO24oODcpO3ZhciBpPW4oMTY4KSxyPW4oMSk7Y29uc3Qgcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2UuQW5ub3RhdGlvblByZWZpeD0icGRmanNfaW50ZXJuYWxfaWRfIjtjbGFzcyBQaXhlbHNQZXJJbmNoe3N0YXRpYyBDU1M9OTY7c3RhdGljIFBERj03MjtzdGF0aWMgUERGX1RPX0NTU19VTklUUz10aGlzLkNTUy90aGlzLlBERn1lLlBpeGVsc1BlckluY2g9UGl4ZWxzUGVySW5jaDtjbGFzcyBET01GaWx0ZXJGYWN0b3J5IGV4dGVuZHMgaS5CYXNlRmlsdGVyRmFjdG9yeXsja3Q7I010OyNlOyNSdDsjRnQ7I0l0OyNEdDsjT3Q7I0x0OyNOdDsjTz0wO2NvbnN0cnVjdG9yKCl7bGV0e2RvY0lkOnQsb3duZXJEb2N1bWVudDplPWdsb2JhbFRoaXMuZG9jdW1lbnR9PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtzdXBlcigpO3RoaXMuI2U9dDt0aGlzLiNSdD1lfWdldCNOKCl7cmV0dXJuIHRoaXMuI2t0fHw9bmV3IE1hcH1nZXQjQnQoKXtpZighdGhpcy4jTXQpe2NvbnN0IHQ9dGhpcy4jUnQuY3JlYXRlRWxlbWVudCgiZGl2Iikse3N0eWxlOmV9PXQ7ZS52aXNpYmlsaXR5PSJoaWRkZW4iO2UuY29udGFpbj0ic3RyaWN0IjtlLndpZHRoPWUuaGVpZ2h0PTA7ZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2UudG9wPWUubGVmdD0wO2UuekluZGV4PS0xO2NvbnN0IG49dGhpcy4jUnQuY3JlYXRlRWxlbWVudE5TKHMsInN2ZyIpO24uc2V0QXR0cmlidXRlKCJ3aWR0aCIsMCk7bi5zZXRBdHRyaWJ1dGUoImhlaWdodCIsMCk7dGhpcy4jTXQ9dGhpcy4jUnQuY3JlYXRlRWxlbWVudE5TKHMsImRlZnMiKTt0LmFwcGVuZChuKTtuLmFwcGVuZCh0aGlzLiNNdCk7dGhpcy4jUnQuYm9keS5hcHBlbmQodCl9cmV0dXJuIHRoaXMuI010fWFkZEZpbHRlcih0KXtpZighdClyZXR1cm4ibm9uZSI7bGV0IGUsbixpLHIscz10aGlzLiNOLmdldCh0KTtpZihzKXJldHVybiBzO2lmKDE9PT10Lmxlbmd0aCl7Y29uc3Qgcz10WzBdLGE9bmV3IEFycmF5KDI1Nik7Zm9yKGxldCB0PTA7dDwyNTY7dCsrKWFbdF09c1t0XS8yNTU7cj1lPW49aT1hLmpvaW4oIiwiKX1lbHNle2NvbnN0W3MsYSxvXT10LGw9bmV3IEFycmF5KDI1NiksYz1uZXcgQXJyYXkoMjU2KSxoPW5ldyBBcnJheSgyNTYpO2ZvcihsZXQgdD0wO3Q8MjU2O3QrKyl7bFt0XT1zW3RdLzI1NTtjW3RdPWFbdF0vMjU1O2hbdF09b1t0XS8yNTV9ZT1sLmpvaW4oIiwiKTtuPWMuam9pbigiLCIpO2k9aC5qb2luKCIsIik7cj1gJHtlfSR7bn0ke2l9YH1zPXRoaXMuI04uZ2V0KHIpO2lmKHMpe3RoaXMuI04uc2V0KHQscyk7cmV0dXJuIHN9Y29uc3QgYT1gZ18ke3RoaXMuI2V9X3RyYW5zZmVyX21hcF8ke3RoaXMuI08rK31gLG89YHVybCgjJHthfSlgO3RoaXMuI04uc2V0KHQsbyk7dGhpcy4jTi5zZXQocixvKTtjb25zdCBsPXRoaXMuI2p0KGEpO3RoaXMuI1V0KGUsbixpLGwpO3JldHVybiBvfWFkZEhDTUZpbHRlcih0LGUpe2NvbnN0IG49YCR7dH0tJHtlfWA7aWYodGhpcy4jSXQ9PT1uKXJldHVybiB0aGlzLiNEdDt0aGlzLiNJdD1uO3RoaXMuI0R0PSJub25lIjt0aGlzLiNGdD8ucmVtb3ZlKCk7aWYoIXR8fCFlKXJldHVybiB0aGlzLiNEdDtjb25zdCBpPXRoaXMuI3p0KHQpO3Q9ci5VdGlsLm1ha2VIZXhDb2xvciguLi5pKTtjb25zdCBzPXRoaXMuI3p0KGUpO2U9ci5VdGlsLm1ha2VIZXhDb2xvciguLi5zKTt0aGlzLiNCdC5zdHlsZS5jb2xvcj0iIjtpZigiIzAwMDAwMCI9PT10JiYiI2ZmZmZmZiI9PT1lfHx0PT09ZSlyZXR1cm4gdGhpcy4jRHQ7Y29uc3QgYT1uZXcgQXJyYXkoMjU2KTtmb3IobGV0IHQ9MDt0PD0yNTU7dCsrKXtjb25zdCBlPXQvMjU1O2FbdF09ZTw9LjAzOTI4P2UvMTIuOTI6KChlKy4wNTUpLzEuMDU1KSoqMi40fWNvbnN0IG89YS5qb2luKCIsIiksbD1gZ18ke3RoaXMuI2V9X2hjbV9maWx0ZXJgLGM9dGhpcy4jT3Q9dGhpcy4janQobCk7dGhpcy4jVXQobyxvLG8sYyk7dGhpcy4jSHQoYyk7Y29uc3QgZ2V0U3RlcHM9KHQsZSk9Pntjb25zdCBuPWlbdF0vMjU1LHI9c1t0XS8yNTUsYT1uZXcgQXJyYXkoZSsxKTtmb3IobGV0IHQ9MDt0PD1lO3QrKylhW3RdPW4rdC9lKihyLW4pO3JldHVybiBhLmpvaW4oIiwiKX07dGhpcy4jVXQoZ2V0U3RlcHMoMCw1KSxnZXRTdGVwcygxLDUpLGdldFN0ZXBzKDIsNSksYyk7dGhpcy4jRHQ9YHVybCgjJHtsfSlgO3JldHVybiB0aGlzLiNEdH1hZGRIaWdobGlnaHRIQ01GaWx0ZXIodCxlLG4saSl7Y29uc3Qgcj1gJHt0fS0ke2V9LSR7bn0tJHtpfWA7aWYodGhpcy4jTHQ9PT1yKXJldHVybiB0aGlzLiNOdDt0aGlzLiNMdD1yO3RoaXMuI050PSJub25lIjt0aGlzLiNPdD8ucmVtb3ZlKCk7aWYoIXR8fCFlKXJldHVybiB0aGlzLiNOdDtjb25zdFtzLGFdPVt0LGVdLm1hcCh0aGlzLiN6dC5iaW5kKHRoaXMpKTtsZXQgbz1NYXRoLnJvdW5kKC4yMTI2KnNbMF0rLjcxNTIqc1sxXSsuMDcyMipzWzJdKSxsPU1hdGgucm91bmQoLjIxMjYqYVswXSsuNzE1MiphWzFdKy4wNzIyKmFbMl0pLFtjLGhdPVtuLGldLm1hcCh0aGlzLiN6dC5iaW5kKHRoaXMpKTtsPG8mJihbbyxsLGMsaF09W2wsbyxoLGNdKTt0aGlzLiNCdC5zdHlsZS5jb2xvcj0iIjtjb25zdCBnZXRTdGVwcz0odCxlLG4pPT57Y29uc3QgaT1uZXcgQXJyYXkoMjU2KSxyPShsLW8pL24scz10LzI1NSxhPShlLXQpLygyNTUqbik7bGV0IGM9MDtmb3IobGV0IHQ9MDt0PD1uO3QrKyl7Y29uc3QgZT1NYXRoLnJvdW5kKG8rdCpyKSxuPXMrdCphO2ZvcihsZXQgdD1jO3Q8PWU7dCsrKWlbdF09bjtjPWUrMX1mb3IobGV0IHQ9Yzt0PDI1Njt0KyspaVt0XT1pW2MtMV07cmV0dXJuIGkuam9pbigiLCIpfSxkPWBnXyR7dGhpcy4jZX1faGNtX2hpZ2hsaWdodF9maWx0ZXJgLHU9dGhpcy4jT3Q9dGhpcy4janQoZCk7dGhpcy4jSHQodSk7dGhpcy4jVXQoZ2V0U3RlcHMoY1swXSxoWzBdLDUpLGdldFN0ZXBzKGNbMV0saFsxXSw1KSxnZXRTdGVwcyhjWzJdLGhbMl0sNSksdSk7dGhpcy4jTnQ9YHVybCgjJHtkfSlgO3JldHVybiB0aGlzLiNOdH1kZXN0cm95KCl7aWYoIShhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdKXx8IXRoaXMuI0R0JiYhdGhpcy4jTnQpe2lmKHRoaXMuI010KXt0aGlzLiNNdC5wYXJlbnROb2RlLnBhcmVudE5vZGUucmVtb3ZlKCk7dGhpcy4jTXQ9bnVsbH1pZih0aGlzLiNrdCl7dGhpcy4ja3QuY2xlYXIoKTt0aGlzLiNrdD1udWxsfXRoaXMuI089MH19I0h0KHQpe2NvbnN0IGU9dGhpcy4jUnQuY3JlYXRlRWxlbWVudE5TKHMsImZlQ29sb3JNYXRyaXgiKTtlLnNldEF0dHJpYnV0ZSgidHlwZSIsIm1hdHJpeCIpO2Uuc2V0QXR0cmlidXRlKCJ2YWx1ZXMiLCIwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwIDAgMCAxIDAiKTt0LmFwcGVuZChlKX0janQodCl7Y29uc3QgZT10aGlzLiNSdC5jcmVhdGVFbGVtZW50TlMocywiZmlsdGVyIik7ZS5zZXRBdHRyaWJ1dGUoImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyIsInNSR0IiKTtlLnNldEF0dHJpYnV0ZSgiaWQiLHQpO3RoaXMuI0J0LmFwcGVuZChlKTtyZXR1cm4gZX0jcXQodCxlLG4pe2NvbnN0IGk9dGhpcy4jUnQuY3JlYXRlRWxlbWVudE5TKHMsZSk7aS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJkaXNjcmV0ZSIpO2kuc2V0QXR0cmlidXRlKCJ0YWJsZVZhbHVlcyIsbik7dC5hcHBlbmQoaSl9I1V0KHQsZSxuLGkpe2NvbnN0IHI9dGhpcy4jUnQuY3JlYXRlRWxlbWVudE5TKHMsImZlQ29tcG9uZW50VHJhbnNmZXIiKTtpLmFwcGVuZChyKTt0aGlzLiNxdChyLCJmZUZ1bmNSIix0KTt0aGlzLiNxdChyLCJmZUZ1bmNHIixlKTt0aGlzLiNxdChyLCJmZUZ1bmNCIixuKX0jenQodCl7dGhpcy4jQnQuc3R5bGUuY29sb3I9dDtyZXR1cm4gZ2V0UkdCKGdldENvbXB1dGVkU3R5bGUodGhpcy4jQnQpLmdldFByb3BlcnR5VmFsdWUoImNvbG9yIikpfX1lLkRPTUZpbHRlckZhY3Rvcnk9RE9NRmlsdGVyRmFjdG9yeTtjbGFzcyBET01DYW52YXNGYWN0b3J5IGV4dGVuZHMgaS5CYXNlQ2FudmFzRmFjdG9yeXtjb25zdHJ1Y3Rvcigpe2xldHtvd25lckRvY3VtZW50OnQ9Z2xvYmFsVGhpcy5kb2N1bWVudH09YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3N1cGVyKCk7dGhpcy5fZG9jdW1lbnQ9dH1fY3JlYXRlQ2FudmFzKHQsZSl7Y29uc3Qgbj10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtuLndpZHRoPXQ7bi5oZWlnaHQ9ZTtyZXR1cm4gbn19ZS5ET01DYW52YXNGYWN0b3J5PURPTUNhbnZhc0ZhY3Rvcnk7YXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07aWYoaXNWYWxpZEZldGNoVXJsKHQsZG9jdW1lbnQuYmFzZVVSSSkpe2NvbnN0IG49YXdhaXQgZmV0Y2godCk7aWYoIW4ub2spdGhyb3cgbmV3IEVycm9yKG4uc3RhdHVzVGV4dCk7cmV0dXJuIGU/bmV3IFVpbnQ4QXJyYXkoYXdhaXQgbi5hcnJheUJ1ZmZlcigpKTooMCxyLnN0cmluZ1RvQnl0ZXMpKGF3YWl0IG4udGV4dCgpKX1yZXR1cm4gbmV3IFByb21pc2UoKChuLGkpPT57Y29uc3Qgcz1uZXcgWE1MSHR0cFJlcXVlc3Q7cy5vcGVuKCJHRVQiLHQsITApO2UmJihzLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiKTtzLm9ucmVhZHlzdGF0ZWNoYW5nZT0oKT0+e2lmKHMucmVhZHlTdGF0ZT09PVhNTEh0dHBSZXF1ZXN0LkRPTkUpe2lmKDIwMD09PXMuc3RhdHVzfHwwPT09cy5zdGF0dXMpe2xldCB0O2UmJnMucmVzcG9uc2U/dD1uZXcgVWludDhBcnJheShzLnJlc3BvbnNlKTohZSYmcy5yZXNwb25zZVRleHQmJih0PSgwLHIuc3RyaW5nVG9CeXRlcykocy5yZXNwb25zZVRleHQpKTtpZih0KXtuKHQpO3JldHVybn19aShuZXcgRXJyb3Iocy5zdGF0dXNUZXh0KSl9fTtzLnNlbmQobnVsbCl9KSl9Y2xhc3MgRE9NQ01hcFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VDTWFwUmVhZGVyRmFjdG9yeXtfZmV0Y2hEYXRhKHQsZSl7cmV0dXJuIGZldGNoRGF0YSh0LHRoaXMuaXNDb21wcmVzc2VkKS50aGVuKCh0PT4oe2NNYXBEYXRhOnQsY29tcHJlc3Npb25UeXBlOmV9KSkpfX1lLkRPTUNNYXBSZWFkZXJGYWN0b3J5PURPTUNNYXBSZWFkZXJGYWN0b3J5O2NsYXNzIERPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IGV4dGVuZHMgaS5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnl7X2ZldGNoRGF0YSh0KXtyZXR1cm4gZmV0Y2hEYXRhKHQsITApfX1lLkRPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5PURPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O2NsYXNzIERPTVNWR0ZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VTVkdGYWN0b3J5e19jcmVhdGVTVkcodCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzLHQpfX1lLkRPTVNWR0ZhY3Rvcnk9RE9NU1ZHRmFjdG9yeTtjbGFzcyBQYWdlVmlld3BvcnR7Y29uc3RydWN0b3IodCl7bGV0e3ZpZXdCb3g6ZSxzY2FsZTpuLHJvdGF0aW9uOmksb2Zmc2V0WDpyPTAsb2Zmc2V0WTpzPTAsZG9udEZsaXA6YT0hMX09dDt0aGlzLnZpZXdCb3g9ZTt0aGlzLnNjYWxlPW47dGhpcy5yb3RhdGlvbj1pO3RoaXMub2Zmc2V0WD1yO3RoaXMub2Zmc2V0WT1zO2NvbnN0IG89KGVbMl0rZVswXSkvMixsPShlWzNdK2VbMV0pLzI7bGV0IGMsaCxkLHUscCxmLGcsbTtpJT0zNjA7aTwwJiYoaSs9MzYwKTtzd2l0Y2goaSl7Y2FzZSAxODA6Yz0tMTtoPTA7ZD0wO3U9MTticmVhaztjYXNlIDkwOmM9MDtoPTE7ZD0xO3U9MDticmVhaztjYXNlIDI3MDpjPTA7aD0tMTtkPS0xO3U9MDticmVhaztjYXNlIDA6Yz0xO2g9MDtkPTA7dT0tMTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiUGFnZVZpZXdwb3J0OiBJbnZhbGlkIHJvdGF0aW9uLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOTAgZGVncmVlcy4iKX1pZihhKXtkPS1kO3U9LXV9aWYoMD09PWMpe3A9TWF0aC5hYnMobC1lWzFdKSpuK3I7Zj1NYXRoLmFicyhvLWVbMF0pKm4rcztnPShlWzNdLWVbMV0pKm47bT0oZVsyXS1lWzBdKSpufWVsc2V7cD1NYXRoLmFicyhvLWVbMF0pKm4rcjtmPU1hdGguYWJzKGwtZVsxXSkqbitzO2c9KGVbMl0tZVswXSkqbjttPShlWzNdLWVbMV0pKm59dGhpcy50cmFuc2Zvcm09W2MqbixoKm4sZCpuLHUqbixwLWMqbipvLWQqbipsLGYtaCpuKm8tdSpuKmxdO3RoaXMud2lkdGg9Zzt0aGlzLmhlaWdodD1tfWdldCByYXdEaW1zKCl7Y29uc3R7dmlld0JveDp0fT10aGlzO3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJyYXdEaW1zIix7cGFnZVdpZHRoOnRbMl0tdFswXSxwYWdlSGVpZ2h0OnRbM10tdFsxXSxwYWdlWDp0WzBdLHBhZ2VZOnRbMV19KX1jbG9uZSgpe2xldHtzY2FsZTp0PXRoaXMuc2NhbGUscm90YXRpb246ZT10aGlzLnJvdGF0aW9uLG9mZnNldFg6bj10aGlzLm9mZnNldFgsb2Zmc2V0WTppPXRoaXMub2Zmc2V0WSxkb250RmxpcDpyPSExfT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e307cmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe3ZpZXdCb3g6dGhpcy52aWV3Qm94LnNsaWNlKCksc2NhbGU6dCxyb3RhdGlvbjplLG9mZnNldFg6bixvZmZzZXRZOmksZG9udEZsaXA6cn0pfWNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQodCxlKXtyZXR1cm4gci5VdGlsLmFwcGx5VHJhbnNmb3JtKFt0LGVdLHRoaXMudHJhbnNmb3JtKX1jb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZSh0KXtjb25zdCBlPXIuVXRpbC5hcHBseVRyYW5zZm9ybShbdFswXSx0WzFdXSx0aGlzLnRyYW5zZm9ybSksbj1yLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3RbMl0sdFszXV0sdGhpcy50cmFuc2Zvcm0pO3JldHVybltlWzBdLGVbMV0sblswXSxuWzFdXX1jb252ZXJ0VG9QZGZQb2ludCh0LGUpe3JldHVybiByLlV0aWwuYXBwbHlJbnZlcnNlVHJhbnNmb3JtKFt0LGVdLHRoaXMudHJhbnNmb3JtKX19ZS5QYWdlVmlld3BvcnQ9UGFnZVZpZXdwb3J0O2NsYXNzIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiBleHRlbmRzIHIuQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3Rvcih0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtzdXBlcih0LCJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24iKTt0aGlzLmV4dHJhRGVsYXk9ZX19ZS5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb249UmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uO2Z1bmN0aW9uIGlzRGF0YVNjaGVtZSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKDtuPGUmJiIiPT09dFtuXS50cmltKCk7KW4rKztyZXR1cm4iZGF0YToiPT09dC5zdWJzdHJpbmcobixuKzUpLnRvTG93ZXJDYXNlKCl9ZS5TdGF0VGltZXI9Y2xhc3MgU3RhdFRpbWVye3N0YXJ0ZWQ9T2JqZWN0LmNyZWF0ZShudWxsKTt0aW1lcz1bXTt0aW1lKHQpe3QgaW4gdGhpcy5zdGFydGVkJiYoMCxyLndhcm4pKGBUaW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yICR7dH1gKTt0aGlzLnN0YXJ0ZWRbdF09RGF0ZS5ub3coKX10aW1lRW5kKHQpe3QgaW4gdGhpcy5zdGFydGVkfHwoMCxyLndhcm4pKGBUaW1lciBoYXMgbm90IGJlZW4gc3RhcnRlZCBmb3IgJHt0fWApO3RoaXMudGltZXMucHVzaCh7bmFtZTp0LHN0YXJ0OnRoaXMuc3RhcnRlZFt0XSxlbmQ6RGF0ZS5ub3coKX0pO2RlbGV0ZSB0aGlzLnN0YXJ0ZWRbdF19dG9TdHJpbmcoKXtjb25zdCB0PVtdO2xldCBlPTA7Zm9yKGNvbnN0e25hbWU6dH1vZiB0aGlzLnRpbWVzKWU9TWF0aC5tYXgodC5sZW5ndGgsZSk7Zm9yKGNvbnN0e25hbWU6bixzdGFydDppLGVuZDpyfW9mIHRoaXMudGltZXMpdC5wdXNoKGAke24ucGFkRW5kKGUpfSAke3ItaX1tc1xuYCk7cmV0dXJuIHQuam9pbigiIil9fTtmdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodCxlKXt0cnl7Y29uc3R7cHJvdG9jb2w6bn09ZT9uZXcgVVJMKHQsZSk6bmV3IFVSTCh0KTtyZXR1cm4iaHR0cDoiPT09bnx8Imh0dHBzOiI9PT1ufWNhdGNoe3JldHVybiExfX1sZXQgYTtlLlBERkRhdGVTdHJpbmc9Y2xhc3MgUERGRGF0ZVN0cmluZ3tzdGF0aWMgdG9EYXRlT2JqZWN0KHQpe2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7YXx8PW5ldyBSZWdFeHAoIl5EOihcXGR7NH0pKFxcZHsyfSk/KFxcZHsyfSk/KFxcZHsyfSk/KFxcZHsyfSk/KFxcZHsyfSk/KFtafCt8LV0pPyhcXGR7Mn0pPyc/KFxcZHsyfSk/Jz8iKTtjb25zdCBlPWEuZXhlYyh0KTtpZighZSlyZXR1cm4gbnVsbDtjb25zdCBuPXBhcnNlSW50KGVbMV0sMTApO2xldCBpPXBhcnNlSW50KGVbMl0sMTApO2k9aT49MSYmaTw9MTI/aS0xOjA7bGV0IHI9cGFyc2VJbnQoZVszXSwxMCk7cj1yPj0xJiZyPD0zMT9yOjE7bGV0IHM9cGFyc2VJbnQoZVs0XSwxMCk7cz1zPj0wJiZzPD0yMz9zOjA7bGV0IG89cGFyc2VJbnQoZVs1XSwxMCk7bz1vPj0wJiZvPD01OT9vOjA7bGV0IGw9cGFyc2VJbnQoZVs2XSwxMCk7bD1sPj0wJiZsPD01OT9sOjA7Y29uc3QgYz1lWzddfHwiWiI7bGV0IGg9cGFyc2VJbnQoZVs4XSwxMCk7aD1oPj0wJiZoPD0yMz9oOjA7bGV0IGQ9cGFyc2VJbnQoZVs5XSwxMCl8fDA7ZD1kPj0wJiZkPD01OT9kOjA7aWYoIi0iPT09Yyl7cys9aDtvKz1kfWVsc2UgaWYoIisiPT09Yyl7cy09aDtvLT1kfXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhuLGkscixzLG8sbCkpfX07ZnVuY3Rpb24gZ2V0UkdCKHQpe2lmKHQuc3RhcnRzV2l0aCgiIyIpKXtjb25zdCBlPXBhcnNlSW50KHQuc2xpY2UoMSksMTYpO3JldHVyblsoMTY3MTE2ODAmZSk+PjE2LCg2NTI4MCZlKT4+OCwyNTUmZV19aWYodC5zdGFydHNXaXRoKCJyZ2IoIikpcmV0dXJuIHQuc2xpY2UoNCwtMSkuc3BsaXQoIiwiKS5tYXAoKHQ9PnBhcnNlSW50KHQpKSk7aWYodC5zdGFydHNXaXRoKCJyZ2JhKCIpKXJldHVybiB0LnNsaWNlKDUsLTEpLnNwbGl0KCIsIikubWFwKCh0PT5wYXJzZUludCh0KSkpLnNsaWNlKDAsMyk7KDAsci53YXJuKShgTm90IGEgdmFsaWQgY29sb3IgZm9ybWF0OiAiJHt0fSJgKTtyZXR1cm5bMCwwLDBdfX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk9ZS5CYXNlU1ZHRmFjdG9yeT1lLkJhc2VGaWx0ZXJGYWN0b3J5PWUuQmFzZUNhbnZhc0ZhY3Rvcnk9ZS5CYXNlQ01hcFJlYWRlckZhY3Rvcnk9dm9pZCAwO24oMik7dmFyIGk9bigxKTtjbGFzcyBCYXNlRmlsdGVyRmFjdG9yeXtjb25zdHJ1Y3Rvcigpe3RoaXMuY29uc3RydWN0b3I9PT1CYXNlRmlsdGVyRmFjdG9yeSYmKDAsaS51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VGaWx0ZXJGYWN0b3J5LiIpfWFkZEZpbHRlcih0KXtyZXR1cm4ibm9uZSJ9YWRkSENNRmlsdGVyKHQsZSl7cmV0dXJuIm5vbmUifWFkZEhpZ2hsaWdodEhDTUZpbHRlcih0LGUsbixpKXtyZXR1cm4ibm9uZSJ9ZGVzdHJveSgpe319ZS5CYXNlRmlsdGVyRmFjdG9yeT1CYXNlRmlsdGVyRmFjdG9yeTtjbGFzcyBCYXNlQ2FudmFzRmFjdG9yeXtjb25zdHJ1Y3Rvcigpe3RoaXMuY29uc3RydWN0b3I9PT1CYXNlQ2FudmFzRmFjdG9yeSYmKDAsaS51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDYW52YXNGYWN0b3J5LiIpfWNyZWF0ZSh0LGUpe2lmKHQ8PTB8fGU8PTApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIik7Y29uc3Qgbj10aGlzLl9jcmVhdGVDYW52YXModCxlKTtyZXR1cm57Y2FudmFzOm4sY29udGV4dDpuLmdldENvbnRleHQoIjJkIil9fXJlc2V0KHQsZSxuKXtpZighdC5jYW52YXMpdGhyb3cgbmV3IEVycm9yKCJDYW52YXMgaXMgbm90IHNwZWNpZmllZCIpO2lmKGU8PTB8fG48PTApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNhbnZhcyBzaXplIik7dC5jYW52YXMud2lkdGg9ZTt0LmNhbnZhcy5oZWlnaHQ9bn1kZXN0cm95KHQpe2lmKCF0LmNhbnZhcyl0aHJvdyBuZXcgRXJyb3IoIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkIik7dC5jYW52YXMud2lkdGg9MDt0LmNhbnZhcy5oZWlnaHQ9MDt0LmNhbnZhcz1udWxsO3QuY29udGV4dD1udWxsfV9jcmVhdGVDYW52YXModCxlKXsoMCxpLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlQ2FudmFzYCBjYWxsZWQuIil9fWUuQmFzZUNhbnZhc0ZhY3Rvcnk9QmFzZUNhbnZhc0ZhY3Rvcnk7Y2xhc3MgQmFzZUNNYXBSZWFkZXJGYWN0b3J5e2NvbnN0cnVjdG9yKHQpe2xldHtiYXNlVXJsOmU9bnVsbCxpc0NvbXByZXNzZWQ6bj0hMH09dDt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZUNNYXBSZWFkZXJGYWN0b3J5JiYoMCxpLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNNYXBSZWFkZXJGYWN0b3J5LiIpO3RoaXMuYmFzZVVybD1lO3RoaXMuaXNDb21wcmVzc2VkPW59YXN5bmMgZmV0Y2godCl7bGV0e25hbWU6ZX09dDtpZighdGhpcy5iYXNlVXJsKXRocm93IG5ldyBFcnJvcignVGhlIENNYXAgImJhc2VVcmwiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCwgZW5zdXJlIHRoYXQgdGhlICJjTWFwVXJsIiBhbmQgImNNYXBQYWNrZWQiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkNNYXAgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4iKTtjb25zdCBuPXRoaXMuYmFzZVVybCtlKyh0aGlzLmlzQ29tcHJlc3NlZD8iLmJjbWFwIjoiIikscj10aGlzLmlzQ29tcHJlc3NlZD9pLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZOmkuQ01hcENvbXByZXNzaW9uVHlwZS5OT05FO3JldHVybiB0aGlzLl9mZXRjaERhdGEobixyKS5jYXRjaCgodD0+e3Rocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgJHt0aGlzLmlzQ29tcHJlc3NlZD8iYmluYXJ5ICI6IiJ9Q01hcCBhdDogJHtufWApfSkpfV9mZXRjaERhdGEodCxlKXsoMCxpLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfZmV0Y2hEYXRhYCBjYWxsZWQuIil9fWUuQmFzZUNNYXBSZWFkZXJGYWN0b3J5PUJhc2VDTWFwUmVhZGVyRmFjdG9yeTtjbGFzcyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnl7Y29uc3RydWN0b3IodCl7bGV0e2Jhc2VVcmw6ZT1udWxsfT10O3RoaXMuY29uc3RydWN0b3I9PT1CYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkmJigwLGkudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkuIik7dGhpcy5iYXNlVXJsPWV9YXN5bmMgZmV0Y2godCl7bGV0e2ZpbGVuYW1lOmV9PXQ7aWYoIXRoaXMuYmFzZVVybCl0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzdGFuZGFyZCBmb250ICJiYXNlVXJsIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0IHRoZSAic3RhbmRhcmRGb250RGF0YVVybCIgQVBJIHBhcmFtZXRlciBpcyBwcm92aWRlZC4nKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkZvbnQgZmlsZW5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIik7Y29uc3Qgbj1gJHt0aGlzLmJhc2VVcmx9JHtlfWA7cmV0dXJuIHRoaXMuX2ZldGNoRGF0YShuKS5jYXRjaCgodD0+e3Rocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZm9udCBkYXRhIGF0OiAke259YCl9KSl9X2ZldGNoRGF0YSh0KXsoMCxpLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfZmV0Y2hEYXRhYCBjYWxsZWQuIil9fWUuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5PUJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtjbGFzcyBCYXNlU1ZHRmFjdG9yeXtjb25zdHJ1Y3Rvcigpe3RoaXMuY29uc3RydWN0b3I9PT1CYXNlU1ZHRmFjdG9yeSYmKDAsaS51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTVkdGYWN0b3J5LiIpfWNyZWF0ZSh0LGUpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07aWYodDw9MHx8ZTw9MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1ZHIGRpbWVuc2lvbnMiKTtjb25zdCBpPXRoaXMuX2NyZWF0ZVNWRygic3ZnOnN2ZyIpO2kuc2V0QXR0cmlidXRlKCJ2ZXJzaW9uIiwiMS4xIik7aWYoIW4pe2kuc2V0QXR0cmlidXRlKCJ3aWR0aCIsYCR7dH1weGApO2kuc2V0QXR0cmlidXRlKCJoZWlnaHQiLGAke2V9cHhgKX1pLnNldEF0dHJpYnV0ZSgicHJlc2VydmVBc3BlY3RSYXRpbyIsIm5vbmUiKTtpLnNldEF0dHJpYnV0ZSgidmlld0JveCIsYDAgMCAke3R9ICR7ZX1gKTtyZXR1cm4gaX1jcmVhdGVFbGVtZW50KHQpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1ZHIGVsZW1lbnQgdHlwZSIpO3JldHVybiB0aGlzLl9jcmVhdGVTVkcodCl9X2NyZWF0ZVNWRyh0KXsoMCxpLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlU1ZHYCBjYWxsZWQuIil9fWUuQmFzZVNWR0ZhY3Rvcnk9QmFzZVNWR0ZhY3Rvcnl9LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuTXVybXVySGFzaDNfNjQ9dm9pZCAwO24oOTMpO24oMTAxKTtuKDEwMik7bigxMDUpO24oMTA3KTtuKDEwOSk7bigxMTMpO24oMTE2KTtuKDEyMyk7bigyKTt2YXIgaT1uKDEpO2NvbnN0IHI9MzI4NTM3NzUyMCxzPTQyOTQ5MDE3NjAsYT02NTUzNTtlLk11cm11ckhhc2gzXzY0PWNsYXNzIE11cm11ckhhc2gzXzY0e2NvbnN0cnVjdG9yKHQpe3RoaXMuaDE9dD80Mjk0OTY3Mjk1JnQ6cjt0aGlzLmgyPXQ/NDI5NDk2NzI5NSZ0OnJ9dXBkYXRlKHQpe2xldCBlLG47aWYoInN0cmluZyI9PXR5cGVvZiB0KXtlPW5ldyBVaW50OEFycmF5KDIqdC5sZW5ndGgpO249MDtmb3IobGV0IGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspe2NvbnN0IHI9dC5jaGFyQ29kZUF0KGkpO2lmKHI8PTI1NSllW24rK109cjtlbHNle2VbbisrXT1yPj4+ODtlW24rK109MjU1JnJ9fX1lbHNle2lmKCEoMCxpLmlzQXJyYXlCdWZmZXIpKHQpKXRocm93IG5ldyBFcnJvcigiV3JvbmcgZGF0YSBmb3JtYXQgaW4gTXVybXVySGFzaDNfNjRfdXBkYXRlLiBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LiIpO2U9dC5zbGljZSgpO249ZS5ieXRlTGVuZ3RofWNvbnN0IHI9bj4+MixvPW4tNCpyLGw9bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyLDAscik7bGV0IGM9MCxoPTAsZD10aGlzLmgxLHU9dGhpcy5oMjtjb25zdCBwPTM0MzI5MTgzNTMsZj00NjE4NDU5MDcsZz0xMTYwMSxtPTEzNzE1O2ZvcihsZXQgdD0wO3Q8cjt0KyspaWYoMSZ0KXtjPWxbdF07Yz1jKnAmc3xjKmcmYTtjPWM8PDE1fGM+Pj4xNztjPWMqZiZzfGMqbSZhO2RePWM7ZD1kPDwxM3xkPj4+MTk7ZD01KmQrMzg2NDI5MjE5Nn1lbHNle2g9bFt0XTtoPWgqcCZzfGgqZyZhO2g9aDw8MTV8aD4+PjE3O2g9aCpmJnN8aCptJmE7dV49aDt1PXU8PDEzfHU+Pj4xOTt1PTUqdSszODY0MjkyMTk2fWM9MDtzd2l0Y2gobyl7Y2FzZSAzOmNePWVbNCpyKzJdPDwxNjtjYXNlIDI6Y149ZVs0KnIrMV08PDg7Y2FzZSAxOmNePWVbNCpyXTtjPWMqcCZzfGMqZyZhO2M9Yzw8MTV8Yz4+PjE3O2M9YypmJnN8YyptJmE7MSZyP2RePWM6dV49Y310aGlzLmgxPWQ7dGhpcy5oMj11fWhleGRpZ2VzdCgpe2xldCB0PXRoaXMuaDEsZT10aGlzLmgyO3RePWU+Pj4xO3Q9Mzk4MTgwNjc5Nyp0JnN8MzYwNDUqdCZhO2U9NDI4MzU0MzUxMSplJnN8KDI5NTAxNjM3OTcqKGU8PDE2fHQ+Pj4xNikmcyk+Pj4xNjt0Xj1lPj4+MTt0PTQ0NDk4NDQwMyp0JnN8NjA0OTkqdCZhO2U9MzMwMTg4MjM2NiplJnN8KDMxMjA0Mzc4OTMqKGU8PDE2fHQ+Pj4xNikmcyk+Pj4xNjt0Xj1lPj4+MTtyZXR1cm4odD4+PjApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCIwIikrKGU+Pj4wKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwiMCIpfX19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuRm9udExvYWRlcj1lLkZvbnRGYWNlT2JqZWN0PXZvaWQgMDtuKDEyNSk7bigxMzUpO24oMTM3KTtuKDE0MCk7bigxNDIpO24oMTQ0KTtuKDE0Nik7big4OSk7bigxNDgpO3ZhciBpPW4oMSk7ZS5Gb250TG9hZGVyPWNsYXNzIEZvbnRMb2FkZXJ7I1d0PW5ldyBTZXQ7Y29uc3RydWN0b3IodCl7bGV0e293bmVyRG9jdW1lbnQ6ZT1nbG9iYWxUaGlzLmRvY3VtZW50LHN0eWxlRWxlbWVudDpuPW51bGx9PXQ7dGhpcy5fZG9jdW1lbnQ9ZTt0aGlzLm5hdGl2ZUZvbnRGYWNlcz1uZXcgU2V0O3RoaXMuc3R5bGVFbGVtZW50PW51bGw7dGhpcy5sb2FkaW5nUmVxdWVzdHM9W107dGhpcy5sb2FkVGVzdEZvbnRJZD0wfWFkZE5hdGl2ZUZvbnRGYWNlKHQpe3RoaXMubmF0aXZlRm9udEZhY2VzLmFkZCh0KTt0aGlzLl9kb2N1bWVudC5mb250cy5hZGQodCl9cmVtb3ZlTmF0aXZlRm9udEZhY2UodCl7dGhpcy5uYXRpdmVGb250RmFjZXMuZGVsZXRlKHQpO3RoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZSh0KX1pbnNlcnRSdWxlKHQpe2lmKCF0aGlzLnN0eWxlRWxlbWVudCl7dGhpcy5zdHlsZUVsZW1lbnQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmQodGhpcy5zdHlsZUVsZW1lbnQpfWNvbnN0IGU9dGhpcy5zdHlsZUVsZW1lbnQuc2hlZXQ7ZS5pbnNlcnRSdWxlKHQsZS5jc3NSdWxlcy5sZW5ndGgpfWNsZWFyKCl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5uYXRpdmVGb250RmFjZXMpdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKHQpO3RoaXMubmF0aXZlRm9udEZhY2VzLmNsZWFyKCk7dGhpcy4jV3QuY2xlYXIoKTtpZih0aGlzLnN0eWxlRWxlbWVudCl7dGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7dGhpcy5zdHlsZUVsZW1lbnQ9bnVsbH19YXN5bmMgbG9hZFN5c3RlbUZvbnQodCl7aWYodCYmIXRoaXMuI1d0Lmhhcyh0LmxvYWRlZE5hbWUpKXsoMCxpLmFzc2VydCkoIXRoaXMuZGlzYWJsZUZvbnRGYWNlLCJsb2FkU3lzdGVtRm9udCBzaG91bGRuJ3QgYmUgY2FsbGVkIHdoZW4gYGRpc2FibGVGb250RmFjZWAgaXMgc2V0LiIpO2lmKHRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCl7Y29uc3R7bG9hZGVkTmFtZTplLHNyYzpuLHN0eWxlOnJ9PXQscz1uZXcgRm9udEZhY2UoZSxuLHIpO3RoaXMuYWRkTmF0aXZlRm9udEZhY2Uocyk7dHJ5e2F3YWl0IHMubG9hZCgpO3RoaXMuI1d0LmFkZChlKX1jYXRjaHsoMCxpLndhcm4pKGBDYW5ub3QgbG9hZCBzeXN0ZW0gZm9udDogJHt0LmJhc2VGb250TmFtZX0sIGluc3RhbGxpbmcgaXQgY291bGQgaGVscCB0byBpbXByb3ZlIFBERiByZW5kZXJpbmcuYCk7dGhpcy5yZW1vdmVOYXRpdmVGb250RmFjZShzKX19ZWxzZSgwLGkudW5yZWFjaGFibGUpKCJOb3QgaW1wbGVtZW50ZWQ6IGxvYWRTeXN0ZW1Gb250IHdpdGhvdXQgdGhlIEZvbnQgTG9hZGluZyBBUEkuIil9fWFzeW5jIGJpbmQodCl7aWYodC5hdHRhY2hlZHx8dC5taXNzaW5nRmlsZSYmIXQuc3lzdGVtRm9udEluZm8pcmV0dXJuO3QuYXR0YWNoZWQ9ITA7aWYodC5zeXN0ZW1Gb250SW5mbyl7YXdhaXQgdGhpcy5sb2FkU3lzdGVtRm9udCh0LnN5c3RlbUZvbnRJbmZvKTtyZXR1cm59aWYodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKXtjb25zdCBlPXQuY3JlYXRlTmF0aXZlRm9udEZhY2UoKTtpZihlKXt0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKGUpO3RyeXthd2FpdCBlLmxvYWRlZH1jYXRjaChuKXsoMCxpLndhcm4pKGBGYWlsZWQgdG8gbG9hZCBmb250ICcke2UuZmFtaWx5fSc6ICcke259Jy5gKTt0LmRpc2FibGVGb250RmFjZT0hMDt0aHJvdyBufX1yZXR1cm59Y29uc3QgZT10LmNyZWF0ZUZvbnRGYWNlUnVsZSgpO2lmKGUpe3RoaXMuaW5zZXJ0UnVsZShlKTtpZih0aGlzLmlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKXJldHVybjthd2FpdCBuZXcgUHJvbWlzZSgoZT0+e2NvbnN0IG49dGhpcy5fcXVldWVMb2FkaW5nQ2FsbGJhY2soZSk7dGhpcy5fcHJlcGFyZUZvbnRMb2FkRXZlbnQodCxuKX0pKX19Z2V0IGlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQoKXtjb25zdCB0PSEhdGhpcy5fZG9jdW1lbnQ/LmZvbnRzO3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkIix0KX1nZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKXtsZXQgdD0hMTsoaS5pc05vZGVKU3x8InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3ImJi9Nb3ppbGxhXC81LjAuKj9ydjpcZCsuKj8gR2Vja28vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpJiYodD0hMCk7cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkIix0KX1fcXVldWVMb2FkaW5nQ2FsbGJhY2sodCl7Y29uc3R7bG9hZGluZ1JlcXVlc3RzOmV9PXRoaXMsbj17ZG9uZTohMSxjb21wbGV0ZTpmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKXsoMCxpLmFzc2VydCkoIW4uZG9uZSwiY29tcGxldGVSZXF1ZXN0KCkgY2Fubm90IGJlIGNhbGxlZCB0d2ljZS4iKTtuLmRvbmU9ITA7Zm9yKDtlLmxlbmd0aD4wJiZlWzBdLmRvbmU7KXtjb25zdCB0PWUuc2hpZnQoKTtzZXRUaW1lb3V0KHQuY2FsbGJhY2ssMCl9fSxjYWxsYmFjazp0fTtlLnB1c2gobik7cmV0dXJuIG59Z2V0IF9sb2FkVGVzdEZvbnQoKXtjb25zdCB0PWF0b2IoIlQxUlVUd0FMQUlBQUF3QXdRMFpHSURIdFpnNEFBQU9ZQUFBQWdVWkdWRTFsa3pad0FBQUVIQUFBQUJ4SFJFVkdBQlFBRlFBQUJEZ0FBQUFlVDFNdk1sWU5Zd2tBQUFFZ0FBQUFZR050WVhBQkRRTFVBQUFDTkFBQUFVSm9aV0ZrL3hWRkRRQUFBTHdBQUFBMmFHaGxZUWRrQStvQUFBRDBBQUFBSkdodGRIZ0Q2QUFBQUFBRVdBQUFBQVp0WVhod0FBSlFBQUFBQVJnQUFBQUdibUZ0WlZqbWRINEFBQUdBQUFBQXNYQnZjM1QvaGdBekFBQURlQUFBQUNBQUFRQUFBQUVBQUxaUkZzUmZEenoxQUFzRDZBQUFBQURPQk9UTEFBQUFBTTRLSER3QUFBQUFBK2dESVFBQUFBZ0FBZ0FBQUFBQUFBQUJBQUFESVFBQUFGb0Q2QUFBQUFBRDZBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFVQUFBQWdBQUFBUUQ2QUgwQUFVQUFBS0tBcndBQUFDTUFvb0N2QUFBQWVBQU1RRUNBQUFDQUFZSkFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBRkJtUldRQXdBQXVBQzRESVA4NEFGb0RJUUFBQUFBQUFRQUFBQUFBQUFBQUFDQUFJQUFCQUFBQURnQ3VBQUVBQUFBQUFBQUFBUUFBQUFFQUFBQUFBQUVBQVFBQUFBRUFBQUFBQUFJQUFRQUFBQUVBQUFBQUFBTUFBUUFBQUFFQUFBQUFBQVFBQVFBQUFBRUFBQUFBQUFVQUFRQUFBQUVBQUFBQUFBWUFBUUFBQUFNQUFRUUpBQUFBQWdBQkFBTUFBUVFKQUFFQUFnQUJBQU1BQVFRSkFBSUFBZ0FCQUFNQUFRUUpBQU1BQWdBQkFBTUFBUVFKQUFRQUFnQUJBQU1BQVFRSkFBVUFBZ0FCQUFNQUFRUUpBQVlBQWdBQldBQllBQUFBQUFBQUF3QUFBQU1BQUFBY0FBRUFBQUFBQUR3QUF3QUJBQUFBSEFBRUFDQUFBQUFFQUFRQUFRQUFBQzcvL3dBQUFDNy8vLy9UQUFFQUFBQUFBQUFCQmdBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNQUFBQUFBQUQvZ3dBeUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQVFFQUFFQkFRSllBQUVCQVNINER3RDRHd0hFQXZnY0EvZ1hCSXdNQVl1TCtuejV0UVhrRDVqM0NCTG5FUUFDQVFFQklWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZQUFBQkFRQUFEd0FDQVFFRUUvdDNEb3Y2ZkFINmZBVCtmUHA4K253SERvc01Ddm0xQ3ZtMURBejZmQlFBQUFBQUFBQUJBQUFBQU1tSmJ6RUFBQUFBemdUakZRQUFBQURPQk9RcEFBRUFBQUFBQUFBQURBQVVBQVFBQUFBQkFBQUFBZ0FCQUFBQUFBQUFBQUFENkFBQUFBQUFBQT09Iik7cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsIl9sb2FkVGVzdEZvbnQiLHQpfV9wcmVwYXJlRm9udExvYWRFdmVudCh0LGUpe2Z1bmN0aW9uIGludDMyKHQsZSl7cmV0dXJuIHQuY2hhckNvZGVBdChlKTw8MjR8dC5jaGFyQ29kZUF0KGUrMSk8PDE2fHQuY2hhckNvZGVBdChlKzIpPDw4fDI1NSZ0LmNoYXJDb2RlQXQoZSszKX1mdW5jdGlvbiBzcGxpY2VTdHJpbmcodCxlLG4saSl7cmV0dXJuIHQuc3Vic3RyaW5nKDAsZSkraSt0LnN1YnN0cmluZyhlK24pfWxldCBuLHI7Y29uc3Qgcz10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtzLndpZHRoPTE7cy5oZWlnaHQ9MTtjb25zdCBhPXMuZ2V0Q29udGV4dCgiMmQiKTtsZXQgbz0wO2NvbnN0IGw9YGx0JHtEYXRlLm5vdygpfSR7dGhpcy5sb2FkVGVzdEZvbnRJZCsrfWA7bGV0IGM9dGhpcy5fbG9hZFRlc3RGb250O2M9c3BsaWNlU3RyaW5nKGMsOTc2LGwubGVuZ3RoLGwpO2NvbnN0IGg9MTQ4MjE4NDc5MjtsZXQgZD1pbnQzMihjLDE2KTtmb3Iobj0wLHI9bC5sZW5ndGgtMztuPHI7bis9NClkPWQtaCtpbnQzMihsLG4pfDA7bjxsLmxlbmd0aCYmKGQ9ZC1oK2ludDMyKGwrIlhYWCIsbil8MCk7Yz1zcGxpY2VTdHJpbmcoYywxNiw0LCgwLGkuc3RyaW5nMzIpKGQpKTtjb25zdCB1PWBAZm9udC1mYWNlIHtmb250LWZhbWlseToiJHtsfSI7c3JjOiR7YHVybChkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCR7YnRvYShjKX0pO2B9fWA7dGhpcy5pbnNlcnRSdWxlKHUpO2NvbnN0IHA9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iO3Auc3R5bGUud2lkdGg9cC5zdHlsZS5oZWlnaHQ9IjEwcHgiO3Auc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtwLnN0eWxlLnRvcD1wLnN0eWxlLmxlZnQ9IjBweCI7Zm9yKGNvbnN0IGUgb2ZbdC5sb2FkZWROYW1lLGxdKXtjb25zdCB0PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt0LnRleHRDb250ZW50PSJIaSI7dC5zdHlsZS5mb250RmFtaWx5PWU7cC5hcHBlbmQodCl9dGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmQocCk7IWZ1bmN0aW9uIGlzRm9udFJlYWR5KHQsZSl7aWYoKytvPjMwKXsoMCxpLndhcm4pKCJMb2FkIHRlc3QgZm9udCBuZXZlciBsb2FkZWQuIik7ZSgpO3JldHVybn1hLmZvbnQ9IjMwcHggIit0O2EuZmlsbFRleHQoIi4iLDAsMjApO2EuZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGFbM10+MD9lKCk6c2V0VGltZW91dChpc0ZvbnRSZWFkeS5iaW5kKG51bGwsdCxlKSl9KGwsKCgpPT57cC5yZW1vdmUoKTtlLmNvbXBsZXRlKCl9KSl9fTtlLkZvbnRGYWNlT2JqZWN0PWNsYXNzIEZvbnRGYWNlT2JqZWN0e2NvbnN0cnVjdG9yKHQsZSl7bGV0e2lzRXZhbFN1cHBvcnRlZDpuPSEwLGRpc2FibGVGb250RmFjZTppPSExLGlnbm9yZUVycm9yczpyPSExLGluc3BlY3RGb250OnM9bnVsbH09ZTt0aGlzLmNvbXBpbGVkR2x5cGhzPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0IGUgaW4gdCl0aGlzW2VdPXRbZV07dGhpcy5pc0V2YWxTdXBwb3J0ZWQ9ITEhPT1uO3RoaXMuZGlzYWJsZUZvbnRGYWNlPSEwPT09aTt0aGlzLmlnbm9yZUVycm9ycz0hMD09PXI7dGhpcy5faW5zcGVjdEZvbnQ9c31jcmVhdGVOYXRpdmVGb250RmFjZSgpe2lmKCF0aGlzLmRhdGF8fHRoaXMuZGlzYWJsZUZvbnRGYWNlKXJldHVybiBudWxsO2xldCB0O2lmKHRoaXMuY3NzRm9udEluZm8pe2NvbnN0IGU9e3dlaWdodDp0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHR9O3RoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUmJihlLnN0eWxlPWBvYmxpcXVlICR7dGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZX1kZWdgKTt0PW5ldyBGb250RmFjZSh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksdGhpcy5kYXRhLGUpfWVsc2UgdD1uZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLHRoaXMuZGF0YSx7fSk7dGhpcy5faW5zcGVjdEZvbnQ/Lih0aGlzKTtyZXR1cm4gdH1jcmVhdGVGb250RmFjZVJ1bGUoKXtpZighdGhpcy5kYXRhfHx0aGlzLmRpc2FibGVGb250RmFjZSlyZXR1cm4gbnVsbDtjb25zdCB0PSgwLGkuYnl0ZXNUb1N0cmluZykodGhpcy5kYXRhKSxlPWB1cmwoZGF0YToke3RoaXMubWltZXR5cGV9O2Jhc2U2NCwke2J0b2EodCl9KTtgO2xldCBuO2lmKHRoaXMuY3NzRm9udEluZm8pe2xldCB0PWBmb250LXdlaWdodDogJHt0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHR9O2A7dGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSYmKHQrPWBmb250LXN0eWxlOiBvYmxpcXVlICR7dGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZX1kZWc7YCk7bj1gQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6IiR7dGhpcy5jc3NGb250SW5mby5mb250RmFtaWx5fSI7JHt0fXNyYzoke2V9fWB9ZWxzZSBuPWBAZm9udC1mYWNlIHtmb250LWZhbWlseToiJHt0aGlzLmxvYWRlZE5hbWV9IjtzcmM6JHtlfX1gO3RoaXMuX2luc3BlY3RGb250Py4odGhpcyxlKTtyZXR1cm4gbn1nZXRQYXRoR2VuZXJhdG9yKHQsZSl7aWYodm9pZCAwIT09dGhpcy5jb21waWxlZEdseXBoc1tlXSlyZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tlXTtsZXQgbjt0cnl7bj10LmdldCh0aGlzLmxvYWRlZE5hbWUrIl9wYXRoXyIrZSl9Y2F0Y2godCl7aWYoIXRoaXMuaWdub3JlRXJyb3JzKXRocm93IHQ7KDAsaS53YXJuKShgZ2V0UGF0aEdlbmVyYXRvciAtIGlnbm9yaW5nIGNoYXJhY3RlcjogIiR7dH0iLmApO3JldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2VdPWZ1bmN0aW9uKHQsZSl7fX1pZih0aGlzLmlzRXZhbFN1cHBvcnRlZCYmaS5GZWF0dXJlVGVzdC5pc0V2YWxTdXBwb3J0ZWQpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IGUgb2Ygbil7Y29uc3Qgbj12b2lkIDAhPT1lLmFyZ3M/ZS5hcmdzLmpvaW4oIiwiKToiIjt0LnB1c2goImMuIixlLmNtZCwiKCIsbiwiKTtcbiIpfXJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2VdPW5ldyBGdW5jdGlvbigiYyIsInNpemUiLHQuam9pbigiIikpfXJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2VdPWZ1bmN0aW9uKHQsZSl7Zm9yKGNvbnN0IGkgb2Ygbil7InNjYWxlIj09PWkuY21kJiYoaS5hcmdzPVtlLC1lXSk7dFtpLmNtZF0uYXBwbHkodCxpLmFyZ3MpfX19fX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk9ZS5Ob2RlRmlsdGVyRmFjdG9yeT1lLk5vZGVDYW52YXNGYWN0b3J5PWUuTm9kZUNNYXBSZWFkZXJGYWN0b3J5PXZvaWQgMDtuKDIpO24oOTMpO24oMTAxKTtuKDEwMik7bigxMDUpO24oMTA3KTtuKDEwOSk7bigxMTMpO24oMTE2KTtuKDEyMyk7dmFyIGk9bigxNjgpLHI9bigxKTshZnVuY3Rpb24gY2hlY2tET01NYXRyaXgoKXtpZighZ2xvYmFsVGhpcy5ET01NYXRyaXgmJnIuaXNOb2RlSlMpdHJ5e2dsb2JhbFRoaXMuRE9NTWF0cml4PXJlcXVpcmUoImNhbnZhcyIpLkRPTU1hdHJpeH1jYXRjaCh0KXsoMCxyLndhcm4pKGBDYW5ub3QgcG9seWZpbGwgXGBET01NYXRyaXhcYCwgcmVuZGVyaW5nIG1heSBiZSBicm9rZW46ICIke3R9Ii5gKX19KCk7IWZ1bmN0aW9uIGNoZWNrUGF0aDJEKCl7aWYoIWdsb2JhbFRoaXMuUGF0aDJEJiZyLmlzTm9kZUpTKXRyeXtjb25zdHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ6dH09cmVxdWlyZSgiY2FudmFzIikse3BvbHlmaWxsUGF0aDJEOmV9PXJlcXVpcmUoInBhdGgyZC1wb2x5ZmlsbCIpO2dsb2JhbFRoaXMuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPXQ7ZShnbG9iYWxUaGlzKX1jYXRjaCh0KXsoMCxyLndhcm4pKGBDYW5ub3QgcG9seWZpbGwgXGBQYXRoMkRcYCwgcmVuZGVyaW5nIG1heSBiZSBicm9rZW46ICIke3R9Ii5gKX19KCk7Y29uc3QgZmV0Y2hEYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZSgoKGUsbik9PntyZXF1aXJlKCJmcyIpLnJlYWRGaWxlKHQsKCh0LGkpPT57IXQmJmk/ZShuZXcgVWludDhBcnJheShpKSk6bihuZXcgRXJyb3IodCkpfSkpfSkpfTtjbGFzcyBOb2RlRmlsdGVyRmFjdG9yeSBleHRlbmRzIGkuQmFzZUZpbHRlckZhY3Rvcnl7fWUuTm9kZUZpbHRlckZhY3Rvcnk9Tm9kZUZpbHRlckZhY3Rvcnk7Y2xhc3MgTm9kZUNhbnZhc0ZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VDYW52YXNGYWN0b3J5e19jcmVhdGVDYW52YXModCxlKXtyZXR1cm4gcmVxdWlyZSgiY2FudmFzIikuY3JlYXRlQ2FudmFzKHQsZSl9fWUuTm9kZUNhbnZhc0ZhY3Rvcnk9Tm9kZUNhbnZhc0ZhY3Rvcnk7Y2xhc3MgTm9kZUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgaS5CYXNlQ01hcFJlYWRlckZhY3Rvcnl7X2ZldGNoRGF0YSh0LGUpe3JldHVybiBmZXRjaERhdGEodCkudGhlbigodD0+KHtjTWFwRGF0YTp0LGNvbXByZXNzaW9uVHlwZTplfSkpKX19ZS5Ob2RlQ01hcFJlYWRlckZhY3Rvcnk9Tm9kZUNNYXBSZWFkZXJGYWN0b3J5O2NsYXNzIE5vZGVTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBleHRlbmRzIGkuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5e19mZXRjaERhdGEodCl7cmV0dXJuIGZldGNoRGF0YSh0KX19ZS5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk9Tm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLkNhbnZhc0dyYXBoaWNzPXZvaWQgMDtuKDIpO24oOTMpO24oMTAxKTtuKDEwMik7bigxMDUpO24oMTA3KTtuKDEwOSk7bigxMTMpO24oMTE2KTtuKDEyMyk7big4OSk7dmFyIGk9bigxKSxyPW4oMTY3KSxzPW4oMTczKSxhPW4oMTc0KTtjb25zdCBvPTQwOTYsbD0xNjtjbGFzcyBDYWNoZWRDYW52YXNlc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmNhbnZhc0ZhY3Rvcnk9dDt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCl9Z2V0Q2FudmFzKHQsZSxuKXtsZXQgaTtpZih2b2lkIDAhPT10aGlzLmNhY2hlW3RdKXtpPXRoaXMuY2FjaGVbdF07dGhpcy5jYW52YXNGYWN0b3J5LnJlc2V0KGksZSxuKX1lbHNle2k9dGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShlLG4pO3RoaXMuY2FjaGVbdF09aX1yZXR1cm4gaX1kZWxldGUodCl7ZGVsZXRlIHRoaXMuY2FjaGVbdF19Y2xlYXIoKXtmb3IoY29uc3QgdCBpbiB0aGlzLmNhY2hlKXtjb25zdCBlPXRoaXMuY2FjaGVbdF07dGhpcy5jYW52YXNGYWN0b3J5LmRlc3Ryb3koZSk7ZGVsZXRlIHRoaXMuY2FjaGVbdF19fX1mdW5jdGlvbiBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHModCxlLG4saSxzLGEsbyxsLGMsaCl7Y29uc3RbZCx1LHAsZixnLG1dPSgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodCk7aWYoMD09PXUmJjA9PT1wKXtjb25zdCByPW8qZCtnLGI9TWF0aC5yb3VuZChyKSx2PWwqZittLHk9TWF0aC5yb3VuZCh2KSxBPShvK2MpKmQrZyxfPU1hdGguYWJzKE1hdGgucm91bmQoQSktYil8fDEsUz0obCtoKSpmK20sRT1NYXRoLmFicyhNYXRoLnJvdW5kKFMpLXkpfHwxO3Quc2V0VHJhbnNmb3JtKE1hdGguc2lnbihkKSwwLDAsTWF0aC5zaWduKGYpLGIseSk7dC5kcmF3SW1hZ2UoZSxuLGkscyxhLDAsMCxfLEUpO3Quc2V0VHJhbnNmb3JtKGQsdSxwLGYsZyxtKTtyZXR1cm5bXyxFXX1pZigwPT09ZCYmMD09PWYpe2NvbnN0IHI9bCpwK2csYj1NYXRoLnJvdW5kKHIpLHY9byp1K20seT1NYXRoLnJvdW5kKHYpLEE9KGwraCkqcCtnLF89TWF0aC5hYnMoTWF0aC5yb3VuZChBKS1iKXx8MSxTPShvK2MpKnUrbSxFPU1hdGguYWJzKE1hdGgucm91bmQoUykteSl8fDE7dC5zZXRUcmFuc2Zvcm0oMCxNYXRoLnNpZ24odSksTWF0aC5zaWduKHApLDAsYix5KTt0LmRyYXdJbWFnZShlLG4saSxzLGEsMCwwLEUsXyk7dC5zZXRUcmFuc2Zvcm0oZCx1LHAsZixnLG0pO3JldHVybltFLF9dfXQuZHJhd0ltYWdlKGUsbixpLHMsYSxvLGwsYyxoKTtyZXR1cm5bTWF0aC5oeXBvdChkLHUpKmMsTWF0aC5oeXBvdChwLGYpKmhdfWNsYXNzIENhbnZhc0V4dHJhU3RhdGV7Y29uc3RydWN0b3IodCxlKXt0aGlzLmFscGhhSXNTaGFwZT0hMTt0aGlzLmZvbnRTaXplPTA7dGhpcy5mb250U2l6ZVNjYWxlPTE7dGhpcy50ZXh0TWF0cml4PWkuSURFTlRJVFlfTUFUUklYO3RoaXMudGV4dE1hdHJpeFNjYWxlPTE7dGhpcy5mb250TWF0cml4PWkuRk9OVF9JREVOVElUWV9NQVRSSVg7dGhpcy5sZWFkaW5nPTA7dGhpcy54PTA7dGhpcy55PTA7dGhpcy5saW5lWD0wO3RoaXMubGluZVk9MDt0aGlzLmNoYXJTcGFjaW5nPTA7dGhpcy53b3JkU3BhY2luZz0wO3RoaXMudGV4dEhTY2FsZT0xO3RoaXMudGV4dFJlbmRlcmluZ01vZGU9aS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMO3RoaXMudGV4dFJpc2U9MDt0aGlzLmZpbGxDb2xvcj0iIzAwMDAwMCI7dGhpcy5zdHJva2VDb2xvcj0iIzAwMDAwMCI7dGhpcy5wYXR0ZXJuRmlsbD0hMTt0aGlzLmZpbGxBbHBoYT0xO3RoaXMuc3Ryb2tlQWxwaGE9MTt0aGlzLmxpbmVXaWR0aD0xO3RoaXMuYWN0aXZlU01hc2s9bnVsbDt0aGlzLnRyYW5zZmVyTWFwcz0ibm9uZSI7dGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLDAsdCxlXSl9Y2xvbmUoKXtjb25zdCB0PU9iamVjdC5jcmVhdGUodGhpcyk7dC5jbGlwQm94PXRoaXMuY2xpcEJveC5zbGljZSgpO3JldHVybiB0fXNldEN1cnJlbnRQb2ludCh0LGUpe3RoaXMueD10O3RoaXMueT1lfXVwZGF0ZVBhdGhNaW5NYXgodCxlLG4pe1tlLG5dPWkuVXRpbC5hcHBseVRyYW5zZm9ybShbZSxuXSx0KTt0aGlzLm1pblg9TWF0aC5taW4odGhpcy5taW5YLGUpO3RoaXMubWluWT1NYXRoLm1pbih0aGlzLm1pblksbik7dGhpcy5tYXhYPU1hdGgubWF4KHRoaXMubWF4WCxlKTt0aGlzLm1heFk9TWF0aC5tYXgodGhpcy5tYXhZLG4pfXVwZGF0ZVJlY3RNaW5NYXgodCxlKXtjb25zdCBuPWkuVXRpbC5hcHBseVRyYW5zZm9ybShlLHQpLHI9aS5VdGlsLmFwcGx5VHJhbnNmb3JtKGUuc2xpY2UoMiksdCk7dGhpcy5taW5YPU1hdGgubWluKHRoaXMubWluWCxuWzBdLHJbMF0pO3RoaXMubWluWT1NYXRoLm1pbih0aGlzLm1pblksblsxXSxyWzFdKTt0aGlzLm1heFg9TWF0aC5tYXgodGhpcy5tYXhYLG5bMF0sclswXSk7dGhpcy5tYXhZPU1hdGgubWF4KHRoaXMubWF4WSxuWzFdLHJbMV0pfXVwZGF0ZVNjYWxpbmdQYXRoTWluTWF4KHQsZSl7aS5VdGlsLnNjYWxlTWluTWF4KHQsZSk7dGhpcy5taW5YPU1hdGgubWluKHRoaXMubWluWCxlWzBdKTt0aGlzLm1heFg9TWF0aC5tYXgodGhpcy5tYXhYLGVbMV0pO3RoaXMubWluWT1NYXRoLm1pbih0aGlzLm1pblksZVsyXSk7dGhpcy5tYXhZPU1hdGgubWF4KHRoaXMubWF4WSxlWzNdKX11cGRhdGVDdXJ2ZVBhdGhNaW5NYXgodCxlLG4scixzLGEsbyxsLGMsaCl7Y29uc3QgZD1pLlV0aWwuYmV6aWVyQm91bmRpbmdCb3goZSxuLHIscyxhLG8sbCxjKTtpZihoKXtoWzBdPU1hdGgubWluKGhbMF0sZFswXSxkWzJdKTtoWzFdPU1hdGgubWF4KGhbMV0sZFswXSxkWzJdKTtoWzJdPU1hdGgubWluKGhbMl0sZFsxXSxkWzNdKTtoWzNdPU1hdGgubWF4KGhbM10sZFsxXSxkWzNdKX1lbHNlIHRoaXMudXBkYXRlUmVjdE1pbk1heCh0LGQpfWdldFBhdGhCb3VuZGluZ0JveCgpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpzLlBhdGhUeXBlLkZJTEwsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbDtjb25zdCBuPVt0aGlzLm1pblgsdGhpcy5taW5ZLHRoaXMubWF4WCx0aGlzLm1heFldO2lmKHQ9PT1zLlBhdGhUeXBlLlNUUk9LRSl7ZXx8KDAsaS51bnJlYWNoYWJsZSkoIlN0cm9rZSBib3VuZGluZyBib3ggbXVzdCBpbmNsdWRlIHRyYW5zZm9ybS4iKTtjb25zdCB0PWkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShlKSxyPXRbMF0qdGhpcy5saW5lV2lkdGgvMixzPXRbMV0qdGhpcy5saW5lV2lkdGgvMjtuWzBdLT1yO25bMV0tPXM7blsyXSs9cjtuWzNdKz1zfXJldHVybiBufXVwZGF0ZUNsaXBGcm9tUGF0aCgpe2NvbnN0IHQ9aS5VdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsdGhpcy5nZXRQYXRoQm91bmRpbmdCb3goKSk7dGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KHR8fFswLDAsMCwwXSl9aXNFbXB0eUNsaXAoKXtyZXR1cm4gdGhpcy5taW5YPT09MS8wfXN0YXJ0TmV3UGF0aEFuZENsaXBCb3godCl7dGhpcy5jbGlwQm94PXQ7dGhpcy5taW5YPTEvMDt0aGlzLm1pblk9MS8wO3RoaXMubWF4WD0wO3RoaXMubWF4WT0wfWdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06cy5QYXRoVHlwZS5GSUxMLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGw7cmV0dXJuIGkuVXRpbC5pbnRlcnNlY3QodGhpcy5jbGlwQm94LHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KHQsZSkpfX1mdW5jdGlvbiBwdXRCaW5hcnlJbWFnZURhdGEodCxlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlRGF0YSYmZSBpbnN0YW5jZW9mIEltYWdlRGF0YSl7dC5wdXRJbWFnZURhdGEoZSwwLDApO3JldHVybn1jb25zdCBuPWUuaGVpZ2h0LHI9ZS53aWR0aCxzPW4lbCxhPShuLXMpL2wsbz0wPT09cz9hOmErMSxjPXQuY3JlYXRlSW1hZ2VEYXRhKHIsbCk7bGV0IGgsZD0wO2NvbnN0IHU9ZS5kYXRhLHA9Yy5kYXRhO2xldCBmLGcsbSxiO2lmKGUua2luZD09PWkuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKXtjb25zdCBlPXUuYnl0ZUxlbmd0aCxuPW5ldyBVaW50MzJBcnJheShwLmJ1ZmZlciwwLHAuYnl0ZUxlbmd0aD4+MiksYj1uLmxlbmd0aCx2PXIrNz4+Myx5PTQyOTQ5NjcyOTUsQT1pLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuPzQyNzgxOTAwODA6MjU1O2ZvcihmPTA7ZjxvO2YrKyl7bT1mPGE/bDpzO2g9MDtmb3IoZz0wO2c8bTtnKyspe2NvbnN0IHQ9ZS1kO2xldCBpPTA7Y29uc3Qgcz10PnY/cjo4KnQtNyxhPS04JnM7bGV0IG89MCxsPTA7Zm9yKDtpPGE7aSs9OCl7bD11W2QrK107bltoKytdPTEyOCZsP3k6QTtuW2grK109NjQmbD95OkE7bltoKytdPTMyJmw/eTpBO25baCsrXT0xNiZsP3k6QTtuW2grK109OCZsP3k6QTtuW2grK109NCZsP3k6QTtuW2grK109MiZsP3k6QTtuW2grK109MSZsP3k6QX1mb3IoO2k8cztpKyspe2lmKDA9PT1vKXtsPXVbZCsrXTtvPTEyOH1uW2grK109bCZvP3k6QTtvPj49MX19Zm9yKDtoPGI7KW5baCsrXT0wO3QucHV0SW1hZ2VEYXRhKGMsMCxmKmwpfX1lbHNlIGlmKGUua2luZD09PWkuSW1hZ2VLaW5kLlJHQkFfMzJCUFApe2c9MDtiPXIqbCo0O2ZvcihmPTA7ZjxhO2YrKyl7cC5zZXQodS5zdWJhcnJheShkLGQrYikpO2QrPWI7dC5wdXRJbWFnZURhdGEoYywwLGcpO2crPWx9aWYoZjxvKXtiPXIqcyo0O3Auc2V0KHUuc3ViYXJyYXkoZCxkK2IpKTt0LnB1dEltYWdlRGF0YShjLDAsZyl9fWVsc2V7aWYoZS5raW5kIT09aS5JbWFnZUtpbmQuUkdCXzI0QlBQKXRocm93IG5ldyBFcnJvcihgYmFkIGltYWdlIGtpbmQ6ICR7ZS5raW5kfWApO209bDtiPXIqbTtmb3IoZj0wO2Y8bztmKyspe2lmKGY+PWEpe209cztiPXIqbX1oPTA7Zm9yKGc9YjtnLS07KXtwW2grK109dVtkKytdO3BbaCsrXT11W2QrK107cFtoKytdPXVbZCsrXTtwW2grK109MjU1fXQucHV0SW1hZ2VEYXRhKGMsMCxmKmwpfX19ZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VNYXNrKHQsZSl7aWYoZS5iaXRtYXApe3QuZHJhd0ltYWdlKGUuYml0bWFwLDAsMCk7cmV0dXJufWNvbnN0IG49ZS5oZWlnaHQsaT1lLndpZHRoLHI9biVsLHM9KG4tcikvbCxvPTA9PT1yP3M6cysxLGM9dC5jcmVhdGVJbWFnZURhdGEoaSxsKTtsZXQgaD0wO2NvbnN0IGQ9ZS5kYXRhLHU9Yy5kYXRhO2ZvcihsZXQgZT0wO2U8bztlKyspe2NvbnN0IG49ZTxzP2w6cjsoe3NyY1BvczpofT0oMCxhLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7c3JjOmQsc3JjUG9zOmgsZGVzdDp1LHdpZHRoOmksaGVpZ2h0Om4sbm9uQmxhY2tDb2xvcjowfSkpO3QucHV0SW1hZ2VEYXRhKGMsMCxlKmwpfX1mdW5jdGlvbiBjb3B5Q3R4U3RhdGUodCxlKXtjb25zdCBuPVsic3Ryb2tlU3R5bGUiLCJmaWxsU3R5bGUiLCJmaWxsUnVsZSIsImdsb2JhbEFscGhhIiwibGluZVdpZHRoIiwibGluZUNhcCIsImxpbmVKb2luIiwibWl0ZXJMaW1pdCIsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIsImZvbnQiLCJmaWx0ZXIiXTtmb3IoY29uc3QgaSBvZiBuKXZvaWQgMCE9PXRbaV0mJihlW2ldPXRbaV0pO2lmKHZvaWQgMCE9PXQuc2V0TGluZURhc2gpe2Uuc2V0TGluZURhc2godC5nZXRMaW5lRGFzaCgpKTtlLmxpbmVEYXNoT2Zmc2V0PXQubGluZURhc2hPZmZzZXR9fWZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KHQpe3Quc3Ryb2tlU3R5bGU9dC5maWxsU3R5bGU9IiMwMDAwMDAiO3QuZmlsbFJ1bGU9Im5vbnplcm8iO3QuZ2xvYmFsQWxwaGE9MTt0LmxpbmVXaWR0aD0xO3QubGluZUNhcD0iYnV0dCI7dC5saW5lSm9pbj0ibWl0ZXIiO3QubWl0ZXJMaW1pdD0xMDt0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLW92ZXIiO3QuZm9udD0iMTBweCBzYW5zLXNlcmlmIjtpZih2b2lkIDAhPT10LnNldExpbmVEYXNoKXt0LnNldExpbmVEYXNoKFtdKTt0LmxpbmVEYXNoT2Zmc2V0PTB9aWYoIWkuaXNOb2RlSlMpe2NvbnN0e2ZpbHRlcjplfT10OyJub25lIiE9PWUmJiIiIT09ZSYmKHQuZmlsdGVyPSJub25lIil9fWZ1bmN0aW9uIGNvbXBvc2VTTWFza0JhY2tkcm9wKHQsZSxuLGkpe2NvbnN0IHI9dC5sZW5ndGg7Zm9yKGxldCBzPTM7czxyO3MrPTQpe2NvbnN0IHI9dFtzXTtpZigwPT09cil7dFtzLTNdPWU7dFtzLTJdPW47dFtzLTFdPWl9ZWxzZSBpZihyPDI1NSl7Y29uc3QgYT0yNTUtcjt0W3MtM109dFtzLTNdKnIrZSphPj44O3Rbcy0yXT10W3MtMl0qcituKmE+Pjg7dFtzLTFdPXRbcy0xXSpyK2kqYT4+OH19fWZ1bmN0aW9uIGNvbXBvc2VTTWFza0FscGhhKHQsZSxuKXtjb25zdCBpPXQubGVuZ3RoO2ZvcihsZXQgcj0zO3I8aTtyKz00KXtjb25zdCBpPW4/blt0W3JdXTp0W3JdO2Vbcl09ZVtyXSppKi4wMDM5MjE1Njg2Mjc0NTA5OHwwfX1mdW5jdGlvbiBjb21wb3NlU01hc2tMdW1pbm9zaXR5KHQsZSxuKXtjb25zdCBpPXQubGVuZ3RoO2ZvcihsZXQgcj0zO3I8aTtyKz00KXtjb25zdCBpPTc3KnRbci0zXSsxNTIqdFtyLTJdKzI4KnRbci0xXTtlW3JdPW4/ZVtyXSpuW2k+PjhdPj44OmVbcl0qaT4+MTZ9fWZ1bmN0aW9uIGNvbXBvc2VTTWFzayh0LGUsbixpKXtjb25zdCByPWlbMF0scz1pWzFdLGE9aVsyXS1yLG89aVszXS1zO2lmKDAhPT1hJiYwIT09byl7IWZ1bmN0aW9uIGdlbmVyaWNDb21wb3NlU01hc2sodCxlLG4saSxyLHMsYSxvLGwsYyxoKXtjb25zdCBkPSEhcyx1PWQ/c1swXTowLHA9ZD9zWzFdOjAsZj1kP3NbMl06MCxnPSJMdW1pbm9zaXR5Ij09PXI/Y29tcG9zZVNNYXNrTHVtaW5vc2l0eTpjb21wb3NlU01hc2tBbHBoYSxtPU1hdGgubWluKGksTWF0aC5jZWlsKDEwNDg1NzYvbikpO2ZvcihsZXQgcj0wO3I8aTtyKz1tKXtjb25zdCBzPU1hdGgubWluKG0saS1yKSxiPXQuZ2V0SW1hZ2VEYXRhKG8tYyxyKyhsLWgpLG4scyksdj1lLmdldEltYWdlRGF0YShvLHIrbCxuLHMpO2QmJmNvbXBvc2VTTWFza0JhY2tkcm9wKGIuZGF0YSx1LHAsZik7ZyhiLmRhdGEsdi5kYXRhLGEpO2UucHV0SW1hZ2VEYXRhKHYsbyxyK2wpfX0oZS5jb250ZXh0LG4sYSxvLGUuc3VidHlwZSxlLmJhY2tkcm9wLGUudHJhbnNmZXJNYXAscixzLGUub2Zmc2V0WCxlLm9mZnNldFkpO3Quc2F2ZSgpO3QuZ2xvYmFsQWxwaGE9MTt0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLW92ZXIiO3Quc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTt0LmRyYXdJbWFnZShuLmNhbnZhcywwLDApO3QucmVzdG9yZSgpfX1mdW5jdGlvbiBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQodCxlKXtjb25zdCBuPWkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0KTtuWzBdPU1hdGguZnJvdW5kKG5bMF0pO25bMV09TWF0aC5mcm91bmQoblsxXSk7Y29uc3Qgcz1NYXRoLmZyb3VuZCgoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvfHwxKSpyLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyk7cmV0dXJuIHZvaWQgMCE9PWU/ZTpuWzBdPD1zfHxuWzFdPD1zfWNvbnN0IGM9WyJidXR0Iiwicm91bmQiLCJzcXVhcmUiXSxoPVsibWl0ZXIiLCJyb3VuZCIsImJldmVsIl0sZD17fSx1PXt9O2NsYXNzIENhbnZhc0dyYXBoaWNze2NvbnN0cnVjdG9yKHQsZSxuLGkscixzLGEsbyl7bGV0e29wdGlvbmFsQ29udGVudENvbmZpZzpsLG1hcmtlZENvbnRlbnRTdGFjazpjPW51bGx9PXM7dGhpcy5jdHg9dDt0aGlzLmN1cnJlbnQ9bmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO3RoaXMuc3RhdGVTdGFjaz1bXTt0aGlzLnBlbmRpbmdDbGlwPW51bGw7dGhpcy5wZW5kaW5nRU9GaWxsPSExO3RoaXMucmVzPW51bGw7dGhpcy54b2Jqcz1udWxsO3RoaXMuY29tbW9uT2Jqcz1lO3RoaXMub2Jqcz1uO3RoaXMuY2FudmFzRmFjdG9yeT1pO3RoaXMuZmlsdGVyRmFjdG9yeT1yO3RoaXMuZ3JvdXBTdGFjaz1bXTt0aGlzLnByb2Nlc3NpbmdUeXBlMz1udWxsO3RoaXMuYmFzZVRyYW5zZm9ybT1udWxsO3RoaXMuYmFzZVRyYW5zZm9ybVN0YWNrPVtdO3RoaXMuZ3JvdXBMZXZlbD0wO3RoaXMuc21hc2tTdGFjaz1bXTt0aGlzLnNtYXNrQ291bnRlcj0wO3RoaXMudGVtcFNNYXNrPW51bGw7dGhpcy5zdXNwZW5kZWRDdHg9bnVsbDt0aGlzLmNvbnRlbnRWaXNpYmxlPSEwO3RoaXMubWFya2VkQ29udGVudFN0YWNrPWN8fFtdO3RoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnPWw7dGhpcy5jYWNoZWRDYW52YXNlcz1uZXcgQ2FjaGVkQ2FudmFzZXModGhpcy5jYW52YXNGYWN0b3J5KTt0aGlzLmNhY2hlZFBhdHRlcm5zPW5ldyBNYXA7dGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwPWE7dGhpcy52aWV3cG9ydFNjYWxlPTE7dGhpcy5vdXRwdXRTY2FsZVg9MTt0aGlzLm91dHB1dFNjYWxlWT0xO3RoaXMucGFnZUNvbG9ycz1vO3RoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmc9Wy0xLDBdO3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9bnVsbDt0aGlzLl9jYWNoZWRCaXRtYXBzTWFwPW5ldyBNYXB9Z2V0T2JqZWN0KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnN0YXJ0c1dpdGgoImdfIik/dGhpcy5jb21tb25PYmpzLmdldCh0KTp0aGlzLm9ianMuZ2V0KHQpOmV9YmVnaW5EcmF3aW5nKHQpe2xldHt0cmFuc2Zvcm06ZSx2aWV3cG9ydDpuLHRyYW5zcGFyZW5jeTppPSExLGJhY2tncm91bmQ6cz1udWxsfT10O2NvbnN0IGE9dGhpcy5jdHguY2FudmFzLndpZHRoLG89dGhpcy5jdHguY2FudmFzLmhlaWdodCxsPXRoaXMuY3R4LmZpbGxTdHlsZTt0aGlzLmN0eC5maWxsU3R5bGU9c3x8IiNmZmZmZmYiO3RoaXMuY3R4LmZpbGxSZWN0KDAsMCxhLG8pO3RoaXMuY3R4LmZpbGxTdHlsZT1sO2lmKGkpe2NvbnN0IHQ9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoInRyYW5zcGFyZW50IixhLG8pO3RoaXMuY29tcG9zaXRlQ3R4PXRoaXMuY3R4O3RoaXMudHJhbnNwYXJlbnRDYW52YXM9dC5jYW52YXM7dGhpcy5jdHg9dC5jb250ZXh0O3RoaXMuY3R4LnNhdmUoKTt0aGlzLmN0eC50cmFuc2Zvcm0oLi4uKDAsci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmNvbXBvc2l0ZUN0eCkpfXRoaXMuY3R4LnNhdmUoKTtyZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7aWYoZSl7dGhpcy5jdHgudHJhbnNmb3JtKC4uLmUpO3RoaXMub3V0cHV0U2NhbGVYPWVbMF07dGhpcy5vdXRwdXRTY2FsZVk9ZVswXX10aGlzLmN0eC50cmFuc2Zvcm0oLi4ubi50cmFuc2Zvcm0pO3RoaXMudmlld3BvcnRTY2FsZT1uLnNjYWxlO3RoaXMuYmFzZVRyYW5zZm9ybT0oMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KX1leGVjdXRlT3BlcmF0b3JMaXN0KHQsZSxuLHIpe2NvbnN0IHM9dC5hcmdzQXJyYXksYT10LmZuQXJyYXk7bGV0IG89ZXx8MDtjb25zdCBsPXMubGVuZ3RoO2lmKGw9PT1vKXJldHVybiBvO2NvbnN0IGM9bC1vPjEwJiYiZnVuY3Rpb24iPT10eXBlb2YgbixoPWM/RGF0ZS5ub3coKSsxNTowO2xldCBkPTA7Y29uc3QgdT10aGlzLmNvbW1vbk9ianMscD10aGlzLm9ianM7bGV0IGY7Zm9yKDs7KXtpZih2b2lkIDAhPT1yJiZvPT09ci5uZXh0QnJlYWtQb2ludCl7ci5icmVha0l0KG8sbik7cmV0dXJuIG99Zj1hW29dO2lmKGYhPT1pLk9QUy5kZXBlbmRlbmN5KXRoaXNbZl0uYXBwbHkodGhpcyxzW29dKTtlbHNlIGZvcihjb25zdCB0IG9mIHNbb10pe2NvbnN0IGU9dC5zdGFydHNXaXRoKCJnXyIpP3U6cDtpZighZS5oYXModCkpe2UuZ2V0KHQsbik7cmV0dXJuIG99fW8rKztpZihvPT09bClyZXR1cm4gbztpZihjJiYrK2Q+MTApe2lmKERhdGUubm93KCk+aCl7bigpO3JldHVybiBvfWQ9MH19fSNHdCgpe2Zvcig7dGhpcy5zdGF0ZVN0YWNrLmxlbmd0aHx8dGhpcy5pblNNYXNrTW9kZTspdGhpcy5yZXN0b3JlKCk7dGhpcy5jdHgucmVzdG9yZSgpO2lmKHRoaXMudHJhbnNwYXJlbnRDYW52YXMpe3RoaXMuY3R4PXRoaXMuY29tcG9zaXRlQ3R4O3RoaXMuY3R4LnNhdmUoKTt0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApO3RoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnRyYW5zcGFyZW50Q2FudmFzLDAsMCk7dGhpcy5jdHgucmVzdG9yZSgpO3RoaXMudHJhbnNwYXJlbnRDYW52YXM9bnVsbH19ZW5kRHJhd2luZygpe3RoaXMuI0d0KCk7dGhpcy5jYWNoZWRDYW52YXNlcy5jbGVhcigpO3RoaXMuY2FjaGVkUGF0dGVybnMuY2xlYXIoKTtmb3IoY29uc3QgdCBvZiB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLnZhbHVlcygpKXtmb3IoY29uc3QgZSBvZiB0LnZhbHVlcygpKSJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCYmKGUud2lkdGg9ZS5oZWlnaHQ9MCk7dC5jbGVhcigpfXRoaXMuX2NhY2hlZEJpdG1hcHNNYXAuY2xlYXIoKTt0aGlzLiNWdCgpfSNWdCgpe2lmKHRoaXMucGFnZUNvbG9ycyl7Y29uc3QgdD10aGlzLmZpbHRlckZhY3RvcnkuYWRkSENNRmlsdGVyKHRoaXMucGFnZUNvbG9ycy5mb3JlZ3JvdW5kLHRoaXMucGFnZUNvbG9ycy5iYWNrZ3JvdW5kKTtpZigibm9uZSIhPT10KXtjb25zdCBlPXRoaXMuY3R4LmZpbHRlcjt0aGlzLmN0eC5maWx0ZXI9dDt0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy5jdHguY2FudmFzLDAsMCk7dGhpcy5jdHguZmlsdGVyPWV9fX1fc2NhbGVJbWFnZSh0LGUpe2NvbnN0IG49dC53aWR0aCxpPXQuaGVpZ2h0O2xldCByLHMsYT1NYXRoLm1heChNYXRoLmh5cG90KGVbMF0sZVsxXSksMSksbz1NYXRoLm1heChNYXRoLmh5cG90KGVbMl0sZVszXSksMSksbD1uLGM9aSxoPSJwcmVzY2FsZTEiO2Zvcig7YT4yJiZsPjF8fG8+MiYmYz4xOyl7bGV0IGU9bCxuPWM7aWYoYT4yJiZsPjEpe2U9bD49MTYzODQ/TWF0aC5mbG9vcihsLzIpLTF8fDE6TWF0aC5jZWlsKGwvMik7YS89bC9lfWlmKG8+MiYmYz4xKXtuPWM+PTE2Mzg0P01hdGguZmxvb3IoYy8yKS0xfHwxOk1hdGguY2VpbChjKS8yO28vPWMvbn1yPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKGgsZSxuKTtzPXIuY29udGV4dDtzLmNsZWFyUmVjdCgwLDAsZSxuKTtzLmRyYXdJbWFnZSh0LDAsMCxsLGMsMCwwLGUsbik7dD1yLmNhbnZhcztsPWU7Yz1uO2g9InByZXNjYWxlMSI9PT1oPyJwcmVzY2FsZTIiOiJwcmVzY2FsZTEifXJldHVybntpbWc6dCxwYWludFdpZHRoOmwscGFpbnRIZWlnaHQ6Y319X2NyZWF0ZU1hc2tDYW52YXModCl7Y29uc3QgZT10aGlzLmN0eCx7d2lkdGg6bixoZWlnaHQ6YX09dCxvPXRoaXMuY3VycmVudC5maWxsQ29sb3IsbD10aGlzLmN1cnJlbnQucGF0dGVybkZpbGwsYz0oMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGUpO2xldCBoLGQsdSxwO2lmKCh0LmJpdG1hcHx8dC5kYXRhKSYmdC5jb3VudD4xKXtjb25zdCBlPXQuYml0bWFwfHx0LmRhdGEuYnVmZmVyO2Q9SlNPTi5zdHJpbmdpZnkobD9jOltjLnNsaWNlKDAsNCksb10pO2g9dGhpcy5fY2FjaGVkQml0bWFwc01hcC5nZXQoZSk7aWYoIWgpe2g9bmV3IE1hcDt0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLnNldChlLGgpfWNvbnN0IG49aC5nZXQoZCk7aWYobiYmIWwpe3JldHVybntjYW52YXM6bixvZmZzZXRYOk1hdGgucm91bmQoTWF0aC5taW4oY1swXSxjWzJdKStjWzRdKSxvZmZzZXRZOk1hdGgucm91bmQoTWF0aC5taW4oY1sxXSxjWzNdKStjWzVdKX19dT1ufWlmKCF1KXtwPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtYXNrQ2FudmFzIixuLGEpO3B1dEJpbmFyeUltYWdlTWFzayhwLmNvbnRleHQsdCl9bGV0IGY9aS5VdGlsLnRyYW5zZm9ybShjLFsxL24sMCwwLC0xL2EsMCwwXSk7Zj1pLlV0aWwudHJhbnNmb3JtKGYsWzEsMCwwLDEsMCwtYV0pO2NvbnN0IGc9aS5VdGlsLmFwcGx5VHJhbnNmb3JtKFswLDBdLGYpLG09aS5VdGlsLmFwcGx5VHJhbnNmb3JtKFtuLGFdLGYpLGI9aS5VdGlsLm5vcm1hbGl6ZVJlY3QoW2dbMF0sZ1sxXSxtWzBdLG1bMV1dKSx2PU1hdGgucm91bmQoYlsyXS1iWzBdKXx8MSx5PU1hdGgucm91bmQoYlszXS1iWzFdKXx8MSxBPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJmaWxsQ2FudmFzIix2LHkpLF89QS5jb250ZXh0LFM9TWF0aC5taW4oZ1swXSxtWzBdKSxFPU1hdGgubWluKGdbMV0sbVsxXSk7Xy50cmFuc2xhdGUoLVMsLUUpO18udHJhbnNmb3JtKC4uLmYpO2lmKCF1KXt1PXRoaXMuX3NjYWxlSW1hZ2UocC5jYW52YXMsKDAsci5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoXykpO3U9dS5pbWc7aCYmbCYmaC5zZXQoZCx1KX1fLmltYWdlU21vb3RoaW5nRW5hYmxlZD1nZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoKDAsci5nZXRDdXJyZW50VHJhbnNmb3JtKShfKSx0LmludGVycG9sYXRlKTtkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoXyx1LDAsMCx1LndpZHRoLHUuaGVpZ2h0LDAsMCxuLGEpO18uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iO2NvbnN0IHg9aS5VdGlsLnRyYW5zZm9ybSgoMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShfKSxbMSwwLDAsMSwtUywtRV0pO18uZmlsbFN0eWxlPWw/by5nZXRQYXR0ZXJuKGUsdGhpcyx4LHMuUGF0aFR5cGUuRklMTCk6bztfLmZpbGxSZWN0KDAsMCxuLGEpO2lmKGgmJiFsKXt0aGlzLmNhY2hlZENhbnZhc2VzLmRlbGV0ZSgiZmlsbENhbnZhcyIpO2guc2V0KGQsQS5jYW52YXMpfXJldHVybntjYW52YXM6QS5jYW52YXMsb2Zmc2V0WDpNYXRoLnJvdW5kKFMpLG9mZnNldFk6TWF0aC5yb3VuZChFKX19c2V0TGluZVdpZHRoKHQpe3QhPT10aGlzLmN1cnJlbnQubGluZVdpZHRoJiYodGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXT0tMSk7dGhpcy5jdXJyZW50LmxpbmVXaWR0aD10O3RoaXMuY3R4LmxpbmVXaWR0aD10fXNldExpbmVDYXAodCl7dGhpcy5jdHgubGluZUNhcD1jW3RdfXNldExpbmVKb2luKHQpe3RoaXMuY3R4LmxpbmVKb2luPWhbdF19c2V0TWl0ZXJMaW1pdCh0KXt0aGlzLmN0eC5taXRlckxpbWl0PXR9c2V0RGFzaCh0LGUpe2NvbnN0IG49dGhpcy5jdHg7aWYodm9pZCAwIT09bi5zZXRMaW5lRGFzaCl7bi5zZXRMaW5lRGFzaCh0KTtuLmxpbmVEYXNoT2Zmc2V0PWV9fXNldFJlbmRlcmluZ0ludGVudCh0KXt9c2V0RmxhdG5lc3ModCl7fXNldEdTdGF0ZSh0KXtmb3IoY29uc3RbZSxuXW9mIHQpc3dpdGNoKGUpe2Nhc2UiTFciOnRoaXMuc2V0TGluZVdpZHRoKG4pO2JyZWFrO2Nhc2UiTEMiOnRoaXMuc2V0TGluZUNhcChuKTticmVhaztjYXNlIkxKIjp0aGlzLnNldExpbmVKb2luKG4pO2JyZWFrO2Nhc2UiTUwiOnRoaXMuc2V0TWl0ZXJMaW1pdChuKTticmVhaztjYXNlIkQiOnRoaXMuc2V0RGFzaChuWzBdLG5bMV0pO2JyZWFrO2Nhc2UiUkkiOnRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KG4pO2JyZWFrO2Nhc2UiRkwiOnRoaXMuc2V0RmxhdG5lc3Mobik7YnJlYWs7Y2FzZSJGb250Ijp0aGlzLnNldEZvbnQoblswXSxuWzFdKTticmVhaztjYXNlIkNBIjp0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGE9bjticmVhaztjYXNlImNhIjp0aGlzLmN1cnJlbnQuZmlsbEFscGhhPW47dGhpcy5jdHguZ2xvYmFsQWxwaGE9bjticmVhaztjYXNlIkJNIjp0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249bjticmVhaztjYXNlIlNNYXNrIjp0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s9bj90aGlzLnRlbXBTTWFzazpudWxsO3RoaXMudGVtcFNNYXNrPW51bGw7dGhpcy5jaGVja1NNYXNrU3RhdGUoKTticmVhaztjYXNlIlRSIjp0aGlzLmN0eC5maWx0ZXI9dGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcz10aGlzLmZpbHRlckZhY3RvcnkuYWRkRmlsdGVyKG4pfX1nZXQgaW5TTWFza01vZGUoKXtyZXR1cm4hIXRoaXMuc3VzcGVuZGVkQ3R4fWNoZWNrU01hc2tTdGF0ZSgpe2NvbnN0IHQ9dGhpcy5pblNNYXNrTW9kZTt0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2smJiF0P3RoaXMuYmVnaW5TTWFza01vZGUoKTohdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrJiZ0JiZ0aGlzLmVuZFNNYXNrTW9kZSgpfWJlZ2luU01hc2tNb2RlKCl7aWYodGhpcy5pblNNYXNrTW9kZSl0aHJvdyBuZXcgRXJyb3IoImJlZ2luU01hc2tNb2RlIGNhbGxlZCB3aGlsZSBhbHJlYWR5IGluIHNtYXNrIG1vZGUiKTtjb25zdCB0PXRoaXMuY3R4LmNhbnZhcy53aWR0aCxlPXRoaXMuY3R4LmNhbnZhcy5oZWlnaHQsbj0ic21hc2tHcm91cEF0Iit0aGlzLmdyb3VwTGV2ZWwsaT10aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhuLHQsZSk7dGhpcy5zdXNwZW5kZWRDdHg9dGhpcy5jdHg7dGhpcy5jdHg9aS5jb250ZXh0O2NvbnN0IHM9dGhpcy5jdHg7cy5zZXRUcmFuc2Zvcm0oLi4uKDAsci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLnN1c3BlbmRlZEN0eCkpO2NvcHlDdHhTdGF0ZSh0aGlzLnN1c3BlbmRlZEN0eCxzKTshZnVuY3Rpb24gbWlycm9yQ29udGV4dE9wZXJhdGlvbnModCxlKXtpZih0Ll9yZW1vdmVNaXJyb3JpbmcpdGhyb3cgbmV3IEVycm9yKCJDb250ZXh0IGlzIGFscmVhZHkgZm9yd2FyZGluZyBvcGVyYXRpb25zLiIpO3QuX19vcmlnaW5hbFNhdmU9dC5zYXZlO3QuX19vcmlnaW5hbFJlc3RvcmU9dC5yZXN0b3JlO3QuX19vcmlnaW5hbFJvdGF0ZT10LnJvdGF0ZTt0Ll9fb3JpZ2luYWxTY2FsZT10LnNjYWxlO3QuX19vcmlnaW5hbFRyYW5zbGF0ZT10LnRyYW5zbGF0ZTt0Ll9fb3JpZ2luYWxUcmFuc2Zvcm09dC50cmFuc2Zvcm07dC5fX29yaWdpbmFsU2V0VHJhbnNmb3JtPXQuc2V0VHJhbnNmb3JtO3QuX19vcmlnaW5hbFJlc2V0VHJhbnNmb3JtPXQucmVzZXRUcmFuc2Zvcm07dC5fX29yaWdpbmFsQ2xpcD10LmNsaXA7dC5fX29yaWdpbmFsTW92ZVRvPXQubW92ZVRvO3QuX19vcmlnaW5hbExpbmVUbz10LmxpbmVUbzt0Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvPXQuYmV6aWVyQ3VydmVUbzt0Ll9fb3JpZ2luYWxSZWN0PXQucmVjdDt0Ll9fb3JpZ2luYWxDbG9zZVBhdGg9dC5jbG9zZVBhdGg7dC5fX29yaWdpbmFsQmVnaW5QYXRoPXQuYmVnaW5QYXRoO3QuX3JlbW92ZU1pcnJvcmluZz0oKT0+e3Quc2F2ZT10Ll9fb3JpZ2luYWxTYXZlO3QucmVzdG9yZT10Ll9fb3JpZ2luYWxSZXN0b3JlO3Qucm90YXRlPXQuX19vcmlnaW5hbFJvdGF0ZTt0LnNjYWxlPXQuX19vcmlnaW5hbFNjYWxlO3QudHJhbnNsYXRlPXQuX19vcmlnaW5hbFRyYW5zbGF0ZTt0LnRyYW5zZm9ybT10Ll9fb3JpZ2luYWxUcmFuc2Zvcm07dC5zZXRUcmFuc2Zvcm09dC5fX29yaWdpbmFsU2V0VHJhbnNmb3JtO3QucmVzZXRUcmFuc2Zvcm09dC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm07dC5jbGlwPXQuX19vcmlnaW5hbENsaXA7dC5tb3ZlVG89dC5fX29yaWdpbmFsTW92ZVRvO3QubGluZVRvPXQuX19vcmlnaW5hbExpbmVUbzt0LmJlemllckN1cnZlVG89dC5fX29yaWdpbmFsQmV6aWVyQ3VydmVUbzt0LnJlY3Q9dC5fX29yaWdpbmFsUmVjdDt0LmNsb3NlUGF0aD10Ll9fb3JpZ2luYWxDbG9zZVBhdGg7dC5iZWdpblBhdGg9dC5fX29yaWdpbmFsQmVnaW5QYXRoO2RlbGV0ZSB0Ll9yZW1vdmVNaXJyb3Jpbmd9O3Quc2F2ZT1mdW5jdGlvbiBjdHhTYXZlKCl7ZS5zYXZlKCk7dGhpcy5fX29yaWdpbmFsU2F2ZSgpfTt0LnJlc3RvcmU9ZnVuY3Rpb24gY3R4UmVzdG9yZSgpe2UucmVzdG9yZSgpO3RoaXMuX19vcmlnaW5hbFJlc3RvcmUoKX07dC50cmFuc2xhdGU9ZnVuY3Rpb24gY3R4VHJhbnNsYXRlKHQsbil7ZS50cmFuc2xhdGUodCxuKTt0aGlzLl9fb3JpZ2luYWxUcmFuc2xhdGUodCxuKX07dC5zY2FsZT1mdW5jdGlvbiBjdHhTY2FsZSh0LG4pe2Uuc2NhbGUodCxuKTt0aGlzLl9fb3JpZ2luYWxTY2FsZSh0LG4pfTt0LnRyYW5zZm9ybT1mdW5jdGlvbiBjdHhUcmFuc2Zvcm0odCxuLGkscixzLGEpe2UudHJhbnNmb3JtKHQsbixpLHIscyxhKTt0aGlzLl9fb3JpZ2luYWxUcmFuc2Zvcm0odCxuLGkscixzLGEpfTt0LnNldFRyYW5zZm9ybT1mdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0odCxuLGkscixzLGEpe2Uuc2V0VHJhbnNmb3JtKHQsbixpLHIscyxhKTt0aGlzLl9fb3JpZ2luYWxTZXRUcmFuc2Zvcm0odCxuLGkscixzLGEpfTt0LnJlc2V0VHJhbnNmb3JtPWZ1bmN0aW9uIGN0eFJlc2V0VHJhbnNmb3JtKCl7ZS5yZXNldFRyYW5zZm9ybSgpO3RoaXMuX19vcmlnaW5hbFJlc2V0VHJhbnNmb3JtKCl9O3Qucm90YXRlPWZ1bmN0aW9uIGN0eFJvdGF0ZSh0KXtlLnJvdGF0ZSh0KTt0aGlzLl9fb3JpZ2luYWxSb3RhdGUodCl9O3QuY2xpcD1mdW5jdGlvbiBjdHhSb3RhdGUodCl7ZS5jbGlwKHQpO3RoaXMuX19vcmlnaW5hbENsaXAodCl9O3QubW92ZVRvPWZ1bmN0aW9uKHQsbil7ZS5tb3ZlVG8odCxuKTt0aGlzLl9fb3JpZ2luYWxNb3ZlVG8odCxuKX07dC5saW5lVG89ZnVuY3Rpb24odCxuKXtlLmxpbmVUbyh0LG4pO3RoaXMuX19vcmlnaW5hbExpbmVUbyh0LG4pfTt0LmJlemllckN1cnZlVG89ZnVuY3Rpb24odCxuLGkscixzLGEpe2UuYmV6aWVyQ3VydmVUbyh0LG4saSxyLHMsYSk7dGhpcy5fX29yaWdpbmFsQmV6aWVyQ3VydmVUbyh0LG4saSxyLHMsYSl9O3QucmVjdD1mdW5jdGlvbih0LG4saSxyKXtlLnJlY3QodCxuLGkscik7dGhpcy5fX29yaWdpbmFsUmVjdCh0LG4saSxyKX07dC5jbG9zZVBhdGg9ZnVuY3Rpb24oKXtlLmNsb3NlUGF0aCgpO3RoaXMuX19vcmlnaW5hbENsb3NlUGF0aCgpfTt0LmJlZ2luUGF0aD1mdW5jdGlvbigpe2UuYmVnaW5QYXRoKCk7dGhpcy5fX29yaWdpbmFsQmVnaW5QYXRoKCl9fShzLHRoaXMuc3VzcGVuZGVkQ3R4KTt0aGlzLnNldEdTdGF0ZShbWyJCTSIsInNvdXJjZS1vdmVyIl0sWyJjYSIsMV0sWyJDQSIsMV1dKX1lbmRTTWFza01vZGUoKXtpZighdGhpcy5pblNNYXNrTW9kZSl0aHJvdyBuZXcgRXJyb3IoImVuZFNNYXNrTW9kZSBjYWxsZWQgd2hpbGUgbm90IGluIHNtYXNrIG1vZGUiKTt0aGlzLmN0eC5fcmVtb3ZlTWlycm9yaW5nKCk7Y29weUN0eFN0YXRlKHRoaXMuY3R4LHRoaXMuc3VzcGVuZGVkQ3R4KTt0aGlzLmN0eD10aGlzLnN1c3BlbmRlZEN0eDt0aGlzLnN1c3BlbmRlZEN0eD1udWxsfWNvbXBvc2UodCl7aWYoIXRoaXMuY3VycmVudC5hY3RpdmVTTWFzaylyZXR1cm47aWYodCl7dFswXT1NYXRoLmZsb29yKHRbMF0pO3RbMV09TWF0aC5mbG9vcih0WzFdKTt0WzJdPU1hdGguY2VpbCh0WzJdKTt0WzNdPU1hdGguY2VpbCh0WzNdKX1lbHNlIHQ9WzAsMCx0aGlzLmN0eC5jYW52YXMud2lkdGgsdGhpcy5jdHguY2FudmFzLmhlaWdodF07Y29uc3QgZT10aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s7Y29tcG9zZVNNYXNrKHRoaXMuc3VzcGVuZGVkQ3R4LGUsdGhpcy5jdHgsdCk7dGhpcy5jdHguc2F2ZSgpO3RoaXMuY3R4LnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7dGhpcy5jdHguY2xlYXJSZWN0KDAsMCx0aGlzLmN0eC5jYW52YXMud2lkdGgsdGhpcy5jdHguY2FudmFzLmhlaWdodCk7dGhpcy5jdHgucmVzdG9yZSgpfXNhdmUoKXtpZih0aGlzLmluU01hc2tNb2RlKXtjb3B5Q3R4U3RhdGUodGhpcy5jdHgsdGhpcy5zdXNwZW5kZWRDdHgpO3RoaXMuc3VzcGVuZGVkQ3R4LnNhdmUoKX1lbHNlIHRoaXMuY3R4LnNhdmUoKTtjb25zdCB0PXRoaXMuY3VycmVudDt0aGlzLnN0YXRlU3RhY2sucHVzaCh0KTt0aGlzLmN1cnJlbnQ9dC5jbG9uZSgpfXJlc3RvcmUoKXswPT09dGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCYmdGhpcy5pblNNYXNrTW9kZSYmdGhpcy5lbmRTTWFza01vZGUoKTtpZigwIT09dGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCl7dGhpcy5jdXJyZW50PXRoaXMuc3RhdGVTdGFjay5wb3AoKTtpZih0aGlzLmluU01hc2tNb2RlKXt0aGlzLnN1c3BlbmRlZEN0eC5yZXN0b3JlKCk7Y29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LHRoaXMuY3R4KX1lbHNlIHRoaXMuY3R4LnJlc3RvcmUoKTt0aGlzLmNoZWNrU01hc2tTdGF0ZSgpO3RoaXMucGVuZGluZ0NsaXA9bnVsbDt0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdPS0xO3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9bnVsbH19dHJhbnNmb3JtKHQsZSxuLGkscixzKXt0aGlzLmN0eC50cmFuc2Zvcm0odCxlLG4saSxyLHMpO3RoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF09LTE7dGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aD1udWxsfWNvbnN0cnVjdFBhdGgodCxlLG4pe2NvbnN0IHM9dGhpcy5jdHgsYT10aGlzLmN1cnJlbnQ7bGV0IG8sbCxjPWEueCxoPWEueTtjb25zdCBkPSgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkocyksdT0wPT09ZFswXSYmMD09PWRbM118fDA9PT1kWzFdJiYwPT09ZFsyXSxwPXU/bi5zbGljZSgwKTpudWxsO2ZvcihsZXQgbj0wLHI9MCxmPXQubGVuZ3RoO248ZjtuKyspc3dpdGNoKDB8dFtuXSl7Y2FzZSBpLk9QUy5yZWN0YW5nbGU6Yz1lW3IrK107aD1lW3IrK107Y29uc3QgdD1lW3IrK10sbj1lW3IrK10sZj1jK3QsZz1oK247cy5tb3ZlVG8oYyxoKTtpZigwPT09dHx8MD09PW4pcy5saW5lVG8oZixnKTtlbHNle3MubGluZVRvKGYsaCk7cy5saW5lVG8oZixnKTtzLmxpbmVUbyhjLGcpfXV8fGEudXBkYXRlUmVjdE1pbk1heChkLFtjLGgsZixnXSk7cy5jbG9zZVBhdGgoKTticmVhaztjYXNlIGkuT1BTLm1vdmVUbzpjPWVbcisrXTtoPWVbcisrXTtzLm1vdmVUbyhjLGgpO3V8fGEudXBkYXRlUGF0aE1pbk1heChkLGMsaCk7YnJlYWs7Y2FzZSBpLk9QUy5saW5lVG86Yz1lW3IrK107aD1lW3IrK107cy5saW5lVG8oYyxoKTt1fHxhLnVwZGF0ZVBhdGhNaW5NYXgoZCxjLGgpO2JyZWFrO2Nhc2UgaS5PUFMuY3VydmVUbzpvPWM7bD1oO2M9ZVtyKzRdO2g9ZVtyKzVdO3MuYmV6aWVyQ3VydmVUbyhlW3JdLGVbcisxXSxlW3IrMl0sZVtyKzNdLGMsaCk7YS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCxvLGwsZVtyXSxlW3IrMV0sZVtyKzJdLGVbciszXSxjLGgscCk7cis9NjticmVhaztjYXNlIGkuT1BTLmN1cnZlVG8yOm89YztsPWg7cy5iZXppZXJDdXJ2ZVRvKGMsaCxlW3JdLGVbcisxXSxlW3IrMl0sZVtyKzNdKTthLnVwZGF0ZUN1cnZlUGF0aE1pbk1heChkLG8sbCxjLGgsZVtyXSxlW3IrMV0sZVtyKzJdLGVbciszXSxwKTtjPWVbcisyXTtoPWVbciszXTtyKz00O2JyZWFrO2Nhc2UgaS5PUFMuY3VydmVUbzM6bz1jO2w9aDtjPWVbcisyXTtoPWVbciszXTtzLmJlemllckN1cnZlVG8oZVtyXSxlW3IrMV0sYyxoLGMsaCk7YS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCxvLGwsZVtyXSxlW3IrMV0sYyxoLGMsaCxwKTtyKz00O2JyZWFrO2Nhc2UgaS5PUFMuY2xvc2VQYXRoOnMuY2xvc2VQYXRoKCl9dSYmYS51cGRhdGVTY2FsaW5nUGF0aE1pbk1heChkLHApO2Euc2V0Q3VycmVudFBvaW50KGMsaCl9Y2xvc2VQYXRoKCl7dGhpcy5jdHguY2xvc2VQYXRoKCl9c3Ryb2tlKCl7bGV0IHQ9IShhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSl8fGFyZ3VtZW50c1swXTtjb25zdCBlPXRoaXMuY3R4LG49dGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yO2UuZ2xvYmFsQWxwaGE9dGhpcy5jdXJyZW50LnN0cm9rZUFscGhhO2lmKHRoaXMuY29udGVudFZpc2libGUpaWYoIm9iamVjdCI9PXR5cGVvZiBuJiZuPy5nZXRQYXR0ZXJuKXtlLnNhdmUoKTtlLnN0cm9rZVN0eWxlPW4uZ2V0UGF0dGVybihlLHRoaXMsKDAsci5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoZSkscy5QYXRoVHlwZS5TVFJPS0UpO3RoaXMucmVzY2FsZUFuZFN0cm9rZSghMSk7ZS5yZXN0b3JlKCl9ZWxzZSB0aGlzLnJlc2NhbGVBbmRTdHJva2UoITApO3QmJnRoaXMuY29uc3VtZVBhdGgodGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKSk7ZS5nbG9iYWxBbHBoYT10aGlzLmN1cnJlbnQuZmlsbEFscGhhfWNsb3NlU3Ryb2tlKCl7dGhpcy5jbG9zZVBhdGgoKTt0aGlzLnN0cm9rZSgpfWZpbGwoKXtsZXQgdD0hKGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdKXx8YXJndW1lbnRzWzBdO2NvbnN0IGU9dGhpcy5jdHgsbj10aGlzLmN1cnJlbnQuZmlsbENvbG9yO2xldCBpPSExO2lmKHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCl7ZS5zYXZlKCk7ZS5maWxsU3R5bGU9bi5nZXRQYXR0ZXJuKGUsdGhpcywoMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShlKSxzLlBhdGhUeXBlLkZJTEwpO2k9ITB9Y29uc3QgYT10aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpO2lmKHRoaXMuY29udGVudFZpc2libGUmJm51bGwhPT1hKWlmKHRoaXMucGVuZGluZ0VPRmlsbCl7ZS5maWxsKCJldmVub2RkIik7dGhpcy5wZW5kaW5nRU9GaWxsPSExfWVsc2UgZS5maWxsKCk7aSYmZS5yZXN0b3JlKCk7dCYmdGhpcy5jb25zdW1lUGF0aChhKX1lb0ZpbGwoKXt0aGlzLnBlbmRpbmdFT0ZpbGw9ITA7dGhpcy5maWxsKCl9ZmlsbFN0cm9rZSgpe3RoaXMuZmlsbCghMSk7dGhpcy5zdHJva2UoITEpO3RoaXMuY29uc3VtZVBhdGgoKX1lb0ZpbGxTdHJva2UoKXt0aGlzLnBlbmRpbmdFT0ZpbGw9ITA7dGhpcy5maWxsU3Ryb2tlKCl9Y2xvc2VGaWxsU3Ryb2tlKCl7dGhpcy5jbG9zZVBhdGgoKTt0aGlzLmZpbGxTdHJva2UoKX1jbG9zZUVPRmlsbFN0cm9rZSgpe3RoaXMucGVuZGluZ0VPRmlsbD0hMDt0aGlzLmNsb3NlUGF0aCgpO3RoaXMuZmlsbFN0cm9rZSgpfWVuZFBhdGgoKXt0aGlzLmNvbnN1bWVQYXRoKCl9Y2xpcCgpe3RoaXMucGVuZGluZ0NsaXA9ZH1lb0NsaXAoKXt0aGlzLnBlbmRpbmdDbGlwPXV9YmVnaW5UZXh0KCl7dGhpcy5jdXJyZW50LnRleHRNYXRyaXg9aS5JREVOVElUWV9NQVRSSVg7dGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZT0xO3RoaXMuY3VycmVudC54PXRoaXMuY3VycmVudC5saW5lWD0wO3RoaXMuY3VycmVudC55PXRoaXMuY3VycmVudC5saW5lWT0wfWVuZFRleHQoKXtjb25zdCB0PXRoaXMucGVuZGluZ1RleHRQYXRocyxlPXRoaXMuY3R4O2lmKHZvaWQgMCE9PXQpe2Uuc2F2ZSgpO2UuYmVnaW5QYXRoKCk7Zm9yKGNvbnN0IG4gb2YgdCl7ZS5zZXRUcmFuc2Zvcm0oLi4ubi50cmFuc2Zvcm0pO2UudHJhbnNsYXRlKG4ueCxuLnkpO24uYWRkVG9QYXRoKGUsbi5mb250U2l6ZSl9ZS5yZXN0b3JlKCk7ZS5jbGlwKCk7ZS5iZWdpblBhdGgoKTtkZWxldGUgdGhpcy5wZW5kaW5nVGV4dFBhdGhzfWVsc2UgZS5iZWdpblBhdGgoKX1zZXRDaGFyU3BhY2luZyh0KXt0aGlzLmN1cnJlbnQuY2hhclNwYWNpbmc9dH1zZXRXb3JkU3BhY2luZyh0KXt0aGlzLmN1cnJlbnQud29yZFNwYWNpbmc9dH1zZXRIU2NhbGUodCl7dGhpcy5jdXJyZW50LnRleHRIU2NhbGU9dC8xMDB9c2V0TGVhZGluZyh0KXt0aGlzLmN1cnJlbnQubGVhZGluZz0tdH1zZXRGb250KHQsZSl7Y29uc3Qgbj10aGlzLmNvbW1vbk9ianMuZ2V0KHQpLHI9dGhpcy5jdXJyZW50O2lmKCFuKXRocm93IG5ldyBFcnJvcihgQ2FuJ3QgZmluZCBmb250IGZvciAke3R9YCk7ci5mb250TWF0cml4PW4uZm9udE1hdHJpeHx8aS5GT05UX0lERU5USVRZX01BVFJJWDswIT09ci5mb250TWF0cml4WzBdJiYwIT09ci5mb250TWF0cml4WzNdfHwoMCxpLndhcm4pKCJJbnZhbGlkIGZvbnQgbWF0cml4IGZvciBmb250ICIrdCk7aWYoZTwwKXtlPS1lO3IuZm9udERpcmVjdGlvbj0tMX1lbHNlIHIuZm9udERpcmVjdGlvbj0xO3RoaXMuY3VycmVudC5mb250PW47dGhpcy5jdXJyZW50LmZvbnRTaXplPWU7aWYobi5pc1R5cGUzRm9udClyZXR1cm47Y29uc3Qgcz1uLmxvYWRlZE5hbWV8fCJzYW5zLXNlcmlmIixhPW4uc3lzdGVtRm9udEluZm8/LmNzc3x8YCIke3N9IiwgJHtuLmZhbGxiYWNrTmFtZX1gO2xldCBvPSJub3JtYWwiO24uYmxhY2s/bz0iOTAwIjpuLmJvbGQmJihvPSJib2xkIik7Y29uc3QgbD1uLml0YWxpYz8iaXRhbGljIjoibm9ybWFsIjtsZXQgYz1lO2U8MTY/Yz0xNjplPjEwMCYmKGM9MTAwKTt0aGlzLmN1cnJlbnQuZm9udFNpemVTY2FsZT1lL2M7dGhpcy5jdHguZm9udD1gJHtsfSAke299ICR7Y31weCAke2F9YH1zZXRUZXh0UmVuZGVyaW5nTW9kZSh0KXt0aGlzLmN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGU9dH1zZXRUZXh0UmlzZSh0KXt0aGlzLmN1cnJlbnQudGV4dFJpc2U9dH1tb3ZlVGV4dCh0LGUpe3RoaXMuY3VycmVudC54PXRoaXMuY3VycmVudC5saW5lWCs9dDt0aGlzLmN1cnJlbnQueT10aGlzLmN1cnJlbnQubGluZVkrPWV9c2V0TGVhZGluZ01vdmVUZXh0KHQsZSl7dGhpcy5zZXRMZWFkaW5nKC1lKTt0aGlzLm1vdmVUZXh0KHQsZSl9c2V0VGV4dE1hdHJpeCh0LGUsbixpLHIscyl7dGhpcy5jdXJyZW50LnRleHRNYXRyaXg9W3QsZSxuLGkscixzXTt0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlPU1hdGguaHlwb3QodCxlKTt0aGlzLmN1cnJlbnQueD10aGlzLmN1cnJlbnQubGluZVg9MDt0aGlzLmN1cnJlbnQueT10aGlzLmN1cnJlbnQubGluZVk9MH1uZXh0TGluZSgpe3RoaXMubW92ZVRleHQoMCx0aGlzLmN1cnJlbnQubGVhZGluZyl9cGFpbnRDaGFyKHQsZSxuLHMpe2NvbnN0IGE9dGhpcy5jdHgsbz10aGlzLmN1cnJlbnQsbD1vLmZvbnQsYz1vLnRleHRSZW5kZXJpbmdNb2RlLGg9by5mb250U2l6ZS9vLmZvbnRTaXplU2NhbGUsZD1jJmkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSyx1PSEhKGMmaS5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKSxwPW8ucGF0dGVybkZpbGwmJiFsLm1pc3NpbmdGaWxlO2xldCBmOyhsLmRpc2FibGVGb250RmFjZXx8dXx8cCkmJihmPWwuZ2V0UGF0aEdlbmVyYXRvcih0aGlzLmNvbW1vbk9ianMsdCkpO2lmKGwuZGlzYWJsZUZvbnRGYWNlfHxwKXthLnNhdmUoKTthLnRyYW5zbGF0ZShlLG4pO2EuYmVnaW5QYXRoKCk7ZihhLGgpO3MmJmEuc2V0VHJhbnNmb3JtKC4uLnMpO2QhPT1pLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwmJmQhPT1pLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFfHxhLmZpbGwoKTtkIT09aS5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UmJmQhPT1pLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFfHxhLnN0cm9rZSgpO2EucmVzdG9yZSgpfWVsc2V7ZCE9PWkuVGV4dFJlbmRlcmluZ01vZGUuRklMTCYmZCE9PWkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0V8fGEuZmlsbFRleHQodCxlLG4pO2QhPT1pLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSYmZCE9PWkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0V8fGEuc3Ryb2tlVGV4dCh0LGUsbil9aWYodSl7KHRoaXMucGVuZGluZ1RleHRQYXRoc3x8PVtdKS5wdXNoKHt0cmFuc2Zvcm06KDAsci5nZXRDdXJyZW50VHJhbnNmb3JtKShhKSx4OmUseTpuLGZvbnRTaXplOmgsYWRkVG9QYXRoOmZ9KX19Z2V0IGlzRm9udFN1YnBpeGVsQUFFbmFibGVkKCl7Y29uc3R7Y29udGV4dDp0fT10aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygiaXNGb250U3VicGl4ZWxBQUVuYWJsZWQiLDEwLDEwKTt0LnNjYWxlKDEuNSwxKTt0LmZpbGxUZXh0KCJJIiwwLDEwKTtjb25zdCBlPXQuZ2V0SW1hZ2VEYXRhKDAsMCwxMCwxMCkuZGF0YTtsZXQgbj0hMTtmb3IobGV0IHQ9Mzt0PGUubGVuZ3RoO3QrPTQpaWYoZVt0XT4wJiZlW3RdPDI1NSl7bj0hMDticmVha31yZXR1cm4oMCxpLnNoYWRvdykodGhpcywiaXNGb250U3VicGl4ZWxBQUVuYWJsZWQiLG4pfXNob3dUZXh0KHQpe2NvbnN0IGU9dGhpcy5jdXJyZW50LG49ZS5mb250O2lmKG4uaXNUeXBlM0ZvbnQpcmV0dXJuIHRoaXMuc2hvd1R5cGUzVGV4dCh0KTtjb25zdCBhPWUuZm9udFNpemU7aWYoMD09PWEpcmV0dXJuO2NvbnN0IG89dGhpcy5jdHgsbD1lLmZvbnRTaXplU2NhbGUsYz1lLmNoYXJTcGFjaW5nLGg9ZS53b3JkU3BhY2luZyxkPWUuZm9udERpcmVjdGlvbix1PWUudGV4dEhTY2FsZSpkLHA9dC5sZW5ndGgsZj1uLnZlcnRpY2FsLGc9Zj8xOi0xLG09bi5kZWZhdWx0Vk1ldHJpY3MsYj1hKmUuZm9udE1hdHJpeFswXSx2PWUudGV4dFJlbmRlcmluZ01vZGU9PT1pLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwmJiFuLmRpc2FibGVGb250RmFjZSYmIWUucGF0dGVybkZpbGw7by5zYXZlKCk7by50cmFuc2Zvcm0oLi4uZS50ZXh0TWF0cml4KTtvLnRyYW5zbGF0ZShlLngsZS55K2UudGV4dFJpc2UpO2Q+MD9vLnNjYWxlKHUsLTEpOm8uc2NhbGUodSwxKTtsZXQgeTtpZihlLnBhdHRlcm5GaWxsKXtvLnNhdmUoKTtjb25zdCB0PWUuZmlsbENvbG9yLmdldFBhdHRlcm4obyx0aGlzLCgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKG8pLHMuUGF0aFR5cGUuRklMTCk7eT0oMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm0pKG8pO28ucmVzdG9yZSgpO28uZmlsbFN0eWxlPXR9bGV0IEE9ZS5saW5lV2lkdGg7Y29uc3QgXz1lLnRleHRNYXRyaXhTY2FsZTtpZigwPT09X3x8MD09PUEpe2NvbnN0IHQ9ZS50ZXh0UmVuZGVyaW5nTW9kZSZpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7dCE9PWkuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFJiZ0IT09aS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRXx8KEE9dGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpfWVsc2UgQS89XztpZigxIT09bCl7by5zY2FsZShsLGwpO0EvPWx9by5saW5lV2lkdGg9QTtpZihuLmlzSW52YWxpZFBERmpzRm9udCl7Y29uc3Qgbj1bXTtsZXQgaT0wO2Zvcihjb25zdCBlIG9mIHQpe24ucHVzaChlLnVuaWNvZGUpO2krPWUud2lkdGh9by5maWxsVGV4dChuLmpvaW4oIiIpLDAsMCk7ZS54Kz1pKmIqdTtvLnJlc3RvcmUoKTt0aGlzLmNvbXBvc2UoKTtyZXR1cm59bGV0IFMsRT0wO2ZvcihTPTA7UzxwOysrUyl7Y29uc3QgZT10W1NdO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7RSs9ZyplKmEvMWUzO2NvbnRpbnVlfWxldCBpPSExO2NvbnN0IHI9KGUuaXNTcGFjZT9oOjApK2Mscz1lLmZvbnRDaGFyLHU9ZS5hY2NlbnQ7bGV0IHAsQSxfPWUud2lkdGg7aWYoZil7Y29uc3QgdD1lLnZtZXRyaWN8fG0sbj0tKGUudm1ldHJpYz90WzFdOi41Kl8pKmIsaT10WzJdKmI7Xz10Py10WzBdOl87cD1uL2w7QT0oRStpKS9sfWVsc2V7cD1FL2w7QT0wfWlmKG4ucmVtZWFzdXJlJiZfPjApe2NvbnN0IHQ9MWUzKm8ubWVhc3VyZVRleHQocykud2lkdGgvYSpsO2lmKF88dCYmdGhpcy5pc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCl7Y29uc3QgZT1fL3Q7aT0hMDtvLnNhdmUoKTtvLnNjYWxlKGUsMSk7cC89ZX1lbHNlIF8hPT10JiYocCs9KF8tdCkvMmUzKmEvbCl9aWYodGhpcy5jb250ZW50VmlzaWJsZSYmKGUuaXNJbkZvbnR8fG4ubWlzc2luZ0ZpbGUpKWlmKHYmJiF1KW8uZmlsbFRleHQocyxwLEEpO2Vsc2V7dGhpcy5wYWludENoYXIocyxwLEEseSk7aWYodSl7Y29uc3QgdD1wK2EqdS5vZmZzZXQueC9sLGU9QS1hKnUub2Zmc2V0LnkvbDt0aGlzLnBhaW50Q2hhcih1LmZvbnRDaGFyLHQsZSx5KX19RSs9Zj9fKmItcipkOl8qYityKmQ7aSYmby5yZXN0b3JlKCl9Zj9lLnktPUU6ZS54Kz1FKnU7by5yZXN0b3JlKCk7dGhpcy5jb21wb3NlKCl9c2hvd1R5cGUzVGV4dCh0KXtjb25zdCBlPXRoaXMuY3R4LG49dGhpcy5jdXJyZW50LHI9bi5mb250LHM9bi5mb250U2l6ZSxhPW4uZm9udERpcmVjdGlvbixvPXIudmVydGljYWw/MTotMSxsPW4uY2hhclNwYWNpbmcsYz1uLndvcmRTcGFjaW5nLGg9bi50ZXh0SFNjYWxlKmEsZD1uLmZvbnRNYXRyaXh8fGkuRk9OVF9JREVOVElUWV9NQVRSSVgsdT10Lmxlbmd0aDtsZXQgcCxmLGcsbTtpZighKG4udGV4dFJlbmRlcmluZ01vZGU9PT1pLlRleHRSZW5kZXJpbmdNb2RlLklOVklTSUJMRSkmJjAhPT1zKXt0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdPS0xO3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9bnVsbDtlLnNhdmUoKTtlLnRyYW5zZm9ybSguLi5uLnRleHRNYXRyaXgpO2UudHJhbnNsYXRlKG4ueCxuLnkpO2Uuc2NhbGUoaCxhKTtmb3IocD0wO3A8dTsrK3Ape2Y9dFtwXTtpZigibnVtYmVyIj09dHlwZW9mIGYpe209bypmKnMvMWUzO3RoaXMuY3R4LnRyYW5zbGF0ZShtLDApO24ueCs9bSpoO2NvbnRpbnVlfWNvbnN0IGE9KGYuaXNTcGFjZT9jOjApK2wsdT1yLmNoYXJQcm9jT3BlcmF0b3JMaXN0W2Yub3BlcmF0b3JMaXN0SWRdO2lmKCF1KXsoMCxpLndhcm4pKGBUeXBlMyBjaGFyYWN0ZXIgIiR7Zi5vcGVyYXRvckxpc3RJZH0iIGlzIG5vdCBhdmFpbGFibGUuYCk7Y29udGludWV9aWYodGhpcy5jb250ZW50VmlzaWJsZSl7dGhpcy5wcm9jZXNzaW5nVHlwZTM9Zjt0aGlzLnNhdmUoKTtlLnNjYWxlKHMscyk7ZS50cmFuc2Zvcm0oLi4uZCk7dGhpcy5leGVjdXRlT3BlcmF0b3JMaXN0KHUpO3RoaXMucmVzdG9yZSgpfWc9aS5VdGlsLmFwcGx5VHJhbnNmb3JtKFtmLndpZHRoLDBdLGQpWzBdKnMrYTtlLnRyYW5zbGF0ZShnLDApO24ueCs9ZypofWUucmVzdG9yZSgpO3RoaXMucHJvY2Vzc2luZ1R5cGUzPW51bGx9fXNldENoYXJXaWR0aCh0LGUpe31zZXRDaGFyV2lkdGhBbmRCb3VuZHModCxlLG4saSxyLHMpe3RoaXMuY3R4LnJlY3QobixpLHItbixzLWkpO3RoaXMuY3R4LmNsaXAoKTt0aGlzLmVuZFBhdGgoKX1nZXRDb2xvck5fUGF0dGVybih0KXtsZXQgZTtpZigiVGlsaW5nUGF0dGVybiI9PT10WzBdKXtjb25zdCBuPXRbMV0saT10aGlzLmJhc2VUcmFuc2Zvcm18fCgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpLGE9e2NyZWF0ZUNhbnZhc0dyYXBoaWNzOnQ9Pm5ldyBDYW52YXNHcmFwaGljcyh0LHRoaXMuY29tbW9uT2Jqcyx0aGlzLm9ianMsdGhpcy5jYW52YXNGYWN0b3J5LHRoaXMuZmlsdGVyRmFjdG9yeSx7b3B0aW9uYWxDb250ZW50Q29uZmlnOnRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLG1hcmtlZENvbnRlbnRTdGFjazp0aGlzLm1hcmtlZENvbnRlbnRTdGFja30pfTtlPW5ldyBzLlRpbGluZ1BhdHRlcm4odCxuLHRoaXMuY3R4LGEsaSl9ZWxzZSBlPXRoaXMuX2dldFBhdHRlcm4odFsxXSx0WzJdKTtyZXR1cm4gZX1zZXRTdHJva2VDb2xvck4oKXt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9dGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpfXNldEZpbGxDb2xvck4oKXt0aGlzLmN1cnJlbnQuZmlsbENvbG9yPXRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTt0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw9ITB9c2V0U3Ryb2tlUkdCQ29sb3IodCxlLG4pe2NvbnN0IHI9aS5VdGlsLm1ha2VIZXhDb2xvcih0LGUsbik7dGhpcy5jdHguc3Ryb2tlU3R5bGU9cjt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9cn1zZXRGaWxsUkdCQ29sb3IodCxlLG4pe2NvbnN0IHI9aS5VdGlsLm1ha2VIZXhDb2xvcih0LGUsbik7dGhpcy5jdHguZmlsbFN0eWxlPXI7dGhpcy5jdXJyZW50LmZpbGxDb2xvcj1yO3RoaXMuY3VycmVudC5wYXR0ZXJuRmlsbD0hMX1fZ2V0UGF0dGVybih0KXtsZXQgZSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO2lmKHRoaXMuY2FjaGVkUGF0dGVybnMuaGFzKHQpKWU9dGhpcy5jYWNoZWRQYXR0ZXJucy5nZXQodCk7ZWxzZXtlPSgwLHMuZ2V0U2hhZGluZ1BhdHRlcm4pKHRoaXMuZ2V0T2JqZWN0KHQpKTt0aGlzLmNhY2hlZFBhdHRlcm5zLnNldCh0LGUpfW4mJihlLm1hdHJpeD1uKTtyZXR1cm4gZX1zaGFkaW5nRmlsbCh0KXtpZighdGhpcy5jb250ZW50VmlzaWJsZSlyZXR1cm47Y29uc3QgZT10aGlzLmN0eDt0aGlzLnNhdmUoKTtjb25zdCBuPXRoaXMuX2dldFBhdHRlcm4odCk7ZS5maWxsU3R5bGU9bi5nZXRQYXR0ZXJuKGUsdGhpcywoMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShlKSxzLlBhdGhUeXBlLlNIQURJTkcpO2NvbnN0IGE9KDAsci5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoZSk7aWYoYSl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6bn09ZS5jYW52YXMsW3IscyxvLGxdPWkuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwwLHQsbl0sYSk7dGhpcy5jdHguZmlsbFJlY3QocixzLG8tcixsLXMpfWVsc2UgdGhpcy5jdHguZmlsbFJlY3QoLTFlMTAsLTFlMTAsMmUxMCwyZTEwKTt0aGlzLmNvbXBvc2UodGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKSk7dGhpcy5yZXN0b3JlKCl9YmVnaW5JbmxpbmVJbWFnZSgpeygwLGkudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgYmVnaW5JbmxpbmVJbWFnZSIpfWJlZ2luSW1hZ2VEYXRhKCl7KDAsaS51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBiZWdpbkltYWdlRGF0YSIpfXBhaW50Rm9ybVhPYmplY3RCZWdpbih0LGUpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3RoaXMuc2F2ZSgpO3RoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5iYXNlVHJhbnNmb3JtKTtBcnJheS5pc0FycmF5KHQpJiY2PT09dC5sZW5ndGgmJnRoaXMudHJhbnNmb3JtKC4uLnQpO3RoaXMuYmFzZVRyYW5zZm9ybT0oMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtpZihlKXtjb25zdCB0PWVbMl0tZVswXSxuPWVbM10tZVsxXTt0aGlzLmN0eC5yZWN0KGVbMF0sZVsxXSx0LG4pO3RoaXMuY3VycmVudC51cGRhdGVSZWN0TWluTWF4KCgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpLGUpO3RoaXMuY2xpcCgpO3RoaXMuZW5kUGF0aCgpfX19cGFpbnRGb3JtWE9iamVjdEVuZCgpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3RoaXMucmVzdG9yZSgpO3RoaXMuYmFzZVRyYW5zZm9ybT10aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wb3AoKX19YmVnaW5Hcm91cCh0KXtpZighdGhpcy5jb250ZW50VmlzaWJsZSlyZXR1cm47dGhpcy5zYXZlKCk7aWYodGhpcy5pblNNYXNrTW9kZSl7dGhpcy5lbmRTTWFza01vZGUoKTt0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s9bnVsbH1jb25zdCBlPXRoaXMuY3R4O3QuaXNvbGF0ZWR8fCgwLGkuaW5mbykoIlRPRE86IFN1cHBvcnQgbm9uLWlzb2xhdGVkIGdyb3Vwcy4iKTt0Lmtub2Nrb3V0JiYoMCxpLndhcm4pKCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC4iKTtjb25zdCBuPSgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkoZSk7dC5tYXRyaXgmJmUudHJhbnNmb3JtKC4uLnQubWF0cml4KTtpZighdC5iYm94KXRocm93IG5ldyBFcnJvcigiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLiIpO2xldCBzPWkuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCh0LmJib3gsKDAsci5nZXRDdXJyZW50VHJhbnNmb3JtKShlKSk7Y29uc3QgYT1bMCwwLGUuY2FudmFzLndpZHRoLGUuY2FudmFzLmhlaWdodF07cz1pLlV0aWwuaW50ZXJzZWN0KHMsYSl8fFswLDAsMCwwXTtjb25zdCBsPU1hdGguZmxvb3Ioc1swXSksYz1NYXRoLmZsb29yKHNbMV0pO2xldCBoPU1hdGgubWF4KE1hdGguY2VpbChzWzJdKS1sLDEpLGQ9TWF0aC5tYXgoTWF0aC5jZWlsKHNbM10pLWMsMSksdT0xLHA9MTtpZihoPm8pe3U9aC9vO2g9b31pZihkPm8pe3A9ZC9vO2Q9b310aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChbMCwwLGgsZF0pO2xldCBmPSJncm91cEF0Iit0aGlzLmdyb3VwTGV2ZWw7dC5zbWFzayYmKGYrPSJfc21hc2tfIit0aGlzLnNtYXNrQ291bnRlcisrJTIpO2NvbnN0IGc9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoZixoLGQpLG09Zy5jb250ZXh0O20uc2NhbGUoMS91LDEvcCk7bS50cmFuc2xhdGUoLWwsLWMpO20udHJhbnNmb3JtKC4uLm4pO2lmKHQuc21hc2spdGhpcy5zbWFza1N0YWNrLnB1c2goe2NhbnZhczpnLmNhbnZhcyxjb250ZXh0Om0sb2Zmc2V0WDpsLG9mZnNldFk6YyxzY2FsZVg6dSxzY2FsZVk6cCxzdWJ0eXBlOnQuc21hc2suc3VidHlwZSxiYWNrZHJvcDp0LnNtYXNrLmJhY2tkcm9wLHRyYW5zZmVyTWFwOnQuc21hc2sudHJhbnNmZXJNYXB8fG51bGwsc3RhcnRUcmFuc2Zvcm1JbnZlcnNlOm51bGx9KTtlbHNle2Uuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtlLnRyYW5zbGF0ZShsLGMpO2Uuc2NhbGUodSxwKTtlLnNhdmUoKX1jb3B5Q3R4U3RhdGUoZSxtKTt0aGlzLmN0eD1tO3RoaXMuc2V0R1N0YXRlKFtbIkJNIiwic291cmNlLW92ZXIiXSxbImNhIiwxXSxbIkNBIiwxXV0pO3RoaXMuZ3JvdXBTdGFjay5wdXNoKGUpO3RoaXMuZ3JvdXBMZXZlbCsrfWVuZEdyb3VwKHQpe2lmKCF0aGlzLmNvbnRlbnRWaXNpYmxlKXJldHVybjt0aGlzLmdyb3VwTGV2ZWwtLTtjb25zdCBlPXRoaXMuY3R4LG49dGhpcy5ncm91cFN0YWNrLnBvcCgpO3RoaXMuY3R4PW47dGhpcy5jdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExO2lmKHQuc21hc2spe3RoaXMudGVtcFNNYXNrPXRoaXMuc21hc2tTdGFjay5wb3AoKTt0aGlzLnJlc3RvcmUoKX1lbHNle3RoaXMuY3R4LnJlc3RvcmUoKTtjb25zdCB0PSgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpO3RoaXMucmVzdG9yZSgpO3RoaXMuY3R4LnNhdmUoKTt0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oLi4udCk7Y29uc3Qgbj1pLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goWzAsMCxlLmNhbnZhcy53aWR0aCxlLmNhbnZhcy5oZWlnaHRdLHQpO3RoaXMuY3R4LmRyYXdJbWFnZShlLmNhbnZhcywwLDApO3RoaXMuY3R4LnJlc3RvcmUoKTt0aGlzLmNvbXBvc2Uobil9fWJlZ2luQW5ub3RhdGlvbih0LGUsbixzLGEpe3RoaXMuI0d0KCk7cmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO3RoaXMuY3R4LnNhdmUoKTt0aGlzLnNhdmUoKTt0aGlzLmJhc2VUcmFuc2Zvcm0mJnRoaXMuY3R4LnNldFRyYW5zZm9ybSguLi50aGlzLmJhc2VUcmFuc2Zvcm0pO2lmKEFycmF5LmlzQXJyYXkoZSkmJjQ9PT1lLmxlbmd0aCl7Y29uc3Qgcz1lWzJdLWVbMF0sbz1lWzNdLWVbMV07aWYoYSYmdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwKXsobj1uLnNsaWNlKCkpWzRdLT1lWzBdO25bNV0tPWVbMV07KGU9ZS5zbGljZSgpKVswXT1lWzFdPTA7ZVsyXT1zO2VbM109bztjb25zdFthLGxdPWkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSgoMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KSkse3ZpZXdwb3J0U2NhbGU6Y309dGhpcyxoPU1hdGguY2VpbChzKnRoaXMub3V0cHV0U2NhbGVYKmMpLGQ9TWF0aC5jZWlsKG8qdGhpcy5vdXRwdXRTY2FsZVkqYyk7dGhpcy5hbm5vdGF0aW9uQ2FudmFzPXRoaXMuY2FudmFzRmFjdG9yeS5jcmVhdGUoaCxkKTtjb25zdHtjYW52YXM6dSxjb250ZXh0OnB9PXRoaXMuYW5ub3RhdGlvbkNhbnZhczt0aGlzLmFubm90YXRpb25DYW52YXNNYXAuc2V0KHQsdSk7dGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4PXRoaXMuY3R4O3RoaXMuY3R4PXA7dGhpcy5jdHguc2F2ZSgpO3RoaXMuY3R4LnNldFRyYW5zZm9ybShhLDAsMCwtbCwwLG8qbCk7cmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpfWVsc2V7cmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO3RoaXMuY3R4LnJlY3QoZVswXSxlWzFdLHMsbyk7dGhpcy5jdHguY2xpcCgpO3RoaXMuZW5kUGF0aCgpfX10aGlzLmN1cnJlbnQ9bmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO3RoaXMudHJhbnNmb3JtKC4uLm4pO3RoaXMudHJhbnNmb3JtKC4uLnMpfWVuZEFubm90YXRpb24oKXtpZih0aGlzLmFubm90YXRpb25DYW52YXMpe3RoaXMuY3R4LnJlc3RvcmUoKTt0aGlzLiNWdCgpO3RoaXMuY3R4PXRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eDtkZWxldGUgdGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4O2RlbGV0ZSB0aGlzLmFubm90YXRpb25DYW52YXN9fXBhaW50SW1hZ2VNYXNrWE9iamVjdCh0KXtpZighdGhpcy5jb250ZW50VmlzaWJsZSlyZXR1cm47Y29uc3QgZT10LmNvdW50Oyh0PXRoaXMuZ2V0T2JqZWN0KHQuZGF0YSx0KSkuY291bnQ9ZTtjb25zdCBuPXRoaXMuY3R4LGk9dGhpcy5wcm9jZXNzaW5nVHlwZTM7aWYoaSl7dm9pZCAwPT09aS5jb21waWxlZCYmKGkuY29tcGlsZWQ9ZnVuY3Rpb24gY29tcGlsZVR5cGUzR2x5cGgodCl7Y29uc3R7d2lkdGg6ZSxoZWlnaHQ6bn09dDtpZihlPjFlM3x8bj4xZTMpcmV0dXJuIG51bGw7Y29uc3QgaT1uZXcgVWludDhBcnJheShbMCwyLDQsMCwxLDAsNSw0LDgsMTAsMCw4LDAsMiwxLDBdKSxyPWUrMTtsZXQgcyxhLG8sbD1uZXcgVWludDhBcnJheShyKihuKzEpKTtjb25zdCBjPWUrNyYtODtsZXQgaD1uZXcgVWludDhBcnJheShjKm4pLGQ9MDtmb3IoY29uc3QgZSBvZiB0LmRhdGEpe2xldCB0PTEyODtmb3IoO3Q+MDspe2hbZCsrXT1lJnQ/MDoyNTU7dD4+PTF9fWxldCB1PTA7ZD0wO2lmKDAhPT1oW2RdKXtsWzBdPTE7Kyt1fWZvcihhPTE7YTxlO2ErKyl7aWYoaFtkXSE9PWhbZCsxXSl7bFthXT1oW2RdPzI6MTsrK3V9ZCsrfWlmKDAhPT1oW2RdKXtsW2FdPTI7Kyt1fWZvcihzPTE7czxuO3MrKyl7ZD1zKmM7bz1zKnI7aWYoaFtkLWNdIT09aFtkXSl7bFtvXT1oW2RdPzE6ODsrK3V9bGV0IHQ9KGhbZF0/NDowKSsoaFtkLWNdPzg6MCk7Zm9yKGE9MTthPGU7YSsrKXt0PSh0Pj4yKSsoaFtkKzFdPzQ6MCkrKGhbZC1jKzFdPzg6MCk7aWYoaVt0XSl7bFtvK2FdPWlbdF07Kyt1fWQrK31pZihoW2QtY10hPT1oW2RdKXtsW28rYV09aFtkXT8yOjQ7Kyt1fWlmKHU+MWUzKXJldHVybiBudWxsfWQ9Yyoobi0xKTtvPXMqcjtpZigwIT09aFtkXSl7bFtvXT04OysrdX1mb3IoYT0xO2E8ZTthKyspe2lmKGhbZF0hPT1oW2QrMV0pe2xbbythXT1oW2RdPzQ6ODsrK3V9ZCsrfWlmKDAhPT1oW2RdKXtsW28rYV09NDsrK3V9aWYodT4xZTMpcmV0dXJuIG51bGw7Y29uc3QgcD1uZXcgSW50MzJBcnJheShbMCxyLC0xLDAsLXIsMCwwLDAsMV0pLGY9bmV3IFBhdGgyRDtmb3Iocz0wO3UmJnM8PW47cysrKXtsZXQgdD1zKnI7Y29uc3Qgbj10K2U7Zm9yKDt0PG4mJiFsW3RdOyl0Kys7aWYodD09PW4pY29udGludWU7Zi5tb3ZlVG8odCVyLHMpO2NvbnN0IGk9dDtsZXQgYT1sW3RdO2Rve2NvbnN0IGU9cFthXTtkb3t0Kz1lfXdoaWxlKCFsW3RdKTtjb25zdCBuPWxbdF07aWYoNSE9PW4mJjEwIT09bil7YT1uO2xbdF09MH1lbHNle2E9biY1MSphPj40O2xbdF0mPWE+PjJ8YTw8Mn1mLmxpbmVUbyh0JXIsdC9yfDApO2xbdF18fC0tdX13aGlsZShpIT09dCk7LS1zfWg9bnVsbDtsPW51bGw7cmV0dXJuIGZ1bmN0aW9uKHQpe3Quc2F2ZSgpO3Quc2NhbGUoMS9lLC0xL24pO3QudHJhbnNsYXRlKDAsLW4pO3QuZmlsbChmKTt0LmJlZ2luUGF0aCgpO3QucmVzdG9yZSgpfX0odCkpO2lmKGkuY29tcGlsZWQpe2kuY29tcGlsZWQobik7cmV0dXJufX1jb25zdCByPXRoaXMuX2NyZWF0ZU1hc2tDYW52YXModCkscz1yLmNhbnZhcztuLnNhdmUoKTtuLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7bi5kcmF3SW1hZ2UocyxyLm9mZnNldFgsci5vZmZzZXRZKTtuLnJlc3RvcmUoKTt0aGlzLmNvbXBvc2UoKX1wYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQodCxlKXtsZXQgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MCxzPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLGE9YXJndW1lbnRzLmxlbmd0aD40P2FyZ3VtZW50c1s0XTp2b2lkIDAsbz1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtpZighdGhpcy5jb250ZW50VmlzaWJsZSlyZXR1cm47dD10aGlzLmdldE9iamVjdCh0LmRhdGEsdCk7Y29uc3QgbD10aGlzLmN0eDtsLnNhdmUoKTtjb25zdCBjPSgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkobCk7bC50cmFuc2Zvcm0oZSxuLHMsYSwwLDApO2NvbnN0IGg9dGhpcy5fY3JlYXRlTWFza0NhbnZhcyh0KTtsLnNldFRyYW5zZm9ybSgxLDAsMCwxLGgub2Zmc2V0WC1jWzRdLGgub2Zmc2V0WS1jWzVdKTtmb3IobGV0IHQ9MCxyPW8ubGVuZ3RoO3Q8cjt0Kz0yKXtjb25zdCByPWkuVXRpbC50cmFuc2Zvcm0oYyxbZSxuLHMsYSxvW3RdLG9bdCsxXV0pLFtkLHVdPWkuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwwXSxyKTtsLmRyYXdJbWFnZShoLmNhbnZhcyxkLHUpfWwucmVzdG9yZSgpO3RoaXMuY29tcG9zZSgpfXBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwKHQpe2lmKCF0aGlzLmNvbnRlbnRWaXNpYmxlKXJldHVybjtjb25zdCBlPXRoaXMuY3R4LG49dGhpcy5jdXJyZW50LmZpbGxDb2xvcixpPXRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbDtmb3IoY29uc3QgYSBvZiB0KXtjb25zdHtkYXRhOnQsd2lkdGg6byxoZWlnaHQ6bCx0cmFuc2Zvcm06Y309YSxoPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJtYXNrQ2FudmFzIixvLGwpLGQ9aC5jb250ZXh0O2Quc2F2ZSgpO3B1dEJpbmFyeUltYWdlTWFzayhkLHRoaXMuZ2V0T2JqZWN0KHQsYSkpO2QuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iO2QuZmlsbFN0eWxlPWk/bi5nZXRQYXR0ZXJuKGQsdGhpcywoMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShlKSxzLlBhdGhUeXBlLkZJTEwpOm47ZC5maWxsUmVjdCgwLDAsbyxsKTtkLnJlc3RvcmUoKTtlLnNhdmUoKTtlLnRyYW5zZm9ybSguLi5jKTtlLnNjYWxlKDEsLTEpO2RyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhlLGguY2FudmFzLDAsMCxvLGwsMCwtMSwxLDEpO2UucmVzdG9yZSgpfXRoaXMuY29tcG9zZSgpfXBhaW50SW1hZ2VYT2JqZWN0KHQpe2lmKCF0aGlzLmNvbnRlbnRWaXNpYmxlKXJldHVybjtjb25zdCBlPXRoaXMuZ2V0T2JqZWN0KHQpO2U/dGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChlKTooMCxpLndhcm4pKCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0Iil9cGFpbnRJbWFnZVhPYmplY3RSZXBlYXQodCxlLG4scil7aWYoIXRoaXMuY29udGVudFZpc2libGUpcmV0dXJuO2NvbnN0IHM9dGhpcy5nZXRPYmplY3QodCk7aWYoIXMpeygwLGkud2FybikoIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXQiKTtyZXR1cm59Y29uc3QgYT1zLndpZHRoLG89cy5oZWlnaHQsbD1bXTtmb3IobGV0IHQ9MCxpPXIubGVuZ3RoO3Q8aTt0Kz0yKWwucHVzaCh7dHJhbnNmb3JtOltlLDAsMCxuLHJbdF0sclt0KzFdXSx4OjAseTowLHc6YSxoOm99KTt0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAocyxsKX1hcHBseVRyYW5zZmVyTWFwc1RvQ2FudmFzKHQpe2lmKCJub25lIiE9PXRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMpe3QuZmlsdGVyPXRoaXMuY3VycmVudC50cmFuc2Zlck1hcHM7dC5kcmF3SW1hZ2UodC5jYW52YXMsMCwwKTt0LmZpbHRlcj0ibm9uZSJ9cmV0dXJuIHQuY2FudmFzfWFwcGx5VHJhbnNmZXJNYXBzVG9CaXRtYXAodCl7aWYoIm5vbmUiPT09dGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcylyZXR1cm4gdC5iaXRtYXA7Y29uc3R7Yml0bWFwOmUsd2lkdGg6bixoZWlnaHQ6aX09dCxyPXRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJpbmxpbmVJbWFnZSIsbixpKSxzPXIuY29udGV4dDtzLmZpbHRlcj10aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzO3MuZHJhd0ltYWdlKGUsMCwwKTtzLmZpbHRlcj0ibm9uZSI7cmV0dXJuIHIuY2FudmFzfXBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KHQpe2lmKCF0aGlzLmNvbnRlbnRWaXNpYmxlKXJldHVybjtjb25zdCBlPXQud2lkdGgsbj10LmhlaWdodCxzPXRoaXMuY3R4O3RoaXMuc2F2ZSgpO2lmKCFpLmlzTm9kZUpTKXtjb25zdHtmaWx0ZXI6dH09czsibm9uZSIhPT10JiYiIiE9PXQmJihzLmZpbHRlcj0ibm9uZSIpfXMuc2NhbGUoMS9lLC0xL24pO2xldCBhO2lmKHQuYml0bWFwKWE9dGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQml0bWFwKHQpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIEhUTUxFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnR8fCF0LmRhdGEpYT10O2Vsc2V7Y29uc3QgaT10aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygiaW5saW5lSW1hZ2UiLGUsbikuY29udGV4dDtwdXRCaW5hcnlJbWFnZURhdGEoaSx0KTthPXRoaXMuYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyhpKX1jb25zdCBvPXRoaXMuX3NjYWxlSW1hZ2UoYSwoMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShzKSk7cy5pbWFnZVNtb290aGluZ0VuYWJsZWQ9Z2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKCgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkocyksdC5pbnRlcnBvbGF0ZSk7ZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKHMsby5pbWcsMCwwLG8ucGFpbnRXaWR0aCxvLnBhaW50SGVpZ2h0LDAsLW4sZSxuKTt0aGlzLmNvbXBvc2UoKTt0aGlzLnJlc3RvcmUoKX1wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKHQsZSl7aWYoIXRoaXMuY29udGVudFZpc2libGUpcmV0dXJuO2NvbnN0IG49dGhpcy5jdHg7bGV0IGk7aWYodC5iaXRtYXApaT10LmJpdG1hcDtlbHNle2NvbnN0IGU9dC53aWR0aCxuPXQuaGVpZ2h0LHI9dGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoImlubGluZUltYWdlIixlLG4pLmNvbnRleHQ7cHV0QmluYXJ5SW1hZ2VEYXRhKHIsdCk7aT10aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXMocil9Zm9yKGNvbnN0IHQgb2YgZSl7bi5zYXZlKCk7bi50cmFuc2Zvcm0oLi4udC50cmFuc2Zvcm0pO24uc2NhbGUoMSwtMSk7ZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKG4saSx0LngsdC55LHQudyx0LmgsMCwtMSwxLDEpO24ucmVzdG9yZSgpfXRoaXMuY29tcG9zZSgpfXBhaW50U29saWRDb2xvckltYWdlTWFzaygpe2lmKHRoaXMuY29udGVudFZpc2libGUpe3RoaXMuY3R4LmZpbGxSZWN0KDAsMCwxLDEpO3RoaXMuY29tcG9zZSgpfX1tYXJrUG9pbnQodCl7fW1hcmtQb2ludFByb3BzKHQsZSl7fWJlZ2luTWFya2VkQ29udGVudCh0KXt0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHt2aXNpYmxlOiEwfSl9YmVnaW5NYXJrZWRDb250ZW50UHJvcHModCxlKXsiT0MiPT09dD90aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHt2aXNpYmxlOnRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShlKX0pOnRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe3Zpc2libGU6ITB9KTt0aGlzLmNvbnRlbnRWaXNpYmxlPXRoaXMuaXNDb250ZW50VmlzaWJsZSgpfWVuZE1hcmtlZENvbnRlbnQoKXt0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wb3AoKTt0aGlzLmNvbnRlbnRWaXNpYmxlPXRoaXMuaXNDb250ZW50VmlzaWJsZSgpfWJlZ2luQ29tcGF0KCl7fWVuZENvbXBhdCgpe31jb25zdW1lUGF0aCh0KXtjb25zdCBlPXRoaXMuY3VycmVudC5pc0VtcHR5Q2xpcCgpO3RoaXMucGVuZGluZ0NsaXAmJnRoaXMuY3VycmVudC51cGRhdGVDbGlwRnJvbVBhdGgoKTt0aGlzLnBlbmRpbmdDbGlwfHx0aGlzLmNvbXBvc2UodCk7Y29uc3Qgbj10aGlzLmN0eDtpZih0aGlzLnBlbmRpbmdDbGlwKXtlfHwodGhpcy5wZW5kaW5nQ2xpcD09PXU/bi5jbGlwKCJldmVub2RkIik6bi5jbGlwKCkpO3RoaXMucGVuZGluZ0NsaXA9bnVsbH10aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0aGlzLmN1cnJlbnQuY2xpcEJveCk7bi5iZWdpblBhdGgoKX1nZXRTaW5nbGVQaXhlbFdpZHRoKCl7aWYoIXRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGgpe2NvbnN0IHQ9KDAsci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7aWYoMD09PXRbMV0mJjA9PT10WzJdKXRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9MS9NYXRoLm1pbihNYXRoLmFicyh0WzBdKSxNYXRoLmFicyh0WzNdKSk7ZWxzZXtjb25zdCBlPU1hdGguYWJzKHRbMF0qdFszXS10WzJdKnRbMV0pLG49TWF0aC5oeXBvdCh0WzBdLHRbMl0pLGk9TWF0aC5oeXBvdCh0WzFdLHRbM10pO3RoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg9TWF0aC5tYXgobixpKS9lfX1yZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aH1nZXRTY2FsZUZvclN0cm9raW5nKCl7aWYoLTE9PT10aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdKXtjb25zdHtsaW5lV2lkdGg6dH09dGhpcy5jdXJyZW50LHthOmUsYjpuLGM6aSxkOnJ9PXRoaXMuY3R4LmdldFRyYW5zZm9ybSgpO2xldCBzLGE7aWYoMD09PW4mJjA9PT1pKXtjb25zdCBuPU1hdGguYWJzKGUpLGk9TWF0aC5hYnMocik7aWYobj09PWkpaWYoMD09PXQpcz1hPTEvbjtlbHNle2NvbnN0IGU9bip0O3M9YT1lPDE/MS9lOjF9ZWxzZSBpZigwPT09dCl7cz0xL247YT0xL2l9ZWxzZXtjb25zdCBlPW4qdCxyPWkqdDtzPWU8MT8xL2U6MTthPXI8MT8xL3I6MX19ZWxzZXtjb25zdCBvPU1hdGguYWJzKGUqci1uKmkpLGw9TWF0aC5oeXBvdChlLG4pLGM9TWF0aC5oeXBvdChpLHIpO2lmKDA9PT10KXtzPWMvbzthPWwvb31lbHNle2NvbnN0IGU9dCpvO3M9Yz5lP2MvZToxO2E9bD5lP2wvZToxfX10aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdPXM7dGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1sxXT1hfXJldHVybiB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nfXJlc2NhbGVBbmRTdHJva2UodCl7Y29uc3R7Y3R4OmV9PXRoaXMse2xpbmVXaWR0aDpufT10aGlzLmN1cnJlbnQsW2kscl09dGhpcy5nZXRTY2FsZUZvclN0cm9raW5nKCk7ZS5saW5lV2lkdGg9bnx8MTtpZigxPT09aSYmMT09PXIpe2Uuc3Ryb2tlKCk7cmV0dXJufWNvbnN0IHM9ZS5nZXRMaW5lRGFzaCgpO3QmJmUuc2F2ZSgpO2Uuc2NhbGUoaSxyKTtpZihzLmxlbmd0aD4wKXtjb25zdCB0PU1hdGgubWF4KGkscik7ZS5zZXRMaW5lRGFzaChzLm1hcCgoZT0+ZS90KSkpO2UubGluZURhc2hPZmZzZXQvPXR9ZS5zdHJva2UoKTt0JiZlLnJlc3RvcmUoKX1pc0NvbnRlbnRWaXNpYmxlKCl7Zm9yKGxldCB0PXRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aC0xO3Q+PTA7dC0tKWlmKCF0aGlzLm1hcmtlZENvbnRlbnRTdGFja1t0XS52aXNpYmxlKXJldHVybiExO3JldHVybiEwfX1lLkNhbnZhc0dyYXBoaWNzPUNhbnZhc0dyYXBoaWNzO2Zvcihjb25zdCB0IGluIGkuT1BTKXZvaWQgMCE9PUNhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVt0XSYmKENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtpLk9QU1t0XV09Q2FudmFzR3JhcGhpY3MucHJvdG90eXBlW3RdKX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5UaWxpbmdQYXR0ZXJuPWUuUGF0aFR5cGU9dm9pZCAwO2UuZ2V0U2hhZGluZ1BhdHRlcm49ZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm4odCl7c3dpdGNoKHRbMF0pe2Nhc2UiUmFkaWFsQXhpYWwiOnJldHVybiBuZXcgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybih0KTtjYXNlIk1lc2giOnJldHVybiBuZXcgTWVzaFNoYWRpbmdQYXR0ZXJuKHQpO2Nhc2UiRHVtbXkiOnJldHVybiBuZXcgRHVtbXlTaGFkaW5nUGF0dGVybn10aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSVIgdHlwZTogJHt0WzBdfWApfTtuKDIpO3ZhciBpPW4oMSkscj1uKDE2Nyk7Y29uc3Qgcz17RklMTDoiRmlsbCIsU1RST0tFOiJTdHJva2UiLFNIQURJTkc6IlNoYWRpbmcifTtlLlBhdGhUeXBlPXM7ZnVuY3Rpb24gYXBwbHlCb3VuZGluZ0JveCh0LGUpe2lmKCFlKXJldHVybjtjb25zdCBuPWVbMl0tZVswXSxpPWVbM10tZVsxXSxyPW5ldyBQYXRoMkQ7ci5yZWN0KGVbMF0sZVsxXSxuLGkpO3QuY2xpcChyKX1jbGFzcyBCYXNlU2hhZGluZ1BhdHRlcm57Y29uc3RydWN0b3IoKXt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZVNoYWRpbmdQYXR0ZXJuJiYoMCxpLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmdQYXR0ZXJuLiIpfWdldFBhdHRlcm4oKXsoMCxpLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRQYXR0ZXJuYCBjYWxsZWQuIil9fWNsYXNzIFJhZGlhbEF4aWFsU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm57Y29uc3RydWN0b3IodCl7c3VwZXIoKTt0aGlzLl90eXBlPXRbMV07dGhpcy5fYmJveD10WzJdO3RoaXMuX2NvbG9yU3RvcHM9dFszXTt0aGlzLl9wMD10WzRdO3RoaXMuX3AxPXRbNV07dGhpcy5fcjA9dFs2XTt0aGlzLl9yMT10WzddO3RoaXMubWF0cml4PW51bGx9X2NyZWF0ZUdyYWRpZW50KHQpe2xldCBlOyJheGlhbCI9PT10aGlzLl90eXBlP2U9dC5jcmVhdGVMaW5lYXJHcmFkaWVudCh0aGlzLl9wMFswXSx0aGlzLl9wMFsxXSx0aGlzLl9wMVswXSx0aGlzLl9wMVsxXSk6InJhZGlhbCI9PT10aGlzLl90eXBlJiYoZT10LmNyZWF0ZVJhZGlhbEdyYWRpZW50KHRoaXMuX3AwWzBdLHRoaXMuX3AwWzFdLHRoaXMuX3IwLHRoaXMuX3AxWzBdLHRoaXMuX3AxWzFdLHRoaXMuX3IxKSk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fY29sb3JTdG9wcyllLmFkZENvbG9yU3RvcCh0WzBdLHRbMV0pO3JldHVybiBlfWdldFBhdHRlcm4odCxlLG4sYSl7bGV0IG87aWYoYT09PXMuU1RST0tFfHxhPT09cy5GSUxMKXtjb25zdCBzPWUuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KGEsKDAsci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KSl8fFswLDAsMCwwXSxsPU1hdGguY2VpbChzWzJdLXNbMF0pfHwxLGM9TWF0aC5jZWlsKHNbM10tc1sxXSl8fDEsaD1lLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcygicGF0dGVybiIsbCxjLCEwKSxkPWguY29udGV4dDtkLmNsZWFyUmVjdCgwLDAsZC5jYW52YXMud2lkdGgsZC5jYW52YXMuaGVpZ2h0KTtkLmJlZ2luUGF0aCgpO2QucmVjdCgwLDAsZC5jYW52YXMud2lkdGgsZC5jYW52YXMuaGVpZ2h0KTtkLnRyYW5zbGF0ZSgtc1swXSwtc1sxXSk7bj1pLlV0aWwudHJhbnNmb3JtKG4sWzEsMCwwLDEsc1swXSxzWzFdXSk7ZC50cmFuc2Zvcm0oLi4uZS5iYXNlVHJhbnNmb3JtKTt0aGlzLm1hdHJpeCYmZC50cmFuc2Zvcm0oLi4udGhpcy5tYXRyaXgpO2FwcGx5Qm91bmRpbmdCb3goZCx0aGlzLl9iYm94KTtkLmZpbGxTdHlsZT10aGlzLl9jcmVhdGVHcmFkaWVudChkKTtkLmZpbGwoKTtvPXQuY3JlYXRlUGF0dGVybihoLmNhbnZhcywibm8tcmVwZWF0Iik7Y29uc3QgdT1uZXcgRE9NTWF0cml4KG4pO28uc2V0VHJhbnNmb3JtKHUpfWVsc2V7YXBwbHlCb3VuZGluZ0JveCh0LHRoaXMuX2Jib3gpO289dGhpcy5fY3JlYXRlR3JhZGllbnQodCl9cmV0dXJuIG99fWZ1bmN0aW9uIGRyYXdUcmlhbmdsZSh0LGUsbixpLHIscyxhLG8pe2NvbnN0IGw9ZS5jb29yZHMsYz1lLmNvbG9ycyxoPXQuZGF0YSxkPTQqdC53aWR0aDtsZXQgdTtpZihsW24rMV0+bFtpKzFdKXt1PW47bj1pO2k9dTt1PXM7cz1hO2E9dX1pZihsW2krMV0+bFtyKzFdKXt1PWk7aT1yO3I9dTt1PWE7YT1vO289dX1pZihsW24rMV0+bFtpKzFdKXt1PW47bj1pO2k9dTt1PXM7cz1hO2E9dX1jb25zdCBwPShsW25dK2Uub2Zmc2V0WCkqZS5zY2FsZVgsZj0obFtuKzFdK2Uub2Zmc2V0WSkqZS5zY2FsZVksZz0obFtpXStlLm9mZnNldFgpKmUuc2NhbGVYLG09KGxbaSsxXStlLm9mZnNldFkpKmUuc2NhbGVZLGI9KGxbcl0rZS5vZmZzZXRYKSplLnNjYWxlWCx2PShsW3IrMV0rZS5vZmZzZXRZKSplLnNjYWxlWTtpZihmPj12KXJldHVybjtjb25zdCB5PWNbc10sQT1jW3MrMV0sXz1jW3MrMl0sUz1jW2FdLEU9Y1thKzFdLHg9Y1thKzJdLHc9Y1tvXSxDPWNbbysxXSxUPWNbbysyXSxQPU1hdGgucm91bmQoZiksaz1NYXRoLnJvdW5kKHYpO2xldCBNLFIsSSxELE8sTCxOLEI7Zm9yKGxldCB0PVA7dDw9azt0Kyspe2lmKHQ8bSl7Y29uc3QgZT10PGY/MDooZi10KS8oZi1tKTtNPXAtKHAtZykqZTtSPXktKHktUykqZTtJPUEtKEEtRSkqZTtEPV8tKF8teCkqZX1lbHNle2xldCBlO2U9dD52PzE6bT09PXY/MDoobS10KS8obS12KTtNPWctKGctYikqZTtSPVMtKFMtdykqZTtJPUUtKEUtQykqZTtEPXgtKHgtVCkqZX1sZXQgZTtlPXQ8Zj8wOnQ+dj8xOihmLXQpLyhmLXYpO089cC0ocC1iKSplO0w9eS0oeS13KSplO049QS0oQS1DKSplO0I9Xy0oXy1UKSplO2NvbnN0IG49TWF0aC5yb3VuZChNYXRoLm1pbihNLE8pKSxpPU1hdGgucm91bmQoTWF0aC5tYXgoTSxPKSk7bGV0IHI9ZCp0KzQqbjtmb3IobGV0IHQ9bjt0PD1pO3QrKyl7ZT0oTS10KS8oTS1PKTtlPDA/ZT0wOmU+MSYmKGU9MSk7aFtyKytdPVItKFItTCkqZXwwO2hbcisrXT1JLShJLU4pKmV8MDtoW3IrK109RC0oRC1CKSplfDA7aFtyKytdPTI1NX19fWZ1bmN0aW9uIGRyYXdGaWd1cmUodCxlLG4pe2NvbnN0IGk9ZS5jb29yZHMscj1lLmNvbG9ycztsZXQgcyxhO3N3aXRjaChlLnR5cGUpe2Nhc2UibGF0dGljZSI6Y29uc3Qgbz1lLnZlcnRpY2VzUGVyUm93LGw9TWF0aC5mbG9vcihpLmxlbmd0aC9vKS0xLGM9by0xO2ZvcihzPTA7czxsO3MrKyl7bGV0IGU9cypvO2ZvcihsZXQgcz0wO3M8YztzKyssZSsrKXtkcmF3VHJpYW5nbGUodCxuLGlbZV0saVtlKzFdLGlbZStvXSxyW2VdLHJbZSsxXSxyW2Urb10pO2RyYXdUcmlhbmdsZSh0LG4saVtlK28rMV0saVtlKzFdLGlbZStvXSxyW2UrbysxXSxyW2UrMV0scltlK29dKX19YnJlYWs7Y2FzZSJ0cmlhbmdsZXMiOmZvcihzPTAsYT1pLmxlbmd0aDtzPGE7cys9MylkcmF3VHJpYW5nbGUodCxuLGlbc10saVtzKzFdLGlbcysyXSxyW3NdLHJbcysxXSxyW3MrMl0pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGZpZ3VyZSIpfX1jbGFzcyBNZXNoU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm57Y29uc3RydWN0b3IodCl7c3VwZXIoKTt0aGlzLl9jb29yZHM9dFsyXTt0aGlzLl9jb2xvcnM9dFszXTt0aGlzLl9maWd1cmVzPXRbNF07dGhpcy5fYm91bmRzPXRbNV07dGhpcy5fYmJveD10WzddO3RoaXMuX2JhY2tncm91bmQ9dFs4XTt0aGlzLm1hdHJpeD1udWxsfV9jcmVhdGVNZXNoQ2FudmFzKHQsZSxuKXtjb25zdCBpPU1hdGguZmxvb3IodGhpcy5fYm91bmRzWzBdKSxyPU1hdGguZmxvb3IodGhpcy5fYm91bmRzWzFdKSxzPU1hdGguY2VpbCh0aGlzLl9ib3VuZHNbMl0pLWksYT1NYXRoLmNlaWwodGhpcy5fYm91bmRzWzNdKS1yLG89TWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKHMqdFswXSoxLjEpKSwzZTMpLGw9TWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGEqdFsxXSoxLjEpKSwzZTMpLGM9cy9vLGg9YS9sLGQ9e2Nvb3Jkczp0aGlzLl9jb29yZHMsY29sb3JzOnRoaXMuX2NvbG9ycyxvZmZzZXRYOi1pLG9mZnNldFk6LXIsc2NhbGVYOjEvYyxzY2FsZVk6MS9ofSx1PW8rNCxwPWwrNCxmPW4uZ2V0Q2FudmFzKCJtZXNoIix1LHAsITEpLGc9Zi5jb250ZXh0LG09Zy5jcmVhdGVJbWFnZURhdGEobyxsKTtpZihlKXtjb25zdCB0PW0uZGF0YTtmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKz00KXt0W25dPWVbMF07dFtuKzFdPWVbMV07dFtuKzJdPWVbMl07dFtuKzNdPTI1NX19Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZmlndXJlcylkcmF3RmlndXJlKG0sdCxkKTtnLnB1dEltYWdlRGF0YShtLDIsMik7cmV0dXJue2NhbnZhczpmLmNhbnZhcyxvZmZzZXRYOmktMipjLG9mZnNldFk6ci0yKmgsc2NhbGVYOmMsc2NhbGVZOmh9fWdldFBhdHRlcm4odCxlLG4sYSl7YXBwbHlCb3VuZGluZ0JveCh0LHRoaXMuX2Jib3gpO2xldCBvO2lmKGE9PT1zLlNIQURJTkcpbz1pLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoKDAsci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KSk7ZWxzZXtvPWkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShlLmJhc2VUcmFuc2Zvcm0pO2lmKHRoaXMubWF0cml4KXtjb25zdCB0PWkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7bz1bb1swXSp0WzBdLG9bMV0qdFsxXV19fWNvbnN0IGw9dGhpcy5fY3JlYXRlTWVzaENhbnZhcyhvLGE9PT1zLlNIQURJTkc/bnVsbDp0aGlzLl9iYWNrZ3JvdW5kLGUuY2FjaGVkQ2FudmFzZXMpO2lmKGEhPT1zLlNIQURJTkcpe3Quc2V0VHJhbnNmb3JtKC4uLmUuYmFzZVRyYW5zZm9ybSk7dGhpcy5tYXRyaXgmJnQudHJhbnNmb3JtKC4uLnRoaXMubWF0cml4KX10LnRyYW5zbGF0ZShsLm9mZnNldFgsbC5vZmZzZXRZKTt0LnNjYWxlKGwuc2NhbGVYLGwuc2NhbGVZKTtyZXR1cm4gdC5jcmVhdGVQYXR0ZXJuKGwuY2FudmFzLCJuby1yZXBlYXQiKX19Y2xhc3MgRHVtbXlTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybntnZXRQYXR0ZXJuKCl7cmV0dXJuImhvdHBpbmsifX1jb25zdCBhPTEsbz0yO2NsYXNzIFRpbGluZ1BhdHRlcm57c3RhdGljIE1BWF9QQVRURVJOX1NJWkU9M2UzO2NvbnN0cnVjdG9yKHQsZSxuLGkscil7dGhpcy5vcGVyYXRvckxpc3Q9dFsyXTt0aGlzLm1hdHJpeD10WzNdfHxbMSwwLDAsMSwwLDBdO3RoaXMuYmJveD10WzRdO3RoaXMueHN0ZXA9dFs1XTt0aGlzLnlzdGVwPXRbNl07dGhpcy5wYWludFR5cGU9dFs3XTt0aGlzLnRpbGluZ1R5cGU9dFs4XTt0aGlzLmNvbG9yPWU7dGhpcy5jdHg9bjt0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeT1pO3RoaXMuYmFzZVRyYW5zZm9ybT1yfWNyZWF0ZVBhdHRlcm5DYW52YXModCl7Y29uc3QgZT10aGlzLm9wZXJhdG9yTGlzdCxuPXRoaXMuYmJveCxzPXRoaXMueHN0ZXAsYT10aGlzLnlzdGVwLG89dGhpcy5wYWludFR5cGUsbD10aGlzLnRpbGluZ1R5cGUsYz10aGlzLmNvbG9yLGg9dGhpcy5jYW52YXNHcmFwaGljc0ZhY3Rvcnk7KDAsaS5pbmZvKSgiVGlsaW5nVHlwZTogIitsKTtjb25zdCBkPW5bMF0sdT1uWzFdLHA9blsyXSxmPW5bM10sZz1pLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5tYXRyaXgpLG09aS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMuYmFzZVRyYW5zZm9ybSksYj1bZ1swXSptWzBdLGdbMV0qbVsxXV0sdj10aGlzLmdldFNpemVBbmRTY2FsZShzLHRoaXMuY3R4LmNhbnZhcy53aWR0aCxiWzBdKSx5PXRoaXMuZ2V0U2l6ZUFuZFNjYWxlKGEsdGhpcy5jdHguY2FudmFzLmhlaWdodCxiWzFdKSxBPXQuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKCJwYXR0ZXJuIix2LnNpemUseS5zaXplLCEwKSxfPUEuY29udGV4dCxTPWguY3JlYXRlQ2FudmFzR3JhcGhpY3MoXyk7Uy5ncm91cExldmVsPXQuZ3JvdXBMZXZlbDt0aGlzLnNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChTLG8sYyk7bGV0IEU9ZCx4PXUsdz1wLEM9ZjtpZihkPDApe0U9MDt3Kz1NYXRoLmFicyhkKX1pZih1PDApe3g9MDtDKz1NYXRoLmFicyh1KX1fLnRyYW5zbGF0ZSgtdi5zY2FsZSpFLC15LnNjYWxlKngpO1MudHJhbnNmb3JtKHYuc2NhbGUsMCwwLHkuc2NhbGUsMCwwKTtfLnNhdmUoKTt0aGlzLmNsaXBCYm94KFMsRSx4LHcsQyk7Uy5iYXNlVHJhbnNmb3JtPSgwLHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkoUy5jdHgpO1MuZXhlY3V0ZU9wZXJhdG9yTGlzdChlKTtTLmVuZERyYXdpbmcoKTtyZXR1cm57Y2FudmFzOkEuY2FudmFzLHNjYWxlWDp2LnNjYWxlLHNjYWxlWTp5LnNjYWxlLG9mZnNldFg6RSxvZmZzZXRZOnh9fWdldFNpemVBbmRTY2FsZSh0LGUsbil7dD1NYXRoLmFicyh0KTtjb25zdCBpPU1hdGgubWF4KFRpbGluZ1BhdHRlcm4uTUFYX1BBVFRFUk5fU0laRSxlKTtsZXQgcj1NYXRoLmNlaWwodCpuKTtyPj1pP3I9aTpuPXIvdDtyZXR1cm57c2NhbGU6bixzaXplOnJ9fWNsaXBCYm94KHQsZSxuLGkscyl7Y29uc3QgYT1pLWUsbz1zLW47dC5jdHgucmVjdChlLG4sYSxvKTt0LmN1cnJlbnQudXBkYXRlUmVjdE1pbk1heCgoMCxyLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHQuY3R4KSxbZSxuLGksc10pO3QuY2xpcCgpO3QuZW5kUGF0aCgpfXNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dCh0LGUsbil7Y29uc3Qgcj10LmN0eCxzPXQuY3VycmVudDtzd2l0Y2goZSl7Y2FzZSBhOmNvbnN0IHQ9dGhpcy5jdHg7ci5maWxsU3R5bGU9dC5maWxsU3R5bGU7ci5zdHJva2VTdHlsZT10LnN0cm9rZVN0eWxlO3MuZmlsbENvbG9yPXQuZmlsbFN0eWxlO3Muc3Ryb2tlQ29sb3I9dC5zdHJva2VTdHlsZTticmVhaztjYXNlIG86Y29uc3QgbD1pLlV0aWwubWFrZUhleENvbG9yKG5bMF0sblsxXSxuWzJdKTtyLmZpbGxTdHlsZT1sO3Iuc3Ryb2tlU3R5bGU9bDtzLmZpbGxDb2xvcj1sO3Muc3Ryb2tlQ29sb3I9bDticmVhaztkZWZhdWx0OnRocm93IG5ldyBpLkZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwYWludCB0eXBlOiAke2V9YCl9fWdldFBhdHRlcm4odCxlLG4scil7bGV0IGE9bjtpZihyIT09cy5TSEFESU5HKXthPWkuVXRpbC50cmFuc2Zvcm0oYSxlLmJhc2VUcmFuc2Zvcm0pO3RoaXMubWF0cml4JiYoYT1pLlV0aWwudHJhbnNmb3JtKGEsdGhpcy5tYXRyaXgpKX1jb25zdCBvPXRoaXMuY3JlYXRlUGF0dGVybkNhbnZhcyhlKTtsZXQgbD1uZXcgRE9NTWF0cml4KGEpO2w9bC50cmFuc2xhdGUoby5vZmZzZXRYLG8ub2Zmc2V0WSk7bD1sLnNjYWxlKDEvby5zY2FsZVgsMS9vLnNjYWxlWSk7Y29uc3QgYz10LmNyZWF0ZVBhdHRlcm4oby5jYW52YXMsInJlcGVhdCIpO2Muc2V0VHJhbnNmb3JtKGwpO3JldHVybiBjfX1lLlRpbGluZ1BhdHRlcm49VGlsaW5nUGF0dGVybn0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5jb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQT1jb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQTtlLmNvbnZlcnRUb1JHQkE9ZnVuY3Rpb24gY29udmVydFRvUkdCQSh0KXtzd2l0Y2godC5raW5kKXtjYXNlIGkuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOnJldHVybiBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSh0KTtjYXNlIGkuSW1hZ2VLaW5kLlJHQl8yNEJQUDpyZXR1cm4gZnVuY3Rpb24gY29udmVydFJHQlRvUkdCQSh0KXtsZXR7c3JjOmUsc3JjUG9zOm49MCxkZXN0OnIsZGVzdFBvczpzPTAsd2lkdGg6YSxoZWlnaHQ6b309dCxsPTA7Y29uc3QgYz1lLmxlbmd0aD4+MixoPW5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcixuLGMpO2lmKGkuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pe2Zvcig7bDxjLTI7bCs9MyxzKz00KXtjb25zdCB0PWhbbF0sZT1oW2wrMV0sbj1oW2wrMl07cltzXT00Mjc4MTkwMDgwfHQ7cltzKzFdPXQ+Pj4yNHxlPDw4fDQyNzgxOTAwODA7cltzKzJdPWU+Pj4xNnxuPDwxNnw0Mjc4MTkwMDgwO3JbcyszXT1uPj4+OHw0Mjc4MTkwMDgwfWZvcihsZXQgdD00Kmwsbj1lLmxlbmd0aDt0PG47dCs9MylyW3MrK109ZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnw0Mjc4MTkwMDgwfWVsc2V7Zm9yKDtsPGMtMjtsKz0zLHMrPTQpe2NvbnN0IHQ9aFtsXSxlPWhbbCsxXSxuPWhbbCsyXTtyW3NdPTI1NXx0O3JbcysxXT10PDwyNHxlPj4+OHwyNTU7cltzKzJdPWU8PDE2fG4+Pj4xNnwyNTU7cltzKzNdPW48PDh8MjU1fWZvcihsZXQgdD00Kmwsbj1lLmxlbmd0aDt0PG47dCs9MylyW3MrK109ZVt0XTw8MjR8ZVt0KzFdPDwxNnxlW3QrMl08PDh8MjU1fXJldHVybntzcmNQb3M6bixkZXN0UG9zOnN9fSh0KX1yZXR1cm4gbnVsbH07ZS5ncmF5VG9SR0JBPWZ1bmN0aW9uIGdyYXlUb1JHQkEodCxlKXtpZihpLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKWZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyllW25dPTY1NzkzKnRbbl18NDI3ODE5MDA4MDtlbHNlIGZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyllW25dPTE2ODQzMDA4KnRbbl18MjU1fTtuKDkzKTtuKDEwMSk7bigxMDIpO24oMTA1KTtuKDEwNyk7bigxMDkpO24oMTEzKTtuKDExNik7bigxMjMpO3ZhciBpPW4oMSk7ZnVuY3Rpb24gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEodCl7bGV0e3NyYzplLHNyY1BvczpuPTAsZGVzdDpyLHdpZHRoOnMsaGVpZ2h0OmEsbm9uQmxhY2tDb2xvcjpvPTQyOTQ5NjcyOTUsaW52ZXJzZURlY29kZTpsPSExfT10O2NvbnN0IGM9aS5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbj80Mjc4MTkwMDgwOjI1NSxbaCxkXT1sP1tvLGNdOltjLG9dLHU9cz4+MyxwPTcmcyxmPWUubGVuZ3RoO3I9bmV3IFVpbnQzMkFycmF5KHIuYnVmZmVyKTtsZXQgZz0wO2ZvcihsZXQgdD0wO3Q8YTt0Kyspe2Zvcihjb25zdCB0PW4rdTtuPHQ7bisrKXtjb25zdCB0PW48Zj9lW25dOjI1NTtyW2crK109MTI4JnQ/ZDpoO3JbZysrXT02NCZ0P2Q6aDtyW2crK109MzImdD9kOmg7cltnKytdPTE2JnQ/ZDpoO3JbZysrXT04JnQ/ZDpoO3JbZysrXT00JnQ/ZDpoO3JbZysrXT0yJnQ/ZDpoO3JbZysrXT0xJnQ/ZDpofWlmKDA9PT1wKWNvbnRpbnVlO2NvbnN0IHQ9bjxmP2VbbisrXToyNTU7Zm9yKGxldCBlPTA7ZTxwO2UrKylyW2crK109dCYxPDw3LWU/ZDpofXJldHVybntzcmNQb3M6bixkZXN0UG9zOmd9fX0sKHQsZSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuR2xvYmFsV29ya2VyT3B0aW9ucz12b2lkIDA7Y29uc3Qgbj1PYmplY3QuY3JlYXRlKG51bGwpO2UuR2xvYmFsV29ya2VyT3B0aW9ucz1uO24ud29ya2VyUG9ydD1udWxsO24ud29ya2VyU3JjPSIifSwodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLk1lc3NhZ2VIYW5kbGVyPXZvaWQgMDtuKDIpO3ZhciBpPW4oMSk7Y29uc3Qgcj0xLHM9MixhPTEsbz0yLGw9MyxjPTQsaD01LGQ9Nix1PTcscD04O2Z1bmN0aW9uIHdyYXBSZWFzb24odCl7dCBpbnN0YW5jZW9mIEVycm9yfHwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fHwoMCxpLnVucmVhY2hhYmxlKSgnd3JhcFJlYXNvbjogRXhwZWN0ZWQgInJlYXNvbiIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTtzd2l0Y2godC5uYW1lKXtjYXNlIkFib3J0RXhjZXB0aW9uIjpyZXR1cm4gbmV3IGkuQWJvcnRFeGNlcHRpb24odC5tZXNzYWdlKTtjYXNlIk1pc3NpbmdQREZFeGNlcHRpb24iOnJldHVybiBuZXcgaS5NaXNzaW5nUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7Y2FzZSJQYXNzd29yZEV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBpLlBhc3N3b3JkRXhjZXB0aW9uKHQubWVzc2FnZSx0LmNvZGUpO2Nhc2UiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjpyZXR1cm4gbmV3IGkuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHQubWVzc2FnZSx0LnN0YXR1cyk7Y2FzZSJVbmtub3duRXJyb3JFeGNlcHRpb24iOnJldHVybiBuZXcgaS5Vbmtub3duRXJyb3JFeGNlcHRpb24odC5tZXNzYWdlLHQuZGV0YWlscyk7ZGVmYXVsdDpyZXR1cm4gbmV3IGkuVW5rbm93bkVycm9yRXhjZXB0aW9uKHQubWVzc2FnZSx0LnRvU3RyaW5nKCkpfX1lLk1lc3NhZ2VIYW5kbGVyPWNsYXNzIE1lc3NhZ2VIYW5kbGVye2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLnNvdXJjZU5hbWU9dDt0aGlzLnRhcmdldE5hbWU9ZTt0aGlzLmNvbU9iaj1uO3RoaXMuY2FsbGJhY2tJZD0xO3RoaXMuc3RyZWFtSWQ9MTt0aGlzLnN0cmVhbVNpbmtzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5zdHJlYW1Db250cm9sbGVycz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmFjdGlvbkhhbmRsZXI9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLl9vbkNvbU9iak9uTWVzc2FnZT10PT57Y29uc3QgZT10LmRhdGE7aWYoZS50YXJnZXROYW1lIT09dGhpcy5zb3VyY2VOYW1lKXJldHVybjtpZihlLnN0cmVhbSl7dGhpcy4jJHQoZSk7cmV0dXJufWlmKGUuY2FsbGJhY2spe2NvbnN0IHQ9ZS5jYWxsYmFja0lkLG49dGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1t0XTtpZighbil0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGNhbGxiYWNrICR7dH1gKTtkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1t0XTtpZihlLmNhbGxiYWNrPT09ciluLnJlc29sdmUoZS5kYXRhKTtlbHNle2lmKGUuY2FsbGJhY2shPT1zKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBjYWxsYmFjayBjYXNlIik7bi5yZWplY3Qod3JhcFJlYXNvbihlLnJlYXNvbikpfXJldHVybn1jb25zdCBpPXRoaXMuYWN0aW9uSGFuZGxlcltlLmFjdGlvbl07aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtlLmFjdGlvbn1gKTtpZihlLmNhbGxiYWNrSWQpe2NvbnN0IHQ9dGhpcy5zb3VyY2VOYW1lLGE9ZS5zb3VyY2VOYW1lO25ldyBQcm9taXNlKChmdW5jdGlvbih0KXt0KGkoZS5kYXRhKSl9KSkudGhlbigoZnVuY3Rpb24oaSl7bi5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTp0LHRhcmdldE5hbWU6YSxjYWxsYmFjazpyLGNhbGxiYWNrSWQ6ZS5jYWxsYmFja0lkLGRhdGE6aX0pfSksKGZ1bmN0aW9uKGkpe24ucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6dCx0YXJnZXROYW1lOmEsY2FsbGJhY2s6cyxjYWxsYmFja0lkOmUuY2FsbGJhY2tJZCxyZWFzb246d3JhcFJlYXNvbihpKX0pfSkpfWVsc2UgZS5zdHJlYW1JZD90aGlzLiNYdChlKTppKGUuZGF0YSl9O24uYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpfW9uKHQsZSl7Y29uc3Qgbj10aGlzLmFjdGlvbkhhbmRsZXI7aWYoblt0XSl0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgIiR7dH0iYCk7blt0XT1lfXNlbmQodCxlLG4pe3RoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnRoaXMuc291cmNlTmFtZSx0YXJnZXROYW1lOnRoaXMudGFyZ2V0TmFtZSxhY3Rpb246dCxkYXRhOmV9LG4pfXNlbmRXaXRoUHJvbWlzZSh0LGUsbil7Y29uc3Qgcj10aGlzLmNhbGxiYWNrSWQrKyxzPW5ldyBpLlByb21pc2VDYXBhYmlsaXR5O3RoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbcl09czt0cnl7dGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6dGhpcy5zb3VyY2VOYW1lLHRhcmdldE5hbWU6dGhpcy50YXJnZXROYW1lLGFjdGlvbjp0LGNhbGxiYWNrSWQ6cixkYXRhOmV9LG4pfWNhdGNoKHQpe3MucmVqZWN0KHQpfXJldHVybiBzLnByb21pc2V9c2VuZFdpdGhTdHJlYW0odCxlLG4scil7Y29uc3Qgcz10aGlzLnN0cmVhbUlkKyssbz10aGlzLnNvdXJjZU5hbWUsbD10aGlzLnRhcmdldE5hbWUsYz10aGlzLmNvbU9iajtyZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtzdGFydDpuPT57Y29uc3QgYT1uZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3NdPXtjb250cm9sbGVyOm4sc3RhcnRDYWxsOmEscHVsbENhbGw6bnVsbCxjYW5jZWxDYWxsOm51bGwsaXNDbG9zZWQ6ITF9O2MucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6byx0YXJnZXROYW1lOmwsYWN0aW9uOnQsc3RyZWFtSWQ6cyxkYXRhOmUsZGVzaXJlZFNpemU6bi5kZXNpcmVkU2l6ZX0scik7cmV0dXJuIGEucHJvbWlzZX0scHVsbDp0PT57Y29uc3QgZT1uZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3NdLnB1bGxDYWxsPWU7Yy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpvLHRhcmdldE5hbWU6bCxzdHJlYW06ZCxzdHJlYW1JZDpzLGRlc2lyZWRTaXplOnQuZGVzaXJlZFNpemV9KTtyZXR1cm4gZS5wcm9taXNlfSxjYW5jZWw6dD0+eygwLGkuYXNzZXJ0KSh0IGluc3RhbmNlb2YgRXJyb3IsImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTtjb25zdCBlPW5ldyBpLlByb21pc2VDYXBhYmlsaXR5O3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbc10uY2FuY2VsQ2FsbD1lO3RoaXMuc3RyZWFtQ29udHJvbGxlcnNbc10uaXNDbG9zZWQ9ITA7Yy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpvLHRhcmdldE5hbWU6bCxzdHJlYW06YSxzdHJlYW1JZDpzLHJlYXNvbjp3cmFwUmVhc29uKHQpfSk7cmV0dXJuIGUucHJvbWlzZX19LG4pfSNYdCh0KXtjb25zdCBlPXQuc3RyZWFtSWQsbj10aGlzLnNvdXJjZU5hbWUscj10LnNvdXJjZU5hbWUscz10aGlzLmNvbU9iaixhPXRoaXMsbz10aGlzLmFjdGlvbkhhbmRsZXJbdC5hY3Rpb25dLGQ9e2VucXVldWUodCl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjEsbz1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZih0aGlzLmlzQ2FuY2VsbGVkKXJldHVybjtjb25zdCBsPXRoaXMuZGVzaXJlZFNpemU7dGhpcy5kZXNpcmVkU2l6ZS09YTtpZihsPjAmJnRoaXMuZGVzaXJlZFNpemU8PTApe3RoaXMuc2lua0NhcGFiaWxpdHk9bmV3IGkuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy5yZWFkeT10aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2V9cy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpuLHRhcmdldE5hbWU6cixzdHJlYW06YyxzdHJlYW1JZDplLGNodW5rOnR9LG8pfSxjbG9zZSgpe2lmKCF0aGlzLmlzQ2FuY2VsbGVkKXt0aGlzLmlzQ2FuY2VsbGVkPSEwO3MucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6bix0YXJnZXROYW1lOnIsc3RyZWFtOmwsc3RyZWFtSWQ6ZX0pO2RlbGV0ZSBhLnN0cmVhbVNpbmtzW2VdfX0sZXJyb3IodCl7KDAsaS5hc3NlcnQpKHQgaW5zdGFuY2VvZiBFcnJvciwiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7aWYoIXRoaXMuaXNDYW5jZWxsZWQpe3RoaXMuaXNDYW5jZWxsZWQ9ITA7cy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpuLHRhcmdldE5hbWU6cixzdHJlYW06aCxzdHJlYW1JZDplLHJlYXNvbjp3cmFwUmVhc29uKHQpfSl9fSxzaW5rQ2FwYWJpbGl0eTpuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSxvblB1bGw6bnVsbCxvbkNhbmNlbDpudWxsLGlzQ2FuY2VsbGVkOiExLGRlc2lyZWRTaXplOnQuZGVzaXJlZFNpemUscmVhZHk6bnVsbH07ZC5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7ZC5yZWFkeT1kLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7dGhpcy5zdHJlYW1TaW5rc1tlXT1kO25ldyBQcm9taXNlKChmdW5jdGlvbihlKXtlKG8odC5kYXRhLGQpKX0pKS50aGVuKChmdW5jdGlvbigpe3MucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6bix0YXJnZXROYW1lOnIsc3RyZWFtOnAsc3RyZWFtSWQ6ZSxzdWNjZXNzOiEwfSl9KSwoZnVuY3Rpb24odCl7cy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpuLHRhcmdldE5hbWU6cixzdHJlYW06cCxzdHJlYW1JZDplLHJlYXNvbjp3cmFwUmVhc29uKHQpfSl9KSl9IyR0KHQpe2NvbnN0IGU9dC5zdHJlYW1JZCxuPXRoaXMuc291cmNlTmFtZSxyPXQuc291cmNlTmFtZSxzPXRoaXMuY29tT2JqLGY9dGhpcy5zdHJlYW1Db250cm9sbGVyc1tlXSxnPXRoaXMuc3RyZWFtU2lua3NbZV07c3dpdGNoKHQuc3RyZWFtKXtjYXNlIHA6dC5zdWNjZXNzP2Yuc3RhcnRDYWxsLnJlc29sdmUoKTpmLnN0YXJ0Q2FsbC5yZWplY3Qod3JhcFJlYXNvbih0LnJlYXNvbikpO2JyZWFrO2Nhc2UgdTp0LnN1Y2Nlc3M/Zi5wdWxsQ2FsbC5yZXNvbHZlKCk6Zi5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbih0LnJlYXNvbikpO2JyZWFrO2Nhc2UgZDppZighZyl7cy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpuLHRhcmdldE5hbWU6cixzdHJlYW06dSxzdHJlYW1JZDplLHN1Y2Nlc3M6ITB9KTticmVha31nLmRlc2lyZWRTaXplPD0wJiZ0LmRlc2lyZWRTaXplPjAmJmcuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO2cuZGVzaXJlZFNpemU9dC5kZXNpcmVkU2l6ZTtuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCl7dChnLm9uUHVsbD8uKCkpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7cy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpuLHRhcmdldE5hbWU6cixzdHJlYW06dSxzdHJlYW1JZDplLHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbih0KXtzLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOm4sdGFyZ2V0TmFtZTpyLHN0cmVhbTp1LHN0cmVhbUlkOmUscmVhc29uOndyYXBSZWFzb24odCl9KX0pKTticmVhaztjYXNlIGM6KDAsaS5hc3NlcnQpKGYsImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTtpZihmLmlzQ2xvc2VkKWJyZWFrO2YuY29udHJvbGxlci5lbnF1ZXVlKHQuY2h1bmspO2JyZWFrO2Nhc2UgbDooMCxpLmFzc2VydCkoZiwiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTtpZihmLmlzQ2xvc2VkKWJyZWFrO2YuaXNDbG9zZWQ9ITA7Zi5jb250cm9sbGVyLmNsb3NlKCk7dGhpcy4jS3QoZixlKTticmVhaztjYXNlIGg6KDAsaS5hc3NlcnQpKGYsImVycm9yIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7Zi5jb250cm9sbGVyLmVycm9yKHdyYXBSZWFzb24odC5yZWFzb24pKTt0aGlzLiNLdChmLGUpO2JyZWFrO2Nhc2Ugbzp0LnN1Y2Nlc3M/Zi5jYW5jZWxDYWxsLnJlc29sdmUoKTpmLmNhbmNlbENhbGwucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTt0aGlzLiNLdChmLGUpO2JyZWFrO2Nhc2UgYTppZighZylicmVhaztuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7ZShnLm9uQ2FuY2VsPy4od3JhcFJlYXNvbih0LnJlYXNvbikpKX0pKS50aGVuKChmdW5jdGlvbigpe3MucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6bix0YXJnZXROYW1lOnIsc3RyZWFtOm8sc3RyZWFtSWQ6ZSxzdWNjZXNzOiEwfSl9KSwoZnVuY3Rpb24odCl7cy5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpuLHRhcmdldE5hbWU6cixzdHJlYW06byxzdHJlYW1JZDplLHJlYXNvbjp3cmFwUmVhc29uKHQpfSl9KSk7Zy5zaW5rQ2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbih0LnJlYXNvbikpO2cuaXNDYW5jZWxsZWQ9ITA7ZGVsZXRlIHRoaXMuc3RyZWFtU2lua3NbZV07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2UiKX19YXN5bmMjS3QodCxlKXthd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3Quc3RhcnRDYWxsPy5wcm9taXNlLHQucHVsbENhbGw/LnByb21pc2UsdC5jYW5jZWxDYWxsPy5wcm9taXNlXSk7ZGVsZXRlIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbZV19ZGVzdHJveSgpe3RoaXMuY29tT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKX19fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLk1ldGFkYXRhPXZvaWQgMDt2YXIgaT1uKDEpO2UuTWV0YWRhdGE9Y2xhc3MgTWV0YWRhdGF7I1l0OyNKdDtjb25zdHJ1Y3Rvcih0KXtsZXR7cGFyc2VkRGF0YTplLHJhd0RhdGE6bn09dDt0aGlzLiNZdD1lO3RoaXMuI0p0PW59Z2V0UmF3KCl7cmV0dXJuIHRoaXMuI0p0fWdldCh0KXtyZXR1cm4gdGhpcy4jWXQuZ2V0KHQpPz9udWxsfWdldEFsbCgpe3JldHVybigwLGkub2JqZWN0RnJvbU1hcCkodGhpcy4jWXQpfWhhcyh0KXtyZXR1cm4gdGhpcy4jWXQuaGFzKHQpfX19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuT3B0aW9uYWxDb250ZW50Q29uZmlnPXZvaWQgMDt2YXIgaT1uKDEpLHI9bigxNjkpO2NvbnN0IHM9U3ltYm9sKCJJTlRFUk5BTCIpO2NsYXNzIE9wdGlvbmFsQ29udGVudEdyb3VweyNRdD0hMDtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMubmFtZT10O3RoaXMuaW50ZW50PWV9Z2V0IHZpc2libGUoKXtyZXR1cm4gdGhpcy4jUXR9X3NldFZpc2libGUodCxlKXt0IT09cyYmKDAsaS51bnJlYWNoYWJsZSkoIkludGVybmFsIG1ldGhvZCBgX3NldFZpc2libGVgIGNhbGxlZC4iKTt0aGlzLiNRdD1lfX1lLk9wdGlvbmFsQ29udGVudENvbmZpZz1jbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWd7I1p0PW51bGw7I3RlPW5ldyBNYXA7I2VlPW51bGw7I25lPW51bGw7Y29uc3RydWN0b3IodCl7dGhpcy5uYW1lPW51bGw7dGhpcy5jcmVhdG9yPW51bGw7aWYobnVsbCE9PXQpe3RoaXMubmFtZT10Lm5hbWU7dGhpcy5jcmVhdG9yPXQuY3JlYXRvcjt0aGlzLiNuZT10Lm9yZGVyO2Zvcihjb25zdCBlIG9mIHQuZ3JvdXBzKXRoaXMuI3RlLnNldChlLmlkLG5ldyBPcHRpb25hbENvbnRlbnRHcm91cChlLm5hbWUsZS5pbnRlbnQpKTtpZigiT0ZGIj09PXQuYmFzZVN0YXRlKWZvcihjb25zdCB0IG9mIHRoaXMuI3RlLnZhbHVlcygpKXQuX3NldFZpc2libGUocywhMSk7Zm9yKGNvbnN0IGUgb2YgdC5vbil0aGlzLiN0ZS5nZXQoZSkuX3NldFZpc2libGUocywhMCk7Zm9yKGNvbnN0IGUgb2YgdC5vZmYpdGhpcy4jdGUuZ2V0KGUpLl9zZXRWaXNpYmxlKHMsITEpO3RoaXMuI2VlPXRoaXMuZ2V0SGFzaCgpfX0jaWUodCl7Y29uc3QgZT10Lmxlbmd0aDtpZihlPDIpcmV0dXJuITA7Y29uc3Qgbj10WzBdO2ZvcihsZXQgcj0xO3I8ZTtyKyspe2NvbnN0IGU9dFtyXTtsZXQgcztpZihBcnJheS5pc0FycmF5KGUpKXM9dGhpcy4jaWUoZSk7ZWxzZXtpZighdGhpcy4jdGUuaGFzKGUpKXsoMCxpLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtlfWApO3JldHVybiEwfXM9dGhpcy4jdGUuZ2V0KGUpLnZpc2libGV9c3dpdGNoKG4pe2Nhc2UiQW5kIjppZighcylyZXR1cm4hMTticmVhaztjYXNlIk9yIjppZihzKXJldHVybiEwO2JyZWFrO2Nhc2UiTm90IjpyZXR1cm4hcztkZWZhdWx0OnJldHVybiEwfX1yZXR1cm4iQW5kIj09PW59aXNWaXNpYmxlKHQpe2lmKDA9PT10aGlzLiN0ZS5zaXplKXJldHVybiEwO2lmKCF0KXsoMCxpLndhcm4pKCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBkZWZpbmVkLiIpO3JldHVybiEwfWlmKCJPQ0ciPT09dC50eXBlKXtpZighdGhpcy4jdGUuaGFzKHQuaWQpKXsoMCxpLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHt0LmlkfWApO3JldHVybiEwfXJldHVybiB0aGlzLiN0ZS5nZXQodC5pZCkudmlzaWJsZX1pZigiT0NNRCI9PT10LnR5cGUpe2lmKHQuZXhwcmVzc2lvbilyZXR1cm4gdGhpcy4jaWUodC5leHByZXNzaW9uKTtpZighdC5wb2xpY3l8fCJBbnlPbiI9PT10LnBvbGljeSl7Zm9yKGNvbnN0IGUgb2YgdC5pZHMpe2lmKCF0aGlzLiN0ZS5oYXMoZSkpeygwLGkud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2V9YCk7cmV0dXJuITB9aWYodGhpcy4jdGUuZ2V0KGUpLnZpc2libGUpcmV0dXJuITB9cmV0dXJuITF9aWYoIkFsbE9uIj09PXQucG9saWN5KXtmb3IoY29uc3QgZSBvZiB0Lmlkcyl7aWYoIXRoaXMuI3RlLmhhcyhlKSl7KDAsaS53YXJuKShgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7ZX1gKTtyZXR1cm4hMH1pZighdGhpcy4jdGUuZ2V0KGUpLnZpc2libGUpcmV0dXJuITF9cmV0dXJuITB9aWYoIkFueU9mZiI9PT10LnBvbGljeSl7Zm9yKGNvbnN0IGUgb2YgdC5pZHMpe2lmKCF0aGlzLiN0ZS5oYXMoZSkpeygwLGkud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2V9YCk7cmV0dXJuITB9aWYoIXRoaXMuI3RlLmdldChlKS52aXNpYmxlKXJldHVybiEwfXJldHVybiExfWlmKCJBbGxPZmYiPT09dC5wb2xpY3kpe2Zvcihjb25zdCBlIG9mIHQuaWRzKXtpZighdGhpcy4jdGUuaGFzKGUpKXsoMCxpLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtlfWApO3JldHVybiEwfWlmKHRoaXMuI3RlLmdldChlKS52aXNpYmxlKXJldHVybiExfXJldHVybiEwfSgwLGkud2FybikoYFVua25vd24gb3B0aW9uYWwgY29udGVudCBwb2xpY3kgJHt0LnBvbGljeX0uYCk7cmV0dXJuITB9KDAsaS53YXJuKShgVW5rbm93biBncm91cCB0eXBlICR7dC50eXBlfS5gKTtyZXR1cm4hMH1zZXRWaXNpYmlsaXR5KHQpe2xldCBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYodGhpcy4jdGUuaGFzKHQpKXt0aGlzLiN0ZS5nZXQodCkuX3NldFZpc2libGUocywhIWUpO3RoaXMuI1p0PW51bGx9ZWxzZSgwLGkud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke3R9YCl9Z2V0IGhhc0luaXRpYWxWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuZ2V0SGFzaCgpPT09dGhpcy4jZWV9Z2V0T3JkZXIoKXtyZXR1cm4gdGhpcy4jdGUuc2l6ZT90aGlzLiNuZT90aGlzLiNuZS5zbGljZSgpOlsuLi50aGlzLiN0ZS5rZXlzKCldOm51bGx9Z2V0R3JvdXBzKCl7cmV0dXJuIHRoaXMuI3RlLnNpemU+MD8oMCxpLm9iamVjdEZyb21NYXApKHRoaXMuI3RlKTpudWxsfWdldEdyb3VwKHQpe3JldHVybiB0aGlzLiN0ZS5nZXQodCl8fG51bGx9Z2V0SGFzaCgpe2lmKG51bGwhPT10aGlzLiNadClyZXR1cm4gdGhpcy4jWnQ7Y29uc3QgdD1uZXcgci5NdXJtdXJIYXNoM182NDtmb3IoY29uc3RbZSxuXW9mIHRoaXMuI3RlKXQudXBkYXRlKGAke2V9OiR7bi52aXNpYmxlfWApO3JldHVybiB0aGlzLiNadD10LmhleGRpZ2VzdCgpfX19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuUERGRGF0YVRyYW5zcG9ydFN0cmVhbT12b2lkIDA7big5Myk7bigxMDEpO24oMTAyKTtuKDEwNSk7bigxMDcpO24oMTA5KTtuKDExMyk7bigxMTYpO24oMTIzKTtuKDg5KTt2YXIgaT1uKDEpLHI9bigxNjcpO2UuUERGRGF0YVRyYW5zcG9ydFN0cmVhbT1jbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFte2NvbnN0cnVjdG9yKHQsZSl7bGV0e2xlbmd0aDpuLGluaXRpYWxEYXRhOnIscHJvZ3Jlc3NpdmVEb25lOnM9ITEsY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6YT1udWxsLGRpc2FibGVSYW5nZTpvPSExLGRpc2FibGVTdHJlYW06bD0hMX09dDsoMCxpLmFzc2VydCkoZSwnUERGRGF0YVRyYW5zcG9ydFN0cmVhbSAtIG1pc3NpbmcgcmVxdWlyZWQgInBkZkRhdGFSYW5nZVRyYW5zcG9ydCIgYXJndW1lbnQuJyk7dGhpcy5fcXVldWVkQ2h1bmtzPVtdO3RoaXMuX3Byb2dyZXNzaXZlRG9uZT1zO3RoaXMuX2NvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lPWE7aWYocj8ubGVuZ3RoPjApe2NvbnN0IHQ9ciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJnIuYnl0ZUxlbmd0aD09PXIuYnVmZmVyLmJ5dGVMZW5ndGg/ci5idWZmZXI6bmV3IFVpbnQ4QXJyYXkocikuYnVmZmVyO3RoaXMuX3F1ZXVlZENodW5rcy5wdXNoKHQpfXRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydD1lO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSFsO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9IW87dGhpcy5fY29udGVudExlbmd0aD1uO3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPW51bGw7dGhpcy5fcmFuZ2VSZWFkZXJzPVtdO3RoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRSYW5nZUxpc3RlbmVyKCgodCxlKT0+e3RoaXMuX29uUmVjZWl2ZURhdGEoe2JlZ2luOnQsY2h1bms6ZX0pfSkpO3RoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc0xpc3RlbmVyKCgodCxlKT0+e3RoaXMuX29uUHJvZ3Jlc3Moe2xvYWRlZDp0LHRvdGFsOmV9KX0pKTt0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIoKHQ9Pnt0aGlzLl9vblJlY2VpdmVEYXRhKHtjaHVuazp0fSl9KSk7dGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKCgoKT0+e3RoaXMuX29uUHJvZ3Jlc3NpdmVEb25lKCl9KSk7dGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnRyYW5zcG9ydFJlYWR5KCl9X29uUmVjZWl2ZURhdGEodCl7bGV0e2JlZ2luOmUsY2h1bms6bn09dDtjb25zdCByPW4gaW5zdGFuY2VvZiBVaW50OEFycmF5JiZuLmJ5dGVMZW5ndGg9PT1uLmJ1ZmZlci5ieXRlTGVuZ3RoP24uYnVmZmVyOm5ldyBVaW50OEFycmF5KG4pLmJ1ZmZlcjtpZih2b2lkIDA9PT1lKXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyP3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9lbnF1ZXVlKHIpOnRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKHIpO2Vsc2V7Y29uc3QgdD10aGlzLl9yYW5nZVJlYWRlcnMuc29tZSgoZnVuY3Rpb24odCl7aWYodC5fYmVnaW4hPT1lKXJldHVybiExO3QuX2VucXVldWUocik7cmV0dXJuITB9KSk7KDAsaS5hc3NlcnQpKHQsIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuIil9fWdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5fbG9hZGVkPz8wfV9vblByb2dyZXNzKHQpe3ZvaWQgMD09PXQudG90YWw/dGhpcy5fcmFuZ2VSZWFkZXJzWzBdPy5vblByb2dyZXNzPy4oe2xvYWRlZDp0LmxvYWRlZH0pOnRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5vblByb2dyZXNzPy4oe2xvYWRlZDp0LmxvYWRlZCx0b3RhbDp0LnRvdGFsfSl9X29uUHJvZ3Jlc3NpdmVEb25lKCl7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LnByb2dyZXNzaXZlRG9uZSgpO3RoaXMuX3Byb2dyZXNzaXZlRG9uZT0hMH1fcmVtb3ZlUmFuZ2VSZWFkZXIodCl7Y29uc3QgZT10aGlzLl9yYW5nZVJlYWRlcnMuaW5kZXhPZih0KTtlPj0wJiZ0aGlzLl9yYW5nZVJlYWRlcnMuc3BsaWNlKGUsMSl9Z2V0RnVsbFJlYWRlcigpeygwLGkuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIlBERkRhdGFUcmFuc3BvcnRTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTtjb25zdCB0PXRoaXMuX3F1ZXVlZENodW5rczt0aGlzLl9xdWV1ZWRDaHVua3M9bnVsbDtyZXR1cm4gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIodGhpcyx0LHRoaXMuX3Byb2dyZXNzaXZlRG9uZSx0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSl9Z2V0UmFuZ2VSZWFkZXIodCxlKXtpZihlPD10aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpcmV0dXJuIG51bGw7Y29uc3Qgbj1uZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsdCxlKTt0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZSh0LGUpO3RoaXMuX3JhbmdlUmVhZGVycy5wdXNoKG4pO3JldHVybiBufWNhbmNlbEFsbFJlcXVlc3RzKHQpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwodCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fcmFuZ2VSZWFkZXJzLnNsaWNlKDApKWUuY2FuY2VsKHQpO3RoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hYm9ydCgpfX07Y2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlcntjb25zdHJ1Y3Rvcih0LGUpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0saT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDt0aGlzLl9zdHJlYW09dDt0aGlzLl9kb25lPW58fCExO3RoaXMuX2ZpbGVuYW1lPSgwLHIuaXNQZGZGaWxlKShpKT9pOm51bGw7dGhpcy5fcXVldWVkQ2h1bmtzPWV8fFtdO3RoaXMuX2xvYWRlZD0wO2Zvcihjb25zdCB0IG9mIHRoaXMuX3F1ZXVlZENodW5rcyl0aGlzLl9sb2FkZWQrPXQuYnl0ZUxlbmd0aDt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9oZWFkZXJzUmVhZHk9UHJvbWlzZS5yZXNvbHZlKCk7dC5fZnVsbFJlcXVlc3RSZWFkZXI9dGhpczt0aGlzLm9uUHJvZ3Jlc3M9bnVsbH1fZW5xdWV1ZSh0KXtpZighdGhpcy5fZG9uZSl7aWYodGhpcy5fcmVxdWVzdHMubGVuZ3RoPjApe3RoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7dmFsdWU6dCxkb25lOiExfSl9ZWxzZSB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaCh0KTt0aGlzLl9sb2FkZWQrPXQuYnl0ZUxlbmd0aH19Z2V0IGhlYWRlcnNSZWFkeSgpe3JldHVybiB0aGlzLl9oZWFkZXJzUmVhZHl9Z2V0IGZpbGVuYW1lKCl7cmV0dXJuIHRoaXMuX2ZpbGVuYW1lfWdldCBpc1JhbmdlU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX3N0cmVhbS5faXNSYW5nZVN1cHBvcnRlZH1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZH1nZXQgY29udGVudExlbmd0aCgpe3JldHVybiB0aGlzLl9zdHJlYW0uX2NvbnRlbnRMZW5ndGh9YXN5bmMgcmVhZCgpe2lmKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGg+MCl7cmV0dXJue3ZhbHVlOnRoaXMuX3F1ZXVlZENodW5rcy5zaGlmdCgpLGRvbmU6ITF9fWlmKHRoaXMuX2RvbmUpcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfTtjb25zdCB0PW5ldyBpLlByb21pc2VDYXBhYmlsaXR5O3RoaXMuX3JlcXVlc3RzLnB1c2godCk7cmV0dXJuIHQucHJvbWlzZX1jYW5jZWwodCl7dGhpcy5fZG9uZT0hMDtmb3IoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cyl0LnJlc29sdmUoe3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk7dGhpcy5fcmVxdWVzdHMubGVuZ3RoPTB9cHJvZ3Jlc3NpdmVEb25lKCl7dGhpcy5fZG9uZXx8KHRoaXMuX2RvbmU9ITApfX1jbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXJ7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX3N0cmVhbT10O3RoaXMuX2JlZ2luPWU7dGhpcy5fZW5kPW47dGhpcy5fcXVldWVkQ2h1bms9bnVsbDt0aGlzLl9yZXF1ZXN0cz1bXTt0aGlzLl9kb25lPSExO3RoaXMub25Qcm9ncmVzcz1udWxsfV9lbnF1ZXVlKHQpe2lmKCF0aGlzLl9kb25lKXtpZigwPT09dGhpcy5fcmVxdWVzdHMubGVuZ3RoKXRoaXMuX3F1ZXVlZENodW5rPXQ7ZWxzZXt0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpLnJlc29sdmUoe3ZhbHVlOnQsZG9uZTohMX0pO2Zvcihjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKXQucmVzb2x2ZSh7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KTt0aGlzLl9yZXF1ZXN0cy5sZW5ndGg9MH10aGlzLl9kb25lPSEwO3RoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyl9fWdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpe3JldHVybiExfWFzeW5jIHJlYWQoKXtpZih0aGlzLl9xdWV1ZWRDaHVuayl7Y29uc3QgdD10aGlzLl9xdWV1ZWRDaHVuazt0aGlzLl9xdWV1ZWRDaHVuaz1udWxsO3JldHVybnt2YWx1ZTp0LGRvbmU6ITF9fWlmKHRoaXMuX2RvbmUpcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfTtjb25zdCB0PW5ldyBpLlByb21pc2VDYXBhYmlsaXR5O3RoaXMuX3JlcXVlc3RzLnB1c2godCk7cmV0dXJuIHQucHJvbWlzZX1jYW5jZWwodCl7dGhpcy5fZG9uZT0hMDtmb3IoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cyl0LnJlc29sdmUoe3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk7dGhpcy5fcmVxdWVzdHMubGVuZ3RoPTA7dGhpcy5fc3RyZWFtLl9yZW1vdmVSYW5nZVJlYWRlcih0aGlzKX19fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLlBERkZldGNoU3RyZWFtPXZvaWQgMDtuKDkzKTtuKDEwMSk7bigxMDIpO24oMTA1KTtuKDEwNyk7bigxMDkpO24oMTEzKTtuKDExNik7bigxMjMpO24oODkpO3ZhciBpPW4oMSkscj1uKDE4MSk7ZnVuY3Rpb24gY3JlYXRlRmV0Y2hPcHRpb25zKHQsZSxuKXtyZXR1cm57bWV0aG9kOiJHRVQiLGhlYWRlcnM6dCxzaWduYWw6bi5zaWduYWwsbW9kZToiY29ycyIsY3JlZGVudGlhbHM6ZT8iaW5jbHVkZSI6InNhbWUtb3JpZ2luIixyZWRpcmVjdDoiZm9sbG93In19ZnVuY3Rpb24gY3JlYXRlSGVhZGVycyh0KXtjb25zdCBlPW5ldyBIZWFkZXJzO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IGk9dFtuXTt2b2lkIDAhPT1pJiZlLmFwcGVuZChuLGkpfXJldHVybiBlfWZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKHQpe2lmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiB0LmJ1ZmZlcjtpZih0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcmV0dXJuIHQ7KDAsaS53YXJuKShgZ2V0QXJyYXlCdWZmZXIgLSB1bmV4cGVjdGVkIGRhdGEgZm9ybWF0OiAke3R9YCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KHQpLmJ1ZmZlcn1lLlBERkZldGNoU3RyZWFtPWNsYXNzIFBERkZldGNoU3RyZWFte2NvbnN0cnVjdG9yKHQpe3RoaXMuc291cmNlPXQ7dGhpcy5pc0h0dHA9L15odHRwcz86L2kudGVzdCh0LnVybCk7dGhpcy5odHRwSGVhZGVycz10aGlzLmlzSHR0cCYmdC5odHRwSGVhZGVyc3x8e307dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbDt0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzPVtdfWdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5fbG9hZGVkPz8wfWdldEZ1bGxSZWFkZXIoKXsoMCxpLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCJQREZGZXRjaFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpO3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPW5ldyBQREZGZXRjaFN0cmVhbVJlYWRlcih0aGlzKTtyZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXJ9Z2V0UmFuZ2VSZWFkZXIodCxlKXtpZihlPD10aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpcmV0dXJuIG51bGw7Y29uc3Qgbj1uZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLHQsZSk7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKG4pO3JldHVybiBufWNhbmNlbEFsbFJlcXVlc3RzKHQpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwodCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSllLmNhbmNlbCh0KX19O2NsYXNzIFBERkZldGNoU3RyZWFtUmVhZGVye2NvbnN0cnVjdG9yKHQpe3RoaXMuX3N0cmVhbT10O3RoaXMuX3JlYWRlcj1udWxsO3RoaXMuX2xvYWRlZD0wO3RoaXMuX2ZpbGVuYW1lPW51bGw7Y29uc3QgZT10LnNvdXJjZTt0aGlzLl93aXRoQ3JlZGVudGlhbHM9ZS53aXRoQ3JlZGVudGlhbHN8fCExO3RoaXMuX2NvbnRlbnRMZW5ndGg9ZS5sZW5ndGg7dGhpcy5faGVhZGVyc0NhcGFiaWxpdHk9bmV3IGkuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy5fZGlzYWJsZVJhbmdlPWUuZGlzYWJsZVJhbmdlfHwhMTt0aGlzLl9yYW5nZUNodW5rU2l6ZT1lLnJhbmdlQ2h1bmtTaXplO3RoaXMuX3JhbmdlQ2h1bmtTaXplfHx0aGlzLl9kaXNhYmxlUmFuZ2V8fCh0aGlzLl9kaXNhYmxlUmFuZ2U9ITApO3RoaXMuX2Fib3J0Q29udHJvbGxlcj1uZXcgQWJvcnRDb250cm9sbGVyO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSFlLmRpc2FibGVTdHJlYW07dGhpcy5faXNSYW5nZVN1cHBvcnRlZD0hZS5kaXNhYmxlUmFuZ2U7dGhpcy5faGVhZGVycz1jcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7Y29uc3Qgbj1lLnVybDtmZXRjaChuLGNyZWF0ZUZldGNoT3B0aW9ucyh0aGlzLl9oZWFkZXJzLHRoaXMuX3dpdGhDcmVkZW50aWFscyx0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKCh0PT57aWYoISgwLHIudmFsaWRhdGVSZXNwb25zZVN0YXR1cykodC5zdGF0dXMpKXRocm93KDAsci5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKSh0LnN0YXR1cyxuKTt0aGlzLl9yZWFkZXI9dC5ib2R5LmdldFJlYWRlcigpO3RoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtjb25zdCBnZXRSZXNwb25zZUhlYWRlcj1lPT50LmhlYWRlcnMuZ2V0KGUpLHthbGxvd1JhbmdlUmVxdWVzdHM6ZSxzdWdnZXN0ZWRMZW5ndGg6c309KDAsci52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe2dldFJlc3BvbnNlSGVhZGVyOmdldFJlc3BvbnNlSGVhZGVyLGlzSHR0cDp0aGlzLl9zdHJlYW0uaXNIdHRwLHJhbmdlQ2h1bmtTaXplOnRoaXMuX3JhbmdlQ2h1bmtTaXplLGRpc2FibGVSYW5nZTp0aGlzLl9kaXNhYmxlUmFuZ2V9KTt0aGlzLl9pc1JhbmdlU3VwcG9ydGVkPWU7dGhpcy5fY29udGVudExlbmd0aD1zfHx0aGlzLl9jb250ZW50TGVuZ3RoO3RoaXMuX2ZpbGVuYW1lPSgwLHIuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoZ2V0UmVzcG9uc2VIZWFkZXIpOyF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCYmdGhpcy5faXNSYW5nZVN1cHBvcnRlZCYmdGhpcy5jYW5jZWwobmV3IGkuQWJvcnRFeGNlcHRpb24oIlN0cmVhbWluZyBpcyBkaXNhYmxlZC4iKSl9KSkuY2F0Y2godGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KTt0aGlzLm9uUHJvZ3Jlc3M9bnVsbH1nZXQgaGVhZGVyc1JlYWR5KCl7cmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2V9Z2V0IGZpbGVuYW1lKCl7cmV0dXJuIHRoaXMuX2ZpbGVuYW1lfWdldCBjb250ZW50TGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGh9Z2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZH1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWR9YXN5bmMgcmVhZCgpe2F3YWl0IHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7Y29uc3R7dmFsdWU6dCxkb25lOmV9PWF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7aWYoZSlyZXR1cm57dmFsdWU6dCxkb25lOmV9O3RoaXMuX2xvYWRlZCs9dC5ieXRlTGVuZ3RoO3RoaXMub25Qcm9ncmVzcz8uKHtsb2FkZWQ6dGhpcy5fbG9hZGVkLHRvdGFsOnRoaXMuX2NvbnRlbnRMZW5ndGh9KTtyZXR1cm57dmFsdWU6Z2V0QXJyYXlCdWZmZXIodCksZG9uZTohMX19Y2FuY2VsKHQpe3RoaXMuX3JlYWRlcj8uY2FuY2VsKHQpO3RoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpfX1jbGFzcyBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVye2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9zdHJlYW09dDt0aGlzLl9yZWFkZXI9bnVsbDt0aGlzLl9sb2FkZWQ9MDtjb25zdCBzPXQuc291cmNlO3RoaXMuX3dpdGhDcmVkZW50aWFscz1zLndpdGhDcmVkZW50aWFsc3x8ITE7dGhpcy5fcmVhZENhcGFiaWxpdHk9bmV3IGkuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ9IXMuZGlzYWJsZVN0cmVhbTt0aGlzLl9hYm9ydENvbnRyb2xsZXI9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLl9oZWFkZXJzPWNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTt0aGlzLl9oZWFkZXJzLmFwcGVuZCgiUmFuZ2UiLGBieXRlcz0ke2V9LSR7bi0xfWApO2NvbnN0IGE9cy51cmw7ZmV0Y2goYSxjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycyx0aGlzLl93aXRoQ3JlZGVudGlhbHMsdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbigodD0+e2lmKCEoMCxyLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHQuc3RhdHVzKSl0aHJvdygwLHIuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodC5zdGF0dXMsYSk7dGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO3RoaXMuX3JlYWRlcj10LmJvZHkuZ2V0UmVhZGVyKCl9KSkuY2F0Y2godGhpcy5fcmVhZENhcGFiaWxpdHkucmVqZWN0KTt0aGlzLm9uUHJvZ3Jlc3M9bnVsbH1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWR9YXN5bmMgcmVhZCgpe2F3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7Y29uc3R7dmFsdWU6dCxkb25lOmV9PWF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7aWYoZSlyZXR1cm57dmFsdWU6dCxkb25lOmV9O3RoaXMuX2xvYWRlZCs9dC5ieXRlTGVuZ3RoO3RoaXMub25Qcm9ncmVzcz8uKHtsb2FkZWQ6dGhpcy5fbG9hZGVkfSk7cmV0dXJue3ZhbHVlOmdldEFycmF5QnVmZmVyKHQpLGRvbmU6ITF9fWNhbmNlbCh0KXt0aGlzLl9yZWFkZXI/LmNhbmNlbCh0KTt0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKX19fSwodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3I9ZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcih0LGUpe2lmKDQwND09PXR8fDA9PT10JiZlLnN0YXJ0c1dpdGgoImZpbGU6IikpcmV0dXJuIG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGICInK2UrJyIuJyk7cmV0dXJuIG5ldyBpLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihgVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UgKCR7dH0pIHdoaWxlIHJldHJpZXZpbmcgUERGICIke2V9Ii5gLHQpfTtlLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXI9ZnVuY3Rpb24gZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcih0KXtjb25zdCBlPXQoIkNvbnRlbnQtRGlzcG9zaXRpb24iKTtpZihlKXtsZXQgdD0oMCxyLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcikoZSk7aWYodC5pbmNsdWRlcygiJSIpKXRyeXt0PWRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaHt9aWYoKDAscy5pc1BkZkZpbGUpKHQpKXJldHVybiB0fXJldHVybiBudWxsfTtlLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzPWZ1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHQpe2xldHtnZXRSZXNwb25zZUhlYWRlcjplLGlzSHR0cDpuLHJhbmdlQ2h1bmtTaXplOmksZGlzYWJsZVJhbmdlOnJ9PXQ7Y29uc3Qgcz17YWxsb3dSYW5nZVJlcXVlc3RzOiExLHN1Z2dlc3RlZExlbmd0aDp2b2lkIDB9LGE9cGFyc2VJbnQoZSgiQ29udGVudC1MZW5ndGgiKSwxMCk7aWYoIU51bWJlci5pc0ludGVnZXIoYSkpcmV0dXJuIHM7cy5zdWdnZXN0ZWRMZW5ndGg9YTtpZihhPD0yKmkpcmV0dXJuIHM7aWYocnx8IW4pcmV0dXJuIHM7aWYoImJ5dGVzIiE9PWUoIkFjY2VwdC1SYW5nZXMiKSlyZXR1cm4gcztpZigiaWRlbnRpdHkiIT09KGUoIkNvbnRlbnQtRW5jb2RpbmciKXx8ImlkZW50aXR5IikpcmV0dXJuIHM7cy5hbGxvd1JhbmdlUmVxdWVzdHM9ITA7cmV0dXJuIHN9O2UudmFsaWRhdGVSZXNwb25zZVN0YXR1cz1mdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHQpe3JldHVybiAyMDA9PT10fHwyMDY9PT10fTt2YXIgaT1uKDEpLHI9bigxODIpLHM9bigxNjcpfSwodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcj1mdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIodCl7bGV0IGU9ITAsbj10b1BhcmFtUmVnRXhwKCJmaWxlbmFtZVxcKiIsImkiKS5leGVjKHQpO2lmKG4pe249blsxXTtsZXQgdD1yZmMyNjE2dW5xdW90ZShuKTt0PXVuZXNjYXBlKHQpO3Q9cmZjNTk4N2RlY29kZSh0KTt0PXJmYzIwNDdkZWNvZGUodCk7cmV0dXJuIGZpeHVwRW5jb2RpbmcodCl9bj1mdW5jdGlvbiByZmMyMjMxZ2V0cGFyYW0odCl7Y29uc3QgZT1bXTtsZXQgbjtjb25zdCBpPXRvUGFyYW1SZWdFeHAoImZpbGVuYW1lXFwqKCg/ITBcXGQpXFxkKykoXFwqPykiLCJpZyIpO2Zvcig7bnVsbCE9PShuPWkuZXhlYyh0KSk7KXtsZXRbLHQsaSxyXT1uO3Q9cGFyc2VJbnQodCwxMCk7aWYodCBpbiBlKXtpZigwPT09dClicmVha31lbHNlIGVbdF09W2kscl19Y29uc3Qgcj1bXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoJiZ0IGluIGU7Kyt0KXtsZXRbbixpXT1lW3RdO2k9cmZjMjYxNnVucXVvdGUoaSk7aWYobil7aT11bmVzY2FwZShpKTswPT09dCYmKGk9cmZjNTk4N2RlY29kZShpKSl9ci5wdXNoKGkpfXJldHVybiByLmpvaW4oIiIpfSh0KTtpZihuKXtyZXR1cm4gZml4dXBFbmNvZGluZyhyZmMyMDQ3ZGVjb2RlKG4pKX1uPXRvUGFyYW1SZWdFeHAoImZpbGVuYW1lIiwiaSIpLmV4ZWModCk7aWYobil7bj1uWzFdO2xldCB0PXJmYzI2MTZ1bnF1b3RlKG4pO3Q9cmZjMjA0N2RlY29kZSh0KTtyZXR1cm4gZml4dXBFbmNvZGluZyh0KX1mdW5jdGlvbiB0b1BhcmFtUmVnRXhwKHQsZSl7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58OylcXHMqIit0KydcXHMqPVxccyooW14iO1xcc11bXjtcXHNdKnwiKD86W14iXFxcXF18XFxcXCI/KSsiPyknLGUpfWZ1bmN0aW9uIHRleHRkZWNvZGUodCxuKXtpZih0KXtpZighL15bXHgwMC1ceEZGXSskLy50ZXN0KG4pKXJldHVybiBuO3RyeXtjb25zdCByPW5ldyBUZXh0RGVjb2Rlcih0LHtmYXRhbDohMH0pLHM9KDAsaS5zdHJpbmdUb0J5dGVzKShuKTtuPXIuZGVjb2RlKHMpO2U9ITF9Y2F0Y2h7fX1yZXR1cm4gbn1mdW5jdGlvbiBmaXh1cEVuY29kaW5nKHQpe2lmKGUmJi9bXHg4MC1ceGZmXS8udGVzdCh0KSl7dD10ZXh0ZGVjb2RlKCJ1dGYtOCIsdCk7ZSYmKHQ9dGV4dGRlY29kZSgiaXNvLTg4NTktMSIsdCkpfXJldHVybiB0fWZ1bmN0aW9uIHJmYzI2MTZ1bnF1b3RlKHQpe2lmKHQuc3RhcnRzV2l0aCgnIicpKXtjb25zdCBlPXQuc2xpY2UoMSkuc3BsaXQoJ1xcIicpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXtjb25zdCBuPWVbdF0uaW5kZXhPZignIicpO2lmKC0xIT09bil7ZVt0XT1lW3RdLnNsaWNlKDAsbik7ZS5sZW5ndGg9dCsxfWVbdF09ZVt0XS5yZXBsYWNlQWxsKC9cXCguKS9nLCIkMSIpfXQ9ZS5qb2luKCciJyl9cmV0dXJuIHR9ZnVuY3Rpb24gcmZjNTk4N2RlY29kZSh0KXtjb25zdCBlPXQuaW5kZXhPZigiJyIpO2lmKC0xPT09ZSlyZXR1cm4gdDtyZXR1cm4gdGV4dGRlY29kZSh0LnNsaWNlKDAsZSksdC5zbGljZShlKzEpLnJlcGxhY2UoL15bXiddKicvLCIiKSl9ZnVuY3Rpb24gcmZjMjA0N2RlY29kZSh0KXtyZXR1cm4hdC5zdGFydHNXaXRoKCI9PyIpfHwvW1x4MDAtXHgxOVx4ODAtXHhmZl0vLnRlc3QodCk/dDp0LnJlcGxhY2VBbGwoLz1cPyhbXHctXSopXD8oW1FxQmJdKVw/KCg/OlteP118XD8oPyE9KSkqKVw/PS9nLChmdW5jdGlvbih0LGUsbixpKXtpZigicSI9PT1ufHwiUSI9PT1uKXJldHVybiB0ZXh0ZGVjb2RlKGUsaT0oaT1pLnJlcGxhY2VBbGwoIl8iLCIgIikpLnJlcGxhY2VBbGwoLz0oWzAtOWEtZkEtRl17Mn0pL2csKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZSwxNikpfSkpKTt0cnl7aT1hdG9iKGkpfWNhdGNoe31yZXR1cm4gdGV4dGRlY29kZShlLGkpfSkpfXJldHVybiIifTtuKDg5KTtuKDE0OCk7dmFyIGk9bigxKX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5QREZOZXR3b3JrU3RyZWFtPXZvaWQgMDtuKDg5KTt2YXIgaT1uKDEpLHI9bigxODEpO2NsYXNzIE5ldHdvcmtNYW5hZ2Vye2NvbnN0cnVjdG9yKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnVybD10O3RoaXMuaXNIdHRwPS9eaHR0cHM/Oi9pLnRlc3QodCk7dGhpcy5odHRwSGVhZGVycz10aGlzLmlzSHR0cCYmZS5odHRwSGVhZGVyc3x8T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLndpdGhDcmVkZW50aWFscz1lLndpdGhDcmVkZW50aWFsc3x8ITE7dGhpcy5jdXJyWGhySWQ9MDt0aGlzLnBlbmRpbmdSZXF1ZXN0cz1PYmplY3QuY3JlYXRlKG51bGwpfXJlcXVlc3RSYW5nZSh0LGUsbil7Y29uc3QgaT17YmVnaW46dCxlbmQ6ZX07Zm9yKGNvbnN0IHQgaW4gbilpW3RdPW5bdF07cmV0dXJuIHRoaXMucmVxdWVzdChpKX1yZXF1ZXN0RnVsbCh0KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHQpfXJlcXVlc3QodCl7Y29uc3QgZT1uZXcgWE1MSHR0cFJlcXVlc3Qsbj10aGlzLmN1cnJYaHJJZCsrLGk9dGhpcy5wZW5kaW5nUmVxdWVzdHNbbl09e3hocjplfTtlLm9wZW4oIkdFVCIsdGhpcy51cmwpO2Uud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzO2Zvcihjb25zdCB0IGluIHRoaXMuaHR0cEhlYWRlcnMpe2NvbnN0IG49dGhpcy5odHRwSGVhZGVyc1t0XTt2b2lkIDAhPT1uJiZlLnNldFJlcXVlc3RIZWFkZXIodCxuKX1pZih0aGlzLmlzSHR0cCYmImJlZ2luImluIHQmJiJlbmQiaW4gdCl7ZS5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsYGJ5dGVzPSR7dC5iZWdpbn0tJHt0LmVuZC0xfWApO2kuZXhwZWN0ZWRTdGF0dXM9MjA2fWVsc2UgaS5leHBlY3RlZFN0YXR1cz0yMDA7ZS5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIjt0Lm9uRXJyb3ImJihlLm9uZXJyb3I9ZnVuY3Rpb24obil7dC5vbkVycm9yKGUuc3RhdHVzKX0pO2Uub25yZWFkeXN0YXRlY2hhbmdlPXRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMsbik7ZS5vbnByb2dyZXNzPXRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMsbik7aS5vbkhlYWRlcnNSZWNlaXZlZD10Lm9uSGVhZGVyc1JlY2VpdmVkO2kub25Eb25lPXQub25Eb25lO2kub25FcnJvcj10Lm9uRXJyb3I7aS5vblByb2dyZXNzPXQub25Qcm9ncmVzcztlLnNlbmQobnVsbCk7cmV0dXJuIG59b25Qcm9ncmVzcyh0LGUpe2NvbnN0IG49dGhpcy5wZW5kaW5nUmVxdWVzdHNbdF07biYmbi5vblByb2dyZXNzPy4oZSl9b25TdGF0ZUNoYW5nZSh0LGUpe2NvbnN0IG49dGhpcy5wZW5kaW5nUmVxdWVzdHNbdF07aWYoIW4pcmV0dXJuO2NvbnN0IHI9bi54aHI7aWYoci5yZWFkeVN0YXRlPj0yJiZuLm9uSGVhZGVyc1JlY2VpdmVkKXtuLm9uSGVhZGVyc1JlY2VpdmVkKCk7ZGVsZXRlIG4ub25IZWFkZXJzUmVjZWl2ZWR9aWYoNCE9PXIucmVhZHlTdGF0ZSlyZXR1cm47aWYoISh0IGluIHRoaXMucGVuZGluZ1JlcXVlc3RzKSlyZXR1cm47ZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3RdO2lmKDA9PT1yLnN0YXR1cyYmdGhpcy5pc0h0dHApe24ub25FcnJvcj8uKHIuc3RhdHVzKTtyZXR1cm59Y29uc3Qgcz1yLnN0YXR1c3x8MjAwO2lmKCEoMjAwPT09cyYmMjA2PT09bi5leHBlY3RlZFN0YXR1cykmJnMhPT1uLmV4cGVjdGVkU3RhdHVzKXtuLm9uRXJyb3I/LihyLnN0YXR1cyk7cmV0dXJufWNvbnN0IGE9ZnVuY3Rpb24gZ2V0QXJyYXlCdWZmZXIodCl7Y29uc3QgZT10LnJlc3BvbnNlO3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9lOigwLGkuc3RyaW5nVG9CeXRlcykoZSkuYnVmZmVyfShyKTtpZigyMDY9PT1zKXtjb25zdCB0PXIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtUmFuZ2UiKSxlPS9ieXRlcyAoXGQrKS0oXGQrKVwvKFxkKykvLmV4ZWModCk7bi5vbkRvbmUoe2JlZ2luOnBhcnNlSW50KGVbMV0sMTApLGNodW5rOmF9KX1lbHNlIGE/bi5vbkRvbmUoe2JlZ2luOjAsY2h1bms6YX0pOm4ub25FcnJvcj8uKHIuc3RhdHVzKX1nZXRSZXF1ZXN0WGhyKHQpe3JldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XS54aHJ9aXNQZW5kaW5nUmVxdWVzdCh0KXtyZXR1cm4gdCBpbiB0aGlzLnBlbmRpbmdSZXF1ZXN0c31hYm9ydFJlcXVlc3QodCl7Y29uc3QgZT10aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XS54aHI7ZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3RdO2UuYWJvcnQoKX19ZS5QREZOZXR3b3JrU3RyZWFtPWNsYXNzIFBERk5ldHdvcmtTdHJlYW17Y29uc3RydWN0b3IodCl7dGhpcy5fc291cmNlPXQ7dGhpcy5fbWFuYWdlcj1uZXcgTmV0d29ya01hbmFnZXIodC51cmwse2h0dHBIZWFkZXJzOnQuaHR0cEhlYWRlcnMsd2l0aENyZWRlbnRpYWxzOnQud2l0aENyZWRlbnRpYWxzfSk7dGhpcy5fcmFuZ2VDaHVua1NpemU9dC5yYW5nZUNodW5rU2l6ZTt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1udWxsO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnM9W119X29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkKHQpe2NvbnN0IGU9dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5pbmRleE9mKHQpO2U+PTAmJnRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGUsMSl9Z2V0RnVsbFJlYWRlcigpeygwLGkuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIlBERk5ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1uZXcgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyKHRoaXMuX21hbmFnZXIsdGhpcy5fc291cmNlKTtyZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXJ9Z2V0UmFuZ2VSZWFkZXIodCxlKXtjb25zdCBuPW5ldyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyKHRoaXMuX21hbmFnZXIsdCxlKTtuLm9uQ2xvc2VkPXRoaXMuX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkLmJpbmQodGhpcyk7dGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKG4pO3JldHVybiBufWNhbmNlbEFsbFJlcXVlc3RzKHQpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwodCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSllLmNhbmNlbCh0KX19O2NsYXNzIFBERk5ldHdvcmtTdHJlYW1GdWxsUmVxdWVzdFJlYWRlcntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX21hbmFnZXI9dDtjb25zdCBuPXtvbkhlYWRlcnNSZWNlaXZlZDp0aGlzLl9vbkhlYWRlcnNSZWNlaXZlZC5iaW5kKHRoaXMpLG9uRG9uZTp0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxvbkVycm9yOnRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxvblByb2dyZXNzOnRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKX07dGhpcy5fdXJsPWUudXJsO3RoaXMuX2Z1bGxSZXF1ZXN0SWQ9dC5yZXF1ZXN0RnVsbChuKTt0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5PW5ldyBpLlByb21pc2VDYXBhYmlsaXR5O3RoaXMuX2Rpc2FibGVSYW5nZT1lLmRpc2FibGVSYW5nZXx8ITE7dGhpcy5fY29udGVudExlbmd0aD1lLmxlbmd0aDt0aGlzLl9yYW5nZUNodW5rU2l6ZT1lLnJhbmdlQ2h1bmtTaXplO3RoaXMuX3JhbmdlQ2h1bmtTaXplfHx0aGlzLl9kaXNhYmxlUmFuZ2V8fCh0aGlzLl9kaXNhYmxlUmFuZ2U9ITApO3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSExO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9ITE7dGhpcy5fY2FjaGVkQ2h1bmtzPVtdO3RoaXMuX3JlcXVlc3RzPVtdO3RoaXMuX2RvbmU9ITE7dGhpcy5fc3RvcmVkRXJyb3I9dm9pZCAwO3RoaXMuX2ZpbGVuYW1lPW51bGw7dGhpcy5vblByb2dyZXNzPW51bGx9X29uSGVhZGVyc1JlY2VpdmVkKCl7Y29uc3QgdD10aGlzLl9mdWxsUmVxdWVzdElkLGU9dGhpcy5fbWFuYWdlci5nZXRSZXF1ZXN0WGhyKHQpLGdldFJlc3BvbnNlSGVhZGVyPXQ9PmUuZ2V0UmVzcG9uc2VIZWFkZXIodCkse2FsbG93UmFuZ2VSZXF1ZXN0czpuLHN1Z2dlc3RlZExlbmd0aDppfT0oMCxyLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7Z2V0UmVzcG9uc2VIZWFkZXI6Z2V0UmVzcG9uc2VIZWFkZXIsaXNIdHRwOnRoaXMuX21hbmFnZXIuaXNIdHRwLHJhbmdlQ2h1bmtTaXplOnRoaXMuX3JhbmdlQ2h1bmtTaXplLGRpc2FibGVSYW5nZTp0aGlzLl9kaXNhYmxlUmFuZ2V9KTtuJiYodGhpcy5faXNSYW5nZVN1cHBvcnRlZD0hMCk7dGhpcy5fY29udGVudExlbmd0aD1pfHx0aGlzLl9jb250ZW50TGVuZ3RoO3RoaXMuX2ZpbGVuYW1lPSgwLHIuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoZ2V0UmVzcG9uc2VIZWFkZXIpO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQmJnRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHQpO3RoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVzb2x2ZSgpfV9vbkRvbmUodCl7aWYodClpZih0aGlzLl9yZXF1ZXN0cy5sZW5ndGg+MCl7dGhpcy5fcmVxdWVzdHMuc2hpZnQoKS5yZXNvbHZlKHt2YWx1ZTp0LmNodW5rLGRvbmU6ITF9KX1lbHNlIHRoaXMuX2NhY2hlZENodW5rcy5wdXNoKHQuY2h1bmspO3RoaXMuX2RvbmU9ITA7aWYoISh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoPjApKXtmb3IoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cyl0LnJlc29sdmUoe3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk7dGhpcy5fcmVxdWVzdHMubGVuZ3RoPTB9fV9vbkVycm9yKHQpe3RoaXMuX3N0b3JlZEVycm9yPSgwLHIuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodCx0aGlzLl91cmwpO3RoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtmb3IoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cyl0LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7dGhpcy5fcmVxdWVzdHMubGVuZ3RoPTA7dGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aD0wfV9vblByb2dyZXNzKHQpe3RoaXMub25Qcm9ncmVzcz8uKHtsb2FkZWQ6dC5sb2FkZWQsdG90YWw6dC5sZW5ndGhDb21wdXRhYmxlP3QudG90YWw6dGhpcy5fY29udGVudExlbmd0aH0pfWdldCBmaWxlbmFtZSgpe3JldHVybiB0aGlzLl9maWxlbmFtZX1nZXQgaXNSYW5nZVN1cHBvcnRlZCgpe3JldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkfWdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpe3JldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZH1nZXQgY29udGVudExlbmd0aCgpe3JldHVybiB0aGlzLl9jb250ZW50TGVuZ3RofWdldCBoZWFkZXJzUmVhZHkoKXtyZXR1cm4gdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5wcm9taXNlfWFzeW5jIHJlYWQoKXtpZih0aGlzLl9zdG9yZWRFcnJvcil0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtpZih0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoPjApe3JldHVybnt2YWx1ZTp0aGlzLl9jYWNoZWRDaHVua3Muc2hpZnQoKSxkb25lOiExfX1pZih0aGlzLl9kb25lKXJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH07Y29uc3QgdD1uZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLl9yZXF1ZXN0cy5wdXNoKHQpO3JldHVybiB0LnByb21pc2V9Y2FuY2VsKHQpe3RoaXMuX2RvbmU9ITA7dGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QodCk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fcmVxdWVzdHMpdC5yZXNvbHZlKHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pO3RoaXMuX3JlcXVlc3RzLmxlbmd0aD0wO3RoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKSYmdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCk7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbH19Y2xhc3MgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fbWFuYWdlcj10O2NvbnN0IGk9e29uRG9uZTp0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxvbkVycm9yOnRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxvblByb2dyZXNzOnRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKX07dGhpcy5fdXJsPXQudXJsO3RoaXMuX3JlcXVlc3RJZD10LnJlcXVlc3RSYW5nZShlLG4saSk7dGhpcy5fcmVxdWVzdHM9W107dGhpcy5fcXVldWVkQ2h1bms9bnVsbDt0aGlzLl9kb25lPSExO3RoaXMuX3N0b3JlZEVycm9yPXZvaWQgMDt0aGlzLm9uUHJvZ3Jlc3M9bnVsbDt0aGlzLm9uQ2xvc2VkPW51bGx9X2Nsb3NlKCl7dGhpcy5vbkNsb3NlZD8uKHRoaXMpfV9vbkRvbmUodCl7Y29uc3QgZT10LmNodW5rO2lmKHRoaXMuX3JlcXVlc3RzLmxlbmd0aD4wKXt0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpLnJlc29sdmUoe3ZhbHVlOmUsZG9uZTohMX0pfWVsc2UgdGhpcy5fcXVldWVkQ2h1bms9ZTt0aGlzLl9kb25lPSEwO2Zvcihjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKXQucmVzb2x2ZSh7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KTt0aGlzLl9yZXF1ZXN0cy5sZW5ndGg9MDt0aGlzLl9jbG9zZSgpfV9vbkVycm9yKHQpe3RoaXMuX3N0b3JlZEVycm9yPSgwLHIuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodCx0aGlzLl91cmwpO2Zvcihjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKXQucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTt0aGlzLl9yZXF1ZXN0cy5sZW5ndGg9MDt0aGlzLl9xdWV1ZWRDaHVuaz1udWxsfV9vblByb2dyZXNzKHQpe3RoaXMuaXNTdHJlYW1pbmdTdXBwb3J0ZWR8fHRoaXMub25Qcm9ncmVzcz8uKHtsb2FkZWQ6dC5sb2FkZWR9KX1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4hMX1hc3luYyByZWFkKCl7aWYodGhpcy5fc3RvcmVkRXJyb3IpdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7aWYobnVsbCE9PXRoaXMuX3F1ZXVlZENodW5rKXtjb25zdCB0PXRoaXMuX3F1ZXVlZENodW5rO3RoaXMuX3F1ZXVlZENodW5rPW51bGw7cmV0dXJue3ZhbHVlOnQsZG9uZTohMX19aWYodGhpcy5fZG9uZSlyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9O2NvbnN0IHQ9bmV3IGkuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy5fcmVxdWVzdHMucHVzaCh0KTtyZXR1cm4gdC5wcm9taXNlfWNhbmNlbCh0KXt0aGlzLl9kb25lPSEwO2Zvcihjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKXQucmVzb2x2ZSh7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KTt0aGlzLl9yZXF1ZXN0cy5sZW5ndGg9MDt0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fcmVxdWVzdElkKSYmdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fcmVxdWVzdElkKTt0aGlzLl9jbG9zZSgpfX19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuUERGTm9kZVN0cmVhbT12b2lkIDA7big4OSk7big5Myk7bigxMDEpO24oMTAyKTtuKDEwNSk7bigxMDcpO24oMTA5KTtuKDExMyk7bigxMTYpO24oMTIzKTt2YXIgaT1uKDEpLHI9bigxODEpO2NvbnN0IHM9L15maWxlOlwvXC9cL1thLXpBLVpdOlwvLztlLlBERk5vZGVTdHJlYW09Y2xhc3MgUERGTm9kZVN0cmVhbXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnNvdXJjZT10O3RoaXMudXJsPWZ1bmN0aW9uIHBhcnNlVXJsKHQpe2NvbnN0IGU9cmVxdWlyZSgidXJsIiksbj1lLnBhcnNlKHQpO2lmKCJmaWxlOiI9PT1uLnByb3RvY29sfHxuLmhvc3QpcmV0dXJuIG47aWYoL15bYS16XTpbL1xcXS9pLnRlc3QodCkpcmV0dXJuIGUucGFyc2UoYGZpbGU6Ly8vJHt0fWApO24uaG9zdHx8KG4ucHJvdG9jb2w9ImZpbGU6Iik7cmV0dXJuIG59KHQudXJsKTt0aGlzLmlzSHR0cD0iaHR0cDoiPT09dGhpcy51cmwucHJvdG9jb2x8fCJodHRwczoiPT09dGhpcy51cmwucHJvdG9jb2w7dGhpcy5pc0ZzVXJsPSJmaWxlOiI9PT10aGlzLnVybC5wcm90b2NvbDt0aGlzLmh0dHBIZWFkZXJzPXRoaXMuaXNIdHRwJiZ0Lmh0dHBIZWFkZXJzfHx7fTt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1udWxsO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnM9W119Z2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKXtyZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/Ll9sb2FkZWQ/PzB9Z2V0RnVsbFJlYWRlcigpeygwLGkuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIlBERk5vZGVTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj10aGlzLmlzRnNVcmw/bmV3IFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIodGhpcyk6bmV3IFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyKHRoaXMpO3JldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcn1nZXRSYW5nZVJlYWRlcih0LGUpe2lmKGU8PXRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aClyZXR1cm4gbnVsbDtjb25zdCBuPXRoaXMuaXNGc1VybD9uZXcgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIodGhpcyx0LGUpOm5ldyBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIodGhpcyx0LGUpO3RoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChuKTtyZXR1cm4gbn1jYW5jZWxBbGxSZXF1ZXN0cyh0KXt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHQpO2Zvcihjb25zdCBlIG9mIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkpZS5jYW5jZWwodCl9fTtjbGFzcyBCYXNlRnVsbFJlYWRlcntjb25zdHJ1Y3Rvcih0KXt0aGlzLl91cmw9dC51cmw7dGhpcy5fZG9uZT0hMTt0aGlzLl9zdG9yZWRFcnJvcj1udWxsO3RoaXMub25Qcm9ncmVzcz1udWxsO2NvbnN0IGU9dC5zb3VyY2U7dGhpcy5fY29udGVudExlbmd0aD1lLmxlbmd0aDt0aGlzLl9sb2FkZWQ9MDt0aGlzLl9maWxlbmFtZT1udWxsO3RoaXMuX2Rpc2FibGVSYW5nZT1lLmRpc2FibGVSYW5nZXx8ITE7dGhpcy5fcmFuZ2VDaHVua1NpemU9ZS5yYW5nZUNodW5rU2l6ZTt0aGlzLl9yYW5nZUNodW5rU2l6ZXx8dGhpcy5fZGlzYWJsZVJhbmdlfHwodGhpcy5fZGlzYWJsZVJhbmdlPSEwKTt0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZD0hZS5kaXNhYmxlU3RyZWFtO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9IWUuZGlzYWJsZVJhbmdlO3RoaXMuX3JlYWRhYmxlU3RyZWFtPW51bGw7dGhpcy5fcmVhZENhcGFiaWxpdHk9bmV3IGkuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy5faGVhZGVyc0NhcGFiaWxpdHk9bmV3IGkuUHJvbWlzZUNhcGFiaWxpdHl9Z2V0IGhlYWRlcnNSZWFkeSgpe3JldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlfWdldCBmaWxlbmFtZSgpe3JldHVybiB0aGlzLl9maWxlbmFtZX1nZXQgY29udGVudExlbmd0aCgpe3JldHVybiB0aGlzLl9jb250ZW50TGVuZ3RofWdldCBpc1JhbmdlU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWR9Z2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCl7cmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkfWFzeW5jIHJlYWQoKXthd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO2lmKHRoaXMuX2RvbmUpcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfTtpZih0aGlzLl9zdG9yZWRFcnJvcil0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtjb25zdCB0PXRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTtpZihudWxsPT09dCl7dGhpcy5fcmVhZENhcGFiaWxpdHk9bmV3IGkuUHJvbWlzZUNhcGFiaWxpdHk7cmV0dXJuIHRoaXMucmVhZCgpfXRoaXMuX2xvYWRlZCs9dC5sZW5ndGg7dGhpcy5vblByb2dyZXNzPy4oe2xvYWRlZDp0aGlzLl9sb2FkZWQsdG90YWw6dGhpcy5fY29udGVudExlbmd0aH0pO3JldHVybnt2YWx1ZTpuZXcgVWludDhBcnJheSh0KS5idWZmZXIsZG9uZTohMX19Y2FuY2VsKHQpe3RoaXMuX3JlYWRhYmxlU3RyZWFtP3RoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodCk6dGhpcy5fZXJyb3IodCl9X2Vycm9yKHQpe3RoaXMuX3N0b3JlZEVycm9yPXQ7dGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpfV9zZXRSZWFkYWJsZVN0cmVhbSh0KXt0aGlzLl9yZWFkYWJsZVN0cmVhbT10O3Qub24oInJlYWRhYmxlIiwoKCk9Pnt0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCl9KSk7dC5vbigiZW5kIiwoKCk9Pnt0LmRlc3Ryb3koKTt0aGlzLl9kb25lPSEwO3RoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKX0pKTt0Lm9uKCJlcnJvciIsKHQ9Pnt0aGlzLl9lcnJvcih0KX0pKTshdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQmJnRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQmJnRoaXMuX2Vycm9yKG5ldyBpLkFib3J0RXhjZXB0aW9uKCJzdHJlYW1pbmcgaXMgZGlzYWJsZWQiKSk7dGhpcy5fc3RvcmVkRXJyb3ImJnRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodGhpcy5fc3RvcmVkRXJyb3IpfX1jbGFzcyBCYXNlUmFuZ2VSZWFkZXJ7Y29uc3RydWN0b3IodCl7dGhpcy5fdXJsPXQudXJsO3RoaXMuX2RvbmU9ITE7dGhpcy5fc3RvcmVkRXJyb3I9bnVsbDt0aGlzLm9uUHJvZ3Jlc3M9bnVsbDt0aGlzLl9sb2FkZWQ9MDt0aGlzLl9yZWFkYWJsZVN0cmVhbT1udWxsO3RoaXMuX3JlYWRDYXBhYmlsaXR5PW5ldyBpLlByb21pc2VDYXBhYmlsaXR5O2NvbnN0IGU9dC5zb3VyY2U7dGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ9IWUuZGlzYWJsZVN0cmVhbX1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWR9YXN5bmMgcmVhZCgpe2F3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7aWYodGhpcy5fZG9uZSlyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9O2lmKHRoaXMuX3N0b3JlZEVycm9yKXRocm93IHRoaXMuX3N0b3JlZEVycm9yO2NvbnN0IHQ9dGhpcy5fcmVhZGFibGVTdHJlYW0ucmVhZCgpO2lmKG51bGw9PT10KXt0aGlzLl9yZWFkQ2FwYWJpbGl0eT1uZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eTtyZXR1cm4gdGhpcy5yZWFkKCl9dGhpcy5fbG9hZGVkKz10Lmxlbmd0aDt0aGlzLm9uUHJvZ3Jlc3M/Lih7bG9hZGVkOnRoaXMuX2xvYWRlZH0pO3JldHVybnt2YWx1ZTpuZXcgVWludDhBcnJheSh0KS5idWZmZXIsZG9uZTohMX19Y2FuY2VsKHQpe3RoaXMuX3JlYWRhYmxlU3RyZWFtP3RoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodCk6dGhpcy5fZXJyb3IodCl9X2Vycm9yKHQpe3RoaXMuX3N0b3JlZEVycm9yPXQ7dGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpfV9zZXRSZWFkYWJsZVN0cmVhbSh0KXt0aGlzLl9yZWFkYWJsZVN0cmVhbT10O3Qub24oInJlYWRhYmxlIiwoKCk9Pnt0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCl9KSk7dC5vbigiZW5kIiwoKCk9Pnt0LmRlc3Ryb3koKTt0aGlzLl9kb25lPSEwO3RoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKX0pKTt0Lm9uKCJlcnJvciIsKHQ9Pnt0aGlzLl9lcnJvcih0KX0pKTt0aGlzLl9zdG9yZWRFcnJvciYmdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcil9fWZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RPcHRpb25zKHQsZSl7cmV0dXJue3Byb3RvY29sOnQucHJvdG9jb2wsYXV0aDp0LmF1dGgsaG9zdDp0Lmhvc3RuYW1lLHBvcnQ6dC5wb3J0LHBhdGg6dC5wYXRoLG1ldGhvZDoiR0VUIixoZWFkZXJzOmV9fWNsYXNzIFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXJ7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7Y29uc3QgaGFuZGxlUmVzcG9uc2U9ZT0+e2lmKDQwND09PWUuc3RhdHVzQ29kZSl7Y29uc3QgdD1uZXcgaS5NaXNzaW5nUERGRXhjZXB0aW9uKGBNaXNzaW5nIFBERiAiJHt0aGlzLl91cmx9Ii5gKTt0aGlzLl9zdG9yZWRFcnJvcj10O3RoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCh0KTtyZXR1cm59dGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO3RoaXMuX3NldFJlYWRhYmxlU3RyZWFtKGUpO2NvbnN0IGdldFJlc3BvbnNlSGVhZGVyPXQ9PnRoaXMuX3JlYWRhYmxlU3RyZWFtLmhlYWRlcnNbdC50b0xvd2VyQ2FzZSgpXSx7YWxsb3dSYW5nZVJlcXVlc3RzOm4sc3VnZ2VzdGVkTGVuZ3RoOnN9PSgwLHIudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHtnZXRSZXNwb25zZUhlYWRlcjpnZXRSZXNwb25zZUhlYWRlcixpc0h0dHA6dC5pc0h0dHAscmFuZ2VDaHVua1NpemU6dGhpcy5fcmFuZ2VDaHVua1NpemUsZGlzYWJsZVJhbmdlOnRoaXMuX2Rpc2FibGVSYW5nZX0pO3RoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ9bjt0aGlzLl9jb250ZW50TGVuZ3RoPXN8fHRoaXMuX2NvbnRlbnRMZW5ndGg7dGhpcy5fZmlsZW5hbWU9KDAsci5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcil9O3RoaXMuX3JlcXVlc3Q9bnVsbDtpZigiaHR0cDoiPT09dGhpcy5fdXJsLnByb3RvY29sKXtjb25zdCBlPXJlcXVpcmUoImh0dHAiKTt0aGlzLl9yZXF1ZXN0PWUucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsdC5odHRwSGVhZGVycyksaGFuZGxlUmVzcG9uc2UpfWVsc2V7Y29uc3QgZT1yZXF1aXJlKCJodHRwcyIpO3RoaXMuX3JlcXVlc3Q9ZS5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCx0Lmh0dHBIZWFkZXJzKSxoYW5kbGVSZXNwb25zZSl9dGhpcy5fcmVxdWVzdC5vbigiZXJyb3IiLCh0PT57dGhpcy5fc3RvcmVkRXJyb3I9dDt0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QodCl9KSk7dGhpcy5fcmVxdWVzdC5lbmQoKX19Y2xhc3MgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVye2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0KTt0aGlzLl9odHRwSGVhZGVycz17fTtmb3IoY29uc3QgZSBpbiB0Lmh0dHBIZWFkZXJzKXtjb25zdCBuPXQuaHR0cEhlYWRlcnNbZV07dm9pZCAwIT09biYmKHRoaXMuX2h0dHBIZWFkZXJzW2VdPW4pfXRoaXMuX2h0dHBIZWFkZXJzLlJhbmdlPWBieXRlcz0ke2V9LSR7bi0xfWA7Y29uc3QgaGFuZGxlUmVzcG9uc2U9dD0+e2lmKDQwNCE9PXQuc3RhdHVzQ29kZSl0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbSh0KTtlbHNle2NvbnN0IHQ9bmV3IGkuTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgIiR7dGhpcy5fdXJsfSIuYCk7dGhpcy5fc3RvcmVkRXJyb3I9dH19O3RoaXMuX3JlcXVlc3Q9bnVsbDtpZigiaHR0cDoiPT09dGhpcy5fdXJsLnByb3RvY29sKXtjb25zdCB0PXJlcXVpcmUoImh0dHAiKTt0aGlzLl9yZXF1ZXN0PXQucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsdGhpcy5faHR0cEhlYWRlcnMpLGhhbmRsZVJlc3BvbnNlKX1lbHNle2NvbnN0IHQ9cmVxdWlyZSgiaHR0cHMiKTt0aGlzLl9yZXF1ZXN0PXQucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsdGhpcy5faHR0cEhlYWRlcnMpLGhhbmRsZVJlc3BvbnNlKX10aGlzLl9yZXF1ZXN0Lm9uKCJlcnJvciIsKHQ9Pnt0aGlzLl9zdG9yZWRFcnJvcj10fSkpO3RoaXMuX3JlcXVlc3QuZW5kKCl9fWNsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtsZXQgZT1kZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO3MudGVzdCh0aGlzLl91cmwuaHJlZikmJihlPWUucmVwbGFjZSgvXlwvLywiIikpO2NvbnN0IG49cmVxdWlyZSgiZnMiKTtuLmxzdGF0KGUsKCh0LHIpPT57aWYodCl7IkVOT0VOVCI9PT10LmNvZGUmJih0PW5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGICIke2V9Ii5gKSk7dGhpcy5fc3RvcmVkRXJyb3I9dDt0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QodCl9ZWxzZXt0aGlzLl9jb250ZW50TGVuZ3RoPXIuc2l6ZTt0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShuLmNyZWF0ZVJlYWRTdHJlYW0oZSkpO3RoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKX19KSl9fWNsYXNzIFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVye2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0KTtsZXQgaT1kZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO3MudGVzdCh0aGlzLl91cmwuaHJlZikmJihpPWkucmVwbGFjZSgvXlwvLywiIikpO2NvbnN0IHI9cmVxdWlyZSgiZnMiKTt0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShyLmNyZWF0ZVJlYWRTdHJlYW0oaSx7c3RhcnQ6ZSxlbmQ6bi0xfSkpfX19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuU1ZHR3JhcGhpY3M9dm9pZCAwO24oODQpO24oODYpO24oODcpO24oOTMpO24oMTAxKTtuKDEwMik7bigxMDUpO24oMTA3KTtuKDEwOSk7bigxMTMpO24oMTE2KTtuKDEyMyk7bigyKTtuKDg5KTtuKDE4Nik7dmFyIGk9bigxNjcpLHI9bigxKTtjb25zdCBzPSJub3JtYWwiLGE9Im5vcm1hbCIsbz0iIzAwMDAwMCIsbD1bImJ1dHQiLCJyb3VuZCIsInNxdWFyZSJdLGM9WyJtaXRlciIsInJvdW5kIiwiYmV2ZWwiXSxjcmVhdGVPYmplY3RVUkw9ZnVuY3Rpb24odCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiLG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtpZihVUkwuY3JlYXRlT2JqZWN0VVJMJiYidW5kZWZpbmVkIiE9dHlwZW9mIEJsb2ImJiFuKXJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0XSx7dHlwZTplfSkpO2NvbnN0IGk9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjtsZXQgcj1gZGF0YToke2V9O2Jhc2U2NCxgO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTMpe2NvbnN0IHM9MjU1JnRbZV0sYT0yNTUmdFtlKzFdLG89MjU1JnRbZSsyXTtyKz1pW3M+PjJdK2lbKDMmcyk8PDR8YT4+NF0raVtlKzE8bj8oMTUmYSk8PDJ8bz4+Njo2NF0raVtlKzI8bj82MyZvOjY0XX1yZXR1cm4gcn0saD1mdW5jdGlvbigpe2NvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkoWzEzNyw4MCw3OCw3MSwxMywxMCwyNiwxMF0pLGU9bmV3IEludDMyQXJyYXkoMjU2KTtmb3IobGV0IHQ9MDt0PDI1Njt0Kyspe2xldCBuPXQ7Zm9yKGxldCB0PTA7dDw4O3QrKyluPTEmbj8zOTg4MjkyMzg0Xm4+PjEmMjE0NzQ4MzY0NzpuPj4xJjIxNDc0ODM2NDc7ZVt0XT1ufWZ1bmN0aW9uIHdyaXRlUG5nQ2h1bmsodCxuLGkscil7bGV0IHM9cjtjb25zdCBhPW4ubGVuZ3RoO2lbc109YT4+MjQmMjU1O2lbcysxXT1hPj4xNiYyNTU7aVtzKzJdPWE+PjgmMjU1O2lbcyszXT0yNTUmYTtzKz00O2lbc109MjU1JnQuY2hhckNvZGVBdCgwKTtpW3MrMV09MjU1JnQuY2hhckNvZGVBdCgxKTtpW3MrMl09MjU1JnQuY2hhckNvZGVBdCgyKTtpW3MrM109MjU1JnQuY2hhckNvZGVBdCgzKTtzKz00O2kuc2V0KG4scyk7cys9bi5sZW5ndGg7Y29uc3Qgbz1mdW5jdGlvbiBjcmMzMih0LG4saSl7bGV0IHI9LTE7Zm9yKGxldCBzPW47czxpO3MrKyl7Y29uc3Qgbj0yNTUmKHJedFtzXSk7cj1yPj4+OF5lW25dfXJldHVybi0xXnJ9KGkscis0LHMpO2lbc109bz4+MjQmMjU1O2lbcysxXT1vPj4xNiYyNTU7aVtzKzJdPW8+PjgmMjU1O2lbcyszXT0yNTUmb31mdW5jdGlvbiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZCh0KXtsZXQgZT10Lmxlbmd0aDtjb25zdCBuPTY1NTM1LGk9TWF0aC5jZWlsKGUvbikscj1uZXcgVWludDhBcnJheSgyK2UrNSppKzQpO2xldCBzPTA7cltzKytdPTEyMDtyW3MrK109MTU2O2xldCBhPTA7Zm9yKDtlPm47KXtyW3MrK109MDtyW3MrK109MjU1O3JbcysrXT0yNTU7cltzKytdPTA7cltzKytdPTA7ci5zZXQodC5zdWJhcnJheShhLGErbikscyk7cys9bjthKz1uO2UtPW59cltzKytdPTE7cltzKytdPTI1NSZlO3JbcysrXT1lPj44JjI1NTtyW3MrK109MjU1Jn5lO3JbcysrXT0oNjU1MzUmfmUpPj44JjI1NTtyLnNldCh0LnN1YmFycmF5KGEpLHMpO3MrPXQubGVuZ3RoLWE7Y29uc3Qgbz1mdW5jdGlvbiBhZGxlcjMyKHQsZSxuKXtsZXQgaT0xLHI9MDtmb3IobGV0IHM9ZTtzPG47KytzKXtpPShpKygyNTUmdFtzXSkpJTY1NTIxO3I9KHIraSklNjU1MjF9cmV0dXJuIHI8PDE2fGl9KHQsMCx0Lmxlbmd0aCk7cltzKytdPW8+PjI0JjI1NTtyW3MrK109bz4+MTYmMjU1O3JbcysrXT1vPj44JjI1NTtyW3MrK109MjU1Jm87cmV0dXJuIHJ9ZnVuY3Rpb24gZW5jb2RlKGUsbixpLHMpe2NvbnN0IGE9ZS53aWR0aCxvPWUuaGVpZ2h0O2xldCBsLGMsaDtjb25zdCBkPWUuZGF0YTtzd2l0Y2gobil7Y2FzZSByLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDpjPTA7bD0xO2g9YSs3Pj4zO2JyZWFrO2Nhc2Ugci5JbWFnZUtpbmQuUkdCXzI0QlBQOmM9MjtsPTg7aD0zKmE7YnJlYWs7Y2FzZSByLkltYWdlS2luZC5SR0JBXzMyQlBQOmM9NjtsPTg7aD00KmE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0Iil9Y29uc3QgdT1uZXcgVWludDhBcnJheSgoMStoKSpvKTtsZXQgcD0wLGY9MDtmb3IobGV0IHQ9MDt0PG87Kyt0KXt1W3ArK109MDt1LnNldChkLnN1YmFycmF5KGYsZitoKSxwKTtmKz1oO3ArPWh9aWYobj09PXIuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQJiZzKXtwPTA7Zm9yKGxldCB0PTA7dDxvO3QrKyl7cCsrO2ZvcihsZXQgdD0wO3Q8aDt0KyspdVtwKytdXj0yNTV9fWNvbnN0IGc9bmV3IFVpbnQ4QXJyYXkoW2E+PjI0JjI1NSxhPj4xNiYyNTUsYT4+OCYyNTUsMjU1JmEsbz4+MjQmMjU1LG8+PjE2JjI1NSxvPj44JjI1NSwyNTUmbyxsLGMsMCwwLDBdKSxtPWZ1bmN0aW9uIGRlZmxhdGVTeW5jKHQpe2lmKCFyLmlzTm9kZUpTKXJldHVybiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZCh0KTt0cnl7Y29uc3QgZT1wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUpPj04P3Q6QnVmZmVyLmZyb20odCksbj1yZXF1aXJlKCJ6bGliIikuZGVmbGF0ZVN5bmMoZSx7bGV2ZWw6OX0pO3JldHVybiBuIGluc3RhbmNlb2YgVWludDhBcnJheT9uOm5ldyBVaW50OEFycmF5KG4pfWNhdGNoKHQpeygwLHIud2FybikoIk5vdCBjb21wcmVzc2luZyBQTkcgYmVjYXVzZSB6bGliLmRlZmxhdGVTeW5jIGlzIHVuYXZhaWxhYmxlOiAiK3QpfXJldHVybiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZCh0KX0odSksYj10Lmxlbmd0aCszNitnLmxlbmd0aCttLmxlbmd0aCx2PW5ldyBVaW50OEFycmF5KGIpO2xldCB5PTA7di5zZXQodCx5KTt5Kz10Lmxlbmd0aDt3cml0ZVBuZ0NodW5rKCJJSERSIixnLHYseSk7eSs9MTIrZy5sZW5ndGg7d3JpdGVQbmdDaHVuaygiSURBVEEiLG0sdix5KTt5Kz0xMittLmxlbmd0aDt3cml0ZVBuZ0NodW5rKCJJRU5EIixuZXcgVWludDhBcnJheSgwKSx2LHkpO3JldHVybiBjcmVhdGVPYmplY3RVUkwodiwiaW1hZ2UvcG5nIixpKX1yZXR1cm4gZnVuY3Rpb24gY29udmVydEltZ0RhdGFUb1BuZyh0LGUsbil7cmV0dXJuIGVuY29kZSh0LHZvaWQgMD09PXQua2luZD9yLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDp0LmtpbmQsZSxuKX19KCk7Y2xhc3MgU1ZHRXh0cmFTdGF0ZXtjb25zdHJ1Y3Rvcigpe3RoaXMuZm9udFNpemVTY2FsZT0xO3RoaXMuZm9udFdlaWdodD1hO3RoaXMuZm9udFNpemU9MDt0aGlzLnRleHRNYXRyaXg9ci5JREVOVElUWV9NQVRSSVg7dGhpcy5mb250TWF0cml4PXIuRk9OVF9JREVOVElUWV9NQVRSSVg7dGhpcy5sZWFkaW5nPTA7dGhpcy50ZXh0UmVuZGVyaW5nTW9kZT1yLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7dGhpcy50ZXh0TWF0cml4U2NhbGU9MTt0aGlzLng9MDt0aGlzLnk9MDt0aGlzLmxpbmVYPTA7dGhpcy5saW5lWT0wO3RoaXMuY2hhclNwYWNpbmc9MDt0aGlzLndvcmRTcGFjaW5nPTA7dGhpcy50ZXh0SFNjYWxlPTE7dGhpcy50ZXh0UmlzZT0wO3RoaXMuZmlsbENvbG9yPW87dGhpcy5zdHJva2VDb2xvcj0iIzAwMDAwMCI7dGhpcy5maWxsQWxwaGE9MTt0aGlzLnN0cm9rZUFscGhhPTE7dGhpcy5saW5lV2lkdGg9MTt0aGlzLmxpbmVKb2luPSIiO3RoaXMubGluZUNhcD0iIjt0aGlzLm1pdGVyTGltaXQ9MDt0aGlzLmRhc2hBcnJheT1bXTt0aGlzLmRhc2hQaGFzZT0wO3RoaXMuZGVwZW5kZW5jaWVzPVtdO3RoaXMuYWN0aXZlQ2xpcFVybD1udWxsO3RoaXMuY2xpcEdyb3VwPW51bGw7dGhpcy5tYXNrSWQ9IiJ9Y2xvbmUoKXtyZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKX1zZXRDdXJyZW50UG9pbnQodCxlKXt0aGlzLng9dDt0aGlzLnk9ZX19ZnVuY3Rpb24gcGYodCl7aWYoTnVtYmVyLmlzSW50ZWdlcih0KSlyZXR1cm4gdC50b1N0cmluZygpO2NvbnN0IGU9dC50b0ZpeGVkKDEwKTtsZXQgbj1lLmxlbmd0aC0xO2lmKCIwIiE9PWVbbl0pcmV0dXJuIGU7ZG97bi0tfXdoaWxlKCIwIj09PWVbbl0pO3JldHVybiBlLnN1YnN0cmluZygwLCIuIj09PWVbbl0/bjpuKzEpfWZ1bmN0aW9uIHBtKHQpe2lmKDA9PT10WzRdJiYwPT09dFs1XSl7aWYoMD09PXRbMV0mJjA9PT10WzJdKXJldHVybiAxPT09dFswXSYmMT09PXRbM10/IiI6YHNjYWxlKCR7cGYodFswXSl9ICR7cGYodFszXSl9KWA7aWYodFswXT09PXRbM10mJnRbMV09PT0tdFsyXSl7cmV0dXJuYHJvdGF0ZSgke3BmKDE4MCpNYXRoLmFjb3ModFswXSkvTWF0aC5QSSl9KWB9fWVsc2UgaWYoMT09PXRbMF0mJjA9PT10WzFdJiYwPT09dFsyXSYmMT09PXRbM10pcmV0dXJuYHRyYW5zbGF0ZSgke3BmKHRbNF0pfSAke3BmKHRbNV0pfSlgO3JldHVybmBtYXRyaXgoJHtwZih0WzBdKX0gJHtwZih0WzFdKX0gJHtwZih0WzJdKX0gJHtwZih0WzNdKX0gJHtwZih0WzRdKX0gJHtwZih0WzVdKX0pYH1sZXQgZD0wLHU9MCxwPTA7ZS5TVkdHcmFwaGljcz1jbGFzcyBTVkdHcmFwaGljc3tjb25zdHJ1Y3Rvcih0LGUpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07KDAsaS5kZXByZWNhdGVkKSgiVGhlIFNWRyBiYWNrLWVuZCBpcyBubyBsb25nZXIgbWFpbnRhaW5lZCBhbmQgKm1heSogYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiIpO3RoaXMuc3ZnRmFjdG9yeT1uZXcgaS5ET01TVkdGYWN0b3J5O3RoaXMuY3VycmVudD1uZXcgU1ZHRXh0cmFTdGF0ZTt0aGlzLnRyYW5zZm9ybU1hdHJpeD1yLklERU5USVRZX01BVFJJWDt0aGlzLnRyYW5zZm9ybVN0YWNrPVtdO3RoaXMuZXh0cmFTdGFjaz1bXTt0aGlzLmNvbW1vbk9ianM9dDt0aGlzLm9ianM9ZTt0aGlzLnBlbmRpbmdDbGlwPW51bGw7dGhpcy5wZW5kaW5nRU9GaWxsPSExO3RoaXMuZW1iZWRGb250cz0hMTt0aGlzLmVtYmVkZGVkRm9udHM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmNzc1N0eWxlPW51bGw7dGhpcy5mb3JjZURhdGFTY2hlbWE9ISFuO3RoaXMuX29wZXJhdG9ySWRNYXBwaW5nPVtdO2Zvcihjb25zdCB0IGluIHIuT1BTKXRoaXMuX29wZXJhdG9ySWRNYXBwaW5nW3IuT1BTW3RdXT10fWdldE9iamVjdCh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/dC5zdGFydHNXaXRoKCJnXyIpP3RoaXMuY29tbW9uT2Jqcy5nZXQodCk6dGhpcy5vYmpzLmdldCh0KTplfXNhdmUoKXt0aGlzLnRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy50cmFuc2Zvcm1NYXRyaXgpO2NvbnN0IHQ9dGhpcy5jdXJyZW50O3RoaXMuZXh0cmFTdGFjay5wdXNoKHQpO3RoaXMuY3VycmVudD10LmNsb25lKCl9cmVzdG9yZSgpe3RoaXMudHJhbnNmb3JtTWF0cml4PXRoaXMudHJhbnNmb3JtU3RhY2sucG9wKCk7dGhpcy5jdXJyZW50PXRoaXMuZXh0cmFTdGFjay5wb3AoKTt0aGlzLnBlbmRpbmdDbGlwPW51bGw7dGhpcy50Z3JwPW51bGx9Z3JvdXAodCl7dGhpcy5zYXZlKCk7dGhpcy5leGVjdXRlT3BUcmVlKHQpO3RoaXMucmVzdG9yZSgpfWxvYWREZXBlbmRlbmNpZXModCl7Y29uc3QgZT10LmZuQXJyYXksbj10LmFyZ3NBcnJheTtmb3IobGV0IHQ9MCxpPWUubGVuZ3RoO3Q8aTt0KyspaWYoZVt0XT09PXIuT1BTLmRlcGVuZGVuY3kpZm9yKGNvbnN0IGUgb2Ygblt0XSl7Y29uc3QgdD1lLnN0YXJ0c1dpdGgoImdfIik/dGhpcy5jb21tb25PYmpzOnRoaXMub2JqcyxuPW5ldyBQcm9taXNlKChuPT57dC5nZXQoZSxuKX0pKTt0aGlzLmN1cnJlbnQuZGVwZW5kZW5jaWVzLnB1c2gobil9cmV0dXJuIFByb21pc2UuYWxsKHRoaXMuY3VycmVudC5kZXBlbmRlbmNpZXMpfXRyYW5zZm9ybSh0LGUsbixpLHMsYSl7Y29uc3Qgbz1bdCxlLG4saSxzLGFdO3RoaXMudHJhbnNmb3JtTWF0cml4PXIuVXRpbC50cmFuc2Zvcm0odGhpcy50cmFuc2Zvcm1NYXRyaXgsbyk7dGhpcy50Z3JwPW51bGx9Z2V0U1ZHKHQsZSl7dGhpcy52aWV3cG9ydD1lO2NvbnN0IG49dGhpcy5faW5pdGlhbGl6ZShlKTtyZXR1cm4gdGhpcy5sb2FkRGVwZW5kZW5jaWVzKHQpLnRoZW4oKCgpPT57dGhpcy50cmFuc2Zvcm1NYXRyaXg9ci5JREVOVElUWV9NQVRSSVg7dGhpcy5leGVjdXRlT3BUcmVlKHRoaXMuY29udmVydE9wTGlzdCh0KSk7cmV0dXJuIG59KSl9Y29udmVydE9wTGlzdCh0KXtjb25zdCBlPXRoaXMuX29wZXJhdG9ySWRNYXBwaW5nLG49dC5hcmdzQXJyYXksaT10LmZuQXJyYXkscj1bXTtmb3IobGV0IHQ9MCxzPWkubGVuZ3RoO3Q8czt0Kyspe2NvbnN0IHM9aVt0XTtyLnB1c2goe2ZuSWQ6cyxmbjplW3NdLGFyZ3M6blt0XX0pfXJldHVybiBmdW5jdGlvbiBvcExpc3RUb1RyZWUodCl7bGV0IGU9W107Y29uc3Qgbj1bXTtmb3IoY29uc3QgaSBvZiB0KWlmKCJzYXZlIiE9PWkuZm4pInJlc3RvcmUiPT09aS5mbj9lPW4ucG9wKCk6ZS5wdXNoKGkpO2Vsc2V7ZS5wdXNoKHtmbklkOjkyLGZuOiJncm91cCIsaXRlbXM6W119KTtuLnB1c2goZSk7ZT1lLmF0KC0xKS5pdGVtc31yZXR1cm4gZX0ocil9ZXhlY3V0ZU9wVHJlZSh0KXtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PWUuZm4sbj1lLmZuSWQsaT1lLmFyZ3M7c3dpdGNoKDB8bil7Y2FzZSByLk9QUy5iZWdpblRleHQ6dGhpcy5iZWdpblRleHQoKTticmVhaztjYXNlIHIuT1BTLmRlcGVuZGVuY3k6YnJlYWs7Y2FzZSByLk9QUy5zZXRMZWFkaW5nOnRoaXMuc2V0TGVhZGluZyhpKTticmVhaztjYXNlIHIuT1BTLnNldExlYWRpbmdNb3ZlVGV4dDp0aGlzLnNldExlYWRpbmdNb3ZlVGV4dChpWzBdLGlbMV0pO2JyZWFrO2Nhc2Ugci5PUFMuc2V0Rm9udDp0aGlzLnNldEZvbnQoaSk7YnJlYWs7Y2FzZSByLk9QUy5zaG93VGV4dDpjYXNlIHIuT1BTLnNob3dTcGFjZWRUZXh0OnRoaXMuc2hvd1RleHQoaVswXSk7YnJlYWs7Y2FzZSByLk9QUy5lbmRUZXh0OnRoaXMuZW5kVGV4dCgpO2JyZWFrO2Nhc2Ugci5PUFMubW92ZVRleHQ6dGhpcy5tb3ZlVGV4dChpWzBdLGlbMV0pO2JyZWFrO2Nhc2Ugci5PUFMuc2V0Q2hhclNwYWNpbmc6dGhpcy5zZXRDaGFyU3BhY2luZyhpWzBdKTticmVhaztjYXNlIHIuT1BTLnNldFdvcmRTcGFjaW5nOnRoaXMuc2V0V29yZFNwYWNpbmcoaVswXSk7YnJlYWs7Y2FzZSByLk9QUy5zZXRIU2NhbGU6dGhpcy5zZXRIU2NhbGUoaVswXSk7YnJlYWs7Y2FzZSByLk9QUy5zZXRUZXh0TWF0cml4OnRoaXMuc2V0VGV4dE1hdHJpeChpWzBdLGlbMV0saVsyXSxpWzNdLGlbNF0saVs1XSk7YnJlYWs7Y2FzZSByLk9QUy5zZXRUZXh0UmlzZTp0aGlzLnNldFRleHRSaXNlKGlbMF0pO2JyZWFrO2Nhc2Ugci5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6dGhpcy5zZXRUZXh0UmVuZGVyaW5nTW9kZShpWzBdKTticmVhaztjYXNlIHIuT1BTLnNldExpbmVXaWR0aDp0aGlzLnNldExpbmVXaWR0aChpWzBdKTticmVhaztjYXNlIHIuT1BTLnNldExpbmVKb2luOnRoaXMuc2V0TGluZUpvaW4oaVswXSk7YnJlYWs7Y2FzZSByLk9QUy5zZXRMaW5lQ2FwOnRoaXMuc2V0TGluZUNhcChpWzBdKTticmVhaztjYXNlIHIuT1BTLnNldE1pdGVyTGltaXQ6dGhpcy5zZXRNaXRlckxpbWl0KGlbMF0pO2JyZWFrO2Nhc2Ugci5PUFMuc2V0RmlsbFJHQkNvbG9yOnRoaXMuc2V0RmlsbFJHQkNvbG9yKGlbMF0saVsxXSxpWzJdKTticmVhaztjYXNlIHIuT1BTLnNldFN0cm9rZVJHQkNvbG9yOnRoaXMuc2V0U3Ryb2tlUkdCQ29sb3IoaVswXSxpWzFdLGlbMl0pO2JyZWFrO2Nhc2Ugci5PUFMuc2V0U3Ryb2tlQ29sb3JOOnRoaXMuc2V0U3Ryb2tlQ29sb3JOKGkpO2JyZWFrO2Nhc2Ugci5PUFMuc2V0RmlsbENvbG9yTjp0aGlzLnNldEZpbGxDb2xvck4oaSk7YnJlYWs7Y2FzZSByLk9QUy5zaGFkaW5nRmlsbDp0aGlzLnNoYWRpbmdGaWxsKGlbMF0pO2JyZWFrO2Nhc2Ugci5PUFMuc2V0RGFzaDp0aGlzLnNldERhc2goaVswXSxpWzFdKTticmVhaztjYXNlIHIuT1BTLnNldFJlbmRlcmluZ0ludGVudDp0aGlzLnNldFJlbmRlcmluZ0ludGVudChpWzBdKTticmVhaztjYXNlIHIuT1BTLnNldEZsYXRuZXNzOnRoaXMuc2V0RmxhdG5lc3MoaVswXSk7YnJlYWs7Y2FzZSByLk9QUy5zZXRHU3RhdGU6dGhpcy5zZXRHU3RhdGUoaVswXSk7YnJlYWs7Y2FzZSByLk9QUy5maWxsOnRoaXMuZmlsbCgpO2JyZWFrO2Nhc2Ugci5PUFMuZW9GaWxsOnRoaXMuZW9GaWxsKCk7YnJlYWs7Y2FzZSByLk9QUy5zdHJva2U6dGhpcy5zdHJva2UoKTticmVhaztjYXNlIHIuT1BTLmZpbGxTdHJva2U6dGhpcy5maWxsU3Ryb2tlKCk7YnJlYWs7Y2FzZSByLk9QUy5lb0ZpbGxTdHJva2U6dGhpcy5lb0ZpbGxTdHJva2UoKTticmVhaztjYXNlIHIuT1BTLmNsaXA6dGhpcy5jbGlwKCJub256ZXJvIik7YnJlYWs7Y2FzZSByLk9QUy5lb0NsaXA6dGhpcy5jbGlwKCJldmVub2RkIik7YnJlYWs7Y2FzZSByLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6dGhpcy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKTticmVhaztjYXNlIHIuT1BTLnBhaW50SW1hZ2VYT2JqZWN0OnRoaXMucGFpbnRJbWFnZVhPYmplY3QoaVswXSk7YnJlYWs7Y2FzZSByLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdDp0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGlbMF0pO2JyZWFrO2Nhc2Ugci5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OnRoaXMucGFpbnRJbWFnZU1hc2tYT2JqZWN0KGlbMF0pO2JyZWFrO2Nhc2Ugci5PUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luOnRoaXMucGFpbnRGb3JtWE9iamVjdEJlZ2luKGlbMF0saVsxXSk7YnJlYWs7Y2FzZSByLk9QUy5wYWludEZvcm1YT2JqZWN0RW5kOnRoaXMucGFpbnRGb3JtWE9iamVjdEVuZCgpO2JyZWFrO2Nhc2Ugci5PUFMuY2xvc2VQYXRoOnRoaXMuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSByLk9QUy5jbG9zZVN0cm9rZTp0aGlzLmNsb3NlU3Ryb2tlKCk7YnJlYWs7Y2FzZSByLk9QUy5jbG9zZUZpbGxTdHJva2U6dGhpcy5jbG9zZUZpbGxTdHJva2UoKTticmVhaztjYXNlIHIuT1BTLmNsb3NlRU9GaWxsU3Ryb2tlOnRoaXMuY2xvc2VFT0ZpbGxTdHJva2UoKTticmVhaztjYXNlIHIuT1BTLm5leHRMaW5lOnRoaXMubmV4dExpbmUoKTticmVhaztjYXNlIHIuT1BTLnRyYW5zZm9ybTp0aGlzLnRyYW5zZm9ybShpWzBdLGlbMV0saVsyXSxpWzNdLGlbNF0saVs1XSk7YnJlYWs7Y2FzZSByLk9QUy5jb25zdHJ1Y3RQYXRoOnRoaXMuY29uc3RydWN0UGF0aChpWzBdLGlbMV0pO2JyZWFrO2Nhc2Ugci5PUFMuZW5kUGF0aDp0aGlzLmVuZFBhdGgoKTticmVhaztjYXNlIDkyOnRoaXMuZ3JvdXAoZS5pdGVtcyk7YnJlYWs7ZGVmYXVsdDooMCxyLndhcm4pKGBVbmltcGxlbWVudGVkIG9wZXJhdG9yICR7dH1gKX19fXNldFdvcmRTcGFjaW5nKHQpe3RoaXMuY3VycmVudC53b3JkU3BhY2luZz10fXNldENoYXJTcGFjaW5nKHQpe3RoaXMuY3VycmVudC5jaGFyU3BhY2luZz10fW5leHRMaW5lKCl7dGhpcy5tb3ZlVGV4dCgwLHRoaXMuY3VycmVudC5sZWFkaW5nKX1zZXRUZXh0TWF0cml4KHQsZSxuLGkscixzKXtjb25zdCBhPXRoaXMuY3VycmVudDthLnRleHRNYXRyaXg9YS5saW5lTWF0cml4PVt0LGUsbixpLHIsc107YS50ZXh0TWF0cml4U2NhbGU9TWF0aC5oeXBvdCh0LGUpO2EueD1hLmxpbmVYPTA7YS55PWEubGluZVk9MDthLnhjb29yZHM9W107YS55Y29vcmRzPVtdO2EudHNwYW49dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0c3BhbiIpO2EudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC1mYW1pbHkiLGEuZm9udEZhbWlseSk7YS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LXNpemUiLGAke3BmKGEuZm9udFNpemUpfXB4YCk7YS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixwZigtYS55KSk7YS50eHRFbGVtZW50PXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dGV4dCIpO2EudHh0RWxlbWVudC5hcHBlbmQoYS50c3Bhbil9YmVnaW5UZXh0KCl7Y29uc3QgdD10aGlzLmN1cnJlbnQ7dC54PXQubGluZVg9MDt0Lnk9dC5saW5lWT0wO3QudGV4dE1hdHJpeD1yLklERU5USVRZX01BVFJJWDt0LmxpbmVNYXRyaXg9ci5JREVOVElUWV9NQVRSSVg7dC50ZXh0TWF0cml4U2NhbGU9MTt0LnRzcGFuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dHNwYW4iKTt0LnR4dEVsZW1lbnQ9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2Zzp0ZXh0Iik7dC50eHRncnA9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpnIik7dC54Y29vcmRzPVtdO3QueWNvb3Jkcz1bXX1tb3ZlVGV4dCh0LGUpe2NvbnN0IG49dGhpcy5jdXJyZW50O24ueD1uLmxpbmVYKz10O24ueT1uLmxpbmVZKz1lO24ueGNvb3Jkcz1bXTtuLnljb29yZHM9W107bi50c3Bhbj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRzcGFuIik7bi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LWZhbWlseSIsbi5mb250RmFtaWx5KTtuLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZvbnQtc2l6ZSIsYCR7cGYobi5mb250U2l6ZSl9cHhgKTtuLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLHBmKC1uLnkpKX1zaG93VGV4dCh0KXtjb25zdCBlPXRoaXMuY3VycmVudCxuPWUuZm9udCxpPWUuZm9udFNpemU7aWYoMD09PWkpcmV0dXJuO2NvbnN0IGw9ZS5mb250U2l6ZVNjYWxlLGM9ZS5jaGFyU3BhY2luZyxoPWUud29yZFNwYWNpbmcsZD1lLmZvbnREaXJlY3Rpb24sdT1lLnRleHRIU2NhbGUqZCxwPW4udmVydGljYWwsZj1wPzE6LTEsZz1uLmRlZmF1bHRWTWV0cmljcyxtPWkqZS5mb250TWF0cml4WzBdO2xldCBiPTA7Zm9yKGNvbnN0IHIgb2YgdCl7aWYobnVsbD09PXIpe2IrPWQqaDtjb250aW51ZX1pZigibnVtYmVyIj09dHlwZW9mIHIpe2IrPWYqcippLzFlMztjb250aW51ZX1jb25zdCB0PShyLmlzU3BhY2U/aDowKStjLHM9ci5mb250Q2hhcjtsZXQgYSxvLHU9ci53aWR0aDtpZihwKXtsZXQgdDtjb25zdCBlPXIudm1ldHJpY3x8Zzt0PXIudm1ldHJpYz9lWzFdOi41KnU7dD0tdCptO2NvbnN0IG49ZVsyXSptO3U9ZT8tZVswXTp1O2E9dC9sO289KGIrbikvbH1lbHNle2E9Yi9sO289MH1pZihyLmlzSW5Gb250fHxuLm1pc3NpbmdGaWxlKXtlLnhjb29yZHMucHVzaChlLngrYSk7cCYmZS55Y29vcmRzLnB1c2goLWUueStvKTtlLnRzcGFuLnRleHRDb250ZW50Kz1zfWIrPXA/dSptLXQqZDp1Km0rdCpkfWUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwieCIsZS54Y29vcmRzLm1hcChwZikuam9pbigiICIpKTtwP2UudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwieSIsZS55Y29vcmRzLm1hcChwZikuam9pbigiICIpKTplLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLHBmKC1lLnkpKTtwP2UueS09YjplLngrPWIqdTtlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZvbnQtZmFtaWx5IixlLmZvbnRGYW1pbHkpO2UudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZm9udC1zaXplIixgJHtwZihlLmZvbnRTaXplKX1weGApO2UuZm9udFN0eWxlIT09cyYmZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LXN0eWxlIixlLmZvbnRTdHlsZSk7ZS5mb250V2VpZ2h0IT09YSYmZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmb250LXdlaWdodCIsZS5mb250V2VpZ2h0KTtjb25zdCB2PWUudGV4dFJlbmRlcmluZ01vZGUmci5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO2lmKHY9PT1yLlRleHRSZW5kZXJpbmdNb2RlLkZJTEx8fHY9PT1yLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKXtlLmZpbGxDb2xvciE9PW8mJmUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsZS5maWxsQ29sb3IpO2UuZmlsbEFscGhhPDEmJmUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbC1vcGFjaXR5IixlLmZpbGxBbHBoYSl9ZWxzZSBlLnRleHRSZW5kZXJpbmdNb2RlPT09ci5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSD9lLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLCJ0cmFuc3BhcmVudCIpOmUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsIm5vbmUiKTtpZih2PT09ci5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0V8fHY9PT1yLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKXtjb25zdCB0PTEvKGUudGV4dE1hdHJpeFNjYWxlfHwxKTt0aGlzLl9zZXRTdHJva2VBdHRyaWJ1dGVzKGUudHNwYW4sdCl9bGV0IHk9ZS50ZXh0TWF0cml4O2lmKDAhPT1lLnRleHRSaXNlKXt5PXkuc2xpY2UoKTt5WzVdKz1lLnRleHRSaXNlfWUudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0cmFuc2Zvcm0iLGAke3BtKHkpfSBzY2FsZSgke3BmKHUpfSwgLTEpYCk7ZS50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLCJ4bWw6c3BhY2UiLCJwcmVzZXJ2ZSIpO2UudHh0RWxlbWVudC5hcHBlbmQoZS50c3Bhbik7ZS50eHRncnAuYXBwZW5kKGUudHh0RWxlbWVudCk7dGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQoZS50eHRFbGVtZW50KX1zZXRMZWFkaW5nTW92ZVRleHQodCxlKXt0aGlzLnNldExlYWRpbmcoLWUpO3RoaXMubW92ZVRleHQodCxlKX1hZGRGb250U3R5bGUodCl7aWYoIXQuZGF0YSl0aHJvdyBuZXcgRXJyb3IoJ2FkZEZvbnRTdHlsZTogTm8gZm9udCBkYXRhIGF2YWlsYWJsZSwgZW5zdXJlIHRoYXQgdGhlICJmb250RXh0cmFQcm9wZXJ0aWVzIiBBUEkgcGFyYW1ldGVyIGlzIHNldC4nKTtpZighdGhpcy5jc3NTdHlsZSl7dGhpcy5jc3NTdHlsZT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnN0eWxlIik7dGhpcy5jc3NTdHlsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ0eXBlIiwidGV4dC9jc3MiKTt0aGlzLmRlZnMuYXBwZW5kKHRoaXMuY3NzU3R5bGUpfWNvbnN0IGU9Y3JlYXRlT2JqZWN0VVJMKHQuZGF0YSx0Lm1pbWV0eXBlLHRoaXMuZm9yY2VEYXRhU2NoZW1hKTt0aGlzLmNzc1N0eWxlLnRleHRDb250ZW50Kz1gQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiAiJHt0LmxvYWRlZE5hbWV9Ijsgc3JjOiB1cmwoJHtlfSk7IH1cbmB9c2V0Rm9udCh0KXtjb25zdCBlPXRoaXMuY3VycmVudCxuPXRoaXMuY29tbW9uT2Jqcy5nZXQodFswXSk7bGV0IGk9dFsxXTtlLmZvbnQ9bjtpZih0aGlzLmVtYmVkRm9udHMmJiFuLm1pc3NpbmdGaWxlJiYhdGhpcy5lbWJlZGRlZEZvbnRzW24ubG9hZGVkTmFtZV0pe3RoaXMuYWRkRm9udFN0eWxlKG4pO3RoaXMuZW1iZWRkZWRGb250c1tuLmxvYWRlZE5hbWVdPW59ZS5mb250TWF0cml4PW4uZm9udE1hdHJpeHx8ci5GT05UX0lERU5USVRZX01BVFJJWDtsZXQgcz0ibm9ybWFsIjtuLmJsYWNrP3M9IjkwMCI6bi5ib2xkJiYocz0iYm9sZCIpO2NvbnN0IGE9bi5pdGFsaWM/Iml0YWxpYyI6Im5vcm1hbCI7aWYoaTwwKXtpPS1pO2UuZm9udERpcmVjdGlvbj0tMX1lbHNlIGUuZm9udERpcmVjdGlvbj0xO2UuZm9udFNpemU9aTtlLmZvbnRGYW1pbHk9bi5sb2FkZWROYW1lO2UuZm9udFdlaWdodD1zO2UuZm9udFN0eWxlPWE7ZS50c3Bhbj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnRzcGFuIik7ZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IixwZigtZS55KSk7ZS54Y29vcmRzPVtdO2UueWNvb3Jkcz1bXX1lbmRUZXh0KCl7Y29uc3QgdD10aGlzLmN1cnJlbnQ7aWYodC50ZXh0UmVuZGVyaW5nTW9kZSZyLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcmJnQudHh0RWxlbWVudD8uaGFzQ2hpbGROb2RlcygpKXt0LmVsZW1lbnQ9dC50eHRFbGVtZW50O3RoaXMuY2xpcCgibm9uemVybyIpO3RoaXMuZW5kUGF0aCgpfX1zZXRMaW5lV2lkdGgodCl7dD4wJiYodGhpcy5jdXJyZW50LmxpbmVXaWR0aD10KX1zZXRMaW5lQ2FwKHQpe3RoaXMuY3VycmVudC5saW5lQ2FwPWxbdF19c2V0TGluZUpvaW4odCl7dGhpcy5jdXJyZW50LmxpbmVKb2luPWNbdF19c2V0TWl0ZXJMaW1pdCh0KXt0aGlzLmN1cnJlbnQubWl0ZXJMaW1pdD10fXNldFN0cm9rZUFscGhhKHQpe3RoaXMuY3VycmVudC5zdHJva2VBbHBoYT10fXNldFN0cm9rZVJHQkNvbG9yKHQsZSxuKXt0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I9ci5VdGlsLm1ha2VIZXhDb2xvcih0LGUsbil9c2V0RmlsbEFscGhhKHQpe3RoaXMuY3VycmVudC5maWxsQWxwaGE9dH1zZXRGaWxsUkdCQ29sb3IodCxlLG4pe3RoaXMuY3VycmVudC5maWxsQ29sb3I9ci5VdGlsLm1ha2VIZXhDb2xvcih0LGUsbik7dGhpcy5jdXJyZW50LnRzcGFuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6dHNwYW4iKTt0aGlzLmN1cnJlbnQueGNvb3Jkcz1bXTt0aGlzLmN1cnJlbnQueWNvb3Jkcz1bXX1zZXRTdHJva2VDb2xvck4odCl7dGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yPXRoaXMuX21ha2VDb2xvck5fUGF0dGVybih0KX1zZXRGaWxsQ29sb3JOKHQpe3RoaXMuY3VycmVudC5maWxsQ29sb3I9dGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKHQpfXNoYWRpbmdGaWxsKHQpe2NvbnN0e3dpZHRoOmUsaGVpZ2h0Om59PXRoaXMudmlld3BvcnQsaT1yLlV0aWwuaW52ZXJzZVRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybU1hdHJpeCksW3MsYSxvLGxdPXIuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwwLGUsbl0saSksYz10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTtjLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLHMpO2Muc2V0QXR0cmlidXRlTlMobnVsbCwieSIsYSk7Yy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIsby1zKTtjLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIsbC1hKTtjLnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLHRoaXMuX21ha2VTaGFkaW5nUGF0dGVybih0KSk7dGhpcy5jdXJyZW50LmZpbGxBbHBoYTwxJiZjLnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwtb3BhY2l0eSIsdGhpcy5jdXJyZW50LmZpbGxBbHBoYSk7dGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQoYyl9X21ha2VDb2xvck5fUGF0dGVybih0KXtyZXR1cm4iVGlsaW5nUGF0dGVybiI9PT10WzBdP3RoaXMuX21ha2VUaWxpbmdQYXR0ZXJuKHQpOnRoaXMuX21ha2VTaGFkaW5nUGF0dGVybih0KX1fbWFrZVRpbGluZ1BhdHRlcm4odCl7Y29uc3QgZT10WzFdLG49dFsyXSxpPXRbM118fHIuSURFTlRJVFlfTUFUUklYLFtzLGEsbyxsXT10WzRdLGM9dFs1XSxoPXRbNl0sZD10WzddLHU9InNoYWRpbmciK3ArKyxbZixnLG0sYl09ci5VdGlsLm5vcm1hbGl6ZVJlY3QoWy4uLnIuVXRpbC5hcHBseVRyYW5zZm9ybShbcyxhXSxpKSwuLi5yLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW28sbF0saSldKSxbdix5XT1yLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoaSksQT1jKnYsXz1oKnksUz10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnBhdHRlcm4iKTtTLnNldEF0dHJpYnV0ZU5TKG51bGwsImlkIix1KTtTLnNldEF0dHJpYnV0ZU5TKG51bGwsInBhdHRlcm5Vbml0cyIsInVzZXJTcGFjZU9uVXNlIik7Uy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIsQSk7Uy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLF8pO1Muc2V0QXR0cmlidXRlTlMobnVsbCwieCIsYCR7Zn1gKTtTLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLGAke2d9YCk7Y29uc3QgRT10aGlzLnN2Zyx4PXRoaXMudHJhbnNmb3JtTWF0cml4LHc9dGhpcy5jdXJyZW50LmZpbGxDb2xvcixDPXRoaXMuY3VycmVudC5zdHJva2VDb2xvcixUPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUobS1mLGItZyk7dGhpcy5zdmc9VDt0aGlzLnRyYW5zZm9ybU1hdHJpeD1pO2lmKDI9PT1kKXtjb25zdCB0PXIuVXRpbC5tYWtlSGV4Q29sb3IoLi4uZSk7dGhpcy5jdXJyZW50LmZpbGxDb2xvcj10O3RoaXMuY3VycmVudC5zdHJva2VDb2xvcj10fXRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3QobikpO3RoaXMuc3ZnPUU7dGhpcy50cmFuc2Zvcm1NYXRyaXg9eDt0aGlzLmN1cnJlbnQuZmlsbENvbG9yPXc7dGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yPUM7Uy5hcHBlbmQoVC5jaGlsZE5vZGVzWzBdKTt0aGlzLmRlZnMuYXBwZW5kKFMpO3JldHVybmB1cmwoIyR7dX0pYH1fbWFrZVNoYWRpbmdQYXR0ZXJuKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5vYmpzLmdldCh0KSk7c3dpdGNoKHRbMF0pe2Nhc2UiUmFkaWFsQXhpYWwiOmNvbnN0IGU9InNoYWRpbmciK3ArKyxuPXRbM107bGV0IGk7c3dpdGNoKHRbMV0pe2Nhc2UiYXhpYWwiOmNvbnN0IG49dFs0XSxyPXRbNV07aT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmxpbmVhckdyYWRpZW50Iik7aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJpZCIsZSk7aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJncmFkaWVudFVuaXRzIiwidXNlclNwYWNlT25Vc2UiKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsIngxIixuWzBdKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsInkxIixuWzFdKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsIngyIixyWzBdKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsInkyIixyWzFdKTticmVhaztjYXNlInJhZGlhbCI6Y29uc3Qgcz10WzRdLGE9dFs1XSxvPXRbNl0sbD10WzddO2k9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyYWRpYWxHcmFkaWVudCIpO2kuc2V0QXR0cmlidXRlTlMobnVsbCwiaWQiLGUpO2kuc2V0QXR0cmlidXRlTlMobnVsbCwiZ3JhZGllbnRVbml0cyIsInVzZXJTcGFjZU9uVXNlIik7aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjeCIsYVswXSk7aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjeSIsYVsxXSk7aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJyIixsKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsImZ4IixzWzBdKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsImZ5IixzWzFdKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsImZyIixvKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBSYWRpYWxBeGlhbCB0eXBlOiAke3RbMV19YCl9Zm9yKGNvbnN0IHQgb2Ygbil7Y29uc3QgZT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnN0b3AiKTtlLnNldEF0dHJpYnV0ZU5TKG51bGwsIm9mZnNldCIsdFswXSk7ZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdG9wLWNvbG9yIix0WzFdKTtpLmFwcGVuZChlKX10aGlzLmRlZnMuYXBwZW5kKGkpO3JldHVybmB1cmwoIyR7ZX0pYDtjYXNlIk1lc2giOigwLHIud2FybikoIlVuaW1wbGVtZW50ZWQgcGF0dGVybiBNZXNoIik7cmV0dXJuIG51bGw7Y2FzZSJEdW1teSI6cmV0dXJuImhvdHBpbmsiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIElSIHR5cGU6ICR7dFswXX1gKX19c2V0RGFzaCh0LGUpe3RoaXMuY3VycmVudC5kYXNoQXJyYXk9dDt0aGlzLmN1cnJlbnQuZGFzaFBoYXNlPWV9Y29uc3RydWN0UGF0aCh0LGUpe2NvbnN0IG49dGhpcy5jdXJyZW50O2xldCBpPW4ueCxzPW4ueSxhPVtdLG89MDtmb3IoY29uc3QgbiBvZiB0KXN3aXRjaCgwfG4pe2Nhc2Ugci5PUFMucmVjdGFuZ2xlOmk9ZVtvKytdO3M9ZVtvKytdO2NvbnN0IHQ9aStlW28rK10sbj1zK2VbbysrXTthLnB1c2goIk0iLHBmKGkpLHBmKHMpLCJMIixwZih0KSxwZihzKSwiTCIscGYodCkscGYobiksIkwiLHBmKGkpLHBmKG4pLCJaIik7YnJlYWs7Y2FzZSByLk9QUy5tb3ZlVG86aT1lW28rK107cz1lW28rK107YS5wdXNoKCJNIixwZihpKSxwZihzKSk7YnJlYWs7Y2FzZSByLk9QUy5saW5lVG86aT1lW28rK107cz1lW28rK107YS5wdXNoKCJMIixwZihpKSxwZihzKSk7YnJlYWs7Y2FzZSByLk9QUy5jdXJ2ZVRvOmk9ZVtvKzRdO3M9ZVtvKzVdO2EucHVzaCgiQyIscGYoZVtvXSkscGYoZVtvKzFdKSxwZihlW28rMl0pLHBmKGVbbyszXSkscGYoaSkscGYocykpO28rPTY7YnJlYWs7Y2FzZSByLk9QUy5jdXJ2ZVRvMjphLnB1c2goIkMiLHBmKGkpLHBmKHMpLHBmKGVbb10pLHBmKGVbbysxXSkscGYoZVtvKzJdKSxwZihlW28rM10pKTtpPWVbbysyXTtzPWVbbyszXTtvKz00O2JyZWFrO2Nhc2Ugci5PUFMuY3VydmVUbzM6aT1lW28rMl07cz1lW28rM107YS5wdXNoKCJDIixwZihlW29dKSxwZihlW28rMV0pLHBmKGkpLHBmKHMpLHBmKGkpLHBmKHMpKTtvKz00O2JyZWFrO2Nhc2Ugci5PUFMuY2xvc2VQYXRoOmEucHVzaCgiWiIpfWE9YS5qb2luKCIgIik7aWYobi5wYXRoJiZ0Lmxlbmd0aD4wJiZ0WzBdIT09ci5PUFMucmVjdGFuZ2xlJiZ0WzBdIT09ci5PUFMubW92ZVRvKWE9bi5wYXRoLmdldEF0dHJpYnV0ZU5TKG51bGwsImQiKSthO2Vsc2V7bi5wYXRoPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cGF0aCIpO3RoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKG4ucGF0aCl9bi5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsImQiLGEpO24ucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsIiwibm9uZSIpO24uZWxlbWVudD1uLnBhdGg7bi5zZXRDdXJyZW50UG9pbnQoaSxzKX1lbmRQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnJlbnQ7dC5wYXRoPW51bGw7aWYoIXRoaXMucGVuZGluZ0NsaXApcmV0dXJuO2lmKCF0LmVsZW1lbnQpe3RoaXMucGVuZGluZ0NsaXA9bnVsbDtyZXR1cm59Y29uc3QgZT0iY2xpcHBhdGgiK2QrKyxuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6Y2xpcFBhdGgiKTtuLnNldEF0dHJpYnV0ZU5TKG51bGwsImlkIixlKTtuLnNldEF0dHJpYnV0ZU5TKG51bGwsInRyYW5zZm9ybSIscG0odGhpcy50cmFuc2Zvcm1NYXRyaXgpKTtjb25zdCBpPXQuZWxlbWVudC5jbG9uZU5vZGUoITApOyJldmVub2RkIj09PXRoaXMucGVuZGluZ0NsaXA/aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGlwLXJ1bGUiLCJldmVub2RkIik6aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJjbGlwLXJ1bGUiLCJub256ZXJvIik7dGhpcy5wZW5kaW5nQ2xpcD1udWxsO24uYXBwZW5kKGkpO3RoaXMuZGVmcy5hcHBlbmQobik7aWYodC5hY3RpdmVDbGlwVXJsKXt0LmNsaXBHcm91cD1udWxsO2Zvcihjb25zdCB0IG9mIHRoaXMuZXh0cmFTdGFjayl0LmNsaXBHcm91cD1udWxsO24uc2V0QXR0cmlidXRlTlMobnVsbCwiY2xpcC1wYXRoIix0LmFjdGl2ZUNsaXBVcmwpfXQuYWN0aXZlQ2xpcFVybD1gdXJsKCMke2V9KWA7dGhpcy50Z3JwPW51bGx9Y2xpcCh0KXt0aGlzLnBlbmRpbmdDbGlwPXR9Y2xvc2VQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnJlbnQ7aWYodC5wYXRoKXtjb25zdCBlPWAke3QucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCJkIil9WmA7dC5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsImQiLGUpfX1zZXRMZWFkaW5nKHQpe3RoaXMuY3VycmVudC5sZWFkaW5nPS10fXNldFRleHRSaXNlKHQpe3RoaXMuY3VycmVudC50ZXh0UmlzZT10fXNldFRleHRSZW5kZXJpbmdNb2RlKHQpe3RoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZT10fXNldEhTY2FsZSh0KXt0aGlzLmN1cnJlbnQudGV4dEhTY2FsZT10LzEwMH1zZXRSZW5kZXJpbmdJbnRlbnQodCl7fXNldEZsYXRuZXNzKHQpe31zZXRHU3RhdGUodCl7Zm9yKGNvbnN0W2Usbl1vZiB0KXN3aXRjaChlKXtjYXNlIkxXIjp0aGlzLnNldExpbmVXaWR0aChuKTticmVhaztjYXNlIkxDIjp0aGlzLnNldExpbmVDYXAobik7YnJlYWs7Y2FzZSJMSiI6dGhpcy5zZXRMaW5lSm9pbihuKTticmVhaztjYXNlIk1MIjp0aGlzLnNldE1pdGVyTGltaXQobik7YnJlYWs7Y2FzZSJEIjp0aGlzLnNldERhc2goblswXSxuWzFdKTticmVhaztjYXNlIlJJIjp0aGlzLnNldFJlbmRlcmluZ0ludGVudChuKTticmVhaztjYXNlIkZMIjp0aGlzLnNldEZsYXRuZXNzKG4pO2JyZWFrO2Nhc2UiRm9udCI6dGhpcy5zZXRGb250KG4pO2JyZWFrO2Nhc2UiQ0EiOnRoaXMuc2V0U3Ryb2tlQWxwaGEobik7YnJlYWs7Y2FzZSJjYSI6dGhpcy5zZXRGaWxsQWxwaGEobik7YnJlYWs7ZGVmYXVsdDooMCxyLndhcm4pKGBVbmltcGxlbWVudGVkIGdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgJHtlfWApfX1maWxsKCl7Y29uc3QgdD10aGlzLmN1cnJlbnQ7aWYodC5lbGVtZW50KXt0LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwiZmlsbCIsdC5maWxsQ29sb3IpO3QuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsLW9wYWNpdHkiLHQuZmlsbEFscGhhKTt0aGlzLmVuZFBhdGgoKX19c3Ryb2tlKCl7Y29uc3QgdD10aGlzLmN1cnJlbnQ7aWYodC5lbGVtZW50KXt0aGlzLl9zZXRTdHJva2VBdHRyaWJ1dGVzKHQuZWxlbWVudCk7dC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLCJub25lIik7dGhpcy5lbmRQYXRoKCl9fV9zZXRTdHJva2VBdHRyaWJ1dGVzKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToxO2NvbnN0IG49dGhpcy5jdXJyZW50O2xldCBpPW4uZGFzaEFycmF5OzEhPT1lJiZpLmxlbmd0aD4wJiYoaT1pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUqdH0pKSk7dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHJva2UiLG4uc3Ryb2tlQ29sb3IpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLW9wYWNpdHkiLG4uc3Ryb2tlQWxwaGEpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLW1pdGVybGltaXQiLHBmKG4ubWl0ZXJMaW1pdCkpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLWxpbmVjYXAiLG4ubGluZUNhcCk7dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJzdHJva2UtbGluZWpvaW4iLG4ubGluZUpvaW4pO3Quc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLXdpZHRoIixwZihlKm4ubGluZVdpZHRoKSsicHgiKTt0LnNldEF0dHJpYnV0ZU5TKG51bGwsInN0cm9rZS1kYXNoYXJyYXkiLGkubWFwKHBmKS5qb2luKCIgIikpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwic3Ryb2tlLWRhc2hvZmZzZXQiLHBmKGUqbi5kYXNoUGhhc2UpKyJweCIpfWVvRmlsbCgpe3RoaXMuY3VycmVudC5lbGVtZW50Py5zZXRBdHRyaWJ1dGVOUyhudWxsLCJmaWxsLXJ1bGUiLCJldmVub2RkIik7dGhpcy5maWxsKCl9ZmlsbFN0cm9rZSgpe3RoaXMuc3Ryb2tlKCk7dGhpcy5maWxsKCl9ZW9GaWxsU3Ryb2tlKCl7dGhpcy5jdXJyZW50LmVsZW1lbnQ/LnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwtcnVsZSIsImV2ZW5vZGQiKTt0aGlzLmZpbGxTdHJva2UoKX1jbG9zZVN0cm9rZSgpe3RoaXMuY2xvc2VQYXRoKCk7dGhpcy5zdHJva2UoKX1jbG9zZUZpbGxTdHJva2UoKXt0aGlzLmNsb3NlUGF0aCgpO3RoaXMuZmlsbFN0cm9rZSgpfWNsb3NlRU9GaWxsU3Ryb2tlKCl7dGhpcy5jbG9zZVBhdGgoKTt0aGlzLmVvRmlsbFN0cm9rZSgpfXBhaW50U29saWRDb2xvckltYWdlTWFzaygpe2NvbnN0IHQ9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyZWN0Iik7dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ4IiwiMCIpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwieSIsIjAiKTt0LnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIiwiMXB4Iik7dC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLCIxcHgiKTt0LnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLHRoaXMuY3VycmVudC5maWxsQ29sb3IpO3RoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKHQpfXBhaW50SW1hZ2VYT2JqZWN0KHQpe2NvbnN0IGU9dGhpcy5nZXRPYmplY3QodCk7ZT90aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGUpOigwLHIud2FybikoYERlcGVuZGVudCBpbWFnZSB3aXRoIG9iamVjdCBJRCAke3R9IGlzIG5vdCByZWFkeSB5ZXRgKX1wYWludElubGluZUltYWdlWE9iamVjdCh0LGUpe2NvbnN0IG49dC53aWR0aCxpPXQuaGVpZ2h0LHI9aCh0LHRoaXMuZm9yY2VEYXRhU2NoZW1hLCEhZSkscz10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTtzLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLCIwIik7cy5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ5IiwiMCIpO3Muc2V0QXR0cmlidXRlTlMobnVsbCwid2lkdGgiLHBmKG4pKTtzLnNldEF0dHJpYnV0ZU5TKG51bGwsImhlaWdodCIscGYoaSkpO3RoaXMuY3VycmVudC5lbGVtZW50PXM7dGhpcy5jbGlwKCJub256ZXJvIik7Y29uc3QgYT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmltYWdlIik7YS5zZXRBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsInhsaW5rOmhyZWYiLHIpO2Euc2V0QXR0cmlidXRlTlMobnVsbCwieCIsIjAiKTthLnNldEF0dHJpYnV0ZU5TKG51bGwsInkiLHBmKC1pKSk7YS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIscGYobikrInB4Iik7YS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLHBmKGkpKyJweCIpO2Euc2V0QXR0cmlidXRlTlMobnVsbCwidHJhbnNmb3JtIixgc2NhbGUoJHtwZigxL24pfSAke3BmKC0xL2kpfSlgKTtlP2UuYXBwZW5kKGEpOnRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKGEpfXBhaW50SW1hZ2VNYXNrWE9iamVjdCh0KXtjb25zdCBlPXRoaXMuZ2V0T2JqZWN0KHQuZGF0YSx0KTtpZihlLmJpdG1hcCl7KDAsci53YXJuKSgicGFpbnRJbWFnZU1hc2tYT2JqZWN0OiBJbWFnZUJpdG1hcCBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCwgZW5zdXJlIHRoYXQgdGhlIGBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZGAgQVBJIHBhcmFtZXRlciBpcyBkaXNhYmxlZC4iKTtyZXR1cm59Y29uc3Qgbj10aGlzLmN1cnJlbnQsaT1lLndpZHRoLHM9ZS5oZWlnaHQsYT1uLmZpbGxDb2xvcjtuLm1hc2tJZD0ibWFzayIrdSsrO2NvbnN0IG89dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzptYXNrIik7by5zZXRBdHRyaWJ1dGVOUyhudWxsLCJpZCIsbi5tYXNrSWQpO2NvbnN0IGw9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpyZWN0Iik7bC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ4IiwiMCIpO2wuc2V0QXR0cmlidXRlTlMobnVsbCwieSIsIjAiKTtsLnNldEF0dHJpYnV0ZU5TKG51bGwsIndpZHRoIixwZihpKSk7bC5zZXRBdHRyaWJ1dGVOUyhudWxsLCJoZWlnaHQiLHBmKHMpKTtsLnNldEF0dHJpYnV0ZU5TKG51bGwsImZpbGwiLGEpO2wuc2V0QXR0cmlidXRlTlMobnVsbCwibWFzayIsYHVybCgjJHtuLm1hc2tJZH0pYCk7dGhpcy5kZWZzLmFwcGVuZChvKTt0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChsKTt0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGUsbyl9cGFpbnRGb3JtWE9iamVjdEJlZ2luKHQsZSl7QXJyYXkuaXNBcnJheSh0KSYmNj09PXQubGVuZ3RoJiZ0aGlzLnRyYW5zZm9ybSh0WzBdLHRbMV0sdFsyXSx0WzNdLHRbNF0sdFs1XSk7aWYoZSl7Y29uc3QgdD1lWzJdLWVbMF0sbj1lWzNdLWVbMV0saT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOnJlY3QiKTtpLnNldEF0dHJpYnV0ZU5TKG51bGwsIngiLGVbMF0pO2kuc2V0QXR0cmlidXRlTlMobnVsbCwieSIsZVsxXSk7aS5zZXRBdHRyaWJ1dGVOUyhudWxsLCJ3aWR0aCIscGYodCkpO2kuc2V0QXR0cmlidXRlTlMobnVsbCwiaGVpZ2h0IixwZihuKSk7dGhpcy5jdXJyZW50LmVsZW1lbnQ9aTt0aGlzLmNsaXAoIm5vbnplcm8iKTt0aGlzLmVuZFBhdGgoKX19cGFpbnRGb3JtWE9iamVjdEVuZCgpe31faW5pdGlhbGl6ZSh0KXtjb25zdCBlPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodC53aWR0aCx0LmhlaWdodCksbj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmRlZnMiKTtlLmFwcGVuZChuKTt0aGlzLmRlZnM9bjtjb25zdCBpPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZyIpO2kuc2V0QXR0cmlidXRlTlMobnVsbCwidHJhbnNmb3JtIixwbSh0LnRyYW5zZm9ybSkpO2UuYXBwZW5kKGkpO3RoaXMuc3ZnPWk7cmV0dXJuIGV9X2Vuc3VyZUNsaXBHcm91cCgpe2lmKCF0aGlzLmN1cnJlbnQuY2xpcEdyb3VwKXtjb25zdCB0PXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6ZyIpO3Quc2V0QXR0cmlidXRlTlMobnVsbCwiY2xpcC1wYXRoIix0aGlzLmN1cnJlbnQuYWN0aXZlQ2xpcFVybCk7dGhpcy5zdmcuYXBwZW5kKHQpO3RoaXMuY3VycmVudC5jbGlwR3JvdXA9dH1yZXR1cm4gdGhpcy5jdXJyZW50LmNsaXBHcm91cH1fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKXtpZighdGhpcy50Z3JwKXt0aGlzLnRncnA9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoInN2ZzpnIik7dGhpcy50Z3JwLnNldEF0dHJpYnV0ZU5TKG51bGwsInRyYW5zZm9ybSIscG0odGhpcy50cmFuc2Zvcm1NYXRyaXgpKTt0aGlzLmN1cnJlbnQuYWN0aXZlQ2xpcFVybD90aGlzLl9lbnN1cmVDbGlwR3JvdXAoKS5hcHBlbmQodGhpcy50Z3JwKTp0aGlzLnN2Zy5hcHBlbmQodGhpcy50Z3JwKX1yZXR1cm4gdGhpcy50Z3JwfX19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7dmFyIGk9bigzKSxyPW4oMTg3KSxzPW4oMTkyKTtpKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMH0se2dyb3VwOmZ1bmN0aW9uIGdyb3VwKHQpe3JldHVybiByKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSk7cygiZ3JvdXAiKX0sKHQsZSxuKT0+e3ZhciBpPW4oOTkpLHI9bigxNCkscz1uKDEzKSxhPW4oNDApLG89bigxOCksbD1uKDY0KSxjPW4oMTg4KSxoPW4oMTA4KSxkPUFycmF5LHU9cihbXS5wdXNoKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBwLGYsZyxtPWEodCksYj1zKG0pLHY9aShlLG4pLHk9YyhudWxsKSxBPWwoYiksXz0wO0E+XztfKyspe2c9YltfXTsoZj1vKHYoZyxfLG0pKSlpbiB5P3UoeVtmXSxnKTp5W2ZdPVtnXX1pZihyJiYocD1yKG0pKSE9PWQpZm9yKGYgaW4geSl5W2ZdPWgocCx5W2ZdKTtyZXR1cm4geX19LCh0LGUsbik9Pnt2YXIgaSxyPW4oNDcpLHM9bigxODkpLGE9big2Niksbz1uKDU1KSxsPW4oMTkxKSxjPW4oNDMpLGg9big1NCksZD0icHJvdG90eXBlIix1PSJzY3JpcHQiLHA9aCgiSUVfUFJPVE8iKSxFbXB0eUNvbnN0cnVjdG9yPWZ1bmN0aW9uKCl7fSxzY3JpcHRUYWc9ZnVuY3Rpb24odCl7cmV0dXJuIjwiK3UrIj4iK3QrIjwvIit1KyI+In0sTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWD1mdW5jdGlvbih0KXt0LndyaXRlKHNjcmlwdFRhZygiIikpO3QuY2xvc2UoKTt2YXIgZT10LnBhcmVudFdpbmRvdy5PYmplY3Q7dD1udWxsO3JldHVybiBlfSxOdWxsUHJvdG9PYmplY3Q9ZnVuY3Rpb24oKXt0cnl7aT1uZXcgQWN0aXZlWE9iamVjdCgiaHRtbGZpbGUiKX1jYXRjaCh0KXt9TnVsbFByb3RvT2JqZWN0PSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQuZG9tYWluJiZpP051bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoaSk6ZnVuY3Rpb24oKXt2YXIgdCxlPWMoImlmcmFtZSIpLG49ImphdmEiK3UrIjoiO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7bC5hcHBlbmRDaGlsZChlKTtlLnNyYz1TdHJpbmcobik7KHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCk7dC53cml0ZShzY3JpcHRUYWcoImRvY3VtZW50LkY9T2JqZWN0IikpO3QuY2xvc2UoKTtyZXR1cm4gdC5GfSgpOk51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoaSk7Zm9yKHZhciB0PWEubGVuZ3RoO3QtLTspZGVsZXRlIE51bGxQcm90b09iamVjdFtkXVthW3RdXTtyZXR1cm4gTnVsbFByb3RvT2JqZWN0KCl9O29bcF09ITA7dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uIGNyZWF0ZSh0LGUpe3ZhciBuO2lmKG51bGwhPT10KXtFbXB0eUNvbnN0cnVjdG9yW2RdPXIodCk7bj1uZXcgRW1wdHlDb25zdHJ1Y3RvcjtFbXB0eUNvbnN0cnVjdG9yW2RdPW51bGw7bltwXT10fWVsc2Ugbj1OdWxsUHJvdG9PYmplY3QoKTtyZXR1cm4gdm9pZCAwPT09ZT9uOnMuZihuLGUpfX0sKHQsZSxuKT0+e3ZhciBpPW4oNikscj1uKDQ2KSxzPW4oNDUpLGE9big0Nyksbz1uKDEyKSxsPW4oMTkwKTtlLmY9aSYmIXI/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0LGUpe2EodCk7Zm9yKHZhciBuLGk9byhlKSxyPWwoZSksYz1yLmxlbmd0aCxoPTA7Yz5oOylzLmYodCxuPXJbaCsrXSxpW25dKTtyZXR1cm4gdH19LCh0LGUsbik9Pnt2YXIgaT1uKDU5KSxyPW4oNjYpO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ga2V5cyh0KXtyZXR1cm4gaSh0LHIpfX0sKHQsZSxuKT0+e3ZhciBpPW4oMjQpO3QuZXhwb3J0cz1pKCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIpfSwodCxlLG4pPT57dmFyIGk9bigzNCkscj1uKDE4OCkscz1uKDQ1KS5mLGE9aSgidW5zY29wYWJsZXMiKSxvPUFycmF5LnByb3RvdHlwZTtudWxsPT1vW2FdJiZzKG8sYSx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnIobnVsbCl9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7b1thXVt0XT0hMH19LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuWGZhVGV4dD12b2lkIDA7big4OSk7Y2xhc3MgWGZhVGV4dHtzdGF0aWMgdGV4dENvbnRlbnQodCl7Y29uc3QgZT1bXSxuPXtpdGVtczplLHN0eWxlczpPYmplY3QuY3JlYXRlKG51bGwpfTshZnVuY3Rpb24gd2Fsayh0KXtpZighdClyZXR1cm47bGV0IG49bnVsbDtjb25zdCBpPXQubmFtZTtpZigiI3RleHQiPT09aSluPXQudmFsdWU7ZWxzZXtpZighWGZhVGV4dC5zaG91bGRCdWlsZFRleHQoaSkpcmV0dXJuO3Q/LmF0dHJpYnV0ZXM/LnRleHRDb250ZW50P249dC5hdHRyaWJ1dGVzLnRleHRDb250ZW50OnQudmFsdWUmJihuPXQudmFsdWUpfW51bGwhPT1uJiZlLnB1c2goe3N0cjpufSk7aWYodC5jaGlsZHJlbilmb3IoY29uc3QgZSBvZiB0LmNoaWxkcmVuKXdhbGsoZSl9KHQpO3JldHVybiBufXN0YXRpYyBzaG91bGRCdWlsZFRleHQodCl7cmV0dXJuISgidGV4dGFyZWEiPT09dHx8ImlucHV0Ij09PXR8fCJvcHRpb24iPT09dHx8InNlbGVjdCI9PT10KX19ZS5YZmFUZXh0PVhmYVRleHR9LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuVGV4dExheWVyUmVuZGVyVGFzaz12b2lkIDA7ZS5yZW5kZXJUZXh0TGF5ZXI9ZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKHQpe2lmKCF0LnRleHRDb250ZW50U291cmNlJiYodC50ZXh0Q29udGVudHx8dC50ZXh0Q29udGVudFN0cmVhbSkpeygwLHIuZGVwcmVjYXRlZCkoIlRoZSBUZXh0TGF5ZXJSZW5kZXIgYHRleHRDb250ZW50YC9gdGV4dENvbnRlbnRTdHJlYW1gIHBhcmFtZXRlcnMgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsIHBsZWFzZSB1c2UgYHRleHRDb250ZW50U291cmNlYCBpbnN0ZWFkLiIpO3QudGV4dENvbnRlbnRTb3VyY2U9dC50ZXh0Q29udGVudHx8dC50ZXh0Q29udGVudFN0cmVhbX1jb25zdHtjb250YWluZXI6ZSx2aWV3cG9ydDpufT10LGk9Z2V0Q29tcHV0ZWRTdHlsZShlKSxzPWkuZ2V0UHJvcGVydHlWYWx1ZSgidmlzaWJpbGl0eSIpLGE9cGFyc2VGbG9hdChpLmdldFByb3BlcnR5VmFsdWUoIi0tc2NhbGUtZmFjdG9yIikpOyJ2aXNpYmxlIj09PXMmJighYXx8TWF0aC5hYnMoYS1uLnNjYWxlKT4xZS01KSYmY29uc29sZS5lcnJvcigiVGhlIGAtLXNjYWxlLWZhY3RvcmAgQ1NTLXZhcmlhYmxlIG11c3QgYmUgc2V0LCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBgdmlld3BvcnQuc2NhbGVgLCBlaXRoZXIgb24gdGhlIGBjb250YWluZXJgLWVsZW1lbnQgaXRzZWxmIG9yIGhpZ2hlciB1cCBpbiB0aGUgRE9NLiIpO2NvbnN0IG89bmV3IFRleHRMYXllclJlbmRlclRhc2sodCk7by5fcmVuZGVyKCk7cmV0dXJuIG99O2UudXBkYXRlVGV4dExheWVyPWZ1bmN0aW9uIHVwZGF0ZVRleHRMYXllcih0KXtsZXR7Y29udGFpbmVyOmUsdmlld3BvcnQ6bix0ZXh0RGl2czppLHRleHREaXZQcm9wZXJ0aWVzOnMsaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6YSxtdXN0Um90YXRlOm89ITAsbXVzdFJlc2NhbGU6bD0hMH09dDtvJiYoMCxyLnNldExheWVyRGltZW5zaW9ucykoZSx7cm90YXRpb246bi5yb3RhdGlvbn0pO2lmKGwpe2NvbnN0IHQ9Z2V0Q3R4KDAsYSksZT17cHJldkZvbnRTaXplOm51bGwscHJldkZvbnRGYW1pbHk6bnVsbCxkaXY6bnVsbCxzY2FsZTpuLnNjYWxlKihnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW98fDEpLHByb3BlcnRpZXM6bnVsbCxjdHg6dH07Zm9yKGNvbnN0IHQgb2YgaSl7ZS5wcm9wZXJ0aWVzPXMuZ2V0KHQpO2UuZGl2PXQ7bGF5b3V0KGUpfX19O24oODkpO24oMik7dmFyIGk9bigxKSxyPW4oMTY3KTtjb25zdCBzPTMwLGE9Ljgsbz1uZXcgTWFwO2Z1bmN0aW9uIGdldEN0eCh0LGUpe2xldCBuO2lmKGUmJmkuRmVhdHVyZVRlc3QuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpbj1uZXcgT2Zmc2NyZWVuQ2FudmFzKHQsdCkuZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMX0pO2Vsc2V7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtlLndpZHRoPWUuaGVpZ2h0PXQ7bj1lLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITF9KX1yZXR1cm4gbn1mdW5jdGlvbiBhcHBlbmRUZXh0KHQsZSxuKXtjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSxsPXthbmdsZTowLGNhbnZhc1dpZHRoOjAsaGFzVGV4dDoiIiE9PWUuc3RyLGhhc0VPTDplLmhhc0VPTCxmb250U2l6ZTowfTt0Ll90ZXh0RGl2cy5wdXNoKHIpO2NvbnN0IGM9aS5VdGlsLnRyYW5zZm9ybSh0Ll90cmFuc2Zvcm0sZS50cmFuc2Zvcm0pO2xldCBoPU1hdGguYXRhbjIoY1sxXSxjWzBdKTtjb25zdCBkPW5bZS5mb250TmFtZV07ZC52ZXJ0aWNhbCYmKGgrPU1hdGguUEkvMik7Y29uc3QgdT1NYXRoLmh5cG90KGNbMl0sY1szXSkscD11KmZ1bmN0aW9uIGdldEFzY2VudCh0LGUpe2NvbnN0IG49by5nZXQodCk7aWYobilyZXR1cm4gbjtjb25zdCBpPWdldEN0eChzLGUpO2kuZm9udD1gJHtzfXB4ICR7dH1gO2NvbnN0IHI9aS5tZWFzdXJlVGV4dCgiIik7bGV0IGw9ci5mb250Qm91bmRpbmdCb3hBc2NlbnQsYz1NYXRoLmFicyhyLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpO2lmKGwpe2NvbnN0IGU9bC8obCtjKTtvLnNldCh0LGUpO2kuY2FudmFzLndpZHRoPWkuY2FudmFzLmhlaWdodD0wO3JldHVybiBlfWkuc3Ryb2tlU3R5bGU9InJlZCI7aS5jbGVhclJlY3QoMCwwLHMscyk7aS5zdHJva2VUZXh0KCJnIiwwLDApO2xldCBoPWkuZ2V0SW1hZ2VEYXRhKDAsMCxzLHMpLmRhdGE7Yz0wO2ZvcihsZXQgdD1oLmxlbmd0aC0xLTM7dD49MDt0LT00KWlmKGhbdF0+MCl7Yz1NYXRoLmNlaWwodC80L3MpO2JyZWFrfWkuY2xlYXJSZWN0KDAsMCxzLHMpO2kuc3Ryb2tlVGV4dCgiQSIsMCxzKTtoPWkuZ2V0SW1hZ2VEYXRhKDAsMCxzLHMpLmRhdGE7bD0wO2ZvcihsZXQgdD0wLGU9aC5sZW5ndGg7dDxlO3QrPTQpaWYoaFt0XT4wKXtsPXMtTWF0aC5mbG9vcih0LzQvcyk7YnJlYWt9aS5jYW52YXMud2lkdGg9aS5jYW52YXMuaGVpZ2h0PTA7aWYobCl7Y29uc3QgZT1sLyhsK2MpO28uc2V0KHQsZSk7cmV0dXJuIGV9by5zZXQodCxhKTtyZXR1cm4gYX0oZC5mb250RmFtaWx5LHQuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTtsZXQgZixnO2lmKDA9PT1oKXtmPWNbNF07Zz1jWzVdLXB9ZWxzZXtmPWNbNF0rcCpNYXRoLnNpbihoKTtnPWNbNV0tcCpNYXRoLmNvcyhoKX1jb25zdCBtPSJjYWxjKHZhcigtLXNjYWxlLWZhY3RvcikqIixiPXIuc3R5bGU7aWYodC5fY29udGFpbmVyPT09dC5fcm9vdENvbnRhaW5lcil7Yi5sZWZ0PWAkeygxMDAqZi90Ll9wYWdlV2lkdGgpLnRvRml4ZWQoMil9JWA7Yi50b3A9YCR7KDEwMCpnL3QuX3BhZ2VIZWlnaHQpLnRvRml4ZWQoMil9JWB9ZWxzZXtiLmxlZnQ9YCR7bX0ke2YudG9GaXhlZCgyKX1weClgO2IudG9wPWAke219JHtnLnRvRml4ZWQoMil9cHgpYH1iLmZvbnRTaXplPWAke219JHt1LnRvRml4ZWQoMil9cHgpYDtiLmZvbnRGYW1pbHk9ZC5mb250RmFtaWx5O2wuZm9udFNpemU9dTtyLnNldEF0dHJpYnV0ZSgicm9sZSIsInByZXNlbnRhdGlvbiIpO3IudGV4dENvbnRlbnQ9ZS5zdHI7ci5kaXI9ZS5kaXI7dC5fZm9udEluc3BlY3RvckVuYWJsZWQmJihyLmRhdGFzZXQuZm9udE5hbWU9ZS5mb250TmFtZSk7MCE9PWgmJihsLmFuZ2xlPWgqKDE4MC9NYXRoLlBJKSk7bGV0IHY9ITE7aWYoZS5zdHIubGVuZ3RoPjEpdj0hMDtlbHNlIGlmKCIgIiE9PWUuc3RyJiZlLnRyYW5zZm9ybVswXSE9PWUudHJhbnNmb3JtWzNdKXtjb25zdCB0PU1hdGguYWJzKGUudHJhbnNmb3JtWzBdKSxuPU1hdGguYWJzKGUudHJhbnNmb3JtWzNdKTt0IT09biYmTWF0aC5tYXgodCxuKS9NYXRoLm1pbih0LG4pPjEuNSYmKHY9ITApfXYmJihsLmNhbnZhc1dpZHRoPWQudmVydGljYWw/ZS5oZWlnaHQ6ZS53aWR0aCk7dC5fdGV4dERpdlByb3BlcnRpZXMuc2V0KHIsbCk7dC5faXNSZWFkYWJsZVN0cmVhbSYmdC5fbGF5b3V0VGV4dChyKX1mdW5jdGlvbiBsYXlvdXQodCl7Y29uc3R7ZGl2OmUsc2NhbGU6bixwcm9wZXJ0aWVzOmksY3R4OnIscHJldkZvbnRTaXplOnMscHJldkZvbnRGYW1pbHk6YX09dCx7c3R5bGU6b309ZTtsZXQgbD0iIjtpZigwIT09aS5jYW52YXNXaWR0aCYmaS5oYXNUZXh0KXtjb25zdHtmb250RmFtaWx5OmN9PW8se2NhbnZhc1dpZHRoOmgsZm9udFNpemU6ZH09aTtpZihzIT09ZHx8YSE9PWMpe3IuZm9udD1gJHtkKm59cHggJHtjfWA7dC5wcmV2Rm9udFNpemU9ZDt0LnByZXZGb250RmFtaWx5PWN9Y29uc3R7d2lkdGg6dX09ci5tZWFzdXJlVGV4dChlLnRleHRDb250ZW50KTt1PjAmJihsPWBzY2FsZVgoJHtoKm4vdX0pYCl9MCE9PWkuYW5nbGUmJihsPWByb3RhdGUoJHtpLmFuZ2xlfWRlZykgJHtsfWApO2wubGVuZ3RoPjAmJihvLnRyYW5zZm9ybT1sKX1jbGFzcyBUZXh0TGF5ZXJSZW5kZXJUYXNre2NvbnN0cnVjdG9yKHQpe2xldHt0ZXh0Q29udGVudFNvdXJjZTplLGNvbnRhaW5lcjpuLHZpZXdwb3J0OnMsdGV4dERpdnM6YSx0ZXh0RGl2UHJvcGVydGllczpvLHRleHRDb250ZW50SXRlbXNTdHI6bCxpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDpjfT10O3RoaXMuX3RleHRDb250ZW50U291cmNlPWU7dGhpcy5faXNSZWFkYWJsZVN0cmVhbT1lIGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW07dGhpcy5fY29udGFpbmVyPXRoaXMuX3Jvb3RDb250YWluZXI9bjt0aGlzLl90ZXh0RGl2cz1hfHxbXTt0aGlzLl90ZXh0Q29udGVudEl0ZW1zU3RyPWx8fFtdO3RoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPWM7dGhpcy5fZm9udEluc3BlY3RvckVuYWJsZWQ9ISFnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3I/LmVuYWJsZWQ7dGhpcy5fcmVhZGVyPW51bGw7dGhpcy5fdGV4dERpdlByb3BlcnRpZXM9b3x8bmV3IFdlYWtNYXA7dGhpcy5fY2FuY2VsZWQ9ITE7dGhpcy5fY2FwYWJpbGl0eT1uZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLl9sYXlvdXRUZXh0UGFyYW1zPXtwcmV2Rm9udFNpemU6bnVsbCxwcmV2Rm9udEZhbWlseTpudWxsLGRpdjpudWxsLHNjYWxlOnMuc2NhbGUqKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpb3x8MSkscHJvcGVydGllczpudWxsLGN0eDpnZXRDdHgoMCxjKX07Y29uc3R7cGFnZVdpZHRoOmgscGFnZUhlaWdodDpkLHBhZ2VYOnUscGFnZVk6cH09cy5yYXdEaW1zO3RoaXMuX3RyYW5zZm9ybT1bMSwwLDAsLTEsLXUscCtkXTt0aGlzLl9wYWdlV2lkdGg9aDt0aGlzLl9wYWdlSGVpZ2h0PWQ7KDAsci5zZXRMYXllckRpbWVuc2lvbnMpKG4scyk7dGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlLmZpbmFsbHkoKCgpPT57dGhpcy5fbGF5b3V0VGV4dFBhcmFtcz1udWxsfSkpLmNhdGNoKCgoKT0+e30pKX1nZXQgcHJvbWlzZSgpe3JldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2V9Y2FuY2VsKCl7dGhpcy5fY2FuY2VsZWQ9ITA7aWYodGhpcy5fcmVhZGVyKXt0aGlzLl9yZWFkZXIuY2FuY2VsKG5ldyBpLkFib3J0RXhjZXB0aW9uKCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuIikpLmNhdGNoKCgoKT0+e30pKTt0aGlzLl9yZWFkZXI9bnVsbH10aGlzLl9jYXBhYmlsaXR5LnJlamVjdChuZXcgaS5BYm9ydEV4Y2VwdGlvbigiVGV4dExheWVyIHRhc2sgY2FuY2VsbGVkLiIpKX1fcHJvY2Vzc0l0ZW1zKHQsZSl7Zm9yKGNvbnN0IG4gb2YgdClpZih2b2lkIDAhPT1uLnN0cil7dGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ci5wdXNoKG4uc3RyKTthcHBlbmRUZXh0KHRoaXMsbixlKX1lbHNlIGlmKCJiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyI9PT1uLnR5cGV8fCJiZWdpbk1hcmtlZENvbnRlbnQiPT09bi50eXBlKXtjb25zdCB0PXRoaXMuX2NvbnRhaW5lcjt0aGlzLl9jb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3RoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJtYXJrZWRDb250ZW50Iik7bnVsbCE9PW4uaWQmJnRoaXMuX2NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoImlkIixgJHtuLmlkfWApO3QuYXBwZW5kKHRoaXMuX2NvbnRhaW5lcil9ZWxzZSJlbmRNYXJrZWRDb250ZW50Ij09PW4udHlwZSYmKHRoaXMuX2NvbnRhaW5lcj10aGlzLl9jb250YWluZXIucGFyZW50Tm9kZSl9X2xheW91dFRleHQodCl7Y29uc3QgZT10aGlzLl9sYXlvdXRUZXh0UGFyYW1zLnByb3BlcnRpZXM9dGhpcy5fdGV4dERpdlByb3BlcnRpZXMuZ2V0KHQpO3RoaXMuX2xheW91dFRleHRQYXJhbXMuZGl2PXQ7bGF5b3V0KHRoaXMuX2xheW91dFRleHRQYXJhbXMpO2UuaGFzVGV4dCYmdGhpcy5fY29udGFpbmVyLmFwcGVuZCh0KTtpZihlLmhhc0VPTCl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpO3Quc2V0QXR0cmlidXRlKCJyb2xlIiwicHJlc2VudGF0aW9uIik7dGhpcy5fY29udGFpbmVyLmFwcGVuZCh0KX19X3JlbmRlcigpe2NvbnN0IHQ9bmV3IGkuUHJvbWlzZUNhcGFiaWxpdHk7bGV0IGU9T2JqZWN0LmNyZWF0ZShudWxsKTtpZih0aGlzLl9pc1JlYWRhYmxlU3RyZWFtKXtjb25zdCBwdW1wPSgpPT57dGhpcy5fcmVhZGVyLnJlYWQoKS50aGVuKChuPT57bGV0e3ZhbHVlOmksZG9uZTpyfT1uO2lmKHIpdC5yZXNvbHZlKCk7ZWxzZXtPYmplY3QuYXNzaWduKGUsaS5zdHlsZXMpO3RoaXMuX3Byb2Nlc3NJdGVtcyhpLml0ZW1zLGUpO3B1bXAoKX19KSx0LnJlamVjdCl9O3RoaXMuX3JlYWRlcj10aGlzLl90ZXh0Q29udGVudFNvdXJjZS5nZXRSZWFkZXIoKTtwdW1wKCl9ZWxzZXtpZighdGhpcy5fdGV4dENvbnRlbnRTb3VyY2UpdGhyb3cgbmV3IEVycm9yKCdObyAidGV4dENvbnRlbnRTb3VyY2UiIHBhcmFtZXRlciBzcGVjaWZpZWQuJyk7e2NvbnN0e2l0ZW1zOmUsc3R5bGVzOm59PXRoaXMuX3RleHRDb250ZW50U291cmNlO3RoaXMuX3Byb2Nlc3NJdGVtcyhlLG4pO3QucmVzb2x2ZSgpfX10LnByb21pc2UudGhlbigoKCk9PntlPW51bGw7IWZ1bmN0aW9uIHJlbmRlcih0KXtpZih0Ll9jYW5jZWxlZClyZXR1cm47Y29uc3QgZT10Ll90ZXh0RGl2cyxuPXQuX2NhcGFiaWxpdHk7aWYoZS5sZW5ndGg+MWU1KW4ucmVzb2x2ZSgpO2Vsc2V7aWYoIXQuX2lzUmVhZGFibGVTdHJlYW0pZm9yKGNvbnN0IG4gb2YgZSl0Ll9sYXlvdXRUZXh0KG4pO24ucmVzb2x2ZSgpfX0odGhpcyl9KSx0aGlzLl9jYXBhYmlsaXR5LnJlamVjdCl9fWUuVGV4dExheWVyUmVuZGVyVGFzaz1UZXh0TGF5ZXJSZW5kZXJUYXNrfSwodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLkFubm90YXRpb25FZGl0b3JMYXllcj12b2lkIDA7bigxMjUpO24oMTM1KTtuKDEzNyk7bigxNDApO24oMTQyKTtuKDE0NCk7bigxNDYpO3ZhciBpPW4oMSkscj1uKDE2Mykscz1uKDE2NCksYT1uKDE5Niksbz1uKDIwMSksbD1uKDE2NyksYz1uKDIwMik7Y2xhc3MgQW5ub3RhdGlvbkVkaXRvckxheWVyeyNyZTsjc2U9ITE7I2FlPW51bGw7I29lPXRoaXMucG9pbnRlcnVwLmJpbmQodGhpcyk7I2xlPXRoaXMucG9pbnRlcmRvd24uYmluZCh0aGlzKTsjY2U9bmV3IE1hcDsjaGU9ITE7I2RlPSExOyN1ZT0hMTsjcGU7c3RhdGljIF9pbml0aWFsaXplZD0hMTtjb25zdHJ1Y3Rvcih0KXtsZXR7dWlNYW5hZ2VyOmUscGFnZUluZGV4Om4sZGl2OmksYWNjZXNzaWJpbGl0eU1hbmFnZXI6cixhbm5vdGF0aW9uTGF5ZXI6cyx2aWV3cG9ydDpsLGwxMG46aH09dDtjb25zdCBkPVthLkZyZWVUZXh0RWRpdG9yLG8uSW5rRWRpdG9yLGMuU3RhbXBFZGl0b3JdO2lmKCFBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkKXtBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkPSEwO2Zvcihjb25zdCB0IG9mIGQpdC5pbml0aWFsaXplKGgpfWUucmVnaXN0ZXJFZGl0b3JUeXBlcyhkKTt0aGlzLiNwZT1lO3RoaXMucGFnZUluZGV4PW47dGhpcy5kaXY9aTt0aGlzLiNyZT1yO3RoaXMuI2FlPXM7dGhpcy52aWV3cG9ydD1sO3RoaXMuI3BlLmFkZExheWVyKHRoaXMpfWdldCBpc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLiNjZS5zaXplfXVwZGF0ZVRvb2xiYXIodCl7dGhpcy4jcGUudXBkYXRlVG9vbGJhcih0KX11cGRhdGVNb2RlKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMuI3BlLmdldE1vZGUoKTt0aGlzLiNmZSgpO2lmKHQ9PT1pLkFubm90YXRpb25FZGl0b3JUeXBlLklOSyl7dGhpcy5hZGRJbmtFZGl0b3JJZk5lZWRlZCghMSk7dGhpcy5kaXNhYmxlQ2xpY2soKX1lbHNlIHRoaXMuZW5hYmxlQ2xpY2soKTt0aGlzLiNwZS51bnNlbGVjdEFsbCgpO2lmKHQhPT1pLkFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpe3RoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoImZyZWVUZXh0RWRpdGluZyIsdD09PWkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQpO3RoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoImlua0VkaXRpbmciLHQ9PT1pLkFubm90YXRpb25FZGl0b3JUeXBlLklOSyk7dGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZSgic3RhbXBFZGl0aW5nIix0PT09aS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUCk7dGhpcy5kaXYuaGlkZGVuPSExfX1hZGRJbmtFZGl0b3JJZk5lZWRlZCh0KXtpZighdCYmdGhpcy4jcGUuZ2V0TW9kZSgpIT09aS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspcmV0dXJuO2lmKCF0KWZvcihjb25zdCB0IG9mIHRoaXMuI2NlLnZhbHVlcygpKWlmKHQuaXNFbXB0eSgpKXt0LnNldEluQmFja2dyb3VuZCgpO3JldHVybn10aGlzLiNnZSh7b2Zmc2V0WDowLG9mZnNldFk6MH0pLnNldEluQmFja2dyb3VuZCgpfXNldEVkaXRpbmdTdGF0ZSh0KXt0aGlzLiNwZS5zZXRFZGl0aW5nU3RhdGUodCl9YWRkQ29tbWFuZHModCl7dGhpcy4jcGUuYWRkQ29tbWFuZHModCl9ZW5hYmxlKCl7dGhpcy5kaXYuc3R5bGUucG9pbnRlckV2ZW50cz0iYXV0byI7Y29uc3QgdD1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIHRoaXMuI2NlLnZhbHVlcygpKXtlLmVuYWJsZUVkaXRpbmcoKTtlLmFubm90YXRpb25FbGVtZW50SWQmJnQuYWRkKGUuYW5ub3RhdGlvbkVsZW1lbnRJZCl9aWYoIXRoaXMuI2FlKXJldHVybjtjb25zdCBlPXRoaXMuI2FlLmdldEVkaXRhYmxlQW5ub3RhdGlvbnMoKTtmb3IoY29uc3QgbiBvZiBlKXtuLmhpZGUoKTtpZih0aGlzLiNwZS5pc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChuLmRhdGEuaWQpKWNvbnRpbnVlO2lmKHQuaGFzKG4uZGF0YS5pZCkpY29udGludWU7Y29uc3QgZT10aGlzLmRlc2VyaWFsaXplKG4pO2lmKGUpe3RoaXMuYWRkT3JSZWJ1aWxkKGUpO2UuZW5hYmxlRWRpdGluZygpfX19ZGlzYWJsZSgpe3RoaXMuI3VlPSEwO3RoaXMuZGl2LnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiO2NvbnN0IHQ9bmV3IFNldDtmb3IoY29uc3QgZSBvZiB0aGlzLiNjZS52YWx1ZXMoKSl7ZS5kaXNhYmxlRWRpdGluZygpO2lmKGUuYW5ub3RhdGlvbkVsZW1lbnRJZCYmbnVsbD09PWUuc2VyaWFsaXplKCkpe3RoaXMuZ2V0RWRpdGFibGVBbm5vdGF0aW9uKGUuYW5ub3RhdGlvbkVsZW1lbnRJZCk/LnNob3coKTtlLnJlbW92ZSgpfWVsc2UgdC5hZGQoZS5hbm5vdGF0aW9uRWxlbWVudElkKX1pZih0aGlzLiNhZSl7Y29uc3QgZT10aGlzLiNhZS5nZXRFZGl0YWJsZUFubm90YXRpb25zKCk7Zm9yKGNvbnN0IG4gb2YgZSl7Y29uc3R7aWQ6ZX09bi5kYXRhO3QuaGFzKGUpfHx0aGlzLiNwZS5pc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudChlKXx8bi5zaG93KCl9fXRoaXMuI2ZlKCk7dGhpcy5pc0VtcHR5JiYodGhpcy5kaXYuaGlkZGVuPSEwKTt0aGlzLiN1ZT0hMX1nZXRFZGl0YWJsZUFubm90YXRpb24odCl7cmV0dXJuIHRoaXMuI2FlPy5nZXRFZGl0YWJsZUFubm90YXRpb24odCl8fG51bGx9c2V0QWN0aXZlRWRpdG9yKHQpe3RoaXMuI3BlLmdldEFjdGl2ZSgpIT09dCYmdGhpcy4jcGUuc2V0QWN0aXZlRWRpdG9yKHQpfWVuYWJsZUNsaWNrKCl7dGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLHRoaXMuI2xlKTt0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLHRoaXMuI29lKX1kaXNhYmxlQ2xpY2soKXt0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsdGhpcy4jbGUpO3RoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsdGhpcy4jb2UpfWF0dGFjaCh0KXt0aGlzLiNjZS5zZXQodC5pZCx0KTtjb25zdHthbm5vdGF0aW9uRWxlbWVudElkOmV9PXQ7ZSYmdGhpcy4jcGUuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZSkmJnRoaXMuI3BlLnJlbW92ZURlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KX1kZXRhY2godCl7dGhpcy4jY2UuZGVsZXRlKHQuaWQpO3RoaXMuI3JlPy5yZW1vdmVQb2ludGVySW5UZXh0TGF5ZXIodC5jb250ZW50RGl2KTshdGhpcy4jdWUmJnQuYW5ub3RhdGlvbkVsZW1lbnRJZCYmdGhpcy4jcGUuYWRkRGVsZXRlZEFubm90YXRpb25FbGVtZW50KHQpfXJlbW92ZSh0KXt0aGlzLmRldGFjaCh0KTt0aGlzLiNwZS5yZW1vdmVFZGl0b3IodCk7dC5kaXYuc3R5bGUuZGlzcGxheT0ibm9uZSI7c2V0VGltZW91dCgoKCk9Pnt0LmRpdi5zdHlsZS5kaXNwbGF5PSIiO3QuZGl2LnJlbW92ZSgpO3QuaXNBdHRhY2hlZFRvRE9NPSExO2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5JiZ0aGlzLiNwZS5mb2N1c01haW5Db250YWluZXIoKX0pLDApO3RoaXMuI2RlfHx0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKCExKX0jbWUodCl7aWYodC5wYXJlbnQhPT10aGlzKXtpZih0LmFubm90YXRpb25FbGVtZW50SWQpe3RoaXMuI3BlLmFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0LmFubm90YXRpb25FbGVtZW50SWQpO3IuQW5ub3RhdGlvbkVkaXRvci5kZWxldGVBbm5vdGF0aW9uRWxlbWVudCh0KTt0LmFubm90YXRpb25FbGVtZW50SWQ9bnVsbH10aGlzLmF0dGFjaCh0KTt0LnBhcmVudD8uZGV0YWNoKHQpO3Quc2V0UGFyZW50KHRoaXMpO2lmKHQuZGl2JiZ0LmlzQXR0YWNoZWRUb0RPTSl7dC5kaXYucmVtb3ZlKCk7dGhpcy5kaXYuYXBwZW5kKHQuZGl2KX19fWFkZCh0KXt0aGlzLiNtZSh0KTt0aGlzLiNwZS5hZGRFZGl0b3IodCk7dGhpcy5hdHRhY2godCk7aWYoIXQuaXNBdHRhY2hlZFRvRE9NKXtjb25zdCBlPXQucmVuZGVyKCk7dGhpcy5kaXYuYXBwZW5kKGUpO3QuaXNBdHRhY2hlZFRvRE9NPSEwfXRoaXMubW92ZUVkaXRvckluRE9NKHQpO3Qub25jZUFkZGVkKCk7dGhpcy4jcGUuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSh0KX1tb3ZlRWRpdG9ySW5ET00odCl7dGhpcy4jcmU/Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsdC5kaXYsdC5jb250ZW50RGl2LCEwKX1hZGRPclJlYnVpbGQodCl7dC5uZWVkc1RvQmVSZWJ1aWx0KCk/dC5yZWJ1aWxkKCk6dGhpcy5hZGQodCl9YWRkVW5kb2FibGVFZGl0b3IodCl7dGhpcy5hZGRDb21tYW5kcyh7Y21kOigpPT57dGhpcy5hZGRPclJlYnVpbGQodCl9LHVuZG86KCk9Pnt0LnJlbW92ZSgpfSxtdXN0RXhlYzohMX0pfWdldE5leHRJZCgpe3JldHVybiB0aGlzLiNwZS5nZXRJZCgpfSNiZSh0KXtzd2l0Y2godGhpcy4jcGUuZ2V0TW9kZSgpKXtjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6cmV0dXJuIG5ldyBhLkZyZWVUZXh0RWRpdG9yKHQpO2Nhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks6cmV0dXJuIG5ldyBvLklua0VkaXRvcih0KTtjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVA6cmV0dXJuIG5ldyBjLlN0YW1wRWRpdG9yKHQpfXJldHVybiBudWxsfWRlc2VyaWFsaXplKHQpe3N3aXRjaCh0LmFubm90YXRpb25UeXBlPz90LmFubm90YXRpb25FZGl0b3JUeXBlKXtjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6cmV0dXJuIGEuRnJlZVRleHRFZGl0b3IuZGVzZXJpYWxpemUodCx0aGlzLHRoaXMuI3BlKTtjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LOnJldHVybiBvLklua0VkaXRvci5kZXNlcmlhbGl6ZSh0LHRoaXMsdGhpcy4jcGUpO2Nhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUDpyZXR1cm4gYy5TdGFtcEVkaXRvci5kZXNlcmlhbGl6ZSh0LHRoaXMsdGhpcy4jcGUpfXJldHVybiBudWxsfSNnZSh0KXtjb25zdCBlPXRoaXMuZ2V0TmV4dElkKCksbj10aGlzLiNiZSh7cGFyZW50OnRoaXMsaWQ6ZSx4OnQub2Zmc2V0WCx5OnQub2Zmc2V0WSx1aU1hbmFnZXI6dGhpcy4jcGV9KTtuJiZ0aGlzLmFkZChuKTtyZXR1cm4gbn1zZXRTZWxlY3RlZCh0KXt0aGlzLiNwZS5zZXRTZWxlY3RlZCh0KX10b2dnbGVTZWxlY3RlZCh0KXt0aGlzLiNwZS50b2dnbGVTZWxlY3RlZCh0KX1pc1NlbGVjdGVkKHQpe3JldHVybiB0aGlzLiNwZS5pc1NlbGVjdGVkKHQpfXVuc2VsZWN0KHQpe3RoaXMuI3BlLnVuc2VsZWN0KHQpfXBvaW50ZXJ1cCh0KXtjb25zdHtpc01hYzplfT1pLkZlYXR1cmVUZXN0LnBsYXRmb3JtO2lmKCEoMCE9PXQuYnV0dG9ufHx0LmN0cmxLZXkmJmUpJiZ0LnRhcmdldD09PXRoaXMuZGl2JiZ0aGlzLiNoZSl7dGhpcy4jaGU9ITE7dGhpcy4jc2U/dGhpcy4jZ2UodCk6dGhpcy4jc2U9ITB9fXBvaW50ZXJkb3duKHQpe2lmKHRoaXMuI2hlKXt0aGlzLiNoZT0hMTtyZXR1cm59Y29uc3R7aXNNYWM6ZX09aS5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtpZigwIT09dC5idXR0b258fHQuY3RybEtleSYmZSlyZXR1cm47aWYodC50YXJnZXQhPT10aGlzLmRpdilyZXR1cm47dGhpcy4jaGU9ITA7Y29uc3Qgbj10aGlzLiNwZS5nZXRBY3RpdmUoKTt0aGlzLiNzZT0hbnx8bi5pc0VtcHR5KCl9ZHJvcCh0KXtjb25zdCBlPXQuZGF0YVRyYW5zZmVyLmdldERhdGEoInRleHQvcGxhaW4iKSxuPXRoaXMuI3BlLmdldEVkaXRvcihlKTtpZighbilyZXR1cm47dC5wcmV2ZW50RGVmYXVsdCgpO3QuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Im1vdmUiO3RoaXMuI21lKG4pO2NvbnN0IGk9dGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj10LmNsaWVudFgtaS54LHM9dC5jbGllbnRZLWkueTtuLnRyYW5zbGF0ZShyLW4uc3RhcnRYLHMtbi5zdGFydFkpO3RoaXMubW92ZUVkaXRvckluRE9NKG4pO24uZGl2LmZvY3VzKCl9ZHJhZ292ZXIodCl7dC5wcmV2ZW50RGVmYXVsdCgpfWRlc3Ryb3koKXt0aGlzLiNwZS5nZXRBY3RpdmUoKT8ucGFyZW50PT09dGhpcyYmdGhpcy4jcGUuc2V0QWN0aXZlRWRpdG9yKG51bGwpO2Zvcihjb25zdCB0IG9mIHRoaXMuI2NlLnZhbHVlcygpKXt0aGlzLiNyZT8ucmVtb3ZlUG9pbnRlckluVGV4dExheWVyKHQuY29udGVudERpdik7dC5zZXRQYXJlbnQobnVsbCk7dC5pc0F0dGFjaGVkVG9ET009ITE7dC5kaXYucmVtb3ZlKCl9dGhpcy5kaXY9bnVsbDt0aGlzLiNjZS5jbGVhcigpO3RoaXMuI3BlLnJlbW92ZUxheWVyKHRoaXMpfSNmZSgpe3RoaXMuI2RlPSEwO2Zvcihjb25zdCB0IG9mIHRoaXMuI2NlLnZhbHVlcygpKXQuaXNFbXB0eSgpJiZ0LnJlbW92ZSgpO3RoaXMuI2RlPSExfXJlbmRlcih0KXtsZXR7dmlld3BvcnQ6ZX09dDt0aGlzLnZpZXdwb3J0PWU7KDAsbC5zZXRMYXllckRpbWVuc2lvbnMpKHRoaXMuZGl2LGUpOygwLHMuYmluZEV2ZW50cykodGhpcyx0aGlzLmRpdixbImRyYWdvdmVyIiwiZHJvcCJdKTtmb3IoY29uc3QgdCBvZiB0aGlzLiNwZS5nZXRFZGl0b3JzKHRoaXMucGFnZUluZGV4KSl0aGlzLmFkZCh0KTt0aGlzLnVwZGF0ZU1vZGUoKX11cGRhdGUodCl7bGV0e3ZpZXdwb3J0OmV9PXQ7dGhpcy4jcGUuY29tbWl0T3JSZW1vdmUoKTt0aGlzLnZpZXdwb3J0PWU7KDAsbC5zZXRMYXllckRpbWVuc2lvbnMpKHRoaXMuZGl2LHtyb3RhdGlvbjplLnJvdGF0aW9ufSk7dGhpcy51cGRhdGVNb2RlKCl9Z2V0IHBhZ2VEaW1lbnNpb25zKCl7Y29uc3R7cGFnZVdpZHRoOnQscGFnZUhlaWdodDplfT10aGlzLnZpZXdwb3J0LnJhd0RpbXM7cmV0dXJuW3QsZV19fWUuQW5ub3RhdGlvbkVkaXRvckxheWVyPUFubm90YXRpb25FZGl0b3JMYXllcn0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5GcmVlVGV4dEVkaXRvcj12b2lkIDA7big4OSk7dmFyIGk9bigxKSxyPW4oMTY0KSxzPW4oMTYzKSxhPW4oMTk3KTtjbGFzcyBGcmVlVGV4dEVkaXRvciBleHRlbmRzIHMuQW5ub3RhdGlvbkVkaXRvcnsjdmU9dGhpcy5lZGl0b3JEaXZCbHVyLmJpbmQodGhpcyk7I3llPXRoaXMuZWRpdG9yRGl2Rm9jdXMuYmluZCh0aGlzKTsjQWU9dGhpcy5lZGl0b3JEaXZJbnB1dC5iaW5kKHRoaXMpOyNfZT10aGlzLmVkaXRvckRpdktleWRvd24uYmluZCh0aGlzKTsjU2U7I0VlPSIiOyN4ZT1gJHt0aGlzLmlkfS1lZGl0b3JgOyN3ZTsjQ2U9bnVsbDtzdGF0aWMgX2ZyZWVUZXh0RGVmYXVsdENvbnRlbnQ9IiI7c3RhdGljIF9sMTBuUHJvbWlzZTtzdGF0aWMgX2ludGVybmFsUGFkZGluZz0wO3N0YXRpYyBfZGVmYXVsdENvbG9yPW51bGw7c3RhdGljIF9kZWZhdWx0Rm9udFNpemU9MTA7c3RhdGljIGdldCBfa2V5Ym9hcmRNYW5hZ2VyKCl7Y29uc3QgdD1GcmVlVGV4dEVkaXRvci5wcm90b3R5cGUsYXJyb3dDaGVja2VyPXQ9PnQuaXNFbXB0eSgpLGU9ci5Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLlRSQU5TTEFURV9TTUFMTCxuPXIuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfQklHO3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJfa2V5Ym9hcmRNYW5hZ2VyIixuZXcgci5LZXlib2FyZE1hbmFnZXIoW1tbImN0cmwrcyIsIm1hYyttZXRhK3MiLCJjdHJsK3AiLCJtYWMrbWV0YStwIl0sdC5jb21taXRPclJlbW92ZSx7YnViYmxlczohMH1dLFtbImN0cmwrRW50ZXIiLCJtYWMrbWV0YStFbnRlciIsIkVzY2FwZSIsIm1hYytFc2NhcGUiXSx0LmNvbW1pdE9yUmVtb3ZlXSxbWyJBcnJvd0xlZnQiLCJtYWMrQXJyb3dMZWZ0Il0sdC5fdHJhbnNsYXRlRW1wdHkse2FyZ3M6Wy1lLDBdLGNoZWNrZXI6YXJyb3dDaGVja2VyfV0sW1siY3RybCtBcnJvd0xlZnQiLCJtYWMrc2hpZnQrQXJyb3dMZWZ0Il0sdC5fdHJhbnNsYXRlRW1wdHkse2FyZ3M6Wy1uLDBdLGNoZWNrZXI6YXJyb3dDaGVja2VyfV0sW1siQXJyb3dSaWdodCIsIm1hYytBcnJvd1JpZ2h0Il0sdC5fdHJhbnNsYXRlRW1wdHkse2FyZ3M6W2UsMF0sY2hlY2tlcjphcnJvd0NoZWNrZXJ9XSxbWyJjdHJsK0Fycm93UmlnaHQiLCJtYWMrc2hpZnQrQXJyb3dSaWdodCJdLHQuX3RyYW5zbGF0ZUVtcHR5LHthcmdzOltuLDBdLGNoZWNrZXI6YXJyb3dDaGVja2VyfV0sW1siQXJyb3dVcCIsIm1hYytBcnJvd1VwIl0sdC5fdHJhbnNsYXRlRW1wdHkse2FyZ3M6WzAsLWVdLGNoZWNrZXI6YXJyb3dDaGVja2VyfV0sW1siY3RybCtBcnJvd1VwIiwibWFjK3NoaWZ0K0Fycm93VXAiXSx0Ll90cmFuc2xhdGVFbXB0eSx7YXJnczpbMCwtbl0sY2hlY2tlcjphcnJvd0NoZWNrZXJ9XSxbWyJBcnJvd0Rvd24iLCJtYWMrQXJyb3dEb3duIl0sdC5fdHJhbnNsYXRlRW1wdHkse2FyZ3M6WzAsZV0sY2hlY2tlcjphcnJvd0NoZWNrZXJ9XSxbWyJjdHJsK0Fycm93RG93biIsIm1hYytzaGlmdCtBcnJvd0Rvd24iXSx0Ll90cmFuc2xhdGVFbXB0eSx7YXJnczpbMCxuXSxjaGVja2VyOmFycm93Q2hlY2tlcn1dXSkpfXN0YXRpYyBfdHlwZT0iZnJlZXRleHQiO2NvbnN0cnVjdG9yKHQpe3N1cGVyKHsuLi50LG5hbWU6ImZyZWVUZXh0RWRpdG9yIn0pO3RoaXMuI1NlPXQuY29sb3J8fEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3J8fHMuQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcjt0aGlzLiN3ZT10LmZvbnRTaXplfHxGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplfXN0YXRpYyBpbml0aWFsaXplKHQpe3RoaXMuX2wxMG5Qcm9taXNlPW5ldyBNYXAoWyJmcmVlX3RleHQyX2RlZmF1bHRfY29udGVudCIsImVkaXRvcl9mcmVlX3RleHQyX2FyaWFfbGFiZWwiXS5tYXAoKGU9PltlLHQuZ2V0KGUpXSkpKTtjb25zdCBlPWdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTt0aGlzLl9pbnRlcm5hbFBhZGRpbmc9cGFyc2VGbG9hdChlLmdldFByb3BlcnR5VmFsdWUoIi0tZnJlZXRleHQtcGFkZGluZyIpKX1zdGF0aWMgdXBkYXRlRGVmYXVsdFBhcmFtcyh0LGUpe3N3aXRjaCh0KXtjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRTpGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplPWU7YnJlYWs7Y2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SOkZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3I9ZX19dXBkYXRlUGFyYW1zKHQsZSl7c3dpdGNoKHQpe2Nhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFOnRoaXMuI1RlKGUpO2JyZWFrO2Nhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUjp0aGlzLiNQZShlKX19c3RhdGljIGdldCBkZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKCl7cmV0dXJuW1tpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRGb250U2l6ZV0sW2kuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1IsRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvcnx8cy5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXV19Z2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpe3JldHVybltbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLHRoaXMuI3dlXSxbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUix0aGlzLiNTZV1dfSNUZSh0KXtjb25zdCBzZXRGb250c2l6ZT10PT57dGhpcy5lZGl0b3JEaXYuc3R5bGUuZm9udFNpemU9YGNhbGMoJHt0fXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO3RoaXMudHJhbnNsYXRlKDAsLSh0LXRoaXMuI3dlKSp0aGlzLnBhcmVudFNjYWxlKTt0aGlzLiN3ZT10O3RoaXMuI2tlKCl9LGU9dGhpcy4jd2U7dGhpcy5hZGRDb21tYW5kcyh7Y21kOigpPT57c2V0Rm9udHNpemUodCl9LHVuZG86KCk9PntzZXRGb250c2l6ZShlKX0sbXVzdEV4ZWM6ITAsdHlwZTppLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsb3ZlcndyaXRlSWZTYW1lVHlwZTohMCxrZWVwVW5kbzohMH0pfSNQZSh0KXtjb25zdCBlPXRoaXMuI1NlO3RoaXMuYWRkQ29tbWFuZHMoe2NtZDooKT0+e3RoaXMuI1NlPXRoaXMuZWRpdG9yRGl2LnN0eWxlLmNvbG9yPXR9LHVuZG86KCk9Pnt0aGlzLiNTZT10aGlzLmVkaXRvckRpdi5zdHlsZS5jb2xvcj1lfSxtdXN0RXhlYzohMCx0eXBlOmkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1Isb3ZlcndyaXRlSWZTYW1lVHlwZTohMCxrZWVwVW5kbzohMH0pfV90cmFuc2xhdGVFbXB0eSh0LGUpe3RoaXMuX3VpTWFuYWdlci50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnModCxlLCEwKX1nZXRJbml0aWFsVHJhbnNsYXRpb24oKXtjb25zdCB0PXRoaXMucGFyZW50U2NhbGU7cmV0dXJuWy1GcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nKnQsLShGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nK3RoaXMuI3dlKSp0XX1yZWJ1aWxkKCl7c3VwZXIucmVidWlsZCgpO251bGwhPT10aGlzLmRpdiYmKHRoaXMuaXNBdHRhY2hlZFRvRE9NfHx0aGlzLnBhcmVudC5hZGQodGhpcykpfWVuYWJsZUVkaXRNb2RlKCl7aWYoIXRoaXMuaXNJbkVkaXRNb2RlKCkpe3RoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZSghMSk7dGhpcy5wYXJlbnQudXBkYXRlVG9vbGJhcihpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUKTtzdXBlci5lbmFibGVFZGl0TW9kZSgpO3RoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QucmVtb3ZlKCJlbmFibGVkIik7dGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlPSEwO3RoaXMuZGl2LmRyYWdnYWJsZT0hMTt0aGlzLmRpdi5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIpO3RoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuI19lKTt0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy4jeWUpO3RoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuI3ZlKTt0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsdGhpcy4jQWUpfX1kaXNhYmxlRWRpdE1vZGUoKXtpZih0aGlzLmlzSW5FZGl0TW9kZSgpKXt0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUoITApO3N1cGVyLmRpc2FibGVFZGl0TW9kZSgpO3RoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKCJlbmFibGVkIik7dGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlPSExO3RoaXMuZGl2LnNldEF0dHJpYnV0ZSgiYXJpYS1hY3RpdmVkZXNjZW5kYW50Iix0aGlzLiN4ZSk7dGhpcy5kaXYuZHJhZ2dhYmxlPSEwO3RoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuI19lKTt0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy4jeWUpO3RoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuI3ZlKTt0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnB1dCIsdGhpcy4jQWUpO3RoaXMuZGl2LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSk7dGhpcy5pc0VkaXRpbmc9ITE7dGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC5hZGQoImZyZWVUZXh0RWRpdGluZyIpfX1mb2N1c2luKHQpe3N1cGVyLmZvY3VzaW4odCk7dC50YXJnZXQhPT10aGlzLmVkaXRvckRpdiYmdGhpcy5lZGl0b3JEaXYuZm9jdXMoKX1vbmNlQWRkZWQoKXtpZih0aGlzLndpZHRoKXRoaXMuI01lKCk7ZWxzZXt0aGlzLmVuYWJsZUVkaXRNb2RlKCk7dGhpcy5lZGl0b3JEaXYuZm9jdXMoKX19aXNFbXB0eSgpe3JldHVybiF0aGlzLmVkaXRvckRpdnx8IiI9PT10aGlzLmVkaXRvckRpdi5pbm5lclRleHQudHJpbSgpfXJlbW92ZSgpe3RoaXMuaXNFZGl0aW5nPSExO2lmKHRoaXMucGFyZW50KXt0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUoITApO3RoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKCJmcmVlVGV4dEVkaXRpbmciKX1zdXBlci5yZW1vdmUoKX0jUmUoKXtjb25zdCB0PXRoaXMuZWRpdG9yRGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHRoaXMuZWRpdG9yRGl2LmlubmVyVGV4dDtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHQpZS5wdXNoKG4uaW5uZXJUZXh0LnJlcGxhY2UoL1xyXG4/fFxuLywiIikpO3JldHVybiBlLmpvaW4oIlxuIil9I2tlKCl7Y29uc3RbdCxlXT10aGlzLnBhcmVudERpbWVuc2lvbnM7bGV0IG47aWYodGhpcy5pc0F0dGFjaGVkVG9ET00pbj10aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle2NvbnN0e2N1cnJlbnRMYXllcjp0LGRpdjplfT10aGlzLGk9ZS5zdHlsZS5kaXNwbGF5O2Uuc3R5bGUuZGlzcGxheT0iaGlkZGVuIjt0LmRpdi5hcHBlbmQodGhpcy5kaXYpO249ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlLnJlbW92ZSgpO2Uuc3R5bGUuZGlzcGxheT1pfWlmKHRoaXMucm90YXRpb24lMTgwPT10aGlzLnBhcmVudFJvdGF0aW9uJTE4MCl7dGhpcy53aWR0aD1uLndpZHRoL3Q7dGhpcy5oZWlnaHQ9bi5oZWlnaHQvZX1lbHNle3RoaXMud2lkdGg9bi5oZWlnaHQvdDt0aGlzLmhlaWdodD1uLndpZHRoL2V9dGhpcy5maXhBbmRTZXRQb3NpdGlvbigpfWNvbW1pdCgpe2lmKCF0aGlzLmlzSW5FZGl0TW9kZSgpKXJldHVybjtzdXBlci5jb21taXQoKTt0aGlzLmRpc2FibGVFZGl0TW9kZSgpO2NvbnN0IHQ9dGhpcy4jRWUsZT10aGlzLiNFZT10aGlzLiNSZSgpLnRyaW1FbmQoKTtpZih0PT09ZSlyZXR1cm47Y29uc3Qgc2V0VGV4dD10PT57dGhpcy4jRWU9dDtpZih0KXt0aGlzLiNGZSgpO3RoaXMucmVidWlsZCgpO3RoaXMuI2tlKCl9ZWxzZSB0aGlzLnJlbW92ZSgpfTt0aGlzLmFkZENvbW1hbmRzKHtjbWQ6KCk9PntzZXRUZXh0KGUpfSx1bmRvOigpPT57c2V0VGV4dCh0KX0sbXVzdEV4ZWM6ITF9KTt0aGlzLiNrZSgpfXNob3VsZEdldEtleWJvYXJkRXZlbnRzKCl7cmV0dXJuIHRoaXMuaXNJbkVkaXRNb2RlKCl9ZW50ZXJJbkVkaXRNb2RlKCl7dGhpcy5lbmFibGVFZGl0TW9kZSgpO3RoaXMuZWRpdG9yRGl2LmZvY3VzKCl9ZGJsY2xpY2sodCl7dGhpcy5lbnRlckluRWRpdE1vZGUoKX1rZXlkb3duKHQpe3QudGFyZ2V0PT09dGhpcy5kaXYmJiJFbnRlciI9PT10LmtleSYmdGhpcy5lbnRlckluRWRpdE1vZGUoKX1lZGl0b3JEaXZLZXlkb3duKHQpe0ZyZWVUZXh0RWRpdG9yLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLHQpfWVkaXRvckRpdkZvY3VzKHQpe3RoaXMuaXNFZGl0aW5nPSEwfWVkaXRvckRpdkJsdXIodCl7dGhpcy5pc0VkaXRpbmc9ITF9ZWRpdG9yRGl2SW5wdXQodCl7dGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC50b2dnbGUoImZyZWVUZXh0RWRpdGluZyIsdGhpcy5pc0VtcHR5KCkpfWRpc2FibGVFZGl0aW5nKCl7dGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKCJyb2xlIiwiY29tbWVudCIpO3RoaXMuZWRpdG9yRGl2LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1tdWx0aWxpbmUiKX1lbmFibGVFZGl0aW5nKCl7dGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKCJyb2xlIiwidGV4dGJveCIpO3RoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aWxpbmUiLCEwKX1yZW5kZXIoKXtpZih0aGlzLmRpdilyZXR1cm4gdGhpcy5kaXY7bGV0IHQsZTtpZih0aGlzLndpZHRoKXt0PXRoaXMueDtlPXRoaXMueX1zdXBlci5yZW5kZXIoKTt0aGlzLmVkaXRvckRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmVkaXRvckRpdi5jbGFzc05hbWU9ImludGVybmFsIjt0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLiN4ZSk7dGhpcy5lbmFibGVFZGl0aW5nKCk7RnJlZVRleHRFZGl0b3IuX2wxMG5Qcm9taXNlLmdldCgiZWRpdG9yX2ZyZWVfdGV4dDJfYXJpYV9sYWJlbCIpLnRoZW4oKHQ9PnRoaXMuZWRpdG9yRGl2Py5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHQpKSk7RnJlZVRleHRFZGl0b3IuX2wxMG5Qcm9taXNlLmdldCgiZnJlZV90ZXh0Ml9kZWZhdWx0X2NvbnRlbnQiKS50aGVuKCh0PT50aGlzLmVkaXRvckRpdj8uc2V0QXR0cmlidXRlKCJkZWZhdWx0LWNvbnRlbnQiLHQpKSk7dGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlPSEwO2NvbnN0e3N0eWxlOm59PXRoaXMuZWRpdG9yRGl2O24uZm9udFNpemU9YGNhbGMoJHt0aGlzLiN3ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtuLmNvbG9yPXRoaXMuI1NlO3RoaXMuZGl2LmFwcGVuZCh0aGlzLmVkaXRvckRpdik7dGhpcy5vdmVybGF5RGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKCJvdmVybGF5IiwiZW5hYmxlZCIpO3RoaXMuZGl2LmFwcGVuZCh0aGlzLm92ZXJsYXlEaXYpOygwLHIuYmluZEV2ZW50cykodGhpcyx0aGlzLmRpdixbImRibGNsaWNrIiwia2V5ZG93biJdKTtpZih0aGlzLndpZHRoKXtjb25zdFtuLGldPXRoaXMucGFyZW50RGltZW5zaW9ucztpZih0aGlzLmFubm90YXRpb25FbGVtZW50SWQpe2NvbnN0e3Bvc2l0aW9uOnJ9PXRoaXMuI0NlO2xldFtzLGFdPXRoaXMuZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCk7W3MsYV09dGhpcy5wYWdlVHJhbnNsYXRpb25Ub1NjcmVlbihzLGEpO2NvbnN0W28sbF09dGhpcy5wYWdlRGltZW5zaW9ucyxbYyxoXT10aGlzLnBhZ2VUcmFuc2xhdGlvbjtsZXQgZCx1O3N3aXRjaCh0aGlzLnJvdGF0aW9uKXtjYXNlIDA6ZD10KyhyWzBdLWMpL287dT1lK3RoaXMuaGVpZ2h0LShyWzFdLWgpL2w7YnJlYWs7Y2FzZSA5MDpkPXQrKHJbMF0tYykvbzt1PWUtKHJbMV0taCkvbDtbcyxhXT1bYSwtc107YnJlYWs7Y2FzZSAxODA6ZD10LXRoaXMud2lkdGgrKHJbMF0tYykvbzt1PWUtKHJbMV0taCkvbDtbcyxhXT1bLXMsLWFdO2JyZWFrO2Nhc2UgMjcwOmQ9dCsoclswXS1jLXRoaXMuaGVpZ2h0KmwpL287dT1lKyhyWzFdLWgtdGhpcy53aWR0aCpvKS9sO1tzLGFdPVstYSxzXX10aGlzLnNldEF0KGQqbix1KmkscyxhKX1lbHNlIHRoaXMuc2V0QXQodCpuLGUqaSx0aGlzLndpZHRoKm4sdGhpcy5oZWlnaHQqaSk7dGhpcy4jRmUoKTt0aGlzLmRpdi5kcmFnZ2FibGU9ITA7dGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlPSExfWVsc2V7dGhpcy5kaXYuZHJhZ2dhYmxlPSExO3RoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZT0hMH1yZXR1cm4gdGhpcy5kaXZ9I0ZlKCl7dGhpcy5lZGl0b3JEaXYucmVwbGFjZUNoaWxkcmVuKCk7aWYodGhpcy4jRWUpZm9yKGNvbnN0IHQgb2YgdGhpcy4jRWUuc3BsaXQoIlxuIikpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5hcHBlbmQodD9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt0aGlzLmVkaXRvckRpdi5hcHBlbmQoZSl9fWdldCBjb250ZW50RGl2KCl7cmV0dXJuIHRoaXMuZWRpdG9yRGl2fXN0YXRpYyBkZXNlcmlhbGl6ZSh0LGUsbil7bGV0IHI9bnVsbDtpZih0IGluc3RhbmNlb2YgYS5GcmVlVGV4dEFubm90YXRpb25FbGVtZW50KXtjb25zdHtkYXRhOntkZWZhdWx0QXBwZWFyYW5jZURhdGE6e2ZvbnRTaXplOmUsZm9udENvbG9yOm59LHJlY3Q6cyxyb3RhdGlvbjphLGlkOm99LHRleHRDb250ZW50OmwsdGV4dFBvc2l0aW9uOmMscGFyZW50OntwYWdlOntwYWdlTnVtYmVyOmh9fX09dDtpZighbHx8MD09PWwubGVuZ3RoKXJldHVybiBudWxsO3I9dD17YW5ub3RhdGlvblR5cGU6aS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVCxjb2xvcjpBcnJheS5mcm9tKG4pLGZvbnRTaXplOmUsdmFsdWU6bC5qb2luKCJcbiIpLHBvc2l0aW9uOmMscGFnZUluZGV4OmgtMSxyZWN0OnMscm90YXRpb246YSxpZDpvLGRlbGV0ZWQ6ITF9fWNvbnN0IHM9c3VwZXIuZGVzZXJpYWxpemUodCxlLG4pO3MuI3dlPXQuZm9udFNpemU7cy4jU2U9aS5VdGlsLm1ha2VIZXhDb2xvciguLi50LmNvbG9yKTtzLiNFZT10LnZhbHVlO3MuYW5ub3RhdGlvbkVsZW1lbnRJZD10LmlkfHxudWxsO3MuI0NlPXI7cmV0dXJuIHN9c2VyaWFsaXplKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDtpZih0aGlzLmRlbGV0ZWQpcmV0dXJue3BhZ2VJbmRleDp0aGlzLnBhZ2VJbmRleCxpZDp0aGlzLmFubm90YXRpb25FbGVtZW50SWQsZGVsZXRlZDohMH07Y29uc3QgZT1GcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nKnRoaXMucGFyZW50U2NhbGUsbj10aGlzLmdldFJlY3QoZSxlKSxyPXMuQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5pc0F0dGFjaGVkVG9ET00/Z2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVkaXRvckRpdikuY29sb3I6dGhpcy4jU2UpLGE9e2Fubm90YXRpb25UeXBlOmkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsY29sb3I6cixmb250U2l6ZTp0aGlzLiN3ZSx2YWx1ZTp0aGlzLiNFZSxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgscmVjdDpuLHJvdGF0aW9uOnRoaXMucm90YXRpb259O2lmKHQpcmV0dXJuIGE7aWYodGhpcy5hbm5vdGF0aW9uRWxlbWVudElkJiYhdGhpcy4jSWUoYSkpcmV0dXJuIG51bGw7YS5pZD10aGlzLmFubm90YXRpb25FbGVtZW50SWQ7cmV0dXJuIGF9I0llKHQpe2NvbnN0e3ZhbHVlOmUsZm9udFNpemU6bixjb2xvcjppLHJlY3Q6cixwYWdlSW5kZXg6c309dGhpcy4jQ2U7cmV0dXJuIHQudmFsdWUhPT1lfHx0LmZvbnRTaXplIT09bnx8dC5yZWN0LnNvbWUoKCh0LGUpPT5NYXRoLmFicyh0LXJbZV0pPj0xKSl8fHQuY29sb3Iuc29tZSgoKHQsZSk9PnQhPT1pW2VdKSl8fHQucGFnZUluZGV4IT09c30jTWUoKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2lmKCF0aGlzLmFubm90YXRpb25FbGVtZW50SWQpcmV0dXJuO3RoaXMuI2tlKCk7aWYoIXQmJigwPT09dGhpcy53aWR0aHx8MD09PXRoaXMuaGVpZ2h0KSl7c2V0VGltZW91dCgoKCk9PnRoaXMuI01lKCEwKSksMCk7cmV0dXJufWNvbnN0IGU9RnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyp0aGlzLnBhcmVudFNjYWxlO3RoaXMuI0NlLnJlY3Q9dGhpcy5nZXRSZWN0KGUsZSl9fWUuRnJlZVRleHRFZGl0b3I9RnJlZVRleHRFZGl0b3J9LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuU3RhbXBBbm5vdGF0aW9uRWxlbWVudD1lLklua0Fubm90YXRpb25FbGVtZW50PWUuRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudD1lLkFubm90YXRpb25MYXllcj12b2lkIDA7big4OSk7bigxMjUpO24oMTM1KTtuKDEzNyk7bigxNDApO24oMTQyKTtuKDE0NCk7bigxNDYpO3ZhciBpPW4oMSkscj1uKDE2Nykscz1uKDE2MiksYT1uKDE5OCksbz1uKDE5OSksbD1uKDIwMCk7Y29uc3QgYz0xZTMsaD1uZXcgV2Vha1NldDtmdW5jdGlvbiBnZXRSZWN0RGltcyh0KXtyZXR1cm57d2lkdGg6dFsyXS10WzBdLGhlaWdodDp0WzNdLXRbMV19fWNsYXNzIEFubm90YXRpb25FbGVtZW50RmFjdG9yeXtzdGF0aWMgY3JlYXRlKHQpe3N3aXRjaCh0LmRhdGEuYW5ub3RhdGlvblR5cGUpe2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5MSU5LOnJldHVybiBuZXcgTGlua0Fubm90YXRpb25FbGVtZW50KHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5URVhUOnJldHVybiBuZXcgVGV4dEFubm90YXRpb25FbGVtZW50KHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5XSURHRVQ6c3dpdGNoKHQuZGF0YS5maWVsZFR5cGUpe2Nhc2UiVHgiOnJldHVybiBuZXcgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50KHQpO2Nhc2UiQnRuIjpyZXR1cm4gdC5kYXRhLnJhZGlvQnV0dG9uP25ldyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHQpOnQuZGF0YS5jaGVja0JveD9uZXcgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCh0KTpuZXcgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHQpO2Nhc2UiQ2giOnJldHVybiBuZXcgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCk7Y2FzZSJTaWciOnJldHVybiBuZXcgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCl9cmV0dXJuIG5ldyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuUE9QVVA6cmV0dXJuIG5ldyBQb3B1cEFubm90YXRpb25FbGVtZW50KHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDpyZXR1cm4gbmV3IEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLkxJTkU6cmV0dXJuIG5ldyBMaW5lQW5ub3RhdGlvbkVsZW1lbnQodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLlNRVUFSRTpyZXR1cm4gbmV3IFNxdWFyZUFubm90YXRpb25FbGVtZW50KHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5DSVJDTEU6cmV0dXJuIG5ldyBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudCh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU6cmV0dXJuIG5ldyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50KHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5DQVJFVDpyZXR1cm4gbmV3IENhcmV0QW5ub3RhdGlvbkVsZW1lbnQodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLklOSzpyZXR1cm4gbmV3IElua0Fubm90YXRpb25FbGVtZW50KHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5QT0xZR09OOnJldHVybiBuZXcgUG9seWdvbkFubm90YXRpb25FbGVtZW50KHQpO2Nhc2UgaS5Bbm5vdGF0aW9uVHlwZS5ISUdITElHSFQ6cmV0dXJuIG5ldyBIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudCh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOnJldHVybiBuZXcgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLlNRVUlHR0xZOnJldHVybiBuZXcgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOnJldHVybiBuZXcgU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnQodCk7Y2FzZSBpLkFubm90YXRpb25UeXBlLlNUQU1QOnJldHVybiBuZXcgU3RhbXBBbm5vdGF0aW9uRWxlbWVudCh0KTtjYXNlIGkuQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ6cmV0dXJuIG5ldyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50KHQpO2RlZmF1bHQ6cmV0dXJuIG5ldyBBbm5vdGF0aW9uRWxlbWVudCh0KX19fWNsYXNzIEFubm90YXRpb25FbGVtZW50eyNEZT0hMTtjb25zdHJ1Y3Rvcih0KXtsZXR7aXNSZW5kZXJhYmxlOmU9ITEsaWdub3JlQm9yZGVyOm49ITEsY3JlYXRlUXVhZHJpbGF0ZXJhbHM6aT0hMX09YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3RoaXMuaXNSZW5kZXJhYmxlPWU7dGhpcy5kYXRhPXQuZGF0YTt0aGlzLmxheWVyPXQubGF5ZXI7dGhpcy5saW5rU2VydmljZT10LmxpbmtTZXJ2aWNlO3RoaXMuZG93bmxvYWRNYW5hZ2VyPXQuZG93bmxvYWRNYW5hZ2VyO3RoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoPXQuaW1hZ2VSZXNvdXJjZXNQYXRoO3RoaXMucmVuZGVyRm9ybXM9dC5yZW5kZXJGb3Jtczt0aGlzLnN2Z0ZhY3Rvcnk9dC5zdmdGYWN0b3J5O3RoaXMuYW5ub3RhdGlvblN0b3JhZ2U9dC5hbm5vdGF0aW9uU3RvcmFnZTt0aGlzLmVuYWJsZVNjcmlwdGluZz10LmVuYWJsZVNjcmlwdGluZzt0aGlzLmhhc0pTQWN0aW9ucz10Lmhhc0pTQWN0aW9uczt0aGlzLl9maWVsZE9iamVjdHM9dC5maWVsZE9iamVjdHM7dGhpcy5wYXJlbnQ9dC5wYXJlbnQ7ZSYmKHRoaXMuY29udGFpbmVyPXRoaXMuX2NyZWF0ZUNvbnRhaW5lcihuKSk7aSYmdGhpcy5fY3JlYXRlUXVhZHJpbGF0ZXJhbHMoKX1fY3JlYXRlQ29udGFpbmVyKHQpe2NvbnN0e2RhdGE6ZSxwYXJlbnQ6e3BhZ2U6bix2aWV3cG9ydDpyfX09dGhpcyxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlY3Rpb24iKTtzLnNldEF0dHJpYnV0ZSgiZGF0YS1hbm5vdGF0aW9uLWlkIixlLmlkKTtzLnN0eWxlLnpJbmRleD10aGlzLnBhcmVudC56SW5kZXgrKzt0aGlzLmRhdGEucG9wdXBSZWYmJnMuc2V0QXR0cmlidXRlKCJhcmlhLWhhc3BvcHVwIiwiZGlhbG9nIik7ZS5ub1JvdGF0ZSYmcy5jbGFzc0xpc3QuYWRkKCJub3JvdGF0ZSIpO2NvbnN0e3BhZ2VXaWR0aDphLHBhZ2VIZWlnaHQ6byxwYWdlWDpsLHBhZ2VZOmN9PXIucmF3RGltcztpZighZS5yZWN0fHx0aGlzIGluc3RhbmNlb2YgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCl7Y29uc3R7cm90YXRpb246dH09ZTtlLmhhc093bkNhbnZhc3x8MD09PXR8fHRoaXMuc2V0Um90YXRpb24odCxzKTtyZXR1cm4gc31jb25zdHt3aWR0aDpoLGhlaWdodDpkfT1nZXRSZWN0RGltcyhlLnJlY3QpLHU9aS5VdGlsLm5vcm1hbGl6ZVJlY3QoW2UucmVjdFswXSxuLnZpZXdbM10tZS5yZWN0WzFdK24udmlld1sxXSxlLnJlY3RbMl0sbi52aWV3WzNdLWUucmVjdFszXStuLnZpZXdbMV1dKTtpZighdCYmZS5ib3JkZXJTdHlsZS53aWR0aD4wKXtzLnN0eWxlLmJvcmRlcldpZHRoPWAke2UuYm9yZGVyU3R5bGUud2lkdGh9cHhgO2NvbnN0IHQ9ZS5ib3JkZXJTdHlsZS5ob3Jpem9udGFsQ29ybmVyUmFkaXVzLG49ZS5ib3JkZXJTdHlsZS52ZXJ0aWNhbENvcm5lclJhZGl1cztpZih0PjB8fG4+MCl7Y29uc3QgZT1gY2FsYygke3R9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoJHtufXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO3Muc3R5bGUuYm9yZGVyUmFkaXVzPWV9ZWxzZSBpZih0aGlzIGluc3RhbmNlb2YgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCl7Y29uc3QgdD1gY2FsYygke2h9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoJHtkfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO3Muc3R5bGUuYm9yZGVyUmFkaXVzPXR9c3dpdGNoKGUuYm9yZGVyU3R5bGUuc3R5bGUpe2Nhc2UgaS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOnMuc3R5bGUuYm9yZGVyU3R5bGU9InNvbGlkIjticmVhaztjYXNlIGkuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ6cy5zdHlsZS5ib3JkZXJTdHlsZT0iZGFzaGVkIjticmVhaztjYXNlIGkuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEOigwLGkud2FybikoIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBiZXZlbGVkIik7YnJlYWs7Y2FzZSBpLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ6KDAsaS53YXJuKSgiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGluc2V0Iik7YnJlYWs7Y2FzZSBpLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOnMuc3R5bGUuYm9yZGVyQm90dG9tU3R5bGU9InNvbGlkIn1jb25zdCByPWUuYm9yZGVyQ29sb3J8fG51bGw7aWYocil7dGhpcy4jRGU9ITA7cy5zdHlsZS5ib3JkZXJDb2xvcj1pLlV0aWwubWFrZUhleENvbG9yKDB8clswXSwwfHJbMV0sMHxyWzJdKX1lbHNlIHMuc3R5bGUuYm9yZGVyV2lkdGg9MH1zLnN0eWxlLmxlZnQ9MTAwKih1WzBdLWwpL2ErIiUiO3Muc3R5bGUudG9wPTEwMCoodVsxXS1jKS9vKyIlIjtjb25zdHtyb3RhdGlvbjpwfT1lO2lmKGUuaGFzT3duQ2FudmFzfHwwPT09cCl7cy5zdHlsZS53aWR0aD0xMDAqaC9hKyIlIjtzLnN0eWxlLmhlaWdodD0xMDAqZC9vKyIlIn1lbHNlIHRoaXMuc2V0Um90YXRpb24ocCxzKTtyZXR1cm4gc31zZXRSb3RhdGlvbih0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5jb250YWluZXI7aWYoIXRoaXMuZGF0YS5yZWN0KXJldHVybjtjb25zdHtwYWdlV2lkdGg6bixwYWdlSGVpZ2h0Oml9PXRoaXMucGFyZW50LnZpZXdwb3J0LnJhd0RpbXMse3dpZHRoOnIsaGVpZ2h0OnN9PWdldFJlY3REaW1zKHRoaXMuZGF0YS5yZWN0KTtsZXQgYSxvO2lmKHQlMTgwPT0wKXthPTEwMCpyL247bz0xMDAqcy9pfWVsc2V7YT0xMDAqcy9uO289MTAwKnIvaX1lLnN0eWxlLndpZHRoPWAke2F9JWA7ZS5zdHlsZS5oZWlnaHQ9YCR7b30lYDtlLnNldEF0dHJpYnV0ZSgiZGF0YS1tYWluLXJvdGF0aW9uIiwoMzYwLXQpJTM2MCl9Z2V0IF9jb21tb25BY3Rpb25zKCl7Y29uc3Qgc2V0Q29sb3I9KHQsZSxuKT0+e2NvbnN0IGk9bi5kZXRhaWxbdF07bi50YXJnZXQuc3R5bGVbZV09YS5Db2xvckNvbnZlcnRlcnNbYCR7aVswXX1fSFRNTGBdKGkuc2xpY2UoMSkpfTtyZXR1cm4oMCxpLnNoYWRvdykodGhpcywiX2NvbW1vbkFjdGlvbnMiLHtkaXNwbGF5OnQ9Pntjb25zdCBlPXQuZGV0YWlsLmRpc3BsYXklMj09MTt0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5PWU/ImhpZGRlbiI6InZpc2libGUiO3RoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLHtoaWRkZW46ZSxwcmludDowPT09dC5kZXRhaWwuZGlzcGxheXx8Mz09PXQuZGV0YWlsLmRpc3BsYXl9KX0scHJpbnQ6dD0+e3RoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLHtwcmludDp0LmRldGFpbC5wcmludH0pfSxoaWRkZW46dD0+e3RoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9dC5kZXRhaWwuaGlkZGVuPyJoaWRkZW4iOiJ2aXNpYmxlIjt0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCx7aGlkZGVuOnQuZGV0YWlsLmhpZGRlbn0pfSxmb2N1czp0PT57c2V0VGltZW91dCgoKCk9PnQudGFyZ2V0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiExfSkpLDApfSx1c2VyTmFtZTp0PT57dC50YXJnZXQudGl0bGU9dC5kZXRhaWwudXNlck5hbWV9LHJlYWRvbmx5OnQ9Pnt0LmRldGFpbC5yZWFkb25seT90LnRhcmdldC5zZXRBdHRyaWJ1dGUoInJlYWRvbmx5IiwiIik6dC50YXJnZXQucmVtb3ZlQXR0cmlidXRlKCJyZWFkb25seSIpfSxyZXF1aXJlZDp0PT57dGhpcy5fc2V0UmVxdWlyZWQodC50YXJnZXQsdC5kZXRhaWwucmVxdWlyZWQpfSxiZ0NvbG9yOnQ9PntzZXRDb2xvcigiYmdDb2xvciIsImJhY2tncm91bmRDb2xvciIsdCl9LGZpbGxDb2xvcjp0PT57c2V0Q29sb3IoImZpbGxDb2xvciIsImJhY2tncm91bmRDb2xvciIsdCl9LGZnQ29sb3I6dD0+e3NldENvbG9yKCJmZ0NvbG9yIiwiY29sb3IiLHQpfSx0ZXh0Q29sb3I6dD0+e3NldENvbG9yKCJ0ZXh0Q29sb3IiLCJjb2xvciIsdCl9LGJvcmRlckNvbG9yOnQ9PntzZXRDb2xvcigiYm9yZGVyQ29sb3IiLCJib3JkZXJDb2xvciIsdCl9LHN0cm9rZUNvbG9yOnQ9PntzZXRDb2xvcigic3Ryb2tlQ29sb3IiLCJib3JkZXJDb2xvciIsdCl9LHJvdGF0aW9uOnQ9Pntjb25zdCBlPXQuZGV0YWlsLnJvdGF0aW9uO3RoaXMuc2V0Um90YXRpb24oZSk7dGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQse3JvdGF0aW9uOmV9KX19KX1fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHQsZSl7Y29uc3Qgbj10aGlzLl9jb21tb25BY3Rpb25zO2Zvcihjb25zdCBpIG9mIE9iamVjdC5rZXlzKGUuZGV0YWlsKSl7Y29uc3Qgcj10W2ldfHxuW2ldO3I/LihlKX19X3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKHQpe2lmKCF0aGlzLmVuYWJsZVNjcmlwdGluZylyZXR1cm47Y29uc3QgZT10aGlzLmFubm90YXRpb25TdG9yYWdlLmdldFJhd1ZhbHVlKHRoaXMuZGF0YS5pZCk7aWYoIWUpcmV0dXJuO2NvbnN0IG49dGhpcy5fY29tbW9uQWN0aW9ucztmb3IoY29uc3RbaSxyXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtjb25zdCBzPW5baV07aWYocyl7cyh7ZGV0YWlsOntbaV06cn0sdGFyZ2V0OnR9KTtkZWxldGUgZVtpXX19fV9jcmVhdGVRdWFkcmlsYXRlcmFscygpe2lmKCF0aGlzLmNvbnRhaW5lcilyZXR1cm47Y29uc3R7cXVhZFBvaW50czp0fT10aGlzLmRhdGE7aWYoIXQpcmV0dXJuO2NvbnN0W2UsbixpLHJdPXRoaXMuZGF0YS5yZWN0O2lmKDE9PT10Lmxlbmd0aCl7Y29uc3RbLHt4OnMseTphfSx7eDpvLHk6bH1dPXRbMF07aWYoaT09PXMmJnI9PT1hJiZlPT09byYmbj09PWwpcmV0dXJufWNvbnN0e3N0eWxlOnN9PXRoaXMuY29udGFpbmVyO2xldCBhO2lmKHRoaXMuI0RlKXtjb25zdHtib3JkZXJDb2xvcjp0LGJvcmRlcldpZHRoOmV9PXM7cy5ib3JkZXJXaWR0aD0wO2E9WyJ1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDt1dGY4LCIsJzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIicsJyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB2aWV3Qm94PSIwIDAgMSAxIj4nLGA8ZyBmaWxsPSJ0cmFuc3BhcmVudCIgc3Ryb2tlPSIke3R9IiBzdHJva2Utd2lkdGg9IiR7ZX0iPmBdO3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImhhc0JvcmRlciIpfWNvbnN0IG89aS1lLGw9ci1uLHtzdmdGYWN0b3J5OmN9PXRoaXMsaD1jLmNyZWF0ZUVsZW1lbnQoInN2ZyIpO2guY2xhc3NMaXN0LmFkZCgicXVhZHJpbGF0ZXJhbHNDb250YWluZXIiKTtoLnNldEF0dHJpYnV0ZSgid2lkdGgiLDApO2guc2V0QXR0cmlidXRlKCJoZWlnaHQiLDApO2NvbnN0IGQ9Yy5jcmVhdGVFbGVtZW50KCJkZWZzIik7aC5hcHBlbmQoZCk7Y29uc3QgdT1jLmNyZWF0ZUVsZW1lbnQoImNsaXBQYXRoIikscD1gY2xpcHBhdGhfJHt0aGlzLmRhdGEuaWR9YDt1LnNldEF0dHJpYnV0ZSgiaWQiLHApO3Uuc2V0QXR0cmlidXRlKCJjbGlwUGF0aFVuaXRzIiwib2JqZWN0Qm91bmRpbmdCb3giKTtkLmFwcGVuZCh1KTtmb3IoY29uc3RbLHt4Om4seTppfSx7eDpzLHk6aH1db2YgdCl7Y29uc3QgdD1jLmNyZWF0ZUVsZW1lbnQoInJlY3QiKSxkPShzLWUpL28scD0oci1pKS9sLGY9KG4tcykvbyxnPShpLWgpL2w7dC5zZXRBdHRyaWJ1dGUoIngiLGQpO3Quc2V0QXR0cmlidXRlKCJ5IixwKTt0LnNldEF0dHJpYnV0ZSgid2lkdGgiLGYpO3Quc2V0QXR0cmlidXRlKCJoZWlnaHQiLGcpO3UuYXBwZW5kKHQpO2E/LnB1c2goYDxyZWN0IHZlY3Rvci1lZmZlY3Q9Im5vbi1zY2FsaW5nLXN0cm9rZSIgeD0iJHtkfSIgeT0iJHtwfSIgd2lkdGg9IiR7Zn0iIGhlaWdodD0iJHtnfSIvPmApfWlmKHRoaXMuI0RlKXthLnB1c2goIjwvZz48L3N2Zz4nKSIpO3MuYmFja2dyb3VuZEltYWdlPWEuam9pbigiIil9dGhpcy5jb250YWluZXIuYXBwZW5kKGgpO3RoaXMuY29udGFpbmVyLnN0eWxlLmNsaXBQYXRoPWB1cmwoIyR7cH0pYH1fY3JlYXRlUG9wdXAoKXtjb25zdHtjb250YWluZXI6dCxkYXRhOmV9PXRoaXM7dC5zZXRBdHRyaWJ1dGUoImFyaWEtaGFzcG9wdXAiLCJkaWFsb2ciKTtjb25zdCBuPW5ldyBQb3B1cEFubm90YXRpb25FbGVtZW50KHtkYXRhOntjb2xvcjplLmNvbG9yLHRpdGxlT2JqOmUudGl0bGVPYmosbW9kaWZpY2F0aW9uRGF0ZTplLm1vZGlmaWNhdGlvbkRhdGUsY29udGVudHNPYmo6ZS5jb250ZW50c09iaixyaWNoVGV4dDplLnJpY2hUZXh0LHBhcmVudFJlY3Q6ZS5yZWN0LGJvcmRlclN0eWxlOjAsaWQ6YHBvcHVwXyR7ZS5pZH1gLHJvdGF0aW9uOmUucm90YXRpb259LHBhcmVudDp0aGlzLnBhcmVudCxlbGVtZW50czpbdGhpc119KTt0aGlzLnBhcmVudC5kaXYuYXBwZW5kKG4ucmVuZGVyKCkpfXJlbmRlcigpeygwLGkudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYEFubm90YXRpb25FbGVtZW50LnJlbmRlcmAgY2FsbGVkIil9X2dldEVsZW1lbnRzQnlOYW1lKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO2NvbnN0IG49W107aWYodGhpcy5fZmllbGRPYmplY3RzKXtjb25zdCByPXRoaXMuX2ZpZWxkT2JqZWN0c1t0XTtpZihyKWZvcihjb25zdHtwYWdlOnQsaWQ6cyxleHBvcnRWYWx1ZXM6YX1vZiByKXtpZigtMT09PXQpY29udGludWU7aWYocz09PWUpY29udGludWU7Y29uc3Qgcj0ic3RyaW5nIj09dHlwZW9mIGE/YTpudWxsLG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtZWxlbWVudC1pZD0iJHtzfSJdYCk7IW98fGguaGFzKG8pP24ucHVzaCh7aWQ6cyxleHBvcnRWYWx1ZTpyLGRvbUVsZW1lbnQ6b30pOigwLGkud2FybikoYF9nZXRFbGVtZW50c0J5TmFtZSAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6ICR7c31gKX1yZXR1cm4gbn1mb3IoY29uc3QgaSBvZiBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSh0KSl7Y29uc3R7ZXhwb3J0VmFsdWU6dH09aSxyPWkuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW1lbnQtaWQiKTtyIT09ZSYmKGguaGFzKGkpJiZuLnB1c2goe2lkOnIsZXhwb3J0VmFsdWU6dCxkb21FbGVtZW50Oml9KSl9cmV0dXJuIG59c2hvdygpe3RoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXIuaGlkZGVuPSExKTt0aGlzLnBvcHVwPy5tYXliZVNob3coKX1oaWRlKCl7dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lci5oaWRkZW49ITApO3RoaXMucG9wdXA/LmZvcmNlSGlkZSgpfWdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKXtyZXR1cm4gdGhpcy5jb250YWluZXJ9YWRkSGlnaGxpZ2h0QXJlYSgpe2NvbnN0IHQ9dGhpcy5nZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCk7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IoY29uc3QgZSBvZiB0KWUuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0QXJlYSIpO2Vsc2UgdC5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRBcmVhIil9X2VkaXRPbkRvdWJsZUNsaWNrKCl7Y29uc3R7YW5ub3RhdGlvbkVkaXRvclR5cGU6dCxkYXRhOntpZDplfX09dGhpczt0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJkYmxjbGljayIsKCgpPT57dGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goInN3aXRjaGFubm90YXRpb25lZGl0b3Jtb2RlIix7c291cmNlOnRoaXMsbW9kZTp0LGVkaXRJZDplfSl9KSl9fWNsYXNzIExpbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO3N1cGVyKHQse2lzUmVuZGVyYWJsZTohMCxpZ25vcmVCb3JkZXI6ISFlPy5pZ25vcmVCb3JkZXIsY3JlYXRlUXVhZHJpbGF0ZXJhbHM6ITB9KTt0aGlzLmlzVG9vbHRpcE9ubHk9dC5kYXRhLmlzVG9vbHRpcE9ubHl9cmVuZGVyKCl7Y29uc3R7ZGF0YTp0LGxpbmtTZXJ2aWNlOmV9PXRoaXMsbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7bi5zZXRBdHRyaWJ1dGUoImRhdGEtZWxlbWVudC1pZCIsdC5pZCk7bGV0IGk9ITE7aWYodC51cmwpe2UuYWRkTGlua0F0dHJpYnV0ZXMobix0LnVybCx0Lm5ld1dpbmRvdyk7aT0hMH1lbHNlIGlmKHQuYWN0aW9uKXt0aGlzLl9iaW5kTmFtZWRBY3Rpb24obix0LmFjdGlvbik7aT0hMH1lbHNlIGlmKHQuYXR0YWNobWVudCl7dGhpcy5fYmluZEF0dGFjaG1lbnQobix0LmF0dGFjaG1lbnQpO2k9ITB9ZWxzZSBpZih0LnNldE9DR1N0YXRlKXt0aGlzLiNPZShuLHQuc2V0T0NHU3RhdGUpO2k9ITB9ZWxzZSBpZih0LmRlc3Qpe3RoaXMuX2JpbmRMaW5rKG4sdC5kZXN0KTtpPSEwfWVsc2V7aWYodC5hY3Rpb25zJiYodC5hY3Rpb25zLkFjdGlvbnx8dC5hY3Rpb25zWyJNb3VzZSBVcCJdfHx0LmFjdGlvbnNbIk1vdXNlIERvd24iXSkmJnRoaXMuZW5hYmxlU2NyaXB0aW5nJiZ0aGlzLmhhc0pTQWN0aW9ucyl7dGhpcy5fYmluZEpTQWN0aW9uKG4sdCk7aT0hMH1pZih0LnJlc2V0Rm9ybSl7dGhpcy5fYmluZFJlc2V0Rm9ybUFjdGlvbihuLHQucmVzZXRGb3JtKTtpPSEwfWVsc2UgaWYodGhpcy5pc1Rvb2x0aXBPbmx5JiYhaSl7dGhpcy5fYmluZExpbmsobiwiIik7aT0hMH19dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgibGlua0Fubm90YXRpb24iKTtpJiZ0aGlzLmNvbnRhaW5lci5hcHBlbmQobik7cmV0dXJuIHRoaXMuY29udGFpbmVyfSNMZSgpe3RoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZSgiZGF0YS1pbnRlcm5hbC1saW5rIiwiIil9X2JpbmRMaW5rKHQsZSl7dC5ocmVmPXRoaXMubGlua1NlcnZpY2UuZ2V0RGVzdGluYXRpb25IYXNoKGUpO3Qub25jbGljaz0oKT0+e2UmJnRoaXMubGlua1NlcnZpY2UuZ29Ub0Rlc3RpbmF0aW9uKGUpO3JldHVybiExfTsoZXx8IiI9PT1lKSYmdGhpcy4jTGUoKX1fYmluZE5hbWVkQWN0aW9uKHQsZSl7dC5ocmVmPXRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKCIiKTt0Lm9uY2xpY2s9KCk9Pnt0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVOYW1lZEFjdGlvbihlKTtyZXR1cm4hMX07dGhpcy4jTGUoKX1fYmluZEF0dGFjaG1lbnQodCxlKXt0LmhyZWY9dGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoIiIpO3Qub25jbGljaz0oKT0+e3RoaXMuZG93bmxvYWRNYW5hZ2VyPy5vcGVuT3JEb3dubG9hZERhdGEodGhpcy5jb250YWluZXIsZS5jb250ZW50LGUuZmlsZW5hbWUpO3JldHVybiExfTt0aGlzLiNMZSgpfSNPZSh0LGUpe3QuaHJlZj10aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybCgiIik7dC5vbmNsaWNrPSgpPT57dGhpcy5saW5rU2VydmljZS5leGVjdXRlU2V0T0NHU3RhdGUoZSk7cmV0dXJuITF9O3RoaXMuI0xlKCl9X2JpbmRKU0FjdGlvbih0LGUpe3QuaHJlZj10aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybCgiIik7Y29uc3Qgbj1uZXcgTWFwKFtbIkFjdGlvbiIsIm9uY2xpY2siXSxbIk1vdXNlIFVwIiwib25tb3VzZXVwIl0sWyJNb3VzZSBEb3duIiwib25tb3VzZWRvd24iXV0pO2Zvcihjb25zdCBpIG9mIE9iamVjdC5rZXlzKGUuYWN0aW9ucykpe2NvbnN0IHI9bi5nZXQoaSk7ciYmKHRbcl09KCk9Pnt0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaCgiZGlzcGF0Y2hldmVudGluc2FuZGJveCIse3NvdXJjZTp0aGlzLGRldGFpbDp7aWQ6ZS5pZCxuYW1lOml9fSk7cmV0dXJuITF9KX10Lm9uY2xpY2t8fCh0Lm9uY2xpY2s9KCk9PiExKTt0aGlzLiNMZSgpfV9iaW5kUmVzZXRGb3JtQWN0aW9uKHQsZSl7Y29uc3Qgbj10Lm9uY2xpY2s7bnx8KHQuaHJlZj10aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybCgiIikpO3RoaXMuI0xlKCk7aWYodGhpcy5fZmllbGRPYmplY3RzKXQub25jbGljaz0oKT0+e24/LigpO2NvbnN0e2ZpZWxkczp0LHJlZnM6cixpbmNsdWRlOnN9PWUsYT1bXTtpZigwIT09dC5sZW5ndGh8fDAhPT1yLmxlbmd0aCl7Y29uc3QgZT1uZXcgU2V0KHIpO2Zvcihjb25zdCBuIG9mIHQpe2NvbnN0IHQ9dGhpcy5fZmllbGRPYmplY3RzW25dfHxbXTtmb3IoY29uc3R7aWQ6bn1vZiB0KWUuYWRkKG4pfWZvcihjb25zdCB0IG9mIE9iamVjdC52YWx1ZXModGhpcy5fZmllbGRPYmplY3RzKSlmb3IoY29uc3QgbiBvZiB0KWUuaGFzKG4uaWQpPT09cyYmYS5wdXNoKG4pfWVsc2UgZm9yKGNvbnN0IHQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9maWVsZE9iamVjdHMpKWEucHVzaCguLi50KTtjb25zdCBvPXRoaXMuYW5ub3RhdGlvblN0b3JhZ2UsbD1bXTtmb3IoY29uc3QgdCBvZiBhKXtjb25zdHtpZDplfT10O2wucHVzaChlKTtzd2l0Y2godC50eXBlKXtjYXNlInRleHQiOntjb25zdCBuPXQuZGVmYXVsdFZhbHVlfHwiIjtvLnNldFZhbHVlKGUse3ZhbHVlOm59KTticmVha31jYXNlImNoZWNrYm94IjpjYXNlInJhZGlvYnV0dG9uIjp7Y29uc3Qgbj10LmRlZmF1bHRWYWx1ZT09PXQuZXhwb3J0VmFsdWVzO28uc2V0VmFsdWUoZSx7dmFsdWU6bn0pO2JyZWFrfWNhc2UiY29tYm9ib3giOmNhc2UibGlzdGJveCI6e2NvbnN0IG49dC5kZWZhdWx0VmFsdWV8fCIiO28uc2V0VmFsdWUoZSx7dmFsdWU6bn0pO2JyZWFrfWRlZmF1bHQ6Y29udGludWV9Y29uc3Qgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1lbGVtZW50LWlkPSIke2V9Il1gKTtuJiYoaC5oYXMobik/bi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicmVzZXRmb3JtIikpOigwLGkud2FybikoYF9iaW5kUmVzZXRGb3JtQWN0aW9uIC0gZWxlbWVudCBub3QgYWxsb3dlZDogJHtlfWApKX10aGlzLmVuYWJsZVNjcmlwdGluZyYmdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goImRpc3BhdGNoZXZlbnRpbnNhbmRib3giLHtzb3VyY2U6dGhpcyxkZXRhaWw6e2lkOiJhcHAiLGlkczpsLG5hbWU6IlJlc2V0Rm9ybSJ9fSk7cmV0dXJuITF9O2Vsc2V7KDAsaS53YXJuKSgnX2JpbmRSZXNldEZvcm1BY3Rpb24gLSAicmVzZXRGb3JtIiBhY3Rpb24gbm90IHN1cHBvcnRlZCwgZW5zdXJlIHRoYXQgdGhlIGBmaWVsZE9iamVjdHNgIHBhcmFtZXRlciBpcyBwcm92aWRlZC4nKTtufHwodC5vbmNsaWNrPSgpPT4hMSl9fX1jbGFzcyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHtpc1JlbmRlcmFibGU6ISEodC5kYXRhLnBvcHVwUmVmfHx0LmRhdGEudGl0bGVPYmo/LnN0cnx8dC5kYXRhLmNvbnRlbnRzT2JqPy5zdHJ8fHQuZGF0YS5yaWNoVGV4dD8uc3RyKX0pfXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoInRleHRBbm5vdGF0aW9uIik7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTt0LnNyYz10aGlzLmltYWdlUmVzb3VyY2VzUGF0aCsiYW5ub3RhdGlvbi0iK3RoaXMuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkrIi5zdmciO3QuYWx0PSJbe3t0eXBlfX0gQW5ub3RhdGlvbl0iO3QuZGF0YXNldC5sMTBuSWQ9InRleHRfYW5ub3RhdGlvbl90eXBlIjt0LmRhdGFzZXQubDEwbkFyZ3M9SlNPTi5zdHJpbmdpZnkoe3R5cGU6dGhpcy5kYXRhLm5hbWV9KTt0aGlzLmRhdGEucG9wdXBSZWZ8fHRoaXMuX2NyZWF0ZVBvcHVwKCk7dGhpcy5jb250YWluZXIuYXBwZW5kKHQpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtyZW5kZXIoKXt0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0JiYodGhpcy5jb250YWluZXIudGl0bGU9dGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dCk7cmV0dXJuIHRoaXMuY29udGFpbmVyfXNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyh0KXtpZih0aGlzLmRhdGEuaGFzT3duQ2FudmFzKXsiQ0FOVkFTIj09PXQucHJldmlvdXNTaWJsaW5nPy5ub2RlTmFtZSYmKHQucHJldmlvdXNTaWJsaW5nLmhpZGRlbj0hMCk7dC5oaWRkZW49ITF9fV9nZXRLZXlNb2RpZmllcih0KXtjb25zdHtpc1dpbjplLGlzTWFjOm59PWkuRmVhdHVyZVRlc3QucGxhdGZvcm07cmV0dXJuIGUmJnQuY3RybEtleXx8biYmdC5tZXRhS2V5fV9zZXRFdmVudExpc3RlbmVyKHQsZSxuLGkpe2UuaW5jbHVkZXMoIm1vdXNlIik/dC5hZGRFdmVudExpc3RlbmVyKGUsKHQ9Pnt0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaCgiZGlzcGF0Y2hldmVudGluc2FuZGJveCIse3NvdXJjZTp0aGlzLGRldGFpbDp7aWQ6dGhpcy5kYXRhLmlkLG5hbWU6bix2YWx1ZTppKHQpLHNoaWZ0OnQuc2hpZnRLZXksbW9kaWZpZXI6dGhpcy5fZ2V0S2V5TW9kaWZpZXIodCl9fSl9KSk6dC5hZGRFdmVudExpc3RlbmVyKGUsKHQ9Pnt0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaCgiZGlzcGF0Y2hldmVudGluc2FuZGJveCIse3NvdXJjZTp0aGlzLGRldGFpbDp7aWQ6dGhpcy5kYXRhLmlkLG5hbWU6bix2YWx1ZTppKHQpfX0pfSkpfV9zZXRFdmVudExpc3RlbmVycyh0LGUsbil7Zm9yKGNvbnN0W2kscl1vZiBlKSgiQWN0aW9uIj09PXJ8fHRoaXMuZGF0YS5hY3Rpb25zPy5bcl0pJiZ0aGlzLl9zZXRFdmVudExpc3RlbmVyKHQsaSxyLG4pfV9zZXRCYWNrZ3JvdW5kQ29sb3IodCl7Y29uc3QgZT10aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yfHxudWxsO3Quc3R5bGUuYmFja2dyb3VuZENvbG9yPW51bGw9PT1lPyJ0cmFuc3BhcmVudCI6aS5VdGlsLm1ha2VIZXhDb2xvcihlWzBdLGVbMV0sZVsyXSl9X3NldFRleHRTdHlsZSh0KXtjb25zdCBlPVsibGVmdCIsImNlbnRlciIsInJpZ2h0Il0se2ZvbnRDb2xvcjpufT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLHI9dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250U2l6ZXx8OSxzPXQuc3R5bGU7bGV0IGE7Y29uc3Qgcm91bmRUb09uZURlY2ltYWw9dD0+TWF0aC5yb3VuZCgxMCp0KS8xMDtpZih0aGlzLmRhdGEubXVsdGlMaW5lKXtjb25zdCB0PU1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdLXRoaXMuZGF0YS5yZWN0WzFdLTIpLGU9dC8oTWF0aC5yb3VuZCh0LyhpLkxJTkVfRkFDVE9SKnIpKXx8MSk7YT1NYXRoLm1pbihyLHJvdW5kVG9PbmVEZWNpbWFsKGUvaS5MSU5FX0ZBQ1RPUikpfWVsc2V7Y29uc3QgdD1NYXRoLmFicyh0aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXS0yKTthPU1hdGgubWluKHIscm91bmRUb09uZURlY2ltYWwodC9pLkxJTkVfRkFDVE9SKSl9cy5mb250U2l6ZT1gY2FsYygke2F9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7cy5jb2xvcj1pLlV0aWwubWFrZUhleENvbG9yKG5bMF0sblsxXSxuWzJdKTtudWxsIT09dGhpcy5kYXRhLnRleHRBbGlnbm1lbnQmJihzLnRleHRBbGlnbj1lW3RoaXMuZGF0YS50ZXh0QWxpZ25tZW50XSl9X3NldFJlcXVpcmVkKHQsZSl7ZT90LnNldEF0dHJpYnV0ZSgicmVxdWlyZWQiLCEwKTp0LnJlbW92ZUF0dHJpYnV0ZSgicmVxdWlyZWQiKTt0LnNldEF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIsZSl9fWNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQse2lzUmVuZGVyYWJsZTp0LnJlbmRlckZvcm1zfHwhdC5kYXRhLmhhc0FwcGVhcmFuY2UmJiEhdC5kYXRhLmZpZWxkVmFsdWV9KX1zZXRQcm9wZXJ0eU9uU2libGluZ3ModCxlLG4saSl7Y29uc3Qgcj10aGlzLmFubm90YXRpb25TdG9yYWdlO2Zvcihjb25zdCBzIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKHQubmFtZSx0LmlkKSl7cy5kb21FbGVtZW50JiYocy5kb21FbGVtZW50W2VdPW4pO3Iuc2V0VmFsdWUocy5pZCx7W2ldOm59KX19cmVuZGVyKCl7Y29uc3QgdD10aGlzLmFubm90YXRpb25TdG9yYWdlLGU9dGhpcy5kYXRhLmlkO3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoInRleHRXaWRnZXRBbm5vdGF0aW9uIik7bGV0IG49bnVsbDtpZih0aGlzLnJlbmRlckZvcm1zKXtjb25zdCBpPXQuZ2V0VmFsdWUoZSx7dmFsdWU6dGhpcy5kYXRhLmZpZWxkVmFsdWV9KTtsZXQgcj1pLnZhbHVlfHwiIjtjb25zdCBzPXQuZ2V0VmFsdWUoZSx7Y2hhckxpbWl0OnRoaXMuZGF0YS5tYXhMZW59KS5jaGFyTGltaXQ7cyYmci5sZW5ndGg+cyYmKHI9ci5zbGljZSgwLHMpKTtsZXQgYT1pLmZvcm1hdHRlZFZhbHVlfHx0aGlzLmRhdGEudGV4dENvbnRlbnQ/LmpvaW4oIlxuIil8fG51bGw7YSYmdGhpcy5kYXRhLmNvbWImJihhPWEucmVwbGFjZUFsbCgvXHMrL2csIiIpKTtjb25zdCBvPXt1c2VyVmFsdWU6cixmb3JtYXR0ZWRWYWx1ZTphLGxhc3RDb21taXR0ZWRWYWx1ZTpudWxsLGNvbW1pdEtleToxfTtpZih0aGlzLmRhdGEubXVsdGlMaW5lKXtuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7bi50ZXh0Q29udGVudD1hPz9yO3RoaXMuZGF0YS5kb05vdFNjcm9sbCYmKG4uc3R5bGUub3ZlcmZsb3dZPSJoaWRkZW4iKX1lbHNle249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtuLnR5cGU9InRleHQiO24uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsYT8/cik7dGhpcy5kYXRhLmRvTm90U2Nyb2xsJiYobi5zdHlsZS5vdmVyZmxvd1g9ImhpZGRlbiIpfXRoaXMuZGF0YS5oYXNPd25DYW52YXMmJihuLmhpZGRlbj0hMCk7aC5hZGQobik7bi5zZXRBdHRyaWJ1dGUoImRhdGEtZWxlbWVudC1pZCIsZSk7bi5kaXNhYmxlZD10aGlzLmRhdGEucmVhZE9ubHk7bi5uYW1lPXRoaXMuZGF0YS5iYXNlRmllbGROYW1lfHx0aGlzLmRhdGEuZmllbGROYW1lO24udGFiSW5kZXg9Yzt0aGlzLl9zZXRSZXF1aXJlZChuLHRoaXMuZGF0YS5yZXF1aXJlZCk7cyYmKG4ubWF4TGVuZ3RoPXMpO24uYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLChpPT57dC5zZXRWYWx1ZShlLHt2YWx1ZTppLnRhcmdldC52YWx1ZX0pO3RoaXMuc2V0UHJvcGVydHlPblNpYmxpbmdzKG4sInZhbHVlIixpLnRhcmdldC52YWx1ZSwidmFsdWUiKTtvLmZvcm1hdHRlZFZhbHVlPW51bGx9KSk7bi5hZGRFdmVudExpc3RlbmVyKCJyZXNldGZvcm0iLCh0PT57Y29uc3QgZT10aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWU/PyIiO24udmFsdWU9by51c2VyVmFsdWU9ZTtvLmZvcm1hdHRlZFZhbHVlPW51bGx9KSk7bGV0IGJsdXJMaXN0ZW5lcj10PT57Y29uc3R7Zm9ybWF0dGVkVmFsdWU6ZX09bztudWxsIT1lJiYodC50YXJnZXQudmFsdWU9ZSk7dC50YXJnZXQuc2Nyb2xsTGVmdD0wfTtpZih0aGlzLmVuYWJsZVNjcmlwdGluZyYmdGhpcy5oYXNKU0FjdGlvbnMpe24uYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLCh0PT57Y29uc3R7dGFyZ2V0OmV9PXQ7by51c2VyVmFsdWUmJihlLnZhbHVlPW8udXNlclZhbHVlKTtvLmxhc3RDb21taXR0ZWRWYWx1ZT1lLnZhbHVlO28uY29tbWl0S2V5PTF9KSk7bi5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGVmcm9tc2FuZGJveCIsKG49Pnt0aGlzLnNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyhuLnRhcmdldCk7Y29uc3QgaT17dmFsdWUobil7by51c2VyVmFsdWU9bi5kZXRhaWwudmFsdWU/PyIiO3Quc2V0VmFsdWUoZSx7dmFsdWU6by51c2VyVmFsdWUudG9TdHJpbmcoKX0pO24udGFyZ2V0LnZhbHVlPW8udXNlclZhbHVlfSxmb3JtYXR0ZWRWYWx1ZShuKXtjb25zdHtmb3JtYXR0ZWRWYWx1ZTppfT1uLmRldGFpbDtvLmZvcm1hdHRlZFZhbHVlPWk7bnVsbCE9aSYmbi50YXJnZXQhPT1kb2N1bWVudC5hY3RpdmVFbGVtZW50JiYobi50YXJnZXQudmFsdWU9aSk7dC5zZXRWYWx1ZShlLHtmb3JtYXR0ZWRWYWx1ZTppfSl9LHNlbFJhbmdlKHQpe3QudGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKC4uLnQuZGV0YWlsLnNlbFJhbmdlKX0sY2hhckxpbWl0Om49Pntjb25zdHtjaGFyTGltaXQ6aX09bi5kZXRhaWwse3RhcmdldDpyfT1uO2lmKDA9PT1pKXtyLnJlbW92ZUF0dHJpYnV0ZSgibWF4TGVuZ3RoIik7cmV0dXJufXIuc2V0QXR0cmlidXRlKCJtYXhMZW5ndGgiLGkpO2xldCBzPW8udXNlclZhbHVlO2lmKHMmJiEocy5sZW5ndGg8PWkpKXtzPXMuc2xpY2UoMCxpKTtyLnZhbHVlPW8udXNlclZhbHVlPXM7dC5zZXRWYWx1ZShlLHt2YWx1ZTpzfSk7dGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goImRpc3BhdGNoZXZlbnRpbnNhbmRib3giLHtzb3VyY2U6dGhpcyxkZXRhaWw6e2lkOmUsbmFtZToiS2V5c3Ryb2tlIix2YWx1ZTpzLHdpbGxDb21taXQ6ITAsY29tbWl0S2V5OjEsc2VsU3RhcnQ6ci5zZWxlY3Rpb25TdGFydCxzZWxFbmQ6ci5zZWxlY3Rpb25FbmR9fSl9fX07dGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGksbil9KSk7bi5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwodD0+e28uY29tbWl0S2V5PTE7bGV0IG49LTE7IkVzY2FwZSI9PT10LmtleT9uPTA6IkVudGVyIiE9PXQua2V5fHx0aGlzLmRhdGEubXVsdGlMaW5lPyJUYWIiPT09dC5rZXkmJihvLmNvbW1pdEtleT0zKTpuPTI7aWYoLTE9PT1uKXJldHVybjtjb25zdHt2YWx1ZTppfT10LnRhcmdldDtpZihvLmxhc3RDb21taXR0ZWRWYWx1ZSE9PWkpe28ubGFzdENvbW1pdHRlZFZhbHVlPWk7by51c2VyVmFsdWU9aTt0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaCgiZGlzcGF0Y2hldmVudGluc2FuZGJveCIse3NvdXJjZTp0aGlzLGRldGFpbDp7aWQ6ZSxuYW1lOiJLZXlzdHJva2UiLHZhbHVlOmksd2lsbENvbW1pdDohMCxjb21taXRLZXk6bixzZWxTdGFydDp0LnRhcmdldC5zZWxlY3Rpb25TdGFydCxzZWxFbmQ6dC50YXJnZXQuc2VsZWN0aW9uRW5kfX0pfX0pKTtjb25zdCBpPWJsdXJMaXN0ZW5lcjtibHVyTGlzdGVuZXI9bnVsbDtuLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLCh0PT57aWYoIXQucmVsYXRlZFRhcmdldClyZXR1cm47Y29uc3R7dmFsdWU6bn09dC50YXJnZXQ7by51c2VyVmFsdWU9bjtvLmxhc3RDb21taXR0ZWRWYWx1ZSE9PW4mJnRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94Iix7c291cmNlOnRoaXMsZGV0YWlsOntpZDplLG5hbWU6IktleXN0cm9rZSIsdmFsdWU6bix3aWxsQ29tbWl0OiEwLGNvbW1pdEtleTpvLmNvbW1pdEtleSxzZWxTdGFydDp0LnRhcmdldC5zZWxlY3Rpb25TdGFydCxzZWxFbmQ6dC50YXJnZXQuc2VsZWN0aW9uRW5kfX0pO2kodCl9KSk7dGhpcy5kYXRhLmFjdGlvbnM/LktleXN0cm9rZSYmbi5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmVpbnB1dCIsKHQ9PntvLmxhc3RDb21taXR0ZWRWYWx1ZT1udWxsO2NvbnN0e2RhdGE6bix0YXJnZXQ6aX09dCx7dmFsdWU6cixzZWxlY3Rpb25TdGFydDpzLHNlbGVjdGlvbkVuZDphfT1pO2xldCBsPXMsYz1hO3N3aXRjaCh0LmlucHV0VHlwZSl7Y2FzZSJkZWxldGVXb3JkQmFja3dhcmQiOntjb25zdCB0PXIuc3Vic3RyaW5nKDAscykubWF0Y2goL1x3KlteXHddKiQvKTt0JiYobC09dFswXS5sZW5ndGgpO2JyZWFrfWNhc2UiZGVsZXRlV29yZEZvcndhcmQiOntjb25zdCB0PXIuc3Vic3RyaW5nKHMpLm1hdGNoKC9eW15cd10qXHcqLyk7dCYmKGMrPXRbMF0ubGVuZ3RoKTticmVha31jYXNlImRlbGV0ZUNvbnRlbnRCYWNrd2FyZCI6cz09PWEmJihsLT0xKTticmVhaztjYXNlImRlbGV0ZUNvbnRlbnRGb3J3YXJkIjpzPT09YSYmKGMrPTEpfXQucHJldmVudERlZmF1bHQoKTt0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaCgiZGlzcGF0Y2hldmVudGluc2FuZGJveCIse3NvdXJjZTp0aGlzLGRldGFpbDp7aWQ6ZSxuYW1lOiJLZXlzdHJva2UiLHZhbHVlOnIsY2hhbmdlOm58fCIiLHdpbGxDb21taXQ6ITEsc2VsU3RhcnQ6bCxzZWxFbmQ6Y319KX0pKTt0aGlzLl9zZXRFdmVudExpc3RlbmVycyhuLFtbImZvY3VzIiwiRm9jdXMiXSxbImJsdXIiLCJCbHVyIl0sWyJtb3VzZWRvd24iLCJNb3VzZSBEb3duIl0sWyJtb3VzZWVudGVyIiwiTW91c2UgRW50ZXIiXSxbIm1vdXNlbGVhdmUiLCJNb3VzZSBFeGl0Il0sWyJtb3VzZXVwIiwiTW91c2UgVXAiXV0sKHQ9PnQudGFyZ2V0LnZhbHVlKSl9Ymx1ckxpc3RlbmVyJiZuLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLGJsdXJMaXN0ZW5lcik7aWYodGhpcy5kYXRhLmNvbWIpe2NvbnN0IHQ9KHRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdKS9zO24uY2xhc3NMaXN0LmFkZCgiY29tYiIpO24uc3R5bGUubGV0dGVyU3BhY2luZz1gY2FsYygke3R9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpIC0gMWNoKWB9fWVsc2V7bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtuLnRleHRDb250ZW50PXRoaXMuZGF0YS5maWVsZFZhbHVlO24uc3R5bGUudmVydGljYWxBbGlnbj0ibWlkZGxlIjtuLnN0eWxlLmRpc3BsYXk9InRhYmxlLWNlbGwifXRoaXMuX3NldFRleHRTdHlsZShuKTt0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3Iobik7dGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMobik7dGhpcy5jb250YWluZXIuYXBwZW5kKG4pO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHtpc1JlbmRlcmFibGU6ISF0LmRhdGEuaGFzT3duQ2FudmFzfSl9fWNsYXNzIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHtpc1JlbmRlcmFibGU6dC5yZW5kZXJGb3Jtc30pfXJlbmRlcigpe2NvbnN0IHQ9dGhpcy5hbm5vdGF0aW9uU3RvcmFnZSxlPXRoaXMuZGF0YSxuPWUuaWQ7bGV0IGk9dC5nZXRWYWx1ZShuLHt2YWx1ZTplLmV4cG9ydFZhbHVlPT09ZS5maWVsZFZhbHVlfSkudmFsdWU7aWYoInN0cmluZyI9PXR5cGVvZiBpKXtpPSJPZmYiIT09aTt0LnNldFZhbHVlKG4se3ZhbHVlOml9KX10aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJidXR0b25XaWRnZXRBbm5vdGF0aW9uIiwiY2hlY2tCb3giKTtjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7aC5hZGQocik7ci5zZXRBdHRyaWJ1dGUoImRhdGEtZWxlbWVudC1pZCIsbik7ci5kaXNhYmxlZD1lLnJlYWRPbmx5O3RoaXMuX3NldFJlcXVpcmVkKHIsdGhpcy5kYXRhLnJlcXVpcmVkKTtyLnR5cGU9ImNoZWNrYm94IjtyLm5hbWU9ZS5iYXNlRmllbGROYW1lfHxlLmZpZWxkTmFtZTtpJiZyLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsITApO3Iuc2V0QXR0cmlidXRlKCJleHBvcnRWYWx1ZSIsZS5leHBvcnRWYWx1ZSk7ci50YWJJbmRleD1jO3IuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwoaT0+e2NvbnN0e25hbWU6cixjaGVja2VkOnN9PWkudGFyZ2V0O2Zvcihjb25zdCBpIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKHIsbikpe2NvbnN0IG49cyYmaS5leHBvcnRWYWx1ZT09PWUuZXhwb3J0VmFsdWU7aS5kb21FbGVtZW50JiYoaS5kb21FbGVtZW50LmNoZWNrZWQ9bik7dC5zZXRWYWx1ZShpLmlkLHt2YWx1ZTpufSl9dC5zZXRWYWx1ZShuLHt2YWx1ZTpzfSl9KSk7ci5hZGRFdmVudExpc3RlbmVyKCJyZXNldGZvcm0iLCh0PT57Y29uc3Qgbj1lLmRlZmF1bHRGaWVsZFZhbHVlfHwiT2ZmIjt0LnRhcmdldC5jaGVja2VkPW49PT1lLmV4cG9ydFZhbHVlfSkpO2lmKHRoaXMuZW5hYmxlU2NyaXB0aW5nJiZ0aGlzLmhhc0pTQWN0aW9ucyl7ci5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGVmcm9tc2FuZGJveCIsKGU9Pntjb25zdCBpPXt2YWx1ZShlKXtlLnRhcmdldC5jaGVja2VkPSJPZmYiIT09ZS5kZXRhaWwudmFsdWU7dC5zZXRWYWx1ZShuLHt2YWx1ZTplLnRhcmdldC5jaGVja2VkfSl9fTt0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goaSxlKX0pKTt0aGlzLl9zZXRFdmVudExpc3RlbmVycyhyLFtbImNoYW5nZSIsIlZhbGlkYXRlIl0sWyJjaGFuZ2UiLCJBY3Rpb24iXSxbImZvY3VzIiwiRm9jdXMiXSxbImJsdXIiLCJCbHVyIl0sWyJtb3VzZWRvd24iLCJNb3VzZSBEb3duIl0sWyJtb3VzZWVudGVyIiwiTW91c2UgRW50ZXIiXSxbIm1vdXNlbGVhdmUiLCJNb3VzZSBFeGl0Il0sWyJtb3VzZXVwIiwiTW91c2UgVXAiXV0sKHQ9PnQudGFyZ2V0LmNoZWNrZWQpKX10aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3Iocik7dGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMocik7dGhpcy5jb250YWluZXIuYXBwZW5kKHIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQse2lzUmVuZGVyYWJsZTp0LnJlbmRlckZvcm1zfSl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiIsInJhZGlvQnV0dG9uIik7Y29uc3QgdD10aGlzLmFubm90YXRpb25TdG9yYWdlLGU9dGhpcy5kYXRhLG49ZS5pZDtsZXQgaT10LmdldFZhbHVlKG4se3ZhbHVlOmUuZmllbGRWYWx1ZT09PWUuYnV0dG9uVmFsdWV9KS52YWx1ZTtpZigic3RyaW5nIj09dHlwZW9mIGkpe2k9aSE9PWUuYnV0dG9uVmFsdWU7dC5zZXRWYWx1ZShuLHt2YWx1ZTppfSl9Y29uc3Qgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2guYWRkKHIpO3Iuc2V0QXR0cmlidXRlKCJkYXRhLWVsZW1lbnQtaWQiLG4pO3IuZGlzYWJsZWQ9ZS5yZWFkT25seTt0aGlzLl9zZXRSZXF1aXJlZChyLHRoaXMuZGF0YS5yZXF1aXJlZCk7ci50eXBlPSJyYWRpbyI7ci5uYW1lPWUuYmFzZUZpZWxkTmFtZXx8ZS5maWVsZE5hbWU7aSYmci5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCEwKTtyLnRhYkluZGV4PWM7ci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLChlPT57Y29uc3R7bmFtZTppLGNoZWNrZWQ6cn09ZS50YXJnZXQ7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoaSxuKSl0LnNldFZhbHVlKGUuaWQse3ZhbHVlOiExfSk7dC5zZXRWYWx1ZShuLHt2YWx1ZTpyfSl9KSk7ci5hZGRFdmVudExpc3RlbmVyKCJyZXNldGZvcm0iLCh0PT57Y29uc3Qgbj1lLmRlZmF1bHRGaWVsZFZhbHVlO3QudGFyZ2V0LmNoZWNrZWQ9bnVsbCE9biYmbj09PWUuYnV0dG9uVmFsdWV9KSk7aWYodGhpcy5lbmFibGVTY3JpcHRpbmcmJnRoaXMuaGFzSlNBY3Rpb25zKXtjb25zdCBpPWUuYnV0dG9uVmFsdWU7ci5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGVmcm9tc2FuZGJveCIsKGU9Pntjb25zdCByPXt2YWx1ZTplPT57Y29uc3Qgcj1pPT09ZS5kZXRhaWwudmFsdWU7Zm9yKGNvbnN0IGkgb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoZS50YXJnZXQubmFtZSkpe2NvbnN0IGU9ciYmaS5pZD09PW47aS5kb21FbGVtZW50JiYoaS5kb21FbGVtZW50LmNoZWNrZWQ9ZSk7dC5zZXRWYWx1ZShpLmlkLHt2YWx1ZTplfSl9fX07dGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHIsZSl9KSk7dGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMocixbWyJjaGFuZ2UiLCJWYWxpZGF0ZSJdLFsiY2hhbmdlIiwiQWN0aW9uIl0sWyJmb2N1cyIsIkZvY3VzIl0sWyJibHVyIiwiQmx1ciJdLFsibW91c2Vkb3duIiwiTW91c2UgRG93biJdLFsibW91c2VlbnRlciIsIk1vdXNlIEVudGVyIl0sWyJtb3VzZWxlYXZlIiwiTW91c2UgRXhpdCJdLFsibW91c2V1cCIsIk1vdXNlIFVwIl1dLCh0PT50LnRhcmdldC5jaGVja2VkKSl9dGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKHIpO3RoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKHIpO3RoaXMuY29udGFpbmVyLmFwcGVuZChyKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWNsYXNzIFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIExpbmtBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHtpZ25vcmVCb3JkZXI6dC5kYXRhLmhhc0FwcGVhcmFuY2V9KX1yZW5kZXIoKXtjb25zdCB0PXN1cGVyLnJlbmRlcigpO3QuY2xhc3NMaXN0LmFkZCgiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiIsInB1c2hCdXR0b24iKTt0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0JiYodC50aXRsZT10aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KTtjb25zdCBlPXQubGFzdENoaWxkO2lmKHRoaXMuZW5hYmxlU2NyaXB0aW5nJiZ0aGlzLmhhc0pTQWN0aW9ucyYmZSl7dGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZSk7ZS5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGVmcm9tc2FuZGJveCIsKHQ9Pnt0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goe30sdCl9KSl9cmV0dXJuIHR9fWNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCx7aXNSZW5kZXJhYmxlOnQucmVuZGVyRm9ybXN9KX1yZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJjaG9pY2VXaWRnZXRBbm5vdGF0aW9uIik7Y29uc3QgdD10aGlzLmFubm90YXRpb25TdG9yYWdlLGU9dGhpcy5kYXRhLmlkLG49dC5nZXRWYWx1ZShlLHt2YWx1ZTp0aGlzLmRhdGEuZmllbGRWYWx1ZX0pLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7aC5hZGQoaSk7aS5zZXRBdHRyaWJ1dGUoImRhdGEtZWxlbWVudC1pZCIsZSk7aS5kaXNhYmxlZD10aGlzLmRhdGEucmVhZE9ubHk7dGhpcy5fc2V0UmVxdWlyZWQoaSx0aGlzLmRhdGEucmVxdWlyZWQpO2kubmFtZT10aGlzLmRhdGEuYmFzZUZpZWxkTmFtZXx8dGhpcy5kYXRhLmZpZWxkTmFtZTtpLnRhYkluZGV4PWM7bGV0IHI9dGhpcy5kYXRhLmNvbWJvJiZ0aGlzLmRhdGEub3B0aW9ucy5sZW5ndGg+MDtpZighdGhpcy5kYXRhLmNvbWJvKXtpLnNpemU9dGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoO3RoaXMuZGF0YS5tdWx0aVNlbGVjdCYmKGkubXVsdGlwbGU9ITApfWkuYWRkRXZlbnRMaXN0ZW5lcigicmVzZXRmb3JtIiwodD0+e2NvbnN0IGU9dGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlO2Zvcihjb25zdCB0IG9mIGkub3B0aW9ucyl0LnNlbGVjdGVkPXQudmFsdWU9PT1lfSkpO2Zvcihjb25zdCB0IG9mIHRoaXMuZGF0YS5vcHRpb25zKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO2UudGV4dENvbnRlbnQ9dC5kaXNwbGF5VmFsdWU7ZS52YWx1ZT10LmV4cG9ydFZhbHVlO2lmKG4udmFsdWUuaW5jbHVkZXModC5leHBvcnRWYWx1ZSkpe2Uuc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsITApO3I9ITF9aS5hcHBlbmQoZSl9bGV0IHM9bnVsbDtpZihyKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpO3QudmFsdWU9IiAiO3Quc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTt0LnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCEwKTtpLnByZXBlbmQodCk7cz0oKT0+e3QucmVtb3ZlKCk7aS5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnB1dCIscyk7cz1udWxsfTtpLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixzKX1jb25zdCBnZXRWYWx1ZT10PT57Y29uc3QgZT10PyJ2YWx1ZSI6InRleHRDb250ZW50Iix7b3B0aW9uczpuLG11bHRpcGxlOnJ9PWk7cmV0dXJuIHI/QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKHQ9PnQuc2VsZWN0ZWQpKS5tYXAoKHQ9PnRbZV0pKTotMT09PW4uc2VsZWN0ZWRJbmRleD9udWxsOm5bbi5zZWxlY3RlZEluZGV4XVtlXX07bGV0IGE9Z2V0VmFsdWUoITEpO2NvbnN0IGdldEl0ZW1zPXQ9Pntjb25zdCBlPXQudGFyZ2V0Lm9wdGlvbnM7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlLCh0PT4oe2Rpc3BsYXlWYWx1ZTp0LnRleHRDb250ZW50LGV4cG9ydFZhbHVlOnQudmFsdWV9KSkpfTtpZih0aGlzLmVuYWJsZVNjcmlwdGluZyYmdGhpcy5oYXNKU0FjdGlvbnMpe2kuYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlZnJvbXNhbmRib3giLChuPT57Y29uc3Qgcj17dmFsdWUobil7cz8uKCk7Y29uc3Qgcj1uLmRldGFpbC52YWx1ZSxvPW5ldyBTZXQoQXJyYXkuaXNBcnJheShyKT9yOltyXSk7Zm9yKGNvbnN0IHQgb2YgaS5vcHRpb25zKXQuc2VsZWN0ZWQ9by5oYXModC52YWx1ZSk7dC5zZXRWYWx1ZShlLHt2YWx1ZTpnZXRWYWx1ZSghMCl9KTthPWdldFZhbHVlKCExKX0sbXVsdGlwbGVTZWxlY3Rpb24odCl7aS5tdWx0aXBsZT0hMH0scmVtb3ZlKG4pe2NvbnN0IHI9aS5vcHRpb25zLHM9bi5kZXRhaWwucmVtb3ZlO3Jbc10uc2VsZWN0ZWQ9ITE7aS5yZW1vdmUocyk7aWYoci5sZW5ndGg+MCl7LTE9PT1BcnJheS5wcm90b3R5cGUuZmluZEluZGV4LmNhbGwociwodD0+dC5zZWxlY3RlZCkpJiYoclswXS5zZWxlY3RlZD0hMCl9dC5zZXRWYWx1ZShlLHt2YWx1ZTpnZXRWYWx1ZSghMCksaXRlbXM6Z2V0SXRlbXMobil9KTthPWdldFZhbHVlKCExKX0sY2xlYXIobil7Zm9yKDswIT09aS5sZW5ndGg7KWkucmVtb3ZlKDApO3Quc2V0VmFsdWUoZSx7dmFsdWU6bnVsbCxpdGVtczpbXX0pO2E9Z2V0VmFsdWUoITEpfSxpbnNlcnQobil7Y29uc3R7aW5kZXg6cixkaXNwbGF5VmFsdWU6cyxleHBvcnRWYWx1ZTpvfT1uLmRldGFpbC5pbnNlcnQsbD1pLmNoaWxkcmVuW3JdLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7Yy50ZXh0Q29udGVudD1zO2MudmFsdWU9bztsP2wuYmVmb3JlKGMpOmkuYXBwZW5kKGMpO3Quc2V0VmFsdWUoZSx7dmFsdWU6Z2V0VmFsdWUoITApLGl0ZW1zOmdldEl0ZW1zKG4pfSk7YT1nZXRWYWx1ZSghMSl9LGl0ZW1zKG4pe2NvbnN0e2l0ZW1zOnJ9PW4uZGV0YWlsO2Zvcig7MCE9PWkubGVuZ3RoOylpLnJlbW92ZSgwKTtmb3IoY29uc3QgdCBvZiByKXtjb25zdHtkaXNwbGF5VmFsdWU6ZSxleHBvcnRWYWx1ZTpufT10LHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7ci50ZXh0Q29udGVudD1lO3IudmFsdWU9bjtpLmFwcGVuZChyKX1pLm9wdGlvbnMubGVuZ3RoPjAmJihpLm9wdGlvbnNbMF0uc2VsZWN0ZWQ9ITApO3Quc2V0VmFsdWUoZSx7dmFsdWU6Z2V0VmFsdWUoITApLGl0ZW1zOmdldEl0ZW1zKG4pfSk7YT1nZXRWYWx1ZSghMSl9LGluZGljZXMobil7Y29uc3QgaT1uZXcgU2V0KG4uZGV0YWlsLmluZGljZXMpO2Zvcihjb25zdCB0IG9mIG4udGFyZ2V0Lm9wdGlvbnMpdC5zZWxlY3RlZD1pLmhhcyh0LmluZGV4KTt0LnNldFZhbHVlKGUse3ZhbHVlOmdldFZhbHVlKCEwKX0pO2E9Z2V0VmFsdWUoITEpfSxlZGl0YWJsZSh0KXt0LnRhcmdldC5kaXNhYmxlZD0hdC5kZXRhaWwuZWRpdGFibGV9fTt0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3gocixuKX0pKTtpLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0Iiwobj0+e2NvbnN0IGk9Z2V0VmFsdWUoITApO3Quc2V0VmFsdWUoZSx7dmFsdWU6aX0pO24ucHJldmVudERlZmF1bHQoKTt0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaCgiZGlzcGF0Y2hldmVudGluc2FuZGJveCIse3NvdXJjZTp0aGlzLGRldGFpbDp7aWQ6ZSxuYW1lOiJLZXlzdHJva2UiLHZhbHVlOmEsY2hhbmdlRXg6aSx3aWxsQ29tbWl0OiExLGNvbW1pdEtleToxLGtleURvd246ITF9fSl9KSk7dGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMoaSxbWyJmb2N1cyIsIkZvY3VzIl0sWyJibHVyIiwiQmx1ciJdLFsibW91c2Vkb3duIiwiTW91c2UgRG93biJdLFsibW91c2VlbnRlciIsIk1vdXNlIEVudGVyIl0sWyJtb3VzZWxlYXZlIiwiTW91c2UgRXhpdCJdLFsibW91c2V1cCIsIk1vdXNlIFVwIl0sWyJpbnB1dCIsIkFjdGlvbiJdLFsiaW5wdXQiLCJWYWxpZGF0ZSJdXSwodD0+dC50YXJnZXQudmFsdWUpKX1lbHNlIGkuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLChmdW5jdGlvbihuKXt0LnNldFZhbHVlKGUse3ZhbHVlOmdldFZhbHVlKCEwKX0pfSkpO3RoaXMuZGF0YS5jb21ibyYmdGhpcy5fc2V0VGV4dFN0eWxlKGkpO3RoaXMuX3NldEJhY2tncm91bmRDb2xvcihpKTt0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhpKTt0aGlzLmNvbnRhaW5lci5hcHBlbmQoaSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1jbGFzcyBQb3B1cEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IodCl7Y29uc3R7ZGF0YTplLGVsZW1lbnRzOm59PXQ7c3VwZXIodCx7aXNSZW5kZXJhYmxlOiEhKGUudGl0bGVPYmo/LnN0cnx8ZS5jb250ZW50c09iaj8uc3RyfHxlLnJpY2hUZXh0Py5zdHIpfSk7dGhpcy5lbGVtZW50cz1ufXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoInBvcHVwQW5ub3RhdGlvbiIpO2NvbnN0IHQ9bmV3IFBvcHVwRWxlbWVudCh7Y29udGFpbmVyOnRoaXMuY29udGFpbmVyLGNvbG9yOnRoaXMuZGF0YS5jb2xvcix0aXRsZU9iajp0aGlzLmRhdGEudGl0bGVPYmosbW9kaWZpY2F0aW9uRGF0ZTp0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSxjb250ZW50c09iajp0aGlzLmRhdGEuY29udGVudHNPYmoscmljaFRleHQ6dGhpcy5kYXRhLnJpY2hUZXh0LHJlY3Q6dGhpcy5kYXRhLnJlY3QscGFyZW50UmVjdDp0aGlzLmRhdGEucGFyZW50UmVjdHx8bnVsbCxwYXJlbnQ6dGhpcy5wYXJlbnQsZWxlbWVudHM6dGhpcy5lbGVtZW50cyxvcGVuOnRoaXMuZGF0YS5vcGVufSksZT1bXTtmb3IoY29uc3QgbiBvZiB0aGlzLmVsZW1lbnRzKXtuLnBvcHVwPXQ7ZS5wdXNoKG4uZGF0YS5pZCk7bi5hZGRIaWdobGlnaHRBcmVhKCl9dGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKCJhcmlhLWNvbnRyb2xzIixlLmpvaW4oIiwiKSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1jbGFzcyBQb3B1cEVsZW1lbnR7I05lPW51bGw7I0JlPXRoaXMuI2plLmJpbmQodGhpcyk7I1VlPXRoaXMuI3plLmJpbmQodGhpcyk7I0hlPXRoaXMuI3FlLmJpbmQodGhpcyk7I1NlPW51bGw7I2J0PW51bGw7I1dlPW51bGw7I0dlPW51bGw7I1ZlPW51bGw7IyRlPW51bGw7I1hlPSExOyNLZT1udWxsOyNZZT1udWxsOyNKZT1udWxsOyNRZT1udWxsOyNaZT0hMTtjb25zdHJ1Y3Rvcih0KXtsZXR7Y29udGFpbmVyOmUsY29sb3I6bixlbGVtZW50czppLHRpdGxlT2JqOnMsbW9kaWZpY2F0aW9uRGF0ZTphLGNvbnRlbnRzT2JqOm8scmljaFRleHQ6bCxwYXJlbnQ6YyxyZWN0OmgscGFyZW50UmVjdDpkLG9wZW46dX09dDt0aGlzLiNidD1lO3RoaXMuI1FlPXM7dGhpcy4jV2U9bzt0aGlzLiNKZT1sO3RoaXMuI1ZlPWM7dGhpcy4jU2U9bjt0aGlzLiNZZT1oO3RoaXMuIyRlPWQ7dGhpcy4jR2U9aTtjb25zdCBwPXIuUERGRGF0ZVN0cmluZy50b0RhdGVPYmplY3QoYSk7cCYmKHRoaXMuI05lPWMubDEwbi5nZXQoImFubm90YXRpb25fZGF0ZV9zdHJpbmciLHtkYXRlOnAudG9Mb2NhbGVEYXRlU3RyaW5nKCksdGltZTpwLnRvTG9jYWxlVGltZVN0cmluZygpfSkpO3RoaXMudHJpZ2dlcj1pLmZsYXRNYXAoKHQ9PnQuZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpKSk7Zm9yKGNvbnN0IHQgb2YgdGhpcy50cmlnZ2VyKXt0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLiNIZSk7dC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0aGlzLiNVZSk7dC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzLiNCZSl9dGhpcy4jYnQuaGlkZGVuPSEwO3UmJnRoaXMuI3FlKCl9cmVuZGVyKCl7aWYodGhpcy4jS2UpcmV0dXJuO2NvbnN0e3BhZ2U6e3ZpZXc6dH0sdmlld3BvcnQ6e3Jhd0RpbXM6e3BhZ2VXaWR0aDplLHBhZ2VIZWlnaHQ6bixwYWdlWDpyLHBhZ2VZOnN9fX09dGhpcy4jVmUsYT10aGlzLiNLZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmNsYXNzTmFtZT0icG9wdXAiO2lmKHRoaXMuI1NlKXtjb25zdCB0PWEuc3R5bGUub3V0bGluZUNvbG9yPWkuVXRpbC5tYWtlSGV4Q29sb3IoLi4udGhpcy4jU2UpO2lmKENTUy5zdXBwb3J0cygiYmFja2dyb3VuZC1jb2xvciIsImNvbG9yLW1peChpbiBzcmdiLCByZWQgMzAlLCB3aGl0ZSkiKSlhLnN0eWxlLmJhY2tncm91bmRDb2xvcj1gY29sb3ItbWl4KGluIHNyZ2IsICR7dH0gMzAlLCB3aGl0ZSlgO2Vsc2V7Y29uc3QgdD0uNzthLnN0eWxlLmJhY2tncm91bmRDb2xvcj1pLlV0aWwubWFrZUhleENvbG9yKC4uLnRoaXMuI1NlLm1hcCgoZT0+TWF0aC5mbG9vcih0KigyNTUtZSkrZSkpKSl9fWNvbnN0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO28uY2xhc3NOYW1lPSJoZWFkZXIiO2NvbnN0IGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaDEiKTtvLmFwcGVuZChjKTsoe2RpcjpjLmRpcixzdHI6Yy50ZXh0Q29udGVudH09dGhpcy4jUWUpO2EuYXBwZW5kKG8pO2lmKHRoaXMuI05lKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt0LmNsYXNzTGlzdC5hZGQoInBvcHVwRGF0ZSIpO3RoaXMuI05lLnRoZW4oKGU9Pnt0LnRleHRDb250ZW50PWV9KSk7by5hcHBlbmQodCl9Y29uc3QgaD10aGlzLiNXZSxkPXRoaXMuI0plO2lmKCFkPy5zdHJ8fGg/LnN0ciYmaC5zdHIhPT1kLnN0cil7Y29uc3QgdD10aGlzLl9mb3JtYXRDb250ZW50cyhoKTthLmFwcGVuZCh0KX1lbHNle2wuWGZhTGF5ZXIucmVuZGVyKHt4ZmFIdG1sOmQuaHRtbCxpbnRlbnQ6InJpY2hUZXh0IixkaXY6YX0pO2EubGFzdENoaWxkLmNsYXNzTGlzdC5hZGQoInJpY2hUZXh0IiwicG9wdXBDb250ZW50Iil9bGV0IHU9ISF0aGlzLiMkZSxwPXU/dGhpcy4jJGU6dGhpcy4jWWU7Zm9yKGNvbnN0IHQgb2YgdGhpcy4jR2UpaWYoIXB8fG51bGwhPT1pLlV0aWwuaW50ZXJzZWN0KHQuZGF0YS5yZWN0LHApKXtwPXQuZGF0YS5yZWN0O3U9ITA7YnJlYWt9Y29uc3QgZj1pLlV0aWwubm9ybWFsaXplUmVjdChbcFswXSx0WzNdLXBbMV0rdFsxXSxwWzJdLHRbM10tcFszXSt0WzFdXSksZz11P3BbMl0tcFswXSs1OjAsbT1mWzBdK2csYj1mWzFdLHtzdHlsZTp2fT10aGlzLiNidDt2LmxlZnQ9MTAwKihtLXIpL2UrIiUiO3YudG9wPTEwMCooYi1zKS9uKyIlIjt0aGlzLiNidC5hcHBlbmQoYSl9X2Zvcm1hdENvbnRlbnRzKHQpe2xldHtzdHI6ZSxkaXI6bn09dDtjb25zdCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtpLmNsYXNzTGlzdC5hZGQoInBvcHVwQ29udGVudCIpO2kuZGlyPW47Y29uc3Qgcj1lLnNwbGl0KC8oPzpcclxuP3xcbikvKTtmb3IobGV0IHQ9MCxlPXIubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IG49clt0XTtpLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKSk7dDxlLTEmJmkuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpfXJldHVybiBpfSNxZSgpe3RoaXMuI1hlPSF0aGlzLiNYZTtpZih0aGlzLiNYZSl7dGhpcy4jemUoKTt0aGlzLiNidC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy4jSGUpfWVsc2V7dGhpcy4jamUoKTt0aGlzLiNidC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy4jSGUpfX0jemUoKXt0aGlzLiNLZXx8dGhpcy5yZW5kZXIoKTtpZih0aGlzLmlzVmlzaWJsZSl0aGlzLiNYZSYmdGhpcy4jYnQuY2xhc3NMaXN0LmFkZCgiZm9jdXNlZCIpO2Vsc2V7dGhpcy4jYnQuaGlkZGVuPSExO3RoaXMuI2J0LnN0eWxlLnpJbmRleD1wYXJzZUludCh0aGlzLiNidC5zdHlsZS56SW5kZXgpKzFlM319I2plKCl7dGhpcy4jYnQuY2xhc3NMaXN0LnJlbW92ZSgiZm9jdXNlZCIpO2lmKCF0aGlzLiNYZSYmdGhpcy5pc1Zpc2libGUpe3RoaXMuI2J0LmhpZGRlbj0hMDt0aGlzLiNidC5zdHlsZS56SW5kZXg9cGFyc2VJbnQodGhpcy4jYnQuc3R5bGUuekluZGV4KS0xZTN9fWZvcmNlSGlkZSgpe3RoaXMuI1plPXRoaXMuaXNWaXNpYmxlO3RoaXMuI1plJiYodGhpcy4jYnQuaGlkZGVuPSEwKX1tYXliZVNob3coKXtpZih0aGlzLiNaZSl7dGhpcy4jWmU9ITE7dGhpcy4jYnQuaGlkZGVuPSExfX1nZXQgaXNWaXNpYmxlKCl7cmV0dXJuITE9PT10aGlzLiNidC5oaWRkZW59fWNsYXNzIEZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHtpc1JlbmRlcmFibGU6ISEodC5kYXRhLnBvcHVwUmVmfHx0LmRhdGEudGl0bGVPYmo/LnN0cnx8dC5kYXRhLmNvbnRlbnRzT2JqPy5zdHJ8fHQuZGF0YS5yaWNoVGV4dD8uc3RyKSxpZ25vcmVCb3JkZXI6ITB9KTt0aGlzLnRleHRDb250ZW50PXQuZGF0YS50ZXh0Q29udGVudDt0aGlzLnRleHRQb3NpdGlvbj10LmRhdGEudGV4dFBvc2l0aW9uO3RoaXMuYW5ub3RhdGlvbkVkaXRvclR5cGU9aS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVH1yZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJmcmVlVGV4dEFubm90YXRpb24iKTtpZih0aGlzLnRleHRDb250ZW50KXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NMaXN0LmFkZCgiYW5ub3RhdGlvblRleHRDb250ZW50Iik7dC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJjb21tZW50Iik7Zm9yKGNvbnN0IGUgb2YgdGhpcy50ZXh0Q29udGVudCl7Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7bi50ZXh0Q29udGVudD1lO3QuYXBwZW5kKG4pfXRoaXMuY29udGFpbmVyLmFwcGVuZCh0KX10aGlzLmRhdGEucG9wdXBSZWZ8fHRoaXMuX2NyZWF0ZVBvcHVwKCk7dGhpcy5fZWRpdE9uRG91YmxlQ2xpY2soKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWUuRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudD1GcmVlVGV4dEFubm90YXRpb25FbGVtZW50O2NsYXNzIExpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50eyN0bj1udWxsO2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQse2lzUmVuZGVyYWJsZTohISh0LmRhdGEucG9wdXBSZWZ8fHQuZGF0YS50aXRsZU9iaj8uc3RyfHx0LmRhdGEuY29udGVudHNPYmo/LnN0cnx8dC5kYXRhLnJpY2hUZXh0Py5zdHIpLGlnbm9yZUJvcmRlcjohMH0pfXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImxpbmVBbm5vdGF0aW9uIik7Y29uc3QgdD10aGlzLmRhdGEse3dpZHRoOmUsaGVpZ2h0Om59PWdldFJlY3REaW1zKHQucmVjdCksaT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKGUsbiwhMCkscj10aGlzLiN0bj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmxpbmUiKTtyLnNldEF0dHJpYnV0ZSgieDEiLHQucmVjdFsyXS10LmxpbmVDb29yZGluYXRlc1swXSk7ci5zZXRBdHRyaWJ1dGUoInkxIix0LnJlY3RbM10tdC5saW5lQ29vcmRpbmF0ZXNbMV0pO3Iuc2V0QXR0cmlidXRlKCJ4MiIsdC5yZWN0WzJdLXQubGluZUNvb3JkaW5hdGVzWzJdKTtyLnNldEF0dHJpYnV0ZSgieTIiLHQucmVjdFszXS10LmxpbmVDb29yZGluYXRlc1szXSk7ci5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsdC5ib3JkZXJTdHlsZS53aWR0aHx8MSk7ci5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsInRyYW5zcGFyZW50Iik7ci5zZXRBdHRyaWJ1dGUoImZpbGwiLCJ0cmFuc3BhcmVudCIpO2kuYXBwZW5kKHIpO3RoaXMuY29udGFpbmVyLmFwcGVuZChpKTt0LnBvcHVwUmVmfHx0aGlzLl9jcmVhdGVQb3B1cCgpO3JldHVybiB0aGlzLmNvbnRhaW5lcn1nZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCl7cmV0dXJuIHRoaXMuI3RufWFkZEhpZ2hsaWdodEFyZWEoKXt0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRBcmVhIil9fWNsYXNzIFNxdWFyZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7I2VuPW51bGw7Y29uc3RydWN0b3IodCl7c3VwZXIodCx7aXNSZW5kZXJhYmxlOiEhKHQuZGF0YS5wb3B1cFJlZnx8dC5kYXRhLnRpdGxlT2JqPy5zdHJ8fHQuZGF0YS5jb250ZW50c09iaj8uc3RyfHx0LmRhdGEucmljaFRleHQ/LnN0ciksaWdub3JlQm9yZGVyOiEwfSl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgic3F1YXJlQW5ub3RhdGlvbiIpO2NvbnN0IHQ9dGhpcy5kYXRhLHt3aWR0aDplLGhlaWdodDpufT1nZXRSZWN0RGltcyh0LnJlY3QpLGk9dGhpcy5zdmdGYWN0b3J5LmNyZWF0ZShlLG4sITApLHI9dC5ib3JkZXJTdHlsZS53aWR0aCxzPXRoaXMuI2VuPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KCJzdmc6cmVjdCIpO3Muc2V0QXR0cmlidXRlKCJ4IixyLzIpO3Muc2V0QXR0cmlidXRlKCJ5IixyLzIpO3Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsZS1yKTtzLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixuLXIpO3Muc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLHJ8fDEpO3Muc2V0QXR0cmlidXRlKCJzdHJva2UiLCJ0cmFuc3BhcmVudCIpO3Muc2V0QXR0cmlidXRlKCJmaWxsIiwidHJhbnNwYXJlbnQiKTtpLmFwcGVuZChzKTt0aGlzLmNvbnRhaW5lci5hcHBlbmQoaSk7dC5wb3B1cFJlZnx8dGhpcy5fY3JlYXRlUG9wdXAoKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9Z2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpe3JldHVybiB0aGlzLiNlbn1hZGRIaWdobGlnaHRBcmVhKCl7dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0QXJlYSIpfX1jbGFzcyBDaXJjbGVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50eyNubj1udWxsO2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQse2lzUmVuZGVyYWJsZTohISh0LmRhdGEucG9wdXBSZWZ8fHQuZGF0YS50aXRsZU9iaj8uc3RyfHx0LmRhdGEuY29udGVudHNPYmo/LnN0cnx8dC5kYXRhLnJpY2hUZXh0Py5zdHIpLGlnbm9yZUJvcmRlcjohMH0pfXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImNpcmNsZUFubm90YXRpb24iKTtjb25zdCB0PXRoaXMuZGF0YSx7d2lkdGg6ZSxoZWlnaHQ6bn09Z2V0UmVjdERpbXModC5yZWN0KSxpPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUoZSxuLCEwKSxyPXQuYm9yZGVyU3R5bGUud2lkdGgscz10aGlzLiNubj10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCgic3ZnOmVsbGlwc2UiKTtzLnNldEF0dHJpYnV0ZSgiY3giLGUvMik7cy5zZXRBdHRyaWJ1dGUoImN5IixuLzIpO3Muc2V0QXR0cmlidXRlKCJyeCIsZS8yLXIvMik7cy5zZXRBdHRyaWJ1dGUoInJ5IixuLzItci8yKTtzLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIixyfHwxKTtzLnNldEF0dHJpYnV0ZSgic3Ryb2tlIiwidHJhbnNwYXJlbnQiKTtzLnNldEF0dHJpYnV0ZSgiZmlsbCIsInRyYW5zcGFyZW50Iik7aS5hcHBlbmQocyk7dGhpcy5jb250YWluZXIuYXBwZW5kKGkpO3QucG9wdXBSZWZ8fHRoaXMuX2NyZWF0ZVBvcHVwKCk7cmV0dXJuIHRoaXMuY29udGFpbmVyfWdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKXtyZXR1cm4gdGhpcy4jbm59YWRkSGlnaGxpZ2h0QXJlYSgpe3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodEFyZWEiKX19Y2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50eyNpbj1udWxsO2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQse2lzUmVuZGVyYWJsZTohISh0LmRhdGEucG9wdXBSZWZ8fHQuZGF0YS50aXRsZU9iaj8uc3RyfHx0LmRhdGEuY29udGVudHNPYmo/LnN0cnx8dC5kYXRhLnJpY2hUZXh0Py5zdHIpLGlnbm9yZUJvcmRlcjohMH0pO3RoaXMuY29udGFpbmVyQ2xhc3NOYW1lPSJwb2x5bGluZUFubm90YXRpb24iO3RoaXMuc3ZnRWxlbWVudE5hbWU9InN2Zzpwb2x5bGluZSJ9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCh0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSk7Y29uc3QgdD10aGlzLmRhdGEse3dpZHRoOmUsaGVpZ2h0Om59PWdldFJlY3REaW1zKHQucmVjdCksaT10aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKGUsbiwhMCk7bGV0IHI9W107Zm9yKGNvbnN0IGUgb2YgdC52ZXJ0aWNlcyl7Y29uc3Qgbj1lLngtdC5yZWN0WzBdLGk9dC5yZWN0WzNdLWUueTtyLnB1c2gobisiLCIraSl9cj1yLmpvaW4oIiAiKTtjb25zdCBzPXRoaXMuI2luPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpO3Muc2V0QXR0cmlidXRlKCJwb2ludHMiLHIpO3Muc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLHQuYm9yZGVyU3R5bGUud2lkdGh8fDEpO3Muc2V0QXR0cmlidXRlKCJzdHJva2UiLCJ0cmFuc3BhcmVudCIpO3Muc2V0QXR0cmlidXRlKCJmaWxsIiwidHJhbnNwYXJlbnQiKTtpLmFwcGVuZChzKTt0aGlzLmNvbnRhaW5lci5hcHBlbmQoaSk7dC5wb3B1cFJlZnx8dGhpcy5fY3JlYXRlUG9wdXAocyx0KTtyZXR1cm4gdGhpcy5jb250YWluZXJ9Z2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpe3JldHVybiB0aGlzLiNpbn1hZGRIaWdobGlnaHRBcmVhKCl7dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0QXJlYSIpfX1jbGFzcyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3RoaXMuY29udGFpbmVyQ2xhc3NOYW1lPSJwb2x5Z29uQW5ub3RhdGlvbiI7dGhpcy5zdmdFbGVtZW50TmFtZT0ic3ZnOnBvbHlnb24ifX1jbGFzcyBDYXJldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCx7aXNSZW5kZXJhYmxlOiEhKHQuZGF0YS5wb3B1cFJlZnx8dC5kYXRhLnRpdGxlT2JqPy5zdHJ8fHQuZGF0YS5jb250ZW50c09iaj8uc3RyfHx0LmRhdGEucmljaFRleHQ/LnN0ciksaWdub3JlQm9yZGVyOiEwfSl9cmVuZGVyKCl7dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgiY2FyZXRBbm5vdGF0aW9uIik7dGhpcy5kYXRhLnBvcHVwUmVmfHx0aGlzLl9jcmVhdGVQb3B1cCgpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgSW5rQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHsjcm49W107Y29uc3RydWN0b3IodCl7c3VwZXIodCx7aXNSZW5kZXJhYmxlOiEhKHQuZGF0YS5wb3B1cFJlZnx8dC5kYXRhLnRpdGxlT2JqPy5zdHJ8fHQuZGF0YS5jb250ZW50c09iaj8uc3RyfHx0LmRhdGEucmljaFRleHQ/LnN0ciksaWdub3JlQm9yZGVyOiEwfSk7dGhpcy5jb250YWluZXJDbGFzc05hbWU9Imlua0Fubm90YXRpb24iO3RoaXMuc3ZnRWxlbWVudE5hbWU9InN2Zzpwb2x5bGluZSI7dGhpcy5hbm5vdGF0aW9uRWRpdG9yVHlwZT1pLkFubm90YXRpb25FZGl0b3JUeXBlLklOS31yZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lKTtjb25zdCB0PXRoaXMuZGF0YSx7d2lkdGg6ZSxoZWlnaHQ6bn09Z2V0UmVjdERpbXModC5yZWN0KSxpPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUoZSxuLCEwKTtmb3IoY29uc3QgZSBvZiB0Lmlua0xpc3RzKXtsZXQgbj1bXTtmb3IoY29uc3QgaSBvZiBlKXtjb25zdCBlPWkueC10LnJlY3RbMF0scj10LnJlY3RbM10taS55O24ucHVzaChgJHtlfSwke3J9YCl9bj1uLmpvaW4oIiAiKTtjb25zdCByPXRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpO3RoaXMuI3JuLnB1c2gocik7ci5zZXRBdHRyaWJ1dGUoInBvaW50cyIsbik7ci5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsdC5ib3JkZXJTdHlsZS53aWR0aHx8MSk7ci5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsInRyYW5zcGFyZW50Iik7ci5zZXRBdHRyaWJ1dGUoImZpbGwiLCJ0cmFuc3BhcmVudCIpO3QucG9wdXBSZWZ8fHRoaXMuX2NyZWF0ZVBvcHVwKHIsdCk7aS5hcHBlbmQocil9dGhpcy5jb250YWluZXIuYXBwZW5kKGkpO3JldHVybiB0aGlzLmNvbnRhaW5lcn1nZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCl7cmV0dXJuIHRoaXMuI3JufWFkZEhpZ2hsaWdodEFyZWEoKXt0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRBcmVhIil9fWUuSW5rQW5ub3RhdGlvbkVsZW1lbnQ9SW5rQW5ub3RhdGlvbkVsZW1lbnQ7Y2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHtpc1JlbmRlcmFibGU6ISEodC5kYXRhLnBvcHVwUmVmfHx0LmRhdGEudGl0bGVPYmo/LnN0cnx8dC5kYXRhLmNvbnRlbnRzT2JqPy5zdHJ8fHQuZGF0YS5yaWNoVGV4dD8uc3RyKSxpZ25vcmVCb3JkZXI6ITAsY3JlYXRlUXVhZHJpbGF0ZXJhbHM6ITB9KX1yZW5kZXIoKXt0aGlzLmRhdGEucG9wdXBSZWZ8fHRoaXMuX2NyZWF0ZVBvcHVwKCk7dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0QW5ub3RhdGlvbiIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHtpc1JlbmRlcmFibGU6ISEodC5kYXRhLnBvcHVwUmVmfHx0LmRhdGEudGl0bGVPYmo/LnN0cnx8dC5kYXRhLmNvbnRlbnRzT2JqPy5zdHJ8fHQuZGF0YS5yaWNoVGV4dD8uc3RyKSxpZ25vcmVCb3JkZXI6ITAsY3JlYXRlUXVhZHJpbGF0ZXJhbHM6ITB9KX1yZW5kZXIoKXt0aGlzLmRhdGEucG9wdXBSZWZ8fHRoaXMuX2NyZWF0ZVBvcHVwKCk7dGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCgidW5kZXJsaW5lQW5ub3RhdGlvbiIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19Y2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQse2lzUmVuZGVyYWJsZTohISh0LmRhdGEucG9wdXBSZWZ8fHQuZGF0YS50aXRsZU9iaj8uc3RyfHx0LmRhdGEuY29udGVudHNPYmo/LnN0cnx8dC5kYXRhLnJpY2hUZXh0Py5zdHIpLGlnbm9yZUJvcmRlcjohMCxjcmVhdGVRdWFkcmlsYXRlcmFsczohMH0pfXJlbmRlcigpe3RoaXMuZGF0YS5wb3B1cFJlZnx8dGhpcy5fY3JlYXRlUG9wdXAoKTt0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJzcXVpZ2dseUFubm90YXRpb24iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWNsYXNzIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCx7aXNSZW5kZXJhYmxlOiEhKHQuZGF0YS5wb3B1cFJlZnx8dC5kYXRhLnRpdGxlT2JqPy5zdHJ8fHQuZGF0YS5jb250ZW50c09iaj8uc3RyfHx0LmRhdGEucmljaFRleHQ/LnN0ciksaWdub3JlQm9yZGVyOiEwLGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiEwfSl9cmVuZGVyKCl7dGhpcy5kYXRhLnBvcHVwUmVmfHx0aGlzLl9jcmVhdGVQb3B1cCgpO3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoInN0cmlrZW91dEFubm90YXRpb24iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fWNsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LHtpc1JlbmRlcmFibGU6ISEodC5kYXRhLnBvcHVwUmVmfHx0LmRhdGEudGl0bGVPYmo/LnN0cnx8dC5kYXRhLmNvbnRlbnRzT2JqPy5zdHJ8fHQuZGF0YS5yaWNoVGV4dD8uc3RyKSxpZ25vcmVCb3JkZXI6ITB9KX1yZW5kZXIoKXt0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJzdGFtcEFubm90YXRpb24iKTt0aGlzLmRhdGEucG9wdXBSZWZ8fHRoaXMuX2NyZWF0ZVBvcHVwKCk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX1lLlN0YW1wQW5ub3RhdGlvbkVsZW1lbnQ9U3RhbXBBbm5vdGF0aW9uRWxlbWVudDtjbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnR7I3NuPW51bGw7Y29uc3RydWN0b3IodCl7c3VwZXIodCx7aXNSZW5kZXJhYmxlOiEwfSk7Y29uc3R7ZmlsZW5hbWU6ZSxjb250ZW50Om59PXRoaXMuZGF0YS5maWxlO3RoaXMuZmlsZW5hbWU9KDAsci5nZXRGaWxlbmFtZUZyb21VcmwpKGUsITApO3RoaXMuY29udGVudD1uO3RoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKCJmaWxlYXR0YWNobWVudGFubm90YXRpb24iLHtzb3VyY2U6dGhpcyxmaWxlbmFtZTplLGNvbnRlbnQ6bn0pfXJlbmRlcigpe3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImZpbGVBdHRhY2htZW50QW5ub3RhdGlvbiIpO2xldCB0O2lmKHRoaXMuZGF0YS5oYXNBcHBlYXJhbmNlKXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZWxzZXt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpO3Quc3JjPWAke3RoaXMuaW1hZ2VSZXNvdXJjZXNQYXRofWFubm90YXRpb24tJHsvcGFwZXJjbGlwL2kudGVzdCh0aGlzLmRhdGEubmFtZSk/InBhcGVyY2xpcCI6InB1c2hwaW4ifS5zdmdgfXQuY2xhc3NMaXN0LmFkZCgicG9wdXBUcmlnZ2VyQXJlYSIpO3QuYWRkRXZlbnRMaXN0ZW5lcigiZGJsY2xpY2siLHRoaXMuX2Rvd25sb2FkLmJpbmQodGhpcykpO3RoaXMuI3NuPXQ7IXRoaXMuZGF0YS5wb3B1cFJlZiYmKHRoaXMuZGF0YS50aXRsZU9iaj8uc3RyfHx0aGlzLmRhdGEuY29udGVudHNPYmo/LnN0cnx8dGhpcy5kYXRhLnJpY2hUZXh0KSYmdGhpcy5fY3JlYXRlUG9wdXAoKTt0aGlzLmNvbnRhaW5lci5hcHBlbmQodCk7cmV0dXJuIHRoaXMuY29udGFpbmVyfWdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKXtyZXR1cm4gdGhpcy4jc259YWRkSGlnaGxpZ2h0QXJlYSgpe3RoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodEFyZWEiKX1fZG93bmxvYWQoKXt0aGlzLmRvd25sb2FkTWFuYWdlcj8ub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGFpbmVyLHRoaXMuY29udGVudCx0aGlzLmZpbGVuYW1lKX19ZS5Bbm5vdGF0aW9uTGF5ZXI9Y2xhc3MgQW5ub3RhdGlvbkxheWVyeyNyZT1udWxsOyNhbj1udWxsOyNvbj1uZXcgTWFwO2NvbnN0cnVjdG9yKHQpe2xldHtkaXY6ZSxhY2Nlc3NpYmlsaXR5TWFuYWdlcjpuLGFubm90YXRpb25DYW52YXNNYXA6aSxsMTBuOnIscGFnZTpzLHZpZXdwb3J0OmF9PXQ7dGhpcy5kaXY9ZTt0aGlzLiNyZT1uO3RoaXMuI2FuPWk7dGhpcy5sMTBuPXI7dGhpcy5wYWdlPXM7dGhpcy52aWV3cG9ydD1hO3RoaXMuekluZGV4PTA7dGhpcy5sMTBufHw9by5OdWxsTDEwbn0jbG4odCxlKXtjb25zdCBuPXQuZmlyc3RDaGlsZHx8dDtuLmlkPWAke3IuQW5ub3RhdGlvblByZWZpeH0ke2V9YDt0aGlzLmRpdi5hcHBlbmQodCk7dGhpcy4jcmU/Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsdCxuLCExKX1hc3luYyByZW5kZXIodCl7Y29uc3R7YW5ub3RhdGlvbnM6ZX09dCxuPXRoaXMuZGl2OygwLHIuc2V0TGF5ZXJEaW1lbnNpb25zKShuLHRoaXMudmlld3BvcnQpO2NvbnN0IGE9bmV3IE1hcCxvPXtkYXRhOm51bGwsbGF5ZXI6bixsaW5rU2VydmljZTp0LmxpbmtTZXJ2aWNlLGRvd25sb2FkTWFuYWdlcjp0LmRvd25sb2FkTWFuYWdlcixpbWFnZVJlc291cmNlc1BhdGg6dC5pbWFnZVJlc291cmNlc1BhdGh8fCIiLHJlbmRlckZvcm1zOiExIT09dC5yZW5kZXJGb3JtcyxzdmdGYWN0b3J5Om5ldyByLkRPTVNWR0ZhY3RvcnksYW5ub3RhdGlvblN0b3JhZ2U6dC5hbm5vdGF0aW9uU3RvcmFnZXx8bmV3IHMuQW5ub3RhdGlvblN0b3JhZ2UsZW5hYmxlU2NyaXB0aW5nOiEwPT09dC5lbmFibGVTY3JpcHRpbmcsaGFzSlNBY3Rpb25zOnQuaGFzSlNBY3Rpb25zLGZpZWxkT2JqZWN0czp0LmZpZWxkT2JqZWN0cyxwYXJlbnQ6dGhpcyxlbGVtZW50czpudWxsfTtmb3IoY29uc3QgdCBvZiBlKXtpZih0Lm5vSFRNTCljb250aW51ZTtjb25zdCBlPXQuYW5ub3RhdGlvblR5cGU9PT1pLkFubm90YXRpb25UeXBlLlBPUFVQO2lmKGUpe2NvbnN0IGU9YS5nZXQodC5pZCk7aWYoIWUpY29udGludWU7by5lbGVtZW50cz1lfWVsc2V7Y29uc3R7d2lkdGg6ZSxoZWlnaHQ6bn09Z2V0UmVjdERpbXModC5yZWN0KTtpZihlPD0wfHxuPD0wKWNvbnRpbnVlfW8uZGF0YT10O2NvbnN0IG49QW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5LmNyZWF0ZShvKTtpZighbi5pc1JlbmRlcmFibGUpY29udGludWU7aWYoIWUmJnQucG9wdXBSZWYpe2NvbnN0IGU9YS5nZXQodC5wb3B1cFJlZik7ZT9lLnB1c2gobik6YS5zZXQodC5wb3B1cFJlZixbbl0pfW4uYW5ub3RhdGlvbkVkaXRvclR5cGU+MCYmdGhpcy4jb24uc2V0KG4uZGF0YS5pZCxuKTtjb25zdCByPW4ucmVuZGVyKCk7dC5oaWRkZW4mJihyLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIpO3RoaXMuI2xuKHIsdC5pZCl9dGhpcy4jY24oKTthd2FpdCB0aGlzLmwxMG4udHJhbnNsYXRlKG4pfXVwZGF0ZSh0KXtsZXR7dmlld3BvcnQ6ZX09dDtjb25zdCBuPXRoaXMuZGl2O3RoaXMudmlld3BvcnQ9ZTsoMCxyLnNldExheWVyRGltZW5zaW9ucykobix7cm90YXRpb246ZS5yb3RhdGlvbn0pO3RoaXMuI2NuKCk7bi5oaWRkZW49ITF9I2NuKCl7aWYoIXRoaXMuI2FuKXJldHVybjtjb25zdCB0PXRoaXMuZGl2O2Zvcihjb25zdFtlLG5db2YgdGhpcy4jYW4pe2NvbnN0IGk9dC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hbm5vdGF0aW9uLWlkPSIke2V9Il1gKTtpZighaSljb250aW51ZTtjb25zdHtmaXJzdENoaWxkOnJ9PWk7cj8iQ0FOVkFTIj09PXIubm9kZU5hbWU/ci5yZXBsYWNlV2l0aChuKTpyLmJlZm9yZShuKTppLmFwcGVuZChuKX10aGlzLiNhbi5jbGVhcigpfWdldEVkaXRhYmxlQW5ub3RhdGlvbnMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiNvbi52YWx1ZXMoKSl9Z2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpe3JldHVybiB0aGlzLiNvbi5nZXQodCl9fX0sKHQsZSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuQ29sb3JDb252ZXJ0ZXJzPXZvaWQgMDtmdW5jdGlvbiBtYWtlQ29sb3JDb21wKHQpe3JldHVybiBNYXRoLmZsb29yKDI1NSpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfWUuQ29sb3JDb252ZXJ0ZXJzPWNsYXNzIENvbG9yQ29udmVydGVyc3tzdGF0aWMgQ01ZS19HKHQpe2xldFtlLG4saSxyXT10O3JldHVyblsiRyIsMS1NYXRoLm1pbigxLC4zKmUrLjU5KmkrLjExKm4rcildfXN0YXRpYyBHX0NNWUsodCl7bGV0W2VdPXQ7cmV0dXJuWyJDTVlLIiwwLDAsMCwxLWVdfXN0YXRpYyBHX1JHQih0KXtsZXRbZV09dDtyZXR1cm5bIlJHQiIsZSxlLGVdfXN0YXRpYyBHX0hUTUwodCl7bGV0W2VdPXQ7Y29uc3Qgbj1tYWtlQ29sb3JDb21wKGUpO3JldHVybmAjJHtufSR7bn0ke259YH1zdGF0aWMgUkdCX0codCl7bGV0W2UsbixpXT10O3JldHVyblsiRyIsLjMqZSsuNTkqbisuMTEqaV19c3RhdGljIFJHQl9IVE1MKHQpe2xldFtlLG4saV09dDtyZXR1cm5gIyR7bWFrZUNvbG9yQ29tcChlKX0ke21ha2VDb2xvckNvbXAobil9JHttYWtlQ29sb3JDb21wKGkpfWB9c3RhdGljIFRfSFRNTCgpe3JldHVybiIjMDAwMDAwMDAifXN0YXRpYyBDTVlLX1JHQih0KXtsZXRbZSxuLGkscl09dDtyZXR1cm5bIlJHQiIsMS1NYXRoLm1pbigxLGUrciksMS1NYXRoLm1pbigxLGkrciksMS1NYXRoLm1pbigxLG4rcildfXN0YXRpYyBDTVlLX0hUTUwodCl7Y29uc3QgZT10aGlzLkNNWUtfUkdCKHQpLnNsaWNlKDEpO3JldHVybiB0aGlzLlJHQl9IVE1MKGUpfXN0YXRpYyBSR0JfQ01ZSyh0KXtsZXRbZSxuLGldPXQ7Y29uc3Qgcj0xLWUscz0xLW4sYT0xLWk7cmV0dXJuWyJDTVlLIixyLHMsYSxNYXRoLm1pbihyLHMsYSldfX19LCh0LGUpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLk51bGxMMTBuPXZvaWQgMDtlLmdldEwxMG5GYWxsYmFjaz1nZXRMMTBuRmFsbGJhY2s7Y29uc3Qgbj17b2ZfcGFnZXM6Im9mIHt7cGFnZXNDb3VudH19IixwYWdlX29mX3BhZ2VzOiIoe3twYWdlTnVtYmVyfX0gb2Yge3twYWdlc0NvdW50fX0pIixkb2N1bWVudF9wcm9wZXJ0aWVzX2tiOiJ7e3NpemVfa2J9fSBLQiAoe3tzaXplX2J9fSBieXRlcykiLGRvY3VtZW50X3Byb3BlcnRpZXNfbWI6Int7c2l6ZV9tYn19IE1CICh7e3NpemVfYn19IGJ5dGVzKSIsZG9jdW1lbnRfcHJvcGVydGllc19kYXRlX3N0cmluZzoie3tkYXRlfX0sIHt7dGltZX19Iixkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV91bml0X2luY2hlczoiaW4iLGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX3VuaXRfbWlsbGltZXRlcnM6Im1tIixkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9vcmllbnRhdGlvbl9wb3J0cmFpdDoicG9ydHJhaXQiLGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX29yaWVudGF0aW9uX2xhbmRzY2FwZToibGFuZHNjYXBlIixkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9uYW1lX2EzOiJBMyIsZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfbmFtZV9hNDoiQTQiLGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX25hbWVfbGV0dGVyOiJMZXR0ZXIiLGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX25hbWVfbGVnYWw6IkxlZ2FsIixkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9kaW1lbnNpb25fc3RyaW5nOiJ7e3dpZHRofX0gw5cge3toZWlnaHR9fSB7e3VuaXR9fSAoe3tvcmllbnRhdGlvbn19KSIsZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfZGltZW5zaW9uX25hbWVfc3RyaW5nOiJ7e3dpZHRofX0gw5cge3toZWlnaHR9fSB7e3VuaXR9fSAoe3tuYW1lfX0sIHt7b3JpZW50YXRpb259fSkiLGRvY3VtZW50X3Byb3BlcnRpZXNfbGluZWFyaXplZF95ZXM6IlllcyIsZG9jdW1lbnRfcHJvcGVydGllc19saW5lYXJpemVkX25vOiJObyIsYWRkaXRpb25hbF9sYXllcnM6IkFkZGl0aW9uYWwgTGF5ZXJzIixwYWdlX2xhbmRtYXJrOiJQYWdlIHt7cGFnZX19Iix0aHVtYl9wYWdlX3RpdGxlOiJQYWdlIHt7cGFnZX19Iix0aHVtYl9wYWdlX2NhbnZhczoiVGh1bWJuYWlsIG9mIFBhZ2Uge3twYWdlfX0iLGZpbmRfcmVhY2hlZF90b3A6IlJlYWNoZWQgdG9wIG9mIGRvY3VtZW50LCBjb250aW51ZWQgZnJvbSBib3R0b20iLGZpbmRfcmVhY2hlZF9ib3R0b206IlJlYWNoZWQgZW5kIG9mIGRvY3VtZW50LCBjb250aW51ZWQgZnJvbSB0b3AiLCJmaW5kX21hdGNoX2NvdW50W29uZV0iOiJ7e2N1cnJlbnR9fSBvZiB7e3RvdGFsfX0gbWF0Y2giLCJmaW5kX21hdGNoX2NvdW50W290aGVyXSI6Int7Y3VycmVudH19IG9mIHt7dG90YWx9fSBtYXRjaGVzIiwiZmluZF9tYXRjaF9jb3VudF9saW1pdFtvbmVdIjoiTW9yZSB0aGFuIHt7bGltaXR9fSBtYXRjaCIsImZpbmRfbWF0Y2hfY291bnRfbGltaXRbb3RoZXJdIjoiTW9yZSB0aGFuIHt7bGltaXR9fSBtYXRjaGVzIixmaW5kX25vdF9mb3VuZDoiUGhyYXNlIG5vdCBmb3VuZCIscGFnZV9zY2FsZV93aWR0aDoiUGFnZSBXaWR0aCIscGFnZV9zY2FsZV9maXQ6IlBhZ2UgRml0IixwYWdlX3NjYWxlX2F1dG86IkF1dG9tYXRpYyBab29tIixwYWdlX3NjYWxlX2FjdHVhbDoiQWN0dWFsIFNpemUiLHBhZ2Vfc2NhbGVfcGVyY2VudDoie3tzY2FsZX19JSIsbG9hZGluZ19lcnJvcjoiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgUERGLiIsaW52YWxpZF9maWxlX2Vycm9yOiJJbnZhbGlkIG9yIGNvcnJ1cHRlZCBQREYgZmlsZS4iLG1pc3NpbmdfZmlsZV9lcnJvcjoiTWlzc2luZyBQREYgZmlsZS4iLHVuZXhwZWN0ZWRfcmVzcG9uc2VfZXJyb3I6IlVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlLiIscmVuZGVyaW5nX2Vycm9yOiJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZW5kZXJpbmcgdGhlIHBhZ2UuIixhbm5vdGF0aW9uX2RhdGVfc3RyaW5nOiJ7e2RhdGV9fSwge3t0aW1lfX0iLHByaW50aW5nX25vdF9zdXBwb3J0ZWQ6Ildhcm5pbmc6IFByaW50aW5nIGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLiIscHJpbnRpbmdfbm90X3JlYWR5OiJXYXJuaW5nOiBUaGUgUERGIGlzIG5vdCBmdWxseSBsb2FkZWQgZm9yIHByaW50aW5nLiIsd2ViX2ZvbnRzX2Rpc2FibGVkOiJXZWIgZm9udHMgYXJlIGRpc2FibGVkOiB1bmFibGUgdG8gdXNlIGVtYmVkZGVkIFBERiBmb250cy4iLGZyZWVfdGV4dDJfZGVmYXVsdF9jb250ZW50OiJTdGFydCB0eXBpbmfigKYiLGVkaXRvcl9mcmVlX3RleHQyX2FyaWFfbGFiZWw6IlRleHQgRWRpdG9yIixlZGl0b3JfaW5rMl9hcmlhX2xhYmVsOiJEcmF3IEVkaXRvciIsZWRpdG9yX2lua19jYW52YXNfYXJpYV9sYWJlbDoiVXNlci1jcmVhdGVkIGltYWdlIixwcmludF9wcm9ncmVzc19wZXJjZW50OiJ7e3Byb2dyZXNzfX0lIn07ZnVuY3Rpb24gZ2V0TDEwbkZhbGxiYWNrKHQsZSl7c3dpdGNoKHQpe2Nhc2UiZmluZF9tYXRjaF9jb3VudCI6dD1gZmluZF9tYXRjaF9jb3VudFskezE9PT1lLnRvdGFsPyJvbmUiOiJvdGhlciJ9XWA7YnJlYWs7Y2FzZSJmaW5kX21hdGNoX2NvdW50X2xpbWl0Ijp0PWBmaW5kX21hdGNoX2NvdW50X2xpbWl0WyR7MT09PWUubGltaXQ/Im9uZSI6Im90aGVyIn1dYH1yZXR1cm4gblt0XXx8IiJ9Y29uc3QgaT17Z2V0TGFuZ3VhZ2U6YXN5bmMoKT0+ImVuLXVzIixnZXREaXJlY3Rpb246YXN5bmMoKT0+Imx0ciIsYXN5bmMgZ2V0KHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO3JldHVybiBmdW5jdGlvbiBmb3JtYXRMMTBuVmFsdWUodCxlKXtyZXR1cm4gZT90LnJlcGxhY2VBbGwoL1x7XHtccyooXHcrKVxzKlx9XH0vZywoKHQsbik9Pm4gaW4gZT9lW25dOiJ7eyIrbisifX0iKSk6dH0oYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOmdldEwxMG5GYWxsYmFjayh0LGUpLGUpfSxhc3luYyB0cmFuc2xhdGUodCl7fX07ZS5OdWxsTDEwbj1pfSwodCxlLG4pPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtlLlhmYUxheWVyPXZvaWQgMDtuKDg5KTt2YXIgaT1uKDE5Myk7ZS5YZmFMYXllcj1jbGFzcyBYZmFMYXllcntzdGF0aWMgc2V0dXBTdG9yYWdlKHQsZSxuLGkscil7Y29uc3Qgcz1pLmdldFZhbHVlKGUse3ZhbHVlOm51bGx9KTtzd2l0Y2gobi5uYW1lKXtjYXNlInRleHRhcmVhIjpudWxsIT09cy52YWx1ZSYmKHQudGV4dENvbnRlbnQ9cy52YWx1ZSk7aWYoInByaW50Ij09PXIpYnJlYWs7dC5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsKHQ9PntpLnNldFZhbHVlKGUse3ZhbHVlOnQudGFyZ2V0LnZhbHVlfSl9KSk7YnJlYWs7Y2FzZSJpbnB1dCI6aWYoInJhZGlvIj09PW4uYXR0cmlidXRlcy50eXBlfHwiY2hlY2tib3giPT09bi5hdHRyaWJ1dGVzLnR5cGUpe3MudmFsdWU9PT1uLmF0dHJpYnV0ZXMueGZhT24/dC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCEwKTpzLnZhbHVlPT09bi5hdHRyaWJ1dGVzLnhmYU9mZiYmdC5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTtpZigicHJpbnQiPT09cilicmVhazt0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsKHQ9PntpLnNldFZhbHVlKGUse3ZhbHVlOnQudGFyZ2V0LmNoZWNrZWQ/dC50YXJnZXQuZ2V0QXR0cmlidXRlKCJ4ZmFPbiIpOnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgieGZhT2ZmIil9KX0pKX1lbHNle251bGwhPT1zLnZhbHVlJiZ0LnNldEF0dHJpYnV0ZSgidmFsdWUiLHMudmFsdWUpO2lmKCJwcmludCI9PT1yKWJyZWFrO3QuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCh0PT57aS5zZXRWYWx1ZShlLHt2YWx1ZTp0LnRhcmdldC52YWx1ZX0pfSkpfWJyZWFrO2Nhc2Uic2VsZWN0IjppZihudWxsIT09cy52YWx1ZSl7dC5zZXRBdHRyaWJ1dGUoInZhbHVlIixzLnZhbHVlKTtmb3IoY29uc3QgdCBvZiBuLmNoaWxkcmVuKXQuYXR0cmlidXRlcy52YWx1ZT09PXMudmFsdWU/dC5hdHRyaWJ1dGVzLnNlbGVjdGVkPSEwOnQuYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eSgic2VsZWN0ZWQiKSYmZGVsZXRlIHQuYXR0cmlidXRlcy5zZWxlY3RlZH10LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IiwodD0+e2NvbnN0IG49dC50YXJnZXQub3B0aW9ucyxyPS0xPT09bi5zZWxlY3RlZEluZGV4PyIiOm5bbi5zZWxlY3RlZEluZGV4XS52YWx1ZTtpLnNldFZhbHVlKGUse3ZhbHVlOnJ9KX0pKX19c3RhdGljIHNldEF0dHJpYnV0ZXModCl7bGV0e2h0bWw6ZSxlbGVtZW50Om4sc3RvcmFnZTppPW51bGwsaW50ZW50OnIsbGlua1NlcnZpY2U6c309dDtjb25zdHthdHRyaWJ1dGVzOmF9PW4sbz1lIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQ7InJhZGlvIj09PWEudHlwZSYmKGEubmFtZT1gJHthLm5hbWV9LSR7cn1gKTtmb3IoY29uc3RbdCxuXW9mIE9iamVjdC5lbnRyaWVzKGEpKWlmKG51bGwhPW4pc3dpdGNoKHQpe2Nhc2UiY2xhc3MiOm4ubGVuZ3RoJiZlLnNldEF0dHJpYnV0ZSh0LG4uam9pbigiICIpKTticmVhaztjYXNlImRhdGFJZCI6YnJlYWs7Y2FzZSJpZCI6ZS5zZXRBdHRyaWJ1dGUoImRhdGEtZWxlbWVudC1pZCIsbik7YnJlYWs7Y2FzZSJzdHlsZSI6T2JqZWN0LmFzc2lnbihlLnN0eWxlLG4pO2JyZWFrO2Nhc2UidGV4dENvbnRlbnQiOmUudGV4dENvbnRlbnQ9bjticmVhaztkZWZhdWx0Oighb3x8ImhyZWYiIT09dCYmIm5ld1dpbmRvdyIhPT10KSYmZS5zZXRBdHRyaWJ1dGUodCxuKX1vJiZzLmFkZExpbmtBdHRyaWJ1dGVzKGUsYS5ocmVmLGEubmV3V2luZG93KTtpJiZhLmRhdGFJZCYmdGhpcy5zZXR1cFN0b3JhZ2UoZSxhLmRhdGFJZCxuLGkpfXN0YXRpYyByZW5kZXIodCl7Y29uc3QgZT10LmFubm90YXRpb25TdG9yYWdlLG49dC5saW5rU2VydmljZSxyPXQueGZhSHRtbCxzPXQuaW50ZW50fHwiZGlzcGxheSIsYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHIubmFtZSk7ci5hdHRyaWJ1dGVzJiZ0aGlzLnNldEF0dHJpYnV0ZXMoe2h0bWw6YSxlbGVtZW50OnIsaW50ZW50OnMsbGlua1NlcnZpY2U6bn0pO2NvbnN0IG89W1tyLC0xLGFdXSxsPXQuZGl2O2wuYXBwZW5kKGEpO2lmKHQudmlld3BvcnQpe2NvbnN0IGU9YG1hdHJpeCgke3Qudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oIiwiKX0pYDtsLnN0eWxlLnRyYW5zZm9ybT1lfSJyaWNoVGV4dCIhPT1zJiZsLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJ4ZmFMYXllciB4ZmFGb250Iik7Y29uc3QgYz1bXTtmb3IoO28ubGVuZ3RoPjA7KXtjb25zdFt0LHIsYV09by5hdCgtMSk7aWYocisxPT09dC5jaGlsZHJlbi5sZW5ndGgpe28ucG9wKCk7Y29udGludWV9Y29uc3QgbD10LmNoaWxkcmVuWysrby5hdCgtMSlbMV1dO2lmKG51bGw9PT1sKWNvbnRpbnVlO2NvbnN0e25hbWU6aH09bDtpZigiI3RleHQiPT09aCl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsLnZhbHVlKTtjLnB1c2godCk7YS5hcHBlbmQodCk7Y29udGludWV9Y29uc3QgZD1sPy5hdHRyaWJ1dGVzPy54bWxucz9kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobC5hdHRyaWJ1dGVzLnhtbG5zLGgpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaCk7YS5hcHBlbmQoZCk7bC5hdHRyaWJ1dGVzJiZ0aGlzLnNldEF0dHJpYnV0ZXMoe2h0bWw6ZCxlbGVtZW50Omwsc3RvcmFnZTplLGludGVudDpzLGxpbmtTZXJ2aWNlOm59KTtpZihsLmNoaWxkcmVuJiZsLmNoaWxkcmVuLmxlbmd0aD4wKW8ucHVzaChbbCwtMSxkXSk7ZWxzZSBpZihsLnZhbHVlKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGwudmFsdWUpO2kuWGZhVGV4dC5zaG91bGRCdWlsZFRleHQoaCkmJmMucHVzaCh0KTtkLmFwcGVuZCh0KX19Zm9yKGNvbnN0IHQgb2YgbC5xdWVyeVNlbGVjdG9yQWxsKCIueGZhTm9uSW50ZXJhY3RpdmUgaW5wdXQsIC54ZmFOb25JbnRlcmFjdGl2ZSB0ZXh0YXJlYSIpKXQuc2V0QXR0cmlidXRlKCJyZWFkT25seSIsITApO3JldHVybnt0ZXh0RGl2czpjfX1zdGF0aWMgdXBkYXRlKHQpe2NvbnN0IGU9YG1hdHJpeCgke3Qudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oIiwiKX0pYDt0LmRpdi5zdHlsZS50cmFuc2Zvcm09ZTt0LmRpdi5oaWRkZW49ITF9fX0sKHQsZSxuKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7ZS5JbmtFZGl0b3I9dm9pZCAwO24oODkpO24oMik7dmFyIGk9bigxKSxyPW4oMTYzKSxzPW4oMTk3KSxhPW4oMTY0KTtjbGFzcyBJbmtFZGl0b3IgZXh0ZW5kcyByLkFubm90YXRpb25FZGl0b3J7I2huPTA7I2RuPTA7I3VuPXRoaXMuY2FudmFzQ29udGV4dE1lbnUuYmluZCh0aGlzKTsjcG49dGhpcy5jYW52YXNQb2ludGVybW92ZS5iaW5kKHRoaXMpOyNmbj10aGlzLmNhbnZhc1BvaW50ZXJsZWF2ZS5iaW5kKHRoaXMpOyNnbj10aGlzLmNhbnZhc1BvaW50ZXJ1cC5iaW5kKHRoaXMpOyNtbj10aGlzLmNhbnZhc1BvaW50ZXJkb3duLmJpbmQodGhpcyk7I2JuPW5ldyBQYXRoMkQ7I3ZuPSExOyN5bj0hMTsjQW49ITE7I19uPW51bGw7I1NuPTA7I0VuPTA7I3huPW51bGw7c3RhdGljIF9kZWZhdWx0Q29sb3I9bnVsbDtzdGF0aWMgX2RlZmF1bHRPcGFjaXR5PTE7c3RhdGljIF9kZWZhdWx0VGhpY2tuZXNzPTE7c3RhdGljIF9sMTBuUHJvbWlzZTtzdGF0aWMgX3R5cGU9ImluayI7Y29uc3RydWN0b3IodCl7c3VwZXIoey4uLnQsbmFtZToiaW5rRWRpdG9yIn0pO3RoaXMuY29sb3I9dC5jb2xvcnx8bnVsbDt0aGlzLnRoaWNrbmVzcz10LnRoaWNrbmVzc3x8bnVsbDt0aGlzLm9wYWNpdHk9dC5vcGFjaXR5fHxudWxsO3RoaXMucGF0aHM9W107dGhpcy5iZXppZXJQYXRoMkQ9W107dGhpcy5hbGxSYXdQYXRocz1bXTt0aGlzLmN1cnJlbnRQYXRoPVtdO3RoaXMuc2NhbGVGYWN0b3I9MTt0aGlzLnRyYW5zbGF0aW9uWD10aGlzLnRyYW5zbGF0aW9uWT0wO3RoaXMueD0wO3RoaXMueT0wO3RoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW89ITB9c3RhdGljIGluaXRpYWxpemUodCl7dGhpcy5fbDEwblByb21pc2U9bmV3IE1hcChbImVkaXRvcl9pbmtfY2FudmFzX2FyaWFfbGFiZWwiLCJlZGl0b3JfaW5rMl9hcmlhX2xhYmVsIl0ubWFwKChlPT5bZSx0LmdldChlKV0pKSl9c3RhdGljIHVwZGF0ZURlZmF1bHRQYXJhbXModCxlKXtzd2l0Y2godCl7Y2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6SW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzPWU7YnJlYWs7Y2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUjpJbmtFZGl0b3IuX2RlZmF1bHRDb2xvcj1lO2JyZWFrO2Nhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWTpJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5PWUvMTAwfX11cGRhdGVQYXJhbXModCxlKXtzd2l0Y2godCl7Y2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6dGhpcy4jd24oZSk7YnJlYWs7Y2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUjp0aGlzLiNQZShlKTticmVhaztjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6dGhpcy4jQ24oZSl9fXN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpe3JldHVybltbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzc10sW2kuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SLElua0VkaXRvci5fZGVmYXVsdENvbG9yfHxyLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdLFtpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLE1hdGgucm91bmQoMTAwKklua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkpXV19Z2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpe3JldHVybltbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLHRoaXMudGhpY2tuZXNzfHxJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLFtpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUix0aGlzLmNvbG9yfHxJbmtFZGl0b3IuX2RlZmF1bHRDb2xvcnx8ci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXSxbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSxNYXRoLnJvdW5kKDEwMCoodGhpcy5vcGFjaXR5Pz9JbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5KSldXX0jd24odCl7Y29uc3QgZT10aGlzLnRoaWNrbmVzczt0aGlzLmFkZENvbW1hbmRzKHtjbWQ6KCk9Pnt0aGlzLnRoaWNrbmVzcz10O3RoaXMuI1RuKCl9LHVuZG86KCk9Pnt0aGlzLnRoaWNrbmVzcz1lO3RoaXMuI1RuKCl9LG11c3RFeGVjOiEwLHR5cGU6aS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLG92ZXJ3cml0ZUlmU2FtZVR5cGU6ITAsa2VlcFVuZG86ITB9KX0jUGUodCl7Y29uc3QgZT10aGlzLmNvbG9yO3RoaXMuYWRkQ29tbWFuZHMoe2NtZDooKT0+e3RoaXMuY29sb3I9dDt0aGlzLiNQbigpfSx1bmRvOigpPT57dGhpcy5jb2xvcj1lO3RoaXMuI1BuKCl9LG11c3RFeGVjOiEwLHR5cGU6aS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1Isb3ZlcndyaXRlSWZTYW1lVHlwZTohMCxrZWVwVW5kbzohMH0pfSNDbih0KXt0Lz0xMDA7Y29uc3QgZT10aGlzLm9wYWNpdHk7dGhpcy5hZGRDb21tYW5kcyh7Y21kOigpPT57dGhpcy5vcGFjaXR5PXQ7dGhpcy4jUG4oKX0sdW5kbzooKT0+e3RoaXMub3BhY2l0eT1lO3RoaXMuI1BuKCl9LG11c3RFeGVjOiEwLHR5cGU6aS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSxvdmVyd3JpdGVJZlNhbWVUeXBlOiEwLGtlZXBVbmRvOiEwfSl9cmVidWlsZCgpe3N1cGVyLnJlYnVpbGQoKTtpZihudWxsIT09dGhpcy5kaXYpe2lmKCF0aGlzLmNhbnZhcyl7dGhpcy4ja24oKTt0aGlzLiNNbigpfWlmKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSl7dGhpcy5wYXJlbnQuYWRkKHRoaXMpO3RoaXMuI1JuKCl9dGhpcy4jVG4oKX19cmVtb3ZlKCl7aWYobnVsbCE9PXRoaXMuY2FudmFzKXt0aGlzLmlzRW1wdHkoKXx8dGhpcy5jb21taXQoKTt0aGlzLmNhbnZhcy53aWR0aD10aGlzLmNhbnZhcy5oZWlnaHQ9MDt0aGlzLmNhbnZhcy5yZW1vdmUoKTt0aGlzLmNhbnZhcz1udWxsO3RoaXMuI19uLmRpc2Nvbm5lY3QoKTt0aGlzLiNfbj1udWxsO3N1cGVyLnJlbW92ZSgpfX1zZXRQYXJlbnQodCl7IXRoaXMucGFyZW50JiZ0P3RoaXMuX3VpTWFuYWdlci5yZW1vdmVTaG91bGRSZXNjYWxlKHRoaXMpOnRoaXMucGFyZW50JiZudWxsPT09dCYmdGhpcy5fdWlNYW5hZ2VyLmFkZFNob3VsZFJlc2NhbGUodGhpcyk7c3VwZXIuc2V0UGFyZW50KHQpfW9uU2NhbGVDaGFuZ2luZygpe2NvbnN0W3QsZV09dGhpcy5wYXJlbnREaW1lbnNpb25zLG49dGhpcy53aWR0aCp0LGk9dGhpcy5oZWlnaHQqZTt0aGlzLnNldERpbWVuc2lvbnMobixpKX1lbmFibGVFZGl0TW9kZSgpe2lmKCF0aGlzLiN2biYmbnVsbCE9PXRoaXMuY2FudmFzKXtzdXBlci5lbmFibGVFZGl0TW9kZSgpO3RoaXMuZGl2LmRyYWdnYWJsZT0hMTt0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsdGhpcy4jbW4pfX1kaXNhYmxlRWRpdE1vZGUoKXtpZih0aGlzLmlzSW5FZGl0TW9kZSgpJiZudWxsIT09dGhpcy5jYW52YXMpe3N1cGVyLmRpc2FibGVFZGl0TW9kZSgpO3RoaXMuZGl2LmRyYWdnYWJsZT0hdGhpcy5pc0VtcHR5KCk7dGhpcy5kaXYuY2xhc3NMaXN0LnJlbW92ZSgiZWRpdGluZyIpO3RoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIix0aGlzLiNtbil9fW9uY2VBZGRlZCgpe3RoaXMuZGl2LmRyYWdnYWJsZT0hdGhpcy5pc0VtcHR5KCl9aXNFbXB0eSgpe3JldHVybiAwPT09dGhpcy5wYXRocy5sZW5ndGh8fDE9PT10aGlzLnBhdGhzLmxlbmd0aCYmMD09PXRoaXMucGF0aHNbMF0ubGVuZ3RofSNGbigpe2NvbnN0e3BhcmVudFJvdGF0aW9uOnQscGFyZW50RGltZW5zaW9uczpbZSxuXX09dGhpcztzd2l0Y2godCl7Y2FzZSA5MDpyZXR1cm5bMCxuLG4sZV07Y2FzZSAxODA6cmV0dXJuW2UsbixlLG5dO2Nhc2UgMjcwOnJldHVybltlLDAsbixlXTtkZWZhdWx0OnJldHVyblswLDAsZSxuXX19I0luKCl7Y29uc3R7Y3R4OnQsY29sb3I6ZSxvcGFjaXR5Om4sdGhpY2tuZXNzOmkscGFyZW50U2NhbGU6cixzY2FsZUZhY3RvcjpzfT10aGlzO3QubGluZVdpZHRoPWkqci9zO3QubGluZUNhcD0icm91bmQiO3QubGluZUpvaW49InJvdW5kIjt0Lm1pdGVyTGltaXQ9MTA7dC5zdHJva2VTdHlsZT1gJHtlfSR7KDAsYS5vcGFjaXR5VG9IZXgpKG4pfWB9I0RuKHQsZSl7dGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMuI3VuKTt0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybGVhdmUiLHRoaXMuI2ZuKTt0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsdGhpcy4jcG4pO3RoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsdGhpcy4jZ24pO3RoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIix0aGlzLiNtbik7dGhpcy5pc0VkaXRpbmc9ITA7aWYoIXRoaXMuI0FuKXt0aGlzLiNBbj0hMDt0aGlzLiNSbigpO3RoaXMudGhpY2tuZXNzfHw9SW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzO3RoaXMuY29sb3J8fD1JbmtFZGl0b3IuX2RlZmF1bHRDb2xvcnx8ci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yO3RoaXMub3BhY2l0eT8/PUlua0VkaXRvci5fZGVmYXVsdE9wYWNpdHl9dGhpcy5jdXJyZW50UGF0aC5wdXNoKFt0LGVdKTt0aGlzLiN5bj0hMTt0aGlzLiNJbigpO3RoaXMuI3huPSgpPT57dGhpcy4jT24oKTt0aGlzLiN4biYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLiN4bil9O3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy4jeG4pfSNMbih0LGUpe2NvbnN0W24saV09dGhpcy5jdXJyZW50UGF0aC5hdCgtMSk7aWYodGhpcy5jdXJyZW50UGF0aC5sZW5ndGg+MSYmdD09PW4mJmU9PT1pKXJldHVybjtjb25zdCByPXRoaXMuY3VycmVudFBhdGg7bGV0IHM9dGhpcy4jYm47ci5wdXNoKFt0LGVdKTt0aGlzLiN5bj0hMDtpZihyLmxlbmd0aDw9Mil7cy5tb3ZlVG8oLi4uclswXSk7cy5saW5lVG8odCxlKX1lbHNle2lmKDM9PT1yLmxlbmd0aCl7dGhpcy4jYm49cz1uZXcgUGF0aDJEO3MubW92ZVRvKC4uLnJbMF0pfXRoaXMuI05uKHMsLi4uci5hdCgtMyksLi4uci5hdCgtMiksdCxlKX19I0JuKCl7aWYoMD09PXRoaXMuY3VycmVudFBhdGgubGVuZ3RoKXJldHVybjtjb25zdCB0PXRoaXMuY3VycmVudFBhdGguYXQoLTEpO3RoaXMuI2JuLmxpbmVUbyguLi50KX0jam4odCxlKXt0aGlzLiN4bj1udWxsO3Q9TWF0aC5taW4oTWF0aC5tYXgodCwwKSx0aGlzLmNhbnZhcy53aWR0aCk7ZT1NYXRoLm1pbihNYXRoLm1heChlLDApLHRoaXMuY2FudmFzLmhlaWdodCk7dGhpcy4jTG4odCxlKTt0aGlzLiNCbigpO2xldCBuO2lmKDEhPT10aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCluPXRoaXMuI1VuKCk7ZWxzZXtjb25zdCBpPVt0LGVdO249W1tpLGkuc2xpY2UoKSxpLnNsaWNlKCksaV1dfWNvbnN0IGk9dGhpcy4jYm4scj10aGlzLmN1cnJlbnRQYXRoO3RoaXMuY3VycmVudFBhdGg9W107dGhpcy4jYm49bmV3IFBhdGgyRDt0aGlzLmFkZENvbW1hbmRzKHtjbWQ6KCk9Pnt0aGlzLmFsbFJhd1BhdGhzLnB1c2gocik7dGhpcy5wYXRocy5wdXNoKG4pO3RoaXMuYmV6aWVyUGF0aDJELnB1c2goaSk7dGhpcy5yZWJ1aWxkKCl9LHVuZG86KCk9Pnt0aGlzLmFsbFJhd1BhdGhzLnBvcCgpO3RoaXMucGF0aHMucG9wKCk7dGhpcy5iZXppZXJQYXRoMkQucG9wKCk7aWYoMD09PXRoaXMucGF0aHMubGVuZ3RoKXRoaXMucmVtb3ZlKCk7ZWxzZXtpZighdGhpcy5jYW52YXMpe3RoaXMuI2tuKCk7dGhpcy4jTW4oKX10aGlzLiNUbigpfX0sbXVzdEV4ZWM6ITB9KX0jT24oKXtpZighdGhpcy4jeW4pcmV0dXJuO3RoaXMuI3luPSExO2NvbnN0IHQ9TWF0aC5jZWlsKHRoaXMudGhpY2tuZXNzKnRoaXMucGFyZW50U2NhbGUpLGU9dGhpcy5jdXJyZW50UGF0aC5zbGljZSgtMyksbj1lLm1hcCgodD0+dFswXSkpLGk9ZS5tYXAoKHQ9PnRbMV0pKSx7Y3R4OnJ9PShNYXRoLm1pbiguLi5uKSxNYXRoLm1heCguLi5uKSxNYXRoLm1pbiguLi5pKSxNYXRoLm1heCguLi5pKSx0aGlzKTtyLnNhdmUoKTtyLmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXMud2lkdGgsdGhpcy5jYW52YXMuaGVpZ2h0KTtmb3IoY29uc3QgdCBvZiB0aGlzLmJlemllclBhdGgyRClyLnN0cm9rZSh0KTtyLnN0cm9rZSh0aGlzLiNibik7ci5yZXN0b3JlKCl9I05uKHQsZSxuLGkscixzLGEpe2NvbnN0IG89KGUraSkvMixsPShuK3IpLzIsYz0oaStzKS8yLGg9KHIrYSkvMjt0LmJlemllckN1cnZlVG8obysyKihpLW8pLzMsbCsyKihyLWwpLzMsYysyKihpLWMpLzMsaCsyKihyLWgpLzMsYyxoKX0jVW4oKXtjb25zdCB0PXRoaXMuY3VycmVudFBhdGg7aWYodC5sZW5ndGg8PTIpcmV0dXJuW1t0WzBdLHRbMF0sdC5hdCgtMSksdC5hdCgtMSldXTtjb25zdCBlPVtdO2xldCBuLFtpLHJdPXRbMF07Zm9yKG49MTtuPHQubGVuZ3RoLTI7bisrKXtjb25zdFtzLGFdPXRbbl0sW28sbF09dFtuKzFdLGM9KHMrbykvMixoPShhK2wpLzIsZD1baSsyKihzLWkpLzMscisyKihhLXIpLzNdLHU9W2MrMioocy1jKS8zLGgrMiooYS1oKS8zXTtlLnB1c2goW1tpLHJdLGQsdSxbYyxoXV0pO1tpLHJdPVtjLGhdfWNvbnN0W3MsYV09dFtuXSxbbyxsXT10W24rMV0sYz1baSsyKihzLWkpLzMscisyKihhLXIpLzNdLGg9W28rMioocy1vKS8zLGwrMiooYS1sKS8zXTtlLnB1c2goW1tpLHJdLGMsaCxbbyxsXV0pO3JldHVybiBlfSNQbigpe2lmKHRoaXMuaXNFbXB0eSgpKXt0aGlzLiN6bigpO3JldHVybn10aGlzLiNJbigpO2NvbnN0e2NhbnZhczp0LGN0eDplfT10aGlzO2Uuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtlLmNsZWFyUmVjdCgwLDAsdC53aWR0aCx0LmhlaWdodCk7dGhpcy4jem4oKTtmb3IoY29uc3QgdCBvZiB0aGlzLmJlemllclBhdGgyRCllLnN0cm9rZSh0KX1jb21taXQoKXtpZighdGhpcy4jdm4pe3N1cGVyLmNvbW1pdCgpO3RoaXMuaXNFZGl0aW5nPSExO3RoaXMuZGlzYWJsZUVkaXRNb2RlKCk7dGhpcy5zZXRJbkZvcmVncm91bmQoKTt0aGlzLiN2bj0hMDt0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKCJkaXNhYmxlZCIpO3RoaXMuI1RuKCEwKTt0aGlzLm1ha2VSZXNpemFibGUoKTt0aGlzLnBhcmVudC5hZGRJbmtFZGl0b3JJZk5lZWRlZCghMCk7dGhpcy5wYXJlbnQubW92ZUVkaXRvckluRE9NKHRoaXMpO3RoaXMuZGl2LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9fWZvY3VzaW4odCl7c3VwZXIuZm9jdXNpbih0KTt0aGlzLmVuYWJsZUVkaXRNb2RlKCl9Y2FudmFzUG9pbnRlcmRvd24odCl7aWYoMD09PXQuYnV0dG9uJiZ0aGlzLmlzSW5FZGl0TW9kZSgpJiYhdGhpcy4jdm4pe3RoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7dC5wcmV2ZW50RGVmYXVsdCgpOyJtb3VzZSIhPT10LnR5cGUmJnRoaXMuZGl2LmZvY3VzKCk7dGhpcy4jRG4odC5vZmZzZXRYLHQub2Zmc2V0WSl9fWNhbnZhc0NvbnRleHRNZW51KHQpe3QucHJldmVudERlZmF1bHQoKX1jYW52YXNQb2ludGVybW92ZSh0KXt0LnByZXZlbnREZWZhdWx0KCk7dGhpcy4jTG4odC5vZmZzZXRYLHQub2Zmc2V0WSl9Y2FudmFzUG9pbnRlcnVwKHQpe3QucHJldmVudERlZmF1bHQoKTt0aGlzLiNIbih0KX1jYW52YXNQb2ludGVybGVhdmUodCl7dGhpcy4jSG4odCl9I0huKHQpe3RoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsdGhpcy4jZm4pO3RoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIix0aGlzLiNwbik7dGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIix0aGlzLiNnbik7dGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLHRoaXMuI21uKTtzZXRUaW1lb3V0KCgoKT0+e3RoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLiN1bil9KSwxMCk7dGhpcy4jam4odC5vZmZzZXRYLHQub2Zmc2V0WSk7dGhpcy5hZGRUb0Fubm90YXRpb25TdG9yYWdlKCk7dGhpcy5zZXRJbkJhY2tncm91bmQoKX0ja24oKXt0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTt0aGlzLmNhbnZhcy53aWR0aD10aGlzLmNhbnZhcy5oZWlnaHQ9MDt0aGlzLmNhbnZhcy5jbGFzc05hbWU9Imlua0VkaXRvckNhbnZhcyI7SW5rRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoImVkaXRvcl9pbmtfY2FudmFzX2FyaWFfbGFiZWwiKS50aGVuKCh0PT50aGlzLmNhbnZhcz8uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix0KSkpO3RoaXMuZGl2LmFwcGVuZCh0aGlzLmNhbnZhcyk7dGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKX0jTW4oKXt0aGlzLiNfbj1uZXcgUmVzaXplT2JzZXJ2ZXIoKHQ9Pntjb25zdCBlPXRbMF0uY29udGVudFJlY3Q7ZS53aWR0aCYmZS5oZWlnaHQmJnRoaXMuc2V0RGltZW5zaW9ucyhlLndpZHRoLGUuaGVpZ2h0KX0pKTt0aGlzLiNfbi5vYnNlcnZlKHRoaXMuZGl2KX1nZXQgaXNSZXNpemFibGUoKXtyZXR1cm4hdGhpcy5pc0VtcHR5KCkmJnRoaXMuI3ZufXJlbmRlcigpe2lmKHRoaXMuZGl2KXJldHVybiB0aGlzLmRpdjtsZXQgdCxlO2lmKHRoaXMud2lkdGgpe3Q9dGhpcy54O2U9dGhpcy55fXN1cGVyLnJlbmRlcigpO0lua0VkaXRvci5fbDEwblByb21pc2UuZ2V0KCJlZGl0b3JfaW5rMl9hcmlhX2xhYmVsIikudGhlbigodD0+dGhpcy5kaXY/LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsdCkpKTtjb25zdFtuLGkscixzXT10aGlzLiNGbigpO3RoaXMuc2V0QXQobixpLDAsMCk7dGhpcy5zZXREaW1zKHIscyk7dGhpcy4ja24oKTtpZih0aGlzLndpZHRoKXtjb25zdFtuLGldPXRoaXMucGFyZW50RGltZW5zaW9uczt0aGlzLnNldEFzcGVjdFJhdGlvKHRoaXMud2lkdGgqbix0aGlzLmhlaWdodCppKTt0aGlzLnNldEF0KHQqbixlKmksdGhpcy53aWR0aCpuLHRoaXMuaGVpZ2h0KmkpO3RoaXMuI0FuPSEwO3RoaXMuI1JuKCk7dGhpcy5zZXREaW1zKHRoaXMud2lkdGgqbix0aGlzLmhlaWdodCppKTt0aGlzLiNQbigpO3RoaXMuZGl2LmNsYXNzTGlzdC5hZGQoImRpc2FibGVkIil9ZWxzZXt0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKCJlZGl0aW5nIik7dGhpcy5lbmFibGVFZGl0TW9kZSgpfXRoaXMuI01uKCk7cmV0dXJuIHRoaXMuZGl2fSNSbigpe2lmKCF0aGlzLiNBbilyZXR1cm47Y29uc3RbdCxlXT10aGlzLnBhcmVudERpbWVuc2lvbnM7dGhpcy5jYW52YXMud2lkdGg9TWF0aC5jZWlsKHRoaXMud2lkdGgqdCk7dGhpcy5jYW52YXMuaGVpZ2h0PU1hdGguY2VpbCh0aGlzLmhlaWdodCplKTt0aGlzLiN6bigpfXNldERpbWVuc2lvbnModCxlKXtjb25zdCBuPU1hdGgucm91bmQodCksaT1NYXRoLnJvdW5kKGUpO2lmKHRoaXMuI1NuPT09biYmdGhpcy4jRW49PT1pKXJldHVybjt0aGlzLiNTbj1uO3RoaXMuI0VuPWk7dGhpcy5jYW52YXMuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIjtjb25zdFtyLHNdPXRoaXMucGFyZW50RGltZW5zaW9uczt0aGlzLndpZHRoPXQvcjt0aGlzLmhlaWdodD1lL3M7dGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO3RoaXMuI3ZuJiZ0aGlzLiNxbih0LGUpO3RoaXMuI1JuKCk7dGhpcy4jUG4oKTt0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIjt0aGlzLmZpeERpbXMoKX0jcW4odCxlKXtjb25zdCBuPXRoaXMuI1duKCksaT0odC1uKS90aGlzLiNkbixyPShlLW4pL3RoaXMuI2huO3RoaXMuc2NhbGVGYWN0b3I9TWF0aC5taW4oaSxyKX0jem4oKXtjb25zdCB0PXRoaXMuI1duKCkvMjt0aGlzLmN0eC5zZXRUcmFuc2Zvcm0odGhpcy5zY2FsZUZhY3RvciwwLDAsdGhpcy5zY2FsZUZhY3Rvcix0aGlzLnRyYW5zbGF0aW9uWCp0aGlzLnNjYWxlRmFjdG9yK3QsdGhpcy50cmFuc2xhdGlvblkqdGhpcy5zY2FsZUZhY3Rvcit0KX1zdGF0aWMjR24odCl7Y29uc3QgZT1uZXcgUGF0aDJEO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7Y29uc3RbaSxyLHMsYV09dFtuXTswPT09biYmZS5tb3ZlVG8oLi4uaSk7ZS5iZXppZXJDdXJ2ZVRvKHJbMF0sclsxXSxzWzBdLHNbMV0sYVswXSxhWzFdKX1yZXR1cm4gZX1zdGF0aWMjVm4odCxlLG4pe2NvbnN0W2kscixzLGFdPWU7c3dpdGNoKG4pe2Nhc2UgMDpmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKz0yKXt0W2VdKz1pO3RbZSsxXT1hLXRbZSsxXX1icmVhaztjYXNlIDkwOmZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTIpe2NvbnN0IG49dFtlXTt0W2VdPXRbZSsxXStpO3RbZSsxXT1uK3J9YnJlYWs7Y2FzZSAxODA6Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Mil7dFtlXT1zLXRbZV07dFtlKzFdKz1yfWJyZWFrO2Nhc2UgMjcwOmZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTIpe2NvbnN0IG49dFtlXTt0W2VdPXMtdFtlKzFdO3RbZSsxXT1hLW59YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcm90YXRpb24iKX1yZXR1cm4gdH1zdGF0aWMjJG4odCxlLG4pe2NvbnN0W2kscixzLGFdPWU7c3dpdGNoKG4pe2Nhc2UgMDpmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKz0yKXt0W2VdLT1pO3RbZSsxXT1hLXRbZSsxXX1icmVhaztjYXNlIDkwOmZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTIpe2NvbnN0IG49dFtlXTt0W2VdPXRbZSsxXS1yO3RbZSsxXT1uLWl9YnJlYWs7Y2FzZSAxODA6Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Mil7dFtlXT1zLXRbZV07dFtlKzFdLT1yfWJyZWFrO2Nhc2UgMjcwOmZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTIpe2NvbnN0IG49dFtlXTt0W2VdPWEtdFtlKzFdO3RbZSsxXT1zLW59YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcm90YXRpb24iKX1yZXR1cm4gdH0jWG4odCxlLG4saSl7Y29uc3Qgcj1bXSxzPXRoaXMudGhpY2tuZXNzLzIsYT10KmUrcyxvPXQqbitzO2Zvcihjb25zdCBlIG9mIHRoaXMucGF0aHMpe2NvbnN0IG49W10scz1bXTtmb3IobGV0IGk9MCxyPWUubGVuZ3RoO2k8cjtpKyspe2NvbnN0W2wsYyxoLGRdPWVbaV0sdT10KmxbMF0rYSxwPXQqbFsxXStvLGY9dCpjWzBdK2EsZz10KmNbMV0rbyxtPXQqaFswXSthLGI9dCpoWzFdK28sdj10KmRbMF0rYSx5PXQqZFsxXStvO2lmKDA9PT1pKXtuLnB1c2godSxwKTtzLnB1c2godSxwKX1uLnB1c2goZixnLG0sYix2LHkpO3MucHVzaChmLGcpO2k9PT1yLTEmJnMucHVzaCh2LHkpfXIucHVzaCh7YmV6aWVyOklua0VkaXRvci4jVm4obixpLHRoaXMucm90YXRpb24pLHBvaW50czpJbmtFZGl0b3IuI1ZuKHMsaSx0aGlzLnJvdGF0aW9uKX0pfXJldHVybiByfSNLbigpe2xldCB0PTEvMCxlPS0xLzAsbj0xLzAscj0tMS8wO2Zvcihjb25zdCBzIG9mIHRoaXMucGF0aHMpZm9yKGNvbnN0W2EsbyxsLGNdb2Ygcyl7Y29uc3Qgcz1pLlV0aWwuYmV6aWVyQm91bmRpbmdCb3goLi4uYSwuLi5vLC4uLmwsLi4uYyk7dD1NYXRoLm1pbih0LHNbMF0pO249TWF0aC5taW4obixzWzFdKTtlPU1hdGgubWF4KGUsc1syXSk7cj1NYXRoLm1heChyLHNbM10pfXJldHVyblt0LG4sZSxyXX0jV24oKXtyZXR1cm4gdGhpcy4jdm4/TWF0aC5jZWlsKHRoaXMudGhpY2tuZXNzKnRoaXMucGFyZW50U2NhbGUpOjB9I1RuKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm47aWYoIXRoaXMuI3ZuKXt0aGlzLiNQbigpO3JldHVybn1jb25zdCBlPXRoaXMuI0tuKCksbj10aGlzLiNXbigpO3RoaXMuI2RuPU1hdGgubWF4KHIuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSxlWzJdLWVbMF0pO3RoaXMuI2huPU1hdGgubWF4KHIuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSxlWzNdLWVbMV0pO2NvbnN0IGk9TWF0aC5jZWlsKG4rdGhpcy4jZG4qdGhpcy5zY2FsZUZhY3Rvcikscz1NYXRoLmNlaWwobit0aGlzLiNobip0aGlzLnNjYWxlRmFjdG9yKSxbYSxvXT10aGlzLnBhcmVudERpbWVuc2lvbnM7dGhpcy53aWR0aD1pL2E7dGhpcy5oZWlnaHQ9cy9vO3RoaXMuc2V0QXNwZWN0UmF0aW8oaSxzKTtjb25zdCBsPXRoaXMudHJhbnNsYXRpb25YLGM9dGhpcy50cmFuc2xhdGlvblk7dGhpcy50cmFuc2xhdGlvblg9LWVbMF07dGhpcy50cmFuc2xhdGlvblk9LWVbMV07dGhpcy4jUm4oKTt0aGlzLiNQbigpO3RoaXMuI1NuPWk7dGhpcy4jRW49czt0aGlzLnNldERpbXMoaSxzKTtjb25zdCBoPXQ/bi90aGlzLnNjYWxlRmFjdG9yLzI6MDt0aGlzLnRyYW5zbGF0ZShsLXRoaXMudHJhbnNsYXRpb25YLWgsYy10aGlzLnRyYW5zbGF0aW9uWS1oKX1zdGF0aWMgZGVzZXJpYWxpemUodCxlLG4pe2lmKHQgaW5zdGFuY2VvZiBzLklua0Fubm90YXRpb25FbGVtZW50KXJldHVybiBudWxsO2NvbnN0IGE9c3VwZXIuZGVzZXJpYWxpemUodCxlLG4pO2EudGhpY2tuZXNzPXQudGhpY2tuZXNzO2EuY29sb3I9aS5VdGlsLm1ha2VIZXhDb2xvciguLi50LmNvbG9yKTthLm9wYWNpdHk9dC5vcGFjaXR5O2NvbnN0W28sbF09YS5wYWdlRGltZW5zaW9ucyxjPWEud2lkdGgqbyxoPWEuaGVpZ2h0KmwsZD1hLnBhcmVudFNjYWxlLHU9dC50aGlja25lc3MvMjthLiN2bj0hMDthLiNTbj1NYXRoLnJvdW5kKGMpO2EuI0VuPU1hdGgucm91bmQoaCk7Y29uc3R7cGF0aHM6cCxyZWN0OmYscm90YXRpb246Z309dDtmb3IobGV0e2Jlemllcjp0fW9mIHApe3Q9SW5rRWRpdG9yLiMkbih0LGYsZyk7Y29uc3QgZT1bXTthLnBhdGhzLnB1c2goZSk7bGV0IG49ZCoodFswXS11KSxpPWQqKHRbMV0tdSk7Zm9yKGxldCByPTIscz10Lmxlbmd0aDtyPHM7cis9Nil7Y29uc3Qgcz1kKih0W3JdLXUpLGE9ZCoodFtyKzFdLXUpLG89ZCoodFtyKzJdLXUpLGw9ZCoodFtyKzNdLXUpLGM9ZCoodFtyKzRdLXUpLGg9ZCoodFtyKzVdLXUpO2UucHVzaChbW24saV0sW3MsYV0sW28sbF0sW2MsaF1dKTtuPWM7aT1ofWNvbnN0IHI9dGhpcy4jR24oZSk7YS5iZXppZXJQYXRoMkQucHVzaChyKX1jb25zdCBtPWEuI0tuKCk7YS4jZG49TWF0aC5tYXgoci5Bbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLG1bMl0tbVswXSk7YS4jaG49TWF0aC5tYXgoci5Bbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLG1bM10tbVsxXSk7YS4jcW4oYyxoKTtyZXR1cm4gYX1zZXJpYWxpemUoKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDtjb25zdCB0PXRoaXMuZ2V0UmVjdCgwLDApLGU9ci5Bbm5vdGF0aW9uRWRpdG9yLl9jb2xvck1hbmFnZXIuY29udmVydCh0aGlzLmN0eC5zdHJva2VTdHlsZSk7cmV0dXJue2Fubm90YXRpb25UeXBlOmkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LLGNvbG9yOmUsdGhpY2tuZXNzOnRoaXMudGhpY2tuZXNzLG9wYWNpdHk6dGhpcy5vcGFjaXR5LHBhdGhzOnRoaXMuI1huKHRoaXMuc2NhbGVGYWN0b3IvdGhpcy5wYXJlbnRTY2FsZSx0aGlzLnRyYW5zbGF0aW9uWCx0aGlzLnRyYW5zbGF0aW9uWSx0KSxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgscmVjdDp0LHJvdGF0aW9uOnRoaXMucm90YXRpb259fX1lLklua0VkaXRvcj1JbmtFZGl0b3J9LCh0LGUsbik9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2UuU3RhbXBFZGl0b3I9dm9pZCAwO24oMTQ4KTtuKDE1MSk7dmFyIGk9bigxNjMpLHI9bigxKSxzPW4oMTY3KSxhPW4oMTk3KTtjbGFzcyBTdGFtcEVkaXRvciBleHRlbmRzIGkuQW5ub3RhdGlvbkVkaXRvcnsjWW49bnVsbDsjSm49bnVsbDsjUW49bnVsbDsjWm49bnVsbDsjdGk9bnVsbDsjX249bnVsbDsjZWk9bnVsbDsjbmk9ITE7c3RhdGljIF90eXBlPSJzdGFtcCI7Y29uc3RydWN0b3IodCl7c3VwZXIoey4uLnQsbmFtZToic3RhbXBFZGl0b3IifSk7dGhpcy4jWm49dC5iaXRtYXBVcmx9I2lpKCl7aWYodGhpcy4jSm4pe3RoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbUlkKHRoaXMuI0puKS50aGVuKCh0PT57aWYodCl7dGhpcy4jWW49dC5iaXRtYXA7dGhpcy4ja24oKX1lbHNlIHRoaXMucmVtb3ZlKCl9KSk7cmV0dXJufWlmKHRoaXMuI1puKXtjb25zdCB0PXRoaXMuI1puO3RoaXMuI1puPW51bGw7dGhpcy4jUW49dGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tVXJsKHQpLnRoZW4oKHQ9Pnt0aGlzLiNRbj1udWxsO2lmKHQpeyh7Yml0bWFwOnRoaXMuI1luLGlkOnRoaXMuI0puLGlzU3ZnOnRoaXMuI25pfT10KTt0aGlzLiNrbigpfWVsc2UgdGhpcy5yZW1vdmUoKX0pKTtyZXR1cm59Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3QudHlwZT0iZmlsZSI7dC5hY2NlcHQ9ImltYWdlLyoiO3RoaXMuI1FuPW5ldyBQcm9taXNlKChlPT57dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLChhc3luYygpPT57dGhpcy4jUW49bnVsbDtpZih0LmZpbGVzJiYwIT09dC5maWxlcy5sZW5ndGgpe2NvbnN0IGU9YXdhaXQgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tRmlsZSh0LmZpbGVzWzBdKTtpZighZSl7dGhpcy5yZW1vdmUoKTtyZXR1cm59KHtiaXRtYXA6dGhpcy4jWW4saWQ6dGhpcy4jSm4saXNTdmc6dGhpcy4jbml9PWUpO3RoaXMuI2tuKCl9ZWxzZSB0aGlzLnJlbW92ZSgpO2UoKX0pKTt0LmFkZEV2ZW50TGlzdGVuZXIoImNhbmNlbCIsKCgpPT57dGhpcy4jUW49bnVsbDt0aGlzLnJlbW92ZSgpO2UoKX0pKX0pKTt0LmNsaWNrKCl9cmVtb3ZlKCl7aWYodGhpcy4jSm4pe3RoaXMuI1luPW51bGw7dGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5kZWxldGVJZCh0aGlzLiNKbik7dGhpcy4jdGk/LnJlbW92ZSgpO3RoaXMuI3RpPW51bGw7dGhpcy4jX24/LmRpc2Nvbm5lY3QoKTt0aGlzLiNfbj1udWxsfXN1cGVyLnJlbW92ZSgpfXJlYnVpbGQoKXtzdXBlci5yZWJ1aWxkKCk7aWYobnVsbCE9PXRoaXMuZGl2KXt0aGlzLiNKbiYmdGhpcy4jaWkoKTt0aGlzLmlzQXR0YWNoZWRUb0RPTXx8dGhpcy5wYXJlbnQuYWRkKHRoaXMpfX1vbmNlQWRkZWQoKXt0aGlzLmRpdi5kcmFnZ2FibGU9ITA7dGhpcy5wYXJlbnQuYWRkVW5kb2FibGVFZGl0b3IodGhpcyk7dGhpcy5kaXYuZm9jdXMoKX1pc0VtcHR5KCl7cmV0dXJuIG51bGw9PT10aGlzLiNRbiYmbnVsbD09PXRoaXMuI1luJiZudWxsPT09dGhpcy4jWm59Z2V0IGlzUmVzaXphYmxlKCl7cmV0dXJuITB9cmVuZGVyKCl7aWYodGhpcy5kaXYpcmV0dXJuIHRoaXMuZGl2O2xldCB0LGU7aWYodGhpcy53aWR0aCl7dD10aGlzLng7ZT10aGlzLnl9c3VwZXIucmVuZGVyKCk7aWYodGhpcy4jWW4pdGhpcy4ja24oKTtlbHNle3RoaXMuZGl2LmNsYXNzTGlzdC5hZGQoImxvYWRpbmciKTt0aGlzLiNpaSgpfWlmKHRoaXMud2lkdGgpe2NvbnN0W24saV09dGhpcy5wYXJlbnREaW1lbnNpb25zO3RoaXMuc2V0QXQodCpuLGUqaSx0aGlzLndpZHRoKm4sdGhpcy5oZWlnaHQqaSl9cmV0dXJuIHRoaXMuZGl2fSNrbigpe2NvbnN0e2Rpdjp0fT10aGlzO2xldHt3aWR0aDplLGhlaWdodDpufT10aGlzLiNZbjtjb25zdFtpLHJdPXRoaXMucGFnZURpbWVuc2lvbnMscz0uNzU7aWYodGhpcy53aWR0aCl7ZT10aGlzLndpZHRoKmk7bj10aGlzLmhlaWdodCpyfWVsc2UgaWYoZT5zKml8fG4+cypyKXtjb25zdCB0PU1hdGgubWluKHMqaS9lLHMqci9uKTtlKj10O24qPXR9Y29uc3RbYSxvXT10aGlzLnBhcmVudERpbWVuc2lvbnM7dGhpcy5zZXREaW1zKGUqYS9pLG4qby9yKTtjb25zdCBsPXRoaXMuI3RpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3QuYXBwZW5kKGwpO3RoaXMuI3JpKGUsbik7dGhpcy4jTW4oKTt0LmNsYXNzTGlzdC5yZW1vdmUoImxvYWRpbmciKX0jc2kodCxlKXtjb25zdFtuLGldPXRoaXMucGFyZW50RGltZW5zaW9uczt0aGlzLndpZHRoPXQvbjt0aGlzLmhlaWdodD1lL2k7dGhpcy5zZXREaW1zKHQsZSk7dGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO251bGwhPT10aGlzLiNlaSYmY2xlYXJUaW1lb3V0KHRoaXMuI2VpKTt0aGlzLiNlaT1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuI2VpPW51bGw7dGhpcy4jcmkodCxlKX0pLDIwMCl9I2FpKHQsZSl7Y29uc3R7d2lkdGg6bixoZWlnaHQ6aX09dGhpcy4jWW47bGV0IHI9bixzPWksYT10aGlzLiNZbjtmb3IoO3I+Mip0fHxzPjIqZTspe2NvbnN0IG49cixpPXM7cj4yKnQmJihyPXI+PTE2Mzg0P01hdGguZmxvb3Ioci8yKS0xOk1hdGguY2VpbChyLzIpKTtzPjIqZSYmKHM9cz49MTYzODQ/TWF0aC5mbG9vcihzLzIpLTE6TWF0aC5jZWlsKHMvMikpO2NvbnN0IG89bmV3IE9mZnNjcmVlbkNhbnZhcyhyLHMpO28uZ2V0Q29udGV4dCgiMmQiKS5kcmF3SW1hZ2UoYSwwLDAsbixpLDAsMCxyLHMpO2E9by50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKX1yZXR1cm4gYX0jcmkodCxlKXtjb25zdCBuPXRoaXMuI3RpO2lmKCFufHxuLndpZHRoPT09dCYmbi5oZWlnaHQ9PT1lKXJldHVybjtuLndpZHRoPXQ7bi5oZWlnaHQ9ZTtjb25zdCBpPXRoaXMuI25pP3RoaXMuI1luOnRoaXMuI2FpKHQsZSkscj1uLmdldENvbnRleHQoIjJkIik7ci5maWx0ZXI9dGhpcy5fdWlNYW5hZ2VyLmhjbUZpbHRlcjtyLmRyYXdJbWFnZShpLDAsMCxpLndpZHRoLGkuaGVpZ2h0LDAsMCx0LGUpfSNvaSh0KXtpZih0KXtpZih0aGlzLiNuaSl7Y29uc3QgdD10aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmdldFN2Z1VybCh0aGlzLiNKbik7aWYodClyZXR1cm4gdH1jb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOyh7d2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9PXRoaXMuI1luKTt0LmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKHRoaXMuI1luLDAsMCk7cmV0dXJuIHQudG9EYXRhVVJMKCl9aWYodGhpcy4jbmkpe2NvbnN0W3QsZV09dGhpcy5wYWdlRGltZW5zaW9ucyxuPU1hdGgucm91bmQodGhpcy53aWR0aCp0KnMuUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTKSxpPU1hdGgucm91bmQodGhpcy5oZWlnaHQqZSpzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUykscj1uZXcgT2Zmc2NyZWVuQ2FudmFzKG4saSk7ci5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZSh0aGlzLiNZbiwwLDAsdGhpcy4jWW4ud2lkdGgsdGhpcy4jWW4uaGVpZ2h0LDAsMCxuLGkpO3JldHVybiByLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpfXJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy4jWW4pfSNNbigpe3RoaXMuI19uPW5ldyBSZXNpemVPYnNlcnZlcigodD0+e2NvbnN0IGU9dFswXS5jb250ZW50UmVjdDtlLndpZHRoJiZlLmhlaWdodCYmdGhpcy4jc2koZS53aWR0aCxlLmhlaWdodCl9KSk7dGhpcy4jX24ub2JzZXJ2ZSh0aGlzLmRpdil9c3RhdGljIGRlc2VyaWFsaXplKHQsZSxuKXtpZih0IGluc3RhbmNlb2YgYS5TdGFtcEFubm90YXRpb25FbGVtZW50KXJldHVybiBudWxsO2NvbnN0IGk9c3VwZXIuZGVzZXJpYWxpemUodCxlLG4pLHtyZWN0OnIsYml0bWFwVXJsOnMsYml0bWFwSWQ6byxpc1N2ZzpsfT10O28mJm4uaW1hZ2VNYW5hZ2VyLmlzVmFsaWRJZChvKT9pLiNKbj1vOmkuI1puPXM7aS4jbmk9bDtjb25zdFtjLGhdPWkucGFnZURpbWVuc2lvbnM7aS53aWR0aD0oclsyXS1yWzBdKS9jO2kuaGVpZ2h0PShyWzNdLXJbMV0pL2g7cmV0dXJuIGl9c2VyaWFsaXplKCl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXSxlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO2NvbnN0IG49e2Fubm90YXRpb25UeXBlOnIuQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVAsYml0bWFwSWQ6dGhpcy4jSm4scGFnZUluZGV4OnRoaXMucGFnZUluZGV4LHJlY3Q6dGhpcy5nZXRSZWN0KDAsMCkscm90YXRpb246dGhpcy5yb3RhdGlvbixpc1N2Zzp0aGlzLiNuaX07aWYodCl7bi5iaXRtYXBVcmw9dGhpcy4jb2koITApO3JldHVybiBufWlmKG51bGw9PT1lKXJldHVybiBuO2Uuc3RhbXBzfHw9bmV3IE1hcDtjb25zdCBpPXRoaXMuI25pPyhuLnJlY3RbMl0tbi5yZWN0WzBdKSoobi5yZWN0WzNdLW4ucmVjdFsxXSk6bnVsbDtpZihlLnN0YW1wcy5oYXModGhpcy4jSm4pKXtpZih0aGlzLiNuaSl7Y29uc3QgdD1lLnN0YW1wcy5nZXQodGhpcy4jSm4pO2lmKGk+dC5hcmVhKXt0LmFyZWE9aTt0LnNlcmlhbGl6ZWQuYml0bWFwLmNsb3NlKCk7dC5zZXJpYWxpemVkLmJpdG1hcD10aGlzLiNvaSghMSl9fX1lbHNle2Uuc3RhbXBzLnNldCh0aGlzLiNKbix7YXJlYTppLHNlcmlhbGl6ZWQ6bn0pO24uYml0bWFwPXRoaXMuI29pKCExKX1yZXR1cm4gbn19ZS5TdGFtcEVkaXRvcj1TdGFtcEVkaXRvcn1dLF9fd2VicGFja19tb2R1bGVfY2FjaGVfXz17fTtmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKHQpe3ZhciBlPV9fd2VicGFja19tb2R1bGVfY2FjaGVfX1t0XTtpZih2b2lkIDAhPT1lKXJldHVybiBlLmV4cG9ydHM7dmFyIG49X193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW3RdPXtleHBvcnRzOnt9fTtfX3dlYnBhY2tfbW9kdWxlc19fW3RdLmNhbGwobi5leHBvcnRzLG4sbi5leHBvcnRzLF9fd19wZGZqc19yZXF1aXJlX18pO3JldHVybiBuLmV4cG9ydHN9dmFyIF9fd2VicGFja19leHBvcnRzX189e307KCgpPT57InVzZSBzdHJpY3QiO3ZhciB0PV9fd2VicGFja19leHBvcnRzX187T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJBYm9ydEV4Y2VwdGlvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuQWJvcnRFeGNlcHRpb259fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIkFubm90YXRpb25FZGl0b3JMYXllciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHMuQW5ub3RhdGlvbkVkaXRvckxheWVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGV9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIkFubm90YXRpb25FZGl0b3JUeXBlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5Bbm5vdGF0aW9uRWRpdG9yVHlwZX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiQW5ub3RhdGlvbkxheWVyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5Bbm5vdGF0aW9uTGF5ZXJ9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIkFubm90YXRpb25Nb2RlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5Bbm5vdGF0aW9uTW9kZX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiQ01hcENvbXByZXNzaW9uVHlwZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuQ01hcENvbXByZXNzaW9uVHlwZX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiRmVhdHVyZVRlc3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLkZlYXR1cmVUZXN0fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJHbG9iYWxXb3JrZXJPcHRpb25zIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5HbG9iYWxXb3JrZXJPcHRpb25zfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJJbWFnZUtpbmQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLkltYWdlS2luZH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiSW52YWxpZFBERkV4Y2VwdGlvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuSW52YWxpZFBERkV4Y2VwdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiTWlzc2luZ1BERkV4Y2VwdGlvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuTWlzc2luZ1BERkV4Y2VwdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiT1BTIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5PUFN9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlBERkRhdGFSYW5nZVRyYW5zcG9ydCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uUERGRGF0YVJhbmdlVHJhbnNwb3J0fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJQREZEYXRlU3RyaW5nIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5QREZEYXRlU3RyaW5nfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJQREZXb3JrZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuLlBERldvcmtlcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiUGFzc3dvcmRSZXNwb25zZXMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLlBhc3N3b3JkUmVzcG9uc2VzfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJQZXJtaXNzaW9uRmxhZyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuUGVybWlzc2lvbkZsYWd9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlBpeGVsc1BlckluY2giLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLlBpeGVsc1BlckluY2h9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlByb21pc2VDYXBhYmlsaXR5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5Qcm9taXNlQ2FwYWJpbGl0eX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb259fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlNWR0dyYXBoaWNzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5TVkdHcmFwaGljc319KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb259fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlV0aWwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLlV0aWx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIlZlcmJvc2l0eUxldmVsIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5WZXJib3NpdHlMZXZlbH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiWGZhTGF5ZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLlhmYUxheWVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJidWlsZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uYnVpbGR9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImdldERvY3VtZW50Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXREb2N1bWVudH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiZ2V0RmlsZW5hbWVGcm9tVXJsIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXRGaWxlbmFtZUZyb21Vcmx9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImdldFBkZkZpbGVuYW1lRnJvbVVybCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkuZ2V0UGRmRmlsZW5hbWVGcm9tVXJsfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJnZXRYZmFQYWdlVmlld3BvcnQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLmdldFhmYVBhZ2VWaWV3cG9ydH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiaXNEYXRhU2NoZW1lIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5pc0RhdGFTY2hlbWV9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImlzUGRmRmlsZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkuaXNQZGZGaWxlfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJsb2FkU2NyaXB0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5sb2FkU2NyaXB0fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJub3JtYWxpemVVbmljb2RlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5ub3JtYWxpemVVbmljb2RlfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJyZW5kZXJUZXh0TGF5ZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLnJlbmRlclRleHRMYXllcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwic2V0TGF5ZXJEaW1lbnNpb25zIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5zZXRMYXllckRpbWVuc2lvbnN9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInNoYWRvdyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuc2hhZG93fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJ1cGRhdGVUZXh0TGF5ZXIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLnVwZGF0ZVRleHRMYXllcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwidmVyc2lvbiIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4udmVyc2lvbn19KTt2YXIgZT1fX3dfcGRmanNfcmVxdWlyZV9fKDEpLG49X193X3BkZmpzX3JlcXVpcmVfXygxMjQpLGk9X193X3BkZmpzX3JlcXVpcmVfXygxNjcpLHI9X193X3BkZmpzX3JlcXVpcmVfXygxOTQpLHM9X193X3BkZmpzX3JlcXVpcmVfXygxOTUpLGE9X193X3BkZmpzX3JlcXVpcmVfXygxNjQpLG89X193X3BkZmpzX3JlcXVpcmVfXygxOTcpLGw9X193X3BkZmpzX3JlcXVpcmVfXygxNzUpLGM9X193X3BkZmpzX3JlcXVpcmVfXygyMDApfSkoKTtyZXR1cm4gX193ZWJwYWNrX2V4cG9ydHNfX30pKCkpKTs='; \ No newline at end of file +export const pdfLibJsStr = 'KCgpPT57InVzZSBzdHJpY3QiO3ZhciBfX3dlYnBhY2tfbW9kdWxlc19fPSh7Ii4vcGRmLmpzIjooKG1vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19nbG9iYWxfdGhpc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19nbG9iYWxfdGhpc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19nbG9iYWxfdGhpc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3N0YXJ0c193aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3N0YXJ0c193aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19zdGFydHNfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2V4ZWNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2V4ZWNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2V4ZWNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19tYXRjaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19tYXRjaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfbWF0Y2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fY29sbGVjdGlvbnNfaXRlcmF0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fY29sbGVjdGlvbnNfaXRlcmF0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9jb2xsZWN0aW9uc19pdGVyYXRvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL3dlYi51cmwuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzZfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfZGVsZXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuZGVsZXRlLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfdXJsX3NlYXJjaF9wYXJhbXNfZGVsZXRlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV83X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19kZWxldGVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19oYXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuaGFzLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5oYXMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl91cmxfc2VhcmNoX3BhcmFtc19oYXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzhfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX2hhc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfOF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3VybF9zZWFyY2hfcGFyYW1zX3NpemVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF90b19zdHJpbmdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEwX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfdG9fc3RyaW5nX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfdG9fc3RyaW5nX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfYnVmZmVyX3NsaWNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci5zbGljZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2J1ZmZlcl9zbGljZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfYnVmZmVyX3NsaWNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdWludDhfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3VpbnQ4X2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xMl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV91aW50OF9hcnJheV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTJfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2F0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xM19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmF0LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmF0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9hdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTNfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfYXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzEzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmlsbC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmlsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfZmlsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTRfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWxhc3QuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTVfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWxhc3QtaW5kZXguanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9maW5kX2xhc3RfaW5kZXhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTZfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NldF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zZXQuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc2V0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zZXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NldF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3NvcnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5zb3J0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zb3J0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9zb3J0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xOF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fbG9jYWxlX3N0cmluZ19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMTlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLWxvY2FsZS1zdHJpbmcuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX2xvY2FsZV9zdHJpbmdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX2xvY2FsZV9zdHJpbmdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzE5X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV90b19yZXZlcnNlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fcmV2ZXJzZWRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIwX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3JldmVyc2VkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXNvcnRlZC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3RvX3NvcnRlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdG9fc29ydGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yMV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS53aXRoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LndpdGguanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfcmVwbGFjZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3JlcGxhY2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzIzX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19yZXBsYWNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yM19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3JlcGxhY2VfYWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLWFsbC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS1hbGwuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19yZXBsYWNlX2FsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3JlcGxhY2VfYWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfcHVzaF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3B1c2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3B1c2hfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI1X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19lcnJvcl9jYXVzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfZXJyb3JfY2F1c2VfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2Vycm9yX2NhdXNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yNl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdWludDMyX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yN19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50MzItYXJyYXkuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3VpbnQzMl9hcnJheV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjdfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfdWludDMyX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yN19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfaW5jbHVkZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5jbHVkZXMuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2luY2x1ZGVzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yOF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9pbmNsdWRlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjhfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19pbmNsdWRlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfaW5jbHVkZXNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzI5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19pbmNsdWRlc19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMjlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3dlYWtfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc193ZWFrX21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfd2Vha19tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMwX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wcm9taXNlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzFfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9zZWxmX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zMl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfc2VsZl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfd2ViX3NlbGZfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfc3BsaXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3NwbGl0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zM19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfc3BsaXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzMzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zeW1ib2xfZGVzY3JpcHRpb25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3ltYm9sX2Rlc2NyaXB0aW9uX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zeW1ib2xfZGVzY3JpcHRpb25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19vYmplY3RfaGFzX293bl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaGFzLW93bi5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaGFzLW93bi5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfb2JqZWN0X2hhc19vd25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX29iamVjdF9oYXNfb3duX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX3Rlc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM2X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF90ZXN0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zNl9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfdGVzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzZfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZmxlY3RfdG9fc3RyaW5nX3RhZ19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC50by1zdHJpbmctdGFnLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWZsZWN0X3RvX3N0cmluZ190YWdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3JlZmxlY3RfdG9fc3RyaW5nX3RhZ19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzhfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1sYXN0LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9maW5kX2xhc3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM4X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzhfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2J1ZmZlcl9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuY29uc3RydWN0b3IuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmNvbnN0cnVjdG9yLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9idWZmZXJfY29uc3RydWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzM5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2J1ZmZlcl9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMzlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QtaW5kZXguanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9maW5kX2xhc3RfaW5kZXhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQwX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZpbmRfbGFzdF9pbmRleF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDBfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X3VpbnQ4X2NsYW1wZWRfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQxX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1jbGFtcGVkLWFycmF5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV91aW50OF9jbGFtcGVkX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80MV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV91aW50OF9jbGFtcGVkX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80MV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfc29ydF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDJfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3NvcnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQyX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3NvcnRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV93aXRoX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80M19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LndpdGguanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkud2l0aC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDNfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ludDhfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50OC1hcnJheS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQ4LWFycmF5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9pbnQ4X2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80NF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9pbnQ4X2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80NF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfb2JqZWN0X2Fzc2lnbl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX29iamVjdF9hc3NpZ25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX29iamVjdF9hc3NpZ25fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ1X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9leGNlcHRpb25fY29uc3RydWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX3dlYl9kb21fZXhjZXB0aW9uX2NvbnN0cnVjdG9yX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80Nl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX2RvbV9leGNlcHRpb25fc3RhY2tfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ3X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24uc3RhY2suanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24uc3RhY2suanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fZXhjZXB0aW9uX3N0YWNrX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80N19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl9zdGFja19qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDdfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9kb21fZXhjZXB0aW9uX3RvX3N0cmluZ190YWdfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ4X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24udG8tc3RyaW5nLXRhZy5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi50by1zdHJpbmctdGFnLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl90b19zdHJpbmdfdGFnX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfZG9tX2V4Y2VwdGlvbl90b19zdHJpbmdfdGFnX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfd2ViX3N0cnVjdHVyZWRfY2xvbmVfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzQ5X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvd2ViLnN0cnVjdHVyZWQtY2xvbmUuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnN0cnVjdHVyZWQtY2xvbmUuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX3dlYl9zdHJ1Y3R1cmVkX2Nsb25lX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80OV9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc193ZWJfc3RydWN0dXJlZF9jbG9uZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNDlfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3Byb21pc2VfZmluYWxseV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wcm9taXNlX2ZpbmFsbHlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUwX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3Byb21pc2VfZmluYWxseV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTBfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTFfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfY29uc3RydWN0b3JfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUxX19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF9jb25zdHJ1Y3Rvcl9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTFfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3JlZ2V4cF9kb3RfYWxsX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81Ml9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfZG90X2FsbF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTJfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2RvdF9hbGxfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUyX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfZmxhZ3NfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmZsYWdzLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcmVnZXhwX2ZsYWdzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81M19fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19yZWdleHBfZmxhZ3NfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzUzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19qc29uX3N0cmluZ2lmeV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfanNvbl9zdHJpbmdpZnlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU0X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2pzb25fc3RyaW5naWZ5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81NF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfbnVtYmVyX3RvX2ZpeGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81NV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci50by1maXhlZC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX251bWJlcl90b19maXhlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTVfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfbnVtYmVyX3RvX2ZpeGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81NV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX2VuZHNfd2l0aF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTZfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuZW5kcy13aXRoLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5lbmRzLXdpdGguanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19lbmRzX3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU2X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19lbmRzX3dpdGhfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU2X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wYXJzZV9mbG9hdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcGFyc2VfZmxvYXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3BhcnNlX2Zsb2F0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81N19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfbWF0aF9oeXBvdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNThfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5tYXRoLmh5cG90LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX21hdGhfaHlwb3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU4X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX21hdGhfaHlwb3RfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU4X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9hdF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNTlfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5hdC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5hdC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfYXRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzU5X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2F0X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81OV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX2F0X2FsdGVybmF0aXZlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hdC1hbHRlcm5hdGl2ZS5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuYXQtYWx0ZXJuYXRpdmUuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ19hdF9hbHRlcm5hdGl2ZV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjBfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX2F0X2FsdGVybmF0aXZlX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcGFyc2VfaW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnBhcnNlLWludC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1pbnQuanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3BhcnNlX2ludF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjFfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcGFyc2VfaW50X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82MV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfc3RyaW5nX3RyaW1fanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzYyX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISBjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanNcIik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ190cmltX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82Ml9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfdHJpbV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjJfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3R5cGVkX2FycmF5X2ludDMyX2FycmF5X2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82M19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDMyLWFycmF5LmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDMyLWFycmF5LmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc190eXBlZF9hcnJheV9pbnQzMl9hcnJheV9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjNfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfdHlwZWRfYXJyYXlfaW50MzJfYXJyYXlfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzYzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19wcm9taXNlX2FsbF9zZXR0bGVkX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82NF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuYWxsLXNldHRsZWQuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwtc2V0dGxlZC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9hbGxfc2V0dGxlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjRfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfcHJvbWlzZV9hbGxfc2V0dGxlZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjRfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ190cmltX2VuZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS1lbmQuanMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19zdHJpbmdfdHJpbV9lbmRfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY1X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX3N0cmluZ190cmltX2VuZF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjVfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X2ZsYXRfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82Nl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzXCIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV9mbGF0X21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjZfX19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubihjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfZmxhdF9tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY2X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGNvcmVfanNfbW9kdWxlc19lc19hcnJheV91bnNjb3BhYmxlc19mbGF0X21hcF9qc19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNjdfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qc1wiKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBjb3JlX2pzX21vZHVsZXNfZXNfYXJyYXlfdW5zY29wYWJsZXNfZmxhdF9tYXBfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzY3X19fZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY29yZV9qc19tb2R1bGVzX2VzX2FycmF5X3Vuc2NvcGFibGVzX2ZsYXRfbWFwX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV82N19fKTtcbi8qIG1vZHVsZSBkZWNvcmF0b3IgKi8gbW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXy5obWQobW9kdWxlKTtcbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZERlc3RydWN0dXJlU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7IHZhciBkZXNjcmlwdG9yID0gX2NsYXNzRXh0cmFjdEZpZWxkRGVzY3JpcHRvcihyZWNlaXZlciwgcHJpdmF0ZU1hcCwgXCJzZXRcIik7IHJldHVybiBfY2xhc3NBcHBseURlc2NyaXB0b3JEZXN0cnVjdHVyZVNldChyZWNlaXZlciwgZGVzY3JpcHRvcik7IH1cbmZ1bmN0aW9uIF9jbGFzc0FwcGx5RGVzY3JpcHRvckRlc3RydWN0dXJlU2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7IGlmIChkZXNjcmlwdG9yLnNldCkgeyBpZiAoIShcIl9fZGVzdHJPYmpcIiBpbiBkZXNjcmlwdG9yKSkgeyBkZXNjcmlwdG9yLl9fZGVzdHJPYmogPSB7IHNldCB2YWx1ZSh2KSB7IGRlc2NyaXB0b3Iuc2V0LmNhbGwocmVjZWl2ZXIsIHYpOyB9IH07IH0gcmV0dXJuIGRlc2NyaXB0b3IuX19kZXN0ck9iajsgfSBlbHNlIHsgaWYgKCFkZXNjcmlwdG9yLndyaXRhYmxlKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHJlYWQgb25seSBwcml2YXRlIGZpZWxkXCIpOyB9IHJldHVybiBkZXNjcmlwdG9yOyB9IH1cbmZ1bmN0aW9uIF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIG1ldGhvZCkgeyBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNBY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpOyByZXR1cm4gbWV0aG9kOyB9XG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsga2V5ID0gX3RvUHJvcGVydHlLZXkoa2V5KTsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpIHsgdmFyIGtleSA9IF90b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpOyByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleSA6IFN0cmluZyhrZXkpOyB9XG5mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHsgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJvYmplY3RcIiB8fCBpbnB1dCA9PT0gbnVsbCkgcmV0dXJuIGlucHV0OyB2YXIgcHJpbSA9IGlucHV0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7IGlmICh0eXBlb2YgcmVzICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmVzOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7IH1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyhvYmosIHByaXZhdGVTZXQpIHsgX2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlU2V0KTsgcHJpdmF0ZVNldC5hZGQob2JqKTsgfVxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldChyZWNlaXZlciwgcHJpdmF0ZVNldCwgZm4pIHsgaWYgKCFwcml2YXRlU2V0LmhhcyhyZWNlaXZlcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7IH0gcmV0dXJuIGZuOyB9XG5mdW5jdGlvbiBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjU2V0KHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yLCBkZXNjcmlwdG9yLCB2YWx1ZSkgeyBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNBY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpOyBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNGaWVsZERlc2NyaXB0b3IoZGVzY3JpcHRvciwgXCJzZXRcIik7IF9jbGFzc0FwcGx5RGVzY3JpcHRvclNldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpOyByZXR1cm4gdmFsdWU7IH1cbmZ1bmN0aW9uIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIGRlc2NyaXB0b3IpIHsgX2NsYXNzQ2hlY2tQcml2YXRlU3RhdGljQWNjZXNzKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yKTsgX2NsYXNzQ2hlY2tQcml2YXRlU3RhdGljRmllbGREZXNjcmlwdG9yKGRlc2NyaXB0b3IsIFwiZ2V0XCIpOyByZXR1cm4gX2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yKTsgfVxuZnVuY3Rpb24gX2NsYXNzQ2hlY2tQcml2YXRlU3RhdGljRmllbGREZXNjcmlwdG9yKGRlc2NyaXB0b3IsIGFjdGlvbikgeyBpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gXCIgKyBhY3Rpb24gKyBcIiBwcml2YXRlIHN0YXRpYyBmaWVsZCBiZWZvcmUgaXRzIGRlY2xhcmF0aW9uXCIpOyB9IH1cbmZ1bmN0aW9uIF9jbGFzc0NoZWNrUHJpdmF0ZVN0YXRpY0FjY2VzcyhyZWNlaXZlciwgY2xhc3NDb25zdHJ1Y3RvcikgeyBpZiAocmVjZWl2ZXIgIT09IGNsYXNzQ29uc3RydWN0b3IpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgc3RhdGljIGFjY2VzcyBvZiB3cm9uZyBwcm92ZW5hbmNlXCIpOyB9IH1cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKG9iaiwgcHJpdmF0ZU1hcCwgdmFsdWUpIHsgX2NoZWNrUHJpdmF0ZVJlZGVjbGFyYXRpb24ob2JqLCBwcml2YXRlTWFwKTsgcHJpdmF0ZU1hcC5zZXQob2JqLCB2YWx1ZSk7IH1cbmZ1bmN0aW9uIF9jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uKG9iaiwgcHJpdmF0ZUNvbGxlY3Rpb24pIHsgaWYgKHByaXZhdGVDb2xsZWN0aW9uLmhhcyhvYmopKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdFwiKTsgfSB9XG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHsgdmFyIGRlc2NyaXB0b3IgPSBfY2xhc3NFeHRyYWN0RmllbGREZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBcImdldFwiKTsgcmV0dXJuIF9jbGFzc0FwcGx5RGVzY3JpcHRvckdldChyZWNlaXZlciwgZGVzY3JpcHRvcik7IH1cbmZ1bmN0aW9uIF9jbGFzc0FwcGx5RGVzY3JpcHRvckdldChyZWNlaXZlciwgZGVzY3JpcHRvcikgeyBpZiAoZGVzY3JpcHRvci5nZXQpIHsgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0LmNhbGwocmVjZWl2ZXIpOyB9IHJldHVybiBkZXNjcmlwdG9yLnZhbHVlOyB9XG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7IHZhciBkZXNjcmlwdG9yID0gX2NsYXNzRXh0cmFjdEZpZWxkRGVzY3JpcHRvcihyZWNlaXZlciwgcHJpdmF0ZU1hcCwgXCJzZXRcIik7IF9jbGFzc0FwcGx5RGVzY3JpcHRvclNldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpOyByZXR1cm4gdmFsdWU7IH1cbmZ1bmN0aW9uIF9jbGFzc0V4dHJhY3RGaWVsZERlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsIGFjdGlvbikgeyBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIFwiICsgYWN0aW9uICsgXCIgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7IH0gcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTsgfVxuZnVuY3Rpb24gX2NsYXNzQXBwbHlEZXNjcmlwdG9yU2V0KHJlY2VpdmVyLCBkZXNjcmlwdG9yLCB2YWx1ZSkgeyBpZiAoZGVzY3JpcHRvci5zZXQpIHsgZGVzY3JpcHRvci5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpOyB9IGVsc2UgeyBpZiAoIWRlc2NyaXB0b3Iud3JpdGFibGUpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcmVhZCBvbmx5IHByaXZhdGUgZmllbGRcIik7IH0gZGVzY3JpcHRvci52YWx1ZSA9IHZhbHVlOyB9IH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4hZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24odCwgZSkge1xuICBcIm9iamVjdFwiID09IHR5cGVvZiBleHBvcnRzICYmIFwib2JqZWN0XCIgPT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzID0gZSgpIDogXCJmdW5jdGlvblwiID09IHR5cGVvZiBkZWZpbmUgJiYgX193ZWJwYWNrX3JlcXVpcmVfXy5hbWRPID8gZGVmaW5lKFwicGRmanMtZGlzdC9idWlsZC9wZGZcIiwgW10sIGUpIDogXCJvYmplY3RcIiA9PSB0eXBlb2YgZXhwb3J0cyA/IGV4cG9ydHNbXCJwZGZqcy1kaXN0L2J1aWxkL3BkZlwiXSA9IGUoKSA6IHRbXCJwZGZqcy1kaXN0L2J1aWxkL3BkZlwiXSA9IHQucGRmanNMaWIgPSBlKCk7XG59KGdsb2JhbFRoaXMsICgpID0+ICgoKSA9PiB7XG4gIHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gWywgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX3Q7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuVmVyYm9zaXR5TGV2ZWwgPSBlLlV0aWwgPSBlLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IGUuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gZS5UZXh0UmVuZGVyaW5nTW9kZSA9IGUuUmVuZGVyaW5nSW50ZW50RmxhZyA9IGUuUHJvbWlzZUNhcGFiaWxpdHkgPSBlLlBlcm1pc3Npb25GbGFnID0gZS5QYXNzd29yZFJlc3BvbnNlcyA9IGUuUGFzc3dvcmRFeGNlcHRpb24gPSBlLlBhZ2VBY3Rpb25FdmVudFR5cGUgPSBlLk9QUyA9IGUuTWlzc2luZ1BERkV4Y2VwdGlvbiA9IGUuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUgPSBlLkxJTkVfRkFDVE9SID0gZS5MSU5FX0RFU0NFTlRfRkFDVE9SID0gZS5JbnZhbGlkUERGRXhjZXB0aW9uID0gZS5JbWFnZUtpbmQgPSBlLklERU5USVRZX01BVFJJWCA9IGUuRm9ybWF0RXJyb3IgPSBlLkZlYXR1cmVUZXN0ID0gZS5GT05UX0lERU5USVRZX01BVFJJWCA9IGUuRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUgPSBlLkNNYXBDb21wcmVzc2lvblR5cGUgPSBlLkJhc2VFeGNlcHRpb24gPSBlLkJBU0VMSU5FX0ZBQ1RPUiA9IGUuQW5ub3RhdGlvblR5cGUgPSBlLkFubm90YXRpb25SZXBseVR5cGUgPSBlLkFubm90YXRpb25Nb2RlID0gZS5Bbm5vdGF0aW9uRmxhZyA9IGUuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IGUuQW5ub3RhdGlvbkVkaXRvclR5cGUgPSBlLkFubm90YXRpb25FZGl0b3JQcmVmaXggPSBlLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlID0gZS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gZS5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlID0gZS5BYm9ydEV4Y2VwdGlvbiA9IHZvaWQgMDtcbiAgICAgIGUuYXNzZXJ0ID0gZnVuY3Rpb24gYXNzZXJ0KHQsIGUpIHtcbiAgICAgICAgdCB8fCB1bnJlYWNoYWJsZShlKTtcbiAgICAgIH07XG4gICAgICBlLmJ5dGVzVG9TdHJpbmcgPSBieXRlc1RvU3RyaW5nO1xuICAgICAgZS5jcmVhdGVWYWxpZEFic29sdXRlVXJsID0gZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh0KSB7XG4gICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsLFxuICAgICAgICAgIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICAgIGlmICghdCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKG4gJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkge1xuICAgICAgICAgICAgaWYgKG4uYWRkRGVmYXVsdFByb3RvY29sICYmIHQuc3RhcnRzV2l0aChcInd3dy5cIikpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IHQubWF0Y2goL1xcLi9nKTtcbiAgICAgICAgICAgICAgKGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5sZW5ndGgpID49IDIgJiYgKHQgPSBcImh0dHA6Ly9cIi5jb25jYXQodCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4udHJ5Q29udmVydEVuY29kaW5nKSB0cnkge1xuICAgICAgICAgICAgICB0ID0gc3RyaW5nVG9VVEY4U3RyaW5nKHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX3VudXNlZCkge31cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaSA9IGUgPyBuZXcgVVJMKHQsIGUpIDogbmV3IFVSTCh0KTtcbiAgICAgICAgICBpZiAoZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5wcm90b2NvbCkge1xuICAgICAgICAgICAgICBjYXNlIFwiaHR0cDpcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImh0dHBzOlwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZnRwOlwiOlxuICAgICAgICAgICAgICBjYXNlIFwibWFpbHRvOlwiOlxuICAgICAgICAgICAgICBjYXNlIFwidGVsOlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfShpKSkgcmV0dXJuIGk7XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQyKSB7fVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICBlLmdldE1vZGlmaWNhdGlvbkRhdGUgPSBmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKCkge1xuICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogbmV3IERhdGUoKTtcbiAgICAgICAgcmV0dXJuIFt0LmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwgKHQuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCB0LmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgdC5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCB0LmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgdC5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIildLmpvaW4oXCJcIik7XG4gICAgICB9O1xuICAgICAgZS5nZXRVdWlkID0gZnVuY3Rpb24gZ2V0VXVpZCgpIHtcbiAgICAgICAgdmFyIF9jcnlwdG8sIF9jcnlwdG8yO1xuICAgICAgICBpZiAoXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgY3J5cHRvICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgKChfY3J5cHRvID0gY3J5cHRvKSA9PT0gbnVsbCB8fCBfY3J5cHRvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY3J5cHRvLnJhbmRvbVVVSUQpKSByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGNyeXB0byAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mICgoX2NyeXB0bzIgPSBjcnlwdG8pID09PSBudWxsIHx8IF9jcnlwdG8yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY3J5cHRvMi5nZXRSYW5kb21WYWx1ZXMpKSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpO2Vsc2UgZm9yIChsZXQgZSA9IDA7IGUgPCAzMjsgZSsrKSB0W2VdID0gTWF0aC5mbG9vcigyNTUgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcodCk7XG4gICAgICB9O1xuICAgICAgZS5nZXRWZXJib3NpdHlMZXZlbCA9IGZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkge1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH07XG4gICAgICBlLmluZm8gPSBmdW5jdGlvbiBpbmZvKHQpIHtcbiAgICAgICAgcyA+PSByLklORk9TICYmIGNvbnNvbGUubG9nKFwiSW5mbzogXCIuY29uY2F0KHQpKTtcbiAgICAgIH07XG4gICAgICBlLmlzQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHQpIHtcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgdm9pZCAwICE9PSAodCA9PT0gbnVsbCB8fCB0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0LmJ5dGVMZW5ndGgpO1xuICAgICAgfTtcbiAgICAgIGUuaXNBcnJheUVxdWFsID0gZnVuY3Rpb24gaXNBcnJheUVxdWFsKHQsIGUpIHtcbiAgICAgICAgaWYgKHQubGVuZ3RoICE9PSBlLmxlbmd0aCkgcmV0dXJuICExO1xuICAgICAgICBmb3IgKGxldCBuID0gMCwgaSA9IHQubGVuZ3RoOyBuIDwgaTsgbisrKSBpZiAodFtuXSAhPT0gZVtuXSkgcmV0dXJuICExO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9O1xuICAgICAgZS5pc05vZGVKUyA9IHZvaWQgMDtcbiAgICAgIGUubm9ybWFsaXplVW5pY29kZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaWNvZGUodCkge1xuICAgICAgICBpZiAoIWMpIHtcbiAgICAgICAgICBjID0gLyhbXFx4QTBcXHhCNVxcdTAzN0VcXHUwRUIzXFx1MjAwMC1cXHUyMDBBXFx1MjAyRlxcdTIxMjZcXHVGQjAwLVxcdUZCMDRcXHVGQjA2XFx1RkIyMC1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQTFcXHVGQkE0LVxcdUZCQTlcXHVGQkFFLVxcdUZCQjFcXHVGQkQzLVxcdUZCRENcXHVGQkRFLVxcdUZCRTdcXHVGQkVBLVxcdUZCRjhcXHVGQkZDXFx1RkJGRFxcdUZDMDAtXFx1RkM1RFxcdUZDNjQtXFx1RkNGMVxcdUZDRjUtXFx1RkQzRFxcdUZEODhcXHVGREY0XFx1RkRGQVxcdUZERkJcXHVGRTcxXFx1RkU3N1xcdUZFNzlcXHVGRTdCXFx1RkU3RF0rKXwoXFx1RkIwNSspL2c7XG4gICAgICAgICAgaCA9IG5ldyBNYXAoW1tcIu+shVwiLCBcIsW/dFwiXV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0LnJlcGxhY2VBbGwoYywgKHQsIGUsIG4pID0+IGUgPyBlLm5vcm1hbGl6ZShcIk5GS0NcIikgOiBoLmdldChuKSk7XG4gICAgICB9O1xuICAgICAgZS5vYmplY3RGcm9tTWFwID0gZnVuY3Rpb24gb2JqZWN0RnJvbU1hcCh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IFtuLCBpXSBvZiB0KSBlW25dID0gaTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9O1xuICAgICAgZS5vYmplY3RTaXplID0gZnVuY3Rpb24gb2JqZWN0U2l6ZSh0KSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0KS5sZW5ndGg7XG4gICAgICB9O1xuICAgICAgZS5zZXRWZXJib3NpdHlMZXZlbCA9IGZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKHQpIHtcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih0KSAmJiAocyA9IHQpO1xuICAgICAgfTtcbiAgICAgIGUuc2hhZG93ID0gc2hhZG93O1xuICAgICAgZS5zdHJpbmczMiA9IGZ1bmN0aW9uIHN0cmluZzMyKHQpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodCA+PiAyNCAmIDI1NSwgdCA+PiAxNiAmIDI1NSwgdCA+PiA4ICYgMjU1LCAyNTUgJiB0KTtcbiAgICAgIH07XG4gICAgICBlLnN0cmluZ1RvQnl0ZXMgPSBzdHJpbmdUb0J5dGVzO1xuICAgICAgZS5zdHJpbmdUb1BERlN0cmluZyA9IGZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHQpIHtcbiAgICAgICAgaWYgKHRbMF0gPj0gXCLDr1wiKSB7XG4gICAgICAgICAgbGV0IGU7XG4gICAgICAgICAgXCLDvlwiID09PSB0WzBdICYmIFwiw79cIiA9PT0gdFsxXSA/IGUgPSBcInV0Zi0xNmJlXCIgOiBcIsO/XCIgPT09IHRbMF0gJiYgXCLDvlwiID09PSB0WzFdID8gZSA9IFwidXRmLTE2bGVcIiA6IFwiw69cIiA9PT0gdFswXSAmJiBcIsK7XCIgPT09IHRbMV0gJiYgXCLCv1wiID09PSB0WzJdICYmIChlID0gXCJ1dGYtOFwiKTtcbiAgICAgICAgICBpZiAoZSkgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgVGV4dERlY29kZXIoZSwge1xuICAgICAgICAgICAgICAgIGZhdGFsOiAhMFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgaSA9IHN0cmluZ1RvQnl0ZXModCk7XG4gICAgICAgICAgICByZXR1cm4gbi5kZWNvZGUoaSk7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgd2FybihcInN0cmluZ1RvUERGU3RyaW5nOiBcXFwiXCIuY29uY2F0KHQsIFwiXFxcIi5cIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gW107XG4gICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIHtcbiAgICAgICAgICBjb25zdCBpID0gbFt0LmNoYXJDb2RlQXQobildO1xuICAgICAgICAgIGUucHVzaChpID8gU3RyaW5nLmZyb21DaGFyQ29kZShpKSA6IHQuY2hhckF0KG4pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZS5qb2luKFwiXCIpO1xuICAgICAgfTtcbiAgICAgIGUuc3RyaW5nVG9VVEY4U3RyaW5nID0gc3RyaW5nVG9VVEY4U3RyaW5nO1xuICAgICAgZS51bnJlYWNoYWJsZSA9IHVucmVhY2hhYmxlO1xuICAgICAgZS51dGY4U3RyaW5nVG9TdHJpbmcgPSBmdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcodCkge1xuICAgICAgICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQpKTtcbiAgICAgIH07XG4gICAgICBlLndhcm4gPSB3YXJuO1xuICAgICAgbigyKTtcbiAgICAgIG4oODQpO1xuICAgICAgbig4Nik7XG4gICAgICBuKDg3KTtcbiAgICAgIG4oODkpO1xuICAgICAgbig5Myk7XG4gICAgICBuKDEwMSk7XG4gICAgICBuKDEwMik7XG4gICAgICBuKDEwNSk7XG4gICAgICBuKDEwNyk7XG4gICAgICBuKDEwOSk7XG4gICAgICBuKDExMyk7XG4gICAgICBuKDExNik7XG4gICAgICBuKDEyMyk7XG4gICAgICBjb25zdCBpID0gIShcIm9iamVjdFwiICE9IHR5cGVvZiBwcm9jZXNzIHx8IHByb2Nlc3MgKyBcIlwiICE9IFwiW29iamVjdCBwcm9jZXNzXVwiIHx8IHByb2Nlc3MudmVyc2lvbnMubncgfHwgcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgXCJicm93c2VyXCIgIT09IHByb2Nlc3MudHlwZSk7XG4gICAgICBlLmlzTm9kZUpTID0gaTtcbiAgICAgIGUuSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdO1xuICAgICAgZS5GT05UX0lERU5USVRZX01BVFJJWCA9IFsuMDAxLCAwLCAwLCAuMDAxLCAwLCAwXTtcbiAgICAgIGUuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUgPSAxZTc7XG4gICAgICBlLkxJTkVfRkFDVE9SID0gMS4zNTtcbiAgICAgIGUuTElORV9ERVNDRU5UX0ZBQ1RPUiA9IC4zNTtcbiAgICAgIGUuQkFTRUxJTkVfRkFDVE9SID0gLjI1OTI1OTI1OTI1OTI1OTI0O1xuICAgICAgZS5SZW5kZXJpbmdJbnRlbnRGbGFnID0ge1xuICAgICAgICBBTlk6IDEsXG4gICAgICAgIERJU1BMQVk6IDIsXG4gICAgICAgIFBSSU5UOiA0LFxuICAgICAgICBTQVZFOiA4LFxuICAgICAgICBBTk5PVEFUSU9OU19GT1JNUzogMTYsXG4gICAgICAgIEFOTk9UQVRJT05TX1NUT1JBR0U6IDMyLFxuICAgICAgICBBTk5PVEFUSU9OU19ESVNBQkxFOiA2NCxcbiAgICAgICAgT1BMSVNUOiAyNTZcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25Nb2RlID0ge1xuICAgICAgICBESVNBQkxFOiAwLFxuICAgICAgICBFTkFCTEU6IDEsXG4gICAgICAgIEVOQUJMRV9GT1JNUzogMixcbiAgICAgICAgRU5BQkxFX1NUT1JBR0U6IDNcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25FZGl0b3JQcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2VkaXRvcl9cIjtcbiAgICAgIGUuQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7XG4gICAgICAgIERJU0FCTEU6IC0xLFxuICAgICAgICBOT05FOiAwLFxuICAgICAgICBGUkVFVEVYVDogMyxcbiAgICAgICAgU1RBTVA6IDEzLFxuICAgICAgICBJTks6IDE1XG4gICAgICB9O1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSA9IHtcbiAgICAgICAgUkVTSVpFOiAxLFxuICAgICAgICBGUkVFVEVYVF9TSVpFOiAxMSxcbiAgICAgICAgRlJFRVRFWFRfQ09MT1I6IDEyLFxuICAgICAgICBGUkVFVEVYVF9PUEFDSVRZOiAxMyxcbiAgICAgICAgSU5LX0NPTE9SOiAyMSxcbiAgICAgICAgSU5LX1RISUNLTkVTUzogMjIsXG4gICAgICAgIElOS19PUEFDSVRZOiAyM1xuICAgICAgfTtcbiAgICAgIGUuUGVybWlzc2lvbkZsYWcgPSB7XG4gICAgICAgIFBSSU5UOiA0LFxuICAgICAgICBNT0RJRllfQ09OVEVOVFM6IDgsXG4gICAgICAgIENPUFk6IDE2LFxuICAgICAgICBNT0RJRllfQU5OT1RBVElPTlM6IDMyLFxuICAgICAgICBGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOiAyNTYsXG4gICAgICAgIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDUxMixcbiAgICAgICAgQVNTRU1CTEU6IDEwMjQsXG4gICAgICAgIFBSSU5UX0hJR0hfUVVBTElUWTogMjA0OFxuICAgICAgfTtcbiAgICAgIGUuVGV4dFJlbmRlcmluZ01vZGUgPSB7XG4gICAgICAgIEZJTEw6IDAsXG4gICAgICAgIFNUUk9LRTogMSxcbiAgICAgICAgRklMTF9TVFJPS0U6IDIsXG4gICAgICAgIElOVklTSUJMRTogMyxcbiAgICAgICAgRklMTF9BRERfVE9fUEFUSDogNCxcbiAgICAgICAgU1RST0tFX0FERF9UT19QQVRIOiA1LFxuICAgICAgICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNixcbiAgICAgICAgQUREX1RPX1BBVEg6IDcsXG4gICAgICAgIEZJTExfU1RST0tFX01BU0s6IDMsXG4gICAgICAgIEFERF9UT19QQVRIX0ZMQUc6IDRcbiAgICAgIH07XG4gICAgICBlLkltYWdlS2luZCA9IHtcbiAgICAgICAgR1JBWVNDQUxFXzFCUFA6IDEsXG4gICAgICAgIFJHQl8yNEJQUDogMixcbiAgICAgICAgUkdCQV8zMkJQUDogM1xuICAgICAgfTtcbiAgICAgIGUuQW5ub3RhdGlvblR5cGUgPSB7XG4gICAgICAgIFRFWFQ6IDEsXG4gICAgICAgIExJTks6IDIsXG4gICAgICAgIEZSRUVURVhUOiAzLFxuICAgICAgICBMSU5FOiA0LFxuICAgICAgICBTUVVBUkU6IDUsXG4gICAgICAgIENJUkNMRTogNixcbiAgICAgICAgUE9MWUdPTjogNyxcbiAgICAgICAgUE9MWUxJTkU6IDgsXG4gICAgICAgIEhJR0hMSUdIVDogOSxcbiAgICAgICAgVU5ERVJMSU5FOiAxMCxcbiAgICAgICAgU1FVSUdHTFk6IDExLFxuICAgICAgICBTVFJJS0VPVVQ6IDEyLFxuICAgICAgICBTVEFNUDogMTMsXG4gICAgICAgIENBUkVUOiAxNCxcbiAgICAgICAgSU5LOiAxNSxcbiAgICAgICAgUE9QVVA6IDE2LFxuICAgICAgICBGSUxFQVRUQUNITUVOVDogMTcsXG4gICAgICAgIFNPVU5EOiAxOCxcbiAgICAgICAgTU9WSUU6IDE5LFxuICAgICAgICBXSURHRVQ6IDIwLFxuICAgICAgICBTQ1JFRU46IDIxLFxuICAgICAgICBQUklOVEVSTUFSSzogMjIsXG4gICAgICAgIFRSQVBORVQ6IDIzLFxuICAgICAgICBXQVRFUk1BUks6IDI0LFxuICAgICAgICBUSFJFRUQ6IDI1LFxuICAgICAgICBSRURBQ1Q6IDI2XG4gICAgICB9O1xuICAgICAgZS5Bbm5vdGF0aW9uUmVwbHlUeXBlID0ge1xuICAgICAgICBHUk9VUDogXCJHcm91cFwiLFxuICAgICAgICBSRVBMWTogXCJSXCJcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25GbGFnID0ge1xuICAgICAgICBJTlZJU0lCTEU6IDEsXG4gICAgICAgIEhJRERFTjogMixcbiAgICAgICAgUFJJTlQ6IDQsXG4gICAgICAgIE5PWk9PTTogOCxcbiAgICAgICAgTk9ST1RBVEU6IDE2LFxuICAgICAgICBOT1ZJRVc6IDMyLFxuICAgICAgICBSRUFET05MWTogNjQsXG4gICAgICAgIExPQ0tFRDogMTI4LFxuICAgICAgICBUT0dHTEVOT1ZJRVc6IDI1NixcbiAgICAgICAgTE9DS0VEQ09OVEVOVFM6IDUxMlxuICAgICAgfTtcbiAgICAgIGUuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IHtcbiAgICAgICAgUkVBRE9OTFk6IDEsXG4gICAgICAgIFJFUVVJUkVEOiAyLFxuICAgICAgICBOT0VYUE9SVDogNCxcbiAgICAgICAgTVVMVElMSU5FOiA0MDk2LFxuICAgICAgICBQQVNTV09SRDogODE5MixcbiAgICAgICAgTk9UT0dHTEVUT09GRjogMTYzODQsXG4gICAgICAgIFJBRElPOiAzMjc2OCxcbiAgICAgICAgUFVTSEJVVFRPTjogNjU1MzYsXG4gICAgICAgIENPTUJPOiAxMzEwNzIsXG4gICAgICAgIEVESVQ6IDI2MjE0NCxcbiAgICAgICAgU09SVDogNTI0Mjg4LFxuICAgICAgICBGSUxFU0VMRUNUOiAxMDQ4NTc2LFxuICAgICAgICBNVUxUSVNFTEVDVDogMjA5NzE1MixcbiAgICAgICAgRE9OT1RTUEVMTENIRUNLOiA0MTk0MzA0LFxuICAgICAgICBET05PVFNDUk9MTDogODM4ODYwOCxcbiAgICAgICAgQ09NQjogMTY3NzcyMTYsXG4gICAgICAgIFJJQ0hURVhUOiAzMzU1NDQzMixcbiAgICAgICAgUkFESU9TSU5VTklTT046IDMzNTU0NDMyLFxuICAgICAgICBDT01NSVRPTlNFTENIQU5HRTogNjcxMDg4NjRcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSB7XG4gICAgICAgIFNPTElEOiAxLFxuICAgICAgICBEQVNIRUQ6IDIsXG4gICAgICAgIEJFVkVMRUQ6IDMsXG4gICAgICAgIElOU0VUOiA0LFxuICAgICAgICBVTkRFUkxJTkU6IDVcbiAgICAgIH07XG4gICAgICBlLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGUgPSB7XG4gICAgICAgIEU6IFwiTW91c2UgRW50ZXJcIixcbiAgICAgICAgWDogXCJNb3VzZSBFeGl0XCIsXG4gICAgICAgIEQ6IFwiTW91c2UgRG93blwiLFxuICAgICAgICBVOiBcIk1vdXNlIFVwXCIsXG4gICAgICAgIEZvOiBcIkZvY3VzXCIsXG4gICAgICAgIEJsOiBcIkJsdXJcIixcbiAgICAgICAgUE86IFwiUGFnZU9wZW5cIixcbiAgICAgICAgUEM6IFwiUGFnZUNsb3NlXCIsXG4gICAgICAgIFBWOiBcIlBhZ2VWaXNpYmxlXCIsXG4gICAgICAgIFBJOiBcIlBhZ2VJbnZpc2libGVcIixcbiAgICAgICAgSzogXCJLZXlzdHJva2VcIixcbiAgICAgICAgRjogXCJGb3JtYXRcIixcbiAgICAgICAgVjogXCJWYWxpZGF0ZVwiLFxuICAgICAgICBDOiBcIkNhbGN1bGF0ZVwiXG4gICAgICB9O1xuICAgICAgZS5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHtcbiAgICAgICAgV0M6IFwiV2lsbENsb3NlXCIsXG4gICAgICAgIFdTOiBcIldpbGxTYXZlXCIsXG4gICAgICAgIERTOiBcIkRpZFNhdmVcIixcbiAgICAgICAgV1A6IFwiV2lsbFByaW50XCIsXG4gICAgICAgIERQOiBcIkRpZFByaW50XCJcbiAgICAgIH07XG4gICAgICBlLlBhZ2VBY3Rpb25FdmVudFR5cGUgPSB7XG4gICAgICAgIE86IFwiUGFnZU9wZW5cIixcbiAgICAgICAgQzogXCJQYWdlQ2xvc2VcIlxuICAgICAgfTtcbiAgICAgIGNvbnN0IHIgPSB7XG4gICAgICAgIEVSUk9SUzogMCxcbiAgICAgICAgV0FSTklOR1M6IDEsXG4gICAgICAgIElORk9TOiA1XG4gICAgICB9O1xuICAgICAgZS5WZXJib3NpdHlMZXZlbCA9IHI7XG4gICAgICBlLkNNYXBDb21wcmVzc2lvblR5cGUgPSB7XG4gICAgICAgIE5PTkU6IDAsXG4gICAgICAgIEJJTkFSWTogMVxuICAgICAgfTtcbiAgICAgIGUuT1BTID0ge1xuICAgICAgICBkZXBlbmRlbmN5OiAxLFxuICAgICAgICBzZXRMaW5lV2lkdGg6IDIsXG4gICAgICAgIHNldExpbmVDYXA6IDMsXG4gICAgICAgIHNldExpbmVKb2luOiA0LFxuICAgICAgICBzZXRNaXRlckxpbWl0OiA1LFxuICAgICAgICBzZXREYXNoOiA2LFxuICAgICAgICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG4gICAgICAgIHNldEZsYXRuZXNzOiA4LFxuICAgICAgICBzZXRHU3RhdGU6IDksXG4gICAgICAgIHNhdmU6IDEwLFxuICAgICAgICByZXN0b3JlOiAxMSxcbiAgICAgICAgdHJhbnNmb3JtOiAxMixcbiAgICAgICAgbW92ZVRvOiAxMyxcbiAgICAgICAgbGluZVRvOiAxNCxcbiAgICAgICAgY3VydmVUbzogMTUsXG4gICAgICAgIGN1cnZlVG8yOiAxNixcbiAgICAgICAgY3VydmVUbzM6IDE3LFxuICAgICAgICBjbG9zZVBhdGg6IDE4LFxuICAgICAgICByZWN0YW5nbGU6IDE5LFxuICAgICAgICBzdHJva2U6IDIwLFxuICAgICAgICBjbG9zZVN0cm9rZTogMjEsXG4gICAgICAgIGZpbGw6IDIyLFxuICAgICAgICBlb0ZpbGw6IDIzLFxuICAgICAgICBmaWxsU3Ryb2tlOiAyNCxcbiAgICAgICAgZW9GaWxsU3Ryb2tlOiAyNSxcbiAgICAgICAgY2xvc2VGaWxsU3Ryb2tlOiAyNixcbiAgICAgICAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuICAgICAgICBlbmRQYXRoOiAyOCxcbiAgICAgICAgY2xpcDogMjksXG4gICAgICAgIGVvQ2xpcDogMzAsXG4gICAgICAgIGJlZ2luVGV4dDogMzEsXG4gICAgICAgIGVuZFRleHQ6IDMyLFxuICAgICAgICBzZXRDaGFyU3BhY2luZzogMzMsXG4gICAgICAgIHNldFdvcmRTcGFjaW5nOiAzNCxcbiAgICAgICAgc2V0SFNjYWxlOiAzNSxcbiAgICAgICAgc2V0TGVhZGluZzogMzYsXG4gICAgICAgIHNldEZvbnQ6IDM3LFxuICAgICAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsXG4gICAgICAgIHNldFRleHRSaXNlOiAzOSxcbiAgICAgICAgbW92ZVRleHQ6IDQwLFxuICAgICAgICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLFxuICAgICAgICBzZXRUZXh0TWF0cml4OiA0MixcbiAgICAgICAgbmV4dExpbmU6IDQzLFxuICAgICAgICBzaG93VGV4dDogNDQsXG4gICAgICAgIHNob3dTcGFjZWRUZXh0OiA0NSxcbiAgICAgICAgbmV4dExpbmVTaG93VGV4dDogNDYsXG4gICAgICAgIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NyxcbiAgICAgICAgc2V0Q2hhcldpZHRoOiA0OCxcbiAgICAgICAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcbiAgICAgICAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsXG4gICAgICAgIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcbiAgICAgICAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuICAgICAgICBzZXRTdHJva2VDb2xvck46IDUzLFxuICAgICAgICBzZXRGaWxsQ29sb3I6IDU0LFxuICAgICAgICBzZXRGaWxsQ29sb3JOOiA1NSxcbiAgICAgICAgc2V0U3Ryb2tlR3JheTogNTYsXG4gICAgICAgIHNldEZpbGxHcmF5OiA1NyxcbiAgICAgICAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuICAgICAgICBzZXRGaWxsUkdCQ29sb3I6IDU5LFxuICAgICAgICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuICAgICAgICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcbiAgICAgICAgc2hhZGluZ0ZpbGw6IDYyLFxuICAgICAgICBiZWdpbklubGluZUltYWdlOiA2MyxcbiAgICAgICAgYmVnaW5JbWFnZURhdGE6IDY0LFxuICAgICAgICBlbmRJbmxpbmVJbWFnZTogNjUsXG4gICAgICAgIHBhaW50WE9iamVjdDogNjYsXG4gICAgICAgIG1hcmtQb2ludDogNjcsXG4gICAgICAgIG1hcmtQb2ludFByb3BzOiA2OCxcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcbiAgICAgICAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuICAgICAgICBlbmRNYXJrZWRDb250ZW50OiA3MSxcbiAgICAgICAgYmVnaW5Db21wYXQ6IDcyLFxuICAgICAgICBlbmRDb21wYXQ6IDczLFxuICAgICAgICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LFxuICAgICAgICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcbiAgICAgICAgYmVnaW5Hcm91cDogNzYsXG4gICAgICAgIGVuZEdyb3VwOiA3NyxcbiAgICAgICAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcbiAgICAgICAgZW5kQW5ub3RhdGlvbjogODEsXG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsXG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOiA4NCxcbiAgICAgICAgcGFpbnRJbWFnZVhPYmplY3Q6IDg1LFxuICAgICAgICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsXG4gICAgICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6IDg3LFxuICAgICAgICBwYWludEltYWdlWE9iamVjdFJlcGVhdDogODgsXG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksXG4gICAgICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzazogOTAsXG4gICAgICAgIGNvbnN0cnVjdFBhdGg6IDkxXG4gICAgICB9O1xuICAgICAgZS5QYXNzd29yZFJlc3BvbnNlcyA9IHtcbiAgICAgICAgTkVFRF9QQVNTV09SRDogMSxcbiAgICAgICAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyXG4gICAgICB9O1xuICAgICAgbGV0IHMgPSByLldBUk5JTkdTO1xuICAgICAgZnVuY3Rpb24gd2Fybih0KSB7XG4gICAgICAgIHMgPj0gci5XQVJOSU5HUyAmJiBjb25zb2xlLmxvZyhcIldhcm5pbmc6IFwiLmNvbmNhdCh0KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1bnJlYWNoYWJsZSh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHNoYWRvdyh0LCBlLCBuKSB7XG4gICAgICAgIGxldCBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gJiYgYXJndW1lbnRzWzNdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwge1xuICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgIGVudW1lcmFibGU6ICFpLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgICAgd3JpdGFibGU6ICExXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGEgPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbih0LCBlKSB7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUV4Y2VwdGlvbiAmJiB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHQ7XG4gICAgICAgICAgdGhpcy5uYW1lID0gZTtcbiAgICAgICAgfVxuICAgICAgICBCYXNlRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuICAgICAgICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcbiAgICAgICAgcmV0dXJuIEJhc2VFeGNlcHRpb247XG4gICAgICB9KCk7XG4gICAgICBlLkJhc2VFeGNlcHRpb24gPSBhO1xuICAgICAgZS5QYXNzd29yZEV4Y2VwdGlvbiA9IGNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgYSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICBzdXBlcih0LCBcIlBhc3N3b3JkRXhjZXB0aW9uXCIpO1xuICAgICAgICAgIHRoaXMuY29kZSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IGNsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIGEge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgc3VwZXIodCwgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIik7XG4gICAgICAgICAgdGhpcy5kZXRhaWxzID0gZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGUuSW52YWxpZFBERkV4Y2VwdGlvbiA9IGNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGUuTWlzc2luZ1BERkV4Y2VwdGlvbiA9IGNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGUuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgYSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICBzdXBlcih0LCBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiKTtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IGU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlLkZvcm1hdEVycm9yID0gY2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiRm9ybWF0RXJyb3JcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBlLkFib3J0RXhjZXB0aW9uID0gY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIFwiQWJvcnRFeGNlcHRpb25cIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBieXRlc1RvU3RyaW5nKHQpIHtcbiAgICAgICAgXCJvYmplY3RcIiA9PSB0eXBlb2YgdCAmJiB2b2lkIDAgIT09ICh0ID09PSBudWxsIHx8IHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHQubGVuZ3RoKSB8fCB1bnJlYWNoYWJsZShcIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmdcIik7XG4gICAgICAgIGNvbnN0IGUgPSB0Lmxlbmd0aCxcbiAgICAgICAgICBuID0gODE5MjtcbiAgICAgICAgaWYgKGUgPCBuKSByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB0KTtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IGU7IHIgKz0gbikge1xuICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLm1pbihyICsgbiwgZSksXG4gICAgICAgICAgICBhID0gdC5zdWJhcnJheShyLCBzKTtcbiAgICAgICAgICBpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGkuam9pbihcIlwiKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXModCkge1xuICAgICAgICBcInN0cmluZ1wiICE9IHR5cGVvZiB0ICYmIHVucmVhY2hhYmxlKFwiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlc1wiKTtcbiAgICAgICAgY29uc3QgZSA9IHQubGVuZ3RoLFxuICAgICAgICAgIG4gPSBuZXcgVWludDhBcnJheShlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlOyArK2kpIG5baV0gPSAyNTUgJiB0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgICAgZS5GZWF0dXJlVGVzdCA9IGNsYXNzIEZlYXR1cmVUZXN0IHtcbiAgICAgICAgc3RhdGljIGdldCBpc0xpdHRsZUVuZGlhbigpIHtcbiAgICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNMaXR0bGVFbmRpYW5cIiwgZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgICAgICB0WzBdID0gMTtcbiAgICAgICAgICAgIHJldHVybiAxID09PSBuZXcgVWludDMyQXJyYXkodC5idWZmZXIsIDAsIDEpWzBdO1xuICAgICAgICAgIH0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRXZhbFN1cHBvcnRlZFwiLCBmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBuZXcgRnVuY3Rpb24oXCJcIik7XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQzKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KCkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkXCIsIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBwbGF0Zm9ybSgpIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIiA9PSB0eXBlb2YgbmF2aWdhdG9yID8gc2hhZG93KHRoaXMsIFwicGxhdGZvcm1cIiwge1xuICAgICAgICAgICAgaXNXaW46ICExLFxuICAgICAgICAgICAgaXNNYWM6ICExXG4gICAgICAgICAgfSkgOiBzaGFkb3codGhpcywgXCJwbGF0Zm9ybVwiLCB7XG4gICAgICAgICAgICBpc1dpbjogbmF2aWdhdG9yLnBsYXRmb3JtLmluY2x1ZGVzKFwiV2luXCIpLFxuICAgICAgICAgICAgaXNNYWM6IG5hdmlnYXRvci5wbGF0Zm9ybS5pbmNsdWRlcyhcIk1hY1wiKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgbyA9IFsuLi5BcnJheSgyNTYpLmtleXMoKV0ubWFwKHQgPT4gdC50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKTtcbiAgICAgIGUuVXRpbCA9IGNsYXNzIFV0aWwge1xuICAgICAgICBzdGF0aWMgbWFrZUhleENvbG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICByZXR1cm4gXCIjXCIuY29uY2F0KG9bdF0pLmNvbmNhdChvW2VdKS5jb25jYXQob1tuXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIHNjYWxlTWluTWF4KHQsIGUpIHtcbiAgICAgICAgICBsZXQgbjtcbiAgICAgICAgICBpZiAodFswXSkge1xuICAgICAgICAgICAgaWYgKHRbMF0gPCAwKSB7XG4gICAgICAgICAgICAgIG4gPSBlWzBdO1xuICAgICAgICAgICAgICBlWzBdID0gZVsxXTtcbiAgICAgICAgICAgICAgZVsxXSA9IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlWzBdICo9IHRbMF07XG4gICAgICAgICAgICBlWzFdICo9IHRbMF07XG4gICAgICAgICAgICBpZiAodFszXSA8IDApIHtcbiAgICAgICAgICAgICAgbiA9IGVbMl07XG4gICAgICAgICAgICAgIGVbMl0gPSBlWzNdO1xuICAgICAgICAgICAgICBlWzNdID0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVbMl0gKj0gdFszXTtcbiAgICAgICAgICAgIGVbM10gKj0gdFszXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbiA9IGVbMF07XG4gICAgICAgICAgICBlWzBdID0gZVsyXTtcbiAgICAgICAgICAgIGVbMl0gPSBuO1xuICAgICAgICAgICAgbiA9IGVbMV07XG4gICAgICAgICAgICBlWzFdID0gZVszXTtcbiAgICAgICAgICAgIGVbM10gPSBuO1xuICAgICAgICAgICAgaWYgKHRbMV0gPCAwKSB7XG4gICAgICAgICAgICAgIG4gPSBlWzJdO1xuICAgICAgICAgICAgICBlWzJdID0gZVszXTtcbiAgICAgICAgICAgICAgZVszXSA9IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlWzJdICo9IHRbMV07XG4gICAgICAgICAgICBlWzNdICo9IHRbMV07XG4gICAgICAgICAgICBpZiAodFsyXSA8IDApIHtcbiAgICAgICAgICAgICAgbiA9IGVbMF07XG4gICAgICAgICAgICAgIGVbMF0gPSBlWzFdO1xuICAgICAgICAgICAgICBlWzFdID0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVbMF0gKj0gdFsyXTtcbiAgICAgICAgICAgIGVbMV0gKj0gdFsyXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZVswXSArPSB0WzRdO1xuICAgICAgICAgIGVbMV0gKz0gdFs0XTtcbiAgICAgICAgICBlWzJdICs9IHRbNV07XG4gICAgICAgICAgZVszXSArPSB0WzVdO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB0cmFuc2Zvcm0odCwgZSkge1xuICAgICAgICAgIHJldHVybiBbdFswXSAqIGVbMF0gKyB0WzJdICogZVsxXSwgdFsxXSAqIGVbMF0gKyB0WzNdICogZVsxXSwgdFswXSAqIGVbMl0gKyB0WzJdICogZVszXSwgdFsxXSAqIGVbMl0gKyB0WzNdICogZVszXSwgdFswXSAqIGVbNF0gKyB0WzJdICogZVs1XSArIHRbNF0sIHRbMV0gKiBlWzRdICsgdFszXSAqIGVbNV0gKyB0WzVdXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0odCwgZSkge1xuICAgICAgICAgIHJldHVybiBbdFswXSAqIGVbMF0gKyB0WzFdICogZVsyXSArIGVbNF0sIHRbMF0gKiBlWzFdICsgdFsxXSAqIGVbM10gKyBlWzVdXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gZVswXSAqIGVbM10gLSBlWzFdICogZVsyXTtcbiAgICAgICAgICByZXR1cm4gWyh0WzBdICogZVszXSAtIHRbMV0gKiBlWzJdICsgZVsyXSAqIGVbNV0gLSBlWzRdICogZVszXSkgLyBuLCAoLXRbMF0gKiBlWzFdICsgdFsxXSAqIGVbMF0gKyBlWzRdICogZVsxXSAtIGVbNV0gKiBlWzBdKSAvIG5dO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0odCwgZSksXG4gICAgICAgICAgICBpID0gdGhpcy5hcHBseVRyYW5zZm9ybSh0LnNsaWNlKDIsIDQpLCBlKSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFt0WzBdLCB0WzNdXSwgZSksXG4gICAgICAgICAgICBzID0gdGhpcy5hcHBseVRyYW5zZm9ybShbdFsyXSwgdFsxXV0sIGUpO1xuICAgICAgICAgIHJldHVybiBbTWF0aC5taW4oblswXSwgaVswXSwgclswXSwgc1swXSksIE1hdGgubWluKG5bMV0sIGlbMV0sIHJbMV0sIHNbMV0pLCBNYXRoLm1heChuWzBdLCBpWzBdLCByWzBdLCBzWzBdKSwgTWF0aC5tYXgoblsxXSwgaVsxXSwgclsxXSwgc1sxXSldO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdFswXSAqIHRbM10gLSB0WzFdICogdFsyXTtcbiAgICAgICAgICByZXR1cm4gW3RbM10gLyBlLCAtdFsxXSAvIGUsIC10WzJdIC8gZSwgdFswXSAvIGUsICh0WzJdICogdFs1XSAtIHRbNF0gKiB0WzNdKSAvIGUsICh0WzRdICogdFsxXSAtIHRbNV0gKiB0WzBdKSAvIGVdO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IFt0WzBdLCB0WzJdLCB0WzFdLCB0WzNdXSxcbiAgICAgICAgICAgIG4gPSB0WzBdICogZVswXSArIHRbMV0gKiBlWzJdLFxuICAgICAgICAgICAgaSA9IHRbMF0gKiBlWzFdICsgdFsxXSAqIGVbM10sXG4gICAgICAgICAgICByID0gdFsyXSAqIGVbMF0gKyB0WzNdICogZVsyXSxcbiAgICAgICAgICAgIHMgPSB0WzJdICogZVsxXSArIHRbM10gKiBlWzNdLFxuICAgICAgICAgICAgYSA9IChuICsgcykgLyAyLFxuICAgICAgICAgICAgbyA9IE1hdGguc3FydCgobiArIHMpICoqIDIgLSA0ICogKG4gKiBzIC0gciAqIGkpKSAvIDIsXG4gICAgICAgICAgICBsID0gYSArIG8gfHwgMSxcbiAgICAgICAgICAgIGMgPSBhIC0gbyB8fCAxO1xuICAgICAgICAgIHJldHVybiBbTWF0aC5zcXJ0KGwpLCBNYXRoLnNxcnQoYyldO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBub3JtYWxpemVSZWN0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdC5zbGljZSgwKTtcbiAgICAgICAgICBpZiAodFswXSA+IHRbMl0pIHtcbiAgICAgICAgICAgIGVbMF0gPSB0WzJdO1xuICAgICAgICAgICAgZVsyXSA9IHRbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0WzFdID4gdFszXSkge1xuICAgICAgICAgICAgZVsxXSA9IHRbM107XG4gICAgICAgICAgICBlWzNdID0gdFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGludGVyc2VjdCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IE1hdGgubWF4KE1hdGgubWluKHRbMF0sIHRbMl0pLCBNYXRoLm1pbihlWzBdLCBlWzJdKSksXG4gICAgICAgICAgICBpID0gTWF0aC5taW4oTWF0aC5tYXgodFswXSwgdFsyXSksIE1hdGgubWF4KGVbMF0sIGVbMl0pKTtcbiAgICAgICAgICBpZiAobiA+IGkpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLm1heChNYXRoLm1pbih0WzFdLCB0WzNdKSwgTWF0aC5taW4oZVsxXSwgZVszXSkpLFxuICAgICAgICAgICAgcyA9IE1hdGgubWluKE1hdGgubWF4KHRbMV0sIHRbM10pLCBNYXRoLm1heChlWzFdLCBlWzNdKSk7XG4gICAgICAgICAgcmV0dXJuIHIgPiBzID8gbnVsbCA6IFtuLCByLCBpLCBzXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgYmV6aWVyQm91bmRpbmdCb3godCwgZSwgbiwgaSwgciwgcywgYSwgbykge1xuICAgICAgICAgIGNvbnN0IGwgPSBbXSxcbiAgICAgICAgICAgIGMgPSBbW10sIFtdXTtcbiAgICAgICAgICBsZXQgaCwgZCwgdSwgcCwgZiwgZywgbSwgYjtcbiAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IDI7ICsrYykge1xuICAgICAgICAgICAgaWYgKDAgPT09IGMpIHtcbiAgICAgICAgICAgICAgZCA9IDYgKiB0IC0gMTIgKiBuICsgNiAqIHI7XG4gICAgICAgICAgICAgIGggPSAtMyAqIHQgKyA5ICogbiAtIDkgKiByICsgMyAqIGE7XG4gICAgICAgICAgICAgIHUgPSAzICogbiAtIDMgKiB0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZCA9IDYgKiBlIC0gMTIgKiBpICsgNiAqIHM7XG4gICAgICAgICAgICAgIGggPSAtMyAqIGUgKyA5ICogaSAtIDkgKiBzICsgMyAqIG87XG4gICAgICAgICAgICAgIHUgPSAzICogaSAtIDMgKiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGgpIDwgMWUtMTIpIHtcbiAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGQpIDwgMWUtMTIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICBwID0gLXUgLyBkO1xuICAgICAgICAgICAgICAwIDwgcCAmJiBwIDwgMSAmJiBsLnB1c2gocCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtID0gZCAqIGQgLSA0ICogdSAqIGg7XG4gICAgICAgICAgICAgIGIgPSBNYXRoLnNxcnQobSk7XG4gICAgICAgICAgICAgIGlmICghKG0gPCAwKSkge1xuICAgICAgICAgICAgICAgIGYgPSAoLWQgKyBiKSAvICgyICogaCk7XG4gICAgICAgICAgICAgICAgMCA8IGYgJiYgZiA8IDEgJiYgbC5wdXNoKGYpO1xuICAgICAgICAgICAgICAgIGcgPSAoLWQgLSBiKSAvICgyICogaCk7XG4gICAgICAgICAgICAgICAgMCA8IGcgJiYgZyA8IDEgJiYgbC5wdXNoKGcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB2LFxuICAgICAgICAgICAgeSA9IGwubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IEEgPSB5O1xuICAgICAgICAgIGZvciAoOyB5LS07KSB7XG4gICAgICAgICAgICBwID0gbFt5XTtcbiAgICAgICAgICAgIHYgPSAxIC0gcDtcbiAgICAgICAgICAgIGNbMF1beV0gPSB2ICogdiAqIHYgKiB0ICsgMyAqIHYgKiB2ICogcCAqIG4gKyAzICogdiAqIHAgKiBwICogciArIHAgKiBwICogcCAqIGE7XG4gICAgICAgICAgICBjWzFdW3ldID0gdiAqIHYgKiB2ICogZSArIDMgKiB2ICogdiAqIHAgKiBpICsgMyAqIHYgKiBwICogcCAqIHMgKyBwICogcCAqIHAgKiBvO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjWzBdW0FdID0gdDtcbiAgICAgICAgICBjWzFdW0FdID0gZTtcbiAgICAgICAgICBjWzBdW0EgKyAxXSA9IGE7XG4gICAgICAgICAgY1sxXVtBICsgMV0gPSBvO1xuICAgICAgICAgIGNbMF0ubGVuZ3RoID0gY1sxXS5sZW5ndGggPSBBICsgMjtcbiAgICAgICAgICByZXR1cm4gW01hdGgubWluKC4uLmNbMF0pLCBNYXRoLm1pbiguLi5jWzFdKSwgTWF0aC5tYXgoLi4uY1swXSksIE1hdGgubWF4KC4uLmNbMV0pXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGwgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgNzI4LCA3MTEsIDcxMCwgNzI5LCA3MzMsIDczMSwgNzMwLCA3MzIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDgyMjYsIDgyMjQsIDgyMjUsIDgyMzAsIDgyMTIsIDgyMTEsIDQwMiwgODI2MCwgODI0OSwgODI1MCwgODcyMiwgODI0MCwgODIyMiwgODIyMCwgODIyMSwgODIxNiwgODIxNywgODIxOCwgODQ4MiwgNjQyNTcsIDY0MjU4LCAzMjEsIDMzOCwgMzUyLCAzNzYsIDM4MSwgMzA1LCAzMjIsIDMzOSwgMzUzLCAzODIsIDAsIDgzNjRdO1xuICAgICAgZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHQpIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUodCkpO1xuICAgICAgfVxuICAgICAgZS5Qcm9taXNlQ2FwYWJpbGl0eSA9IChfdCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpLCBjbGFzcyBQcm9taXNlQ2FwYWJpbGl0eSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF90LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKCh0LCBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSBlID0+IHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF90LCAhMCk7XG4gICAgICAgICAgICAgIHQoZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSB0ID0+IHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF90LCAhMCk7XG4gICAgICAgICAgICAgIGUodCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCBzZXR0bGVkKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3QpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxldCBjID0gbnVsbCxcbiAgICAgICAgaCA9IG51bGw7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oNCksXG4gICAgICAgIHMgPSBuKDY5KSxcbiAgICAgICAgYSA9IG4oNzApLFxuICAgICAgICBvID0gXCJXZWJBc3NlbWJseVwiLFxuICAgICAgICBsID0gcltvXSxcbiAgICAgICAgYyA9IDcgIT09IEVycm9yKFwiZVwiLCB7XG4gICAgICAgICAgY2F1c2U6IDdcbiAgICAgICAgfSkuY2F1c2UsXG4gICAgICAgIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyID0gZnVuY3Rpb24gZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIodCwgZSkge1xuICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgblt0XSA9IGEodCwgZSwgYyk7XG4gICAgICAgICAgaSh7XG4gICAgICAgICAgICBnbG9iYWw6ICEwLFxuICAgICAgICAgICAgY29uc3RydWN0b3I6ICEwLFxuICAgICAgICAgICAgYXJpdHk6IDEsXG4gICAgICAgICAgICBmb3JjZWQ6IGNcbiAgICAgICAgICB9LCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlciA9IGZ1bmN0aW9uIGV4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIodCwgZSkge1xuICAgICAgICAgIGlmIChsICYmIGxbdF0pIHtcbiAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICBuW3RdID0gYShvICsgXCIuXCIgKyB0LCBlLCBjKTtcbiAgICAgICAgICAgIGkoe1xuICAgICAgICAgICAgICB0YXJnZXQ6IG8sXG4gICAgICAgICAgICAgIHN0YXQ6ICEwLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogITAsXG4gICAgICAgICAgICAgIGFyaXR5OiAxLFxuICAgICAgICAgICAgICBmb3JjZWQ6IGNcbiAgICAgICAgICAgIH0sIG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKFwiRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIEVycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcihcIkV2YWxFcnJvclwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gRXZhbEVycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcihcIlJhbmdlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFJhbmdlRXJyb3IoZSkge1xuICAgICAgICAgIHJldHVybiBzKHQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKFwiUmVmZXJlbmNlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFJlZmVyZW5jZUVycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcihcIlN5bnRheEVycm9yXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBTeW50YXhFcnJvcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHModCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoXCJUeXBlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFR5cGVFcnJvcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHModCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoXCJVUklFcnJvclwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gVVJJRXJyb3IoZSkge1xuICAgICAgICAgIHJldHVybiBzKHQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIoXCJDb21waWxlRXJyb3JcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIENvbXBpbGVFcnJvcihlKSB7XG4gICAgICAgICAgcmV0dXJuIHModCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcihcIkxpbmtFcnJvclwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gTGlua0Vycm9yKGUpIHtcbiAgICAgICAgICByZXR1cm4gcyh0LCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKFwiUnVudGltZUVycm9yXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBSdW50aW1lRXJyb3IoZSkge1xuICAgICAgICAgIHJldHVybiBzKHQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbig1KS5mLFxuICAgICAgICBzID0gbig0NCksXG4gICAgICAgIGEgPSBuKDQ4KSxcbiAgICAgICAgbyA9IG4oMzgpLFxuICAgICAgICBsID0gbig1NiksXG4gICAgICAgIGMgPSBuKDY4KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBuLFxuICAgICAgICAgIGgsXG4gICAgICAgICAgZCxcbiAgICAgICAgICB1LFxuICAgICAgICAgIHAsXG4gICAgICAgICAgZiA9IHQudGFyZ2V0LFxuICAgICAgICAgIGcgPSB0Lmdsb2JhbCxcbiAgICAgICAgICBtID0gdC5zdGF0O1xuICAgICAgICBpZiAobiA9IGcgPyBpIDogbSA/IGlbZl0gfHwgbyhmLCB7fSkgOiAoaVtmXSB8fCB7fSkucHJvdG90eXBlKSBmb3IgKGggaW4gZSkge1xuICAgICAgICAgIHUgPSBlW2hdO1xuICAgICAgICAgIGQgPSB0LmRvbnRDYWxsR2V0U2V0ID8gKHAgPSByKG4sIGgpKSAmJiBwLnZhbHVlIDogbltoXTtcbiAgICAgICAgICBpZiAoIWMoZyA/IGggOiBmICsgKG0gPyBcIi5cIiA6IFwiI1wiKSArIGgsIHQuZm9yY2VkKSAmJiB2b2lkIDAgIT09IGQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdSA9PSB0eXBlb2YgZCkgY29udGludWU7XG4gICAgICAgICAgICBsKHUsIGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAodC5zaGFtIHx8IGQgJiYgZC5zaGFtKSAmJiBzKHUsIFwic2hhbVwiLCAhMCk7XG4gICAgICAgICAgYShuLCBoLCB1LCB0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgdmFyIGNoZWNrID0gZnVuY3Rpb24gY2hlY2sodCkge1xuICAgICAgICByZXR1cm4gdCAmJiB0Lk1hdGggPT0gTWF0aCAmJiB0O1xuICAgICAgfTtcbiAgICAgIHQuZXhwb3J0cyA9IGNoZWNrKFwib2JqZWN0XCIgPT0gdHlwZW9mIGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpcykgfHwgY2hlY2soXCJvYmplY3RcIiA9PSB0eXBlb2Ygd2luZG93ICYmIHdpbmRvdykgfHwgY2hlY2soXCJvYmplY3RcIiA9PSB0eXBlb2Ygc2VsZiAmJiBzZWxmKSB8fCBjaGVjayhcIm9iamVjdFwiID09IHR5cGVvZiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcgJiYgX193ZWJwYWNrX3JlcXVpcmVfXy5nKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSgpIHx8IHRoaXMgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDgpLFxuICAgICAgICBzID0gbigxMCksXG4gICAgICAgIGEgPSBuKDExKSxcbiAgICAgICAgbyA9IG4oMTIpLFxuICAgICAgICBsID0gbigxOCksXG4gICAgICAgIGMgPSBuKDM5KSxcbiAgICAgICAgaCA9IG4oNDIpLFxuICAgICAgICBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgIGUuZiA9IGkgPyBkIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIGUpIHtcbiAgICAgICAgdCA9IG8odCk7XG4gICAgICAgIGUgPSBsKGUpO1xuICAgICAgICBpZiAoaCkgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZCh0LCBlKTtcbiAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgaWYgKGModCwgZSkpIHJldHVybiBhKCFyKHMuZiwgdCwgZSksIHRbZV0pO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcpO1xuICAgICAgdC5leHBvcnRzID0gIWkoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gNyAhPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiA3O1xuICAgICAgICAgIH1cbiAgICAgICAgfSlbMV07XG4gICAgICB9KTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuICEhdCgpO1xuICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOSksXG4gICAgICAgIHIgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbiAgICAgIHQuZXhwb3J0cyA9IGkgPyByLmJpbmQocikgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiByLmFwcGx5KHIsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNyk7XG4gICAgICB0LmV4cG9ydHMgPSAhaShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKCkge30uYmluZCgpO1xuICAgICAgICByZXR1cm4gXCJmdW5jdGlvblwiICE9IHR5cGVvZiB0IHx8IHQuaGFzT3duUHJvcGVydHkoXCJwcm90b3R5cGVcIik7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSkgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBuID0ge30ucHJvcGVydHlJc0VudW1lcmFibGUsXG4gICAgICAgIGkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAgICAgICByID0gaSAmJiAhbi5jYWxsKHtcbiAgICAgICAgICAxOiAyXG4gICAgICAgIH0sIDEpO1xuICAgICAgZS5mID0gciA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKHQpIHtcbiAgICAgICAgdmFyIGUgPSBpKHRoaXMsIHQpO1xuICAgICAgICByZXR1cm4gISFlICYmIGUuZW51bWVyYWJsZTtcbiAgICAgIH0gOiBuO1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhKDEgJiB0KSxcbiAgICAgICAgICBjb25maWd1cmFibGU6ICEoMiAmIHQpLFxuICAgICAgICAgIHdyaXRhYmxlOiAhKDQgJiB0KSxcbiAgICAgICAgICB2YWx1ZTogZVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDEzKSxcbiAgICAgICAgciA9IG4oMTYpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGkocih0KSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbig3KSxcbiAgICAgICAgcyA9IG4oMTUpLFxuICAgICAgICBhID0gT2JqZWN0LFxuICAgICAgICBvID0gaShcIlwiLnNwbGl0KTtcbiAgICAgIHQuZXhwb3J0cyA9IHIoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIWEoXCJ6XCIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xuICAgICAgfSkgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJTdHJpbmdcIiA9PSBzKHQpID8gbyh0LCBcIlwiKSA6IGEodCk7XG4gICAgICB9IDogYTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDkpLFxuICAgICAgICByID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBzID0gci5jYWxsLFxuICAgICAgICBhID0gaSAmJiByLmJpbmQuYmluZChzLCBzKTtcbiAgICAgIHQuZXhwb3J0cyA9IGkgPyBhIDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcy5hcHBseSh0LCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IGkoe30udG9TdHJpbmcpLFxuICAgICAgICBzID0gaShcIlwiLnNsaWNlKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBzKHIodCksIDgsIC0xKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNyksXG4gICAgICAgIHIgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoaSh0KSkgdGhyb3cgcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgdCk7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBudWxsID09IHQ7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTkpLFxuICAgICAgICByID0gbigyMyk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGkodCwgXCJzdHJpbmdcIik7XG4gICAgICAgIHJldHVybiByKGUpID8gZSA6IGUgKyBcIlwiO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDgpLFxuICAgICAgICByID0gbigyMCksXG4gICAgICAgIHMgPSBuKDIzKSxcbiAgICAgICAgYSA9IG4oMzApLFxuICAgICAgICBvID0gbigzMyksXG4gICAgICAgIGwgPSBuKDM0KSxcbiAgICAgICAgYyA9IFR5cGVFcnJvcixcbiAgICAgICAgaCA9IGwoXCJ0b1ByaW1pdGl2ZVwiKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGlmICghcih0KSB8fCBzKHQpKSByZXR1cm4gdDtcbiAgICAgICAgdmFyIG4sXG4gICAgICAgICAgbCA9IGEodCwgaCk7XG4gICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gXCJkZWZhdWx0XCIpO1xuICAgICAgICAgIG4gPSBpKGwsIHQsIGUpO1xuICAgICAgICAgIGlmICghcihuKSB8fCBzKG4pKSByZXR1cm4gbjtcbiAgICAgICAgICB0aHJvdyBjKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IFwibnVtYmVyXCIpO1xuICAgICAgICByZXR1cm4gbyh0LCBlKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyMSksXG4gICAgICAgIHIgPSBuKDIyKSxcbiAgICAgICAgcyA9IHIuYWxsO1xuICAgICAgdC5leHBvcnRzID0gci5JU19IVE1MRERBID8gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgPyBudWxsICE9PSB0IDogaSh0KSB8fCB0ID09PSBzO1xuICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcIm9iamVjdFwiID09IHR5cGVvZiB0ID8gbnVsbCAhPT0gdCA6IGkodCk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjIpLFxuICAgICAgICByID0gaS5hbGw7XG4gICAgICB0LmV4cG9ydHMgPSBpLklTX0hUTUxEREEgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJmdW5jdGlvblwiID09IHR5cGVvZiB0IHx8IHQgPT09IHI7XG4gICAgICB9IDogZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdDtcbiAgICAgIH07XG4gICAgfSwgdCA9PiB7XG4gICAgICB2YXIgZSA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIGRvY3VtZW50ICYmIGRvY3VtZW50LmFsbCxcbiAgICAgICAgbiA9IHZvaWQgMCA9PT0gZSAmJiB2b2lkIDAgIT09IGU7XG4gICAgICB0LmV4cG9ydHMgPSB7XG4gICAgICAgIGFsbDogZSxcbiAgICAgICAgSVNfSFRNTEREQTogblxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI0KSxcbiAgICAgICAgciA9IG4oMjEpLFxuICAgICAgICBzID0gbigyNSksXG4gICAgICAgIGEgPSBuKDI2KSxcbiAgICAgICAgbyA9IE9iamVjdDtcbiAgICAgIHQuZXhwb3J0cyA9IGEgPyBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgdDtcbiAgICAgIH0gOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGkoXCJTeW1ib2xcIik7XG4gICAgICAgIHJldHVybiByKGUpICYmIHMoZS5wcm90b3R5cGUsIG8odCkpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbigyMSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyAobiA9IGlbdF0sIHIobikgPyBuIDogdm9pZCAwKSA6IGlbdF0gJiYgaVt0XVtlXTtcbiAgICAgICAgdmFyIG47XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpO1xuICAgICAgdC5leHBvcnRzID0gaSh7fS5pc1Byb3RvdHlwZU9mKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI3KTtcbiAgICAgIHQuZXhwb3J0cyA9IGkgJiYgIVN5bWJvbC5zaGFtICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvcjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI4KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDQpLlN0cmluZztcbiAgICAgIHQuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gU3ltYm9sKCk7XG4gICAgICAgIHJldHVybiAhcyh0KSB8fCAhKE9iamVjdCh0KSBpbnN0YW5jZW9mIFN5bWJvbCkgfHwgIVN5bWJvbC5zaGFtICYmIGkgJiYgaSA8IDQxO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpLFxuICAgICAgICByLFxuICAgICAgICBzID0gbig0KSxcbiAgICAgICAgYSA9IG4oMjkpLFxuICAgICAgICBvID0gcy5wcm9jZXNzLFxuICAgICAgICBsID0gcy5EZW5vLFxuICAgICAgICBjID0gbyAmJiBvLnZlcnNpb25zIHx8IGwgJiYgbC52ZXJzaW9uLFxuICAgICAgICBoID0gYyAmJiBjLnY4O1xuICAgICAgaCAmJiAociA9IChpID0gaC5zcGxpdChcIi5cIikpWzBdID4gMCAmJiBpWzBdIDwgNCA/IDEgOiArKGlbMF0gKyBpWzFdKSk7XG4gICAgICAhciAmJiBhICYmICghKGkgPSBhLm1hdGNoKC9FZGdlXFwvKFxcZCspLykpIHx8IGlbMV0gPj0gNzQpICYmIChpID0gYS5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLykpICYmIChyID0gK2lbMV0pO1xuICAgICAgdC5leHBvcnRzID0gcjtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIG5hdmlnYXRvciAmJiBTdHJpbmcobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgXCJcIjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMxKSxcbiAgICAgICAgciA9IG4oMTcpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIG4gPSB0W2VdO1xuICAgICAgICByZXR1cm4gcihuKSA/IHZvaWQgMCA6IGkobik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjEpLFxuICAgICAgICByID0gbigzMiksXG4gICAgICAgIHMgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoaSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgIHRocm93IHMocih0KSArIFwiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHZhciBlID0gU3RyaW5nO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZSh0KTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiBcIk9iamVjdFwiO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOCksXG4gICAgICAgIHIgPSBuKDIxKSxcbiAgICAgICAgcyA9IG4oMjApLFxuICAgICAgICBhID0gVHlwZUVycm9yO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIG4sIG87XG4gICAgICAgIGlmIChcInN0cmluZ1wiID09PSBlICYmIHIobiA9IHQudG9TdHJpbmcpICYmICFzKG8gPSBpKG4sIHQpKSkgcmV0dXJuIG87XG4gICAgICAgIGlmIChyKG4gPSB0LnZhbHVlT2YpICYmICFzKG8gPSBpKG4sIHQpKSkgcmV0dXJuIG87XG4gICAgICAgIGlmIChcInN0cmluZ1wiICE9PSBlICYmIHIobiA9IHQudG9TdHJpbmcpICYmICFzKG8gPSBpKG4sIHQpKSkgcmV0dXJuIG87XG4gICAgICAgIHRocm93IGEoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNCksXG4gICAgICAgIHIgPSBuKDM1KSxcbiAgICAgICAgcyA9IG4oMzkpLFxuICAgICAgICBhID0gbig0MSksXG4gICAgICAgIG8gPSBuKDI3KSxcbiAgICAgICAgbCA9IG4oMjYpLFxuICAgICAgICBjID0gaS5TeW1ib2wsXG4gICAgICAgIGggPSByKFwid2tzXCIpLFxuICAgICAgICBkID0gbCA/IGMuZm9yIHx8IGMgOiBjICYmIGMud2l0aG91dFNldHRlciB8fCBhO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcyhoLCB0KSB8fCAoaFt0XSA9IG8gJiYgcyhjLCB0KSA/IGNbdF0gOiBkKFwiU3ltYm9sLlwiICsgdCkpO1xuICAgICAgICByZXR1cm4gaFt0XTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzNiksXG4gICAgICAgIHIgPSBuKDM3KTtcbiAgICAgICh0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByZXR1cm4gclt0XSB8fCAoclt0XSA9IHZvaWQgMCAhPT0gZSA/IGUgOiB7fSk7XG4gICAgICB9KShcInZlcnNpb25zXCIsIFtdKS5wdXNoKHtcbiAgICAgICAgdmVyc2lvbjogXCIzLjMxLjFcIixcbiAgICAgICAgbW9kZTogaSA/IFwicHVyZVwiIDogXCJnbG9iYWxcIixcbiAgICAgICAgY29weXJpZ2h0OiBcIsKpIDIwMTQtMjAyMyBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KVwiLFxuICAgICAgICBsaWNlbnNlOiBcImh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2Jsb2IvdjMuMzEuMS9MSUNFTlNFXCIsXG4gICAgICAgIHNvdXJjZTogXCJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qc1wiXG4gICAgICB9KTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9ICExO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNCksXG4gICAgICAgIHIgPSBuKDM4KSxcbiAgICAgICAgcyA9IFwiX19jb3JlLWpzX3NoYXJlZF9fXCIsXG4gICAgICAgIGEgPSBpW3NdIHx8IHIocywge30pO1xuICAgICAgdC5leHBvcnRzID0gYTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByKGksIHQsIHtcbiAgICAgICAgICAgIHZhbHVlOiBlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChuKSB7XG4gICAgICAgICAgaVt0XSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbig0MCksXG4gICAgICAgIHMgPSBpKHt9Lmhhc093blByb3BlcnR5KTtcbiAgICAgIHQuZXhwb3J0cyA9IE9iamVjdC5oYXNPd24gfHwgZnVuY3Rpb24gaGFzT3duKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHMocih0KSwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTYpLFxuICAgICAgICByID0gT2JqZWN0O1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHIoaSh0KSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gMCxcbiAgICAgICAgcyA9IE1hdGgucmFuZG9tKCksXG4gICAgICAgIGEgPSBpKDEuLnRvU3RyaW5nKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiBcIlN5bWJvbChcIiArICh2b2lkIDAgPT09IHQgPyBcIlwiIDogdCkgKyBcIilfXCIgKyBhKCsrciArIHMsIDM2KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDQzKTtcbiAgICAgIHQuZXhwb3J0cyA9ICFpICYmICFyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDcgIT0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHMoXCJkaXZcIiksIFwiYVwiLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gNztcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmE7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbigyMCksXG4gICAgICAgIHMgPSBpLmRvY3VtZW50LFxuICAgICAgICBhID0gcihzKSAmJiByKHMuY3JlYXRlRWxlbWVudCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gYSA/IHMuY3JlYXRlRWxlbWVudCh0KSA6IHt9O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDYpLFxuICAgICAgICByID0gbig0NSksXG4gICAgICAgIHMgPSBuKDExKTtcbiAgICAgIHQuZXhwb3J0cyA9IGkgPyBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICByZXR1cm4gci5mKHQsIGUsIHMoMSwgbikpO1xuICAgICAgfSA6IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHRbZV0gPSBuO1xuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2KSxcbiAgICAgICAgciA9IG4oNDIpLFxuICAgICAgICBzID0gbig0NiksXG4gICAgICAgIGEgPSBuKDQ3KSxcbiAgICAgICAgbyA9IG4oMTgpLFxuICAgICAgICBsID0gVHlwZUVycm9yLFxuICAgICAgICBjID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LFxuICAgICAgICBoID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgICAgICAgZCA9IFwiZW51bWVyYWJsZVwiLFxuICAgICAgICB1ID0gXCJjb25maWd1cmFibGVcIixcbiAgICAgICAgcCA9IFwid3JpdGFibGVcIjtcbiAgICAgIGUuZiA9IGkgPyBzID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCwgZSwgbikge1xuICAgICAgICBhKHQpO1xuICAgICAgICBlID0gbyhlKTtcbiAgICAgICAgYShuKTtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdCAmJiBcInByb3RvdHlwZVwiID09PSBlICYmIFwidmFsdWVcIiBpbiBuICYmIHAgaW4gbiAmJiAhbltwXSkge1xuICAgICAgICAgIHZhciBpID0gaCh0LCBlKTtcbiAgICAgICAgICBpZiAoaSAmJiBpW3BdKSB7XG4gICAgICAgICAgICB0W2VdID0gbi52YWx1ZTtcbiAgICAgICAgICAgIG4gPSB7XG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdSBpbiBuID8gblt1XSA6IGlbdV0sXG4gICAgICAgICAgICAgIGVudW1lcmFibGU6IGQgaW4gbiA/IG5bZF0gOiBpW2RdLFxuICAgICAgICAgICAgICB3cml0YWJsZTogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjKHQsIGUsIG4pO1xuICAgICAgfSA6IGMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0LCBlLCBuKSB7XG4gICAgICAgIGEodCk7XG4gICAgICAgIGUgPSBvKGUpO1xuICAgICAgICBhKG4pO1xuICAgICAgICBpZiAocikgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYyh0LCBlLCBuKTtcbiAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgaWYgKFwiZ2V0XCIgaW4gbiB8fCBcInNldFwiIGluIG4pIHRocm93IGwoXCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgXCJ2YWx1ZVwiIGluIG4gJiYgKHRbZV0gPSBuLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDcpO1xuICAgICAgdC5leHBvcnRzID0gaSAmJiByKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIDQyICE9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7fSwgXCJwcm90b3R5cGVcIiwge1xuICAgICAgICAgIHZhbHVlOiA0MixcbiAgICAgICAgICB3cml0YWJsZTogITFcbiAgICAgICAgfSkucHJvdG90eXBlO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyMCksXG4gICAgICAgIHIgPSBTdHJpbmcsXG4gICAgICAgIHMgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoaSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgIHRocm93IHMocih0KSArIFwiIGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjEpLFxuICAgICAgICByID0gbig0NSksXG4gICAgICAgIHMgPSBuKDQ5KSxcbiAgICAgICAgYSA9IG4oMzgpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4sIG8pIHtcbiAgICAgICAgbyB8fCAobyA9IHt9KTtcbiAgICAgICAgdmFyIGwgPSBvLmVudW1lcmFibGUsXG4gICAgICAgICAgYyA9IHZvaWQgMCAhPT0gby5uYW1lID8gby5uYW1lIDogZTtcbiAgICAgICAgaShuKSAmJiBzKG4sIGMsIG8pO1xuICAgICAgICBpZiAoby5nbG9iYWwpIGwgPyB0W2VdID0gbiA6IGEoZSwgbik7ZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG8udW5zYWZlID8gdFtlXSAmJiAobCA9ICEwKSA6IGRlbGV0ZSB0W2VdO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgbCA/IHRbZV0gPSBuIDogci5mKHQsIGUsIHtcbiAgICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICFvLm5vbkNvbmZpZ3VyYWJsZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiAhby5ub25Xcml0YWJsZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDIxKSxcbiAgICAgICAgYSA9IG4oMzkpLFxuICAgICAgICBvID0gbig2KSxcbiAgICAgICAgbCA9IG4oNTApLkNPTkZJR1VSQUJMRSxcbiAgICAgICAgYyA9IG4oNTEpLFxuICAgICAgICBoID0gbig1MiksXG4gICAgICAgIGQgPSBoLmVuZm9yY2UsXG4gICAgICAgIHUgPSBoLmdldCxcbiAgICAgICAgcCA9IFN0cmluZyxcbiAgICAgICAgZiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSxcbiAgICAgICAgZyA9IGkoXCJcIi5zbGljZSksXG4gICAgICAgIG0gPSBpKFwiXCIucmVwbGFjZSksXG4gICAgICAgIGIgPSBpKFtdLmpvaW4pLFxuICAgICAgICB2ID0gbyAmJiAhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIDggIT09IGYoZnVuY3Rpb24gKCkge30sIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiA4XG4gICAgICAgICAgfSkubGVuZ3RoO1xuICAgICAgICB9KSxcbiAgICAgICAgeSA9IFN0cmluZyhTdHJpbmcpLnNwbGl0KFwiU3RyaW5nXCIpLFxuICAgICAgICBBID0gdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4pIHtcbiAgICAgICAgICBcIlN5bWJvbChcIiA9PT0gZyhwKGUpLCAwLCA3KSAmJiAoZSA9IFwiW1wiICsgbShwKGUpLCAvXlN5bWJvbFxcKChbXildKilcXCkvLCBcIiQxXCIpICsgXCJdXCIpO1xuICAgICAgICAgIG4gJiYgbi5nZXR0ZXIgJiYgKGUgPSBcImdldCBcIiArIGUpO1xuICAgICAgICAgIG4gJiYgbi5zZXR0ZXIgJiYgKGUgPSBcInNldCBcIiArIGUpO1xuICAgICAgICAgICghYSh0LCBcIm5hbWVcIikgfHwgbCAmJiB0Lm5hbWUgIT09IGUpICYmIChvID8gZih0LCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgICAgfSkgOiB0Lm5hbWUgPSBlKTtcbiAgICAgICAgICB2ICYmIG4gJiYgYShuLCBcImFyaXR5XCIpICYmIHQubGVuZ3RoICE9PSBuLmFyaXR5ICYmIGYodCwgXCJsZW5ndGhcIiwge1xuICAgICAgICAgICAgdmFsdWU6IG4uYXJpdHlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbiAmJiBhKG4sIFwiY29uc3RydWN0b3JcIikgJiYgbi5jb25zdHJ1Y3RvciA/IG8gJiYgZih0LCBcInByb3RvdHlwZVwiLCB7XG4gICAgICAgICAgICAgIHdyaXRhYmxlOiAhMVxuICAgICAgICAgICAgfSkgOiB0LnByb3RvdHlwZSAmJiAodC5wcm90b3R5cGUgPSB2b2lkIDApO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgdmFyIGkgPSBkKHQpO1xuICAgICAgICAgIGEoaSwgXCJzb3VyY2VcIikgfHwgKGkuc291cmNlID0gYih5LCBcInN0cmluZ1wiID09IHR5cGVvZiBlID8gZSA6IFwiXCIpKTtcbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfTtcbiAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IEEoZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBzKHRoaXMpICYmIHUodGhpcykuc291cmNlIHx8IGModGhpcyk7XG4gICAgICB9LCBcInRvU3RyaW5nXCIpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDM5KSxcbiAgICAgICAgcyA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICAgICAgYSA9IGkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgICAgICAgbyA9IHIocywgXCJuYW1lXCIpLFxuICAgICAgICBsID0gbyAmJiBcInNvbWV0aGluZ1wiID09PSBmdW5jdGlvbiBzb21ldGhpbmcoKSB7fS5uYW1lLFxuICAgICAgICBjID0gbyAmJiAoIWkgfHwgaSAmJiBhKHMsIFwibmFtZVwiKS5jb25maWd1cmFibGUpO1xuICAgICAgdC5leHBvcnRzID0ge1xuICAgICAgICBFWElTVFM6IG8sXG4gICAgICAgIFBST1BFUjogbCxcbiAgICAgICAgQ09ORklHVVJBQkxFOiBjXG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigyMSksXG4gICAgICAgIHMgPSBuKDM3KSxcbiAgICAgICAgYSA9IGkoRnVuY3Rpb24udG9TdHJpbmcpO1xuICAgICAgcihzLmluc3BlY3RTb3VyY2UpIHx8IChzLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gYSh0KTtcbiAgICAgIH0pO1xuICAgICAgdC5leHBvcnRzID0gcy5pbnNwZWN0U291cmNlO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSxcbiAgICAgICAgcixcbiAgICAgICAgcyxcbiAgICAgICAgYSA9IG4oNTMpLFxuICAgICAgICBvID0gbig0KSxcbiAgICAgICAgbCA9IG4oMjApLFxuICAgICAgICBjID0gbig0NCksXG4gICAgICAgIGggPSBuKDM5KSxcbiAgICAgICAgZCA9IG4oMzcpLFxuICAgICAgICB1ID0gbig1NCksXG4gICAgICAgIHAgPSBuKDU1KSxcbiAgICAgICAgZiA9IFwiT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWRcIixcbiAgICAgICAgZyA9IG8uVHlwZUVycm9yLFxuICAgICAgICBtID0gby5XZWFrTWFwO1xuICAgICAgaWYgKGEgfHwgZC5zdGF0ZSkge1xuICAgICAgICB2YXIgYiA9IGQuc3RhdGUgfHwgKGQuc3RhdGUgPSBuZXcgbSgpKTtcbiAgICAgICAgYi5nZXQgPSBiLmdldDtcbiAgICAgICAgYi5oYXMgPSBiLmhhcztcbiAgICAgICAgYi5zZXQgPSBiLnNldDtcbiAgICAgICAgaSA9IGZ1bmN0aW9uIGkodCwgZSkge1xuICAgICAgICAgIGlmIChiLmhhcyh0KSkgdGhyb3cgZyhmKTtcbiAgICAgICAgICBlLmZhY2FkZSA9IHQ7XG4gICAgICAgICAgYi5zZXQodCwgZSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH07XG4gICAgICAgIHIgPSBmdW5jdGlvbiByKHQpIHtcbiAgICAgICAgICByZXR1cm4gYi5nZXQodCkgfHwge307XG4gICAgICAgIH07XG4gICAgICAgIHMgPSBmdW5jdGlvbiBzKHQpIHtcbiAgICAgICAgICByZXR1cm4gYi5oYXModCk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdiA9IHUoXCJzdGF0ZVwiKTtcbiAgICAgICAgcFt2XSA9ICEwO1xuICAgICAgICBpID0gZnVuY3Rpb24gaSh0LCBlKSB7XG4gICAgICAgICAgaWYgKGgodCwgdikpIHRocm93IGcoZik7XG4gICAgICAgICAgZS5mYWNhZGUgPSB0O1xuICAgICAgICAgIGModCwgdiwgZSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH07XG4gICAgICAgIHIgPSBmdW5jdGlvbiByKHQpIHtcbiAgICAgICAgICByZXR1cm4gaCh0LCB2KSA/IHRbdl0gOiB7fTtcbiAgICAgICAgfTtcbiAgICAgICAgcyA9IGZ1bmN0aW9uIHModCkge1xuICAgICAgICAgIHJldHVybiBoKHQsIHYpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdC5leHBvcnRzID0ge1xuICAgICAgICBzZXQ6IGksXG4gICAgICAgIGdldDogcixcbiAgICAgICAgaGFzOiBzLFxuICAgICAgICBlbmZvcmNlOiBmdW5jdGlvbiBlbmZvcmNlKHQpIHtcbiAgICAgICAgICByZXR1cm4gcyh0KSA/IHIodCkgOiBpKHQsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0dGVyRm9yOiBmdW5jdGlvbiBnZXR0ZXJGb3IodCkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIG47XG4gICAgICAgICAgICBpZiAoIWwoZSkgfHwgKG4gPSByKGUpKS50eXBlICE9PSB0KSB0aHJvdyBnKFwiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCBcIiArIHQgKyBcIiByZXF1aXJlZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig0KSxcbiAgICAgICAgciA9IG4oMjEpLFxuICAgICAgICBzID0gaS5XZWFrTWFwO1xuICAgICAgdC5leHBvcnRzID0gcihzKSAmJiAvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKHMpKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDM1KSxcbiAgICAgICAgciA9IG4oNDEpLFxuICAgICAgICBzID0gaShcImtleXNcIik7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gc1t0XSB8fCAoc1t0XSA9IHIodCkpO1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IHt9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMzkpLFxuICAgICAgICByID0gbig1NyksXG4gICAgICAgIHMgPSBuKDUpLFxuICAgICAgICBhID0gbig0NSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICBmb3IgKHZhciBvID0gcihlKSwgbCA9IGEuZiwgYyA9IHMuZiwgaCA9IDA7IGggPCBvLmxlbmd0aDsgaCsrKSB7XG4gICAgICAgICAgdmFyIGQgPSBvW2hdO1xuICAgICAgICAgIGkodCwgZCkgfHwgbiAmJiBpKG4sIGQpIHx8IGwodCwgZCwgYyhlLCBkKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyNCksXG4gICAgICAgIHIgPSBuKDE0KSxcbiAgICAgICAgcyA9IG4oNTgpLFxuICAgICAgICBhID0gbig2NyksXG4gICAgICAgIG8gPSBuKDQ3KSxcbiAgICAgICAgbCA9IHIoW10uY29uY2F0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGkoXCJSZWZsZWN0XCIsIFwib3duS2V5c1wiKSB8fCBmdW5jdGlvbiBvd25LZXlzKHQpIHtcbiAgICAgICAgdmFyIGUgPSBzLmYobyh0KSksXG4gICAgICAgICAgbiA9IGEuZjtcbiAgICAgICAgcmV0dXJuIG4gPyBsKGUsIG4odCkpIDogZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig1OSksXG4gICAgICAgIHIgPSBuKDY2KS5jb25jYXQoXCJsZW5ndGhcIiwgXCJwcm90b3R5cGVcIik7XG4gICAgICBlLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKHQpIHtcbiAgICAgICAgcmV0dXJuIGkodCwgcik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigzOSksXG4gICAgICAgIHMgPSBuKDEyKSxcbiAgICAgICAgYSA9IG4oNjApLmluZGV4T2YsXG4gICAgICAgIG8gPSBuKDU1KSxcbiAgICAgICAgbCA9IGkoW10ucHVzaCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgbixcbiAgICAgICAgICBpID0gcyh0KSxcbiAgICAgICAgICBjID0gMCxcbiAgICAgICAgICBoID0gW107XG4gICAgICAgIGZvciAobiBpbiBpKSAhcihvLCBuKSAmJiByKGksIG4pICYmIGwoaCwgbik7XG4gICAgICAgIGZvciAoOyBlLmxlbmd0aCA+IGM7KSByKGksIG4gPSBlW2MrK10pICYmICh+YShoLCBuKSB8fCBsKGgsIG4pKTtcbiAgICAgICAgcmV0dXJuIGg7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTIpLFxuICAgICAgICByID0gbig2MSksXG4gICAgICAgIHMgPSBuKDY0KSxcbiAgICAgICAgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gY3JlYXRlTWV0aG9kKHQpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIG4sIGEpIHtcbiAgICAgICAgICAgIHZhciBvLFxuICAgICAgICAgICAgICBsID0gaShlKSxcbiAgICAgICAgICAgICAgYyA9IHMobCksXG4gICAgICAgICAgICAgIGggPSByKGEsIGMpO1xuICAgICAgICAgICAgaWYgKHQgJiYgbiAhPSBuKSB7XG4gICAgICAgICAgICAgIGZvciAoOyBjID4gaDspIGlmICgobyA9IGxbaCsrXSkgIT0gbykgcmV0dXJuICEwO1xuICAgICAgICAgICAgfSBlbHNlIGZvciAoOyBjID4gaDsgaCsrKSBpZiAoKHQgfHwgaCBpbiBsKSAmJiBsW2hdID09PSBuKSByZXR1cm4gdCB8fCBoIHx8IDA7XG4gICAgICAgICAgICByZXR1cm4gIXQgJiYgLTE7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIHQuZXhwb3J0cyA9IHtcbiAgICAgICAgaW5jbHVkZXM6IGNyZWF0ZU1ldGhvZCghMCksXG4gICAgICAgIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZCghMSlcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2MiksXG4gICAgICAgIHIgPSBNYXRoLm1heCxcbiAgICAgICAgcyA9IE1hdGgubWluO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgdmFyIG4gPSBpKHQpO1xuICAgICAgICByZXR1cm4gbiA8IDAgPyByKG4gKyBlLCAwKSA6IHMobiwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNjMpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSArdDtcbiAgICAgICAgcmV0dXJuIGUgIT0gZSB8fCAwID09PSBlID8gMCA6IGkoZSk7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdmFyIGUgPSBNYXRoLmNlaWwsXG4gICAgICAgIG4gPSBNYXRoLmZsb29yO1xuICAgICAgdC5leHBvcnRzID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiB0cnVuYyh0KSB7XG4gICAgICAgIHZhciBpID0gK3Q7XG4gICAgICAgIHJldHVybiAoaSA+IDAgPyBuIDogZSkoaSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNjUpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIGkodC5sZW5ndGgpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDYyKSxcbiAgICAgICAgciA9IE1hdGgubWluO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgcmV0dXJuIHQgPiAwID8gcihpKHQpLCA5MDA3MTk5MjU0NzQwOTkxKSA6IDA7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gW1wiY29uc3RydWN0b3JcIiwgXCJoYXNPd25Qcm9wZXJ0eVwiLCBcImlzUHJvdG90eXBlT2ZcIiwgXCJwcm9wZXJ0eUlzRW51bWVyYWJsZVwiLCBcInRvTG9jYWxlU3RyaW5nXCIsIFwidG9TdHJpbmdcIiwgXCJ2YWx1ZU9mXCJdO1xuICAgIH0sICh0LCBlKSA9PiB7XG4gICAgICBlLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNyksXG4gICAgICAgIHIgPSBuKDIxKSxcbiAgICAgICAgcyA9IC8jfFxcLnByb3RvdHlwZVxcLi8sXG4gICAgICAgIGlzRm9yY2VkID0gZnVuY3Rpb24gaXNGb3JjZWQodCwgZSkge1xuICAgICAgICAgIHZhciBuID0gb1thKHQpXTtcbiAgICAgICAgICByZXR1cm4gbiA9PSBjIHx8IG4gIT0gbCAmJiAocihlKSA/IGkoZSkgOiAhIWUpO1xuICAgICAgICB9LFxuICAgICAgICBhID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UocywgXCIuXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG8gPSBpc0ZvcmNlZC5kYXRhID0ge30sXG4gICAgICAgIGwgPSBpc0ZvcmNlZC5OQVRJVkUgPSBcIk5cIixcbiAgICAgICAgYyA9IGlzRm9yY2VkLlBPTFlGSUxMID0gXCJQXCI7XG4gICAgICB0LmV4cG9ydHMgPSBpc0ZvcmNlZDtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDkpLFxuICAgICAgICByID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBzID0gci5hcHBseSxcbiAgICAgICAgYSA9IHIuY2FsbDtcbiAgICAgIHQuZXhwb3J0cyA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIFJlZmxlY3QgJiYgUmVmbGVjdC5hcHBseSB8fCAoaSA/IGEuYmluZChzKSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGEuYXBwbHkocywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDI0KSxcbiAgICAgICAgciA9IG4oMzkpLFxuICAgICAgICBzID0gbig0NCksXG4gICAgICAgIGEgPSBuKDI1KSxcbiAgICAgICAgbyA9IG4oNzEpLFxuICAgICAgICBsID0gbig1NiksXG4gICAgICAgIGMgPSBuKDc0KSxcbiAgICAgICAgaCA9IG4oNzUpLFxuICAgICAgICBkID0gbig3NiksXG4gICAgICAgIHUgPSBuKDgwKSxcbiAgICAgICAgcCA9IG4oODEpLFxuICAgICAgICBmID0gbig2KSxcbiAgICAgICAgZyA9IG4oMzYpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4sIG0pIHtcbiAgICAgICAgdmFyIGIgPSBcInN0YWNrVHJhY2VMaW1pdFwiLFxuICAgICAgICAgIHYgPSBtID8gMiA6IDEsXG4gICAgICAgICAgeSA9IHQuc3BsaXQoXCIuXCIpLFxuICAgICAgICAgIEEgPSB5W3kubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgXyA9IGkuYXBwbHkobnVsbCwgeSk7XG4gICAgICAgIGlmIChfKSB7XG4gICAgICAgICAgdmFyIFMgPSBfLnByb3RvdHlwZTtcbiAgICAgICAgICAhZyAmJiByKFMsIFwiY2F1c2VcIikgJiYgZGVsZXRlIFMuY2F1c2U7XG4gICAgICAgICAgaWYgKCFuKSByZXR1cm4gXztcbiAgICAgICAgICB2YXIgRSA9IGkoXCJFcnJvclwiKSxcbiAgICAgICAgICAgIHggPSBlKGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgICAgIHZhciBuID0gZChtID8gZSA6IHQsIHZvaWQgMCksXG4gICAgICAgICAgICAgICAgaSA9IG0gPyBuZXcgXyh0KSA6IG5ldyBfKCk7XG4gICAgICAgICAgICAgIHZvaWQgMCAhPT0gbiAmJiBzKGksIFwibWVzc2FnZVwiLCBuKTtcbiAgICAgICAgICAgICAgcChpLCB4LCBpLnN0YWNrLCAyKTtcbiAgICAgICAgICAgICAgdGhpcyAmJiBhKFMsIHRoaXMpICYmIGgoaSwgdGhpcywgeCk7XG4gICAgICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiB2ICYmIHUoaSwgYXJndW1lbnRzW3ZdKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB4LnByb3RvdHlwZSA9IFM7XG4gICAgICAgICAgaWYgKFwiRXJyb3JcIiAhPT0gQSkgbyA/IG8oeCwgRSkgOiBsKHgsIEUsIHtcbiAgICAgICAgICAgIG5hbWU6ICEwXG4gICAgICAgICAgfSk7ZWxzZSBpZiAoZiAmJiBiIGluIF8pIHtcbiAgICAgICAgICAgIGMoeCwgXywgYik7XG4gICAgICAgICAgICBjKHgsIF8sIFwicHJlcGFyZVN0YWNrVHJhY2VcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGwoeCwgXyk7XG4gICAgICAgICAgaWYgKCFnKSB0cnkge1xuICAgICAgICAgICAgUy5uYW1lICE9PSBBICYmIHMoUywgXCJuYW1lXCIsIEEpO1xuICAgICAgICAgICAgUy5jb25zdHJ1Y3RvciA9IHg7XG4gICAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcyKSxcbiAgICAgICAgciA9IG4oNDcpLFxuICAgICAgICBzID0gbig3Myk7XG4gICAgICB0LmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKFwiX19wcm90b19fXCIgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0LFxuICAgICAgICAgIGUgPSAhMSxcbiAgICAgICAgICBuID0ge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgKHQgPSBpKE9iamVjdC5wcm90b3R5cGUsIFwiX19wcm90b19fXCIsIFwic2V0XCIpKShuLCBbXSk7XG4gICAgICAgICAgZSA9IG4gaW5zdGFuY2VvZiBBcnJheTtcbiAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKG4sIGkpIHtcbiAgICAgICAgICByKG4pO1xuICAgICAgICAgIHMoaSk7XG4gICAgICAgICAgZSA/IHQobiwgaSkgOiBuLl9fcHJvdG9fXyA9IGk7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH07XG4gICAgICB9KCkgOiB2b2lkIDApO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigzMSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpKHIoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCBlKVtuXSkpO1xuICAgICAgICB9IGNhdGNoICh0KSB7fVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDIxKSxcbiAgICAgICAgciA9IFN0cmluZyxcbiAgICAgICAgcyA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB0IHx8IGkodCkpIHJldHVybiB0O1xuICAgICAgICB0aHJvdyBzKFwiQ2FuJ3Qgc2V0IFwiICsgcih0KSArIFwiIGFzIGEgcHJvdG90eXBlXCIpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQ1KS5mO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUsIG4pIHtcbiAgICAgICAgbiBpbiB0IHx8IGkodCwgbiwge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZVtuXTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KHQpIHtcbiAgICAgICAgICAgIGVbbl0gPSB0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjEpLFxuICAgICAgICByID0gbigyMCksXG4gICAgICAgIHMgPSBuKDcxKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHZhciBhLCBvO1xuICAgICAgICBzICYmIGkoYSA9IGUuY29uc3RydWN0b3IpICYmIGEgIT09IG4gJiYgcihvID0gYS5wcm90b3R5cGUpICYmIG8gIT09IG4ucHJvdG90eXBlICYmIHModCwgbyk7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDc3KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQgPyBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IFwiXCIgOiBlIDogaSh0KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3OCksXG4gICAgICAgIHIgPSBTdHJpbmc7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoXCJTeW1ib2xcIiA9PT0gaSh0KSkgdGhyb3cgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmdcIik7XG4gICAgICAgIHJldHVybiByKHQpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDc5KSxcbiAgICAgICAgciA9IG4oMjEpLFxuICAgICAgICBzID0gbigxNSksXG4gICAgICAgIGEgPSBuKDM0KShcInRvU3RyaW5nVGFnXCIpLFxuICAgICAgICBvID0gT2JqZWN0LFxuICAgICAgICBsID0gXCJBcmd1bWVudHNcIiA9PSBzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzO1xuICAgICAgICB9KCkpO1xuICAgICAgdC5leHBvcnRzID0gaSA/IHMgOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSwgbiwgaTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdCA/IFwiVW5kZWZpbmVkXCIgOiBudWxsID09PSB0ID8gXCJOdWxsXCIgOiBcInN0cmluZ1wiID09IHR5cGVvZiAobiA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0W2VdO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgIH0oZSA9IG8odCksIGEpKSA/IG4gOiBsID8gcyhlKSA6IFwiT2JqZWN0XCIgPT0gKGkgPSBzKGUpKSAmJiByKGUuY2FsbGVlKSA/IFwiQXJndW1lbnRzXCIgOiBpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSB7fTtcbiAgICAgIGlbbigzNCkoXCJ0b1N0cmluZ1RhZ1wiKV0gPSBcInpcIjtcbiAgICAgIHQuZXhwb3J0cyA9IFwiW29iamVjdCB6XVwiID09PSBTdHJpbmcoaSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyMCksXG4gICAgICAgIHIgPSBuKDQ0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGkoZSkgJiYgXCJjYXVzZVwiIGluIGUgJiYgcih0LCBcImNhdXNlXCIsIGUuY2F1c2UpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDQ0KSxcbiAgICAgICAgciA9IG4oODIpLFxuICAgICAgICBzID0gbig4MyksXG4gICAgICAgIGEgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuLCBvKSB7XG4gICAgICAgIHMgJiYgKGEgPyBhKHQsIGUpIDogaSh0LCBcInN0YWNrXCIsIHIobiwgbykpKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNCksXG4gICAgICAgIHIgPSBFcnJvcixcbiAgICAgICAgcyA9IGkoXCJcIi5yZXBsYWNlKSxcbiAgICAgICAgYSA9IFN0cmluZyhyKFwienhjYXNkXCIpLnN0YWNrKSxcbiAgICAgICAgbyA9IC9cXG5cXHMqYXQgW146XSo6W15cXG5dKi8sXG4gICAgICAgIGwgPSBvLnRlc3QoYSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAobCAmJiBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmICFyLnByZXBhcmVTdGFja1RyYWNlKSBmb3IgKDsgZS0tOykgdCA9IHModCwgbywgXCJcIik7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcpLFxuICAgICAgICByID0gbigxMSk7XG4gICAgICB0LmV4cG9ydHMgPSAhaShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0ID0gRXJyb3IoXCJhXCIpO1xuICAgICAgICBpZiAoIShcInN0YWNrXCIgaW4gdCkpIHJldHVybiAhMDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwic3RhY2tcIiwgcigxLCA3KSk7XG4gICAgICAgIHJldHVybiA3ICE9PSB0LnN0YWNrO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oNDgpLFxuICAgICAgICByID0gbigxNCksXG4gICAgICAgIHMgPSBuKDc3KSxcbiAgICAgICAgYSA9IG4oODUpLFxuICAgICAgICBvID0gVVJMU2VhcmNoUGFyYW1zLFxuICAgICAgICBsID0gby5wcm90b3R5cGUsXG4gICAgICAgIGMgPSByKGwuYXBwZW5kKSxcbiAgICAgICAgaCA9IHIobC5kZWxldGUpLFxuICAgICAgICBkID0gcihsLmZvckVhY2gpLFxuICAgICAgICB1ID0gcihbXS5wdXNoKSxcbiAgICAgICAgcCA9IG5ldyBvKFwiYT0xJmE9MlwiKTtcbiAgICAgIHAuZGVsZXRlKFwiYVwiLCAxKTtcbiAgICAgIHAgKyBcIlwiICE9IFwiYT0yXCIgJiYgaShsLCBcImRlbGV0ZVwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgbiA9IGUgPCAyID8gdm9pZCAwIDogYXJndW1lbnRzWzFdO1xuICAgICAgICBpZiAoZSAmJiB2b2lkIDAgPT09IG4pIHJldHVybiBoKHRoaXMsIHQpO1xuICAgICAgICB2YXIgaSA9IFtdO1xuICAgICAgICBkKHRoaXMsIGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgICAgdShpLCB7XG4gICAgICAgICAgICBrZXk6IGUsXG4gICAgICAgICAgICB2YWx1ZTogdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYShlLCAxKTtcbiAgICAgICAgZm9yICh2YXIgciwgbyA9IHModCksIGwgPSBzKG4pLCBwID0gMCwgZiA9IDAsIGcgPSAhMSwgbSA9IGkubGVuZ3RoOyBwIDwgbTspIHtcbiAgICAgICAgICByID0gaVtwKytdO1xuICAgICAgICAgIGlmIChnIHx8IHIua2V5ID09PSBvKSB7XG4gICAgICAgICAgICBnID0gITA7XG4gICAgICAgICAgICBoKHRoaXMsIHIua2V5KTtcbiAgICAgICAgICB9IGVsc2UgZisrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBmIDwgbTspIChyID0gaVtmKytdKS5rZXkgPT09IG8gJiYgci52YWx1ZSA9PT0gbCB8fCBjKHRoaXMsIHIua2V5LCByLnZhbHVlKTtcbiAgICAgIH0sIHtcbiAgICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICAgIHVuc2FmZTogITBcbiAgICAgIH0pO1xuICAgIH0sIHQgPT4ge1xuICAgICAgdmFyIGUgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgbikge1xuICAgICAgICBpZiAodCA8IG4pIHRocm93IGUoXCJOb3QgZW5vdWdoIGFyZ3VtZW50c1wiKTtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDQ4KSxcbiAgICAgICAgciA9IG4oMTQpLFxuICAgICAgICBzID0gbig3NyksXG4gICAgICAgIGEgPSBuKDg1KSxcbiAgICAgICAgbyA9IFVSTFNlYXJjaFBhcmFtcyxcbiAgICAgICAgbCA9IG8ucHJvdG90eXBlLFxuICAgICAgICBjID0gcihsLmdldEFsbCksXG4gICAgICAgIGggPSByKGwuaGFzKTtcbiAgICAgIG5ldyBvKFwiYT0xXCIpLmhhcyhcImFcIiwgMikgJiYgaShsLCBcImhhc1wiLCBmdW5jdGlvbiBoYXModCkge1xuICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgbiA9IGUgPCAyID8gdm9pZCAwIDogYXJndW1lbnRzWzFdO1xuICAgICAgICBpZiAoZSAmJiB2b2lkIDAgPT09IG4pIHJldHVybiBoKHRoaXMsIHQpO1xuICAgICAgICB2YXIgaSA9IGModGhpcywgdCk7XG4gICAgICAgIGEoZSwgMSk7XG4gICAgICAgIGZvciAodmFyIHIgPSBzKG4pLCBvID0gMDsgbyA8IGkubGVuZ3RoOykgaWYgKGlbbysrXSA9PT0gcikgcmV0dXJuICEwO1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9LCB7XG4gICAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgICB1bnNhZmU6ICEwXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbig2KSxcbiAgICAgICAgciA9IG4oMTQpLFxuICAgICAgICBzID0gbig4OCksXG4gICAgICAgIGEgPSBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLFxuICAgICAgICBvID0gcihhLmZvckVhY2gpO1xuICAgICAgaSAmJiAhKFwic2l6ZVwiIGluIGEpICYmIHMoYSwgXCJzaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgICAgIHZhciB0ID0gMDtcbiAgICAgICAgICBvKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHQrKztcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgZW51bWVyYWJsZTogITBcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNDkpLFxuICAgICAgICByID0gbig0NSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICBuLmdldCAmJiBpKG4uZ2V0LCBlLCB7XG4gICAgICAgICAgZ2V0dGVyOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgbi5zZXQgJiYgaShuLnNldCwgZSwge1xuICAgICAgICAgIHNldHRlcjogITBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByLmYodCwgZSwgbik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbig0MCksXG4gICAgICAgIHMgPSBuKDY0KSxcbiAgICAgICAgYSA9IG4oOTApLFxuICAgICAgICBvID0gbig5Mik7XG4gICAgICBpKHtcbiAgICAgICAgdGFyZ2V0OiBcIkFycmF5XCIsXG4gICAgICAgIHByb3RvOiAhMCxcbiAgICAgICAgYXJpdHk6IDEsXG4gICAgICAgIGZvcmNlZDogbig3KShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIDQyOTQ5NjcyOTcgIT09IFtdLnB1c2guY2FsbCh7XG4gICAgICAgICAgICBsZW5ndGg6IDQyOTQ5NjcyOTZcbiAgICAgICAgICB9LCAxKTtcbiAgICAgICAgfSkgfHwgIWZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCBcImxlbmd0aFwiLCB7XG4gICAgICAgICAgICAgIHdyaXRhYmxlOiAhMVxuICAgICAgICAgICAgfSkucHVzaCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSgpXG4gICAgICB9LCB7XG4gICAgICAgIHB1c2g6IGZ1bmN0aW9uIHB1c2godCkge1xuICAgICAgICAgIHZhciBlID0gcih0aGlzKSxcbiAgICAgICAgICAgIG4gPSBzKGUpLFxuICAgICAgICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgbyhuICsgaSk7XG4gICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBpOyBsKyspIHtcbiAgICAgICAgICAgIGVbbl0gPSBhcmd1bWVudHNbbF07XG4gICAgICAgICAgICBuKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGEoZSwgbik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDYpLFxuICAgICAgICByID0gbig5MSksXG4gICAgICAgIHMgPSBUeXBlRXJyb3IsXG4gICAgICAgIGEgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAgICAgICBvID0gaSAmJiAhZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHRoaXMpIHJldHVybiAhMDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCBcImxlbmd0aFwiLCB7XG4gICAgICAgICAgICAgIHdyaXRhYmxlOiAhMVxuICAgICAgICAgICAgfSkubGVuZ3RoID0gMTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0oKTtcbiAgICAgIHQuZXhwb3J0cyA9IG8gPyBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICBpZiAocih0KSAmJiAhYSh0LCBcImxlbmd0aFwiKS53cml0YWJsZSkgdGhyb3cgcyhcIkNhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGhcIik7XG4gICAgICAgIHJldHVybiB0Lmxlbmd0aCA9IGU7XG4gICAgICB9IDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHQubGVuZ3RoID0gZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNSk7XG4gICAgICB0LmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkodCkge1xuICAgICAgICByZXR1cm4gXCJBcnJheVwiID09IGkodCk7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdmFyIGUgPSBUeXBlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAodCA+IDkwMDcxOTkyNTQ3NDA5OTEpIHRocm93IGUoXCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWRcIik7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbig5NCksXG4gICAgICAgIHIgPSBuKDk4KS5maW5kTGFzdCxcbiAgICAgICAgcyA9IGkuYVR5cGVkQXJyYXk7XG4gICAgICAoMCwgaS5leHBvcnRUeXBlZEFycmF5TWV0aG9kKShcImZpbmRMYXN0XCIsIGZ1bmN0aW9uIGZpbmRMYXN0KHQpIHtcbiAgICAgICAgcmV0dXJuIHIocyh0aGlzKSwgdCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSxcbiAgICAgICAgcixcbiAgICAgICAgcyxcbiAgICAgICAgYSA9IG4oOTUpLFxuICAgICAgICBvID0gbig2KSxcbiAgICAgICAgbCA9IG4oNCksXG4gICAgICAgIGMgPSBuKDIxKSxcbiAgICAgICAgaCA9IG4oMjApLFxuICAgICAgICBkID0gbigzOSksXG4gICAgICAgIHUgPSBuKDc4KSxcbiAgICAgICAgcCA9IG4oMzIpLFxuICAgICAgICBmID0gbig0NCksXG4gICAgICAgIGcgPSBuKDQ4KSxcbiAgICAgICAgbSA9IG4oODgpLFxuICAgICAgICBiID0gbigyNSksXG4gICAgICAgIHYgPSBuKDk2KSxcbiAgICAgICAgeSA9IG4oNzEpLFxuICAgICAgICBBID0gbigzNCksXG4gICAgICAgIF8gPSBuKDQxKSxcbiAgICAgICAgUyA9IG4oNTIpLFxuICAgICAgICBFID0gUy5lbmZvcmNlLFxuICAgICAgICB4ID0gUy5nZXQsXG4gICAgICAgIHcgPSBsLkludDhBcnJheSxcbiAgICAgICAgQyA9IHcgJiYgdy5wcm90b3R5cGUsXG4gICAgICAgIFQgPSBsLlVpbnQ4Q2xhbXBlZEFycmF5LFxuICAgICAgICBQID0gVCAmJiBULnByb3RvdHlwZSxcbiAgICAgICAgayA9IHcgJiYgdih3KSxcbiAgICAgICAgTSA9IEMgJiYgdihDKSxcbiAgICAgICAgUiA9IE9iamVjdC5wcm90b3R5cGUsXG4gICAgICAgIEkgPSBsLlR5cGVFcnJvcixcbiAgICAgICAgRCA9IEEoXCJ0b1N0cmluZ1RhZ1wiKSxcbiAgICAgICAgTyA9IF8oXCJUWVBFRF9BUlJBWV9UQUdcIiksXG4gICAgICAgIEwgPSBcIlR5cGVkQXJyYXlDb25zdHJ1Y3RvclwiLFxuICAgICAgICBOID0gYSAmJiAhIXkgJiYgXCJPcGVyYVwiICE9PSB1KGwub3BlcmEpLFxuICAgICAgICBCID0gITEsXG4gICAgICAgIGogPSB7XG4gICAgICAgICAgSW50OEFycmF5OiAxLFxuICAgICAgICAgIFVpbnQ4QXJyYXk6IDEsXG4gICAgICAgICAgVWludDhDbGFtcGVkQXJyYXk6IDEsXG4gICAgICAgICAgSW50MTZBcnJheTogMixcbiAgICAgICAgICBVaW50MTZBcnJheTogMixcbiAgICAgICAgICBJbnQzMkFycmF5OiA0LFxuICAgICAgICAgIFVpbnQzMkFycmF5OiA0LFxuICAgICAgICAgIEZsb2F0MzJBcnJheTogNCxcbiAgICAgICAgICBGbG9hdDY0QXJyYXk6IDhcbiAgICAgICAgfSxcbiAgICAgICAgVSA9IHtcbiAgICAgICAgICBCaWdJbnQ2NEFycmF5OiA4LFxuICAgICAgICAgIEJpZ1VpbnQ2NEFycmF5OiA4XG4gICAgICAgIH0sXG4gICAgICAgIGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIGdldFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIGUgPSB2KHQpO1xuICAgICAgICAgIGlmIChoKGUpKSB7XG4gICAgICAgICAgICB2YXIgbiA9IHgoZSk7XG4gICAgICAgICAgICByZXR1cm4gbiAmJiBkKG4sIEwpID8gbltMXSA6IGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIGlzVHlwZWRBcnJheSh0KSB7XG4gICAgICAgICAgaWYgKCFoKHQpKSByZXR1cm4gITE7XG4gICAgICAgICAgdmFyIGUgPSB1KHQpO1xuICAgICAgICAgIHJldHVybiBkKGosIGUpIHx8IGQoVSwgZSk7XG4gICAgICAgIH07XG4gICAgICBmb3IgKGkgaW4gaikgKHMgPSAociA9IGxbaV0pICYmIHIucHJvdG90eXBlKSA/IEUocylbTF0gPSByIDogTiA9ICExO1xuICAgICAgZm9yIChpIGluIFUpIChzID0gKHIgPSBsW2ldKSAmJiByLnByb3RvdHlwZSkgJiYgKEUocylbTF0gPSByKTtcbiAgICAgIGlmICghTiB8fCAhYyhrKSB8fCBrID09PSBGdW5jdGlvbi5wcm90b3R5cGUpIHtcbiAgICAgICAgayA9IGZ1bmN0aW9uIFR5cGVkQXJyYXkoKSB7XG4gICAgICAgICAgdGhyb3cgSShcIkluY29ycmVjdCBpbnZvY2F0aW9uXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoTikgZm9yIChpIGluIGopIGxbaV0gJiYgeShsW2ldLCBrKTtcbiAgICAgIH1cbiAgICAgIGlmICghTiB8fCAhTSB8fCBNID09PSBSKSB7XG4gICAgICAgIE0gPSBrLnByb3RvdHlwZTtcbiAgICAgICAgaWYgKE4pIGZvciAoaSBpbiBqKSBsW2ldICYmIHkobFtpXS5wcm90b3R5cGUsIE0pO1xuICAgICAgfVxuICAgICAgTiAmJiB2KFApICE9PSBNICYmIHkoUCwgTSk7XG4gICAgICBpZiAobyAmJiAhZChNLCBEKSkge1xuICAgICAgICBCID0gITA7XG4gICAgICAgIG0oTSwgRCwge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCh0aGlzKSA/IHRoaXNbT10gOiB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChpIGluIGopIGxbaV0gJiYgZihsW2ldLCBPLCBpKTtcbiAgICAgIH1cbiAgICAgIHQuZXhwb3J0cyA9IHtcbiAgICAgICAgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzogTixcbiAgICAgICAgVFlQRURfQVJSQVlfVEFHOiBCICYmIE8sXG4gICAgICAgIGFUeXBlZEFycmF5OiBmdW5jdGlvbiBhVHlwZWRBcnJheSh0KSB7XG4gICAgICAgICAgaWYgKGlzVHlwZWRBcnJheSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgICAgdGhyb3cgSShcIlRhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheVwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjogZnVuY3Rpb24gYVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgaWYgKGModCkgJiYgKCF5IHx8IGIoaywgdCkpKSByZXR1cm4gdDtcbiAgICAgICAgICB0aHJvdyBJKHAodCkgKyBcIiBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvclwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXhwb3J0VHlwZWRBcnJheU1ldGhvZDogZnVuY3Rpb24gZXhwb3J0VHlwZWRBcnJheU1ldGhvZCh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICAgIGlmIChuKSBmb3IgKHZhciByIGluIGopIHtcbiAgICAgICAgICAgICAgdmFyIHMgPSBsW3JdO1xuICAgICAgICAgICAgICBpZiAocyAmJiBkKHMucHJvdG90eXBlLCB0KSkgdHJ5IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcy5wcm90b3R5cGVbdF07XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcy5wcm90b3R5cGVbdF0gPSBlO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE1bdF0gJiYgIW4gfHwgZyhNLCB0LCBuID8gZSA6IE4gJiYgQ1t0XSB8fCBlLCBpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6IGZ1bmN0aW9uIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QodCwgZSwgbikge1xuICAgICAgICAgIHZhciBpLCByO1xuICAgICAgICAgIGlmIChvKSB7XG4gICAgICAgICAgICBpZiAoeSkge1xuICAgICAgICAgICAgICBpZiAobikgZm9yIChpIGluIGopIGlmICgociA9IGxbaV0pICYmIGQociwgdCkpIHRyeSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJbdF07XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgIGlmIChrW3RdICYmICFuKSByZXR1cm47XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGcoaywgdCwgbiA/IGUgOiBOICYmIGtbdF0gfHwgZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgaW4gaikgIShyID0gbFtpXSkgfHwgclt0XSAmJiAhbiB8fCBnKHIsIHQsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yOiBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsXG4gICAgICAgIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KHQpIHtcbiAgICAgICAgICBpZiAoIWgodCkpIHJldHVybiAhMTtcbiAgICAgICAgICB2YXIgZSA9IHUodCk7XG4gICAgICAgICAgcmV0dXJuIFwiRGF0YVZpZXdcIiA9PT0gZSB8fCBkKGosIGUpIHx8IGQoVSwgZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGlzVHlwZWRBcnJheTogaXNUeXBlZEFycmF5LFxuICAgICAgICBUeXBlZEFycmF5OiBrLFxuICAgICAgICBUeXBlZEFycmF5UHJvdG90eXBlOiBNXG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgQXJyYXlCdWZmZXIgJiYgXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgRGF0YVZpZXc7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzOSksXG4gICAgICAgIHIgPSBuKDIxKSxcbiAgICAgICAgcyA9IG4oNDApLFxuICAgICAgICBhID0gbig1NCksXG4gICAgICAgIG8gPSBuKDk3KSxcbiAgICAgICAgbCA9IGEoXCJJRV9QUk9UT1wiKSxcbiAgICAgICAgYyA9IE9iamVjdCxcbiAgICAgICAgaCA9IGMucHJvdG90eXBlO1xuICAgICAgdC5leHBvcnRzID0gbyA/IGMuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHModCk7XG4gICAgICAgIGlmIChpKGUsIGwpKSByZXR1cm4gZVtsXTtcbiAgICAgICAgdmFyIG4gPSBlLmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gcihuKSAmJiBlIGluc3RhbmNlb2YgbiA/IG4ucHJvdG90eXBlIDogZSBpbnN0YW5jZW9mIGMgPyBoIDogbnVsbDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3KTtcbiAgICAgIHQuZXhwb3J0cyA9ICFpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gRigpIHt9XG4gICAgICAgIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDk5KSxcbiAgICAgICAgciA9IG4oMTMpLFxuICAgICAgICBzID0gbig0MCksXG4gICAgICAgIGEgPSBuKDY0KSxcbiAgICAgICAgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gY3JlYXRlTWV0aG9kKHQpIHtcbiAgICAgICAgICB2YXIgZSA9IDEgPT0gdDtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4sIG8sIGwpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGMsIGggPSBzKG4pLCBkID0gcihoKSwgdSA9IGkobywgbCksIHAgPSBhKGQpOyBwLS0gPiAwOykgaWYgKHUoYyA9IGRbcF0sIHAsIGgpKSBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZSA/IC0xIDogdm9pZCAwO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB0LmV4cG9ydHMgPSB7XG4gICAgICAgIGZpbmRMYXN0OiBjcmVhdGVNZXRob2QoMCksXG4gICAgICAgIGZpbmRMYXN0SW5kZXg6IGNyZWF0ZU1ldGhvZCgxKVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDEwMCksXG4gICAgICAgIHIgPSBuKDMxKSxcbiAgICAgICAgcyA9IG4oOSksXG4gICAgICAgIGEgPSBpKGkuYmluZCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICByKHQpO1xuICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlID8gdCA6IHMgPyBhKHQsIGUpIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB0LmFwcGx5KGUsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTUpLFxuICAgICAgICByID0gbigxNCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoXCJGdW5jdGlvblwiID09PSBpKHQpKSByZXR1cm4gcih0KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oOTQpLFxuICAgICAgICByID0gbig5OCkuZmluZExhc3RJbmRleCxcbiAgICAgICAgcyA9IGkuYVR5cGVkQXJyYXk7XG4gICAgICAoMCwgaS5leHBvcnRUeXBlZEFycmF5TWV0aG9kKShcImZpbmRMYXN0SW5kZXhcIiwgZnVuY3Rpb24gZmluZExhc3RJbmRleCh0KSB7XG4gICAgICAgIHJldHVybiByKHModGhpcyksIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwKTtcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDQpLFxuICAgICAgICByID0gbig4KSxcbiAgICAgICAgcyA9IG4oOTQpLFxuICAgICAgICBhID0gbig2NCksXG4gICAgICAgIG8gPSBuKDEwMyksXG4gICAgICAgIGwgPSBuKDQwKSxcbiAgICAgICAgYyA9IG4oNyksXG4gICAgICAgIGggPSBpLlJhbmdlRXJyb3IsXG4gICAgICAgIGQgPSBpLkludDhBcnJheSxcbiAgICAgICAgdSA9IGQgJiYgZC5wcm90b3R5cGUsXG4gICAgICAgIHAgPSB1ICYmIHUuc2V0LFxuICAgICAgICBmID0gcy5hVHlwZWRBcnJheSxcbiAgICAgICAgZyA9IHMuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgbSA9ICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgyKTtcbiAgICAgICAgICByKHAsIHQsIHtcbiAgICAgICAgICAgIGxlbmd0aDogMSxcbiAgICAgICAgICAgIDA6IDNcbiAgICAgICAgICB9LCAxKTtcbiAgICAgICAgICByZXR1cm4gMyAhPT0gdFsxXTtcbiAgICAgICAgfSksXG4gICAgICAgIGIgPSBtICYmIHMuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBkKDIpO1xuICAgICAgICAgIHQuc2V0KDEpO1xuICAgICAgICAgIHQuc2V0KFwiMlwiLCAxKTtcbiAgICAgICAgICByZXR1cm4gMCAhPT0gdFswXSB8fCAyICE9PSB0WzFdO1xuICAgICAgICB9KTtcbiAgICAgIGcoXCJzZXRcIiwgZnVuY3Rpb24gc2V0KHQpIHtcbiAgICAgICAgZih0aGlzKTtcbiAgICAgICAgdmFyIGUgPSBvKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwLCAxKSxcbiAgICAgICAgICBuID0gbCh0KTtcbiAgICAgICAgaWYgKG0pIHJldHVybiByKHAsIHRoaXMsIG4sIGUpO1xuICAgICAgICB2YXIgaSA9IHRoaXMubGVuZ3RoLFxuICAgICAgICAgIHMgPSBhKG4pLFxuICAgICAgICAgIGMgPSAwO1xuICAgICAgICBpZiAocyArIGUgPiBpKSB0aHJvdyBoKFwiV3JvbmcgbGVuZ3RoXCIpO1xuICAgICAgICBmb3IgKDsgYyA8IHM7KSB0aGlzW2UgKyBjXSA9IG5bYysrXTtcbiAgICAgIH0sICFtIHx8IGIpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTA0KSxcbiAgICAgICAgciA9IFJhbmdlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICB2YXIgbiA9IGkodCk7XG4gICAgICAgIGlmIChuICUgZSkgdGhyb3cgcihcIldyb25nIG9mZnNldFwiKTtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNjIpLFxuICAgICAgICByID0gUmFuZ2VFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gaSh0KTtcbiAgICAgICAgaWYgKGUgPCAwKSB0aHJvdyByKFwiVGhlIGFyZ3VtZW50IGNhbid0IGJlIGxlc3MgdGhhbiAwXCIpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTA2KSxcbiAgICAgICAgciA9IG4oOTQpLFxuICAgICAgICBzID0gci5hVHlwZWRBcnJheSxcbiAgICAgICAgYSA9IHIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgbyA9IHIuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgICAgYShcInRvUmV2ZXJzZWRcIiwgZnVuY3Rpb24gdG9SZXZlcnNlZCgpIHtcbiAgICAgICAgcmV0dXJuIGkocyh0aGlzKSwgbyh0aGlzKSk7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDY0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIG4gPSBpKHQpLCByID0gbmV3IGUobiksIHMgPSAwOyBzIDwgbjsgcysrKSByW3NdID0gdFtuIC0gcyAtIDFdO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oOTQpLFxuICAgICAgICByID0gbigxNCksXG4gICAgICAgIHMgPSBuKDMxKSxcbiAgICAgICAgYSA9IG4oMTA4KSxcbiAgICAgICAgbyA9IGkuYVR5cGVkQXJyYXksXG4gICAgICAgIGwgPSBpLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgICAgICAgYyA9IGkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgaCA9IHIoaS5UeXBlZEFycmF5UHJvdG90eXBlLnNvcnQpO1xuICAgICAgYyhcInRvU29ydGVkXCIsIGZ1bmN0aW9uIHRvU29ydGVkKHQpIHtcbiAgICAgICAgdm9pZCAwICE9PSB0ICYmIHModCk7XG4gICAgICAgIHZhciBlID0gbyh0aGlzKSxcbiAgICAgICAgICBuID0gYShsKGUpLCBlKTtcbiAgICAgICAgcmV0dXJuIGgobiwgdCk7XG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDY0KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gaShlKSwgcyA9IG5ldyB0KHIpOyByID4gbjspIHNbbl0gPSBlW24rK107XG4gICAgICAgIHJldHVybiBzO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMTApLFxuICAgICAgICByID0gbig5NCksXG4gICAgICAgIHMgPSBuKDExMSksXG4gICAgICAgIGEgPSBuKDYyKSxcbiAgICAgICAgbyA9IG4oMTEyKSxcbiAgICAgICAgbCA9IHIuYVR5cGVkQXJyYXksXG4gICAgICAgIGMgPSByLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgICAgICAgaCA9IHIuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxcbiAgICAgICAgZCA9ICEhZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgSW50OEFycmF5KDEpLndpdGgoMiwge1xuICAgICAgICAgICAgICB2YWx1ZU9mOiBmdW5jdGlvbiB2YWx1ZU9mKCkge1xuICAgICAgICAgICAgICAgIHRocm93IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiA4ID09PSB0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSgpO1xuICAgICAgaChcIndpdGhcIiwge1xuICAgICAgICB3aXRoOiBmdW5jdGlvbiBfd2l0aCh0LCBlKSB7XG4gICAgICAgICAgdmFyIG4gPSBsKHRoaXMpLFxuICAgICAgICAgICAgciA9IGEodCksXG4gICAgICAgICAgICBoID0gcyhuKSA/IG8oZSkgOiArZTtcbiAgICAgICAgICByZXR1cm4gaShuLCBjKG4pLCByLCBoKTtcbiAgICAgICAgfVxuICAgICAgfS53aXRoLCAhZCk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig2NCksXG4gICAgICAgIHIgPSBuKDYyKSxcbiAgICAgICAgcyA9IFJhbmdlRXJyb3I7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbiwgYSkge1xuICAgICAgICB2YXIgbyA9IGkodCksXG4gICAgICAgICAgbCA9IHIobiksXG4gICAgICAgICAgYyA9IGwgPCAwID8gbyArIGwgOiBsO1xuICAgICAgICBpZiAoYyA+PSBvIHx8IGMgPCAwKSB0aHJvdyBzKFwiSW5jb3JyZWN0IGluZGV4XCIpO1xuICAgICAgICBmb3IgKHZhciBoID0gbmV3IGUobyksIGQgPSAwOyBkIDwgbzsgZCsrKSBoW2RdID0gZCA9PT0gYyA/IGEgOiB0W2RdO1xuICAgICAgICByZXR1cm4gaDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3OCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IGkodCk7XG4gICAgICAgIHJldHVybiBcIkJpZ0ludDY0QXJyYXlcIiA9PSBlIHx8IFwiQmlnVWludDY0QXJyYXlcIiA9PSBlO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE5KSxcbiAgICAgICAgciA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHZhciBlID0gaSh0LCBcIm51bWJlclwiKTtcbiAgICAgICAgaWYgKFwibnVtYmVyXCIgPT0gdHlwZW9mIGUpIHRocm93IHIoXCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnRcIik7XG4gICAgICAgIHJldHVybiBCaWdJbnQoZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDYpLFxuICAgICAgICByID0gbig4OCksXG4gICAgICAgIHMgPSBuKDExNCksXG4gICAgICAgIGEgPSBBcnJheUJ1ZmZlci5wcm90b3R5cGU7XG4gICAgICBpICYmICEoXCJkZXRhY2hlZFwiIGluIGEpICYmIHIoYSwgXCJkZXRhY2hlZFwiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZGV0YWNoZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHModGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigxMTUpLFxuICAgICAgICBzID0gaShBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgaWYgKDAgIT09IHIodCkpIHJldHVybiAhMTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzKHQsIDAsIDApO1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDcyKSxcbiAgICAgICAgciA9IG4oMTUpLFxuICAgICAgICBzID0gVHlwZUVycm9yO1xuICAgICAgdC5leHBvcnRzID0gaShBcnJheUJ1ZmZlci5wcm90b3R5cGUsIFwiYnl0ZUxlbmd0aFwiLCBcImdldFwiKSB8fCBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoXCJBcnJheUJ1ZmZlclwiICE9IHIodCkpIHRocm93IHMoXCJBcnJheUJ1ZmZlciBleHBlY3RlZFwiKTtcbiAgICAgICAgcmV0dXJuIHQuYnl0ZUxlbmd0aDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMyksXG4gICAgICAgIHIgPSBuKDExNyk7XG4gICAgICByICYmIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiQXJyYXlCdWZmZXJcIixcbiAgICAgICAgcHJvdG86ICEwXG4gICAgICB9LCB7XG4gICAgICAgIHRyYW5zZmVyOiBmdW5jdGlvbiB0cmFuc2ZlcigpIHtcbiAgICAgICAgICByZXR1cm4gcih0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdm9pZCAwLCAhMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNCksXG4gICAgICAgIHIgPSBuKDE0KSxcbiAgICAgICAgcyA9IG4oNzIpLFxuICAgICAgICBhID0gbigxMTgpLFxuICAgICAgICBvID0gbigxMTQpLFxuICAgICAgICBsID0gbigxMTUpLFxuICAgICAgICBjID0gbigxMTkpLFxuICAgICAgICBoID0gaS5UeXBlRXJyb3IsXG4gICAgICAgIGQgPSBpLnN0cnVjdHVyZWRDbG9uZSxcbiAgICAgICAgdSA9IGkuQXJyYXlCdWZmZXIsXG4gICAgICAgIHAgPSBpLkRhdGFWaWV3LFxuICAgICAgICBmID0gTWF0aC5taW4sXG4gICAgICAgIGcgPSB1LnByb3RvdHlwZSxcbiAgICAgICAgbSA9IHAucHJvdG90eXBlLFxuICAgICAgICBiID0gcihnLnNsaWNlKSxcbiAgICAgICAgdiA9IHMoZywgXCJyZXNpemFibGVcIiwgXCJnZXRcIiksXG4gICAgICAgIHkgPSBzKGcsIFwibWF4Qnl0ZUxlbmd0aFwiLCBcImdldFwiKSxcbiAgICAgICAgQSA9IHIobS5nZXRJbnQ4KSxcbiAgICAgICAgXyA9IHIobS5zZXRJbnQ4KTtcbiAgICAgIHQuZXhwb3J0cyA9IGMgJiYgZnVuY3Rpb24gKHQsIGUsIG4pIHtcbiAgICAgICAgdmFyIGkgPSBsKHQpLFxuICAgICAgICAgIHIgPSB2b2lkIDAgPT09IGUgPyBpIDogYShlKSxcbiAgICAgICAgICBzID0gIXYgfHwgIXYodCk7XG4gICAgICAgIGlmIChvKHQpKSB0aHJvdyBoKFwiQXJyYXlCdWZmZXIgaXMgZGV0YWNoZWRcIik7XG4gICAgICAgIHZhciBjID0gZCh0LCB7XG4gICAgICAgICAgdHJhbnNmZXI6IFt0XVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGkgPT0gciAmJiAobiB8fCBzKSkgcmV0dXJuIGM7XG4gICAgICAgIGlmIChpID49IHIgJiYgKCFuIHx8IHMpKSByZXR1cm4gYihjLCAwLCByKTtcbiAgICAgICAgZm9yICh2YXIgZyA9IG4gJiYgIXMgJiYgeSA/IHtcbiAgICAgICAgICAgIG1heEJ5dGVMZW5ndGg6IHkoYylcbiAgICAgICAgICB9IDogdm9pZCAwLCBtID0gbmV3IHUociwgZyksIFMgPSBuZXcgcChjKSwgRSA9IG5ldyBwKG0pLCB4ID0gZihyLCBpKSwgdyA9IDA7IHcgPCB4OyB3KyspIF8oRSwgdywgQShTLCB3KSk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDYyKSxcbiAgICAgICAgciA9IG4oNjUpLFxuICAgICAgICBzID0gUmFuZ2VFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IHQpIHJldHVybiAwO1xuICAgICAgICB2YXIgZSA9IGkodCksXG4gICAgICAgICAgbiA9IHIoZSk7XG4gICAgICAgIGlmIChlICE9PSBuKSB0aHJvdyBzKFwiV3JvbmcgbGVuZ3RoIG9yIGluZGV4XCIpO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig0KSxcbiAgICAgICAgciA9IG4oNyksXG4gICAgICAgIHMgPSBuKDI4KSxcbiAgICAgICAgYSA9IG4oMTIwKSxcbiAgICAgICAgbyA9IG4oMTIxKSxcbiAgICAgICAgbCA9IG4oMTIyKSxcbiAgICAgICAgYyA9IGkuc3RydWN0dXJlZENsb25lO1xuICAgICAgdC5leHBvcnRzID0gISFjICYmICFyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG8gJiYgcyA+IDkyIHx8IGwgJiYgcyA+IDk0IHx8IGEgJiYgcyA+IDk3KSByZXR1cm4gITE7XG4gICAgICAgIHZhciB0ID0gbmV3IEFycmF5QnVmZmVyKDgpLFxuICAgICAgICAgIGUgPSBjKHQsIHtcbiAgICAgICAgICAgIHRyYW5zZmVyOiBbdF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIDAgIT0gdC5ieXRlTGVuZ3RoIHx8IDggIT0gZS5ieXRlTGVuZ3RoO1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxMjEpLFxuICAgICAgICByID0gbigxMjIpO1xuICAgICAgdC5leHBvcnRzID0gIWkgJiYgIXIgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2Ygd2luZG93ICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIGRvY3VtZW50O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0gXCJvYmplY3RcIiA9PSB0eXBlb2YgRGVubyAmJiBEZW5vICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIERlbm8udmVyc2lvbjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE1KTtcbiAgICAgIHQuZXhwb3J0cyA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIHByb2Nlc3MgJiYgXCJwcm9jZXNzXCIgPT0gaShwcm9jZXNzKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oMTE3KTtcbiAgICAgIHIgJiYgaSh7XG4gICAgICAgIHRhcmdldDogXCJBcnJheUJ1ZmZlclwiLFxuICAgICAgICBwcm90bzogITBcbiAgICAgIH0sIHtcbiAgICAgICAgdHJhbnNmZXJUb0ZpeGVkTGVuZ3RoOiBmdW5jdGlvbiB0cmFuc2ZlclRvRml4ZWRMZW5ndGgoKSB7XG4gICAgICAgICAgcmV0dXJuIHIodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHZvaWQgMCwgITEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGV4cG9ydHMuUmVuZGVyVGFzayA9IGV4cG9ydHMuUERGV29ya2VyVXRpbCA9IGV4cG9ydHMuUERGV29ya2VyID0gZXhwb3J0cy5QREZQYWdlUHJveHkgPSBleHBvcnRzLlBERkRvY3VtZW50UHJveHkgPSBleHBvcnRzLlBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSBleHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydCA9IGV4cG9ydHMuTG9vcGJhY2tQb3J0ID0gZXhwb3J0cy5EZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBleHBvcnRzLkRlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gZXhwb3J0cy5EZWZhdWx0Q2FudmFzRmFjdG9yeSA9IGV4cG9ydHMuRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gdm9pZCAwO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU1ZHR3JhcGhpY3NcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwbGF5U3ZnLlNWR0dyYXBoaWNzO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGV4cG9ydHMuYnVpbGQgPSB2b2lkIDA7XG4gICAgICBleHBvcnRzLmdldERvY3VtZW50ID0gZ2V0RG9jdW1lbnQ7XG4gICAgICBleHBvcnRzLnZlcnNpb24gPSB2b2lkIDA7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDg0KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oODYpO1xuICAgICAgX193X3BkZmpzX3JlcXVpcmVfXyg4Nyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDIpO1xuICAgICAgX193X3BkZmpzX3JlcXVpcmVfXyg5Myk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMSk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMik7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNSk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEwOSk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDExMyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDExNik7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDEyMyk7XG4gICAgICBfX3dfcGRmanNfcmVxdWlyZV9fKDg5KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTI1KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTM1KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTM3KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQwKTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQyKTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQ0KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQ2KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTQ4KTtcbiAgICAgIF9fd19wZGZqc19yZXF1aXJlX18oMTUxKTtcbiAgICAgIHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSksXG4gICAgICAgIF9hbm5vdGF0aW9uX3N0b3JhZ2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2MiksXG4gICAgICAgIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjcpLFxuICAgICAgICBfZm9udF9sb2FkZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3MCksXG4gICAgICAgIF9kaXNwbGF5Tm9kZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcxKSxcbiAgICAgICAgX2NhbnZhcyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcyKSxcbiAgICAgICAgX3dvcmtlcl9vcHRpb25zID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzUpLFxuICAgICAgICBfbWVzc2FnZV9oYW5kbGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygxNzYpLFxuICAgICAgICBfbWV0YWRhdGEgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3NyksXG4gICAgICAgIF9vcHRpb25hbF9jb250ZW50X2NvbmZpZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTc4KSxcbiAgICAgICAgX3RyYW5zcG9ydF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3OSksXG4gICAgICAgIF9kaXNwbGF5RmV0Y2hfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxODApLFxuICAgICAgICBfZGlzcGxheU5ldHdvcmsgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4MyksXG4gICAgICAgIF9kaXNwbGF5Tm9kZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4NCksXG4gICAgICAgIF9kaXNwbGF5U3ZnID0gX193X3BkZmpzX3JlcXVpcmVfXygxODUpLFxuICAgICAgICBfeGZhX3RleHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5Myk7XG4gICAgICBjb25zdCBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkUgPSA2NTUzNixcbiAgICAgICAgUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUID0gMTAwLFxuICAgICAgICBERUxBWUVEX0NMRUFOVVBfVElNRU9VVCA9IDVlMyxcbiAgICAgICAgRGVmYXVsdENhbnZhc0ZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlQ2FudmFzRmFjdG9yeSA6IF9kaXNwbGF5X3V0aWxzLkRPTUNhbnZhc0ZhY3Rvcnk7XG4gICAgICBleHBvcnRzLkRlZmF1bHRDYW52YXNGYWN0b3J5ID0gRGVmYXVsdENhbnZhc0ZhY3Rvcnk7XG4gICAgICBjb25zdCBEZWZhdWx0Q01hcFJlYWRlckZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgOiBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeTtcbiAgICAgIGV4cG9ydHMuRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O1xuICAgICAgY29uc3QgRGVmYXVsdEZpbHRlckZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlRmlsdGVyRmFjdG9yeSA6IF9kaXNwbGF5X3V0aWxzLkRPTUZpbHRlckZhY3Rvcnk7XG4gICAgICBleHBvcnRzLkRlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gRGVmYXVsdEZpbHRlckZhY3Rvcnk7XG4gICAgICBjb25zdCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBfdXRpbC5pc05vZGVKUyA/IF9kaXNwbGF5Tm9kZV91dGlscy5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgOiBfZGlzcGxheV91dGlscy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbiAgICAgIGV4cG9ydHMuRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgICAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQodCkge1xuICAgICAgICB2YXIgX3QkcGFzc3dvcmQsIF90JGxlbmd0aDtcbiAgICAgICAgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCB8fCB0IGluc3RhbmNlb2YgVVJMID8gdCA9IHtcbiAgICAgICAgICB1cmw6IHRcbiAgICAgICAgfSA6ICgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh0KSAmJiAodCA9IHtcbiAgICAgICAgICBkYXRhOiB0XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoXCJvYmplY3RcIiAhPSB0eXBlb2YgdCkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXIgaW4gZ2V0RG9jdW1lbnQsIG5lZWQgcGFyYW1ldGVyIG9iamVjdC5cIik7XG4gICAgICAgIGlmICghdC51cmwgJiYgIXQuZGF0YSAmJiAhdC5yYW5nZSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXIgb2JqZWN0OiBuZWVkIGVpdGhlciAuZGF0YSwgLnJhbmdlIG9yIC51cmxcIik7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgUERGRG9jdW1lbnRMb2FkaW5nVGFzaygpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRvY0lkOiBuXG4gICAgICAgICAgfSA9IGUsXG4gICAgICAgICAgaSA9IHQudXJsID8gZ2V0VXJsUHJvcCh0LnVybCkgOiBudWxsLFxuICAgICAgICAgIHIgPSB0LmRhdGEgPyBnZXREYXRhUHJvcCh0LmRhdGEpIDogbnVsbCxcbiAgICAgICAgICBzID0gdC5odHRwSGVhZGVycyB8fCBudWxsLFxuICAgICAgICAgIGEgPSAhMCA9PT0gdC53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgbyA9IChfdCRwYXNzd29yZCA9IHQucGFzc3dvcmQpICE9PSBudWxsICYmIF90JHBhc3N3b3JkICE9PSB2b2lkIDAgPyBfdCRwYXNzd29yZCA6IG51bGwsXG4gICAgICAgICAgbCA9IHQucmFuZ2UgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQgPyB0LnJhbmdlIDogbnVsbCxcbiAgICAgICAgICBjID0gTnVtYmVyLmlzSW50ZWdlcih0LnJhbmdlQ2h1bmtTaXplKSAmJiB0LnJhbmdlQ2h1bmtTaXplID4gMCA/IHQucmFuZ2VDaHVua1NpemUgOiBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU7XG4gICAgICAgIGxldCBoID0gdC53b3JrZXIgaW5zdGFuY2VvZiBQREZXb3JrZXIgPyB0LndvcmtlciA6IG51bGw7XG4gICAgICAgIGNvbnN0IGQgPSB0LnZlcmJvc2l0eSxcbiAgICAgICAgICB1ID0gXCJzdHJpbmdcIiAhPSB0eXBlb2YgdC5kb2NCYXNlVXJsIHx8ICgwLCBfZGlzcGxheV91dGlscy5pc0RhdGFTY2hlbWUpKHQuZG9jQmFzZVVybCkgPyBudWxsIDogdC5kb2NCYXNlVXJsLFxuICAgICAgICAgIHAgPSBcInN0cmluZ1wiID09IHR5cGVvZiB0LmNNYXBVcmwgPyB0LmNNYXBVcmwgOiBudWxsLFxuICAgICAgICAgIGYgPSAhMSAhPT0gdC5jTWFwUGFja2VkLFxuICAgICAgICAgIGcgPSB0LkNNYXBSZWFkZXJGYWN0b3J5IHx8IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSxcbiAgICAgICAgICBtID0gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdC5zdGFuZGFyZEZvbnREYXRhVXJsID8gdC5zdGFuZGFyZEZvbnREYXRhVXJsIDogbnVsbCxcbiAgICAgICAgICBiID0gdC5TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB8fCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnksXG4gICAgICAgICAgdiA9ICEwICE9PSB0LnN0b3BBdEVycm9ycyxcbiAgICAgICAgICB5ID0gTnVtYmVyLmlzSW50ZWdlcih0Lm1heEltYWdlU2l6ZSkgJiYgdC5tYXhJbWFnZVNpemUgPiAtMSA/IHQubWF4SW1hZ2VTaXplIDogLTEsXG4gICAgICAgICAgQSA9ICExICE9PSB0LmlzRXZhbFN1cHBvcnRlZCxcbiAgICAgICAgICBfID0gXCJib29sZWFuXCIgPT0gdHlwZW9mIHQuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPyB0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIDogIV91dGlsLmlzTm9kZUpTLFxuICAgICAgICAgIFMgPSBOdW1iZXIuaXNJbnRlZ2VyKHQuY2FudmFzTWF4QXJlYUluQnl0ZXMpID8gdC5jYW52YXNNYXhBcmVhSW5CeXRlcyA6IC0xLFxuICAgICAgICAgIEUgPSBcImJvb2xlYW5cIiA9PSB0eXBlb2YgdC5kaXNhYmxlRm9udEZhY2UgPyB0LmRpc2FibGVGb250RmFjZSA6IF91dGlsLmlzTm9kZUpTLFxuICAgICAgICAgIHggPSAhMCA9PT0gdC5mb250RXh0cmFQcm9wZXJ0aWVzLFxuICAgICAgICAgIHcgPSAhMCA9PT0gdC5lbmFibGVYZmEsXG4gICAgICAgICAgQyA9IHQub3duZXJEb2N1bWVudCB8fCBnbG9iYWxUaGlzLmRvY3VtZW50LFxuICAgICAgICAgIFQgPSAhMCA9PT0gdC5kaXNhYmxlUmFuZ2UsXG4gICAgICAgICAgUCA9ICEwID09PSB0LmRpc2FibGVTdHJlYW0sXG4gICAgICAgICAgayA9ICEwID09PSB0LmRpc2FibGVBdXRvRmV0Y2gsXG4gICAgICAgICAgTSA9ICEwID09PSB0LnBkZkJ1ZyxcbiAgICAgICAgICBSID0gbCA/IGwubGVuZ3RoIDogKF90JGxlbmd0aCA9IHQubGVuZ3RoKSAhPT0gbnVsbCAmJiBfdCRsZW5ndGggIT09IHZvaWQgMCA/IF90JGxlbmd0aCA6IE5hTixcbiAgICAgICAgICBJID0gXCJib29sZWFuXCIgPT0gdHlwZW9mIHQudXNlU3lzdGVtRm9udHMgPyB0LnVzZVN5c3RlbUZvbnRzIDogIV91dGlsLmlzTm9kZUpTICYmICFFLFxuICAgICAgICAgIEQgPSBcImJvb2xlYW5cIiA9PSB0eXBlb2YgdC51c2VXb3JrZXJGZXRjaCA/IHQudXNlV29ya2VyRmV0Y2ggOiBnID09PSBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeSAmJiBiID09PSBfZGlzcGxheV91dGlscy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSAmJiBwICYmIG0gJiYgKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkocCwgZG9jdW1lbnQuYmFzZVVSSSkgJiYgKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkobSwgZG9jdW1lbnQuYmFzZVVSSSksXG4gICAgICAgICAgTyA9IHQuY2FudmFzRmFjdG9yeSB8fCBuZXcgRGVmYXVsdENhbnZhc0ZhY3Rvcnkoe1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogQ1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIEwgPSB0LmZpbHRlckZhY3RvcnkgfHwgbmV3IERlZmF1bHRGaWx0ZXJGYWN0b3J5KHtcbiAgICAgICAgICAgIGRvY0lkOiBuLFxuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogQ1xuICAgICAgICAgIH0pO1xuICAgICAgICAoMCwgX3V0aWwuc2V0VmVyYm9zaXR5TGV2ZWwpKGQpO1xuICAgICAgICBjb25zdCBOID0ge1xuICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IE8sXG4gICAgICAgICAgZmlsdGVyRmFjdG9yeTogTFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIUQpIHtcbiAgICAgICAgICBOLmNNYXBSZWFkZXJGYWN0b3J5ID0gbmV3IGcoe1xuICAgICAgICAgICAgYmFzZVVybDogcCxcbiAgICAgICAgICAgIGlzQ29tcHJlc3NlZDogZlxuICAgICAgICAgIH0pO1xuICAgICAgICAgIE4uc3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBuZXcgYih7XG4gICAgICAgICAgICBiYXNlVXJsOiBtXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHtcbiAgICAgICAgICAgIHZlcmJvc2l0eTogZCxcbiAgICAgICAgICAgIHBvcnQ6IF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGggPSB0LnBvcnQgPyBQREZXb3JrZXIuZnJvbVBvcnQodCkgOiBuZXcgUERGV29ya2VyKHQpO1xuICAgICAgICAgIGUuX3dvcmtlciA9IGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgQiA9IHtcbiAgICAgICAgICAgIGRvY0lkOiBuLFxuICAgICAgICAgICAgYXBpVmVyc2lvbjogXCIzLjkuMTc5XCIsXG4gICAgICAgICAgICBkYXRhOiByLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG8sXG4gICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiBrLFxuICAgICAgICAgICAgcmFuZ2VDaHVua1NpemU6IGMsXG4gICAgICAgICAgICBsZW5ndGg6IFIsXG4gICAgICAgICAgICBkb2NCYXNlVXJsOiB1LFxuICAgICAgICAgICAgZW5hYmxlWGZhOiB3LFxuICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczoge1xuICAgICAgICAgICAgICBtYXhJbWFnZVNpemU6IHksXG4gICAgICAgICAgICAgIGRpc2FibGVGb250RmFjZTogRSxcbiAgICAgICAgICAgICAgaWdub3JlRXJyb3JzOiB2LFxuICAgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IEEsXG4gICAgICAgICAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiBfLFxuICAgICAgICAgICAgICBjYW52YXNNYXhBcmVhSW5CeXRlczogUyxcbiAgICAgICAgICAgICAgZm9udEV4dHJhUHJvcGVydGllczogeCxcbiAgICAgICAgICAgICAgdXNlU3lzdGVtRm9udHM6IEksXG4gICAgICAgICAgICAgIGNNYXBVcmw6IEQgPyBwIDogbnVsbCxcbiAgICAgICAgICAgICAgc3RhbmRhcmRGb250RGF0YVVybDogRCA/IG0gOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBqID0ge1xuICAgICAgICAgICAgaWdub3JlRXJyb3JzOiB2LFxuICAgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBBLFxuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBFLFxuICAgICAgICAgICAgZm9udEV4dHJhUHJvcGVydGllczogeCxcbiAgICAgICAgICAgIGVuYWJsZVhmYTogdyxcbiAgICAgICAgICAgIG93bmVyRG9jdW1lbnQ6IEMsXG4gICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiBrLFxuICAgICAgICAgICAgcGRmQnVnOiBNLFxuICAgICAgICAgICAgc3R5bGVFbGVtZW50OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgaC5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlLmRlc3Ryb3llZCkgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSBfZmV0Y2hEb2N1bWVudChoLCBCKSxcbiAgICAgICAgICAgIG8gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICBsZXQgZTtcbiAgICAgICAgICAgICAgaWYgKGwpIGUgPSBuZXcgX3RyYW5zcG9ydF9zdHJlYW0uUERGRGF0YVRyYW5zcG9ydFN0cmVhbSh7XG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBSLFxuICAgICAgICAgICAgICAgIGluaXRpYWxEYXRhOiBsLmluaXRpYWxEYXRhLFxuICAgICAgICAgICAgICAgIHByb2dyZXNzaXZlRG9uZTogbC5wcm9ncmVzc2l2ZURvbmUsXG4gICAgICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6IGwuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgZGlzYWJsZVJhbmdlOiBULFxuICAgICAgICAgICAgICAgIGRpc2FibGVTdHJlYW06IFBcbiAgICAgICAgICAgICAgfSwgbCk7ZWxzZSBpZiAoIXIpIHtcbiAgICAgICAgICAgICAgICBlID0gKHQgPT4gX3V0aWwuaXNOb2RlSlMgPyBuZXcgX2Rpc3BsYXlOb2RlX3N0cmVhbS5QREZOb2RlU3RyZWFtKHQpIDogKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkodC51cmwpID8gbmV3IF9kaXNwbGF5RmV0Y2hfc3RyZWFtLlBERkZldGNoU3RyZWFtKHQpIDogbmV3IF9kaXNwbGF5TmV0d29yay5QREZOZXR3b3JrU3RyZWFtKHQpKSh7XG4gICAgICAgICAgICAgICAgICB1cmw6IGksXG4gICAgICAgICAgICAgICAgICBsZW5ndGg6IFIsXG4gICAgICAgICAgICAgICAgICBodHRwSGVhZGVyczogcyxcbiAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogYSxcbiAgICAgICAgICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiBjLFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZVJhbmdlOiBULFxuICAgICAgICAgICAgICAgICAgZGlzYWJsZVN0cmVhbTogUFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHQoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3QsIG9dKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICBsZXQgW2ksIHJdID0gdDtcbiAgICAgICAgICAgIGlmIChlLmRlc3Ryb3llZCkgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4sIGksIGgucG9ydCksXG4gICAgICAgICAgICAgIGEgPSBuZXcgV29ya2VyVHJhbnNwb3J0KHMsIGUsIHIsIGosIE4pO1xuICAgICAgICAgICAgZS5fdHJhbnNwb3J0ID0gYTtcbiAgICAgICAgICAgIHMuc2VuZChcIlJlYWR5XCIsIG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChlLl9jYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgICAgYXN5bmMgZnVuY3Rpb24gX2ZldGNoRG9jdW1lbnQodCwgZSkge1xuICAgICAgICBpZiAodC5kZXN0cm95ZWQpIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICAgICAgICBjb25zdCBuID0gYXdhaXQgdC5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NSZXF1ZXN0XCIsIGUsIGUuZGF0YSA/IFtlLmRhdGEuYnVmZmVyXSA6IG51bGwpO1xuICAgICAgICBpZiAodC5kZXN0cm95ZWQpIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGdldFVybFByb3AodCkge1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFVSTCkgcmV0dXJuIHQuaHJlZjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFVSTCh0LCB3aW5kb3cubG9jYXRpb24pLmhyZWY7XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ0KSB7XG4gICAgICAgICAgaWYgKF91dGlsLmlzTm9kZUpTICYmIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHJldHVybiB0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgUERGIHVybCBkYXRhOiBlaXRoZXIgc3RyaW5nIG9yIFVSTC1vYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIHVybCBwcm9wZXJ0eS5cIik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXREYXRhUHJvcCh0KSB7XG4gICAgICAgIGlmIChfdXRpbC5pc05vZGVKUyAmJiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBCdWZmZXIgJiYgdCBpbnN0YW5jZW9mIEJ1ZmZlcikgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHByb3ZpZGUgYmluYXJ5IGRhdGEgYXMgYFVpbnQ4QXJyYXlgLCByYXRoZXIgdGhhbiBgQnVmZmVyYC5cIik7XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgVWludDhBcnJheSAmJiB0LmJ5dGVMZW5ndGggPT09IHQuYnVmZmVyLmJ5dGVMZW5ndGgpIHJldHVybiB0O1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCkgcmV0dXJuICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSh0KTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgIWlzTmFOKHQgPT09IG51bGwgfHwgdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdC5sZW5ndGgpIHx8ICgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh0KSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KHQpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFBERiBiaW5hcnkgZGF0YTogZWl0aGVyIFR5cGVkQXJyYXksIHN0cmluZywgb3IgYXJyYXktbGlrZSBvYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIGRhdGEgcHJvcGVydHkuXCIpO1xuICAgICAgfVxuICAgICAgY2xhc3MgUERGRG9jdW1lbnRMb2FkaW5nVGFzayB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHZhciBfUERGRG9jdW1lbnRMb2FkaW5nVGEsIF9QREZEb2N1bWVudExvYWRpbmdUYTI7XG4gICAgICAgICAgdGhpcy5fY2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmRvY0lkID0gXCJkXCIgKyAoX2NsYXNzU3RhdGljUHJpdmF0ZUZpZWxkU3BlY1NldChQREZEb2N1bWVudExvYWRpbmdUYXNrLCBQREZEb2N1bWVudExvYWRpbmdUYXNrLCBfZSwgKF9QREZEb2N1bWVudExvYWRpbmdUYSA9IF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoUERGRG9jdW1lbnRMb2FkaW5nVGFzaywgUERGRG9jdW1lbnRMb2FkaW5nVGFzaywgX2UpLCBfUERGRG9jdW1lbnRMb2FkaW5nVGEyID0gX1BERkRvY3VtZW50TG9hZGluZ1RhKyssIF9QREZEb2N1bWVudExvYWRpbmdUYSkpLCBfUERGRG9jdW1lbnRMb2FkaW5nVGEyKTtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3llZCA9ICExO1xuICAgICAgICAgIHRoaXMub25QYXNzd29yZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF90cmFuc3BvcnQ7XG4gICAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSAhMDtcbiAgICAgICAgICBhd2FpdCAoKF90aGlzJF90cmFuc3BvcnQgPSB0aGlzLl90cmFuc3BvcnQpID09PSBudWxsIHx8IF90aGlzJF90cmFuc3BvcnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF90cmFuc3BvcnQuZGVzdHJveSgpKTtcbiAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIF9lID0ge1xuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IDBcbiAgICAgIH07XG4gICAgICBleHBvcnRzLlBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSBQREZEb2N1bWVudExvYWRpbmdUYXNrO1xuICAgICAgY2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0IHtcbiAgICAgICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICAgIGxldCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdLFxuICAgICAgICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdID8gYXJndW1lbnRzWzNdIDogbnVsbDtcbiAgICAgICAgICB0aGlzLmxlbmd0aCA9IHQ7XG4gICAgICAgICAgdGhpcy5pbml0aWFsRGF0YSA9IGU7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzc2l2ZURvbmUgPSBuO1xuICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBpO1xuICAgICAgICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzID0gW107XG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRSYW5nZUxpc3RlbmVyKHQpIHtcbiAgICAgICAgICB0aGlzLl9yYW5nZUxpc3RlbmVycy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFByb2dyZXNzTGlzdGVuZXIodCkge1xuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzLnB1c2godCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIodCkge1xuICAgICAgICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKHQpIHtcbiAgICAgICAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMucHVzaCh0KTtcbiAgICAgICAgfVxuICAgICAgICBvbkRhdGFSYW5nZSh0LCBlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuIG9mIHRoaXMuX3JhbmdlTGlzdGVuZXJzKSBuKHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIG9uRGF0YVByb2dyZXNzKHQsIGUpIHtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycykgbih0LCBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBvbkRhdGFQcm9ncmVzc2l2ZVJlYWQodCkge1xuICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycykgZSh0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKSB7XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXJzKSB0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNwb3J0UmVhZHkoKSB7XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0RGF0YVJhbmdlKHQsIGUpIHtcbiAgICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIFBERkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGFib3J0KCkge31cbiAgICAgIH1cbiAgICAgIGV4cG9ydHMuUERGRGF0YVJhbmdlVHJhbnNwb3J0ID0gUERGRGF0YVJhbmdlVHJhbnNwb3J0O1xuICAgICAgY2xhc3MgUERGRG9jdW1lbnRQcm94eSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICB0aGlzLl9wZGZJbmZvID0gdDtcbiAgICAgICAgICB0aGlzLl90cmFuc3BvcnQgPSBlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWx0ZXJGYWN0b3J5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgbnVtUGFnZXMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BkZkluZm8ubnVtUGFnZXM7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZpbmdlcnByaW50cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5maW5nZXJwcmludHM7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUHVyZVhmYSgpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJpc1B1cmVYZmFcIiwgISF0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBhbGxYZmFIdG1sKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZSh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlKHQpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2VJbmRleCh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSW5kZXgodCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGVzdGluYXRpb25zKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGVzdGluYXRpb24odCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb24odCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYWdlTGF5b3V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxheW91dCgpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2VNb2RlKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZU1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFZpZXdlclByZWZlcmVuY2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T3BlbkFjdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wZW5BY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRBdHRhY2htZW50cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEF0dGFjaG1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SmF2YVNjcmlwdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEphdmFTY3JpcHQoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREb2NKU0FjdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRPdXRsaW5lKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3V0bGluZSgpO1xuICAgICAgICB9XG4gICAgICAgIGdldE9wdGlvbmFsQ29udGVudENvbmZpZygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBlcm1pc3Npb25zKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRNZXRhZGF0YSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1ldGFkYXRhKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWFya0luZm8oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNYXJrSW5mbygpO1xuICAgICAgICB9XG4gICAgICAgIGdldERhdGEoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2F2ZURvY3VtZW50KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc2F2ZURvY3VtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RG93bmxvYWRJbmZvKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFudXAoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF07XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zdGFydENsZWFudXAodCB8fCB0aGlzLmlzUHVyZVhmYSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nVGFzay5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGxvYWRpbmdQYXJhbXMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nUGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGdldCBsb2FkaW5nVGFzaygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdUYXNrO1xuICAgICAgICB9XG4gICAgICAgIGdldEZpZWxkT2JqZWN0cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEZpZWxkT2JqZWN0cygpO1xuICAgICAgICB9XG4gICAgICAgIGhhc0pTQWN0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lmhhc0pTQWN0aW9ucygpO1xuICAgICAgICB9XG4gICAgICAgIGdldENhbGN1bGF0aW9uT3JkZXJJZHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRDYWxjdWxhdGlvbk9yZGVySWRzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV4cG9ydHMuUERGRG9jdW1lbnRQcm94eSA9IFBERkRvY3VtZW50UHJveHk7XG4gICAgICB2YXIgX24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9zID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3IgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIFBERlBhZ2VQcm94eSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF90MiwgX2UyLCBuKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9yKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3MpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9uLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2ksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSAmJiBhcmd1bWVudHNbM107XG4gICAgICAgICAgdGhpcy5fcGFnZUluZGV4ID0gX3QyO1xuICAgICAgICAgIHRoaXMuX3BhZ2VJbmZvID0gX2UyO1xuICAgICAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IG47XG4gICAgICAgICAgdGhpcy5fc3RhdHMgPSBpID8gbmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcigpIDogbnVsbDtcbiAgICAgICAgICB0aGlzLl9wZGZCdWcgPSBpO1xuICAgICAgICAgIHRoaXMuY29tbW9uT2JqcyA9IG4uY29tbW9uT2JqcztcbiAgICAgICAgICB0aGlzLm9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgICAgICAgIHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyID0gITE7XG4gICAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhZ2VOdW1iZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmRleCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHJvdGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucm90YXRlO1xuICAgICAgICB9XG4gICAgICAgIGdldCByZWYoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJlZjtcbiAgICAgICAgfVxuICAgICAgICBnZXQgdXNlclVuaXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnVzZXJVbml0O1xuICAgICAgICB9XG4gICAgICAgIGdldCB2aWV3KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby52aWV3O1xuICAgICAgICB9XG4gICAgICAgIGdldFZpZXdwb3J0KCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBzY2FsZTogdCxcbiAgICAgICAgICAgIHJvdGF0aW9uOiBlID0gdGhpcy5yb3RhdGUsXG4gICAgICAgICAgICBvZmZzZXRYOiBuID0gMCxcbiAgICAgICAgICAgIG9mZnNldFk6IGkgPSAwLFxuICAgICAgICAgICAgZG9udEZsaXA6IHIgPSAhMVxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHJldHVybiBuZXcgX2Rpc3BsYXlfdXRpbHMuUGFnZVZpZXdwb3J0KHtcbiAgICAgICAgICAgIHZpZXdCb3g6IHRoaXMudmlldyxcbiAgICAgICAgICAgIHNjYWxlOiB0LFxuICAgICAgICAgICAgcm90YXRpb246IGUsXG4gICAgICAgICAgICBvZmZzZXRYOiBuLFxuICAgICAgICAgICAgb2Zmc2V0WTogaSxcbiAgICAgICAgICAgIGRvbnRGbGlwOiByXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QW5ub3RhdGlvbnMoKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGludGVudDogdCA9IFwiZGlzcGxheVwiXG4gICAgICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQodCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBbm5vdGF0aW9ucyh0aGlzLl9wYWdlSW5kZXgsIGUucmVuZGVyaW5nSW50ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRKU0FjdGlvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSlNBY3Rpb25zKHRoaXMuX3BhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZpbHRlckZhY3RvcnkoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5maWx0ZXJGYWN0b3J5O1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1B1cmVYZmEoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiaXNQdXJlWGZhXCIsICEhdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBnZXRYZmEoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF90cmFuc3BvcnQkX2h0bTtcbiAgICAgICAgICByZXR1cm4gKChfdGhpcyRfdHJhbnNwb3J0JF9odG0gPSB0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpID09PSBudWxsIHx8IF90aGlzJF90cmFuc3BvcnQkX2h0bSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX3RyYW5zcG9ydCRfaHRtLmNoaWxkcmVuW3RoaXMuX3BhZ2VJbmRleF0pIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKHQpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX3N0YXRzLCBfdTtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgY2FudmFzQ29udGV4dDogZSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBuLFxuICAgICAgICAgICAgaW50ZW50OiBpID0gXCJkaXNwbGF5XCIsXG4gICAgICAgICAgICBhbm5vdGF0aW9uTW9kZTogciA9IF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcyA9IG51bGwsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBhID0gbnVsbCxcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U6IG8gPSBudWxsLFxuICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogbCA9IG51bGwsXG4gICAgICAgICAgICBwYWdlQ29sb3JzOiBjID0gbnVsbCxcbiAgICAgICAgICAgIHByaW50QW5ub3RhdGlvblN0b3JhZ2U6IGggPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgKF90aGlzJF9zdGF0cyA9IHRoaXMuX3N0YXRzKSA9PT0gbnVsbCB8fCBfdGhpcyRfc3RhdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0cy50aW1lKFwiT3ZlcmFsbFwiKTtcbiAgICAgICAgICBjb25zdCBkID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpLCByLCBoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2ksICExKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9yLCBfcjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgbyB8fCAobyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSk7XG4gICAgICAgICAgbGV0IHUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGQuY2FjaGVLZXkpO1xuICAgICAgICAgIGlmICghdSkge1xuICAgICAgICAgICAgdSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KGQuY2FjaGVLZXksIHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgICAgICAgIHUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHAgPSAhIShkLnJlbmRlcmluZ0ludGVudCAmIF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQpO1xuICAgICAgICAgIGlmICghdS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkX3N0YXRzMjtcbiAgICAgICAgICAgIHUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgICAgdS5vcGVyYXRvckxpc3QgPSB7XG4gICAgICAgICAgICAgIGZuQXJyYXk6IFtdLFxuICAgICAgICAgICAgICBhcmdzQXJyYXk6IFtdLFxuICAgICAgICAgICAgICBsYXN0Q2h1bms6ICExLFxuICAgICAgICAgICAgICBzZXBhcmF0ZUFubm90czogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChfdGhpcyRfc3RhdHMyID0gdGhpcy5fc3RhdHMpID09PSBudWxsIHx8IF90aGlzJF9zdGF0czIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0czIudGltZShcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIHRoaXMuX3B1bXBPcGVyYXRvckxpc3QoZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlID0gdCA9PiB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRfc3RhdHMzLCBfdGhpcyRfc3RhdHM0O1xuICAgICAgICAgICAgICB1LnJlbmRlclRhc2tzLmRlbGV0ZShmKTtcbiAgICAgICAgICAgICAgKHRoaXMuX21heWJlQ2xlYW51cEFmdGVyUmVuZGVyIHx8IHApICYmIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaSwgITApO1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9zLCBfczIpLmNhbGwodGhpcywgIXApO1xuICAgICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICAgIGYuY2FwYWJpbGl0eS5yZWplY3QodCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgICAgICAgaW50ZW50U3RhdGU6IHUsXG4gICAgICAgICAgICAgICAgICByZWFzb246IHQgaW5zdGFuY2VvZiBFcnJvciA/IHQgOiBuZXcgRXJyb3IodClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGYuY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIChfdGhpcyRfc3RhdHMzID0gdGhpcy5fc3RhdHMpID09PSBudWxsIHx8IF90aGlzJF9zdGF0czMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0czMudGltZUVuZChcIlJlbmRlcmluZ1wiKTtcbiAgICAgICAgICAgICAgKF90aGlzJF9zdGF0czQgPSB0aGlzLl9zdGF0cykgPT09IG51bGwgfHwgX3RoaXMkX3N0YXRzNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX3N0YXRzNC50aW1lRW5kKFwiT3ZlcmFsbFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmID0gbmV3IEludGVybmFsUmVuZGVyVGFzayh7XG4gICAgICAgICAgICAgIGNhbGxiYWNrOiBjb21wbGV0ZSxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgY2FudmFzQ29udGV4dDogZSxcbiAgICAgICAgICAgICAgICB2aWV3cG9ydDogbixcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHMsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogYVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvYmpzOiB0aGlzLm9ianMsXG4gICAgICAgICAgICAgIGNvbW1vbk9ianM6IHRoaXMuY29tbW9uT2JqcyxcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogbCxcbiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0OiB1Lm9wZXJhdG9yTGlzdCxcbiAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IHRoaXMuX3RyYW5zcG9ydC5jYW52YXNGYWN0b3J5LFxuICAgICAgICAgICAgICBmaWx0ZXJGYWN0b3J5OiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeSxcbiAgICAgICAgICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiAhcCxcbiAgICAgICAgICAgICAgcGRmQnVnOiB0aGlzLl9wZGZCdWcsXG4gICAgICAgICAgICAgIHBhZ2VDb2xvcnM6IGNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICgoX3UgPSB1KS5yZW5kZXJUYXNrcyB8fCAoX3UucmVuZGVyVGFza3MgPSBuZXcgU2V0KCkpKS5hZGQoZik7XG4gICAgICAgICAgY29uc3QgZyA9IGYudGFzaztcbiAgICAgICAgICBQcm9taXNlLmFsbChbdS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnByb21pc2UsIG9dKS50aGVuKHQgPT4ge1xuICAgICAgICAgICAgbGV0IFtlLCBuXSA9IHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIGNvbXBsZXRlKCk7ZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRfc3RhdHM1O1xuICAgICAgICAgICAgICAoX3RoaXMkX3N0YXRzNSA9IHRoaXMuX3N0YXRzKSA9PT0gbnVsbCB8fCBfdGhpcyRfc3RhdHM1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfc3RhdHM1LnRpbWUoXCJSZW5kZXJpbmdcIik7XG4gICAgICAgICAgICAgIGYuaW5pdGlhbGl6ZUdyYXBoaWNzKHtcbiAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3k6IGUsXG4gICAgICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnOiBuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBmLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KS5jYXRjaChjb21wbGV0ZSk7XG4gICAgICAgICAgcmV0dXJuIGc7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T3BlcmF0b3JMaXN0KCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpbnRlbnQ6IHQgPSBcImRpc3BsYXlcIixcbiAgICAgICAgICAgIGFubm90YXRpb25Nb2RlOiBlID0gX3V0aWwuQW5ub3RhdGlvbk1vZGUuRU5BQkxFLFxuICAgICAgICAgICAgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZTogbiA9IG51bGxcbiAgICAgICAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudCh0LCBlLCBuLCAhMCk7XG4gICAgICAgICAgbGV0IHIsXG4gICAgICAgICAgICBzID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChpLmNhY2hlS2V5KTtcbiAgICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICAgIHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5faW50ZW50U3RhdGVzLnNldChpLmNhY2hlS2V5LCBzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG4gICAgICAgICAgICB2YXIgX3MzLCBfdGhpcyRfc3RhdHM2O1xuICAgICAgICAgICAgciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICByLm9wZXJhdG9yTGlzdENoYW5nZWQgPSBmdW5jdGlvbiBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuICAgICAgICAgICAgICBpZiAocy5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG4gICAgICAgICAgICAgICAgcy5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKHMub3BlcmF0b3JMaXN0KTtcbiAgICAgICAgICAgICAgICBzLnJlbmRlclRhc2tzLmRlbGV0ZShyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHMub3BMaXN0UmVhZENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgICgoX3MzID0gcykucmVuZGVyVGFza3MgfHwgKF9zMy5yZW5kZXJUYXNrcyA9IG5ldyBTZXQoKSkpLmFkZChyKTtcbiAgICAgICAgICAgIHMub3BlcmF0b3JMaXN0ID0ge1xuICAgICAgICAgICAgICBmbkFycmF5OiBbXSxcbiAgICAgICAgICAgICAgYXJnc0FycmF5OiBbXSxcbiAgICAgICAgICAgICAgbGFzdENodW5rOiAhMSxcbiAgICAgICAgICAgICAgc2VwYXJhdGVBbm5vdHM6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAoX3RoaXMkX3N0YXRzNiA9IHRoaXMuX3N0YXRzKSA9PT0gbnVsbCB8fCBfdGhpcyRfc3RhdHM2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfc3RhdHM2LnRpbWUoXCJQYWdlIFJlcXVlc3RcIik7XG4gICAgICAgICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcy5vcExpc3RSZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHN0cmVhbVRleHRDb250ZW50KCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogdCA9ICExLFxuICAgICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb246IGUgPSAhMVxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRUZXh0Q29udGVudFwiLCB7XG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcbiAgICAgICAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50OiAhMCA9PT0gdCxcbiAgICAgICAgICAgIGRpc2FibGVOb3JtYWxpemF0aW9uOiAhMCA9PT0gZVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IDEwMCxcbiAgICAgICAgICAgIHNpemU6IHQgPT4gdC5pdGVtcy5sZW5ndGhcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRUZXh0Q29udGVudCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICAgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSkgcmV0dXJuIHRoaXMuZ2V0WGZhKCkudGhlbih0ID0+IF94ZmFfdGV4dC5YZmFUZXh0LnRleHRDb250ZW50KHQpKTtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5zdHJlYW1UZXh0Q29udGVudCh0KTtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHQsIG4pIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBlLmdldFJlYWRlcigpLFxuICAgICAgICAgICAgICByID0ge1xuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICFmdW5jdGlvbiBwdW1wKCkge1xuICAgICAgICAgICAgICBpLnJlYWQoKS50aGVuKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgICAgICAgICAgZG9uZTogaVxuICAgICAgICAgICAgICAgIH0gPSBlO1xuICAgICAgICAgICAgICAgIGlmIChpKSB0KHIpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyLnN0eWxlcywgbi5zdHlsZXMpO1xuICAgICAgICAgICAgICAgICAgci5pdGVtcy5wdXNoKC4uLm4uaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgbik7XG4gICAgICAgICAgICB9KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0U3RydWN0VHJlZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFN0cnVjdFRyZWUodGhpcy5fcGFnZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBfZGVzdHJveSgpIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3llZCA9ICEwO1xuICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5faW50ZW50U3RhdGVzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydE9wZXJhdG9yTGlzdCh7XG4gICAgICAgICAgICAgIGludGVudFN0YXRlOiBlLFxuICAgICAgICAgICAgICByZWFzb246IG5ldyBFcnJvcihcIlBhZ2Ugd2FzIGRlc3Ryb3llZC5cIiksXG4gICAgICAgICAgICAgIGZvcmNlOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWUub3BMaXN0UmVhZENhcGFiaWxpdHkpIGZvciAoY29uc3QgbiBvZiBlLnJlbmRlclRhc2tzKSB7XG4gICAgICAgICAgICAgIHQucHVzaChuLmNvbXBsZXRlZCk7XG4gICAgICAgICAgICAgIG4uY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaSwgITEpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3IsIF9yMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYW51cCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2ksICEwKTtcbiAgICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcywgX3MyKS5jYWxsKHRoaXMsICExKTtcbiAgICAgICAgICB0ICYmIGUgJiYgdGhpcy5fc3RhdHMgJiYgKHRoaXMuX3N0YXRzID0gbmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcigpKTtcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICBfc3RhcnRSZW5kZXJQYWdlKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChlKTtcbiAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgdmFyIF90aGlzJF9zdGF0czcsIF9uJGRpc3BsYXlSZWFkeUNhcGFiaTtcbiAgICAgICAgICAgIChfdGhpcyRfc3RhdHM3ID0gdGhpcy5fc3RhdHMpID09PSBudWxsIHx8IF90aGlzJF9zdGF0czcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9zdGF0czcudGltZUVuZChcIlBhZ2UgUmVxdWVzdFwiKTtcbiAgICAgICAgICAgIChfbiRkaXNwbGF5UmVhZHlDYXBhYmkgPSBuLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpID09PSBudWxsIHx8IF9uJGRpc3BsYXlSZWFkeUNhcGFiaSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX24kZGlzcGxheVJlYWR5Q2FwYWJpLnJlc29sdmUodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZW5kZXJQYWdlQ2h1bmsodCwgZSkge1xuICAgICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIHtcbiAgICAgICAgICAgIGUub3BlcmF0b3JMaXN0LmZuQXJyYXkucHVzaCh0LmZuQXJyYXlbbl0pO1xuICAgICAgICAgICAgZS5vcGVyYXRvckxpc3QuYXJnc0FycmF5LnB1c2godC5hcmdzQXJyYXlbbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSB0Lmxhc3RDaHVuaztcbiAgICAgICAgICBlLm9wZXJhdG9yTGlzdC5zZXBhcmF0ZUFubm90cyA9IHQuc2VwYXJhdGVBbm5vdHM7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUucmVuZGVyVGFza3MpIHQub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuICAgICAgICAgIHQubGFzdENodW5rICYmIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3MsIF9zMikuY2FsbCh0aGlzLCAhMCk7XG4gICAgICAgIH1cbiAgICAgICAgX3B1bXBPcGVyYXRvckxpc3QodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICByZW5kZXJpbmdJbnRlbnQ6IGUsXG4gICAgICAgICAgICBjYWNoZUtleTogbixcbiAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlOiBpXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBtYXA6IHIsXG4gICAgICAgICAgICAgIHRyYW5zZmVyczogc1xuICAgICAgICAgICAgfSA9IGksXG4gICAgICAgICAgICBhID0gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiR2V0T3BlcmF0b3JMaXN0XCIsIHtcbiAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG4gICAgICAgICAgICAgIGludGVudDogZSxcbiAgICAgICAgICAgICAgY2FjaGVLZXk6IG4sXG4gICAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiByXG4gICAgICAgICAgICB9LCBzKS5nZXRSZWFkZXIoKSxcbiAgICAgICAgICAgIG8gPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KG4pO1xuICAgICAgICAgIG8uc3RyZWFtUmVhZGVyID0gYTtcbiAgICAgICAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgICAgICAgYS5yZWFkKCkudGhlbih0ID0+IHtcbiAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZSxcbiAgICAgICAgICAgICAgICBkb25lOiBuXG4gICAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgICBpZiAobikgby5zdHJlYW1SZWFkZXIgPSBudWxsO2Vsc2UgaWYgKCF0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyUGFnZUNodW5rKGUsIG8pO1xuICAgICAgICAgICAgICAgIHB1bXAoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdCA9PiB7XG4gICAgICAgICAgICAgIG8uc3RyZWFtUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKG8ub3BlcmF0b3JMaXN0KSB7XG4gICAgICAgICAgICAgICAgICBvLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSAhMDtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBvLnJlbmRlclRhc2tzKSB0Lm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3MsIF9zMikuY2FsbCh0aGlzLCAhMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpIG8uZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZWplY3QodCk7ZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIW8ub3BMaXN0UmVhZENhcGFiaWxpdHkpIHRocm93IHQ7XG4gICAgICAgICAgICAgICAgICBvLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlamVjdCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcHVtcCgpO1xuICAgICAgICB9XG4gICAgICAgIF9hYm9ydE9wZXJhdG9yTGlzdCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGludGVudFN0YXRlOiBlLFxuICAgICAgICAgICAgcmVhc29uOiBuLFxuICAgICAgICAgICAgZm9yY2U6IGkgPSAhMVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGlmIChlLnN0cmVhbVJlYWRlcikge1xuICAgICAgICAgICAgaWYgKGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCkge1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcbiAgICAgICAgICAgICAgZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaSkge1xuICAgICAgICAgICAgICBpZiAoZS5yZW5kZXJUYXNrcy5zaXplID4gMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUO1xuICAgICAgICAgICAgICAgIG4uZXh0cmFEZWxheSA+IDAgJiYgbi5leHRyYURlbGF5IDwgMWUzICYmICh0ICs9IG4uZXh0cmFEZWxheSk7XG4gICAgICAgICAgICAgICAgZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuICAgICAgICAgICAgICAgICAgICBpbnRlbnRTdGF0ZTogZSxcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBuLFxuICAgICAgICAgICAgICAgICAgICBmb3JjZTogITBcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIHQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZS5zdHJlYW1SZWFkZXIuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbihuLm1lc3NhZ2UpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICBlLnN0cmVhbVJlYWRlciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbdCwgbl0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSBpZiAobiA9PT0gZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5kZWxldGUodCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBzdGF0cygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9zMigpIHtcbiAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF07XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3IsIF9yMikuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2kpIHx8IHRoaXMuZGVzdHJveWVkKSByZXR1cm4gITE7XG4gICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9uLCBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbiwgbnVsbCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9zLCBfczIpLmNhbGwodGhpcywgITEpO1xuICAgICAgICAgIH0sIERFTEFZRURfQ0xFQU5VUF9USU1FT1VUKSk7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgIHJlbmRlclRhc2tzOiB0LFxuICAgICAgICAgIG9wZXJhdG9yTGlzdDogZVxuICAgICAgICB9IG9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSkgaWYgKHQuc2l6ZSA+IDAgfHwgIWUubGFzdENodW5rKSByZXR1cm4gITE7XG4gICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLm9ianMuY2xlYXIoKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9pLCAhMSk7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9yMigpIHtcbiAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbikpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9uKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9uLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXhwb3J0cy5QREZQYWdlUHJveHkgPSBQREZQYWdlUHJveHk7XG4gICAgICB2YXIgX2EgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgTG9vcGJhY2tQb3J0IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2EsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9vLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBvc3RNZXNzYWdlKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0ge1xuICAgICAgICAgICAgZGF0YTogc3RydWN0dXJlZENsb25lKHQsIG51bGwpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX28pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYSkpIHQuY2FsbCh0aGlzLCBuKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhZGRFdmVudExpc3RlbmVyKHQsIGUpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2EpLmFkZChlKTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKHQsIGUpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2EpLmRlbGV0ZShlKTtcbiAgICAgICAgfVxuICAgICAgICB0ZXJtaW5hdGUoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hKS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleHBvcnRzLkxvb3BiYWNrUG9ydCA9IExvb3BiYWNrUG9ydDtcbiAgICAgIGNvbnN0IFBERldvcmtlclV0aWwgPSB7XG4gICAgICAgIGlzV29ya2VyRGlzYWJsZWQ6ICExLFxuICAgICAgICBmYWxsYmFja1dvcmtlclNyYzogbnVsbCxcbiAgICAgICAgZmFrZVdvcmtlcklkOiAwXG4gICAgICB9O1xuICAgICAgZXhwb3J0cy5QREZXb3JrZXJVdGlsID0gUERGV29ya2VyVXRpbDtcbiAgICAgIGlmIChfdXRpbC5pc05vZGVKUyAmJiBcImZ1bmN0aW9uXCIgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIFBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCA9ICEwO1xuICAgICAgICBQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjID0gXCIuL3BkZi53b3JrZXIuanNcIjtcbiAgICAgIH0gZWxzZSBpZiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgZG9jdW1lbnQpIHtcbiAgICAgICAgdmFyIF9kb2N1bWVudDtcbiAgICAgICAgY29uc3QgdCA9IChfZG9jdW1lbnQgPSBkb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50ID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCA9IF9kb2N1bWVudC5jdXJyZW50U2NyaXB0KSA9PT0gbnVsbCB8fCBfZG9jdW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kb2N1bWVudC5zcmM7XG4gICAgICAgIHQgJiYgKFBERldvcmtlclV0aWwuZmFsbGJhY2tXb3JrZXJTcmMgPSB0LnJlcGxhY2UoLyhcXC4oPzptaW5cXC4pP2pzKShcXD8uKik/JC9pLCBcIi53b3JrZXIkMSQyXCIpKTtcbiAgICAgIH1cbiAgICAgIFBERldvcmtlclV0aWwuaXNTYW1lT3JpZ2luID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgbGV0IG47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbiA9IG5ldyBVUkwodCk7XG4gICAgICAgICAgaWYgKCFuLm9yaWdpbiB8fCBcIm51bGxcIiA9PT0gbi5vcmlnaW4pIHJldHVybiAhMTtcbiAgICAgICAgfSBjYXRjaCAoX3VudXNlZDUpIHtcbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaSA9IG5ldyBVUkwoZSwgbik7XG4gICAgICAgIHJldHVybiBuLm9yaWdpbiA9PT0gaS5vcmlnaW47XG4gICAgICB9O1xuICAgICAgUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IFwiaW1wb3J0U2NyaXB0cyhcXFwiXCIuY29uY2F0KHQsIFwiXFxcIik7XCIpO1xuICAgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbZV0pKTtcbiAgICAgIH07XG4gICAgICBjbGFzcyBQREZXb3JrZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgbmFtZTogdCA9IG51bGwsXG4gICAgICAgICAgICBwb3J0OiBlID0gbnVsbCxcbiAgICAgICAgICAgIHZlcmJvc2l0eTogbiA9ICgwLCBfdXRpbC5nZXRWZXJib3NpdHlMZXZlbCkoKVxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIGlmIChlICYmIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoUERGV29ya2VyLCBQREZXb3JrZXIsIF9sKS5oYXMoZSkpIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSBQREZXb3JrZXIgcGVyIHBvcnQuXCIpO1xuICAgICAgICAgIHRoaXMubmFtZSA9IHQ7XG4gICAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IG47XG4gICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5fcG9ydCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoUERGV29ya2VyLCBQREZXb3JrZXIsIF9sKS5zZXQoZSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplRnJvbVBvcnQoZSk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuX2luaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBvcnQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IG1lc3NhZ2VIYW5kbGVyKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgfVxuICAgICAgICBfaW5pdGlhbGl6ZUZyb21Qb3J0KHQpIHtcbiAgICAgICAgICB0aGlzLl9wb3J0ID0gdDtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKFwibWFpblwiLCBcIndvcmtlclwiLCB0KTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5vbihcInJlYWR5XCIsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLnNlbmQoXCJjb25maWd1cmVcIiwge1xuICAgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9pbml0aWFsaXplKCkge1xuICAgICAgICAgIGlmICghUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkICYmICFQREZXb3JrZXIuX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgd29ya2VyU3JjOiB0XG4gICAgICAgICAgICB9ID0gUERGV29ya2VyO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgUERGV29ya2VyVXRpbC5pc1NhbWVPcmlnaW4od2luZG93LmxvY2F0aW9uLmhyZWYsIHQpIHx8ICh0ID0gUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyKG5ldyBVUkwodCwgd2luZG93LmxvY2F0aW9uKS5ocmVmKSk7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgV29ya2VyKHQpLFxuICAgICAgICAgICAgICAgIG4gPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihcIm1haW5cIiwgXCJ3b3JrZXJcIiwgZSksXG4gICAgICAgICAgICAgICAgdGVybWluYXRlRWFybHkgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcbiAgICAgICAgICAgICAgICAgIG4uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgZS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveWVkID8gdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSkgOiB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uV29ya2VyRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIgfHwgdGVybWluYXRlRWFybHkoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBlLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcbiAgICAgICAgICAgICAgbi5vbihcInRlc3RcIiwgdCA9PiB7XG4gICAgICAgICAgICAgICAgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25Xb3JrZXJFcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB0ZXJtaW5hdGVFYXJseSgpO2Vsc2UgaWYgKHQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbjtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcnQgPSBlO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICBuLnNlbmQoXCJjb25maWd1cmVcIiwge1xuICAgICAgICAgICAgICAgICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgICAgICAgICAgICBuLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgIGUudGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbi5vbihcInJlYWR5XCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgdGVybWluYXRlRWFybHkoKTtlbHNlIHRyeSB7XG4gICAgICAgICAgICAgICAgICBzZW5kVGVzdCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ2KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBzZW5kVGVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgICAgICAgICBuLnNlbmQoXCJ0ZXN0XCIsIHQsIFt0LmJ1ZmZlcl0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBzZW5kVGVzdCgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGNhdGNoIChfdW51c2VkNykge1xuICAgICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoXCJUaGUgd29ya2VyIGhhcyBiZWVuIGRpc2FibGVkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldHVwRmFrZVdvcmtlcigpIHtcbiAgICAgICAgICBpZiAoIVBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCkge1xuICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKFwiU2V0dGluZyB1cCBmYWtlIHdvcmtlci5cIik7XG4gICAgICAgICAgICBQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgPSAhMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgUERGV29ya2VyLl9zZXR1cEZha2VXb3JrZXJHbG9iYWwudGhlbih0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBMb29wYmFja1BvcnQoKTtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQgPSBlO1xuICAgICAgICAgICAgY29uc3QgbiA9IFwiZmFrZVwiICsgUERGV29ya2VyVXRpbC5mYWtlV29ya2VySWQrKyxcbiAgICAgICAgICAgICAgaSA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4gKyBcIl93b3JrZXJcIiwgbiwgZSk7XG4gICAgICAgICAgICB0LnNldHVwKGksIGUpO1xuICAgICAgICAgICAgY29uc3QgciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKG4sIG4gKyBcIl93b3JrZXJcIiwgZSk7XG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IHI7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgci5zZW5kKFwiY29uZmlndXJlXCIsIHtcbiAgICAgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkuY2F0Y2godCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIlNldHRpbmcgdXAgZmFrZSB3b3JrZXIgZmFpbGVkOiBcXFwiXCIuY29uY2F0KHQubWVzc2FnZSwgXCJcXFwiLlwiKSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSAhMDtcbiAgICAgICAgICBpZiAodGhpcy5fd2ViV29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KFBERldvcmtlciwgUERGV29ya2VyLCBfbCkuZGVsZXRlKHRoaXMuX3BvcnQpO1xuICAgICAgICAgIHRoaXMuX3BvcnQgPSBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLl9tZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZnJvbVBvcnQodCkge1xuICAgICAgICAgIGlmICghKHQgIT09IG51bGwgJiYgdCAhPT0gdm9pZCAwICYmIHQucG9ydCkpIHRocm93IG5ldyBFcnJvcihcIlBERldvcmtlci5mcm9tUG9ydCAtIGludmFsaWQgbWV0aG9kIHNpZ25hdHVyZS5cIik7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQodGhpcywgUERGV29ya2VyLCBfbCkuaGFzKHQucG9ydCkgPyBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KHRoaXMsIFBERldvcmtlciwgX2wpLmdldCh0LnBvcnQpIDogbmV3IFBERldvcmtlcih0KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IHdvcmtlclNyYygpIHtcbiAgICAgICAgICBpZiAoX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKSByZXR1cm4gX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjO1xuICAgICAgICAgIGlmIChudWxsICE9PSBQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjKSB7XG4gICAgICAgICAgICBfdXRpbC5pc05vZGVKUyB8fCAoMCwgX2Rpc3BsYXlfdXRpbHMuZGVwcmVjYXRlZCkoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG4gICAgICAgICAgICByZXR1cm4gUERGV29ya2VyVXRpbC5mYWxsYmFja1dvcmtlclNyYztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjXCIgc3BlY2lmaWVkLicpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9nbG9iYWxUaGlzJHBkZmpzV29yaztcbiAgICAgICAgICAgIHJldHVybiAoKF9nbG9iYWxUaGlzJHBkZmpzV29yayA9IGdsb2JhbFRoaXMucGRmanNXb3JrZXIpID09PSBudWxsIHx8IF9nbG9iYWxUaGlzJHBkZmpzV29yayA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dsb2JhbFRoaXMkcGRmanNXb3JrLldvcmtlck1lc3NhZ2VIYW5kbGVyKSB8fCBudWxsO1xuICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBfc2V0dXBGYWtlV29ya2VyR2xvYmFsKCkge1xuICAgICAgICAgIGNvbnN0IGxvYWRlciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlciA9IHRoaXMuX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgICAgIGlmIChtYWluV29ya2VyTWVzc2FnZUhhbmRsZXIpIHJldHVybiBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICAgICAgICBpZiAoX3V0aWwuaXNOb2RlSlMgJiYgXCJmdW5jdGlvblwiID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICBjb25zdCB3b3JrZXIgPSBldmFsKFwicmVxdWlyZVwiKSh0aGlzLndvcmtlclNyYyk7XG4gICAgICAgICAgICAgIHJldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCAoMCwgX2Rpc3BsYXlfdXRpbHMubG9hZFNjcmlwdCkodGhpcy53b3JrZXJTcmMpO1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCBcIl9zZXR1cEZha2VXb3JrZXJHbG9iYWxcIiwgbG9hZGVyKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX2wgPSB7XG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogbmV3IFdlYWtNYXAoKVxuICAgICAgfTtcbiAgICAgIGV4cG9ydHMuUERGV29ya2VyID0gUERGV29ya2VyO1xuICAgICAgdmFyIF9jID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2ggPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF91MiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9wID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBXb3JrZXJUcmFuc3BvcnQge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDMsIF9lMywgX24yLCBfaTIsIHIpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3ApO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9jLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IE1hcCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2QsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF91Miwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBfdDM7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nVGFzayA9IF9lMztcbiAgICAgICAgICB0aGlzLmNvbW1vbk9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuICAgICAgICAgIHRoaXMuZm9udExvYWRlciA9IG5ldyBfZm9udF9sb2FkZXIuRm9udExvYWRlcih7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50OiBfaTIub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIHN0eWxlRWxlbWVudDogX2kyLnN0eWxlRWxlbWVudFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3BhcmFtcyA9IF9pMjtcbiAgICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSByLmNhbnZhc0ZhY3Rvcnk7XG4gICAgICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gci5maWx0ZXJGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuY01hcFJlYWRlckZhY3RvcnkgPSByLmNNYXBSZWFkZXJGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSByLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gITE7XG4gICAgICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fbmV0d29ya1N0cmVhbSA9IF9uMjtcbiAgICAgICAgICB0aGlzLl9mdWxsUmVhZGVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJhbm5vdGF0aW9uU3RvcmFnZVwiLCBuZXcgX2Fubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSZW5kZXJpbmdJbnRlbnQodCkge1xuICAgICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEUsXG4gICAgICAgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiBudWxsLFxuICAgICAgICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdICYmIGFyZ3VtZW50c1szXSxcbiAgICAgICAgICAgIHIgPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVksXG4gICAgICAgICAgICBzID0gX2Fubm90YXRpb25fc3RvcmFnZS5TZXJpYWxpemFibGVFbXB0eTtcbiAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgICAgICAgciA9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5ZO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkaXNwbGF5XCI6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInByaW50XCI6XG4gICAgICAgICAgICAgIHIgPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShcImdldFJlbmRlcmluZ0ludGVudCAtIGludmFsaWQgaW50ZW50OiBcIi5jb25jYXQodCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbk1vZGUuRElTQUJMRTpcbiAgICAgICAgICAgICAgciArPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0RJU0FCTEU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEU6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEVfRk9STVM6XG4gICAgICAgICAgICAgIHIgKz0gX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19GT1JNUztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRV9TVE9SQUdFOlxuICAgICAgICAgICAgICByICs9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfU1RPUkFHRTtcbiAgICAgICAgICAgICAgcyA9IChyICYgX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCAmJiBuIGluc3RhbmNlb2YgX2Fubm90YXRpb25fc3RvcmFnZS5QcmludEFubm90YXRpb25TdG9yYWdlID8gbiA6IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UpLnNlcmlhbGl6YWJsZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoXCJnZXRSZW5kZXJpbmdJbnRlbnQgLSBpbnZhbGlkIGFubm90YXRpb25Nb2RlOiBcIi5jb25jYXQoZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpICYmIChyICs9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuT1BMSVNUKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVuZGVyaW5nSW50ZW50OiByLFxuICAgICAgICAgICAgY2FjaGVLZXk6IFwiXCIuY29uY2F0KHIsIFwiX1wiKS5jb25jYXQocy5oYXNoKSxcbiAgICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlU2VyaWFsaXphYmxlOiBzXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQyO1xuICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5KSByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gITA7XG4gICAgICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQyID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF91MikpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDIucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkIGR1cmluZyBvblBhc3N3b3JkIGNhbGxiYWNrXCIpKTtcbiAgICAgICAgICBjb25zdCB0ID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaCkudmFsdWVzKCkpIHQucHVzaChlLl9kZXN0cm95KCkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaCkuY2xlYXIoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2QpLmNsZWFyKCk7XG4gICAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eShcImFubm90YXRpb25TdG9yYWdlXCIpICYmIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIlRlcm1pbmF0ZVwiLCBudWxsKTtcbiAgICAgICAgICB0LnB1c2goZSk7XG4gICAgICAgICAgUHJvbWlzZS5hbGwodCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jKS5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX25ldHdvcmtTdHJlYW0gJiYgdGhpcy5fbmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oXCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuXCIpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIH0sIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHNldHVwTWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXI6IHQsXG4gICAgICAgICAgICBsb2FkaW5nVGFzazogZVxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHQub24oXCJHZXRSZWFkZXJcIiwgKHQsIGUpID0+IHtcbiAgICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHRoaXMuX25ldHdvcmtTdHJlYW0sIFwiR2V0UmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICB0aGlzLl9mdWxsUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSB0ID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzID0ge1xuICAgICAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWQsXG4gICAgICAgICAgICAgICAgdG90YWw6IHQudG90YWxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogbixcbiAgICAgICAgICAgICAgICAgIGRvbmU6IGlcbiAgICAgICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICAgICAgICBpZiAoaSkgZS5jbG9zZSgpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLCBcIkdldFJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiKTtcbiAgICAgICAgICAgICAgICAgIGUuZW5xdWV1ZShuZXcgVWludDhBcnJheShuKSwgMSwgW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgICAgIGUuZXJyb3IodCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGUub25DYW5jZWwgPSB0ID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5jYW5jZWwodCk7XG4gICAgICAgICAgICAgIGUucmVhZHkuY2F0Y2godCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhyb3cgdDtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJSZWFkZXJIZWFkZXJzUmVhZHlcIiwgdCA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCksXG4gICAgICAgICAgICAgIGkgPSB0aGlzLl9mdWxsUmVhZGVyO1xuICAgICAgICAgICAgaS5oZWFkZXJzUmVhZHkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaS5pc1N0cmVhbWluZ1N1cHBvcnRlZCB8fCAhaS5pc1JhbmdlU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9lJG9uUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzICYmICgoX2Ukb25Qcm9ncmVzcyA9IGUub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX2Ukb25Qcm9ncmVzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Ukb25Qcm9ncmVzcy5jYWxsKGUsIHRoaXMuX2xhc3RQcm9ncmVzcykpO1xuICAgICAgICAgICAgICAgIGkub25Qcm9ncmVzcyA9IHQgPT4ge1xuICAgICAgICAgICAgICAgICAgdmFyIF9lJG9uUHJvZ3Jlc3MyO1xuICAgICAgICAgICAgICAgICAgKF9lJG9uUHJvZ3Jlc3MyID0gZS5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfZSRvblByb2dyZXNzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Ukb25Qcm9ncmVzczIuY2FsbChlLCB7XG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWQsXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsOiB0LnRvdGFsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG4ucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgaXNTdHJlYW1pbmdTdXBwb3J0ZWQ6IGkuaXNTdHJlYW1pbmdTdXBwb3J0ZWQsXG4gICAgICAgICAgICAgICAgaXNSYW5nZVN1cHBvcnRlZDogaS5pc1JhbmdlU3VwcG9ydGVkLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGkuY29udGVudExlbmd0aFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIG4ucmVqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBuLnByb21pc2U7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIkdldFJhbmdlUmVhZGVyXCIsICh0LCBlKSA9PiB7XG4gICAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0aGlzLl9uZXR3b3JrU3RyZWFtLCBcIkdldFJhbmdlUmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICBjb25zdCBuID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcih0LmJlZ2luLCB0LmVuZCk7XG4gICAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgICBlLm9uUHVsbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBuLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbixcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogaVxuICAgICAgICAgICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgICAgICAgICBpZiAoaSkgZS5jbG9zZSgpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsIFwiR2V0UmFuZ2VSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci5cIik7XG4gICAgICAgICAgICAgICAgICAgIGUuZW5xdWV1ZShuZXcgVWludDhBcnJheShuKSwgMSwgW25dKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuZXJyb3IodCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGUub25DYW5jZWwgPSB0ID0+IHtcbiAgICAgICAgICAgICAgICBuLmNhbmNlbCh0KTtcbiAgICAgICAgICAgICAgICBlLnJlYWR5LmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhyb3cgdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBlLmNsb3NlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIkdldERvY1wiLCB0ID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIHBkZkluZm86IG5cbiAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgdGhpcy5fbnVtUGFnZXMgPSBuLm51bVBhZ2VzO1xuICAgICAgICAgICAgdGhpcy5faHRtbEZvclhmYSA9IG4uaHRtbEZvclhmYTtcbiAgICAgICAgICAgIGRlbGV0ZSBuLmh0bWxGb3JYZmE7XG4gICAgICAgICAgICBlLl9jYXBhYmlsaXR5LnJlc29sdmUobmV3IFBERkRvY3VtZW50UHJveHkobiwgdGhpcykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJEb2NFeGNlcHRpb25cIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGxldCBuO1xuICAgICAgICAgICAgc3dpdGNoICh0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIlBhc3N3b3JkRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbih0Lm1lc3NhZ2UsIHQuY29kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJJbnZhbGlkUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICAgICAgbiA9IG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcbiAgICAgICAgICAgICAgICBuID0gbmV3IF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbih0Lm1lc3NhZ2UsIHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcIlVua25vd25FcnJvckV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgICAgIG4gPSBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5kZXRhaWxzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiRG9jRXhjZXB0aW9uIC0gZXhwZWN0ZWQgYSB2YWxpZCBFcnJvci5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLl9jYXBhYmlsaXR5LnJlamVjdChuKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiUGFzc3dvcmRSZXF1ZXN0XCIsIHQgPT4ge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF91MiwgbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCkpO1xuICAgICAgICAgICAgaWYgKGUub25QYXNzd29yZCkge1xuICAgICAgICAgICAgICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IHQgPT4ge1xuICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBFcnJvciA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdTIpLnJlamVjdCh0KSA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdTIpLnJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlLm9uUGFzc3dvcmQodXBkYXRlUGFzc3dvcmQsIHQuY29kZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3UyKS5yZWplY3QodCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3UyKS5yZWplY3QobmV3IF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5jb2RlKSk7XG4gICAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF91MikucHJvbWlzZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiRGF0YUxvYWRlZFwiLCB0ID0+IHtcbiAgICAgICAgICAgIHZhciBfZSRvblByb2dyZXNzMztcbiAgICAgICAgICAgIChfZSRvblByb2dyZXNzMyA9IGUub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX2Ukb25Qcm9ncmVzczMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lJG9uUHJvZ3Jlc3MzLmNhbGwoZSwge1xuICAgICAgICAgICAgICBsb2FkZWQ6IHQubGVuZ3RoLFxuICAgICAgICAgICAgICB0b3RhbDogdC5sZW5ndGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnJlc29sdmUodCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIlN0YXJ0UmVuZGVyUGFnZVwiLCB0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS5nZXQodC5wYWdlSW5kZXgpLl9zdGFydFJlbmRlclBhZ2UodC50cmFuc3BhcmVuY3ksIHQuY2FjaGVLZXkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJjb21tb25vYmpcIiwgZSA9PiB7XG4gICAgICAgICAgICB2YXIgX2dsb2JhbFRoaXMkRm9udEluc3BlO1xuICAgICAgICAgICAgbGV0IFtuLCBpLCByXSA9IGU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVzdHJveWVkICYmICF0aGlzLmNvbW1vbk9ianMuaGFzKG4pKSBzd2l0Y2ggKGkpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5fcGFyYW1zO1xuICAgICAgICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gcikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHIuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoXCJFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiBcIi5jb25jYXQodCkpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUobiwgdCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IGUucGRmQnVnICYmIChfZ2xvYmFsVGhpcyRGb250SW5zcGUgPSBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJEZvbnRJbnNwZSAhPT0gdm9pZCAwICYmIF9nbG9iYWxUaGlzJEZvbnRJbnNwZS5lbmFibGVkID8gKHQsIGUpID0+IGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQodCwgZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgYSA9IG5ldyBfZm9udF9sb2FkZXIuRm9udEZhY2VPYmplY3Qociwge1xuICAgICAgICAgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IGUuaXNFdmFsU3VwcG9ydGVkLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlRm9udEZhY2U6IGUuZGlzYWJsZUZvbnRGYWNlLFxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVFcnJvcnM6IGUuaWdub3JlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICBpbnNwZWN0Rm9udDogc1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb250TG9hZGVyLmJpbmQoYSkuY2F0Y2goZSA9PiB0LnNlbmRXaXRoUHJvbWlzZShcIkZvbnRGYWxsYmFja1wiLCB7XG4gICAgICAgICAgICAgICAgICBpZDogblxuICAgICAgICAgICAgICAgIH0pKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICFlLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgYS5kYXRhICYmIChhLmRhdGEgPSBudWxsKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKG4sIGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiRm9udFBhdGhcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkltYWdlXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUobiwgcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHVua25vd24gY29tbW9uIG9iamVjdCB0eXBlIFwiLmNvbmNhdChpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIm9ialwiLCB0ID0+IHtcbiAgICAgICAgICAgIGxldCBbZSwgbiwgaSwgcl0gPSB0O1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBzID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS5nZXQobik7XG4gICAgICAgICAgICBpZiAoIXMub2Jqcy5oYXMoZSkpIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcbiAgICAgICAgICAgICAgICBzLm9ianMucmVzb2x2ZShlLCByKTtcbiAgICAgICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICAgICAgdmFyIF9yJGRhdGE7XG4gICAgICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgICAgIGlmIChyLmJpdG1hcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICAgICAgICAgIH0gPSByO1xuICAgICAgICAgICAgICAgICAgICB0ID0gZSAqIG4gKiA0O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHQgPSAoKF9yJGRhdGEgPSByLmRhdGEpID09PSBudWxsIHx8IF9yJGRhdGEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9yJGRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgICAgICAgICAgICAgdCA+IF91dGlsLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFICYmIChzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlciA9ICEwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG4gICAgICAgICAgICAgICAgcy5vYmpzLnJlc29sdmUoZSwgcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHVua25vd24gb2JqZWN0IHR5cGUgXCIuY29uY2F0KGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiRG9jUHJvZ3Jlc3NcIiwgdCA9PiB7XG4gICAgICAgICAgICB2YXIgX2Ukb25Qcm9ncmVzczQ7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3llZCB8fCAoKF9lJG9uUHJvZ3Jlc3M0ID0gZS5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfZSRvblByb2dyZXNzNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Ukb25Qcm9ncmVzczQuY2FsbChlLCB7XG4gICAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWQsXG4gICAgICAgICAgICAgIHRvdGFsOiB0LnRvdGFsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcIkZldGNoQnVpbHRJbkNNYXBcIiwgdCA9PiB0aGlzLmRlc3Ryb3llZCA/IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSkgOiB0aGlzLmNNYXBSZWFkZXJGYWN0b3J5ID8gdGhpcy5jTWFwUmVhZGVyRmFjdG9yeS5mZXRjaCh0KSA6IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNNYXBSZWFkZXJGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpKTtcbiAgICAgICAgICB0Lm9uKFwiRmV0Y2hTdGFuZGFyZEZvbnREYXRhXCIsIHQgPT4gdGhpcy5kZXN0cm95ZWQgPyBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZC5cIikpIDogdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA/IHRoaXMuc3RhbmRhcmRGb250RGF0YUZhY3RvcnkuZmV0Y2godCkgOiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQsIHNlZSB0aGUgYHVzZVdvcmtlckZldGNoYCBwYXJhbWV0ZXIuXCIpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGF0YSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREYXRhXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHNhdmVEb2N1bWVudCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZWFkZXIkZmlsLCBfdGhpcyRfZnVsbFJlYWRlcjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNpemUgPD0gMCAmJiAoMCwgX3V0aWwud2FybikoXCJzYXZlRG9jdW1lbnQgY2FsbGVkIHdoaWxlIGBhbm5vdGF0aW9uU3RvcmFnZWAgaXMgZW1wdHksIHBsZWFzZSB1c2UgdGhlIGdldERhdGEtbWV0aG9kIGluc3RlYWQuXCIpO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG1hcDogdCxcbiAgICAgICAgICAgIHRyYW5zZmVyczogZVxuICAgICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNlcmlhbGl6YWJsZTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJTYXZlRG9jdW1lbnRcIiwge1xuICAgICAgICAgICAgaXNQdXJlWGZhOiAhIXRoaXMuX2h0bWxGb3JYZmEsXG4gICAgICAgICAgICBudW1QYWdlczogdGhpcy5fbnVtUGFnZXMsXG4gICAgICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogdCxcbiAgICAgICAgICAgIGZpbGVuYW1lOiAoX3RoaXMkX2Z1bGxSZWFkZXIkZmlsID0gKF90aGlzJF9mdWxsUmVhZGVyID0gdGhpcy5fZnVsbFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZWFkZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVhZGVyLmZpbGVuYW1lKSAhPT0gbnVsbCAmJiBfdGhpcyRfZnVsbFJlYWRlciRmaWwgIT09IHZvaWQgMCA/IF90aGlzJF9mdWxsUmVhZGVyJGZpbCA6IG51bGxcbiAgICAgICAgICB9LCBlKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2UodCkge1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih0KSB8fCB0IDw9IDAgfHwgdCA+IHRoaXMuX251bVBhZ2VzKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlIHJlcXVlc3QuXCIpKTtcbiAgICAgICAgICBjb25zdCBlID0gdCAtIDEsXG4gICAgICAgICAgICBuID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9kKS5nZXQoZSk7XG4gICAgICAgICAgaWYgKG4pIHJldHVybiBuO1xuICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VcIiwge1xuICAgICAgICAgICAgcGFnZUluZGV4OiBlXG4gICAgICAgICAgfSkudGhlbih0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNwb3J0IGRlc3Ryb3llZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUERGUGFnZVByb3h5KGUsIHQsIHRoaXMsIHRoaXMuX3BhcmFtcy5wZGZCdWcpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS5zZXQoZSwgbik7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2QpLnNldChlLCBpKTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYWdlSW5kZXgodCkge1xuICAgICAgICAgIHJldHVybiBcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8IG51bGwgPT09IHQgfHwgIU51bWJlci5pc0ludGVnZXIodC5udW0pIHx8IHQubnVtIDwgMCB8fCAhTnVtYmVyLmlzSW50ZWdlcih0LmdlbikgfHwgdC5nZW4gPCAwID8gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlSW5kZXggcmVxdWVzdC5cIikpIDogdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlSW5kZXhcIiwge1xuICAgICAgICAgICAgbnVtOiB0Lm51bSxcbiAgICAgICAgICAgIGdlbjogdC5nZW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRBbm5vdGF0aW9ucyh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QW5ub3RhdGlvbnNcIiwge1xuICAgICAgICAgICAgcGFnZUluZGV4OiB0LFxuICAgICAgICAgICAgaW50ZW50OiBlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RmllbGRPYmplY3RzKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9wLCBfcDIpLmNhbGwodGhpcywgXCJHZXRGaWVsZE9iamVjdHNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaGFzSlNBY3Rpb25zKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9wLCBfcDIpLmNhbGwodGhpcywgXCJIYXNKU0FjdGlvbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRDYWxjdWxhdGlvbk9yZGVySWRzXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGdldERlc3RpbmF0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREZXN0aW5hdGlvbnNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RGVzdGluYXRpb24odCkge1xuICAgICAgICAgIHJldHVybiBcInN0cmluZ1wiICE9IHR5cGVvZiB0ID8gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBkZXN0aW5hdGlvbiByZXF1ZXN0LlwiKSkgOiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERlc3RpbmF0aW9uXCIsIHtcbiAgICAgICAgICAgIGlkOiB0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZUxhYmVscygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGFiZWxzXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhZ2VMYXlvdXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUxheW91dFwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYWdlTW9kZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTW9kZVwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRWaWV3ZXJQcmVmZXJlbmNlc1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRPcGVuQWN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE9wZW5BY3Rpb25cIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QXR0YWNobWVudHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QXR0YWNobWVudHNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SmF2YVNjcmlwdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRKYXZhU2NyaXB0XCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGdldERvY0pTQWN0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NKU0FjdGlvbnNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGFnZUpTQWN0aW9ucyh0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUpTQWN0aW9uc1wiLCB7XG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRTdHJ1Y3RUcmVlKHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRTdHJ1Y3RUcmVlXCIsIHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldE91dGxpbmUoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3V0bGluZVwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnXCIsIG51bGwpLnRoZW4odCA9PiBuZXcgX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLk9wdGlvbmFsQ29udGVudENvbmZpZyh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGVybWlzc2lvbnMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGVybWlzc2lvbnNcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IFwiR2V0TWV0YWRhdGFcIixcbiAgICAgICAgICAgIGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2MpLmdldCh0KTtcbiAgICAgICAgICBpZiAoZSkgcmV0dXJuIGU7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKHQsIG51bGwpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiwgX3RoaXMkX2Z1bGxSZWFkZXIyLCBfdGhpcyRfZnVsbFJlYWRlciRjb24sIF90aGlzJF9mdWxsUmVhZGVyMztcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGluZm86IHRbMF0sXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB0WzFdID8gbmV3IF9tZXRhZGF0YS5NZXRhZGF0YSh0WzFdKSA6IG51bGwsXG4gICAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOiAoX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiA9IChfdGhpcyRfZnVsbFJlYWRlcjIgPSB0aGlzLl9mdWxsUmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlYWRlcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVhZGVyMi5maWxlbmFtZSkgIT09IG51bGwgJiYgX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiAhPT0gdm9pZCAwID8gX3RoaXMkX2Z1bGxSZWFkZXIkZmlsMiA6IG51bGwsXG4gICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IChfdGhpcyRfZnVsbFJlYWRlciRjb24gPSAoX3RoaXMkX2Z1bGxSZWFkZXIzID0gdGhpcy5fZnVsbFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZWFkZXIzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfZnVsbFJlYWRlcjMuY29udGVudExlbmd0aCkgIT09IG51bGwgJiYgX3RoaXMkX2Z1bGxSZWFkZXIkY29uICE9PSB2b2lkIDAgPyBfdGhpcyRfZnVsbFJlYWRlciRjb24gOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYykuc2V0KHQsIG4pO1xuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIGdldE1hcmtJbmZvKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE1hcmtJbmZvXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHN0YXJ0Q2xlYW51cCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXTtcbiAgICAgICAgICBpZiAoIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkNsZWFudXBcIiwgbnVsbCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9oKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgICBpZiAoIXQuY2xlYW51cCgpKSB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydENsZWFudXA6IFBhZ2UgXCIuY29uY2F0KHQucGFnZU51bWJlciwgXCIgaXMgY3VycmVudGx5IHJlbmRlcmluZy5cIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLmNsZWFyKCk7XG4gICAgICAgICAgICB0IHx8IHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jKS5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3koITApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgbG9hZGluZ1BhcmFtcygpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkaXNhYmxlQXV0b0ZldGNoOiB0LFxuICAgICAgICAgICAgZW5hYmxlWGZhOiBlXG4gICAgICAgICAgfSA9IHRoaXMuX3BhcmFtcztcbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJsb2FkaW5nUGFyYW1zXCIsIHtcbiAgICAgICAgICAgIGRpc2FibGVBdXRvRmV0Y2g6IHQsXG4gICAgICAgICAgICBlbmFibGVYZmE6IGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3AyKHQpIHtcbiAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2MpLmdldCh0KTtcbiAgICAgICAgaWYgKG4pIHJldHVybiBuO1xuICAgICAgICBjb25zdCBpID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UodCwgZSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYykuc2V0KHQsIGkpO1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICAgIHZhciBfZiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9nID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBQREZPYmplY3RzIHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9nKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9nLCBfZzIpLmNhbGwodGhpcywgdCk7XG4gICAgICAgICAgICBuLmNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IGUobi5kYXRhKSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZilbdF07XG4gICAgICAgICAgaWYgKCEobiAhPT0gbnVsbCAmJiBuICE9PSB2b2lkIDAgJiYgbi5jYXBhYmlsaXR5LnNldHRsZWQpKSB0aHJvdyBuZXcgRXJyb3IoXCJSZXF1ZXN0aW5nIG9iamVjdCB0aGF0IGlzbid0IHJlc29sdmVkIHlldCBcIi5jb25jYXQodCwgXCIuXCIpKTtcbiAgICAgICAgICByZXR1cm4gbi5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIGhhcyh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZilbdF07XG4gICAgICAgICAgcmV0dXJuIChlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuY2FwYWJpbGl0eS5zZXR0bGVkKSB8fCAhMTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfZywgX2cyKS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICAgIG4uZGF0YSA9IGU7XG4gICAgICAgICAgbi5jYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgaW4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mKSkge1xuICAgICAgICAgICAgdmFyIF9lJGJpdG1hcDtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZGF0YTogZVxuICAgICAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZilbdF07XG4gICAgICAgICAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCB8fCAoX2UkYml0bWFwID0gZS5iaXRtYXApID09PSBudWxsIHx8IF9lJGJpdG1hcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UkYml0bWFwLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9nMih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2YpW3RdO1xuICAgICAgICByZXR1cm4gZSB8fCAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mKVt0XSA9IHtcbiAgICAgICAgICBjYXBhYmlsaXR5OiBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKSxcbiAgICAgICAgICBkYXRhOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdmFyIF9tID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICBjbGFzcyBSZW5kZXJUYXNrIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9tLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9tLCB0KTtcbiAgICAgICAgICB0aGlzLm9uQ29udGludWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX20pLmNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDA7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tKS5jYW5jZWwobnVsbCwgdCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHNlcGFyYXRlQW5ub3RzKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHNlcGFyYXRlQW5ub3RzOiB0XG4gICAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbSkub3BlcmF0b3JMaXN0O1xuICAgICAgICAgIGlmICghdCkgcmV0dXJuICExO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGFubm90YXRpb25DYW52YXNNYXA6IGVcbiAgICAgICAgICB9ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tKTtcbiAgICAgICAgICByZXR1cm4gdC5mb3JtIHx8IHQuY2FudmFzICYmIChlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuc2l6ZSkgPiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleHBvcnRzLlJlbmRlclRhc2sgPSBSZW5kZXJUYXNrO1xuICAgICAgY2xhc3MgSW50ZXJuYWxSZW5kZXJUYXNrIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBjYWxsYmFjazogZSxcbiAgICAgICAgICAgIHBhcmFtczogbixcbiAgICAgICAgICAgIG9ianM6IGksXG4gICAgICAgICAgICBjb21tb25PYmpzOiByLFxuICAgICAgICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcDogcyxcbiAgICAgICAgICAgIG9wZXJhdG9yTGlzdDogYSxcbiAgICAgICAgICAgIHBhZ2VJbmRleDogbyxcbiAgICAgICAgICAgIGNhbnZhc0ZhY3Rvcnk6IGwsXG4gICAgICAgICAgICBmaWx0ZXJGYWN0b3J5OiBjLFxuICAgICAgICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiBoID0gITEsXG4gICAgICAgICAgICBwZGZCdWc6IGQgPSAhMSxcbiAgICAgICAgICAgIHBhZ2VDb2xvcnM6IHUgPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGU7XG4gICAgICAgICAgdGhpcy5wYXJhbXMgPSBuO1xuICAgICAgICAgIHRoaXMub2JqcyA9IGk7XG4gICAgICAgICAgdGhpcy5jb21tb25PYmpzID0gcjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBzO1xuICAgICAgICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IGE7XG4gICAgICAgICAgdGhpcy5fcGFnZUluZGV4ID0gbztcbiAgICAgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkgPSBsO1xuICAgICAgICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGM7XG4gICAgICAgICAgdGhpcy5fcGRmQnVnID0gZDtcbiAgICAgICAgICB0aGlzLnBhZ2VDb2xvcnMgPSB1O1xuICAgICAgICAgIHRoaXMucnVubmluZyA9ICExO1xuICAgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSAhMTtcbiAgICAgICAgICB0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAhMCA9PT0gaCAmJiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiB3aW5kb3c7XG4gICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLmNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLnRhc2sgPSBuZXcgUmVuZGVyVGFzayh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9jYW5jZWxCb3VuZCA9IHRoaXMuY2FuY2VsLmJpbmQodGhpcyk7XG4gICAgICAgICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7XG4gICAgICAgICAgdGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQgPSB0aGlzLl9zY2hlZHVsZU5leHQuYmluZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9uZXh0Qm91bmQgPSB0aGlzLl9uZXh0LmJpbmQodGhpcyk7XG4gICAgICAgICAgdGhpcy5fY2FudmFzID0gbi5jYW52YXNDb250ZXh0LmNhbnZhcztcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29tcGxldGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNhcGFiaWxpdHkucHJvbWlzZS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5pdGlhbGl6ZUdyYXBoaWNzKHQpIHtcbiAgICAgICAgICB2YXIgX2dsb2JhbFRoaXMkU3RlcHBlck1hLCBfdGhpcyRncmFwaGljc1JlYWR5Q2E7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHRyYW5zcGFyZW5jeTogZSA9ICExLFxuICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnOiBuXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgICAgaWYgKHRoaXMuX2NhbnZhcykge1xuICAgICAgICAgICAgaWYgKF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoSW50ZXJuYWxSZW5kZXJUYXNrLCBJbnRlcm5hbFJlbmRlclRhc2ssIF9iKS5oYXModGhpcy5fY2FudmFzKSkgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSB0aGUgc2FtZSBjYW52YXMgZHVyaW5nIG11bHRpcGxlIHJlbmRlcigpIG9wZXJhdGlvbnMuIFVzZSBkaWZmZXJlbnQgY2FudmFzIG9yIGVuc3VyZSBwcmV2aW91cyBvcGVyYXRpb25zIHdlcmUgY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC5cIik7XG4gICAgICAgICAgICBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KEludGVybmFsUmVuZGVyVGFzaywgSW50ZXJuYWxSZW5kZXJUYXNrLCBfYikuYWRkKHRoaXMuX2NhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9wZGZCdWcgJiYgKF9nbG9iYWxUaGlzJFN0ZXBwZXJNYSA9IGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXIpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJFN0ZXBwZXJNYSAhPT0gdm9pZCAwICYmIF9nbG9iYWxUaGlzJFN0ZXBwZXJNYS5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0ZXBwZXIgPSBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyLmNyZWF0ZSh0aGlzLl9wYWdlSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5zdGVwcGVyLmluaXQodGhpcy5vcGVyYXRvckxpc3QpO1xuICAgICAgICAgICAgdGhpcy5zdGVwcGVyLm5leHRCcmVha1BvaW50ID0gdGhpcy5zdGVwcGVyLmdldE5leHRCcmVha1BvaW50KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNhbnZhc0NvbnRleHQ6IGksXG4gICAgICAgICAgICB2aWV3cG9ydDogcixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcyxcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IGFcbiAgICAgICAgICB9ID0gdGhpcy5wYXJhbXM7XG4gICAgICAgICAgdGhpcy5nZnggPSBuZXcgX2NhbnZhcy5DYW52YXNHcmFwaGljcyhpLCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogblxuICAgICAgICAgIH0sIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCwgdGhpcy5wYWdlQ29sb3JzKTtcbiAgICAgICAgICB0aGlzLmdmeC5iZWdpbkRyYXdpbmcoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IHIsXG4gICAgICAgICAgICB0cmFuc3BhcmVuY3k6IGUsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBhXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSAwO1xuICAgICAgICAgIHRoaXMuZ3JhcGhpY3NSZWFkeSA9ICEwO1xuICAgICAgICAgIChfdGhpcyRncmFwaGljc1JlYWR5Q2EgPSB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjaykgPT09IG51bGwgfHwgX3RoaXMkZ3JhcGhpY3NSZWFkeUNhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRncmFwaGljc1JlYWR5Q2EuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGdmeDtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogbnVsbCxcbiAgICAgICAgICAgIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nID0gITE7XG4gICAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICAoX3RoaXMkZ2Z4ID0gdGhpcy5nZngpID09PSBudWxsIHx8IF90aGlzJGdmeCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZ2Z4LmVuZERyYXdpbmcoKTtcbiAgICAgICAgICB0aGlzLl9jYW52YXMgJiYgX2NsYXNzU3RhdGljUHJpdmF0ZUZpZWxkU3BlY0dldChJbnRlcm5hbFJlbmRlclRhc2ssIEludGVybmFsUmVuZGVyVGFzaywgX2IpLmRlbGV0ZSh0aGlzLl9jYW52YXMpO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2sodCB8fCBuZXcgX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKFwiUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSBcIi5jb25jYXQodGhpcy5fcGFnZUluZGV4ICsgMSksIGUpKTtcbiAgICAgICAgfVxuICAgICAgICBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuICAgICAgICAgIGlmICh0aGlzLmdyYXBoaWNzUmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRzdGVwcGVyO1xuICAgICAgICAgICAgKF90aGlzJHN0ZXBwZXIgPSB0aGlzLnN0ZXBwZXIpID09PSBudWxsIHx8IF90aGlzJHN0ZXBwZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHN0ZXBwZXIudXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTtcbiAgICAgICAgICAgIHRoaXMucnVubmluZyB8fCB0aGlzLl9jb250aW51ZSgpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayB8fCAodGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgPSB0aGlzLl9jb250aW51ZUJvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICBfY29udGludWUoKSB7XG4gICAgICAgICAgdGhpcy5ydW5uaW5nID0gITA7XG4gICAgICAgICAgdGhpcy5jYW5jZWxsZWQgfHwgKHRoaXMudGFzay5vbkNvbnRpbnVlID8gdGhpcy50YXNrLm9uQ29udGludWUodGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQpIDogdGhpcy5fc2NoZWR1bGVOZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIF9zY2hlZHVsZU5leHQoKSB7XG4gICAgICAgICAgdGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9uZXh0Qm91bmQoKS5jYXRjaCh0aGlzLl9jYW5jZWxCb3VuZCk7XG4gICAgICAgICAgfSkgOiBQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMuX25leHRCb3VuZCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIF9uZXh0KCkge1xuICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gdGhpcy5nZnguZXhlY3V0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCwgdGhpcy5vcGVyYXRvckxpc3RJZHgsIHRoaXMuX2NvbnRpbnVlQm91bmQsIHRoaXMuc3RlcHBlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvckxpc3RJZHggPT09IHRoaXMub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gITE7XG4gICAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKHRoaXMucGFnZUNvbG9ycyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FudmFzICYmIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZFNwZWNHZXQoSW50ZXJuYWxSZW5kZXJUYXNrLCBJbnRlcm5hbFJlbmRlclRhc2ssIF9iKS5kZWxldGUodGhpcy5fY2FudmFzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfYiA9IHtcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBuZXcgV2Vha1NldCgpXG4gICAgICB9O1xuICAgICAgY29uc3QgdmVyc2lvbiA9IFwiMy45LjE3OVwiO1xuICAgICAgZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgIGNvbnN0IGJ1aWxkID0gXCIxZWY2ZmJjNTJcIjtcbiAgICAgIGV4cG9ydHMuYnVpbGQgPSBidWlsZDtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxMjYpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJTZXRcIixcbiAgICAgICAgcHJvdG86ICEwLFxuICAgICAgICByZWFsOiAhMCxcbiAgICAgICAgZm9yY2VkOiAhbigxMzQpKFwiZGlmZmVyZW5jZVwiKVxuICAgICAgfSwge1xuICAgICAgICBkaWZmZXJlbmNlOiByXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMjcpLFxuICAgICAgICByID0gbigxMjgpLFxuICAgICAgICBzID0gbigxMjkpLFxuICAgICAgICBhID0gbigxMzIpLFxuICAgICAgICBvID0gbigxMzMpLFxuICAgICAgICBsID0gbigxMzApLFxuICAgICAgICBjID0gbigxMzEpLFxuICAgICAgICBoID0gci5oYXMsXG4gICAgICAgIGQgPSByLnJlbW92ZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpZmZlcmVuY2UodCkge1xuICAgICAgICB2YXIgZSA9IGkodGhpcyksXG4gICAgICAgICAgbiA9IG8odCksXG4gICAgICAgICAgciA9IHMoZSk7XG4gICAgICAgIGEoZSkgPD0gbi5zaXplID8gbChlLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIG4uaW5jbHVkZXModCkgJiYgZChyLCB0KTtcbiAgICAgICAgfSkgOiBjKG4uZ2V0SXRlcmF0b3IoKSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBoKGUsIHQpICYmIGQociwgdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxMjgpLmhhcztcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIGkodCk7XG4gICAgICAgIHJldHVybiB0O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IFNldC5wcm90b3R5cGU7XG4gICAgICB0LmV4cG9ydHMgPSB7XG4gICAgICAgIFNldDogU2V0LFxuICAgICAgICBhZGQ6IGkoci5hZGQpLFxuICAgICAgICBoYXM6IGkoci5oYXMpLFxuICAgICAgICByZW1vdmU6IGkoci5kZWxldGUpLFxuICAgICAgICBwcm90bzogclxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDEyOCksXG4gICAgICAgIHIgPSBuKDEzMCksXG4gICAgICAgIHMgPSBpLlNldCxcbiAgICAgICAgYSA9IGkuYWRkO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIGUgPSBuZXcgcygpO1xuICAgICAgICByKHQsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgYShlLCB0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDE0KSxcbiAgICAgICAgciA9IG4oMTMxKSxcbiAgICAgICAgcyA9IG4oMTI4KSxcbiAgICAgICAgYSA9IHMuU2V0LFxuICAgICAgICBvID0gcy5wcm90byxcbiAgICAgICAgbCA9IGkoby5mb3JFYWNoKSxcbiAgICAgICAgYyA9IGkoby5rZXlzKSxcbiAgICAgICAgaCA9IGMobmV3IGEoKSkubmV4dDtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHJldHVybiBuID8gcihjKHQpLCBlLCBoKSA6IGwodCwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICBmb3IgKHZhciByLCBzLCBhID0gbiB8fCB0Lm5leHQ7ICEociA9IGkoYSwgdCkpLmRvbmU7KSBpZiAodm9pZCAwICE9PSAocyA9IGUoci52YWx1ZSkpKSByZXR1cm4gcztcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig3MiksXG4gICAgICAgIHIgPSBuKDEyOCk7XG4gICAgICB0LmV4cG9ydHMgPSBpKHIucHJvdG8sIFwic2l6ZVwiLCBcImdldFwiKSB8fCBmdW5jdGlvbiAodCkge1xuICAgICAgICByZXR1cm4gdC5zaXplO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMxKSxcbiAgICAgICAgciA9IG4oNDcpLFxuICAgICAgICBzID0gbig4KSxcbiAgICAgICAgYSA9IG4oNjIpLFxuICAgICAgICBvID0gVHlwZUVycm9yLFxuICAgICAgICBsID0gTWF0aC5tYXgsXG4gICAgICAgIFNldFJlY29yZCA9IGZ1bmN0aW9uIFNldFJlY29yZCh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgdGhpcy5zZXQgPSB0O1xuICAgICAgICAgIHRoaXMuc2l6ZSA9IGU7XG4gICAgICAgICAgdGhpcy5oYXMgPSBuO1xuICAgICAgICAgIHRoaXMua2V5cyA9IGk7XG4gICAgICAgIH07XG4gICAgICBTZXRSZWNvcmQucHJvdG90eXBlID0ge1xuICAgICAgICBnZXRJdGVyYXRvcjogZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKSB7XG4gICAgICAgICAgcmV0dXJuIHIocyh0aGlzLmtleXMsIHRoaXMuc2V0KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyh0KSB7XG4gICAgICAgICAgcmV0dXJuIHModGhpcy5oYXMsIHRoaXMuc2V0LCB0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHIodCk7XG4gICAgICAgIHZhciBlID0gK3Quc2l6ZTtcbiAgICAgICAgaWYgKGUgIT0gZSkgdGhyb3cgbyhcIkludmFsaWQgc2l6ZVwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXRSZWNvcmQodCwgbChhKGUpLCAwKSwgaSh0LmhhcyksIGkodC5rZXlzKSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMjQpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXcgKGkoXCJTZXRcIikpKClbdF0oe1xuICAgICAgICAgICAgc2l6ZTogMCxcbiAgICAgICAgICAgIGhhczogZnVuY3Rpb24gaGFzKCkge1xuICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbig3KSxcbiAgICAgICAgcyA9IG4oMTM2KTtcbiAgICAgIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiU2V0XCIsXG4gICAgICAgIHByb3RvOiAhMCxcbiAgICAgICAgcmVhbDogITAsXG4gICAgICAgIGZvcmNlZDogIW4oMTM0KShcImludGVyc2VjdGlvblwiKSB8fCByKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gXCIzLDJcIiAhPSBBcnJheS5mcm9tKG5ldyBTZXQoWzEsIDIsIDNdKS5pbnRlcnNlY3Rpb24obmV3IFNldChbMywgMl0pKSk7XG4gICAgICAgIH0pXG4gICAgICB9LCB7XG4gICAgICAgIGludGVyc2VjdGlvbjogc1xuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTI3KSxcbiAgICAgICAgciA9IG4oMTI4KSxcbiAgICAgICAgcyA9IG4oMTMyKSxcbiAgICAgICAgYSA9IG4oMTMzKSxcbiAgICAgICAgbyA9IG4oMTMwKSxcbiAgICAgICAgbCA9IG4oMTMxKSxcbiAgICAgICAgYyA9IHIuU2V0LFxuICAgICAgICBoID0gci5hZGQsXG4gICAgICAgIGQgPSByLmhhcztcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIGludGVyc2VjdGlvbih0KSB7XG4gICAgICAgIHZhciBlID0gaSh0aGlzKSxcbiAgICAgICAgICBuID0gYSh0KSxcbiAgICAgICAgICByID0gbmV3IGMoKTtcbiAgICAgICAgcyhlKSA+IG4uc2l6ZSA/IGwobi5nZXRJdGVyYXRvcigpLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgIGQoZSwgdCkgJiYgaChyLCB0KTtcbiAgICAgICAgfSkgOiBvKGUsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgbi5pbmNsdWRlcyh0KSAmJiBoKHIsIHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMyksXG4gICAgICAgIHIgPSBuKDEzOCk7XG4gICAgICBpKHtcbiAgICAgICAgdGFyZ2V0OiBcIlNldFwiLFxuICAgICAgICBwcm90bzogITAsXG4gICAgICAgIHJlYWw6ICEwLFxuICAgICAgICBmb3JjZWQ6ICFuKDEzNCkoXCJpc0Rpc2pvaW50RnJvbVwiKVxuICAgICAgfSwge1xuICAgICAgICBpc0Rpc2pvaW50RnJvbTogclxuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTI3KSxcbiAgICAgICAgciA9IG4oMTI4KS5oYXMsXG4gICAgICAgIHMgPSBuKDEzMiksXG4gICAgICAgIGEgPSBuKDEzMyksXG4gICAgICAgIG8gPSBuKDEzMCksXG4gICAgICAgIGwgPSBuKDEzMSksXG4gICAgICAgIGMgPSBuKDEzOSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Rpc2pvaW50RnJvbSh0KSB7XG4gICAgICAgIHZhciBlID0gaSh0aGlzKSxcbiAgICAgICAgICBuID0gYSh0KTtcbiAgICAgICAgaWYgKHMoZSkgPD0gbi5zaXplKSByZXR1cm4gITEgIT09IG8oZSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAobi5pbmNsdWRlcyh0KSkgcmV0dXJuICExO1xuICAgICAgICB9LCAhMCk7XG4gICAgICAgIHZhciBoID0gbi5nZXRJdGVyYXRvcigpO1xuICAgICAgICByZXR1cm4gITEgIT09IGwoaCwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAocihlLCB0KSkgcmV0dXJuIGMoaCwgXCJub3JtYWxcIiwgITEpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig4KSxcbiAgICAgICAgciA9IG4oNDcpLFxuICAgICAgICBzID0gbigzMCk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICB2YXIgYSwgbztcbiAgICAgICAgcih0KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIShhID0gcyh0LCBcInJldHVyblwiKSkpIHtcbiAgICAgICAgICAgIGlmIChcInRocm93XCIgPT09IGUpIHRocm93IG47XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYSA9IGkoYSwgdCk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICBvID0gITA7XG4gICAgICAgICAgYSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwidGhyb3dcIiA9PT0gZSkgdGhyb3cgbjtcbiAgICAgICAgaWYgKG8pIHRocm93IGE7XG4gICAgICAgIHIoYSk7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxNDEpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJTZXRcIixcbiAgICAgICAgcHJvdG86ICEwLFxuICAgICAgICByZWFsOiAhMCxcbiAgICAgICAgZm9yY2VkOiAhbigxMzQpKFwiaXNTdWJzZXRPZlwiKVxuICAgICAgfSwge1xuICAgICAgICBpc1N1YnNldE9mOiByXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMjcpLFxuICAgICAgICByID0gbigxMzIpLFxuICAgICAgICBzID0gbigxMzApLFxuICAgICAgICBhID0gbigxMzMpO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gaXNTdWJzZXRPZih0KSB7XG4gICAgICAgIHZhciBlID0gaSh0aGlzKSxcbiAgICAgICAgICBuID0gYSh0KTtcbiAgICAgICAgcmV0dXJuICEocihlKSA+IG4uc2l6ZSkgJiYgITEgIT09IHMoZSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAoIW4uaW5jbHVkZXModCkpIHJldHVybiAhMTtcbiAgICAgICAgfSwgITApO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxNDMpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJTZXRcIixcbiAgICAgICAgcHJvdG86ICEwLFxuICAgICAgICByZWFsOiAhMCxcbiAgICAgICAgZm9yY2VkOiAhbigxMzQpKFwiaXNTdXBlcnNldE9mXCIpXG4gICAgICB9LCB7XG4gICAgICAgIGlzU3VwZXJzZXRPZjogclxuICAgICAgfSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgaSA9IG4oMTI3KSxcbiAgICAgICAgciA9IG4oMTI4KS5oYXMsXG4gICAgICAgIHMgPSBuKDEzMiksXG4gICAgICAgIGEgPSBuKDEzMyksXG4gICAgICAgIG8gPSBuKDEzMSksXG4gICAgICAgIGwgPSBuKDEzOSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N1cGVyc2V0T2YodCkge1xuICAgICAgICB2YXIgZSA9IGkodGhpcyksXG4gICAgICAgICAgbiA9IGEodCk7XG4gICAgICAgIGlmIChzKGUpIDwgbi5zaXplKSByZXR1cm4gITE7XG4gICAgICAgIHZhciBjID0gbi5nZXRJdGVyYXRvcigpO1xuICAgICAgICByZXR1cm4gITEgIT09IG8oYywgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBpZiAoIXIoZSwgdCkpIHJldHVybiBsKGMsIFwibm9ybWFsXCIsICExKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMyksXG4gICAgICAgIHIgPSBuKDE0NSk7XG4gICAgICBpKHtcbiAgICAgICAgdGFyZ2V0OiBcIlNldFwiLFxuICAgICAgICBwcm90bzogITAsXG4gICAgICAgIHJlYWw6ICEwLFxuICAgICAgICBmb3JjZWQ6ICFuKDEzNCkoXCJzeW1tZXRyaWNEaWZmZXJlbmNlXCIpXG4gICAgICB9LCB7XG4gICAgICAgIHN5bW1ldHJpY0RpZmZlcmVuY2U6IHJcbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDEyNyksXG4gICAgICAgIHIgPSBuKDEyOCksXG4gICAgICAgIHMgPSBuKDEyOSksXG4gICAgICAgIGEgPSBuKDEzMyksXG4gICAgICAgIG8gPSBuKDEzMSksXG4gICAgICAgIGwgPSByLmFkZCxcbiAgICAgICAgYyA9IHIuaGFzLFxuICAgICAgICBoID0gci5yZW1vdmU7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiBzeW1tZXRyaWNEaWZmZXJlbmNlKHQpIHtcbiAgICAgICAgdmFyIGUgPSBpKHRoaXMpLFxuICAgICAgICAgIG4gPSBhKHQpLmdldEl0ZXJhdG9yKCksXG4gICAgICAgICAgciA9IHMoZSk7XG4gICAgICAgIG8obiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBjKGUsIHQpID8gaChyLCB0KSA6IGwociwgdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oMTQ3KTtcbiAgICAgIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiU2V0XCIsXG4gICAgICAgIHByb3RvOiAhMCxcbiAgICAgICAgcmVhbDogITAsXG4gICAgICAgIGZvcmNlZDogIW4oMTM0KShcInVuaW9uXCIpXG4gICAgICB9LCB7XG4gICAgICAgIHVuaW9uOiByXG4gICAgICB9KTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigxMjcpLFxuICAgICAgICByID0gbigxMjgpLmFkZCxcbiAgICAgICAgcyA9IG4oMTI5KSxcbiAgICAgICAgYSA9IG4oMTMzKSxcbiAgICAgICAgbyA9IG4oMTMxKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIHVuaW9uKHQpIHtcbiAgICAgICAgdmFyIGUgPSBpKHRoaXMpLFxuICAgICAgICAgIG4gPSBhKHQpLmdldEl0ZXJhdG9yKCksXG4gICAgICAgICAgbCA9IHMoZSk7XG4gICAgICAgIG8obiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByKGwsIHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGw7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbig0KSxcbiAgICAgICAgcyA9IG4oMjQpLFxuICAgICAgICBhID0gbigxMSksXG4gICAgICAgIG8gPSBuKDQ1KS5mLFxuICAgICAgICBsID0gbigzOSksXG4gICAgICAgIGMgPSBuKDE0OSksXG4gICAgICAgIGggPSBuKDc1KSxcbiAgICAgICAgZCA9IG4oNzYpLFxuICAgICAgICB1ID0gbigxNTApLFxuICAgICAgICBwID0gbig4MiksXG4gICAgICAgIGYgPSBuKDYpLFxuICAgICAgICBnID0gbigzNiksXG4gICAgICAgIG0gPSBcIkRPTUV4Y2VwdGlvblwiLFxuICAgICAgICBiID0gcyhcIkVycm9yXCIpLFxuICAgICAgICB2ID0gcyhtKSxcbiAgICAgICAgeSA9IGZ1bmN0aW9uIERPTUV4Y2VwdGlvbigpIHtcbiAgICAgICAgICBjKHRoaXMsIEEpO1xuICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGUgPSBkKHQgPCAxID8gdm9pZCAwIDogYXJndW1lbnRzWzBdKSxcbiAgICAgICAgICAgIG4gPSBkKHQgPCAyID8gdm9pZCAwIDogYXJndW1lbnRzWzFdLCBcIkVycm9yXCIpLFxuICAgICAgICAgICAgaSA9IG5ldyB2KGUsIG4pLFxuICAgICAgICAgICAgciA9IGIoZSk7XG4gICAgICAgICAgci5uYW1lID0gbTtcbiAgICAgICAgICBvKGksIFwic3RhY2tcIiwgYSgxLCBwKHIuc3RhY2ssIDEpKSk7XG4gICAgICAgICAgaChpLCB0aGlzLCB5KTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSxcbiAgICAgICAgQSA9IHkucHJvdG90eXBlID0gdi5wcm90b3R5cGUsXG4gICAgICAgIF8gPSAoXCJzdGFja1wiIGluIGIobSkpLFxuICAgICAgICBTID0gKFwic3RhY2tcIiBpbiBuZXcgdigxLCAyKSksXG4gICAgICAgIEUgPSB2ICYmIGYgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCBtKSxcbiAgICAgICAgeCA9ICEoIUUgfHwgRS53cml0YWJsZSAmJiBFLmNvbmZpZ3VyYWJsZSksXG4gICAgICAgIHcgPSBfICYmICF4ICYmICFTO1xuICAgICAgaSh7XG4gICAgICAgIGdsb2JhbDogITAsXG4gICAgICAgIGNvbnN0cnVjdG9yOiAhMCxcbiAgICAgICAgZm9yY2VkOiBnIHx8IHdcbiAgICAgIH0sIHtcbiAgICAgICAgRE9NRXhjZXB0aW9uOiB3ID8geSA6IHZcbiAgICAgIH0pO1xuICAgICAgdmFyIEMgPSBzKG0pLFxuICAgICAgICBUID0gQy5wcm90b3R5cGU7XG4gICAgICBpZiAoVC5jb25zdHJ1Y3RvciAhPT0gQykge1xuICAgICAgICBnIHx8IG8oVCwgXCJjb25zdHJ1Y3RvclwiLCBhKDEsIEMpKTtcbiAgICAgICAgZm9yICh2YXIgUCBpbiB1KSBpZiAobCh1LCBQKSkge1xuICAgICAgICAgIHZhciBrID0gdVtQXSxcbiAgICAgICAgICAgIE0gPSBrLnM7XG4gICAgICAgICAgbChDLCBNKSB8fCBvKEMsIE0sIGEoNiwgay5jKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDI1KSxcbiAgICAgICAgciA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIGlmIChpKGUsIHQpKSByZXR1cm4gdDtcbiAgICAgICAgdGhyb3cgcihcIkluY29ycmVjdCBpbnZvY2F0aW9uXCIpO1xuICAgICAgfTtcbiAgICB9LCB0ID0+IHtcbiAgICAgIHQuZXhwb3J0cyA9IHtcbiAgICAgICAgSW5kZXhTaXplRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIklOREVYX1NJWkVfRVJSXCIsXG4gICAgICAgICAgYzogMSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIERPTVN0cmluZ1NpemVFcnJvcjoge1xuICAgICAgICAgIHM6IFwiRE9NU1RSSU5HX1NJWkVfRVJSXCIsXG4gICAgICAgICAgYzogMixcbiAgICAgICAgICBtOiAwXG4gICAgICAgIH0sXG4gICAgICAgIEhpZXJhcmNoeVJlcXVlc3RFcnJvcjoge1xuICAgICAgICAgIHM6IFwiSElFUkFSQ0hZX1JFUVVFU1RfRVJSXCIsXG4gICAgICAgICAgYzogMyxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFdyb25nRG9jdW1lbnRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiV1JPTkdfRE9DVU1FTlRfRVJSXCIsXG4gICAgICAgICAgYzogNCxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEludmFsaWRDaGFyYWN0ZXJFcnJvcjoge1xuICAgICAgICAgIHM6IFwiSU5WQUxJRF9DSEFSQUNURVJfRVJSXCIsXG4gICAgICAgICAgYzogNSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIE5vRGF0YUFsbG93ZWRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiTk9fREFUQV9BTExPV0VEX0VSUlwiLFxuICAgICAgICAgIGM6IDYsXG4gICAgICAgICAgbTogMFxuICAgICAgICB9LFxuICAgICAgICBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSXCIsXG4gICAgICAgICAgYzogNyxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIE5vdEZvdW5kRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIk5PVF9GT1VORF9FUlJcIixcbiAgICAgICAgICBjOiA4LFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgTm90U3VwcG9ydGVkRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIk5PVF9TVVBQT1JURURfRVJSXCIsXG4gICAgICAgICAgYzogOSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEluVXNlQXR0cmlidXRlRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIklOVVNFX0FUVFJJQlVURV9FUlJcIixcbiAgICAgICAgICBjOiAxMCxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEludmFsaWRTdGF0ZUVycm9yOiB7XG4gICAgICAgICAgczogXCJJTlZBTElEX1NUQVRFX0VSUlwiLFxuICAgICAgICAgIGM6IDExLFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgU3ludGF4RXJyb3I6IHtcbiAgICAgICAgICBzOiBcIlNZTlRBWF9FUlJcIixcbiAgICAgICAgICBjOiAxMixcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIEludmFsaWRNb2RpZmljYXRpb25FcnJvcjoge1xuICAgICAgICAgIHM6IFwiSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSXCIsXG4gICAgICAgICAgYzogMTMsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBOYW1lc3BhY2VFcnJvcjoge1xuICAgICAgICAgIHM6IFwiTkFNRVNQQUNFX0VSUlwiLFxuICAgICAgICAgIGM6IDE0LFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgSW52YWxpZEFjY2Vzc0Vycm9yOiB7XG4gICAgICAgICAgczogXCJJTlZBTElEX0FDQ0VTU19FUlJcIixcbiAgICAgICAgICBjOiAxNSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFZhbGlkYXRpb25FcnJvcjoge1xuICAgICAgICAgIHM6IFwiVkFMSURBVElPTl9FUlJcIixcbiAgICAgICAgICBjOiAxNixcbiAgICAgICAgICBtOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFR5cGVNaXNtYXRjaEVycm9yOiB7XG4gICAgICAgICAgczogXCJUWVBFX01JU01BVENIX0VSUlwiLFxuICAgICAgICAgIGM6IDE3LFxuICAgICAgICAgIG06IDFcbiAgICAgICAgfSxcbiAgICAgICAgU2VjdXJpdHlFcnJvcjoge1xuICAgICAgICAgIHM6IFwiU0VDVVJJVFlfRVJSXCIsXG4gICAgICAgICAgYzogMTgsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBOZXR3b3JrRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIk5FVFdPUktfRVJSXCIsXG4gICAgICAgICAgYzogMTksXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBBYm9ydEVycm9yOiB7XG4gICAgICAgICAgczogXCJBQk9SVF9FUlJcIixcbiAgICAgICAgICBjOiAyMCxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFVSTE1pc21hdGNoRXJyb3I6IHtcbiAgICAgICAgICBzOiBcIlVSTF9NSVNNQVRDSF9FUlJcIixcbiAgICAgICAgICBjOiAyMSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFF1b3RhRXhjZWVkZWRFcnJvcjoge1xuICAgICAgICAgIHM6IFwiUVVPVEFfRVhDRUVERURfRVJSXCIsXG4gICAgICAgICAgYzogMjIsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBUaW1lb3V0RXJyb3I6IHtcbiAgICAgICAgICBzOiBcIlRJTUVPVVRfRVJSXCIsXG4gICAgICAgICAgYzogMjMsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBJbnZhbGlkTm9kZVR5cGVFcnJvcjoge1xuICAgICAgICAgIHM6IFwiSU5WQUxJRF9OT0RFX1RZUEVfRVJSXCIsXG4gICAgICAgICAgYzogMjQsXG4gICAgICAgICAgbTogMVxuICAgICAgICB9LFxuICAgICAgICBEYXRhQ2xvbmVFcnJvcjoge1xuICAgICAgICAgIHM6IFwiREFUQV9DTE9ORV9FUlJcIixcbiAgICAgICAgICBjOiAyNSxcbiAgICAgICAgICBtOiAxXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpLFxuICAgICAgICByID0gbigzNiksXG4gICAgICAgIHMgPSBuKDMpLFxuICAgICAgICBhID0gbig0KSxcbiAgICAgICAgbyA9IG4oMjQpLFxuICAgICAgICBsID0gbigxNCksXG4gICAgICAgIGMgPSBuKDcpLFxuICAgICAgICBoID0gbig0MSksXG4gICAgICAgIGQgPSBuKDIxKSxcbiAgICAgICAgdSA9IG4oMTUyKSxcbiAgICAgICAgcCA9IG4oMTcpLFxuICAgICAgICBmID0gbigyMCksXG4gICAgICAgIGcgPSBuKDIzKSxcbiAgICAgICAgbSA9IG4oMTUzKSxcbiAgICAgICAgYiA9IG4oNDcpLFxuICAgICAgICB2ID0gbig3OCksXG4gICAgICAgIHkgPSBuKDM5KSxcbiAgICAgICAgQSA9IG4oMTU4KSxcbiAgICAgICAgXyA9IG4oNDQpLFxuICAgICAgICBTID0gbig2NCksXG4gICAgICAgIEUgPSBuKDg1KSxcbiAgICAgICAgeCA9IG4oMTU5KSxcbiAgICAgICAgdyA9IG4oMTYxKSxcbiAgICAgICAgQyA9IG4oMTI4KSxcbiAgICAgICAgVCA9IG4oODMpLFxuICAgICAgICBQID0gbigxMTkpLFxuICAgICAgICBrID0gYS5PYmplY3QsXG4gICAgICAgIE0gPSBhLkFycmF5LFxuICAgICAgICBSID0gYS5EYXRlLFxuICAgICAgICBJID0gYS5FcnJvcixcbiAgICAgICAgRCA9IGEuRXZhbEVycm9yLFxuICAgICAgICBPID0gYS5SYW5nZUVycm9yLFxuICAgICAgICBMID0gYS5SZWZlcmVuY2VFcnJvcixcbiAgICAgICAgTiA9IGEuU3ludGF4RXJyb3IsXG4gICAgICAgIEIgPSBhLlR5cGVFcnJvcixcbiAgICAgICAgaiA9IGEuVVJJRXJyb3IsXG4gICAgICAgIFUgPSBhLlBlcmZvcm1hbmNlTWFyayxcbiAgICAgICAgeiA9IGEuV2ViQXNzZW1ibHksXG4gICAgICAgIEggPSB6ICYmIHouQ29tcGlsZUVycm9yIHx8IEksXG4gICAgICAgIHEgPSB6ICYmIHouTGlua0Vycm9yIHx8IEksXG4gICAgICAgIFcgPSB6ICYmIHouUnVudGltZUVycm9yIHx8IEksXG4gICAgICAgIEcgPSBvKFwiRE9NRXhjZXB0aW9uXCIpLFxuICAgICAgICBWID0gdy5NYXAsXG4gICAgICAgICQgPSB3LmhhcyxcbiAgICAgICAgWCA9IHcuZ2V0LFxuICAgICAgICBLID0gdy5zZXQsXG4gICAgICAgIFkgPSBDLlNldCxcbiAgICAgICAgSiA9IEMuYWRkLFxuICAgICAgICBRID0gbyhcIk9iamVjdFwiLCBcImtleXNcIiksXG4gICAgICAgIFogPSBsKFtdLnB1c2gpLFxuICAgICAgICB0dCA9IGwoKCEwKS52YWx1ZU9mKSxcbiAgICAgICAgZXQgPSBsKDEuLnZhbHVlT2YpLFxuICAgICAgICBudCA9IGwoXCJcIi52YWx1ZU9mKSxcbiAgICAgICAgaXQgPSBsKFIucHJvdG90eXBlLmdldFRpbWUpLFxuICAgICAgICBydCA9IGgoXCJzdHJ1Y3R1cmVkQ2xvbmVcIiksXG4gICAgICAgIHN0ID0gXCJEYXRhQ2xvbmVFcnJvclwiLFxuICAgICAgICBhdCA9IFwiVHJhbnNmZXJyaW5nXCIsXG4gICAgICAgIGNoZWNrQmFzaWNTZW1hbnRpYyA9IGZ1bmN0aW9uIGNoZWNrQmFzaWNTZW1hbnRpYyh0KSB7XG4gICAgICAgICAgcmV0dXJuICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlID0gbmV3IGEuU2V0KFs3XSksXG4gICAgICAgICAgICAgIG4gPSB0KGUpLFxuICAgICAgICAgICAgICBpID0gdChrKDcpKTtcbiAgICAgICAgICAgIHJldHVybiBuID09IGUgfHwgIW4uaGFzKDcpIHx8IFwib2JqZWN0XCIgIT0gdHlwZW9mIGkgfHwgNyAhPSBpO1xuICAgICAgICAgIH0pICYmIHQ7XG4gICAgICAgIH0sXG4gICAgICAgIGNoZWNrRXJyb3JzQ2xvbmluZyA9IGZ1bmN0aW9uIGNoZWNrRXJyb3JzQ2xvbmluZyh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuID0gbmV3IGUoKSxcbiAgICAgICAgICAgICAgaSA9IHQoe1xuICAgICAgICAgICAgICAgIGE6IG4sXG4gICAgICAgICAgICAgICAgYjogblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiAhKGkgJiYgaS5hID09PSBpLmIgJiYgaS5hIGluc3RhbmNlb2YgZSAmJiBpLmEuc3RhY2sgPT09IG4uc3RhY2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvdCA9IGEuc3RydWN0dXJlZENsb25lLFxuICAgICAgICBsdCA9IHIgfHwgIWNoZWNrRXJyb3JzQ2xvbmluZyhvdCwgSSkgfHwgIWNoZWNrRXJyb3JzQ2xvbmluZyhvdCwgRykgfHwgIShpID0gb3QsICFjKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgdCA9IGkobmV3IGEuQWdncmVnYXRlRXJyb3IoWzFdLCBydCwge1xuICAgICAgICAgICAgY2F1c2U6IDNcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgcmV0dXJuIFwiQWdncmVnYXRlRXJyb3JcIiAhPSB0Lm5hbWUgfHwgMSAhPSB0LmVycm9yc1swXSB8fCB0Lm1lc3NhZ2UgIT0gcnQgfHwgMyAhPSB0LmNhdXNlO1xuICAgICAgICB9KSksXG4gICAgICAgIGN0ID0gIW90ICYmIGNoZWNrQmFzaWNTZW1hbnRpYyhmdW5jdGlvbiAodCkge1xuICAgICAgICAgIHJldHVybiBuZXcgVShydCwge1xuICAgICAgICAgICAgZGV0YWlsOiB0XG4gICAgICAgICAgfSkuZGV0YWlsO1xuICAgICAgICB9KSxcbiAgICAgICAgaHQgPSBjaGVja0Jhc2ljU2VtYW50aWMob3QpIHx8IGN0LFxuICAgICAgICB0aHJvd1VuY2xvbmVhYmxlID0gZnVuY3Rpb24gdGhyb3dVbmNsb25lYWJsZSh0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEcoXCJVbmNsb25lYWJsZSB0eXBlOiBcIiArIHQsIHN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgdGhyb3dVbnBvbHlmaWxsYWJsZSA9IGZ1bmN0aW9uIHRocm93VW5wb2x5ZmlsbGFibGUodCwgZSkge1xuICAgICAgICAgIHRocm93IG5ldyBHKChlIHx8IFwiQ2xvbmluZ1wiKSArIFwiIG9mIFwiICsgdCArIFwiIGNhbm5vdCBiZSBwcm9wZXJseSBwb2x5ZmlsbGVkIGluIHRoaXMgZW5naW5lXCIsIHN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ5TmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSA9IGZ1bmN0aW9uIHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodCwgZSkge1xuICAgICAgICAgIGh0IHx8IHRocm93VW5wb2x5ZmlsbGFibGUoZSk7XG4gICAgICAgICAgcmV0dXJuIGh0KHQpO1xuICAgICAgICB9LFxuICAgICAgICBjbG9uZUJ1ZmZlciA9IGZ1bmN0aW9uIGNsb25lQnVmZmVyKHQsIGUsIG4pIHtcbiAgICAgICAgICBpZiAoJChlLCB0KSkgcmV0dXJuIFgoZSwgdCk7XG4gICAgICAgICAgdmFyIGksIHIsIHMsIG8sIGwsIGM7XG4gICAgICAgICAgaWYgKFwiU2hhcmVkQXJyYXlCdWZmZXJcIiA9PT0gKG4gfHwgdih0KSkpIGkgPSBodCA/IGh0KHQpIDogdDtlbHNlIHtcbiAgICAgICAgICAgIHZhciBoID0gYS5EYXRhVmlldztcbiAgICAgICAgICAgIGggfHwgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0LnNsaWNlIHx8IHRocm93VW5wb2x5ZmlsbGFibGUoXCJBcnJheUJ1ZmZlclwiKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIHQuc2xpY2UgfHwgdC5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICByID0gdC5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHMgPSBcIm1heEJ5dGVMZW5ndGhcIiBpbiB0ID8ge1xuICAgICAgICAgICAgICAgICAgbWF4Qnl0ZUxlbmd0aDogdC5tYXhCeXRlTGVuZ3RoXG4gICAgICAgICAgICAgICAgfSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpID0gbmV3IEFycmF5QnVmZmVyKHIsIHMpO1xuICAgICAgICAgICAgICAgIG8gPSBuZXcgaCh0KTtcbiAgICAgICAgICAgICAgICBsID0gbmV3IGgoaSk7XG4gICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IHI7IGMrKykgbC5zZXRVaW50OChjLCBvLmdldFVpbnQ4KGMpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGkgPSB0LnNsaWNlKDApO1xuICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRyhcIkFycmF5QnVmZmVyIGlzIGRldGFjaGVkXCIsIHN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgSyhlLCB0LCBpKTtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvbmVWaWV3ID0gZnVuY3Rpb24gY2xvbmVWaWV3KHQsIGUsIG4sIGksIHIpIHtcbiAgICAgICAgICB2YXIgcyA9IGFbZV07XG4gICAgICAgICAgZihzKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKGUpO1xuICAgICAgICAgIHJldHVybiBuZXcgcyhjbG9uZUJ1ZmZlcih0LmJ1ZmZlciwgciksIG4sIGkpO1xuICAgICAgICB9LFxuICAgICAgICBQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIFBsYWNlaG9sZGVyKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLm9iamVjdCA9IHQ7XG4gICAgICAgICAgdGhpcy50eXBlID0gZTtcbiAgICAgICAgICB0aGlzLm1ldGFkYXRhID0gbjtcbiAgICAgICAgfSxcbiAgICAgICAgc3RydWN0dXJlZENsb25lSW50ZXJuYWwgPSBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LCBlLCBuKSB7XG4gICAgICAgICAgZyh0KSAmJiB0aHJvd1VuY2xvbmVhYmxlKFwiU3ltYm9sXCIpO1xuICAgICAgICAgIGlmICghZih0KSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGlmICgkKGUsIHQpKSByZXR1cm4gWChlLCB0KTtcbiAgICAgICAgICB9IGVsc2UgZSA9IG5ldyBWKCk7XG4gICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICByLFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGwsXG4gICAgICAgICAgICBjLFxuICAgICAgICAgICAgaCxcbiAgICAgICAgICAgIHUsXG4gICAgICAgICAgICBwLFxuICAgICAgICAgICAgbSA9IHYodCk7XG4gICAgICAgICAgc3dpdGNoIChtKSB7XG4gICAgICAgICAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgICAgICAgICAgcyA9IE0oUyh0KSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIk9iamVjdFwiOlxuICAgICAgICAgICAgICBzID0ge307XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIk1hcFwiOlxuICAgICAgICAgICAgICBzID0gbmV3IFYoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgIHMgPSBuZXcgWSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJSZWdFeHBcIjpcbiAgICAgICAgICAgICAgcyA9IG5ldyBSZWdFeHAodC5zb3VyY2UsIHgodCkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgICAgICAgICBzd2l0Y2ggKHIgPSB0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQWdncmVnYXRlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgIHMgPSBvKFwiQWdncmVnYXRlRXJyb3JcIikoW10pO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkV2YWxFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IEQoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJSYW5nZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gTygpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlJlZmVyZW5jZUVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gTCgpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlN5bnRheEVycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gTigpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlR5cGVFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IEIoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJVUklFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IGooKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDb21waWxlRXJyb3JcIjpcbiAgICAgICAgICAgICAgICAgIHMgPSBIKCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiTGlua0Vycm9yXCI6XG4gICAgICAgICAgICAgICAgICBzID0gcSgpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlJ1bnRpbWVFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IFcoKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBzID0gSSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkRPTUV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgICBzID0gbmV3IEcodC5tZXNzYWdlLCB0Lm5hbWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJBcnJheUJ1ZmZlclwiOlxuICAgICAgICAgICAgY2FzZSBcIlNoYXJlZEFycmF5QnVmZmVyXCI6XG4gICAgICAgICAgICAgIHMgPSBuID8gbmV3IFBsYWNlaG9sZGVyKHQsIG0pIDogY2xvbmVCdWZmZXIodCwgZSwgbSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkRhdGFWaWV3XCI6XG4gICAgICAgICAgICBjYXNlIFwiSW50OEFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIlVpbnQ4Q2xhbXBlZEFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiSW50MTZBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiSW50MzJBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIlVpbnQzMkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiRmxvYXQxNkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiRmxvYXQzMkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiRmxvYXQ2NEFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiQmlnSW50NjRBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIkJpZ1VpbnQ2NEFycmF5XCI6XG4gICAgICAgICAgICAgIGggPSBcIkRhdGFWaWV3XCIgPT09IG0gPyB0LmJ5dGVMZW5ndGggOiB0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgcyA9IG4gPyBuZXcgUGxhY2Vob2xkZXIodCwgbSwge1xuICAgICAgICAgICAgICAgIG9mZnNldDogdC5ieXRlT2Zmc2V0LFxuICAgICAgICAgICAgICAgIGxlbmd0aDogaFxuICAgICAgICAgICAgICB9KSA6IGNsb25lVmlldyh0LCBtLCB0LmJ5dGVPZmZzZXQsIGgsIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJET01RdWFkXCI6XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcyA9IG5ldyBET01RdWFkKHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQucDEsIGUsIG4pLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LnAyLCBlLCBuKSwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5wMywgZSwgbiksIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQucDQsIGUsIG4pKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHMgPSB0cnlOYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHQsIG0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZpbGVcIjpcbiAgICAgICAgICAgICAgaWYgKGh0KSB0cnkge1xuICAgICAgICAgICAgICAgIHMgPSBodCh0KTtcbiAgICAgICAgICAgICAgICB2KHMpICE9PSBtICYmIChzID0gdm9pZCAwKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgICAgICAgaWYgKCFzKSB0cnkge1xuICAgICAgICAgICAgICAgIHMgPSBuZXcgRmlsZShbdF0sIHQubmFtZSwgdCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgIHMgfHwgdGhyb3dVbnBvbHlmaWxsYWJsZShtKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiRmlsZUxpc3RcIjpcbiAgICAgICAgICAgICAgaWYgKGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHQgPSBuZXcgYS5EYXRhVHJhbnNmZXIoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IGEuQ2xpcGJvYXJkRXZlbnQoXCJcIikuY2xpcGJvYXJkRGF0YTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQuaXRlbXMgJiYgdC5maWxlcyA/IHQgOiBudWxsO1xuICAgICAgICAgICAgICB9KCkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGMgPSAwLCBoID0gUyh0KTsgYyA8IGg7IGMrKykgbC5pdGVtcy5hZGQoc3RydWN0dXJlZENsb25lSW50ZXJuYWwodFtjXSwgZSwgbikpO1xuICAgICAgICAgICAgICAgIHMgPSBsLmZpbGVzO1xuICAgICAgICAgICAgICB9IGVsc2UgcyA9IHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodCwgbSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkltYWdlRGF0YVwiOlxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHMgPSBuZXcgSW1hZ2VEYXRhKHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQuZGF0YSwgZSwgbiksIHQud2lkdGgsIHQuaGVpZ2h0LCB7XG4gICAgICAgICAgICAgICAgICBjb2xvclNwYWNlOiB0LmNvbG9yU3BhY2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHMgPSB0cnlOYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHQsIG0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgaWYgKGh0KSBzID0gaHQodCk7ZWxzZSBzd2l0Y2ggKG0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiQmlnSW50XCI6XG4gICAgICAgICAgICAgICAgICBzID0gayh0LnZhbHVlT2YoKSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQm9vbGVhblwiOlxuICAgICAgICAgICAgICAgICAgcyA9IGsodHQodCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIk51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgcyA9IGsoZXQodCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgcyA9IGsobnQodCkpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRhdGVcIjpcbiAgICAgICAgICAgICAgICAgIHMgPSBuZXcgUihpdCh0KSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQmxvYlwiOlxuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcyA9IHQuc2xpY2UoMCwgdC5zaXplLCB0LnR5cGUpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKG0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTVBvaW50XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTVBvaW50UmVhZE9ubHlcIjpcbiAgICAgICAgICAgICAgICAgIGkgPSBhW21dO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcyA9IGkuZnJvbVBvaW50ID8gaS5mcm9tUG9pbnQodCkgOiBuZXcgaSh0LngsIHQueSwgdC56LCB0LncpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKG0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTVJlY3RcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiRE9NUmVjdFJlYWRPbmx5XCI6XG4gICAgICAgICAgICAgICAgICBpID0gYVttXTtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHMgPSBpLmZyb21SZWN0ID8gaS5mcm9tUmVjdCh0KSA6IG5ldyBpKHQueCwgdC55LCB0LndpZHRoLCB0LmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93VW5wb2x5ZmlsbGFibGUobSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiRE9NTWF0cml4XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkRPTU1hdHJpeFJlYWRPbmx5XCI6XG4gICAgICAgICAgICAgICAgICBpID0gYVttXTtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHMgPSBpLmZyb21NYXRyaXggPyBpLmZyb21NYXRyaXgodCkgOiBuZXcgaSh0KTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dVbnBvbHlmaWxsYWJsZShtKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJBdWRpb0RhdGFcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiVmlkZW9GcmFtZVwiOlxuICAgICAgICAgICAgICAgICAgZCh0LmNsb25lKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKG0pO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcyA9IHQuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dVbmNsb25lYWJsZShtKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDcm9wVGFyZ2V0XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkNyeXB0b0tleVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkZpbGVTeXN0ZW1GaWxlSGFuZGxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkZpbGVTeXN0ZW1IYW5kbGVcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiR1BVQ29tcGlsYXRpb25JbmZvXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIkdQVUNvbXBpbGF0aW9uTWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJJbWFnZUJpdG1hcFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJSVENDZXJ0aWZpY2F0ZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJXZWJBc3NlbWJseS5Nb2R1bGVcIjpcbiAgICAgICAgICAgICAgICAgIHRocm93VW5wb2x5ZmlsbGFibGUobSk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHRocm93VW5jbG9uZWFibGUobSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgSyhlLCB0LCBzKTtcbiAgICAgICAgICBzd2l0Y2ggKG0pIHtcbiAgICAgICAgICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIk9iamVjdFwiOlxuICAgICAgICAgICAgICB1ID0gUSh0KTtcbiAgICAgICAgICAgICAgZm9yIChjID0gMCwgaCA9IFModSk7IGMgPCBoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBwID0gdVtjXTtcbiAgICAgICAgICAgICAgICBBKHMsIHAsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHRbcF0sIGUsIG4pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJNYXBcIjpcbiAgICAgICAgICAgICAgdC5mb3JFYWNoKGZ1bmN0aW9uICh0LCBpKSB7XG4gICAgICAgICAgICAgICAgSyhzLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbChpLCBlLCBuKSwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodCwgZSwgbikpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIEoocywgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodCwgZSwgbikpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiRXJyb3JcIjpcbiAgICAgICAgICAgICAgXyhzLCBcIm1lc3NhZ2VcIiwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5tZXNzYWdlLCBlLCBuKSk7XG4gICAgICAgICAgICAgIHkodCwgXCJjYXVzZVwiKSAmJiBfKHMsIFwiY2F1c2VcIiwgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodC5jYXVzZSwgZSwgbikpO1xuICAgICAgICAgICAgICBcIkFnZ3JlZ2F0ZUVycm9yXCIgPT0gciAmJiAocy5lcnJvcnMgPSBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LmVycm9ycywgZSwgbikpO1xuICAgICAgICAgICAgY2FzZSBcIkRPTUV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgICBUICYmIF8ocywgXCJzdGFja1wiLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh0LnN0YWNrLCBlLCBuKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9LFxuICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzID0gZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVycyh0LCBlKSB7XG4gICAgICAgICAgaWYgKCFmKHQpKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoJChlLCB0KSkgcmV0dXJuIFgoZSwgdCk7XG4gICAgICAgICAgdmFyIG4sIGksIHIsIHMsIGEsIG8sIGwsIGM7XG4gICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgbiA9IHQudHlwZTtcbiAgICAgICAgICAgIGkgPSB0Lm9iamVjdDtcbiAgICAgICAgICAgIHN3aXRjaCAobikge1xuICAgICAgICAgICAgICBjYXNlIFwiQXJyYXlCdWZmZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlNoYXJlZEFycmF5QnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgYyA9IGNsb25lQnVmZmVyKGksIGUsIG4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiRGF0YVZpZXdcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkludDhBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiVWludDhDbGFtcGVkQXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkludDE2QXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJJbnQzMkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJVaW50MzJBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiRmxvYXQxNkFycmF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJGbG9hdDMyQXJyYXlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIkZsb2F0NjRBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQmlnSW50NjRBcnJheVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiQmlnVWludDY0QXJyYXlcIjpcbiAgICAgICAgICAgICAgICByID0gdC5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICBjID0gY2xvbmVWaWV3KGksIG4sIHIub2Zmc2V0LCByLmxlbmd0aCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHN3aXRjaCAodih0KSkge1xuICAgICAgICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgICAgICAgIG8gPSBRKHQpO1xuICAgICAgICAgICAgICBmb3IgKHMgPSAwLCBhID0gUyhvKTsgcyA8IGE7IHMrKykgdFtsID0gb1tzXV0gPSByZXBsYWNlUGxhY2Vob2xkZXJzKHRbbF0sIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJNYXBcIjpcbiAgICAgICAgICAgICAgYyA9IG5ldyBWKCk7XG4gICAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAodCwgbikge1xuICAgICAgICAgICAgICAgIEsoYywgcmVwbGFjZVBsYWNlaG9sZGVycyhuLCBlKSwgcmVwbGFjZVBsYWNlaG9sZGVycyh0LCBlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgICAgICAgICAgYyA9IG5ldyBZKCk7XG4gICAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIEooYywgcmVwbGFjZVBsYWNlaG9sZGVycyh0LCBlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgICAgICAgICB0Lm1lc3NhZ2UgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHQubWVzc2FnZSwgZSk7XG4gICAgICAgICAgICAgIHkodCwgXCJjYXVzZVwiKSAmJiAodC5jYXVzZSA9IHJlcGxhY2VQbGFjZWhvbGRlcnModC5jYXVzZSwgZSkpO1xuICAgICAgICAgICAgICBcIkFnZ3JlZ2F0ZUVycm9yXCIgPT0gdC5uYW1lICYmICh0LmVycm9ycyA9IHJlcGxhY2VQbGFjZWhvbGRlcnModC5lcnJvcnMsIGUpKTtcbiAgICAgICAgICAgIGNhc2UgXCJET01FeGNlcHRpb25cIjpcbiAgICAgICAgICAgICAgVCAmJiAodC5zdGFjayA9IHJlcGxhY2VQbGFjZWhvbGRlcnModC5zdGFjaywgZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBLKGUsIHQsIGMgfHwgdCk7XG4gICAgICAgICAgcmV0dXJuIGMgfHwgdDtcbiAgICAgICAgfTtcbiAgICAgIHMoe1xuICAgICAgICBnbG9iYWw6ICEwLFxuICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgc2hhbTogIVAsXG4gICAgICAgIGZvcmNlZDogbHRcbiAgICAgIH0sIHtcbiAgICAgICAgc3RydWN0dXJlZENsb25lOiBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmUodCkge1xuICAgICAgICAgIHZhciBlLFxuICAgICAgICAgICAgbixcbiAgICAgICAgICAgIGkgPSBFKGFyZ3VtZW50cy5sZW5ndGgsIDEpID4gMSAmJiAhcChhcmd1bWVudHNbMV0pID8gYihhcmd1bWVudHNbMV0pIDogdm9pZCAwLFxuICAgICAgICAgICAgciA9IGkgPyBpLnRyYW5zZmVyIDogdm9pZCAwLFxuICAgICAgICAgICAgcyA9ICExO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHIpIHtcbiAgICAgICAgICAgIG4gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICBpZiAoIWYodCkpIHRocm93IEIoXCJUcmFuc2ZlciBvcHRpb24gY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIHNlcXVlbmNlXCIpO1xuICAgICAgICAgICAgICB2YXIgbiA9IFtdO1xuICAgICAgICAgICAgICBtKHQsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgWihuLCBiKHQpKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGZvciAodmFyIGksIHIsIHMsIG8sIGwsIGMgPSAwLCBoID0gUyhuKSwgcCA9IFtdOyBjIDwgaDspIHtcbiAgICAgICAgICAgICAgICBpID0gbltjKytdO1xuICAgICAgICAgICAgICAgIGlmIChcIkFycmF5QnVmZmVyXCIgIT09IChyID0gdihpKSkpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgkKGUsIGkpKSB0aHJvdyBuZXcgRyhcIkR1cGxpY2F0ZSB0cmFuc2ZlcmFibGVcIiwgc3QpO1xuICAgICAgICAgICAgICAgICAgaWYgKFApIG8gPSBvdChpLCB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyOiBbaV1cbiAgICAgICAgICAgICAgICAgIH0pO2Vsc2Ugc3dpdGNoIChyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJJbWFnZUJpdG1hcFwiOlxuICAgICAgICAgICAgICAgICAgICAgIHMgPSBhLk9mZnNjcmVlbkNhbnZhcztcbiAgICAgICAgICAgICAgICAgICAgICB1KHMpIHx8IHRocm93VW5wb2x5ZmlsbGFibGUociwgYXQpO1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAobCA9IG5ldyBzKGkud2lkdGgsIGkuaGVpZ2h0KSkuZ2V0Q29udGV4dChcImJpdG1hcHJlbmRlcmVyXCIpLnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGwudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkge31cbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkF1ZGlvRGF0YVwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVmlkZW9GcmFtZVwiOlxuICAgICAgICAgICAgICAgICAgICAgIGQoaS5jbG9uZSkgJiYgZChpLmNsb3NlKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKHIsIGF0KTtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGkuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7fVxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTWVkaWFTb3VyY2VIYW5kbGVcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1lc3NhZ2VQb3J0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJPZmZzY3JlZW5DYW52YXNcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJlYWRhYmxlU3RyZWFtXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJUcmFuc2Zvcm1TdHJlYW1cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIldyaXRhYmxlU3RyZWFtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3dVbnBvbHlmaWxsYWJsZShyLCBhdCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBvKSB0aHJvdyBuZXcgRyhcIlRoaXMgb2JqZWN0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZDogXCIgKyByLCBzdCk7XG4gICAgICAgICAgICAgICAgICBLKGUsIGksIG8pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBaKHAsIGkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICAgICAgfShyLCBlID0gbmV3IFYoKSk7XG4gICAgICAgICAgICBzID0gISFTKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbyA9IHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHQsIGUsIHMpO1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAhZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiwgaSwgciA9IDAsIHMgPSBTKHQpOyByIDwgczspIHtcbiAgICAgICAgICAgICAgICBuID0gdFtyKytdO1xuICAgICAgICAgICAgICAgIGlmICgkKGUsIG4pKSB0aHJvdyBuZXcgRyhcIkR1cGxpY2F0ZSB0cmFuc2ZlcmFibGVcIiwgc3QpO1xuICAgICAgICAgICAgICAgIGlmIChQKSBpID0gb3Qobiwge1xuICAgICAgICAgICAgICAgICAgdHJhbnNmZXI6IFtuXVxuICAgICAgICAgICAgICAgIH0pO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgZChuLnRyYW5zZmVyKSB8fCB0aHJvd1VucG9seWZpbGxhYmxlKFwiQXJyYXlCdWZmZXJcIiwgYXQpO1xuICAgICAgICAgICAgICAgICAgaSA9IG4udHJhbnNmZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSyhlLCBuLCBpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfShyLCBlID0gbmV3IFYoKSk7XG4gICAgICAgICAgICBvID0gcmVwbGFjZVBsYWNlaG9sZGVycyhvLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbig3KSxcbiAgICAgICAgcyA9IG4oMjEpLFxuICAgICAgICBhID0gbig3OCksXG4gICAgICAgIG8gPSBuKDI0KSxcbiAgICAgICAgbCA9IG4oNTEpLFxuICAgICAgICBub29wID0gZnVuY3Rpb24gbm9vcCgpIHt9LFxuICAgICAgICBjID0gW10sXG4gICAgICAgIGggPSBvKFwiUmVmbGVjdFwiLCBcImNvbnN0cnVjdFwiKSxcbiAgICAgICAgZCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi8sXG4gICAgICAgIHUgPSBpKGQuZXhlYyksXG4gICAgICAgIHAgPSAhZC5leGVjKG5vb3ApLFxuICAgICAgICBmID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgaWYgKCFzKHQpKSByZXR1cm4gITE7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGgobm9vcCwgYywgdCk7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZyA9IGZ1bmN0aW9uIGlzQ29uc3RydWN0b3IodCkge1xuICAgICAgICAgIGlmICghcyh0KSkgcmV0dXJuICExO1xuICAgICAgICAgIHN3aXRjaCAoYSh0KSkge1xuICAgICAgICAgICAgY2FzZSBcIkFzeW5jRnVuY3Rpb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJHZW5lcmF0b3JGdW5jdGlvblwiOlxuICAgICAgICAgICAgY2FzZSBcIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHAgfHwgISF1KGQsIGwodCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICBnLnNoYW0gPSAhMDtcbiAgICAgIHQuZXhwb3J0cyA9ICFoIHx8IHIoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgcmV0dXJuIGYoZi5jYWxsKSB8fCAhZihPYmplY3QpIHx8ICFmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0ID0gITA7XG4gICAgICAgIH0pIHx8IHQ7XG4gICAgICB9KSA/IGcgOiBmO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOTkpLFxuICAgICAgICByID0gbig4KSxcbiAgICAgICAgcyA9IG4oNDcpLFxuICAgICAgICBhID0gbigzMiksXG4gICAgICAgIG8gPSBuKDE1NCksXG4gICAgICAgIGwgPSBuKDY0KSxcbiAgICAgICAgYyA9IG4oMjUpLFxuICAgICAgICBoID0gbigxNTYpLFxuICAgICAgICBkID0gbigxNTcpLFxuICAgICAgICB1ID0gbigxMzkpLFxuICAgICAgICBwID0gVHlwZUVycm9yLFxuICAgICAgICBSZXN1bHQgPSBmdW5jdGlvbiBSZXN1bHQodCwgZSkge1xuICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHQ7XG4gICAgICAgICAgdGhpcy5yZXN1bHQgPSBlO1xuICAgICAgICB9LFxuICAgICAgICBmID0gUmVzdWx0LnByb3RvdHlwZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuKSB7XG4gICAgICAgIHZhciBnLFxuICAgICAgICAgIG0sXG4gICAgICAgICAgYixcbiAgICAgICAgICB2LFxuICAgICAgICAgIHksXG4gICAgICAgICAgQSxcbiAgICAgICAgICBfLFxuICAgICAgICAgIFMgPSBuICYmIG4udGhhdCxcbiAgICAgICAgICBFID0gISghbiB8fCAhbi5BU19FTlRSSUVTKSxcbiAgICAgICAgICB4ID0gISghbiB8fCAhbi5JU19SRUNPUkQpLFxuICAgICAgICAgIHcgPSAhKCFuIHx8ICFuLklTX0lURVJBVE9SKSxcbiAgICAgICAgICBDID0gISghbiB8fCAhbi5JTlRFUlJVUFRFRCksXG4gICAgICAgICAgVCA9IGkoZSwgUyksXG4gICAgICAgICAgc3RvcCA9IGZ1bmN0aW9uIHN0b3AodCkge1xuICAgICAgICAgICAgZyAmJiB1KGcsIFwibm9ybWFsXCIsIHQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoITAsIHQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY2FsbEZuID0gZnVuY3Rpb24gY2FsbEZuKHQpIHtcbiAgICAgICAgICAgIGlmIChFKSB7XG4gICAgICAgICAgICAgIHModCk7XG4gICAgICAgICAgICAgIHJldHVybiBDID8gVCh0WzBdLCB0WzFdLCBzdG9wKSA6IFQodFswXSwgdFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gQyA/IFQodCwgc3RvcCkgOiBUKHQpO1xuICAgICAgICAgIH07XG4gICAgICAgIGlmICh4KSBnID0gdC5pdGVyYXRvcjtlbHNlIGlmICh3KSBnID0gdDtlbHNlIHtcbiAgICAgICAgICBpZiAoIShtID0gZCh0KSkpIHRocm93IHAoYSh0KSArIFwiIGlzIG5vdCBpdGVyYWJsZVwiKTtcbiAgICAgICAgICBpZiAobyhtKSkge1xuICAgICAgICAgICAgZm9yIChiID0gMCwgdiA9IGwodCk7IHYgPiBiOyBiKyspIGlmICgoeSA9IGNhbGxGbih0W2JdKSkgJiYgYyhmLCB5KSkgcmV0dXJuIHk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdCghMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGcgPSBoKHQsIG0pO1xuICAgICAgICB9XG4gICAgICAgIEEgPSB4ID8gdC5uZXh0IDogZy5uZXh0O1xuICAgICAgICBmb3IgKDsgIShfID0gcihBLCBnKSkuZG9uZTspIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgeSA9IGNhbGxGbihfLnZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICB1KGcsIFwidGhyb3dcIiwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcIm9iamVjdFwiID09IHR5cGVvZiB5ICYmIHkgJiYgYyhmLCB5KSkgcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoITEpO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDM0KSxcbiAgICAgICAgciA9IG4oMTU1KSxcbiAgICAgICAgcyA9IGkoXCJpdGVyYXRvclwiKSxcbiAgICAgICAgYSA9IEFycmF5LnByb3RvdHlwZTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQgJiYgKHIuQXJyYXkgPT09IHQgfHwgYVtzXSA9PT0gdCk7XG4gICAgICB9O1xuICAgIH0sIHQgPT4ge1xuICAgICAgdC5leHBvcnRzID0ge307XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig4KSxcbiAgICAgICAgciA9IG4oMzEpLFxuICAgICAgICBzID0gbig0NyksXG4gICAgICAgIGEgPSBuKDMyKSxcbiAgICAgICAgbyA9IG4oMTU3KSxcbiAgICAgICAgbCA9IFR5cGVFcnJvcjtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBvKHQpIDogZTtcbiAgICAgICAgaWYgKHIobikpIHJldHVybiBzKGkobiwgdCkpO1xuICAgICAgICB0aHJvdyBsKGEodCkgKyBcIiBpcyBub3QgaXRlcmFibGVcIik7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNzgpLFxuICAgICAgICByID0gbigzMCksXG4gICAgICAgIHMgPSBuKDE3KSxcbiAgICAgICAgYSA9IG4oMTU1KSxcbiAgICAgICAgbyA9IG4oMzQpKFwiaXRlcmF0b3JcIik7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBpZiAoIXModCkpIHJldHVybiByKHQsIG8pIHx8IHIodCwgXCJAQGl0ZXJhdG9yXCIpIHx8IGFbaSh0KV07XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDE4KSxcbiAgICAgICAgciA9IG4oNDUpLFxuICAgICAgICBzID0gbigxMSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgZSwgbikge1xuICAgICAgICB2YXIgYSA9IGkoZSk7XG4gICAgICAgIGEgaW4gdCA/IHIuZih0LCBhLCBzKDAsIG4pKSA6IHRbYV0gPSBuO1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGkgPSBuKDgpLFxuICAgICAgICByID0gbigzOSksXG4gICAgICAgIHMgPSBuKDI1KSxcbiAgICAgICAgYSA9IG4oMTYwKSxcbiAgICAgICAgbyA9IFJlZ0V4cC5wcm90b3R5cGU7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgZSA9IHQuZmxhZ3M7XG4gICAgICAgIHJldHVybiB2b2lkIDAgIT09IGUgfHwgXCJmbGFnc1wiIGluIG8gfHwgcih0LCBcImZsYWdzXCIpIHx8ICFzKG8sIHQpID8gZSA6IGkoYSwgdCk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDQ3KTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHQgPSBpKHRoaXMpLFxuICAgICAgICAgIGUgPSBcIlwiO1xuICAgICAgICB0Lmhhc0luZGljZXMgJiYgKGUgKz0gXCJkXCIpO1xuICAgICAgICB0Lmdsb2JhbCAmJiAoZSArPSBcImdcIik7XG4gICAgICAgIHQuaWdub3JlQ2FzZSAmJiAoZSArPSBcImlcIik7XG4gICAgICAgIHQubXVsdGlsaW5lICYmIChlICs9IFwibVwiKTtcbiAgICAgICAgdC5kb3RBbGwgJiYgKGUgKz0gXCJzXCIpO1xuICAgICAgICB0LnVuaWNvZGUgJiYgKGUgKz0gXCJ1XCIpO1xuICAgICAgICB0LnVuaWNvZGVTZXRzICYmIChlICs9IFwidlwiKTtcbiAgICAgICAgdC5zdGlja3kgJiYgKGUgKz0gXCJ5XCIpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigxNCksXG4gICAgICAgIHIgPSBNYXAucHJvdG90eXBlO1xuICAgICAgdC5leHBvcnRzID0ge1xuICAgICAgICBNYXA6IE1hcCxcbiAgICAgICAgc2V0OiBpKHIuc2V0KSxcbiAgICAgICAgZ2V0OiBpKHIuZ2V0KSxcbiAgICAgICAgaGFzOiBpKHIuaGFzKSxcbiAgICAgICAgcmVtb3ZlOiBpKHIuZGVsZXRlKSxcbiAgICAgICAgcHJvdG86IHJcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuU2VyaWFsaXphYmxlRW1wdHkgPSBlLlByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBlLkFubm90YXRpb25TdG9yYWdlID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICBuKDE0OCk7XG4gICAgICBuKDE1MSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2MyksXG4gICAgICAgIHMgPSBuKDE2OSk7XG4gICAgICBjb25zdCBhID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIG1hcDogbnVsbCxcbiAgICAgICAgaGFzaDogXCJcIixcbiAgICAgICAgdHJhbnNmZXJzOiB2b2lkIDBcbiAgICAgIH0pO1xuICAgICAgZS5TZXJpYWxpemFibGVFbXB0eSA9IGE7XG4gICAgICB2YXIgX3YgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9BID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBBbm5vdGF0aW9uU3RvcmFnZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3YsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3ksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMub25TZXRNb2RpZmllZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblJlc2V0TW9kaWZpZWQgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRWYWx1ZSh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuZ2V0KHQpO1xuICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IG4gPyBlIDogT2JqZWN0LmFzc2lnbihlLCBuKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSYXdWYWx1ZSh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuZ2V0KHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS5kZWxldGUodCk7XG4gICAgICAgICAgMCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS5zaXplICYmIHRoaXMucmVzZXRNb2RpZmllZCgpO1xuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS52YWx1ZXMoKSkgaWYgKHQgaW5zdGFuY2VvZiByLkFubm90YXRpb25FZGl0b3IpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRWYWx1ZSh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuZ2V0KHQpO1xuICAgICAgICAgIGxldCBpID0gITE7XG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbdCwgcl0gb2YgT2JqZWN0LmVudHJpZXMoZSkpIGlmIChuW3RdICE9PSByKSB7XG4gICAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgICAgblt0XSA9IHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuc2V0KHQsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpICYmIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0EsIF9BMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBlIGluc3RhbmNlb2Ygci5Bbm5vdGF0aW9uRWRpdG9yICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdGhpcy5vbkFubm90YXRpb25FZGl0b3IgJiYgdGhpcy5vbkFubm90YXRpb25FZGl0b3IoZS5jb25zdHJ1Y3Rvci5fdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaGFzKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KS5oYXModCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QWxsKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3kpLnNpemUgPiAwID8gKDAsIGkub2JqZWN0RnJvbU1hcCkoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KSkgOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldEFsbCh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZSwgbl0gb2YgT2JqZWN0LmVudHJpZXModCkpIHRoaXMuc2V0VmFsdWUoZSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHNpemUoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeSkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXNldE1vZGlmaWVkKCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3YpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3YsICExKTtcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgdGhpcy5vblJlc2V0TW9kaWZpZWQgJiYgdGhpcy5vblJlc2V0TW9kaWZpZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByaW50KCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgc2VyaWFsaXphYmxlKCkge1xuICAgICAgICAgIGlmICgwID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3kpLnNpemUpIHJldHVybiBhO1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgTWFwKCksXG4gICAgICAgICAgICBlID0gbmV3IHMuTXVybXVySGFzaDNfNjQoKSxcbiAgICAgICAgICAgIG4gPSBbXSxcbiAgICAgICAgICAgIGkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGxldCBvID0gITE7XG4gICAgICAgICAgZm9yIChjb25zdCBbbiwgc10gb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF95KSkge1xuICAgICAgICAgICAgY29uc3QgYSA9IHMgaW5zdGFuY2VvZiByLkFubm90YXRpb25FZGl0b3IgPyBzLnNlcmlhbGl6ZSghMSwgaSkgOiBzO1xuICAgICAgICAgICAgaWYgKGEpIHtcbiAgICAgICAgICAgICAgdC5zZXQobiwgYSk7XG4gICAgICAgICAgICAgIGUudXBkYXRlKFwiXCIuY29uY2F0KG4sIFwiOlwiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoYSkpKTtcbiAgICAgICAgICAgICAgbyB8fCAobyA9ICEhYS5iaXRtYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobykgZm9yIChjb25zdCBlIG9mIHQudmFsdWVzKCkpIGUuYml0bWFwICYmIG4ucHVzaChlLmJpdG1hcCk7XG4gICAgICAgICAgcmV0dXJuIHQuc2l6ZSA+IDAgPyB7XG4gICAgICAgICAgICBtYXA6IHQsXG4gICAgICAgICAgICBoYXNoOiBlLmhleGRpZ2VzdCgpLFxuICAgICAgICAgICAgdHJhbnNmZXJzOiBuXG4gICAgICAgICAgfSA6IGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9BMigpIHtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3YpKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF92LCAhMCk7XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09IHR5cGVvZiB0aGlzLm9uU2V0TW9kaWZpZWQgJiYgdGhpcy5vblNldE1vZGlmaWVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuQW5ub3RhdGlvblN0b3JhZ2UgPSBBbm5vdGF0aW9uU3RvcmFnZTtcbiAgICAgIHZhciBfMiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBleHRlbmRzIEFubm90YXRpb25TdG9yYWdlIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgXzIsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgbWFwOiBlLFxuICAgICAgICAgICAgICBoYXNoOiBuLFxuICAgICAgICAgICAgICB0cmFuc2ZlcnM6IGlcbiAgICAgICAgICAgIH0gPSB0LnNlcmlhbGl6YWJsZSxcbiAgICAgICAgICAgIHIgPSBzdHJ1Y3R1cmVkQ2xvbmUoZSwgbnVsbCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF8yLCB7XG4gICAgICAgICAgICBtYXA6IHIsXG4gICAgICAgICAgICBoYXNoOiBuLFxuICAgICAgICAgICAgdHJhbnNmZXJzOiBpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByaW50KCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBQcmludEFubm90YXRpb25TdG9yYWdlLnByaW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBzZXJpYWxpemFibGUoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IFByaW50QW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX2NsYXNzMTI7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuQW5ub3RhdGlvbkVkaXRvciA9IHZvaWQgMDtcbiAgICAgIG4oODkpO1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY0KTtcbiAgICAgIHZhciBfUyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9FID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3ggPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9DID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9rID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX00gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9GID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0kgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfRCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgY2xhc3MgQW5ub3RhdGlvbkVkaXRvciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF90NCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfRCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9JKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX0YpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfUik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1MsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfeCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF93LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvY3VzaW4uYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9DLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmZvY3Vzb3V0LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfVCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfUCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaywge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJfdWlNYW5hZ2VyXCIsIG51bGwpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9NLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBBbm5vdGF0aW9uRWRpdG9yLl96SW5kZXgrK1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPT09IEFubm90YXRpb25FZGl0b3IgJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQW5ub3RhdGlvbkVkaXRvci5cIik7XG4gICAgICAgICAgdGhpcy5wYXJlbnQgPSBfdDQucGFyZW50O1xuICAgICAgICAgIHRoaXMuaWQgPSBfdDQuaWQ7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnBhZ2VJbmRleCA9IF90NC5wYXJlbnQucGFnZUluZGV4O1xuICAgICAgICAgIHRoaXMubmFtZSA9IF90NC5uYW1lO1xuICAgICAgICAgIHRoaXMuZGl2ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl91aU1hbmFnZXIgPSBfdDQudWlNYW5hZ2VyO1xuICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9ICExO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHJvdGF0aW9uOiBfZTQsXG4gICAgICAgICAgICByYXdEaW1zOiB7XG4gICAgICAgICAgICAgIHBhZ2VXaWR0aDogX24zLFxuICAgICAgICAgICAgICBwYWdlSGVpZ2h0OiBfcjMsXG4gICAgICAgICAgICAgIHBhZ2VYOiBfczQsXG4gICAgICAgICAgICAgIHBhZ2VZOiBfYTJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9ID0gdGhpcy5wYXJlbnQudmlld3BvcnQ7XG4gICAgICAgICAgdGhpcy5yb3RhdGlvbiA9IF9lNDtcbiAgICAgICAgICB0aGlzLnBhZ2VSb3RhdGlvbiA9ICgzNjAgKyBfZTQgLSB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucm90YXRpb24pICUgMzYwO1xuICAgICAgICAgIHRoaXMucGFnZURpbWVuc2lvbnMgPSBbX24zLCBfcjNdO1xuICAgICAgICAgIHRoaXMucGFnZVRyYW5zbGF0aW9uID0gW19zNCwgX2EyXTtcbiAgICAgICAgICBjb25zdCBbX28yLCBfbDJdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIHRoaXMueCA9IF90NC54IC8gX28yO1xuICAgICAgICAgIHRoaXMueSA9IF90NC55IC8gX2wyO1xuICAgICAgICAgIHRoaXMuaXNBdHRhY2hlZFRvRE9NID0gITE7XG4gICAgICAgICAgdGhpcy5kZWxldGVkID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGdldCBfZGVmYXVsdExpbmVDb2xvcigpIHtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcIl9kZWZhdWx0TGluZUNvbG9yXCIsIHRoaXMuX2NvbG9yTWFuYWdlci5nZXRIZXhDb2RlKFwiQ2FudmFzVGV4dFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGRlbGV0ZUFubm90YXRpb25FbGVtZW50KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gbmV3IEZha2VFZGl0b3Ioe1xuICAgICAgICAgICAgaWQ6IHQucGFyZW50LmdldE5leHRJZCgpLFxuICAgICAgICAgICAgcGFyZW50OiB0LnBhcmVudCxcbiAgICAgICAgICAgIHVpTWFuYWdlcjogdC5fdWlNYW5hZ2VyXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZS5hbm5vdGF0aW9uRWxlbWVudElkID0gdC5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgICAgICAgIGUuZGVsZXRlZCA9ICEwO1xuICAgICAgICAgIGUuX3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGUpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBpbml0aWFsaXplKHQpIHt9XG4gICAgICAgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHQsIGUpIHt9XG4gICAgICAgIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgYWRkQ29tbWFuZHModCkge1xuICAgICAgICAgIHRoaXMuX3VpTWFuYWdlci5hZGRDb21tYW5kcyh0KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY3VycmVudExheWVyKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyO1xuICAgICAgICB9XG4gICAgICAgIHNldEluQmFja2dyb3VuZCgpIHtcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgICAgIHNldEluRm9yZWdyb3VuZCgpIHtcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX00pO1xuICAgICAgICB9XG4gICAgICAgIHNldFBhcmVudCh0KSB7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHQpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gdC5wYWdlSW5kZXg7XG4gICAgICAgICAgICB0aGlzLnBhZ2VEaW1lbnNpb25zID0gdC5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wYXJlbnQgPSB0O1xuICAgICAgICB9XG4gICAgICAgIGZvY3VzaW4odCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVCkgPyBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1QsICExKSA6IHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGZvY3Vzb3V0KHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHQucmVsYXRlZFRhcmdldDtcbiAgICAgICAgICBpZiAoIShlICE9PSBudWxsICYmIGUgIT09IHZvaWQgMCAmJiBlLmNsb3Nlc3QoXCIjXCIuY29uY2F0KHRoaXMuaWQpKSkpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRwYXJlbnQ7XG4gICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAoKF90aGlzJHBhcmVudCA9IHRoaXMucGFyZW50KSA9PT0gbnVsbCB8fCBfdGhpcyRwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJHBhcmVudC5pc011bHRpcGxlU2VsZWN0aW9uKSB8fCB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbW1pdE9yUmVtb3ZlKCkge1xuICAgICAgICAgIHRoaXMuaXNFbXB0eSgpID8gdGhpcy5yZW1vdmUoKSA6IHRoaXMuY29tbWl0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29tbWl0KCkge1xuICAgICAgICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKSB7XG4gICAgICAgICAgdGhpcy5fdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZHJhZ3N0YXJ0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5wYXJlbnQuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIHRoaXMuc3RhcnRYID0gdC5jbGllbnRYIC0gZS54O1xuICAgICAgICAgIHRoaXMuc3RhcnRZID0gdC5jbGllbnRZIC0gZS55O1xuICAgICAgICAgIHQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRoaXMuaWQpO1xuICAgICAgICAgIHQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSBcIm1vdmVcIjtcbiAgICAgICAgfVxuICAgICAgICBzZXRBdCh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgY29uc3QgW3IsIHNdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIFtuLCBpXSA9IHRoaXMuc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24obiwgaSk7XG4gICAgICAgICAgdGhpcy54ID0gKHQgKyBuKSAvIHI7XG4gICAgICAgICAgdGhpcy55ID0gKGUgKyBpKSAvIHM7XG4gICAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zbGF0ZSh0LCBlKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUiwgX1IyKS5jYWxsKHRoaXMsIHRoaXMucGFyZW50RGltZW5zaW9ucywgdCwgZSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNsYXRlSW5QYWdlKHQsIGUpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SLCBfUjIpLmNhbGwodGhpcywgdGhpcy5wYWdlRGltZW5zaW9ucywgdCwgZSk7XG4gICAgICAgICAgdGhpcy5kaXYuc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICAgICAgYmxvY2s6IFwibmVhcmVzdFwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4QW5kU2V0UG9zaXRpb24oKSB7XG4gICAgICAgICAgY29uc3QgW3QsIGVdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgeDogbixcbiAgICAgICAgICAgIHk6IGksXG4gICAgICAgICAgICB3aWR0aDogcixcbiAgICAgICAgICAgIGhlaWdodDogc1xuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHIgKj0gdDtcbiAgICAgICAgICBzICo9IGU7XG4gICAgICAgICAgbiAqPSB0O1xuICAgICAgICAgIGkgKj0gZTtcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKHQgLSByLCBuKSk7XG4gICAgICAgICAgICAgIGkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihlIC0gcywgaSkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgOTA6XG4gICAgICAgICAgICAgIG4gPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0IC0gcywgbikpO1xuICAgICAgICAgICAgICBpID0gTWF0aC5taW4oZSwgTWF0aC5tYXgociwgaSkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgICAgICBuID0gTWF0aC5taW4odCwgTWF0aC5tYXgociwgbikpO1xuICAgICAgICAgICAgICBpID0gTWF0aC5taW4oZSwgTWF0aC5tYXgocywgaSkpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgICBuID0gTWF0aC5taW4odCwgTWF0aC5tYXgocywgbikpO1xuICAgICAgICAgICAgICBpID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZSAtIHIsIGkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy54ID0gbiAvIHQ7XG4gICAgICAgICAgdGhpcy55ID0gaSAvIGU7XG4gICAgICAgICAgdGhpcy5kaXYuc3R5bGUubGVmdCA9IFwiXCIuY29uY2F0KCgxMDAgKiB0aGlzLngpLnRvRml4ZWQoMiksIFwiJVwiKTtcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS50b3AgPSBcIlwiLmNvbmNhdCgoMTAwICogdGhpcy55KS50b0ZpeGVkKDIpLCBcIiVcIik7XG4gICAgICAgIH1cbiAgICAgICAgc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24odCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5wYXJlbnRSb3RhdGlvbikge1xuICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtlLCAtdF07XG4gICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFstdCwgLWVdO1xuICAgICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICAgIHJldHVybiBbLWUsIHRdO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFt0LCBlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGFnZVRyYW5zbGF0aW9uVG9TY3JlZW4odCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodGhpcy5wYXJlbnRSb3RhdGlvbikge1xuICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFstZSwgdF07XG4gICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFstdCwgLWVdO1xuICAgICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICAgIHJldHVybiBbZSwgLXRdO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFt0LCBlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhcmVudFNjYWxlKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBwYXJlbnRSb3RhdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yb3RhdGlvbiArIHRoaXMucGFnZVJvdGF0aW9uKSAlIDM2MDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcGFyZW50RGltZW5zaW9ucygpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHJlYWxTY2FsZTogdFxuICAgICAgICAgICAgfSA9IHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycyxcbiAgICAgICAgICAgIFtlLCBuXSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG4gICAgICAgICAgcmV0dXJuIFtlICogdCwgbiAqIHRdO1xuICAgICAgICB9XG4gICAgICAgIHNldERpbXModCwgZSkge1xuICAgICAgICAgIGNvbnN0IFtuLCBpXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IFwiXCIuY29uY2F0KCgxMDAgKiB0IC8gbikudG9GaXhlZCgyKSwgXCIlXCIpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUykgfHwgKHRoaXMuZGl2LnN0eWxlLmhlaWdodCA9IFwiXCIuY29uY2F0KCgxMDAgKiBlIC8gaSkudG9GaXhlZCgyKSwgXCIlXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBmaXhEaW1zKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgc3R5bGU6IHRcbiAgICAgICAgICAgIH0gPSB0aGlzLmRpdixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGVpZ2h0OiBlLFxuICAgICAgICAgICAgICB3aWR0aDogblxuICAgICAgICAgICAgfSA9IHQsXG4gICAgICAgICAgICBpID0gbi5lbmRzV2l0aChcIiVcIiksXG4gICAgICAgICAgICByID0gIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUykgJiYgZS5lbmRzV2l0aChcIiVcIik7XG4gICAgICAgICAgaWYgKGkgJiYgcikgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IFtzLCBhXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICBpIHx8ICh0LndpZHRoID0gXCJcIi5jb25jYXQoKDEwMCAqIHBhcnNlRmxvYXQobikgLyBzKS50b0ZpeGVkKDIpLCBcIiVcIikpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUykgfHwgciB8fCAodC5oZWlnaHQgPSBcIlwiLmNvbmNhdCgoMTAwICogcGFyc2VGbG9hdChlKSAvIGEpLnRvRml4ZWQoMiksIFwiJVwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXRvci1yb3RhdGlvblwiLCAoMzYwIC0gdGhpcy5yb3RhdGlvbikgJSAzNjApO1xuICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmlkKTtcbiAgICAgICAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiLCAwKTtcbiAgICAgICAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuICAgICAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdykpO1xuICAgICAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0MpKTtcbiAgICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgaWYgKHRoaXMucGFyZW50Um90YXRpb24gJSAxODAgIT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXYuc3R5bGUubWF4V2lkdGggPSBcIlwiLmNvbmNhdCgoMTAwICogZSAvIHQpLnRvRml4ZWQoMiksIFwiJVwiKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LnN0eWxlLm1heEhlaWdodCA9IFwiXCIuY29uY2F0KCgxMDAgKiB0IC8gZSkudG9GaXhlZCgyKSwgXCIlXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLmdldEluaXRpYWxUcmFuc2xhdGlvbigpO1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRlKG4sIGkpO1xuICAgICAgICAgICgwLCByLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJkcmFnc3RhcnRcIiwgXCJwb2ludGVyZG93blwiXSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICB9XG4gICAgICAgIHBvaW50ZXJkb3duKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc01hYzogZVxuICAgICAgICAgIH0gPSBpLkZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuICAgICAgICAgIGlmICgwICE9PSB0LmJ1dHRvbiB8fCB0LmN0cmxLZXkgJiYgZSkgdC5wcmV2ZW50RGVmYXVsdCgpO2Vsc2Uge1xuICAgICAgICAgICAgdC5jdHJsS2V5ICYmICFlIHx8IHQuc2hpZnRLZXkgfHwgdC5tZXRhS2V5ICYmIGUgPyB0aGlzLnBhcmVudC50b2dnbGVTZWxlY3RlZCh0aGlzKSA6IHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ULCAhMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldFJlY3QodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnBhcmVudFNjYWxlLFxuICAgICAgICAgICAgW2ksIHJdID0gdGhpcy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgIFtzLCBhXSA9IHRoaXMucGFnZVRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgbyA9IHQgLyBuLFxuICAgICAgICAgICAgbCA9IGUgLyBuLFxuICAgICAgICAgICAgYyA9IHRoaXMueCAqIGksXG4gICAgICAgICAgICBoID0gdGhpcy55ICogcixcbiAgICAgICAgICAgIGQgPSB0aGlzLndpZHRoICogaSxcbiAgICAgICAgICAgIHUgPSB0aGlzLmhlaWdodCAqIHI7XG4gICAgICAgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiBbYyArIG8gKyBzLCByIC0gaCAtIGwgLSB1ICsgYSwgYyArIG8gKyBkICsgcywgciAtIGggLSBsICsgYV07XG4gICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICByZXR1cm4gW2MgKyBsICsgcywgciAtIGggKyBvICsgYSwgYyArIGwgKyB1ICsgcywgciAtIGggKyBvICsgZCArIGFdO1xuICAgICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICAgIHJldHVybiBbYyAtIG8gLSBkICsgcywgciAtIGggKyBsICsgYSwgYyAtIG8gKyBzLCByIC0gaCArIGwgKyB1ICsgYV07XG4gICAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtjIC0gbCAtIHUgKyBzLCByIC0gaCAtIG8gLSBkICsgYSwgYyAtIGwgKyBzLCByIC0gaCAtIG8gKyBhXTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldFJlY3RJbkN1cnJlbnRDb29yZHModCwgZSkge1xuICAgICAgICAgIGNvbnN0IFtuLCBpLCByLCBzXSA9IHQsXG4gICAgICAgICAgICBhID0gciAtIG4sXG4gICAgICAgICAgICBvID0gcyAtIGk7XG4gICAgICAgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiBbbiwgZSAtIHMsIGEsIG9dO1xuICAgICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtuLCBlIC0gaSwgbywgYV07XG4gICAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtyLCBlIC0gaSwgYSwgb107XG4gICAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgICAgcmV0dXJuIFtyLCBlIC0gcywgbywgYV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbmNlQWRkZWQoKSB7fVxuICAgICAgICBpc0VtcHR5KCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2ssICEwKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9rLCAhMSk7XG4gICAgICAgIH1cbiAgICAgICAgaXNJbkVkaXRNb2RlKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2spO1xuICAgICAgICB9XG4gICAgICAgIHNob3VsZEdldEtleWJvYXJkRXZlbnRzKCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICBuZWVkc1RvQmVSZWJ1aWx0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmRpdiAmJiAhdGhpcy5pc0F0dGFjaGVkVG9ET007XG4gICAgICAgIH1cbiAgICAgICAgcmVidWlsZCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkZGl2LCBfdGhpcyRkaXYyO1xuICAgICAgICAgIChfdGhpcyRkaXYgPSB0aGlzLmRpdikgPT09IG51bGwgfHwgX3RoaXMkZGl2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93KSk7XG4gICAgICAgICAgKF90aGlzJGRpdjIgPSB0aGlzLmRpdikgPT09IG51bGwgfHwgX3RoaXMkZGl2MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZGl2Mi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9DKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFuIGVkaXRvciBtdXN0IGJlIHNlcmlhbGl6YWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZGVzZXJpYWxpemUodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IGkgPSBuZXcgdGhpcy5wcm90b3R5cGUuY29uc3RydWN0b3Ioe1xuICAgICAgICAgICAgcGFyZW50OiBlLFxuICAgICAgICAgICAgaWQ6IGUuZ2V0TmV4dElkKCksXG4gICAgICAgICAgICB1aU1hbmFnZXI6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpLnJvdGF0aW9uID0gdC5yb3RhdGlvbjtcbiAgICAgICAgICBjb25zdCBbciwgc10gPSBpLnBhZ2VEaW1lbnNpb25zLFxuICAgICAgICAgICAgW2EsIG8sIGwsIGNdID0gaS5nZXRSZWN0SW5DdXJyZW50Q29vcmRzKHQucmVjdCwgcyk7XG4gICAgICAgICAgaS54ID0gYSAvIHI7XG4gICAgICAgICAgaS55ID0gbyAvIHM7XG4gICAgICAgICAgaS53aWR0aCA9IGwgLyByO1xuICAgICAgICAgIGkuaGVpZ2h0ID0gYyAvIHM7XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlKCkge1xuICAgICAgICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdykpO1xuICAgICAgICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0MpKTtcbiAgICAgICAgICB0aGlzLmlzRW1wdHkoKSB8fCB0aGlzLmNvbW1pdCgpO1xuICAgICAgICAgIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpIDogdGhpcy5fdWlNYW5hZ2VyLnJlbW92ZUVkaXRvcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNSZXNpemFibGUoKSB7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIG1ha2VSZXNpemFibGUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNSZXNpemFibGUpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0YsIF9GMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0KCkge1xuICAgICAgICAgIHZhciBfdGhpcyRkaXYzO1xuICAgICAgICAgIHRoaXMubWFrZVJlc2l6YWJsZSgpO1xuICAgICAgICAgIChfdGhpcyRkaXYzID0gdGhpcy5kaXYpID09PSBudWxsIHx8IF90aGlzJGRpdjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRpdjMuY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgICAgICB9XG4gICAgICAgIHVuc2VsZWN0KCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQzLCBfdGhpcyRkaXY0LCBfdGhpcyRkaXY1O1xuICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQzID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9FKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0My5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgICAgICAgIChfdGhpcyRkaXY0ID0gdGhpcy5kaXYpID09PSBudWxsIHx8IF90aGlzJGRpdjQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRpdjQuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkRWRpdG9yXCIpO1xuICAgICAgICAgICgoX3RoaXMkZGl2NSA9IHRoaXMuZGl2KSA9PT0gbnVsbCB8fCBfdGhpcyRkaXY1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkaXY1LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSAmJiB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyLmRpdi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVBhcmFtcyh0LCBlKSB7fVxuICAgICAgICBkaXNhYmxlRWRpdGluZygpIHt9XG4gICAgICAgIGVuYWJsZUVkaXRpbmcoKSB7fVxuICAgICAgICBlbnRlckluRWRpdE1vZGUoKSB7fVxuICAgICAgICBnZXQgY29udGVudERpdigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kaXY7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzRWRpdGluZygpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9QKTtcbiAgICAgICAgfVxuICAgICAgICBzZXQgaXNFZGl0aW5nKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1AsIHQpO1xuICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkgaWYgKHQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2V0QWN0aXZlRWRpdG9yKHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLnBhcmVudC5zZXRBY3RpdmVFZGl0b3IobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0QXNwZWN0UmF0aW8odCwgZSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUywgITApO1xuICAgICAgICAgIGNvbnN0IG4gPSB0IC8gZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6IGlcbiAgICAgICAgICAgIH0gPSB0aGlzLmRpdjtcbiAgICAgICAgICBpLmFzcGVjdFJhdGlvID0gbjtcbiAgICAgICAgICBpLmhlaWdodCA9IFwiYXV0b1wiO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgTUlOX1NJWkUoKSB7XG4gICAgICAgICAgcmV0dXJuIDE2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfY2xhc3MxMiA9IEFubm90YXRpb25FZGl0b3I7XG4gICAgICBmdW5jdGlvbiBfUjIodCwgZSwgbikge1xuICAgICAgICBsZXQgW2ksIHJdID0gdDtcbiAgICAgICAgW2UsIG5dID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbihlLCBuKTtcbiAgICAgICAgdGhpcy54ICs9IGUgLyBpO1xuICAgICAgICB0aGlzLnkgKz0gbiAvIHI7XG4gICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9GMigpIHtcbiAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkpIHJldHVybjtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9FLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9FKS5jbGFzc0xpc3QuYWRkKFwicmVzaXplcnNcIik7XG4gICAgICAgIGNvbnN0IHQgPSBbXCJ0b3BMZWZ0XCIsIFwidG9wUmlnaHRcIiwgXCJib3R0b21SaWdodFwiLCBcImJvdHRvbUxlZnRcIl07XG4gICAgICAgIHRoaXMuX3dpbGxLZWVwQXNwZWN0UmF0aW8gfHwgdC5wdXNoKFwidG9wTWlkZGxlXCIsIFwibWlkZGxlUmlnaHRcIiwgXCJib3R0b21NaWRkbGVcIiwgXCJtaWRkbGVMZWZ0XCIpO1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkuYXBwZW5kKHQpO1xuICAgICAgICAgIHQuY2xhc3NMaXN0LmFkZChcInJlc2l6ZXJcIiwgZSk7XG4gICAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSSwgX0kyKS5iaW5kKHRoaXMsIGUpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpdi5wcmVwZW5kKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRSkpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0kyKHQsIGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3gsIFtlLmNsaWVudFgsIGUuY2xpZW50WV0pO1xuICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRCwgX0QyKS5iaW5kKHRoaXMsIHQpLFxuICAgICAgICAgIGkgPSB0aGlzLmRpdi5kcmFnZ2FibGU7XG4gICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICExO1xuICAgICAgICBjb25zdCByID0gXCJyZXNpemluZ1wiLmNvbmNhdCh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpKS5jb25jYXQodC5zbGljZSgxKSk7XG4gICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKHIpO1xuICAgICAgICBjb25zdCBzID0ge1xuICAgICAgICAgIHBhc3NpdmU6ICEwLFxuICAgICAgICAgIGNhcHR1cmU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgbiwgcyk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLl91aU1hbmFnZXIuc3RvcFVuZG9BY2N1bXVsYXRpb24oKTtcbiAgICAgICAgICB0aGlzLmRpdi5kcmFnZ2FibGUgPSBpO1xuICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QucmVtb3ZlKHIpO1xuICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgbiwgcyk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBvbmNlOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9EMih0LCBlKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNsaWVudFg6IG4sXG4gICAgICAgICAgICBjbGllbnRZOiByXG4gICAgICAgICAgfSA9IGUsXG4gICAgICAgICAgcyA9IG4gLSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3gpWzBdLFxuICAgICAgICAgIGEgPSByIC0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF94KVsxXTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF94KVswXSA9IG47XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeClbMV0gPSByO1xuICAgICAgICBjb25zdCBbbywgbF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnMsXG4gICAgICAgICAgYyA9IHRoaXMueCxcbiAgICAgICAgICBoID0gdGhpcy55LFxuICAgICAgICAgIGQgPSB0aGlzLndpZHRoLFxuICAgICAgICAgIHUgPSB0aGlzLmhlaWdodCxcbiAgICAgICAgICBwID0gX2NsYXNzMTIuTUlOX1NJWkUgLyBvLFxuICAgICAgICAgIGYgPSBfY2xhc3MxMi5NSU5fU0laRSAvIGw7XG4gICAgICAgIGxldCBnO1xuICAgICAgICBjb25zdCByb3VuZCA9IHQgPT4gTWF0aC5yb3VuZCgxZTQgKiB0KSAvIDFlNCxcbiAgICAgICAgICB1cGRhdGVQb3NpdGlvbiA9ICh0LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgICB0aGlzLnNldERpbXMobiAqIHQsIGkgKiBlKTtcbiAgICAgICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgICAgICB9O1xuICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICBjYXNlIFwidG9wTGVmdFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoTWF0aC5zaWduKHMpICogTWF0aC5zaWduKGEpIDwgMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5oeXBvdChzLCBhKSxcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5oeXBvdChkICogbywgdSAqIGwpLFxuICAgICAgICAgICAgICAgIG4gPSByb3VuZChjICsgZCksXG4gICAgICAgICAgICAgICAgaSA9IHJvdW5kKGggKyB1KSxcbiAgICAgICAgICAgICAgICByID0gTWF0aC5tYXgoTWF0aC5taW4oMSAtIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgbSA9IHJvdW5kKGQgKiByKSxcbiAgICAgICAgICAgICAgICBiID0gcm91bmQodSAqIHIpLFxuICAgICAgICAgICAgICAgIHYgPSBuIC0gbSxcbiAgICAgICAgICAgICAgICB5ID0gaSAtIGI7XG4gICAgICAgICAgICAgIGcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IG07XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBiO1xuICAgICAgICAgICAgICAgIHRoaXMueCA9IHY7XG4gICAgICAgICAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihtLCBiKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInRvcE1pZGRsZVwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gcm91bmQodGhpcy55ICsgdSksXG4gICAgICAgICAgICAgICAgZSA9IHJvdW5kKE1hdGgubWF4KGYsIE1hdGgubWluKDEsIHUgLSBhIC8gbCkpKSxcbiAgICAgICAgICAgICAgICBuID0gdCAtIGU7XG4gICAgICAgICAgICAgIGcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBlO1xuICAgICAgICAgICAgICAgIHRoaXMueSA9IG47XG4gICAgICAgICAgICAgICAgdXBkYXRlUG9zaXRpb24oZCwgZSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJ0b3BSaWdodFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoTWF0aC5zaWduKHMpICogTWF0aC5zaWduKGEpID4gMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5oeXBvdChzLCBhKSxcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5oeXBvdCh0aGlzLndpZHRoICogbywgdGhpcy5oZWlnaHQgKiBsKSxcbiAgICAgICAgICAgICAgICBuID0gcm91bmQoaCArIHRoaXMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICBpID0gTWF0aC5tYXgoTWF0aC5taW4oMSArIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgciA9IHJvdW5kKGQgKiBpKSxcbiAgICAgICAgICAgICAgICBjID0gcm91bmQodSAqIGkpLFxuICAgICAgICAgICAgICAgIG0gPSBuIC0gYztcbiAgICAgICAgICAgICAgZyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gcjtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IGM7XG4gICAgICAgICAgICAgICAgdGhpcy55ID0gbTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihyLCBjKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm1pZGRsZVJpZ2h0XCI6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSByb3VuZChNYXRoLm1heChwLCBNYXRoLm1pbigxLCBkICsgcyAvIG8pKSk7XG4gICAgICAgICAgICAgIGcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IHQ7XG4gICAgICAgICAgICAgICAgdXBkYXRlUG9zaXRpb24odCwgdSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJib3R0b21SaWdodFwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoTWF0aC5zaWduKHMpICogTWF0aC5zaWduKGEpIDwgMCkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5oeXBvdChzLCBhKSxcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5oeXBvdCh0aGlzLndpZHRoICogbywgdGhpcy5oZWlnaHQgKiBsKSxcbiAgICAgICAgICAgICAgICBuID0gTWF0aC5tYXgoTWF0aC5taW4oMSArIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgaSA9IHJvdW5kKGQgKiBuKSxcbiAgICAgICAgICAgICAgICByID0gcm91bmQodSAqIG4pO1xuICAgICAgICAgICAgICBnID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gcjtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihpLCByKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImJvdHRvbU1pZGRsZVwiOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gcm91bmQoTWF0aC5tYXgoZiwgTWF0aC5taW4oMSwgdSArIGEgLyBsKSkpO1xuICAgICAgICAgICAgICBnID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdDtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihkLCB0KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImJvdHRvbUxlZnRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKE1hdGguc2lnbihzKSAqIE1hdGguc2lnbihhKSA+IDApIHJldHVybjtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguaHlwb3QocywgYSksXG4gICAgICAgICAgICAgICAgZSA9IE1hdGguaHlwb3QodGhpcy53aWR0aCAqIG8sIHRoaXMuaGVpZ2h0ICogbCksXG4gICAgICAgICAgICAgICAgbiA9IHJvdW5kKGMgKyB0aGlzLndpZHRoKSxcbiAgICAgICAgICAgICAgICBpID0gTWF0aC5tYXgoTWF0aC5taW4oMSAtIE1hdGguc2lnbihzKSAqICh0IC8gZSksIDEgLyBkLCAxIC8gdSksIHAgLyBkLCBmIC8gdSksXG4gICAgICAgICAgICAgICAgciA9IHJvdW5kKGQgKiBpKSxcbiAgICAgICAgICAgICAgICBoID0gcm91bmQodSAqIGkpLFxuICAgICAgICAgICAgICAgIG0gPSBuIC0gcjtcbiAgICAgICAgICAgICAgZyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gcjtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IGg7XG4gICAgICAgICAgICAgICAgdGhpcy54ID0gbTtcbiAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihyLCBoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIm1pZGRsZUxlZnRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IHJvdW5kKGMgKyBkKSxcbiAgICAgICAgICAgICAgICBlID0gcm91bmQoTWF0aC5tYXgocCwgTWF0aC5taW4oMSwgZCAtIHMgLyBvKSkpLFxuICAgICAgICAgICAgICAgIG4gPSB0IC0gZTtcbiAgICAgICAgICAgICAgZyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gZTtcbiAgICAgICAgICAgICAgICB0aGlzLnggPSBuO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uKGUsIHUpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgICBjbWQ6IGcsXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IGQ7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHU7XG4gICAgICAgICAgICB0aGlzLnggPSBjO1xuICAgICAgICAgICAgdGhpcy55ID0gaDtcbiAgICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uKGQsIHUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVzdEV4ZWM6ICEwLFxuICAgICAgICAgIHR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuUkVTSVpFLFxuICAgICAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6ICEwLFxuICAgICAgICAgIGtlZXBVbmRvOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShBbm5vdGF0aW9uRWRpdG9yLCBcIl9jb2xvck1hbmFnZXJcIiwgbmV3IHIuQ29sb3JNYW5hZ2VyKCkpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KEFubm90YXRpb25FZGl0b3IsIFwiX3pJbmRleFwiLCAxKTtcbiAgICAgIGUuQW5ub3RhdGlvbkVkaXRvciA9IEFubm90YXRpb25FZGl0b3I7XG4gICAgICBjbGFzcyBGYWtlRWRpdG9yIGV4dGVuZHMgQW5ub3RhdGlvbkVkaXRvciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0KTtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25FbGVtZW50SWQgPSB0LmFubm90YXRpb25FbGVtZW50SWQ7XG4gICAgICAgICAgdGhpcy5kZWxldGVkID0gITA7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLFxuICAgICAgICAgICAgZGVsZXRlZDogITAsXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLktleWJvYXJkTWFuYWdlciA9IGUuQ29tbWFuZE1hbmFnZXIgPSBlLkNvbG9yTWFuYWdlciA9IGUuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciA9IHZvaWQgMDtcbiAgICAgIGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uIGJpbmRFdmVudHModCwgZSwgbikge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgbikgZS5hZGRFdmVudExpc3RlbmVyKGksIHRbaV0uYmluZCh0KSk7XG4gICAgICB9O1xuICAgICAgZS5vcGFjaXR5VG9IZXggPSBmdW5jdGlvbiBvcGFjaXR5VG9IZXgodCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbigyNTUsIE1hdGgubWF4KDEsIDI1NSAqIHQpKSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgICAgIH07XG4gICAgICBuKDIpO1xuICAgICAgbig4OSk7XG4gICAgICBuKDEyNSk7XG4gICAgICBuKDEzNSk7XG4gICAgICBuKDEzNyk7XG4gICAgICBuKDE0MCk7XG4gICAgICBuKDE0Mik7XG4gICAgICBuKDE0NCk7XG4gICAgICBuKDE0Nik7XG4gICAgICBuKDE2NSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2Nyk7XG4gICAgICB2YXIgX08gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIElkTWFuYWdlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9PLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SWQoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJE8sIF90aGlzJE8yO1xuICAgICAgICAgIHJldHVybiBcIlwiLmNvbmNhdChpLkFubm90YXRpb25FZGl0b3JQcmVmaXgpLmNvbmNhdCgoX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9PLCAoX3RoaXMkTyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTyksIF90aGlzJE8yID0gX3RoaXMkTysrLCBfdGhpcyRPKSksIF90aGlzJE8yKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfTCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9PMiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9OID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0IgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIEltYWdlTWFuYWdlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0wsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICgwLCBpLmdldFV1aWQpKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTzIsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdldEZyb21GaWxlKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IGUsXG4gICAgICAgICAgICBuYW1lOiBuLFxuICAgICAgICAgICAgc2l6ZTogaSxcbiAgICAgICAgICAgIHR5cGU6IHJcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQiwgX0IyKS5jYWxsKHRoaXMsIFwiXCIuY29uY2F0KGUsIFwiX1wiKS5jb25jYXQobiwgXCJfXCIpLmNvbmNhdChpLCBcIl9cIikuY29uY2F0KHIpLCB0KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBnZXRGcm9tVXJsKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQiwgX0IyKS5jYWxsKHRoaXMsIHQsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdldEZyb21JZCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OKSB8fCBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX04sIG5ldyBNYXAoKSk7XG4gICAgICAgICAgY29uc3QgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuZ2V0KHQpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgaWYgKGUuYml0bWFwKSB7XG4gICAgICAgICAgICBlLnJlZkNvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZS5maWxlID8gdGhpcy5nZXRGcm9tRmlsZShlLmZpbGUpIDogdGhpcy5nZXRGcm9tVXJsKGUudXJsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRTdmdVcmwodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX04pLmdldCh0KTtcbiAgICAgICAgICByZXR1cm4gZSAhPT0gbnVsbCAmJiBlICE9PSB2b2lkIDAgJiYgZS5pc1N2ZyA/IGUuc3ZnVXJsIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGVJZCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OKSB8fCBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX04sIG5ldyBNYXAoKSk7XG4gICAgICAgICAgY29uc3QgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuZ2V0KHQpO1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBlLnJlZkNvdW50ZXIgLT0gMTtcbiAgICAgICAgICAgIDAgPT09IGUucmVmQ291bnRlciAmJiAoZS5iaXRtYXAgPSBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaXNWYWxpZElkKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5zdGFydHNXaXRoKFwiaW1hZ2VfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTCksIFwiX1wiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIF9CMih0LCBlKSB7XG4gICAgICAgIHZhciBfbjU7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9OLCBuZXcgTWFwKCkpO1xuICAgICAgICBsZXQgbiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuZ2V0KHQpO1xuICAgICAgICBpZiAobnVsbCA9PT0gbikgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICgoX241ID0gbikgIT09IG51bGwgJiYgX241ICE9PSB2b2lkIDAgJiYgX241LmJpdG1hcCkge1xuICAgICAgICAgIG4ucmVmQ291bnRlciArPSAxO1xuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIF90aGlzJE8zLCBfdGhpcyRPNDtcbiAgICAgICAgICBuIHx8IChuID0ge1xuICAgICAgICAgICAgYml0bWFwOiBudWxsLFxuICAgICAgICAgICAgaWQ6IFwiaW1hZ2VfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTCksIFwiX1wiKS5jb25jYXQoKF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfTzIsIChfdGhpcyRPMyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTzIpLCBfdGhpcyRPNCA9IF90aGlzJE8zKyssIF90aGlzJE8zKSksIF90aGlzJE80KSksXG4gICAgICAgICAgICByZWZDb3VudGVyOiAwLFxuICAgICAgICAgICAgaXNTdmc6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUpIHtcbiAgICAgICAgICAgIG4udXJsID0gZTtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBhd2FpdCBmZXRjaChlKTtcbiAgICAgICAgICAgIGlmICghaS5vaykgdGhyb3cgbmV3IEVycm9yKGkuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICB0ID0gYXdhaXQgaS5ibG9iKCk7XG4gICAgICAgICAgfSBlbHNlIHQgPSBuLmZpbGUgPSBlO1xuICAgICAgICAgIGlmIChcImltYWdlL3N2Zyt4bWxcIiA9PT0gdC50eXBlKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IEZpbGVSZWFkZXIoKSxcbiAgICAgICAgICAgICAgaSA9IG5ldyBJbWFnZSgpLFxuICAgICAgICAgICAgICByID0gbmV3IFByb21pc2UoKHQsIHIpID0+IHtcbiAgICAgICAgICAgICAgICBpLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIG4uYml0bWFwID0gaTtcbiAgICAgICAgICAgICAgICAgIG4uaXNTdmcgPSAhMDtcbiAgICAgICAgICAgICAgICAgIHQoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGUub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaS5zcmMgPSBuLnN2Z1VybCA9IGUucmVzdWx0O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaS5vbmVycm9yID0gZS5vbmVycm9yID0gcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlLnJlYWRBc0RhdGFVUkwodCk7XG4gICAgICAgICAgICBhd2FpdCByO1xuICAgICAgICAgIH0gZWxzZSBuLmJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHQpO1xuICAgICAgICAgIG4ucmVmQ291bnRlciA9IDE7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHQpO1xuICAgICAgICAgIG4gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuc2V0KHQsIG4pO1xuICAgICAgICBuICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTikuc2V0KG4uaWQsIG4pO1xuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIHZhciBfaiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9VID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3ogPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgQ29tbWFuZE1hbmFnZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogW11cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfVSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfeiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0gsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IC0xXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDEyODtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3osIHQpO1xuICAgICAgICB9XG4gICAgICAgIGFkZCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGNtZDogZSxcbiAgICAgICAgICAgIHVuZG86IG4sXG4gICAgICAgICAgICBtdXN0RXhlYzogaSxcbiAgICAgICAgICAgIHR5cGU6IHIgPSBOYU4sXG4gICAgICAgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiBzID0gITEsXG4gICAgICAgICAgICBrZWVwVW5kbzogYSA9ICExXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgaSAmJiBlKCk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVSkpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBvID0ge1xuICAgICAgICAgICAgY21kOiBlLFxuICAgICAgICAgICAgdW5kbzogbixcbiAgICAgICAgICAgIHR5cGU6IHJcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICgtMSA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKSkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKS5sZW5ndGggPiAwICYmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2opLmxlbmd0aCA9IDApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ILCAwKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikucHVzaChvKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXS50eXBlID09PSByKSB7XG4gICAgICAgICAgICBhICYmIChvLnVuZG8gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2opW19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCldLnVuZG8pO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXSA9IG87XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGwgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpICsgMTtcbiAgICAgICAgICBpZiAobCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF96KSkgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKS5zcGxpY2UoMCwgMSk7ZWxzZSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0gsIGwpO1xuICAgICAgICAgICAgbCA8IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikubGVuZ3RoICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikuc3BsaWNlKGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2opLnB1c2gobyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcFVuZG9BY2N1bXVsYXRpb24oKSB7XG4gICAgICAgICAgLTEgIT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCkgJiYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfailbX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKV0udHlwZSA9IE5hTik7XG4gICAgICAgIH1cbiAgICAgICAgdW5kbygpIHtcbiAgICAgICAgICBpZiAoLTEgIT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCkpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVSwgITApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXS51bmRvKCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1UsICExKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfSCwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKSAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZWRvKCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpIDwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0gsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSCkgKyAxKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVSwgITApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9qKVtfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpXS5jbWQoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVSwgITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG8oKSB7XG4gICAgICAgICAgcmV0dXJuIC0xICE9PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0gpO1xuICAgICAgICB9XG4gICAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbygpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9IKSA8IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaikubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuQ29tbWFuZE1hbmFnZXIgPSBDb21tYW5kTWFuYWdlcjtcbiAgICAgIHZhciBfcSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgY2xhc3MgS2V5Ym9hcmRNYW5hZ2VyIHtcbiAgICAgICAgY29uc3RydWN0b3IoX3Q1KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9xKTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICAgIHRoaXMuYWxsS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc01hYzogX2U1XG4gICAgICAgICAgfSA9IGkuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICAgICAgZm9yIChjb25zdCBbbiwgaSwgciA9IHt9XSBvZiBfdDUpIGZvciAoY29uc3QgdCBvZiBuKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5zdGFydHNXaXRoKFwibWFjK1wiKTtcbiAgICAgICAgICAgIGlmIChfZTUgJiYgbikge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQodC5zbGljZSg0KSwge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQodC5zcGxpdChcIitcIikuYXQoLTEpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIV9lNSAmJiAhbikge1xuICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQodCwge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQodC5zcGxpdChcIitcIikuYXQoLTEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhlYyh0LCBlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmFsbEtleXMuaGFzKGUua2V5KSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmNhbGxiYWNrcy5nZXQoX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcSwgX3EyKS5jYWxsKHRoaXMsIGUpKTtcbiAgICAgICAgICBpZiAoIW4pIHJldHVybjtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjYWxsYmFjazogaSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYnViYmxlczogciA9ICExLFxuICAgICAgICAgICAgICBhcmdzOiBzID0gW10sXG4gICAgICAgICAgICAgIGNoZWNrZXI6IGEgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSA9IG47XG4gICAgICAgICAgaWYgKCFhIHx8IGEodCwgZSkpIHtcbiAgICAgICAgICAgIGkuYmluZCh0LCAuLi5zKSgpO1xuICAgICAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9xMih0KSB7XG4gICAgICAgIHQuYWx0S2V5ICYmIHRoaXMuYnVmZmVyLnB1c2goXCJhbHRcIik7XG4gICAgICAgIHQuY3RybEtleSAmJiB0aGlzLmJ1ZmZlci5wdXNoKFwiY3RybFwiKTtcbiAgICAgICAgdC5tZXRhS2V5ICYmIHRoaXMuYnVmZmVyLnB1c2goXCJtZXRhXCIpO1xuICAgICAgICB0LnNoaWZ0S2V5ICYmIHRoaXMuYnVmZmVyLnB1c2goXCJzaGlmdFwiKTtcbiAgICAgICAgdGhpcy5idWZmZXIucHVzaCh0LmtleSk7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmJ1ZmZlci5qb2luKFwiK1wiKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGVuZ3RoID0gMDtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBlLktleWJvYXJkTWFuYWdlciA9IEtleWJvYXJkTWFuYWdlcjtcbiAgICAgIGNsYXNzIENvbG9yTWFuYWdlciB7XG4gICAgICAgIGdldCBfY29sb3JzKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgTWFwKFtbXCJDYW52YXNUZXh0XCIsIG51bGxdLCBbXCJDYW52YXNcIiwgbnVsbF1dKTtcbiAgICAgICAgICAoMCwgci5nZXRDb2xvclZhbHVlcykodCk7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJfY29sb3JzXCIsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnZlcnQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSAoMCwgci5nZXRSR0IpKHQpO1xuICAgICAgICAgIGlmICghd2luZG93Lm1hdGNoTWVkaWEoXCIoZm9yY2VkLWNvbG9yczogYWN0aXZlKVwiKS5tYXRjaGVzKSByZXR1cm4gZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFt0LCBuXSBvZiB0aGlzLl9jb2xvcnMpIGlmIChuLmV2ZXJ5KCh0LCBuKSA9PiB0ID09PSBlW25dKSkgcmV0dXJuIENvbG9yTWFuYWdlci5fY29sb3JzTWFwcGluZy5nZXQodCk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0SGV4Q29kZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuX2NvbG9ycy5nZXQodCk7XG4gICAgICAgICAgcmV0dXJuIGUgPyBpLlV0aWwubWFrZUhleENvbG9yKC4uLmUpIDogdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KENvbG9yTWFuYWdlciwgXCJfY29sb3JzTWFwcGluZ1wiLCBuZXcgTWFwKFtbXCJDYW52YXNUZXh0XCIsIFswLCAwLCAwXV0sIFtcIkNhbnZhc1wiLCBbMjU1LCAyNTUsIDI1NV1dXSkpO1xuICAgICAgZS5Db2xvck1hbmFnZXIgPSBDb2xvck1hbmFnZXI7XG4gICAgICB2YXIgX1cgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfRyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9WID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgXyQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9LID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1kgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9RID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1ogPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfaXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfc3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfYXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfb3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfY3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfaHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZ3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfYnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfdnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfQXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfdDYgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfeHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfd3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfVHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfUHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfU3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfQ3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfRXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIge1xuICAgICAgICBzdGF0aWMgZ2V0IF9rZXlib2FyZE1hbmFnZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgICAgICAgYXJyb3dDaGVja2VyID0gdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50OiBlXG4gICAgICAgICAgICAgIH0gPSBkb2N1bWVudDtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHQsIF9idCkuY29udGFpbnMoZSkgJiYgdC5oYXNTb21ldGhpbmdUb0NvbnRyb2woKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlID0gdGhpcy5UUkFOU0xBVEVfU01BTEwsXG4gICAgICAgICAgICBuID0gdGhpcy5UUkFOU0xBVEVfQklHO1xuICAgICAgICAgIHJldHVybiAoMCwgaS5zaGFkb3cpKHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiY3RybCthXCIsIFwibWFjK21ldGErYVwiXSwgdC5zZWxlY3RBbGxdLCBbW1wiY3RybCt6XCIsIFwibWFjK21ldGErelwiXSwgdC51bmRvXSwgW1tcImN0cmwreVwiLCBcImN0cmwrc2hpZnQrelwiLCBcIm1hYyttZXRhK3NoaWZ0K3pcIiwgXCJjdHJsK3NoaWZ0K1pcIiwgXCJtYWMrbWV0YStzaGlmdCtaXCJdLCB0LnJlZG9dLCBbW1wiQmFja3NwYWNlXCIsIFwiYWx0K0JhY2tzcGFjZVwiLCBcImN0cmwrQmFja3NwYWNlXCIsIFwic2hpZnQrQmFja3NwYWNlXCIsIFwibWFjK0JhY2tzcGFjZVwiLCBcIm1hYythbHQrQmFja3NwYWNlXCIsIFwibWFjK2N0cmwrQmFja3NwYWNlXCIsIFwiRGVsZXRlXCIsIFwiY3RybCtEZWxldGVcIiwgXCJzaGlmdCtEZWxldGVcIiwgXCJtYWMrRGVsZXRlXCJdLCB0LmRlbGV0ZV0sIFtbXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCB0LnVuc2VsZWN0QWxsXSwgW1tcIkFycm93TGVmdFwiLCBcIm1hYytBcnJvd0xlZnRcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbLWUsIDBdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJjdHJsK0Fycm93TGVmdFwiLCBcIm1hYytzaGlmdCtBcnJvd0xlZnRcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbLW4sIDBdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJBcnJvd1JpZ2h0XCIsIFwibWFjK0Fycm93UmlnaHRcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbZSwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dSaWdodFwiLCBcIm1hYytzaGlmdCtBcnJvd1JpZ2h0XCJdLCB0LnRyYW5zbGF0ZVNlbGVjdGVkRWRpdG9ycywge1xuICAgICAgICAgICAgYXJnczogW24sIDBdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJBcnJvd1VwXCIsIFwibWFjK0Fycm93VXBcIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbMCwgLWVdLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV0sIFtbXCJjdHJsK0Fycm93VXBcIiwgXCJtYWMrc2hpZnQrQXJyb3dVcFwiXSwgdC50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCAtbl0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcIkFycm93RG93blwiLCBcIm1hYytBcnJvd0Rvd25cIl0sIHQudHJhbnNsYXRlU2VsZWN0ZWRFZGl0b3JzLCB7XG4gICAgICAgICAgICBhcmdzOiBbMCwgZV0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dEb3duXCIsIFwibWFjK3NoaWZ0K0Fycm93RG93blwiXSwgdC50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnMsIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCBuXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dXSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdG9yKF90OCwgX2U2LCBfbjQsIF9pMykge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfRXQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQ3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfU3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfUHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfVHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfd3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfeHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfdDYpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfQXQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfdnQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfeXQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9XLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0csIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9WLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfJCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9YLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgQ29tbWFuZE1hbmFnZXIoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9LLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1ksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9KLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1EsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9aLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3R0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2V0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgSWRNYW5hZ2VyKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbnQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2l0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBpLkFubm90YXRpb25FZGl0b3JUeXBlLk5PTkVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfcnQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBTZXQoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9zdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9hdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5jb3B5LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfb3QsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3V0LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFzdGUuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9jdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5rZXlkb3duLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMub25FZGl0aW5nQWN0aW9uLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMub25QYWdlQ2hhbmdpbmcuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF91dCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5vblNjYWxlQ2hhbmdpbmcuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9wdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5vblJvdGF0aW9uQ2hhbmdpbmcuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9mdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBpc0VkaXRpbmc6ICExLFxuICAgICAgICAgICAgICBpc0VtcHR5OiAhMCxcbiAgICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiAhMSxcbiAgICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiAhMSxcbiAgICAgICAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6ICExXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2d0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBbMCwgMF1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbXQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfYnQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2J0LCBfdDgpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWiwgX2U2KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vbihcImVkaXRpbmdhY3Rpb25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9odCkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuX29uKFwicGFnZWNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZHQpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vbihcInNjYWxlY2hhbmdpbmdcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF91dCkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuX29uKFwicm90YXRpb25jaGFuZ2luZ1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3B0KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF8kLCBfbjQuYW5ub3RhdGlvblN0b3JhZ2UpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfdHQsIF9uNC5maWx0ZXJGYWN0b3J5KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3N0LCBfaTMpO1xuICAgICAgICAgIHRoaXMudmlld1BhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICByZWFsU2NhbGU6IHIuUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTLFxuICAgICAgICAgICAgcm90YXRpb246IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfdnQsIF92dDIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9aKS5fb2ZmKFwiZWRpdGluZ2FjdGlvblwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2h0KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9aKS5fb2ZmKFwicGFnZWNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZHQpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vZmYoXCJzY2FsZWNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdXQpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1opLl9vZmYoXCJyb3RhdGlvbmNoYW5naW5nXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcHQpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS52YWx1ZXMoKSkgdC5kZXN0cm95KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykuY2xlYXIoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1EpLmNsZWFyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9XLCBudWxsKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBoY21GaWx0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJoY21GaWx0ZXJcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9zdCkgPyBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3R0KS5hZGRIQ01GaWx0ZXIoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9zdCkuZm9yZWdyb3VuZCwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9zdCkuYmFja2dyb3VuZCkgOiBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgb25QYWdlQ2hhbmdpbmcodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBwYWdlTnVtYmVyOiBlXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9LLCBlIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9jdXNNYWluQ29udGFpbmVyKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYnQpLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkU2hvdWxkUmVzY2FsZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RKS5hZGQodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlU2hvdWxkUmVzY2FsZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RKS5kZWxldGUodCk7XG4gICAgICAgIH1cbiAgICAgICAgb25TY2FsZUNoYW5naW5nKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgc2NhbGU6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgICAgdGhpcy52aWV3UGFyYW1ldGVycy5yZWFsU2NhbGUgPSBlICogci5QaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFM7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUSkpIHQub25TY2FsZUNoYW5naW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgb25Sb3RhdGlvbkNoYW5naW5nKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgcGFnZXNSb3RhdGlvbjogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLnZpZXdQYXJhbWV0ZXJzLnJvdGF0aW9uID0gZTtcbiAgICAgICAgfVxuICAgICAgICBhZGRUb0Fubm90YXRpb25TdG9yYWdlKHQpIHtcbiAgICAgICAgICB0LmlzRW1wdHkoKSB8fCAhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF8kKSB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgXyQpLmhhcyh0LmlkKSB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgXyQpLnNldFZhbHVlKHQuaWQsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvcHkodCkge1xuICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQuc2VyaWFsaXplKCEwKTtcbiAgICAgICAgICAgIG4gJiYgZS5wdXNoKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAwICE9PSBlLmxlbmd0aCAmJiB0LmNsaXBib2FyZERhdGEuc2V0RGF0YShcImFwcGxpY2F0aW9uL3BkZmpzXCIsIEpTT04uc3RyaW5naWZ5KGUpKTtcbiAgICAgICAgfVxuICAgICAgICBjdXQodCkge1xuICAgICAgICAgIHRoaXMuY29weSh0KTtcbiAgICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHBhc3RlKHQpIHtcbiAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgbGV0IGUgPSB0LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcImFwcGxpY2F0aW9uL3BkZmpzXCIpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlID0gSlNPTi5wYXJzZShlKTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcInBhc3RlOiBcXFwiXCIuY29uY2F0KHQubWVzc2FnZSwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdXJyZW50TGF5ZXI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBuLmRlc2VyaWFsaXplKGkpO1xuICAgICAgICAgICAgICBpZiAoIWUpIHJldHVybjtcbiAgICAgICAgICAgICAgdC5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY21kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9TdCwgX1N0MikuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9FdCwgX0V0MikuY2FsbCh0aGlzLCB0KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5kbyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkgZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgICAgICBjbWQ6IGNtZCxcbiAgICAgICAgICAgICAgdW5kbzogdW5kbyxcbiAgICAgICAgICAgICAgbXVzdEV4ZWM6ICEwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcInBhc3RlOiBcXFwiXCIuY29uY2F0KHQubWVzc2FnZSwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleWRvd24odCkge1xuICAgICAgICAgIHZhciBfdGhpcyRnZXRBY3RpdmU7XG4gICAgICAgICAgKChfdGhpcyRnZXRBY3RpdmUgPSB0aGlzLmdldEFjdGl2ZSgpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXRBY3RpdmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGdldEFjdGl2ZS5zaG91bGRHZXRLZXlib2FyZEV2ZW50cygpKSB8fCBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCB0KTtcbiAgICAgICAgfVxuICAgICAgICBvbkVkaXRpbmdBY3Rpb24odCkge1xuICAgICAgICAgIFtcInVuZG9cIiwgXCJyZWRvXCIsIFwiZGVsZXRlXCIsIFwic2VsZWN0QWxsXCJdLmluY2x1ZGVzKHQubmFtZSkgJiYgdGhpc1t0Lm5hbWVdKCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RWRpdGluZ1N0YXRlKHQpIHtcbiAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeXQsIF95dDIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9BdCwgX0F0MikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgaXNFZGl0aW5nOiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2l0KSAhPT0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FLFxuICAgICAgICAgICAgICBpc0VtcHR5OiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9DdCwgX0N0MikuY2FsbCh0aGlzKSxcbiAgICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLmhhc1NvbWV0aGluZ1RvVW5kbygpLFxuICAgICAgICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuaGFzU29tZXRoaW5nVG9SZWRvKCksXG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3Z0LCBfdnQyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfdDYsIF90NykuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgICAgaXNFZGl0aW5nOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlZ2lzdGVyRWRpdG9yVHlwZXModCkge1xuICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9KKSkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9KLCB0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0opKSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF93dCwgX3d0MikuY2FsbCh0aGlzLCB0LmRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXRJZCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ldCkuZ2V0SWQoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY3VycmVudExheWVyKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1YpLmdldChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0spKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY3VycmVudFBhZ2VJbmRleCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9LKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRMYXllcih0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS5zZXQodC5wYWdlSW5kZXgsIHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbnQpID8gdC5lbmFibGUoKSA6IHQuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZUxheWVyKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1YpLmRlbGV0ZSh0LnBhZ2VJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlTW9kZSh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9pdCwgdCk7XG4gICAgICAgICAgaWYgKHQgIT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgICAgICAgdGhpcy5zZXRFZGl0aW5nU3RhdGUoITApO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVHQsIF9UdDIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS52YWx1ZXMoKSkgZS51cGRhdGVNb2RlKHQpO1xuICAgICAgICAgICAgaWYgKGUpIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnZhbHVlcygpKSBpZiAodC5hbm5vdGF0aW9uRWxlbWVudElkID09PSBlKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWQodCk7XG4gICAgICAgICAgICAgIHQuZW50ZXJJbkVkaXRNb2RlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEVkaXRpbmdTdGF0ZSghMSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9QdCwgX1B0MikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlVG9vbGJhcih0KSB7XG4gICAgICAgICAgdCAhPT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9pdCkgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9aKS5kaXNwYXRjaChcInN3aXRjaGFubm90YXRpb25lZGl0b3Jtb2RlXCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgIG1vZGU6IHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXJhbXModCwgZSkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0opKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkpIG4udXBkYXRlUGFyYW1zKHQsIGUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSikpIG4udXBkYXRlRGVmYXVsdFBhcmFtcyh0LCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdG9ycyh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnZhbHVlcygpKSBuLnBhZ2VJbmRleCA9PT0gdCAmJiBlLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdG9yKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9HKS5nZXQodCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkRWRpdG9yKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnNldCh0LmlkLCB0KTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmVFZGl0b3IodCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQ0O1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykuZGVsZXRlKHQuaWQpO1xuICAgICAgICAgIHRoaXMudW5zZWxlY3QodCk7XG4gICAgICAgICAgdC5hbm5vdGF0aW9uRWxlbWVudElkICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWSkuaGFzKHQuYW5ub3RhdGlvbkVsZW1lbnRJZCkgfHwgKChfY2xhc3NQcml2YXRlRmllbGRHZXQ0ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF8kKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NC5yZW1vdmUodC5pZCkpO1xuICAgICAgICB9XG4gICAgICAgIGFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZKS5hZGQodC5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB0LmRlbGV0ZWQgPSAhMDtcbiAgICAgICAgfVxuICAgICAgICBpc0RlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWSkuaGFzKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZURlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZKS5kZWxldGUodC5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB0LmRlbGV0ZWQgPSAhMTtcbiAgICAgICAgfVxuICAgICAgICBzZXRBY3RpdmVFZGl0b3IodCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpICE9PSB0KSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1csIHQpO1xuICAgICAgICAgICAgdCAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF93dCwgX3d0MikuY2FsbCh0aGlzLCB0LnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVNlbGVjdGVkKHQpIHtcbiAgICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuaGFzKHQpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5kZWxldGUodCk7XG4gICAgICAgICAgICB0LnVuc2VsZWN0KCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0aGlzLmhhc1NlbGVjdGlvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpLmFkZCh0KTtcbiAgICAgICAgICAgIHQuc2VsZWN0KCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF93dCwgX3d0MikuY2FsbCh0aGlzLCB0LnByb3BlcnRpZXNUb1VwZGF0ZSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldFNlbGVjdGVkKHQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkpIGUgIT09IHQgJiYgZS51bnNlbGVjdCgpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpLmNsZWFyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuYWRkKHQpO1xuICAgICAgICAgIHQuc2VsZWN0KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfd3QsIF93dDIpLmNhbGwodGhpcywgdC5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlzU2VsZWN0ZWQodCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5oYXModCk7XG4gICAgICAgIH1cbiAgICAgICAgdW5zZWxlY3QodCkge1xuICAgICAgICAgIHQudW5zZWxlY3QoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5kZWxldGUodCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeHQsIF94dDIpLmNhbGwodGhpcywge1xuICAgICAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGhhc1NlbGVjdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gMCAhPT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBzdG9wVW5kb0FjY3VtdWxhdGlvbigpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLnN0b3BVbmRvQWNjdW11bGF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdW5kbygpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLnVuZG8oKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuaGFzU29tZXRoaW5nVG9VbmRvKCksXG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86ICEwLFxuICAgICAgICAgICAgaXNFbXB0eTogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQ3QsIF9DdDIpLmNhbGwodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZWRvKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkucmVkbygpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3h0LCBfeHQyKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogITAsXG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWCkuaGFzU29tZXRoaW5nVG9SZWRvKCksXG4gICAgICAgICAgICBpc0VtcHR5OiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9DdCwgX0N0MikuY2FsbCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFkZENvbW1hbmRzKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1gpLmFkZCh0KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF94dCwgX3h0MikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86ICEwLFxuICAgICAgICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiAhMSxcbiAgICAgICAgICAgIGlzRW1wdHk6IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0N0LCBfQ3QyKS5jYWxsKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlKCkge1xuICAgICAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgdCA9IFsuLi5fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KV07XG4gICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIGUucmVtb3ZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdCkgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfU3QsIF9TdDIpLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbXVzdEV4ZWM6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29tbWl0T3JSZW1vdmUoKSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDU7XG4gICAgICAgICAgKF9jbGFzc1ByaXZhdGVGaWVsZEdldDUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpKSA9PT0gbnVsbCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQ1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2xhc3NQcml2YXRlRmllbGRHZXQ1LmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaGFzU29tZXRoaW5nVG9Db250cm9sKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpIHx8IHRoaXMuaGFzU2VsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdEFsbCgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkpIHQuY29tbWl0KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRXQsIF9FdDIpLmNhbGwodGhpcywgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9HKS52YWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5zZWxlY3RBbGwoKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykpIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykuY29tbWl0T3JSZW1vdmUoKTtlbHNlIGlmICh0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpKSB0LnVuc2VsZWN0KCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3J0KS5jbGVhcigpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeHQsIF94dDIpLmNhbGwodGhpcywge1xuICAgICAgICAgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnModCwgZSkge1xuICAgICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdICYmIGFyZ3VtZW50c1syXSB8fCB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikgcmV0dXJuO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZ3QpWzBdICs9IHQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ndClbMV0gKz0gZTtcbiAgICAgICAgICBjb25zdCBbbiwgaV0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2d0KSxcbiAgICAgICAgICAgIHIgPSBbLi4uX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCldO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbXQpICYmIGNsZWFyVGltZW91dChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX210KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9tdCwgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX210LCBudWxsKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZ3QpWzBdID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ndClbMV0gPSAwO1xuICAgICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiByKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLmhhcyh0LmlkKSAmJiB0LnRyYW5zbGF0ZUluUGFnZShuLCBpKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiByKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLmhhcyh0LmlkKSAmJiB0LnRyYW5zbGF0ZUluUGFnZSgtbiwgLWkpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtdXN0RXhlYzogITFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIDFlMykpO1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiByKSBuLnRyYW5zbGF0ZUluUGFnZSh0LCBlKTtcbiAgICAgICAgfVxuICAgICAgICBpc0FjdGl2ZSh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVykgPT09IHQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0QWN0aXZlKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1cpO1xuICAgICAgICB9XG4gICAgICAgIGdldE1vZGUoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaXQpO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpbWFnZU1hbmFnZXIoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJpbWFnZU1hbmFnZXJcIiwgbmV3IEltYWdlTWFuYWdlcigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3l0MigpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfY3QpLCB7XG4gICAgICAgICAgY2FwdHVyZTogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfdnQyKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jdCksIHtcbiAgICAgICAgICBjYXB0dXJlOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9BdDIoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYXQpKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImN1dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX290KSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2x0KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfdDcoKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb3B5XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYXQpKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImN1dFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX290KSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwYXN0ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2x0KSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfeHQyKHQpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXModCkuc29tZSh0ID0+IHtcbiAgICAgICAgICBsZXQgW2UsIG5dID0gdDtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mdClbZV0gIT09IG47XG4gICAgICAgIH0pICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9yc3RhdGVzY2hhbmdlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbHM6IE9iamVjdC5hc3NpZ24oX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mdCksIHQpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3d0Mih0KSB7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWikuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9ycGFyYW1zY2hhbmdlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgIGRldGFpbHM6IHRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfVHQyKCkge1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbnQpKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9udCwgITApO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1YpLnZhbHVlcygpKSB0LmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfUHQyKCkge1xuICAgICAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XG4gICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX250KSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbnQsICExKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS52YWx1ZXMoKSkgdC5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9TdDIodCkge1xuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WKS5nZXQodC5wYWdlSW5kZXgpO1xuICAgICAgICBlID8gZS5hZGRPclJlYnVpbGQodCkgOiB0aGlzLmFkZEVkaXRvcih0KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9DdDIoKSB7XG4gICAgICAgIGlmICgwID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0cpLnNpemUpIHJldHVybiAhMDtcbiAgICAgICAgaWYgKDEgPT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykuc2l6ZSkgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRykudmFsdWVzKCkpIHJldHVybiB0LmlzRW1wdHkoKTtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0V0Mih0KSB7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcnQpLmNsZWFyKCk7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSBpZiAoIWUuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ydCkuYWRkKGUpO1xuICAgICAgICAgIGUuc2VsZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfeHQsIF94dDIpLmNhbGwodGhpcywge1xuICAgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLCBcIlRSQU5TTEFURV9TTUFMTFwiLCAxKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLCBcIlRSQU5TTEFURV9CSUdcIiwgMTApO1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyID0gQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlcjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIHZhciBpID0gbigzKSxcbiAgICAgICAgciA9IG4oNiksXG4gICAgICAgIHMgPSBuKDQpLFxuICAgICAgICBhID0gbigyNCksXG4gICAgICAgIG8gPSBuKDE0KSxcbiAgICAgICAgbCA9IG4oOCksXG4gICAgICAgIGMgPSBuKDIxKSxcbiAgICAgICAgaCA9IG4oMjApLFxuICAgICAgICBkID0gbig5MSksXG4gICAgICAgIHUgPSBuKDM5KSxcbiAgICAgICAgcCA9IG4oNzcpLFxuICAgICAgICBmID0gbig2NCksXG4gICAgICAgIGcgPSBuKDE1OCksXG4gICAgICAgIG0gPSBuKDcpLFxuICAgICAgICBiID0gbigxNjYpLFxuICAgICAgICB2ID0gbigyNyksXG4gICAgICAgIHkgPSBzLkpTT04sXG4gICAgICAgIEEgPSBzLk51bWJlcixcbiAgICAgICAgXyA9IHMuU3ludGF4RXJyb3IsXG4gICAgICAgIFMgPSB5ICYmIHkucGFyc2UsXG4gICAgICAgIEUgPSBhKFwiT2JqZWN0XCIsIFwia2V5c1wiKSxcbiAgICAgICAgeCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gICAgICAgIHcgPSBvKFwiXCIuY2hhckF0KSxcbiAgICAgICAgQyA9IG8oXCJcIi5zbGljZSksXG4gICAgICAgIFQgPSBvKC8uLy5leGVjKSxcbiAgICAgICAgUCA9IG8oW10ucHVzaCksXG4gICAgICAgIGsgPSAvXlxcZCQvLFxuICAgICAgICBNID0gL15bMS05XSQvLFxuICAgICAgICBSID0gL14oLXxcXGQpJC8sXG4gICAgICAgIEkgPSAvXltcXHRcXG5cXHIgXSQvLFxuICAgICAgICBpbnRlcm5hbGl6ZSA9IGZ1bmN0aW9uIGludGVybmFsaXplKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICB2YXIgcixcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICBhLFxuICAgICAgICAgICAgbyxcbiAgICAgICAgICAgIGMsXG4gICAgICAgICAgICBwID0gdFtlXSxcbiAgICAgICAgICAgIGcgPSBpICYmIHAgPT09IGkudmFsdWUsXG4gICAgICAgICAgICBtID0gZyAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBpLnNvdXJjZSA/IHtcbiAgICAgICAgICAgICAgc291cmNlOiBpLnNvdXJjZVxuICAgICAgICAgICAgfSA6IHt9O1xuICAgICAgICAgIGlmIChoKHApKSB7XG4gICAgICAgICAgICB2YXIgYiA9IGQocCksXG4gICAgICAgICAgICAgIHYgPSBnID8gaS5ub2RlcyA6IGIgPyBbXSA6IHt9O1xuICAgICAgICAgICAgaWYgKGIpIHtcbiAgICAgICAgICAgICAgciA9IHYubGVuZ3RoO1xuICAgICAgICAgICAgICBhID0gZihwKTtcbiAgICAgICAgICAgICAgZm9yIChvID0gMDsgbyA8IGE7IG8rKykgaW50ZXJuYWxpemVQcm9wZXJ0eShwLCBvLCBpbnRlcm5hbGl6ZShwLCBcIlwiICsgbywgbiwgbyA8IHIgPyB2W29dIDogdm9pZCAwKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzID0gRShwKTtcbiAgICAgICAgICAgICAgYSA9IGYocyk7XG4gICAgICAgICAgICAgIGZvciAobyA9IDA7IG8gPCBhOyBvKyspIHtcbiAgICAgICAgICAgICAgICBjID0gc1tvXTtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbGl6ZVByb3BlcnR5KHAsIGMsIGludGVybmFsaXplKHAsIGMsIG4sIHUodiwgYykgPyB2W2NdIDogdm9pZCAwKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGwobiwgdCwgZSwgcCwgbSk7XG4gICAgICAgIH0sXG4gICAgICAgIGludGVybmFsaXplUHJvcGVydHkgPSBmdW5jdGlvbiBpbnRlcm5hbGl6ZVByb3BlcnR5KHQsIGUsIG4pIHtcbiAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgdmFyIGkgPSB4KHQsIGUpO1xuICAgICAgICAgICAgaWYgKGkgJiYgIWkuY29uZmlndXJhYmxlKSByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHZvaWQgMCA9PT0gbiA/IGRlbGV0ZSB0W2VdIDogZyh0LCBlLCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAgTm9kZSA9IGZ1bmN0aW9uIE5vZGUodCwgZSwgbiwgaSkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0O1xuICAgICAgICAgIHRoaXMuZW5kID0gZTtcbiAgICAgICAgICB0aGlzLnNvdXJjZSA9IG47XG4gICAgICAgICAgdGhpcy5ub2RlcyA9IGk7XG4gICAgICAgIH0sXG4gICAgICAgIENvbnRleHQgPSBmdW5jdGlvbiBDb250ZXh0KHQsIGUpIHtcbiAgICAgICAgICB0aGlzLnNvdXJjZSA9IHQ7XG4gICAgICAgICAgdGhpcy5pbmRleCA9IGU7XG4gICAgICAgIH07XG4gICAgICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICAgICAgZm9yazogZnVuY3Rpb24gZm9yayh0KSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb250ZXh0KHRoaXMuc291cmNlLCB0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKCkge1xuICAgICAgICAgIHZhciB0ID0gdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICBlID0gdGhpcy5za2lwKEksIHRoaXMuaW5kZXgpLFxuICAgICAgICAgICAgbiA9IHRoaXMuZm9yayhlKSxcbiAgICAgICAgICAgIGkgPSB3KHQsIGUpO1xuICAgICAgICAgIGlmIChUKFIsIGkpKSByZXR1cm4gbi5udW1iZXIoKTtcbiAgICAgICAgICBzd2l0Y2ggKGkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ7XCI6XG4gICAgICAgICAgICAgIHJldHVybiBuLm9iamVjdCgpO1xuICAgICAgICAgICAgY2FzZSBcIltcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIG4uYXJyYXkoKTtcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgICAgcmV0dXJuIG4uc3RyaW5nKCk7XG4gICAgICAgICAgICBjYXNlIFwidFwiOlxuICAgICAgICAgICAgICByZXR1cm4gbi5rZXl3b3JkKCEwKTtcbiAgICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICAgIHJldHVybiBuLmtleXdvcmQoITEpO1xuICAgICAgICAgICAgY2FzZSBcIm5cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIG4ua2V5d29yZChudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgXygnVW5leHBlY3RlZCBjaGFyYWN0ZXI6IFwiJyArIGkgKyAnXCIgYXQ6ICcgKyBlKTtcbiAgICAgICAgfSxcbiAgICAgICAgbm9kZTogZnVuY3Rpb24gbm9kZSh0LCBlLCBuLCBpLCByKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBOb2RlKGUsIGksIHQgPyBudWxsIDogQyh0aGlzLnNvdXJjZSwgbiwgaSksIHIpO1xuICAgICAgICB9LFxuICAgICAgICBvYmplY3Q6IGZ1bmN0aW9uIG9iamVjdCgpIHtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy5zb3VyY2UsIGUgPSB0aGlzLmluZGV4ICsgMSwgbiA9ICExLCBpID0ge30sIHIgPSB7fTsgZSA8IHQubGVuZ3RoOykge1xuICAgICAgICAgICAgZSA9IHRoaXMudW50aWwoWydcIicsIFwifVwiXSwgZSk7XG4gICAgICAgICAgICBpZiAoXCJ9XCIgPT0gdyh0LCBlKSAmJiAhbikge1xuICAgICAgICAgICAgICBlKys7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHMgPSB0aGlzLmZvcmsoZSkuc3RyaW5nKCksXG4gICAgICAgICAgICAgIGEgPSBzLnZhbHVlO1xuICAgICAgICAgICAgZSA9IHMuZW5kO1xuICAgICAgICAgICAgZSA9IHRoaXMudW50aWwoW1wiOlwiXSwgZSkgKyAxO1xuICAgICAgICAgICAgZSA9IHRoaXMuc2tpcChJLCBlKTtcbiAgICAgICAgICAgIHMgPSB0aGlzLmZvcmsoZSkucGFyc2UoKTtcbiAgICAgICAgICAgIGcociwgYSwgcyk7XG4gICAgICAgICAgICBnKGksIGEsIHMudmFsdWUpO1xuICAgICAgICAgICAgZSA9IHRoaXMudW50aWwoW1wiLFwiLCBcIn1cIl0sIHMuZW5kKTtcbiAgICAgICAgICAgIHZhciBvID0gdyh0LCBlKTtcbiAgICAgICAgICAgIGlmIChcIixcIiA9PSBvKSB7XG4gICAgICAgICAgICAgIG4gPSAhMDtcbiAgICAgICAgICAgICAgZSsrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcIn1cIiA9PSBvKSB7XG4gICAgICAgICAgICAgIGUrKztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUoMSwgaSwgdGhpcy5pbmRleCwgZSwgcik7XG4gICAgICAgIH0sXG4gICAgICAgIGFycmF5OiBmdW5jdGlvbiBhcnJheSgpIHtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy5zb3VyY2UsIGUgPSB0aGlzLmluZGV4ICsgMSwgbiA9ICExLCBpID0gW10sIHIgPSBbXTsgZSA8IHQubGVuZ3RoOykge1xuICAgICAgICAgICAgZSA9IHRoaXMuc2tpcChJLCBlKTtcbiAgICAgICAgICAgIGlmIChcIl1cIiA9PSB3KHQsIGUpICYmICFuKSB7XG4gICAgICAgICAgICAgIGUrKztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcyA9IHRoaXMuZm9yayhlKS5wYXJzZSgpO1xuICAgICAgICAgICAgUChyLCBzKTtcbiAgICAgICAgICAgIFAoaSwgcy52YWx1ZSk7XG4gICAgICAgICAgICBlID0gdGhpcy51bnRpbChbXCIsXCIsIFwiXVwiXSwgcy5lbmQpO1xuICAgICAgICAgICAgaWYgKFwiLFwiID09IHcodCwgZSkpIHtcbiAgICAgICAgICAgICAgbiA9ICEwO1xuICAgICAgICAgICAgICBlKys7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwiXVwiID09IHcodCwgZSkpIHtcbiAgICAgICAgICAgICAgZSsrO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZSgxLCBpLCB0aGlzLmluZGV4LCBlLCByKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RyaW5nOiBmdW5jdGlvbiBzdHJpbmcoKSB7XG4gICAgICAgICAgdmFyIHQgPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgZSA9IGIodGhpcy5zb3VyY2UsIHRoaXMuaW5kZXggKyAxKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlKDAsIGUudmFsdWUsIHQsIGUuZW5kKTtcbiAgICAgICAgfSxcbiAgICAgICAgbnVtYmVyOiBmdW5jdGlvbiBudW1iZXIoKSB7XG4gICAgICAgICAgdmFyIHQgPSB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgbiA9IGU7XG4gICAgICAgICAgXCItXCIgPT0gdyh0LCBuKSAmJiBuKys7XG4gICAgICAgICAgaWYgKFwiMFwiID09IHcodCwgbikpIG4rKztlbHNlIHtcbiAgICAgICAgICAgIGlmICghVChNLCB3KHQsIG4pKSkgdGhyb3cgXyhcIkZhaWxlZCB0byBwYXJzZSBudW1iZXIgYXQ6IFwiICsgbik7XG4gICAgICAgICAgICBuID0gdGhpcy5za2lwKGssICsrbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIFwiLlwiID09IHcodCwgbikgJiYgKG4gPSB0aGlzLnNraXAoaywgKytuKSk7XG4gICAgICAgICAgaWYgKFwiZVwiID09IHcodCwgbikgfHwgXCJFXCIgPT0gdyh0LCBuKSkge1xuICAgICAgICAgICAgbisrO1xuICAgICAgICAgICAgXCIrXCIgIT0gdyh0LCBuKSAmJiBcIi1cIiAhPSB3KHQsIG4pIHx8IG4rKztcbiAgICAgICAgICAgIGlmIChuID09IChuID0gdGhpcy5za2lwKGssIG4pKSkgdGhyb3cgXyhcIkZhaWxlZCB0byBwYXJzZSBudW1iZXIncyBleHBvbmVudCB2YWx1ZSBhdDogXCIgKyBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZSgwLCBBKEModCwgZSwgbikpLCBlLCBuKTtcbiAgICAgICAgfSxcbiAgICAgICAga2V5d29yZDogZnVuY3Rpb24ga2V5d29yZCh0KSB7XG4gICAgICAgICAgdmFyIGUgPSBcIlwiICsgdCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmluZGV4LFxuICAgICAgICAgICAgaSA9IG4gKyBlLmxlbmd0aDtcbiAgICAgICAgICBpZiAoQyh0aGlzLnNvdXJjZSwgbiwgaSkgIT0gZSkgdGhyb3cgXyhcIkZhaWxlZCB0byBwYXJzZSB2YWx1ZSBhdDogXCIgKyBuKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlKDAsIHQsIG4sIGkpO1xuICAgICAgICB9LFxuICAgICAgICBza2lwOiBmdW5jdGlvbiBza2lwKHQsIGUpIHtcbiAgICAgICAgICBmb3IgKHZhciBuID0gdGhpcy5zb3VyY2U7IGUgPCBuLmxlbmd0aCAmJiBUKHQsIHcobiwgZSkpOyBlKyspO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9LFxuICAgICAgICB1bnRpbDogZnVuY3Rpb24gdW50aWwodCwgZSkge1xuICAgICAgICAgIGUgPSB0aGlzLnNraXAoSSwgZSk7XG4gICAgICAgICAgZm9yICh2YXIgbiA9IHcodGhpcy5zb3VyY2UsIGUpLCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIGlmICh0W2ldID09IG4pIHJldHVybiBlO1xuICAgICAgICAgIHRocm93IF8oJ1VuZXhwZWN0ZWQgY2hhcmFjdGVyOiBcIicgKyBuICsgJ1wiIGF0OiAnICsgZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgRCA9IG0oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciB0LFxuICAgICAgICAgICAgZSA9IFwiOTAwNzE5OTI1NDc0MDk5M1wiO1xuICAgICAgICAgIFMoZSwgZnVuY3Rpb24gKGUsIG4sIGkpIHtcbiAgICAgICAgICAgIHQgPSBpLnNvdXJjZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdCAhPT0gZTtcbiAgICAgICAgfSksXG4gICAgICAgIE8gPSB2ICYmICFtKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gMSAvIFMoXCItMCBcXHRcIikgIT0gLTEgLyAwO1xuICAgICAgICB9KTtcbiAgICAgIGkoe1xuICAgICAgICB0YXJnZXQ6IFwiSlNPTlwiLFxuICAgICAgICBzdGF0OiAhMCxcbiAgICAgICAgZm9yY2VkOiBEXG4gICAgICB9LCB7XG4gICAgICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIE8gJiYgIWMoZSkgPyBTKHQpIDogZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgICAgIHQgPSBwKHQpO1xuICAgICAgICAgICAgdmFyIG4gPSBuZXcgQ29udGV4dCh0LCAwLCBcIlwiKSxcbiAgICAgICAgICAgICAgaSA9IG4ucGFyc2UoKSxcbiAgICAgICAgICAgICAgciA9IGkudmFsdWUsXG4gICAgICAgICAgICAgIHMgPSBuLnNraXAoSSwgaS5lbmQpO1xuICAgICAgICAgICAgaWYgKHMgPCB0Lmxlbmd0aCkgdGhyb3cgXygnVW5leHBlY3RlZCBleHRyYSBjaGFyYWN0ZXI6IFwiJyArIHcodCwgcykgKyAnXCIgYWZ0ZXIgdGhlIHBhcnNlZCBkYXRhIGF0OiAnICsgcyk7XG4gICAgICAgICAgICByZXR1cm4gYyhlKSA/IGludGVybmFsaXplKHtcbiAgICAgICAgICAgICAgXCJcIjogclxuICAgICAgICAgICAgfSwgXCJcIiwgZSwgaSkgOiByO1xuICAgICAgICAgIH0odCwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oMTQpLFxuICAgICAgICByID0gbigzOSksXG4gICAgICAgIHMgPSBTeW50YXhFcnJvcixcbiAgICAgICAgYSA9IHBhcnNlSW50LFxuICAgICAgICBvID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcbiAgICAgICAgbCA9IGkoXCJcIi5jaGFyQXQpLFxuICAgICAgICBjID0gaShcIlwiLnNsaWNlKSxcbiAgICAgICAgaCA9IGkoLy4vLmV4ZWMpLFxuICAgICAgICBkID0ge1xuICAgICAgICAgICdcXFxcXCInOiAnXCInLFxuICAgICAgICAgIFwiXFxcXFxcXFxcIjogXCJcXFxcXCIsXG4gICAgICAgICAgXCJcXFxcL1wiOiBcIi9cIixcbiAgICAgICAgICBcIlxcXFxiXCI6IFwiXFxiXCIsXG4gICAgICAgICAgXCJcXFxcZlwiOiBcIlxcZlwiLFxuICAgICAgICAgIFwiXFxcXG5cIjogXCJcXG5cIixcbiAgICAgICAgICBcIlxcXFxyXCI6IFwiXFxyXCIsXG4gICAgICAgICAgXCJcXFxcdFwiOiBcIlxcdFwiXG4gICAgICAgIH0sXG4gICAgICAgIHUgPSAvXltcXGRhLWZdezR9JC9pLFxuICAgICAgICBwID0gL15bXFx1MDAwMC1cXHUwMDFGXSQvO1xuICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGUpIHtcbiAgICAgICAgZm9yICh2YXIgbiA9ICEwLCBpID0gXCJcIjsgZSA8IHQubGVuZ3RoOykge1xuICAgICAgICAgIHZhciBmID0gbCh0LCBlKTtcbiAgICAgICAgICBpZiAoXCJcXFxcXCIgPT0gZikge1xuICAgICAgICAgICAgdmFyIGcgPSBjKHQsIGUsIGUgKyAyKTtcbiAgICAgICAgICAgIGlmIChyKGQsIGcpKSB7XG4gICAgICAgICAgICAgIGkgKz0gZFtnXTtcbiAgICAgICAgICAgICAgZSArPSAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKFwiXFxcXHVcIiAhPSBnKSB0aHJvdyBzKCdVbmtub3duIGVzY2FwZSBzZXF1ZW5jZTogXCInICsgZyArICdcIicpO1xuICAgICAgICAgICAgICB2YXIgbSA9IGModCwgZSArPSAyLCBlICsgNCk7XG4gICAgICAgICAgICAgIGlmICghaCh1LCBtKSkgdGhyb3cgcyhcIkJhZCBVbmljb2RlIGVzY2FwZSBhdDogXCIgKyBlKTtcbiAgICAgICAgICAgICAgaSArPSBvKGEobSwgMTYpKTtcbiAgICAgICAgICAgICAgZSArPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoJ1wiJyA9PSBmKSB7XG4gICAgICAgICAgICAgIG4gPSAhMTtcbiAgICAgICAgICAgICAgZSsrO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoKHAsIGYpKSB0aHJvdyBzKFwiQmFkIGNvbnRyb2wgY2hhcmFjdGVyIGluIHN0cmluZyBsaXRlcmFsIGF0OiBcIiArIGUpO1xuICAgICAgICAgICAgaSArPSBmO1xuICAgICAgICAgICAgZSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobikgdGhyb3cgcyhcIlVudGVybWluYXRlZCBzdHJpbmcgYXQ6IFwiICsgZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFsdWU6IGksXG4gICAgICAgICAgZW5kOiBlXG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9jbGFzczE5O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLlN0YXRUaW1lciA9IGUuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gZS5QaXhlbHNQZXJJbmNoID0gZS5QYWdlVmlld3BvcnQgPSBlLlBERkRhdGVTdHJpbmcgPSBlLkRPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZS5ET01TVkdGYWN0b3J5ID0gZS5ET01GaWx0ZXJGYWN0b3J5ID0gZS5ET01DYW52YXNGYWN0b3J5ID0gZS5ET01DTWFwUmVhZGVyRmFjdG9yeSA9IGUuQW5ub3RhdGlvblByZWZpeCA9IHZvaWQgMDtcbiAgICAgIGUuZGVwcmVjYXRlZCA9IGZ1bmN0aW9uIGRlcHJlY2F0ZWQodCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkRlcHJlY2F0ZWQgQVBJIHVzYWdlOiBcIiArIHQpO1xuICAgICAgfTtcbiAgICAgIGUuZ2V0Q29sb3JWYWx1ZXMgPSBmdW5jdGlvbiBnZXRDb2xvclZhbHVlcyh0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoZSk7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiB0LmtleXMoKSkge1xuICAgICAgICAgIGUuc3R5bGUuY29sb3IgPSBuO1xuICAgICAgICAgIGNvbnN0IGkgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5jb2xvcjtcbiAgICAgICAgICB0LnNldChuLCBnZXRSR0IoaSkpO1xuICAgICAgICB9XG4gICAgICAgIGUucmVtb3ZlKCk7XG4gICAgICB9O1xuICAgICAgZS5nZXRDdXJyZW50VHJhbnNmb3JtID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybSh0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBhOiBlLFxuICAgICAgICAgIGI6IG4sXG4gICAgICAgICAgYzogaSxcbiAgICAgICAgICBkOiByLFxuICAgICAgICAgIGU6IHMsXG4gICAgICAgICAgZjogYVxuICAgICAgICB9ID0gdC5nZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgcmV0dXJuIFtlLCBuLCBpLCByLCBzLCBhXTtcbiAgICAgIH07XG4gICAgICBlLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UodCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgYTogZSxcbiAgICAgICAgICBiOiBuLFxuICAgICAgICAgIGM6IGksXG4gICAgICAgICAgZDogcixcbiAgICAgICAgICBlOiBzLFxuICAgICAgICAgIGY6IGFcbiAgICAgICAgfSA9IHQuZ2V0VHJhbnNmb3JtKCkuaW52ZXJ0U2VsZigpO1xuICAgICAgICByZXR1cm4gW2UsIG4sIGksIHIsIHMsIGFdO1xuICAgICAgfTtcbiAgICAgIGUuZ2V0RmlsZW5hbWVGcm9tVXJsID0gZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tVXJsKHQpIHtcbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdIHx8IChbdF0gPSB0LnNwbGl0KC9bIz9dLywgMSkpO1xuICAgICAgICByZXR1cm4gdC5zdWJzdHJpbmcodC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbiAgICAgIH07XG4gICAgICBlLmdldFBkZkZpbGVuYW1lRnJvbVVybCA9IGZ1bmN0aW9uIGdldFBkZkZpbGVuYW1lRnJvbVVybCh0KSB7XG4gICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBcImRvY3VtZW50LnBkZlwiO1xuICAgICAgICBpZiAoXCJzdHJpbmdcIiAhPSB0eXBlb2YgdCkgcmV0dXJuIGU7XG4gICAgICAgIGlmIChpc0RhdGFTY2hlbWUodCkpIHtcbiAgICAgICAgICAoMCwgci53YXJuKSgnZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiBpZ25vcmUgXCJkYXRhOlwiLVVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nKTtcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuID0gL1teLz8jPV0rXFwucGRmXFxiKD8hLipcXC5wZGZcXGIpL2ksXG4gICAgICAgICAgaSA9IC9eKD86KD86W146XSs6KT9cXC9cXC9bXi9dKyk/KFtePyNdKikoXFw/W14jXSopPygjLiopPyQvLmV4ZWModCk7XG4gICAgICAgIGxldCBzID0gbi5leGVjKGlbMV0pIHx8IG4uZXhlYyhpWzJdKSB8fCBuLmV4ZWMoaVszXSk7XG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgcyA9IHNbMF07XG4gICAgICAgICAgaWYgKHMuaW5jbHVkZXMoXCIlXCIpKSB0cnkge1xuICAgICAgICAgICAgcyA9IG4uZXhlYyhkZWNvZGVVUklDb21wb25lbnQocykpWzBdO1xuICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQ5KSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzIHx8IGU7XG4gICAgICB9O1xuICAgICAgZS5nZXRSR0IgPSBnZXRSR0I7XG4gICAgICBlLmdldFhmYVBhZ2VWaWV3cG9ydCA9IGZ1bmN0aW9uIGdldFhmYVBhZ2VWaWV3cG9ydCh0LCBlKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgc2NhbGU6IG4gPSAxLFxuICAgICAgICAgIHJvdGF0aW9uOiBpID0gMFxuICAgICAgICB9ID0gZTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgd2lkdGg6IHIsXG4gICAgICAgICAgICBoZWlnaHQ6IHNcbiAgICAgICAgICB9ID0gdC5hdHRyaWJ1dGVzLnN0eWxlLFxuICAgICAgICAgIGEgPSBbMCwgMCwgcGFyc2VJbnQociksIHBhcnNlSW50KHMpXTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe1xuICAgICAgICAgIHZpZXdCb3g6IGEsXG4gICAgICAgICAgc2NhbGU6IG4sXG4gICAgICAgICAgcm90YXRpb246IGlcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgZS5pc0RhdGFTY2hlbWUgPSBpc0RhdGFTY2hlbWU7XG4gICAgICBlLmlzUGRmRmlsZSA9IGZ1bmN0aW9uIGlzUGRmRmlsZSh0KSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiID09IHR5cGVvZiB0ICYmIC9cXC5wZGYkL2kudGVzdCh0KTtcbiAgICAgIH07XG4gICAgICBlLmlzVmFsaWRGZXRjaFVybCA9IGlzVmFsaWRGZXRjaFVybDtcbiAgICAgIGUubG9hZFNjcmlwdCA9IGZ1bmN0aW9uIGxvYWRTY3JpcHQodCkge1xuICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChuLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgci5zcmMgPSB0O1xuICAgICAgICAgIHIub25sb2FkID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGUgJiYgci5yZW1vdmUoKTtcbiAgICAgICAgICAgIG4odCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpKG5ldyBFcnJvcihcIkNhbm5vdCBsb2FkIHNjcmlwdCBhdDogXCIuY29uY2F0KHIuc3JjKSkpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmQocik7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIGUuc2V0TGF5ZXJEaW1lbnNpb25zID0gZnVuY3Rpb24gc2V0TGF5ZXJEaW1lbnNpb25zKHQsIGUpIHtcbiAgICAgICAgbGV0IG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl0sXG4gICAgICAgICAgaSA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10pIHx8IGFyZ3VtZW50c1szXTtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBQYWdlVmlld3BvcnQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHBhZ2VXaWR0aDogaSxcbiAgICAgICAgICAgICAgcGFnZUhlaWdodDogclxuICAgICAgICAgICAgfSA9IGUucmF3RGltcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHNcbiAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgYSA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpICogXCIuY29uY2F0KGksIFwicHgpXCIpLFxuICAgICAgICAgICAgbyA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpICogXCIuY29uY2F0KHIsIFwicHgpXCIpO1xuICAgICAgICAgIGlmIChuICYmIGUucm90YXRpb24gJSAxODAgIT0gMCkge1xuICAgICAgICAgICAgcy53aWR0aCA9IG87XG4gICAgICAgICAgICBzLmhlaWdodCA9IGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMud2lkdGggPSBhO1xuICAgICAgICAgICAgcy5oZWlnaHQgPSBvO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpICYmIHQuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsIGUucm90YXRpb24pO1xuICAgICAgfTtcbiAgICAgIG4oMik7XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIG4oODkpO1xuICAgICAgbig4NCk7XG4gICAgICBuKDg2KTtcbiAgICAgIG4oODcpO1xuICAgICAgdmFyIGkgPSBuKDE2OCksXG4gICAgICAgIHIgPSBuKDEpO1xuICAgICAgY29uc3QgcyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIjtcbiAgICAgIGUuQW5ub3RhdGlvblByZWZpeCA9IFwicGRmanNfaW50ZXJuYWxfaWRfXCI7XG4gICAgICBjbGFzcyBQaXhlbHNQZXJJbmNoIHt9XG4gICAgICBfY2xhc3MxOSA9IFBpeGVsc1BlckluY2g7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoUGl4ZWxzUGVySW5jaCwgXCJDU1NcIiwgOTYpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KFBpeGVsc1BlckluY2gsIFwiUERGXCIsIDcyKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShQaXhlbHNQZXJJbmNoLCBcIlBERl9UT19DU1NfVU5JVFNcIiwgX2NsYXNzMTkuQ1NTIC8gX2NsYXNzMTkuUERGKTtcbiAgICAgIGUuUGl4ZWxzUGVySW5jaCA9IFBpeGVsc1BlckluY2g7XG4gICAgICB2YXIgX2t0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX010ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2U3ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1J0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0Z0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0l0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0R0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX090ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0x0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX050ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX08zID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX04yID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0J0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0h0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3F0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1V0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBET01GaWx0ZXJGYWN0b3J5IGV4dGVuZHMgaS5CYXNlRmlsdGVyRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBkb2NJZDogX3Q5LFxuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogX2U4ID0gZ2xvYmFsVGhpcy5kb2N1bWVudFxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF96dCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9VdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9xdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9qdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9IdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0J0LCB7XG4gICAgICAgICAgICBnZXQ6IF9nZXRfQnQsXG4gICAgICAgICAgICBzZXQ6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9OMiwge1xuICAgICAgICAgICAgZ2V0OiBfZ2V0X04sXG4gICAgICAgICAgICBzZXQ6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9rdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX010LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZTcsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9SdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0Z0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfSXQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9EdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX090LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTHQsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9OdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX08zLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9lNywgX3Q5KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1J0LCBfZTgpO1xuICAgICAgICB9XG4gICAgICAgIGFkZEZpbHRlcih0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJE81LCBfdGhpcyRPNjtcbiAgICAgICAgICBpZiAoIXQpIHJldHVybiBcIm5vbmVcIjtcbiAgICAgICAgICBsZXQgZSxcbiAgICAgICAgICAgIG4sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcixcbiAgICAgICAgICAgIHMgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX04yKS5nZXQodCk7XG4gICAgICAgICAgaWYgKHMpIHJldHVybiBzO1xuICAgICAgICAgIGlmICgxID09PSB0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHRbMF0sXG4gICAgICAgICAgICAgIGEgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgMjU2OyB0KyspIGFbdF0gPSBzW3RdIC8gMjU1O1xuICAgICAgICAgICAgciA9IGUgPSBuID0gaSA9IGEuam9pbihcIixcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IFtzLCBhLCBvXSA9IHQsXG4gICAgICAgICAgICAgIGwgPSBuZXcgQXJyYXkoMjU2KSxcbiAgICAgICAgICAgICAgYyA9IG5ldyBBcnJheSgyNTYpLFxuICAgICAgICAgICAgICBoID0gbmV3IEFycmF5KDI1Nik7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IDI1NjsgdCsrKSB7XG4gICAgICAgICAgICAgIGxbdF0gPSBzW3RdIC8gMjU1O1xuICAgICAgICAgICAgICBjW3RdID0gYVt0XSAvIDI1NTtcbiAgICAgICAgICAgICAgaFt0XSA9IG9bdF0gLyAyNTU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlID0gbC5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgIG4gPSBjLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgaSA9IGguam9pbihcIixcIik7XG4gICAgICAgICAgICByID0gXCJcIi5jb25jYXQoZSkuY29uY2F0KG4pLmNvbmNhdChpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTjIpLmdldChyKTtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OMikuc2V0KHQsIHMpO1xuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGEgPSBcImdfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZTcpLCBcIl90cmFuc2Zlcl9tYXBfXCIpLmNvbmNhdCgoX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9PMywgKF90aGlzJE81ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9PMyksIF90aGlzJE82ID0gX3RoaXMkTzUrKywgX3RoaXMkTzUpKSwgX3RoaXMkTzYpKSxcbiAgICAgICAgICAgIG8gPSBcInVybCgjXCIuY29uY2F0KGEsIFwiKVwiKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX04yKS5zZXQodCwgbyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OMikuc2V0KHIsIG8pO1xuICAgICAgICAgIGNvbnN0IGwgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qdCwgX2p0MikuY2FsbCh0aGlzLCBhKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9VdCwgX1V0MikuY2FsbCh0aGlzLCBlLCBuLCBpLCBsKTtcbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgfVxuICAgICAgICBhZGRIQ01GaWx0ZXIodCwgZSkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQ2O1xuICAgICAgICAgIGNvbnN0IG4gPSBcIlwiLmNvbmNhdCh0LCBcIi1cIikuY29uY2F0KGUpO1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0l0KSA9PT0gbikgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfSXQsIG4pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfRHQsIFwibm9uZVwiKTtcbiAgICAgICAgICAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRnQpKSA9PT0gbnVsbCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQ2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2xhc3NQcml2YXRlRmllbGRHZXQ2LnJlbW92ZSgpO1xuICAgICAgICAgIGlmICghdCB8fCAhZSkgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRHQpO1xuICAgICAgICAgIGNvbnN0IGkgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96dCwgX3p0MikuY2FsbCh0aGlzLCB0KTtcbiAgICAgICAgICB0ID0gci5VdGlsLm1ha2VIZXhDb2xvciguLi5pKTtcbiAgICAgICAgICBjb25zdCBzID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfenQsIF96dDIpLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgZSA9IHIuVXRpbC5tYWtlSGV4Q29sb3IoLi4ucyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9CdCkuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgICAgICAgIGlmIChcIiMwMDAwMDBcIiA9PT0gdCAmJiBcIiNmZmZmZmZcIiA9PT0gZSB8fCB0ID09PSBlKSByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9EdCk7XG4gICAgICAgICAgY29uc3QgYSA9IG5ldyBBcnJheSgyNTYpO1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IDI1NTsgdCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdCAvIDI1NTtcbiAgICAgICAgICAgIGFbdF0gPSBlIDw9IC4wMzkyOCA/IGUgLyAxMi45MiA6ICgoZSArIC4wNTUpIC8gMS4wNTUpICoqIDIuNDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbyA9IGEuam9pbihcIixcIiksXG4gICAgICAgICAgICBsID0gXCJnX1wiLmNvbmNhdChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2U3KSwgXCJfaGNtX2ZpbHRlclwiKSxcbiAgICAgICAgICAgIGMgPSBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX090LCBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qdCwgX2p0MikuY2FsbCh0aGlzLCBsKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVXQsIF9VdDIpLmNhbGwodGhpcywgbywgbywgbywgYyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSHQsIF9IdDIpLmNhbGwodGhpcywgYyk7XG4gICAgICAgICAgY29uc3QgZ2V0U3RlcHMgPSAodCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IGlbdF0gLyAyNTUsXG4gICAgICAgICAgICAgIHIgPSBzW3RdIC8gMjU1LFxuICAgICAgICAgICAgICBhID0gbmV3IEFycmF5KGUgKyAxKTtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IGU7IHQrKykgYVt0XSA9IG4gKyB0IC8gZSAqIChyIC0gbik7XG4gICAgICAgICAgICByZXR1cm4gYS5qb2luKFwiLFwiKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1V0LCBfVXQyKS5jYWxsKHRoaXMsIGdldFN0ZXBzKDAsIDUpLCBnZXRTdGVwcygxLCA1KSwgZ2V0U3RlcHMoMiwgNSksIGMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfRHQsIFwidXJsKCNcIi5jb25jYXQobCwgXCIpXCIpKTtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9EdCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0SENNRmlsdGVyKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0NztcbiAgICAgICAgICBjb25zdCByID0gXCJcIi5jb25jYXQodCwgXCItXCIpLmNvbmNhdChlLCBcIi1cIikuY29uY2F0KG4sIFwiLVwiKS5jb25jYXQoaSk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTHQpID09PSByKSByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9MdCwgcik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9OdCwgXCJub25lXCIpO1xuICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQ3ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9PdCkpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDcucmVtb3ZlKCk7XG4gICAgICAgICAgaWYgKCF0IHx8ICFlKSByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9OdCk7XG4gICAgICAgICAgY29uc3QgW3MsIGFdID0gW3QsIGVdLm1hcChfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96dCwgX3p0MikuYmluZCh0aGlzKSk7XG4gICAgICAgICAgbGV0IG8gPSBNYXRoLnJvdW5kKC4yMTI2ICogc1swXSArIC43MTUyICogc1sxXSArIC4wNzIyICogc1syXSksXG4gICAgICAgICAgICBsID0gTWF0aC5yb3VuZCguMjEyNiAqIGFbMF0gKyAuNzE1MiAqIGFbMV0gKyAuMDcyMiAqIGFbMl0pLFxuICAgICAgICAgICAgW2MsIGhdID0gW24sIGldLm1hcChfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96dCwgX3p0MikuYmluZCh0aGlzKSk7XG4gICAgICAgICAgbCA8IG8gJiYgKFtvLCBsLCBjLCBoXSA9IFtsLCBvLCBoLCBjXSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9CdCkuc3R5bGUuY29sb3IgPSBcIlwiO1xuICAgICAgICAgIGNvbnN0IGdldFN0ZXBzID0gKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBBcnJheSgyNTYpLFxuICAgICAgICAgICAgICAgIHIgPSAobCAtIG8pIC8gbixcbiAgICAgICAgICAgICAgICBzID0gdCAvIDI1NSxcbiAgICAgICAgICAgICAgICBhID0gKGUgLSB0KSAvICgyNTUgKiBuKTtcbiAgICAgICAgICAgICAgbGV0IGMgPSAwO1xuICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8PSBuOyB0KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gTWF0aC5yb3VuZChvICsgdCAqIHIpLFxuICAgICAgICAgICAgICAgICAgbiA9IHMgKyB0ICogYTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gYzsgdCA8PSBlOyB0KyspIGlbdF0gPSBuO1xuICAgICAgICAgICAgICAgIGMgPSBlICsgMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gYzsgdCA8IDI1NjsgdCsrKSBpW3RdID0gaVtjIC0gMV07XG4gICAgICAgICAgICAgIHJldHVybiBpLmpvaW4oXCIsXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGQgPSBcImdfXCIuY29uY2F0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZTcpLCBcIl9oY21faGlnaGxpZ2h0X2ZpbHRlclwiKSxcbiAgICAgICAgICAgIHUgPSBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX090LCBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qdCwgX2p0MikuY2FsbCh0aGlzLCBkKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSHQsIF9IdDIpLmNhbGwodGhpcywgdSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVXQsIF9VdDIpLmNhbGwodGhpcywgZ2V0U3RlcHMoY1swXSwgaFswXSwgNSksIGdldFN0ZXBzKGNbMV0sIGhbMV0sIDUpLCBnZXRTdGVwcyhjWzJdLCBoWzJdLCA1KSwgdSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9OdCwgXCJ1cmwoI1wiLmNvbmNhdChkLCBcIilcIikpO1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX050KTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIGlmICghKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXSkgfHwgIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRHQpICYmICFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX050KSkge1xuICAgICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpKSB7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9NdCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9rdCkpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9rdCkuY2xlYXIoKTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9rdCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX08zLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9nZXRfTigpIHtcbiAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfa3QpIHx8IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfa3QsIG5ldyBNYXAoKSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfZ2V0X0J0KCkge1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpKSB7XG4gICAgICAgICAgY29uc3QgdCA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUnQpLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0eWxlOiBlXG4gICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgICAgICAgIGUuY29udGFpbiA9IFwic3RyaWN0XCI7XG4gICAgICAgICAgZS53aWR0aCA9IGUuaGVpZ2h0ID0gMDtcbiAgICAgICAgICBlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICAgIGUudG9wID0gZS5sZWZ0ID0gMDtcbiAgICAgICAgICBlLnpJbmRleCA9IC0xO1xuICAgICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJzdmdcIik7XG4gICAgICAgICAgbi5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCAwKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCAwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX010LCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJkZWZzXCIpKTtcbiAgICAgICAgICB0LmFwcGVuZChuKTtcbiAgICAgICAgICBuLmFwcGVuZChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX010KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SdCkuYm9keS5hcHBlbmQodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTXQpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0h0Mih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJmZUNvbG9yTWF0cml4XCIpO1xuICAgICAgICBlLnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJtYXRyaXhcIik7XG4gICAgICAgIGUuc2V0QXR0cmlidXRlKFwidmFsdWVzXCIsIFwiMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMCAwIDAgMSAwXCIpO1xuICAgICAgICB0LmFwcGVuZChlKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9qdDIodCkge1xuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9SdCkuY3JlYXRlRWxlbWVudE5TKHMsIFwiZmlsdGVyXCIpO1xuICAgICAgICBlLnNldEF0dHJpYnV0ZShcImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVyc1wiLCBcInNSR0JcIik7XG4gICAgICAgIGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgdCk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQnQpLmFwcGVuZChlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfcXQyKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgaSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfUnQpLmNyZWF0ZUVsZW1lbnROUyhzLCBlKTtcbiAgICAgICAgaS5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZGlzY3JldGVcIik7XG4gICAgICAgIGkuc2V0QXR0cmlidXRlKFwidGFibGVWYWx1ZXNcIiwgbik7XG4gICAgICAgIHQuYXBwZW5kKGkpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX1V0Mih0LCBlLCBuLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1J0KS5jcmVhdGVFbGVtZW50TlMocywgXCJmZUNvbXBvbmVudFRyYW5zZmVyXCIpO1xuICAgICAgICBpLmFwcGVuZChyKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcXQsIF9xdDIpLmNhbGwodGhpcywgciwgXCJmZUZ1bmNSXCIsIHQpO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9xdCwgX3F0MikuY2FsbCh0aGlzLCByLCBcImZlRnVuY0dcIiwgZSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3F0LCBfcXQyKS5jYWxsKHRoaXMsIHIsIFwiZmVGdW5jQlwiLCBuKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF96dDIodCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0J0KS5zdHlsZS5jb2xvciA9IHQ7XG4gICAgICAgIHJldHVybiBnZXRSR0IoZ2V0Q29tcHV0ZWRTdHlsZShfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0J0KSkuZ2V0UHJvcGVydHlWYWx1ZShcImNvbG9yXCIpKTtcbiAgICAgIH1cbiAgICAgIGUuRE9NRmlsdGVyRmFjdG9yeSA9IERPTUZpbHRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBET01DYW52YXNGYWN0b3J5IGV4dGVuZHMgaS5CYXNlQ2FudmFzRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50OiB0ID0gZ2xvYmFsVGhpcy5kb2N1bWVudFxuICAgICAgICAgIH0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSB0O1xuICAgICAgICB9XG4gICAgICAgIF9jcmVhdGVDYW52YXModCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICAgIG4ud2lkdGggPSB0O1xuICAgICAgICAgIG4uaGVpZ2h0ID0gZTtcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5ET01DYW52YXNGYWN0b3J5ID0gRE9NQ2FudmFzRmFjdG9yeTtcbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSh0KSB7XG4gICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdO1xuICAgICAgICBpZiAoaXNWYWxpZEZldGNoVXJsKHQsIGRvY3VtZW50LmJhc2VVUkkpKSB7XG4gICAgICAgICAgY29uc3QgbiA9IGF3YWl0IGZldGNoKHQpO1xuICAgICAgICAgIGlmICghbi5vaykgdGhyb3cgbmV3IEVycm9yKG4uc3RhdHVzVGV4dCk7XG4gICAgICAgICAgcmV0dXJuIGUgPyBuZXcgVWludDhBcnJheShhd2FpdCBuLmFycmF5QnVmZmVyKCkpIDogKDAsIHIuc3RyaW5nVG9CeXRlcykoYXdhaXQgbi50ZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgobiwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICBzLm9wZW4oXCJHRVRcIiwgdCwgITApO1xuICAgICAgICAgIGUgJiYgKHMucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiKTtcbiAgICAgICAgICBzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgICAgICAgaWYgKDIwMCA9PT0gcy5zdGF0dXMgfHwgMCA9PT0gcy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgICBlICYmIHMucmVzcG9uc2UgPyB0ID0gbmV3IFVpbnQ4QXJyYXkocy5yZXNwb25zZSkgOiAhZSAmJiBzLnJlc3BvbnNlVGV4dCAmJiAodCA9ICgwLCByLnN0cmluZ1RvQnl0ZXMpKHMucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgICAgIG4odCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGkobmV3IEVycm9yKHMuc3RhdHVzVGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgcy5zZW5kKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNsYXNzIERPTUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgaS5CYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICAgICAgICBfZmV0Y2hEYXRhKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gZmV0Y2hEYXRhKHQsIHRoaXMuaXNDb21wcmVzc2VkKS50aGVuKHQgPT4gKHtcbiAgICAgICAgICAgIGNNYXBEYXRhOiB0LFxuICAgICAgICAgICAgY29tcHJlc3Npb25UeXBlOiBlXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkRPTUNNYXBSZWFkZXJGYWN0b3J5ID0gRE9NQ01hcFJlYWRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBleHRlbmRzIGkuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IHtcbiAgICAgICAgX2ZldGNoRGF0YSh0KSB7XG4gICAgICAgICAgcmV0dXJuIGZldGNoRGF0YSh0LCAhMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuRE9NU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcbiAgICAgIGNsYXNzIERPTVNWR0ZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VTVkdGYWN0b3J5IHtcbiAgICAgICAgX2NyZWF0ZVNWRyh0KSB7XG4gICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzLCB0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5ET01TVkdGYWN0b3J5ID0gRE9NU1ZHRmFjdG9yeTtcbiAgICAgIGNsYXNzIFBhZ2VWaWV3cG9ydCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmlld0JveDogZSxcbiAgICAgICAgICAgIHNjYWxlOiBuLFxuICAgICAgICAgICAgcm90YXRpb246IGksXG4gICAgICAgICAgICBvZmZzZXRYOiByID0gMCxcbiAgICAgICAgICAgIG9mZnNldFk6IHMgPSAwLFxuICAgICAgICAgICAgZG9udEZsaXA6IGEgPSAhMVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIHRoaXMudmlld0JveCA9IGU7XG4gICAgICAgICAgdGhpcy5zY2FsZSA9IG47XG4gICAgICAgICAgdGhpcy5yb3RhdGlvbiA9IGk7XG4gICAgICAgICAgdGhpcy5vZmZzZXRYID0gcjtcbiAgICAgICAgICB0aGlzLm9mZnNldFkgPSBzO1xuICAgICAgICAgIGNvbnN0IG8gPSAoZVsyXSArIGVbMF0pIC8gMixcbiAgICAgICAgICAgIGwgPSAoZVszXSArIGVbMV0pIC8gMjtcbiAgICAgICAgICBsZXQgYywgaCwgZCwgdSwgcCwgZiwgZywgbTtcbiAgICAgICAgICBpICU9IDM2MDtcbiAgICAgICAgICBpIDwgMCAmJiAoaSArPSAzNjApO1xuICAgICAgICAgIHN3aXRjaCAoaSkge1xuICAgICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICAgIGMgPSAtMTtcbiAgICAgICAgICAgICAgaCA9IDA7XG4gICAgICAgICAgICAgIGQgPSAwO1xuICAgICAgICAgICAgICB1ID0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgICAgaCA9IDE7XG4gICAgICAgICAgICAgIGQgPSAxO1xuICAgICAgICAgICAgICB1ID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgICAgIGggPSAtMTtcbiAgICAgICAgICAgICAgZCA9IC0xO1xuICAgICAgICAgICAgICB1ID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIGMgPSAxO1xuICAgICAgICAgICAgICBoID0gMDtcbiAgICAgICAgICAgICAgZCA9IDA7XG4gICAgICAgICAgICAgIHUgPSAtMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGEpIHtcbiAgICAgICAgICAgIGQgPSAtZDtcbiAgICAgICAgICAgIHUgPSAtdTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDAgPT09IGMpIHtcbiAgICAgICAgICAgIHAgPSBNYXRoLmFicyhsIC0gZVsxXSkgKiBuICsgcjtcbiAgICAgICAgICAgIGYgPSBNYXRoLmFicyhvIC0gZVswXSkgKiBuICsgcztcbiAgICAgICAgICAgIGcgPSAoZVszXSAtIGVbMV0pICogbjtcbiAgICAgICAgICAgIG0gPSAoZVsyXSAtIGVbMF0pICogbjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IE1hdGguYWJzKG8gLSBlWzBdKSAqIG4gKyByO1xuICAgICAgICAgICAgZiA9IE1hdGguYWJzKGwgLSBlWzFdKSAqIG4gKyBzO1xuICAgICAgICAgICAgZyA9IChlWzJdIC0gZVswXSkgKiBuO1xuICAgICAgICAgICAgbSA9IChlWzNdIC0gZVsxXSkgKiBuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IFtjICogbiwgaCAqIG4sIGQgKiBuLCB1ICogbiwgcCAtIGMgKiBuICogbyAtIGQgKiBuICogbCwgZiAtIGggKiBuICogbyAtIHUgKiBuICogbF07XG4gICAgICAgICAgdGhpcy53aWR0aCA9IGc7XG4gICAgICAgICAgdGhpcy5oZWlnaHQgPSBtO1xuICAgICAgICB9XG4gICAgICAgIGdldCByYXdEaW1zKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHZpZXdCb3g6IHRcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gKDAsIHIuc2hhZG93KSh0aGlzLCBcInJhd0RpbXNcIiwge1xuICAgICAgICAgICAgcGFnZVdpZHRoOiB0WzJdIC0gdFswXSxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IHRbM10gLSB0WzFdLFxuICAgICAgICAgICAgcGFnZVg6IHRbMF0sXG4gICAgICAgICAgICBwYWdlWTogdFsxXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNsb25lKCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBzY2FsZTogdCA9IHRoaXMuc2NhbGUsXG4gICAgICAgICAgICByb3RhdGlvbjogZSA9IHRoaXMucm90YXRpb24sXG4gICAgICAgICAgICBvZmZzZXRYOiBuID0gdGhpcy5vZmZzZXRYLFxuICAgICAgICAgICAgb2Zmc2V0WTogaSA9IHRoaXMub2Zmc2V0WSxcbiAgICAgICAgICAgIGRvbnRGbGlwOiByID0gITFcbiAgICAgICAgICB9ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG4gICAgICAgICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSxcbiAgICAgICAgICAgIHNjYWxlOiB0LFxuICAgICAgICAgICAgcm90YXRpb246IGUsXG4gICAgICAgICAgICBvZmZzZXRYOiBuLFxuICAgICAgICAgICAgb2Zmc2V0WTogaSxcbiAgICAgICAgICAgIGRvbnRGbGlwOiByXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udmVydFRvVmlld3BvcnRQb2ludCh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHIuVXRpbC5hcHBseVRyYW5zZm9ybShbdCwgZV0sIHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgICAgICBjb252ZXJ0VG9WaWV3cG9ydFJlY3RhbmdsZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHIuVXRpbC5hcHBseVRyYW5zZm9ybShbdFswXSwgdFsxXV0sIHRoaXMudHJhbnNmb3JtKSxcbiAgICAgICAgICAgIG4gPSByLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3RbMl0sIHRbM11dLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgcmV0dXJuIFtlWzBdLCBlWzFdLCBuWzBdLCBuWzFdXTtcbiAgICAgICAgfVxuICAgICAgICBjb252ZXJ0VG9QZGZQb2ludCh0LCBlKSB7XG4gICAgICAgICAgcmV0dXJuIHIuVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW3QsIGVdLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUGFnZVZpZXdwb3J0ID0gUGFnZVZpZXdwb3J0O1xuICAgICAgY2xhc3MgUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uIGV4dGVuZHMgci5CYXNlRXhjZXB0aW9uIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAwO1xuICAgICAgICAgIHN1cGVyKHQsIFwiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uXCIpO1xuICAgICAgICAgIHRoaXMuZXh0cmFEZWxheSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uO1xuICAgICAgZnVuY3Rpb24gaXNEYXRhU2NoZW1lKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGVuZ3RoO1xuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIGZvciAoOyBuIDwgZSAmJiBcIlwiID09PSB0W25dLnRyaW0oKTspIG4rKztcbiAgICAgICAgcmV0dXJuIFwiZGF0YTpcIiA9PT0gdC5zdWJzdHJpbmcobiwgbiArIDUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgICBlLlN0YXRUaW1lciA9IGNsYXNzIFN0YXRUaW1lciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInN0YXJ0ZWRcIiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwidGltZXNcIiwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHRpbWUodCkge1xuICAgICAgICAgIHQgaW4gdGhpcy5zdGFydGVkICYmICgwLCByLndhcm4pKFwiVGltZXIgaXMgYWxyZWFkeSBydW5uaW5nIGZvciBcIi5jb25jYXQodCkpO1xuICAgICAgICAgIHRoaXMuc3RhcnRlZFt0XSA9IERhdGUubm93KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGltZUVuZCh0KSB7XG4gICAgICAgICAgdCBpbiB0aGlzLnN0YXJ0ZWQgfHwgKDAsIHIud2FybikoXCJUaW1lciBoYXMgbm90IGJlZW4gc3RhcnRlZCBmb3IgXCIuY29uY2F0KHQpKTtcbiAgICAgICAgICB0aGlzLnRpbWVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogdCxcbiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0ZWRbdF0sXG4gICAgICAgICAgICBlbmQ6IERhdGUubm93KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zdGFydGVkW3RdO1xuICAgICAgICB9XG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICBsZXQgZSA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCB7XG4gICAgICAgICAgICBuYW1lOiB0XG4gICAgICAgICAgfSBvZiB0aGlzLnRpbWVzKSBlID0gTWF0aC5tYXgodC5sZW5ndGgsIGUpO1xuICAgICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgICAgbmFtZTogbixcbiAgICAgICAgICAgIHN0YXJ0OiBpLFxuICAgICAgICAgICAgZW5kOiByXG4gICAgICAgICAgfSBvZiB0aGlzLnRpbWVzKSB0LnB1c2goXCJcIi5jb25jYXQobi5wYWRFbmQoZSksIFwiIFwiKS5jb25jYXQociAtIGksIFwibXNcXG5cIikpO1xuICAgICAgICAgIHJldHVybiB0LmpvaW4oXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBpc1ZhbGlkRmV0Y2hVcmwodCwgZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHByb3RvY29sOiBuXG4gICAgICAgICAgfSA9IGUgPyBuZXcgVVJMKHQsIGUpIDogbmV3IFVSTCh0KTtcbiAgICAgICAgICByZXR1cm4gXCJodHRwOlwiID09PSBuIHx8IFwiaHR0cHM6XCIgPT09IG47XG4gICAgICAgIH0gY2F0Y2ggKF91bnVzZWQxMCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGE7XG4gICAgICBlLlBERkRhdGVTdHJpbmcgPSBjbGFzcyBQREZEYXRlU3RyaW5nIHtcbiAgICAgICAgc3RhdGljIHRvRGF0ZU9iamVjdCh0KSB7XG4gICAgICAgICAgaWYgKCF0IHx8IFwic3RyaW5nXCIgIT0gdHlwZW9mIHQpIHJldHVybiBudWxsO1xuICAgICAgICAgIGEgfHwgKGEgPSBuZXcgUmVnRXhwKFwiXkQ6KFxcXFxkezR9KShcXFxcZHsyfSk/KFxcXFxkezJ9KT8oXFxcXGR7Mn0pPyhcXFxcZHsyfSk/KFxcXFxkezJ9KT8oW1p8K3wtXSk/KFxcXFxkezJ9KT8nPyhcXFxcZHsyfSk/Jz9cIikpO1xuICAgICAgICAgIGNvbnN0IGUgPSBhLmV4ZWModCk7XG4gICAgICAgICAgaWYgKCFlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQoZVsxXSwgMTApO1xuICAgICAgICAgIGxldCBpID0gcGFyc2VJbnQoZVsyXSwgMTApO1xuICAgICAgICAgIGkgPSBpID49IDEgJiYgaSA8PSAxMiA/IGkgLSAxIDogMDtcbiAgICAgICAgICBsZXQgciA9IHBhcnNlSW50KGVbM10sIDEwKTtcbiAgICAgICAgICByID0gciA+PSAxICYmIHIgPD0gMzEgPyByIDogMTtcbiAgICAgICAgICBsZXQgcyA9IHBhcnNlSW50KGVbNF0sIDEwKTtcbiAgICAgICAgICBzID0gcyA+PSAwICYmIHMgPD0gMjMgPyBzIDogMDtcbiAgICAgICAgICBsZXQgbyA9IHBhcnNlSW50KGVbNV0sIDEwKTtcbiAgICAgICAgICBvID0gbyA+PSAwICYmIG8gPD0gNTkgPyBvIDogMDtcbiAgICAgICAgICBsZXQgbCA9IHBhcnNlSW50KGVbNl0sIDEwKTtcbiAgICAgICAgICBsID0gbCA+PSAwICYmIGwgPD0gNTkgPyBsIDogMDtcbiAgICAgICAgICBjb25zdCBjID0gZVs3XSB8fCBcIlpcIjtcbiAgICAgICAgICBsZXQgaCA9IHBhcnNlSW50KGVbOF0sIDEwKTtcbiAgICAgICAgICBoID0gaCA+PSAwICYmIGggPD0gMjMgPyBoIDogMDtcbiAgICAgICAgICBsZXQgZCA9IHBhcnNlSW50KGVbOV0sIDEwKSB8fCAwO1xuICAgICAgICAgIGQgPSBkID49IDAgJiYgZCA8PSA1OSA/IGQgOiAwO1xuICAgICAgICAgIGlmIChcIi1cIiA9PT0gYykge1xuICAgICAgICAgICAgcyArPSBoO1xuICAgICAgICAgICAgbyArPSBkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXCIrXCIgPT09IGMpIHtcbiAgICAgICAgICAgIHMgLT0gaDtcbiAgICAgICAgICAgIG8gLT0gZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKG4sIGksIHIsIHMsIG8sIGwpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGdldFJHQih0KSB7XG4gICAgICAgIGlmICh0LnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICAgICAgY29uc3QgZSA9IHBhcnNlSW50KHQuc2xpY2UoMSksIDE2KTtcbiAgICAgICAgICByZXR1cm4gWygxNjcxMTY4MCAmIGUpID4+IDE2LCAoNjUyODAgJiBlKSA+PiA4LCAyNTUgJiBlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodC5zdGFydHNXaXRoKFwicmdiKFwiKSkgcmV0dXJuIHQuc2xpY2UoNCwgLTEpLnNwbGl0KFwiLFwiKS5tYXAodCA9PiBwYXJzZUludCh0KSk7XG4gICAgICAgIGlmICh0LnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkgcmV0dXJuIHQuc2xpY2UoNSwgLTEpLnNwbGl0KFwiLFwiKS5tYXAodCA9PiBwYXJzZUludCh0KSkuc2xpY2UoMCwgMyk7XG4gICAgICAgICgwLCByLndhcm4pKFwiTm90IGEgdmFsaWQgY29sb3IgZm9ybWF0OiBcXFwiXCIuY29uY2F0KHQsIFwiXFxcIlwiKSk7XG4gICAgICAgIHJldHVybiBbMCwgMCwgMF07XG4gICAgICB9XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZS5CYXNlU1ZHRmFjdG9yeSA9IGUuQmFzZUZpbHRlckZhY3RvcnkgPSBlLkJhc2VDYW52YXNGYWN0b3J5ID0gZS5CYXNlQ01hcFJlYWRlckZhY3RvcnkgPSB2b2lkIDA7XG4gICAgICBuKDIpO1xuICAgICAgdmFyIGkgPSBuKDEpO1xuICAgICAgY2xhc3MgQmFzZUZpbHRlckZhY3Rvcnkge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRmlsdGVyRmFjdG9yeSAmJiAoMCwgaS51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRmlsdGVyRmFjdG9yeS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkRmlsdGVyKHQpIHtcbiAgICAgICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSENNRmlsdGVyKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0SENNRmlsdGVyKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSgpIHt9XG4gICAgICB9XG4gICAgICBlLkJhc2VGaWx0ZXJGYWN0b3J5ID0gQmFzZUZpbHRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VDYW52YXNGYWN0b3J5ICYmICgwLCBpLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDYW52YXNGYWN0b3J5LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGUodCwgZSkge1xuICAgICAgICAgIGlmICh0IDw9IDAgfHwgZSA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9jcmVhdGVDYW52YXModCwgZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbnZhczogbixcbiAgICAgICAgICAgIGNvbnRleHQ6IG4uZ2V0Q29udGV4dChcIjJkXCIpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXNldCh0LCBlLCBuKSB7XG4gICAgICAgICAgaWYgKCF0LmNhbnZhcykgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgICAgICAgaWYgKGUgPD0gMCB8fCBuIDw9IDApIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG4gICAgICAgICAgdC5jYW52YXMud2lkdGggPSBlO1xuICAgICAgICAgIHQuY2FudmFzLmhlaWdodCA9IG47XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveSh0KSB7XG4gICAgICAgICAgaWYgKCF0LmNhbnZhcykgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG4gICAgICAgICAgdC5jYW52YXMud2lkdGggPSAwO1xuICAgICAgICAgIHQuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgdC5jYW52YXMgPSBudWxsO1xuICAgICAgICAgIHQuY29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZUNhbnZhcyh0LCBlKSB7XG4gICAgICAgICAgKDAsIGkudW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlQ2FudmFzYCBjYWxsZWQuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkJhc2VDYW52YXNGYWN0b3J5ID0gQmFzZUNhbnZhc0ZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGJhc2VVcmw6IGUgPSBudWxsLFxuICAgICAgICAgICAgaXNDb21wcmVzc2VkOiBuID0gITBcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ01hcFJlYWRlckZhY3RvcnkgJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUNNYXBSZWFkZXJGYWN0b3J5LlwiKTtcbiAgICAgICAgICB0aGlzLmJhc2VVcmwgPSBlO1xuICAgICAgICAgIHRoaXMuaXNDb21wcmVzc2VkID0gbjtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBmZXRjaCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIG5hbWU6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBpZiAoIXRoaXMuYmFzZVVybCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgQ01hcCBcImJhc2VVcmxcIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0IHRoZSBcImNNYXBVcmxcIiBhbmQgXCJjTWFwUGFja2VkXCIgQVBJIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLicpO1xuICAgICAgICAgIGlmICghZSkgdGhyb3cgbmV3IEVycm9yKFwiQ01hcCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5iYXNlVXJsICsgZSArICh0aGlzLmlzQ29tcHJlc3NlZCA/IFwiLmJjbWFwXCIgOiBcIlwiKSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmlzQ29tcHJlc3NlZCA/IGkuQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkgOiBpLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKG4sIHIpLmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvYWQgXCIuY29uY2F0KHRoaXMuaXNDb21wcmVzc2VkID8gXCJiaW5hcnkgXCIgOiBcIlwiLCBcIkNNYXAgYXQ6IFwiKS5jb25jYXQobikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9mZXRjaERhdGEodCwgZSkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5CYXNlQ01hcFJlYWRlckZhY3RvcnkgPSBCYXNlQ01hcFJlYWRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGJhc2VVcmw6IGUgPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ICYmICgwLCBpLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeS5cIik7XG4gICAgICAgICAgdGhpcy5iYXNlVXJsID0gZTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBmZXRjaCh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGZpbGVuYW1lOiBlXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgaWYgKCF0aGlzLmJhc2VVcmwpIHRocm93IG5ldyBFcnJvcignVGhlIHN0YW5kYXJkIGZvbnQgXCJiYXNlVXJsXCIgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkLCBlbnN1cmUgdGhhdCB0aGUgXCJzdGFuZGFyZEZvbnREYXRhVXJsXCIgQVBJIHBhcmFtZXRlciBpcyBwcm92aWRlZC4nKTtcbiAgICAgICAgICBpZiAoIWUpIHRocm93IG5ldyBFcnJvcihcIkZvbnQgZmlsZW5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuICAgICAgICAgIGNvbnN0IG4gPSBcIlwiLmNvbmNhdCh0aGlzLmJhc2VVcmwpLmNvbmNhdChlKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKG4pLmNhdGNoKHQgPT4ge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGxvYWQgZm9udCBkYXRhIGF0OiBcIi5jb25jYXQobikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9mZXRjaERhdGEodCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG4gICAgICBjbGFzcyBCYXNlU1ZHRmFjdG9yeSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTVkdGYWN0b3J5ICYmICgwLCBpLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTVkdGYWN0b3J5LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGUodCwgZSkge1xuICAgICAgICAgIGxldCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdO1xuICAgICAgICAgIGlmICh0IDw9IDAgfHwgZSA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNWRyBkaW1lbnNpb25zXCIpO1xuICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLl9jcmVhdGVTVkcoXCJzdmc6c3ZnXCIpO1xuICAgICAgICAgIGkuc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLCBcIjEuMVwiKTtcbiAgICAgICAgICBpZiAoIW4pIHtcbiAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgXCJcIi5jb25jYXQodCwgXCJweFwiKSk7XG4gICAgICAgICAgICBpLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIlwiLmNvbmNhdChlLCBcInB4XCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaS5zZXRBdHRyaWJ1dGUoXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCIsIFwibm9uZVwiKTtcbiAgICAgICAgICBpLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgXCIwIDAgXCIuY29uY2F0KHQsIFwiIFwiKS5jb25jYXQoZSkpO1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIGNyZWF0ZUVsZW1lbnQodCkge1xuICAgICAgICAgIGlmIChcInN0cmluZ1wiICE9IHR5cGVvZiB0KSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNWRyBlbGVtZW50IHR5cGVcIik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVNWRyh0KTtcbiAgICAgICAgfVxuICAgICAgICBfY3JlYXRlU1ZHKHQpIHtcbiAgICAgICAgICAoMCwgaS51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYF9jcmVhdGVTVkdgIGNhbGxlZC5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuQmFzZVNWR0ZhY3RvcnkgPSBCYXNlU1ZHRmFjdG9yeTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5NdXJtdXJIYXNoM182NCA9IHZvaWQgMDtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKTtcbiAgICAgIGNvbnN0IHIgPSAzMjg1Mzc3NTIwLFxuICAgICAgICBzID0gNDI5NDkwMTc2MCxcbiAgICAgICAgYSA9IDY1NTM1O1xuICAgICAgZS5NdXJtdXJIYXNoM182NCA9IGNsYXNzIE11cm11ckhhc2gzXzY0IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHRoaXMuaDEgPSB0ID8gNDI5NDk2NzI5NSAmIHQgOiByO1xuICAgICAgICAgIHRoaXMuaDIgPSB0ID8gNDI5NDk2NzI5NSAmIHQgOiByO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZSh0KSB7XG4gICAgICAgICAgbGV0IGUsIG47XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIHQpIHtcbiAgICAgICAgICAgIGUgPSBuZXcgVWludDhBcnJheSgyICogdC5sZW5ndGgpO1xuICAgICAgICAgICAgbiA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgciA9IHQubGVuZ3RoOyBpIDwgcjsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHIgPSB0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICAgIGlmIChyIDw9IDI1NSkgZVtuKytdID0gcjtlbHNlIHtcbiAgICAgICAgICAgICAgICBlW24rK10gPSByID4+PiA4O1xuICAgICAgICAgICAgICAgIGVbbisrXSA9IDI1NSAmIHI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCEoMCwgaS5pc0FycmF5QnVmZmVyKSh0KSkgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgZGF0YSBmb3JtYXQgaW4gTXVybXVySGFzaDNfNjRfdXBkYXRlLiBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LlwiKTtcbiAgICAgICAgICAgIGUgPSB0LnNsaWNlKCk7XG4gICAgICAgICAgICBuID0gZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByID0gbiA+PiAyLFxuICAgICAgICAgICAgbyA9IG4gLSA0ICogcixcbiAgICAgICAgICAgIGwgPSBuZXcgVWludDMyQXJyYXkoZS5idWZmZXIsIDAsIHIpO1xuICAgICAgICAgIGxldCBjID0gMCxcbiAgICAgICAgICAgIGggPSAwLFxuICAgICAgICAgICAgZCA9IHRoaXMuaDEsXG4gICAgICAgICAgICB1ID0gdGhpcy5oMjtcbiAgICAgICAgICBjb25zdCBwID0gMzQzMjkxODM1MyxcbiAgICAgICAgICAgIGYgPSA0NjE4NDU5MDcsXG4gICAgICAgICAgICBnID0gMTE2MDEsXG4gICAgICAgICAgICBtID0gMTM3MTU7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCByOyB0KyspIGlmICgxICYgdCkge1xuICAgICAgICAgICAgYyA9IGxbdF07XG4gICAgICAgICAgICBjID0gYyAqIHAgJiBzIHwgYyAqIGcgJiBhO1xuICAgICAgICAgICAgYyA9IGMgPDwgMTUgfCBjID4+PiAxNztcbiAgICAgICAgICAgIGMgPSBjICogZiAmIHMgfCBjICogbSAmIGE7XG4gICAgICAgICAgICBkIF49IGM7XG4gICAgICAgICAgICBkID0gZCA8PCAxMyB8IGQgPj4+IDE5O1xuICAgICAgICAgICAgZCA9IDUgKiBkICsgMzg2NDI5MjE5NjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaCA9IGxbdF07XG4gICAgICAgICAgICBoID0gaCAqIHAgJiBzIHwgaCAqIGcgJiBhO1xuICAgICAgICAgICAgaCA9IGggPDwgMTUgfCBoID4+PiAxNztcbiAgICAgICAgICAgIGggPSBoICogZiAmIHMgfCBoICogbSAmIGE7XG4gICAgICAgICAgICB1IF49IGg7XG4gICAgICAgICAgICB1ID0gdSA8PCAxMyB8IHUgPj4+IDE5O1xuICAgICAgICAgICAgdSA9IDUgKiB1ICsgMzg2NDI5MjE5NjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYyA9IDA7XG4gICAgICAgICAgc3dpdGNoIChvKSB7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgIGMgXj0gZVs0ICogciArIDJdIDw8IDE2O1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBjIF49IGVbNCAqIHIgKyAxXSA8PCA4O1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICBjIF49IGVbNCAqIHJdO1xuICAgICAgICAgICAgICBjID0gYyAqIHAgJiBzIHwgYyAqIGcgJiBhO1xuICAgICAgICAgICAgICBjID0gYyA8PCAxNSB8IGMgPj4+IDE3O1xuICAgICAgICAgICAgICBjID0gYyAqIGYgJiBzIHwgYyAqIG0gJiBhO1xuICAgICAgICAgICAgICAxICYgciA/IGQgXj0gYyA6IHUgXj0gYztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oMSA9IGQ7XG4gICAgICAgICAgdGhpcy5oMiA9IHU7XG4gICAgICAgIH1cbiAgICAgICAgaGV4ZGlnZXN0KCkge1xuICAgICAgICAgIGxldCB0ID0gdGhpcy5oMSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmgyO1xuICAgICAgICAgIHQgXj0gZSA+Pj4gMTtcbiAgICAgICAgICB0ID0gMzk4MTgwNjc5NyAqIHQgJiBzIHwgMzYwNDUgKiB0ICYgYTtcbiAgICAgICAgICBlID0gNDI4MzU0MzUxMSAqIGUgJiBzIHwgKDI5NTAxNjM3OTcgKiAoZSA8PCAxNiB8IHQgPj4+IDE2KSAmIHMpID4+PiAxNjtcbiAgICAgICAgICB0IF49IGUgPj4+IDE7XG4gICAgICAgICAgdCA9IDQ0NDk4NDQwMyAqIHQgJiBzIHwgNjA0OTkgKiB0ICYgYTtcbiAgICAgICAgICBlID0gMzMwMTg4MjM2NiAqIGUgJiBzIHwgKDMxMjA0Mzc4OTMgKiAoZSA8PCAxNiB8IHQgPj4+IDE2KSAmIHMpID4+PiAxNjtcbiAgICAgICAgICB0IF49IGUgPj4+IDE7XG4gICAgICAgICAgcmV0dXJuICh0ID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgXCIwXCIpICsgKGUgPj4+IDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCBcIjBcIik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX1d0O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkZvbnRMb2FkZXIgPSBlLkZvbnRGYWNlT2JqZWN0ID0gdm9pZCAwO1xuICAgICAgbigxMjUpO1xuICAgICAgbigxMzUpO1xuICAgICAgbigxMzcpO1xuICAgICAgbigxNDApO1xuICAgICAgbigxNDIpO1xuICAgICAgbigxNDQpO1xuICAgICAgbigxNDYpO1xuICAgICAgbig4OSk7XG4gICAgICBuKDE0OCk7XG4gICAgICB2YXIgaSA9IG4oMSk7XG4gICAgICBlLkZvbnRMb2FkZXIgPSAoX1d0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIGNsYXNzIEZvbnRMb2FkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1d0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgU2V0KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudDogZSA9IGdsb2JhbFRoaXMuZG9jdW1lbnQsXG4gICAgICAgICAgICBzdHlsZUVsZW1lbnQ6IG4gPSBudWxsXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBlO1xuICAgICAgICAgIHRoaXMubmF0aXZlRm9udEZhY2VzID0gbmV3IFNldCgpO1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdSZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMubG9hZFRlc3RGb250SWQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGFkZE5hdGl2ZUZvbnRGYWNlKHQpIHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5hZGQodCk7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuYWRkKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZU5hdGl2ZUZvbnRGYWNlKHQpIHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5kZWxldGUodCk7XG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKHQpO1xuICAgICAgICB9XG4gICAgICAgIGluc2VydFJ1bGUodCkge1xuICAgICAgICAgIGlmICghdGhpcy5zdHlsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXS5hcHBlbmQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5zdHlsZUVsZW1lbnQuc2hlZXQ7XG4gICAgICAgICAgZS5pbnNlcnRSdWxlKHQsIGUuY3NzUnVsZXMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhcigpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5uYXRpdmVGb250RmFjZXMpIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZSh0KTtcbiAgICAgICAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5jbGVhcigpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfV3QpLmNsZWFyKCk7XG4gICAgICAgICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgbG9hZFN5c3RlbUZvbnQodCkge1xuICAgICAgICAgIGlmICh0ICYmICFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1d0KS5oYXModC5sb2FkZWROYW1lKSkge1xuICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KSghdGhpcy5kaXNhYmxlRm9udEZhY2UsIFwibG9hZFN5c3RlbUZvbnQgc2hvdWxkbid0IGJlIGNhbGxlZCB3aGVuIGBkaXNhYmxlRm9udEZhY2VgIGlzIHNldC5cIik7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIGxvYWRlZE5hbWU6IGUsXG4gICAgICAgICAgICAgICAgICBzcmM6IG4sXG4gICAgICAgICAgICAgICAgICBzdHlsZTogclxuICAgICAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgICAgIHMgPSBuZXcgRm9udEZhY2UoZSwgbiwgcik7XG4gICAgICAgICAgICAgIHRoaXMuYWRkTmF0aXZlRm9udEZhY2Uocyk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcy5sb2FkKCk7XG4gICAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9XdCkuYWRkKGUpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChfdW51c2VkMTEpIHtcbiAgICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIkNhbm5vdCBsb2FkIHN5c3RlbSBmb250OiBcIi5jb25jYXQodC5iYXNlRm9udE5hbWUsIFwiLCBpbnN0YWxsaW5nIGl0IGNvdWxkIGhlbHAgdG8gaW1wcm92ZSBQREYgcmVuZGVyaW5nLlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVOYXRpdmVGb250RmFjZShzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlICgwLCBpLnVucmVhY2hhYmxlKShcIk5vdCBpbXBsZW1lbnRlZDogbG9hZFN5c3RlbUZvbnQgd2l0aG91dCB0aGUgRm9udCBMb2FkaW5nIEFQSS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGJpbmQodCkge1xuICAgICAgICAgIGlmICh0LmF0dGFjaGVkIHx8IHQubWlzc2luZ0ZpbGUgJiYgIXQuc3lzdGVtRm9udEluZm8pIHJldHVybjtcbiAgICAgICAgICB0LmF0dGFjaGVkID0gITA7XG4gICAgICAgICAgaWYgKHQuc3lzdGVtRm9udEluZm8pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFN5c3RlbUZvbnQodC5zeXN0ZW1Gb250SW5mbyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICB0aGlzLmFkZE5hdGl2ZUZvbnRGYWNlKGUpO1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGUubG9hZGVkO1xuICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7XG4gICAgICAgICAgICAgICAgKDAsIGkud2FybikoXCJGYWlsZWQgdG8gbG9hZCBmb250ICdcIi5jb25jYXQoZS5mYW1pbHksIFwiJzogJ1wiKS5jb25jYXQobiwgXCInLlwiKSk7XG4gICAgICAgICAgICAgICAgdC5kaXNhYmxlRm9udEZhY2UgPSAhMDtcbiAgICAgICAgICAgICAgICB0aHJvdyBuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGUgPSB0LmNyZWF0ZUZvbnRGYWNlUnVsZSgpO1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydFJ1bGUoZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoZSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9xdWV1ZUxvYWRpbmdDYWxsYmFjayhlKTtcbiAgICAgICAgICAgICAgdGhpcy5fcHJlcGFyZUZvbnRMb2FkRXZlbnQodCwgbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9kb2N1bWVudDtcbiAgICAgICAgICBjb25zdCB0ID0gISEoKF90aGlzJF9kb2N1bWVudCA9IHRoaXMuX2RvY3VtZW50KSAhPT0gbnVsbCAmJiBfdGhpcyRfZG9jdW1lbnQgIT09IHZvaWQgMCAmJiBfdGhpcyRfZG9jdW1lbnQuZm9udHMpO1xuICAgICAgICAgIHJldHVybiAoMCwgaS5zaGFkb3cpKHRoaXMsIFwiaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZFwiLCB0KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgbGV0IHQgPSAhMTtcbiAgICAgICAgICAoaS5pc05vZGVKUyB8fCBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBuYXZpZ2F0b3IgJiYgL01vemlsbGFcXC81LjAuKj9ydjpcXGQrLio/IEdlY2tvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSAmJiAodCA9ICEwKTtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcImlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkXCIsIHQpO1xuICAgICAgICB9XG4gICAgICAgIF9xdWV1ZUxvYWRpbmdDYWxsYmFjayh0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBsb2FkaW5nUmVxdWVzdHM6IGVcbiAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAgbiA9IHtcbiAgICAgICAgICAgICAgZG9uZTogITEsXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKSB7XG4gICAgICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KSghbi5kb25lLCBcImNvbXBsZXRlUmVxdWVzdCgpIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UuXCIpO1xuICAgICAgICAgICAgICAgIG4uZG9uZSA9ICEwO1xuICAgICAgICAgICAgICAgIGZvciAoOyBlLmxlbmd0aCA+IDAgJiYgZVswXS5kb25lOykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodC5jYWxsYmFjaywgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjYWxsYmFjazogdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICBlLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IGF0b2IoXCJUMVJVVHdBTEFJQUFBd0F3UTBaR0lESHRaZzRBQUFPWUFBQUFnVVpHVkUxbGt6WndBQUFFSEFBQUFCeEhSRVZHQUJRQUZRQUFCRGdBQUFBZVQxTXZNbFlOWXdrQUFBRWdBQUFBWUdOdFlYQUJEUUxVQUFBQ05BQUFBVUpvWldGay94VkZEUUFBQUx3QUFBQTJhR2hsWVFka0Erb0FBQUQwQUFBQUpHaHRkSGdENkFBQUFBQUVXQUFBQUFadFlYaHdBQUpRQUFBQUFSZ0FBQUFHYm1GdFpWam1kSDRBQUFHQUFBQUFzWEJ2YzNUL2hnQXpBQUFEZUFBQUFDQUFBUUFBQUFFQUFMWlJGc1JmRHp6MUFBc0Q2QUFBQUFET0JPVExBQUFBQU00S0hEd0FBQUFBQStnRElRQUFBQWdBQWdBQUFBQUFBQUFCQUFBRElRQUFBRm9ENkFBQUFBQUQ2QUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBVUFBQUFnQUFBQVFENkFIMEFBVUFBQUtLQXJ3QUFBQ01Bb29DdkFBQUFlQUFNUUVDQUFBQ0FBWUpBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUZCbVJXUUF3QUF1QUM0RElQODRBRm9ESVFBQUFBQUFBUUFBQUFBQUFBQUFBQ0FBSUFBQkFBQUFEZ0N1QUFFQUFBQUFBQUFBQVFBQUFBRUFBQUFBQUFFQUFRQUFBQUVBQUFBQUFBSUFBUUFBQUFFQUFBQUFBQU1BQVFBQUFBRUFBQUFBQUFRQUFRQUFBQUVBQUFBQUFBVUFBUUFBQUFFQUFBQUFBQVlBQVFBQUFBTUFBUVFKQUFBQUFnQUJBQU1BQVFRSkFBRUFBZ0FCQUFNQUFRUUpBQUlBQWdBQkFBTUFBUVFKQUFNQUFnQUJBQU1BQVFRSkFBUUFBZ0FCQUFNQUFRUUpBQVVBQWdBQkFBTUFBUVFKQUFZQUFnQUJXQUJZQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFEd0FBd0FCQUFBQUhBQUVBQ0FBQUFBRUFBUUFBUUFBQUM3Ly93QUFBQzcvLy8vVEFBRUFBQUFBQUFBQkJnQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTUFBQUFBQUFEL2d3QXlBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFRRUFBRUJBUUpZQUFFQkFTSDREd0Q0R3dIRUF2Z2NBL2dYQkl3TUFZdUwrbno1dFFYa0Q1ajNDQkxuRVFBQ0FRRUJJVmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWUFBQUJBUUFBRHdBQ0FRRUVFL3QzRG92NmZBSDZmQVQrZlBwOCtud0hEb3NNQ3ZtMUN2bTFEQXo2ZkJRQUFBQUFBQUFCQUFBQUFNbUpiekVBQUFBQXpnVGpGUUFBQUFET0JPUXBBQUVBQUFBQUFBQUFEQUFVQUFRQUFBQUJBQUFBQWdBQkFBQUFBQUFBQUFBRDZBQUFBQUFBQUE9PVwiKTtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcIl9sb2FkVGVzdEZvbnRcIiwgdCk7XG4gICAgICAgIH1cbiAgICAgICAgX3ByZXBhcmVGb250TG9hZEV2ZW50KHQsIGUpIHtcbiAgICAgICAgICBmdW5jdGlvbiBpbnQzMih0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdC5jaGFyQ29kZUF0KGUpIDw8IDI0IHwgdC5jaGFyQ29kZUF0KGUgKyAxKSA8PCAxNiB8IHQuY2hhckNvZGVBdChlICsgMikgPDwgOCB8IDI1NSAmIHQuY2hhckNvZGVBdChlICsgMyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZ1bmN0aW9uIHNwbGljZVN0cmluZyh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgICByZXR1cm4gdC5zdWJzdHJpbmcoMCwgZSkgKyBpICsgdC5zdWJzdHJpbmcoZSArIG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgbiwgcjtcbiAgICAgICAgICBjb25zdCBzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICBzLndpZHRoID0gMTtcbiAgICAgICAgICBzLmhlaWdodCA9IDE7XG4gICAgICAgICAgY29uc3QgYSA9IHMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICAgIGxldCBvID0gMDtcbiAgICAgICAgICBjb25zdCBsID0gXCJsdFwiLmNvbmNhdChEYXRlLm5vdygpKS5jb25jYXQodGhpcy5sb2FkVGVzdEZvbnRJZCsrKTtcbiAgICAgICAgICBsZXQgYyA9IHRoaXMuX2xvYWRUZXN0Rm9udDtcbiAgICAgICAgICBjID0gc3BsaWNlU3RyaW5nKGMsIDk3NiwgbC5sZW5ndGgsIGwpO1xuICAgICAgICAgIGNvbnN0IGggPSAxNDgyMTg0NzkyO1xuICAgICAgICAgIGxldCBkID0gaW50MzIoYywgMTYpO1xuICAgICAgICAgIGZvciAobiA9IDAsIHIgPSBsLmxlbmd0aCAtIDM7IG4gPCByOyBuICs9IDQpIGQgPSBkIC0gaCArIGludDMyKGwsIG4pIHwgMDtcbiAgICAgICAgICBuIDwgbC5sZW5ndGggJiYgKGQgPSBkIC0gaCArIGludDMyKGwgKyBcIlhYWFwiLCBuKSB8IDApO1xuICAgICAgICAgIGMgPSBzcGxpY2VTdHJpbmcoYywgMTYsIDQsICgwLCBpLnN0cmluZzMyKShkKSk7XG4gICAgICAgICAgY29uc3QgdSA9IFwiQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XFxcIlwiLmNvbmNhdChsLCBcIlxcXCI7c3JjOlwiLCBcInVybChkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LFwiLmNvbmNhdChidG9hKGMpLCBcIik7XCIpLCBcIn1cIik7XG4gICAgICAgICAgdGhpcy5pbnNlcnRSdWxlKHUpO1xuICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgIHAuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgcC5zdHlsZS53aWR0aCA9IHAuc3R5bGUuaGVpZ2h0ID0gXCIxMHB4XCI7XG4gICAgICAgICAgcC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgICBwLnN0eWxlLnRvcCA9IHAuc3R5bGUubGVmdCA9IFwiMHB4XCI7XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIFt0LmxvYWRlZE5hbWUsIGxdKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICB0LnRleHRDb250ZW50ID0gXCJIaVwiO1xuICAgICAgICAgICAgdC5zdHlsZS5mb250RmFtaWx5ID0gZTtcbiAgICAgICAgICAgIHAuYXBwZW5kKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZChwKTtcbiAgICAgICAgICAhZnVuY3Rpb24gaXNGb250UmVhZHkodCwgZSkge1xuICAgICAgICAgICAgaWYgKCsrbyA+IDMwKSB7XG4gICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiTG9hZCB0ZXN0IGZvbnQgbmV2ZXIgbG9hZGVkLlwiKTtcbiAgICAgICAgICAgICAgZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhLmZvbnQgPSBcIjMwcHggXCIgKyB0O1xuICAgICAgICAgICAgYS5maWxsVGV4dChcIi5cIiwgMCwgMjApO1xuICAgICAgICAgICAgYS5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSkuZGF0YVszXSA+IDAgPyBlKCkgOiBzZXRUaW1lb3V0KGlzRm9udFJlYWR5LmJpbmQobnVsbCwgdCwgZSkpO1xuICAgICAgICAgIH0obCwgKCkgPT4ge1xuICAgICAgICAgICAgcC5yZW1vdmUoKTtcbiAgICAgICAgICAgIGUuY29tcGxldGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBlLkZvbnRGYWNlT2JqZWN0ID0gY2xhc3MgRm9udEZhY2VPYmplY3Qge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZDogbiA9ICEwLFxuICAgICAgICAgICAgZGlzYWJsZUZvbnRGYWNlOiBpID0gITEsXG4gICAgICAgICAgICBpZ25vcmVFcnJvcnM6IHIgPSAhMSxcbiAgICAgICAgICAgIGluc3BlY3RGb250OiBzID0gbnVsbFxuICAgICAgICAgIH0gPSBlO1xuICAgICAgICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBpbiB0KSB0aGlzW2VdID0gdFtlXTtcbiAgICAgICAgICB0aGlzLmlzRXZhbFN1cHBvcnRlZCA9ICExICE9PSBuO1xuICAgICAgICAgIHRoaXMuZGlzYWJsZUZvbnRGYWNlID0gITAgPT09IGk7XG4gICAgICAgICAgdGhpcy5pZ25vcmVFcnJvcnMgPSAhMCA9PT0gcjtcbiAgICAgICAgICB0aGlzLl9pbnNwZWN0Rm9udCA9IHM7XG4gICAgICAgIH1cbiAgICAgICAgY3JlYXRlTmF0aXZlRm9udEZhY2UoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9pbnNwZWN0Rm9udDtcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCB0aGlzLmRpc2FibGVGb250RmFjZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgaWYgKHRoaXMuY3NzRm9udEluZm8pIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB7XG4gICAgICAgICAgICAgIHdlaWdodDogdGhpcy5jc3NGb250SW5mby5mb250V2VpZ2h0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSAmJiAoZS5zdHlsZSA9IFwib2JsaXF1ZSBcIi5jb25jYXQodGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSwgXCJkZWdcIikpO1xuICAgICAgICAgICAgdCA9IG5ldyBGb250RmFjZSh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksIHRoaXMuZGF0YSwgZSk7XG4gICAgICAgICAgfSBlbHNlIHQgPSBuZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLCB0aGlzLmRhdGEsIHt9KTtcbiAgICAgICAgICAoX3RoaXMkX2luc3BlY3RGb250ID0gdGhpcy5faW5zcGVjdEZvbnQpID09PSBudWxsIHx8IF90aGlzJF9pbnNwZWN0Rm9udCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX2luc3BlY3RGb250LmNhbGwodGhpcywgdGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgY3JlYXRlRm9udEZhY2VSdWxlKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfaW5zcGVjdEZvbnQyO1xuICAgICAgICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCB0ID0gKDAsIGkuYnl0ZXNUb1N0cmluZykodGhpcy5kYXRhKSxcbiAgICAgICAgICAgIGUgPSBcInVybChkYXRhOlwiLmNvbmNhdCh0aGlzLm1pbWV0eXBlLCBcIjtiYXNlNjQsXCIpLmNvbmNhdChidG9hKHQpLCBcIik7XCIpO1xuICAgICAgICAgIGxldCBuO1xuICAgICAgICAgIGlmICh0aGlzLmNzc0ZvbnRJbmZvKSB7XG4gICAgICAgICAgICBsZXQgdCA9IFwiZm9udC13ZWlnaHQ6IFwiLmNvbmNhdCh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQsIFwiO1wiKTtcbiAgICAgICAgICAgIHRoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUgJiYgKHQgKz0gXCJmb250LXN0eWxlOiBvYmxpcXVlIFwiLmNvbmNhdCh0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlLCBcImRlZztcIikpO1xuICAgICAgICAgICAgbiA9IFwiQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XFxcIlwiLmNvbmNhdCh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksIFwiXFxcIjtcIikuY29uY2F0KHQsIFwic3JjOlwiKS5jb25jYXQoZSwgXCJ9XCIpO1xuICAgICAgICAgIH0gZWxzZSBuID0gXCJAZm9udC1mYWNlIHtmb250LWZhbWlseTpcXFwiXCIuY29uY2F0KHRoaXMubG9hZGVkTmFtZSwgXCJcXFwiO3NyYzpcIikuY29uY2F0KGUsIFwifVwiKTtcbiAgICAgICAgICAoX3RoaXMkX2luc3BlY3RGb250MiA9IHRoaXMuX2luc3BlY3RGb250KSA9PT0gbnVsbCB8fCBfdGhpcyRfaW5zcGVjdEZvbnQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfaW5zcGVjdEZvbnQyLmNhbGwodGhpcywgdGhpcywgZSk7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UGF0aEdlbmVyYXRvcih0LCBlKSB7XG4gICAgICAgICAgaWYgKHZvaWQgMCAhPT0gdGhpcy5jb21waWxlZEdseXBoc1tlXSkgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbZV07XG4gICAgICAgICAgbGV0IG47XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG4gPSB0LmdldCh0aGlzLmxvYWRlZE5hbWUgKyBcIl9wYXRoX1wiICsgZSk7XG4gICAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlnbm9yZUVycm9ycykgdGhyb3cgdDtcbiAgICAgICAgICAgICgwLCBpLndhcm4pKFwiZ2V0UGF0aEdlbmVyYXRvciAtIGlnbm9yaW5nIGNoYXJhY3RlcjogXFxcIlwiLmNvbmNhdCh0LCBcIlxcXCIuXCIpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2VdID0gZnVuY3Rpb24gKHQsIGUpIHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5pc0V2YWxTdXBwb3J0ZWQgJiYgaS5GZWF0dXJlVGVzdC5pc0V2YWxTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBuKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSB2b2lkIDAgIT09IGUuYXJncyA/IGUuYXJncy5qb2luKFwiLFwiKSA6IFwiXCI7XG4gICAgICAgICAgICAgIHQucHVzaChcImMuXCIsIGUuY21kLCBcIihcIiwgbiwgXCIpO1xcblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2VdID0gbmV3IEZ1bmN0aW9uKFwiY1wiLCBcInNpemVcIiwgdC5qb2luKFwiXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbZV0gPSBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIG4pIHtcbiAgICAgICAgICAgICAgXCJzY2FsZVwiID09PSBpLmNtZCAmJiAoaS5hcmdzID0gW2UsIC1lXSk7XG4gICAgICAgICAgICAgIHRbaS5jbWRdLmFwcGx5KHQsIGkuYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBlLk5vZGVGaWx0ZXJGYWN0b3J5ID0gZS5Ob2RlQ2FudmFzRmFjdG9yeSA9IGUuTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gdm9pZCAwO1xuICAgICAgbigyKTtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgdmFyIGkgPSBuKDE2OCksXG4gICAgICAgIHIgPSBuKDEpO1xuICAgICAgIWZ1bmN0aW9uIGNoZWNrRE9NTWF0cml4KCkge1xuICAgICAgICBpZiAoIWdsb2JhbFRoaXMuRE9NTWF0cml4ICYmIHIuaXNOb2RlSlMpIHRyeSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5ET01NYXRyaXggPSBPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdjYW52YXMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSk7XG4gICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAoMCwgci53YXJuKShcIkNhbm5vdCBwb2x5ZmlsbCBgRE9NTWF0cml4YCwgcmVuZGVyaW5nIG1heSBiZSBicm9rZW46IFxcXCJcIi5jb25jYXQodCwgXCJcXFwiLlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0oKTtcbiAgICAgICFmdW5jdGlvbiBjaGVja1BhdGgyRCgpIHtcbiAgICAgICAgaWYgKCFnbG9iYWxUaGlzLlBhdGgyRCAmJiByLmlzTm9kZUpTKSB0cnkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEOiB0XG4gICAgICAgICAgICB9ID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdjYW52YXMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSkpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwb2x5ZmlsbFBhdGgyRDogZVxuICAgICAgICAgICAgfSA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAncGF0aDJkLXBvbHlmaWxsJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKTtcbiAgICAgICAgICBnbG9iYWxUaGlzLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IHQ7XG4gICAgICAgICAgZShnbG9iYWxUaGlzKTtcbiAgICAgICAgfSBjYXRjaCAodCkge1xuICAgICAgICAgICgwLCByLndhcm4pKFwiQ2Fubm90IHBvbHlmaWxsIGBQYXRoMkRgLCByZW5kZXJpbmcgbWF5IGJlIGJyb2tlbjogXFxcIlwiLmNvbmNhdCh0LCBcIlxcXCIuXCIpKTtcbiAgICAgICAgfVxuICAgICAgfSgpO1xuICAgICAgY29uc3QgZmV0Y2hEYXRhID0gZnVuY3Rpb24gZmV0Y2hEYXRhKHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChlLCBuKSA9PiB7XG4gICAgICAgICAgT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnZnMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSkodCwgKHQsIGkpID0+IHtcbiAgICAgICAgICAgICF0ICYmIGkgPyBlKG5ldyBVaW50OEFycmF5KGkpKSA6IG4obmV3IEVycm9yKHQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgY2xhc3MgTm9kZUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VGaWx0ZXJGYWN0b3J5IHt9XG4gICAgICBlLk5vZGVGaWx0ZXJGYWN0b3J5ID0gTm9kZUZpbHRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBOb2RlQ2FudmFzRmFjdG9yeSBleHRlbmRzIGkuQmFzZUNhbnZhc0ZhY3Rvcnkge1xuICAgICAgICBfY3JlYXRlQ2FudmFzKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnY2FudmFzJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKHQsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLk5vZGVDYW52YXNGYWN0b3J5ID0gTm9kZUNhbnZhc0ZhY3Rvcnk7XG4gICAgICBjbGFzcyBOb2RlQ01hcFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG4gICAgICAgIF9mZXRjaERhdGEodCwgZSkge1xuICAgICAgICAgIHJldHVybiBmZXRjaERhdGEodCkudGhlbih0ID0+ICh7XG4gICAgICAgICAgICBjTWFwRGF0YTogdCxcbiAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZTogZVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgPSBOb2RlQ01hcFJlYWRlckZhY3Rvcnk7XG4gICAgICBjbGFzcyBOb2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgZXh0ZW5kcyBpLkJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG4gICAgICAgIF9mZXRjaERhdGEodCkge1xuICAgICAgICAgIHJldHVybiBmZXRjaERhdGEodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkNhbnZhc0dyYXBoaWNzID0gdm9pZCAwO1xuICAgICAgbigyKTtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgbig4OSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2NyksXG4gICAgICAgIHMgPSBuKDE3MyksXG4gICAgICAgIGEgPSBuKDE3NCk7XG4gICAgICBjb25zdCBvID0gNDA5NixcbiAgICAgICAgbCA9IDE2O1xuICAgICAgY2xhc3MgQ2FjaGVkQ2FudmFzZXMge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gdDtcbiAgICAgICAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRDYW52YXModCwgZSwgbikge1xuICAgICAgICAgIGxldCBpO1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHRoaXMuY2FjaGVbdF0pIHtcbiAgICAgICAgICAgIGkgPSB0aGlzLmNhY2hlW3RdO1xuICAgICAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5LnJlc2V0KGksIGUsIG4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShlLCBuKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdF0gPSBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUodCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW3RdO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyKCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdCBpbiB0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdGhpcy5jYWNoZVt0XTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5kZXN0cm95KGUpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FjaGVbdF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHModCwgZSwgbiwgaSwgcywgYSwgbywgbCwgYywgaCkge1xuICAgICAgICBjb25zdCBbZCwgdSwgcCwgZiwgZywgbV0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KTtcbiAgICAgICAgaWYgKDAgPT09IHUgJiYgMCA9PT0gcCkge1xuICAgICAgICAgIGNvbnN0IHIgPSBvICogZCArIGcsXG4gICAgICAgICAgICBiID0gTWF0aC5yb3VuZChyKSxcbiAgICAgICAgICAgIHYgPSBsICogZiArIG0sXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZCh2KSxcbiAgICAgICAgICAgIEEgPSAobyArIGMpICogZCArIGcsXG4gICAgICAgICAgICBfID0gTWF0aC5hYnMoTWF0aC5yb3VuZChBKSAtIGIpIHx8IDEsXG4gICAgICAgICAgICBTID0gKGwgKyBoKSAqIGYgKyBtLFxuICAgICAgICAgICAgRSA9IE1hdGguYWJzKE1hdGgucm91bmQoUykgLSB5KSB8fCAxO1xuICAgICAgICAgIHQuc2V0VHJhbnNmb3JtKE1hdGguc2lnbihkKSwgMCwgMCwgTWF0aC5zaWduKGYpLCBiLCB5KTtcbiAgICAgICAgICB0LmRyYXdJbWFnZShlLCBuLCBpLCBzLCBhLCAwLCAwLCBfLCBFKTtcbiAgICAgICAgICB0LnNldFRyYW5zZm9ybShkLCB1LCBwLCBmLCBnLCBtKTtcbiAgICAgICAgICByZXR1cm4gW18sIEVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICgwID09PSBkICYmIDAgPT09IGYpIHtcbiAgICAgICAgICBjb25zdCByID0gbCAqIHAgKyBnLFxuICAgICAgICAgICAgYiA9IE1hdGgucm91bmQociksXG4gICAgICAgICAgICB2ID0gbyAqIHUgKyBtLFxuICAgICAgICAgICAgeSA9IE1hdGgucm91bmQodiksXG4gICAgICAgICAgICBBID0gKGwgKyBoKSAqIHAgKyBnLFxuICAgICAgICAgICAgXyA9IE1hdGguYWJzKE1hdGgucm91bmQoQSkgLSBiKSB8fCAxLFxuICAgICAgICAgICAgUyA9IChvICsgYykgKiB1ICsgbSxcbiAgICAgICAgICAgIEUgPSBNYXRoLmFicyhNYXRoLnJvdW5kKFMpIC0geSkgfHwgMTtcbiAgICAgICAgICB0LnNldFRyYW5zZm9ybSgwLCBNYXRoLnNpZ24odSksIE1hdGguc2lnbihwKSwgMCwgYiwgeSk7XG4gICAgICAgICAgdC5kcmF3SW1hZ2UoZSwgbiwgaSwgcywgYSwgMCwgMCwgRSwgXyk7XG4gICAgICAgICAgdC5zZXRUcmFuc2Zvcm0oZCwgdSwgcCwgZiwgZywgbSk7XG4gICAgICAgICAgcmV0dXJuIFtFLCBfXTtcbiAgICAgICAgfVxuICAgICAgICB0LmRyYXdJbWFnZShlLCBuLCBpLCBzLCBhLCBvLCBsLCBjLCBoKTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLmh5cG90KGQsIHUpICogYywgTWF0aC5oeXBvdChwLCBmKSAqIGhdO1xuICAgICAgfVxuICAgICAgY2xhc3MgQ2FudmFzRXh0cmFTdGF0ZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICB0aGlzLmFscGhhSXNTaGFwZSA9ICExO1xuICAgICAgICAgIHRoaXMuZm9udFNpemUgPSAwO1xuICAgICAgICAgIHRoaXMuZm9udFNpemVTY2FsZSA9IDE7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4ID0gaS5JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMuZm9udE1hdHJpeCA9IGkuRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy5sZWFkaW5nID0gMDtcbiAgICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgICAgdGhpcy5saW5lWCA9IDA7XG4gICAgICAgICAgdGhpcy5saW5lWSA9IDA7XG4gICAgICAgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7XG4gICAgICAgICAgdGhpcy53b3JkU3BhY2luZyA9IDA7XG4gICAgICAgICAgdGhpcy50ZXh0SFNjYWxlID0gMTtcbiAgICAgICAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gaS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMO1xuICAgICAgICAgIHRoaXMudGV4dFJpc2UgPSAwO1xuICAgICAgICAgIHRoaXMuZmlsbENvbG9yID0gXCIjMDAwMDAwXCI7XG4gICAgICAgICAgdGhpcy5zdHJva2VDb2xvciA9IFwiIzAwMDAwMFwiO1xuICAgICAgICAgIHRoaXMucGF0dGVybkZpbGwgPSAhMTtcbiAgICAgICAgICB0aGlzLmZpbGxBbHBoYSA9IDE7XG4gICAgICAgICAgdGhpcy5zdHJva2VBbHBoYSA9IDE7XG4gICAgICAgICAgdGhpcy5saW5lV2lkdGggPSAxO1xuICAgICAgICAgIHRoaXMuYWN0aXZlU01hc2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMudHJhbnNmZXJNYXBzID0gXCJub25lXCI7XG4gICAgICAgICAgdGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCB0LCBlXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmUoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgICAgdC5jbGlwQm94ID0gdGhpcy5jbGlwQm94LnNsaWNlKCk7XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q3VycmVudFBvaW50KHQsIGUpIHtcbiAgICAgICAgICB0aGlzLnggPSB0O1xuICAgICAgICAgIHRoaXMueSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlUGF0aE1pbk1heCh0LCBlLCBuKSB7XG4gICAgICAgICAgW2UsIG5dID0gaS5VdGlsLmFwcGx5VHJhbnNmb3JtKFtlLCBuXSwgdCk7XG4gICAgICAgICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBlKTtcbiAgICAgICAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIG4pO1xuICAgICAgICAgIHRoaXMubWF4WCA9IE1hdGgubWF4KHRoaXMubWF4WCwgZSk7XG4gICAgICAgICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBuKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVSZWN0TWluTWF4KHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gaS5VdGlsLmFwcGx5VHJhbnNmb3JtKGUsIHQpLFxuICAgICAgICAgICAgciA9IGkuVXRpbC5hcHBseVRyYW5zZm9ybShlLnNsaWNlKDIpLCB0KTtcbiAgICAgICAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIG5bMF0sIHJbMF0pO1xuICAgICAgICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgblsxXSwgclsxXSk7XG4gICAgICAgICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCBuWzBdLCByWzBdKTtcbiAgICAgICAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIG5bMV0sIHJbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNjYWxpbmdQYXRoTWluTWF4KHQsIGUpIHtcbiAgICAgICAgICBpLlV0aWwuc2NhbGVNaW5NYXgodCwgZSk7XG4gICAgICAgICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBlWzBdKTtcbiAgICAgICAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIGVbMV0pO1xuICAgICAgICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgZVsyXSk7XG4gICAgICAgICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBlWzNdKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDdXJ2ZVBhdGhNaW5NYXgodCwgZSwgbiwgciwgcywgYSwgbywgbCwgYywgaCkge1xuICAgICAgICAgIGNvbnN0IGQgPSBpLlV0aWwuYmV6aWVyQm91bmRpbmdCb3goZSwgbiwgciwgcywgYSwgbywgbCwgYyk7XG4gICAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICAgIGhbMF0gPSBNYXRoLm1pbihoWzBdLCBkWzBdLCBkWzJdKTtcbiAgICAgICAgICAgIGhbMV0gPSBNYXRoLm1heChoWzFdLCBkWzBdLCBkWzJdKTtcbiAgICAgICAgICAgIGhbMl0gPSBNYXRoLm1pbihoWzJdLCBkWzFdLCBkWzNdKTtcbiAgICAgICAgICAgIGhbM10gPSBNYXRoLm1heChoWzNdLCBkWzFdLCBkWzNdKTtcbiAgICAgICAgICB9IGVsc2UgdGhpcy51cGRhdGVSZWN0TWluTWF4KHQsIGQpO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhdGhCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogcy5QYXRoVHlwZS5GSUxMLFxuICAgICAgICAgICAgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gW3RoaXMubWluWCwgdGhpcy5taW5ZLCB0aGlzLm1heFgsIHRoaXMubWF4WV07XG4gICAgICAgICAgaWYgKHQgPT09IHMuUGF0aFR5cGUuU1RST0tFKSB7XG4gICAgICAgICAgICBlIHx8ICgwLCBpLnVucmVhY2hhYmxlKShcIlN0cm9rZSBib3VuZGluZyBib3ggbXVzdCBpbmNsdWRlIHRyYW5zZm9ybS5cIik7XG4gICAgICAgICAgICBjb25zdCB0ID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUpLFxuICAgICAgICAgICAgICByID0gdFswXSAqIHRoaXMubGluZVdpZHRoIC8gMixcbiAgICAgICAgICAgICAgcyA9IHRbMV0gKiB0aGlzLmxpbmVXaWR0aCAvIDI7XG4gICAgICAgICAgICBuWzBdIC09IHI7XG4gICAgICAgICAgICBuWzFdIC09IHM7XG4gICAgICAgICAgICBuWzJdICs9IHI7XG4gICAgICAgICAgICBuWzNdICs9IHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNsaXBGcm9tUGF0aCgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gaS5VdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsIHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KCkpO1xuICAgICAgICAgIHRoaXMuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0IHx8IFswLCAwLCAwLCAwXSk7XG4gICAgICAgIH1cbiAgICAgICAgaXNFbXB0eUNsaXAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWluWCA9PT0gMSAvIDA7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0KSB7XG4gICAgICAgICAgdGhpcy5jbGlwQm94ID0gdDtcbiAgICAgICAgICB0aGlzLm1pblggPSAxIC8gMDtcbiAgICAgICAgICB0aGlzLm1pblkgPSAxIC8gMDtcbiAgICAgICAgICB0aGlzLm1heFggPSAwO1xuICAgICAgICAgIHRoaXMubWF4WSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICBsZXQgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogcy5QYXRoVHlwZS5GSUxMLFxuICAgICAgICAgICAgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gaS5VdGlsLmludGVyc2VjdCh0aGlzLmNsaXBCb3gsIHRoaXMuZ2V0UGF0aEJvdW5kaW5nQm94KHQsIGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VEYXRhKHQsIGUpIHtcbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEltYWdlRGF0YSAmJiBlIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG4gICAgICAgICAgdC5wdXRJbWFnZURhdGEoZSwgMCwgMCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG4gPSBlLmhlaWdodCxcbiAgICAgICAgICByID0gZS53aWR0aCxcbiAgICAgICAgICBzID0gbiAlIGwsXG4gICAgICAgICAgYSA9IChuIC0gcykgLyBsLFxuICAgICAgICAgIG8gPSAwID09PSBzID8gYSA6IGEgKyAxLFxuICAgICAgICAgIGMgPSB0LmNyZWF0ZUltYWdlRGF0YShyLCBsKTtcbiAgICAgICAgbGV0IGgsXG4gICAgICAgICAgZCA9IDA7XG4gICAgICAgIGNvbnN0IHUgPSBlLmRhdGEsXG4gICAgICAgICAgcCA9IGMuZGF0YTtcbiAgICAgICAgbGV0IGYsIGcsIG0sIGI7XG4gICAgICAgIGlmIChlLmtpbmQgPT09IGkuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKSB7XG4gICAgICAgICAgY29uc3QgZSA9IHUuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIG4gPSBuZXcgVWludDMyQXJyYXkocC5idWZmZXIsIDAsIHAuYnl0ZUxlbmd0aCA+PiAyKSxcbiAgICAgICAgICAgIGIgPSBuLmxlbmd0aCxcbiAgICAgICAgICAgIHYgPSByICsgNyA+PiAzLFxuICAgICAgICAgICAgeSA9IDQyOTQ5NjcyOTUsXG4gICAgICAgICAgICBBID0gaS5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDQyNzgxOTAwODAgOiAyNTU7XG4gICAgICAgICAgZm9yIChmID0gMDsgZiA8IG87IGYrKykge1xuICAgICAgICAgICAgbSA9IGYgPCBhID8gbCA6IHM7XG4gICAgICAgICAgICBoID0gMDtcbiAgICAgICAgICAgIGZvciAoZyA9IDA7IGcgPCBtOyBnKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGUgLSBkO1xuICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgIGNvbnN0IHMgPSB0ID4gdiA/IHIgOiA4ICogdCAtIDcsXG4gICAgICAgICAgICAgICAgYSA9IC04ICYgcztcbiAgICAgICAgICAgICAgbGV0IG8gPSAwLFxuICAgICAgICAgICAgICAgIGwgPSAwO1xuICAgICAgICAgICAgICBmb3IgKDsgaSA8IGE7IGkgKz0gOCkge1xuICAgICAgICAgICAgICAgIGwgPSB1W2QrK107XG4gICAgICAgICAgICAgICAgbltoKytdID0gMTI4ICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDY0ICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDMyICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDE2ICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDggJiBsID8geSA6IEE7XG4gICAgICAgICAgICAgICAgbltoKytdID0gNCAmIGwgPyB5IDogQTtcbiAgICAgICAgICAgICAgICBuW2grK10gPSAyICYgbCA/IHkgOiBBO1xuICAgICAgICAgICAgICAgIG5baCsrXSA9IDEgJiBsID8geSA6IEE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gbykge1xuICAgICAgICAgICAgICAgICAgbCA9IHVbZCsrXTtcbiAgICAgICAgICAgICAgICAgIG8gPSAxMjg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5baCsrXSA9IGwgJiBvID8geSA6IEE7XG4gICAgICAgICAgICAgICAgbyA+Pj0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7IGggPCBiOykgbltoKytdID0gMDtcbiAgICAgICAgICAgIHQucHV0SW1hZ2VEYXRhKGMsIDAsIGYgKiBsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5raW5kID09PSBpLkltYWdlS2luZC5SR0JBXzMyQlBQKSB7XG4gICAgICAgICAgZyA9IDA7XG4gICAgICAgICAgYiA9IHIgKiBsICogNDtcbiAgICAgICAgICBmb3IgKGYgPSAwOyBmIDwgYTsgZisrKSB7XG4gICAgICAgICAgICBwLnNldCh1LnN1YmFycmF5KGQsIGQgKyBiKSk7XG4gICAgICAgICAgICBkICs9IGI7XG4gICAgICAgICAgICB0LnB1dEltYWdlRGF0YShjLCAwLCBnKTtcbiAgICAgICAgICAgIGcgKz0gbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGYgPCBvKSB7XG4gICAgICAgICAgICBiID0gciAqIHMgKiA0O1xuICAgICAgICAgICAgcC5zZXQodS5zdWJhcnJheShkLCBkICsgYikpO1xuICAgICAgICAgICAgdC5wdXRJbWFnZURhdGEoYywgMCwgZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlLmtpbmQgIT09IGkuSW1hZ2VLaW5kLlJHQl8yNEJQUCkgdGhyb3cgbmV3IEVycm9yKFwiYmFkIGltYWdlIGtpbmQ6IFwiLmNvbmNhdChlLmtpbmQpKTtcbiAgICAgICAgICBtID0gbDtcbiAgICAgICAgICBiID0gciAqIG07XG4gICAgICAgICAgZm9yIChmID0gMDsgZiA8IG87IGYrKykge1xuICAgICAgICAgICAgaWYgKGYgPj0gYSkge1xuICAgICAgICAgICAgICBtID0gcztcbiAgICAgICAgICAgICAgYiA9IHIgKiBtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaCA9IDA7XG4gICAgICAgICAgICBmb3IgKGcgPSBiOyBnLS07KSB7XG4gICAgICAgICAgICAgIHBbaCsrXSA9IHVbZCsrXTtcbiAgICAgICAgICAgICAgcFtoKytdID0gdVtkKytdO1xuICAgICAgICAgICAgICBwW2grK10gPSB1W2QrK107XG4gICAgICAgICAgICAgIHBbaCsrXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHQucHV0SW1hZ2VEYXRhKGMsIDAsIGYgKiBsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHB1dEJpbmFyeUltYWdlTWFzayh0LCBlKSB7XG4gICAgICAgIGlmIChlLmJpdG1hcCkge1xuICAgICAgICAgIHQuZHJhd0ltYWdlKGUuYml0bWFwLCAwLCAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbiA9IGUuaGVpZ2h0LFxuICAgICAgICAgIGkgPSBlLndpZHRoLFxuICAgICAgICAgIHIgPSBuICUgbCxcbiAgICAgICAgICBzID0gKG4gLSByKSAvIGwsXG4gICAgICAgICAgbyA9IDAgPT09IHIgPyBzIDogcyArIDEsXG4gICAgICAgICAgYyA9IHQuY3JlYXRlSW1hZ2VEYXRhKGksIGwpO1xuICAgICAgICBsZXQgaCA9IDA7XG4gICAgICAgIGNvbnN0IGQgPSBlLmRhdGEsXG4gICAgICAgICAgdSA9IGMuZGF0YTtcbiAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBvOyBlKyspIHtcbiAgICAgICAgICBjb25zdCBuID0gZSA8IHMgPyBsIDogcjtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgc3JjUG9zOiBoXG4gICAgICAgICAgfSA9ICgwLCBhLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7XG4gICAgICAgICAgICBzcmM6IGQsXG4gICAgICAgICAgICBzcmNQb3M6IGgsXG4gICAgICAgICAgICBkZXN0OiB1LFxuICAgICAgICAgICAgd2lkdGg6IGksXG4gICAgICAgICAgICBoZWlnaHQ6IG4sXG4gICAgICAgICAgICBub25CbGFja0NvbG9yOiAwXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHQucHV0SW1hZ2VEYXRhKGMsIDAsIGUgKiBsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY29weUN0eFN0YXRlKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IFtcInN0cm9rZVN0eWxlXCIsIFwiZmlsbFN0eWxlXCIsIFwiZmlsbFJ1bGVcIiwgXCJnbG9iYWxBbHBoYVwiLCBcImxpbmVXaWR0aFwiLCBcImxpbmVDYXBcIiwgXCJsaW5lSm9pblwiLCBcIm1pdGVyTGltaXRcIiwgXCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cIiwgXCJmb250XCIsIFwiZmlsdGVyXCJdO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2Ygbikgdm9pZCAwICE9PSB0W2ldICYmIChlW2ldID0gdFtpXSk7XG4gICAgICAgIGlmICh2b2lkIDAgIT09IHQuc2V0TGluZURhc2gpIHtcbiAgICAgICAgICBlLnNldExpbmVEYXNoKHQuZ2V0TGluZURhc2goKSk7XG4gICAgICAgICAgZS5saW5lRGFzaE9mZnNldCA9IHQubGluZURhc2hPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KHQpIHtcbiAgICAgICAgdC5zdHJva2VTdHlsZSA9IHQuZmlsbFN0eWxlID0gXCIjMDAwMDAwXCI7XG4gICAgICAgIHQuZmlsbFJ1bGUgPSBcIm5vbnplcm9cIjtcbiAgICAgICAgdC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgICAgIHQubGluZVdpZHRoID0gMTtcbiAgICAgICAgdC5saW5lQ2FwID0gXCJidXR0XCI7XG4gICAgICAgIHQubGluZUpvaW4gPSBcIm1pdGVyXCI7XG4gICAgICAgIHQubWl0ZXJMaW1pdCA9IDEwO1xuICAgICAgICB0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcbiAgICAgICAgdC5mb250ID0gXCIxMHB4IHNhbnMtc2VyaWZcIjtcbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gdC5zZXRMaW5lRGFzaCkge1xuICAgICAgICAgIHQuc2V0TGluZURhc2goW10pO1xuICAgICAgICAgIHQubGluZURhc2hPZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaS5pc05vZGVKUykge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZpbHRlcjogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIFwibm9uZVwiICE9PSBlICYmIFwiXCIgIT09IGUgJiYgKHQuZmlsdGVyID0gXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjb21wb3NlU01hc2tCYWNrZHJvcCh0LCBlLCBuLCBpKSB7XG4gICAgICAgIGNvbnN0IHIgPSB0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcyA9IDM7IHMgPCByOyBzICs9IDQpIHtcbiAgICAgICAgICBjb25zdCByID0gdFtzXTtcbiAgICAgICAgICBpZiAoMCA9PT0gcikge1xuICAgICAgICAgICAgdFtzIC0gM10gPSBlO1xuICAgICAgICAgICAgdFtzIC0gMl0gPSBuO1xuICAgICAgICAgICAgdFtzIC0gMV0gPSBpO1xuICAgICAgICAgIH0gZWxzZSBpZiAociA8IDI1NSkge1xuICAgICAgICAgICAgY29uc3QgYSA9IDI1NSAtIHI7XG4gICAgICAgICAgICB0W3MgLSAzXSA9IHRbcyAtIDNdICogciArIGUgKiBhID4+IDg7XG4gICAgICAgICAgICB0W3MgLSAyXSA9IHRbcyAtIDJdICogciArIG4gKiBhID4+IDg7XG4gICAgICAgICAgICB0W3MgLSAxXSA9IHRbcyAtIDFdICogciArIGkgKiBhID4+IDg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjb21wb3NlU01hc2tBbHBoYSh0LCBlLCBuKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgciA9IDM7IHIgPCBpOyByICs9IDQpIHtcbiAgICAgICAgICBjb25zdCBpID0gbiA/IG5bdFtyXV0gOiB0W3JdO1xuICAgICAgICAgIGVbcl0gPSBlW3JdICogaSAqIC4wMDM5MjE1Njg2Mjc0NTA5OCB8IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNvbXBvc2VTTWFza0x1bWlub3NpdHkodCwgZSwgbikge1xuICAgICAgICBjb25zdCBpID0gdC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IHIgPSAzOyByIDwgaTsgciArPSA0KSB7XG4gICAgICAgICAgY29uc3QgaSA9IDc3ICogdFtyIC0gM10gKyAxNTIgKiB0W3IgLSAyXSArIDI4ICogdFtyIC0gMV07XG4gICAgICAgICAgZVtyXSA9IG4gPyBlW3JdICogbltpID4+IDhdID4+IDggOiBlW3JdICogaSA+PiAxNjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY29tcG9zZVNNYXNrKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgY29uc3QgciA9IGlbMF0sXG4gICAgICAgICAgcyA9IGlbMV0sXG4gICAgICAgICAgYSA9IGlbMl0gLSByLFxuICAgICAgICAgIG8gPSBpWzNdIC0gcztcbiAgICAgICAgaWYgKDAgIT09IGEgJiYgMCAhPT0gbykge1xuICAgICAgICAgICFmdW5jdGlvbiBnZW5lcmljQ29tcG9zZVNNYXNrKHQsIGUsIG4sIGksIHIsIHMsIGEsIG8sIGwsIGMsIGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSAhIXMsXG4gICAgICAgICAgICAgIHUgPSBkID8gc1swXSA6IDAsXG4gICAgICAgICAgICAgIHAgPSBkID8gc1sxXSA6IDAsXG4gICAgICAgICAgICAgIGYgPSBkID8gc1syXSA6IDAsXG4gICAgICAgICAgICAgIGcgPSBcIkx1bWlub3NpdHlcIiA9PT0gciA/IGNvbXBvc2VTTWFza0x1bWlub3NpdHkgOiBjb21wb3NlU01hc2tBbHBoYSxcbiAgICAgICAgICAgICAgbSA9IE1hdGgubWluKGksIE1hdGguY2VpbCgxMDQ4NTc2IC8gbikpO1xuICAgICAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBpOyByICs9IG0pIHtcbiAgICAgICAgICAgICAgY29uc3QgcyA9IE1hdGgubWluKG0sIGkgLSByKSxcbiAgICAgICAgICAgICAgICBiID0gdC5nZXRJbWFnZURhdGEobyAtIGMsIHIgKyAobCAtIGgpLCBuLCBzKSxcbiAgICAgICAgICAgICAgICB2ID0gZS5nZXRJbWFnZURhdGEobywgciArIGwsIG4sIHMpO1xuICAgICAgICAgICAgICBkICYmIGNvbXBvc2VTTWFza0JhY2tkcm9wKGIuZGF0YSwgdSwgcCwgZik7XG4gICAgICAgICAgICAgIGcoYi5kYXRhLCB2LmRhdGEsIGEpO1xuICAgICAgICAgICAgICBlLnB1dEltYWdlRGF0YSh2LCBvLCByICsgbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfShlLmNvbnRleHQsIG4sIGEsIG8sIGUuc3VidHlwZSwgZS5iYWNrZHJvcCwgZS50cmFuc2Zlck1hcCwgciwgcywgZS5vZmZzZXRYLCBlLm9mZnNldFkpO1xuICAgICAgICAgIHQuc2F2ZSgpO1xuICAgICAgICAgIHQuZ2xvYmFsQWxwaGEgPSAxO1xuICAgICAgICAgIHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2Utb3ZlclwiO1xuICAgICAgICAgIHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICAgIHQuZHJhd0ltYWdlKG4uY2FudmFzLCAwLCAwKTtcbiAgICAgICAgICB0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKHQsIGUpIHtcbiAgICAgICAgY29uc3QgbiA9IGkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0KTtcbiAgICAgICAgblswXSA9IE1hdGguZnJvdW5kKG5bMF0pO1xuICAgICAgICBuWzFdID0gTWF0aC5mcm91bmQoblsxXSk7XG4gICAgICAgIGNvbnN0IHMgPSBNYXRoLmZyb3VuZCgoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpICogci5QaXhlbHNQZXJJbmNoLlBERl9UT19DU1NfVU5JVFMpO1xuICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlID8gZSA6IG5bMF0gPD0gcyB8fCBuWzFdIDw9IHM7XG4gICAgICB9XG4gICAgICBjb25zdCBjID0gW1wiYnV0dFwiLCBcInJvdW5kXCIsIFwic3F1YXJlXCJdLFxuICAgICAgICBoID0gW1wibWl0ZXJcIiwgXCJyb3VuZFwiLCBcImJldmVsXCJdLFxuICAgICAgICBkID0ge30sXG4gICAgICAgIHUgPSB7fTtcbiAgICAgIHZhciBfR3QgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfVnQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIENhbnZhc0dyYXBoaWNzIHtcbiAgICAgICAgY29uc3RydWN0b3IoX3QxMCwgX2U5LCBuLCBpLCByLCBzLCBhLCBvKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9WdCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9HdCk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogbCxcbiAgICAgICAgICAgIG1hcmtlZENvbnRlbnRTdGFjazogYyA9IG51bGxcbiAgICAgICAgICB9ID0gcztcbiAgICAgICAgICB0aGlzLmN0eCA9IF90MTA7XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMTtcbiAgICAgICAgICB0aGlzLnJlcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy54b2JqcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5jb21tb25PYmpzID0gX2U5O1xuICAgICAgICAgIHRoaXMub2JqcyA9IG47XG4gICAgICAgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gaTtcbiAgICAgICAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSByO1xuICAgICAgICAgIHRoaXMuZ3JvdXBTdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBudWxsO1xuICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrID0gW107XG4gICAgICAgICAgdGhpcy5ncm91cExldmVsID0gMDtcbiAgICAgICAgICB0aGlzLnNtYXNrU3RhY2sgPSBbXTtcbiAgICAgICAgICB0aGlzLnNtYXNrQ291bnRlciA9IDA7XG4gICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gITA7XG4gICAgICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sgPSBjIHx8IFtdO1xuICAgICAgICAgIHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnID0gbDtcbiAgICAgICAgICB0aGlzLmNhY2hlZENhbnZhc2VzID0gbmV3IENhY2hlZENhbnZhc2VzKHRoaXMuY2FudmFzRmFjdG9yeSk7XG4gICAgICAgICAgdGhpcy5jYWNoZWRQYXR0ZXJucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBhO1xuICAgICAgICAgIHRoaXMudmlld3BvcnRTY2FsZSA9IDE7XG4gICAgICAgICAgdGhpcy5vdXRwdXRTY2FsZVggPSAxO1xuICAgICAgICAgIHRoaXMub3V0cHV0U2NhbGVZID0gMTtcbiAgICAgICAgICB0aGlzLnBhZ2VDb2xvcnMgPSBvO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmcgPSBbLTEsIDBdO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T2JqZWN0KHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gXCJzdHJpbmdcIiA9PSB0eXBlb2YgdCA/IHQuc3RhcnRzV2l0aChcImdfXCIpID8gdGhpcy5jb21tb25PYmpzLmdldCh0KSA6IHRoaXMub2Jqcy5nZXQodCkgOiBlO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luRHJhd2luZyh0KSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogZSxcbiAgICAgICAgICAgIHZpZXdwb3J0OiBuLFxuICAgICAgICAgICAgdHJhbnNwYXJlbmN5OiBpID0gITEsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBzID0gbnVsbFxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLmN0eC5jYW52YXMud2lkdGgsXG4gICAgICAgICAgICBvID0gdGhpcy5jdHguY2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgIGwgPSB0aGlzLmN0eC5maWxsU3R5bGU7XG4gICAgICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gcyB8fCBcIiNmZmZmZmZcIjtcbiAgICAgICAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCBhLCBvKTtcbiAgICAgICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBsO1xuICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJ0cmFuc3BhcmVudFwiLCBhLCBvKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRlQ3R4ID0gdGhpcy5jdHg7XG4gICAgICAgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gdC5jYW52YXM7XG4gICAgICAgICAgICB0aGlzLmN0eCA9IHQuY29udGV4dDtcbiAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi4oMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmNvbXBvc2l0ZUN0eCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4uZSk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dFNjYWxlWCA9IGVbMF07XG4gICAgICAgICAgICB0aGlzLm91dHB1dFNjYWxlWSA9IGVbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi5uLnRyYW5zZm9ybSk7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFNjYWxlID0gbi5zY2FsZTtcbiAgICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY3V0ZU9wZXJhdG9yTGlzdCh0LCBlLCBuLCByKSB7XG4gICAgICAgICAgY29uc3QgcyA9IHQuYXJnc0FycmF5LFxuICAgICAgICAgICAgYSA9IHQuZm5BcnJheTtcbiAgICAgICAgICBsZXQgbyA9IGUgfHwgMDtcbiAgICAgICAgICBjb25zdCBsID0gcy5sZW5ndGg7XG4gICAgICAgICAgaWYgKGwgPT09IG8pIHJldHVybiBvO1xuICAgICAgICAgIGNvbnN0IGMgPSBsIC0gbyA+IDEwICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgbixcbiAgICAgICAgICAgIGggPSBjID8gRGF0ZS5ub3coKSArIDE1IDogMDtcbiAgICAgICAgICBsZXQgZCA9IDA7XG4gICAgICAgICAgY29uc3QgdSA9IHRoaXMuY29tbW9uT2JqcyxcbiAgICAgICAgICAgIHAgPSB0aGlzLm9ianM7XG4gICAgICAgICAgbGV0IGY7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gciAmJiBvID09PSByLm5leHRCcmVha1BvaW50KSB7XG4gICAgICAgICAgICAgIHIuYnJlYWtJdChvLCBuKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmID0gYVtvXTtcbiAgICAgICAgICAgIGlmIChmICE9PSBpLk9QUy5kZXBlbmRlbmN5KSB0aGlzW2ZdLmFwcGx5KHRoaXMsIHNbb10pO2Vsc2UgZm9yIChjb25zdCB0IG9mIHNbb10pIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IHQuc3RhcnRzV2l0aChcImdfXCIpID8gdSA6IHA7XG4gICAgICAgICAgICAgIGlmICghZS5oYXModCkpIHtcbiAgICAgICAgICAgICAgICBlLmdldCh0LCBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbysrO1xuICAgICAgICAgICAgaWYgKG8gPT09IGwpIHJldHVybiBvO1xuICAgICAgICAgICAgaWYgKGMgJiYgKytkID4gMTApIHtcbiAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPiBoKSB7XG4gICAgICAgICAgICAgICAgbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbmREcmF3aW5nKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0d0LCBfR3QyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMuY2xlYXIoKTtcbiAgICAgICAgICB0aGlzLmNhY2hlZFBhdHRlcm5zLmNsZWFyKCk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0LnZhbHVlcygpKSBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAmJiBlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgJiYgKGUud2lkdGggPSBlLmhlaWdodCA9IDApO1xuICAgICAgICAgICAgdC5jbGVhcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLmNsZWFyKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVnQsIF9WdDIpLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX3NjYWxlSW1hZ2UodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0LndpZHRoLFxuICAgICAgICAgICAgaSA9IHQuaGVpZ2h0O1xuICAgICAgICAgIGxldCByLFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGEgPSBNYXRoLm1heChNYXRoLmh5cG90KGVbMF0sIGVbMV0pLCAxKSxcbiAgICAgICAgICAgIG8gPSBNYXRoLm1heChNYXRoLmh5cG90KGVbMl0sIGVbM10pLCAxKSxcbiAgICAgICAgICAgIGwgPSBuLFxuICAgICAgICAgICAgYyA9IGksXG4gICAgICAgICAgICBoID0gXCJwcmVzY2FsZTFcIjtcbiAgICAgICAgICBmb3IgKDsgYSA+IDIgJiYgbCA+IDEgfHwgbyA+IDIgJiYgYyA+IDE7KSB7XG4gICAgICAgICAgICBsZXQgZSA9IGwsXG4gICAgICAgICAgICAgIG4gPSBjO1xuICAgICAgICAgICAgaWYgKGEgPiAyICYmIGwgPiAxKSB7XG4gICAgICAgICAgICAgIGUgPSBsID49IDE2Mzg0ID8gTWF0aC5mbG9vcihsIC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwobCAvIDIpO1xuICAgICAgICAgICAgICBhIC89IGwgLyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG8gPiAyICYmIGMgPiAxKSB7XG4gICAgICAgICAgICAgIG4gPSBjID49IDE2Mzg0ID8gTWF0aC5mbG9vcihjIC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwoYykgLyAyO1xuICAgICAgICAgICAgICBvIC89IGMgLyBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgciA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKGgsIGUsIG4pO1xuICAgICAgICAgICAgcyA9IHIuY29udGV4dDtcbiAgICAgICAgICAgIHMuY2xlYXJSZWN0KDAsIDAsIGUsIG4pO1xuICAgICAgICAgICAgcy5kcmF3SW1hZ2UodCwgMCwgMCwgbCwgYywgMCwgMCwgZSwgbik7XG4gICAgICAgICAgICB0ID0gci5jYW52YXM7XG4gICAgICAgICAgICBsID0gZTtcbiAgICAgICAgICAgIGMgPSBuO1xuICAgICAgICAgICAgaCA9IFwicHJlc2NhbGUxXCIgPT09IGggPyBcInByZXNjYWxlMlwiIDogXCJwcmVzY2FsZTFcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGltZzogdCxcbiAgICAgICAgICAgIHBhaW50V2lkdGg6IGwsXG4gICAgICAgICAgICBwYWludEhlaWdodDogY1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZU1hc2tDYW52YXModCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd2lkdGg6IG4sXG4gICAgICAgICAgICAgIGhlaWdodDogYVxuICAgICAgICAgICAgfSA9IHQsXG4gICAgICAgICAgICBvID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcixcbiAgICAgICAgICAgIGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwsXG4gICAgICAgICAgICBjID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkoZSk7XG4gICAgICAgICAgbGV0IGgsIGQsIHUsIHA7XG4gICAgICAgICAgaWYgKCh0LmJpdG1hcCB8fCB0LmRhdGEpICYmIHQuY291bnQgPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5iaXRtYXAgfHwgdC5kYXRhLmJ1ZmZlcjtcbiAgICAgICAgICAgIGQgPSBKU09OLnN0cmluZ2lmeShsID8gYyA6IFtjLnNsaWNlKDAsIDQpLCBvXSk7XG4gICAgICAgICAgICBoID0gdGhpcy5fY2FjaGVkQml0bWFwc01hcC5nZXQoZSk7XG4gICAgICAgICAgICBpZiAoIWgpIHtcbiAgICAgICAgICAgICAgaCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcC5zZXQoZSwgaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuID0gaC5nZXQoZCk7XG4gICAgICAgICAgICBpZiAobiAmJiAhbCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNhbnZhczogbixcbiAgICAgICAgICAgICAgICBvZmZzZXRYOiBNYXRoLnJvdW5kKE1hdGgubWluKGNbMF0sIGNbMl0pICsgY1s0XSksXG4gICAgICAgICAgICAgICAgb2Zmc2V0WTogTWF0aC5yb3VuZChNYXRoLm1pbihjWzFdLCBjWzNdKSArIGNbNV0pXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1ID0gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgICBwID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtYXNrQ2FudmFzXCIsIG4sIGEpO1xuICAgICAgICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKHAuY29udGV4dCwgdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBmID0gaS5VdGlsLnRyYW5zZm9ybShjLCBbMSAvIG4sIDAsIDAsIC0xIC8gYSwgMCwgMF0pO1xuICAgICAgICAgIGYgPSBpLlV0aWwudHJhbnNmb3JtKGYsIFsxLCAwLCAwLCAxLCAwLCAtYV0pO1xuICAgICAgICAgIGNvbnN0IGcgPSBpLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBmKSxcbiAgICAgICAgICAgIG0gPSBpLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW24sIGFdLCBmKSxcbiAgICAgICAgICAgIGIgPSBpLlV0aWwubm9ybWFsaXplUmVjdChbZ1swXSwgZ1sxXSwgbVswXSwgbVsxXV0pLFxuICAgICAgICAgICAgdiA9IE1hdGgucm91bmQoYlsyXSAtIGJbMF0pIHx8IDEsXG4gICAgICAgICAgICB5ID0gTWF0aC5yb3VuZChiWzNdIC0gYlsxXSkgfHwgMSxcbiAgICAgICAgICAgIEEgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImZpbGxDYW52YXNcIiwgdiwgeSksXG4gICAgICAgICAgICBfID0gQS5jb250ZXh0LFxuICAgICAgICAgICAgUyA9IE1hdGgubWluKGdbMF0sIG1bMF0pLFxuICAgICAgICAgICAgRSA9IE1hdGgubWluKGdbMV0sIG1bMV0pO1xuICAgICAgICAgIF8udHJhbnNsYXRlKC1TLCAtRSk7XG4gICAgICAgICAgXy50cmFuc2Zvcm0oLi4uZik7XG4gICAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgICB1ID0gdGhpcy5fc2NhbGVJbWFnZShwLmNhbnZhcywgKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKF8pKTtcbiAgICAgICAgICAgIHUgPSB1LmltZztcbiAgICAgICAgICAgIGggJiYgbCAmJiBoLnNldChkLCB1KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXy5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkoXyksIHQuaW50ZXJwb2xhdGUpO1xuICAgICAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhfLCB1LCAwLCAwLCB1LndpZHRoLCB1LmhlaWdodCwgMCwgMCwgbiwgYSk7XG4gICAgICAgICAgXy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuICAgICAgICAgIGNvbnN0IHggPSBpLlV0aWwudHJhbnNmb3JtKCgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShfKSwgWzEsIDAsIDAsIDEsIC1TLCAtRV0pO1xuICAgICAgICAgIF8uZmlsbFN0eWxlID0gbCA/IG8uZ2V0UGF0dGVybihlLCB0aGlzLCB4LCBzLlBhdGhUeXBlLkZJTEwpIDogbztcbiAgICAgICAgICBfLmZpbGxSZWN0KDAsIDAsIG4sIGEpO1xuICAgICAgICAgIGlmIChoICYmICFsKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlZENhbnZhc2VzLmRlbGV0ZShcImZpbGxDYW52YXNcIik7XG4gICAgICAgICAgICBoLnNldChkLCBBLmNhbnZhcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW52YXM6IEEuY2FudmFzLFxuICAgICAgICAgICAgb2Zmc2V0WDogTWF0aC5yb3VuZChTKSxcbiAgICAgICAgICAgIG9mZnNldFk6IE1hdGgucm91bmQoRSlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVXaWR0aCh0KSB7XG4gICAgICAgICAgdCAhPT0gdGhpcy5jdXJyZW50LmxpbmVXaWR0aCAmJiAodGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gdDtcbiAgICAgICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB0O1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVDYXAodCkge1xuICAgICAgICAgIHRoaXMuY3R4LmxpbmVDYXAgPSBjW3RdO1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVKb2luKHQpIHtcbiAgICAgICAgICB0aGlzLmN0eC5saW5lSm9pbiA9IGhbdF07XG4gICAgICAgIH1cbiAgICAgICAgc2V0TWl0ZXJMaW1pdCh0KSB7XG4gICAgICAgICAgdGhpcy5jdHgubWl0ZXJMaW1pdCA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RGFzaCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3R4O1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IG4uc2V0TGluZURhc2gpIHtcbiAgICAgICAgICAgIG4uc2V0TGluZURhc2godCk7XG4gICAgICAgICAgICBuLmxpbmVEYXNoT2Zmc2V0ID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVuZGVyaW5nSW50ZW50KHQpIHt9XG4gICAgICAgIHNldEZsYXRuZXNzKHQpIHt9XG4gICAgICAgIHNldEdTdGF0ZSh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZSwgbl0gb2YgdCkgc3dpdGNoIChlKSB7XG4gICAgICAgICAgICBjYXNlIFwiTFdcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkxDXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcChuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTUxcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RGFzaChuWzBdLCBuWzFdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUklcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZMXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3Mobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb250KG5bMF0sIG5bMV0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJDQVwiOlxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gbjtcbiAgICAgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJCTVwiOlxuICAgICAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJTTWFza1wiOlxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSBuID8gdGhpcy50ZW1wU01hc2sgOiBudWxsO1xuICAgICAgICAgICAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tTTWFza1N0YXRlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIlRSXCI6XG4gICAgICAgICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkRmlsdGVyKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgaW5TTWFza01vZGUoKSB7XG4gICAgICAgICAgcmV0dXJuICEhdGhpcy5zdXNwZW5kZWRDdHg7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tTTWFza1N0YXRlKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmluU01hc2tNb2RlO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAmJiAhdCA/IHRoaXMuYmVnaW5TTWFza01vZGUoKSA6ICF0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgJiYgdCAmJiB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luU01hc2tNb2RlKCkge1xuICAgICAgICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJiZWdpblNNYXNrTW9kZSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBpbiBzbWFzayBtb2RlXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN0eC5jYW52YXMud2lkdGgsXG4gICAgICAgICAgICBlID0gdGhpcy5jdHguY2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgIG4gPSBcInNtYXNrR3JvdXBBdFwiICsgdGhpcy5ncm91cExldmVsLFxuICAgICAgICAgICAgaSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKG4sIHQsIGUpO1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gdGhpcy5jdHg7XG4gICAgICAgICAgdGhpcy5jdHggPSBpLmNvbnRleHQ7XG4gICAgICAgICAgY29uc3QgcyA9IHRoaXMuY3R4O1xuICAgICAgICAgIHMuc2V0VHJhbnNmb3JtKC4uLigwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuc3VzcGVuZGVkQ3R4KSk7XG4gICAgICAgICAgY29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LCBzKTtcbiAgICAgICAgICAhZnVuY3Rpb24gbWlycm9yQ29udGV4dE9wZXJhdGlvbnModCwgZSkge1xuICAgICAgICAgICAgaWYgKHQuX3JlbW92ZU1pcnJvcmluZykgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBpcyBhbHJlYWR5IGZvcndhcmRpbmcgb3BlcmF0aW9ucy5cIik7XG4gICAgICAgICAgICB0Ll9fb3JpZ2luYWxTYXZlID0gdC5zYXZlO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsUmVzdG9yZSA9IHQucmVzdG9yZTtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbFJvdGF0ZSA9IHQucm90YXRlO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsU2NhbGUgPSB0LnNjYWxlO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsVHJhbnNsYXRlID0gdC50cmFuc2xhdGU7XG4gICAgICAgICAgICB0Ll9fb3JpZ2luYWxUcmFuc2Zvcm0gPSB0LnRyYW5zZm9ybTtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbFNldFRyYW5zZm9ybSA9IHQuc2V0VHJhbnNmb3JtO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm0gPSB0LnJlc2V0VHJhbnNmb3JtO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsQ2xpcCA9IHQuY2xpcDtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbE1vdmVUbyA9IHQubW92ZVRvO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsTGluZVRvID0gdC5saW5lVG87XG4gICAgICAgICAgICB0Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvID0gdC5iZXppZXJDdXJ2ZVRvO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsUmVjdCA9IHQucmVjdDtcbiAgICAgICAgICAgIHQuX19vcmlnaW5hbENsb3NlUGF0aCA9IHQuY2xvc2VQYXRoO1xuICAgICAgICAgICAgdC5fX29yaWdpbmFsQmVnaW5QYXRoID0gdC5iZWdpblBhdGg7XG4gICAgICAgICAgICB0Ll9yZW1vdmVNaXJyb3JpbmcgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIHQuc2F2ZSA9IHQuX19vcmlnaW5hbFNhdmU7XG4gICAgICAgICAgICAgIHQucmVzdG9yZSA9IHQuX19vcmlnaW5hbFJlc3RvcmU7XG4gICAgICAgICAgICAgIHQucm90YXRlID0gdC5fX29yaWdpbmFsUm90YXRlO1xuICAgICAgICAgICAgICB0LnNjYWxlID0gdC5fX29yaWdpbmFsU2NhbGU7XG4gICAgICAgICAgICAgIHQudHJhbnNsYXRlID0gdC5fX29yaWdpbmFsVHJhbnNsYXRlO1xuICAgICAgICAgICAgICB0LnRyYW5zZm9ybSA9IHQuX19vcmlnaW5hbFRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgdC5zZXRUcmFuc2Zvcm0gPSB0Ll9fb3JpZ2luYWxTZXRUcmFuc2Zvcm07XG4gICAgICAgICAgICAgIHQucmVzZXRUcmFuc2Zvcm0gPSB0Ll9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgdC5jbGlwID0gdC5fX29yaWdpbmFsQ2xpcDtcbiAgICAgICAgICAgICAgdC5tb3ZlVG8gPSB0Ll9fb3JpZ2luYWxNb3ZlVG87XG4gICAgICAgICAgICAgIHQubGluZVRvID0gdC5fX29yaWdpbmFsTGluZVRvO1xuICAgICAgICAgICAgICB0LmJlemllckN1cnZlVG8gPSB0Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvO1xuICAgICAgICAgICAgICB0LnJlY3QgPSB0Ll9fb3JpZ2luYWxSZWN0O1xuICAgICAgICAgICAgICB0LmNsb3NlUGF0aCA9IHQuX19vcmlnaW5hbENsb3NlUGF0aDtcbiAgICAgICAgICAgICAgdC5iZWdpblBhdGggPSB0Ll9fb3JpZ2luYWxCZWdpblBhdGg7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0Ll9yZW1vdmVNaXJyb3Jpbmc7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5zYXZlID0gZnVuY3Rpb24gY3R4U2F2ZSgpIHtcbiAgICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFNhdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LnJlc3RvcmUgPSBmdW5jdGlvbiBjdHhSZXN0b3JlKCkge1xuICAgICAgICAgICAgICBlLnJlc3RvcmUoKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsUmVzdG9yZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQudHJhbnNsYXRlID0gZnVuY3Rpb24gY3R4VHJhbnNsYXRlKHQsIG4pIHtcbiAgICAgICAgICAgICAgZS50cmFuc2xhdGUodCwgbik7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFRyYW5zbGF0ZSh0LCBuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LnNjYWxlID0gZnVuY3Rpb24gY3R4U2NhbGUodCwgbikge1xuICAgICAgICAgICAgICBlLnNjYWxlKHQsIG4pO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxTY2FsZSh0LCBuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LnRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFRyYW5zZm9ybSh0LCBuLCBpLCByLCBzLCBhKSB7XG4gICAgICAgICAgICAgIGUudHJhbnNmb3JtKHQsIG4sIGksIHIsIHMsIGEpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2Zvcm0odCwgbiwgaSwgciwgcywgYSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhTZXRUcmFuc2Zvcm0odCwgbiwgaSwgciwgcywgYSkge1xuICAgICAgICAgICAgICBlLnNldFRyYW5zZm9ybSh0LCBuLCBpLCByLCBzLCBhKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsU2V0VHJhbnNmb3JtKHQsIG4sIGksIHIsIHMsIGEpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQucmVzZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhSZXNldFRyYW5zZm9ybSgpIHtcbiAgICAgICAgICAgICAgZS5yZXNldFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQucm90YXRlID0gZnVuY3Rpb24gY3R4Um90YXRlKHQpIHtcbiAgICAgICAgICAgICAgZS5yb3RhdGUodCk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbFJvdGF0ZSh0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LmNsaXAgPSBmdW5jdGlvbiBjdHhSb3RhdGUodCkge1xuICAgICAgICAgICAgICBlLmNsaXAodCk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbENsaXAodCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5tb3ZlVG8gPSBmdW5jdGlvbiAodCwgbikge1xuICAgICAgICAgICAgICBlLm1vdmVUbyh0LCBuKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsTW92ZVRvKHQsIG4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQubGluZVRvID0gZnVuY3Rpb24gKHQsIG4pIHtcbiAgICAgICAgICAgICAgZS5saW5lVG8odCwgbik7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbExpbmVUbyh0LCBuKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LmJlemllckN1cnZlVG8gPSBmdW5jdGlvbiAodCwgbiwgaSwgciwgcywgYSkge1xuICAgICAgICAgICAgICBlLmJlemllckN1cnZlVG8odCwgbiwgaSwgciwgcywgYSk7XG4gICAgICAgICAgICAgIHRoaXMuX19vcmlnaW5hbEJlemllckN1cnZlVG8odCwgbiwgaSwgciwgcywgYSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdC5yZWN0ID0gZnVuY3Rpb24gKHQsIG4sIGksIHIpIHtcbiAgICAgICAgICAgICAgZS5yZWN0KHQsIG4sIGksIHIpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxSZWN0KHQsIG4sIGksIHIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHQuY2xvc2VQYXRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBlLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxDbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0LmJlZ2luUGF0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgZS5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgICAgdGhpcy5fX29yaWdpbmFsQmVnaW5QYXRoKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0ocywgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgICAgICAgIHRoaXMuc2V0R1N0YXRlKFtbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLCBbXCJjYVwiLCAxXSwgW1wiQ0FcIiwgMV1dKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRTTWFza01vZGUoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmluU01hc2tNb2RlKSB0aHJvdyBuZXcgRXJyb3IoXCJlbmRTTWFza01vZGUgY2FsbGVkIHdoaWxlIG5vdCBpbiBzbWFzayBtb2RlXCIpO1xuICAgICAgICAgIHRoaXMuY3R4Ll9yZW1vdmVNaXJyb3JpbmcoKTtcbiAgICAgICAgICBjb3B5Q3R4U3RhdGUodGhpcy5jdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcbiAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuc3VzcGVuZGVkQ3R4O1xuICAgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb3NlKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykgcmV0dXJuO1xuICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICB0WzBdID0gTWF0aC5mbG9vcih0WzBdKTtcbiAgICAgICAgICAgIHRbMV0gPSBNYXRoLmZsb29yKHRbMV0pO1xuICAgICAgICAgICAgdFsyXSA9IE1hdGguY2VpbCh0WzJdKTtcbiAgICAgICAgICAgIHRbM10gPSBNYXRoLmNlaWwodFszXSk7XG4gICAgICAgICAgfSBlbHNlIHQgPSBbMCwgMCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0XTtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrO1xuICAgICAgICAgIGNvbXBvc2VTTWFzayh0aGlzLnN1c3BlbmRlZEN0eCwgZSwgdGhpcy5jdHgsIHQpO1xuICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNhdmUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgICAgICAgIGNvcHlDdHhTdGF0ZSh0aGlzLmN0eCwgdGhpcy5zdXNwZW5kZWRDdHgpO1xuICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWRDdHguc2F2ZSgpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmN0eC5zYXZlKCk7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICB0aGlzLnN0YXRlU3RhY2sucHVzaCh0KTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0LmNsb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdG9yZSgpIHtcbiAgICAgICAgICAwID09PSB0aGlzLnN0YXRlU3RhY2subGVuZ3RoICYmIHRoaXMuaW5TTWFza01vZGUgJiYgdGhpcy5lbmRTTWFza01vZGUoKTtcbiAgICAgICAgICBpZiAoMCAhPT0gdGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWRDdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgICBjb3B5Q3R4U3RhdGUodGhpcy5zdXNwZW5kZWRDdHgsIHRoaXMuY3R4KTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU01hc2tTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzBdID0gLTE7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmb3JtKHQsIGUsIG4sIGksIHIsIHMpIHtcbiAgICAgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0odCwgZSwgbiwgaSwgciwgcyk7XG4gICAgICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IC0xO1xuICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdFBhdGgodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIGEgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgbGV0IG8sXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgYyA9IGEueCxcbiAgICAgICAgICAgIGggPSBhLnk7XG4gICAgICAgICAgY29uc3QgZCA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHMpLFxuICAgICAgICAgICAgdSA9IDAgPT09IGRbMF0gJiYgMCA9PT0gZFszXSB8fCAwID09PSBkWzFdICYmIDAgPT09IGRbMl0sXG4gICAgICAgICAgICBwID0gdSA/IG4uc2xpY2UoMCkgOiBudWxsO1xuICAgICAgICAgIGZvciAobGV0IG4gPSAwLCByID0gMCwgZiA9IHQubGVuZ3RoOyBuIDwgZjsgbisrKSBzd2l0Y2ggKDAgfCB0W25dKSB7XG4gICAgICAgICAgICBjYXNlIGkuT1BTLnJlY3RhbmdsZTpcbiAgICAgICAgICAgICAgYyA9IGVbcisrXTtcbiAgICAgICAgICAgICAgaCA9IGVbcisrXTtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGVbcisrXSxcbiAgICAgICAgICAgICAgICBuID0gZVtyKytdLFxuICAgICAgICAgICAgICAgIGYgPSBjICsgdCxcbiAgICAgICAgICAgICAgICBnID0gaCArIG47XG4gICAgICAgICAgICAgIHMubW92ZVRvKGMsIGgpO1xuICAgICAgICAgICAgICBpZiAoMCA9PT0gdCB8fCAwID09PSBuKSBzLmxpbmVUbyhmLCBnKTtlbHNlIHtcbiAgICAgICAgICAgICAgICBzLmxpbmVUbyhmLCBoKTtcbiAgICAgICAgICAgICAgICBzLmxpbmVUbyhmLCBnKTtcbiAgICAgICAgICAgICAgICBzLmxpbmVUbyhjLCBnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB1IHx8IGEudXBkYXRlUmVjdE1pbk1heChkLCBbYywgaCwgZiwgZ10pO1xuICAgICAgICAgICAgICBzLmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5PUFMubW92ZVRvOlxuICAgICAgICAgICAgICBjID0gZVtyKytdO1xuICAgICAgICAgICAgICBoID0gZVtyKytdO1xuICAgICAgICAgICAgICBzLm1vdmVUbyhjLCBoKTtcbiAgICAgICAgICAgICAgdSB8fCBhLnVwZGF0ZVBhdGhNaW5NYXgoZCwgYywgaCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpLk9QUy5saW5lVG86XG4gICAgICAgICAgICAgIGMgPSBlW3IrK107XG4gICAgICAgICAgICAgIGggPSBlW3IrK107XG4gICAgICAgICAgICAgIHMubGluZVRvKGMsIGgpO1xuICAgICAgICAgICAgICB1IHx8IGEudXBkYXRlUGF0aE1pbk1heChkLCBjLCBoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuT1BTLmN1cnZlVG86XG4gICAgICAgICAgICAgIG8gPSBjO1xuICAgICAgICAgICAgICBsID0gaDtcbiAgICAgICAgICAgICAgYyA9IGVbciArIDRdO1xuICAgICAgICAgICAgICBoID0gZVtyICsgNV07XG4gICAgICAgICAgICAgIHMuYmV6aWVyQ3VydmVUbyhlW3JdLCBlW3IgKyAxXSwgZVtyICsgMl0sIGVbciArIDNdLCBjLCBoKTtcbiAgICAgICAgICAgICAgYS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCwgbywgbCwgZVtyXSwgZVtyICsgMV0sIGVbciArIDJdLCBlW3IgKyAzXSwgYywgaCwgcCk7XG4gICAgICAgICAgICAgIHIgKz0gNjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuT1BTLmN1cnZlVG8yOlxuICAgICAgICAgICAgICBvID0gYztcbiAgICAgICAgICAgICAgbCA9IGg7XG4gICAgICAgICAgICAgIHMuYmV6aWVyQ3VydmVUbyhjLCBoLCBlW3JdLCBlW3IgKyAxXSwgZVtyICsgMl0sIGVbciArIDNdKTtcbiAgICAgICAgICAgICAgYS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCwgbywgbCwgYywgaCwgZVtyXSwgZVtyICsgMV0sIGVbciArIDJdLCBlW3IgKyAzXSwgcCk7XG4gICAgICAgICAgICAgIGMgPSBlW3IgKyAyXTtcbiAgICAgICAgICAgICAgaCA9IGVbciArIDNdO1xuICAgICAgICAgICAgICByICs9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpLk9QUy5jdXJ2ZVRvMzpcbiAgICAgICAgICAgICAgbyA9IGM7XG4gICAgICAgICAgICAgIGwgPSBoO1xuICAgICAgICAgICAgICBjID0gZVtyICsgMl07XG4gICAgICAgICAgICAgIGggPSBlW3IgKyAzXTtcbiAgICAgICAgICAgICAgcy5iZXppZXJDdXJ2ZVRvKGVbcl0sIGVbciArIDFdLCBjLCBoLCBjLCBoKTtcbiAgICAgICAgICAgICAgYS51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoZCwgbywgbCwgZVtyXSwgZVtyICsgMV0sIGMsIGgsIGMsIGgsIHApO1xuICAgICAgICAgICAgICByICs9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBpLk9QUy5jbG9zZVBhdGg6XG4gICAgICAgICAgICAgIHMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHUgJiYgYS51cGRhdGVTY2FsaW5nUGF0aE1pbk1heChkLCBwKTtcbiAgICAgICAgICBhLnNldEN1cnJlbnRQb2ludChjLCBoKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZVBhdGgoKSB7XG4gICAgICAgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3Ryb2tlKCkge1xuICAgICAgICAgIGxldCB0ID0gIShhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSkgfHwgYXJndW1lbnRzWzBdO1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7XG4gICAgICAgICAgZS5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5zdHJva2VBbHBoYTtcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkgaWYgKFwib2JqZWN0XCIgPT0gdHlwZW9mIG4gJiYgbiAhPT0gbnVsbCAmJiBuICE9PSB2b2lkIDAgJiYgbi5nZXRQYXR0ZXJuKSB7XG4gICAgICAgICAgICBlLnNhdmUoKTtcbiAgICAgICAgICAgIGUuc3Ryb2tlU3R5bGUgPSBuLmdldFBhdHRlcm4oZSwgdGhpcywgKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGUpLCBzLlBhdGhUeXBlLlNUUk9LRSk7XG4gICAgICAgICAgICB0aGlzLnJlc2NhbGVBbmRTdHJva2UoITEpO1xuICAgICAgICAgICAgZS5yZXN0b3JlKCk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMucmVzY2FsZUFuZFN0cm9rZSghMCk7XG4gICAgICAgICAgdCAmJiB0aGlzLmNvbnN1bWVQYXRoKHRoaXMuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCkpO1xuICAgICAgICAgIGUuZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuZmlsbEFscGhhO1xuICAgICAgICB9XG4gICAgICAgIGNsb3NlU3Ryb2tlKCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBmaWxsKCkge1xuICAgICAgICAgIGxldCB0ID0gIShhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSkgfHwgYXJndW1lbnRzWzBdO1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuICAgICAgICAgIGxldCBpID0gITE7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCkge1xuICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgICBlLmZpbGxTdHlsZSA9IG4uZ2V0UGF0dGVybihlLCB0aGlzLCAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoZSksIHMuUGF0aFR5cGUuRklMTCk7XG4gICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpO1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlICYmIG51bGwgIT09IGEpIGlmICh0aGlzLnBlbmRpbmdFT0ZpbGwpIHtcbiAgICAgICAgICAgIGUuZmlsbChcImV2ZW5vZGRcIik7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMTtcbiAgICAgICAgICB9IGVsc2UgZS5maWxsKCk7XG4gICAgICAgICAgaSAmJiBlLnJlc3RvcmUoKTtcbiAgICAgICAgICB0ICYmIHRoaXMuY29uc3VtZVBhdGgoYSk7XG4gICAgICAgIH1cbiAgICAgICAgZW9GaWxsKCkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9ICEwO1xuICAgICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5maWxsKCExKTtcbiAgICAgICAgICB0aGlzLnN0cm9rZSghMSk7XG4gICAgICAgICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGVvRmlsbFN0cm9rZSgpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMDtcbiAgICAgICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZUZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgICAgICB0aGlzLmZpbGxTdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZUVPRmlsbFN0cm9rZSgpIHtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMDtcbiAgICAgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVuZFBhdGgoKSB7XG4gICAgICAgICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGNsaXAoKSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IGQ7XG4gICAgICAgIH1cbiAgICAgICAgZW9DbGlwKCkge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSB1O1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luVGV4dCgpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeCA9IGkuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZW5kVGV4dCgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wZW5kaW5nVGV4dFBhdGhzLFxuICAgICAgICAgICAgZSA9IHRoaXMuY3R4O1xuICAgICAgICAgIGlmICh2b2lkIDAgIT09IHQpIHtcbiAgICAgICAgICAgIGUuc2F2ZSgpO1xuICAgICAgICAgICAgZS5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICAgICAgICAgIGUuc2V0VHJhbnNmb3JtKC4uLm4udHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgZS50cmFuc2xhdGUobi54LCBuLnkpO1xuICAgICAgICAgICAgICBuLmFkZFRvUGF0aChlLCBuLmZvbnRTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGUucmVzdG9yZSgpO1xuICAgICAgICAgICAgZS5jbGlwKCk7XG4gICAgICAgICAgICBlLmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1RleHRQYXRocztcbiAgICAgICAgICB9IGVsc2UgZS5iZWdpblBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRDaGFyU3BhY2luZyh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRXb3JkU3BhY2luZyh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LndvcmRTcGFjaW5nID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRIU2NhbGUodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gdCAvIDEwMDtcbiAgICAgICAgfVxuICAgICAgICBzZXRMZWFkaW5nKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQubGVhZGluZyA9IC10O1xuICAgICAgICB9XG4gICAgICAgIHNldEZvbnQodCwgZSkge1xuICAgICAgICAgIHZhciBfbiRzeXN0ZW1Gb250SW5mbztcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jb21tb25PYmpzLmdldCh0KSxcbiAgICAgICAgICAgIHIgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBmaW5kIGZvbnQgZm9yIFwiLmNvbmNhdCh0KSk7XG4gICAgICAgICAgci5mb250TWF0cml4ID0gbi5mb250TWF0cml4IHx8IGkuRk9OVF9JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgMCAhPT0gci5mb250TWF0cml4WzBdICYmIDAgIT09IHIuZm9udE1hdHJpeFszXSB8fCAoMCwgaS53YXJuKShcIkludmFsaWQgZm9udCBtYXRyaXggZm9yIGZvbnQgXCIgKyB0KTtcbiAgICAgICAgICBpZiAoZSA8IDApIHtcbiAgICAgICAgICAgIGUgPSAtZTtcbiAgICAgICAgICAgIHIuZm9udERpcmVjdGlvbiA9IC0xO1xuICAgICAgICAgIH0gZWxzZSByLmZvbnREaXJlY3Rpb24gPSAxO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5mb250ID0gbjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZm9udFNpemUgPSBlO1xuICAgICAgICAgIGlmIChuLmlzVHlwZTNGb250KSByZXR1cm47XG4gICAgICAgICAgY29uc3QgcyA9IG4ubG9hZGVkTmFtZSB8fCBcInNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgIGEgPSAoKF9uJHN5c3RlbUZvbnRJbmZvID0gbi5zeXN0ZW1Gb250SW5mbykgPT09IG51bGwgfHwgX24kc3lzdGVtRm9udEluZm8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uJHN5c3RlbUZvbnRJbmZvLmNzcykgfHwgXCJcXFwiXCIuY29uY2F0KHMsIFwiXFxcIiwgXCIpLmNvbmNhdChuLmZhbGxiYWNrTmFtZSk7XG4gICAgICAgICAgbGV0IG8gPSBcIm5vcm1hbFwiO1xuICAgICAgICAgIG4uYmxhY2sgPyBvID0gXCI5MDBcIiA6IG4uYm9sZCAmJiAobyA9IFwiYm9sZFwiKTtcbiAgICAgICAgICBjb25zdCBsID0gbi5pdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcbiAgICAgICAgICBsZXQgYyA9IGU7XG4gICAgICAgICAgZSA8IDE2ID8gYyA9IDE2IDogZSA+IDEwMCAmJiAoYyA9IDEwMCk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmZvbnRTaXplU2NhbGUgPSBlIC8gYztcbiAgICAgICAgICB0aGlzLmN0eC5mb250ID0gXCJcIi5jb25jYXQobCwgXCIgXCIpLmNvbmNhdChvLCBcIiBcIikuY29uY2F0KGMsIFwicHggXCIpLmNvbmNhdChhKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZSh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRUZXh0UmlzZSh0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gdDtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlVGV4dCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnggPSB0aGlzLmN1cnJlbnQubGluZVggKz0gdDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSArPSBlO1xuICAgICAgICB9XG4gICAgICAgIHNldExlYWRpbmdNb3ZlVGV4dCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5zZXRMZWFkaW5nKC1lKTtcbiAgICAgICAgICB0aGlzLm1vdmVUZXh0KHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIHNldFRleHRNYXRyaXgodCwgZSwgbiwgaSwgciwgcykge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gW3QsIGUsIG4sIGksIHIsIHNdO1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLmh5cG90KHQsIGUpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dExpbmUoKSB7XG4gICAgICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRDaGFyKHQsIGUsIG4sIHMpIHtcbiAgICAgICAgICBjb25zdCBhID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBvID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgbCA9IG8uZm9udCxcbiAgICAgICAgICAgIGMgPSBvLnRleHRSZW5kZXJpbmdNb2RlLFxuICAgICAgICAgICAgaCA9IG8uZm9udFNpemUgLyBvLmZvbnRTaXplU2NhbGUsXG4gICAgICAgICAgICBkID0gYyAmIGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSyxcbiAgICAgICAgICAgIHUgPSAhIShjICYgaS5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKSxcbiAgICAgICAgICAgIHAgPSBvLnBhdHRlcm5GaWxsICYmICFsLm1pc3NpbmdGaWxlO1xuICAgICAgICAgIGxldCBmO1xuICAgICAgICAgIChsLmRpc2FibGVGb250RmFjZSB8fCB1IHx8IHApICYmIChmID0gbC5nZXRQYXRoR2VuZXJhdG9yKHRoaXMuY29tbW9uT2JqcywgdCkpO1xuICAgICAgICAgIGlmIChsLmRpc2FibGVGb250RmFjZSB8fCBwKSB7XG4gICAgICAgICAgICBhLnNhdmUoKTtcbiAgICAgICAgICAgIGEudHJhbnNsYXRlKGUsIG4pO1xuICAgICAgICAgICAgYS5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGYoYSwgaCk7XG4gICAgICAgICAgICBzICYmIGEuc2V0VHJhbnNmb3JtKC4uLnMpO1xuICAgICAgICAgICAgZCAhPT0gaS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMICYmIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UgfHwgYS5maWxsKCk7XG4gICAgICAgICAgICBkICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSAmJiBkICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFIHx8IGEuc3Ryb2tlKCk7XG4gICAgICAgICAgICBhLnJlc3RvcmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZCAhPT0gaS5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMICYmIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UgfHwgYS5maWxsVGV4dCh0LCBlLCBuKTtcbiAgICAgICAgICAgIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFICYmIGQgIT09IGkuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UgfHwgYS5zdHJva2VUZXh0KHQsIGUsIG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgKHRoaXMucGVuZGluZ1RleHRQYXRocyB8fCAodGhpcy5wZW5kaW5nVGV4dFBhdGhzID0gW10pKS5wdXNoKHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKShhKSxcbiAgICAgICAgICAgICAgeDogZSxcbiAgICAgICAgICAgICAgeTogbixcbiAgICAgICAgICAgICAgZm9udFNpemU6IGgsXG4gICAgICAgICAgICAgIGFkZFRvUGF0aDogZlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCgpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250ZXh0OiB0XG4gICAgICAgICAgfSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaXNGb250U3VicGl4ZWxBQUVuYWJsZWRcIiwgMTAsIDEwKTtcbiAgICAgICAgICB0LnNjYWxlKDEuNSwgMSk7XG4gICAgICAgICAgdC5maWxsVGV4dChcIklcIiwgMCwgMTApO1xuICAgICAgICAgIGNvbnN0IGUgPSB0LmdldEltYWdlRGF0YSgwLCAwLCAxMCwgMTApLmRhdGE7XG4gICAgICAgICAgbGV0IG4gPSAhMTtcbiAgICAgICAgICBmb3IgKGxldCB0ID0gMzsgdCA8IGUubGVuZ3RoOyB0ICs9IDQpIGlmIChlW3RdID4gMCAmJiBlW3RdIDwgMjU1KSB7XG4gICAgICAgICAgICBuID0gITA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICgwLCBpLnNoYWRvdykodGhpcywgXCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZFwiLCBuKTtcbiAgICAgICAgfVxuICAgICAgICBzaG93VGV4dCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3VycmVudCxcbiAgICAgICAgICAgIG4gPSBlLmZvbnQ7XG4gICAgICAgICAgaWYgKG4uaXNUeXBlM0ZvbnQpIHJldHVybiB0aGlzLnNob3dUeXBlM1RleHQodCk7XG4gICAgICAgICAgY29uc3QgYSA9IGUuZm9udFNpemU7XG4gICAgICAgICAgaWYgKDAgPT09IGEpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBsID0gZS5mb250U2l6ZVNjYWxlLFxuICAgICAgICAgICAgYyA9IGUuY2hhclNwYWNpbmcsXG4gICAgICAgICAgICBoID0gZS53b3JkU3BhY2luZyxcbiAgICAgICAgICAgIGQgPSBlLmZvbnREaXJlY3Rpb24sXG4gICAgICAgICAgICB1ID0gZS50ZXh0SFNjYWxlICogZCxcbiAgICAgICAgICAgIHAgPSB0Lmxlbmd0aCxcbiAgICAgICAgICAgIGYgPSBuLnZlcnRpY2FsLFxuICAgICAgICAgICAgZyA9IGYgPyAxIDogLTEsXG4gICAgICAgICAgICBtID0gbi5kZWZhdWx0Vk1ldHJpY3MsXG4gICAgICAgICAgICBiID0gYSAqIGUuZm9udE1hdHJpeFswXSxcbiAgICAgICAgICAgIHYgPSBlLnRleHRSZW5kZXJpbmdNb2RlID09PSBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiYgIW4uZGlzYWJsZUZvbnRGYWNlICYmICFlLnBhdHRlcm5GaWxsO1xuICAgICAgICAgIG8uc2F2ZSgpO1xuICAgICAgICAgIG8udHJhbnNmb3JtKC4uLmUudGV4dE1hdHJpeCk7XG4gICAgICAgICAgby50cmFuc2xhdGUoZS54LCBlLnkgKyBlLnRleHRSaXNlKTtcbiAgICAgICAgICBkID4gMCA/IG8uc2NhbGUodSwgLTEpIDogby5zY2FsZSh1LCAxKTtcbiAgICAgICAgICBsZXQgeTtcbiAgICAgICAgICBpZiAoZS5wYXR0ZXJuRmlsbCkge1xuICAgICAgICAgICAgby5zYXZlKCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gZS5maWxsQ29sb3IuZ2V0UGF0dGVybihvLCB0aGlzLCAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkobyksIHMuUGF0aFR5cGUuRklMTCk7XG4gICAgICAgICAgICB5ID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkobyk7XG4gICAgICAgICAgICBvLnJlc3RvcmUoKTtcbiAgICAgICAgICAgIG8uZmlsbFN0eWxlID0gdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IEEgPSBlLmxpbmVXaWR0aDtcbiAgICAgICAgICBjb25zdCBfID0gZS50ZXh0TWF0cml4U2NhbGU7XG4gICAgICAgICAgaWYgKDAgPT09IF8gfHwgMCA9PT0gQSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUudGV4dFJlbmRlcmluZ01vZGUgJiBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7XG4gICAgICAgICAgICB0ICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSAmJiB0ICE9PSBpLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFIHx8IChBID0gdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCkpO1xuICAgICAgICAgIH0gZWxzZSBBIC89IF87XG4gICAgICAgICAgaWYgKDEgIT09IGwpIHtcbiAgICAgICAgICAgIG8uc2NhbGUobCwgbCk7XG4gICAgICAgICAgICBBIC89IGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIG8ubGluZVdpZHRoID0gQTtcbiAgICAgICAgICBpZiAobi5pc0ludmFsaWRQREZqc0ZvbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0KSB7XG4gICAgICAgICAgICAgIG4ucHVzaChlLnVuaWNvZGUpO1xuICAgICAgICAgICAgICBpICs9IGUud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvLmZpbGxUZXh0KG4uam9pbihcIlwiKSwgMCwgMCk7XG4gICAgICAgICAgICBlLnggKz0gaSAqIGIgKiB1O1xuICAgICAgICAgICAgby5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IFMsXG4gICAgICAgICAgICBFID0gMDtcbiAgICAgICAgICBmb3IgKFMgPSAwOyBTIDwgcDsgKytTKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdFtTXTtcbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiBlKSB7XG4gICAgICAgICAgICAgIEUgKz0gZyAqIGUgKiBhIC8gMWUzO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpID0gITE7XG4gICAgICAgICAgICBjb25zdCByID0gKGUuaXNTcGFjZSA/IGggOiAwKSArIGMsXG4gICAgICAgICAgICAgIHMgPSBlLmZvbnRDaGFyLFxuICAgICAgICAgICAgICB1ID0gZS5hY2NlbnQ7XG4gICAgICAgICAgICBsZXQgcCxcbiAgICAgICAgICAgICAgQSxcbiAgICAgICAgICAgICAgXyA9IGUud2lkdGg7XG4gICAgICAgICAgICBpZiAoZikge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZS52bWV0cmljIHx8IG0sXG4gICAgICAgICAgICAgICAgbiA9IC0oZS52bWV0cmljID8gdFsxXSA6IC41ICogXykgKiBiLFxuICAgICAgICAgICAgICAgIGkgPSB0WzJdICogYjtcbiAgICAgICAgICAgICAgXyA9IHQgPyAtdFswXSA6IF87XG4gICAgICAgICAgICAgIHAgPSBuIC8gbDtcbiAgICAgICAgICAgICAgQSA9IChFICsgaSkgLyBsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcCA9IEUgLyBsO1xuICAgICAgICAgICAgICBBID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLnJlbWVhc3VyZSAmJiBfID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gMWUzICogby5tZWFzdXJlVGV4dChzKS53aWR0aCAvIGEgKiBsO1xuICAgICAgICAgICAgICBpZiAoXyA8IHQgJiYgdGhpcy5pc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBfIC8gdDtcbiAgICAgICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgICAgICAgby5zYXZlKCk7XG4gICAgICAgICAgICAgICAgby5zY2FsZShlLCAxKTtcbiAgICAgICAgICAgICAgICBwIC89IGU7XG4gICAgICAgICAgICAgIH0gZWxzZSBfICE9PSB0ICYmIChwICs9IChfIC0gdCkgLyAyZTMgKiBhIC8gbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiAoZS5pc0luRm9udCB8fCBuLm1pc3NpbmdGaWxlKSkgaWYgKHYgJiYgIXUpIG8uZmlsbFRleHQocywgcCwgQSk7ZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucGFpbnRDaGFyKHMsIHAsIEEsIHkpO1xuICAgICAgICAgICAgICBpZiAodSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBwICsgYSAqIHUub2Zmc2V0LnggLyBsLFxuICAgICAgICAgICAgICAgICAgZSA9IEEgLSBhICogdS5vZmZzZXQueSAvIGw7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludENoYXIodS5mb250Q2hhciwgdCwgZSwgeSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEUgKz0gZiA/IF8gKiBiIC0gciAqIGQgOiBfICogYiArIHIgKiBkO1xuICAgICAgICAgICAgaSAmJiBvLnJlc3RvcmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZiA/IGUueSAtPSBFIDogZS54ICs9IEUgKiB1O1xuICAgICAgICAgIG8ucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNob3dUeXBlM1RleHQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eCxcbiAgICAgICAgICAgIG4gPSB0aGlzLmN1cnJlbnQsXG4gICAgICAgICAgICByID0gbi5mb250LFxuICAgICAgICAgICAgcyA9IG4uZm9udFNpemUsXG4gICAgICAgICAgICBhID0gbi5mb250RGlyZWN0aW9uLFxuICAgICAgICAgICAgbyA9IHIudmVydGljYWwgPyAxIDogLTEsXG4gICAgICAgICAgICBsID0gbi5jaGFyU3BhY2luZyxcbiAgICAgICAgICAgIGMgPSBuLndvcmRTcGFjaW5nLFxuICAgICAgICAgICAgaCA9IG4udGV4dEhTY2FsZSAqIGEsXG4gICAgICAgICAgICBkID0gbi5mb250TWF0cml4IHx8IGkuRk9OVF9JREVOVElUWV9NQVRSSVgsXG4gICAgICAgICAgICB1ID0gdC5sZW5ndGg7XG4gICAgICAgICAgbGV0IHAsIGYsIGcsIG07XG4gICAgICAgICAgaWYgKCEobi50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gaS5UZXh0UmVuZGVyaW5nTW9kZS5JTlZJU0lCTEUpICYmIDAgIT09IHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmdbMF0gPSAtMTtcbiAgICAgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgICBlLnRyYW5zZm9ybSguLi5uLnRleHRNYXRyaXgpO1xuICAgICAgICAgICAgZS50cmFuc2xhdGUobi54LCBuLnkpO1xuICAgICAgICAgICAgZS5zY2FsZShoLCBhKTtcbiAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCB1OyArK3ApIHtcbiAgICAgICAgICAgICAgZiA9IHRbcF07XG4gICAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiBmKSB7XG4gICAgICAgICAgICAgICAgbSA9IG8gKiBmICogcyAvIDFlMztcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUobSwgMCk7XG4gICAgICAgICAgICAgICAgbi54ICs9IG0gKiBoO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGEgPSAoZi5pc1NwYWNlID8gYyA6IDApICsgbCxcbiAgICAgICAgICAgICAgICB1ID0gci5jaGFyUHJvY09wZXJhdG9yTGlzdFtmLm9wZXJhdG9yTGlzdElkXTtcbiAgICAgICAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgICAgICAgKDAsIGkud2FybikoXCJUeXBlMyBjaGFyYWN0ZXIgXFxcIlwiLmNvbmNhdChmLm9wZXJhdG9yTGlzdElkLCBcIlxcXCIgaXMgbm90IGF2YWlsYWJsZS5cIikpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBmO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgICAgICAgIGUuc2NhbGUocywgcyk7XG4gICAgICAgICAgICAgICAgZS50cmFuc2Zvcm0oLi4uZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlT3BlcmF0b3JMaXN0KHUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGcgPSBpLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW2Yud2lkdGgsIDBdLCBkKVswXSAqIHMgKyBhO1xuICAgICAgICAgICAgICBlLnRyYW5zbGF0ZShnLCAwKTtcbiAgICAgICAgICAgICAgbi54ICs9IGcgKiBoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZS5yZXN0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldENoYXJXaWR0aCh0LCBlKSB7fVxuICAgICAgICBzZXRDaGFyV2lkdGhBbmRCb3VuZHModCwgZSwgbiwgaSwgciwgcykge1xuICAgICAgICAgIHRoaXMuY3R4LnJlY3QobiwgaSwgciAtIG4sIHMgLSBpKTtcbiAgICAgICAgICB0aGlzLmN0eC5jbGlwKCk7XG4gICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q29sb3JOX1BhdHRlcm4odCkge1xuICAgICAgICAgIGxldCBlO1xuICAgICAgICAgIGlmIChcIlRpbGluZ1BhdHRlcm5cIiA9PT0gdFswXSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHRbMV0sXG4gICAgICAgICAgICAgIGkgPSB0aGlzLmJhc2VUcmFuc2Zvcm0gfHwgKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpLFxuICAgICAgICAgICAgICBhID0ge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUNhbnZhc0dyYXBoaWNzOiB0ID0+IG5ldyBDYW52YXNHcmFwaGljcyh0LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcbiAgICAgICAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICBtYXJrZWRDb250ZW50U3RhY2s6IHRoaXMubWFya2VkQ29udGVudFN0YWNrXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGUgPSBuZXcgcy5UaWxpbmdQYXR0ZXJuKHQsIG4sIHRoaXMuY3R4LCBhLCBpKTtcbiAgICAgICAgICB9IGVsc2UgZSA9IHRoaXMuX2dldFBhdHRlcm4odFsxXSwgdFsyXSk7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlQ29sb3JOKCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGaWxsQ29sb3JOKCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsID0gITA7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlUkdCQ29sb3IodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IHIgPSBpLlV0aWwubWFrZUhleENvbG9yKHQsIGUsIG4pO1xuICAgICAgICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gcjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSByO1xuICAgICAgICB9XG4gICAgICAgIHNldEZpbGxSR0JDb2xvcih0LCBlLCBuKSB7XG4gICAgICAgICAgY29uc3QgciA9IGkuVXRpbC5tYWtlSGV4Q29sb3IodCwgZSwgbik7XG4gICAgICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gcjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gcjtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwgPSAhMTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0UGF0dGVybih0KSB7XG4gICAgICAgICAgbGV0IGUsXG4gICAgICAgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLmNhY2hlZFBhdHRlcm5zLmhhcyh0KSkgZSA9IHRoaXMuY2FjaGVkUGF0dGVybnMuZ2V0KHQpO2Vsc2Uge1xuICAgICAgICAgICAgZSA9ICgwLCBzLmdldFNoYWRpbmdQYXR0ZXJuKSh0aGlzLmdldE9iamVjdCh0KSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlZFBhdHRlcm5zLnNldCh0LCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbiAmJiAoZS5tYXRyaXggPSBuKTtcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfVxuICAgICAgICBzaGFkaW5nRmlsbCh0KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3R4O1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9nZXRQYXR0ZXJuKHQpO1xuICAgICAgICAgIGUuZmlsbFN0eWxlID0gbi5nZXRQYXR0ZXJuKGUsIHRoaXMsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShlKSwgcy5QYXRoVHlwZS5TSEFESU5HKTtcbiAgICAgICAgICBjb25zdCBhID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGUpO1xuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICAgIH0gPSBlLmNhbnZhcyxcbiAgICAgICAgICAgICAgW3IsIHMsIG8sIGxdID0gaS5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCB0LCBuXSwgYSk7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWxsUmVjdChyLCBzLCBvIC0gciwgbCAtIHMpO1xuICAgICAgICAgIH0gZWxzZSB0aGlzLmN0eC5maWxsUmVjdCgtMWUxMCwgLTFlMTAsIDJlMTAsIDJlMTApO1xuICAgICAgICAgIHRoaXMuY29tcG9zZSh0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpKTtcbiAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgICBiZWdpbklubGluZUltYWdlKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBiZWdpbklubGluZUltYWdlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luSW1hZ2VEYXRhKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBiZWdpbkltYWdlRGF0YVwiKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEZvcm1YT2JqZWN0QmVnaW4odCwgZSkge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgJiYgNiA9PT0gdC5sZW5ndGggJiYgdGhpcy50cmFuc2Zvcm0oLi4udCk7XG4gICAgICAgICAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZVsyXSAtIGVbMF0sXG4gICAgICAgICAgICAgICAgbiA9IGVbM10gLSBlWzFdO1xuICAgICAgICAgICAgICB0aGlzLmN0eC5yZWN0KGVbMF0sIGVbMV0sIHQsIG4pO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQudXBkYXRlUmVjdE1pbk1heCgoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCksIGUpO1xuICAgICAgICAgICAgICB0aGlzLmNsaXAoKTtcbiAgICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJlZ2luR3JvdXAodCkge1xuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3R4O1xuICAgICAgICAgIHQuaXNvbGF0ZWQgfHwgKDAsIGkuaW5mbykoXCJUT0RPOiBTdXBwb3J0IG5vbi1pc29sYXRlZCBncm91cHMuXCIpO1xuICAgICAgICAgIHQua25vY2tvdXQgJiYgKDAsIGkud2FybikoXCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC5cIik7XG4gICAgICAgICAgY29uc3QgbiA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGUpO1xuICAgICAgICAgIHQubWF0cml4ICYmIGUudHJhbnNmb3JtKC4uLnQubWF0cml4KTtcbiAgICAgICAgICBpZiAoIXQuYmJveCkgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLlwiKTtcbiAgICAgICAgICBsZXQgcyA9IGkuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCh0LmJib3gsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGUpKTtcbiAgICAgICAgICBjb25zdCBhID0gWzAsIDAsIGUuY2FudmFzLndpZHRoLCBlLmNhbnZhcy5oZWlnaHRdO1xuICAgICAgICAgIHMgPSBpLlV0aWwuaW50ZXJzZWN0KHMsIGEpIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICBjb25zdCBsID0gTWF0aC5mbG9vcihzWzBdKSxcbiAgICAgICAgICAgIGMgPSBNYXRoLmZsb29yKHNbMV0pO1xuICAgICAgICAgIGxldCBoID0gTWF0aC5tYXgoTWF0aC5jZWlsKHNbMl0pIC0gbCwgMSksXG4gICAgICAgICAgICBkID0gTWF0aC5tYXgoTWF0aC5jZWlsKHNbM10pIC0gYywgMSksXG4gICAgICAgICAgICB1ID0gMSxcbiAgICAgICAgICAgIHAgPSAxO1xuICAgICAgICAgIGlmIChoID4gbykge1xuICAgICAgICAgICAgdSA9IGggLyBvO1xuICAgICAgICAgICAgaCA9IG87XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkID4gbykge1xuICAgICAgICAgICAgcCA9IGQgLyBvO1xuICAgICAgICAgICAgZCA9IG87XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY3VycmVudC5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCBoLCBkXSk7XG4gICAgICAgICAgbGV0IGYgPSBcImdyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcbiAgICAgICAgICB0LnNtYXNrICYmIChmICs9IFwiX3NtYXNrX1wiICsgdGhpcy5zbWFza0NvdW50ZXIrKyAlIDIpO1xuICAgICAgICAgIGNvbnN0IGcgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhmLCBoLCBkKSxcbiAgICAgICAgICAgIG0gPSBnLmNvbnRleHQ7XG4gICAgICAgICAgbS5zY2FsZSgxIC8gdSwgMSAvIHApO1xuICAgICAgICAgIG0udHJhbnNsYXRlKC1sLCAtYyk7XG4gICAgICAgICAgbS50cmFuc2Zvcm0oLi4ubik7XG4gICAgICAgICAgaWYgKHQuc21hc2spIHRoaXMuc21hc2tTdGFjay5wdXNoKHtcbiAgICAgICAgICAgIGNhbnZhczogZy5jYW52YXMsXG4gICAgICAgICAgICBjb250ZXh0OiBtLFxuICAgICAgICAgICAgb2Zmc2V0WDogbCxcbiAgICAgICAgICAgIG9mZnNldFk6IGMsXG4gICAgICAgICAgICBzY2FsZVg6IHUsXG4gICAgICAgICAgICBzY2FsZVk6IHAsXG4gICAgICAgICAgICBzdWJ0eXBlOiB0LnNtYXNrLnN1YnR5cGUsXG4gICAgICAgICAgICBiYWNrZHJvcDogdC5zbWFzay5iYWNrZHJvcCxcbiAgICAgICAgICAgIHRyYW5zZmVyTWFwOiB0LnNtYXNrLnRyYW5zZmVyTWFwIHx8IG51bGwsXG4gICAgICAgICAgICBzdGFydFRyYW5zZm9ybUludmVyc2U6IG51bGxcbiAgICAgICAgICB9KTtlbHNlIHtcbiAgICAgICAgICAgIGUuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICAgICAgZS50cmFuc2xhdGUobCwgYyk7XG4gICAgICAgICAgICBlLnNjYWxlKHUsIHApO1xuICAgICAgICAgICAgZS5zYXZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvcHlDdHhTdGF0ZShlLCBtKTtcbiAgICAgICAgICB0aGlzLmN0eCA9IG07XG4gICAgICAgICAgdGhpcy5zZXRHU3RhdGUoW1tcIkJNXCIsIFwic291cmNlLW92ZXJcIl0sIFtcImNhXCIsIDFdLCBbXCJDQVwiLCAxXV0pO1xuICAgICAgICAgIHRoaXMuZ3JvdXBTdGFjay5wdXNoKGUpO1xuICAgICAgICAgIHRoaXMuZ3JvdXBMZXZlbCsrO1xuICAgICAgICB9XG4gICAgICAgIGVuZEdyb3VwKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHJldHVybjtcbiAgICAgICAgICB0aGlzLmdyb3VwTGV2ZWwtLTtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBuID0gdGhpcy5ncm91cFN0YWNrLnBvcCgpO1xuICAgICAgICAgIHRoaXMuY3R4ID0gbjtcbiAgICAgICAgICB0aGlzLmN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSAhMTtcbiAgICAgICAgICBpZiAodC5zbWFzaykge1xuICAgICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSB0aGlzLnNtYXNrU3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgY29uc3QgdCA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKC4uLnQpO1xuICAgICAgICAgICAgY29uc3QgbiA9IGkuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgZS5jYW52YXMud2lkdGgsIGUuY2FudmFzLmhlaWdodF0sIHQpO1xuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKGUuY2FudmFzLCAwLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zZShuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYmVnaW5Bbm5vdGF0aW9uKHQsIGUsIG4sIHMsIGEpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9HdCwgX0d0MikuY2FsbCh0aGlzKTtcbiAgICAgICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG4gICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuYmFzZVRyYW5zZm9ybSAmJiB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oLi4udGhpcy5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSAmJiA0ID09PSBlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcyA9IGVbMl0gLSBlWzBdLFxuICAgICAgICAgICAgICBvID0gZVszXSAtIGVbMV07XG4gICAgICAgICAgICBpZiAoYSAmJiB0aGlzLmFubm90YXRpb25DYW52YXNNYXApIHtcbiAgICAgICAgICAgICAgKG4gPSBuLnNsaWNlKCkpWzRdIC09IGVbMF07XG4gICAgICAgICAgICAgIG5bNV0gLT0gZVsxXTtcbiAgICAgICAgICAgICAgKGUgPSBlLnNsaWNlKCkpWzBdID0gZVsxXSA9IDA7XG4gICAgICAgICAgICAgIGVbMl0gPSBzO1xuICAgICAgICAgICAgICBlWzNdID0gbztcbiAgICAgICAgICAgICAgY29uc3QgW2EsIGxdID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKCgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KSksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdmlld3BvcnRTY2FsZTogY1xuICAgICAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIGggPSBNYXRoLmNlaWwocyAqIHRoaXMub3V0cHV0U2NhbGVYICogYyksXG4gICAgICAgICAgICAgICAgZCA9IE1hdGguY2VpbChvICogdGhpcy5vdXRwdXRTY2FsZVkgKiBjKTtcbiAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShoLCBkKTtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGNhbnZhczogdSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBwXG4gICAgICAgICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25DYW52YXM7XG4gICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcC5zZXQodCwgdSk7XG4gICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eCA9IHRoaXMuY3R4O1xuICAgICAgICAgICAgICB0aGlzLmN0eCA9IHA7XG4gICAgICAgICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKGEsIDAsIDAsIC1sLCAwLCBvICogbCk7XG4gICAgICAgICAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcbiAgICAgICAgICAgICAgdGhpcy5jdHgucmVjdChlWzBdLCBlWzFdLCBzLCBvKTtcbiAgICAgICAgICAgICAgdGhpcy5jdHguY2xpcCgpO1xuICAgICAgICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybSguLi5uKTtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybSguLi5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRBbm5vdGF0aW9uKCkge1xuICAgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25DYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1Z0LCBfVnQyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5jdHggPSB0aGlzLmFubm90YXRpb25DYW52YXMuc2F2ZWRDdHg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hbm5vdGF0aW9uQ2FudmFzLnNhdmVkQ3R4O1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYW5ub3RhdGlvbkNhbnZhcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0KHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBlID0gdC5jb3VudDtcbiAgICAgICAgICAodCA9IHRoaXMuZ2V0T2JqZWN0KHQuZGF0YSwgdCkpLmNvdW50ID0gZTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdHgsXG4gICAgICAgICAgICBpID0gdGhpcy5wcm9jZXNzaW5nVHlwZTM7XG4gICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIHZvaWQgMCA9PT0gaS5jb21waWxlZCAmJiAoaS5jb21waWxlZCA9IGZ1bmN0aW9uIGNvbXBpbGVUeXBlM0dseXBoKHQpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICAgIGhlaWdodDogblxuICAgICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICAgICAgaWYgKGUgPiAxZTMgfHwgbiA+IDFlMykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgVWludDhBcnJheShbMCwgMiwgNCwgMCwgMSwgMCwgNSwgNCwgOCwgMTAsIDAsIDgsIDAsIDIsIDEsIDBdKSxcbiAgICAgICAgICAgICAgICByID0gZSArIDE7XG4gICAgICAgICAgICAgIGxldCBzLFxuICAgICAgICAgICAgICAgIGEsXG4gICAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgICBsID0gbmV3IFVpbnQ4QXJyYXkociAqIChuICsgMSkpO1xuICAgICAgICAgICAgICBjb25zdCBjID0gZSArIDcgJiAtODtcbiAgICAgICAgICAgICAgbGV0IGggPSBuZXcgVWludDhBcnJheShjICogbiksXG4gICAgICAgICAgICAgICAgZCA9IDA7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdCA9IDEyODtcbiAgICAgICAgICAgICAgICBmb3IgKDsgdCA+IDA7KSB7XG4gICAgICAgICAgICAgICAgICBoW2QrK10gPSBlICYgdCA/IDAgOiAyNTU7XG4gICAgICAgICAgICAgICAgICB0ID4+PSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsZXQgdSA9IDA7XG4gICAgICAgICAgICAgIGQgPSAwO1xuICAgICAgICAgICAgICBpZiAoMCAhPT0gaFtkXSkge1xuICAgICAgICAgICAgICAgIGxbMF0gPSAxO1xuICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGEgPSAxOyBhIDwgZTsgYSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhbZF0gIT09IGhbZCArIDFdKSB7XG4gICAgICAgICAgICAgICAgICBsW2FdID0gaFtkXSA/IDIgOiAxO1xuICAgICAgICAgICAgICAgICAgKyt1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKDAgIT09IGhbZF0pIHtcbiAgICAgICAgICAgICAgICBsW2FdID0gMjtcbiAgICAgICAgICAgICAgICArK3U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yIChzID0gMTsgcyA8IG47IHMrKykge1xuICAgICAgICAgICAgICAgIGQgPSBzICogYztcbiAgICAgICAgICAgICAgICBvID0gcyAqIHI7XG4gICAgICAgICAgICAgICAgaWYgKGhbZCAtIGNdICE9PSBoW2RdKSB7XG4gICAgICAgICAgICAgICAgICBsW29dID0gaFtkXSA/IDEgOiA4O1xuICAgICAgICAgICAgICAgICAgKyt1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdCA9IChoW2RdID8gNCA6IDApICsgKGhbZCAtIGNdID8gOCA6IDApO1xuICAgICAgICAgICAgICAgIGZvciAoYSA9IDE7IGEgPCBlOyBhKyspIHtcbiAgICAgICAgICAgICAgICAgIHQgPSAodCA+PiAyKSArIChoW2QgKyAxXSA/IDQgOiAwKSArIChoW2QgLSBjICsgMV0gPyA4IDogMCk7XG4gICAgICAgICAgICAgICAgICBpZiAoaVt0XSkge1xuICAgICAgICAgICAgICAgICAgICBsW28gKyBhXSA9IGlbdF07XG4gICAgICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhbZCAtIGNdICE9PSBoW2RdKSB7XG4gICAgICAgICAgICAgICAgICBsW28gKyBhXSA9IGhbZF0gPyAyIDogNDtcbiAgICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHUgPiAxZTMpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGQgPSBjICogKG4gLSAxKTtcbiAgICAgICAgICAgICAgbyA9IHMgKiByO1xuICAgICAgICAgICAgICBpZiAoMCAhPT0gaFtkXSkge1xuICAgICAgICAgICAgICAgIGxbb10gPSA4O1xuICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGEgPSAxOyBhIDwgZTsgYSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhbZF0gIT09IGhbZCArIDFdKSB7XG4gICAgICAgICAgICAgICAgICBsW28gKyBhXSA9IGhbZF0gPyA0IDogODtcbiAgICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICgwICE9PSBoW2RdKSB7XG4gICAgICAgICAgICAgICAgbFtvICsgYV0gPSA0O1xuICAgICAgICAgICAgICAgICsrdTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodSA+IDFlMykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIGNvbnN0IHAgPSBuZXcgSW50MzJBcnJheShbMCwgciwgLTEsIDAsIC1yLCAwLCAwLCAwLCAxXSksXG4gICAgICAgICAgICAgICAgZiA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgICAgICAgZm9yIChzID0gMDsgdSAmJiBzIDw9IG47IHMrKykge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gcyAqIHI7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHQgKyBlO1xuICAgICAgICAgICAgICAgIGZvciAoOyB0IDwgbiAmJiAhbFt0XTspIHQrKztcbiAgICAgICAgICAgICAgICBpZiAodCA9PT0gbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgZi5tb3ZlVG8odCAlIHIsIHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0O1xuICAgICAgICAgICAgICAgIGxldCBhID0gbFt0XTtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlID0gcFthXTtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgdCArPSBlO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIWxbdF0pO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGxbdF07XG4gICAgICAgICAgICAgICAgICBpZiAoNSAhPT0gbiAmJiAxMCAhPT0gbikge1xuICAgICAgICAgICAgICAgICAgICBhID0gbjtcbiAgICAgICAgICAgICAgICAgICAgbFt0XSA9IDA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhID0gbiAmIDUxICogYSA+PiA0O1xuICAgICAgICAgICAgICAgICAgICBsW3RdICY9IGEgPj4gMiB8IGEgPDwgMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGYubGluZVRvKHQgJSByLCB0IC8gciB8IDApO1xuICAgICAgICAgICAgICAgICAgbFt0XSB8fCAtLXU7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoaSAhPT0gdCk7XG4gICAgICAgICAgICAgICAgLS1zO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGggPSBudWxsO1xuICAgICAgICAgICAgICBsID0gbnVsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdC5zYXZlKCk7XG4gICAgICAgICAgICAgICAgdC5zY2FsZSgxIC8gZSwgLTEgLyBuKTtcbiAgICAgICAgICAgICAgICB0LnRyYW5zbGF0ZSgwLCAtbik7XG4gICAgICAgICAgICAgICAgdC5maWxsKGYpO1xuICAgICAgICAgICAgICAgIHQuYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgdC5yZXN0b3JlKCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KHQpKTtcbiAgICAgICAgICAgIGlmIChpLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICAgIGkuY29tcGlsZWQobik7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgciA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXModCksXG4gICAgICAgICAgICBzID0gci5jYW52YXM7XG4gICAgICAgICAgbi5zYXZlKCk7XG4gICAgICAgICAgbi5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAgICAgbi5kcmF3SW1hZ2Uocywgci5vZmZzZXRYLCByLm9mZnNldFkpO1xuICAgICAgICAgIG4ucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCh0LCBlKSB7XG4gICAgICAgICAgbGV0IG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IDAsXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gPyBhcmd1bWVudHNbM10gOiAwLFxuICAgICAgICAgICAgYSA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ID8gYXJndW1lbnRzWzRdIDogdm9pZCAwLFxuICAgICAgICAgICAgbyA9IGFyZ3VtZW50cy5sZW5ndGggPiA1ID8gYXJndW1lbnRzWzVdIDogdm9pZCAwO1xuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgIHQgPSB0aGlzLmdldE9iamVjdCh0LmRhdGEsIHQpO1xuICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLmN0eDtcbiAgICAgICAgICBsLnNhdmUoKTtcbiAgICAgICAgICBjb25zdCBjID0gKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkobCk7XG4gICAgICAgICAgbC50cmFuc2Zvcm0oZSwgbiwgcywgYSwgMCwgMCk7XG4gICAgICAgICAgY29uc3QgaCA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXModCk7XG4gICAgICAgICAgbC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgaC5vZmZzZXRYIC0gY1s0XSwgaC5vZmZzZXRZIC0gY1s1XSk7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDAsIHIgPSBvLmxlbmd0aDsgdCA8IHI7IHQgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgciA9IGkuVXRpbC50cmFuc2Zvcm0oYywgW2UsIG4sIHMsIGEsIG9bdF0sIG9bdCArIDFdXSksXG4gICAgICAgICAgICAgIFtkLCB1XSA9IGkuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIHIpO1xuICAgICAgICAgICAgbC5kcmF3SW1hZ2UoaC5jYW52YXMsIGQsIHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsLnJlc3RvcmUoKTtcbiAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cCh0KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuY3R4LFxuICAgICAgICAgICAgbiA9IHRoaXMuY3VycmVudC5maWxsQ29sb3IsXG4gICAgICAgICAgICBpID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuICAgICAgICAgIGZvciAoY29uc3QgYSBvZiB0KSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZGF0YTogdCxcbiAgICAgICAgICAgICAgICB3aWR0aDogbyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGwsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBjXG4gICAgICAgICAgICAgIH0gPSBhLFxuICAgICAgICAgICAgICBoID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtYXNrQ2FudmFzXCIsIG8sIGwpLFxuICAgICAgICAgICAgICBkID0gaC5jb250ZXh0O1xuICAgICAgICAgICAgZC5zYXZlKCk7XG4gICAgICAgICAgICBwdXRCaW5hcnlJbWFnZU1hc2soZCwgdGhpcy5nZXRPYmplY3QodCwgYSkpO1xuICAgICAgICAgICAgZC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuICAgICAgICAgICAgZC5maWxsU3R5bGUgPSBpID8gbi5nZXRQYXR0ZXJuKGQsIHRoaXMsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShlKSwgcy5QYXRoVHlwZS5GSUxMKSA6IG47XG4gICAgICAgICAgICBkLmZpbGxSZWN0KDAsIDAsIG8sIGwpO1xuICAgICAgICAgICAgZC5yZXN0b3JlKCk7XG4gICAgICAgICAgICBlLnNhdmUoKTtcbiAgICAgICAgICAgIGUudHJhbnNmb3JtKC4uLmMpO1xuICAgICAgICAgICAgZS5zY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoZSwgaC5jYW52YXMsIDAsIDAsIG8sIGwsIDAsIC0xLCAxLCAxKTtcbiAgICAgICAgICAgIGUucmVzdG9yZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEltYWdlWE9iamVjdCh0KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0T2JqZWN0KHQpO1xuICAgICAgICAgIGUgPyB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGUpIDogKDAsIGkud2FybikoXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KHQsIGUsIG4sIHIpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBzID0gdGhpcy5nZXRPYmplY3QodCk7XG4gICAgICAgICAgaWYgKCFzKSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGEgPSBzLndpZHRoLFxuICAgICAgICAgICAgbyA9IHMuaGVpZ2h0LFxuICAgICAgICAgICAgbCA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwLCBpID0gci5sZW5ndGg7IHQgPCBpOyB0ICs9IDIpIGwucHVzaCh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IFtlLCAwLCAwLCBuLCByW3RdLCByW3QgKyAxXV0sXG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIHc6IGEsXG4gICAgICAgICAgICBoOiBvXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKHMsIGwpO1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXModCkge1xuICAgICAgICAgIGlmIChcIm5vbmVcIiAhPT0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcykge1xuICAgICAgICAgICAgdC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzO1xuICAgICAgICAgICAgdC5kcmF3SW1hZ2UodC5jYW52YXMsIDAsIDApO1xuICAgICAgICAgICAgdC5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHQuY2FudmFzO1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5VHJhbnNmZXJNYXBzVG9CaXRtYXAodCkge1xuICAgICAgICAgIGlmIChcIm5vbmVcIiA9PT0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcykgcmV0dXJuIHQuYml0bWFwO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgYml0bWFwOiBlLFxuICAgICAgICAgICAgICB3aWR0aDogbixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBpXG4gICAgICAgICAgICB9ID0gdCxcbiAgICAgICAgICAgIHIgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIG4sIGkpLFxuICAgICAgICAgICAgcyA9IHIuY29udGV4dDtcbiAgICAgICAgICBzLmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHM7XG4gICAgICAgICAgcy5kcmF3SW1hZ2UoZSwgMCwgMCk7XG4gICAgICAgICAgcy5maWx0ZXIgPSBcIm5vbmVcIjtcbiAgICAgICAgICByZXR1cm4gci5jYW52YXM7XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QodCkge1xuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IGUgPSB0LndpZHRoLFxuICAgICAgICAgICAgbiA9IHQuaGVpZ2h0LFxuICAgICAgICAgICAgcyA9IHRoaXMuY3R4O1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIGlmICghaS5pc05vZGVKUykge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBmaWx0ZXI6IHRcbiAgICAgICAgICAgIH0gPSBzO1xuICAgICAgICAgICAgXCJub25lXCIgIT09IHQgJiYgXCJcIiAhPT0gdCAmJiAocy5maWx0ZXIgPSBcIm5vbmVcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMuc2NhbGUoMSAvIGUsIC0xIC8gbik7XG4gICAgICAgICAgbGV0IGE7XG4gICAgICAgICAgaWYgKHQuYml0bWFwKSBhID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQml0bWFwKHQpO2Vsc2UgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgSFRNTEVsZW1lbnQgJiYgdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8ICF0LmRhdGEpIGEgPSB0O2Vsc2Uge1xuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgZSwgbikuY29udGV4dDtcbiAgICAgICAgICAgIHB1dEJpbmFyeUltYWdlRGF0YShpLCB0KTtcbiAgICAgICAgICAgIGEgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXMoaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLl9zY2FsZUltYWdlKGEsICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShzKSk7XG4gICAgICAgICAgcy5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkocyksIHQuaW50ZXJwb2xhdGUpO1xuICAgICAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhzLCBvLmltZywgMCwgMCwgby5wYWludFdpZHRoLCBvLnBhaW50SGVpZ2h0LCAwLCAtbiwgZSwgbik7XG4gICAgICAgICAgdGhpcy5jb21wb3NlKCk7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cCh0LCBlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3R4O1xuICAgICAgICAgIGxldCBpO1xuICAgICAgICAgIGlmICh0LmJpdG1hcCkgaSA9IHQuYml0bWFwO2Vsc2Uge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQud2lkdGgsXG4gICAgICAgICAgICAgIG4gPSB0LmhlaWdodCxcbiAgICAgICAgICAgICAgciA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgZSwgbikuY29udGV4dDtcbiAgICAgICAgICAgIHB1dEJpbmFyeUltYWdlRGF0YShyLCB0KTtcbiAgICAgICAgICAgIGkgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXMocik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBlKSB7XG4gICAgICAgICAgICBuLnNhdmUoKTtcbiAgICAgICAgICAgIG4udHJhbnNmb3JtKC4uLnQudHJhbnNmb3JtKTtcbiAgICAgICAgICAgIG4uc2NhbGUoMSwgLTEpO1xuICAgICAgICAgICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKG4sIGksIHQueCwgdC55LCB0LncsIHQuaCwgMCwgLTEsIDEsIDEpO1xuICAgICAgICAgICAgbi5yZXN0b3JlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29tcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpIHtcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgMSwgMSk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya1BvaW50KHQpIHt9XG4gICAgICAgIG1hcmtQb2ludFByb3BzKHQsIGUpIHt9XG4gICAgICAgIGJlZ2luTWFya2VkQ29udGVudCh0KSB7XG4gICAgICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgICAgICB2aXNpYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luTWFya2VkQ29udGVudFByb3BzKHQsIGUpIHtcbiAgICAgICAgICBcIk9DXCIgPT09IHQgPyB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHZpc2libGU6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShlKVxuICAgICAgICAgIH0pIDogdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG4gICAgICAgICAgICB2aXNpYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbmRNYXJrZWRDb250ZW50KCkge1xuICAgICAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnBvcCgpO1xuICAgICAgICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcbiAgICAgICAgfVxuICAgICAgICBiZWdpbkNvbXBhdCgpIHt9XG4gICAgICAgIGVuZENvbXBhdCgpIHt9XG4gICAgICAgIGNvbnN1bWVQYXRoKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LmlzRW1wdHlDbGlwKCk7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCAmJiB0aGlzLmN1cnJlbnQudXBkYXRlQ2xpcEZyb21QYXRoKCk7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCB8fCB0aGlzLmNvbXBvc2UodCk7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3R4O1xuICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgICAgICBlIHx8ICh0aGlzLnBlbmRpbmdDbGlwID09PSB1ID8gbi5jbGlwKFwiZXZlbm9kZFwiKSA6IG4uY2xpcCgpKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0aGlzLmN1cnJlbnQuY2xpcEJveCk7XG4gICAgICAgICAgbi5iZWdpblBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRTaW5nbGVQaXhlbFdpZHRoKCkge1xuICAgICAgICAgIGlmICghdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgdCA9ICgwLCByLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcbiAgICAgICAgICAgIGlmICgwID09PSB0WzFdICYmIDAgPT09IHRbMl0pIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSAxIC8gTWF0aC5taW4oTWF0aC5hYnModFswXSksIE1hdGguYWJzKHRbM10pKTtlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IE1hdGguYWJzKHRbMF0gKiB0WzNdIC0gdFsyXSAqIHRbMV0pLFxuICAgICAgICAgICAgICAgIG4gPSBNYXRoLmh5cG90KHRbMF0sIHRbMl0pLFxuICAgICAgICAgICAgICAgIGkgPSBNYXRoLmh5cG90KHRbMV0sIHRbM10pO1xuICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gTWF0aC5tYXgobiwgaSkgLyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBnZXRTY2FsZUZvclN0cm9raW5nKCkge1xuICAgICAgICAgIGlmICgtMSA9PT0gdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGxpbmVXaWR0aDogdFxuICAgICAgICAgICAgICB9ID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYTogZSxcbiAgICAgICAgICAgICAgICBiOiBuLFxuICAgICAgICAgICAgICAgIGM6IGksXG4gICAgICAgICAgICAgICAgZDogclxuICAgICAgICAgICAgICB9ID0gdGhpcy5jdHguZ2V0VHJhbnNmb3JtKCk7XG4gICAgICAgICAgICBsZXQgcywgYTtcbiAgICAgICAgICAgIGlmICgwID09PSBuICYmIDAgPT09IGkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IE1hdGguYWJzKGUpLFxuICAgICAgICAgICAgICAgIGkgPSBNYXRoLmFicyhyKTtcbiAgICAgICAgICAgICAgaWYgKG4gPT09IGkpIHtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdCkgcyA9IGEgPSAxIC8gbjtlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuICogdDtcbiAgICAgICAgICAgICAgICAgIHMgPSBhID0gZSA8IDEgPyAxIC8gZSA6IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKDAgPT09IHQpIHtcbiAgICAgICAgICAgICAgICBzID0gMSAvIG47XG4gICAgICAgICAgICAgICAgYSA9IDEgLyBpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuICogdCxcbiAgICAgICAgICAgICAgICAgIHIgPSBpICogdDtcbiAgICAgICAgICAgICAgICBzID0gZSA8IDEgPyAxIC8gZSA6IDE7XG4gICAgICAgICAgICAgICAgYSA9IHIgPCAxID8gMSAvIHIgOiAxO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBvID0gTWF0aC5hYnMoZSAqIHIgLSBuICogaSksXG4gICAgICAgICAgICAgICAgbCA9IE1hdGguaHlwb3QoZSwgbiksXG4gICAgICAgICAgICAgICAgYyA9IE1hdGguaHlwb3QoaSwgcik7XG4gICAgICAgICAgICAgIGlmICgwID09PSB0KSB7XG4gICAgICAgICAgICAgICAgcyA9IGMgLyBvO1xuICAgICAgICAgICAgICAgIGEgPSBsIC8gbztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdCAqIG87XG4gICAgICAgICAgICAgICAgcyA9IGMgPiBlID8gYyAvIGUgOiAxO1xuICAgICAgICAgICAgICAgIGEgPSBsID4gZSA/IGwgLyBlIDogMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZ1swXSA9IHM7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nWzFdID0gYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmVzY2FsZUFuZFN0cm9rZSh0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBjdHg6IGVcbiAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsaW5lV2lkdGg6IG5cbiAgICAgICAgICAgIH0gPSB0aGlzLmN1cnJlbnQsXG4gICAgICAgICAgICBbaSwgcl0gPSB0aGlzLmdldFNjYWxlRm9yU3Ryb2tpbmcoKTtcbiAgICAgICAgICBlLmxpbmVXaWR0aCA9IG4gfHwgMTtcbiAgICAgICAgICBpZiAoMSA9PT0gaSAmJiAxID09PSByKSB7XG4gICAgICAgICAgICBlLnN0cm9rZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzID0gZS5nZXRMaW5lRGFzaCgpO1xuICAgICAgICAgIHQgJiYgZS5zYXZlKCk7XG4gICAgICAgICAgZS5zY2FsZShpLCByKTtcbiAgICAgICAgICBpZiAocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5tYXgoaSwgcik7XG4gICAgICAgICAgICBlLnNldExpbmVEYXNoKHMubWFwKGUgPT4gZSAvIHQpKTtcbiAgICAgICAgICAgIGUubGluZURhc2hPZmZzZXQgLz0gdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZS5zdHJva2UoKTtcbiAgICAgICAgICB0ICYmIGUucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzQ29udGVudFZpc2libGUoKSB7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IHRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aCAtIDE7IHQgPj0gMDsgdC0tKSBpZiAoIXRoaXMubWFya2VkQ29udGVudFN0YWNrW3RdLnZpc2libGUpIHJldHVybiAhMTtcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9HdDIoKSB7XG4gICAgICAgIGZvciAoOyB0aGlzLnN0YXRlU3RhY2subGVuZ3RoIHx8IHRoaXMuaW5TTWFza01vZGU7KSB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICBpZiAodGhpcy50cmFuc3BhcmVudENhbnZhcykge1xuICAgICAgICAgIHRoaXMuY3R4ID0gdGhpcy5jb21wb3NpdGVDdHg7XG4gICAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy50cmFuc3BhcmVudENhbnZhcywgMCwgMCk7XG4gICAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICAgICAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfVnQyKCkge1xuICAgICAgICBpZiAodGhpcy5wYWdlQ29sb3JzKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRIQ01GaWx0ZXIodGhpcy5wYWdlQ29sb3JzLmZvcmVncm91bmQsIHRoaXMucGFnZUNvbG9ycy5iYWNrZ3JvdW5kKTtcbiAgICAgICAgICBpZiAoXCJub25lXCIgIT09IHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmN0eC5maWx0ZXI7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSB0O1xuICAgICAgICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuY3R4LmNhbnZhcywgMCwgMCk7XG4gICAgICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5DYW52YXNHcmFwaGljcyA9IENhbnZhc0dyYXBoaWNzO1xuICAgICAgZm9yIChjb25zdCB0IGluIGkuT1BTKSB2b2lkIDAgIT09IENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVt0XSAmJiAoQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW2kuT1BTW3RdXSA9IENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVt0XSk7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuVGlsaW5nUGF0dGVybiA9IGUuUGF0aFR5cGUgPSB2b2lkIDA7XG4gICAgICBlLmdldFNoYWRpbmdQYXR0ZXJuID0gZnVuY3Rpb24gZ2V0U2hhZGluZ1BhdHRlcm4odCkge1xuICAgICAgICBzd2l0Y2ggKHRbMF0pIHtcbiAgICAgICAgICBjYXNlIFwiUmFkaWFsQXhpYWxcIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybih0KTtcbiAgICAgICAgICBjYXNlIFwiTWVzaFwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZ1BhdHRlcm4odCk7XG4gICAgICAgICAgY2FzZSBcIkR1bW15XCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IER1bW15U2hhZGluZ1BhdHRlcm4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIElSIHR5cGU6IFwiLmNvbmNhdCh0WzBdKSk7XG4gICAgICB9O1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY3KTtcbiAgICAgIGNvbnN0IHMgPSB7XG4gICAgICAgIEZJTEw6IFwiRmlsbFwiLFxuICAgICAgICBTVFJPS0U6IFwiU3Ryb2tlXCIsXG4gICAgICAgIFNIQURJTkc6IFwiU2hhZGluZ1wiXG4gICAgICB9O1xuICAgICAgZS5QYXRoVHlwZSA9IHM7XG4gICAgICBmdW5jdGlvbiBhcHBseUJvdW5kaW5nQm94KHQsIGUpIHtcbiAgICAgICAgaWYgKCFlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG4gPSBlWzJdIC0gZVswXSxcbiAgICAgICAgICBpID0gZVszXSAtIGVbMV0sXG4gICAgICAgICAgciA9IG5ldyBQYXRoMkQoKTtcbiAgICAgICAgci5yZWN0KGVbMF0sIGVbMV0sIG4sIGkpO1xuICAgICAgICB0LmNsaXAocik7XG4gICAgICB9XG4gICAgICBjbGFzcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU2hhZGluZ1BhdHRlcm4gJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmdQYXR0ZXJuLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRQYXR0ZXJuKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgZ2V0UGF0dGVybmAgY2FsbGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgIHRoaXMuX3R5cGUgPSB0WzFdO1xuICAgICAgICAgIHRoaXMuX2Jib3ggPSB0WzJdO1xuICAgICAgICAgIHRoaXMuX2NvbG9yU3RvcHMgPSB0WzNdO1xuICAgICAgICAgIHRoaXMuX3AwID0gdFs0XTtcbiAgICAgICAgICB0aGlzLl9wMSA9IHRbNV07XG4gICAgICAgICAgdGhpcy5fcjAgPSB0WzZdO1xuICAgICAgICAgIHRoaXMuX3IxID0gdFs3XTtcbiAgICAgICAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZUdyYWRpZW50KHQpIHtcbiAgICAgICAgICBsZXQgZTtcbiAgICAgICAgICBcImF4aWFsXCIgPT09IHRoaXMuX3R5cGUgPyBlID0gdC5jcmVhdGVMaW5lYXJHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3AxWzBdLCB0aGlzLl9wMVsxXSkgOiBcInJhZGlhbFwiID09PSB0aGlzLl90eXBlICYmIChlID0gdC5jcmVhdGVSYWRpYWxHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3IwLCB0aGlzLl9wMVswXSwgdGhpcy5fcDFbMV0sIHRoaXMuX3IxKSk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2NvbG9yU3RvcHMpIGUuYWRkQ29sb3JTdG9wKHRbMF0sIHRbMV0pO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIGdldFBhdHRlcm4odCwgZSwgbiwgYSkge1xuICAgICAgICAgIGxldCBvO1xuICAgICAgICAgIGlmIChhID09PSBzLlNUUk9LRSB8fCBhID09PSBzLkZJTEwpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBlLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveChhLCAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KSkgfHwgWzAsIDAsIDAsIDBdLFxuICAgICAgICAgICAgICBsID0gTWF0aC5jZWlsKHNbMl0gLSBzWzBdKSB8fCAxLFxuICAgICAgICAgICAgICBjID0gTWF0aC5jZWlsKHNbM10gLSBzWzFdKSB8fCAxLFxuICAgICAgICAgICAgICBoID0gZS5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIGwsIGMsICEwKSxcbiAgICAgICAgICAgICAgZCA9IGguY29udGV4dDtcbiAgICAgICAgICAgIGQuY2xlYXJSZWN0KDAsIDAsIGQuY2FudmFzLndpZHRoLCBkLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICAgICAgZC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGQucmVjdCgwLCAwLCBkLmNhbnZhcy53aWR0aCwgZC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICAgIGQudHJhbnNsYXRlKC1zWzBdLCAtc1sxXSk7XG4gICAgICAgICAgICBuID0gaS5VdGlsLnRyYW5zZm9ybShuLCBbMSwgMCwgMCwgMSwgc1swXSwgc1sxXV0pO1xuICAgICAgICAgICAgZC50cmFuc2Zvcm0oLi4uZS5iYXNlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIHRoaXMubWF0cml4ICYmIGQudHJhbnNmb3JtKC4uLnRoaXMubWF0cml4KTtcbiAgICAgICAgICAgIGFwcGx5Qm91bmRpbmdCb3goZCwgdGhpcy5fYmJveCk7XG4gICAgICAgICAgICBkLmZpbGxTdHlsZSA9IHRoaXMuX2NyZWF0ZUdyYWRpZW50KGQpO1xuICAgICAgICAgICAgZC5maWxsKCk7XG4gICAgICAgICAgICBvID0gdC5jcmVhdGVQYXR0ZXJuKGguY2FudmFzLCBcIm5vLXJlcGVhdFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHUgPSBuZXcgRE9NTWF0cml4KG4pO1xuICAgICAgICAgICAgby5zZXRUcmFuc2Zvcm0odSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFwcGx5Qm91bmRpbmdCb3godCwgdGhpcy5fYmJveCk7XG4gICAgICAgICAgICBvID0gdGhpcy5fY3JlYXRlR3JhZGllbnQodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkcmF3VHJpYW5nbGUodCwgZSwgbiwgaSwgciwgcywgYSwgbykge1xuICAgICAgICBjb25zdCBsID0gZS5jb29yZHMsXG4gICAgICAgICAgYyA9IGUuY29sb3JzLFxuICAgICAgICAgIGggPSB0LmRhdGEsXG4gICAgICAgICAgZCA9IDQgKiB0LndpZHRoO1xuICAgICAgICBsZXQgdTtcbiAgICAgICAgaWYgKGxbbiArIDFdID4gbFtpICsgMV0pIHtcbiAgICAgICAgICB1ID0gbjtcbiAgICAgICAgICBuID0gaTtcbiAgICAgICAgICBpID0gdTtcbiAgICAgICAgICB1ID0gcztcbiAgICAgICAgICBzID0gYTtcbiAgICAgICAgICBhID0gdTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobFtpICsgMV0gPiBsW3IgKyAxXSkge1xuICAgICAgICAgIHUgPSBpO1xuICAgICAgICAgIGkgPSByO1xuICAgICAgICAgIHIgPSB1O1xuICAgICAgICAgIHUgPSBhO1xuICAgICAgICAgIGEgPSBvO1xuICAgICAgICAgIG8gPSB1O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsW24gKyAxXSA+IGxbaSArIDFdKSB7XG4gICAgICAgICAgdSA9IG47XG4gICAgICAgICAgbiA9IGk7XG4gICAgICAgICAgaSA9IHU7XG4gICAgICAgICAgdSA9IHM7XG4gICAgICAgICAgcyA9IGE7XG4gICAgICAgICAgYSA9IHU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IChsW25dICsgZS5vZmZzZXRYKSAqIGUuc2NhbGVYLFxuICAgICAgICAgIGYgPSAobFtuICsgMV0gKyBlLm9mZnNldFkpICogZS5zY2FsZVksXG4gICAgICAgICAgZyA9IChsW2ldICsgZS5vZmZzZXRYKSAqIGUuc2NhbGVYLFxuICAgICAgICAgIG0gPSAobFtpICsgMV0gKyBlLm9mZnNldFkpICogZS5zY2FsZVksXG4gICAgICAgICAgYiA9IChsW3JdICsgZS5vZmZzZXRYKSAqIGUuc2NhbGVYLFxuICAgICAgICAgIHYgPSAobFtyICsgMV0gKyBlLm9mZnNldFkpICogZS5zY2FsZVk7XG4gICAgICAgIGlmIChmID49IHYpIHJldHVybjtcbiAgICAgICAgY29uc3QgeSA9IGNbc10sXG4gICAgICAgICAgQSA9IGNbcyArIDFdLFxuICAgICAgICAgIF8gPSBjW3MgKyAyXSxcbiAgICAgICAgICBTID0gY1thXSxcbiAgICAgICAgICBFID0gY1thICsgMV0sXG4gICAgICAgICAgeCA9IGNbYSArIDJdLFxuICAgICAgICAgIHcgPSBjW29dLFxuICAgICAgICAgIEMgPSBjW28gKyAxXSxcbiAgICAgICAgICBUID0gY1tvICsgMl0sXG4gICAgICAgICAgUCA9IE1hdGgucm91bmQoZiksXG4gICAgICAgICAgayA9IE1hdGgucm91bmQodik7XG4gICAgICAgIGxldCBNLCBSLCBJLCBELCBPLCBMLCBOLCBCO1xuICAgICAgICBmb3IgKGxldCB0ID0gUDsgdCA8PSBrOyB0KyspIHtcbiAgICAgICAgICBpZiAodCA8IG0pIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0IDwgZiA/IDAgOiAoZiAtIHQpIC8gKGYgLSBtKTtcbiAgICAgICAgICAgIE0gPSBwIC0gKHAgLSBnKSAqIGU7XG4gICAgICAgICAgICBSID0geSAtICh5IC0gUykgKiBlO1xuICAgICAgICAgICAgSSA9IEEgLSAoQSAtIEUpICogZTtcbiAgICAgICAgICAgIEQgPSBfIC0gKF8gLSB4KSAqIGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlO1xuICAgICAgICAgICAgZSA9IHQgPiB2ID8gMSA6IG0gPT09IHYgPyAwIDogKG0gLSB0KSAvIChtIC0gdik7XG4gICAgICAgICAgICBNID0gZyAtIChnIC0gYikgKiBlO1xuICAgICAgICAgICAgUiA9IFMgLSAoUyAtIHcpICogZTtcbiAgICAgICAgICAgIEkgPSBFIC0gKEUgLSBDKSAqIGU7XG4gICAgICAgICAgICBEID0geCAtICh4IC0gVCkgKiBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgZTtcbiAgICAgICAgICBlID0gdCA8IGYgPyAwIDogdCA+IHYgPyAxIDogKGYgLSB0KSAvIChmIC0gdik7XG4gICAgICAgICAgTyA9IHAgLSAocCAtIGIpICogZTtcbiAgICAgICAgICBMID0geSAtICh5IC0gdykgKiBlO1xuICAgICAgICAgIE4gPSBBIC0gKEEgLSBDKSAqIGU7XG4gICAgICAgICAgQiA9IF8gLSAoXyAtIFQpICogZTtcbiAgICAgICAgICBjb25zdCBuID0gTWF0aC5yb3VuZChNYXRoLm1pbihNLCBPKSksXG4gICAgICAgICAgICBpID0gTWF0aC5yb3VuZChNYXRoLm1heChNLCBPKSk7XG4gICAgICAgICAgbGV0IHIgPSBkICogdCArIDQgKiBuO1xuICAgICAgICAgIGZvciAobGV0IHQgPSBuOyB0IDw9IGk7IHQrKykge1xuICAgICAgICAgICAgZSA9IChNIC0gdCkgLyAoTSAtIE8pO1xuICAgICAgICAgICAgZSA8IDAgPyBlID0gMCA6IGUgPiAxICYmIChlID0gMSk7XG4gICAgICAgICAgICBoW3IrK10gPSBSIC0gKFIgLSBMKSAqIGUgfCAwO1xuICAgICAgICAgICAgaFtyKytdID0gSSAtIChJIC0gTikgKiBlIHwgMDtcbiAgICAgICAgICAgIGhbcisrXSA9IEQgLSAoRCAtIEIpICogZSB8IDA7XG4gICAgICAgICAgICBoW3IrK10gPSAyNTU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkcmF3RmlndXJlKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgaSA9IGUuY29vcmRzLFxuICAgICAgICAgIHIgPSBlLmNvbG9ycztcbiAgICAgICAgbGV0IHMsIGE7XG4gICAgICAgIHN3aXRjaCAoZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImxhdHRpY2VcIjpcbiAgICAgICAgICAgIGNvbnN0IG8gPSBlLnZlcnRpY2VzUGVyUm93LFxuICAgICAgICAgICAgICBsID0gTWF0aC5mbG9vcihpLmxlbmd0aCAvIG8pIC0gMSxcbiAgICAgICAgICAgICAgYyA9IG8gLSAxO1xuICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IGw7IHMrKykge1xuICAgICAgICAgICAgICBsZXQgZSA9IHMgKiBvO1xuICAgICAgICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IGM7IHMrKywgZSsrKSB7XG4gICAgICAgICAgICAgICAgZHJhd1RyaWFuZ2xlKHQsIG4sIGlbZV0sIGlbZSArIDFdLCBpW2UgKyBvXSwgcltlXSwgcltlICsgMV0sIHJbZSArIG9dKTtcbiAgICAgICAgICAgICAgICBkcmF3VHJpYW5nbGUodCwgbiwgaVtlICsgbyArIDFdLCBpW2UgKyAxXSwgaVtlICsgb10sIHJbZSArIG8gKyAxXSwgcltlICsgMV0sIHJbZSArIG9dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInRyaWFuZ2xlc1wiOlxuICAgICAgICAgICAgZm9yIChzID0gMCwgYSA9IGkubGVuZ3RoOyBzIDwgYTsgcyArPSAzKSBkcmF3VHJpYW5nbGUodCwgbiwgaVtzXSwgaVtzICsgMV0sIGlbcyArIDJdLCByW3NdLCByW3MgKyAxXSwgcltzICsgMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgZmlndXJlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBNZXNoU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICB0aGlzLl9jb29yZHMgPSB0WzJdO1xuICAgICAgICAgIHRoaXMuX2NvbG9ycyA9IHRbM107XG4gICAgICAgICAgdGhpcy5fZmlndXJlcyA9IHRbNF07XG4gICAgICAgICAgdGhpcy5fYm91bmRzID0gdFs1XTtcbiAgICAgICAgICB0aGlzLl9iYm94ID0gdFs3XTtcbiAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kID0gdFs4XTtcbiAgICAgICAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZU1lc2hDYW52YXModCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKHRoaXMuX2JvdW5kc1swXSksXG4gICAgICAgICAgICByID0gTWF0aC5mbG9vcih0aGlzLl9ib3VuZHNbMV0pLFxuICAgICAgICAgICAgcyA9IE1hdGguY2VpbCh0aGlzLl9ib3VuZHNbMl0pIC0gaSxcbiAgICAgICAgICAgIGEgPSBNYXRoLmNlaWwodGhpcy5fYm91bmRzWzNdKSAtIHIsXG4gICAgICAgICAgICBvID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKHMgKiB0WzBdICogMS4xKSksIDNlMyksXG4gICAgICAgICAgICBsID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGEgKiB0WzFdICogMS4xKSksIDNlMyksXG4gICAgICAgICAgICBjID0gcyAvIG8sXG4gICAgICAgICAgICBoID0gYSAvIGwsXG4gICAgICAgICAgICBkID0ge1xuICAgICAgICAgICAgICBjb29yZHM6IHRoaXMuX2Nvb3JkcyxcbiAgICAgICAgICAgICAgY29sb3JzOiB0aGlzLl9jb2xvcnMsXG4gICAgICAgICAgICAgIG9mZnNldFg6IC1pLFxuICAgICAgICAgICAgICBvZmZzZXRZOiAtcixcbiAgICAgICAgICAgICAgc2NhbGVYOiAxIC8gYyxcbiAgICAgICAgICAgICAgc2NhbGVZOiAxIC8gaFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHUgPSBvICsgNCxcbiAgICAgICAgICAgIHAgPSBsICsgNCxcbiAgICAgICAgICAgIGYgPSBuLmdldENhbnZhcyhcIm1lc2hcIiwgdSwgcCwgITEpLFxuICAgICAgICAgICAgZyA9IGYuY29udGV4dCxcbiAgICAgICAgICAgIG0gPSBnLmNyZWF0ZUltYWdlRGF0YShvLCBsKTtcbiAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IG0uZGF0YTtcbiAgICAgICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuICs9IDQpIHtcbiAgICAgICAgICAgICAgdFtuXSA9IGVbMF07XG4gICAgICAgICAgICAgIHRbbiArIDFdID0gZVsxXTtcbiAgICAgICAgICAgICAgdFtuICsgMl0gPSBlWzJdO1xuICAgICAgICAgICAgICB0W24gKyAzXSA9IDI1NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2ZpZ3VyZXMpIGRyYXdGaWd1cmUobSwgdCwgZCk7XG4gICAgICAgICAgZy5wdXRJbWFnZURhdGEobSwgMiwgMik7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbnZhczogZi5jYW52YXMsXG4gICAgICAgICAgICBvZmZzZXRYOiBpIC0gMiAqIGMsXG4gICAgICAgICAgICBvZmZzZXRZOiByIC0gMiAqIGgsXG4gICAgICAgICAgICBzY2FsZVg6IGMsXG4gICAgICAgICAgICBzY2FsZVk6IGhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGdldFBhdHRlcm4odCwgZSwgbiwgYSkge1xuICAgICAgICAgIGFwcGx5Qm91bmRpbmdCb3godCwgdGhpcy5fYmJveCk7XG4gICAgICAgICAgbGV0IG87XG4gICAgICAgICAgaWYgKGEgPT09IHMuU0hBRElORykgbyA9IGkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSgoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKSh0KSk7ZWxzZSB7XG4gICAgICAgICAgICBvID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUuYmFzZVRyYW5zZm9ybSk7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXRyaXgpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGkuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7XG4gICAgICAgICAgICAgIG8gPSBbb1swXSAqIHRbMF0sIG9bMV0gKiB0WzFdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbCA9IHRoaXMuX2NyZWF0ZU1lc2hDYW52YXMobywgYSA9PT0gcy5TSEFESU5HID8gbnVsbCA6IHRoaXMuX2JhY2tncm91bmQsIGUuY2FjaGVkQ2FudmFzZXMpO1xuICAgICAgICAgIGlmIChhICE9PSBzLlNIQURJTkcpIHtcbiAgICAgICAgICAgIHQuc2V0VHJhbnNmb3JtKC4uLmUuYmFzZVRyYW5zZm9ybSk7XG4gICAgICAgICAgICB0aGlzLm1hdHJpeCAmJiB0LnRyYW5zZm9ybSguLi50aGlzLm1hdHJpeCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHQudHJhbnNsYXRlKGwub2Zmc2V0WCwgbC5vZmZzZXRZKTtcbiAgICAgICAgICB0LnNjYWxlKGwuc2NhbGVYLCBsLnNjYWxlWSk7XG4gICAgICAgICAgcmV0dXJuIHQuY3JlYXRlUGF0dGVybihsLmNhbnZhcywgXCJuby1yZXBlYXRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIER1bW15U2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuICAgICAgICBnZXRQYXR0ZXJuKCkge1xuICAgICAgICAgIHJldHVybiBcImhvdHBpbmtcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgYSA9IDEsXG4gICAgICAgIG8gPSAyO1xuICAgICAgY2xhc3MgVGlsaW5nUGF0dGVybiB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4sIGksIHIpIHtcbiAgICAgICAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IHRbMl07XG4gICAgICAgICAgdGhpcy5tYXRyaXggPSB0WzNdIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcbiAgICAgICAgICB0aGlzLmJib3ggPSB0WzRdO1xuICAgICAgICAgIHRoaXMueHN0ZXAgPSB0WzVdO1xuICAgICAgICAgIHRoaXMueXN0ZXAgPSB0WzZdO1xuICAgICAgICAgIHRoaXMucGFpbnRUeXBlID0gdFs3XTtcbiAgICAgICAgICB0aGlzLnRpbGluZ1R5cGUgPSB0WzhdO1xuICAgICAgICAgIHRoaXMuY29sb3IgPSBlO1xuICAgICAgICAgIHRoaXMuY3R4ID0gbjtcbiAgICAgICAgICB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IGk7XG4gICAgICAgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gcjtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVQYXR0ZXJuQ2FudmFzKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5vcGVyYXRvckxpc3QsXG4gICAgICAgICAgICBuID0gdGhpcy5iYm94LFxuICAgICAgICAgICAgcyA9IHRoaXMueHN0ZXAsXG4gICAgICAgICAgICBhID0gdGhpcy55c3RlcCxcbiAgICAgICAgICAgIG8gPSB0aGlzLnBhaW50VHlwZSxcbiAgICAgICAgICAgIGwgPSB0aGlzLnRpbGluZ1R5cGUsXG4gICAgICAgICAgICBjID0gdGhpcy5jb2xvcixcbiAgICAgICAgICAgIGggPSB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeTtcbiAgICAgICAgICAoMCwgaS5pbmZvKShcIlRpbGluZ1R5cGU6IFwiICsgbCk7XG4gICAgICAgICAgY29uc3QgZCA9IG5bMF0sXG4gICAgICAgICAgICB1ID0gblsxXSxcbiAgICAgICAgICAgIHAgPSBuWzJdLFxuICAgICAgICAgICAgZiA9IG5bM10sXG4gICAgICAgICAgICBnID0gaS5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMubWF0cml4KSxcbiAgICAgICAgICAgIG0gPSBpLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5iYXNlVHJhbnNmb3JtKSxcbiAgICAgICAgICAgIGIgPSBbZ1swXSAqIG1bMF0sIGdbMV0gKiBtWzFdXSxcbiAgICAgICAgICAgIHYgPSB0aGlzLmdldFNpemVBbmRTY2FsZShzLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIGJbMF0pLFxuICAgICAgICAgICAgeSA9IHRoaXMuZ2V0U2l6ZUFuZFNjYWxlKGEsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQsIGJbMV0pLFxuICAgICAgICAgICAgQSA9IHQuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwicGF0dGVyblwiLCB2LnNpemUsIHkuc2l6ZSwgITApLFxuICAgICAgICAgICAgXyA9IEEuY29udGV4dCxcbiAgICAgICAgICAgIFMgPSBoLmNyZWF0ZUNhbnZhc0dyYXBoaWNzKF8pO1xuICAgICAgICAgIFMuZ3JvdXBMZXZlbCA9IHQuZ3JvdXBMZXZlbDtcbiAgICAgICAgICB0aGlzLnNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dChTLCBvLCBjKTtcbiAgICAgICAgICBsZXQgRSA9IGQsXG4gICAgICAgICAgICB4ID0gdSxcbiAgICAgICAgICAgIHcgPSBwLFxuICAgICAgICAgICAgQyA9IGY7XG4gICAgICAgICAgaWYgKGQgPCAwKSB7XG4gICAgICAgICAgICBFID0gMDtcbiAgICAgICAgICAgIHcgKz0gTWF0aC5hYnMoZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1IDwgMCkge1xuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgICAgICBDICs9IE1hdGguYWJzKHUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfLnRyYW5zbGF0ZSgtdi5zY2FsZSAqIEUsIC15LnNjYWxlICogeCk7XG4gICAgICAgICAgUy50cmFuc2Zvcm0odi5zY2FsZSwgMCwgMCwgeS5zY2FsZSwgMCwgMCk7XG4gICAgICAgICAgXy5zYXZlKCk7XG4gICAgICAgICAgdGhpcy5jbGlwQmJveChTLCBFLCB4LCB3LCBDKTtcbiAgICAgICAgICBTLmJhc2VUcmFuc2Zvcm0gPSAoMCwgci5nZXRDdXJyZW50VHJhbnNmb3JtKShTLmN0eCk7XG4gICAgICAgICAgUy5leGVjdXRlT3BlcmF0b3JMaXN0KGUpO1xuICAgICAgICAgIFMuZW5kRHJhd2luZygpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW52YXM6IEEuY2FudmFzLFxuICAgICAgICAgICAgc2NhbGVYOiB2LnNjYWxlLFxuICAgICAgICAgICAgc2NhbGVZOiB5LnNjYWxlLFxuICAgICAgICAgICAgb2Zmc2V0WDogRSxcbiAgICAgICAgICAgIG9mZnNldFk6IHhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGdldFNpemVBbmRTY2FsZSh0LCBlLCBuKSB7XG4gICAgICAgICAgdCA9IE1hdGguYWJzKHQpO1xuICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLm1heChUaWxpbmdQYXR0ZXJuLk1BWF9QQVRURVJOX1NJWkUsIGUpO1xuICAgICAgICAgIGxldCByID0gTWF0aC5jZWlsKHQgKiBuKTtcbiAgICAgICAgICByID49IGkgPyByID0gaSA6IG4gPSByIC8gdDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NhbGU6IG4sXG4gICAgICAgICAgICBzaXplOiByXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjbGlwQmJveCh0LCBlLCBuLCBpLCBzKSB7XG4gICAgICAgICAgY29uc3QgYSA9IGkgLSBlLFxuICAgICAgICAgICAgbyA9IHMgLSBuO1xuICAgICAgICAgIHQuY3R4LnJlY3QoZSwgbiwgYSwgbyk7XG4gICAgICAgICAgdC5jdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoKDAsIHIuZ2V0Q3VycmVudFRyYW5zZm9ybSkodC5jdHgpLCBbZSwgbiwgaSwgc10pO1xuICAgICAgICAgIHQuY2xpcCgpO1xuICAgICAgICAgIHQuZW5kUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHNldEZpbGxBbmRTdHJva2VTdHlsZVRvQ29udGV4dCh0LCBlLCBuKSB7XG4gICAgICAgICAgY29uc3QgciA9IHQuY3R4LFxuICAgICAgICAgICAgcyA9IHQuY3VycmVudDtcbiAgICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhc2UgYTpcbiAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3R4O1xuICAgICAgICAgICAgICByLmZpbGxTdHlsZSA9IHQuZmlsbFN0eWxlO1xuICAgICAgICAgICAgICByLnN0cm9rZVN0eWxlID0gdC5zdHJva2VTdHlsZTtcbiAgICAgICAgICAgICAgcy5maWxsQ29sb3IgPSB0LmZpbGxTdHlsZTtcbiAgICAgICAgICAgICAgcy5zdHJva2VDb2xvciA9IHQuc3Ryb2tlU3R5bGU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBvOlxuICAgICAgICAgICAgICBjb25zdCBsID0gaS5VdGlsLm1ha2VIZXhDb2xvcihuWzBdLCBuWzFdLCBuWzJdKTtcbiAgICAgICAgICAgICAgci5maWxsU3R5bGUgPSBsO1xuICAgICAgICAgICAgICByLnN0cm9rZVN0eWxlID0gbDtcbiAgICAgICAgICAgICAgcy5maWxsQ29sb3IgPSBsO1xuICAgICAgICAgICAgICBzLnN0cm9rZUNvbG9yID0gbDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcihcIlVuc3VwcG9ydGVkIHBhaW50IHR5cGU6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldFBhdHRlcm4odCwgZSwgbiwgcikge1xuICAgICAgICAgIGxldCBhID0gbjtcbiAgICAgICAgICBpZiAociAhPT0gcy5TSEFESU5HKSB7XG4gICAgICAgICAgICBhID0gaS5VdGlsLnRyYW5zZm9ybShhLCBlLmJhc2VUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgdGhpcy5tYXRyaXggJiYgKGEgPSBpLlV0aWwudHJhbnNmb3JtKGEsIHRoaXMubWF0cml4KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXMoZSk7XG4gICAgICAgICAgbGV0IGwgPSBuZXcgRE9NTWF0cml4KGEpO1xuICAgICAgICAgIGwgPSBsLnRyYW5zbGF0ZShvLm9mZnNldFgsIG8ub2Zmc2V0WSk7XG4gICAgICAgICAgbCA9IGwuc2NhbGUoMSAvIG8uc2NhbGVYLCAxIC8gby5zY2FsZVkpO1xuICAgICAgICAgIGNvbnN0IGMgPSB0LmNyZWF0ZVBhdHRlcm4oby5jYW52YXMsIFwicmVwZWF0XCIpO1xuICAgICAgICAgIGMuc2V0VHJhbnNmb3JtKGwpO1xuICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfZGVmaW5lUHJvcGVydHkoVGlsaW5nUGF0dGVybiwgXCJNQVhfUEFUVEVSTl9TSVpFXCIsIDNlMyk7XG4gICAgICBlLlRpbGluZ1BhdHRlcm4gPSBUaWxpbmdQYXR0ZXJuO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBID0gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkE7XG4gICAgICBlLmNvbnZlcnRUb1JHQkEgPSBmdW5jdGlvbiBjb252ZXJ0VG9SR0JBKHQpIHtcbiAgICAgICAgc3dpdGNoICh0LmtpbmQpIHtcbiAgICAgICAgICBjYXNlIGkuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOlxuICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHQpO1xuICAgICAgICAgIGNhc2UgaS5JbWFnZUtpbmQuUkdCXzI0QlBQOlxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnZlcnRSR0JUb1JHQkEodCkge1xuICAgICAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgICAgICAgc3JjOiBlLFxuICAgICAgICAgICAgICAgICAgc3JjUG9zOiBuID0gMCxcbiAgICAgICAgICAgICAgICAgIGRlc3Q6IHIsXG4gICAgICAgICAgICAgICAgICBkZXN0UG9zOiBzID0gMCxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBhLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBvXG4gICAgICAgICAgICAgICAgfSA9IHQsXG4gICAgICAgICAgICAgICAgbCA9IDA7XG4gICAgICAgICAgICAgIGNvbnN0IGMgPSBlLmxlbmd0aCA+PiAyLFxuICAgICAgICAgICAgICAgIGggPSBuZXcgVWludDMyQXJyYXkoZS5idWZmZXIsIG4sIGMpO1xuICAgICAgICAgICAgICBpZiAoaS5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikge1xuICAgICAgICAgICAgICAgIGZvciAoOyBsIDwgYyAtIDI7IGwgKz0gMywgcyArPSA0KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0ID0gaFtsXSxcbiAgICAgICAgICAgICAgICAgICAgZSA9IGhbbCArIDFdLFxuICAgICAgICAgICAgICAgICAgICBuID0gaFtsICsgMl07XG4gICAgICAgICAgICAgICAgICByW3NdID0gNDI3ODE5MDA4MCB8IHQ7XG4gICAgICAgICAgICAgICAgICByW3MgKyAxXSA9IHQgPj4+IDI0IHwgZSA8PCA4IHwgNDI3ODE5MDA4MDtcbiAgICAgICAgICAgICAgICAgIHJbcyArIDJdID0gZSA+Pj4gMTYgfCBuIDw8IDE2IHwgNDI3ODE5MDA4MDtcbiAgICAgICAgICAgICAgICAgIHJbcyArIDNdID0gbiA+Pj4gOCB8IDQyNzgxOTAwODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgPSA0ICogbCwgbiA9IGUubGVuZ3RoOyB0IDwgbjsgdCArPSAzKSByW3MrK10gPSBlW3RdIHwgZVt0ICsgMV0gPDwgOCB8IGVbdCArIDJdIDw8IDE2IHwgNDI3ODE5MDA4MDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKDsgbCA8IGMgLSAyOyBsICs9IDMsIHMgKz0gNCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGhbbF0sXG4gICAgICAgICAgICAgICAgICAgIGUgPSBoW2wgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgbiA9IGhbbCArIDJdO1xuICAgICAgICAgICAgICAgICAgcltzXSA9IDI1NSB8IHQ7XG4gICAgICAgICAgICAgICAgICByW3MgKyAxXSA9IHQgPDwgMjQgfCBlID4+PiA4IHwgMjU1O1xuICAgICAgICAgICAgICAgICAgcltzICsgMl0gPSBlIDw8IDE2IHwgbiA+Pj4gMTYgfCAyNTU7XG4gICAgICAgICAgICAgICAgICByW3MgKyAzXSA9IG4gPDwgOCB8IDI1NTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdCA9IDQgKiBsLCBuID0gZS5sZW5ndGg7IHQgPCBuOyB0ICs9IDMpIHJbcysrXSA9IGVbdF0gPDwgMjQgfCBlW3QgKyAxXSA8PCAxNiB8IGVbdCArIDJdIDw8IDggfCAyNTU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzcmNQb3M6IG4sXG4gICAgICAgICAgICAgICAgZGVzdFBvczogc1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH07XG4gICAgICBlLmdyYXlUb1JHQkEgPSBmdW5jdGlvbiBncmF5VG9SR0JBKHQsIGUpIHtcbiAgICAgICAgaWYgKGkuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIGVbbl0gPSA2NTc5MyAqIHRbbl0gfCA0Mjc4MTkwMDgwO2Vsc2UgZm9yIChsZXQgbiA9IDAsIGkgPSB0Lmxlbmd0aDsgbiA8IGk7IG4rKykgZVtuXSA9IDE2ODQzMDA4ICogdFtuXSB8IDI1NTtcbiAgICAgIH07XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIHZhciBpID0gbigxKTtcbiAgICAgIGZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHQpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBzcmM6IGUsXG4gICAgICAgICAgc3JjUG9zOiBuID0gMCxcbiAgICAgICAgICBkZXN0OiByLFxuICAgICAgICAgIHdpZHRoOiBzLFxuICAgICAgICAgIGhlaWdodDogYSxcbiAgICAgICAgICBub25CbGFja0NvbG9yOiBvID0gNDI5NDk2NzI5NSxcbiAgICAgICAgICBpbnZlcnNlRGVjb2RlOiBsID0gITFcbiAgICAgICAgfSA9IHQ7XG4gICAgICAgIGNvbnN0IGMgPSBpLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gNDI3ODE5MDA4MCA6IDI1NSxcbiAgICAgICAgICBbaCwgZF0gPSBsID8gW28sIGNdIDogW2MsIG9dLFxuICAgICAgICAgIHUgPSBzID4+IDMsXG4gICAgICAgICAgcCA9IDcgJiBzLFxuICAgICAgICAgIGYgPSBlLmxlbmd0aDtcbiAgICAgICAgciA9IG5ldyBVaW50MzJBcnJheShyLmJ1ZmZlcik7XG4gICAgICAgIGxldCBnID0gMDtcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCBhOyB0KyspIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgPSBuICsgdTsgbiA8IHQ7IG4rKykge1xuICAgICAgICAgICAgY29uc3QgdCA9IG4gPCBmID8gZVtuXSA6IDI1NTtcbiAgICAgICAgICAgIHJbZysrXSA9IDEyOCAmIHQgPyBkIDogaDtcbiAgICAgICAgICAgIHJbZysrXSA9IDY0ICYgdCA/IGQgOiBoO1xuICAgICAgICAgICAgcltnKytdID0gMzIgJiB0ID8gZCA6IGg7XG4gICAgICAgICAgICByW2crK10gPSAxNiAmIHQgPyBkIDogaDtcbiAgICAgICAgICAgIHJbZysrXSA9IDggJiB0ID8gZCA6IGg7XG4gICAgICAgICAgICByW2crK10gPSA0ICYgdCA/IGQgOiBoO1xuICAgICAgICAgICAgcltnKytdID0gMiAmIHQgPyBkIDogaDtcbiAgICAgICAgICAgIHJbZysrXSA9IDEgJiB0ID8gZCA6IGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgwID09PSBwKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCB0ID0gbiA8IGYgPyBlW24rK10gOiAyNTU7XG4gICAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCBwOyBlKyspIHJbZysrXSA9IHQgJiAxIDw8IDcgLSBlID8gZCA6IGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcmNQb3M6IG4sXG4gICAgICAgICAgZGVzdFBvczogZ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sICh0LCBlKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkdsb2JhbFdvcmtlck9wdGlvbnMgPSB2b2lkIDA7XG4gICAgICBjb25zdCBuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGUuR2xvYmFsV29ya2VyT3B0aW9ucyA9IG47XG4gICAgICBuLndvcmtlclBvcnQgPSBudWxsO1xuICAgICAgbi53b3JrZXJTcmMgPSBcIlwiO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9YdCwgXyR0LCBfS3Q7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuTWVzc2FnZUhhbmRsZXIgPSB2b2lkIDA7XG4gICAgICBuKDIpO1xuICAgICAgdmFyIGkgPSBuKDEpO1xuICAgICAgY29uc3QgciA9IDEsXG4gICAgICAgIHMgPSAyLFxuICAgICAgICBhID0gMSxcbiAgICAgICAgbyA9IDIsXG4gICAgICAgIGwgPSAzLFxuICAgICAgICBjID0gNCxcbiAgICAgICAgaCA9IDUsXG4gICAgICAgIGQgPSA2LFxuICAgICAgICB1ID0gNyxcbiAgICAgICAgcCA9IDg7XG4gICAgICBmdW5jdGlvbiB3cmFwUmVhc29uKHQpIHtcbiAgICAgICAgdCBpbnN0YW5jZW9mIEVycm9yIHx8IFwib2JqZWN0XCIgPT0gdHlwZW9mIHQgJiYgbnVsbCAhPT0gdCB8fCAoMCwgaS51bnJlYWNoYWJsZSkoJ3dyYXBSZWFzb246IEV4cGVjdGVkIFwicmVhc29uXCIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTtcbiAgICAgICAgc3dpdGNoICh0Lm5hbWUpIHtcbiAgICAgICAgICBjYXNlIFwiQWJvcnRFeGNlcHRpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgaS5BYm9ydEV4Y2VwdGlvbih0Lm1lc3NhZ2UpO1xuICAgICAgICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGkuTWlzc2luZ1BERkV4Y2VwdGlvbih0Lm1lc3NhZ2UpO1xuICAgICAgICAgIGNhc2UgXCJQYXNzd29yZEV4Y2VwdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBpLlBhc3N3b3JkRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5jb2RlKTtcbiAgICAgICAgICBjYXNlIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGkuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHQubWVzc2FnZSwgdC5zdGF0dXMpO1xuICAgICAgICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgaS5Vbmtub3duRXJyb3JFeGNlcHRpb24odC5tZXNzYWdlLCB0LmRldGFpbHMpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGkuVW5rbm93bkVycm9yRXhjZXB0aW9uKHQubWVzc2FnZSwgdC50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5NZXNzYWdlSGFuZGxlciA9IChfWHQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKSwgXyR0ID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCksIF9LdCA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpLCBjbGFzcyBNZXNzYWdlSGFuZGxlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKF90MTEsIF9lMTAsIF9uNikge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfS3QpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfJHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfWHQpO1xuICAgICAgICAgIHRoaXMuc291cmNlTmFtZSA9IF90MTE7XG4gICAgICAgICAgdGhpcy50YXJnZXROYW1lID0gX2UxMDtcbiAgICAgICAgICB0aGlzLmNvbU9iaiA9IF9uNjtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrSWQgPSAxO1xuICAgICAgICAgIHRoaXMuc3RyZWFtSWQgPSAxO1xuICAgICAgICAgIHRoaXMuc3RyZWFtU2lua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LmRhdGE7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChlLnN0cmVhbSkge1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF8kdCwgXyR0MikuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IGUuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgICBuID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1t0XTtcbiAgICAgICAgICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayBcIi5jb25jYXQodCkpO1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1t0XTtcbiAgICAgICAgICAgICAgaWYgKGUuY2FsbGJhY2sgPT09IHIpIG4ucmVzb2x2ZShlLmRhdGEpO2Vsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlLmNhbGxiYWNrICE9PSBzKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2VcIik7XG4gICAgICAgICAgICAgICAgbi5yZWplY3Qod3JhcFJlYXNvbihlLnJlYXNvbikpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmFjdGlvbkhhbmRsZXJbZS5hY3Rpb25dO1xuICAgICAgICAgICAgaWYgKCFpKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogXCIuY29uY2F0KGUuYWN0aW9uKSk7XG4gICAgICAgICAgICBpZiAoZS5jYWxsYmFja0lkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgICAgYSA9IGUuc291cmNlTmFtZTtcbiAgICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB0KGkoZS5kYXRhKSk7XG4gICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICBfbjYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgc291cmNlTmFtZTogdCxcbiAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGEsXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogcixcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGUuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICBfbjYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgc291cmNlTmFtZTogdCxcbiAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGEsXG4gICAgICAgICAgICAgICAgICBjYWxsYmFjazogcyxcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGUuY2FsbGJhY2tJZCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBlLnN0cmVhbUlkID8gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfWHQsIF9YdDIpLmNhbGwodGhpcywgZSkgOiBpKGUuZGF0YSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBfbjYuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIG9uKHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5hY3Rpb25IYW5kbGVyO1xuICAgICAgICAgIGlmIChuW3RdKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkIFxcXCJcIi5jb25jYXQodCwgXCJcXFwiXCIpKTtcbiAgICAgICAgICBuW3RdID0gZTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG4gICAgICAgICAgICBhY3Rpb246IHQsXG4gICAgICAgICAgICBkYXRhOiBlXG4gICAgICAgICAgfSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgc2VuZFdpdGhQcm9taXNlKHQsIGUsIG4pIHtcbiAgICAgICAgICBjb25zdCByID0gdGhpcy5jYWxsYmFja0lkKyssXG4gICAgICAgICAgICBzID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW3JdID0gcztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcbiAgICAgICAgICAgICAgYWN0aW9uOiB0LFxuICAgICAgICAgICAgICBjYWxsYmFja0lkOiByLFxuICAgICAgICAgICAgICBkYXRhOiBlXG4gICAgICAgICAgICB9LCBuKTtcbiAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICBzLnJlamVjdCh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHMucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kV2l0aFN0cmVhbSh0LCBlLCBuLCByKSB7XG4gICAgICAgICAgY29uc3QgcyA9IHRoaXMuc3RyZWFtSWQrKyxcbiAgICAgICAgICAgIG8gPSB0aGlzLnNvdXJjZU5hbWUsXG4gICAgICAgICAgICBsID0gdGhpcy50YXJnZXROYW1lLFxuICAgICAgICAgICAgYyA9IHRoaXMuY29tT2JqO1xuICAgICAgICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgICAgc3RhcnQ6IG4gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBhID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzXSA9IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBuLFxuICAgICAgICAgICAgICAgIHN0YXJ0Q2FsbDogYSxcbiAgICAgICAgICAgICAgICBwdWxsQ2FsbDogbnVsbCxcbiAgICAgICAgICAgICAgICBjYW5jZWxDYWxsOiBudWxsLFxuICAgICAgICAgICAgICAgIGlzQ2xvc2VkOiAhMVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBjLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBvLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGwsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB0LFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBzLFxuICAgICAgICAgICAgICAgIGRhdGE6IGUsXG4gICAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG4uZGVzaXJlZFNpemVcbiAgICAgICAgICAgICAgfSwgcik7XG4gICAgICAgICAgICAgIHJldHVybiBhLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHVsbDogdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3NdLnB1bGxDYWxsID0gZTtcbiAgICAgICAgICAgICAgYy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTmFtZTogbyxcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiBsLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogZCxcbiAgICAgICAgICAgICAgICBzdHJlYW1JZDogcyxcbiAgICAgICAgICAgICAgICBkZXNpcmVkU2l6ZTogdC5kZXNpcmVkU2l6ZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUucHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYW5jZWw6IHQgPT4ge1xuICAgICAgICAgICAgICAoMCwgaS5hc3NlcnQpKHQgaW5zdGFuY2VvZiBFcnJvciwgXCJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uXCIpO1xuICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzXS5jYW5jZWxDYWxsID0gZTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzXS5pc0Nsb3NlZCA9ICEwO1xuICAgICAgICAgICAgICBjLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBvLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IGwsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiBhLFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBzLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbih0KVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUucHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBuKTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgIHRoaXMuY29tT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmdW5jdGlvbiBfWHQyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuc3RyZWFtSWQsXG4gICAgICAgICAgbiA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgICByID0gdC5zb3VyY2VOYW1lLFxuICAgICAgICAgIHMgPSB0aGlzLmNvbU9iaixcbiAgICAgICAgICBhID0gdGhpcyxcbiAgICAgICAgICBvID0gdGhpcy5hY3Rpb25IYW5kbGVyW3QuYWN0aW9uXSxcbiAgICAgICAgICBkID0ge1xuICAgICAgICAgICAgZW5xdWV1ZSh0KSB7XG4gICAgICAgICAgICAgIGxldCBhID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAxLFxuICAgICAgICAgICAgICAgIG8gPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgY29uc3QgbCA9IHRoaXMuZGVzaXJlZFNpemU7XG4gICAgICAgICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gYTtcbiAgICAgICAgICAgICAgaWYgKGwgPiAwICYmIHRoaXMuZGVzaXJlZFNpemUgPD0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZHkgPSB0aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTmFtZTogbixcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogYyxcbiAgICAgICAgICAgICAgICBzdHJlYW1JZDogZSxcbiAgICAgICAgICAgICAgICBjaHVuazogdFxuICAgICAgICAgICAgICB9LCBvKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZSgpIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9ICEwO1xuICAgICAgICAgICAgICAgIHMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgc291cmNlTmFtZTogbixcbiAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgICBzdHJlYW06IGwsXG4gICAgICAgICAgICAgICAgICBzdHJlYW1JZDogZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBhLnN0cmVhbVNpbmtzW2VdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IodCkge1xuICAgICAgICAgICAgICAoMCwgaS5hc3NlcnQpKHQgaW5zdGFuY2VvZiBFcnJvciwgXCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IG4sXG4gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgICAgICAgc3RyZWFtOiBoLFxuICAgICAgICAgICAgICAgICAgc3RyZWFtSWQ6IGUsXG4gICAgICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24odClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpbmtDYXBhYmlsaXR5OiBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpLFxuICAgICAgICAgICAgb25QdWxsOiBudWxsLFxuICAgICAgICAgICAgb25DYW5jZWw6IG51bGwsXG4gICAgICAgICAgICBpc0NhbmNlbGxlZDogITEsXG4gICAgICAgICAgICBkZXNpcmVkU2l6ZTogdC5kZXNpcmVkU2l6ZSxcbiAgICAgICAgICAgIHJlYWR5OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgZC5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgIGQucmVhZHkgPSBkLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIHRoaXMuc3RyZWFtU2lua3NbZV0gPSBkO1xuICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGUobyh0LmRhdGEsIGQpKTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgdGFyZ2V0TmFtZTogcixcbiAgICAgICAgICAgIHN0cmVhbTogcCxcbiAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgc3VjY2VzczogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHNvdXJjZU5hbWU6IG4sXG4gICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgc3RyZWFtOiBwLFxuICAgICAgICAgICAgc3RyZWFtSWQ6IGUsXG4gICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24odClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfJHQyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQuc3RyZWFtSWQsXG4gICAgICAgICAgbiA9IHRoaXMuc291cmNlTmFtZSxcbiAgICAgICAgICByID0gdC5zb3VyY2VOYW1lLFxuICAgICAgICAgIHMgPSB0aGlzLmNvbU9iaixcbiAgICAgICAgICBmID0gdGhpcy5zdHJlYW1Db250cm9sbGVyc1tlXSxcbiAgICAgICAgICBnID0gdGhpcy5zdHJlYW1TaW5rc1tlXTtcbiAgICAgICAgc3dpdGNoICh0LnN0cmVhbSkge1xuICAgICAgICAgIGNhc2UgcDpcbiAgICAgICAgICAgIHQuc3VjY2VzcyA/IGYuc3RhcnRDYWxsLnJlc29sdmUoKSA6IGYuc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKHQucmVhc29uKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHU6XG4gICAgICAgICAgICB0LnN1Y2Nlc3MgPyBmLnB1bGxDYWxsLnJlc29sdmUoKSA6IGYucHVsbENhbGwucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgZDpcbiAgICAgICAgICAgIGlmICghZykge1xuICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiB1LFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICEwXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGcuZGVzaXJlZFNpemUgPD0gMCAmJiB0LmRlc2lyZWRTaXplID4gMCAmJiBnLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgIGcuZGVzaXJlZFNpemUgPSB0LmRlc2lyZWRTaXplO1xuICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgdmFyIF9nJG9uUHVsbDtcbiAgICAgICAgICAgICAgdCgoX2ckb25QdWxsID0gZy5vblB1bGwpID09PSBudWxsIHx8IF9nJG9uUHVsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ckb25QdWxsLmNhbGwoZykpO1xuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHNvdXJjZU5hbWU6IG4sXG4gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZTogcixcbiAgICAgICAgICAgICAgICBzdHJlYW06IHUsXG4gICAgICAgICAgICAgICAgc3RyZWFtSWQ6IGUsXG4gICAgICAgICAgICAgICAgc3VjY2VzczogITBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiB1LFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbih0KVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBjOlxuICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KShmLCBcImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBpZiAoZi5pc0Nsb3NlZCkgYnJlYWs7XG4gICAgICAgICAgICBmLmNvbnRyb2xsZXIuZW5xdWV1ZSh0LmNodW5rKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgbDpcbiAgICAgICAgICAgICgwLCBpLmFzc2VydCkoZiwgXCJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiKTtcbiAgICAgICAgICAgIGlmIChmLmlzQ2xvc2VkKSBicmVhaztcbiAgICAgICAgICAgIGYuaXNDbG9zZWQgPSAhMDtcbiAgICAgICAgICAgIGYuY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfS3QsIF9LdDIpLmNhbGwodGhpcywgZiwgZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGg6XG4gICAgICAgICAgICAoMCwgaS5hc3NlcnQpKGYsIFwiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBmLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbih0LnJlYXNvbikpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfS3QsIF9LdDIpLmNhbGwodGhpcywgZiwgZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIG86XG4gICAgICAgICAgICB0LnN1Y2Nlc3MgPyBmLmNhbmNlbENhbGwucmVzb2x2ZSgpIDogZi5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKHQucmVhc29uKSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9LdCwgX0t0MikuY2FsbCh0aGlzLCBmLCBlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgYTpcbiAgICAgICAgICAgIGlmICghZykgYnJlYWs7XG4gICAgICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICB2YXIgX2ckb25DYW5jZWw7XG4gICAgICAgICAgICAgIGUoKF9nJG9uQ2FuY2VsID0gZy5vbkNhbmNlbCkgPT09IG51bGwgfHwgX2ckb25DYW5jZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nJG9uQ2FuY2VsLmNhbGwoZywgd3JhcFJlYXNvbih0LnJlYXNvbikpKTtcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lOiBuLFxuICAgICAgICAgICAgICAgIHRhcmdldE5hbWU6IHIsXG4gICAgICAgICAgICAgICAgc3RyZWFtOiBvLFxuICAgICAgICAgICAgICAgIHN0cmVhbUlkOiBlLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICEwXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgcy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgc291cmNlTmFtZTogbixcbiAgICAgICAgICAgICAgICB0YXJnZXROYW1lOiByLFxuICAgICAgICAgICAgICAgIHN0cmVhbTogbyxcbiAgICAgICAgICAgICAgICBzdHJlYW1JZDogZSxcbiAgICAgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24odClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGcuc2lua0NhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24odC5yZWFzb24pKTtcbiAgICAgICAgICAgIGcuaXNDYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW2VdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIF9LdDIodCwgZSkge1xuICAgICAgICB2YXIgX3Qkc3RhcnRDYWxsLCBfdCRwdWxsQ2FsbCwgX3QkY2FuY2VsQ2FsbDtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsoX3Qkc3RhcnRDYWxsID0gdC5zdGFydENhbGwpID09PSBudWxsIHx8IF90JHN0YXJ0Q2FsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Qkc3RhcnRDYWxsLnByb21pc2UsIChfdCRwdWxsQ2FsbCA9IHQucHVsbENhbGwpID09PSBudWxsIHx8IF90JHB1bGxDYWxsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdCRwdWxsQ2FsbC5wcm9taXNlLCAoX3QkY2FuY2VsQ2FsbCA9IHQuY2FuY2VsQ2FsbCkgPT09IG51bGwgfHwgX3QkY2FuY2VsQ2FsbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3QkY2FuY2VsQ2FsbC5wcm9taXNlXSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2VdO1xuICAgICAgfVxuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9ZdCwgX0p0O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLk1ldGFkYXRhID0gdm9pZCAwO1xuICAgICAgdmFyIGkgPSBuKDEpO1xuICAgICAgZS5NZXRhZGF0YSA9IChfWXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKSwgX0p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIGNsYXNzIE1ldGFkYXRhIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9ZdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0p0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgcGFyc2VkRGF0YTogZSxcbiAgICAgICAgICAgIHJhd0RhdGE6IG5cbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1l0LCBlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0p0LCBuKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSYXcoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSnQpO1xuICAgICAgICB9XG4gICAgICAgIGdldCh0KSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDg7XG4gICAgICAgICAgcmV0dXJuIChfY2xhc3NQcml2YXRlRmllbGRHZXQ4ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZdCkuZ2V0KHQpKSAhPT0gbnVsbCAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQ4ICE9PSB2b2lkIDAgPyBfY2xhc3NQcml2YXRlRmllbGRHZXQ4IDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRBbGwoKSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBpLm9iamVjdEZyb21NYXApKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWXQpKTtcbiAgICAgICAgfVxuICAgICAgICBoYXModCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1l0KS5oYXModCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9adCwgX3RlLCBfZWUsIF9uZSwgX2llO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLk9wdGlvbmFsQ29udGVudENvbmZpZyA9IHZvaWQgMDtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY5KTtcbiAgICAgIGNvbnN0IHMgPSBTeW1ib2woXCJJTlRFUk5BTFwiKTtcbiAgICAgIHZhciBfUXQgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIE9wdGlvbmFsQ29udGVudEdyb3VwIHtcbiAgICAgICAgY29uc3RydWN0b3IodCwgZSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9RdCwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSB0O1xuICAgICAgICAgIHRoaXMuaW50ZW50ID0gZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgdmlzaWJsZSgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RdCk7XG4gICAgICAgIH1cbiAgICAgICAgX3NldFZpc2libGUodCwgZSkge1xuICAgICAgICAgIHQgIT09IHMgJiYgKDAsIGkudW5yZWFjaGFibGUpKFwiSW50ZXJuYWwgbWV0aG9kIGBfc2V0VmlzaWJsZWAgY2FsbGVkLlwiKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1F0LCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5PcHRpb25hbENvbnRlbnRDb25maWcgPSAoX1p0ID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIF90ZSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpLCBfZWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKSwgX25lID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIF9pZSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpLCBjbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWcge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDEyKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9pZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1p0LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3RlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgTWFwKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZWUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY3JlYXRvciA9IG51bGw7XG4gICAgICAgICAgaWYgKG51bGwgIT09IF90MTIpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IF90MTIubmFtZTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRvciA9IF90MTIuY3JlYXRvcjtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbmUsIF90MTIub3JkZXIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIF90MTIuZ3JvdXBzKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5zZXQoZS5pZCwgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKGUubmFtZSwgZS5pbnRlbnQpKTtcbiAgICAgICAgICAgIGlmIChcIk9GRlwiID09PSBfdDEyLmJhc2VTdGF0ZSkgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLnZhbHVlcygpKSB0Ll9zZXRWaXNpYmxlKHMsICExKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBfdDEyLm9uKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkuX3NldFZpc2libGUocywgITApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIF90MTIub2ZmKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkuX3NldFZpc2libGUocywgITEpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9lZSwgdGhpcy5nZXRIYXNoKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpc1Zpc2libGUodCkge1xuICAgICAgICAgIGlmICgwID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5zaXplKSByZXR1cm4gITA7XG4gICAgICAgICAgaWYgKCF0KSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKShcIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXCJPQ0dcIiA9PT0gdC50eXBlKSB7XG4gICAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmhhcyh0LmlkKSkge1xuICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIk9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiBcIi5jb25jYXQodC5pZCkpO1xuICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuZ2V0KHQuaWQpLnZpc2libGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcIk9DTURcIiA9PT0gdC50eXBlKSB7XG4gICAgICAgICAgICBpZiAodC5leHByZXNzaW9uKSByZXR1cm4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfaWUsIF9pZTIpLmNhbGwodGhpcywgdC5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmICghdC5wb2xpY3kgfHwgXCJBbnlPblwiID09PSB0LnBvbGljeSkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdC5pZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmhhcyhlKSkge1xuICAgICAgICAgICAgICAgICAgKDAsIGkud2FybikoXCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogXCIuY29uY2F0KGUpKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmdldChlKS52aXNpYmxlKSByZXR1cm4gITA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFwiQWxsT25cIiA9PT0gdC5wb2xpY3kpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuZ2V0KGUpLnZpc2libGUpIHJldHVybiAhMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJBbnlPZmZcIiA9PT0gdC5wb2xpY3kpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuZ2V0KGUpLnZpc2libGUpIHJldHVybiAhMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJBbGxPZmZcIiA9PT0gdC5wb2xpY3kpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQuaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXMoZSkpIHtcbiAgICAgICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkudmlzaWJsZSkgcmV0dXJuICExO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICgwLCBpLndhcm4pKFwiVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSBcIi5jb25jYXQodC5wb2xpY3ksIFwiLlwiKSk7XG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgfVxuICAgICAgICAgICgwLCBpLndhcm4pKFwiVW5rbm93biBncm91cCB0eXBlIFwiLmNvbmNhdCh0LnR5cGUsIFwiLlwiKSk7XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICB9XG4gICAgICAgIHNldFZpc2liaWxpdHkodCkge1xuICAgICAgICAgIGxldCBlID0gIShhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSkgfHwgYXJndW1lbnRzWzFdO1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5oYXModCkpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLmdldCh0KS5fc2V0VmlzaWJsZShzLCAhIWUpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9adCwgbnVsbCk7XG4gICAgICAgICAgfSBlbHNlICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdCh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGhhc0luaXRpYWxWaXNpYmlsaXR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldEhhc2goKSA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9lZSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0T3JkZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpLnNpemUgPyBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25lKSA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbmUpLnNsaWNlKCkgOiBbLi4uX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkua2V5cygpXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0R3JvdXBzKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5zaXplID4gMCA/ICgwLCBpLm9iamVjdEZyb21NYXApKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpKSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0R3JvdXAodCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQodCkgfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRIYXNoKCkge1xuICAgICAgICAgIGlmIChudWxsICE9PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1p0KSkgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWnQpO1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgci5NdXJtdXJIYXNoM182NCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgW2UsIG5dIG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGUpKSB0LnVwZGF0ZShcIlwiLmNvbmNhdChlLCBcIjpcIikuY29uY2F0KG4udmlzaWJsZSkpO1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1p0LCB0LmhleGRpZ2VzdCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBmdW5jdGlvbiBfaWUyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQubGVuZ3RoO1xuICAgICAgICBpZiAoZSA8IDIpIHJldHVybiAhMDtcbiAgICAgICAgY29uc3QgbiA9IHRbMF07XG4gICAgICAgIGZvciAobGV0IHIgPSAxOyByIDwgZTsgcisrKSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRbcl07XG4gICAgICAgICAgbGV0IHM7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHMgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9pZSwgX2llMikuY2FsbCh0aGlzLCBlKTtlbHNlIHtcbiAgICAgICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90ZSkuaGFzKGUpKSB7XG4gICAgICAgICAgICAgICgwLCBpLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6IFwiLmNvbmNhdChlKSk7XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3RlKS5nZXQoZSkudmlzaWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgICBjYXNlIFwiQW5kXCI6XG4gICAgICAgICAgICAgIGlmICghcykgcmV0dXJuICExO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJPclwiOlxuICAgICAgICAgICAgICBpZiAocykgcmV0dXJuICEwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJOb3RcIjpcbiAgICAgICAgICAgICAgcmV0dXJuICFzO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJBbmRcIiA9PT0gbjtcbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5QREZEYXRhVHJhbnNwb3J0U3RyZWFtID0gdm9pZCAwO1xuICAgICAgbig5Myk7XG4gICAgICBuKDEwMSk7XG4gICAgICBuKDEwMik7XG4gICAgICBuKDEwNSk7XG4gICAgICBuKDEwNyk7XG4gICAgICBuKDEwOSk7XG4gICAgICBuKDExMyk7XG4gICAgICBuKDExNik7XG4gICAgICBuKDEyMyk7XG4gICAgICBuKDg5KTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY3KTtcbiAgICAgIGUuUERGRGF0YVRyYW5zcG9ydFN0cmVhbSA9IGNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGxlbmd0aDogbixcbiAgICAgICAgICAgIGluaXRpYWxEYXRhOiByLFxuICAgICAgICAgICAgcHJvZ3Jlc3NpdmVEb25lOiBzID0gITEsXG4gICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTogYSA9IG51bGwsXG4gICAgICAgICAgICBkaXNhYmxlUmFuZ2U6IG8gPSAhMSxcbiAgICAgICAgICAgIGRpc2FibGVTdHJlYW06IGwgPSAhMVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICgwLCBpLmFzc2VydCkoZSwgJ1BERkRhdGFUcmFuc3BvcnRTdHJlYW0gLSBtaXNzaW5nIHJlcXVpcmVkIFwicGRmRGF0YVJhbmdlVHJhbnNwb3J0XCIgYXJndW1lbnQuJyk7XG4gICAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gW107XG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gcztcbiAgICAgICAgICB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGE7XG4gICAgICAgICAgaWYgKChyID09PSBudWxsIHx8IHIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHIubGVuZ3RoKSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSByIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiByLmJ5dGVMZW5ndGggPT09IHIuYnVmZmVyLmJ5dGVMZW5ndGggPyByLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KHIpLmJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBlO1xuICAgICAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIWw7XG4gICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFvO1xuICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBuO1xuICAgICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9yYW5nZVJlYWRlcnMgPSBbXTtcbiAgICAgICAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUmFuZ2VMaXN0ZW5lcigodCwgZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7XG4gICAgICAgICAgICAgIGJlZ2luOiB0LFxuICAgICAgICAgICAgICBjaHVuazogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzTGlzdGVuZXIoKHQsIGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgICBsb2FkZWQ6IHQsXG4gICAgICAgICAgICAgIHRvdGFsOiBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIodCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vblJlY2VpdmVEYXRhKHtcbiAgICAgICAgICAgICAgY2h1bms6IHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vblByb2dyZXNzaXZlRG9uZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC50cmFuc3BvcnRSZWFkeSgpO1xuICAgICAgICB9XG4gICAgICAgIF9vblJlY2VpdmVEYXRhKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgYmVnaW46IGUsXG4gICAgICAgICAgICBjaHVuazogblxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGNvbnN0IHIgPSBuIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBuLmJ5dGVMZW5ndGggPT09IG4uYnVmZmVyLmJ5dGVMZW5ndGggPyBuLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KG4pLmJ1ZmZlcjtcbiAgICAgICAgICBpZiAodm9pZCAwID09PSBlKSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA/IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9lbnF1ZXVlKHIpIDogdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2gocik7ZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQuX2JlZ2luICE9PSBlKSByZXR1cm4gITE7XG4gICAgICAgICAgICAgIHQuX2VucXVldWUocik7XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgKDAsIGkuYXNzZXJ0KSh0LCBcIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhLCBfdGhpcyRfZnVsbFJlcXVlc3RSZWEyO1xuICAgICAgICAgIHJldHVybiAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhID0gKF90aGlzJF9mdWxsUmVxdWVzdFJlYTIgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMi5fbG9hZGVkKSAhPT0gbnVsbCAmJiBfdGhpcyRfZnVsbFJlcXVlc3RSZWEgIT09IHZvaWQgMCA/IF90aGlzJF9mdWxsUmVxdWVzdFJlYSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgX29uUHJvZ3Jlc3ModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfcmFuZ2VSZWFkZXJzJCwgX3RoaXMkX3JhbmdlUmVhZGVycyQkLCBfdGhpcyRfZnVsbFJlcXVlc3RSZWEzLCBfdGhpcyRfZnVsbFJlcXVlc3RSZWE0O1xuICAgICAgICAgIHZvaWQgMCA9PT0gdC50b3RhbCA/IChfdGhpcyRfcmFuZ2VSZWFkZXJzJCA9IHRoaXMuX3JhbmdlUmVhZGVyc1swXSkgPT09IG51bGwgfHwgX3RoaXMkX3JhbmdlUmVhZGVycyQgPT09IHZvaWQgMCB8fCAoX3RoaXMkX3JhbmdlUmVhZGVycyQkID0gX3RoaXMkX3JhbmdlUmVhZGVycyQub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkX3JhbmdlUmVhZGVycyQkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfcmFuZ2VSZWFkZXJzJCQuY2FsbChfdGhpcyRfcmFuZ2VSZWFkZXJzJCwge1xuICAgICAgICAgICAgbG9hZGVkOiB0LmxvYWRlZFxuICAgICAgICAgIH0pIDogKF90aGlzJF9mdWxsUmVxdWVzdFJlYTMgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMyA9PT0gdm9pZCAwIHx8IChfdGhpcyRfZnVsbFJlcXVlc3RSZWE0ID0gX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMy5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlcXVlc3RSZWE0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfZnVsbFJlcXVlc3RSZWE0LmNhbGwoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMywge1xuICAgICAgICAgICAgbG9hZGVkOiB0LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiB0LnRvdGFsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgX29uUHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWE1O1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWE1ID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9mdWxsUmVxdWVzdFJlYTUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTUucHJvZ3Jlc3NpdmVEb25lKCk7XG4gICAgICAgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gITA7XG4gICAgICAgIH1cbiAgICAgICAgX3JlbW92ZVJhbmdlUmVhZGVyKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5fcmFuZ2VSZWFkZXJzLmluZGV4T2YodCk7XG4gICAgICAgICAgZSA+PSAwICYmIHRoaXMuX3JhbmdlUmVhZGVycy5zcGxpY2UoZSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICAgICAgICAoMCwgaS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZEYXRhVHJhbnNwb3J0U3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9xdWV1ZWRDaHVua3M7XG4gICAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIodGhpcywgdCwgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lLCB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UmFuZ2VSZWFkZXIodCwgZSkge1xuICAgICAgICAgIGlmIChlIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY29uc3QgbiA9IG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgdCwgZSk7XG4gICAgICAgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2UodCwgZSk7XG4gICAgICAgICAgdGhpcy5fcmFuZ2VSZWFkZXJzLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsQWxsUmVxdWVzdHModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWE2O1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWE2ID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9mdWxsUmVxdWVzdFJlYTYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTYuY2FuY2VsKHQpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yYW5nZVJlYWRlcnMuc2xpY2UoMCkpIGUuY2FuY2VsKHQpO1xuICAgICAgICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUpIHtcbiAgICAgICAgICBsZXQgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdICYmIGFyZ3VtZW50c1syXSxcbiAgICAgICAgICAgIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gICAgICAgICAgdGhpcy5fc3RyZWFtID0gdDtcbiAgICAgICAgICB0aGlzLl9kb25lID0gbiB8fCAhMTtcbiAgICAgICAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCByLmlzUGRmRmlsZSkoaSkgPyBpIDogbnVsbDtcbiAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBlIHx8IFtdO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3F1ZXVlZENodW5rcykgdGhpcy5fbG9hZGVkICs9IHQuYnl0ZUxlbmd0aDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgIHQuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcztcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9lbnF1ZXVlKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2godCk7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgKz0gdC5ieXRlTGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVhZHk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZpbGVuYW1lKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1JhbmdlU3VwcG9ydGVkO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9jb250ZW50TGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5fcXVldWVkQ2h1bmtzLnNoaWZ0KCksXG4gICAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5fZG9uZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgdCA9IG5ldyBpLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMucHVzaCh0KTtcbiAgICAgICAgICByZXR1cm4gdC5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbCh0KSB7XG4gICAgICAgICAgdGhpcy5fZG9uZSA9ICEwO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cykgdC5yZXNvbHZlKHtcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICBkb25lOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHJvZ3Jlc3NpdmVEb25lKCkge1xuICAgICAgICAgIHRoaXMuX2RvbmUgfHwgKHRoaXMuX2RvbmUgPSAhMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLl9zdHJlYW0gPSB0O1xuICAgICAgICAgIHRoaXMuX2JlZ2luID0gZTtcbiAgICAgICAgICB0aGlzLl9lbmQgPSBuO1xuICAgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9lbnF1ZXVlKHQpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgICAgICAgIGlmICgwID09PSB0aGlzLl9yZXF1ZXN0cy5sZW5ndGgpIHRoaXMuX3F1ZXVlZENodW5rID0gdDtlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdHMuc2hpZnQoKS5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHQpO1xuICAgICAgICAgIHJldHVybiB0LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsKHQpIHtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuUERGRmV0Y2hTdHJlYW0gPSB2b2lkIDA7XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIG4oODkpO1xuICAgICAgdmFyIGkgPSBuKDEpLFxuICAgICAgICByID0gbigxODEpO1xuICAgICAgZnVuY3Rpb24gY3JlYXRlRmV0Y2hPcHRpb25zKHQsIGUsIG4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgaGVhZGVyczogdCxcbiAgICAgICAgICBzaWduYWw6IG4uc2lnbmFsLFxuICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBlID8gXCJpbmNsdWRlXCIgOiBcInNhbWUtb3JpZ2luXCIsXG4gICAgICAgICAgcmVkaXJlY3Q6IFwiZm9sbG93XCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnModCkge1xuICAgICAgICBjb25zdCBlID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgZm9yIChjb25zdCBuIGluIHQpIHtcbiAgICAgICAgICBjb25zdCBpID0gdFtuXTtcbiAgICAgICAgICB2b2lkIDAgIT09IGkgJiYgZS5hcHBlbmQobiwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih0KSB7XG4gICAgICAgIGlmICh0IGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIHQuYnVmZmVyO1xuICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSByZXR1cm4gdDtcbiAgICAgICAgKDAsIGkud2FybikoXCJnZXRBcnJheUJ1ZmZlciAtIHVuZXhwZWN0ZWQgZGF0YSBmb3JtYXQ6IFwiLmNvbmNhdCh0KSk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0KS5idWZmZXI7XG4gICAgICB9XG4gICAgICBlLlBERkZldGNoU3RyZWFtID0gY2xhc3MgUERGRmV0Y2hTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5zb3VyY2UgPSB0O1xuICAgICAgICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh0LnVybCk7XG4gICAgICAgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHQuaHR0cEhlYWRlcnMgfHwge307XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhNywgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhODtcbiAgICAgICAgICByZXR1cm4gKF90aGlzJF9mdWxsUmVxdWVzdFJlYTcgPSAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhOCA9IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlcXVlc3RSZWE4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfZnVsbFJlcXVlc3RSZWE4Ll9sb2FkZWQpICE9PSBudWxsICYmIF90aGlzJF9mdWxsUmVxdWVzdFJlYTcgIT09IHZvaWQgMCA/IF90aGlzJF9mdWxsUmVxdWVzdFJlYTcgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgICAgICAgKDAsIGkuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGRmV0Y2hTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SZWFkZXIodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICAgICAgICB9XG4gICAgICAgIGdldFJhbmdlUmVhZGVyKHQsIGUpIHtcbiAgICAgICAgICBpZiAoZSA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCB0LCBlKTtcbiAgICAgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsQWxsUmVxdWVzdHModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWE5O1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWE5ID0gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9mdWxsUmVxdWVzdFJlYTkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTkuY2FuY2VsKHQpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSBlLmNhbmNlbCh0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNsYXNzIFBERkZldGNoU3RyZWFtUmVhZGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHRoaXMuX3N0cmVhbSA9IHQ7XG4gICAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICAgICAgICB0aGlzLl9sb2FkZWQgPSAwO1xuICAgICAgICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBlID0gdC5zb3VyY2U7XG4gICAgICAgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gZS53aXRoQ3JlZGVudGlhbHMgfHwgITE7XG4gICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBlLmRpc2FibGVSYW5nZSB8fCAhMTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IGUucmFuZ2VDaHVua1NpemU7XG4gICAgICAgICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgfHwgdGhpcy5fZGlzYWJsZVJhbmdlIHx8ICh0aGlzLl9kaXNhYmxlUmFuZ2UgPSAhMCk7XG4gICAgICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIWUuZGlzYWJsZVN0cmVhbTtcbiAgICAgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIWUuZGlzYWJsZVJhbmdlO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnMgPSBjcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7XG4gICAgICAgICAgY29uc3QgbiA9IGUudXJsO1xuICAgICAgICAgIGZldGNoKG4sIGNyZWF0ZUZldGNoT3B0aW9ucyh0aGlzLl9oZWFkZXJzLCB0aGlzLl93aXRoQ3JlZGVudGlhbHMsIHRoaXMuX2Fib3J0Q29udHJvbGxlcikpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICBpZiAoISgwLCByLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHQuc3RhdHVzKSkgdGhyb3cgKDAsIHIuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodC5zdGF0dXMsIG4pO1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyID0gdC5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBlID0+IHQuaGVhZGVycy5nZXQoZSksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IGUsXG4gICAgICAgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiBzXG4gICAgICAgICAgICAgIH0gPSAoMCwgci52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe1xuICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgICAgICAgICBpc0h0dHA6IHRoaXMuX3N0cmVhbS5pc0h0dHAsXG4gICAgICAgICAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuICAgICAgICAgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGU7XG4gICAgICAgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gcyB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgci5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgICAgICAgICAhdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCAmJiB0aGlzLmNhbmNlbChuZXcgaS5BYm9ydEV4Y2VwdGlvbihcIlN0cmVhbWluZyBpcyBkaXNhYmxlZC5cIikpO1xuICAgICAgICAgIH0pLmNhdGNoKHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWxlbmFtZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzO1xuICAgICAgICAgIGF3YWl0IHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdmFsdWU6IHQsXG4gICAgICAgICAgICBkb25lOiBlXG4gICAgICAgICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgICAgICAgaWYgKGUpIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgIGRvbmU6IGVcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX2xvYWRlZCArPSB0LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgKF90aGlzJG9uUHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MpID09PSBudWxsIHx8IF90aGlzJG9uUHJvZ3Jlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3MuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih0KSxcbiAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfcmVhZGVyO1xuICAgICAgICAgIChfdGhpcyRfcmVhZGVyID0gdGhpcy5fcmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfcmVhZGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfcmVhZGVyLmNhbmNlbCh0KTtcbiAgICAgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUERGRmV0Y2hTdHJlYW1SYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICB0aGlzLl9zdHJlYW0gPSB0O1xuICAgICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICAgICAgICBjb25zdCBzID0gdC5zb3VyY2U7XG4gICAgICAgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gcy53aXRoQ3JlZGVudGlhbHMgfHwgITE7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXMuZGlzYWJsZVN0cmVhbTtcbiAgICAgICAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgdGhpcy5faGVhZGVycyA9IGNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzLmFwcGVuZChcIlJhbmdlXCIsIFwiYnl0ZXM9XCIuY29uY2F0KGUsIFwiLVwiKS5jb25jYXQobiAtIDEpKTtcbiAgICAgICAgICBjb25zdCBhID0gcy51cmw7XG4gICAgICAgICAgZmV0Y2goYSwgY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsIHRoaXMuX3dpdGhDcmVkZW50aWFscywgdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbih0ID0+IHtcbiAgICAgICAgICAgIGlmICghKDAsIHIudmFsaWRhdGVSZXNwb25zZVN0YXR1cykodC5zdGF0dXMpKSB0aHJvdyAoMCwgci5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKSh0LnN0YXR1cywgYSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIgPSB0LmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgfSkuY2F0Y2godGhpcy5fcmVhZENhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVhZCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkb25Qcm9ncmVzczI7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgIGRvbmU6IGVcbiAgICAgICAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICBpZiAoZSkgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgICAgZG9uZTogZVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHQuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAoX3RoaXMkb25Qcm9ncmVzczIgPSB0aGlzLm9uUHJvZ3Jlc3MpID09PSBudWxsIHx8IF90aGlzJG9uUHJvZ3Jlc3MyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRvblByb2dyZXNzMi5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih0KSxcbiAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfcmVhZGVyMjtcbiAgICAgICAgICAoX3RoaXMkX3JlYWRlcjIgPSB0aGlzLl9yZWFkZXIpID09PSBudWxsIHx8IF90aGlzJF9yZWFkZXIyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRfcmVhZGVyMi5jYW5jZWwodCk7XG4gICAgICAgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yID0gZnVuY3Rpb24gY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcih0LCBlKSB7XG4gICAgICAgIGlmICg0MDQgPT09IHQgfHwgMCA9PT0gdCAmJiBlLnN0YXJ0c1dpdGgoXCJmaWxlOlwiKSkgcmV0dXJuIG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGIFwiJyArIGUgKyAnXCIuJyk7XG4gICAgICAgIHJldHVybiBuZXcgaS5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oXCJVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZSAoXCIuY29uY2F0KHQsIFwiKSB3aGlsZSByZXRyaWV2aW5nIFBERiBcXFwiXCIpLmNvbmNhdChlLCBcIlxcXCIuXCIpLCB0KTtcbiAgICAgIH07XG4gICAgICBlLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIgPSBmdW5jdGlvbiBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHQoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIpO1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgIGxldCB0ID0gKDAsIHIuZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyKShlKTtcbiAgICAgICAgICBpZiAodC5pbmNsdWRlcyhcIiVcIikpIHRyeSB7XG4gICAgICAgICAgICB0ID0gZGVjb2RlVVJJQ29tcG9uZW50KHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKF91bnVzZWQxMikge31cbiAgICAgICAgICBpZiAoKDAsIHMuaXNQZGZGaWxlKSh0KSkgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9O1xuICAgICAgZS52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHQpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcjogZSxcbiAgICAgICAgICBpc0h0dHA6IG4sXG4gICAgICAgICAgcmFuZ2VDaHVua1NpemU6IGksXG4gICAgICAgICAgZGlzYWJsZVJhbmdlOiByXG4gICAgICAgIH0gPSB0O1xuICAgICAgICBjb25zdCBzID0ge1xuICAgICAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzOiAhMSxcbiAgICAgICAgICAgIHN1Z2dlc3RlZExlbmd0aDogdm9pZCAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhID0gcGFyc2VJbnQoZShcIkNvbnRlbnQtTGVuZ3RoXCIpLCAxMCk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhKSkgcmV0dXJuIHM7XG4gICAgICAgIHMuc3VnZ2VzdGVkTGVuZ3RoID0gYTtcbiAgICAgICAgaWYgKGEgPD0gMiAqIGkpIHJldHVybiBzO1xuICAgICAgICBpZiAociB8fCAhbikgcmV0dXJuIHM7XG4gICAgICAgIGlmIChcImJ5dGVzXCIgIT09IGUoXCJBY2NlcHQtUmFuZ2VzXCIpKSByZXR1cm4gcztcbiAgICAgICAgaWYgKFwiaWRlbnRpdHlcIiAhPT0gKGUoXCJDb250ZW50LUVuY29kaW5nXCIpIHx8IFwiaWRlbnRpdHlcIikpIHJldHVybiBzO1xuICAgICAgICBzLmFsbG93UmFuZ2VSZXF1ZXN0cyA9ICEwO1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH07XG4gICAgICBlLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMgPSBmdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHQpIHtcbiAgICAgICAgcmV0dXJuIDIwMCA9PT0gdCB8fCAyMDYgPT09IHQ7XG4gICAgICB9O1xuICAgICAgdmFyIGkgPSBuKDEpLFxuICAgICAgICByID0gbigxODIpLFxuICAgICAgICBzID0gbigxNjcpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlciA9IGZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcih0KSB7XG4gICAgICAgIGxldCBlID0gITAsXG4gICAgICAgICAgbiA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVxcXFwqXCIsIFwiaVwiKS5leGVjKHQpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIG4gPSBuWzFdO1xuICAgICAgICAgIGxldCB0ID0gcmZjMjYxNnVucXVvdGUobik7XG4gICAgICAgICAgdCA9IHVuZXNjYXBlKHQpO1xuICAgICAgICAgIHQgPSByZmM1OTg3ZGVjb2RlKHQpO1xuICAgICAgICAgIHQgPSByZmMyMDQ3ZGVjb2RlKHQpO1xuICAgICAgICAgIHJldHVybiBmaXh1cEVuY29kaW5nKHQpO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBmdW5jdGlvbiByZmMyMjMxZ2V0cGFyYW0odCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgICBsZXQgbjtcbiAgICAgICAgICBjb25zdCBpID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXFxcXCooKD8hMFxcXFxkKVxcXFxkKykoXFxcXCo/KVwiLCBcImlnXCIpO1xuICAgICAgICAgIGZvciAoOyBudWxsICE9PSAobiA9IGkuZXhlYyh0KSk7KSB7XG4gICAgICAgICAgICBsZXQgWywgdCwgaSwgcl0gPSBuO1xuICAgICAgICAgICAgdCA9IHBhcnNlSW50KHQsIDEwKTtcbiAgICAgICAgICAgIGlmICh0IGluIGUpIHtcbiAgICAgICAgICAgICAgaWYgKDAgPT09IHQpIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGVbdF0gPSBbaSwgcl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHIgPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoICYmIHQgaW4gZTsgKyt0KSB7XG4gICAgICAgICAgICBsZXQgW24sIGldID0gZVt0XTtcbiAgICAgICAgICAgIGkgPSByZmMyNjE2dW5xdW90ZShpKTtcbiAgICAgICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgICAgIGkgPSB1bmVzY2FwZShpKTtcbiAgICAgICAgICAgICAgMCA9PT0gdCAmJiAoaSA9IHJmYzU5ODdkZWNvZGUoaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgci5wdXNoKGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gci5qb2luKFwiXCIpO1xuICAgICAgICB9KHQpO1xuICAgICAgICBpZiAobikge1xuICAgICAgICAgIHJldHVybiBmaXh1cEVuY29kaW5nKHJmYzIwNDdkZWNvZGUobikpO1xuICAgICAgICB9XG4gICAgICAgIG4gPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcIiwgXCJpXCIpLmV4ZWModCk7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgbiA9IG5bMV07XG4gICAgICAgICAgbGV0IHQgPSByZmMyNjE2dW5xdW90ZShuKTtcbiAgICAgICAgICB0ID0gcmZjMjA0N2RlY29kZSh0KTtcbiAgICAgICAgICByZXR1cm4gZml4dXBFbmNvZGluZyh0KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB0b1BhcmFtUmVnRXhwKHQsIGUpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIig/Ol58OylcXFxccypcIiArIHQgKyAnXFxcXHMqPVxcXFxzKihbXlwiO1xcXFxzXVteO1xcXFxzXSp8XCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcXCI/KStcIj8pJywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gdGV4dGRlY29kZSh0LCBuKSB7XG4gICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgIGlmICghL15bXFx4MDAtXFx4RkZdKyQvLnRlc3QobikpIHJldHVybiBuO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgciA9IG5ldyBUZXh0RGVjb2Rlcih0LCB7XG4gICAgICAgICAgICAgICAgICBmYXRhbDogITBcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzID0gKDAsIGkuc3RyaW5nVG9CeXRlcykobik7XG4gICAgICAgICAgICAgIG4gPSByLmRlY29kZShzKTtcbiAgICAgICAgICAgICAgZSA9ICExO1xuICAgICAgICAgICAgfSBjYXRjaCAoX3VudXNlZDEzKSB7fVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmaXh1cEVuY29kaW5nKHQpIHtcbiAgICAgICAgICBpZiAoZSAmJiAvW1xceDgwLVxceGZmXS8udGVzdCh0KSkge1xuICAgICAgICAgICAgdCA9IHRleHRkZWNvZGUoXCJ1dGYtOFwiLCB0KTtcbiAgICAgICAgICAgIGUgJiYgKHQgPSB0ZXh0ZGVjb2RlKFwiaXNvLTg4NTktMVwiLCB0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJmYzI2MTZ1bnF1b3RlKHQpIHtcbiAgICAgICAgICBpZiAodC5zdGFydHNXaXRoKCdcIicpKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5zbGljZSgxKS5zcGxpdCgnXFxcXFwiJyk7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IGVbdF0uaW5kZXhPZignXCInKTtcbiAgICAgICAgICAgICAgaWYgKC0xICE9PSBuKSB7XG4gICAgICAgICAgICAgICAgZVt0XSA9IGVbdF0uc2xpY2UoMCwgbik7XG4gICAgICAgICAgICAgICAgZS5sZW5ndGggPSB0ICsgMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlW3RdID0gZVt0XS5yZXBsYWNlQWxsKC9cXFxcKC4pL2csIFwiJDFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ID0gZS5qb2luKCdcIicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiByZmM1OTg3ZGVjb2RlKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdC5pbmRleE9mKFwiJ1wiKTtcbiAgICAgICAgICBpZiAoLTEgPT09IGUpIHJldHVybiB0O1xuICAgICAgICAgIHJldHVybiB0ZXh0ZGVjb2RlKHQuc2xpY2UoMCwgZSksIHQuc2xpY2UoZSArIDEpLnJlcGxhY2UoL15bXiddKicvLCBcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmZjMjA0N2RlY29kZSh0KSB7XG4gICAgICAgICAgcmV0dXJuICF0LnN0YXJ0c1dpdGgoXCI9P1wiKSB8fCAvW1xceDAwLVxceDE5XFx4ODAtXFx4ZmZdLy50ZXN0KHQpID8gdCA6IHQucmVwbGFjZUFsbCgvPVxcPyhbXFx3LV0qKVxcPyhbUXFCYl0pXFw/KCg/OlteP118XFw/KD8hPSkpKilcXD89L2csIGZ1bmN0aW9uICh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgICBpZiAoXCJxXCIgPT09IG4gfHwgXCJRXCIgPT09IG4pIHJldHVybiB0ZXh0ZGVjb2RlKGUsIGkgPSAoaSA9IGkucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpKS5yZXBsYWNlQWxsKC89KFswLTlhLWZBLUZdezJ9KS9nLCBmdW5jdGlvbiAodCwgZSkge1xuICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlLCAxNikpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaSA9IGF0b2IoaSk7XG4gICAgICAgICAgICB9IGNhdGNoIChfdW51c2VkMTQpIHt9XG4gICAgICAgICAgICByZXR1cm4gdGV4dGRlY29kZShlLCBpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH07XG4gICAgICBuKDg5KTtcbiAgICAgIG4oMTQ4KTtcbiAgICAgIHZhciBpID0gbigxKTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5QREZOZXR3b3JrU3RyZWFtID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE4MSk7XG4gICAgICBjbGFzcyBOZXR3b3JrTWFuYWdlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICAgICAgdGhpcy51cmwgPSB0O1xuICAgICAgICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh0KTtcbiAgICAgICAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgZS5odHRwSGVhZGVycyB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gZS53aXRoQ3JlZGVudGlhbHMgfHwgITE7XG4gICAgICAgICAgdGhpcy5jdXJyWGhySWQgPSAwO1xuICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0UmFuZ2UodCwgZSwgbikge1xuICAgICAgICAgIGNvbnN0IGkgPSB7XG4gICAgICAgICAgICBiZWdpbjogdCxcbiAgICAgICAgICAgIGVuZDogZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZm9yIChjb25zdCB0IGluIG4pIGlbdF0gPSBuW3RdO1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdEZ1bGwodCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpLFxuICAgICAgICAgICAgbiA9IHRoaXMuY3VyclhocklkKyssXG4gICAgICAgICAgICBpID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbbl0gPSB7XG4gICAgICAgICAgICAgIHhocjogZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICBlLm9wZW4oXCJHRVRcIiwgdGhpcy51cmwpO1xuICAgICAgICAgIGUud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG4gICAgICAgICAgZm9yIChjb25zdCB0IGluIHRoaXMuaHR0cEhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmh0dHBIZWFkZXJzW3RdO1xuICAgICAgICAgICAgdm9pZCAwICE9PSBuICYmIGUuc2V0UmVxdWVzdEhlYWRlcih0LCBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuaXNIdHRwICYmIFwiYmVnaW5cIiBpbiB0ICYmIFwiZW5kXCIgaW4gdCkge1xuICAgICAgICAgICAgZS5zZXRSZXF1ZXN0SGVhZGVyKFwiUmFuZ2VcIiwgXCJieXRlcz1cIi5jb25jYXQodC5iZWdpbiwgXCItXCIpLmNvbmNhdCh0LmVuZCAtIDEpKTtcbiAgICAgICAgICAgIGkuZXhwZWN0ZWRTdGF0dXMgPSAyMDY7XG4gICAgICAgICAgfSBlbHNlIGkuZXhwZWN0ZWRTdGF0dXMgPSAyMDA7XG4gICAgICAgICAgZS5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgICAgICAgdC5vbkVycm9yICYmIChlLm9uZXJyb3IgPSBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgdC5vbkVycm9yKGUuc3RhdHVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBlLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMsIG4pO1xuICAgICAgICAgIGUub25wcm9ncmVzcyA9IHRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMsIG4pO1xuICAgICAgICAgIGkub25IZWFkZXJzUmVjZWl2ZWQgPSB0Lm9uSGVhZGVyc1JlY2VpdmVkO1xuICAgICAgICAgIGkub25Eb25lID0gdC5vbkRvbmU7XG4gICAgICAgICAgaS5vbkVycm9yID0gdC5vbkVycm9yO1xuICAgICAgICAgIGkub25Qcm9ncmVzcyA9IHQub25Qcm9ncmVzcztcbiAgICAgICAgICBlLnNlbmQobnVsbCk7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgb25Qcm9ncmVzcyh0LCBlKSB7XG4gICAgICAgICAgdmFyIF9uJG9uUHJvZ3Jlc3M7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3RdO1xuICAgICAgICAgIG4gJiYgKChfbiRvblByb2dyZXNzID0gbi5vblByb2dyZXNzKSA9PT0gbnVsbCB8fCBfbiRvblByb2dyZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbiRvblByb2dyZXNzLmNhbGwobiwgZSkpO1xuICAgICAgICB9XG4gICAgICAgIG9uU3RhdGVDaGFuZ2UodCwgZSkge1xuICAgICAgICAgIHZhciBfbiRvbkVycm9yMztcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbdF07XG4gICAgICAgICAgaWYgKCFuKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgciA9IG4ueGhyO1xuICAgICAgICAgIGlmIChyLnJlYWR5U3RhdGUgPj0gMiAmJiBuLm9uSGVhZGVyc1JlY2VpdmVkKSB7XG4gICAgICAgICAgICBuLm9uSGVhZGVyc1JlY2VpdmVkKCk7XG4gICAgICAgICAgICBkZWxldGUgbi5vbkhlYWRlcnNSZWNlaXZlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKDQgIT09IHIucmVhZHlTdGF0ZSkgcmV0dXJuO1xuICAgICAgICAgIGlmICghKHQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKSByZXR1cm47XG4gICAgICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzW3RdO1xuICAgICAgICAgIGlmICgwID09PSByLnN0YXR1cyAmJiB0aGlzLmlzSHR0cCkge1xuICAgICAgICAgICAgdmFyIF9uJG9uRXJyb3I7XG4gICAgICAgICAgICAoX24kb25FcnJvciA9IG4ub25FcnJvcikgPT09IG51bGwgfHwgX24kb25FcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogX24kb25FcnJvci5jYWxsKG4sIHIuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcyA9IHIuc3RhdHVzIHx8IDIwMDtcbiAgICAgICAgICBpZiAoISgyMDAgPT09IHMgJiYgMjA2ID09PSBuLmV4cGVjdGVkU3RhdHVzKSAmJiBzICE9PSBuLmV4cGVjdGVkU3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgX24kb25FcnJvcjI7XG4gICAgICAgICAgICAoX24kb25FcnJvcjIgPSBuLm9uRXJyb3IpID09PSBudWxsIHx8IF9uJG9uRXJyb3IyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbiRvbkVycm9yMi5jYWxsKG4sIHIuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYSA9IGZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnJlc3BvbnNlO1xuICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgIT0gdHlwZW9mIGUgPyBlIDogKDAsIGkuc3RyaW5nVG9CeXRlcykoZSkuYnVmZmVyO1xuICAgICAgICAgIH0ocik7XG4gICAgICAgICAgaWYgKDIwNiA9PT0gcykge1xuICAgICAgICAgICAgY29uc3QgdCA9IHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVJhbmdlXCIpLFxuICAgICAgICAgICAgICBlID0gL2J5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKykvLmV4ZWModCk7XG4gICAgICAgICAgICBuLm9uRG9uZSh7XG4gICAgICAgICAgICAgIGJlZ2luOiBwYXJzZUludChlWzFdLCAxMCksXG4gICAgICAgICAgICAgIGNodW5rOiBhXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgYSA/IG4ub25Eb25lKHtcbiAgICAgICAgICAgIGJlZ2luOiAwLFxuICAgICAgICAgICAgY2h1bms6IGFcbiAgICAgICAgICB9KSA6IChfbiRvbkVycm9yMyA9IG4ub25FcnJvcikgPT09IG51bGwgfHwgX24kb25FcnJvcjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uJG9uRXJyb3IzLmNhbGwobiwgci5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIGdldFJlcXVlc3RYaHIodCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XS54aHI7XG4gICAgICAgIH1cbiAgICAgICAgaXNQZW5kaW5nUmVxdWVzdCh0KSB7XG4gICAgICAgICAgcmV0dXJuIHQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHM7XG4gICAgICAgIH1cbiAgICAgICAgYWJvcnRSZXF1ZXN0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbdF0ueGhyO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t0XTtcbiAgICAgICAgICBlLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuUERGTmV0d29ya1N0cmVhbSA9IGNsYXNzIFBERk5ldHdvcmtTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5fc291cmNlID0gdDtcbiAgICAgICAgICB0aGlzLl9tYW5hZ2VyID0gbmV3IE5ldHdvcmtNYW5hZ2VyKHQudXJsLCB7XG4gICAgICAgICAgICBodHRwSGVhZGVyczogdC5odHRwSGVhZGVycyxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdC53aXRoQ3JlZGVudGlhbHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHQucmFuZ2VDaHVua1NpemU7XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBfb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLmluZGV4T2YodCk7XG4gICAgICAgICAgZSA+PSAwICYmIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGUsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGdldEZ1bGxSZWFkZXIoKSB7XG4gICAgICAgICAgKDAsIGkuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGTmV0d29ya1N0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcbiAgICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgdGhpcy5fc291cmNlKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0UmFuZ2VSZWFkZXIodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUERGTmV0d29ya1N0cmVhbVJhbmdlUmVxdWVzdFJlYWRlcih0aGlzLl9tYW5hZ2VyLCB0LCBlKTtcbiAgICAgICAgICBuLm9uQ2xvc2VkID0gdGhpcy5fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQuYmluZCh0aGlzKTtcbiAgICAgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gobik7XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsQWxsUmVxdWVzdHModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRfZnVsbFJlcXVlc3RSZWExMDtcbiAgICAgICAgICAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTAgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTEwLmNhbmNlbCh0KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkgZS5jYW5jZWwodCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjbGFzcyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgdGhpcy5fbWFuYWdlciA9IHQ7XG4gICAgICAgICAgY29uc3QgbiA9IHtcbiAgICAgICAgICAgIG9uSGVhZGVyc1JlY2VpdmVkOiB0aGlzLl9vbkhlYWRlcnNSZWNlaXZlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IHRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fdXJsID0gZS51cmw7XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RJZCA9IHQucmVxdWVzdEZ1bGwobik7XG4gICAgICAgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eSA9IG5ldyBpLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gZS5kaXNhYmxlUmFuZ2UgfHwgITE7XG4gICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gZS5yYW5nZUNodW5rU2l6ZTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSB8fCB0aGlzLl9kaXNhYmxlUmFuZ2UgfHwgKHRoaXMuX2Rpc2FibGVSYW5nZSA9ICEwKTtcbiAgICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICExO1xuICAgICAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHZvaWQgMDtcbiAgICAgICAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBfb25IZWFkZXJzUmVjZWl2ZWQoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuX2Z1bGxSZXF1ZXN0SWQsXG4gICAgICAgICAgICBlID0gdGhpcy5fbWFuYWdlci5nZXRSZXF1ZXN0WGhyKHQpLFxuICAgICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIgPSB0ID0+IGUuZ2V0UmVzcG9uc2VIZWFkZXIodCksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0czogbixcbiAgICAgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiBpXG4gICAgICAgICAgICB9ID0gKDAsIHIudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHtcbiAgICAgICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGdldFJlc3BvbnNlSGVhZGVyLFxuICAgICAgICAgICAgICBpc0h0dHA6IHRoaXMuX21hbmFnZXIuaXNIdHRwLFxuICAgICAgICAgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG4gICAgICAgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBuICYmICh0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gITApO1xuICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBpIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgci5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG4gICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCAmJiB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0KTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBfb25Eb25lKHQpIHtcbiAgICAgICAgICBpZiAodCkgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHZhbHVlOiB0LmNodW5rLFxuICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuX2NhY2hlZENodW5rcy5wdXNoKHQuY2h1bmspO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICAgICAgICBpZiAoISh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9yZXF1ZXN0cykgdC5yZXNvbHZlKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX29uRXJyb3IodCkge1xuICAgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gKDAsIHIuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikodCwgdGhpcy5fdXJsKTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBfb25Qcm9ncmVzcyh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJG9uUHJvZ3Jlc3MzO1xuICAgICAgICAgIChfdGhpcyRvblByb2dyZXNzMyA9IHRoaXMub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkb25Qcm9ncmVzczMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3MzLmNhbGwodGhpcywge1xuICAgICAgICAgICAgbG9hZGVkOiB0LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiB0Lmxlbmd0aENvbXB1dGFibGUgPyB0LnRvdGFsIDogdGhpcy5fY29udGVudExlbmd0aFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWxlbmFtZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVhZCgpIHtcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgICAgICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2NhY2hlZENodW5rcy5zaGlmdCgpLFxuICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2RvbmUpIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnB1c2godCk7XG4gICAgICAgICAgcmV0dXJuIHQucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlamVjdCh0KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fcmVxdWVzdHMpIHQucmVzb2x2ZSh7XG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwLFxuICAgICAgICAgICAgZG9uZTogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuICAgICAgICAgIHRoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKSAmJiB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9mdWxsUmVxdWVzdElkKTtcbiAgICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgICAgdGhpcy5fbWFuYWdlciA9IHQ7XG4gICAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG4gICAgICAgICAgICBvbkVycm9yOiB0aGlzLl9vbkVycm9yLmJpbmQodGhpcyksXG4gICAgICAgICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcylcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX3VybCA9IHQudXJsO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RJZCA9IHQucmVxdWVzdFJhbmdlKGUsIG4sIGkpO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG4gICAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHZvaWQgMDtcbiAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25DbG9zZWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIF9jbG9zZSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkb25DbG9zZWQ7XG4gICAgICAgICAgKF90aGlzJG9uQ2xvc2VkID0gdGhpcy5vbkNsb3NlZCkgPT09IG51bGwgfHwgX3RoaXMkb25DbG9zZWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uQ2xvc2VkLmNhbGwodGhpcywgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX29uRG9uZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHQuY2h1bms7XG4gICAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCkucmVzb2x2ZSh7XG4gICAgICAgICAgICAgIHZhbHVlOiBlLFxuICAgICAgICAgICAgICBkb25lOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuX3F1ZXVlZENodW5rID0gZTtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkVycm9yKHQpIHtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9ICgwLCByLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHQsIHRoaXMuX3VybCk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgX29uUHJvZ3Jlc3ModCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzNDtcbiAgICAgICAgICB0aGlzLmlzU3RyZWFtaW5nU3VwcG9ydGVkIHx8ICgoX3RoaXMkb25Qcm9ncmVzczQgPSB0aGlzLm9uUHJvZ3Jlc3MpID09PSBudWxsIHx8IF90aGlzJG9uUHJvZ3Jlc3M0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRvblByb2dyZXNzNC5jYWxsKHRoaXMsIHtcbiAgICAgICAgICAgIGxvYWRlZDogdC5sb2FkZWRcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHRoaXMuX3F1ZXVlZENodW5rKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fcXVldWVkQ2h1bms7XG4gICAgICAgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2YWx1ZTogdCxcbiAgICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHQpO1xuICAgICAgICAgIHJldHVybiB0LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FuY2VsKHQpIHtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX3JlcXVlc3RzKSB0LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcbiAgICAgICAgICB0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fcmVxdWVzdElkKSAmJiB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpO1xuICAgICAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5QREZOb2RlU3RyZWFtID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICBuKDkzKTtcbiAgICAgIG4oMTAxKTtcbiAgICAgIG4oMTAyKTtcbiAgICAgIG4oMTA1KTtcbiAgICAgIG4oMTA3KTtcbiAgICAgIG4oMTA5KTtcbiAgICAgIG4oMTEzKTtcbiAgICAgIG4oMTE2KTtcbiAgICAgIG4oMTIzKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTgxKTtcbiAgICAgIGNvbnN0IHMgPSAvXmZpbGU6XFwvXFwvXFwvW2EtekEtWl06XFwvLztcbiAgICAgIGUuUERGTm9kZVN0cmVhbSA9IGNsYXNzIFBERk5vZGVTdHJlYW0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdGhpcy5zb3VyY2UgPSB0O1xuICAgICAgICAgIHRoaXMudXJsID0gZnVuY3Rpb24gcGFyc2VVcmwodCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAndXJsJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKSxcbiAgICAgICAgICAgICAgbiA9IGUucGFyc2UodCk7XG4gICAgICAgICAgICBpZiAoXCJmaWxlOlwiID09PSBuLnByb3RvY29sIHx8IG4uaG9zdCkgcmV0dXJuIG47XG4gICAgICAgICAgICBpZiAoL15bYS16XTpbL1xcXFxdL2kudGVzdCh0KSkgcmV0dXJuIGUucGFyc2UoXCJmaWxlOi8vL1wiLmNvbmNhdCh0KSk7XG4gICAgICAgICAgICBuLmhvc3QgfHwgKG4ucHJvdG9jb2wgPSBcImZpbGU6XCIpO1xuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgfSh0LnVybCk7XG4gICAgICAgICAgdGhpcy5pc0h0dHAgPSBcImh0dHA6XCIgPT09IHRoaXMudXJsLnByb3RvY29sIHx8IFwiaHR0cHM6XCIgPT09IHRoaXMudXJsLnByb3RvY29sO1xuICAgICAgICAgIHRoaXMuaXNGc1VybCA9IFwiZmlsZTpcIiA9PT0gdGhpcy51cmwucHJvdG9jb2w7XG4gICAgICAgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHQuaHR0cEhlYWRlcnMgfHwge307XG4gICAgICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTEsIF90aGlzJF9mdWxsUmVxdWVzdFJlYTEyO1xuICAgICAgICAgIHJldHVybiAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTEgPSAoX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTIgPSB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikgPT09IG51bGwgfHwgX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJF9mdWxsUmVxdWVzdFJlYTEyLl9sb2FkZWQpICE9PSBudWxsICYmIF90aGlzJF9mdWxsUmVxdWVzdFJlYTExICE9PSB2b2lkIDAgPyBfdGhpcyRfZnVsbFJlcXVlc3RSZWExMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RnVsbFJlYWRlcigpIHtcbiAgICAgICAgICAoMCwgaS5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZOb2RlU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuICAgICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIodGhpcykgOiBuZXcgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuICAgICAgICB9XG4gICAgICAgIGdldFJhbmdlUmVhZGVyKHQsIGUpIHtcbiAgICAgICAgICBpZiAoZSA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmlzRnNVcmwgPyBuZXcgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIodGhpcywgdCwgZSkgOiBuZXcgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIHQsIGUpO1xuICAgICAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChuKTtcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWxBbGxSZXF1ZXN0cyh0KSB7XG4gICAgICAgICAgdmFyIF90aGlzJF9mdWxsUmVxdWVzdFJlYTEzO1xuICAgICAgICAgIChfdGhpcyRfZnVsbFJlcXVlc3RSZWExMyA9IHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyKSA9PT0gbnVsbCB8fCBfdGhpcyRfZnVsbFJlcXVlc3RSZWExMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkX2Z1bGxSZXF1ZXN0UmVhMTMuY2FuY2VsKHQpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSBlLmNhbmNlbCh0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNsYXNzIEJhc2VGdWxsUmVhZGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHRoaXMuX3VybCA9IHQudXJsO1xuICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMTtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBlID0gdC5zb3VyY2U7XG4gICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IDA7XG4gICAgICAgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IGUuZGlzYWJsZVJhbmdlIHx8ICExO1xuICAgICAgICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gZS5yYW5nZUNodW5rU2l6ZTtcbiAgICAgICAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSB8fCB0aGlzLl9kaXNhYmxlUmFuZ2UgfHwgKHRoaXMuX2Rpc2FibGVSYW5nZSA9ICEwKTtcbiAgICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFlLmRpc2FibGVTdHJlYW07XG4gICAgICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFlLmRpc2FibGVSYW5nZTtcbiAgICAgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBmaWxlbmFtZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzNTtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHQubGVuZ3RoO1xuICAgICAgICAgIChfdGhpcyRvblByb2dyZXNzNSA9IHRoaXMub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkb25Qcm9ncmVzczUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3M1LmNhbGwodGhpcywge1xuICAgICAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogbmV3IFVpbnQ4QXJyYXkodCkuYnVmZmVyLFxuICAgICAgICAgICAgZG9uZTogITFcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbCh0KSB7XG4gICAgICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPyB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHQpIDogdGhpcy5fZXJyb3IodCk7XG4gICAgICAgIH1cbiAgICAgICAgX2Vycm9yKHQpIHtcbiAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHQ7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRSZWFkYWJsZVN0cmVhbSh0KSB7XG4gICAgICAgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSB0O1xuICAgICAgICAgIHQub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX2RvbmUgPSAhMDtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0Lm9uKFwiZXJyb3JcIiwgdCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcih0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAhdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCAmJiB0aGlzLl9lcnJvcihuZXcgaS5BYm9ydEV4Y2VwdGlvbihcInN0cmVhbWluZyBpcyBkaXNhYmxlZFwiKSk7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgJiYgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIEJhc2VSYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB0aGlzLl91cmwgPSB0LnVybDtcbiAgICAgICAgICB0aGlzLl9kb25lID0gITE7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBudWxsO1xuICAgICAgICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fbG9hZGVkID0gMDtcbiAgICAgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgaS5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuICAgICAgICAgIGNvbnN0IGUgPSB0LnNvdXJjZTtcbiAgICAgICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFlLmRpc2FibGVTdHJlYW07XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZWFkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRvblByb2dyZXNzNjtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICAgIGlmICh0aGlzLl9kb25lKSByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCxcbiAgICAgICAgICAgIGRvbmU6ICEwXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbG9hZGVkICs9IHQubGVuZ3RoO1xuICAgICAgICAgIChfdGhpcyRvblByb2dyZXNzNiA9IHRoaXMub25Qcm9ncmVzcykgPT09IG51bGwgfHwgX3RoaXMkb25Qcm9ncmVzczYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJG9uUHJvZ3Jlc3M2LmNhbGwodGhpcywge1xuICAgICAgICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IG5ldyBVaW50OEFycmF5KHQpLmJ1ZmZlcixcbiAgICAgICAgICAgIGRvbmU6ICExXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYW5jZWwodCkge1xuICAgICAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID8gdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0KSA6IHRoaXMuX2Vycm9yKHQpO1xuICAgICAgICB9XG4gICAgICAgIF9lcnJvcih0KSB7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB0O1xuICAgICAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0UmVhZGFibGVTdHJlYW0odCkge1xuICAgICAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gdDtcbiAgICAgICAgICB0Lm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHQub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9kb25lID0gITA7XG4gICAgICAgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5vbihcImVycm9yXCIsIHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IodCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgJiYgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveSh0aGlzLl9zdG9yZWRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RPcHRpb25zKHQsIGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm90b2NvbDogdC5wcm90b2NvbCxcbiAgICAgICAgICBhdXRoOiB0LmF1dGgsXG4gICAgICAgICAgaG9zdDogdC5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiB0LnBvcnQsXG4gICAgICAgICAgcGF0aDogdC5wYXRoLFxuICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICBoZWFkZXJzOiBlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjbGFzcyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlciBleHRlbmRzIEJhc2VGdWxsUmVhZGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQpO1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gZSA9PiB7XG4gICAgICAgICAgICBpZiAoNDA0ID09PSBlLnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oXCJNaXNzaW5nIFBERiBcXFwiXCIuY29uY2F0KHRoaXMuX3VybCwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdDtcbiAgICAgICAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHQpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShlKTtcbiAgICAgICAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gdCA9PiB0aGlzLl9yZWFkYWJsZVN0cmVhbS5oZWFkZXJzW3QudG9Mb3dlckNhc2UoKV0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IG4sXG4gICAgICAgICAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoOiBzXG4gICAgICAgICAgICAgIH0gPSAoMCwgci52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe1xuICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyOiBnZXRSZXNwb25zZUhlYWRlcixcbiAgICAgICAgICAgICAgICBpc0h0dHA6IHQuaXNIdHRwLFxuICAgICAgICAgICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBuO1xuICAgICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHMgfHwgdGhpcy5fY29udGVudExlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVuYW1lID0gKDAsIHIuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgaWYgKFwiaHR0cDpcIiA9PT0gdGhpcy5fdXJsLnByb3RvY29sKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdodHRwJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBlLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0Lmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdodHRwcydcIik7IGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgdGhyb3cgZTsgfSgpKSk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gZS5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdC5odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB0O1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQsIGUsIG4pIHtcbiAgICAgICAgICBzdXBlcih0KTtcbiAgICAgICAgICB0aGlzLl9odHRwSGVhZGVycyA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgZSBpbiB0Lmh0dHBIZWFkZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gdC5odHRwSGVhZGVyc1tlXTtcbiAgICAgICAgICAgIHZvaWQgMCAhPT0gbiAmJiAodGhpcy5faHR0cEhlYWRlcnNbZV0gPSBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5faHR0cEhlYWRlcnMuUmFuZ2UgPSBcImJ5dGVzPVwiLmNvbmNhdChlLCBcIi1cIikuY29uY2F0KG4gLSAxKTtcbiAgICAgICAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHQgPT4ge1xuICAgICAgICAgICAgaWYgKDQwNCAhPT0gdC5zdGF0dXNDb2RlKSB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbSh0KTtlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBpLk1pc3NpbmdQREZFeGNlcHRpb24oXCJNaXNzaW5nIFBERiBcXFwiXCIuY29uY2F0KHRoaXMuX3VybCwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgICAgICAgIGlmIChcImh0dHA6XCIgPT09IHRoaXMuX3VybC5wcm90b2NvbCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnaHR0cCdcIik7IGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgdGhyb3cgZTsgfSgpKSk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gdC5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdGhpcy5faHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKE9iamVjdChmdW5jdGlvbiB3ZWJwYWNrTWlzc2luZ01vZHVsZSgpIHsgdmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ2h0dHBzJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSB0LnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSB0O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0KTtcbiAgICAgICAgICBsZXQgZSA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLl91cmwucGF0aCk7XG4gICAgICAgICAgcy50ZXN0KHRoaXMuX3VybC5ocmVmKSAmJiAoZSA9IGUucmVwbGFjZSgvXlxcLy8sIFwiXCIpKTtcbiAgICAgICAgICBjb25zdCBuID0gX193ZWJwYWNrX3JlcXVpcmVfXyhPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdmcydcIik7IGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgdGhyb3cgZTsgfSgpKSk7XG4gICAgICAgICAgbi5sc3RhdChlLCAodCwgcikgPT4ge1xuICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgXCJFTk9FTlRcIiA9PT0gdC5jb2RlICYmICh0ID0gbmV3IGkuTWlzc2luZ1BERkV4Y2VwdGlvbihcIk1pc3NpbmcgUERGIFxcXCJcIi5jb25jYXQoZSwgXCJcXFwiLlwiKSkpO1xuICAgICAgICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHQ7XG4gICAgICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSByLnNpemU7XG4gICAgICAgICAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKG4uY3JlYXRlUmVhZFN0cmVhbShlKSk7XG4gICAgICAgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlLCBuKSB7XG4gICAgICAgICAgc3VwZXIodCk7XG4gICAgICAgICAgbGV0IGkgPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuICAgICAgICAgIHMudGVzdCh0aGlzLl91cmwuaHJlZikgJiYgKGkgPSBpLnJlcGxhY2UoL15cXC8vLCBcIlwiKSk7XG4gICAgICAgICAgY29uc3QgciA9IF9fd2VicGFja19yZXF1aXJlX18oT2JqZWN0KGZ1bmN0aW9uIHdlYnBhY2tNaXNzaW5nTW9kdWxlKCkgeyB2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnZnMnXCIpOyBlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7IHRocm93IGU7IH0oKSkpO1xuICAgICAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHIuY3JlYXRlUmVhZFN0cmVhbShpLCB7XG4gICAgICAgICAgICBzdGFydDogZSxcbiAgICAgICAgICAgIGVuZDogbiAtIDFcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5TVkdHcmFwaGljcyA9IHZvaWQgMDtcbiAgICAgIG4oODQpO1xuICAgICAgbig4Nik7XG4gICAgICBuKDg3KTtcbiAgICAgIG4oOTMpO1xuICAgICAgbigxMDEpO1xuICAgICAgbigxMDIpO1xuICAgICAgbigxMDUpO1xuICAgICAgbigxMDcpO1xuICAgICAgbigxMDkpO1xuICAgICAgbigxMTMpO1xuICAgICAgbigxMTYpO1xuICAgICAgbigxMjMpO1xuICAgICAgbigyKTtcbiAgICAgIG4oODkpO1xuICAgICAgbigxODYpO1xuICAgICAgdmFyIGkgPSBuKDE2NyksXG4gICAgICAgIHIgPSBuKDEpO1xuICAgICAgY29uc3QgcyA9IFwibm9ybWFsXCIsXG4gICAgICAgIGEgPSBcIm5vcm1hbFwiLFxuICAgICAgICBvID0gXCIjMDAwMDAwXCIsXG4gICAgICAgIGwgPSBbXCJidXR0XCIsIFwicm91bmRcIiwgXCJzcXVhcmVcIl0sXG4gICAgICAgIGMgPSBbXCJtaXRlclwiLCBcInJvdW5kXCIsIFwiYmV2ZWxcIl0sXG4gICAgICAgIGNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IFwiXCIsXG4gICAgICAgICAgICBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdO1xuICAgICAgICAgIGlmIChVUkwuY3JlYXRlT2JqZWN0VVJMICYmIFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIEJsb2IgJiYgIW4pIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0XSwge1xuICAgICAgICAgICAgdHlwZTogZVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjb25zdCBpID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuICAgICAgICAgIGxldCByID0gXCJkYXRhOlwiLmNvbmNhdChlLCBcIjtiYXNlNjQsXCIpO1xuICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDMpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSAyNTUgJiB0W2VdLFxuICAgICAgICAgICAgICBhID0gMjU1ICYgdFtlICsgMV0sXG4gICAgICAgICAgICAgIG8gPSAyNTUgJiB0W2UgKyAyXTtcbiAgICAgICAgICAgIHIgKz0gaVtzID4+IDJdICsgaVsoMyAmIHMpIDw8IDQgfCBhID4+IDRdICsgaVtlICsgMSA8IG4gPyAoMTUgJiBhKSA8PCAyIHwgbyA+PiA2IDogNjRdICsgaVtlICsgMiA8IG4gPyA2MyAmIG8gOiA2NF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9LFxuICAgICAgICBoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgVWludDhBcnJheShbMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMF0pLFxuICAgICAgICAgICAgZSA9IG5ldyBJbnQzMkFycmF5KDI1Nik7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCAyNTY7IHQrKykge1xuICAgICAgICAgICAgbGV0IG4gPSB0O1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCA4OyB0KyspIG4gPSAxICYgbiA/IDM5ODgyOTIzODQgXiBuID4+IDEgJiAyMTQ3NDgzNjQ3IDogbiA+PiAxICYgMjE0NzQ4MzY0NztcbiAgICAgICAgICAgIGVbdF0gPSBuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmdW5jdGlvbiB3cml0ZVBuZ0NodW5rKHQsIG4sIGksIHIpIHtcbiAgICAgICAgICAgIGxldCBzID0gcjtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBuLmxlbmd0aDtcbiAgICAgICAgICAgIGlbc10gPSBhID4+IDI0ICYgMjU1O1xuICAgICAgICAgICAgaVtzICsgMV0gPSBhID4+IDE2ICYgMjU1O1xuICAgICAgICAgICAgaVtzICsgMl0gPSBhID4+IDggJiAyNTU7XG4gICAgICAgICAgICBpW3MgKyAzXSA9IDI1NSAmIGE7XG4gICAgICAgICAgICBzICs9IDQ7XG4gICAgICAgICAgICBpW3NdID0gMjU1ICYgdC5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgaVtzICsgMV0gPSAyNTUgJiB0LmNoYXJDb2RlQXQoMSk7XG4gICAgICAgICAgICBpW3MgKyAyXSA9IDI1NSAmIHQuY2hhckNvZGVBdCgyKTtcbiAgICAgICAgICAgIGlbcyArIDNdID0gMjU1ICYgdC5jaGFyQ29kZUF0KDMpO1xuICAgICAgICAgICAgcyArPSA0O1xuICAgICAgICAgICAgaS5zZXQobiwgcyk7XG4gICAgICAgICAgICBzICs9IG4ubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbyA9IGZ1bmN0aW9uIGNyYzMyKHQsIG4sIGkpIHtcbiAgICAgICAgICAgICAgbGV0IHIgPSAtMTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcyA9IG47IHMgPCBpOyBzKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gMjU1ICYgKHIgXiB0W3NdKTtcbiAgICAgICAgICAgICAgICByID0gciA+Pj4gOCBeIGVbbl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIC0xIF4gcjtcbiAgICAgICAgICAgIH0oaSwgciArIDQsIHMpO1xuICAgICAgICAgICAgaVtzXSA9IG8gPj4gMjQgJiAyNTU7XG4gICAgICAgICAgICBpW3MgKyAxXSA9IG8gPj4gMTYgJiAyNTU7XG4gICAgICAgICAgICBpW3MgKyAyXSA9IG8gPj4gOCAmIDI1NTtcbiAgICAgICAgICAgIGlbcyArIDNdID0gMjU1ICYgbztcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVuY3Rpb24gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCkge1xuICAgICAgICAgICAgbGV0IGUgPSB0Lmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG4gPSA2NTUzNSxcbiAgICAgICAgICAgICAgaSA9IE1hdGguY2VpbChlIC8gbiksXG4gICAgICAgICAgICAgIHIgPSBuZXcgVWludDhBcnJheSgyICsgZSArIDUgKiBpICsgNCk7XG4gICAgICAgICAgICBsZXQgcyA9IDA7XG4gICAgICAgICAgICByW3MrK10gPSAxMjA7XG4gICAgICAgICAgICByW3MrK10gPSAxNTY7XG4gICAgICAgICAgICBsZXQgYSA9IDA7XG4gICAgICAgICAgICBmb3IgKDsgZSA+IG47KSB7XG4gICAgICAgICAgICAgIHJbcysrXSA9IDA7XG4gICAgICAgICAgICAgIHJbcysrXSA9IDI1NTtcbiAgICAgICAgICAgICAgcltzKytdID0gMjU1O1xuICAgICAgICAgICAgICByW3MrK10gPSAwO1xuICAgICAgICAgICAgICByW3MrK10gPSAwO1xuICAgICAgICAgICAgICByLnNldCh0LnN1YmFycmF5KGEsIGEgKyBuKSwgcyk7XG4gICAgICAgICAgICAgIHMgKz0gbjtcbiAgICAgICAgICAgICAgYSArPSBuO1xuICAgICAgICAgICAgICBlIC09IG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByW3MrK10gPSAxO1xuICAgICAgICAgICAgcltzKytdID0gMjU1ICYgZTtcbiAgICAgICAgICAgIHJbcysrXSA9IGUgPj4gOCAmIDI1NTtcbiAgICAgICAgICAgIHJbcysrXSA9IDI1NSAmIH5lO1xuICAgICAgICAgICAgcltzKytdID0gKDY1NTM1ICYgfmUpID4+IDggJiAyNTU7XG4gICAgICAgICAgICByLnNldCh0LnN1YmFycmF5KGEpLCBzKTtcbiAgICAgICAgICAgIHMgKz0gdC5sZW5ndGggLSBhO1xuICAgICAgICAgICAgY29uc3QgbyA9IGZ1bmN0aW9uIGFkbGVyMzIodCwgZSwgbikge1xuICAgICAgICAgICAgICBsZXQgaSA9IDEsXG4gICAgICAgICAgICAgICAgciA9IDA7XG4gICAgICAgICAgICAgIGZvciAobGV0IHMgPSBlOyBzIDwgbjsgKytzKSB7XG4gICAgICAgICAgICAgICAgaSA9IChpICsgKDI1NSAmIHRbc10pKSAlIDY1NTIxO1xuICAgICAgICAgICAgICAgIHIgPSAociArIGkpICUgNjU1MjE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHIgPDwgMTYgfCBpO1xuICAgICAgICAgICAgfSh0LCAwLCB0Lmxlbmd0aCk7XG4gICAgICAgICAgICByW3MrK10gPSBvID4+IDI0ICYgMjU1O1xuICAgICAgICAgICAgcltzKytdID0gbyA+PiAxNiAmIDI1NTtcbiAgICAgICAgICAgIHJbcysrXSA9IG8gPj4gOCAmIDI1NTtcbiAgICAgICAgICAgIHJbcysrXSA9IDI1NSAmIG87XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVuY3Rpb24gZW5jb2RlKGUsIG4sIGksIHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBlLndpZHRoLFxuICAgICAgICAgICAgICBvID0gZS5oZWlnaHQ7XG4gICAgICAgICAgICBsZXQgbCwgYywgaDtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBlLmRhdGE7XG4gICAgICAgICAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgICAgICAgY2FzZSByLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDpcbiAgICAgICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgICAgICBsID0gMTtcbiAgICAgICAgICAgICAgICBoID0gYSArIDcgPj4gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLkltYWdlS2luZC5SR0JfMjRCUFA6XG4gICAgICAgICAgICAgICAgYyA9IDI7XG4gICAgICAgICAgICAgICAgbCA9IDg7XG4gICAgICAgICAgICAgICAgaCA9IDMgKiBhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuSW1hZ2VLaW5kLlJHQkFfMzJCUFA6XG4gICAgICAgICAgICAgICAgYyA9IDY7XG4gICAgICAgICAgICAgICAgbCA9IDg7XG4gICAgICAgICAgICAgICAgaCA9IDQgKiBhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdSA9IG5ldyBVaW50OEFycmF5KCgxICsgaCkgKiBvKTtcbiAgICAgICAgICAgIGxldCBwID0gMCxcbiAgICAgICAgICAgICAgZiA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IG87ICsrdCkge1xuICAgICAgICAgICAgICB1W3ArK10gPSAwO1xuICAgICAgICAgICAgICB1LnNldChkLnN1YmFycmF5KGYsIGYgKyBoKSwgcCk7XG4gICAgICAgICAgICAgIGYgKz0gaDtcbiAgICAgICAgICAgICAgcCArPSBoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4gPT09IHIuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQICYmIHMpIHtcbiAgICAgICAgICAgICAgcCA9IDA7XG4gICAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgbzsgdCsrKSB7XG4gICAgICAgICAgICAgICAgcCsrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgaDsgdCsrKSB1W3ArK10gXj0gMjU1O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBnID0gbmV3IFVpbnQ4QXJyYXkoW2EgPj4gMjQgJiAyNTUsIGEgPj4gMTYgJiAyNTUsIGEgPj4gOCAmIDI1NSwgMjU1ICYgYSwgbyA+PiAyNCAmIDI1NSwgbyA+PiAxNiAmIDI1NSwgbyA+PiA4ICYgMjU1LCAyNTUgJiBvLCBsLCBjLCAwLCAwLCAwXSksXG4gICAgICAgICAgICAgIG0gPSBmdW5jdGlvbiBkZWZsYXRlU3luYyh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyLmlzTm9kZUpTKSByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBwYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUpID49IDggPyB0IDogQnVmZmVyLmZyb20odCksXG4gICAgICAgICAgICAgICAgICAgIG4gPSBPYmplY3QoZnVuY3Rpb24gd2VicGFja01pc3NpbmdNb2R1bGUoKSB7IHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICd6bGliJ1wiKTsgZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnOyB0aHJvdyBlOyB9KCkpKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogOVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuIGluc3RhbmNlb2YgVWludDhBcnJheSA/IG4gOiBuZXcgVWludDhBcnJheShuKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgICAgICAgICAgICAoMCwgci53YXJuKShcIk5vdCBjb21wcmVzc2luZyBQTkcgYmVjYXVzZSB6bGliLmRlZmxhdGVTeW5jIGlzIHVuYXZhaWxhYmxlOiBcIiArIHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQodCk7XG4gICAgICAgICAgICAgIH0odSksXG4gICAgICAgICAgICAgIGIgPSB0Lmxlbmd0aCArIDM2ICsgZy5sZW5ndGggKyBtLmxlbmd0aCxcbiAgICAgICAgICAgICAgdiA9IG5ldyBVaW50OEFycmF5KGIpO1xuICAgICAgICAgICAgbGV0IHkgPSAwO1xuICAgICAgICAgICAgdi5zZXQodCwgeSk7XG4gICAgICAgICAgICB5ICs9IHQubGVuZ3RoO1xuICAgICAgICAgICAgd3JpdGVQbmdDaHVuayhcIklIRFJcIiwgZywgdiwgeSk7XG4gICAgICAgICAgICB5ICs9IDEyICsgZy5sZW5ndGg7XG4gICAgICAgICAgICB3cml0ZVBuZ0NodW5rKFwiSURBVEFcIiwgbSwgdiwgeSk7XG4gICAgICAgICAgICB5ICs9IDEyICsgbS5sZW5ndGg7XG4gICAgICAgICAgICB3cml0ZVBuZ0NodW5rKFwiSUVORFwiLCBuZXcgVWludDhBcnJheSgwKSwgdiwgeSk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlT2JqZWN0VVJMKHYsIFwiaW1hZ2UvcG5nXCIsIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gY29udmVydEltZ0RhdGFUb1BuZyh0LCBlLCBuKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlKHQsIHZvaWQgMCA9PT0gdC5raW5kID8gci5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAgOiB0LmtpbmQsIGUsIG4pO1xuICAgICAgICAgIH07XG4gICAgICAgIH0oKTtcbiAgICAgIGNsYXNzIFNWR0V4dHJhU3RhdGUge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMuZm9udFdlaWdodCA9IGE7XG4gICAgICAgICAgdGhpcy5mb250U2l6ZSA9IDA7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4ID0gci5JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy5mb250TWF0cml4ID0gci5GT05UX0lERU5USVRZX01BVFJJWDtcbiAgICAgICAgICB0aGlzLmxlYWRpbmcgPSAwO1xuICAgICAgICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSByLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7XG4gICAgICAgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMueCA9IDA7XG4gICAgICAgICAgdGhpcy55ID0gMDtcbiAgICAgICAgICB0aGlzLmxpbmVYID0gMDtcbiAgICAgICAgICB0aGlzLmxpbmVZID0gMDtcbiAgICAgICAgICB0aGlzLmNoYXJTcGFjaW5nID0gMDtcbiAgICAgICAgICB0aGlzLndvcmRTcGFjaW5nID0gMDtcbiAgICAgICAgICB0aGlzLnRleHRIU2NhbGUgPSAxO1xuICAgICAgICAgIHRoaXMudGV4dFJpc2UgPSAwO1xuICAgICAgICAgIHRoaXMuZmlsbENvbG9yID0gbztcbiAgICAgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gXCIjMDAwMDAwXCI7XG4gICAgICAgICAgdGhpcy5maWxsQWxwaGEgPSAxO1xuICAgICAgICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxO1xuICAgICAgICAgIHRoaXMubGluZVdpZHRoID0gMTtcbiAgICAgICAgICB0aGlzLmxpbmVKb2luID0gXCJcIjtcbiAgICAgICAgICB0aGlzLmxpbmVDYXAgPSBcIlwiO1xuICAgICAgICAgIHRoaXMubWl0ZXJMaW1pdCA9IDA7XG4gICAgICAgICAgdGhpcy5kYXNoQXJyYXkgPSBbXTtcbiAgICAgICAgICB0aGlzLmRhc2hQaGFzZSA9IDA7XG4gICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBbXTtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNsaXBVcmwgPSBudWxsO1xuICAgICAgICAgIHRoaXMuY2xpcEdyb3VwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLm1hc2tJZCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgY2xvbmUoKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q3VycmVudFBvaW50KHQsIGUpIHtcbiAgICAgICAgICB0aGlzLnggPSB0O1xuICAgICAgICAgIHRoaXMueSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHBmKHQpIHtcbiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodCkpIHJldHVybiB0LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGUgPSB0LnRvRml4ZWQoMTApO1xuICAgICAgICBsZXQgbiA9IGUubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKFwiMFwiICE9PSBlW25dKSByZXR1cm4gZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG4tLTtcbiAgICAgICAgfSB3aGlsZSAoXCIwXCIgPT09IGVbbl0pO1xuICAgICAgICByZXR1cm4gZS5zdWJzdHJpbmcoMCwgXCIuXCIgPT09IGVbbl0gPyBuIDogbiArIDEpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcG0odCkge1xuICAgICAgICBpZiAoMCA9PT0gdFs0XSAmJiAwID09PSB0WzVdKSB7XG4gICAgICAgICAgaWYgKDAgPT09IHRbMV0gJiYgMCA9PT0gdFsyXSkgcmV0dXJuIDEgPT09IHRbMF0gJiYgMSA9PT0gdFszXSA/IFwiXCIgOiBcInNjYWxlKFwiLmNvbmNhdChwZih0WzBdKSwgXCIgXCIpLmNvbmNhdChwZih0WzNdKSwgXCIpXCIpO1xuICAgICAgICAgIGlmICh0WzBdID09PSB0WzNdICYmIHRbMV0gPT09IC10WzJdKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJyb3RhdGUoXCIuY29uY2F0KHBmKDE4MCAqIE1hdGguYWNvcyh0WzBdKSAvIE1hdGguUEkpLCBcIilcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKDEgPT09IHRbMF0gJiYgMCA9PT0gdFsxXSAmJiAwID09PSB0WzJdICYmIDEgPT09IHRbM10pIHJldHVybiBcInRyYW5zbGF0ZShcIi5jb25jYXQocGYodFs0XSksIFwiIFwiKS5jb25jYXQocGYodFs1XSksIFwiKVwiKTtcbiAgICAgICAgcmV0dXJuIFwibWF0cml4KFwiLmNvbmNhdChwZih0WzBdKSwgXCIgXCIpLmNvbmNhdChwZih0WzFdKSwgXCIgXCIpLmNvbmNhdChwZih0WzJdKSwgXCIgXCIpLmNvbmNhdChwZih0WzNdKSwgXCIgXCIpLmNvbmNhdChwZih0WzRdKSwgXCIgXCIpLmNvbmNhdChwZih0WzVdKSwgXCIpXCIpO1xuICAgICAgfVxuICAgICAgbGV0IGQgPSAwLFxuICAgICAgICB1ID0gMCxcbiAgICAgICAgcCA9IDA7XG4gICAgICBlLlNWR0dyYXBoaWNzID0gY2xhc3MgU1ZHR3JhcGhpY3Mge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0LCBlKSB7XG4gICAgICAgICAgbGV0IG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl07XG4gICAgICAgICAgKDAsIGkuZGVwcmVjYXRlZCkoXCJUaGUgU1ZHIGJhY2stZW5kIGlzIG5vIGxvbmdlciBtYWludGFpbmVkIGFuZCAqbWF5KiBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXCIpO1xuICAgICAgICAgIHRoaXMuc3ZnRmFjdG9yeSA9IG5ldyBpLkRPTVNWR0ZhY3RvcnkoKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBuZXcgU1ZHRXh0cmFTdGF0ZSgpO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gci5JREVOVElUWV9NQVRSSVg7XG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1TdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMuZXh0cmFTdGFjayA9IFtdO1xuICAgICAgICAgIHRoaXMuY29tbW9uT2JqcyA9IHQ7XG4gICAgICAgICAgdGhpcy5vYmpzID0gZTtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSAhMTtcbiAgICAgICAgICB0aGlzLmVtYmVkRm9udHMgPSAhMTtcbiAgICAgICAgICB0aGlzLmVtYmVkZGVkRm9udHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIHRoaXMuY3NzU3R5bGUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZm9yY2VEYXRhU2NoZW1hID0gISFuO1xuICAgICAgICAgIHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCB0IGluIHIuT1BTKSB0aGlzLl9vcGVyYXRvcklkTWFwcGluZ1tyLk9QU1t0XV0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIGdldE9iamVjdCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgPyB0LnN0YXJ0c1dpdGgoXCJnX1wiKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQodCkgOiB0aGlzLm9ianMuZ2V0KHQpIDogZTtcbiAgICAgICAgfVxuICAgICAgICBzYXZlKCkge1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLnRyYW5zZm9ybU1hdHJpeCk7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICB0aGlzLmV4dHJhU3RhY2sucHVzaCh0KTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0LmNsb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdG9yZSgpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHRoaXMudHJhbnNmb3JtU3RhY2sucG9wKCk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5leHRyYVN0YWNrLnBvcCgpO1xuICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuICAgICAgICAgIHRoaXMudGdycCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAodCkge1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0KTtcbiAgICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2FkRGVwZW5kZW5jaWVzKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdC5mbkFycmF5LFxuICAgICAgICAgICAgbiA9IHQuYXJnc0FycmF5O1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwLCBpID0gZS5sZW5ndGg7IHQgPCBpOyB0KyspIGlmIChlW3RdID09PSByLk9QUy5kZXBlbmRlbmN5KSBmb3IgKGNvbnN0IGUgb2Ygblt0XSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGUuc3RhcnRzV2l0aChcImdfXCIpID8gdGhpcy5jb21tb25PYmpzIDogdGhpcy5vYmpzLFxuICAgICAgICAgICAgICBuID0gbmV3IFByb21pc2UobiA9PiB7XG4gICAgICAgICAgICAgICAgdC5nZXQoZSwgbik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcy5wdXNoKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcyk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNmb3JtKHQsIGUsIG4sIGksIHMsIGEpIHtcbiAgICAgICAgICBjb25zdCBvID0gW3QsIGUsIG4sIGksIHMsIGFdO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gci5VdGlsLnRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybU1hdHJpeCwgbyk7XG4gICAgICAgICAgdGhpcy50Z3JwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBnZXRTVkcodCwgZSkge1xuICAgICAgICAgIHRoaXMudmlld3BvcnQgPSBlO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9pbml0aWFsaXplKGUpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmxvYWREZXBlbmRlbmNpZXModCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHIuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlT3BUcmVlKHRoaXMuY29udmVydE9wTGlzdCh0KSk7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb252ZXJ0T3BMaXN0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmcsXG4gICAgICAgICAgICBuID0gdC5hcmdzQXJyYXksXG4gICAgICAgICAgICBpID0gdC5mbkFycmF5LFxuICAgICAgICAgICAgciA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHQgPSAwLCBzID0gaS5sZW5ndGg7IHQgPCBzOyB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBpW3RdO1xuICAgICAgICAgICAgci5wdXNoKHtcbiAgICAgICAgICAgICAgZm5JZDogcyxcbiAgICAgICAgICAgICAgZm46IGVbc10sXG4gICAgICAgICAgICAgIGFyZ3M6IG5bdF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gb3BMaXN0VG9UcmVlKHQpIHtcbiAgICAgICAgICAgIGxldCBlID0gW107XG4gICAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdCkgaWYgKFwic2F2ZVwiICE9PSBpLmZuKSBcInJlc3RvcmVcIiA9PT0gaS5mbiA/IGUgPSBuLnBvcCgpIDogZS5wdXNoKGkpO2Vsc2Uge1xuICAgICAgICAgICAgICBlLnB1c2goe1xuICAgICAgICAgICAgICAgIGZuSWQ6IDkyLFxuICAgICAgICAgICAgICAgIGZuOiBcImdyb3VwXCIsXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuLnB1c2goZSk7XG4gICAgICAgICAgICAgIGUgPSBlLmF0KC0xKS5pdGVtcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH0ocik7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY3V0ZU9wVHJlZSh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmZuLFxuICAgICAgICAgICAgICBuID0gZS5mbklkLFxuICAgICAgICAgICAgICBpID0gZS5hcmdzO1xuICAgICAgICAgICAgc3dpdGNoICgwIHwgbikge1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmJlZ2luVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLmJlZ2luVGV4dCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmRlcGVuZGVuY3k6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0TGVhZGluZzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExlYWRpbmcoaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0TGVhZGluZ01vdmVUZXh0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGVhZGluZ01vdmVUZXh0KGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldEZvbnQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KGkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNob3dUZXh0OlxuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNob3dTcGFjZWRUZXh0OlxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1RleHQoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuZW5kVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFRleHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5tb3ZlVGV4dDpcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUZXh0KGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldENoYXJTcGFjaW5nOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hhclNwYWNpbmcoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0V29yZFNwYWNpbmc6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRXb3JkU3BhY2luZyhpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRIU2NhbGU6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIU2NhbGUoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0VGV4dE1hdHJpeDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHRNYXRyaXgoaVswXSwgaVsxXSwgaVsyXSwgaVszXSwgaVs0XSwgaVs1XSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuc2V0VGV4dFJpc2U6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0UmlzZShpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZTpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHRSZW5kZXJpbmdNb2RlKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldExpbmVXaWR0aDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aChpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRMaW5lSm9pbjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExpbmVKb2luKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldExpbmVDYXA6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lQ2FwKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldE1pdGVyTGltaXQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldEZpbGxSR0JDb2xvcjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZpbGxSR0JDb2xvcihpWzBdLCBpWzFdLCBpWzJdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRTdHJva2VSR0JDb2xvcjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0cm9rZVJHQkNvbG9yKGlbMF0sIGlbMV0sIGlbMl0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldFN0cm9rZUNvbG9yTjpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0cm9rZUNvbG9yTihpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRGaWxsQ29sb3JOOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RmlsbENvbG9yTihpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zaGFkaW5nRmlsbDpcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRpbmdGaWxsKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldERhc2g6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXNoKGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldFJlbmRlcmluZ0ludGVudDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudChpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5zZXRGbGF0bmVzczpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZsYXRuZXNzKGlbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnNldEdTdGF0ZTpcbiAgICAgICAgICAgICAgICB0aGlzLnNldEdTdGF0ZShpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5maWxsOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmVvRmlsbDpcbiAgICAgICAgICAgICAgICB0aGlzLmVvRmlsbCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnN0cm9rZTpcbiAgICAgICAgICAgICAgICB0aGlzLnN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmZpbGxTdHJva2U6XG4gICAgICAgICAgICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuZW9GaWxsU3Ryb2tlOlxuICAgICAgICAgICAgICAgIHRoaXMuZW9GaWxsU3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuY2xpcDpcbiAgICAgICAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmVvQ2xpcDpcbiAgICAgICAgICAgICAgICB0aGlzLmNsaXAoXCJldmVub2RkXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazpcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50U29saWRDb2xvckltYWdlTWFzaygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnBhaW50SW1hZ2VYT2JqZWN0OlxuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRJbWFnZVhPYmplY3QoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludEltYWdlTWFza1hPYmplY3QoaVswXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luOlxuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEJlZ2luKGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQ6XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludEZvcm1YT2JqZWN0RW5kKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuY2xvc2VQYXRoOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMuY2xvc2VTdHJva2U6XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmNsb3NlRmlsbFN0cm9rZTpcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRmlsbFN0cm9rZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmNsb3NlRU9GaWxsU3Ryb2tlOlxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VFT0ZpbGxTdHJva2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSByLk9QUy5uZXh0TGluZTpcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRMaW5lKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2Ugci5PUFMudHJhbnNmb3JtOlxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKGlbMF0sIGlbMV0sIGlbMl0sIGlbM10sIGlbNF0sIGlbNV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmNvbnN0cnVjdFBhdGg6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RQYXRoKGlbMF0sIGlbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIHIuT1BTLmVuZFBhdGg6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgOTI6XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cChlLml0ZW1zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAoMCwgci53YXJuKShcIlVuaW1wbGVtZW50ZWQgb3BlcmF0b3IgXCIuY29uY2F0KHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0V29yZFNwYWNpbmcodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC53b3JkU3BhY2luZyA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q2hhclNwYWNpbmcodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5jaGFyU3BhY2luZyA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dExpbmUoKSB7XG4gICAgICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGV4dE1hdHJpeCh0LCBlLCBuLCBpLCByLCBzKSB7XG4gICAgICAgICAgY29uc3QgYSA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICBhLnRleHRNYXRyaXggPSBhLmxpbmVNYXRyaXggPSBbdCwgZSwgbiwgaSwgciwgc107XG4gICAgICAgICAgYS50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLmh5cG90KHQsIGUpO1xuICAgICAgICAgIGEueCA9IGEubGluZVggPSAwO1xuICAgICAgICAgIGEueSA9IGEubGluZVkgPSAwO1xuICAgICAgICAgIGEueGNvb3JkcyA9IFtdO1xuICAgICAgICAgIGEueWNvb3JkcyA9IFtdO1xuICAgICAgICAgIGEudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcbiAgICAgICAgICBhLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1mYW1pbHlcIiwgYS5mb250RmFtaWx5KTtcbiAgICAgICAgICBhLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1zaXplXCIsIFwiXCIuY29uY2F0KHBmKGEuZm9udFNpemUpLCBcInB4XCIpKTtcbiAgICAgICAgICBhLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtYS55KSk7XG4gICAgICAgICAgYS50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dGV4dFwiKTtcbiAgICAgICAgICBhLnR4dEVsZW1lbnQuYXBwZW5kKGEudHNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIGJlZ2luVGV4dCgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIHQueCA9IHQubGluZVggPSAwO1xuICAgICAgICAgIHQueSA9IHQubGluZVkgPSAwO1xuICAgICAgICAgIHQudGV4dE1hdHJpeCA9IHIuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgIHQubGluZU1hdHJpeCA9IHIuSURFTlRJVFlfTUFUUklYO1xuICAgICAgICAgIHQudGV4dE1hdHJpeFNjYWxlID0gMTtcbiAgICAgICAgICB0LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICAgICAgdC50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dGV4dFwiKTtcbiAgICAgICAgICB0LnR4dGdycCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG4gICAgICAgICAgdC54Y29vcmRzID0gW107XG4gICAgICAgICAgdC55Y29vcmRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgbW92ZVRleHQodCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgbi54ID0gbi5saW5lWCArPSB0O1xuICAgICAgICAgIG4ueSA9IG4ubGluZVkgKz0gZTtcbiAgICAgICAgICBuLnhjb29yZHMgPSBbXTtcbiAgICAgICAgICBuLnljb29yZHMgPSBbXTtcbiAgICAgICAgICBuLnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG4gICAgICAgICAgbi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtZmFtaWx5XCIsIG4uZm9udEZhbWlseSk7XG4gICAgICAgICAgbi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc2l6ZVwiLCBcIlwiLmNvbmNhdChwZihuLmZvbnRTaXplKSwgXCJweFwiKSk7XG4gICAgICAgICAgbi50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgcGYoLW4ueSkpO1xuICAgICAgICB9XG4gICAgICAgIHNob3dUZXh0KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgbiA9IGUuZm9udCxcbiAgICAgICAgICAgIGkgPSBlLmZvbnRTaXplO1xuICAgICAgICAgIGlmICgwID09PSBpKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgbCA9IGUuZm9udFNpemVTY2FsZSxcbiAgICAgICAgICAgIGMgPSBlLmNoYXJTcGFjaW5nLFxuICAgICAgICAgICAgaCA9IGUud29yZFNwYWNpbmcsXG4gICAgICAgICAgICBkID0gZS5mb250RGlyZWN0aW9uLFxuICAgICAgICAgICAgdSA9IGUudGV4dEhTY2FsZSAqIGQsXG4gICAgICAgICAgICBwID0gbi52ZXJ0aWNhbCxcbiAgICAgICAgICAgIGYgPSBwID8gMSA6IC0xLFxuICAgICAgICAgICAgZyA9IG4uZGVmYXVsdFZNZXRyaWNzLFxuICAgICAgICAgICAgbSA9IGkgKiBlLmZvbnRNYXRyaXhbMF07XG4gICAgICAgICAgbGV0IGIgPSAwO1xuICAgICAgICAgIGZvciAoY29uc3QgciBvZiB0KSB7XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gcikge1xuICAgICAgICAgICAgICBiICs9IGQgKiBoO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcIm51bWJlclwiID09IHR5cGVvZiByKSB7XG4gICAgICAgICAgICAgIGIgKz0gZiAqIHIgKiBpIC8gMWUzO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHQgPSAoci5pc1NwYWNlID8gaCA6IDApICsgYyxcbiAgICAgICAgICAgICAgcyA9IHIuZm9udENoYXI7XG4gICAgICAgICAgICBsZXQgYSxcbiAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgdSA9IHIud2lkdGg7XG4gICAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IHIudm1ldHJpYyB8fCBnO1xuICAgICAgICAgICAgICB0ID0gci52bWV0cmljID8gZVsxXSA6IC41ICogdTtcbiAgICAgICAgICAgICAgdCA9IC10ICogbTtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IGVbMl0gKiBtO1xuICAgICAgICAgICAgICB1ID0gZSA/IC1lWzBdIDogdTtcbiAgICAgICAgICAgICAgYSA9IHQgLyBsO1xuICAgICAgICAgICAgICBvID0gKGIgKyBuKSAvIGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhID0gYiAvIGw7XG4gICAgICAgICAgICAgIG8gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHIuaXNJbkZvbnQgfHwgbi5taXNzaW5nRmlsZSkge1xuICAgICAgICAgICAgICBlLnhjb29yZHMucHVzaChlLnggKyBhKTtcbiAgICAgICAgICAgICAgcCAmJiBlLnljb29yZHMucHVzaCgtZS55ICsgbyk7XG4gICAgICAgICAgICAgIGUudHNwYW4udGV4dENvbnRlbnQgKz0gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIgKz0gcCA/IHUgKiBtIC0gdCAqIGQgOiB1ICogbSArIHQgKiBkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBlLnhjb29yZHMubWFwKHBmKS5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgcCA/IGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIGUueWNvb3Jkcy5tYXAocGYpLmpvaW4oXCIgXCIpKSA6IGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1lLnkpKTtcbiAgICAgICAgICBwID8gZS55IC09IGIgOiBlLnggKz0gYiAqIHU7XG4gICAgICAgICAgZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtZmFtaWx5XCIsIGUuZm9udEZhbWlseSk7XG4gICAgICAgICAgZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc2l6ZVwiLCBcIlwiLmNvbmNhdChwZihlLmZvbnRTaXplKSwgXCJweFwiKSk7XG4gICAgICAgICAgZS5mb250U3R5bGUgIT09IHMgJiYgZS50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc3R5bGVcIiwgZS5mb250U3R5bGUpO1xuICAgICAgICAgIGUuZm9udFdlaWdodCAhPT0gYSAmJiBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC13ZWlnaHRcIiwgZS5mb250V2VpZ2h0KTtcbiAgICAgICAgICBjb25zdCB2ID0gZS50ZXh0UmVuZGVyaW5nTW9kZSAmIHIuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcbiAgICAgICAgICBpZiAodiA9PT0gci5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IHYgPT09IHIuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgICAgIGUuZmlsbENvbG9yICE9PSBvICYmIGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIGUuZmlsbENvbG9yKTtcbiAgICAgICAgICAgIGUuZmlsbEFscGhhIDwgMSAmJiBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1vcGFjaXR5XCIsIGUuZmlsbEFscGhhKTtcbiAgICAgICAgICB9IGVsc2UgZS50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gci5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSCA/IGUudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIikgOiBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIik7XG4gICAgICAgICAgaWYgKHYgPT09IHIuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IHYgPT09IHIuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSAxIC8gKGUudGV4dE1hdHJpeFNjYWxlIHx8IDEpO1xuICAgICAgICAgICAgdGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhlLnRzcGFuLCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHkgPSBlLnRleHRNYXRyaXg7XG4gICAgICAgICAgaWYgKDAgIT09IGUudGV4dFJpc2UpIHtcbiAgICAgICAgICAgIHkgPSB5LnNsaWNlKCk7XG4gICAgICAgICAgICB5WzVdICs9IGUudGV4dFJpc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGUudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBcIlwiLmNvbmNhdChwbSh5KSwgXCIgc2NhbGUoXCIpLmNvbmNhdChwZih1KSwgXCIsIC0xKVwiKSk7XG4gICAgICAgICAgZS50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsIFwieG1sOnNwYWNlXCIsIFwicHJlc2VydmVcIik7XG4gICAgICAgICAgZS50eHRFbGVtZW50LmFwcGVuZChlLnRzcGFuKTtcbiAgICAgICAgICBlLnR4dGdycC5hcHBlbmQoZS50eHRFbGVtZW50KTtcbiAgICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChlLnR4dEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNldExlYWRpbmdNb3ZlVGV4dCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5zZXRMZWFkaW5nKC1lKTtcbiAgICAgICAgICB0aGlzLm1vdmVUZXh0KHQsIGUpO1xuICAgICAgICB9XG4gICAgICAgIGFkZEZvbnRTdHlsZSh0KSB7XG4gICAgICAgICAgaWYgKCF0LmRhdGEpIHRocm93IG5ldyBFcnJvcignYWRkRm9udFN0eWxlOiBObyBmb250IGRhdGEgYXZhaWxhYmxlLCBlbnN1cmUgdGhhdCB0aGUgXCJmb250RXh0cmFQcm9wZXJ0aWVzXCIgQVBJIHBhcmFtZXRlciBpcyBzZXQuJyk7XG4gICAgICAgICAgaWYgKCF0aGlzLmNzc1N0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLmNzc1N0eWxlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6c3R5bGVcIik7XG4gICAgICAgICAgICB0aGlzLmNzc1N0eWxlLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHlwZVwiLCBcInRleHQvY3NzXCIpO1xuICAgICAgICAgICAgdGhpcy5kZWZzLmFwcGVuZCh0aGlzLmNzc1N0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZSA9IGNyZWF0ZU9iamVjdFVSTCh0LmRhdGEsIHQubWltZXR5cGUsIHRoaXMuZm9yY2VEYXRhU2NoZW1hKTtcbiAgICAgICAgICB0aGlzLmNzc1N0eWxlLnRleHRDb250ZW50ICs9IFwiQGZvbnQtZmFjZSB7IGZvbnQtZmFtaWx5OiBcXFwiXCIuY29uY2F0KHQubG9hZGVkTmFtZSwgXCJcXFwiOyBzcmM6IHVybChcIikuY29uY2F0KGUsIFwiKTsgfVxcblwiKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGb250KHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgbiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQodFswXSk7XG4gICAgICAgICAgbGV0IGkgPSB0WzFdO1xuICAgICAgICAgIGUuZm9udCA9IG47XG4gICAgICAgICAgaWYgKHRoaXMuZW1iZWRGb250cyAmJiAhbi5taXNzaW5nRmlsZSAmJiAhdGhpcy5lbWJlZGRlZEZvbnRzW24ubG9hZGVkTmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRm9udFN0eWxlKG4pO1xuICAgICAgICAgICAgdGhpcy5lbWJlZGRlZEZvbnRzW24ubG9hZGVkTmFtZV0gPSBuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLmZvbnRNYXRyaXggPSBuLmZvbnRNYXRyaXggfHwgci5GT05UX0lERU5USVRZX01BVFJJWDtcbiAgICAgICAgICBsZXQgcyA9IFwibm9ybWFsXCI7XG4gICAgICAgICAgbi5ibGFjayA/IHMgPSBcIjkwMFwiIDogbi5ib2xkICYmIChzID0gXCJib2xkXCIpO1xuICAgICAgICAgIGNvbnN0IGEgPSBuLml0YWxpYyA/IFwiaXRhbGljXCIgOiBcIm5vcm1hbFwiO1xuICAgICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgaSA9IC1pO1xuICAgICAgICAgICAgZS5mb250RGlyZWN0aW9uID0gLTE7XG4gICAgICAgICAgfSBlbHNlIGUuZm9udERpcmVjdGlvbiA9IDE7XG4gICAgICAgICAgZS5mb250U2l6ZSA9IGk7XG4gICAgICAgICAgZS5mb250RmFtaWx5ID0gbi5sb2FkZWROYW1lO1xuICAgICAgICAgIGUuZm9udFdlaWdodCA9IHM7XG4gICAgICAgICAgZS5mb250U3R5bGUgPSBhO1xuICAgICAgICAgIGUudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcbiAgICAgICAgICBlLnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtZS55KSk7XG4gICAgICAgICAgZS54Y29vcmRzID0gW107XG4gICAgICAgICAgZS55Y29vcmRzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZW5kVGV4dCgpIHtcbiAgICAgICAgICB2YXIgX3QkdHh0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIGlmICh0LnRleHRSZW5kZXJpbmdNb2RlICYgci5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHICYmIChfdCR0eHRFbGVtZW50ID0gdC50eHRFbGVtZW50KSAhPT0gbnVsbCAmJiBfdCR0eHRFbGVtZW50ICE9PSB2b2lkIDAgJiYgX3QkdHh0RWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgIHQuZWxlbWVudCA9IHQudHh0RWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuY2xpcChcIm5vbnplcm9cIik7XG4gICAgICAgICAgICB0aGlzLmVuZFBhdGgoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0TGluZVdpZHRoKHQpIHtcbiAgICAgICAgICB0ID4gMCAmJiAodGhpcy5jdXJyZW50LmxpbmVXaWR0aCA9IHQpO1xuICAgICAgICB9XG4gICAgICAgIHNldExpbmVDYXAodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5saW5lQ2FwID0gbFt0XTtcbiAgICAgICAgfVxuICAgICAgICBzZXRMaW5lSm9pbih0KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmxpbmVKb2luID0gY1t0XTtcbiAgICAgICAgfVxuICAgICAgICBzZXRNaXRlckxpbWl0KHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQubWl0ZXJMaW1pdCA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlQWxwaGEodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VBbHBoYSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3Ryb2tlUkdCQ29sb3IodCwgZSwgbikge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHIuVXRpbC5tYWtlSGV4Q29sb3IodCwgZSwgbik7XG4gICAgICAgIH1cbiAgICAgICAgc2V0RmlsbEFscGhhKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gdDtcbiAgICAgICAgfVxuICAgICAgICBzZXRGaWxsUkdCQ29sb3IodCwgZSwgbikge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSByLlV0aWwubWFrZUhleENvbG9yKHQsIGUsIG4pO1xuICAgICAgICAgIHRoaXMuY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC54Y29vcmRzID0gW107XG4gICAgICAgICAgdGhpcy5jdXJyZW50Lnljb29yZHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBzZXRTdHJva2VDb2xvck4odCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuX21ha2VDb2xvck5fUGF0dGVybih0KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGaWxsQ29sb3JOKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKHQpO1xuICAgICAgICB9XG4gICAgICAgIHNoYWRpbmdGaWxsKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICBoZWlnaHQ6IG5cbiAgICAgICAgICAgIH0gPSB0aGlzLnZpZXdwb3J0LFxuICAgICAgICAgICAgaSA9IHIuVXRpbC5pbnZlcnNlVHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtTWF0cml4KSxcbiAgICAgICAgICAgIFtzLCBhLCBvLCBsXSA9IHIuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChbMCwgMCwgZSwgbl0sIGkpLFxuICAgICAgICAgICAgYyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgcyk7XG4gICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgYSk7XG4gICAgICAgICAgYy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIG8gLSBzKTtcbiAgICAgICAgICBjLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIGwgLSBhKTtcbiAgICAgICAgICBjLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4odCkpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5maWxsQWxwaGEgPCAxICYmIGMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLW9wYWNpdHlcIiwgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSk7XG4gICAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQoYyk7XG4gICAgICAgIH1cbiAgICAgICAgX21ha2VDb2xvck5fUGF0dGVybih0KSB7XG4gICAgICAgICAgcmV0dXJuIFwiVGlsaW5nUGF0dGVyblwiID09PSB0WzBdID8gdGhpcy5fbWFrZVRpbGluZ1BhdHRlcm4odCkgOiB0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4odCk7XG4gICAgICAgIH1cbiAgICAgICAgX21ha2VUaWxpbmdQYXR0ZXJuKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdFsxXSxcbiAgICAgICAgICAgIG4gPSB0WzJdLFxuICAgICAgICAgICAgaSA9IHRbM10gfHwgci5JREVOVElUWV9NQVRSSVgsXG4gICAgICAgICAgICBbcywgYSwgbywgbF0gPSB0WzRdLFxuICAgICAgICAgICAgYyA9IHRbNV0sXG4gICAgICAgICAgICBoID0gdFs2XSxcbiAgICAgICAgICAgIGQgPSB0WzddLFxuICAgICAgICAgICAgdSA9IFwic2hhZGluZ1wiICsgcCsrLFxuICAgICAgICAgICAgW2YsIGcsIG0sIGJdID0gci5VdGlsLm5vcm1hbGl6ZVJlY3QoWy4uLnIuVXRpbC5hcHBseVRyYW5zZm9ybShbcywgYV0sIGkpLCAuLi5yLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW28sIGxdLCBpKV0pLFxuICAgICAgICAgICAgW3YsIHldID0gci5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGkpLFxuICAgICAgICAgICAgQSA9IGMgKiB2LFxuICAgICAgICAgICAgXyA9IGggKiB5LFxuICAgICAgICAgICAgUyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnBhdHRlcm5cIik7XG4gICAgICAgICAgUy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIHUpO1xuICAgICAgICAgIFMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJwYXR0ZXJuVW5pdHNcIiwgXCJ1c2VyU3BhY2VPblVzZVwiKTtcbiAgICAgICAgICBTLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgQSk7XG4gICAgICAgICAgUy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBfKTtcbiAgICAgICAgICBTLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIlwiLmNvbmNhdChmKSk7XG4gICAgICAgICAgUy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCJcIi5jb25jYXQoZykpO1xuICAgICAgICAgIGNvbnN0IEUgPSB0aGlzLnN2ZyxcbiAgICAgICAgICAgIHggPSB0aGlzLnRyYW5zZm9ybU1hdHJpeCxcbiAgICAgICAgICAgIHcgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yLFxuICAgICAgICAgICAgQyA9IHRoaXMuY3VycmVudC5zdHJva2VDb2xvcixcbiAgICAgICAgICAgIFQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKG0gLSBmLCBiIC0gZyk7XG4gICAgICAgICAgdGhpcy5zdmcgPSBUO1xuICAgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gaTtcbiAgICAgICAgICBpZiAoMiA9PT0gZCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHIuVXRpbC5tYWtlSGV4Q29sb3IoLi4uZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3QobikpO1xuICAgICAgICAgIHRoaXMuc3ZnID0gRTtcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHg7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IHc7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gQztcbiAgICAgICAgICBTLmFwcGVuZChULmNoaWxkTm9kZXNbMF0pO1xuICAgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQoUyk7XG4gICAgICAgICAgcmV0dXJuIFwidXJsKCNcIi5jb25jYXQodSwgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9tYWtlU2hhZGluZ1BhdHRlcm4odCkge1xuICAgICAgICAgIFwic3RyaW5nXCIgPT0gdHlwZW9mIHQgJiYgKHQgPSB0aGlzLm9ianMuZ2V0KHQpKTtcbiAgICAgICAgICBzd2l0Y2ggKHRbMF0pIHtcbiAgICAgICAgICAgIGNhc2UgXCJSYWRpYWxBeGlhbFwiOlxuICAgICAgICAgICAgICBjb25zdCBlID0gXCJzaGFkaW5nXCIgKyBwKyssXG4gICAgICAgICAgICAgICAgbiA9IHRbM107XG4gICAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgICBzd2l0Y2ggKHRbMV0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYXhpYWxcIjpcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0WzRdLFxuICAgICAgICAgICAgICAgICAgICByID0gdFs1XTtcbiAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpsaW5lYXJHcmFkaWVudFwiKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBlKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJncmFkaWVudFVuaXRzXCIsIFwidXNlclNwYWNlT25Vc2VcIik7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieDFcIiwgblswXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieTFcIiwgblsxXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieDJcIiwgclswXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieTJcIiwgclsxXSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicmFkaWFsXCI6XG4gICAgICAgICAgICAgICAgICBjb25zdCBzID0gdFs0XSxcbiAgICAgICAgICAgICAgICAgICAgYSA9IHRbNV0sXG4gICAgICAgICAgICAgICAgICAgIG8gPSB0WzZdLFxuICAgICAgICAgICAgICAgICAgICBsID0gdFs3XTtcbiAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyYWRpYWxHcmFkaWVudFwiKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBlKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJncmFkaWVudFVuaXRzXCIsIFwidXNlclNwYWNlT25Vc2VcIik7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3hcIiwgYVswXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3lcIiwgYVsxXSk7XG4gICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiclwiLCBsKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmeFwiLCBzWzBdKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmeVwiLCBzWzFdKTtcbiAgICAgICAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmclwiLCBvKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIFJhZGlhbEF4aWFsIHR5cGU6IFwiLmNvbmNhdCh0WzFdKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIG4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6c3RvcFwiKTtcbiAgICAgICAgICAgICAgICBlLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwib2Zmc2V0XCIsIHRbMF0pO1xuICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdG9wLWNvbG9yXCIsIHRbMV0pO1xuICAgICAgICAgICAgICAgIGkuYXBwZW5kKGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQoaSk7XG4gICAgICAgICAgICAgIHJldHVybiBcInVybCgjXCIuY29uY2F0KGUsIFwiKVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJNZXNoXCI6XG4gICAgICAgICAgICAgICgwLCByLndhcm4pKFwiVW5pbXBsZW1lbnRlZCBwYXR0ZXJuIE1lc2hcIik7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FzZSBcIkR1bW15XCI6XG4gICAgICAgICAgICAgIHJldHVybiBcImhvdHBpbmtcIjtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gSVIgdHlwZTogXCIuY29uY2F0KHRbMF0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0RGFzaCh0LCBlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmRhc2hBcnJheSA9IHQ7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LmRhc2hQaGFzZSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0UGF0aCh0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICBsZXQgaSA9IG4ueCxcbiAgICAgICAgICAgIHMgPSBuLnksXG4gICAgICAgICAgICBhID0gW10sXG4gICAgICAgICAgICBvID0gMDtcbiAgICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkgc3dpdGNoICgwIHwgbikge1xuICAgICAgICAgICAgY2FzZSByLk9QUy5yZWN0YW5nbGU6XG4gICAgICAgICAgICAgIGkgPSBlW28rK107XG4gICAgICAgICAgICAgIHMgPSBlW28rK107XG4gICAgICAgICAgICAgIGNvbnN0IHQgPSBpICsgZVtvKytdLFxuICAgICAgICAgICAgICAgIG4gPSBzICsgZVtvKytdO1xuICAgICAgICAgICAgICBhLnB1c2goXCJNXCIsIHBmKGkpLCBwZihzKSwgXCJMXCIsIHBmKHQpLCBwZihzKSwgXCJMXCIsIHBmKHQpLCBwZihuKSwgXCJMXCIsIHBmKGkpLCBwZihuKSwgXCJaXCIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugci5PUFMubW92ZVRvOlxuICAgICAgICAgICAgICBpID0gZVtvKytdO1xuICAgICAgICAgICAgICBzID0gZVtvKytdO1xuICAgICAgICAgICAgICBhLnB1c2goXCJNXCIsIHBmKGkpLCBwZihzKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByLk9QUy5saW5lVG86XG4gICAgICAgICAgICAgIGkgPSBlW28rK107XG4gICAgICAgICAgICAgIHMgPSBlW28rK107XG4gICAgICAgICAgICAgIGEucHVzaChcIkxcIiwgcGYoaSksIHBmKHMpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHIuT1BTLmN1cnZlVG86XG4gICAgICAgICAgICAgIGkgPSBlW28gKyA0XTtcbiAgICAgICAgICAgICAgcyA9IGVbbyArIDVdO1xuICAgICAgICAgICAgICBhLnB1c2goXCJDXCIsIHBmKGVbb10pLCBwZihlW28gKyAxXSksIHBmKGVbbyArIDJdKSwgcGYoZVtvICsgM10pLCBwZihpKSwgcGYocykpO1xuICAgICAgICAgICAgICBvICs9IDY7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByLk9QUy5jdXJ2ZVRvMjpcbiAgICAgICAgICAgICAgYS5wdXNoKFwiQ1wiLCBwZihpKSwgcGYocyksIHBmKGVbb10pLCBwZihlW28gKyAxXSksIHBmKGVbbyArIDJdKSwgcGYoZVtvICsgM10pKTtcbiAgICAgICAgICAgICAgaSA9IGVbbyArIDJdO1xuICAgICAgICAgICAgICBzID0gZVtvICsgM107XG4gICAgICAgICAgICAgIG8gKz0gNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHIuT1BTLmN1cnZlVG8zOlxuICAgICAgICAgICAgICBpID0gZVtvICsgMl07XG4gICAgICAgICAgICAgIHMgPSBlW28gKyAzXTtcbiAgICAgICAgICAgICAgYS5wdXNoKFwiQ1wiLCBwZihlW29dKSwgcGYoZVtvICsgMV0pLCBwZihpKSwgcGYocyksIHBmKGkpLCBwZihzKSk7XG4gICAgICAgICAgICAgIG8gKz0gNDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHIuT1BTLmNsb3NlUGF0aDpcbiAgICAgICAgICAgICAgYS5wdXNoKFwiWlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYSA9IGEuam9pbihcIiBcIik7XG4gICAgICAgICAgaWYgKG4ucGF0aCAmJiB0Lmxlbmd0aCA+IDAgJiYgdFswXSAhPT0gci5PUFMucmVjdGFuZ2xlICYmIHRbMF0gIT09IHIuT1BTLm1vdmVUbykgYSA9IG4ucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIikgKyBhO2Vsc2Uge1xuICAgICAgICAgICAgbi5wYXRoID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cGF0aFwiKTtcbiAgICAgICAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKG4ucGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG4ucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgYSk7XG4gICAgICAgICAgbi5wYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIik7XG4gICAgICAgICAgbi5lbGVtZW50ID0gbi5wYXRoO1xuICAgICAgICAgIG4uc2V0Q3VycmVudFBvaW50KGksIHMpO1xuICAgICAgICB9XG4gICAgICAgIGVuZFBhdGgoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICB0LnBhdGggPSBudWxsO1xuICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2xpcCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghdC5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZSA9IFwiY2xpcHBhdGhcIiArIGQrKyxcbiAgICAgICAgICAgIG4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpjbGlwUGF0aFwiKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgZSk7XG4gICAgICAgICAgbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO1xuICAgICAgICAgIGNvbnN0IGkgPSB0LmVsZW1lbnQuY2xvbmVOb2RlKCEwKTtcbiAgICAgICAgICBcImV2ZW5vZGRcIiA9PT0gdGhpcy5wZW5kaW5nQ2xpcCA/IGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXJ1bGVcIiwgXCJldmVub2RkXCIpIDogaS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsaXAtcnVsZVwiLCBcIm5vbnplcm9cIik7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG4gICAgICAgICAgbi5hcHBlbmQoaSk7XG4gICAgICAgICAgdGhpcy5kZWZzLmFwcGVuZChuKTtcbiAgICAgICAgICBpZiAodC5hY3RpdmVDbGlwVXJsKSB7XG4gICAgICAgICAgICB0LmNsaXBHcm91cCA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5leHRyYVN0YWNrKSB0LmNsaXBHcm91cCA9IG51bGw7XG4gICAgICAgICAgICBuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY2xpcC1wYXRoXCIsIHQuYWN0aXZlQ2xpcFVybCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHQuYWN0aXZlQ2xpcFVybCA9IFwidXJsKCNcIi5jb25jYXQoZSwgXCIpXCIpO1xuICAgICAgICAgIHRoaXMudGdycCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY2xpcCh0KSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgY2xvc2VQYXRoKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgaWYgKHQucGF0aCkge1xuICAgICAgICAgICAgY29uc3QgZSA9IFwiXCIuY29uY2F0KHQucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiksIFwiWlwiKTtcbiAgICAgICAgICAgIHQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldExlYWRpbmcodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5sZWFkaW5nID0gLXQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGV4dFJpc2UodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0UmlzZSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGV4dFJlbmRlcmluZ01vZGUodCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9IHQ7XG4gICAgICAgIH1cbiAgICAgICAgc2V0SFNjYWxlKHQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHQgLyAxMDA7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVuZGVyaW5nSW50ZW50KHQpIHt9XG4gICAgICAgIHNldEZsYXRuZXNzKHQpIHt9XG4gICAgICAgIHNldEdTdGF0ZSh0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbZSwgbl0gb2YgdCkgc3dpdGNoIChlKSB7XG4gICAgICAgICAgICBjYXNlIFwiTFdcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lV2lkdGgobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkxDXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcChuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTEpcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiTUxcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJEXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RGFzaChuWzBdLCBuWzFdKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiUklcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZMXCI6XG4gICAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3Mobik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb250KG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJDQVwiOlxuICAgICAgICAgICAgICB0aGlzLnNldFN0cm9rZUFscGhhKG4pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjYVwiOlxuICAgICAgICAgICAgICB0aGlzLnNldEZpbGxBbHBoYShuKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAoMCwgci53YXJuKShcIlVuaW1wbGVtZW50ZWQgZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciBcIi5jb25jYXQoZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaWxsKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgICAgaWYgKHQuZWxlbWVudCkge1xuICAgICAgICAgICAgdC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0LmZpbGxDb2xvcik7XG4gICAgICAgICAgICB0LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLW9wYWNpdHlcIiwgdC5maWxsQWxwaGEpO1xuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0cm9rZSgpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIGlmICh0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFN0cm9rZUF0dHJpYnV0ZXModC5lbGVtZW50KTtcbiAgICAgICAgICAgIHQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCJub25lXCIpO1xuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9zZXRTdHJva2VBdHRyaWJ1dGVzKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdXJyZW50O1xuICAgICAgICAgIGxldCBpID0gbi5kYXNoQXJyYXk7XG4gICAgICAgICAgMSAhPT0gZSAmJiBpLmxlbmd0aCA+IDAgJiYgKGkgPSBpLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIGUgKiB0O1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlXCIsIG4uc3Ryb2tlQ29sb3IpO1xuICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2Utb3BhY2l0eVwiLCBuLnN0cm9rZUFscGhhKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLW1pdGVybGltaXRcIiwgcGYobi5taXRlckxpbWl0KSk7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1saW5lY2FwXCIsIG4ubGluZUNhcCk7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1saW5lam9pblwiLCBuLmxpbmVKb2luKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLXdpZHRoXCIsIHBmKGUgKiBuLmxpbmVXaWR0aCkgKyBcInB4XCIpO1xuICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2UtZGFzaGFycmF5XCIsIGkubWFwKHBmKS5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1kYXNob2Zmc2V0XCIsIHBmKGUgKiBuLmRhc2hQaGFzZSkgKyBcInB4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGVvRmlsbCgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkY3VycmVudCRlbGVtZW50O1xuICAgICAgICAgIChfdGhpcyRjdXJyZW50JGVsZW1lbnQgPSB0aGlzLmN1cnJlbnQuZWxlbWVudCkgPT09IG51bGwgfHwgX3RoaXMkY3VycmVudCRlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRjdXJyZW50JGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIGZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5zdHJva2UoKTtcbiAgICAgICAgICB0aGlzLmZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBlb0ZpbGxTdHJva2UoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGN1cnJlbnQkZWxlbWVudDI7XG4gICAgICAgICAgKF90aGlzJGN1cnJlbnQkZWxlbWVudDIgPSB0aGlzLmN1cnJlbnQuZWxlbWVudCkgPT09IG51bGwgfHwgX3RoaXMkY3VycmVudCRlbGVtZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkY3VycmVudCRlbGVtZW50Mi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtcnVsZVwiLCBcImV2ZW5vZGRcIik7XG4gICAgICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xvc2VTdHJva2UoKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcbiAgICAgICAgICB0aGlzLnN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsb3NlRmlsbFN0cm9rZSgpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNsb3NlRU9GaWxsU3Ryb2tlKCkge1xuICAgICAgICAgIHRoaXMuY2xvc2VQYXRoKCk7XG4gICAgICAgICAgdGhpcy5lb0ZpbGxTdHJva2UoKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMFwiKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgXCIxcHhcIik7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBcIjFweFwiKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCB0aGlzLmN1cnJlbnQuZmlsbENvbG9yKTtcbiAgICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZCh0KTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEltYWdlWE9iamVjdCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0T2JqZWN0KHQpO1xuICAgICAgICAgIGUgPyB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGUpIDogKDAsIHIud2FybikoXCJEZXBlbmRlbnQgaW1hZ2Ugd2l0aCBvYmplY3QgSUQgXCIuY29uY2F0KHQsIFwiIGlzIG5vdCByZWFkeSB5ZXRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdC53aWR0aCxcbiAgICAgICAgICAgIGkgPSB0LmhlaWdodCxcbiAgICAgICAgICAgIHIgPSBoKHQsIHRoaXMuZm9yY2VEYXRhU2NoZW1hLCAhIWUpLFxuICAgICAgICAgICAgcyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMFwiKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYobikpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaSkpO1xuICAgICAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50ID0gcztcbiAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzppbWFnZVwiKTtcbiAgICAgICAgICBhLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcInhsaW5rOmhyZWZcIiwgcik7XG4gICAgICAgICAgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuICAgICAgICAgIGEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1pKSk7XG4gICAgICAgICAgYS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKG4pICsgXCJweFwiKTtcbiAgICAgICAgICBhLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIHBmKGkpICsgXCJweFwiKTtcbiAgICAgICAgICBhLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIFwic2NhbGUoXCIuY29uY2F0KHBmKDEgLyBuKSwgXCIgXCIpLmNvbmNhdChwZigtMSAvIGkpLCBcIilcIikpO1xuICAgICAgICAgIGUgPyBlLmFwcGVuZChhKSA6IHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKGEpO1xuICAgICAgICB9XG4gICAgICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0T2JqZWN0KHQuZGF0YSwgdCk7XG4gICAgICAgICAgaWYgKGUuYml0bWFwKSB7XG4gICAgICAgICAgICAoMCwgci53YXJuKShcInBhaW50SW1hZ2VNYXNrWE9iamVjdDogSW1hZ2VCaXRtYXAgc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQsIGVuc3VyZSB0aGF0IHRoZSBgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWRgIEFQSSBwYXJhbWV0ZXIgaXMgZGlzYWJsZWQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5jdXJyZW50LFxuICAgICAgICAgICAgaSA9IGUud2lkdGgsXG4gICAgICAgICAgICBzID0gZS5oZWlnaHQsXG4gICAgICAgICAgICBhID0gbi5maWxsQ29sb3I7XG4gICAgICAgICAgbi5tYXNrSWQgPSBcIm1hc2tcIiArIHUrKztcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bWFza1wiKTtcbiAgICAgICAgICBvLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgbi5tYXNrSWQpO1xuICAgICAgICAgIGNvbnN0IGwgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuICAgICAgICAgIGwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjBcIik7XG4gICAgICAgICAgbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKGkpKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIHBmKHMpKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBhKTtcbiAgICAgICAgICBsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwibWFza1wiLCBcInVybCgjXCIuY29uY2F0KG4ubWFza0lkLCBcIilcIikpO1xuICAgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQobyk7XG4gICAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQobCk7XG4gICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChlLCBvKTtcbiAgICAgICAgfVxuICAgICAgICBwYWludEZvcm1YT2JqZWN0QmVnaW4odCwgZSkge1xuICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgJiYgNiA9PT0gdC5sZW5ndGggJiYgdGhpcy50cmFuc2Zvcm0odFswXSwgdFsxXSwgdFsyXSwgdFszXSwgdFs0XSwgdFs1XSk7XG4gICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlWzJdIC0gZVswXSxcbiAgICAgICAgICAgICAgbiA9IGVbM10gLSBlWzFdLFxuICAgICAgICAgICAgICBpID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcbiAgICAgICAgICAgIGkuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIGVbMF0pO1xuICAgICAgICAgICAgaS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgZVsxXSk7XG4gICAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYodCkpO1xuICAgICAgICAgICAgaS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihuKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudCA9IGk7XG4gICAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7fVxuICAgICAgICBfaW5pdGlhbGl6ZSh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodC53aWR0aCwgdC5oZWlnaHQpLFxuICAgICAgICAgICAgbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmRlZnNcIik7XG4gICAgICAgICAgZS5hcHBlbmQobik7XG4gICAgICAgICAgdGhpcy5kZWZzID0gbjtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgICAgICBpLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIHBtKHQudHJhbnNmb3JtKSk7XG4gICAgICAgICAgZS5hcHBlbmQoaSk7XG4gICAgICAgICAgdGhpcy5zdmcgPSBpO1xuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICB9XG4gICAgICAgIF9lbnN1cmVDbGlwR3JvdXAoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQuY2xpcEdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXBhdGhcIiwgdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpO1xuICAgICAgICAgICAgdGhpcy5zdmcuYXBwZW5kKHQpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmNsaXBHcm91cCA9IHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQuY2xpcEdyb3VwO1xuICAgICAgICB9XG4gICAgICAgIF9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpIHtcbiAgICAgICAgICBpZiAoIXRoaXMudGdycCkge1xuICAgICAgICAgICAgdGhpcy50Z3JwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcbiAgICAgICAgICAgIHRoaXMudGdycC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwgPyB0aGlzLl9lbnN1cmVDbGlwR3JvdXAoKS5hcHBlbmQodGhpcy50Z3JwKSA6IHRoaXMuc3ZnLmFwcGVuZCh0aGlzLnRncnApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy50Z3JwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIGkgPSBuKDMpLFxuICAgICAgICByID0gbigxODcpLFxuICAgICAgICBzID0gbigxOTIpO1xuICAgICAgaSh7XG4gICAgICAgIHRhcmdldDogXCJBcnJheVwiLFxuICAgICAgICBwcm90bzogITBcbiAgICAgIH0sIHtcbiAgICAgICAgZ3JvdXA6IGZ1bmN0aW9uIGdyb3VwKHQpIHtcbiAgICAgICAgICByZXR1cm4gcih0aGlzLCB0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcyhcImdyb3VwXCIpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oOTkpLFxuICAgICAgICByID0gbigxNCksXG4gICAgICAgIHMgPSBuKDEzKSxcbiAgICAgICAgYSA9IG4oNDApLFxuICAgICAgICBvID0gbigxOCksXG4gICAgICAgIGwgPSBuKDY0KSxcbiAgICAgICAgYyA9IG4oMTg4KSxcbiAgICAgICAgaCA9IG4oMTA4KSxcbiAgICAgICAgZCA9IEFycmF5LFxuICAgICAgICB1ID0gcihbXS5wdXNoKTtcbiAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuLCByKSB7XG4gICAgICAgIGZvciAodmFyIHAsIGYsIGcsIG0gPSBhKHQpLCBiID0gcyhtKSwgdiA9IGkoZSwgbiksIHkgPSBjKG51bGwpLCBBID0gbChiKSwgXyA9IDA7IEEgPiBfOyBfKyspIHtcbiAgICAgICAgICBnID0gYltfXTtcbiAgICAgICAgICAoZiA9IG8odihnLCBfLCBtKSkpIGluIHkgPyB1KHlbZl0sIGcpIDogeVtmXSA9IFtnXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAociAmJiAocCA9IHIobSkpICE9PSBkKSBmb3IgKGYgaW4geSkgeVtmXSA9IGgocCwgeVtmXSk7XG4gICAgICAgIHJldHVybiB5O1xuICAgICAgfTtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgdmFyIGksXG4gICAgICAgIHIgPSBuKDQ3KSxcbiAgICAgICAgcyA9IG4oMTg5KSxcbiAgICAgICAgYSA9IG4oNjYpLFxuICAgICAgICBvID0gbig1NSksXG4gICAgICAgIGwgPSBuKDE5MSksXG4gICAgICAgIGMgPSBuKDQzKSxcbiAgICAgICAgaCA9IG4oNTQpLFxuICAgICAgICBkID0gXCJwcm90b3R5cGVcIixcbiAgICAgICAgdSA9IFwic2NyaXB0XCIsXG4gICAgICAgIHAgPSBoKFwiSUVfUFJPVE9cIiksXG4gICAgICAgIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiBFbXB0eUNvbnN0cnVjdG9yKCkge30sXG4gICAgICAgIHNjcmlwdFRhZyA9IGZ1bmN0aW9uIHNjcmlwdFRhZyh0KSB7XG4gICAgICAgICAgcmV0dXJuIFwiPFwiICsgdSArIFwiPlwiICsgdCArIFwiPC9cIiArIHUgKyBcIj5cIjtcbiAgICAgICAgfSxcbiAgICAgICAgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgodCkge1xuICAgICAgICAgIHQud3JpdGUoc2NyaXB0VGFnKFwiXCIpKTtcbiAgICAgICAgICB0LmNsb3NlKCk7XG4gICAgICAgICAgdmFyIGUgPSB0LnBhcmVudFdpbmRvdy5PYmplY3Q7XG4gICAgICAgICAgdCA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH0sXG4gICAgICAgIF9OdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiBOdWxsUHJvdG9PYmplY3QoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGkgPSBuZXcgQWN0aXZlWE9iamVjdChcImh0bWxmaWxlXCIpO1xuICAgICAgICAgIH0gY2F0Y2ggKHQpIHt9XG4gICAgICAgICAgX051bGxQcm90b09iamVjdCA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIGRvY3VtZW50ID8gZG9jdW1lbnQuZG9tYWluICYmIGkgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGkpIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHQsXG4gICAgICAgICAgICAgIGUgPSBjKFwiaWZyYW1lXCIpLFxuICAgICAgICAgICAgICBuID0gXCJqYXZhXCIgKyB1ICsgXCI6XCI7XG4gICAgICAgICAgICBlLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIGwuYXBwZW5kQ2hpbGQoZSk7XG4gICAgICAgICAgICBlLnNyYyA9IFN0cmluZyhuKTtcbiAgICAgICAgICAgICh0ID0gZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCk7XG4gICAgICAgICAgICB0LndyaXRlKHNjcmlwdFRhZyhcImRvY3VtZW50LkY9T2JqZWN0XCIpKTtcbiAgICAgICAgICAgIHQuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0LkY7XG4gICAgICAgICAgfSgpIDogTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChpKTtcbiAgICAgICAgICBmb3IgKHZhciB0ID0gYS5sZW5ndGg7IHQtLTspIGRlbGV0ZSBfTnVsbFByb3RvT2JqZWN0W2RdW2FbdF1dO1xuICAgICAgICAgIHJldHVybiBfTnVsbFByb3RvT2JqZWN0KCk7XG4gICAgICAgIH07XG4gICAgICBvW3BdID0gITA7XG4gICAgICB0LmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZSh0LCBlKSB7XG4gICAgICAgIHZhciBuO1xuICAgICAgICBpZiAobnVsbCAhPT0gdCkge1xuICAgICAgICAgIEVtcHR5Q29uc3RydWN0b3JbZF0gPSByKHQpO1xuICAgICAgICAgIG4gPSBuZXcgRW1wdHlDb25zdHJ1Y3RvcigpO1xuICAgICAgICAgIEVtcHR5Q29uc3RydWN0b3JbZF0gPSBudWxsO1xuICAgICAgICAgIG5bcF0gPSB0O1xuICAgICAgICB9IGVsc2UgbiA9IF9OdWxsUHJvdG9PYmplY3QoKTtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZSA/IG4gOiBzLmYobiwgZSk7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICB2YXIgaSA9IG4oNiksXG4gICAgICAgIHIgPSBuKDQ2KSxcbiAgICAgICAgcyA9IG4oNDUpLFxuICAgICAgICBhID0gbig0NyksXG4gICAgICAgIG8gPSBuKDEyKSxcbiAgICAgICAgbCA9IG4oMTkwKTtcbiAgICAgIGUuZiA9IGkgJiYgIXIgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModCwgZSkge1xuICAgICAgICBhKHQpO1xuICAgICAgICBmb3IgKHZhciBuLCBpID0gbyhlKSwgciA9IGwoZSksIGMgPSByLmxlbmd0aCwgaCA9IDA7IGMgPiBoOykgcy5mKHQsIG4gPSByW2grK10sIGlbbl0pO1xuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbig1OSksXG4gICAgICAgIHIgPSBuKDY2KTtcbiAgICAgIHQuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXModCkge1xuICAgICAgICByZXR1cm4gaSh0LCByKTtcbiAgICAgIH07XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigyNCk7XG4gICAgICB0LmV4cG9ydHMgPSBpKFwiZG9jdW1lbnRcIiwgXCJkb2N1bWVudEVsZW1lbnRcIik7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIHZhciBpID0gbigzNCksXG4gICAgICAgIHIgPSBuKDE4OCksXG4gICAgICAgIHMgPSBuKDQ1KS5mLFxuICAgICAgICBhID0gaShcInVuc2NvcGFibGVzXCIpLFxuICAgICAgICBvID0gQXJyYXkucHJvdG90eXBlO1xuICAgICAgbnVsbCA9PSBvW2FdICYmIHMobywgYSwge1xuICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICB2YWx1ZTogcihudWxsKVxuICAgICAgfSk7XG4gICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkge1xuICAgICAgICBvW2FdW3RdID0gITA7XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLlhmYVRleHQgPSB2b2lkIDA7XG4gICAgICBuKDg5KTtcbiAgICAgIGNsYXNzIFhmYVRleHQge1xuICAgICAgICBzdGF0aWMgdGV4dENvbnRlbnQodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBbXSxcbiAgICAgICAgICAgIG4gPSB7XG4gICAgICAgICAgICAgIGl0ZW1zOiBlLFxuICAgICAgICAgICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgIWZ1bmN0aW9uIHdhbGsodCkge1xuICAgICAgICAgICAgaWYgKCF0KSByZXR1cm47XG4gICAgICAgICAgICBsZXQgbiA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBpID0gdC5uYW1lO1xuICAgICAgICAgICAgaWYgKFwiI3RleHRcIiA9PT0gaSkgbiA9IHQudmFsdWU7ZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBfdCRhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICBpZiAoIVhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KGkpKSByZXR1cm47XG4gICAgICAgICAgICAgIHQgIT09IG51bGwgJiYgdCAhPT0gdm9pZCAwICYmIChfdCRhdHRyaWJ1dGVzID0gdC5hdHRyaWJ1dGVzKSAhPT0gbnVsbCAmJiBfdCRhdHRyaWJ1dGVzICE9PSB2b2lkIDAgJiYgX3QkYXR0cmlidXRlcy50ZXh0Q29udGVudCA/IG4gPSB0LmF0dHJpYnV0ZXMudGV4dENvbnRlbnQgOiB0LnZhbHVlICYmIChuID0gdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudWxsICE9PSBuICYmIGUucHVzaCh7XG4gICAgICAgICAgICAgIHN0cjogblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodC5jaGlsZHJlbikgZm9yIChjb25zdCBlIG9mIHQuY2hpbGRyZW4pIHdhbGsoZSk7XG4gICAgICAgICAgfSh0KTtcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgc2hvdWxkQnVpbGRUZXh0KHQpIHtcbiAgICAgICAgICByZXR1cm4gIShcInRleHRhcmVhXCIgPT09IHQgfHwgXCJpbnB1dFwiID09PSB0IHx8IFwib3B0aW9uXCIgPT09IHQgfHwgXCJzZWxlY3RcIiA9PT0gdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGUuWGZhVGV4dCA9IFhmYVRleHQ7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuVGV4dExheWVyUmVuZGVyVGFzayA9IHZvaWQgMDtcbiAgICAgIGUucmVuZGVyVGV4dExheWVyID0gZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKHQpIHtcbiAgICAgICAgaWYgKCF0LnRleHRDb250ZW50U291cmNlICYmICh0LnRleHRDb250ZW50IHx8IHQudGV4dENvbnRlbnRTdHJlYW0pKSB7XG4gICAgICAgICAgKDAsIHIuZGVwcmVjYXRlZCkoXCJUaGUgVGV4dExheWVyUmVuZGVyIGB0ZXh0Q29udGVudGAvYHRleHRDb250ZW50U3RyZWFtYCBwYXJhbWV0ZXJzIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBwbGVhc2UgdXNlIGB0ZXh0Q29udGVudFNvdXJjZWAgaW5zdGVhZC5cIik7XG4gICAgICAgICAgdC50ZXh0Q29udGVudFNvdXJjZSA9IHQudGV4dENvbnRlbnQgfHwgdC50ZXh0Q29udGVudFN0cmVhbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250YWluZXI6IGUsXG4gICAgICAgICAgICB2aWV3cG9ydDogblxuICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgIGkgPSBnZXRDb21wdXRlZFN0eWxlKGUpLFxuICAgICAgICAgIHMgPSBpLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmlsaXR5XCIpLFxuICAgICAgICAgIGEgPSBwYXJzZUZsb2F0KGkuZ2V0UHJvcGVydHlWYWx1ZShcIi0tc2NhbGUtZmFjdG9yXCIpKTtcbiAgICAgICAgXCJ2aXNpYmxlXCIgPT09IHMgJiYgKCFhIHx8IE1hdGguYWJzKGEgLSBuLnNjYWxlKSA+IDFlLTUpICYmIGNvbnNvbGUuZXJyb3IoXCJUaGUgYC0tc2NhbGUtZmFjdG9yYCBDU1MtdmFyaWFibGUgbXVzdCBiZSBzZXQsIHRvIHRoZSBzYW1lIHZhbHVlIGFzIGB2aWV3cG9ydC5zY2FsZWAsIGVpdGhlciBvbiB0aGUgYGNvbnRhaW5lcmAtZWxlbWVudCBpdHNlbGYgb3IgaGlnaGVyIHVwIGluIHRoZSBET00uXCIpO1xuICAgICAgICBjb25zdCBvID0gbmV3IFRleHRMYXllclJlbmRlclRhc2sodCk7XG4gICAgICAgIG8uX3JlbmRlcigpO1xuICAgICAgICByZXR1cm4gbztcbiAgICAgIH07XG4gICAgICBlLnVwZGF0ZVRleHRMYXllciA9IGZ1bmN0aW9uIHVwZGF0ZVRleHRMYXllcih0KSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgY29udGFpbmVyOiBlLFxuICAgICAgICAgIHZpZXdwb3J0OiBuLFxuICAgICAgICAgIHRleHREaXZzOiBpLFxuICAgICAgICAgIHRleHREaXZQcm9wZXJ0aWVzOiBzLFxuICAgICAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiBhLFxuICAgICAgICAgIG11c3RSb3RhdGU6IG8gPSAhMCxcbiAgICAgICAgICBtdXN0UmVzY2FsZTogbCA9ICEwXG4gICAgICAgIH0gPSB0O1xuICAgICAgICBvICYmICgwLCByLnNldExheWVyRGltZW5zaW9ucykoZSwge1xuICAgICAgICAgIHJvdGF0aW9uOiBuLnJvdGF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobCkge1xuICAgICAgICAgIGNvbnN0IHQgPSBnZXRDdHgoMCwgYSksXG4gICAgICAgICAgICBlID0ge1xuICAgICAgICAgICAgICBwcmV2Rm9udFNpemU6IG51bGwsXG4gICAgICAgICAgICAgIHByZXZGb250RmFtaWx5OiBudWxsLFxuICAgICAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgICAgIHNjYWxlOiBuLnNjYWxlICogKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSxcbiAgICAgICAgICAgICAgcHJvcGVydGllczogbnVsbCxcbiAgICAgICAgICAgICAgY3R4OiB0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBpKSB7XG4gICAgICAgICAgICBlLnByb3BlcnRpZXMgPSBzLmdldCh0KTtcbiAgICAgICAgICAgIGUuZGl2ID0gdDtcbiAgICAgICAgICAgIGxheW91dChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBuKDg5KTtcbiAgICAgIG4oMik7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2Nyk7XG4gICAgICBjb25zdCBzID0gMzAsXG4gICAgICAgIGEgPSAuOCxcbiAgICAgICAgbyA9IG5ldyBNYXAoKTtcbiAgICAgIGZ1bmN0aW9uIGdldEN0eCh0LCBlKSB7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBpZiAoZSAmJiBpLkZlYXR1cmVUZXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSBuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh0LCB0KS5nZXRDb250ZXh0KFwiMmRcIiwge1xuICAgICAgICAgIGFscGhhOiAhMVxuICAgICAgICB9KTtlbHNlIHtcbiAgICAgICAgICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICAgICAgICBlLndpZHRoID0gZS5oZWlnaHQgPSB0O1xuICAgICAgICAgIG4gPSBlLmdldENvbnRleHQoXCIyZFwiLCB7XG4gICAgICAgICAgICBhbHBoYTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGFwcGVuZFRleHQodCwgZSwgbikge1xuICAgICAgICBjb25zdCByID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIiksXG4gICAgICAgICAgbCA9IHtcbiAgICAgICAgICAgIGFuZ2xlOiAwLFxuICAgICAgICAgICAgY2FudmFzV2lkdGg6IDAsXG4gICAgICAgICAgICBoYXNUZXh0OiBcIlwiICE9PSBlLnN0cixcbiAgICAgICAgICAgIGhhc0VPTDogZS5oYXNFT0wsXG4gICAgICAgICAgICBmb250U2l6ZTogMFxuICAgICAgICAgIH07XG4gICAgICAgIHQuX3RleHREaXZzLnB1c2gocik7XG4gICAgICAgIGNvbnN0IGMgPSBpLlV0aWwudHJhbnNmb3JtKHQuX3RyYW5zZm9ybSwgZS50cmFuc2Zvcm0pO1xuICAgICAgICBsZXQgaCA9IE1hdGguYXRhbjIoY1sxXSwgY1swXSk7XG4gICAgICAgIGNvbnN0IGQgPSBuW2UuZm9udE5hbWVdO1xuICAgICAgICBkLnZlcnRpY2FsICYmIChoICs9IE1hdGguUEkgLyAyKTtcbiAgICAgICAgY29uc3QgdSA9IE1hdGguaHlwb3QoY1syXSwgY1szXSksXG4gICAgICAgICAgcCA9IHUgKiBmdW5jdGlvbiBnZXRBc2NlbnQodCwgZSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IG8uZ2V0KHQpO1xuICAgICAgICAgICAgaWYgKG4pIHJldHVybiBuO1xuICAgICAgICAgICAgY29uc3QgaSA9IGdldEN0eChzLCBlKTtcbiAgICAgICAgICAgIGkuZm9udCA9IFwiXCIuY29uY2F0KHMsIFwicHggXCIpLmNvbmNhdCh0KTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBpLm1lYXN1cmVUZXh0KFwiXCIpO1xuICAgICAgICAgICAgbGV0IGwgPSByLmZvbnRCb3VuZGluZ0JveEFzY2VudCxcbiAgICAgICAgICAgICAgYyA9IE1hdGguYWJzKHIuZm9udEJvdW5kaW5nQm94RGVzY2VudCk7XG4gICAgICAgICAgICBpZiAobCkge1xuICAgICAgICAgICAgICBjb25zdCBlID0gbCAvIChsICsgYyk7XG4gICAgICAgICAgICAgIG8uc2V0KHQsIGUpO1xuICAgICAgICAgICAgICBpLmNhbnZhcy53aWR0aCA9IGkuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaS5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG4gICAgICAgICAgICBpLmNsZWFyUmVjdCgwLCAwLCBzLCBzKTtcbiAgICAgICAgICAgIGkuc3Ryb2tlVGV4dChcImdcIiwgMCwgMCk7XG4gICAgICAgICAgICBsZXQgaCA9IGkuZ2V0SW1hZ2VEYXRhKDAsIDAsIHMsIHMpLmRhdGE7XG4gICAgICAgICAgICBjID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSBoLmxlbmd0aCAtIDEgLSAzOyB0ID49IDA7IHQgLT0gNCkgaWYgKGhbdF0gPiAwKSB7XG4gICAgICAgICAgICAgIGMgPSBNYXRoLmNlaWwodCAvIDQgLyBzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpLmNsZWFyUmVjdCgwLCAwLCBzLCBzKTtcbiAgICAgICAgICAgIGkuc3Ryb2tlVGV4dChcIkFcIiwgMCwgcyk7XG4gICAgICAgICAgICBoID0gaS5nZXRJbWFnZURhdGEoMCwgMCwgcywgcykuZGF0YTtcbiAgICAgICAgICAgIGwgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDAsIGUgPSBoLmxlbmd0aDsgdCA8IGU7IHQgKz0gNCkgaWYgKGhbdF0gPiAwKSB7XG4gICAgICAgICAgICAgIGwgPSBzIC0gTWF0aC5mbG9vcih0IC8gNCAvIHMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkuY2FudmFzLndpZHRoID0gaS5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBsIC8gKGwgKyBjKTtcbiAgICAgICAgICAgICAgby5zZXQodCwgZSk7XG4gICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgby5zZXQodCwgYSk7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgICB9KGQuZm9udEZhbWlseSwgdC5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpO1xuICAgICAgICBsZXQgZiwgZztcbiAgICAgICAgaWYgKDAgPT09IGgpIHtcbiAgICAgICAgICBmID0gY1s0XTtcbiAgICAgICAgICBnID0gY1s1XSAtIHA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZiA9IGNbNF0gKyBwICogTWF0aC5zaW4oaCk7XG4gICAgICAgICAgZyA9IGNbNV0gLSBwICogTWF0aC5jb3MoaCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbSA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpKlwiLFxuICAgICAgICAgIGIgPSByLnN0eWxlO1xuICAgICAgICBpZiAodC5fY29udGFpbmVyID09PSB0Ll9yb290Q29udGFpbmVyKSB7XG4gICAgICAgICAgYi5sZWZ0ID0gXCJcIi5jb25jYXQoKDEwMCAqIGYgLyB0Ll9wYWdlV2lkdGgpLnRvRml4ZWQoMiksIFwiJVwiKTtcbiAgICAgICAgICBiLnRvcCA9IFwiXCIuY29uY2F0KCgxMDAgKiBnIC8gdC5fcGFnZUhlaWdodCkudG9GaXhlZCgyKSwgXCIlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGIubGVmdCA9IFwiXCIuY29uY2F0KG0pLmNvbmNhdChmLnRvRml4ZWQoMiksIFwicHgpXCIpO1xuICAgICAgICAgIGIudG9wID0gXCJcIi5jb25jYXQobSkuY29uY2F0KGcudG9GaXhlZCgyKSwgXCJweClcIik7XG4gICAgICAgIH1cbiAgICAgICAgYi5mb250U2l6ZSA9IFwiXCIuY29uY2F0KG0pLmNvbmNhdCh1LnRvRml4ZWQoMiksIFwicHgpXCIpO1xuICAgICAgICBiLmZvbnRGYW1pbHkgPSBkLmZvbnRGYW1pbHk7XG4gICAgICAgIGwuZm9udFNpemUgPSB1O1xuICAgICAgICByLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJwcmVzZW50YXRpb25cIik7XG4gICAgICAgIHIudGV4dENvbnRlbnQgPSBlLnN0cjtcbiAgICAgICAgci5kaXIgPSBlLmRpcjtcbiAgICAgICAgdC5fZm9udEluc3BlY3RvckVuYWJsZWQgJiYgKHIuZGF0YXNldC5mb250TmFtZSA9IGUuZm9udE5hbWUpO1xuICAgICAgICAwICE9PSBoICYmIChsLmFuZ2xlID0gaCAqICgxODAgLyBNYXRoLlBJKSk7XG4gICAgICAgIGxldCB2ID0gITE7XG4gICAgICAgIGlmIChlLnN0ci5sZW5ndGggPiAxKSB2ID0gITA7ZWxzZSBpZiAoXCIgXCIgIT09IGUuc3RyICYmIGUudHJhbnNmb3JtWzBdICE9PSBlLnRyYW5zZm9ybVszXSkge1xuICAgICAgICAgIGNvbnN0IHQgPSBNYXRoLmFicyhlLnRyYW5zZm9ybVswXSksXG4gICAgICAgICAgICBuID0gTWF0aC5hYnMoZS50cmFuc2Zvcm1bM10pO1xuICAgICAgICAgIHQgIT09IG4gJiYgTWF0aC5tYXgodCwgbikgLyBNYXRoLm1pbih0LCBuKSA+IDEuNSAmJiAodiA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICB2ICYmIChsLmNhbnZhc1dpZHRoID0gZC52ZXJ0aWNhbCA/IGUuaGVpZ2h0IDogZS53aWR0aCk7XG4gICAgICAgIHQuX3RleHREaXZQcm9wZXJ0aWVzLnNldChyLCBsKTtcbiAgICAgICAgdC5faXNSZWFkYWJsZVN0cmVhbSAmJiB0Ll9sYXlvdXRUZXh0KHIpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbGF5b3V0KHQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZGl2OiBlLFxuICAgICAgICAgICAgc2NhbGU6IG4sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBpLFxuICAgICAgICAgICAgY3R4OiByLFxuICAgICAgICAgICAgcHJldkZvbnRTaXplOiBzLFxuICAgICAgICAgICAgcHJldkZvbnRGYW1pbHk6IGFcbiAgICAgICAgICB9ID0gdCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHlsZTogb1xuICAgICAgICAgIH0gPSBlO1xuICAgICAgICBsZXQgbCA9IFwiXCI7XG4gICAgICAgIGlmICgwICE9PSBpLmNhbnZhc1dpZHRoICYmIGkuaGFzVGV4dCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgZm9udEZhbWlseTogY1xuICAgICAgICAgICAgfSA9IG8sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNhbnZhc1dpZHRoOiBoLFxuICAgICAgICAgICAgICBmb250U2l6ZTogZFxuICAgICAgICAgICAgfSA9IGk7XG4gICAgICAgICAgaWYgKHMgIT09IGQgfHwgYSAhPT0gYykge1xuICAgICAgICAgICAgci5mb250ID0gXCJcIi5jb25jYXQoZCAqIG4sIFwicHggXCIpLmNvbmNhdChjKTtcbiAgICAgICAgICAgIHQucHJldkZvbnRTaXplID0gZDtcbiAgICAgICAgICAgIHQucHJldkZvbnRGYW1pbHkgPSBjO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB3aWR0aDogdVxuICAgICAgICAgIH0gPSByLm1lYXN1cmVUZXh0KGUudGV4dENvbnRlbnQpO1xuICAgICAgICAgIHUgPiAwICYmIChsID0gXCJzY2FsZVgoXCIuY29uY2F0KGggKiBuIC8gdSwgXCIpXCIpKTtcbiAgICAgICAgfVxuICAgICAgICAwICE9PSBpLmFuZ2xlICYmIChsID0gXCJyb3RhdGUoXCIuY29uY2F0KGkuYW5nbGUsIFwiZGVnKSBcIikuY29uY2F0KGwpKTtcbiAgICAgICAgbC5sZW5ndGggPiAwICYmIChvLnRyYW5zZm9ybSA9IGwpO1xuICAgICAgfVxuICAgICAgY2xhc3MgVGV4dExheWVyUmVuZGVyVGFzayB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX2dsb2JhbFRoaXMkRm9udEluc3BlMjtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdGV4dENvbnRlbnRTb3VyY2U6IGUsXG4gICAgICAgICAgICBjb250YWluZXI6IG4sXG4gICAgICAgICAgICB2aWV3cG9ydDogcyxcbiAgICAgICAgICAgIHRleHREaXZzOiBhLFxuICAgICAgICAgICAgdGV4dERpdlByb3BlcnRpZXM6IG8sXG4gICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyOiBsLFxuICAgICAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IGNcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICB0aGlzLl90ZXh0Q29udGVudFNvdXJjZSA9IGU7XG4gICAgICAgICAgdGhpcy5faXNSZWFkYWJsZVN0cmVhbSA9IGUgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9yb290Q29udGFpbmVyID0gbjtcbiAgICAgICAgICB0aGlzLl90ZXh0RGl2cyA9IGEgfHwgW107XG4gICAgICAgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ciA9IGwgfHwgW107XG4gICAgICAgICAgdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBjO1xuICAgICAgICAgIHRoaXMuX2ZvbnRJbnNwZWN0b3JFbmFibGVkID0gISEoKF9nbG9iYWxUaGlzJEZvbnRJbnNwZTIgPSBnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3IpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJEZvbnRJbnNwZTIgIT09IHZvaWQgMCAmJiBfZ2xvYmFsVGhpcyRGb250SW5zcGUyLmVuYWJsZWQpO1xuICAgICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMgPSBvIHx8IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgdGhpcy5fY2FuY2VsZWQgPSAhMTtcbiAgICAgICAgICB0aGlzLl9jYXBhYmlsaXR5ID0gbmV3IGkuUHJvbWlzZUNhcGFiaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zID0ge1xuICAgICAgICAgICAgcHJldkZvbnRTaXplOiBudWxsLFxuICAgICAgICAgICAgcHJldkZvbnRGYW1pbHk6IG51bGwsXG4gICAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgICBzY2FsZTogcy5zY2FsZSAqIChnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW8gfHwgMSksXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuICAgICAgICAgICAgY3R4OiBnZXRDdHgoMCwgYylcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aDogaCxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IGQsXG4gICAgICAgICAgICBwYWdlWDogdSxcbiAgICAgICAgICAgIHBhZ2VZOiBwXG4gICAgICAgICAgfSA9IHMucmF3RGltcztcbiAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSBbMSwgMCwgMCwgLTEsIC11LCBwICsgZF07XG4gICAgICAgICAgdGhpcy5fcGFnZVdpZHRoID0gaDtcbiAgICAgICAgICB0aGlzLl9wYWdlSGVpZ2h0ID0gZDtcbiAgICAgICAgICAoMCwgci5zZXRMYXllckRpbWVuc2lvbnMpKG4sIHMpO1xuICAgICAgICAgIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xheW91dFRleHRQYXJhbXMgPSBudWxsO1xuICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvbWlzZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgICB0aGlzLl9jYW5jZWxlZCA9ICEwO1xuICAgICAgICAgIGlmICh0aGlzLl9yZWFkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwobmV3IGkuQWJvcnRFeGNlcHRpb24oXCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuXCIpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9jYXBhYmlsaXR5LnJlamVjdChuZXcgaS5BYm9ydEV4Y2VwdGlvbihcIlRleHRMYXllciB0YXNrIGNhbmNlbGxlZC5cIikpO1xuICAgICAgICB9XG4gICAgICAgIF9wcm9jZXNzSXRlbXModCwgZSkge1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSBpZiAodm9pZCAwICE9PSBuLnN0cikge1xuICAgICAgICAgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ci5wdXNoKG4uc3RyKTtcbiAgICAgICAgICAgIGFwcGVuZFRleHQodGhpcywgbiwgZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChcImJlZ2luTWFya2VkQ29udGVudFByb3BzXCIgPT09IG4udHlwZSB8fCBcImJlZ2luTWFya2VkQ29udGVudFwiID09PSBuLnR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFya2VkQ29udGVudFwiKTtcbiAgICAgICAgICAgIG51bGwgIT09IG4uaWQgJiYgdGhpcy5fY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImlkXCIsIFwiXCIuY29uY2F0KG4uaWQpKTtcbiAgICAgICAgICAgIHQuYXBwZW5kKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgfSBlbHNlIFwiZW5kTWFya2VkQ29udGVudFwiID09PSBuLnR5cGUgJiYgKHRoaXMuX2NvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBfbGF5b3V0VGV4dCh0KSB7XG4gICAgICAgICAgY29uc3QgZSA9IHRoaXMuX2xheW91dFRleHRQYXJhbXMucHJvcGVydGllcyA9IHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldCh0KTtcbiAgICAgICAgICB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zLmRpdiA9IHQ7XG4gICAgICAgICAgbGF5b3V0KHRoaXMuX2xheW91dFRleHRQYXJhbXMpO1xuICAgICAgICAgIGUuaGFzVGV4dCAmJiB0aGlzLl9jb250YWluZXIuYXBwZW5kKHQpO1xuICAgICAgICAgIGlmIChlLmhhc0VPTCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInByZXNlbnRhdGlvblwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9yZW5kZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IG5ldyBpLlByb21pc2VDYXBhYmlsaXR5KCk7XG4gICAgICAgICAgbGV0IGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGlmICh0aGlzLl9pc1JlYWRhYmxlU3RyZWFtKSB7XG4gICAgICAgICAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl9yZWFkZXIucmVhZCgpLnRoZW4obiA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgICAgICAgZG9uZTogclxuICAgICAgICAgICAgICAgIH0gPSBuO1xuICAgICAgICAgICAgICAgIGlmIChyKSB0LnJlc29sdmUoKTtlbHNlIHtcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZSwgaS5zdHlsZXMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKGkuaXRlbXMsIGUpO1xuICAgICAgICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSwgdC5yZWplY3QpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlciA9IHRoaXMuX3RleHRDb250ZW50U291cmNlLmdldFJlYWRlcigpO1xuICAgICAgICAgICAgcHVtcCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RleHRDb250ZW50U291cmNlKSB0aHJvdyBuZXcgRXJyb3IoJ05vIFwidGV4dENvbnRlbnRTb3VyY2VcIiBwYXJhbWV0ZXIgc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgaXRlbXM6IGUsXG4gICAgICAgICAgICAgICAgc3R5bGVzOiBuXG4gICAgICAgICAgICAgIH0gPSB0aGlzLl90ZXh0Q29udGVudFNvdXJjZTtcbiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKGUsIG4pO1xuICAgICAgICAgICAgICB0LnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdC5wcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZSA9IG51bGw7XG4gICAgICAgICAgICAhZnVuY3Rpb24gcmVuZGVyKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQuX2NhbmNlbGVkKSByZXR1cm47XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSB0Ll90ZXh0RGl2cyxcbiAgICAgICAgICAgICAgICBuID0gdC5fY2FwYWJpbGl0eTtcbiAgICAgICAgICAgICAgaWYgKGUubGVuZ3RoID4gMWU1KSBuLnJlc29sdmUoKTtlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXQuX2lzUmVhZGFibGVTdHJlYW0pIGZvciAoY29uc3QgbiBvZiBlKSB0Ll9sYXlvdXRUZXh0KG4pO1xuICAgICAgICAgICAgICAgIG4ucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KHRoaXMpO1xuICAgICAgICAgIH0sIHRoaXMuX2NhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5UZXh0TGF5ZXJSZW5kZXJUYXNrID0gVGV4dExheWVyUmVuZGVyVGFzaztcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgPSB2b2lkIDA7XG4gICAgICBuKDEyNSk7XG4gICAgICBuKDEzNSk7XG4gICAgICBuKDEzNyk7XG4gICAgICBuKDE0MCk7XG4gICAgICBuKDE0Mik7XG4gICAgICBuKDE0NCk7XG4gICAgICBuKDE0Nik7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2MyksXG4gICAgICAgIHMgPSBuKDE2NCksXG4gICAgICAgIGEgPSBuKDE5NiksXG4gICAgICAgIG8gPSBuKDIwMSksXG4gICAgICAgIGwgPSBuKDE2NyksXG4gICAgICAgIGMgPSBuKDIwMik7XG4gICAgICB2YXIgX3JlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2FlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX29lID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2xlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2hlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2RlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3VlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3BlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX21lID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2JlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2dlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2ZlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDEzKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9mZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9nZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9iZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9tZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3JlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfc2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2FlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX29lLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBvaW50ZXJ1cC5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2xlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBvaW50ZXJkb3duLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfY2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBNYXAoKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9oZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZGUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3VlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9wZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIHVpTWFuYWdlcjogX2UxMSxcbiAgICAgICAgICAgIHBhZ2VJbmRleDogX243LFxuICAgICAgICAgICAgZGl2OiBfaTQsXG4gICAgICAgICAgICBhY2Nlc3NpYmlsaXR5TWFuYWdlcjogX3I0LFxuICAgICAgICAgICAgYW5ub3RhdGlvbkxheWVyOiBzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGwsXG4gICAgICAgICAgICBsMTBuOiBoXG4gICAgICAgICAgfSA9IF90MTM7XG4gICAgICAgICAgY29uc3QgZCA9IFthLkZyZWVUZXh0RWRpdG9yLCBvLklua0VkaXRvciwgYy5TdGFtcEVkaXRvcl07XG4gICAgICAgICAgaWYgKCFBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkID0gITA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgZCkgdC5pbml0aWFsaXplKGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfZTExLnJlZ2lzdGVyRWRpdG9yVHlwZXMoZCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9wZSwgX2UxMSk7XG4gICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSBfbjc7XG4gICAgICAgICAgdGhpcy5kaXYgPSBfaTQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9yZSwgX3I0KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2FlLCBzKTtcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gbDtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5hZGRMYXllcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgaXNFbXB0eSgpIHtcbiAgICAgICAgICByZXR1cm4gMCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jZSkuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVUb29sYmFyKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS51cGRhdGVUb29sYmFyKHQpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZU1vZGUoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmdldE1vZGUoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9mZSwgX2ZlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBpZiAodCA9PT0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSW5rRWRpdG9ySWZOZWVkZWQoITEpO1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcbiAgICAgICAgICB9IGVsc2UgdGhpcy5lbmFibGVDbGljaygpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLnVuc2VsZWN0QWxsKCk7XG4gICAgICAgICAgaWYgKHQgIT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuICAgICAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImZyZWVUZXh0RWRpdGluZ1wiLCB0ID09PSBpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJpbmtFZGl0aW5nXCIsIHQgPT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJzdGFtcEVkaXRpbmdcIiwgdCA9PT0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUCk7XG4gICAgICAgICAgICB0aGlzLmRpdi5oaWRkZW4gPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWRkSW5rRWRpdG9ySWZOZWVkZWQodCkge1xuICAgICAgICAgIGlmICghdCAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRNb2RlKCkgIT09IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LKSByZXR1cm47XG4gICAgICAgICAgaWYgKCF0KSBmb3IgKGNvbnN0IHQgb2YgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jZSkudmFsdWVzKCkpIGlmICh0LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgdC5zZXRJbkJhY2tncm91bmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfZ2UsIF9nZTIpLmNhbGwodGhpcywge1xuICAgICAgICAgICAgb2Zmc2V0WDogMCxcbiAgICAgICAgICAgIG9mZnNldFk6IDBcbiAgICAgICAgICB9KS5zZXRJbkJhY2tncm91bmQoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRFZGl0aW5nU3RhdGUodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLnNldEVkaXRpbmdTdGF0ZSh0KTtcbiAgICAgICAgfVxuICAgICAgICBhZGRDb21tYW5kcyh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuYWRkQ29tbWFuZHModCk7XG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlKCkge1xuICAgICAgICAgIHRoaXMuZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIjtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgZS5lbmFibGVFZGl0aW5nKCk7XG4gICAgICAgICAgICBlLmFubm90YXRpb25FbGVtZW50SWQgJiYgdC5hZGQoZS5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FlKSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IGUgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FlKS5nZXRFZGl0YWJsZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgZm9yIChjb25zdCBuIG9mIGUpIHtcbiAgICAgICAgICAgIG4uaGlkZSgpO1xuICAgICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KG4uZGF0YS5pZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHQuaGFzKG4uZGF0YS5pZCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZGVzZXJpYWxpemUobik7XG4gICAgICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgICB0aGlzLmFkZE9yUmVidWlsZChlKTtcbiAgICAgICAgICAgICAgZS5lbmFibGVFZGl0aW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRpc2FibGUoKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF91ZSwgITApO1xuICAgICAgICAgIHRoaXMuZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcbiAgICAgICAgICBjb25zdCB0ID0gbmV3IFNldCgpO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgZS5kaXNhYmxlRWRpdGluZygpO1xuICAgICAgICAgICAgaWYgKGUuYW5ub3RhdGlvbkVsZW1lbnRJZCAmJiBudWxsID09PSBlLnNlcmlhbGl6ZSgpKSB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRnZXRFZGl0YWJsZUFubm87XG4gICAgICAgICAgICAgIChfdGhpcyRnZXRFZGl0YWJsZUFubm8gPSB0aGlzLmdldEVkaXRhYmxlQW5ub3RhdGlvbihlLmFubm90YXRpb25FbGVtZW50SWQpKSA9PT0gbnVsbCB8fCBfdGhpcyRnZXRFZGl0YWJsZUFubm8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGdldEVkaXRhYmxlQW5uby5zaG93KCk7XG4gICAgICAgICAgICAgIGUucmVtb3ZlKCk7XG4gICAgICAgICAgICB9IGVsc2UgdC5hZGQoZS5hbm5vdGF0aW9uRWxlbWVudElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYWUpKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hZSkuZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuIG9mIGUpIHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGlkOiBlXG4gICAgICAgICAgICAgIH0gPSBuLmRhdGE7XG4gICAgICAgICAgICAgIHQuaGFzKGUpIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmlzRGVsZXRlZEFubm90YXRpb25FbGVtZW50KGUpIHx8IG4uc2hvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9mZSwgX2ZlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmlzRW1wdHkgJiYgKHRoaXMuZGl2LmhpZGRlbiA9ICEwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3VlLCAhMSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpIHtcbiAgICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OTtcbiAgICAgICAgICByZXR1cm4gKChfY2xhc3NQcml2YXRlRmllbGRHZXQ5ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hZSkpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDkuZ2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpKSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldEFjdGl2ZUVkaXRvcih0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuZ2V0QWN0aXZlKCkgIT09IHQgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuc2V0QWN0aXZlRWRpdG9yKHQpO1xuICAgICAgICB9XG4gICAgICAgIGVuYWJsZUNsaWNrKCkge1xuICAgICAgICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xlKSk7XG4gICAgICAgICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29lKSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzYWJsZUNsaWNrKCkge1xuICAgICAgICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2xlKSk7XG4gICAgICAgICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29lKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0YWNoKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS5zZXQodC5pZCwgdCk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnRJZDogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIGUgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuaXNEZWxldGVkQW5ub3RhdGlvbkVsZW1lbnQoZSkgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkucmVtb3ZlRGVsZXRlZEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICB9XG4gICAgICAgIGRldGFjaCh0KSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDEwO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfY2UpLmRlbGV0ZSh0LmlkKTtcbiAgICAgICAgICAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTAgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3JlKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDEwLnJlbW92ZVBvaW50ZXJJblRleHRMYXllcih0LmNvbnRlbnREaXYpO1xuICAgICAgICAgICFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3VlKSAmJiB0LmFubm90YXRpb25FbGVtZW50SWQgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuYWRkRGVsZXRlZEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSh0KSB7XG4gICAgICAgICAgdGhpcy5kZXRhY2godCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkucmVtb3ZlRWRpdG9yKHQpO1xuICAgICAgICAgIHQuZGl2LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHQuZGl2LnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuICAgICAgICAgICAgdC5kaXYucmVtb3ZlKCk7XG4gICAgICAgICAgICB0LmlzQXR0YWNoZWRUb0RPTSA9ICExO1xuICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5mb2N1c01haW5Db250YWluZXIoKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2RlKSB8fCB0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKCExKTtcbiAgICAgICAgfVxuICAgICAgICBhZGQodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX21lLCBfbWUyKS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmFkZEVkaXRvcih0KTtcbiAgICAgICAgICB0aGlzLmF0dGFjaCh0KTtcbiAgICAgICAgICBpZiAoIXQuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5yZW5kZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmFwcGVuZChlKTtcbiAgICAgICAgICAgIHQuaXNBdHRhY2hlZFRvRE9NID0gITA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubW92ZUVkaXRvckluRE9NKHQpO1xuICAgICAgICAgIHQub25jZUFkZGVkKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSh0KTtcbiAgICAgICAgfVxuICAgICAgICBtb3ZlRWRpdG9ySW5ET00odCkge1xuICAgICAgICAgIHZhciBfY2xhc3NQcml2YXRlRmllbGRHZXQxMTtcbiAgICAgICAgICAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTEgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3JlKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDExLm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIHQuZGl2LCB0LmNvbnRlbnREaXYsICEwKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRPclJlYnVpbGQodCkge1xuICAgICAgICAgIHQubmVlZHNUb0JlUmVidWlsdCgpID8gdC5yZWJ1aWxkKCkgOiB0aGlzLmFkZCh0KTtcbiAgICAgICAgfVxuICAgICAgICBhZGRVbmRvYWJsZUVkaXRvcih0KSB7XG4gICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRPclJlYnVpbGQodCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgICB0LnJlbW92ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG11c3RFeGVjOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldE5leHRJZCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuZ2V0SWQoKTtcbiAgICAgICAgfVxuICAgICAgICBkZXNlcmlhbGl6ZSh0KSB7XG4gICAgICAgICAgdmFyIF90JGFubm90YXRpb25UeXBlO1xuICAgICAgICAgIHN3aXRjaCAoKF90JGFubm90YXRpb25UeXBlID0gdC5hbm5vdGF0aW9uVHlwZSkgIT09IG51bGwgJiYgX3QkYW5ub3RhdGlvblR5cGUgIT09IHZvaWQgMCA/IF90JGFubm90YXRpb25UeXBlIDogdC5hbm5vdGF0aW9uRWRpdG9yVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOlxuICAgICAgICAgICAgICByZXR1cm4gYS5GcmVlVGV4dEVkaXRvci5kZXNlcmlhbGl6ZSh0LCB0aGlzLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKSk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LOlxuICAgICAgICAgICAgICByZXR1cm4gby5JbmtFZGl0b3IuZGVzZXJpYWxpemUodCwgdGhpcywgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOlxuICAgICAgICAgICAgICByZXR1cm4gYy5TdGFtcEVkaXRvci5kZXNlcmlhbGl6ZSh0LCB0aGlzLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHNldFNlbGVjdGVkKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5zZXRTZWxlY3RlZCh0KTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVTZWxlY3RlZCh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkudG9nZ2xlU2VsZWN0ZWQodCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNTZWxlY3RlZCh0KSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmlzU2VsZWN0ZWQodCk7XG4gICAgICAgIH1cbiAgICAgICAgdW5zZWxlY3QodCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLnVuc2VsZWN0KHQpO1xuICAgICAgICB9XG4gICAgICAgIHBvaW50ZXJ1cCh0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgaXNNYWM6IGVcbiAgICAgICAgICB9ID0gaS5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcbiAgICAgICAgICBpZiAoISgwICE9PSB0LmJ1dHRvbiB8fCB0LmN0cmxLZXkgJiYgZSkgJiYgdC50YXJnZXQgPT09IHRoaXMuZGl2ICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaGUpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2hlLCAhMSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3NlKSA/IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2dlLCBfZ2UyKS5jYWxsKHRoaXMsIHQpIDogX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9zZSwgITApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwb2ludGVyZG93bih0KSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfaGUpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2hlLCAhMSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGlzTWFjOiBlXG4gICAgICAgICAgfSA9IGkuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICAgICAgaWYgKDAgIT09IHQuYnV0dG9uIHx8IHQuY3RybEtleSAmJiBlKSByZXR1cm47XG4gICAgICAgICAgaWYgKHQudGFyZ2V0ICE9PSB0aGlzLmRpdikgcmV0dXJuO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaGUsICEwKTtcbiAgICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuZ2V0QWN0aXZlKCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9zZSwgIW4gfHwgbi5pc0VtcHR5KCkpO1xuICAgICAgICB9XG4gICAgICAgIGRyb3AodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9wbGFpblwiKSxcbiAgICAgICAgICAgIG4gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRFZGl0b3IoZSk7XG4gICAgICAgICAgaWYgKCFuKSByZXR1cm47XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcIm1vdmVcIjtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9tZSwgX21lMikuY2FsbCh0aGlzLCBuKTtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICByID0gdC5jbGllbnRYIC0gaS54LFxuICAgICAgICAgICAgcyA9IHQuY2xpZW50WSAtIGkueTtcbiAgICAgICAgICBuLnRyYW5zbGF0ZShyIC0gbi5zdGFydFgsIHMgLSBuLnN0YXJ0WSk7XG4gICAgICAgICAgdGhpcy5tb3ZlRWRpdG9ySW5ET00obik7XG4gICAgICAgICAgbi5kaXYuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBkcmFnb3Zlcih0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDEyO1xuICAgICAgICAgICgoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTIgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRBY3RpdmUoKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDEyLnBhcmVudCkgPT09IHRoaXMgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSkuc2V0QWN0aXZlRWRpdG9yKG51bGwpO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgdmFyIF9jbGFzc1ByaXZhdGVGaWVsZEdldDEzO1xuICAgICAgICAgICAgKF9jbGFzc1ByaXZhdGVGaWVsZEdldDEzID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9yZSkpID09PSBudWxsIHx8IF9jbGFzc1ByaXZhdGVGaWVsZEdldDEzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY2xhc3NQcml2YXRlRmllbGRHZXQxMy5yZW1vdmVQb2ludGVySW5UZXh0TGF5ZXIodC5jb250ZW50RGl2KTtcbiAgICAgICAgICAgIHQuc2V0UGFyZW50KG51bGwpO1xuICAgICAgICAgICAgdC5pc0F0dGFjaGVkVG9ET00gPSAhMTtcbiAgICAgICAgICAgIHQuZGl2LnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRpdiA9IG51bGw7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9jZSkuY2xlYXIoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5yZW1vdmVMYXllcih0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIodCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICB2aWV3cG9ydDogZVxuICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgIHRoaXMudmlld3BvcnQgPSBlO1xuICAgICAgICAgICgwLCBsLnNldExheWVyRGltZW5zaW9ucykodGhpcy5kaXYsIGUpO1xuICAgICAgICAgICgwLCBzLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJkcmFnb3ZlclwiLCBcImRyb3BcIl0pO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRFZGl0b3JzKHRoaXMucGFnZUluZGV4KSkgdGhpcy5hZGQodCk7XG4gICAgICAgICAgdGhpcy51cGRhdGVNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmlld3BvcnQ6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5jb21taXRPclJlbW92ZSgpO1xuICAgICAgICAgIHRoaXMudmlld3BvcnQgPSBlO1xuICAgICAgICAgICgwLCBsLnNldExheWVyRGltZW5zaW9ucykodGhpcy5kaXYsIHtcbiAgICAgICAgICAgIHJvdGF0aW9uOiBlLnJvdGF0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHBhZ2VEaW1lbnNpb25zKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aDogdCxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IGVcbiAgICAgICAgICB9ID0gdGhpcy52aWV3cG9ydC5yYXdEaW1zO1xuICAgICAgICAgIHJldHVybiBbdCwgZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9tZTIodCkge1xuICAgICAgICBpZiAodC5wYXJlbnQgIT09IHRoaXMpIHtcbiAgICAgICAgICB2YXIgX3QkcGFyZW50O1xuICAgICAgICAgIGlmICh0LmFubm90YXRpb25FbGVtZW50SWQpIHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcGUpLmFkZERlbGV0ZWRBbm5vdGF0aW9uRWxlbWVudCh0LmFubm90YXRpb25FbGVtZW50SWQpO1xuICAgICAgICAgICAgci5Bbm5vdGF0aW9uRWRpdG9yLmRlbGV0ZUFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgdC5hbm5vdGF0aW9uRWxlbWVudElkID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hdHRhY2godCk7XG4gICAgICAgICAgKF90JHBhcmVudCA9IHQucGFyZW50KSA9PT0gbnVsbCB8fCBfdCRwYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90JHBhcmVudC5kZXRhY2godCk7XG4gICAgICAgICAgdC5zZXRQYXJlbnQodGhpcyk7XG4gICAgICAgICAgaWYgKHQuZGl2ICYmIHQuaXNBdHRhY2hlZFRvRE9NKSB7XG4gICAgICAgICAgICB0LmRpdi5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmFwcGVuZCh0LmRpdik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfYmUyKHQpIHtcbiAgICAgICAgc3dpdGNoIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BlKS5nZXRNb2RlKCkpIHtcbiAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGEuRnJlZVRleHRFZGl0b3IodCk7XG4gICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLklOSzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgby5JbmtFZGl0b3IodCk7XG4gICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBjLlN0YW1wRWRpdG9yKHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2dlMih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLmdldE5leHRJZCgpLFxuICAgICAgICAgIG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9iZSwgX2JlMikuY2FsbCh0aGlzLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgIHg6IHQub2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IHQub2Zmc2V0WSxcbiAgICAgICAgICAgIHVpTWFuYWdlcjogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgbiAmJiB0aGlzLmFkZChuKTtcbiAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfZmUyKCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2RlLCAhMCk7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2NlKS52YWx1ZXMoKSkgdC5pc0VtcHR5KCkgJiYgdC5yZW1vdmUoKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9kZSwgITEpO1xuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KEFubm90YXRpb25FZGl0b3JMYXllciwgXCJfaW5pdGlhbGl6ZWRcIiwgITEpO1xuICAgICAgZS5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgPSBBbm5vdGF0aW9uRWRpdG9yTGF5ZXI7XG4gICAgfSwgKHQsIGUsIG4pID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICB2YXIgX2NsYXNzMzA7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuRnJlZVRleHRFZGl0b3IgPSB2b2lkIDA7XG4gICAgICBuKDg5KTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTY0KSxcbiAgICAgICAgcyA9IG4oMTYzKSxcbiAgICAgICAgYSA9IG4oMTk3KTtcbiAgICAgIHZhciBfdmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfQWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZTEyID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0VlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3hlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX3dlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0NlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1RlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1BlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1JlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2tlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0ZlID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0llID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX01lID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBGcmVlVGV4dEVkaXRvciBleHRlbmRzIHMuQW5ub3RhdGlvbkVkaXRvciB7XG4gICAgICAgIHN0YXRpYyBnZXQgX2tleWJvYXJkTWFuYWdlcigpIHtcbiAgICAgICAgICBjb25zdCB0ID0gRnJlZVRleHRFZGl0b3IucHJvdG90eXBlLFxuICAgICAgICAgICAgYXJyb3dDaGVja2VyID0gdCA9PiB0LmlzRW1wdHkoKSxcbiAgICAgICAgICAgIGUgPSByLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIuVFJBTlNMQVRFX1NNQUxMLFxuICAgICAgICAgICAgbiA9IHIuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5UUkFOU0xBVEVfQklHO1xuICAgICAgICAgIHJldHVybiAoMCwgaS5zaGFkb3cpKHRoaXMsIFwiX2tleWJvYXJkTWFuYWdlclwiLCBuZXcgci5LZXlib2FyZE1hbmFnZXIoW1tbXCJjdHJsK3NcIiwgXCJtYWMrbWV0YStzXCIsIFwiY3RybCtwXCIsIFwibWFjK21ldGErcFwiXSwgdC5jb21taXRPclJlbW92ZSwge1xuICAgICAgICAgICAgYnViYmxlczogITBcbiAgICAgICAgICB9XSwgW1tcImN0cmwrRW50ZXJcIiwgXCJtYWMrbWV0YStFbnRlclwiLCBcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIHQuY29tbWl0T3JSZW1vdmVdLCBbW1wiQXJyb3dMZWZ0XCIsIFwibWFjK0Fycm93TGVmdFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFstZSwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dMZWZ0XCIsIFwibWFjK3NoaWZ0K0Fycm93TGVmdFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFstbiwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcIkFycm93UmlnaHRcIiwgXCJtYWMrQXJyb3dSaWdodFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFtlLCAwXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dLCBbW1wiY3RybCtBcnJvd1JpZ2h0XCIsIFwibWFjK3NoaWZ0K0Fycm93UmlnaHRcIl0sIHQuX3RyYW5zbGF0ZUVtcHR5LCB7XG4gICAgICAgICAgICBhcmdzOiBbbiwgMF0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcIkFycm93VXBcIiwgXCJtYWMrQXJyb3dVcFwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCAtZV0sXG4gICAgICAgICAgICBjaGVja2VyOiBhcnJvd0NoZWNrZXJcbiAgICAgICAgICB9XSwgW1tcImN0cmwrQXJyb3dVcFwiLCBcIm1hYytzaGlmdCtBcnJvd1VwXCJdLCB0Ll90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgICAgICAgYXJnczogWzAsIC1uXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dLCBbW1wiQXJyb3dEb3duXCIsIFwibWFjK0Fycm93RG93blwiXSwgdC5fdHJhbnNsYXRlRW1wdHksIHtcbiAgICAgICAgICAgIGFyZ3M6IFswLCBlXSxcbiAgICAgICAgICAgIGNoZWNrZXI6IGFycm93Q2hlY2tlclxuICAgICAgICAgIH1dLCBbW1wiY3RybCtBcnJvd0Rvd25cIiwgXCJtYWMrc2hpZnQrQXJyb3dEb3duXCJdLCB0Ll90cmFuc2xhdGVFbXB0eSwge1xuICAgICAgICAgICAgYXJnczogWzAsIG5dLFxuICAgICAgICAgICAgY2hlY2tlcjogYXJyb3dDaGVja2VyXG4gICAgICAgICAgfV1dKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3RydWN0b3IoX3QxNCkge1xuICAgICAgICAgIHN1cGVyKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3QxNCksIHt9LCB7XG4gICAgICAgICAgICBuYW1lOiBcImZyZWVUZXh0RWRpdG9yXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9NZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9JZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9GZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9rZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9SZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9QZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9UZSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3ZlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVkaXRvckRpdkJsdXIuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF95ZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5lZGl0b3JEaXZGb2N1cy5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0FlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVkaXRvckRpdklucHV0LmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZTEyLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmVkaXRvckRpdktleWRvd24uYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9TZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0VlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBcIlwiXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3hlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBcIlwiLmNvbmNhdCh0aGlzLmlkLCBcIi1lZGl0b3JcIilcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfd2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9DZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU2UsIF90MTQuY29sb3IgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBzLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3IpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfd2UsIF90MTQuZm9udFNpemUgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRGb250U2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGluaXRpYWxpemUodCkge1xuICAgICAgICAgIHRoaXMuX2wxMG5Qcm9taXNlID0gbmV3IE1hcChbXCJmcmVlX3RleHQyX2RlZmF1bHRfY29udGVudFwiLCBcImVkaXRvcl9mcmVlX3RleHQyX2FyaWFfbGFiZWxcIl0ubWFwKGUgPT4gW2UsIHQuZ2V0KGUpXSkpO1xuICAgICAgICAgIGNvbnN0IGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgdGhpcy5faW50ZXJuYWxQYWRkaW5nID0gcGFyc2VGbG9hdChlLmdldFByb3BlcnR5VmFsdWUoXCItLWZyZWV0ZXh0LXBhZGRpbmdcIikpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHQsIGUpIHtcbiAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFOlxuICAgICAgICAgICAgICBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplID0gZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1I6XG4gICAgICAgICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgPSBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXJhbXModCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkU6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RlLCBfVGUyKS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUjpcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUGUsIF9QZTIpLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICByZXR1cm4gW1tpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemVdLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBzLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdXTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuICAgICAgICAgIHJldHVybiBbW2kuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRSwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSldLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZSldXTtcbiAgICAgICAgfVxuICAgICAgICBfdHJhbnNsYXRlRW1wdHkodCwgZSkge1xuICAgICAgICAgIHRoaXMuX3VpTWFuYWdlci50cmFuc2xhdGVTZWxlY3RlZEVkaXRvcnModCwgZSwgITApO1xuICAgICAgICB9XG4gICAgICAgIGdldEluaXRpYWxUcmFuc2xhdGlvbigpIHtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wYXJlbnRTY2FsZTtcbiAgICAgICAgICByZXR1cm4gWy1GcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdCwgLShGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICsgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSkpICogdF07XG4gICAgICAgIH1cbiAgICAgICAgcmVidWlsZCgpIHtcbiAgICAgICAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgICAgICAgbnVsbCAhPT0gdGhpcy5kaXYgJiYgKHRoaXMuaXNBdHRhY2hlZFRvRE9NIHx8IHRoaXMucGFyZW50LmFkZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUoITEpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQudXBkYXRlVG9vbGJhcihpLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUKTtcbiAgICAgICAgICAgIHN1cGVyLmVuYWJsZUVkaXRNb2RlKCk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LnJlbW92ZShcImVuYWJsZWRcIik7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMDtcbiAgICAgICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICExO1xuICAgICAgICAgICAgdGhpcy5kaXYucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9lMTIpKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3llKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZlKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZSghMCk7XG4gICAgICAgICAgICBzdXBlci5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKFwiZW5hYmxlZFwiKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9ICExO1xuICAgICAgICAgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeGUpKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICEwO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9lMTIpKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3llKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZlKSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9BZSkpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICExO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC5hZGQoXCJmcmVlVGV4dEVkaXRpbmdcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvY3VzaW4odCkge1xuICAgICAgICAgIHN1cGVyLmZvY3VzaW4odCk7XG4gICAgICAgICAgdC50YXJnZXQgIT09IHRoaXMuZWRpdG9yRGl2ICYmIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgb25jZUFkZGVkKCkge1xuICAgICAgICAgIGlmICh0aGlzLndpZHRoKSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9NZSwgX01lMikuY2FsbCh0aGlzKTtlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlzRW1wdHkoKSB7XG4gICAgICAgICAgcmV0dXJuICF0aGlzLmVkaXRvckRpdiB8fCBcIlwiID09PSB0aGlzLmVkaXRvckRpdi5pbm5lclRleHQudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSgpIHtcbiAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICExO1xuICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2V0RWRpdGluZ1N0YXRlKCEwKTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZVRleHRFZGl0aW5nXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjb21taXQoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSByZXR1cm47XG4gICAgICAgICAgc3VwZXIuY29tbWl0KCk7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICBjb25zdCB0ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9FZSksXG4gICAgICAgICAgICBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9FZSwgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUmUsIF9SZTIpLmNhbGwodGhpcykudHJpbUVuZCgpKTtcbiAgICAgICAgICBpZiAodCA9PT0gZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHNldFRleHQgPSB0ID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfRWUsIHQpO1xuICAgICAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRmUsIF9GZTIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgIHRoaXMucmVidWlsZCgpO1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9rZSwgX2tlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLnJlbW92ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgc2V0VGV4dChlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHNldFRleHQodCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbXVzdEV4ZWM6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa2UsIF9rZTIpLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNJbkVkaXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZW50ZXJJbkVkaXRNb2RlKCkge1xuICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGRibGNsaWNrKHQpIHtcbiAgICAgICAgICB0aGlzLmVudGVySW5FZGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGtleWRvd24odCkge1xuICAgICAgICAgIHQudGFyZ2V0ID09PSB0aGlzLmRpdiAmJiBcIkVudGVyXCIgPT09IHQua2V5ICYmIHRoaXMuZW50ZXJJbkVkaXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yRGl2S2V5ZG93bih0KSB7XG4gICAgICAgICAgRnJlZVRleHRFZGl0b3IuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvckRpdkZvY3VzKHQpIHtcbiAgICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICEwO1xuICAgICAgICB9XG4gICAgICAgIGVkaXRvckRpdkJsdXIodCkge1xuICAgICAgICAgIHRoaXMuaXNFZGl0aW5nID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yRGl2SW5wdXQodCkge1xuICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZnJlZVRleHRFZGl0aW5nXCIsIHRoaXMuaXNFbXB0eSgpKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdGluZygpIHtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwiY29tbWVudFwiKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVFZGl0aW5nKCkge1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJ0ZXh0Ym94XCIpO1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIsICEwKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGl2KSByZXR1cm4gdGhpcy5kaXY7XG4gICAgICAgICAgbGV0IHQsIGU7XG4gICAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHQgPSB0aGlzLng7XG4gICAgICAgICAgICBlID0gdGhpcy55O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW5kZXIoKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgdGhpcy5lZGl0b3JEaXYuY2xhc3NOYW1lID0gXCJpbnRlcm5hbFwiO1xuICAgICAgICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImlkXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeGUpKTtcbiAgICAgICAgICB0aGlzLmVuYWJsZUVkaXRpbmcoKTtcbiAgICAgICAgICBGcmVlVGV4dEVkaXRvci5fbDEwblByb21pc2UuZ2V0KFwiZWRpdG9yX2ZyZWVfdGV4dDJfYXJpYV9sYWJlbFwiKS50aGVuKHQgPT4ge1xuICAgICAgICAgICAgdmFyIF90aGlzJGVkaXRvckRpdjtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMkZWRpdG9yRGl2ID0gdGhpcy5lZGl0b3JEaXYpID09PSBudWxsIHx8IF90aGlzJGVkaXRvckRpdiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgRnJlZVRleHRFZGl0b3IuX2wxMG5Qcm9taXNlLmdldChcImZyZWVfdGV4dDJfZGVmYXVsdF9jb250ZW50XCIpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZWRpdG9yRGl2MjtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMkZWRpdG9yRGl2MiA9IHRoaXMuZWRpdG9yRGl2KSA9PT0gbnVsbCB8fCBfdGhpcyRlZGl0b3JEaXYyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRlZGl0b3JEaXYyLnNldEF0dHJpYnV0ZShcImRlZmF1bHQtY29udGVudFwiLCB0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMDtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBzdHlsZTogblxuICAgICAgICAgIH0gPSB0aGlzLmVkaXRvckRpdjtcbiAgICAgICAgICBuLmZvbnRTaXplID0gXCJjYWxjKFwiLmNvbmNhdChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3dlKSwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikpXCIpO1xuICAgICAgICAgIG4uY29sb3IgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1NlKTtcbiAgICAgICAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5lZGl0b3JEaXYpO1xuICAgICAgICAgIHRoaXMub3ZlcmxheURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoXCJvdmVybGF5XCIsIFwiZW5hYmxlZFwiKTtcbiAgICAgICAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5vdmVybGF5RGl2KTtcbiAgICAgICAgICAoMCwgci5iaW5kRXZlbnRzKSh0aGlzLCB0aGlzLmRpdiwgW1wiZGJsY2xpY2tcIiwgXCJrZXlkb3duXCJdKTtcbiAgICAgICAgICBpZiAodGhpcy53aWR0aCkge1xuICAgICAgICAgICAgY29uc3QgW24sIGldID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCkge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHJcbiAgICAgICAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ2UpO1xuICAgICAgICAgICAgICBsZXQgW3MsIGFdID0gdGhpcy5nZXRJbml0aWFsVHJhbnNsYXRpb24oKTtcbiAgICAgICAgICAgICAgW3MsIGFdID0gdGhpcy5wYWdlVHJhbnNsYXRpb25Ub1NjcmVlbihzLCBhKTtcbiAgICAgICAgICAgICAgY29uc3QgW28sIGxdID0gdGhpcy5wYWdlRGltZW5zaW9ucyxcbiAgICAgICAgICAgICAgICBbYywgaF0gPSB0aGlzLnBhZ2VUcmFuc2xhdGlvbjtcbiAgICAgICAgICAgICAgbGV0IGQsIHU7XG4gICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5yb3RhdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIGQgPSB0ICsgKHJbMF0gLSBjKSAvIG87XG4gICAgICAgICAgICAgICAgICB1ID0gZSArIHRoaXMuaGVpZ2h0IC0gKHJbMV0gLSBoKSAvIGw7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgICAgICAgZCA9IHQgKyAoclswXSAtIGMpIC8gbztcbiAgICAgICAgICAgICAgICAgIHUgPSBlIC0gKHJbMV0gLSBoKSAvIGw7XG4gICAgICAgICAgICAgICAgICBbcywgYV0gPSBbYSwgLXNdO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICAgICAgICBkID0gdCAtIHRoaXMud2lkdGggKyAoclswXSAtIGMpIC8gbztcbiAgICAgICAgICAgICAgICAgIHUgPSBlIC0gKHJbMV0gLSBoKSAvIGw7XG4gICAgICAgICAgICAgICAgICBbcywgYV0gPSBbLXMsIC1hXTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgICAgICAgZCA9IHQgKyAoclswXSAtIGMgLSB0aGlzLmhlaWdodCAqIGwpIC8gbztcbiAgICAgICAgICAgICAgICAgIHUgPSBlICsgKHJbMV0gLSBoIC0gdGhpcy53aWR0aCAqIG8pIC8gbDtcbiAgICAgICAgICAgICAgICAgIFtzLCBhXSA9IFstYSwgc107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zZXRBdChkICogbiwgdSAqIGksIHMsIGEpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMuc2V0QXQodCAqIG4sIGUgKiBpLCB0aGlzLndpZHRoICogbiwgdGhpcy5oZWlnaHQgKiBpKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0ZlLCBfRmUyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gITA7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gITE7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSAhMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICB9XG4gICAgICAgIGdldCBjb250ZW50RGl2KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVkaXRvckRpdjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZGVzZXJpYWxpemUodCwgZSwgbikge1xuICAgICAgICAgIGxldCByID0gbnVsbDtcbiAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGEuRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEFwcGVhcmFuY2VEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBmb250U2l6ZTogZSxcbiAgICAgICAgICAgICAgICAgIGZvbnRDb2xvcjogblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVjdDogcyxcbiAgICAgICAgICAgICAgICByb3RhdGlvbjogYSxcbiAgICAgICAgICAgICAgICBpZDogb1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0ZXh0Q29udGVudDogbCxcbiAgICAgICAgICAgICAgdGV4dFBvc2l0aW9uOiBjLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiBoXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICAgIGlmICghbCB8fCAwID09PSBsLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByID0gdCA9IHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICAgICAgICAgIGNvbG9yOiBBcnJheS5mcm9tKG4pLFxuICAgICAgICAgICAgICBmb250U2l6ZTogZSxcbiAgICAgICAgICAgICAgdmFsdWU6IGwuam9pbihcIlxcblwiKSxcbiAgICAgICAgICAgICAgcG9zaXRpb246IGMsXG4gICAgICAgICAgICAgIHBhZ2VJbmRleDogaCAtIDEsXG4gICAgICAgICAgICAgIHJlY3Q6IHMsXG4gICAgICAgICAgICAgIHJvdGF0aW9uOiBhLFxuICAgICAgICAgICAgICBpZDogbyxcbiAgICAgICAgICAgICAgZGVsZXRlZDogITFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHMgPSBzdXBlci5kZXNlcmlhbGl6ZSh0LCBlLCBuKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQocywgX3dlLCB0LmZvbnRTaXplKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQocywgX1NlLCBpLlV0aWwubWFrZUhleENvbG9yKC4uLnQuY29sb3IpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQocywgX0VlLCB0LnZhbHVlKTtcbiAgICAgICAgICBzLmFubm90YXRpb25FbGVtZW50SWQgPSB0LmlkIHx8IG51bGw7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHMsIF9DZSwgcik7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplKCkge1xuICAgICAgICAgIGxldCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdO1xuICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICAgICAgICBpZDogdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkLFxuICAgICAgICAgICAgZGVsZXRlZDogITBcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGUgPSBGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdGhpcy5wYXJlbnRTY2FsZSxcbiAgICAgICAgICAgIG4gPSB0aGlzLmdldFJlY3QoZSwgZSksXG4gICAgICAgICAgICByID0gcy5Bbm5vdGF0aW9uRWRpdG9yLl9jb2xvck1hbmFnZXIuY29udmVydCh0aGlzLmlzQXR0YWNoZWRUb0RPTSA/IGdldENvbXB1dGVkU3R5bGUodGhpcy5lZGl0b3JEaXYpLmNvbG9yIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZSkpLFxuICAgICAgICAgICAgYSA9IHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG4gICAgICAgICAgICAgIGNvbG9yOiByLFxuICAgICAgICAgICAgICBmb250U2l6ZTogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSksXG4gICAgICAgICAgICAgIHZhbHVlOiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0VlKSxcbiAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgcmVjdDogbixcbiAgICAgICAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb25cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHQpIHJldHVybiBhO1xuICAgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25FbGVtZW50SWQgJiYgIV9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0llLCBfSWUyKS5jYWxsKHRoaXMsIGEpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBhLmlkID0gdGhpcy5hbm5vdGF0aW9uRWxlbWVudElkO1xuICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfY2xhc3MzMCA9IEZyZWVUZXh0RWRpdG9yO1xuICAgICAgZnVuY3Rpb24gX1RlMih0KSB7XG4gICAgICAgIGNvbnN0IHNldEZvbnRzaXplID0gdCA9PiB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvckRpdi5zdHlsZS5mb250U2l6ZSA9IFwiY2FsYyhcIi5jb25jYXQodCwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikpXCIpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUoMCwgLSh0IC0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF93ZSkpICogdGhpcy5wYXJlbnRTY2FsZSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3dlLCB0KTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tlLCBfa2UyKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfd2UpO1xuICAgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHNldEZvbnRzaXplKHQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgc2V0Rm9udHNpemUoZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdXN0RXhlYzogITAsXG4gICAgICAgICAgdHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLFxuICAgICAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6ICEwLFxuICAgICAgICAgIGtlZXBVbmRvOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9QZTIodCkge1xuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZSk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9TZSwgdGhpcy5lZGl0b3JEaXYuc3R5bGUuY29sb3IgPSB0KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVuZG86ICgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU2UsIHRoaXMuZWRpdG9yRGl2LnN0eWxlLmNvbG9yID0gZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdXN0RXhlYzogITAsXG4gICAgICAgICAgdHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUixcbiAgICAgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiAhMCxcbiAgICAgICAgICBrZWVwVW5kbzogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfUmUyKCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy5lZGl0b3JEaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkaXZcIik7XG4gICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgcmV0dXJuIHRoaXMuZWRpdG9yRGl2LmlubmVyVGV4dDtcbiAgICAgICAgY29uc3QgZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgdCkgZS5wdXNoKG4uaW5uZXJUZXh0LnJlcGxhY2UoL1xcclxcbj98XFxuLywgXCJcIikpO1xuICAgICAgICByZXR1cm4gZS5qb2luKFwiXFxuXCIpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2tlMigpIHtcbiAgICAgICAgY29uc3QgW3QsIGVdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICBsZXQgbjtcbiAgICAgICAgaWYgKHRoaXMuaXNBdHRhY2hlZFRvRE9NKSBuID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBjdXJyZW50TGF5ZXI6IHQsXG4gICAgICAgICAgICAgIGRpdjogZVxuICAgICAgICAgICAgfSA9IHRoaXMsXG4gICAgICAgICAgICBpID0gZS5zdHlsZS5kaXNwbGF5O1xuICAgICAgICAgIGUuc3R5bGUuZGlzcGxheSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgdC5kaXYuYXBwZW5kKHRoaXMuZGl2KTtcbiAgICAgICAgICBuID0gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICBlLnJlbW92ZSgpO1xuICAgICAgICAgIGUuc3R5bGUuZGlzcGxheSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucm90YXRpb24gJSAxODAgPT0gdGhpcy5wYXJlbnRSb3RhdGlvbiAlIDE4MCkge1xuICAgICAgICAgIHRoaXMud2lkdGggPSBuLndpZHRoIC8gdDtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IG4uaGVpZ2h0IC8gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndpZHRoID0gbi5oZWlnaHQgLyB0O1xuICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gbi53aWR0aCAvIGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXhBbmRTZXRQb3NpdGlvbigpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0ZlMigpIHtcbiAgICAgICAgdGhpcy5lZGl0b3JEaXYucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0VlKSkgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRWUpLnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgZS5hcHBlbmQodCA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgICB0aGlzLmVkaXRvckRpdi5hcHBlbmQoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9JZTIodCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdmFsdWU6IGUsXG4gICAgICAgICAgZm9udFNpemU6IG4sXG4gICAgICAgICAgY29sb3I6IGksXG4gICAgICAgICAgcmVjdDogcixcbiAgICAgICAgICBwYWdlSW5kZXg6IHNcbiAgICAgICAgfSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQ2UpO1xuICAgICAgICByZXR1cm4gdC52YWx1ZSAhPT0gZSB8fCB0LmZvbnRTaXplICE9PSBuIHx8IHQucmVjdC5zb21lKCh0LCBlKSA9PiBNYXRoLmFicyh0IC0gcltlXSkgPj0gMSkgfHwgdC5jb2xvci5zb21lKCh0LCBlKSA9PiB0ICE9PSBpW2VdKSB8fCB0LnBhZ2VJbmRleCAhPT0gcztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9NZTIoKSB7XG4gICAgICAgIGxldCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAoIXRoaXMuYW5ub3RhdGlvbkVsZW1lbnRJZCkgcmV0dXJuO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9rZSwgX2tlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKCF0ICYmICgwID09PSB0aGlzLndpZHRoIHx8IDAgPT09IHRoaXMuaGVpZ2h0KSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTWUsIF9NZTIpLmNhbGwodGhpcywgITApLCAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IF9jbGFzczMwLl9pbnRlcm5hbFBhZGRpbmcgKiB0aGlzLnBhcmVudFNjYWxlO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0NlKS5yZWN0ID0gdGhpcy5nZXRSZWN0KGUsIGUpO1xuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KEZyZWVUZXh0RWRpdG9yLCBcIl9mcmVlVGV4dERlZmF1bHRDb250ZW50XCIsIFwiXCIpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KEZyZWVUZXh0RWRpdG9yLCBcIl9sMTBuUHJvbWlzZVwiLCB2b2lkIDApO1xuICAgICAgX2RlZmluZVByb3BlcnR5KEZyZWVUZXh0RWRpdG9yLCBcIl9pbnRlcm5hbFBhZGRpbmdcIiwgMCk7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoRnJlZVRleHRFZGl0b3IsIFwiX2RlZmF1bHRDb2xvclwiLCBudWxsKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShGcmVlVGV4dEVkaXRvciwgXCJfZGVmYXVsdEZvbnRTaXplXCIsIDEwKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShGcmVlVGV4dEVkaXRvciwgXCJfdHlwZVwiLCBcImZyZWV0ZXh0XCIpO1xuICAgICAgZS5GcmVlVGV4dEVkaXRvciA9IEZyZWVUZXh0RWRpdG9yO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9yZTIsIF9hbiwgX29uLCBfbG4sIF9jbjtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5TdGFtcEFubm90YXRpb25FbGVtZW50ID0gZS5JbmtBbm5vdGF0aW9uRWxlbWVudCA9IGUuRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCA9IGUuQW5ub3RhdGlvbkxheWVyID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICBuKDEyNSk7XG4gICAgICBuKDEzNSk7XG4gICAgICBuKDEzNyk7XG4gICAgICBuKDE0MCk7XG4gICAgICBuKDE0Mik7XG4gICAgICBuKDE0NCk7XG4gICAgICBuKDE0Nik7XG4gICAgICB2YXIgaSA9IG4oMSksXG4gICAgICAgIHIgPSBuKDE2NyksXG4gICAgICAgIHMgPSBuKDE2MiksXG4gICAgICAgIGEgPSBuKDE5OCksXG4gICAgICAgIG8gPSBuKDE5OSksXG4gICAgICAgIGwgPSBuKDIwMCk7XG4gICAgICBjb25zdCBjID0gMWUzLFxuICAgICAgICBoID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgIGZ1bmN0aW9uIGdldFJlY3REaW1zKHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3aWR0aDogdFsyXSAtIHRbMF0sXG4gICAgICAgICAgaGVpZ2h0OiB0WzNdIC0gdFsxXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5IHtcbiAgICAgICAgc3RhdGljIGNyZWF0ZSh0KSB7XG4gICAgICAgICAgc3dpdGNoICh0LmRhdGEuYW5ub3RhdGlvblR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5MSU5LOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5URVhUOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5XSURHRVQ6XG4gICAgICAgICAgICAgIHN3aXRjaCAodC5kYXRhLmZpZWxkVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJUeFwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkJ0blwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGF0YS5yYWRpb0J1dHRvbiA/IG5ldyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHQpIDogdC5kYXRhLmNoZWNrQm94ID8gbmV3IENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCkgOiBuZXcgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDaFwiOlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiU2lnXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZVdpZGdldEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuUE9QVVA6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLkxJTkU6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLlNRVUFSRTpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5DSVJDTEU6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5DQVJFVDpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXJldEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLklOSzpcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmtBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5QT0xZR09OOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uVHlwZS5ISUdITElHSFQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuZGVybGluZUFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLlNRVUlHR0xZOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50KHQpO1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25UeXBlLlNUQU1QOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCh0KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkVsZW1lbnQodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX0RlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICBjbGFzcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfRGUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogZSA9ICExLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiBuID0gITEsXG4gICAgICAgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogaSA9ICExXG4gICAgICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICAgICAgdGhpcy5pc1JlbmRlcmFibGUgPSBlO1xuICAgICAgICAgIHRoaXMuZGF0YSA9IHQuZGF0YTtcbiAgICAgICAgICB0aGlzLmxheWVyID0gdC5sYXllcjtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlID0gdC5saW5rU2VydmljZTtcbiAgICAgICAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IHQuZG93bmxvYWRNYW5hZ2VyO1xuICAgICAgICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gdC5pbWFnZVJlc291cmNlc1BhdGg7XG4gICAgICAgICAgdGhpcy5yZW5kZXJGb3JtcyA9IHQucmVuZGVyRm9ybXM7XG4gICAgICAgICAgdGhpcy5zdmdGYWN0b3J5ID0gdC5zdmdGYWN0b3J5O1xuICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSB0LmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgICAgIHRoaXMuZW5hYmxlU2NyaXB0aW5nID0gdC5lbmFibGVTY3JpcHRpbmc7XG4gICAgICAgICAgdGhpcy5oYXNKU0FjdGlvbnMgPSB0Lmhhc0pTQWN0aW9ucztcbiAgICAgICAgICB0aGlzLl9maWVsZE9iamVjdHMgPSB0LmZpZWxkT2JqZWN0cztcbiAgICAgICAgICB0aGlzLnBhcmVudCA9IHQucGFyZW50O1xuICAgICAgICAgIGUgJiYgKHRoaXMuY29udGFpbmVyID0gdGhpcy5fY3JlYXRlQ29udGFpbmVyKG4pKTtcbiAgICAgICAgICBpICYmIHRoaXMuX2NyZWF0ZVF1YWRyaWxhdGVyYWxzKCk7XG4gICAgICAgIH1cbiAgICAgICAgX2NyZWF0ZUNvbnRhaW5lcih0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBkYXRhOiBlLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICBwYWdlOiBuLFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0OiByXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gPSB0aGlzLFxuICAgICAgICAgICAgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiZGF0YS1hbm5vdGF0aW9uLWlkXCIsIGUuaWQpO1xuICAgICAgICAgIHMuc3R5bGUuekluZGV4ID0gdGhpcy5wYXJlbnQuekluZGV4Kys7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmICYmIHMuc2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiLCBcImRpYWxvZ1wiKTtcbiAgICAgICAgICBlLm5vUm90YXRlICYmIHMuY2xhc3NMaXN0LmFkZChcIm5vcm90YXRlXCIpO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhZ2VXaWR0aDogYSxcbiAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IG8sXG4gICAgICAgICAgICBwYWdlWDogbCxcbiAgICAgICAgICAgIHBhZ2VZOiBjXG4gICAgICAgICAgfSA9IHIucmF3RGltcztcbiAgICAgICAgICBpZiAoIWUucmVjdCB8fCB0aGlzIGluc3RhbmNlb2YgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICByb3RhdGlvbjogdFxuICAgICAgICAgICAgfSA9IGU7XG4gICAgICAgICAgICBlLmhhc093bkNhbnZhcyB8fCAwID09PSB0IHx8IHRoaXMuc2V0Um90YXRpb24odCwgcyk7XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICB3aWR0aDogaCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBkXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXMoZS5yZWN0KSxcbiAgICAgICAgICAgIHUgPSBpLlV0aWwubm9ybWFsaXplUmVjdChbZS5yZWN0WzBdLCBuLnZpZXdbM10gLSBlLnJlY3RbMV0gKyBuLnZpZXdbMV0sIGUucmVjdFsyXSwgbi52aWV3WzNdIC0gZS5yZWN0WzNdICsgbi52aWV3WzFdXSk7XG4gICAgICAgICAgaWYgKCF0ICYmIGUuYm9yZGVyU3R5bGUud2lkdGggPiAwKSB7XG4gICAgICAgICAgICBzLnN0eWxlLmJvcmRlcldpZHRoID0gXCJcIi5jb25jYXQoZS5ib3JkZXJTdHlsZS53aWR0aCwgXCJweFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBlLmJvcmRlclN0eWxlLmhvcml6b250YWxDb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICAgIG4gPSBlLmJvcmRlclN0eWxlLnZlcnRpY2FsQ29ybmVyUmFkaXVzO1xuICAgICAgICAgICAgaWYgKHQgPiAwIHx8IG4gPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBcImNhbGMoXCIuY29uY2F0KHQsIFwicHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoXCIpLmNvbmNhdChuLCBcInB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlcIik7XG4gICAgICAgICAgICAgIHMuc3R5bGUuYm9yZGVyUmFkaXVzID0gZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcyBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IFwiY2FsYyhcIi5jb25jYXQoaCwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikpIC8gY2FsYyhcIikuY29uY2F0KGQsIFwicHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKVwiKTtcbiAgICAgICAgICAgICAgcy5zdHlsZS5ib3JkZXJSYWRpdXMgPSB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChlLmJvcmRlclN0eWxlLnN0eWxlKSB7XG4gICAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOlxuICAgICAgICAgICAgICAgIHMuc3R5bGUuYm9yZGVyU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDpcbiAgICAgICAgICAgICAgICBzLnN0eWxlLmJvcmRlclN0eWxlID0gXCJkYXNoZWRcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuQkVWRUxFRDpcbiAgICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBiZXZlbGVkXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDpcbiAgICAgICAgICAgICAgICAoMCwgaS53YXJuKShcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBpbnNldFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOlxuICAgICAgICAgICAgICAgIHMuc3R5bGUuYm9yZGVyQm90dG9tU3R5bGUgPSBcInNvbGlkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByID0gZS5ib3JkZXJDb2xvciB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9EZSwgITApO1xuICAgICAgICAgICAgICBzLnN0eWxlLmJvcmRlckNvbG9yID0gaS5VdGlsLm1ha2VIZXhDb2xvcigwIHwgclswXSwgMCB8IHJbMV0sIDAgfCByWzJdKTtcbiAgICAgICAgICAgIH0gZWxzZSBzLnN0eWxlLmJvcmRlcldpZHRoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcy5zdHlsZS5sZWZ0ID0gMTAwICogKHVbMF0gLSBsKSAvIGEgKyBcIiVcIjtcbiAgICAgICAgICBzLnN0eWxlLnRvcCA9IDEwMCAqICh1WzFdIC0gYykgLyBvICsgXCIlXCI7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcm90YXRpb246IHBcbiAgICAgICAgICB9ID0gZTtcbiAgICAgICAgICBpZiAoZS5oYXNPd25DYW52YXMgfHwgMCA9PT0gcCkge1xuICAgICAgICAgICAgcy5zdHlsZS53aWR0aCA9IDEwMCAqIGggLyBhICsgXCIlXCI7XG4gICAgICAgICAgICBzLnN0eWxlLmhlaWdodCA9IDEwMCAqIGQgLyBvICsgXCIlXCI7XG4gICAgICAgICAgfSBlbHNlIHRoaXMuc2V0Um90YXRpb24ocCwgcyk7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Um90YXRpb24odCkge1xuICAgICAgICAgIGxldCBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YS5yZWN0KSByZXR1cm47XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBwYWdlV2lkdGg6IG4sXG4gICAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IGlcbiAgICAgICAgICAgIH0gPSB0aGlzLnBhcmVudC52aWV3cG9ydC5yYXdEaW1zLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3aWR0aDogcixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBzXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXModGhpcy5kYXRhLnJlY3QpO1xuICAgICAgICAgIGxldCBhLCBvO1xuICAgICAgICAgIGlmICh0ICUgMTgwID09IDApIHtcbiAgICAgICAgICAgIGEgPSAxMDAgKiByIC8gbjtcbiAgICAgICAgICAgIG8gPSAxMDAgKiBzIC8gaTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYSA9IDEwMCAqIHMgLyBuO1xuICAgICAgICAgICAgbyA9IDEwMCAqIHIgLyBpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlLnN0eWxlLndpZHRoID0gXCJcIi5jb25jYXQoYSwgXCIlXCIpO1xuICAgICAgICAgIGUuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQobywgXCIlXCIpO1xuICAgICAgICAgIGUuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsICgzNjAgLSB0KSAlIDM2MCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IF9jb21tb25BY3Rpb25zKCkge1xuICAgICAgICAgIGNvbnN0IHNldENvbG9yID0gKHQsIGUsIG4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBuLmRldGFpbFt0XTtcbiAgICAgICAgICAgIG4udGFyZ2V0LnN0eWxlW2VdID0gYS5Db2xvckNvbnZlcnRlcnNbXCJcIi5jb25jYXQoaVswXSwgXCJfSFRNTFwiKV0oaS5zbGljZSgxKSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gKDAsIGkuc2hhZG93KSh0aGlzLCBcIl9jb21tb25BY3Rpb25zXCIsIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBlID0gdC5kZXRhaWwuZGlzcGxheSAlIDIgPT0gMTtcbiAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IGUgPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCI7XG4gICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiBlLFxuICAgICAgICAgICAgICAgIHByaW50OiAwID09PSB0LmRldGFpbC5kaXNwbGF5IHx8IDMgPT09IHQuZGV0YWlsLmRpc3BsYXlcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJpbnQ6IHQgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgICAgICAgIHByaW50OiB0LmRldGFpbC5wcmludFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoaWRkZW46IHQgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gdC5kZXRhaWwuaGlkZGVuID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiO1xuICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdC5kZXRhaWwuaGlkZGVuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzOiB0ID0+IHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0LnRhcmdldC5mb2N1cyh7XG4gICAgICAgICAgICAgICAgcHJldmVudFNjcm9sbDogITFcbiAgICAgICAgICAgICAgfSksIDApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVzZXJOYW1lOiB0ID0+IHtcbiAgICAgICAgICAgICAgdC50YXJnZXQudGl0bGUgPSB0LmRldGFpbC51c2VyTmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkb25seTogdCA9PiB7XG4gICAgICAgICAgICAgIHQuZGV0YWlsLnJlYWRvbmx5ID8gdC50YXJnZXQuc2V0QXR0cmlidXRlKFwicmVhZG9ubHlcIiwgXCJcIikgOiB0LnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJyZWFkb25seVwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1aXJlZDogdCA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX3NldFJlcXVpcmVkKHQudGFyZ2V0LCB0LmRldGFpbC5yZXF1aXJlZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmdDb2xvcjogdCA9PiB7XG4gICAgICAgICAgICAgIHNldENvbG9yKFwiYmdDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWxsQ29sb3I6IHQgPT4ge1xuICAgICAgICAgICAgICBzZXRDb2xvcihcImZpbGxDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmZ0NvbG9yOiB0ID0+IHtcbiAgICAgICAgICAgICAgc2V0Q29sb3IoXCJmZ0NvbG9yXCIsIFwiY29sb3JcIiwgdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGV4dENvbG9yOiB0ID0+IHtcbiAgICAgICAgICAgICAgc2V0Q29sb3IoXCJ0ZXh0Q29sb3JcIiwgXCJjb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdCA9PiB7XG4gICAgICAgICAgICAgIHNldENvbG9yKFwiYm9yZGVyQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHJva2VDb2xvcjogdCA9PiB7XG4gICAgICAgICAgICAgIHNldENvbG9yKFwic3Ryb2tlQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCB0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb3RhdGlvbjogdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmRldGFpbC5yb3RhdGlvbjtcbiAgICAgICAgICAgICAgdGhpcy5zZXRSb3RhdGlvbihlKTtcbiAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcbiAgICAgICAgICAgICAgICByb3RhdGlvbjogZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHQsIGUpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5fY29tbW9uQWN0aW9ucztcbiAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZS5kZXRhaWwpKSB7XG4gICAgICAgICAgICBjb25zdCByID0gdFtpXSB8fCBuW2ldO1xuICAgICAgICAgICAgciA9PT0gbnVsbCB8fCByID09PSB2b2lkIDAgPyB2b2lkIDAgOiByKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlModCkge1xuICAgICAgICAgIGlmICghdGhpcy5lbmFibGVTY3JpcHRpbmcpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5nZXRSYXdWYWx1ZSh0aGlzLmRhdGEuaWQpO1xuICAgICAgICAgIGlmICghZSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9jb21tb25BY3Rpb25zO1xuICAgICAgICAgIGZvciAoY29uc3QgW2ksIHJdIG9mIE9iamVjdC5lbnRyaWVzKGUpKSB7XG4gICAgICAgICAgICBjb25zdCBzID0gbltpXTtcbiAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgIHMoe1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgW2ldOiByXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfY3JlYXRlUXVhZHJpbGF0ZXJhbHMoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHF1YWRQb2ludHM6IHRcbiAgICAgICAgICB9ID0gdGhpcy5kYXRhO1xuICAgICAgICAgIGlmICghdCkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IFtlLCBuLCBpLCByXSA9IHRoaXMuZGF0YS5yZWN0O1xuICAgICAgICAgIGlmICgxID09PSB0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgWywge1xuICAgICAgICAgICAgICB4OiBzLFxuICAgICAgICAgICAgICB5OiBhXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIHg6IG8sXG4gICAgICAgICAgICAgIHk6IGxcbiAgICAgICAgICAgIH1dID0gdFswXTtcbiAgICAgICAgICAgIGlmIChpID09PSBzICYmIHIgPT09IGEgJiYgZSA9PT0gbyAmJiBuID09PSBsKSByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHN0eWxlOiBzXG4gICAgICAgICAgfSA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgICAgIGxldCBhO1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0RlKSkge1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBib3JkZXJDb2xvcjogdCxcbiAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IGVcbiAgICAgICAgICAgIH0gPSBzO1xuICAgICAgICAgICAgcy5ib3JkZXJXaWR0aCA9IDA7XG4gICAgICAgICAgICBhID0gW1widXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCxcIiwgJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiJywgJyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMSAxXCI+JywgXCI8ZyBmaWxsPVxcXCJ0cmFuc3BhcmVudFxcXCIgc3Ryb2tlPVxcXCJcIi5jb25jYXQodCwgXCJcXFwiIHN0cm9rZS13aWR0aD1cXFwiXCIpLmNvbmNhdChlLCBcIlxcXCI+XCIpXTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoYXNCb3JkZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSBpIC0gZSxcbiAgICAgICAgICAgIGwgPSByIC0gbixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3ZnRmFjdG9yeTogY1xuICAgICAgICAgICAgfSA9IHRoaXMsXG4gICAgICAgICAgICBoID0gYy5jcmVhdGVFbGVtZW50KFwic3ZnXCIpO1xuICAgICAgICAgIGguY2xhc3NMaXN0LmFkZChcInF1YWRyaWxhdGVyYWxzQ29udGFpbmVyXCIpO1xuICAgICAgICAgIGguc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgMCk7XG4gICAgICAgICAgaC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgMCk7XG4gICAgICAgICAgY29uc3QgZCA9IGMuY3JlYXRlRWxlbWVudChcImRlZnNcIik7XG4gICAgICAgICAgaC5hcHBlbmQoZCk7XG4gICAgICAgICAgY29uc3QgdSA9IGMuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIpLFxuICAgICAgICAgICAgcCA9IFwiY2xpcHBhdGhfXCIuY29uY2F0KHRoaXMuZGF0YS5pZCk7XG4gICAgICAgICAgdS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBwKTtcbiAgICAgICAgICB1LnNldEF0dHJpYnV0ZShcImNsaXBQYXRoVW5pdHNcIiwgXCJvYmplY3RCb3VuZGluZ0JveFwiKTtcbiAgICAgICAgICBkLmFwcGVuZCh1KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFssIHtcbiAgICAgICAgICAgIHg6IG4sXG4gICAgICAgICAgICB5OiBpXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogcyxcbiAgICAgICAgICAgIHk6IGhcbiAgICAgICAgICB9XSBvZiB0KSB7XG4gICAgICAgICAgICB2YXIgX2EzO1xuICAgICAgICAgICAgY29uc3QgdCA9IGMuY3JlYXRlRWxlbWVudChcInJlY3RcIiksXG4gICAgICAgICAgICAgIGQgPSAocyAtIGUpIC8gbyxcbiAgICAgICAgICAgICAgcCA9IChyIC0gaSkgLyBsLFxuICAgICAgICAgICAgICBmID0gKG4gLSBzKSAvIG8sXG4gICAgICAgICAgICAgIGcgPSAoaSAtIGgpIC8gbDtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwieFwiLCBkKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwieVwiLCBwKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgZik7XG4gICAgICAgICAgICB0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBnKTtcbiAgICAgICAgICAgIHUuYXBwZW5kKHQpO1xuICAgICAgICAgICAgKF9hMyA9IGEpID09PSBudWxsIHx8IF9hMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EzLnB1c2goXCI8cmVjdCB2ZWN0b3ItZWZmZWN0PVxcXCJub24tc2NhbGluZy1zdHJva2VcXFwiIHg9XFxcIlwiLmNvbmNhdChkLCBcIlxcXCIgeT1cXFwiXCIpLmNvbmNhdChwLCBcIlxcXCIgd2lkdGg9XFxcIlwiKS5jb25jYXQoZiwgXCJcXFwiIGhlaWdodD1cXFwiXCIpLmNvbmNhdChnLCBcIlxcXCIvPlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0RlKSkge1xuICAgICAgICAgICAgYS5wdXNoKFwiPC9nPjwvc3ZnPicpXCIpO1xuICAgICAgICAgICAgcy5iYWNrZ3JvdW5kSW1hZ2UgPSBhLmpvaW4oXCJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChoKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5jbGlwUGF0aCA9IFwidXJsKCNcIi5jb25jYXQocCwgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIF9jcmVhdGVQb3B1cCgpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250YWluZXI6IHQsXG4gICAgICAgICAgICBkYXRhOiBlXG4gICAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIsIFwiZGlhbG9nXCIpO1xuICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiBlLmNvbG9yLFxuICAgICAgICAgICAgICB0aXRsZU9iajogZS50aXRsZU9iaixcbiAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogZS5tb2RpZmljYXRpb25EYXRlLFxuICAgICAgICAgICAgICBjb250ZW50c09iajogZS5jb250ZW50c09iaixcbiAgICAgICAgICAgICAgcmljaFRleHQ6IGUucmljaFRleHQsXG4gICAgICAgICAgICAgIHBhcmVudFJlY3Q6IGUucmVjdCxcbiAgICAgICAgICAgICAgYm9yZGVyU3R5bGU6IDAsXG4gICAgICAgICAgICAgIGlkOiBcInBvcHVwX1wiLmNvbmNhdChlLmlkKSxcbiAgICAgICAgICAgICAgcm90YXRpb246IGUucm90YXRpb25cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgICAgICAgZWxlbWVudHM6IFt0aGlzXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucGFyZW50LmRpdi5hcHBlbmQobi5yZW5kZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgICgwLCBpLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgX2dldEVsZW1lbnRzQnlOYW1lKHQpIHtcbiAgICAgICAgICBsZXQgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBuID0gW107XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkT2JqZWN0cykge1xuICAgICAgICAgICAgY29uc3QgciA9IHRoaXMuX2ZpZWxkT2JqZWN0c1t0XTtcbiAgICAgICAgICAgIGlmIChyKSBmb3IgKGNvbnN0IHtcbiAgICAgICAgICAgICAgcGFnZTogdCxcbiAgICAgICAgICAgICAgaWQ6IHMsXG4gICAgICAgICAgICAgIGV4cG9ydFZhbHVlczogYVxuICAgICAgICAgICAgfSBvZiByKSB7XG4gICAgICAgICAgICAgIGlmICgtMSA9PT0gdCkgY29udGludWU7XG4gICAgICAgICAgICAgIGlmIChzID09PSBlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgciA9IFwic3RyaW5nXCIgPT0gdHlwZW9mIGEgPyBhIDogbnVsbCxcbiAgICAgICAgICAgICAgICBvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltkYXRhLWVsZW1lbnQtaWQ9XFxcIlwiLmNvbmNhdChzLCBcIlxcXCJdXCIpKTtcbiAgICAgICAgICAgICAgIW8gfHwgaC5oYXMobykgPyBuLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBzLFxuICAgICAgICAgICAgICAgIGV4cG9ydFZhbHVlOiByLFxuICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQ6IG9cbiAgICAgICAgICAgICAgfSkgOiAoMCwgaS53YXJuKShcIl9nZXRFbGVtZW50c0J5TmFtZSAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6IFwiLmNvbmNhdChzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBpIG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKHQpKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZXhwb3J0VmFsdWU6IHRcbiAgICAgICAgICAgICAgfSA9IGksXG4gICAgICAgICAgICAgIHIgPSBpLmdldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiKTtcbiAgICAgICAgICAgIHIgIT09IGUgJiYgaC5oYXMoaSkgJiYgbi5wdXNoKHtcbiAgICAgICAgICAgICAgaWQ6IHIsXG4gICAgICAgICAgICAgIGV4cG9ydFZhbHVlOiB0LFxuICAgICAgICAgICAgICBkb21FbGVtZW50OiBpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgc2hvdygpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkcG9wdXA7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIgJiYgKHRoaXMuY29udGFpbmVyLmhpZGRlbiA9ICExKTtcbiAgICAgICAgICAoX3RoaXMkcG9wdXAgPSB0aGlzLnBvcHVwKSA9PT0gbnVsbCB8fCBfdGhpcyRwb3B1cCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXAubWF5YmVTaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgaGlkZSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkcG9wdXAyO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyICYmICh0aGlzLmNvbnRhaW5lci5oaWRkZW4gPSAhMCk7XG4gICAgICAgICAgKF90aGlzJHBvcHVwMiA9IHRoaXMucG9wdXApID09PSBudWxsIHx8IF90aGlzJHBvcHVwMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkcG9wdXAyLmZvcmNlSGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKSBmb3IgKGNvbnN0IGUgb2YgdCkgZS5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtlbHNlIHQuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgICAgX2VkaXRPbkRvdWJsZUNsaWNrKCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGFubm90YXRpb25FZGl0b3JUeXBlOiB0LFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBpZDogZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlO1xuICAgICAgICAgICAgKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZSA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlLmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcm1vZGVcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIG1vZGU6IHQsXG4gICAgICAgICAgICAgIGVkaXRJZDogZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfTGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfT2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIExpbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoX3QxNSkge1xuICAgICAgICAgIGxldCBfZTEzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgIHN1cGVyKF90MTUsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogITAsXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEhKF9lMTMgIT09IG51bGwgJiYgX2UxMyAhPT0gdm9pZCAwICYmIF9lMTMuaWdub3JlQm9yZGVyKSxcbiAgICAgICAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfT2UpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfTGUpO1xuICAgICAgICAgIHRoaXMuaXNUb29sdGlwT25seSA9IF90MTUuZGF0YS5pc1Rvb2x0aXBPbmx5O1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGRhdGE6IHQsXG4gICAgICAgICAgICAgIGxpbmtTZXJ2aWNlOiBlXG4gICAgICAgICAgICB9ID0gdGhpcyxcbiAgICAgICAgICAgIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICBuLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCB0LmlkKTtcbiAgICAgICAgICBsZXQgaSA9ICExO1xuICAgICAgICAgIGlmICh0LnVybCkge1xuICAgICAgICAgICAgZS5hZGRMaW5rQXR0cmlidXRlcyhuLCB0LnVybCwgdC5uZXdXaW5kb3cpO1xuICAgICAgICAgICAgaSA9ICEwO1xuICAgICAgICAgIH0gZWxzZSBpZiAodC5hY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2JpbmROYW1lZEFjdGlvbihuLCB0LmFjdGlvbik7XG4gICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgfSBlbHNlIGlmICh0LmF0dGFjaG1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2JpbmRBdHRhY2htZW50KG4sIHQuYXR0YWNobWVudCk7XG4gICAgICAgICAgICBpID0gITA7XG4gICAgICAgICAgfSBlbHNlIGlmICh0LnNldE9DR1N0YXRlKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9PZSwgX09lMikuY2FsbCh0aGlzLCBuLCB0LnNldE9DR1N0YXRlKTtcbiAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHQuZGVzdCkge1xuICAgICAgICAgICAgdGhpcy5fYmluZExpbmsobiwgdC5kZXN0KTtcbiAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHQuYWN0aW9ucyAmJiAodC5hY3Rpb25zLkFjdGlvbiB8fCB0LmFjdGlvbnNbXCJNb3VzZSBVcFwiXSB8fCB0LmFjdGlvbnNbXCJNb3VzZSBEb3duXCJdKSAmJiB0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICAgICAgICB0aGlzLl9iaW5kSlNBY3Rpb24obiwgdCk7XG4gICAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0LnJlc2V0Rm9ybSkge1xuICAgICAgICAgICAgICB0aGlzLl9iaW5kUmVzZXRGb3JtQWN0aW9uKG4sIHQucmVzZXRGb3JtKTtcbiAgICAgICAgICAgICAgaSA9ICEwO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVG9vbHRpcE9ubHkgJiYgIWkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fYmluZExpbmsobiwgXCJcIik7XG4gICAgICAgICAgICAgIGkgPSAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImxpbmtBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGkgJiYgdGhpcy5jb250YWluZXIuYXBwZW5kKG4pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBfYmluZExpbmsodCwgZSkge1xuICAgICAgICAgIHQuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0RGVzdGluYXRpb25IYXNoKGUpO1xuICAgICAgICAgIHQub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGUgJiYgdGhpcy5saW5rU2VydmljZS5nb1RvRGVzdGluYXRpb24oZSk7XG4gICAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgICAgfTtcbiAgICAgICAgICAoZSB8fCBcIlwiID09PSBlKSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MZSwgX0xlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBfYmluZE5hbWVkQWN0aW9uKHQsIGUpIHtcbiAgICAgICAgICB0LmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcbiAgICAgICAgICB0Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVOYW1lZEFjdGlvbihlKTtcbiAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0xlLCBfTGUyKS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIF9iaW5kQXR0YWNobWVudCh0LCBlKSB7XG4gICAgICAgICAgdC5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgICAgICAgdC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF90aGlzJGRvd25sb2FkTWFuYWdlcjtcbiAgICAgICAgICAgIChfdGhpcyRkb3dubG9hZE1hbmFnZXIgPSB0aGlzLmRvd25sb2FkTWFuYWdlcikgPT09IG51bGwgfHwgX3RoaXMkZG93bmxvYWRNYW5hZ2VyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkb3dubG9hZE1hbmFnZXIub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGFpbmVyLCBlLmNvbnRlbnQsIGUuZmlsZW5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH07XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTGUsIF9MZTIpLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX2JpbmRKU0FjdGlvbih0LCBlKSB7XG4gICAgICAgICAgdC5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG4gICAgICAgICAgY29uc3QgbiA9IG5ldyBNYXAoW1tcIkFjdGlvblwiLCBcIm9uY2xpY2tcIl0sIFtcIk1vdXNlIFVwXCIsIFwib25tb3VzZXVwXCJdLCBbXCJNb3VzZSBEb3duXCIsIFwib25tb3VzZWRvd25cIl1dKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZS5hY3Rpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgciA9IG4uZ2V0KGkpO1xuICAgICAgICAgICAgciAmJiAodFtyXSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTI7XG4gICAgICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmUyID0gdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cykgPT09IG51bGwgfHwgX3RoaXMkbGlua1NlcnZpY2UkZXZlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlMi5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgIGlkOiBlLmlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogaVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0Lm9uY2xpY2sgfHwgKHQub25jbGljayA9ICgpID0+ICExKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MZSwgX0xlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBfYmluZFJlc2V0Rm9ybUFjdGlvbih0LCBlKSB7XG4gICAgICAgICAgY29uc3QgbiA9IHQub25jbGljaztcbiAgICAgICAgICBuIHx8ICh0LmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTGUsIF9MZTIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgaWYgKHRoaXMuX2ZpZWxkT2JqZWN0cykgdC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTM7XG4gICAgICAgICAgICBuID09PSBudWxsIHx8IG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG4oKTtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHQsXG4gICAgICAgICAgICAgICAgcmVmczogcixcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBzXG4gICAgICAgICAgICAgIH0gPSBlLFxuICAgICAgICAgICAgICBhID0gW107XG4gICAgICAgICAgICBpZiAoMCAhPT0gdC5sZW5ndGggfHwgMCAhPT0gci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBTZXQocik7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuX2ZpZWxkT2JqZWN0c1tuXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIGlkOiBuXG4gICAgICAgICAgICAgICAgfSBvZiB0KSBlLmFkZChuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9maWVsZE9iamVjdHMpKSBmb3IgKGNvbnN0IG4gb2YgdCkgZS5oYXMobi5pZCkgPT09IHMgJiYgYS5wdXNoKG4pO1xuICAgICAgICAgICAgfSBlbHNlIGZvciAoY29uc3QgdCBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkT2JqZWN0cykpIGEucHVzaCguLi50KTtcbiAgICAgICAgICAgIGNvbnN0IG8gPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgICBsID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgYSkge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgaWQ6IGVcbiAgICAgICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgICAgIGwucHVzaChlKTtcbiAgICAgICAgICAgICAgc3dpdGNoICh0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5kZWZhdWx0VmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgby5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyYWRpb2J1dHRvblwiOlxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdC5kZWZhdWx0VmFsdWUgPT09IHQuZXhwb3J0VmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBvLnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbWJvYm94XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImxpc3Rib3hcIjpcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHQuZGVmYXVsdFZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIG8uc2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS1lbGVtZW50LWlkPVxcXCJcIi5jb25jYXQoZSwgXCJcXFwiXVwiKSk7XG4gICAgICAgICAgICAgIG4gJiYgKGguaGFzKG4pID8gbi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInJlc2V0Zm9ybVwiKSkgOiAoMCwgaS53YXJuKShcIl9iaW5kUmVzZXRGb3JtQWN0aW9uIC0gZWxlbWVudCBub3QgYWxsb3dlZDogXCIuY29uY2F0KGUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiAoKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTMgPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmUzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmUzLmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgaWQ6IFwiYXBwXCIsXG4gICAgICAgICAgICAgICAgaWRzOiBsLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiUmVzZXRGb3JtXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICAgIH07ZWxzZSB7XG4gICAgICAgICAgICAoMCwgaS53YXJuKSgnX2JpbmRSZXNldEZvcm1BY3Rpb24gLSBcInJlc2V0Rm9ybVwiIGFjdGlvbiBub3Qgc3VwcG9ydGVkLCBlbnN1cmUgdGhhdCB0aGUgYGZpZWxkT2JqZWN0c2AgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLicpO1xuICAgICAgICAgICAgbiB8fCAodC5vbmNsaWNrID0gKCkgPT4gITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0xlMigpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1pbnRlcm5hbC1saW5rXCIsIFwiXCIpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX09lMih0LCBlKSB7XG4gICAgICAgIHQuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgICAgICB0Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5leGVjdXRlU2V0T0NHU3RhdGUoZSk7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9O1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MZSwgX0xlMikuY2FsbCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIGNsYXNzIFRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqLCBfdCRkYXRhJGNvbnRlbnRzT2JqLCBfdCRkYXRhJHJpY2hUZXh0O1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iai5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmogPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmogIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqLnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dCA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dCAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQuc3RyKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dEFubm90YXRpb25cIik7XG4gICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICAgdC5zcmMgPSB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCArIFwiYW5ub3RhdGlvbi1cIiArIHRoaXMuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgKyBcIi5zdmdcIjtcbiAgICAgICAgICB0LmFsdCA9IFwiW3t7dHlwZX19IEFubm90YXRpb25dXCI7XG4gICAgICAgICAgdC5kYXRhc2V0LmwxMG5JZCA9IFwidGV4dF9hbm5vdGF0aW9uX3R5cGVcIjtcbiAgICAgICAgICB0LmRhdGFzZXQubDEwbkFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLmRhdGEubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZCh0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dCAmJiAodGhpcy5jb250YWluZXIudGl0bGUgPSB0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgc2hvd0VsZW1lbnRBbmRIaWRlQ2FudmFzKHQpIHtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuICAgICAgICAgICAgdmFyIF90JHByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIFwiQ0FOVkFTXCIgPT09ICgoX3QkcHJldmlvdXNTaWJsaW5nID0gdC5wcmV2aW91c1NpYmxpbmcpID09PSBudWxsIHx8IF90JHByZXZpb3VzU2libGluZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3QkcHJldmlvdXNTaWJsaW5nLm5vZGVOYW1lKSAmJiAodC5wcmV2aW91c1NpYmxpbmcuaGlkZGVuID0gITApO1xuICAgICAgICAgICAgdC5oaWRkZW4gPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2dldEtleU1vZGlmaWVyKHQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpc1dpbjogZSxcbiAgICAgICAgICAgIGlzTWFjOiBuXG4gICAgICAgICAgfSA9IGkuRmVhdHVyZVRlc3QucGxhdGZvcm07XG4gICAgICAgICAgcmV0dXJuIGUgJiYgdC5jdHJsS2V5IHx8IG4gJiYgdC5tZXRhS2V5O1xuICAgICAgICB9XG4gICAgICAgIF9zZXRFdmVudExpc3RlbmVyKHQsIGUsIG4sIGkpIHtcbiAgICAgICAgICBlLmluY2x1ZGVzKFwibW91c2VcIikgPyB0LmFkZEV2ZW50TGlzdGVuZXIoZSwgdCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlNDtcbiAgICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmU0ID0gdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cykgPT09IG51bGwgfHwgX3RoaXMkbGlua1NlcnZpY2UkZXZlNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlNC5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogaSh0KSxcbiAgICAgICAgICAgICAgICBzaGlmdDogdC5zaGlmdEtleSxcbiAgICAgICAgICAgICAgICBtb2RpZmllcjogdGhpcy5fZ2V0S2V5TW9kaWZpZXIodClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkgOiB0LmFkZEV2ZW50TGlzdGVuZXIoZSwgdCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlNTtcbiAgICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmU1ID0gdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cykgPT09IG51bGwgfHwgX3RoaXMkbGlua1NlcnZpY2UkZXZlNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlNS5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogaSh0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0RXZlbnRMaXN0ZW5lcnModCwgZSwgbikge1xuICAgICAgICAgIGZvciAoY29uc3QgW2ksIHJdIG9mIGUpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyRkYXRhJGFjdGlvbnM7XG4gICAgICAgICAgICAoXCJBY3Rpb25cIiA9PT0gciB8fCAoKF90aGlzJGRhdGEkYWN0aW9ucyA9IHRoaXMuZGF0YS5hY3Rpb25zKSA9PT0gbnVsbCB8fCBfdGhpcyRkYXRhJGFjdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRhdGEkYWN0aW9uc1tyXSkpICYmIHRoaXMuX3NldEV2ZW50TGlzdGVuZXIodCwgaSwgciwgbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9zZXRCYWNrZ3JvdW5kQ29sb3IodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yIHx8IG51bGw7XG4gICAgICAgICAgdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBudWxsID09PSBlID8gXCJ0cmFuc3BhcmVudFwiIDogaS5VdGlsLm1ha2VIZXhDb2xvcihlWzBdLCBlWzFdLCBlWzJdKTtcbiAgICAgICAgfVxuICAgICAgICBfc2V0VGV4dFN0eWxlKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gW1wibGVmdFwiLCBcImNlbnRlclwiLCBcInJpZ2h0XCJdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmb250Q29sb3I6IG5cbiAgICAgICAgICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLFxuICAgICAgICAgICAgciA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemUgfHwgOSxcbiAgICAgICAgICAgIHMgPSB0LnN0eWxlO1xuICAgICAgICAgIGxldCBhO1xuICAgICAgICAgIGNvbnN0IHJvdW5kVG9PbmVEZWNpbWFsID0gdCA9PiBNYXRoLnJvdW5kKDEwICogdCkgLyAxMDtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSAyKSxcbiAgICAgICAgICAgICAgZSA9IHQgLyAoTWF0aC5yb3VuZCh0IC8gKGkuTElORV9GQUNUT1IgKiByKSkgfHwgMSk7XG4gICAgICAgICAgICBhID0gTWF0aC5taW4ociwgcm91bmRUb09uZURlY2ltYWwoZSAvIGkuTElORV9GQUNUT1IpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSAyKTtcbiAgICAgICAgICAgIGEgPSBNYXRoLm1pbihyLCByb3VuZFRvT25lRGVjaW1hbCh0IC8gaS5MSU5FX0ZBQ1RPUikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzLmZvbnRTaXplID0gXCJjYWxjKFwiLmNvbmNhdChhLCBcInB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlcIik7XG4gICAgICAgICAgcy5jb2xvciA9IGkuVXRpbC5tYWtlSGV4Q29sb3IoblswXSwgblsxXSwgblsyXSk7XG4gICAgICAgICAgbnVsbCAhPT0gdGhpcy5kYXRhLnRleHRBbGlnbm1lbnQgJiYgKHMudGV4dEFsaWduID0gZVt0aGlzLmRhdGEudGV4dEFsaWdubWVudF0pO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRSZXF1aXJlZCh0LCBlKSB7XG4gICAgICAgICAgZSA/IHQuc2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIiwgITApIDogdC5yZW1vdmVBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKTtcbiAgICAgICAgICB0LnNldEF0dHJpYnV0ZShcImFyaWEtcmVxdWlyZWRcIiwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogdC5yZW5kZXJGb3JtcyB8fCAhdC5kYXRhLmhhc0FwcGVhcmFuY2UgJiYgISF0LmRhdGEuZmllbGRWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldFByb3BlcnR5T25TaWJsaW5ncyh0LCBlLCBuLCBpKSB7XG4gICAgICAgICAgY29uc3QgciA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG4gICAgICAgICAgZm9yIChjb25zdCBzIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKHQubmFtZSwgdC5pZCkpIHtcbiAgICAgICAgICAgIHMuZG9tRWxlbWVudCAmJiAocy5kb21FbGVtZW50W2VdID0gbik7XG4gICAgICAgICAgICByLnNldFZhbHVlKHMuaWQsIHtcbiAgICAgICAgICAgICAgW2ldOiBuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgZSA9IHRoaXMuZGF0YS5pZDtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dFdpZGdldEFubm90YXRpb25cIik7XG4gICAgICAgICAgbGV0IG4gPSBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLnJlbmRlckZvcm1zKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZGF0YSR0ZXh0Q29udGVuO1xuICAgICAgICAgICAgY29uc3QgaSA9IHQuZ2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHIgPSBpLnZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBzID0gdC5nZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgIGNoYXJMaW1pdDogdGhpcy5kYXRhLm1heExlblxuICAgICAgICAgICAgfSkuY2hhckxpbWl0O1xuICAgICAgICAgICAgcyAmJiByLmxlbmd0aCA+IHMgJiYgKHIgPSByLnNsaWNlKDAsIHMpKTtcbiAgICAgICAgICAgIGxldCBhID0gaS5mb3JtYXR0ZWRWYWx1ZSB8fCAoKF90aGlzJGRhdGEkdGV4dENvbnRlbiA9IHRoaXMuZGF0YS50ZXh0Q29udGVudCkgPT09IG51bGwgfHwgX3RoaXMkZGF0YSR0ZXh0Q29udGVuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkYXRhJHRleHRDb250ZW4uam9pbihcIlxcblwiKSkgfHwgbnVsbDtcbiAgICAgICAgICAgIGEgJiYgdGhpcy5kYXRhLmNvbWIgJiYgKGEgPSBhLnJlcGxhY2VBbGwoL1xccysvZywgXCJcIikpO1xuICAgICAgICAgICAgY29uc3QgbyA9IHtcbiAgICAgICAgICAgICAgdXNlclZhbHVlOiByLFxuICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogYSxcbiAgICAgICAgICAgICAgbGFzdENvbW1pdHRlZFZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICBjb21taXRLZXk6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuICAgICAgICAgICAgICB2YXIgX2E0O1xuICAgICAgICAgICAgICBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gKF9hNCA9IGEpICE9PSBudWxsICYmIF9hNCAhPT0gdm9pZCAwID8gX2E0IDogcjtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhLmRvTm90U2Nyb2xsICYmIChuLnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIF9hNTtcbiAgICAgICAgICAgICAgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgICAgICAgbi50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgKF9hNSA9IGEpICE9PSBudWxsICYmIF9hNSAhPT0gdm9pZCAwID8gX2E1IDogcik7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YS5kb05vdFNjcm9sbCAmJiAobi5zdHlsZS5vdmVyZmxvd1ggPSBcImhpZGRlblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgJiYgKG4uaGlkZGVuID0gITApO1xuICAgICAgICAgICAgaC5hZGQobik7XG4gICAgICAgICAgICBuLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBlKTtcbiAgICAgICAgICAgIG4uZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICAgICAgICBuLm5hbWUgPSB0aGlzLmRhdGEuYmFzZUZpZWxkTmFtZSB8fCB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgICAgICAgICAgbi50YWJJbmRleCA9IGM7XG4gICAgICAgICAgICB0aGlzLl9zZXRSZXF1aXJlZChuLCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuICAgICAgICAgICAgcyAmJiAobi5tYXhMZW5ndGggPSBzKTtcbiAgICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGkgPT4ge1xuICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaS50YXJnZXQudmFsdWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHlPblNpYmxpbmdzKG4sIFwidmFsdWVcIiwgaS50YXJnZXQudmFsdWUsIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgIG8uZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgdCA9PiB7XG4gICAgICAgICAgICAgIHZhciBfdGhpcyRkYXRhJGRlZmF1bHRGaWU7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSAoX3RoaXMkZGF0YSRkZWZhdWx0RmllID0gdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlKSAhPT0gbnVsbCAmJiBfdGhpcyRkYXRhJGRlZmF1bHRGaWUgIT09IHZvaWQgMCA/IF90aGlzJGRhdGEkZGVmYXVsdEZpZSA6IFwiXCI7XG4gICAgICAgICAgICAgIG4udmFsdWUgPSBvLnVzZXJWYWx1ZSA9IGU7XG4gICAgICAgICAgICAgIG8uZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgYmx1ckxpc3RlbmVyID0gdCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogZVxuICAgICAgICAgICAgICB9ID0gbztcbiAgICAgICAgICAgICAgbnVsbCAhPSBlICYmICh0LnRhcmdldC52YWx1ZSA9IGUpO1xuICAgICAgICAgICAgICB0LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgdmFyIF90aGlzJGRhdGEkYWN0aW9uczI7XG4gICAgICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldDogZVxuICAgICAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgICAgIG8udXNlclZhbHVlICYmIChlLnZhbHVlID0gby51c2VyVmFsdWUpO1xuICAgICAgICAgICAgICAgIG8ubGFzdENvbW1pdHRlZFZhbHVlID0gZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBvLmNvbW1pdEtleSA9IDE7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBuID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyhuLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlKG4pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9uJGRldGFpbCR2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgby51c2VyVmFsdWUgPSAoX24kZGV0YWlsJHZhbHVlID0gbi5kZXRhaWwudmFsdWUpICE9PSBudWxsICYmIF9uJGRldGFpbCR2YWx1ZSAhPT0gdm9pZCAwID8gX24kZGV0YWlsJHZhbHVlIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG8udXNlclZhbHVlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG4udGFyZ2V0LnZhbHVlID0gby51c2VyVmFsdWU7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUobikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IGlcbiAgICAgICAgICAgICAgICAgICAgfSA9IG4uZGV0YWlsO1xuICAgICAgICAgICAgICAgICAgICBvLmZvcm1hdHRlZFZhbHVlID0gaTtcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSBpICYmIG4udGFyZ2V0ICE9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmIChuLnRhcmdldC52YWx1ZSA9IGkpO1xuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogaVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBzZWxSYW5nZSh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHQudGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKC4uLnQuZGV0YWlsLnNlbFJhbmdlKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjaGFyTGltaXQ6IG4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFyTGltaXQ6IGlcbiAgICAgICAgICAgICAgICAgICAgICB9ID0gbi5kZXRhaWwsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiByXG4gICAgICAgICAgICAgICAgICAgICAgfSA9IG47XG4gICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgci5yZW1vdmVBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHIuc2V0QXR0cmlidXRlKFwibWF4TGVuZ3RoXCIsIGkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IG8udXNlclZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocyAmJiAhKHMubGVuZ3RoIDw9IGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTY7XG4gICAgICAgICAgICAgICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgci52YWx1ZSA9IG8udXNlclZhbHVlID0gcztcbiAgICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTYgPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmU2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmU2LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiAhMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0S2V5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxTdGFydDogci5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsRW5kOiByLnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goaSwgbik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIG8uY29tbWl0S2V5ID0gMTtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IC0xO1xuICAgICAgICAgICAgICAgIFwiRXNjYXBlXCIgPT09IHQua2V5ID8gbiA9IDAgOiBcIkVudGVyXCIgIT09IHQua2V5IHx8IHRoaXMuZGF0YS5tdWx0aUxpbmUgPyBcIlRhYlwiID09PSB0LmtleSAmJiAoby5jb21taXRLZXkgPSAzKSA6IG4gPSAyO1xuICAgICAgICAgICAgICAgIGlmICgtMSA9PT0gbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBpXG4gICAgICAgICAgICAgICAgfSA9IHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGlmIChvLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gaSkge1xuICAgICAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTc7XG4gICAgICAgICAgICAgICAgICBvLmxhc3RDb21taXR0ZWRWYWx1ZSA9IGk7XG4gICAgICAgICAgICAgICAgICBvLnVzZXJWYWx1ZSA9IGk7XG4gICAgICAgICAgICAgICAgICAoX3RoaXMkbGlua1NlcnZpY2UkZXZlNyA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTcuZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgICAgICAgICAgIHdpbGxDb21taXQ6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdEtleTogbixcbiAgICAgICAgICAgICAgICAgICAgICBzZWxTdGFydDogdC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgc2VsRW5kOiB0LnRhcmdldC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IGJsdXJMaXN0ZW5lcjtcbiAgICAgICAgICAgICAgYmx1ckxpc3RlbmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgbi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0ID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlODtcbiAgICAgICAgICAgICAgICBpZiAoIXQucmVsYXRlZFRhcmdldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBuXG4gICAgICAgICAgICAgICAgfSA9IHQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIG8udXNlclZhbHVlID0gbjtcbiAgICAgICAgICAgICAgICBvLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gbiAmJiAoKF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTggPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmU4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmU4LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLFxuICAgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiAhMCxcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0S2V5OiBvLmNvbW1pdEtleSxcbiAgICAgICAgICAgICAgICAgICAgc2VsU3RhcnQ6IHQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBzZWxFbmQ6IHQudGFyZ2V0LnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpKHQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKChfdGhpcyRkYXRhJGFjdGlvbnMyID0gdGhpcy5kYXRhLmFjdGlvbnMpID09PSBudWxsIHx8IF90aGlzJGRhdGEkYWN0aW9uczIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRhdGEkYWN0aW9uczIuS2V5c3Ryb2tlKSAmJiBuLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCB0ID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMkbGlua1NlcnZpY2UkZXZlOTtcbiAgICAgICAgICAgICAgICBvLmxhc3RDb21taXR0ZWRWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBuLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGlcbiAgICAgICAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcixcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IHMsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZDogYVxuICAgICAgICAgICAgICAgICAgfSA9IGk7XG4gICAgICAgICAgICAgICAgbGV0IGwgPSBzLFxuICAgICAgICAgICAgICAgICAgYyA9IGE7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0LmlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRCYWNrd2FyZFwiOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHIuc3Vic3RyaW5nKDAsIHMpLm1hdGNoKC9cXHcqW15cXHddKiQvKTtcbiAgICAgICAgICAgICAgICAgICAgICB0ICYmIChsIC09IHRbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gci5zdWJzdHJpbmcocykubWF0Y2goL15bXlxcd10qXFx3Ki8pO1xuICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKGMgKz0gdFswXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgIHMgPT09IGEgJiYgKGwgLT0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCI6XG4gICAgICAgICAgICAgICAgICAgIHMgPT09IGEgJiYgKGMgKz0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAoX3RoaXMkbGlua1NlcnZpY2UkZXZlOSA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTkuZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZTogbiB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiAhMSxcbiAgICAgICAgICAgICAgICAgICAgc2VsU3RhcnQ6IGwsXG4gICAgICAgICAgICAgICAgICAgIHNlbEVuZDogY1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMobiwgW1tcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCB0ID0+IHQudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJsdXJMaXN0ZW5lciAmJiBuLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGJsdXJMaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9ICh0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdKSAvIHM7XG4gICAgICAgICAgICAgIG4uY2xhc3NMaXN0LmFkZChcImNvbWJcIik7XG4gICAgICAgICAgICAgIG4uc3R5bGUubGV0dGVyU3BhY2luZyA9IFwiY2FsYyhcIi5jb25jYXQodCwgXCJweCAqIHZhcigtLXNjYWxlLWZhY3RvcikgLSAxY2gpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIG4udGV4dENvbnRlbnQgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZTtcbiAgICAgICAgICAgIG4uc3R5bGUudmVydGljYWxBbGlnbiA9IFwibWlkZGxlXCI7XG4gICAgICAgICAgICBuLnN0eWxlLmRpc3BsYXkgPSBcInRhYmxlLWNlbGxcIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2V0VGV4dFN0eWxlKG4pO1xuICAgICAgICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihuKTtcbiAgICAgICAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhuKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQobik7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISF0LmRhdGEuaGFzT3duQ2FudmFzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6IHQucmVuZGVyRm9ybXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UsXG4gICAgICAgICAgICBlID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAgbiA9IGUuaWQ7XG4gICAgICAgICAgbGV0IGkgPSB0LmdldFZhbHVlKG4sIHtcbiAgICAgICAgICAgIHZhbHVlOiBlLmV4cG9ydFZhbHVlID09PSBlLmZpZWxkVmFsdWVcbiAgICAgICAgICB9KS52YWx1ZTtcbiAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PSB0eXBlb2YgaSkge1xuICAgICAgICAgICAgaSA9IFwiT2ZmXCIgIT09IGk7XG4gICAgICAgICAgICB0LnNldFZhbHVlKG4sIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvblwiLCBcImNoZWNrQm94XCIpO1xuICAgICAgICAgIGNvbnN0IHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgaC5hZGQocik7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgbik7XG4gICAgICAgICAgci5kaXNhYmxlZCA9IGUucmVhZE9ubHk7XG4gICAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQociwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgICAgICByLnR5cGUgPSBcImNoZWNrYm94XCI7XG4gICAgICAgICAgci5uYW1lID0gZS5iYXNlRmllbGROYW1lIHx8IGUuZmllbGROYW1lO1xuICAgICAgICAgIGkgJiYgci5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsICEwKTtcbiAgICAgICAgICByLnNldEF0dHJpYnV0ZShcImV4cG9ydFZhbHVlXCIsIGUuZXhwb3J0VmFsdWUpO1xuICAgICAgICAgIHIudGFiSW5kZXggPSBjO1xuICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgbmFtZTogcixcbiAgICAgICAgICAgICAgY2hlY2tlZDogc1xuICAgICAgICAgICAgfSA9IGkudGFyZ2V0O1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKHIsIG4pKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSBzICYmIGkuZXhwb3J0VmFsdWUgPT09IGUuZXhwb3J0VmFsdWU7XG4gICAgICAgICAgICAgIGkuZG9tRWxlbWVudCAmJiAoaS5kb21FbGVtZW50LmNoZWNrZWQgPSBuKTtcbiAgICAgICAgICAgICAgdC5zZXRWYWx1ZShpLmlkLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IG5cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0LnNldFZhbHVlKG4sIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLmRlZmF1bHRGaWVsZFZhbHVlIHx8IFwiT2ZmXCI7XG4gICAgICAgICAgICB0LnRhcmdldC5jaGVja2VkID0gbiA9PT0gZS5leHBvcnRWYWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcbiAgICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGUgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlKGUpIHtcbiAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNoZWNrZWQgPSBcIk9mZlwiICE9PSBlLmRldGFpbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUobiwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZS50YXJnZXQuY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goaSwgZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKHIsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgdCA9PiB0LnRhcmdldC5jaGVja2VkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKHIpO1xuICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKHIpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6IHQucmVuZGVyRm9ybXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJyYWRpb0J1dHRvblwiKTtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZSxcbiAgICAgICAgICAgIGUgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICBuID0gZS5pZDtcbiAgICAgICAgICBsZXQgaSA9IHQuZ2V0VmFsdWUobiwge1xuICAgICAgICAgICAgdmFsdWU6IGUuZmllbGRWYWx1ZSA9PT0gZS5idXR0b25WYWx1ZVxuICAgICAgICAgIH0pLnZhbHVlO1xuICAgICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBpKSB7XG4gICAgICAgICAgICBpID0gaSAhPT0gZS5idXR0b25WYWx1ZTtcbiAgICAgICAgICAgIHQuc2V0VmFsdWUobiwge1xuICAgICAgICAgICAgICB2YWx1ZTogaVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgaC5hZGQocik7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgbik7XG4gICAgICAgICAgci5kaXNhYmxlZCA9IGUucmVhZE9ubHk7XG4gICAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQociwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgICAgICByLnR5cGUgPSBcInJhZGlvXCI7XG4gICAgICAgICAgci5uYW1lID0gZS5iYXNlRmllbGROYW1lIHx8IGUuZmllbGROYW1lO1xuICAgICAgICAgIGkgJiYgci5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsICEwKTtcbiAgICAgICAgICByLnRhYkluZGV4ID0gYztcbiAgICAgICAgICByLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIG5hbWU6IGksXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IHJcbiAgICAgICAgICAgIH0gPSBlLnRhcmdldDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShpLCBuKSkgdC5zZXRWYWx1ZShlLmlkLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0LnNldFZhbHVlKG4sIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLmRlZmF1bHRGaWVsZFZhbHVlO1xuICAgICAgICAgICAgdC50YXJnZXQuY2hlY2tlZCA9IG51bGwgIT0gbiAmJiBuID09PSBlLmJ1dHRvblZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgaSA9IGUuYnV0dG9uVmFsdWU7XG4gICAgICAgICAgICByLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBlID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgciA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByID0gaSA9PT0gZS5kZXRhaWwudmFsdWU7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoZS50YXJnZXQubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHIgJiYgaS5pZCA9PT0gbjtcbiAgICAgICAgICAgICAgICAgICAgaS5kb21FbGVtZW50ICYmIChpLmRvbUVsZW1lbnQuY2hlY2tlZCA9IGUpO1xuICAgICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGkuaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChyLCBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMociwgW1tcImNoYW5nZVwiLCBcIlZhbGlkYXRlXCJdLCBbXCJjaGFuZ2VcIiwgXCJBY3Rpb25cIl0sIFtcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCB0ID0+IHQudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3Iocik7XG4gICAgICAgICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMocik7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgTGlua0Fubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogdC5kYXRhLmhhc0FwcGVhcmFuY2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgY29uc3QgdCA9IHN1cGVyLnJlbmRlcigpO1xuICAgICAgICAgIHQuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJwdXNoQnV0dG9uXCIpO1xuICAgICAgICAgIHRoaXMuZGF0YS5hbHRlcm5hdGl2ZVRleHQgJiYgKHQudGl0bGUgPSB0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KTtcbiAgICAgICAgICBjb25zdCBlID0gdC5sYXN0Q2hpbGQ7XG4gICAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zICYmIGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGUpO1xuICAgICAgICAgICAgZS5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwgdCA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveCh7fSwgdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiB0LnJlbmRlckZvcm1zXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjaG9pY2VXaWRnZXRBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgZSA9IHRoaXMuZGF0YS5pZCxcbiAgICAgICAgICAgIG4gPSB0LmdldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xuICAgICAgICAgIGguYWRkKGkpO1xuICAgICAgICAgIGkuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGUpO1xuICAgICAgICAgIGkuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG4gICAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoaSwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcbiAgICAgICAgICBpLm5hbWUgPSB0aGlzLmRhdGEuYmFzZUZpZWxkTmFtZSB8fCB0aGlzLmRhdGEuZmllbGROYW1lO1xuICAgICAgICAgIGkudGFiSW5kZXggPSBjO1xuICAgICAgICAgIGxldCByID0gdGhpcy5kYXRhLmNvbWJvICYmIHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aCA+IDA7XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGEuY29tYm8pIHtcbiAgICAgICAgICAgIGkuc2l6ZSA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5tdWx0aVNlbGVjdCAmJiAoaS5tdWx0aXBsZSA9ICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaS5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBpLm9wdGlvbnMpIHQuc2VsZWN0ZWQgPSB0LnZhbHVlID09PSBlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmRhdGEub3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICBlLnRleHRDb250ZW50ID0gdC5kaXNwbGF5VmFsdWU7XG4gICAgICAgICAgICBlLnZhbHVlID0gdC5leHBvcnRWYWx1ZTtcbiAgICAgICAgICAgIGlmIChuLnZhbHVlLmluY2x1ZGVzKHQuZXhwb3J0VmFsdWUpKSB7XG4gICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgITApO1xuICAgICAgICAgICAgICByID0gITE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpLmFwcGVuZChlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHMgPSBudWxsO1xuICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcbiAgICAgICAgICAgIHQudmFsdWUgPSBcIiBcIjtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsICEwKTtcbiAgICAgICAgICAgIHQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgITApO1xuICAgICAgICAgICAgaS5wcmVwZW5kKHQpO1xuICAgICAgICAgICAgcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgdC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgaS5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgcyk7XG4gICAgICAgICAgICAgIHMgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGkuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBnZXRWYWx1ZSA9IHQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZSA9IHQgPyBcInZhbHVlXCIgOiBcInRleHRDb250ZW50XCIsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBuLFxuICAgICAgICAgICAgICAgIG11bHRpcGxlOiByXG4gICAgICAgICAgICAgIH0gPSBpO1xuICAgICAgICAgICAgcmV0dXJuIHIgPyBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwgdCA9PiB0LnNlbGVjdGVkKS5tYXAodCA9PiB0W2VdKSA6IC0xID09PSBuLnNlbGVjdGVkSW5kZXggPyBudWxsIDogbltuLnNlbGVjdGVkSW5kZXhdW2VdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGEgPSBnZXRWYWx1ZSghMSk7XG4gICAgICAgICAgY29uc3QgZ2V0SXRlbXMgPSB0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRhcmdldC5vcHRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlLCB0ID0+ICh7XG4gICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdC50ZXh0Q29udGVudCxcbiAgICAgICAgICAgICAgZXhwb3J0VmFsdWU6IHQudmFsdWVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuICAgICAgICAgICAgaS5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwgbiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHIgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWUobikge1xuICAgICAgICAgICAgICAgICAgdmFyIF9zNTtcbiAgICAgICAgICAgICAgICAgIChfczUgPSBzKSA9PT0gbnVsbCB8fCBfczUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zNSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgciA9IG4uZGV0YWlsLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvID0gbmV3IFNldChBcnJheS5pc0FycmF5KHIpID8gciA6IFtyXSk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgaS5vcHRpb25zKSB0LnNlbGVjdGVkID0gby5oYXModC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKCEwKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVTZWxlY3Rpb24odCkge1xuICAgICAgICAgICAgICAgICAgaS5tdWx0aXBsZSA9ICEwO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVtb3ZlKG4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBpLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHMgPSBuLmRldGFpbC5yZW1vdmU7XG4gICAgICAgICAgICAgICAgICByW3NdLnNlbGVjdGVkID0gITE7XG4gICAgICAgICAgICAgICAgICBpLnJlbW92ZShzKTtcbiAgICAgICAgICAgICAgICAgIGlmIChyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLTEgPT09IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXguY2FsbChyLCB0ID0+IHQuc2VsZWN0ZWQpICYmIChyWzBdLnNlbGVjdGVkID0gITApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMCksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhuKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xlYXIobikge1xuICAgICAgICAgICAgICAgICAgZm9yICg7IDAgIT09IGkubGVuZ3RoOykgaS5yZW1vdmUoMCk7XG4gICAgICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5zZXJ0KG4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbmRleDogcixcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHMsXG4gICAgICAgICAgICAgICAgICAgICAgZXhwb3J0VmFsdWU6IG9cbiAgICAgICAgICAgICAgICAgICAgfSA9IG4uZGV0YWlsLmluc2VydCxcbiAgICAgICAgICAgICAgICAgICAgbCA9IGkuY2hpbGRyZW5bcl0sXG4gICAgICAgICAgICAgICAgICAgIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgYy50ZXh0Q29udGVudCA9IHM7XG4gICAgICAgICAgICAgICAgICBjLnZhbHVlID0gbztcbiAgICAgICAgICAgICAgICAgIGwgPyBsLmJlZm9yZShjKSA6IGkuYXBwZW5kKGMpO1xuICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMCksXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhuKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBhID0gZ2V0VmFsdWUoITEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXRlbXMobikge1xuICAgICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICBpdGVtczogclxuICAgICAgICAgICAgICAgICAgfSA9IG4uZGV0YWlsO1xuICAgICAgICAgICAgICAgICAgZm9yICg7IDAgIT09IGkubGVuZ3RoOykgaS5yZW1vdmUoMCk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWU6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRWYWx1ZTogblxuICAgICAgICAgICAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgICAgICAgICAgIHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICByLnRleHRDb250ZW50ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgci52YWx1ZSA9IG47XG4gICAgICAgICAgICAgICAgICAgIGkuYXBwZW5kKHIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaS5vcHRpb25zLmxlbmd0aCA+IDAgJiYgKGkub3B0aW9uc1swXS5zZWxlY3RlZCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIHQuc2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUoITApLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMobilcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgYSA9IGdldFZhbHVlKCExKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluZGljZXMobikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBTZXQobi5kZXRhaWwuaW5kaWNlcyk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi50YXJnZXQub3B0aW9ucykgdC5zZWxlY3RlZCA9IGkuaGFzKHQuaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMClcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgYSA9IGdldFZhbHVlKCExKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVkaXRhYmxlKHQpIHtcbiAgICAgICAgICAgICAgICAgIHQudGFyZ2V0LmRpc2FibGVkID0gIXQuZGV0YWlsLmVkaXRhYmxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHIsIG4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBuID0+IHtcbiAgICAgICAgICAgICAgdmFyIF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTEwO1xuICAgICAgICAgICAgICBjb25zdCBpID0gZ2V0VmFsdWUoITApO1xuICAgICAgICAgICAgICB0LnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogaVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAoX3RoaXMkbGlua1NlcnZpY2UkZXZlMTAgPSB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzKSA9PT0gbnVsbCB8fCBfdGhpcyRsaW5rU2VydmljZSRldmUxMCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkbGlua1NlcnZpY2UkZXZlMTAuZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgICBpZDogZSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogYSxcbiAgICAgICAgICAgICAgICAgIGNoYW5nZUV4OiBpLFxuICAgICAgICAgICAgICAgICAgd2lsbENvbW1pdDogITEsXG4gICAgICAgICAgICAgICAgICBjb21taXRLZXk6IDEsXG4gICAgICAgICAgICAgICAgICBrZXlEb3duOiAhMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGksIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdLCBbXCJpbnB1dFwiLCBcIkFjdGlvblwiXSwgW1wiaW5wdXRcIiwgXCJWYWxpZGF0ZVwiXV0sIHQgPT4gdC50YXJnZXQudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbiAobikge1xuICAgICAgICAgICAgdC5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSghMClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGF0YS5jb21ibyAmJiB0aGlzLl9zZXRUZXh0U3R5bGUoaSk7XG4gICAgICAgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKGkpO1xuICAgICAgICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGkpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX2UkdGl0bGVPYmosIF9lJGNvbnRlbnRzT2JqLCBfZSRyaWNoVGV4dDtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkYXRhOiBlLFxuICAgICAgICAgICAgZWxlbWVudHM6IG5cbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKChfZSR0aXRsZU9iaiA9IGUudGl0bGVPYmopICE9PSBudWxsICYmIF9lJHRpdGxlT2JqICE9PSB2b2lkIDAgJiYgX2UkdGl0bGVPYmouc3RyIHx8IChfZSRjb250ZW50c09iaiA9IGUuY29udGVudHNPYmopICE9PSBudWxsICYmIF9lJGNvbnRlbnRzT2JqICE9PSB2b2lkIDAgJiYgX2UkY29udGVudHNPYmouc3RyIHx8IChfZSRyaWNoVGV4dCA9IGUucmljaFRleHQpICE9PSBudWxsICYmIF9lJHJpY2hUZXh0ICE9PSB2b2lkIDAgJiYgX2UkcmljaFRleHQuc3RyKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSBuO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwicG9wdXBBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGNvbnN0IHQgPSBuZXcgUG9wdXBFbGVtZW50KHtcbiAgICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgICAgICAgY29sb3I6IHRoaXMuZGF0YS5jb2xvcixcbiAgICAgICAgICAgICAgdGl0bGVPYmo6IHRoaXMuZGF0YS50aXRsZU9iaixcbiAgICAgICAgICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUsXG4gICAgICAgICAgICAgIGNvbnRlbnRzT2JqOiB0aGlzLmRhdGEuY29udGVudHNPYmosXG4gICAgICAgICAgICAgIHJpY2hUZXh0OiB0aGlzLmRhdGEucmljaFRleHQsXG4gICAgICAgICAgICAgIHJlY3Q6IHRoaXMuZGF0YS5yZWN0LFxuICAgICAgICAgICAgICBwYXJlbnRSZWN0OiB0aGlzLmRhdGEucGFyZW50UmVjdCB8fCBudWxsLFxuICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgICAgICAgICBlbGVtZW50czogdGhpcy5lbGVtZW50cyxcbiAgICAgICAgICAgICAgb3BlbjogdGhpcy5kYXRhLm9wZW5cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICBuLnBvcHVwID0gdDtcbiAgICAgICAgICAgIGUucHVzaChuLmRhdGEuaWQpO1xuICAgICAgICAgICAgbi5hZGRIaWdobGlnaHRBcmVhKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIiwgZS5qb2luKFwiLFwiKSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX05lID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0JlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1VlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX0hlID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX1NlMiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgdmFyIF9idDIgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfV2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfR2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfVmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfJGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWGUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfS2UgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWmUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcWUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfemUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfamUgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIFBvcHVwRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX2plKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3plKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX3FlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfTmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfQmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2plLCBfamUyKS5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1VlLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96ZSwgX3plMikuYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9IZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcWUsIF9xZTIpLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfU2UyLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2J0Miwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9XZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9HZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9WZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF8kZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9YZSwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfS2UsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWWUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfSmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfUWUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWmUsIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogZSxcbiAgICAgICAgICAgIGNvbG9yOiBuLFxuICAgICAgICAgICAgZWxlbWVudHM6IGksXG4gICAgICAgICAgICB0aXRsZU9iajogcyxcbiAgICAgICAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IGEsXG4gICAgICAgICAgICBjb250ZW50c09iajogbyxcbiAgICAgICAgICAgIHJpY2hUZXh0OiBsLFxuICAgICAgICAgICAgcGFyZW50OiBjLFxuICAgICAgICAgICAgcmVjdDogaCxcbiAgICAgICAgICAgIHBhcmVudFJlY3Q6IGQsXG4gICAgICAgICAgICBvcGVuOiB1XG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9idDIsIGUpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUWUsIHMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfV2UsIG8pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfSmUsIGwpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfVmUsIGMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU2UyLCBuKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1llLCBoKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgXyRlLCBkKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0dlLCBpKTtcbiAgICAgICAgICBjb25zdCBwID0gci5QREZEYXRlU3RyaW5nLnRvRGF0ZU9iamVjdChhKTtcbiAgICAgICAgICBwICYmIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfTmUsIGMubDEwbi5nZXQoXCJhbm5vdGF0aW9uX2RhdGVfc3RyaW5nXCIsIHtcbiAgICAgICAgICAgIGRhdGU6IHAudG9Mb2NhbGVEYXRlU3RyaW5nKCksXG4gICAgICAgICAgICB0aW1lOiBwLnRvTG9jYWxlVGltZVN0cmluZygpXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlciA9IGkuZmxhdE1hcCh0ID0+IHQuZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy50cmlnZ2VyKSB7XG4gICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0hlKSk7XG4gICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfVWUpKTtcbiAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9CZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuaGlkZGVuID0gITA7XG4gICAgICAgICAgdSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9xZSwgX3FlMikuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfS2UpKSByZXR1cm47XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICAgICAgdmlldzogdFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgICAgIHJhd0RpbXM6IHtcbiAgICAgICAgICAgICAgICAgIHBhZ2VXaWR0aDogZSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VIZWlnaHQ6IG4sXG4gICAgICAgICAgICAgICAgICBwYWdlWDogcixcbiAgICAgICAgICAgICAgICAgIHBhZ2VZOiBzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9WZSksXG4gICAgICAgICAgICBhID0gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9LZSwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgICAgICAgYS5jbGFzc05hbWUgPSBcInBvcHVwXCI7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfU2UyKSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGEuc3R5bGUub3V0bGluZUNvbG9yID0gaS5VdGlsLm1ha2VIZXhDb2xvciguLi5fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1NlMikpO1xuICAgICAgICAgICAgaWYgKENTUy5zdXBwb3J0cyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJjb2xvci1taXgoaW4gc3JnYiwgcmVkIDMwJSwgd2hpdGUpXCIpKSBhLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiY29sb3ItbWl4KGluIHNyZ2IsIFwiLmNvbmNhdCh0LCBcIiAzMCUsIHdoaXRlKVwiKTtlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgdCA9IC43O1xuICAgICAgICAgICAgICBhLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGkuVXRpbC5tYWtlSGV4Q29sb3IoLi4uX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9TZTIpLm1hcChlID0+IE1hdGguZmxvb3IodCAqICgyNTUgLSBlKSArIGUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICBvLmNsYXNzTmFtZSA9IFwiaGVhZGVyXCI7XG4gICAgICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcbiAgICAgICAgICBvLmFwcGVuZChjKTtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgZGlyOiBjLmRpcixcbiAgICAgICAgICAgIHN0cjogYy50ZXh0Q29udGVudFxuICAgICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1FlKSk7XG4gICAgICAgICAgYS5hcHBlbmQobyk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfTmUpKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJwb3B1cERhdGVcIik7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX05lKS50aGVuKGUgPT4ge1xuICAgICAgICAgICAgICB0LnRleHRDb250ZW50ID0gZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgby5hcHBlbmQodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGggPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1dlKSxcbiAgICAgICAgICAgIGQgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0plKTtcbiAgICAgICAgICBpZiAoIShkICE9PSBudWxsICYmIGQgIT09IHZvaWQgMCAmJiBkLnN0cikgfHwgaCAhPT0gbnVsbCAmJiBoICE9PSB2b2lkIDAgJiYgaC5zdHIgJiYgaC5zdHIgIT09IGQuc3RyKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5fZm9ybWF0Q29udGVudHMoaCk7XG4gICAgICAgICAgICBhLmFwcGVuZCh0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbC5YZmFMYXllci5yZW5kZXIoe1xuICAgICAgICAgICAgICB4ZmFIdG1sOiBkLmh0bWwsXG4gICAgICAgICAgICAgIGludGVudDogXCJyaWNoVGV4dFwiLFxuICAgICAgICAgICAgICBkaXY6IGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYS5sYXN0Q2hpbGQuY2xhc3NMaXN0LmFkZChcInJpY2hUZXh0XCIsIFwicG9wdXBDb250ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgdSA9ICEhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF8kZSksXG4gICAgICAgICAgICBwID0gdSA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfJGUpIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZZSk7XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfR2UpKSBpZiAoIXAgfHwgbnVsbCAhPT0gaS5VdGlsLmludGVyc2VjdCh0LmRhdGEucmVjdCwgcCkpIHtcbiAgICAgICAgICAgIHAgPSB0LmRhdGEucmVjdDtcbiAgICAgICAgICAgIHUgPSAhMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmID0gaS5VdGlsLm5vcm1hbGl6ZVJlY3QoW3BbMF0sIHRbM10gLSBwWzFdICsgdFsxXSwgcFsyXSwgdFszXSAtIHBbM10gKyB0WzFdXSksXG4gICAgICAgICAgICBnID0gdSA/IHBbMl0gLSBwWzBdICsgNSA6IDAsXG4gICAgICAgICAgICBtID0gZlswXSArIGcsXG4gICAgICAgICAgICBiID0gZlsxXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHZcbiAgICAgICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0Mik7XG4gICAgICAgICAgdi5sZWZ0ID0gMTAwICogKG0gLSByKSAvIGUgKyBcIiVcIjtcbiAgICAgICAgICB2LnRvcCA9IDEwMCAqIChiIC0gcykgLyBuICsgXCIlXCI7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmFwcGVuZChhKTtcbiAgICAgICAgfVxuICAgICAgICBfZm9ybWF0Q29udGVudHModCkge1xuICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICBzdHI6IGUsXG4gICAgICAgICAgICBkaXI6IG5cbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBjb25zdCBpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgICAgaS5jbGFzc0xpc3QuYWRkKFwicG9wdXBDb250ZW50XCIpO1xuICAgICAgICAgIGkuZGlyID0gbjtcbiAgICAgICAgICBjb25zdCByID0gZS5zcGxpdCgvKD86XFxyXFxuP3xcXG4pLyk7XG4gICAgICAgICAgZm9yIChsZXQgdCA9IDAsIGUgPSByLmxlbmd0aDsgdCA8IGU7ICsrdCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJbdF07XG4gICAgICAgICAgICBpLmFwcGVuZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKSk7XG4gICAgICAgICAgICB0IDwgZSAtIDEgJiYgaS5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yY2VIaWRlKCkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWmUsIHRoaXMuaXNWaXNpYmxlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1plKSAmJiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmhpZGRlbiA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICBtYXliZVNob3coKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWmUpKSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1plLCAhMSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuaGlkZGVuID0gITE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBpc1Zpc2libGUoKSB7XG4gICAgICAgICAgcmV0dXJuICExID09PSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuaGlkZGVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfcWUyKCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1hlLCAhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9YZSkpO1xuICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9YZSkpIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF96ZSwgX3plMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qZSwgX2plMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3plMigpIHtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9LZSkgfHwgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlKSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1hlKSAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0MikuY2xhc3NMaXN0LmFkZChcImZvY3VzZWRcIik7ZWxzZSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmhpZGRlbiA9ICExO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYnQyKS5zdHlsZS56SW5kZXggPSBwYXJzZUludChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0Mikuc3R5bGUuekluZGV4KSArIDFlMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2plMigpIHtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmNsYXNzTGlzdC5yZW1vdmUoXCJmb2N1c2VkXCIpO1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWGUpICYmIHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9idDIpLmhpZGRlbiA9ICEwO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYnQyKS5zdHlsZS56SW5kZXggPSBwYXJzZUludChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2J0Mikuc3R5bGUuekluZGV4KSAtIDFlMztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqMiwgX3QkZGF0YSRjb250ZW50c09iajIsIF90JGRhdGEkcmljaFRleHQyO1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqMiA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajIgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqMi5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmoyID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqMiAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmoyLnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDIgPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQyICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDIuc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdC5kYXRhLnRleHRDb250ZW50O1xuICAgICAgICAgIHRoaXMudGV4dFBvc2l0aW9uID0gdC5kYXRhLnRleHRQb3NpdGlvbjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25FZGl0b3JUeXBlID0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImZyZWVUZXh0QW5ub3RhdGlvblwiKTtcbiAgICAgICAgICBpZiAodGhpcy50ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJhbm5vdGF0aW9uVGV4dENvbnRlbnRcIik7XG4gICAgICAgICAgICB0LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJjb21tZW50XCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMudGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gZTtcbiAgICAgICAgICAgICAgdC5hcHBlbmQobik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuX2VkaXRPbkRvdWJsZUNsaWNrKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkZyZWVUZXh0QW5ub3RhdGlvbkVsZW1lbnQgPSBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50O1xuICAgICAgdmFyIF90biA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgTGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmozLCBfdCRkYXRhJGNvbnRlbnRzT2JqMywgX3QkZGF0YSRyaWNoVGV4dDM7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmozID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqMyAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmozLnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajMgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmozICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajMuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0MyA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDMgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0My5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF90biwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibGluZUFubm90YXRpb25cIik7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd2lkdGg6IGUsXG4gICAgICAgICAgICAgIGhlaWdodDogblxuICAgICAgICAgICAgfSA9IGdldFJlY3REaW1zKHQucmVjdCksXG4gICAgICAgICAgICBpID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZShlLCBuLCAhMCksXG4gICAgICAgICAgICByID0gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF90biwgdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bGluZVwiKSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ4MVwiLCB0LnJlY3RbMl0gLSB0LmxpbmVDb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ5MVwiLCB0LnJlY3RbM10gLSB0LmxpbmVDb29yZGluYXRlc1sxXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ4MlwiLCB0LnJlY3RbMl0gLSB0LmxpbmVDb29yZGluYXRlc1syXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJ5MlwiLCB0LnJlY3RbM10gLSB0LmxpbmVDb29yZGluYXRlc1szXSk7XG4gICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgdC5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICAgICAgICByLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIHIuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIGkuYXBwZW5kKHIpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdG4pO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfZW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIFNxdWFyZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmo0LCBfdCRkYXRhJGNvbnRlbnRzT2JqNCwgX3QkZGF0YSRyaWNoVGV4dDQ7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmo0ID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqNCAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmo0LnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajQgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmo0ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajQuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0NCA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDQgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0NC5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9lbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3F1YXJlQW5ub3RhdGlvblwiKTtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3aWR0aDogZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXModC5yZWN0KSxcbiAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKGUsIG4sICEwKSxcbiAgICAgICAgICAgIHIgPSB0LmJvcmRlclN0eWxlLndpZHRoLFxuICAgICAgICAgICAgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZW4sIHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIikpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwieFwiLCByIC8gMik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJ5XCIsIHIgLyAyKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGUgLSByKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBuIC0gcik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgciB8fCAxKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIGkuYXBwZW5kKHMpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZW4pO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBfbm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNsYXNzIENpcmNsZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmo1LCBfdCRkYXRhJGNvbnRlbnRzT2JqNSwgX3QkZGF0YSRyaWNoVGV4dDU7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmo1ID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqNSAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmo1LnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajUgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmo1ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajUuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0NSA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDUgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0NS5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9ubiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2lyY2xlQW5ub3RhdGlvblwiKTtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3aWR0aDogZSxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICB9ID0gZ2V0UmVjdERpbXModC5yZWN0KSxcbiAgICAgICAgICAgIGkgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKGUsIG4sICEwKSxcbiAgICAgICAgICAgIHIgPSB0LmJvcmRlclN0eWxlLndpZHRoLFxuICAgICAgICAgICAgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbm4sIHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmVsbGlwc2VcIikpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiY3hcIiwgZSAvIDIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiY3lcIiwgbiAvIDIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwicnhcIiwgZSAvIDIgLSByIC8gMik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJyeVwiLCBuIC8gMiAtIHIgLyAyKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCByIHx8IDEpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICAgICAgaS5hcHBlbmQocyk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGkpO1xuICAgICAgICAgIHQucG9wdXBSZWYgfHwgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ubik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIF9pbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqNiwgX3QkZGF0YSRjb250ZW50c09iajYsIF90JGRhdGEkcmljaFRleHQ2O1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqNiA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajYgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqNi5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmo2ID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqNiAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmo2LnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDYgPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQ2ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDYuc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfaW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwicG9seWxpbmVBbm5vdGF0aW9uXCI7XG4gICAgICAgICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlsaW5lXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICBoZWlnaHQ6IG5cbiAgICAgICAgICAgIH0gPSBnZXRSZWN0RGltcyh0LnJlY3QpLFxuICAgICAgICAgICAgaSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUoZSwgbiwgITApO1xuICAgICAgICAgIGxldCByID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIHQudmVydGljZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBlLnggLSB0LnJlY3RbMF0sXG4gICAgICAgICAgICAgIGkgPSB0LnJlY3RbM10gLSBlLnk7XG4gICAgICAgICAgICByLnB1c2gobiArIFwiLFwiICsgaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHIgPSByLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIGNvbnN0IHMgPSBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2luLCB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKSk7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgcik7XG4gICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgdC5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcbiAgICAgICAgICBzLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIHMuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgIGkuYXBwZW5kKHMpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKHMsIHQpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBnZXRFbGVtZW50c1RvVHJpZ2dlclBvcHVwKCkge1xuICAgICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2luKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRIaWdobGlnaHRBcmVhKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBcmVhXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjbGFzcyBQb2x5Z29uQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHN1cGVyKHQpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJwb2x5Z29uQW5ub3RhdGlvblwiO1xuICAgICAgICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5Z29uXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIENhcmV0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajcsIF90JGRhdGEkY29udGVudHNPYmo3LCBfdCRkYXRhJHJpY2hUZXh0NztcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajcgPSB0LmRhdGEudGl0bGVPYmopICE9PSBudWxsICYmIF90JGRhdGEkdGl0bGVPYmo3ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iajcuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqNyA9IHQuZGF0YS5jb250ZW50c09iaikgIT09IG51bGwgJiYgX3QkZGF0YSRjb250ZW50c09iajcgIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqNy5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQ3ID0gdC5kYXRhLnJpY2hUZXh0KSAhPT0gbnVsbCAmJiBfdCRkYXRhJHJpY2hUZXh0NyAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQ3LnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjYXJldEFubm90YXRpb25cIik7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX3JuID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICBjbGFzcyBJbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqOCwgX3QkZGF0YSRjb250ZW50c09iajgsIF90JGRhdGEkcmljaFRleHQ4O1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqOCA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajggIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqOC5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmo4ID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqOCAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmo4LnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDggPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQ4ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDguc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfcm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IFtdXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcImlua0Fubm90YXRpb25cIjtcbiAgICAgICAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gXCJzdmc6cG9seWxpbmVcIjtcbiAgICAgICAgICB0aGlzLmFubm90YXRpb25FZGl0b3JUeXBlID0gaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgICAgICBoZWlnaHQ6IG5cbiAgICAgICAgICAgIH0gPSBnZXRSZWN0RGltcyh0LnJlY3QpLFxuICAgICAgICAgICAgaSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUoZSwgbiwgITApO1xuICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0Lmlua0xpc3RzKSB7XG4gICAgICAgICAgICBsZXQgbiA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IGkueCAtIHQucmVjdFswXSxcbiAgICAgICAgICAgICAgICByID0gdC5yZWN0WzNdIC0gaS55O1xuICAgICAgICAgICAgICBuLnB1c2goXCJcIi5jb25jYXQoZSwgXCIsXCIpLmNvbmNhdChyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuID0gbi5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcm4pLnB1c2gocik7XG4gICAgICAgICAgICByLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBuKTtcbiAgICAgICAgICAgIHIuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIHQuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG4gICAgICAgICAgICByLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuICAgICAgICAgICAgci5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgICAgICAgICB0LnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKHIsIHQpO1xuICAgICAgICAgICAgaS5hcHBlbmQocik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWxlbWVudHNUb1RyaWdnZXJQb3B1cCgpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ybik7XG4gICAgICAgIH1cbiAgICAgICAgYWRkSGlnaGxpZ2h0QXJlYSgpIHtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlnaGxpZ2h0QXJlYVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5JbmtBbm5vdGF0aW9uRWxlbWVudCA9IElua0Fubm90YXRpb25FbGVtZW50O1xuICAgICAgY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajksIF90JGRhdGEkY29udGVudHNPYmo5LCBfdCRkYXRhJHJpY2hUZXh0OTtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajkgPSB0LmRhdGEudGl0bGVPYmopICE9PSBudWxsICYmIF90JGRhdGEkdGl0bGVPYmo5ICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iajkuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqOSA9IHQuZGF0YS5jb250ZW50c09iaikgIT09IG51bGwgJiYgX3QkZGF0YSRjb250ZW50c09iajkgIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqOS5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQ5ID0gdC5kYXRhLnJpY2hUZXh0KSAhPT0gbnVsbCAmJiBfdCRkYXRhJHJpY2hUZXh0OSAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQ5LnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwLFxuICAgICAgICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgVW5kZXJsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajEwLCBfdCRkYXRhJGNvbnRlbnRzT2JqMTAsIF90JGRhdGEkcmljaFRleHQxMDtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajEwID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqMTAgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqMTAuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqMTAgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmoxMCAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmoxMC5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQxMCA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDEwICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDEwLnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwLFxuICAgICAgICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiB8fCB0aGlzLl9jcmVhdGVQb3B1cCgpO1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ1bmRlcmxpbmVBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdCRkYXRhJHRpdGxlT2JqMTEsIF90JGRhdGEkY29udGVudHNPYmoxMSwgX3QkZGF0YSRyaWNoVGV4dDExO1xuICAgICAgICAgIHN1cGVyKHQsIHtcbiAgICAgICAgICAgIGlzUmVuZGVyYWJsZTogISEodC5kYXRhLnBvcHVwUmVmIHx8IChfdCRkYXRhJHRpdGxlT2JqMTEgPSB0LmRhdGEudGl0bGVPYmopICE9PSBudWxsICYmIF90JGRhdGEkdGl0bGVPYmoxMSAhPT0gdm9pZCAwICYmIF90JGRhdGEkdGl0bGVPYmoxMS5zdHIgfHwgKF90JGRhdGEkY29udGVudHNPYmoxMSA9IHQuZGF0YS5jb250ZW50c09iaikgIT09IG51bGwgJiYgX3QkZGF0YSRjb250ZW50c09iajExICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRjb250ZW50c09iajExLnN0ciB8fCAoX3QkZGF0YSRyaWNoVGV4dDExID0gdC5kYXRhLnJpY2hUZXh0KSAhPT0gbnVsbCAmJiBfdCRkYXRhJHJpY2hUZXh0MTEgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHJpY2hUZXh0MTEuc3RyKSxcbiAgICAgICAgICAgIGlnbm9yZUJvcmRlcjogITAsXG4gICAgICAgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogITBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInNxdWlnZ2x5QW5ub3RhdGlvblwiKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7XG4gICAgICAgICAgdmFyIF90JGRhdGEkdGl0bGVPYmoxMiwgX3QkZGF0YSRjb250ZW50c09iajEyLCBfdCRkYXRhJHJpY2hUZXh0MTI7XG4gICAgICAgICAgc3VwZXIodCwge1xuICAgICAgICAgICAgaXNSZW5kZXJhYmxlOiAhISh0LmRhdGEucG9wdXBSZWYgfHwgKF90JGRhdGEkdGl0bGVPYmoxMiA9IHQuZGF0YS50aXRsZU9iaikgIT09IG51bGwgJiYgX3QkZGF0YSR0aXRsZU9iajEyICE9PSB2b2lkIDAgJiYgX3QkZGF0YSR0aXRsZU9iajEyLnN0ciB8fCAoX3QkZGF0YSRjb250ZW50c09iajEyID0gdC5kYXRhLmNvbnRlbnRzT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqMTIgIT09IHZvaWQgMCAmJiBfdCRkYXRhJGNvbnRlbnRzT2JqMTIuc3RyIHx8IChfdCRkYXRhJHJpY2hUZXh0MTIgPSB0LmRhdGEucmljaFRleHQpICE9PSBudWxsICYmIF90JGRhdGEkcmljaFRleHQxMiAhPT0gdm9pZCAwICYmIF90JGRhdGEkcmljaFRleHQxMi5zdHIpLFxuICAgICAgICAgICAgaWdub3JlQm9yZGVyOiAhMCxcbiAgICAgICAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlcigpIHtcbiAgICAgICAgICB0aGlzLmRhdGEucG9wdXBSZWYgfHwgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3RyaWtlb3V0QW5ub3RhdGlvblwiKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHQpIHtcbiAgICAgICAgICB2YXIgX3QkZGF0YSR0aXRsZU9iajEzLCBfdCRkYXRhJGNvbnRlbnRzT2JqMTMsIF90JGRhdGEkcmljaFRleHQxMztcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEhKHQuZGF0YS5wb3B1cFJlZiB8fCAoX3QkZGF0YSR0aXRsZU9iajEzID0gdC5kYXRhLnRpdGxlT2JqKSAhPT0gbnVsbCAmJiBfdCRkYXRhJHRpdGxlT2JqMTMgIT09IHZvaWQgMCAmJiBfdCRkYXRhJHRpdGxlT2JqMTMuc3RyIHx8IChfdCRkYXRhJGNvbnRlbnRzT2JqMTMgPSB0LmRhdGEuY29udGVudHNPYmopICE9PSBudWxsICYmIF90JGRhdGEkY29udGVudHNPYmoxMyAhPT0gdm9pZCAwICYmIF90JGRhdGEkY29udGVudHNPYmoxMy5zdHIgfHwgKF90JGRhdGEkcmljaFRleHQxMyA9IHQuZGF0YS5yaWNoVGV4dCkgIT09IG51bGwgJiYgX3QkZGF0YSRyaWNoVGV4dDEzICE9PSB2b2lkIDAgJiYgX3QkZGF0YSRyaWNoVGV4dDEzLnN0ciksXG4gICAgICAgICAgICBpZ25vcmVCb3JkZXI6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzdGFtcEFubm90YXRpb25cIik7XG4gICAgICAgICAgdGhpcy5kYXRhLnBvcHVwUmVmIHx8IHRoaXMuX2NyZWF0ZVBvcHVwKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLlN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgPSBTdGFtcEFubm90YXRpb25FbGVtZW50O1xuICAgICAgdmFyIF9zbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpO1xuICAgICAgY2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcbiAgICAgICAgY29uc3RydWN0b3IodCkge1xuICAgICAgICAgIHZhciBfdGhpcyRsaW5rU2VydmljZSRldmUxMTtcbiAgICAgICAgICBzdXBlcih0LCB7XG4gICAgICAgICAgICBpc1JlbmRlcmFibGU6ICEwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3NuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmlsZW5hbWU6IGUsXG4gICAgICAgICAgICBjb250ZW50OiBuXG4gICAgICAgICAgfSA9IHRoaXMuZGF0YS5maWxlO1xuICAgICAgICAgIHRoaXMuZmlsZW5hbWUgPSAoMCwgci5nZXRGaWxlbmFtZUZyb21VcmwpKGUsICEwKTtcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBuO1xuICAgICAgICAgIChfdGhpcyRsaW5rU2VydmljZSRldmUxMSA9IHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXMpID09PSBudWxsIHx8IF90aGlzJGxpbmtTZXJ2aWNlJGV2ZTExID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRsaW5rU2VydmljZSRldmUxMS5kaXNwYXRjaChcImZpbGVhdHRhY2htZW50YW5ub3RhdGlvblwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICBmaWxlbmFtZTogZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgdmFyIF90aGlzJGRhdGEkdGl0bGVPYmosIF90aGlzJGRhdGEkY29udGVudHNPYjtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uXCIpO1xuICAgICAgICAgIGxldCB0O1xuICAgICAgICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZWxzZSB7XG4gICAgICAgICAgICB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgICAgIHQuc3JjID0gXCJcIi5jb25jYXQodGhpcy5pbWFnZVJlc291cmNlc1BhdGgsIFwiYW5ub3RhdGlvbi1cIikuY29uY2F0KC9wYXBlcmNsaXAvaS50ZXN0KHRoaXMuZGF0YS5uYW1lKSA/IFwicGFwZXJjbGlwXCIgOiBcInB1c2hwaW5cIiwgXCIuc3ZnXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0LmNsYXNzTGlzdC5hZGQoXCJwb3B1cFRyaWdnZXJBcmVhXCIpO1xuICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsIHRoaXMuX2Rvd25sb2FkLmJpbmQodGhpcykpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfc24sIHQpO1xuICAgICAgICAgICF0aGlzLmRhdGEucG9wdXBSZWYgJiYgKCgoX3RoaXMkZGF0YSR0aXRsZU9iaiA9IHRoaXMuZGF0YS50aXRsZU9iaikgPT09IG51bGwgfHwgX3RoaXMkZGF0YSR0aXRsZU9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RoaXMkZGF0YSR0aXRsZU9iai5zdHIpIHx8ICgoX3RoaXMkZGF0YSRjb250ZW50c09iID0gdGhpcy5kYXRhLmNvbnRlbnRzT2JqKSA9PT0gbnVsbCB8fCBfdGhpcyRkYXRhJGNvbnRlbnRzT2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRhdGEkY29udGVudHNPYi5zdHIpIHx8IHRoaXMuZGF0YS5yaWNoVGV4dCkgJiYgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQodCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGdldEVsZW1lbnRzVG9UcmlnZ2VyUG9wdXAoKSB7XG4gICAgICAgICAgcmV0dXJuIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfc24pO1xuICAgICAgICB9XG4gICAgICAgIGFkZEhpZ2hsaWdodEFyZWEoKSB7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFyZWFcIik7XG4gICAgICAgIH1cbiAgICAgICAgX2Rvd25sb2FkKCkge1xuICAgICAgICAgIHZhciBfdGhpcyRkb3dubG9hZE1hbmFnZXIyO1xuICAgICAgICAgIChfdGhpcyRkb3dubG9hZE1hbmFnZXIyID0gdGhpcy5kb3dubG9hZE1hbmFnZXIpID09PSBudWxsIHx8IF90aGlzJGRvd25sb2FkTWFuYWdlcjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGRvd25sb2FkTWFuYWdlcjIub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGFpbmVyLCB0aGlzLmNvbnRlbnQsIHRoaXMuZmlsZW5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLkFubm90YXRpb25MYXllciA9IChfcmUyID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCksIF9hbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha01hcCgpLCBfb24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKSwgX2xuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCksIF9jbiA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpLCBjbGFzcyBBbm5vdGF0aW9uTGF5ZXIge1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDE2KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9jbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9sbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3JlMiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9hbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9vbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IE1hcCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGV0IHtcbiAgICAgICAgICAgIGRpdjogX2UxNCxcbiAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyOiBfbjgsXG4gICAgICAgICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwOiBfaTUsXG4gICAgICAgICAgICBsMTBuOiBfcjUsXG4gICAgICAgICAgICBwYWdlOiBzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IGFcbiAgICAgICAgICB9ID0gX3QxNjtcbiAgICAgICAgICB0aGlzLmRpdiA9IF9lMTQ7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9yZTIsIF9uOCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9hbiwgX2k1KTtcbiAgICAgICAgICB0aGlzLmwxMG4gPSBfcjU7XG4gICAgICAgICAgdGhpcy5wYWdlID0gcztcbiAgICAgICAgICB0aGlzLnZpZXdwb3J0ID0gYTtcbiAgICAgICAgICB0aGlzLnpJbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5sMTBuIHx8ICh0aGlzLmwxMG4gPSBvLk51bGxMMTBuKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyByZW5kZXIodCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbnM6IGVcbiAgICAgICAgICAgIH0gPSB0LFxuICAgICAgICAgICAgbiA9IHRoaXMuZGl2O1xuICAgICAgICAgICgwLCByLnNldExheWVyRGltZW5zaW9ucykobiwgdGhpcy52aWV3cG9ydCk7XG4gICAgICAgICAgY29uc3QgYSA9IG5ldyBNYXAoKSxcbiAgICAgICAgICAgIG8gPSB7XG4gICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgIGxheWVyOiBuLFxuICAgICAgICAgICAgICBsaW5rU2VydmljZTogdC5saW5rU2VydmljZSxcbiAgICAgICAgICAgICAgZG93bmxvYWRNYW5hZ2VyOiB0LmRvd25sb2FkTWFuYWdlcixcbiAgICAgICAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiB0LmltYWdlUmVzb3VyY2VzUGF0aCB8fCBcIlwiLFxuICAgICAgICAgICAgICByZW5kZXJGb3JtczogITEgIT09IHQucmVuZGVyRm9ybXMsXG4gICAgICAgICAgICAgIHN2Z0ZhY3Rvcnk6IG5ldyByLkRPTVNWR0ZhY3RvcnkoKSxcbiAgICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IHQuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbmV3IHMuQW5ub3RhdGlvblN0b3JhZ2UoKSxcbiAgICAgICAgICAgICAgZW5hYmxlU2NyaXB0aW5nOiAhMCA9PT0gdC5lbmFibGVTY3JpcHRpbmcsXG4gICAgICAgICAgICAgIGhhc0pTQWN0aW9uczogdC5oYXNKU0FjdGlvbnMsXG4gICAgICAgICAgICAgIGZpZWxkT2JqZWN0czogdC5maWVsZE9iamVjdHMsXG4gICAgICAgICAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgICAgICAgICAgZWxlbWVudHM6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIGUpIHtcbiAgICAgICAgICAgIGlmICh0Lm5vSFRNTCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlID0gdC5hbm5vdGF0aW9uVHlwZSA9PT0gaS5Bbm5vdGF0aW9uVHlwZS5QT1BVUDtcbiAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBhLmdldCh0LmlkKTtcbiAgICAgICAgICAgICAgaWYgKCFlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgby5lbGVtZW50cyA9IGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGUsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBuXG4gICAgICAgICAgICAgIH0gPSBnZXRSZWN0RGltcyh0LnJlY3QpO1xuICAgICAgICAgICAgICBpZiAoZSA8PSAwIHx8IG4gPD0gMCkgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvLmRhdGEgPSB0O1xuICAgICAgICAgICAgY29uc3QgbiA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUobyk7XG4gICAgICAgICAgICBpZiAoIW4uaXNSZW5kZXJhYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZSAmJiB0LnBvcHVwUmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGUgPSBhLmdldCh0LnBvcHVwUmVmKTtcbiAgICAgICAgICAgICAgZSA/IGUucHVzaChuKSA6IGEuc2V0KHQucG9wdXBSZWYsIFtuXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuLmFubm90YXRpb25FZGl0b3JUeXBlID4gMCAmJiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29uKS5zZXQobi5kYXRhLmlkLCBuKTtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBuLnJlbmRlcigpO1xuICAgICAgICAgICAgdC5oaWRkZW4gJiYgKHIuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfbG4sIF9sbjIpLmNhbGwodGhpcywgciwgdC5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2NuLCBfY24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIGF3YWl0IHRoaXMubDEwbi50cmFuc2xhdGUobik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgdmlld3BvcnQ6IGVcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy5kaXY7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydCA9IGU7XG4gICAgICAgICAgKDAsIHIuc2V0TGF5ZXJEaW1lbnNpb25zKShuLCB7XG4gICAgICAgICAgICByb3RhdGlvbjogZS5yb3RhdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2NuLCBfY24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIG4uaGlkZGVuID0gITE7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdGFibGVBbm5vdGF0aW9ucygpIHtcbiAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX29uKS52YWx1ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0RWRpdGFibGVBbm5vdGF0aW9uKHQpIHtcbiAgICAgICAgICByZXR1cm4gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9vbikuZ2V0KHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGZ1bmN0aW9uIF9sbjIodCwgZSkge1xuICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTQ7XG4gICAgICAgIGNvbnN0IG4gPSB0LmZpcnN0Q2hpbGQgfHwgdDtcbiAgICAgICAgbi5pZCA9IFwiXCIuY29uY2F0KHIuQW5ub3RhdGlvblByZWZpeCkuY29uY2F0KGUpO1xuICAgICAgICB0aGlzLmRpdi5hcHBlbmQodCk7XG4gICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQxNCA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfcmUyKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDE0Lm1vdmVFbGVtZW50SW5ET00odGhpcy5kaXYsIHQsIG4sICExKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9jbjIoKSB7XG4gICAgICAgIGlmICghX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9hbikpIHJldHVybjtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuZGl2O1xuICAgICAgICBmb3IgKGNvbnN0IFtlLCBuXSBvZiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FuKSkge1xuICAgICAgICAgIGNvbnN0IGkgPSB0LnF1ZXJ5U2VsZWN0b3IoXCJbZGF0YS1hbm5vdGF0aW9uLWlkPVxcXCJcIi5jb25jYXQoZSwgXCJcXFwiXVwiKSk7XG4gICAgICAgICAgaWYgKCFpKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmaXJzdENoaWxkOiByXG4gICAgICAgICAgfSA9IGk7XG4gICAgICAgICAgciA/IFwiQ0FOVkFTXCIgPT09IHIubm9kZU5hbWUgPyByLnJlcGxhY2VXaXRoKG4pIDogci5iZWZvcmUobikgOiBpLmFwcGVuZChuKTtcbiAgICAgICAgfVxuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2FuKS5jbGVhcigpO1xuICAgICAgfVxuICAgIH0sICh0LCBlKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLkNvbG9yQ29udmVydGVycyA9IHZvaWQgMDtcbiAgICAgIGZ1bmN0aW9uIG1ha2VDb2xvckNvbXAodCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigyNTUgKiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSkpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIik7XG4gICAgICB9XG4gICAgICBlLkNvbG9yQ29udmVydGVycyA9IGNsYXNzIENvbG9yQ29udmVydGVycyB7XG4gICAgICAgIHN0YXRpYyBDTVlLX0codCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaSwgcl0gPSB0O1xuICAgICAgICAgIHJldHVybiBbXCJHXCIsIDEgLSBNYXRoLm1pbigxLCAuMyAqIGUgKyAuNTkgKiBpICsgLjExICogbiArIHIpXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgR19DTVlLKHQpIHtcbiAgICAgICAgICBsZXQgW2VdID0gdDtcbiAgICAgICAgICByZXR1cm4gW1wiQ01ZS1wiLCAwLCAwLCAwLCAxIC0gZV07XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIEdfUkdCKHQpIHtcbiAgICAgICAgICBsZXQgW2VdID0gdDtcbiAgICAgICAgICByZXR1cm4gW1wiUkdCXCIsIGUsIGUsIGVdO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBHX0hUTUwodCkge1xuICAgICAgICAgIGxldCBbZV0gPSB0O1xuICAgICAgICAgIGNvbnN0IG4gPSBtYWtlQ29sb3JDb21wKGUpO1xuICAgICAgICAgIHJldHVybiBcIiNcIi5jb25jYXQobikuY29uY2F0KG4pLmNvbmNhdChuKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgUkdCX0codCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaV0gPSB0O1xuICAgICAgICAgIHJldHVybiBbXCJHXCIsIC4zICogZSArIC41OSAqIG4gKyAuMTEgKiBpXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgUkdCX0hUTUwodCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaV0gPSB0O1xuICAgICAgICAgIHJldHVybiBcIiNcIi5jb25jYXQobWFrZUNvbG9yQ29tcChlKSkuY29uY2F0KG1ha2VDb2xvckNvbXAobikpLmNvbmNhdChtYWtlQ29sb3JDb21wKGkpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgVF9IVE1MKCkge1xuICAgICAgICAgIHJldHVybiBcIiMwMDAwMDAwMFwiO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBDTVlLX1JHQih0KSB7XG4gICAgICAgICAgbGV0IFtlLCBuLCBpLCByXSA9IHQ7XG4gICAgICAgICAgcmV0dXJuIFtcIlJHQlwiLCAxIC0gTWF0aC5taW4oMSwgZSArIHIpLCAxIC0gTWF0aC5taW4oMSwgaSArIHIpLCAxIC0gTWF0aC5taW4oMSwgbiArIHIpXTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgQ01ZS19IVE1MKHQpIHtcbiAgICAgICAgICBjb25zdCBlID0gdGhpcy5DTVlLX1JHQih0KS5zbGljZSgxKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5SR0JfSFRNTChlKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgUkdCX0NNWUsodCkge1xuICAgICAgICAgIGxldCBbZSwgbiwgaV0gPSB0O1xuICAgICAgICAgIGNvbnN0IHIgPSAxIC0gZSxcbiAgICAgICAgICAgIHMgPSAxIC0gbixcbiAgICAgICAgICAgIGEgPSAxIC0gaTtcbiAgICAgICAgICByZXR1cm4gW1wiQ01ZS1wiLCByLCBzLCBhLCBNYXRoLm1pbihyLCBzLCBhKV07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSwgKHQsIGUpID0+IHtcbiAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgICAgdmFsdWU6ICEwXG4gICAgICB9KTtcbiAgICAgIGUuTnVsbEwxMG4gPSB2b2lkIDA7XG4gICAgICBlLmdldEwxMG5GYWxsYmFjayA9IGdldEwxMG5GYWxsYmFjaztcbiAgICAgIGNvbnN0IG4gPSB7XG4gICAgICAgIG9mX3BhZ2VzOiBcIm9mIHt7cGFnZXNDb3VudH19XCIsXG4gICAgICAgIHBhZ2Vfb2ZfcGFnZXM6IFwiKHt7cGFnZU51bWJlcn19IG9mIHt7cGFnZXNDb3VudH19KVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2tiOiBcInt7c2l6ZV9rYn19IEtCICh7e3NpemVfYn19IGJ5dGVzKVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX21iOiBcInt7c2l6ZV9tYn19IE1CICh7e3NpemVfYn19IGJ5dGVzKVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2RhdGVfc3RyaW5nOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV91bml0X2luY2hlczogXCJpblwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV91bml0X21pbGxpbWV0ZXJzOiBcIm1tXCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX29yaWVudGF0aW9uX3BvcnRyYWl0OiBcInBvcnRyYWl0XCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX29yaWVudGF0aW9uX2xhbmRzY2FwZTogXCJsYW5kc2NhcGVcIixcbiAgICAgICAgZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfbmFtZV9hMzogXCJBM1wiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9uYW1lX2E0OiBcIkE0XCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX25hbWVfbGV0dGVyOiBcIkxldHRlclwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX3BhZ2Vfc2l6ZV9uYW1lX2xlZ2FsOiBcIkxlZ2FsXCIsXG4gICAgICAgIGRvY3VtZW50X3Byb3BlcnRpZXNfcGFnZV9zaXplX2RpbWVuc2lvbl9zdHJpbmc6IFwie3t3aWR0aH19IMOXIHt7aGVpZ2h0fX0ge3t1bml0fX0gKHt7b3JpZW50YXRpb259fSlcIixcbiAgICAgICAgZG9jdW1lbnRfcHJvcGVydGllc19wYWdlX3NpemVfZGltZW5zaW9uX25hbWVfc3RyaW5nOiBcInt7d2lkdGh9fSDDlyB7e2hlaWdodH19IHt7dW5pdH19ICh7e25hbWV9fSwge3tvcmllbnRhdGlvbn19KVwiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2xpbmVhcml6ZWRfeWVzOiBcIlllc1wiLFxuICAgICAgICBkb2N1bWVudF9wcm9wZXJ0aWVzX2xpbmVhcml6ZWRfbm86IFwiTm9cIixcbiAgICAgICAgYWRkaXRpb25hbF9sYXllcnM6IFwiQWRkaXRpb25hbCBMYXllcnNcIixcbiAgICAgICAgcGFnZV9sYW5kbWFyazogXCJQYWdlIHt7cGFnZX19XCIsXG4gICAgICAgIHRodW1iX3BhZ2VfdGl0bGU6IFwiUGFnZSB7e3BhZ2V9fVwiLFxuICAgICAgICB0aHVtYl9wYWdlX2NhbnZhczogXCJUaHVtYm5haWwgb2YgUGFnZSB7e3BhZ2V9fVwiLFxuICAgICAgICBmaW5kX3JlYWNoZWRfdG9wOiBcIlJlYWNoZWQgdG9wIG9mIGRvY3VtZW50LCBjb250aW51ZWQgZnJvbSBib3R0b21cIixcbiAgICAgICAgZmluZF9yZWFjaGVkX2JvdHRvbTogXCJSZWFjaGVkIGVuZCBvZiBkb2N1bWVudCwgY29udGludWVkIGZyb20gdG9wXCIsXG4gICAgICAgIFwiZmluZF9tYXRjaF9jb3VudFtvbmVdXCI6IFwie3tjdXJyZW50fX0gb2Yge3t0b3RhbH19IG1hdGNoXCIsXG4gICAgICAgIFwiZmluZF9tYXRjaF9jb3VudFtvdGhlcl1cIjogXCJ7e2N1cnJlbnR9fSBvZiB7e3RvdGFsfX0gbWF0Y2hlc1wiLFxuICAgICAgICBcImZpbmRfbWF0Y2hfY291bnRfbGltaXRbb25lXVwiOiBcIk1vcmUgdGhhbiB7e2xpbWl0fX0gbWF0Y2hcIixcbiAgICAgICAgXCJmaW5kX21hdGNoX2NvdW50X2xpbWl0W290aGVyXVwiOiBcIk1vcmUgdGhhbiB7e2xpbWl0fX0gbWF0Y2hlc1wiLFxuICAgICAgICBmaW5kX25vdF9mb3VuZDogXCJQaHJhc2Ugbm90IGZvdW5kXCIsXG4gICAgICAgIHBhZ2Vfc2NhbGVfd2lkdGg6IFwiUGFnZSBXaWR0aFwiLFxuICAgICAgICBwYWdlX3NjYWxlX2ZpdDogXCJQYWdlIEZpdFwiLFxuICAgICAgICBwYWdlX3NjYWxlX2F1dG86IFwiQXV0b21hdGljIFpvb21cIixcbiAgICAgICAgcGFnZV9zY2FsZV9hY3R1YWw6IFwiQWN0dWFsIFNpemVcIixcbiAgICAgICAgcGFnZV9zY2FsZV9wZXJjZW50OiBcInt7c2NhbGV9fSVcIixcbiAgICAgICAgbG9hZGluZ19lcnJvcjogXCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBQREYuXCIsXG4gICAgICAgIGludmFsaWRfZmlsZV9lcnJvcjogXCJJbnZhbGlkIG9yIGNvcnJ1cHRlZCBQREYgZmlsZS5cIixcbiAgICAgICAgbWlzc2luZ19maWxlX2Vycm9yOiBcIk1pc3NpbmcgUERGIGZpbGUuXCIsXG4gICAgICAgIHVuZXhwZWN0ZWRfcmVzcG9uc2VfZXJyb3I6IFwiVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UuXCIsXG4gICAgICAgIHJlbmRlcmluZ19lcnJvcjogXCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZW5kZXJpbmcgdGhlIHBhZ2UuXCIsXG4gICAgICAgIGFubm90YXRpb25fZGF0ZV9zdHJpbmc6IFwie3tkYXRlfX0sIHt7dGltZX19XCIsXG4gICAgICAgIHByaW50aW5nX25vdF9zdXBwb3J0ZWQ6IFwiV2FybmluZzogUHJpbnRpbmcgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXCIsXG4gICAgICAgIHByaW50aW5nX25vdF9yZWFkeTogXCJXYXJuaW5nOiBUaGUgUERGIGlzIG5vdCBmdWxseSBsb2FkZWQgZm9yIHByaW50aW5nLlwiLFxuICAgICAgICB3ZWJfZm9udHNfZGlzYWJsZWQ6IFwiV2ViIGZvbnRzIGFyZSBkaXNhYmxlZDogdW5hYmxlIHRvIHVzZSBlbWJlZGRlZCBQREYgZm9udHMuXCIsXG4gICAgICAgIGZyZWVfdGV4dDJfZGVmYXVsdF9jb250ZW50OiBcIlN0YXJ0IHR5cGluZ+KAplwiLFxuICAgICAgICBlZGl0b3JfZnJlZV90ZXh0Ml9hcmlhX2xhYmVsOiBcIlRleHQgRWRpdG9yXCIsXG4gICAgICAgIGVkaXRvcl9pbmsyX2FyaWFfbGFiZWw6IFwiRHJhdyBFZGl0b3JcIixcbiAgICAgICAgZWRpdG9yX2lua19jYW52YXNfYXJpYV9sYWJlbDogXCJVc2VyLWNyZWF0ZWQgaW1hZ2VcIixcbiAgICAgICAgcHJpbnRfcHJvZ3Jlc3NfcGVyY2VudDogXCJ7e3Byb2dyZXNzfX0lXCJcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBnZXRMMTBuRmFsbGJhY2sodCwgZSkge1xuICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICBjYXNlIFwiZmluZF9tYXRjaF9jb3VudFwiOlxuICAgICAgICAgICAgdCA9IFwiZmluZF9tYXRjaF9jb3VudFtcIi5jb25jYXQoMSA9PT0gZS50b3RhbCA/IFwib25lXCIgOiBcIm90aGVyXCIsIFwiXVwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJmaW5kX21hdGNoX2NvdW50X2xpbWl0XCI6XG4gICAgICAgICAgICB0ID0gXCJmaW5kX21hdGNoX2NvdW50X2xpbWl0W1wiLmNvbmNhdCgxID09PSBlLmxpbWl0ID8gXCJvbmVcIiA6IFwib3RoZXJcIiwgXCJdXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuW3RdIHx8IFwiXCI7XG4gICAgICB9XG4gICAgICBjb25zdCBpID0ge1xuICAgICAgICBnZXRMYW5ndWFnZTogYXN5bmMgKCkgPT4gXCJlbi11c1wiLFxuICAgICAgICBnZXREaXJlY3Rpb246IGFzeW5jICgpID0+IFwibHRyXCIsXG4gICAgICAgIGFzeW5jIGdldCh0KSB7XG4gICAgICAgICAgbGV0IGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZvcm1hdEwxMG5WYWx1ZSh0LCBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZSA/IHQucmVwbGFjZUFsbCgvXFx7XFx7XFxzKihcXHcrKVxccypcXH1cXH0vZywgKHQsIG4pID0+IG4gaW4gZSA/IGVbbl0gOiBcInt7XCIgKyBuICsgXCJ9fVwiKSA6IHQ7XG4gICAgICAgICAgfShhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IGdldEwxMG5GYWxsYmFjayh0LCBlKSwgZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHRyYW5zbGF0ZSh0KSB7fVxuICAgICAgfTtcbiAgICAgIGUuTnVsbEwxMG4gPSBpO1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLlhmYUxheWVyID0gdm9pZCAwO1xuICAgICAgbig4OSk7XG4gICAgICB2YXIgaSA9IG4oMTkzKTtcbiAgICAgIGUuWGZhTGF5ZXIgPSBjbGFzcyBYZmFMYXllciB7XG4gICAgICAgIHN0YXRpYyBzZXR1cFN0b3JhZ2UodCwgZSwgbiwgaSwgcikge1xuICAgICAgICAgIGNvbnN0IHMgPSBpLmdldFZhbHVlKGUsIHtcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3dpdGNoIChuLm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgICAgICBudWxsICE9PSBzLnZhbHVlICYmICh0LnRleHRDb250ZW50ID0gcy52YWx1ZSk7XG4gICAgICAgICAgICAgIGlmIChcInByaW50XCIgPT09IHIpIGJyZWFrO1xuICAgICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0ID0+IHtcbiAgICAgICAgICAgICAgICBpLnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICAgICAgaWYgKFwicmFkaW9cIiA9PT0gbi5hdHRyaWJ1dGVzLnR5cGUgfHwgXCJjaGVja2JveFwiID09PSBuLmF0dHJpYnV0ZXMudHlwZSkge1xuICAgICAgICAgICAgICAgIHMudmFsdWUgPT09IG4uYXR0cmlidXRlcy54ZmFPbiA/IHQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCAhMCkgOiBzLnZhbHVlID09PSBuLmF0dHJpYnV0ZXMueGZhT2ZmICYmIHQucmVtb3ZlQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoXCJwcmludFwiID09PSByKSBicmVhaztcbiAgICAgICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdCA9PiB7XG4gICAgICAgICAgICAgICAgICBpLnNldFZhbHVlKGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQudGFyZ2V0LmNoZWNrZWQgPyB0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ4ZmFPblwiKSA6IHQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInhmYU9mZlwiKVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcy52YWx1ZSAmJiB0LnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIHMudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChcInByaW50XCIgPT09IHIpIGJyZWFrO1xuICAgICAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgICAgaS5zZXRWYWx1ZShlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgICAgICAgIGlmIChudWxsICE9PSBzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBzLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHQgb2Ygbi5jaGlsZHJlbikgdC5hdHRyaWJ1dGVzLnZhbHVlID09PSBzLnZhbHVlID8gdC5hdHRyaWJ1dGVzLnNlbGVjdGVkID0gITAgOiB0LmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoXCJzZWxlY3RlZFwiKSAmJiBkZWxldGUgdC5hdHRyaWJ1dGVzLnNlbGVjdGVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LnRhcmdldC5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgciA9IC0xID09PSBuLnNlbGVjdGVkSW5kZXggPyBcIlwiIDogbltuLnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuICAgICAgICAgICAgICAgIGkuc2V0VmFsdWUoZSwge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IHJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBzZXRBdHRyaWJ1dGVzKHQpIHtcbiAgICAgICAgICBsZXQge1xuICAgICAgICAgICAgaHRtbDogZSxcbiAgICAgICAgICAgIGVsZW1lbnQ6IG4sXG4gICAgICAgICAgICBzdG9yYWdlOiBpID0gbnVsbCxcbiAgICAgICAgICAgIGludGVudDogcixcbiAgICAgICAgICAgIGxpbmtTZXJ2aWNlOiBzXG4gICAgICAgICAgfSA9IHQ7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBhXG4gICAgICAgICAgICB9ID0gbixcbiAgICAgICAgICAgIG8gPSBlIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgICAgICAgXCJyYWRpb1wiID09PSBhLnR5cGUgJiYgKGEubmFtZSA9IFwiXCIuY29uY2F0KGEubmFtZSwgXCItXCIpLmNvbmNhdChyKSk7XG4gICAgICAgICAgZm9yIChjb25zdCBbdCwgbl0gb2YgT2JqZWN0LmVudHJpZXMoYSkpIGlmIChudWxsICE9IG4pIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgY2FzZSBcImNsYXNzXCI6XG4gICAgICAgICAgICAgIG4ubGVuZ3RoICYmIGUuc2V0QXR0cmlidXRlKHQsIG4uam9pbihcIiBcIikpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkYXRhSWRcIjpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiaWRcIjpcbiAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZS5zdHlsZSwgbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInRleHRDb250ZW50XCI6XG4gICAgICAgICAgICAgIGUudGV4dENvbnRlbnQgPSBuO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICghbyB8fCBcImhyZWZcIiAhPT0gdCAmJiBcIm5ld1dpbmRvd1wiICE9PSB0KSAmJiBlLnNldEF0dHJpYnV0ZSh0LCBuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbyAmJiBzLmFkZExpbmtBdHRyaWJ1dGVzKGUsIGEuaHJlZiwgYS5uZXdXaW5kb3cpO1xuICAgICAgICAgIGkgJiYgYS5kYXRhSWQgJiYgdGhpcy5zZXR1cFN0b3JhZ2UoZSwgYS5kYXRhSWQsIG4sIGkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyByZW5kZXIodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSB0LmFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgbiA9IHQubGlua1NlcnZpY2UsXG4gICAgICAgICAgICByID0gdC54ZmFIdG1sLFxuICAgICAgICAgICAgcyA9IHQuaW50ZW50IHx8IFwiZGlzcGxheVwiLFxuICAgICAgICAgICAgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoci5uYW1lKTtcbiAgICAgICAgICByLmF0dHJpYnV0ZXMgJiYgdGhpcy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgIGh0bWw6IGEsXG4gICAgICAgICAgICBlbGVtZW50OiByLFxuICAgICAgICAgICAgaW50ZW50OiBzLFxuICAgICAgICAgICAgbGlua1NlcnZpY2U6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBvID0gW1tyLCAtMSwgYV1dLFxuICAgICAgICAgICAgbCA9IHQuZGl2O1xuICAgICAgICAgIGwuYXBwZW5kKGEpO1xuICAgICAgICAgIGlmICh0LnZpZXdwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBlID0gXCJtYXRyaXgoXCIuY29uY2F0KHQudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oXCIsXCIpLCBcIilcIik7XG4gICAgICAgICAgICBsLnN0eWxlLnRyYW5zZm9ybSA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIFwicmljaFRleHRcIiAhPT0gcyAmJiBsLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwieGZhTGF5ZXIgeGZhRm9udFwiKTtcbiAgICAgICAgICBjb25zdCBjID0gW107XG4gICAgICAgICAgZm9yICg7IG8ubGVuZ3RoID4gMDspIHtcbiAgICAgICAgICAgIHZhciBfbCRhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgY29uc3QgW3QsIHIsIGFdID0gby5hdCgtMSk7XG4gICAgICAgICAgICBpZiAociArIDEgPT09IHQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIG8ucG9wKCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbCA9IHQuY2hpbGRyZW5bKytvLmF0KC0xKVsxXV07XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gbCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIG5hbWU6IGhcbiAgICAgICAgICAgIH0gPSBsO1xuICAgICAgICAgICAgaWYgKFwiI3RleHRcIiA9PT0gaCkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobC52YWx1ZSk7XG4gICAgICAgICAgICAgIGMucHVzaCh0KTtcbiAgICAgICAgICAgICAgYS5hcHBlbmQodCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZCA9IGwgIT09IG51bGwgJiYgbCAhPT0gdm9pZCAwICYmIChfbCRhdHRyaWJ1dGVzID0gbC5hdHRyaWJ1dGVzKSAhPT0gbnVsbCAmJiBfbCRhdHRyaWJ1dGVzICE9PSB2b2lkIDAgJiYgX2wkYXR0cmlidXRlcy54bWxucyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhsLmF0dHJpYnV0ZXMueG1sbnMsIGgpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChoKTtcbiAgICAgICAgICAgIGEuYXBwZW5kKGQpO1xuICAgICAgICAgICAgbC5hdHRyaWJ1dGVzICYmIHRoaXMuc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIGh0bWw6IGQsXG4gICAgICAgICAgICAgIGVsZW1lbnQ6IGwsXG4gICAgICAgICAgICAgIHN0b3JhZ2U6IGUsXG4gICAgICAgICAgICAgIGludGVudDogcyxcbiAgICAgICAgICAgICAgbGlua1NlcnZpY2U6IG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGwuY2hpbGRyZW4gJiYgbC5jaGlsZHJlbi5sZW5ndGggPiAwKSBvLnB1c2goW2wsIC0xLCBkXSk7ZWxzZSBpZiAobC52YWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobC52YWx1ZSk7XG4gICAgICAgICAgICAgIGkuWGZhVGV4dC5zaG91bGRCdWlsZFRleHQoaCkgJiYgYy5wdXNoKHQpO1xuICAgICAgICAgICAgICBkLmFwcGVuZCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB0IG9mIGwucXVlcnlTZWxlY3RvckFsbChcIi54ZmFOb25JbnRlcmFjdGl2ZSBpbnB1dCwgLnhmYU5vbkludGVyYWN0aXZlIHRleHRhcmVhXCIpKSB0LnNldEF0dHJpYnV0ZShcInJlYWRPbmx5XCIsICEwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dERpdnM6IGNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB1cGRhdGUodCkge1xuICAgICAgICAgIGNvbnN0IGUgPSBcIm1hdHJpeChcIi5jb25jYXQodC52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIiksIFwiKVwiKTtcbiAgICAgICAgICB0LmRpdi5zdHlsZS50cmFuc2Zvcm0gPSBlO1xuICAgICAgICAgIHQuZGl2LmhpZGRlbiA9ICExO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sICh0LCBlLCBuKSA9PiB7XG4gICAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgICAgdmFyIF9jbGFzczQxO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICAgIHZhbHVlOiAhMFxuICAgICAgfSk7XG4gICAgICBlLklua0VkaXRvciA9IHZvaWQgMDtcbiAgICAgIG4oODkpO1xuICAgICAgbigyKTtcbiAgICAgIHZhciBpID0gbigxKSxcbiAgICAgICAgciA9IG4oMTYzKSxcbiAgICAgICAgcyA9IG4oMTk3KSxcbiAgICAgICAgYSA9IG4oMTY0KTtcbiAgICAgIHZhciBfaG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfcG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfZ24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfYm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfQW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbjkgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfU24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfRW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfeG4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfd24gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIHZhciBfUGUzID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0NuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0ZuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0luID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0RuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0xuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0JuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2puID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX09uID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX05uID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1VuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1BuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0huID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2tuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX01uID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1JuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3FuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX3puID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1huID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX0tuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1duID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX1RuID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICBjbGFzcyBJbmtFZGl0b3IgZXh0ZW5kcyByLkFubm90YXRpb25FZGl0b3Ige1xuICAgICAgICBjb25zdHJ1Y3RvcihfdDE3KSB7XG4gICAgICAgICAgc3VwZXIoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdDE3KSwge30sIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaW5rRWRpdG9yXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ubik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Xbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Lbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ybik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF96bik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9xbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Sbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Nbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9rbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ibik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Qbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Vbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Obik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Pbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9qbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Cbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Mbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Ebik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Jbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Gbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9Dbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9QZTMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfd24pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9obiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9kbiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF91biwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5jYW52YXNDb250ZXh0TWVudS5iaW5kKHRoaXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3BuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNhbnZhc1BvaW50ZXJtb3ZlLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY2FudmFzUG9pbnRlcmxlYXZlLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfZ24sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY2FudmFzUG9pbnRlcnVwLmJpbmQodGhpcylcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY2FudmFzUG9pbnRlcmRvd24uYmluZCh0aGlzKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF9ibiwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IFBhdGgyRCgpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3ZuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEluaXRTcGVjKHRoaXMsIF95biwge1xuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogITFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfQW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICExXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX245LCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX1NuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX0VuLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX3huLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jb2xvciA9IF90MTcuY29sb3IgfHwgbnVsbDtcbiAgICAgICAgICB0aGlzLnRoaWNrbmVzcyA9IF90MTcudGhpY2tuZXNzIHx8IG51bGw7XG4gICAgICAgICAgdGhpcy5vcGFjaXR5ID0gX3QxNy5vcGFjaXR5IHx8IG51bGw7XG4gICAgICAgICAgdGhpcy5wYXRocyA9IFtdO1xuICAgICAgICAgIHRoaXMuYmV6aWVyUGF0aDJEID0gW107XG4gICAgICAgICAgdGhpcy5hbGxSYXdQYXRocyA9IFtdO1xuICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBbXTtcbiAgICAgICAgICB0aGlzLnNjYWxlRmFjdG9yID0gMTtcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IHRoaXMudHJhbnNsYXRpb25ZID0gMDtcbiAgICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgICAgdGhpcy5fd2lsbEtlZXBBc3BlY3RSYXRpbyA9ICEwO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBpbml0aWFsaXplKHQpIHtcbiAgICAgICAgICB0aGlzLl9sMTBuUHJvbWlzZSA9IG5ldyBNYXAoW1wiZWRpdG9yX2lua19jYW52YXNfYXJpYV9sYWJlbFwiLCBcImVkaXRvcl9pbmsyX2FyaWFfbGFiZWxcIl0ubWFwKGUgPT4gW2UsIHQuZ2V0KGUpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHQsIGUpIHtcbiAgICAgICAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTOlxuICAgICAgICAgICAgICBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3MgPSBlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgICAgICAgIElua0VkaXRvci5fZGVmYXVsdENvbG9yID0gZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG4gICAgICAgICAgICAgIElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkgPSBlIC8gMTAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVQYXJhbXModCwgZSkge1xuICAgICAgICAgIHN3aXRjaCAodCkge1xuICAgICAgICAgICAgY2FzZSBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3duLCBfd24yKS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BlMywgX1BlNCkuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0NuLCBfQ24yKS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG4gICAgICAgICAgcmV0dXJuIFtbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsIElua0VkaXRvci5fZGVmYXVsdENvbG9yIHx8IHIuQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcl0sIFtpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLCBNYXRoLnJvdW5kKDEwMCAqIElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkpXV07XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMkb3BhY2l0eTtcbiAgICAgICAgICByZXR1cm4gW1tpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsIHRoaXMudGhpY2tuZXNzIHx8IElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzc10sIFtpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUiwgdGhpcy5jb2xvciB8fCBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCByLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdLCBbaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSwgTWF0aC5yb3VuZCgxMDAgKiAoKF90aGlzJG9wYWNpdHkgPSB0aGlzLm9wYWNpdHkpICE9PSBudWxsICYmIF90aGlzJG9wYWNpdHkgIT09IHZvaWQgMCA/IF90aGlzJG9wYWNpdHkgOiBJbmtFZGl0b3IuX2RlZmF1bHRPcGFjaXR5KSldXTtcbiAgICAgICAgfVxuICAgICAgICByZWJ1aWxkKCkge1xuICAgICAgICAgIHN1cGVyLnJlYnVpbGQoKTtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gdGhpcy5kaXYpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24sIF9rbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX01uLCBfTW4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuICAgICAgICAgICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1JuLCBfUm4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVG4sIF9UbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlbW92ZSgpIHtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSgpIHx8IHRoaXMuY29tbWl0KCk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbjkpLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbjksIG51bGwpO1xuICAgICAgICAgICAgc3VwZXIucmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldFBhcmVudCh0KSB7XG4gICAgICAgICAgIXRoaXMucGFyZW50ICYmIHQgPyB0aGlzLl91aU1hbmFnZXIucmVtb3ZlU2hvdWxkUmVzY2FsZSh0aGlzKSA6IHRoaXMucGFyZW50ICYmIG51bGwgPT09IHQgJiYgdGhpcy5fdWlNYW5hZ2VyLmFkZFNob3VsZFJlc2NhbGUodGhpcyk7XG4gICAgICAgICAgc3VwZXIuc2V0UGFyZW50KHQpO1xuICAgICAgICB9XG4gICAgICAgIG9uU2NhbGVDaGFuZ2luZygpIHtcbiAgICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnMsXG4gICAgICAgICAgICBuID0gdGhpcy53aWR0aCAqIHQsXG4gICAgICAgICAgICBpID0gdGhpcy5oZWlnaHQgKiBlO1xuICAgICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucyhuLCBpKTtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVFZGl0TW9kZSgpIHtcbiAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdm4pICYmIG51bGwgIT09IHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICBzdXBlci5lbmFibGVFZGl0TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gITE7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkaXNhYmxlRWRpdE1vZGUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbkVkaXRNb2RlKCkgJiYgbnVsbCAhPT0gdGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHN1cGVyLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuICAgICAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LnJlbW92ZShcImVkaXRpbmdcIik7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbmNlQWRkZWQoKSB7XG4gICAgICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzRW1wdHkoKSB7XG4gICAgICAgICAgcmV0dXJuIDAgPT09IHRoaXMucGF0aHMubGVuZ3RoIHx8IDEgPT09IHRoaXMucGF0aHMubGVuZ3RoICYmIDAgPT09IHRoaXMucGF0aHNbMF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1pdCgpIHtcbiAgICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdm4pKSB7XG4gICAgICAgICAgICBzdXBlci5jb21taXQoKTtcbiAgICAgICAgICAgIHRoaXMuaXNFZGl0aW5nID0gITE7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVFZGl0TW9kZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfdm4sICEwKTtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RuLCBfVG4yKS5jYWxsKHRoaXMsICEwKTtcbiAgICAgICAgICAgIHRoaXMubWFrZVJlc2l6YWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkSW5rRWRpdG9ySWZOZWVkZWQoITApO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQubW92ZUVkaXRvckluRE9NKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kaXYuZm9jdXMoe1xuICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiAhMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvY3VzaW4odCkge1xuICAgICAgICAgIHN1cGVyLmZvY3VzaW4odCk7XG4gICAgICAgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJkb3duKHQpIHtcbiAgICAgICAgICBpZiAoMCA9PT0gdC5idXR0b24gJiYgdGhpcy5pc0luRWRpdE1vZGUoKSAmJiAhX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF92bikpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7XG4gICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBcIm1vdXNlXCIgIT09IHQudHlwZSAmJiB0aGlzLmRpdi5mb2N1cygpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRG4sIF9EbjIpLmNhbGwodGhpcywgdC5vZmZzZXRYLCB0Lm9mZnNldFkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYW52YXNDb250ZXh0TWVudSh0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJtb3ZlKHQpIHtcbiAgICAgICAgICB0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTG4sIF9MbjIpLmNhbGwodGhpcywgdC5vZmZzZXRYLCB0Lm9mZnNldFkpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJ1cCh0KSB7XG4gICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX0huLCBfSG4yKS5jYWxsKHRoaXMsIHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhbnZhc1BvaW50ZXJsZWF2ZSh0KSB7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfSG4sIF9IbjIpLmNhbGwodGhpcywgdCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgICAgICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCkgJiYgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF92bik7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCkge1xuICAgICAgICAgIGlmICh0aGlzLmRpdikgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICAgIGxldCB0LCBlO1xuICAgICAgICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICB0ID0gdGhpcy54O1xuICAgICAgICAgICAgZSA9IHRoaXMueTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VwZXIucmVuZGVyKCk7XG4gICAgICAgICAgSW5rRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoXCJlZGl0b3JfaW5rMl9hcmlhX2xhYmVsXCIpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICB2YXIgX3RoaXMkZGl2NjtcbiAgICAgICAgICAgIHJldHVybiAoX3RoaXMkZGl2NiA9IHRoaXMuZGl2KSA9PT0gbnVsbCB8fCBfdGhpcyRkaXY2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGhpcyRkaXY2LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgW24sIGksIHIsIHNdID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfRm4sIF9GbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5zZXRBdChuLCBpLCAwLCAwKTtcbiAgICAgICAgICB0aGlzLnNldERpbXMociwgcyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24sIF9rbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IFtuLCBpXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgICAgIHRoaXMuc2V0QXNwZWN0UmF0aW8odGhpcy53aWR0aCAqIG4sIHRoaXMuaGVpZ2h0ICogaSk7XG4gICAgICAgICAgICB0aGlzLnNldEF0KHQgKiBuLCBlICogaSwgdGhpcy53aWR0aCAqIG4sIHRoaXMuaGVpZ2h0ICogaSk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0FuLCAhMCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGltcyh0aGlzLndpZHRoICogbiwgdGhpcy5oZWlnaHQgKiBpKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZWRpdGluZ1wiKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTW4sIF9NbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuICAgICAgICB9XG4gICAgICAgIHNldERpbWVuc2lvbnModCwgZSkge1xuICAgICAgICAgIGNvbnN0IG4gPSBNYXRoLnJvdW5kKHQpLFxuICAgICAgICAgICAgaSA9IE1hdGgucm91bmQoZSk7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfU24pID09PSBuICYmIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfRW4pID09PSBpKSByZXR1cm47XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9Tbiwgbik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9FbiwgaSk7XG4gICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgY29uc3QgW3IsIHNdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuICAgICAgICAgIHRoaXMud2lkdGggPSB0IC8gcjtcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IGUgLyBzO1xuICAgICAgICAgIHRoaXMuZml4QW5kU2V0UG9zaXRpb24oKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZuKSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9xbiwgX3FuMikuY2FsbCh0aGlzLCB0LCBlKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9QbiwgX1BuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgICAgICAgdGhpcy5maXhEaW1zKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGRlc2VyaWFsaXplKHQsIGUsIG4pIHtcbiAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHMuSW5rQW5ub3RhdGlvbkVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IGEgPSBzdXBlci5kZXNlcmlhbGl6ZSh0LCBlLCBuKTtcbiAgICAgICAgICBhLnRoaWNrbmVzcyA9IHQudGhpY2tuZXNzO1xuICAgICAgICAgIGEuY29sb3IgPSBpLlV0aWwubWFrZUhleENvbG9yKC4uLnQuY29sb3IpO1xuICAgICAgICAgIGEub3BhY2l0eSA9IHQub3BhY2l0eTtcbiAgICAgICAgICBjb25zdCBbbywgbF0gPSBhLnBhZ2VEaW1lbnNpb25zLFxuICAgICAgICAgICAgYyA9IGEud2lkdGggKiBvLFxuICAgICAgICAgICAgaCA9IGEuaGVpZ2h0ICogbCxcbiAgICAgICAgICAgIGQgPSBhLnBhcmVudFNjYWxlLFxuICAgICAgICAgICAgdSA9IHQudGhpY2tuZXNzIC8gMjtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQoYSwgX3ZuLCAhMCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGEsIF9TbiwgTWF0aC5yb3VuZChjKSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGEsIF9FbiwgTWF0aC5yb3VuZChoKSk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcGF0aHM6IHAsXG4gICAgICAgICAgICByZWN0OiBmLFxuICAgICAgICAgICAgcm90YXRpb246IGdcbiAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBmb3IgKGxldCB7XG4gICAgICAgICAgICBiZXppZXI6IHRcbiAgICAgICAgICB9IG9mIHApIHtcbiAgICAgICAgICAgIHQgPSBfY2xhc3NTdGF0aWNQcml2YXRlTWV0aG9kR2V0KElua0VkaXRvciwgSW5rRWRpdG9yLCBfJG4pLmNhbGwoSW5rRWRpdG9yLCB0LCBmLCBnKTtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgICAgIGEucGF0aHMucHVzaChlKTtcbiAgICAgICAgICAgIGxldCBuID0gZCAqICh0WzBdIC0gdSksXG4gICAgICAgICAgICAgIGkgPSBkICogKHRbMV0gLSB1KTtcbiAgICAgICAgICAgIGZvciAobGV0IHIgPSAyLCBzID0gdC5sZW5ndGg7IHIgPCBzOyByICs9IDYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcyA9IGQgKiAodFtyXSAtIHUpLFxuICAgICAgICAgICAgICAgIGEgPSBkICogKHRbciArIDFdIC0gdSksXG4gICAgICAgICAgICAgICAgbyA9IGQgKiAodFtyICsgMl0gLSB1KSxcbiAgICAgICAgICAgICAgICBsID0gZCAqICh0W3IgKyAzXSAtIHUpLFxuICAgICAgICAgICAgICAgIGMgPSBkICogKHRbciArIDRdIC0gdSksXG4gICAgICAgICAgICAgICAgaCA9IGQgKiAodFtyICsgNV0gLSB1KTtcbiAgICAgICAgICAgICAgZS5wdXNoKFtbbiwgaV0sIFtzLCBhXSwgW28sIGxdLCBbYywgaF1dKTtcbiAgICAgICAgICAgICAgbiA9IGM7XG4gICAgICAgICAgICAgIGkgPSBoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgciA9IF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQodGhpcywgSW5rRWRpdG9yLCBfR24pLmNhbGwodGhpcywgZSk7XG4gICAgICAgICAgICBhLmJlemllclBhdGgyRC5wdXNoKHIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldChhLCBfS24sIF9LbjIpLmNhbGwoYSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGEsIF9kbiwgTWF0aC5tYXgoci5Bbm5vdGF0aW9uRWRpdG9yLk1JTl9TSVpFLCBtWzJdIC0gbVswXSkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldChhLCBfaG4sIE1hdGgubWF4KHIuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgbVszXSAtIG1bMV0pKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KGEsIF9xbiwgX3FuMikuY2FsbChhLCBjLCBoKTtcbiAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCB0ID0gdGhpcy5nZXRSZWN0KDAsIDApLFxuICAgICAgICAgICAgZSA9IHIuQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5jdHguc3Ryb2tlU3R5bGUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uVHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkssXG4gICAgICAgICAgICBjb2xvcjogZSxcbiAgICAgICAgICAgIHRoaWNrbmVzczogdGhpcy50aGlja25lc3MsXG4gICAgICAgICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHksXG4gICAgICAgICAgICBwYXRoczogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfWG4sIF9YbjIpLmNhbGwodGhpcywgdGhpcy5zY2FsZUZhY3RvciAvIHRoaXMucGFyZW50U2NhbGUsIHRoaXMudHJhbnNsYXRpb25YLCB0aGlzLnRyYW5zbGF0aW9uWSwgdCksXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgICAgICAgcmVjdDogdCxcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX2NsYXNzNDEgPSBJbmtFZGl0b3I7XG4gICAgICBmdW5jdGlvbiBfd24yKHQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMudGhpY2tuZXNzO1xuICAgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcbiAgICAgICAgICBjbWQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGhpY2tuZXNzID0gdDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RuLCBfVG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aGlja25lc3MgPSBlO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfVG4sIF9UbjIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdXN0RXhlYzogITAsXG4gICAgICAgICAgdHlwZTogaS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLFxuICAgICAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6ICEwLFxuICAgICAgICAgIGtlZXBVbmRvOiAhMFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9QZTQodCkge1xuICAgICAgICBjb25zdCBlID0gdGhpcy5jb2xvcjtcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kcyh7XG4gICAgICAgICAgY21kOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gdDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb2xvciA9IGU7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9QbiwgX1BuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG11c3RFeGVjOiAhMCxcbiAgICAgICAgICB0eXBlOiBpLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUixcbiAgICAgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiAhMCxcbiAgICAgICAgICBrZWVwVW5kbzogITBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfQ24yKHQpIHtcbiAgICAgICAgdCAvPSAxMDA7XG4gICAgICAgIGNvbnN0IGUgPSB0aGlzLm9wYWNpdHk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gdDtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gZTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVzdEV4ZWM6ICEwLFxuICAgICAgICAgIHR5cGU6IGkuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksXG4gICAgICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogITAsXG4gICAgICAgICAga2VlcFVuZG86ICEwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0ZuMigpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHBhcmVudFJvdGF0aW9uOiB0LFxuICAgICAgICAgIHBhcmVudERpbWVuc2lvbnM6IFtlLCBuXVxuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgc3dpdGNoICh0KSB7XG4gICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgIHJldHVybiBbMCwgbiwgbiwgZV07XG4gICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICByZXR1cm4gW2UsIG4sIGUsIG5dO1xuICAgICAgICAgIGNhc2UgMjcwOlxuICAgICAgICAgICAgcmV0dXJuIFtlLCAwLCBuLCBlXTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFswLCAwLCBlLCBuXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0luMigpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGN0eDogdCxcbiAgICAgICAgICBjb2xvcjogZSxcbiAgICAgICAgICBvcGFjaXR5OiBuLFxuICAgICAgICAgIHRoaWNrbmVzczogaSxcbiAgICAgICAgICBwYXJlbnRTY2FsZTogcixcbiAgICAgICAgICBzY2FsZUZhY3Rvcjogc1xuICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgdC5saW5lV2lkdGggPSBpICogciAvIHM7XG4gICAgICAgIHQubGluZUNhcCA9IFwicm91bmRcIjtcbiAgICAgICAgdC5saW5lSm9pbiA9IFwicm91bmRcIjtcbiAgICAgICAgdC5taXRlckxpbWl0ID0gMTA7XG4gICAgICAgIHQuc3Ryb2tlU3R5bGUgPSBcIlwiLmNvbmNhdChlKS5jb25jYXQoKDAsIGEub3BhY2l0eVRvSGV4KShuKSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfRG4yKHQsIGUpIHtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdW4pKTtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2ZuKSk7XG4gICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3BuKSk7XG4gICAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9nbikpO1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9tbikpO1xuICAgICAgICB0aGlzLmlzRWRpdGluZyA9ICEwO1xuICAgICAgICBpZiAoIV9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfQW4pKSB7XG4gICAgICAgICAgdmFyIF90aGlzJG9wYWNpdHkyO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfQW4sICEwKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICB0aGlzLnRoaWNrbmVzcyB8fCAodGhpcy50aGlja25lc3MgPSBfY2xhc3M0MS5fZGVmYXVsdFRoaWNrbmVzcyk7XG4gICAgICAgICAgdGhpcy5jb2xvciB8fCAodGhpcy5jb2xvciA9IF9jbGFzczQxLl9kZWZhdWx0Q29sb3IgfHwgci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yKTtcbiAgICAgICAgICAoX3RoaXMkb3BhY2l0eTIgPSB0aGlzLm9wYWNpdHkpICE9PSBudWxsICYmIF90aGlzJG9wYWNpdHkyICE9PSB2b2lkIDAgPyBfdGhpcyRvcGFjaXR5MiA6IHRoaXMub3BhY2l0eSA9IF9jbGFzczQxLl9kZWZhdWx0T3BhY2l0eTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRQYXRoLnB1c2goW3QsIGVdKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF95biwgITEpO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9JbiwgX0luMikuY2FsbCh0aGlzKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF94biwgKCkgPT4ge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX09uLCBfT24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfeG4pICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF94bikpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3huKSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfTG4yKHQsIGUpIHtcbiAgICAgICAgY29uc3QgW24sIGldID0gdGhpcy5jdXJyZW50UGF0aC5hdCgtMSk7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCA+IDEgJiYgdCA9PT0gbiAmJiBlID09PSBpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICBsZXQgcyA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYm4pO1xuICAgICAgICByLnB1c2goW3QsIGVdKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF95biwgITApO1xuICAgICAgICBpZiAoci5sZW5ndGggPD0gMikge1xuICAgICAgICAgIHMubW92ZVRvKC4uLnJbMF0pO1xuICAgICAgICAgIHMubGluZVRvKHQsIGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgzID09PSByLmxlbmd0aCkge1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ibiwgcyA9IG5ldyBQYXRoMkQoKSk7XG4gICAgICAgICAgICBzLm1vdmVUbyguLi5yWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfTm4sIF9ObjIpLmNhbGwodGhpcywgcywgLi4uci5hdCgtMyksIC4uLnIuYXQoLTIpLCB0LCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0JuMigpIHtcbiAgICAgICAgaWYgKDAgPT09IHRoaXMuY3VycmVudFBhdGgubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQYXRoLmF0KC0xKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ibikubGluZVRvKC4uLnQpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2puMih0LCBlKSB7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfeG4sIG51bGwpO1xuICAgICAgICB0ID0gTWF0aC5taW4oTWF0aC5tYXgodCwgMCksIHRoaXMuY2FudmFzLndpZHRoKTtcbiAgICAgICAgZSA9IE1hdGgubWluKE1hdGgubWF4KGUsIDApLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9MbiwgX0xuMikuY2FsbCh0aGlzLCB0LCBlKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfQm4sIF9CbjIpLmNhbGwodGhpcyk7XG4gICAgICAgIGxldCBuO1xuICAgICAgICBpZiAoMSAhPT0gdGhpcy5jdXJyZW50UGF0aC5sZW5ndGgpIG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9VbiwgX1VuMikuY2FsbCh0aGlzKTtlbHNlIHtcbiAgICAgICAgICBjb25zdCBpID0gW3QsIGVdO1xuICAgICAgICAgIG4gPSBbW2ksIGkuc2xpY2UoKSwgaS5zbGljZSgpLCBpXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfYm4pLFxuICAgICAgICAgIHIgPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gW107XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfYm4sIG5ldyBQYXRoMkQoKSk7XG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuICAgICAgICAgIGNtZDogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxSYXdQYXRocy5wdXNoKHIpO1xuICAgICAgICAgICAgdGhpcy5wYXRocy5wdXNoKG4pO1xuICAgICAgICAgICAgdGhpcy5iZXppZXJQYXRoMkQucHVzaChpKTtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZCgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGxSYXdQYXRocy5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMucGF0aHMucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmJlemllclBhdGgyRC5wb3AoKTtcbiAgICAgICAgICAgIGlmICgwID09PSB0aGlzLnBhdGhzLmxlbmd0aCkgdGhpcy5yZW1vdmUoKTtlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tuLCBfa24yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX01uLCBfTW4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1RuLCBfVG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbXVzdEV4ZWM6ICEwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX09uMigpIHtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3luKSkgcmV0dXJuO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3luLCAhMSk7XG4gICAgICAgIGNvbnN0IHQgPSBNYXRoLmNlaWwodGhpcy50aGlja25lc3MgKiB0aGlzLnBhcmVudFNjYWxlKSxcbiAgICAgICAgICBlID0gdGhpcy5jdXJyZW50UGF0aC5zbGljZSgtMyksXG4gICAgICAgICAgbiA9IGUubWFwKHQgPT4gdFswXSksXG4gICAgICAgICAgaSA9IGUubWFwKHQgPT4gdFsxXSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3R4OiByXG4gICAgICAgICAgfSA9IChNYXRoLm1pbiguLi5uKSwgTWF0aC5tYXgoLi4ubiksIE1hdGgubWluKC4uLmkpLCBNYXRoLm1heCguLi5pKSwgdGhpcyk7XG4gICAgICAgIHIuc2F2ZSgpO1xuICAgICAgICByLmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRoaXMuYmV6aWVyUGF0aDJEKSByLnN0cm9rZSh0KTtcbiAgICAgICAgci5zdHJva2UoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ibikpO1xuICAgICAgICByLnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9ObjIodCwgZSwgbiwgaSwgciwgcywgYSkge1xuICAgICAgICBjb25zdCBvID0gKGUgKyBpKSAvIDIsXG4gICAgICAgICAgbCA9IChuICsgcikgLyAyLFxuICAgICAgICAgIGMgPSAoaSArIHMpIC8gMixcbiAgICAgICAgICBoID0gKHIgKyBhKSAvIDI7XG4gICAgICAgIHQuYmV6aWVyQ3VydmVUbyhvICsgMiAqIChpIC0gbykgLyAzLCBsICsgMiAqIChyIC0gbCkgLyAzLCBjICsgMiAqIChpIC0gYykgLyAzLCBoICsgMiAqIChyIC0gaCkgLyAzLCBjLCBoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9VbjIoKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICBpZiAodC5sZW5ndGggPD0gMikgcmV0dXJuIFtbdFswXSwgdFswXSwgdC5hdCgtMSksIHQuYXQoLTEpXV07XG4gICAgICAgIGNvbnN0IGUgPSBbXTtcbiAgICAgICAgbGV0IG4sXG4gICAgICAgICAgW2ksIHJdID0gdFswXTtcbiAgICAgICAgZm9yIChuID0gMTsgbiA8IHQubGVuZ3RoIC0gMjsgbisrKSB7XG4gICAgICAgICAgY29uc3QgW3MsIGFdID0gdFtuXSxcbiAgICAgICAgICAgIFtvLCBsXSA9IHRbbiArIDFdLFxuICAgICAgICAgICAgYyA9IChzICsgbykgLyAyLFxuICAgICAgICAgICAgaCA9IChhICsgbCkgLyAyLFxuICAgICAgICAgICAgZCA9IFtpICsgMiAqIChzIC0gaSkgLyAzLCByICsgMiAqIChhIC0gcikgLyAzXSxcbiAgICAgICAgICAgIHUgPSBbYyArIDIgKiAocyAtIGMpIC8gMywgaCArIDIgKiAoYSAtIGgpIC8gM107XG4gICAgICAgICAgZS5wdXNoKFtbaSwgcl0sIGQsIHUsIFtjLCBoXV0pO1xuICAgICAgICAgIFtpLCByXSA9IFtjLCBoXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbcywgYV0gPSB0W25dLFxuICAgICAgICAgIFtvLCBsXSA9IHRbbiArIDFdLFxuICAgICAgICAgIGMgPSBbaSArIDIgKiAocyAtIGkpIC8gMywgciArIDIgKiAoYSAtIHIpIC8gM10sXG4gICAgICAgICAgaCA9IFtvICsgMiAqIChzIC0gbykgLyAzLCBsICsgMiAqIChhIC0gbCkgLyAzXTtcbiAgICAgICAgZS5wdXNoKFtbaSwgcl0sIGMsIGgsIFtvLCBsXV0pO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9QbjIoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3puLCBfem4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9JbiwgX0luMikuY2FsbCh0aGlzKTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNhbnZhczogdCxcbiAgICAgICAgICBjdHg6IGVcbiAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgIGUuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgICBlLmNsZWFyUmVjdCgwLCAwLCB0LndpZHRoLCB0LmhlaWdodCk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3puLCBfem4yKS5jYWxsKHRoaXMpO1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5iZXppZXJQYXRoMkQpIGUuc3Ryb2tlKHQpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX0huMih0KSB7XG4gICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybGVhdmVcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9mbikpO1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9wbikpO1xuICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZ24pKTtcbiAgICAgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbW4pKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdW4pKTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9qbiwgX2puMikuY2FsbCh0aGlzLCB0Lm9mZnNldFgsIHQub2Zmc2V0WSk7XG4gICAgICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuICAgICAgICB0aGlzLnNldEluQmFja2dyb3VuZCgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2tuMigpIHtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuY2FudmFzLmNsYXNzTmFtZSA9IFwiaW5rRWRpdG9yQ2FudmFzXCI7XG4gICAgICAgIF9jbGFzczQxLl9sMTBuUHJvbWlzZS5nZXQoXCJlZGl0b3JfaW5rX2NhbnZhc19hcmlhX2xhYmVsXCIpLnRoZW4odCA9PiB7XG4gICAgICAgICAgdmFyIF90aGlzJGNhbnZhcztcbiAgICAgICAgICByZXR1cm4gKF90aGlzJGNhbnZhcyA9IHRoaXMuY2FudmFzKSA9PT0gbnVsbCB8fCBfdGhpcyRjYW52YXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF90aGlzJGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMuY2FudmFzKTtcbiAgICAgICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfTW4yKCkge1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX245LCBuZXcgUmVzaXplT2JzZXJ2ZXIodCA9PiB7XG4gICAgICAgICAgY29uc3QgZSA9IHRbMF0uY29udGVudFJlY3Q7XG4gICAgICAgICAgZS53aWR0aCAmJiBlLmhlaWdodCAmJiB0aGlzLnNldERpbWVuc2lvbnMoZS53aWR0aCwgZS5oZWlnaHQpO1xuICAgICAgICB9KSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbjkpLm9ic2VydmUodGhpcy5kaXYpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX1JuMigpIHtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0FuKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gTWF0aC5jZWlsKHRoaXMud2lkdGggKiB0KTtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuaGVpZ2h0ICogZSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3puLCBfem4yKS5jYWxsKHRoaXMpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3FuMih0LCBlKSB7XG4gICAgICAgIGNvbnN0IG4gPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9XbiwgX1duMikuY2FsbCh0aGlzKSxcbiAgICAgICAgICBpID0gKHQgLSBuKSAvIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZG4pLFxuICAgICAgICAgIHIgPSAoZSAtIG4pIC8gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9obik7XG4gICAgICAgIHRoaXMuc2NhbGVGYWN0b3IgPSBNYXRoLm1pbihpLCByKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF96bjIoKSB7XG4gICAgICAgIGNvbnN0IHQgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9XbiwgX1duMikuY2FsbCh0aGlzKSAvIDI7XG4gICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSh0aGlzLnNjYWxlRmFjdG9yLCAwLCAwLCB0aGlzLnNjYWxlRmFjdG9yLCB0aGlzLnRyYW5zbGF0aW9uWCAqIHRoaXMuc2NhbGVGYWN0b3IgKyB0LCB0aGlzLnRyYW5zbGF0aW9uWSAqIHRoaXMuc2NhbGVGYWN0b3IgKyB0KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9Hbih0KSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgUGF0aDJEKCk7XG4gICAgICAgIGZvciAobGV0IG4gPSAwLCBpID0gdC5sZW5ndGg7IG4gPCBpOyBuKyspIHtcbiAgICAgICAgICBjb25zdCBbaSwgciwgcywgYV0gPSB0W25dO1xuICAgICAgICAgIDAgPT09IG4gJiYgZS5tb3ZlVG8oLi4uaSk7XG4gICAgICAgICAgZS5iZXppZXJDdXJ2ZVRvKHJbMF0sIHJbMV0sIHNbMF0sIHNbMV0sIGFbMF0sIGFbMV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX1ZuKHQsIGUsIG4pIHtcbiAgICAgICAgY29uc3QgW2ksIHIsIHMsIGFdID0gZTtcbiAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZm9yIChsZXQgZSA9IDAsIG4gPSB0Lmxlbmd0aDsgZSA8IG47IGUgKz0gMikge1xuICAgICAgICAgICAgICB0W2VdICs9IGk7XG4gICAgICAgICAgICAgIHRbZSArIDFdID0gYSAtIHRbZSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA5MDpcbiAgICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IHRbZV07XG4gICAgICAgICAgICAgIHRbZV0gPSB0W2UgKyAxXSArIGk7XG4gICAgICAgICAgICAgIHRbZSArIDFdID0gbiArIHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE4MDpcbiAgICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDIpIHtcbiAgICAgICAgICAgICAgdFtlXSA9IHMgLSB0W2VdO1xuICAgICAgICAgICAgICB0W2UgKyAxXSArPSByO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICBmb3IgKGxldCBlID0gMCwgbiA9IHQubGVuZ3RoOyBlIDwgbjsgZSArPSAyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG4gPSB0W2VdO1xuICAgICAgICAgICAgICB0W2VdID0gcyAtIHRbZSArIDFdO1xuICAgICAgICAgICAgICB0W2UgKyAxXSA9IGEgLSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfJG4odCwgZSwgbikge1xuICAgICAgICBjb25zdCBbaSwgciwgcywgYV0gPSBlO1xuICAgICAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBmb3IgKGxldCBlID0gMCwgbiA9IHQubGVuZ3RoOyBlIDwgbjsgZSArPSAyKSB7XG4gICAgICAgICAgICAgIHRbZV0gLT0gaTtcbiAgICAgICAgICAgICAgdFtlICsgMV0gPSBhIC0gdFtlICsgMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgZm9yIChsZXQgZSA9IDAsIG4gPSB0Lmxlbmd0aDsgZSA8IG47IGUgKz0gMikge1xuICAgICAgICAgICAgICBjb25zdCBuID0gdFtlXTtcbiAgICAgICAgICAgICAgdFtlXSA9IHRbZSArIDFdIC0gcjtcbiAgICAgICAgICAgICAgdFtlICsgMV0gPSBuIC0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTgwOlxuICAgICAgICAgICAgZm9yIChsZXQgZSA9IDAsIG4gPSB0Lmxlbmd0aDsgZSA8IG47IGUgKz0gMikge1xuICAgICAgICAgICAgICB0W2VdID0gcyAtIHRbZV07XG4gICAgICAgICAgICAgIHRbZSArIDFdIC09IHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI3MDpcbiAgICAgICAgICAgIGZvciAobGV0IGUgPSAwLCBuID0gdC5sZW5ndGg7IGUgPCBuOyBlICs9IDIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbiA9IHRbZV07XG4gICAgICAgICAgICAgIHRbZV0gPSBhIC0gdFtlICsgMV07XG4gICAgICAgICAgICAgIHRbZSArIDFdID0gcyAtIG47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9YbjIodCwgZSwgbiwgaSkge1xuICAgICAgICBjb25zdCByID0gW10sXG4gICAgICAgICAgcyA9IHRoaXMudGhpY2tuZXNzIC8gMixcbiAgICAgICAgICBhID0gdCAqIGUgKyBzLFxuICAgICAgICAgIG8gPSB0ICogbiArIHM7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLnBhdGhzKSB7XG4gICAgICAgICAgY29uc3QgbiA9IFtdLFxuICAgICAgICAgICAgcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwLCByID0gZS5sZW5ndGg7IGkgPCByOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IFtsLCBjLCBoLCBkXSA9IGVbaV0sXG4gICAgICAgICAgICAgIHUgPSB0ICogbFswXSArIGEsXG4gICAgICAgICAgICAgIHAgPSB0ICogbFsxXSArIG8sXG4gICAgICAgICAgICAgIGYgPSB0ICogY1swXSArIGEsXG4gICAgICAgICAgICAgIGcgPSB0ICogY1sxXSArIG8sXG4gICAgICAgICAgICAgIG0gPSB0ICogaFswXSArIGEsXG4gICAgICAgICAgICAgIGIgPSB0ICogaFsxXSArIG8sXG4gICAgICAgICAgICAgIHYgPSB0ICogZFswXSArIGEsXG4gICAgICAgICAgICAgIHkgPSB0ICogZFsxXSArIG87XG4gICAgICAgICAgICBpZiAoMCA9PT0gaSkge1xuICAgICAgICAgICAgICBuLnB1c2godSwgcCk7XG4gICAgICAgICAgICAgIHMucHVzaCh1LCBwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG4ucHVzaChmLCBnLCBtLCBiLCB2LCB5KTtcbiAgICAgICAgICAgIHMucHVzaChmLCBnKTtcbiAgICAgICAgICAgIGkgPT09IHIgLSAxICYmIHMucHVzaCh2LCB5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgci5wdXNoKHtcbiAgICAgICAgICAgIGJlemllcjogX2NsYXNzU3RhdGljUHJpdmF0ZU1ldGhvZEdldChfY2xhc3M0MSwgX2NsYXNzNDEsIF9WbikuY2FsbChfY2xhc3M0MSwgbiwgaSwgdGhpcy5yb3RhdGlvbiksXG4gICAgICAgICAgICBwb2ludHM6IF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQoX2NsYXNzNDEsIF9jbGFzczQxLCBfVm4pLmNhbGwoX2NsYXNzNDEsIHMsIGksIHRoaXMucm90YXRpb24pXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfS24yKCkge1xuICAgICAgICBsZXQgdCA9IDEgLyAwLFxuICAgICAgICAgIGUgPSAtMSAvIDAsXG4gICAgICAgICAgbiA9IDEgLyAwLFxuICAgICAgICAgIHIgPSAtMSAvIDA7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLnBhdGhzKSBmb3IgKGNvbnN0IFthLCBvLCBsLCBjXSBvZiBzKSB7XG4gICAgICAgICAgY29uc3QgcyA9IGkuVXRpbC5iZXppZXJCb3VuZGluZ0JveCguLi5hLCAuLi5vLCAuLi5sLCAuLi5jKTtcbiAgICAgICAgICB0ID0gTWF0aC5taW4odCwgc1swXSk7XG4gICAgICAgICAgbiA9IE1hdGgubWluKG4sIHNbMV0pO1xuICAgICAgICAgIGUgPSBNYXRoLm1heChlLCBzWzJdKTtcbiAgICAgICAgICByID0gTWF0aC5tYXgociwgc1szXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0LCBuLCBlLCByXTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9XbjIoKSB7XG4gICAgICAgIHJldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZuKSA/IE1hdGguY2VpbCh0aGlzLnRoaWNrbmVzcyAqIHRoaXMucGFyZW50U2NhbGUpIDogMDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9UbjIoKSB7XG4gICAgICAgIGxldCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdO1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybjtcbiAgICAgICAgaWYgKCFfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX3ZuKSkge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1BuLCBfUG4yKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfS24sIF9LbjIpLmNhbGwodGhpcyksXG4gICAgICAgICAgbiA9IF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX1duLCBfV24yKS5jYWxsKHRoaXMpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX2RuLCBNYXRoLm1heChyLkFubm90YXRpb25FZGl0b3IuTUlOX1NJWkUsIGVbMl0gLSBlWzBdKSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfaG4sIE1hdGgubWF4KHIuQW5ub3RhdGlvbkVkaXRvci5NSU5fU0laRSwgZVszXSAtIGVbMV0pKTtcbiAgICAgICAgY29uc3QgaSA9IE1hdGguY2VpbChuICsgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9kbikgKiB0aGlzLnNjYWxlRmFjdG9yKSxcbiAgICAgICAgICBzID0gTWF0aC5jZWlsKG4gKyBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2huKSAqIHRoaXMuc2NhbGVGYWN0b3IpLFxuICAgICAgICAgIFthLCBvXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgdGhpcy53aWR0aCA9IGkgLyBhO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHMgLyBvO1xuICAgICAgICB0aGlzLnNldEFzcGVjdFJhdGlvKGksIHMpO1xuICAgICAgICBjb25zdCBsID0gdGhpcy50cmFuc2xhdGlvblgsXG4gICAgICAgICAgYyA9IHRoaXMudHJhbnNsYXRpb25ZO1xuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IC1lWzBdO1xuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uWSA9IC1lWzFdO1xuICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9SbiwgX1JuMikuY2FsbCh0aGlzKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfUG4sIF9QbjIpLmNhbGwodGhpcyk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfU24sIGkpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX0VuLCBzKTtcbiAgICAgICAgdGhpcy5zZXREaW1zKGksIHMpO1xuICAgICAgICBjb25zdCBoID0gdCA/IG4gLyB0aGlzLnNjYWxlRmFjdG9yIC8gMiA6IDA7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlKGwgLSB0aGlzLnRyYW5zbGF0aW9uWCAtIGgsIGMgLSB0aGlzLnRyYW5zbGF0aW9uWSAtIGgpO1xuICAgICAgfVxuICAgICAgX2RlZmluZVByb3BlcnR5KElua0VkaXRvciwgXCJfZGVmYXVsdENvbG9yXCIsIG51bGwpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KElua0VkaXRvciwgXCJfZGVmYXVsdE9wYWNpdHlcIiwgMSk7XG4gICAgICBfZGVmaW5lUHJvcGVydHkoSW5rRWRpdG9yLCBcIl9kZWZhdWx0VGhpY2tuZXNzXCIsIDEpO1xuICAgICAgX2RlZmluZVByb3BlcnR5KElua0VkaXRvciwgXCJfbDEwblByb21pc2VcIiwgdm9pZCAwKTtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShJbmtFZGl0b3IsIFwiX3R5cGVcIiwgXCJpbmtcIik7XG4gICAgICBlLklua0VkaXRvciA9IElua0VkaXRvcjtcbiAgICB9LCAodCwgZSwgbikgPT4ge1xuICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgICB2YWx1ZTogITBcbiAgICAgIH0pO1xuICAgICAgZS5TdGFtcEVkaXRvciA9IHZvaWQgMDtcbiAgICAgIG4oMTQ4KTtcbiAgICAgIG4oMTUxKTtcbiAgICAgIHZhciBpID0gbigxNjMpLFxuICAgICAgICByID0gbigxKSxcbiAgICAgICAgcyA9IG4oMTY3KSxcbiAgICAgICAgYSA9IG4oMTk3KTtcbiAgICAgIHZhciBfWW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfSm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfUW4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfWm4gPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfdGkgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtNYXAoKTtcbiAgICAgIHZhciBfbjEwID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2VpID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX25pID0gLyojX19QVVJFX18qL25ldyBXZWFrTWFwKCk7XG4gICAgICB2YXIgX2lpID0gLyojX19QVVJFX18qL25ldyBXZWFrU2V0KCk7XG4gICAgICB2YXIgX2tuMyA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9zaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9haSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9yaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9vaSA9IC8qI19fUFVSRV9fKi9uZXcgV2Vha1NldCgpO1xuICAgICAgdmFyIF9NbjMgPSAvKiNfX1BVUkVfXyovbmV3IFdlYWtTZXQoKTtcbiAgICAgIGNsYXNzIFN0YW1wRWRpdG9yIGV4dGVuZHMgaS5Bbm5vdGF0aW9uRWRpdG9yIHtcbiAgICAgICAgY29uc3RydWN0b3IoX3QxOCkge1xuICAgICAgICAgIHN1cGVyKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3QxOCksIHt9LCB7XG4gICAgICAgICAgICBuYW1lOiBcInN0YW1wRWRpdG9yXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEluaXRTcGVjKHRoaXMsIF9NbjMpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfb2kpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfcmkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfYWkpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfc2kpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RJbml0U3BlYyh0aGlzLCBfa24zKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModGhpcywgX2lpKTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfSm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfUW4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfWm4sIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfdGksIHtcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRJbml0U3BlYyh0aGlzLCBfbjEwLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX2VpLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModGhpcywgX25pLCB7XG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAhMVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWm4sIF90MTguYml0bWFwVXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZW1vdmUoKSB7XG4gICAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKSB7XG4gICAgICAgICAgICB2YXIgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTUsIF9jbGFzc1ByaXZhdGVGaWVsZEdldDE2O1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ZbiwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLl91aU1hbmFnZXIuaW1hZ2VNYW5hZ2VyLmRlbGV0ZUlkKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKTtcbiAgICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQxNSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfdGkpKSA9PT0gbnVsbCB8fCBfY2xhc3NQcml2YXRlRmllbGRHZXQxNSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTUucmVtb3ZlKCk7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX3RpLCBudWxsKTtcbiAgICAgICAgICAgIChfY2xhc3NQcml2YXRlRmllbGRHZXQxNiA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbjEwKSkgPT09IG51bGwgfHwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0MTYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jbGFzc1ByaXZhdGVGaWVsZEdldDE2LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfbjEwLCBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3VwZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVidWlsZCgpIHtcbiAgICAgICAgICBzdXBlci5yZWJ1aWxkKCk7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHRoaXMuZGl2KSB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0puKSAmJiBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9paSwgX2lpMikuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuaXNBdHRhY2hlZFRvRE9NIHx8IHRoaXMucGFyZW50LmFkZCh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb25jZUFkZGVkKCkge1xuICAgICAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICEwO1xuICAgICAgICAgIHRoaXMucGFyZW50LmFkZFVuZG9hYmxlRWRpdG9yKHRoaXMpO1xuICAgICAgICAgIHRoaXMuZGl2LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNFbXB0eSgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9RbikgJiYgbnVsbCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbikgJiYgbnVsbCA9PT0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9abik7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGlzUmVzaXphYmxlKCkge1xuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGl2KSByZXR1cm4gdGhpcy5kaXY7XG4gICAgICAgICAgbGV0IHQsIGU7XG4gICAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHQgPSB0aGlzLng7XG4gICAgICAgICAgICBlID0gdGhpcy55O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXBlci5yZW5kZXIoKTtcbiAgICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbikpIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tuMywgX2tuNCkuY2FsbCh0aGlzKTtlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJsb2FkaW5nXCIpO1xuICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfaWksIF9paTIpLmNhbGwodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgICAgICB0aGlzLnNldEF0KHQgKiBuLCBlICogaSwgdGhpcy53aWR0aCAqIG4sIHRoaXMuaGVpZ2h0ICogaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmRpdjtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZGVzZXJpYWxpemUodCwgZSwgbikge1xuICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYS5TdGFtcEFubm90YXRpb25FbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjb25zdCBpID0gc3VwZXIuZGVzZXJpYWxpemUodCwgZSwgbiksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJlY3Q6IHIsXG4gICAgICAgICAgICAgIGJpdG1hcFVybDogcyxcbiAgICAgICAgICAgICAgYml0bWFwSWQ6IG8sXG4gICAgICAgICAgICAgIGlzU3ZnOiBsXG4gICAgICAgICAgICB9ID0gdDtcbiAgICAgICAgICBvICYmIG4uaW1hZ2VNYW5hZ2VyLmlzVmFsaWRJZChvKSA/IF9jbGFzc1ByaXZhdGVGaWVsZFNldChpLCBfSm4sIG8pIDogX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGksIF9abiwgcyk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KGksIF9uaSwgbCk7XG4gICAgICAgICAgY29uc3QgW2MsIGhdID0gaS5wYWdlRGltZW5zaW9ucztcbiAgICAgICAgICBpLndpZHRoID0gKHJbMl0gLSByWzBdKSAvIGM7XG4gICAgICAgICAgaS5oZWlnaHQgPSAoclszXSAtIHJbMV0pIC8gaDtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgICAgbGV0IHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF0sXG4gICAgICAgICAgICBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY29uc3QgbiA9IHtcbiAgICAgICAgICAgIGFubm90YXRpb25UeXBlOiByLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QLFxuICAgICAgICAgICAgYml0bWFwSWQ6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pLFxuICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgICAgICAgIHJlY3Q6IHRoaXMuZ2V0UmVjdCgwLCAwKSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuICAgICAgICAgICAgaXNTdmc6IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbmkpXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgbi5iaXRtYXBVcmwgPSBfY2xhc3NQcml2YXRlTWV0aG9kR2V0KHRoaXMsIF9vaSwgX29pMikuY2FsbCh0aGlzLCAhMCk7XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG51bGwgPT09IGUpIHJldHVybiBuO1xuICAgICAgICAgIGUuc3RhbXBzIHx8IChlLnN0YW1wcyA9IG5ldyBNYXAoKSk7XG4gICAgICAgICAgY29uc3QgaSA9IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfbmkpID8gKG4ucmVjdFsyXSAtIG4ucmVjdFswXSkgKiAobi5yZWN0WzNdIC0gbi5yZWN0WzFdKSA6IG51bGw7XG4gICAgICAgICAgaWYgKGUuc3RhbXBzLmhhcyhfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0puKSkpIHtcbiAgICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25pKSkge1xuICAgICAgICAgICAgICBjb25zdCB0ID0gZS5zdGFtcHMuZ2V0KF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKTtcbiAgICAgICAgICAgICAgaWYgKGkgPiB0LmFyZWEpIHtcbiAgICAgICAgICAgICAgICB0LmFyZWEgPSBpO1xuICAgICAgICAgICAgICAgIHQuc2VyaWFsaXplZC5iaXRtYXAuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0LnNlcmlhbGl6ZWQuYml0bWFwID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfb2ksIF9vaTIpLmNhbGwodGhpcywgITEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGUuc3RhbXBzLnNldChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX0puKSwge1xuICAgICAgICAgICAgICBhcmVhOiBpLFxuICAgICAgICAgICAgICBzZXJpYWxpemVkOiBuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG4uYml0bWFwID0gX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfb2ksIF9vaTIpLmNhbGwodGhpcywgITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2lpMigpIHtcbiAgICAgICAgaWYgKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKSB7XG4gICAgICAgICAgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tSWQoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9KbikpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1luLCB0LmJpdG1hcCk7XG4gICAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX2tuMywgX2tuNCkuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB0aGlzLnJlbW92ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9abikpIHtcbiAgICAgICAgICBjb25zdCB0ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9abik7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9abiwgbnVsbCk7XG4gICAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9RbiwgdGhpcy5fdWlNYW5hZ2VyLmltYWdlTWFuYWdlci5nZXRGcm9tVXJsKHQpLnRoZW4odCA9PiB7XG4gICAgICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRTZXQodGhpcywgX1FuLCBudWxsKTtcbiAgICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgYml0bWFwOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfWW4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlkOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfSm4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzU3ZnOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfbmkpLnZhbHVlXG4gICAgICAgICAgICAgIH0gPSB0KTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24zLCBfa240KS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICB0LnR5cGUgPSBcImZpbGVcIjtcbiAgICAgICAgdC5hY2NlcHQgPSBcImltYWdlLypcIjtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9RbiwgbmV3IFByb21pc2UoZSA9PiB7XG4gICAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUW4sIG51bGwpO1xuICAgICAgICAgICAgaWYgKHQuZmlsZXMgJiYgMCAhPT0gdC5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZSA9IGF3YWl0IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0RnJvbUZpbGUodC5maWxlc1swXSk7XG4gICAgICAgICAgICAgIGlmICghZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgYml0bWFwOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfWW4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlkOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfSm4pLnZhbHVlLFxuICAgICAgICAgICAgICAgIGlzU3ZnOiBfY2xhc3NQcml2YXRlRmllbGREZXN0cnVjdHVyZVNldCh0aGlzLCBfbmkpLnZhbHVlXG4gICAgICAgICAgICAgIH0gPSBlKTtcbiAgICAgICAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfa24zLCBfa240KS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgICAgICBlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdC5hZGRFdmVudExpc3RlbmVyKFwiY2FuY2VsXCIsICgpID0+IHtcbiAgICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfUW4sIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgICAgIGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0LmNsaWNrKCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfa240KCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZGl2OiB0XG4gICAgICAgIH0gPSB0aGlzO1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHdpZHRoOiBlLFxuICAgICAgICAgIGhlaWdodDogblxuICAgICAgICB9ID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9Zbik7XG4gICAgICAgIGNvbnN0IFtpLCByXSA9IHRoaXMucGFnZURpbWVuc2lvbnMsXG4gICAgICAgICAgcyA9IC43NTtcbiAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgICAgICBlID0gdGhpcy53aWR0aCAqIGk7XG4gICAgICAgICAgbiA9IHRoaXMuaGVpZ2h0ICogcjtcbiAgICAgICAgfSBlbHNlIGlmIChlID4gcyAqIGkgfHwgbiA+IHMgKiByKSB7XG4gICAgICAgICAgY29uc3QgdCA9IE1hdGgubWluKHMgKiBpIC8gZSwgcyAqIHIgLyBuKTtcbiAgICAgICAgICBlICo9IHQ7XG4gICAgICAgICAgbiAqPSB0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFthLCBvXSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcbiAgICAgICAgdGhpcy5zZXREaW1zKGUgKiBhIC8gaSwgbiAqIG8gLyByKTtcbiAgICAgICAgY29uc3QgbCA9IF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfdGksIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpO1xuICAgICAgICB0LmFwcGVuZChsKTtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfcmksIF9yaTIpLmNhbGwodGhpcywgZSwgbik7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX01uMywgX01uNCkuY2FsbCh0aGlzKTtcbiAgICAgICAgdC5jbGFzc0xpc3QucmVtb3ZlKFwibG9hZGluZ1wiKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9zaTIodCwgZSkge1xuICAgICAgICBjb25zdCBbbiwgaV0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG4gICAgICAgIHRoaXMud2lkdGggPSB0IC8gbjtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBlIC8gaTtcbiAgICAgICAgdGhpcy5zZXREaW1zKHQsIGUpO1xuICAgICAgICB0aGlzLmZpeEFuZFNldFBvc2l0aW9uKCk7XG4gICAgICAgIG51bGwgIT09IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfZWkpICYmIGNsZWFyVGltZW91dChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX2VpKSk7XG4gICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZWksIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfZWksIG51bGwpO1xuICAgICAgICAgIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3JpLCBfcmkyKS5jYWxsKHRoaXMsIHQsIGUpO1xuICAgICAgICB9LCAyMDApKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9haTIodCwgZSkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgd2lkdGg6IG4sXG4gICAgICAgICAgaGVpZ2h0OiBpXG4gICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKTtcbiAgICAgICAgbGV0IHIgPSBuLFxuICAgICAgICAgIHMgPSBpLFxuICAgICAgICAgIGEgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKTtcbiAgICAgICAgZm9yICg7IHIgPiAyICogdCB8fCBzID4gMiAqIGU7KSB7XG4gICAgICAgICAgY29uc3QgbiA9IHIsXG4gICAgICAgICAgICBpID0gcztcbiAgICAgICAgICByID4gMiAqIHQgJiYgKHIgPSByID49IDE2Mzg0ID8gTWF0aC5mbG9vcihyIC8gMikgLSAxIDogTWF0aC5jZWlsKHIgLyAyKSk7XG4gICAgICAgICAgcyA+IDIgKiBlICYmIChzID0gcyA+PSAxNjM4NCA/IE1hdGguZmxvb3IocyAvIDIpIC0gMSA6IE1hdGguY2VpbChzIC8gMikpO1xuICAgICAgICAgIGNvbnN0IG8gPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHIsIHMpO1xuICAgICAgICAgIG8uZ2V0Q29udGV4dChcIjJkXCIpLmRyYXdJbWFnZShhLCAwLCAwLCBuLCBpLCAwLCAwLCByLCBzKTtcbiAgICAgICAgICBhID0gby50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9yaTIodCwgZSkge1xuICAgICAgICBjb25zdCBuID0gX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF90aSk7XG4gICAgICAgIGlmICghbiB8fCBuLndpZHRoID09PSB0ICYmIG4uaGVpZ2h0ID09PSBlKSByZXR1cm47XG4gICAgICAgIG4ud2lkdGggPSB0O1xuICAgICAgICBuLmhlaWdodCA9IGU7XG4gICAgICAgIGNvbnN0IGkgPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25pKSA/IF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWW4pIDogX2NsYXNzUHJpdmF0ZU1ldGhvZEdldCh0aGlzLCBfYWksIF9haTIpLmNhbGwodGhpcywgdCwgZSksXG4gICAgICAgICAgciA9IG4uZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICByLmZpbHRlciA9IHRoaXMuX3VpTWFuYWdlci5oY21GaWx0ZXI7XG4gICAgICAgIHIuZHJhd0ltYWdlKGksIDAsIDAsIGkud2lkdGgsIGkuaGVpZ2h0LCAwLCAwLCB0LCBlKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9vaTIodCkge1xuICAgICAgICBpZiAodCkge1xuICAgICAgICAgIGlmIChfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX25pKSkge1xuICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuX3VpTWFuYWdlci5pbWFnZU1hbmFnZXIuZ2V0U3ZnVXJsKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfSm4pKTtcbiAgICAgICAgICAgIGlmICh0KSByZXR1cm4gdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIHdpZHRoOiB0LndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0LmhlaWdodFxuICAgICAgICAgIH0gPSBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKSk7XG4gICAgICAgICAgdC5nZXRDb250ZXh0KFwiMmRcIikuZHJhd0ltYWdlKF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWW4pLCAwLCAwKTtcbiAgICAgICAgICByZXR1cm4gdC50b0RhdGFVUkwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9uaSkpIHtcbiAgICAgICAgICBjb25zdCBbdCwgZV0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zLFxuICAgICAgICAgICAgbiA9IE1hdGgucm91bmQodGhpcy53aWR0aCAqIHQgKiBzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyksXG4gICAgICAgICAgICBpID0gTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAqIGUgKiBzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyksXG4gICAgICAgICAgICByID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhuLCBpKTtcbiAgICAgICAgICByLmdldENvbnRleHQoXCIyZFwiKS5kcmF3SW1hZ2UoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbiksIDAsIDAsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWW4pLndpZHRoLCBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1luKS5oZWlnaHQsIDAsIDAsIG4sIGkpO1xuICAgICAgICAgIHJldHVybiByLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ZbikpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX01uNCgpIHtcbiAgICAgICAgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9uMTAsIG5ldyBSZXNpemVPYnNlcnZlcih0ID0+IHtcbiAgICAgICAgICBjb25zdCBlID0gdFswXS5jb250ZW50UmVjdDtcbiAgICAgICAgICBlLndpZHRoICYmIGUuaGVpZ2h0ICYmIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodGhpcywgX3NpLCBfc2kyKS5jYWxsKHRoaXMsIGUud2lkdGgsIGUuaGVpZ2h0KTtcbiAgICAgICAgfSkpO1xuICAgICAgICBfY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX24xMCkub2JzZXJ2ZSh0aGlzLmRpdik7XG4gICAgICB9XG4gICAgICBfZGVmaW5lUHJvcGVydHkoU3RhbXBFZGl0b3IsIFwiX3R5cGVcIiwgXCJzdGFtcFwiKTtcbiAgICAgIGUuU3RhbXBFZGl0b3IgPSBTdGFtcEVkaXRvcjtcbiAgICB9XSxcbiAgICBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbiAgZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyh0KSB7XG4gICAgdmFyIGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bdF07XG4gICAgaWYgKHZvaWQgMCAhPT0gZSkgcmV0dXJuIGUuZXhwb3J0cztcbiAgICB2YXIgbiA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1t0XSA9IHtcbiAgICAgIGV4cG9ydHM6IHt9XG4gICAgfTtcbiAgICBfX3dlYnBhY2tfbW9kdWxlc19fW3RdLmNhbGwobi5leHBvcnRzLCBuLCBuLmV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pO1xuICAgIHJldHVybiBuLmV4cG9ydHM7XG4gIH1cbiAgdmFyIF9fbmVzdGVkX3dlYnBhY2tfZXhwb3J0c19fID0ge307XG4gICgoKSA9PiB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgdCA9IF9fbmVzdGVkX3dlYnBhY2tfZXhwb3J0c19fO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6ICEwXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQWJvcnRFeGNlcHRpb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuQWJvcnRFeGNlcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQW5ub3RhdGlvbkVkaXRvckxheWVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBzLkFubm90YXRpb25FZGl0b3JMYXllcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uRWRpdG9yVHlwZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5Bbm5vdGF0aW9uRWRpdG9yVHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBhLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiQW5ub3RhdGlvbkxheWVyXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBvLkFubm90YXRpb25MYXllcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJBbm5vdGF0aW9uTW9kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5Bbm5vdGF0aW9uTW9kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJDTWFwQ29tcHJlc3Npb25UeXBlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLkNNYXBDb21wcmVzc2lvblR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiRmVhdHVyZVRlc3RcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuRmVhdHVyZVRlc3Q7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiR2xvYmFsV29ya2VyT3B0aW9uc1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbC5HbG9iYWxXb3JrZXJPcHRpb25zO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIkltYWdlS2luZFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5JbWFnZUtpbmQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5JbnZhbGlkUERGRXhjZXB0aW9uO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIk1pc3NpbmdQREZFeGNlcHRpb25cIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuTWlzc2luZ1BERkV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJPUFNcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuT1BTO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlBERkRhdGFSYW5nZVRyYW5zcG9ydFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbi5QREZEYXRhUmFuZ2VUcmFuc3BvcnQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUERGRGF0ZVN0cmluZ1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5QREZEYXRlU3RyaW5nO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlBERldvcmtlclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbi5QREZXb3JrZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUGFzc3dvcmRSZXNwb25zZXNcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuUGFzc3dvcmRSZXNwb25zZXM7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUGVybWlzc2lvbkZsYWdcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuUGVybWlzc2lvbkZsYWc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiUGl4ZWxzUGVySW5jaFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5QaXhlbHNQZXJJbmNoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlByb21pc2VDYXBhYmlsaXR5XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLlByb21pc2VDYXBhYmlsaXR5O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcIlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiU1ZHR3JhcGhpY3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG4uU1ZHR3JhcGhpY3M7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJVdGlsXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlLlV0aWw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiVmVyYm9zaXR5TGV2ZWxcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuVmVyYm9zaXR5TGV2ZWw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiWGZhTGF5ZXJcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGMuWGZhTGF5ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiYnVpbGRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG4uYnVpbGQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiY3JlYXRlVmFsaWRBYnNvbHV0ZVVybFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5jcmVhdGVWYWxpZEFic29sdXRlVXJsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcImdldERvY3VtZW50XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBuLmdldERvY3VtZW50O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcImdldEZpbGVuYW1lRnJvbVVybFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5nZXRGaWxlbmFtZUZyb21Vcmw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiZ2V0UGRmRmlsZW5hbWVGcm9tVXJsXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLmdldFBkZkZpbGVuYW1lRnJvbVVybDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJnZXRYZmFQYWdlVmlld3BvcnRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGkuZ2V0WGZhUGFnZVZpZXdwb3J0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcImlzRGF0YVNjaGVtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gaS5pc0RhdGFTY2hlbWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwiaXNQZGZGaWxlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLmlzUGRmRmlsZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJsb2FkU2NyaXB0XCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLmxvYWRTY3JpcHQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwibm9ybWFsaXplVW5pY29kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gZS5ub3JtYWxpemVVbmljb2RlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInJlbmRlclRleHRMYXllclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gci5yZW5kZXJUZXh0TGF5ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwic2V0TGF5ZXJEaW1lbnNpb25zXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpLnNldExheWVyRGltZW5zaW9ucztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJzaGFkb3dcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGUuc2hhZG93O1xuICAgICAgfVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBcInVwZGF0ZVRleHRMYXllclwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gci51cGRhdGVUZXh0TGF5ZXI7XG4gICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIFwidmVyc2lvblwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gbi52ZXJzaW9uO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBlID0gX193X3BkZmpzX3JlcXVpcmVfXygxKSxcbiAgICAgIG4gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyNCksXG4gICAgICBpID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjcpLFxuICAgICAgciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTk0KSxcbiAgICAgIHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5NSksXG4gICAgICBhID0gX193X3BkZmpzX3JlcXVpcmVfXygxNjQpLFxuICAgICAgbyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTk3KSxcbiAgICAgIGwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3NSksXG4gICAgICBjID0gX193X3BkZmpzX3JlcXVpcmVfXygyMDApO1xuICB9KSgpO1xuICByZXR1cm4gX19uZXN0ZWRfd2VicGFja19leHBvcnRzX187XG59KSgpKTtcblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9wZGYuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIHRyeVRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYEFzc2VydDogSXNDYWxsYWJsZShhcmd1bWVudCkgaXMgdHJ1ZWBcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmIChpc0NhbGxhYmxlKGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50O1xuICB0aHJvdyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgdHJ5VG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RyeS10by1zdHJpbmcuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSBpcyB0cnVlYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgaWYgKGlzQ29uc3RydWN0b3IoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIGlmICh0eXBlb2YgYXJndW1lbnQgPT0gJ29iamVjdCcgfHwgaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBhcmd1bWVudDtcbiAgdGhyb3cgJFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArICRTdHJpbmcoYXJndW1lbnQpICsgJyBhcyBhIHByb3RvdHlwZScpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLXBvc3NpYmxlLXByb3RvdHlwZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIikuZik7XG5cbnZhciBVTlNDT1BBQkxFUyA9IHdlbGxLbm93blN5bWJvbCgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5pZiAoQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkge1xuICBkZWZpbmVQcm9wZXJ0eShBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IGNyZWF0ZShudWxsKVxuICB9KTtcbn1cblxuLy8gYWRkIGEga2V5IHRvIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjaGFyQXQgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzXCIpLmNoYXJBdCk7XG5cbi8vIGBBZHZhbmNlU3RyaW5nSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gY2hhckF0KFMsIGluZGV4KS5sZW5ndGggOiAxKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUHJvdG90eXBlKSB7XG4gIGlmIChpc1Byb3RvdHlwZU9mKFByb3RvdHlwZSwgaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93ICRUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xuXG52YXIgJFN0cmluZyA9IFN0cmluZztcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoaXNPYmplY3QoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7XG4gIHRocm93ICRUeXBlRXJyb3IoJFN0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1iYXNpYy1kZXRlY3Rpb24uanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXR5cGVkLWFycmF5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT0gJ3VuZGVmaW5lZCc7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLWJhc2ljLWRldGVjdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItbm9uLWV4dGVuc2libGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gRkYyNi0gYnVnOiBBcnJheUJ1ZmZlcnMgYXJlIG5vbi1leHRlbnNpYmxlLCBidXQgT2JqZWN0LmlzRXh0ZW5zaWJsZSBkb2VzIG5vdCByZXBvcnQgaXRcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig4KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWlzZXh0ZW5zaWJsZSwgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBpZiAoT2JqZWN0LmlzRXh0ZW5zaWJsZShidWZmZXIpKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVmZmVyLCAnYScsIHsgdmFsdWU6IDggfSk7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1iYXNpYy1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItYmFzaWMtZGV0ZWN0aW9uLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIHRyeVRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RyeS10by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcbnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzXCIpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qc1wiKTtcblxudmFyIGVuZm9yY2VJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5lbmZvcmNlO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIEludDhBcnJheVByb3RvdHlwZSA9IEludDhBcnJheSAmJiBJbnQ4QXJyYXkucHJvdG90eXBlO1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5ID0gZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5O1xudmFyIFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlID0gVWludDhDbGFtcGVkQXJyYXkgJiYgVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlO1xudmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTtcbnZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5UHJvdG90eXBlICYmIGdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBUWVBFRF9BUlJBWV9UQUcgPSB1aWQoJ1RZUEVEX0FSUkFZX1RBRycpO1xudmFyIFRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SID0gJ1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcic7XG4vLyBGaXhpbmcgbmF0aXZlIHR5cGVkIGFycmF5cyBpbiBPcGVyYSBQcmVzdG8gY3Jhc2hlcyB0aGUgYnJvd3Nlciwgc2VlICM1OTVcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gTkFUSVZFX0FSUkFZX0JVRkZFUiAmJiAhIXNldFByb3RvdHlwZU9mICYmIGNsYXNzb2YoZ2xvYmFsLm9wZXJhKSAhPT0gJ09wZXJhJztcbnZhciBUWVBFRF9BUlJBWV9UQUdfUkVRVUlSRUQgPSBmYWxzZTtcbnZhciBOQU1FLCBDb25zdHJ1Y3RvciwgUHJvdG90eXBlO1xuXG52YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QgPSB7XG4gIEludDhBcnJheTogMSxcbiAgVWludDhBcnJheTogMSxcbiAgVWludDhDbGFtcGVkQXJyYXk6IDEsXG4gIEludDE2QXJyYXk6IDIsXG4gIFVpbnQxNkFycmF5OiAyLFxuICBJbnQzMkFycmF5OiA0LFxuICBVaW50MzJBcnJheTogNCxcbiAgRmxvYXQzMkFycmF5OiA0LFxuICBGbG9hdDY0QXJyYXk6IDhcbn07XG5cbnZhciBCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3QgPSB7XG4gIEJpZ0ludDY0QXJyYXk6IDgsXG4gIEJpZ1VpbnQ2NEFycmF5OiA4XG59O1xuXG52YXIgaXNWaWV3ID0gZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gZmFsc2U7XG4gIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpO1xuICByZXR1cm4ga2xhc3MgPT09ICdEYXRhVmlldydcbiAgICB8fCBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKVxuICAgIHx8IGhhc093bihCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKTtcbn07XG5cbnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlT2YoaXQpO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSkgcmV0dXJuO1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb3RvKTtcbiAgcmV0dXJuIChzdGF0ZSAmJiBoYXNPd24oc3RhdGUsIFRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SKSkgPyBzdGF0ZVtUWVBFRF9BUlJBWV9DT05TVFJVQ1RPUl0gOiBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IocHJvdG8pO1xufTtcblxudmFyIGlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGZhbHNlO1xuICB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTtcbiAgcmV0dXJuIGhhc093bihUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpXG4gICAgfHwgaGFzT3duKEJpZ0ludEFycmF5Q29uc3RydWN0b3JzTGlzdCwga2xhc3MpO1xufTtcblxudmFyIGFUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpc1R5cGVkQXJyYXkoaXQpKSByZXR1cm4gaXQ7XG4gIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Jyk7XG59O1xuXG52YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7XG4gIGlmIChpc0NhbGxhYmxlKEMpICYmICghc2V0UHJvdG90eXBlT2YgfHwgaXNQcm90b3R5cGVPZihUeXBlZEFycmF5LCBDKSkpIHJldHVybiBDO1xuICB0aHJvdyBUeXBlRXJyb3IodHJ5VG9TdHJpbmcoQykgKyAnIGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yJyk7XG59O1xuXG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IGZ1bmN0aW9uIChLRVksIHByb3BlcnR5LCBmb3JjZWQsIG9wdGlvbnMpIHtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoZm9yY2VkKSBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkge1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgIGlmIChUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgaGFzT3duKFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIEtFWSkpIHRyeSB7XG4gICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBvbGQgV2ViS2l0IGJ1ZyAtIHNvbWUgbWV0aG9kcyBhcmUgbm9uLWNvbmZpZ3VyYWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldID0gcHJvcGVydHk7XG4gICAgICB9IGNhdGNoIChlcnJvcjIpIHsgLyogZW1wdHkgKi8gfVxuICAgIH1cbiAgfVxuICBpZiAoIVR5cGVkQXJyYXlQcm90b3R5cGVbS0VZXSB8fCBmb3JjZWQpIHtcbiAgICBkZWZpbmVCdWlsdEluKFR5cGVkQXJyYXlQcm90b3R5cGUsIEtFWSwgZm9yY2VkID8gcHJvcGVydHlcbiAgICAgIDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG5cbnZhciBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kID0gZnVuY3Rpb24gKEtFWSwgcHJvcGVydHksIGZvcmNlZCkge1xuICB2YXIgQVJSQVksIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuO1xuICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICBpZiAoZm9yY2VkKSBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxbQVJSQVldO1xuICAgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVkpKSB0cnkge1xuICAgICAgICBkZWxldGUgVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV07XG4gICAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gICAgfVxuICAgIGlmICghVHlwZWRBcnJheVtLRVldIHx8IGZvcmNlZCkge1xuICAgICAgLy8gVjggfiBDaHJvbWUgNDktNTAgYCVUeXBlZEFycmF5JWAgbWV0aG9kcyBhcmUgbm9uLXdyaXRhYmxlIG5vbi1jb25maWd1cmFibGVcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVCdWlsdEluKFR5cGVkQXJyYXksIEtFWSwgZm9yY2VkID8gcHJvcGVydHkgOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIFR5cGVkQXJyYXlbS0VZXSB8fCBwcm9wZXJ0eSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gICAgfSBlbHNlIHJldHVybjtcbiAgfVxuICBmb3IgKEFSUkFZIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsW0FSUkFZXTtcbiAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmICghVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV0gfHwgZm9yY2VkKSkge1xuICAgICAgZGVmaW5lQnVpbHRJbihUeXBlZEFycmF5Q29uc3RydWN0b3IsIEtFWSwgcHJvcGVydHkpO1xuICAgIH1cbiAgfVxufTtcblxuZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIENvbnN0cnVjdG9yID0gZ2xvYmFsW05BTUVdO1xuICBQcm90b3R5cGUgPSBDb25zdHJ1Y3RvciAmJiBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIGlmIChQcm90b3R5cGUpIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFByb3RvdHlwZSlbVFlQRURfQVJSQVlfQ09OU1RSVUNUT1JdID0gQ29uc3RydWN0b3I7XG4gIGVsc2UgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IGZhbHNlO1xufVxuXG5mb3IgKE5BTUUgaW4gQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gIENvbnN0cnVjdG9yID0gZ2xvYmFsW05BTUVdO1xuICBQcm90b3R5cGUgPSBDb25zdHJ1Y3RvciAmJiBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIGlmIChQcm90b3R5cGUpIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFByb3RvdHlwZSlbVFlQRURfQVJSQVlfQ09OU1RSVUNUT1JdID0gQ29uc3RydWN0b3I7XG59XG5cbi8vIFdlYktpdCBidWcgLSB0eXBlZCBhcnJheXMgY29uc3RydWN0b3JzIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIWlzQ2FsbGFibGUoVHlwZWRBcnJheSkgfHwgVHlwZWRBcnJheSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gc2FmZVxuICBUeXBlZEFycmF5ID0gZnVuY3Rpb24gVHlwZWRBcnJheSgpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7XG4gIH07XG4gIGlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSBmb3IgKE5BTUUgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIHtcbiAgICBpZiAoZ2xvYmFsW05BTUVdKSBzZXRQcm90b3R5cGVPZihnbG9iYWxbTkFNRV0sIFR5cGVkQXJyYXkpO1xuICB9XG59XG5cbmlmICghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB8fCAhVHlwZWRBcnJheVByb3RvdHlwZSB8fCBUeXBlZEFycmF5UHJvdG90eXBlID09PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkucHJvdG90eXBlO1xuICBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7XG4gICAgaWYgKGdsb2JhbFtOQU1FXSkgc2V0UHJvdG90eXBlT2YoZ2xvYmFsW05BTUVdLnByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG4gIH1cbn1cblxuLy8gV2ViS2l0IGJ1ZyAtIG9uZSBtb3JlIG9iamVjdCBpbiBVaW50OENsYW1wZWRBcnJheSBwcm90b3R5cGUgY2hhaW5cbmlmIChOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlKSAhPT0gVHlwZWRBcnJheVByb3RvdHlwZSkge1xuICBzZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSwgVHlwZWRBcnJheVByb3RvdHlwZSk7XG59XG5cbmlmIChERVNDUklQVE9SUyAmJiAhaGFzT3duKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gIFRZUEVEX0FSUkFZX1RBR19SRVFVSVJFRCA9IHRydWU7XG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMpID8gdGhpc1tUWVBFRF9BUlJBWV9UQUddIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgaWYgKGdsb2JhbFtOQU1FXSkge1xuICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShnbG9iYWxbTkFNRV0sIFRZUEVEX0FSUkFZX1RBRywgTkFNRSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MsXG4gIFRZUEVEX0FSUkFZX1RBRzogVFlQRURfQVJSQVlfVEFHX1JFUVVJUkVEICYmIFRZUEVEX0FSUkFZX1RBRyxcbiAgYVR5cGVkQXJyYXk6IGFUeXBlZEFycmF5LFxuICBhVHlwZWRBcnJheUNvbnN0cnVjdG9yOiBhVHlwZWRBcnJheUNvbnN0cnVjdG9yLFxuICBleHBvcnRUeXBlZEFycmF5TWV0aG9kOiBleHBvcnRUeXBlZEFycmF5TWV0aG9kLFxuICBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOiBleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kLFxuICBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3I6IGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixcbiAgaXNWaWV3OiBpc1ZpZXcsXG4gIGlzVHlwZWRBcnJheTogaXNUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5OiBUeXBlZEFycmF5LFxuICBUeXBlZEFycmF5UHJvdG90eXBlOiBUeXBlZEFycmF5UHJvdG90eXBlXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIE5BVElWRV9BUlJBWV9CVUZGRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLWJhc2ljLWRldGVjdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1iYXNpYy1kZXRlY3Rpb24uanNcIik7XG52YXIgRnVuY3Rpb25OYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanNcIik7XG52YXIgSUVFRTc1NCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pZWVlNzU0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWVlZTc1NC5qc1wiKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lcyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qc1wiKS5mKTtcbnZhciBhcnJheUZpbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktZmlsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZpbGwuanNcIik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUuanNcIik7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG5cbnZhciBQUk9QRVJfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5QUk9QRVI7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuQ09ORklHVVJBQkxFO1xudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgREFUQV9WSUVXID0gJ0RhdGFWaWV3JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoJztcbnZhciBXUk9OR19JTkRFWCA9ICdXcm9uZyBpbmRleCc7XG52YXIgZ2V0SW50ZXJuYWxBcnJheUJ1ZmZlclN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoQVJSQVlfQlVGRkVSKTtcbnZhciBnZXRJbnRlcm5hbERhdGFWaWV3U3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihEQVRBX1ZJRVcpO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBOYXRpdmVBcnJheUJ1ZmZlciA9IGdsb2JhbFtBUlJBWV9CVUZGRVJdO1xudmFyICRBcnJheUJ1ZmZlciA9IE5hdGl2ZUFycmF5QnVmZmVyO1xudmFyIEFycmF5QnVmZmVyUHJvdG90eXBlID0gJEFycmF5QnVmZmVyICYmICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdO1xudmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddO1xudmFyIERhdGFWaWV3UHJvdG90eXBlID0gJERhdGFWaWV3ICYmICREYXRhVmlld1tQUk9UT1RZUEVdO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIGZpbGwgPSB1bmN1cnJ5VGhpcyhhcnJheUZpbGwpO1xudmFyIHJldmVyc2UgPSB1bmN1cnJ5VGhpcyhbXS5yZXZlcnNlKTtcblxudmFyIHBhY2tJRUVFNzU0ID0gSUVFRTc1NC5wYWNrO1xudmFyIHVucGFja0lFRUU3NTQgPSBJRUVFNzU0LnVucGFjaztcblxudmFyIHBhY2tJbnQ4ID0gZnVuY3Rpb24gKG51bWJlcikge1xuICByZXR1cm4gW251bWJlciAmIDB4RkZdO1xufTtcblxudmFyIHBhY2tJbnQxNiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkZdO1xufTtcblxudmFyIHBhY2tJbnQzMiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIFtudW1iZXIgJiAweEZGLCBudW1iZXIgPj4gOCAmIDB4RkYsIG51bWJlciA+PiAxNiAmIDB4RkYsIG51bWJlciA+PiAyNCAmIDB4RkZdO1xufTtcblxudmFyIHVucGFja0ludDMyID0gZnVuY3Rpb24gKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyWzNdIDw8IDI0IHwgYnVmZmVyWzJdIDw8IDE2IHwgYnVmZmVyWzFdIDw8IDggfCBidWZmZXJbMF07XG59O1xuXG52YXIgcGFja0Zsb2F0MzIgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChudW1iZXIsIDIzLCA0KTtcbn07XG5cbnZhciBwYWNrRmxvYXQ2NCA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KG51bWJlciwgNTIsIDgpO1xufTtcblxudmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChDb25zdHJ1Y3Rvciwga2V5LCBnZXRJbnRlcm5hbFN0YXRlKSB7XG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihDb25zdHJ1Y3RvcltQUk9UT1RZUEVdLCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKVtrZXldO1xuICAgIH1cbiAgfSk7XG59O1xuXG52YXIgZ2V0ID0gZnVuY3Rpb24gKHZpZXcsIGNvdW50LCBpbmRleCwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIHN0b3JlID0gZ2V0SW50ZXJuYWxEYXRhVmlld1N0YXRlKHZpZXcpO1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KGluZGV4KTtcbiAgdmFyIGJvb2xJc0xpdHRsZUVuZGlhbiA9ICEhaXNMaXR0bGVFbmRpYW47XG4gIGlmIChpbnRJbmRleCArIGNvdW50ID4gc3RvcmUuYnl0ZUxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBieXRlcyA9IHN0b3JlLmJ5dGVzO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHN0b3JlLmJ5dGVPZmZzZXQ7XG4gIHZhciBwYWNrID0gYXJyYXlTbGljZShieXRlcywgc3RhcnQsIHN0YXJ0ICsgY291bnQpO1xuICByZXR1cm4gYm9vbElzTGl0dGxlRW5kaWFuID8gcGFjayA6IHJldmVyc2UocGFjayk7XG59O1xuXG52YXIgc2V0ID0gZnVuY3Rpb24gKHZpZXcsIGNvdW50LCBpbmRleCwgY29udmVyc2lvbiwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBzdG9yZSA9IGdldEludGVybmFsRGF0YVZpZXdTdGF0ZSh2aWV3KTtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChpbmRleCk7XG4gIHZhciBwYWNrID0gY29udmVyc2lvbigrdmFsdWUpO1xuICB2YXIgYm9vbElzTGl0dGxlRW5kaWFuID0gISFpc0xpdHRsZUVuZGlhbjtcbiAgaWYgKGludEluZGV4ICsgY291bnQgPiBzdG9yZS5ieXRlTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIGJ5dGVzID0gc3RvcmUuYnl0ZXM7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgc3RvcmUuYnl0ZU9mZnNldDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSBieXRlc1tzdGFydCArIGldID0gcGFja1tib29sSXNMaXR0bGVFbmRpYW4gPyBpIDogY291bnQgLSBpIC0gMV07XG59O1xuXG5pZiAoIU5BVElWRV9BUlJBWV9CVUZGRVIpIHtcbiAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBBcnJheUJ1ZmZlclByb3RvdHlwZSk7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0b0luZGV4KGxlbmd0aCk7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBBUlJBWV9CVUZGRVIsXG4gICAgICBieXRlczogZmlsbChBcnJheShieXRlTGVuZ3RoKSwgMCksXG4gICAgICBieXRlTGVuZ3RoOiBieXRlTGVuZ3RoXG4gICAgfSk7XG4gICAgaWYgKCFERVNDUklQVE9SUykge1xuICAgICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDtcbiAgICAgIHRoaXMuZGV0YWNoZWQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgQXJyYXlCdWZmZXJQcm90b3R5cGUgPSAkQXJyYXlCdWZmZXJbUFJPVE9UWVBFXTtcblxuICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsIERhdGFWaWV3UHJvdG90eXBlKTtcbiAgICBhbkluc3RhbmNlKGJ1ZmZlciwgQXJyYXlCdWZmZXJQcm90b3R5cGUpO1xuICAgIHZhciBidWZmZXJTdGF0ZSA9IGdldEludGVybmFsQXJyYXlCdWZmZXJTdGF0ZShidWZmZXIpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBidWZmZXJTdGF0ZS5ieXRlTGVuZ3RoO1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXJPckluZmluaXR5KGJ5dGVPZmZzZXQpO1xuICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0Jyk7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ1ZmZlckxlbmd0aCAtIG9mZnNldCA6IHRvTGVuZ3RoKGJ5dGVMZW5ndGgpO1xuICAgIGlmIChvZmZzZXQgKyBieXRlTGVuZ3RoID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICB0eXBlOiBEQVRBX1ZJRVcsXG4gICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGgsXG4gICAgICBieXRlT2Zmc2V0OiBvZmZzZXQsXG4gICAgICBieXRlczogYnVmZmVyU3RhdGUuYnl0ZXNcbiAgICB9KTtcbiAgICBpZiAoIURFU0NSSVBUT1JTKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG4gICAgICB0aGlzLmJ5dGVPZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICB9O1xuXG4gIERhdGFWaWV3UHJvdG90eXBlID0gJERhdGFWaWV3W1BST1RPVFlQRV07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgYWRkR2V0dGVyKCRBcnJheUJ1ZmZlciwgJ2J5dGVMZW5ndGgnLCBnZXRJbnRlcm5hbEFycmF5QnVmZmVyU3RhdGUpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsICdidWZmZXInLCBnZXRJbnRlcm5hbERhdGFWaWV3U3RhdGUpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsICdieXRlTGVuZ3RoJywgZ2V0SW50ZXJuYWxEYXRhVmlld1N0YXRlKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCAnYnl0ZU9mZnNldCcsIGdldEludGVybmFsRGF0YVZpZXdTdGF0ZSk7XG4gIH1cblxuICBkZWZpbmVCdWlsdElucyhEYXRhVmlld1Byb3RvdHlwZSwge1xuICAgIGdldEludDg6IGZ1bmN0aW9uIGdldEludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDtcbiAgICB9LFxuICAgIGdldFVpbnQ4OiBmdW5jdGlvbiBnZXRVaW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MTY6IGZ1bmN0aW9uIGdldEludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKTtcbiAgICAgIHJldHVybiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKSA8PCAxNiA+PiAxNjtcbiAgICB9LFxuICAgIGdldFVpbnQxNjogZnVuY3Rpb24gZ2V0VWludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKTtcbiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gZ2V0SW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKSk7XG4gICAgfSxcbiAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIGdldFVpbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSW50MzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogZmFsc2UpKSA+Pj4gMDtcbiAgICB9LFxuICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogZmFsc2UpLCAyMyk7XG4gICAgfSxcbiAgICBnZXRGbG9hdDY0OiBmdW5jdGlvbiBnZXRGbG9hdDY0KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlKSwgNTIpO1xuICAgIH0sXG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJbnQ4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSW50OCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0SW50MTY6IGZ1bmN0aW9uIHNldEludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0ludDE2LCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBmYWxzZSk7XG4gICAgfSxcbiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJbnQxNiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogZmFsc2UpO1xuICAgIH0sXG4gICAgc2V0SW50MzI6IGZ1bmN0aW9uIHNldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0ludDMyLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBmYWxzZSk7XG4gICAgfSxcbiAgICBzZXRVaW50MzI6IGZ1bmN0aW9uIHNldFVpbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJbnQzMiwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogZmFsc2UpO1xuICAgIH0sXG4gICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tGbG9hdDMyLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBmYWxzZSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDY0OiBmdW5jdGlvbiBzZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Zsb2F0NjQsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IGZhbHNlKTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgdmFyIElOQ09SUkVDVF9BUlJBWV9CVUZGRVJfTkFNRSA9IFBST1BFUl9GVU5DVElPTl9OQU1FICYmIE5hdGl2ZUFycmF5QnVmZmVyLm5hbWUgIT09IEFSUkFZX0JVRkZFUjtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG4gIGlmICghZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIE5hdGl2ZUFycmF5QnVmZmVyKDEpO1xuICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBOYXRpdmVBcnJheUJ1ZmZlcigtMSk7XG4gIH0pIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoKTtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoMS41KTtcbiAgICBuZXcgTmF0aXZlQXJyYXlCdWZmZXIoTmFOKTtcbiAgICByZXR1cm4gTmF0aXZlQXJyYXlCdWZmZXIubGVuZ3RoICE9IDEgfHwgSU5DT1JSRUNUX0FSUkFZX0JVRkZFUl9OQU1FICYmICFDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRTtcbiAgfSkpIHtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqL1xuICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgICAgYW5JbnN0YW5jZSh0aGlzLCBBcnJheUJ1ZmZlclByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gbmV3IE5hdGl2ZUFycmF5QnVmZmVyKHRvSW5kZXgobGVuZ3RoKSk7XG4gICAgfTtcblxuICAgICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdID0gQXJyYXlCdWZmZXJQcm90b3R5cGU7XG5cbiAgICBmb3IgKHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVBcnJheUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajspIHtcbiAgICAgIGlmICghKChrZXkgPSBrZXlzW2orK10pIGluICRBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KCRBcnJheUJ1ZmZlciwga2V5LCBOYXRpdmVBcnJheUJ1ZmZlcltrZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBBcnJheUJ1ZmZlclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICRBcnJheUJ1ZmZlcjtcbiAgfSBlbHNlIGlmIChJTkNPUlJFQ1RfQVJSQVlfQlVGRkVSX05BTUUgJiYgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUpIHtcbiAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoTmF0aXZlQXJyYXlCdWZmZXIsICduYW1lJywgQVJSQVlfQlVGRkVSKTtcbiAgfVxuXG4gIC8vIFdlYktpdCBidWcgLSB0aGUgc2FtZSBwYXJlbnQgcHJvdG90eXBlIGZvciB0eXBlZCBhcnJheXMgYW5kIGRhdGEgdmlld1xuICBpZiAoc2V0UHJvdG90eXBlT2YgJiYgZ2V0UHJvdG90eXBlT2YoRGF0YVZpZXdQcm90b3R5cGUpICE9PSBPYmplY3RQcm90b3R5cGUpIHtcbiAgICBzZXRQcm90b3R5cGVPZihEYXRhVmlld1Byb3RvdHlwZSwgT2JqZWN0UHJvdG90eXBlKTtcbiAgfVxuXG4gIC8vIGlPUyBTYWZhcmkgNy54IGJ1Z1xuICB2YXIgdGVzdFZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpO1xuICB2YXIgJHNldEludDggPSB1bmN1cnJ5VGhpcyhEYXRhVmlld1Byb3RvdHlwZS5zZXRJbnQ4KTtcbiAgdGVzdFZpZXcuc2V0SW50OCgwLCAyMTQ3NDgzNjQ4KTtcbiAgdGVzdFZpZXcuc2V0SW50OCgxLCAyMTQ3NDgzNjQ5KTtcbiAgaWYgKHRlc3RWaWV3LmdldEludDgoMCkgfHwgIXRlc3RWaWV3LmdldEludDgoMSkpIGRlZmluZUJ1aWx0SW5zKERhdGFWaWV3UHJvdG90eXBlLCB7XG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDgodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfVxuICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cblxuc2V0VG9TdHJpbmdUYWcoJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuc2V0VG9TdHJpbmdUYWcoJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlcixcbiAgRGF0YVZpZXc6ICREYXRhVmlld1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXIuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZmlsbC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maWxsXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhcmd1bWVudHNMZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuICB2YXIgZW5kUG9zID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpO1xuICB3aGlsZSAoZW5kUG9zID4gaW5kZXgpIE9baW5kZXgrK10gPSB2YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZpbGwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS1jb25zdHJ1Y3Rvci1hbmQtbGlzdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGxpc3QpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGxpc3QpO1xuICB2YXIgcmVzdWx0ID0gbmV3IENvbnN0cnVjdG9yKGxlbmd0aCk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20tY29uc3RydWN0b3ItYW5kLWxpc3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzXCIpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanNcIik7XG52YXIgaXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgY3JlYXRlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzXCIpO1xudmFyIGdldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qc1wiKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1wiKTtcblxudmFyICRBcnJheSA9IEFycmF5O1xuXG4vLyBgQXJyYXkuZnJvbWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBJU19DT05TVFJVQ1RPUiA9IGlzQ29uc3RydWN0b3IodGhpcyk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICB2YXIgaXRlcmF0b3JNZXRob2QgPSBnZXRJdGVyYXRvck1ldGhvZChPKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvciwgbmV4dCwgdmFsdWU7XG4gIC8vIGlmIHRoZSB0YXJnZXQgaXMgbm90IGl0ZXJhYmxlIG9yIGl0J3MgYW4gYXJyYXkgd2l0aCB0aGUgZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBhIHNpbXBsZSBjYXNlXG4gIGlmIChpdGVyYXRvck1ldGhvZCAmJiAhKHRoaXMgPT09ICRBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIHJlc3VsdCA9IElTX0NPTlNUUlVDVE9SID8gbmV3IHRoaXMoKSA6IFtdO1xuICAgIGZvciAoOyEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lOyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZSA9IG1hcHBpbmcgPyBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgICByZXN1bHQgPSBJU19DT05TVFJVQ1RPUiA/IG5ldyB0aGlzKGxlbmd0aCkgOiAkQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdO1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZyb20uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzXCIpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBpZiAoKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pICYmIE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuICBpbmNsdWRlczogY3JlYXRlTWV0aG9kKHRydWUpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmluZGV4T2ZgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4gIGluZGV4T2Y6IGNyZWF0ZU1ldGhvZChmYWxzZSlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLnsgZmluZExhc3QsIGZpbmRMYXN0SW5kZXggfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxudmFyIGNyZWF0ZU1ldGhvZCA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHZhciBJU19GSU5EX0xBU1RfSU5ERVggPSBUWVBFID09IDE7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gICAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGNhbGxiYWNrZm4sIHRoYXQpO1xuICAgIHZhciBpbmRleCA9IGxlbmd0aE9mQXJyYXlMaWtlKHNlbGYpO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIHdoaWxlIChpbmRleC0tID4gMCkge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiB2YWx1ZTsgLy8gZmluZExhc3RcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gaW5kZXg7IC8vIGZpbmRMYXN0SW5kZXhcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfTEFTVF9JTkRFWCA/IC0xIDogdW5kZWZpbmVkO1xuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maW5kLWZyb20tbGFzdFxuICBmaW5kTGFzdDogY3JlYXRlTWV0aG9kKDApLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maW5kLWZyb20tbGFzdFxuICBmaW5kTGFzdEluZGV4OiBjcmVhdGVNZXRob2QoMSlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUuanNcIik7XG5cbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBmb3JFYWNoLCBtYXAsIGZpbHRlciwgc29tZSwgZXZlcnksIGZpbmQsIGZpbmRJbmRleCwgZmlsdGVyUmVqZWN0IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbnZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoVFlQRSkge1xuICB2YXIgSVNfTUFQID0gVFlQRSA9PSAxO1xuICB2YXIgSVNfRklMVEVSID0gVFlQRSA9PSAyO1xuICB2YXIgSVNfU09NRSA9IFRZUEUgPT0gMztcbiAgdmFyIElTX0VWRVJZID0gVFlQRSA9PSA0O1xuICB2YXIgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNjtcbiAgdmFyIElTX0ZJTFRFUl9SRUpFQ1QgPSBUWVBFID09IDc7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0LCBzcGVjaWZpY0NyZWF0ZSkge1xuICAgIHZhciBPID0gdG9PYmplY3QoJHRoaXMpO1xuICAgIHZhciBzZWxmID0gSW5kZXhlZE9iamVjdChPKTtcbiAgICB2YXIgYm91bmRGdW5jdGlvbiA9IGJpbmQoY2FsbGJhY2tmbiwgdGhhdCk7XG4gICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKHNlbGYpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNyZWF0ZSA9IHNwZWNpZmljQ3JlYXRlIHx8IGFycmF5U3BlY2llc0NyZWF0ZTtcbiAgICB2YXIgdGFyZ2V0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSIHx8IElTX0ZJTFRFUl9SRUpFQ1QgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWx1ZSwgcmVzdWx0O1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsdWUgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlc3VsdCA9IGJvdW5kRnVuY3Rpb24odmFsdWUsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHRhcmdldFtpbmRleF0gPSByZXN1bHQ7IC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsdWU7ICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiBwdXNoKHRhcmdldCwgdmFsdWUpOyAgICAgIC8vIGZpbHRlclxuICAgICAgICB9IGVsc2Ugc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIC8vIGV2ZXJ5XG4gICAgICAgICAgY2FzZSA3OiBwdXNoKHRhcmdldCwgdmFsdWUpOyAgICAgIC8vIGZpbHRlclJlamVjdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxuICBmb3JFYWNoOiBjcmVhdGVNZXRob2QoMCksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4gIG1hcDogY3JlYXRlTWV0aG9kKDEpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuICBmaWx0ZXI6IGNyZWF0ZU1ldGhvZCgyKSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5zb21lYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuICBzb21lOiBjcmVhdGVNZXRob2QoMyksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZXZlcnlgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5ldmVyeVxuICBldmVyeTogY3JlYXRlTWV0aG9kKDQpLFxuICAvLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4gIGZpbmQ6IGNyZWF0ZU1ldGhvZCg1KSxcbiAgLy8gYEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kSW5kZXhcbiAgZmluZEluZGV4OiBjcmVhdGVNZXRob2QoNiksXG4gIC8vIGBBcnJheS5wcm90b3R5cGUuZmlsdGVyUmVqZWN0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZmlsdGVyaW5nXG4gIGZpbHRlclJlamVjdDogY3JlYXRlTWV0aG9kKDcpXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSwgYXJndW1lbnQpIHtcbiAgdmFyIG1ldGhvZCA9IFtdW01FVEhPRF9OQU1FXTtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgbWV0aG9kLmNhbGwobnVsbCwgYXJndW1lbnQgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSwgMSk7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGguanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgaXNBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBTYWZhcmkgPCAxMyBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvciBpbiB0aGlzIGNhc2VcbnZhciBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPSBERVNDUklQVE9SUyAmJiAhZnVuY3Rpb24gKCkge1xuICAvLyBtYWtlcyBubyBzZW5zZSB3aXRob3V0IHByb3BlciBzdHJpY3QgbW9kZSBzdXBwb3J0XG4gIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwgJ2xlbmd0aCcsIHsgd3JpdGFibGU6IGZhbHNlIH0pLmxlbmd0aCA9IDE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gU0lMRU5UX09OX05PTl9XUklUQUJMRV9MRU5HVEhfU0VUID8gZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICBpZiAoaXNBcnJheShPKSAmJiAhZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sICdsZW5ndGgnKS53cml0YWJsZSkge1xuICAgIHRocm93ICRUeXBlRXJyb3IoJ0Nhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgnKTtcbiAgfSByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59IDogZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b0Fic29sdXRlSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qc1wiKTtcblxudmFyICRBcnJheSA9IEFycmF5O1xudmFyIG1heCA9IE1hdGgubWF4O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIGsgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBmaW4gPSB0b0Fic29sdXRlSW5kZXgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQsIGxlbmd0aCk7XG4gIHZhciByZXN1bHQgPSAkQXJyYXkobWF4KGZpbiAtIGssIDApKTtcbiAgZm9yICh2YXIgbiA9IDA7IGsgPCBmaW47IGsrKywgbisrKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIG4sIE9ba10pO1xuICByZXN1bHQubGVuZ3RoID0gbjtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoW10uc2xpY2UpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNvcnQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGFycmF5U2xpY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2Utc2ltcGxlLmpzXCIpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG52YXIgbWVyZ2VTb3J0ID0gZnVuY3Rpb24gKGFycmF5LCBjb21wYXJlZm4pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgdmFyIG1pZGRsZSA9IGZsb29yKGxlbmd0aCAvIDIpO1xuICByZXR1cm4gbGVuZ3RoIDwgOCA/IGluc2VydGlvblNvcnQoYXJyYXksIGNvbXBhcmVmbikgOiBtZXJnZShcbiAgICBhcnJheSxcbiAgICBtZXJnZVNvcnQoYXJyYXlTbGljZShhcnJheSwgMCwgbWlkZGxlKSwgY29tcGFyZWZuKSxcbiAgICBtZXJnZVNvcnQoYXJyYXlTbGljZShhcnJheSwgbWlkZGxlKSwgY29tcGFyZWZuKSxcbiAgICBjb21wYXJlZm5cbiAgKTtcbn07XG5cbnZhciBpbnNlcnRpb25Tb3J0ID0gZnVuY3Rpb24gKGFycmF5LCBjb21wYXJlZm4pIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgdmFyIGkgPSAxO1xuICB2YXIgZWxlbWVudCwgajtcblxuICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgIGogPSBpO1xuICAgIGVsZW1lbnQgPSBhcnJheVtpXTtcbiAgICB3aGlsZSAoaiAmJiBjb21wYXJlZm4oYXJyYXlbaiAtIDFdLCBlbGVtZW50KSA+IDApIHtcbiAgICAgIGFycmF5W2pdID0gYXJyYXlbLS1qXTtcbiAgICB9XG4gICAgaWYgKGogIT09IGkrKykgYXJyYXlbal0gPSBlbGVtZW50O1xuICB9IHJldHVybiBhcnJheTtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIChhcnJheSwgbGVmdCwgcmlnaHQsIGNvbXBhcmVmbikge1xuICB2YXIgbGxlbmd0aCA9IGxlZnQubGVuZ3RoO1xuICB2YXIgcmxlbmd0aCA9IHJpZ2h0Lmxlbmd0aDtcbiAgdmFyIGxpbmRleCA9IDA7XG4gIHZhciByaW5kZXggPSAwO1xuXG4gIHdoaWxlIChsaW5kZXggPCBsbGVuZ3RoIHx8IHJpbmRleCA8IHJsZW5ndGgpIHtcbiAgICBhcnJheVtsaW5kZXggKyByaW5kZXhdID0gKGxpbmRleCA8IGxsZW5ndGggJiYgcmluZGV4IDwgcmxlbmd0aClcbiAgICAgID8gY29tcGFyZWZuKGxlZnRbbGluZGV4XSwgcmlnaHRbcmluZGV4XSkgPD0gMCA/IGxlZnRbbGluZGV4KytdIDogcmlnaHRbcmluZGV4KytdXG4gICAgICA6IGxpbmRleCA8IGxsZW5ndGggPyBsZWZ0W2xpbmRleCsrXSA6IHJpZ2h0W3JpbmRleCsrXTtcbiAgfSByZXR1cm4gYXJyYXk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1lcmdlU29ydDtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zb3J0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qc1wiKTtcbnZhciBpc0NvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyICRBcnJheSA9IEFycmF5O1xuXG4vLyBhIHBhcnQgb2YgYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmIChpc0NvbnN0cnVjdG9yKEMpICYmIChDID09PSAkQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGVsc2UgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gJEFycmF5IDogQztcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG5cbi8vIGBBcnJheVNwZWNpZXNDcmVhdGVgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXksIGxlbmd0aCkge1xuICByZXR1cm4gbmV3IChhcnJheVNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbEFycmF5KSkobGVuZ3RoID09PSAwID8gMCA6IGxlbmd0aCk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXRvLXJldmVyc2VkLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xuXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtY2hhbmdlLWFycmF5LWJ5LWNvcHkvI3NlYy1hcnJheS5wcm90b3R5cGUudG9SZXZlcnNlZFxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5LyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b1JldmVyc2VkXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBDKSB7XG4gIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIEEgPSBuZXcgQyhsZW4pO1xuICB2YXIgayA9IDA7XG4gIGZvciAoOyBrIDwgbGVuOyBrKyspIEFba10gPSBPW2xlbiAtIGsgLSAxXTtcbiAgcmV0dXJuIEE7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXRvLXJldmVyc2VkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXdpdGguanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxuLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5LyNzZWMtYXJyYXkucHJvdG90eXBlLndpdGhcbi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1jaGFuZ2UtYXJyYXktYnktY29weS8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUud2l0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgQywgaW5kZXgsIHZhbHVlKSB7XG4gIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgdmFyIHJlbGF0aXZlSW5kZXggPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgdmFyIGFjdHVhbEluZGV4ID0gcmVsYXRpdmVJbmRleCA8IDAgPyBsZW4gKyByZWxhdGl2ZUluZGV4IDogcmVsYXRpdmVJbmRleDtcbiAgaWYgKGFjdHVhbEluZGV4ID49IGxlbiB8fCBhY3R1YWxJbmRleCA8IDApIHRocm93ICRSYW5nZUVycm9yKCdJbmNvcnJlY3QgaW5kZXgnKTtcbiAgdmFyIEEgPSBuZXcgQyhsZW4pO1xuICB2YXIgayA9IDA7XG4gIGZvciAoOyBrIDwgbGVuOyBrKyspIEFba10gPSBrID09PSBhY3R1YWxJbmRleCA/IHZhbHVlIDogT1trXTtcbiAgcmV0dXJuIEE7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXdpdGguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2FsbC13aXRoLXNhZmUtaXRlcmF0aW9uLWNsb3NpbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpdGVyYXRvckNsb3NlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanNcIik7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWZyb20sIG5vLXRocm93LWxpdGVyYWwgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKHt9LnRvU3RyaW5nKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHN0cmluZ1NsaWNlKHRvU3RyaW5nKGl0KSwgOCwgLTEpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBUT19TVFJJTkdfVEFHX1NVUFBPUlQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBjbGFzc29mUmF3ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG5cbnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpO1xudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IFRPX1NUUklOR19UQUdfU1VQUE9SVCA/IGNsYXNzb2ZSYXcgOiBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSAkT2JqZWN0KGl0KSwgVE9fU1RSSU5HX1RBRykpID09ICdzdHJpbmcnID8gdGFnXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBDT1JSRUNUX0FSR1VNRU5UUyA/IGNsYXNzb2ZSYXcoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT0gJ09iamVjdCcgJiYgaXNDYWxsYWJsZShPLmNhbGxlZSkgPyAnQXJndW1lbnRzJyA6IHJlc3VsdDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdElucyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW5zICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucy5qc1wiKTtcbnZhciBnZXRXZWFrRGF0YSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YS5qc1wiKS5nZXRXZWFrRGF0YSk7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzXCIpO1xudmFyIEFycmF5SXRlcmF0aW9uTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzXCIpO1xuXG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcbnZhciBmaW5kID0gQXJyYXlJdGVyYXRpb25Nb2R1bGUuZmluZDtcbnZhciBmaW5kSW5kZXggPSBBcnJheUl0ZXJhdGlvbk1vZHVsZS5maW5kSW5kZXg7XG52YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmZyb3plbiB8fCAoc3RhdGUuZnJvemVuID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xuXG52YXIgVW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbnRyaWVzID0gW107XG59O1xuXG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGZpbmQoc3RvcmUuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gIH0pO1xufTtcblxuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuZW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gZmluZEluZGV4KHRoaXMuZW50cmllcywgZnVuY3Rpb24gKGl0KSB7XG4gICAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgICB9KTtcbiAgICBpZiAofmluZGV4KSBzcGxpY2UodGhpcy5lbnRyaWVzLCBpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgUHJvdG90eXBlKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpZDogaWQrKyxcbiAgICAgICAgZnJvemVuOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdGVyYWJsZSkpIGl0ZXJhdGUoaXRlcmFibGUsIHRoYXRbQURERVJdLCB7IHRoYXQ6IHRoYXQsIEFTX0VOVFJJRVM6IElTX01BUCB9KTtcbiAgICB9KTtcblxuICAgIHZhciBQcm90b3R5cGUgPSBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGFuT2JqZWN0KGtleSksIHRydWUpO1xuICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTtcbiAgICAgIGVsc2UgZGF0YVtzdGF0ZS5pZF0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICBkZWZpbmVCdWlsdElucyhQcm90b3R5cGUsIHtcbiAgICAgIC8vIGB7IFdlYWtNYXAsIFdlYWtTZXQgfS5wcm90b3R5cGUuZGVsZXRlKGtleSlgIG1ldGhvZHNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuZGVsZXRlXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWtzZXQucHJvdG90eXBlLmRlbGV0ZVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgaGFzT3duKGRhdGEsIHN0YXRlLmlkKSAmJiBkZWxldGUgZGF0YVtzdGF0ZS5pZF07XG4gICAgICB9LFxuICAgICAgLy8gYHsgV2Vha01hcCwgV2Vha1NldCB9LnByb3RvdHlwZS5oYXMoa2V5KWAgbWV0aG9kc1xuICAgICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLnByb3RvdHlwZS5oYXNcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha3NldC5wcm90b3R5cGUuaGFzXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc09iamVjdChrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBkYXRhID0gZ2V0V2Vha0RhdGEoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgaGFzT3duKGRhdGEsIHN0YXRlLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRlZmluZUJ1aWx0SW5zKFByb3RvdHlwZSwgSVNfTUFQID8ge1xuICAgICAgLy8gYFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtd2Vha21hcC5wcm90b3R5cGUuZ2V0XG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gYFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWttYXAucHJvdG90eXBlLnNldFxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyBgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXdlYWtzZXQucHJvdG90eXBlLmFkZFxuICAgICAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZSh0aGlzLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGlzRm9yY2VkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanNcIik7XG52YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qc1wiKTtcbnZhciBhbkluc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4taW5zdGFuY2UuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT05TVFJVQ1RPUl9OQU1FLCB3cmFwcGVyLCBjb21tb24pIHtcbiAgdmFyIElTX01BUCA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignTWFwJykgIT09IC0xO1xuICB2YXIgSVNfV0VBSyA9IENPTlNUUlVDVE9SX05BTUUuaW5kZXhPZignV2VhaycpICE9PSAtMTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIE5hdGl2ZUNvbnN0cnVjdG9yID0gZ2xvYmFsW0NPTlNUUlVDVE9SX05BTUVdO1xuICB2YXIgTmF0aXZlUHJvdG90eXBlID0gTmF0aXZlQ29uc3RydWN0b3IgJiYgTmF0aXZlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgQ29uc3RydWN0b3IgPSBOYXRpdmVDb25zdHJ1Y3RvcjtcbiAgdmFyIGV4cG9ydGVkID0ge307XG5cbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgdW5jdXJyaWVkTmF0aXZlTWV0aG9kID0gdW5jdXJyeVRoaXMoTmF0aXZlUHJvdG90eXBlW0tFWV0pO1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvdG90eXBlLCBLRVksXG4gICAgICBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICAgICAgdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIHZhbHVlID09PSAwID8gMCA6IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGtleSkgPyB1bmRlZmluZWQgOiB1bmN1cnJpZWROYXRpdmVNZXRob2QodGhpcywga2V5ID09PSAwID8gMCA6IGtleSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3Qoa2V5KSA/IGZhbHNlIDogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHRoaXMsIGtleSA9PT0gMCA/IDAgOiBrZXkpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHVuY3VycmllZE5hdGl2ZU1ldGhvZCh0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgdmFyIFJFUExBQ0UgPSBpc0ZvcmNlZChcbiAgICBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICFpc0NhbGxhYmxlKE5hdGl2ZUNvbnN0cnVjdG9yKSB8fCAhKElTX1dFQUsgfHwgTmF0aXZlUHJvdG90eXBlLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7XG4gICAgfSkpXG4gICk7XG5cbiAgaWYgKFJFUExBQ0UpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuZW5hYmxlKCk7XG4gIH0gZWxzZSBpZiAoaXNGb3JjZWQoQ09OU1RSVUNUT1JfTkFNRSwgdHJ1ZSkpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgdmFyIEhBU05UX0NIQUlOSU5HID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZTtcbiAgICAvLyBWOCB+IENocm9taXVtIDQwLSB3ZWFrLWNvbGxlY3Rpb25zIHRocm93cyBvbiBwcmltaXRpdmVzLCBidXQgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgIHZhciBUSFJPV1NfT05fUFJJTUlUSVZFUyA9IGZhaWxzKGZ1bmN0aW9uICgpIHsgaW5zdGFuY2UuaGFzKDEpOyB9KTtcbiAgICAvLyBtb3N0IGVhcmx5IGltcGxlbWVudGF0aW9ucyBkb2Vzbid0IHN1cHBvcnRzIGl0ZXJhYmxlcywgbW9zdCBtb2Rlcm4gLSBub3QgY2xvc2UgaXQgY29ycmVjdGx5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgIHZhciBBQ0NFUFRfSVRFUkFCTEVTID0gY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkgeyBuZXcgTmF0aXZlQ29uc3RydWN0b3IoaXRlcmFibGUpOyB9KTtcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpO1xuICAgICAgdmFyIGluZGV4ID0gNTtcbiAgICAgIHdoaWxlIChpbmRleC0tKSAkaW5zdGFuY2VbQURERVJdKGluZGV4LCBpbmRleCk7XG4gICAgICByZXR1cm4gISRpbnN0YW5jZS5oYXMoLTApO1xuICAgIH0pO1xuXG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKGR1bW15LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKGR1bW15LCBOYXRpdmVQcm90b3R5cGUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCBkdW1teSwgQ29uc3RydWN0b3IpO1xuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0ZXJhYmxlKSkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHsgdGhhdDogdGhhdCwgQVNfRU5UUklFUzogSVNfTUFQIH0pO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gTmF0aXZlUHJvdG90eXBlO1xuICAgICAgTmF0aXZlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgfVxuXG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuXG4gICAgaWYgKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpIGZpeE1ldGhvZChBRERFUik7XG5cbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmIChJU19XRUFLICYmIE5hdGl2ZVByb3RvdHlwZS5jbGVhcikgZGVsZXRlIE5hdGl2ZVByb3RvdHlwZS5jbGVhcjtcbiAgfVxuXG4gIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gQ29uc3RydWN0b3I7XG4gICQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IENvbnN0cnVjdG9yICE9IE5hdGl2ZUNvbnN0cnVjdG9yIH0sIGV4cG9ydGVkKTtcblxuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKENvbnN0cnVjdG9yLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBvd25LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL293bi1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3duLWtleXMuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgZXhjZXB0aW9ucykge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkgJiYgIShleGNlcHRpb25zICYmIGhhc093bihleGNlcHRpb25zLCBrZXkpKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICAgIH1cbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHZhciByZWdleHAgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgIHRyeSB7XG4gICAgICByZWdleHBbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gICAgfSBjYXRjaCAoZXJyb3IyKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRwcm90b3R5cGVvZiAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKCkpICE9PSBGLnByb3RvdHlwZTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvcnJlY3QtcHJvdG90eXBlLWdldHRlci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0LmpzIjooKG1vZHVsZSk9PntldmFsKCJcbi8vIGBDcmVhdGVJdGVyUmVzdWx0T2JqZWN0YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlaXRlcnJlc3VsdG9iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUsIGRvbmUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiBkb25lIH07XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHRvUHJvcGVydHlLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHByb3BlcnR5S2V5ID0gdG9Qcm9wZXJ0eUtleShrZXkpO1xuICBpZiAocHJvcGVydHlLZXkgaW4gb2JqZWN0KSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwgcHJvcGVydHlLZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtwcm9wZXJ0eUtleV0gPSB2YWx1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgbWFrZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWFrZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanNcIik7XG52YXIgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcikge1xuICBpZiAoZGVzY3JpcHRvci5nZXQpIG1ha2VCdWlsdEluKGRlc2NyaXB0b3IuZ2V0LCBuYW1lLCB7IGdldHRlcjogdHJ1ZSB9KTtcbiAgaWYgKGRlc2NyaXB0b3Iuc2V0KSBtYWtlQnVpbHRJbihkZXNjcmlwdG9yLnNldCwgbmFtZSwgeyBzZXR0ZXI6IHRydWUgfSk7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eS5mKHRhcmdldCwgbmFtZSwgZGVzY3JpcHRvcik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBtYWtlQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9tYWtlLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWFrZS1idWlsdC1pbi5qc1wiKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcbiAgdmFyIHNpbXBsZSA9IG9wdGlvbnMuZW51bWVyYWJsZTtcbiAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTtcbiAgaWYgKGlzQ2FsbGFibGUodmFsdWUpKSBtYWtlQnVpbHRJbih2YWx1ZSwgbmFtZSwgb3B0aW9ucyk7XG4gIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lR2xvYmFsUHJvcGVydHkoa2V5LCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghb3B0aW9ucy51bnNhZmUpIGRlbGV0ZSBPW2tleV07XG4gICAgICBlbHNlIGlmIChPW2tleV0pIHNpbXBsZSA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2UgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiAhb3B0aW9ucy5ub25Db25maWd1cmFibGUsXG4gICAgICB3cml0YWJsZTogIW9wdGlvbnMubm9uV3JpdGFibGVcbiAgICB9KTtcbiAgfSByZXR1cm4gTztcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgb3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWwsIGtleSwgeyB2YWx1ZTogdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIFApIHtcbiAgaWYgKCFkZWxldGUgT1tQXSkgdGhyb3cgJFR5cGVFcnJvcignQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAnICsgdHJ5VG9TdHJpbmcoUCkgKyAnIG9mICcgKyB0cnlUb1N0cmluZyhPKSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlbGV0ZS1wcm9wZXJ0eS1vci10aHJvdy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxuLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb25cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPSA3O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtYWxsLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbnZhciBkb2N1bWVudEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0JyAmJiBkb2N1bWVudC5hbGw7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtSXNIVE1MRERBLWludGVybmFsLXNsb3Rcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXR5cGVvZi11bmRlZmluZWQgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBJU19IVE1MRERBID0gdHlwZW9mIGRvY3VtZW50QWxsID09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50QWxsICE9PSB1bmRlZmluZWQ7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhbGw6IGRvY3VtZW50QWxsLFxuICBJU19IVE1MRERBOiBJU19IVE1MRERBXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWFsbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanNcIik7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIEVYSVNUUyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEVYSVNUUyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXIuanMiOigobW9kdWxlKT0+e2V2YWwoIlxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDB4MUZGRkZGRkZGRkZGRkY7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID4gTUFYX1NBRkVfSU5URUdFUikgdGhyb3cgJFR5cGVFcnJvcignTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tZXhjZXB0aW9uLWNvbnN0YW50cy5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSW5kZXhTaXplRXJyb3I6IHsgczogJ0lOREVYX1NJWkVfRVJSJywgYzogMSwgbTogMSB9LFxuICBET01TdHJpbmdTaXplRXJyb3I6IHsgczogJ0RPTVNUUklOR19TSVpFX0VSUicsIGM6IDIsIG06IDAgfSxcbiAgSGllcmFyY2h5UmVxdWVzdEVycm9yOiB7IHM6ICdISUVSQVJDSFlfUkVRVUVTVF9FUlInLCBjOiAzLCBtOiAxIH0sXG4gIFdyb25nRG9jdW1lbnRFcnJvcjogeyBzOiAnV1JPTkdfRE9DVU1FTlRfRVJSJywgYzogNCwgbTogMSB9LFxuICBJbnZhbGlkQ2hhcmFjdGVyRXJyb3I6IHsgczogJ0lOVkFMSURfQ0hBUkFDVEVSX0VSUicsIGM6IDUsIG06IDEgfSxcbiAgTm9EYXRhQWxsb3dlZEVycm9yOiB7IHM6ICdOT19EQVRBX0FMTE9XRURfRVJSJywgYzogNiwgbTogMCB9LFxuICBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvcjogeyBzOiAnTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSJywgYzogNywgbTogMSB9LFxuICBOb3RGb3VuZEVycm9yOiB7IHM6ICdOT1RfRk9VTkRfRVJSJywgYzogOCwgbTogMSB9LFxuICBOb3RTdXBwb3J0ZWRFcnJvcjogeyBzOiAnTk9UX1NVUFBPUlRFRF9FUlInLCBjOiA5LCBtOiAxIH0sXG4gIEluVXNlQXR0cmlidXRlRXJyb3I6IHsgczogJ0lOVVNFX0FUVFJJQlVURV9FUlInLCBjOiAxMCwgbTogMSB9LFxuICBJbnZhbGlkU3RhdGVFcnJvcjogeyBzOiAnSU5WQUxJRF9TVEFURV9FUlInLCBjOiAxMSwgbTogMSB9LFxuICBTeW50YXhFcnJvcjogeyBzOiAnU1lOVEFYX0VSUicsIGM6IDEyLCBtOiAxIH0sXG4gIEludmFsaWRNb2RpZmljYXRpb25FcnJvcjogeyBzOiAnSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSJywgYzogMTMsIG06IDEgfSxcbiAgTmFtZXNwYWNlRXJyb3I6IHsgczogJ05BTUVTUEFDRV9FUlInLCBjOiAxNCwgbTogMSB9LFxuICBJbnZhbGlkQWNjZXNzRXJyb3I6IHsgczogJ0lOVkFMSURfQUNDRVNTX0VSUicsIGM6IDE1LCBtOiAxIH0sXG4gIFZhbGlkYXRpb25FcnJvcjogeyBzOiAnVkFMSURBVElPTl9FUlInLCBjOiAxNiwgbTogMCB9LFxuICBUeXBlTWlzbWF0Y2hFcnJvcjogeyBzOiAnVFlQRV9NSVNNQVRDSF9FUlInLCBjOiAxNywgbTogMSB9LFxuICBTZWN1cml0eUVycm9yOiB7IHM6ICdTRUNVUklUWV9FUlInLCBjOiAxOCwgbTogMSB9LFxuICBOZXR3b3JrRXJyb3I6IHsgczogJ05FVFdPUktfRVJSJywgYzogMTksIG06IDEgfSxcbiAgQWJvcnRFcnJvcjogeyBzOiAnQUJPUlRfRVJSJywgYzogMjAsIG06IDEgfSxcbiAgVVJMTWlzbWF0Y2hFcnJvcjogeyBzOiAnVVJMX01JU01BVENIX0VSUicsIGM6IDIxLCBtOiAxIH0sXG4gIFF1b3RhRXhjZWVkZWRFcnJvcjogeyBzOiAnUVVPVEFfRVhDRUVERURfRVJSJywgYzogMjIsIG06IDEgfSxcbiAgVGltZW91dEVycm9yOiB7IHM6ICdUSU1FT1VUX0VSUicsIGM6IDIzLCBtOiAxIH0sXG4gIEludmFsaWROb2RlVHlwZUVycm9yOiB7IHM6ICdJTlZBTElEX05PREVfVFlQRV9FUlInLCBjOiAyNCwgbTogMSB9LFxuICBEYXRhQ2xvbmVFcnJvcjogeyBzOiAnREFUQV9DTE9ORV9FUlInLCBjOiAyNSwgbTogMSB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1leGNlcHRpb24tY29uc3RhbnRzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zXG4vLyBmbGFnIC0gYGl0ZXJhYmxlYCBpbnRlcmZhY2UgLSAnZW50cmllcycsICdrZXlzJywgJ3ZhbHVlcycsICdmb3JFYWNoJyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IDAsXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IDAsXG4gIENTU1ZhbHVlTGlzdDogMCxcbiAgQ2xpZW50UmVjdExpc3Q6IDAsXG4gIERPTVJlY3RMaXN0OiAwLFxuICBET01TdHJpbmdMaXN0OiAwLFxuICBET01Ub2tlbkxpc3Q6IDEsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiAwLFxuICBGaWxlTGlzdDogMCxcbiAgSFRNTEFsbENvbGxlY3Rpb246IDAsXG4gIEhUTUxDb2xsZWN0aW9uOiAwLFxuICBIVE1MRm9ybUVsZW1lbnQ6IDAsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiAwLFxuICBNZWRpYUxpc3Q6IDAsXG4gIE1pbWVUeXBlQXJyYXk6IDAsXG4gIE5hbWVkTm9kZU1hcDogMCxcbiAgTm9kZUxpc3Q6IDEsXG4gIFBhaW50UmVxdWVzdExpc3Q6IDAsXG4gIFBsdWdpbjogMCxcbiAgUGx1Z2luQXJyYXk6IDAsXG4gIFNWR0xlbmd0aExpc3Q6IDAsXG4gIFNWR051bWJlckxpc3Q6IDAsXG4gIFNWR1BhdGhTZWdMaXN0OiAwLFxuICBTVkdQb2ludExpc3Q6IDAsXG4gIFNWR1N0cmluZ0xpc3Q6IDAsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IDAsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsXG4gIFN0eWxlU2hlZXRMaXN0OiAwLFxuICBUZXh0VHJhY2tDdWVMaXN0OiAwLFxuICBUZXh0VHJhY2tMaXN0OiAwLFxuICBUb3VjaExpc3Q6IDBcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tdG9rZW4tbGlzdC1wcm90b3R5cGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gaW4gb2xkIFdlYktpdCB2ZXJzaW9ucywgYGVsZW1lbnQuY2xhc3NMaXN0YCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgZ2xvYmFsIGBET01Ub2tlbkxpc3RgXG52YXIgZG9jdW1lbnRDcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanNcIik7XG5cbnZhciBjbGFzc0xpc3QgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ3NwYW4nKS5jbGFzc0xpc3Q7XG52YXIgRE9NVG9rZW5MaXN0UHJvdG90eXBlID0gY2xhc3NMaXN0ICYmIGNsYXNzTGlzdC5jb25zdHJ1Y3RvciAmJiBjbGFzc0xpc3QuY29uc3RydWN0b3IucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTVRva2VuTGlzdFByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSA/IHVuZGVmaW5lZCA6IERPTVRva2VuTGlzdFByb3RvdHlwZTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tdG9rZW4tbGlzdC1wcm90b3R5cGUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzXCIpO1xuXG52YXIgZmlyZWZveCA9IHVzZXJBZ2VudC5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS9pKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIWZpcmVmb3ggJiYgK2ZpcmVmb3hbMV07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIElTX0RFTk8gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtZGVuby5qc1wiKTtcbnZhciBJU19OT0RFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gIUlTX0RFTk8gJiYgIUlTX05PREVcbiAgJiYgdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0J1xuICAmJiB0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCc7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8uanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLyogZ2xvYmFsIERlbm8gLS0gRGVubyBjYXNlICovXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBEZW5vID09ICdvYmplY3QnICYmIERlbm8gJiYgdHlwZW9mIERlbm8udmVyc2lvbiA9PSAnb2JqZWN0JztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtZGVuby5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgVUEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvTVNJRXxUcmlkZW50Ly50ZXN0KFVBKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdXNlckFnZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gL2lwYWR8aXBob25lfGlwb2QvaS50ZXN0KHVzZXJBZ2VudCkgJiYgdHlwZW9mIFBlYmJsZSAhPSAndW5kZWZpbmVkJztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1c2VyQWdlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZG9zL25vLXZ1bG5lcmFibGUgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSAvKD86aXBhZHxpcGhvbmV8aXBvZCkuKmFwcGxld2Via2l0L2kudGVzdCh1c2VyQWdlbnQpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLW5vZGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcHJvY2VzcyAhPSAndW5kZWZpbmVkJyAmJiBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtd2Vib3Mtd2Via2l0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1c2VyQWdlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLXVzZXItYWdlbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAvd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KHVzZXJBZ2VudCk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudC5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gJ3VuZGVmaW5lZCcgJiYgU3RyaW5nKG5hdmlnYXRvci51c2VyQWdlbnQpIHx8ICcnO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzXCIpO1xuXG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIERlbm8gPSBnbG9iYWwuRGVubztcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucyB8fCBEZW5vICYmIERlbm8udmVyc2lvbjtcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4O1xudmFyIG1hdGNoLCB2ZXJzaW9uO1xuXG5pZiAodjgpIHtcbiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpO1xuICAvLyBpbiBvbGQgQ2hyb21lLCB2ZXJzaW9ucyBvZiBWOCBpc24ndCBWOCA9IENocm9tZSAvIDEwXG4gIC8vIGJ1dCB0aGVpciBjb3JyZWN0IHZlcnNpb25zIGFyZSBub3QgaW50ZXJlc3RpbmcgZm9yIHVzXG4gIHZlcnNpb24gPSBtYXRjaFswXSA+IDAgJiYgbWF0Y2hbMF0gPCA0ID8gMSA6ICsobWF0Y2hbMF0gKyBtYXRjaFsxXSk7XG59XG5cbi8vIEJyb3dzZXJGUyBOb2RlSlMgYHByb2Nlc3NgIHBvbHlmaWxsIGluY29ycmVjdGx5IHNldCBgLnY4YCB0byBgMC4wYFxuLy8gc28gY2hlY2sgYHVzZXJBZ2VudGAgZXZlbiBpZiBgLnY4YCBleGlzdHMsIGJ1dCAwXG5pZiAoIXZlcnNpb24gJiYgdXNlckFnZW50KSB7XG4gIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyk7XG4gIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHtcbiAgICBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgaWYgKG1hdGNoKSB2ZXJzaW9uID0gK21hdGNoWzFdO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmVyc2lvbjtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtd2Via2l0LXZlcnNpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVzZXJBZ2VudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdXNlci1hZ2VudCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS11c2VyLWFnZW50LmpzXCIpO1xuXG52YXIgd2Via2l0ID0gdXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFxcLyhcXGQrKVxcLi8pO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICEhd2Via2l0ICYmICt3ZWJraXRbMV07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXdlYmtpdC12ZXJzaW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG52YXIgJEVycm9yID0gRXJyb3I7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xuXG52YXIgVEVTVCA9IChmdW5jdGlvbiAoYXJnKSB7IHJldHVybiBTdHJpbmcoJEVycm9yKGFyZykuc3RhY2spOyB9KSgnenhjYXNkJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVkb3Mvbm8tdnVsbmVyYWJsZSAtLSBzYWZlXG52YXIgVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZID0gL1xcblxccyphdCBbXjpdKjpbXlxcbl0qLztcbnZhciBJU19WOF9PUl9DSEFLUkFfU1RBQ0sgPSBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkudGVzdChURVNUKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhY2ssIGRyb3BFbnRyaWVzKSB7XG4gIGlmIChJU19WOF9PUl9DSEFLUkFfU1RBQ0sgJiYgdHlwZW9mIHN0YWNrID09ICdzdHJpbmcnICYmICEkRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UpIHtcbiAgICB3aGlsZSAoZHJvcEVudHJpZXMtLSkgc3RhY2sgPSByZXBsYWNlKHN0YWNrLCBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlksICcnKTtcbiAgfSByZXR1cm4gc3RhY2s7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgY2xlYXJFcnJvclN0YWNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXJyb3Itc3RhY2stY2xlYXIuanNcIik7XG52YXIgRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qc1wiKTtcblxuLy8gbm9uLXN0YW5kYXJkIFY4XG52YXIgY2FwdHVyZVN0YWNrVHJhY2UgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXJyb3IsIEMsIHN0YWNrLCBkcm9wRW50cmllcykge1xuICBpZiAoRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUpIHtcbiAgICBpZiAoY2FwdHVyZVN0YWNrVHJhY2UpIGNhcHR1cmVTdGFja1RyYWNlKGVycm9yLCBDKTtcbiAgICBlbHNlIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywgY2xlYXJFcnJvclN0YWNrKHN0YWNrLCBkcm9wRW50cmllcykpO1xuICB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGVycm9yID0gRXJyb3IoJ2EnKTtcbiAgaWYgKCEoJ3N0YWNrJyBpbiBlcnJvcikpIHJldHVybiB0cnVlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnc3RhY2snLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgNykpO1xuICByZXR1cm4gZXJyb3Iuc3RhY2sgIT09IDc7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci10by1zdHJpbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzXCIpO1xuXG52YXIgbmF0aXZlRXJyb3JUb1N0cmluZyA9IEVycm9yLnByb3RvdHlwZS50b1N0cmluZztcblxudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIENocm9tZSAzMi0gaW5jb3JyZWN0bHkgY2FsbCBhY2Nlc3NvclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIHZhciBvYmplY3QgPSBjcmVhdGUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnbmFtZScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcyA9PT0gb2JqZWN0O1xuICAgIH0gfSkpO1xuICAgIGlmIChuYXRpdmVFcnJvclRvU3RyaW5nLmNhbGwob2JqZWN0KSAhPT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBGRjEwLSBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgbm9uLXN0cmluZ3NcbiAgcmV0dXJuIG5hdGl2ZUVycm9yVG9TdHJpbmcuY2FsbCh7IG1lc3NhZ2U6IDEsIG5hbWU6IDIgfSkgIT09ICcyOiAxJ1xuICAgIC8vIElFOCBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgZGVmYXVsdHNcbiAgICB8fCBuYXRpdmVFcnJvclRvU3RyaW5nLmNhbGwoe30pICE9PSAnRXJyb3InO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gSU5DT1JSRUNUX1RPX1NUUklORyA/IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICB2YXIgTyA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgbmFtZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KE8ubmFtZSwgJ0Vycm9yJyk7XG4gIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoTy5tZXNzYWdlKTtcbiAgcmV0dXJuICFuYW1lID8gbWVzc2FnZSA6ICFtZXNzYWdlID8gbmFtZSA6IG5hbWUgKyAnOiAnICsgbWVzc2FnZTtcbn0gOiBuYXRpdmVFcnJvclRvU3RyaW5nO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXRvLXN0cmluZy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKS5mKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xudmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1nbG9iYWwtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5LmpzXCIpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzXCIpO1xudmFyIGlzRm9yY2VkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qc1wiKTtcblxuLypcbiAgb3B0aW9ucy50YXJnZXQgICAgICAgICAtIG5hbWUgb2YgdGhlIHRhcmdldCBvYmplY3RcbiAgb3B0aW9ucy5nbG9iYWwgICAgICAgICAtIHRhcmdldCBpcyB0aGUgZ2xvYmFsIG9iamVjdFxuICBvcHRpb25zLnN0YXQgICAgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnByb3RvICAgICAgICAgIC0gZXhwb3J0IGFzIHByb3RvdHlwZSBtZXRob2RzIG9mIHRhcmdldFxuICBvcHRpb25zLnJlYWwgICAgICAgICAgIC0gcmVhbCBwcm90b3R5cGUgbWV0aG9kIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy5mb3JjZWQgICAgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGVcbiAgb3B0aW9ucy5iaW5kICAgICAgICAgICAtIGJpbmQgbWV0aG9kcyB0byB0aGUgdGFyZ2V0LCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMud3JhcCAgICAgICAgICAgLSB3cmFwIGNvbnN0cnVjdG9ycyB0byBwcmV2ZW50aW5nIGdsb2JhbCBwb2xsdXRpb24sIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy51bnNhZmUgICAgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eVxuICBvcHRpb25zLnNoYW0gICAgICAgICAgIC0gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICBvcHRpb25zLmVudW1lcmFibGUgICAgIC0gZXhwb3J0IGFzIGVudW1lcmFibGUgcHJvcGVydHlcbiAgb3B0aW9ucy5kb250Q2FsbEdldFNldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXRcbiAgb3B0aW9ucy5uYW1lICAgICAgICAgICAtIHRoZSAubmFtZSBvZiB0aGUgZnVuY3Rpb24gaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGtleVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLmRvbnRDYWxsR2V0U2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT0gdHlwZW9mIHRhcmdldFByb3BlcnR5KSBjb250aW51ZTtcbiAgICAgIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoc291cmNlUHJvcGVydHksIHRhcmdldFByb3BlcnR5KTtcbiAgICB9XG4gICAgLy8gYWRkIGEgZmxhZyB0byBub3QgY29tcGxldGVseSBmdWxsIHBvbHlmaWxsc1xuICAgIGlmIChvcHRpb25zLnNoYW0gfHwgKHRhcmdldFByb3BlcnR5ICYmIHRhcmdldFByb3BlcnR5LnNoYW0pKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIGRlZmluZUJ1aWx0SW4odGFyZ2V0LCBrZXksIHNvdXJjZVByb3BlcnR5LCBvcHRpb25zKTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgbW92ZWQgdG8gZW50cnkgcG9pbnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xudmFyIHJlZ2V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjLCBGT1JDRUQsIFNIQU0pIHtcbiAgdmFyIFNZTUJPTCA9IHdlbGxLbm93blN5bWJvbChLRVkpO1xuXG4gIHZhciBERUxFR0FURVNfVE9fU1lNQk9MID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdHJpbmcgbWV0aG9kcyBjYWxsIHN5bWJvbC1uYW1lZCBSZWdFcCBtZXRob2RzXG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pO1xuXG4gIHZhciBERUxFR0FURVNfVE9fRVhFQyA9IERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTeW1ib2wtbmFtZWQgUmVnRXhwIG1ldGhvZHMgY2FsbCAuZXhlY1xuICAgIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gICAgdmFyIHJlID0gL2EvO1xuXG4gICAgaWYgKEtFWSA9PT0gJ3NwbGl0Jykge1xuICAgICAgLy8gV2UgY2FuJ3QgdXNlIHJlYWwgcmVnZXggaGVyZSBzaW5jZSBpdCBjYXVzZXMgZGVvcHRpbWl6YXRpb25cbiAgICAgIC8vIGFuZCBzZXJpb3VzIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGluIFY4XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzA2XG4gICAgICByZSA9IHt9O1xuICAgICAgLy8gUmVnRXhwW0BAc3BsaXRdIGRvZXNuJ3QgY2FsbCB0aGUgcmVnZXgncyBleGVjIG1ldGhvZCwgYnV0IGZpcnN0IGNyZWF0ZXNcbiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS5cbiAgICAgIHJlLmNvbnN0cnVjdG9yID0ge307XG4gICAgICByZS5jb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlOyB9O1xuICAgICAgcmUuZmxhZ3MgPSAnJztcbiAgICAgIHJlW1NZTUJPTF0gPSAvLi9bU1lNQk9MXTtcbiAgICB9XG5cbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG5cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIEZPUkNFRFxuICApIHtcbiAgICB2YXIgdW5jdXJyaWVkTmF0aXZlUmVnRXhwTWV0aG9kID0gdW5jdXJyeVRoaXMoLy4vW1NZTUJPTF0pO1xuICAgIHZhciBtZXRob2RzID0gZXhlYyhTWU1CT0wsICcnW0tFWV0sIGZ1bmN0aW9uIChuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgdmFyIHVuY3VycmllZE5hdGl2ZU1ldGhvZCA9IHVuY3VycnlUaGlzKG5hdGl2ZU1ldGhvZCk7XG4gICAgICB2YXIgJGV4ZWMgPSByZWdleHAuZXhlYztcbiAgICAgIGlmICgkZXhlYyA9PT0gcmVnZXhwRXhlYyB8fCAkZXhlYyA9PT0gUmVnRXhwUHJvdG90eXBlLmV4ZWMpIHtcbiAgICAgICAgaWYgKERFTEVHQVRFU19UT19TWU1CT0wgJiYgIWZvcmNlU3RyaW5nTWV0aG9kKSB7XG4gICAgICAgICAgLy8gVGhlIG5hdGl2ZSBTdHJpbmcgbWV0aG9kIGFscmVhZHkgZGVsZWdhdGVzIHRvIEBAbWV0aG9kICh0aGlzXG4gICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgIC8vIFdlIGF2b2lkIGl0IGJ5IGRpcmVjdGx5IGNhbGxpbmcgdGhlIG5hdGl2ZSBAQG1ldGhvZCBtZXRob2QuXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuY3VycmllZE5hdGl2ZVJlZ0V4cE1ldGhvZChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5jdXJyaWVkTmF0aXZlTWV0aG9kKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UgfTtcbiAgICB9KTtcblxuICAgIGRlZmluZUJ1aWx0SW4oU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBtZXRob2RzWzBdKTtcbiAgICBkZWZpbmVCdWlsdEluKFJlZ0V4cFByb3RvdHlwZSwgU1lNQk9MLCBtZXRob2RzWzFdKTtcbiAgfVxuXG4gIGlmIChTSEFNKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoUmVnRXhwUHJvdG90eXBlW1NZTUJPTF0sICdzaGFtJywgdHJ1ZSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWFycmF5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanNcIik7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcbnZhciBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvZXMtbm90LWV4Y2VlZC1zYWZlLWludGVnZXIuanNcIik7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG5cbi8vIGBGbGF0dGVuSW50b0FycmF5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUZsYXR0ZW5JbnRvQXJyYXlcbnZhciBmbGF0dGVuSW50b0FycmF5ID0gZnVuY3Rpb24gKHRhcmdldCwgb3JpZ2luYWwsIHNvdXJjZSwgc291cmNlTGVuLCBzdGFydCwgZGVwdGgsIG1hcHBlciwgdGhpc0FyZykge1xuICB2YXIgdGFyZ2V0SW5kZXggPSBzdGFydDtcbiAgdmFyIHNvdXJjZUluZGV4ID0gMDtcbiAgdmFyIG1hcEZuID0gbWFwcGVyID8gYmluZChtYXBwZXIsIHRoaXNBcmcpIDogZmFsc2U7XG4gIHZhciBlbGVtZW50LCBlbGVtZW50TGVuO1xuXG4gIHdoaWxlIChzb3VyY2VJbmRleCA8IHNvdXJjZUxlbikge1xuICAgIGlmIChzb3VyY2VJbmRleCBpbiBzb3VyY2UpIHtcbiAgICAgIGVsZW1lbnQgPSBtYXBGbiA/IG1hcEZuKHNvdXJjZVtzb3VyY2VJbmRleF0sIHNvdXJjZUluZGV4LCBvcmlnaW5hbCkgOiBzb3VyY2Vbc291cmNlSW5kZXhdO1xuXG4gICAgICBpZiAoZGVwdGggPiAwICYmIGlzQXJyYXkoZWxlbWVudCkpIHtcbiAgICAgICAgZWxlbWVudExlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKGVsZW1lbnQpO1xuICAgICAgICB0YXJnZXRJbmRleCA9IGZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBvcmlnaW5hbCwgZWxlbWVudCwgZWxlbWVudExlbiwgdGFyZ2V0SW5kZXgsIGRlcHRoIC0gMSkgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKHRhcmdldEluZGV4ICsgMSk7XG4gICAgICAgIHRhcmdldFt0YXJnZXRJbmRleF0gPSBlbGVtZW50O1xuICAgICAgfVxuXG4gICAgICB0YXJnZXRJbmRleCsrO1xuICAgIH1cbiAgICBzb3VyY2VJbmRleCsrO1xuICB9XG4gIHJldHVybiB0YXJnZXRJbmRleDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbkludG9BcnJheTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mbGF0dGVuLWludG8tYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUsIGVzL25vLW9iamVjdC1wcmV2ZW50ZXh0ZW5zaW9ucyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZyZWV6aW5nLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzXCIpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgYXBwbHkgPSBGdW5jdGlvblByb3RvdHlwZS5hcHBseTtcbnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXJlZmxlY3QgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgUmVmbGVjdCA9PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmFwcGx5IHx8IChOQVRJVkVfQklORCA/IGNhbGwuYmluZChhcHBseSkgOiBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYWxsLmFwcGx5KGFwcGx5LCBhcmd1bWVudHMpO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qc1wiKTtcbnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtY2FsbGFibGUuanNcIik7XG52YXIgTkFUSVZFX0JJTkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1uYXRpdmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZS5qc1wiKTtcblxudmFyIGJpbmQgPSB1bmN1cnJ5VGhpcyh1bmN1cnJ5VGhpcy5iaW5kKTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCkge1xuICBhQ2FsbGFibGUoZm4pO1xuICByZXR1cm4gdGhhdCA9PT0gdW5kZWZpbmVkID8gZm4gOiBOQVRJVkVfQklORCA/IGJpbmQoZm4sIHRoYXQpIDogZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBzYWZlXG4gIHZhciB0ZXN0ID0gKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkuYmluZCgpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIC0tIHNhZmVcbiAgcmV0dXJuIHR5cGVvZiB0ZXN0ICE9ICdmdW5jdGlvbicgfHwgdGVzdC5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJyk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzXCIpO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gY2FsbC5iaW5kKGNhbGwpIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FsbC5hcHBseShjYWxsLCBhcmd1bWVudHMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlXG52YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBFWElTVFMgPSBoYXNPd24oRnVuY3Rpb25Qcm90b3R5cGUsICduYW1lJyk7XG4vLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzXG52YXIgUFJPUEVSID0gRVhJU1RTICYmIChmdW5jdGlvbiBzb21ldGhpbmcoKSB7IC8qIGVtcHR5ICovIH0pLm5hbWUgPT09ICdzb21ldGhpbmcnO1xudmFyIENPTkZJR1VSQUJMRSA9IEVYSVNUUyAmJiAoIURFU0NSSVBUT1JTIHx8IChERVNDUklQVE9SUyAmJiBnZXREZXNjcmlwdG9yKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpLmNvbmZpZ3VyYWJsZSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgRVhJU1RTOiBFWElTVFMsXG4gIFBST1BFUjogUFJPUEVSLFxuICBDT05GSUdVUkFCTEU6IENPTkZJR1VSQUJMRVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3Nvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIG1ldGhvZCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICByZXR1cm4gdW5jdXJyeVRoaXMoYUNhbGxhYmxlKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBrZXkpW21ldGhvZF0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtYWNjZXNzb3IuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY2xhc3NvZlJhdyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4pIHtcbiAgLy8gTmFzaG9ybiBidWc6XG4gIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzExMjhcbiAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTEzMFxuICBpZiAoY2xhc3NvZlJhdyhmbikgPT09ICdGdW5jdGlvbicpIHJldHVybiB1bmN1cnJ5VGhpcyhmbik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLW5hdGl2ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtbmF0aXZlLmpzXCIpO1xuXG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG52YXIgdW5jdXJyeVRoaXNXaXRoQmluZCA9IE5BVElWRV9CSU5EICYmIEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQuYmluZChjYWxsLCBjYWxsKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfQklORCA/IHVuY3VycnlUaGlzV2l0aEJpbmQgOiBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2FsbC5hcHBseShmbiwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG5cbnZhciBhRnVuY3Rpb24gPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzQ2FsbGFibGUoYXJndW1lbnQpID8gYXJndW1lbnQgOiB1bmRlZmluZWQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBhRnVuY3Rpb24oZ2xvYmFsW25hbWVzcGFjZV0pIDogZ2xvYmFsW25hbWVzcGFjZV0gJiYgZ2xvYmFsW25hbWVzcGFjZV1bbWV0aG9kXTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanNcIik7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgcmV0dXJuIGdldE1ldGhvZChpdCwgSVRFUkFUT1IpXG4gICAgfHwgZ2V0TWV0aG9kKGl0LCAnQEBpdGVyYXRvcicpXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qc1wiKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCB1c2luZ0l0ZXJhdG9yKSB7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZ2V0SXRlcmF0b3JNZXRob2QoYXJndW1lbnQpIDogdXNpbmdJdGVyYXRvcjtcbiAgaWYgKGFDYWxsYWJsZShpdGVyYXRvck1ldGhvZCkpIHJldHVybiBhbk9iamVjdChjYWxsKGl0ZXJhdG9yTWV0aG9kLCBhcmd1bWVudCkpO1xuICB0aHJvdyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGFyZ3VtZW50KSArICcgaXMgbm90IGl0ZXJhYmxlJyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtanNvbi1yZXBsYWNlci1mdW5jdGlvbi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGlzQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mLXJhdyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocmVwbGFjZXIpIHtcbiAgaWYgKGlzQ2FsbGFibGUocmVwbGFjZXIpKSByZXR1cm4gcmVwbGFjZXI7XG4gIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJldHVybjtcbiAgdmFyIHJhd0xlbmd0aCA9IHJlcGxhY2VyLmxlbmd0aDtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByYXdMZW5ndGg7IGkrKykge1xuICAgIHZhciBlbGVtZW50ID0gcmVwbGFjZXJbaV07XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnKSBwdXNoKGtleXMsIGVsZW1lbnQpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09ICdudW1iZXInIHx8IGNsYXNzb2YoZWxlbWVudCkgPT0gJ051bWJlcicgfHwgY2xhc3NvZihlbGVtZW50KSA9PSAnU3RyaW5nJykgcHVzaChrZXlzLCB0b1N0cmluZyhlbGVtZW50KSk7XG4gIH1cbiAgdmFyIGtleXNMZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIHJvb3QgPSB0cnVlO1xuICByZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBpZiAocm9vdCkge1xuICAgICAgcm9vdCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheSh0aGlzKSkgcmV0dXJuIHZhbHVlO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5c0xlbmd0aDsgaisrKSBpZiAoa2V5c1tqXSA9PT0ga2V5KSByZXR1cm4gdmFsdWU7XG4gIH07XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzXCIpO1xuXG4vLyBgR2V0TWV0aG9kYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChWLCBQKSB7XG4gIHZhciBmdW5jID0gVltQXTtcbiAgcmV0dXJuIGlzTnVsbE9yVW5kZWZpbmVkKGZ1bmMpID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zdWJzdGl0dXRpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG5cbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVkb3Mvbm8tdnVsbmVyYWJsZSAtLSBzYWZlXG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFMgPSAvXFwkKFskJidgXXxcXGR7MSwyfXw8W14+XSo+KS9nO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEID0gL1xcJChbJCYnYF18XFxkezEsMn0pL2c7XG5cbi8vIGBHZXRTdWJzdGl0dXRpb25gIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1nZXRzdWJzdGl0dXRpb25cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuICB2YXIgdGFpbFBvcyA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gIHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEO1xuICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbmFtZWRDYXB0dXJlcyA9IHRvT2JqZWN0KG5hbWVkQ2FwdHVyZXMpO1xuICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUztcbiAgfVxuICByZXR1cm4gcmVwbGFjZShyZXBsYWNlbWVudCwgc3ltYm9scywgZnVuY3Rpb24gKG1hdGNoLCBjaCkge1xuICAgIHZhciBjYXB0dXJlO1xuICAgIHN3aXRjaCAoY2hhckF0KGNoLCAwKSkge1xuICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICBjYXNlICcmJzogcmV0dXJuIG1hdGNoZWQ7XG4gICAgICBjYXNlICdgJzogcmV0dXJuIHN0cmluZ1NsaWNlKHN0ciwgMCwgcG9zaXRpb24pO1xuICAgICAgY2FzZSBcIidcIjogcmV0dXJuIHN0cmluZ1NsaWNlKHN0ciwgdGFpbFBvcyk7XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FwdHVyZSA9IG5hbWVkQ2FwdHVyZXNbc3RyaW5nU2xpY2UoY2gsIDEsIC0xKV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDogLy8gXFxkXFxkP1xuICAgICAgICB2YXIgbiA9ICtjaDtcbiAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgaWYgKG4gPiBtKSB7XG4gICAgICAgICAgdmFyIGYgPSBmbG9vcihuIC8gMTApO1xuICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgaWYgKGYgPD0gbSkgcmV0dXJuIGNhcHR1cmVzW2YgLSAxXSA9PT0gdW5kZWZpbmVkID8gY2hhckF0KGNoLCAxKSA6IGNhcHR1cmVzW2YgLSAxXSArIGNoYXJBdChjaCwgMSk7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9XG4gICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgfVxuICAgIHJldHVybiBjYXB0dXJlID09PSB1bmRlZmluZWQgPyAnJyA6IGNhcHR1cmU7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtc3Vic3RpdHV0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qcyI6KGZ1bmN0aW9uKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7ZXZhbCgiXG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT0gTWF0aCAmJiBpdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG5tb2R1bGUuZXhwb3J0cyA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1nbG9iYWwtdGhpcyAtLSBzYWZlXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09ICdvYmplY3QnICYmIGdsb2JhbFRoaXMpIHx8XG4gIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHNhZmVcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZikgfHxcbiAgY2hlY2sodHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18uZyA9PSAnb2JqZWN0JyAmJiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBmYWxsYmFja1xuICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCB0aGlzIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKHt9Lmhhc093blByb3BlcnR5KTtcblxuLy8gYEhhc093blByb3BlcnR5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaGFzb3ducHJvcGVydHlcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaGFzb3duIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0Lmhhc093biB8fCBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkodG9PYmplY3QoaXQpLCBrZXkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbm1vZHVsZS5leHBvcnRzID0ge307XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSBzYWZlXG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ2RvY3VtZW50JywgJ2RvY3VtZW50RWxlbWVudCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBjcmVhdGVFbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanNcIik7XG5cbi8vIFRoYW5rcyB0byBJRTggZm9yIGl0cyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWVlZTc1NC5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG4vLyBJRUVFNzU0IGNvbnZlcnNpb25zIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaWVlZTc1NFxudmFyICRBcnJheSA9IEFycmF5O1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcblxudmFyIHBhY2sgPSBmdW5jdGlvbiAobnVtYmVyLCBtYW50aXNzYUxlbmd0aCwgYnl0ZXMpIHtcbiAgdmFyIGJ1ZmZlciA9ICRBcnJheShieXRlcyk7XG4gIHZhciBleHBvbmVudExlbmd0aCA9IGJ5dGVzICogOCAtIG1hbnRpc3NhTGVuZ3RoIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBydCA9IG1hbnRpc3NhTGVuZ3RoID09PSAyMyA/IHBvdygyLCAtMjQpIC0gcG93KDIsIC03NykgOiAwO1xuICB2YXIgc2lnbiA9IG51bWJlciA8IDAgfHwgbnVtYmVyID09PSAwICYmIDEgLyBudW1iZXIgPCAwID8gMSA6IDA7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBleHBvbmVudCwgbWFudGlzc2EsIGM7XG4gIG51bWJlciA9IGFicyhudW1iZXIpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICBpZiAobnVtYmVyICE9IG51bWJlciB8fCBudW1iZXIgPT09IEluZmluaXR5KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBtYW50aXNzYSA9IG51bWJlciAhPSBudW1iZXIgPyAxIDogMDtcbiAgICBleHBvbmVudCA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZXhwb25lbnQgPSBmbG9vcihsb2cobnVtYmVyKSAvIExOMik7XG4gICAgYyA9IHBvdygyLCAtZXhwb25lbnQpO1xuICAgIGlmIChudW1iZXIgKiBjIDwgMSkge1xuICAgICAgZXhwb25lbnQtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG4gICAgaWYgKGV4cG9uZW50ICsgZUJpYXMgPj0gMSkge1xuICAgICAgbnVtYmVyICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtYmVyICs9IHJ0ICogcG93KDIsIDEgLSBlQmlhcyk7XG4gICAgfVxuICAgIGlmIChudW1iZXIgKiBjID49IDIpIHtcbiAgICAgIGV4cG9uZW50Kys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuICAgIGlmIChleHBvbmVudCArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG1hbnRpc3NhID0gMDtcbiAgICAgIGV4cG9uZW50ID0gZU1heDtcbiAgICB9IGVsc2UgaWYgKGV4cG9uZW50ICsgZUJpYXMgPj0gMSkge1xuICAgICAgbWFudGlzc2EgPSAobnVtYmVyICogYyAtIDEpICogcG93KDIsIG1hbnRpc3NhTGVuZ3RoKTtcbiAgICAgIGV4cG9uZW50ID0gZXhwb25lbnQgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbWFudGlzc2EgPSBudW1iZXIgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7XG4gICAgICBleHBvbmVudCA9IDA7XG4gICAgfVxuICB9XG4gIHdoaWxlIChtYW50aXNzYUxlbmd0aCA+PSA4KSB7XG4gICAgYnVmZmVyW2luZGV4KytdID0gbWFudGlzc2EgJiAyNTU7XG4gICAgbWFudGlzc2EgLz0gMjU2O1xuICAgIG1hbnRpc3NhTGVuZ3RoIC09IDg7XG4gIH1cbiAgZXhwb25lbnQgPSBleHBvbmVudCA8PCBtYW50aXNzYUxlbmd0aCB8IG1hbnRpc3NhO1xuICBleHBvbmVudExlbmd0aCArPSBtYW50aXNzYUxlbmd0aDtcbiAgd2hpbGUgKGV4cG9uZW50TGVuZ3RoID4gMCkge1xuICAgIGJ1ZmZlcltpbmRleCsrXSA9IGV4cG9uZW50ICYgMjU1O1xuICAgIGV4cG9uZW50IC89IDI1NjtcbiAgICBleHBvbmVudExlbmd0aCAtPSA4O1xuICB9XG4gIGJ1ZmZlclstLWluZGV4XSB8PSBzaWduICogMTI4O1xuICByZXR1cm4gYnVmZmVyO1xufTtcblxudmFyIHVucGFjayA9IGZ1bmN0aW9uIChidWZmZXIsIG1hbnRpc3NhTGVuZ3RoKSB7XG4gIHZhciBieXRlcyA9IGJ1ZmZlci5sZW5ndGg7XG4gIHZhciBleHBvbmVudExlbmd0aCA9IGJ5dGVzICogOCAtIG1hbnRpc3NhTGVuZ3RoIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBleHBvbmVudExlbmd0aCkgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBuQml0cyA9IGV4cG9uZW50TGVuZ3RoIC0gNztcbiAgdmFyIGluZGV4ID0gYnl0ZXMgLSAxO1xuICB2YXIgc2lnbiA9IGJ1ZmZlcltpbmRleC0tXTtcbiAgdmFyIGV4cG9uZW50ID0gc2lnbiAmIDEyNztcbiAgdmFyIG1hbnRpc3NhO1xuICBzaWduID4+PSA3O1xuICB3aGlsZSAobkJpdHMgPiAwKSB7XG4gICAgZXhwb25lbnQgPSBleHBvbmVudCAqIDI1NiArIGJ1ZmZlcltpbmRleC0tXTtcbiAgICBuQml0cyAtPSA4O1xuICB9XG4gIG1hbnRpc3NhID0gZXhwb25lbnQgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZXhwb25lbnQgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbWFudGlzc2FMZW5ndGg7XG4gIHdoaWxlIChuQml0cyA+IDApIHtcbiAgICBtYW50aXNzYSA9IG1hbnRpc3NhICogMjU2ICsgYnVmZmVyW2luZGV4LS1dO1xuICAgIG5CaXRzIC09IDg7XG4gIH1cbiAgaWYgKGV4cG9uZW50ID09PSAwKSB7XG4gICAgZXhwb25lbnQgPSAxIC0gZUJpYXM7XG4gIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbWFudGlzc2EgPyBOYU4gOiBzaWduID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gIH0gZWxzZSB7XG4gICAgbWFudGlzc2EgPSBtYW50aXNzYSArIHBvdygyLCBtYW50aXNzYUxlbmd0aCk7XG4gICAgZXhwb25lbnQgPSBleHBvbmVudCAtIGVCaWFzO1xuICB9IHJldHVybiAoc2lnbiA/IC0xIDogMSkgKiBtYW50aXNzYSAqIHBvdygyLCBleHBvbmVudCAtIG1hbnRpc3NhTGVuZ3RoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYWNrOiBwYWNrLFxuICB1bnBhY2s6IHVucGFja1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pZWVlNzU0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xuXG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlXG4gIHJldHVybiAhJE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQoaXQsICcnKSA6ICRPYmplY3QoaXQpO1xufSA6ICRPYmplY3Q7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzXCIpO1xuXG4vLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgkdGhpcywgZHVtbXksIFdyYXBwZXIpIHtcbiAgdmFyIE5ld1RhcmdldCwgTmV3VGFyZ2V0UHJvdG90eXBlO1xuICBpZiAoXG4gICAgLy8gaXQgY2FuIHdvcmsgb25seSB3aXRoIG5hdGl2ZSBgc2V0UHJvdG90eXBlT2ZgXG4gICAgc2V0UHJvdG90eXBlT2YgJiZcbiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzXG4gICAgaXNDYWxsYWJsZShOZXdUYXJnZXQgPSBkdW1teS5jb25zdHJ1Y3RvcikgJiZcbiAgICBOZXdUYXJnZXQgIT09IFdyYXBwZXIgJiZcbiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJlxuICAgIE5ld1RhcmdldFByb3RvdHlwZSAhPT0gV3JhcHBlci5wcm90b3R5cGVcbiAgKSBzZXRQcm90b3R5cGVPZigkdGhpcywgTmV3VGFyZ2V0UHJvdG90eXBlKTtcbiAgcmV0dXJuICR0aGlzO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIHN0b3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qc1wiKTtcblxudmFyIGZ1bmN0aW9uVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhGdW5jdGlvbi50b1N0cmluZyk7XG5cbi8vIHRoaXMgaGVscGVyIGJyb2tlbiBpbiBgY29yZS1qc0AzLjQuMS0zLjQuNGAsIHNvIHdlIGNhbid0IHVzZSBgc2hhcmVkYCBoZWxwZXJcbmlmICghaXNDYWxsYWJsZShzdG9yZS5pbnNwZWN0U291cmNlKSkge1xuICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9TdHJpbmcoaXQpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0b3JlLmluc3BlY3RTb3VyY2U7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zdGFsbC1lcnJvci1jYXVzZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG5cbi8vIGBJbnN0YWxsRXJyb3JDYXVzZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtZXJyb3ItY2F1c2UvI3NlYy1lcnJvcm9iamVjdHMtaW5zdGFsbC1lcnJvci1jYXVzZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgb3B0aW9ucykge1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NhdXNlJyBpbiBvcHRpb25zKSB7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE8sICdjYXVzZScsIG9wdGlvbnMuY2F1c2UpO1xuICB9XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIikuZik7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbE1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzXCIpO1xudmFyIGlzRXh0ZW5zaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXMtZXh0ZW5zaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1leHRlbnNpYmxlLmpzXCIpO1xudmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanNcIik7XG52YXIgRlJFRVpJTkcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnJlZXppbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qc1wiKTtcblxudmFyIFJFUVVJUkVEID0gZmFsc2U7XG52YXIgTUVUQURBVEEgPSB1aWQoJ21ldGEnKTtcbnZhciBpZCA9IDA7XG5cbnZhciBzZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBkZWZpbmVQcm9wZXJ0eShpdCwgTUVUQURBVEEsIHsgdmFsdWU6IHtcbiAgICBvYmplY3RJRDogJ08nICsgaWQrKywgLy8gb2JqZWN0IElEXG4gICAgd2Vha0RhdGE6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBhIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLm9iamVjdElEO1xufTtcblxudmFyIGdldFdlYWtEYXRhID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXNPd24oaXQsIE1FVEFEQVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhZGF0YShpdCk7XG4gIC8vIHJldHVybiB0aGUgc3RvcmUgb2Ygd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQURBVEFdLndlYWtEYXRhO1xufTtcblxuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaSU5HICYmIFJFUVVJUkVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhc093bihpdCwgTUVUQURBVEEpKSBzZXRNZXRhZGF0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBlbmFibGUgPSBmdW5jdGlvbiAoKSB7XG4gIG1ldGEuZW5hYmxlID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuICBSRVFVSVJFRCA9IHRydWU7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mO1xuICB2YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdGVzdFtNRVRBREFUQV0gPSAxO1xuXG4gIC8vIHByZXZlbnQgZXhwb3Npbmcgb2YgbWV0YWRhdGEga2V5XG4gIGlmIChnZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QpLmxlbmd0aCkge1xuICAgIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZiA9IGZ1bmN0aW9uIChpdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocmVzdWx0W2ldID09PSBNRVRBREFUQSkge1xuICAgICAgICAgIHNwbGljZShyZXN1bHQsIGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgICQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsTW9kdWxlLmZcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgZW5hYmxlOiBlbmFibGUsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5oaWRkZW5LZXlzW01FVEFEQVRBXSA9IHRydWU7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIE5BVElWRV9XRUFLX01BUCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1zdG9yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qc1wiKTtcbnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanNcIik7XG52YXIgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oaWRkZW4ta2V5cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hpZGRlbi1rZXlzLmpzXCIpO1xuXG52YXIgT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQgPSAnT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xudmFyIHNldCwgZ2V0LCBoYXM7XG5cbnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBoYXMoaXQpID8gZ2V0KGl0KSA6IHNldChpdCwge30pO1xufTtcblxudmFyIGdldHRlckZvciA9IGZ1bmN0aW9uIChUWVBFKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICB2YXIgc3RhdGU7XG4gICAgaWYgKCFpc09iamVjdChpdCkgfHwgKHN0YXRlID0gZ2V0KGl0KSkudHlwZSAhPT0gVFlQRSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCcpO1xuICAgIH0gcmV0dXJuIHN0YXRlO1xuICB9O1xufTtcblxuaWYgKE5BVElWRV9XRUFLX01BUCB8fCBzaGFyZWQuc3RhdGUpIHtcbiAgdmFyIHN0b3JlID0gc2hhcmVkLnN0YXRlIHx8IChzaGFyZWQuc3RhdGUgPSBuZXcgV2Vha01hcCgpKTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1hc3NpZ24gLS0gcHJvdG90eXBlIG1ldGhvZHMgcHJvdGVjdGlvbiAqL1xuICBzdG9yZS5nZXQgPSBzdG9yZS5nZXQ7XG4gIHN0b3JlLmhhcyA9IHN0b3JlLmhhcztcbiAgc3RvcmUuc2V0ID0gc3RvcmUuc2V0O1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi9cbiAgc2V0ID0gZnVuY3Rpb24gKGl0LCBtZXRhZGF0YSkge1xuICAgIGlmIChzdG9yZS5oYXMoaXQpKSB0aHJvdyBUeXBlRXJyb3IoT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQpO1xuICAgIG1ldGFkYXRhLmZhY2FkZSA9IGl0O1xuICAgIHN0b3JlLnNldChpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHN0b3JlLmdldChpdCkgfHwge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBzdG9yZS5oYXMoaXQpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIFNUQVRFID0gc2hhcmVkS2V5KCdzdGF0ZScpO1xuICBoaWRkZW5LZXlzW1NUQVRFXSA9IHRydWU7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICBpZiAoaGFzT3duKGl0LCBTVEFURSkpIHRocm93IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgbWV0YWRhdGEuZmFjYWRlID0gaXQ7XG4gICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGl0LCBTVEFURSwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307XG4gIH07XG4gIGhhcyA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgaGFzOiBoYXMsXG4gIGVuZm9yY2U6IGVuZm9yY2UsXG4gIGdldHRlckZvcjogZ2V0dGVyRm9yXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEFycmF5UHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlO1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvdHlwZVtJVEVSQVRPUl0gPT09IGl0KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG5cbi8vIGBJc0FycmF5YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNhcnJheVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWlzYXJyYXkgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoYXJndW1lbnQpID09ICdBcnJheSc7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWJpZy1pbnQtYXJyYXkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpO1xuICByZXR1cm4ga2xhc3MgPT0gJ0JpZ0ludDY0QXJyYXknIHx8IGtsYXNzID09ICdCaWdVaW50NjRBcnJheSc7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWJpZy1pbnQtYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICRkb2N1bWVudEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb2N1bWVudC1hbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1hbGwuanNcIik7XG5cbnZhciBkb2N1bWVudEFsbCA9ICRkb2N1bWVudEFsbC5hbGw7XG5cbi8vIGBJc0NhbGxhYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZVxubW9kdWxlLmV4cG9ydHMgPSAkZG9jdW1lbnRBbGwuSVNfSFRNTEREQSA/IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbicgfHwgYXJndW1lbnQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbic7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qc1wiKTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanNcIik7XG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIGVtcHR5ID0gW107XG52YXIgY29uc3RydWN0ID0gZ2V0QnVpbHRJbignUmVmbGVjdCcsICdjb25zdHJ1Y3QnKTtcbnZhciBjb25zdHJ1Y3RvclJlZ0V4cCA9IC9eXFxzKig/OmNsYXNzfGZ1bmN0aW9uKVxcYi87XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGNvbnN0cnVjdG9yUmVnRXhwLmV4ZWMpO1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSAhY29uc3RydWN0b3JSZWdFeHAuZXhlYyhub29wKTtcblxudmFyIGlzQ29uc3RydWN0b3JNb2Rlcm4gPSBmdW5jdGlvbiBpc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gIGlmICghaXNDYWxsYWJsZShhcmd1bWVudCkpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdHJ1Y3Qobm9vcCwgZW1wdHksIGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBpc0NvbnN0cnVjdG9yTGVnYWN5ID0gZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICBpZiAoIWlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gIHN3aXRjaCAoY2xhc3NvZihhcmd1bWVudCkpIHtcbiAgICBjYXNlICdBc3luY0Z1bmN0aW9uJzpcbiAgICBjYXNlICdHZW5lcmF0b3JGdW5jdGlvbic6XG4gICAgY2FzZSAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbic6IHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIC8vIHdlIGNhbid0IGNoZWNrIC5wcm90b3R5cGUgc2luY2UgY29uc3RydWN0b3JzIHByb2R1Y2VkIGJ5IC5iaW5kIGhhdmVuJ3QgaXRcbiAgICAvLyBgRnVuY3Rpb24jdG9TdHJpbmdgIHRocm93cyBvbiBzb21lIGJ1aWx0LWl0IGZ1bmN0aW9uIGluIHNvbWUgbGVnYWN5IGVuZ2luZXNcbiAgICAvLyAoZm9yIGV4YW1wbGUsIGBET01RdWFkYCBhbmQgc2ltaWxhciBpbiBGRjQxLSlcbiAgICByZXR1cm4gSU5DT1JSRUNUX1RPX1NUUklORyB8fCAhIWV4ZWMoY29uc3RydWN0b3JSZWdFeHAsIGluc3BlY3RTb3VyY2UoYXJndW1lbnQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuaXNDb25zdHJ1Y3RvckxlZ2FjeS5zaGFtID0gdHJ1ZTtcblxuLy8gYElzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9ICFjb25zdHJ1Y3QgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGVkO1xuICByZXR1cm4gaXNDb25zdHJ1Y3Rvck1vZGVybihpc0NvbnN0cnVjdG9yTW9kZXJuLmNhbGwpXG4gICAgfHwgIWlzQ29uc3RydWN0b3JNb2Rlcm4oT2JqZWN0KVxuICAgIHx8ICFpc0NvbnN0cnVjdG9yTW9kZXJuKGZ1bmN0aW9uICgpIHsgY2FsbGVkID0gdHJ1ZTsgfSlcbiAgICB8fCBjYWxsZWQ7XG59KSA/IGlzQ29uc3RydWN0b3JMZWdhY3kgOiBpc0NvbnN0cnVjdG9yTW9kZXJuO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWZvcmNlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG5cbnZhciByZXBsYWNlbWVudCA9IC8jfFxcLnByb3RvdHlwZVxcLi87XG5cbnZhciBpc0ZvcmNlZCA9IGZ1bmN0aW9uIChmZWF0dXJlLCBkZXRlY3Rpb24pIHtcbiAgdmFyIHZhbHVlID0gZGF0YVtub3JtYWxpemUoZmVhdHVyZSldO1xuICByZXR1cm4gdmFsdWUgPT0gUE9MWUZJTEwgPyB0cnVlXG4gICAgOiB2YWx1ZSA9PSBOQVRJVkUgPyBmYWxzZVxuICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKVxuICAgIDogISFkZXRlY3Rpb247XG59O1xuXG52YXIgbm9ybWFsaXplID0gaXNGb3JjZWQubm9ybWFsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZShyZXBsYWNlbWVudCwgJy4nKS50b0xvd2VyQ2FzZSgpO1xufTtcblxudmFyIGRhdGEgPSBpc0ZvcmNlZC5kYXRhID0ge307XG52YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nO1xudmFyIFBPTFlGSUxMID0gaXNGb3JjZWQuUE9MWUZJTEwgPSAnUCc7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtZm9yY2VkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xuXG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgSXNJbnRlZ3JhbE51bWJlcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzaW50ZWdyYWxudW1iZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1udW1iZXItaXNpbnRlZ2VyIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWludGVncmFsLW51bWJlci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG4vLyB3ZSBjYW4ndCB1c2UganVzdCBgaXQgPT0gbnVsbGAgc2luY2Ugb2YgYGRvY3VtZW50LmFsbGAgc3BlY2lhbCBjYXNlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90LWFlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSBudWxsIHx8IGl0ID09PSB1bmRlZmluZWQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyICRkb2N1bWVudEFsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb2N1bWVudC1hbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1hbGwuanNcIik7XG5cbnZhciBkb2N1bWVudEFsbCA9ICRkb2N1bWVudEFsbC5hbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gJGRvY3VtZW50QWxsLklTX0hUTUxEREEgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogaXNDYWxsYWJsZShpdCkgfHwgaXQgPT09IGRvY3VtZW50QWxsO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIE1BVENIID0gd2VsbEtub3duU3ltYm9sKCdtYXRjaCcpO1xuXG4vLyBgSXNSZWdFeHBgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pc3JlZ2V4cFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY2xhc3NvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtc3ltYm9sLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzXCIpO1xuXG52YXIgJE9iamVjdCA9IE9iamVjdDtcblxubW9kdWxlLmV4cG9ydHMgPSBVU0VfU1lNQk9MX0FTX1VJRCA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgJFN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpO1xuICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCAkT2JqZWN0KGl0KSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBiaW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWJpbmQtY29udGV4dC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qc1wiKTtcbnZhciBpc0FycmF5SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXktaXRlcmF0b3ItbWV0aG9kLmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgaXNQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBnZXRJdGVyYXRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3IuanNcIik7XG52YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanNcIik7XG52YXIgaXRlcmF0b3JDbG9zZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRvci1jbG9zZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNsb3NlLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFJlc3VsdCA9IGZ1bmN0aW9uIChzdG9wcGVkLCByZXN1bHQpIHtcbiAgdGhpcy5zdG9wcGVkID0gc3RvcHBlZDtcbiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG59O1xuXG52YXIgUmVzdWx0UHJvdG90eXBlID0gUmVzdWx0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIHVuYm91bmRGdW5jdGlvbiwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGF0O1xuICB2YXIgQVNfRU5UUklFUyA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5BU19FTlRSSUVTKTtcbiAgdmFyIElTX1JFQ09SRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JU19SRUNPUkQpO1xuICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpO1xuICB2YXIgSU5URVJSVVBURUQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSU5URVJSVVBURUQpO1xuICB2YXIgZm4gPSBiaW5kKHVuYm91bmRGdW5jdGlvbiwgdGhhdCk7XG4gIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7XG5cbiAgdmFyIHN0b3AgPSBmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG4gICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgY29uZGl0aW9uKTtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh0cnVlLCBjb25kaXRpb24pO1xuICB9O1xuXG4gIHZhciBjYWxsRm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoQVNfRU5UUklFUykge1xuICAgICAgYW5PYmplY3QodmFsdWUpO1xuICAgICAgcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWVbMF0sIHZhbHVlWzFdLCBzdG9wKSA6IGZuKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgfSByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZSwgc3RvcCkgOiBmbih2YWx1ZSk7XG4gIH07XG5cbiAgaWYgKElTX1JFQ09SRCkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGUuaXRlcmF0b3I7XG4gIH0gZWxzZSBpZiAoSVNfSVRFUkFUT1IpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgICBpZiAoIWl0ZXJGbikgdGhyb3cgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhpdGVyYWJsZSkgKyAnIGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoaXRlcmFibGUpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgICAgICByZXN1bHQgPSBjYWxsRm4oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlLCBpdGVyRm4pO1xuICB9XG5cbiAgbmV4dCA9IElTX1JFQ09SRCA/IGl0ZXJhYmxlLm5leHQgOiBpdGVyYXRvci5uZXh0O1xuICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09ICdvYmplY3QnICYmIHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGtpbmQsIHZhbHVlKSB7XG4gIHZhciBpbm5lclJlc3VsdCwgaW5uZXJFcnJvcjtcbiAgYW5PYmplY3QoaXRlcmF0b3IpO1xuICB0cnkge1xuICAgIGlubmVyUmVzdWx0ID0gZ2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgaWYgKCFpbm5lclJlc3VsdCkge1xuICAgICAgaWYgKGtpbmQgPT09ICd0aHJvdycpIHRocm93IHZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpbm5lclJlc3VsdCA9IGNhbGwoaW5uZXJSZXN1bHQsIGl0ZXJhdG9yKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpbm5lckVycm9yID0gdHJ1ZTtcbiAgICBpbm5lclJlc3VsdCA9IGVycm9yO1xuICB9XG4gIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTtcbiAgaWYgKGlubmVyRXJyb3IpIHRocm93IGlubmVyUmVzdWx0O1xuICBhbk9iamVjdChpbm5lclJlc3VsdCk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY2xvc2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qc1wiKS5JdGVyYXRvclByb3RvdHlwZSk7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0LCBFTlVNRVJBQkxFX05FWFQpIHtcbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIEl0ZXJhdG9yQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigrIUVOVU1FUkFCTEVfTkVYVCwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBGdW5jdGlvbk5hbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItY3JlYXRlLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGdldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xudmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtbm9uLWVudW1lcmFibGUtcHJvcGVydHkuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanNcIik7XG5cbnZhciBQUk9QRVJfRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5QUk9QRVI7XG52YXIgQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUUgPSBGdW5jdGlvbk5hbWUuQ09ORklHVVJBQkxFO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcbiAgICBzd2l0Y2ggKEtJTkQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIEVOVFJJRVM6IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0NhbGxhYmxlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0pKSB7XG4gICAgICAgICAgZGVmaW5lQnVpbHRJbihDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmIChJU19QVVJFKSBJdGVyYXRvcnNbVE9fU1RSSU5HX1RBR10gPSByZXR1cm5UaGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpeCBBcnJheS5wcm90b3R5cGUueyB2YWx1ZXMsIEBAaXRlcmF0b3IgfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIERFRkFVTFQgPT0gVkFMVUVTICYmIG5hdGl2ZUl0ZXJhdG9yICYmIG5hdGl2ZUl0ZXJhdG9yLm5hbWUgIT09IFZBTFVFUykge1xuICAgIGlmICghSVNfUFVSRSAmJiBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSkge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KEl0ZXJhYmxlUHJvdG90eXBlLCAnbmFtZScsIFZBTFVFUyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIElOQ09SUkVDVF9WQUxVRVNfTkFNRSA9IHRydWU7XG4gICAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBjYWxsKG5hdGl2ZUl0ZXJhdG9yLCB0aGlzKTsgfTtcbiAgICB9XG4gIH1cblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgZGVmaW5lQnVpbHRJbihJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkKHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIC8vIGRlZmluZSBpdGVyYXRvclxuICBpZiAoKCFJU19QVVJFIHx8IEZPUkNFRCkgJiYgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdICE9PSBkZWZhdWx0SXRlcmF0b3IpIHtcbiAgICBkZWZpbmVCdWlsdEluKEl0ZXJhYmxlUHJvdG90eXBlLCBJVEVSQVRPUiwgZGVmYXVsdEl0ZXJhdG9yLCB7IG5hbWU6IERFRkFVTFQgfSk7XG4gIH1cbiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yO1xuXG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvci1kZWZpbmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1jcmVhdGUuanNcIik7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tYXJyYXktcHJvdG90eXBlLWtleXMgLS0gc2FmZSAqL1xuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG52YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9ICFpc09iamVjdChJdGVyYXRvclByb3RvdHlwZSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgdGVzdCA9IHt9O1xuICAvLyBGRjQ0LSBsZWdhY3kgaXRlcmF0b3JzIGNhc2VcbiAgcmV0dXJuIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXS5jYWxsKHRlc3QpICE9PSB0ZXN0O1xufSk7XG5cbmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuZWxzZSBpZiAoSVNfUFVSRSkgSXRlcmF0b3JQcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuXG4vLyBgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1AQGl0ZXJhdG9yXG5pZiAoIWlzQ2FsbGFibGUoSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdKSkge1xuICBkZWZpbmVCdWlsdEluKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogQlVHR1lfU0FGQVJJX0lURVJBVE9SU1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcblxuLy8gYExlbmd0aE9mQXJyYXlMaWtlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGVuZ3Rob2ZhcnJheWxpa2Vcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdG9MZW5ndGgob2JqLmxlbmd0aCk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21ha2UtYnVpbHQtaW4uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tbmFtZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUuanNcIikuQ09ORklHVVJBQkxFKTtcbnZhciBpbnNwZWN0U291cmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5zcGVjdC1zb3VyY2UuanNcIik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzXCIpO1xuXG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmVuZm9yY2U7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyICRTdHJpbmcgPSBTdHJpbmc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgam9pbiA9IHVuY3VycnlUaGlzKFtdLmpvaW4pO1xuXG52YXIgQ09ORklHVVJBQkxFX0xFTkdUSCA9IERFU0NSSVBUT1JTICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdsZW5ndGgnLCB7IHZhbHVlOiA4IH0pLmxlbmd0aCAhPT0gODtcbn0pO1xuXG52YXIgVEVNUExBVEUgPSBTdHJpbmcoU3RyaW5nKS5zcGxpdCgnU3RyaW5nJyk7XG5cbnZhciBtYWtlQnVpbHRJbiA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbHVlLCBuYW1lLCBvcHRpb25zKSB7XG4gIGlmIChzdHJpbmdTbGljZSgkU3RyaW5nKG5hbWUpLCAwLCA3KSA9PT0gJ1N5bWJvbCgnKSB7XG4gICAgbmFtZSA9ICdbJyArIHJlcGxhY2UoJFN0cmluZyhuYW1lKSwgL15TeW1ib2xcXCgoW14pXSopXFwpLywgJyQxJykgKyAnXSc7XG4gIH1cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5nZXR0ZXIpIG5hbWUgPSAnZ2V0ICcgKyBuYW1lO1xuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNldHRlcikgbmFtZSA9ICdzZXQgJyArIG5hbWU7XG4gIGlmICghaGFzT3duKHZhbHVlLCAnbmFtZScpIHx8IChDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSAmJiB2YWx1ZS5uYW1lICE9PSBuYW1lKSkge1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkodmFsdWUsICduYW1lJywgeyB2YWx1ZTogbmFtZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgIGVsc2UgdmFsdWUubmFtZSA9IG5hbWU7XG4gIH1cbiAgaWYgKENPTkZJR1VSQUJMRV9MRU5HVEggJiYgb3B0aW9ucyAmJiBoYXNPd24ob3B0aW9ucywgJ2FyaXR5JykgJiYgdmFsdWUubGVuZ3RoICE9PSBvcHRpb25zLmFyaXR5KSB7XG4gICAgZGVmaW5lUHJvcGVydHkodmFsdWUsICdsZW5ndGgnLCB7IHZhbHVlOiBvcHRpb25zLmFyaXR5IH0pO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsICdjb25zdHJ1Y3RvcicpICYmIG9wdGlvbnMuY29uc3RydWN0b3IpIHtcbiAgICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkodmFsdWUsICdwcm90b3R5cGUnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAvLyBpbiBWOCB+IENocm9tZSA1MywgcHJvdG90eXBlcyBvZiBzb21lIG1ldGhvZHMsIGxpa2UgYEFycmF5LnByb3RvdHlwZS52YWx1ZXNgLCBhcmUgbm9uLXdyaXRhYmxlXG4gICAgfSBlbHNlIGlmICh2YWx1ZS5wcm90b3R5cGUpIHZhbHVlLnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh2YWx1ZSk7XG4gIGlmICghaGFzT3duKHN0YXRlLCAnc291cmNlJykpIHtcbiAgICBzdGF0ZS5zb3VyY2UgPSBqb2luKFRFTVBMQVRFLCB0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyA/IG5hbWUgOiAnJyk7XG4gIH0gcmV0dXJuIHZhbHVlO1xufTtcblxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXh0ZW5kLW5hdGl2ZSAtLSByZXF1aXJlZFxuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gbWFrZUJ1aWx0SW4oZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiBpc0NhbGxhYmxlKHRoaXMpICYmIGdldEludGVybmFsU3RhdGUodGhpcykuc291cmNlIHx8IGluc3BlY3RTb3VyY2UodGhpcyk7XG59LCAndG9TdHJpbmcnKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYWtlLWJ1aWx0LWluLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hcC1oZWxwZXJzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1tYXAgLS0gc2FmZVxudmFyIE1hcFByb3RvdHlwZSA9IE1hcC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWFwIC0tIHNhZmVcbiAgTWFwOiBNYXAsXG4gIHNldDogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlLnNldCksXG4gIGdldDogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlLmdldCksXG4gIGhhczogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlLmhhcyksXG4gIHJlbW92ZTogdW5jdXJyeVRoaXMoTWFwUHJvdG90eXBlWydkZWxldGUnXSksXG4gIHByb3RvOiBNYXBQcm90b3R5cGVcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWFwLWhlbHBlcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC10cnVuYy5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5cbi8vIGBNYXRoLnRydW5jYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWF0aC50cnVuY1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW1hdGgtdHJ1bmMgLS0gc2FmZVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLnRydW5jIHx8IGZ1bmN0aW9uIHRydW5jKHgpIHtcbiAgdmFyIG4gPSAreDtcbiAgcmV0dXJuIChuID4gMCA/IGZsb29yIDogY2VpbCkobik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL21hdGgtdHJ1bmMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIikuZik7XG52YXIgbWFjcm90YXNrID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90YXNrICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qc1wiKS5zZXQpO1xudmFyIFF1ZXVlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3F1ZXVlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcXVldWUuanNcIik7XG52YXIgSVNfSU9TID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLmpzXCIpO1xudmFyIElTX0lPU19QRUJCTEUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcy1wZWJibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtaW9zLXBlYmJsZS5qc1wiKTtcbnZhciBJU19XRUJPU19XRUJLSVQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLXdlYm9zLXdlYmtpdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy13ZWJvcy13ZWJraXQuanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG52YXIgTXV0YXRpb25PYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgbWljcm90YXNrID0gcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yICYmIHF1ZXVlTWljcm90YXNrRGVzY3JpcHRvci52YWx1ZTtcbnZhciBub3RpZnksIHRvZ2dsZSwgbm9kZSwgcHJvbWlzZSwgdGhlbjtcblxuLy8gbW9kZXJuIGVuZ2luZXMgaGF2ZSBxdWV1ZU1pY3JvdGFzayBtZXRob2RcbmlmICghbWljcm90YXNrKSB7XG4gIHZhciBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChmbiA9IHF1ZXVlLmdldCgpKSB0cnkge1xuICAgICAgZm4oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHF1ZXVlLmhlYWQpIG5vdGlmeSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgLy8gYWxzbyBleGNlcHQgV2ViT1MgV2Via2l0IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84OThcbiAgaWYgKCFJU19JT1MgJiYgIUlTX05PREUgJiYgIUlTX1dFQk9TX1dFQktJVCAmJiBNdXRhdGlvbk9ic2VydmVyICYmIGRvY3VtZW50KSB7XG4gICAgdG9nZ2xlID0gdHJ1ZTtcbiAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoIUlTX0lPU19QRUJCTEUgJiYgUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAvLyB3b3JrYXJvdW5kIG9mIFdlYktpdCB+IGlPUyBTYWZhcmkgMTAuMSBidWdcbiAgICBwcm9taXNlLmNvbnN0cnVjdG9yID0gUHJvbWlzZTtcbiAgICB0aGVuID0gYmluZChwcm9taXNlLnRoZW4sIHByb21pc2UpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIE5vZGUuanMgd2l0aG91dCBwcm9taXNlc1xuICB9IGVsc2UgaWYgKElTX05PREUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdlXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIC8vIGB3ZWJwYWNrYCBkZXYgc2VydmVyIGJ1ZyBvbiBJRSBnbG9iYWwgbWV0aG9kcyAtIHVzZSBiaW5kKGZuLCBnbG9iYWwpXG4gICAgbWFjcm90YXNrID0gYmluZChtYWNyb3Rhc2ssIGdsb2JhbCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWFjcm90YXNrKGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgbWljcm90YXNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgaWYgKCFxdWV1ZS5oZWFkKSBub3RpZnkoKTtcbiAgICBxdWV1ZS5hZGQoZm4pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pY3JvdGFzaztcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9taWNyb3Rhc2suanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyAkVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhQ2FsbGFibGUocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUNhbGxhYmxlKHJlamVjdCk7XG59O1xuXG4vLyBgTmV3UHJvbWlzZUNhcGFiaWxpdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1uZXdwcm9taXNlY2FwYWJpbGl0eVxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm9ybWFsaXplLXN0cmluZy1hcmd1bWVudC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCwgJGRlZmF1bHQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID09PSB1bmRlZmluZWQgPyBhcmd1bWVudHMubGVuZ3RoIDwgMiA/ICcnIDogJGRlZmF1bHQgOiB0b1N0cmluZyhhcmd1bWVudCk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXNSZWdFeHAoaXQpKSB7XG4gICAgdGhyb3cgJFR5cGVFcnJvcihcIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9uc1wiKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHRyaW0gPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanNcIikudHJpbSk7XG52YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qc1wiKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgJHBhcnNlRmxvYXQgPSBnbG9iYWwucGFyc2VGbG9hdDtcbnZhciBTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIElURVJBVE9SID0gU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGT1JDRUQgPSAxIC8gJHBhcnNlRmxvYXQod2hpdGVzcGFjZXMgKyAnLTAnKSAhPT0gLUluZmluaXR5XG4gIC8vIE1TIEVkZ2UgMTgtIGJyb2tlbiB3aXRoIGJveGVkIHN5bWJvbHNcbiAgfHwgKElURVJBVE9SICYmICFmYWlscyhmdW5jdGlvbiAoKSB7ICRwYXJzZUZsb2F0KE9iamVjdChJVEVSQVRPUikpOyB9KSk7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHJpbmcpIHtcbiAgdmFyIHRyaW1tZWRTdHJpbmcgPSB0cmltKHRvU3RyaW5nKHN0cmluZykpO1xuICB2YXIgcmVzdWx0ID0gJHBhcnNlRmxvYXQodHJpbW1lZFN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgY2hhckF0KHRyaW1tZWRTdHJpbmcsIDApID09ICctJyA/IC0wIDogcmVzdWx0O1xufSA6ICRwYXJzZUZsb2F0O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1mbG9hdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtaW50LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciB0cmltID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLmpzXCIpLnRyaW0pO1xudmFyIHdoaXRlc3BhY2VzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanNcIik7XG5cbnZhciAkcGFyc2VJbnQgPSBnbG9iYWwucGFyc2VJbnQ7XG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBJVEVSQVRPUiA9IFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgaGV4ID0gL15bKy1dPzB4L2k7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKGhleC5leGVjKTtcbnZhciBGT1JDRUQgPSAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMDgnKSAhPT0gOCB8fCAkcGFyc2VJbnQod2hpdGVzcGFjZXMgKyAnMHgxNicpICE9PSAyMlxuICAvLyBNUyBFZGdlIDE4LSBicm9rZW4gd2l0aCBib3hlZCBzeW1ib2xzXG4gIHx8IChJVEVSQVRPUiAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgeyAkcGFyc2VJbnQoT2JqZWN0KElURVJBVE9SKSk7IH0pKTtcblxuLy8gYHBhcnNlSW50YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VpbnQtc3RyaW5nLXJhZGl4XG5tb2R1bGUuZXhwb3J0cyA9IEZPUkNFRCA/IGZ1bmN0aW9uIHBhcnNlSW50KHN0cmluZywgcmFkaXgpIHtcbiAgdmFyIFMgPSB0cmltKHRvU3RyaW5nKHN0cmluZykpO1xuICByZXR1cm4gJHBhcnNlSW50KFMsIChyYWRpeCA+Pj4gMCkgfHwgKGV4ZWMoaGV4LCBTKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgb2JqZWN0S2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qta2V5cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qc1wiKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBJbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHNhZmVcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBzaG91bGQgaGF2ZSBjb3JyZWN0IG9yZGVyIG9mIG9wZXJhdGlvbnMgKEVkZ2UgYnVnKVxuICBpZiAoREVTQ1JJUFRPUlMgJiYgJGFzc2lnbih7IGI6IDEgfSwgJGFzc2lnbihkZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsICdiJywge1xuICAgICAgICB2YWx1ZTogMyxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSksIHsgYjogMiB9KSkuYiAhPT0gMSkgcmV0dXJuIHRydWU7XG4gIC8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3ltYm9sIC0tIHNhZmVcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtzeW1ib2xdICE9IDcgfHwgb2JqZWN0S2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYXJndW1lbnRzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICB3aGlsZSAoYXJndW1lbnRzTGVuZ3RoID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IEluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChvYmplY3RLZXlzKFMpLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIHtcbiAgICAgIGtleSA9IGtleXNbaisrXTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMgfHwgY2FsbChwcm9wZXJ0eUlzRW51bWVyYWJsZSwgUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1hc3NpZ24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUsIFdTSCAqL1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qc1wiKTtcbnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qc1wiKTtcbnZhciBoaWRkZW5LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZGVuLWtleXMuanNcIik7XG52YXIgaHRtbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9odG1sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaHRtbC5qc1wiKTtcbnZhciBkb2N1bWVudENyZWF0ZUVsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qc1wiKTtcbnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2hhcmVkLWtleSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanNcIik7XG5cbnZhciBHVCA9ICc+JztcbnZhciBMVCA9ICc8JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBTQ1JJUFQgPSAnc2NyaXB0JztcbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcblxudmFyIEVtcHR5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cbnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4gTFQgKyBTQ1JJUFQgKyBHVCArIGNvbnRlbnQgKyBMVCArICcvJyArIFNDUklQVCArIEdUO1xufTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIEFjdGl2ZVggT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYID0gZnVuY3Rpb24gKGFjdGl2ZVhEb2N1bWVudCkge1xuICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7XG4gIGFjdGl2ZVhEb2N1bWVudC5jbG9zZSgpO1xuICB2YXIgdGVtcCA9IGFjdGl2ZVhEb2N1bWVudC5wYXJlbnRXaW5kb3cuT2JqZWN0O1xuICBhY3RpdmVYRG9jdW1lbnQgPSBudWxsOyAvLyBhdm9pZCBtZW1vcnkgbGVha1xuICByZXR1cm4gdGVtcDtcbn07XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgSlMgPSAnamF2YScgKyBTQ1JJUFQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzQ3NVxuICBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICByZXR1cm4gaWZyYW1lRG9jdW1lbnQuRjtcbn07XG5cbi8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnRcbi8vIE5vIG5lZWQgdG8gdXNlIGFjdGl2ZSB4IGFwcHJvYWNoIHdoZW4gZG9jdW1lbnQuZG9tYWluIGlzIG5vdCBzZXRcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDZcbi8vIGF2b2lkIElFIEdDIGJ1Z1xudmFyIGFjdGl2ZVhEb2N1bWVudDtcbnZhciBOdWxsUHJvdG9PYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgYWN0aXZlWERvY3VtZW50ID0gbmV3IEFjdGl2ZVhPYmplY3QoJ2h0bWxmaWxlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGlnbm9yZSAqLyB9XG4gIE51bGxQcm90b09iamVjdCA9IHR5cGVvZiBkb2N1bWVudCAhPSAndW5kZWZpbmVkJ1xuICAgID8gZG9jdW1lbnQuZG9tYWluICYmIGFjdGl2ZVhEb2N1bWVudFxuICAgICAgPyBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCkgLy8gb2xkIElFXG4gICAgICA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpXG4gICAgOiBOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYKGFjdGl2ZVhEb2N1bWVudCk7IC8vIFdTSFxuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIE51bGxQcm90b09iamVjdCgpO1xufTtcblxuaGlkZGVuS2V5c1tJRV9QUk9UT10gPSB0cnVlO1xuXG4vLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtY3JlYXRlIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eUNvbnN0cnVjdG9yKCk7XG4gICAgRW1wdHlDb25zdHJ1Y3RvcltQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBOdWxsUHJvdG9PYmplY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXNNb2R1bGUuZihyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBWOF9QUk9UT1RZUEVfREVGSU5FX0JVRyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1ZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qc1wiKTtcbnZhciBvYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanNcIik7XG5cbi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnRpZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gREVTQ1JJUFRPUlMgJiYgIVY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsZW5ndGggPiBpbmRleCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2luZGV4KytdLCBwcm9wc1trZXldKTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanNcIik7XG52YXIgVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdjgtcHJvdG90eXBlLWRlZmluZS1idWcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlXG52YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIEVOVU1FUkFCTEUgPSAnZW51bWVyYWJsZSc7XG52YXIgQ09ORklHVVJBQkxFID0gJ2NvbmZpZ3VyYWJsZSc7XG52YXIgV1JJVEFCTEUgPSAnd3JpdGFibGUnO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAodHlwZW9mIE8gPT09ICdmdW5jdGlvbicgJiYgUCA9PT0gJ3Byb3RvdHlwZScgJiYgJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzICYmIFdSSVRBQkxFIGluIEF0dHJpYnV0ZXMgJiYgIUF0dHJpYnV0ZXNbV1JJVEFCTEVdKSB7XG4gICAgdmFyIGN1cnJlbnQgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnRbV1JJVEFCTEVdKSB7XG4gICAgICBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgICAgIEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogQ09ORklHVVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0NPTkZJR1VSQUJMRV0gOiBjdXJyZW50W0NPTkZJR1VSQUJMRV0sXG4gICAgICAgIGVudW1lcmFibGU6IEVOVU1FUkFCTEUgaW4gQXR0cmlidXRlcyA/IEF0dHJpYnV0ZXNbRU5VTUVSQUJMRV0gOiBjdXJyZW50W0VOVU1FUkFCTEVdLFxuICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICB9IHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG59IDogJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuICRkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyAkVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanNcIik7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIik7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgdG9Qcm9wZXJ0eUtleSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JbmRleGVkT2JqZWN0KE8pO1xuICBQID0gdG9Qcm9wZXJ0eUtleShQKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXNPd24oTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIWNhbGwocHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiwgTywgUCksIE9bUF0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eW5hbWVzIC0tIHNhZmUgKi9cbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanNcIikuZik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUuanNcIik7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBhcnJheVNsaWNlKHdpbmRvd05hbWVzKTtcbiAgfVxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIGNsYXNzb2YoaXQpID09ICdXaW5kb3cnXG4gICAgPyBnZXRXaW5kb3dOYW1lcyhpdClcbiAgICA6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy1leHRlcm5hbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanNcIik7XG52YXIgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanNcIik7XG5cbnZhciBoaWRkZW5LZXlzID0gZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eW5hbWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5bmFtZXMgLS0gc2FmZVxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgaGlkZGVuS2V5cyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyk9PntldmFsKCJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlzeW1ib2xzIC0tIHNhZmVcbmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgc2hhcmVkS2V5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzXCIpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXIuanNcIik7XG5cbnZhciBJRV9QUk9UTyA9IHNoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xudmFyIE9iamVjdFByb3RvdHlwZSA9ICRPYmplY3QucHJvdG90eXBlO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHNhZmVcbm1vZHVsZS5leHBvcnRzID0gQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSID8gJE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIHZhciBvYmplY3QgPSB0b09iamVjdChPKTtcbiAgaWYgKGhhc093bihvYmplY3QsIElFX1BST1RPKSkgcmV0dXJuIG9iamVjdFtJRV9QUk9UT107XG4gIHZhciBjb25zdHJ1Y3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgaWYgKGlzQ2FsbGFibGUoY29uc3RydWN0b3IpICYmIG9iamVjdCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgJE9iamVjdCA/IE9iamVjdFByb3RvdHlwZSA6IG51bGw7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1leHRlbnNpYmxlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci1ub24tZXh0ZW5zaWJsZS5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyICRpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSBmYWlscyhmdW5jdGlvbiAoKSB7ICRpc0V4dGVuc2libGUoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmlzRXh0ZW5zaWJsZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5pc2V4dGVuc2libGVcbm1vZHVsZS5leHBvcnRzID0gKEZBSUxTX09OX1BSSU1JVElWRVMgfHwgQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFKSA/IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoQVJSQVlfQlVGRkVSX05PTl9FWFRFTlNJQkxFICYmIGNsYXNzb2YoaXQpID09ICdBcnJheUJ1ZmZlcicpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWU7XG59IDogJGlzRXh0ZW5zaWJsZTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtZXh0ZW5zaWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoe30uaXNQcm90b3R5cGVPZik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qc1wiKTtcbnZhciBpbmRleE9mID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzXCIpLmluZGV4T2YpO1xudmFyIGhpZGRlbktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qc1wiKTtcblxudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgIWhhc093bihoaWRkZW5LZXlzLCBrZXkpICYmIGhhc093bihPLCBrZXkpICYmIHB1c2gocmVzdWx0LCBrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzT3duKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHB1c2gocmVzdWx0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1rZXlzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qc1wiKTtcbnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW51bS1idWcta2V5cy5qc1wiKTtcblxuLy8gYE9iamVjdC5rZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qta2V5cyAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyk9PntldmFsKCJcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBOYXNob3JuIH4gSkRLOCBidWdcbnZhciBOQVNIT1JOX0JVRyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiAhJHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZWAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUucHJvcGVydHlpc2VudW1lcmFibGVcbmV4cG9ydHMuZiA9IE5BU0hPUk5fQlVHID8gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoVikge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTtcbiAgcmV0dXJuICEhZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGU7XG59IDogJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvIC0tIHNhZmUgKi9cbnZhciB1bmN1cnJ5VGhpc0FjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1hY2Nlc3Nvci5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgYVBvc3NpYmxlUHJvdG90eXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtcG9zc2libGUtcHJvdG90eXBlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1wb3NzaWJsZS1wcm90b3R5cGUuanNcIik7XG5cbi8vIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2Zcbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZXRwcm90b3R5cGVvZiAtLSBzYWZlXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7XG4gIHZhciBDT1JSRUNUX1NFVFRFUiA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIHNldHRlciA9IHVuY3VycnlUaGlzQWNjZXNzb3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycsICdzZXQnKTtcbiAgICBzZXR0ZXIodGVzdCwgW10pO1xuICAgIENPUlJFQ1RfU0VUVEVSID0gdGVzdCBpbnN0YW5jZW9mIEFycmF5O1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykge1xuICAgIGFuT2JqZWN0KE8pO1xuICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7XG4gICAgaWYgKENPUlJFQ1RfU0VUVEVSKSBzZXR0ZXIoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgT3JkaW5hcnlUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0LCBwcmVmKSB7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAocHJlZiA9PT0gJ3N0cmluZycgJiYgaXNDYWxsYWJsZShmbiA9IGlucHV0LnRvU3RyaW5nKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKGlzQ2FsbGFibGUoZm4gPSBpbnB1dC52YWx1ZU9mKSAmJiAhaXNPYmplY3QodmFsID0gY2FsbChmbiwgaW5wdXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHByZWYgIT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7XG4gIHRocm93ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29yZGluYXJ5LXRvLXByaW1pdGl2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcy5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xuXG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcblxuLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9sc1xubW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdSZWZsZWN0JywgJ293bktleXMnKSB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlOYW1lc01vZHVsZS5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgcmV0dXJuIGdldE93blByb3BlcnR5U3ltYm9scyA/IGNvbmNhdChrZXlzLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanMiOigobW9kdWxlKT0+e2V2YWwoIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCB2YWx1ZTogZXJyb3IgfTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanNcIik7XG52YXIgaW5zcGVjdFNvdXJjZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnNwZWN0LXNvdXJjZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luc3BlY3Qtc291cmNlLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIElTX0JST1dTRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3Nlci5qc1wiKTtcbnZhciBJU19ERU5PID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1kZW5vICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8uanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBWOF9WRVJTSU9OID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanNcIik7XG5cbnZhciBOYXRpdmVQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xudmFyIFNVQkNMQVNTSU5HID0gZmFsc2U7XG52YXIgTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UID0gaXNDYWxsYWJsZShnbG9iYWwuUHJvbWlzZVJlamVjdGlvbkV2ZW50KTtcblxudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gaXNGb3JjZWQoJ1Byb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSA9IGluc3BlY3RTb3VyY2UoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKTtcbiAgdmFyIEdMT0JBTF9DT1JFX0pTX1BST01JU0UgPSBQUk9NSVNFX0NPTlNUUlVDVE9SX1NPVVJDRSAhPT0gU3RyaW5nKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3Rvcik7XG4gIC8vIFY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gIC8vIFdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gIGlmICghR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiBWOF9WRVJTSU9OID09PSA2NikgcmV0dXJuIHRydWU7XG4gIC8vIFdlIG5lZWQgUHJvbWlzZSN7IGNhdGNoLCBmaW5hbGx5IH0gaW4gdGhlIHB1cmUgdmVyc2lvbiBmb3IgcHJldmVudGluZyBwcm90b3R5cGUgcG9sbHV0aW9uXG4gIGlmIChJU19QVVJFICYmICEoTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnY2F0Y2gnXSAmJiBOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gV2UgY2FuJ3QgdXNlIEBAc3BlY2llcyBmZWF0dXJlIGRldGVjdGlvbiBpbiBWOCBzaW5jZSBpdCBjYXVzZXNcbiAgLy8gZGVvcHRpbWl6YXRpb24gYW5kIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzlcbiAgaWYgKCFWOF9WRVJTSU9OIHx8IFY4X1ZFUlNJT04gPCA1MSB8fCAhL25hdGl2ZSBjb2RlLy50ZXN0KFBST01JU0VfQ09OU1RSVUNUT1JfU09VUkNFKSkge1xuICAgIC8vIERldGVjdCBjb3JyZWN0bmVzcyBvZiBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSBuZXcgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUoMSk7IH0pO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbiAgICB9O1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb21pc2UuY29uc3RydWN0b3IgPSB7fTtcbiAgICBjb25zdHJ1Y3RvcltTUEVDSUVTXSA9IEZha2VQcm9taXNlO1xuICAgIFNVQkNMQVNTSU5HID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgICBpZiAoIVNVQkNMQVNTSU5HKSByZXR1cm4gdHJ1ZTtcbiAgLy8gVW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICB9IHJldHVybiAhR0xPQkFMX0NPUkVfSlNfUFJPTUlTRSAmJiAoSVNfQlJPV1NFUiB8fCBJU19ERU5PKSAmJiAhTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5UO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDT05TVFJVQ1RPUjogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IsXG4gIFJFSkVDVElPTl9FVkVOVDogTkFUSVZFX1BST01JU0VfUkVKRUNUSU9OX0VWRU5ULFxuICBTVUJDTEFTU0lORzogU1VCQ0xBU1NJTkdcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLlByb21pc2U7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanNcIik7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG5cbm1vZHVsZS5leHBvcnRzID0gRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfHwgIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLmFsbChpdGVyYWJsZSkudGhlbih1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm94eS1hY2Nlc3Nvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpLmYpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUYXJnZXQsIFNvdXJjZSwga2V5KSB7XG4gIGtleSBpbiBUYXJnZXQgfHwgZGVmaW5lUHJvcGVydHkoVGFyZ2V0LCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBTb3VyY2Vba2V5XTsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBTb3VyY2Vba2V5XSA9IGl0OyB9XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm94eS1hY2Nlc3Nvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9xdWV1ZS5qcyI6KChtb2R1bGUpPT57ZXZhbCgiXG52YXIgUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaGVhZCA9IG51bGw7XG4gIHRoaXMudGFpbCA9IG51bGw7XG59O1xuXG5RdWV1ZS5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgZW50cnkgPSB7IGl0ZW06IGl0ZW0sIG5leHQ6IG51bGwgfTtcbiAgICB2YXIgdGFpbCA9IHRoaXMudGFpbDtcbiAgICBpZiAodGFpbCkgdGFpbC5uZXh0ID0gZW50cnk7XG4gICAgZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgfSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5oZWFkO1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgdmFyIG5leHQgPSB0aGlzLmhlYWQgPSBlbnRyeS5uZXh0O1xuICAgICAgaWYgKG5leHQgPT09IG51bGwpIHRoaXMudGFpbCA9IG51bGw7XG4gICAgICByZXR1cm4gZW50cnkuaXRlbTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUXVldWU7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcXVldWUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanNcIik7XG52YXIgcmVnZXhwRXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICBpZiAoaXNDYWxsYWJsZShleGVjKSkge1xuICAgIHZhciByZXN1bHQgPSBjYWxsKGV4ZWMsIFIsIFMpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIGFuT2JqZWN0KHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAoY2xhc3NvZihSKSA9PT0gJ1JlZ0V4cCcpIHJldHVybiBjYWxsKHJlZ2V4cEV4ZWMsIFIsIFMpO1xuICB0aHJvdyAkVHlwZUVycm9yKCdSZWdFeHAjZXhlYyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyJyk7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIHJlZ2V4cC9uby1lbXB0eS1jYXB0dXJpbmctZ3JvdXAsIHJlZ2V4cC9uby1lbXB0eS1ncm91cCwgcmVnZXhwL25vLWxhenktZW5kcyAtLSB0ZXN0aW5nICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWdleHAvbm8tdXNlbGVzcy1xdWFudGlmaWVyIC0tIHRlc3RpbmcgKi9cbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgcmVnZXhwRmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzXCIpO1xudmFyIHN0aWNreUhlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzLmpzXCIpO1xudmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGdldEludGVybmFsU3RhdGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIikuZ2V0KTtcbnZhciBVTlNVUFBPUlRFRF9ET1RfQUxMID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLWRvdC1hbGwuanNcIik7XG52YXIgVU5TVVBQT1JURURfTkNHID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtbmNnLmpzXCIpO1xuXG52YXIgbmF0aXZlUmVwbGFjZSA9IHNoYXJlZCgnbmF0aXZlLXN0cmluZy1yZXBsYWNlJywgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKTtcbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xudmFyIHBhdGNoZWRFeGVjID0gbmF0aXZlRXhlYztcbnZhciBjaGFyQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIGluZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG5cbnZhciBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUxID0gL2EvO1xuICB2YXIgcmUyID0gL2IqL2c7XG4gIGNhbGwobmF0aXZlRXhlYywgcmUxLCAnYScpO1xuICBjYWxsKG5hdGl2ZUV4ZWMsIHJlMiwgJ2EnKTtcbiAgcmV0dXJuIHJlMS5sYXN0SW5kZXggIT09IDAgfHwgcmUyLmxhc3RJbmRleCAhPT0gMDtcbn0pKCk7XG5cbnZhciBVTlNVUFBPUlRFRF9ZID0gc3RpY2t5SGVscGVycy5CUk9LRU5fQ0FSRVQ7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEIHx8IFVOU1VQUE9SVEVEX1kgfHwgVU5TVVBQT1JURURfRE9UX0FMTCB8fCBVTlNVUFBPUlRFRF9OQ0c7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyaW5nKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHJlKTtcbiAgICB2YXIgc3RyID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICB2YXIgcmF3ID0gc3RhdGUucmF3O1xuICAgIHZhciByZXN1bHQsIHJlQ29weSwgbGFzdEluZGV4LCBtYXRjaCwgaSwgb2JqZWN0LCBncm91cDtcblxuICAgIGlmIChyYXcpIHtcbiAgICAgIHJhdy5sYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7XG4gICAgICByZXN1bHQgPSBjYWxsKHBhdGNoZWRFeGVjLCByYXcsIHN0cik7XG4gICAgICByZS5sYXN0SW5kZXggPSByYXcubGFzdEluZGV4O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgZ3JvdXBzID0gc3RhdGUuZ3JvdXBzO1xuICAgIHZhciBzdGlja3kgPSBVTlNVUFBPUlRFRF9ZICYmIHJlLnN0aWNreTtcbiAgICB2YXIgZmxhZ3MgPSBjYWxsKHJlZ2V4cEZsYWdzLCByZSk7XG4gICAgdmFyIHNvdXJjZSA9IHJlLnNvdXJjZTtcbiAgICB2YXIgY2hhcnNBZGRlZCA9IDA7XG4gICAgdmFyIHN0ckNvcHkgPSBzdHI7XG5cbiAgICBpZiAoc3RpY2t5KSB7XG4gICAgICBmbGFncyA9IHJlcGxhY2UoZmxhZ3MsICd5JywgJycpO1xuICAgICAgaWYgKGluZGV4T2YoZmxhZ3MsICdnJykgPT09IC0xKSB7XG4gICAgICAgIGZsYWdzICs9ICdnJztcbiAgICAgIH1cblxuICAgICAgc3RyQ29weSA9IHN0cmluZ1NsaWNlKHN0ciwgcmUubGFzdEluZGV4KTtcbiAgICAgIC8vIFN1cHBvcnQgYW5jaG9yZWQgc3RpY2t5IGJlaGF2aW9yLlxuICAgICAgaWYgKHJlLmxhc3RJbmRleCA+IDAgJiYgKCFyZS5tdWx0aWxpbmUgfHwgcmUubXVsdGlsaW5lICYmIGNoYXJBdChzdHIsIHJlLmxhc3RJbmRleCAtIDEpICE9PSAnXFxuJykpIHtcbiAgICAgICAgc291cmNlID0gJyg/OiAnICsgc291cmNlICsgJyknO1xuICAgICAgICBzdHJDb3B5ID0gJyAnICsgc3RyQ29weTtcbiAgICAgICAgY2hhcnNBZGRlZCsrO1xuICAgICAgfVxuICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIHN0ciBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXig/OicgKyBzb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICB9XG5cbiAgICBpZiAoTlBDR19JTkNMVURFRCkge1xuICAgICAgcmVDb3B5ID0gbmV3IFJlZ0V4cCgnXicgKyBzb3VyY2UgKyAnJCg/IVxcXFxzKScsIGZsYWdzKTtcbiAgICB9XG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORykgbGFzdEluZGV4ID0gcmUubGFzdEluZGV4O1xuXG4gICAgbWF0Y2ggPSBjYWxsKG5hdGl2ZUV4ZWMsIHN0aWNreSA/IHJlQ29weSA6IHJlLCBzdHJDb3B5KTtcblxuICAgIGlmIChzdGlja3kpIHtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBtYXRjaC5pbnB1dCA9IHN0cmluZ1NsaWNlKG1hdGNoLmlucHV0LCBjaGFyc0FkZGVkKTtcbiAgICAgICAgbWF0Y2hbMF0gPSBzdHJpbmdTbGljZShtYXRjaFswXSwgY2hhcnNBZGRlZCk7XG4gICAgICAgIG1hdGNoLmluZGV4ID0gcmUubGFzdEluZGV4O1xuICAgICAgICByZS5sYXN0SW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgfSBlbHNlIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgfSBlbHNlIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgJiYgbWF0Y2gpIHtcbiAgICAgIHJlLmxhc3RJbmRleCA9IHJlLmdsb2JhbCA/IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIDogbGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoTlBDR19JTkNMVURFRCAmJiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYFxuICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgLyguPyk/L1xuICAgICAgY2FsbChuYXRpdmVSZXBsYWNlLCBtYXRjaFswXSwgcmVDb3B5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoICYmIGdyb3Vwcykge1xuICAgICAgbWF0Y2guZ3JvdXBzID0gb2JqZWN0ID0gY3JlYXRlKG51bGwpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBncm91cCA9IGdyb3Vwc1tpXTtcbiAgICAgICAgb2JqZWN0W2dyb3VwWzBdXSA9IG1hdGNoW2dyb3VwWzFdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hlZEV4ZWM7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXIgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZmxhZ3Ncbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmhhc0luZGljZXMpIHJlc3VsdCArPSAnZCc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC5kb3RBbGwpIHJlc3VsdCArPSAncyc7XG4gIGlmICh0aGF0LnVuaWNvZGUpIHJlc3VsdCArPSAndSc7XG4gIGlmICh0aGF0LnVuaWNvZGVTZXRzKSByZXN1bHQgKz0gJ3YnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHJlZ0V4cEZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1mbGFncyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1mbGFncy5qc1wiKTtcblxudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIpIHtcbiAgdmFyIGZsYWdzID0gUi5mbGFncztcbiAgcmV0dXJuIGZsYWdzID09PSB1bmRlZmluZWQgJiYgISgnZmxhZ3MnIGluIFJlZ0V4cFByb3RvdHlwZSkgJiYgIWhhc093bihSLCAnZmxhZ3MnKSAmJiBpc1Byb3RvdHlwZU9mKFJlZ0V4cFByb3RvdHlwZSwgUilcbiAgICA/IGNhbGwocmVnRXhwRmxhZ3MsIFIpIDogZmxhZ3M7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1nZXQtZmxhZ3MuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLXN0aWNreS1oZWxwZXJzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG5cbi8vIGJhYmVsLW1pbmlmeSBhbmQgQ2xvc3VyZSBDb21waWxlciB0cmFuc3BpbGVzIFJlZ0V4cCgnYScsICd5JykgLT4gL2EveSBhbmQgaXQgY2F1c2VzIFN5bnRheEVycm9yXG52YXIgJFJlZ0V4cCA9IGdsb2JhbC5SZWdFeHA7XG5cbnZhciBVTlNVUFBPUlRFRF9ZID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUgPSAkUmVnRXhwKCdhJywgJ3knKTtcbiAgcmUubGFzdEluZGV4ID0gMjtcbiAgcmV0dXJuIHJlLmV4ZWMoJ2FiY2QnKSAhPSBudWxsO1xufSk7XG5cbi8vIFVDIEJyb3dzZXIgYnVnXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTAwOFxudmFyIE1JU1NFRF9TVElDS1kgPSBVTlNVUFBPUlRFRF9ZIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEkUmVnRXhwKCdhJywgJ3knKS5zdGlja3k7XG59KTtcblxudmFyIEJST0tFTl9DQVJFVCA9IFVOU1VQUE9SVEVEX1kgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03NzM2ODdcbiAgdmFyIHJlID0gJFJlZ0V4cCgnXnInLCAnZ3knKTtcbiAgcmUubGFzdEluZGV4ID0gMjtcbiAgcmV0dXJuIHJlLmV4ZWMoJ3N0cicpICE9IG51bGw7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJST0tFTl9DQVJFVDogQlJPS0VOX0NBUkVULFxuICBNSVNTRURfU1RJQ0tZOiBNSVNTRURfU1RJQ0tZLFxuICBVTlNVUFBPUlRFRF9ZOiBVTlNVUFBPUlRFRF9ZXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtZG90LWFsbC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xuXG4vLyBiYWJlbC1taW5pZnkgYW5kIENsb3N1cmUgQ29tcGlsZXIgdHJhbnNwaWxlcyBSZWdFeHAoJy4nLCAncycpIC0+IC8uL3MgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxudmFyICRSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlID0gJFJlZ0V4cCgnLicsICdzJyk7XG4gIHJldHVybiAhKHJlLmRvdEFsbCAmJiByZS5leGVjKCdcXG4nKSAmJiByZS5mbGFncyA9PT0gJ3MnKTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcblxuLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCcoPzxhPmIpJywgJ2cnKSAtPiAvKD88YT5iKS9nIGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciAkUmVnRXhwID0gZ2xvYmFsLlJlZ0V4cDtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciByZSA9ICRSZWdFeHAoJyg/PGE+YiknLCAnZycpO1xuICByZXR1cm4gcmUuZXhlYygnYicpLmdyb3Vwcy5hICE9PSAnYicgfHxcbiAgICAnYicucmVwbGFjZShyZSwgJyQ8YT5jJykgIT09ICdiYyc7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtbmNnLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG5cbi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVxdWlyZW9iamVjdGNvZXJjaWJsZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgdGhyb3cgJFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtaGVscGVycy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc2V0IC0tIHNhZmVcbnZhciBTZXRQcm90b3R5cGUgPSBTZXQucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXNldCAtLSBzYWZlXG4gIFNldDogU2V0LFxuICBhZGQ6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZS5hZGQpLFxuICBoYXM6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZS5oYXMpLFxuICByZW1vdmU6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZVsnZGVsZXRlJ10pLFxuICBwcm90bzogU2V0UHJvdG90eXBlXG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1oZWxwZXJzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUpIHtcbiAgdmFyIENvbnN0cnVjdG9yID0gZ2V0QnVpbHRJbihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgQ29uc3RydWN0b3IgJiYgIUNvbnN0cnVjdG9yW1NQRUNJRVNdKSB7XG4gICAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKENvbnN0cnVjdG9yLCBTUEVDSUVTLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICB9KTtcbiAgfVxufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZGVmaW5lUHJvcGVydHkgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpLmYpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgVEFHLCBTVEFUSUMpIHtcbiAgaWYgKHRhcmdldCAmJiAhU1RBVElDKSB0YXJnZXQgPSB0YXJnZXQucHJvdG90eXBlO1xuICBpZiAodGFyZ2V0ICYmICFoYXNPd24odGFyZ2V0LCBUT19TVFJJTkdfVEFHKSkge1xuICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgVE9fU1RSSU5HX1RBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBUQUcgfSk7XG4gIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLWtleS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NoYXJlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qc1wiKTtcbnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdWlkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzXCIpO1xuXG52YXIga2V5cyA9IHNoYXJlZCgna2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQta2V5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1zdG9yZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBkZWZpbmVHbG9iYWxQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtZ2xvYmFsLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWdsb2JhbC1wcm9wZXJ0eS5qc1wiKTtcblxudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgZGVmaW5lR2xvYmFsUHJvcGVydHkoU0hBUkVELCB7fSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc3RvcmU7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLXN0b3JlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQtc3RvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQtc3RvcmUuanNcIik7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4zMi4wJyxcbiAgbW9kZTogSVNfUFVSRSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDE0LTIwMjMgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknLFxuICBsaWNlbnNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My4zMi4wL0xJQ0VOU0UnLFxuICBzb3VyY2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcydcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgYUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zcGVjaWVzY29uc3RydWN0b3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCBpc051bGxPclVuZGVmaW5lZChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUNvbnN0cnVjdG9yKFMpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIHBvcykge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSgkdGhpcykpO1xuICAgIHZhciBwb3NpdGlvbiA9IHRvSW50ZWdlck9ySW5maW5pdHkocG9zKTtcbiAgICB2YXIgc2l6ZSA9IFMubGVuZ3RoO1xuICAgIHZhciBmaXJzdCwgc2Vjb25kO1xuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgZmlyc3QgPSBjaGFyQ29kZUF0KFMsIHBvc2l0aW9uKTtcbiAgICByZXR1cm4gZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgcG9zaXRpb24gKyAxID09PSBzaXplXG4gICAgICB8fCAoc2Vjb25kID0gY2hhckNvZGVBdChTLCBwb3NpdGlvbiArIDEpKSA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkZcbiAgICAgICAgPyBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gY2hhckF0KFMsIHBvc2l0aW9uKVxuICAgICAgICAgIDogZmlyc3RcbiAgICAgICAgOiBDT05WRVJUX1RPX1NUUklOR1xuICAgICAgICAgID8gc3RyaW5nU2xpY2UoUywgcG9zaXRpb24sIHBvc2l0aW9uICsgMilcbiAgICAgICAgICA6IChmaXJzdCAtIDB4RDgwMCA8PCAxMCkgKyAoc2Vjb25kIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gYFN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXRgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuY29kZXBvaW50YXRcbiAgY29kZUF0OiBjcmVhdGVNZXRob2QoZmFsc2UpLFxuICAvLyBgU3RyaW5nLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbiAgY2hhckF0OiBjcmVhdGVNZXRob2QodHJ1ZSlcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL3B1bnljb2RlLmpzL2Jsb2IvbWFzdGVyL3B1bnljb2RlLmpzXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG52YXIgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxudmFyIGJhc2UgPSAzNjtcbnZhciB0TWluID0gMTtcbnZhciB0TWF4ID0gMjY7XG52YXIgc2tldyA9IDM4O1xudmFyIGRhbXAgPSA3MDA7XG52YXIgaW5pdGlhbEJpYXMgPSA3MjtcbnZhciBpbml0aWFsTiA9IDEyODsgLy8gMHg4MFxudmFyIGRlbGltaXRlciA9ICctJzsgLy8gJ1xceDJEJ1xudmFyIHJlZ2V4Tm9uQVNDSUkgPSAvW15cXDAtXFx1MDA3RV0vOyAvLyBub24tQVNDSUkgY2hhcnNcbnZhciByZWdleFNlcGFyYXRvcnMgPSAvWy5cXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2c7IC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcbnZhciBPVkVSRkxPV19FUlJPUiA9ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2Vzcyc7XG52YXIgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluO1xuXG52YXIgJFJhbmdlRXJyb3IgPSBSYW5nZUVycm9yO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcyhyZWdleFNlcGFyYXRvcnMuZXhlYyk7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG52YXIgY2hhckNvZGVBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJDb2RlQXQpO1xudmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpO1xudmFyIHRvTG93ZXJDYXNlID0gdW5jdXJyeVRoaXMoJycudG9Mb3dlckNhc2UpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcbiAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG4gKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcbiAqIG1hdGNoaW5nIFVURi0xNi5cbiAqL1xudmFyIHVjczJkZWNvZGUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGNvdW50ZXIgPSAwO1xuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBjaGFyQ29kZUF0KHN0cmluZywgY291bnRlcisrKTtcbiAgICBpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgICAvLyBJdCdzIGEgaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyLlxuICAgICAgdmFyIGV4dHJhID0gY2hhckNvZGVBdChzdHJpbmcsIGNvdW50ZXIrKyk7XG4gICAgICBpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gTG93IHN1cnJvZ2F0ZS5cbiAgICAgICAgcHVzaChvdXRwdXQsICgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJdCdzIGFuIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZVxuICAgICAgICAvLyBuZXh0IGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpci5cbiAgICAgICAgcHVzaChvdXRwdXQsIHZhbHVlKTtcbiAgICAgICAgY291bnRlci0tO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKG91dHB1dCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKi9cbnZhciBkaWdpdFRvQmFzaWMgPSBmdW5jdGlvbiAoZGlnaXQpIHtcbiAgLy8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcbiAgLy8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG4gIHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNik7XG59O1xuXG4vKipcbiAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNFxuICovXG52YXIgYWRhcHQgPSBmdW5jdGlvbiAoZGVsdGEsIG51bVBvaW50cywgZmlyc3RUaW1lKSB7XG4gIHZhciBrID0gMDtcbiAgZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcbiAgZGVsdGEgKz0gZmxvb3IoZGVsdGEgLyBudW1Qb2ludHMpO1xuICB3aGlsZSAoZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxKSB7XG4gICAgZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuICAgIGsgKz0gYmFzZTtcbiAgfVxuICByZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcbiAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuXG4gIC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIGFuIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMuXG4gIGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cbiAgLy8gQ2FjaGUgdGhlIGxlbmd0aC5cbiAgdmFyIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuICB2YXIgbiA9IGluaXRpYWxOO1xuICB2YXIgZGVsdGEgPSAwO1xuICB2YXIgYmlhcyA9IGluaXRpYWxCaWFzO1xuICB2YXIgaSwgY3VycmVudFZhbHVlO1xuXG4gIC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHMuXG4gIGZvciAoaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgIGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG4gICAgICBwdXNoKG91dHB1dCwgZnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7IC8vIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cbiAgdmFyIGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGg7IC8vIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXG4gIC8vIEZpbmlzaCB0aGUgYmFzaWMgc3RyaW5nIHdpdGggYSBkZWxpbWl0ZXIgdW5sZXNzIGl0J3MgZW1wdHkuXG4gIGlmIChiYXNpY0xlbmd0aCkge1xuICAgIHB1c2gob3V0cHV0LCBkZWxpbWl0ZXIpO1xuICB9XG5cbiAgLy8gTWFpbiBlbmNvZGluZyBsb29wOlxuICB3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuICAgIC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHQgbGFyZ2VyIG9uZTpcbiAgICB2YXIgbSA9IG1heEludDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2ldO1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcbiAgICAgICAgbSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmNyZWFzZSBgZGVsdGFgIGVub3VnaCB0byBhZHZhbmNlIHRoZSBkZWNvZGVyJ3MgPG4saT4gc3RhdGUgdG8gPG0sMD4sIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuICAgIHZhciBoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG4gICAgaWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcbiAgICAgIHRocm93ICRSYW5nZUVycm9yKE9WRVJGTE9XX0VSUk9SKTtcbiAgICB9XG5cbiAgICBkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuICAgIG4gPSBtO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcbiAgICAgICAgdGhyb3cgJFJhbmdlRXJyb3IoT1ZFUkZMT1dfRVJST1IpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG4gICAgICAgIC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLlxuICAgICAgICB2YXIgcSA9IGRlbHRhO1xuICAgICAgICB2YXIgayA9IGJhc2U7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdmFyIHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuICAgICAgICAgIGlmIChxIDwgdCkgYnJlYWs7XG4gICAgICAgICAgdmFyIHFNaW51c1QgPSBxIC0gdDtcbiAgICAgICAgICB2YXIgYmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuICAgICAgICAgIHB1c2gob3V0cHV0LCBmcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCkpKTtcbiAgICAgICAgICBxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuICAgICAgICAgIGsgKz0gYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2gob3V0cHV0LCBmcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEpKSk7XG4gICAgICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG4gICAgICAgIGRlbHRhID0gMDtcbiAgICAgICAgaGFuZGxlZENQQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWx0YSsrO1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gam9pbihvdXRwdXQsICcnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gIHZhciBlbmNvZGVkID0gW107XG4gIHZhciBsYWJlbHMgPSBzcGxpdChyZXBsYWNlKHRvTG93ZXJDYXNlKGlucHV0KSwgcmVnZXhTZXBhcmF0b3JzLCAnXFx1MDAyRScpLCAnLicpO1xuICB2YXIgaSwgbGFiZWw7XG4gIGZvciAoaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICBwdXNoKGVuY29kZWQsIGV4ZWMocmVnZXhOb25BU0NJSSwgbGFiZWwpID8gJ3huLS0nICsgZW5jb2RlKGxhYmVsKSA6IGxhYmVsKTtcbiAgfVxuICByZXR1cm4gam9pbihlbmNvZGVkLCAnLicpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG5cbnZhciAkUmFuZ2VFcnJvciA9IFJhbmdlRXJyb3I7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGVhdGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwZWF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdmFyIG4gPSB0b0ludGVnZXJPckluZmluaXR5KGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93ICRSYW5nZUVycm9yKCdXcm9uZyBudW1iZXIgb2YgcmVwZXRpdGlvbnMnKTtcbiAgZm9yICg7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKSBpZiAobiAmIDEpIHJlc3VsdCArPSBzdHI7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkdHJpbUVuZCA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qc1wiKS5lbmQpO1xudmFyIGZvcmNlZFN0cmluZ1RyaW1NZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZm9yY2VkLmpzXCIpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1FbmQsIHRyaW1SaWdodCB9YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jU3RyaW5nLnByb3RvdHlwZS50cmltcmlnaHRcbm1vZHVsZS5leHBvcnRzID0gZm9yY2VkU3RyaW5nVHJpbU1ldGhvZCgndHJpbUVuZCcpID8gZnVuY3Rpb24gdHJpbUVuZCgpIHtcbiAgcmV0dXJuICR0cmltRW5kKHRoaXMpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtdHJpbXN0YXJ0LXRyaW1lbmQgLS0gc2FmZVxufSA6ICcnLnRyaW1FbmQ7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzXCIpLlBST1BFUik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciB3aGl0ZXNwYWNlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93aGl0ZXNwYWNlcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3doaXRlc3BhY2VzLmpzXCIpO1xuXG52YXIgbm9uID0gJ1xcdTIwMEJcXHUwMDg1XFx1MTgwRSc7XG5cbi8vIGNoZWNrIHRoYXQgYSBtZXRob2Qgd29ya3Mgd2l0aCB0aGUgY29ycmVjdCBsaXN0XG4vLyBvZiB3aGl0ZXNwYWNlcyBhbmQgaGFzIGEgY29ycmVjdCBuYW1lXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICByZXR1cm4gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXSgpXG4gICAgICB8fCBub25bTUVUSE9EX05BTUVdKCkgIT09IG5vblxuICAgICAgfHwgKFBST1BFUl9GVU5DVElPTl9OQU1FICYmIHdoaXRlc3BhY2VzW01FVEhPRF9OQU1FXS5uYW1lICE9PSBNRVRIT0RfTkFNRSk7XG4gIH0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS1mb3JjZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgd2hpdGVzcGFjZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2hpdGVzcGFjZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93aGl0ZXNwYWNlcy5qc1wiKTtcblxudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXlsnICsgd2hpdGVzcGFjZXMgKyAnXSsnKTtcbnZhciBydHJpbSA9IFJlZ0V4cCgnKF58W14nICsgd2hpdGVzcGFjZXMgKyAnXSlbJyArIHdoaXRlc3BhY2VzICsgJ10rJCcpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW0sIHRyaW1TdGFydCwgdHJpbUVuZCwgdHJpbUxlZnQsIHRyaW1SaWdodCB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG52YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcykge1xuICAgIHZhciBzdHJpbmcgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKCR0aGlzKSk7XG4gICAgaWYgKFRZUEUgJiAxKSBzdHJpbmcgPSByZXBsYWNlKHN0cmluZywgbHRyaW0sICcnKTtcbiAgICBpZiAoVFlQRSAmIDIpIHN0cmluZyA9IHJlcGxhY2Uoc3RyaW5nLCBydHJpbSwgJyQxJyk7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBgU3RyaW5nLnByb3RvdHlwZS57IHRyaW1MZWZ0LCB0cmltU3RhcnQgfWAgbWV0aG9kc1xuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbXN0YXJ0XG4gIHN0YXJ0OiBjcmVhdGVNZXRob2QoMSksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnsgdHJpbVJpZ2h0LCB0cmltRW5kIH1gIG1ldGhvZHNcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnRyaW1lbmRcbiAgZW5kOiBjcmVhdGVNZXRob2QoMiksXG4gIC8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1gIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuICB0cmltOiBjcmVhdGVNZXRob2QoMylcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RydWN0dXJlZC1jbG9uZS1wcm9wZXItdHJhbnNmZXIuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBWOCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzXCIpO1xudmFyIElTX0JST1dTRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWJyb3dzZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbmdpbmUtaXMtYnJvd3Nlci5qc1wiKTtcbnZhciBJU19ERU5PID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1pcy1kZW5vICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWlzLWRlbm8uanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG52YXIgc3RydWN0dXJlZENsb25lID0gZ2xvYmFsLnN0cnVjdHVyZWRDbG9uZTtcblxubW9kdWxlLmV4cG9ydHMgPSAhIXN0cnVjdHVyZWRDbG9uZSAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBwcmV2ZW50IFY4IEFycmF5QnVmZmVyRGV0YWNoaW5nIHByb3RlY3RvciBjZWxsIGludmFsaWRhdGlvbiBhbmQgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY3OVxuICBpZiAoKElTX0RFTk8gJiYgVjggPiA5MikgfHwgKElTX05PREUgJiYgVjggPiA5NCkgfHwgKElTX0JST1dTRVIgJiYgVjggPiA5NykpIHJldHVybiBmYWxzZTtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig4KTtcbiAgdmFyIGNsb25lID0gc3RydWN0dXJlZENsb25lKGJ1ZmZlciwgeyB0cmFuc2ZlcjogW2J1ZmZlcl0gfSk7XG4gIHJldHVybiBidWZmZXIuYnl0ZUxlbmd0aCAhPSAwIHx8IGNsb25lLmJ5dGVMZW5ndGggIT0gODtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cnVjdHVyZWQtY2xvbmUtcHJvcGVyLXRyYW5zZmVyLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgVjhfVkVSU0lPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtdjgtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcblxudmFyICRTdHJpbmcgPSBnbG9iYWwuU3RyaW5nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xubW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICAvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxuICAvLyBgZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzYCBwb2x5ZmlsbCBzeW1ib2xzIGNvbnZlcnRlZCB0byBvYmplY3QgYXJlIG5vdCBTeW1ib2wgaW5zdGFuY2VzXG4gIC8vIG5iOiBEbyBub3QgY2FsbCBgU3RyaW5nYCBkaXJlY3RseSB0byBhdm9pZCB0aGlzIGJlaW5nIG9wdGltaXplZCBvdXQgdG8gYHN5bWJvbCsnJ2Agd2hpY2ggd2lsbCxcbiAgLy8gb2YgY291cnNlLCBmYWlsLlxuICByZXR1cm4gISRTdHJpbmcoc3ltYm9sKSB8fCAhKE9iamVjdChzeW1ib2wpIGluc3RhbmNlb2YgU3ltYm9sKSB8fFxuICAgIC8vIENocm9tZSAzOC00MCBzeW1ib2xzIGFyZSBub3QgaW5oZXJpdGVkIGZyb20gRE9NIGNvbGxlY3Rpb25zIHByb3RvdHlwZXMgdG8gaW5zdGFuY2VzXG4gICAgIVN5bWJvbC5zaGFtICYmIFY4X1ZFUlNJT04gJiYgVjhfVkVSU0lPTiA8IDQxO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90YXNrLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGFwcGx5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkuanNcIik7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGh0bWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaHRtbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2h0bWwuanNcIik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLmpzXCIpO1xudmFyIGNyZWF0ZUVsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qc1wiKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qc1wiKTtcbnZhciBJU19JT1MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZW5naW5lLWlzLWlvcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pb3MuanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgRnVuY3Rpb24gPSBnbG9iYWwuRnVuY3Rpb247XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgU3RyaW5nID0gZ2xvYmFsLlN0cmluZztcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyICRsb2NhdGlvbiwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbmZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gRGVubyB0aHJvd3MgYSBSZWZlcmVuY2VFcnJvciBvbiBgbG9jYXRpb25gIGFjY2VzcyB3aXRob3V0IGAtLWxvY2F0aW9uYCBmbGFnXG4gICRsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbjtcbn0pO1xuXG52YXIgcnVuID0gZnVuY3Rpb24gKGlkKSB7XG4gIGlmIChoYXNPd24ocXVldWUsIGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG5cbnZhciBydW5uZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBydW4oaWQpO1xuICB9O1xufTtcblxudmFyIGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuKGV2ZW50LmRhdGEpO1xufTtcblxudmFyIGdsb2JhbFBvc3RNZXNzYWdlRGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgLy8gb2xkIGVuZ2luZXMgaGF2ZSBub3QgbG9jYXRpb24ub3JpZ2luXG4gIGdsb2JhbC5wb3N0TWVzc2FnZShTdHJpbmcoaWQpLCAkbG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgJGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShoYW5kbGVyKSB7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwgMSk7XG4gICAgdmFyIGZuID0gaXNDYWxsYWJsZShoYW5kbGVyKSA/IGhhbmRsZXIgOiBGdW5jdGlvbihoYW5kbGVyKTtcbiAgICB2YXIgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgYXBwbHkoZm4sIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXIgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAoSVNfTk9ERSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICAvLyBleGNlcHQgaU9TIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzYyNFxuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsICYmICFJU19JT1MpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBldmVudExpc3RlbmVyO1xuICAgIGRlZmVyID0gYmluZChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0KTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoXG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiZcbiAgICBpc0NhbGxhYmxlKGdsb2JhbC5wb3N0TWVzc2FnZSkgJiZcbiAgICAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiZcbiAgICAkbG9jYXRpb24gJiYgJGxvY2F0aW9uLnByb3RvY29sICE9PSAnZmlsZTonICYmXG4gICAgIWZhaWxzKGdsb2JhbFBvc3RNZXNzYWdlRGVmZXIpXG4gICkge1xuICAgIGRlZmVyID0gZ2xvYmFsUG9zdE1lc3NhZ2VEZWZlcjtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdGFzay5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG4vLyBgdGhpc051bWJlclZhbHVlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdGhpc251bWJlcnZhbHVlXG5tb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKDEuMC52YWx1ZU9mKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGludGVnZXIsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gIHJldHVybiBpbnRlZ2VyIDwgMCA/IG1heChpbnRlZ2VyICsgbGVuZ3RoLCAwKSA6IG1pbihpbnRlZ2VyLCBsZW5ndGgpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1iaWctaW50LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanNcIik7XG5cbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBgVG9CaWdJbnRgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2JpZ2ludFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIHByaW0gPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ251bWJlcicpO1xuICBpZiAodHlwZW9mIHByaW0gPT0gJ251bWJlcicpIHRocm93ICRUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnRcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1iaWdpbnQgLS0gc2FmZVxuICByZXR1cm4gQmlnSW50KHByaW0pO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1iaWctaW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxuLy8gYFRvSW5kZXhgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2luZGV4XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGl0KTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKG51bWJlcik7XG4gIGlmIChudW1iZXIgIT09IGxlbmd0aCkgdGhyb3cgJFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCBvciBpbmRleCcpO1xuICByZXR1cm4gbGVuZ3RoO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmRleGVkLW9iamVjdC5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0cnVuYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9tYXRoLXRydW5jICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWF0aC10cnVuYy5qc1wiKTtcblxuLy8gYFRvSW50ZWdlck9ySW5maW5pdHlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB2YXIgbnVtYmVyID0gK2FyZ3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICByZXR1cm4gbnVtYmVyICE9PSBudW1iZXIgfHwgbnVtYmVyID09PSAwID8gMCA6IHRydW5jKG51bWJlcik7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xuXG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlck9ySW5maW5pdHkoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuXG4vLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuICRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2Zmc2V0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b1Bvc2l0aXZlSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wb3NpdGl2ZS1pbnRlZ2VyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIEJZVEVTKSB7XG4gIHZhciBvZmZzZXQgPSB0b1Bvc2l0aXZlSW50ZWdlcihpdCk7XG4gIGlmIChvZmZzZXQgJSBCWVRFUykgdGhyb3cgJFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCcpO1xuICByZXR1cm4gb2Zmc2V0O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vZmZzZXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcG9zaXRpdmUtaW50ZWdlci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHJlc3VsdCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaXQpO1xuICBpZiAocmVzdWx0IDwgMCkgdGhyb3cgJFJhbmdlRXJyb3IoXCJUaGUgYXJndW1lbnQgY2FuJ3QgYmUgbGVzcyB0aGFuIDBcIik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXBvc2l0aXZlLWludGVnZXIuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBpc1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1zeW1ib2wuanNcIik7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzXCIpO1xudmFyIG9yZGluYXJ5VG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb3JkaW5hcnktdG8tcHJpbWl0aXZlLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xuXG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG5cbi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikge1xuICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDtcbiAgdmFyIGV4b3RpY1RvUHJpbSA9IGdldE1ldGhvZChpbnB1dCwgVE9fUFJJTUlUSVZFKTtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKGV4b3RpY1RvUHJpbSkge1xuICAgIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnZGVmYXVsdCc7XG4gICAgcmVzdWx0ID0gY2FsbChleG90aWNUb1ByaW0sIGlucHV0LCBwcmVmKTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICB0aHJvdyAkVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xuICB9XG4gIGlmIChwcmVmID09PSB1bmRlZmluZWQpIHByZWYgPSAnbnVtYmVyJztcbiAgcmV0dXJuIG9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIHByZWYpO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB0b1ByaW1pdGl2ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1wcmltaXRpdmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcmltaXRpdmUuanNcIik7XG52YXIgaXNTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtc3ltYm9sLmpzXCIpO1xuXG4vLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpO1xuICByZXR1cm4gaXNTeW1ib2woa2V5KSA/IGtleSA6IGtleSArICcnO1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1wcm9wZXJ0eS1rZXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLXRhZy1zdXBwb3J0LmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy10YWctc3VwcG9ydC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YuanNcIik7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICBpZiAoY2xhc3NvZihhcmd1bWVudCkgPT09ICdTeW1ib2wnKSB0aHJvdyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7XG4gIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXVpbnQ4LWNsYW1wZWQuanMiOigobW9kdWxlKT0+e2V2YWwoIlxudmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHZhbHVlID0gcm91bmQoaXQpO1xuICByZXR1cm4gdmFsdWUgPCAwID8gMCA6IHZhbHVlID4gMHhGRiA/IDB4RkYgOiB2YWx1ZSAmIDB4RkY7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXVpbnQ4LWNsYW1wZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LW5vZGUtcmVxdWlyZS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jIC0tIHNhZmVcbiAgICBpZiAoSVNfTk9ERSkgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gcmVxdWlyZShcIicgKyBuYW1lICsgJ1wiKScpKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LW5vZGUtcmVxdWlyZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90cnktdG8tc3RyaW5nLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICB0cnkge1xuICAgIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gJ09iamVjdCc7XG4gIH1cbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LXRvLXN0cmluZy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcnMtcmVxdWlyZS13cmFwcGVycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9ycy1yZXF1aXJlLXdyYXBwZXJzLmpzXCIpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanNcIik7XG52YXIgQXJyYXlCdWZmZXJNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKTtcbnZhciBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLW5vbi1lbnVtZXJhYmxlLXByb3BlcnR5LmpzXCIpO1xudmFyIGlzSW50ZWdyYWxOdW1iZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdyYWwtbnVtYmVyLmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXguanNcIik7XG52YXIgdG9PZmZzZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2Zmc2V0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2Zmc2V0LmpzXCIpO1xudmFyIHRvVWludDhDbGFtcGVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXVpbnQ4LWNsYW1wZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by11aW50OC1jbGFtcGVkLmpzXCIpO1xudmFyIHRvUHJvcGVydHlLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tcHJvcGVydHkta2V5LmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBpc1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1zeW1ib2wuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXCIpLmYpO1xudmFyIHR5cGVkQXJyYXlGcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWZyb20gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tLmpzXCIpO1xudmFyIGZvckVhY2ggPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi5qc1wiKS5mb3JFYWNoKTtcbnZhciBzZXRTcGVjaWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXNwZWNpZXMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcIik7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xuXG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIEFycmF5QnVmZmVyID0gQXJyYXlCdWZmZXJNb2R1bGUuQXJyYXlCdWZmZXI7XG52YXIgQXJyYXlCdWZmZXJQcm90b3R5cGUgPSBBcnJheUJ1ZmZlci5wcm90b3R5cGU7XG52YXIgRGF0YVZpZXcgPSBBcnJheUJ1ZmZlck1vZHVsZS5EYXRhVmlldztcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTO1xudmFyIFRZUEVEX0FSUkFZX1RBRyA9IEFycmF5QnVmZmVyVmlld0NvcmUuVFlQRURfQVJSQVlfVEFHO1xudmFyIFR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXk7XG52YXIgVHlwZWRBcnJheVByb3RvdHlwZSA9IEFycmF5QnVmZmVyVmlld0NvcmUuVHlwZWRBcnJheVByb3RvdHlwZTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xudmFyIGlzVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuaXNUeXBlZEFycmF5O1xudmFyIEJZVEVTX1BFUl9FTEVNRU5UID0gJ0JZVEVTX1BFUl9FTEVNRU5UJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoJztcblxudmFyIGZyb21MaXN0ID0gZnVuY3Rpb24gKEMsIGxpc3QpIHtcbiAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihDKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gbmV3IEMobGVuZ3RoKTtcbiAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBhZGRHZXR0ZXIgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoaXQsIGtleSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpW2tleV07XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBrbGFzcztcbiAgcmV0dXJuIGlzUHJvdG90eXBlT2YoQXJyYXlCdWZmZXJQcm90b3R5cGUsIGl0KSB8fCAoa2xhc3MgPSBjbGFzc29mKGl0KSkgPT0gJ0FycmF5QnVmZmVyJyB8fCBrbGFzcyA9PSAnU2hhcmVkQXJyYXlCdWZmZXInO1xufTtcblxudmFyIGlzVHlwZWRBcnJheUluZGV4ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gIHJldHVybiBpc1R5cGVkQXJyYXkodGFyZ2V0KVxuICAgICYmICFpc1N5bWJvbChrZXkpXG4gICAgJiYga2V5IGluIHRhcmdldFxuICAgICYmIGlzSW50ZWdyYWxOdW1iZXIoK2tleSlcbiAgICAmJiBrZXkgPj0gMDtcbn07XG5cbnZhciB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSB7XG4gIGtleSA9IHRvUHJvcGVydHlLZXkoa2V5KTtcbiAgcmV0dXJuIGlzVHlwZWRBcnJheUluZGV4KHRhcmdldCwga2V5KVxuICAgID8gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDIsIHRhcmdldFtrZXldKVxuICAgIDogbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbn07XG5cbnZhciB3cmFwcGVkRGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcikge1xuICBrZXkgPSB0b1Byb3BlcnR5S2V5KGtleSk7XG4gIGlmIChpc1R5cGVkQXJyYXlJbmRleCh0YXJnZXQsIGtleSlcbiAgICAmJiBpc09iamVjdChkZXNjcmlwdG9yKVxuICAgICYmIGhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKVxuICAgICYmICFoYXNPd24oZGVzY3JpcHRvciwgJ2dldCcpXG4gICAgJiYgIWhhc093bihkZXNjcmlwdG9yLCAnc2V0JylcbiAgICAvLyBUT0RPOiBhZGQgdmFsaWRhdGlvbiBkZXNjcmlwdG9yIHcvbyBjYWxsaW5nIGFjY2Vzc29yc1xuICAgICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZVxuICAgICYmICghaGFzT3duKGRlc2NyaXB0b3IsICd3cml0YWJsZScpIHx8IGRlc2NyaXB0b3Iud3JpdGFibGUpXG4gICAgJiYgKCFoYXNPd24oZGVzY3JpcHRvciwgJ2VudW1lcmFibGUnKSB8fCBkZXNjcmlwdG9yLmVudW1lcmFibGUpXG4gICkge1xuICAgIHRhcmdldFtrZXldID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9IHJldHVybiBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG59O1xuXG5pZiAoREVTQ1JJUFRPUlMpIHtcbiAgaWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKSB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYgPSB3cmFwcGVkR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgIGRlZmluZVByb3BlcnR5TW9kdWxlLmYgPSB3cmFwcGVkRGVmaW5lUHJvcGVydHk7XG4gICAgYWRkR2V0dGVyKFR5cGVkQXJyYXlQcm90b3R5cGUsICdidWZmZXInKTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J5dGVPZmZzZXQnKTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2J5dGVMZW5ndGgnKTtcbiAgICBhZGRHZXR0ZXIoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2xlbmd0aCcpO1xuICB9XG5cbiAgJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfSwge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogd3JhcHBlZEdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgICBkZWZpbmVQcm9wZXJ0eTogd3JhcHBlZERlZmluZVByb3BlcnR5XG4gIH0pO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsIHdyYXBwZXIsIENMQU1QRUQpIHtcbiAgICB2YXIgQllURVMgPSBUWVBFLm1hdGNoKC9cXGQrLylbMF0gLyA4O1xuICAgIHZhciBDT05TVFJVQ1RPUl9OQU1FID0gVFlQRSArIChDTEFNUEVEID8gJ0NsYW1wZWQnIDogJycpICsgJ0FycmF5JztcbiAgICB2YXIgR0VUVEVSID0gJ2dldCcgKyBUWVBFO1xuICAgIHZhciBTRVRURVIgPSAnc2V0JyArIFRZUEU7XG4gICAgdmFyIE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgICB2YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgIHZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3IgJiYgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICB2YXIgZXhwb3J0ZWQgPSB7fTtcblxuICAgIHZhciBnZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHJldHVybiBkYXRhLnZpZXdbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5ieXRlT2Zmc2V0LCB0cnVlKTtcbiAgICB9O1xuXG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIGRhdGEudmlld1tTRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLmJ5dGVPZmZzZXQsIENMQU1QRUQgPyB0b1VpbnQ4Q2xhbXBlZCh2YWx1ZSkgOiB2YWx1ZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICBuYXRpdmVEZWZpbmVQcm9wZXJ0eSh0aGF0LCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIHtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsIG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBieXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIGJ1ZmZlciwgYnl0ZUxlbmd0aCwgbGVuZ3RoO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgbGVuZ3RoID0gdG9JbmRleChkYXRhKTtcbiAgICAgICAgICBieXRlTGVuZ3RoID0gbGVuZ3RoICogQllURVM7XG4gICAgICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXlCdWZmZXIoZGF0YSkpIHtcbiAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgIGJ5dGVPZmZzZXQgPSB0b09mZnNldChvZmZzZXQsIEJZVEVTKTtcbiAgICAgICAgICB2YXIgJGxlbiA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICBpZiAoJGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gJGxlbiAtIGJ5dGVPZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCA8IDApIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9IHRvTGVuZ3RoKCRsZW5ndGgpICogQllURVM7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCArIGJ5dGVPZmZzZXQgPiAkbGVuKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aCA9IGJ5dGVMZW5ndGggLyBCWVRFUztcbiAgICAgICAgfSBlbHNlIGlmIChpc1R5cGVkQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY2FsbCh0eXBlZEFycmF5RnJvbSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgICBidWZmZXI6IGJ1ZmZlcixcbiAgICAgICAgICBieXRlT2Zmc2V0OiBieXRlT2Zmc2V0LFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGJ5dGVMZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgICAgICAgdmlldzogbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgYWRkRWxlbWVudCh0aGF0LCBpbmRleCsrKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7XG4gICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKFR5cGVkQXJyYXlQcm90b3R5cGUpO1xuICAgIH0gZWxzZSBpZiAoVFlQRURfQVJSQVlTX0NPTlNUUlVDVE9SU19SRVFVSVJFU19XUkFQUEVSUykge1xuICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAoZHVtbXksIGRhdGEsIHR5cGVkQXJyYXlPZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZShkdW1teSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlKTtcbiAgICAgICAgcmV0dXJuIGluaGVyaXRJZlJlcXVpcmVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSByZXR1cm4gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0b0luZGV4KGRhdGEpKTtcbiAgICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcihkYXRhKSkgcmV0dXJuICRsZW5ndGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBuZXcgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKGRhdGEsIHRvT2Zmc2V0KHR5cGVkQXJyYXlPZmZzZXQsIEJZVEVTKSwgJGxlbmd0aClcbiAgICAgICAgICAgIDogdHlwZWRBcnJheU9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihkYXRhLCB0b09mZnNldCh0eXBlZEFycmF5T2Zmc2V0LCBCWVRFUykpXG4gICAgICAgICAgICAgIDogbmV3IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcihkYXRhKTtcbiAgICAgICAgICBpZiAoaXNUeXBlZEFycmF5KGRhdGEpKSByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgICByZXR1cm4gY2FsbCh0eXBlZEFycmF5RnJvbSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBkYXRhKTtcbiAgICAgICAgfSgpLCBkdW1teSwgVHlwZWRBcnJheUNvbnN0cnVjdG9yKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHNldFByb3RvdHlwZU9mKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgVHlwZWRBcnJheSk7XG4gICAgICBmb3JFYWNoKGdldE93blByb3BlcnR5TmFtZXMoTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yKSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3IsIGtleSwgTmF0aXZlVHlwZWRBcnJheUNvbnN0cnVjdG9yW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGU7XG4gICAgfVxuXG4gICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZS5jb25zdHJ1Y3RvciAhPT0gVHlwZWRBcnJheUNvbnN0cnVjdG9yKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yUHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBUeXBlZEFycmF5Q29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSkuVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuXG4gICAgaWYgKFRZUEVEX0FSUkFZX1RBRykge1xuICAgICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSwgVFlQRURfQVJSQVlfVEFHLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICB9XG5cbiAgICB2YXIgRk9SQ0VEID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yICE9IE5hdGl2ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcblxuICAgIGV4cG9ydGVkW0NPTlNUUlVDVE9SX05BTUVdID0gVHlwZWRBcnJheUNvbnN0cnVjdG9yO1xuXG4gICAgJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGZvcmNlZDogRk9SQ0VELCBzaGFtOiAhTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyB9LCBleHBvcnRlZCk7XG5cbiAgICBpZiAoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3IpKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpO1xuICAgIH1cblxuICAgIGlmICghKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvclByb3RvdHlwZSkpIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShUeXBlZEFycmF5Q29uc3RydWN0b3JQcm90b3R5cGUsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG4gICAgfVxuXG4gICAgc2V0U3BlY2llcyhDT05TVFJVQ1RPUl9OQU1FKTtcbiAgfTtcbn0gZWxzZSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3RvcnMtcmVxdWlyZS13cmFwcGVycy5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi9cbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NoZWNrLWNvcnJlY3RuZXNzLW9mLWl0ZXJhdGlvbi5qc1wiKTtcbnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTKTtcblxudmFyIEFycmF5QnVmZmVyID0gZ2xvYmFsLkFycmF5QnVmZmVyO1xudmFyIEludDhBcnJheSA9IGdsb2JhbC5JbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgSW50OEFycmF5KDEpO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgbmV3IEludDhBcnJheSgtMSk7XG59KSB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBuZXcgSW50OEFycmF5KCk7XG4gIG5ldyBJbnQ4QXJyYXkobnVsbCk7XG4gIG5ldyBJbnQ4QXJyYXkoMS41KTtcbiAgbmV3IEludDhBcnJheShpdGVyYWJsZSk7XG59LCB0cnVlKSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFNhZmFyaSAoMTErKSBidWcgLSBhIHJlYXNvbiB3aHkgZXZlbiBTYWZhcmkgMTMgc2hvdWxkIGxvYWQgYSB0eXBlZCBhcnJheSBwb2x5ZmlsbFxuICByZXR1cm4gbmV3IEludDhBcnJheShuZXcgQXJyYXlCdWZmZXIoMiksIDEsIHVuZGVmaW5lZCkubGVuZ3RoICE9PSAxO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3JzLXJlcXVpcmUtd3JhcHBlcnMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktZnJvbS5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBhQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYS1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2EtY29uc3RydWN0b3IuanNcIik7XG52YXIgdG9PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgZ2V0SXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLmpzXCIpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kLmpzXCIpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanNcIik7XG52YXIgaXNCaWdJbnRBcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1iaWctaW50LWFycmF5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYmlnLWludC1hcnJheS5qc1wiKTtcbnZhciBhVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yKTtcbnZhciB0b0JpZ0ludCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1iaWctaW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYmlnLWludC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcGZuLCB0aGlzQXJnICovKSB7XG4gIHZhciBDID0gYUNvbnN0cnVjdG9yKHRoaXMpO1xuICB2YXIgTyA9IHRvT2JqZWN0KHNvdXJjZSk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWFwZm4gPSBhcmd1bWVudHNMZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gIHZhciBpdGVyYXRvck1ldGhvZCA9IGdldEl0ZXJhdG9yTWV0aG9kKE8pO1xuICB2YXIgaSwgbGVuZ3RoLCByZXN1bHQsIHRoaXNJc0JpZ0ludEFycmF5LCB2YWx1ZSwgc3RlcCwgaXRlcmF0b3IsIG5leHQ7XG4gIGlmIChpdGVyYXRvck1ldGhvZCAmJiAhaXNBcnJheUl0ZXJhdG9yTWV0aG9kKGl0ZXJhdG9yTWV0aG9kKSkge1xuICAgIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoTywgaXRlcmF0b3JNZXRob2QpO1xuICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgIE8gPSBbXTtcbiAgICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHtcbiAgICAgIE8ucHVzaChzdGVwLnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgaWYgKG1hcHBpbmcgJiYgYXJndW1lbnRzTGVuZ3RoID4gMikge1xuICAgIG1hcGZuID0gYmluZChtYXBmbiwgYXJndW1lbnRzWzJdKTtcbiAgfVxuICBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShPKTtcbiAgcmVzdWx0ID0gbmV3IChhVHlwZWRBcnJheUNvbnN0cnVjdG9yKEMpKShsZW5ndGgpO1xuICB0aGlzSXNCaWdJbnRBcnJheSA9IGlzQmlnSW50QXJyYXkocmVzdWx0KTtcbiAgZm9yIChpID0gMDsgbGVuZ3RoID4gaTsgaSsrKSB7XG4gICAgdmFsdWUgPSBtYXBwaW5nID8gbWFwZm4oT1tpXSwgaSkgOiBPW2ldO1xuICAgIC8vIEZGMzAtIHR5cGVkIGFycmF5cyBkb2Vzbid0IHByb3Blcmx5IGNvbnZlcnQgb2JqZWN0cyB0byB0eXBlZCBhcnJheSB2YWx1ZXNcbiAgICByZXN1bHRbaV0gPSB0aGlzSXNCaWdJbnRBcnJheSA/IHRvQmlnSW50KHZhbHVlKSA6ICt2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1mcm9tLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xuXG52YXIgaWQgPSAwO1xudmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpO1xudmFyIHRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcgKyAoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSkgKyAnKV8nICsgdG9TdHJpbmcoKytpZCArIHBvc3RmaXgsIDM2KTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VybC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcmVsYXRpdmUtdXJsLXN0eWxlIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHZhciB1cmwgPSBuZXcgVVJMKCdiP2E9MSZiPTImYz0zJywgJ2h0dHA6Ly9hJyk7XG4gIHZhciBwYXJhbXMgPSB1cmwuc2VhcmNoUGFyYW1zO1xuICB2YXIgcGFyYW1zMiA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoJ2E9MSZhPTImYj0zJyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgdXJsLnBhdGhuYW1lID0gJ2MlMjBkJztcbiAgcGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBwYXJhbXNbJ2RlbGV0ZSddKCdiJyk7XG4gICAgcmVzdWx0ICs9IGtleSArIHZhbHVlO1xuICB9KTtcbiAgcGFyYW1zMlsnZGVsZXRlJ10oJ2EnLCAyKTtcbiAgLy8gYHVuZGVmaW5lZGAgY2FzZSBpcyBhIENocm9taXVtIDExNyBidWdcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTQyMjJcbiAgcGFyYW1zMlsnZGVsZXRlJ10oJ2InLCB1bmRlZmluZWQpO1xuICByZXR1cm4gKElTX1BVUkUgJiYgKCF1cmwudG9KU09OIHx8ICFwYXJhbXMyLmhhcygnYScsIDEpIHx8IHBhcmFtczIuaGFzKCdhJywgMikgfHwgIXBhcmFtczIuaGFzKCdhJywgdW5kZWZpbmVkKSB8fCBwYXJhbXMyLmhhcygnYicpKSlcbiAgICB8fCAoIXBhcmFtcy5zaXplICYmIChJU19QVVJFIHx8ICFERVNDUklQVE9SUykpXG4gICAgfHwgIXBhcmFtcy5zb3J0XG4gICAgfHwgdXJsLmhyZWYgIT09ICdodHRwOi8vYS9jJTIwZD9hPTEmYz0zJ1xuICAgIHx8IHBhcmFtcy5nZXQoJ2MnKSAhPT0gJzMnXG4gICAgfHwgU3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoJz9hPTEnKSkgIT09ICdhPTEnXG4gICAgfHwgIXBhcmFtc1tJVEVSQVRPUl1cbiAgICAvLyB0aHJvd3MgaW4gRWRnZVxuICAgIHx8IG5ldyBVUkwoJ2h0dHBzOi8vYUBiJykudXNlcm5hbWUgIT09ICdhJ1xuICAgIHx8IG5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcygnYT1iJykpLmdldCgnYScpICE9PSAnYidcbiAgICAvLyBub3QgcHVueWNvZGVkIGluIEVkZ2VcbiAgICB8fCBuZXcgVVJMKCdodHRwOi8v0YLQtdGB0YInKS5ob3N0ICE9PSAneG4tLWUxYXliYydcbiAgICAvLyBub3QgZXNjYXBlZCBpbiBDaHJvbWUgNjItXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL2Ej0LEnKS5oYXNoICE9PSAnIyVEMCVCMSdcbiAgICAvLyBmYWlscyBpbiBDaHJvbWUgNjYtXG4gICAgfHwgcmVzdWx0ICE9PSAnYTFjMydcbiAgICAvLyB0aHJvd3MgaW4gU2FmYXJpXG4gICAgfHwgbmV3IFVSTCgnaHR0cDovL3gnLCB1bmRlZmluZWQpLmhvc3QgIT09ICd4Jztcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VybC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlLXN5bWJvbC1hcy11aWQuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLyogZXNsaW50LWRpc2FibGUgZXMvbm8tc3ltYm9sIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nICovXG52YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBOQVRJVkVfU1lNQk9MXG4gICYmICFTeW1ib2wuc2hhbVxuICAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Y4LXByb3RvdHlwZS1kZWZpbmUtYnVnLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbi8vIFY4IH4gQ2hyb21lIDM2LVxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzMzNFxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdwcm90b3R5cGUnLCB7XG4gICAgdmFsdWU6IDQyLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KS5wcm90b3R5cGUgIT0gNDI7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92OC1wcm90b3R5cGUtZGVmaW5lLWJ1Zy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzIjooKG1vZHVsZSk9PntldmFsKCJcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXNzZWQsIHJlcXVpcmVkKSB7XG4gIGlmIChwYXNzZWQgPCByZXF1aXJlZCkgdGhyb3cgJFR5cGVFcnJvcignTm90IGVub3VnaCBhcmd1bWVudHMnKTtcbiAgcmV0dXJuIHBhc3NlZDtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xuXG52YXIgV2Vha01hcCA9IGdsb2JhbC5XZWFrTWFwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQ2FsbGFibGUoV2Vha01hcCkgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhXZWFrTWFwKSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2Vhay1tYXAtYmFzaWMtZGV0ZWN0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zaGFyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zaGFyZWQuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91aWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanNcIik7XG52YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zeW1ib2wtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKTtcbnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91c2Utc3ltYm9sLWFzLXVpZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VzZS1zeW1ib2wtYXMtdWlkLmpzXCIpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpO1xudmFyIGNyZWF0ZVdlbGxLbm93blN5bWJvbCA9IFVTRV9TWU1CT0xfQVNfVUlEID8gU3ltYm9sWydmb3InXSB8fCBTeW1ib2wgOiBTeW1ib2wgJiYgU3ltYm9sLndpdGhvdXRTZXR0ZXIgfHwgdWlkO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghaGFzT3duKFdlbGxLbm93blN5bWJvbHNTdG9yZSwgbmFtZSkpIHtcbiAgICBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV0gPSBOQVRJVkVfU1lNQk9MICYmIGhhc093bihTeW1ib2wsIG5hbWUpXG4gICAgICA/IFN5bWJvbFtuYW1lXVxuICAgICAgOiBjcmVhdGVXZWxsS25vd25TeW1ib2woJ1N5bWJvbC4nICsgbmFtZSk7XG4gIH0gcmV0dXJuIFdlbGxLbm93blN5bWJvbHNTdG9yZVtuYW1lXTtcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiOigobW9kdWxlKT0+e2V2YWwoIlxuLy8gYSBzdHJpbmcgb2YgYWxsIHZhbGlkIHVuaWNvZGUgd2hpdGVzcGFjZXNcbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyJyArXG4gICdcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd3JhcC1lcnJvci1jb25zdHJ1Y3Rvci13aXRoLWNhdXNlLmpzIjooKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHNldFByb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanNcIik7XG52YXIgcHJveHlBY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm94eS1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb3h5LWFjY2Vzc29yLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzXCIpO1xudmFyIGluc3RhbGxFcnJvckNhdXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luc3RhbGwtZXJyb3ItY2F1c2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnN0YWxsLWVycm9yLWNhdXNlLmpzXCIpO1xudmFyIGluc3RhbGxFcnJvclN0YWNrID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWluc3RhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoRlVMTF9OQU1FLCB3cmFwcGVyLCBGT1JDRUQsIElTX0FHR1JFR0FURV9FUlJPUikge1xuICB2YXIgU1RBQ0tfVFJBQ0VfTElNSVQgPSAnc3RhY2tUcmFjZUxpbWl0JztcbiAgdmFyIE9QVElPTlNfUE9TSVRJT04gPSBJU19BR0dSRUdBVEVfRVJST1IgPyAyIDogMTtcbiAgdmFyIHBhdGggPSBGVUxMX05BTUUuc3BsaXQoJy4nKTtcbiAgdmFyIEVSUk9SX05BTUUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gIHZhciBPcmlnaW5hbEVycm9yID0gZ2V0QnVpbHRJbi5hcHBseShudWxsLCBwYXRoKTtcblxuICBpZiAoIU9yaWdpbmFsRXJyb3IpIHJldHVybjtcblxuICB2YXIgT3JpZ2luYWxFcnJvclByb3RvdHlwZSA9IE9yaWdpbmFsRXJyb3IucHJvdG90eXBlO1xuXG4gIC8vIFY4IDkuMy0gYnVnIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTEyMDA2XG4gIGlmICghSVNfUFVSRSAmJiBoYXNPd24oT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgJ2NhdXNlJykpIGRlbGV0ZSBPcmlnaW5hbEVycm9yUHJvdG90eXBlLmNhdXNlO1xuXG4gIGlmICghRk9SQ0VEKSByZXR1cm4gT3JpZ2luYWxFcnJvcjtcblxuICB2YXIgQmFzZUVycm9yID0gZ2V0QnVpbHRJbignRXJyb3InKTtcblxuICB2YXIgV3JhcHBlZEVycm9yID0gd3JhcHBlcihmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoSVNfQUdHUkVHQVRFX0VSUk9SID8gYiA6IGEsIHVuZGVmaW5lZCk7XG4gICAgdmFyIHJlc3VsdCA9IElTX0FHR1JFR0FURV9FUlJPUiA/IG5ldyBPcmlnaW5hbEVycm9yKGEpIDogbmV3IE9yaWdpbmFsRXJyb3IoKTtcbiAgICBpZiAobWVzc2FnZSAhPT0gdW5kZWZpbmVkKSBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocmVzdWx0LCAnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgIGluc3RhbGxFcnJvclN0YWNrKHJlc3VsdCwgV3JhcHBlZEVycm9yLCByZXN1bHQuc3RhY2ssIDIpO1xuICAgIGlmICh0aGlzICYmIGlzUHJvdG90eXBlT2YoT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgdGhpcykpIGluaGVyaXRJZlJlcXVpcmVkKHJlc3VsdCwgdGhpcywgV3JhcHBlZEVycm9yKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IE9QVElPTlNfUE9TSVRJT04pIGluc3RhbGxFcnJvckNhdXNlKHJlc3VsdCwgYXJndW1lbnRzW09QVElPTlNfUE9TSVRJT05dKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICBXcmFwcGVkRXJyb3IucHJvdG90eXBlID0gT3JpZ2luYWxFcnJvclByb3RvdHlwZTtcblxuICBpZiAoRVJST1JfTkFNRSAhPT0gJ0Vycm9yJykge1xuICAgIGlmIChzZXRQcm90b3R5cGVPZikgc2V0UHJvdG90eXBlT2YoV3JhcHBlZEVycm9yLCBCYXNlRXJyb3IpO1xuICAgIGVsc2UgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhXcmFwcGVkRXJyb3IsIEJhc2VFcnJvciwgeyBuYW1lOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKERFU0NSSVBUT1JTICYmIFNUQUNLX1RSQUNFX0xJTUlUIGluIE9yaWdpbmFsRXJyb3IpIHtcbiAgICBwcm94eUFjY2Vzc29yKFdyYXBwZWRFcnJvciwgT3JpZ2luYWxFcnJvciwgU1RBQ0tfVFJBQ0VfTElNSVQpO1xuICAgIHByb3h5QWNjZXNzb3IoV3JhcHBlZEVycm9yLCBPcmlnaW5hbEVycm9yLCAncHJlcGFyZVN0YWNrVHJhY2UnKTtcbiAgfVxuXG4gIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoV3JhcHBlZEVycm9yLCBPcmlnaW5hbEVycm9yKTtcblxuICBpZiAoIUlTX1BVUkUpIHRyeSB7XG4gICAgLy8gU2FmYXJpIDEzLSBidWc6IFdlYkFzc2VtYmx5IGVycm9ycyBkb2VzIG5vdCBoYXZlIGEgcHJvcGVyIGAubmFtZWBcbiAgICBpZiAoT3JpZ2luYWxFcnJvclByb3RvdHlwZS5uYW1lICE9PSBFUlJPUl9OQU1FKSB7XG4gICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoT3JpZ2luYWxFcnJvclByb3RvdHlwZSwgJ25hbWUnLCBFUlJPUl9OQU1FKTtcbiAgICB9XG4gICAgT3JpZ2luYWxFcnJvclByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdyYXBwZWRFcnJvcjtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuXG4gIHJldHVybiBXcmFwcGVkRXJyb3I7XG59O1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dyYXAtZXJyb3ItY29uc3RydWN0b3Itd2l0aC1jYXVzZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmNvbnN0cnVjdG9yLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgYXJyYXlCdWZmZXJNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLmpzXCIpO1xudmFyIHNldFNwZWNpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtc3BlY2llcy5qc1wiKTtcblxudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgQXJyYXlCdWZmZXIgPSBhcnJheUJ1ZmZlck1vZHVsZVtBUlJBWV9CVUZGRVJdO1xudmFyIE5hdGl2ZUFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07XG5cbi8vIGBBcnJheUJ1ZmZlcmAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXItY29uc3RydWN0b3JcbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IE5hdGl2ZUFycmF5QnVmZmVyICE9PSBBcnJheUJ1ZmZlciB9LCB7XG4gIEFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlclxufSk7XG5cbnNldFNwZWNpZXMoQVJSQVlfQlVGRkVSKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBBcnJheUJ1ZmZlck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXIuanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG5cbnZhciBBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyTW9kdWxlLkFycmF5QnVmZmVyO1xudmFyIERhdGFWaWV3ID0gQXJyYXlCdWZmZXJNb2R1bGUuRGF0YVZpZXc7XG52YXIgRGF0YVZpZXdQcm90b3R5cGUgPSBEYXRhVmlldy5wcm90b3R5cGU7XG52YXIgbmF0aXZlQXJyYXlCdWZmZXJTbGljZSA9IHVuY3VycnlUaGlzKEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSk7XG52YXIgZ2V0VWludDggPSB1bmN1cnJ5VGhpcyhEYXRhVmlld1Byb3RvdHlwZS5nZXRVaW50OCk7XG52YXIgc2V0VWludDggPSB1bmN1cnJ5VGhpcyhEYXRhVmlld1Byb3RvdHlwZS5zZXRVaW50OCk7XG5cbnZhciBJTkNPUlJFQ1RfU0xJQ0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhbmV3IEFycmF5QnVmZmVyKDIpLnNsaWNlKDEsIHVuZGVmaW5lZCkuYnl0ZUxlbmd0aDtcbn0pO1xuXG4vLyBgQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXlidWZmZXIucHJvdG90eXBlLnNsaWNlXG4kKHsgdGFyZ2V0OiAnQXJyYXlCdWZmZXInLCBwcm90bzogdHJ1ZSwgdW5zYWZlOiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9TTElDRSB9LCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgaWYgKG5hdGl2ZUFycmF5QnVmZmVyU2xpY2UgJiYgZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuYXRpdmVBcnJheUJ1ZmZlclNsaWNlKGFuT2JqZWN0KHRoaXMpLCBzdGFydCk7IC8vIEZGIGZpeFxuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbmd0aCk7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IGVuZCwgbGVuZ3RoKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgQXJyYXlCdWZmZXIpKSh0b0xlbmd0aChmaW4gLSBmaXJzdCkpO1xuICAgIHZhciB2aWV3U291cmNlID0gbmV3IERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VGFyZ2V0ID0gbmV3IERhdGFWaWV3KHJlc3VsdCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoZmlyc3QgPCBmaW4pIHtcbiAgICAgIHNldFVpbnQ4KHZpZXdUYXJnZXQsIGluZGV4KyssIGdldFVpbnQ4KHZpZXdTb3VyY2UsIGZpcnN0KyspKTtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIuc2xpY2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmF0LmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanNcIik7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuYXRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuYXRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgYXQ6IGZ1bmN0aW9uIGF0KGluZGV4KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIHJlbGF0aXZlSW5kZXggPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTtcbiAgICB2YXIgayA9IHJlbGF0aXZlSW5kZXggPj0gMCA/IHJlbGF0aXZlSW5kZXggOiBsZW4gKyByZWxhdGl2ZUluZGV4O1xuICAgIHJldHVybiAoayA8IDAgfHwgayA+PSBsZW4pID8gdW5kZWZpbmVkIDogT1trXTtcbiAgfVxufSk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2F0Jyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmF0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QtaW5kZXguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgJGZpbmRMYXN0SW5kZXggPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi1mcm9tLWxhc3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24tZnJvbS1sYXN0LmpzXCIpLmZpbmRMYXN0SW5kZXgpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzXCIpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZGxhc3RpbmRleFxuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwge1xuICBmaW5kTGFzdEluZGV4OiBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kTGFzdEluZGV4KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2ZpbmRMYXN0SW5kZXgnKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC1sYXN0LWluZGV4LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgJGZpbmRMYXN0ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24tZnJvbS1sYXN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qc1wiKS5maW5kTGFzdCk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmluZGxhc3RcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgZmluZExhc3Q6IGZ1bmN0aW9uIGZpbmRMYXN0KGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kTGFzdCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdmaW5kTGFzdCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWxhc3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmxhdHRlbi1pbnRvLWFycmF5LmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZS5qc1wiKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5mbGF0TWFwYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZsYXRtYXBcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlIH0sIHtcbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICAgIHZhciBBO1xuICAgIGFDYWxsYWJsZShjYWxsYmFja2ZuKTtcbiAgICBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIEEubGVuZ3RoID0gZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIDEsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZsYXQtbWFwLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkaW5jbHVkZXMgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMuanNcIikuaW5jbHVkZXMpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIEZGOTkrIGJ1Z1xudmFyIEJST0tFTl9PTl9TUEFSU0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1wcm90b3R5cGUtaW5jbHVkZXMgLS0gZGV0ZWN0aW9uXG4gIHJldHVybiAhQXJyYXkoMSkuaW5jbHVkZXMoKTtcbn0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCUk9LRU5fT05fU1BBUlNFIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2luY2x1ZGVzJyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmluY2x1ZGVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyI6KChtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanNcIik7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG52YXIgSXRlcmF0b3JzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9ycy5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgZGVmaW5lUHJvcGVydHkgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzXCIpLmYpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWRlZmluZS5qc1wiKTtcbnZhciBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlci1yZXN1bHQtb2JqZWN0LmpzXCIpO1xudmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmVudHJpZXNcbi8vIGBBcnJheS5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5rZXlzXG4vLyBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEBpdGVyYXRvclxuLy8gYENyZWF0ZUFycmF5SXRlcmF0b3JgIGludGVybmFsIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jcmVhdGVhcnJheWl0ZXJhdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZUl0ZXJhdG9yKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogQVJSQVlfSVRFUkFUT1IsXG4gICAgdGFyZ2V0OiB0b0luZGV4ZWRPYmplY3QoaXRlcmF0ZWQpLCAvLyB0YXJnZXRcbiAgICBpbmRleDogMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgICBraW5kOiBraW5kICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtpbmRcbiAgfSk7XG4vLyBgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KGluZGV4LCBmYWxzZSk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gY3JlYXRlSXRlclJlc3VsdE9iamVjdCh0YXJnZXRbaW5kZXhdLCBmYWxzZSk7XG4gIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KFtpbmRleCwgdGFyZ2V0W2luZGV4XV0sIGZhbHNlKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNyZWF0ZW1hcHBlZGFyZ3VtZW50c29iamVjdFxudmFyIHZhbHVlcyA9IEl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG4vLyBWOCB+IENocm9tZSA0NS0gYnVnXG5pZiAoIUlTX1BVUkUgJiYgREVTQ1JJUFRPUlMgJiYgdmFsdWVzLm5hbWUgIT09ICd2YWx1ZXMnKSB0cnkge1xuICBkZWZpbmVQcm9wZXJ0eSh2YWx1ZXMsICduYW1lJywgeyB2YWx1ZTogJ3ZhbHVlcycgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lml0ZXJhdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9iamVjdC5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHNldEFycmF5TGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNldC1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zZXQtbGVuZ3RoLmpzXCIpO1xudmFyIGRvZXNOb3RFeGNlZWRTYWZlSW50ZWdlciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb2VzLW5vdC1leGNlZWQtc2FmZS1pbnRlZ2VyICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9lcy1ub3QtZXhjZWVkLXNhZmUtaW50ZWdlci5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xuXG52YXIgSU5DT1JSRUNUX1RPX0xFTkdUSCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFtdLnB1c2guY2FsbCh7IGxlbmd0aDogMHgxMDAwMDAwMDAgfSwgMSkgIT09IDQyOTQ5NjcyOTc7XG59KTtcblxuLy8gVjggYW5kIFNhZmFyaSA8PSAxNS40LCBGRiA8IDIzIHRocm93cyBJbnRlcm5hbEVycm9yXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjY4MVxudmFyIHByb3BlckVycm9yT25Ob25Xcml0YWJsZUxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5wdXNoKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICB9XG59O1xuXG52YXIgRk9SQ0VEID0gSU5DT1JSRUNUX1RPX0xFTkdUSCB8fCAhcHJvcGVyRXJyb3JPbk5vbldyaXRhYmxlTGVuZ3RoKCk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUucHVzaGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5wdXNoXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGBcbiAgcHVzaDogZnVuY3Rpb24gcHVzaChpdGVtKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7XG4gICAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIobGVuICsgYXJnQ291bnQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykge1xuICAgICAgT1tsZW5dID0gYXJndW1lbnRzW2ldO1xuICAgICAgbGVuKys7XG4gICAgfVxuICAgIHNldEFycmF5TGVuZ3RoKE8sIGxlbik7XG4gICAgcmV0dXJuIGxlbjtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNvcnQuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1vYmplY3QuanNcIik7XG52YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZS5qc1wiKTtcbnZhciBkZWxldGVQcm9wZXJ0eU9yVGhyb3cgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVsZXRlLXByb3BlcnR5LW9yLXRocm93LmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGludGVybmFsU29ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc29ydC5qc1wiKTtcbnZhciBhcnJheU1ldGhvZElzU3RyaWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1pcy1zdHJpY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaXMtc3RyaWN0LmpzXCIpO1xudmFyIEZGID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1mZi12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanNcIik7XG52YXIgSUVfT1JfRURHRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pZS1vci1lZGdlLmpzXCIpO1xudmFyIFY4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanNcIik7XG52YXIgV0VCS0lUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbi5qc1wiKTtcblxudmFyIHRlc3QgPSBbXTtcbnZhciBuYXRpdmVTb3J0ID0gdW5jdXJyeVRoaXModGVzdC5zb3J0KTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXModGVzdC5wdXNoKTtcblxuLy8gSUU4LVxudmFyIEZBSUxTX09OX1VOREVGSU5FRCA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KTtcbi8vIFY4IGJ1Z1xudmFyIEZBSUxTX09OX05VTEwgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHRlc3Quc29ydChudWxsKTtcbn0pO1xuLy8gT2xkIFdlYktpdFxudmFyIFNUUklDVF9NRVRIT0QgPSBhcnJheU1ldGhvZElzU3RyaWN0KCdzb3J0Jyk7XG5cbnZhciBTVEFCTEVfU09SVCA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGZlYXR1cmUgZGV0ZWN0aW9uIGNhbiBiZSB0b28gc2xvdywgc28gY2hlY2sgZW5naW5lcyB2ZXJzaW9uc1xuICBpZiAoVjgpIHJldHVybiBWOCA8IDcwO1xuICBpZiAoRkYgJiYgRkYgPiAzKSByZXR1cm47XG4gIGlmIChJRV9PUl9FREdFKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKFdFQktJVCkgcmV0dXJuIFdFQktJVCA8IDYwMztcblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBjb2RlLCBjaHIsIHZhbHVlLCBpbmRleDtcblxuICAvLyBnZW5lcmF0ZSBhbiBhcnJheSB3aXRoIG1vcmUgNTEyIGVsZW1lbnRzIChDaGFrcmEgYW5kIG9sZCBWOCBmYWlscyBvbmx5IGluIHRoaXMgY2FzZSlcbiAgZm9yIChjb2RlID0gNjU7IGNvZGUgPCA3NjsgY29kZSsrKSB7XG4gICAgY2hyID0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcblxuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSA2NjogY2FzZSA2OTogY2FzZSA3MDogY2FzZSA3MjogdmFsdWUgPSAzOyBicmVhaztcbiAgICAgIGNhc2UgNjg6IGNhc2UgNzE6IHZhbHVlID0gNDsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB2YWx1ZSA9IDI7XG4gICAgfVxuXG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDc7IGluZGV4KyspIHtcbiAgICAgIHRlc3QucHVzaCh7IGs6IGNociArIGluZGV4LCB2OiB2YWx1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB0ZXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGIudiAtIGEudjsgfSk7XG5cbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGVzdC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjaHIgPSB0ZXN0W2luZGV4XS5rLmNoYXJBdCgwKTtcbiAgICBpZiAocmVzdWx0LmNoYXJBdChyZXN1bHQubGVuZ3RoIC0gMSkgIT09IGNocikgcmVzdWx0ICs9IGNocjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgIT09ICdER0JFRkhBQ0lKSyc7XG59KTtcblxudmFyIEZPUkNFRCA9IEZBSUxTX09OX1VOREVGSU5FRCB8fCAhRkFJTFNfT05fTlVMTCB8fCAhU1RSSUNUX01FVEhPRCB8fCAhU1RBQkxFX1NPUlQ7XG5cbnZhciBnZXRTb3J0Q29tcGFyZSA9IGZ1bmN0aW9uIChjb21wYXJlZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgaWYgKHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgcmV0dXJuICtjb21wYXJlZm4oeCwgeSkgfHwgMDtcbiAgICByZXR1cm4gdG9TdHJpbmcoeCkgPiB0b1N0cmluZyh5KSA/IDEgOiAtMTtcbiAgfTtcbn07XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5zb3J0XG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgYUNhbGxhYmxlKGNvbXBhcmVmbik7XG5cbiAgICB2YXIgYXJyYXkgPSB0b09iamVjdCh0aGlzKTtcblxuICAgIGlmIChTVEFCTEVfU09SVCkgcmV0dXJuIGNvbXBhcmVmbiA9PT0gdW5kZWZpbmVkID8gbmF0aXZlU29ydChhcnJheSkgOiBuYXRpdmVTb3J0KGFycmF5LCBjb21wYXJlZm4pO1xuXG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdmFyIGFycmF5TGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UoYXJyYXkpO1xuICAgIHZhciBpdGVtc0xlbmd0aCwgaW5kZXg7XG5cbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBhcnJheUxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKGluZGV4IGluIGFycmF5KSBwdXNoKGl0ZW1zLCBhcnJheVtpbmRleF0pO1xuICAgIH1cblxuICAgIGludGVybmFsU29ydChpdGVtcywgZ2V0U29ydENvbXBhcmUoY29tcGFyZWZuKSk7XG5cbiAgICBpdGVtc0xlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKGl0ZW1zKTtcbiAgICBpbmRleCA9IDA7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBpdGVtc0xlbmd0aCkgYXJyYXlbaW5kZXhdID0gaXRlbXNbaW5kZXgrK107XG4gICAgd2hpbGUgKGluZGV4IDwgYXJyYXlMZW5ndGgpIGRlbGV0ZVByb3BlcnR5T3JUaHJvdyhhcnJheSwgaW5kZXgrKyk7XG5cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS51bnNjb3BhYmxlcy5mbGF0LW1hcC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIHRoaXMgbWV0aG9kIHdhcyBhZGRlZCB0byB1bnNjb3BhYmxlcyBhZnRlciBpbXBsZW1lbnRhdGlvblxuLy8gaW4gcG9wdWxhciBlbmdpbmVzLCBzbyBpdCdzIG1vdmVkIHRvIGEgc2VwYXJhdGUgbW9kdWxlXG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMuanNcIik7XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoJ2ZsYXRNYXAnKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkudW5zY29wYWJsZXMuZmxhdC1tYXAuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LndpdGguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgYXJyYXlXaXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXdpdGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS13aXRoLmpzXCIpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzXCIpO1xuXG52YXIgJEFycmF5ID0gQXJyYXk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUud2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS53aXRoXG4kKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSB9LCB7XG4gICd3aXRoJzogZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkge1xuICAgIHJldHVybiBhcnJheVdpdGgodG9JbmRleGVkT2JqZWN0KHRoaXMpLCAkQXJyYXksIGluZGV4LCB2YWx1ZSk7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS53aXRoLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBmdW5jdGlvbnMgYC5sZW5ndGhgICovXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dyYXAtZXJyb3ItY29uc3RydWN0b3Itd2l0aC1jYXVzZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dyYXAtZXJyb3ItY29uc3RydWN0b3Itd2l0aC1jYXVzZS5qc1wiKTtcblxudmFyIFdFQl9BU1NFTUJMWSA9ICdXZWJBc3NlbWJseSc7XG52YXIgV2ViQXNzZW1ibHkgPSBnbG9iYWxbV0VCX0FTU0VNQkxZXTtcblxudmFyIEZPUkNFRCA9IEVycm9yKCdlJywgeyBjYXVzZTogNyB9KS5jYXVzZSAhPT0gNztcblxudmFyIGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyID0gZnVuY3Rpb24gKEVSUk9SX05BTUUsIHdyYXBwZXIpIHtcbiAgdmFyIE8gPSB7fTtcbiAgT1tFUlJPUl9OQU1FXSA9IHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlKEVSUk9SX05BTUUsIHdyYXBwZXIsIEZPUkNFRCk7XG4gICQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBhcml0eTogMSwgZm9yY2VkOiBGT1JDRUQgfSwgTyk7XG59O1xuXG52YXIgZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlciA9IGZ1bmN0aW9uIChFUlJPUl9OQU1FLCB3cmFwcGVyKSB7XG4gIGlmIChXZWJBc3NlbWJseSAmJiBXZWJBc3NlbWJseVtFUlJPUl9OQU1FXSkge1xuICAgIHZhciBPID0ge307XG4gICAgT1tFUlJPUl9OQU1FXSA9IHdyYXBFcnJvckNvbnN0cnVjdG9yV2l0aENhdXNlKFdFQl9BU1NFTUJMWSArICcuJyArIEVSUk9SX05BTUUsIHdyYXBwZXIsIEZPUkNFRCk7XG4gICAgJCh7IHRhcmdldDogV0VCX0FTU0VNQkxZLCBzdGF0OiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgYXJpdHk6IDEsIGZvcmNlZDogRk9SQ0VEIH0sIE8pO1xuICB9XG59O1xuXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW5hdGl2ZWVycm9yXG5leHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcignRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ0V2YWxFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBFdmFsRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ1JhbmdlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gUmFuZ2VFcnJvcihtZXNzYWdlKSB7IHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpOyB9O1xufSk7XG5leHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcignUmVmZXJlbmNlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gUmVmZXJlbmNlRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoJ1N5bnRheEVycm9yJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFN5bnRheEVycm9yKG1lc3NhZ2UpIHsgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7IH07XG59KTtcbmV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCdUeXBlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVHlwZUVycm9yKG1lc3NhZ2UpIHsgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7IH07XG59KTtcbmV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCdVUklFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVUklFcnJvcihtZXNzYWdlKSB7IHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpOyB9O1xufSk7XG5leHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKCdDb21waWxlRXJyb3InLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gQ29tcGlsZUVycm9yKG1lc3NhZ2UpIHsgcmV0dXJuIGFwcGx5KGluaXQsIHRoaXMsIGFyZ3VtZW50cyk7IH07XG59KTtcbmV4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIoJ0xpbmtFcnJvcicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBMaW5rRXJyb3IobWVzc2FnZSkgeyByZXR1cm4gYXBwbHkoaW5pdCwgdGhpcywgYXJndW1lbnRzKTsgfTtcbn0pO1xuZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcignUnVudGltZUVycm9yJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFJ1bnRpbWVFcnJvcihtZXNzYWdlKSB7IHJldHVybiBhcHBseShpbml0LCB0aGlzLCBhcmd1bWVudHMpOyB9O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmVycm9yLmNhdXNlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5nbG9iYWwtdGhpcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xuXG4vLyBgZ2xvYmFsVGhpc2Agb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdsb2JhbHRoaXNcbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogZ2xvYmFsLmdsb2JhbFRoaXMgIT09IGdsb2JhbCB9LCB7XG4gIGdsb2JhbFRoaXM6IGdsb2JhbFxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmdsb2JhbC10aGlzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5qc29uLnN0cmluZ2lmeS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGlzU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qc1wiKTtcbnZhciBhcnJheVNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanNcIik7XG52YXIgZ2V0UmVwbGFjZXJGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtanNvbi1yZXBsYWNlci1mdW5jdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1qc29uLXJlcGxhY2VyLWZ1bmN0aW9uLmpzXCIpO1xudmFyIE5BVElWRV9TWU1CT0wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3ltYm9sLWNvbnN0cnVjdG9yLWRldGVjdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N5bWJvbC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanNcIik7XG5cbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyICRzdHJpbmdpZnkgPSBnZXRCdWlsdEluKCdKU09OJywgJ3N0cmluZ2lmeScpO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcygvLi8uZXhlYyk7XG52YXIgY2hhckF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckF0KTtcbnZhciBjaGFyQ29kZUF0ID0gdW5jdXJyeVRoaXMoJycuY2hhckNvZGVBdCk7XG52YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpO1xudmFyIG51bWJlclRvU3RyaW5nID0gdW5jdXJyeVRoaXMoMS4wLnRvU3RyaW5nKTtcblxudmFyIHRlc3RlciA9IC9bXFx1RDgwMC1cXHVERkZGXS9nO1xudmFyIGxvdyA9IC9eW1xcdUQ4MDAtXFx1REJGRl0kLztcbnZhciBoaSA9IC9eW1xcdURDMDAtXFx1REZGRl0kLztcblxudmFyIFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiA9ICFOQVRJVkVfU1lNQk9MIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN5bWJvbCA9IGdldEJ1aWx0SW4oJ1N5bWJvbCcpKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIHJldHVybiAkc3RyaW5naWZ5KFtzeW1ib2xdKSAhPSAnW251bGxdJ1xuICAgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAgIHx8ICRzdHJpbmdpZnkoeyBhOiBzeW1ib2wgfSkgIT0gJ3t9J1xuICAgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gICAgfHwgJHN0cmluZ2lmeShPYmplY3Qoc3ltYm9sKSkgIT0gJ3t9Jztcbn0pO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC13ZWxsLWZvcm1lZC1zdHJpbmdpZnlcbnZhciBJTExfRk9STUVEX1VOSUNPREUgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkc3RyaW5naWZ5KCdcXHVERjA2XFx1RDgzNCcpICE9PSAnXCJcXFxcdWRmMDZcXFxcdWQ4MzRcIidcbiAgICB8fCAkc3RyaW5naWZ5KCdcXHVERUFEJykgIT09ICdcIlxcXFx1ZGVhZFwiJztcbn0pO1xuXG52YXIgc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggPSBmdW5jdGlvbiAoaXQsIHJlcGxhY2VyKSB7XG4gIHZhciBhcmdzID0gYXJyYXlTbGljZShhcmd1bWVudHMpO1xuICB2YXIgJHJlcGxhY2VyID0gZ2V0UmVwbGFjZXJGdW5jdGlvbihyZXBsYWNlcik7XG4gIGlmICghaXNDYWxsYWJsZSgkcmVwbGFjZXIpICYmIChpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICBhcmdzWzFdID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAvLyBzb21lIG9sZCBpbXBsZW1lbnRhdGlvbnMgKGxpa2UgV2ViS2l0KSBjb3VsZCBwYXNzIG51bWJlcnMgYXMga2V5c1xuICAgIGlmIChpc0NhbGxhYmxlKCRyZXBsYWNlcikpIHZhbHVlID0gY2FsbCgkcmVwbGFjZXIsIHRoaXMsICRTdHJpbmcoa2V5KSwgdmFsdWUpO1xuICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIH07XG4gIHJldHVybiBhcHBseSgkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbn07XG5cbnZhciBmaXhJbGxGb3JtZWQgPSBmdW5jdGlvbiAobWF0Y2gsIG9mZnNldCwgc3RyaW5nKSB7XG4gIHZhciBwcmV2ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0IC0gMSk7XG4gIHZhciBuZXh0ID0gY2hhckF0KHN0cmluZywgb2Zmc2V0ICsgMSk7XG4gIGlmICgoZXhlYyhsb3csIG1hdGNoKSAmJiAhZXhlYyhoaSwgbmV4dCkpIHx8IChleGVjKGhpLCBtYXRjaCkgJiYgIWV4ZWMobG93LCBwcmV2KSkpIHtcbiAgICByZXR1cm4gJ1xcXFx1JyArIG51bWJlclRvU3RyaW5nKGNoYXJDb2RlQXQobWF0Y2gsIDApLCAxNik7XG4gIH0gcmV0dXJuIG1hdGNoO1xufTtcblxuaWYgKCRzdHJpbmdpZnkpIHtcbiAgLy8gYEpTT04uc3RyaW5naWZ5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnN0cmluZ2lmeVxuICAkKHsgdGFyZ2V0OiAnSlNPTicsIHN0YXQ6IHRydWUsIGFyaXR5OiAzLCBmb3JjZWQ6IFdST05HX1NZTUJPTFNfQ09OVkVSU0lPTiB8fCBJTExfRk9STUVEX1VOSUNPREUgfSwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gICAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgICAgdmFyIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cyk7XG4gICAgICB2YXIgcmVzdWx0ID0gYXBwbHkoV1JPTkdfU1lNQk9MU19DT05WRVJTSU9OID8gc3RyaW5naWZ5V2l0aFN5bWJvbHNGaXggOiAkc3RyaW5naWZ5LCBudWxsLCBhcmdzKTtcbiAgICAgIHJldHVybiBJTExfRk9STUVEX1VOSUNPREUgJiYgdHlwZW9mIHJlc3VsdCA9PSAnc3RyaW5nJyA/IHJlcGxhY2UocmVzdWx0LCB0ZXN0ZXIsIGZpeElsbEZvcm1lZCkgOiByZXN1bHQ7XG4gICAgfVxuICB9KTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hdGguaHlwb3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1tYXRoLWh5cG90IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG52YXIgJGh5cG90ID0gTWF0aC5oeXBvdDtcbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuXG4vLyBDaHJvbWUgNzcgYnVnXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05NTQ2XG52YXIgRk9SQ0VEID0gISEkaHlwb3QgJiYgJGh5cG90KEluZmluaXR5LCBOYU4pICE9PSBJbmZpbml0eTtcblxuLy8gYE1hdGguaHlwb3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tYXRoLmh5cG90XG4kKHsgdGFyZ2V0OiAnTWF0aCcsIHN0YXQ6IHRydWUsIGFyaXR5OiAyLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycyAtLSByZXF1aXJlZCBmb3IgYC5sZW5ndGhgXG4gIGh5cG90OiBmdW5jdGlvbiBoeXBvdCh2YWx1ZTEsIHZhbHVlMikge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGxhcmcgPSAwO1xuICAgIHZhciBhcmcsIGRpdjtcbiAgICB3aGlsZSAoaSA8IGFMZW4pIHtcbiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7XG4gICAgICBpZiAobGFyZyA8IGFyZykge1xuICAgICAgICBkaXYgPSBsYXJnIC8gYXJnO1xuICAgICAgICBzdW0gPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmIChhcmcgPiAwKSB7XG4gICAgICAgIGRpdiA9IGFyZyAvIGxhcmc7XG4gICAgICAgIHN1bSArPSBkaXYgKiBkaXY7XG4gICAgICB9IGVsc2Ugc3VtICs9IGFyZztcbiAgICB9XG4gICAgcmV0dXJuIGxhcmcgPT09IEluZmluaXR5ID8gSW5maW5pdHkgOiBsYXJnICogc3FydChzdW0pO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC5oeXBvdC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnRvLWZpeGVkLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRoaXNOdW1iZXJWYWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90aGlzLW51bWJlci12YWx1ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RoaXMtbnVtYmVyLXZhbHVlLmpzXCIpO1xudmFyICRyZXBlYXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXJlcGVhdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy1yZXBlYXQuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxudmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjtcbnZhciAkU3RyaW5nID0gU3RyaW5nO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciByZXBlYXQgPSB1bmN1cnJ5VGhpcygkcmVwZWF0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciBuYXRpdmVUb0ZpeGVkID0gdW5jdXJyeVRoaXMoMS4wLnRvRml4ZWQpO1xuXG52YXIgcG93ID0gZnVuY3Rpb24gKHgsIG4sIGFjYykge1xuICByZXR1cm4gbiA9PT0gMCA/IGFjYyA6IG4gJSAyID09PSAxID8gcG93KHgsIG4gLSAxLCBhY2MgKiB4KSA6IHBvdyh4ICogeCwgbiAvIDIsIGFjYyk7XG59O1xuXG52YXIgbG9nID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIG4gPSAwO1xuICB2YXIgeDIgPSB4O1xuICB3aGlsZSAoeDIgPj0gNDA5Nikge1xuICAgIG4gKz0gMTI7XG4gICAgeDIgLz0gNDA5NjtcbiAgfVxuICB3aGlsZSAoeDIgPj0gMikge1xuICAgIG4gKz0gMTtcbiAgICB4MiAvPSAyO1xuICB9IHJldHVybiBuO1xufTtcblxudmFyIG11bHRpcGx5ID0gZnVuY3Rpb24gKGRhdGEsIG4sIGMpIHtcbiAgdmFyIGluZGV4ID0gLTE7XG4gIHZhciBjMiA9IGM7XG4gIHdoaWxlICgrK2luZGV4IDwgNikge1xuICAgIGMyICs9IG4gKiBkYXRhW2luZGV4XTtcbiAgICBkYXRhW2luZGV4XSA9IGMyICUgMWU3O1xuICAgIGMyID0gZmxvb3IoYzIgLyAxZTcpO1xuICB9XG59O1xuXG52YXIgZGl2aWRlID0gZnVuY3Rpb24gKGRhdGEsIG4pIHtcbiAgdmFyIGluZGV4ID0gNjtcbiAgdmFyIGMgPSAwO1xuICB3aGlsZSAoLS1pbmRleCA+PSAwKSB7XG4gICAgYyArPSBkYXRhW2luZGV4XTtcbiAgICBkYXRhW2luZGV4XSA9IGZsb29yKGMgLyBuKTtcbiAgICBjID0gKGMgJSBuKSAqIDFlNztcbiAgfVxufTtcblxudmFyIGRhdGFUb1N0cmluZyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIHZhciBpbmRleCA9IDY7XG4gIHZhciBzID0gJyc7XG4gIHdoaWxlICgtLWluZGV4ID49IDApIHtcbiAgICBpZiAocyAhPT0gJycgfHwgaW5kZXggPT09IDAgfHwgZGF0YVtpbmRleF0gIT09IDApIHtcbiAgICAgIHZhciB0ID0gJFN0cmluZyhkYXRhW2luZGV4XSk7XG4gICAgICBzID0gcyA9PT0gJycgPyB0IDogcyArIHJlcGVhdCgnMCcsIDcgLSB0Lmxlbmd0aCkgKyB0O1xuICAgIH1cbiAgfSByZXR1cm4gcztcbn07XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuYXRpdmVUb0ZpeGVkKDAuMDAwMDgsIDMpICE9PSAnMC4wMDAnIHx8XG4gICAgbmF0aXZlVG9GaXhlZCgwLjksIDApICE9PSAnMScgfHxcbiAgICBuYXRpdmVUb0ZpeGVkKDEuMjU1LCAyKSAhPT0gJzEuMjUnIHx8XG4gICAgbmF0aXZlVG9GaXhlZCgxMDAwMDAwMDAwMDAwMDAwMTI4LjAsIDApICE9PSAnMTAwMDAwMDAwMDAwMDAwMDEyOCc7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICBuYXRpdmVUb0ZpeGVkKHt9KTtcbn0pO1xuXG4vLyBgTnVtYmVyLnByb3RvdHlwZS50b0ZpeGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLnByb3RvdHlwZS50b2ZpeGVkXG4kKHsgdGFyZ2V0OiAnTnVtYmVyJywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgdG9GaXhlZDogZnVuY3Rpb24gdG9GaXhlZChmcmFjdGlvbkRpZ2l0cykge1xuICAgIHZhciBudW1iZXIgPSB0aGlzTnVtYmVyVmFsdWUodGhpcyk7XG4gICAgdmFyIGZyYWN0RGlnaXRzID0gdG9JbnRlZ2VyT3JJbmZpbml0eShmcmFjdGlvbkRpZ2l0cyk7XG4gICAgdmFyIGRhdGEgPSBbMCwgMCwgMCwgMCwgMCwgMF07XG4gICAgdmFyIHNpZ24gPSAnJztcbiAgICB2YXIgcmVzdWx0ID0gJzAnO1xuICAgIHZhciBlLCB6LCBqLCBrO1xuXG4gICAgLy8gVE9ETzogRVMyMDE4IGluY3JlYXNlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhY3Rpb24gZGlnaXRzIHRvIDEwMCwgbmVlZCB0byBpbXByb3ZlIHRoZSBpbXBsZW1lbnRhdGlvblxuICAgIGlmIChmcmFjdERpZ2l0cyA8IDAgfHwgZnJhY3REaWdpdHMgPiAyMCkgdGhyb3cgJFJhbmdlRXJyb3IoJ0luY29ycmVjdCBmcmFjdGlvbiBkaWdpdHMnKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmIChudW1iZXIgIT0gbnVtYmVyKSByZXR1cm4gJ05hTic7XG4gICAgaWYgKG51bWJlciA8PSAtMWUyMSB8fCBudW1iZXIgPj0gMWUyMSkgcmV0dXJuICRTdHJpbmcobnVtYmVyKTtcbiAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgc2lnbiA9ICctJztcbiAgICAgIG51bWJlciA9IC1udW1iZXI7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPiAxZS0yMSkge1xuICAgICAgZSA9IGxvZyhudW1iZXIgKiBwb3coMiwgNjksIDEpKSAtIDY5O1xuICAgICAgeiA9IGUgPCAwID8gbnVtYmVyICogcG93KDIsIC1lLCAxKSA6IG51bWJlciAvIHBvdygyLCBlLCAxKTtcbiAgICAgIHogKj0gMHgxMDAwMDAwMDAwMDAwMDtcbiAgICAgIGUgPSA1MiAtIGU7XG4gICAgICBpZiAoZSA+IDApIHtcbiAgICAgICAgbXVsdGlwbHkoZGF0YSwgMCwgeik7XG4gICAgICAgIGogPSBmcmFjdERpZ2l0cztcbiAgICAgICAgd2hpbGUgKGogPj0gNykge1xuICAgICAgICAgIG11bHRpcGx5KGRhdGEsIDFlNywgMCk7XG4gICAgICAgICAgaiAtPSA3O1xuICAgICAgICB9XG4gICAgICAgIG11bHRpcGx5KGRhdGEsIHBvdygxMCwgaiwgMSksIDApO1xuICAgICAgICBqID0gZSAtIDE7XG4gICAgICAgIHdoaWxlIChqID49IDIzKSB7XG4gICAgICAgICAgZGl2aWRlKGRhdGEsIDEgPDwgMjMpO1xuICAgICAgICAgIGogLT0gMjM7XG4gICAgICAgIH1cbiAgICAgICAgZGl2aWRlKGRhdGEsIDEgPDwgaik7XG4gICAgICAgIG11bHRpcGx5KGRhdGEsIDEsIDEpO1xuICAgICAgICBkaXZpZGUoZGF0YSwgMik7XG4gICAgICAgIHJlc3VsdCA9IGRhdGFUb1N0cmluZyhkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11bHRpcGx5KGRhdGEsIDAsIHopO1xuICAgICAgICBtdWx0aXBseShkYXRhLCAxIDw8IC1lLCAwKTtcbiAgICAgICAgcmVzdWx0ID0gZGF0YVRvU3RyaW5nKGRhdGEpICsgcmVwZWF0KCcwJywgZnJhY3REaWdpdHMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhY3REaWdpdHMgPiAwKSB7XG4gICAgICBrID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgIHJlc3VsdCA9IHNpZ24gKyAoayA8PSBmcmFjdERpZ2l0c1xuICAgICAgICA/ICcwLicgKyByZXBlYXQoJzAnLCBmcmFjdERpZ2l0cyAtIGspICsgcmVzdWx0XG4gICAgICAgIDogc3RyaW5nU2xpY2UocmVzdWx0LCAwLCBrIC0gZnJhY3REaWdpdHMpICsgJy4nICsgc3RyaW5nU2xpY2UocmVzdWx0LCBrIC0gZnJhY3REaWdpdHMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2lnbiArIHJlc3VsdDtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIudG8tZml4ZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzXCIpO1xuXG4vLyBgT2JqZWN0LmFzc2lnbmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtYXNzaWduIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4kKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgYXJpdHk6IDIsIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduIH0sIHtcbiAgYXNzaWduOiBhc3NpZ25cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuaGFzLW93bi5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG5cbi8vIGBPYmplY3QuaGFzT3duYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0Lmhhc293blxuJCh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBoYXNPd246IGhhc093blxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5oYXMtb3duLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wYXJzZS1mbG9hdC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkcGFyc2VGbG9hdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9udW1iZXItcGFyc2UtZmxvYXQuanNcIik7XG5cbi8vIGBwYXJzZUZsb2F0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcGFyc2VmbG9hdC1zdHJpbmdcbiQoeyBnbG9iYWw6IHRydWUsIGZvcmNlZDogcGFyc2VGbG9hdCAhPSAkcGFyc2VGbG9hdCB9LCB7XG4gIHBhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucGFyc2UtZmxvYXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnBhcnNlLWludC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkcGFyc2VJbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbnVtYmVyLXBhcnNlLWludCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL251bWJlci1wYXJzZS1pbnQuanNcIik7XG5cbi8vIGBwYXJzZUludGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXBhcnNlaW50LXN0cmluZy1yYWRpeFxuJCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBwYXJzZUludCAhPSAkcGFyc2VJbnQgfSwge1xuICBwYXJzZUludDogJHBhcnNlSW50XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucGFyc2UtaW50LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzXCIpO1xudmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanNcIik7XG52YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qc1wiKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uLmpzXCIpO1xuXG4vLyBgUHJvbWlzZS5hbGxTZXR0bGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxzZXR0bGVkXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICBhbGxTZXR0bGVkOiBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUNhbGxhYmxlKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIGNhbGwocHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0geyBzdGF0dXM6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVycm9yIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC1zZXR0bGVkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qc1wiKTtcbnZhciBwZXJmb3JtID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3BlcmZvcm0gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wZXJmb3JtLmpzXCIpO1xudmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0ZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanNcIik7XG52YXIgUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1zdGF0aWNzLWluY29ycmVjdC1pdGVyYXRpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbi5qc1wiKTtcblxuLy8gYFByb21pc2UuYWxsYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5hbGxcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBpdGVyYXRlKGl0ZXJhYmxlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBjb3VudGVyKys7XG4gICAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBjYWxsKCRwcm9taXNlUmVzb2x2ZSwgQywgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSByZWplY3QocmVzdWx0LnZhbHVlKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5hbGwuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuY2F0Y2guanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanNcIik7XG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jYWxsYWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNhbGxhYmxlLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5jYXRjaFxuJCh7IHRhcmdldDogJ1Byb21pc2UnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiwgcmVhbDogdHJ1ZSB9LCB7XG4gICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjY2F0Y2hgIHByb3Blcmx5IHdvcmtzIHdpdGggcGF0Y2hlZCBgUHJvbWlzZSN0aGVuYFxuaWYgKCFJU19QVVJFICYmIGlzQ2FsbGFibGUoTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yKSkge1xuICB2YXIgbWV0aG9kID0gZ2V0QnVpbHRJbignUHJvbWlzZScpLnByb3RvdHlwZVsnY2F0Y2gnXTtcbiAgaWYgKE5hdGl2ZVByb21pc2VQcm90b3R5cGVbJ2NhdGNoJ10gIT09IG1ldGhvZCkge1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2NhdGNoJywgbWV0aG9kLCB7IHVuc2FmZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNhdGNoLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcHVyZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanNcIik7XG52YXIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtbm9kZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1ub2RlLmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcuanNcIik7XG52YXIgc2V0U3BlY2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtc3BlY2llcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzXCIpO1xudmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgdGFzayA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdGFzayAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanNcIikuc2V0KTtcbnZhciBtaWNyb3Rhc2sgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWljcm90YXNrICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzXCIpO1xudmFyIGhvc3RSZXBvcnRFcnJvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaG9zdC1yZXBvcnQtZXJyb3JzLmpzXCIpO1xudmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanNcIik7XG52YXIgUXVldWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcXVldWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9xdWV1ZS5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtbmF0aXZlLWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IuanNcIik7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb21pc2UtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24uanNcIik7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanNcIik7XG5cbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SID0gUHJvbWlzZUNvbnN0cnVjdG9yRGV0ZWN0aW9uLkNPTlNUUlVDVE9SO1xudmFyIE5BVElWRV9QUk9NSVNFX1JFSkVDVElPTl9FVkVOVCA9IFByb21pc2VDb25zdHJ1Y3RvckRldGVjdGlvbi5SRUpFQ1RJT05fRVZFTlQ7XG52YXIgTkFUSVZFX1BST01JU0VfU1VCQ0xBU1NJTkcgPSBQcm9taXNlQ29uc3RydWN0b3JEZXRlY3Rpb24uU1VCQ0xBU1NJTkc7XG52YXIgZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihQUk9NSVNFKTtcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcjtcbnZhciBQcm9taXNlUHJvdG90eXBlID0gTmF0aXZlUHJvbWlzZVByb3RvdHlwZTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG5cbnZhciBESVNQQVRDSF9FVkVOVCA9ICEhKGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICYmIGdsb2JhbC5kaXNwYXRjaEV2ZW50KTtcbnZhciBVTkhBTkRMRURfUkVKRUNUSU9OID0gJ3VuaGFuZGxlZHJlamVjdGlvbic7XG52YXIgUkVKRUNUSU9OX0hBTkRMRUQgPSAncmVqZWN0aW9uaGFuZGxlZCc7XG52YXIgUEVORElORyA9IDA7XG52YXIgRlVMRklMTEVEID0gMTtcbnZhciBSRUpFQ1RFRCA9IDI7XG52YXIgSEFORExFRCA9IDE7XG52YXIgVU5IQU5ETEVEID0gMjtcblxudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXIsIG5hdGl2ZVRoZW47XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIGlzQ2FsbGFibGUodGhlbiA9IGl0LnRoZW4pID8gdGhlbiA6IGZhbHNlO1xufTtcblxudmFyIGNhbGxSZWFjdGlvbiA9IGZ1bmN0aW9uIChyZWFjdGlvbiwgc3RhdGUpIHtcbiAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gIHZhciBvayA9IHN0YXRlLnN0YXRlID09IEZVTEZJTExFRDtcbiAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gIHRyeSB7XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgIGlmICghb2spIHtcbiAgICAgICAgaWYgKHN0YXRlLnJlamVjdGlvbiA9PT0gVU5IQU5ETEVEKSBvbkhhbmRsZVVuaGFuZGxlZChzdGF0ZSk7XG4gICAgICAgIHN0YXRlLnJlamVjdGlvbiA9IEhBTkRMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBjYW4gdGhyb3dcbiAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgIGNhbGwodGhlbiwgcmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgfVxufTtcblxudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChzdGF0ZSwgaXNSZWplY3QpIHtcbiAgaWYgKHN0YXRlLm5vdGlmaWVkKSByZXR1cm47XG4gIHN0YXRlLm5vdGlmaWVkID0gdHJ1ZTtcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVhY3Rpb25zID0gc3RhdGUucmVhY3Rpb25zO1xuICAgIHZhciByZWFjdGlvbjtcbiAgICB3aGlsZSAocmVhY3Rpb24gPSByZWFjdGlvbnMuZ2V0KCkpIHtcbiAgICAgIGNhbGxSZWFjdGlvbihyZWFjdGlvbiwgc3RhdGUpO1xuICAgIH1cbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKCFOQVRJVkVfUFJPTUlTRV9SRUpFQ1RJT05fRVZFTlQgJiYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSkgaGFuZGxlcihldmVudCk7XG4gIGVsc2UgaWYgKG5hbWUgPT09IFVOSEFORExFRF9SRUpFQ1RJT04pIGhvc3RSZXBvcnRFcnJvcnMoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHJlYXNvbik7XG59O1xuXG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY2FsbCh0YXNrLCBnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IHN0YXRlLmZhY2FkZTtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpO1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKElTX1VOSEFORExFRCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChJU19OT0RFKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sIHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5yZWplY3Rpb24gIT09IEhBTkRMRUQgJiYgIXN0YXRlLnBhcmVudDtcbn07XG5cbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjYWxsKHRhc2ssIGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gc3RhdGUuZmFjYWRlO1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAoc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkoc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlLmZhY2FkZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGwodGhlbiwgdmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdCh3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUikge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlUHJvdG90eXBlKTtcbiAgICBhQ2FsbGFibGUoZXhlY3V0b3IpO1xuICAgIGNhbGwoSW50ZXJuYWwsIHRoaXMpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBQcm9taXNlUHJvdG90eXBlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMgLS0gcmVxdWlyZWQgZm9yIGAubGVuZ3RoYFxuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IG5ldyBRdWV1ZSgpLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gIEludGVybmFsLnByb3RvdHlwZSA9IGRlZmluZUJ1aWx0SW4oUHJvbWlzZVByb3RvdHlwZSwgJ3RoZW4nLCBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpO1xuICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgcmVhY3Rpb24ub2sgPSBpc0NhbGxhYmxlKG9uRnVsZmlsbGVkKSA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICByZWFjdGlvbi5mYWlsID0gaXNDYWxsYWJsZShvblJlamVjdGVkKSAmJiBvblJlamVjdGVkO1xuICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdGUuc3RhdGUgPT0gUEVORElORykgc3RhdGUucmVhY3Rpb25zLmFkZChyZWFjdGlvbik7XG4gICAgZWxzZSBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbFJlYWN0aW9uKHJlYWN0aW9uLCBzdGF0ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gIH0pO1xuXG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgc3RhdGUpO1xuICB9O1xuXG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xuXG4gIGlmICghSVNfUFVSRSAmJiBpc0NhbGxhYmxlKE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcikgJiYgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIG5hdGl2ZVRoZW4gPSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLnRoZW47XG5cbiAgICBpZiAoIU5BVElWRV9QUk9NSVNFX1NVQkNMQVNTSU5HKSB7XG4gICAgICAvLyBtYWtlIGBQcm9taXNlI3RoZW5gIHJldHVybiBhIHBvbHlmaWxsZWQgYFByb21pc2VgIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgICBkZWZpbmVCdWlsdEluKE5hdGl2ZVByb21pc2VQcm90b3R5cGUsICd0aGVuJywgZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUNvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBjYWxsKG5hdGl2ZVRoZW4sIHRoYXQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzY0MFxuICAgICAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBgLmNvbnN0cnVjdG9yID09PSBQcm9taXNlYCB3b3JrIGZvciBuYXRpdmUgcHJvbWlzZS1iYXNlZCBBUElzXG4gICAgdHJ5IHtcbiAgICAgIGRlbGV0ZSBOYXRpdmVQcm9taXNlUHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxuICAgIC8vIG1ha2UgYGluc3RhbmNlb2YgUHJvbWlzZWAgd29yayBmb3IgbmF0aXZlIHByb21pc2UtYmFzZWQgQVBJc1xuICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgc2V0UHJvdG90eXBlT2YoTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgUHJvbWlzZVByb3RvdHlwZSk7XG4gICAgfVxuICB9XG59XG5cbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgUHJvbWlzZTogUHJvbWlzZUNvbnN0cnVjdG9yXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7XG5zZXRTcGVjaWVzKFBST01JU0UpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmZpbmFsbHkuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xuXG52YXIgTmF0aXZlUHJvbWlzZVByb3RvdHlwZSA9IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciAmJiBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG4vLyBTYWZhcmkgYnVnIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDA4MjlcbnZhciBOT05fR0VORVJJQyA9ICEhTmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdGhlbmFibGUgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgTmF0aXZlUHJvbWlzZVByb3RvdHlwZVsnZmluYWxseSddLmNhbGwoeyB0aGVuOiBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0gfSwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogTk9OX0dFTkVSSUMgfSwge1xuICAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBnZXRCdWlsdEluKCdQcm9taXNlJykpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gaXNDYWxsYWJsZShvbkZpbmFsbHkpO1xuICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgICAgfSA6IG9uRmluYWxseSxcbiAgICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHlcbiAgICApO1xuICB9XG59KTtcblxuLy8gbWFrZXMgc3VyZSB0aGF0IG5hdGl2ZSBwcm9taXNlLWJhc2VkIEFQSXMgYFByb21pc2UjZmluYWxseWAgcHJvcGVybHkgd29ya3Mgd2l0aCBwYXRjaGVkIGBQcm9taXNlI3RoZW5gXG5pZiAoIUlTX1BVUkUgJiYgaXNDYWxsYWJsZShOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IpKSB7XG4gIHZhciBtZXRob2QgPSBnZXRCdWlsdEluKCdQcm9taXNlJykucHJvdG90eXBlWydmaW5hbGx5J107XG4gIGlmIChOYXRpdmVQcm9taXNlUHJvdG90eXBlWydmaW5hbGx5J10gIT09IG1ldGhvZCkge1xuICAgIGRlZmluZUJ1aWx0SW4oTmF0aXZlUHJvbWlzZVByb3RvdHlwZSwgJ2ZpbmFsbHknLCBtZXRob2QsIHsgdW5zYWZlOiB0cnVlIH0pO1xuICB9XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3Mgc3BsaXQgdG8gbW9kdWxlcyBsaXN0ZWQgYmVsb3dcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNvbnN0cnVjdG9yLmpzXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlLmFsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmFsbC5qc1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5jYXRjaCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLmNhdGNoLmpzXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJhY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlLmpzXCIpO1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5wcm9taXNlLnJlamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLnJlamVjdC5qc1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmVzb2x2ZS5qc1wiKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yYWNlLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzXCIpO1xudmFyIHBlcmZvcm0gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcGVyZm9ybSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BlcmZvcm0uanNcIik7XG52YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pdGVyYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0ZS5qc1wiKTtcbnZhciBQUk9NSVNFX1NUQVRJQ1NfSU5DT1JSRUNUX0lURVJBVElPTiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9wcm9taXNlLXN0YXRpY3MtaW5jb3JyZWN0LWl0ZXJhdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Byb21pc2Utc3RhdGljcy1pbmNvcnJlY3QtaXRlcmF0aW9uLmpzXCIpO1xuXG4vLyBgUHJvbWlzZS5yYWNlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvbWlzZS5yYWNlXG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogUFJPTUlTRV9TVEFUSUNTX0lOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICRwcm9taXNlUmVzb2x2ZSA9IGFDYWxsYWJsZShDLnJlc29sdmUpO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgY2FsbCgkcHJvbWlzZVJlc29sdmUsIEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmFjZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yZWplY3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG5cbi8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHN0YXQ6IHRydWUsIGZvcmNlZDogRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1IgfSwge1xuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKHRoaXMpO1xuICAgIGNhbGwoY2FwYWJpbGl0eS5yZWplY3QsIHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UucmVqZWN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLnJlc29sdmUuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcbnZhciBOYXRpdmVQcm9taXNlQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1uYXRpdmUtY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLW5hdGl2ZS1jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBGT1JDRURfUFJPTUlTRV9DT05TVFJVQ1RPUiA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKS5DT05TVFJVQ1RPUik7XG52YXIgcHJvbWlzZVJlc29sdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlLmpzXCIpO1xuXG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA9IGdldEJ1aWx0SW4oJ1Byb21pc2UnKTtcbnZhciBDSEVDS19XUkFQUEVSID0gSVNfUFVSRSAmJiAhRk9SQ0VEX1BST01JU0VfQ09OU1RSVUNUT1I7XG5cbi8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRF9QUk9NSVNFX0NPTlNUUlVDVE9SIH0sIHtcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKENIRUNLX1dSQVBQRVIgJiYgdGhpcyA9PT0gUHJvbWlzZUNvbnN0cnVjdG9yV3JhcHBlciA/IE5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciA6IHRoaXMsIHgpO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5yZXNvbHZlLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnRvLXN0cmluZy10YWcuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xuXG4kKHsgZ2xvYmFsOiB0cnVlIH0sIHsgUmVmbGVjdDoge30gfSk7XG5cbi8vIFJlZmxlY3RbQEB0b1N0cmluZ1RhZ10gcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVmbGVjdC1AQHRvc3RyaW5ndGFnXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWwuUmVmbGVjdCwgJ1JlZmxlY3QnLCB0cnVlKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC50by1zdHJpbmctdGFnLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBpc0ZvcmNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1mb3JjZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanNcIik7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzXCIpLmYpO1xudmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWlzLXByb3RvdHlwZS1vZiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YuanNcIik7XG52YXIgaXNSZWdFeHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtcmVnZXhwICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWdldC1mbGFncy5qc1wiKTtcbnZhciBzdGlja3lIZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1zdGlja3ktaGVscGVycy5qc1wiKTtcbnZhciBwcm94eUFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3Byb3h5LWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcHJveHktYWNjZXNzb3IuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgZW5mb3JjZUludGVybmFsU3RhdGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIikuZW5mb3JjZSk7XG52YXIgc2V0U3BlY2llcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtc3BlY2llcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzXCIpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sLmpzXCIpO1xudmFyIFVOU1VQUE9SVEVEX0RPVF9BTEwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLWRvdC1hbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtZG90LWFsbC5qc1wiKTtcbnZhciBVTlNVUFBPUlRFRF9OQ0cgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLXVuc3VwcG9ydGVkLW5jZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1uY2cuanNcIik7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcbnZhciBOYXRpdmVSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IE5hdGl2ZVJlZ0V4cC5wcm90b3R5cGU7XG52YXIgU3ludGF4RXJyb3IgPSBnbG9iYWwuU3ludGF4RXJyb3I7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKFJlZ0V4cFByb3RvdHlwZS5leGVjKTtcbnZhciBjaGFyQXQgPSB1bmN1cnJ5VGhpcygnJy5jaGFyQXQpO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBzdHJpbmdJbmRleE9mID0gdW5jdXJyeVRoaXMoJycuaW5kZXhPZik7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG4vLyBUT0RPOiBVc2Ugb25seSBwcm9wZXIgUmVnRXhwSWRlbnRpZmllck5hbWVcbnZhciBJU19OQ0cgPSAvXlxcPzxbXlxcc1xcZCEjJSYqKzw9PkBeXVteXFxzISMlJiorPD0+QF5dKj4vO1xudmFyIHJlMSA9IC9hL2c7XG52YXIgcmUyID0gL2EvZztcblxuLy8gXCJuZXdcIiBzaG91bGQgY3JlYXRlIGEgbmV3IG9iamVjdCwgb2xkIHdlYmtpdCBidWdcbnZhciBDT1JSRUNUX05FVyA9IG5ldyBOYXRpdmVSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG52YXIgTUlTU0VEX1NUSUNLWSA9IHN0aWNreUhlbHBlcnMuTUlTU0VEX1NUSUNLWTtcbnZhciBVTlNVUFBPUlRFRF9ZID0gc3RpY2t5SGVscGVycy5VTlNVUFBPUlRFRF9ZO1xuXG52YXIgQkFTRV9GT1JDRUQgPSBERVNDUklQVE9SUyAmJlxuICAoIUNPUlJFQ1RfTkVXIHx8IE1JU1NFRF9TVElDS1kgfHwgVU5TVVBQT1JURURfRE9UX0FMTCB8fCBVTlNVUFBPUlRFRF9OQ0cgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJlMltNQVRDSF0gPSBmYWxzZTtcbiAgICAvLyBSZWdFeHAgY29uc3RydWN0b3IgY2FuIGFsdGVyIGZsYWdzIGFuZCBJc1JlZ0V4cCB3b3JrcyBjb3JyZWN0IHdpdGggQEBtYXRjaFxuICAgIHJldHVybiBOYXRpdmVSZWdFeHAocmUxKSAhPSByZTEgfHwgTmF0aXZlUmVnRXhwKHJlMikgPT0gcmUyIHx8IE5hdGl2ZVJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xuICB9KSk7XG5cbnZhciBoYW5kbGVEb3RBbGwgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBicmFja2V0cyA9IGZhbHNlO1xuICB2YXIgY2hyO1xuICBmb3IgKDsgaW5kZXggPD0gbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY2hyID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICAgIGlmIChjaHIgPT09ICdcXFxcJykge1xuICAgICAgcmVzdWx0ICs9IGNociArIGNoYXJBdChzdHJpbmcsICsraW5kZXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghYnJhY2tldHMgJiYgY2hyID09PSAnLicpIHtcbiAgICAgIHJlc3VsdCArPSAnW1xcXFxzXFxcXFNdJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNociA9PT0gJ1snKSB7XG4gICAgICAgIGJyYWNrZXRzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAnXScpIHtcbiAgICAgICAgYnJhY2tldHMgPSBmYWxzZTtcbiAgICAgIH0gcmVzdWx0ICs9IGNocjtcbiAgICB9XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciBoYW5kbGVOQ0cgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIHZhciBuYW1lZCA9IFtdO1xuICB2YXIgbmFtZXMgPSB7fTtcbiAgdmFyIGJyYWNrZXRzID0gZmFsc2U7XG4gIHZhciBuY2cgPSBmYWxzZTtcbiAgdmFyIGdyb3VwaWQgPSAwO1xuICB2YXIgZ3JvdXBuYW1lID0gJyc7XG4gIHZhciBjaHI7XG4gIGZvciAoOyBpbmRleCA8PSBsZW5ndGg7IGluZGV4KyspIHtcbiAgICBjaHIgPSBjaGFyQXQoc3RyaW5nLCBpbmRleCk7XG4gICAgaWYgKGNociA9PT0gJ1xcXFwnKSB7XG4gICAgICBjaHIgPSBjaHIgKyBjaGFyQXQoc3RyaW5nLCArK2luZGV4KTtcbiAgICB9IGVsc2UgaWYgKGNociA9PT0gJ10nKSB7XG4gICAgICBicmFja2V0cyA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIWJyYWNrZXRzKSBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgY2hyID09PSAnWyc6XG4gICAgICAgIGJyYWNrZXRzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGNociA9PT0gJygnOlxuICAgICAgICBpZiAoZXhlYyhJU19OQ0csIHN0cmluZ1NsaWNlKHN0cmluZywgaW5kZXggKyAxKSkpIHtcbiAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgIG5jZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9IGNocjtcbiAgICAgICAgZ3JvdXBpZCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIGNhc2UgY2hyID09PSAnPicgJiYgbmNnOlxuICAgICAgICBpZiAoZ3JvdXBuYW1lID09PSAnJyB8fCBoYXNPd24obmFtZXMsIGdyb3VwbmFtZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0ludmFsaWQgY2FwdHVyZSBncm91cCBuYW1lJyk7XG4gICAgICAgIH1cbiAgICAgICAgbmFtZXNbZ3JvdXBuYW1lXSA9IHRydWU7XG4gICAgICAgIG5hbWVkW25hbWVkLmxlbmd0aF0gPSBbZ3JvdXBuYW1lLCBncm91cGlkXTtcbiAgICAgICAgbmNnID0gZmFsc2U7XG4gICAgICAgIGdyb3VwbmFtZSA9ICcnO1xuICAgICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKG5jZykgZ3JvdXBuYW1lICs9IGNocjtcbiAgICBlbHNlIHJlc3VsdCArPSBjaHI7XG4gIH0gcmV0dXJuIFtyZXN1bHQsIG5hbWVkXTtcbn07XG5cbi8vIGBSZWdFeHBgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC1jb25zdHJ1Y3RvclxuaWYgKGlzRm9yY2VkKCdSZWdFeHAnLCBCQVNFX0ZPUkNFRCkpIHtcbiAgdmFyIFJlZ0V4cFdyYXBwZXIgPSBmdW5jdGlvbiBSZWdFeHAocGF0dGVybiwgZmxhZ3MpIHtcbiAgICB2YXIgdGhpc0lzUmVnRXhwID0gaXNQcm90b3R5cGVPZihSZWdFeHBQcm90b3R5cGUsIHRoaXMpO1xuICAgIHZhciBwYXR0ZXJuSXNSZWdFeHAgPSBpc1JlZ0V4cChwYXR0ZXJuKTtcbiAgICB2YXIgZmxhZ3NBcmVVbmRlZmluZWQgPSBmbGFncyA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBncm91cHMgPSBbXTtcbiAgICB2YXIgcmF3UGF0dGVybiA9IHBhdHRlcm47XG4gICAgdmFyIHJhd0ZsYWdzLCBkb3RBbGwsIHN0aWNreSwgaGFuZGxlZCwgcmVzdWx0LCBzdGF0ZTtcblxuICAgIGlmICghdGhpc0lzUmVnRXhwICYmIHBhdHRlcm5Jc1JlZ0V4cCAmJiBmbGFnc0FyZVVuZGVmaW5lZCAmJiBwYXR0ZXJuLmNvbnN0cnVjdG9yID09PSBSZWdFeHBXcmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGF0dGVybjtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVybklzUmVnRXhwIHx8IGlzUHJvdG90eXBlT2YoUmVnRXhwUHJvdG90eXBlLCBwYXR0ZXJuKSkge1xuICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc291cmNlO1xuICAgICAgaWYgKGZsYWdzQXJlVW5kZWZpbmVkKSBmbGFncyA9IGdldFJlZ0V4cEZsYWdzKHJhd1BhdHRlcm4pO1xuICAgIH1cblxuICAgIHBhdHRlcm4gPSBwYXR0ZXJuID09PSB1bmRlZmluZWQgPyAnJyA6IHRvU3RyaW5nKHBhdHRlcm4pO1xuICAgIGZsYWdzID0gZmxhZ3MgPT09IHVuZGVmaW5lZCA/ICcnIDogdG9TdHJpbmcoZmxhZ3MpO1xuICAgIHJhd1BhdHRlcm4gPSBwYXR0ZXJuO1xuXG4gICAgaWYgKFVOU1VQUE9SVEVEX0RPVF9BTEwgJiYgJ2RvdEFsbCcgaW4gcmUxKSB7XG4gICAgICBkb3RBbGwgPSAhIWZsYWdzICYmIHN0cmluZ0luZGV4T2YoZmxhZ3MsICdzJykgPiAtMTtcbiAgICAgIGlmIChkb3RBbGwpIGZsYWdzID0gcmVwbGFjZShmbGFncywgL3MvZywgJycpO1xuICAgIH1cblxuICAgIHJhd0ZsYWdzID0gZmxhZ3M7XG5cbiAgICBpZiAoTUlTU0VEX1NUSUNLWSAmJiAnc3RpY2t5JyBpbiByZTEpIHtcbiAgICAgIHN0aWNreSA9ICEhZmxhZ3MgJiYgc3RyaW5nSW5kZXhPZihmbGFncywgJ3knKSA+IC0xO1xuICAgICAgaWYgKHN0aWNreSAmJiBVTlNVUFBPUlRFRF9ZKSBmbGFncyA9IHJlcGxhY2UoZmxhZ3MsIC95L2csICcnKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TVVBQT1JURURfTkNHKSB7XG4gICAgICBoYW5kbGVkID0gaGFuZGxlTkNHKHBhdHRlcm4pO1xuICAgICAgcGF0dGVybiA9IGhhbmRsZWRbMF07XG4gICAgICBncm91cHMgPSBoYW5kbGVkWzFdO1xuICAgIH1cblxuICAgIHJlc3VsdCA9IGluaGVyaXRJZlJlcXVpcmVkKE5hdGl2ZVJlZ0V4cChwYXR0ZXJuLCBmbGFncyksIHRoaXNJc1JlZ0V4cCA/IHRoaXMgOiBSZWdFeHBQcm90b3R5cGUsIFJlZ0V4cFdyYXBwZXIpO1xuXG4gICAgaWYgKGRvdEFsbCB8fCBzdGlja3kgfHwgZ3JvdXBzLmxlbmd0aCkge1xuICAgICAgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZShyZXN1bHQpO1xuICAgICAgaWYgKGRvdEFsbCkge1xuICAgICAgICBzdGF0ZS5kb3RBbGwgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5yYXcgPSBSZWdFeHBXcmFwcGVyKGhhbmRsZURvdEFsbChwYXR0ZXJuKSwgcmF3RmxhZ3MpO1xuICAgICAgfVxuICAgICAgaWYgKHN0aWNreSkgc3RhdGUuc3RpY2t5ID0gdHJ1ZTtcbiAgICAgIGlmIChncm91cHMubGVuZ3RoKSBzdGF0ZS5ncm91cHMgPSBncm91cHM7XG4gICAgfVxuXG4gICAgaWYgKHBhdHRlcm4gIT09IHJhd1BhdHRlcm4pIHRyeSB7XG4gICAgICAvLyBmYWlscyBpbiBvbGQgZW5naW5lcywgYnV0IHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmVzIGZvciB1bnN1cHBvcnRlZCByZWdleCBzeW50YXhcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShyZXN1bHQsICdzb3VyY2UnLCByYXdQYXR0ZXJuID09PSAnJyA/ICcoPzopJyA6IHJhd1BhdHRlcm4pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgZm9yICh2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXMoTmF0aXZlUmVnRXhwKSwgaW5kZXggPSAwOyBrZXlzLmxlbmd0aCA+IGluZGV4Oykge1xuICAgIHByb3h5QWNjZXNzb3IoUmVnRXhwV3JhcHBlciwgTmF0aXZlUmVnRXhwLCBrZXlzW2luZGV4KytdKTtcbiAgfVxuXG4gIFJlZ0V4cFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlZ0V4cFdyYXBwZXI7XG4gIFJlZ0V4cFdyYXBwZXIucHJvdG90eXBlID0gUmVnRXhwUHJvdG90eXBlO1xuICBkZWZpbmVCdWlsdEluKGdsb2JhbCwgJ1JlZ0V4cCcsIFJlZ0V4cFdyYXBwZXIsIHsgY29uc3RydWN0b3I6IHRydWUgfSk7XG59XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC1AQHNwZWNpZXNcbnNldFNwZWNpZXMoJ1JlZ0V4cCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5kb3QtYWxsLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgVU5TVVBQT1JURURfRE9UX0FMTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtdW5zdXBwb3J0ZWQtZG90LWFsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC11bnN1cHBvcnRlZC1kb3QtYWxsLmpzXCIpO1xudmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLXJhdy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIGdldEludGVybmFsU3RhdGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIikuZ2V0KTtcblxudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjtcblxuLy8gYFJlZ0V4cC5wcm90b3R5cGUuZG90QWxsYCBnZXR0ZXJcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZG90YWxsXG5pZiAoREVTQ1JJUFRPUlMgJiYgVU5TVVBQT1JURURfRE9UX0FMTCkge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUmVnRXhwUHJvdG90eXBlLCAnZG90QWxsJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGRvdEFsbCgpIHtcbiAgICAgIGlmICh0aGlzID09PSBSZWdFeHBQcm90b3R5cGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAvLyBXZSBjYW4ndCB1c2UgSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IgYmVjYXVzZVxuICAgICAgLy8gd2UgZG9uJ3QgYWRkIG1ldGFkYXRhIGZvciByZWdleHBzIGNyZWF0ZWQgYnkgYSBsaXRlcmFsLlxuICAgICAgaWYgKGNsYXNzb2YodGhpcykgPT09ICdSZWdFeHAnKSB7XG4gICAgICAgIHJldHVybiAhIWdldEludGVybmFsU3RhdGUodGhpcykuZG90QWxsO1xuICAgICAgfVxuICAgICAgdGhyb3cgJFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCBSZWdFeHAgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH0pO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZG90LWFsbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZXhlYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZXhlYyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZ2V4cC1leGVjLmpzXCIpO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5leGVjYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS5leGVjXG4kKHsgdGFyZ2V0OiAnUmVnRXhwJywgcHJvdG86IHRydWUsIGZvcmNlZDogLy4vLmV4ZWMgIT09IGV4ZWMgfSwge1xuICBleGVjOiBleGVjXG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciByZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZmxhZ3MuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxuLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCcuJywgJ2QnKSAtPiAvLi9kIGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFJlZ0V4cFByb3RvdHlwZSA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbnZhciBGT1JDRUQgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBJTkRJQ0VTX1NVUFBPUlQgPSB0cnVlO1xuICB0cnkge1xuICAgIFJlZ0V4cCgnLicsICdkJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgSU5ESUNFU19TVVBQT1JUID0gZmFsc2U7XG4gIH1cblxuICB2YXIgTyA9IHt9O1xuICAvLyBtb2Rlcm4gVjggYnVnXG4gIHZhciBjYWxscyA9ICcnO1xuICB2YXIgZXhwZWN0ZWQgPSBJTkRJQ0VTX1NVUFBPUlQgPyAnZGdpbXN5JyA6ICdnaW1zeSc7XG5cbiAgdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChrZXksIGNocikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxscyArPSBjaHI7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IH0pO1xuICB9O1xuXG4gIHZhciBwYWlycyA9IHtcbiAgICBkb3RBbGw6ICdzJyxcbiAgICBnbG9iYWw6ICdnJyxcbiAgICBpZ25vcmVDYXNlOiAnaScsXG4gICAgbXVsdGlsaW5lOiAnbScsXG4gICAgc3RpY2t5OiAneSdcbiAgfTtcblxuICBpZiAoSU5ESUNFU19TVVBQT1JUKSBwYWlycy5oYXNJbmRpY2VzID0gJ2QnO1xuXG4gIGZvciAodmFyIGtleSBpbiBwYWlycykgYWRkR2V0dGVyKGtleSwgcGFpcnNba2V5XSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihSZWdFeHBQcm90b3R5cGUsICdmbGFncycpLmdldC5jYWxsKE8pO1xuXG4gIHJldHVybiByZXN1bHQgIT09IGV4cGVjdGVkIHx8IGNhbGxzICE9PSBleHBlY3RlZDtcbn0pO1xuXG4vLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzXG5pZiAoRk9SQ0VEKSBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUmVnRXhwUHJvdG90eXBlLCAnZmxhZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiByZWdFeHBGbGFnc1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIG1vdmVkIHRvIGVudHJ5IHBvaW50c1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy5yZWdleHAuZXhlYyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qc1wiKTtcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xuXG52YXIgREVMRUdBVEVTX1RPX0VYRUMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBleGVjQ2FsbGVkID0gZmFsc2U7XG4gIHZhciByZSA9IC9bYWNdLztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBleGVjQ2FsbGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gLy4vLmV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgcmV0dXJuIHJlLnRlc3QoJ2FiYycpID09PSB0cnVlICYmIGV4ZWNDYWxsZWQ7XG59KCk7XG5cbnZhciBuYXRpdmVUZXN0ID0gLy4vLnRlc3Q7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLnRlc3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLnRlc3RcbiQoeyB0YXJnZXQ6ICdSZWdFeHAnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhREVMRUdBVEVTX1RPX0VYRUMgfSwge1xuICB0ZXN0OiBmdW5jdGlvbiAoUykge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIHN0cmluZyA9IHRvU3RyaW5nKFMpO1xuICAgIHZhciBleGVjID0gUi5leGVjO1xuICAgIGlmICghaXNDYWxsYWJsZShleGVjKSkgcmV0dXJuIGNhbGwobmF0aXZlVGVzdCwgUiwgc3RyaW5nKTtcbiAgICB2YXIgcmVzdWx0ID0gY2FsbChleGVjLCBSLCBzdHJpbmcpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICBhbk9iamVjdChyZXN1bHQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLW5hbWUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1uYW1lLmpzXCIpLlBST1BFUik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYW4tb2JqZWN0LmpzXCIpO1xudmFyICR0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWdldC1mbGFncy5qc1wiKTtcblxudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTtcbnZhciBuYXRpdmVUb1N0cmluZyA9IFJlZ0V4cFByb3RvdHlwZVtUT19TVFJJTkddO1xuXG52YXIgTk9UX0dFTkVSSUMgPSBmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiBuYXRpdmVUb1N0cmluZy5jYWxsKHsgc291cmNlOiAnYScsIGZsYWdzOiAnYicgfSkgIT0gJy9hL2InOyB9KTtcbi8vIEZGNDQtIFJlZ0V4cCN0b1N0cmluZyBoYXMgYSB3cm9uZyBuYW1lXG52YXIgSU5DT1JSRUNUX05BTUUgPSBQUk9QRVJfRlVOQ1RJT05fTkFNRSAmJiBuYXRpdmVUb1N0cmluZy5uYW1lICE9IFRPX1NUUklORztcblxuLy8gYFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG5pZiAoTk9UX0dFTkVSSUMgfHwgSU5DT1JSRUNUX05BTUUpIHtcbiAgZGVmaW5lQnVpbHRJbihSZWdFeHAucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgdmFyIHBhdHRlcm4gPSAkdG9TdHJpbmcoUi5zb3VyY2UpO1xuICAgIHZhciBmbGFncyA9ICR0b1N0cmluZyhnZXRSZWdFeHBGbGFncyhSKSk7XG4gICAgcmV0dXJuICcvJyArIHBhdHRlcm4gKyAnLycgKyBmbGFncztcbiAgfSwgeyB1bnNhZmU6IHRydWUgfSk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hdC1hbHRlcm5hdGl2ZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1zdHJpbmctcHJvdG90eXBlLWF0IC0tIHNhZmVcbiAgcmV0dXJuICftoYLtvrcnLmF0KC0yKSAhPT0gJ1xcdUQ4NDInO1xufSk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmF0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5hdFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIGF0OiBmdW5jdGlvbiBhdChpbmRleCkge1xuICAgIHZhciBTID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgdmFyIGxlbiA9IFMubGVuZ3RoO1xuICAgIHZhciByZWxhdGl2ZUluZGV4ID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gICAgdmFyIGsgPSByZWxhdGl2ZUluZGV4ID49IDAgPyByZWxhdGl2ZUluZGV4IDogbGVuICsgcmVsYXRpdmVJbmRleDtcbiAgICByZXR1cm4gKGsgPCAwIHx8IGsgPj0gbGVuKSA/IHVuZGVmaW5lZCA6IGNoYXJBdChTLCBrKTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5hdC1hbHRlcm5hdGl2ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZS5qc1wiKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpLmYpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgbm90QVJlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ub3QtYS1yZWdleHAgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3QtYS1yZWdleHAuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3RyaW5nLXByb3RvdHlwZS1lbmRzd2l0aCAtLSBzYWZlXG52YXIgbmF0aXZlRW5kc1dpdGggPSB1bmN1cnJ5VGhpcygnJy5lbmRzV2l0aCk7XG52YXIgc2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgbWluID0gTWF0aC5taW47XG5cbnZhciBDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyA9IGNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdlbmRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnZW5kc1dpdGgnKTtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3Iud3JpdGFibGU7XG59KCk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5lbmRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBlbmRQb3NpdGlvbiA9IEBsZW5ndGggKi8pIHtcbiAgICB2YXIgdGhhdCA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO1xuICAgIG5vdEFSZWdFeHAoc2VhcmNoU3RyaW5nKTtcbiAgICB2YXIgZW5kUG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbGVuID0gdGhhdC5sZW5ndGg7XG4gICAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBtaW4odG9MZW5ndGgoZW5kUG9zaXRpb24pLCBsZW4pO1xuICAgIHZhciBzZWFyY2ggPSB0b1N0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVFbmRzV2l0aFxuICAgICAgPyBuYXRpdmVFbmRzV2l0aCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogc2xpY2UodGhhdCwgZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmVuZHMtd2l0aC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBub3RBUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vdC1hLXJlZ2V4cCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25vdC1hLXJlZ2V4cC5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgY29ycmVjdElzUmVnRXhwTG9naWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3JyZWN0LWlzLXJlZ2V4cC1sb2dpYy5qc1wiKTtcblxudmFyIHN0cmluZ0luZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIGZvcmNlZDogIWNvcnJlY3RJc1JlZ0V4cExvZ2ljKCdpbmNsdWRlcycpIH0sIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5zdHJpbmdJbmRleE9mKFxuICAgICAgdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSksXG4gICAgICB0b1N0cmluZyhub3RBUmVnRXhwKHNlYXJjaFN0cmluZykpLFxuICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY2hhckF0ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLW11bHRpYnl0ZS5qc1wiKS5jaGFyQXQpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3ItZGVmaW5lLmpzXCIpO1xudmFyIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLWl0ZXItcmVzdWx0LW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyLXJlc3VsdC1vYmplY3QuanNcIik7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS1AQGl0ZXJhdG9yXG5kZWZpbmVJdGVyYXRvcihTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogU1RSSU5HX0lURVJBVE9SLFxuICAgIHN0cmluZzogdG9TdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIHBvaW50ID0gY2hhckF0KHN0cmluZywgaW5kZXgpO1xuICBzdGF0ZS5pbmRleCArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHBvaW50LCBmYWxzZSk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1jYWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbC5qc1wiKTtcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzXCIpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qc1wiKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hZHZhbmNlLXN0cmluZy1pbmRleC5qc1wiKTtcbnZhciByZWdFeHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanNcIik7XG5cbi8vIEBAbWF0Y2ggbG9naWNcbmZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljKCdtYXRjaCcsIGZ1bmN0aW9uIChNQVRDSCwgbmF0aXZlTWF0Y2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2hcbiAgICBmdW5jdGlvbiBtYXRjaChyZWdleHApIHtcbiAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIHZhciBtYXRjaGVyID0gaXNOdWxsT3JVbmRlZmluZWQocmVnZXhwKSA/IHVuZGVmaW5lZCA6IGdldE1ldGhvZChyZWdleHAsIE1BVENIKTtcbiAgICAgIHJldHVybiBtYXRjaGVyID8gY2FsbChtYXRjaGVyLCByZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXSh0b1N0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAbWF0Y2hcbiAgICBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICB2YXIgcnggPSBhbk9iamVjdCh0aGlzKTtcbiAgICAgIHZhciBTID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlTWF0Y2gsIHJ4LCBTKTtcblxuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICBpZiAoIXJ4Lmdsb2JhbCkgcmV0dXJuIHJlZ0V4cEV4ZWMocngsIFMpO1xuXG4gICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB2YXIgbiA9IDA7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgd2hpbGUgKChyZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKSkgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG1hdGNoU3RyID0gdG9TdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLWFsbC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcbnZhciBpc1JlZ0V4cCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1yZWdleHAgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LW1ldGhvZC5qc1wiKTtcbnZhciBnZXRSZWdFeHBGbGFncyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWdldC1mbGFncy5qc1wiKTtcbnZhciBnZXRTdWJzdGl0dXRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LXN1YnN0aXR1dGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1zdWJzdGl0dXRpb24uanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxudmFyIFJFUExBQ0UgPSB3ZWxsS25vd25TeW1ib2woJ3JlcGxhY2UnKTtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xudmFyIGluZGV4T2YgPSB1bmN1cnJ5VGhpcygnJy5pbmRleE9mKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc3RyaW5nU2xpY2UgPSB1bmN1cnJ5VGhpcygnJy5zbGljZSk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG5cbnZhciBzdHJpbmdJbmRleE9mID0gZnVuY3Rpb24gKHN0cmluZywgc2VhcmNoVmFsdWUsIGZyb21JbmRleCkge1xuICBpZiAoZnJvbUluZGV4ID4gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIC0xO1xuICBpZiAoc2VhcmNoVmFsdWUgPT09ICcnKSByZXR1cm4gZnJvbUluZGV4O1xuICByZXR1cm4gaW5kZXhPZihzdHJpbmcsIHNlYXJjaFZhbHVlLCBmcm9tSW5kZXgpO1xufTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUucmVwbGFjZWFsbFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlIH0sIHtcbiAgcmVwbGFjZUFsbDogZnVuY3Rpb24gcmVwbGFjZUFsbChzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgdmFyIE8gPSByZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgIHZhciBJU19SRUdfRVhQLCBmbGFncywgcmVwbGFjZXIsIHN0cmluZywgc2VhcmNoU3RyaW5nLCBmdW5jdGlvbmFsUmVwbGFjZSwgc2VhcmNoTGVuZ3RoLCBhZHZhbmNlQnksIHJlcGxhY2VtZW50O1xuICAgIHZhciBwb3NpdGlvbiA9IDA7XG4gICAgdmFyIGVuZE9mTGFzdE1hdGNoID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChzZWFyY2hWYWx1ZSkpIHtcbiAgICAgIElTX1JFR19FWFAgPSBpc1JlZ0V4cChzZWFyY2hWYWx1ZSk7XG4gICAgICBpZiAoSVNfUkVHX0VYUCkge1xuICAgICAgICBmbGFncyA9IHRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUoZ2V0UmVnRXhwRmxhZ3Moc2VhcmNoVmFsdWUpKSk7XG4gICAgICAgIGlmICghfmluZGV4T2YoZmxhZ3MsICdnJykpIHRocm93ICRUeXBlRXJyb3IoJ2AucmVwbGFjZUFsbGAgZG9lcyBub3QgYWxsb3cgbm9uLWdsb2JhbCByZWdleGVzJyk7XG4gICAgICB9XG4gICAgICByZXBsYWNlciA9IGdldE1ldGhvZChzZWFyY2hWYWx1ZSwgUkVQTEFDRSk7XG4gICAgICBpZiAocmVwbGFjZXIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGwocmVwbGFjZXIsIHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChJU19QVVJFICYmIElTX1JFR19FWFApIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2UodG9TdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmcgPSB0b1N0cmluZyhPKTtcbiAgICBzZWFyY2hTdHJpbmcgPSB0b1N0cmluZyhzZWFyY2hWYWx1ZSk7XG4gICAgZnVuY3Rpb25hbFJlcGxhY2UgPSBpc0NhbGxhYmxlKHJlcGxhY2VWYWx1ZSk7XG4gICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gdG9TdHJpbmcocmVwbGFjZVZhbHVlKTtcbiAgICBzZWFyY2hMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoO1xuICAgIGFkdmFuY2VCeSA9IG1heCgxLCBzZWFyY2hMZW5ndGgpO1xuICAgIHBvc2l0aW9uID0gc3RyaW5nSW5kZXhPZihzdHJpbmcsIHNlYXJjaFN0cmluZywgMCk7XG4gICAgd2hpbGUgKHBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgcmVwbGFjZW1lbnQgPSBmdW5jdGlvbmFsUmVwbGFjZVxuICAgICAgICA/IHRvU3RyaW5nKHJlcGxhY2VWYWx1ZShzZWFyY2hTdHJpbmcsIHBvc2l0aW9uLCBzdHJpbmcpKVxuICAgICAgICA6IGdldFN1YnN0aXR1dGlvbihzZWFyY2hTdHJpbmcsIHN0cmluZywgcG9zaXRpb24sIFtdLCB1bmRlZmluZWQsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICByZXN1bHQgKz0gc3RyaW5nU2xpY2Uoc3RyaW5nLCBlbmRPZkxhc3RNYXRjaCwgcG9zaXRpb24pICsgcmVwbGFjZW1lbnQ7XG4gICAgICBlbmRPZkxhc3RNYXRjaCA9IHBvc2l0aW9uICsgc2VhcmNoTGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBzdHJpbmdJbmRleE9mKHN0cmluZywgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiArIGFkdmFuY2VCeSk7XG4gICAgfVxuICAgIGlmIChlbmRPZkxhc3RNYXRjaCA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCArPSBzdHJpbmdTbGljZShzdHJpbmcsIGVuZE9mTGFzdE1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLWFsbC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgYXBwbHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYXBwbHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1hcHBseS5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBmaXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZC5qc1wiKTtcbnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5LmpzXCIpO1xudmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qc1wiKTtcbnZhciB0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanNcIik7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanNcIik7XG52YXIgZ2V0TWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1tZXRob2QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtbWV0aG9kLmpzXCIpO1xudmFyIGdldFN1YnN0aXR1dGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtc3Vic3RpdHV0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LXN1YnN0aXR1dGlvbi5qc1wiKTtcbnZhciByZWdFeHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanNcIik7XG52YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanNcIik7XG5cbnZhciBSRVBMQUNFID0gd2VsbEtub3duU3ltYm9sKCdyZXBsYWNlJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgY29uY2F0ID0gdW5jdXJyeVRoaXMoW10uY29uY2F0KTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgc3RyaW5nSW5kZXhPZiA9IHVuY3VycnlUaGlzKCcnLmluZGV4T2YpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG52YXIgbWF5YmVUb1N0cmluZyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG5cbi8vIElFIDw9IDExIHJlcGxhY2VzICQwIHdpdGggdGhlIHdob2xlIG1hdGNoLCBhcyBpZiBpdCB3YXMgJCZcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYwMjQ2NjYvZ2V0dGluZy1pZS10by1yZXBsYWNlLWEtcmVnZXgtd2l0aC10aGUtbGl0ZXJhbC1zdHJpbmctMFxudmFyIFJFUExBQ0VfS0VFUFNfJDAgPSAoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3ByZWZlci1lc2NhcGUtcmVwbGFjZW1lbnQtZG9sbGFyLWNoYXIgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmdcbiAgcmV0dXJuICdhJy5yZXBsYWNlKC8uLywgJyQwJykgPT09ICckMCc7XG59KSgpO1xuXG4vLyBTYWZhcmkgPD0gMTMuMC4zKD8pIHN1YnN0aXR1dGVzIG50aCBjYXB0dXJlIHdoZXJlIG4+bSB3aXRoIGFuIGVtcHR5IHN0cmluZ1xudmFyIFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFID0gKGZ1bmN0aW9uICgpIHtcbiAgaWYgKC8uL1tSRVBMQUNFXSkge1xuICAgIHJldHVybiAvLi9bUkVQTEFDRV0oJ2EnLCAnJDAnKSA9PT0gJyc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufSkoKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlID0gLy4vO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICByZXN1bHQuZ3JvdXBzID0geyBhOiAnNycgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXVzZWxlc3MtZG9sbGFyLXJlcGxhY2VtZW50cyAtLSBmYWxzZSBwb3NpdGl2ZVxuICByZXR1cm4gJycucmVwbGFjZShyZSwgJyQ8YT4nKSAhPT0gJzcnO1xufSk7XG5cbi8vIEBAcmVwbGFjZSBsb2dpY1xuZml4UmVnRXhwV2VsbEtub3duU3ltYm9sTG9naWMoJ3JlcGxhY2UnLCBmdW5jdGlvbiAoXywgbmF0aXZlUmVwbGFjZSwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHZhciBVTlNBRkVfU1VCU1RJVFVURSA9IFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFID8gJyQnIDogJyQwJztcblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlXG4gICAgZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICB2YXIgcmVwbGFjZXIgPSBpc051bGxPclVuZGVmaW5lZChzZWFyY2hWYWx1ZSkgPyB1bmRlZmluZWQgOiBnZXRNZXRob2Qoc2VhcmNoVmFsdWUsIFJFUExBQ0UpO1xuICAgICAgcmV0dXJuIHJlcGxhY2VyXG4gICAgICAgID8gY2FsbChyZXBsYWNlciwgc2VhcmNoVmFsdWUsIE8sIHJlcGxhY2VWYWx1ZSlcbiAgICAgICAgOiBjYWxsKG5hdGl2ZVJlcGxhY2UsIHRvU3RyaW5nKE8pLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHJlcGxhY2VcbiAgICBmdW5jdGlvbiAoc3RyaW5nLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIFMgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiByZXBsYWNlVmFsdWUgPT0gJ3N0cmluZycgJiZcbiAgICAgICAgc3RyaW5nSW5kZXhPZihyZXBsYWNlVmFsdWUsIFVOU0FGRV9TVUJTVElUVVRFKSA9PT0gLTEgJiZcbiAgICAgICAgc3RyaW5nSW5kZXhPZihyZXBsYWNlVmFsdWUsICckPCcpID09PSAtMVxuICAgICAgKSB7XG4gICAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlUmVwbGFjZSwgcngsIFMsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZ1bmN0aW9uYWxSZXBsYWNlID0gaXNDYWxsYWJsZShyZXBsYWNlVmFsdWUpO1xuICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gdG9TdHJpbmcocmVwbGFjZVZhbHVlKTtcblxuICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDtcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIGJyZWFrO1xuXG4gICAgICAgIHB1c2gocmVzdWx0cywgcmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuXG4gICAgICAgIHZhciBtYXRjaFN0ciA9IHRvU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIGlmIChtYXRjaFN0ciA9PT0gJycpIHJ4Lmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChyeC5sYXN0SW5kZXgpLCBmdWxsVW5pY29kZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhY2N1bXVsYXRlZFJlc3VsdCA9ICcnO1xuICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1tpXTtcblxuICAgICAgICB2YXIgbWF0Y2hlZCA9IHRvU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IG1heChtaW4odG9JbnRlZ2VyT3JJbmZpbml0eShyZXN1bHQuaW5kZXgpLCBTLmxlbmd0aCksIDApO1xuICAgICAgICB2YXIgY2FwdHVyZXMgPSBbXTtcbiAgICAgICAgLy8gTk9URTogVGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgIC8vICAgY2FwdHVyZXMgPSByZXN1bHQuc2xpY2UoMSkubWFwKG1heWJlVG9TdHJpbmcpXG4gICAgICAgIC8vIGJ1dCBmb3Igc29tZSByZWFzb24gYG5hdGl2ZVNsaWNlLmNhbGwocmVzdWx0LCAxLCByZXN1bHQubGVuZ3RoKWAgKGNhbGxlZCBpblxuICAgICAgICAvLyB0aGUgc2xpY2UgcG9seWZpbGwgd2hlbiBzbGljaW5nIG5hdGl2ZSBhcnJheXMpIFwiZG9lc24ndCB3b3JrXCIgaW4gc2FmYXJpIDkgYW5kXG4gICAgICAgIC8vIGNhdXNlcyBhIGNyYXNoIChodHRwczovL3Bhc3RlYmluLmNvbS9OMjFRemVRQSkgd2hlbiB0cnlpbmcgdG8gZGVidWcgaXQuXG4gICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgcmVzdWx0Lmxlbmd0aDsgaisrKSBwdXNoKGNhcHR1cmVzLCBtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBjb25jYXQoW21hdGNoZWRdLCBjYXB0dXJlcywgcG9zaXRpb24sIFMpO1xuICAgICAgICAgIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHB1c2gocmVwbGFjZXJBcmdzLCBuYW1lZENhcHR1cmVzKTtcbiAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSB0b1N0cmluZyhhcHBseShyZXBsYWNlVmFsdWUsIHVuZGVmaW5lZCwgcmVwbGFjZXJBcmdzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA+PSBuZXh0U291cmNlUG9zaXRpb24pIHtcbiAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBzdHJpbmdTbGljZShTLCBuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIHN0cmluZ1NsaWNlKFMsIG5leHRTb3VyY2VQb3NpdGlvbik7XG4gICAgfVxuICBdO1xufSwgIVJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTIHx8ICFSRVBMQUNFX0tFRVBTXyQwIHx8IFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZpeFJlZ0V4cFdlbGxLbm93blN5bWJvbExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1udWxsLW9yLXVuZGVmaW5lZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkLmpzXCIpO1xudmFyIGlzUmVnRXhwID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXJlZ2V4cC5qc1wiKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qc1wiKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanNcIik7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWR2YW5jZS1zdHJpbmctaW5kZXguanNcIik7XG52YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tbGVuZ3RoLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBnZXRNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LW1ldGhvZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1tZXRob2QuanNcIik7XG52YXIgYXJyYXlTbGljZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1zbGljZS1zaW1wbGUuanNcIik7XG52YXIgY2FsbFJlZ0V4cEV4ZWMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdC5qc1wiKTtcbnZhciByZWdleHBFeGVjID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMuanNcIik7XG52YXIgc3RpY2t5SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9yZWdleHAtc3RpY2t5LWhlbHBlcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtc3RpY2t5LWhlbHBlcnMuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcblxudmFyIFVOU1VQUE9SVEVEX1kgPSBzdGlja3lIZWxwZXJzLlVOU1VQUE9SVEVEX1k7XG52YXIgTUFYX1VJTlQzMiA9IDB4RkZGRkZGRkY7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgJHB1c2ggPSBbXS5wdXNoO1xudmFyIGV4ZWMgPSB1bmN1cnJ5VGhpcygvLi8uZXhlYyk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKCRwdXNoKTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxuLy8gQ2hyb21lIDUxIGhhcyBhIGJ1Z2d5IFwic3BsaXRcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIFJlZ0V4cCNleGVjICE9PSBuYXRpdmVFeGVjXG4vLyBXZWV4IEpTIGhhcyBmcm96ZW4gYnVpbHQtaW4gcHJvdG90eXBlcywgc28gdXNlIHRyeSAvIGNhdGNoIHdyYXBwZXJcbnZhciBTUExJVF9XT1JLU19XSVRIX09WRVJXUklUVEVOX0VYRUMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWVtcHR5LWdyb3VwIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gIHZhciByZSA9IC8oPzopLztcbiAgdmFyIG9yaWdpbmFsRXhlYyA9IHJlLmV4ZWM7XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBvcmlnaW5hbEV4ZWMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcbiAgdmFyIHJlc3VsdCA9ICdhYicuc3BsaXQocmUpO1xuICByZXR1cm4gcmVzdWx0Lmxlbmd0aCAhPT0gMiB8fCByZXN1bHRbMF0gIT09ICdhJyB8fCByZXN1bHRbMV0gIT09ICdiJztcbn0pO1xuXG4vLyBAQHNwbGl0IGxvZ2ljXG5maXhSZWdFeHBXZWxsS25vd25TeW1ib2xMb2dpYygnc3BsaXQnLCBmdW5jdGlvbiAoU1BMSVQsIG5hdGl2ZVNwbGl0LCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgdmFyIGludGVybmFsU3BsaXQ7XG4gIGlmIChcbiAgICAnYWJiYycuc3BsaXQoLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWVtcHR5LWdyb3VwIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgJ3Rlc3QnLnNwbGl0KC8oPzopLywgLTEpLmxlbmd0aCAhPSA0IHx8XG4gICAgJ2FiJy5zcGxpdCgvKD86YWIpKi8pLmxlbmd0aCAhPSAyIHx8XG4gICAgJy4nLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aCAhPSA0IHx8XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1lbXB0eS1jYXB0dXJpbmctZ3JvdXAsIHJlZ2V4cC9uby1lbXB0eS1ncm91cCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICAgICcuJy5zcGxpdCgvKCkoKS8pLmxlbmd0aCA+IDEgfHxcbiAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGhcbiAgKSB7XG4gICAgLy8gYmFzZWQgb24gZXM1LXNoaW0gaW1wbGVtZW50YXRpb24sIG5lZWQgdG8gcmV3b3JrIGl0XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgc3RyaW5nID0gdG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgICB2YXIgbGltID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtzdHJpbmddO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gY2FsbChuYXRpdmVTcGxpdCwgc3RyaW5nLCBzZXBhcmF0b3IsIGxpbSk7XG4gICAgICB9XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IGNhbGwocmVnZXhwRXhlYywgc2VwYXJhdG9yQ29weSwgc3RyaW5nKSkge1xuICAgICAgICBsYXN0SW5kZXggPSBzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleDtcbiAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHtcbiAgICAgICAgICBwdXNoKG91dHB1dCwgc3RyaW5nU2xpY2Uoc3RyaW5nLCBsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nLmxlbmd0aCkgYXBwbHkoJHB1c2gsIG91dHB1dCwgYXJyYXlTbGljZShtYXRjaCwgMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+PSBsaW0pIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFleGVjKHNlcGFyYXRvckNvcHksICcnKSkgcHVzaChvdXRwdXQsICcnKTtcbiAgICAgIH0gZWxzZSBwdXNoKG91dHB1dCwgc3RyaW5nU2xpY2Uoc3RyaW5nLCBsYXN0TGFzdEluZGV4KSk7XG4gICAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IGxpbSA/IGFycmF5U2xpY2Uob3V0cHV0LCAwLCBsaW0pIDogb3V0cHV0O1xuICAgIH07XG4gIC8vIENoYWtyYSwgVjhcbiAgfSBlbHNlIGlmICgnMCcuc3BsaXQodW5kZWZpbmVkLCAwKS5sZW5ndGgpIHtcbiAgICBpbnRlcm5hbFNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHJldHVybiBzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCA/IFtdIDogY2FsbChuYXRpdmVTcGxpdCwgdGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfTtcbiAgfSBlbHNlIGludGVybmFsU3BsaXQgPSBuYXRpdmVTcGxpdDtcblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3BsaXRcbiAgICBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICB2YXIgc3BsaXR0ZXIgPSBpc051bGxPclVuZGVmaW5lZChzZXBhcmF0b3IpID8gdW5kZWZpbmVkIDogZ2V0TWV0aG9kKHNlcGFyYXRvciwgU1BMSVQpO1xuICAgICAgcmV0dXJuIHNwbGl0dGVyXG4gICAgICAgID8gY2FsbChzcGxpdHRlciwgc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgICAgOiBjYWxsKGludGVybmFsU3BsaXQsIHRvU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzcGxpdFxuICAgIC8vXG4gICAgLy8gTk9URTogVGhpcyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydFxuICAgIC8vIHRoZSAneScgZmxhZy5cbiAgICBmdW5jdGlvbiAoc3RyaW5nLCBsaW1pdCkge1xuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QodGhpcyk7XG4gICAgICB2YXIgUyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKGludGVybmFsU3BsaXQsIHJ4LCBTLCBsaW1pdCwgaW50ZXJuYWxTcGxpdCAhPT0gbmF0aXZlU3BsaXQpO1xuXG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHJ4LCBSZWdFeHApO1xuXG4gICAgICB2YXIgdW5pY29kZU1hdGNoaW5nID0gcngudW5pY29kZTtcbiAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4LnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKFVOU1VQUE9SVEVEX1kgPyAnZycgOiAneScpO1xuXG4gICAgICAvLyBeKD8gKyByeCArICkgaXMgbmVlZGVkLCBpbiBjb21iaW5hdGlvbiB3aXRoIHNvbWUgUyBzbGljaW5nLCB0b1xuICAgICAgLy8gc2ltdWxhdGUgdGhlICd5JyBmbGFnLlxuICAgICAgdmFyIHNwbGl0dGVyID0gbmV3IEMoVU5TVVBQT1JURURfWSA/ICdeKD86JyArIHJ4LnNvdXJjZSArICcpJyA6IHJ4LCBmbGFncyk7XG4gICAgICB2YXIgbGltID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmIChsaW0gPT09IDApIHJldHVybiBbXTtcbiAgICAgIGlmIChTLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTKSA9PT0gbnVsbCA/IFtTXSA6IFtdO1xuICAgICAgdmFyIHAgPSAwO1xuICAgICAgdmFyIHEgPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHdoaWxlIChxIDwgUy5sZW5ndGgpIHtcbiAgICAgICAgc3BsaXR0ZXIubGFzdEluZGV4ID0gVU5TVVBQT1JURURfWSA/IDAgOiBxO1xuICAgICAgICB2YXIgeiA9IGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBVTlNVUFBPUlRFRF9ZID8gc3RyaW5nU2xpY2UoUywgcSkgOiBTKTtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB6ID09PSBudWxsIHx8XG4gICAgICAgICAgKGUgPSBtaW4odG9MZW5ndGgoc3BsaXR0ZXIubGFzdEluZGV4ICsgKFVOU1VQUE9SVEVEX1kgPyBxIDogMCkpLCBTLmxlbmd0aCkpID09PSBwXG4gICAgICAgICkge1xuICAgICAgICAgIHEgPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgcSwgdW5pY29kZU1hdGNoaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwdXNoKEEsIHN0cmluZ1NsaWNlKFMsIHAsIHEpKTtcbiAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gei5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHB1c2goQSwgeltpXSk7XG4gICAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHEgPSBwID0gZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHVzaChBLCBzdHJpbmdTbGljZShTLCBwKSk7XG4gICAgICByZXR1cm4gQTtcbiAgICB9XG4gIF07XG59LCAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDLCBVTlNVUFBPUlRFRF9ZKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLWNsYXVzZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UuanNcIik7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKS5mKTtcbnZhciB0b0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIG5vdEFSZWdFeHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbm90LWEtcmVnZXhwICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm90LWEtcmVnZXhwLmpzXCIpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlLmpzXCIpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtc3RhcnRzd2l0aCAtLSBzYWZlXG52YXIgbmF0aXZlU3RhcnRzV2l0aCA9IHVuY3VycnlUaGlzKCcnLnN0YXJ0c1dpdGgpO1xudmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG52YXIgQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgPSBjb3JyZWN0SXNSZWdFeHBMb2dpYygnc3RhcnRzV2l0aCcpO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcHVsbC83MDJcbnZhciBNRE5fUE9MWUZJTExfQlVHID0gIUlTX1BVUkUgJiYgIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDICYmICEhZnVuY3Rpb24gKCkge1xuICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcucHJvdG90eXBlLCAnc3RhcnRzV2l0aCcpO1xuICByZXR1cm4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZTtcbn0oKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3RhcnRzd2l0aFxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFNRE5fUE9MWUZJTExfQlVHICYmICFDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQyB9LCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSB0b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICBub3RBUmVnRXhwKHNlYXJjaFN0cmluZyk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgobWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSB0b1N0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoXG4gICAgICA/IG5hdGl2ZVN0YXJ0c1dpdGgodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogc3RyaW5nU2xpY2UodGhhdCwgaW5kZXgsIGluZGV4ICsgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zdGFydHMtd2l0aC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tZW5kLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gVE9ETzogUmVtb3ZlIHRoaXMgbGluZSBmcm9tIGBjb3JlLWpzQDRgXG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy50cmltLXJpZ2h0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXJpZ2h0LmpzXCIpO1xudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIHRyaW1FbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLXRyaW0tZW5kLmpzXCIpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZS50cmltRW5kYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS50cmltZW5kXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc3RyaW5nLXByb3RvdHlwZS10cmltc3RhcnQtdHJpbWVuZCAtLSBzYWZlXG4kKHsgdGFyZ2V0OiAnU3RyaW5nJywgcHJvdG86IHRydWUsIG5hbWU6ICd0cmltRW5kJywgZm9yY2VkOiAnJy50cmltRW5kICE9PSB0cmltRW5kIH0sIHtcbiAgdHJpbUVuZDogdHJpbUVuZFxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLWVuZC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0tcmlnaHQuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgdHJpbUVuZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctdHJpbS1lbmQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS1lbmQuanNcIik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnRyaW1SaWdodGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbWVuZFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXN0cmluZy1wcm90b3R5cGUtdHJpbWxlZnQtdHJpbXJpZ2h0IC0tIHNhZmVcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgbmFtZTogJ3RyaW1FbmQnLCBmb3JjZWQ6ICcnLnRyaW1SaWdodCAhPT0gdHJpbUVuZCB9LCB7XG4gIHRyaW1SaWdodDogdHJpbUVuZFxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLXJpZ2h0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciAkdHJpbSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qc1wiKS50cmltKTtcbnZhciBmb3JjZWRTdHJpbmdUcmltTWV0aG9kID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3N0cmluZy10cmltLWZvcmNlZC5qc1wiKTtcblxuLy8gYFN0cmluZy5wcm90b3R5cGUudHJpbWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUudHJpbVxuJCh7IHRhcmdldDogJ1N0cmluZycsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IGZvcmNlZFN0cmluZ1RyaW1NZXRob2QoJ3RyaW0nKSB9LCB7XG4gIHRyaW06IGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMpO1xuICB9XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCIvLyBgU3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvbmAgZ2V0dGVyXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb25cblxudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5LmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1pcy1wcm90b3R5cGUtb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtaXMtcHJvdG90eXBlLW9mLmpzXCIpO1xudmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzXCIpO1xuXG52YXIgTmF0aXZlU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBTeW1ib2xQcm90b3R5cGUgPSBOYXRpdmVTeW1ib2wgJiYgTmF0aXZlU3ltYm9sLnByb3RvdHlwZTtcblxuaWYgKERFU0NSSVBUT1JTICYmIGlzQ2FsbGFibGUoTmF0aXZlU3ltYm9sKSAmJiAoISgnZGVzY3JpcHRpb24nIGluIFN5bWJvbFByb3RvdHlwZSkgfHxcbiAgLy8gU2FmYXJpIDEyIGJ1Z1xuICBOYXRpdmVTeW1ib2woKS5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkXG4pKSB7XG4gIHZhciBFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUgPSB7fTtcbiAgLy8gd3JhcCBTeW1ib2wgY29uc3RydWN0b3IgZm9yIGNvcnJlY3Qgd29yayB3aXRoIHVuZGVmaW5lZCBkZXNjcmlwdGlvblxuICB2YXIgU3ltYm9sV3JhcHBlciA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDwgMSB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvU3RyaW5nKGFyZ3VtZW50c1swXSk7XG4gICAgdmFyIHJlc3VsdCA9IGlzUHJvdG90eXBlT2YoU3ltYm9sUHJvdG90eXBlLCB0aGlzKVxuICAgICAgPyBuZXcgTmF0aXZlU3ltYm9sKGRlc2NyaXB0aW9uKVxuICAgICAgLy8gaW4gRWRnZSAxMywgU3RyaW5nKFN5bWJvbCh1bmRlZmluZWQpKSA9PT0gJ1N5bWJvbCh1bmRlZmluZWQpJ1xuICAgICAgOiBkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkID8gTmF0aXZlU3ltYm9sKCkgOiBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pO1xuICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gJycpIEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZVtyZXN1bHRdID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoU3ltYm9sV3JhcHBlciwgTmF0aXZlU3ltYm9sKTtcbiAgU3ltYm9sV3JhcHBlci5wcm90b3R5cGUgPSBTeW1ib2xQcm90b3R5cGU7XG4gIFN5bWJvbFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN5bWJvbFdyYXBwZXI7XG5cbiAgdmFyIE5BVElWRV9TWU1CT0wgPSBTdHJpbmcoTmF0aXZlU3ltYm9sKCd0ZXN0JykpID09ICdTeW1ib2wodGVzdCknO1xuICB2YXIgdGhpc1N5bWJvbFZhbHVlID0gdW5jdXJyeVRoaXMoU3ltYm9sUHJvdG90eXBlLnZhbHVlT2YpO1xuICB2YXIgc3ltYm9sRGVzY3JpcHRpdmVTdHJpbmcgPSB1bmN1cnJ5VGhpcyhTeW1ib2xQcm90b3R5cGUudG9TdHJpbmcpO1xuICB2YXIgcmVnZXhwID0gL15TeW1ib2xcXCgoLiopXFwpW14pXSskLztcbiAgdmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbiAgdmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpO1xuXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihTeW1ib2xQcm90b3R5cGUsICdkZXNjcmlwdGlvbicsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgIHZhciBzeW1ib2wgPSB0aGlzU3ltYm9sVmFsdWUodGhpcyk7XG4gICAgICBpZiAoaGFzT3duKEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZSwgc3ltYm9sKSkgcmV0dXJuICcnO1xuICAgICAgdmFyIHN0cmluZyA9IHN5bWJvbERlc2NyaXB0aXZlU3RyaW5nKHN5bWJvbCk7XG4gICAgICB2YXIgZGVzYyA9IE5BVElWRV9TWU1CT0wgPyBzdHJpbmdTbGljZShzdHJpbmcsIDcsIC0xKSA6IHJlcGxhY2Uoc3RyaW5nLCByZWdleHAsICckMScpO1xuICAgICAgcmV0dXJuIGRlc2MgPT09ICcnID8gdW5kZWZpbmVkIDogZGVzYztcbiAgICB9XG4gIH0pO1xuXG4gICQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgIFN5bWJvbDogU3ltYm9sV3JhcHBlclxuICB9KTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5hdC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzXCIpO1xudmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbGVuZ3RoLW9mLWFycmF5LWxpa2UuanNcIik7XG52YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1pbnRlZ2VyLW9yLWluZmluaXR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eS5qc1wiKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xuXG4vLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS5hdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuYXRcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ2F0JywgZnVuY3Rpb24gYXQoaW5kZXgpIHtcbiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pO1xuICB2YXIgcmVsYXRpdmVJbmRleCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpO1xuICB2YXIgayA9IHJlbGF0aXZlSW5kZXggPj0gMCA/IHJlbGF0aXZlSW5kZXggOiBsZW4gKyByZWxhdGl2ZUluZGV4O1xuICByZXR1cm4gKGsgPCAwIHx8IGsgPj0gbGVuKSA/IHVuZGVmaW5lZCA6IE9ba107XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuYXQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbGwuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciAkZmlsbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1maWxsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZmlsbC5qc1wiKTtcbnZhciB0b0JpZ0ludCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1iaWctaW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYmlnLWludC5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcbnZhciBzbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxuLy8gVjggfiBDaHJvbWUgPCA1OSwgU2FmYXJpIDwgMTQuMSwgRkYgPCA1NSwgRWRnZSA8PTE4XG52YXIgQ09OVkVSU0lPTl9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBjb3VudCA9IDA7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby10eXBlZC1hcnJheXMgLS0gc2FmZVxuICBuZXcgSW50OEFycmF5KDIpLmZpbGwoeyB2YWx1ZU9mOiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb3VudCsrOyB9IH0pO1xuICByZXR1cm4gY291bnQgIT09IDE7XG59KTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmlsbGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZmlsbFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmlsbCcsIGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCwgZW5kICovKSB7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIGFjdHVhbFZhbHVlID0gc2xpY2UoY2xhc3NvZih0aGlzKSwgMCwgMykgPT09ICdCaWcnID8gdG9CaWdJbnQodmFsdWUpIDogK3ZhbHVlO1xuICByZXR1cm4gY2FsbCgkZmlsbCwgdGhpcywgYWN0dWFsVmFsdWUsIGxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xufSwgQ09OVkVSU0lPTl9CVUcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maWxsLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5maW5kLWxhc3QtaW5kZXguanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciAkZmluZExhc3RJbmRleCA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWl0ZXJhdGlvbi1mcm9tLWxhc3QuanNcIikuZmluZExhc3RJbmRleCk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmluZExhc3RJbmRleGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuZmluZGxhc3RpbmRleFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnZmluZExhc3RJbmRleCcsIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gJGZpbmRMYXN0SW5kZXgoYVR5cGVkQXJyYXkodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmZpbmQtbGFzdC1pbmRleC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanNcIik7XG52YXIgJGZpbmRMYXN0ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1pdGVyYXRpb24tZnJvbS1sYXN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktaXRlcmF0aW9uLWZyb20tbGFzdC5qc1wiKS5maW5kTGFzdCk7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuZmluZExhc3RgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLmZpbmRsYXN0XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdmaW5kTGFzdCcsIGZ1bmN0aW9uIGZpbmRMYXN0KHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgcmV0dXJuICRmaW5kTGFzdChhVHlwZWRBcnJheSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuZmluZC1sYXN0LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS5pbnQzMi1hcnJheS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qc1wiKTtcblxuLy8gYEludDMyQXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdJbnQzMicsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuaW50MzItYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IuanNcIik7XG5cbi8vIGBJbnQ4QXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdJbnQ4JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LmludDgtYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNldC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tY2FsbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwuanNcIik7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHRvT2Zmc2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLW9mZnNldCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLW9mZnNldC5qc1wiKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG5cbnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG52YXIgSW50OEFycmF5ID0gZ2xvYmFsLkludDhBcnJheTtcbnZhciBJbnQ4QXJyYXlQcm90b3R5cGUgPSBJbnQ4QXJyYXkgJiYgSW50OEFycmF5LnByb3RvdHlwZTtcbnZhciAkc2V0ID0gSW50OEFycmF5UHJvdG90eXBlICYmIEludDhBcnJheVByb3RvdHlwZS5zZXQ7XG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG5cbnZhciBXT1JLU19XSVRIX09CSkVDVFNfQU5EX0dFTkVSSUNfT05fVFlQRURfQVJSQVlTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLXR5cGVkLWFycmF5cyAtLSByZXF1aXJlZCBmb3IgdGVzdGluZ1xuICB2YXIgYXJyYXkgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoMik7XG4gIGNhbGwoJHNldCwgYXJyYXksIHsgbGVuZ3RoOiAxLCAwOiAzIH0sIDEpO1xuICByZXR1cm4gYXJyYXlbMV0gIT09IDM7XG59KTtcblxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTEyOTQgYW5kIG90aGVyXG52YXIgVE9fT0JKRUNUX0JVRyA9IFdPUktTX1dJVEhfT0JKRUNUU19BTkRfR0VORVJJQ19PTl9UWVBFRF9BUlJBWVMgJiYgQXJyYXlCdWZmZXJWaWV3Q29yZS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFycmF5ID0gbmV3IEludDhBcnJheSgyKTtcbiAgYXJyYXkuc2V0KDEpO1xuICBhcnJheS5zZXQoJzInLCAxKTtcbiAgcmV0dXJuIGFycmF5WzBdICE9PSAwIHx8IGFycmF5WzFdICE9PSAyO1xufSk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnNldGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc2V0XG5leHBvcnRUeXBlZEFycmF5TWV0aG9kKCdzZXQnLCBmdW5jdGlvbiBzZXQoYXJyYXlMaWtlIC8qICwgb2Zmc2V0ICovKSB7XG4gIGFUeXBlZEFycmF5KHRoaXMpO1xuICB2YXIgb2Zmc2V0ID0gdG9PZmZzZXQoYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDEpO1xuICB2YXIgc3JjID0gdG9JbmRleGVkT2JqZWN0KGFycmF5TGlrZSk7XG4gIGlmIChXT1JLU19XSVRIX09CSkVDVFNfQU5EX0dFTkVSSUNfT05fVFlQRURfQVJSQVlTKSByZXR1cm4gY2FsbCgkc2V0LCB0aGlzLCBzcmMsIG9mZnNldCk7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgdmFyIGxlbiA9IGxlbmd0aE9mQXJyYXlMaWtlKHNyYyk7XG4gIHZhciBpbmRleCA9IDA7XG4gIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCcpO1xuICB3aGlsZSAoaW5kZXggPCBsZW4pIHRoaXNbb2Zmc2V0ICsgaW5kZXhdID0gc3JjW2luZGV4KytdO1xufSwgIVdPUktTX1dJVEhfT0JKRUNUU19BTkRfR0VORVJJQ19PTl9UWVBFRF9BUlJBWVMgfHwgVE9fT0JKRUNUX0JVRyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNldC5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkuc29ydC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy1jbGF1c2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMtY2xhdXNlLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIGludGVybmFsU29ydCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1zb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc29ydC5qc1wiKTtcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzXCIpO1xudmFyIEZGID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS1mZi12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLWZmLXZlcnNpb24uanNcIik7XG52YXIgSUVfT1JfRURHRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lbmdpbmUtaXMtaWUtb3ItZWRnZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS1pcy1pZS1vci1lZGdlLmpzXCIpO1xudmFyIFY4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS12OC12ZXJzaW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZW5naW5lLXY4LXZlcnNpb24uanNcIik7XG52YXIgV0VCS0lUID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VuZ2luZS13ZWJraXQtdmVyc2lvbi5qc1wiKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyIFVpbnQxNkFycmF5ID0gZ2xvYmFsLlVpbnQxNkFycmF5O1xudmFyIG5hdGl2ZVNvcnQgPSBVaW50MTZBcnJheSAmJiB1bmN1cnJ5VGhpcyhVaW50MTZBcnJheS5wcm90b3R5cGUuc29ydCk7XG5cbi8vIFdlYktpdFxudmFyIEFDQ0VQVF9JTkNPUlJFQ1RfQVJHVU1FTlRTID0gISFuYXRpdmVTb3J0ICYmICEoZmFpbHMoZnVuY3Rpb24gKCkge1xuICBuYXRpdmVTb3J0KG5ldyBVaW50MTZBcnJheSgyKSwgbnVsbCk7XG59KSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIG5hdGl2ZVNvcnQobmV3IFVpbnQxNkFycmF5KDIpLCB7fSk7XG59KSk7XG5cbnZhciBTVEFCTEVfU09SVCA9ICEhbmF0aXZlU29ydCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBmZWF0dXJlIGRldGVjdGlvbiBjYW4gYmUgdG9vIHNsb3csIHNvIGNoZWNrIGVuZ2luZXMgdmVyc2lvbnNcbiAgaWYgKFY4KSByZXR1cm4gVjggPCA3NDtcbiAgaWYgKEZGKSByZXR1cm4gRkYgPCA2NztcbiAgaWYgKElFX09SX0VER0UpIHJldHVybiB0cnVlO1xuICBpZiAoV0VCS0lUKSByZXR1cm4gV0VCS0lUIDwgNjAyO1xuXG4gIHZhciBhcnJheSA9IG5ldyBVaW50MTZBcnJheSg1MTYpO1xuICB2YXIgZXhwZWN0ZWQgPSBBcnJheSg1MTYpO1xuICB2YXIgaW5kZXgsIG1vZDtcblxuICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA1MTY7IGluZGV4KyspIHtcbiAgICBtb2QgPSBpbmRleCAlIDQ7XG4gICAgYXJyYXlbaW5kZXhdID0gNTE1IC0gaW5kZXg7XG4gICAgZXhwZWN0ZWRbaW5kZXhdID0gaW5kZXggLSAyICogbW9kICsgMztcbiAgfVxuXG4gIG5hdGl2ZVNvcnQoYXJyYXksIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIChhIC8gNCB8IDApIC0gKGIgLyA0IHwgMCk7XG4gIH0pO1xuXG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDUxNjsgaW5kZXgrKykge1xuICAgIGlmIChhcnJheVtpbmRleF0gIT09IGV4cGVjdGVkW2luZGV4XSkgcmV0dXJuIHRydWU7XG4gIH1cbn0pO1xuXG52YXIgZ2V0U29ydENvbXBhcmUgPSBmdW5jdGlvbiAoY29tcGFyZWZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoeCwgeSkge1xuICAgIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgcmV0dXJuICtjb21wYXJlZm4oeCwgeSkgfHwgMDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVja1xuICAgIGlmICh5ICE9PSB5KSByZXR1cm4gLTE7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2tcbiAgICBpZiAoeCAhPT0geCkgcmV0dXJuIDE7XG4gICAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkgcmV0dXJuIDEgLyB4ID4gMCAmJiAxIC8geSA8IDAgPyAxIDogLTE7XG4gICAgcmV0dXJuIHggPiB5O1xuICB9O1xufTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUuc29ydFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnc29ydCcsIGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gIGlmIChjb21wYXJlZm4gIT09IHVuZGVmaW5lZCkgYUNhbGxhYmxlKGNvbXBhcmVmbik7XG4gIGlmIChTVEFCTEVfU09SVCkgcmV0dXJuIG5hdGl2ZVNvcnQodGhpcywgY29tcGFyZWZuKTtcblxuICByZXR1cm4gaW50ZXJuYWxTb3J0KGFUeXBlZEFycmF5KHRoaXMpLCBnZXRTb3J0Q29tcGFyZShjb21wYXJlZm4pKTtcbn0sICFTVEFCTEVfU09SVCB8fCBBQ0NFUFRfSU5DT1JSRUNUX0FSR1VNRU5UUyk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnNvcnQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLWxvY2FsZS1zdHJpbmcuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBhcHBseSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1hcHBseSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLWFwcGx5LmpzXCIpO1xudmFyIEFycmF5QnVmZmVyVmlld0NvcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUuanNcIik7XG52YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZmFpbHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qc1wiKTtcbnZhciBhcnJheVNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktc2xpY2UuanNcIik7XG5cbnZhciBJbnQ4QXJyYXkgPSBnbG9iYWwuSW50OEFycmF5O1xudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyICR0b0xvY2FsZVN0cmluZyA9IFtdLnRvTG9jYWxlU3RyaW5nO1xuXG4vLyBpT1MgU2FmYXJpIDYueCBmYWlscyBoZXJlXG52YXIgVE9fTE9DQUxFX1NUUklOR19CVUcgPSAhIUludDhBcnJheSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICR0b0xvY2FsZVN0cmluZy5jYWxsKG5ldyBJbnQ4QXJyYXkoMSkpO1xufSk7XG5cbnZhciBGT1JDRUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBbMSwgMl0udG9Mb2NhbGVTdHJpbmcoKSAhPSBuZXcgSW50OEFycmF5KFsxLCAyXSkudG9Mb2NhbGVTdHJpbmcoKTtcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIEludDhBcnJheS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwgMl0pO1xufSk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b2xvY2FsZXN0cmluZ1xuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9Mb2NhbGVTdHJpbmcnLCBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZygpIHtcbiAgcmV0dXJuIGFwcGx5KFxuICAgICR0b0xvY2FsZVN0cmluZyxcbiAgICBUT19MT0NBTEVfU1RSSU5HX0JVRyA/IGFycmF5U2xpY2UoYVR5cGVkQXJyYXkodGhpcykpIDogYVR5cGVkQXJyYXkodGhpcyksXG4gICAgYXJyYXlTbGljZShhcmd1bWVudHMpXG4gICk7XG59LCBGT1JDRUQpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1sb2NhbGUtc3RyaW5nLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhcnJheVRvUmV2ZXJzZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktdG8tcmV2ZXJzZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS10by1yZXZlcnNlZC5qc1wiKTtcbnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LWJ1ZmZlci12aWV3LWNvcmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlLmpzXCIpO1xuXG52YXIgYVR5cGVkQXJyYXkgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5O1xudmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7XG52YXIgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3I7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvUmV2ZXJzZWRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnRvcmV2ZXJzZWRcbmV4cG9ydFR5cGVkQXJyYXlNZXRob2QoJ3RvUmV2ZXJzZWQnLCBmdW5jdGlvbiB0b1JldmVyc2VkKCkge1xuICByZXR1cm4gYXJyYXlUb1JldmVyc2VkKGFUeXBlZEFycmF5KHRoaXMpLCBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IodGhpcykpO1xufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnRvLXJldmVyc2VkLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2EtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWNhbGxhYmxlLmpzXCIpO1xudmFyIGFycmF5RnJvbUNvbnN0cnVjdG9yQW5kTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mcm9tLWNvbnN0cnVjdG9yLWFuZC1saXN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS1jb25zdHJ1Y3Rvci1hbmQtbGlzdC5qc1wiKTtcblxudmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTtcbnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtcbnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO1xudmFyIHNvcnQgPSB1bmN1cnJ5VGhpcyhBcnJheUJ1ZmZlclZpZXdDb3JlLlR5cGVkQXJyYXlQcm90b3R5cGUuc29ydCk7XG5cbi8vIGAlVHlwZWRBcnJheSUucHJvdG90eXBlLnRvU29ydGVkYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS50b3NvcnRlZFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9Tb3J0ZWQnLCBmdW5jdGlvbiB0b1NvcnRlZChjb21wYXJlRm4pIHtcbiAgaWYgKGNvbXBhcmVGbiAhPT0gdW5kZWZpbmVkKSBhQ2FsbGFibGUoY29tcGFyZUZuKTtcbiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTtcbiAgdmFyIEEgPSBhcnJheUZyb21Db25zdHJ1Y3RvckFuZExpc3QoZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yKE8pLCBPKTtcbiAgcmV0dXJuIHNvcnQoQSwgY29tcGFyZUZuKTtcbn0pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQzMi1hcnJheS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qc1wiKTtcblxuLy8gYFVpbnQzMkFycmF5YCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10eXBlZGFycmF5LW9iamVjdHNcbmNyZWF0ZVR5cGVkQXJyYXlDb25zdHJ1Y3RvcignVWludDMyJywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDMyLWFycmF5LmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS51aW50OC1hcnJheS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBjcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90eXBlZC1hcnJheS1jb25zdHJ1Y3Rvci5qc1wiKTtcblxuLy8gYFVpbnQ4QXJyYXlgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXR5cGVkYXJyYXktb2JqZWN0c1xuY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yKCdVaW50OCcsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtYXJyYXkuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LnVpbnQ4LWNsYW1wZWQtYXJyYXkuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgY3JlYXRlVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3R5cGVkLWFycmF5LWNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHlwZWQtYXJyYXktY29uc3RydWN0b3IuanNcIik7XG5cbi8vIGBVaW50OENsYW1wZWRBcnJheWAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdHlwZWRhcnJheS1vYmplY3RzXG5jcmVhdGVUeXBlZEFycmF5Q29uc3RydWN0b3IoJ1VpbnQ4JywgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59LCB0cnVlKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkudWludDgtY2xhbXBlZC1hcnJheS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMudHlwZWQtYXJyYXkud2l0aC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBhcnJheVdpdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktd2l0aCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXdpdGguanNcIik7XG52YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1idWZmZXItdmlldy1jb3JlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktYnVmZmVyLXZpZXctY29yZS5qc1wiKTtcbnZhciBpc0JpZ0ludEFycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWJpZy1pbnQtYXJyYXkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1iaWctaW50LWFycmF5LmpzXCIpO1xudmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8taW50ZWdlci1vci1pbmZpbml0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWludGVnZXItb3ItaW5maW5pdHkuanNcIik7XG52YXIgdG9CaWdJbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tYmlnLWludCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWJpZy1pbnQuanNcIik7XG5cbnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7XG52YXIgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3I7XG52YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtcblxudmFyIFBST1BFUl9PUkRFUiA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10aHJvdy1saXRlcmFsLCBlcy9uby10eXBlZC1hcnJheXMsIGVzL25vLWFycmF5LXByb3RvdHlwZS13aXRoIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nXG4gICAgbmV3IEludDhBcnJheSgxKVsnd2l0aCddKDIsIHsgdmFsdWVPZjogZnVuY3Rpb24gKCkgeyB0aHJvdyA4OyB9IH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIHNvbWUgZWFybHkgaW1wbGVtZW50YXRpb25zLCBsaWtlIFdlYktpdCwgZG9lcyBub3QgZm9sbG93IHRoZSBmaW5hbCBzZW1hbnRpY1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5L3B1bGwvODZcbiAgICByZXR1cm4gZXJyb3IgPT09IDg7XG4gIH1cbn0oKTtcblxuLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUud2l0aGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUud2l0aFxuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnd2l0aCcsIHsgJ3dpdGgnOiBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7XG4gIHZhciBPID0gYVR5cGVkQXJyYXkodGhpcyk7XG4gIHZhciByZWxhdGl2ZUluZGV4ID0gdG9JbnRlZ2VyT3JJbmZpbml0eShpbmRleCk7XG4gIHZhciBhY3R1YWxWYWx1ZSA9IGlzQmlnSW50QXJyYXkoTykgPyB0b0JpZ0ludCh2YWx1ZSkgOiArdmFsdWU7XG4gIHJldHVybiBhcnJheVdpdGgoTywgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yKE8pLCByZWxhdGl2ZUluZGV4LCBhY3R1YWxWYWx1ZSk7XG59IH1bJ3dpdGgnXSwgIVBST1BFUl9PUkRFUik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LndpdGguanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLndlYWstbWFwLmNvbnN0cnVjdG9yLmpzIjooKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxudmFyIEZSRUVaSU5HID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZyZWV6aW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnJlZXppbmcuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanNcIik7XG52YXIgSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzXCIpO1xudmFyIGNvbGxlY3Rpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24uanNcIik7XG52YXIgY29sbGVjdGlvbldlYWsgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi13ZWFrLmpzXCIpO1xudmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLW9iamVjdC5qc1wiKTtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qc1wiKS5lbmZvcmNlKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIE5BVElWRV9XRUFLX01BUCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWFrLW1hcC1iYXNpYy1kZXRlY3Rpb24uanNcIik7XG5cbnZhciAkT2JqZWN0ID0gT2JqZWN0O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWlzYXJyYXkgLS0gc2FmZVxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2V4dGVuc2libGUgLS0gc2FmZVxudmFyIGlzRXh0ZW5zaWJsZSA9ICRPYmplY3QuaXNFeHRlbnNpYmxlO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc2Zyb3plbiAtLSBzYWZlXG52YXIgaXNGcm96ZW4gPSAkT2JqZWN0LmlzRnJvemVuO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1pc3NlYWxlZCAtLSBzYWZlXG52YXIgaXNTZWFsZWQgPSAkT2JqZWN0LmlzU2VhbGVkO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1mcmVlemUgLS0gc2FmZVxudmFyIGZyZWV6ZSA9ICRPYmplY3QuZnJlZXplO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1zZWFsIC0tIHNhZmVcbnZhciBzZWFsID0gJE9iamVjdC5zZWFsO1xuXG52YXIgRlJPWkVOID0ge307XG52YXIgU0VBTEVEID0ge307XG52YXIgSVNfSUUxMSA9ICFnbG9iYWwuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gZ2xvYmFsO1xudmFyIEludGVybmFsV2Vha01hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbi8vIGBXZWFrTWFwYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy13ZWFrbWFwLWNvbnN0cnVjdG9yXG52YXIgJFdlYWtNYXAgPSBjb2xsZWN0aW9uKCdXZWFrTWFwJywgd3JhcHBlciwgY29sbGVjdGlvbldlYWspO1xudmFyIFdlYWtNYXBQcm90b3R5cGUgPSAkV2Vha01hcC5wcm90b3R5cGU7XG52YXIgbmF0aXZlU2V0ID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5zZXQpO1xuXG4vLyBDaGFrcmEgRWRnZSBidWc6IGFkZGluZyBmcm96ZW4gYXJyYXlzIHRvIFdlYWtNYXAgdW5mcmVlemUgdGhlbVxudmFyIGhhc01TRWRnZUZyZWV6aW5nQnVnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRlJFRVpJTkcgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBmcm96ZW5BcnJheSA9IGZyZWV6ZShbXSk7XG4gICAgbmF0aXZlU2V0KG5ldyAkV2Vha01hcCgpLCBmcm96ZW5BcnJheSwgMSk7XG4gICAgcmV0dXJuICFpc0Zyb3plbihmcm96ZW5BcnJheSk7XG4gIH0pO1xufTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuLy8gV2UgY2FuJ3QgdXNlIGZlYXR1cmUgZGV0ZWN0aW9uIGJlY2F1c2UgaXQgY3Jhc2ggc29tZSBvbGQgSUUgYnVpbGRzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvNDg1XG5pZiAoTkFUSVZFX1dFQUtfTUFQKSBpZiAoSVNfSUUxMSkge1xuICBJbnRlcm5hbFdlYWtNYXAgPSBjb2xsZWN0aW9uV2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCAnV2Vha01hcCcsIHRydWUpO1xuICBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlLmVuYWJsZSgpO1xuICB2YXIgbmF0aXZlRGVsZXRlID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZVsnZGVsZXRlJ10pO1xuICB2YXIgbmF0aXZlSGFzID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5oYXMpO1xuICB2YXIgbmF0aXZlR2V0ID0gdW5jdXJyeVRoaXMoV2Vha01hcFByb3RvdHlwZS5nZXQpO1xuICBkZWZpbmVCdWlsdElucyhXZWFrTWFwUHJvdG90eXBlLCB7XG4gICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGV0ZSh0aGlzLCBrZXkpIHx8IHN0YXRlLmZyb3plblsnZGVsZXRlJ10oa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZURlbGV0ZSh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KSB8fCBzdGF0ZS5mcm96ZW4uaGFzKGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVIYXModGhpcywga2V5KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlSGFzKHRoaXMsIGtleSkgPyBuYXRpdmVHZXQodGhpcywga2V5KSA6IHN0YXRlLmZyb3plbi5nZXQoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUdldCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICBuYXRpdmVIYXModGhpcywga2V5KSA/IG5hdGl2ZVNldCh0aGlzLCBrZXksIHZhbHVlKSA6IHN0YXRlLmZyb3plbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgbmF0aXZlU2V0KHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9KTtcbi8vIENoYWtyYSBFZGdlIGZyb3plbiBrZXlzIGZpeFxufSBlbHNlIGlmIChoYXNNU0VkZ2VGcmVlemluZ0J1ZygpKSB7XG4gIGRlZmluZUJ1aWx0SW5zKFdlYWtNYXBQcm90b3R5cGUsIHtcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgYXJyYXlJbnRlZ3JpdHlMZXZlbDtcbiAgICAgIGlmIChpc0FycmF5KGtleSkpIHtcbiAgICAgICAgaWYgKGlzRnJvemVuKGtleSkpIGFycmF5SW50ZWdyaXR5TGV2ZWwgPSBGUk9aRU47XG4gICAgICAgIGVsc2UgaWYgKGlzU2VhbGVkKGtleSkpIGFycmF5SW50ZWdyaXR5TGV2ZWwgPSBTRUFMRUQ7XG4gICAgICB9XG4gICAgICBuYXRpdmVTZXQodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoYXJyYXlJbnRlZ3JpdHlMZXZlbCA9PSBGUk9aRU4pIGZyZWV6ZShrZXkpO1xuICAgICAgaWYgKGFycmF5SW50ZWdyaXR5TGV2ZWwgPT0gU0VBTEVEKSBzZWFsKGtleSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0pO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBtb2R1bGUgZnJvbSBgY29yZS1qc0A0YCBzaW5jZSBpdCdzIHJlcGxhY2VkIHRvIG1vZHVsZSBiZWxvd1xuX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy53ZWFrLW1hcC5jb25zdHJ1Y3Rvci5qc1wiKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBET01JdGVyYWJsZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanNcIik7XG52YXIgRE9NVG9rZW5MaXN0UHJvdG90eXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RvbS10b2tlbi1saXN0LXByb3RvdHlwZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS10b2tlbi1saXN0LXByb3RvdHlwZS5qc1wiKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3ZWxsS25vd25TeW1ib2woJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9yTWV0aG9kcy52YWx1ZXM7XG5cbnZhciBoYW5kbGVQcm90b3R5cGUgPSBmdW5jdGlvbiAoQ29sbGVjdGlvblByb3RvdHlwZSwgQ09MTEVDVElPTl9OQU1FKSB7XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlKSB7XG4gICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykgdHJ5IHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW0lURVJBVE9SXSA9IEFycmF5VmFsdWVzO1xuICAgIH1cbiAgICBpZiAoIUNvbGxlY3Rpb25Qcm90b3R5cGVbVE9fU1RSSU5HX1RBR10pIHtcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShDb2xsZWN0aW9uUHJvdG90eXBlLCBUT19TVFJJTkdfVEFHLCBDT0xMRUNUSU9OX05BTUUpO1xuICAgIH1cbiAgICBpZiAoRE9NSXRlcmFibGVzW0NPTExFQ1RJT05fTkFNRV0pIGZvciAodmFyIE1FVEhPRF9OQU1FIGluIEFycmF5SXRlcmF0b3JNZXRob2RzKSB7XG4gICAgICAvLyBzb21lIENocm9tZSB2ZXJzaW9ucyBoYXZlIG5vbi1jb25maWd1cmFibGUgbWV0aG9kcyBvbiBET01Ub2tlbkxpc3RcbiAgICAgIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSAhPT0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKSB0cnkge1xuICAgICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoQ29sbGVjdGlvblByb3RvdHlwZSwgTUVUSE9EX05BTUUsIEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBDb2xsZWN0aW9uUHJvdG90eXBlW01FVEhPRF9OQU1FXSA9IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZvciAodmFyIENPTExFQ1RJT05fTkFNRSBpbiBET01JdGVyYWJsZXMpIHtcbiAgaGFuZGxlUHJvdG90eXBlKGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdICYmIGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdLnByb3RvdHlwZSwgQ09MTEVDVElPTl9OQU1FKTtcbn1cblxuaGFuZGxlUHJvdG90eXBlKERPTVRva2VuTGlzdFByb3RvdHlwZSwgJ0RPTVRva2VuTGlzdCcpO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5jb25zdHJ1Y3Rvci5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciB0cnlOb2RlUmVxdWlyZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90cnktbm9kZS1yZXF1aXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdHJ5LW5vZGUtcmVxdWlyZS5qc1wiKTtcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mYWlscyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzXCIpO1xudmFyIGNyZWF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qc1wiKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qc1wiKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHkuanNcIikuZik7XG52YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4uanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBlcnJvclRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Vycm9yLXRvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXRvLXN0cmluZy5qc1wiKTtcbnZhciBub3JtYWxpemVTdHJpbmdBcmd1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbm9ybWFsaXplLXN0cmluZy1hcmd1bWVudC5qc1wiKTtcbnZhciBET01FeGNlcHRpb25Db25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZG9tLWV4Y2VwdGlvbi1jb25zdGFudHMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20tZXhjZXB0aW9uLWNvbnN0YW50cy5qc1wiKTtcbnZhciBjbGVhckVycm9yU3RhY2sgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2stY2xlYXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhci5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xuXG52YXIgRE9NX0VYQ0VQVElPTiA9ICdET01FeGNlcHRpb24nO1xudmFyIERBVEFfQ0xPTkVfRVJSID0gJ0RBVEFfQ0xPTkVfRVJSJztcbnZhciBFcnJvciA9IGdldEJ1aWx0SW4oJ0Vycm9yJyk7XG4vLyBOb2RlSlMgPCAxNy4wIGRvZXMgbm90IGV4cG9zZSBgRE9NRXhjZXB0aW9uYCB0byBnbG9iYWxcbnZhciBOYXRpdmVET01FeGNlcHRpb24gPSBnZXRCdWlsdEluKERPTV9FWENFUFRJT04pIHx8IChmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gTm9kZUpTIDwgMTUuMCBkb2VzIG5vdCBleHBvc2UgYE1lc3NhZ2VDaGFubmVsYCB0byBnbG9iYWxcbiAgICB2YXIgTWVzc2FnZUNoYW5uZWwgPSBnZXRCdWlsdEluKCdNZXNzYWdlQ2hhbm5lbCcpIHx8IHRyeU5vZGVSZXF1aXJlKCd3b3JrZXJfdGhyZWFkcycpLk1lc3NhZ2VDaGFubmVsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby13ZWFrLW1hcCwgdW5pY29ybi9yZXF1aXJlLXBvc3QtbWVzc2FnZS10YXJnZXQtb3JpZ2luIC0tIHNhZmVcbiAgICBuZXcgTWVzc2FnZUNoYW5uZWwoKS5wb3J0MS5wb3N0TWVzc2FnZShuZXcgV2Vha01hcCgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IubmFtZSA9PSBEQVRBX0NMT05FX0VSUiAmJiBlcnJvci5jb2RlID09IDI1KSByZXR1cm4gZXJyb3IuY29uc3RydWN0b3I7XG4gIH1cbn0pKCk7XG52YXIgTmF0aXZlRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gTmF0aXZlRE9NRXhjZXB0aW9uICYmIE5hdGl2ZURPTUV4Y2VwdGlvbi5wcm90b3R5cGU7XG52YXIgRXJyb3JQcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihET01fRVhDRVBUSU9OKTtcbnZhciBIQVNfU1RBQ0sgPSAnc3RhY2snIGluIEVycm9yKERPTV9FWENFUFRJT04pO1xuXG52YXIgY29kZUZvciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBuYW1lKSAmJiBET01FeGNlcHRpb25Db25zdGFudHNbbmFtZV0ubSA/IERPTUV4Y2VwdGlvbkNvbnN0YW50c1tuYW1lXS5jIDogMDtcbn07XG5cbnZhciAkRE9NRXhjZXB0aW9uID0gZnVuY3Rpb24gRE9NRXhjZXB0aW9uKCkge1xuICBhbkluc3RhbmNlKHRoaXMsIERPTUV4Y2VwdGlvblByb3RvdHlwZSk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgbWVzc2FnZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KGFyZ3VtZW50c0xlbmd0aCA8IDEgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMF0pO1xuICB2YXIgbmFtZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KGFyZ3VtZW50c0xlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV0sICdFcnJvcicpO1xuICB2YXIgY29kZSA9IGNvZGVGb3IobmFtZSk7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IERPTV9FWENFUFRJT04sXG4gICAgbmFtZTogbmFtZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGNvZGU6IGNvZGVcbiAgfSk7XG4gIGlmICghREVTQ1JJUFRPUlMpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxuICBpZiAoSEFTX1NUQUNLKSB7XG4gICAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IubmFtZSA9IERPTV9FWENFUFRJT047XG4gICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0YWNrJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIGNsZWFyRXJyb3JTdGFjayhlcnJvci5zdGFjaywgMSkpKTtcbiAgfVxufTtcblxudmFyIERPTUV4Y2VwdGlvblByb3RvdHlwZSA9ICRET01FeGNlcHRpb24ucHJvdG90eXBlID0gY3JlYXRlKEVycm9yUHJvdG90eXBlKTtcblxudmFyIGNyZWF0ZUdldHRlckRlc2NyaXB0b3IgPSBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZ2V0OiBnZXQgfTtcbn07XG5cbnZhciBnZXR0ZXJGb3IgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBjcmVhdGVHZXR0ZXJEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKVtrZXldO1xuICB9KTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICAvLyBgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb2RlYCBnZXR0ZXJcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvZGUnLCBnZXR0ZXJGb3IoJ2NvZGUnKSk7XG4gIC8vIGBET01FeGNlcHRpb24ucHJvdG90eXBlLm1lc3NhZ2VgIGdldHRlclxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoRE9NRXhjZXB0aW9uUHJvdG90eXBlLCAnbWVzc2FnZScsIGdldHRlckZvcignbWVzc2FnZScpKTtcbiAgLy8gYERPTUV4Y2VwdGlvbi5wcm90b3R5cGUubmFtZWAgZ2V0dGVyXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihET01FeGNlcHRpb25Qcm90b3R5cGUsICduYW1lJywgZ2V0dGVyRm9yKCduYW1lJykpO1xufVxuXG5kZWZpbmVQcm9wZXJ0eShET01FeGNlcHRpb25Qcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCAkRE9NRXhjZXB0aW9uKSk7XG5cbi8vIEZGMzYtIERPTUV4Y2VwdGlvbiBpcyBhIGZ1bmN0aW9uLCBidXQgY2FuJ3QgYmUgY29uc3RydWN0ZWRcbnZhciBJTkNPUlJFQ1RfQ09OU1RSVUNUT1IgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhKG5ldyBOYXRpdmVET01FeGNlcHRpb24oKSBpbnN0YW5jZW9mIEVycm9yKTtcbn0pO1xuXG4vLyBTYWZhcmkgMTAuMSAvIENocm9tZSAzMi0gLyBJRTgtIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgYnVnc1xudmFyIElOQ09SUkVDVF9UT19TVFJJTkcgPSBJTkNPUlJFQ1RfQ09OU1RSVUNUT1IgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gRXJyb3JQcm90b3R5cGUudG9TdHJpbmcgIT09IGVycm9yVG9TdHJpbmcgfHwgU3RyaW5nKG5ldyBOYXRpdmVET01FeGNlcHRpb24oMSwgMikpICE9PSAnMjogMSc7XG59KTtcblxuLy8gRGVubyAxLjYuMy0gRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb2RlIGp1c3QgbWlzc2VkXG52YXIgSU5DT1JSRUNUX0NPREUgPSBJTkNPUlJFQ1RfQ09OU1RSVUNUT1IgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbigxLCAnRGF0YUNsb25lRXJyb3InKS5jb2RlICE9PSAyNTtcbn0pO1xuXG4vLyBEZW5vIDEuNi4zLSBET01FeGNlcHRpb24gY29uc3RhbnRzIGp1c3QgbWlzc2VkXG52YXIgTUlTU0VEX0NPTlNUQU5UUyA9IElOQ09SUkVDVF9DT05TVFJVQ1RPUlxuICB8fCBOYXRpdmVET01FeGNlcHRpb25bREFUQV9DTE9ORV9FUlJdICE9PSAyNVxuICB8fCBOYXRpdmVET01FeGNlcHRpb25Qcm90b3R5cGVbREFUQV9DTE9ORV9FUlJdICE9PSAyNTtcblxudmFyIEZPUkNFRF9DT05TVFJVQ1RPUiA9IElTX1BVUkUgPyBJTkNPUlJFQ1RfVE9fU1RSSU5HIHx8IElOQ09SUkVDVF9DT0RFIHx8IE1JU1NFRF9DT05TVEFOVFMgOiBJTkNPUlJFQ1RfQ09OU1RSVUNUT1I7XG5cbi8vIGBET01FeGNlcHRpb25gIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2lkbC1ET01FeGNlcHRpb25cbiQoeyBnbG9iYWw6IHRydWUsIGNvbnN0cnVjdG9yOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRF9DT05TVFJVQ1RPUiB9LCB7XG4gIERPTUV4Y2VwdGlvbjogRk9SQ0VEX0NPTlNUUlVDVE9SID8gJERPTUV4Y2VwdGlvbiA6IE5hdGl2ZURPTUV4Y2VwdGlvblxufSk7XG5cbnZhciBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uID0gZ2V0QnVpbHRJbihET01fRVhDRVBUSU9OKTtcbnZhciBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbi5wcm90b3R5cGU7XG5cbmlmIChJTkNPUlJFQ1RfVE9fU1RSSU5HICYmIChJU19QVVJFIHx8IE5hdGl2ZURPTUV4Y2VwdGlvbiA9PT0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbikpIHtcbiAgZGVmaW5lQnVpbHRJbihQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlLCAndG9TdHJpbmcnLCBlcnJvclRvU3RyaW5nKTtcbn1cblxuaWYgKElOQ09SUkVDVF9DT0RFICYmIERFU0NSSVBUT1JTICYmIE5hdGl2ZURPTUV4Y2VwdGlvbiA9PT0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbikge1xuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoUG9seWZpbGxlZERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvZGUnLCBjcmVhdGVHZXR0ZXJEZXNjcmlwdG9yKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29kZUZvcihhbk9iamVjdCh0aGlzKS5uYW1lKTtcbiAgfSkpO1xufVxuXG4vLyBgRE9NRXhjZXB0aW9uYCBjb25zdGFudHNcbmZvciAodmFyIGtleSBpbiBET01FeGNlcHRpb25Db25zdGFudHMpIGlmIChoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBrZXkpKSB7XG4gIHZhciBjb25zdGFudCA9IERPTUV4Y2VwdGlvbkNvbnN0YW50c1trZXldO1xuICB2YXIgY29uc3RhbnROYW1lID0gY29uc3RhbnQucztcbiAgdmFyIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNiwgY29uc3RhbnQuYyk7XG4gIGlmICghaGFzT3duKFBvbHlmaWxsZWRET01FeGNlcHRpb24sIGNvbnN0YW50TmFtZSkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uLCBjb25zdGFudE5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG4gIGlmICghaGFzT3duKFBvbHlmaWxsZWRET01FeGNlcHRpb25Qcm90b3R5cGUsIGNvbnN0YW50TmFtZSkpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlLCBjb25zdGFudE5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tZXhjZXB0aW9uLmNvbnN0cnVjdG9yLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5zdGFjay5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gKF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qc1wiKS5mKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkLmpzXCIpO1xudmFyIG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL25vcm1hbGl6ZS1zdHJpbmctYXJndW1lbnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9ub3JtYWxpemUtc3RyaW5nLWFyZ3VtZW50LmpzXCIpO1xudmFyIERPTUV4Y2VwdGlvbkNvbnN0YW50cyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kb20tZXhjZXB0aW9uLWNvbnN0YW50cyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1leGNlcHRpb24tY29uc3RhbnRzLmpzXCIpO1xudmFyIGNsZWFyRXJyb3JTdGFjayA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9lcnJvci1zdGFjay1jbGVhciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Vycm9yLXN0YWNrLWNsZWFyLmpzXCIpO1xudmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVzY3JpcHRvcnMuanNcIik7XG52YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1wdXJlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcHVyZS5qc1wiKTtcblxudmFyIERPTV9FWENFUFRJT04gPSAnRE9NRXhjZXB0aW9uJztcbnZhciBFcnJvciA9IGdldEJ1aWx0SW4oJ0Vycm9yJyk7XG52YXIgTmF0aXZlRE9NRXhjZXB0aW9uID0gZ2V0QnVpbHRJbihET01fRVhDRVBUSU9OKTtcblxudmFyICRET01FeGNlcHRpb24gPSBmdW5jdGlvbiBET01FeGNlcHRpb24oKSB7XG4gIGFuSW5zdGFuY2UodGhpcywgRE9NRXhjZXB0aW9uUHJvdG90eXBlKTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtZXNzYWdlID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoYXJndW1lbnRzTGVuZ3RoIDwgMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXSk7XG4gIHZhciBuYW1lID0gbm9ybWFsaXplU3RyaW5nQXJndW1lbnQoYXJndW1lbnRzTGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXSwgJ0Vycm9yJyk7XG4gIHZhciB0aGF0ID0gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKTtcbiAgdmFyIGVycm9yID0gRXJyb3IobWVzc2FnZSk7XG4gIGVycm9yLm5hbWUgPSBET01fRVhDRVBUSU9OO1xuICBkZWZpbmVQcm9wZXJ0eSh0aGF0LCAnc3RhY2snLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgY2xlYXJFcnJvclN0YWNrKGVycm9yLnN0YWNrLCAxKSkpO1xuICBpbmhlcml0SWZSZXF1aXJlZCh0aGF0LCB0aGlzLCAkRE9NRXhjZXB0aW9uKTtcbiAgcmV0dXJuIHRoYXQ7XG59O1xuXG52YXIgRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gJERPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBOYXRpdmVET01FeGNlcHRpb24ucHJvdG90eXBlO1xuXG52YXIgRVJST1JfSEFTX1NUQUNLID0gJ3N0YWNrJyBpbiBFcnJvcihET01fRVhDRVBUSU9OKTtcbnZhciBET01fRVhDRVBUSU9OX0hBU19TVEFDSyA9ICdzdGFjaycgaW4gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbigxLCAyKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZVxudmFyIGRlc2NyaXB0b3IgPSBOYXRpdmVET01FeGNlcHRpb24gJiYgREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsIERPTV9FWENFUFRJT04pO1xuXG4vLyBCdW4gfiAwLjEuMSBET01FeGNlcHRpb24gaGF2ZSBpbmNvcnJlY3QgZGVzY3JpcHRvciBhbmQgd2UgY2FuJ3QgcmVkZWZpbmUgaXRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9KYXJyZWQtU3VtbmVyL2J1bi9pc3N1ZXMvMzk5XG52YXIgQlVHR1lfREVTQ1JJUFRPUiA9ICEhZGVzY3JpcHRvciAmJiAhKGRlc2NyaXB0b3Iud3JpdGFibGUgJiYgZGVzY3JpcHRvci5jb25maWd1cmFibGUpO1xuXG52YXIgRk9SQ0VEX0NPTlNUUlVDVE9SID0gRVJST1JfSEFTX1NUQUNLICYmICFCVUdHWV9ERVNDUklQVE9SICYmICFET01fRVhDRVBUSU9OX0hBU19TVEFDSztcblxuLy8gYERPTUV4Y2VwdGlvbmAgY29uc3RydWN0b3IgcGF0Y2ggZm9yIGAuc3RhY2tgIHdoZXJlIGl0J3MgcmVxdWlyZWRcbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtRE9NRXhjZXB0aW9uLXNwZWNpYWxuZXNzXG4kKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRF9DT05TVFJVQ1RPUiB9LCB7IC8vIFRPRE86IGZpeCBleHBvcnQgbG9naWNcbiAgRE9NRXhjZXB0aW9uOiBGT1JDRURfQ09OU1RSVUNUT1IgPyAkRE9NRXhjZXB0aW9uIDogTmF0aXZlRE9NRXhjZXB0aW9uXG59KTtcblxudmFyIFBvbHlmaWxsZWRET01FeGNlcHRpb24gPSBnZXRCdWlsdEluKERPTV9FWENFUFRJT04pO1xudmFyIFBvbHlmaWxsZWRET01FeGNlcHRpb25Qcm90b3R5cGUgPSBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uLnByb3RvdHlwZTtcblxuaWYgKFBvbHlmaWxsZWRET01FeGNlcHRpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgIT09IFBvbHlmaWxsZWRET01FeGNlcHRpb24pIHtcbiAgaWYgKCFJU19QVVJFKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoUG9seWZpbGxlZERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIFBvbHlmaWxsZWRET01FeGNlcHRpb24pKTtcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBET01FeGNlcHRpb25Db25zdGFudHMpIGlmIChoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBrZXkpKSB7XG4gICAgdmFyIGNvbnN0YW50ID0gRE9NRXhjZXB0aW9uQ29uc3RhbnRzW2tleV07XG4gICAgdmFyIGNvbnN0YW50TmFtZSA9IGNvbnN0YW50LnM7XG4gICAgaWYgKCFoYXNPd24oUG9seWZpbGxlZERPTUV4Y2VwdGlvbiwgY29uc3RhbnROYW1lKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkoUG9seWZpbGxlZERPTUV4Y2VwdGlvbiwgY29uc3RhbnROYW1lLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNiwgY29uc3RhbnQuYykpO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi5zdGFjay5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1leGNlcHRpb24udG8tc3RyaW5nLXRhZy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1idWlsdC1pbi5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xuXG52YXIgRE9NX0VYQ0VQVElPTiA9ICdET01FeGNlcHRpb24nO1xuXG4vLyBgRE9NRXhjZXB0aW9uLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXWAgcHJvcGVydHlcbnNldFRvU3RyaW5nVGFnKGdldEJ1aWx0SW4oRE9NX0VYQ0VQVElPTiksIERPTV9FWENFUFRJT04pO1xuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWV4Y2VwdGlvbi50by1zdHJpbmctdGFnLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuc2VsZi5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2V4cG9ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcblxudmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmVcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBJTkNPUlJFQ1RfVkFMVUUgPSBnbG9iYWwuc2VsZiAhPT0gZ2xvYmFsO1xuXG4vLyBgc2VsZmAgZ2V0dGVyXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93aW5kb3ctb2JqZWN0Lmh0bWwjZG9tLXNlbGZcbnRyeSB7XG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsLCAnc2VsZicpO1xuICAgIC8vIHNvbWUgZW5naW5lcyBoYXZlIGBzZWxmYCwgYnV0IHdpdGggaW5jb3JyZWN0IGRlc2NyaXB0b3JcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGVub2xhbmQvZGVuby9pc3N1ZXMvMTU3NjVcbiAgICBpZiAoSU5DT1JSRUNUX1ZBTFVFIHx8ICFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLmdldCB8fCAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG4gICAgICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoZ2xvYmFsLCAnc2VsZicsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBzZWxmKCkge1xuICAgICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gc2VsZih2YWx1ZSkge1xuICAgICAgICAgIGlmICh0aGlzICE9PSBnbG9iYWwpIHRocm93ICRUeXBlRXJyb3IoJ0lsbGVnYWwgaW52b2NhdGlvbicpO1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbCwgJ3NlbGYnLCB7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSAkKHsgZ2xvYmFsOiB0cnVlLCBzaW1wbGU6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX1ZBTFVFIH0sIHtcbiAgICBzZWxmOiBnbG9iYWxcbiAgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5zZWxmLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuc3RydWN0dXJlZC1jbG9uZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXB1cmUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1wdXJlLmpzXCIpO1xudmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXhwb3J0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZXhwb3J0LmpzXCIpO1xudmFyIGdsb2JhbCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nbG9iYWwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nbG9iYWwuanNcIik7XG52YXIgZ2V0QnVpbHRpbiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanNcIik7XG52YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tdW5jdXJyeS10aGlzLmpzXCIpO1xudmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ZhaWxzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZmFpbHMuanNcIik7XG52YXIgdWlkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3VpZCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3VpZC5qc1wiKTtcbnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLWNhbGxhYmxlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtY2FsbGFibGUuanNcIik7XG52YXIgaXNDb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9pcy1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWNvbnN0cnVjdG9yLmpzXCIpO1xudmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLW51bGwtb3ItdW5kZWZpbmVkICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtbnVsbC1vci11bmRlZmluZWQuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyIGlzU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2lzLXN5bWJvbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXN5bWJvbC5qc1wiKTtcbnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzXCIpO1xudmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FuLW9iamVjdCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qc1wiKTtcbnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NsYXNzb2YgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jbGFzc29mLmpzXCIpO1xudmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9oYXMtb3duLXByb3BlcnR5ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eS5qc1wiKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanNcIik7XG52YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1ub24tZW51bWVyYWJsZS1wcm9wZXJ0eS5qc1wiKTtcbnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9sZW5ndGgtb2YtYXJyYXktbGlrZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2xlbmd0aC1vZi1hcnJheS1saWtlLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xudmFyIGdldFJlZ0V4cEZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3JlZ2V4cC1nZXQtZmxhZ3MgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZ2V0LWZsYWdzLmpzXCIpO1xudmFyIE1hcEhlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvbWFwLWhlbHBlcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9tYXAtaGVscGVycy5qc1wiKTtcbnZhciBTZXRIZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3NldC1oZWxwZXJzICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2V0LWhlbHBlcnMuanNcIik7XG52YXIgRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZXJyb3Itc3RhY2staW5zdGFsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lcnJvci1zdGFjay1pbnN0YWxsYWJsZS5qc1wiKTtcbnZhciBQUk9QRVJfVFJBTlNGRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc3RydWN0dXJlZC1jbG9uZS1wcm9wZXItdHJhbnNmZXIgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJ1Y3R1cmVkLWNsb25lLXByb3Blci10cmFuc2Zlci5qc1wiKTtcblxudmFyIE9iamVjdCA9IGdsb2JhbC5PYmplY3Q7XG52YXIgQXJyYXkgPSBnbG9iYWwuQXJyYXk7XG52YXIgRGF0ZSA9IGdsb2JhbC5EYXRlO1xudmFyIEVycm9yID0gZ2xvYmFsLkVycm9yO1xudmFyIEV2YWxFcnJvciA9IGdsb2JhbC5FdmFsRXJyb3I7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xudmFyIFJlZmVyZW5jZUVycm9yID0gZ2xvYmFsLlJlZmVyZW5jZUVycm9yO1xudmFyIFN5bnRheEVycm9yID0gZ2xvYmFsLlN5bnRheEVycm9yO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgVVJJRXJyb3IgPSBnbG9iYWwuVVJJRXJyb3I7XG52YXIgUGVyZm9ybWFuY2VNYXJrID0gZ2xvYmFsLlBlcmZvcm1hbmNlTWFyaztcbnZhciBXZWJBc3NlbWJseSA9IGdsb2JhbC5XZWJBc3NlbWJseTtcbnZhciBDb21waWxlRXJyb3IgPSBXZWJBc3NlbWJseSAmJiBXZWJBc3NlbWJseS5Db21waWxlRXJyb3IgfHwgRXJyb3I7XG52YXIgTGlua0Vycm9yID0gV2ViQXNzZW1ibHkgJiYgV2ViQXNzZW1ibHkuTGlua0Vycm9yIHx8IEVycm9yO1xudmFyIFJ1bnRpbWVFcnJvciA9IFdlYkFzc2VtYmx5ICYmIFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvciB8fCBFcnJvcjtcbnZhciBET01FeGNlcHRpb24gPSBnZXRCdWlsdGluKCdET01FeGNlcHRpb24nKTtcbnZhciBNYXAgPSBNYXBIZWxwZXJzLk1hcDtcbnZhciBtYXBIYXMgPSBNYXBIZWxwZXJzLmhhcztcbnZhciBtYXBHZXQgPSBNYXBIZWxwZXJzLmdldDtcbnZhciBtYXBTZXQgPSBNYXBIZWxwZXJzLnNldDtcbnZhciBTZXQgPSBTZXRIZWxwZXJzLlNldDtcbnZhciBzZXRBZGQgPSBTZXRIZWxwZXJzLmFkZDtcbnZhciBvYmplY3RLZXlzID0gZ2V0QnVpbHRpbignT2JqZWN0JywgJ2tleXMnKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgdGhpc0Jvb2xlYW5WYWx1ZSA9IHVuY3VycnlUaGlzKHRydWUudmFsdWVPZik7XG52YXIgdGhpc051bWJlclZhbHVlID0gdW5jdXJyeVRoaXMoMS4wLnZhbHVlT2YpO1xudmFyIHRoaXNTdHJpbmdWYWx1ZSA9IHVuY3VycnlUaGlzKCcnLnZhbHVlT2YpO1xudmFyIHRoaXNUaW1lVmFsdWUgPSB1bmN1cnJ5VGhpcyhEYXRlLnByb3RvdHlwZS5nZXRUaW1lKTtcbnZhciBQRVJGT1JNQU5DRV9NQVJLID0gdWlkKCdzdHJ1Y3R1cmVkQ2xvbmUnKTtcbnZhciBEQVRBX0NMT05FX0VSUk9SID0gJ0RhdGFDbG9uZUVycm9yJztcbnZhciBUUkFOU0ZFUlJJTkcgPSAnVHJhbnNmZXJyaW5nJztcblxudmFyIGNoZWNrQmFzaWNTZW1hbnRpYyA9IGZ1bmN0aW9uIChzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbikge1xuICByZXR1cm4gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2V0MSA9IG5ldyBnbG9iYWwuU2V0KFs3XSk7XG4gICAgdmFyIHNldDIgPSBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbihzZXQxKTtcbiAgICB2YXIgbnVtYmVyID0gc3RydWN0dXJlZENsb25lSW1wbGVtZW50YXRpb24oT2JqZWN0KDcpKTtcbiAgICByZXR1cm4gc2V0MiA9PSBzZXQxIHx8ICFzZXQyLmhhcyg3KSB8fCB0eXBlb2YgbnVtYmVyICE9ICdvYmplY3QnIHx8IG51bWJlciAhPSA3O1xuICB9KSAmJiBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbjtcbn07XG5cbnZhciBjaGVja0Vycm9yc0Nsb25pbmcgPSBmdW5jdGlvbiAoc3RydWN0dXJlZENsb25lSW1wbGVtZW50YXRpb24sICRFcnJvcikge1xuICByZXR1cm4gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgJEVycm9yKCk7XG4gICAgdmFyIHRlc3QgPSBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbih7IGE6IGVycm9yLCBiOiBlcnJvciB9KTtcbiAgICByZXR1cm4gISh0ZXN0ICYmIHRlc3QuYSA9PT0gdGVzdC5iICYmIHRlc3QuYSBpbnN0YW5jZW9mICRFcnJvciAmJiB0ZXN0LmEuc3RhY2sgPT09IGVycm9yLnN0YWNrKTtcbiAgfSk7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2h0bWwvcHVsbC81NzQ5XG52YXIgY2hlY2tOZXdFcnJvcnNDbG9uaW5nU2VtYW50aWMgPSBmdW5jdGlvbiAoc3RydWN0dXJlZENsb25lSW1wbGVtZW50YXRpb24pIHtcbiAgcmV0dXJuICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRlc3QgPSBzdHJ1Y3R1cmVkQ2xvbmVJbXBsZW1lbnRhdGlvbihuZXcgZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yKFsxXSwgUEVSRk9STUFOQ0VfTUFSSywgeyBjYXVzZTogMyB9KSk7XG4gICAgcmV0dXJuIHRlc3QubmFtZSAhPSAnQWdncmVnYXRlRXJyb3InIHx8IHRlc3QuZXJyb3JzWzBdICE9IDEgfHwgdGVzdC5tZXNzYWdlICE9IFBFUkZPUk1BTkNFX01BUksgfHwgdGVzdC5jYXVzZSAhPSAzO1xuICB9KTtcbn07XG5cbi8vIEZGOTQrLCBTYWZhcmkgMTUuNCssIENocm9tZSA5OCssIE5vZGVKUyAxNy4wKywgRGVubyAxLjEzK1xuLy8gRkY8MTAzIGFuZCBTYWZhcmkgaW1wbGVtZW50YXRpb25zIGNhbid0IGNsb25lIGVycm9yc1xuLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU1NjYwNFxuLy8gRkYxMDMgY2FuIGNsb25lIGVycm9ycywgYnV0IGAuc3RhY2tgIG9mIGNsb25lIGlzIGFuIGVtcHR5IHN0cmluZ1xuLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc3ODc2MlxuLy8gRkYxMDQrIGZpeGVkIGl0IG9uIHVzdWFsIGVycm9ycywgYnV0IG5vdCBvbiBET01FeGNlcHRpb25zXG4vLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzc3MzIxXG4vLyBDaHJvbWUgPDEwMiByZXR1cm5zIGBudWxsYCBpZiBjbG9uZWQgb2JqZWN0IGNvbnRhaW5zIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gb25lIGVycm9yXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjU0MlxuLy8gTm9kZUpTIGltcGxlbWVudGF0aW9uIGNhbid0IGNsb25lIERPTUV4Y2VwdGlvbnNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDEwMzhcbi8vIG9ubHkgRkYxMDMrIHN1cHBvcnRzIG5ldyAoaHRtbC81NzQ5KSBlcnJvciBjbG9uaW5nIHNlbWFudGljXG52YXIgbmF0aXZlU3RydWN0dXJlZENsb25lID0gZ2xvYmFsLnN0cnVjdHVyZWRDbG9uZTtcblxudmFyIEZPUkNFRF9SRVBMQUNFTUVOVCA9IElTX1BVUkVcbiAgfHwgIWNoZWNrRXJyb3JzQ2xvbmluZyhuYXRpdmVTdHJ1Y3R1cmVkQ2xvbmUsIEVycm9yKVxuICB8fCAhY2hlY2tFcnJvcnNDbG9uaW5nKG5hdGl2ZVN0cnVjdHVyZWRDbG9uZSwgRE9NRXhjZXB0aW9uKVxuICB8fCAhY2hlY2tOZXdFcnJvcnNDbG9uaW5nU2VtYW50aWMobmF0aXZlU3RydWN0dXJlZENsb25lKTtcblxuLy8gQ2hyb21lIDgyKywgU2FmYXJpIDE0LjErLCBEZW5vIDEuMTErXG4vLyBDaHJvbWUgNzgtODEgaW1wbGVtZW50YXRpb24gc3dhcHMgYC5uYW1lYCBhbmQgYC5tZXNzYWdlYCBvZiBjbG9uZWQgYERPTUV4Y2VwdGlvbmBcbi8vIENocm9tZSByZXR1cm5zIGBudWxsYCBpZiBjbG9uZWQgb2JqZWN0IGNvbnRhaW5zIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gb25lIGVycm9yXG4vLyBTYWZhcmkgMTQuMSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGNsb25lIHNvbWUgYFJlZ0V4cGAgZmxhZ3MsIHNvIHJlcXVpcmVzIGEgd29ya2Fyb3VuZFxuLy8gU2FmYXJpIGltcGxlbWVudGF0aW9uIGNhbid0IGNsb25lIGVycm9yc1xuLy8gRGVubyAxLjItMS4xMCBpbXBsZW1lbnRhdGlvbnMgdG9vIG5haXZlXG4vLyBOb2RlSlMgMTYuMCsgZG9lcyBub3QgaGF2ZSBgUGVyZm9ybWFuY2VNYXJrYCBjb25zdHJ1Y3RvclxuLy8gTm9kZUpTIDwxNy4yIHN0cnVjdHVyZWQgY2xvbmluZyBpbXBsZW1lbnRhdGlvbiBmcm9tIGBwZXJmb3JtYW5jZS5tYXJrYCBpcyB0b28gbmFpdmVcbi8vIGFuZCBjYW4ndCBjbG9uZSwgZm9yIGV4YW1wbGUsIGBSZWdFeHBgIG9yIHNvbWUgYm94ZWQgcHJpbWl0aXZlc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80MDg0MFxuLy8gbm8gb25lIG9mIHRob3NlIGltcGxlbWVudGF0aW9ucyBzdXBwb3J0cyBuZXcgKGh0bWwvNTc0OSkgZXJyb3IgY2xvbmluZyBzZW1hbnRpY1xudmFyIHN0cnVjdHVyZWRDbG9uZUZyb21NYXJrID0gIW5hdGl2ZVN0cnVjdHVyZWRDbG9uZSAmJiBjaGVja0Jhc2ljU2VtYW50aWMoZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiBuZXcgUGVyZm9ybWFuY2VNYXJrKFBFUkZPUk1BTkNFX01BUkssIHsgZGV0YWlsOiB2YWx1ZSB9KS5kZXRhaWw7XG59KTtcblxudmFyIG5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUgPSBjaGVja0Jhc2ljU2VtYW50aWMobmF0aXZlU3RydWN0dXJlZENsb25lKSB8fCBzdHJ1Y3R1cmVkQ2xvbmVGcm9tTWFyaztcblxudmFyIHRocm93VW5jbG9uZWFibGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdVbmNsb25lYWJsZSB0eXBlOiAnICsgdHlwZSwgREFUQV9DTE9ORV9FUlJPUik7XG59O1xuXG52YXIgdGhyb3dVbnBvbHlmaWxsYWJsZSA9IGZ1bmN0aW9uICh0eXBlLCBhY3Rpb24pIHtcbiAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbigoYWN0aW9uIHx8ICdDbG9uaW5nJykgKyAnIG9mICcgKyB0eXBlICsgJyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiB0aGlzIGVuZ2luZScsIERBVEFfQ0xPTkVfRVJST1IpO1xufTtcblxudmFyIHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUgPSBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHtcbiAgaWYgKCFuYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKSB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICByZXR1cm4gbmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG59O1xuXG52YXIgY3JlYXRlRGF0YVRyYW5zZmVyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZGF0YVRyYW5zZmVyO1xuICB0cnkge1xuICAgIGRhdGFUcmFuc2ZlciA9IG5ldyBnbG9iYWwuRGF0YVRyYW5zZmVyKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGFUcmFuc2ZlciA9IG5ldyBnbG9iYWwuQ2xpcGJvYXJkRXZlbnQoJycpLmNsaXBib2FyZERhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IyKSB7IC8qIGVtcHR5ICovIH1cbiAgfVxuICByZXR1cm4gZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5pdGVtcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMgPyBkYXRhVHJhbnNmZXIgOiBudWxsO1xufTtcblxudmFyIGNsb25lQnVmZmVyID0gZnVuY3Rpb24gKHZhbHVlLCBtYXAsICR0eXBlKSB7XG4gIGlmIChtYXBIYXMobWFwLCB2YWx1ZSkpIHJldHVybiBtYXBHZXQobWFwLCB2YWx1ZSk7XG5cbiAgdmFyIHR5cGUgPSAkdHlwZSB8fCBjbGFzc29mKHZhbHVlKTtcbiAgdmFyIGNsb25lLCBsZW5ndGgsIG9wdGlvbnMsIHNvdXJjZSwgdGFyZ2V0LCBpO1xuXG4gIGlmICh0eXBlID09PSAnU2hhcmVkQXJyYXlCdWZmZXInKSB7XG4gICAgaWYgKG5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUpIGNsb25lID0gbmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgLy8gU2hhcmVkQXJyYXlCdWZmZXIgc2hvdWxkIHVzZSBzaGFyZWQgbWVtb3J5LCB3ZSBjYW4ndCBwb2x5ZmlsbCBpdCwgc28gcmV0dXJuIHRoZSBvcmlnaW5hbFxuICAgIGVsc2UgY2xvbmUgPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgRGF0YVZpZXcgPSBnbG9iYWwuRGF0YVZpZXc7XG5cbiAgICAvLyBgQXJyYXlCdWZmZXIjc2xpY2VgIGlzIG5vdCBhdmFpbGFibGUgaW4gSUUxMFxuICAgIC8vIGBBcnJheUJ1ZmZlciNzbGljZWAgYW5kIGBEYXRhVmlld2AgYXJlIG5vdCBhdmFpbGFibGUgaW4gb2xkIEZGXG4gICAgaWYgKCFEYXRhVmlldyAmJiB0eXBlb2YgdmFsdWUuc2xpY2UgIT0gJ2Z1bmN0aW9uJykgdGhyb3dVbnBvbHlmaWxsYWJsZSgnQXJyYXlCdWZmZXInKTtcbiAgICAvLyBkZXRhY2hlZCBidWZmZXJzIHRocm93cyBpbiBgRGF0YVZpZXdgIGFuZCBgLnNsaWNlYFxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLnNsaWNlID09ICdmdW5jdGlvbicgJiYgIXZhbHVlLnJlc2l6YWJsZSkge1xuICAgICAgICBjbG9uZSA9IHZhbHVlLnNsaWNlKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGVuZ3RoID0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgICAgICAgb3B0aW9ucyA9ICdtYXhCeXRlTGVuZ3RoJyBpbiB2YWx1ZSA/IHsgbWF4Qnl0ZUxlbmd0aDogdmFsdWUubWF4Qnl0ZUxlbmd0aCB9IDogdW5kZWZpbmVkO1xuICAgICAgICBjbG9uZSA9IG5ldyBBcnJheUJ1ZmZlcihsZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICBzb3VyY2UgPSBuZXcgRGF0YVZpZXcodmFsdWUpO1xuICAgICAgICB0YXJnZXQgPSBuZXcgRGF0YVZpZXcoY2xvbmUpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0YXJnZXQuc2V0VWludDgoaSwgc291cmNlLmdldFVpbnQ4KGkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdBcnJheUJ1ZmZlciBpcyBkZXRhY2hlZCcsIERBVEFfQ0xPTkVfRVJST1IpO1xuICAgIH1cbiAgfVxuXG4gIG1hcFNldChtYXAsIHZhbHVlLCBjbG9uZSk7XG5cbiAgcmV0dXJuIGNsb25lO1xufTtcblxudmFyIGNsb25lVmlldyA9IGZ1bmN0aW9uICh2YWx1ZSwgdHlwZSwgb2Zmc2V0LCBsZW5ndGgsIG1hcCkge1xuICB2YXIgQyA9IGdsb2JhbFt0eXBlXTtcbiAgLy8gaW4gc29tZSBvbGQgZW5naW5lcyBsaWtlIFNhZmFyaSA5LCB0eXBlb2YgQyBpcyAnb2JqZWN0J1xuICAvLyBvbiBVaW50OENsYW1wZWRBcnJheSBvciBzb21lIG90aGVyIGNvbnN0cnVjdG9yc1xuICBpZiAoIWlzT2JqZWN0KEMpKSB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICByZXR1cm4gbmV3IEMoY2xvbmVCdWZmZXIodmFsdWUuYnVmZmVyLCBtYXApLCBvZmZzZXQsIGxlbmd0aCk7XG59O1xuXG52YXIgUGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAob2JqZWN0LCB0eXBlLCBtZXRhZGF0YSkge1xuICB0aGlzLm9iamVjdCA9IG9iamVjdDtcbiAgdGhpcy50eXBlID0gdHlwZTtcbiAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xufTtcblxudmFyIHN0cnVjdHVyZWRDbG9uZUludGVybmFsID0gZnVuY3Rpb24gKHZhbHVlLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykge1xuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB0aHJvd1VuY2xvbmVhYmxlKCdTeW1ib2wnKTtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgLy8gZWZmZWN0aXZlbHkgcHJlc2VydmVzIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgaWYgKG1hcCkge1xuICAgIGlmIChtYXBIYXMobWFwLCB2YWx1ZSkpIHJldHVybiBtYXBHZXQobWFwLCB2YWx1ZSk7XG4gIH0gZWxzZSBtYXAgPSBuZXcgTWFwKCk7XG5cbiAgdmFyIHR5cGUgPSBjbGFzc29mKHZhbHVlKTtcbiAgdmFyIEMsIG5hbWUsIGNsb25lZCwgZGF0YVRyYW5zZmVyLCBpLCBsZW5ndGgsIGtleXMsIGtleTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICBjbG9uZWQgPSBBcnJheShsZW5ndGhPZkFycmF5TGlrZSh2YWx1ZSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGNsb25lZCA9IHt9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIGNsb25lZCA9IG5ldyBNYXAoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICBjbG9uZWQgPSBuZXcgU2V0KCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgLy8gaW4gdGhpcyBibG9jayBiZWNhdXNlIG9mIGEgU2FmYXJpIDE0LjEgYnVnXG4gICAgICAvLyBvbGQgRkYgZG9lcyBub3QgY2xvbmUgcmVnZXhlcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBzbyBnZXQgdGhlIHNvdXJjZSBhbmQgZmxhZ3MgZGlyZWN0bHlcbiAgICAgIGNsb25lZCA9IG5ldyBSZWdFeHAodmFsdWUuc291cmNlLCBnZXRSZWdFeHBGbGFncyh2YWx1ZSkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRXJyb3InOlxuICAgICAgbmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSAnQWdncmVnYXRlRXJyb3InOlxuICAgICAgICAgIGNsb25lZCA9IGdldEJ1aWx0aW4oJ0FnZ3JlZ2F0ZUVycm9yJykoW10pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdFdmFsRXJyb3InOlxuICAgICAgICAgIGNsb25lZCA9IEV2YWxFcnJvcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdSYW5nZUVycm9yJzpcbiAgICAgICAgICBjbG9uZWQgPSBSYW5nZUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1JlZmVyZW5jZUVycm9yJzpcbiAgICAgICAgICBjbG9uZWQgPSBSZWZlcmVuY2VFcnJvcigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTeW50YXhFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gU3ludGF4RXJyb3IoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVHlwZUVycm9yJzpcbiAgICAgICAgICBjbG9uZWQgPSBUeXBlRXJyb3IoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnVVJJRXJyb3InOlxuICAgICAgICAgIGNsb25lZCA9IFVSSUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0NvbXBpbGVFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gQ29tcGlsZUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0xpbmtFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gTGlua0Vycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1J1bnRpbWVFcnJvcic6XG4gICAgICAgICAgY2xvbmVkID0gUnVudGltZUVycm9yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2xvbmVkID0gRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RPTUV4Y2VwdGlvbic6XG4gICAgICBjbG9uZWQgPSBuZXcgRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQXJyYXlCdWZmZXInOlxuICAgIGNhc2UgJ1NoYXJlZEFycmF5QnVmZmVyJzpcbiAgICAgIGNsb25lZCA9IHRyYW5zZmVycmVkQnVmZmVyc1xuICAgICAgICA/IG5ldyBQbGFjZWhvbGRlcih2YWx1ZSwgdHlwZSlcbiAgICAgICAgOiBjbG9uZUJ1ZmZlcih2YWx1ZSwgbWFwLCB0eXBlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RhdGFWaWV3JzpcbiAgICBjYXNlICdJbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICBjYXNlICdJbnQxNkFycmF5JzpcbiAgICBjYXNlICdVaW50MTZBcnJheSc6XG4gICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgY2FzZSAnVWludDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0MTZBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ0ludDY0QXJyYXknOlxuICAgIGNhc2UgJ0JpZ1VpbnQ2NEFycmF5JzpcbiAgICAgIGxlbmd0aCA9IHR5cGUgPT09ICdEYXRhVmlldycgPyB2YWx1ZS5ieXRlTGVuZ3RoIDogdmFsdWUubGVuZ3RoO1xuICAgICAgY2xvbmVkID0gdHJhbnNmZXJyZWRCdWZmZXJzXG4gICAgICAgID8gbmV3IFBsYWNlaG9sZGVyKHZhbHVlLCB0eXBlLCB7IG9mZnNldDogdmFsdWUuYnl0ZU9mZnNldCwgbGVuZ3RoOiBsZW5ndGggfSlcbiAgICAgICAgOiBjbG9uZVZpZXcodmFsdWUsIHR5cGUsIHZhbHVlLmJ5dGVPZmZzZXQsIGxlbmd0aCwgbWFwKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RPTVF1YWQnOlxuICAgICAgdHJ5IHtcbiAgICAgICAgY2xvbmVkID0gbmV3IERPTVF1YWQoXG4gICAgICAgICAgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUucDEsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSxcbiAgICAgICAgICBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh2YWx1ZS5wMiwgbWFwLCB0cmFuc2ZlcnJlZEJ1ZmZlcnMpLFxuICAgICAgICAgIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLnAzLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyksXG4gICAgICAgICAgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUucDQsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2xvbmVkID0gdHJ5TmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSwgdHlwZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICdGaWxlJzpcbiAgICAgIGlmIChuYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKSB0cnkge1xuICAgICAgICBjbG9uZWQgPSBuYXRpdmVSZXN0cmljdGVkU3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICAgICAgLy8gTm9kZUpTIDIwLjAuMCBidWcsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDc2MTJcbiAgICAgICAgaWYgKGNsYXNzb2YoY2xvbmVkKSAhPT0gdHlwZSkgY2xvbmVkID0gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgICAgaWYgKCFjbG9uZWQpIHRyeSB7XG4gICAgICAgIGNsb25lZCA9IG5ldyBGaWxlKFt2YWx1ZV0sIHZhbHVlLm5hbWUsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgICAgIGlmICghY2xvbmVkKSB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRmlsZUxpc3QnOlxuICAgICAgZGF0YVRyYW5zZmVyID0gY3JlYXRlRGF0YVRyYW5zZmVyKCk7XG4gICAgICBpZiAoZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKHZhbHVlKTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZGF0YVRyYW5zZmVyLml0ZW1zLmFkZChzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh2YWx1ZVtpXSwgbWFwLCB0cmFuc2ZlcnJlZEJ1ZmZlcnMpKTtcbiAgICAgICAgfVxuICAgICAgICBjbG9uZWQgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICB9IGVsc2UgY2xvbmVkID0gdHJ5TmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSwgdHlwZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdJbWFnZURhdGEnOlxuICAgICAgLy8gU2FmYXJpIDkgSW1hZ2VEYXRhIGlzIGEgY29uc3RydWN0b3IsIGJ1dCB0eXBlb2YgSW1hZ2VEYXRhIGlzICdvYmplY3QnXG4gICAgICB0cnkge1xuICAgICAgICBjbG9uZWQgPSBuZXcgSW1hZ2VEYXRhKFxuICAgICAgICAgIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLmRhdGEsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSxcbiAgICAgICAgICB2YWx1ZS53aWR0aCxcbiAgICAgICAgICB2YWx1ZS5oZWlnaHQsXG4gICAgICAgICAgeyBjb2xvclNwYWNlOiB2YWx1ZS5jb2xvclNwYWNlIH1cbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNsb25lZCA9IHRyeU5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUodmFsdWUsIHR5cGUpO1xuICAgICAgfSBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKG5hdGl2ZVJlc3RyaWN0ZWRTdHJ1Y3R1cmVkQ2xvbmUpIHtcbiAgICAgICAgY2xvbmVkID0gbmF0aXZlUmVzdHJpY3RlZFN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Ugc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ0JpZ0ludCc6XG4gICAgICAgICAgLy8gY2FuIGJlIGEgM3JkIHBhcnR5IHBvbHlmaWxsXG4gICAgICAgICAgY2xvbmVkID0gT2JqZWN0KHZhbHVlLnZhbHVlT2YoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgICAgICAgIGNsb25lZCA9IE9iamVjdCh0aGlzQm9vbGVhblZhbHVlKHZhbHVlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ051bWJlcic6XG4gICAgICAgICAgY2xvbmVkID0gT2JqZWN0KHRoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTdHJpbmcnOlxuICAgICAgICAgIGNsb25lZCA9IE9iamVjdCh0aGlzU3RyaW5nVmFsdWUodmFsdWUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgY2xvbmVkID0gbmV3IERhdGUodGhpc1RpbWVWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdCbG9iJzpcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2xvbmVkID0gdmFsdWUuc2xpY2UoMCwgdmFsdWUuc2l6ZSwgdmFsdWUudHlwZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93VW5wb2x5ZmlsbGFibGUodHlwZSk7XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSAnRE9NUG9pbnQnOlxuICAgICAgICBjYXNlICdET01Qb2ludFJlYWRPbmx5JzpcbiAgICAgICAgICBDID0gZ2xvYmFsW3R5cGVdO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjbG9uZWQgPSBDLmZyb21Qb2ludFxuICAgICAgICAgICAgICA/IEMuZnJvbVBvaW50KHZhbHVlKVxuICAgICAgICAgICAgICA6IG5ldyBDKHZhbHVlLngsIHZhbHVlLnksIHZhbHVlLnosIHZhbHVlLncpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RPTVJlY3QnOlxuICAgICAgICBjYXNlICdET01SZWN0UmVhZE9ubHknOlxuICAgICAgICAgIEMgPSBnbG9iYWxbdHlwZV07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNsb25lZCA9IEMuZnJvbVJlY3RcbiAgICAgICAgICAgICAgPyBDLmZyb21SZWN0KHZhbHVlKVxuICAgICAgICAgICAgICA6IG5ldyBDKHZhbHVlLngsIHZhbHVlLnksIHZhbHVlLndpZHRoLCB2YWx1ZS5oZWlnaHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RPTU1hdHJpeCc6XG4gICAgICAgIGNhc2UgJ0RPTU1hdHJpeFJlYWRPbmx5JzpcbiAgICAgICAgICBDID0gZ2xvYmFsW3R5cGVdO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjbG9uZWQgPSBDLmZyb21NYXRyaXhcbiAgICAgICAgICAgICAgPyBDLmZyb21NYXRyaXgodmFsdWUpXG4gICAgICAgICAgICAgIDogbmV3IEModmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIGNhc2UgJ0F1ZGlvRGF0YSc6XG4gICAgICAgIGNhc2UgJ1ZpZGVvRnJhbWUnOlxuICAgICAgICAgIGlmICghaXNDYWxsYWJsZSh2YWx1ZS5jbG9uZSkpIHRocm93VW5wb2x5ZmlsbGFibGUodHlwZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNsb25lZCA9IHZhbHVlLmNsb25lKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93VW5jbG9uZWFibGUodHlwZSk7XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSAnQ3JvcFRhcmdldCc6XG4gICAgICAgIGNhc2UgJ0NyeXB0b0tleSc6XG4gICAgICAgIGNhc2UgJ0ZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGUnOlxuICAgICAgICBjYXNlICdGaWxlU3lzdGVtRmlsZUhhbmRsZSc6XG4gICAgICAgIGNhc2UgJ0ZpbGVTeXN0ZW1IYW5kbGUnOlxuICAgICAgICBjYXNlICdHUFVDb21waWxhdGlvbkluZm8nOlxuICAgICAgICBjYXNlICdHUFVDb21waWxhdGlvbk1lc3NhZ2UnOlxuICAgICAgICBjYXNlICdJbWFnZUJpdG1hcCc6XG4gICAgICAgIGNhc2UgJ1JUQ0NlcnRpZmljYXRlJzpcbiAgICAgICAgY2FzZSAnV2ViQXNzZW1ibHkuTW9kdWxlJzpcbiAgICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUpO1xuICAgICAgICAgIC8vIGJyZWFrIG9taXR0ZWRcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvd1VuY2xvbmVhYmxlKHR5cGUpO1xuICAgICAgfVxuICB9XG5cbiAgbWFwU2V0KG1hcCwgdmFsdWUsIGNsb25lZCk7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBrZXlzID0gb2JqZWN0S2V5cyh2YWx1ZSk7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShrZXlzKTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KGNsb25lZCwga2V5LCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbCh2YWx1ZVtrZXldLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykpO1xuICAgICAgfSBicmVhaztcbiAgICBjYXNlICdNYXAnOlxuICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAodiwgaykge1xuICAgICAgICBtYXBTZXQoY2xvbmVkLCBzdHJ1Y3R1cmVkQ2xvbmVJbnRlcm5hbChrLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyksIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHYsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHNldEFkZChjbG9uZWQsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHYsIG1hcCwgdHJhbnNmZXJyZWRCdWZmZXJzKSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShjbG9uZWQsICdtZXNzYWdlJywgc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUubWVzc2FnZSwgbWFwLCB0cmFuc2ZlcnJlZEJ1ZmZlcnMpKTtcbiAgICAgIGlmIChoYXNPd24odmFsdWUsICdjYXVzZScpKSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShjbG9uZWQsICdjYXVzZScsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLmNhdXNlLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWUgPT0gJ0FnZ3JlZ2F0ZUVycm9yJykge1xuICAgICAgICBjbG9uZWQuZXJyb3JzID0gc3RydWN0dXJlZENsb25lSW50ZXJuYWwodmFsdWUuZXJyb3JzLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyk7XG4gICAgICB9IC8vIGJyZWFrIG9taXR0ZWRcbiAgICBjYXNlICdET01FeGNlcHRpb24nOlxuICAgICAgaWYgKEVSUk9SX1NUQUNLX0lOU1RBTExBQkxFKSB7XG4gICAgICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShjbG9uZWQsICdzdGFjaycsIHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLnN0YWNrLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycykpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGNsb25lZDtcbn07XG5cbnZhciByZXBsYWNlUGxhY2Vob2xkZXJzID0gZnVuY3Rpb24gKHZhbHVlLCBtYXApIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKG1hcEhhcyhtYXAsIHZhbHVlKSkgcmV0dXJuIG1hcEdldChtYXAsIHZhbHVlKTtcblxuICB2YXIgdHlwZSwgb2JqZWN0LCBtZXRhZGF0YSwgaSwgbGVuZ3RoLCBrZXlzLCBrZXksIHJlcGxhY2VtZW50O1xuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBsYWNlaG9sZGVyKSB7XG4gICAgdHlwZSA9IHZhbHVlLnR5cGU7XG4gICAgb2JqZWN0ID0gdmFsdWUub2JqZWN0O1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBjYXNlICdTaGFyZWRBcnJheUJ1ZmZlcic6XG4gICAgICAgIHJlcGxhY2VtZW50ID0gY2xvbmVCdWZmZXIob2JqZWN0LCBtYXAsIHR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RhdGFWaWV3JzpcbiAgICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgICBjYXNlICdGbG9hdDE2QXJyYXknOlxuICAgICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgICBjYXNlICdCaWdJbnQ2NEFycmF5JzpcbiAgICAgIGNhc2UgJ0JpZ1VpbnQ2NEFycmF5JzpcbiAgICAgICAgbWV0YWRhdGEgPSB2YWx1ZS5tZXRhZGF0YTtcbiAgICAgICAgcmVwbGFjZW1lbnQgPSBjbG9uZVZpZXcob2JqZWN0LCB0eXBlLCBtZXRhZGF0YS5vZmZzZXQsIG1ldGFkYXRhLmxlbmd0aCwgbWFwKTtcbiAgICB9XG4gIH0gZWxzZSBzd2l0Y2ggKGNsYXNzb2YodmFsdWUpKSB7XG4gICAgY2FzZSAnQXJyYXknOlxuICAgIGNhc2UgJ09iamVjdCc6XG4gICAgICBrZXlzID0gb2JqZWN0S2V5cyh2YWx1ZSk7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShrZXlzKTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhbHVlW2tleV0gPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlW2tleV0sIG1hcCk7XG4gICAgICB9IGJyZWFrO1xuICAgIGNhc2UgJ01hcCc6XG4gICAgICByZXBsYWNlbWVudCA9IG5ldyBNYXAoKTtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHYsIGspIHtcbiAgICAgICAgbWFwU2V0KHJlcGxhY2VtZW50LCByZXBsYWNlUGxhY2Vob2xkZXJzKGssIG1hcCksIHJlcGxhY2VQbGFjZWhvbGRlcnModiwgbWFwKSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICByZXBsYWNlbWVudCA9IG5ldyBTZXQoKTtcbiAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgc2V0QWRkKHJlcGxhY2VtZW50LCByZXBsYWNlUGxhY2Vob2xkZXJzKHYsIG1hcCkpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdFcnJvcic6XG4gICAgICB2YWx1ZS5tZXNzYWdlID0gcmVwbGFjZVBsYWNlaG9sZGVycyh2YWx1ZS5tZXNzYWdlLCBtYXApO1xuICAgICAgaWYgKGhhc093bih2YWx1ZSwgJ2NhdXNlJykpIHtcbiAgICAgICAgdmFsdWUuY2F1c2UgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlLmNhdXNlLCBtYXApO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLm5hbWUgPT0gJ0FnZ3JlZ2F0ZUVycm9yJykge1xuICAgICAgICB2YWx1ZS5lcnJvcnMgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlLmVycm9ycywgbWFwKTtcbiAgICAgIH0gLy8gYnJlYWsgb21pdHRlZFxuICAgIGNhc2UgJ0RPTUV4Y2VwdGlvbic6XG4gICAgICBpZiAoRVJST1JfU1RBQ0tfSU5TVEFMTEFCTEUpIHtcbiAgICAgICAgdmFsdWUuc3RhY2sgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHZhbHVlLnN0YWNrLCBtYXApO1xuICAgICAgfVxuICB9XG5cbiAgbWFwU2V0KG1hcCwgdmFsdWUsIHJlcGxhY2VtZW50IHx8IHZhbHVlKTtcblxuICByZXR1cm4gcmVwbGFjZW1lbnQgfHwgdmFsdWU7XG59O1xuXG52YXIgdHJ5VG9UcmFuc2ZlciA9IGZ1bmN0aW9uIChyYXdUcmFuc2ZlciwgbWFwKSB7XG4gIGlmICghaXNPYmplY3QocmF3VHJhbnNmZXIpKSB0aHJvdyBUeXBlRXJyb3IoJ1RyYW5zZmVyIG9wdGlvbiBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgc2VxdWVuY2UnKTtcblxuICB2YXIgdHJhbnNmZXIgPSBbXTtcblxuICBpdGVyYXRlKHJhd1RyYW5zZmVyLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBwdXNoKHRyYW5zZmVyLCBhbk9iamVjdCh2YWx1ZSkpO1xuICB9KTtcblxuICB2YXIgaSA9IDA7XG4gIHZhciBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZSh0cmFuc2Zlcik7XG4gIHZhciBidWZmZXJzID0gW107XG4gIHZhciB2YWx1ZSwgdHlwZSwgQywgdHJhbnNmZXJyZWQsIGNhbnZhcywgY29udGV4dDtcblxuICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgIHZhbHVlID0gdHJhbnNmZXJbaSsrXTtcblxuICAgIHR5cGUgPSBjbGFzc29mKHZhbHVlKTtcblxuICAgIGlmICh0eXBlID09PSAnQXJyYXlCdWZmZXInKSB7XG4gICAgICBwdXNoKGJ1ZmZlcnMsIHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChtYXBIYXMobWFwLCB2YWx1ZSkpIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0R1cGxpY2F0ZSB0cmFuc2ZlcmFibGUnLCBEQVRBX0NMT05FX0VSUk9SKTtcblxuICAgIGlmIChQUk9QRVJfVFJBTlNGRVIpIHtcbiAgICAgIHRyYW5zZmVycmVkID0gbmF0aXZlU3RydWN0dXJlZENsb25lKHZhbHVlLCB7IHRyYW5zZmVyOiBbdmFsdWVdIH0pO1xuICAgIH0gZWxzZSBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ0ltYWdlQml0bWFwJzpcbiAgICAgICAgQyA9IGdsb2JhbC5PZmZzY3JlZW5DYW52YXM7XG4gICAgICAgIGlmICghaXNDb25zdHJ1Y3RvcihDKSkgdGhyb3dVbnBvbHlmaWxsYWJsZSh0eXBlLCBUUkFOU0ZFUlJJTkcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcyA9IG5ldyBDKHZhbHVlLndpZHRoLCB2YWx1ZS5oZWlnaHQpO1xuICAgICAgICAgIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnYml0bWFwcmVuZGVyZXInKTtcbiAgICAgICAgICBjb250ZXh0LnRyYW5zZmVyRnJvbUltYWdlQml0bWFwKHZhbHVlKTtcbiAgICAgICAgICB0cmFuc2ZlcnJlZCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0F1ZGlvRGF0YSc6XG4gICAgICBjYXNlICdWaWRlb0ZyYW1lJzpcbiAgICAgICAgaWYgKCFpc0NhbGxhYmxlKHZhbHVlLmNsb25lKSB8fCAhaXNDYWxsYWJsZSh2YWx1ZS5jbG9zZSkpIHRocm93VW5wb2x5ZmlsbGFibGUodHlwZSwgVFJBTlNGRVJSSU5HKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0cmFuc2ZlcnJlZCA9IHZhbHVlLmNsb25lKCk7XG4gICAgICAgICAgdmFsdWUuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ01lZGlhU291cmNlSGFuZGxlJzpcbiAgICAgIGNhc2UgJ01lc3NhZ2VQb3J0JzpcbiAgICAgIGNhc2UgJ09mZnNjcmVlbkNhbnZhcyc6XG4gICAgICBjYXNlICdSZWFkYWJsZVN0cmVhbSc6XG4gICAgICBjYXNlICdUcmFuc2Zvcm1TdHJlYW0nOlxuICAgICAgY2FzZSAnV3JpdGFibGVTdHJlYW0nOlxuICAgICAgICB0aHJvd1VucG9seWZpbGxhYmxlKHR5cGUsIFRSQU5TRkVSUklORyk7XG4gICAgfVxuXG4gICAgaWYgKHRyYW5zZmVycmVkID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBET01FeGNlcHRpb24oJ1RoaXMgb2JqZWN0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZDogJyArIHR5cGUsIERBVEFfQ0xPTkVfRVJST1IpO1xuXG4gICAgbWFwU2V0KG1hcCwgdmFsdWUsIHRyYW5zZmVycmVkKTtcbiAgfVxuXG4gIHJldHVybiBidWZmZXJzO1xufTtcblxudmFyIHRyeVRvVHJhbnNmZXJCdWZmZXJzID0gZnVuY3Rpb24gKHRyYW5zZmVyLCBtYXApIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuZ3RoID0gbGVuZ3RoT2ZBcnJheUxpa2UodHJhbnNmZXIpO1xuICB2YXIgdmFsdWUsIHRyYW5zZmVycmVkO1xuXG4gIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgdmFsdWUgPSB0cmFuc2ZlcltpKytdO1xuXG4gICAgaWYgKG1hcEhhcyhtYXAsIHZhbHVlKSkgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRHVwbGljYXRlIHRyYW5zZmVyYWJsZScsIERBVEFfQ0xPTkVfRVJST1IpO1xuXG4gICAgaWYgKFBST1BFUl9UUkFOU0ZFUikge1xuICAgICAgdHJhbnNmZXJyZWQgPSBuYXRpdmVTdHJ1Y3R1cmVkQ2xvbmUodmFsdWUsIHsgdHJhbnNmZXI6IFt2YWx1ZV0gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNDYWxsYWJsZSh2YWx1ZS50cmFuc2ZlcikpIHRocm93VW5wb2x5ZmlsbGFibGUoJ0FycmF5QnVmZmVyJywgVFJBTlNGRVJSSU5HKTtcbiAgICAgIHRyYW5zZmVycmVkID0gdmFsdWUudHJhbnNmZXIoKTtcbiAgICB9XG5cbiAgICBtYXBTZXQobWFwLCB2YWx1ZSwgdHJhbnNmZXJyZWQpO1xuICB9XG59O1xuXG4vLyBgc3RydWN0dXJlZENsb25lYCBtZXRob2Rcbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N0cnVjdHVyZWQtZGF0YS5odG1sI2RvbS1zdHJ1Y3R1cmVkY2xvbmVcbiQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHNoYW06ICFQUk9QRVJfVFJBTlNGRVIsIGZvcmNlZDogRk9SQ0VEX1JFUExBQ0VNRU5UIH0sIHtcbiAgc3RydWN0dXJlZENsb25lOiBmdW5jdGlvbiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUgLyogLCB7IHRyYW5zZmVyIH0gKi8pIHtcbiAgICB2YXIgb3B0aW9ucyA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpID4gMSAmJiAhaXNOdWxsT3JVbmRlZmluZWQoYXJndW1lbnRzWzFdKSA/IGFuT2JqZWN0KGFyZ3VtZW50c1sxXSkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHRyYW5zZmVyID0gb3B0aW9ucyA/IG9wdGlvbnMudHJhbnNmZXIgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHRyYW5zZmVycmVkQnVmZmVycyA9IGZhbHNlO1xuICAgIHZhciBtYXAsIGJ1ZmZlcnM7XG5cbiAgICBpZiAodHJhbnNmZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgYnVmZmVycyA9IHRyeVRvVHJhbnNmZXIodHJhbnNmZXIsIG1hcCk7XG4gICAgICB0cmFuc2ZlcnJlZEJ1ZmZlcnMgPSAhIWxlbmd0aE9mQXJyYXlMaWtlKGJ1ZmZlcnMpO1xuICAgIH1cblxuICAgIHZhciBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZUludGVybmFsKHZhbHVlLCBtYXAsIHRyYW5zZmVycmVkQnVmZmVycyk7XG5cbiAgICAvLyBzaW5jZSBvZiBhbiBpc3N1ZSB3aXRoIGNsb25pbmcgdmlld3Mgb2YgdHJhbnNmZXJyZWQgYnVmZmVycywgd2UgYSBmb3JjZWQgdG8gdHJhbnNmZXIgLyBjbG9uZSB0aGVtIGluIDIgc3RlcHNcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTI2NVxuICAgIGlmICh0cmFuc2ZlcnJlZEJ1ZmZlcnMpIHtcbiAgICAgIG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIHRyeVRvVHJhbnNmZXJCdWZmZXJzKHRyYW5zZmVyLCBtYXApO1xuICAgICAgY2xvbmUgPSByZXBsYWNlUGxhY2Vob2xkZXJzKGNsb25lLCBtYXApO1xuICAgIH1cblxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxufSk7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5zdHJ1Y3R1cmVkLWNsb25lLmpzPyIpfSksIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuY29uc3RydWN0b3IuanMiOigobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKT0+e2V2YWwoIlxuLy8gVE9ETzogaW4gY29yZS1qc0A0LCBtb3ZlIC9tb2R1bGVzLyBkZXBlbmRlbmNpZXMgdG8gcHVibGljIGVudHJpZXMgZm9yIGJldHRlciBvcHRpbWl6YXRpb24gYnkgdG9vbHMgbGlrZSBgcHJlc2V0LWVudmBcbl9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanNcIik7XG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgZ2xvYmFsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dsb2JhbCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dsb2JhbC5qc1wiKTtcbnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLWNhbGwgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1jYWxsLmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZXNjcmlwdG9ycyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Rlc2NyaXB0b3JzLmpzXCIpO1xudmFyIFVTRV9OQVRJVkVfVVJMID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3VybC1jb25zdHJ1Y3Rvci1kZXRlY3Rpb24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91cmwtY29uc3RydWN0b3ItZGV0ZWN0aW9uLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLmpzXCIpO1xudmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtYnVpbHQtaW4tYWNjZXNzb3IuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWlucyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbnMuanNcIik7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qc1wiKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdG9yLWNyZWF0ZS1jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG52YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1pbnN0YW5jZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLWluc3RhbmNlLmpzXCIpO1xudmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtY2FsbGFibGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1jYWxsYWJsZS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi1iaW5kLWNvbnRleHQuanNcIik7XG52YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jbGFzc29mICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qc1wiKTtcbnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hbi1vYmplY3QgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanNcIik7XG52YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaXMtb2JqZWN0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzXCIpO1xudmFyICR0b1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy90by1zdHJpbmcgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1zdHJpbmcuanNcIik7XG52YXIgY3JlYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzXCIpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzXCIpO1xudmFyIGdldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci5qc1wiKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1wiKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtYXJndW1lbnRzLWxlbmd0aC5qc1wiKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qc1wiKTtcbnZhciBhcnJheVNvcnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYXJyYXktc29ydCAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNvcnQuanNcIik7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBVUkxfU0VBUkNIX1BBUkFNUyA9ICdVUkxTZWFyY2hQYXJhbXMnO1xudmFyIFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SID0gVVJMX1NFQVJDSF9QQVJBTVMgKyAnSXRlcmF0b3InO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVMpO1xudmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFVSTF9TRUFSQ0hfUEFSQU1TX0lURVJBVE9SKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmVcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4vLyBBdm9pZCBOb2RlSlMgZXhwZXJpbWVudGFsIHdhcm5pbmdcbnZhciBzYWZlR2V0QnVpbHRJbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGlmICghREVTQ1JJUFRPUlMpIHJldHVybiBnbG9iYWxbbmFtZV07XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgbmFtZSk7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWU7XG59O1xuXG52YXIgbmF0aXZlRmV0Y2ggPSBzYWZlR2V0QnVpbHRJbignZmV0Y2gnKTtcbnZhciBOYXRpdmVSZXF1ZXN0ID0gc2FmZUdldEJ1aWx0SW4oJ1JlcXVlc3QnKTtcbnZhciBIZWFkZXJzID0gc2FmZUdldEJ1aWx0SW4oJ0hlYWRlcnMnKTtcbnZhciBSZXF1ZXN0UHJvdG90eXBlID0gTmF0aXZlUmVxdWVzdCAmJiBOYXRpdmVSZXF1ZXN0LnByb3RvdHlwZTtcbnZhciBIZWFkZXJzUHJvdG90eXBlID0gSGVhZGVycyAmJiBIZWFkZXJzLnByb3RvdHlwZTtcbnZhciBSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZGVjb2RlVVJJQ29tcG9uZW50ID0gZ2xvYmFsLmRlY29kZVVSSUNvbXBvbmVudDtcbnZhciBlbmNvZGVVUklDb21wb25lbnQgPSBnbG9iYWwuZW5jb2RlVVJJQ29tcG9uZW50O1xudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgam9pbiA9IHVuY3VycnlUaGlzKFtdLmpvaW4pO1xudmFyIHB1c2ggPSB1bmN1cnJ5VGhpcyhbXS5wdXNoKTtcbnZhciByZXBsYWNlID0gdW5jdXJyeVRoaXMoJycucmVwbGFjZSk7XG52YXIgc2hpZnQgPSB1bmN1cnJ5VGhpcyhbXS5zaGlmdCk7XG52YXIgc3BsaWNlID0gdW5jdXJyeVRoaXMoW10uc3BsaWNlKTtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcblxudmFyIHBsdXMgPSAvXFwrL2c7XG52YXIgc2VxdWVuY2VzID0gQXJyYXkoNCk7XG5cbnZhciBwZXJjZW50U2VxdWVuY2UgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgcmV0dXJuIHNlcXVlbmNlc1tieXRlcyAtIDFdIHx8IChzZXF1ZW5jZXNbYnl0ZXMgLSAxXSA9IFJlZ0V4cCgnKCg/OiVbXFxcXGRhLWZdezJ9KXsnICsgYnl0ZXMgKyAnfSknLCAnZ2knKSk7XG59O1xuXG52YXIgcGVyY2VudERlY29kZSA9IGZ1bmN0aW9uIChzZXF1ZW5jZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc2VxdWVuY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBzZXF1ZW5jZTtcbiAgfVxufTtcblxudmFyIGRlc2VyaWFsaXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSByZXBsYWNlKGl0LCBwbHVzLCAnICcpO1xuICB2YXIgYnl0ZXMgPSA0O1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB3aGlsZSAoYnl0ZXMpIHtcbiAgICAgIHJlc3VsdCA9IHJlcGxhY2UocmVzdWx0LCBwZXJjZW50U2VxdWVuY2UoYnl0ZXMtLSksIHBlcmNlbnREZWNvZGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgZmluZCA9IC9bIScoKX5dfCUyMC9nO1xuXG52YXIgcmVwbGFjZW1lbnRzID0ge1xuICAnISc6ICclMjEnLFxuICBcIidcIjogJyUyNycsXG4gICcoJzogJyUyOCcsXG4gICcpJzogJyUyOScsXG4gICd+JzogJyU3RScsXG4gICclMjAnOiAnKydcbn07XG5cbnZhciByZXBsYWNlciA9IGZ1bmN0aW9uIChtYXRjaCkge1xuICByZXR1cm4gcmVwbGFjZW1lbnRzW21hdGNoXTtcbn07XG5cbnZhciBzZXJpYWxpemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHJlcGxhY2UoZW5jb2RlVVJJQ29tcG9uZW50KGl0KSwgZmluZCwgcmVwbGFjZXIpO1xufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihmdW5jdGlvbiBJdGVyYXRvcihwYXJhbXMsIGtpbmQpIHtcbiAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgdHlwZTogVVJMX1NFQVJDSF9QQVJBTVNfSVRFUkFUT1IsXG4gICAgaXRlcmF0b3I6IGdldEl0ZXJhdG9yKGdldEludGVybmFsUGFyYW1zU3RhdGUocGFyYW1zKS5lbnRyaWVzKSxcbiAgICBraW5kOiBraW5kXG4gIH0pO1xufSwgJ0l0ZXJhdG9yJywgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBzdGVwID0gc3RhdGUuaXRlcmF0b3IubmV4dCgpO1xuICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICBpZiAoIXN0ZXAuZG9uZSkge1xuICAgIHN0ZXAudmFsdWUgPSBraW5kID09PSAna2V5cycgPyBlbnRyeS5rZXkgOiBraW5kID09PSAndmFsdWVzJyA/IGVudHJ5LnZhbHVlIDogW2VudHJ5LmtleSwgZW50cnkudmFsdWVdO1xuICB9IHJldHVybiBzdGVwO1xufSwgdHJ1ZSk7XG5cbnZhciBVUkxTZWFyY2hQYXJhbXNTdGF0ZSA9IGZ1bmN0aW9uIChpbml0KSB7XG4gIHRoaXMuZW50cmllcyA9IFtdO1xuICB0aGlzLnVybCA9IG51bGw7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChpc09iamVjdChpbml0KSkgdGhpcy5wYXJzZU9iamVjdChpbml0KTtcbiAgICBlbHNlIHRoaXMucGFyc2VRdWVyeSh0eXBlb2YgaW5pdCA9PSAnc3RyaW5nJyA/IGNoYXJBdChpbml0LCAwKSA9PT0gJz8nID8gc3RyaW5nU2xpY2UoaW5pdCwgMSkgOiBpbml0IDogJHRvU3RyaW5nKGluaXQpKTtcbiAgfVxufTtcblxuVVJMU2VhcmNoUGFyYW1zU3RhdGUucHJvdG90eXBlID0ge1xuICB0eXBlOiBVUkxfU0VBUkNIX1BBUkFNUyxcbiAgYmluZFVSTDogZnVuY3Rpb24gKHVybCkge1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH0sXG4gIHBhcnNlT2JqZWN0OiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2Qob2JqZWN0KTtcbiAgICB2YXIgaXRlcmF0b3IsIG5leHQsIHN0ZXAsIGVudHJ5SXRlcmF0b3IsIGVudHJ5TmV4dCwgZmlyc3QsIHNlY29uZDtcblxuICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihvYmplY3QsIGl0ZXJhdG9yTWV0aG9kKTtcbiAgICAgIG5leHQgPSBpdGVyYXRvci5uZXh0O1xuICAgICAgd2hpbGUgKCEoc3RlcCA9IGNhbGwobmV4dCwgaXRlcmF0b3IpKS5kb25lKSB7XG4gICAgICAgIGVudHJ5SXRlcmF0b3IgPSBnZXRJdGVyYXRvcihhbk9iamVjdChzdGVwLnZhbHVlKSk7XG4gICAgICAgIGVudHJ5TmV4dCA9IGVudHJ5SXRlcmF0b3IubmV4dDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChmaXJzdCA9IGNhbGwoZW50cnlOZXh0LCBlbnRyeUl0ZXJhdG9yKSkuZG9uZSB8fFxuICAgICAgICAgIChzZWNvbmQgPSBjYWxsKGVudHJ5TmV4dCwgZW50cnlJdGVyYXRvcikpLmRvbmUgfHxcbiAgICAgICAgICAhY2FsbChlbnRyeU5leHQsIGVudHJ5SXRlcmF0b3IpLmRvbmVcbiAgICAgICAgKSB0aHJvdyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHNlcXVlbmNlIHdpdGggbGVuZ3RoIDInKTtcbiAgICAgICAgcHVzaCh0aGlzLmVudHJpZXMsIHsga2V5OiAkdG9TdHJpbmcoZmlyc3QudmFsdWUpLCB2YWx1ZTogJHRvU3RyaW5nKHNlY29uZC52YWx1ZSkgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGZvciAodmFyIGtleSBpbiBvYmplY3QpIGlmIChoYXNPd24ob2JqZWN0LCBrZXkpKSB7XG4gICAgICBwdXNoKHRoaXMuZW50cmllcywgeyBrZXk6IGtleSwgdmFsdWU6ICR0b1N0cmluZyhvYmplY3Rba2V5XSkgfSk7XG4gICAgfVxuICB9LFxuICBwYXJzZVF1ZXJ5OiBmdW5jdGlvbiAocXVlcnkpIHtcbiAgICBpZiAocXVlcnkpIHtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3BsaXQocXVlcnksICcmJyk7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIGF0dHJpYnV0ZSwgZW50cnk7XG4gICAgICB3aGlsZSAoaW5kZXggPCBhdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2luZGV4KytdO1xuICAgICAgICBpZiAoYXR0cmlidXRlLmxlbmd0aCkge1xuICAgICAgICAgIGVudHJ5ID0gc3BsaXQoYXR0cmlidXRlLCAnPScpO1xuICAgICAgICAgIHB1c2godGhpcy5lbnRyaWVzLCB7XG4gICAgICAgICAgICBrZXk6IGRlc2VyaWFsaXplKHNoaWZ0KGVudHJ5KSksXG4gICAgICAgICAgICB2YWx1ZTogZGVzZXJpYWxpemUoam9pbihlbnRyeSwgJz0nKSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2VyaWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgICBwdXNoKHJlc3VsdCwgc2VyaWFsaXplKGVudHJ5LmtleSkgKyAnPScgKyBzZXJpYWxpemUoZW50cnkudmFsdWUpKTtcbiAgICB9IHJldHVybiBqb2luKHJlc3VsdCwgJyYnKTtcbiAgfSxcbiAgdXBkYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lbnRyaWVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wYXJzZVF1ZXJ5KHRoaXMudXJsLnF1ZXJ5KTtcbiAgfSxcbiAgdXBkYXRlVVJMOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybC51cGRhdGUoKTtcbiAgfVxufTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtc2AgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLXVybHNlYXJjaHBhcmFtc1xudmFyIFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gVVJMU2VhcmNoUGFyYW1zKC8qIGluaXQgKi8pIHtcbiAgYW5JbnN0YW5jZSh0aGlzLCBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUpO1xuICB2YXIgaW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICB2YXIgc3RhdGUgPSBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIG5ldyBVUkxTZWFyY2hQYXJhbXNTdGF0ZShpbml0KSk7XG4gIGlmICghREVTQ1JJUFRPUlMpIHRoaXMuc2l6ZSA9IHN0YXRlLmVudHJpZXMubGVuZ3RoO1xufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9IFVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yLnByb3RvdHlwZTtcblxuZGVmaW5lQnVpbHRJbnMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCB7XG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmFwcGVuZGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1hcHBlbmRcbiAgYXBwZW5kOiBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDIpO1xuICAgIHB1c2goc3RhdGUuZW50cmllcywgeyBrZXk6ICR0b1N0cmluZyhuYW1lKSwgdmFsdWU6ICR0b1N0cmluZyh2YWx1ZSkgfSk7XG4gICAgaWYgKCFERVNDUklQVE9SUykgdGhpcy5sZW5ndGgrKztcbiAgICBzdGF0ZS51cGRhdGVVUkwoKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZGVsZXRlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWRlbGV0ZVxuICAnZGVsZXRlJzogZnVuY3Rpb24gKG5hbWUgLyogLCB2YWx1ZSAqLykge1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIga2V5ID0gJHRvU3RyaW5nKG5hbWUpO1xuICAgIHZhciAkdmFsdWUgPSBsZW5ndGggPCAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgIHZhciB2YWx1ZSA9ICR2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJHZhbHVlIDogJHRvU3RyaW5nKCR2YWx1ZSk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICBpZiAoZW50cnkua2V5ID09PSBrZXkgJiYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgZW50cnkudmFsdWUgPT09IHZhbHVlKSkge1xuICAgICAgICBzcGxpY2UoZW50cmllcywgaW5kZXgsIDEpO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICB9IGVsc2UgaW5kZXgrKztcbiAgICB9XG4gICAgaWYgKCFERVNDUklQVE9SUykgdGhpcy5zaXplID0gZW50cmllcy5sZW5ndGg7XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmdldGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1nZXRcbiAgZ2V0OiBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBrZXkgPSAkdG9TdHJpbmcobmFtZSk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKDsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKGVudHJpZXNbaW5kZXhdLmtleSA9PT0ga2V5KSByZXR1cm4gZW50cmllc1tpbmRleF0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5nZXRBbGxgIG1ldGhvZFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZ2V0YWxsXG4gIGdldEFsbDogZnVuY3Rpb24gZ2V0QWxsKG5hbWUpIHtcbiAgICB2YXIgZW50cmllcyA9IGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcztcbiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKTtcbiAgICB2YXIga2V5ID0gJHRvU3RyaW5nKG5hbWUpO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoZW50cmllc1tpbmRleF0ua2V5ID09PSBrZXkpIHB1c2gocmVzdWx0LCBlbnRyaWVzW2luZGV4XS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmhhc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1oYXNcbiAgaGFzOiBmdW5jdGlvbiBoYXMobmFtZSAvKiAsIHZhbHVlICovKSB7XG4gICAgdmFyIGVudHJpZXMgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXM7XG4gICAgdmFyIGxlbmd0aCA9IHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBrZXkgPSAkdG9TdHJpbmcobmFtZSk7XG4gICAgdmFyICR2YWx1ZSA9IGxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgdmFyIHZhbHVlID0gJHZhbHVlID09PSB1bmRlZmluZWQgPyAkdmFsdWUgOiAkdG9TdHJpbmcoJHZhbHVlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4KytdO1xuICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5ICYmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LnZhbHVlID09PSB2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNldGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1zZXRcbiAgc2V0OiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsIDEpO1xuICAgIHZhciBlbnRyaWVzID0gc3RhdGUuZW50cmllcztcbiAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICB2YXIga2V5ID0gJHRvU3RyaW5nKG5hbWUpO1xuICAgIHZhciB2YWwgPSAkdG9TdHJpbmcodmFsdWUpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIGZvciAoOyBpbmRleCA8IGVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5LmtleSA9PT0ga2V5KSB7XG4gICAgICAgIGlmIChmb3VuZCkgc3BsaWNlKGVudHJpZXMsIGluZGV4LS0sIDEpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgZW50cnkudmFsdWUgPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmb3VuZCkgcHVzaChlbnRyaWVzLCB7IGtleToga2V5LCB2YWx1ZTogdmFsIH0pO1xuICAgIGlmICghREVTQ1JJUFRPUlMpIHRoaXMuc2l6ZSA9IGVudHJpZXMubGVuZ3RoO1xuICAgIHN0YXRlLnVwZGF0ZVVSTCgpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5zb3J0YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLXNvcnRcbiAgc29ydDogZnVuY3Rpb24gc29ydCgpIHtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpO1xuICAgIGFycmF5U29ydChzdGF0ZS5lbnRyaWVzLCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEua2V5ID4gYi5rZXkgPyAxIDogLTE7XG4gICAgfSk7XG4gICAgc3RhdGUudXBkYXRlVVJMKCk7XG4gIH0sXG4gIC8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBlbnRyaWVzID0gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFjaywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXMubGVuZ3RoKSB7XG4gICAgICBlbnRyeSA9IGVudHJpZXNbaW5kZXgrK107XG4gICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgIH1cbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUua2V5c2AgbWV0aG9kXG4gIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAna2V5cycpO1xuICB9LFxuICAvLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS52YWx1ZXNgIG1ldGhvZFxuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgICByZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsICd2YWx1ZXMnKTtcbiAgfSxcbiAgLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuZW50cmllc2AgbWV0aG9kXG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgcmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLCAnZW50cmllcycpO1xuICB9XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2RcbmRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCBJVEVSQVRPUiwgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmVudHJpZXMsIHsgbmFtZTogJ2VudHJpZXMnIH0pO1xuXG4vLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHNlYXJjaHBhcmFtcy1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3JcbmRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIGdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuc2VyaWFsaXplKCk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8vIGBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnNpemVgIGdldHRlclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy91cmwvcHVsbC83MzRcbmlmIChERVNDUklQVE9SUykgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ3NpemUnLCB7XG4gIGdldDogZnVuY3Rpb24gc2l6ZSgpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzLmxlbmd0aDtcbiAgfSxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlXG59KTtcblxuc2V0VG9TdHJpbmdUYWcoVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsIFVSTF9TRUFSQ0hfUEFSQU1TKTtcblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMIH0sIHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvclxufSk7XG5cbi8vIFdyYXAgYGZldGNoYCBhbmQgYFJlcXVlc3RgIGZvciBjb3JyZWN0IHdvcmsgd2l0aCBwb2x5ZmlsbGVkIGBVUkxTZWFyY2hQYXJhbXNgXG5pZiAoIVVTRV9OQVRJVkVfVVJMICYmIGlzQ2FsbGFibGUoSGVhZGVycykpIHtcbiAgdmFyIGhlYWRlcnNIYXMgPSB1bmN1cnJ5VGhpcyhIZWFkZXJzUHJvdG90eXBlLmhhcyk7XG4gIHZhciBoZWFkZXJzU2V0ID0gdW5jdXJyeVRoaXMoSGVhZGVyc1Byb3RvdHlwZS5zZXQpO1xuXG4gIHZhciB3cmFwUmVxdWVzdE9wdGlvbnMgPSBmdW5jdGlvbiAoaW5pdCkge1xuICAgIGlmIChpc09iamVjdChpbml0KSkge1xuICAgICAgdmFyIGJvZHkgPSBpbml0LmJvZHk7XG4gICAgICB2YXIgaGVhZGVycztcbiAgICAgIGlmIChjbGFzc29mKGJvZHkpID09PSBVUkxfU0VBUkNIX1BBUkFNUykge1xuICAgICAgICBoZWFkZXJzID0gaW5pdC5oZWFkZXJzID8gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzKSA6IG5ldyBIZWFkZXJzKCk7XG4gICAgICAgIGlmICghaGVhZGVyc0hhcyhoZWFkZXJzLCAnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgICBoZWFkZXJzU2V0KGhlYWRlcnMsICdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlKGluaXQsIHtcbiAgICAgICAgICBib2R5OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgJHRvU3RyaW5nKGJvZHkpKSxcbiAgICAgICAgICBoZWFkZXJzOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgaGVhZGVycylcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSByZXR1cm4gaW5pdDtcbiAgfTtcblxuICBpZiAoaXNDYWxsYWJsZShuYXRpdmVGZXRjaCkpIHtcbiAgICAkKHsgZ2xvYmFsOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBkb250Q2FsbEdldFNldDogdHJ1ZSwgZm9yY2VkOiB0cnVlIH0sIHtcbiAgICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUZldGNoKGlucHV0LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHdyYXBSZXF1ZXN0T3B0aW9ucyhhcmd1bWVudHNbMV0pIDoge30pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzQ2FsbGFibGUoTmF0aXZlUmVxdWVzdCkpIHtcbiAgICB2YXIgUmVxdWVzdENvbnN0cnVjdG9yID0gZnVuY3Rpb24gUmVxdWVzdChpbnB1dCAvKiAsIGluaXQgKi8pIHtcbiAgICAgIGFuSW5zdGFuY2UodGhpcywgUmVxdWVzdFByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gbmV3IE5hdGl2ZVJlcXVlc3QoaW5wdXQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gd3JhcFJlcXVlc3RPcHRpb25zKGFyZ3VtZW50c1sxXSkgOiB7fSk7XG4gICAgfTtcblxuICAgIFJlcXVlc3RQcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZXF1ZXN0Q29uc3RydWN0b3I7XG4gICAgUmVxdWVzdENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IFJlcXVlc3RQcm90b3R5cGU7XG5cbiAgICAkKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgZG9udENhbGxHZXRTZXQ6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgICBSZXF1ZXN0OiBSZXF1ZXN0Q29uc3RydWN0b3JcbiAgICB9KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgVVJMU2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvcixcbiAgZ2V0U3RhdGU6IGdldEludGVybmFsUGFyYW1zU3RhdGVcbn07XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xuXG52YXIgJFVSTFNlYXJjaFBhcmFtcyA9IFVSTFNlYXJjaFBhcmFtcztcbnZhciBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUgPSAkVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcbnZhciBhcHBlbmQgPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuYXBwZW5kKTtcbnZhciAkZGVsZXRlID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlWydkZWxldGUnXSk7XG52YXIgZm9yRWFjaCA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5mb3JFYWNoKTtcbnZhciBwdXNoID0gdW5jdXJyeVRoaXMoW10ucHVzaCk7XG52YXIgcGFyYW1zID0gbmV3ICRVUkxTZWFyY2hQYXJhbXMoJ2E9MSZhPTImYj0zJyk7XG5cbnBhcmFtc1snZGVsZXRlJ10oJ2EnLCAxKTtcbi8vIGB1bmRlZmluZWRgIGNhc2UgaXMgYSBDaHJvbWl1bSAxMTcgYnVnXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xNDIyMlxucGFyYW1zWydkZWxldGUnXSgnYicsIHVuZGVmaW5lZCk7XG5cbmlmIChwYXJhbXMgKyAnJyAhPT0gJ2E9MicpIHtcbiAgZGVmaW5lQnVpbHRJbihVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsICdkZWxldGUnLCBmdW5jdGlvbiAobmFtZSAvKiAsIHZhbHVlICovKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyICR2YWx1ZSA9IGxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgaWYgKGxlbmd0aCAmJiAkdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICRkZWxldGUodGhpcywgbmFtZSk7XG4gICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICBmb3JFYWNoKHRoaXMsIGZ1bmN0aW9uICh2LCBrKSB7IC8vIGFsc28gdmFsaWRhdGVzIGB0aGlzYFxuICAgICAgcHVzaChlbnRyaWVzLCB7IGtleTogaywgdmFsdWU6IHYgfSk7XG4gICAgfSk7XG4gICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgobGVuZ3RoLCAxKTtcbiAgICB2YXIga2V5ID0gdG9TdHJpbmcobmFtZSk7XG4gICAgdmFyIHZhbHVlID0gdG9TdHJpbmcoJHZhbHVlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBkaW5kZXggPSAwO1xuICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgIHZhciBlbnRyaWVzTGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG4gICAgdmFyIGVudHJ5O1xuICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXNMZW5ndGgpIHtcbiAgICAgIGVudHJ5ID0gZW50cmllc1tpbmRleCsrXTtcbiAgICAgIGlmIChmb3VuZCB8fCBlbnRyeS5rZXkgPT09IGtleSkge1xuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICRkZWxldGUodGhpcywgZW50cnkua2V5KTtcbiAgICAgIH0gZWxzZSBkaW5kZXgrKztcbiAgICB9XG4gICAgd2hpbGUgKGRpbmRleCA8IGVudHJpZXNMZW5ndGgpIHtcbiAgICAgIGVudHJ5ID0gZW50cmllc1tkaW5kZXgrK107XG4gICAgICBpZiAoIShlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSA9PT0gdmFsdWUpKSBhcHBlbmQodGhpcywgZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7XG4gICAgfVxuICB9LCB7IGVudW1lcmFibGU6IHRydWUsIHVuc2FmZTogdHJ1ZSB9KTtcbn1cblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmRlbGV0ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmhhcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvdG8tc3RyaW5nICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tc3RyaW5nLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xuXG52YXIgJFVSTFNlYXJjaFBhcmFtcyA9IFVSTFNlYXJjaFBhcmFtcztcbnZhciBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUgPSAkVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcbnZhciBnZXRBbGwgPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuZ2V0QWxsKTtcbnZhciAkaGFzID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmhhcyk7XG52YXIgcGFyYW1zID0gbmV3ICRVUkxTZWFyY2hQYXJhbXMoJ2E9MScpO1xuXG4vLyBgdW5kZWZpbmVkYCBjYXNlIGlzIGEgQ2hyb21pdW0gMTE3IGJ1Z1xuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTQyMjJcbmlmIChwYXJhbXMuaGFzKCdhJywgMikgfHwgIXBhcmFtcy5oYXMoJ2EnLCB1bmRlZmluZWQpKSB7XG4gIGRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCAnaGFzJywgZnVuY3Rpb24gaGFzKG5hbWUgLyogLCB2YWx1ZSAqLykge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciAkdmFsdWUgPSBsZW5ndGggPCAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgIGlmIChsZW5ndGggJiYgJHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAkaGFzKHRoaXMsIG5hbWUpO1xuICAgIHZhciB2YWx1ZXMgPSBnZXRBbGwodGhpcywgbmFtZSk7IC8vIGFsc28gdmFsaWRhdGVzIGB0aGlzYFxuICAgIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGxlbmd0aCwgMSk7XG4gICAgdmFyIHZhbHVlID0gdG9TdHJpbmcoJHZhbHVlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIGlmICh2YWx1ZXNbaW5kZXgrK10gPT09IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICB9IHJldHVybiBmYWxzZTtcbiAgfSwgeyBlbnVtZXJhYmxlOiB0cnVlLCB1bnNhZmU6IHRydWUgfSk7XG59XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5oYXMuanM/Iil9KSwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5jb25zdHJ1Y3RvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuY29uc3RydWN0b3IuanNcIik7XG5cblxuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vYmFiZWwvLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLnNpemUuanMiOigoX191bnVzZWRfd2VicGFja19tb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pPT57ZXZhbCgiXG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi11bmN1cnJ5LXRoaXMuanNcIik7XG52YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3NvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi1hY2Nlc3Nvci5qc1wiKTtcblxudmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9IFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG52YXIgZm9yRWFjaCA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5mb3JFYWNoKTtcblxuLy8gYFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuc2l6ZWAgZ2V0dGVyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL3VybC9wdWxsLzczNFxuaWYgKERFU0NSSVBUT1JTICYmICEoJ3NpemUnIGluIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSkpIHtcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBzaXplKCkge1xuICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgIGZvckVhY2godGhpcywgZnVuY3Rpb24gKCkgeyBjb3VudCsrOyB9KTtcbiAgICAgIHJldHVybiBjb3VudDtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovL2JhYmVsLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuc2l6ZS5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5jb25zdHJ1Y3Rvci5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IGluIGNvcmUtanNANCwgbW92ZSAvbW9kdWxlcy8gZGVwZW5kZW5jaWVzIHRvIHB1YmxpYyBlbnRyaWVzIGZvciBiZXR0ZXIgb3B0aW1pemF0aW9uIGJ5IHRvb2xzIGxpa2UgYHByZXNldC1lbnZgXG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvciAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanNcIik7XG52YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9leHBvcnQgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanNcIik7XG52YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qc1wiKTtcbnZhciBVU0VfTkFUSVZFX1VSTCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy91cmwtY29uc3RydWN0b3ItZGV0ZWN0aW9uICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXJsLWNvbnN0cnVjdG9yLWRldGVjdGlvbi5qc1wiKTtcbnZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZ2xvYmFsICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzXCIpO1xudmFyIGJpbmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0ICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC1jb250ZXh0LmpzXCIpO1xudmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2Z1bmN0aW9uLXVuY3VycnktdGhpcy5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbiAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1idWlsdC1pbi5qc1wiKTtcbnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWJ1aWx0LWluLWFjY2Vzc29yLmpzXCIpO1xudmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qc1wiKTtcbnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9pbnRlcm5hbHMvaGFzLW93bi1wcm9wZXJ0eSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy1vd24tcHJvcGVydHkuanNcIik7XG52YXIgYXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL29iamVjdC1hc3NpZ24gKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzXCIpO1xudmFyIGFycmF5RnJvbSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9hcnJheS1mcm9tICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qc1wiKTtcbnZhciBhcnJheVNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2FycmF5LXNsaWNlLXNpbXBsZSAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNsaWNlLXNpbXBsZS5qc1wiKTtcbnZhciBjb2RlQXQgPSAoX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3N0cmluZy1tdWx0aWJ5dGUgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctbXVsdGlieXRlLmpzXCIpLmNvZGVBdCk7XG52YXIgdG9BU0NJSSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctcHVueWNvZGUtdG8tYXNjaWkuanNcIik7XG52YXIgJHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3RvLXN0cmluZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXN0cmluZy5qc1wiKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZyAqLyBcIi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzXCIpO1xudmFyIHZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLWFyZ3VtZW50cy1sZW5ndGggKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1hcmd1bWVudHMtbGVuZ3RoLmpzXCIpO1xudmFyIFVSTFNlYXJjaFBhcmFtc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4uL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLmNvbnN0cnVjdG9yICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5jb25zdHJ1Y3Rvci5qc1wiKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlICovIFwiLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUuanNcIik7XG5cbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxVUkxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKCdVUkwnKTtcbnZhciBVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuVVJMU2VhcmNoUGFyYW1zO1xudmFyIGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUgPSBVUkxTZWFyY2hQYXJhbXNNb2R1bGUuZ2V0U3RhdGU7XG5cbnZhciBOYXRpdmVVUkwgPSBnbG9iYWwuVVJMO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcGFyc2VJbnQgPSBnbG9iYWwucGFyc2VJbnQ7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGNoYXJBdCA9IHVuY3VycnlUaGlzKCcnLmNoYXJBdCk7XG52YXIgZXhlYyA9IHVuY3VycnlUaGlzKC8uLy5leGVjKTtcbnZhciBqb2luID0gdW5jdXJyeVRoaXMoW10uam9pbik7XG52YXIgbnVtYmVyVG9TdHJpbmcgPSB1bmN1cnJ5VGhpcygxLjAudG9TdHJpbmcpO1xudmFyIHBvcCA9IHVuY3VycnlUaGlzKFtdLnBvcCk7XG52YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpO1xudmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTtcbnZhciBzaGlmdCA9IHVuY3VycnlUaGlzKFtdLnNoaWZ0KTtcbnZhciBzcGxpdCA9IHVuY3VycnlUaGlzKCcnLnNwbGl0KTtcbnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTtcbnZhciB0b0xvd2VyQ2FzZSA9IHVuY3VycnlUaGlzKCcnLnRvTG93ZXJDYXNlKTtcbnZhciB1bnNoaWZ0ID0gdW5jdXJyeVRoaXMoW10udW5zaGlmdCk7XG5cbnZhciBJTlZBTElEX0FVVEhPUklUWSA9ICdJbnZhbGlkIGF1dGhvcml0eSc7XG52YXIgSU5WQUxJRF9TQ0hFTUUgPSAnSW52YWxpZCBzY2hlbWUnO1xudmFyIElOVkFMSURfSE9TVCA9ICdJbnZhbGlkIGhvc3QnO1xudmFyIElOVkFMSURfUE9SVCA9ICdJbnZhbGlkIHBvcnQnO1xuXG52YXIgQUxQSEEgPSAvW2Etel0vaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tb2JzY3VyZS1yYW5nZSAtLSBzYWZlXG52YXIgQUxQSEFOVU1FUklDID0gL1tcXGQrLS5hLXpdL2k7XG52YXIgRElHSVQgPSAvXFxkLztcbnZhciBIRVhfU1RBUlQgPSAvXjB4L2k7XG52YXIgT0NUID0gL15bMC03XSskLztcbnZhciBERUMgPSAvXlxcZCskLztcbnZhciBIRVggPSAvXltcXGRhLWZdKyQvaTtcbi8qIGVzbGludC1kaXNhYmxlIHJlZ2V4cC9uby1jb250cm9sLWNoYXJhY3RlciAtLSBzYWZlICovXG52YXIgRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVCA9IC9bXFwwXFx0XFxuXFxyICMlLzo8Pj9AW1xcXFxcXF1efF0vO1xudmFyIEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQgPSAvW1xcMFxcdFxcblxcciAjLzo8Pj9AW1xcXFxcXF1efF0vO1xudmFyIExFQURJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSA9IC9eW1xcdTAwMDAtXFx1MDAyMF0rLztcbnZhciBUUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFID0gLyhefFteXFx1MDAwMC1cXHUwMDIwXSlbXFx1MDAwMC1cXHUwMDIwXSskLztcbnZhciBUQUJfQU5EX05FV19MSU5FID0gL1tcXHRcXG5cXHJdL2c7XG4vKiBlc2xpbnQtZW5hYmxlIHJlZ2V4cC9uby1jb250cm9sLWNoYXJhY3RlciAtLSBzYWZlICovXG52YXIgRU9GO1xuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2lwdjQtbnVtYmVyLXBhcnNlclxudmFyIHBhcnNlSVB2NCA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICB2YXIgcGFydHMgPSBzcGxpdChpbnB1dCwgJy4nKTtcbiAgdmFyIHBhcnRzTGVuZ3RoLCBudW1iZXJzLCBpbmRleCwgcGFydCwgcmFkaXgsIG51bWJlciwgaXB2NDtcbiAgaWYgKHBhcnRzLmxlbmd0aCAmJiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA9PSAnJykge1xuICAgIHBhcnRzLmxlbmd0aC0tO1xuICB9XG4gIHBhcnRzTGVuZ3RoID0gcGFydHMubGVuZ3RoO1xuICBpZiAocGFydHNMZW5ndGggPiA0KSByZXR1cm4gaW5wdXQ7XG4gIG51bWJlcnMgPSBbXTtcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcGFydHNMZW5ndGg7IGluZGV4KyspIHtcbiAgICBwYXJ0ID0gcGFydHNbaW5kZXhdO1xuICAgIGlmIChwYXJ0ID09ICcnKSByZXR1cm4gaW5wdXQ7XG4gICAgcmFkaXggPSAxMDtcbiAgICBpZiAocGFydC5sZW5ndGggPiAxICYmIGNoYXJBdChwYXJ0LCAwKSA9PSAnMCcpIHtcbiAgICAgIHJhZGl4ID0gZXhlYyhIRVhfU1RBUlQsIHBhcnQpID8gMTYgOiA4O1xuICAgICAgcGFydCA9IHN0cmluZ1NsaWNlKHBhcnQsIHJhZGl4ID09IDggPyAxIDogMik7XG4gICAgfVxuICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgbnVtYmVyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFleGVjKHJhZGl4ID09IDEwID8gREVDIDogcmFkaXggPT0gOCA/IE9DVCA6IEhFWCwgcGFydCkpIHJldHVybiBpbnB1dDtcbiAgICAgIG51bWJlciA9IHBhcnNlSW50KHBhcnQsIHJhZGl4KTtcbiAgICB9XG4gICAgcHVzaChudW1iZXJzLCBudW1iZXIpO1xuICB9XG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBhcnRzTGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgbnVtYmVyID0gbnVtYmVyc1tpbmRleF07XG4gICAgaWYgKGluZGV4ID09IHBhcnRzTGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKG51bWJlciA+PSBwb3coMjU2LCA1IC0gcGFydHNMZW5ndGgpKSByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKG51bWJlciA+IDI1NSkgcmV0dXJuIG51bGw7XG4gIH1cbiAgaXB2NCA9IHBvcChudW1iZXJzKTtcbiAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYmVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBpcHY0ICs9IG51bWJlcnNbaW5kZXhdICogcG93KDI1NiwgMyAtIGluZGV4KTtcbiAgfVxuICByZXR1cm4gaXB2NDtcbn07XG5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1pcHY2LXBhcnNlclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzIC0tIFRPRE9cbnZhciBwYXJzZUlQdjYgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgdmFyIGFkZHJlc3MgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07XG4gIHZhciBwaWVjZUluZGV4ID0gMDtcbiAgdmFyIGNvbXByZXNzID0gbnVsbDtcbiAgdmFyIHBvaW50ZXIgPSAwO1xuICB2YXIgdmFsdWUsIGxlbmd0aCwgbnVtYmVyc1NlZW4sIGlwdjRQaWVjZSwgbnVtYmVyLCBzd2Fwcywgc3dhcDtcblxuICB2YXIgY2hyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjaGFyQXQoaW5wdXQsIHBvaW50ZXIpO1xuICB9O1xuXG4gIGlmIChjaHIoKSA9PSAnOicpIHtcbiAgICBpZiAoY2hhckF0KGlucHV0LCAxKSAhPSAnOicpIHJldHVybjtcbiAgICBwb2ludGVyICs9IDI7XG4gICAgcGllY2VJbmRleCsrO1xuICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcbiAgfVxuICB3aGlsZSAoY2hyKCkpIHtcbiAgICBpZiAocGllY2VJbmRleCA9PSA4KSByZXR1cm47XG4gICAgaWYgKGNocigpID09ICc6Jykge1xuICAgICAgaWYgKGNvbXByZXNzICE9PSBudWxsKSByZXR1cm47XG4gICAgICBwb2ludGVyKys7XG4gICAgICBwaWVjZUluZGV4Kys7XG4gICAgICBjb21wcmVzcyA9IHBpZWNlSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFsdWUgPSBsZW5ndGggPSAwO1xuICAgIHdoaWxlIChsZW5ndGggPCA0ICYmIGV4ZWMoSEVYLCBjaHIoKSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUgKiAxNiArIHBhcnNlSW50KGNocigpLCAxNik7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBsZW5ndGgrKztcbiAgICB9XG4gICAgaWYgKGNocigpID09ICcuJykge1xuICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICBwb2ludGVyIC09IGxlbmd0aDtcbiAgICAgIGlmIChwaWVjZUluZGV4ID4gNikgcmV0dXJuO1xuICAgICAgbnVtYmVyc1NlZW4gPSAwO1xuICAgICAgd2hpbGUgKGNocigpKSB7XG4gICAgICAgIGlwdjRQaWVjZSA9IG51bGw7XG4gICAgICAgIGlmIChudW1iZXJzU2VlbiA+IDApIHtcbiAgICAgICAgICBpZiAoY2hyKCkgPT0gJy4nICYmIG51bWJlcnNTZWVuIDwgNCkgcG9pbnRlcisrO1xuICAgICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhlYyhESUdJVCwgY2hyKCkpKSByZXR1cm47XG4gICAgICAgIHdoaWxlIChleGVjKERJR0lULCBjaHIoKSkpIHtcbiAgICAgICAgICBudW1iZXIgPSBwYXJzZUludChjaHIoKSwgMTApO1xuICAgICAgICAgIGlmIChpcHY0UGllY2UgPT09IG51bGwpIGlwdjRQaWVjZSA9IG51bWJlcjtcbiAgICAgICAgICBlbHNlIGlmIChpcHY0UGllY2UgPT0gMCkgcmV0dXJuO1xuICAgICAgICAgIGVsc2UgaXB2NFBpZWNlID0gaXB2NFBpZWNlICogMTAgKyBudW1iZXI7XG4gICAgICAgICAgaWYgKGlwdjRQaWVjZSA+IDI1NSkgcmV0dXJuO1xuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzW3BpZWNlSW5kZXhdID0gYWRkcmVzc1twaWVjZUluZGV4XSAqIDI1NiArIGlwdjRQaWVjZTtcbiAgICAgICAgbnVtYmVyc1NlZW4rKztcbiAgICAgICAgaWYgKG51bWJlcnNTZWVuID09IDIgfHwgbnVtYmVyc1NlZW4gPT0gNCkgcGllY2VJbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKG51bWJlcnNTZWVuICE9IDQpIHJldHVybjtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoY2hyKCkgPT0gJzonKSB7XG4gICAgICBwb2ludGVyKys7XG4gICAgICBpZiAoIWNocigpKSByZXR1cm47XG4gICAgfSBlbHNlIGlmIChjaHIoKSkgcmV0dXJuO1xuICAgIGFkZHJlc3NbcGllY2VJbmRleCsrXSA9IHZhbHVlO1xuICB9XG4gIGlmIChjb21wcmVzcyAhPT0gbnVsbCkge1xuICAgIHN3YXBzID0gcGllY2VJbmRleCAtIGNvbXByZXNzO1xuICAgIHBpZWNlSW5kZXggPSA3O1xuICAgIHdoaWxlIChwaWVjZUluZGV4ICE9IDAgJiYgc3dhcHMgPiAwKSB7XG4gICAgICBzd2FwID0gYWRkcmVzc1twaWVjZUluZGV4XTtcbiAgICAgIGFkZHJlc3NbcGllY2VJbmRleC0tXSA9IGFkZHJlc3NbY29tcHJlc3MgKyBzd2FwcyAtIDFdO1xuICAgICAgYWRkcmVzc1tjb21wcmVzcyArIC0tc3dhcHNdID0gc3dhcDtcbiAgICB9XG4gIH0gZWxzZSBpZiAocGllY2VJbmRleCAhPSA4KSByZXR1cm47XG4gIHJldHVybiBhZGRyZXNzO1xufTtcblxudmFyIGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlID0gZnVuY3Rpb24gKGlwdjYpIHtcbiAgdmFyIG1heEluZGV4ID0gbnVsbDtcbiAgdmFyIG1heExlbmd0aCA9IDE7XG4gIHZhciBjdXJyU3RhcnQgPSBudWxsO1xuICB2YXIgY3Vyckxlbmd0aCA9IDA7XG4gIHZhciBpbmRleCA9IDA7XG4gIGZvciAoOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICBpZiAoaXB2NltpbmRleF0gIT09IDApIHtcbiAgICAgIGlmIChjdXJyTGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgIG1heEluZGV4ID0gY3VyclN0YXJ0O1xuICAgICAgICBtYXhMZW5ndGggPSBjdXJyTGVuZ3RoO1xuICAgICAgfVxuICAgICAgY3VyclN0YXJ0ID0gbnVsbDtcbiAgICAgIGN1cnJMZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VyclN0YXJ0ID09PSBudWxsKSBjdXJyU3RhcnQgPSBpbmRleDtcbiAgICAgICsrY3Vyckxlbmd0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJMZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICBtYXhJbmRleCA9IGN1cnJTdGFydDtcbiAgICBtYXhMZW5ndGggPSBjdXJyTGVuZ3RoO1xuICB9XG4gIHJldHVybiBtYXhJbmRleDtcbn07XG5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaG9zdC1zZXJpYWxpemluZ1xudmFyIHNlcmlhbGl6ZUhvc3QgPSBmdW5jdGlvbiAoaG9zdCkge1xuICB2YXIgcmVzdWx0LCBpbmRleCwgY29tcHJlc3MsIGlnbm9yZTA7XG4gIC8vIGlwdjRcbiAgaWYgKHR5cGVvZiBob3N0ID09ICdudW1iZXInKSB7XG4gICAgcmVzdWx0ID0gW107XG4gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykge1xuICAgICAgdW5zaGlmdChyZXN1bHQsIGhvc3QgJSAyNTYpO1xuICAgICAgaG9zdCA9IGZsb29yKGhvc3QgLyAyNTYpO1xuICAgIH0gcmV0dXJuIGpvaW4ocmVzdWx0LCAnLicpO1xuICAvLyBpcHY2XG4gIH0gZWxzZSBpZiAodHlwZW9mIGhvc3QgPT0gJ29iamVjdCcpIHtcbiAgICByZXN1bHQgPSAnJztcbiAgICBjb21wcmVzcyA9IGZpbmRMb25nZXN0WmVyb1NlcXVlbmNlKGhvc3QpO1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDg7IGluZGV4KyspIHtcbiAgICAgIGlmIChpZ25vcmUwICYmIGhvc3RbaW5kZXhdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGlmIChpZ25vcmUwKSBpZ25vcmUwID0gZmFsc2U7XG4gICAgICBpZiAoY29tcHJlc3MgPT09IGluZGV4KSB7XG4gICAgICAgIHJlc3VsdCArPSBpbmRleCA/ICc6JyA6ICc6Oic7XG4gICAgICAgIGlnbm9yZTAgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG51bWJlclRvU3RyaW5nKGhvc3RbaW5kZXhdLCAxNik7XG4gICAgICAgIGlmIChpbmRleCA8IDcpIHJlc3VsdCArPSAnOic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnWycgKyByZXN1bHQgKyAnXSc7XG4gIH0gcmV0dXJuIGhvc3Q7XG59O1xuXG52YXIgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCA9IHt9O1xudmFyIGZyYWdtZW50UGVyY2VudEVuY29kZVNldCA9IGFzc2lnbih7fSwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCwge1xuICAnICc6IDEsICdcIic6IDEsICc8JzogMSwgJz4nOiAxLCAnYCc6IDFcbn0pO1xudmFyIHBhdGhQZXJjZW50RW5jb2RlU2V0ID0gYXNzaWduKHt9LCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQsIHtcbiAgJyMnOiAxLCAnPyc6IDEsICd7JzogMSwgJ30nOiAxXG59KTtcbnZhciB1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQgPSBhc3NpZ24oe30sIHBhdGhQZXJjZW50RW5jb2RlU2V0LCB7XG4gICcvJzogMSwgJzonOiAxLCAnOyc6IDEsICc9JzogMSwgJ0AnOiAxLCAnWyc6IDEsICdcXFxcJzogMSwgJ10nOiAxLCAnXic6IDEsICd8JzogMVxufSk7XG5cbnZhciBwZXJjZW50RW5jb2RlID0gZnVuY3Rpb24gKGNociwgc2V0KSB7XG4gIHZhciBjb2RlID0gY29kZUF0KGNociwgMCk7XG4gIHJldHVybiBjb2RlID4gMHgyMCAmJiBjb2RlIDwgMHg3RiAmJiAhaGFzT3duKHNldCwgY2hyKSA/IGNociA6IGVuY29kZVVSSUNvbXBvbmVudChjaHIpO1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzcGVjaWFsLXNjaGVtZVxudmFyIHNwZWNpYWxTY2hlbWVzID0ge1xuICBmdHA6IDIxLFxuICBmaWxlOiBudWxsLFxuICBodHRwOiA4MCxcbiAgaHR0cHM6IDQ0MyxcbiAgd3M6IDgwLFxuICB3c3M6IDQ0M1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN3aW5kb3dzLWRyaXZlLWxldHRlclxudmFyIGlzV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZywgbm9ybWFsaXplZCkge1xuICB2YXIgc2Vjb25kO1xuICByZXR1cm4gc3RyaW5nLmxlbmd0aCA9PSAyICYmIGV4ZWMoQUxQSEEsIGNoYXJBdChzdHJpbmcsIDApKVxuICAgICYmICgoc2Vjb25kID0gY2hhckF0KHN0cmluZywgMSkpID09ICc6JyB8fCAoIW5vcm1hbGl6ZWQgJiYgc2Vjb25kID09ICd8JykpO1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzdGFydC13aXRoLWEtd2luZG93cy1kcml2ZS1sZXR0ZXJcbnZhciBzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyID0gZnVuY3Rpb24gKHN0cmluZykge1xuICB2YXIgdGhpcmQ7XG4gIHJldHVybiBzdHJpbmcubGVuZ3RoID4gMSAmJiBpc1dpbmRvd3NEcml2ZUxldHRlcihzdHJpbmdTbGljZShzdHJpbmcsIDAsIDIpKSAmJiAoXG4gICAgc3RyaW5nLmxlbmd0aCA9PSAyIHx8XG4gICAgKCh0aGlyZCA9IGNoYXJBdChzdHJpbmcsIDIpKSA9PT0gJy8nIHx8IHRoaXJkID09PSAnXFxcXCcgfHwgdGhpcmQgPT09ICc/JyB8fCB0aGlyZCA9PT0gJyMnKVxuICApO1xufTtcblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzaW5nbGUtZG90LXBhdGgtc2VnbWVudFxudmFyIGlzU2luZ2xlRG90ID0gZnVuY3Rpb24gKHNlZ21lbnQpIHtcbiAgcmV0dXJuIHNlZ21lbnQgPT09ICcuJyB8fCB0b0xvd2VyQ2FzZShzZWdtZW50KSA9PT0gJyUyZSc7XG59O1xuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvdWJsZS1kb3QtcGF0aC1zZWdtZW50XG52YXIgaXNEb3VibGVEb3QgPSBmdW5jdGlvbiAoc2VnbWVudCkge1xuICBzZWdtZW50ID0gdG9Mb3dlckNhc2Uoc2VnbWVudCk7XG4gIHJldHVybiBzZWdtZW50ID09PSAnLi4nIHx8IHNlZ21lbnQgPT09ICclMmUuJyB8fCBzZWdtZW50ID09PSAnLiUyZScgfHwgc2VnbWVudCA9PT0gJyUyZSUyZSc7XG59O1xuXG4vLyBTdGF0ZXM6XG52YXIgU0NIRU1FX1NUQVJUID0ge307XG52YXIgU0NIRU1FID0ge307XG52YXIgTk9fU0NIRU1FID0ge307XG52YXIgU1BFQ0lBTF9SRUxBVElWRV9PUl9BVVRIT1JJVFkgPSB7fTtcbnZhciBQQVRIX09SX0FVVEhPUklUWSA9IHt9O1xudmFyIFJFTEFUSVZFID0ge307XG52YXIgUkVMQVRJVkVfU0xBU0ggPSB7fTtcbnZhciBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTID0ge307XG52YXIgU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMgPSB7fTtcbnZhciBBVVRIT1JJVFkgPSB7fTtcbnZhciBIT1NUID0ge307XG52YXIgSE9TVE5BTUUgPSB7fTtcbnZhciBQT1JUID0ge307XG52YXIgRklMRSA9IHt9O1xudmFyIEZJTEVfU0xBU0ggPSB7fTtcbnZhciBGSUxFX0hPU1QgPSB7fTtcbnZhciBQQVRIX1NUQVJUID0ge307XG52YXIgUEFUSCA9IHt9O1xudmFyIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEggPSB7fTtcbnZhciBRVUVSWSA9IHt9O1xudmFyIEZSQUdNRU5UID0ge307XG5cbnZhciBVUkxTdGF0ZSA9IGZ1bmN0aW9uICh1cmwsIGlzQmFzZSwgYmFzZSkge1xuICB2YXIgdXJsU3RyaW5nID0gJHRvU3RyaW5nKHVybCk7XG4gIHZhciBiYXNlU3RhdGUsIGZhaWx1cmUsIHNlYXJjaFBhcmFtcztcbiAgaWYgKGlzQmFzZSkge1xuICAgIGZhaWx1cmUgPSB0aGlzLnBhcnNlKHVybFN0cmluZyk7XG4gICAgaWYgKGZhaWx1cmUpIHRocm93IFR5cGVFcnJvcihmYWlsdXJlKTtcbiAgICB0aGlzLnNlYXJjaFBhcmFtcyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkgYmFzZVN0YXRlID0gbmV3IFVSTFN0YXRlKGJhc2UsIHRydWUpO1xuICAgIGZhaWx1cmUgPSB0aGlzLnBhcnNlKHVybFN0cmluZywgbnVsbCwgYmFzZVN0YXRlKTtcbiAgICBpZiAoZmFpbHVyZSkgdGhyb3cgVHlwZUVycm9yKGZhaWx1cmUpO1xuICAgIHNlYXJjaFBhcmFtcyA9IGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUobmV3IFVSTFNlYXJjaFBhcmFtcygpKTtcbiAgICBzZWFyY2hQYXJhbXMuYmluZFVSTCh0aGlzKTtcbiAgICB0aGlzLnNlYXJjaFBhcmFtcyA9IHNlYXJjaFBhcmFtcztcbiAgfVxufTtcblxuVVJMU3RhdGUucHJvdG90eXBlID0ge1xuICB0eXBlOiAnVVJMJyxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmwtcGFyc2luZ1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHMgLS0gVE9ET1xuICBwYXJzZTogZnVuY3Rpb24gKGlucHV0LCBzdGF0ZU92ZXJyaWRlLCBiYXNlKSB7XG4gICAgdmFyIHVybCA9IHRoaXM7XG4gICAgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCBTQ0hFTUVfU1RBUlQ7XG4gICAgdmFyIHBvaW50ZXIgPSAwO1xuICAgIHZhciBidWZmZXIgPSAnJztcbiAgICB2YXIgc2VlbkF0ID0gZmFsc2U7XG4gICAgdmFyIHNlZW5CcmFja2V0ID0gZmFsc2U7XG4gICAgdmFyIHNlZW5QYXNzd29yZFRva2VuID0gZmFsc2U7XG4gICAgdmFyIGNvZGVQb2ludHMsIGNociwgYnVmZmVyQ29kZVBvaW50cywgZmFpbHVyZTtcblxuICAgIGlucHV0ID0gJHRvU3RyaW5nKGlucHV0KTtcblxuICAgIGlmICghc3RhdGVPdmVycmlkZSkge1xuICAgICAgdXJsLnNjaGVtZSA9ICcnO1xuICAgICAgdXJsLnVzZXJuYW1lID0gJyc7XG4gICAgICB1cmwucGFzc3dvcmQgPSAnJztcbiAgICAgIHVybC5ob3N0ID0gbnVsbDtcbiAgICAgIHVybC5wb3J0ID0gbnVsbDtcbiAgICAgIHVybC5wYXRoID0gW107XG4gICAgICB1cmwucXVlcnkgPSBudWxsO1xuICAgICAgdXJsLmZyYWdtZW50ID0gbnVsbDtcbiAgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gZmFsc2U7XG4gICAgICBpbnB1dCA9IHJlcGxhY2UoaW5wdXQsIExFQURJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRSwgJycpO1xuICAgICAgaW5wdXQgPSByZXBsYWNlKGlucHV0LCBUUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFLCAnJDEnKTtcbiAgICB9XG5cbiAgICBpbnB1dCA9IHJlcGxhY2UoaW5wdXQsIFRBQl9BTkRfTkVXX0xJTkUsICcnKTtcblxuICAgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpO1xuXG4gICAgd2hpbGUgKHBvaW50ZXIgPD0gY29kZVBvaW50cy5sZW5ndGgpIHtcbiAgICAgIGNociA9IGNvZGVQb2ludHNbcG9pbnRlcl07XG4gICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgIGNhc2UgU0NIRU1FX1NUQVJUOlxuICAgICAgICAgIGlmIChjaHIgJiYgZXhlYyhBTFBIQSwgY2hyKSkge1xuICAgICAgICAgICAgYnVmZmVyICs9IHRvTG93ZXJDYXNlKGNocik7XG4gICAgICAgICAgICBzdGF0ZSA9IFNDSEVNRTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IE5PX1NDSEVNRTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBTQ0hFTUU6XG4gICAgICAgICAgaWYgKGNociAmJiAoZXhlYyhBTFBIQU5VTUVSSUMsIGNocikgfHwgY2hyID09ICcrJyB8fCBjaHIgPT0gJy0nIHx8IGNociA9PSAnLicpKSB7XG4gICAgICAgICAgICBidWZmZXIgKz0gdG9Mb3dlckNhc2UoY2hyKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnOicpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIChcbiAgICAgICAgICAgICAgKHVybC5pc1NwZWNpYWwoKSAhPSBoYXNPd24oc3BlY2lhbFNjaGVtZXMsIGJ1ZmZlcikpIHx8XG4gICAgICAgICAgICAgIChidWZmZXIgPT0gJ2ZpbGUnICYmICh1cmwuaW5jbHVkZXNDcmVkZW50aWFscygpIHx8IHVybC5wb3J0ICE9PSBudWxsKSkgfHxcbiAgICAgICAgICAgICAgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnICYmICF1cmwuaG9zdClcbiAgICAgICAgICAgICkpIHJldHVybjtcbiAgICAgICAgICAgIHVybC5zY2hlbWUgPSBidWZmZXI7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgICBpZiAodXJsLmlzU3BlY2lhbCgpICYmIHNwZWNpYWxTY2hlbWVzW3VybC5zY2hlbWVdID09IHVybC5wb3J0KSB1cmwucG9ydCA9IG51bGw7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgaWYgKHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICAgIHN0YXRlID0gRklMRTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsLmlzU3BlY2lhbCgpICYmIGJhc2UgJiYgYmFzZS5zY2hlbWUgPT0gdXJsLnNjaGVtZSkge1xuICAgICAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfUkVMQVRJVkVfT1JfQVVUSE9SSVRZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuaXNTcGVjaWFsKCkpIHtcbiAgICAgICAgICAgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHtcbiAgICAgICAgICAgICAgc3RhdGUgPSBQQVRIX09SX0FVVEhPUklUWTtcbiAgICAgICAgICAgICAgcG9pbnRlcisrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdXJsLmNhbm5vdEJlQUJhc2VVUkwgPSB0cnVlO1xuICAgICAgICAgICAgICBwdXNoKHVybC5wYXRoLCAnJyk7XG4gICAgICAgICAgICAgIHN0YXRlID0gQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZU92ZXJyaWRlKSB7XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gTk9fU0NIRU1FO1xuICAgICAgICAgICAgcG9pbnRlciA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuIElOVkFMSURfU0NIRU1FO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgTk9fU0NIRU1FOlxuICAgICAgICAgIGlmICghYmFzZSB8fCAoYmFzZS5jYW5ub3RCZUFCYXNlVVJMICYmIGNociAhPSAnIycpKSByZXR1cm4gSU5WQUxJRF9TQ0hFTUU7XG4gICAgICAgICAgaWYgKGJhc2UuY2Fubm90QmVBQmFzZVVSTCAmJiBjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuc2NoZW1lID0gYmFzZS5zY2hlbWU7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUgPSBiYXNlLnNjaGVtZSA9PSAnZmlsZScgPyBGSUxFIDogUkVMQVRJVkU7XG4gICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgY2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWTpcbiAgICAgICAgICBpZiAoY2hyID09ICcvJyAmJiBjb2RlUG9pbnRzW3BvaW50ZXIgKyAxXSA9PSAnLycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gU1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7XG4gICAgICAgICAgICBwb2ludGVyKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gUkVMQVRJVkU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUEFUSF9PUl9BVVRIT1JJVFk6XG4gICAgICAgICAgaWYgKGNociA9PSAnLycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFTEFUSVZFOlxuICAgICAgICAgIHVybC5zY2hlbWUgPSBiYXNlLnNjaGVtZTtcbiAgICAgICAgICBpZiAoY2hyID09IEVPRikge1xuICAgICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgICAgdXJsLnBhdGggPSBhcnJheVNsaWNlKGJhc2UucGF0aCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICcvJyB8fCAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFJFTEFUSVZFX1NMQVNIO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICc/Jykge1xuICAgICAgICAgICAgdXJsLnVzZXJuYW1lID0gYmFzZS51c2VybmFtZTtcbiAgICAgICAgICAgIHVybC5wYXNzd29yZCA9IGJhc2UucGFzc3dvcmQ7XG4gICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gYmFzZS5wb3J0O1xuICAgICAgICAgICAgdXJsLnBhdGggPSBhcnJheVNsaWNlKGJhc2UucGF0aCk7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgIHVybC5xdWVyeSA9IGJhc2UucXVlcnk7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybC51c2VybmFtZSA9IGJhc2UudXNlcm5hbWU7XG4gICAgICAgICAgICB1cmwucGFzc3dvcmQgPSBiYXNlLnBhc3N3b3JkO1xuICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICB1cmwucG9ydCA9IGJhc2UucG9ydDtcbiAgICAgICAgICAgIHVybC5wYXRoID0gYXJyYXlTbGljZShiYXNlLnBhdGgpO1xuICAgICAgICAgICAgdXJsLnBhdGgubGVuZ3RoLS07XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUkVMQVRJVkVfU0xBU0g6XG4gICAgICAgICAgaWYgKHVybC5pc1NwZWNpYWwoKSAmJiAoY2hyID09ICcvJyB8fCBjaHIgPT0gJ1xcXFwnKSkge1xuICAgICAgICAgICAgc3RhdGUgPSBTUEVDSUFMX0FVVEhPUklUWV9JR05PUkVfU0xBU0hFUztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnLycpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmwudXNlcm5hbWUgPSBiYXNlLnVzZXJuYW1lO1xuICAgICAgICAgICAgdXJsLnBhc3N3b3JkID0gYmFzZS5wYXNzd29yZDtcbiAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgdXJsLnBvcnQgPSBiYXNlLnBvcnQ7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgU1BFQ0lBTF9BVVRIT1JJVFlfU0xBU0hFUzpcbiAgICAgICAgICBzdGF0ZSA9IFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTO1xuICAgICAgICAgIGlmIChjaHIgIT0gJy8nIHx8IGNoYXJBdChidWZmZXIsIHBvaW50ZXIgKyAxKSAhPSAnLycpIGNvbnRpbnVlO1xuICAgICAgICAgIHBvaW50ZXIrKztcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOlxuICAgICAgICAgIGlmIChjaHIgIT0gJy8nICYmIGNociAhPSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQVVUSE9SSVRZO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEFVVEhPUklUWTpcbiAgICAgICAgICBpZiAoY2hyID09ICdAJykge1xuICAgICAgICAgICAgaWYgKHNlZW5BdCkgYnVmZmVyID0gJyU0MCcgKyBidWZmZXI7XG4gICAgICAgICAgICBzZWVuQXQgPSB0cnVlO1xuICAgICAgICAgICAgYnVmZmVyQ29kZVBvaW50cyA9IGFycmF5RnJvbShidWZmZXIpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWZmZXJDb2RlUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBidWZmZXJDb2RlUG9pbnRzW2ldO1xuICAgICAgICAgICAgICBpZiAoY29kZVBvaW50ID09ICc6JyAmJiAhc2VlblBhc3N3b3JkVG9rZW4pIHtcbiAgICAgICAgICAgICAgICBzZWVuUGFzc3dvcmRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2RlUG9pbnRzID0gcGVyY2VudEVuY29kZShjb2RlUG9pbnQsIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgICAgICAgIGlmIChzZWVuUGFzc3dvcmRUb2tlbikgdXJsLnBhc3N3b3JkICs9IGVuY29kZWRDb2RlUG9pbnRzO1xuICAgICAgICAgICAgICBlbHNlIHVybC51c2VybmFtZSArPSBlbmNvZGVkQ29kZVBvaW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaHIgPT0gRU9GIHx8IGNociA9PSAnLycgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnIHx8XG4gICAgICAgICAgICAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoc2VlbkF0ICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfQVVUSE9SSVRZO1xuICAgICAgICAgICAgcG9pbnRlciAtPSBhcnJheUZyb20oYnVmZmVyKS5sZW5ndGggKyAxO1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IEhPU1Q7XG4gICAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaHI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBIT1NUOlxuICAgICAgICBjYXNlIEhPU1ROQU1FOlxuICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIHVybC5zY2hlbWUgPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICc6JyAmJiAhc2VlbkJyYWNrZXQpIHtcbiAgICAgICAgICAgIGlmIChidWZmZXIgPT0gJycpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICAgICAgICBmYWlsdXJlID0gdXJsLnBhcnNlSG9zdChidWZmZXIpO1xuICAgICAgICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlO1xuICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFBPUlQ7XG4gICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSA9PSBIT1NUTkFNRSkgcmV0dXJuO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaHIgPT0gRU9GIHx8IGNociA9PSAnLycgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnIHx8XG4gICAgICAgICAgICAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodXJsLmlzU3BlY2lhbCgpICYmIGJ1ZmZlciA9PSAnJykgcmV0dXJuIElOVkFMSURfSE9TVDtcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlICYmIGJ1ZmZlciA9PSAnJyAmJiAodXJsLmluY2x1ZGVzQ3JlZGVudGlhbHMoKSB8fCB1cmwucG9ydCAhPT0gbnVsbCkpIHJldHVybjtcbiAgICAgICAgICAgIGZhaWx1cmUgPSB1cmwucGFyc2VIb3N0KGJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICAgIGlmIChzdGF0ZU92ZXJyaWRlKSByZXR1cm47XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNociA9PSAnWycpIHNlZW5CcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNociA9PSAnXScpIHNlZW5CcmFja2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBidWZmZXIgKz0gY2hyO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQT1JUOlxuICAgICAgICAgIGlmIChleGVjKERJR0lULCBjaHIpKSB7XG4gICAgICAgICAgICBidWZmZXIgKz0gY2hyO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaHIgPT0gRU9GIHx8IGNociA9PSAnLycgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnIHx8XG4gICAgICAgICAgICAoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpIHx8XG4gICAgICAgICAgICBzdGF0ZU92ZXJyaWRlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoYnVmZmVyICE9ICcnKSB7XG4gICAgICAgICAgICAgIHZhciBwb3J0ID0gcGFyc2VJbnQoYnVmZmVyLCAxMCk7XG4gICAgICAgICAgICAgIGlmIChwb3J0ID4gMHhGRkZGKSByZXR1cm4gSU5WQUxJRF9QT1JUO1xuICAgICAgICAgICAgICB1cmwucG9ydCA9ICh1cmwuaXNTcGVjaWFsKCkgJiYgcG9ydCA9PT0gc3BlY2lhbFNjaGVtZXNbdXJsLnNjaGVtZV0pID8gbnVsbCA6IHBvcnQ7XG4gICAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHJldHVybjtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gSU5WQUxJRF9QT1JUO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRklMRTpcbiAgICAgICAgICB1cmwuc2NoZW1lID0gJ2ZpbGUnO1xuICAgICAgICAgIGlmIChjaHIgPT0gJy8nIHx8IGNociA9PSAnXFxcXCcpIHN0YXRlID0gRklMRV9TTEFTSDtcbiAgICAgICAgICBlbHNlIGlmIChiYXNlICYmIGJhc2Uuc2NoZW1lID09ICdmaWxlJykge1xuICAgICAgICAgICAgaWYgKGNociA9PSBFT0YpIHtcbiAgICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICAgIHVybC5wYXRoID0gYXJyYXlTbGljZShiYXNlLnBhdGgpO1xuICAgICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJz8nKSB7XG4gICAgICAgICAgICAgIHVybC5ob3N0ID0gYmFzZS5ob3N0O1xuICAgICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnIycpIHtcbiAgICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgICAgIHVybC5wYXRoID0gYXJyYXlTbGljZShiYXNlLnBhdGgpO1xuICAgICAgICAgICAgICB1cmwucXVlcnkgPSBiYXNlLnF1ZXJ5O1xuICAgICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgICAgc3RhdGUgPSBGUkFHTUVOVDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghc3RhcnRzV2l0aFdpbmRvd3NEcml2ZUxldHRlcihqb2luKGFycmF5U2xpY2UoY29kZVBvaW50cywgcG9pbnRlciksICcnKSkpIHtcbiAgICAgICAgICAgICAgICB1cmwuaG9zdCA9IGJhc2UuaG9zdDtcbiAgICAgICAgICAgICAgICB1cmwucGF0aCA9IGFycmF5U2xpY2UoYmFzZS5wYXRoKTtcbiAgICAgICAgICAgICAgICB1cmwuc2hvcnRlblBhdGgoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRklMRV9TTEFTSDpcbiAgICAgICAgICBpZiAoY2hyID09ICcvJyB8fCBjaHIgPT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEZJTEVfSE9TVDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYmFzZSAmJiBiYXNlLnNjaGVtZSA9PSAnZmlsZScgJiYgIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoam9pbihhcnJheVNsaWNlKGNvZGVQb2ludHMsIHBvaW50ZXIpLCAnJykpKSB7XG4gICAgICAgICAgICBpZiAoaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYmFzZS5wYXRoWzBdLCB0cnVlKSkgcHVzaCh1cmwucGF0aCwgYmFzZS5wYXRoWzBdKTtcbiAgICAgICAgICAgIGVsc2UgdXJsLmhvc3QgPSBiYXNlLmhvc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICBjYXNlIEZJTEVfSE9TVDpcbiAgICAgICAgICBpZiAoY2hyID09IEVPRiB8fCBjaHIgPT0gJy8nIHx8IGNociA9PSAnXFxcXCcgfHwgY2hyID09ICc/JyB8fCBjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXIoYnVmZmVyKSkge1xuICAgICAgICAgICAgICBzdGF0ZSA9IFBBVEg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlciA9PSAnJykge1xuICAgICAgICAgICAgICB1cmwuaG9zdCA9ICcnO1xuICAgICAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkgcmV0dXJuO1xuICAgICAgICAgICAgICBzdGF0ZSA9IFBBVEhfU1RBUlQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmYWlsdXJlID0gdXJsLnBhcnNlSG9zdChidWZmZXIpO1xuICAgICAgICAgICAgICBpZiAoZmFpbHVyZSkgcmV0dXJuIGZhaWx1cmU7XG4gICAgICAgICAgICAgIGlmICh1cmwuaG9zdCA9PSAnbG9jYWxob3N0JykgdXJsLmhvc3QgPSAnJztcbiAgICAgICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHJldHVybjtcbiAgICAgICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gUEFUSF9TVEFSVDtcbiAgICAgICAgICAgIH0gY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGJ1ZmZlciArPSBjaHI7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQQVRIX1NUQVJUOlxuICAgICAgICAgIGlmICh1cmwuaXNTcGVjaWFsKCkpIHtcbiAgICAgICAgICAgIHN0YXRlID0gUEFUSDtcbiAgICAgICAgICAgIGlmIChjaHIgIT0gJy8nICYmIGNociAhPSAnXFxcXCcpIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hyID09ICc/Jykge1xuICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IFFVRVJZO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUgJiYgY2hyID09ICcjJykge1xuICAgICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgICBzdGF0ZSA9IEZSQUdNRU5UO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hyICE9IEVPRikge1xuICAgICAgICAgICAgc3RhdGUgPSBQQVRIO1xuICAgICAgICAgICAgaWYgKGNociAhPSAnLycpIGNvbnRpbnVlO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBQQVRIOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNociA9PSBFT0YgfHwgY2hyID09ICcvJyB8fFxuICAgICAgICAgICAgKGNociA9PSAnXFxcXCcgJiYgdXJsLmlzU3BlY2lhbCgpKSB8fFxuICAgICAgICAgICAgKCFzdGF0ZU92ZXJyaWRlICYmIChjaHIgPT0gJz8nIHx8IGNociA9PSAnIycpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGlzRG91YmxlRG90KGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgdXJsLnNob3J0ZW5QYXRoKCk7XG4gICAgICAgICAgICAgIGlmIChjaHIgIT0gJy8nICYmICEoY2hyID09ICdcXFxcJyAmJiB1cmwuaXNTcGVjaWFsKCkpKSB7XG4gICAgICAgICAgICAgICAgcHVzaCh1cmwucGF0aCwgJycpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU2luZ2xlRG90KGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgaWYgKGNociAhPSAnLycgJiYgIShjaHIgPT0gJ1xcXFwnICYmIHVybC5pc1NwZWNpYWwoKSkpIHtcbiAgICAgICAgICAgICAgICBwdXNoKHVybC5wYXRoLCAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJyAmJiAhdXJsLnBhdGgubGVuZ3RoICYmIGlzV2luZG93c0RyaXZlTGV0dGVyKGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsLmhvc3QpIHVybC5ob3N0ID0gJyc7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gY2hhckF0KGJ1ZmZlciwgMCkgKyAnOic7IC8vIG5vcm1hbGl6ZSB3aW5kb3dzIGRyaXZlIGxldHRlclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHB1c2godXJsLnBhdGgsIGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICAgIGlmICh1cmwuc2NoZW1lID09ICdmaWxlJyAmJiAoY2hyID09IEVPRiB8fCBjaHIgPT0gJz8nIHx8IGNociA9PSAnIycpKSB7XG4gICAgICAgICAgICAgIHdoaWxlICh1cmwucGF0aC5sZW5ndGggPiAxICYmIHVybC5wYXRoWzBdID09PSAnJykge1xuICAgICAgICAgICAgICAgIHNoaWZ0KHVybC5wYXRoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNociA9PSAnPycpIHtcbiAgICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PSAnIycpIHtcbiAgICAgICAgICAgICAgdXJsLmZyYWdtZW50ID0gJyc7XG4gICAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmZlciArPSBwZXJjZW50RW5jb2RlKGNociwgcGF0aFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDQU5OT1RfQkVfQV9CQVNFX1VSTF9QQVRIOlxuICAgICAgICAgIGlmIChjaHIgPT0gJz8nKSB7XG4gICAgICAgICAgICB1cmwucXVlcnkgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gUVVFUlk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgIT0gRU9GKSB7XG4gICAgICAgICAgICB1cmwucGF0aFswXSArPSBwZXJjZW50RW5jb2RlKGNociwgQzBDb250cm9sUGVyY2VudEVuY29kZVNldCk7XG4gICAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIFFVRVJZOlxuICAgICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiBjaHIgPT0gJyMnKSB7XG4gICAgICAgICAgICB1cmwuZnJhZ21lbnQgPSAnJztcbiAgICAgICAgICAgIHN0YXRlID0gRlJBR01FTlQ7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaHIgIT0gRU9GKSB7XG4gICAgICAgICAgICBpZiAoY2hyID09IFwiJ1wiICYmIHVybC5pc1NwZWNpYWwoKSkgdXJsLnF1ZXJ5ICs9ICclMjcnO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hyID09ICcjJykgdXJsLnF1ZXJ5ICs9ICclMjMnO1xuICAgICAgICAgICAgZWxzZSB1cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShjaHIsIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBGUkFHTUVOVDpcbiAgICAgICAgICBpZiAoY2hyICE9IEVPRikgdXJsLmZyYWdtZW50ICs9IHBlcmNlbnRFbmNvZGUoY2hyLCBmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwb2ludGVyKys7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2hvc3QtcGFyc2luZ1xuICBwYXJzZUhvc3Q6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHZhciByZXN1bHQsIGNvZGVQb2ludHMsIGluZGV4O1xuICAgIGlmIChjaGFyQXQoaW5wdXQsIDApID09ICdbJykge1xuICAgICAgaWYgKGNoYXJBdChpbnB1dCwgaW5wdXQubGVuZ3RoIC0gMSkgIT0gJ10nKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgICAgcmVzdWx0ID0gcGFyc2VJUHY2KHN0cmluZ1NsaWNlKGlucHV0LCAxLCAtMSkpO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICB0aGlzLmhvc3QgPSByZXN1bHQ7XG4gICAgLy8gb3BhcXVlIGhvc3RcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU3BlY2lhbCgpKSB7XG4gICAgICBpZiAoZXhlYyhGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5ULCBpbnB1dCkpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICByZXN1bHQgPSAnJztcbiAgICAgIGNvZGVQb2ludHMgPSBhcnJheUZyb20oaW5wdXQpO1xuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29kZVBvaW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ICs9IHBlcmNlbnRFbmNvZGUoY29kZVBvaW50c1tpbmRleF0sIEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpO1xuICAgICAgfVxuICAgICAgdGhpcy5ob3N0ID0gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dCA9IHRvQVNDSUkoaW5wdXQpO1xuICAgICAgaWYgKGV4ZWMoRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVCwgaW5wdXQpKSByZXR1cm4gSU5WQUxJRF9IT1NUO1xuICAgICAgcmVzdWx0ID0gcGFyc2VJUHY0KGlucHV0KTtcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybiBJTlZBTElEX0hPU1Q7XG4gICAgICB0aGlzLmhvc3QgPSByZXN1bHQ7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2Nhbm5vdC1oYXZlLWEtdXNlcm5hbWUtcGFzc3dvcmQtcG9ydFxuICBjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gIXRoaXMuaG9zdCB8fCB0aGlzLmNhbm5vdEJlQUJhc2VVUkwgfHwgdGhpcy5zY2hlbWUgPT0gJ2ZpbGUnO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2luY2x1ZGUtY3JlZGVudGlhbHNcbiAgaW5jbHVkZXNDcmVkZW50aWFsczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnVzZXJuYW1lICE9ICcnIHx8IHRoaXMucGFzc3dvcmQgIT0gJyc7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jaXMtc3BlY2lhbFxuICBpc1NwZWNpYWw6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaGFzT3duKHNwZWNpYWxTY2hlbWVzLCB0aGlzLnNjaGVtZSk7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jc2hvcnRlbi1hLXVybHMtcGF0aFxuICBzaG9ydGVuUGF0aDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXRoID0gdGhpcy5wYXRoO1xuICAgIHZhciBwYXRoU2l6ZSA9IHBhdGgubGVuZ3RoO1xuICAgIGlmIChwYXRoU2l6ZSAmJiAodGhpcy5zY2hlbWUgIT0gJ2ZpbGUnIHx8IHBhdGhTaXplICE9IDEgfHwgIWlzV2luZG93c0RyaXZlTGV0dGVyKHBhdGhbMF0sIHRydWUpKSkge1xuICAgICAgcGF0aC5sZW5ndGgtLTtcbiAgICB9XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC11cmwtc2VyaWFsaXplclxuICBzZXJpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdXJsID0gdGhpcztcbiAgICB2YXIgc2NoZW1lID0gdXJsLnNjaGVtZTtcbiAgICB2YXIgdXNlcm5hbWUgPSB1cmwudXNlcm5hbWU7XG4gICAgdmFyIHBhc3N3b3JkID0gdXJsLnBhc3N3b3JkO1xuICAgIHZhciBob3N0ID0gdXJsLmhvc3Q7XG4gICAgdmFyIHBvcnQgPSB1cmwucG9ydDtcbiAgICB2YXIgcGF0aCA9IHVybC5wYXRoO1xuICAgIHZhciBxdWVyeSA9IHVybC5xdWVyeTtcbiAgICB2YXIgZnJhZ21lbnQgPSB1cmwuZnJhZ21lbnQ7XG4gICAgdmFyIG91dHB1dCA9IHNjaGVtZSArICc6JztcbiAgICBpZiAoaG9zdCAhPT0gbnVsbCkge1xuICAgICAgb3V0cHV0ICs9ICcvLyc7XG4gICAgICBpZiAodXJsLmluY2x1ZGVzQ3JlZGVudGlhbHMoKSkge1xuICAgICAgICBvdXRwdXQgKz0gdXNlcm5hbWUgKyAocGFzc3dvcmQgPyAnOicgKyBwYXNzd29yZCA6ICcnKSArICdAJztcbiAgICAgIH1cbiAgICAgIG91dHB1dCArPSBzZXJpYWxpemVIb3N0KGhvc3QpO1xuICAgICAgaWYgKHBvcnQgIT09IG51bGwpIG91dHB1dCArPSAnOicgKyBwb3J0O1xuICAgIH0gZWxzZSBpZiAoc2NoZW1lID09ICdmaWxlJykgb3V0cHV0ICs9ICcvLyc7XG4gICAgb3V0cHV0ICs9IHVybC5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgam9pbihwYXRoLCAnLycpIDogJyc7XG4gICAgaWYgKHF1ZXJ5ICE9PSBudWxsKSBvdXRwdXQgKz0gJz8nICsgcXVlcnk7XG4gICAgaWYgKGZyYWdtZW50ICE9PSBudWxsKSBvdXRwdXQgKz0gJyMnICsgZnJhZ21lbnQ7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhyZWZcbiAgc2V0SHJlZjogZnVuY3Rpb24gKGhyZWYpIHtcbiAgICB2YXIgZmFpbHVyZSA9IHRoaXMucGFyc2UoaHJlZik7XG4gICAgaWYgKGZhaWx1cmUpIHRocm93IFR5cGVFcnJvcihmYWlsdXJlKTtcbiAgICB0aGlzLnNlYXJjaFBhcmFtcy51cGRhdGUoKTtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLW9yaWdpblxuICBnZXRPcmlnaW46IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2NoZW1lID0gdGhpcy5zY2hlbWU7XG4gICAgdmFyIHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgaWYgKHNjaGVtZSA9PSAnYmxvYicpIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IFVSTENvbnN0cnVjdG9yKHNjaGVtZS5wYXRoWzBdKS5vcmlnaW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmIChzY2hlbWUgPT0gJ2ZpbGUnIHx8ICF0aGlzLmlzU3BlY2lhbCgpKSByZXR1cm4gJ251bGwnO1xuICAgIHJldHVybiBzY2hlbWUgKyAnOi8vJyArIHNlcmlhbGl6ZUhvc3QodGhpcy5ob3N0KSArIChwb3J0ICE9PSBudWxsID8gJzonICsgcG9ydCA6ICcnKTtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXByb3RvY29sXG4gIGdldFByb3RvY29sOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1lICsgJzonO1xuICB9LFxuICBzZXRQcm90b2NvbDogZnVuY3Rpb24gKHByb3RvY29sKSB7XG4gICAgdGhpcy5wYXJzZSgkdG9TdHJpbmcocHJvdG9jb2wpICsgJzonLCBTQ0hFTUVfU1RBUlQpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdXNlcm5hbWVcbiAgZ2V0VXNlcm5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy51c2VybmFtZTtcbiAgfSxcbiAgc2V0VXNlcm5hbWU6IGZ1bmN0aW9uICh1c2VybmFtZSkge1xuICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKCR0b1N0cmluZyh1c2VybmFtZSkpO1xuICAgIGlmICh0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpKSByZXR1cm47XG4gICAgdGhpcy51c2VybmFtZSA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51c2VybmFtZSArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaV0sIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGFzc3dvcmRcbiAgZ2V0UGFzc3dvcmQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXNzd29yZDtcbiAgfSxcbiAgc2V0UGFzc3dvcmQ6IGZ1bmN0aW9uIChwYXNzd29yZCkge1xuICAgIHZhciBjb2RlUG9pbnRzID0gYXJyYXlGcm9tKCR0b1N0cmluZyhwYXNzd29yZCkpO1xuICAgIGlmICh0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpKSByZXR1cm47XG4gICAgdGhpcy5wYXNzd29yZCA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYXNzd29yZCArPSBwZXJjZW50RW5jb2RlKGNvZGVQb2ludHNbaV0sIHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7XG4gICAgfVxuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaG9zdFxuICBnZXRIb3N0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgdmFyIHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgcmV0dXJuIGhvc3QgPT09IG51bGwgPyAnJ1xuICAgICAgOiBwb3J0ID09PSBudWxsID8gc2VyaWFsaXplSG9zdChob3N0KVxuICAgICAgOiBzZXJpYWxpemVIb3N0KGhvc3QpICsgJzonICsgcG9ydDtcbiAgfSxcbiAgc2V0SG9zdDogZnVuY3Rpb24gKGhvc3QpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgdGhpcy5wYXJzZShob3N0LCBIT1NUKTtcbiAgfSxcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RuYW1lXG4gIGdldEhvc3RuYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgcmV0dXJuIGhvc3QgPT09IG51bGwgPyAnJyA6IHNlcmlhbGl6ZUhvc3QoaG9zdCk7XG4gIH0sXG4gIHNldEhvc3RuYW1lOiBmdW5jdGlvbiAoaG9zdG5hbWUpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgdGhpcy5wYXJzZShob3N0bmFtZSwgSE9TVE5BTUUpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcG9ydFxuICBnZXRQb3J0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBvcnQgPSB0aGlzLnBvcnQ7XG4gICAgcmV0dXJuIHBvcnQgPT09IG51bGwgPyAnJyA6ICR0b1N0cmluZyhwb3J0KTtcbiAgfSxcbiAgc2V0UG9ydDogZnVuY3Rpb24gKHBvcnQpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQoKSkgcmV0dXJuO1xuICAgIHBvcnQgPSAkdG9TdHJpbmcocG9ydCk7XG4gICAgaWYgKHBvcnQgPT0gJycpIHRoaXMucG9ydCA9IG51bGw7XG4gICAgZWxzZSB0aGlzLnBhcnNlKHBvcnQsIFBPUlQpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGF0aG5hbWVcbiAgZ2V0UGF0aG5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGF0aCA9IHRoaXMucGF0aDtcbiAgICByZXR1cm4gdGhpcy5jYW5ub3RCZUFCYXNlVVJMID8gcGF0aFswXSA6IHBhdGgubGVuZ3RoID8gJy8nICsgam9pbihwYXRoLCAnLycpIDogJyc7XG4gIH0sXG4gIHNldFBhdGhuYW1lOiBmdW5jdGlvbiAocGF0aG5hbWUpIHtcbiAgICBpZiAodGhpcy5jYW5ub3RCZUFCYXNlVVJMKSByZXR1cm47XG4gICAgdGhpcy5wYXRoID0gW107XG4gICAgdGhpcy5wYXJzZShwYXRobmFtZSwgUEFUSF9TVEFSVCk7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1zZWFyY2hcbiAgZ2V0U2VhcmNoOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHF1ZXJ5ID0gdGhpcy5xdWVyeTtcbiAgICByZXR1cm4gcXVlcnkgPyAnPycgKyBxdWVyeSA6ICcnO1xuICB9LFxuICBzZXRTZWFyY2g6IGZ1bmN0aW9uIChzZWFyY2gpIHtcbiAgICBzZWFyY2ggPSAkdG9TdHJpbmcoc2VhcmNoKTtcbiAgICBpZiAoc2VhcmNoID09ICcnKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCc/JyA9PSBjaGFyQXQoc2VhcmNoLCAwKSkgc2VhcmNoID0gc3RyaW5nU2xpY2Uoc2VhcmNoLCAxKTtcbiAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgIHRoaXMucGFyc2Uoc2VhcmNoLCBRVUVSWSk7XG4gICAgfVxuICAgIHRoaXMuc2VhcmNoUGFyYW1zLnVwZGF0ZSgpO1xuICB9LFxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNocGFyYW1zXG4gIGdldFNlYXJjaFBhcmFtczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaFBhcmFtcy5mYWNhZGU7XG4gIH0sXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1oYXNoXG4gIGdldEhhc2g6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZnJhZ21lbnQgPSB0aGlzLmZyYWdtZW50O1xuICAgIHJldHVybiBmcmFnbWVudCA/ICcjJyArIGZyYWdtZW50IDogJyc7XG4gIH0sXG4gIHNldEhhc2g6IGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgaGFzaCA9ICR0b1N0cmluZyhoYXNoKTtcbiAgICBpZiAoaGFzaCA9PSAnJykge1xuICAgICAgdGhpcy5mcmFnbWVudCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgnIycgPT0gY2hhckF0KGhhc2gsIDApKSBoYXNoID0gc3RyaW5nU2xpY2UoaGFzaCwgMSk7XG4gICAgdGhpcy5mcmFnbWVudCA9ICcnO1xuICAgIHRoaXMucGFyc2UoaGFzaCwgRlJBR01FTlQpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnF1ZXJ5ID0gdGhpcy5zZWFyY2hQYXJhbXMuc2VyaWFsaXplKCkgfHwgbnVsbDtcbiAgfVxufTtcblxuLy8gYFVSTGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLWNsYXNzXG52YXIgVVJMQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBVUkwodXJsIC8qICwgYmFzZSAqLykge1xuICB2YXIgdGhhdCA9IGFuSW5zdGFuY2UodGhpcywgVVJMUHJvdG90eXBlKTtcbiAgdmFyIGJhc2UgPSB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLCAxKSA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBzdGF0ZSA9IHNldEludGVybmFsU3RhdGUodGhhdCwgbmV3IFVSTFN0YXRlKHVybCwgZmFsc2UsIGJhc2UpKTtcbiAgaWYgKCFERVNDUklQVE9SUykge1xuICAgIHRoYXQuaHJlZiA9IHN0YXRlLnNlcmlhbGl6ZSgpO1xuICAgIHRoYXQub3JpZ2luID0gc3RhdGUuZ2V0T3JpZ2luKCk7XG4gICAgdGhhdC5wcm90b2NvbCA9IHN0YXRlLmdldFByb3RvY29sKCk7XG4gICAgdGhhdC51c2VybmFtZSA9IHN0YXRlLmdldFVzZXJuYW1lKCk7XG4gICAgdGhhdC5wYXNzd29yZCA9IHN0YXRlLmdldFBhc3N3b3JkKCk7XG4gICAgdGhhdC5ob3N0ID0gc3RhdGUuZ2V0SG9zdCgpO1xuICAgIHRoYXQuaG9zdG5hbWUgPSBzdGF0ZS5nZXRIb3N0bmFtZSgpO1xuICAgIHRoYXQucG9ydCA9IHN0YXRlLmdldFBvcnQoKTtcbiAgICB0aGF0LnBhdGhuYW1lID0gc3RhdGUuZ2V0UGF0aG5hbWUoKTtcbiAgICB0aGF0LnNlYXJjaCA9IHN0YXRlLmdldFNlYXJjaCgpO1xuICAgIHRoYXQuc2VhcmNoUGFyYW1zID0gc3RhdGUuZ2V0U2VhcmNoUGFyYW1zKCk7XG4gICAgdGhhdC5oYXNoID0gc3RhdGUuZ2V0SGFzaCgpO1xuICB9XG59O1xuXG52YXIgVVJMUHJvdG90eXBlID0gVVJMQ29uc3RydWN0b3IucHJvdG90eXBlO1xuXG52YXIgYWNjZXNzb3JEZXNjcmlwdG9yID0gZnVuY3Rpb24gKGdldHRlciwgc2V0dGVyKSB7XG4gIHJldHVybiB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKVtnZXR0ZXJdKCk7XG4gICAgfSxcbiAgICBzZXQ6IHNldHRlciAmJiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpW3NldHRlcl0odmFsdWUpO1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfTtcbn07XG5cbmlmIChERVNDUklQVE9SUykge1xuICAvLyBgVVJMLnByb3RvdHlwZS5ocmVmYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaHJlZlxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAnaHJlZicsIGFjY2Vzc29yRGVzY3JpcHRvcignc2VyaWFsaXplJywgJ3NldEhyZWYnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLm9yaWdpbmAgZ2V0dGVyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1vcmlnaW5cbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ29yaWdpbicsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0T3JpZ2luJykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5wcm90b2NvbGAgYWNjZXNzb3JzIHBhaXJcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXByb3RvY29sXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdwcm90b2NvbCcsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0UHJvdG9jb2wnLCAnc2V0UHJvdG9jb2wnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnVzZXJuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtdXNlcm5hbWVcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ3VzZXJuYW1lJywgYWNjZXNzb3JEZXNjcmlwdG9yKCdnZXRVc2VybmFtZScsICdzZXRVc2VybmFtZScpKTtcbiAgLy8gYFVSTC5wcm90b3R5cGUucGFzc3dvcmRgIGFjY2Vzc29ycyBwYWlyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wYXNzd29yZFxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAncGFzc3dvcmQnLCBhY2Nlc3NvckRlc2NyaXB0b3IoJ2dldFBhc3N3b3JkJywgJ3NldFBhc3N3b3JkJykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5ob3N0YCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaG9zdFxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAnaG9zdCcsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0SG9zdCcsICdzZXRIb3N0JykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5ob3N0bmFtZWAgYWNjZXNzb3JzIHBhaXJcbiAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLWhvc3RuYW1lXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdob3N0bmFtZScsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0SG9zdG5hbWUnLCAnc2V0SG9zdG5hbWUnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnBvcnRgIGFjY2Vzc29ycyBwYWlyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1wb3J0XG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdwb3J0JywgYWNjZXNzb3JEZXNjcmlwdG9yKCdnZXRQb3J0JywgJ3NldFBvcnQnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnBhdGhuYW1lYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtcGF0aG5hbWVcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ3BhdGhuYW1lJywgYWNjZXNzb3JEZXNjcmlwdG9yKCdnZXRQYXRobmFtZScsICdzZXRQYXRobmFtZScpKTtcbiAgLy8gYFVSTC5wcm90b3R5cGUuc2VhcmNoYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtc2VhcmNoXG4gIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihVUkxQcm90b3R5cGUsICdzZWFyY2gnLCBhY2Nlc3NvckRlc2NyaXB0b3IoJ2dldFNlYXJjaCcsICdzZXRTZWFyY2gnKSk7XG4gIC8vIGBVUkwucHJvdG90eXBlLnNlYXJjaFBhcmFtc2AgZ2V0dGVyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybC1zZWFyY2hwYXJhbXNcbiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFVSTFByb3RvdHlwZSwgJ3NlYXJjaFBhcmFtcycsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0U2VhcmNoUGFyYW1zJykpO1xuICAvLyBgVVJMLnByb3RvdHlwZS5oYXNoYCBhY2Nlc3NvcnMgcGFpclxuICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmwtaGFzaFxuICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMUHJvdG90eXBlLCAnaGFzaCcsIGFjY2Vzc29yRGVzY3JpcHRvcignZ2V0SGFzaCcsICdzZXRIYXNoJykpO1xufVxuXG4vLyBgVVJMLnByb3RvdHlwZS50b0pTT05gIG1ldGhvZFxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsLXRvanNvblxuZGVmaW5lQnVpbHRJbihVUkxQcm90b3R5cGUsICd0b0pTT04nLCBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIHJldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnNlcmlhbGl6ZSgpO1xufSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vLyBgVVJMLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI1VSTC1zdHJpbmdpZmljYXRpb24tYmVoYXZpb3JcbmRlZmluZUJ1aWx0SW4oVVJMUHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIGdldEludGVybmFsVVJMU3RhdGUodGhpcykuc2VyaWFsaXplKCk7XG59LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbmlmIChOYXRpdmVVUkwpIHtcbiAgdmFyIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCA9IE5hdGl2ZVVSTC5jcmVhdGVPYmplY3RVUkw7XG4gIHZhciBuYXRpdmVSZXZva2VPYmplY3RVUkwgPSBOYXRpdmVVUkwucmV2b2tlT2JqZWN0VVJMO1xuICAvLyBgVVJMLmNyZWF0ZU9iamVjdFVSTGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvY3JlYXRlT2JqZWN0VVJMXG4gIGlmIChuYXRpdmVDcmVhdGVPYmplY3RVUkwpIGRlZmluZUJ1aWx0SW4oVVJMQ29uc3RydWN0b3IsICdjcmVhdGVPYmplY3RVUkwnLCBiaW5kKG5hdGl2ZUNyZWF0ZU9iamVjdFVSTCwgTmF0aXZlVVJMKSk7XG4gIC8vIGBVUkwucmV2b2tlT2JqZWN0VVJMYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9yZXZva2VPYmplY3RVUkxcbiAgaWYgKG5hdGl2ZVJldm9rZU9iamVjdFVSTCkgZGVmaW5lQnVpbHRJbihVUkxDb25zdHJ1Y3RvciwgJ3Jldm9rZU9iamVjdFVSTCcsIGJpbmQobmF0aXZlUmV2b2tlT2JqZWN0VVJMLCBOYXRpdmVVUkwpKTtcbn1cblxuc2V0VG9TdHJpbmdUYWcoVVJMQ29uc3RydWN0b3IsICdVUkwnKTtcblxuJCh7IGdsb2JhbDogdHJ1ZSwgY29uc3RydWN0b3I6IHRydWUsIGZvcmNlZDogIVVTRV9OQVRJVkVfVVJMLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICBVUkw6IFVSTENvbnN0cnVjdG9yXG59KTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5jb25zdHJ1Y3Rvci5qcz8iKX0pLCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcyI6KChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk9PntldmFsKCJcbi8vIFRPRE86IFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIGBjb3JlLWpzQDRgIHNpbmNlIGl0J3MgcmVwbGFjZWQgdG8gbW9kdWxlIGJlbG93XG5fX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuLi9tb2R1bGVzL3dlYi51cmwuY29uc3RydWN0b3IgKi8gXCIuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5jb25zdHJ1Y3Rvci5qc1wiKTtcblxuXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly9iYWJlbC8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC5qcz8iKX0pfSk7dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXz17fTtmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKXt2YXIgY2FjaGVkTW9kdWxlPV9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07aWYoY2FjaGVkTW9kdWxlIT09dW5kZWZpbmVkKXtyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHN9dmFyIG1vZHVsZT1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdPXtpZDptb2R1bGVJZCxsb2FkZWQ6ZmFsc2UsZXhwb3J0czp7fX07X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cyxtb2R1bGUsbW9kdWxlLmV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyk7bW9kdWxlLmxvYWRlZD10cnVlO3JldHVybiBtb2R1bGUuZXhwb3J0c30oKCk9PntfX3dlYnBhY2tfcmVxdWlyZV9fLmFtZE89e319KSgpOygoKT0+e19fd2VicGFja19yZXF1aXJlX18ubj0obW9kdWxlKT0+e3ZhciBnZXR0ZXI9bW9kdWxlJiZtb2R1bGUuX19lc01vZHVsZT8oKT0+KG1vZHVsZVsnZGVmYXVsdCddKTooKT0+KG1vZHVsZSk7X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlcix7YTpnZXR0ZXJ9KTtyZXR1cm4gZ2V0dGVyfX0pKCk7KCgpPT57X193ZWJwYWNrX3JlcXVpcmVfXy5kPShleHBvcnRzLGRlZmluaXRpb24pPT57Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbil7aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sa2V5KSYmIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLGtleSkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLGtleSx7ZW51bWVyYWJsZTp0cnVlLGdldDpkZWZpbml0aW9uW2tleV19KX19fX0pKCk7KCgpPT57X193ZWJwYWNrX3JlcXVpcmVfXy5nPShmdW5jdGlvbigpe2lmKHR5cGVvZiBnbG9iYWxUaGlzPT09J29iamVjdCcpcmV0dXJuIGdsb2JhbFRoaXM7dHJ5e3JldHVybiB0aGlzfHxuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKX1jYXRjaChlKXtpZih0eXBlb2Ygd2luZG93PT09J29iamVjdCcpcmV0dXJuIHdpbmRvd319KSgpfSkoKTsoKCk9PntfX3dlYnBhY2tfcmVxdWlyZV9fLmhtZD0obW9kdWxlKT0+e21vZHVsZT1PYmplY3QuY3JlYXRlKG1vZHVsZSk7aWYoIW1vZHVsZS5jaGlsZHJlbiltb2R1bGUuY2hpbGRyZW49W107T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwnZXhwb3J0cycse2VudW1lcmFibGU6dHJ1ZSxzZXQ6KCk9Pnt0aHJvdyBuZXcgRXJyb3IoJ0VTIE1vZHVsZXMgbWF5IG5vdCBhc3NpZ24gbW9kdWxlLmV4cG9ydHMgb3IgZXhwb3J0cy4qLCBVc2UgRVNNIGV4cG9ydCBzeW50YXgsIGluc3RlYWQ6ICcrbW9kdWxlLmlkKTt9fSk7cmV0dXJuIG1vZHVsZX19KSgpOygoKT0+e19fd2VicGFja19yZXF1aXJlX18ubz0ob2JqLHByb3ApPT4oT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixwcm9wKSl9KSgpOygoKT0+e19fd2VicGFja19yZXF1aXJlX18ucj0oZXhwb3J0cyk9PntpZih0eXBlb2YgU3ltYm9sIT09J3VuZGVmaW5lZCcmJlN5bWJvbC50b1N0cmluZ1RhZyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZTonTW9kdWxlJ30pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCdfX2VzTW9kdWxlJyx7dmFsdWU6dHJ1ZX0pfX0pKCk7dmFyIF9fd2VicGFja19leHBvcnRzX189X193ZWJwYWNrX3JlcXVpcmVfXygiLi9wZGYuanMiKX0pKCk7'; \ No newline at end of file diff --git a/core/packages/js-pdf/src/worker.js b/core/packages/js-pdf/src/worker.js index 3772332..4ab250e 100644 --- a/core/packages/js-pdf/src/worker.js +++ b/core/packages/js-pdf/src/worker.js @@ -1 +1 @@ -export const workerStr = 'IWZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciIsW10sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHNbInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciJdPXQoKTplWyJwZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIiXT1lLnBkZmpzV29ya2VyPXQoKX0oZ2xvYmFsVGhpcywoKCk9PigoKT0+e3ZhciBlPVssKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5Xb3JrZXJUYXNrPXQuV29ya2VyTWVzc2FnZUhhbmRsZXI9dm9pZCAwO2EoMik7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO2EoMTE2KTthKDEyNik7YSgxMjgpO2EoMTMxKTthKDEzMyk7YSgxMzUpO2EoMTM3KTthKDEzOSk7YSgxNDMpO3ZhciByPWEoMTQ0KSxuPWEoMTQ5KSxpPWEoMTUwKSxzPWEoMTUyKSxvPWEoMTU2KSxjPWEoMjIyKSxsPWEoMjE2KSxoPWEoMjU3KSx1PWEoMjU4KTtjbGFzcyBXb3JrZXJUYXNre2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZT1lO3RoaXMudGVybWluYXRlZD0hMTt0aGlzLl9jYXBhYmlsaXR5PW5ldyByLlByb21pc2VDYXBhYmlsaXR5fWdldCBmaW5pc2hlZCgpe3JldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2V9ZmluaXNoKCl7dGhpcy5fY2FwYWJpbGl0eS5yZXNvbHZlKCl9dGVybWluYXRlKCl7dGhpcy50ZXJtaW5hdGVkPSEwfWVuc3VyZU5vdFRlcm1pbmF0ZWQoKXtpZih0aGlzLnRlcm1pbmF0ZWQpdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgdGFzayB3YXMgdGVybWluYXRlZCIpfX10LldvcmtlclRhc2s9V29ya2VyVGFzaztjbGFzcyBXb3JrZXJNZXNzYWdlSGFuZGxlcntzdGF0aWMgc2V0dXAoZSx0KXtsZXQgYT0hMTtlLm9uKCJ0ZXN0IiwoZnVuY3Rpb24odCl7aWYoIWEpe2E9ITA7ZS5zZW5kKCJ0ZXN0Iix0IGluc3RhbmNlb2YgVWludDhBcnJheSl9fSkpO2Uub24oImNvbmZpZ3VyZSIsKGZ1bmN0aW9uKGUpeygwLHIuc2V0VmVyYm9zaXR5TGV2ZWwpKGUudmVyYm9zaXR5KX0pKTtlLm9uKCJHZXREb2NSZXF1ZXN0IiwoZnVuY3Rpb24oZSl7cmV0dXJuIFdvcmtlck1lc3NhZ2VIYW5kbGVyLmNyZWF0ZURvY3VtZW50SGFuZGxlcihlLHQpfSkpfXN0YXRpYyBjcmVhdGVEb2N1bWVudEhhbmRsZXIoZSx0KXtsZXQgYSxkPSExLGY9bnVsbDtjb25zdCBnPW5ldyBTZXQscD0oMCxyLmdldFZlcmJvc2l0eUxldmVsKSgpLHtkb2NJZDptLGFwaVZlcnNpb246Yn09ZSx5PSIzLjkuMTc5IjtpZihiIT09eSl0aHJvdyBuZXcgRXJyb3IoYFRoZSBBUEkgdmVyc2lvbiAiJHtifSIgZG9lcyBub3QgbWF0Y2ggdGhlIFdvcmtlciB2ZXJzaW9uICIke3l9Ii5gKTtjb25zdCB3PVtdO2Zvcihjb25zdCBlIGluW10pdy5wdXNoKGUpO2lmKHcubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVGhlIGBBcnJheS5wcm90b3R5cGVgIGNvbnRhaW5zIHVuZXhwZWN0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzOiAiK3cuam9pbigiLCAiKSsiOyB0aHVzIGJyZWFraW5nIGUuZy4gYGZvci4uLmluYCBpdGVyYXRpb24gb2YgYEFycmF5YHMuIik7Y29uc3QgUz1tKyJfd29ya2VyIjtsZXQgeD1uZXcgaC5NZXNzYWdlSGFuZGxlcihTLG0sdCk7ZnVuY3Rpb24gZW5zdXJlTm90VGVybWluYXRlZCgpe2lmKGQpdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQiKX1mdW5jdGlvbiBzdGFydFdvcmtlclRhc2soZSl7Zy5hZGQoZSl9ZnVuY3Rpb24gZmluaXNoV29ya2VyVGFzayhlKXtlLmZpbmlzaCgpO2cuZGVsZXRlKGUpfWFzeW5jIGZ1bmN0aW9uIGxvYWREb2N1bWVudChlKXthd2FpdCBhLmVuc3VyZURvYygiY2hlY2tIZWFkZXIiKTthd2FpdCBhLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKTthd2FpdCBhLmVuc3VyZURvYygicGFyc2UiLFtlXSk7YXdhaXQgYS5lbnN1cmVEb2MoImNoZWNrRmlyc3RQYWdlIixbZV0pO2F3YWl0IGEuZW5zdXJlRG9jKCJjaGVja0xhc3RQYWdlIixbZV0pO2NvbnN0IHQ9YXdhaXQgYS5lbnN1cmVEb2MoImlzUHVyZVhmYSIpO2lmKHQpe2NvbnN0IGU9bmV3IFdvcmtlclRhc2soImxvYWRYZmFGb250cyIpO3N0YXJ0V29ya2VyVGFzayhlKTthd2FpdCBQcm9taXNlLmFsbChbYS5sb2FkWGZhRm9udHMoeCxlKS5jYXRjaCgoZT0+e30pKS50aGVuKCgoKT0+ZmluaXNoV29ya2VyVGFzayhlKSkpLGEubG9hZFhmYUltYWdlcygpXSl9Y29uc3RbcixuXT1hd2FpdCBQcm9taXNlLmFsbChbYS5lbnN1cmVEb2MoIm51bVBhZ2VzIiksYS5lbnN1cmVEb2MoImZpbmdlcnByaW50cyIpXSk7cmV0dXJue251bVBhZ2VzOnIsZmluZ2VycHJpbnRzOm4saHRtbEZvclhmYTp0P2F3YWl0IGEuZW5zdXJlRG9jKCJodG1sRm9yWGZhIik6bnVsbH19ZnVuY3Rpb24gZ2V0UGRmTWFuYWdlcihlKXtsZXR7ZGF0YTp0LHBhc3N3b3JkOmEsZGlzYWJsZUF1dG9GZXRjaDppLHJhbmdlQ2h1bmtTaXplOm8sbGVuZ3RoOmMsZG9jQmFzZVVybDpsLGVuYWJsZVhmYTpoLGV2YWx1YXRvck9wdGlvbnM6ZH09ZTtjb25zdCBnPXtzb3VyY2U6bnVsbCxkaXNhYmxlQXV0b0ZldGNoOmksZG9jQmFzZVVybDpsLGRvY0lkOm0sZW5hYmxlWGZhOmgsZXZhbHVhdG9yT3B0aW9uczpkLGhhbmRsZXI6eCxsZW5ndGg6YyxwYXNzd29yZDphLHJhbmdlQ2h1bmtTaXplOm99LHA9bmV3IHIuUHJvbWlzZUNhcGFiaWxpdHk7bGV0IGI7aWYodCl7dHJ5e2cuc291cmNlPXQ7Yj1uZXcgcy5Mb2NhbFBkZk1hbmFnZXIoZyk7cC5yZXNvbHZlKGIpfWNhdGNoKGUpe3AucmVqZWN0KGUpfXJldHVybiBwLnByb21pc2V9bGV0IHksdz1bXTt0cnl7eT1uZXcgdS5QREZXb3JrZXJTdHJlYW0oeCl9Y2F0Y2goZSl7cC5yZWplY3QoZSk7cmV0dXJuIHAucHJvbWlzZX1jb25zdCBTPXkuZ2V0RnVsbFJlYWRlcigpO1MuaGVhZGVyc1JlYWR5LnRoZW4oKGZ1bmN0aW9uKCl7aWYoUy5pc1JhbmdlU3VwcG9ydGVkKXtnLnNvdXJjZT15O2cubGVuZ3RoPVMuY29udGVudExlbmd0aDtnLmRpc2FibGVBdXRvRmV0Y2h8fD1TLmlzU3RyZWFtaW5nU3VwcG9ydGVkO2I9bmV3IHMuTmV0d29ya1BkZk1hbmFnZXIoZyk7Zm9yKGNvbnN0IGUgb2YgdyliLnNlbmRQcm9ncmVzc2l2ZURhdGEoZSk7dz1bXTtwLnJlc29sdmUoYik7Zj1udWxsfX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cC5yZWplY3QoZSk7Zj1udWxsfSkpO2xldCBDPTA7bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7Y29uc3QgcmVhZENodW5rPWZ1bmN0aW9uKGUpe2xldHt2YWx1ZTphLGRvbmU6aX09ZTt0cnl7ZW5zdXJlTm90VGVybWluYXRlZCgpO2lmKGkpe2J8fGZ1bmN0aW9uKCl7Y29uc3QgZT0oMCxuLmFycmF5QnVmZmVyc1RvQnl0ZXMpKHcpO2MmJmUubGVuZ3RoIT09YyYmKDAsci53YXJuKSgicmVwb3J0ZWQgSFRUUCBsZW5ndGggaXMgZGlmZmVyZW50IGZyb20gYWN0dWFsIik7dHJ5e2cuc291cmNlPWU7Yj1uZXcgcy5Mb2NhbFBkZk1hbmFnZXIoZyk7cC5yZXNvbHZlKGIpfWNhdGNoKGUpe3AucmVqZWN0KGUpfXc9W119KCk7Zj1udWxsO3JldHVybn1DKz1hLmJ5dGVMZW5ndGg7Uy5pc1N0cmVhbWluZ1N1cHBvcnRlZHx8eC5zZW5kKCJEb2NQcm9ncmVzcyIse2xvYWRlZDpDLHRvdGFsOk1hdGgubWF4KEMsUy5jb250ZW50TGVuZ3RofHwwKX0pO2I/Yi5zZW5kUHJvZ3Jlc3NpdmVEYXRhKGEpOncucHVzaChhKTtTLnJlYWQoKS50aGVuKHJlYWRDaHVuayx0KX1jYXRjaChlKXt0KGUpfX07Uy5yZWFkKCkudGhlbihyZWFkQ2h1bmssdCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3AucmVqZWN0KGUpO2Y9bnVsbH0pKTtmPWZ1bmN0aW9uKGUpe3kuY2FuY2VsQWxsUmVxdWVzdHMoZSl9O3JldHVybiBwLnByb21pc2V9eC5vbigiR2V0UGFnZSIsKGZ1bmN0aW9uKGUpe3JldHVybiBhLmdldFBhZ2UoZS5wYWdlSW5kZXgpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChbYS5lbnN1cmUoZSwicm90YXRlIiksYS5lbnN1cmUoZSwicmVmIiksYS5lbnN1cmUoZSwidXNlclVuaXQiKSxhLmVuc3VyZShlLCJ2aWV3IildKS50aGVuKChmdW5jdGlvbihlKXtsZXRbdCxhLHIsbl09ZTtyZXR1cm57cm90YXRlOnQscmVmOmEsdXNlclVuaXQ6cix2aWV3Om59fSkpfSkpfSkpO3gub24oIkdldFBhZ2VJbmRleCIsKGZ1bmN0aW9uKGUpe2NvbnN0IHQ9aS5SZWYuZ2V0KGUubnVtLGUuZ2VuKTtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJnZXRQYWdlSW5kZXgiLFt0XSl9KSk7eC5vbigiR2V0RGVzdGluYXRpb25zIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEuZW5zdXJlQ2F0YWxvZygiZGVzdGluYXRpb25zIil9KSk7eC5vbigiR2V0RGVzdGluYXRpb24iLChmdW5jdGlvbihlKXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJnZXREZXN0aW5hdGlvbiIsW2UuaWRdKX0pKTt4Lm9uKCJHZXRQYWdlTGFiZWxzIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEuZW5zdXJlQ2F0YWxvZygicGFnZUxhYmVscyIpfSkpO3gub24oIkdldFBhZ2VMYXlvdXQiLChmdW5jdGlvbihlKXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJwYWdlTGF5b3V0Iil9KSk7eC5vbigiR2V0UGFnZU1vZGUiLChmdW5jdGlvbihlKXtyZXR1cm4gYS5lbnN1cmVDYXRhbG9nKCJwYWdlTW9kZSIpfSkpO3gub24oIkdldFZpZXdlclByZWZlcmVuY2VzIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEuZW5zdXJlQ2F0YWxvZygidmlld2VyUHJlZmVyZW5jZXMiKX0pKTt4Lm9uKCJHZXRPcGVuQWN0aW9uIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEuZW5zdXJlQ2F0YWxvZygib3BlbkFjdGlvbiIpfSkpO3gub24oIkdldEF0dGFjaG1lbnRzIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEuZW5zdXJlQ2F0YWxvZygiYXR0YWNobWVudHMiKX0pKTt4Lm9uKCJHZXRKYXZhU2NyaXB0IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEuZW5zdXJlQ2F0YWxvZygiamF2YVNjcmlwdCIpfSkpO3gub24oIkdldERvY0pTQWN0aW9ucyIsKGZ1bmN0aW9uKGUpe3JldHVybiBhLmVuc3VyZUNhdGFsb2coImpzQWN0aW9ucyIpfSkpO3gub24oIkdldFBhZ2VKU0FjdGlvbnMiLChmdW5jdGlvbihlKXtsZXR7cGFnZUluZGV4OnR9PWU7cmV0dXJuIGEuZ2V0UGFnZSh0KS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gYS5lbnN1cmUoZSwianNBY3Rpb25zIil9KSl9KSk7eC5vbigiR2V0T3V0bGluZSIsKGZ1bmN0aW9uKGUpe3JldHVybiBhLmVuc3VyZUNhdGFsb2coImRvY3VtZW50T3V0bGluZSIpfSkpO3gub24oIkdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsKGZ1bmN0aW9uKGUpe3JldHVybiBhLmVuc3VyZUNhdGFsb2coIm9wdGlvbmFsQ29udGVudENvbmZpZyIpfSkpO3gub24oIkdldFBlcm1pc3Npb25zIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEuZW5zdXJlQ2F0YWxvZygicGVybWlzc2lvbnMiKX0pKTt4Lm9uKCJHZXRNZXRhZGF0YSIsKGZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChbYS5lbnN1cmVEb2MoImRvY3VtZW50SW5mbyIpLGEuZW5zdXJlQ2F0YWxvZygibWV0YWRhdGEiKV0pfSkpO3gub24oIkdldE1hcmtJbmZvIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEuZW5zdXJlQ2F0YWxvZygibWFya0luZm8iKX0pKTt4Lm9uKCJHZXREYXRhIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEucmVxdWVzdExvYWRlZFN0cmVhbSgpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLmJ5dGVzfSkpfSkpO3gub24oIkdldEFubm90YXRpb25zIiwoZnVuY3Rpb24oZSl7bGV0e3BhZ2VJbmRleDp0LGludGVudDpyfT1lO3JldHVybiBhLmdldFBhZ2UodCkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3QgYT1uZXcgV29ya2VyVGFzayhgR2V0QW5ub3RhdGlvbnM6IHBhZ2UgJHt0fWApO3N0YXJ0V29ya2VyVGFzayhhKTtyZXR1cm4gZS5nZXRBbm5vdGF0aW9uc0RhdGEoeCxhLHIpLnRoZW4oKGU9PntmaW5pc2hXb3JrZXJUYXNrKGEpO3JldHVybiBlfSksKGU9PntmaW5pc2hXb3JrZXJUYXNrKGEpO3Rocm93IGV9KSl9KSl9KSk7eC5vbigiR2V0RmllbGRPYmplY3RzIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEuZW5zdXJlRG9jKCJmaWVsZE9iamVjdHMiKX0pKTt4Lm9uKCJIYXNKU0FjdGlvbnMiLChmdW5jdGlvbihlKXtyZXR1cm4gYS5lbnN1cmVEb2MoImhhc0pTQWN0aW9ucyIpfSkpO3gub24oIkdldENhbGN1bGF0aW9uT3JkZXJJZHMiLChmdW5jdGlvbihlKXtyZXR1cm4gYS5lbnN1cmVEb2MoImNhbGN1bGF0aW9uT3JkZXJJZHMiKX0pKTt4Lm9uKCJTYXZlRG9jdW1lbnQiLChhc3luYyBmdW5jdGlvbihlKXtsZXR7aXNQdXJlWGZhOnQsbnVtUGFnZXM6cyxhbm5vdGF0aW9uU3RvcmFnZTpjLGZpbGVuYW1lOmh9PWU7Y29uc3QgdT1bYS5yZXF1ZXN0TG9hZGVkU3RyZWFtKCksYS5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybSIpLGEuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm1SZWYiKSxhLmVuc3VyZURvYygic3RhcnRYUmVmIiksYS5lbnN1cmVEb2MoImxpbmVhcml6YXRpb24iKV0sZD10P251bGw6KDAsbi5nZXROZXdBbm5vdGF0aW9uc01hcCkoYyksZj1hd2FpdCBhLmVuc3VyZURvYygieHJlZiIpO2lmKGQpe2NvbnN0IGU9by5Bbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhjLnZhbHVlcygpLGYsYS5ldmFsdWF0b3JPcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTtmb3IoY29uc3RbdCxyXW9mIGQpdS5wdXNoKGEuZ2V0UGFnZSh0KS50aGVuKChhPT57Y29uc3Qgbj1uZXcgV29ya2VyVGFzayhgU2F2ZSAoZWRpdG9yKTogcGFnZSAke3R9YCk7cmV0dXJuIGEuc2F2ZU5ld0Fubm90YXRpb25zKHgsbixyLGUpLmZpbmFsbHkoKGZ1bmN0aW9uKCl7ZmluaXNoV29ya2VyVGFzayhuKX0pKX0pKSl9aWYodCl1LnB1c2goYS5zZXJpYWxpemVYZmFEYXRhKGMpKTtlbHNlIGZvcihsZXQgZT0wO2U8cztlKyspdS5wdXNoKGEuZ2V0UGFnZShlKS50aGVuKChmdW5jdGlvbih0KXtjb25zdCBhPW5ldyBXb3JrZXJUYXNrKGBTYXZlOiBwYWdlICR7ZX1gKTtyZXR1cm4gdC5zYXZlKHgsYSxjKS5maW5hbGx5KChmdW5jdGlvbigpe2ZpbmlzaFdvcmtlclRhc2soYSl9KSl9KSkpO3JldHVybiBQcm9taXNlLmFsbCh1KS50aGVuKChmdW5jdGlvbihlKXtsZXRbYSxuLHMsbyxjLC4uLnVdPWUsZD1bXSxnPW51bGw7aWYodCl7Zz11WzBdO2lmKCFnKXJldHVybiBhLmJ5dGVzfWVsc2V7ZD11LmZsYXQoMik7aWYoMD09PWQubGVuZ3RoKXJldHVybiBhLmJ5dGVzfWNvbnN0IHA9cyYmbiBpbnN0YW5jZW9mIGkuRGljdCYmZC5zb21lKChlPT5lLm5lZWRBcHBlYXJhbmNlcykpLG09biBpbnN0YW5jZW9mIGkuRGljdCYmbi5nZXQoIlhGQSIpfHxudWxsO2xldCBiPW51bGwseT0hMTtpZihBcnJheS5pc0FycmF5KG0pKXtmb3IobGV0IGU9MCx0PW0ubGVuZ3RoO2U8dDtlKz0yKWlmKCJkYXRhc2V0cyI9PT1tW2VdKXtiPW1bZSsxXTt5PSEwfW51bGw9PT1iJiYoYj1mLmdldE5ld1RlbXBvcmFyeVJlZigpKX1lbHNlIG0mJigwLHIud2FybikoIlVuc3VwcG9ydGVkIFhGQSB0eXBlLiIpO2xldCB3PU9iamVjdC5jcmVhdGUobnVsbCk7aWYoZi50cmFpbGVyKXtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCksdD1mLnRyYWlsZXIuZ2V0KCJJbmZvIil8fG51bGw7dCBpbnN0YW5jZW9mIGkuRGljdCYmdC5mb3JFYWNoKCgodCxhKT0+eyJzdHJpbmciPT10eXBlb2YgYSYmKGVbdF09KDAsci5zdHJpbmdUb1BERlN0cmluZykoYSkpfSkpO3c9e3Jvb3RSZWY6Zi50cmFpbGVyLmdldFJhdygiUm9vdCIpfHxudWxsLGVuY3J5cHRSZWY6Zi50cmFpbGVyLmdldFJhdygiRW5jcnlwdCIpfHxudWxsLG5ld1JlZjpmLmdldE5ld1RlbXBvcmFyeVJlZigpLGluZm9SZWY6Zi50cmFpbGVyLmdldFJhdygiSW5mbyIpfHxudWxsLGluZm86ZSxmaWxlSWRzOmYudHJhaWxlci5nZXQoIklEIil8fG51bGwsc3RhcnRYUmVmOmM/bzpmLmxhc3RYUmVmU3RyZWFtUG9zPz9vLGZpbGVuYW1lOmh9fXJldHVybigwLGwuaW5jcmVtZW50YWxVcGRhdGUpKHtvcmlnaW5hbERhdGE6YS5ieXRlcyx4cmVmSW5mbzp3LG5ld1JlZnM6ZCx4cmVmOmYsaGFzWGZhOiEhbSx4ZmFEYXRhc2V0c1JlZjpiLGhhc1hmYURhdGFzZXRzRW50cnk6eSxuZWVkQXBwZWFyYW5jZXM6cCxhY3JvRm9ybVJlZjpzLGFjcm9Gb3JtOm4seGZhRGF0YTpnfSkuZmluYWxseSgoKCk9PntmLnJlc2V0TmV3VGVtcG9yYXJ5UmVmKCl9KSl9KSl9KSk7eC5vbigiR2V0T3BlcmF0b3JMaXN0IiwoZnVuY3Rpb24oZSx0KXtjb25zdCBuPWUucGFnZUluZGV4O2EuZ2V0UGFnZShuKS50aGVuKChmdW5jdGlvbihhKXtjb25zdCBpPW5ldyBXb3JrZXJUYXNrKGBHZXRPcGVyYXRvckxpc3Q6IHBhZ2UgJHtufWApO3N0YXJ0V29ya2VyVGFzayhpKTtjb25zdCBzPXA+PXIuVmVyYm9zaXR5TGV2ZWwuSU5GT1M/RGF0ZS5ub3coKTowO2EuZ2V0T3BlcmF0b3JMaXN0KHtoYW5kbGVyOngsc2luazp0LHRhc2s6aSxpbnRlbnQ6ZS5pbnRlbnQsY2FjaGVLZXk6ZS5jYWNoZUtleSxhbm5vdGF0aW9uU3RvcmFnZTplLmFubm90YXRpb25TdG9yYWdlfSkudGhlbigoZnVuY3Rpb24oZSl7ZmluaXNoV29ya2VyVGFzayhpKTtzJiYoMCxyLmluZm8pKGBwYWdlPSR7bisxfSAtIGdldE9wZXJhdG9yTGlzdDogdGltZT0ke0RhdGUubm93KCktc31tcywgbGVuPSR7ZS5sZW5ndGh9YCk7dC5jbG9zZSgpfSksKGZ1bmN0aW9uKGUpe2ZpbmlzaFdvcmtlclRhc2soaSk7aS50ZXJtaW5hdGVkfHx0LmVycm9yKGUpfSkpfSkpfSkpO3gub24oIkdldFRleHRDb250ZW50IiwoZnVuY3Rpb24oZSx0KXtjb25zdHtwYWdlSW5kZXg6bixpbmNsdWRlTWFya2VkQ29udGVudDppLGRpc2FibGVOb3JtYWxpemF0aW9uOnN9PWU7YS5nZXRQYWdlKG4pLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IGE9bmV3IFdvcmtlclRhc2soIkdldFRleHRDb250ZW50OiBwYWdlICIrbik7c3RhcnRXb3JrZXJUYXNrKGEpO2NvbnN0IG89cD49ci5WZXJib3NpdHlMZXZlbC5JTkZPUz9EYXRlLm5vdygpOjA7ZS5leHRyYWN0VGV4dENvbnRlbnQoe2hhbmRsZXI6eCx0YXNrOmEsc2luazp0LGluY2x1ZGVNYXJrZWRDb250ZW50OmksZGlzYWJsZU5vcm1hbGl6YXRpb246c30pLnRoZW4oKGZ1bmN0aW9uKCl7ZmluaXNoV29ya2VyVGFzayhhKTtvJiYoMCxyLmluZm8pKGBwYWdlPSR7bisxfSAtIGdldFRleHRDb250ZW50OiB0aW1lPWArKERhdGUubm93KCktbykrIm1zIik7dC5jbG9zZSgpfSksKGZ1bmN0aW9uKGUpe2ZpbmlzaFdvcmtlclRhc2soYSk7YS50ZXJtaW5hdGVkfHx0LmVycm9yKGUpfSkpfSkpfSkpO3gub24oIkdldFN0cnVjdFRyZWUiLChmdW5jdGlvbihlKXtyZXR1cm4gYS5nZXRQYWdlKGUucGFnZUluZGV4KS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gYS5lbnN1cmUoZSwiZ2V0U3RydWN0VHJlZSIpfSkpfSkpO3gub24oIkZvbnRGYWxsYmFjayIsKGZ1bmN0aW9uKGUpe3JldHVybiBhLmZvbnRGYWxsYmFjayhlLmlkLHgpfSkpO3gub24oIkNsZWFudXAiLChmdW5jdGlvbihlKXtyZXR1cm4gYS5jbGVhbnVwKCEwKX0pKTt4Lm9uKCJUZXJtaW5hdGUiLChmdW5jdGlvbihlKXtkPSEwO2NvbnN0IHQ9W107aWYoYSl7YS50ZXJtaW5hdGUobmV3IHIuQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7Y29uc3QgZT1hLmNsZWFudXAoKTt0LnB1c2goZSk7YT1udWxsfWVsc2UoMCxjLmNsZWFyR2xvYmFsQ2FjaGVzKSgpO2YmJmYobmV3IHIuQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7Zm9yKGNvbnN0IGUgb2YgZyl7dC5wdXNoKGUuZmluaXNoZWQpO2UudGVybWluYXRlKCl9cmV0dXJuIFByb21pc2UuYWxsKHQpLnRoZW4oKGZ1bmN0aW9uKCl7eC5kZXN0cm95KCk7eD1udWxsfSkpfSkpO3gub24oIlJlYWR5IiwoZnVuY3Rpb24odCl7IWZ1bmN0aW9uIHNldHVwRG9jKGUpe2Z1bmN0aW9uIG9uU3VjY2VzcyhlKXtlbnN1cmVOb3RUZXJtaW5hdGVkKCk7eC5zZW5kKCJHZXREb2MiLHtwZGZJbmZvOmV9KX1mdW5jdGlvbiBvbkZhaWx1cmUoZSl7ZW5zdXJlTm90VGVybWluYXRlZCgpO2lmKGUgaW5zdGFuY2VvZiByLlBhc3N3b3JkRXhjZXB0aW9uKXtjb25zdCB0PW5ldyBXb3JrZXJUYXNrKGBQYXNzd29yZEV4Y2VwdGlvbjogcmVzcG9uc2UgJHtlLmNvZGV9YCk7c3RhcnRXb3JrZXJUYXNrKHQpO3guc2VuZFdpdGhQcm9taXNlKCJQYXNzd29yZFJlcXVlc3QiLGUpLnRoZW4oKGZ1bmN0aW9uKGUpe2xldHtwYXNzd29yZDpyfT1lO2ZpbmlzaFdvcmtlclRhc2sodCk7YS51cGRhdGVQYXNzd29yZChyKTtwZGZNYW5hZ2VyUmVhZHkoKX0pKS5jYXRjaCgoZnVuY3Rpb24oKXtmaW5pc2hXb3JrZXJUYXNrKHQpO3guc2VuZCgiRG9jRXhjZXB0aW9uIixlKX0pKX1lbHNlIGUgaW5zdGFuY2VvZiByLkludmFsaWRQREZFeGNlcHRpb258fGUgaW5zdGFuY2VvZiByLk1pc3NpbmdQREZFeGNlcHRpb258fGUgaW5zdGFuY2VvZiByLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbnx8ZSBpbnN0YW5jZW9mIHIuVW5rbm93bkVycm9yRXhjZXB0aW9uP3guc2VuZCgiRG9jRXhjZXB0aW9uIixlKTp4LnNlbmQoIkRvY0V4Y2VwdGlvbiIsbmV3IHIuVW5rbm93bkVycm9yRXhjZXB0aW9uKGUubWVzc2FnZSxlLnRvU3RyaW5nKCkpKX1mdW5jdGlvbiBwZGZNYW5hZ2VyUmVhZHkoKXtlbnN1cmVOb3RUZXJtaW5hdGVkKCk7bG9hZERvY3VtZW50KCExKS50aGVuKG9uU3VjY2VzcywoZnVuY3Rpb24oZSl7ZW5zdXJlTm90VGVybWluYXRlZCgpO2UgaW5zdGFuY2VvZiBuLlhSZWZQYXJzZUV4Y2VwdGlvbj9hLnJlcXVlc3RMb2FkZWRTdHJlYW0oKS50aGVuKChmdW5jdGlvbigpe2Vuc3VyZU5vdFRlcm1pbmF0ZWQoKTtsb2FkRG9jdW1lbnQoITApLnRoZW4ob25TdWNjZXNzLG9uRmFpbHVyZSl9KSk6b25GYWlsdXJlKGUpfSkpfWVuc3VyZU5vdFRlcm1pbmF0ZWQoKTtnZXRQZGZNYW5hZ2VyKGUpLnRoZW4oKGZ1bmN0aW9uKGUpe2lmKGQpe2UudGVybWluYXRlKG5ldyByLkFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpO3Rocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIil9YT1lO2EucmVxdWVzdExvYWRlZFN0cmVhbSghMCkudGhlbigoZT0+e3guc2VuZCgiRGF0YUxvYWRlZCIse2xlbmd0aDplLmJ5dGVzLmJ5dGVMZW5ndGh9KX0pKX0pKS50aGVuKHBkZk1hbmFnZXJSZWFkeSxvbkZhaWx1cmUpfShlKTtlPW51bGx9KSk7cmV0dXJuIFN9c3RhdGljIGluaXRpYWxpemVGcm9tUG9ydChlKXtjb25zdCB0PW5ldyBoLk1lc3NhZ2VIYW5kbGVyKCJ3b3JrZXIiLCJtYWluIixlKTtXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cCh0LGUpO3Quc2VuZCgicmVhZHkiLG51bGwpfX10Lldvcmtlck1lc3NhZ2VIYW5kbGVyPVdvcmtlck1lc3NhZ2VIYW5kbGVyOyJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93JiYhci5pc05vZGVKUyYmInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZmdW5jdGlvbiBpc01lc3NhZ2VQb3J0KGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnBvc3RNZXNzYWdlJiYib25tZXNzYWdlImluIGV9KHNlbGYpJiZXb3JrZXJNZXNzYWdlSGFuZGxlci5pbml0aWFsaXplRnJvbVBvcnQoc2VsZil9LChlLHQsYSk9Pnt2YXIgcj1hKDMpLG49YSg0KSxpPWEoNjkpLHM9YSg3MCksbz0iV2ViQXNzZW1ibHkiLGM9bltvXSxsPTchPT1FcnJvcigiZSIse2NhdXNlOjd9KS5jYXVzZSxleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcj1mdW5jdGlvbihlLHQpe3ZhciBhPXt9O2FbZV09cyhlLHQsbCk7cih7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGFyaXR5OjEsZm9yY2VkOmx9LGEpfSxleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyPWZ1bmN0aW9uKGUsdCl7aWYoYyYmY1tlXSl7dmFyIGE9e307YVtlXT1zKG8rIi4iK2UsdCxsKTtyKHt0YXJnZXQ6byxzdGF0OiEwLGNvbnN0cnVjdG9yOiEwLGFyaXR5OjEsZm9yY2VkOmx9LGEpfX07ZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoIkVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIEVycm9yKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKTtleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcigiRXZhbEVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIEV2YWxFcnJvcih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSk7ZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoIlJhbmdlRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gUmFuZ2VFcnJvcih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSk7ZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoIlJlZmVyZW5jZUVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIFJlZmVyZW5jZUVycm9yKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKTtleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcigiU3ludGF4RXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gU3ludGF4RXJyb3IodCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpO2V4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCJUeXBlRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gVHlwZUVycm9yKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKTtleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcigiVVJJRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gVVJJRXJyb3IodCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpO2V4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIoIkNvbXBpbGVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBDb21waWxlRXJyb3IodCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpO2V4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIoIkxpbmtFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBMaW5rRXJyb3IodCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpO2V4cG9ydFdlYkFzc2VtYmx5RXJyb3JDYXVzZVdyYXBwZXIoIlJ1bnRpbWVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBSdW50aW1lRXJyb3IodCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpfSwoZSx0LGEpPT57dmFyIHI9YSg0KSxuPWEoNSkuZixpPWEoNDQpLHM9YSg0OCksbz1hKDM4KSxjPWEoNTYpLGw9YSg2OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIGEsaCx1LGQsZixnPWUudGFyZ2V0LHA9ZS5nbG9iYWwsbT1lLnN0YXQ7aWYoYT1wP3I6bT9yW2ddfHxvKGcse30pOihyW2ddfHx7fSkucHJvdG90eXBlKWZvcihoIGluIHQpe2Q9dFtoXTt1PWUuZG9udENhbGxHZXRTZXQ/KGY9bihhLGgpKSYmZi52YWx1ZTphW2hdO2lmKCFsKHA/aDpnKyhtPyIuIjoiIyIpK2gsZS5mb3JjZWQpJiZ2b2lkIDAhPT11KXtpZih0eXBlb2YgZD09dHlwZW9mIHUpY29udGludWU7YyhkLHUpfShlLnNoYW18fHUmJnUuc2hhbSkmJmkoZCwic2hhbSIsITApO3MoYSxoLGQsZSl9fX0sZnVuY3Rpb24oZSl7dmFyIGNoZWNrPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLk1hdGg9PU1hdGgmJmV9O2UuZXhwb3J0cz1jaGVjaygib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMpfHxjaGVjaygib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93KXx8Y2hlY2soIm9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmKXx8Y2hlY2soIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbCl8fGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCl8fHRoaXN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9LChlLHQsYSk9Pnt2YXIgcj1hKDYpLG49YSg4KSxpPWEoMTApLHM9YSgxMSksbz1hKDEyKSxjPWEoMTgpLGw9YSgzOSksaD1hKDQyKSx1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7dC5mPXI/dTpmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KXtlPW8oZSk7dD1jKHQpO2lmKGgpdHJ5e3JldHVybiB1KGUsdCl9Y2F0Y2goZSl7fWlmKGwoZSx0KSlyZXR1cm4gcyghbihpLmYsZSx0KSxlW3RdKX19LChlLHQsYSk9Pnt2YXIgcj1hKDcpO2UuZXhwb3J0cz0hcigoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LDEse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pWzFdfSkpfSxlPT57ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4hIWUoKX1jYXRjaChlKXtyZXR1cm4hMH19fSwoZSx0LGEpPT57dmFyIHI9YSg5KSxuPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO2UuZXhwb3J0cz1yP24uYmluZChuKTpmdW5jdGlvbigpe3JldHVybiBuLmFwcGx5KG4sYXJndW1lbnRzKX19LChlLHQsYSk9Pnt2YXIgcj1hKDcpO2UuZXhwb3J0cz0hcigoZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe30uYmluZCgpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBlfHxlLmhhc093blByb3BlcnR5KCJwcm90b3R5cGUiKX0pKX0sKGUsdCk9PnsidXNlIHN0cmljdCI7dmFyIGE9e30ucHJvcGVydHlJc0VudW1lcmFibGUscj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLG49ciYmIWEuY2FsbCh7MToyfSwxKTt0LmY9bj9mdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShlKXt2YXIgdD1yKHRoaXMsZSk7cmV0dXJuISF0JiZ0LmVudW1lcmFibGV9OmF9LGU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZW51bWVyYWJsZTohKDEmZSksY29uZmlndXJhYmxlOiEoMiZlKSx3cml0YWJsZTohKDQmZSksdmFsdWU6dH19fSwoZSx0LGEpPT57dmFyIHI9YSgxMyksbj1hKDE2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHIobihlKSl9fSwoZSx0LGEpPT57dmFyIHI9YSgxNCksbj1hKDcpLGk9YSgxNSkscz1PYmplY3Qsbz1yKCIiLnNwbGl0KTtlLmV4cG9ydHM9bigoZnVuY3Rpb24oKXtyZXR1cm4hcygieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSkpP2Z1bmN0aW9uKGUpe3JldHVybiJTdHJpbmciPT1pKGUpP28oZSwiIik6cyhlKX06c30sKGUsdCxhKT0+e3ZhciByPWEoOSksbj1GdW5jdGlvbi5wcm90b3R5cGUsaT1uLmNhbGwscz1yJiZuLmJpbmQuYmluZChpLGkpO2UuZXhwb3J0cz1yP3M6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkoZSxhcmd1bWVudHMpfX19LChlLHQsYSk9Pnt2YXIgcj1hKDE0KSxuPXIoe30udG9TdHJpbmcpLGk9cigiIi5zbGljZSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBpKG4oZSksOCwtMSl9fSwoZSx0LGEpPT57dmFyIHI9YSgxNyksbj1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKHIoZSkpdGhyb3cgbigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIitlKTtyZXR1cm4gZX19LGU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9fSwoZSx0LGEpPT57dmFyIHI9YSgxOSksbj1hKDIzKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9cihlLCJzdHJpbmciKTtyZXR1cm4gbih0KT90OnQrIiJ9fSwoZSx0LGEpPT57dmFyIHI9YSg4KSxuPWEoMjApLGk9YSgyMykscz1hKDMwKSxvPWEoMzMpLGM9YSgzNCksbD1UeXBlRXJyb3IsaD1jKCJ0b1ByaW1pdGl2ZSIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCFuKGUpfHxpKGUpKXJldHVybiBlO3ZhciBhLGM9cyhlLGgpO2lmKGMpe3ZvaWQgMD09PXQmJih0PSJkZWZhdWx0Iik7YT1yKGMsZSx0KTtpZighbihhKXx8aShhKSlyZXR1cm4gYTt0aHJvdyBsKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX12b2lkIDA9PT10JiYodD0ibnVtYmVyIik7cmV0dXJuIG8oZSx0KX19LChlLHQsYSk9Pnt2YXIgcj1hKDIxKSxuPWEoMjIpLGk9bi5hbGw7ZS5leHBvcnRzPW4uSVNfSFRNTEREQT9mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/bnVsbCE9PWU6cihlKXx8ZT09PWl9OmZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZT9udWxsIT09ZTpyKGUpfX0sKGUsdCxhKT0+e3ZhciByPWEoMjIpLG49ci5hbGw7ZS5leHBvcnRzPXIuSVNfSFRNTEREQT9mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZXx8ZT09PW59OmZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfX0sZT0+e3ZhciB0PSJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50LmFsbCxhPXZvaWQgMD09PXQmJnZvaWQgMCE9PXQ7ZS5leHBvcnRzPXthbGw6dCxJU19IVE1MRERBOmF9fSwoZSx0LGEpPT57dmFyIHI9YSgyNCksbj1hKDIxKSxpPWEoMjUpLHM9YSgyNiksbz1PYmplY3Q7ZS5leHBvcnRzPXM/ZnVuY3Rpb24oZSl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiBlfTpmdW5jdGlvbihlKXt2YXIgdD1yKCJTeW1ib2wiKTtyZXR1cm4gbih0KSYmaSh0LnByb3RvdHlwZSxvKGUpKX19LChlLHQsYSk9Pnt2YXIgcj1hKDQpLG49YSgyMSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj8oYT1yW2VdLG4oYSk/YTp2b2lkIDApOnJbZV0mJnJbZV1bdF07dmFyIGF9fSwoZSx0LGEpPT57dmFyIHI9YSgxNCk7ZS5leHBvcnRzPXIoe30uaXNQcm90b3R5cGVPZil9LChlLHQsYSk9Pnt2YXIgcj1hKDI3KTtlLmV4cG9ydHM9ciYmIVN5bWJvbC5zaGFtJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcn0sKGUsdCxhKT0+e3ZhciByPWEoMjgpLG49YSg3KSxpPWEoNCkuU3RyaW5nO2UuZXhwb3J0cz0hIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJiFuKChmdW5jdGlvbigpe3ZhciBlPVN5bWJvbCgpO3JldHVybiFpKGUpfHwhKE9iamVjdChlKWluc3RhbmNlb2YgU3ltYm9sKXx8IVN5bWJvbC5zaGFtJiZyJiZyPDQxfSkpfSwoZSx0LGEpPT57dmFyIHIsbixpPWEoNCkscz1hKDI5KSxvPWkucHJvY2VzcyxjPWkuRGVubyxsPW8mJm8udmVyc2lvbnN8fGMmJmMudmVyc2lvbixoPWwmJmwudjg7aCYmKG49KHI9aC5zcGxpdCgiLiIpKVswXT4wJiZyWzBdPDQ/MTorKHJbMF0rclsxXSkpOyFuJiZzJiYoIShyPXMubWF0Y2goL0VkZ2VcLyhcZCspLykpfHxyWzFdPj03NCkmJihyPXMubWF0Y2goL0Nocm9tZVwvKFxkKykvKSkmJihuPStyWzFdKTtlLmV4cG9ydHM9bn0sZT0+e2UuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmU3RyaW5nKG5hdmlnYXRvci51c2VyQWdlbnQpfHwiIn0sKGUsdCxhKT0+e3ZhciByPWEoMzEpLG49YSgxNyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIGE9ZVt0XTtyZXR1cm4gbihhKT92b2lkIDA6cihhKX19LChlLHQsYSk9Pnt2YXIgcj1hKDIxKSxuPWEoMzIpLGk9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihyKGUpKXJldHVybiBlO3Rocm93IGkobihlKSsiIGlzIG5vdCBhIGZ1bmN0aW9uIil9fSxlPT57dmFyIHQ9U3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt0cnl7cmV0dXJuIHQoZSl9Y2F0Y2goZSl7cmV0dXJuIk9iamVjdCJ9fX0sKGUsdCxhKT0+e3ZhciByPWEoOCksbj1hKDIxKSxpPWEoMjApLHM9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBhLG87aWYoInN0cmluZyI9PT10JiZuKGE9ZS50b1N0cmluZykmJiFpKG89cihhLGUpKSlyZXR1cm4gbztpZihuKGE9ZS52YWx1ZU9mKSYmIWkobz1yKGEsZSkpKXJldHVybiBvO2lmKCJzdHJpbmciIT09dCYmbihhPWUudG9TdHJpbmcpJiYhaShvPXIoYSxlKSkpcmV0dXJuIG87dGhyb3cgcygiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSwoZSx0LGEpPT57dmFyIHI9YSg0KSxuPWEoMzUpLGk9YSgzOSkscz1hKDQxKSxvPWEoMjcpLGM9YSgyNiksbD1yLlN5bWJvbCxoPW4oIndrcyIpLHU9Yz9sLmZvcnx8bDpsJiZsLndpdGhvdXRTZXR0ZXJ8fHM7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2koaCxlKXx8KGhbZV09byYmaShsLGUpP2xbZV06dSgiU3ltYm9sLiIrZSkpO3JldHVybiBoW2VdfX0sKGUsdCxhKT0+e3ZhciByPWEoMzYpLG49YSgzNyk7KGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBuW2VdfHwobltlXT12b2lkIDAhPT10P3Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4zMS4xIixtb2RlOnI/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAxNC0yMDIzIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIixsaWNlbnNlOiJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9ibG9iL3YzLjMxLjEvTElDRU5TRSIsc291cmNlOiJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcyJ9KX0sZT0+e2UuZXhwb3J0cz0hMX0sKGUsdCxhKT0+e3ZhciByPWEoNCksbj1hKDM4KSxpPSJfX2NvcmUtanNfc2hhcmVkX18iLHM9cltpXXx8bihpLHt9KTtlLmV4cG9ydHM9c30sKGUsdCxhKT0+e3ZhciByPWEoNCksbj1PYmplY3QuZGVmaW5lUHJvcGVydHk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dHJ5e24ocixlLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pfWNhdGNoKGEpe3JbZV09dH1yZXR1cm4gdH19LChlLHQsYSk9Pnt2YXIgcj1hKDE0KSxuPWEoNDApLGk9cih7fS5oYXNPd25Qcm9wZXJ0eSk7ZS5leHBvcnRzPU9iamVjdC5oYXNPd258fGZ1bmN0aW9uIGhhc093bihlLHQpe3JldHVybiBpKG4oZSksdCl9fSwoZSx0LGEpPT57dmFyIHI9YSgxNiksbj1PYmplY3Q7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuKHIoZSkpfX0sKGUsdCxhKT0+e3ZhciByPWEoMTQpLG49MCxpPU1hdGgucmFuZG9tKCkscz1yKDEuLnRvU3RyaW5nKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIlN5bWJvbCgiKyh2b2lkIDA9PT1lPyIiOmUpKyIpXyIrcygrK24raSwzNil9fSwoZSx0LGEpPT57dmFyIHI9YSg2KSxuPWEoNyksaT1hKDQzKTtlLmV4cG9ydHM9IXImJiFuKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoaSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpfSwoZSx0LGEpPT57dmFyIHI9YSg0KSxuPWEoMjApLGk9ci5kb2N1bWVudCxzPW4oaSkmJm4oaS5jcmVhdGVFbGVtZW50KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHM/aS5jcmVhdGVFbGVtZW50KGUpOnt9fX0sKGUsdCxhKT0+e3ZhciByPWEoNiksbj1hKDQ1KSxpPWEoMTEpO2UuZXhwb3J0cz1yP2Z1bmN0aW9uKGUsdCxhKXtyZXR1cm4gbi5mKGUsdCxpKDEsYSkpfTpmdW5jdGlvbihlLHQsYSl7ZVt0XT1hO3JldHVybiBlfX0sKGUsdCxhKT0+e3ZhciByPWEoNiksbj1hKDQyKSxpPWEoNDYpLHM9YSg0Nyksbz1hKDE4KSxjPVR5cGVFcnJvcixsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxoPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsdT0iZW51bWVyYWJsZSIsZD0iY29uZmlndXJhYmxlIixmPSJ3cml0YWJsZSI7dC5mPXI/aT9mdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShlLHQsYSl7cyhlKTt0PW8odCk7cyhhKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmInByb3RvdHlwZSI9PT10JiYidmFsdWUiaW4gYSYmZiBpbiBhJiYhYVtmXSl7dmFyIHI9aChlLHQpO2lmKHImJnJbZl0pe2VbdF09YS52YWx1ZTthPXtjb25maWd1cmFibGU6ZCBpbiBhP2FbZF06cltkXSxlbnVtZXJhYmxlOnUgaW4gYT9hW3VdOnJbdV0sd3JpdGFibGU6ITF9fX1yZXR1cm4gbChlLHQsYSl9Omw6ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoZSx0LGEpe3MoZSk7dD1vKHQpO3MoYSk7aWYobil0cnl7cmV0dXJuIGwoZSx0LGEpfWNhdGNoKGUpe31pZigiZ2V0ImluIGF8fCJzZXQiaW4gYSl0aHJvdyBjKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCIpOyJ2YWx1ZSJpbiBhJiYoZVt0XT1hLnZhbHVlKTtyZXR1cm4gZX19LChlLHQsYSk9Pnt2YXIgcj1hKDYpLG49YSg3KTtlLmV4cG9ydHM9ciYmbigoZnVuY3Rpb24oKXtyZXR1cm4gNDIhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSgoZnVuY3Rpb24oKXt9KSwicHJvdG90eXBlIix7dmFsdWU6NDIsd3JpdGFibGU6ITF9KS5wcm90b3R5cGV9KSl9LChlLHQsYSk9Pnt2YXIgcj1hKDIwKSxuPVN0cmluZyxpPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYocihlKSlyZXR1cm4gZTt0aHJvdyBpKG4oZSkrIiBpcyBub3QgYW4gb2JqZWN0Iil9fSwoZSx0LGEpPT57dmFyIHI9YSgyMSksbj1hKDQ1KSxpPWEoNDkpLHM9YSgzOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxhLG8pe298fChvPXt9KTt2YXIgYz1vLmVudW1lcmFibGUsbD12b2lkIDAhPT1vLm5hbWU/by5uYW1lOnQ7cihhKSYmaShhLGwsbyk7aWYoby5nbG9iYWwpYz9lW3RdPWE6cyh0LGEpO2Vsc2V7dHJ5e28udW5zYWZlP2VbdF0mJihjPSEwKTpkZWxldGUgZVt0XX1jYXRjaChlKXt9Yz9lW3RdPWE6bi5mKGUsdCx7dmFsdWU6YSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohby5ub25Db25maWd1cmFibGUsd3JpdGFibGU6IW8ubm9uV3JpdGFibGV9KX1yZXR1cm4gZX19LChlLHQsYSk9Pnt2YXIgcj1hKDE0KSxuPWEoNyksaT1hKDIxKSxzPWEoMzkpLG89YSg2KSxjPWEoNTApLkNPTkZJR1VSQUJMRSxsPWEoNTEpLGg9YSg1MiksdT1oLmVuZm9yY2UsZD1oLmdldCxmPVN0cmluZyxnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxwPXIoIiIuc2xpY2UpLG09cigiIi5yZXBsYWNlKSxiPXIoW10uam9pbikseT1vJiYhbigoZnVuY3Rpb24oKXtyZXR1cm4gOCE9PWcoKGZ1bmN0aW9uKCl7fSksImxlbmd0aCIse3ZhbHVlOjh9KS5sZW5ndGh9KSksdz1TdHJpbmcoU3RyaW5nKS5zcGxpdCgiU3RyaW5nIiksUz1lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LGEpeyJTeW1ib2woIj09PXAoZih0KSwwLDcpJiYodD0iWyIrbShmKHQpLC9eU3ltYm9sXCgoW14pXSopXCkvLCIkMSIpKyJdIik7YSYmYS5nZXR0ZXImJih0PSJnZXQgIit0KTthJiZhLnNldHRlciYmKHQ9InNldCAiK3QpOyghcyhlLCJuYW1lIil8fGMmJmUubmFtZSE9PXQpJiYobz9nKGUsIm5hbWUiLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pOmUubmFtZT10KTt5JiZhJiZzKGEsImFyaXR5IikmJmUubGVuZ3RoIT09YS5hcml0eSYmZyhlLCJsZW5ndGgiLHt2YWx1ZTphLmFyaXR5fSk7dHJ5e2EmJnMoYSwiY29uc3RydWN0b3IiKSYmYS5jb25zdHJ1Y3Rvcj9vJiZnKGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSk6ZS5wcm90b3R5cGUmJihlLnByb3RvdHlwZT12b2lkIDApfWNhdGNoKGUpe312YXIgcj11KGUpO3Mociwic291cmNlIil8fChyLnNvdXJjZT1iKHcsInN0cmluZyI9PXR5cGVvZiB0P3Q6IiIpKTtyZXR1cm4gZX07RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nPVMoKGZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuIGkodGhpcykmJmQodGhpcykuc291cmNlfHxsKHRoaXMpfSksInRvU3RyaW5nIil9LChlLHQsYSk9Pnt2YXIgcj1hKDYpLG49YSgzOSksaT1GdW5jdGlvbi5wcm90b3R5cGUscz1yJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLG89bihpLCJuYW1lIiksYz1vJiYic29tZXRoaW5nIj09PWZ1bmN0aW9uIHNvbWV0aGluZygpe30ubmFtZSxsPW8mJighcnx8ciYmcyhpLCJuYW1lIikuY29uZmlndXJhYmxlKTtlLmV4cG9ydHM9e0VYSVNUUzpvLFBST1BFUjpjLENPTkZJR1VSQUJMRTpsfX0sKGUsdCxhKT0+e3ZhciByPWEoMTQpLG49YSgyMSksaT1hKDM3KSxzPXIoRnVuY3Rpb24udG9TdHJpbmcpO24oaS5pbnNwZWN0U291cmNlKXx8KGkuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gcyhlKX0pO2UuZXhwb3J0cz1pLmluc3BlY3RTb3VyY2V9LChlLHQsYSk9Pnt2YXIgcixuLGkscz1hKDUzKSxvPWEoNCksYz1hKDIwKSxsPWEoNDQpLGg9YSgzOSksdT1hKDM3KSxkPWEoNTQpLGY9YSg1NSksZz0iT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQiLHA9by5UeXBlRXJyb3IsbT1vLldlYWtNYXA7aWYoc3x8dS5zdGF0ZSl7dmFyIGI9dS5zdGF0ZXx8KHUuc3RhdGU9bmV3IG0pO2IuZ2V0PWIuZ2V0O2IuaGFzPWIuaGFzO2Iuc2V0PWIuc2V0O3I9ZnVuY3Rpb24oZSx0KXtpZihiLmhhcyhlKSl0aHJvdyBwKGcpO3QuZmFjYWRlPWU7Yi5zZXQoZSx0KTtyZXR1cm4gdH07bj1mdW5jdGlvbihlKXtyZXR1cm4gYi5nZXQoZSl8fHt9fTtpPWZ1bmN0aW9uKGUpe3JldHVybiBiLmhhcyhlKX19ZWxzZXt2YXIgeT1kKCJzdGF0ZSIpO2ZbeV09ITA7cj1mdW5jdGlvbihlLHQpe2lmKGgoZSx5KSl0aHJvdyBwKGcpO3QuZmFjYWRlPWU7bChlLHksdCk7cmV0dXJuIHR9O249ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSx5KT9lW3ldOnt9fTtpPWZ1bmN0aW9uKGUpe3JldHVybiBoKGUseSl9fWUuZXhwb3J0cz17c2V0OnIsZ2V0Om4saGFzOmksZW5mb3JjZTpmdW5jdGlvbihlKXtyZXR1cm4gaShlKT9uKGUpOnIoZSx7fSl9LGdldHRlckZvcjpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGE7aWYoIWModCl8fChhPW4odCkpLnR5cGUhPT1lKXRocm93IHAoIkluY29tcGF0aWJsZSByZWNlaXZlciwgIitlKyIgcmVxdWlyZWQiKTtyZXR1cm4gYX19fX0sKGUsdCxhKT0+e3ZhciByPWEoNCksbj1hKDIxKSxpPXIuV2Vha01hcDtlLmV4cG9ydHM9bihpKSYmL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhpKSl9LChlLHQsYSk9Pnt2YXIgcj1hKDM1KSxuPWEoNDEpLGk9cigia2V5cyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaVtlXXx8KGlbZV09bihlKSl9fSxlPT57ZS5leHBvcnRzPXt9fSwoZSx0LGEpPT57dmFyIHI9YSgzOSksbj1hKDU3KSxpPWEoNSkscz1hKDQ1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LGEpe2Zvcih2YXIgbz1uKHQpLGM9cy5mLGw9aS5mLGg9MDtoPG8ubGVuZ3RoO2grKyl7dmFyIHU9b1toXTtyKGUsdSl8fGEmJnIoYSx1KXx8YyhlLHUsbCh0LHUpKX19fSwoZSx0LGEpPT57dmFyIHI9YSgyNCksbj1hKDE0KSxpPWEoNTgpLHM9YSg2Nyksbz1hKDQ3KSxjPW4oW10uY29uY2F0KTtlLmV4cG9ydHM9cigiUmVmbGVjdCIsIm93bktleXMiKXx8ZnVuY3Rpb24gb3duS2V5cyhlKXt2YXIgdD1pLmYobyhlKSksYT1zLmY7cmV0dXJuIGE/Yyh0LGEoZSkpOnR9fSwoZSx0LGEpPT57dmFyIHI9YSg1OSksbj1hKDY2KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO3QuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhlKXtyZXR1cm4gcihlLG4pfX0sKGUsdCxhKT0+e3ZhciByPWEoMTQpLG49YSgzOSksaT1hKDEyKSxzPWEoNjApLmluZGV4T2Ysbz1hKDU1KSxjPXIoW10ucHVzaCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIGEscj1pKGUpLGw9MCxoPVtdO2ZvcihhIGluIHIpIW4obyxhKSYmbihyLGEpJiZjKGgsYSk7Zm9yKDt0Lmxlbmd0aD5sOyluKHIsYT10W2wrK10pJiYofnMoaCxhKXx8YyhoLGEpKTtyZXR1cm4gaH19LChlLHQsYSk9Pnt2YXIgcj1hKDEyKSxuPWEoNjEpLGk9YSg2NCksY3JlYXRlTWV0aG9kPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LGEscyl7dmFyIG8sYz1yKHQpLGw9aShjKSxoPW4ocyxsKTtpZihlJiZhIT1hKXtmb3IoO2w+aDspaWYoKG89Y1toKytdKSE9bylyZXR1cm4hMH1lbHNlIGZvcig7bD5oO2grKylpZigoZXx8aCBpbiBjKSYmY1toXT09PWEpcmV0dXJuIGV8fGh8fDA7cmV0dXJuIWUmJi0xfX07ZS5leHBvcnRzPXtpbmNsdWRlczpjcmVhdGVNZXRob2QoITApLGluZGV4T2Y6Y3JlYXRlTWV0aG9kKCExKX19LChlLHQsYSk9Pnt2YXIgcj1hKDYyKSxuPU1hdGgubWF4LGk9TWF0aC5taW47ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIGE9cihlKTtyZXR1cm4gYTwwP24oYSt0LDApOmkoYSx0KX19LChlLHQsYSk9Pnt2YXIgcj1hKDYzKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9K2U7cmV0dXJuIHQhPXR8fDA9PT10PzA6cih0KX19LGU9Pnt2YXIgdD1NYXRoLmNlaWwsYT1NYXRoLmZsb29yO2UuZXhwb3J0cz1NYXRoLnRydW5jfHxmdW5jdGlvbiB0cnVuYyhlKXt2YXIgcj0rZTtyZXR1cm4ocj4wP2E6dCkocil9fSwoZSx0LGEpPT57dmFyIHI9YSg2NSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByKGUubGVuZ3RoKX19LChlLHQsYSk9Pnt2YXIgcj1hKDYyKSxuPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZT4wP24ocihlKSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZT0+e2UuZXhwb3J0cz1bImNvbnN0cnVjdG9yIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b0xvY2FsZVN0cmluZyIsInRvU3RyaW5nIiwidmFsdWVPZiJdfSwoZSx0KT0+e3QuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSwoZSx0LGEpPT57dmFyIHI9YSg3KSxuPWEoMjEpLGk9LyN8XC5wcm90b3R5cGVcLi8saXNGb3JjZWQ9ZnVuY3Rpb24oZSx0KXt2YXIgYT1vW3MoZSldO3JldHVybiBhPT1sfHxhIT1jJiYobih0KT9yKHQpOiEhdCl9LHM9aXNGb3JjZWQubm9ybWFsaXplPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZShpLCIuIikudG9Mb3dlckNhc2UoKX0sbz1pc0ZvcmNlZC5kYXRhPXt9LGM9aXNGb3JjZWQuTkFUSVZFPSJOIixsPWlzRm9yY2VkLlBPTFlGSUxMPSJQIjtlLmV4cG9ydHM9aXNGb3JjZWR9LChlLHQsYSk9Pnt2YXIgcj1hKDkpLG49RnVuY3Rpb24ucHJvdG90eXBlLGk9bi5hcHBseSxzPW4uY2FsbDtlLmV4cG9ydHM9Im9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmFwcGx5fHwocj9zLmJpbmQoaSk6ZnVuY3Rpb24oKXtyZXR1cm4gcy5hcHBseShpLGFyZ3VtZW50cyl9KX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1hKDI0KSxuPWEoMzkpLGk9YSg0NCkscz1hKDI1KSxvPWEoNzEpLGM9YSg1NiksbD1hKDc0KSxoPWEoNzUpLHU9YSg3NiksZD1hKDgwKSxmPWEoODEpLGc9YSg2KSxwPWEoMzYpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsYSxtKXt2YXIgYj0ic3RhY2tUcmFjZUxpbWl0Iix5PW0/MjoxLHc9ZS5zcGxpdCgiLiIpLFM9d1t3Lmxlbmd0aC0xXSx4PXIuYXBwbHkobnVsbCx3KTtpZih4KXt2YXIgQz14LnByb3RvdHlwZTshcCYmbihDLCJjYXVzZSIpJiZkZWxldGUgQy5jYXVzZTtpZighYSlyZXR1cm4geDt2YXIgdj1yKCJFcnJvciIpLGs9dCgoZnVuY3Rpb24oZSx0KXt2YXIgYT11KG0/dDplLHZvaWQgMCkscj1tP25ldyB4KGUpOm5ldyB4O3ZvaWQgMCE9PWEmJmkociwibWVzc2FnZSIsYSk7ZihyLGssci5zdGFjaywyKTt0aGlzJiZzKEMsdGhpcykmJmgocix0aGlzLGspO2FyZ3VtZW50cy5sZW5ndGg+eSYmZChyLGFyZ3VtZW50c1t5XSk7cmV0dXJuIHJ9KSk7ay5wcm90b3R5cGU9QztpZigiRXJyb3IiIT09UylvP28oayx2KTpjKGssdix7bmFtZTohMH0pO2Vsc2UgaWYoZyYmYiBpbiB4KXtsKGsseCxiKTtsKGsseCwicHJlcGFyZVN0YWNrVHJhY2UiKX1jKGsseCk7aWYoIXApdHJ5e0MubmFtZSE9PVMmJmkoQywibmFtZSIsUyk7Qy5jb25zdHJ1Y3Rvcj1rfWNhdGNoKGUpe31yZXR1cm4ga319fSwoZSx0LGEpPT57dmFyIHI9YSg3Miksbj1hKDQ3KSxpPWEoNzMpO2UuZXhwb3J0cz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fCgiX19wcm90b19fImlue30/ZnVuY3Rpb24oKXt2YXIgZSx0PSExLGE9e307dHJ5eyhlPXIoT2JqZWN0LnByb3RvdHlwZSwiX19wcm90b19fIiwic2V0IikpKGEsW10pO3Q9YSBpbnN0YW5jZW9mIEFycmF5fWNhdGNoKGUpe31yZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoYSxyKXtuKGEpO2kocik7dD9lKGEscik6YS5fX3Byb3RvX189cjtyZXR1cm4gYX19KCk6dm9pZCAwKX0sKGUsdCxhKT0+e3ZhciByPWEoMTQpLG49YSgzMSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxhKXt0cnl7cmV0dXJuIHIobihPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdClbYV0pKX1jYXRjaChlKXt9fX0sKGUsdCxhKT0+e3ZhciByPWEoMjEpLG49U3RyaW5nLGk9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGV8fHIoZSkpcmV0dXJuIGU7dGhyb3cgaSgiQ2FuJ3Qgc2V0ICIrbihlKSsiIGFzIGEgcHJvdG90eXBlIil9fSwoZSx0LGEpPT57dmFyIHI9YSg0NSkuZjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LGEpe2EgaW4gZXx8cihlLGEse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFthXX0sc2V0OmZ1bmN0aW9uKGUpe3RbYV09ZX19KX19LChlLHQsYSk9Pnt2YXIgcj1hKDIxKSxuPWEoMjApLGk9YSg3MSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxhKXt2YXIgcyxvO2kmJnIocz10LmNvbnN0cnVjdG9yKSYmcyE9PWEmJm4obz1zLnByb3RvdHlwZSkmJm8hPT1hLnByb3RvdHlwZSYmaShlLG8pO3JldHVybiBlfX0sKGUsdCxhKT0+e3ZhciByPWEoNzcpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT1lP2FyZ3VtZW50cy5sZW5ndGg8Mj8iIjp0OnIoZSl9fSwoZSx0LGEpPT57dmFyIHI9YSg3OCksbj1TdHJpbmc7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCJTeW1ib2wiPT09cihlKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIik7cmV0dXJuIG4oZSl9fSwoZSx0LGEpPT57dmFyIHI9YSg3OSksbj1hKDIxKSxpPWEoMTUpLHM9YSgzNCkoInRvU3RyaW5nVGFnIiksbz1PYmplY3QsYz0iQXJndW1lbnRzIj09aShmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpO2UuZXhwb3J0cz1yP2k6ZnVuY3Rpb24oZSl7dmFyIHQsYSxyO3JldHVybiB2b2lkIDA9PT1lPyJVbmRlZmluZWQiOm51bGw9PT1lPyJOdWxsIjoic3RyaW5nIj09dHlwZW9mKGE9ZnVuY3Rpb24oZSx0KXt0cnl7cmV0dXJuIGVbdF19Y2F0Y2goZSl7fX0odD1vKGUpLHMpKT9hOmM/aSh0KToiT2JqZWN0Ij09KHI9aSh0KSkmJm4odC5jYWxsZWUpPyJBcmd1bWVudHMiOnJ9fSwoZSx0LGEpPT57dmFyIHI9e307clthKDM0KSgidG9TdHJpbmdUYWciKV09InoiO2UuZXhwb3J0cz0iW29iamVjdCB6XSI9PT1TdHJpbmcocil9LChlLHQsYSk9Pnt2YXIgcj1hKDIwKSxuPWEoNDQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3IodCkmJiJjYXVzZSJpbiB0JiZuKGUsImNhdXNlIix0LmNhdXNlKX19LChlLHQsYSk9Pnt2YXIgcj1hKDQ0KSxuPWEoODIpLGk9YSg4Mykscz1FcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LGEsbyl7aSYmKHM/cyhlLHQpOnIoZSwic3RhY2siLG4oYSxvKSkpfX0sKGUsdCxhKT0+e3ZhciByPWEoMTQpLG49RXJyb3IsaT1yKCIiLnJlcGxhY2UpLHM9U3RyaW5nKG4oInp4Y2FzZCIpLnN0YWNrKSxvPS9cblxzKmF0IFteOl0qOlteXG5dKi8sYz1vLnRlc3Qocyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoYyYmInN0cmluZyI9PXR5cGVvZiBlJiYhbi5wcmVwYXJlU3RhY2tUcmFjZSlmb3IoO3QtLTspZT1pKGUsbywiIik7cmV0dXJuIGV9fSwoZSx0LGEpPT57dmFyIHI9YSg3KSxuPWEoMTEpO2UuZXhwb3J0cz0hcigoZnVuY3Rpb24oKXt2YXIgZT1FcnJvcigiYSIpO2lmKCEoInN0YWNrImluIGUpKXJldHVybiEwO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdGFjayIsbigxLDcpKTtyZXR1cm4gNyE9PWUuc3RhY2t9KSl9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7dmFyIHI9YSg4NSksbj1hKDkwKS5maW5kTGFzdCxpPXIuYVR5cGVkQXJyYXk7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZmluZExhc3QiLChmdW5jdGlvbiBmaW5kTGFzdChlKXtyZXR1cm4gbihpKHRoaXMpLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByLG4saSxzPWEoODYpLG89YSg2KSxjPWEoNCksbD1hKDIxKSxoPWEoMjApLHU9YSgzOSksZD1hKDc4KSxmPWEoMzIpLGc9YSg0NCkscD1hKDQ4KSxtPWEoODcpLGI9YSgyNSkseT1hKDg4KSx3PWEoNzEpLFM9YSgzNCkseD1hKDQxKSxDPWEoNTIpLHY9Qy5lbmZvcmNlLGs9Qy5nZXQsTz1jLkludDhBcnJheSxUPU8mJk8ucHJvdG90eXBlLE09Yy5VaW50OENsYW1wZWRBcnJheSxFPU0mJk0ucHJvdG90eXBlLEQ9TyYmeShPKSxOPVQmJnkoVCksUj1PYmplY3QucHJvdG90eXBlLEw9Yy5UeXBlRXJyb3IsJD1TKCJ0b1N0cmluZ1RhZyIpLF89eCgiVFlQRURfQVJSQVlfVEFHIiksaj0iVHlwZWRBcnJheUNvbnN0cnVjdG9yIixVPXMmJiEhdyYmIk9wZXJhIiE9PWQoYy5vcGVyYSksWD0hMSxIPXtJbnQ4QXJyYXk6MSxVaW50OEFycmF5OjEsVWludDhDbGFtcGVkQXJyYXk6MSxJbnQxNkFycmF5OjIsVWludDE2QXJyYXk6MixJbnQzMkFycmF5OjQsVWludDMyQXJyYXk6NCxGbG9hdDMyQXJyYXk6NCxGbG9hdDY0QXJyYXk6OH0scT17QmlnSW50NjRBcnJheTo4LEJpZ1VpbnQ2NEFycmF5Ojh9LGdldFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcj1mdW5jdGlvbihlKXt2YXIgdD15KGUpO2lmKGgodCkpe3ZhciBhPWsodCk7cmV0dXJuIGEmJnUoYSxqKT9hW2pdOmdldFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcih0KX19LGlzVHlwZWRBcnJheT1mdW5jdGlvbihlKXtpZighaChlKSlyZXR1cm4hMTt2YXIgdD1kKGUpO3JldHVybiB1KEgsdCl8fHUocSx0KX07Zm9yKHIgaW4gSCkoaT0obj1jW3JdKSYmbi5wcm90b3R5cGUpP3YoaSlbal09bjpVPSExO2ZvcihyIGluIHEpKGk9KG49Y1tyXSkmJm4ucHJvdG90eXBlKSYmKHYoaSlbal09bik7aWYoIVV8fCFsKEQpfHxEPT09RnVuY3Rpb24ucHJvdG90eXBlKXtEPWZ1bmN0aW9uIFR5cGVkQXJyYXkoKXt0aHJvdyBMKCJJbmNvcnJlY3QgaW52b2NhdGlvbiIpfTtpZihVKWZvcihyIGluIEgpY1tyXSYmdyhjW3JdLEQpfWlmKCFVfHwhTnx8Tj09PVIpe049RC5wcm90b3R5cGU7aWYoVSlmb3IociBpbiBIKWNbcl0mJncoY1tyXS5wcm90b3R5cGUsTil9VSYmeShFKSE9PU4mJncoRSxOKTtpZihvJiYhdShOLCQpKXtYPSEwO20oTiwkLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGgodGhpcyk/dGhpc1tfXTp2b2lkIDB9fSk7Zm9yKHIgaW4gSCljW3JdJiZnKGNbcl0sXyxyKX1lLmV4cG9ydHM9e05BVElWRV9BUlJBWV9CVUZGRVJfVklFV1M6VSxUWVBFRF9BUlJBWV9UQUc6WCYmXyxhVHlwZWRBcnJheTpmdW5jdGlvbihlKXtpZihpc1R5cGVkQXJyYXkoZSkpcmV0dXJuIGU7dGhyb3cgTCgiVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Iil9LGFUeXBlZEFycmF5Q29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7aWYobChlKSYmKCF3fHxiKEQsZSkpKXJldHVybiBlO3Rocm93IEwoZihlKSsiIGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIil9LGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6ZnVuY3Rpb24oZSx0LGEscil7aWYobyl7aWYoYSlmb3IodmFyIG4gaW4gSCl7dmFyIGk9Y1tuXTtpZihpJiZ1KGkucHJvdG90eXBlLGUpKXRyeXtkZWxldGUgaS5wcm90b3R5cGVbZV19Y2F0Y2goYSl7dHJ5e2kucHJvdG90eXBlW2VdPXR9Y2F0Y2goZSl7fX19TltlXSYmIWF8fHAoTixlLGE/dDpVJiZUW2VdfHx0LHIpfX0sZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZDpmdW5jdGlvbihlLHQsYSl7dmFyIHIsbjtpZihvKXtpZih3KXtpZihhKWZvcihyIGluIEgpaWYoKG49Y1tyXSkmJnUobixlKSl0cnl7ZGVsZXRlIG5bZV19Y2F0Y2goZSl7fWlmKERbZV0mJiFhKXJldHVybjt0cnl7cmV0dXJuIHAoRCxlLGE/dDpVJiZEW2VdfHx0KX1jYXRjaChlKXt9fWZvcihyIGluIEgpIShuPWNbcl0pfHxuW2VdJiYhYXx8cChuLGUsdCl9fSxnZXRUeXBlZEFycmF5Q29uc3RydWN0b3I6Z2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yLGlzVmlldzpmdW5jdGlvbiBpc1ZpZXcoZSl7aWYoIWgoZSkpcmV0dXJuITE7dmFyIHQ9ZChlKTtyZXR1cm4iRGF0YVZpZXciPT09dHx8dShILHQpfHx1KHEsdCl9LGlzVHlwZWRBcnJheTppc1R5cGVkQXJyYXksVHlwZWRBcnJheTpELFR5cGVkQXJyYXlQcm90b3R5cGU6Tn19LGU9PntlLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBEYXRhVmlld30sKGUsdCxhKT0+e3ZhciByPWEoNDkpLG49YSg0NSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxhKXthLmdldCYmcihhLmdldCx0LHtnZXR0ZXI6ITB9KTthLnNldCYmcihhLnNldCx0LHtzZXR0ZXI6ITB9KTtyZXR1cm4gbi5mKGUsdCxhKX19LChlLHQsYSk9Pnt2YXIgcj1hKDM5KSxuPWEoMjEpLGk9YSg0MCkscz1hKDU0KSxvPWEoODkpLGM9cygiSUVfUFJPVE8iKSxsPU9iamVjdCxoPWwucHJvdG90eXBlO2UuZXhwb3J0cz1vP2wuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9aShlKTtpZihyKHQsYykpcmV0dXJuIHRbY107dmFyIGE9dC5jb25zdHJ1Y3RvcjtyZXR1cm4gbihhKSYmdCBpbnN0YW5jZW9mIGE/YS5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIGw/aDpudWxsfX0sKGUsdCxhKT0+e3ZhciByPWEoNyk7ZS5leHBvcnRzPSFyKChmdW5jdGlvbigpe2Z1bmN0aW9uIEYoKXt9Ri5wcm90b3R5cGUuY29uc3RydWN0b3I9bnVsbDtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBGKSE9PUYucHJvdG90eXBlfSkpfSwoZSx0LGEpPT57dmFyIHI9YSg5MSksbj1hKDEzKSxpPWEoNDApLHM9YSg2NCksY3JlYXRlTWV0aG9kPWZ1bmN0aW9uKGUpe3ZhciB0PTE9PWU7cmV0dXJuIGZ1bmN0aW9uKGEsbyxjKXtmb3IodmFyIGwsaD1pKGEpLHU9bihoKSxkPXIobyxjKSxmPXModSk7Zi0tID4wOylpZihkKGw9dVtmXSxmLGgpKXN3aXRjaChlKXtjYXNlIDA6cmV0dXJuIGw7Y2FzZSAxOnJldHVybiBmfXJldHVybiB0Py0xOnZvaWQgMH19O2UuZXhwb3J0cz17ZmluZExhc3Q6Y3JlYXRlTWV0aG9kKDApLGZpbmRMYXN0SW5kZXg6Y3JlYXRlTWV0aG9kKDEpfX0sKGUsdCxhKT0+e3ZhciByPWEoOTIpLG49YSgzMSksaT1hKDkpLHM9cihyLmJpbmQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe24oZSk7cmV0dXJuIHZvaWQgMD09PXQ/ZTppP3MoZSx0KTpmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19fSwoZSx0LGEpPT57dmFyIHI9YSgxNSksbj1hKDE0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoIkZ1bmN0aW9uIj09PXIoZSkpcmV0dXJuIG4oZSl9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByPWEoODUpLG49YSg5MCkuZmluZExhc3RJbmRleCxpPXIuYVR5cGVkQXJyYXk7KDAsci5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZmluZExhc3RJbmRleCIsKGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoZSl7cmV0dXJuIG4oaSh0aGlzKSxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0pKX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1hKDQpLG49YSg4KSxpPWEoODUpLHM9YSg2NCksbz1hKDk1KSxjPWEoNDApLGw9YSg3KSxoPXIuUmFuZ2VFcnJvcix1PXIuSW50OEFycmF5LGQ9dSYmdS5wcm90b3R5cGUsZj1kJiZkLnNldCxnPWkuYVR5cGVkQXJyYXkscD1pLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsbT0hbCgoZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhDbGFtcGVkQXJyYXkoMik7bihmLGUse2xlbmd0aDoxLDA6M30sMSk7cmV0dXJuIDMhPT1lWzFdfSkpLGI9bSYmaS5OQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTJiZsKChmdW5jdGlvbigpe3ZhciBlPW5ldyB1KDIpO2Uuc2V0KDEpO2Uuc2V0KCIyIiwxKTtyZXR1cm4gMCE9PWVbMF18fDIhPT1lWzFdfSkpO3AoInNldCIsKGZ1bmN0aW9uIHNldChlKXtnKHRoaXMpO3ZhciB0PW8oYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMSksYT1jKGUpO2lmKG0pcmV0dXJuIG4oZix0aGlzLGEsdCk7dmFyIHI9dGhpcy5sZW5ndGgsaT1zKGEpLGw9MDtpZihpK3Q+cil0aHJvdyBoKCJXcm9uZyBsZW5ndGgiKTtmb3IoO2w8aTspdGhpc1t0K2xdPWFbbCsrXX0pLCFtfHxiKX0sKGUsdCxhKT0+e3ZhciByPWEoOTYpLG49UmFuZ2VFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgYT1yKGUpO2lmKGEldCl0aHJvdyBuKCJXcm9uZyBvZmZzZXQiKTtyZXR1cm4gYX19LChlLHQsYSk9Pnt2YXIgcj1hKDYyKSxuPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXIoZSk7aWYodDwwKXRocm93IG4oIlRoZSBhcmd1bWVudCBjYW4ndCBiZSBsZXNzIHRoYW4gMCIpO3JldHVybiB0fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1hKDk4KSxuPWEoODUpLGk9bi5hVHlwZWRBcnJheSxzPW4uZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxvPW4uZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yO3MoInRvUmV2ZXJzZWQiLChmdW5jdGlvbiB0b1JldmVyc2VkKCl7cmV0dXJuIHIoaSh0aGlzKSxvKHRoaXMpKX0pKX0sKGUsdCxhKT0+e3ZhciByPWEoNjQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgYT1yKGUpLG49bmV3IHQoYSksaT0wO2k8YTtpKyspbltpXT1lW2EtaS0xXTtyZXR1cm4gbn19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7dmFyIHI9YSg4NSksbj1hKDE0KSxpPWEoMzEpLHM9YSgxMDApLG89ci5hVHlwZWRBcnJheSxjPXIuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yLGw9ci5leHBvcnRUeXBlZEFycmF5TWV0aG9kLGg9bihyLlR5cGVkQXJyYXlQcm90b3R5cGUuc29ydCk7bCgidG9Tb3J0ZWQiLChmdW5jdGlvbiB0b1NvcnRlZChlKXt2b2lkIDAhPT1lJiZpKGUpO3ZhciB0PW8odGhpcyksYT1zKGModCksdCk7cmV0dXJuIGgoYSxlKX0pKX0sKGUsdCxhKT0+e3ZhciByPWEoNjQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgYT0wLG49cih0KSxpPW5ldyBlKG4pO24+YTspaVthXT10W2ErK107cmV0dXJuIGl9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByPWEoMTAyKSxuPWEoODUpLGk9YSgxMDMpLHM9YSg2Miksbz1hKDEwNCksYz1uLmFUeXBlZEFycmF5LGw9bi5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsaD1uLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsdT0hIWZ1bmN0aW9uKCl7dHJ5e25ldyBJbnQ4QXJyYXkoMSkud2l0aCgyLHt2YWx1ZU9mOmZ1bmN0aW9uKCl7dGhyb3cgOH19KX1jYXRjaChlKXtyZXR1cm4gOD09PWV9fSgpO2goIndpdGgiLHt3aXRoOmZ1bmN0aW9uKGUsdCl7dmFyIGE9Yyh0aGlzKSxuPXMoZSksaD1pKGEpP28odCk6K3Q7cmV0dXJuIHIoYSxsKGEpLG4saCl9fS53aXRoLCF1KX0sKGUsdCxhKT0+e3ZhciByPWEoNjQpLG49YSg2MiksaT1SYW5nZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsYSxzKXt2YXIgbz1yKGUpLGM9bihhKSxsPWM8MD9vK2M6YztpZihsPj1vfHxsPDApdGhyb3cgaSgiSW5jb3JyZWN0IGluZGV4Iik7Zm9yKHZhciBoPW5ldyB0KG8pLHU9MDt1PG87dSsrKWhbdV09dT09PWw/czplW3VdO3JldHVybiBofX0sKGUsdCxhKT0+e3ZhciByPWEoNzgpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1yKGUpO3JldHVybiJCaWdJbnQ2NEFycmF5Ij09dHx8IkJpZ1VpbnQ2NEFycmF5Ij09dH19LChlLHQsYSk9Pnt2YXIgcj1hKDE5KSxuPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9cihlLCJudW1iZXIiKTtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbigiQ2FuJ3QgY29udmVydCBudW1iZXIgdG8gYmlnaW50Iik7cmV0dXJuIEJpZ0ludCh0KX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7dmFyIHI9YSg2KSxuPWEoODcpLGk9YSgxMDYpLHM9QXJyYXlCdWZmZXIucHJvdG90eXBlO3ImJiEoImRldGFjaGVkImluIHMpJiZuKHMsImRldGFjaGVkIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbiBkZXRhY2hlZCgpe3JldHVybiBpKHRoaXMpfX0pfSwoZSx0LGEpPT57dmFyIHI9YSgxNCksbj1hKDEwNyksaT1yKEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKDAhPT1uKGUpKXJldHVybiExO3RyeXtpKGUsMCwwKTtyZXR1cm4hMX1jYXRjaChlKXtyZXR1cm4hMH19fSwoZSx0LGEpPT57dmFyIHI9YSg3Miksbj1hKDE1KSxpPVR5cGVFcnJvcjtlLmV4cG9ydHM9cihBcnJheUJ1ZmZlci5wcm90b3R5cGUsImJ5dGVMZW5ndGgiLCJnZXQiKXx8ZnVuY3Rpb24oZSl7aWYoIkFycmF5QnVmZmVyIiE9bihlKSl0aHJvdyBpKCJBcnJheUJ1ZmZlciBleHBlY3RlZCIpO3JldHVybiBlLmJ5dGVMZW5ndGh9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByPWEoMyksbj1hKDEwOSk7biYmcih7dGFyZ2V0OiJBcnJheUJ1ZmZlciIscHJvdG86ITB9LHt0cmFuc2ZlcjpmdW5jdGlvbiB0cmFuc2Zlcigpe3JldHVybiBuKHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwLCEwKX19KX0sKGUsdCxhKT0+e3ZhciByPWEoNCksbj1hKDE0KSxpPWEoNzIpLHM9YSgxMTApLG89YSgxMDYpLGM9YSgxMDcpLGw9YSgxMTEpLGg9ci5UeXBlRXJyb3IsdT1yLnN0cnVjdHVyZWRDbG9uZSxkPXIuQXJyYXlCdWZmZXIsZj1yLkRhdGFWaWV3LGc9TWF0aC5taW4scD1kLnByb3RvdHlwZSxtPWYucHJvdG90eXBlLGI9bihwLnNsaWNlKSx5PWkocCwicmVzaXphYmxlIiwiZ2V0Iiksdz1pKHAsIm1heEJ5dGVMZW5ndGgiLCJnZXQiKSxTPW4obS5nZXRJbnQ4KSx4PW4obS5zZXRJbnQ4KTtlLmV4cG9ydHM9bCYmZnVuY3Rpb24oZSx0LGEpe3ZhciByPWMoZSksbj12b2lkIDA9PT10P3I6cyh0KSxpPSF5fHwheShlKTtpZihvKGUpKXRocm93IGgoIkFycmF5QnVmZmVyIGlzIGRldGFjaGVkIik7dmFyIGw9dShlLHt0cmFuc2ZlcjpbZV19KTtpZihyPT1uJiYoYXx8aSkpcmV0dXJuIGw7aWYocj49biYmKCFhfHxpKSlyZXR1cm4gYihsLDAsbik7Zm9yKHZhciBwPWEmJiFpJiZ3P3ttYXhCeXRlTGVuZ3RoOncobCl9OnZvaWQgMCxtPW5ldyBkKG4scCksQz1uZXcgZihsKSx2PW5ldyBmKG0pLGs9ZyhuLHIpLE89MDtPPGs7TysrKXgodixPLFMoQyxPKSk7cmV0dXJuIG19fSwoZSx0LGEpPT57dmFyIHI9YSg2Miksbj1hKDY1KSxpPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUpcmV0dXJuIDA7dmFyIHQ9cihlKSxhPW4odCk7aWYodCE9PWEpdGhyb3cgaSgiV3JvbmcgbGVuZ3RoIG9yIGluZGV4Iik7cmV0dXJuIGF9fSwoZSx0LGEpPT57dmFyIHI9YSg0KSxuPWEoNyksaT1hKDI4KSxzPWEoMTEyKSxvPWEoMTEzKSxjPWEoMTE0KSxsPXIuc3RydWN0dXJlZENsb25lO2UuZXhwb3J0cz0hIWwmJiFuKChmdW5jdGlvbigpe2lmKG8mJmk+OTJ8fGMmJmk+OTR8fHMmJmk+OTcpcmV0dXJuITE7dmFyIGU9bmV3IEFycmF5QnVmZmVyKDgpLHQ9bChlLHt0cmFuc2ZlcjpbZV19KTtyZXR1cm4gMCE9ZS5ieXRlTGVuZ3RofHw4IT10LmJ5dGVMZW5ndGh9KSl9LChlLHQsYSk9Pnt2YXIgcj1hKDExMyksbj1hKDExNCk7ZS5leHBvcnRzPSFyJiYhbiYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnR9LGU9PntlLmV4cG9ydHM9Im9iamVjdCI9PXR5cGVvZiBEZW5vJiZEZW5vJiYib2JqZWN0Ij09dHlwZW9mIERlbm8udmVyc2lvbn0sKGUsdCxhKT0+e3ZhciByPWEoMTUpO2UuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJiJwcm9jZXNzIj09cihwcm9jZXNzKX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1hKDMpLG49YSgxMDkpO24mJnIoe3RhcmdldDoiQXJyYXlCdWZmZXIiLHByb3RvOiEwfSx7dHJhbnNmZXJUb0ZpeGVkTGVuZ3RoOmZ1bmN0aW9uIHRyYW5zZmVyVG9GaXhlZExlbmd0aCgpe3JldHVybiBuKHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwLCExKX19KX0sKGUsdCxhKT0+e3ZhciByPWEoMyksbj1hKDExNyk7cih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOiFhKDEyNSkoImRpZmZlcmVuY2UiKX0se2RpZmZlcmVuY2U6bn0pfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByPWEoMTE4KSxuPWEoMTE5KSxpPWEoMTIwKSxzPWEoMTIzKSxvPWEoMTI0KSxjPWEoMTIxKSxsPWEoMTIyKSxoPW4uaGFzLHU9bi5yZW1vdmU7ZS5leHBvcnRzPWZ1bmN0aW9uIGRpZmZlcmVuY2UoZSl7dmFyIHQ9cih0aGlzKSxhPW8oZSksbj1pKHQpO3ModCk8PWEuc2l6ZT9jKHQsKGZ1bmN0aW9uKGUpe2EuaW5jbHVkZXMoZSkmJnUobixlKX0pKTpsKGEuZ2V0SXRlcmF0b3IoKSwoZnVuY3Rpb24oZSl7aCh0LGUpJiZ1KG4sZSl9KSk7cmV0dXJuIG59fSwoZSx0LGEpPT57dmFyIHI9YSgxMTkpLmhhcztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cihlKTtyZXR1cm4gZX19LChlLHQsYSk9Pnt2YXIgcj1hKDE0KSxuPVNldC5wcm90b3R5cGU7ZS5leHBvcnRzPXtTZXQ6U2V0LGFkZDpyKG4uYWRkKSxoYXM6cihuLmhhcykscmVtb3ZlOnIobi5kZWxldGUpLHByb3RvOm59fSwoZSx0LGEpPT57dmFyIHI9YSgxMTkpLG49YSgxMjEpLGk9ci5TZXQscz1yLmFkZDtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IGk7bihlLChmdW5jdGlvbihlKXtzKHQsZSl9KSk7cmV0dXJuIHR9fSwoZSx0LGEpPT57dmFyIHI9YSgxNCksbj1hKDEyMiksaT1hKDExOSkscz1pLlNldCxvPWkucHJvdG8sYz1yKG8uZm9yRWFjaCksbD1yKG8ua2V5cyksaD1sKG5ldyBzKS5uZXh0O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsYSl7cmV0dXJuIGE/bihsKGUpLHQsaCk6YyhlLHQpfX0sKGUsdCxhKT0+e3ZhciByPWEoOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxhKXtmb3IodmFyIG4saSxzPWF8fGUubmV4dDshKG49cihzLGUpKS5kb25lOylpZih2b2lkIDAhPT0oaT10KG4udmFsdWUpKSlyZXR1cm4gaX19LChlLHQsYSk9Pnt2YXIgcj1hKDcyKSxuPWEoMTE5KTtlLmV4cG9ydHM9cihuLnByb3RvLCJzaXplIiwiZ2V0Iil8fGZ1bmN0aW9uKGUpe3JldHVybiBlLnNpemV9fSwoZSx0LGEpPT57dmFyIHI9YSgzMSksbj1hKDQ3KSxpPWEoOCkscz1hKDYyKSxvPVR5cGVFcnJvcixjPU1hdGgubWF4LFNldFJlY29yZD1mdW5jdGlvbihlLHQsYSxyKXt0aGlzLnNldD1lO3RoaXMuc2l6ZT10O3RoaXMuaGFzPWE7dGhpcy5rZXlzPXJ9O1NldFJlY29yZC5wcm90b3R5cGU9e2dldEl0ZXJhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG4oaSh0aGlzLmtleXMsdGhpcy5zZXQpKX0saW5jbHVkZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGkodGhpcy5oYXMsdGhpcy5zZXQsZSl9fTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7bihlKTt2YXIgdD0rZS5zaXplO2lmKHQhPXQpdGhyb3cgbygiSW52YWxpZCBzaXplIik7cmV0dXJuIG5ldyBTZXRSZWNvcmQoZSxjKHModCksMCkscihlLmhhcykscihlLmtleXMpKX19LChlLHQsYSk9Pnt2YXIgcj1hKDI0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5eyhuZXcocigiU2V0IikpKVtlXSh7c2l6ZTowLGhhczpmdW5jdGlvbigpe3JldHVybiExfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohMH19fX19KTtyZXR1cm4hMH1jYXRjaChlKXtyZXR1cm4hMX19fSwoZSx0LGEpPT57dmFyIHI9YSgzKSxuPWEoNyksaT1hKDEyNyk7cih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOiFhKDEyNSkoImludGVyc2VjdGlvbiIpfHxuKChmdW5jdGlvbigpe3JldHVybiIzLDIiIT1BcnJheS5mcm9tKG5ldyBTZXQoWzEsMiwzXSkuaW50ZXJzZWN0aW9uKG5ldyBTZXQoWzMsMl0pKSl9KSl9LHtpbnRlcnNlY3Rpb246aX0pfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByPWEoMTE4KSxuPWEoMTE5KSxpPWEoMTIzKSxzPWEoMTI0KSxvPWEoMTIxKSxjPWEoMTIyKSxsPW4uU2V0LGg9bi5hZGQsdT1uLmhhcztlLmV4cG9ydHM9ZnVuY3Rpb24gaW50ZXJzZWN0aW9uKGUpe3ZhciB0PXIodGhpcyksYT1zKGUpLG49bmV3IGw7aSh0KT5hLnNpemU/YyhhLmdldEl0ZXJhdG9yKCksKGZ1bmN0aW9uKGUpe3UodCxlKSYmaChuLGUpfSkpOm8odCwoZnVuY3Rpb24oZSl7YS5pbmNsdWRlcyhlKSYmaChuLGUpfSkpO3JldHVybiBufX0sKGUsdCxhKT0+e3ZhciByPWEoMyksbj1hKDEyOSk7cih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOiFhKDEyNSkoImlzRGlzam9pbnRGcm9tIil9LHtpc0Rpc2pvaW50RnJvbTpufSl9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7dmFyIHI9YSgxMTgpLG49YSgxMTkpLmhhcyxpPWEoMTIzKSxzPWEoMTI0KSxvPWEoMTIxKSxjPWEoMTIyKSxsPWEoMTMwKTtlLmV4cG9ydHM9ZnVuY3Rpb24gaXNEaXNqb2ludEZyb20oZSl7dmFyIHQ9cih0aGlzKSxhPXMoZSk7aWYoaSh0KTw9YS5zaXplKXJldHVybiExIT09byh0LChmdW5jdGlvbihlKXtpZihhLmluY2x1ZGVzKGUpKXJldHVybiExfSksITApO3ZhciBoPWEuZ2V0SXRlcmF0b3IoKTtyZXR1cm4hMSE9PWMoaCwoZnVuY3Rpb24oZSl7aWYobih0LGUpKXJldHVybiBsKGgsIm5vcm1hbCIsITEpfSkpfX0sKGUsdCxhKT0+e3ZhciByPWEoOCksbj1hKDQ3KSxpPWEoMzApO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsYSl7dmFyIHMsbztuKGUpO3RyeXtpZighKHM9aShlLCJyZXR1cm4iKSkpe2lmKCJ0aHJvdyI9PT10KXRocm93IGE7cmV0dXJuIGF9cz1yKHMsZSl9Y2F0Y2goZSl7bz0hMDtzPWV9aWYoInRocm93Ij09PXQpdGhyb3cgYTtpZihvKXRocm93IHM7bihzKTtyZXR1cm4gYX19LChlLHQsYSk9Pnt2YXIgcj1hKDMpLG49YSgxMzIpO3Ioe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohYSgxMjUpKCJpc1N1YnNldE9mIil9LHtpc1N1YnNldE9mOm59KX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1hKDExOCksbj1hKDEyMyksaT1hKDEyMSkscz1hKDEyNCk7ZS5leHBvcnRzPWZ1bmN0aW9uIGlzU3Vic2V0T2YoZSl7dmFyIHQ9cih0aGlzKSxhPXMoZSk7cmV0dXJuIShuKHQpPmEuc2l6ZSkmJiExIT09aSh0LChmdW5jdGlvbihlKXtpZighYS5pbmNsdWRlcyhlKSlyZXR1cm4hMX0pLCEwKX19LChlLHQsYSk9Pnt2YXIgcj1hKDMpLG49YSgxMzQpO3Ioe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohYSgxMjUpKCJpc1N1cGVyc2V0T2YiKX0se2lzU3VwZXJzZXRPZjpufSl9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7dmFyIHI9YSgxMTgpLG49YSgxMTkpLmhhcyxpPWEoMTIzKSxzPWEoMTI0KSxvPWEoMTIyKSxjPWEoMTMwKTtlLmV4cG9ydHM9ZnVuY3Rpb24gaXNTdXBlcnNldE9mKGUpe3ZhciB0PXIodGhpcyksYT1zKGUpO2lmKGkodCk8YS5zaXplKXJldHVybiExO3ZhciBsPWEuZ2V0SXRlcmF0b3IoKTtyZXR1cm4hMSE9PW8obCwoZnVuY3Rpb24oZSl7aWYoIW4odCxlKSlyZXR1cm4gYyhsLCJub3JtYWwiLCExKX0pKX19LChlLHQsYSk9Pnt2YXIgcj1hKDMpLG49YSgxMzYpO3Ioe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohYSgxMjUpKCJzeW1tZXRyaWNEaWZmZXJlbmNlIil9LHtzeW1tZXRyaWNEaWZmZXJlbmNlOm59KX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1hKDExOCksbj1hKDExOSksaT1hKDEyMCkscz1hKDEyNCksbz1hKDEyMiksYz1uLmFkZCxsPW4uaGFzLGg9bi5yZW1vdmU7ZS5leHBvcnRzPWZ1bmN0aW9uIHN5bW1ldHJpY0RpZmZlcmVuY2UoZSl7dmFyIHQ9cih0aGlzKSxhPXMoZSkuZ2V0SXRlcmF0b3IoKSxuPWkodCk7byhhLChmdW5jdGlvbihlKXtsKHQsZSk/aChuLGUpOmMobixlKX0pKTtyZXR1cm4gbn19LChlLHQsYSk9Pnt2YXIgcj1hKDMpLG49YSgxMzgpO3Ioe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohYSgxMjUpKCJ1bmlvbiIpfSx7dW5pb246bn0pfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByPWEoMTE4KSxuPWEoMTE5KS5hZGQsaT1hKDEyMCkscz1hKDEyNCksbz1hKDEyMik7ZS5leHBvcnRzPWZ1bmN0aW9uIHVuaW9uKGUpe3ZhciB0PXIodGhpcyksYT1zKGUpLmdldEl0ZXJhdG9yKCksYz1pKHQpO28oYSwoZnVuY3Rpb24oZSl7bihjLGUpfSkpO3JldHVybiBjfX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1hKDMpLG49YSg0MCksaT1hKDY0KSxzPWEoMTQwKSxvPWEoMTQyKTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxhcml0eToxLGZvcmNlZDphKDcpKChmdW5jdGlvbigpe3JldHVybiA0Mjk0OTY3Mjk3IT09W10ucHVzaC5jYWxsKHtsZW5ndGg6NDI5NDk2NzI5Nn0sMSl9KSl8fCFmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sImxlbmd0aCIse3dyaXRhYmxlOiExfSkucHVzaCgpfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKX0se3B1c2g6ZnVuY3Rpb24gcHVzaChlKXt2YXIgdD1uKHRoaXMpLGE9aSh0KSxyPWFyZ3VtZW50cy5sZW5ndGg7byhhK3IpO2Zvcih2YXIgYz0wO2M8cjtjKyspe3RbYV09YXJndW1lbnRzW2NdO2ErK31zKHQsYSk7cmV0dXJuIGF9fSl9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7dmFyIHI9YSg2KSxuPWEoMTQxKSxpPVR5cGVFcnJvcixzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isbz1yJiYhZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10aGlzKXJldHVybiEwO3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sImxlbmd0aCIse3dyaXRhYmxlOiExfSkubGVuZ3RoPTF9Y2F0Y2goZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBUeXBlRXJyb3J9fSgpO2UuZXhwb3J0cz1vP2Z1bmN0aW9uKGUsdCl7aWYobihlKSYmIXMoZSwibGVuZ3RoIikud3JpdGFibGUpdGhyb3cgaSgiQ2Fubm90IHNldCByZWFkIG9ubHkgLmxlbmd0aCIpO3JldHVybiBlLmxlbmd0aD10fTpmdW5jdGlvbihlLHQpe3JldHVybiBlLmxlbmd0aD10fX0sKGUsdCxhKT0+e3ZhciByPWEoMTUpO2UuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbiBpc0FycmF5KGUpe3JldHVybiJBcnJheSI9PXIoZSl9fSxlPT57dmFyIHQ9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihlPjkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgdCgiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7cmV0dXJuIGV9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByPWEoMyksbj1hKDQpLGk9YSg4Nykscz1hKDYpLG89VHlwZUVycm9yLGM9T2JqZWN0LmRlZmluZVByb3BlcnR5LGw9bi5zZWxmIT09bjt0cnl7aWYocyl7dmFyIGg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLCJzZWxmIik7IWwmJmgmJmguZ2V0JiZoLmVudW1lcmFibGV8fGkobiwic2VsZiIse2dldDpmdW5jdGlvbiBzZWxmKCl7cmV0dXJuIG59LHNldDpmdW5jdGlvbiBzZWxmKGUpe2lmKHRoaXMhPT1uKXRocm93IG8oIklsbGVnYWwgaW52b2NhdGlvbiIpO2Mobiwic2VsZiIse3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KX1lbHNlIHIoe2dsb2JhbDohMCxzaW1wbGU6ITAsZm9yY2VkOmx9LHtzZWxmOm59KX1jYXRjaChlKXt9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlZlcmJvc2l0eUxldmVsPXQuVXRpbD10LlVua25vd25FcnJvckV4Y2VwdGlvbj10LlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbj10LlRleHRSZW5kZXJpbmdNb2RlPXQuUmVuZGVyaW5nSW50ZW50RmxhZz10LlByb21pc2VDYXBhYmlsaXR5PXQuUGVybWlzc2lvbkZsYWc9dC5QYXNzd29yZFJlc3BvbnNlcz10LlBhc3N3b3JkRXhjZXB0aW9uPXQuUGFnZUFjdGlvbkV2ZW50VHlwZT10Lk9QUz10Lk1pc3NpbmdQREZFeGNlcHRpb249dC5NQVhfSU1BR0VfU0laRV9UT19DQUNIRT10LkxJTkVfRkFDVE9SPXQuTElORV9ERVNDRU5UX0ZBQ1RPUj10LkludmFsaWRQREZFeGNlcHRpb249dC5JbWFnZUtpbmQ9dC5JREVOVElUWV9NQVRSSVg9dC5Gb3JtYXRFcnJvcj10LkZlYXR1cmVUZXN0PXQuRk9OVF9JREVOVElUWV9NQVRSSVg9dC5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZT10LkNNYXBDb21wcmVzc2lvblR5cGU9dC5CYXNlRXhjZXB0aW9uPXQuQkFTRUxJTkVfRkFDVE9SPXQuQW5ub3RhdGlvblR5cGU9dC5Bbm5vdGF0aW9uUmVwbHlUeXBlPXQuQW5ub3RhdGlvbk1vZGU9dC5Bbm5vdGF0aW9uRmxhZz10LkFubm90YXRpb25GaWVsZEZsYWc9dC5Bbm5vdGF0aW9uRWRpdG9yVHlwZT10LkFubm90YXRpb25FZGl0b3JQcmVmaXg9dC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZT10LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9dC5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlPXQuQWJvcnRFeGNlcHRpb249dm9pZCAwO3QuYXNzZXJ0PWZ1bmN0aW9uIGFzc2VydChlLHQpe2V8fHVucmVhY2hhYmxlKHQpfTt0LmJ5dGVzVG9TdHJpbmc9Ynl0ZXNUb1N0cmluZzt0LmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw9ZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbCxhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsO2lmKCFlKXJldHVybiBudWxsO3RyeXtpZihhJiYic3RyaW5nIj09dHlwZW9mIGUpe2lmKGEuYWRkRGVmYXVsdFByb3RvY29sJiZlLnN0YXJ0c1dpdGgoInd3dy4iKSl7Y29uc3QgdD1lLm1hdGNoKC9cLi9nKTt0Py5sZW5ndGg+PTImJihlPWBodHRwOi8vJHtlfWApfWlmKGEudHJ5Q29udmVydEVuY29kaW5nKXRyeXtlPXN0cmluZ1RvVVRGOFN0cmluZyhlKX1jYXRjaHt9fWNvbnN0IHI9dD9uZXcgVVJMKGUsdCk6bmV3IFVSTChlKTtpZihmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKGUpe3N3aXRjaChlPy5wcm90b2NvbCl7Y2FzZSJodHRwOiI6Y2FzZSJodHRwczoiOmNhc2UiZnRwOiI6Y2FzZSJtYWlsdG86IjpjYXNlInRlbDoiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fShyKSlyZXR1cm4gcn1jYXRjaHt9cmV0dXJuIG51bGx9O3QuZ2V0TW9kaWZpY2F0aW9uRGF0ZT1mdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm5ldyBEYXRlO3JldHVybltlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwoZS5nZXRVVENNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLGUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLGUuZ2V0VVRDSG91cnMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKV0uam9pbigiIil9O3QuZ2V0VXVpZD1mdW5jdGlvbiBnZXRVdWlkKCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8/LnJhbmRvbVVVSUQpcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7Y29uc3QgZT1uZXcgVWludDhBcnJheSgzMik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBjcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBjcnlwdG8/LmdldFJhbmRvbVZhbHVlcyljcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2Vsc2UgZm9yKGxldCB0PTA7dDwzMjt0KyspZVt0XT1NYXRoLmZsb29yKDI1NSpNYXRoLnJhbmRvbSgpKTtyZXR1cm4gYnl0ZXNUb1N0cmluZyhlKX07dC5nZXRWZXJib3NpdHlMZXZlbD1mdW5jdGlvbiBnZXRWZXJib3NpdHlMZXZlbCgpe3JldHVybiBpfTt0LmluZm89ZnVuY3Rpb24gaW5mbyhlKXtpPj1uLklORk9TJiZjb25zb2xlLmxvZyhgSW5mbzogJHtlfWApfTt0LmlzQXJyYXlCdWZmZXI9ZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJnZvaWQgMCE9PWU/LmJ5dGVMZW5ndGh9O3QuaXNBcnJheUVxdWFsPWZ1bmN0aW9uIGlzQXJyYXlFcXVhbChlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSsrKWlmKGVbYV0hPT10W2FdKXJldHVybiExO3JldHVybiEwfTt0LmlzTm9kZUpTPXZvaWQgMDt0Lm5vcm1hbGl6ZVVuaWNvZGU9ZnVuY3Rpb24gbm9ybWFsaXplVW5pY29kZShlKXtpZighbCl7bD0vKFtcdTAwYTBcdTAwYjVcdTAzN2VcdTBlYjNcdTIwMDAtXHUyMDBhXHUyMDJmXHUyMTI2XHVmYjAwLVx1ZmIwNFx1ZmIwNlx1ZmIyMC1cdWZiMzZcdWZiMzgtXHVmYjNjXHVmYjNlXHVmYjQwLVx1ZmI0MVx1ZmI0My1cdWZiNDRcdWZiNDYtXHVmYmExXHVmYmE0LVx1ZmJhOVx1ZmJhZS1cdWZiYjFcdWZiZDMtXHVmYmRjXHVmYmRlLVx1ZmJlN1x1ZmJlYS1cdWZiZjhcdWZiZmMtXHVmYmZkXHVmYzAwLVx1ZmM1ZFx1ZmM2NC1cdWZjZjFcdWZjZjUtXHVmZDNkXHVmZDg4XHVmZGY0XHVmZGZhLVx1ZmRmYlx1ZmU3MVx1ZmU3N1x1ZmU3OVx1ZmU3Ylx1ZmU3ZF0rKXwoXHVmYjA1KykvZ3U7aD1uZXcgTWFwKFtbIu+shSIsIsW/dCJdXSl9cmV0dXJuIGUucmVwbGFjZUFsbChsLCgoZSx0LGEpPT50P3Qubm9ybWFsaXplKCJORktDIik6aC5nZXQoYSkpKX07dC5vYmplY3RGcm9tTWFwPWZ1bmN0aW9uIG9iamVjdEZyb21NYXAoZSl7Y29uc3QgdD1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdFthLHJdb2YgZSl0W2FdPXI7cmV0dXJuIHR9O3Qub2JqZWN0U2l6ZT1mdW5jdGlvbiBvYmplY3RTaXplKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGh9O3Quc2V0VmVyYm9zaXR5TGV2ZWw9ZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwoZSl7TnVtYmVyLmlzSW50ZWdlcihlKSYmKGk9ZSl9O3Quc2hhZG93PXNoYWRvdzt0LnN0cmluZzMyPWZ1bmN0aW9uIHN0cmluZzMyKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsMjU1JmUpfTt0LnN0cmluZ1RvQnl0ZXM9c3RyaW5nVG9CeXRlczt0LnN0cmluZ1RvUERGU3RyaW5nPWZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKGUpe2lmKGVbMF0+PSLDryIpe2xldCB0OyLDviI9PT1lWzBdJiYiw78iPT09ZVsxXT90PSJ1dGYtMTZiZSI6IsO/Ij09PWVbMF0mJiLDviI9PT1lWzFdP3Q9InV0Zi0xNmxlIjoiw68iPT09ZVswXSYmIsK7Ij09PWVbMV0mJiLCvyI9PT1lWzJdJiYodD0idXRmLTgiKTtpZih0KXRyeXtjb25zdCBhPW5ldyBUZXh0RGVjb2Rlcih0LHtmYXRhbDohMH0pLHI9c3RyaW5nVG9CeXRlcyhlKTtyZXR1cm4gYS5kZWNvZGUocil9Y2F0Y2goZSl7d2Fybihgc3RyaW5nVG9QREZTdHJpbmc6ICIke2V9Ii5gKX19Y29uc3QgdD1bXTtmb3IobGV0IGE9MCxyPWUubGVuZ3RoO2E8cjthKyspe2NvbnN0IHI9Y1tlLmNoYXJDb2RlQXQoYSldO3QucHVzaChyP1N0cmluZy5mcm9tQ2hhckNvZGUocik6ZS5jaGFyQXQoYSkpfXJldHVybiB0LmpvaW4oIiIpfTt0LnN0cmluZ1RvVVRGOFN0cmluZz1zdHJpbmdUb1VURjhTdHJpbmc7dC51bnJlYWNoYWJsZT11bnJlYWNoYWJsZTt0LnV0ZjhTdHJpbmdUb1N0cmluZz1mdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoZSl7cmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSl9O3Qud2Fybj13YXJuO2EoMik7YSgxNDUpO2EoMTQ3KTthKDE0OCk7YSgxMzkpO2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTtjb25zdCByPSEoIm9iamVjdCIhPXR5cGVvZiBwcm9jZXNzfHxwcm9jZXNzKyIiIT0iW29iamVjdCBwcm9jZXNzXSJ8fHByb2Nlc3MudmVyc2lvbnMubnd8fHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24mJnByb2Nlc3MudHlwZSYmImJyb3dzZXIiIT09cHJvY2Vzcy50eXBlKTt0LmlzTm9kZUpTPXI7dC5JREVOVElUWV9NQVRSSVg9WzEsMCwwLDEsMCwwXTt0LkZPTlRfSURFTlRJVFlfTUFUUklYPVsuMDAxLDAsMCwuMDAxLDAsMF07dC5NQVhfSU1BR0VfU0laRV9UT19DQUNIRT0xZTc7dC5MSU5FX0ZBQ1RPUj0xLjM1O3QuTElORV9ERVNDRU5UX0ZBQ1RPUj0uMzU7dC5CQVNFTElORV9GQUNUT1I9LjI1OTI1OTI1OTI1OTI1OTI0O3QuUmVuZGVyaW5nSW50ZW50RmxhZz17QU5ZOjEsRElTUExBWToyLFBSSU5UOjQsU0FWRTo4LEFOTk9UQVRJT05TX0ZPUk1TOjE2LEFOTk9UQVRJT05TX1NUT1JBR0U6MzIsQU5OT1RBVElPTlNfRElTQUJMRTo2NCxPUExJU1Q6MjU2fTt0LkFubm90YXRpb25Nb2RlPXtESVNBQkxFOjAsRU5BQkxFOjEsRU5BQkxFX0ZPUk1TOjIsRU5BQkxFX1NUT1JBR0U6M307dC5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4PSJwZGZqc19pbnRlcm5hbF9lZGl0b3JfIjt0LkFubm90YXRpb25FZGl0b3JUeXBlPXtESVNBQkxFOi0xLE5PTkU6MCxGUkVFVEVYVDozLFNUQU1QOjEzLElOSzoxNX07dC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZT17UkVTSVpFOjEsRlJFRVRFWFRfU0laRToxMSxGUkVFVEVYVF9DT0xPUjoxMixGUkVFVEVYVF9PUEFDSVRZOjEzLElOS19DT0xPUjoyMSxJTktfVEhJQ0tORVNTOjIyLElOS19PUEFDSVRZOjIzfTt0LlBlcm1pc3Npb25GbGFnPXtQUklOVDo0LE1PRElGWV9DT05URU5UUzo4LENPUFk6MTYsTU9ESUZZX0FOTk9UQVRJT05TOjMyLEZJTExfSU5URVJBQ1RJVkVfRk9STVM6MjU2LENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6NTEyLEFTU0VNQkxFOjEwMjQsUFJJTlRfSElHSF9RVUFMSVRZOjIwNDh9O3QuVGV4dFJlbmRlcmluZ01vZGU9e0ZJTEw6MCxTVFJPS0U6MSxGSUxMX1NUUk9LRToyLElOVklTSUJMRTozLEZJTExfQUREX1RPX1BBVEg6NCxTVFJPS0VfQUREX1RPX1BBVEg6NSxGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDo2LEFERF9UT19QQVRIOjcsRklMTF9TVFJPS0VfTUFTSzozLEFERF9UT19QQVRIX0ZMQUc6NH07dC5JbWFnZUtpbmQ9e0dSQVlTQ0FMRV8xQlBQOjEsUkdCXzI0QlBQOjIsUkdCQV8zMkJQUDozfTt0LkFubm90YXRpb25UeXBlPXtURVhUOjEsTElOSzoyLEZSRUVURVhUOjMsTElORTo0LFNRVUFSRTo1LENJUkNMRTo2LFBPTFlHT046NyxQT0xZTElORTo4LEhJR0hMSUdIVDo5LFVOREVSTElORToxMCxTUVVJR0dMWToxMSxTVFJJS0VPVVQ6MTIsU1RBTVA6MTMsQ0FSRVQ6MTQsSU5LOjE1LFBPUFVQOjE2LEZJTEVBVFRBQ0hNRU5UOjE3LFNPVU5EOjE4LE1PVklFOjE5LFdJREdFVDoyMCxTQ1JFRU46MjEsUFJJTlRFUk1BUks6MjIsVFJBUE5FVDoyMyxXQVRFUk1BUks6MjQsVEhSRUVEOjI1LFJFREFDVDoyNn07dC5Bbm5vdGF0aW9uUmVwbHlUeXBlPXtHUk9VUDoiR3JvdXAiLFJFUExZOiJSIn07dC5Bbm5vdGF0aW9uRmxhZz17SU5WSVNJQkxFOjEsSElEREVOOjIsUFJJTlQ6NCxOT1pPT006OCxOT1JPVEFURToxNixOT1ZJRVc6MzIsUkVBRE9OTFk6NjQsTE9DS0VEOjEyOCxUT0dHTEVOT1ZJRVc6MjU2LExPQ0tFRENPTlRFTlRTOjUxMn07dC5Bbm5vdGF0aW9uRmllbGRGbGFnPXtSRUFET05MWToxLFJFUVVJUkVEOjIsTk9FWFBPUlQ6NCxNVUxUSUxJTkU6NDA5NixQQVNTV09SRDo4MTkyLE5PVE9HR0xFVE9PRkY6MTYzODQsUkFESU86MzI3NjgsUFVTSEJVVFRPTjo2NTUzNixDT01CTzoxMzEwNzIsRURJVDoyNjIxNDQsU09SVDo1MjQyODgsRklMRVNFTEVDVDoxMDQ4NTc2LE1VTFRJU0VMRUNUOjIwOTcxNTIsRE9OT1RTUEVMTENIRUNLOjQxOTQzMDQsRE9OT1RTQ1JPTEw6ODM4ODYwOCxDT01COjE2Nzc3MjE2LFJJQ0hURVhUOjMzNTU0NDMyLFJBRElPU0lOVU5JU09OOjMzNTU0NDMyLENPTU1JVE9OU0VMQ0hBTkdFOjY3MTA4ODY0fTt0LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9e1NPTElEOjEsREFTSEVEOjIsQkVWRUxFRDozLElOU0VUOjQsVU5ERVJMSU5FOjV9O3QuQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZT17RToiTW91c2UgRW50ZXIiLFg6Ik1vdXNlIEV4aXQiLEQ6Ik1vdXNlIERvd24iLFU6Ik1vdXNlIFVwIixGbzoiRm9jdXMiLEJsOiJCbHVyIixQTzoiUGFnZU9wZW4iLFBDOiJQYWdlQ2xvc2UiLFBWOiJQYWdlVmlzaWJsZSIsUEk6IlBhZ2VJbnZpc2libGUiLEs6IktleXN0cm9rZSIsRjoiRm9ybWF0IixWOiJWYWxpZGF0ZSIsQzoiQ2FsY3VsYXRlIn07dC5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZT17V0M6IldpbGxDbG9zZSIsV1M6IldpbGxTYXZlIixEUzoiRGlkU2F2ZSIsV1A6IldpbGxQcmludCIsRFA6IkRpZFByaW50In07dC5QYWdlQWN0aW9uRXZlbnRUeXBlPXtPOiJQYWdlT3BlbiIsQzoiUGFnZUNsb3NlIn07Y29uc3Qgbj17RVJST1JTOjAsV0FSTklOR1M6MSxJTkZPUzo1fTt0LlZlcmJvc2l0eUxldmVsPW47dC5DTWFwQ29tcHJlc3Npb25UeXBlPXtOT05FOjAsQklOQVJZOjF9O3QuT1BTPXtkZXBlbmRlbmN5OjEsc2V0TGluZVdpZHRoOjIsc2V0TGluZUNhcDozLHNldExpbmVKb2luOjQsc2V0TWl0ZXJMaW1pdDo1LHNldERhc2g6NixzZXRSZW5kZXJpbmdJbnRlbnQ6NyxzZXRGbGF0bmVzczo4LHNldEdTdGF0ZTo5LHNhdmU6MTAscmVzdG9yZToxMSx0cmFuc2Zvcm06MTIsbW92ZVRvOjEzLGxpbmVUbzoxNCxjdXJ2ZVRvOjE1LGN1cnZlVG8yOjE2LGN1cnZlVG8zOjE3LGNsb3NlUGF0aDoxOCxyZWN0YW5nbGU6MTksc3Ryb2tlOjIwLGNsb3NlU3Ryb2tlOjIxLGZpbGw6MjIsZW9GaWxsOjIzLGZpbGxTdHJva2U6MjQsZW9GaWxsU3Ryb2tlOjI1LGNsb3NlRmlsbFN0cm9rZToyNixjbG9zZUVPRmlsbFN0cm9rZToyNyxlbmRQYXRoOjI4LGNsaXA6MjksZW9DbGlwOjMwLGJlZ2luVGV4dDozMSxlbmRUZXh0OjMyLHNldENoYXJTcGFjaW5nOjMzLHNldFdvcmRTcGFjaW5nOjM0LHNldEhTY2FsZTozNSxzZXRMZWFkaW5nOjM2LHNldEZvbnQ6Mzcsc2V0VGV4dFJlbmRlcmluZ01vZGU6Mzgsc2V0VGV4dFJpc2U6MzksbW92ZVRleHQ6NDAsc2V0TGVhZGluZ01vdmVUZXh0OjQxLHNldFRleHRNYXRyaXg6NDIsbmV4dExpbmU6NDMsc2hvd1RleHQ6NDQsc2hvd1NwYWNlZFRleHQ6NDUsbmV4dExpbmVTaG93VGV4dDo0NixuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDo0NyxzZXRDaGFyV2lkdGg6NDgsc2V0Q2hhcldpZHRoQW5kQm91bmRzOjQ5LHNldFN0cm9rZUNvbG9yU3BhY2U6NTAsc2V0RmlsbENvbG9yU3BhY2U6NTEsc2V0U3Ryb2tlQ29sb3I6NTIsc2V0U3Ryb2tlQ29sb3JOOjUzLHNldEZpbGxDb2xvcjo1NCxzZXRGaWxsQ29sb3JOOjU1LHNldFN0cm9rZUdyYXk6NTYsc2V0RmlsbEdyYXk6NTcsc2V0U3Ryb2tlUkdCQ29sb3I6NTgsc2V0RmlsbFJHQkNvbG9yOjU5LHNldFN0cm9rZUNNWUtDb2xvcjo2MCxzZXRGaWxsQ01ZS0NvbG9yOjYxLHNoYWRpbmdGaWxsOjYyLGJlZ2luSW5saW5lSW1hZ2U6NjMsYmVnaW5JbWFnZURhdGE6NjQsZW5kSW5saW5lSW1hZ2U6NjUscGFpbnRYT2JqZWN0OjY2LG1hcmtQb2ludDo2NyxtYXJrUG9pbnRQcm9wczo2OCxiZWdpbk1hcmtlZENvbnRlbnQ6NjksYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6NzAsZW5kTWFya2VkQ29udGVudDo3MSxiZWdpbkNvbXBhdDo3MixlbmRDb21wYXQ6NzMscGFpbnRGb3JtWE9iamVjdEJlZ2luOjc0LHBhaW50Rm9ybVhPYmplY3RFbmQ6NzUsYmVnaW5Hcm91cDo3NixlbmRHcm91cDo3NyxiZWdpbkFubm90YXRpb246ODAsZW5kQW5ub3RhdGlvbjo4MSxwYWludEltYWdlTWFza1hPYmplY3Q6ODMscGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6ODQscGFpbnRJbWFnZVhPYmplY3Q6ODUscGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6ODYscGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDo4NyxwYWludEltYWdlWE9iamVjdFJlcGVhdDo4OCxwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6ODkscGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOjkwLGNvbnN0cnVjdFBhdGg6OTF9O3QuUGFzc3dvcmRSZXNwb25zZXM9e05FRURfUEFTU1dPUkQ6MSxJTkNPUlJFQ1RfUEFTU1dPUkQ6Mn07bGV0IGk9bi5XQVJOSU5HUztmdW5jdGlvbiB3YXJuKGUpe2k+PW4uV0FSTklOR1MmJmNvbnNvbGUubG9nKGBXYXJuaW5nOiAke2V9YCl9ZnVuY3Rpb24gdW5yZWFjaGFibGUoZSl7dGhyb3cgbmV3IEVycm9yKGUpfWZ1bmN0aW9uIHNoYWRvdyhlLHQsYSl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTphLGVudW1lcmFibGU6IXIsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiExfSk7cmV0dXJuIGF9Y29uc3Qgcz1mdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpe2Z1bmN0aW9uIEJhc2VFeGNlcHRpb24oZSx0KXt0aGlzLmNvbnN0cnVjdG9yPT09QmFzZUV4Y2VwdGlvbiYmdW5yZWFjaGFibGUoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uIik7dGhpcy5tZXNzYWdlPWU7dGhpcy5uYW1lPXR9QmFzZUV4Y2VwdGlvbi5wcm90b3R5cGU9bmV3IEVycm9yO0Jhc2VFeGNlcHRpb24uY29uc3RydWN0b3I9QmFzZUV4Y2VwdGlvbjtyZXR1cm4gQmFzZUV4Y2VwdGlvbn0oKTt0LkJhc2VFeGNlcHRpb249czt0LlBhc3N3b3JkRXhjZXB0aW9uPWNsYXNzIFBhc3N3b3JkRXhjZXB0aW9uIGV4dGVuZHMgc3tjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsIlBhc3N3b3JkRXhjZXB0aW9uIik7dGhpcy5jb2RlPXR9fTt0LlVua25vd25FcnJvckV4Y2VwdGlvbj1jbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBze2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSwiVW5rbm93bkVycm9yRXhjZXB0aW9uIik7dGhpcy5kZXRhaWxzPXR9fTt0LkludmFsaWRQREZFeGNlcHRpb249Y2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIHN7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiSW52YWxpZFBERkV4Y2VwdGlvbiIpfX07dC5NaXNzaW5nUERGRXhjZXB0aW9uPWNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBze2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIk1pc3NpbmdQREZFeGNlcHRpb24iKX19O3QuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uPWNsYXNzIFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiBleHRlbmRzIHN7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24iKTt0aGlzLnN0YXR1cz10fX07dC5Gb3JtYXRFcnJvcj1jbGFzcyBGb3JtYXRFcnJvciBleHRlbmRzIHN7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiRm9ybWF0RXJyb3IiKX19O3QuQWJvcnRFeGNlcHRpb249Y2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBze2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIkFib3J0RXhjZXB0aW9uIil9fTtmdW5jdGlvbiBieXRlc1RvU3RyaW5nKGUpeyJvYmplY3QiPT10eXBlb2YgZSYmdm9pZCAwIT09ZT8ubGVuZ3RofHx1bnJlYWNoYWJsZSgiSW52YWxpZCBhcmd1bWVudCBmb3IgYnl0ZXNUb1N0cmluZyIpO2NvbnN0IHQ9ZS5sZW5ndGgsYT04MTkyO2lmKHQ8YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGUpO2NvbnN0IHI9W107Zm9yKGxldCBuPTA7bjx0O24rPWEpe2NvbnN0IGk9TWF0aC5taW4obithLHQpLHM9ZS5zdWJhcnJheShuLGkpO3IucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwscykpfXJldHVybiByLmpvaW4oIiIpfWZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoZSl7InN0cmluZyIhPXR5cGVvZiBlJiZ1bnJlYWNoYWJsZSgiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlcyIpO2NvbnN0IHQ9ZS5sZW5ndGgsYT1uZXcgVWludDhBcnJheSh0KTtmb3IobGV0IHI9MDtyPHQ7KytyKWFbcl09MjU1JmUuY2hhckNvZGVBdChyKTtyZXR1cm4gYX10LkZlYXR1cmVUZXN0PWNsYXNzIEZlYXR1cmVUZXN0e3N0YXRpYyBnZXQgaXNMaXR0bGVFbmRpYW4oKXtyZXR1cm4gc2hhZG93KHRoaXMsImlzTGl0dGxlRW5kaWFuIixmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoNCk7ZVswXT0xO3JldHVybiAxPT09bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyLDAsMSlbMF19KCkpfXN0YXRpYyBnZXQgaXNFdmFsU3VwcG9ydGVkKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJpc0V2YWxTdXBwb3J0ZWQiLGZ1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpe3RyeXtuZXcgRnVuY3Rpb24oIiIpO3JldHVybiEwfWNhdGNoe3JldHVybiExfX0oKSl9c3RhdGljIGdldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpe3JldHVybiBzaGFkb3codGhpcywiaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQiLCJ1bmRlZmluZWQiIT10eXBlb2YgT2Zmc2NyZWVuQ2FudmFzKX1zdGF0aWMgZ2V0IHBsYXRmb3JtKCl7cmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBuYXZpZ2F0b3I/c2hhZG93KHRoaXMsInBsYXRmb3JtIix7aXNXaW46ITEsaXNNYWM6ITF9KTpzaGFkb3codGhpcywicGxhdGZvcm0iLHtpc1dpbjpuYXZpZ2F0b3IucGxhdGZvcm0uaW5jbHVkZXMoIldpbiIpLGlzTWFjOm5hdmlnYXRvci5wbGF0Zm9ybS5pbmNsdWRlcygiTWFjIil9KX19O2NvbnN0IG89Wy4uLkFycmF5KDI1Nikua2V5cygpXS5tYXAoKGU9PmUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkpO3QuVXRpbD1jbGFzcyBVdGlse3N0YXRpYyBtYWtlSGV4Q29sb3IoZSx0LGEpe3JldHVybmAjJHtvW2VdfSR7b1t0XX0ke29bYV19YH1zdGF0aWMgc2NhbGVNaW5NYXgoZSx0KXtsZXQgYTtpZihlWzBdKXtpZihlWzBdPDApe2E9dFswXTt0WzBdPXRbMV07dFsxXT1hfXRbMF0qPWVbMF07dFsxXSo9ZVswXTtpZihlWzNdPDApe2E9dFsyXTt0WzJdPXRbM107dFszXT1hfXRbMl0qPWVbM107dFszXSo9ZVszXX1lbHNle2E9dFswXTt0WzBdPXRbMl07dFsyXT1hO2E9dFsxXTt0WzFdPXRbM107dFszXT1hO2lmKGVbMV08MCl7YT10WzJdO3RbMl09dFszXTt0WzNdPWF9dFsyXSo9ZVsxXTt0WzNdKj1lWzFdO2lmKGVbMl08MCl7YT10WzBdO3RbMF09dFsxXTt0WzFdPWF9dFswXSo9ZVsyXTt0WzFdKj1lWzJdfXRbMF0rPWVbNF07dFsxXSs9ZVs0XTt0WzJdKz1lWzVdO3RbM10rPWVbNV19c3RhdGljIHRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsyXSp0WzFdLGVbMV0qdFswXStlWzNdKnRbMV0sZVswXSp0WzJdK2VbMl0qdFszXSxlWzFdKnRbMl0rZVszXSp0WzNdLGVbMF0qdFs0XStlWzJdKnRbNV0rZVs0XSxlWzFdKnRbNF0rZVszXSp0WzVdK2VbNV1dfXN0YXRpYyBhcHBseVRyYW5zZm9ybShlLHQpe3JldHVybltlWzBdKnRbMF0rZVsxXSp0WzJdK3RbNF0sZVswXSp0WzFdK2VbMV0qdFszXSt0WzVdXX1zdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKGUsdCl7Y29uc3QgYT10WzBdKnRbM10tdFsxXSp0WzJdO3JldHVyblsoZVswXSp0WzNdLWVbMV0qdFsyXSt0WzJdKnRbNV0tdFs0XSp0WzNdKS9hLCgtZVswXSp0WzFdK2VbMV0qdFswXSt0WzRdKnRbMV0tdFs1XSp0WzBdKS9hXX1zdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZSx0KXtjb25zdCBhPXRoaXMuYXBwbHlUcmFuc2Zvcm0oZSx0KSxyPXRoaXMuYXBwbHlUcmFuc2Zvcm0oZS5zbGljZSgyLDQpLHQpLG49dGhpcy5hcHBseVRyYW5zZm9ybShbZVswXSxlWzNdXSx0KSxpPXRoaXMuYXBwbHlUcmFuc2Zvcm0oW2VbMl0sZVsxXV0sdCk7cmV0dXJuW01hdGgubWluKGFbMF0sclswXSxuWzBdLGlbMF0pLE1hdGgubWluKGFbMV0sclsxXSxuWzFdLGlbMV0pLE1hdGgubWF4KGFbMF0sclswXSxuWzBdLGlbMF0pLE1hdGgubWF4KGFbMV0sclsxXSxuWzFdLGlbMV0pXX1zdGF0aWMgaW52ZXJzZVRyYW5zZm9ybShlKXtjb25zdCB0PWVbMF0qZVszXS1lWzFdKmVbMl07cmV0dXJuW2VbM10vdCwtZVsxXS90LC1lWzJdL3QsZVswXS90LChlWzJdKmVbNV0tZVs0XSplWzNdKS90LChlWzRdKmVbMV0tZVs1XSplWzBdKS90XX1zdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUoZSl7Y29uc3QgdD1bZVswXSxlWzJdLGVbMV0sZVszXV0sYT1lWzBdKnRbMF0rZVsxXSp0WzJdLHI9ZVswXSp0WzFdK2VbMV0qdFszXSxuPWVbMl0qdFswXStlWzNdKnRbMl0saT1lWzJdKnRbMV0rZVszXSp0WzNdLHM9KGEraSkvMixvPU1hdGguc3FydCgoYStpKSoqMi00KihhKmktbipyKSkvMixjPXMrb3x8MSxsPXMtb3x8MTtyZXR1cm5bTWF0aC5zcXJ0KGMpLE1hdGguc3FydChsKV19c3RhdGljIG5vcm1hbGl6ZVJlY3QoZSl7Y29uc3QgdD1lLnNsaWNlKDApO2lmKGVbMF0+ZVsyXSl7dFswXT1lWzJdO3RbMl09ZVswXX1pZihlWzFdPmVbM10pe3RbMV09ZVszXTt0WzNdPWVbMV19cmV0dXJuIHR9c3RhdGljIGludGVyc2VjdChlLHQpe2NvbnN0IGE9TWF0aC5tYXgoTWF0aC5taW4oZVswXSxlWzJdKSxNYXRoLm1pbih0WzBdLHRbMl0pKSxyPU1hdGgubWluKE1hdGgubWF4KGVbMF0sZVsyXSksTWF0aC5tYXgodFswXSx0WzJdKSk7aWYoYT5yKXJldHVybiBudWxsO2NvbnN0IG49TWF0aC5tYXgoTWF0aC5taW4oZVsxXSxlWzNdKSxNYXRoLm1pbih0WzFdLHRbM10pKSxpPU1hdGgubWluKE1hdGgubWF4KGVbMV0sZVszXSksTWF0aC5tYXgodFsxXSx0WzNdKSk7cmV0dXJuIG4+aT9udWxsOlthLG4scixpXX1zdGF0aWMgYmV6aWVyQm91bmRpbmdCb3goZSx0LGEscixuLGkscyxvKXtjb25zdCBjPVtdLGw9W1tdLFtdXTtsZXQgaCx1LGQsZixnLHAsbSxiO2ZvcihsZXQgbD0wO2w8MjsrK2wpe2lmKDA9PT1sKXt1PTYqZS0xMiphKzYqbjtoPS0zKmUrOSphLTkqbiszKnM7ZD0zKmEtMyplfWVsc2V7dT02KnQtMTIqcis2Kmk7aD0tMyp0Kzkqci05KmkrMypvO2Q9MypyLTMqdH1pZihNYXRoLmFicyhoKTwxZS0xMil7aWYoTWF0aC5hYnModSk8MWUtMTIpY29udGludWU7Zj0tZC91OzA8ZiYmZjwxJiZjLnB1c2goZil9ZWxzZXttPXUqdS00KmQqaDtiPU1hdGguc3FydChtKTtpZighKG08MCkpe2c9KC11K2IpLygyKmgpOzA8ZyYmZzwxJiZjLnB1c2goZyk7cD0oLXUtYikvKDIqaCk7MDxwJiZwPDEmJmMucHVzaChwKX19fWxldCB5LHc9Yy5sZW5ndGg7Y29uc3QgUz13O2Zvcig7dy0tOyl7Zj1jW3ddO3k9MS1mO2xbMF1bd109eSp5KnkqZSszKnkqeSpmKmErMyp5KmYqZipuK2YqZipmKnM7bFsxXVt3XT15KnkqeSp0KzMqeSp5KmYqciszKnkqZipmKmkrZipmKmYqb31sWzBdW1NdPWU7bFsxXVtTXT10O2xbMF1bUysxXT1zO2xbMV1bUysxXT1vO2xbMF0ubGVuZ3RoPWxbMV0ubGVuZ3RoPVMrMjtyZXR1cm5bTWF0aC5taW4oLi4ubFswXSksTWF0aC5taW4oLi4ubFsxXSksTWF0aC5tYXgoLi4ubFswXSksTWF0aC5tYXgoLi4ubFsxXSldfX07Y29uc3QgYz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzI4LDcxMSw3MTAsNzI5LDczMyw3MzEsNzMwLDczMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MjI2LDgyMjQsODIyNSw4MjMwLDgyMTIsODIxMSw0MDIsODI2MCw4MjQ5LDgyNTAsODcyMiw4MjQwLDgyMjIsODIyMCw4MjIxLDgyMTYsODIxNyw4MjE4LDg0ODIsNjQyNTcsNjQyNTgsMzIxLDMzOCwzNTIsMzc2LDM4MSwzMDUsMzIyLDMzOSwzNTMsMzgyLDAsODM2NF07ZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGUpKX10LlByb21pc2VDYXBhYmlsaXR5PWNsYXNzIFByb21pc2VDYXBhYmlsaXR5eyNlPSExO2NvbnN0cnVjdG9yKCl7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKCgoZSx0KT0+e3RoaXMucmVzb2x2ZT10PT57dGhpcy4jZT0hMDtlKHQpfTt0aGlzLnJlamVjdD1lPT57dGhpcy4jZT0hMDt0KGUpfX0pKX1nZXQgc2V0dGxlZCgpe3JldHVybiB0aGlzLiNlfX07bGV0IGw9bnVsbCxoPW51bGx9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7dmFyIHI9YSg0OCksbj1hKDE0KSxpPWEoNzcpLHM9YSgxNDYpLG89VVJMU2VhcmNoUGFyYW1zLGM9by5wcm90b3R5cGUsbD1uKGMuYXBwZW5kKSxoPW4oYy5kZWxldGUpLHU9bihjLmZvckVhY2gpLGQ9bihbXS5wdXNoKSxmPW5ldyBvKCJhPTEmYT0yIik7Zi5kZWxldGUoImEiLDEpO2YrIiIhPSJhPTIiJiZyKGMsImRlbGV0ZSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgsYT10PDI/dm9pZCAwOmFyZ3VtZW50c1sxXTtpZih0JiZ2b2lkIDA9PT1hKXJldHVybiBoKHRoaXMsZSk7dmFyIHI9W107dSh0aGlzLChmdW5jdGlvbihlLHQpe2Qocix7a2V5OnQsdmFsdWU6ZX0pfSkpO3ModCwxKTtmb3IodmFyIG4sbz1pKGUpLGM9aShhKSxmPTAsZz0wLHA9ITEsbT1yLmxlbmd0aDtmPG07KXtuPXJbZisrXTtpZihwfHxuLmtleT09PW8pe3A9ITA7aCh0aGlzLG4ua2V5KX1lbHNlIGcrK31mb3IoO2c8bTspKG49cltnKytdKS5rZXk9PT1vJiZuLnZhbHVlPT09Y3x8bCh0aGlzLG4ua2V5LG4udmFsdWUpfSkse2VudW1lcmFibGU6ITAsdW5zYWZlOiEwfSl9LGU9Pnt2YXIgdD1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsYSl7aWYoZTxhKXRocm93IHQoIk5vdCBlbm91Z2ggYXJndW1lbnRzIik7cmV0dXJuIGV9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByPWEoNDgpLG49YSgxNCksaT1hKDc3KSxzPWEoMTQ2KSxvPVVSTFNlYXJjaFBhcmFtcyxjPW8ucHJvdG90eXBlLGw9bihjLmdldEFsbCksaD1uKGMuaGFzKTtuZXcgbygiYT0xIikuaGFzKCJhIiwyKSYmcihjLCJoYXMiLChmdW5jdGlvbiBoYXMoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxhPXQ8Mj92b2lkIDA6YXJndW1lbnRzWzFdO2lmKHQmJnZvaWQgMD09PWEpcmV0dXJuIGgodGhpcyxlKTt2YXIgcj1sKHRoaXMsZSk7cyh0LDEpO2Zvcih2YXIgbj1pKGEpLG89MDtvPHIubGVuZ3RoOylpZihyW28rK109PT1uKXJldHVybiEwO3JldHVybiExfSkse2VudW1lcmFibGU6ITAsdW5zYWZlOiEwfSl9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7dmFyIHI9YSg2KSxuPWEoMTQpLGk9YSg4Nykscz1VUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLG89bihzLmZvckVhY2gpO3ImJiEoInNpemUiaW4gcykmJmkocywic2l6ZSIse2dldDpmdW5jdGlvbiBzaXplKCl7dmFyIGU9MDtvKHRoaXMsKGZ1bmN0aW9uKCl7ZSsrfSkpO3JldHVybiBlfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlhSZWZQYXJzZUV4Y2VwdGlvbj10LlhSZWZFbnRyeUV4Y2VwdGlvbj10LlBhcnNlckVPRkV4Y2VwdGlvbj10LlBERl9WRVJTSU9OX1JFR0VYUD10Lk1pc3NpbmdEYXRhRXhjZXB0aW9uPXZvaWQgMDt0LmFycmF5QnVmZmVyc1RvQnl0ZXM9ZnVuY3Rpb24gYXJyYXlCdWZmZXJzVG9CeXRlcyhlKXtjb25zdCB0PWUubGVuZ3RoO2lmKDA9PT10KXJldHVybiBuZXcgVWludDhBcnJheSgwKTtpZigxPT09dClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZVswXSk7bGV0IGE9MDtmb3IobGV0IHI9MDtyPHQ7cisrKWErPWVbcl0uYnl0ZUxlbmd0aDtjb25zdCByPW5ldyBVaW50OEFycmF5KGEpO2xldCBuPTA7Zm9yKGxldCBhPTA7YTx0O2ErKyl7Y29uc3QgdD1uZXcgVWludDhBcnJheShlW2FdKTtyLnNldCh0LG4pO24rPXQuYnl0ZUxlbmd0aH1yZXR1cm4gcn07dC5jb2xsZWN0QWN0aW9ucz1mdW5jdGlvbiBjb2xsZWN0QWN0aW9ucyhlLHQsYSl7Y29uc3QgaT1PYmplY3QuY3JlYXRlKG51bGwpLHM9Z2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7ZGljdDp0LGtleToiQUEiLHN0b3BXaGVuRm91bmQ6ITF9KTtpZihzKWZvcihsZXQgdD1zLmxlbmd0aC0xO3Q+PTA7dC0tKXtjb25zdCByPXNbdF07aWYociBpbnN0YW5jZW9mIG4uRGljdClmb3IoY29uc3QgdCBvZiByLmdldEtleXMoKSl7Y29uc3Qgcz1hW3RdO2lmKCFzKWNvbnRpbnVlO2NvbnN0IG89W107X2NvbGxlY3RKUyhyLmdldFJhdyh0KSxlLG8sbmV3IG4uUmVmU2V0KTtvLmxlbmd0aD4wJiYoaVtzXT1vKX19aWYodC5oYXMoIkEiKSl7Y29uc3QgYT1bXTtfY29sbGVjdEpTKHQuZ2V0KCJBIiksZSxhLG5ldyBuLlJlZlNldCk7YS5sZW5ndGg+MCYmKGkuQWN0aW9uPWEpfXJldHVybigwLHIub2JqZWN0U2l6ZSkoaSk+MD9pOm51bGx9O3QuZW5jb2RlVG9YbWxTdHJpbmc9ZnVuY3Rpb24gZW5jb2RlVG9YbWxTdHJpbmcoZSl7Y29uc3QgdD1bXTtsZXQgYT0wO2ZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7Y29uc3Qgbj1lLmNvZGVQb2ludEF0KHIpO2lmKDMyPD1uJiZuPD0xMjYpe2NvbnN0IGk9b1tuXTtpZihpKXthPHImJnQucHVzaChlLnN1YnN0cmluZyhhLHIpKTt0LnB1c2goaSk7YT1yKzF9fWVsc2V7YTxyJiZ0LnB1c2goZS5zdWJzdHJpbmcoYSxyKSk7dC5wdXNoKGAmI3gke24udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9O2ApO24+NTUyOTUmJihuPDU3MzQ0fHxuPjY1NTMzKSYmcisrO2E9cisxfX1pZigwPT09dC5sZW5ndGgpcmV0dXJuIGU7YTxlLmxlbmd0aCYmdC5wdXNoKGUuc3Vic3RyaW5nKGEsZS5sZW5ndGgpKTtyZXR1cm4gdC5qb2luKCIiKX07dC5lc2NhcGVQREZOYW1lPWZ1bmN0aW9uIGVzY2FwZVBERk5hbWUoZSl7Y29uc3QgdD1bXTtsZXQgYT0wO2ZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7Y29uc3Qgbj1lLmNoYXJDb2RlQXQocik7aWYobjwzM3x8bj4xMjZ8fDM1PT09bnx8NDA9PT1ufHw0MT09PW58fDYwPT09bnx8NjI9PT1ufHw5MT09PW58fDkzPT09bnx8MTIzPT09bnx8MTI1PT09bnx8NDc9PT1ufHwzNz09PW4pe2E8ciYmdC5wdXNoKGUuc3Vic3RyaW5nKGEscikpO3QucHVzaChgIyR7bi50b1N0cmluZygxNil9YCk7YT1yKzF9fWlmKDA9PT10Lmxlbmd0aClyZXR1cm4gZTthPGUubGVuZ3RoJiZ0LnB1c2goZS5zdWJzdHJpbmcoYSxlLmxlbmd0aCkpO3JldHVybiB0LmpvaW4oIiIpfTt0LmVzY2FwZVN0cmluZz1mdW5jdGlvbiBlc2NhcGVTdHJpbmcoZSl7cmV0dXJuIGUucmVwbGFjZUFsbCgvKFsoKVxcXG5ccl0pL2csKGU9PiJcbiI9PT1lPyJcXG4iOiJcciI9PT1lPyJcXHIiOmBcXCR7ZX1gKSl9O3QuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eT1nZXRJbmhlcml0YWJsZVByb3BlcnR5O3QuZ2V0TG9va3VwVGFibGVGYWN0b3J5PWZ1bmN0aW9uIGdldExvb2t1cFRhYmxlRmFjdG9yeShlKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24oKXtpZihlKXt0PU9iamVjdC5jcmVhdGUobnVsbCk7ZSh0KTtlPW51bGx9cmV0dXJuIHR9fTt0LmdldE5ld0Fubm90YXRpb25zTWFwPWZ1bmN0aW9uIGdldE5ld0Fubm90YXRpb25zTWFwKGUpe2lmKCFlKXJldHVybiBudWxsO2NvbnN0IHQ9bmV3IE1hcDtmb3IoY29uc3RbYSxuXW9mIGUpe2lmKCFhLnN0YXJ0c1dpdGgoci5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4KSljb250aW51ZTtsZXQgZT10LmdldChuLnBhZ2VJbmRleCk7aWYoIWUpe2U9W107dC5zZXQobi5wYWdlSW5kZXgsZSl9ZS5wdXNoKG4pfXJldHVybiB0LnNpemU+MD90Om51bGx9O3QuZ2V0Um90YXRpb25NYXRyaXg9ZnVuY3Rpb24gZ2V0Um90YXRpb25NYXRyaXgoZSx0LGEpe3N3aXRjaChlKXtjYXNlIDkwOnJldHVyblswLDEsLTEsMCx0LDBdO2Nhc2UgMTgwOnJldHVyblstMSwwLDAsLTEsdCxhXTtjYXNlIDI3MDpyZXR1cm5bMCwtMSwxLDAsMCxhXTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCByb3RhdGlvbiIpfX07dC5pc0FzY2lpPWZ1bmN0aW9uIGlzQXNjaWkoZSl7cmV0dXJuL15bXHgwMC1ceDdGXSokLy50ZXN0KGUpfTt0LmlzV2hpdGVTcGFjZT1mdW5jdGlvbiBpc1doaXRlU3BhY2UoZSl7cmV0dXJuIDMyPT09ZXx8OT09PWV8fDEzPT09ZXx8MTA9PT1lfTt0LmxvZzI9ZnVuY3Rpb24gbG9nMihlKXtpZihlPD0wKXJldHVybiAwO3JldHVybiBNYXRoLmNlaWwoTWF0aC5sb2cyKGUpKX07dC5udW1iZXJUb1N0cmluZz1mdW5jdGlvbiBudW1iZXJUb1N0cmluZyhlKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGUpKXJldHVybiBlLnRvU3RyaW5nKCk7Y29uc3QgdD1NYXRoLnJvdW5kKDEwMCplKTtpZih0JTEwMD09MClyZXR1cm4odC8xMDApLnRvU3RyaW5nKCk7aWYodCUxMD09MClyZXR1cm4gZS50b0ZpeGVkKDEpO3JldHVybiBlLnRvRml4ZWQoMil9O3QucGFyc2VYRkFQYXRoPWZ1bmN0aW9uIHBhcnNlWEZBUGF0aChlKXtjb25zdCB0PS8oLispXFsoXGQrKVxdJC87cmV0dXJuIGUuc3BsaXQoIi4iKS5tYXAoKGU9Pntjb25zdCBhPWUubWF0Y2godCk7cmV0dXJuIGE/e25hbWU6YVsxXSxwb3M6cGFyc2VJbnQoYVsyXSwxMCl9OntuYW1lOmUscG9zOjB9fSkpfTt0LnJlYWRJbnQ4PWZ1bmN0aW9uIHJlYWRJbnQ4KGUsdCl7cmV0dXJuIGVbdF08PDI0Pj4yNH07dC5yZWFkVWludDE2PWZ1bmN0aW9uIHJlYWRVaW50MTYoZSx0KXtyZXR1cm4gZVt0XTw8OHxlW3QrMV19O3QucmVhZFVpbnQzMj1mdW5jdGlvbiByZWFkVWludDMyKGUsdCl7cmV0dXJuKGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXSk+Pj4wfTt0LnJlY292ZXJKc1VSTD1mdW5jdGlvbiByZWNvdmVySnNVUkwoZSl7Y29uc3QgdD1uZXcgUmVnRXhwKCJeXFxzKigiK1siYXBwLmxhdW5jaFVSTCIsIndpbmRvdy5vcGVuIiwieGZhLmhvc3QuZ290b1VSTCJdLmpvaW4oInwiKS5yZXBsYWNlQWxsKCIuIiwiXFwuIikrIilcXCgoPzonfFwiKShbXidcIl0qKSg/Oid8XCIpKD86LFxccyooXFx3KylcXCl8XFwpKSIsImkiKS5leGVjKGUpO2lmKHQ/LlsyXSl7Y29uc3QgZT10WzJdO2xldCBhPSExOyJ0cnVlIj09PXRbM10mJiJhcHAubGF1bmNoVVJMIj09PXRbMV0mJihhPSEwKTtyZXR1cm57dXJsOmUsbmV3V2luZG93OmF9fXJldHVybiBudWxsfTt0LnN0cmluZ1RvVVRGMTZIZXhTdHJpbmc9ZnVuY3Rpb24gc3RyaW5nVG9VVEYxNkhleFN0cmluZyhlKXtjb25zdCB0PVtdO2ZvcihsZXQgYT0wLHI9ZS5sZW5ndGg7YTxyO2ErKyl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQoYSk7dC5wdXNoKChyPj44JjI1NSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSwoMjU1JnIpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpfXJldHVybiB0LmpvaW4oIiIpfTt0LnN0cmluZ1RvVVRGMTZTdHJpbmc9ZnVuY3Rpb24gc3RyaW5nVG9VVEYxNlN0cmluZyhlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2NvbnN0IGE9W107dCYmYS5wdXNoKCLDvsO/Iik7Zm9yKGxldCB0PTAscj1lLmxlbmd0aDt0PHI7dCsrKXtjb25zdCByPWUuY2hhckNvZGVBdCh0KTthLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShyPj44JjI1NSksU3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmcikpfXJldHVybiBhLmpvaW4oIiIpfTt0LnRvUm9tYW5OdW1lcmFscz1mdW5jdGlvbiB0b1JvbWFuTnVtZXJhbHMoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTsoMCxyLmFzc2VydCkoTnVtYmVyLmlzSW50ZWdlcihlKSYmZT4wLCJUaGUgbnVtYmVyIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIuIik7Y29uc3QgYT1bXTtsZXQgbjtmb3IoO2U+PTFlMzspe2UtPTFlMzthLnB1c2goIk0iKX1uPWUvMTAwfDA7ZSU9MTAwO2EucHVzaChzW25dKTtuPWUvMTB8MDtlJT0xMDthLnB1c2goc1sxMCtuXSk7YS5wdXNoKHNbMjArZV0pO2NvbnN0IGk9YS5qb2luKCIiKTtyZXR1cm4gdD9pLnRvTG93ZXJDYXNlKCk6aX07dC52YWxpZGF0ZUNTU0ZvbnQ9ZnVuY3Rpb24gdmFsaWRhdGVDU1NGb250KGUpe2NvbnN0IHQ9bmV3IFNldChbIjEwMCIsIjIwMCIsIjMwMCIsIjQwMCIsIjUwMCIsIjYwMCIsIjcwMCIsIjgwMCIsIjkwMCIsIjEwMDAiLCJub3JtYWwiLCJib2xkIiwiYm9sZGVyIiwibGlnaHRlciJdKSx7Zm9udEZhbWlseTphLGZvbnRXZWlnaHQ6cixpdGFsaWNBbmdsZTpufT1lO2lmKCF2YWxpZGF0ZUZvbnROYW1lKGEsITApKXJldHVybiExO2NvbnN0IGk9cj9yLnRvU3RyaW5nKCk6IiI7ZS5mb250V2VpZ2h0PXQuaGFzKGkpP2k6IjQwMCI7Y29uc3Qgcz1wYXJzZUZsb2F0KG4pO2UuaXRhbGljQW5nbGU9aXNOYU4ocyl8fHM8LTkwfHxzPjkwPyIxNCI6bi50b1N0cmluZygpO3JldHVybiEwfTt0LnZhbGlkYXRlRm9udE5hbWU9dmFsaWRhdGVGb250TmFtZTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgxMzkpO2EoMTE2KTthKDEyNik7YSgxMjgpO2EoMTMxKTthKDEzMyk7YSgxMzUpO2EoMTM3KTthKDIpO3ZhciByPWEoMTQ0KSxuPWEoMTUwKSxpPWEoMTUxKTt0LlBERl9WRVJTSU9OX1JFR0VYUD0vXlsxLTldXC5cZCQvO2NsYXNzIE1pc3NpbmdEYXRhRXhjZXB0aW9uIGV4dGVuZHMgci5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoYE1pc3NpbmcgZGF0YSBbJHtlfSwgJHt0fSlgLCJNaXNzaW5nRGF0YUV4Y2VwdGlvbiIpO3RoaXMuYmVnaW49ZTt0aGlzLmVuZD10fX10Lk1pc3NpbmdEYXRhRXhjZXB0aW9uPU1pc3NpbmdEYXRhRXhjZXB0aW9uO2NsYXNzIFBhcnNlckVPRkV4Y2VwdGlvbiBleHRlbmRzIHIuQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJQYXJzZXJFT0ZFeGNlcHRpb24iKX19dC5QYXJzZXJFT0ZFeGNlcHRpb249UGFyc2VyRU9GRXhjZXB0aW9uO2NsYXNzIFhSZWZFbnRyeUV4Y2VwdGlvbiBleHRlbmRzIHIuQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJYUmVmRW50cnlFeGNlcHRpb24iKX19dC5YUmVmRW50cnlFeGNlcHRpb249WFJlZkVudHJ5RXhjZXB0aW9uO2NsYXNzIFhSZWZQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIHIuQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJYUmVmUGFyc2VFeGNlcHRpb24iKX19dC5YUmVmUGFyc2VFeGNlcHRpb249WFJlZlBhcnNlRXhjZXB0aW9uO2Z1bmN0aW9uIGdldEluaGVyaXRhYmxlUHJvcGVydHkoZSl7bGV0IHQse2RpY3Q6YSxrZXk6cixnZXRBcnJheTppPSExLHN0b3BXaGVuRm91bmQ6cz0hMH09ZTtjb25zdCBvPW5ldyBuLlJlZlNldDtmb3IoO2EgaW5zdGFuY2VvZiBuLkRpY3QmJighYS5vYmpJZHx8IW8uaGFzKGEub2JqSWQpKTspe2Eub2JqSWQmJm8ucHV0KGEub2JqSWQpO2NvbnN0IGU9aT9hLmdldEFycmF5KHIpOmEuZ2V0KHIpO2lmKHZvaWQgMCE9PWUpe2lmKHMpcmV0dXJuIGU7KHR8fD1bXSkucHVzaChlKX1hPWEuZ2V0KCJQYXJlbnQiKX1yZXR1cm4gdH1jb25zdCBzPVsiIiwiQyIsIkNDIiwiQ0NDIiwiQ0QiLCJEIiwiREMiLCJEQ0MiLCJEQ0NDIiwiQ00iLCIiLCJYIiwiWFgiLCJYWFgiLCJYTCIsIkwiLCJMWCIsIkxYWCIsIkxYWFgiLCJYQyIsIiIsIkkiLCJJSSIsIklJSSIsIklWIiwiViIsIlZJIiwiVklJIiwiVklJSSIsIklYIl07ZnVuY3Rpb24gX2NvbGxlY3RKUyhlLHQsYSxzKXtpZighZSlyZXR1cm47bGV0IG89bnVsbDtpZihlIGluc3RhbmNlb2Ygbi5SZWYpe2lmKHMuaGFzKGUpKXJldHVybjtvPWU7cy5wdXQobyk7ZT10LmZldGNoKGUpfWlmKEFycmF5LmlzQXJyYXkoZSkpZm9yKGNvbnN0IHIgb2YgZSlfY29sbGVjdEpTKHIsdCxhLHMpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIG4uRGljdCl7aWYoKDAsbi5pc05hbWUpKGUuZ2V0KCJTIiksIkphdmFTY3JpcHQiKSl7Y29uc3QgdD1lLmdldCgiSlMiKTtsZXQgbjt0IGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtP249dC5nZXRTdHJpbmcoKToic3RyaW5nIj09dHlwZW9mIHQmJihuPXQpO24mJj0oMCxyLnN0cmluZ1RvUERGU3RyaW5nKShuKS5yZXBsYWNlQWxsKCJcMCIsIiIpO24mJmEucHVzaChuKX1fY29sbGVjdEpTKGUuZ2V0UmF3KCJOZXh0IiksdCxhLHMpfW8mJnMucmVtb3ZlKG8pfWNvbnN0IG89ezYwOiImbHQ7Iiw2MjoiJmd0OyIsMzg6IiZhbXA7IiwzNDoiJnF1b3Q7IiwzOToiJmFwb3M7In07ZnVuY3Rpb24gdmFsaWRhdGVGb250TmFtZShlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2NvbnN0IGE9L14oInwnKS4qKCJ8JykkLy5leGVjKGUpO2lmKGEmJmFbMV09PT1hWzJdKXtpZihuZXcgUmVnRXhwKGBbXlxcXFxdJHthWzFdfWApLnRlc3QoZS5zbGljZSgxLC0xKSkpe3QmJigwLHIud2FybikoYEZvbnRGYW1pbHkgY29udGFpbnMgdW5lc2NhcGVkICR7YVsxXX06ICR7ZX0uYCk7cmV0dXJuITF9fWVsc2UgZm9yKGNvbnN0IGEgb2YgZS5zcGxpdCgvWyBcdF0rLykpaWYoL14oXGR8KC0oXGR8LSkpKS8udGVzdChhKXx8IS9eW1x3LVxcXSskLy50ZXN0KGEpKXt0JiYoMCxyLndhcm4pKGBGb250RmFtaWx5IGNvbnRhaW5zIGludmFsaWQgPGN1c3RvbS1pZGVudD46ICR7ZX0uYCk7cmV0dXJuITF9cmV0dXJuITB9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlJlZlNldENhY2hlPXQuUmVmU2V0PXQuUmVmPXQuTmFtZT10LkVPRj10LkRpY3Q9dC5DbWQ9dC5DSVJDVUxBUl9SRUY9dm9pZCAwO3QuY2xlYXJQcmltaXRpdmVDYWNoZXM9ZnVuY3Rpb24gY2xlYXJQcmltaXRpdmVDYWNoZXMoKXtzPU9iamVjdC5jcmVhdGUobnVsbCk7bz1PYmplY3QuY3JlYXRlKG51bGwpO2M9T2JqZWN0LmNyZWF0ZShudWxsKX07dC5pc0NtZD1mdW5jdGlvbiBpc0NtZChlLHQpe3JldHVybiBlIGluc3RhbmNlb2YgQ21kJiYodm9pZCAwPT09dHx8ZS5jbWQ9PT10KX07dC5pc0RpY3Q9ZnVuY3Rpb24gaXNEaWN0KGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBEaWN0JiYodm9pZCAwPT09dHx8aXNOYW1lKGUuZ2V0KCJUeXBlIiksdCkpfTt0LmlzTmFtZT1pc05hbWU7dC5pc1JlZnNFcXVhbD1mdW5jdGlvbiBpc1JlZnNFcXVhbChlLHQpe3JldHVybiBlLm51bT09PXQubnVtJiZlLmdlbj09PXQuZ2VufTthKDEzOSk7YSgxMTYpO2EoMTI2KTthKDEyOCk7YSgxMzEpO2EoMTMzKTthKDEzNSk7YSgxMzcpO3ZhciByPWEoMTQ0KTtjb25zdCBuPVN5bWJvbCgiQ0lSQ1VMQVJfUkVGIik7dC5DSVJDVUxBUl9SRUY9bjtjb25zdCBpPVN5bWJvbCgiRU9GIik7dC5FT0Y9aTtsZXQgcz1PYmplY3QuY3JlYXRlKG51bGwpLG89T2JqZWN0LmNyZWF0ZShudWxsKSxjPU9iamVjdC5jcmVhdGUobnVsbCk7Y2xhc3MgTmFtZXtjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9ZX1zdGF0aWMgZ2V0KGUpe3JldHVybiBvW2VdfHw9bmV3IE5hbWUoZSl9fXQuTmFtZT1OYW1lO2NsYXNzIENtZHtjb25zdHJ1Y3RvcihlKXt0aGlzLmNtZD1lfXN0YXRpYyBnZXQoZSl7cmV0dXJuIHNbZV18fD1uZXcgQ21kKGUpfX10LkNtZD1DbWQ7Y29uc3QgbD1mdW5jdGlvbiBub25TZXJpYWxpemFibGVDbG9zdXJlKCl7cmV0dXJuIGx9O2NsYXNzIERpY3R7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDt0aGlzLl9tYXA9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLnhyZWY9ZTt0aGlzLm9iaklkPW51bGw7dGhpcy5zdXBwcmVzc0VuY3J5cHRpb249ITE7dGhpcy5fX25vblNlcmlhbGl6YWJsZV9fPWx9YXNzaWduWHJlZihlKXt0aGlzLnhyZWY9ZX1nZXQgc2l6ZSgpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApLmxlbmd0aH1nZXQoZSx0LGEpe2xldCByPXRoaXMuX21hcFtlXTtpZih2b2lkIDA9PT1yJiZ2b2lkIDAhPT10KXtyPXRoaXMuX21hcFt0XTt2b2lkIDA9PT1yJiZ2b2lkIDAhPT1hJiYocj10aGlzLl9tYXBbYV0pfXJldHVybiByIGluc3RhbmNlb2YgUmVmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoKHIsdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOnJ9YXN5bmMgZ2V0QXN5bmMoZSx0LGEpe2xldCByPXRoaXMuX21hcFtlXTtpZih2b2lkIDA9PT1yJiZ2b2lkIDAhPT10KXtyPXRoaXMuX21hcFt0XTt2b2lkIDA9PT1yJiZ2b2lkIDAhPT1hJiYocj10aGlzLl9tYXBbYV0pfXJldHVybiByIGluc3RhbmNlb2YgUmVmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoQXN5bmMocix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik6cn1nZXRBcnJheShlLHQsYSl7bGV0IHI9dGhpcy5fbWFwW2VdO2lmKHZvaWQgMD09PXImJnZvaWQgMCE9PXQpe3I9dGhpcy5fbWFwW3RdO3ZvaWQgMD09PXImJnZvaWQgMCE9PWEmJihyPXRoaXMuX21hcFthXSl9ciBpbnN0YW5jZW9mIFJlZiYmdGhpcy54cmVmJiYocj10aGlzLnhyZWYuZmV0Y2gocix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbikpO2lmKEFycmF5LmlzQXJyYXkocikpe3I9ci5zbGljZSgpO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKylyW2VdaW5zdGFuY2VvZiBSZWYmJnRoaXMueHJlZiYmKHJbZV09dGhpcy54cmVmLmZldGNoKHJbZV0sdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pKX1yZXR1cm4gcn1nZXRSYXcoZSl7cmV0dXJuIHRoaXMuX21hcFtlXX1nZXRLZXlzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21hcCl9Z2V0UmF3VmFsdWVzKCl7cmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fbWFwKX1zZXQoZSx0KXt0aGlzLl9tYXBbZV09dH1oYXMoZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX21hcFtlXX1mb3JFYWNoKGUpe2Zvcihjb25zdCB0IGluIHRoaXMuX21hcCllKHQsdGhpcy5nZXQodCkpfXN0YXRpYyBnZXQgZW1wdHkoKXtjb25zdCBlPW5ldyBEaWN0KG51bGwpO2Uuc2V0PShlLHQpPT57KDAsci51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBgc2V0YCBvbiB0aGUgZW1wdHkgZGljdGlvbmFyeS4iKX07cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsImVtcHR5IixlKX1zdGF0aWMgbWVyZ2UoZSl7bGV0e3hyZWY6dCxkaWN0QXJyYXk6YSxtZXJnZVN1YkRpY3RzOnI9ITF9PWU7Y29uc3Qgbj1uZXcgRGljdCh0KSxpPW5ldyBNYXA7Zm9yKGNvbnN0IGUgb2YgYSlpZihlIGluc3RhbmNlb2YgRGljdClmb3IoY29uc3RbdCxhXW9mIE9iamVjdC5lbnRyaWVzKGUuX21hcCkpe2xldCBlPWkuZ2V0KHQpO2lmKHZvaWQgMD09PWUpe2U9W107aS5zZXQodCxlKX1lbHNlIGlmKCEociYmYSBpbnN0YW5jZW9mIERpY3QpKWNvbnRpbnVlO2UucHVzaChhKX1mb3IoY29uc3RbZSxhXW9mIGkpe2lmKDE9PT1hLmxlbmd0aHx8IShhWzBdaW5zdGFuY2VvZiBEaWN0KSl7bi5fbWFwW2VdPWFbMF07Y29udGludWV9Y29uc3Qgcj1uZXcgRGljdCh0KTtmb3IoY29uc3QgZSBvZiBhKWZvcihjb25zdFt0LGFdb2YgT2JqZWN0LmVudHJpZXMoZS5fbWFwKSl2b2lkIDA9PT1yLl9tYXBbdF0mJihyLl9tYXBbdF09YSk7ci5zaXplPjAmJihuLl9tYXBbZV09cil9aS5jbGVhcigpO3JldHVybiBuLnNpemU+MD9uOkRpY3QuZW1wdHl9fXQuRGljdD1EaWN0O2NsYXNzIFJlZntjb25zdHJ1Y3RvcihlLHQpe3RoaXMubnVtPWU7dGhpcy5nZW49dH10b1N0cmluZygpe3JldHVybiAwPT09dGhpcy5nZW4/YCR7dGhpcy5udW19UmA6YCR7dGhpcy5udW19UiR7dGhpcy5nZW59YH1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PWNbZV07aWYodClyZXR1cm4gdDtjb25zdCBhPS9eKFxkKylSKFxkKikkLy5leGVjKGUpO3JldHVybiBhJiYiMCIhPT1hWzFdP2NbZV09bmV3IFJlZihwYXJzZUludChhWzFdKSxhWzJdP3BhcnNlSW50KGFbMl0pOjApOm51bGx9c3RhdGljIGdldChlLHQpe2NvbnN0IGE9MD09PXQ/YCR7ZX1SYDpgJHtlfVIke3R9YDtyZXR1cm4gY1thXXx8PW5ldyBSZWYoZSx0KX19dC5SZWY9UmVmO2NsYXNzIFJlZlNldHtjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3RoaXMuX3NldD1uZXcgU2V0KGU/Ll9zZXQpfWhhcyhlKXtyZXR1cm4gdGhpcy5fc2V0LmhhcyhlLnRvU3RyaW5nKCkpfXB1dChlKXt0aGlzLl9zZXQuYWRkKGUudG9TdHJpbmcoKSl9cmVtb3ZlKGUpe3RoaXMuX3NldC5kZWxldGUoZS50b1N0cmluZygpKX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLl9zZXQudmFsdWVzKCl9Y2xlYXIoKXt0aGlzLl9zZXQuY2xlYXIoKX19dC5SZWZTZXQ9UmVmU2V0O2NsYXNzIFJlZlNldENhY2hle2NvbnN0cnVjdG9yKCl7dGhpcy5fbWFwPW5ldyBNYXB9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fbWFwLnNpemV9Z2V0KGUpe3JldHVybiB0aGlzLl9tYXAuZ2V0KGUudG9TdHJpbmcoKSl9aGFzKGUpe3JldHVybiB0aGlzLl9tYXAuaGFzKGUudG9TdHJpbmcoKSl9cHV0KGUsdCl7dGhpcy5fbWFwLnNldChlLnRvU3RyaW5nKCksdCl9cHV0QWxpYXMoZSx0KXt0aGlzLl9tYXAuc2V0KGUudG9TdHJpbmcoKSx0aGlzLmdldCh0KSl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5fbWFwLnZhbHVlcygpfWNsZWFyKCl7dGhpcy5fbWFwLmNsZWFyKCl9fXQuUmVmU2V0Q2FjaGU9UmVmU2V0Q2FjaGU7ZnVuY3Rpb24gaXNOYW1lKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOYW1lJiYodm9pZCAwPT09dHx8ZS5uYW1lPT09dCl9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkJhc2VTdHJlYW09dm9pZCAwO3ZhciByPWEoMTQ0KTtjbGFzcyBCYXNlU3RyZWFte2NvbnN0cnVjdG9yKCl7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VTdHJlYW0mJigwLHIudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU3RyZWFtLiIpfWdldCBsZW5ndGgoKXsoMCxyLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgZ2V0dGVyIGBsZW5ndGhgIGFjY2Vzc2VkIil9Z2V0IGlzRW1wdHkoKXsoMCxyLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgZ2V0dGVyIGBpc0VtcHR5YCBhY2Nlc3NlZCIpfWdldCBpc0RhdGFMb2FkZWQoKXtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiaXNEYXRhTG9hZGVkIiwhMCl9Z2V0Qnl0ZSgpeygwLHIudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVgIGNhbGxlZCIpfWdldEJ5dGVzKGUpeygwLHIudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVzYCBjYWxsZWQiKX1wZWVrQnl0ZSgpe2NvbnN0IGU9dGhpcy5nZXRCeXRlKCk7LTEhPT1lJiZ0aGlzLnBvcy0tO3JldHVybiBlfXBlZWtCeXRlcyhlKXtjb25zdCB0PXRoaXMuZ2V0Qnl0ZXMoZSk7dGhpcy5wb3MtPXQubGVuZ3RoO3JldHVybiB0fWdldFVpbnQxNigpe2NvbnN0IGU9dGhpcy5nZXRCeXRlKCksdD10aGlzLmdldEJ5dGUoKTtyZXR1cm4tMT09PWV8fC0xPT09dD8tMTooZTw8OCkrdH1nZXRJbnQzMigpe3JldHVybih0aGlzLmdldEJ5dGUoKTw8MjQpKyh0aGlzLmdldEJ5dGUoKTw8MTYpKyh0aGlzLmdldEJ5dGUoKTw8OCkrdGhpcy5nZXRCeXRlKCl9Z2V0Qnl0ZVJhbmdlKGUsdCl7KDAsci51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZVJhbmdlYCBjYWxsZWQiKX1nZXRTdHJpbmcoZSl7cmV0dXJuKDAsci5ieXRlc1RvU3RyaW5nKSh0aGlzLmdldEJ5dGVzKGUpKX1za2lwKGUpe3RoaXMucG9zKz1lfHwxfXJlc2V0KCl7KDAsci51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVzZXRgIGNhbGxlZCIpfW1vdmVTdGFydCgpeygwLHIudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYG1vdmVTdGFydGAgY2FsbGVkIil9bWFrZVN1YlN0cmVhbShlLHQpeygwLHIudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYG1ha2VTdWJTdHJlYW1gIGNhbGxlZCIpfWdldEJhc2VTdHJlYW1zKCl7cmV0dXJuIG51bGx9fXQuQmFzZVN0cmVhbT1CYXNlU3RyZWFtfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0Lk5ldHdvcmtQZGZNYW5hZ2VyPXQuTG9jYWxQZGZNYW5hZ2VyPXZvaWQgMDt2YXIgcj1hKDE0NCksbj1hKDE1MyksaT1hKDE0OSkscz1hKDE1NSksbz1hKDE1NCk7Y2xhc3MgQmFzZVBkZk1hbmFnZXJ7Y29uc3RydWN0b3IoZSl7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VQZGZNYW5hZ2VyJiYoMCxyLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZVBkZk1hbmFnZXIuIik7dGhpcy5fZG9jQmFzZVVybD1mdW5jdGlvbiBwYXJzZURvY0Jhc2VVcmwoZSl7aWYoZSl7Y29uc3QgdD0oMCxyLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKGUpO2lmKHQpcmV0dXJuIHQuaHJlZjsoMCxyLndhcm4pKGBJbnZhbGlkIGFic29sdXRlIGRvY0Jhc2VVcmw6ICIke2V9Ii5gKX1yZXR1cm4gbnVsbH0oZS5kb2NCYXNlVXJsKTt0aGlzLl9kb2NJZD1lLmRvY0lkO3RoaXMuX3Bhc3N3b3JkPWUucGFzc3dvcmQ7dGhpcy5lbmFibGVYZmE9ZS5lbmFibGVYZmE7ZS5ldmFsdWF0b3JPcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkJiY9ci5GZWF0dXJlVGVzdC5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDt0aGlzLmV2YWx1YXRvck9wdGlvbnM9ZS5ldmFsdWF0b3JPcHRpb25zfWdldCBkb2NJZCgpe3JldHVybiB0aGlzLl9kb2NJZH1nZXQgcGFzc3dvcmQoKXtyZXR1cm4gdGhpcy5fcGFzc3dvcmR9Z2V0IGRvY0Jhc2VVcmwoKXtjb25zdCBlPXRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZztyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiZG9jQmFzZVVybCIsZS5iYXNlVXJsfHx0aGlzLl9kb2NCYXNlVXJsKX1lbnN1cmVEb2MoZSx0KXtyZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudCxlLHQpfWVuc3VyZVhSZWYoZSx0KXtyZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudC54cmVmLGUsdCl9ZW5zdXJlQ2F0YWxvZyhlLHQpe3JldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LmNhdGFsb2csZSx0KX1nZXRQYWdlKGUpe3JldHVybiB0aGlzLnBkZkRvY3VtZW50LmdldFBhZ2UoZSl9Zm9udEZhbGxiYWNrKGUsdCl7cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZm9udEZhbGxiYWNrKGUsdCl9bG9hZFhmYUZvbnRzKGUsdCl7cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQubG9hZFhmYUZvbnRzKGUsdCl9bG9hZFhmYUltYWdlcygpe3JldHVybiB0aGlzLnBkZkRvY3VtZW50LmxvYWRYZmFJbWFnZXMoKX1zZXJpYWxpemVYZmFEYXRhKGUpe3JldHVybiB0aGlzLnBkZkRvY3VtZW50LnNlcmlhbGl6ZVhmYURhdGEoZSl9Y2xlYW51cCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuY2xlYW51cChlKX1hc3luYyBlbnN1cmUoZSx0LGEpeygwLHIudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGVuc3VyZWAgY2FsbGVkIil9cmVxdWVzdFJhbmdlKGUsdCl7KDAsci51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdFJhbmdlYCBjYWxsZWQiKX1yZXF1ZXN0TG9hZGVkU3RyZWFtKCl7KDAsci51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdExvYWRlZFN0cmVhbWAgY2FsbGVkIil9c2VuZFByb2dyZXNzaXZlRGF0YShlKXsoMCxyLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBzZW5kUHJvZ3Jlc3NpdmVEYXRhYCBjYWxsZWQiKX11cGRhdGVQYXNzd29yZChlKXt0aGlzLl9wYXNzd29yZD1lfXRlcm1pbmF0ZShlKXsoMCxyLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGB0ZXJtaW5hdGVgIGNhbGxlZCIpfX10LkxvY2FsUGRmTWFuYWdlcj1jbGFzcyBMb2NhbFBkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PW5ldyBvLlN0cmVhbShlLnNvdXJjZSk7dGhpcy5wZGZEb2N1bWVudD1uZXcgcy5QREZEb2N1bWVudCh0aGlzLHQpO3RoaXMuX2xvYWRlZFN0cmVhbVByb21pc2U9UHJvbWlzZS5yZXNvbHZlKHQpfWFzeW5jIGVuc3VyZShlLHQsYSl7Y29uc3Qgcj1lW3RdO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkoZSxhKTpyfXJlcXVlc3RSYW5nZShlLHQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKX1yZXF1ZXN0TG9hZGVkU3RyZWFtKCl7cmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2V9dGVybWluYXRlKGUpe319O3QuTmV0d29ya1BkZk1hbmFnZXI9Y2xhc3MgTmV0d29ya1BkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLnN0cmVhbU1hbmFnZXI9bmV3IG4uQ2h1bmtlZFN0cmVhbU1hbmFnZXIoZS5zb3VyY2Use21zZ0hhbmRsZXI6ZS5oYW5kbGVyLGxlbmd0aDplLmxlbmd0aCxkaXNhYmxlQXV0b0ZldGNoOmUuZGlzYWJsZUF1dG9GZXRjaCxyYW5nZUNodW5rU2l6ZTplLnJhbmdlQ2h1bmtTaXplfSk7dGhpcy5wZGZEb2N1bWVudD1uZXcgcy5QREZEb2N1bWVudCh0aGlzLHRoaXMuc3RyZWFtTWFuYWdlci5nZXRTdHJlYW0oKSl9YXN5bmMgZW5zdXJlKGUsdCxhKXt0cnl7Y29uc3Qgcj1lW3RdO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkoZSxhKTpyfWNhdGNoKHIpe2lmKCEociBpbnN0YW5jZW9mIGkuTWlzc2luZ0RhdGFFeGNlcHRpb24pKXRocm93IHI7YXdhaXQgdGhpcy5yZXF1ZXN0UmFuZ2Uoci5iZWdpbixyLmVuZCk7cmV0dXJuIHRoaXMuZW5zdXJlKGUsdCxhKX19cmVxdWVzdFJhbmdlKGUsdCl7cmV0dXJuIHRoaXMuc3RyZWFtTWFuYWdlci5yZXF1ZXN0UmFuZ2UoZSx0KX1yZXF1ZXN0TG9hZGVkU3RyZWFtKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RBbGxDaHVua3MoZSl9c2VuZFByb2dyZXNzaXZlRGF0YShlKXt0aGlzLnN0cmVhbU1hbmFnZXIub25SZWNlaXZlRGF0YSh7Y2h1bms6ZX0pfXRlcm1pbmF0ZShlKXt0aGlzLnN0cmVhbU1hbmFnZXIuYWJvcnQoZSl9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5DaHVua2VkU3RyZWFtTWFuYWdlcj10LkNodW5rZWRTdHJlYW09dm9pZCAwO2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTthKDExNik7YSgxMjYpO2EoMTI4KTthKDEzMSk7YSgxMzMpO2EoMTM1KTthKDEzNyk7YSgxMzkpO2EoMik7dmFyIHI9YSgxNDkpLG49YSgxNDQpLGk9YSgxNTQpO2NsYXNzIENodW5rZWRTdHJlYW0gZXh0ZW5kcyBpLlN0cmVhbXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIobmV3IFVpbnQ4QXJyYXkoZSksMCxlLG51bGwpO3RoaXMuY2h1bmtTaXplPXQ7dGhpcy5fbG9hZGVkQ2h1bmtzPW5ldyBTZXQ7dGhpcy5udW1DaHVua3M9TWF0aC5jZWlsKGUvdCk7dGhpcy5tYW5hZ2VyPWE7dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg9MDt0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rPS0xfWdldE1pc3NpbmdDaHVua3MoKXtjb25zdCBlPVtdO2ZvcihsZXQgdD0wLGE9dGhpcy5udW1DaHVua3M7dDxhOysrdCl0aGlzLl9sb2FkZWRDaHVua3MuaGFzKHQpfHxlLnB1c2godCk7cmV0dXJuIGV9Z2V0IG51bUNodW5rc0xvYWRlZCgpe3JldHVybiB0aGlzLl9sb2FkZWRDaHVua3Muc2l6ZX1nZXQgaXNEYXRhTG9hZGVkKCl7cmV0dXJuIHRoaXMubnVtQ2h1bmtzTG9hZGVkPT09dGhpcy5udW1DaHVua3N9b25SZWNlaXZlRGF0YShlLHQpe2NvbnN0IGE9dGhpcy5jaHVua1NpemU7aWYoZSVhIT0wKXRocm93IG5ldyBFcnJvcihgQmFkIGJlZ2luIG9mZnNldDogJHtlfWApO2NvbnN0IHI9ZSt0LmJ5dGVMZW5ndGg7aWYociVhIT0wJiZyIT09dGhpcy5ieXRlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBCYWQgZW5kIG9mZnNldDogJHtyfWApO3RoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KHQpLGUpO2NvbnN0IG49TWF0aC5mbG9vcihlL2EpLGk9TWF0aC5mbG9vcigoci0xKS9hKSsxO2ZvcihsZXQgZT1uO2U8aTsrK2UpdGhpcy5fbG9hZGVkQ2h1bmtzLmFkZChlKX1vblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEoZSl7bGV0IHQ9dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg7Y29uc3QgYT1NYXRoLmZsb29yKHQvdGhpcy5jaHVua1NpemUpO3RoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGUpLHQpO3QrPWUuYnl0ZUxlbmd0aDt0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aD10O2NvbnN0IHI9dD49dGhpcy5lbmQ/dGhpcy5udW1DaHVua3M6TWF0aC5mbG9vcih0L3RoaXMuY2h1bmtTaXplKTtmb3IobGV0IGU9YTtlPHI7KytlKXRoaXMuX2xvYWRlZENodW5rcy5hZGQoZSl9ZW5zdXJlQnl0ZShlKXtpZihlPHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKXJldHVybjtjb25zdCB0PU1hdGguZmxvb3IoZS90aGlzLmNodW5rU2l6ZSk7aWYoISh0PnRoaXMubnVtQ2h1bmtzKSYmdCE9PXRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmspe2lmKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKHQpKXRocm93IG5ldyByLk1pc3NpbmdEYXRhRXhjZXB0aW9uKGUsZSsxKTt0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rPXR9fWVuc3VyZVJhbmdlKGUsdCl7aWYoZT49dClyZXR1cm47aWYodDw9dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpcmV0dXJuO2NvbnN0IGE9TWF0aC5mbG9vcihlL3RoaXMuY2h1bmtTaXplKTtpZihhPnRoaXMubnVtQ2h1bmtzKXJldHVybjtjb25zdCBuPU1hdGgubWluKE1hdGguZmxvb3IoKHQtMSkvdGhpcy5jaHVua1NpemUpKzEsdGhpcy5udW1DaHVua3MpO2ZvcihsZXQgaT1hO2k8bjsrK2kpaWYoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoaSkpdGhyb3cgbmV3IHIuTWlzc2luZ0RhdGFFeGNlcHRpb24oZSx0KX1uZXh0RW1wdHlDaHVuayhlKXtjb25zdCB0PXRoaXMubnVtQ2h1bmtzO2ZvcihsZXQgYT0wO2E8dDsrK2Epe2NvbnN0IHI9KGUrYSkldDtpZighdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhyKSlyZXR1cm4gcn1yZXR1cm4gbnVsbH1oYXNDaHVuayhlKXtyZXR1cm4gdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhlKX1nZXRCeXRlKCl7Y29uc3QgZT10aGlzLnBvcztpZihlPj10aGlzLmVuZClyZXR1cm4tMTtlPj10aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVCeXRlKGUpO3JldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdfWdldEJ5dGVzKGUpe2NvbnN0IHQ9dGhpcy5ieXRlcyxhPXRoaXMucG9zLHI9dGhpcy5lbmQ7aWYoIWUpe3I+dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgmJnRoaXMuZW5zdXJlUmFuZ2UoYSxyKTtyZXR1cm4gdC5zdWJhcnJheShhLHIpfWxldCBuPWErZTtuPnImJihuPXIpO24+dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgmJnRoaXMuZW5zdXJlUmFuZ2UoYSxuKTt0aGlzLnBvcz1uO3JldHVybiB0LnN1YmFycmF5KGEsbil9Z2V0Qnl0ZVJhbmdlKGUsdCl7ZTwwJiYoZT0wKTt0PnRoaXMuZW5kJiYodD10aGlzLmVuZCk7dD50aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVSYW5nZShlLHQpO3JldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KGUsdCl9bWFrZVN1YlN0cmVhbShlLHQpe2xldCBhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsO3Q/ZSt0PnRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoJiZ0aGlzLmVuc3VyZVJhbmdlKGUsZSt0KTplPj10aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVCeXRlKGUpO2Z1bmN0aW9uIENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKXt9Q2h1bmtlZFN0cmVhbVN1YnN0cmVhbS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0aGlzKTtDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5nZXRNaXNzaW5nQ2h1bmtzPWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLmNodW5rU2l6ZSx0PU1hdGguZmxvb3IodGhpcy5zdGFydC9lKSxhPU1hdGguZmxvb3IoKHRoaXMuZW5kLTEpL2UpKzEscj1bXTtmb3IobGV0IGU9dDtlPGE7KytlKXRoaXMuX2xvYWRlZENodW5rcy5oYXMoZSl8fHIucHVzaChlKTtyZXR1cm4gcn07T2JqZWN0LmRlZmluZVByb3BlcnR5KENodW5rZWRTdHJlYW1TdWJzdHJlYW0ucHJvdG90eXBlLCJpc0RhdGFMb2FkZWQiLHtnZXQoKXtyZXR1cm4gdGhpcy5udW1DaHVua3NMb2FkZWQ9PT10aGlzLm51bUNodW5rc3x8MD09PXRoaXMuZ2V0TWlzc2luZ0NodW5rcygpLmxlbmd0aH0sY29uZmlndXJhYmxlOiEwfSk7Y29uc3Qgcj1uZXcgQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbTtyLnBvcz1yLnN0YXJ0PWU7ci5lbmQ9ZSt0fHx0aGlzLmVuZDtyLmRpY3Q9YTtyZXR1cm4gcn1nZXRCYXNlU3RyZWFtcygpe3JldHVyblt0aGlzXX19dC5DaHVua2VkU3RyZWFtPUNodW5rZWRTdHJlYW07dC5DaHVua2VkU3RyZWFtTWFuYWdlcj1jbGFzcyBDaHVua2VkU3RyZWFtTWFuYWdlcntjb25zdHJ1Y3RvcihlLHQpe3RoaXMubGVuZ3RoPXQubGVuZ3RoO3RoaXMuY2h1bmtTaXplPXQucmFuZ2VDaHVua1NpemU7dGhpcy5zdHJlYW09bmV3IENodW5rZWRTdHJlYW0odGhpcy5sZW5ndGgsdGhpcy5jaHVua1NpemUsdGhpcyk7dGhpcy5wZGZOZXR3b3JrU3RyZWFtPWU7dGhpcy5kaXNhYmxlQXV0b0ZldGNoPXQuZGlzYWJsZUF1dG9GZXRjaDt0aGlzLm1zZ0hhbmRsZXI9dC5tc2dIYW5kbGVyO3RoaXMuY3VyclJlcXVlc3RJZD0wO3RoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdD1uZXcgTWFwO3RoaXMuX3JlcXVlc3RzQnlDaHVuaz1uZXcgTWFwO3RoaXMuX3Byb21pc2VzQnlSZXF1ZXN0PW5ldyBNYXA7dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg9MDt0aGlzLmFib3J0ZWQ9ITE7dGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eT1uZXcgbi5Qcm9taXNlQ2FwYWJpbGl0eX1zZW5kUmVxdWVzdChlLHQpe2NvbnN0IGE9dGhpcy5wZGZOZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKGUsdCk7YS5pc1N0cmVhbWluZ1N1cHBvcnRlZHx8KGEub25Qcm9ncmVzcz10aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzKSk7bGV0IG49W10saT0wO3JldHVybiBuZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCByZWFkQ2h1bms9cz0+e2xldHt2YWx1ZTpvLGRvbmU6Y309czt0cnl7aWYoYyl7Y29uc3QgdD0oMCxyLmFycmF5QnVmZmVyc1RvQnl0ZXMpKG4pO249bnVsbDtlKHQpO3JldHVybn1pKz1vLmJ5dGVMZW5ndGg7YS5pc1N0cmVhbWluZ1N1cHBvcnRlZCYmdGhpcy5vblByb2dyZXNzKHtsb2FkZWQ6aX0pO24ucHVzaChvKTthLnJlYWQoKS50aGVuKHJlYWRDaHVuayx0KX1jYXRjaChlKXt0KGUpfX07YS5yZWFkKCkudGhlbihyZWFkQ2h1bmssdCl9KSkudGhlbigodD0+e3RoaXMuYWJvcnRlZHx8dGhpcy5vblJlY2VpdmVEYXRhKHtjaHVuazp0LGJlZ2luOmV9KX0pKX1yZXF1ZXN0QWxsQ2h1bmtzKCl7aWYoIShhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdKSl7Y29uc3QgZT10aGlzLnN0cmVhbS5nZXRNaXNzaW5nQ2h1bmtzKCk7dGhpcy5fcmVxdWVzdENodW5rcyhlKX1yZXR1cm4gdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5wcm9taXNlfV9yZXF1ZXN0Q2h1bmtzKGUpe2NvbnN0IHQ9dGhpcy5jdXJyUmVxdWVzdElkKyssYT1uZXcgU2V0O3RoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdC5zZXQodCxhKTtmb3IoY29uc3QgdCBvZiBlKXRoaXMuc3RyZWFtLmhhc0NodW5rKHQpfHxhLmFkZCh0KTtpZigwPT09YS5zaXplKXJldHVybiBQcm9taXNlLnJlc29sdmUoKTtjb25zdCByPW5ldyBuLlByb21pc2VDYXBhYmlsaXR5O3RoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LnNldCh0LHIpO2NvbnN0IGk9W107Zm9yKGNvbnN0IGUgb2YgYSl7bGV0IGE9dGhpcy5fcmVxdWVzdHNCeUNodW5rLmdldChlKTtpZighYSl7YT1bXTt0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuc2V0KGUsYSk7aS5wdXNoKGUpfWEucHVzaCh0KX1pZihpLmxlbmd0aD4wKXtjb25zdCBlPXRoaXMuZ3JvdXBDaHVua3MoaSk7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT10LmJlZ2luQ2h1bmsqdGhpcy5jaHVua1NpemUsYT1NYXRoLm1pbih0LmVuZENodW5rKnRoaXMuY2h1bmtTaXplLHRoaXMubGVuZ3RoKTt0aGlzLnNlbmRSZXF1ZXN0KGUsYSkuY2F0Y2goci5yZWplY3QpfX1yZXR1cm4gci5wcm9taXNlLmNhdGNoKChlPT57aWYoIXRoaXMuYWJvcnRlZCl0aHJvdyBlfSkpfWdldFN0cmVhbSgpe3JldHVybiB0aGlzLnN0cmVhbX1yZXF1ZXN0UmFuZ2UoZSx0KXt0PU1hdGgubWluKHQsdGhpcy5sZW5ndGgpO2NvbnN0IGE9dGhpcy5nZXRCZWdpbkNodW5rKGUpLHI9dGhpcy5nZXRFbmRDaHVuayh0KSxuPVtdO2ZvcihsZXQgZT1hO2U8cjsrK2Upbi5wdXNoKGUpO3JldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKG4pfXJlcXVlc3RSYW5nZXMoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06W107Y29uc3QgdD1bXTtmb3IoY29uc3QgYSBvZiBlKXtjb25zdCBlPXRoaXMuZ2V0QmVnaW5DaHVuayhhLmJlZ2luKSxyPXRoaXMuZ2V0RW5kQ2h1bmsoYS5lbmQpO2ZvcihsZXQgYT1lO2E8cjsrK2EpdC5pbmNsdWRlcyhhKXx8dC5wdXNoKGEpfXQuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSkpO3JldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKHQpfWdyb3VwQ2h1bmtzKGUpe2NvbnN0IHQ9W107bGV0IGE9LTEscj0tMTtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTsrK24pe2NvbnN0IGk9ZVtuXTthPDAmJihhPWkpO2lmKHI+PTAmJnIrMSE9PWkpe3QucHVzaCh7YmVnaW5DaHVuazphLGVuZENodW5rOnIrMX0pO2E9aX1uKzE9PT1lLmxlbmd0aCYmdC5wdXNoKHtiZWdpbkNodW5rOmEsZW5kQ2h1bms6aSsxfSk7cj1pfXJldHVybiB0fW9uUHJvZ3Jlc3MoZSl7dGhpcy5tc2dIYW5kbGVyLnNlbmQoIkRvY1Byb2dyZXNzIix7bG9hZGVkOnRoaXMuc3RyZWFtLm51bUNodW5rc0xvYWRlZCp0aGlzLmNodW5rU2l6ZStlLmxvYWRlZCx0b3RhbDp0aGlzLmxlbmd0aH0pfW9uUmVjZWl2ZURhdGEoZSl7Y29uc3QgdD1lLmNodW5rLGE9dm9pZCAwPT09ZS5iZWdpbixyPWE/dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg6ZS5iZWdpbixuPXIrdC5ieXRlTGVuZ3RoLGk9TWF0aC5mbG9vcihyL3RoaXMuY2h1bmtTaXplKSxzPW48dGhpcy5sZW5ndGg/TWF0aC5mbG9vcihuL3RoaXMuY2h1bmtTaXplKTpNYXRoLmNlaWwobi90aGlzLmNodW5rU2l6ZSk7aWYoYSl7dGhpcy5zdHJlYW0ub25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKHQpO3RoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoPW59ZWxzZSB0aGlzLnN0cmVhbS5vblJlY2VpdmVEYXRhKHIsdCk7dGhpcy5zdHJlYW0uaXNEYXRhTG9hZGVkJiZ0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlc29sdmUodGhpcy5zdHJlYW0pO2NvbnN0IG89W107Zm9yKGxldCBlPWk7ZTxzOysrZSl7Y29uc3QgdD10aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGUpO2lmKHQpe3RoaXMuX3JlcXVlc3RzQnlDaHVuay5kZWxldGUoZSk7Zm9yKGNvbnN0IGEgb2YgdCl7Y29uc3QgdD10aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QuZ2V0KGEpO3QuaGFzKGUpJiZ0LmRlbGV0ZShlKTt0LnNpemU+MHx8by5wdXNoKGEpfX19aWYoIXRoaXMuZGlzYWJsZUF1dG9GZXRjaCYmMD09PXRoaXMuX3JlcXVlc3RzQnlDaHVuay5zaXplKXtsZXQgZTtpZigxPT09dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKXtjb25zdCB0PXRoaXMuc3RyZWFtLm51bUNodW5rcy0xO3RoaXMuc3RyZWFtLmhhc0NodW5rKHQpfHwoZT10KX1lbHNlIGU9dGhpcy5zdHJlYW0ubmV4dEVtcHR5Q2h1bmsocyk7TnVtYmVyLmlzSW50ZWdlcihlKSYmdGhpcy5fcmVxdWVzdENodW5rcyhbZV0pfWZvcihjb25zdCBlIG9mIG8pe2NvbnN0IHQ9dGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KGUpO3RoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShlKTt0LnJlc29sdmUoKX10aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLHtsb2FkZWQ6dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKnRoaXMuY2h1bmtTaXplLHRvdGFsOnRoaXMubGVuZ3RofSl9b25FcnJvcihlKXt0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlamVjdChlKX1nZXRCZWdpbkNodW5rKGUpe3JldHVybiBNYXRoLmZsb29yKGUvdGhpcy5jaHVua1NpemUpfWdldEVuZENodW5rKGUpe3JldHVybiBNYXRoLmZsb29yKChlLTEpL3RoaXMuY2h1bmtTaXplKSsxfWFib3J0KGUpe3RoaXMuYWJvcnRlZD0hMDt0aGlzLnBkZk5ldHdvcmtTdHJlYW0mJnRoaXMucGRmTmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhlKTtmb3IoY29uc3QgdCBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSl0LnJlamVjdChlKX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlN0cmluZ1N0cmVhbT10LlN0cmVhbT10Lk51bGxTdHJlYW09dm9pZCAwO2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTt2YXIgcj1hKDE1MSksbj1hKDE0NCk7Y2xhc3MgU3RyZWFtIGV4dGVuZHMgci5CYXNlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCxhLHIpe3N1cGVyKCk7dGhpcy5ieXRlcz1lIGluc3RhbmNlb2YgVWludDhBcnJheT9lOm5ldyBVaW50OEFycmF5KGUpO3RoaXMuc3RhcnQ9dHx8MDt0aGlzLnBvcz10aGlzLnN0YXJ0O3RoaXMuZW5kPXQrYXx8dGhpcy5ieXRlcy5sZW5ndGg7dGhpcy5kaWN0PXJ9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmVuZC10aGlzLnN0YXJ0fWdldCBpc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLmxlbmd0aH1nZXRCeXRlKCl7cmV0dXJuIHRoaXMucG9zPj10aGlzLmVuZD8tMTp0aGlzLmJ5dGVzW3RoaXMucG9zKytdfWdldEJ5dGVzKGUpe2NvbnN0IHQ9dGhpcy5ieXRlcyxhPXRoaXMucG9zLHI9dGhpcy5lbmQ7aWYoIWUpcmV0dXJuIHQuc3ViYXJyYXkoYSxyKTtsZXQgbj1hK2U7bj5yJiYobj1yKTt0aGlzLnBvcz1uO3JldHVybiB0LnN1YmFycmF5KGEsbil9Z2V0Qnl0ZVJhbmdlKGUsdCl7ZTwwJiYoZT0wKTt0PnRoaXMuZW5kJiYodD10aGlzLmVuZCk7cmV0dXJuIHRoaXMuYnl0ZXMuc3ViYXJyYXkoZSx0KX1yZXNldCgpe3RoaXMucG9zPXRoaXMuc3RhcnR9bW92ZVN0YXJ0KCl7dGhpcy5zdGFydD10aGlzLnBvc31tYWtlU3ViU3RyZWFtKGUsdCl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7cmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcy5idWZmZXIsZSx0LGEpfX10LlN0cmVhbT1TdHJlYW07dC5TdHJpbmdTdHJlYW09Y2xhc3MgU3RyaW5nU3RyZWFtIGV4dGVuZHMgU3RyZWFte2NvbnN0cnVjdG9yKGUpe3N1cGVyKCgwLG4uc3RyaW5nVG9CeXRlcykoZSkpfX07dC5OdWxsU3RyZWFtPWNsYXNzIE51bGxTdHJlYW0gZXh0ZW5kcyBTdHJlYW17Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgVWludDhBcnJheSgwKSl9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5QYWdlPXQuUERGRG9jdW1lbnQ9dm9pZCAwO2EoMik7YSgxMzkpO2EoMTE2KTthKDEyNik7YSgxMjgpO2EoMTMxKTthKDEzMyk7YSgxMzUpO2EoMTM3KTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7dmFyIHI9YSgxNDQpLG49YSgxNTYpLGk9YSgxNDkpLHM9YSgxNTApLG89YSgyMDEpLGM9YSgxNTEpLGw9YSgyMTgpLGg9YSgyMjApLHU9YSgyMjIpLGQ9YSgyNTUpLGY9YSgxNjYpLGc9YSgxNTQpLHA9YSgyMjYpLG09YSgyMTQpLGI9YSgxNjMpLHk9YSgxNjgpLHc9YSgyMjUpLFM9YSgyMTYpLHg9YSgyMjcpLEM9YSgyNTYpO2NvbnN0IHY9WzAsMCw2MTIsNzkyXTtjbGFzcyBQYWdle2NvbnN0cnVjdG9yKGUpe2xldHtwZGZNYW5hZ2VyOnQseHJlZjphLHBhZ2VJbmRleDpyLHBhZ2VEaWN0Om4scmVmOmksZ2xvYmFsSWRGYWN0b3J5OnMsZm9udENhY2hlOm8sYnVpbHRJbkNNYXBDYWNoZTpjLHN0YW5kYXJkRm9udERhdGFDYWNoZTpsLGdsb2JhbEltYWdlQ2FjaGU6aCxzeXN0ZW1Gb250Q2FjaGU6dSxub25CbGVuZE1vZGVzU2V0OmQseGZhRmFjdG9yeTpmfT1lO3RoaXMucGRmTWFuYWdlcj10O3RoaXMucGFnZUluZGV4PXI7dGhpcy5wYWdlRGljdD1uO3RoaXMueHJlZj1hO3RoaXMucmVmPWk7dGhpcy5mb250Q2FjaGU9bzt0aGlzLmJ1aWx0SW5DTWFwQ2FjaGU9Yzt0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZT1sO3RoaXMuZ2xvYmFsSW1hZ2VDYWNoZT1oO3RoaXMuc3lzdGVtRm9udENhY2hlPXU7dGhpcy5ub25CbGVuZE1vZGVzU2V0PWQ7dGhpcy5ldmFsdWF0b3JPcHRpb25zPXQuZXZhbHVhdG9yT3B0aW9uczt0aGlzLnJlc291cmNlc1Byb21pc2U9bnVsbDt0aGlzLnhmYUZhY3Rvcnk9Zjtjb25zdCBnPXtvYmo6MH07dGhpcy5fbG9jYWxJZEZhY3Rvcnk9Y2xhc3MgZXh0ZW5kcyBze3N0YXRpYyBjcmVhdGVPYmpJZCgpe3JldHVybmBwJHtyfV8keysrZy5vYmp9YH1zdGF0aWMgZ2V0UGFnZU9iaklkKCl7cmV0dXJuYHAke2kudG9TdHJpbmcoKX1gfX19X2dldEluaGVyaXRhYmxlUHJvcGVydHkoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtjb25zdCBhPSgwLGkuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dGhpcy5wYWdlRGljdCxrZXk6ZSxnZXRBcnJheTp0LHN0b3BXaGVuRm91bmQ6ITF9KTtyZXR1cm4gQXJyYXkuaXNBcnJheShhKT8xIT09YS5sZW5ndGgmJmFbMF1pbnN0YW5jZW9mIHMuRGljdD9zLkRpY3QubWVyZ2Uoe3hyZWY6dGhpcy54cmVmLGRpY3RBcnJheTphfSk6YVswXTphfWdldCBjb250ZW50KCl7cmV0dXJuIHRoaXMucGFnZURpY3QuZ2V0QXJyYXkoIkNvbnRlbnRzIil9Z2V0IHJlc291cmNlcygpe2NvbnN0IGU9dGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiUmVzb3VyY2VzIik7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsInJlc291cmNlcyIsZSBpbnN0YW5jZW9mIHMuRGljdD9lOnMuRGljdC5lbXB0eSl9X2dldEJvdW5kaW5nQm94KGUpe2lmKHRoaXMueGZhRGF0YSlyZXR1cm4gdGhpcy54ZmFEYXRhLmJib3g7bGV0IHQ9dGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eShlLCEwKTtpZihBcnJheS5pc0FycmF5KHQpJiY0PT09dC5sZW5ndGgpe3Q9ci5VdGlsLm5vcm1hbGl6ZVJlY3QodCk7aWYodFsyXS10WzBdPjAmJnRbM10tdFsxXT4wKXJldHVybiB0OygwLHIud2FybikoYEVtcHR5LCBvciBpbnZhbGlkLCAvJHtlfSBlbnRyeS5gKX1yZXR1cm4gbnVsbH1nZXQgbWVkaWFCb3goKXtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywibWVkaWFCb3giLHRoaXMuX2dldEJvdW5kaW5nQm94KCJNZWRpYUJveCIpfHx2KX1nZXQgY3JvcEJveCgpe3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJjcm9wQm94Iix0aGlzLl9nZXRCb3VuZGluZ0JveCgiQ3JvcEJveCIpfHx0aGlzLm1lZGlhQm94KX1nZXQgdXNlclVuaXQoKXtsZXQgZT10aGlzLnBhZ2VEaWN0LmdldCgiVXNlclVuaXQiKTsoIm51bWJlciIhPXR5cGVvZiBlfHxlPD0wKSYmKGU9MSk7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsInVzZXJVbml0IixlKX1nZXQgdmlldygpe2NvbnN0e2Nyb3BCb3g6ZSxtZWRpYUJveDp0fT10aGlzO2lmKGUhPT10JiYhKDAsci5pc0FycmF5RXF1YWwpKGUsdCkpe2NvbnN0IGE9ci5VdGlsLmludGVyc2VjdChlLHQpO2lmKGEmJmFbMl0tYVswXT4wJiZhWzNdLWFbMV0+MClyZXR1cm4oMCxyLnNoYWRvdykodGhpcywidmlldyIsYSk7KDAsci53YXJuKSgiRW1wdHkgL0Nyb3BCb3ggYW5kIC9NZWRpYUJveCBpbnRlcnNlY3Rpb24uIil9cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsInZpZXciLHQpfWdldCByb3RhdGUoKXtsZXQgZT10aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KCJSb3RhdGUiKXx8MDtlJTkwIT0wP2U9MDplPj0zNjA/ZSU9MzYwOmU8MCYmKGU9KGUlMzYwKzM2MCklMzYwKTtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywicm90YXRlIixlKX1fb25TdWJTdHJlYW1FcnJvcihlLHQpe2lmKCF0aGlzLmV2YWx1YXRvck9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7KDAsci53YXJuKShgZ2V0Q29udGVudFN0cmVhbSAtIGlnbm9yaW5nIHN1Yi1zdHJlYW0gKCR7dH0pOiAiJHtlfSIuYCl9Z2V0Q29udGVudFN0cmVhbSgpe3JldHVybiB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsImNvbnRlbnQiKS50aGVuKChlPT5lIGluc3RhbmNlb2YgYy5CYXNlU3RyZWFtP2U6QXJyYXkuaXNBcnJheShlKT9uZXcgeS5TdHJlYW1zU2VxdWVuY2VTdHJlYW0oZSx0aGlzLl9vblN1YlN0cmVhbUVycm9yLmJpbmQodGhpcykpOm5ldyBnLk51bGxTdHJlYW0pKX1nZXQgeGZhRGF0YSgpe3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJ4ZmFEYXRhIix0aGlzLnhmYUZhY3Rvcnk/e2Jib3g6dGhpcy54ZmFGYWN0b3J5LmdldEJvdW5kaW5nQm94KHRoaXMucGFnZUluZGV4KX06bnVsbCl9I3QoZSx0LGEpe2Zvcihjb25zdCBuIG9mIGUpaWYobi5pZCl7Y29uc3QgZT1zLlJlZi5mcm9tU3RyaW5nKG4uaWQpO2lmKCFlKXsoMCxyLndhcm4pKGBBIG5vbi1saW5rZWQgYW5ub3RhdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQ6ICR7bi5pZH1gKTtjb250aW51ZX1pZihuLmRlbGV0ZWQpe3QucHV0KGUpO2NvbnRpbnVlfWE/LnB1dChlKTtuLnJlZj1lO2RlbGV0ZSBuLmlkfX1hc3luYyBzYXZlTmV3QW5ub3RhdGlvbnMoZSx0LGEscil7aWYodGhpcy54ZmFGYWN0b3J5KXRocm93IG5ldyBFcnJvcigiWEZBOiBDYW5ub3Qgc2F2ZSBuZXcgYW5ub3RhdGlvbnMuIik7Y29uc3QgaT1uZXcgYi5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOmUscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pLG89bmV3IHMuUmVmU2V0LGM9bmV3IHMuUmVmU2V0O3RoaXMuI3QoYSxvLGMpO2NvbnN0IGw9dGhpcy5wYWdlRGljdCxoPXRoaXMuYW5ub3RhdGlvbnMuZmlsdGVyKChlPT4hKGUgaW5zdGFuY2VvZiBzLlJlZiYmby5oYXMoZSkpKSksdT1hd2FpdCBuLkFubm90YXRpb25GYWN0b3J5LnNhdmVOZXdBbm5vdGF0aW9ucyhpLHQsYSxyKTtmb3IoY29uc3R7cmVmOmV9b2YgdS5hbm5vdGF0aW9ucyllIGluc3RhbmNlb2Ygcy5SZWYmJiFjLmhhcyhlKSYmaC5wdXNoKGUpO2NvbnN0IGQ9bC5nZXQoIkFubm90cyIpO2wuc2V0KCJBbm5vdHMiLGgpO2NvbnN0IGY9W107bGV0IGc9bnVsbDt0aGlzLnhyZWYuZW5jcnlwdCYmKGc9dGhpcy54cmVmLmVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucmVmLm51bSx0aGlzLnJlZi5nZW4pKTthd2FpdCgwLFMud3JpdGVPYmplY3QpKHRoaXMucmVmLGwsZixnKTtkJiZsLnNldCgiQW5ub3RzIixkKTtjb25zdCBwPXUuZGVwZW5kZW5jaWVzO3AucHVzaCh7cmVmOnRoaXMucmVmLGRhdGE6Zi5qb2luKCIiKX0sLi4udS5hbm5vdGF0aW9ucyk7cmV0dXJuIHB9c2F2ZShlLHQsYSl7Y29uc3Qgbj1uZXcgYi5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOmUscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pO3JldHVybiB0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucy50aGVuKChmdW5jdGlvbihlKXtjb25zdCBpPVtdO2Zvcihjb25zdCBzIG9mIGUpcy5tdXN0QmVQcmludGVkKGEpJiZpLnB1c2gocy5zYXZlKG4sdCxhKS5jYXRjaCgoZnVuY3Rpb24oZSl7KDAsci53YXJuKShgc2F2ZSAtIGlnbm9yaW5nIGFubm90YXRpb24gZGF0YSBkdXJpbmcgIiR7dC5uYW1lfSIgdGFzazogIiR7ZX0iLmApO3JldHVybiBudWxsfSkpKTtyZXR1cm4gUHJvbWlzZS5hbGwoaSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZmlsdGVyKChlPT4hIWUpKX0pKX0pKX1sb2FkUmVzb3VyY2VzKGUpe3RoaXMucmVzb3VyY2VzUHJvbWlzZXx8KHRoaXMucmVzb3VyY2VzUHJvbWlzZT10aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsInJlc291cmNlcyIpKTtyZXR1cm4gdGhpcy5yZXNvdXJjZXNQcm9taXNlLnRoZW4oKCgpPT5uZXcgcC5PYmplY3RMb2FkZXIodGhpcy5yZXNvdXJjZXMsZSx0aGlzLnhyZWYpLmxvYWQoKSkpfWdldE9wZXJhdG9yTGlzdChlKXtsZXR7aGFuZGxlcjp0LHNpbms6YSx0YXNrOm8saW50ZW50OmMsY2FjaGVLZXk6bCxhbm5vdGF0aW9uU3RvcmFnZTpoPW51bGx9PWU7Y29uc3QgdT10aGlzLmdldENvbnRlbnRTdHJlYW0oKSxkPXRoaXMubG9hZFJlc291cmNlcyhbIkNvbG9yU3BhY2UiLCJFeHRHU3RhdGUiLCJGb250IiwiUGF0dGVybiIsIlByb3BlcnRpZXMiLCJTaGFkaW5nIiwiWE9iamVjdCJdKSxmPW5ldyBiLlBhcnRpYWxFdmFsdWF0b3Ioe3hyZWY6dGhpcy54cmVmLGhhbmRsZXI6dCxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgsaWRGYWN0b3J5OnRoaXMuX2xvY2FsSWRGYWN0b3J5LGZvbnRDYWNoZTp0aGlzLmZvbnRDYWNoZSxidWlsdEluQ01hcENhY2hlOnRoaXMuYnVpbHRJbkNNYXBDYWNoZSxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6dGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsZ2xvYmFsSW1hZ2VDYWNoZTp0aGlzLmdsb2JhbEltYWdlQ2FjaGUsc3lzdGVtRm9udENhY2hlOnRoaXMuc3lzdGVtRm9udENhY2hlLG9wdGlvbnM6dGhpcy5ldmFsdWF0b3JPcHRpb25zfSksZz10aGlzLnhmYUZhY3Rvcnk/bnVsbDooMCxpLmdldE5ld0Fubm90YXRpb25zTWFwKShoKTtsZXQgcD1udWxsLHk9UHJvbWlzZS5yZXNvbHZlKG51bGwpO2lmKGcpe2xldCBlO2NvbnN0IHQ9Zy5nZXQodGhpcy5wYWdlSW5kZXgpO2lmKHQpe2NvbnN0IGE9bmV3IFNldDtmb3IoY29uc3R7Yml0bWFwSWQ6ZSxiaXRtYXA6cn1vZiB0KSFlfHxyfHxhLmhhcyhlKXx8YS5hZGQoZSk7Y29uc3R7aXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6aX09dGhpcy5ldmFsdWF0b3JPcHRpb25zO2lmKGEuc2l6ZT4wKXtjb25zdCBzPXQuc2xpY2UoKTtmb3IoY29uc3RbZSx0XW9mIGgpZS5zdGFydHNXaXRoKHIuQW5ub3RhdGlvbkVkaXRvclByZWZpeCkmJnQuYml0bWFwJiZhLmhhcyh0LmJpdG1hcElkKSYmcy5wdXNoKHQpO2U9bi5Bbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhzLHRoaXMueHJlZixpKX1lbHNlIGU9bi5Bbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyh0LHRoaXMueHJlZixpKTtwPW5ldyBzLlJlZlNldDt0aGlzLiN0KHQscCxudWxsKTt5PW4uQW5ub3RhdGlvbkZhY3RvcnkucHJpbnROZXdBbm5vdGF0aW9ucyhmLG8sdCxlKX19Y29uc3Qgdz1Qcm9taXNlLmFsbChbdSxkXSkudGhlbigoZT0+e2xldFtyXT1lO2NvbnN0IG49bmV3IG0uT3BlcmF0b3JMaXN0KGMsYSk7dC5zZW5kKCJTdGFydFJlbmRlclBhZ2UiLHt0cmFuc3BhcmVuY3k6Zi5oYXNCbGVuZE1vZGVzKHRoaXMucmVzb3VyY2VzLHRoaXMubm9uQmxlbmRNb2Rlc1NldCkscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGNhY2hlS2V5Omx9KTtyZXR1cm4gZi5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTpyLHRhc2s6byxyZXNvdXJjZXM6dGhpcy5yZXNvdXJjZXMsb3BlcmF0b3JMaXN0Om59KS50aGVuKChmdW5jdGlvbigpe3JldHVybiBufSkpfSkpO3JldHVybiBQcm9taXNlLmFsbChbdyx0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucyx5XSkudGhlbigoZnVuY3Rpb24oZSl7bGV0W3QsYSxuXT1lO2lmKG4pe2E9YS5maWx0ZXIoKGU9PiEoZS5yZWYmJnAuaGFzKGUucmVmKSkpKTtmb3IobGV0IGU9MCx0PW4ubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHI9bltlXTtpZihyLnJlZlRvUmVwbGFjZSl7Y29uc3QgaT1hLmZpbmRJbmRleCgoZT0+ZS5yZWYmJigwLHMuaXNSZWZzRXF1YWwpKGUucmVmLHIucmVmVG9SZXBsYWNlKSkpO2lmKGk+PTApe2Euc3BsaWNlKGksMSxyKTtuLnNwbGljZShlLS0sMSk7dC0tfX19YT1hLmNvbmNhdChuKX1pZigwPT09YS5sZW5ndGh8fGMmci5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0RJU0FCTEUpe3QuZmx1c2goITApO3JldHVybntsZW5ndGg6dC50b3RhbExlbmd0aH19Y29uc3QgaT0hIShjJnIuUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19GT1JNUyksbD0hIShjJnIuUmVuZGVyaW5nSW50ZW50RmxhZy5BTlkpLHU9ISEoYyZyLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksZD0hIShjJnIuUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCksZz1bXTtmb3IoY29uc3QgZSBvZiBhKShsfHx1JiZlLm11c3RCZVZpZXdlZChoKXx8ZCYmZS5tdXN0QmVQcmludGVkKGgpKSYmZy5wdXNoKGUuZ2V0T3BlcmF0b3JMaXN0KGYsbyxjLGksaCkuY2F0Y2goKGZ1bmN0aW9uKGUpeygwLHIud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGFubm90YXRpb24gZGF0YSBkdXJpbmcgIiR7by5uYW1lfSIgdGFzazogIiR7ZX0iLmApO3JldHVybntvcExpc3Q6bnVsbCxzZXBhcmF0ZUZvcm06ITEsc2VwYXJhdGVDYW52YXM6ITF9fSkpKTtyZXR1cm4gUHJvbWlzZS5hbGwoZykudGhlbigoZnVuY3Rpb24oZSl7bGV0IGE9ITEscj0hMTtmb3IoY29uc3R7b3BMaXN0Om4sc2VwYXJhdGVGb3JtOmksc2VwYXJhdGVDYW52YXM6c31vZiBlKXt0LmFkZE9wTGlzdChuKTthfHw9aTtyfHw9c310LmZsdXNoKCEwLHtmb3JtOmEsY2FudmFzOnJ9KTtyZXR1cm57bGVuZ3RoOnQudG90YWxMZW5ndGh9fSkpfSkpfWV4dHJhY3RUZXh0Q29udGVudChlKXtsZXR7aGFuZGxlcjp0LHRhc2s6YSxpbmNsdWRlTWFya2VkQ29udGVudDpyLGRpc2FibGVOb3JtYWxpemF0aW9uOm4sc2luazppfT1lO2NvbnN0IHM9dGhpcy5nZXRDb250ZW50U3RyZWFtKCksbz10aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCJGb250IiwiUHJvcGVydGllcyIsIlhPYmplY3QiXSk7cmV0dXJuIFByb21pc2UuYWxsKFtzLG9dKS50aGVuKChlPT57bGV0W3NdPWU7cmV0dXJuIG5ldyBiLlBhcnRpYWxFdmFsdWF0b3Ioe3hyZWY6dGhpcy54cmVmLGhhbmRsZXI6dCxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgsaWRGYWN0b3J5OnRoaXMuX2xvY2FsSWRGYWN0b3J5LGZvbnRDYWNoZTp0aGlzLmZvbnRDYWNoZSxidWlsdEluQ01hcENhY2hlOnRoaXMuYnVpbHRJbkNNYXBDYWNoZSxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6dGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsZ2xvYmFsSW1hZ2VDYWNoZTp0aGlzLmdsb2JhbEltYWdlQ2FjaGUsc3lzdGVtRm9udENhY2hlOnRoaXMuc3lzdGVtRm9udENhY2hlLG9wdGlvbnM6dGhpcy5ldmFsdWF0b3JPcHRpb25zfSkuZ2V0VGV4dENvbnRlbnQoe3N0cmVhbTpzLHRhc2s6YSxyZXNvdXJjZXM6dGhpcy5yZXNvdXJjZXMsaW5jbHVkZU1hcmtlZENvbnRlbnQ6cixkaXNhYmxlTm9ybWFsaXphdGlvbjpuLHNpbms6aSx2aWV3Qm94OnRoaXMudmlld30pfSkpfWFzeW5jIGdldFN0cnVjdFRyZWUoKXtjb25zdCBlPWF3YWl0IHRoaXMucGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJzdHJ1Y3RUcmVlUm9vdCIpO2lmKCFlKXJldHVybiBudWxsO3JldHVybihhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsIl9wYXJzZVN0cnVjdFRyZWUiLFtlXSkpLnNlcmlhbGl6YWJsZX1fcGFyc2VTdHJ1Y3RUcmVlKGUpe2NvbnN0IHQ9bmV3IHcuU3RydWN0VHJlZVBhZ2UoZSx0aGlzLnBhZ2VEaWN0KTt0LnBhcnNlKCk7cmV0dXJuIHR9YXN5bmMgZ2V0QW5ub3RhdGlvbnNEYXRhKGUsdCxhKXtjb25zdCBuPWF3YWl0IHRoaXMuX3BhcnNlZEFubm90YXRpb25zO2lmKDA9PT1uLmxlbmd0aClyZXR1cm5bXTtjb25zdCBpPVtdLHM9W107bGV0IG87Y29uc3QgYz0hIShhJnIuUmVuZGVyaW5nSW50ZW50RmxhZy5BTlkpLGw9ISEoYSZyLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksaD0hIShhJnIuUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7Zm9yKGNvbnN0IGEgb2Ygbil7Y29uc3Qgbj1jfHxsJiZhLnZpZXdhYmxlOyhufHxoJiZhLnByaW50YWJsZSkmJmkucHVzaChhLmRhdGEpO2lmKGEuaGFzVGV4dENvbnRlbnQmJm4pe298fD1uZXcgYi5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOmUscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pO3MucHVzaChhLmV4dHJhY3RUZXh0Q29udGVudChvLHQsWy0xLzAsLTEvMCwxLzAsMS8wXSkuY2F0Y2goKGZ1bmN0aW9uKGUpeygwLHIud2FybikoYGdldEFubm90YXRpb25zRGF0YSAtIGlnbm9yaW5nIHRleHRDb250ZW50IGR1cmluZyAiJHt0Lm5hbWV9IiB0YXNrOiAiJHtlfSIuYCl9KSkpfX1hd2FpdCBQcm9taXNlLmFsbChzKTtyZXR1cm4gaX1nZXQgYW5ub3RhdGlvbnMoKXtjb25zdCBlPXRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIkFubm90cyIpO3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJhbm5vdGF0aW9ucyIsQXJyYXkuaXNBcnJheShlKT9lOltdKX1nZXQgX3BhcnNlZEFubm90YXRpb25zKCl7Y29uc3QgZT10aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsImFubm90YXRpb25zIikudGhlbigoKCk9Pntjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIHRoaXMuYW5ub3RhdGlvbnMpZS5wdXNoKG4uQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHRoaXMueHJlZix0LHRoaXMucGRmTWFuYWdlcix0aGlzLl9sb2NhbElkRmFjdG9yeSwhMSkuY2F0Y2goKGZ1bmN0aW9uKGUpeygwLHIud2FybikoYF9wYXJzZWRBbm5vdGF0aW9uczogIiR7ZX0iLmApO3JldHVybiBudWxsfSkpKTtyZXR1cm4gUHJvbWlzZS5hbGwoZSkudGhlbigoZnVuY3Rpb24oZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiBlO2NvbnN0IHQ9W107bGV0IGE7Zm9yKGNvbnN0IHIgb2YgZSlyJiYociBpbnN0YW5jZW9mIG4uUG9wdXBBbm5vdGF0aW9uPyhhfHw9W10pLnB1c2gocik6dC5wdXNoKHIpKTthJiZ0LnB1c2goLi4uYSk7cmV0dXJuIHR9KSl9KSk7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsIl9wYXJzZWRBbm5vdGF0aW9ucyIsZSl9Z2V0IGpzQWN0aW9ucygpe2NvbnN0IGU9KDAsaS5jb2xsZWN0QWN0aW9ucykodGhpcy54cmVmLHRoaXMucGFnZURpY3Qsci5QYWdlQWN0aW9uRXZlbnRUeXBlKTtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywianNBY3Rpb25zIixlKX19dC5QYWdlPVBhZ2U7Y29uc3Qgaz1uZXcgVWludDhBcnJheShbMzcsODAsNjgsNzAsNDVdKSxPPW5ldyBVaW50OEFycmF5KFsxMTUsMTE2LDk3LDExNCwxMTYsMTIwLDExNCwxMDEsMTAyXSksVD1uZXcgVWludDhBcnJheShbMTAxLDExMCwxMDAsMTExLDk4LDEwNl0pO2Z1bmN0aW9uIGZpbmQoZSx0KXtsZXQgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MTAyNCxyPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107Y29uc3Qgbj10Lmxlbmd0aCxpPWUucGVla0J5dGVzKGEpLHM9aS5sZW5ndGgtbjtpZihzPD0wKXJldHVybiExO2lmKHIpe2NvbnN0IGE9bi0xO2xldCByPWkubGVuZ3RoLTE7Zm9yKDtyPj1hOyl7bGV0IHM9MDtmb3IoO3M8biYmaVtyLXNdPT09dFthLXNdOylzKys7aWYocz49bil7ZS5wb3MrPXItYTtyZXR1cm4hMH1yLS19fWVsc2V7bGV0IGE9MDtmb3IoO2E8PXM7KXtsZXQgcj0wO2Zvcig7cjxuJiZpW2Ercl09PT10W3JdOylyKys7aWYocj49bil7ZS5wb3MrPWE7cmV0dXJuITB9YSsrfX1yZXR1cm4hMX10LlBERkRvY3VtZW50PWNsYXNzIFBERkRvY3VtZW50e2NvbnN0cnVjdG9yKGUsdCl7aWYodC5sZW5ndGg8PTApdGhyb3cgbmV3IHIuSW52YWxpZFBERkV4Y2VwdGlvbigiVGhlIFBERiBmaWxlIGlzIGVtcHR5LCBpLmUuIGl0cyBzaXplIGlzIHplcm8gYnl0ZXMuIik7dGhpcy5wZGZNYW5hZ2VyPWU7dGhpcy5zdHJlYW09dDt0aGlzLnhyZWY9bmV3IEMuWFJlZih0LGUpO3RoaXMuX3BhZ2VQcm9taXNlcz1uZXcgTWFwO3RoaXMuX3ZlcnNpb249bnVsbDtjb25zdCBhPXtmb250OjB9O3RoaXMuX2dsb2JhbElkRmFjdG9yeT1jbGFzc3tzdGF0aWMgZ2V0RG9jSWQoKXtyZXR1cm5gZ18ke2UuZG9jSWR9YH1zdGF0aWMgY3JlYXRlRm9udElkKCl7cmV0dXJuImYiKyArK2EuZm9udH1zdGF0aWMgY3JlYXRlT2JqSWQoKXsoMCxyLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBjcmVhdGVPYmpJZGAgY2FsbGVkLiIpfXN0YXRpYyBnZXRQYWdlT2JqSWQoKXsoMCxyLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRQYWdlT2JqSWRgIGNhbGxlZC4iKX19fXBhcnNlKGUpe3RoaXMueHJlZi5wYXJzZShlKTt0aGlzLmNhdGFsb2c9bmV3IGguQ2F0YWxvZyh0aGlzLnBkZk1hbmFnZXIsdGhpcy54cmVmKX1nZXQgbGluZWFyaXphdGlvbigpe2xldCBlPW51bGw7dHJ5e2U9Zi5MaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGkuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxyLmluZm8pKGUpfXJldHVybigwLHIuc2hhZG93KSh0aGlzLCJsaW5lYXJpemF0aW9uIixlKX1nZXQgc3RhcnRYUmVmKCl7Y29uc3QgZT10aGlzLnN0cmVhbTtsZXQgdD0wO2lmKHRoaXMubGluZWFyaXphdGlvbil7ZS5yZXNldCgpO2ZpbmQoZSxUKSYmKHQ9ZS5wb3MrNi1lLnN0YXJ0KX1lbHNle2NvbnN0IGE9MTAyNCxyPU8ubGVuZ3RoO2xldCBuPSExLHM9ZS5lbmQ7Zm9yKDshbiYmcz4wOyl7cy09YS1yO3M8MCYmKHM9MCk7ZS5wb3M9cztuPWZpbmQoZSxPLGEsITApfWlmKG4pe2Uuc2tpcCg5KTtsZXQgYTtkb3thPWUuZ2V0Qnl0ZSgpfXdoaWxlKCgwLGkuaXNXaGl0ZVNwYWNlKShhKSk7bGV0IHI9IiI7Zm9yKDthPj0zMiYmYTw9NTc7KXtyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2E9ZS5nZXRCeXRlKCl9dD1wYXJzZUludChyLDEwKTtpc05hTih0KSYmKHQ9MCl9fXJldHVybigwLHIuc2hhZG93KSh0aGlzLCJzdGFydFhSZWYiLHQpfWNoZWNrSGVhZGVyKCl7Y29uc3QgZT10aGlzLnN0cmVhbTtlLnJlc2V0KCk7aWYoIWZpbmQoZSxrKSlyZXR1cm47ZS5tb3ZlU3RhcnQoKTtlLnNraXAoay5sZW5ndGgpO2xldCB0LGE9IiI7Zm9yKDsodD1lLmdldEJ5dGUoKSk+MzImJmEubGVuZ3RoPDc7KWErPVN0cmluZy5mcm9tQ2hhckNvZGUodCk7aS5QREZfVkVSU0lPTl9SRUdFWFAudGVzdChhKT90aGlzLl92ZXJzaW9uPWE6KDAsci53YXJuKShgSW52YWxpZCBQREYgaGVhZGVyIHZlcnNpb246ICR7YX1gKX1wYXJzZVN0YXJ0WFJlZigpe3RoaXMueHJlZi5zZXRTdGFydFhSZWYodGhpcy5zdGFydFhSZWYpfWdldCBudW1QYWdlcygpe2xldCBlPTA7ZT10aGlzLmNhdGFsb2cuaGFzQWN0dWFsTnVtUGFnZXM/dGhpcy5jYXRhbG9nLm51bVBhZ2VzOnRoaXMueGZhRmFjdG9yeT90aGlzLnhmYUZhY3RvcnkuZ2V0TnVtUGFnZXMoKTp0aGlzLmxpbmVhcml6YXRpb24/dGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOnRoaXMuY2F0YWxvZy5udW1QYWdlcztyZXR1cm4oMCxyLnNoYWRvdykodGhpcywibnVtUGFnZXMiLGUpfV9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybiEhQXJyYXkuaXNBcnJheShlKSYmZS5ldmVyeSgoZT0+e2lmKCEoKGU9dGhpcy54cmVmLmZldGNoSWZSZWYoZSkpaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybiExO2lmKGUuaGFzKCJLaWRzIikpe2lmKCsrdD4xMCl7KDAsci53YXJuKSgiX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXM6IG1heGltdW0gcmVjdXJzaW9uIGRlcHRoIHJlYWNoZWQiKTtyZXR1cm4hMX1yZXR1cm4gdGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhlLmdldCgiS2lkcyIpLHQpfWNvbnN0IGE9KDAscy5pc05hbWUpKGUuZ2V0KCJGVCIpLCJTaWciKSxuPWUuZ2V0KCJSZWN0IiksaT1BcnJheS5pc0FycmF5KG4pJiZuLmV2ZXJ5KChlPT4wPT09ZSkpO3JldHVybiBhJiZpfSkpfWdldCBfeGZhU3RyZWFtcygpe2NvbnN0IGU9dGhpcy5jYXRhbG9nLmFjcm9Gb3JtO2lmKCFlKXJldHVybiBudWxsO2NvbnN0IHQ9ZS5nZXQoIlhGQSIpLGE9eyJ4ZHA6eGRwIjoiIix0ZW1wbGF0ZToiIixkYXRhc2V0czoiIixjb25maWc6IiIsY29ubmVjdGlvblNldDoiIixsb2NhbGVTZXQ6IiIsc3R5bGVzaGVldDoiIiwiL3hkcDp4ZHAiOiIifTtpZih0IGluc3RhbmNlb2YgYy5CYXNlU3RyZWFtJiYhdC5pc0VtcHR5KXthWyJ4ZHA6eGRwIl09dDtyZXR1cm4gYX1pZighQXJyYXkuaXNBcnJheSh0KXx8MD09PXQubGVuZ3RoKXJldHVybiBudWxsO2ZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrPTIpe2xldCBuO249MD09PWU/InhkcDp4ZHAiOmU9PT1yLTI/Ii94ZHA6eGRwIjp0W2VdO2lmKCFhLmhhc093blByb3BlcnR5KG4pKWNvbnRpbnVlO2NvbnN0IGk9dGhpcy54cmVmLmZldGNoSWZSZWYodFtlKzFdKTtpIGluc3RhbmNlb2YgYy5CYXNlU3RyZWFtJiYhaS5pc0VtcHR5JiYoYVtuXT1pKX1yZXR1cm4gYX1nZXQgeGZhRGF0YXNldHMoKXtjb25zdCBlPXRoaXMuX3hmYVN0cmVhbXM7aWYoIWUpcmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsInhmYURhdGFzZXRzIixudWxsKTtmb3IoY29uc3QgdCBvZlsiZGF0YXNldHMiLCJ4ZHA6eGRwIl0pe2NvbnN0IGE9ZVt0XTtpZihhKXRyeXtjb25zdCBlPXtbdF06KDAsci5zdHJpbmdUb1VURjhTdHJpbmcpKGEuZ2V0U3RyaW5nKCkpfTtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywieGZhRGF0YXNldHMiLG5ldyBkLkRhdGFzZXRSZWFkZXIoZSkpfWNhdGNoeygwLHIud2FybikoIlhGQSAtIEludmFsaWQgdXRmLTggc3RyaW5nLiIpO2JyZWFrfX1yZXR1cm4oMCxyLnNoYWRvdykodGhpcywieGZhRGF0YXNldHMiLG51bGwpfWdldCB4ZmFEYXRhKCl7Y29uc3QgZT10aGlzLl94ZmFTdHJlYW1zO2lmKCFlKXJldHVybiBudWxsO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3RbYSxuXW9mIE9iamVjdC5lbnRyaWVzKGUpKWlmKG4pdHJ5e3RbYV09KDAsci5zdHJpbmdUb1VURjhTdHJpbmcpKG4uZ2V0U3RyaW5nKCkpfWNhdGNoeygwLHIud2FybikoIlhGQSAtIEludmFsaWQgdXRmLTggc3RyaW5nLiIpO3JldHVybiBudWxsfXJldHVybiB0fWdldCB4ZmFGYWN0b3J5KCl7bGV0IGU7dGhpcy5wZGZNYW5hZ2VyLmVuYWJsZVhmYSYmdGhpcy5jYXRhbG9nLm5lZWRzUmVuZGVyaW5nJiZ0aGlzLmZvcm1JbmZvLmhhc1hmYSYmIXRoaXMuZm9ybUluZm8uaGFzQWNyb0Zvcm0mJihlPXRoaXMueGZhRGF0YSk7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsInhmYUZhY3RvcnkiLGU/bmV3IHguWEZBRmFjdG9yeShlKTpudWxsKX1nZXQgaXNQdXJlWGZhKCl7cmV0dXJuISF0aGlzLnhmYUZhY3RvcnkmJnRoaXMueGZhRmFjdG9yeS5pc1ZhbGlkKCl9Z2V0IGh0bWxGb3JYZmEoKXtyZXR1cm4gdGhpcy54ZmFGYWN0b3J5P3RoaXMueGZhRmFjdG9yeS5nZXRQYWdlcygpOm51bGx9YXN5bmMgbG9hZFhmYUltYWdlcygpe2NvbnN0IGU9YXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInhmYUltYWdlcyIpO2lmKCFlKXJldHVybjtjb25zdCB0PWUuZ2V0S2V5cygpLGE9bmV3IHAuT2JqZWN0TG9hZGVyKGUsdCx0aGlzLnhyZWYpO2F3YWl0IGEubG9hZCgpO2NvbnN0IHI9bmV3IE1hcDtmb3IoY29uc3QgYSBvZiB0KXtjb25zdCB0PWUuZ2V0KGEpO3QgaW5zdGFuY2VvZiBjLkJhc2VTdHJlYW0mJnIuc2V0KGEsdC5nZXRCeXRlcygpKX10aGlzLnhmYUZhY3Rvcnkuc2V0SW1hZ2VzKHIpfWFzeW5jIGxvYWRYZmFGb250cyhlLHQpe2NvbnN0IGE9YXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIik7aWYoIWEpcmV0dXJuO2NvbnN0IG49YXdhaXQgYS5nZXRBc3luYygiRFIiKTtpZighKG4gaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybjtjb25zdCBjPW5ldyBwLk9iamVjdExvYWRlcihuLFsiRm9udCJdLHRoaXMueHJlZik7YXdhaXQgYy5sb2FkKCk7Y29uc3QgbD1uLmdldCgiRm9udCIpO2lmKCEobCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IGg9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLHRoaXMucGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zKTtoLnVzZVN5c3RlbUZvbnRzPSExO2NvbnN0IHU9bmV3IGIuUGFydGlhbEV2YWx1YXRvcih7eHJlZjp0aGlzLnhyZWYsaGFuZGxlcjplLHBhZ2VJbmRleDotMSxpZEZhY3Rvcnk6dGhpcy5fZ2xvYmFsSWRGYWN0b3J5LGZvbnRDYWNoZTp0aGlzLmNhdGFsb2cuZm9udENhY2hlLGJ1aWx0SW5DTWFwQ2FjaGU6dGhpcy5jYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuY2F0YWxvZy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsb3B0aW9uczpofSksZD1uZXcgbS5PcGVyYXRvckxpc3QsZj1bXSxnPXtnZXQgZm9udCgpe3JldHVybiBmLmF0KC0xKX0sc2V0IGZvbnQoZSl7Zi5wdXNoKGUpfSxjbG9uZSgpe3JldHVybiB0aGlzfX0seT1uZXcgTWFwO2wuZm9yRWFjaCgoKGUsdCk9Pnt5LnNldChlLHQpfSkpO2NvbnN0IHc9W107Zm9yKGNvbnN0W2UsYV1vZiB5KXtjb25zdCBvPWEuZ2V0KCJGb250RGVzY3JpcHRvciIpO2lmKCEobyBpbnN0YW5jZW9mIHMuRGljdCkpY29udGludWU7bGV0IGM9by5nZXQoIkZvbnRGYW1pbHkiKTtjPWMucmVwbGFjZUFsbCgvWyBdKyhcZCkvZywiJDEiKTtjb25zdCBsPXtmb250RmFtaWx5OmMsZm9udFdlaWdodDpvLmdldCgiRm9udFdlaWdodCIpLGl0YWxpY0FuZ2xlOi1vLmdldCgiSXRhbGljQW5nbGUiKX07KDAsaS52YWxpZGF0ZUNTU0ZvbnQpKGwpJiZ3LnB1c2godS5oYW5kbGVTZXRGb250KG4sW3MuTmFtZS5nZXQoZSksMV0sbnVsbCxkLHQsZyxudWxsLGwpLmNhdGNoKChmdW5jdGlvbihlKXsoMCxyLndhcm4pKGBsb2FkWGZhRm9udHM6ICIke2V9Ii5gKTtyZXR1cm4gbnVsbH0pKSl9YXdhaXQgUHJvbWlzZS5hbGwodyk7Y29uc3QgUz10aGlzLnhmYUZhY3Rvcnkuc2V0Rm9udHMoZik7aWYoIVMpcmV0dXJuO2guaWdub3JlRXJyb3JzPSEwO3cubGVuZ3RoPTA7Zi5sZW5ndGg9MDtjb25zdCB4PW5ldyBTZXQ7Zm9yKGNvbnN0IGUgb2YgUykoMCxvLmdldFhmYUZvbnROYW1lKShgJHtlfS1SZWd1bGFyYCl8fHguYWRkKGUpO3guc2l6ZSYmUy5wdXNoKCJQZGZKUy1GYWxsYmFjayIpO2Zvcihjb25zdCBlIG9mIFMpaWYoIXguaGFzKGUpKWZvcihjb25zdCBhIG9mW3tuYW1lOiJSZWd1bGFyIixmb250V2VpZ2h0OjQwMCxpdGFsaWNBbmdsZTowfSx7bmFtZToiQm9sZCIsZm9udFdlaWdodDo3MDAsaXRhbGljQW5nbGU6MH0se25hbWU6Ikl0YWxpYyIsZm9udFdlaWdodDo0MDAsaXRhbGljQW5nbGU6MTJ9LHtuYW1lOiJCb2xkSXRhbGljIixmb250V2VpZ2h0OjcwMCxpdGFsaWNBbmdsZToxMn1dKXtjb25zdCBpPWAke2V9LSR7YS5uYW1lfWAsYz0oMCxvLmdldFhmYUZvbnREaWN0KShpKTt3LnB1c2godS5oYW5kbGVTZXRGb250KG4sW3MuTmFtZS5nZXQoaSksMV0sbnVsbCxkLHQsZyxjLHtmb250RmFtaWx5OmUsZm9udFdlaWdodDphLmZvbnRXZWlnaHQsaXRhbGljQW5nbGU6YS5pdGFsaWNBbmdsZX0pLmNhdGNoKChmdW5jdGlvbihlKXsoMCxyLndhcm4pKGBsb2FkWGZhRm9udHM6ICIke2V9Ii5gKTtyZXR1cm4gbnVsbH0pKSl9YXdhaXQgUHJvbWlzZS5hbGwodyk7dGhpcy54ZmFGYWN0b3J5LmFwcGVuZEZvbnRzKGYseCl9YXN5bmMgc2VyaWFsaXplWGZhRGF0YShlKXtyZXR1cm4gdGhpcy54ZmFGYWN0b3J5P3RoaXMueGZhRmFjdG9yeS5zZXJpYWxpemVEYXRhKGUpOm51bGx9Z2V0IHZlcnNpb24oKXtyZXR1cm4gdGhpcy5jYXRhbG9nLnZlcnNpb258fHRoaXMuX3ZlcnNpb259Z2V0IGZvcm1JbmZvKCl7Y29uc3QgZT17aGFzRmllbGRzOiExLGhhc0Fjcm9Gb3JtOiExLGhhc1hmYTohMSxoYXNTaWduYXR1cmVzOiExfSx0PXRoaXMuY2F0YWxvZy5hY3JvRm9ybTtpZighdClyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiZm9ybUluZm8iLGUpO3RyeXtjb25zdCBhPXQuZ2V0KCJGaWVsZHMiKSxyPUFycmF5LmlzQXJyYXkoYSkmJmEubGVuZ3RoPjA7ZS5oYXNGaWVsZHM9cjtjb25zdCBuPXQuZ2V0KCJYRkEiKTtlLmhhc1hmYT1BcnJheS5pc0FycmF5KG4pJiZuLmxlbmd0aD4wfHxuIGluc3RhbmNlb2YgYy5CYXNlU3RyZWFtJiYhbi5pc0VtcHR5O2NvbnN0IGk9ISEoMSZ0LmdldCgiU2lnRmxhZ3MiKSkscz1pJiZ0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGEpO2UuaGFzQWNyb0Zvcm09ciYmIXM7ZS5oYXNTaWduYXR1cmVzPWl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGkuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxyLndhcm4pKGBDYW5ub3QgZmV0Y2ggZm9ybSBpbmZvcm1hdGlvbjogIiR7ZX0iLmApfXJldHVybigwLHIuc2hhZG93KSh0aGlzLCJmb3JtSW5mbyIsZSl9Z2V0IGRvY3VtZW50SW5mbygpe2NvbnN0IGU9e1BERkZvcm1hdFZlcnNpb246dGhpcy52ZXJzaW9uLExhbmd1YWdlOnRoaXMuY2F0YWxvZy5sYW5nLEVuY3J5cHRGaWx0ZXJOYW1lOnRoaXMueHJlZi5lbmNyeXB0P3RoaXMueHJlZi5lbmNyeXB0LmZpbHRlck5hbWU6bnVsbCxJc0xpbmVhcml6ZWQ6ISF0aGlzLmxpbmVhcml6YXRpb24sSXNBY3JvRm9ybVByZXNlbnQ6dGhpcy5mb3JtSW5mby5oYXNBY3JvRm9ybSxJc1hGQVByZXNlbnQ6dGhpcy5mb3JtSW5mby5oYXNYZmEsSXNDb2xsZWN0aW9uUHJlc2VudDohIXRoaXMuY2F0YWxvZy5jb2xsZWN0aW9uLElzU2lnbmF0dXJlc1ByZXNlbnQ6dGhpcy5mb3JtSW5mby5oYXNTaWduYXR1cmVzfTtsZXQgdDt0cnl7dD10aGlzLnhyZWYudHJhaWxlci5nZXQoIkluZm8iKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgaS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLHIuaW5mbykoIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIil9aWYoISh0IGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiZG9jdW1lbnRJbmZvIixlKTtmb3IoY29uc3QgYSBvZiB0LmdldEtleXMoKSl7Y29uc3Qgbj10LmdldChhKTtzd2l0Y2goYSl7Y2FzZSJUaXRsZSI6Y2FzZSJBdXRob3IiOmNhc2UiU3ViamVjdCI6Y2FzZSJLZXl3b3JkcyI6Y2FzZSJDcmVhdG9yIjpjYXNlIlByb2R1Y2VyIjpjYXNlIkNyZWF0aW9uRGF0ZSI6Y2FzZSJNb2REYXRlIjppZigic3RyaW5nIj09dHlwZW9mIG4pe2VbYV09KDAsci5zdHJpbmdUb1BERlN0cmluZykobik7Y29udGludWV9YnJlYWs7Y2FzZSJUcmFwcGVkIjppZihuIGluc3RhbmNlb2Ygcy5OYW1lKXtlW2FdPW47Y29udGludWV9YnJlYWs7ZGVmYXVsdDpsZXQgdDtzd2l0Y2godHlwZW9mIG4pe2Nhc2Uic3RyaW5nIjp0PSgwLHIuc3RyaW5nVG9QREZTdHJpbmcpKG4pO2JyZWFrO2Nhc2UibnVtYmVyIjpjYXNlImJvb2xlYW4iOnQ9bjticmVhaztkZWZhdWx0Om4gaW5zdGFuY2VvZiBzLk5hbWUmJih0PW4pfWlmKHZvaWQgMD09PXQpeygwLHIud2FybikoYEJhZCB2YWx1ZSwgZm9yIGN1c3RvbSBrZXkgIiR7YX0iLCBpbiBJbmZvOiAke259LmApO2NvbnRpbnVlfWUuQ3VzdG9tfHwoZS5DdXN0b209T2JqZWN0LmNyZWF0ZShudWxsKSk7ZS5DdXN0b21bYV09dDtjb250aW51ZX0oMCxyLndhcm4pKGBCYWQgdmFsdWUsIGZvciBrZXkgIiR7YX0iLCBpbiBJbmZvOiAke259LmApfXJldHVybigwLHIuc2hhZG93KSh0aGlzLCJkb2N1bWVudEluZm8iLGUpfWdldCBmaW5nZXJwcmludHMoKXtmdW5jdGlvbiB2YWxpZGF0ZShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJmUubGVuZ3RoPjAmJiJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIhPT1lfWZ1bmN0aW9uIGhleFN0cmluZyhlKXtjb25zdCB0PVtdO2Zvcihjb25zdCBhIG9mIGUpe2NvbnN0IGU9YS50b1N0cmluZygxNik7dC5wdXNoKGUucGFkU3RhcnQoMiwiMCIpKX1yZXR1cm4gdC5qb2luKCIiKX1jb25zdCBlPXRoaXMueHJlZi50cmFpbGVyLmdldCgiSUQiKTtsZXQgdCxhO2lmKEFycmF5LmlzQXJyYXkoZSkmJnZhbGlkYXRlKGVbMF0pKXt0PSgwLHIuc3RyaW5nVG9CeXRlcykoZVswXSk7ZVsxXSE9PWVbMF0mJnZhbGlkYXRlKGVbMV0pJiYoYT0oMCxyLnN0cmluZ1RvQnl0ZXMpKGVbMV0pKX1lbHNlIHQ9KDAsbC5jYWxjdWxhdGVNRDUpKHRoaXMuc3RyZWFtLmdldEJ5dGVSYW5nZSgwLDEwMjQpLDAsMTAyNCk7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsImZpbmdlcnByaW50cyIsW2hleFN0cmluZyh0KSxhP2hleFN0cmluZyhhKTpudWxsXSl9YXN5bmMgX2dldExpbmVhcml6YXRpb25QYWdlKGUpe2NvbnN0e2NhdGFsb2c6dCxsaW5lYXJpemF0aW9uOmEseHJlZjpufT10aGlzLGk9cy5SZWYuZ2V0KGEub2JqZWN0TnVtYmVyRmlyc3QsMCk7dHJ5e2NvbnN0IGU9YXdhaXQgbi5mZXRjaEFzeW5jKGkpO2lmKGUgaW5zdGFuY2VvZiBzLkRpY3Qpe2xldCBhPWUuZ2V0UmF3KCJUeXBlIik7YSBpbnN0YW5jZW9mIHMuUmVmJiYoYT1hd2FpdCBuLmZldGNoQXN5bmMoYSkpO2lmKCgwLHMuaXNOYW1lKShhLCJQYWdlIil8fCFlLmhhcygiVHlwZSIpJiYhZS5oYXMoIktpZHMiKSl7dC5wYWdlS2lkc0NvdW50Q2FjaGUuaGFzKGkpfHx0LnBhZ2VLaWRzQ291bnRDYWNoZS5wdXQoaSwxKTt0LnBhZ2VJbmRleENhY2hlLmhhcyhpKXx8dC5wYWdlSW5kZXhDYWNoZS5wdXQoaSwwKTtyZXR1cm5bZSxpXX19dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIlRoZSBMaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgZG9lc24ndCBwb2ludCB0byBhIHZhbGlkIFBhZ2UgZGljdGlvbmFyeS4iKX1jYXRjaChhKXsoMCxyLndhcm4pKGBfZ2V0TGluZWFyaXphdGlvblBhZ2U6ICIke2EubWVzc2FnZX0iLmApO3JldHVybiB0LmdldFBhZ2VEaWN0KGUpfX1nZXRQYWdlKGUpe2NvbnN0IHQ9dGhpcy5fcGFnZVByb21pc2VzLmdldChlKTtpZih0KXJldHVybiB0O2NvbnN0e2NhdGFsb2c6YSxsaW5lYXJpemF0aW9uOnIseGZhRmFjdG9yeTpufT10aGlzO2xldCBpO2k9bj9Qcm9taXNlLnJlc29sdmUoW3MuRGljdC5lbXB0eSxudWxsXSk6cj8ucGFnZUZpcnN0PT09ZT90aGlzLl9nZXRMaW5lYXJpemF0aW9uUGFnZShlKTphLmdldFBhZ2VEaWN0KGUpO2k9aS50aGVuKCh0PT57bGV0W3IsaV09dDtyZXR1cm4gbmV3IFBhZ2Uoe3BkZk1hbmFnZXI6dGhpcy5wZGZNYW5hZ2VyLHhyZWY6dGhpcy54cmVmLHBhZ2VJbmRleDplLHBhZ2VEaWN0OnIscmVmOmksZ2xvYmFsSWRGYWN0b3J5OnRoaXMuX2dsb2JhbElkRmFjdG9yeSxmb250Q2FjaGU6YS5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTphLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOmEuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6YS5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTphLnN5c3RlbUZvbnRDYWNoZSxub25CbGVuZE1vZGVzU2V0OmEubm9uQmxlbmRNb2Rlc1NldCx4ZmFGYWN0b3J5Om59KX0pKTt0aGlzLl9wYWdlUHJvbWlzZXMuc2V0KGUsaSk7cmV0dXJuIGl9YXN5bmMgY2hlY2tGaXJzdFBhZ2UoKXtpZighKGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF0pKXRyeXthd2FpdCB0aGlzLmdldFBhZ2UoMCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGkuWFJlZkVudHJ5RXhjZXB0aW9uKXt0aGlzLl9wYWdlUHJvbWlzZXMuZGVsZXRlKDApO2F3YWl0IHRoaXMuY2xlYW51cCgpO3Rocm93IG5ldyBpLlhSZWZQYXJzZUV4Y2VwdGlvbn19fWFzeW5jIGNoZWNrTGFzdFBhZ2UoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0e2NhdGFsb2c6dCxwZGZNYW5hZ2VyOmF9PXRoaXM7dC5zZXRBY3R1YWxOdW1QYWdlcygpO2xldCBuO3RyeXthd2FpdCBQcm9taXNlLmFsbChbYS5lbnN1cmVEb2MoInhmYUZhY3RvcnkiKSxhLmVuc3VyZURvYygibGluZWFyaXphdGlvbiIpLGEuZW5zdXJlQ2F0YWxvZygibnVtUGFnZXMiKV0pO2lmKHRoaXMueGZhRmFjdG9yeSlyZXR1cm47bj10aGlzLmxpbmVhcml6YXRpb24/dGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOnQubnVtUGFnZXM7aWYoIU51bWJlci5pc0ludGVnZXIobikpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIlBhZ2UgY291bnQgaXMgbm90IGFuIGludGVnZXIuIik7aWYobjw9MSlyZXR1cm47YXdhaXQgdGhpcy5nZXRQYWdlKG4tMSl9Y2F0Y2gocyl7dGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZShuLTEpO2F3YWl0IHRoaXMuY2xlYW51cCgpO2lmKHMgaW5zdGFuY2VvZiBpLlhSZWZFbnRyeUV4Y2VwdGlvbiYmIWUpdGhyb3cgbmV3IGkuWFJlZlBhcnNlRXhjZXB0aW9uOygwLHIud2FybikoYGNoZWNrTGFzdFBhZ2UgLSBpbnZhbGlkIC9QYWdlcyB0cmVlIC9Db3VudDogJHtufS5gKTtsZXQgbzt0cnl7bz1hd2FpdCB0LmdldEFsbFBhZ2VEaWN0cyhlKX1jYXRjaChhKXtpZihhIGluc3RhbmNlb2YgaS5YUmVmRW50cnlFeGNlcHRpb24mJiFlKXRocm93IG5ldyBpLlhSZWZQYXJzZUV4Y2VwdGlvbjt0LnNldEFjdHVhbE51bVBhZ2VzKDEpO3JldHVybn1mb3IoY29uc3RbZSxbcixuXV1vZiBvKXtsZXQgaTtpZihyIGluc3RhbmNlb2YgRXJyb3Ipe2k9UHJvbWlzZS5yZWplY3Qocik7aS5jYXRjaCgoKCk9Pnt9KSl9ZWxzZSBpPVByb21pc2UucmVzb2x2ZShuZXcgUGFnZSh7cGRmTWFuYWdlcjphLHhyZWY6dGhpcy54cmVmLHBhZ2VJbmRleDplLHBhZ2VEaWN0OnIscmVmOm4sZ2xvYmFsSWRGYWN0b3J5OnRoaXMuX2dsb2JhbElkRmFjdG9yeSxmb250Q2FjaGU6dC5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0LmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnQuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dC5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0LnN5c3RlbUZvbnRDYWNoZSxub25CbGVuZE1vZGVzU2V0OnQubm9uQmxlbmRNb2Rlc1NldCx4ZmFGYWN0b3J5Om51bGx9KSk7dGhpcy5fcGFnZVByb21pc2VzLnNldChlLGkpfXQuc2V0QWN0dWFsTnVtUGFnZXMoby5zaXplKX19Zm9udEZhbGxiYWNrKGUsdCl7cmV0dXJuIHRoaXMuY2F0YWxvZy5mb250RmFsbGJhY2soZSx0KX1hc3luYyBjbGVhbnVwKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jYXRhbG9nP3RoaXMuY2F0YWxvZy5jbGVhbnVwKGUpOigwLHUuY2xlYXJHbG9iYWxDYWNoZXMpKCl9X2NvbGxlY3RGaWVsZE9iamVjdHMoZSx0LGEpe2NvbnN0IGk9dGhpcy54cmVmLmZldGNoSWZSZWYodCk7aWYoaS5oYXMoIlQiKSl7Y29uc3QgdD0oMCxyLnN0cmluZ1RvUERGU3RyaW5nKShpLmdldCgiVCIpKTtlPSIiPT09ZT90OmAke2V9LiR7dH1gfSFpLmhhcygiS2lkcyIpJiYvXFtcZCtcXSQvLnRlc3QoZSkmJihlPWUuc3Vic3RyaW5nKDAsZS5sYXN0SW5kZXhPZigiWyIpKSk7YS5oYXMoZSl8fGEuc2V0KGUsW10pO2EuZ2V0KGUpLnB1c2gobi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUodGhpcy54cmVmLHQsdGhpcy5wZGZNYW5hZ2VyLHRoaXMuX2xvY2FsSWRGYWN0b3J5LCEwKS50aGVuKChlPT5lPy5nZXRGaWVsZE9iamVjdCgpKSkuY2F0Y2goKGZ1bmN0aW9uKGUpeygwLHIud2FybikoYF9jb2xsZWN0RmllbGRPYmplY3RzOiAiJHtlfSIuYCk7cmV0dXJuIG51bGx9KSkpO2lmKGkuaGFzKCJLaWRzIikpe2NvbnN0IHQ9aS5nZXQoIktpZHMiKTtmb3IoY29uc3QgciBvZiB0KXRoaXMuX2NvbGxlY3RGaWVsZE9iamVjdHMoZSxyLGEpfX1nZXQgZmllbGRPYmplY3RzKCl7aWYoIXRoaXMuZm9ybUluZm8uaGFzRmllbGRzKXJldHVybigwLHIuc2hhZG93KSh0aGlzLCJmaWVsZE9iamVjdHMiLFByb21pc2UucmVzb2x2ZShudWxsKSk7Y29uc3QgZT1PYmplY3QuY3JlYXRlKG51bGwpLHQ9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiB0aGlzLmNhdGFsb2cuYWNyb0Zvcm0uZ2V0KCJGaWVsZHMiKSl0aGlzLl9jb2xsZWN0RmllbGRPYmplY3RzKCIiLGUsdCk7Y29uc3QgYT1bXTtmb3IoY29uc3RbcixuXW9mIHQpYS5wdXNoKFByb21pc2UuYWxsKG4pLnRoZW4oKHQ9PnsodD10LmZpbHRlcigoZT0+ISFlKSkpLmxlbmd0aD4wJiYoZVtyXT10KX0pKSk7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsImZpZWxkT2JqZWN0cyIsUHJvbWlzZS5hbGwoYSkudGhlbigoKCk9PmUpKSl9Z2V0IGhhc0pTQWN0aW9ucygpe2NvbnN0IGU9dGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiX3BhcnNlSGFzSlNBY3Rpb25zIik7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsImhhc0pTQWN0aW9ucyIsZSl9YXN5bmMgX3BhcnNlSGFzSlNBY3Rpb25zKCl7Y29uc3RbZSx0XT1hd2FpdCBQcm9taXNlLmFsbChbdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImpzQWN0aW9ucyIpLHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpXSk7cmV0dXJuISFlfHwhIXQmJk9iamVjdC52YWx1ZXModCkuc29tZSgoZT0+ZS5zb21lKChlPT5udWxsIT09ZS5hY3Rpb25zKSkpKX1nZXQgY2FsY3VsYXRpb25PcmRlcklkcygpe2NvbnN0IGU9dGhpcy5jYXRhbG9nLmFjcm9Gb3JtO2lmKCFlPy5oYXMoIkNPIikpcmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsImNhbGN1bGF0aW9uT3JkZXJJZHMiLG51bGwpO2NvbnN0IHQ9ZS5nZXQoIkNPIik7aWYoIUFycmF5LmlzQXJyYXkodCl8fDA9PT10Lmxlbmd0aClyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiY2FsY3VsYXRpb25PcmRlcklkcyIsbnVsbCk7Y29uc3QgYT1bXTtmb3IoY29uc3QgZSBvZiB0KWUgaW5zdGFuY2VvZiBzLlJlZiYmYS5wdXNoKGUudG9TdHJpbmcoKSk7cmV0dXJuIDA9PT1hLmxlbmd0aD8oMCxyLnNoYWRvdykodGhpcywiY2FsY3VsYXRpb25PcmRlcklkcyIsbnVsbCk6KDAsci5zaGFkb3cpKHRoaXMsImNhbGN1bGF0aW9uT3JkZXJJZHMiLGEpfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuUG9wdXBBbm5vdGF0aW9uPXQuTWFya3VwQW5ub3RhdGlvbj10LkFubm90YXRpb25GYWN0b3J5PXQuQW5ub3RhdGlvbkJvcmRlclN0eWxlPXQuQW5ub3RhdGlvbj12b2lkIDA7dC5nZXRRdWFkUG9pbnRzPWdldFF1YWRQb2ludHM7YSgxMzkpO2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTthKDE1Nyk7YSgxNTkpO3ZhciByPWEoMTQ0KSxuPWEoMTQ5KSxpPWEoMTYxKSxzPWEoMTUwKSxvPWEoMTU0KSxjPWEoMjE2KSxsPWEoMTUxKSxoPWEoMjEwKSx1PWEoMjIwKSxkPWEoMTYyKSxmPWEoMjIzKSxnPWEoMTc2KSxwPWEoMjI2KSxtPWEoMjE0KSxiPWEoMjI3KTt0LkFubm90YXRpb25GYWN0b3J5PWNsYXNzIEFubm90YXRpb25GYWN0b3J5e3N0YXRpYyBjcmVhdGUoZSx0LGEscixuKXtyZXR1cm4gUHJvbWlzZS5hbGwoW2EuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKSxhLmVuc3VyZUNhdGFsb2coImJhc2VVcmwiKSxhLmVuc3VyZUNhdGFsb2coImF0dGFjaG1lbnRzIiksYS5lbnN1cmVEb2MoInhmYURhdGFzZXRzIiksbj90aGlzLl9nZXRQYWdlSW5kZXgoZSx0LGEpOi0xXSkudGhlbigoaT0+e2xldFtzLG8sYyxsLGhdPWk7cmV0dXJuIGEuZW5zdXJlKHRoaXMsIl9jcmVhdGUiLFtlLHQsYSxyLHMsYyxsLG4saF0pfSkpfXN0YXRpYyBfY3JlYXRlKGUsdCxhLGksbyl7bGV0IGM9YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOm51bGwsbD1hcmd1bWVudHMubGVuZ3RoPjY/YXJndW1lbnRzWzZdOnZvaWQgMCxoPWFyZ3VtZW50cy5sZW5ndGg+Nz9hcmd1bWVudHNbN106dm9pZCAwLHU9YXJndW1lbnRzLmxlbmd0aD44JiZ2b2lkIDAhPT1hcmd1bWVudHNbOF0/YXJndW1lbnRzWzhdOi0xO2NvbnN0IGQ9ZS5mZXRjaElmUmVmKHQpO2lmKCEoZCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IGY9dCBpbnN0YW5jZW9mIHMuUmVmP3QudG9TdHJpbmcoKTpgYW5ub3RfJHtpLmNyZWF0ZU9iaklkKCl9YDtsZXQgZz1kLmdldCgiU3VidHlwZSIpO2c9ZyBpbnN0YW5jZW9mIHMuTmFtZT9nLm5hbWU6bnVsbDtjb25zdCBwPW8gaW5zdGFuY2VvZiBzLkRpY3Q/bzpzLkRpY3QuZW1wdHksbT17eHJlZjplLHJlZjp0LGRpY3Q6ZCxzdWJ0eXBlOmcsaWQ6ZixwZGZNYW5hZ2VyOmEsYWNyb0Zvcm06cCxhdHRhY2htZW50czpjLHhmYURhdGFzZXRzOmwsY29sbGVjdEZpZWxkczpoLG5lZWRBcHBlYXJhbmNlczohaCYmITA9PT1wLmdldCgiTmVlZEFwcGVhcmFuY2VzIikscGFnZUluZGV4OnUsZXZhbHVhdG9yT3B0aW9uczphLmV2YWx1YXRvck9wdGlvbnN9O3N3aXRjaChnKXtjYXNlIkxpbmsiOnJldHVybiBuZXcgTGlua0Fubm90YXRpb24obSk7Y2FzZSJUZXh0IjpyZXR1cm4gbmV3IFRleHRBbm5vdGF0aW9uKG0pO2Nhc2UiV2lkZ2V0IjpsZXQgZT0oMCxuLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OmQsa2V5OiJGVCJ9KTtlPWUgaW5zdGFuY2VvZiBzLk5hbWU/ZS5uYW1lOm51bGw7c3dpdGNoKGUpe2Nhc2UiVHgiOnJldHVybiBuZXcgVGV4dFdpZGdldEFubm90YXRpb24obSk7Y2FzZSJCdG4iOnJldHVybiBuZXcgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbihtKTtjYXNlIkNoIjpyZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb24obSk7Y2FzZSJTaWciOnJldHVybiBuZXcgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbihtKX0oMCxyLndhcm4pKGBVbmltcGxlbWVudGVkIHdpZGdldCBmaWVsZCB0eXBlICIke2V9IiwgZmFsbGluZyBiYWNrIHRvIGJhc2UgZmllbGQgdHlwZS5gKTtyZXR1cm4gbmV3IFdpZGdldEFubm90YXRpb24obSk7Y2FzZSJQb3B1cCI6cmV0dXJuIG5ldyBQb3B1cEFubm90YXRpb24obSk7Y2FzZSJGcmVlVGV4dCI6cmV0dXJuIG5ldyBGcmVlVGV4dEFubm90YXRpb24obSk7Y2FzZSJMaW5lIjpyZXR1cm4gbmV3IExpbmVBbm5vdGF0aW9uKG0pO2Nhc2UiU3F1YXJlIjpyZXR1cm4gbmV3IFNxdWFyZUFubm90YXRpb24obSk7Y2FzZSJDaXJjbGUiOnJldHVybiBuZXcgQ2lyY2xlQW5ub3RhdGlvbihtKTtjYXNlIlBvbHlMaW5lIjpyZXR1cm4gbmV3IFBvbHlsaW5lQW5ub3RhdGlvbihtKTtjYXNlIlBvbHlnb24iOnJldHVybiBuZXcgUG9seWdvbkFubm90YXRpb24obSk7Y2FzZSJDYXJldCI6cmV0dXJuIG5ldyBDYXJldEFubm90YXRpb24obSk7Y2FzZSJJbmsiOnJldHVybiBuZXcgSW5rQW5ub3RhdGlvbihtKTtjYXNlIkhpZ2hsaWdodCI6cmV0dXJuIG5ldyBIaWdobGlnaHRBbm5vdGF0aW9uKG0pO2Nhc2UiVW5kZXJsaW5lIjpyZXR1cm4gbmV3IFVuZGVybGluZUFubm90YXRpb24obSk7Y2FzZSJTcXVpZ2dseSI6cmV0dXJuIG5ldyBTcXVpZ2dseUFubm90YXRpb24obSk7Y2FzZSJTdHJpa2VPdXQiOnJldHVybiBuZXcgU3RyaWtlT3V0QW5ub3RhdGlvbihtKTtjYXNlIlN0YW1wIjpyZXR1cm4gbmV3IFN0YW1wQW5ub3RhdGlvbihtKTtjYXNlIkZpbGVBdHRhY2htZW50IjpyZXR1cm4gbmV3IEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbihtKTtkZWZhdWx0Omh8fChnPygwLHIud2FybikoYFVuaW1wbGVtZW50ZWQgYW5ub3RhdGlvbiB0eXBlICIke2d9IiwgZmFsbGluZyBiYWNrIHRvIGJhc2UgYW5ub3RhdGlvbi5gKTooMCxyLndhcm4pKCJBbm5vdGF0aW9uIGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIC9TdWJ0eXBlLiIpKTtyZXR1cm4gbmV3IEFubm90YXRpb24obSl9fXN0YXRpYyBhc3luYyBfZ2V0UGFnZUluZGV4KGUsdCxhKXt0cnl7Y29uc3Qgcj1hd2FpdCBlLmZldGNoSWZSZWZBc3luYyh0KTtpZighKHIgaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybi0xO2NvbnN0IG49ci5nZXRSYXcoIlAiKTtpZighKG4gaW5zdGFuY2VvZiBzLlJlZikpcmV0dXJuLTE7cmV0dXJuIGF3YWl0IGEuZW5zdXJlQ2F0YWxvZygiZ2V0UGFnZUluZGV4Iixbbl0pfWNhdGNoKGUpeygwLHIud2FybikoYF9nZXRQYWdlSW5kZXg6ICIke2V9Ii5gKTtyZXR1cm4tMX19c3RhdGljIGdlbmVyYXRlSW1hZ2VzKGUsdCxhKXtpZighYSl7KDAsci53YXJuKSgiZ2VuZXJhdGVJbWFnZXM6IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkLCBjYW5ub3Qgc2F2ZSBvciBwcmludCBzb21lIGFubm90YXRpb25zIHdpdGggaW1hZ2VzLiIpO3JldHVybiBudWxsfWxldCBuO2Zvcihjb25zdHtiaXRtYXBJZDphLGJpdG1hcDpyfW9mIGUpaWYocil7bnx8PW5ldyBNYXA7bi5zZXQoYSxTdGFtcEFubm90YXRpb24uY3JlYXRlSW1hZ2Uocix0KSl9cmV0dXJuIG59c3RhdGljIGFzeW5jIHNhdmVOZXdBbm5vdGF0aW9ucyhlLHQsYSxuKXtjb25zdCBpPWUueHJlZjtsZXQgbztjb25zdCBsPVtdLGg9W10se2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOnV9PWUub3B0aW9ucztmb3IoY29uc3QgZCBvZiBhKWlmKCFkLmRlbGV0ZWQpc3dpdGNoKGQuYW5ub3RhdGlvblR5cGUpe2Nhc2Ugci5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDppZighbyl7Y29uc3QgZT1uZXcgcy5EaWN0KGkpO2Uuc2V0KCJCYXNlRm9udCIscy5OYW1lLmdldCgiSGVsdmV0aWNhIikpO2Uuc2V0KCJUeXBlIixzLk5hbWUuZ2V0KCJGb250IikpO2Uuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJUeXBlMSIpKTtlLnNldCgiRW5jb2RpbmciLHMuTmFtZS5nZXQoIldpbkFuc2lFbmNvZGluZyIpKTtjb25zdCB0PVtdO289aS5nZXROZXdUZW1wb3JhcnlSZWYoKTthd2FpdCgwLGMud3JpdGVPYmplY3QpKG8sZSx0LG51bGwpO2wucHVzaCh7cmVmOm8sZGF0YTp0LmpvaW4oIiIpfSl9aC5wdXNoKEZyZWVUZXh0QW5ub3RhdGlvbi5jcmVhdGVOZXdBbm5vdGF0aW9uKGksZCxsLHtldmFsdWF0b3I6ZSx0YXNrOnQsYmFzZUZvbnRSZWY6b30pKTticmVhaztjYXNlIHIuQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LOmgucHVzaChJbmtBbm5vdGF0aW9uLmNyZWF0ZU5ld0Fubm90YXRpb24oaSxkLGwpKTticmVhaztjYXNlIHIuQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVA6aWYoIXUpYnJlYWs7Y29uc3QgYT1hd2FpdCBuLmdldChkLmJpdG1hcElkKTtpZihhLmltYWdlU3RyZWFtKXtjb25zdHtpbWFnZVN0cmVhbTplLHNtYXNrU3RyZWFtOnR9PWEscj1bXTtpZih0KXtjb25zdCBhPWkuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7YXdhaXQoMCxjLndyaXRlT2JqZWN0KShhLHQscixudWxsKTtsLnB1c2goe3JlZjphLGRhdGE6ci5qb2luKCIiKX0pO2UuZGljdC5zZXQoIlNNYXNrIixhKTtyLmxlbmd0aD0wfWNvbnN0IG49YS5pbWFnZVJlZj1pLmdldE5ld1RlbXBvcmFyeVJlZigpO2F3YWl0KDAsYy53cml0ZU9iamVjdCkobixlLHIsbnVsbCk7bC5wdXNoKHtyZWY6bixkYXRhOnIuam9pbigiIil9KTthLmltYWdlU3RyZWFtPWEuc21hc2tTdHJlYW09bnVsbH1oLnB1c2goU3RhbXBBbm5vdGF0aW9uLmNyZWF0ZU5ld0Fubm90YXRpb24oaSxkLGwse2ltYWdlOmF9KSl9cmV0dXJue2Fubm90YXRpb25zOmF3YWl0IFByb21pc2UuYWxsKGgpLGRlcGVuZGVuY2llczpsfX1zdGF0aWMgYXN5bmMgcHJpbnROZXdBbm5vdGF0aW9ucyhlLHQsYSxuKXtpZighYSlyZXR1cm4gbnVsbDtjb25zdHtvcHRpb25zOmkseHJlZjpzfT1lLG89W107Zm9yKGNvbnN0IGMgb2YgYSlpZighYy5kZWxldGVkKXN3aXRjaChjLmFubm90YXRpb25UeXBlKXtjYXNlIHIuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6by5wdXNoKEZyZWVUZXh0QW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24ocyxjLHtldmFsdWF0b3I6ZSx0YXNrOnQsZXZhbHVhdG9yT3B0aW9uczppfSkpO2JyZWFrO2Nhc2Ugci5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks6by5wdXNoKElua0Fubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKHMsYyx7ZXZhbHVhdG9yT3B0aW9uczppfSkpO2JyZWFrO2Nhc2Ugci5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5TVEFNUDppZighaS5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZClicmVhaztjb25zdCBhPWF3YWl0IG4uZ2V0KGMuYml0bWFwSWQpO2lmKGEuaW1hZ2VTdHJlYW0pe2NvbnN0e2ltYWdlU3RyZWFtOmUsc21hc2tTdHJlYW06dH09YTt0JiZlLmRpY3Quc2V0KCJTTWFzayIsdCk7YS5pbWFnZVJlZj1uZXcgZy5KcGVnU3RyZWFtKGUsZS5sZW5ndGgpO2EuaW1hZ2VTdHJlYW09YS5zbWFza1N0cmVhbT1udWxsfW8ucHVzaChTdGFtcEFubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKHMsYyx7aW1hZ2U6YSxldmFsdWF0b3JPcHRpb25zOml9KSl9cmV0dXJuIFByb21pc2UuYWxsKG8pfX07ZnVuY3Rpb24gZ2V0UmdiQ29sb3IoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdDtjb25zdCBhPXR8fG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbnVsbDtjYXNlIDE6ZC5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2JJdGVtKGUsMCxhLDApO3JldHVybiBhO2Nhc2UgMzpkLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiSXRlbShlLDAsYSwwKTtyZXR1cm4gYTtjYXNlIDQ6ZC5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2JJdGVtKGUsMCxhLDApO3JldHVybiBhO2RlZmF1bHQ6cmV0dXJuIHR9fWZ1bmN0aW9uIGdldFBkZkNvbG9yQXJyYXkoZSl7cmV0dXJuIEFycmF5LmZyb20oZSwoZT0+ZS8yNTUpKX1mdW5jdGlvbiBnZXRRdWFkUG9pbnRzKGUsdCl7Y29uc3QgYT1lLmdldEFycmF5KCJRdWFkUG9pbnRzIik7aWYoIUFycmF5LmlzQXJyYXkoYSl8fDA9PT1hLmxlbmd0aHx8YS5sZW5ndGglOD4wKXJldHVybiBudWxsO2NvbnN0IHI9W107Zm9yKGxldCBlPTAsbj1hLmxlbmd0aC84O2U8bjtlKyspe2xldCBuPTEvMCxpPS0xLzAscz0xLzAsbz0tMS8wO2ZvcihsZXQgdD04KmUscj04KmUrODt0PHI7dCs9Mil7Y29uc3QgZT1hW3RdLHI9YVt0KzFdO249TWF0aC5taW4oZSxuKTtpPU1hdGgubWF4KGUsaSk7cz1NYXRoLm1pbihyLHMpO289TWF0aC5tYXgocixvKX1pZihudWxsIT09dCYmKG48dFswXXx8aT50WzJdfHxzPHRbMV18fG8+dFszXSkpcmV0dXJuIG51bGw7ci5wdXNoKFt7eDpuLHk6b30se3g6aSx5Om99LHt4Om4seTpzfSx7eDppLHk6c31dKX1yZXR1cm4gcn1mdW5jdGlvbiBnZXRUcmFuc2Zvcm1NYXRyaXgoZSx0LGEpe2NvbnN0W24saSxzLG9dPXIuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveCh0LGEpO2lmKG49PT1zfHxpPT09bylyZXR1cm5bMSwwLDAsMSxlWzBdLGVbMV1dO2NvbnN0IGM9KGVbMl0tZVswXSkvKHMtbiksbD0oZVszXS1lWzFdKS8oby1pKTtyZXR1cm5bYywwLDAsbCxlWzBdLW4qYyxlWzFdLWkqbF19Y2xhc3MgQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtjb25zdHtkaWN0OnQseHJlZjphfT1lO3RoaXMuc2V0VGl0bGUodC5nZXQoIlQiKSk7dGhpcy5zZXRDb250ZW50cyh0LmdldCgiQ29udGVudHMiKSk7dGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKHQuZ2V0KCJNIikpO3RoaXMuc2V0RmxhZ3ModC5nZXQoIkYiKSk7dGhpcy5zZXRSZWN0YW5nbGUodC5nZXRBcnJheSgiUmVjdCIpKTt0aGlzLnNldENvbG9yKHQuZ2V0QXJyYXkoIkMiKSk7dGhpcy5zZXRCb3JkZXJTdHlsZSh0KTt0aGlzLnNldEFwcGVhcmFuY2UodCk7dGhpcy5zZXRPcHRpb25hbENvbnRlbnQodCk7Y29uc3QgaT10LmdldCgiTUsiKTt0aGlzLnNldEJvcmRlckFuZEJhY2tncm91bmRDb2xvcnMoaSk7dGhpcy5zZXRSb3RhdGlvbihpLHQpO3RoaXMucmVmPWUucmVmIGluc3RhbmNlb2Ygcy5SZWY/ZS5yZWY6bnVsbDt0aGlzLl9zdHJlYW1zPVtdO3RoaXMuYXBwZWFyYW5jZSYmdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuYXBwZWFyYW5jZSk7Y29uc3Qgbz0hISh0aGlzLmZsYWdzJnIuQW5ub3RhdGlvbkZsYWcuTE9DS0VEKSxjPSEhKHRoaXMuZmxhZ3Mmci5Bbm5vdGF0aW9uRmxhZy5MT0NLRURDT05URU5UUyk7dGhpcy5kYXRhPXthbm5vdGF0aW9uRmxhZ3M6dGhpcy5mbGFncyxib3JkZXJTdHlsZTp0aGlzLmJvcmRlclN0eWxlLGNvbG9yOnRoaXMuY29sb3IsYmFja2dyb3VuZENvbG9yOnRoaXMuYmFja2dyb3VuZENvbG9yLGJvcmRlckNvbG9yOnRoaXMuYm9yZGVyQ29sb3Iscm90YXRpb246dGhpcy5yb3RhdGlvbixjb250ZW50c09iajp0aGlzLl9jb250ZW50cyxoYXNBcHBlYXJhbmNlOiEhdGhpcy5hcHBlYXJhbmNlLGlkOmUuaWQsbW9kaWZpY2F0aW9uRGF0ZTp0aGlzLm1vZGlmaWNhdGlvbkRhdGUscmVjdDp0aGlzLnJlY3RhbmdsZSxzdWJ0eXBlOmUuc3VidHlwZSxoYXNPd25DYW52YXM6ITEsbm9Sb3RhdGU6ISEodGhpcy5mbGFncyZyLkFubm90YXRpb25GbGFnLk5PUk9UQVRFKSxub0hUTUw6byYmY307aWYoZS5jb2xsZWN0RmllbGRzKXtjb25zdCBpPXQuZ2V0KCJLaWRzIik7aWYoQXJyYXkuaXNBcnJheShpKSl7Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiBpKXQgaW5zdGFuY2VvZiBzLlJlZiYmZS5wdXNoKHQudG9TdHJpbmcoKSk7MCE9PWUubGVuZ3RoJiYodGhpcy5kYXRhLmtpZElkcz1lKX10aGlzLmRhdGEuYWN0aW9ucz0oMCxuLmNvbGxlY3RBY3Rpb25zKShhLHQsci5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlKTt0aGlzLmRhdGEuZmllbGROYW1lPXRoaXMuX2NvbnN0cnVjdEZpZWxkTmFtZSh0KTt0aGlzLmRhdGEucGFnZUluZGV4PWUucGFnZUluZGV4fXRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPWUuZXZhbHVhdG9yT3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDt0aGlzLl9mYWxsYmFja0ZvbnREaWN0PW51bGw7dGhpcy5fbmVlZEFwcGVhcmFuY2VzPSExfV9oYXNGbGFnKGUsdCl7cmV0dXJuISEoZSZ0KX1faXNWaWV3YWJsZShlKXtyZXR1cm4hdGhpcy5faGFzRmxhZyhlLHIuQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKSYmIXRoaXMuX2hhc0ZsYWcoZSxyLkFubm90YXRpb25GbGFnLk5PVklFVyl9X2lzUHJpbnRhYmxlKGUpe3JldHVybiB0aGlzLl9oYXNGbGFnKGUsci5Bbm5vdGF0aW9uRmxhZy5QUklOVCkmJiF0aGlzLl9oYXNGbGFnKGUsci5Bbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpfW11c3RCZVZpZXdlZChlKXtjb25zdCB0PWU/LmdldCh0aGlzLmRhdGEuaWQpPy5oaWRkZW47cmV0dXJuIHZvaWQgMCE9PXQ/IXQ6dGhpcy52aWV3YWJsZSYmIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncyxyLkFubm90YXRpb25GbGFnLkhJRERFTil9bXVzdEJlUHJpbnRlZChlKXtjb25zdCB0PWU/LmdldCh0aGlzLmRhdGEuaWQpPy5wcmludDtyZXR1cm4gdm9pZCAwIT09dD90OnRoaXMucHJpbnRhYmxlfWdldCB2aWV3YWJsZSgpe3JldHVybiBudWxsIT09dGhpcy5kYXRhLnF1YWRQb2ludHMmJigwPT09dGhpcy5mbGFnc3x8dGhpcy5faXNWaWV3YWJsZSh0aGlzLmZsYWdzKSl9Z2V0IHByaW50YWJsZSgpe3JldHVybiBudWxsIT09dGhpcy5kYXRhLnF1YWRQb2ludHMmJigwIT09dGhpcy5mbGFncyYmdGhpcy5faXNQcmludGFibGUodGhpcy5mbGFncykpfV9wYXJzZVN0cmluZ0hlbHBlcihlKXtjb25zdCB0PSJzdHJpbmciPT10eXBlb2YgZT8oMCxyLnN0cmluZ1RvUERGU3RyaW5nKShlKToiIjtyZXR1cm57c3RyOnQsZGlyOnQmJiJydGwiPT09KDAsaC5iaWRpKSh0KS5kaXI/InJ0bCI6Imx0ciJ9fXNldERlZmF1bHRBcHBlYXJhbmNlKGUpe2NvbnN0IHQ9KDAsbi5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDplLmRpY3Qsa2V5OiJEQSJ9KXx8ZS5hY3JvRm9ybS5nZXQoIkRBIik7dGhpcy5fZGVmYXVsdEFwcGVhcmFuY2U9InN0cmluZyI9PXR5cGVvZiB0P3Q6IiI7dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YT0oMCxpLnBhcnNlRGVmYXVsdEFwcGVhcmFuY2UpKHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlKX1zZXRUaXRsZShlKXt0aGlzLl90aXRsZT10aGlzLl9wYXJzZVN0cmluZ0hlbHBlcihlKX1zZXRDb250ZW50cyhlKXt0aGlzLl9jb250ZW50cz10aGlzLl9wYXJzZVN0cmluZ0hlbHBlcihlKX1zZXRNb2RpZmljYXRpb25EYXRlKGUpe3RoaXMubW9kaWZpY2F0aW9uRGF0ZT0ic3RyaW5nIj09dHlwZW9mIGU/ZTpudWxsfXNldEZsYWdzKGUpe3RoaXMuZmxhZ3M9TnVtYmVyLmlzSW50ZWdlcihlKSYmZT4wP2U6MH1oYXNGbGFnKGUpe3JldHVybiB0aGlzLl9oYXNGbGFnKHRoaXMuZmxhZ3MsZSl9c2V0UmVjdGFuZ2xlKGUpe3RoaXMucmVjdGFuZ2xlPUFycmF5LmlzQXJyYXkoZSkmJjQ9PT1lLmxlbmd0aD9yLlV0aWwubm9ybWFsaXplUmVjdChlKTpbMCwwLDAsMF19c2V0Q29sb3IoZSl7dGhpcy5jb2xvcj1nZXRSZ2JDb2xvcihlKX1zZXRMaW5lRW5kaW5ncyhlKXt0aGlzLmxpbmVFbmRpbmdzPVsiTm9uZSIsIk5vbmUiXTtpZihBcnJheS5pc0FycmF5KGUpJiYyPT09ZS5sZW5ndGgpZm9yKGxldCB0PTA7dDwyO3QrKyl7Y29uc3QgYT1lW3RdO2lmKGEgaW5zdGFuY2VvZiBzLk5hbWUpc3dpdGNoKGEubmFtZSl7Y2FzZSJOb25lIjpjb250aW51ZTtjYXNlIlNxdWFyZSI6Y2FzZSJDaXJjbGUiOmNhc2UiRGlhbW9uZCI6Y2FzZSJPcGVuQXJyb3ciOmNhc2UiQ2xvc2VkQXJyb3ciOmNhc2UiQnV0dCI6Y2FzZSJST3BlbkFycm93IjpjYXNlIlJDbG9zZWRBcnJvdyI6Y2FzZSJTbGFzaCI6dGhpcy5saW5lRW5kaW5nc1t0XT1hLm5hbWU7Y29udGludWV9KDAsci53YXJuKShgSWdub3JpbmcgaW52YWxpZCBsaW5lRW5kaW5nOiAke2F9YCl9fXNldFJvdGF0aW9uKGUsdCl7dGhpcy5yb3RhdGlvbj0wO2xldCBhPWUgaW5zdGFuY2VvZiBzLkRpY3Q/ZS5nZXQoIlIiKXx8MDp0LmdldCgiUm90YXRlIil8fDA7aWYoTnVtYmVyLmlzSW50ZWdlcihhKSYmMCE9PWEpe2ElPTM2MDthPDAmJihhKz0zNjApO2ElOTA9PTAmJih0aGlzLnJvdGF0aW9uPWEpfX1zZXRCb3JkZXJBbmRCYWNrZ3JvdW5kQ29sb3JzKGUpe2lmKGUgaW5zdGFuY2VvZiBzLkRpY3Qpe3RoaXMuYm9yZGVyQ29sb3I9Z2V0UmdiQ29sb3IoZS5nZXRBcnJheSgiQkMiKSxudWxsKTt0aGlzLmJhY2tncm91bmRDb2xvcj1nZXRSZ2JDb2xvcihlLmdldEFycmF5KCJCRyIpLG51bGwpfWVsc2UgdGhpcy5ib3JkZXJDb2xvcj10aGlzLmJhY2tncm91bmRDb2xvcj1udWxsfXNldEJvcmRlclN0eWxlKGUpe3RoaXMuYm9yZGVyU3R5bGU9bmV3IEFubm90YXRpb25Cb3JkZXJTdHlsZTtpZihlIGluc3RhbmNlb2Ygcy5EaWN0KWlmKGUuaGFzKCJCUyIpKXtjb25zdCB0PWUuZ2V0KCJCUyIpLGE9dC5nZXQoIlR5cGUiKTtpZighYXx8KDAscy5pc05hbWUpKGEsIkJvcmRlciIpKXt0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKHQuZ2V0KCJXIiksdGhpcy5yZWN0YW5nbGUpO3RoaXMuYm9yZGVyU3R5bGUuc2V0U3R5bGUodC5nZXQoIlMiKSk7dGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkodC5nZXRBcnJheSgiRCIpKX19ZWxzZSBpZihlLmhhcygiQm9yZGVyIikpe2NvbnN0IHQ9ZS5nZXRBcnJheSgiQm9yZGVyIik7aWYoQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+PTMpe3RoaXMuYm9yZGVyU3R5bGUuc2V0SG9yaXpvbnRhbENvcm5lclJhZGl1cyh0WzBdKTt0aGlzLmJvcmRlclN0eWxlLnNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKHRbMV0pO3RoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgodFsyXSx0aGlzLnJlY3RhbmdsZSk7ND09PXQubGVuZ3RoJiZ0aGlzLmJvcmRlclN0eWxlLnNldERhc2hBcnJheSh0WzNdLCEwKX19ZWxzZSB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKDApfXNldEFwcGVhcmFuY2UoZSl7dGhpcy5hcHBlYXJhbmNlPW51bGw7Y29uc3QgdD1lLmdldCgiQVAiKTtpZighKHQgaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybjtjb25zdCBhPXQuZ2V0KCJOIik7aWYoYSBpbnN0YW5jZW9mIGwuQmFzZVN0cmVhbSl7dGhpcy5hcHBlYXJhbmNlPWE7cmV0dXJufWlmKCEoYSBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IHI9ZS5nZXQoIkFTIik7aWYoIShyIGluc3RhbmNlb2Ygcy5OYW1lJiZhLmhhcyhyLm5hbWUpKSlyZXR1cm47Y29uc3Qgbj1hLmdldChyLm5hbWUpO24gaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0mJih0aGlzLmFwcGVhcmFuY2U9bil9c2V0T3B0aW9uYWxDb250ZW50KGUpe3RoaXMub2M9bnVsbDtjb25zdCB0PWUuZ2V0KCJPQyIpO3QgaW5zdGFuY2VvZiBzLk5hbWU/KDAsci53YXJuKSgic2V0T3B0aW9uYWxDb250ZW50OiBTdXBwb3J0IGZvciAvTmFtZS1lbnRyeSBpcyBub3QgaW1wbGVtZW50ZWQuIik6dCBpbnN0YW5jZW9mIHMuRGljdCYmKHRoaXMub2M9dCl9bG9hZFJlc291cmNlcyhlLHQpe3JldHVybiB0LmRpY3QuZ2V0QXN5bmMoIlJlc291cmNlcyIpLnRoZW4oKHQ9PntpZighdClyZXR1cm47cmV0dXJuIG5ldyBwLk9iamVjdExvYWRlcih0LGUsdC54cmVmKS5sb2FkKCkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKX0pKX1hc3luYyBnZXRPcGVyYXRvckxpc3QoZSx0LGEsbixpKXtjb25zdCBjPXRoaXMuZGF0YTtsZXQgbD10aGlzLmFwcGVhcmFuY2U7Y29uc3QgaD0hISh0aGlzLmRhdGEuaGFzT3duQ2FudmFzJiZhJnIuUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKTtpZighbCl7aWYoIWgpcmV0dXJue29wTGlzdDpuZXcgbS5PcGVyYXRvckxpc3Qsc2VwYXJhdGVGb3JtOiExLHNlcGFyYXRlQ2FudmFzOiExfTtsPW5ldyBvLlN0cmluZ1N0cmVhbSgiIik7bC5kaWN0PW5ldyBzLkRpY3R9Y29uc3QgdT1sLmRpY3QsZD1hd2FpdCB0aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCJDb2xvclNwYWNlIiwiUGF0dGVybiIsIlNoYWRpbmciLCJYT2JqZWN0IiwiRm9udCJdLGwpLGY9dS5nZXRBcnJheSgiQkJveCIpfHxbMCwwLDEsMV0sZz11LmdldEFycmF5KCJNYXRyaXgiKXx8WzEsMCwwLDEsMCwwXSxwPWdldFRyYW5zZm9ybU1hdHJpeChjLnJlY3QsZixnKSxiPW5ldyBtLk9wZXJhdG9yTGlzdDtsZXQgeTt0aGlzLm9jJiYoeT1hd2FpdCBlLnBhcnNlTWFya2VkQ29udGVudFByb3BzKHRoaXMub2MsbnVsbCkpO3ZvaWQgMCE9PXkmJmIuYWRkT3Aoci5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIseV0pO2IuYWRkT3Aoci5PUFMuYmVnaW5Bbm5vdGF0aW9uLFtjLmlkLGMucmVjdCxwLGcsaF0pO2F3YWl0IGUuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06bCx0YXNrOnQscmVzb3VyY2VzOmQsb3BlcmF0b3JMaXN0OmIsZmFsbGJhY2tGb250RGljdDp0aGlzLl9mYWxsYmFja0ZvbnREaWN0fSk7Yi5hZGRPcChyLk9QUy5lbmRBbm5vdGF0aW9uLFtdKTt2b2lkIDAhPT15JiZiLmFkZE9wKHIuT1BTLmVuZE1hcmtlZENvbnRlbnQsW10pO3RoaXMucmVzZXQoKTtyZXR1cm57b3BMaXN0OmIsc2VwYXJhdGVGb3JtOiExLHNlcGFyYXRlQ2FudmFzOmh9fWFzeW5jIHNhdmUoZSx0LGEpe3JldHVybiBudWxsfWdldCBoYXNUZXh0Q29udGVudCgpe3JldHVybiExfWFzeW5jIGV4dHJhY3RUZXh0Q29udGVudChlLHQsYSl7aWYoIXRoaXMuYXBwZWFyYW5jZSlyZXR1cm47Y29uc3Qgbj1hd2FpdCB0aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCJGb250IiwiUHJvcGVydGllcyIsIlhPYmplY3QiXSx0aGlzLmFwcGVhcmFuY2UpLGk9W10scz1bXTtsZXQgbz1udWxsO2NvbnN0IGM9e2Rlc2lyZWRTaXplOk1hdGguSW5maW5pdHkscmVhZHk6ITAsZW5xdWV1ZShlLHQpe2Zvcihjb25zdCB0IG9mIGUuaXRlbXMpaWYodm9pZCAwIT09dC5zdHIpe298fD10LnRyYW5zZm9ybS5zbGljZSgtMik7cy5wdXNoKHQuc3RyKTtpZih0Lmhhc0VPTCl7aS5wdXNoKHMuam9pbigiIikpO3MubGVuZ3RoPTB9fX19O2F3YWl0IGUuZ2V0VGV4dENvbnRlbnQoe3N0cmVhbTp0aGlzLmFwcGVhcmFuY2UsdGFzazp0LHJlc291cmNlczpuLGluY2x1ZGVNYXJrZWRDb250ZW50OiEwLHNpbms6Yyx2aWV3Qm94OmF9KTt0aGlzLnJlc2V0KCk7cy5sZW5ndGgmJmkucHVzaChzLmpvaW4oIiIpKTtpZihpLmxlbmd0aD4xfHxpWzBdKXtjb25zdCBlPXRoaXMuYXBwZWFyYW5jZS5kaWN0LHQ9ZS5nZXRBcnJheSgiQkJveCIpfHxbMCwwLDEsMV0sYT1lLmdldEFycmF5KCJNYXRyaXgiKXx8WzEsMCwwLDEsMCwwXSxuPXRoaXMuZGF0YS5yZWN0LHM9Z2V0VHJhbnNmb3JtTWF0cml4KG4sdCxhKTtzWzRdLT1uWzBdO3NbNV0tPW5bMV07bz1yLlV0aWwuYXBwbHlUcmFuc2Zvcm0obyxzKTtvPXIuVXRpbC5hcHBseVRyYW5zZm9ybShvLGEpO3RoaXMuZGF0YS50ZXh0UG9zaXRpb249bzt0aGlzLmRhdGEudGV4dENvbnRlbnQ9aX19Z2V0RmllbGRPYmplY3QoKXtyZXR1cm4gdGhpcy5kYXRhLmtpZElkcz97aWQ6dGhpcy5kYXRhLmlkLGFjdGlvbnM6dGhpcy5kYXRhLmFjdGlvbnMsbmFtZTp0aGlzLmRhdGEuZmllbGROYW1lLHN0cm9rZUNvbG9yOnRoaXMuZGF0YS5ib3JkZXJDb2xvcixmaWxsQ29sb3I6dGhpcy5kYXRhLmJhY2tncm91bmRDb2xvcix0eXBlOiIiLGtpZElkczp0aGlzLmRhdGEua2lkSWRzLHBhZ2U6dGhpcy5kYXRhLnBhZ2VJbmRleCxyb3RhdGlvbjp0aGlzLnJvdGF0aW9ufTpudWxsfXJlc2V0KCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fc3RyZWFtcyllLnJlc2V0KCl9X2NvbnN0cnVjdEZpZWxkTmFtZShlKXtpZighZS5oYXMoIlQiKSYmIWUuaGFzKCJQYXJlbnQiKSl7KDAsci53YXJuKSgiVW5rbm93biBmaWVsZCBuYW1lLCBmYWxsaW5nIGJhY2sgdG8gZW1wdHkgZmllbGQgbmFtZS4iKTtyZXR1cm4iIn1pZighZS5oYXMoIlBhcmVudCIpKXJldHVybigwLHIuc3RyaW5nVG9QREZTdHJpbmcpKGUuZ2V0KCJUIikpO2NvbnN0IHQ9W107ZS5oYXMoIlQiKSYmdC51bnNoaWZ0KCgwLHIuc3RyaW5nVG9QREZTdHJpbmcpKGUuZ2V0KCJUIikpKTtsZXQgYT1lO2NvbnN0IG49bmV3IHMuUmVmU2V0O2Uub2JqSWQmJm4ucHV0KGUub2JqSWQpO2Zvcig7YS5oYXMoIlBhcmVudCIpOyl7YT1hLmdldCgiUGFyZW50Iik7aWYoIShhIGluc3RhbmNlb2Ygcy5EaWN0KXx8YS5vYmpJZCYmbi5oYXMoYS5vYmpJZCkpYnJlYWs7YS5vYmpJZCYmbi5wdXQoYS5vYmpJZCk7aWYoYS5oYXMoIlQiKSl7Y29uc3QgZT0oMCxyLnN0cmluZ1RvUERGU3RyaW5nKShhLmdldCgiVCIpKTtlLnN0YXJ0c1dpdGgoIiMiKXx8dC51bnNoaWZ0KGUpfX1yZXR1cm4gdC5qb2luKCIuIil9fXQuQW5ub3RhdGlvbj1Bbm5vdGF0aW9uO2NsYXNzIEFubm90YXRpb25Cb3JkZXJTdHlsZXtjb25zdHJ1Y3Rvcigpe3RoaXMud2lkdGg9MTt0aGlzLnN0eWxlPXIuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDt0aGlzLmRhc2hBcnJheT1bM107dGhpcy5ob3Jpem9udGFsQ29ybmVyUmFkaXVzPTA7dGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cz0wfXNldFdpZHRoKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbMCwwLDAsMF07aWYoZSBpbnN0YW5jZW9mIHMuTmFtZSl0aGlzLndpZHRoPTA7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKGU+MCl7Y29uc3QgYT0odFsyXS10WzBdKS8yLG49KHRbM10tdFsxXSkvMjtpZihhPjAmJm4+MCYmKGU+YXx8ZT5uKSl7KDAsci53YXJuKShgQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICR7ZX1gKTtlPTF9fXRoaXMud2lkdGg9ZX19c2V0U3R5bGUoZSl7aWYoZSBpbnN0YW5jZW9mIHMuTmFtZSlzd2l0Y2goZS5uYW1lKXtjYXNlIlMiOnRoaXMuc3R5bGU9ci5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEO2JyZWFrO2Nhc2UiRCI6dGhpcy5zdHlsZT1yLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuREFTSEVEO2JyZWFrO2Nhc2UiQiI6dGhpcy5zdHlsZT1yLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuQkVWRUxFRDticmVhaztjYXNlIkkiOnRoaXMuc3R5bGU9ci5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUO2JyZWFrO2Nhc2UiVSI6dGhpcy5zdHlsZT1yLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FfX1zZXREYXNoQXJyYXkoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD4wKXtsZXQgYT0hMCxyPSEwO2Zvcihjb25zdCB0IG9mIGUpe2lmKCEoK3Q+PTApKXthPSExO2JyZWFrfXQ+MCYmKHI9ITEpfWlmKGEmJiFyKXt0aGlzLmRhc2hBcnJheT1lO3QmJnRoaXMuc2V0U3R5bGUocy5OYW1lLmdldCgiRCIpKX1lbHNlIHRoaXMud2lkdGg9MH1lbHNlIGUmJih0aGlzLndpZHRoPTApfXNldEhvcml6b250YWxDb3JuZXJSYWRpdXMoZSl7TnVtYmVyLmlzSW50ZWdlcihlKSYmKHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cz1lKX1zZXRWZXJ0aWNhbENvcm5lclJhZGl1cyhlKXtOdW1iZXIuaXNJbnRlZ2VyKGUpJiYodGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cz1lKX19dC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGU9QW5ub3RhdGlvbkJvcmRlclN0eWxlO2NsYXNzIE1hcmt1cEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dH09ZTtpZih0LmhhcygiSVJUIikpe2NvbnN0IGU9dC5nZXRSYXcoIklSVCIpO3RoaXMuZGF0YS5pblJlcGx5VG89ZSBpbnN0YW5jZW9mIHMuUmVmP2UudG9TdHJpbmcoKTpudWxsO2NvbnN0IGE9dC5nZXQoIlJUIik7dGhpcy5kYXRhLnJlcGx5VHlwZT1hIGluc3RhbmNlb2Ygcy5OYW1lP2EubmFtZTpyLkFubm90YXRpb25SZXBseVR5cGUuUkVQTFl9bGV0IGE9bnVsbDtpZih0aGlzLmRhdGEucmVwbHlUeXBlPT09ci5Bbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKXtjb25zdCBlPXQuZ2V0KCJJUlQiKTt0aGlzLnNldFRpdGxlKGUuZ2V0KCJUIikpO3RoaXMuZGF0YS50aXRsZU9iaj10aGlzLl90aXRsZTt0aGlzLnNldENvbnRlbnRzKGUuZ2V0KCJDb250ZW50cyIpKTt0aGlzLmRhdGEuY29udGVudHNPYmo9dGhpcy5fY29udGVudHM7aWYoZS5oYXMoIkNyZWF0aW9uRGF0ZSIpKXt0aGlzLnNldENyZWF0aW9uRGF0ZShlLmdldCgiQ3JlYXRpb25EYXRlIikpO3RoaXMuZGF0YS5jcmVhdGlvbkRhdGU9dGhpcy5jcmVhdGlvbkRhdGV9ZWxzZSB0aGlzLmRhdGEuY3JlYXRpb25EYXRlPW51bGw7aWYoZS5oYXMoIk0iKSl7dGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKGUuZ2V0KCJNIikpO3RoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlPXRoaXMubW9kaWZpY2F0aW9uRGF0ZX1lbHNlIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlPW51bGw7YT1lLmdldFJhdygiUG9wdXAiKTtpZihlLmhhcygiQyIpKXt0aGlzLnNldENvbG9yKGUuZ2V0QXJyYXkoIkMiKSk7dGhpcy5kYXRhLmNvbG9yPXRoaXMuY29sb3J9ZWxzZSB0aGlzLmRhdGEuY29sb3I9bnVsbH1lbHNle3RoaXMuZGF0YS50aXRsZU9iaj10aGlzLl90aXRsZTt0aGlzLnNldENyZWF0aW9uRGF0ZSh0LmdldCgiQ3JlYXRpb25EYXRlIikpO3RoaXMuZGF0YS5jcmVhdGlvbkRhdGU9dGhpcy5jcmVhdGlvbkRhdGU7YT10LmdldFJhdygiUG9wdXAiKTt0LmhhcygiQyIpfHwodGhpcy5kYXRhLmNvbG9yPW51bGwpfXRoaXMuZGF0YS5wb3B1cFJlZj1hIGluc3RhbmNlb2Ygcy5SZWY/YS50b1N0cmluZygpOm51bGw7dC5oYXMoIlJDIikmJih0aGlzLmRhdGEucmljaFRleHQ9Yi5YRkFGYWN0b3J5LmdldFJpY2hUZXh0QXNIdG1sKHQuZ2V0KCJSQyIpKSl9c2V0Q3JlYXRpb25EYXRlKGUpe3RoaXMuY3JlYXRpb25EYXRlPSJzdHJpbmciPT10eXBlb2YgZT9lOm51bGx9X3NldERlZmF1bHRBcHBlYXJhbmNlKGUpe2xldHt4cmVmOnQsZXh0cmE6YSxzdHJva2VDb2xvcjpyLGZpbGxDb2xvcjpuLGJsZW5kTW9kZTppLHN0cm9rZUFscGhhOmMsZmlsbEFscGhhOmwscG9pbnRzQ2FsbGJhY2s6aH09ZSx1PU51bWJlci5NQVhfVkFMVUUsZD1OdW1iZXIuTUFYX1ZBTFVFLGY9TnVtYmVyLk1JTl9WQUxVRSxnPU51bWJlci5NSU5fVkFMVUU7Y29uc3QgcD1bInEiXTthJiZwLnB1c2goYSk7ciYmcC5wdXNoKGAke3JbMF19ICR7clsxXX0gJHtyWzJdfSBSR2ApO24mJnAucHVzaChgJHtuWzBdfSAke25bMV19ICR7blsyXX0gcmdgKTtsZXQgbT10aGlzLmRhdGEucXVhZFBvaW50czttfHwobT1bW3t4OnRoaXMucmVjdGFuZ2xlWzBdLHk6dGhpcy5yZWN0YW5nbGVbM119LHt4OnRoaXMucmVjdGFuZ2xlWzJdLHk6dGhpcy5yZWN0YW5nbGVbM119LHt4OnRoaXMucmVjdGFuZ2xlWzBdLHk6dGhpcy5yZWN0YW5nbGVbMV19LHt4OnRoaXMucmVjdGFuZ2xlWzJdLHk6dGhpcy5yZWN0YW5nbGVbMV19XV0pO2Zvcihjb25zdCBlIG9mIG0pe2NvbnN0W3QsYSxyLG5dPWgocCxlKTt1PU1hdGgubWluKHUsdCk7Zj1NYXRoLm1heChmLGEpO2Q9TWF0aC5taW4oZCxyKTtnPU1hdGgubWF4KGcsbil9cC5wdXNoKCJRIik7Y29uc3QgYj1uZXcgcy5EaWN0KHQpLHk9bmV3IHMuRGljdCh0KTt5LnNldCgiU3VidHlwZSIscy5OYW1lLmdldCgiRm9ybSIpKTtjb25zdCB3PW5ldyBvLlN0cmluZ1N0cmVhbShwLmpvaW4oIiAiKSk7dy5kaWN0PXk7Yi5zZXQoIkZtMCIsdyk7Y29uc3QgUz1uZXcgcy5EaWN0KHQpO2kmJlMuc2V0KCJCTSIscy5OYW1lLmdldChpKSk7Im51bWJlciI9PXR5cGVvZiBjJiZTLnNldCgiQ0EiLGMpOyJudW1iZXIiPT10eXBlb2YgbCYmUy5zZXQoImNhIixsKTtjb25zdCB4PW5ldyBzLkRpY3QodCk7eC5zZXQoIkdTMCIsUyk7Y29uc3QgQz1uZXcgcy5EaWN0KHQpO0Muc2V0KCJFeHRHU3RhdGUiLHgpO0Muc2V0KCJYT2JqZWN0IixiKTtjb25zdCB2PW5ldyBzLkRpY3QodCk7di5zZXQoIlJlc291cmNlcyIsQyk7Y29uc3Qgaz10aGlzLmRhdGEucmVjdD1bdSxkLGYsZ107di5zZXQoIkJCb3giLGspO3RoaXMuYXBwZWFyYW5jZT1uZXcgby5TdHJpbmdTdHJlYW0oIi9HUzAgZ3MgL0ZtMCBEbyIpO3RoaXMuYXBwZWFyYW5jZS5kaWN0PXY7dGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuYXBwZWFyYW5jZSx3KX1zdGF0aWMgYXN5bmMgY3JlYXRlTmV3QW5ub3RhdGlvbihlLHQsYSxyKXtjb25zdCBuPXQucmVmfHxlLmdldE5ld1RlbXBvcmFyeVJlZigpLGk9YXdhaXQgdGhpcy5jcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKHQsZSxyKSxzPVtdO2xldCBvO2lmKGkpe2NvbnN0IHI9ZS5nZXROZXdUZW1wb3JhcnlSZWYoKTtvPXRoaXMuY3JlYXRlTmV3RGljdCh0LGUse2FwUmVmOnJ9KTtjb25zdCBuPWUuZW5jcnlwdD9lLmVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHIubnVtLHIuZ2VuKTpudWxsO2F3YWl0KDAsYy53cml0ZU9iamVjdCkocixpLHMsbik7YS5wdXNoKHtyZWY6cixkYXRhOnMuam9pbigiIil9KX1lbHNlIG89dGhpcy5jcmVhdGVOZXdEaWN0KHQsZSx7fSk7cy5sZW5ndGg9MDtjb25zdCBsPWUuZW5jcnlwdD9lLmVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKG4ubnVtLG4uZ2VuKTpudWxsO2F3YWl0KDAsYy53cml0ZU9iamVjdCkobixvLHMsbCk7cmV0dXJue3JlZjpuLGRhdGE6cy5qb2luKCIiKX19c3RhdGljIGFzeW5jIGNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihlLHQsYSl7Y29uc3Qgcj1hd2FpdCB0aGlzLmNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0odCxlLGEpLG49dGhpcy5jcmVhdGVOZXdEaWN0KHQsZSx7YXA6cn0pLGk9bmV3IHRoaXMucHJvdG90eXBlLmNvbnN0cnVjdG9yKHtkaWN0Om4seHJlZjplLGV2YWx1YXRvck9wdGlvbnM6YS5ldmFsdWF0b3JPcHRpb25zfSk7dC5yZWYmJihpLnJlZj1pLnJlZlRvUmVwbGFjZT10LnJlZik7cmV0dXJuIGl9fXQuTWFya3VwQW5ub3RhdGlvbj1NYXJrdXBBbm5vdGF0aW9uO2NsYXNzIFdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOmF9PWUsaT10aGlzLmRhdGE7dGhpcy5fbmVlZEFwcGVhcmFuY2VzPWUubmVlZEFwcGVhcmFuY2VzO2kuYW5ub3RhdGlvblR5cGU9ci5Bbm5vdGF0aW9uVHlwZS5XSURHRVQ7dm9pZCAwPT09aS5maWVsZE5hbWUmJihpLmZpZWxkTmFtZT10aGlzLl9jb25zdHJ1Y3RGaWVsZE5hbWUodCkpO2kuZmllbGROYW1lJiYvXFtcZCtcXSQvLnRlc3QoaS5maWVsZE5hbWUpJiYhdC5oYXMoIktpZHMiKSYmKGkuYmFzZUZpZWxkTmFtZT1pLmZpZWxkTmFtZS5zdWJzdHJpbmcoMCxpLmZpZWxkTmFtZS5sYXN0SW5kZXhPZigiWyIpKSk7dm9pZCAwPT09aS5hY3Rpb25zJiYoaS5hY3Rpb25zPSgwLG4uY29sbGVjdEFjdGlvbnMpKGEsdCxyLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGUpKTtsZXQgbz0oMCxuLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJWIixnZXRBcnJheTohMH0pO2kuZmllbGRWYWx1ZT10aGlzLl9kZWNvZGVGb3JtVmFsdWUobyk7Y29uc3QgYz0oMCxuLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJEViIsZ2V0QXJyYXk6ITB9KTtpLmRlZmF1bHRGaWVsZFZhbHVlPXRoaXMuX2RlY29kZUZvcm1WYWx1ZShjKTtpZih2b2lkIDA9PT1vJiZlLnhmYURhdGFzZXRzKXtjb25zdCB0PXRoaXMuX3RpdGxlLnN0cjtpZih0KXt0aGlzLl9oYXNWYWx1ZUZyb21YRkE9ITA7aS5maWVsZFZhbHVlPW89ZS54ZmFEYXRhc2V0cy5nZXRWYWx1ZSh0KX19dm9pZCAwPT09byYmbnVsbCE9PWkuZGVmYXVsdEZpZWxkVmFsdWUmJihpLmZpZWxkVmFsdWU9aS5kZWZhdWx0RmllbGRWYWx1ZSk7aS5hbHRlcm5hdGl2ZVRleHQ9KDAsci5zdHJpbmdUb1BERlN0cmluZykodC5nZXQoIlRVIil8fCIiKTt0aGlzLnNldERlZmF1bHRBcHBlYXJhbmNlKGUpO2kuaGFzQXBwZWFyYW5jZXx8PXRoaXMuX25lZWRBcHBlYXJhbmNlcyYmdm9pZCAwIT09aS5maWVsZFZhbHVlJiZudWxsIT09aS5maWVsZFZhbHVlO2NvbnN0IGw9KDAsbi5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDp0LGtleToiRlQifSk7aS5maWVsZFR5cGU9bCBpbnN0YW5jZW9mIHMuTmFtZT9sLm5hbWU6bnVsbDtjb25zdCBoPSgwLG4uZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dCxrZXk6IkRSIn0pLHU9ZS5hY3JvRm9ybS5nZXQoIkRSIiksZD10aGlzLmFwcGVhcmFuY2U/LmRpY3QuZ2V0KCJSZXNvdXJjZXMiKTt0aGlzLl9maWVsZFJlc291cmNlcz17bG9jYWxSZXNvdXJjZXM6aCxhY3JvRm9ybVJlc291cmNlczp1LGFwcGVhcmFuY2VSZXNvdXJjZXM6ZCxtZXJnZWRSZXNvdXJjZXM6cy5EaWN0Lm1lcmdlKHt4cmVmOmEsZGljdEFycmF5OltoLGQsdV0sbWVyZ2VTdWJEaWN0czohMH0pfTtpLmZpZWxkRmxhZ3M9KDAsbi5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDp0LGtleToiRmYifSk7KCFOdW1iZXIuaXNJbnRlZ2VyKGkuZmllbGRGbGFncyl8fGkuZmllbGRGbGFnczwwKSYmKGkuZmllbGRGbGFncz0wKTtpLnJlYWRPbmx5PXRoaXMuaGFzRmllbGRGbGFnKHIuQW5ub3RhdGlvbkZpZWxkRmxhZy5SRUFET05MWSk7aS5yZXF1aXJlZD10aGlzLmhhc0ZpZWxkRmxhZyhyLkFubm90YXRpb25GaWVsZEZsYWcuUkVRVUlSRUQpO2kuaGlkZGVuPXRoaXMuX2hhc0ZsYWcoaS5hbm5vdGF0aW9uRmxhZ3Msci5Bbm5vdGF0aW9uRmxhZy5ISURERU4pfV9kZWNvZGVGb3JtVmFsdWUoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5maWx0ZXIoKGU9PiJzdHJpbmciPT10eXBlb2YgZSkpLm1hcCgoZT0+KDAsci5zdHJpbmdUb1BERlN0cmluZykoZSkpKTplIGluc3RhbmNlb2Ygcy5OYW1lPygwLHIuc3RyaW5nVG9QREZTdHJpbmcpKGUubmFtZSk6InN0cmluZyI9PXR5cGVvZiBlPygwLHIuc3RyaW5nVG9QREZTdHJpbmcpKGUpOm51bGx9aGFzRmllbGRGbGFnKGUpe3JldHVybiEhKHRoaXMuZGF0YS5maWVsZEZsYWdzJmUpfWdldFJvdGF0aW9uTWF0cml4KGUpe2xldCB0PWU/LmdldCh0aGlzLmRhdGEuaWQpPy5yb3RhdGlvbjt2b2lkIDA9PT10JiYodD10aGlzLnJvdGF0aW9uKTtpZigwPT09dClyZXR1cm4gci5JREVOVElUWV9NQVRSSVg7Y29uc3QgYT10aGlzLmRhdGEucmVjdFsyXS10aGlzLmRhdGEucmVjdFswXSxpPXRoaXMuZGF0YS5yZWN0WzNdLXRoaXMuZGF0YS5yZWN0WzFdO3JldHVybigwLG4uZ2V0Um90YXRpb25NYXRyaXgpKHQsYSxpKX1nZXRCb3JkZXJBbmRCYWNrZ3JvdW5kQXBwZWFyYW5jZXMoZSl7bGV0IHQ9ZT8uZ2V0KHRoaXMuZGF0YS5pZCk/LnJvdGF0aW9uO3ZvaWQgMD09PXQmJih0PXRoaXMucm90YXRpb24pO2lmKCF0aGlzLmJhY2tncm91bmRDb2xvciYmIXRoaXMuYm9yZGVyQ29sb3IpcmV0dXJuIiI7Y29uc3QgYT10aGlzLmRhdGEucmVjdFsyXS10aGlzLmRhdGEucmVjdFswXSxyPXRoaXMuZGF0YS5yZWN0WzNdLXRoaXMuZGF0YS5yZWN0WzFdLG49MD09PXR8fDE4MD09PXQ/YDAgMCAke2F9ICR7cn0gcmVgOmAwIDAgJHtyfSAke2F9IHJlYDtsZXQgcz0iIjt0aGlzLmJhY2tncm91bmRDb2xvciYmKHM9YCR7KDAsaS5nZXRQZGZDb2xvcikodGhpcy5iYWNrZ3JvdW5kQ29sb3IsITApfSAke259IGYgYCk7aWYodGhpcy5ib3JkZXJDb2xvcil7cys9YCR7dGhpcy5ib3JkZXJTdHlsZS53aWR0aHx8MX0gdyAkeygwLGkuZ2V0UGRmQ29sb3IpKHRoaXMuYm9yZGVyQ29sb3IsITEpfSAke259IFMgYH1yZXR1cm4gc31hc3luYyBnZXRPcGVyYXRvckxpc3QoZSx0LGEsbixpKXtpZihuJiYhKHRoaXMgaW5zdGFuY2VvZiBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uKSYmIXRoaXMuZGF0YS5ub0hUTUwmJiF0aGlzLmRhdGEuaGFzT3duQ2FudmFzKXJldHVybntvcExpc3Q6bmV3IG0uT3BlcmF0b3JMaXN0LHNlcGFyYXRlRm9ybTohMCxzZXBhcmF0ZUNhbnZhczohMX07aWYoIXRoaXMuX2hhc1RleHQpcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChlLHQsYSxuLGkpO2NvbnN0IHM9YXdhaXQgdGhpcy5fZ2V0QXBwZWFyYW5jZShlLHQsYSxpKTtpZih0aGlzLmFwcGVhcmFuY2UmJm51bGw9PT1zKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LGEsbixpKTtjb25zdCBjPW5ldyBtLk9wZXJhdG9yTGlzdDtpZighdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2V8fG51bGw9PT1zKXJldHVybntvcExpc3Q6YyxzZXBhcmF0ZUZvcm06ITEsc2VwYXJhdGVDYW52YXM6ITF9O2NvbnN0IGw9ISEodGhpcy5kYXRhLmhhc093bkNhbnZhcyYmYSZyLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksaD1bMCwwLHRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdLHRoaXMuZGF0YS5yZWN0WzNdLXRoaXMuZGF0YS5yZWN0WzFdXSx1PWdldFRyYW5zZm9ybU1hdHJpeCh0aGlzLmRhdGEucmVjdCxoLFsxLDAsMCwxLDAsMF0pO2xldCBkO3RoaXMub2MmJihkPWF3YWl0IGUucGFyc2VNYXJrZWRDb250ZW50UHJvcHModGhpcy5vYyxudWxsKSk7dm9pZCAwIT09ZCYmYy5hZGRPcChyLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcyxbIk9DIixkXSk7Yy5hZGRPcChyLk9QUy5iZWdpbkFubm90YXRpb24sW3RoaXMuZGF0YS5pZCx0aGlzLmRhdGEucmVjdCx1LHRoaXMuZ2V0Um90YXRpb25NYXRyaXgoaSksbF0pO2NvbnN0IGY9bmV3IG8uU3RyaW5nU3RyZWFtKHMpO2F3YWl0IGUuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06Zix0YXNrOnQscmVzb3VyY2VzOnRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcyxvcGVyYXRvckxpc3Q6Y30pO2MuYWRkT3Aoci5PUFMuZW5kQW5ub3RhdGlvbixbXSk7dm9pZCAwIT09ZCYmYy5hZGRPcChyLk9QUy5lbmRNYXJrZWRDb250ZW50LFtdKTtyZXR1cm57b3BMaXN0OmMsc2VwYXJhdGVGb3JtOiExLHNlcGFyYXRlQ2FudmFzOmx9fV9nZXRNS0RpY3QoZSl7Y29uc3QgdD1uZXcgcy5EaWN0KG51bGwpO2UmJnQuc2V0KCJSIixlKTt0aGlzLmJvcmRlckNvbG9yJiZ0LnNldCgiQkMiLGdldFBkZkNvbG9yQXJyYXkodGhpcy5ib3JkZXJDb2xvcikpO3RoaXMuYmFja2dyb3VuZENvbG9yJiZ0LnNldCgiQkciLGdldFBkZkNvbG9yQXJyYXkodGhpcy5iYWNrZ3JvdW5kQ29sb3IpKTtyZXR1cm4gdC5zaXplPjA/dDpudWxsfWFtZW5kU2F2ZWREaWN0KGUsdCl7fWFzeW5jIHNhdmUoZSx0LGEpe2NvbnN0IGk9YT8uZ2V0KHRoaXMuZGF0YS5pZCk7bGV0IGw9aT8udmFsdWUsaD1pPy5yb3RhdGlvbjtpZihsPT09dGhpcy5kYXRhLmZpZWxkVmFsdWV8fHZvaWQgMD09PWwpe2lmKCF0aGlzLl9oYXNWYWx1ZUZyb21YRkEmJnZvaWQgMD09PWgpcmV0dXJuIG51bGw7bHx8PXRoaXMuZGF0YS5maWVsZFZhbHVlfWlmKHZvaWQgMD09PWgmJiF0aGlzLl9oYXNWYWx1ZUZyb21YRkEmJkFycmF5LmlzQXJyYXkobCkmJkFycmF5LmlzQXJyYXkodGhpcy5kYXRhLmZpZWxkVmFsdWUpJiZsLmxlbmd0aD09PXRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCYmbC5ldmVyeSgoKGUsdCk9PmU9PT10aGlzLmRhdGEuZmllbGRWYWx1ZVt0XSkpKXJldHVybiBudWxsO3ZvaWQgMD09PWgmJihoPXRoaXMucm90YXRpb24pO2xldCB1PW51bGw7aWYoIXRoaXMuX25lZWRBcHBlYXJhbmNlcyl7dT1hd2FpdCB0aGlzLl9nZXRBcHBlYXJhbmNlKGUsdCxyLlJlbmRlcmluZ0ludGVudEZsYWcuU0FWRSxhKTtpZihudWxsPT09dSlyZXR1cm4gbnVsbH1sZXQgZD0hMTtpZih1Py5uZWVkQXBwZWFyYW5jZXMpe2Q9ITA7dT1udWxsfWNvbnN0e3hyZWY6Zn09ZSxnPWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7aWYoIShnIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm4gbnVsbDtjb25zdCBwPW5ldyBzLkRpY3QoZik7Zm9yKGNvbnN0IGUgb2YgZy5nZXRLZXlzKCkpIkFQIiE9PWUmJnAuc2V0KGUsZy5nZXRSYXcoZSkpO2NvbnN0IG09e3BhdGg6dGhpcy5kYXRhLmZpZWxkTmFtZSx2YWx1ZTpsfSxlbmNvZGVyPWU9PigwLG4uaXNBc2NpaSkoZSk/ZTooMCxuLnN0cmluZ1RvVVRGMTZTdHJpbmcpKGUsITApO3Auc2V0KCJWIixBcnJheS5pc0FycmF5KGwpP2wubWFwKGVuY29kZXIpOmVuY29kZXIobCkpO3RoaXMuYW1lbmRTYXZlZERpY3QoYSxwKTtjb25zdCBiPXRoaXMuX2dldE1LRGljdChoKTtiJiZwLnNldCgiTUsiLGIpO2NvbnN0IHk9Zi5lbmNyeXB0LHc9eT95LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnJlZi5udW0sdGhpcy5yZWYuZ2VuKTpudWxsLFM9W10seD1be3JlZjp0aGlzLnJlZixkYXRhOiIiLHhmYTptLG5lZWRBcHBlYXJhbmNlczpkfV07aWYobnVsbCE9PXUpe2NvbnN0IGU9Zi5nZXROZXdUZW1wb3JhcnlSZWYoKSx0PW5ldyBzLkRpY3QoZik7cC5zZXQoIkFQIix0KTt0LnNldCgiTiIsZSk7bGV0IG49bnVsbDt5JiYobj15LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShlLm51bSxlLmdlbikpO2NvbnN0IGk9dGhpcy5fZ2V0U2F2ZUZpZWxkUmVzb3VyY2VzKGYpLGw9bmV3IG8uU3RyaW5nU3RyZWFtKHUpLGg9bC5kaWN0PW5ldyBzLkRpY3QoZik7aC5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIkZvcm0iKSk7aC5zZXQoIlJlc291cmNlcyIsaSk7aC5zZXQoIkJCb3giLFswLDAsdGhpcy5kYXRhLnJlY3RbMl0tdGhpcy5kYXRhLnJlY3RbMF0sdGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV1dKTtjb25zdCBkPXRoaXMuZ2V0Um90YXRpb25NYXRyaXgoYSk7ZCE9PXIuSURFTlRJVFlfTUFUUklYJiZoLnNldCgiTWF0cml4IixkKTthd2FpdCgwLGMud3JpdGVPYmplY3QpKGUsbCxTLG4pO3gucHVzaCh7cmVmOmUsZGF0YTpTLmpvaW4oIiIpLHhmYTpudWxsLG5lZWRBcHBlYXJhbmNlczohMX0pO1MubGVuZ3RoPTB9cC5zZXQoIk0iLGBEOiR7KDAsci5nZXRNb2RpZmljYXRpb25EYXRlKSgpfWApO2F3YWl0KDAsYy53cml0ZU9iamVjdCkodGhpcy5yZWYscCxTLHcpO3hbMF0uZGF0YT1TLmpvaW4oIiIpO3JldHVybiB4fWFzeW5jIF9nZXRBcHBlYXJhbmNlKGUsdCxhLHMpe2lmKHRoaXMuaGFzRmllbGRGbGFnKHIuQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCkpcmV0dXJuIG51bGw7Y29uc3Qgbz1zPy5nZXQodGhpcy5kYXRhLmlkKTtsZXQgYyxsO2lmKG8pe2M9by5mb3JtYXR0ZWRWYWx1ZXx8by52YWx1ZTtsPW8ucm90YXRpb259aWYodm9pZCAwPT09bCYmdm9pZCAwPT09YyYmIXRoaXMuX25lZWRBcHBlYXJhbmNlcyYmKCF0aGlzLl9oYXNWYWx1ZUZyb21YRkF8fHRoaXMuYXBwZWFyYW5jZSkpcmV0dXJuIG51bGw7Y29uc3QgaD10aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyhzKTtpZih2b2lkIDA9PT1jKXtjPXRoaXMuZGF0YS5maWVsZFZhbHVlO2lmKCFjKXJldHVybmAvVHggQk1DIHEgJHtofVEgRU1DYH1BcnJheS5pc0FycmF5KGMpJiYxPT09Yy5sZW5ndGgmJihjPWNbMF0pOygwLHIuYXNzZXJ0KSgic3RyaW5nIj09dHlwZW9mIGMsIkV4cGVjdGVkIGB2YWx1ZWAgdG8gYmUgYSBzdHJpbmcuIik7Yz1jLnRyaW0oKTtpZih0aGlzLmRhdGEuY29tYm8pe2NvbnN0IGU9dGhpcy5kYXRhLm9wdGlvbnMuZmluZCgoZT0+e2xldHtleHBvcnRWYWx1ZTp0fT1lO3JldHVybiBjPT09dH0pKTtjPWU/LmRpc3BsYXlWYWx1ZXx8Y31pZigiIj09PWMpcmV0dXJuYC9UeCBCTUMgcSAke2h9USBFTUNgO3ZvaWQgMD09PWwmJihsPXRoaXMucm90YXRpb24pO2xldCB1LGQ9LTE7aWYodGhpcy5kYXRhLm11bHRpTGluZSl7dT1jLnNwbGl0KC9cclxuP3xcbi8pLm1hcCgoZT0+ZS5ub3JtYWxpemUoIk5GQyIpKSk7ZD11Lmxlbmd0aH1lbHNlIHU9W2MucmVwbGFjZSgvXHJcbj98XG4vLCIiKS5ub3JtYWxpemUoIk5GQyIpXTtsZXQgZj10aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXSxnPXRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdOzkwIT09bCYmMjcwIT09bHx8KFtnLGZdPVtmLGddKTt0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZXx8KHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE9KDAsaS5wYXJzZURlZmF1bHRBcHBlYXJhbmNlKSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZT0iL0hlbHZldGljYSAwIFRmIDAgZyIpKTtsZXQgcCxtLGIseT1hd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShlLHQsdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSx0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMpO2NvbnN0IHc9W107bGV0IFM9ITE7Zm9yKGNvbnN0IGUgb2YgdSl7Y29uc3QgdD15LmVuY29kZVN0cmluZyhlKTt0Lmxlbmd0aD4xJiYoUz0hMCk7dy5wdXNoKHQuam9pbigiIikpfWlmKFMmJmEmci5SZW5kZXJpbmdJbnRlbnRGbGFnLlNBVkUpcmV0dXJue25lZWRBcHBlYXJhbmNlczohMH07aWYoUyYmdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpe2NvbnN0IGE9dGhpcy5kYXRhLmNvbWI/Im1vbm9zcGFjZSI6InNhbnMtc2VyaWYiLHI9bmV3IGkuRmFrZVVuaWNvZGVGb250KGUueHJlZixhKSxzPXIuY3JlYXRlRm9udFJlc291cmNlcyh1LmpvaW4oIiIpKSxvPXMuZ2V0UmF3KCJGb250Iik7aWYodGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLmhhcygiRm9udCIpKXtjb25zdCBlPXRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcy5nZXQoIkZvbnQiKTtmb3IoY29uc3QgdCBvZiBvLmdldEtleXMoKSllLnNldCh0LG8uZ2V0UmF3KHQpKX1lbHNlIHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcy5zZXQoIkZvbnQiLG8pO2NvbnN0IGw9ci5mb250TmFtZS5uYW1lO3k9YXdhaXQgV2lkZ2V0QW5ub3RhdGlvbi5fZ2V0Rm9udERhdGEoZSx0LHtmb250TmFtZTpsLGZvbnRTaXplOjB9LHMpO2ZvcihsZXQgZT0wLHQ9dy5sZW5ndGg7ZTx0O2UrKyl3W2VdPSgwLG4uc3RyaW5nVG9VVEYxNlN0cmluZykodVtlXSk7Y29uc3QgaD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSk7dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250U2l6ZT0wO3RoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udE5hbWU9bDtbcCxtLGJdPXRoaXMuX2NvbXB1dGVGb250U2l6ZShmLTIsZy00LGMseSxkKTt0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhPWh9ZWxzZXt0aGlzLl9pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZHx8KDAsci53YXJuKSgiX2dldEFwcGVhcmFuY2U6IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkLCBhbm5vdGF0aW9uIG1heSBub3QgcmVuZGVyIGNvcnJlY3RseS4iKTtbcCxtLGJdPXRoaXMuX2NvbXB1dGVGb250U2l6ZShmLTIsZy00LGMseSxkKX1sZXQgeD15LmRlc2NlbnQ7eD1pc05hTih4KT9yLkJBU0VMSU5FX0ZBQ1RPUipiOk1hdGgubWF4KHIuQkFTRUxJTkVfRkFDVE9SKmIsTWF0aC5hYnMoeCkqbSk7Y29uc3QgQz1NYXRoLm1pbihNYXRoLmZsb29yKChmLW0pLzIpLDEpLHY9dGhpcy5kYXRhLnRleHRBbGlnbm1lbnQ7aWYodGhpcy5kYXRhLm11bHRpTGluZSlyZXR1cm4gdGhpcy5fZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZShwLHcseSxtLGcsZix2LDIsQyx4LGIscyk7aWYodGhpcy5kYXRhLmNvbWIpcmV0dXJuIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKHAseSx3WzBdLG0sZyxmLDIsQyx4LGIscyk7Y29uc3Qgaz1DK3g7aWYoMD09PXZ8fHY+MilyZXR1cm5gL1R4IEJNQyBxICR7aH1CVCBgK3ArYCAxIDAgMCAxICR7KDAsbi5udW1iZXJUb1N0cmluZykoMil9ICR7KDAsbi5udW1iZXJUb1N0cmluZykoayl9IFRtICgkeygwLG4uZXNjYXBlU3RyaW5nKSh3WzBdKX0pIFRqIEVUIFEgRU1DYDtyZXR1cm5gL1R4IEJNQyBxICR7aH1CVCBgK3ArYCAxIDAgMCAxIDAgMCBUbSAke3RoaXMuX3JlbmRlclRleHQod1swXSx5LG0sZyx2LHtzaGlmdDowfSwyLGspfSBFVCBRIEVNQ2B9c3RhdGljIGFzeW5jIF9nZXRGb250RGF0YShlLHQsYSxyKXtjb25zdCBuPW5ldyBtLk9wZXJhdG9yTGlzdCxpPXtmb250Om51bGwsY2xvbmUoKXtyZXR1cm4gdGhpc319LHtmb250TmFtZTpvLGZvbnRTaXplOmN9PWE7YXdhaXQgZS5oYW5kbGVTZXRGb250KHIsW28mJnMuTmFtZS5nZXQobyksY10sbnVsbCxuLHQsaSxudWxsKTtyZXR1cm4gaS5mb250fV9nZXRUZXh0V2lkdGgoZSx0KXtyZXR1cm4gdC5jaGFyc1RvR2x5cGhzKGUpLnJlZHVjZSgoKGUsdCk9PmUrdC53aWR0aCksMCkvMWUzfV9jb21wdXRlRm9udFNpemUoZSx0LGEsbixzKXtsZXR7Zm9udFNpemU6b309dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSxjPShvfHwxMikqci5MSU5FX0ZBQ1RPUixsPU1hdGgucm91bmQoZS9jKTtpZighbyl7Y29uc3Qgcm91bmRXaXRoVHdvRGlnaXRzPWU9Pk1hdGguZmxvb3IoMTAwKmUpLzEwMDtpZigtMT09PXMpe2NvbnN0IGk9dGhpcy5fZ2V0VGV4dFdpZHRoKGEsbik7bz1yb3VuZFdpdGhUd29EaWdpdHMoTWF0aC5taW4oZS9yLkxJTkVfRkFDVE9SLGk+dD90L2k6MS8wKSk7bD0xfWVsc2V7Y29uc3QgaT1hLnNwbGl0KC9cclxuP3xcbi8pLGg9W107Zm9yKGNvbnN0IGUgb2YgaSl7Y29uc3QgdD1uLmVuY29kZVN0cmluZyhlKS5qb2luKCIiKSxhPW4uY2hhcnNUb0dseXBocyh0KSxyPW4uZ2V0Q2hhclBvc2l0aW9ucyh0KTtoLnB1c2goe2xpbmU6dCxnbHlwaHM6YSxwb3NpdGlvbnM6cn0pfWNvbnN0IGlzVG9vQmlnPWE9PntsZXQgcj0wO2Zvcihjb25zdCBpIG9mIGgpe3IrPXRoaXMuX3NwbGl0TGluZShudWxsLG4sYSx0LGkpLmxlbmd0aCphO2lmKHI+ZSlyZXR1cm4hMH1yZXR1cm4hMX07bD1NYXRoLm1heChsLHMpO2Zvcig7Oyl7Yz1lL2w7bz1yb3VuZFdpdGhUd29EaWdpdHMoYy9yLkxJTkVfRkFDVE9SKTtpZighaXNUb29CaWcobykpYnJlYWs7bCsrfX1jb25zdHtmb250TmFtZTpoLGZvbnRDb2xvcjp1fT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO3RoaXMuX2RlZmF1bHRBcHBlYXJhbmNlPSgwLGkuY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2UpKHtmb250U2l6ZTpvLGZvbnROYW1lOmgsZm9udENvbG9yOnV9KX1yZXR1cm5bdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UsbyxlL2xdfV9yZW5kZXJUZXh0KGUsdCxhLHIsaSxzLG8sYyl7bGV0IGw7aWYoMT09PWkpe2w9KHItdGhpcy5fZ2V0VGV4dFdpZHRoKGUsdCkqYSkvMn1lbHNlIGlmKDI9PT1pKXtsPXItdGhpcy5fZ2V0VGV4dFdpZHRoKGUsdCkqYS1vfWVsc2UgbD1vO2NvbnN0IGg9KDAsbi5udW1iZXJUb1N0cmluZykobC1zLnNoaWZ0KTtzLnNoaWZ0PWw7cmV0dXJuYCR7aH0gJHtjPSgwLG4ubnVtYmVyVG9TdHJpbmcpKGMpfSBUZCAoJHsoMCxuLmVzY2FwZVN0cmluZykoZSl9KSBUamB9X2dldFNhdmVGaWVsZFJlc291cmNlcyhlKXtjb25zdHtsb2NhbFJlc291cmNlczp0LGFwcGVhcmFuY2VSZXNvdXJjZXM6YSxhY3JvRm9ybVJlc291cmNlczpyfT10aGlzLl9maWVsZFJlc291cmNlcyxuPXRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE/LmZvbnROYW1lO2lmKCFuKXJldHVybiB0fHxzLkRpY3QuZW1wdHk7Zm9yKGNvbnN0IGUgb2ZbdCxhXSlpZihlIGluc3RhbmNlb2Ygcy5EaWN0KXtjb25zdCB0PWUuZ2V0KCJGb250Iik7aWYodCBpbnN0YW5jZW9mIHMuRGljdCYmdC5oYXMobikpcmV0dXJuIGV9aWYociBpbnN0YW5jZW9mIHMuRGljdCl7Y29uc3QgYT1yLmdldCgiRm9udCIpO2lmKGEgaW5zdGFuY2VvZiBzLkRpY3QmJmEuaGFzKG4pKXtjb25zdCByPW5ldyBzLkRpY3QoZSk7ci5zZXQobixhLmdldFJhdyhuKSk7Y29uc3QgaT1uZXcgcy5EaWN0KGUpO2kuc2V0KCJGb250IixyKTtyZXR1cm4gcy5EaWN0Lm1lcmdlKHt4cmVmOmUsZGljdEFycmF5OltpLHRdLG1lcmdlU3ViRGljdHM6ITB9KX19cmV0dXJuIHR8fHMuRGljdC5lbXB0eX1nZXRGaWVsZE9iamVjdCgpe3JldHVybiBudWxsfX1jbGFzcyBUZXh0V2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEucmVhZE9ubHkmJiF0aGlzLmRhdGEubm9IVE1MO3RoaXMuX2hhc1RleHQ9ITA7Y29uc3QgdD1lLmRpY3Q7InN0cmluZyIhPXR5cGVvZiB0aGlzLmRhdGEuZmllbGRWYWx1ZSYmKHRoaXMuZGF0YS5maWVsZFZhbHVlPSIiKTtsZXQgYT0oMCxuLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJRIn0pOyghTnVtYmVyLmlzSW50ZWdlcihhKXx8YTwwfHxhPjIpJiYoYT1udWxsKTt0aGlzLmRhdGEudGV4dEFsaWdubWVudD1hO2xldCBpPSgwLG4uZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dCxrZXk6Ik1heExlbiJ9KTsoIU51bWJlci5pc0ludGVnZXIoaSl8fGk8MCkmJihpPTApO3RoaXMuZGF0YS5tYXhMZW49aTt0aGlzLmRhdGEubXVsdGlMaW5lPXRoaXMuaGFzRmllbGRGbGFnKHIuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpO3RoaXMuZGF0YS5jb21iPXRoaXMuaGFzRmllbGRGbGFnKHIuQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSYmIXRoaXMuaGFzRmllbGRGbGFnKHIuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpJiYhdGhpcy5oYXNGaWVsZEZsYWcoci5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKSYmIXRoaXMuaGFzRmllbGRGbGFnKHIuQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSYmMCE9PXRoaXMuZGF0YS5tYXhMZW47dGhpcy5kYXRhLmRvTm90U2Nyb2xsPXRoaXMuaGFzRmllbGRGbGFnKHIuQW5ub3RhdGlvbkZpZWxkRmxhZy5ET05PVFNDUk9MTCl9Z2V0IGhhc1RleHRDb250ZW50KCl7cmV0dXJuISF0aGlzLmFwcGVhcmFuY2UmJiF0aGlzLl9uZWVkQXBwZWFyYW5jZXN9X2dldENvbWJBcHBlYXJhbmNlKGUsdCxhLHIsaSxzLG8sYyxsLGgsdSl7Y29uc3QgZD1pL3RoaXMuZGF0YS5tYXhMZW4sZj10aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyh1KSxnPVtdLHA9dC5nZXRDaGFyUG9zaXRpb25zKGEpO2Zvcihjb25zdFtlLHRdb2YgcClnLnB1c2goYCgkeygwLG4uZXNjYXBlU3RyaW5nKShhLnN1YnN0cmluZyhlLHQpKX0pIFRqYCk7Y29uc3QgbT1nLmpvaW4oYCAkeygwLG4ubnVtYmVyVG9TdHJpbmcpKGQpfSAwIFRkIGApO3JldHVybmAvVHggQk1DIHEgJHtmfUJUIGArZStgIDEgMCAwIDEgJHsoMCxuLm51bWJlclRvU3RyaW5nKShvKX0gJHsoMCxuLm51bWJlclRvU3RyaW5nKShjK2wpfSBUbSAke219IEVUIFEgRU1DYH1fZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZShlLHQsYSxyLGkscyxvLGMsbCxoLHUsZCl7Y29uc3QgZj1bXSxnPWktMipjLHA9e3NoaWZ0OjB9O2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10W2VdLHM9dGhpcy5fc3BsaXRMaW5lKG4sYSxyLGcpO2ZvcihsZXQgdD0wLG49cy5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgbj1zW3RdLGQ9MD09PWUmJjA9PT10Py1sLSh1LWgpOi11O2YucHVzaCh0aGlzLl9yZW5kZXJUZXh0KG4sYSxyLGksbyxwLGMsZCkpfX1jb25zdCBtPXRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGQpLGI9Zi5qb2luKCJcbiIpO3JldHVybmAvVHggQk1DIHEgJHttfUJUIGArZStgIDEgMCAwIDEgMCAkeygwLG4ubnVtYmVyVG9TdHJpbmcpKHMpfSBUbSAke2J9IEVUIFEgRU1DYH1fc3BsaXRMaW5lKGUsdCxhLHIpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7fTtlPW4ubGluZXx8ZTtjb25zdCBpPW4uZ2x5cGhzfHx0LmNoYXJzVG9HbHlwaHMoZSk7aWYoaS5sZW5ndGg8PTEpcmV0dXJuW2VdO2NvbnN0IHM9bi5wb3NpdGlvbnN8fHQuZ2V0Q2hhclBvc2l0aW9ucyhlKSxvPWEvMWUzLGM9W107bGV0IGw9LTEsaD0tMSx1PS0xLGQ9MCxmPTA7Zm9yKGxldCB0PTAsYT1pLmxlbmd0aDt0PGE7dCsrKXtjb25zdFthLG5dPXNbdF0sZz1pW3RdLHA9Zy53aWR0aCpvO2lmKCIgIj09PWcudW5pY29kZSlpZihmK3A+cil7Yy5wdXNoKGUuc3Vic3RyaW5nKGQsYSkpO2Q9YTtmPXA7bD0tMTt1PS0xfWVsc2V7Zis9cDtsPWE7aD1uO3U9dH1lbHNlIGlmKGYrcD5yKWlmKC0xIT09bCl7Yy5wdXNoKGUuc3Vic3RyaW5nKGQsaCkpO2Q9aDt0PXUrMTtsPS0xO2Y9MH1lbHNle2MucHVzaChlLnN1YnN0cmluZyhkLGEpKTtkPWE7Zj1wfWVsc2UgZis9cH1kPGUubGVuZ3RoJiZjLnB1c2goZS5zdWJzdHJpbmcoZCxlLmxlbmd0aCkpO3JldHVybiBjfWdldEZpZWxkT2JqZWN0KCl7cmV0dXJue2lkOnRoaXMuZGF0YS5pZCx2YWx1ZTp0aGlzLmRhdGEuZmllbGRWYWx1ZSxkZWZhdWx0VmFsdWU6dGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlfHwiIixtdWx0aWxpbmU6dGhpcy5kYXRhLm11bHRpTGluZSxwYXNzd29yZDp0aGlzLmhhc0ZpZWxkRmxhZyhyLkFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQpLGNoYXJMaW1pdDp0aGlzLmRhdGEubWF4TGVuLGNvbWI6dGhpcy5kYXRhLmNvbWIsZWRpdGFibGU6IXRoaXMuZGF0YS5yZWFkT25seSxoaWRkZW46dGhpcy5kYXRhLmhpZGRlbixuYW1lOnRoaXMuZGF0YS5maWVsZE5hbWUscmVjdDp0aGlzLmRhdGEucmVjdCxhY3Rpb25zOnRoaXMuZGF0YS5hY3Rpb25zLHBhZ2U6dGhpcy5kYXRhLnBhZ2VJbmRleCxzdHJva2VDb2xvcjp0aGlzLmRhdGEuYm9yZGVyQ29sb3IsZmlsbENvbG9yOnRoaXMuZGF0YS5iYWNrZ3JvdW5kQ29sb3Iscm90YXRpb246dGhpcy5yb3RhdGlvbix0eXBlOiJ0ZXh0In19fWNsYXNzIEJ1dHRvbldpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuY2hlY2tlZEFwcGVhcmFuY2U9bnVsbDt0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2U9bnVsbDt0aGlzLmRhdGEuY2hlY2tCb3g9IXRoaXMuaGFzRmllbGRGbGFnKHIuQW5ub3RhdGlvbkZpZWxkRmxhZy5SQURJTykmJiF0aGlzLmhhc0ZpZWxkRmxhZyhyLkFubm90YXRpb25GaWVsZEZsYWcuUFVTSEJVVFRPTik7dGhpcy5kYXRhLnJhZGlvQnV0dG9uPXRoaXMuaGFzRmllbGRGbGFnKHIuQW5ub3RhdGlvbkZpZWxkRmxhZy5SQURJTykmJiF0aGlzLmhhc0ZpZWxkRmxhZyhyLkFubm90YXRpb25GaWVsZEZsYWcuUFVTSEJVVFRPTik7dGhpcy5kYXRhLnB1c2hCdXR0b249dGhpcy5oYXNGaWVsZEZsYWcoci5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pO3RoaXMuZGF0YS5pc1Rvb2x0aXBPbmx5PSExO2lmKHRoaXMuZGF0YS5jaGVja0JveCl0aGlzLl9wcm9jZXNzQ2hlY2tCb3goZSk7ZWxzZSBpZih0aGlzLmRhdGEucmFkaW9CdXR0b24pdGhpcy5fcHJvY2Vzc1JhZGlvQnV0dG9uKGUpO2Vsc2UgaWYodGhpcy5kYXRhLnB1c2hCdXR0b24pe3RoaXMuZGF0YS5oYXNPd25DYW52YXM9ITA7dGhpcy5fcHJvY2Vzc1B1c2hCdXR0b24oZSl9ZWxzZSgwLHIud2FybikoIkludmFsaWQgZmllbGQgZmxhZ3MgZm9yIGJ1dHRvbiB3aWRnZXQgYW5ub3RhdGlvbiIpfWFzeW5jIGdldE9wZXJhdG9yTGlzdChlLHQsYSxuLGkpe2lmKHRoaXMuZGF0YS5wdXNoQnV0dG9uKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LGEsITEsaSk7bGV0IHM9bnVsbCxvPW51bGw7aWYoaSl7Y29uc3QgZT1pLmdldCh0aGlzLmRhdGEuaWQpO3M9ZT9lLnZhbHVlOm51bGw7bz1lP2Uucm90YXRpb246bnVsbH1pZihudWxsPT09cyYmdGhpcy5hcHBlYXJhbmNlKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LGEsbixpKTtudWxsPT1zJiYocz10aGlzLmRhdGEuY2hlY2tCb3g/dGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuZXhwb3J0VmFsdWU6dGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuYnV0dG9uVmFsdWUpO2NvbnN0IGM9cz90aGlzLmNoZWNrZWRBcHBlYXJhbmNlOnRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTtpZihjKXtjb25zdCBzPXRoaXMuYXBwZWFyYW5jZSxsPWMuZGljdC5nZXRBcnJheSgiTWF0cml4Iil8fHIuSURFTlRJVFlfTUFUUklYO28mJmMuZGljdC5zZXQoIk1hdHJpeCIsdGhpcy5nZXRSb3RhdGlvbk1hdHJpeChpKSk7dGhpcy5hcHBlYXJhbmNlPWM7Y29uc3QgaD1zdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LGEsbixpKTt0aGlzLmFwcGVhcmFuY2U9cztjLmRpY3Quc2V0KCJNYXRyaXgiLGwpO3JldHVybiBofXJldHVybntvcExpc3Q6bmV3IG0uT3BlcmF0b3JMaXN0LHNlcGFyYXRlRm9ybTohMSxzZXBhcmF0ZUNhbnZhczohMX19YXN5bmMgc2F2ZShlLHQsYSl7cmV0dXJuIHRoaXMuZGF0YS5jaGVja0JveD90aGlzLl9zYXZlQ2hlY2tib3goZSx0LGEpOnRoaXMuZGF0YS5yYWRpb0J1dHRvbj90aGlzLl9zYXZlUmFkaW9CdXR0b24oZSx0LGEpOm51bGx9YXN5bmMgX3NhdmVDaGVja2JveChlLHQsYSl7aWYoIWEpcmV0dXJuIG51bGw7Y29uc3Qgbj1hLmdldCh0aGlzLmRhdGEuaWQpO2xldCBpPW4/LnJvdGF0aW9uLG89bj8udmFsdWU7aWYodm9pZCAwPT09aSl7aWYodm9pZCAwPT09bylyZXR1cm4gbnVsbDtpZih0aGlzLmRhdGEuZmllbGRWYWx1ZT09PXRoaXMuZGF0YS5leHBvcnRWYWx1ZT09PW8pcmV0dXJuIG51bGx9Y29uc3QgbD1lLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7aWYoIShsIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm4gbnVsbDt2b2lkIDA9PT1pJiYoaT10aGlzLnJvdGF0aW9uKTt2b2lkIDA9PT1vJiYobz10aGlzLmRhdGEuZmllbGRWYWx1ZT09PXRoaXMuZGF0YS5leHBvcnRWYWx1ZSk7Y29uc3QgaD17cGF0aDp0aGlzLmRhdGEuZmllbGROYW1lLHZhbHVlOm8/dGhpcy5kYXRhLmV4cG9ydFZhbHVlOiIifSx1PXMuTmFtZS5nZXQobz90aGlzLmRhdGEuZXhwb3J0VmFsdWU6Ik9mZiIpO2wuc2V0KCJWIix1KTtsLnNldCgiQVMiLHUpO2wuc2V0KCJNIixgRDokeygwLHIuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKX1gKTtjb25zdCBkPXRoaXMuX2dldE1LRGljdChpKTtkJiZsLnNldCgiTUsiLGQpO2NvbnN0IGY9ZS54cmVmLmVuY3J5cHQ7bGV0IGc9bnVsbDtmJiYoZz1mLmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnJlZi5udW0sdGhpcy5yZWYuZ2VuKSk7Y29uc3QgcD1bYCR7dGhpcy5yZWYubnVtfSAke3RoaXMucmVmLmdlbn0gb2JqXG5gXTthd2FpdCgwLGMud3JpdGVEaWN0KShsLHAsZyk7cC5wdXNoKCJcbmVuZG9ialxuIik7cmV0dXJuW3tyZWY6dGhpcy5yZWYsZGF0YTpwLmpvaW4oIiIpLHhmYTpofV19YXN5bmMgX3NhdmVSYWRpb0J1dHRvbihlLHQsYSl7aWYoIWEpcmV0dXJuIG51bGw7Y29uc3Qgbj1hLmdldCh0aGlzLmRhdGEuaWQpO2xldCBpPW4/LnJvdGF0aW9uLG89bj8udmFsdWU7aWYodm9pZCAwPT09aSl7aWYodm9pZCAwPT09bylyZXR1cm4gbnVsbDtpZih0aGlzLmRhdGEuZmllbGRWYWx1ZT09PXRoaXMuZGF0YS5idXR0b25WYWx1ZT09PW8pcmV0dXJuIG51bGx9Y29uc3QgbD1lLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7aWYoIShsIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm4gbnVsbDt2b2lkIDA9PT1vJiYobz10aGlzLmRhdGEuZmllbGRWYWx1ZT09PXRoaXMuZGF0YS5idXR0b25WYWx1ZSk7dm9pZCAwPT09aSYmKGk9dGhpcy5yb3RhdGlvbik7Y29uc3QgaD17cGF0aDp0aGlzLmRhdGEuZmllbGROYW1lLHZhbHVlOm8/dGhpcy5kYXRhLmJ1dHRvblZhbHVlOiIifSx1PXMuTmFtZS5nZXQobz90aGlzLmRhdGEuYnV0dG9uVmFsdWU6Ik9mZiIpO2xldCBkPW51bGw7Y29uc3QgZj1lLnhyZWYuZW5jcnlwdDtpZihvKWlmKHRoaXMucGFyZW50IGluc3RhbmNlb2Ygcy5SZWYpe2NvbnN0IHQ9ZS54cmVmLmZldGNoKHRoaXMucGFyZW50KTtsZXQgYT1udWxsO2YmJihhPWYuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucGFyZW50Lm51bSx0aGlzLnBhcmVudC5nZW4pKTt0LnNldCgiViIsdSk7ZD1bYCR7dGhpcy5wYXJlbnQubnVtfSAke3RoaXMucGFyZW50Lmdlbn0gb2JqXG5gXTthd2FpdCgwLGMud3JpdGVEaWN0KSh0LGQsYSk7ZC5wdXNoKCJcbmVuZG9ialxuIil9ZWxzZSB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIHMuRGljdCYmdGhpcy5wYXJlbnQuc2V0KCJWIix1KTtsLnNldCgiQVMiLHUpO2wuc2V0KCJNIixgRDokeygwLHIuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKX1gKTtjb25zdCBnPXRoaXMuX2dldE1LRGljdChpKTtnJiZsLnNldCgiTUsiLGcpO2xldCBwPW51bGw7ZiYmKHA9Zi5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbikpO2NvbnN0IG09W2Ake3RoaXMucmVmLm51bX0gJHt0aGlzLnJlZi5nZW59IG9ialxuYF07YXdhaXQoMCxjLndyaXRlRGljdCkobCxtLHApO20ucHVzaCgiXG5lbmRvYmpcbiIpO2NvbnN0IGI9W3tyZWY6dGhpcy5yZWYsZGF0YTptLmpvaW4oIiIpLHhmYTpofV07bnVsbCE9PWQmJmIucHVzaCh7cmVmOnRoaXMucGFyZW50LGRhdGE6ZC5qb2luKCIiKSx4ZmE6bnVsbH0pO3JldHVybiBifV9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UoZSx0KXtjb25zdCBhPXRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdLGk9dGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV0sYz1bMCwwLGEsaV0sbD0uOCpNYXRoLm1pbihhLGkpO2xldCBoLHU7aWYoImNoZWNrIj09PXQpe2g9e3dpZHRoOi43NTUqbCxoZWlnaHQ6LjcwNSpsfTt1PSIzIn1lbHNlIGlmKCJkaXNjIj09PXQpe2g9e3dpZHRoOi43OTEqbCxoZWlnaHQ6LjcwNSpsfTt1PSJsIn1lbHNlKDAsci51bnJlYWNoYWJsZSkoYF9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UgLSB1bnN1cHBvcnRlZCB0eXBlOiAke3R9YCk7Y29uc3QgZD1gcSBCVCAvUGRmSnNaYURiICR7bH0gVGYgMCBnICR7KDAsbi5udW1iZXJUb1N0cmluZykoKGEtaC53aWR0aCkvMil9ICR7KDAsbi5udW1iZXJUb1N0cmluZykoKGktaC5oZWlnaHQpLzIpfSBUZCAoJHt1fSkgVGogRVQgUWAsZj1uZXcgcy5EaWN0KGUueHJlZik7Zi5zZXQoIkZvcm1UeXBlIiwxKTtmLnNldCgiU3VidHlwZSIscy5OYW1lLmdldCgiRm9ybSIpKTtmLnNldCgiVHlwZSIscy5OYW1lLmdldCgiWE9iamVjdCIpKTtmLnNldCgiQkJveCIsYyk7Zi5zZXQoIk1hdHJpeCIsWzEsMCwwLDEsMCwwXSk7Zi5zZXQoIkxlbmd0aCIsZC5sZW5ndGgpO2NvbnN0IGc9bmV3IHMuRGljdChlLnhyZWYpLHA9bmV3IHMuRGljdChlLnhyZWYpO3Auc2V0KCJQZGZKc1phRGIiLHRoaXMuZmFsbGJhY2tGb250RGljdCk7Zy5zZXQoIkZvbnQiLHApO2Yuc2V0KCJSZXNvdXJjZXMiLGcpO3RoaXMuY2hlY2tlZEFwcGVhcmFuY2U9bmV3IG8uU3RyaW5nU3RyZWFtKGQpO3RoaXMuY2hlY2tlZEFwcGVhcmFuY2UuZGljdD1mO3RoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKX1fcHJvY2Vzc0NoZWNrQm94KGUpe2NvbnN0IHQ9ZS5kaWN0LmdldCgiQVAiKTtpZighKHQgaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybjtjb25zdCBhPXQuZ2V0KCJOIik7aWYoIShhIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm47Y29uc3Qgcj10aGlzLl9kZWNvZGVGb3JtVmFsdWUoZS5kaWN0LmdldCgiQVMiKSk7InN0cmluZyI9PXR5cGVvZiByJiYodGhpcy5kYXRhLmZpZWxkVmFsdWU9cik7Y29uc3Qgbj1udWxsIT09dGhpcy5kYXRhLmZpZWxkVmFsdWUmJiJPZmYiIT09dGhpcy5kYXRhLmZpZWxkVmFsdWU/dGhpcy5kYXRhLmZpZWxkVmFsdWU6IlllcyIsaT1hLmdldEtleXMoKTtpZigwPT09aS5sZW5ndGgpaS5wdXNoKCJPZmYiLG4pO2Vsc2UgaWYoMT09PWkubGVuZ3RoKSJPZmYiPT09aVswXT9pLnB1c2gobik6aS51bnNoaWZ0KCJPZmYiKTtlbHNlIGlmKGkuaW5jbHVkZXMobikpe2kubGVuZ3RoPTA7aS5wdXNoKCJPZmYiLG4pfWVsc2V7Y29uc3QgZT1pLmZpbmQoKGU9PiJPZmYiIT09ZSkpO2kubGVuZ3RoPTA7aS5wdXNoKCJPZmYiLGUpfWkuaW5jbHVkZXModGhpcy5kYXRhLmZpZWxkVmFsdWUpfHwodGhpcy5kYXRhLmZpZWxkVmFsdWU9Ik9mZiIpO3RoaXMuZGF0YS5leHBvcnRWYWx1ZT1pWzFdO2NvbnN0IG89YS5nZXQodGhpcy5kYXRhLmV4cG9ydFZhbHVlKTt0aGlzLmNoZWNrZWRBcHBlYXJhbmNlPW8gaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0/bzpudWxsO2NvbnN0IGM9YS5nZXQoIk9mZiIpO3RoaXMudW5jaGVja2VkQXBwZWFyYW5jZT1jIGluc3RhbmNlb2YgbC5CYXNlU3RyZWFtP2M6bnVsbDt0aGlzLmNoZWNrZWRBcHBlYXJhbmNlP3RoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKTp0aGlzLl9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UoZSwiY2hlY2siKTt0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UmJnRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UpO3RoaXMuX2ZhbGxiYWNrRm9udERpY3Q9dGhpcy5mYWxsYmFja0ZvbnREaWN0fV9wcm9jZXNzUmFkaW9CdXR0b24oZSl7dGhpcy5kYXRhLmZpZWxkVmFsdWU9dGhpcy5kYXRhLmJ1dHRvblZhbHVlPW51bGw7Y29uc3QgdD1lLmRpY3QuZ2V0KCJQYXJlbnQiKTtpZih0IGluc3RhbmNlb2Ygcy5EaWN0KXt0aGlzLnBhcmVudD1lLmRpY3QuZ2V0UmF3KCJQYXJlbnQiKTtjb25zdCBhPXQuZ2V0KCJWIik7YSBpbnN0YW5jZW9mIHMuTmFtZSYmKHRoaXMuZGF0YS5maWVsZFZhbHVlPXRoaXMuX2RlY29kZUZvcm1WYWx1ZShhKSl9Y29uc3QgYT1lLmRpY3QuZ2V0KCJBUCIpO2lmKCEoYSBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IHI9YS5nZXQoIk4iKTtpZighKHIgaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybjtmb3IoY29uc3QgZSBvZiByLmdldEtleXMoKSlpZigiT2ZmIiE9PWUpe3RoaXMuZGF0YS5idXR0b25WYWx1ZT10aGlzLl9kZWNvZGVGb3JtVmFsdWUoZSk7YnJlYWt9Y29uc3Qgbj1yLmdldCh0aGlzLmRhdGEuYnV0dG9uVmFsdWUpO3RoaXMuY2hlY2tlZEFwcGVhcmFuY2U9biBpbnN0YW5jZW9mIGwuQmFzZVN0cmVhbT9uOm51bGw7Y29uc3QgaT1yLmdldCgiT2ZmIik7dGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlPWkgaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0/aTpudWxsO3RoaXMuY2hlY2tlZEFwcGVhcmFuY2U/dGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpOnRoaXMuX2dldERlZmF1bHRDaGVja2VkQXBwZWFyYW5jZShlLCJkaXNjIik7dGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlJiZ0aGlzLl9zdHJlYW1zLnB1c2godGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKTt0aGlzLl9mYWxsYmFja0ZvbnREaWN0PXRoaXMuZmFsbGJhY2tGb250RGljdH1fcHJvY2Vzc1B1c2hCdXR0b24oZSl7aWYoZS5kaWN0LmhhcygiQSIpfHxlLmRpY3QuaGFzKCJBQSIpfHx0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KXt0aGlzLmRhdGEuaXNUb29sdGlwT25seT0hZS5kaWN0LmhhcygiQSIpJiYhZS5kaWN0LmhhcygiQUEiKTt1LkNhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7ZGVzdERpY3Q6ZS5kaWN0LHJlc3VsdE9iajp0aGlzLmRhdGEsZG9jQmFzZVVybDplLnBkZk1hbmFnZXIuZG9jQmFzZVVybCxkb2NBdHRhY2htZW50czplLmF0dGFjaG1lbnRzfSl9ZWxzZSgwLHIud2FybikoIlB1c2ggYnV0dG9ucyB3aXRob3V0IGFjdGlvbiBkaWN0aW9uYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKX1nZXRGaWVsZE9iamVjdCgpe2xldCBlLHQ9ImJ1dHRvbiI7aWYodGhpcy5kYXRhLmNoZWNrQm94KXt0PSJjaGVja2JveCI7ZT10aGlzLmRhdGEuZXhwb3J0VmFsdWV9ZWxzZSBpZih0aGlzLmRhdGEucmFkaW9CdXR0b24pe3Q9InJhZGlvYnV0dG9uIjtlPXRoaXMuZGF0YS5idXR0b25WYWx1ZX1yZXR1cm57aWQ6dGhpcy5kYXRhLmlkLHZhbHVlOnRoaXMuZGF0YS5maWVsZFZhbHVlfHwiT2ZmIixkZWZhdWx0VmFsdWU6dGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlLGV4cG9ydFZhbHVlczplLGVkaXRhYmxlOiF0aGlzLmRhdGEucmVhZE9ubHksbmFtZTp0aGlzLmRhdGEuZmllbGROYW1lLHJlY3Q6dGhpcy5kYXRhLnJlY3QsaGlkZGVuOnRoaXMuZGF0YS5oaWRkZW4sYWN0aW9uczp0aGlzLmRhdGEuYWN0aW9ucyxwYWdlOnRoaXMuZGF0YS5wYWdlSW5kZXgsc3Ryb2tlQ29sb3I6dGhpcy5kYXRhLmJvcmRlckNvbG9yLGZpbGxDb2xvcjp0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLHJvdGF0aW9uOnRoaXMucm90YXRpb24sdHlwZTp0fX1nZXQgZmFsbGJhY2tGb250RGljdCgpe2NvbnN0IGU9bmV3IHMuRGljdDtlLnNldCgiQmFzZUZvbnQiLHMuTmFtZS5nZXQoIlphcGZEaW5nYmF0cyIpKTtlLnNldCgiVHlwZSIscy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpO2Uuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSk7ZS5zZXQoIkVuY29kaW5nIixzLk5hbWUuZ2V0KCJaYXBmRGluZ2JhdHNFbmNvZGluZyIpKTtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiZmFsbGJhY2tGb250RGljdCIsZSl9fWNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOmF9PWU7dGhpcy5pbmRpY2VzPXQuZ2V0QXJyYXkoIkkiKTt0aGlzLmhhc0luZGljZXM9QXJyYXkuaXNBcnJheSh0aGlzLmluZGljZXMpJiZ0aGlzLmluZGljZXMubGVuZ3RoPjA7dGhpcy5kYXRhLm9wdGlvbnM9W107Y29uc3QgaT0oMCxuLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJPcHQifSk7aWYoQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IGU9MCx0PWkubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHQ9YS5mZXRjaElmUmVmKGlbZV0pLHI9QXJyYXkuaXNBcnJheSh0KTt0aGlzLmRhdGEub3B0aW9uc1tlXT17ZXhwb3J0VmFsdWU6dGhpcy5fZGVjb2RlRm9ybVZhbHVlKHI/YS5mZXRjaElmUmVmKHRbMF0pOnQpLGRpc3BsYXlWYWx1ZTp0aGlzLl9kZWNvZGVGb3JtVmFsdWUocj9hLmZldGNoSWZSZWYodFsxXSk6dCl9fWlmKHRoaXMuaGFzSW5kaWNlcyl7dGhpcy5kYXRhLmZpZWxkVmFsdWU9W107Y29uc3QgZT10aGlzLmRhdGEub3B0aW9ucy5sZW5ndGg7Zm9yKGNvbnN0IHQgb2YgdGhpcy5pbmRpY2VzKU51bWJlci5pc0ludGVnZXIodCkmJnQ+PTAmJnQ8ZSYmdGhpcy5kYXRhLmZpZWxkVmFsdWUucHVzaCh0aGlzLmRhdGEub3B0aW9uc1t0XS5leHBvcnRWYWx1ZSl9ZWxzZSJzdHJpbmciPT10eXBlb2YgdGhpcy5kYXRhLmZpZWxkVmFsdWU/dGhpcy5kYXRhLmZpZWxkVmFsdWU9W3RoaXMuZGF0YS5maWVsZFZhbHVlXTp0aGlzLmRhdGEuZmllbGRWYWx1ZXx8KHRoaXMuZGF0YS5maWVsZFZhbHVlPVtdKTt0aGlzLmRhdGEuY29tYm89dGhpcy5oYXNGaWVsZEZsYWcoci5Bbm5vdGF0aW9uRmllbGRGbGFnLkNPTUJPKTt0aGlzLmRhdGEubXVsdGlTZWxlY3Q9dGhpcy5oYXNGaWVsZEZsYWcoci5Bbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJU0VMRUNUKTt0aGlzLl9oYXNUZXh0PSEwfWdldEZpZWxkT2JqZWN0KCl7Y29uc3QgZT10aGlzLmRhdGEuY29tYm8/ImNvbWJvYm94IjoibGlzdGJveCIsdD10aGlzLmRhdGEuZmllbGRWYWx1ZS5sZW5ndGg+MD90aGlzLmRhdGEuZmllbGRWYWx1ZVswXTpudWxsO3JldHVybntpZDp0aGlzLmRhdGEuaWQsdmFsdWU6dCxkZWZhdWx0VmFsdWU6dGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlLGVkaXRhYmxlOiF0aGlzLmRhdGEucmVhZE9ubHksbmFtZTp0aGlzLmRhdGEuZmllbGROYW1lLHJlY3Q6dGhpcy5kYXRhLnJlY3QsbnVtSXRlbXM6dGhpcy5kYXRhLmZpZWxkVmFsdWUubGVuZ3RoLG11bHRpcGxlU2VsZWN0aW9uOnRoaXMuZGF0YS5tdWx0aVNlbGVjdCxoaWRkZW46dGhpcy5kYXRhLmhpZGRlbixhY3Rpb25zOnRoaXMuZGF0YS5hY3Rpb25zLGl0ZW1zOnRoaXMuZGF0YS5vcHRpb25zLHBhZ2U6dGhpcy5kYXRhLnBhZ2VJbmRleCxzdHJva2VDb2xvcjp0aGlzLmRhdGEuYm9yZGVyQ29sb3IsZmlsbENvbG9yOnRoaXMuZGF0YS5iYWNrZ3JvdW5kQ29sb3Iscm90YXRpb246dGhpcy5yb3RhdGlvbix0eXBlOmV9fWFtZW5kU2F2ZWREaWN0KGUsdCl7aWYoIXRoaXMuaGFzSW5kaWNlcylyZXR1cm47bGV0IGE9ZT8uZ2V0KHRoaXMuZGF0YS5pZCk/LnZhbHVlO0FycmF5LmlzQXJyYXkoYSl8fChhPVthXSk7Y29uc3Qgcj1bXSx7b3B0aW9uczpufT10aGlzLmRhdGE7Zm9yKGxldCBlPTAsdD0wLGk9bi5sZW5ndGg7ZTxpO2UrKylpZihuW2VdLmV4cG9ydFZhbHVlPT09YVt0XSl7ci5wdXNoKGUpO3QrPTF9dC5zZXQoIkkiLHIpfWFzeW5jIF9nZXRBcHBlYXJhbmNlKGUsdCxhLG4pe2lmKHRoaXMuZGF0YS5jb21ibylyZXR1cm4gc3VwZXIuX2dldEFwcGVhcmFuY2UoZSx0LGEsbik7bGV0IHMsbztjb25zdCBjPW4/LmdldCh0aGlzLmRhdGEuaWQpO2lmKGMpe289Yy5yb3RhdGlvbjtzPWMudmFsdWV9aWYodm9pZCAwPT09byYmdm9pZCAwPT09cyYmIXRoaXMuX25lZWRBcHBlYXJhbmNlcylyZXR1cm4gbnVsbDt2b2lkIDA9PT1zP3M9dGhpcy5kYXRhLmZpZWxkVmFsdWU6QXJyYXkuaXNBcnJheShzKXx8KHM9W3NdKTtsZXQgbD10aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXSxoPXRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdOzkwIT09byYmMjcwIT09b3x8KFtoLGxdPVtsLGhdKTtjb25zdCB1PXRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aCxkPVtdO2ZvcihsZXQgZT0wO2U8dTtlKyspe2NvbnN0e2V4cG9ydFZhbHVlOnR9PXRoaXMuZGF0YS5vcHRpb25zW2VdO3MuaW5jbHVkZXModCkmJmQucHVzaChlKX10aGlzLl9kZWZhdWx0QXBwZWFyYW5jZXx8KHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE9KDAsaS5wYXJzZURlZmF1bHRBcHBlYXJhbmNlKSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZT0iL0hlbHZldGljYSAwIFRmIDAgZyIpKTtjb25zdCBmPWF3YWl0IFdpZGdldEFubm90YXRpb24uX2dldEZvbnREYXRhKGUsdCx0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcyk7bGV0IGcse2ZvbnRTaXplOnB9PXRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE7aWYocClnPXRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlO2Vsc2V7Y29uc3QgZT0obC0xKS91O2xldCB0LGE9LTE7Zm9yKGNvbnN0e2Rpc3BsYXlWYWx1ZTplfW9mIHRoaXMuZGF0YS5vcHRpb25zKXtjb25zdCByPXRoaXMuX2dldFRleHRXaWR0aChlLGYpO2lmKHI+YSl7YT1yO3Q9ZX19W2cscF09dGhpcy5fY29tcHV0ZUZvbnRTaXplKGUsaC00LHQsZiwtMSl9Y29uc3QgbT1wKnIuTElORV9GQUNUT1IsYj0obS1wKS8yLHk9TWF0aC5mbG9vcihsL20pO2xldCB3PTA7aWYoZC5sZW5ndGg+MCl7Y29uc3QgZT1NYXRoLm1pbiguLi5kKSx0PU1hdGgubWF4KC4uLmQpO3c9TWF0aC5tYXgoMCx0LXkrMSk7dz5lJiYodz1lKX1jb25zdCBTPU1hdGgubWluKHcreSsxLHUpLHg9WyIvVHggQk1DIHEiLGAxIDEgJHtofSAke2x9IHJlIFcgbmBdO2lmKGQubGVuZ3RoKXt4LnB1c2goIjAuNjAwMDA2IDAuNzU2ODY2IDAuODU0OTA0IHJnIik7Zm9yKGNvbnN0IGUgb2YgZCl3PD1lJiZlPFMmJngucHVzaChgMSAke2wtKGUtdysxKSptfSAke2h9ICR7bX0gcmUgZmApfXgucHVzaCgiQlQiLGcsYDEgMCAwIDEgMCAke2x9IFRtYCk7Y29uc3QgQz17c2hpZnQ6MH07Zm9yKGxldCBlPXc7ZTxTO2UrKyl7Y29uc3R7ZGlzcGxheVZhbHVlOnR9PXRoaXMuZGF0YS5vcHRpb25zW2VdLGE9ZT09PXc/YjowO3gucHVzaCh0aGlzLl9yZW5kZXJUZXh0KHQsZixwLGgsMCxDLDIsLW0rYSkpfXgucHVzaCgiRVQgUSBFTUMiKTtyZXR1cm4geC5qb2luKCJcbiIpfX1jbGFzcyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLmRhdGEuZmllbGRWYWx1ZT1udWxsO3RoaXMuZGF0YS5oYXNPd25DYW52YXM9dGhpcy5kYXRhLm5vUm90YXRlfWdldEZpZWxkT2JqZWN0KCl7cmV0dXJue2lkOnRoaXMuZGF0YS5pZCx2YWx1ZTpudWxsLHBhZ2U6dGhpcy5kYXRhLnBhZ2VJbmRleCx0eXBlOiJzaWduYXR1cmUifX19Y2xhc3MgVGV4dEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5ub1JvdGF0ZT0hMDt0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZTtjb25zdHtkaWN0OnR9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPXIuQW5ub3RhdGlvblR5cGUuVEVYVDtpZih0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSl0aGlzLmRhdGEubmFtZT0iTm9JY29uIjtlbHNle3RoaXMuZGF0YS5yZWN0WzFdPXRoaXMuZGF0YS5yZWN0WzNdLTIyO3RoaXMuZGF0YS5yZWN0WzJdPXRoaXMuZGF0YS5yZWN0WzBdKzIyO3RoaXMuZGF0YS5uYW1lPXQuaGFzKCJOYW1lIik/dC5nZXQoIk5hbWUiKS5uYW1lOiJOb3RlIn1pZih0LmhhcygiU3RhdGUiKSl7dGhpcy5kYXRhLnN0YXRlPXQuZ2V0KCJTdGF0ZSIpfHxudWxsO3RoaXMuZGF0YS5zdGF0ZU1vZGVsPXQuZ2V0KCJTdGF0ZU1vZGVsIil8fG51bGx9ZWxzZXt0aGlzLmRhdGEuc3RhdGU9bnVsbDt0aGlzLmRhdGEuc3RhdGVNb2RlbD1udWxsfX19Y2xhc3MgTGlua0Fubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1yLkFubm90YXRpb25UeXBlLkxJTks7Y29uc3QgdD1nZXRRdWFkUG9pbnRzKGUuZGljdCx0aGlzLnJlY3RhbmdsZSk7dCYmKHRoaXMuZGF0YS5xdWFkUG9pbnRzPXQpO3RoaXMuZGF0YS5ib3JkZXJDb2xvcnx8PXRoaXMuZGF0YS5jb2xvcjt1LkNhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7ZGVzdERpY3Q6ZS5kaWN0LHJlc3VsdE9iajp0aGlzLmRhdGEsZG9jQmFzZVVybDplLnBkZk1hbmFnZXIuZG9jQmFzZVVybCxkb2NBdHRhY2htZW50czplLmF0dGFjaG1lbnRzfSl9fWNsYXNzIFBvcHVwQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7Y29uc3R7ZGljdDp0fT1lO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1yLkFubm90YXRpb25UeXBlLlBPUFVQO3RoaXMuZGF0YS5yZWN0WzBdIT09dGhpcy5kYXRhLnJlY3RbMl0mJnRoaXMuZGF0YS5yZWN0WzFdIT09dGhpcy5kYXRhLnJlY3RbM118fCh0aGlzLmRhdGEucmVjdD1udWxsKTtsZXQgYT10LmdldCgiUGFyZW50Iik7aWYoIWEpeygwLHIud2FybikoIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLiIpO3JldHVybn1jb25zdCBuPWEuZ2V0QXJyYXkoIlJlY3QiKTt0aGlzLmRhdGEucGFyZW50UmVjdD1BcnJheS5pc0FycmF5KG4pJiY0PT09bi5sZW5ndGg/ci5VdGlsLm5vcm1hbGl6ZVJlY3Qobik6bnVsbDtjb25zdCBpPWEuZ2V0KCJSVCIpOygwLHMuaXNOYW1lKShpLHIuQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkmJihhPWEuZ2V0KCJJUlQiKSk7aWYoYS5oYXMoIk0iKSl7dGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKGEuZ2V0KCJNIikpO3RoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlPXRoaXMubW9kaWZpY2F0aW9uRGF0ZX1lbHNlIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlPW51bGw7aWYoYS5oYXMoIkMiKSl7dGhpcy5zZXRDb2xvcihhLmdldEFycmF5KCJDIikpO3RoaXMuZGF0YS5jb2xvcj10aGlzLmNvbG9yfWVsc2UgdGhpcy5kYXRhLmNvbG9yPW51bGw7aWYoIXRoaXMudmlld2FibGUpe2NvbnN0IGU9YS5nZXQoIkYiKTt0aGlzLl9pc1ZpZXdhYmxlKGUpJiZ0aGlzLnNldEZsYWdzKGUpfXRoaXMuc2V0VGl0bGUoYS5nZXQoIlQiKSk7dGhpcy5kYXRhLnRpdGxlT2JqPXRoaXMuX3RpdGxlO3RoaXMuc2V0Q29udGVudHMoYS5nZXQoIkNvbnRlbnRzIikpO3RoaXMuZGF0YS5jb250ZW50c09iaj10aGlzLl9jb250ZW50czthLmhhcygiUkMiKSYmKHRoaXMuZGF0YS5yaWNoVGV4dD1iLlhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwoYS5nZXQoIlJDIikpKTt0aGlzLmRhdGEub3Blbj0hIXQuZ2V0KCJPcGVuIil9fXQuUG9wdXBBbm5vdGF0aW9uPVBvcHVwQW5ub3RhdGlvbjtjbGFzcyBGcmVlVGV4dEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3RoaXMuZGF0YS5oYXNPd25DYW52YXM9ITA7Y29uc3R7ZXZhbHVhdG9yT3B0aW9uczp0LHhyZWY6YX09ZTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9ci5Bbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDt0aGlzLnNldERlZmF1bHRBcHBlYXJhbmNlKGUpO2lmKHRoaXMuYXBwZWFyYW5jZSl7Y29uc3R7Zm9udENvbG9yOmUsZm9udFNpemU6cn09KDAsaS5wYXJzZUFwcGVhcmFuY2VTdHJlYW0pKHRoaXMuYXBwZWFyYW5jZSx0LGEpO3RoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udENvbG9yPWU7dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250U2l6ZT1yfHwxMH1lbHNlIGlmKHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKXtjb25zdCB0PWUuZGljdC5nZXQoIkNBIikscj1uZXcgaS5GYWtlVW5pY29kZUZvbnQoYSwic2Fucy1zZXJpZiIpO3RoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemV8fD0xMDtjb25zdHtmb250Q29sb3I6bixmb250U2l6ZTpzfT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO3RoaXMuYXBwZWFyYW5jZT1yLmNyZWF0ZUFwcGVhcmFuY2UodGhpcy5fY29udGVudHMuc3RyLHRoaXMucmVjdGFuZ2xlLHRoaXMucm90YXRpb24scyxuLHQpO3RoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmFwcGVhcmFuY2UsaS5GYWtlVW5pY29kZUZvbnQudG9Vbmljb2RlU3RyZWFtKX1lbHNlKDAsci53YXJuKSgiRnJlZVRleHRBbm5vdGF0aW9uOiBPZmZzY3JlZW5DYW52YXMgaXMgbm90IHN1cHBvcnRlZCwgYW5ub3RhdGlvbiBtYXkgbm90IHJlbmRlciBjb3JyZWN0bHkuIil9Z2V0IGhhc1RleHRDb250ZW50KCl7cmV0dXJuISF0aGlzLmFwcGVhcmFuY2V9c3RhdGljIGNyZWF0ZU5ld0RpY3QoZSx0LGEpe2xldHthcFJlZjpvLGFwOmN9PWE7Y29uc3R7Y29sb3I6bCxmb250U2l6ZTpoLHJlY3Q6dSxyb3RhdGlvbjpkLHVzZXI6Zix2YWx1ZTpnfT1lLHA9bmV3IHMuRGljdCh0KTtwLnNldCgiVHlwZSIscy5OYW1lLmdldCgiQW5ub3QiKSk7cC5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIkZyZWVUZXh0IikpO3Auc2V0KCJDcmVhdGlvbkRhdGUiLGBEOiR7KDAsci5nZXRNb2RpZmljYXRpb25EYXRlKSgpfWApO3Auc2V0KCJSZWN0Iix1KTtjb25zdCBtPWAvSGVsdiAke2h9IFRmICR7KDAsaS5nZXRQZGZDb2xvcikobCwhMCl9YDtwLnNldCgiREEiLG0pO3Auc2V0KCJDb250ZW50cyIsKDAsbi5pc0FzY2lpKShnKT9nOigwLG4uc3RyaW5nVG9VVEYxNlN0cmluZykoZywhMCkpO3Auc2V0KCJGIiw0KTtwLnNldCgiQm9yZGVyIixbMCwwLDBdKTtwLnNldCgiUm90YXRlIixkKTtmJiZwLnNldCgiVCIsKDAsbi5pc0FzY2lpKShmKT9mOigwLG4uc3RyaW5nVG9VVEYxNlN0cmluZykoZiwhMCkpO2lmKG98fGMpe2NvbnN0IGU9bmV3IHMuRGljdCh0KTtwLnNldCgiQVAiLGUpO28/ZS5zZXQoIk4iLG8pOmUuc2V0KCJOIixjKX1yZXR1cm4gcH1zdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShlLHQsYSl7Y29uc3R7YmFzZUZvbnRSZWY6YyxldmFsdWF0b3I6bCx0YXNrOmh9PWEse2NvbG9yOnUsZm9udFNpemU6ZCxyZWN0OmYscm90YXRpb246Zyx2YWx1ZTpwfT1lLG09bmV3IHMuRGljdCh0KSxiPW5ldyBzLkRpY3QodCk7aWYoYyliLnNldCgiSGVsdiIsYyk7ZWxzZXtjb25zdCBlPW5ldyBzLkRpY3QodCk7ZS5zZXQoIkJhc2VGb250IixzLk5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSk7ZS5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkZvbnQiKSk7ZS5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIlR5cGUxIikpO2Uuc2V0KCJFbmNvZGluZyIscy5OYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpO2Iuc2V0KCJIZWx2IixlKX1tLnNldCgiRm9udCIsYik7Y29uc3QgeT1hd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShsLGgse2ZvbnROYW1lOiJIZWx2Iixmb250U2l6ZTpkfSxtKSxbdyxTLHgsQ109ZjtsZXQgdj14LXcsaz1DLVM7ZyUxODAhPTAmJihbdixrXT1bayx2XSk7Y29uc3QgTz1wLnNwbGl0KCJcbiIpLFQ9ZC8xZTM7bGV0IE09LTEvMDtjb25zdCBFPVtdO2ZvcihsZXQgZSBvZiBPKXtjb25zdCB0PXkuZW5jb2RlU3RyaW5nKGUpO2lmKHQubGVuZ3RoPjEpcmV0dXJuIG51bGw7ZT10LmpvaW4oIiIpO0UucHVzaChlKTtsZXQgYT0wO2NvbnN0IHI9eS5jaGFyc1RvR2x5cGhzKGUpO2Zvcihjb25zdCBlIG9mIHIpYSs9ZS53aWR0aCpUO009TWF0aC5tYXgoTSxhKX1sZXQgRD0xO00+diYmKEQ9di9NKTtsZXQgTj0xO2NvbnN0IFI9ci5MSU5FX0ZBQ1RPUipkLEw9KHIuTElORV9GQUNUT1Itci5MSU5FX0RFU0NFTlRfRkFDVE9SKSpkLCQ9UipPLmxlbmd0aDskPmsmJihOPWsvJCk7Y29uc3QgXz1kKk1hdGgubWluKEQsTik7bGV0IGosVSxYO3N3aXRjaChnKXtjYXNlIDA6WD1bMSwwLDAsMV07VT1bZlswXSxmWzFdLHYsa107aj1bZlswXSxmWzNdLUxdO2JyZWFrO2Nhc2UgOTA6WD1bMCwxLC0xLDBdO1U9W2ZbMV0sLWZbMl0sdixrXTtqPVtmWzFdLC1mWzBdLUxdO2JyZWFrO2Nhc2UgMTgwOlg9Wy0xLDAsMCwtMV07VT1bLWZbMl0sLWZbM10sdixrXTtqPVstZlsyXSwtZlsxXS1MXTticmVhaztjYXNlIDI3MDpYPVswLC0xLDEsMF07VT1bLWZbM10sZlswXSx2LGtdO2o9Wy1mWzNdLGZbMl0tTF19Y29uc3QgSD1bInEiLGAke1guam9pbigiICIpfSAwIDAgY21gLGAke1Uuam9pbigiICIpfSByZSBXIG5gLCJCVCIsYCR7KDAsaS5nZXRQZGZDb2xvcikodSwhMCl9YCxgMCBUYyAvSGVsdiAkeygwLG4ubnVtYmVyVG9TdHJpbmcpKF8pfSBUZmBdO0gucHVzaChgJHtqLmpvaW4oIiAiKX0gVGQgKCR7KDAsbi5lc2NhcGVTdHJpbmcpKEVbMF0pfSkgVGpgKTtjb25zdCBxPSgwLG4ubnVtYmVyVG9TdHJpbmcpKFIpO2ZvcihsZXQgZT0xLHQ9RS5sZW5ndGg7ZTx0O2UrKyl7Y29uc3QgdD1FW2VdO0gucHVzaChgMCAtJHtxfSBUZCAoJHsoMCxuLmVzY2FwZVN0cmluZykodCl9KSBUamApfUgucHVzaCgiRVQiLCJRIik7Y29uc3Qgej1ILmpvaW4oIlxuIiksVz1uZXcgcy5EaWN0KHQpO1cuc2V0KCJGb3JtVHlwZSIsMSk7Vy5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIkZvcm0iKSk7Vy5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIlhPYmplY3QiKSk7Vy5zZXQoIkJCb3giLGYpO1cuc2V0KCJSZXNvdXJjZXMiLG0pO1cuc2V0KCJNYXRyaXgiLFsxLDAsMCwxLC1mWzBdLC1mWzFdXSk7Y29uc3QgRz1uZXcgby5TdHJpbmdTdHJlYW0oeik7Ry5kaWN0PVc7cmV0dXJuIEd9fWNsYXNzIExpbmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjphfT1lO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1yLkFubm90YXRpb25UeXBlLkxJTkU7dGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEubm9Sb3RhdGU7Y29uc3Qgbj10LmdldEFycmF5KCJMIik7dGhpcy5kYXRhLmxpbmVDb29yZGluYXRlcz1yLlV0aWwubm9ybWFsaXplUmVjdChuKTt0aGlzLnNldExpbmVFbmRpbmdzKHQuZ2V0QXJyYXkoIkxFIikpO3RoaXMuZGF0YS5saW5lRW5kaW5ncz10aGlzLmxpbmVFbmRpbmdzO2lmKCF0aGlzLmFwcGVhcmFuY2Upe2NvbnN0IGU9dGhpcy5jb2xvcj9nZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpOlswLDAsMF0saT10LmdldCgiQ0EiKSxzPWdldFJnYkNvbG9yKHQuZ2V0QXJyYXkoIklDIiksbnVsbCksbz1zP2dldFBkZkNvbG9yQXJyYXkocyk6bnVsbCxjPW8/aTpudWxsLGw9dGhpcy5ib3JkZXJTdHlsZS53aWR0aHx8MSxoPTIqbCx1PVt0aGlzLmRhdGEubGluZUNvb3JkaW5hdGVzWzBdLWgsdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1sxXS1oLHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMl0raCx0aGlzLmRhdGEubGluZUNvb3JkaW5hdGVzWzNdK2hdO3IuVXRpbC5pbnRlcnNlY3QodGhpcy5yZWN0YW5nbGUsdSl8fCh0aGlzLnJlY3RhbmdsZT11KTt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjphLGV4dHJhOmAke2x9IHdgLHN0cm9rZUNvbG9yOmUsZmlsbENvbG9yOm8sc3Ryb2tlQWxwaGE6aSxmaWxsQWxwaGE6Yyxwb2ludHNDYWxsYmFjazooZSx0KT0+e2UucHVzaChgJHtuWzBdfSAke25bMV19IG1gLGAke25bMl19ICR7blszXX0gbGAsIlMiKTtyZXR1cm5bdFswXS54LWwsdFsxXS54K2wsdFszXS55LWwsdFsxXS55K2xdfX0pfX19Y2xhc3MgU3F1YXJlQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7Y29uc3R7ZGljdDp0LHhyZWY6YX09ZTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9ci5Bbm5vdGF0aW9uVHlwZS5TUVVBUkU7dGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEubm9Sb3RhdGU7aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP2dldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcik6WzAsMCwwXSxyPXQuZ2V0KCJDQSIpLG49Z2V0UmdiQ29sb3IodC5nZXRBcnJheSgiSUMiKSxudWxsKSxpPW4/Z2V0UGRmQ29sb3JBcnJheShuKTpudWxsLHM9aT9yOm51bGw7aWYoMD09PXRoaXMuYm9yZGVyU3R5bGUud2lkdGgmJiFpKXJldHVybjt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjphLGV4dHJhOmAke3RoaXMuYm9yZGVyU3R5bGUud2lkdGh9IHdgLHN0cm9rZUNvbG9yOmUsZmlsbENvbG9yOmksc3Ryb2tlQWxwaGE6cixmaWxsQWxwaGE6cyxwb2ludHNDYWxsYmFjazooZSx0KT0+e2NvbnN0IGE9dFsyXS54K3RoaXMuYm9yZGVyU3R5bGUud2lkdGgvMixyPXRbMl0ueSt0aGlzLmJvcmRlclN0eWxlLndpZHRoLzIsbj10WzNdLngtdFsyXS54LXRoaXMuYm9yZGVyU3R5bGUud2lkdGgscz10WzFdLnktdFszXS55LXRoaXMuYm9yZGVyU3R5bGUud2lkdGg7ZS5wdXNoKGAke2F9ICR7cn0gJHtufSAke3N9IHJlYCk7aT9lLnB1c2goIkIiKTplLnB1c2goIlMiKTtyZXR1cm5bdFswXS54LHRbMV0ueCx0WzNdLnksdFsxXS55XX19KX19fWNsYXNzIENpcmNsZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOmF9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPXIuQW5ub3RhdGlvblR5cGUuQ0lSQ0xFO2lmKCF0aGlzLmFwcGVhcmFuY2Upe2NvbnN0IGU9dGhpcy5jb2xvcj9nZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpOlswLDAsMF0scj10LmdldCgiQ0EiKSxuPWdldFJnYkNvbG9yKHQuZ2V0QXJyYXkoIklDIiksbnVsbCksaT1uP2dldFBkZkNvbG9yQXJyYXkobik6bnVsbCxzPWk/cjpudWxsO2lmKDA9PT10aGlzLmJvcmRlclN0eWxlLndpZHRoJiYhaSlyZXR1cm47Y29uc3Qgbz00LzMqTWF0aC50YW4oTWF0aC5QSS84KTt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjphLGV4dHJhOmAke3RoaXMuYm9yZGVyU3R5bGUud2lkdGh9IHdgLHN0cm9rZUNvbG9yOmUsZmlsbENvbG9yOmksc3Ryb2tlQWxwaGE6cixmaWxsQWxwaGE6cyxwb2ludHNDYWxsYmFjazooZSx0KT0+e2NvbnN0IGE9dFswXS54K3RoaXMuYm9yZGVyU3R5bGUud2lkdGgvMixyPXRbMF0ueS10aGlzLmJvcmRlclN0eWxlLndpZHRoLzIsbj10WzNdLngtdGhpcy5ib3JkZXJTdHlsZS53aWR0aC8yLHM9dFszXS55K3RoaXMuYm9yZGVyU3R5bGUud2lkdGgvMixjPWErKG4tYSkvMixsPXIrKHMtcikvMixoPShuLWEpLzIqbyx1PShzLXIpLzIqbztlLnB1c2goYCR7Y30gJHtzfSBtYCxgJHtjK2h9ICR7c30gJHtufSAke2wrdX0gJHtufSAke2x9IGNgLGAke259ICR7bC11fSAke2MraH0gJHtyfSAke2N9ICR7cn0gY2AsYCR7Yy1ofSAke3J9ICR7YX0gJHtsLXV9ICR7YX0gJHtsfSBjYCxgJHthfSAke2wrdX0gJHtjLWh9ICR7c30gJHtjfSAke3N9IGNgLCJoIik7aT9lLnB1c2goIkIiKTplLnB1c2goIlMiKTtyZXR1cm5bdFswXS54LHRbMV0ueCx0WzNdLnksdFsxXS55XX19KX19fWNsYXNzIFBvbHlsaW5lQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7Y29uc3R7ZGljdDp0LHhyZWY6YX09ZTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9ci5Bbm5vdGF0aW9uVHlwZS5QT0xZTElORTt0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZTt0aGlzLmRhdGEudmVydGljZXM9W107aWYoISh0aGlzIGluc3RhbmNlb2YgUG9seWdvbkFubm90YXRpb24pKXt0aGlzLnNldExpbmVFbmRpbmdzKHQuZ2V0QXJyYXkoIkxFIikpO3RoaXMuZGF0YS5saW5lRW5kaW5ncz10aGlzLmxpbmVFbmRpbmdzfWNvbnN0IG49dC5nZXRBcnJheSgiVmVydGljZXMiKTtpZihBcnJheS5pc0FycmF5KG4pKXtmb3IobGV0IGU9MCx0PW4ubGVuZ3RoO2U8dDtlKz0yKXRoaXMuZGF0YS52ZXJ0aWNlcy5wdXNoKHt4Om5bZV0seTpuW2UrMV19KTtpZighdGhpcy5hcHBlYXJhbmNlKXtjb25zdCBlPXRoaXMuY29sb3I/Z2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKTpbMCwwLDBdLG49dC5nZXQoIkNBIiksaT10aGlzLmJvcmRlclN0eWxlLndpZHRofHwxLHM9MippLG89WzEvMCwxLzAsLTEvMCwtMS8wXTtmb3IoY29uc3QgZSBvZiB0aGlzLmRhdGEudmVydGljZXMpe29bMF09TWF0aC5taW4ob1swXSxlLngtcyk7b1sxXT1NYXRoLm1pbihvWzFdLGUueS1zKTtvWzJdPU1hdGgubWF4KG9bMl0sZS54K3MpO29bM109TWF0aC5tYXgob1szXSxlLnkrcyl9ci5VdGlsLmludGVyc2VjdCh0aGlzLnJlY3RhbmdsZSxvKXx8KHRoaXMucmVjdGFuZ2xlPW8pO3RoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHt4cmVmOmEsZXh0cmE6YCR7aX0gd2Asc3Ryb2tlQ29sb3I6ZSxzdHJva2VBbHBoYTpuLHBvaW50c0NhbGxiYWNrOihlLHQpPT57Y29uc3QgYT10aGlzLmRhdGEudmVydGljZXM7Zm9yKGxldCB0PTAscj1hLmxlbmd0aDt0PHI7dCsrKWUucHVzaChgJHthW3RdLnh9ICR7YVt0XS55fSAkezA9PT10PyJtIjoibCJ9YCk7ZS5wdXNoKCJTIik7cmV0dXJuW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV19fSl9fX19Y2xhc3MgUG9seWdvbkFubm90YXRpb24gZXh0ZW5kcyBQb2x5bGluZUFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPXIuQW5ub3RhdGlvblR5cGUuUE9MWUdPTn19Y2xhc3MgQ2FyZXRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9ci5Bbm5vdGF0aW9uVHlwZS5DQVJFVH19Y2xhc3MgSW5rQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEubm9Sb3RhdGU7Y29uc3R7ZGljdDp0LHhyZWY6YX09ZTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9ci5Bbm5vdGF0aW9uVHlwZS5JTks7dGhpcy5kYXRhLmlua0xpc3RzPVtdO2NvbnN0IG49dC5nZXRBcnJheSgiSW5rTGlzdCIpO2lmKEFycmF5LmlzQXJyYXkobikpe2ZvcihsZXQgZT0wLHQ9bi5sZW5ndGg7ZTx0OysrZSl7dGhpcy5kYXRhLmlua0xpc3RzLnB1c2goW10pO2ZvcihsZXQgdD0wLHI9bltlXS5sZW5ndGg7dDxyO3QrPTIpdGhpcy5kYXRhLmlua0xpc3RzW2VdLnB1c2goe3g6YS5mZXRjaElmUmVmKG5bZV1bdF0pLHk6YS5mZXRjaElmUmVmKG5bZV1bdCsxXSl9KX1pZighdGhpcy5hcHBlYXJhbmNlKXtjb25zdCBlPXRoaXMuY29sb3I/Z2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKTpbMCwwLDBdLG49dC5nZXQoIkNBIiksaT10aGlzLmJvcmRlclN0eWxlLndpZHRofHwxLHM9MippLG89WzEvMCwxLzAsLTEvMCwtMS8wXTtmb3IoY29uc3QgZSBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpZm9yKGNvbnN0IHQgb2YgZSl7b1swXT1NYXRoLm1pbihvWzBdLHQueC1zKTtvWzFdPU1hdGgubWluKG9bMV0sdC55LXMpO29bMl09TWF0aC5tYXgob1syXSx0Lngrcyk7b1szXT1NYXRoLm1heChvWzNdLHQueStzKX1yLlV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLG8pfHwodGhpcy5yZWN0YW5nbGU9byk7dGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2Uoe3hyZWY6YSxleHRyYTpgJHtpfSB3YCxzdHJva2VDb2xvcjplLHN0cm9rZUFscGhhOm4scG9pbnRzQ2FsbGJhY2s6KGUsdCk9Pntmb3IoY29uc3QgdCBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpe2ZvcihsZXQgYT0wLHI9dC5sZW5ndGg7YTxyO2ErKyllLnB1c2goYCR7dFthXS54fSAke3RbYV0ueX0gJHswPT09YT8ibSI6ImwifWApO2UucHVzaCgiUyIpfXJldHVyblt0WzBdLngsdFsxXS54LHRbM10ueSx0WzFdLnldfX0pfX19c3RhdGljIGNyZWF0ZU5ld0RpY3QoZSx0LGEpe2xldHthcFJlZjpuLGFwOml9PWE7Y29uc3R7Y29sb3I6byxvcGFjaXR5OmMscGF0aHM6bCxyZWN0Omgscm90YXRpb246dSx0aGlja25lc3M6ZH09ZSxmPW5ldyBzLkRpY3QodCk7Zi5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkFubm90IikpO2Yuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJJbmsiKSk7Zi5zZXQoIkNyZWF0aW9uRGF0ZSIsYEQ6JHsoMCxyLmdldE1vZGlmaWNhdGlvbkRhdGUpKCl9YCk7Zi5zZXQoIlJlY3QiLGgpO2Yuc2V0KCJJbmtMaXN0IixsLm1hcCgoZT0+ZS5wb2ludHMpKSk7Zi5zZXQoIkYiLDQpO2Yuc2V0KCJSb3RhdGUiLHUpO2NvbnN0IGc9bmV3IHMuRGljdCh0KTtmLnNldCgiQlMiLGcpO2cuc2V0KCJXIixkKTtmLnNldCgiQyIsQXJyYXkuZnJvbShvLChlPT5lLzI1NSkpKTtmLnNldCgiQ0EiLGMpO2NvbnN0IHA9bmV3IHMuRGljdCh0KTtmLnNldCgiQVAiLHApO24/cC5zZXQoIk4iLG4pOnAuc2V0KCJOIixpKTtyZXR1cm4gZn1zdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShlLHQsYSl7Y29uc3R7Y29sb3I6cixyZWN0OmMscGF0aHM6bCx0aGlja25lc3M6aCxvcGFjaXR5OnV9PWUsZD1bYCR7aH0gdyAxIEogMSBqYCxgJHsoMCxpLmdldFBkZkNvbG9yKShyLCExKX1gXTsxIT09dSYmZC5wdXNoKCIvUjAgZ3MiKTtjb25zdCBmPVtdO2Zvcihjb25zdHtiZXppZXI6ZX1vZiBsKXtmLmxlbmd0aD0wO2YucHVzaChgJHsoMCxuLm51bWJlclRvU3RyaW5nKShlWzBdKX0gJHsoMCxuLm51bWJlclRvU3RyaW5nKShlWzFdKX0gbWApO2ZvcihsZXQgdD0yLGE9ZS5sZW5ndGg7dDxhO3QrPTYpe2NvbnN0IGE9ZS5zbGljZSh0LHQrNikubWFwKG4ubnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKTtmLnB1c2goYCR7YX0gY2ApfWYucHVzaCgiUyIpO2QucHVzaChmLmpvaW4oIlxuIikpfWNvbnN0IGc9ZC5qb2luKCJcbiIpLHA9bmV3IHMuRGljdCh0KTtwLnNldCgiRm9ybVR5cGUiLDEpO3Auc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpO3Auc2V0KCJUeXBlIixzLk5hbWUuZ2V0KCJYT2JqZWN0IikpO3Auc2V0KCJCQm94IixjKTtwLnNldCgiTGVuZ3RoIixnLmxlbmd0aCk7aWYoMSE9PXUpe2NvbnN0IGU9bmV3IHMuRGljdCh0KSxhPW5ldyBzLkRpY3QodCkscj1uZXcgcy5EaWN0KHQpO3Iuc2V0KCJDQSIsdSk7ci5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKTthLnNldCgiUjAiLHIpO2Uuc2V0KCJFeHRHU3RhdGUiLGEpO3Auc2V0KCJSZXNvdXJjZXMiLGUpfWNvbnN0IG09bmV3IG8uU3RyaW5nU3RyZWFtKGcpO20uZGljdD1wO3JldHVybiBtfX1jbGFzcyBIaWdobGlnaHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjphfT1lO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1yLkFubm90YXRpb25UeXBlLkhJR0hMSUdIVDtpZih0aGlzLmRhdGEucXVhZFBvaW50cz1nZXRRdWFkUG9pbnRzKHQsbnVsbCkpe2NvbnN0IGU9dGhpcy5hcHBlYXJhbmNlPy5kaWN0LmdldCgiUmVzb3VyY2VzIik7aWYoIXRoaXMuYXBwZWFyYW5jZXx8IWU/LmhhcygiRXh0R1N0YXRlIikpe3RoaXMuYXBwZWFyYW5jZSYmKDAsci53YXJuKSgiSGlnaGxpZ2h0QW5ub3RhdGlvbiAtIGlnbm9yaW5nIGJ1aWx0LWluIGFwcGVhcmFuY2Ugc3RyZWFtLiIpO2NvbnN0IGU9dGhpcy5jb2xvcj9nZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpOlsxLDEsMF0sbj10LmdldCgiQ0EiKTt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjphLGZpbGxDb2xvcjplLGJsZW5kTW9kZToiTXVsdGlwbHkiLGZpbGxBbHBoYTpuLHBvaW50c0NhbGxiYWNrOihlLHQpPT57ZS5wdXNoKGAke3RbMF0ueH0gJHt0WzBdLnl9IG1gLGAke3RbMV0ueH0gJHt0WzFdLnl9IGxgLGAke3RbM10ueH0gJHt0WzNdLnl9IGxgLGAke3RbMl0ueH0gJHt0WzJdLnl9IGxgLCJmIik7cmV0dXJuW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV19fSl9fWVsc2UgdGhpcy5kYXRhLnBvcHVwUmVmPW51bGx9fWNsYXNzIFVuZGVybGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOmF9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPXIuQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FO2lmKHRoaXMuZGF0YS5xdWFkUG9pbnRzPWdldFF1YWRQb2ludHModCxudWxsKSl7aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP2dldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcik6WzAsMCwwXSxyPXQuZ2V0KCJDQSIpO3RoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHt4cmVmOmEsZXh0cmE6IltdIDAgZCAwLjU3MSB3IixzdHJva2VDb2xvcjplLHN0cm9rZUFscGhhOnIscG9pbnRzQ2FsbGJhY2s6KGUsdCk9PntlLnB1c2goYCR7dFsyXS54fSAke3RbMl0ueSsxLjN9IG1gLGAke3RbM10ueH0gJHt0WzNdLnkrMS4zfSBsYCwiUyIpO3JldHVyblt0WzBdLngsdFsxXS54LHRbM10ueSx0WzFdLnldfX0pfX1lbHNlIHRoaXMuZGF0YS5wb3B1cFJlZj1udWxsfX1jbGFzcyBTcXVpZ2dseUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOmF9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPXIuQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk7aWYodGhpcy5kYXRhLnF1YWRQb2ludHM9Z2V0UXVhZFBvaW50cyh0LG51bGwpKXtpZighdGhpcy5hcHBlYXJhbmNlKXtjb25zdCBlPXRoaXMuY29sb3I/Z2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKTpbMCwwLDBdLHI9dC5nZXQoIkNBIik7dGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2Uoe3hyZWY6YSxleHRyYToiW10gMCBkIDEgdyIsc3Ryb2tlQ29sb3I6ZSxzdHJva2VBbHBoYTpyLHBvaW50c0NhbGxiYWNrOihlLHQpPT57Y29uc3QgYT0odFswXS55LXRbMl0ueSkvNjtsZXQgcj1hLG49dFsyXS54O2NvbnN0IGk9dFsyXS55LHM9dFszXS54O2UucHVzaChgJHtufSAke2krcn0gbWApO2Rve24rPTI7cj0wPT09cj9hOjA7ZS5wdXNoKGAke259ICR7aStyfSBsYCl9d2hpbGUobjxzKTtlLnB1c2goIlMiKTtyZXR1cm5bdFsyXS54LHMsaS0yKmEsaSsyKmFdfX0pfX1lbHNlIHRoaXMuZGF0YS5wb3B1cFJlZj1udWxsfX1jbGFzcyBTdHJpa2VPdXRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjphfT1lO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1yLkFubm90YXRpb25UeXBlLlNUUklLRU9VVDtpZih0aGlzLmRhdGEucXVhZFBvaW50cz1nZXRRdWFkUG9pbnRzKHQsbnVsbCkpe2lmKCF0aGlzLmFwcGVhcmFuY2Upe2NvbnN0IGU9dGhpcy5jb2xvcj9nZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpOlswLDAsMF0scj10LmdldCgiQ0EiKTt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjphLGV4dHJhOiJbXSAwIGQgMSB3IixzdHJva2VDb2xvcjplLHN0cm9rZUFscGhhOnIscG9pbnRzQ2FsbGJhY2s6KGUsdCk9PntlLnB1c2goKHRbMF0ueCt0WzJdLngpLzIrIiAiKyh0WzBdLnkrdFsyXS55KS8yKyIgbSIsKHRbMV0ueCt0WzNdLngpLzIrIiAiKyh0WzFdLnkrdFszXS55KS8yKyIgbCIsIlMiKTtyZXR1cm5bdFswXS54LHRbMV0ueCx0WzNdLnksdFsxXS55XX19KX19ZWxzZSB0aGlzLmRhdGEucG9wdXBSZWY9bnVsbH19Y2xhc3MgU3RhbXBBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9ci5Bbm5vdGF0aW9uVHlwZS5TVEFNUDt0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZX1zdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2UoZSx0KXtjb25zdHt3aWR0aDphLGhlaWdodDpufT1lLGk9bmV3IE9mZnNjcmVlbkNhbnZhcyhhLG4pLGM9aS5nZXRDb250ZXh0KCIyZCIse2FscGhhOiEwfSk7Yy5kcmF3SW1hZ2UoZSwwLDApO2NvbnN0IGw9Yy5nZXRJbWFnZURhdGEoMCwwLGEsbikuZGF0YSxoPW5ldyBVaW50MzJBcnJheShsLmJ1ZmZlciksdT1oLnNvbWUoci5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbj9lPT5lPj4+MjQhPTI1NTplPT4yNTUhPSgyNTUmZSkpO2lmKHUpe2MuZmlsbFN0eWxlPSJ3aGl0ZSI7Yy5maWxsUmVjdCgwLDAsYSxuKTtjLmRyYXdJbWFnZShlLDAsMCl9Y29uc3QgZD1pLmNvbnZlcnRUb0Jsb2Ioe3R5cGU6ImltYWdlL2pwZWciLHF1YWxpdHk6MX0pLnRoZW4oKGU9PmUuYXJyYXlCdWZmZXIoKSkpLGY9cy5OYW1lLmdldCgiWE9iamVjdCIpLGc9cy5OYW1lLmdldCgiSW1hZ2UiKSxwPW5ldyBzLkRpY3QodCk7cC5zZXQoIlR5cGUiLGYpO3Auc2V0KCJTdWJ0eXBlIixnKTtwLnNldCgiQml0c1BlckNvbXBvbmVudCIsOCk7cC5zZXQoIkNvbG9yU3BhY2UiLHMuTmFtZS5nZXQoIkRldmljZVJHQiIpKTtwLnNldCgiRmlsdGVyIixzLk5hbWUuZ2V0KCJEQ1REZWNvZGUiKSk7cC5zZXQoIkJCb3giLFswLDAsYSxuXSk7cC5zZXQoIldpZHRoIixhKTtwLnNldCgiSGVpZ2h0IixuKTtsZXQgbT1udWxsO2lmKHUpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoaC5sZW5ndGgpO2lmKHIuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pZm9yKGxldCB0PTAsYT1oLmxlbmd0aDt0PGE7dCsrKWVbdF09aFt0XT4+PjI0O2Vsc2UgZm9yKGxldCB0PTAsYT1oLmxlbmd0aDt0PGE7dCsrKWVbdF09MjU1JmhbdF07Y29uc3QgaT1uZXcgcy5EaWN0KHQpO2kuc2V0KCJUeXBlIixmKTtpLnNldCgiU3VidHlwZSIsZyk7aS5zZXQoIkJpdHNQZXJDb21wb25lbnQiLDgpO2kuc2V0KCJDb2xvclNwYWNlIixzLk5hbWUuZ2V0KCJEZXZpY2VHcmF5IikpO2kuc2V0KCJXaWR0aCIsYSk7aS5zZXQoIkhlaWdodCIsbik7bT1uZXcgby5TdHJlYW0oZSwwLDAsaSl9cmV0dXJue2ltYWdlU3RyZWFtOm5ldyBvLlN0cmVhbShhd2FpdCBkLDAsMCxwKSxzbWFza1N0cmVhbTptLHdpZHRoOmEsaGVpZ2h0Om59fXN0YXRpYyBjcmVhdGVOZXdEaWN0KGUsdCxhKXtsZXR7YXBSZWY6aSxhcDpvfT1hO2NvbnN0e3JlY3Q6Yyxyb3RhdGlvbjpsLHVzZXI6aH09ZSx1PW5ldyBzLkRpY3QodCk7dS5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkFubm90IikpO3Uuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJTdGFtcCIpKTt1LnNldCgiQ3JlYXRpb25EYXRlIixgRDokeygwLHIuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKX1gKTt1LnNldCgiUmVjdCIsYyk7dS5zZXQoIkYiLDQpO3Uuc2V0KCJCb3JkZXIiLFswLDAsMF0pO3Uuc2V0KCJSb3RhdGUiLGwpO2gmJnUuc2V0KCJUIiwoMCxuLmlzQXNjaWkpKGgpP2g6KDAsbi5zdHJpbmdUb1VURjE2U3RyaW5nKShoLCEwKSk7aWYoaXx8byl7Y29uc3QgZT1uZXcgcy5EaWN0KHQpO3Uuc2V0KCJBUCIsZSk7aT9lLnNldCgiTiIsaSk6ZS5zZXQoIk4iLG8pfXJldHVybiB1fXN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGUsdCxhKXtjb25zdHtyb3RhdGlvbjpyfT1lLHtpbWFnZVJlZjppLHdpZHRoOmMsaGVpZ2h0Omx9PWEuaW1hZ2UsaD1uZXcgcy5EaWN0KHQpLHU9bmV3IHMuRGljdCh0KTtoLnNldCgiWE9iamVjdCIsdSk7dS5zZXQoIkltMCIsaSk7Y29uc3QgZD1gcSAke2N9IDAgMCAke2x9IDAgMCBjbSAvSW0wIERvIFFgLGY9bmV3IHMuRGljdCh0KTtmLnNldCgiRm9ybVR5cGUiLDEpO2Yuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpO2Yuc2V0KCJUeXBlIixzLk5hbWUuZ2V0KCJYT2JqZWN0IikpO2Yuc2V0KCJCQm94IixbMCwwLGMsbF0pO2Yuc2V0KCJSZXNvdXJjZXMiLGgpO2lmKHIpe2NvbnN0IGU9KDAsbi5nZXRSb3RhdGlvbk1hdHJpeCkocixjLGwpO2Yuc2V0KCJNYXRyaXgiLGUpfWNvbnN0IGc9bmV3IG8uU3RyaW5nU3RyZWFtKGQpO2cuZGljdD1mO3JldHVybiBnfX1jbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOmF9PWUsbj1uZXcgZi5GaWxlU3BlYyh0LmdldCgiRlMiKSxhKTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9ci5Bbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVDt0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZTt0aGlzLmRhdGEuZmlsZT1uLnNlcmlhbGl6YWJsZTtjb25zdCBpPXQuZ2V0KCJOYW1lIik7dGhpcy5kYXRhLm5hbWU9aSBpbnN0YW5jZW9mIHMuTmFtZT8oMCxyLnN0cmluZ1RvUERGU3RyaW5nKShpLm5hbWUpOiJQdXNoUGluIn19fSwoZSx0LGEpPT57dmFyIHI9YSg0KSxuPWEoNiksaT1hKDg3KSxzPWEoMTU4KSxvPWEoNyksYz1yLlJlZ0V4cCxsPWMucHJvdG90eXBlO24mJm8oKGZ1bmN0aW9uKCl7dmFyIGU9ITA7dHJ5e2MoIi4iLCJkIil9Y2F0Y2godCl7ZT0hMX12YXIgdD17fSxhPSIiLHI9ZT8iZGdpbXN5IjoiZ2ltc3kiLGFkZEdldHRlcj1mdW5jdGlvbihlLHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse2dldDpmdW5jdGlvbigpe2ErPXI7cmV0dXJuITB9fSl9LG49e2RvdEFsbDoicyIsZ2xvYmFsOiJnIixpZ25vcmVDYXNlOiJpIixtdWx0aWxpbmU6Im0iLHN0aWNreToieSJ9O2UmJihuLmhhc0luZGljZXM9ImQiKTtmb3IodmFyIGkgaW4gbilhZGRHZXR0ZXIoaSxuW2ldKTtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihsLCJmbGFncyIpLmdldC5jYWxsKHQpIT09cnx8YSE9PXJ9KSkmJmkobCwiZmxhZ3MiLHtjb25maWd1cmFibGU6ITAsZ2V0OnN9KX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1hKDQ3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgZT1yKHRoaXMpLHQ9IiI7ZS5oYXNJbmRpY2VzJiYodCs9ImQiKTtlLmdsb2JhbCYmKHQrPSJnIik7ZS5pZ25vcmVDYXNlJiYodCs9ImkiKTtlLm11bHRpbGluZSYmKHQrPSJtIik7ZS5kb3RBbGwmJih0Kz0icyIpO2UudW5pY29kZSYmKHQrPSJ1Iik7ZS51bmljb2RlU2V0cyYmKHQrPSJ2Iik7ZS5zdGlja3kmJih0Kz0ieSIpO3JldHVybiB0fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgcj1hKDMpLG49YSg0MCksaT1hKDY0KSxzPWEoMTQwKSxvPWEoMTYwKSxjPWEoMTQyKTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxhcml0eToxLGZvcmNlZDoxIT09W10udW5zaGlmdCgwKXx8IWZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwibGVuZ3RoIix7d3JpdGFibGU6ITF9KS51bnNoaWZ0KCl9Y2F0Y2goZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBUeXBlRXJyb3J9fSgpfSx7dW5zaGlmdDpmdW5jdGlvbiB1bnNoaWZ0KGUpe3ZhciB0PW4odGhpcyksYT1pKHQpLHI9YXJndW1lbnRzLmxlbmd0aDtpZihyKXtjKGErcik7Zm9yKHZhciBsPWE7bC0tOyl7dmFyIGg9bCtyO2wgaW4gdD90W2hdPXRbbF06byh0LGgpfWZvcih2YXIgdT0wO3U8cjt1KyspdFt1XT1hcmd1bWVudHNbdV19cmV0dXJuIHModCxhK3IpfX0pfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO3ZhciByPWEoMzIpLG49VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCFkZWxldGUgZVt0XSl0aHJvdyBuKCJDYW5ub3QgZGVsZXRlIHByb3BlcnR5ICIrcih0KSsiIG9mICIrcihlKSl9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkZha2VVbmljb2RlRm9udD12b2lkIDA7dC5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZT1mdW5jdGlvbiBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZShlKXtsZXR7Zm9udFNpemU6dCxmb250TmFtZTphLGZvbnRDb2xvcjpyfT1lO3JldHVybmAvJHsoMCxuLmVzY2FwZVBERk5hbWUpKGEpfSAke3R9IFRmICR7Z2V0UGRmQ29sb3IociwhMCl9YH07dC5nZXRQZGZDb2xvcj1nZXRQZGZDb2xvcjt0LnBhcnNlQXBwZWFyYW5jZVN0cmVhbT1mdW5jdGlvbiBwYXJzZUFwcGVhcmFuY2VTdHJlYW0oZSx0LGEpe3JldHVybiBuZXcgQXBwZWFyYW5jZVN0cmVhbUV2YWx1YXRvcihlLHQsYSkucGFyc2UoKX07dC5wYXJzZURlZmF1bHRBcHBlYXJhbmNlPWZ1bmN0aW9uIHBhcnNlRGVmYXVsdEFwcGVhcmFuY2UoZSl7cmV0dXJuIG5ldyBEZWZhdWx0QXBwZWFyYW5jZUV2YWx1YXRvcihlKS5wYXJzZSgpfTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgxMzkpO3ZhciByPWEoMTUwKSxuPWEoMTQ5KSxpPWEoMTQ0KSxzPWEoMTYyKSxvPWEoMTYzKSxjPWEoMjA5KSxsPWEoMjA3KSxoPWEoMTU0KTtjbGFzcyBEZWZhdWx0QXBwZWFyYW5jZUV2YWx1YXRvciBleHRlbmRzIG8uRXZhbHVhdG9yUHJlcHJvY2Vzc29ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKG5ldyBoLlN0cmluZ1N0cmVhbShlKSl9cGFyc2UoKXtjb25zdCBlPXtmbjowLGFyZ3M6W119LHQ9e2ZvbnRTaXplOjAsZm9udE5hbWU6IiIsZm9udENvbG9yOm5ldyBVaW50OENsYW1wZWRBcnJheSgzKX07dHJ5e2Zvcig7Oyl7ZS5hcmdzLmxlbmd0aD0wO2lmKCF0aGlzLnJlYWQoZSkpYnJlYWs7aWYoMCE9PXRoaXMuc2F2ZWRTdGF0ZXNEZXB0aCljb250aW51ZTtjb25zdHtmbjphLGFyZ3M6bn09ZTtzd2l0Y2goMHxhKXtjYXNlIGkuT1BTLnNldEZvbnQ6Y29uc3RbZSxhXT1uO2UgaW5zdGFuY2VvZiByLk5hbWUmJih0LmZvbnROYW1lPWUubmFtZSk7Im51bWJlciI9PXR5cGVvZiBhJiZhPjAmJih0LmZvbnRTaXplPWEpO2JyZWFrO2Nhc2UgaS5PUFMuc2V0RmlsbFJHQkNvbG9yOnMuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2JJdGVtKG4sMCx0LmZvbnRDb2xvciwwKTticmVhaztjYXNlIGkuT1BTLnNldEZpbGxHcmF5OnMuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShuLDAsdC5mb250Q29sb3IsMCk7YnJlYWs7Y2FzZSBpLk9QUy5zZXRGaWxsQ01ZS0NvbG9yOnMuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiSXRlbShuLDAsdC5mb250Q29sb3IsMCl9fX1jYXRjaChlKXsoMCxpLndhcm4pKGBwYXJzZURlZmF1bHRBcHBlYXJhbmNlIC0gaWdub3JpbmcgZXJyb3JzOiAiJHtlfSIuYCl9cmV0dXJuIHR9fWNsYXNzIEFwcGVhcmFuY2VTdHJlYW1FdmFsdWF0b3IgZXh0ZW5kcyBvLkV2YWx1YXRvclByZXByb2Nlc3Nvcntjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoZSk7dGhpcy5zdHJlYW09ZTt0aGlzLmV2YWx1YXRvck9wdGlvbnM9dDt0aGlzLnhyZWY9YTt0aGlzLnJlc291cmNlcz1lLmRpY3Q/LmdldCgiUmVzb3VyY2VzIil9cGFyc2UoKXtjb25zdCBlPXtmbjowLGFyZ3M6W119O2xldCB0PXtzY2FsZUZhY3RvcjoxLGZvbnRTaXplOjAsZm9udE5hbWU6IiIsZm9udENvbG9yOm5ldyBVaW50OENsYW1wZWRBcnJheSgzKSxmaWxsQ29sb3JTcGFjZTpzLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5fSxhPSExO2NvbnN0IG49W107dHJ5e2Zvcig7Oyl7ZS5hcmdzLmxlbmd0aD0wO2lmKGF8fCF0aGlzLnJlYWQoZSkpYnJlYWs7Y29uc3R7Zm46byxhcmdzOmN9PWU7c3dpdGNoKDB8byl7Y2FzZSBpLk9QUy5zYXZlOm4ucHVzaCh7c2NhbGVGYWN0b3I6dC5zY2FsZUZhY3Rvcixmb250U2l6ZTp0LmZvbnRTaXplLGZvbnROYW1lOnQuZm9udE5hbWUsZm9udENvbG9yOnQuZm9udENvbG9yLnNsaWNlKCksZmlsbENvbG9yU3BhY2U6dC5maWxsQ29sb3JTcGFjZX0pO2JyZWFrO2Nhc2UgaS5PUFMucmVzdG9yZTp0PW4ucG9wKCl8fHQ7YnJlYWs7Y2FzZSBpLk9QUy5zZXRUZXh0TWF0cml4OnQuc2NhbGVGYWN0b3IqPU1hdGguaHlwb3QoY1swXSxjWzFdKTticmVhaztjYXNlIGkuT1BTLnNldEZvbnQ6Y29uc3RbZSxvXT1jO2UgaW5zdGFuY2VvZiByLk5hbWUmJih0LmZvbnROYW1lPWUubmFtZSk7Im51bWJlciI9PXR5cGVvZiBvJiZvPjAmJih0LmZvbnRTaXplPW8qdC5zY2FsZUZhY3Rvcik7YnJlYWs7Y2FzZSBpLk9QUy5zZXRGaWxsQ29sb3JTcGFjZTp0LmZpbGxDb2xvclNwYWNlPXMuQ29sb3JTcGFjZS5wYXJzZSh7Y3M6Y1swXSx4cmVmOnRoaXMueHJlZixyZXNvdXJjZXM6dGhpcy5yZXNvdXJjZXMscGRmRnVuY3Rpb25GYWN0b3J5OnRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxsb2NhbENvbG9yU3BhY2VDYWNoZTp0aGlzLl9sb2NhbENvbG9yU3BhY2VDYWNoZX0pO2JyZWFrO2Nhc2UgaS5PUFMuc2V0RmlsbENvbG9yOnQuZmlsbENvbG9yU3BhY2UuZ2V0UmdiSXRlbShjLDAsdC5mb250Q29sb3IsMCk7YnJlYWs7Y2FzZSBpLk9QUy5zZXRGaWxsUkdCQ29sb3I6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYkl0ZW0oYywwLHQuZm9udENvbG9yLDApO2JyZWFrO2Nhc2UgaS5PUFMuc2V0RmlsbEdyYXk6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2JJdGVtKGMsMCx0LmZvbnRDb2xvciwwKTticmVhaztjYXNlIGkuT1BTLnNldEZpbGxDTVlLQ29sb3I6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2JJdGVtKGMsMCx0LmZvbnRDb2xvciwwKTticmVhaztjYXNlIGkuT1BTLnNob3dUZXh0OmNhc2UgaS5PUFMuc2hvd1NwYWNlZFRleHQ6Y2FzZSBpLk9QUy5uZXh0TGluZVNob3dUZXh0OmNhc2UgaS5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6YT0hMH19fWNhdGNoKGUpeygwLGkud2FybikoYHBhcnNlQXBwZWFyYW5jZVN0cmVhbSAtIGlnbm9yaW5nIGVycm9yczogIiR7ZX0iLmApfXRoaXMuc3RyZWFtLnJlc2V0KCk7ZGVsZXRlIHQuc2NhbGVGYWN0b3I7ZGVsZXRlIHQuZmlsbENvbG9yU3BhY2U7cmV0dXJuIHR9Z2V0IF9sb2NhbENvbG9yU3BhY2VDYWNoZSgpe3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJfbG9jYWxDb2xvclNwYWNlQ2FjaGUiLG5ldyBjLkxvY2FsQ29sb3JTcGFjZUNhY2hlKX1nZXQgX3BkZkZ1bmN0aW9uRmFjdG9yeSgpe2NvbnN0IGU9bmV3IGwuUERGRnVuY3Rpb25GYWN0b3J5KHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5ldmFsdWF0b3JPcHRpb25zLmlzRXZhbFN1cHBvcnRlZH0pO3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJfcGRmRnVuY3Rpb25GYWN0b3J5IixlKX19ZnVuY3Rpb24gZ2V0UGRmQ29sb3IoZSx0KXtpZihlWzBdPT09ZVsxXSYmZVsxXT09PWVbMl0pe2NvbnN0IGE9ZVswXS8yNTU7cmV0dXJuYCR7KDAsbi5udW1iZXJUb1N0cmluZykoYSl9ICR7dD8iZyI6IkcifWB9cmV0dXJuIEFycmF5LmZyb20oZSwoZT0+KDAsbi5udW1iZXJUb1N0cmluZykoZS8yNTUpKSkuam9pbigiICIpKyIgIisodD8icmciOiJSRyIpfWNsYXNzIEZha2VVbmljb2RlRm9udHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMueHJlZj1lO3RoaXMud2lkdGhzPW51bGw7dGhpcy5maXJzdENoYXI9MS8wO3RoaXMubGFzdENoYXI9LTEvMDt0aGlzLmZvbnRGYW1pbHk9dDtjb25zdCBhPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKTt0aGlzLmN0eE1lYXN1cmU9YS5nZXRDb250ZXh0KCIyZCIpO0Zha2VVbmljb2RlRm9udC5fZm9udE5hbWVJZHx8KEZha2VVbmljb2RlRm9udC5fZm9udE5hbWVJZD0xKTt0aGlzLmZvbnROYW1lPXIuTmFtZS5nZXQoYEludmFsaWRQREZqc0ZvbnRfJHt0fV8ke0Zha2VVbmljb2RlRm9udC5fZm9udE5hbWVJZCsrfWApfWdldCB0b1VuaWNvZGVSZWYoKXtpZighRmFrZVVuaWNvZGVGb250Ll90b1VuaWNvZGVSZWYpe2NvbnN0IGU9Ii9DSURJbml0IC9Qcm9jU2V0IGZpbmRyZXNvdXJjZSBiZWdpblxuMTIgZGljdCBiZWdpblxuYmVnaW5jbWFwXG4vQ0lEU3lzdGVtSW5mb1xuPDwgL1JlZ2lzdHJ5IChBZG9iZSlcbi9PcmRlcmluZyAoVUNTKSAvU3VwcGxlbWVudCAwID4+IGRlZlxuL0NNYXBOYW1lIC9BZG9iZS1JZGVudGl0eS1VQ1MgZGVmXG4vQ01hcFR5cGUgMiBkZWZcbjEgYmVnaW5jb2Rlc3BhY2VyYW5nZVxuPDAwMDA+IDxGRkZGPlxuZW5kY29kZXNwYWNlcmFuZ2VcbjEgYmVnaW5iZnJhbmdlXG48MDAwMD4gPEZGRkY+IDwwMDAwPlxuZW5kYmZyYW5nZVxuZW5kY21hcCBDTWFwTmFtZSBjdXJyZW50ZGljdCAvQ01hcCBkZWZpbmVyZXNvdXJjZSBwb3AgZW5kIGVuZCIsdD1GYWtlVW5pY29kZUZvbnQudG9Vbmljb2RlU3RyZWFtPW5ldyBoLlN0cmluZ1N0cmVhbShlKSxhPW5ldyByLkRpY3QodGhpcy54cmVmKTt0LmRpY3Q9YTthLnNldCgiTGVuZ3RoIixlLmxlbmd0aCk7RmFrZVVuaWNvZGVGb250Ll90b1VuaWNvZGVSZWY9dGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYodCl9cmV0dXJuIEZha2VVbmljb2RlRm9udC5fdG9Vbmljb2RlUmVmfWdldCBmb250RGVzY3JpcHRvclJlZigpe2lmKCFGYWtlVW5pY29kZUZvbnQuX2ZvbnREZXNjcmlwdG9yUmVmKXtjb25zdCBlPW5ldyByLkRpY3QodGhpcy54cmVmKTtlLnNldCgiVHlwZSIsci5OYW1lLmdldCgiRm9udERlc2NyaXB0b3IiKSk7ZS5zZXQoIkZvbnROYW1lIix0aGlzLmZvbnROYW1lKTtlLnNldCgiRm9udEZhbWlseSIsIk15cmlhZFBybyBSZWd1bGFyIik7ZS5zZXQoIkZvbnRCQm94IixbMCwwLDAsMF0pO2Uuc2V0KCJGb250U3RyZXRjaCIsci5OYW1lLmdldCgiTm9ybWFsIikpO2Uuc2V0KCJGb250V2VpZ2h0Iiw0MDApO2Uuc2V0KCJJdGFsaWNBbmdsZSIsMCk7RmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZj10aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihlKX1yZXR1cm4gRmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZn1nZXQgZGVzY2VuZGFudEZvbnRSZWYoKXtjb25zdCBlPW5ldyByLkRpY3QodGhpcy54cmVmKTtlLnNldCgiQmFzZUZvbnQiLHRoaXMuZm9udE5hbWUpO2Uuc2V0KCJUeXBlIixyLk5hbWUuZ2V0KCJGb250IikpO2Uuc2V0KCJTdWJ0eXBlIixyLk5hbWUuZ2V0KCJDSURGb250VHlwZTAiKSk7ZS5zZXQoIkNJRFRvR0lETWFwIixyLk5hbWUuZ2V0KCJJZGVudGl0eSIpKTtlLnNldCgiRmlyc3RDaGFyIix0aGlzLmZpcnN0Q2hhcik7ZS5zZXQoIkxhc3RDaGFyIix0aGlzLmxhc3RDaGFyKTtlLnNldCgiRm9udERlc2NyaXB0b3IiLHRoaXMuZm9udERlc2NyaXB0b3JSZWYpO2Uuc2V0KCJEVyIsMWUzKTtjb25zdCB0PVtdLGE9Wy4uLnRoaXMud2lkdGhzLmVudHJpZXMoKV0uc29ydCgpO2xldCBuPW51bGwsaT1udWxsO2Zvcihjb25zdFtlLHJdb2YgYSlpZihuKWlmKGU9PT1uK2kubGVuZ3RoKWkucHVzaChyKTtlbHNle3QucHVzaChuLGkpO249ZTtpPVtyXX1lbHNle249ZTtpPVtyXX1uJiZ0LnB1c2gobixpKTtlLnNldCgiVyIsdCk7Y29uc3Qgcz1uZXcgci5EaWN0KHRoaXMueHJlZik7cy5zZXQoIk9yZGVyaW5nIiwiSWRlbnRpdHkiKTtzLnNldCgiUmVnaXN0cnkiLCJBZG9iZSIpO3Muc2V0KCJTdXBwbGVtZW50IiwwKTtlLnNldCgiQ0lEU3lzdGVtSW5mbyIscyk7cmV0dXJuIHRoaXMueHJlZi5nZXROZXdQZXJzaXN0ZW50UmVmKGUpfWdldCBiYXNlRm9udFJlZigpe2NvbnN0IGU9bmV3IHIuRGljdCh0aGlzLnhyZWYpO2Uuc2V0KCJCYXNlRm9udCIsdGhpcy5mb250TmFtZSk7ZS5zZXQoIlR5cGUiLHIuTmFtZS5nZXQoIkZvbnQiKSk7ZS5zZXQoIlN1YnR5cGUiLHIuTmFtZS5nZXQoIlR5cGUwIikpO2Uuc2V0KCJFbmNvZGluZyIsci5OYW1lLmdldCgiSWRlbnRpdHktSCIpKTtlLnNldCgiRGVzY2VuZGFudEZvbnRzIixbdGhpcy5kZXNjZW5kYW50Rm9udFJlZl0pO2Uuc2V0KCJUb1VuaWNvZGUiLHRoaXMudG9Vbmljb2RlUmVmKTtyZXR1cm4gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoZSl9Z2V0IHJlc291cmNlcygpe2NvbnN0IGU9bmV3IHIuRGljdCh0aGlzLnhyZWYpLHQ9bmV3IHIuRGljdCh0aGlzLnhyZWYpO3Quc2V0KHRoaXMuZm9udE5hbWUubmFtZSx0aGlzLmJhc2VGb250UmVmKTtlLnNldCgiRm9udCIsdCk7cmV0dXJuIGV9X2NyZWF0ZUNvbnRleHQoKXt0aGlzLndpZHRocz1uZXcgTWFwO3RoaXMuY3R4TWVhc3VyZS5mb250PWAxMDAwcHggJHt0aGlzLmZvbnRGYW1pbHl9YDtyZXR1cm4gdGhpcy5jdHhNZWFzdXJlfWNyZWF0ZUZvbnRSZXNvdXJjZXMoZSl7Y29uc3QgdD10aGlzLl9jcmVhdGVDb250ZXh0KCk7Zm9yKGNvbnN0IGEgb2YgZS5zcGxpdCgvXHJcbj98XG4vKSlmb3IoY29uc3QgZSBvZiBhLnNwbGl0KCIiKSl7Y29uc3QgYT1lLmNoYXJDb2RlQXQoMCk7aWYodGhpcy53aWR0aHMuaGFzKGEpKWNvbnRpbnVlO2NvbnN0IHI9dC5tZWFzdXJlVGV4dChlKSxuPU1hdGguY2VpbChyLndpZHRoKTt0aGlzLndpZHRocy5zZXQoYSxuKTt0aGlzLmZpcnN0Q2hhcj1NYXRoLm1pbihhLHRoaXMuZmlyc3RDaGFyKTt0aGlzLmxhc3RDaGFyPU1hdGgubWF4KGEsdGhpcy5sYXN0Q2hhcil9cmV0dXJuIHRoaXMucmVzb3VyY2VzfWNyZWF0ZUFwcGVhcmFuY2UoZSx0LGEscyxvLGMpe2NvbnN0IGw9dGhpcy5fY3JlYXRlQ29udGV4dCgpLHU9W107bGV0IGQ9LTEvMDtmb3IoY29uc3QgdCBvZiBlLnNwbGl0KC9cclxuP3xcbi8pKXt1LnB1c2godCk7Y29uc3QgZT1sLm1lYXN1cmVUZXh0KHQpLndpZHRoO2Q9TWF0aC5tYXgoZCxlKTtmb3IoY29uc3QgZSBvZiB0LnNwbGl0KCIiKSl7Y29uc3QgdD1lLmNoYXJDb2RlQXQoMCk7bGV0IGE9dGhpcy53aWR0aHMuZ2V0KHQpO2lmKHZvaWQgMD09PWEpe2NvbnN0IHI9bC5tZWFzdXJlVGV4dChlKTthPU1hdGguY2VpbChyLndpZHRoKTt0aGlzLndpZHRocy5zZXQodCxhKTt0aGlzLmZpcnN0Q2hhcj1NYXRoLm1pbih0LHRoaXMuZmlyc3RDaGFyKTt0aGlzLmxhc3RDaGFyPU1hdGgubWF4KHQsdGhpcy5sYXN0Q2hhcil9fX1kKj1zLzFlMztjb25zdFtmLGcscCxtXT10O2xldCBiPXAtZix5PW0tZzthJTE4MCE9MCYmKFtiLHldPVt5LGJdKTtsZXQgdz0xO2Q+YiYmKHc9Yi9kKTtsZXQgUz0xO2NvbnN0IHg9aS5MSU5FX0ZBQ1RPUipzLEM9aS5MSU5FX0RFU0NFTlRfRkFDVE9SKnMsdj14KnUubGVuZ3RoO3Y+eSYmKFM9eS92KTtjb25zdCBrPXMqTWF0aC5taW4odyxTKSxPPVsicSIsYDAgMCAkeygwLG4ubnVtYmVyVG9TdHJpbmcpKGIpfSAkeygwLG4ubnVtYmVyVG9TdHJpbmcpKHkpfSByZSBXIG5gLCJCVCIsYDEgMCAwIDEgMCAkeygwLG4ubnVtYmVyVG9TdHJpbmcpKHkrQyl9IFRtIDAgVGMgJHtnZXRQZGZDb2xvcihvLCEwKX1gLGAvJHt0aGlzLmZvbnROYW1lLm5hbWV9ICR7KDAsbi5udW1iZXJUb1N0cmluZykoayl9IFRmYF0se3Jlc291cmNlczpUfT10aGlzO2lmKDEhPT0oYz0ibnVtYmVyIj09dHlwZW9mIGMmJmM+PTAmJmM8PTE/YzoxKSl7Ty5wdXNoKCIvUjAgZ3MiKTtjb25zdCBlPW5ldyByLkRpY3QodGhpcy54cmVmKSx0PW5ldyByLkRpY3QodGhpcy54cmVmKTt0LnNldCgiY2EiLGMpO3Quc2V0KCJDQSIsYyk7dC5zZXQoIlR5cGUiLHIuTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKTtlLnNldCgiUjAiLHQpO1Quc2V0KCJFeHRHU3RhdGUiLGUpfWNvbnN0IE09KDAsbi5udW1iZXJUb1N0cmluZykoeCk7Zm9yKGNvbnN0IGUgb2YgdSlPLnB1c2goYDAgLSR7TX0gVGQgPCR7KDAsbi5zdHJpbmdUb1VURjE2SGV4U3RyaW5nKShlKX0+IFRqYCk7Ty5wdXNoKCJFVCIsIlEiKTtjb25zdCBFPU8uam9pbigiXG4iKSxEPW5ldyByLkRpY3QodGhpcy54cmVmKTtELnNldCgiU3VidHlwZSIsci5OYW1lLmdldCgiRm9ybSIpKTtELnNldCgiVHlwZSIsci5OYW1lLmdldCgiWE9iamVjdCIpKTtELnNldCgiQkJveCIsWzAsMCxiLHldKTtELnNldCgiTGVuZ3RoIixFLmxlbmd0aCk7RC5zZXQoIlJlc291cmNlcyIsVCk7aWYoYSl7Y29uc3QgZT0oMCxuLmdldFJvdGF0aW9uTWF0cml4KShhLGIseSk7RC5zZXQoIk1hdHJpeCIsZSl9Y29uc3QgTj1uZXcgaC5TdHJpbmdTdHJlYW0oRSk7Ti5kaWN0PUQ7cmV0dXJuIE59fXQuRmFrZVVuaWNvZGVGb250PUZha2VVbmljb2RlRm9udH0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5Db2xvclNwYWNlPXZvaWQgMDthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgyKTt2YXIgcj1hKDE0NCksbj1hKDE1MCksaT1hKDE1MSkscz1hKDE0OSk7Y2xhc3MgQ29sb3JTcGFjZXtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY29uc3RydWN0b3I9PT1Db2xvclNwYWNlJiYoMCxyLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQ29sb3JTcGFjZS4iKTt0aGlzLm5hbWU9ZTt0aGlzLm51bUNvbXBzPXR9Z2V0UmdiKGUsdCl7Y29uc3QgYT1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7dGhpcy5nZXRSZ2JJdGVtKGUsdCxhLDApO3JldHVybiBhfWdldFJnYkl0ZW0oZSx0LGEsbil7KDAsci51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldFJnYkl0ZW0iKX1nZXRSZ2JCdWZmZXIoZSx0LGEsbixpLHMsbyl7KDAsci51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldFJnYkJ1ZmZlciIpfWdldE91dHB1dExlbmd0aChlLHQpeygwLHIudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRPdXRwdXRMZW5ndGgiKX1pc1Bhc3N0aHJvdWdoKGUpe3JldHVybiExfWlzRGVmYXVsdERlY29kZShlLHQpe3JldHVybiBDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZShlLHRoaXMubnVtQ29tcHMpfWZpbGxSZ2IoZSx0LGEscixuLGkscyxvLGMpe2NvbnN0IGw9dCphO2xldCBoPW51bGw7Y29uc3QgdT0xPDxzLGQ9YSE9PW58fHQhPT1yO2lmKHRoaXMuaXNQYXNzdGhyb3VnaChzKSloPW87ZWxzZSBpZigxPT09dGhpcy5udW1Db21wcyYmbD51JiYiRGV2aWNlR3JheSIhPT10aGlzLm5hbWUmJiJEZXZpY2VSR0IiIT09dGhpcy5uYW1lKXtjb25zdCB0PXM8PTg/bmV3IFVpbnQ4QXJyYXkodSk6bmV3IFVpbnQxNkFycmF5KHUpO2ZvcihsZXQgZT0wO2U8dTtlKyspdFtlXT1lO2NvbnN0IGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMqdSk7dGhpcy5nZXRSZ2JCdWZmZXIodCwwLHUsYSwwLHMsMCk7aWYoZCl7aD1uZXcgVWludDhBcnJheSgzKmwpO2xldCBlPTA7Zm9yKGxldCB0PTA7dDxsOysrdCl7Y29uc3Qgcj0zKm9bdF07aFtlKytdPWFbcl07aFtlKytdPWFbcisxXTtoW2UrK109YVtyKzJdfX1lbHNle2xldCB0PTA7Zm9yKGxldCByPTA7cjxsOysrcil7Y29uc3Qgbj0zKm9bcl07ZVt0KytdPWFbbl07ZVt0KytdPWFbbisxXTtlW3QrK109YVtuKzJdO3QrPWN9fX1lbHNlIGlmKGQpe2g9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMqbCk7dGhpcy5nZXRSZ2JCdWZmZXIobywwLGwsaCwwLHMsMCl9ZWxzZSB0aGlzLmdldFJnYkJ1ZmZlcihvLDAscippLGUsMCxzLGMpO2lmKGgpaWYoZCkhZnVuY3Rpb24gcmVzaXplUmdiSW1hZ2UoZSx0LGEscixuLGkscyl7cz0xIT09cz8wOnM7Y29uc3Qgbz1hL24sYz1yL2k7bGV0IGwsaD0wO2NvbnN0IHU9bmV3IFVpbnQxNkFycmF5KG4pLGQ9MyphO2ZvcihsZXQgZT0wO2U8bjtlKyspdVtlXT0zKk1hdGguZmxvb3IoZSpvKTtmb3IobGV0IGE9MDthPGk7YSsrKXtjb25zdCByPU1hdGguZmxvb3IoYSpjKSpkO2ZvcihsZXQgYT0wO2E8bjthKyspe2w9cit1W2FdO3RbaCsrXT1lW2wrK107dFtoKytdPWVbbCsrXTt0W2grK109ZVtsKytdO2grPXN9fX0oaCxlLHQsYSxyLG4sYyk7ZWxzZXtsZXQgdD0wLGE9MDtmb3IobGV0IG49MCxzPXIqaTtuPHM7bisrKXtlW3QrK109aFthKytdO2VbdCsrXT1oW2ErK107ZVt0KytdPWhbYSsrXTt0Kz1jfX19Z2V0IHVzZXNaZXJvVG9PbmVSYW5nZSgpe3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJ1c2VzWmVyb1RvT25lUmFuZ2UiLCEwKX1zdGF0aWMgX2NhY2hlKGUsdCxhLHIpe2lmKCFhKXRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCAibG9jYWxDb2xvclNwYWNlQ2FjaGUiIGFyZ3VtZW50LicpO2lmKCFyKXRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkQ29sb3JTcGFjZSIgYXJndW1lbnQuJyk7bGV0IGkscztpZihlIGluc3RhbmNlb2Ygbi5SZWYpe3M9ZTtlPXQuZmV0Y2goZSl9ZSBpbnN0YW5jZW9mIG4uTmFtZSYmKGk9ZS5uYW1lKTsoaXx8cykmJmEuc2V0KGkscyxyKX1zdGF0aWMgZ2V0Q2FjaGVkKGUsdCxhKXtpZighYSl0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuZ2V0Q2FjaGVkIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTtpZihlIGluc3RhbmNlb2Ygbi5SZWYpe2NvbnN0IHI9YS5nZXRCeVJlZihlKTtpZihyKXJldHVybiByO3RyeXtlPXQuZmV0Y2goZSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZX19aWYoZSBpbnN0YW5jZW9mIG4uTmFtZSl7Y29uc3QgdD1hLmdldEJ5TmFtZShlLm5hbWUpO2lmKHQpcmV0dXJuIHR9cmV0dXJuIG51bGx9c3RhdGljIGFzeW5jIHBhcnNlQXN5bmMoZSl7bGV0e2NzOnQseHJlZjphLHJlc291cmNlczpyPW51bGwscGRmRnVuY3Rpb25GYWN0b3J5Om4sbG9jYWxDb2xvclNwYWNlQ2FjaGU6aX09ZTtjb25zdCBzPXRoaXMuX3BhcnNlKHQsYSxyLG4pO3RoaXMuX2NhY2hlKHQsYSxpLHMpO3JldHVybiBzfXN0YXRpYyBwYXJzZShlKXtsZXR7Y3M6dCx4cmVmOmEscmVzb3VyY2VzOnI9bnVsbCxwZGZGdW5jdGlvbkZhY3Rvcnk6bixsb2NhbENvbG9yU3BhY2VDYWNoZTppfT1lO2NvbnN0IHM9dGhpcy5nZXRDYWNoZWQodCxhLGkpO2lmKHMpcmV0dXJuIHM7Y29uc3Qgbz10aGlzLl9wYXJzZSh0LGEscixuKTt0aGlzLl9jYWNoZSh0LGEsaSxvKTtyZXR1cm4gb31zdGF0aWMgX3BhcnNlKGUsdCl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsaT1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMDtpZigoZT10LmZldGNoSWZSZWYoZSkpaW5zdGFuY2VvZiBuLk5hbWUpc3dpdGNoKGUubmFtZSl7Y2FzZSJHIjpjYXNlIkRldmljZUdyYXkiOnJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTtjYXNlIlJHQiI6Y2FzZSJEZXZpY2VSR0IiOnJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiO2Nhc2UiQ01ZSyI6Y2FzZSJEZXZpY2VDTVlLIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7Y2FzZSJQYXR0ZXJuIjpyZXR1cm4gbmV3IFBhdHRlcm5DUyhudWxsKTtkZWZhdWx0OmlmKGEgaW5zdGFuY2VvZiBuLkRpY3Qpe2NvbnN0IHI9YS5nZXQoIkNvbG9yU3BhY2UiKTtpZihyIGluc3RhbmNlb2Ygbi5EaWN0KXtjb25zdCBzPXIuZ2V0KGUubmFtZSk7aWYocyl7aWYocyBpbnN0YW5jZW9mIG4uTmFtZSlyZXR1cm4gdGhpcy5fcGFyc2Uocyx0LGEsaSk7ZT1zO2JyZWFrfX19dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYFVucmVjb2duaXplZCBDb2xvclNwYWNlOiAke2UubmFtZX1gKX1pZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPXQuZmV0Y2hJZlJlZihlWzBdKS5uYW1lO2xldCBzLG8sdSxkLGYsZztzd2l0Y2gobil7Y2FzZSJHIjpjYXNlIkRldmljZUdyYXkiOnJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTtjYXNlIlJHQiI6Y2FzZSJEZXZpY2VSR0IiOnJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiO2Nhc2UiQ01ZSyI6Y2FzZSJEZXZpY2VDTVlLIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7Y2FzZSJDYWxHcmF5IjpzPXQuZmV0Y2hJZlJlZihlWzFdKTtkPXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTtmPXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTtnPXMuZ2V0KCJHYW1tYSIpO3JldHVybiBuZXcgYyhkLGYsZyk7Y2FzZSJDYWxSR0IiOnM9dC5mZXRjaElmUmVmKGVbMV0pO2Q9cy5nZXRBcnJheSgiV2hpdGVQb2ludCIpO2Y9cy5nZXRBcnJheSgiQmxhY2tQb2ludCIpO2c9cy5nZXRBcnJheSgiR2FtbWEiKTtjb25zdCBwPXMuZ2V0QXJyYXkoIk1hdHJpeCIpO3JldHVybiBuZXcgbChkLGYsZyxwKTtjYXNlIklDQ0Jhc2VkIjpjb25zdCBtPXQuZmV0Y2hJZlJlZihlWzFdKS5kaWN0O289bS5nZXQoIk4iKTtjb25zdCBiPW0uZ2V0KCJBbHRlcm5hdGUiKTtpZihiKXtjb25zdCBlPXRoaXMuX3BhcnNlKGIsdCxhLGkpO2lmKGUubnVtQ29tcHM9PT1vKXJldHVybiBlOygwLHIud2FybikoIklDQ0Jhc2VkIGNvbG9yIHNwYWNlOiBJZ25vcmluZyBpbmNvcnJlY3QgL0FsdGVybmF0ZSBlbnRyeS4iKX1pZigxPT09bylyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7aWYoMz09PW8pcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5yZ2I7aWYoND09PW8pcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrO2JyZWFrO2Nhc2UiUGF0dGVybiI6dT1lWzFdfHxudWxsO3UmJih1PXRoaXMuX3BhcnNlKHUsdCxhLGkpKTtyZXR1cm4gbmV3IFBhdHRlcm5DUyh1KTtjYXNlIkkiOmNhc2UiSW5kZXhlZCI6dT10aGlzLl9wYXJzZShlWzFdLHQsYSxpKTtjb25zdCB5PXQuZmV0Y2hJZlJlZihlWzJdKSsxLHc9dC5mZXRjaElmUmVmKGVbM10pO3JldHVybiBuZXcgSW5kZXhlZENTKHUseSx3KTtjYXNlIlNlcGFyYXRpb24iOmNhc2UiRGV2aWNlTiI6Y29uc3QgUz10LmZldGNoSWZSZWYoZVsxXSk7bz1BcnJheS5pc0FycmF5KFMpP1MubGVuZ3RoOjE7dT10aGlzLl9wYXJzZShlWzJdLHQsYSxpKTtjb25zdCB4PWkuY3JlYXRlKGVbM10pO3JldHVybiBuZXcgQWx0ZXJuYXRlQ1Mobyx1LHgpO2Nhc2UiTGFiIjpzPXQuZmV0Y2hJZlJlZihlWzFdKTtkPXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTtmPXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTtjb25zdCBDPXMuZ2V0QXJyYXkoIlJhbmdlIik7cmV0dXJuIG5ldyBoKGQsZixDKTtkZWZhdWx0OnRocm93IG5ldyByLkZvcm1hdEVycm9yKGBVbmltcGxlbWVudGVkIENvbG9yU3BhY2Ugb2JqZWN0OiAke259YCl9fXRocm93IG5ldyByLkZvcm1hdEVycm9yKGBVbnJlY29nbml6ZWQgQ29sb3JTcGFjZSBvYmplY3Q6ICR7ZX1gKX1zdGF0aWMgaXNEZWZhdWx0RGVjb2RlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuITA7aWYoMip0IT09ZS5sZW5ndGgpeygwLHIud2FybikoIlRoZSBkZWNvZGUgbWFwIGlzIG5vdCB0aGUgY29ycmVjdCBsZW5ndGgiKTtyZXR1cm4hMH1mb3IobGV0IHQ9MCxhPWUubGVuZ3RoO3Q8YTt0Kz0yKWlmKDAhPT1lW3RdfHwxIT09ZVt0KzFdKXJldHVybiExO3JldHVybiEwfXN0YXRpYyBnZXQgc2luZ2xldG9ucygpe3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJzaW5nbGV0b25zIix7Z2V0IGdyYXkoKXtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiZ3JheSIsbmV3IERldmljZUdyYXlDUyl9LGdldCByZ2IoKXtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywicmdiIixuZXcgRGV2aWNlUmdiQ1MpfSxnZXQgY215aygpe3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJjbXlrIixuZXcgbyl9fSl9fXQuQ29sb3JTcGFjZT1Db2xvclNwYWNlO2NsYXNzIEFsdGVybmF0ZUNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoIkFsdGVybmF0ZSIsZSk7dGhpcy5iYXNlPXQ7dGhpcy50aW50Rm49YTt0aGlzLnRtcEJ1Zj1uZXcgRmxvYXQzMkFycmF5KHQubnVtQ29tcHMpfWdldFJnYkl0ZW0oZSx0LGEscil7Y29uc3Qgbj10aGlzLnRtcEJ1Zjt0aGlzLnRpbnRGbihlLHQsbiwwKTt0aGlzLmJhc2UuZ2V0UmdiSXRlbShuLDAsYSxyKX1nZXRSZ2JCdWZmZXIoZSx0LGEscixuLGkscyl7Y29uc3Qgbz10aGlzLnRpbnRGbixjPXRoaXMuYmFzZSxsPTEvKCgxPDxpKS0xKSxoPWMubnVtQ29tcHMsdT1jLnVzZXNaZXJvVG9PbmVSYW5nZSxkPShjLmlzUGFzc3Rocm91Z2goOCl8fCF1KSYmMD09PXM7bGV0IGY9ZD9uOjA7Y29uc3QgZz1kP3I6bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGgqYSkscD10aGlzLm51bUNvbXBzLG09bmV3IEZsb2F0MzJBcnJheShwKSxiPW5ldyBGbG9hdDMyQXJyYXkoaCk7bGV0IHksdztmb3IoeT0wO3k8YTt5Kyspe2Zvcih3PTA7dzxwO3crKyltW3ddPWVbdCsrXSpsO28obSwwLGIsMCk7aWYodSlmb3Iodz0wO3c8aDt3KyspZ1tmKytdPTI1NSpiW3ddO2Vsc2V7Yy5nZXRSZ2JJdGVtKGIsMCxnLGYpO2YrPWh9fWR8fGMuZ2V0UmdiQnVmZmVyKGcsMCxhLHIsbiw4LHMpfWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGUqdGhpcy5iYXNlLm51bUNvbXBzL3RoaXMubnVtQ29tcHMsdCl9fWNsYXNzIFBhdHRlcm5DUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoZSl7c3VwZXIoIlBhdHRlcm4iLG51bGwpO3RoaXMuYmFzZT1lfWlzRGVmYXVsdERlY29kZShlLHQpeygwLHIudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgUGF0dGVybkNTLmlzRGVmYXVsdERlY29kZSIpfX1jbGFzcyBJbmRleGVkQ1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKGUsdCxhKXtzdXBlcigiSW5kZXhlZCIsMSk7dGhpcy5iYXNlPWU7dGhpcy5oaWdoVmFsPXQ7Y29uc3Qgbj1lLm51bUNvbXBzKnQ7dGhpcy5sb29rdXA9bmV3IFVpbnQ4QXJyYXkobik7aWYoYSBpbnN0YW5jZW9mIGkuQmFzZVN0cmVhbSl7Y29uc3QgZT1hLmdldEJ5dGVzKG4pO3RoaXMubG9va3VwLnNldChlKX1lbHNle2lmKCJzdHJpbmciIT10eXBlb2YgYSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcihgSW5kZXhlZENTIC0gdW5yZWNvZ25pemVkIGxvb2t1cCB0YWJsZTogJHthfWApO2ZvcihsZXQgZT0wO2U8bjsrK2UpdGhpcy5sb29rdXBbZV09MjU1JmEuY2hhckNvZGVBdChlKX19Z2V0UmdiSXRlbShlLHQsYSxyKXtjb25zdCBuPXRoaXMuYmFzZS5udW1Db21wcyxpPWVbdF0qbjt0aGlzLmJhc2UuZ2V0UmdiQnVmZmVyKHRoaXMubG9va3VwLGksMSxhLHIsOCwwKX1nZXRSZ2JCdWZmZXIoZSx0LGEscixuLGkscyl7Y29uc3Qgbz10aGlzLmJhc2UsYz1vLm51bUNvbXBzLGw9by5nZXRPdXRwdXRMZW5ndGgoYyxzKSxoPXRoaXMubG9va3VwO2ZvcihsZXQgaT0wO2k8YTsrK2kpe2NvbnN0IGE9ZVt0KytdKmM7by5nZXRSZ2JCdWZmZXIoaCxhLDEscixuLDgscyk7bis9bH19Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgoZSp0aGlzLmJhc2UubnVtQ29tcHMsdCl9aXNEZWZhdWx0RGVjb2RlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuITA7aWYoMiE9PWUubGVuZ3RoKXsoMCxyLndhcm4pKCJEZWNvZGUgbWFwIGxlbmd0aCBpcyBub3QgY29ycmVjdCIpO3JldHVybiEwfWlmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpfHx0PDEpeygwLHIud2FybikoIkJpdHMgcGVyIGNvbXBvbmVudCBpcyBub3QgY29ycmVjdCIpO3JldHVybiEwfXJldHVybiAwPT09ZVswXSYmZVsxXT09PSgxPDx0KS0xfX1jbGFzcyBEZXZpY2VHcmF5Q1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKCl7c3VwZXIoIkRldmljZUdyYXkiLDEpfWdldFJnYkl0ZW0oZSx0LGEscil7Y29uc3Qgbj0yNTUqZVt0XTthW3JdPWFbcisxXT1hW3IrMl09bn1nZXRSZ2JCdWZmZXIoZSx0LGEscixuLGkscyl7Y29uc3Qgbz0yNTUvKCgxPDxpKS0xKTtsZXQgYz10LGw9bjtmb3IobGV0IHQ9MDt0PGE7Kyt0KXtjb25zdCB0PW8qZVtjKytdO3JbbCsrXT10O3JbbCsrXT10O3JbbCsrXT10O2wrPXN9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiBlKigzK3QpfX1jbGFzcyBEZXZpY2VSZ2JDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoKXtzdXBlcigiRGV2aWNlUkdCIiwzKX1nZXRSZ2JJdGVtKGUsdCxhLHIpe2Fbcl09MjU1KmVbdF07YVtyKzFdPTI1NSplW3QrMV07YVtyKzJdPTI1NSplW3QrMl19Z2V0UmdiQnVmZmVyKGUsdCxhLHIsbixpLHMpe2lmKDg9PT1pJiYwPT09cyl7ci5zZXQoZS5zdWJhcnJheSh0LHQrMyphKSxuKTtyZXR1cm59Y29uc3Qgbz0yNTUvKCgxPDxpKS0xKTtsZXQgYz10LGw9bjtmb3IobGV0IHQ9MDt0PGE7Kyt0KXtyW2wrK109byplW2MrK107cltsKytdPW8qZVtjKytdO3JbbCsrXT1vKmVbYysrXTtsKz1zfX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZSooMyt0KS8zfDB9aXNQYXNzdGhyb3VnaChlKXtyZXR1cm4gOD09PWV9fWNvbnN0IG89ZnVuY3Rpb24gRGV2aWNlQ215a0NTQ2xvc3VyZSgpe2Z1bmN0aW9uIGNvbnZlcnRUb1JnYihlLHQsYSxyLG4pe2NvbnN0IGk9ZVt0XSphLHM9ZVt0KzFdKmEsbz1lW3QrMl0qYSxjPWVbdCszXSphO3Jbbl09MjU1K2kqKC00LjM4NzMzMjM4NDYwOTk4OCppKzU0LjQ4NjE1MTk0MTg5MTc2KnMrMTguODIyOTA1MDIxNjUzMDIqbysyMTIuMjU2NjI0NTE2Mzk1ODUqYy0yODUuMjMzMTAyNjEzNzAwNCkrcyooMS43MTQ5NzYzNDc3MzYyMTM0KnMtNS42MDk2NzM2OTA0MDQ3MzE1Km8rLTE3Ljg3Mzg3MDg2MTQxNTQ0NCpjLTUuNDk3MDA2NDI3MTk2MzY2KStvKigtMi41MjE3MzQwMTMxNjgzMDMzKm8tMjEuMjQ4OTIzMzM3MzUzMDczKmMrMTcuNTExOTI3MDg0MTgxMykrYyooLTIxLjg2MTIyMTQ3NDYzNjA1KmMtMTg5LjQ4MTgwODM1OTIyNzQ3KTtyW24rMV09MjU1K2kqKDguODQxMDQxNDIyMDM2MTQ5KmkrNjAuMTE4MDI3MDQ1NTk3MzY2KnMrNi44NzE0MjU1OTIwNDkwMDcqbyszMS4xNTkxMDAxMzAwNTU5MjIqYy03OS4yOTcwODQ0ODE2NTQ4KStzKigtMTUuMzEwMzYxMzA2OTY3ODE3KnMrMTcuNTc1MjUxMjYxMTA5NDgyKm8rMTMxLjM1MjUwOTEyNDkzOTc2KmMtMTkwLjk0NTMzMDI1ODg5NTEpK28qKDQuNDQ0MzM5MTAyODUyNzM5Km8rOS44NjMyODYxNDkzNDA1KmMtMjQuODY3NDE1ODI1NTU4NzgpK2MqKC0yMC43MzczMjU0NzExODEwMzQqYy0xODcuODA0NTM3MDk3MTk1NzgpO3JbbisyXT0yNTUraSooLjg4NDI1MjI0MzAwMDMyOTYqaSs4LjA3ODY3NzUwMzExMjkyOCpzKzMwLjg5OTc4MzA5NzAzNzI5Km8tLjIzODgzMjM4Njg5MTc4OTM0KmMtMTQuMTgzNTc2Nzk5NjczMjg2KStzKigxMC40OTU5MzI3MzQzMjA3MipzKzYzLjAyMzc4NDk0NzU0MDUyKm8rNTAuNjA2OTU3NjU2MzYwNzM0KmMtMTEyLjIzODg0MjUzNzE5MjQ4KStvKiguMDMyOTYwNDExMTQ4NzMyMTcqbysxMTUuNjAzODQ0NDk2NDY2NDEqYy0xOTMuNTgyMDkzNTY4NjE1MDUpK2MqKC0yMi4zMzgxNjgwNzMwOTg4NipjLTE4MC4xMjYxMzk3NDcwODM2Nyl9cmV0dXJuIGNsYXNzIERldmljZUNteWtDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoKXtzdXBlcigiRGV2aWNlQ01ZSyIsNCl9Z2V0UmdiSXRlbShlLHQsYSxyKXtjb252ZXJ0VG9SZ2IoZSx0LDEsYSxyKX1nZXRSZ2JCdWZmZXIoZSx0LGEscixuLGkscyl7Y29uc3Qgbz0xLygoMTw8aSktMSk7Zm9yKGxldCBpPTA7aTxhO2krKyl7Y29udmVydFRvUmdiKGUsdCxvLHIsbik7dCs9NDtuKz0zK3N9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiBlLzQqKDMrdCl8MH19fSgpLGM9ZnVuY3Rpb24gQ2FsR3JheUNTQ2xvc3VyZSgpe2Z1bmN0aW9uIGNvbnZlcnRUb1JnYihlLHQsYSxyLG4saSl7Y29uc3Qgcz0odFthXSppKSoqZS5HLG89ZS5ZVypzLGM9TWF0aC5tYXgoMjk1LjgqbyoqLjMzMzMzMzMzMzMzMzMzMzMtNDAuOCwwKTtyW25dPWM7cltuKzFdPWM7cltuKzJdPWN9cmV0dXJuIGNsYXNzIENhbEdyYXlDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKCJDYWxHcmF5IiwxKTtpZighZSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXkiKTt0fHw9WzAsMCwwXTthfHw9MTt0aGlzLlhXPWVbMF07dGhpcy5ZVz1lWzFdO3RoaXMuWlc9ZVsyXTt0aGlzLlhCPXRbMF07dGhpcy5ZQj10WzFdO3RoaXMuWkI9dFsyXTt0aGlzLkc9YTtpZih0aGlzLlhXPDB8fHRoaXMuWlc8MHx8MSE9PXRoaXMuWVcpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX0sIG5vIGZhbGxiYWNrIGF2YWlsYWJsZWApO2lmKHRoaXMuWEI8MHx8dGhpcy5ZQjwwfHx0aGlzLlpCPDApeygwLHIuaW5mbykoYEludmFsaWQgQmxhY2tQb2ludCBmb3IgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTt0aGlzLlhCPXRoaXMuWUI9dGhpcy5aQj0wfTA9PT10aGlzLlhCJiYwPT09dGhpcy5ZQiYmMD09PXRoaXMuWkJ8fCgwLHIud2FybikoYCR7dGhpcy5uYW1lfSwgQmxhY2tQb2ludDogWEI6ICR7dGhpcy5YQn0sIFlCOiAke3RoaXMuWUJ9LCBaQjogJHt0aGlzLlpCfSwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLmApO2lmKHRoaXMuRzwxKXsoMCxyLmluZm8pKGBJbnZhbGlkIEdhbW1hOiAke3RoaXMuR30gZm9yICR7dGhpcy5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuYCk7dGhpcy5HPTF9fWdldFJnYkl0ZW0oZSx0LGEscil7Y29udmVydFRvUmdiKHRoaXMsZSx0LGEsciwxKX1nZXRSZ2JCdWZmZXIoZSx0LGEscixuLGkscyl7Y29uc3Qgbz0xLygoMTw8aSktMSk7Zm9yKGxldCBpPTA7aTxhOysraSl7Y29udmVydFRvUmdiKHRoaXMsZSx0LHIsbixvKTt0Kz0xO24rPTMrc319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCl9fX0oKSxsPWZ1bmN0aW9uIENhbFJHQkNTQ2xvc3VyZSgpe2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheShbLjg5NTEsLjI2NjQsLS4xNjE0LC0uNzUwMiwxLjcxMzUsLjAzNjcsLjAzODksLS4wNjg1LDEuMDI5Nl0pLHQ9bmV3IEZsb2F0MzJBcnJheShbLjk4Njk5MjksLS4xNDcwNTQzLC4xNTk5NjI3LC40MzIzMDUzLC41MTgzNjAzLC4wNDkyOTEyLC0uMDA4NTI4NywuMDQwMDQyOCwuOTY4NDg2N10pLGE9bmV3IEZsb2F0MzJBcnJheShbMy4yNDA0NTQyLC0xLjUzNzEzODUsLS40OTg1MzE0LC0uOTY5MjY2LDEuODc2MDEwOCwuMDQxNTU2LC4wNTU2NDM0LC0uMjA0MDI1OSwxLjA1NzIyNTJdKSxuPW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwxXSksaT1uZXcgRmxvYXQzMkFycmF5KDMpLHM9bmV3IEZsb2F0MzJBcnJheSgzKSxvPW5ldyBGbG9hdDMyQXJyYXkoMyksYz0oMjQvMTE2KSoqMy84O2Z1bmN0aW9uIG1hdHJpeFByb2R1Y3QoZSx0LGEpe2FbMF09ZVswXSp0WzBdK2VbMV0qdFsxXStlWzJdKnRbMl07YVsxXT1lWzNdKnRbMF0rZVs0XSp0WzFdK2VbNV0qdFsyXTthWzJdPWVbNl0qdFswXStlWzddKnRbMV0rZVs4XSp0WzJdfWZ1bmN0aW9uIHNSR0JUcmFuc2ZlckZ1bmN0aW9uKGUpe3JldHVybiBlPD0uMDAzMTMwOD9hZGp1c3RUb1JhbmdlKDAsMSwxMi45MiplKTplPj0uOTk1NTQ1MjU/MTphZGp1c3RUb1JhbmdlKDAsMSwxLjA1NSplKiooMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIGFkanVzdFRvUmFuZ2UoZSx0LGEpe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKHQsYSkpfWZ1bmN0aW9uIGRlY29kZUwoZSl7cmV0dXJuIGU8MD8tZGVjb2RlTCgtZSk6ZT44PygoZSsxNikvMTE2KSoqMzplKmN9ZnVuY3Rpb24gY29udmVydFRvUmdiKHIsYyxsLGgsdSxkKXtjb25zdCBmPWFkanVzdFRvUmFuZ2UoMCwxLGNbbF0qZCksZz1hZGp1c3RUb1JhbmdlKDAsMSxjW2wrMV0qZCkscD1hZGp1c3RUb1JhbmdlKDAsMSxjW2wrMl0qZCksbT0xPT09Zj8xOmYqKnIuR1IsYj0xPT09Zz8xOmcqKnIuR0cseT0xPT09cD8xOnAqKnIuR0Isdz1yLk1YQSptK3IuTVhCKmIrci5NWEMqeSxTPXIuTVlBKm0rci5NWUIqYityLk1ZQyp5LHg9ci5NWkEqbStyLk1aQipiK3IuTVpDKnksQz1zO0NbMF09dztDWzFdPVM7Q1syXT14O2NvbnN0IHY9bzshZnVuY3Rpb24gbm9ybWFsaXplV2hpdGVQb2ludFRvRmxhdChhLHIsbil7aWYoMT09PWFbMF0mJjE9PT1hWzJdKXtuWzBdPXJbMF07blsxXT1yWzFdO25bMl09clsyXTtyZXR1cm59Y29uc3Qgcz1uO21hdHJpeFByb2R1Y3QoZSxyLHMpO2NvbnN0IG89aTshZnVuY3Rpb24gY29udmVydFRvRmxhdChlLHQsYSl7YVswXT0xKnRbMF0vZVswXTthWzFdPTEqdFsxXS9lWzFdO2FbMl09MSp0WzJdL2VbMl19KGEscyxvKTttYXRyaXhQcm9kdWN0KHQsbyxuKX0oci53aGl0ZVBvaW50LEMsdik7Y29uc3Qgaz1zOyFmdW5jdGlvbiBjb21wZW5zYXRlQmxhY2tQb2ludChlLHQsYSl7aWYoMD09PWVbMF0mJjA9PT1lWzFdJiYwPT09ZVsyXSl7YVswXT10WzBdO2FbMV09dFsxXTthWzJdPXRbMl07cmV0dXJufWNvbnN0IHI9ZGVjb2RlTCgwKSxuPSgxLXIpLygxLWRlY29kZUwoZVswXSkpLGk9MS1uLHM9KDEtcikvKDEtZGVjb2RlTChlWzFdKSksbz0xLXMsYz0oMS1yKS8oMS1kZWNvZGVMKGVbMl0pKSxsPTEtYzthWzBdPXRbMF0qbitpO2FbMV09dFsxXSpzK287YVsyXT10WzJdKmMrbH0oci5ibGFja1BvaW50LHYsayk7Y29uc3QgTz1vOyFmdW5jdGlvbiBub3JtYWxpemVXaGl0ZVBvaW50VG9ENjUoYSxyLG4pe2NvbnN0IHM9bjttYXRyaXhQcm9kdWN0KGUscixzKTtjb25zdCBvPWk7IWZ1bmN0aW9uIGNvbnZlcnRUb0Q2NShlLHQsYSl7YVswXT0uOTUwNDcqdFswXS9lWzBdO2FbMV09MSp0WzFdL2VbMV07YVsyXT0xLjA4ODgzKnRbMl0vZVsyXX0oYSxzLG8pO21hdHJpeFByb2R1Y3QodCxvLG4pfShuLGssTyk7Y29uc3QgVD1zO21hdHJpeFByb2R1Y3QoYSxPLFQpO2hbdV09MjU1KnNSR0JUcmFuc2ZlckZ1bmN0aW9uKFRbMF0pO2hbdSsxXT0yNTUqc1JHQlRyYW5zZmVyRnVuY3Rpb24oVFsxXSk7aFt1KzJdPTI1NSpzUkdCVHJhbnNmZXJGdW5jdGlvbihUWzJdKX1yZXR1cm4gY2xhc3MgQ2FsUkdCQ1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKGUsdCxhLG4pe3N1cGVyKCJDYWxSR0IiLDMpO2lmKCFlKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgQ2FsUkdCIik7dHx8PW5ldyBGbG9hdDMyQXJyYXkoMyk7YXx8PW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwxXSk7bnx8PW5ldyBGbG9hdDMyQXJyYXkoWzEsMCwwLDAsMSwwLDAsMCwxXSk7Y29uc3QgaT1lWzBdLHM9ZVsxXSxvPWVbMl07dGhpcy53aGl0ZVBvaW50PWU7Y29uc3QgYz10WzBdLGw9dFsxXSxoPXRbMl07dGhpcy5ibGFja1BvaW50PXQ7dGhpcy5HUj1hWzBdO3RoaXMuR0c9YVsxXTt0aGlzLkdCPWFbMl07dGhpcy5NWEE9blswXTt0aGlzLk1ZQT1uWzFdO3RoaXMuTVpBPW5bMl07dGhpcy5NWEI9blszXTt0aGlzLk1ZQj1uWzRdO3RoaXMuTVpCPW5bNV07dGhpcy5NWEM9bls2XTt0aGlzLk1ZQz1uWzddO3RoaXMuTVpDPW5bOF07aWYoaTwwfHxvPDB8fDEhPT1zKXRocm93IG5ldyByLkZvcm1hdEVycm9yKGBJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgJHt0aGlzLm5hbWV9LCBubyBmYWxsYmFjayBhdmFpbGFibGVgKTtpZihjPDB8fGw8MHx8aDwwKXsoMCxyLmluZm8pKGBJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICR7dGhpcy5uYW1lfSBbJHtjfSwgJHtsfSwgJHtofV0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApO3RoaXMuYmxhY2tQb2ludD1uZXcgRmxvYXQzMkFycmF5KDMpfWlmKHRoaXMuR1I8MHx8dGhpcy5HRzwwfHx0aGlzLkdCPDApeygwLHIuaW5mbykoYEludmFsaWQgR2FtbWEgWyR7dGhpcy5HUn0sICR7dGhpcy5HR30sICR7dGhpcy5HQn1dIGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApO3RoaXMuR1I9dGhpcy5HRz10aGlzLkdCPTF9fWdldFJnYkl0ZW0oZSx0LGEscil7Y29udmVydFRvUmdiKHRoaXMsZSx0LGEsciwxKX1nZXRSZ2JCdWZmZXIoZSx0LGEscixuLGkscyl7Y29uc3Qgbz0xLygoMTw8aSktMSk7Zm9yKGxldCBpPTA7aTxhOysraSl7Y29udmVydFRvUmdiKHRoaXMsZSx0LHIsbixvKTt0Kz0zO24rPTMrc319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfX19KCksaD1mdW5jdGlvbiBMYWJDU0Nsb3N1cmUoKXtmdW5jdGlvbiBmbl9nKGUpe3JldHVybiBlPj02LzI5P2UqKjM6MTA4Lzg0MSooZS00LzI5KX1mdW5jdGlvbiBkZWNvZGUoZSx0LGEscil7cmV0dXJuIGErZSooci1hKS90fWZ1bmN0aW9uIGNvbnZlcnRUb1JnYihlLHQsYSxyLG4saSl7bGV0IHM9dFthXSxvPXRbYSsxXSxjPXRbYSsyXTtpZighMSE9PXIpe3M9ZGVjb2RlKHMsciwwLDEwMCk7bz1kZWNvZGUobyxyLGUuYW1pbixlLmFtYXgpO2M9ZGVjb2RlKGMscixlLmJtaW4sZS5ibWF4KX1vPmUuYW1heD9vPWUuYW1heDpvPGUuYW1pbiYmKG89ZS5hbWluKTtjPmUuYm1heD9jPWUuYm1heDpjPGUuYm1pbiYmKGM9ZS5ibWluKTtjb25zdCBsPShzKzE2KS8xMTYsaD1sK28vNTAwLHU9bC1jLzIwMCxkPWUuWFcqZm5fZyhoKSxmPWUuWVcqZm5fZyhsKSxnPWUuWlcqZm5fZyh1KTtsZXQgcCxtLGI7aWYoZS5aVzwxKXtwPTMuMTMzOSpkKy0xLjYxNypmKy0uNDkwNipnO209LS45Nzg1KmQrMS45MTYqZisuMDMzMypnO2I9LjA3MipkKy0uMjI5KmYrMS40MDU3Kmd9ZWxzZXtwPTMuMjQwNipkKy0xLjUzNzIqZistLjQ5ODYqZzttPS0uOTY4OSpkKzEuODc1OCpmKy4wNDE1Kmc7Yj0uMDU1NypkKy0uMjA0KmYrMS4wNTcqZ31uW2ldPTI1NSpNYXRoLnNxcnQocCk7bltpKzFdPTI1NSpNYXRoLnNxcnQobSk7bltpKzJdPTI1NSpNYXRoLnNxcnQoYil9cmV0dXJuIGNsYXNzIExhYkNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoIkxhYiIsMyk7aWYoIWUpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBMYWIiKTt0fHw9WzAsMCwwXTthfHw9Wy0xMDAsMTAwLC0xMDAsMTAwXTt0aGlzLlhXPWVbMF07dGhpcy5ZVz1lWzFdO3RoaXMuWlc9ZVsyXTt0aGlzLmFtaW49YVswXTt0aGlzLmFtYXg9YVsxXTt0aGlzLmJtaW49YVsyXTt0aGlzLmJtYXg9YVszXTt0aGlzLlhCPXRbMF07dGhpcy5ZQj10WzFdO3RoaXMuWkI9dFsyXTtpZih0aGlzLlhXPDB8fHRoaXMuWlc8MHx8MSE9PXRoaXMuWVcpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzLCBubyBmYWxsYmFjayBhdmFpbGFibGUiKTtpZih0aGlzLlhCPDB8fHRoaXMuWUI8MHx8dGhpcy5aQjwwKXsoMCxyLmluZm8pKCJJbnZhbGlkIEJsYWNrUG9pbnQsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0Iik7dGhpcy5YQj10aGlzLllCPXRoaXMuWkI9MH1pZih0aGlzLmFtaW4+dGhpcy5hbWF4fHx0aGlzLmJtaW4+dGhpcy5ibWF4KXsoMCxyLmluZm8pKCJJbnZhbGlkIFJhbmdlLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdHMiKTt0aGlzLmFtaW49LTEwMDt0aGlzLmFtYXg9MTAwO3RoaXMuYm1pbj0tMTAwO3RoaXMuYm1heD0xMDB9fWdldFJnYkl0ZW0oZSx0LGEscil7Y29udmVydFRvUmdiKHRoaXMsZSx0LCExLGEscil9Z2V0UmdiQnVmZmVyKGUsdCxhLHIsbixpLHMpe2NvbnN0IG89KDE8PGkpLTE7Zm9yKGxldCBpPTA7aTxhO2krKyl7Y29udmVydFRvUmdiKHRoaXMsZSx0LG8scixuKTt0Kz0zO24rPTMrc319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfWlzRGVmYXVsdERlY29kZShlLHQpe3JldHVybiEwfWdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKXtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywidXNlc1plcm9Ub09uZVJhbmdlIiwhMSl9fX0oKX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5QYXJ0aWFsRXZhbHVhdG9yPXQuRXZhbHVhdG9yUHJlcHJvY2Vzc29yPXZvaWQgMDthKDEzOSk7YSgyKTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgxMTYpO2EoMTI2KTthKDEyOCk7YSgxMzEpO2EoMTMzKTthKDEzNSk7YSgxMzcpO2EoMTU3KTthKDE1OSk7dmFyIHI9YSgxNDQpLG49YSgxNjQpLGk9YSgxNTApLHM9YSgxODQpLG89YSgxODcpLGM9YSgxOTEpLGw9YSgyMDApLGg9YSgyMDEpLHU9YSgxOTIpLGQ9YSgyMDcpLGY9YSgxNjYpLGc9YSgyMDkpLHA9YSgxNTQpLG09YSgxNTEpLGI9YSgyMTApLHk9YSgxNjIpLHc9YSgxNjgpLFM9YSgxODgpLHg9YSgyMTEpLEM9YSgxODkpLHY9YSgxNDkpLGs9YSgxOTUpLE89YSgxOTApLFQ9YSgyMTIpLE09YSgyMTMpLEU9YSgyMTQpLEQ9YSgyMTUpO2NvbnN0IE49T2JqZWN0LmZyZWV6ZSh7bWF4SW1hZ2VTaXplOi0xLGRpc2FibGVGb250RmFjZTohMSxpZ25vcmVFcnJvcnM6ITEsaXNFdmFsU3VwcG9ydGVkOiEwLGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiExLGNhbnZhc01heEFyZWFJbkJ5dGVzOi0xLGZvbnRFeHRyYVByb3BlcnRpZXM6ITEsdXNlU3lzdGVtRm9udHM6ITAsY01hcFVybDpudWxsLHN0YW5kYXJkRm9udERhdGFVcmw6bnVsbH0pLFI9MSxMPTIsJD1Qcm9taXNlLnJlc29sdmUoKTtmdW5jdGlvbiBub3JtYWxpemVCbGVuZE1vZGUoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPW5vcm1hbGl6ZUJsZW5kTW9kZSh0LCEwKTtpZihlKXJldHVybiBlfSgwLHIud2FybikoYFVuc3VwcG9ydGVkIGJsZW5kIG1vZGUgQXJyYXk6ICR7ZX1gKTtyZXR1cm4ic291cmNlLW92ZXIifWlmKCEoZSBpbnN0YW5jZW9mIGkuTmFtZSkpcmV0dXJuIHQ/bnVsbDoic291cmNlLW92ZXIiO3N3aXRjaChlLm5hbWUpe2Nhc2UiTm9ybWFsIjpjYXNlIkNvbXBhdGlibGUiOnJldHVybiJzb3VyY2Utb3ZlciI7Y2FzZSJNdWx0aXBseSI6cmV0dXJuIm11bHRpcGx5IjtjYXNlIlNjcmVlbiI6cmV0dXJuInNjcmVlbiI7Y2FzZSJPdmVybGF5IjpyZXR1cm4ib3ZlcmxheSI7Y2FzZSJEYXJrZW4iOnJldHVybiJkYXJrZW4iO2Nhc2UiTGlnaHRlbiI6cmV0dXJuImxpZ2h0ZW4iO2Nhc2UiQ29sb3JEb2RnZSI6cmV0dXJuImNvbG9yLWRvZGdlIjtjYXNlIkNvbG9yQnVybiI6cmV0dXJuImNvbG9yLWJ1cm4iO2Nhc2UiSGFyZExpZ2h0IjpyZXR1cm4iaGFyZC1saWdodCI7Y2FzZSJTb2Z0TGlnaHQiOnJldHVybiJzb2Z0LWxpZ2h0IjtjYXNlIkRpZmZlcmVuY2UiOnJldHVybiJkaWZmZXJlbmNlIjtjYXNlIkV4Y2x1c2lvbiI6cmV0dXJuImV4Y2x1c2lvbiI7Y2FzZSJIdWUiOnJldHVybiJodWUiO2Nhc2UiU2F0dXJhdGlvbiI6cmV0dXJuInNhdHVyYXRpb24iO2Nhc2UiQ29sb3IiOnJldHVybiJjb2xvciI7Y2FzZSJMdW1pbm9zaXR5IjpyZXR1cm4ibHVtaW5vc2l0eSJ9aWYodClyZXR1cm4gbnVsbDsoMCxyLndhcm4pKGBVbnN1cHBvcnRlZCBibGVuZCBtb2RlOiAke2UubmFtZX1gKTtyZXR1cm4ic291cmNlLW92ZXIifWZ1bmN0aW9uIGluY3JlbWVudENhY2hlZEltYWdlTWFza0NvdW50KGUpe2UuZm49PT1yLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QmJmUuYXJnc1swXT8uY291bnQ+MCYmZS5hcmdzWzBdLmNvdW50Kyt9Y2xhc3MgVGltZVNsb3RNYW5hZ2Vye3N0YXRpYyBUSU1FX1NMT1RfRFVSQVRJT05fTVM9MjA7c3RhdGljIENIRUNLX1RJTUVfRVZFUlk9MTAwO2NvbnN0cnVjdG9yKCl7dGhpcy5yZXNldCgpfWNoZWNrKCl7aWYoKyt0aGlzLmNoZWNrZWQ8VGltZVNsb3RNYW5hZ2VyLkNIRUNLX1RJTUVfRVZFUlkpcmV0dXJuITE7dGhpcy5jaGVja2VkPTA7cmV0dXJuIHRoaXMuZW5kVGltZTw9RGF0ZS5ub3coKX1yZXNldCgpe3RoaXMuZW5kVGltZT1EYXRlLm5vdygpK1RpbWVTbG90TWFuYWdlci5USU1FX1NMT1RfRFVSQVRJT05fTVM7dGhpcy5jaGVja2VkPTB9fWNsYXNzIFBhcnRpYWxFdmFsdWF0b3J7Y29uc3RydWN0b3IoZSl7bGV0e3hyZWY6dCxoYW5kbGVyOmEscGFnZUluZGV4OnIsaWRGYWN0b3J5Om4sZm9udENhY2hlOmksYnVpbHRJbkNNYXBDYWNoZTpzLHN0YW5kYXJkRm9udERhdGFDYWNoZTpvLGdsb2JhbEltYWdlQ2FjaGU6YyxzeXN0ZW1Gb250Q2FjaGU6bCxvcHRpb25zOmg9bnVsbH09ZTt0aGlzLnhyZWY9dDt0aGlzLmhhbmRsZXI9YTt0aGlzLnBhZ2VJbmRleD1yO3RoaXMuaWRGYWN0b3J5PW47dGhpcy5mb250Q2FjaGU9aTt0aGlzLmJ1aWx0SW5DTWFwQ2FjaGU9czt0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZT1vO3RoaXMuZ2xvYmFsSW1hZ2VDYWNoZT1jO3RoaXMuc3lzdGVtRm9udENhY2hlPWw7dGhpcy5vcHRpb25zPWh8fE47dGhpcy5wYXJzaW5nVHlwZTNGb250PSExO3RoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZT1uZXcgZy5SZWdpb25hbEltYWdlQ2FjaGU7dGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kPXRoaXMuZmV0Y2hCdWlsdEluQ01hcC5iaW5kKHRoaXMpO1QuSW1hZ2VSZXNpemVyLnNldE1heEFyZWEodGhpcy5vcHRpb25zLmNhbnZhc01heEFyZWFJbkJ5dGVzKX1nZXQgX3BkZkZ1bmN0aW9uRmFjdG9yeSgpe2NvbnN0IGU9bmV3IGQuUERGRnVuY3Rpb25GYWN0b3J5KHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5vcHRpb25zLmlzRXZhbFN1cHBvcnRlZH0pO3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJfcGRmRnVuY3Rpb25GYWN0b3J5IixlKX1jbG9uZSgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZSh0aGlzKTt0Lm9wdGlvbnM9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLHRoaXMub3B0aW9ucyxlKTtyZXR1cm4gdH1oYXNCbGVuZE1vZGVzKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4hMTtpZihlLm9iaklkJiZ0LmhhcyhlLm9iaklkKSlyZXR1cm4hMTtjb25zdCBhPW5ldyBpLlJlZlNldCh0KTtlLm9iaklkJiZhLnB1dChlLm9iaklkKTtjb25zdCBuPVtlXSxzPXRoaXMueHJlZjtmb3IoO24ubGVuZ3RoOyl7Y29uc3QgZT1uLnNoaWZ0KCksdD1lLmdldCgiRXh0R1N0YXRlIik7aWYodCBpbnN0YW5jZW9mIGkuRGljdClmb3IobGV0IGUgb2YgdC5nZXRSYXdWYWx1ZXMoKSl7aWYoZSBpbnN0YW5jZW9mIGkuUmVmKXtpZihhLmhhcyhlKSljb250aW51ZTt0cnl7ZT1zLmZldGNoKGUpfWNhdGNoKHQpe2EucHV0KGUpOygwLHIuaW5mbykoYGhhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICIke3R9Ii5gKTtjb250aW51ZX19aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSljb250aW51ZTtlLm9iaklkJiZhLnB1dChlLm9iaklkKTtjb25zdCB0PWUuZ2V0KCJCTSIpO2lmKHQgaW5zdGFuY2VvZiBpLk5hbWUpe2lmKCJOb3JtYWwiIT09dC5uYW1lKXJldHVybiEwfWVsc2UgaWYodm9pZCAwIT09dCYmQXJyYXkuaXNBcnJheSh0KSlmb3IoY29uc3QgZSBvZiB0KWlmKGUgaW5zdGFuY2VvZiBpLk5hbWUmJiJOb3JtYWwiIT09ZS5uYW1lKXJldHVybiEwfWNvbnN0IG89ZS5nZXQoIlhPYmplY3QiKTtpZihvIGluc3RhbmNlb2YgaS5EaWN0KWZvcihsZXQgZSBvZiBvLmdldFJhd1ZhbHVlcygpKXtpZihlIGluc3RhbmNlb2YgaS5SZWYpe2lmKGEuaGFzKGUpKWNvbnRpbnVlO3RyeXtlPXMuZmV0Y2goZSl9Y2F0Y2godCl7YS5wdXQoZSk7KDAsci5pbmZvKShgaGFzQmxlbmRNb2RlcyAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke3R9Ii5gKTtjb250aW51ZX19aWYoIShlIGluc3RhbmNlb2YgbS5CYXNlU3RyZWFtKSljb250aW51ZTtlLmRpY3Qub2JqSWQmJmEucHV0KGUuZGljdC5vYmpJZCk7Y29uc3QgdD1lLmRpY3QuZ2V0KCJSZXNvdXJjZXMiKTtpZih0IGluc3RhbmNlb2YgaS5EaWN0JiYoIXQub2JqSWR8fCFhLmhhcyh0Lm9iaklkKSkpe24ucHVzaCh0KTt0Lm9iaklkJiZhLnB1dCh0Lm9iaklkKX19fWZvcihjb25zdCBlIG9mIGEpdC5wdXQoZSk7cmV0dXJuITF9YXN5bmMgZmV0Y2hCdWlsdEluQ01hcChlKXtjb25zdCB0PXRoaXMuYnVpbHRJbkNNYXBDYWNoZS5nZXQoZSk7aWYodClyZXR1cm4gdDtsZXQgYTtpZihudWxsIT09dGhpcy5vcHRpb25zLmNNYXBVcmwpe2NvbnN0IHQ9YCR7dGhpcy5vcHRpb25zLmNNYXBVcmx9JHtlfS5iY21hcGAsbj1hd2FpdCBmZXRjaCh0KTtpZighbi5vayl0aHJvdyBuZXcgRXJyb3IoYGZldGNoQnVpbHRJbkNNYXA6IGZhaWxlZCB0byBmZXRjaCBmaWxlICIke3R9IiB3aXRoICIke24uc3RhdHVzVGV4dH0iLmApO2E9e2NNYXBEYXRhOm5ldyBVaW50OEFycmF5KGF3YWl0IG4uYXJyYXlCdWZmZXIoKSksY29tcHJlc3Npb25UeXBlOnIuQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUll9fWVsc2UgYT1hd2FpdCB0aGlzLmhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJGZXRjaEJ1aWx0SW5DTWFwIix7bmFtZTplfSk7YS5jb21wcmVzc2lvblR5cGUhPT1yLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORSYmdGhpcy5idWlsdEluQ01hcENhY2hlLnNldChlLGEpO3JldHVybiBhfWFzeW5jIGZldGNoU3RhbmRhcmRGb250RGF0YShlKXtjb25zdCB0PXRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLmdldChlKTtpZih0KXJldHVybiBuZXcgcC5TdHJlYW0odCk7aWYodGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzJiYiU3ltYm9sIiE9PWUmJiJaYXBmRGluZ2JhdHMiIT09ZSlyZXR1cm4gbnVsbDtjb25zdCBhPSgwLGMuZ2V0Rm9udE5hbWVUb0ZpbGVNYXApKClbZV07bGV0IG47aWYobnVsbCE9PXRoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsKXtjb25zdCBlPWAke3RoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsfSR7YX1gLHQ9YXdhaXQgZmV0Y2goZSk7dC5vaz9uPWF3YWl0IHQuYXJyYXlCdWZmZXIoKTooMCxyLndhcm4pKGBmZXRjaFN0YW5kYXJkRm9udERhdGE6IGZhaWxlZCB0byBmZXRjaCBmaWxlICIke2V9IiB3aXRoICIke3Quc3RhdHVzVGV4dH0iLmApfWVsc2UgdHJ5e249YXdhaXQgdGhpcy5oYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hTdGFuZGFyZEZvbnREYXRhIix7ZmlsZW5hbWU6YX0pfWNhdGNoKGUpeygwLHIud2FybikoYGZldGNoU3RhbmRhcmRGb250RGF0YTogZmFpbGVkIHRvIGZldGNoIGZpbGUgIiR7YX0iIHdpdGggIiR7ZX0iLmApfWlmKCFuKXJldHVybiBudWxsO3RoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLnNldChlLG4pO3JldHVybiBuZXcgcC5TdHJlYW0obil9YXN5bmMgYnVpbGRGb3JtWE9iamVjdChlLHQsYSxuLHMsbyxjKXtjb25zdCBsPXQuZGljdCxoPWwuZ2V0QXJyYXkoIk1hdHJpeCIpO2xldCB1LGQsZj1sLmdldEFycmF5KCJCQm94Iik7Zj1BcnJheS5pc0FycmF5KGYpJiY0PT09Zi5sZW5ndGg/ci5VdGlsLm5vcm1hbGl6ZVJlY3QoZik6bnVsbDtsLmhhcygiT0MiKSYmKHU9YXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhsLmdldCgiT0MiKSxlKSk7dm9pZCAwIT09dSYmbi5hZGRPcChyLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcyxbIk9DIix1XSk7Y29uc3QgZz1sLmdldCgiR3JvdXAiKTtpZihnKXtkPXttYXRyaXg6aCxiYm94OmYsc21hc2s6YSxpc29sYXRlZDohMSxrbm9ja291dDohMX07Y29uc3QgdD1nLmdldCgiUyIpO2xldCBzPW51bGw7aWYoKDAsaS5pc05hbWUpKHQsIlRyYW5zcGFyZW5jeSIpKXtkLmlzb2xhdGVkPWcuZ2V0KCJJIil8fCExO2Qua25vY2tvdXQ9Zy5nZXQoIksiKXx8ITE7aWYoZy5oYXMoIkNTIikpe2NvbnN0IHQ9Zy5nZXRSYXcoIkNTIiksYT15LkNvbG9yU3BhY2UuZ2V0Q2FjaGVkKHQsdGhpcy54cmVmLGMpO3M9YXx8YXdhaXQgdGhpcy5wYXJzZUNvbG9yU3BhY2Uoe2NzOnQscmVzb3VyY2VzOmUsbG9jYWxDb2xvclNwYWNlQ2FjaGU6Y30pfX1pZihhPy5iYWNrZHJvcCl7c3x8PXkuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjthLmJhY2tkcm9wPXMuZ2V0UmdiKGEuYmFja2Ryb3AsMCl9bi5hZGRPcChyLk9QUy5iZWdpbkdyb3VwLFtkXSl9Y29uc3QgcD1nP1toLG51bGxdOltoLGZdO24uYWRkT3Aoci5PUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luLHApO3JldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7c3RyZWFtOnQsdGFzazpzLHJlc291cmNlczpsLmdldCgiUmVzb3VyY2VzIil8fGUsb3BlcmF0b3JMaXN0Om4saW5pdGlhbFN0YXRlOm99KS50aGVuKChmdW5jdGlvbigpe24uYWRkT3Aoci5PUFMucGFpbnRGb3JtWE9iamVjdEVuZCxbXSk7ZyYmbi5hZGRPcChyLk9QUy5lbmRHcm91cCxbZF0pO3ZvaWQgMCE9PXUmJm4uYWRkT3Aoci5PUFMuZW5kTWFya2VkQ29udGVudCxbXSl9KSl9X3NlbmRJbWdEYXRhKGUsdCl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtjb25zdCByPXQ/W3QuYml0bWFwfHx0LmRhdGEuYnVmZmVyXTpudWxsO3JldHVybiB0aGlzLnBhcnNpbmdUeXBlM0ZvbnR8fGE/dGhpcy5oYW5kbGVyLnNlbmQoImNvbW1vbm9iaiIsW2UsIkltYWdlIix0XSxyKTp0aGlzLmhhbmRsZXIuc2VuZCgib2JqIixbZSx0aGlzLnBhZ2VJbmRleCwiSW1hZ2UiLHRdLHIpfWFzeW5jIGJ1aWxkUGFpbnRJbWFnZVhPYmplY3QoZSl7bGV0e3Jlc291cmNlczp0LGltYWdlOmEsaXNJbmxpbmU6bj0hMSxvcGVyYXRvckxpc3Q6aSxjYWNoZUtleTpzLGxvY2FsSW1hZ2VDYWNoZTpvLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9PWU7Y29uc3QgbD1hLmRpY3QsaD1sLm9iaklkLHU9bC5nZXQoIlciLCJXaWR0aCIpLGQ9bC5nZXQoIkgiLCJIZWlnaHQiKTtpZighdXx8Im51bWJlciIhPXR5cGVvZiB1fHwhZHx8Im51bWJlciIhPXR5cGVvZiBkKXsoMCxyLndhcm4pKCJJbWFnZSBkaW1lbnNpb25zIGFyZSBtaXNzaW5nLCBvciBub3QgbnVtYmVycy4iKTtyZXR1cm59Y29uc3QgZj10aGlzLm9wdGlvbnMubWF4SW1hZ2VTaXplO2lmKC0xIT09ZiYmdSpkPmYpe2NvbnN0IGU9IkltYWdlIGV4Y2VlZGVkIG1heGltdW0gYWxsb3dlZCBzaXplIGFuZCB3YXMgcmVtb3ZlZC4iO2lmKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpeygwLHIud2FybikoZSk7cmV0dXJufXRocm93IG5ldyBFcnJvcihlKX1sZXQgZztsLmhhcygiT0MiKSYmKGc9YXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhsLmdldCgiT0MiKSx0KSk7bGV0IHAsbTtpZihsLmdldCgiSU0iLCJJbWFnZU1hc2siKXx8ITEpe2NvbnN0IGU9bC5nZXQoIkkiLCJJbnRlcnBvbGF0ZSIpLHQ9dSs3Pj4zLG49YS5nZXRCeXRlcyh0KmQpLGM9bC5nZXRBcnJheSgiRCIsIkRlY29kZSIpO2lmKHRoaXMucGFyc2luZ1R5cGUzRm9udCl7cD1ELlBERkltYWdlLmNyZWF0ZVJhd01hc2soe2ltZ0FycmF5Om4sd2lkdGg6dSxoZWlnaHQ6ZCxpbWFnZUlzRnJvbURlY29kZVN0cmVhbTphIGluc3RhbmNlb2Ygdy5EZWNvZGVTdHJlYW0saW52ZXJzZURlY29kZTpjPy5bMF0+MCxpbnRlcnBvbGF0ZTplfSk7cC5jYWNoZWQ9ISFzO209W3BdO2kuYWRkSW1hZ2VPcHMoci5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LG0sZyk7aWYocyl7Y29uc3QgZT17Zm46ci5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LGFyZ3M6bSxvcHRpb25hbENvbnRlbnQ6Z307by5zZXQocyxoLGUpO2gmJnRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCxoLGUpfXJldHVybn1wPWF3YWl0IEQuUERGSW1hZ2UuY3JlYXRlTWFzayh7aW1nQXJyYXk6bix3aWR0aDp1LGhlaWdodDpkLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOmEgaW5zdGFuY2VvZiB3LkRlY29kZVN0cmVhbSxpbnZlcnNlRGVjb2RlOmM/LlswXT4wLGludGVycG9sYXRlOmUsaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6dGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkfSk7aWYocC5pc1NpbmdsZU9wYXF1ZVBpeGVsKXtpLmFkZEltYWdlT3BzKHIuT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzayxbXSxnKTtpZihzKXtjb25zdCBlPXtmbjpyLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2ssYXJnczpbXSxvcHRpb25hbENvbnRlbnQ6Z307by5zZXQocyxoLGUpO2gmJnRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCxoLGUpfXJldHVybn1jb25zdCBmPWBtYXNrXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gO2kuYWRkRGVwZW5kZW5jeShmKTt0aGlzLl9zZW5kSW1nRGF0YShmLHApO209W3tkYXRhOmYsd2lkdGg6cC53aWR0aCxoZWlnaHQ6cC5oZWlnaHQsaW50ZXJwb2xhdGU6cC5pbnRlcnBvbGF0ZSxjb3VudDoxfV07aS5hZGRJbWFnZU9wcyhyLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsbSxnKTtpZihzKXtjb25zdCBlPXtmbjpyLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsYXJnczptLG9wdGlvbmFsQ29udGVudDpnfTtvLnNldChzLGgsZSk7aCYmdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLGgsZSl9cmV0dXJufWlmKG4mJiFsLmhhcygiU01hc2siKSYmIWwuaGFzKCJNYXNrIikmJnUrZDwyMDApe2NvbnN0IGU9bmV3IEQuUERGSW1hZ2Uoe3hyZWY6dGhpcy54cmVmLHJlczp0LGltYWdlOmEsaXNJbmxpbmU6bixwZGZGdW5jdGlvbkZhY3Rvcnk6dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9KTtwPWF3YWl0IGUuY3JlYXRlSW1hZ2VEYXRhKCEwLCExKTtpLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPXRoaXMub3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDtpLmFkZEltYWdlT3BzKHIuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0LFtwXSxnKTtyZXR1cm59bGV0IGI9YGltZ18ke3RoaXMuaWRGYWN0b3J5LmNyZWF0ZU9iaklkKCl9YCx5PSExO2lmKHRoaXMucGFyc2luZ1R5cGUzRm9udCliPWAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9X3R5cGUzXyR7Yn1gO2Vsc2UgaWYoaCl7eT10aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2hvdWxkQ2FjaGUoaCx0aGlzLnBhZ2VJbmRleCk7eSYmKGI9YCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fJHtifWApfWkuYWRkRGVwZW5kZW5jeShiKTttPVtiLHUsZF07RC5QREZJbWFnZS5idWlsZEltYWdlKHt4cmVmOnRoaXMueHJlZixyZXM6dCxpbWFnZTphLGlzSW5saW5lOm4scGRmRnVuY3Rpb25GYWN0b3J5OnRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxsb2NhbENvbG9yU3BhY2VDYWNoZTpjfSkudGhlbigoYXN5bmMgZT0+e3A9YXdhaXQgZS5jcmVhdGVJbWFnZURhdGEoITEsdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTtpZihzJiZoJiZ5KXtjb25zdCBlPXAuYml0bWFwP3Aud2lkdGgqcC5oZWlnaHQqNDpwLmRhdGEubGVuZ3RoO3RoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRCeXRlU2l6ZShoLGUpfXJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShiLHAseSl9KSkuY2F0Y2goKGU9PnsoMCxyLndhcm4pKGBVbmFibGUgdG8gZGVjb2RlIGltYWdlICIke2J9IjogIiR7ZX0iLmApO3JldHVybiB0aGlzLl9zZW5kSW1nRGF0YShiLG51bGwseSl9KSk7aS5hZGRJbWFnZU9wcyhyLk9QUy5wYWludEltYWdlWE9iamVjdCxtLGcpO2lmKHMpe2NvbnN0IGU9e2ZuOnIuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LGFyZ3M6bSxvcHRpb25hbENvbnRlbnQ6Z307by5zZXQocyxoLGUpO2lmKGgpe3RoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCxoLGUpO2lmKHkpeygwLHIuYXNzZXJ0KSghbiwiQ2Fubm90IGNhY2hlIGFuIGlubGluZSBpbWFnZSBnbG9iYWxseS4iKTt0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YShoLHtvYmpJZDpiLGZuOnIuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LGFyZ3M6bSxvcHRpb25hbENvbnRlbnQ6ZyxieXRlU2l6ZTowfSl9fX19aGFuZGxlU01hc2soZSx0LGEscixuLGkpe2NvbnN0IHM9ZS5nZXQoIkciKSxvPXtzdWJ0eXBlOmUuZ2V0KCJTIikubmFtZSxiYWNrZHJvcDplLmdldCgiQkMiKX0sYz1lLmdldCgiVFIiKTtpZigoMCxkLmlzUERGRnVuY3Rpb24pKGMpKXtjb25zdCBlPXRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUoYyksdD1uZXcgVWludDhBcnJheSgyNTYpLGE9bmV3IEZsb2F0MzJBcnJheSgxKTtmb3IobGV0IHI9MDtyPDI1NjtyKyspe2FbMF09ci8yNTU7ZShhLDAsYSwwKTt0W3JdPTI1NSphWzBdfDB9by50cmFuc2Zlck1hcD10fXJldHVybiB0aGlzLmJ1aWxkRm9ybVhPYmplY3QodCxzLG8sYSxyLG4uc3RhdGUuY2xvbmUoKSxpKX1oYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKGUpe2xldCB0O2lmKEFycmF5LmlzQXJyYXkoZSkpdD1lO2Vsc2V7aWYoISgwLGQuaXNQREZGdW5jdGlvbikoZSkpcmV0dXJuIG51bGw7dD1bZV19Y29uc3QgYT1bXTtsZXQgcj0wLG49MDtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PXRoaXMueHJlZi5mZXRjaElmUmVmKGUpO3IrKztpZigoMCxpLmlzTmFtZSkodCwiSWRlbnRpdHkiKSl7YS5wdXNoKG51bGwpO2NvbnRpbnVlfWlmKCEoMCxkLmlzUERGRnVuY3Rpb24pKHQpKXJldHVybiBudWxsO2NvbnN0IHM9dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZSh0KSxvPW5ldyBVaW50OEFycmF5KDI1NiksYz1uZXcgRmxvYXQzMkFycmF5KDEpO2ZvcihsZXQgZT0wO2U8MjU2O2UrKyl7Y1swXT1lLzI1NTtzKGMsMCxjLDApO29bZV09MjU1KmNbMF18MH1hLnB1c2gobyk7bisrfXJldHVybiAxIT09ciYmNCE9PXJ8fDA9PT1uP251bGw6YX1oYW5kbGVUaWxpbmdUeXBlKGUsdCxhLG4scyxvLGMsaCl7Y29uc3QgdT1uZXcgRS5PcGVyYXRvckxpc3QsZD1pLkRpY3QubWVyZ2Uoe3hyZWY6dGhpcy54cmVmLGRpY3RBcnJheTpbcy5nZXQoIlJlc291cmNlcyIpLGFdfSk7cmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06bix0YXNrOmMscmVzb3VyY2VzOmQsb3BlcmF0b3JMaXN0OnV9KS50aGVuKChmdW5jdGlvbigpe2NvbnN0IGE9dS5nZXRJUigpLHI9KDAsbC5nZXRUaWxpbmdQYXR0ZXJuSVIpKGEscyx0KTtvLmFkZERlcGVuZGVuY2llcyh1LmRlcGVuZGVuY2llcyk7by5hZGRPcChlLHIpO3Mub2JqSWQmJmguc2V0KG51bGwscy5vYmpJZCx7b3BlcmF0b3JMaXN0SVI6YSxkaWN0OnN9KX0pKS5jYXRjaCgoZT0+e2lmKCEoZSBpbnN0YW5jZW9mIHIuQWJvcnRFeGNlcHRpb24pKXtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLHIud2FybikoYGhhbmRsZVRpbGluZ1R5cGUgLSBpZ25vcmluZyBwYXR0ZXJuOiAiJHtlfSIuYCl9fSkpfWhhbmRsZVNldEZvbnQoZSx0LGEscixuLG8pe2xldCBjPWFyZ3VtZW50cy5sZW5ndGg+NiYmdm9pZCAwIT09YXJndW1lbnRzWzZdP2FyZ3VtZW50c1s2XTpudWxsLGw9YXJndW1lbnRzLmxlbmd0aD43JiZ2b2lkIDAhPT1hcmd1bWVudHNbN10/YXJndW1lbnRzWzddOm51bGw7Y29uc3QgaD10Py5bMF1pbnN0YW5jZW9mIGkuTmFtZT90WzBdLm5hbWU6bnVsbDtyZXR1cm4gdGhpcy5sb2FkRm9udChoLGEsZSxjLGwpLnRoZW4oKHQ9PnQuZm9udC5pc1R5cGUzRm9udD90LmxvYWRUeXBlM0RhdGEodGhpcyxlLG4pLnRoZW4oKGZ1bmN0aW9uKCl7ci5hZGREZXBlbmRlbmNpZXModC50eXBlM0RlcGVuZGVuY2llcyk7cmV0dXJuIHR9KSkuY2F0Y2goKGU9Pm5ldyBUcmFuc2xhdGVkRm9udCh7bG9hZGVkTmFtZToiZ19mb250X2Vycm9yIixmb250Om5ldyBzLkVycm9yRm9udChgVHlwZTMgZm9udCBsb2FkIGVycm9yOiAke2V9YCksZGljdDp0LmZvbnQsZXZhbHVhdG9yT3B0aW9uczp0aGlzLm9wdGlvbnN9KSkpOnQpKS50aGVuKChlPT57by5mb250PWUuZm9udDtlLnNlbmQodGhpcy5oYW5kbGVyKTtyZXR1cm4gZS5sb2FkZWROYW1lfSkpfWhhbmRsZVRleHQoZSx0KXtjb25zdCBhPXQuZm9udCxuPWEuY2hhcnNUb0dseXBocyhlKTtpZihhLmRhdGEpeyghISh0LnRleHRSZW5kZXJpbmdNb2RlJnIuVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBRyl8fCJQYXR0ZXJuIj09PXQuZmlsbENvbG9yU3BhY2UubmFtZXx8YS5kaXNhYmxlRm9udEZhY2V8fHRoaXMub3B0aW9ucy5kaXNhYmxlRm9udEZhY2UpJiZQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKGEsbix0aGlzLmhhbmRsZXIsdGhpcy5vcHRpb25zKX1yZXR1cm4gbn1lbnN1cmVTdGF0ZUZvbnQoZSl7aWYoZS5mb250KXJldHVybjtjb25zdCB0PW5ldyByLkZvcm1hdEVycm9yKCJNaXNzaW5nIHNldEZvbnQgKFRmKSBvcGVyYXRvciBiZWZvcmUgdGV4dCByZW5kZXJpbmcgb3BlcmF0b3IuIik7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgdDsoMCxyLndhcm4pKGBlbnN1cmVTdGF0ZUZvbnQ6ICIke3R9Ii5gKX1hc3luYyBzZXRHU3RhdGUoZSl7bGV0e3Jlc291cmNlczp0LGdTdGF0ZTphLG9wZXJhdG9yTGlzdDpuLGNhY2hlS2V5OnMsdGFzazpvLHN0YXRlTWFuYWdlcjpjLGxvY2FsR1N0YXRlQ2FjaGU6bCxsb2NhbENvbG9yU3BhY2VDYWNoZTpofT1lO2NvbnN0IHU9YS5vYmpJZDtsZXQgZD0hMDtjb25zdCBmPVtdO2xldCBnPVByb21pc2UucmVzb2x2ZSgpO2Zvcihjb25zdCBlIG9mIGEuZ2V0S2V5cygpKXtjb25zdCBzPWEuZ2V0KGUpO3N3aXRjaChlKXtjYXNlIlR5cGUiOmJyZWFrO2Nhc2UiTFciOmNhc2UiTEMiOmNhc2UiTEoiOmNhc2UiTUwiOmNhc2UiRCI6Y2FzZSJSSSI6Y2FzZSJGTCI6Y2FzZSJDQSI6Y2FzZSJjYSI6Zi5wdXNoKFtlLHNdKTticmVhaztjYXNlIkZvbnQiOmQ9ITE7Zz1nLnRoZW4oKCgpPT50aGlzLmhhbmRsZVNldEZvbnQodCxudWxsLHNbMF0sbixvLGMuc3RhdGUpLnRoZW4oKGZ1bmN0aW9uKHQpe24uYWRkRGVwZW5kZW5jeSh0KTtmLnB1c2goW2UsW3Qsc1sxXV1dKX0pKSkpO2JyZWFrO2Nhc2UiQk0iOmYucHVzaChbZSxub3JtYWxpemVCbGVuZE1vZGUocyldKTticmVhaztjYXNlIlNNYXNrIjppZigoMCxpLmlzTmFtZSkocywiTm9uZSIpKXtmLnB1c2goW2UsITFdKTticmVha31pZihzIGluc3RhbmNlb2YgaS5EaWN0KXtkPSExO2c9Zy50aGVuKCgoKT0+dGhpcy5oYW5kbGVTTWFzayhzLHQsbixvLGMsaCkpKTtmLnB1c2goW2UsITBdKX1lbHNlKDAsci53YXJuKSgiVW5zdXBwb3J0ZWQgU01hc2sgdHlwZSIpO2JyZWFrO2Nhc2UiVFIiOmNvbnN0IGE9dGhpcy5oYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKHMpO2YucHVzaChbZSxhXSk7YnJlYWs7Y2FzZSJPUCI6Y2FzZSJvcCI6Y2FzZSJPUE0iOmNhc2UiQkciOmNhc2UiQkcyIjpjYXNlIlVDUiI6Y2FzZSJVQ1IyIjpjYXNlIlRSMiI6Y2FzZSJIVCI6Y2FzZSJTTSI6Y2FzZSJTQSI6Y2FzZSJBSVMiOmNhc2UiVEsiOigwLHIuaW5mbykoImdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIitlKTticmVhaztkZWZhdWx0OigwLHIuaW5mbykoIlVua25vd24gZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiK2UpfX1yZXR1cm4gZy50aGVuKChmdW5jdGlvbigpe2YubGVuZ3RoPjAmJm4uYWRkT3Aoci5PUFMuc2V0R1N0YXRlLFtmXSk7ZCYmbC5zZXQocyx1LGYpfSkpfWxvYWRGb250KGUsdCxhKXtsZXQgbj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbCxvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTpudWxsO2NvbnN0IGVycm9yRm9udD1hc3luYygpPT5uZXcgVHJhbnNsYXRlZEZvbnQoe2xvYWRlZE5hbWU6ImdfZm9udF9lcnJvciIsZm9udDpuZXcgcy5FcnJvckZvbnQoYEZvbnQgIiR7ZX0iIGlzIG5vdCBhdmFpbGFibGUuYCksZGljdDp0LGV2YWx1YXRvck9wdGlvbnM6dGhpcy5vcHRpb25zfSk7bGV0IGM7aWYodCl0IGluc3RhbmNlb2YgaS5SZWYmJihjPXQpO2Vsc2V7Y29uc3QgdD1hLmdldCgiRm9udCIpO3QmJihjPXQuZ2V0UmF3KGUpKX1pZihjKXtpZih0aGlzLnBhcnNpbmdUeXBlM0ZvbnQmJnRoaXMudHlwZTNGb250UmVmcy5oYXMoYykpcmV0dXJuIGVycm9yRm9udCgpO2lmKHRoaXMuZm9udENhY2hlLmhhcyhjKSlyZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGMpO3Q9dGhpcy54cmVmLmZldGNoSWZSZWYoYyl9aWYoISh0IGluc3RhbmNlb2YgaS5EaWN0KSl7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMmJiF0aGlzLnBhcnNpbmdUeXBlM0ZvbnQpeygwLHIud2FybikoYEZvbnQgIiR7ZX0iIGlzIG5vdCBhdmFpbGFibGUuYCk7cmV0dXJuIGVycm9yRm9udCgpfSgwLHIud2FybikoYEZvbnQgIiR7ZX0iIGlzIG5vdCBhdmFpbGFibGUgLS0gYXR0ZW1wdGluZyB0byBmYWxsYmFjayB0byBhIGRlZmF1bHQgZm9udC5gKTt0PW58fFBhcnRpYWxFdmFsdWF0b3IuZmFsbGJhY2tGb250RGljdH1pZih0LmNhY2hlS2V5JiZ0aGlzLmZvbnRDYWNoZS5oYXModC5jYWNoZUtleSkpcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldCh0LmNhY2hlS2V5KTtjb25zdCBsPW5ldyByLlByb21pc2VDYXBhYmlsaXR5O2xldCBoO3RyeXtoPXRoaXMucHJlRXZhbHVhdGVGb250KHQpO2guY3NzRm9udEluZm89b31jYXRjaChlKXsoMCxyLndhcm4pKGBsb2FkRm9udCAtIHByZUV2YWx1YXRlRm9udCBmYWlsZWQ6ICIke2V9Ii5gKTtyZXR1cm4gZXJyb3JGb250KCl9Y29uc3R7ZGVzY3JpcHRvcjp1LGhhc2g6ZH09aCxmPWMgaW5zdGFuY2VvZiBpLlJlZjtsZXQgZztpZihkJiZ1IGluc3RhbmNlb2YgaS5EaWN0KXtjb25zdCBlPXUuZm9udEFsaWFzZXN8fD1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGVbZF0pe2NvbnN0IHQ9ZVtkXS5hbGlhc1JlZjtpZihmJiZ0JiZ0aGlzLmZvbnRDYWNoZS5oYXModCkpe3RoaXMuZm9udENhY2hlLnB1dEFsaWFzKGMsdCk7cmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChjKX19ZWxzZSBlW2RdPXtmb250SUQ6dGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCl9O2YmJihlW2RdLmFsaWFzUmVmPWMpO2c9ZVtkXS5mb250SUR9ZWxzZSBnPXRoaXMuaWRGYWN0b3J5LmNyZWF0ZUZvbnRJZCgpOygwLHIuYXNzZXJ0KShnPy5zdGFydHNXaXRoKCJmIiksJ1RoZSAiZm9udElEIiBtdXN0IGJlIChjb3JyZWN0bHkpIGRlZmluZWQuJyk7aWYoZil0aGlzLmZvbnRDYWNoZS5wdXQoYyxsLnByb21pc2UpO2Vsc2V7dC5jYWNoZUtleT1gY2FjaGVLZXlfJHtnfWA7dGhpcy5mb250Q2FjaGUucHV0KHQuY2FjaGVLZXksbC5wcm9taXNlKX10LmxvYWRlZE5hbWU9YCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fJHtnfWA7dGhpcy50cmFuc2xhdGVGb250KGgpLnRoZW4oKGU9PntsLnJlc29sdmUobmV3IFRyYW5zbGF0ZWRGb250KHtsb2FkZWROYW1lOnQubG9hZGVkTmFtZSxmb250OmUsZGljdDp0LGV2YWx1YXRvck9wdGlvbnM6dGhpcy5vcHRpb25zfSkpfSkpLmNhdGNoKChlPT57KDAsci53YXJuKShgbG9hZEZvbnQgLSB0cmFuc2xhdGVGb250IGZhaWxlZDogIiR7ZX0iLmApO2wucmVzb2x2ZShuZXcgVHJhbnNsYXRlZEZvbnQoe2xvYWRlZE5hbWU6dC5sb2FkZWROYW1lLGZvbnQ6bmV3IHMuRXJyb3JGb250KGUgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6ZSksZGljdDp0LGV2YWx1YXRvck9wdGlvbnM6dGhpcy5vcHRpb25zfSkpfSkpO3JldHVybiBsLnByb21pc2V9YnVpbGRQYXRoKGUsdCxhKXtsZXQgbj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO2NvbnN0IGk9ZS5sZW5ndGgtMTthfHwoYT1bXSk7aWYoaTwwfHxlLmZuQXJyYXlbaV0hPT1yLk9QUy5jb25zdHJ1Y3RQYXRoKXtpZihuKXsoMCxyLndhcm4pKGBFbmNvdW50ZXJlZCBwYXRoIG9wZXJhdG9yICIke3R9IiBpbnNpZGUgb2YgYSB0ZXh0IG9iamVjdC5gKTtlLmFkZE9wKHIuT1BTLnNhdmUsbnVsbCl9bGV0IGk7c3dpdGNoKHQpe2Nhc2Ugci5PUFMucmVjdGFuZ2xlOmNvbnN0IGU9YVswXSthWzJdLHQ9YVsxXSthWzNdO2k9W01hdGgubWluKGFbMF0sZSksTWF0aC5tYXgoYVswXSxlKSxNYXRoLm1pbihhWzFdLHQpLE1hdGgubWF4KGFbMV0sdCldO2JyZWFrO2Nhc2Ugci5PUFMubW92ZVRvOmNhc2Ugci5PUFMubGluZVRvOmk9W2FbMF0sYVswXSxhWzFdLGFbMV1dO2JyZWFrO2RlZmF1bHQ6aT1bMS8wLC0xLzAsMS8wLC0xLzBdfWUuYWRkT3Aoci5PUFMuY29uc3RydWN0UGF0aCxbW3RdLGEsaV0pO24mJmUuYWRkT3Aoci5PUFMucmVzdG9yZSxudWxsKX1lbHNle2NvbnN0IG49ZS5hcmdzQXJyYXlbaV07blswXS5wdXNoKHQpO25bMV0ucHVzaCguLi5hKTtjb25zdCBzPW5bMl07c3dpdGNoKHQpe2Nhc2Ugci5PUFMucmVjdGFuZ2xlOmNvbnN0IGU9YVswXSthWzJdLHQ9YVsxXSthWzNdO3NbMF09TWF0aC5taW4oc1swXSxhWzBdLGUpO3NbMV09TWF0aC5tYXgoc1sxXSxhWzBdLGUpO3NbMl09TWF0aC5taW4oc1syXSxhWzFdLHQpO3NbM109TWF0aC5tYXgoc1szXSxhWzFdLHQpO2JyZWFrO2Nhc2Ugci5PUFMubW92ZVRvOmNhc2Ugci5PUFMubGluZVRvOnNbMF09TWF0aC5taW4oc1swXSxhWzBdKTtzWzFdPU1hdGgubWF4KHNbMV0sYVswXSk7c1syXT1NYXRoLm1pbihzWzJdLGFbMV0pO3NbM109TWF0aC5tYXgoc1szXSxhWzFdKX19fXBhcnNlQ29sb3JTcGFjZShlKXtsZXR7Y3M6dCxyZXNvdXJjZXM6YSxsb2NhbENvbG9yU3BhY2VDYWNoZTpufT1lO3JldHVybiB5LkNvbG9yU3BhY2UucGFyc2VBc3luYyh7Y3M6dCx4cmVmOnRoaXMueHJlZixyZXNvdXJjZXM6YSxwZGZGdW5jdGlvbkZhY3Rvcnk6dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LGxvY2FsQ29sb3JTcGFjZUNhY2hlOm59KS5jYXRjaCgoZT0+e2lmKGUgaW5zdGFuY2VvZiByLkFib3J0RXhjZXB0aW9uKXJldHVybiBudWxsO2lmKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpeygwLHIud2FybikoYHBhcnNlQ29sb3JTcGFjZSAtIGlnbm9yaW5nIENvbG9yU3BhY2U6ICIke2V9Ii5gKTtyZXR1cm4gbnVsbH10aHJvdyBlfSkpfXBhcnNlU2hhZGluZyhlKXtsZXR7c2hhZGluZzp0LHJlc291cmNlczphLGxvY2FsQ29sb3JTcGFjZUNhY2hlOnIsbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlOm59PWUsaT1uLmdldCh0KTtpZighaSl7Y29uc3QgZT1sLlBhdHRlcm4ucGFyc2VTaGFkaW5nKHQsdGhpcy54cmVmLGEsdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LHIpLmdldElSKCk7aT1gcGF0dGVybl8ke3RoaXMuaWRGYWN0b3J5LmNyZWF0ZU9iaklkKCl9YDt0aGlzLnBhcnNpbmdUeXBlM0ZvbnQmJihpPWAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9X3R5cGUzXyR7aX1gKTtuLnNldCh0LGkpO3RoaXMucGFyc2luZ1R5cGUzRm9udD90aGlzLmhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIixbaSwiUGF0dGVybiIsZV0pOnRoaXMuaGFuZGxlci5zZW5kKCJvYmoiLFtpLHRoaXMucGFnZUluZGV4LCJQYXR0ZXJuIixlXSl9cmV0dXJuIGl9aGFuZGxlQ29sb3JOKGUsdCxhLG4scyxvLGMsaCx1LGQpe2NvbnN0IGY9YS5wb3AoKTtpZihmIGluc3RhbmNlb2YgaS5OYW1lKXtjb25zdCBnPXMuZ2V0UmF3KGYubmFtZSkscD1nIGluc3RhbmNlb2YgaS5SZWYmJnUuZ2V0QnlSZWYoZyk7aWYocCl0cnl7Y29uc3Qgcj1uLmJhc2U/bi5iYXNlLmdldFJnYihhLDApOm51bGwsaT0oMCxsLmdldFRpbGluZ1BhdHRlcm5JUikocC5vcGVyYXRvckxpc3RJUixwLmRpY3Qscik7ZS5hZGRPcCh0LGkpO3JldHVybn1jYXRjaHt9Y29uc3QgYj10aGlzLnhyZWYuZmV0Y2hJZlJlZihnKTtpZihiKXtjb25zdCBpPWIgaW5zdGFuY2VvZiBtLkJhc2VTdHJlYW0/Yi5kaWN0OmIscz1pLmdldCgiUGF0dGVyblR5cGUiKTtpZihzPT09Uil7Y29uc3Qgcj1uLmJhc2U/bi5iYXNlLmdldFJnYihhLDApOm51bGw7cmV0dXJuIHRoaXMuaGFuZGxlVGlsaW5nVHlwZSh0LHIsbyxiLGksZSxjLHUpfWlmKHM9PT1MKXtjb25zdCBhPWkuZ2V0KCJTaGFkaW5nIikscj1pLmdldEFycmF5KCJNYXRyaXgiKSxuPXRoaXMucGFyc2VTaGFkaW5nKHtzaGFkaW5nOmEscmVzb3VyY2VzOm8sbG9jYWxDb2xvclNwYWNlQ2FjaGU6aCxsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGU6ZH0pO2UuYWRkT3AodCxbIlNoYWRpbmciLG4scl0pO3JldHVybn10aHJvdyBuZXcgci5Gb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuVHlwZTogJHtzfWApfX10aHJvdyBuZXcgci5Gb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuTmFtZTogJHtmfWApfV9wYXJzZVZpc2liaWxpdHlFeHByZXNzaW9uKGUsdCxhKXtpZigrK3Q+MTApeygwLHIud2FybikoIlZpc2liaWxpdHkgZXhwcmVzc2lvbiBpcyB0b28gZGVlcGx5IG5lc3RlZCIpO3JldHVybn1jb25zdCBuPWUubGVuZ3RoLHM9dGhpcy54cmVmLmZldGNoSWZSZWYoZVswXSk7aWYoIShuPDIpJiZzIGluc3RhbmNlb2YgaS5OYW1lKXtzd2l0Y2gocy5uYW1lKXtjYXNlIkFuZCI6Y2FzZSJPciI6Y2FzZSJOb3QiOmEucHVzaChzLm5hbWUpO2JyZWFrO2RlZmF1bHQ6KDAsci53YXJuKShgSW52YWxpZCBvcGVyYXRvciAke3MubmFtZX0gaW4gdmlzaWJpbGl0eSBleHByZXNzaW9uYCk7cmV0dXJufWZvcihsZXQgcj0xO3I8bjtyKyspe2NvbnN0IG49ZVtyXSxzPXRoaXMueHJlZi5mZXRjaElmUmVmKG4pO2lmKEFycmF5LmlzQXJyYXkocykpe2NvbnN0IGU9W107YS5wdXNoKGUpO3RoaXMuX3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24ocyx0LGUpfWVsc2UgbiBpbnN0YW5jZW9mIGkuUmVmJiZhLnB1c2gobi50b1N0cmluZygpKX19ZWxzZSgwLHIud2FybikoIkludmFsaWQgdmlzaWJpbGl0eSBleHByZXNzaW9uIil9YXN5bmMgcGFyc2VNYXJrZWRDb250ZW50UHJvcHMoZSx0KXtsZXQgYTtpZihlIGluc3RhbmNlb2YgaS5OYW1lKXthPXQuZ2V0KCJQcm9wZXJ0aWVzIikuZ2V0KGUubmFtZSl9ZWxzZXtpZighKGUgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJPcHRpb25hbCBjb250ZW50IHByb3BlcnRpZXMgbWFsZm9ybWVkLiIpO2E9ZX1jb25zdCBuPWEuZ2V0KCJUeXBlIikubmFtZTtpZigiT0NHIj09PW4pcmV0dXJue3R5cGU6bixpZDphLm9iaklkfTtpZigiT0NNRCI9PT1uKXtjb25zdCBlPWEuZ2V0KCJWRSIpO2lmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IHQ9W107dGhpcy5fcGFyc2VWaXNpYmlsaXR5RXhwcmVzc2lvbihlLDAsdCk7aWYodC5sZW5ndGg+MClyZXR1cm57dHlwZToiT0NNRCIsZXhwcmVzc2lvbjp0fX1jb25zdCB0PWEuZ2V0KCJPQ0dzIik7aWYoQXJyYXkuaXNBcnJheSh0KXx8dCBpbnN0YW5jZW9mIGkuRGljdCl7Y29uc3QgZT1bXTtpZihBcnJheS5pc0FycmF5KHQpKWZvcihjb25zdCBhIG9mIHQpZS5wdXNoKGEudG9TdHJpbmcoKSk7ZWxzZSBlLnB1c2godC5vYmpJZCk7cmV0dXJue3R5cGU6bixpZHM6ZSxwb2xpY3k6YS5nZXQoIlAiKWluc3RhbmNlb2YgaS5OYW1lP2EuZ2V0KCJQIikubmFtZTpudWxsLGV4cHJlc3Npb246bnVsbH19aWYodCBpbnN0YW5jZW9mIGkuUmVmKXJldHVybnt0eXBlOm4saWQ6dC50b1N0cmluZygpfX1yZXR1cm4gbnVsbH1nZXRPcGVyYXRvckxpc3QoZSl7bGV0e3N0cmVhbTp0LHRhc2s6YSxyZXNvdXJjZXM6bixvcGVyYXRvckxpc3Q6cyxpbml0aWFsU3RhdGU6bz1udWxsLGZhbGxiYWNrRm9udERpY3Q6Yz1udWxsfT1lO258fD1pLkRpY3QuZW1wdHk7b3x8PW5ldyBFdmFsU3RhdGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCdnZXRPcGVyYXRvckxpc3Q6IG1pc3NpbmcgIm9wZXJhdG9yTGlzdCIgcGFyYW1ldGVyJyk7Y29uc3QgbD10aGlzLGg9dGhpcy54cmVmO2xldCB1PSExO2NvbnN0IGQ9bmV3IGcuTG9jYWxJbWFnZUNhY2hlLGY9bmV3IGcuTG9jYWxDb2xvclNwYWNlQ2FjaGUscD1uZXcgZy5Mb2NhbEdTdGF0ZUNhY2hlLGI9bmV3IGcuTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUsdz1uZXcgTWFwLFM9bi5nZXQoIlhPYmplY3QiKXx8aS5EaWN0LmVtcHR5LHg9bi5nZXQoIlBhdHRlcm4iKXx8aS5EaWN0LmVtcHR5LEM9bmV3IFN0YXRlTWFuYWdlcihvKSx2PW5ldyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IodCxoLEMpLGs9bmV3IFRpbWVTbG90TWFuYWdlcjtmdW5jdGlvbiBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKGUpe2ZvcihsZXQgZT0wLHQ9di5zYXZlZFN0YXRlc0RlcHRoO2U8dDtlKyspcy5hZGRPcChyLk9QUy5yZXN0b3JlLFtdKX1yZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uIHByb21pc2VCb2R5KGUsdCl7Y29uc3QgbmV4dD1mdW5jdGlvbihhKXtQcm9taXNlLmFsbChbYSxzLnJlYWR5XSkudGhlbigoZnVuY3Rpb24oKXt0cnl7cHJvbWlzZUJvZHkoZSx0KX1jYXRjaChlKXt0KGUpfX0pLHQpfTthLmVuc3VyZU5vdFRlcm1pbmF0ZWQoKTtrLnJlc2V0KCk7Y29uc3Qgbz17fTtsZXQgZyxPLFQsTSxFLEQ7Zm9yKDshKGc9ay5jaGVjaygpKTspe28uYXJncz1udWxsO2lmKCF2LnJlYWQobykpYnJlYWs7bGV0IGU9by5hcmdzLHQ9by5mbjtzd2l0Y2goMHx0KXtjYXNlIHIuT1BTLnBhaW50WE9iamVjdDpEPWVbMF1pbnN0YW5jZW9mIGkuTmFtZTtFPWVbMF0ubmFtZTtpZihEKXtjb25zdCB0PWQuZ2V0QnlOYW1lKEUpO2lmKHQpe3MuYWRkSW1hZ2VPcHModC5mbix0LmFyZ3MsdC5vcHRpb25hbENvbnRlbnQpO2luY3JlbWVudENhY2hlZEltYWdlTWFza0NvdW50KHQpO2U9bnVsbDtjb250aW51ZX19bmV4dChuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSx0KXtpZighRCl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiWE9iamVjdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7bGV0IG89Uy5nZXRSYXcoRSk7aWYobyBpbnN0YW5jZW9mIGkuUmVmKXtjb25zdCB0PWQuZ2V0QnlSZWYobyl8fGwuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5nZXRCeVJlZihvKTtpZih0KXtzLmFkZEltYWdlT3BzKHQuZm4sdC5hcmdzLHQub3B0aW9uYWxDb250ZW50KTtpbmNyZW1lbnRDYWNoZWRJbWFnZU1hc2tDb3VudCh0KTtlKCk7cmV0dXJufWNvbnN0IGE9bC5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEobyxsLnBhZ2VJbmRleCk7aWYoYSl7cy5hZGREZXBlbmRlbmN5KGEub2JqSWQpO3MuYWRkSW1hZ2VPcHMoYS5mbixhLmFyZ3MsYS5vcHRpb25hbENvbnRlbnQpO2UoKTtyZXR1cm59bz1oLmZldGNoKG8pfWlmKCEobyBpbnN0YW5jZW9mIG0uQmFzZVN0cmVhbSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7Y29uc3QgYz1vLmRpY3QuZ2V0KCJTdWJ0eXBlIik7aWYoIShjIGluc3RhbmNlb2YgaS5OYW1lKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpO2lmKCJGb3JtIiE9PWMubmFtZSlpZigiSW1hZ2UiIT09Yy5uYW1lKXtpZigiUFMiIT09Yy5uYW1lKXRocm93IG5ldyByLkZvcm1hdEVycm9yKGBVbmhhbmRsZWQgWE9iamVjdCBzdWJ0eXBlICR7Yy5uYW1lfWApOygwLHIuaW5mbykoIklnbm9yZWQgWE9iamVjdCBzdWJ0eXBlIFBTIik7ZSgpfWVsc2UgbC5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHtyZXNvdXJjZXM6bixpbWFnZTpvLG9wZXJhdG9yTGlzdDpzLGNhY2hlS2V5OkUsbG9jYWxJbWFnZUNhY2hlOmQsbG9jYWxDb2xvclNwYWNlQ2FjaGU6Zn0pLnRoZW4oZSx0KTtlbHNle0Muc2F2ZSgpO2wuYnVpbGRGb3JtWE9iamVjdChuLG8sbnVsbCxzLGEsQy5zdGF0ZS5jbG9uZSgpLGYpLnRoZW4oKGZ1bmN0aW9uKCl7Qy5yZXN0b3JlKCk7ZSgpfSksdCl9fSkpLmNhdGNoKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiByLkFib3J0RXhjZXB0aW9uKSl7aWYoIWwub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxyLndhcm4pKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBYT2JqZWN0OiAiJHtlfSIuYCl9fSkpKTtyZXR1cm47Y2FzZSByLk9QUy5zZXRGb250OnZhciBOPWVbMV07bmV4dChsLmhhbmRsZVNldEZvbnQobixlLG51bGwscyxhLEMuc3RhdGUsYykudGhlbigoZnVuY3Rpb24oZSl7cy5hZGREZXBlbmRlbmN5KGUpO3MuYWRkT3Aoci5PUFMuc2V0Rm9udCxbZSxOXSl9KSkpO3JldHVybjtjYXNlIHIuT1BTLmJlZ2luVGV4dDp1PSEwO2JyZWFrO2Nhc2Ugci5PUFMuZW5kVGV4dDp1PSExO2JyZWFrO2Nhc2Ugci5PUFMuZW5kSW5saW5lSW1hZ2U6dmFyIFI9ZVswXS5jYWNoZUtleTtpZihSKXtjb25zdCB0PWQuZ2V0QnlOYW1lKFIpO2lmKHQpe3MuYWRkSW1hZ2VPcHModC5mbix0LmFyZ3MsdC5vcHRpb25hbENvbnRlbnQpO2luY3JlbWVudENhY2hlZEltYWdlTWFza0NvdW50KHQpO2U9bnVsbDtjb250aW51ZX19bmV4dChsLmJ1aWxkUGFpbnRJbWFnZVhPYmplY3Qoe3Jlc291cmNlczpuLGltYWdlOmVbMF0saXNJbmxpbmU6ITAsb3BlcmF0b3JMaXN0OnMsY2FjaGVLZXk6Uixsb2NhbEltYWdlQ2FjaGU6ZCxsb2NhbENvbG9yU3BhY2VDYWNoZTpmfSkpO3JldHVybjtjYXNlIHIuT1BTLnNob3dUZXh0OmlmKCFDLnN0YXRlLmZvbnQpe2wuZW5zdXJlU3RhdGVGb250KEMuc3RhdGUpO2NvbnRpbnVlfWVbMF09bC5oYW5kbGVUZXh0KGVbMF0sQy5zdGF0ZSk7YnJlYWs7Y2FzZSByLk9QUy5zaG93U3BhY2VkVGV4dDppZighQy5zdGF0ZS5mb250KXtsLmVuc3VyZVN0YXRlRm9udChDLnN0YXRlKTtjb250aW51ZX12YXIgTD1bXSxfPUMuc3RhdGU7Zm9yKGNvbnN0IHQgb2YgZVswXSkic3RyaW5nIj09dHlwZW9mIHQ/TC5wdXNoKC4uLmwuaGFuZGxlVGV4dCh0LF8pKToibnVtYmVyIj09dHlwZW9mIHQmJkwucHVzaCh0KTtlWzBdPUw7dD1yLk9QUy5zaG93VGV4dDticmVhaztjYXNlIHIuT1BTLm5leHRMaW5lU2hvd1RleHQ6aWYoIUMuc3RhdGUuZm9udCl7bC5lbnN1cmVTdGF0ZUZvbnQoQy5zdGF0ZSk7Y29udGludWV9cy5hZGRPcChyLk9QUy5uZXh0TGluZSk7ZVswXT1sLmhhbmRsZVRleHQoZVswXSxDLnN0YXRlKTt0PXIuT1BTLnNob3dUZXh0O2JyZWFrO2Nhc2Ugci5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6aWYoIUMuc3RhdGUuZm9udCl7bC5lbnN1cmVTdGF0ZUZvbnQoQy5zdGF0ZSk7Y29udGludWV9cy5hZGRPcChyLk9QUy5uZXh0TGluZSk7cy5hZGRPcChyLk9QUy5zZXRXb3JkU3BhY2luZyxbZS5zaGlmdCgpXSk7cy5hZGRPcChyLk9QUy5zZXRDaGFyU3BhY2luZyxbZS5zaGlmdCgpXSk7ZVswXT1sLmhhbmRsZVRleHQoZVswXSxDLnN0YXRlKTt0PXIuT1BTLnNob3dUZXh0O2JyZWFrO2Nhc2Ugci5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6Qy5zdGF0ZS50ZXh0UmVuZGVyaW5nTW9kZT1lWzBdO2JyZWFrO2Nhc2Ugci5PUFMuc2V0RmlsbENvbG9yU3BhY2U6e2NvbnN0IHQ9eS5Db2xvclNwYWNlLmdldENhY2hlZChlWzBdLGgsZik7aWYodCl7Qy5zdGF0ZS5maWxsQ29sb3JTcGFjZT10O2NvbnRpbnVlfW5leHQobC5wYXJzZUNvbG9yU3BhY2Uoe2NzOmVbMF0scmVzb3VyY2VzOm4sbG9jYWxDb2xvclNwYWNlQ2FjaGU6Zn0pLnRoZW4oKGZ1bmN0aW9uKGUpe2UmJihDLnN0YXRlLmZpbGxDb2xvclNwYWNlPWUpfSkpKTtyZXR1cm59Y2FzZSByLk9QUy5zZXRTdHJva2VDb2xvclNwYWNlOntjb25zdCB0PXkuQ29sb3JTcGFjZS5nZXRDYWNoZWQoZVswXSxoLGYpO2lmKHQpe0Muc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT10O2NvbnRpbnVlfW5leHQobC5wYXJzZUNvbG9yU3BhY2Uoe2NzOmVbMF0scmVzb3VyY2VzOm4sbG9jYWxDb2xvclNwYWNlQ2FjaGU6Zn0pLnRoZW4oKGZ1bmN0aW9uKGUpe2UmJihDLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9ZSl9KSkpO3JldHVybn1jYXNlIHIuT1BTLnNldEZpbGxDb2xvcjpNPUMuc3RhdGUuZmlsbENvbG9yU3BhY2U7ZT1NLmdldFJnYihlLDApO3Q9ci5PUFMuc2V0RmlsbFJHQkNvbG9yO2JyZWFrO2Nhc2Ugci5PUFMuc2V0U3Ryb2tlQ29sb3I6TT1DLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7ZT1NLmdldFJnYihlLDApO3Q9ci5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7YnJlYWs7Y2FzZSByLk9QUy5zZXRGaWxsR3JheTpDLnN0YXRlLmZpbGxDb2xvclNwYWNlPXkuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7ZT15LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYihlLDApO3Q9ci5PUFMuc2V0RmlsbFJHQkNvbG9yO2JyZWFrO2Nhc2Ugci5PUFMuc2V0U3Ryb2tlR3JheTpDLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9eS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTtlPXkuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKGUsMCk7dD1yLk9QUy5zZXRTdHJva2VSR0JDb2xvcjticmVhaztjYXNlIHIuT1BTLnNldEZpbGxDTVlLQ29sb3I6Qy5zdGF0ZS5maWxsQ29sb3JTcGFjZT15LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrO2U9eS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoZSwwKTt0PXIuT1BTLnNldEZpbGxSR0JDb2xvcjticmVhaztjYXNlIHIuT1BTLnNldFN0cm9rZUNNWUtDb2xvcjpDLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9eS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215aztlPXkuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiKGUsMCk7dD1yLk9QUy5zZXRTdHJva2VSR0JDb2xvcjticmVhaztjYXNlIHIuT1BTLnNldEZpbGxSR0JDb2xvcjpDLnN0YXRlLmZpbGxDb2xvclNwYWNlPXkuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjtlPXkuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoZSwwKTticmVhaztjYXNlIHIuT1BTLnNldFN0cm9rZVJHQkNvbG9yOkMuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT15LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7ZT15LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiKGUsMCk7YnJlYWs7Y2FzZSByLk9QUy5zZXRGaWxsQ29sb3JOOk09Qy5zdGF0ZS5maWxsQ29sb3JTcGFjZTtpZigiUGF0dGVybiI9PT1NLm5hbWUpe25leHQobC5oYW5kbGVDb2xvck4ocyxyLk9QUy5zZXRGaWxsQ29sb3JOLGUsTSx4LG4sYSxmLGIsdykpO3JldHVybn1lPU0uZ2V0UmdiKGUsMCk7dD1yLk9QUy5zZXRGaWxsUkdCQ29sb3I7YnJlYWs7Y2FzZSByLk9QUy5zZXRTdHJva2VDb2xvck46TT1DLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7aWYoIlBhdHRlcm4iPT09TS5uYW1lKXtuZXh0KGwuaGFuZGxlQ29sb3JOKHMsci5PUFMuc2V0U3Ryb2tlQ29sb3JOLGUsTSx4LG4sYSxmLGIsdykpO3JldHVybn1lPU0uZ2V0UmdiKGUsMCk7dD1yLk9QUy5zZXRTdHJva2VSR0JDb2xvcjticmVhaztjYXNlIHIuT1BTLnNoYWRpbmdGaWxsOnZhciBqPW4uZ2V0KCJTaGFkaW5nIik7aWYoIWopdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIk5vIHNoYWRpbmcgcmVzb3VyY2UgZm91bmQiKTt2YXIgVT1qLmdldChlWzBdLm5hbWUpO2lmKCFVKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJObyBzaGFkaW5nIG9iamVjdCBmb3VuZCIpO2U9W2wucGFyc2VTaGFkaW5nKHtzaGFkaW5nOlUscmVzb3VyY2VzOm4sbG9jYWxDb2xvclNwYWNlQ2FjaGU6Zixsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGU6d30pXTt0PXIuT1BTLnNoYWRpbmdGaWxsO2JyZWFrO2Nhc2Ugci5PUFMuc2V0R1N0YXRlOkQ9ZVswXWluc3RhbmNlb2YgaS5OYW1lO0U9ZVswXS5uYW1lO2lmKEQpe2NvbnN0IHQ9cC5nZXRCeU5hbWUoRSk7aWYodCl7dC5sZW5ndGg+MCYmcy5hZGRPcChyLk9QUy5zZXRHU3RhdGUsW3RdKTtlPW51bGw7Y29udGludWV9fW5leHQobmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7aWYoIUQpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7Y29uc3Qgbz1uLmdldCgiRXh0R1N0YXRlIik7aWYoIShvIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7Y29uc3QgYz1vLmdldChFKTtpZighKGMgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTtsLnNldEdTdGF0ZSh7cmVzb3VyY2VzOm4sZ1N0YXRlOmMsb3BlcmF0b3JMaXN0OnMsY2FjaGVLZXk6RSx0YXNrOmEsc3RhdGVNYW5hZ2VyOkMsbG9jYWxHU3RhdGVDYWNoZTpwLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmZ9KS50aGVuKGUsdCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIHIuQWJvcnRFeGNlcHRpb24pKXtpZighbC5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLHIud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIEV4dEdTdGF0ZTogIiR7ZX0iLmApfX0pKSk7cmV0dXJuO2Nhc2Ugci5PUFMubW92ZVRvOmNhc2Ugci5PUFMubGluZVRvOmNhc2Ugci5PUFMuY3VydmVUbzpjYXNlIHIuT1BTLmN1cnZlVG8yOmNhc2Ugci5PUFMuY3VydmVUbzM6Y2FzZSByLk9QUy5jbG9zZVBhdGg6Y2FzZSByLk9QUy5yZWN0YW5nbGU6bC5idWlsZFBhdGgocyx0LGUsdSk7Y29udGludWU7Y2FzZSByLk9QUy5tYXJrUG9pbnQ6Y2FzZSByLk9QUy5tYXJrUG9pbnRQcm9wczpjYXNlIHIuT1BTLmJlZ2luQ29tcGF0OmNhc2Ugci5PUFMuZW5kQ29tcGF0OmNvbnRpbnVlO2Nhc2Ugci5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6aWYoIShlWzBdaW5zdGFuY2VvZiBpLk5hbWUpKXsoMCxyLndhcm4pKGBFeHBlY3RlZCBuYW1lIGZvciBiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyBhcmcwPSR7ZVswXX1gKTtjb250aW51ZX1pZigiT0MiPT09ZVswXS5uYW1lKXtuZXh0KGwucGFyc2VNYXJrZWRDb250ZW50UHJvcHMoZVsxXSxuKS50aGVuKChlPT57cy5hZGRPcChyLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcyxbIk9DIixlXSl9KSkuY2F0Y2goKGU9PntpZighKGUgaW5zdGFuY2VvZiByLkFib3J0RXhjZXB0aW9uKSl7aWYoIWwub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxyLndhcm4pKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogIiR7ZX0iLmApfX0pKSk7cmV0dXJufWU9W2VbMF0ubmFtZSxlWzFdaW5zdGFuY2VvZiBpLkRpY3Q/ZVsxXS5nZXQoIk1DSUQiKTpudWxsXTticmVhaztjYXNlIHIuT1BTLmJlZ2luTWFya2VkQ29udGVudDpjYXNlIHIuT1BTLmVuZE1hcmtlZENvbnRlbnQ6ZGVmYXVsdDppZihudWxsIT09ZSl7Zm9yKE89MCxUPWUubGVuZ3RoO088VCYmIShlW09daW5zdGFuY2VvZiBpLkRpY3QpO08rKyk7aWYoTzxUKXsoMCxyLndhcm4pKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBvcGVyYXRvcjogIit0KTtjb250aW51ZX19fXMuYWRkT3AodCxlKX1pZihnKW5leHQoJCk7ZWxzZXtjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKCk7ZSgpfX0pKS5jYXRjaCgoZT0+e2lmKCEoZSBpbnN0YW5jZW9mIHIuQWJvcnRFeGNlcHRpb24pKXtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLHIud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGVycm9ycyBkdXJpbmcgIiR7YS5uYW1lfSIgdGFzazogIiR7ZX0iLmApO2Nsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKX19KSl9Z2V0VGV4dENvbnRlbnQoZSl7bGV0e3N0cmVhbTp0LHRhc2s6YSxyZXNvdXJjZXM6bixzdGF0ZU1hbmFnZXI6cz1udWxsLGluY2x1ZGVNYXJrZWRDb250ZW50Om89ITEsc2luazpjLHNlZW5TdHlsZXM6bD1uZXcgU2V0LHZpZXdCb3g6aCxtYXJrZWRDb250ZW50RGF0YTp1PW51bGwsZGlzYWJsZU5vcm1hbGl6YXRpb246ZD0hMX09ZTtufHw9aS5EaWN0LmVtcHR5O3N8fD1uZXcgU3RhdGVNYW5hZ2VyKG5ldyBUZXh0U3RhdGUpO28mJih1fHw9e2xldmVsOjB9KTtjb25zdCBmPXtpdGVtczpbXSxzdHlsZXM6T2JqZWN0LmNyZWF0ZShudWxsKX0scD17aW5pdGlhbGl6ZWQ6ITEsc3RyOltdLHRvdGFsV2lkdGg6MCx0b3RhbEhlaWdodDowLHdpZHRoOjAsaGVpZ2h0OjAsdmVydGljYWw6ITEscHJldlRyYW5zZm9ybTpudWxsLHRleHRBZHZhbmNlU2NhbGU6MCxzcGFjZUluRmxvd01pbjowLHNwYWNlSW5GbG93TWF4OjAsdHJhY2tpbmdTcGFjZU1pbjoxLzAsbmVnYXRpdmVTcGFjZU1heDotMS8wLG5vdEFTcGFjZTotMS8wLHRyYW5zZm9ybTpudWxsLGZvbnROYW1lOm51bGwsaGFzRU9MOiExfSx5PVsiICIsIiAiXTtsZXQgdz0wO2Z1bmN0aW9uIHNhdmVMYXN0Q2hhcihlKXtjb25zdCB0PSh3KzEpJTIsYT0iICIhPT15W3ddJiYiICI9PT15W3RdO3lbd109ZTt3PXQ7cmV0dXJuIGF9ZnVuY3Rpb24gc2hvdWxkQWRkV2hpdGVwc2FjZSgpe3JldHVybiIgIiE9PXlbd10mJiIgIj09PXlbKHcrMSklMl19ZnVuY3Rpb24gcmVzZXRMYXN0Q2hhcnMoKXt5WzBdPXlbMV09IiAiO3c9MH1jb25zdCBTPXRoaXMseD10aGlzLnhyZWYsQz1bXTtsZXQgdj1udWxsO2NvbnN0IGs9bmV3IGcuTG9jYWxJbWFnZUNhY2hlLE89bmV3IGcuTG9jYWxHU3RhdGVDYWNoZSxUPW5ldyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IodCx4LHMpO2xldCBNO2Z1bmN0aW9uIHB1c2hXaGl0ZXNwYWNlKGUpe2xldHt3aWR0aDp0PTAsaGVpZ2h0OmE9MCx0cmFuc2Zvcm06cj1wLnByZXZUcmFuc2Zvcm0sZm9udE5hbWU6bj1wLmZvbnROYW1lfT1lO2YuaXRlbXMucHVzaCh7c3RyOiIgIixkaXI6Imx0ciIsd2lkdGg6dCxoZWlnaHQ6YSx0cmFuc2Zvcm06cixmb250TmFtZTpuLGhhc0VPTDohMX0pfWZ1bmN0aW9uIGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCl7Y29uc3QgZT1NLmZvbnQsdD1bTS5mb250U2l6ZSpNLnRleHRIU2NhbGUsMCwwLE0uZm9udFNpemUsMCxNLnRleHRSaXNlXTtpZihlLmlzVHlwZTNGb250JiYoTS5mb250U2l6ZTw9MXx8ZS5pc0NoYXJCQm94KSYmISgwLHIuaXNBcnJheUVxdWFsKShNLmZvbnRNYXRyaXgsci5GT05UX0lERU5USVRZX01BVFJJWCkpe2NvbnN0IGE9ZS5iYm94WzNdLWUuYmJveFsxXTthPjAmJih0WzNdKj1hKk0uZm9udE1hdHJpeFszXSl9cmV0dXJuIHIuVXRpbC50cmFuc2Zvcm0oTS5jdG0sci5VdGlsLnRyYW5zZm9ybShNLnRleHRNYXRyaXgsdCkpfWZ1bmN0aW9uIGVuc3VyZVRleHRDb250ZW50SXRlbSgpe2lmKHAuaW5pdGlhbGl6ZWQpcmV0dXJuIHA7Y29uc3R7Zm9udDplLGxvYWRlZE5hbWU6dH09TTtpZighbC5oYXModCkpe2wuYWRkKHQpO2Yuc3R5bGVzW3RdPXtmb250RmFtaWx5OmUuZmFsbGJhY2tOYW1lLGFzY2VudDplLmFzY2VudCxkZXNjZW50OmUuZGVzY2VudCx2ZXJ0aWNhbDplLnZlcnRpY2FsfX1wLmZvbnROYW1lPXQ7Y29uc3QgYT1wLnRyYW5zZm9ybT1nZXRDdXJyZW50VGV4dFRyYW5zZm9ybSgpO2lmKGUudmVydGljYWwpe3Aud2lkdGg9cC50b3RhbFdpZHRoPU1hdGguaHlwb3QoYVswXSxhWzFdKTtwLmhlaWdodD1wLnRvdGFsSGVpZ2h0PTA7cC52ZXJ0aWNhbD0hMH1lbHNle3Aud2lkdGg9cC50b3RhbFdpZHRoPTA7cC5oZWlnaHQ9cC50b3RhbEhlaWdodD1NYXRoLmh5cG90KGFbMl0sYVszXSk7cC52ZXJ0aWNhbD0hMX1jb25zdCByPU1hdGguaHlwb3QoTS50ZXh0TGluZU1hdHJpeFswXSxNLnRleHRMaW5lTWF0cml4WzFdKSxuPU1hdGguaHlwb3QoTS5jdG1bMF0sTS5jdG1bMV0pO3AudGV4dEFkdmFuY2VTY2FsZT1uKnI7Y29uc3R7Zm9udFNpemU6aX09TTtwLnRyYWNraW5nU3BhY2VNaW49LjEwMippO3Aubm90QVNwYWNlPS4wMyppO3AubmVnYXRpdmVTcGFjZU1heD0tLjIqaTtwLnNwYWNlSW5GbG93TWluPS4xMDIqaTtwLnNwYWNlSW5GbG93TWF4PS42Kmk7cC5oYXNFT0w9ITE7cC5pbml0aWFsaXplZD0hMDtyZXR1cm4gcH1mdW5jdGlvbiB1cGRhdGVBZHZhbmNlU2NhbGUoKXtpZighcC5pbml0aWFsaXplZClyZXR1cm47Y29uc3QgZT1NYXRoLmh5cG90KE0udGV4dExpbmVNYXRyaXhbMF0sTS50ZXh0TGluZU1hdHJpeFsxXSksdD1NYXRoLmh5cG90KE0uY3RtWzBdLE0uY3RtWzFdKSplO2lmKHQhPT1wLnRleHRBZHZhbmNlU2NhbGUpe2lmKHAudmVydGljYWwpe3AudG90YWxIZWlnaHQrPXAuaGVpZ2h0KnAudGV4dEFkdmFuY2VTY2FsZTtwLmhlaWdodD0wfWVsc2V7cC50b3RhbFdpZHRoKz1wLndpZHRoKnAudGV4dEFkdmFuY2VTY2FsZTtwLndpZHRoPTB9cC50ZXh0QWR2YW5jZVNjYWxlPXR9fWZ1bmN0aW9uIGhhbmRsZVNldEZvbnQoZSx0KXtyZXR1cm4gUy5sb2FkRm9udChlLHQsbikudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZm9udC5pc1R5cGUzRm9udD9lLmxvYWRUeXBlM0RhdGEoUyxuLGEpLmNhdGNoKChmdW5jdGlvbigpe30pKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBlfSkpOmV9KSkudGhlbigoZnVuY3Rpb24oZSl7TS5sb2FkZWROYW1lPWUubG9hZGVkTmFtZTtNLmZvbnQ9ZS5mb250O00uZm9udE1hdHJpeD1lLmZvbnQuZm9udE1hdHJpeHx8ci5GT05UX0lERU5USVRZX01BVFJJWH0pKX1mdW5jdGlvbiBhcHBseUludmVyc2VSb3RhdGlvbihlLHQsYSl7Y29uc3Qgcj1NYXRoLmh5cG90KGFbMF0sYVsxXSk7cmV0dXJuWyhhWzBdKmUrYVsxXSp0KS9yLChhWzJdKmUrYVszXSp0KS9yXX1mdW5jdGlvbiBjb21wYXJlV2l0aExhc3RQb3NpdGlvbihlKXtjb25zdCB0PWdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7bGV0IGE9dFs0XSxyPXRbNV07aWYoTS5mb250Py52ZXJ0aWNhbCl7aWYoYTxoWzBdfHxhPmhbMl18fHIrZTxoWzFdfHxyPmhbM10pcmV0dXJuITF9ZWxzZSBpZihhK2U8aFswXXx8YT5oWzJdfHxyPGhbMV18fHI+aFszXSlyZXR1cm4hMTtpZighTS5mb250fHwhcC5wcmV2VHJhbnNmb3JtKXJldHVybiEwO2xldCBuPXAucHJldlRyYW5zZm9ybVs0XSxpPXAucHJldlRyYW5zZm9ybVs1XTtpZihuPT09YSYmaT09PXIpcmV0dXJuITA7bGV0IHM9LTE7dFswXSYmMD09PXRbMV0mJjA9PT10WzJdP3M9dFswXT4wPzA6MTgwOnRbMV0mJjA9PT10WzBdJiYwPT09dFszXSYmKHM9dFsxXT4wPzkwOjI3MCk7c3dpdGNoKHMpe2Nhc2UgMDpicmVhaztjYXNlIDkwOlthLHJdPVtyLGFdO1tuLGldPVtpLG5dO2JyZWFrO2Nhc2UgMTgwOlthLHIsbixpXT1bLWEsLXIsLW4sLWldO2JyZWFrO2Nhc2UgMjcwOlthLHJdPVstciwtYV07W24saV09Wy1pLC1uXTticmVhaztkZWZhdWx0OlthLHJdPWFwcGx5SW52ZXJzZVJvdGF0aW9uKGEscix0KTtbbixpXT1hcHBseUludmVyc2VSb3RhdGlvbihuLGkscC5wcmV2VHJhbnNmb3JtKX1pZihNLmZvbnQudmVydGljYWwpe2NvbnN0IGU9KGktcikvcC50ZXh0QWR2YW5jZVNjYWxlLHQ9YS1uLHM9TWF0aC5zaWduKHAuaGVpZ2h0KTtpZihlPHMqcC5uZWdhdGl2ZVNwYWNlTWF4KXtpZihNYXRoLmFicyh0KT4uNSpwLndpZHRoKXthcHBlbmRFT0woKTtyZXR1cm4hMH1yZXNldExhc3RDaGFycygpO2ZsdXNoVGV4dENvbnRlbnRJdGVtKCk7cmV0dXJuITB9aWYoTWF0aC5hYnModCk+cC53aWR0aCl7YXBwZW5kRU9MKCk7cmV0dXJuITB9ZTw9cypwLm5vdEFTcGFjZSYmcmVzZXRMYXN0Q2hhcnMoKTtpZihlPD1zKnAudHJhY2tpbmdTcGFjZU1pbilpZihzaG91bGRBZGRXaGl0ZXBzYWNlKCkpe3Jlc2V0TGFzdENoYXJzKCk7Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtwdXNoV2hpdGVzcGFjZSh7aGVpZ2h0Ok1hdGguYWJzKGUpfSl9ZWxzZSBwLmhlaWdodCs9ZTtlbHNlIGlmKCFhZGRGYWtlU3BhY2VzKGUscC5wcmV2VHJhbnNmb3JtLHMpKWlmKDA9PT1wLnN0ci5sZW5ndGgpe3Jlc2V0TGFzdENoYXJzKCk7cHVzaFdoaXRlc3BhY2Uoe2hlaWdodDpNYXRoLmFicyhlKX0pfWVsc2UgcC5oZWlnaHQrPWU7TWF0aC5hYnModCk+LjI1KnAud2lkdGgmJmZsdXNoVGV4dENvbnRlbnRJdGVtKCk7cmV0dXJuITB9Y29uc3Qgbz0oYS1uKS9wLnRleHRBZHZhbmNlU2NhbGUsYz1yLWksbD1NYXRoLnNpZ24ocC53aWR0aCk7aWYobzxsKnAubmVnYXRpdmVTcGFjZU1heCl7aWYoTWF0aC5hYnMoYyk+LjUqcC5oZWlnaHQpe2FwcGVuZEVPTCgpO3JldHVybiEwfXJlc2V0TGFzdENoYXJzKCk7Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtyZXR1cm4hMH1pZihNYXRoLmFicyhjKT5wLmhlaWdodCl7YXBwZW5kRU9MKCk7cmV0dXJuITB9bzw9bCpwLm5vdEFTcGFjZSYmcmVzZXRMYXN0Q2hhcnMoKTtpZihvPD1sKnAudHJhY2tpbmdTcGFjZU1pbilpZihzaG91bGRBZGRXaGl0ZXBzYWNlKCkpe3Jlc2V0TGFzdENoYXJzKCk7Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtwdXNoV2hpdGVzcGFjZSh7d2lkdGg6TWF0aC5hYnMobyl9KX1lbHNlIHAud2lkdGgrPW87ZWxzZSBpZighYWRkRmFrZVNwYWNlcyhvLHAucHJldlRyYW5zZm9ybSxsKSlpZigwPT09cC5zdHIubGVuZ3RoKXtyZXNldExhc3RDaGFycygpO3B1c2hXaGl0ZXNwYWNlKHt3aWR0aDpNYXRoLmFicyhvKX0pfWVsc2UgcC53aWR0aCs9bztNYXRoLmFicyhjKT4uMjUqcC5oZWlnaHQmJmZsdXNoVGV4dENvbnRlbnRJdGVtKCk7cmV0dXJuITB9ZnVuY3Rpb24gYnVpbGRUZXh0Q29udGVudEl0ZW0oZSl7bGV0e2NoYXJzOnQsZXh0cmFTcGFjaW5nOmF9PWU7Y29uc3Qgcj1NLmZvbnQ7aWYoIXQpe2NvbnN0IGU9TS5jaGFyU3BhY2luZythO2UmJihyLnZlcnRpY2FsP00udHJhbnNsYXRlVGV4dE1hdHJpeCgwLC1lKTpNLnRyYW5zbGF0ZVRleHRNYXRyaXgoZSpNLnRleHRIU2NhbGUsMCkpO3JldHVybn1jb25zdCBuPXIuY2hhcnNUb0dseXBocyh0KSxpPU0uZm9udE1hdHJpeFswXSpNLmZvbnRTaXplO2ZvcihsZXQgZT0wLHQ9bi5sZW5ndGg7ZTx0O2UrKyl7Y29uc3Qgcz1uW2VdLHtjYXRlZ29yeTpvfT1zO2lmKG8uaXNJbnZpc2libGVGb3JtYXRNYXJrKWNvbnRpbnVlO2xldCBjPU0uY2hhclNwYWNpbmcrKGUrMT09PXQ/YTowKSxsPXMud2lkdGg7ci52ZXJ0aWNhbCYmKGw9cy52bWV0cmljP3Mudm1ldHJpY1swXTotbCk7bGV0IGg9bCppO2lmKG8uaXNXaGl0ZXNwYWNlKXtpZihyLnZlcnRpY2FsKXtjKz0taCtNLndvcmRTcGFjaW5nO00udHJhbnNsYXRlVGV4dE1hdHJpeCgwLC1jKX1lbHNle2MrPWgrTS53b3JkU3BhY2luZztNLnRyYW5zbGF0ZVRleHRNYXRyaXgoYypNLnRleHRIU2NhbGUsMCl9c2F2ZUxhc3RDaGFyKCIgIik7Y29udGludWV9aWYoIW8uaXNaZXJvV2lkdGhEaWFjcml0aWMmJiFjb21wYXJlV2l0aExhc3RQb3NpdGlvbihoKSl7ci52ZXJ0aWNhbD9NLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCxoKTpNLnRyYW5zbGF0ZVRleHRNYXRyaXgoaCpNLnRleHRIU2NhbGUsMCk7Y29udGludWV9Y29uc3QgdT1lbnN1cmVUZXh0Q29udGVudEl0ZW0oKTtvLmlzWmVyb1dpZHRoRGlhY3JpdGljJiYoaD0wKTtpZihyLnZlcnRpY2FsKXtNLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCxoKTtoPU1hdGguYWJzKGgpO3UuaGVpZ2h0Kz1ofWVsc2V7aCo9TS50ZXh0SFNjYWxlO00udHJhbnNsYXRlVGV4dE1hdHJpeChoLDApO3Uud2lkdGgrPWh9aCYmKHUucHJldlRyYW5zZm9ybT1nZXRDdXJyZW50VGV4dFRyYW5zZm9ybSgpKTtjb25zdCBkPXMudW5pY29kZTtzYXZlTGFzdENoYXIoZCkmJnUuc3RyLnB1c2goIiAiKTt1LnN0ci5wdXNoKGQpO2MmJihyLnZlcnRpY2FsP00udHJhbnNsYXRlVGV4dE1hdHJpeCgwLC1jKTpNLnRyYW5zbGF0ZVRleHRNYXRyaXgoYypNLnRleHRIU2NhbGUsMCkpfX1mdW5jdGlvbiBhcHBlbmRFT0woKXtyZXNldExhc3RDaGFycygpO2lmKHAuaW5pdGlhbGl6ZWQpe3AuaGFzRU9MPSEwO2ZsdXNoVGV4dENvbnRlbnRJdGVtKCl9ZWxzZSBmLml0ZW1zLnB1c2goe3N0cjoiIixkaXI6Imx0ciIsd2lkdGg6MCxoZWlnaHQ6MCx0cmFuc2Zvcm06Z2V0Q3VycmVudFRleHRUcmFuc2Zvcm0oKSxmb250TmFtZTpNLmxvYWRlZE5hbWUsaGFzRU9MOiEwfSl9ZnVuY3Rpb24gYWRkRmFrZVNwYWNlcyhlLHQsYSl7aWYoYSpwLnNwYWNlSW5GbG93TWluPD1lJiZlPD1hKnAuc3BhY2VJbkZsb3dNYXgpe2lmKHAuaW5pdGlhbGl6ZWQpe3Jlc2V0TGFzdENoYXJzKCk7cC5zdHIucHVzaCgiICIpfXJldHVybiExfWNvbnN0IHI9cC5mb250TmFtZTtsZXQgbj0wO2lmKHAudmVydGljYWwpe249ZTtlPTB9Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtyZXNldExhc3RDaGFycygpO3B1c2hXaGl0ZXNwYWNlKHt3aWR0aDpNYXRoLmFicyhlKSxoZWlnaHQ6TWF0aC5hYnMobiksdHJhbnNmb3JtOnR8fGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCksZm9udE5hbWU6cn0pO3JldHVybiEwfWZ1bmN0aW9uIGZsdXNoVGV4dENvbnRlbnRJdGVtKCl7aWYocC5pbml0aWFsaXplZCYmcC5zdHIpe3AudmVydGljYWw/cC50b3RhbEhlaWdodCs9cC5oZWlnaHQqcC50ZXh0QWR2YW5jZVNjYWxlOnAudG90YWxXaWR0aCs9cC53aWR0aCpwLnRleHRBZHZhbmNlU2NhbGU7Zi5pdGVtcy5wdXNoKGZ1bmN0aW9uIHJ1bkJpZGlUcmFuc2Zvcm0oZSl7bGV0IHQ9ZS5zdHIuam9pbigiIik7ZHx8KHQ9KDAsci5ub3JtYWxpemVVbmljb2RlKSh0KSk7Y29uc3QgYT0oMCxiLmJpZGkpKHQsLTEsZS52ZXJ0aWNhbCk7cmV0dXJue3N0cjphLnN0cixkaXI6YS5kaXIsd2lkdGg6TWF0aC5hYnMoZS50b3RhbFdpZHRoKSxoZWlnaHQ6TWF0aC5hYnMoZS50b3RhbEhlaWdodCksdHJhbnNmb3JtOmUudHJhbnNmb3JtLGZvbnROYW1lOmUuZm9udE5hbWUsaGFzRU9MOmUuaGFzRU9MfX0ocCkpO3AuaW5pdGlhbGl6ZWQ9ITE7cC5zdHIubGVuZ3RoPTB9fWZ1bmN0aW9uIGVucXVldWVDaHVuaygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07Y29uc3QgdD1mLml0ZW1zLmxlbmd0aDtpZigwIT09dCYmIShlJiZ0PDEwKSl7Yy5lbnF1ZXVlKGYsdCk7Zi5pdGVtcz1bXTtmLnN0eWxlcz1PYmplY3QuY3JlYXRlKG51bGwpfX1jb25zdCBFPW5ldyBUaW1lU2xvdE1hbmFnZXI7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbiBwcm9taXNlQm9keShlLHQpe2NvbnN0IG5leHQ9ZnVuY3Rpb24oYSl7ZW5xdWV1ZUNodW5rKCEwKTtQcm9taXNlLmFsbChbYSxjLnJlYWR5XSkudGhlbigoZnVuY3Rpb24oKXt0cnl7cHJvbWlzZUJvZHkoZSx0KX1jYXRjaChlKXt0KGUpfX0pLHQpfTthLmVuc3VyZU5vdFRlcm1pbmF0ZWQoKTtFLnJlc2V0KCk7Y29uc3QgZz17fTtsZXQgcCxiPVtdO2Zvcig7IShwPUUuY2hlY2soKSk7KXtiLmxlbmd0aD0wO2cuYXJncz1iO2lmKCFULnJlYWQoZykpYnJlYWs7Y29uc3QgZT1NO009cy5zdGF0ZTtjb25zdCB0PWcuZm47Yj1nLmFyZ3M7c3dpdGNoKDB8dCl7Y2FzZSByLk9QUy5zZXRGb250OnZhciB5PWJbMF0ubmFtZSx3PWJbMV07aWYoTS5mb250JiZ5PT09TS5mb250TmFtZSYmdz09PU0uZm9udFNpemUpYnJlYWs7Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtNLmZvbnROYW1lPXk7TS5mb250U2l6ZT13O25leHQoaGFuZGxlU2V0Rm9udCh5LG51bGwpKTtyZXR1cm47Y2FzZSByLk9QUy5zZXRUZXh0UmlzZTpNLnRleHRSaXNlPWJbMF07YnJlYWs7Y2FzZSByLk9QUy5zZXRIU2NhbGU6TS50ZXh0SFNjYWxlPWJbMF0vMTAwO2JyZWFrO2Nhc2Ugci5PUFMuc2V0TGVhZGluZzpNLmxlYWRpbmc9YlswXTticmVhaztjYXNlIHIuT1BTLm1vdmVUZXh0Ok0udHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYlswXSxiWzFdKTtNLnRleHRNYXRyaXg9TS50ZXh0TGluZU1hdHJpeC5zbGljZSgpO2JyZWFrO2Nhc2Ugci5PUFMuc2V0TGVhZGluZ01vdmVUZXh0Ok0ubGVhZGluZz0tYlsxXTtNLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGJbMF0sYlsxXSk7TS50ZXh0TWF0cml4PU0udGV4dExpbmVNYXRyaXguc2xpY2UoKTticmVhaztjYXNlIHIuT1BTLm5leHRMaW5lOk0uY2FycmlhZ2VSZXR1cm4oKTticmVhaztjYXNlIHIuT1BTLnNldFRleHRNYXRyaXg6TS5zZXRUZXh0TWF0cml4KGJbMF0sYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdKTtNLnNldFRleHRMaW5lTWF0cml4KGJbMF0sYlsxXSxiWzJdLGJbM10sYls0XSxiWzVdKTt1cGRhdGVBZHZhbmNlU2NhbGUoKTticmVhaztjYXNlIHIuT1BTLnNldENoYXJTcGFjaW5nOk0uY2hhclNwYWNpbmc9YlswXTticmVhaztjYXNlIHIuT1BTLnNldFdvcmRTcGFjaW5nOk0ud29yZFNwYWNpbmc9YlswXTticmVhaztjYXNlIHIuT1BTLmJlZ2luVGV4dDpNLnRleHRNYXRyaXg9ci5JREVOVElUWV9NQVRSSVguc2xpY2UoKTtNLnRleHRMaW5lTWF0cml4PXIuSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7YnJlYWs7Y2FzZSByLk9QUy5zaG93U3BhY2VkVGV4dDppZighcy5zdGF0ZS5mb250KXtTLmVuc3VyZVN0YXRlRm9udChzLnN0YXRlKTtjb250aW51ZX1jb25zdCB0PShNLmZvbnQudmVydGljYWw/MTotMSkqTS5mb250U2l6ZS8xZTMsZz1iWzBdO2ZvcihsZXQgZT0wLGE9Zy5sZW5ndGg7ZTxhO2UrKyl7Y29uc3QgYT1nW2VdO2lmKCJzdHJpbmciPT10eXBlb2YgYSlDLnB1c2goYSk7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGEmJjAhPT1hKXtjb25zdCBlPUMuam9pbigiIik7Qy5sZW5ndGg9MDtidWlsZFRleHRDb250ZW50SXRlbSh7Y2hhcnM6ZSxleHRyYVNwYWNpbmc6YSp0fSl9fWlmKEMubGVuZ3RoPjApe2NvbnN0IGU9Qy5qb2luKCIiKTtDLmxlbmd0aD0wO2J1aWxkVGV4dENvbnRlbnRJdGVtKHtjaGFyczplLGV4dHJhU3BhY2luZzowfSl9YnJlYWs7Y2FzZSByLk9QUy5zaG93VGV4dDppZighcy5zdGF0ZS5mb250KXtTLmVuc3VyZVN0YXRlRm9udChzLnN0YXRlKTtjb250aW51ZX1idWlsZFRleHRDb250ZW50SXRlbSh7Y2hhcnM6YlswXSxleHRyYVNwYWNpbmc6MH0pO2JyZWFrO2Nhc2Ugci5PUFMubmV4dExpbmVTaG93VGV4dDppZighcy5zdGF0ZS5mb250KXtTLmVuc3VyZVN0YXRlRm9udChzLnN0YXRlKTtjb250aW51ZX1NLmNhcnJpYWdlUmV0dXJuKCk7YnVpbGRUZXh0Q29udGVudEl0ZW0oe2NoYXJzOmJbMF0sZXh0cmFTcGFjaW5nOjB9KTticmVhaztjYXNlIHIuT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OmlmKCFzLnN0YXRlLmZvbnQpe1MuZW5zdXJlU3RhdGVGb250KHMuc3RhdGUpO2NvbnRpbnVlfU0ud29yZFNwYWNpbmc9YlswXTtNLmNoYXJTcGFjaW5nPWJbMV07TS5jYXJyaWFnZVJldHVybigpO2J1aWxkVGV4dENvbnRlbnRJdGVtKHtjaGFyczpiWzJdLGV4dHJhU3BhY2luZzowfSk7YnJlYWs7Y2FzZSByLk9QUy5wYWludFhPYmplY3Q6Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTt2fHwodj1uLmdldCgiWE9iamVjdCIpfHxpLkRpY3QuZW1wdHkpO3ZhciBEPWJbMF1pbnN0YW5jZW9mIGkuTmFtZSxOPWJbMF0ubmFtZTtpZihEJiZrLmdldEJ5TmFtZShOKSlicmVhaztuZXh0KG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe2lmKCFEKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTtsZXQgZj12LmdldFJhdyhOKTtpZihmIGluc3RhbmNlb2YgaS5SZWYpe2lmKGsuZ2V0QnlSZWYoZikpe2UoKTtyZXR1cm59aWYoUy5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoZixTLnBhZ2VJbmRleCkpe2UoKTtyZXR1cm59Zj14LmZldGNoKGYpfWlmKCEoZiBpbnN0YW5jZW9mIG0uQmFzZVN0cmVhbSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7Y29uc3QgZz1mLmRpY3QuZ2V0KCJTdWJ0eXBlIik7aWYoIShnIGluc3RhbmNlb2YgaS5OYW1lKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpO2lmKCJGb3JtIiE9PWcubmFtZSl7ay5zZXQoTixmLmRpY3Qub2JqSWQsITApO2UoKTtyZXR1cm59Y29uc3QgcD1zLnN0YXRlLmNsb25lKCksYj1uZXcgU3RhdGVNYW5hZ2VyKHApLHk9Zi5kaWN0LmdldEFycmF5KCJNYXRyaXgiKTtBcnJheS5pc0FycmF5KHkpJiY2PT09eS5sZW5ndGgmJmIudHJhbnNmb3JtKHkpO2VucXVldWVDaHVuaygpO2NvbnN0IHc9e2VucXVldWVJbnZva2VkOiExLGVucXVldWUoZSx0KXt0aGlzLmVucXVldWVJbnZva2VkPSEwO2MuZW5xdWV1ZShlLHQpfSxnZXQgZGVzaXJlZFNpemUoKXtyZXR1cm4gYy5kZXNpcmVkU2l6ZX0sZ2V0IHJlYWR5KCl7cmV0dXJuIGMucmVhZHl9fTtTLmdldFRleHRDb250ZW50KHtzdHJlYW06Zix0YXNrOmEscmVzb3VyY2VzOmYuZGljdC5nZXQoIlJlc291cmNlcyIpfHxuLHN0YXRlTWFuYWdlcjpiLGluY2x1ZGVNYXJrZWRDb250ZW50Om8sc2luazp3LHNlZW5TdHlsZXM6bCx2aWV3Qm94OmgsbWFya2VkQ29udGVudERhdGE6dSxkaXNhYmxlTm9ybWFsaXphdGlvbjpkfSkudGhlbigoZnVuY3Rpb24oKXt3LmVucXVldWVJbnZva2VkfHxrLnNldChOLGYuZGljdC5vYmpJZCwhMCk7ZSgpfSksdCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIHIuQWJvcnRFeGNlcHRpb24pKXtpZighUy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLHIud2FybikoYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgWE9iamVjdDogIiR7ZX0iLmApfX0pKSk7cmV0dXJuO2Nhc2Ugci5PUFMuc2V0R1N0YXRlOkQ9YlswXWluc3RhbmNlb2YgaS5OYW1lO049YlswXS5uYW1lO2lmKEQmJk8uZ2V0QnlOYW1lKE4pKWJyZWFrO25leHQobmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7aWYoIUQpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7Y29uc3QgYT1uLmdldCgiRXh0R1N0YXRlIik7aWYoIShhIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7Y29uc3Qgcz1hLmdldChOKTtpZighKHMgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTtjb25zdCBvPXMuZ2V0KCJGb250Iik7aWYobyl7Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtNLmZvbnROYW1lPW51bGw7TS5mb250U2l6ZT1vWzFdO2hhbmRsZVNldEZvbnQobnVsbCxvWzBdKS50aGVuKGUsdCl9ZWxzZXtPLnNldChOLHMub2JqSWQsITApO2UoKX19KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIHIuQWJvcnRFeGNlcHRpb24pKXtpZighUy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLHIud2FybikoYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJHtlfSIuYCl9fSkpKTtyZXR1cm47Y2FzZSByLk9QUy5iZWdpbk1hcmtlZENvbnRlbnQ6Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtpZihvKXt1LmxldmVsKys7Zi5pdGVtcy5wdXNoKHt0eXBlOiJiZWdpbk1hcmtlZENvbnRlbnQiLHRhZzpiWzBdaW5zdGFuY2VvZiBpLk5hbWU/YlswXS5uYW1lOm51bGx9KX1icmVhaztjYXNlIHIuT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzOmZsdXNoVGV4dENvbnRlbnRJdGVtKCk7aWYobyl7dS5sZXZlbCsrO2xldCBlPW51bGw7YlsxXWluc3RhbmNlb2YgaS5EaWN0JiYoZT1iWzFdLmdldCgiTUNJRCIpKTtmLml0ZW1zLnB1c2goe3R5cGU6ImJlZ2luTWFya2VkQ29udGVudFByb3BzIixpZDpOdW1iZXIuaXNJbnRlZ2VyKGUpP2Ake1MuaWRGYWN0b3J5LmdldFBhZ2VPYmpJZCgpfV9tYyR7ZX1gOm51bGwsdGFnOmJbMF1pbnN0YW5jZW9mIGkuTmFtZT9iWzBdLm5hbWU6bnVsbH0pfWJyZWFrO2Nhc2Ugci5PUFMuZW5kTWFya2VkQ29udGVudDpmbHVzaFRleHRDb250ZW50SXRlbSgpO2lmKG8pe2lmKDA9PT11LmxldmVsKWJyZWFrO3UubGV2ZWwtLTtmLml0ZW1zLnB1c2goe3R5cGU6ImVuZE1hcmtlZENvbnRlbnQifSl9YnJlYWs7Y2FzZSByLk9QUy5yZXN0b3JlOiFlfHxlLmZvbnQ9PT1NLmZvbnQmJmUuZm9udFNpemU9PT1NLmZvbnRTaXplJiZlLmZvbnROYW1lPT09TS5mb250TmFtZXx8Zmx1c2hUZXh0Q29udGVudEl0ZW0oKX1pZihmLml0ZW1zLmxlbmd0aD49Yy5kZXNpcmVkU2l6ZSl7cD0hMDticmVha319aWYocCluZXh0KCQpO2Vsc2V7Zmx1c2hUZXh0Q29udGVudEl0ZW0oKTtlbnF1ZXVlQ2h1bmsoKTtlKCl9fSkpLmNhdGNoKChlPT57aWYoIShlIGluc3RhbmNlb2Ygci5BYm9ydEV4Y2VwdGlvbikpe2lmKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7KDAsci53YXJuKShgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nICIke2EubmFtZX0iIHRhc2s6ICIke2V9Ii5gKTtmbHVzaFRleHRDb250ZW50SXRlbSgpO2VucXVldWVDaHVuaygpfX0pKX1leHRyYWN0RGF0YVN0cnVjdHVyZXMoZSx0LGEpe2NvbnN0IG49dGhpcy54cmVmO2xldCBzO2NvbnN0IGw9dGhpcy5yZWFkVG9Vbmljb2RlKGEudG9Vbmljb2RlfHxlLmdldCgiVG9Vbmljb2RlIil8fHQuZ2V0KCJUb1VuaWNvZGUiKSk7aWYoYS5jb21wb3NpdGUpe2NvbnN0IHQ9ZS5nZXQoIkNJRFN5c3RlbUluZm8iKTt0IGluc3RhbmNlb2YgaS5EaWN0JiYoYS5jaWRTeXN0ZW1JbmZvPXtyZWdpc3RyeTooMCxyLnN0cmluZ1RvUERGU3RyaW5nKSh0LmdldCgiUmVnaXN0cnkiKSksb3JkZXJpbmc6KDAsci5zdHJpbmdUb1BERlN0cmluZykodC5nZXQoIk9yZGVyaW5nIikpLHN1cHBsZW1lbnQ6dC5nZXQoIlN1cHBsZW1lbnQiKX0pO3RyeXtjb25zdCB0PWUuZ2V0KCJDSURUb0dJRE1hcCIpO3QgaW5zdGFuY2VvZiBtLkJhc2VTdHJlYW0mJihzPXQuZ2V0Qnl0ZXMoKSl9Y2F0Y2goZSl7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxyLndhcm4pKGBleHRyYWN0RGF0YVN0cnVjdHVyZXMgLSBpZ25vcmluZyBDSURUb0dJRE1hcCBkYXRhOiAiJHtlfSIuYCl9fWNvbnN0IGg9W107bGV0IHUsZD1udWxsO2lmKGUuaGFzKCJFbmNvZGluZyIpKXt1PWUuZ2V0KCJFbmNvZGluZyIpO2lmKHUgaW5zdGFuY2VvZiBpLkRpY3Qpe2Q9dS5nZXQoIkJhc2VFbmNvZGluZyIpO2Q9ZCBpbnN0YW5jZW9mIGkuTmFtZT9kLm5hbWU6bnVsbDtpZih1LmhhcygiRGlmZmVyZW5jZXMiKSl7Y29uc3QgZT11LmdldCgiRGlmZmVyZW5jZXMiKTtsZXQgdD0wO2Zvcihjb25zdCBhIG9mIGUpe2NvbnN0IGU9bi5mZXRjaElmUmVmKGEpO2lmKCJudW1iZXIiPT10eXBlb2YgZSl0PWU7ZWxzZXtpZighKGUgaW5zdGFuY2VvZiBpLk5hbWUpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluICdEaWZmZXJlbmNlcycgYXJyYXk6ICR7ZX1gKTtoW3QrK109ZS5uYW1lfX19fWVsc2UgaWYodSBpbnN0YW5jZW9mIGkuTmFtZSlkPXUubmFtZTtlbHNle2NvbnN0IGU9IkVuY29kaW5nIGlzIG5vdCBhIE5hbWUgbm9yIGEgRGljdCI7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoZSk7KDAsci53YXJuKShlKX0iTWFjUm9tYW5FbmNvZGluZyIhPT1kJiYiTWFjRXhwZXJ0RW5jb2RpbmciIT09ZCYmIldpbkFuc2lFbmNvZGluZyIhPT1kJiYoZD1udWxsKX1jb25zdCBmPSFhLmZpbGV8fGEuaXNJbnRlcm5hbEZvbnQsZz0oMCxjLmdldFN5bWJvbHNGb250cykoKVthLm5hbWVdO2QmJmYmJmcmJihkPW51bGwpO2lmKGQpYS5kZWZhdWx0RW5jb2Rpbmc9KDAsby5nZXRFbmNvZGluZykoZCk7ZWxzZXtjb25zdCBlPSEhKGEuZmxhZ3MmUy5Gb250RmxhZ3MuU3ltYm9saWMpLHQ9ISEoYS5mbGFncyZTLkZvbnRGbGFncy5Ob25zeW1ib2xpYyk7dT1vLlN0YW5kYXJkRW5jb2Rpbmc7IlRydWVUeXBlIiE9PWEudHlwZXx8dHx8KHU9by5XaW5BbnNpRW5jb2RpbmcpO2lmKGV8fGcpe3U9by5NYWNSb21hbkVuY29kaW5nO2YmJigvU3ltYm9sL2kudGVzdChhLm5hbWUpP3U9by5TeW1ib2xTZXRFbmNvZGluZzovRGluZ2JhdHMvaS50ZXN0KGEubmFtZSk/dT1vLlphcGZEaW5nYmF0c0VuY29kaW5nOi9XaW5nZGluZ3MvaS50ZXN0KGEubmFtZSkmJih1PW8uV2luQW5zaUVuY29kaW5nKSl9YS5kZWZhdWx0RW5jb2Rpbmc9dX1hLmRpZmZlcmVuY2VzPWg7YS5iYXNlRW5jb2RpbmdOYW1lPWQ7YS5oYXNFbmNvZGluZz0hIWR8fGgubGVuZ3RoPjA7YS5kaWN0PWU7cmV0dXJuIGwudGhlbigoZT0+e2EudG9Vbmljb2RlPWU7cmV0dXJuIHRoaXMuYnVpbGRUb1VuaWNvZGUoYSl9KSkudGhlbigoZT0+e2EudG9Vbmljb2RlPWU7cyYmKGEuY2lkVG9HaWRNYXA9dGhpcy5yZWFkQ2lkVG9HaWRNYXAocyxlKSk7cmV0dXJuIGF9KSl9X3NpbXBsZUZvbnRUb1VuaWNvZGUoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTsoMCxyLmFzc2VydCkoIWUuY29tcG9zaXRlLCJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7Y29uc3QgYT1bXSxuPWUuZGVmYXVsdEVuY29kaW5nLnNsaWNlKCksaT1lLmJhc2VFbmNvZGluZ05hbWUscz1lLmRpZmZlcmVuY2VzO2Zvcihjb25zdCBlIGluIHMpe2NvbnN0IHQ9c1tlXTsiLm5vdGRlZiIhPT10JiYobltlXT10KX1jb25zdCBjPSgwLEMuZ2V0R2x5cGhzVW5pY29kZSkoKTtmb3IoY29uc3QgciBpbiBuKXtsZXQgcz1uW3JdO2lmKCIiPT09cyljb250aW51ZTtsZXQgbD1jW3NdO2lmKHZvaWQgMCE9PWwpe2Fbcl09U3RyaW5nLmZyb21DaGFyQ29kZShsKTtjb250aW51ZX1sZXQgaD0wO3N3aXRjaChzWzBdKXtjYXNlIkciOjM9PT1zLmxlbmd0aCYmKGg9cGFyc2VJbnQocy5zdWJzdHJpbmcoMSksMTYpKTticmVhaztjYXNlImciOjU9PT1zLmxlbmd0aCYmKGg9cGFyc2VJbnQocy5zdWJzdHJpbmcoMSksMTYpKTticmVhaztjYXNlIkMiOmNhc2UiYyI6aWYocy5sZW5ndGg+PTMmJnMubGVuZ3RoPD00KXtjb25zdCBhPXMuc3Vic3RyaW5nKDEpO2lmKHQpe2g9cGFyc2VJbnQoYSwxNik7YnJlYWt9aD0rYTtpZihOdW1iZXIuaXNOYU4oaCkmJk51bWJlci5pc0ludGVnZXIocGFyc2VJbnQoYSwxNikpKXJldHVybiB0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKGUsITApfWJyZWFrO2Nhc2UidSI6bD0oMCxPLmdldFVuaWNvZGVGb3JHbHlwaCkocyxjKTstMSE9PWwmJihoPWwpO2JyZWFrO2RlZmF1bHQ6c3dpdGNoKHMpe2Nhc2UiZl9oIjpjYXNlImZfdCI6Y2FzZSJUX2giOmFbcl09cy5yZXBsYWNlQWxsKCJfIiwiIik7Y29udGludWV9fWlmKGg+MCYmaDw9MTExNDExMSYmTnVtYmVyLmlzSW50ZWdlcihoKSl7aWYoaSYmaD09PStyKXtjb25zdCBlPSgwLG8uZ2V0RW5jb2RpbmcpKGkpO2lmKGUmJihzPWVbcl0pKXthW3JdPVN0cmluZy5mcm9tQ2hhckNvZGUoY1tzXSk7Y29udGludWV9fWFbcl09U3RyaW5nLmZyb21Db2RlUG9pbnQoaCl9fXJldHVybiBhfWFzeW5jIGJ1aWxkVG9Vbmljb2RlKGUpe2UuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXA9ZS50b1VuaWNvZGU/Lmxlbmd0aD4wO2lmKGUuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApeyFlLmNvbXBvc2l0ZSYmZS5oYXNFbmNvZGluZyYmKGUuZmFsbGJhY2tUb1VuaWNvZGU9dGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShlKSk7cmV0dXJuIGUudG9Vbmljb2RlfWlmKCFlLmNvbXBvc2l0ZSlyZXR1cm4gbmV3IHUuVG9Vbmljb2RlTWFwKHRoaXMuX3NpbXBsZUZvbnRUb1VuaWNvZGUoZSkpO2lmKGUuY29tcG9zaXRlJiYoZS5jTWFwLmJ1aWx0SW5DTWFwJiYhKGUuY01hcCBpbnN0YW5jZW9mIG4uSWRlbnRpdHlDTWFwKXx8IkFkb2JlIj09PWUuY2lkU3lzdGVtSW5mby5yZWdpc3RyeSYmKCJHQjEiPT09ZS5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nfHwiQ05TMSI9PT1lLmNpZFN5c3RlbUluZm8ub3JkZXJpbmd8fCJKYXBhbjEiPT09ZS5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nfHwiS29yZWExIj09PWUuY2lkU3lzdGVtSW5mby5vcmRlcmluZykpKXtjb25zdHtyZWdpc3RyeTp0LG9yZGVyaW5nOmF9PWUuY2lkU3lzdGVtSW5mbyxzPWkuTmFtZS5nZXQoYCR7dH0tJHthfS1VQ1MyYCksbz1hd2FpdCBuLkNNYXBGYWN0b3J5LmNyZWF0ZSh7ZW5jb2Rpbmc6cyxmZXRjaEJ1aWx0SW5DTWFwOnRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCx1c2VDTWFwOm51bGx9KSxjPVtdLGw9W107ZS5jTWFwLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7aWYodD42NTUzNSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpO2NvbnN0IGE9by5sb29rdXAodCk7aWYoYSl7bC5sZW5ndGg9MDtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKz0yKWwucHVzaCgoYS5jaGFyQ29kZUF0KGUpPDw4KSthLmNoYXJDb2RlQXQoZSsxKSk7Y1tlXT1TdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmwpfX0pKTtyZXR1cm4gbmV3IHUuVG9Vbmljb2RlTWFwKGMpfXJldHVybiBuZXcgdS5JZGVudGl0eVRvVW5pY29kZU1hcChlLmZpcnN0Q2hhcixlLmxhc3RDaGFyKX1yZWFkVG9Vbmljb2RlKGUpe3JldHVybiBlP2UgaW5zdGFuY2VvZiBpLk5hbWU/bi5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOmUsZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBuLklkZW50aXR5Q01hcD9uZXcgdS5JZGVudGl0eVRvVW5pY29kZU1hcCgwLDY1NTM1KTpuZXcgdS5Ub1VuaWNvZGVNYXAoZS5nZXRNYXAoKSl9KSk6ZSBpbnN0YW5jZW9mIG0uQmFzZVN0cmVhbT9uLkNNYXBGYWN0b3J5LmNyZWF0ZSh7ZW5jb2Rpbmc6ZSxmZXRjaEJ1aWx0SW5DTWFwOnRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCx1c2VDTWFwOm51bGx9KS50aGVuKChmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2Ygbi5JZGVudGl0eUNNYXApcmV0dXJuIG5ldyB1LklkZW50aXR5VG9Vbmljb2RlTWFwKDAsNjU1MzUpO2NvbnN0IHQ9bmV3IEFycmF5KGUubGVuZ3RoKTtlLmZvckVhY2goKGZ1bmN0aW9uKGUsYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXt0W2VdPVN0cmluZy5mcm9tQ29kZVBvaW50KGEpO3JldHVybn1jb25zdCByPVtdO2ZvcihsZXQgZT0wO2U8YS5sZW5ndGg7ZSs9Mil7Y29uc3QgdD1hLmNoYXJDb2RlQXQoZSk8PDh8YS5jaGFyQ29kZUF0KGUrMSk7aWYoNTUyOTYhPSg2MzQ4OCZ0KSl7ci5wdXNoKHQpO2NvbnRpbnVlfWUrPTI7Y29uc3Qgbj1hLmNoYXJDb2RlQXQoZSk8PDh8YS5jaGFyQ29kZUF0KGUrMSk7ci5wdXNoKCgoMTAyMyZ0KTw8MTApKygxMDIzJm4pKzY1NTM2KX10W2VdPVN0cmluZy5mcm9tQ29kZVBvaW50KC4uLnIpfSkpO3JldHVybiBuZXcgdS5Ub1VuaWNvZGVNYXAodCl9KSwoZT0+e2lmKGUgaW5zdGFuY2VvZiByLkFib3J0RXhjZXB0aW9uKXJldHVybiBudWxsO2lmKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpeygwLHIud2FybikoYHJlYWRUb1VuaWNvZGUgLSBpZ25vcmluZyBUb1VuaWNvZGUgZGF0YTogIiR7ZX0iLmApO3JldHVybiBudWxsfXRocm93IGV9KSk6UHJvbWlzZS5yZXNvbHZlKG51bGwpOlByb21pc2UucmVzb2x2ZShudWxsKX1yZWFkQ2lkVG9HaWRNYXAoZSx0KXtjb25zdCBhPVtdO2ZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7Y29uc3Qgbj1lW3IrK108PDh8ZVtyXSxpPXI+PjE7KDAhPT1ufHx0LmhhcyhpKSkmJihhW2ldPW4pfXJldHVybiBhfWV4dHJhY3RXaWR0aHMoZSx0LGEpe2NvbnN0IHI9dGhpcy54cmVmO2xldCBuPVtdLHM9MDtjb25zdCBvPVtdO2xldCBjLGwsaCx1LGQsZixnLHA7aWYoYS5jb21wb3NpdGUpe3M9ZS5oYXMoIkRXIik/ZS5nZXQoIkRXIik6MWUzO3A9ZS5nZXQoIlciKTtpZihwKWZvcihsPTAsaD1wLmxlbmd0aDtsPGg7bCsrKXtmPXIuZmV0Y2hJZlJlZihwW2wrK10pO2c9ci5mZXRjaElmUmVmKHBbbF0pO2lmKEFycmF5LmlzQXJyYXkoZykpZm9yKHU9MCxkPWcubGVuZ3RoO3U8ZDt1KyspbltmKytdPXIuZmV0Y2hJZlJlZihnW3VdKTtlbHNle2NvbnN0IGU9ci5mZXRjaElmUmVmKHBbKytsXSk7Zm9yKHU9Zjt1PD1nO3UrKyluW3VdPWV9fWlmKGEudmVydGljYWwpe2xldCB0PWUuZ2V0QXJyYXkoIkRXMiIpfHxbODgwLC0xZTNdO2M9W3RbMV0sLjUqcyx0WzBdXTt0PWUuZ2V0KCJXMiIpO2lmKHQpZm9yKGw9MCxoPXQubGVuZ3RoO2w8aDtsKyspe2Y9ci5mZXRjaElmUmVmKHRbbCsrXSk7Zz1yLmZldGNoSWZSZWYodFtsXSk7aWYoQXJyYXkuaXNBcnJheShnKSlmb3IodT0wLGQ9Zy5sZW5ndGg7dTxkO3UrKylvW2YrK109W3IuZmV0Y2hJZlJlZihnW3UrK10pLHIuZmV0Y2hJZlJlZihnW3UrK10pLHIuZmV0Y2hJZlJlZihnW3VdKV07ZWxzZXtjb25zdCBlPVtyLmZldGNoSWZSZWYodFsrK2xdKSxyLmZldGNoSWZSZWYodFsrK2xdKSxyLmZldGNoSWZSZWYodFsrK2xdKV07Zm9yKHU9Zjt1PD1nO3UrKylvW3VdPWV9fX19ZWxzZXtjb25zdCBvPWEuZmlyc3RDaGFyO3A9ZS5nZXQoIldpZHRocyIpO2lmKHApe3U9bztmb3IobD0wLGg9cC5sZW5ndGg7bDxoO2wrKyluW3UrK109ci5mZXRjaElmUmVmKHBbbF0pO3M9cGFyc2VGbG9hdCh0LmdldCgiTWlzc2luZ1dpZHRoIikpfHwwfWVsc2V7Y29uc3QgdD1lLmdldCgiQmFzZUZvbnQiKTtpZih0IGluc3RhbmNlb2YgaS5OYW1lKXtjb25zdCBlPXRoaXMuZ2V0QmFzZUZvbnRNZXRyaWNzKHQubmFtZSk7bj10aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKGUud2lkdGhzLGEpO3M9ZS5kZWZhdWx0V2lkdGh9fX1sZXQgbT0hMCxiPXM7Zm9yKGNvbnN0IGUgaW4gbil7Y29uc3QgdD1uW2VdO2lmKHQpaWYoYil7aWYoYiE9PXQpe209ITE7YnJlYWt9fWVsc2UgYj10fW0/YS5mbGFnc3w9Uy5Gb250RmxhZ3MuRml4ZWRQaXRjaDphLmZsYWdzJj1+Uy5Gb250RmxhZ3MuRml4ZWRQaXRjaDthLmRlZmF1bHRXaWR0aD1zO2Eud2lkdGhzPW47YS5kZWZhdWx0Vk1ldHJpY3M9YzthLnZtZXRyaWNzPW99aXNTZXJpZkZvbnQoZSl7Y29uc3QgdD1lLnNwbGl0KCItIilbMF07cmV0dXJuIHQgaW4oMCxjLmdldFNlcmlmRm9udHMpKCl8fC9zZXJpZi9naS50ZXN0KHQpfWdldEJhc2VGb250TWV0cmljcyhlKXtsZXQgdD0wLGE9T2JqZWN0LmNyZWF0ZShudWxsKSxyPSExO2xldCBuPSgwLGMuZ2V0U3RkRm9udE1hcCkoKVtlXXx8ZTtjb25zdCBpPSgwLGsuZ2V0TWV0cmljcykoKTtuIGluIGl8fChuPXRoaXMuaXNTZXJpZkZvbnQoZSk/IlRpbWVzLVJvbWFuIjoiSGVsdmV0aWNhIik7Y29uc3Qgcz1pW25dO2lmKCJudW1iZXIiPT10eXBlb2Ygcyl7dD1zO3I9ITB9ZWxzZSBhPXMoKTtyZXR1cm57ZGVmYXVsdFdpZHRoOnQsbW9ub3NwYWNlOnIsd2lkdGhzOmF9fWJ1aWxkQ2hhckNvZGVUb1dpZHRoKGUsdCl7Y29uc3QgYT1PYmplY3QuY3JlYXRlKG51bGwpLHI9dC5kaWZmZXJlbmNlcyxuPXQuZGVmYXVsdEVuY29kaW5nO2ZvcihsZXQgdD0wO3Q8MjU2O3QrKyl0IGluIHImJmVbclt0XV0/YVt0XT1lW3JbdF1dOnQgaW4gbiYmZVtuW3RdXSYmKGFbdF09ZVtuW3RdXSk7cmV0dXJuIGF9cHJlRXZhbHVhdGVGb250KGUpe2NvbnN0IHQ9ZTtsZXQgYT1lLmdldCgiU3VidHlwZSIpO2lmKCEoYSBpbnN0YW5jZW9mIGkuTmFtZSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBTdWJ0eXBlIik7bGV0IG4scyxvPSExO2lmKCJUeXBlMCI9PT1hLm5hbWUpe2NvbnN0IHQ9ZS5nZXQoIkRlc2NlbmRhbnRGb250cyIpO2lmKCF0KXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJEZXNjZW5kYW50IGZvbnRzIGFyZSBub3Qgc3BlY2lmaWVkIik7aWYoISgoZT1BcnJheS5pc0FycmF5KHQpP3RoaXMueHJlZi5mZXRjaElmUmVmKHRbMF0pOnQpaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJEZXNjZW5kYW50IGZvbnQgaXMgbm90IGEgZGljdGlvbmFyeS4iKTthPWUuZ2V0KCJTdWJ0eXBlIik7aWYoIShhIGluc3RhbmNlb2YgaS5OYW1lKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiaW52YWxpZCBmb250IFN1YnR5cGUiKTtvPSEwfWNvbnN0IGM9ZS5nZXQoIkZpcnN0Q2hhciIpfHwwLGw9ZS5nZXQoIkxhc3RDaGFyIil8fChvPzY1NTM1OjI1NSksaD1lLmdldCgiRm9udERlc2NyaXB0b3IiKTtpZihoKXtuPW5ldyBNLk11cm11ckhhc2gzXzY0O2NvbnN0IGE9dC5nZXRSYXcoIkVuY29kaW5nIik7aWYoYSBpbnN0YW5jZW9mIGkuTmFtZSluLnVwZGF0ZShhLm5hbWUpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIGkuUmVmKW4udXBkYXRlKGEudG9TdHJpbmcoKSk7ZWxzZSBpZihhIGluc3RhbmNlb2YgaS5EaWN0KWZvcihjb25zdCBlIG9mIGEuZ2V0UmF3VmFsdWVzKCkpaWYoZSBpbnN0YW5jZW9mIGkuTmFtZSluLnVwZGF0ZShlLm5hbWUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGkuUmVmKW4udXBkYXRlKGUudG9TdHJpbmcoKSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCB0PWUubGVuZ3RoLGE9bmV3IEFycmF5KHQpO2ZvcihsZXQgcj0wO3I8dDtyKyspe2NvbnN0IHQ9ZVtyXTt0IGluc3RhbmNlb2YgaS5OYW1lP2Fbcl09dC5uYW1lOigibnVtYmVyIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBpLlJlZikmJihhW3JdPXQudG9TdHJpbmcoKSl9bi51cGRhdGUoYS5qb2luKCkpfW4udXBkYXRlKGAke2N9LSR7bH1gKTtzPWUuZ2V0KCJUb1VuaWNvZGUiKXx8dC5nZXQoIlRvVW5pY29kZSIpO2lmKHMgaW5zdGFuY2VvZiBtLkJhc2VTdHJlYW0pe2NvbnN0IGU9cy5zdHJ8fHMsdD1lLmJ1ZmZlcj9uZXcgVWludDhBcnJheShlLmJ1ZmZlci5idWZmZXIsMCxlLmJ1ZmZlckxlbmd0aCk6bmV3IFVpbnQ4QXJyYXkoZS5ieXRlcy5idWZmZXIsZS5zdGFydCxlLmVuZC1lLnN0YXJ0KTtuLnVwZGF0ZSh0KX1lbHNlIHMgaW5zdGFuY2VvZiBpLk5hbWUmJm4udXBkYXRlKHMubmFtZSk7Y29uc3Qgcj1lLmdldCgiV2lkdGhzIil8fHQuZ2V0KCJXaWR0aHMiKTtpZihBcnJheS5pc0FycmF5KHIpKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIHIpKCJudW1iZXIiPT10eXBlb2YgdHx8dCBpbnN0YW5jZW9mIGkuUmVmKSYmZS5wdXNoKHQudG9TdHJpbmcoKSk7bi51cGRhdGUoZS5qb2luKCkpfWlmKG8pe24udXBkYXRlKCJjb21wb3NpdGVGb250Iik7Y29uc3QgYT1lLmdldCgiVyIpfHx0LmdldCgiVyIpO2lmKEFycmF5LmlzQXJyYXkoYSkpe2NvbnN0IGU9W107Zm9yKGNvbnN0IHQgb2YgYSlpZigibnVtYmVyIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBpLlJlZillLnB1c2godC50b1N0cmluZygpKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGE9W107Zm9yKGNvbnN0IGUgb2YgdCkoIm51bWJlciI9PXR5cGVvZiBlfHxlIGluc3RhbmNlb2YgaS5SZWYpJiZhLnB1c2goZS50b1N0cmluZygpKTtlLnB1c2goYFske2Euam9pbigpfV1gKX1uLnVwZGF0ZShlLmpvaW4oKSl9Y29uc3Qgcj1lLmdldFJhdygiQ0lEVG9HSURNYXAiKXx8dC5nZXRSYXcoIkNJRFRvR0lETWFwIik7ciBpbnN0YW5jZW9mIGkuTmFtZT9uLnVwZGF0ZShyLm5hbWUpOnIgaW5zdGFuY2VvZiBpLlJlZj9uLnVwZGF0ZShyLnRvU3RyaW5nKCkpOnIgaW5zdGFuY2VvZiBtLkJhc2VTdHJlYW0mJm4udXBkYXRlKHIucGVla0J5dGVzKCkpfX1yZXR1cm57ZGVzY3JpcHRvcjpoLGRpY3Q6ZSxiYXNlRGljdDp0LGNvbXBvc2l0ZTpvLHR5cGU6YS5uYW1lLGZpcnN0Q2hhcjpjLGxhc3RDaGFyOmwsdG9Vbmljb2RlOnMsaGFzaDpuP24uaGV4ZGlnZXN0KCk6IiJ9fWFzeW5jIHRyYW5zbGF0ZUZvbnQoZSl7bGV0e2Rlc2NyaXB0b3I6dCxkaWN0OmEsYmFzZURpY3Q6byxjb21wb3NpdGU6bCx0eXBlOnUsZmlyc3RDaGFyOmQsbGFzdENoYXI6Zix0b1VuaWNvZGU6Zyxjc3NGb250SW5mbzptfT1lO2NvbnN0IGI9IlR5cGUzIj09PXU7bGV0IHk7aWYoIXQpe2lmKCFiKXtsZXQgZT1hLmdldCgiQmFzZUZvbnQiKTtpZighKGUgaW5zdGFuY2VvZiBpLk5hbWUpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJCYXNlIGZvbnQgaXMgbm90IHNwZWNpZmllZCIpO2U9ZS5uYW1lLnJlcGxhY2VBbGwoL1ssX10vZywiLSIpO2NvbnN0IHQ9dGhpcy5nZXRCYXNlRm9udE1ldHJpY3MoZSksbj1lLnNwbGl0KCItIilbMF0sbD0odGhpcy5pc1NlcmlmRm9udChuKT9TLkZvbnRGbGFncy5TZXJpZjowKXwodC5tb25vc3BhY2U/Uy5Gb250RmxhZ3MuRml4ZWRQaXRjaDowKXwoKDAsYy5nZXRTeW1ib2xzRm9udHMpKClbbl0/Uy5Gb250RmxhZ3MuU3ltYm9saWM6Uy5Gb250RmxhZ3MuTm9uc3ltYm9saWMpO3k9e3R5cGU6dSxuYW1lOmUsbG9hZGVkTmFtZTpvLmxvYWRlZE5hbWUsc3lzdGVtRm9udEluZm86bnVsbCx3aWR0aHM6dC53aWR0aHMsZGVmYXVsdFdpZHRoOnQuZGVmYXVsdFdpZHRoLGlzU2ltdWxhdGVkRmxhZ3M6ITAsZmxhZ3M6bCxmaXJzdENoYXI6ZCxsYXN0Q2hhcjpmLHRvVW5pY29kZTpnLHhIZWlnaHQ6MCxjYXBIZWlnaHQ6MCxpdGFsaWNBbmdsZTowLGlzVHlwZTNGb250OmJ9O2NvbnN0IGg9YS5nZXQoIldpZHRocyIpLHA9KDAsYy5nZXRTdGFuZGFyZEZvbnROYW1lKShlKTtsZXQgbT1udWxsO2lmKHApe209YXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEocCk7eS5pc0ludGVybmFsRm9udD0hIW19IXkuaXNJbnRlcm5hbEZvbnQmJnRoaXMub3B0aW9ucy51c2VTeXN0ZW1Gb250cyYmKHkuc3lzdGVtRm9udEluZm89KDAseC5nZXRGb250U3Vic3RpdHV0aW9uKSh0aGlzLnN5c3RlbUZvbnRDYWNoZSx0aGlzLmlkRmFjdG9yeSx0aGlzLm9wdGlvbnMuc3RhbmRhcmRGb250RGF0YVVybCxlLHApKTtyZXR1cm4gdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoYSxhLHkpLnRoZW4oKGE9PntpZihoKXtjb25zdCBlPVtdO2xldCB0PWQ7Zm9yKGNvbnN0IGEgb2YgaCllW3QrK109dGhpcy54cmVmLmZldGNoSWZSZWYoYSk7YS53aWR0aHM9ZX1lbHNlIGEud2lkdGhzPXRoaXMuYnVpbGRDaGFyQ29kZVRvV2lkdGgodC53aWR0aHMsYSk7cmV0dXJuIG5ldyBzLkZvbnQoZSxtLGEpfSkpfXQ9bmV3IGkuRGljdChudWxsKTt0LnNldCgiRm9udE5hbWUiLGkuTmFtZS5nZXQodSkpO3Quc2V0KCJGb250QkJveCIsYS5nZXRBcnJheSgiRm9udEJCb3giKXx8WzAsMCwwLDBdKX1sZXQgdz10LmdldCgiRm9udE5hbWUiKSxDPWEuZ2V0KCJCYXNlRm9udCIpOyJzdHJpbmciPT10eXBlb2YgdyYmKHc9aS5OYW1lLmdldCh3KSk7InN0cmluZyI9PXR5cGVvZiBDJiYoQz1pLk5hbWUuZ2V0KEMpKTtjb25zdCB2PXc/Lm5hbWUsaz1DPy5uYW1lO2lmKCFiJiZ2IT09ayl7KDAsci5pbmZvKShgVGhlIEZvbnREZXNjcmlwdG9yJ3MgRm9udE5hbWUgaXMgIiR7dn0iIGJ1dCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIEZvbnQncyBCYXNlRm9udCAiJHtrfSIuYCk7diYmayYmKGsuc3RhcnRzV2l0aCh2KXx8ISgwLGMuaXNLbm93bkZvbnROYW1lKSh2KSYmKDAsYy5pc0tub3duRm9udE5hbWUpKGspKSYmKHc9bnVsbCl9d3x8PUM7aWYoISh3IGluc3RhbmNlb2YgaS5OYW1lKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiaW52YWxpZCBmb250IG5hbWUiKTtsZXQgTyxULE0sRSxEO3RyeXtPPXQuZ2V0KCJGb250RmlsZSIsIkZvbnRGaWxlMiIsIkZvbnRGaWxlMyIpfWNhdGNoKGUpe2lmKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7KDAsci53YXJuKShgdHJhbnNsYXRlRm9udCAtIGZldGNoaW5nICIke3cubmFtZX0iIGZvbnQgZmlsZTogIiR7ZX0iLmApO089bmV3IHAuTnVsbFN0cmVhbX1sZXQgTj0hMSxSPW51bGwsTD1udWxsO2lmKE8pe2lmKE8uZGljdCl7Y29uc3QgZT1PLmRpY3QuZ2V0KCJTdWJ0eXBlIik7ZSBpbnN0YW5jZW9mIGkuTmFtZSYmKFQ9ZS5uYW1lKTtNPU8uZGljdC5nZXQoIkxlbmd0aDEiKTtFPU8uZGljdC5nZXQoIkxlbmd0aDIiKTtEPU8uZGljdC5nZXQoIkxlbmd0aDMiKX19ZWxzZSBpZihtKXtjb25zdCBlPSgwLGguZ2V0WGZhRm9udE5hbWUpKHcubmFtZSk7aWYoZSl7bS5mb250RmFtaWx5PWAke20uZm9udEZhbWlseX0tUGRmSlMtWEZBYDttLm1ldHJpY3M9ZS5tZXRyaWNzfHxudWxsO1I9ZS5mYWN0b3JzfHxudWxsO089YXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoZS5uYW1lKTtOPSEhTztvPWE9KDAsaC5nZXRYZmFGb250RGljdCkody5uYW1lKTtsPSEwfX1lbHNlIGlmKCFiKXtjb25zdCBlPSgwLGMuZ2V0U3RhbmRhcmRGb250TmFtZSkody5uYW1lKTtpZihlKXtPPWF3YWl0IHRoaXMuZmV0Y2hTdGFuZGFyZEZvbnREYXRhKGUpO049ISFPfSFOJiZ0aGlzLm9wdGlvbnMudXNlU3lzdGVtRm9udHMmJihMPSgwLHguZ2V0Rm9udFN1YnN0aXR1dGlvbikodGhpcy5zeXN0ZW1Gb250Q2FjaGUsdGhpcy5pZEZhY3RvcnksdGhpcy5vcHRpb25zLnN0YW5kYXJkRm9udERhdGFVcmwsdy5uYW1lLGUpKX15PXt0eXBlOnUsbmFtZTp3Lm5hbWUsc3VidHlwZTpULGZpbGU6TyxsZW5ndGgxOk0sbGVuZ3RoMjpFLGxlbmd0aDM6RCxpc0ludGVybmFsRm9udDpOLGxvYWRlZE5hbWU6by5sb2FkZWROYW1lLGNvbXBvc2l0ZTpsLGZpeGVkUGl0Y2g6ITEsZm9udE1hdHJpeDphLmdldEFycmF5KCJGb250TWF0cml4Iil8fHIuRk9OVF9JREVOVElUWV9NQVRSSVgsZmlyc3RDaGFyOmQsbGFzdENoYXI6Zix0b1VuaWNvZGU6ZyxiYm94OnQuZ2V0QXJyYXkoIkZvbnRCQm94Iil8fGEuZ2V0QXJyYXkoIkZvbnRCQm94IiksYXNjZW50OnQuZ2V0KCJBc2NlbnQiKSxkZXNjZW50OnQuZ2V0KCJEZXNjZW50IikseEhlaWdodDp0LmdldCgiWEhlaWdodCIpfHwwLGNhcEhlaWdodDp0LmdldCgiQ2FwSGVpZ2h0Iil8fDAsZmxhZ3M6dC5nZXQoIkZsYWdzIiksaXRhbGljQW5nbGU6dC5nZXQoIkl0YWxpY0FuZ2xlIil8fDAsaXNUeXBlM0ZvbnQ6Yixjc3NGb250SW5mbzptLHNjYWxlRmFjdG9yczpSLHN5c3RlbUZvbnRJbmZvOkx9O2lmKGwpe2NvbnN0IGU9by5nZXQoIkVuY29kaW5nIik7ZSBpbnN0YW5jZW9mIGkuTmFtZSYmKHkuY2lkRW5jb2Rpbmc9ZS5uYW1lKTtjb25zdCB0PWF3YWl0IG4uQ01hcEZhY3RvcnkuY3JlYXRlKHtlbmNvZGluZzplLGZldGNoQnVpbHRJbkNNYXA6dGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLHVzZUNNYXA6bnVsbH0pO3kuY01hcD10O3kudmVydGljYWw9eS5jTWFwLnZlcnRpY2FsfXJldHVybiB0aGlzLmV4dHJhY3REYXRhU3RydWN0dXJlcyhhLG8seSkudGhlbigoZT0+e3RoaXMuZXh0cmFjdFdpZHRocyhhLHQsZSk7cmV0dXJuIG5ldyBzLkZvbnQody5uYW1lLE8sZSl9KSl9c3RhdGljIGJ1aWxkRm9udFBhdGhzKGUsdCxhLG4pe2Z1bmN0aW9uIGJ1aWxkUGF0aCh0KXtjb25zdCBpPWAke2UubG9hZGVkTmFtZX1fcGF0aF8ke3R9YDt0cnl7aWYoZS5yZW5kZXJlci5oYXNCdWlsdFBhdGgodCkpcmV0dXJuO2Euc2VuZCgiY29tbW9ub2JqIixbaSwiRm9udFBhdGgiLGUucmVuZGVyZXIuZ2V0UGF0aEpzKHQpXSl9Y2F0Y2goZSl7aWYobi5pZ25vcmVFcnJvcnMpeygwLHIud2FybikoYGJ1aWxkRm9udFBhdGhzIC0gaWdub3JpbmcgJHtpfSBnbHlwaDogIiR7ZX0iLmApO3JldHVybn10aHJvdyBlfX1mb3IoY29uc3QgZSBvZiB0KXtidWlsZFBhdGgoZS5mb250Q2hhcik7Y29uc3QgdD1lLmFjY2VudDt0Py5mb250Q2hhciYmYnVpbGRQYXRoKHQuZm9udENoYXIpfX1zdGF0aWMgZ2V0IGZhbGxiYWNrRm9udERpY3QoKXtjb25zdCBlPW5ldyBpLkRpY3Q7ZS5zZXQoIkJhc2VGb250IixpLk5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSk7ZS5zZXQoIlR5cGUiLGkuTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTtlLnNldCgiU3VidHlwZSIsaS5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpO2Uuc2V0KCJFbmNvZGluZyIsaS5OYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpO3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJmYWxsYmFja0ZvbnREaWN0IixlKX19dC5QYXJ0aWFsRXZhbHVhdG9yPVBhcnRpYWxFdmFsdWF0b3I7Y2xhc3MgVHJhbnNsYXRlZEZvbnR7Y29uc3RydWN0b3IoZSl7bGV0e2xvYWRlZE5hbWU6dCxmb250OmEsZGljdDpyLGV2YWx1YXRvck9wdGlvbnM6bn09ZTt0aGlzLmxvYWRlZE5hbWU9dDt0aGlzLmZvbnQ9YTt0aGlzLmRpY3Q9cjt0aGlzLl9ldmFsdWF0b3JPcHRpb25zPW58fE47dGhpcy50eXBlM0xvYWRlZD1udWxsO3RoaXMudHlwZTNEZXBlbmRlbmNpZXM9YS5pc1R5cGUzRm9udD9uZXcgU2V0Om51bGw7dGhpcy5zZW50PSExfXNlbmQoZSl7aWYoIXRoaXMuc2VudCl7dGhpcy5zZW50PSEwO2Uuc2VuZCgiY29tbW9ub2JqIixbdGhpcy5sb2FkZWROYW1lLCJGb250Iix0aGlzLmZvbnQuZXhwb3J0RGF0YSh0aGlzLl9ldmFsdWF0b3JPcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMpXSl9fWZhbGxiYWNrKGUpe2lmKHRoaXMuZm9udC5kYXRhKXt0aGlzLmZvbnQuZGlzYWJsZUZvbnRGYWNlPSEwO1BhcnRpYWxFdmFsdWF0b3IuYnVpbGRGb250UGF0aHModGhpcy5mb250LHRoaXMuZm9udC5nbHlwaENhY2hlVmFsdWVzLGUsdGhpcy5fZXZhbHVhdG9yT3B0aW9ucyl9fWxvYWRUeXBlM0RhdGEoZSx0LGEpe2lmKHRoaXMudHlwZTNMb2FkZWQpcmV0dXJuIHRoaXMudHlwZTNMb2FkZWQ7aWYoIXRoaXMuZm9udC5pc1R5cGUzRm9udCl0aHJvdyBuZXcgRXJyb3IoIk11c3QgYmUgYSBUeXBlMyBmb250LiIpO2NvbnN0IG49ZS5jbG9uZSh7aWdub3JlRXJyb3JzOiExfSk7bi5wYXJzaW5nVHlwZTNGb250PSEwO2NvbnN0IHM9bmV3IGkuUmVmU2V0KGUudHlwZTNGb250UmVmcyk7dGhpcy5kaWN0Lm9iaklkJiYhcy5oYXModGhpcy5kaWN0Lm9iaklkKSYmcy5wdXQodGhpcy5kaWN0Lm9iaklkKTtuLnR5cGUzRm9udFJlZnM9cztjb25zdCBvPXRoaXMuZm9udCxjPXRoaXMudHlwZTNEZXBlbmRlbmNpZXM7bGV0IGw9UHJvbWlzZS5yZXNvbHZlKCk7Y29uc3QgaD10aGlzLmRpY3QuZ2V0KCJDaGFyUHJvY3MiKSx1PXRoaXMuZGljdC5nZXQoIlJlc291cmNlcyIpfHx0LGQ9T2JqZWN0LmNyZWF0ZShudWxsKSxmPXIuVXRpbC5ub3JtYWxpemVSZWN0KG8uYmJveHx8WzAsMCwwLDBdKSxnPWZbMl0tZlswXSxwPWZbM10tZlsxXSxtPU1hdGguaHlwb3QoZyxwKTtmb3IoY29uc3QgZSBvZiBoLmdldEtleXMoKSlsPWwudGhlbigoKCk9Pntjb25zdCB0PWguZ2V0KGUpLGk9bmV3IEUuT3BlcmF0b3JMaXN0O3JldHVybiBuLmdldE9wZXJhdG9yTGlzdCh7c3RyZWFtOnQsdGFzazphLHJlc291cmNlczp1LG9wZXJhdG9yTGlzdDppfSkudGhlbigoKCk9PntpLmZuQXJyYXlbMF09PT1yLk9QUy5zZXRDaGFyV2lkdGhBbmRCb3VuZHMmJnRoaXMuX3JlbW92ZVR5cGUzQ29sb3JPcGVyYXRvcnMoaSxtKTtkW2VdPWkuZ2V0SVIoKTtmb3IoY29uc3QgZSBvZiBpLmRlcGVuZGVuY2llcyljLmFkZChlKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7KDAsci53YXJuKShgVHlwZTMgZm9udCByZXNvdXJjZSAiJHtlfSIgaXMgbm90IGF2YWlsYWJsZS5gKTtjb25zdCBhPW5ldyBFLk9wZXJhdG9yTGlzdDtkW2VdPWEuZ2V0SVIoKX0pKX0pKTt0aGlzLnR5cGUzTG9hZGVkPWwudGhlbigoKCk9PntvLmNoYXJQcm9jT3BlcmF0b3JMaXN0PWQ7aWYodGhpcy5fYmJveCl7by5pc0NoYXJCQm94PSEwO28uYmJveD10aGlzLl9iYm94fX0pKTtyZXR1cm4gdGhpcy50eXBlM0xvYWRlZH1fcmVtb3ZlVHlwZTNDb2xvck9wZXJhdG9ycyhlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06TmFOO2NvbnN0IGE9ci5VdGlsLm5vcm1hbGl6ZVJlY3QoZS5hcmdzQXJyYXlbMF0uc2xpY2UoMikpLG49YVsyXS1hWzBdLGk9YVszXS1hWzFdLHM9TWF0aC5oeXBvdChuLGkpO2lmKDA9PT1ufHwwPT09aSl7ZS5mbkFycmF5LnNwbGljZSgwLDEpO2UuYXJnc0FycmF5LnNwbGljZSgwLDEpfWVsc2UgaWYoMD09PXR8fE1hdGgucm91bmQocy90KT49MTApe3RoaXMuX2Jib3h8fCh0aGlzLl9iYm94PVsxLzAsMS8wLC0xLzAsLTEvMF0pO3RoaXMuX2Jib3hbMF09TWF0aC5taW4odGhpcy5fYmJveFswXSxhWzBdKTt0aGlzLl9iYm94WzFdPU1hdGgubWluKHRoaXMuX2Jib3hbMV0sYVsxXSk7dGhpcy5fYmJveFsyXT1NYXRoLm1heCh0aGlzLl9iYm94WzJdLGFbMl0pO3RoaXMuX2Jib3hbM109TWF0aC5tYXgodGhpcy5fYmJveFszXSxhWzNdKX1sZXQgbz0wLGM9ZS5sZW5ndGg7Zm9yKDtvPGM7KXtzd2l0Y2goZS5mbkFycmF5W29dKXtjYXNlIHIuT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kczpicmVhaztjYXNlIHIuT1BTLnNldFN0cm9rZUNvbG9yU3BhY2U6Y2FzZSByLk9QUy5zZXRGaWxsQ29sb3JTcGFjZTpjYXNlIHIuT1BTLnNldFN0cm9rZUNvbG9yOmNhc2Ugci5PUFMuc2V0U3Ryb2tlQ29sb3JOOmNhc2Ugci5PUFMuc2V0RmlsbENvbG9yOmNhc2Ugci5PUFMuc2V0RmlsbENvbG9yTjpjYXNlIHIuT1BTLnNldFN0cm9rZUdyYXk6Y2FzZSByLk9QUy5zZXRGaWxsR3JheTpjYXNlIHIuT1BTLnNldFN0cm9rZVJHQkNvbG9yOmNhc2Ugci5PUFMuc2V0RmlsbFJHQkNvbG9yOmNhc2Ugci5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOmNhc2Ugci5PUFMuc2V0RmlsbENNWUtDb2xvcjpjYXNlIHIuT1BTLnNoYWRpbmdGaWxsOmNhc2Ugci5PUFMuc2V0UmVuZGVyaW5nSW50ZW50OmUuZm5BcnJheS5zcGxpY2UobywxKTtlLmFyZ3NBcnJheS5zcGxpY2UobywxKTtjLS07Y29udGludWU7Y2FzZSByLk9QUy5zZXRHU3RhdGU6Y29uc3RbdF09ZS5hcmdzQXJyYXlbb107bGV0IGE9MCxuPXQubGVuZ3RoO2Zvcig7YTxuOyl7Y29uc3RbZV09dFthXTtzd2l0Y2goZSl7Y2FzZSJUUiI6Y2FzZSJUUjIiOmNhc2UiSFQiOmNhc2UiQkciOmNhc2UiQkcyIjpjYXNlIlVDUiI6Y2FzZSJVQ1IyIjp0LnNwbGljZShhLDEpO24tLTtjb250aW51ZX1hKyt9fW8rK319fWNsYXNzIFN0YXRlTWFuYWdlcntjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpuZXcgRXZhbFN0YXRlO3RoaXMuc3RhdGU9ZTt0aGlzLnN0YXRlU3RhY2s9W119c2F2ZSgpe2NvbnN0IGU9dGhpcy5zdGF0ZTt0aGlzLnN0YXRlU3RhY2sucHVzaCh0aGlzLnN0YXRlKTt0aGlzLnN0YXRlPWUuY2xvbmUoKX1yZXN0b3JlKCl7Y29uc3QgZT10aGlzLnN0YXRlU3RhY2sucG9wKCk7ZSYmKHRoaXMuc3RhdGU9ZSl9dHJhbnNmb3JtKGUpe3RoaXMuc3RhdGUuY3RtPXIuVXRpbC50cmFuc2Zvcm0odGhpcy5zdGF0ZS5jdG0sZSl9fWNsYXNzIFRleHRTdGF0ZXtjb25zdHJ1Y3Rvcigpe3RoaXMuY3RtPW5ldyBGbG9hdDMyQXJyYXkoci5JREVOVElUWV9NQVRSSVgpO3RoaXMuZm9udE5hbWU9bnVsbDt0aGlzLmZvbnRTaXplPTA7dGhpcy5sb2FkZWROYW1lPW51bGw7dGhpcy5mb250PW51bGw7dGhpcy5mb250TWF0cml4PXIuRk9OVF9JREVOVElUWV9NQVRSSVg7dGhpcy50ZXh0TWF0cml4PXIuSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7dGhpcy50ZXh0TGluZU1hdHJpeD1yLklERU5USVRZX01BVFJJWC5zbGljZSgpO3RoaXMuY2hhclNwYWNpbmc9MDt0aGlzLndvcmRTcGFjaW5nPTA7dGhpcy5sZWFkaW5nPTA7dGhpcy50ZXh0SFNjYWxlPTE7dGhpcy50ZXh0UmlzZT0wfXNldFRleHRNYXRyaXgoZSx0LGEscixuLGkpe2NvbnN0IHM9dGhpcy50ZXh0TWF0cml4O3NbMF09ZTtzWzFdPXQ7c1syXT1hO3NbM109cjtzWzRdPW47c1s1XT1pfXNldFRleHRMaW5lTWF0cml4KGUsdCxhLHIsbixpKXtjb25zdCBzPXRoaXMudGV4dExpbmVNYXRyaXg7c1swXT1lO3NbMV09dDtzWzJdPWE7c1szXT1yO3NbNF09bjtzWzVdPWl9dHJhbnNsYXRlVGV4dE1hdHJpeChlLHQpe2NvbnN0IGE9dGhpcy50ZXh0TWF0cml4O2FbNF09YVswXSplK2FbMl0qdCthWzRdO2FbNV09YVsxXSplK2FbM10qdCthWzVdfXRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGUsdCl7Y29uc3QgYT10aGlzLnRleHRMaW5lTWF0cml4O2FbNF09YVswXSplK2FbMl0qdCthWzRdO2FbNV09YVsxXSplK2FbM10qdCthWzVdfWNhcnJpYWdlUmV0dXJuKCl7dGhpcy50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCgwLC10aGlzLmxlYWRpbmcpO3RoaXMudGV4dE1hdHJpeD10aGlzLnRleHRMaW5lTWF0cml4LnNsaWNlKCl9Y2xvbmUoKXtjb25zdCBlPU9iamVjdC5jcmVhdGUodGhpcyk7ZS50ZXh0TWF0cml4PXRoaXMudGV4dE1hdHJpeC5zbGljZSgpO2UudGV4dExpbmVNYXRyaXg9dGhpcy50ZXh0TGluZU1hdHJpeC5zbGljZSgpO2UuZm9udE1hdHJpeD10aGlzLmZvbnRNYXRyaXguc2xpY2UoKTtyZXR1cm4gZX19Y2xhc3MgRXZhbFN0YXRle2NvbnN0cnVjdG9yKCl7dGhpcy5jdG09bmV3IEZsb2F0MzJBcnJheShyLklERU5USVRZX01BVFJJWCk7dGhpcy5mb250PW51bGw7dGhpcy50ZXh0UmVuZGVyaW5nTW9kZT1yLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7dGhpcy5maWxsQ29sb3JTcGFjZT15LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5O3RoaXMuc3Ryb2tlQ29sb3JTcGFjZT15LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5fWNsb25lKCl7cmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyl9fWNsYXNzIEV2YWx1YXRvclByZXByb2Nlc3NvcntzdGF0aWMgZ2V0IG9wTWFwKCl7Y29uc3QgZT0oMCx2LmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uudz17aWQ6ci5PUFMuc2V0TGluZVdpZHRoLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuSj17aWQ6ci5PUFMuc2V0TGluZUNhcCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLmo9e2lkOnIuT1BTLnNldExpbmVKb2luLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuTT17aWQ6ci5PUFMuc2V0TWl0ZXJMaW1pdCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLmQ9e2lkOnIuT1BTLnNldERhc2gsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX07ZS5yaT17aWQ6ci5PUFMuc2V0UmVuZGVyaW5nSW50ZW50LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuaT17aWQ6ci5PUFMuc2V0RmxhdG5lc3MsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5ncz17aWQ6ci5PUFMuc2V0R1N0YXRlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UucT17aWQ6ci5PUFMuc2F2ZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLlE9e2lkOnIuT1BTLnJlc3RvcmUsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5jbT17aWQ6ci5PUFMudHJhbnNmb3JtLG51bUFyZ3M6Nix2YXJpYWJsZUFyZ3M6ITF9O2UubT17aWQ6ci5PUFMubW92ZVRvLG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9O2UubD17aWQ6ci5PUFMubGluZVRvLG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9O2UuYz17aWQ6ci5PUFMuY3VydmVUbyxudW1BcmdzOjYsdmFyaWFibGVBcmdzOiExfTtlLnY9e2lkOnIuT1BTLmN1cnZlVG8yLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITF9O2UueT17aWQ6ci5PUFMuY3VydmVUbzMsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMX07ZS5oPXtpZDpyLk9QUy5jbG9zZVBhdGgsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5yZT17aWQ6ci5PUFMucmVjdGFuZ2xlLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITF9O2UuUz17aWQ6ci5PUFMuc3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2Uucz17aWQ6ci5PUFMuY2xvc2VTdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5mPXtpZDpyLk9QUy5maWxsLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UuRj17aWQ6ci5PUFMuZmlsbCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlWyJmKiJdPXtpZDpyLk9QUy5lb0ZpbGwsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5CPXtpZDpyLk9QUy5maWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2VbIkIqIl09e2lkOnIuT1BTLmVvRmlsbFN0cm9rZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLmI9e2lkOnIuT1BTLmNsb3NlRmlsbFN0cm9rZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlWyJiKiJdPXtpZDpyLk9QUy5jbG9zZUVPRmlsbFN0cm9rZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLm49e2lkOnIuT1BTLmVuZFBhdGgsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5XPXtpZDpyLk9QUy5jbGlwLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2VbIlcqIl09e2lkOnIuT1BTLmVvQ2xpcCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLkJUPXtpZDpyLk9QUy5iZWdpblRleHQsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX07ZS5FVD17aWQ6ci5PUFMuZW5kVGV4dCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLlRjPXtpZDpyLk9QUy5zZXRDaGFyU3BhY2luZyxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLlR3PXtpZDpyLk9QUy5zZXRXb3JkU3BhY2luZyxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLlR6PXtpZDpyLk9QUy5zZXRIU2NhbGUsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5UTD17aWQ6ci5PUFMuc2V0TGVhZGluZyxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLlRmPXtpZDpyLk9QUy5zZXRGb250LG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9O2UuVHI9e2lkOnIuT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuVHM9e2lkOnIuT1BTLnNldFRleHRSaXNlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuVGQ9e2lkOnIuT1BTLm1vdmVUZXh0LG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9O2UuVEQ9e2lkOnIuT1BTLnNldExlYWRpbmdNb3ZlVGV4dCxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfTtlLlRtPXtpZDpyLk9QUy5zZXRUZXh0TWF0cml4LG51bUFyZ3M6Nix2YXJpYWJsZUFyZ3M6ITF9O2VbIlQqIl09e2lkOnIuT1BTLm5leHRMaW5lLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UuVGo9e2lkOnIuT1BTLnNob3dUZXh0LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuVEo9e2lkOnIuT1BTLnNob3dTcGFjZWRUZXh0LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2VbIiciXT17aWQ6ci5PUFMubmV4dExpbmVTaG93VGV4dCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlWyciJ109e2lkOnIuT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0LG51bUFyZ3M6Myx2YXJpYWJsZUFyZ3M6ITF9O2UuZDA9e2lkOnIuT1BTLnNldENoYXJXaWR0aCxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfTtlLmQxPXtpZDpyLk9QUy5zZXRDaGFyV2lkdGhBbmRCb3VuZHMsbnVtQXJnczo2LHZhcmlhYmxlQXJnczohMX07ZS5DUz17aWQ6ci5PUFMuc2V0U3Ryb2tlQ29sb3JTcGFjZSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLmNzPXtpZDpyLk9QUy5zZXRGaWxsQ29sb3JTcGFjZSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLlNDPXtpZDpyLk9QUy5zZXRTdHJva2VDb2xvcixudW1BcmdzOjQsdmFyaWFibGVBcmdzOiEwfTtlLlNDTj17aWQ6ci5PUFMuc2V0U3Ryb2tlQ29sb3JOLG51bUFyZ3M6MzMsdmFyaWFibGVBcmdzOiEwfTtlLnNjPXtpZDpyLk9QUy5zZXRGaWxsQ29sb3IsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMH07ZS5zY249e2lkOnIuT1BTLnNldEZpbGxDb2xvck4sbnVtQXJnczozMyx2YXJpYWJsZUFyZ3M6ITB9O2UuRz17aWQ6ci5PUFMuc2V0U3Ryb2tlR3JheSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLmc9e2lkOnIuT1BTLnNldEZpbGxHcmF5LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuUkc9e2lkOnIuT1BTLnNldFN0cm9rZVJHQkNvbG9yLG51bUFyZ3M6Myx2YXJpYWJsZUFyZ3M6ITF9O2Uucmc9e2lkOnIuT1BTLnNldEZpbGxSR0JDb2xvcixudW1BcmdzOjMsdmFyaWFibGVBcmdzOiExfTtlLks9e2lkOnIuT1BTLnNldFN0cm9rZUNNWUtDb2xvcixudW1BcmdzOjQsdmFyaWFibGVBcmdzOiExfTtlLms9e2lkOnIuT1BTLnNldEZpbGxDTVlLQ29sb3IsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMX07ZS5zaD17aWQ6ci5PUFMuc2hhZGluZ0ZpbGwsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5CST17aWQ6ci5PUFMuYmVnaW5JbmxpbmVJbWFnZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLklEPXtpZDpyLk9QUy5iZWdpbkltYWdlRGF0YSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLkVJPXtpZDpyLk9QUy5lbmRJbmxpbmVJbWFnZSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfTtlLkRvPXtpZDpyLk9QUy5wYWludFhPYmplY3QsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5NUD17aWQ6ci5PUFMubWFya1BvaW50LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9O2UuRFA9e2lkOnIuT1BTLm1hcmtQb2ludFByb3BzLG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9O2UuQk1DPXtpZDpyLk9QUy5iZWdpbk1hcmtlZENvbnRlbnQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX07ZS5CREM9e2lkOnIuT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9O2UuRU1DPXtpZDpyLk9QUy5lbmRNYXJrZWRDb250ZW50LG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UuQlg9e2lkOnIuT1BTLmJlZ2luQ29tcGF0LG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9O2UuRVg9e2lkOnIuT1BTLmVuZENvbXBhdCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfTtlLkJNPW51bGw7ZS5CRD1udWxsO2UudHJ1ZT1udWxsO2UuZmE9bnVsbDtlLmZhbD1udWxsO2UuZmFscz1udWxsO2UuZmFsc2U9bnVsbDtlLm51PW51bGw7ZS5udWw9bnVsbDtlLm51bGw9bnVsbH0pKTtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywib3BNYXAiLGUoKSl9c3RhdGljIE1BWF9JTlZBTElEX1BBVEhfT1BTPTEwO2NvbnN0cnVjdG9yKGUsdCl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm5ldyBTdGF0ZU1hbmFnZXI7dGhpcy5wYXJzZXI9bmV3IGYuUGFyc2VyKHtsZXhlcjpuZXcgZi5MZXhlcihlLEV2YWx1YXRvclByZXByb2Nlc3Nvci5vcE1hcCkseHJlZjp0fSk7dGhpcy5zdGF0ZU1hbmFnZXI9YTt0aGlzLm5vblByb2Nlc3NlZEFyZ3M9W107dGhpcy5faXNQYXRoT3A9ITE7dGhpcy5fbnVtSW52YWxpZFBhdGhPUFM9MH1nZXQgc2F2ZWRTdGF0ZXNEZXB0aCgpe3JldHVybiB0aGlzLnN0YXRlTWFuYWdlci5zdGF0ZVN0YWNrLmxlbmd0aH1yZWFkKGUpe2xldCB0PWUuYXJncztmb3IoOzspe2NvbnN0IGE9dGhpcy5wYXJzZXIuZ2V0T2JqKCk7aWYoYSBpbnN0YW5jZW9mIGkuQ21kKXtjb25zdCBuPWEuY21kLGk9RXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwW25dO2lmKCFpKXsoMCxyLndhcm4pKGBVbmtub3duIGNvbW1hbmQgIiR7bn0iLmApO2NvbnRpbnVlfWNvbnN0IHM9aS5pZCxvPWkubnVtQXJncztsZXQgYz1udWxsIT09dD90Lmxlbmd0aDowO3RoaXMuX2lzUGF0aE9wfHwodGhpcy5fbnVtSW52YWxpZFBhdGhPUFM9MCk7dGhpcy5faXNQYXRoT3A9cz49ci5PUFMubW92ZVRvJiZzPD1yLk9QUy5lbmRQYXRoO2lmKGkudmFyaWFibGVBcmdzKWM+byYmKDAsci5pbmZvKShgQ29tbWFuZCAke259OiBleHBlY3RlZCBbMCwgJHtvfV0gYXJncywgYnV0IHJlY2VpdmVkICR7Y30gYXJncy5gKTtlbHNle2lmKGMhPT1vKXtjb25zdCBlPXRoaXMubm9uUHJvY2Vzc2VkQXJncztmb3IoO2M+bzspe2UucHVzaCh0LnNoaWZ0KCkpO2MtLX1mb3IoO2M8byYmMCE9PWUubGVuZ3RoOyl7bnVsbD09PXQmJih0PVtdKTt0LnVuc2hpZnQoZS5wb3AoKSk7YysrfX1pZihjPG8pe2NvbnN0IGU9YGNvbW1hbmQgJHtufTogZXhwZWN0ZWQgJHtvfSBhcmdzLCBidXQgcmVjZWl2ZWQgJHtjfSBhcmdzLmA7aWYodGhpcy5faXNQYXRoT3AmJisrdGhpcy5fbnVtSW52YWxpZFBhdGhPUFM+RXZhbHVhdG9yUHJlcHJvY2Vzc29yLk1BWF9JTlZBTElEX1BBVEhfT1BTKXRocm93IG5ldyByLkZvcm1hdEVycm9yKGBJbnZhbGlkICR7ZX1gKTsoMCxyLndhcm4pKGBTa2lwcGluZyAke2V9YCk7bnVsbCE9PXQmJih0Lmxlbmd0aD0wKTtjb250aW51ZX19dGhpcy5wcmVwcm9jZXNzQ29tbWFuZChzLHQpO2UuZm49cztlLmFyZ3M9dDtyZXR1cm4hMH1pZihhPT09aS5FT0YpcmV0dXJuITE7aWYobnVsbCE9PWEpe251bGw9PT10JiYodD1bXSk7dC5wdXNoKGEpO2lmKHQubGVuZ3RoPjMzKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJUb28gbWFueSBhcmd1bWVudHMiKX19fXByZXByb2Nlc3NDb21tYW5kKGUsdCl7c3dpdGNoKDB8ZSl7Y2FzZSByLk9QUy5zYXZlOnRoaXMuc3RhdGVNYW5hZ2VyLnNhdmUoKTticmVhaztjYXNlIHIuT1BTLnJlc3RvcmU6dGhpcy5zdGF0ZU1hbmFnZXIucmVzdG9yZSgpO2JyZWFrO2Nhc2Ugci5PUFMudHJhbnNmb3JtOnRoaXMuc3RhdGVNYW5hZ2VyLnRyYW5zZm9ybSh0KX19fXQuRXZhbHVhdG9yUHJlcHJvY2Vzc29yPUV2YWx1YXRvclByZXByb2Nlc3Nvcn0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5JZGVudGl0eUNNYXA9dC5DTWFwRmFjdG9yeT10LkNNYXA9dm9pZCAwO2EoMTM5KTthKDIpO3ZhciByPWEoMTQ0KSxuPWEoMTUwKSxpPWEoMTUxKSxzPWEoMTY1KSxvPWEoMTY2KSxjPWEoMTQ5KSxsPWEoMTU0KTtjb25zdCBoPVsiQWRvYmUtR0IxLVVDUzIiLCJBZG9iZS1DTlMxLVVDUzIiLCJBZG9iZS1KYXBhbjEtVUNTMiIsIkFkb2JlLUtvcmVhMS1VQ1MyIiwiNzgtRVVDLUgiLCI3OC1FVUMtViIsIjc4LUgiLCI3OC1SS1NKLUgiLCI3OC1SS1NKLVYiLCI3OC1WIiwiNzhtcy1SS1NKLUgiLCI3OG1zLVJLU0otViIsIjgzcHYtUktTSi1IIiwiOTBtcy1SS1NKLUgiLCI5MG1zLVJLU0otViIsIjkwbXNwLVJLU0otSCIsIjkwbXNwLVJLU0otViIsIjkwcHYtUktTSi1IIiwiOTBwdi1SS1NKLVYiLCJBZGQtSCIsIkFkZC1SS1NKLUgiLCJBZGQtUktTSi1WIiwiQWRkLVYiLCJBZG9iZS1DTlMxLTAiLCJBZG9iZS1DTlMxLTEiLCJBZG9iZS1DTlMxLTIiLCJBZG9iZS1DTlMxLTMiLCJBZG9iZS1DTlMxLTQiLCJBZG9iZS1DTlMxLTUiLCJBZG9iZS1DTlMxLTYiLCJBZG9iZS1HQjEtMCIsIkFkb2JlLUdCMS0xIiwiQWRvYmUtR0IxLTIiLCJBZG9iZS1HQjEtMyIsIkFkb2JlLUdCMS00IiwiQWRvYmUtR0IxLTUiLCJBZG9iZS1KYXBhbjEtMCIsIkFkb2JlLUphcGFuMS0xIiwiQWRvYmUtSmFwYW4xLTIiLCJBZG9iZS1KYXBhbjEtMyIsIkFkb2JlLUphcGFuMS00IiwiQWRvYmUtSmFwYW4xLTUiLCJBZG9iZS1KYXBhbjEtNiIsIkFkb2JlLUtvcmVhMS0wIiwiQWRvYmUtS29yZWExLTEiLCJBZG9iZS1Lb3JlYTEtMiIsIkI1LUgiLCJCNS1WIiwiQjVwYy1IIiwiQjVwYy1WIiwiQ05TLUVVQy1IIiwiQ05TLUVVQy1WIiwiQ05TMS1IIiwiQ05TMS1WIiwiQ05TMi1IIiwiQ05TMi1WIiwiRVRISy1CNS1IIiwiRVRISy1CNS1WIiwiRVRlbi1CNS1IIiwiRVRlbi1CNS1WIiwiRVRlbm1zLUI1LUgiLCJFVGVubXMtQjUtViIsIkVVQy1IIiwiRVVDLVYiLCJFeHQtSCIsIkV4dC1SS1NKLUgiLCJFeHQtUktTSi1WIiwiRXh0LVYiLCJHQi1FVUMtSCIsIkdCLUVVQy1WIiwiR0ItSCIsIkdCLVYiLCJHQkstRVVDLUgiLCJHQkstRVVDLVYiLCJHQksySy1IIiwiR0JLMkstViIsIkdCS3AtRVVDLUgiLCJHQktwLUVVQy1WIiwiR0JULUVVQy1IIiwiR0JULUVVQy1WIiwiR0JULUgiLCJHQlQtViIsIkdCVHBjLUVVQy1IIiwiR0JUcGMtRVVDLVYiLCJHQnBjLUVVQy1IIiwiR0JwYy1FVUMtViIsIkgiLCJIS2RsYS1CNS1IIiwiSEtkbGEtQjUtViIsIkhLZGxiLUI1LUgiLCJIS2RsYi1CNS1WIiwiSEtnY2NzLUI1LUgiLCJIS2djY3MtQjUtViIsIkhLbTMxNC1CNS1IIiwiSEttMzE0LUI1LVYiLCJIS200NzEtQjUtSCIsIkhLbTQ3MS1CNS1WIiwiSEtzY3MtQjUtSCIsIkhLc2NzLUI1LVYiLCJIYW5rYWt1IiwiSGlyYWdhbmEiLCJLU0MtRVVDLUgiLCJLU0MtRVVDLVYiLCJLU0MtSCIsIktTQy1Kb2hhYi1IIiwiS1NDLUpvaGFiLVYiLCJLU0MtViIsIktTQ21zLVVIQy1IIiwiS1NDbXMtVUhDLUhXLUgiLCJLU0Ntcy1VSEMtSFctViIsIktTQ21zLVVIQy1WIiwiS1NDcGMtRVVDLUgiLCJLU0NwYy1FVUMtViIsIkthdGFrYW5hIiwiTldQLUgiLCJOV1AtViIsIlJLU0otSCIsIlJLU0otViIsIlJvbWFuIiwiVW5pQ05TLVVDUzItSCIsIlVuaUNOUy1VQ1MyLVYiLCJVbmlDTlMtVVRGMTYtSCIsIlVuaUNOUy1VVEYxNi1WIiwiVW5pQ05TLVVURjMyLUgiLCJVbmlDTlMtVVRGMzItViIsIlVuaUNOUy1VVEY4LUgiLCJVbmlDTlMtVVRGOC1WIiwiVW5pR0ItVUNTMi1IIiwiVW5pR0ItVUNTMi1WIiwiVW5pR0ItVVRGMTYtSCIsIlVuaUdCLVVURjE2LVYiLCJVbmlHQi1VVEYzMi1IIiwiVW5pR0ItVVRGMzItViIsIlVuaUdCLVVURjgtSCIsIlVuaUdCLVVURjgtViIsIlVuaUpJUy1VQ1MyLUgiLCJVbmlKSVMtVUNTMi1IVy1IIiwiVW5pSklTLVVDUzItSFctViIsIlVuaUpJUy1VQ1MyLVYiLCJVbmlKSVMtVVRGMTYtSCIsIlVuaUpJUy1VVEYxNi1WIiwiVW5pSklTLVVURjMyLUgiLCJVbmlKSVMtVVRGMzItViIsIlVuaUpJUy1VVEY4LUgiLCJVbmlKSVMtVVRGOC1WIiwiVW5pSklTMjAwNC1VVEYxNi1IIiwiVW5pSklTMjAwNC1VVEYxNi1WIiwiVW5pSklTMjAwNC1VVEYzMi1IIiwiVW5pSklTMjAwNC1VVEYzMi1WIiwiVW5pSklTMjAwNC1VVEY4LUgiLCJVbmlKSVMyMDA0LVVURjgtViIsIlVuaUpJU1Byby1VQ1MyLUhXLVYiLCJVbmlKSVNQcm8tVUNTMi1WIiwiVW5pSklTUHJvLVVURjgtViIsIlVuaUpJU1gwMjEzLVVURjMyLUgiLCJVbmlKSVNYMDIxMy1VVEYzMi1WIiwiVW5pSklTWDAyMTMyMDA0LVVURjMyLUgiLCJVbmlKSVNYMDIxMzIwMDQtVVRGMzItViIsIlVuaUtTLVVDUzItSCIsIlVuaUtTLVVDUzItViIsIlVuaUtTLVVURjE2LUgiLCJVbmlLUy1VVEYxNi1WIiwiVW5pS1MtVVRGMzItSCIsIlVuaUtTLVVURjMyLVYiLCJVbmlLUy1VVEY4LUgiLCJVbmlLUy1VVEY4LVYiLCJWIiwiV1AtU3ltYm9sIl0sdT0yKioyNC0xO2NsYXNzIENNYXB7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO3RoaXMuY29kZXNwYWNlUmFuZ2VzPVtbXSxbXSxbXSxbXV07dGhpcy5udW1Db2Rlc3BhY2VSYW5nZXM9MDt0aGlzLl9tYXA9W107dGhpcy5uYW1lPSIiO3RoaXMudmVydGljYWw9ITE7dGhpcy51c2VDTWFwPW51bGw7dGhpcy5idWlsdEluQ01hcD1lfWFkZENvZGVzcGFjZVJhbmdlKGUsdCxhKXt0aGlzLmNvZGVzcGFjZVJhbmdlc1tlLTFdLnB1c2godCxhKTt0aGlzLm51bUNvZGVzcGFjZVJhbmdlcysrfW1hcENpZFJhbmdlKGUsdCxhKXtpZih0LWU+dSl0aHJvdyBuZXcgRXJyb3IoIm1hcENpZFJhbmdlIC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpO2Zvcig7ZTw9dDspdGhpcy5fbWFwW2UrK109YSsrfW1hcEJmUmFuZ2UoZSx0LGEpe2lmKHQtZT51KXRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTtjb25zdCByPWEubGVuZ3RoLTE7Zm9yKDtlPD10Oyl7dGhpcy5fbWFwW2UrK109YTtjb25zdCB0PWEuY2hhckNvZGVBdChyKSsxO3Q+MjU1P2E9YS5zdWJzdHJpbmcoMCxyLTEpK1N0cmluZy5mcm9tQ2hhckNvZGUoYS5jaGFyQ29kZUF0KHItMSkrMSkrIlwwIjphPWEuc3Vic3RyaW5nKDAscikrU3RyaW5nLmZyb21DaGFyQ29kZSh0KX19bWFwQmZSYW5nZVRvQXJyYXkoZSx0LGEpe2lmKHQtZT51KXRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZVRvQXJyYXkgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7Y29uc3Qgcj1hLmxlbmd0aDtsZXQgbj0wO2Zvcig7ZTw9dCYmbjxyOyl7dGhpcy5fbWFwW2VdPWFbbisrXTsrK2V9fW1hcE9uZShlLHQpe3RoaXMuX21hcFtlXT10fWxvb2t1cChlKXtyZXR1cm4gdGhpcy5fbWFwW2VdfWNvbnRhaW5zKGUpe3JldHVybiB2b2lkIDAhPT10aGlzLl9tYXBbZV19Zm9yRWFjaChlKXtjb25zdCB0PXRoaXMuX21hcCxhPXQubGVuZ3RoO2lmKGE8PTY1NTM2KWZvcihsZXQgcj0wO3I8YTtyKyspdm9pZCAwIT09dFtyXSYmZShyLHRbcl0pO2Vsc2UgZm9yKGNvbnN0IGEgaW4gdCllKGEsdFthXSl9Y2hhckNvZGVPZihlKXtjb25zdCB0PXRoaXMuX21hcDtpZih0Lmxlbmd0aDw9NjU1MzYpcmV0dXJuIHQuaW5kZXhPZihlKTtmb3IoY29uc3QgYSBpbiB0KWlmKHRbYV09PT1lKXJldHVybiAwfGE7cmV0dXJuLTF9Z2V0TWFwKCl7cmV0dXJuIHRoaXMuX21hcH1yZWFkQ2hhckNvZGUoZSx0LGEpe2xldCByPTA7Y29uc3Qgbj10aGlzLmNvZGVzcGFjZVJhbmdlcztmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspe3I9KHI8PDh8ZS5jaGFyQ29kZUF0KHQraSkpPj4+MDtjb25zdCBzPW5baV07Zm9yKGxldCBlPTAsdD1zLmxlbmd0aDtlPHQ7KXtjb25zdCB0PXNbZSsrXSxuPXNbZSsrXTtpZihyPj10JiZyPD1uKXthLmNoYXJjb2RlPXI7YS5sZW5ndGg9aSsxO3JldHVybn19fWEuY2hhcmNvZGU9MDthLmxlbmd0aD0xfWdldENoYXJDb2RlTGVuZ3RoKGUpe2NvbnN0IHQ9dGhpcy5jb2Rlc3BhY2VSYW5nZXM7Zm9yKGxldCBhPTAscj10Lmxlbmd0aDthPHI7YSsrKXtjb25zdCByPXRbYV07Zm9yKGxldCB0PTAsbj1yLmxlbmd0aDt0PG47KXtjb25zdCBuPXJbdCsrXSxpPXJbdCsrXTtpZihlPj1uJiZlPD1pKXJldHVybiBhKzF9fXJldHVybiAxfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbWFwLmxlbmd0aH1nZXQgaXNJZGVudGl0eUNNYXAoKXtpZigiSWRlbnRpdHktSCIhPT10aGlzLm5hbWUmJiJJZGVudGl0eS1WIiE9PXRoaXMubmFtZSlyZXR1cm4hMTtpZig2NTUzNiE9PXRoaXMuX21hcC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBlPTA7ZTw2NTUzNjtlKyspaWYodGhpcy5fbWFwW2VdIT09ZSlyZXR1cm4hMTtyZXR1cm4hMH19dC5DTWFwPUNNYXA7Y2xhc3MgSWRlbnRpdHlDTWFwIGV4dGVuZHMgQ01hcHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCk7dGhpcy52ZXJ0aWNhbD1lO3RoaXMuYWRkQ29kZXNwYWNlUmFuZ2UodCwwLDY1NTM1KX1tYXBDaWRSYW5nZShlLHQsYSl7KDAsci51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBDaWRSYW5nZSIpfW1hcEJmUmFuZ2UoZSx0LGEpeygwLHIudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZSIpfW1hcEJmUmFuZ2VUb0FycmF5KGUsdCxhKXsoMCxyLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcEJmUmFuZ2VUb0FycmF5Iil9bWFwT25lKGUsdCl7KDAsci51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBDaWRPbmUiKX1sb29rdXAoZSl7cmV0dXJuIE51bWJlci5pc0ludGVnZXIoZSkmJmU8PTY1NTM1P2U6dm9pZCAwfWNvbnRhaW5zKGUpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPD02NTUzNX1mb3JFYWNoKGUpe2ZvcihsZXQgdD0wO3Q8PTY1NTM1O3QrKyllKHQsdCl9Y2hhckNvZGVPZihlKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihlKSYmZTw9NjU1MzU/ZTotMX1nZXRNYXAoKXtjb25zdCBlPW5ldyBBcnJheSg2NTUzNik7Zm9yKGxldCB0PTA7dDw9NjU1MzU7dCsrKWVbdF09dDtyZXR1cm4gZX1nZXQgbGVuZ3RoKCl7cmV0dXJuIDY1NTM2fWdldCBpc0lkZW50aXR5Q01hcCgpeygwLHIudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGFjY2VzcyAuaXNJZGVudGl0eUNNYXAiKX19dC5JZGVudGl0eUNNYXA9SWRlbnRpdHlDTWFwO2Z1bmN0aW9uIHN0clRvSW50KGUpe2xldCB0PTA7Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspdD10PDw4fGUuY2hhckNvZGVBdChhKTtyZXR1cm4gdD4+PjB9ZnVuY3Rpb24gZXhwZWN0U3RyaW5nKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiTWFsZm9ybWVkIENNYXA6IGV4cGVjdGVkIHN0cmluZy4iKX1mdW5jdGlvbiBleHBlY3RJbnQoZSl7aWYoIU51bWJlci5pc0ludGVnZXIoZSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBpbnQuIil9ZnVuY3Rpb24gcGFyc2VCZkNoYXIoZSx0KXtmb3IoOzspe2xldCBhPXQuZ2V0T2JqKCk7aWYoYT09PW4uRU9GKWJyZWFrO2lmKCgwLG4uaXNDbWQpKGEsImVuZGJmY2hhciIpKXJldHVybjtleHBlY3RTdHJpbmcoYSk7Y29uc3Qgcj1zdHJUb0ludChhKTthPXQuZ2V0T2JqKCk7ZXhwZWN0U3RyaW5nKGEpO2NvbnN0IGk9YTtlLm1hcE9uZShyLGkpfX1mdW5jdGlvbiBwYXJzZUJmUmFuZ2UoZSx0KXtmb3IoOzspe2xldCBhPXQuZ2V0T2JqKCk7aWYoYT09PW4uRU9GKWJyZWFrO2lmKCgwLG4uaXNDbWQpKGEsImVuZGJmcmFuZ2UiKSlyZXR1cm47ZXhwZWN0U3RyaW5nKGEpO2NvbnN0IHI9c3RyVG9JbnQoYSk7YT10LmdldE9iaigpO2V4cGVjdFN0cmluZyhhKTtjb25zdCBpPXN0clRvSW50KGEpO2E9dC5nZXRPYmooKTtpZihOdW1iZXIuaXNJbnRlZ2VyKGEpfHwic3RyaW5nIj09dHlwZW9mIGEpe2NvbnN0IHQ9TnVtYmVyLmlzSW50ZWdlcihhKT9TdHJpbmcuZnJvbUNoYXJDb2RlKGEpOmE7ZS5tYXBCZlJhbmdlKHIsaSx0KX1lbHNle2lmKCEoMCxuLmlzQ21kKShhLCJbIikpYnJlYWs7e2E9dC5nZXRPYmooKTtjb25zdCBzPVtdO2Zvcig7ISgwLG4uaXNDbWQpKGEsIl0iKSYmYSE9PW4uRU9GOyl7cy5wdXNoKGEpO2E9dC5nZXRPYmooKX1lLm1hcEJmUmFuZ2VUb0FycmF5KHIsaSxzKX19fXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJJbnZhbGlkIGJmIHJhbmdlLiIpfWZ1bmN0aW9uIHBhcnNlQ2lkQ2hhcihlLHQpe2Zvcig7Oyl7bGV0IGE9dC5nZXRPYmooKTtpZihhPT09bi5FT0YpYnJlYWs7aWYoKDAsbi5pc0NtZCkoYSwiZW5kY2lkY2hhciIpKXJldHVybjtleHBlY3RTdHJpbmcoYSk7Y29uc3Qgcj1zdHJUb0ludChhKTthPXQuZ2V0T2JqKCk7ZXhwZWN0SW50KGEpO2NvbnN0IGk9YTtlLm1hcE9uZShyLGkpfX1mdW5jdGlvbiBwYXJzZUNpZFJhbmdlKGUsdCl7Zm9yKDs7KXtsZXQgYT10LmdldE9iaigpO2lmKGE9PT1uLkVPRilicmVhaztpZigoMCxuLmlzQ21kKShhLCJlbmRjaWRyYW5nZSIpKXJldHVybjtleHBlY3RTdHJpbmcoYSk7Y29uc3Qgcj1zdHJUb0ludChhKTthPXQuZ2V0T2JqKCk7ZXhwZWN0U3RyaW5nKGEpO2NvbnN0IGk9c3RyVG9JbnQoYSk7YT10LmdldE9iaigpO2V4cGVjdEludChhKTtjb25zdCBzPWE7ZS5tYXBDaWRSYW5nZShyLGkscyl9fWZ1bmN0aW9uIHBhcnNlQ29kZXNwYWNlUmFuZ2UoZSx0KXtmb3IoOzspe2xldCBhPXQuZ2V0T2JqKCk7aWYoYT09PW4uRU9GKWJyZWFrO2lmKCgwLG4uaXNDbWQpKGEsImVuZGNvZGVzcGFjZXJhbmdlIikpcmV0dXJuO2lmKCJzdHJpbmciIT10eXBlb2YgYSlicmVhaztjb25zdCByPXN0clRvSW50KGEpO2E9dC5nZXRPYmooKTtpZigic3RyaW5nIiE9dHlwZW9mIGEpYnJlYWs7Y29uc3QgaT1zdHJUb0ludChhKTtlLmFkZENvZGVzcGFjZVJhbmdlKGEubGVuZ3RoLHIsaSl9dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkludmFsaWQgY29kZXNwYWNlIHJhbmdlLiIpfWZ1bmN0aW9uIHBhcnNlV01vZGUoZSx0KXtjb25zdCBhPXQuZ2V0T2JqKCk7TnVtYmVyLmlzSW50ZWdlcihhKSYmKGUudmVydGljYWw9ISFhKX1mdW5jdGlvbiBwYXJzZUNNYXBOYW1lKGUsdCl7Y29uc3QgYT10LmdldE9iaigpO2EgaW5zdGFuY2VvZiBuLk5hbWUmJihlLm5hbWU9YS5uYW1lKX1hc3luYyBmdW5jdGlvbiBwYXJzZUNNYXAoZSx0LGEsaSl7bGV0IHMsbztlOmZvcig7Oyl0cnl7Y29uc3QgYT10LmdldE9iaigpO2lmKGE9PT1uLkVPRilicmVhaztpZihhIGluc3RhbmNlb2Ygbi5OYW1lKXsiV01vZGUiPT09YS5uYW1lP3BhcnNlV01vZGUoZSx0KToiQ01hcE5hbWUiPT09YS5uYW1lJiZwYXJzZUNNYXBOYW1lKGUsdCk7cz1hfWVsc2UgaWYoYSBpbnN0YW5jZW9mIG4uQ21kKXN3aXRjaChhLmNtZCl7Y2FzZSJlbmRjbWFwIjpicmVhayBlO2Nhc2UidXNlY21hcCI6cyBpbnN0YW5jZW9mIG4uTmFtZSYmKG89cy5uYW1lKTticmVhaztjYXNlImJlZ2luY29kZXNwYWNlcmFuZ2UiOnBhcnNlQ29kZXNwYWNlUmFuZ2UoZSx0KTticmVhaztjYXNlImJlZ2luYmZjaGFyIjpwYXJzZUJmQ2hhcihlLHQpO2JyZWFrO2Nhc2UiYmVnaW5jaWRjaGFyIjpwYXJzZUNpZENoYXIoZSx0KTticmVhaztjYXNlImJlZ2luYmZyYW5nZSI6cGFyc2VCZlJhbmdlKGUsdCk7YnJlYWs7Y2FzZSJiZWdpbmNpZHJhbmdlIjpwYXJzZUNpZFJhbmdlKGUsdCl9fWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBjLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsci53YXJuKSgiSW52YWxpZCBjTWFwIGRhdGE6ICIrZSk7Y29udGludWV9IWkmJm8mJihpPW8pO3JldHVybiBpP2V4dGVuZENNYXAoZSxhLGkpOmV9YXN5bmMgZnVuY3Rpb24gZXh0ZW5kQ01hcChlLHQsYSl7ZS51c2VDTWFwPWF3YWl0IGNyZWF0ZUJ1aWx0SW5DTWFwKGEsdCk7aWYoMD09PWUubnVtQ29kZXNwYWNlUmFuZ2VzKXtjb25zdCB0PWUudXNlQ01hcC5jb2Rlc3BhY2VSYW5nZXM7Zm9yKGxldCBhPTA7YTx0Lmxlbmd0aDthKyspZS5jb2Rlc3BhY2VSYW5nZXNbYV09dFthXS5zbGljZSgpO2UubnVtQ29kZXNwYWNlUmFuZ2VzPWUudXNlQ01hcC5udW1Db2Rlc3BhY2VSYW5nZXN9ZS51c2VDTWFwLmZvckVhY2goKGZ1bmN0aW9uKHQsYSl7ZS5jb250YWlucyh0KXx8ZS5tYXBPbmUodCxlLnVzZUNNYXAubG9va3VwKHQpKX0pKTtyZXR1cm4gZX1hc3luYyBmdW5jdGlvbiBjcmVhdGVCdWlsdEluQ01hcChlLHQpe2lmKCJJZGVudGl0eS1IIj09PWUpcmV0dXJuIG5ldyBJZGVudGl0eUNNYXAoITEsMik7aWYoIklkZW50aXR5LVYiPT09ZSlyZXR1cm4gbmV3IElkZW50aXR5Q01hcCghMCwyKTtpZighaC5pbmNsdWRlcyhlKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gQ01hcCBuYW1lOiAiK2UpO2lmKCF0KXRocm93IG5ldyBFcnJvcigiQnVpbHQtaW4gQ01hcCBwYXJhbWV0ZXJzIGFyZSBub3QgcHJvdmlkZWQuIik7Y29uc3R7Y01hcERhdGE6YSxjb21wcmVzc2lvblR5cGU6bn09YXdhaXQgdChlKSxpPW5ldyBDTWFwKCEwKTtpZihuPT09ci5DTWFwQ29tcHJlc3Npb25UeXBlLkJJTkFSWSlyZXR1cm4obmV3IHMuQmluYXJ5Q01hcFJlYWRlcikucHJvY2VzcyhhLGksKGU9PmV4dGVuZENNYXAoaSx0LGUpKSk7aWYobj09PXIuQ01hcENvbXByZXNzaW9uVHlwZS5OT05FKXtjb25zdCBlPW5ldyBvLkxleGVyKG5ldyBsLlN0cmVhbShhKSk7cmV0dXJuIHBhcnNlQ01hcChpLGUsdCxudWxsKX10aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgQ01hcCAiY29tcHJlc3Npb25UeXBlIiB2YWx1ZTogJHtufWApfXQuQ01hcEZhY3Rvcnk9Y2xhc3MgQ01hcEZhY3Rvcnl7c3RhdGljIGFzeW5jIGNyZWF0ZShlKXtsZXR7ZW5jb2Rpbmc6dCxmZXRjaEJ1aWx0SW5DTWFwOmEsdXNlQ01hcDpyfT1lO2lmKHQgaW5zdGFuY2VvZiBuLk5hbWUpcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKHQubmFtZSxhKTtpZih0IGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtKXtjb25zdCBlPWF3YWl0IHBhcnNlQ01hcChuZXcgQ01hcCxuZXcgby5MZXhlcih0KSxhLHIpO3JldHVybiBlLmlzSWRlbnRpdHlDTWFwP2NyZWF0ZUJ1aWx0SW5DTWFwKGUubmFtZSxhKTplfXRocm93IG5ldyBFcnJvcigiRW5jb2RpbmcgcmVxdWlyZWQuIil9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5CaW5hcnlDTWFwUmVhZGVyPXZvaWQgMDthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgyKTt2YXIgcj1hKDE0NCk7ZnVuY3Rpb24gaGV4VG9JbnQoZSx0KXtsZXQgYT0wO2ZvcihsZXQgcj0wO3I8PXQ7cisrKWE9YTw8OHxlW3JdO3JldHVybiBhPj4+MH1mdW5jdGlvbiBoZXhUb1N0cihlLHQpe3JldHVybiAxPT09dD9TdHJpbmcuZnJvbUNoYXJDb2RlKGVbMF0sZVsxXSk6Mz09PXQ/U3RyaW5nLmZyb21DaGFyQ29kZShlWzBdLGVbMV0sZVsyXSxlWzNdKTpTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmUuc3ViYXJyYXkoMCx0KzEpKX1mdW5jdGlvbiBhZGRIZXgoZSx0LGEpe2xldCByPTA7Zm9yKGxldCBuPWE7bj49MDtuLS0pe3IrPWVbbl0rdFtuXTtlW25dPTI1NSZyO3I+Pj04fX1mdW5jdGlvbiBpbmNIZXgoZSx0KXtsZXQgYT0xO2ZvcihsZXQgcj10O3I+PTAmJmE+MDtyLS0pe2ErPWVbcl07ZVtyXT0yNTUmYTthPj49OH19Y29uc3Qgbj0xNjtjbGFzcyBCaW5hcnlDTWFwU3RyZWFte2NvbnN0cnVjdG9yKGUpe3RoaXMuYnVmZmVyPWU7dGhpcy5wb3M9MDt0aGlzLmVuZD1lLmxlbmd0aDt0aGlzLnRtcEJ1Zj1uZXcgVWludDhBcnJheSgxOSl9cmVhZEJ5dGUoKXtyZXR1cm4gdGhpcy5wb3M+PXRoaXMuZW5kPy0xOnRoaXMuYnVmZmVyW3RoaXMucG9zKytdfXJlYWROdW1iZXIoKXtsZXQgZSx0PTA7ZG97Y29uc3QgYT10aGlzLnJlYWRCeXRlKCk7aWYoYTwwKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJ1bmV4cGVjdGVkIEVPRiBpbiBiY21hcCIpO2U9ISgxMjgmYSk7dD10PDw3fDEyNyZhfXdoaWxlKCFlKTtyZXR1cm4gdH1yZWFkU2lnbmVkKCl7Y29uc3QgZT10aGlzLnJlYWROdW1iZXIoKTtyZXR1cm4gMSZlP34oZT4+PjEpOmU+Pj4xfXJlYWRIZXgoZSx0KXtlLnNldCh0aGlzLmJ1ZmZlci5zdWJhcnJheSh0aGlzLnBvcyx0aGlzLnBvcyt0KzEpKTt0aGlzLnBvcys9dCsxfXJlYWRIZXhOdW1iZXIoZSx0KXtsZXQgYTtjb25zdCBuPXRoaXMudG1wQnVmO2xldCBpPTA7ZG97Y29uc3QgZT10aGlzLnJlYWRCeXRlKCk7aWYoZTwwKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJ1bmV4cGVjdGVkIEVPRiBpbiBiY21hcCIpO2E9ISgxMjgmZSk7bltpKytdPTEyNyZlfXdoaWxlKCFhKTtsZXQgcz10LG89MCxjPTA7Zm9yKDtzPj0wOyl7Zm9yKDtjPDgmJm4ubGVuZ3RoPjA7KXtvfD1uWy0taV08PGM7Yys9N31lW3NdPTI1NSZvO3MtLTtvPj49ODtjLT04fX1yZWFkSGV4U2lnbmVkKGUsdCl7dGhpcy5yZWFkSGV4TnVtYmVyKGUsdCk7Y29uc3QgYT0xJmVbdF0/MjU1OjA7bGV0IHI9MDtmb3IobGV0IG49MDtuPD10O24rKyl7cj0oMSZyKTw8OHxlW25dO2Vbbl09cj4+MV5hfX1yZWFkU3RyaW5nKCl7Y29uc3QgZT10aGlzLnJlYWROdW1iZXIoKSx0PW5ldyBBcnJheShlKTtmb3IobGV0IGE9MDthPGU7YSsrKXRbYV09dGhpcy5yZWFkTnVtYmVyKCk7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4udCl9fXQuQmluYXJ5Q01hcFJlYWRlcj1jbGFzcyBCaW5hcnlDTWFwUmVhZGVye2FzeW5jIHByb2Nlc3MoZSx0LGEpe2NvbnN0IHI9bmV3IEJpbmFyeUNNYXBTdHJlYW0oZSksaT1yLnJlYWRCeXRlKCk7dC52ZXJ0aWNhbD0hISgxJmkpO2xldCBzPW51bGw7Y29uc3Qgbz1uZXcgVWludDhBcnJheShuKSxjPW5ldyBVaW50OEFycmF5KG4pLGw9bmV3IFVpbnQ4QXJyYXkobiksaD1uZXcgVWludDhBcnJheShuKSx1PW5ldyBVaW50OEFycmF5KG4pO2xldCBkLGY7Zm9yKDsoZj1yLnJlYWRCeXRlKCkpPj0wOyl7Y29uc3QgZT1mPj41O2lmKDc9PT1lKXtzd2l0Y2goMzEmZil7Y2FzZSAwOnIucmVhZFN0cmluZygpO2JyZWFrO2Nhc2UgMTpzPXIucmVhZFN0cmluZygpfWNvbnRpbnVlfWNvbnN0IGE9ISEoMTYmZiksaT0xNSZmO2lmKGkrMT5uKXRocm93IG5ldyBFcnJvcigiQmluYXJ5Q01hcFJlYWRlci5wcm9jZXNzOiBJbnZhbGlkIGRhdGFTaXplLiIpO2NvbnN0IGc9MSxwPXIucmVhZE51bWJlcigpO3N3aXRjaChlKXtjYXNlIDA6ci5yZWFkSGV4KG8saSk7ci5yZWFkSGV4TnVtYmVyKGMsaSk7YWRkSGV4KGMsbyxpKTt0LmFkZENvZGVzcGFjZVJhbmdlKGkrMSxoZXhUb0ludChvLGkpLGhleFRvSW50KGMsaSkpO2ZvcihsZXQgZT0xO2U8cDtlKyspe2luY0hleChjLGkpO3IucmVhZEhleE51bWJlcihvLGkpO2FkZEhleChvLGMsaSk7ci5yZWFkSGV4TnVtYmVyKGMsaSk7YWRkSGV4KGMsbyxpKTt0LmFkZENvZGVzcGFjZVJhbmdlKGkrMSxoZXhUb0ludChvLGkpLGhleFRvSW50KGMsaSkpfWJyZWFrO2Nhc2UgMTpyLnJlYWRIZXgobyxpKTtyLnJlYWRIZXhOdW1iZXIoYyxpKTthZGRIZXgoYyxvLGkpO3IucmVhZE51bWJlcigpO2ZvcihsZXQgZT0xO2U8cDtlKyspe2luY0hleChjLGkpO3IucmVhZEhleE51bWJlcihvLGkpO2FkZEhleChvLGMsaSk7ci5yZWFkSGV4TnVtYmVyKGMsaSk7YWRkSGV4KGMsbyxpKTtyLnJlYWROdW1iZXIoKX1icmVhaztjYXNlIDI6ci5yZWFkSGV4KGwsaSk7ZD1yLnJlYWROdW1iZXIoKTt0Lm1hcE9uZShoZXhUb0ludChsLGkpLGQpO2ZvcihsZXQgZT0xO2U8cDtlKyspe2luY0hleChsLGkpO2lmKCFhKXtyLnJlYWRIZXhOdW1iZXIodSxpKTthZGRIZXgobCx1LGkpfWQ9ci5yZWFkU2lnbmVkKCkrKGQrMSk7dC5tYXBPbmUoaGV4VG9JbnQobCxpKSxkKX1icmVhaztjYXNlIDM6ci5yZWFkSGV4KG8saSk7ci5yZWFkSGV4TnVtYmVyKGMsaSk7YWRkSGV4KGMsbyxpKTtkPXIucmVhZE51bWJlcigpO3QubWFwQ2lkUmFuZ2UoaGV4VG9JbnQobyxpKSxoZXhUb0ludChjLGkpLGQpO2ZvcihsZXQgZT0xO2U8cDtlKyspe2luY0hleChjLGkpO2lmKGEpby5zZXQoYyk7ZWxzZXtyLnJlYWRIZXhOdW1iZXIobyxpKTthZGRIZXgobyxjLGkpfXIucmVhZEhleE51bWJlcihjLGkpO2FkZEhleChjLG8saSk7ZD1yLnJlYWROdW1iZXIoKTt0Lm1hcENpZFJhbmdlKGhleFRvSW50KG8saSksaGV4VG9JbnQoYyxpKSxkKX1icmVhaztjYXNlIDQ6ci5yZWFkSGV4KGwsZyk7ci5yZWFkSGV4KGgsaSk7dC5tYXBPbmUoaGV4VG9JbnQobCxnKSxoZXhUb1N0cihoLGkpKTtmb3IobGV0IGU9MTtlPHA7ZSsrKXtpbmNIZXgobCxnKTtpZighYSl7ci5yZWFkSGV4TnVtYmVyKHUsZyk7YWRkSGV4KGwsdSxnKX1pbmNIZXgoaCxpKTtyLnJlYWRIZXhTaWduZWQodSxpKTthZGRIZXgoaCx1LGkpO3QubWFwT25lKGhleFRvSW50KGwsZyksaGV4VG9TdHIoaCxpKSl9YnJlYWs7Y2FzZSA1OnIucmVhZEhleChvLGcpO3IucmVhZEhleE51bWJlcihjLGcpO2FkZEhleChjLG8sZyk7ci5yZWFkSGV4KGgsaSk7dC5tYXBCZlJhbmdlKGhleFRvSW50KG8sZyksaGV4VG9JbnQoYyxnKSxoZXhUb1N0cihoLGkpKTtmb3IobGV0IGU9MTtlPHA7ZSsrKXtpbmNIZXgoYyxnKTtpZihhKW8uc2V0KGMpO2Vsc2V7ci5yZWFkSGV4TnVtYmVyKG8sZyk7YWRkSGV4KG8sYyxnKX1yLnJlYWRIZXhOdW1iZXIoYyxnKTthZGRIZXgoYyxvLGcpO3IucmVhZEhleChoLGkpO3QubWFwQmZSYW5nZShoZXhUb0ludChvLGcpLGhleFRvSW50KGMsZyksaGV4VG9TdHIoaCxpKSl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYEJpbmFyeUNNYXBSZWFkZXIucHJvY2VzcyAtIHVua25vd24gdHlwZTogJHtlfWApfX1yZXR1cm4gcz9hKHMpOnR9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5QYXJzZXI9dC5MaW5lYXJpemF0aW9uPXQuTGV4ZXI9dm9pZCAwO2EoMTM5KTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgyKTt2YXIgcj1hKDE0NCksbj1hKDE1MCksaT1hKDE0OSkscz1hKDE1NCksbz1hKDE2NyksYz1hKDE2OSksbD1hKDE3MCksaD1hKDE3MiksdT1hKDE3MyksZD1hKDE3NiksZj1hKDE3OSksZz1hKDE4MSkscD1hKDE4MiksbT1hKDE4Myk7Y2xhc3MgUGFyc2Vye2NvbnN0cnVjdG9yKGUpe2xldHtsZXhlcjp0LHhyZWY6YSxhbGxvd1N0cmVhbXM6cj0hMSxyZWNvdmVyeU1vZGU6bj0hMX09ZTt0aGlzLmxleGVyPXQ7dGhpcy54cmVmPWE7dGhpcy5hbGxvd1N0cmVhbXM9cjt0aGlzLnJlY292ZXJ5TW9kZT1uO3RoaXMuaW1hZ2VDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuX2ltYWdlSWQ9MDt0aGlzLnJlZmlsbCgpfXJlZmlsbCgpe3RoaXMuYnVmMT10aGlzLmxleGVyLmdldE9iaigpO3RoaXMuYnVmMj10aGlzLmxleGVyLmdldE9iaigpfXNoaWZ0KCl7aWYodGhpcy5idWYyIGluc3RhbmNlb2Ygbi5DbWQmJiJJRCI9PT10aGlzLmJ1ZjIuY21kKXt0aGlzLmJ1ZjE9dGhpcy5idWYyO3RoaXMuYnVmMj1udWxsfWVsc2V7dGhpcy5idWYxPXRoaXMuYnVmMjt0aGlzLmJ1ZjI9dGhpcy5sZXhlci5nZXRPYmooKX19dHJ5U2hpZnQoKXt0cnl7dGhpcy5zaGlmdCgpO3JldHVybiEwfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBpLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7cmV0dXJuITF9fWdldE9iaigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO2NvbnN0IHQ9dGhpcy5idWYxO3RoaXMuc2hpZnQoKTtpZih0IGluc3RhbmNlb2Ygbi5DbWQpc3dpdGNoKHQuY21kKXtjYXNlIkJJIjpyZXR1cm4gdGhpcy5tYWtlSW5saW5lSW1hZ2UoZSk7Y2FzZSJbIjpjb25zdCBhPVtdO2Zvcig7ISgwLG4uaXNDbWQpKHRoaXMuYnVmMSwiXSIpJiZ0aGlzLmJ1ZjEhPT1uLkVPRjspYS5wdXNoKHRoaXMuZ2V0T2JqKGUpKTtpZih0aGlzLmJ1ZjE9PT1uLkVPRil7aWYodGhpcy5yZWNvdmVyeU1vZGUpcmV0dXJuIGE7dGhyb3cgbmV3IGkuUGFyc2VyRU9GRXhjZXB0aW9uKCJFbmQgb2YgZmlsZSBpbnNpZGUgYXJyYXkuIil9dGhpcy5zaGlmdCgpO3JldHVybiBhO2Nhc2UiPDwiOmNvbnN0IHM9bmV3IG4uRGljdCh0aGlzLnhyZWYpO2Zvcig7ISgwLG4uaXNDbWQpKHRoaXMuYnVmMSwiPj4iKSYmdGhpcy5idWYxIT09bi5FT0Y7KXtpZighKHRoaXMuYnVmMSBpbnN0YW5jZW9mIG4uTmFtZSkpeygwLHIuaW5mbykoIk1hbGZvcm1lZCBkaWN0aW9uYXJ5OiBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7dGhpcy5zaGlmdCgpO2NvbnRpbnVlfWNvbnN0IHQ9dGhpcy5idWYxLm5hbWU7dGhpcy5zaGlmdCgpO2lmKHRoaXMuYnVmMT09PW4uRU9GKWJyZWFrO3Muc2V0KHQsdGhpcy5nZXRPYmooZSkpfWlmKHRoaXMuYnVmMT09PW4uRU9GKXtpZih0aGlzLnJlY292ZXJ5TW9kZSlyZXR1cm4gczt0aHJvdyBuZXcgaS5QYXJzZXJFT0ZFeGNlcHRpb24oIkVuZCBvZiBmaWxlIGluc2lkZSBkaWN0aW9uYXJ5LiIpfWlmKCgwLG4uaXNDbWQpKHRoaXMuYnVmMiwic3RyZWFtIikpcmV0dXJuIHRoaXMuYWxsb3dTdHJlYW1zP3RoaXMubWFrZVN0cmVhbShzLGUpOnM7dGhpcy5zaGlmdCgpO3JldHVybiBzO2RlZmF1bHQ6cmV0dXJuIHR9aWYoTnVtYmVyLmlzSW50ZWdlcih0KSl7aWYoTnVtYmVyLmlzSW50ZWdlcih0aGlzLmJ1ZjEpJiYoMCxuLmlzQ21kKSh0aGlzLmJ1ZjIsIlIiKSl7Y29uc3QgZT1uLlJlZi5nZXQodCx0aGlzLmJ1ZjEpO3RoaXMuc2hpZnQoKTt0aGlzLnNoaWZ0KCk7cmV0dXJuIGV9cmV0dXJuIHR9cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZlP2UuZGVjcnlwdFN0cmluZyh0KTp0fWZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKGUpe2NvbnN0e2tub3duQ29tbWFuZHM6dH09dGhpcy5sZXhlcixhPWUucG9zO2xldCBvLGMsbD0wO2Zvcig7LTEhPT0obz1lLmdldEJ5dGUoKSk7KWlmKDA9PT1sKWw9Njk9PT1vPzE6MDtlbHNlIGlmKDE9PT1sKWw9NzM9PT1vPzI6MDtlbHNlIGlmKDMyPT09b3x8MTA9PT1vfHwxMz09PW8pe2M9ZS5wb3M7Y29uc3QgYT1lLnBlZWtCeXRlcygxNSksaT1hLmxlbmd0aDtpZigwPT09aSlicmVhaztmb3IobGV0IGU9MDtlPGk7ZSsrKXtvPWFbZV07aWYoKDAhPT1vfHwwPT09YVtlKzFdKSYmKDEwIT09byYmMTMhPT1vJiYobzwzMnx8bz4xMjcpKSl7bD0wO2JyZWFrfX1pZigyIT09bCljb250aW51ZTtpZighdCl7KDAsci53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQgLSBgbGV4ZXIua25vd25Db21tYW5kc2AgaXMgdW5kZWZpbmVkLiIpO2NvbnRpbnVlfWNvbnN0IGg9bmV3IExleGVyKG5ldyBzLlN0cmVhbShhLnNsaWNlKCkpLHQpO2guX2hleFN0cmluZ1dhcm49KCk9Pnt9O2xldCB1PTA7Zm9yKDs7KXtjb25zdCBlPWguZ2V0T2JqKCk7aWYoZT09PW4uRU9GKXtsPTA7YnJlYWt9aWYoZSBpbnN0YW5jZW9mIG4uQ21kKXtjb25zdCBhPXRbZS5jbWRdO2lmKCFhKXtsPTA7YnJlYWt9aWYoYS52YXJpYWJsZUFyZ3M/dTw9YS5udW1BcmdzOnU9PT1hLm51bUFyZ3MpYnJlYWs7dT0wfWVsc2UgdSsrfWlmKDI9PT1sKWJyZWFrfWVsc2UgbD0wO2lmKC0xPT09byl7KDAsci53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQ6IFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhvdXQgZmluZGluZyBhIHZhbGlkIEVJIG1hcmtlciIpO2lmKGMpeygwLHIud2FybikoJy4uLiB0cnlpbmcgdG8gcmVjb3ZlciBieSB1c2luZyB0aGUgbGFzdCAiRUkiIG9jY3VycmVuY2UuJyk7ZS5za2lwKC0oZS5wb3MtYykpfX1sZXQgaD00O2Uuc2tpcCgtaCk7bz1lLnBlZWtCeXRlKCk7ZS5za2lwKGgpOygwLGkuaXNXaGl0ZVNwYWNlKShvKXx8aC0tO3JldHVybiBlLnBvcy1oLWF9ZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChlKXtjb25zdCB0PWUucG9zO2xldCBhLG4saT0hMTtmb3IoOy0xIT09KGE9ZS5nZXRCeXRlKCkpOylpZigyNTU9PT1hKXtzd2l0Y2goZS5nZXRCeXRlKCkpe2Nhc2UgMDpicmVhaztjYXNlIDI1NTplLnNraXAoLTEpO2JyZWFrO2Nhc2UgMjE3Omk9ITA7YnJlYWs7Y2FzZSAxOTI6Y2FzZSAxOTM6Y2FzZSAxOTQ6Y2FzZSAxOTU6Y2FzZSAxOTc6Y2FzZSAxOTg6Y2FzZSAxOTk6Y2FzZSAyMDE6Y2FzZSAyMDI6Y2FzZSAyMDM6Y2FzZSAyMDU6Y2FzZSAyMDY6Y2FzZSAyMDc6Y2FzZSAxOTY6Y2FzZSAyMDQ6Y2FzZSAyMTg6Y2FzZSAyMTk6Y2FzZSAyMjA6Y2FzZSAyMjE6Y2FzZSAyMjI6Y2FzZSAyMjM6Y2FzZSAyMjQ6Y2FzZSAyMjU6Y2FzZSAyMjY6Y2FzZSAyMjc6Y2FzZSAyMjg6Y2FzZSAyMjk6Y2FzZSAyMzA6Y2FzZSAyMzE6Y2FzZSAyMzI6Y2FzZSAyMzM6Y2FzZSAyMzQ6Y2FzZSAyMzU6Y2FzZSAyMzY6Y2FzZSAyMzc6Y2FzZSAyMzg6Y2FzZSAyMzk6Y2FzZSAyNTQ6bj1lLmdldFVpbnQxNigpO24+Mj9lLnNraXAobi0yKTplLnNraXAoLTIpfWlmKGkpYnJlYWt9Y29uc3Qgcz1lLnBvcy10O2lmKC0xPT09YSl7KDAsci53YXJuKSgiSW5saW5lIERDVERlY29kZSBpbWFnZSBzdHJlYW06IEVPSSBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTtlLnNraXAoLXMpO3JldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKGUpfXRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKGUpO3JldHVybiBzfWZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKGUpe2NvbnN0IHQ9ZS5wb3M7bGV0IGE7Zm9yKDstMSE9PShhPWUuZ2V0Qnl0ZSgpKTspaWYoMTI2PT09YSl7Y29uc3QgdD1lLnBvczthPWUucGVla0J5dGUoKTtmb3IoOygwLGkuaXNXaGl0ZVNwYWNlKShhKTspe2Uuc2tpcCgpO2E9ZS5wZWVrQnl0ZSgpfWlmKDYyPT09YSl7ZS5za2lwKCk7YnJlYWt9aWYoZS5wb3M+dCl7Y29uc3QgdD1lLnBlZWtCeXRlcygyKTtpZig2OT09PXRbMF0mJjczPT09dFsxXSlicmVha319Y29uc3Qgbj1lLnBvcy10O2lmKC0xPT09YSl7KDAsci53YXJuKSgiSW5saW5lIEFTQ0lJODVEZWNvZGUgaW1hZ2Ugc3RyZWFtOiBFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7ZS5za2lwKC1uKTtyZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKX10aGlzLmlubGluZVN0cmVhbVNraXBFSShlKTtyZXR1cm4gbn1maW5kQVNDSUlIZXhEZWNvZGVJbmxpbmVTdHJlYW1FbmQoZSl7Y29uc3QgdD1lLnBvcztsZXQgYTtmb3IoOy0xIT09KGE9ZS5nZXRCeXRlKCkpJiY2MiE9PWE7KTtjb25zdCBuPWUucG9zLXQ7aWYoLTE9PT1hKXsoMCxyLndhcm4pKCJJbmxpbmUgQVNDSUlIZXhEZWNvZGUgaW1hZ2Ugc3RyZWFtOiBFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7ZS5za2lwKC1uKTtyZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKX10aGlzLmlubGluZVN0cmVhbVNraXBFSShlKTtyZXR1cm4gbn1pbmxpbmVTdHJlYW1Ta2lwRUkoZSl7bGV0IHQsYT0wO2Zvcig7LTEhPT0odD1lLmdldEJ5dGUoKSk7KWlmKDA9PT1hKWE9Njk9PT10PzE6MDtlbHNlIGlmKDE9PT1hKWE9NzM9PT10PzI6MDtlbHNlIGlmKDI9PT1hKWJyZWFrfW1ha2VJbmxpbmVJbWFnZShlKXtjb25zdCB0PXRoaXMubGV4ZXIsYT10LnN0cmVhbSxpPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHM7Zm9yKDshKDAsbi5pc0NtZCkodGhpcy5idWYxLCJJRCIpJiZ0aGlzLmJ1ZjEhPT1uLkVPRjspe2lmKCEodGhpcy5idWYxIGluc3RhbmNlb2Ygbi5OYW1lKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiRGljdGlvbmFyeSBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7Y29uc3QgdD10aGlzLmJ1ZjEubmFtZTt0aGlzLnNoaWZ0KCk7aWYodGhpcy5idWYxPT09bi5FT0YpYnJlYWs7aVt0XT10aGlzLmdldE9iaihlKX0tMSE9PXQuYmVnaW5JbmxpbmVJbWFnZVBvcyYmKHM9YS5wb3MtdC5iZWdpbklubGluZUltYWdlUG9zKTtjb25zdCBvPXRoaXMueHJlZi5mZXRjaElmUmVmKGkuRnx8aS5GaWx0ZXIpO2xldCBjO2lmKG8gaW5zdGFuY2VvZiBuLk5hbWUpYz1vLm5hbWU7ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pKXtjb25zdCBlPXRoaXMueHJlZi5mZXRjaElmUmVmKG9bMF0pO2UgaW5zdGFuY2VvZiBuLk5hbWUmJihjPWUubmFtZSl9Y29uc3QgbD1hLnBvcztsZXQgaCx1O3N3aXRjaChjKXtjYXNlIkRDVCI6Y2FzZSJEQ1REZWNvZGUiOmg9dGhpcy5maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKGEpO2JyZWFrO2Nhc2UiQTg1IjpjYXNlIkFTQ0lJODVEZWNvZGUiOmg9dGhpcy5maW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChhKTticmVhaztjYXNlIkFIeCI6Y2FzZSJBU0NJSUhleERlY29kZSI6aD10aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChhKTticmVhaztkZWZhdWx0Omg9dGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChhKX1pZihoPDFlMyYmcz4wKXtjb25zdCBlPWEucG9zO2EucG9zPXQuYmVnaW5JbmxpbmVJbWFnZVBvczt1PWZ1bmN0aW9uIGdldElubGluZUltYWdlQ2FjaGVLZXkoZSl7Y29uc3QgdD1bXSxhPWUubGVuZ3RoO2xldCByPTA7Zm9yKDtyPGEtMTspdC5wdXNoKGVbcisrXTw8OHxlW3IrK10pO3I8YSYmdC5wdXNoKGVbcl0pO3JldHVybiBhKyJfIitTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsdCl9KGEuZ2V0Qnl0ZXMocytoKSk7YS5wb3M9ZTtjb25zdCByPXRoaXMuaW1hZ2VDYWNoZVt1XTtpZih2b2lkIDAhPT1yKXt0aGlzLmJ1ZjI9bi5DbWQuZ2V0KCJFSSIpO3RoaXMuc2hpZnQoKTtyLnJlc2V0KCk7cmV0dXJuIHJ9fWNvbnN0IGQ9bmV3IG4uRGljdCh0aGlzLnhyZWYpO2Zvcihjb25zdCBlIGluIGkpZC5zZXQoZSxpW2VdKTtsZXQgZj1hLm1ha2VTdWJTdHJlYW0obCxoLGQpO2UmJihmPWUuY3JlYXRlU3RyZWFtKGYsaCkpO2Y9dGhpcy5maWx0ZXIoZixkLGgpO2YuZGljdD1kO2lmKHZvaWQgMCE9PXUpe2YuY2FjaGVLZXk9ImlubGluZV9pbWdfIisgKyt0aGlzLl9pbWFnZUlkO3RoaXMuaW1hZ2VDYWNoZVt1XT1mfXRoaXMuYnVmMj1uLkNtZC5nZXQoIkVJIik7dGhpcy5zaGlmdCgpO3JldHVybiBmfV9maW5kU3RyZWFtTGVuZ3RoKGUsdCl7Y29uc3R7c3RyZWFtOmF9PXRoaXMubGV4ZXI7YS5wb3M9ZTtjb25zdCByPXQubGVuZ3RoO2Zvcig7YS5wb3M8YS5lbmQ7KXtjb25zdCBuPWEucGVla0J5dGVzKDIwNDgpLGk9bi5sZW5ndGgtcjtpZihpPD0wKWJyZWFrO2xldCBzPTA7Zm9yKDtzPGk7KXtsZXQgaT0wO2Zvcig7aTxyJiZuW3MraV09PT10W2ldOylpKys7aWYoaT49cil7YS5wb3MrPXM7cmV0dXJuIGEucG9zLWV9cysrfWEucG9zKz1pfXJldHVybi0xfW1ha2VTdHJlYW0oZSx0KXtjb25zdCBhPXRoaXMubGV4ZXI7bGV0IHM9YS5zdHJlYW07YS5za2lwVG9OZXh0TGluZSgpO2NvbnN0IG89cy5wb3MtMTtsZXQgYz1lLmdldCgiTGVuZ3RoIik7aWYoIU51bWJlci5pc0ludGVnZXIoYykpeygwLHIuaW5mbykoYEJhZCBsZW5ndGggIiR7YyYmYy50b1N0cmluZygpfSIgaW4gc3RyZWFtLmApO2M9MH1zLnBvcz1vK2M7YS5uZXh0Q2hhcigpO2lmKHRoaXMudHJ5U2hpZnQoKSYmKDAsbi5pc0NtZCkodGhpcy5idWYyLCJlbmRzdHJlYW0iKSl0aGlzLnNoaWZ0KCk7ZWxzZXtjb25zdCBlPW5ldyBVaW50OEFycmF5KFsxMDEsMTEwLDEwMCwxMTUsMTE2LDExNCwxMDEsOTcsMTA5XSk7bGV0IHQ9dGhpcy5fZmluZFN0cmVhbUxlbmd0aChvLGUpO2lmKHQ8MCl7Y29uc3QgYT0xO2ZvcihsZXQgbj0xO248PWE7bisrKXtjb25zdCBhPWUubGVuZ3RoLW4sYz1lLnNsaWNlKDAsYSksbD10aGlzLl9maW5kU3RyZWFtTGVuZ3RoKG8sYyk7aWYobD49MCl7Y29uc3QgZT1zLnBlZWtCeXRlcyhhKzEpW2FdO2lmKCEoMCxpLmlzV2hpdGVTcGFjZSkoZSkpYnJlYWs7KDAsci5pbmZvKShgRm91bmQgIiR7KDAsci5ieXRlc1RvU3RyaW5nKShjKX0iIHdoZW4gc2VhcmNoaW5nIGZvciBlbmRzdHJlYW0gY29tbWFuZC5gKTt0PWw7YnJlYWt9fWlmKHQ8MCl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiTWlzc2luZyBlbmRzdHJlYW0gY29tbWFuZC4iKX1jPXQ7YS5uZXh0Q2hhcigpO3RoaXMuc2hpZnQoKTt0aGlzLnNoaWZ0KCl9dGhpcy5zaGlmdCgpO3M9cy5tYWtlU3ViU3RyZWFtKG8sYyxlKTt0JiYocz10LmNyZWF0ZVN0cmVhbShzLGMpKTtzPXRoaXMuZmlsdGVyKHMsZSxjKTtzLmRpY3Q9ZTtyZXR1cm4gc31maWx0ZXIoZSx0LGEpe2xldCBpPXQuZ2V0KCJGIiwiRmlsdGVyIikscz10LmdldCgiRFAiLCJEZWNvZGVQYXJtcyIpO2lmKGkgaW5zdGFuY2VvZiBuLk5hbWUpe0FycmF5LmlzQXJyYXkocykmJigwLHIud2FybikoIi9EZWNvZGVQYXJtcyBzaG91bGQgbm90IGJlIGFuIEFycmF5LCB3aGVuIC9GaWx0ZXIgaXMgYSBOYW1lLiIpO3JldHVybiB0aGlzLm1ha2VGaWx0ZXIoZSxpLm5hbWUsYSxzKX1sZXQgbz1hO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IHQ9aSxhPXM7Zm9yKGxldCBjPTAsbD10Lmxlbmd0aDtjPGw7KytjKXtpPXRoaXMueHJlZi5mZXRjaElmUmVmKHRbY10pO2lmKCEoaSBpbnN0YW5jZW9mIG4uTmFtZSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYEJhZCBmaWx0ZXIgbmFtZSAiJHtpfSJgKTtzPW51bGw7QXJyYXkuaXNBcnJheShhKSYmYyBpbiBhJiYocz10aGlzLnhyZWYuZmV0Y2hJZlJlZihhW2NdKSk7ZT10aGlzLm1ha2VGaWx0ZXIoZSxpLm5hbWUsbyxzKTtvPW51bGx9fXJldHVybiBlfW1ha2VGaWx0ZXIoZSx0LGEsbil7aWYoMD09PWEpeygwLHIud2FybikoYEVtcHR5ICIke3R9IiBzdHJlYW0uYCk7cmV0dXJuIG5ldyBzLk51bGxTdHJlYW19dHJ5e3N3aXRjaCh0KXtjYXNlIkZsIjpjYXNlIkZsYXRlRGVjb2RlIjpyZXR1cm4gbj9uZXcgcC5QcmVkaWN0b3JTdHJlYW0obmV3IGguRmxhdGVTdHJlYW0oZSxhKSxhLG4pOm5ldyBoLkZsYXRlU3RyZWFtKGUsYSk7Y2FzZSJMWlciOmNhc2UiTFpXRGVjb2RlIjpsZXQgdD0xO2lmKG4pe24uaGFzKCJFYXJseUNoYW5nZSIpJiYodD1uLmdldCgiRWFybHlDaGFuZ2UiKSk7cmV0dXJuIG5ldyBwLlByZWRpY3RvclN0cmVhbShuZXcgZy5MWldTdHJlYW0oZSxhLHQpLGEsbil9cmV0dXJuIG5ldyBnLkxaV1N0cmVhbShlLGEsdCk7Y2FzZSJEQ1QiOmNhc2UiRENURGVjb2RlIjpyZXR1cm4gbmV3IGQuSnBlZ1N0cmVhbShlLGEsbik7Y2FzZSJKUFgiOmNhc2UiSlBYRGVjb2RlIjpyZXR1cm4gbmV3IGYuSnB4U3RyZWFtKGUsYSxuKTtjYXNlIkE4NSI6Y2FzZSJBU0NJSTg1RGVjb2RlIjpyZXR1cm4gbmV3IG8uQXNjaWk4NVN0cmVhbShlLGEpO2Nhc2UiQUh4IjpjYXNlIkFTQ0lJSGV4RGVjb2RlIjpyZXR1cm4gbmV3IGMuQXNjaWlIZXhTdHJlYW0oZSxhKTtjYXNlIkNDRiI6Y2FzZSJDQ0lUVEZheERlY29kZSI6cmV0dXJuIG5ldyBsLkNDSVRURmF4U3RyZWFtKGUsYSxuKTtjYXNlIlJMIjpjYXNlIlJ1bkxlbmd0aERlY29kZSI6cmV0dXJuIG5ldyBtLlJ1bkxlbmd0aFN0cmVhbShlLGEpO2Nhc2UiSkJJRzJEZWNvZGUiOnJldHVybiBuZXcgdS5KYmlnMlN0cmVhbShlLGEsbil9KDAsci53YXJuKShgRmlsdGVyICIke3R9IiBpcyBub3Qgc3VwcG9ydGVkLmApO3JldHVybiBlfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBpLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsci53YXJuKShgSW52YWxpZCBzdHJlYW06ICIke2V9ImApO3JldHVybiBuZXcgcy5OdWxsU3RyZWFtfX19dC5QYXJzZXI9UGFyc2VyO2NvbnN0IGI9WzEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMiwwLDAsMiwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdO2Z1bmN0aW9uIHRvSGV4RGlnaXQoZSl7cmV0dXJuIGU+PTQ4JiZlPD01Nz8xNSZlOmU+PTY1JiZlPD03MHx8ZT49OTcmJmU8PTEwMj85KygxNSZlKTotMX1jbGFzcyBMZXhlcntjb25zdHJ1Y3RvcihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbDt0aGlzLnN0cmVhbT1lO3RoaXMubmV4dENoYXIoKTt0aGlzLnN0ckJ1Zj1bXTt0aGlzLmtub3duQ29tbWFuZHM9dDt0aGlzLl9oZXhTdHJpbmdOdW1XYXJuPTA7dGhpcy5iZWdpbklubGluZUltYWdlUG9zPS0xfW5leHRDaGFyKCl7cmV0dXJuIHRoaXMuY3VycmVudENoYXI9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpfXBlZWtDaGFyKCl7cmV0dXJuIHRoaXMuc3RyZWFtLnBlZWtCeXRlKCl9Z2V0TnVtYmVyKCl7bGV0IGU9dGhpcy5jdXJyZW50Q2hhcix0PSExLGE9MCxuPTE7aWYoNDU9PT1lKXtuPS0xO2U9dGhpcy5uZXh0Q2hhcigpOzQ1PT09ZSYmKGU9dGhpcy5uZXh0Q2hhcigpKX1lbHNlIDQzPT09ZSYmKGU9dGhpcy5uZXh0Q2hhcigpKTtpZigxMD09PWV8fDEzPT09ZSlkb3tlPXRoaXMubmV4dENoYXIoKX13aGlsZSgxMD09PWV8fDEzPT09ZSk7aWYoNDY9PT1lKXthPTEwO2U9dGhpcy5uZXh0Q2hhcigpfWlmKGU8NDh8fGU+NTcpe2NvbnN0IHQ9YEludmFsaWQgbnVtYmVyOiAke1N0cmluZy5mcm9tQ2hhckNvZGUoZSl9IChjaGFyQ29kZSAke2V9KWA7aWYoKDAsaS5pc1doaXRlU3BhY2UpKGUpfHwtMT09PWUpeygwLHIuaW5mbykoYExleGVyLmdldE51bWJlciAtICIke3R9Ii5gKTtyZXR1cm4gMH10aHJvdyBuZXcgci5Gb3JtYXRFcnJvcih0KX1sZXQgcz1lLTQ4LG89MCxjPTE7Zm9yKDsoZT10aGlzLm5leHRDaGFyKCkpPj0wOylpZihlPj00OCYmZTw9NTcpe2NvbnN0IHI9ZS00ODtpZih0KW89MTAqbytyO2Vsc2V7MCE9PWEmJihhKj0xMCk7cz0xMCpzK3J9fWVsc2UgaWYoNDY9PT1lKXtpZigwIT09YSlicmVhazthPTF9ZWxzZSBpZig0NT09PWUpKDAsci53YXJuKSgiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlIik7ZWxzZXtpZig2OSE9PWUmJjEwMSE9PWUpYnJlYWs7ZT10aGlzLnBlZWtDaGFyKCk7aWYoNDM9PT1lfHw0NT09PWUpe2M9NDU9PT1lPy0xOjE7dGhpcy5uZXh0Q2hhcigpfWVsc2UgaWYoZTw0OHx8ZT41NylicmVhazt0PSEwfTAhPT1hJiYocy89YSk7dCYmKHMqPTEwKiooYypvKSk7cmV0dXJuIG4qc31nZXRTdHJpbmcoKXtsZXQgZT0xLHQ9ITE7Y29uc3QgYT10aGlzLnN0ckJ1ZjthLmxlbmd0aD0wO2xldCBuPXRoaXMubmV4dENoYXIoKTtmb3IoOzspe2xldCBpPSExO3N3aXRjaCgwfG4pe2Nhc2UtMTooMCxyLndhcm4pKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7dD0hMDticmVhaztjYXNlIDQwOisrZTthLnB1c2goIigiKTticmVhaztjYXNlIDQxOmlmKDA9PS0tZSl7dGhpcy5uZXh0Q2hhcigpO3Q9ITB9ZWxzZSBhLnB1c2goIikiKTticmVhaztjYXNlIDkyOm49dGhpcy5uZXh0Q2hhcigpO3N3aXRjaChuKXtjYXNlLTE6KDAsci53YXJuKSgiVW50ZXJtaW5hdGVkIHN0cmluZyIpO3Q9ITA7YnJlYWs7Y2FzZSAxMTA6YS5wdXNoKCJcbiIpO2JyZWFrO2Nhc2UgMTE0OmEucHVzaCgiXHIiKTticmVhaztjYXNlIDExNjphLnB1c2goIlx0Iik7YnJlYWs7Y2FzZSA5ODphLnB1c2goIlxiIik7YnJlYWs7Y2FzZSAxMDI6YS5wdXNoKCJcZiIpO2JyZWFrO2Nhc2UgOTI6Y2FzZSA0MDpjYXNlIDQxOmEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKG4pKTticmVhaztjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6bGV0IGU9MTUmbjtuPXRoaXMubmV4dENoYXIoKTtpPSEwO2lmKG4+PTQ4JiZuPD01NSl7ZT0oZTw8MykrKDE1Jm4pO249dGhpcy5uZXh0Q2hhcigpO2lmKG4+PTQ4JiZuPD01NSl7aT0hMTtlPShlPDwzKSsoMTUmbil9fWEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTticmVhaztjYXNlIDEzOjEwPT09dGhpcy5wZWVrQ2hhcigpJiZ0aGlzLm5leHRDaGFyKCk7YnJlYWs7Y2FzZSAxMDpicmVhaztkZWZhdWx0OmEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKG4pKX1icmVhaztkZWZhdWx0OmEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKG4pKX1pZih0KWJyZWFrO2l8fChuPXRoaXMubmV4dENoYXIoKSl9cmV0dXJuIGEuam9pbigiIil9Z2V0TmFtZSgpe2xldCBlLHQ7Y29uc3QgYT10aGlzLnN0ckJ1ZjthLmxlbmd0aD0wO2Zvcig7KGU9dGhpcy5uZXh0Q2hhcigpKT49MCYmIWJbZV07KWlmKDM1PT09ZSl7ZT10aGlzLm5leHRDaGFyKCk7aWYoYltlXSl7KDAsci53YXJuKSgiTGV4ZXJfZ2V0TmFtZTogTlVNQkVSIFNJR04gKCMpIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsIG51bWJlci4iKTthLnB1c2goIiMiKTticmVha31jb25zdCBuPXRvSGV4RGlnaXQoZSk7aWYoLTEhPT1uKXt0PWU7ZT10aGlzLm5leHRDaGFyKCk7Y29uc3QgaT10b0hleERpZ2l0KGUpO2lmKC0xPT09aSl7KDAsci53YXJuKShgTGV4ZXJfZ2V0TmFtZTogSWxsZWdhbCBkaWdpdCAoJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSkgaW4gaGV4YWRlY2ltYWwgbnVtYmVyLmApO2EucHVzaCgiIyIsU3RyaW5nLmZyb21DaGFyQ29kZSh0KSk7aWYoYltlXSlicmVhazthLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7Y29udGludWV9YS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUobjw8NHxpKSl9ZWxzZSBhLnB1c2goIiMiLFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfWVsc2UgYS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpO2EubGVuZ3RoPjEyNyYmKDAsci53YXJuKShgTmFtZSB0b2tlbiBpcyBsb25nZXIgdGhhbiBhbGxvd2VkIGJ5IHRoZSBzcGVjOiAke2EubGVuZ3RofWApO3JldHVybiBuLk5hbWUuZ2V0KGEuam9pbigiIikpfV9oZXhTdHJpbmdXYXJuKGUpezUhPXRoaXMuX2hleFN0cmluZ051bVdhcm4rKz90aGlzLl9oZXhTdHJpbmdOdW1XYXJuPjV8fCgwLHIud2FybikoYGdldEhleFN0cmluZyAtIGlnbm9yaW5nIGludmFsaWQgY2hhcmFjdGVyOiAke2V9YCk6KDAsci53YXJuKSgiZ2V0SGV4U3RyaW5nIC0gaWdub3JpbmcgYWRkaXRpb25hbCBpbnZhbGlkIGNoYXJhY3RlcnMuIil9Z2V0SGV4U3RyaW5nKCl7Y29uc3QgZT10aGlzLnN0ckJ1ZjtlLmxlbmd0aD0wO2xldCB0LGEsbj10aGlzLmN1cnJlbnRDaGFyLGk9ITA7dGhpcy5faGV4U3RyaW5nTnVtV2Fybj0wO2Zvcig7Oyl7aWYobjwwKXsoMCxyLndhcm4pKCJVbnRlcm1pbmF0ZWQgaGV4IHN0cmluZyIpO2JyZWFrfWlmKDYyPT09bil7dGhpcy5uZXh0Q2hhcigpO2JyZWFrfWlmKDEhPT1iW25dKXtpZihpKXt0PXRvSGV4RGlnaXQobik7aWYoLTE9PT10KXt0aGlzLl9oZXhTdHJpbmdXYXJuKG4pO249dGhpcy5uZXh0Q2hhcigpO2NvbnRpbnVlfX1lbHNle2E9dG9IZXhEaWdpdChuKTtpZigtMT09PWEpe3RoaXMuX2hleFN0cmluZ1dhcm4obik7bj10aGlzLm5leHRDaGFyKCk7Y29udGludWV9ZS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUodDw8NHxhKSl9aT0haTtuPXRoaXMubmV4dENoYXIoKX1lbHNlIG49dGhpcy5uZXh0Q2hhcigpfXJldHVybiBlLmpvaW4oIiIpfWdldE9iaigpe2xldCBlPSExLHQ9dGhpcy5jdXJyZW50Q2hhcjtmb3IoOzspe2lmKHQ8MClyZXR1cm4gbi5FT0Y7aWYoZSkxMCE9PXQmJjEzIT09dHx8KGU9ITEpO2Vsc2UgaWYoMzc9PT10KWU9ITA7ZWxzZSBpZigxIT09Ylt0XSlicmVhazt0PXRoaXMubmV4dENoYXIoKX1zd2l0Y2goMHx0KXtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OmNhc2UgNDM6Y2FzZSA0NTpjYXNlIDQ2OnJldHVybiB0aGlzLmdldE51bWJlcigpO2Nhc2UgNDA6cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCk7Y2FzZSA0NzpyZXR1cm4gdGhpcy5nZXROYW1lKCk7Y2FzZSA5MTp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIG4uQ21kLmdldCgiWyIpO2Nhc2UgOTM6dGhpcy5uZXh0Q2hhcigpO3JldHVybiBuLkNtZC5nZXQoIl0iKTtjYXNlIDYwOnQ9dGhpcy5uZXh0Q2hhcigpO2lmKDYwPT09dCl7dGhpcy5uZXh0Q2hhcigpO3JldHVybiBuLkNtZC5nZXQoIjw8Iil9cmV0dXJuIHRoaXMuZ2V0SGV4U3RyaW5nKCk7Y2FzZSA2Mjp0PXRoaXMubmV4dENoYXIoKTtpZig2Mj09PXQpe3RoaXMubmV4dENoYXIoKTtyZXR1cm4gbi5DbWQuZ2V0KCI+PiIpfXJldHVybiBuLkNtZC5nZXQoIj4iKTtjYXNlIDEyMzp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIG4uQ21kLmdldCgieyIpO2Nhc2UgMTI1OnRoaXMubmV4dENoYXIoKTtyZXR1cm4gbi5DbWQuZ2V0KCJ9Iik7Y2FzZSA0MTp0aGlzLm5leHRDaGFyKCk7dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYElsbGVnYWwgY2hhcmFjdGVyOiAke3R9YCl9bGV0IGE9U3RyaW5nLmZyb21DaGFyQ29kZSh0KTtpZih0PDMyfHx0PjEyNyl7Y29uc3QgZT10aGlzLnBlZWtDaGFyKCk7aWYoZT49MzImJmU8PTEyNyl7dGhpcy5uZXh0Q2hhcigpO3JldHVybiBuLkNtZC5nZXQoYSl9fWNvbnN0IGk9dGhpcy5rbm93bkNvbW1hbmRzO2xldCBzPXZvaWQgMCE9PWk/LlthXTtmb3IoOyh0PXRoaXMubmV4dENoYXIoKSk+PTAmJiFiW3RdOyl7Y29uc3QgZT1hK1N0cmluZy5mcm9tQ2hhckNvZGUodCk7aWYocyYmdm9pZCAwPT09aVtlXSlicmVhaztpZigxMjg9PT1hLmxlbmd0aCl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHthLmxlbmd0aH1gKTthPWU7cz12b2lkIDAhPT1pPy5bYV19aWYoInRydWUiPT09YSlyZXR1cm4hMDtpZigiZmFsc2UiPT09YSlyZXR1cm4hMTtpZigibnVsbCI9PT1hKXJldHVybiBudWxsOyJCSSI9PT1hJiYodGhpcy5iZWdpbklubGluZUltYWdlUG9zPXRoaXMuc3RyZWFtLnBvcyk7cmV0dXJuIG4uQ21kLmdldChhKX1za2lwVG9OZXh0TGluZSgpe2xldCBlPXRoaXMuY3VycmVudENoYXI7Zm9yKDtlPj0wOyl7aWYoMTM9PT1lKXtlPXRoaXMubmV4dENoYXIoKTsxMD09PWUmJnRoaXMubmV4dENoYXIoKTticmVha31pZigxMD09PWUpe3RoaXMubmV4dENoYXIoKTticmVha31lPXRoaXMubmV4dENoYXIoKX19fXQuTGV4ZXI9TGV4ZXI7dC5MaW5lYXJpemF0aW9uPWNsYXNzIExpbmVhcml6YXRpb257c3RhdGljIGNyZWF0ZShlKXtmdW5jdGlvbiBnZXRJbnQoZSx0KXtsZXQgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO2NvbnN0IHI9ZS5nZXQodCk7aWYoTnVtYmVyLmlzSW50ZWdlcihyKSYmKGE/cj49MDpyPjApKXJldHVybiByO3Rocm93IG5ldyBFcnJvcihgVGhlICIke3R9IiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLmApfWNvbnN0IHQ9bmV3IFBhcnNlcih7bGV4ZXI6bmV3IExleGVyKGUpLHhyZWY6bnVsbH0pLGE9dC5nZXRPYmooKSxyPXQuZ2V0T2JqKCksaT10LmdldE9iaigpLHM9dC5nZXRPYmooKTtsZXQgbyxjO2lmKCEoTnVtYmVyLmlzSW50ZWdlcihhKSYmTnVtYmVyLmlzSW50ZWdlcihyKSYmKDAsbi5pc0NtZCkoaSwib2JqIikmJnMgaW5zdGFuY2VvZiBuLkRpY3QmJiJudW1iZXIiPT10eXBlb2Yobz1zLmdldCgiTGluZWFyaXplZCIpKSYmbz4wKSlyZXR1cm4gbnVsbDtpZigoYz1nZXRJbnQocywiTCIpKSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcignVGhlICJMIiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2VzIG5vdCBlcXVhbCB0aGUgc3RyZWFtIGxlbmd0aC4nKTtyZXR1cm57bGVuZ3RoOmMsaGludHM6ZnVuY3Rpb24gZ2V0SGludHMoZSl7Y29uc3QgdD1lLmdldCgiSCIpO2xldCBhO2lmKEFycmF5LmlzQXJyYXkodCkmJigyPT09KGE9dC5sZW5ndGgpfHw0PT09YSkpe2ZvcihsZXQgZT0wO2U8YTtlKyspe2NvbnN0IGE9dFtlXTtpZighKE51bWJlci5pc0ludGVnZXIoYSkmJmE+MCkpdGhyb3cgbmV3IEVycm9yKGBIaW50ICgke2V9KSBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuYCl9cmV0dXJuIHR9dGhyb3cgbmV3IEVycm9yKCJIaW50IGFycmF5IGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKX0ocyksb2JqZWN0TnVtYmVyRmlyc3Q6Z2V0SW50KHMsIk8iKSxlbmRGaXJzdDpnZXRJbnQocywiRSIpLG51bVBhZ2VzOmdldEludChzLCJOIiksbWFpblhSZWZFbnRyaWVzT2Zmc2V0OmdldEludChzLCJUIikscGFnZUZpcnN0OnMuaGFzKCJQIik/Z2V0SW50KHMsIlAiLCEwKTowfX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkFzY2lpODVTdHJlYW09dm9pZCAwO2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTt2YXIgcj1hKDE2OCksbj1hKDE0OSk7Y2xhc3MgQXNjaWk4NVN0cmVhbSBleHRlbmRzIHIuRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCl7dCYmKHQqPS44KTtzdXBlcih0KTt0aGlzLnN0cj1lO3RoaXMuZGljdD1lLmRpY3Q7dGhpcy5pbnB1dD1uZXcgVWludDhBcnJheSg1KX1yZWFkQmxvY2soKXtjb25zdCBlPXRoaXMuc3RyO2xldCB0PWUuZ2V0Qnl0ZSgpO2Zvcig7KDAsbi5pc1doaXRlU3BhY2UpKHQpOyl0PWUuZ2V0Qnl0ZSgpO2lmKC0xPT09dHx8MTI2PT09dCl7dGhpcy5lb2Y9ITA7cmV0dXJufWNvbnN0IGE9dGhpcy5idWZmZXJMZW5ndGg7bGV0IHIsaTtpZigxMjI9PT10KXtyPXRoaXMuZW5zdXJlQnVmZmVyKGErNCk7Zm9yKGk9MDtpPDQ7KytpKXJbYStpXT0wO3RoaXMuYnVmZmVyTGVuZ3RoKz00fWVsc2V7Y29uc3Qgcz10aGlzLmlucHV0O3NbMF09dDtmb3IoaT0xO2k8NTsrK2kpe3Q9ZS5nZXRCeXRlKCk7Zm9yKDsoMCxuLmlzV2hpdGVTcGFjZSkodCk7KXQ9ZS5nZXRCeXRlKCk7c1tpXT10O2lmKC0xPT09dHx8MTI2PT09dClicmVha31yPXRoaXMuZW5zdXJlQnVmZmVyKGEraS0xKTt0aGlzLmJ1ZmZlckxlbmd0aCs9aS0xO2lmKGk8NSl7Zm9yKDtpPDU7KytpKXNbaV09MTE3O3RoaXMuZW9mPSEwfWxldCBvPTA7Zm9yKGk9MDtpPDU7KytpKW89ODUqbysoc1tpXS0zMyk7Zm9yKGk9MztpPj0wOy0taSl7clthK2ldPTI1NSZvO28+Pj04fX19fXQuQXNjaWk4NVN0cmVhbT1Bc2NpaTg1U3RyZWFtfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlN0cmVhbXNTZXF1ZW5jZVN0cmVhbT10LkRlY29kZVN0cmVhbT12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO2EoMTM5KTt2YXIgcj1hKDE1MSksbj1hKDE1NCk7Y29uc3QgaT1uZXcgVWludDhBcnJheSgwKTtjbGFzcyBEZWNvZGVTdHJlYW0gZXh0ZW5kcyByLkJhc2VTdHJlYW17Y29uc3RydWN0b3IoZSl7c3VwZXIoKTt0aGlzLl9yYXdNaW5CdWZmZXJMZW5ndGg9ZXx8MDt0aGlzLnBvcz0wO3RoaXMuYnVmZmVyTGVuZ3RoPTA7dGhpcy5lb2Y9ITE7dGhpcy5idWZmZXI9aTt0aGlzLm1pbkJ1ZmZlckxlbmd0aD01MTI7aWYoZSlmb3IoO3RoaXMubWluQnVmZmVyTGVuZ3RoPGU7KXRoaXMubWluQnVmZmVyTGVuZ3RoKj0yfWdldCBpc0VtcHR5KCl7Zm9yKDshdGhpcy5lb2YmJjA9PT10aGlzLmJ1ZmZlckxlbmd0aDspdGhpcy5yZWFkQmxvY2soKTtyZXR1cm4gMD09PXRoaXMuYnVmZmVyTGVuZ3RofWVuc3VyZUJ1ZmZlcihlKXtjb25zdCB0PXRoaXMuYnVmZmVyO2lmKGU8PXQuYnl0ZUxlbmd0aClyZXR1cm4gdDtsZXQgYT10aGlzLm1pbkJ1ZmZlckxlbmd0aDtmb3IoO2E8ZTspYSo9Mjtjb25zdCByPW5ldyBVaW50OEFycmF5KGEpO3Iuc2V0KHQpO3JldHVybiB0aGlzLmJ1ZmZlcj1yfWdldEJ5dGUoKXtjb25zdCBlPXRoaXMucG9zO2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8PWU7KXtpZih0aGlzLmVvZilyZXR1cm4tMTt0aGlzLnJlYWRCbG9jaygpfXJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXX1nZXRCeXRlcyhlKXtjb25zdCB0PXRoaXMucG9zO2xldCBhO2lmKGUpe3RoaXMuZW5zdXJlQnVmZmVyKHQrZSk7YT10K2U7Zm9yKDshdGhpcy5lb2YmJnRoaXMuYnVmZmVyTGVuZ3RoPGE7KXRoaXMucmVhZEJsb2NrKCk7Y29uc3Qgcj10aGlzLmJ1ZmZlckxlbmd0aDthPnImJihhPXIpfWVsc2V7Zm9yKDshdGhpcy5lb2Y7KXRoaXMucmVhZEJsb2NrKCk7YT10aGlzLmJ1ZmZlckxlbmd0aH10aGlzLnBvcz1hO3JldHVybiB0aGlzLmJ1ZmZlci5zdWJhcnJheSh0LGEpfXJlc2V0KCl7dGhpcy5wb3M9MH1tYWtlU3ViU3RyZWFtKGUsdCl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7aWYodm9pZCAwPT09dClmb3IoOyF0aGlzLmVvZjspdGhpcy5yZWFkQmxvY2soKTtlbHNle2NvbnN0IGE9ZSt0O2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8PWEmJiF0aGlzLmVvZjspdGhpcy5yZWFkQmxvY2soKX1yZXR1cm4gbmV3IG4uU3RyZWFtKHRoaXMuYnVmZmVyLGUsdCxhKX1nZXRCYXNlU3RyZWFtcygpe3JldHVybiB0aGlzLnN0cj90aGlzLnN0ci5nZXRCYXNlU3RyZWFtcygpOm51bGx9fXQuRGVjb2RlU3RyZWFtPURlY29kZVN0cmVhbTt0LlN0cmVhbXNTZXF1ZW5jZVN0cmVhbT1jbGFzcyBTdHJlYW1zU2VxdWVuY2VTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwsYT0wO2Zvcihjb25zdCB0IG9mIGUpYSs9dCBpbnN0YW5jZW9mIERlY29kZVN0cmVhbT90Ll9yYXdNaW5CdWZmZXJMZW5ndGg6dC5sZW5ndGg7c3VwZXIoYSk7dGhpcy5zdHJlYW1zPWU7dGhpcy5fb25FcnJvcj10fXJlYWRCbG9jaygpe2NvbnN0IGU9dGhpcy5zdHJlYW1zO2lmKDA9PT1lLmxlbmd0aCl7dGhpcy5lb2Y9ITA7cmV0dXJufWNvbnN0IHQ9ZS5zaGlmdCgpO2xldCBhO3RyeXthPXQuZ2V0Qnl0ZXMoKX1jYXRjaChlKXtpZih0aGlzLl9vbkVycm9yKXt0aGlzLl9vbkVycm9yKGUsdC5kaWN0Py5vYmpJZCk7cmV0dXJufXRocm93IGV9Y29uc3Qgcj10aGlzLmJ1ZmZlckxlbmd0aCxuPXIrYS5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXIobikuc2V0KGEscik7dGhpcy5idWZmZXJMZW5ndGg9bn1nZXRCYXNlU3RyZWFtcygpe2NvbnN0IGU9W107Zm9yKGNvbnN0IHQgb2YgdGhpcy5zdHJlYW1zKXtjb25zdCBhPXQuZ2V0QmFzZVN0cmVhbXMoKTthJiZlLnB1c2goLi4uYSl9cmV0dXJuIGUubGVuZ3RoPjA/ZTpudWxsfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQXNjaWlIZXhTdHJlYW09dm9pZCAwO3ZhciByPWEoMTY4KTtjbGFzcyBBc2NpaUhleFN0cmVhbSBleHRlbmRzIHIuRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCl7dCYmKHQqPS41KTtzdXBlcih0KTt0aGlzLnN0cj1lO3RoaXMuZGljdD1lLmRpY3Q7dGhpcy5maXJzdERpZ2l0PS0xfXJlYWRCbG9jaygpe2NvbnN0IGU9dGhpcy5zdHIuZ2V0Qnl0ZXMoOGUzKTtpZighZS5sZW5ndGgpe3RoaXMuZW9mPSEwO3JldHVybn1jb25zdCB0PWUubGVuZ3RoKzE+PjEsYT10aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCt0KTtsZXQgcj10aGlzLmJ1ZmZlckxlbmd0aCxuPXRoaXMuZmlyc3REaWdpdDtmb3IoY29uc3QgdCBvZiBlKXtsZXQgZTtpZih0Pj00OCYmdDw9NTcpZT0xNSZ0O2Vsc2V7aWYoISh0Pj02NSYmdDw9NzB8fHQ+PTk3JiZ0PD0xMDIpKXtpZig2Mj09PXQpe3RoaXMuZW9mPSEwO2JyZWFrfWNvbnRpbnVlfWU9OSsoMTUmdCl9aWYobjwwKW49ZTtlbHNle2FbcisrXT1uPDw0fGU7bj0tMX19aWYobj49MCYmdGhpcy5lb2Ype2FbcisrXT1uPDw0O249LTF9dGhpcy5maXJzdERpZ2l0PW47dGhpcy5idWZmZXJMZW5ndGg9cn19dC5Bc2NpaUhleFN0cmVhbT1Bc2NpaUhleFN0cmVhbX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5DQ0lUVEZheFN0cmVhbT12b2lkIDA7dmFyIHI9YSgxNzEpLG49YSgxNjgpLGk9YSgxNTApO2NsYXNzIENDSVRURmF4U3RyZWFtIGV4dGVuZHMgbi5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKHQpO3RoaXMuc3RyPWU7dGhpcy5kaWN0PWUuZGljdDthIGluc3RhbmNlb2YgaS5EaWN0fHwoYT1pLkRpY3QuZW1wdHkpO2NvbnN0IG49e25leHQ6KCk9PmUuZ2V0Qnl0ZSgpfTt0aGlzLmNjaXR0RmF4RGVjb2Rlcj1uZXcgci5DQ0lUVEZheERlY29kZXIobix7SzphLmdldCgiSyIpLEVuZE9mTGluZTphLmdldCgiRW5kT2ZMaW5lIiksRW5jb2RlZEJ5dGVBbGlnbjphLmdldCgiRW5jb2RlZEJ5dGVBbGlnbiIpLENvbHVtbnM6YS5nZXQoIkNvbHVtbnMiKSxSb3dzOmEuZ2V0KCJSb3dzIiksRW5kT2ZCbG9jazphLmdldCgiRW5kT2ZCbG9jayIpLEJsYWNrSXMxOmEuZ2V0KCJCbGFja0lzMSIpfSl9cmVhZEJsb2NrKCl7Zm9yKDshdGhpcy5lb2Y7KXtjb25zdCBlPXRoaXMuY2NpdHRGYXhEZWNvZGVyLnJlYWROZXh0Q2hhcigpO2lmKC0xPT09ZSl7dGhpcy5lb2Y9ITA7cmV0dXJufXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoKzEpO3RoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWV9fX10LkNDSVRURmF4U3RyZWFtPUNDSVRURmF4U3RyZWFtfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkNDSVRURmF4RGVjb2Rlcj12b2lkIDA7YSgyKTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7dmFyIHI9YSgxNDQpO2NvbnN0IG49LTEsaT1bWy0xLC0xXSxbLTEsLTFdLFs3LDhdLFs3LDddLFs2LDZdLFs2LDZdLFs2LDVdLFs2LDVdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdXSxzPVtbLTEsLTFdLFsxMiwtMl0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjExMl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjMwNF0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjQzMl0sWzEyLDI0OTZdLFsxMiwyNTYwXV0sbz1bWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbOCwyOV0sWzgsMjldLFs4LDMwXSxbOCwzMF0sWzgsNDVdLFs4LDQ1XSxbOCw0Nl0sWzgsNDZdLFs3LDIyXSxbNywyMl0sWzcsMjJdLFs3LDIyXSxbNywyM10sWzcsMjNdLFs3LDIzXSxbNywyM10sWzgsNDddLFs4LDQ3XSxbOCw0OF0sWzgsNDhdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzcsMjBdLFs3LDIwXSxbNywyMF0sWzcsMjBdLFs4LDMzXSxbOCwzM10sWzgsMzRdLFs4LDM0XSxbOCwzNV0sWzgsMzVdLFs4LDM2XSxbOCwzNl0sWzgsMzddLFs4LDM3XSxbOCwzOF0sWzgsMzhdLFs3LDE5XSxbNywxOV0sWzcsMTldLFs3LDE5XSxbOCwzMV0sWzgsMzFdLFs4LDMyXSxbOCwzMl0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbOCw1M10sWzgsNTNdLFs4LDU0XSxbOCw1NF0sWzcsMjZdLFs3LDI2XSxbNywyNl0sWzcsMjZdLFs4LDM5XSxbOCwzOV0sWzgsNDBdLFs4LDQwXSxbOCw0MV0sWzgsNDFdLFs4LDQyXSxbOCw0Ml0sWzgsNDNdLFs4LDQzXSxbOCw0NF0sWzgsNDRdLFs3LDIxXSxbNywyMV0sWzcsMjFdLFs3LDIxXSxbNywyOF0sWzcsMjhdLFs3LDI4XSxbNywyOF0sWzgsNjFdLFs4LDYxXSxbOCw2Ml0sWzgsNjJdLFs4LDYzXSxbOCw2M10sWzgsMF0sWzgsMF0sWzgsMzIwXSxbOCwzMjBdLFs4LDM4NF0sWzgsMzg0XSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs3LDI3XSxbNywyN10sWzcsMjddLFs3LDI3XSxbOCw1OV0sWzgsNTldLFs4LDYwXSxbOCw2MF0sWzksMTQ3Ml0sWzksMTUzNl0sWzksMTYwMF0sWzksMTcyOF0sWzcsMThdLFs3LDE4XSxbNywxOF0sWzcsMThdLFs3LDI0XSxbNywyNF0sWzcsMjRdLFs3LDI0XSxbOCw0OV0sWzgsNDldLFs4LDUwXSxbOCw1MF0sWzgsNTFdLFs4LDUxXSxbOCw1Ml0sWzgsNTJdLFs3LDI1XSxbNywyNV0sWzcsMjVdLFs3LDI1XSxbOCw1NV0sWzgsNTVdLFs4LDU2XSxbOCw1Nl0sWzgsNTddLFs4LDU3XSxbOCw1OF0sWzgsNThdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbOCw0NDhdLFs4LDQ0OF0sWzgsNTEyXSxbOCw1MTJdLFs5LDcwNF0sWzksNzY4XSxbOCw2NDBdLFs4LDY0MF0sWzgsNTc2XSxbOCw1NzZdLFs5LDgzMl0sWzksODk2XSxbOSw5NjBdLFs5LDEwMjRdLFs5LDEwODhdLFs5LDExNTJdLFs5LDEyMTZdLFs5LDEyODBdLFs5LDEzNDRdLFs5LDE0MDhdLFs3LDI1Nl0sWzcsMjU2XSxbNywyNTZdLFs3LDI1Nl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XV0sYz1bWy0xLC0xXSxbLTEsLTFdLFsxMiwtMl0sWzEyLC0yXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzExLDE3OTJdLFsxMSwxNzkyXSxbMTIsMTk4NF0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjA0OF0sWzEyLDIxMTJdLFsxMiwyMTEyXSxbMTIsMjE3Nl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjI0MF0sWzEyLDIzMDRdLFsxMiwyMzA0XSxbMTEsMTg1Nl0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTg1Nl0sWzExLDE5MjBdLFsxMSwxOTIwXSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjM2OF0sWzEyLDI0MzJdLFsxMiwyNDMyXSxbMTIsMjQ5Nl0sWzEyLDI0OTZdLFsxMiwyNTYwXSxbMTIsMjU2MF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMiw1Ml0sWzEyLDUyXSxbMTMsNjQwXSxbMTMsNzA0XSxbMTMsNzY4XSxbMTMsODMyXSxbMTIsNTVdLFsxMiw1NV0sWzEyLDU2XSxbMTIsNTZdLFsxMywxMjgwXSxbMTMsMTM0NF0sWzEzLDE0MDhdLFsxMywxNDcyXSxbMTIsNTldLFsxMiw1OV0sWzEyLDYwXSxbMTIsNjBdLFsxMywxNTM2XSxbMTMsMTYwMF0sWzExLDI0XSxbMTEsMjRdLFsxMSwyNF0sWzExLDI0XSxbMTEsMjVdLFsxMSwyNV0sWzExLDI1XSxbMTEsMjVdLFsxMywxNjY0XSxbMTMsMTcyOF0sWzEyLDMyMF0sWzEyLDMyMF0sWzEyLDM4NF0sWzEyLDM4NF0sWzEyLDQ0OF0sWzEyLDQ0OF0sWzEzLDUxMl0sWzEzLDU3Nl0sWzEyLDUzXSxbMTIsNTNdLFsxMiw1NF0sWzEyLDU0XSxbMTMsODk2XSxbMTMsOTYwXSxbMTMsMTAyNF0sWzEzLDEwODhdLFsxMywxMTUyXSxbMTMsMTIxNl0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdXSxsPVtbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzExLDIzXSxbMTEsMjNdLFsxMiw1MF0sWzEyLDUxXSxbMTIsNDRdLFsxMiw0NV0sWzEyLDQ2XSxbMTIsNDddLFsxMiw1N10sWzEyLDU4XSxbMTIsNjFdLFsxMiwyNTZdLFsxMCwxNl0sWzEwLDE2XSxbMTAsMTZdLFsxMCwxNl0sWzEwLDE3XSxbMTAsMTddLFsxMCwxN10sWzEwLDE3XSxbMTIsNDhdLFsxMiw0OV0sWzEyLDYyXSxbMTIsNjNdLFsxMiwzMF0sWzEyLDMxXSxbMTIsMzJdLFsxMiwzM10sWzEyLDQwXSxbMTIsNDFdLFsxMSwyMl0sWzExLDIyXSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzEyLDEyOF0sWzEyLDE5Ml0sWzEyLDI2XSxbMTIsMjddLFsxMiwyOF0sWzEyLDI5XSxbMTEsMTldLFsxMSwxOV0sWzExLDIwXSxbMTEsMjBdLFsxMiwzNF0sWzEyLDM1XSxbMTIsMzZdLFsxMiwzN10sWzEyLDM4XSxbMTIsMzldLFsxMSwyMV0sWzExLDIxXSxbMTIsNDJdLFsxMiw0M10sWzEwLDBdLFsxMCwwXSxbMTAsMF0sWzEwLDBdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl1dLGg9W1stMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzYsOV0sWzYsOF0sWzUsN10sWzUsN10sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl1dO3QuQ0NJVFRGYXhEZWNvZGVyPWNsYXNzIENDSVRURmF4RGVjb2Rlcntjb25zdHJ1Y3RvcihlKXtsZXQgdCxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUubmV4dCl0aHJvdyBuZXcgRXJyb3IoJ0NDSVRURmF4RGVjb2RlciAtIGludmFsaWQgInNvdXJjZSIgcGFyYW1ldGVyLicpO3RoaXMuc291cmNlPWU7dGhpcy5lb2Y9ITE7dGhpcy5lbmNvZGluZz1hLkt8fDA7dGhpcy5lb2xpbmU9YS5FbmRPZkxpbmV8fCExO3RoaXMuYnl0ZUFsaWduPWEuRW5jb2RlZEJ5dGVBbGlnbnx8ITE7dGhpcy5jb2x1bW5zPWEuQ29sdW1uc3x8MTcyODt0aGlzLnJvd3M9YS5Sb3dzfHwwO3RoaXMuZW9ibG9jaz1hLkVuZE9mQmxvY2s/PyEwO3RoaXMuYmxhY2s9YS5CbGFja0lzMXx8ITE7dGhpcy5jb2RpbmdMaW5lPW5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMrMSk7dGhpcy5yZWZMaW5lPW5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMrMik7dGhpcy5jb2RpbmdMaW5lWzBdPXRoaXMuY29sdW1uczt0aGlzLmNvZGluZ1Bvcz0wO3RoaXMucm93PTA7dGhpcy5uZXh0TGluZTJEPXRoaXMuZW5jb2Rpbmc8MDt0aGlzLmlucHV0Qml0cz0wO3RoaXMuaW5wdXRCdWY9MDt0aGlzLm91dHB1dEJpdHM9MDt0aGlzLnJvd3NEb25lPSExO2Zvcig7MD09PSh0PXRoaXMuX2xvb2tCaXRzKDEyKSk7KXRoaXMuX2VhdEJpdHMoMSk7MT09PXQmJnRoaXMuX2VhdEJpdHMoMTIpO2lmKHRoaXMuZW5jb2Rpbmc+MCl7dGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfX1yZWFkTmV4dENoYXIoKXtpZih0aGlzLmVvZilyZXR1cm4tMTtjb25zdCBlPXRoaXMucmVmTGluZSx0PXRoaXMuY29kaW5nTGluZSxhPXRoaXMuY29sdW1ucztsZXQgaSxzLG8sYyxsO2lmKDA9PT10aGlzLm91dHB1dEJpdHMpe3RoaXMucm93c0RvbmUmJih0aGlzLmVvZj0hMCk7aWYodGhpcy5lb2YpcmV0dXJuLTE7dGhpcy5lcnI9ITE7bGV0IG8sbCxoO2lmKHRoaXMubmV4dExpbmUyRCl7Zm9yKGM9MDt0W2NdPGE7KytjKWVbY109dFtjXTtlW2MrK109YTtlW2NdPWE7dFswXT0wO3RoaXMuY29kaW5nUG9zPTA7aT0wO3M9MDtmb3IoO3RbdGhpcy5jb2RpbmdQb3NdPGE7KXtvPXRoaXMuX2dldFR3b0RpbUNvZGUoKTtzd2l0Y2gobyl7Y2FzZSAwOnRoaXMuX2FkZFBpeGVscyhlW2krMV0scyk7ZVtpKzFdPGEmJihpKz0yKTticmVhaztjYXNlIDE6bz1sPTA7aWYocyl7ZG97bys9aD10aGlzLl9nZXRCbGFja0NvZGUoKX13aGlsZShoPj02NCk7ZG97bCs9aD10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShoPj02NCl9ZWxzZXtkb3tvKz1oPXRoaXMuX2dldFdoaXRlQ29kZSgpfXdoaWxlKGg+PTY0KTtkb3tsKz1oPXRoaXMuX2dldEJsYWNrQ29kZSgpfXdoaWxlKGg+PTY0KX10aGlzLl9hZGRQaXhlbHModFt0aGlzLmNvZGluZ1Bvc10rbyxzKTt0W3RoaXMuY29kaW5nUG9zXTxhJiZ0aGlzLl9hZGRQaXhlbHModFt0aGlzLmNvZGluZ1Bvc10rbCwxXnMpO2Zvcig7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08YTspaSs9MjticmVhaztjYXNlIDc6dGhpcy5fYWRkUGl4ZWxzKGVbaV0rMyxzKTtzXj0xO2lmKHRbdGhpcy5jb2RpbmdQb3NdPGEpeysraTtmb3IoO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPGE7KWkrPTJ9YnJlYWs7Y2FzZSA1OnRoaXMuX2FkZFBpeGVscyhlW2ldKzIscyk7c149MTtpZih0W3RoaXMuY29kaW5nUG9zXTxhKXsrK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxhOylpKz0yfWJyZWFrO2Nhc2UgMzp0aGlzLl9hZGRQaXhlbHMoZVtpXSsxLHMpO3NePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108YSl7KytpO2Zvcig7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08YTspaSs9Mn1icmVhaztjYXNlIDI6dGhpcy5fYWRkUGl4ZWxzKGVbaV0scyk7c149MTtpZih0W3RoaXMuY29kaW5nUG9zXTxhKXsrK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxhOylpKz0yfWJyZWFrO2Nhc2UgODp0aGlzLl9hZGRQaXhlbHNOZWcoZVtpXS0zLHMpO3NePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108YSl7aT4wPy0taTorK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxhOylpKz0yfWJyZWFrO2Nhc2UgNjp0aGlzLl9hZGRQaXhlbHNOZWcoZVtpXS0yLHMpO3NePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108YSl7aT4wPy0taTorK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxhOylpKz0yfWJyZWFrO2Nhc2UgNDp0aGlzLl9hZGRQaXhlbHNOZWcoZVtpXS0xLHMpO3NePTE7aWYodFt0aGlzLmNvZGluZ1Bvc108YSl7aT4wPy0taTorK2k7Zm9yKDtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxhOylpKz0yfWJyZWFrO2Nhc2Ugbjp0aGlzLl9hZGRQaXhlbHMoYSwwKTt0aGlzLmVvZj0hMDticmVhaztkZWZhdWx0OigwLHIuaW5mbykoImJhZCAyZCBjb2RlIik7dGhpcy5fYWRkUGl4ZWxzKGEsMCk7dGhpcy5lcnI9ITB9fX1lbHNle3RbMF09MDt0aGlzLmNvZGluZ1Bvcz0wO3M9MDtmb3IoO3RbdGhpcy5jb2RpbmdQb3NdPGE7KXtvPTA7aWYocylkb3tvKz1oPXRoaXMuX2dldEJsYWNrQ29kZSgpfXdoaWxlKGg+PTY0KTtlbHNlIGRve28rPWg9dGhpcy5fZ2V0V2hpdGVDb2RlKCl9d2hpbGUoaD49NjQpO3RoaXMuX2FkZFBpeGVscyh0W3RoaXMuY29kaW5nUG9zXStvLHMpO3NePTF9fWxldCB1PSExO3RoaXMuYnl0ZUFsaWduJiYodGhpcy5pbnB1dEJpdHMmPS04KTtpZih0aGlzLmVvYmxvY2t8fHRoaXMucm93IT09dGhpcy5yb3dzLTEpe289dGhpcy5fbG9va0JpdHMoMTIpO2lmKHRoaXMuZW9saW5lKWZvcig7byE9PW4mJjEhPT1vOyl7dGhpcy5fZWF0Qml0cygxKTtvPXRoaXMuX2xvb2tCaXRzKDEyKX1lbHNlIGZvcig7MD09PW87KXt0aGlzLl9lYXRCaXRzKDEpO289dGhpcy5fbG9va0JpdHMoMTIpfWlmKDE9PT1vKXt0aGlzLl9lYXRCaXRzKDEyKTt1PSEwfWVsc2Ugbz09PW4mJih0aGlzLmVvZj0hMCl9ZWxzZSB0aGlzLnJvd3NEb25lPSEwO2lmKCF0aGlzLmVvZiYmdGhpcy5lbmNvZGluZz4wJiYhdGhpcy5yb3dzRG9uZSl7dGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfWlmKHRoaXMuZW9ibG9jayYmdSYmdGhpcy5ieXRlQWxpZ24pe289dGhpcy5fbG9va0JpdHMoMTIpO2lmKDE9PT1vKXt0aGlzLl9lYXRCaXRzKDEyKTtpZih0aGlzLmVuY29kaW5nPjApe3RoaXMuX2xvb2tCaXRzKDEpO3RoaXMuX2VhdEJpdHMoMSl9aWYodGhpcy5lbmNvZGluZz49MClmb3IoYz0wO2M8NDsrK2Mpe289dGhpcy5fbG9va0JpdHMoMTIpOzEhPT1vJiYoMCxyLmluZm8pKCJiYWQgcnRjIGNvZGU6ICIrbyk7dGhpcy5fZWF0Qml0cygxMik7aWYodGhpcy5lbmNvZGluZz4wKXt0aGlzLl9sb29rQml0cygxKTt0aGlzLl9lYXRCaXRzKDEpfX10aGlzLmVvZj0hMH19ZWxzZSBpZih0aGlzLmVyciYmdGhpcy5lb2xpbmUpe2Zvcig7Oyl7bz10aGlzLl9sb29rQml0cygxMyk7aWYobz09PW4pe3RoaXMuZW9mPSEwO3JldHVybi0xfWlmKG8+PjE9PTEpYnJlYWs7dGhpcy5fZWF0Qml0cygxKX10aGlzLl9lYXRCaXRzKDEyKTtpZih0aGlzLmVuY29kaW5nPjApe3RoaXMuX2VhdEJpdHMoMSk7dGhpcy5uZXh0TGluZTJEPSEoMSZvKX19dGhpcy5vdXRwdXRCaXRzPXRbMF0+MD90W3RoaXMuY29kaW5nUG9zPTBdOnRbdGhpcy5jb2RpbmdQb3M9MV07dGhpcy5yb3crK31pZih0aGlzLm91dHB1dEJpdHM+PTgpe2w9MSZ0aGlzLmNvZGluZ1Bvcz8wOjI1NTt0aGlzLm91dHB1dEJpdHMtPTg7aWYoMD09PXRoaXMub3V0cHV0Qml0cyYmdFt0aGlzLmNvZGluZ1Bvc108YSl7dGhpcy5jb2RpbmdQb3MrKzt0aGlzLm91dHB1dEJpdHM9dFt0aGlzLmNvZGluZ1Bvc10tdFt0aGlzLmNvZGluZ1Bvcy0xXX19ZWxzZXtvPTg7bD0wO2Rve2lmKCJudW1iZXIiIT10eXBlb2YgdGhpcy5vdXRwdXRCaXRzKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCdJbnZhbGlkIC9DQ0lUVEZheERlY29kZSBkYXRhLCAib3V0cHV0Qml0cyIgbXVzdCBiZSBhIG51bWJlci4nKTtpZih0aGlzLm91dHB1dEJpdHM+byl7bDw8PW87MSZ0aGlzLmNvZGluZ1Bvc3x8KGx8PTI1NT4+OC1vKTt0aGlzLm91dHB1dEJpdHMtPW87bz0wfWVsc2V7bDw8PXRoaXMub3V0cHV0Qml0czsxJnRoaXMuY29kaW5nUG9zfHwobHw9MjU1Pj44LXRoaXMub3V0cHV0Qml0cyk7by09dGhpcy5vdXRwdXRCaXRzO3RoaXMub3V0cHV0Qml0cz0wO2lmKHRbdGhpcy5jb2RpbmdQb3NdPGEpe3RoaXMuY29kaW5nUG9zKys7dGhpcy5vdXRwdXRCaXRzPXRbdGhpcy5jb2RpbmdQb3NdLXRbdGhpcy5jb2RpbmdQb3MtMV19ZWxzZSBpZihvPjApe2w8PD1vO289MH19fXdoaWxlKG8pfXRoaXMuYmxhY2smJihsXj0yNTUpO3JldHVybiBsfV9hZGRQaXhlbHMoZSx0KXtjb25zdCBhPXRoaXMuY29kaW5nTGluZTtsZXQgbj10aGlzLmNvZGluZ1BvcztpZihlPmFbbl0pe2lmKGU+dGhpcy5jb2x1bW5zKXsoMCxyLmluZm8pKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7dGhpcy5lcnI9ITA7ZT10aGlzLmNvbHVtbnN9MSZuXnQmJisrbjthW25dPWV9dGhpcy5jb2RpbmdQb3M9bn1fYWRkUGl4ZWxzTmVnKGUsdCl7Y29uc3QgYT10aGlzLmNvZGluZ0xpbmU7bGV0IG49dGhpcy5jb2RpbmdQb3M7aWYoZT5hW25dKXtpZihlPnRoaXMuY29sdW1ucyl7KDAsci5pbmZvKSgicm93IGlzIHdyb25nIGxlbmd0aCIpO3RoaXMuZXJyPSEwO2U9dGhpcy5jb2x1bW5zfTEmbl50JiYrK247YVtuXT1lfWVsc2UgaWYoZTxhW25dKXtpZihlPDApeygwLHIuaW5mbykoImludmFsaWQgY29kZSIpO3RoaXMuZXJyPSEwO2U9MH1mb3IoO24+MCYmZTxhW24tMV07KS0tbjthW25dPWV9dGhpcy5jb2RpbmdQb3M9bn1fZmluZFRhYmxlQ29kZShlLHQsYSxyKXtjb25zdCBpPXJ8fDA7Zm9yKGxldCByPWU7cjw9dDsrK3Ipe2xldCBlPXRoaXMuX2xvb2tCaXRzKHIpO2lmKGU9PT1uKXJldHVyblshMCwxLCExXTtyPHQmJihlPDw9dC1yKTtpZighaXx8ZT49aSl7Y29uc3QgdD1hW2UtaV07aWYodFswXT09PXIpe3RoaXMuX2VhdEJpdHMocik7cmV0dXJuWyEwLHRbMV0sITBdfX19cmV0dXJuWyExLDAsITFdfV9nZXRUd29EaW1Db2RlKCl7bGV0IGUsdD0wO2lmKHRoaXMuZW9ibG9jayl7dD10aGlzLl9sb29rQml0cyg3KTtlPWlbdF07aWYoZT8uWzBdPjApe3RoaXMuX2VhdEJpdHMoZVswXSk7cmV0dXJuIGVbMV19fWVsc2V7Y29uc3QgZT10aGlzLl9maW5kVGFibGVDb2RlKDEsNyxpKTtpZihlWzBdJiZlWzJdKXJldHVybiBlWzFdfSgwLHIuaW5mbykoIkJhZCB0d28gZGltIGNvZGUiKTtyZXR1cm4gbn1fZ2V0V2hpdGVDb2RlKCl7bGV0IGUsdD0wO2lmKHRoaXMuZW9ibG9jayl7dD10aGlzLl9sb29rQml0cygxMik7aWYodD09PW4pcmV0dXJuIDE7ZT10Pj41PT0wP3NbdF06b1t0Pj4zXTtpZihlWzBdPjApe3RoaXMuX2VhdEJpdHMoZVswXSk7cmV0dXJuIGVbMV19fWVsc2V7bGV0IGU9dGhpcy5fZmluZFRhYmxlQ29kZSgxLDksbyk7aWYoZVswXSlyZXR1cm4gZVsxXTtlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMTEsMTIscyk7aWYoZVswXSlyZXR1cm4gZVsxXX0oMCxyLmluZm8pKCJiYWQgd2hpdGUgY29kZSIpO3RoaXMuX2VhdEJpdHMoMSk7cmV0dXJuIDF9X2dldEJsYWNrQ29kZSgpe2xldCBlLHQ7aWYodGhpcy5lb2Jsb2NrKXtlPXRoaXMuX2xvb2tCaXRzKDEzKTtpZihlPT09bilyZXR1cm4gMTt0PWU+Pjc9PTA/Y1tlXTplPj45PT0wJiZlPj43IT0wP2xbKGU+PjEpLTY0XTpoW2U+PjddO2lmKHRbMF0+MCl7dGhpcy5fZWF0Qml0cyh0WzBdKTtyZXR1cm4gdFsxXX19ZWxzZXtsZXQgZT10aGlzLl9maW5kVGFibGVDb2RlKDIsNixoKTtpZihlWzBdKXJldHVybiBlWzFdO2U9dGhpcy5fZmluZFRhYmxlQ29kZSg3LDEyLGwsNjQpO2lmKGVbMF0pcmV0dXJuIGVbMV07ZT10aGlzLl9maW5kVGFibGVDb2RlKDEwLDEzLGMpO2lmKGVbMF0pcmV0dXJuIGVbMV19KDAsci5pbmZvKSgiYmFkIGJsYWNrIGNvZGUiKTt0aGlzLl9lYXRCaXRzKDEpO3JldHVybiAxfV9sb29rQml0cyhlKXtsZXQgdDtmb3IoO3RoaXMuaW5wdXRCaXRzPGU7KXtpZigtMT09PSh0PXRoaXMuc291cmNlLm5leHQoKSkpcmV0dXJuIDA9PT10aGlzLmlucHV0Qml0cz9uOnRoaXMuaW5wdXRCdWY8PGUtdGhpcy5pbnB1dEJpdHMmNjU1MzU+PjE2LWU7dGhpcy5pbnB1dEJ1Zj10aGlzLmlucHV0QnVmPDw4fHQ7dGhpcy5pbnB1dEJpdHMrPTh9cmV0dXJuIHRoaXMuaW5wdXRCdWY+PnRoaXMuaW5wdXRCaXRzLWUmNjU1MzU+PjE2LWV9X2VhdEJpdHMoZSl7KHRoaXMuaW5wdXRCaXRzLT1lKTwwJiYodGhpcy5pbnB1dEJpdHM9MCl9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5GbGF0ZVN0cmVhbT12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO3ZhciByPWEoMTY4KSxuPWEoMTQ0KTtjb25zdCBpPW5ldyBJbnQzMkFycmF5KFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSkscz1uZXcgSW50MzJBcnJheShbMyw0LDUsNiw3LDgsOSwxMCw2NTU0Nyw2NTU0OSw2NTU1MSw2NTU1MywxMzEwOTEsMTMxMDk1LDEzMTA5OSwxMzExMDMsMTk2NjQzLDE5NjY1MSwxOTY2NTksMTk2NjY3LDI2MjIxMSwyNjIyMjcsMjYyMjQzLDI2MjI1OSwzMjc4MTEsMzI3ODQzLDMyNzg3NSwzMjc5MDcsMjU4LDI1OCwyNThdKSxvPW5ldyBJbnQzMkFycmF5KFsxLDIsMyw0LDY1NTQxLDY1NTQzLDEzMTA4MSwxMzEwODUsMTk2NjI1LDE5NjYzMywyNjIxNzcsMjYyMTkzLDMyNzc0NSwzMjc3NzcsMzkzMzQ1LDM5MzQwOSw0NTkwMDksNDU5MTM3LDUyNDgwMSw1MjUwNTcsNTkwODQ5LDU5MTM2MSw2NTc0MDksNjU4NDMzLDcyNDk5Myw3MjcwNDEsNzk0NjI1LDc5ODcyMSw4NjgzNTMsODc2NTQ1XSksYz1bbmV3IEludDMyQXJyYXkoWzQ1OTAwOCw1MjQzNjgsNTI0MzA0LDUyNDU2OCw0NTkwMjQsNTI0NDAwLDUyNDMzNiw1OTAwMTYsNDU5MDE2LDUyNDM4NCw1MjQzMjAsNTg5OTg0LDUyNDI4OCw1MjQ0MTYsNTI0MzUyLDU5MDA0OCw0NTkwMTIsNTI0Mzc2LDUyNDMxMiw1ODk5NjgsNDU5MDI4LDUyNDQwOCw1MjQzNDQsNTkwMDMyLDQ1OTAyMCw1MjQzOTIsNTI0MzI4LDU5ZTQsNTI0Mjk2LDUyNDQyNCw1MjQzNjAsNTkwMDY0LDQ1OTAxMCw1MjQzNzIsNTI0MzA4LDUyNDU3Miw0NTkwMjYsNTI0NDA0LDUyNDM0MCw1OTAwMjQsNDU5MDE4LDUyNDM4OCw1MjQzMjQsNTg5OTkyLDUyNDI5Miw1MjQ0MjAsNTI0MzU2LDU5MDA1Niw0NTkwMTQsNTI0MzgwLDUyNDMxNiw1ODk5NzYsNDU5MDMwLDUyNDQxMiw1MjQzNDgsNTkwMDQwLDQ1OTAyMiw1MjQzOTYsNTI0MzMyLDU5MDAwOCw1MjQzMDAsNTI0NDI4LDUyNDM2NCw1OTAwNzIsNDU5MDA5LDUyNDM3MCw1MjQzMDYsNTI0NTcwLDQ1OTAyNSw1MjQ0MDIsNTI0MzM4LDU5MDAyMCw0NTkwMTcsNTI0Mzg2LDUyNDMyMiw1ODk5ODgsNTI0MjkwLDUyNDQxOCw1MjQzNTQsNTkwMDUyLDQ1OTAxMyw1MjQzNzgsNTI0MzE0LDU4OTk3Miw0NTkwMjksNTI0NDEwLDUyNDM0Niw1OTAwMzYsNDU5MDIxLDUyNDM5NCw1MjQzMzAsNTkwMDA0LDUyNDI5OCw1MjQ0MjYsNTI0MzYyLDU5MDA2OCw0NTkwMTEsNTI0Mzc0LDUyNDMxMCw1MjQ1NzQsNDU5MDI3LDUyNDQwNiw1MjQzNDIsNTkwMDI4LDQ1OTAxOSw1MjQzOTAsNTI0MzI2LDU4OTk5Niw1MjQyOTQsNTI0NDIyLDUyNDM1OCw1OTAwNjAsNDU5MDE1LDUyNDM4Miw1MjQzMTgsNTg5OTgwLDQ1OTAzMSw1MjQ0MTQsNTI0MzUwLDU5MDA0NCw0NTkwMjMsNTI0Mzk4LDUyNDMzNCw1OTAwMTIsNTI0MzAyLDUyNDQzMCw1MjQzNjYsNTkwMDc2LDQ1OTAwOCw1MjQzNjksNTI0MzA1LDUyNDU2OSw0NTkwMjQsNTI0NDAxLDUyNDMzNyw1OTAwMTgsNDU5MDE2LDUyNDM4NSw1MjQzMjEsNTg5OTg2LDUyNDI4OSw1MjQ0MTcsNTI0MzUzLDU5MDA1MCw0NTkwMTIsNTI0Mzc3LDUyNDMxMyw1ODk5NzAsNDU5MDI4LDUyNDQwOSw1MjQzNDUsNTkwMDM0LDQ1OTAyMCw1MjQzOTMsNTI0MzI5LDU5MDAwMiw1MjQyOTcsNTI0NDI1LDUyNDM2MSw1OTAwNjYsNDU5MDEwLDUyNDM3Myw1MjQzMDksNTI0NTczLDQ1OTAyNiw1MjQ0MDUsNTI0MzQxLDU5MDAyNiw0NTkwMTgsNTI0Mzg5LDUyNDMyNSw1ODk5OTQsNTI0MjkzLDUyNDQyMSw1MjQzNTcsNTkwMDU4LDQ1OTAxNCw1MjQzODEsNTI0MzE3LDU4OTk3OCw0NTkwMzAsNTI0NDEzLDUyNDM0OSw1OTAwNDIsNDU5MDIyLDUyNDM5Nyw1MjQzMzMsNTkwMDEwLDUyNDMwMSw1MjQ0MjksNTI0MzY1LDU5MDA3NCw0NTkwMDksNTI0MzcxLDUyNDMwNyw1MjQ1NzEsNDU5MDI1LDUyNDQwMyw1MjQzMzksNTkwMDIyLDQ1OTAxNyw1MjQzODcsNTI0MzIzLDU4OTk5MCw1MjQyOTEsNTI0NDE5LDUyNDM1NSw1OTAwNTQsNDU5MDEzLDUyNDM3OSw1MjQzMTUsNTg5OTc0LDQ1OTAyOSw1MjQ0MTEsNTI0MzQ3LDU5MDAzOCw0NTkwMjEsNTI0Mzk1LDUyNDMzMSw1OTAwMDYsNTI0Mjk5LDUyNDQyNyw1MjQzNjMsNTkwMDcwLDQ1OTAxMSw1MjQzNzUsNTI0MzExLDUyNDU3NSw0NTkwMjcsNTI0NDA3LDUyNDM0Myw1OTAwMzAsNDU5MDE5LDUyNDM5MSw1MjQzMjcsNTg5OTk4LDUyNDI5NSw1MjQ0MjMsNTI0MzU5LDU5MDA2Miw0NTkwMTUsNTI0MzgzLDUyNDMxOSw1ODk5ODIsNDU5MDMxLDUyNDQxNSw1MjQzNTEsNTkwMDQ2LDQ1OTAyMyw1MjQzOTksNTI0MzM1LDU5MDAxNCw1MjQzMDMsNTI0NDMxLDUyNDM2Nyw1OTAwNzgsNDU5MDA4LDUyNDM2OCw1MjQzMDQsNTI0NTY4LDQ1OTAyNCw1MjQ0MDAsNTI0MzM2LDU5MDAxNyw0NTkwMTYsNTI0Mzg0LDUyNDMyMCw1ODk5ODUsNTI0Mjg4LDUyNDQxNiw1MjQzNTIsNTkwMDQ5LDQ1OTAxMiw1MjQzNzYsNTI0MzEyLDU4OTk2OSw0NTkwMjgsNTI0NDA4LDUyNDM0NCw1OTAwMzMsNDU5MDIwLDUyNDM5Miw1MjQzMjgsNTkwMDAxLDUyNDI5Niw1MjQ0MjQsNTI0MzYwLDU5MDA2NSw0NTkwMTAsNTI0MzcyLDUyNDMwOCw1MjQ1NzIsNDU5MDI2LDUyNDQwNCw1MjQzNDAsNTkwMDI1LDQ1OTAxOCw1MjQzODgsNTI0MzI0LDU4OTk5Myw1MjQyOTIsNTI0NDIwLDUyNDM1Niw1OTAwNTcsNDU5MDE0LDUyNDM4MCw1MjQzMTYsNTg5OTc3LDQ1OTAzMCw1MjQ0MTIsNTI0MzQ4LDU5MDA0MSw0NTkwMjIsNTI0Mzk2LDUyNDMzMiw1OTAwMDksNTI0MzAwLDUyNDQyOCw1MjQzNjQsNTkwMDczLDQ1OTAwOSw1MjQzNzAsNTI0MzA2LDUyNDU3MCw0NTkwMjUsNTI0NDAyLDUyNDMzOCw1OTAwMjEsNDU5MDE3LDUyNDM4Niw1MjQzMjIsNTg5OTg5LDUyNDI5MCw1MjQ0MTgsNTI0MzU0LDU5MDA1Myw0NTkwMTMsNTI0Mzc4LDUyNDMxNCw1ODk5NzMsNDU5MDI5LDUyNDQxMCw1MjQzNDYsNTkwMDM3LDQ1OTAyMSw1MjQzOTQsNTI0MzMwLDU5MDAwNSw1MjQyOTgsNTI0NDI2LDUyNDM2Miw1OTAwNjksNDU5MDExLDUyNDM3NCw1MjQzMTAsNTI0NTc0LDQ1OTAyNyw1MjQ0MDYsNTI0MzQyLDU5MDAyOSw0NTkwMTksNTI0MzkwLDUyNDMyNiw1ODk5OTcsNTI0Mjk0LDUyNDQyMiw1MjQzNTgsNTkwMDYxLDQ1OTAxNSw1MjQzODIsNTI0MzE4LDU4OTk4MSw0NTkwMzEsNTI0NDE0LDUyNDM1MCw1OTAwNDUsNDU5MDIzLDUyNDM5OCw1MjQzMzQsNTkwMDEzLDUyNDMwMiw1MjQ0MzAsNTI0MzY2LDU5MDA3Nyw0NTkwMDgsNTI0MzY5LDUyNDMwNSw1MjQ1NjksNDU5MDI0LDUyNDQwMSw1MjQzMzcsNTkwMDE5LDQ1OTAxNiw1MjQzODUsNTI0MzIxLDU4OTk4Nyw1MjQyODksNTI0NDE3LDUyNDM1Myw1OTAwNTEsNDU5MDEyLDUyNDM3Nyw1MjQzMTMsNTg5OTcxLDQ1OTAyOCw1MjQ0MDksNTI0MzQ1LDU5MDAzNSw0NTkwMjAsNTI0MzkzLDUyNDMyOSw1OTAwMDMsNTI0Mjk3LDUyNDQyNSw1MjQzNjEsNTkwMDY3LDQ1OTAxMCw1MjQzNzMsNTI0MzA5LDUyNDU3Myw0NTkwMjYsNTI0NDA1LDUyNDM0MSw1OTAwMjcsNDU5MDE4LDUyNDM4OSw1MjQzMjUsNTg5OTk1LDUyNDI5Myw1MjQ0MjEsNTI0MzU3LDU5MDA1OSw0NTkwMTQsNTI0MzgxLDUyNDMxNyw1ODk5NzksNDU5MDMwLDUyNDQxMyw1MjQzNDksNTkwMDQzLDQ1OTAyMiw1MjQzOTcsNTI0MzMzLDU5MDAxMSw1MjQzMDEsNTI0NDI5LDUyNDM2NSw1OTAwNzUsNDU5MDA5LDUyNDM3MSw1MjQzMDcsNTI0NTcxLDQ1OTAyNSw1MjQ0MDMsNTI0MzM5LDU5MDAyMyw0NTkwMTcsNTI0Mzg3LDUyNDMyMyw1ODk5OTEsNTI0MjkxLDUyNDQxOSw1MjQzNTUsNTkwMDU1LDQ1OTAxMyw1MjQzNzksNTI0MzE1LDU4OTk3NSw0NTkwMjksNTI0NDExLDUyNDM0Nyw1OTAwMzksNDU5MDIxLDUyNDM5NSw1MjQzMzEsNTkwMDA3LDUyNDI5OSw1MjQ0MjcsNTI0MzYzLDU5MDA3MSw0NTkwMTEsNTI0Mzc1LDUyNDMxMSw1MjQ1NzUsNDU5MDI3LDUyNDQwNyw1MjQzNDMsNTkwMDMxLDQ1OTAxOSw1MjQzOTEsNTI0MzI3LDU4OTk5OSw1MjQyOTUsNTI0NDIzLDUyNDM1OSw1OTAwNjMsNDU5MDE1LDUyNDM4Myw1MjQzMTksNTg5OTgzLDQ1OTAzMSw1MjQ0MTUsNTI0MzUxLDU5MDA0Nyw0NTkwMjMsNTI0Mzk5LDUyNDMzNSw1OTAwMTUsNTI0MzAzLDUyNDQzMSw1MjQzNjcsNTkwMDc5XSksOV0sbD1bbmV3IEludDMyQXJyYXkoWzMyNzY4MCwzMjc2OTYsMzI3Njg4LDMyNzcwNCwzMjc2ODQsMzI3NzAwLDMyNzY5MiwzMjc3MDgsMzI3NjgyLDMyNzY5OCwzMjc2OTAsMzI3NzA2LDMyNzY4NiwzMjc3MDIsMzI3Njk0LDAsMzI3NjgxLDMyNzY5NywzMjc2ODksMzI3NzA1LDMyNzY4NSwzMjc3MDEsMzI3NjkzLDMyNzcwOSwzMjc2ODMsMzI3Njk5LDMyNzY5MSwzMjc3MDcsMzI3Njg3LDMyNzcwMywzMjc2OTUsMF0pLDVdO2NsYXNzIEZsYXRlU3RyZWFtIGV4dGVuZHMgci5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0KXtzdXBlcih0KTt0aGlzLnN0cj1lO3RoaXMuZGljdD1lLmRpY3Q7Y29uc3QgYT1lLmdldEJ5dGUoKSxyPWUuZ2V0Qnl0ZSgpO2lmKC0xPT09YXx8LTE9PT1yKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKGBJbnZhbGlkIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW06ICR7YX0sICR7cn1gKTtpZig4IT0oMTUmYSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoYFVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIGluIGZsYXRlIHN0cmVhbTogJHthfSwgJHtyfWApO2lmKCgoYTw8OCkrciklMzEhPTApdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoYEJhZCBGQ0hFQ0sgaW4gZmxhdGUgc3RyZWFtOiAke2F9LCAke3J9YCk7aWYoMzImcil0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcihgRkRJQ1QgYml0IHNldCBpbiBmbGF0ZSBzdHJlYW06ICR7YX0sICR7cn1gKTt0aGlzLmNvZGVTaXplPTA7dGhpcy5jb2RlQnVmPTB9Z2V0Qml0cyhlKXtjb25zdCB0PXRoaXMuc3RyO2xldCBhLHI9dGhpcy5jb2RlU2l6ZSxpPXRoaXMuY29kZUJ1Zjtmb3IoO3I8ZTspe2lmKC0xPT09KGE9dC5nZXRCeXRlKCkpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtIik7aXw9YTw8cjtyKz04fWE9aSYoMTw8ZSktMTt0aGlzLmNvZGVCdWY9aT4+ZTt0aGlzLmNvZGVTaXplPXItPWU7cmV0dXJuIGF9Z2V0Q29kZShlKXtjb25zdCB0PXRoaXMuc3RyLGE9ZVswXSxyPWVbMV07bGV0IGkscz10aGlzLmNvZGVTaXplLG89dGhpcy5jb2RlQnVmO2Zvcig7czxyJiYtMSE9PShpPXQuZ2V0Qnl0ZSgpKTspe298PWk8PHM7cys9OH1jb25zdCBjPWFbbyYoMTw8ciktMV0sbD1jPj4xNixoPTY1NTM1JmM7aWYobDwxfHxzPGwpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkJhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0iKTt0aGlzLmNvZGVCdWY9bz4+bDt0aGlzLmNvZGVTaXplPXMtbDtyZXR1cm4gaH1nZW5lcmF0ZUh1ZmZtYW5UYWJsZShlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBhLHI9MDtmb3IoYT0wO2E8dDsrK2EpZVthXT5yJiYocj1lW2FdKTtjb25zdCBuPTE8PHIsaT1uZXcgSW50MzJBcnJheShuKTtmb3IobGV0IHM9MSxvPTAsYz0yO3M8PXI7KytzLG88PD0xLGM8PD0xKWZvcihsZXQgcj0wO3I8dDsrK3IpaWYoZVtyXT09PXMpe2xldCBlPTAsdD1vO2ZvcihhPTA7YTxzOysrYSl7ZT1lPDwxfDEmdDt0Pj49MX1mb3IoYT1lO2E8bjthKz1jKWlbYV09czw8MTZ8cjsrK299cmV0dXJuW2kscl19cmVhZEJsb2NrKCl7bGV0IGUsdDtjb25zdCBhPXRoaXMuc3RyO2xldCByLGgsdT10aGlzLmdldEJpdHMoMyk7MSZ1JiYodGhpcy5lb2Y9ITApO3U+Pj0xO2lmKDA9PT11KXtsZXQgdDtpZigtMT09PSh0PWEuZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTtsZXQgcj10O2lmKC0xPT09KHQ9YS5nZXRCeXRlKCkpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpO3J8PXQ8PDg7aWYoLTE9PT0odD1hLmdldEJ5dGUoKSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7bGV0IGk9dDtpZigtMT09PSh0PWEuZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTtpfD10PDw4O2lmKGkhPT0oNjU1MzUmfnIpJiYoMCE9PXJ8fDAhPT1pKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiQmFkIHVuY29tcHJlc3NlZCBibG9jayBsZW5ndGggaW4gZmxhdGUgc3RyZWFtIik7dGhpcy5jb2RlQnVmPTA7dGhpcy5jb2RlU2l6ZT0wO2NvbnN0IHM9dGhpcy5idWZmZXJMZW5ndGgsbz1zK3I7ZT10aGlzLmVuc3VyZUJ1ZmZlcihvKTt0aGlzLmJ1ZmZlckxlbmd0aD1vO2lmKDA9PT1yKS0xPT09YS5wZWVrQnl0ZSgpJiYodGhpcy5lb2Y9ITApO2Vsc2V7Y29uc3QgdD1hLmdldEJ5dGVzKHIpO2Uuc2V0KHQscyk7dC5sZW5ndGg8ciYmKHRoaXMuZW9mPSEwKX1yZXR1cm59aWYoMT09PXUpe3I9YztoPWx9ZWxzZXtpZigyIT09dSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVW5rbm93biBibG9jayB0eXBlIGluIGZsYXRlIHN0cmVhbSIpO3tjb25zdCBlPXRoaXMuZ2V0Qml0cyg1KSsyNTcsYT10aGlzLmdldEJpdHMoNSkrMSxuPXRoaXMuZ2V0Qml0cyg0KSs0LHM9bmV3IFVpbnQ4QXJyYXkoaS5sZW5ndGgpO2xldCBvO2ZvcihvPTA7bzxuOysrbylzW2lbb11dPXRoaXMuZ2V0Qml0cygzKTtjb25zdCBjPXRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUocyk7dD0wO289MDtjb25zdCBsPWUrYSx1PW5ldyBVaW50OEFycmF5KGwpO2xldCBkLGYsZztmb3IoO288bDspe2NvbnN0IGU9dGhpcy5nZXRDb2RlKGMpO2lmKDE2PT09ZSl7ZD0yO2Y9MztnPXR9ZWxzZSBpZigxNz09PWUpe2Q9MztmPTM7Zz10PTB9ZWxzZXtpZigxOCE9PWUpe3VbbysrXT10PWU7Y29udGludWV9ZD03O2Y9MTE7Zz10PTB9bGV0IGE9dGhpcy5nZXRCaXRzKGQpK2Y7Zm9yKDthLS0gPjA7KXVbbysrXT1nfXI9dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZSh1LnN1YmFycmF5KDAsZSkpO2g9dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZSh1LnN1YmFycmF5KGUsbCkpfX1lPXRoaXMuYnVmZmVyO2xldCBkPWU/ZS5sZW5ndGg6MCxmPXRoaXMuYnVmZmVyTGVuZ3RoO2Zvcig7Oyl7bGV0IGE9dGhpcy5nZXRDb2RlKHIpO2lmKGE8MjU2KXtpZihmKzE+PWQpe2U9dGhpcy5lbnN1cmVCdWZmZXIoZisxKTtkPWUubGVuZ3RofWVbZisrXT1hO2NvbnRpbnVlfWlmKDI1Nj09PWEpe3RoaXMuYnVmZmVyTGVuZ3RoPWY7cmV0dXJufWEtPTI1NzthPXNbYV07bGV0IG49YT4+MTY7bj4wJiYobj10aGlzLmdldEJpdHMobikpO3Q9KDY1NTM1JmEpK247YT10aGlzLmdldENvZGUoaCk7YT1vW2FdO249YT4+MTY7bj4wJiYobj10aGlzLmdldEJpdHMobikpO2NvbnN0IGk9KDY1NTM1JmEpK247aWYoZit0Pj1kKXtlPXRoaXMuZW5zdXJlQnVmZmVyKGYrdCk7ZD1lLmxlbmd0aH1mb3IobGV0IGE9MDthPHQ7KythLCsrZillW2ZdPWVbZi1pXX19fXQuRmxhdGVTdHJlYW09RmxhdGVTdHJlYW19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSmJpZzJTdHJlYW09dm9pZCAwO2EoMTM5KTt2YXIgcj1hKDE1MSksbj1hKDE2OCksaT1hKDE1MCkscz1hKDE3NCksbz1hKDE0NCk7Y2xhc3MgSmJpZzJTdHJlYW0gZXh0ZW5kcyBuLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIodCk7dGhpcy5zdHJlYW09ZTt0aGlzLmRpY3Q9ZS5kaWN0O3RoaXMubWF5YmVMZW5ndGg9dDt0aGlzLnBhcmFtcz1hfWdldCBieXRlcygpe3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJieXRlcyIsdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpfWVuc3VyZUJ1ZmZlcihlKXt9cmVhZEJsb2NrKCl7aWYodGhpcy5lb2YpcmV0dXJuO2NvbnN0IGU9bmV3IHMuSmJpZzJJbWFnZSx0PVtdO2lmKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgaS5EaWN0KXtjb25zdCBlPXRoaXMucGFyYW1zLmdldCgiSkJJRzJHbG9iYWxzIik7aWYoZSBpbnN0YW5jZW9mIHIuQmFzZVN0cmVhbSl7Y29uc3QgYT1lLmdldEJ5dGVzKCk7dC5wdXNoKHtkYXRhOmEsc3RhcnQ6MCxlbmQ6YS5sZW5ndGh9KX19dC5wdXNoKHtkYXRhOnRoaXMuYnl0ZXMsc3RhcnQ6MCxlbmQ6dGhpcy5ieXRlcy5sZW5ndGh9KTtjb25zdCBhPWUucGFyc2VDaHVua3ModCksbj1hLmxlbmd0aDtmb3IobGV0IGU9MDtlPG47ZSsrKWFbZV1ePTI1NTt0aGlzLmJ1ZmZlcj1hO3RoaXMuYnVmZmVyTGVuZ3RoPW47dGhpcy5lb2Y9ITB9fXQuSmJpZzJTdHJlYW09SmJpZzJTdHJlYW19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSmJpZzJJbWFnZT12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO2EoMTM5KTthKDIpO3ZhciByPWEoMTQ0KSxuPWEoMTQ5KSxpPWEoMTc1KSxzPWEoMTcxKTtjbGFzcyBKYmlnMkVycm9yIGV4dGVuZHMgci5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBKQklHMiBlcnJvcjogJHtlfWAsIkpiaWcyRXJyb3IiKX19Y2xhc3MgQ29udGV4dENhY2hle2dldENvbnRleHRzKGUpe3JldHVybiBlIGluIHRoaXM/dGhpc1tlXTp0aGlzW2VdPW5ldyBJbnQ4QXJyYXkoNjU1MzYpfX1jbGFzcyBEZWNvZGluZ0NvbnRleHR7Y29uc3RydWN0b3IoZSx0LGEpe3RoaXMuZGF0YT1lO3RoaXMuc3RhcnQ9dDt0aGlzLmVuZD1hfWdldCBkZWNvZGVyKCl7Y29uc3QgZT1uZXcgaS5Bcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsdGhpcy5zdGFydCx0aGlzLmVuZCk7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsImRlY29kZXIiLGUpfWdldCBjb250ZXh0Q2FjaGUoKXtjb25zdCBlPW5ldyBDb250ZXh0Q2FjaGU7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsImNvbnRleHRDYWNoZSIsZSl9fWNvbnN0IG89MioqMzEtMSxjPS0oMioqMzEpO2Z1bmN0aW9uIGRlY29kZUludGVnZXIoZSx0LGEpe2NvbnN0IHI9ZS5nZXRDb250ZXh0cyh0KTtsZXQgbj0xO2Z1bmN0aW9uIHJlYWRCaXRzKGUpe2xldCB0PTA7Zm9yKGxldCBpPTA7aTxlO2krKyl7Y29uc3QgZT1hLnJlYWRCaXQocixuKTtuPW48MjU2P248PDF8ZTo1MTEmKG48PDF8ZSl8MjU2O3Q9dDw8MXxlfXJldHVybiB0Pj4+MH1jb25zdCBpPXJlYWRCaXRzKDEpLHM9cmVhZEJpdHMoMSk/cmVhZEJpdHMoMSk/cmVhZEJpdHMoMSk/cmVhZEJpdHMoMSk/cmVhZEJpdHMoMSk/cmVhZEJpdHMoMzIpKzQ0MzY6cmVhZEJpdHMoMTIpKzM0MDpyZWFkQml0cyg4KSs4NDpyZWFkQml0cyg2KSsyMDpyZWFkQml0cyg0KSs0OnJlYWRCaXRzKDIpO2xldCBsOzA9PT1pP2w9czpzPjAmJihsPS1zKTtyZXR1cm4gbD49YyYmbDw9bz9sOm51bGx9ZnVuY3Rpb24gZGVjb2RlSUFJRChlLHQsYSl7Y29uc3Qgcj1lLmdldENvbnRleHRzKCJJQUlEIik7bGV0IG49MTtmb3IobGV0IGU9MDtlPGE7ZSsrKXtuPW48PDF8dC5yZWFkQml0KHIsbil9cmV0dXJuIGE8MzE/biYoMTw8YSktMToyMTQ3NDgzNjQ3Jm59Y29uc3QgbD1bIlN5bWJvbERpY3Rpb25hcnkiLG51bGwsbnVsbCxudWxsLCJJbnRlcm1lZGlhdGVUZXh0UmVnaW9uIixudWxsLCJJbW1lZGlhdGVUZXh0UmVnaW9uIiwiSW1tZWRpYXRlTG9zc2xlc3NUZXh0UmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIlBhdHRlcm5EaWN0aW9uYXJ5IixudWxsLG51bGwsbnVsbCwiSW50ZXJtZWRpYXRlSGFsZnRvbmVSZWdpb24iLG51bGwsIkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uIiwiSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbiIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLG51bGwsIkltbWVkaWF0ZUdlbmVyaWNSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCJJbnRlcm1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWZpbmVtZW50UmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLCJQYWdlSW5mb3JtYXRpb24iLCJFbmRPZlBhZ2UiLCJFbmRPZlN0cmlwZSIsIkVuZE9mRmlsZSIsIlByb2ZpbGVzIiwiVGFibGVzIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIkV4dGVuc2lvbiJdLGg9W1t7eDotMSx5Oi0yfSx7eDowLHk6LTJ9LHt4OjEseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4OjIseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV0sW3t4Oi0xLHk6LTJ9LHt4OjAseTotMn0se3g6MSx5Oi0yfSx7eDoyLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDoyLHk6LTF9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XSxbe3g6LTEseTotMn0se3g6MCx5Oi0yfSx7eDoxLHk6LTJ9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMix5OjB9LHt4Oi0xLHk6MH1dLFt7eDotMyx5Oi0xfSx7eDotMix5Oi0xfSx7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTQseTowfSx7eDotMyx5OjB9LHt4Oi0yLHk6MH0se3g6LTEseTowfV1dLHU9W3tjb2Rpbmc6W3t4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMSx5OjB9XSxyZWZlcmVuY2U6W3t4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotMSx5OjB9LHt4OjAseTowfSx7eDoxLHk6MH0se3g6LTEseToxfSx7eDowLHk6MX0se3g6MSx5OjF9XX0se2NvZGluZzpbe3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH1dLHJlZmVyZW5jZTpbe3g6MCx5Oi0xfSx7eDotMSx5OjB9LHt4OjAseTowfSx7eDoxLHk6MH0se3g6MCx5OjF9LHt4OjEseToxfV19XSxkPVszOTcxNywxOTQxLDIyOSw0MDVdLGY9WzMyLDhdO2Z1bmN0aW9uIGRlY29kZUJpdG1hcChlLHQsYSxyLG4saSxzLG8pe2lmKGUpe3JldHVybiBkZWNvZGVNTVJCaXRtYXAobmV3IFJlYWRlcihvLmRhdGEsby5zdGFydCxvLmVuZCksdCxhLCExKX1pZigwPT09ciYmIWkmJiFuJiY0PT09cy5sZW5ndGgmJjM9PT1zWzBdLngmJi0xPT09c1swXS55JiYtMz09PXNbMV0ueCYmLTE9PT1zWzFdLnkmJjI9PT1zWzJdLngmJi0yPT09c1syXS55JiYtMj09PXNbM10ueCYmLTI9PT1zWzNdLnkpcmV0dXJuIGZ1bmN0aW9uIGRlY29kZUJpdG1hcFRlbXBsYXRlMChlLHQsYSl7Y29uc3Qgcj1hLmRlY29kZXIsbj1hLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxpPVtdO2xldCBzLG8sYyxsLGgsdSxkO2ZvcihvPTA7bzx0O28rKyl7aD1pW29dPW5ldyBVaW50OEFycmF5KGUpO3U9bzwxP2g6aVtvLTFdO2Q9bzwyP2g6aVtvLTJdO3M9ZFswXTw8MTN8ZFsxXTw8MTJ8ZFsyXTw8MTF8dVswXTw8N3x1WzFdPDw2fHVbMl08PDV8dVszXTw8NDtmb3IoYz0wO2M8ZTtjKyspe2hbY109bD1yLnJlYWRCaXQobixzKTtzPSgzMTczNSZzKTw8MXwoYyszPGU/ZFtjKzNdPDwxMTowKXwoYys0PGU/dVtjKzRdPDw0OjApfGx9fXJldHVybiBpfSh0LGEsbyk7Y29uc3QgYz0hIWksbD1oW3JdLmNvbmNhdChzKTtsLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUueS10Lnl8fGUueC10Lnh9KSk7Y29uc3QgdT1sLmxlbmd0aCxmPW5ldyBJbnQ4QXJyYXkodSksZz1uZXcgSW50OEFycmF5KHUpLHA9W107bGV0IG0sYix5PTAsdz0wLFM9MCx4PTA7Zm9yKGI9MDtiPHU7YisrKXtmW2JdPWxbYl0ueDtnW2JdPWxbYl0ueTt3PU1hdGgubWluKHcsbFtiXS54KTtTPU1hdGgubWF4KFMsbFtiXS54KTt4PU1hdGgubWluKHgsbFtiXS55KTtiPHUtMSYmbFtiXS55PT09bFtiKzFdLnkmJmxbYl0ueD09PWxbYisxXS54LTE/eXw9MTw8dS0xLWI6cC5wdXNoKGIpfWNvbnN0IEM9cC5sZW5ndGgsdj1uZXcgSW50OEFycmF5KEMpLGs9bmV3IEludDhBcnJheShDKSxPPW5ldyBVaW50MTZBcnJheShDKTtmb3IobT0wO208QzttKyspe2I9cFttXTt2W21dPWxbYl0ueDtrW21dPWxbYl0ueTtPW21dPTE8PHUtMS1ifWNvbnN0IFQ9LXcsTT0teCxFPXQtUyxEPWRbcl07bGV0IE49bmV3IFVpbnQ4QXJyYXkodCk7Y29uc3QgUj1bXSxMPW8uZGVjb2RlciwkPW8uY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpO2xldCBfLGosVSxYLEgscT0wLHo9MDtmb3IobGV0IGU9MDtlPGE7ZSsrKXtpZihuKXtxXj1MLnJlYWRCaXQoJCxEKTtpZihxKXtSLnB1c2goTik7Y29udGludWV9fU49bmV3IFVpbnQ4QXJyYXkoTik7Ui5wdXNoKE4pO2ZvcihfPTA7Xzx0O18rKyl7aWYoYyYmaVtlXVtfXSl7TltfXT0wO2NvbnRpbnVlfWlmKF8+PVQmJl88RSYmZT49TSl7ej16PDwxJnk7Zm9yKGI9MDtiPEM7YisrKXtqPWUra1tiXTtVPV8rdltiXTtYPVJbal1bVV07aWYoWCl7WD1PW2JdO3p8PVh9fX1lbHNle3o9MDtIPXUtMTtmb3IoYj0wO2I8dTtiKyssSC0tKXtVPV8rZltiXTtpZihVPj0wJiZVPHQpe2o9ZStnW2JdO2lmKGo+PTApe1g9UltqXVtVXTtYJiYoenw9WDw8SCl9fX19Y29uc3QgYT1MLnJlYWRCaXQoJCx6KTtOW19dPWF9fXJldHVybiBSfWZ1bmN0aW9uIGRlY29kZVJlZmluZW1lbnQoZSx0LGEscixuLGkscyxvLGMpe2xldCBsPXVbYV0uY29kaW5nOzA9PT1hJiYobD1sLmNvbmNhdChbb1swXV0pKTtjb25zdCBoPWwubGVuZ3RoLGQ9bmV3IEludDMyQXJyYXkoaCksZz1uZXcgSW50MzJBcnJheShoKTtsZXQgcDtmb3IocD0wO3A8aDtwKyspe2RbcF09bFtwXS54O2dbcF09bFtwXS55fWxldCBtPXVbYV0ucmVmZXJlbmNlOzA9PT1hJiYobT1tLmNvbmNhdChbb1sxXV0pKTtjb25zdCBiPW0ubGVuZ3RoLHk9bmV3IEludDMyQXJyYXkoYiksdz1uZXcgSW50MzJBcnJheShiKTtmb3IocD0wO3A8YjtwKyspe3lbcF09bVtwXS54O3dbcF09bVtwXS55fWNvbnN0IFM9clswXS5sZW5ndGgseD1yLmxlbmd0aCxDPWZbYV0sdj1bXSxrPWMuZGVjb2RlcixPPWMuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpO2xldCBUPTA7Zm9yKGxldCBhPTA7YTx0O2ErKyl7aWYocyl7VF49ay5yZWFkQml0KE8sQyk7aWYoVCl0aHJvdyBuZXcgSmJpZzJFcnJvcigicHJlZGljdGlvbiBpcyBub3Qgc3VwcG9ydGVkIil9Y29uc3QgdD1uZXcgVWludDhBcnJheShlKTt2LnB1c2godCk7Zm9yKGxldCBzPTA7czxlO3MrKyl7bGV0IG8sYyxsPTA7Zm9yKHA9MDtwPGg7cCsrKXtvPWErZ1twXTtjPXMrZFtwXTtvPDB8fGM8MHx8Yz49ZT9sPDw9MTpsPWw8PDF8dltvXVtjXX1mb3IocD0wO3A8YjtwKyspe289YSt3W3BdLWk7Yz1zK3lbcF0tbjtvPDB8fG8+PXh8fGM8MHx8Yz49Uz9sPDw9MTpsPWw8PDF8cltvXVtjXX1jb25zdCB1PWsucmVhZEJpdChPLGwpO3Rbc109dX19cmV0dXJuIHZ9ZnVuY3Rpb24gZGVjb2RlVGV4dFJlZ2lvbihlLHQsYSxyLG4saSxzLG8sYyxsLGgsdSxkLGYsZyxwLG0sYix5KXtpZihlJiZ0KXRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7Y29uc3Qgdz1bXTtsZXQgUyx4O2ZvcihTPTA7UzxyO1MrKyl7eD1uZXcgVWludDhBcnJheShhKTtpZihuKWZvcihsZXQgZT0wO2U8YTtlKyspeFtlXT1uO3cucHVzaCh4KX1jb25zdCBDPW0uZGVjb2Rlcix2PW0uY29udGV4dENhY2hlO2xldCBrPWU/LWYudGFibGVEZWx0YVQuZGVjb2RlKHkpOi1kZWNvZGVJbnRlZ2VyKHYsIklBRFQiLEMpLE89MDtTPTA7Zm9yKDtTPGk7KXtrKz1lP2YudGFibGVEZWx0YVQuZGVjb2RlKHkpOmRlY29kZUludGVnZXIodiwiSUFEVCIsQyk7Tys9ZT9mLnRhYmxlRmlyc3RTLmRlY29kZSh5KTpkZWNvZGVJbnRlZ2VyKHYsIklBRlMiLEMpO2xldCByPU87Zm9yKDs7KXtsZXQgbj0wO3M+MSYmKG49ZT95LnJlYWRCaXRzKGIpOmRlY29kZUludGVnZXIodiwiSUFJVCIsQykpO2NvbnN0IGk9cyprK24sTz1lP2Yuc3ltYm9sSURUYWJsZS5kZWNvZGUoeSk6ZGVjb2RlSUFJRCh2LEMsYyksVD10JiYoZT95LnJlYWRCaXQoKTpkZWNvZGVJbnRlZ2VyKHYsIklBUkkiLEMpKTtsZXQgTT1vW09dLEU9TVswXS5sZW5ndGgsRD1NLmxlbmd0aDtpZihUKXtjb25zdCBlPWRlY29kZUludGVnZXIodiwiSUFSRFciLEMpLHQ9ZGVjb2RlSW50ZWdlcih2LCJJQVJESCIsQyk7RSs9ZTtEKz10O009ZGVjb2RlUmVmaW5lbWVudChFLEQsZyxNLChlPj4xKStkZWNvZGVJbnRlZ2VyKHYsIklBUkRYIixDKSwodD4+MSkrZGVjb2RlSW50ZWdlcih2LCJJQVJEWSIsQyksITEscCxtKX1jb25zdCBOPWktKDEmdT8wOkQtMSksUj1yLSgyJnU/RS0xOjApO2xldCBMLCQsXztpZihsKXtmb3IoTD0wO0w8RDtMKyspe3g9d1tSK0xdO2lmKCF4KWNvbnRpbnVlO189TVtMXTtjb25zdCBlPU1hdGgubWluKGEtTixFKTtzd2l0Y2goZCl7Y2FzZSAwOmZvcigkPTA7JDxlOyQrKyl4W04rJF18PV9bJF07YnJlYWs7Y2FzZSAyOmZvcigkPTA7JDxlOyQrKyl4W04rJF1ePV9bJF07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtkfSBpcyBub3Qgc3VwcG9ydGVkYCl9fXIrPUQtMX1lbHNle2ZvcigkPTA7JDxEOyQrKyl7eD13W04rJF07aWYoeCl7Xz1NWyRdO3N3aXRjaChkKXtjYXNlIDA6Zm9yKEw9MDtMPEU7TCsrKXhbUitMXXw9X1tMXTticmVhaztjYXNlIDI6Zm9yKEw9MDtMPEU7TCsrKXhbUitMXV49X1tMXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2R9IGlzIG5vdCBzdXBwb3J0ZWRgKX19fXIrPUUtMX1TKys7Y29uc3Qgaj1lP2YudGFibGVEZWx0YVMuZGVjb2RlKHkpOmRlY29kZUludGVnZXIodiwiSUFEUyIsQyk7aWYobnVsbD09PWopYnJlYWs7cis9aitofX1yZXR1cm4gd31mdW5jdGlvbiByZWFkU2VnbWVudEhlYWRlcihlLHQpe2NvbnN0IGE9e307YS5udW1iZXI9KDAsbi5yZWFkVWludDMyKShlLHQpO2NvbnN0IHI9ZVt0KzRdLGk9NjMmcjtpZighbFtpXSl0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIraSk7YS50eXBlPWk7YS50eXBlTmFtZT1sW2ldO2EuZGVmZXJyZWROb25SZXRhaW49ISEoMTI4JnIpO2NvbnN0IHM9ISEoNjQmciksbz1lW3QrNV07bGV0IGM9bz4+NSY3O2NvbnN0IGg9WzMxJm9dO2xldCB1PXQrNjtpZig3PT09byl7Yz01MzY4NzA5MTEmKDAsbi5yZWFkVWludDMyKShlLHUtMSk7dSs9MztsZXQgdD1jKzc+PjM7aFswXT1lW3UrK107Zm9yKDstLXQ+MDspaC5wdXNoKGVbdSsrXSl9ZWxzZSBpZig1PT09b3x8Nj09PW8pdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgcmVmZXJyZWQtdG8gZmxhZ3MiKTthLnJldGFpbkJpdHM9aDtsZXQgZD00O2EubnVtYmVyPD0yNTY/ZD0xOmEubnVtYmVyPD02NTUzNiYmKGQ9Mik7Y29uc3QgZj1bXTtsZXQgcCxtO2ZvcihwPTA7cDxjO3ArKyl7bGV0IHQ7dD0xPT09ZD9lW3VdOjI9PT1kPygwLG4ucmVhZFVpbnQxNikoZSx1KTooMCxuLnJlYWRVaW50MzIpKGUsdSk7Zi5wdXNoKHQpO3UrPWR9YS5yZWZlcnJlZFRvPWY7aWYocyl7YS5wYWdlQXNzb2NpYXRpb249KDAsbi5yZWFkVWludDMyKShlLHUpO3UrPTR9ZWxzZSBhLnBhZ2VBc3NvY2lhdGlvbj1lW3UrK107YS5sZW5ndGg9KDAsbi5yZWFkVWludDMyKShlLHUpO3UrPTQ7aWYoNDI5NDk2NzI5NT09PWEubGVuZ3RoKXtpZigzOCE9PWkpdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgdW5rbm93biBzZWdtZW50IGxlbmd0aCIpO3tjb25zdCB0PXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZSx1KSxyPSEhKDEmZVt1K2ddKSxuPTYsaT1uZXcgVWludDhBcnJheShuKTtpZighcil7aVswXT0yNTU7aVsxXT0xNzJ9aVsyXT10LmhlaWdodD4+PjI0JjI1NTtpWzNdPXQuaGVpZ2h0Pj4xNiYyNTU7aVs0XT10LmhlaWdodD4+OCYyNTU7aVs1XT0yNTUmdC5oZWlnaHQ7Zm9yKHA9dSxtPWUubGVuZ3RoO3A8bTtwKyspe2xldCB0PTA7Zm9yKDt0PG4mJmlbdF09PT1lW3ArdF07KXQrKztpZih0PT09bil7YS5sZW5ndGg9cCtuO2JyZWFrfX1pZig0Mjk0OTY3Mjk1PT09YS5sZW5ndGgpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNlZ21lbnQgZW5kIHdhcyBub3QgZm91bmQiKX19YS5oZWFkZXJFbmQ9dTtyZXR1cm4gYX1mdW5jdGlvbiByZWFkU2VnbWVudHMoZSx0LGEscil7Y29uc3Qgbj1bXTtsZXQgaT1hO2Zvcig7aTxyOyl7Y29uc3QgYT1yZWFkU2VnbWVudEhlYWRlcih0LGkpO2k9YS5oZWFkZXJFbmQ7Y29uc3Qgcj17aGVhZGVyOmEsZGF0YTp0fTtpZighZS5yYW5kb21BY2Nlc3Mpe3Iuc3RhcnQ9aTtpKz1hLmxlbmd0aDtyLmVuZD1pfW4ucHVzaChyKTtpZig1MT09PWEudHlwZSlicmVha31pZihlLnJhbmRvbUFjY2Vzcylmb3IobGV0IGU9MCx0PW4ubGVuZ3RoO2U8dDtlKyspe25bZV0uc3RhcnQ9aTtpKz1uW2VdLmhlYWRlci5sZW5ndGg7bltlXS5lbmQ9aX1yZXR1cm4gbn1mdW5jdGlvbiByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGUsdCl7cmV0dXJue3dpZHRoOigwLG4ucmVhZFVpbnQzMikoZSx0KSxoZWlnaHQ6KDAsbi5yZWFkVWludDMyKShlLHQrNCkseDooMCxuLnJlYWRVaW50MzIpKGUsdCs4KSx5OigwLG4ucmVhZFVpbnQzMikoZSx0KzEyKSxjb21iaW5hdGlvbk9wZXJhdG9yOjcmZVt0KzE2XX19Y29uc3QgZz0xNztmdW5jdGlvbiBwcm9jZXNzU2VnbWVudChlLHQpe2NvbnN0IGE9ZS5oZWFkZXIscj1lLmRhdGEsaT1lLmVuZDtsZXQgcyxvLGMsbCxoPWUuc3RhcnQ7c3dpdGNoKGEudHlwZSl7Y2FzZSAwOmNvbnN0IGU9e30sdD0oMCxuLnJlYWRVaW50MTYpKHIsaCk7ZS5odWZmbWFuPSEhKDEmdCk7ZS5yZWZpbmVtZW50PSEhKDImdCk7ZS5odWZmbWFuREhTZWxlY3Rvcj10Pj4yJjM7ZS5odWZmbWFuRFdTZWxlY3Rvcj10Pj40JjM7ZS5iaXRtYXBTaXplU2VsZWN0b3I9dD4+NiYxO2UuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3Rvcj10Pj43JjE7ZS5iaXRtYXBDb2RpbmdDb250ZXh0VXNlZD0hISgyNTYmdCk7ZS5iaXRtYXBDb2RpbmdDb250ZXh0UmV0YWluZWQ9ISEoNTEyJnQpO2UudGVtcGxhdGU9dD4+MTAmMztlLnJlZmluZW1lbnRUZW1wbGF0ZT10Pj4xMiYxO2grPTI7aWYoIWUuaHVmZm1hbil7bD0wPT09ZS50ZW1wbGF0ZT80OjE7bz1bXTtmb3IoYz0wO2M8bDtjKyspe28ucHVzaCh7eDooMCxuLnJlYWRJbnQ4KShyLGgpLHk6KDAsbi5yZWFkSW50OCkocixoKzEpfSk7aCs9Mn1lLmF0PW99aWYoZS5yZWZpbmVtZW50JiYhZS5yZWZpbmVtZW50VGVtcGxhdGUpe289W107Zm9yKGM9MDtjPDI7YysrKXtvLnB1c2goe3g6KDAsbi5yZWFkSW50OCkocixoKSx5OigwLG4ucmVhZEludDgpKHIsaCsxKX0pO2grPTJ9ZS5yZWZpbmVtZW50QXQ9b31lLm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzPSgwLG4ucmVhZFVpbnQzMikocixoKTtoKz00O2UubnVtYmVyT2ZOZXdTeW1ib2xzPSgwLG4ucmVhZFVpbnQzMikocixoKTtoKz00O3M9W2UsYS5udW1iZXIsYS5yZWZlcnJlZFRvLHIsaCxpXTticmVhaztjYXNlIDY6Y2FzZSA3OmNvbnN0IHU9e307dS5pbmZvPXJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24ocixoKTtoKz1nO2NvbnN0IGQ9KDAsbi5yZWFkVWludDE2KShyLGgpO2grPTI7dS5odWZmbWFuPSEhKDEmZCk7dS5yZWZpbmVtZW50PSEhKDImZCk7dS5sb2dTdHJpcFNpemU9ZD4+MiYzO3Uuc3RyaXBTaXplPTE8PHUubG9nU3RyaXBTaXplO3UucmVmZXJlbmNlQ29ybmVyPWQ+PjQmMzt1LnRyYW5zcG9zZWQ9ISEoNjQmZCk7dS5jb21iaW5hdGlvbk9wZXJhdG9yPWQ+PjcmMzt1LmRlZmF1bHRQaXhlbFZhbHVlPWQ+PjkmMTt1LmRzT2Zmc2V0PWQ8PDE3Pj4yNzt1LnJlZmluZW1lbnRUZW1wbGF0ZT1kPj4xNSYxO2lmKHUuaHVmZm1hbil7Y29uc3QgZT0oMCxuLnJlYWRVaW50MTYpKHIsaCk7aCs9Mjt1Lmh1ZmZtYW5GUz0zJmU7dS5odWZmbWFuRFM9ZT4+MiYzO3UuaHVmZm1hbkRUPWU+PjQmMzt1Lmh1ZmZtYW5SZWZpbmVtZW50RFc9ZT4+NiYzO3UuaHVmZm1hblJlZmluZW1lbnRESD1lPj44JjM7dS5odWZmbWFuUmVmaW5lbWVudERYPWU+PjEwJjM7dS5odWZmbWFuUmVmaW5lbWVudERZPWU+PjEyJjM7dS5odWZmbWFuUmVmaW5lbWVudFNpemVTZWxlY3Rvcj0hISgxNjM4NCZlKX1pZih1LnJlZmluZW1lbnQmJiF1LnJlZmluZW1lbnRUZW1wbGF0ZSl7bz1bXTtmb3IoYz0wO2M8MjtjKyspe28ucHVzaCh7eDooMCxuLnJlYWRJbnQ4KShyLGgpLHk6KDAsbi5yZWFkSW50OCkocixoKzEpfSk7aCs9Mn11LnJlZmluZW1lbnRBdD1vfXUubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXM9KDAsbi5yZWFkVWludDMyKShyLGgpO2grPTQ7cz1bdSxhLnJlZmVycmVkVG8scixoLGldO2JyZWFrO2Nhc2UgMTY6Y29uc3QgZj17fSxwPXJbaCsrXTtmLm1tcj0hISgxJnApO2YudGVtcGxhdGU9cD4+MSYzO2YucGF0dGVybldpZHRoPXJbaCsrXTtmLnBhdHRlcm5IZWlnaHQ9cltoKytdO2YubWF4UGF0dGVybkluZGV4PSgwLG4ucmVhZFVpbnQzMikocixoKTtoKz00O3M9W2YsYS5udW1iZXIscixoLGldO2JyZWFrO2Nhc2UgMjI6Y2FzZSAyMzpjb25zdCBtPXt9O20uaW5mbz1yZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKHIsaCk7aCs9Zztjb25zdCBiPXJbaCsrXTttLm1tcj0hISgxJmIpO20udGVtcGxhdGU9Yj4+MSYzO20uZW5hYmxlU2tpcD0hISg4JmIpO20uY29tYmluYXRpb25PcGVyYXRvcj1iPj40Jjc7bS5kZWZhdWx0UGl4ZWxWYWx1ZT1iPj43JjE7bS5ncmlkV2lkdGg9KDAsbi5yZWFkVWludDMyKShyLGgpO2grPTQ7bS5ncmlkSGVpZ2h0PSgwLG4ucmVhZFVpbnQzMikocixoKTtoKz00O20uZ3JpZE9mZnNldFg9NDI5NDk2NzI5NSYoMCxuLnJlYWRVaW50MzIpKHIsaCk7aCs9NDttLmdyaWRPZmZzZXRZPTQyOTQ5NjcyOTUmKDAsbi5yZWFkVWludDMyKShyLGgpO2grPTQ7bS5ncmlkVmVjdG9yWD0oMCxuLnJlYWRVaW50MTYpKHIsaCk7aCs9MjttLmdyaWRWZWN0b3JZPSgwLG4ucmVhZFVpbnQxNikocixoKTtoKz0yO3M9W20sYS5yZWZlcnJlZFRvLHIsaCxpXTticmVhaztjYXNlIDM4OmNhc2UgMzk6Y29uc3QgeT17fTt5LmluZm89cmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihyLGgpO2grPWc7Y29uc3Qgdz1yW2grK107eS5tbXI9ISEoMSZ3KTt5LnRlbXBsYXRlPXc+PjEmMzt5LnByZWRpY3Rpb249ISEoOCZ3KTtpZigheS5tbXIpe2w9MD09PXkudGVtcGxhdGU/NDoxO289W107Zm9yKGM9MDtjPGw7YysrKXtvLnB1c2goe3g6KDAsbi5yZWFkSW50OCkocixoKSx5OigwLG4ucmVhZEludDgpKHIsaCsxKX0pO2grPTJ9eS5hdD1vfXM9W3kscixoLGldO2JyZWFrO2Nhc2UgNDg6Y29uc3QgUz17d2lkdGg6KDAsbi5yZWFkVWludDMyKShyLGgpLGhlaWdodDooMCxuLnJlYWRVaW50MzIpKHIsaCs0KSxyZXNvbHV0aW9uWDooMCxuLnJlYWRVaW50MzIpKHIsaCs4KSxyZXNvbHV0aW9uWTooMCxuLnJlYWRVaW50MzIpKHIsaCsxMil9OzQyOTQ5NjcyOTU9PT1TLmhlaWdodCYmZGVsZXRlIFMuaGVpZ2h0O2NvbnN0IHg9cltoKzE2XTsoMCxuLnJlYWRVaW50MTYpKHIsaCsxNyk7Uy5sb3NzbGVzcz0hISgxJngpO1MucmVmaW5lbWVudD0hISgyJngpO1MuZGVmYXVsdFBpeGVsVmFsdWU9eD4+MiYxO1MuY29tYmluYXRpb25PcGVyYXRvcj14Pj4zJjM7Uy5yZXF1aXJlc0J1ZmZlcj0hISgzMiZ4KTtTLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZT0hISg2NCZ4KTtzPVtTXTticmVhaztjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDYyOmJyZWFrO2Nhc2UgNTM6cz1bYS5udW1iZXIscixoLGldO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoYHNlZ21lbnQgdHlwZSAke2EudHlwZU5hbWV9KCR7YS50eXBlfSkgaXMgbm90IGltcGxlbWVudGVkYCl9Y29uc3QgdT0ib24iK2EudHlwZU5hbWU7dSBpbiB0JiZ0W3VdLmFwcGx5KHQscyl9ZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnRzKGUsdCl7Zm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSsrKXByb2Nlc3NTZWdtZW50KGVbYV0sdCl9Y2xhc3MgU2ltcGxlU2VnbWVudFZpc2l0b3J7b25QYWdlSW5mb3JtYXRpb24oZSl7dGhpcy5jdXJyZW50UGFnZUluZm89ZTtjb25zdCB0PWUud2lkdGgrNz4+MyxhPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KmUuaGVpZ2h0KTtlLmRlZmF1bHRQaXhlbFZhbHVlJiZhLmZpbGwoMjU1KTt0aGlzLmJ1ZmZlcj1hfWRyYXdCaXRtYXAoZSx0KXtjb25zdCBhPXRoaXMuY3VycmVudFBhZ2VJbmZvLHI9ZS53aWR0aCxuPWUuaGVpZ2h0LGk9YS53aWR0aCs3Pj4zLHM9YS5jb21iaW5hdGlvbk9wZXJhdG9yT3ZlcnJpZGU/ZS5jb21iaW5hdGlvbk9wZXJhdG9yOmEuY29tYmluYXRpb25PcGVyYXRvcixvPXRoaXMuYnVmZmVyLGM9MTI4Pj4oNyZlLngpO2xldCBsLGgsdSxkLGY9ZS55KmkrKGUueD4+Myk7c3dpdGNoKHMpe2Nhc2UgMDpmb3IobD0wO2w8bjtsKyspe3U9YztkPWY7Zm9yKGg9MDtoPHI7aCsrKXt0W2xdW2hdJiYob1tkXXw9dSk7dT4+PTE7aWYoIXUpe3U9MTI4O2QrK319Zis9aX1icmVhaztjYXNlIDI6Zm9yKGw9MDtsPG47bCsrKXt1PWM7ZD1mO2ZvcihoPTA7aDxyO2grKyl7dFtsXVtoXSYmKG9bZF1ePXUpO3U+Pj0xO2lmKCF1KXt1PTEyODtkKyt9fWYrPWl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtzfSBpcyBub3Qgc3VwcG9ydGVkYCl9fW9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbihlLHQsYSxyKXtjb25zdCBuPWUuaW5mbyxpPW5ldyBEZWNvZGluZ0NvbnRleHQodCxhLHIpLHM9ZGVjb2RlQml0bWFwKGUubW1yLG4ud2lkdGgsbi5oZWlnaHQsZS50ZW1wbGF0ZSxlLnByZWRpY3Rpb24sbnVsbCxlLmF0LGkpO3RoaXMuZHJhd0JpdG1hcChuLHMpfW9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uKCl7dGhpcy5vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24oLi4uYXJndW1lbnRzKX1vblN5bWJvbERpY3Rpb25hcnkoZSx0LGEscixpLHMpe2xldCBvLGM7aWYoZS5odWZmbWFuKXtvPWZ1bmN0aW9uIGdldFN5bWJvbERpY3Rpb25hcnlIdWZmbWFuVGFibGVzKGUsdCxhKXtsZXQgcixuLGkscyxvPTA7c3dpdGNoKGUuaHVmZm1hbkRIU2VsZWN0b3Ipe2Nhc2UgMDpjYXNlIDE6cj1nZXRTdGFuZGFyZFRhYmxlKGUuaHVmZm1hbkRIU2VsZWN0b3IrNCk7YnJlYWs7Y2FzZSAzOnI9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKG8sdCxhKTtvKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERIIHNlbGVjdG9yIil9c3dpdGNoKGUuaHVmZm1hbkRXU2VsZWN0b3Ipe2Nhc2UgMDpjYXNlIDE6bj1nZXRTdGFuZGFyZFRhYmxlKGUuaHVmZm1hbkRXU2VsZWN0b3IrMik7YnJlYWs7Y2FzZSAzOm49Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKG8sdCxhKTtvKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERXIHNlbGVjdG9yIil9aWYoZS5iaXRtYXBTaXplU2VsZWN0b3Ipe2k9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKG8sdCxhKTtvKyt9ZWxzZSBpPWdldFN0YW5kYXJkVGFibGUoMSk7cz1lLmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3I/Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKG8sdCxhKTpnZXRTdGFuZGFyZFRhYmxlKDEpO3JldHVybnt0YWJsZURlbHRhSGVpZ2h0OnIsdGFibGVEZWx0YVdpZHRoOm4sdGFibGVCaXRtYXBTaXplOmksdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXM6c319KGUsYSx0aGlzLmN1c3RvbVRhYmxlcyk7Yz1uZXcgUmVhZGVyKHIsaSxzKX1sZXQgbD10aGlzLnN5bWJvbHM7bHx8KHRoaXMuc3ltYm9scz1sPXt9KTtjb25zdCBoPVtdO2Zvcihjb25zdCBlIG9mIGEpe2NvbnN0IHQ9bFtlXTt0JiZoLnB1c2goLi4udCl9Y29uc3QgdT1uZXcgRGVjb2RpbmdDb250ZXh0KHIsaSxzKTtsW3RdPWZ1bmN0aW9uIGRlY29kZVN5bWJvbERpY3Rpb25hcnkoZSx0LGEscixpLHMsbyxjLGwsaCx1LGQpe2lmKGUmJnQpdGhyb3cgbmV3IEpiaWcyRXJyb3IoInN5bWJvbCByZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7Y29uc3QgZj1bXTtsZXQgZz0wLHA9KDAsbi5sb2cyKShhLmxlbmd0aCtyKTtjb25zdCBtPXUuZGVjb2RlcixiPXUuY29udGV4dENhY2hlO2xldCB5LHc7aWYoZSl7eT1nZXRTdGFuZGFyZFRhYmxlKDEpO3c9W107cD1NYXRoLm1heChwLDEpfWZvcig7Zi5sZW5ndGg8cjspe2crPWU/cy50YWJsZURlbHRhSGVpZ2h0LmRlY29kZShkKTpkZWNvZGVJbnRlZ2VyKGIsIklBREgiLG0pO2xldCByPTAsbj0wO2NvbnN0IGk9ZT93Lmxlbmd0aDowO2Zvcig7Oyl7Y29uc3QgaT1lP3MudGFibGVEZWx0YVdpZHRoLmRlY29kZShkKTpkZWNvZGVJbnRlZ2VyKGIsIklBRFciLG0pO2lmKG51bGw9PT1pKWJyZWFrO3IrPWk7bis9cjtsZXQgeTtpZih0KXtjb25zdCBuPWRlY29kZUludGVnZXIoYiwiSUFBSSIsbSk7aWYobj4xKXk9ZGVjb2RlVGV4dFJlZ2lvbihlLHQscixnLDAsbiwxLGEuY29uY2F0KGYpLHAsMCwwLDEsMCxzLGwsaCx1LDAsZCk7ZWxzZXtjb25zdCBlPWRlY29kZUlBSUQoYixtLHApLHQ9ZGVjb2RlSW50ZWdlcihiLCJJQVJEWCIsbSksbj1kZWNvZGVJbnRlZ2VyKGIsIklBUkRZIixtKTt5PWRlY29kZVJlZmluZW1lbnQocixnLGwsZTxhLmxlbmd0aD9hW2VdOmZbZS1hLmxlbmd0aF0sdCxuLCExLGgsdSl9Zi5wdXNoKHkpfWVsc2UgaWYoZSl3LnB1c2gocik7ZWxzZXt5PWRlY29kZUJpdG1hcCghMSxyLGcsbywhMSxudWxsLGMsdSk7Zi5wdXNoKHkpfX1pZihlJiYhdCl7Y29uc3QgZT1zLnRhYmxlQml0bWFwU2l6ZS5kZWNvZGUoZCk7ZC5ieXRlQWxpZ24oKTtsZXQgdDtpZigwPT09ZSl0PXJlYWRVbmNvbXByZXNzZWRCaXRtYXAoZCxuLGcpO2Vsc2V7Y29uc3QgYT1kLmVuZCxyPWQucG9zaXRpb24rZTtkLmVuZD1yO3Q9ZGVjb2RlTU1SQml0bWFwKGQsbixnLCExKTtkLmVuZD1hO2QucG9zaXRpb249cn1jb25zdCBhPXcubGVuZ3RoO2lmKGk9PT1hLTEpZi5wdXNoKHQpO2Vsc2V7bGV0IGUscixuLHMsbyxjPTA7Zm9yKGU9aTtlPGE7ZSsrKXtzPXdbZV07bj1jK3M7bz1bXTtmb3Iocj0wO3I8ZztyKyspby5wdXNoKHRbcl0uc3ViYXJyYXkoYyxuKSk7Zi5wdXNoKG8pO2M9bn19fX1jb25zdCBTPVtdLHg9W107bGV0IEMsdixrPSExO2NvbnN0IE89YS5sZW5ndGgrcjtmb3IoO3gubGVuZ3RoPE87KXtsZXQgdD1lP3kuZGVjb2RlKGQpOmRlY29kZUludGVnZXIoYiwiSUFFWCIsbSk7Zm9yKDt0LS07KXgucHVzaChrKTtrPSFrfWZvcihDPTAsdj1hLmxlbmd0aDtDPHY7QysrKXhbQ10mJlMucHVzaChhW0NdKTtmb3IobGV0IGU9MDtlPHI7QysrLGUrKyl4W0NdJiZTLnB1c2goZltlXSk7cmV0dXJuIFN9KGUuaHVmZm1hbixlLnJlZmluZW1lbnQsaCxlLm51bWJlck9mTmV3U3ltYm9scyxlLm51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLG8sZS50ZW1wbGF0ZSxlLmF0LGUucmVmaW5lbWVudFRlbXBsYXRlLGUucmVmaW5lbWVudEF0LHUsYyl9b25JbW1lZGlhdGVUZXh0UmVnaW9uKGUsdCxhLHIsaSl7Y29uc3Qgcz1lLmluZm87bGV0IG8sYztjb25zdCBsPXRoaXMuc3ltYm9scyxoPVtdO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9bFtlXTt0JiZoLnB1c2goLi4udCl9Y29uc3QgdT0oMCxuLmxvZzIpKGgubGVuZ3RoKTtpZihlLmh1ZmZtYW4pe2M9bmV3IFJlYWRlcihhLHIsaSk7bz1mdW5jdGlvbiBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhlLHQsYSxyLG4pe2NvbnN0IGk9W107Zm9yKGxldCBlPTA7ZTw9MzQ7ZSsrKXtjb25zdCB0PW4ucmVhZEJpdHMoNCk7aS5wdXNoKG5ldyBIdWZmbWFuTGluZShbZSx0LDAsMF0pKX1jb25zdCBzPW5ldyBIdWZmbWFuVGFibGUoaSwhMSk7aS5sZW5ndGg9MDtmb3IobGV0IGU9MDtlPHI7KXtjb25zdCB0PXMuZGVjb2RlKG4pO2lmKHQ+PTMyKXtsZXQgYSxyLHM7c3dpdGNoKHQpe2Nhc2UgMzI6aWYoMD09PWUpdGhyb3cgbmV3IEpiaWcyRXJyb3IoIm5vIHByZXZpb3VzIHZhbHVlIGluIHN5bWJvbCBJRCB0YWJsZSIpO3I9bi5yZWFkQml0cygyKSszO2E9aVtlLTFdLnByZWZpeExlbmd0aDticmVhaztjYXNlIDMzOnI9bi5yZWFkQml0cygzKSszO2E9MDticmVhaztjYXNlIDM0OnI9bi5yZWFkQml0cyg3KSsxMTthPTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBjb2RlIGxlbmd0aCBpbiBzeW1ib2wgSUQgdGFibGUiKX1mb3Iocz0wO3M8cjtzKyspe2kucHVzaChuZXcgSHVmZm1hbkxpbmUoW2UsYSwwLDBdKSk7ZSsrfX1lbHNle2kucHVzaChuZXcgSHVmZm1hbkxpbmUoW2UsdCwwLDBdKSk7ZSsrfX1uLmJ5dGVBbGlnbigpO2NvbnN0IG89bmV3IEh1ZmZtYW5UYWJsZShpLCExKTtsZXQgYyxsLGgsdT0wO3N3aXRjaChlLmh1ZmZtYW5GUyl7Y2FzZSAwOmNhc2UgMTpjPWdldFN0YW5kYXJkVGFibGUoZS5odWZmbWFuRlMrNik7YnJlYWs7Y2FzZSAzOmM9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKHUsdCxhKTt1Kys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIil9c3dpdGNoKGUuaHVmZm1hbkRTKXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpsPWdldFN0YW5kYXJkVGFibGUoZS5odWZmbWFuRFMrOCk7YnJlYWs7Y2FzZSAzOmw9Z2V0Q3VzdG9tSHVmZm1hblRhYmxlKHUsdCxhKTt1Kys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yIil9c3dpdGNoKGUuaHVmZm1hbkRUKXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpoPWdldFN0YW5kYXJkVGFibGUoZS5odWZmbWFuRFQrMTEpO2JyZWFrO2Nhc2UgMzpoPWdldEN1c3RvbUh1ZmZtYW5UYWJsZSh1LHQsYSk7dSsrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvciIpfWlmKGUucmVmaW5lbWVudCl0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybntzeW1ib2xJRFRhYmxlOm8sdGFibGVGaXJzdFM6Yyx0YWJsZURlbHRhUzpsLHRhYmxlRGVsdGFUOmh9fShlLHQsdGhpcy5jdXN0b21UYWJsZXMsaC5sZW5ndGgsYyl9Y29uc3QgZD1uZXcgRGVjb2RpbmdDb250ZXh0KGEscixpKSxmPWRlY29kZVRleHRSZWdpb24oZS5odWZmbWFuLGUucmVmaW5lbWVudCxzLndpZHRoLHMuaGVpZ2h0LGUuZGVmYXVsdFBpeGVsVmFsdWUsZS5udW1iZXJPZlN5bWJvbEluc3RhbmNlcyxlLnN0cmlwU2l6ZSxoLHUsZS50cmFuc3Bvc2VkLGUuZHNPZmZzZXQsZS5yZWZlcmVuY2VDb3JuZXIsZS5jb21iaW5hdGlvbk9wZXJhdG9yLG8sZS5yZWZpbmVtZW50VGVtcGxhdGUsZS5yZWZpbmVtZW50QXQsZCxlLmxvZ1N0cmlwU2l6ZSxjKTt0aGlzLmRyYXdCaXRtYXAocyxmKX1vbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbigpe3RoaXMub25JbW1lZGlhdGVUZXh0UmVnaW9uKC4uLmFyZ3VtZW50cyl9b25QYXR0ZXJuRGljdGlvbmFyeShlLHQsYSxyLG4pe2xldCBpPXRoaXMucGF0dGVybnM7aXx8KHRoaXMucGF0dGVybnM9aT17fSk7Y29uc3Qgcz1uZXcgRGVjb2RpbmdDb250ZXh0KGEscixuKTtpW3RdPWZ1bmN0aW9uIGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KGUsdCxhLHIsbixpKXtjb25zdCBzPVtdO2lmKCFlKXtzLnB1c2goe3g6LXQseTowfSk7MD09PW4mJnMucHVzaCh7eDotMyx5Oi0xfSx7eDoyLHk6LTJ9LHt4Oi0yLHk6LTJ9KX1jb25zdCBvPWRlY29kZUJpdG1hcChlLChyKzEpKnQsYSxuLCExLG51bGwscyxpKSxjPVtdO2ZvcihsZXQgZT0wO2U8PXI7ZSsrKXtjb25zdCByPVtdLG49dCplLGk9bit0O2ZvcihsZXQgZT0wO2U8YTtlKyspci5wdXNoKG9bZV0uc3ViYXJyYXkobixpKSk7Yy5wdXNoKHIpfXJldHVybiBjfShlLm1tcixlLnBhdHRlcm5XaWR0aCxlLnBhdHRlcm5IZWlnaHQsZS5tYXhQYXR0ZXJuSW5kZXgsZS50ZW1wbGF0ZSxzKX1vbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uKGUsdCxhLHIsaSl7Y29uc3Qgcz10aGlzLnBhdHRlcm5zW3RbMF1dLG89ZS5pbmZvLGM9bmV3IERlY29kaW5nQ29udGV4dChhLHIsaSksbD1mdW5jdGlvbiBkZWNvZGVIYWxmdG9uZVJlZ2lvbihlLHQsYSxyLGkscyxvLGMsbCxoLHUsZCxmLGcscCl7aWYobyl0aHJvdyBuZXcgSmJpZzJFcnJvcigic2tpcCBpcyBub3Qgc3VwcG9ydGVkIik7aWYoMCE9PWMpdGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICIke2N9IiBpcyBub3Qgc3VwcG9ydGVkIGluIGhhbGZ0b25lIHJlZ2lvbmApO2NvbnN0IG09W107bGV0IGIseSx3O2ZvcihiPTA7YjxpO2IrKyl7dz1uZXcgVWludDhBcnJheShyKTtpZihzKWZvcih5PTA7eTxyO3krKyl3W3ldPXM7bS5wdXNoKHcpfWNvbnN0IFM9dC5sZW5ndGgseD10WzBdLEM9eFswXS5sZW5ndGgsdj14Lmxlbmd0aCxrPSgwLG4ubG9nMikoUyksTz1bXTtpZighZSl7Ty5wdXNoKHt4OmE8PTE/MzoyLHk6LTF9KTswPT09YSYmTy5wdXNoKHt4Oi0zLHk6LTF9LHt4OjIseTotMn0se3g6LTIseTotMn0pfWNvbnN0IFQ9W107bGV0IE0sRSxELE4sUixMLCQsXyxqLFUsWDtlJiYoTT1uZXcgUmVhZGVyKHAuZGF0YSxwLnN0YXJ0LHAuZW5kKSk7Zm9yKGI9ay0xO2I+PTA7Yi0tKXtFPWU/ZGVjb2RlTU1SQml0bWFwKE0sbCxoLCEwKTpkZWNvZGVCaXRtYXAoITEsbCxoLGEsITEsbnVsbCxPLHApO1RbYl09RX1mb3IoRD0wO0Q8aDtEKyspZm9yKE49MDtOPGw7TisrKXtSPTA7TD0wO2Zvcih5PWstMTt5Pj0wO3ktLSl7Ul49VFt5XVtEXVtOXTtMfD1SPDx5fSQ9dFtMXTtfPXUrRCpnK04qZj4+ODtqPWQrRCpmLU4qZz4+ODtpZihfPj0wJiZfK0M8PXImJmo+PTAmJmordjw9aSlmb3IoYj0wO2I8djtiKyspe1g9bVtqK2JdO1U9JFtiXTtmb3IoeT0wO3k8Qzt5KyspWFtfK3ldfD1VW3ldfWVsc2V7bGV0IGUsdDtmb3IoYj0wO2I8djtiKyspe3Q9aitiO2lmKCEodDwwfHx0Pj1pKSl7WD1tW3RdO1U9JFtiXTtmb3IoeT0wO3k8Qzt5Kyspe2U9Xyt5O2U+PTAmJmU8ciYmKFhbZV18PVVbeV0pfX19fX1yZXR1cm4gbX0oZS5tbXIscyxlLnRlbXBsYXRlLG8ud2lkdGgsby5oZWlnaHQsZS5kZWZhdWx0UGl4ZWxWYWx1ZSxlLmVuYWJsZVNraXAsZS5jb21iaW5hdGlvbk9wZXJhdG9yLGUuZ3JpZFdpZHRoLGUuZ3JpZEhlaWdodCxlLmdyaWRPZmZzZXRYLGUuZ3JpZE9mZnNldFksZS5ncmlkVmVjdG9yWCxlLmdyaWRWZWN0b3JZLGMpO3RoaXMuZHJhd0JpdG1hcChvLGwpfW9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbigpe3RoaXMub25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiguLi5hcmd1bWVudHMpfW9uVGFibGVzKGUsdCxhLHIpe2xldCBpPXRoaXMuY3VzdG9tVGFibGVzO2l8fCh0aGlzLmN1c3RvbVRhYmxlcz1pPXt9KTtpW2VdPWZ1bmN0aW9uIGRlY29kZVRhYmxlc1NlZ21lbnQoZSx0LGEpe2NvbnN0IHI9ZVt0XSxpPTQyOTQ5NjcyOTUmKDAsbi5yZWFkVWludDMyKShlLHQrMSkscz00Mjk0OTY3Mjk1JigwLG4ucmVhZFVpbnQzMikoZSx0KzUpLG89bmV3IFJlYWRlcihlLHQrOSxhKSxjPTErKHI+PjEmNyksbD0xKyhyPj40JjcpLGg9W107bGV0IHUsZCxmPWk7ZG97dT1vLnJlYWRCaXRzKGMpO2Q9by5yZWFkQml0cyhsKTtoLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtmLHUsZCwwXSkpO2YrPTE8PGR9d2hpbGUoZjxzKTt1PW8ucmVhZEJpdHMoYyk7aC5wdXNoKG5ldyBIdWZmbWFuTGluZShbaS0xLHUsMzIsMCwibG93ZXIiXSkpO3U9by5yZWFkQml0cyhjKTtoLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtzLHUsMzIsMF0pKTtpZigxJnIpe3U9by5yZWFkQml0cyhjKTtoLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFt1LDBdKSl9cmV0dXJuIG5ldyBIdWZmbWFuVGFibGUoaCwhMSl9KHQsYSxyKX19Y2xhc3MgSHVmZm1hbkxpbmV7Y29uc3RydWN0b3IoZSl7aWYoMj09PWUubGVuZ3RoKXt0aGlzLmlzT09CPSEwO3RoaXMucmFuZ2VMb3c9MDt0aGlzLnByZWZpeExlbmd0aD1lWzBdO3RoaXMucmFuZ2VMZW5ndGg9MDt0aGlzLnByZWZpeENvZGU9ZVsxXTt0aGlzLmlzTG93ZXJSYW5nZT0hMX1lbHNle3RoaXMuaXNPT0I9ITE7dGhpcy5yYW5nZUxvdz1lWzBdO3RoaXMucHJlZml4TGVuZ3RoPWVbMV07dGhpcy5yYW5nZUxlbmd0aD1lWzJdO3RoaXMucHJlZml4Q29kZT1lWzNdO3RoaXMuaXNMb3dlclJhbmdlPSJsb3dlciI9PT1lWzRdfX19Y2xhc3MgSHVmZm1hblRyZWVOb2Rle2NvbnN0cnVjdG9yKGUpe3RoaXMuY2hpbGRyZW49W107aWYoZSl7dGhpcy5pc0xlYWY9ITA7dGhpcy5yYW5nZUxlbmd0aD1lLnJhbmdlTGVuZ3RoO3RoaXMucmFuZ2VMb3c9ZS5yYW5nZUxvdzt0aGlzLmlzTG93ZXJSYW5nZT1lLmlzTG93ZXJSYW5nZTt0aGlzLmlzT09CPWUuaXNPT0J9ZWxzZSB0aGlzLmlzTGVhZj0hMX1idWlsZFRyZWUoZSx0KXtjb25zdCBhPWUucHJlZml4Q29kZT4+dCYxO2lmKHQ8PTApdGhpcy5jaGlsZHJlblthXT1uZXcgSHVmZm1hblRyZWVOb2RlKGUpO2Vsc2V7bGV0IHI9dGhpcy5jaGlsZHJlblthXTtyfHwodGhpcy5jaGlsZHJlblthXT1yPW5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCkpO3IuYnVpbGRUcmVlKGUsdC0xKX19ZGVjb2RlTm9kZShlKXtpZih0aGlzLmlzTGVhZil7aWYodGhpcy5pc09PQilyZXR1cm4gbnVsbDtjb25zdCB0PWUucmVhZEJpdHModGhpcy5yYW5nZUxlbmd0aCk7cmV0dXJuIHRoaXMucmFuZ2VMb3crKHRoaXMuaXNMb3dlclJhbmdlPy10OnQpfWNvbnN0IHQ9dGhpcy5jaGlsZHJlbltlLnJlYWRCaXQoKV07aWYoIXQpdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBkYXRhIik7cmV0dXJuIHQuZGVjb2RlTm9kZShlKX19Y2xhc3MgSHVmZm1hblRhYmxle2NvbnN0cnVjdG9yKGUsdCl7dHx8dGhpcy5hc3NpZ25QcmVmaXhDb2RlcyhlKTt0aGlzLnJvb3ROb2RlPW5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7Zm9yKGxldCB0PTAsYT1lLmxlbmd0aDt0PGE7dCsrKXtjb25zdCBhPWVbdF07YS5wcmVmaXhMZW5ndGg+MCYmdGhpcy5yb290Tm9kZS5idWlsZFRyZWUoYSxhLnByZWZpeExlbmd0aC0xKX19ZGVjb2RlKGUpe3JldHVybiB0aGlzLnJvb3ROb2RlLmRlY29kZU5vZGUoZSl9YXNzaWduUHJlZml4Q29kZXMoZSl7Y29uc3QgdD1lLmxlbmd0aDtsZXQgYT0wO2ZvcihsZXQgcj0wO3I8dDtyKyspYT1NYXRoLm1heChhLGVbcl0ucHJlZml4TGVuZ3RoKTtjb25zdCByPW5ldyBVaW50MzJBcnJheShhKzEpO2ZvcihsZXQgYT0wO2E8dDthKyspcltlW2FdLnByZWZpeExlbmd0aF0rKztsZXQgbixpLHMsbz0xLGM9MDtyWzBdPTA7Zm9yKDtvPD1hOyl7Yz1jK3Jbby0xXTw8MTtuPWM7aT0wO2Zvcig7aTx0Oyl7cz1lW2ldO2lmKHMucHJlZml4TGVuZ3RoPT09byl7cy5wcmVmaXhDb2RlPW47bisrfWkrK31vKyt9fX1jb25zdCBwPXt9O2Z1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUoZSl7bGV0IHQsYT1wW2VdO2lmKGEpcmV0dXJuIGE7c3dpdGNoKGUpe2Nhc2UgMTp0PVtbMCwxLDQsMF0sWzE2LDIsOCwyXSxbMjcyLDMsMTYsNl0sWzY1ODA4LDMsMzIsN11dO2JyZWFrO2Nhc2UgMjp0PVtbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFs3NSw2LDMyLDYyXSxbNiw2M11dO2JyZWFrO2Nhc2UgMzp0PVtbLTI1Niw4LDgsMjU0XSxbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFstMjU3LDgsMzIsMjU1LCJsb3dlciJdLFs3NSw3LDMyLDEyNl0sWzYsNjJdXTticmVhaztjYXNlIDQ6dD1bWzEsMSwwLDBdLFsyLDIsMCwyXSxbMywzLDAsNl0sWzQsNCwzLDE0XSxbMTIsNSw2LDMwXSxbNzYsNSwzMiwzMV1dO2JyZWFrO2Nhc2UgNTp0PVtbLTI1NSw3LDgsMTI2XSxbMSwxLDAsMF0sWzIsMiwwLDJdLFszLDMsMCw2XSxbNCw0LDMsMTRdLFsxMiw1LDYsMzBdLFstMjU2LDcsMzIsMTI3LCJsb3dlciJdLFs3Niw2LDMyLDYyXV07YnJlYWs7Y2FzZSA2OnQ9W1stMjA0OCw1LDEwLDI4XSxbLTEwMjQsNCw5LDhdLFstNTEyLDQsOCw5XSxbLTI1Niw0LDcsMTBdLFstMTI4LDUsNiwyOV0sWy02NCw1LDUsMzBdLFstMzIsNCw1LDExXSxbMCwyLDcsMF0sWzEyOCwzLDcsMl0sWzI1NiwzLDgsM10sWzUxMiw0LDksMTJdLFsxMDI0LDQsMTAsMTNdLFstMjA0OSw2LDMyLDYyLCJsb3dlciJdLFsyMDQ4LDYsMzIsNjNdXTticmVhaztjYXNlIDc6dD1bWy0xMDI0LDQsOSw4XSxbLTUxMiwzLDgsMF0sWy0yNTYsNCw3LDldLFstMTI4LDUsNiwyNl0sWy02NCw1LDUsMjddLFstMzIsNCw1LDEwXSxbMCw0LDUsMTFdLFszMiw1LDUsMjhdLFs2NCw1LDYsMjldLFsxMjgsNCw3LDEyXSxbMjU2LDMsOCwxXSxbNTEyLDMsOSwyXSxbMTAyNCwzLDEwLDNdLFstMTAyNSw1LDMyLDMwLCJsb3dlciJdLFsyMDQ4LDUsMzIsMzFdXTticmVhaztjYXNlIDg6dD1bWy0xNSw4LDMsMjUyXSxbLTcsOSwxLDUwOF0sWy01LDgsMSwyNTNdLFstMyw5LDAsNTA5XSxbLTIsNywwLDEyNF0sWy0xLDQsMCwxMF0sWzAsMiwxLDBdLFsyLDUsMCwyNl0sWzMsNiwwLDU4XSxbNCwzLDQsNF0sWzIwLDYsMSw1OV0sWzIyLDQsNCwxMV0sWzM4LDQsNSwxMl0sWzcwLDUsNiwyN10sWzEzNCw1LDcsMjhdLFsyNjIsNiw3LDYwXSxbMzkwLDcsOCwxMjVdLFs2NDYsNiwxMCw2MV0sWy0xNiw5LDMyLDUxMCwibG93ZXIiXSxbMTY3MCw5LDMyLDUxMV0sWzIsMV1dO2JyZWFrO2Nhc2UgOTp0PVtbLTMxLDgsNCwyNTJdLFstMTUsOSwyLDUwOF0sWy0xMSw4LDIsMjUzXSxbLTcsOSwxLDUwOV0sWy01LDcsMSwxMjRdLFstMyw0LDEsMTBdLFstMSwzLDEsMl0sWzEsMywxLDNdLFszLDUsMSwyNl0sWzUsNiwxLDU4XSxbNywzLDUsNF0sWzM5LDYsMiw1OV0sWzQzLDQsNSwxMV0sWzc1LDQsNiwxMl0sWzEzOSw1LDcsMjddLFsyNjcsNSw4LDI4XSxbNTIzLDYsOCw2MF0sWzc3OSw3LDksMTI1XSxbMTI5MSw2LDExLDYxXSxbLTMyLDksMzIsNTEwLCJsb3dlciJdLFszMzM5LDksMzIsNTExXSxbMiwwXV07YnJlYWs7Y2FzZSAxMDp0PVtbLTIxLDcsNCwxMjJdLFstNSw4LDAsMjUyXSxbLTQsNywwLDEyM10sWy0zLDUsMCwyNF0sWy0yLDIsMiwwXSxbMiw1LDAsMjVdLFszLDYsMCw1NF0sWzQsNywwLDEyNF0sWzUsOCwwLDI1M10sWzYsMiw2LDFdLFs3MCw1LDUsMjZdLFsxMDIsNiw1LDU1XSxbMTM0LDYsNiw1Nl0sWzE5OCw2LDcsNTddLFszMjYsNiw4LDU4XSxbNTgyLDYsOSw1OV0sWzEwOTQsNiwxMCw2MF0sWzIxMTgsNywxMSwxMjVdLFstMjIsOCwzMiwyNTQsImxvd2VyIl0sWzQxNjYsOCwzMiwyNTVdLFsyLDJdXTticmVhaztjYXNlIDExOnQ9W1sxLDEsMCwwXSxbMiwyLDEsMl0sWzQsNCwwLDEyXSxbNSw0LDEsMTNdLFs3LDUsMSwyOF0sWzksNSwyLDI5XSxbMTMsNiwyLDYwXSxbMTcsNywyLDEyMl0sWzIxLDcsMywxMjNdLFsyOSw3LDQsMTI0XSxbNDUsNyw1LDEyNV0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDEyOnQ9W1sxLDEsMCwwXSxbMiwyLDAsMl0sWzMsMywxLDZdLFs1LDUsMCwyOF0sWzYsNSwxLDI5XSxbOCw2LDEsNjBdLFsxMCw3LDAsMTIyXSxbMTEsNywxLDEyM10sWzEzLDcsMiwxMjRdLFsxNyw3LDMsMTI1XSxbMjUsNyw0LDEyNl0sWzQxLDgsNSwyNTRdLFs3Myw4LDMyLDI1NV1dO2JyZWFrO2Nhc2UgMTM6dD1bWzEsMSwwLDBdLFsyLDMsMCw0XSxbMyw0LDAsMTJdLFs0LDUsMCwyOF0sWzUsNCwxLDEzXSxbNywzLDMsNV0sWzE1LDYsMSw1OF0sWzE3LDYsMiw1OV0sWzIxLDYsMyw2MF0sWzI5LDYsNCw2MV0sWzQ1LDYsNSw2Ml0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDE0OnQ9W1stMiwzLDAsNF0sWy0xLDMsMCw1XSxbMCwxLDAsMF0sWzEsMywwLDZdLFsyLDMsMCw3XV07YnJlYWs7Y2FzZSAxNTp0PVtbLTI0LDcsNCwxMjRdLFstOCw2LDIsNjBdLFstNCw1LDEsMjhdLFstMiw0LDAsMTJdLFstMSwzLDAsNF0sWzAsMSwwLDBdLFsxLDMsMCw1XSxbMiw0LDAsMTNdLFszLDUsMSwyOV0sWzUsNiwyLDYxXSxbOSw3LDQsMTI1XSxbLTI1LDcsMzIsMTI2LCJsb3dlciJdLFsyNSw3LDMyLDEyN11dO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEpiaWcyRXJyb3IoYHN0YW5kYXJkIHRhYmxlIEIuJHtlfSBkb2VzIG5vdCBleGlzdGApfWZvcihsZXQgZT0wLGE9dC5sZW5ndGg7ZTxhO2UrKyl0W2VdPW5ldyBIdWZmbWFuTGluZSh0W2VdKTthPW5ldyBIdWZmbWFuVGFibGUodCwhMCk7cFtlXT1hO3JldHVybiBhfWNsYXNzIFJlYWRlcntjb25zdHJ1Y3RvcihlLHQsYSl7dGhpcy5kYXRhPWU7dGhpcy5zdGFydD10O3RoaXMuZW5kPWE7dGhpcy5wb3NpdGlvbj10O3RoaXMuc2hpZnQ9LTE7dGhpcy5jdXJyZW50Qnl0ZT0wfXJlYWRCaXQoKXtpZih0aGlzLnNoaWZ0PDApe2lmKHRoaXMucG9zaXRpb24+PXRoaXMuZW5kKXRocm93IG5ldyBKYmlnMkVycm9yKCJlbmQgb2YgZGF0YSB3aGlsZSByZWFkaW5nIGJpdCIpO3RoaXMuY3VycmVudEJ5dGU9dGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107dGhpcy5zaGlmdD03fWNvbnN0IGU9dGhpcy5jdXJyZW50Qnl0ZT4+dGhpcy5zaGlmdCYxO3RoaXMuc2hpZnQtLTtyZXR1cm4gZX1yZWFkQml0cyhlKXtsZXQgdCxhPTA7Zm9yKHQ9ZS0xO3Q+PTA7dC0tKWF8PXRoaXMucmVhZEJpdCgpPDx0O3JldHVybiBhfWJ5dGVBbGlnbigpe3RoaXMuc2hpZnQ9LTF9bmV4dCgpe3JldHVybiB0aGlzLnBvc2l0aW9uPj10aGlzLmVuZD8tMTp0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXX19ZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGUsdCxhKXtsZXQgcj0wO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7Y29uc3QgaT1hW3Rbbl1dO2lmKGkpe2lmKGU9PT1yKXJldHVybiBpO3IrK319dGhyb3cgbmV3IEpiaWcyRXJyb3IoImNhbid0IGZpbmQgY3VzdG9tIEh1ZmZtYW4gdGFibGUiKX1mdW5jdGlvbiByZWFkVW5jb21wcmVzc2VkQml0bWFwKGUsdCxhKXtjb25zdCByPVtdO2ZvcihsZXQgbj0wO248YTtuKyspe2NvbnN0IGE9bmV3IFVpbnQ4QXJyYXkodCk7ci5wdXNoKGEpO2ZvcihsZXQgcj0wO3I8dDtyKyspYVtyXT1lLnJlYWRCaXQoKTtlLmJ5dGVBbGlnbigpfXJldHVybiByfWZ1bmN0aW9uIGRlY29kZU1NUkJpdG1hcChlLHQsYSxyKXtjb25zdCBuPXtLOi0xLENvbHVtbnM6dCxSb3dzOmEsQmxhY2tJczE6ITAsRW5kT2ZCbG9jazpyfSxpPW5ldyBzLkNDSVRURmF4RGVjb2RlcihlLG4pLG89W107bGV0IGMsbD0hMTtmb3IobGV0IGU9MDtlPGE7ZSsrKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQpO28ucHVzaChlKTtsZXQgYT0tMTtmb3IobGV0IHI9MDtyPHQ7cisrKXtpZihhPDApe2M9aS5yZWFkTmV4dENoYXIoKTtpZigtMT09PWMpe2M9MDtsPSEwfWE9N31lW3JdPWM+PmEmMTthLS19fWlmKHImJiFsKXtjb25zdCBlPTU7Zm9yKGxldCB0PTA7dDxlJiYtMSE9PWkucmVhZE5leHRDaGFyKCk7dCsrKTt9cmV0dXJuIG99dC5KYmlnMkltYWdlPWNsYXNzIEpiaWcySW1hZ2V7cGFyc2VDaHVua3MoZSl7cmV0dXJuIGZ1bmN0aW9uIHBhcnNlSmJpZzJDaHVua3MoZSl7Y29uc3QgdD1uZXcgU2ltcGxlU2VnbWVudFZpc2l0b3I7Zm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSsrKXtjb25zdCByPWVbYV07cHJvY2Vzc1NlZ21lbnRzKHJlYWRTZWdtZW50cyh7fSxyLmRhdGEsci5zdGFydCxyLmVuZCksdCl9cmV0dXJuIHQuYnVmZmVyfShlKX1wYXJzZShlKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogSmJpZzJJbWFnZS5wYXJzZSIpfX19LChlLHQpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkFyaXRobWV0aWNEZWNvZGVyPXZvaWQgMDtjb25zdCBhPVt7cWU6MjIwMTcsbm1wczoxLG5scHM6MSxzd2l0Y2hGbGFnOjF9LHtxZToxMzMxMyxubXBzOjIsbmxwczo2LHN3aXRjaEZsYWc6MH0se3FlOjYxNDUsbm1wczozLG5scHM6OSxzd2l0Y2hGbGFnOjB9LHtxZToyNzUzLG5tcHM6NCxubHBzOjEyLHN3aXRjaEZsYWc6MH0se3FlOjEzMTMsbm1wczo1LG5scHM6Mjksc3dpdGNoRmxhZzowfSx7cWU6NTQ1LG5tcHM6MzgsbmxwczozMyxzd2l0Y2hGbGFnOjB9LHtxZToyMjAxNyxubXBzOjcsbmxwczo2LHN3aXRjaEZsYWc6MX0se3FlOjIxNTA1LG5tcHM6OCxubHBzOjE0LHN3aXRjaEZsYWc6MH0se3FlOjE4NDMzLG5tcHM6OSxubHBzOjE0LHN3aXRjaEZsYWc6MH0se3FlOjE0MzM3LG5tcHM6MTAsbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxMjI4OSxubXBzOjExLG5scHM6MTcsc3dpdGNoRmxhZzowfSx7cWU6OTIxNyxubXBzOjEyLG5scHM6MTgsc3dpdGNoRmxhZzowfSx7cWU6NzE2OSxubXBzOjEzLG5scHM6MjAsc3dpdGNoRmxhZzowfSx7cWU6NTYzMyxubXBzOjI5LG5scHM6MjEsc3dpdGNoRmxhZzowfSx7cWU6MjIwMTcsbm1wczoxNSxubHBzOjE0LHN3aXRjaEZsYWc6MX0se3FlOjIxNTA1LG5tcHM6MTYsbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToyMDczNyxubXBzOjE3LG5scHM6MTUsc3dpdGNoRmxhZzowfSx7cWU6MTg0MzMsbm1wczoxOCxubHBzOjE2LHN3aXRjaEZsYWc6MH0se3FlOjE0MzM3LG5tcHM6MTksbmxwczoxNyxzd2l0Y2hGbGFnOjB9LHtxZToxMzMxMyxubXBzOjIwLG5scHM6MTgsc3dpdGNoRmxhZzowfSx7cWU6MTIyODksbm1wczoyMSxubHBzOjE5LHN3aXRjaEZsYWc6MH0se3FlOjEwMjQxLG5tcHM6MjIsbmxwczoxOSxzd2l0Y2hGbGFnOjB9LHtxZTo5MjE3LG5tcHM6MjMsbmxwczoyMCxzd2l0Y2hGbGFnOjB9LHtxZTo4NzA1LG5tcHM6MjQsbmxwczoyMSxzd2l0Y2hGbGFnOjB9LHtxZTo3MTY5LG5tcHM6MjUsbmxwczoyMixzd2l0Y2hGbGFnOjB9LHtxZTo2MTQ1LG5tcHM6MjYsbmxwczoyMyxzd2l0Y2hGbGFnOjB9LHtxZTo1NjMzLG5tcHM6MjcsbmxwczoyNCxzd2l0Y2hGbGFnOjB9LHtxZTo1MTIxLG5tcHM6MjgsbmxwczoyNSxzd2l0Y2hGbGFnOjB9LHtxZTo0NjA5LG5tcHM6MjksbmxwczoyNixzd2l0Y2hGbGFnOjB9LHtxZTo0MzUzLG5tcHM6MzAsbmxwczoyNyxzd2l0Y2hGbGFnOjB9LHtxZToyNzUzLG5tcHM6MzEsbmxwczoyOCxzd2l0Y2hGbGFnOjB9LHtxZToyNDk3LG5tcHM6MzIsbmxwczoyOSxzd2l0Y2hGbGFnOjB9LHtxZToyMjA5LG5tcHM6MzMsbmxwczozMCxzd2l0Y2hGbGFnOjB9LHtxZToxMzEzLG5tcHM6MzQsbmxwczozMSxzd2l0Y2hGbGFnOjB9LHtxZToxMDg5LG5tcHM6MzUsbmxwczozMixzd2l0Y2hGbGFnOjB9LHtxZTo2NzMsbm1wczozNixubHBzOjMzLHN3aXRjaEZsYWc6MH0se3FlOjU0NSxubXBzOjM3LG5scHM6MzQsc3dpdGNoRmxhZzowfSx7cWU6MzIxLG5tcHM6MzgsbmxwczozNSxzd2l0Y2hGbGFnOjB9LHtxZToyNzMsbm1wczozOSxubHBzOjM2LHN3aXRjaEZsYWc6MH0se3FlOjEzMyxubXBzOjQwLG5scHM6Mzcsc3dpdGNoRmxhZzowfSx7cWU6NzMsbm1wczo0MSxubHBzOjM4LHN3aXRjaEZsYWc6MH0se3FlOjM3LG5tcHM6NDIsbmxwczozOSxzd2l0Y2hGbGFnOjB9LHtxZToyMSxubXBzOjQzLG5scHM6NDAsc3dpdGNoRmxhZzowfSx7cWU6OSxubXBzOjQ0LG5scHM6NDEsc3dpdGNoRmxhZzowfSx7cWU6NSxubXBzOjQ1LG5scHM6NDIsc3dpdGNoRmxhZzowfSx7cWU6MSxubXBzOjQ1LG5scHM6NDMsc3dpdGNoRmxhZzowfSx7cWU6MjIwMTcsbm1wczo0NixubHBzOjQ2LHN3aXRjaEZsYWc6MH1dO3QuQXJpdGhtZXRpY0RlY29kZXI9Y2xhc3MgQXJpdGhtZXRpY0RlY29kZXJ7Y29uc3RydWN0b3IoZSx0LGEpe3RoaXMuZGF0YT1lO3RoaXMuYnA9dDt0aGlzLmRhdGFFbmQ9YTt0aGlzLmNoaWdoPWVbdF07dGhpcy5jbG93PTA7dGhpcy5ieXRlSW4oKTt0aGlzLmNoaWdoPXRoaXMuY2hpZ2g8PDcmNjU1MzV8dGhpcy5jbG93Pj45JjEyNzt0aGlzLmNsb3c9dGhpcy5jbG93PDw3JjY1NTM1O3RoaXMuY3QtPTc7dGhpcy5hPTMyNzY4fWJ5dGVJbigpe2NvbnN0IGU9dGhpcy5kYXRhO2xldCB0PXRoaXMuYnA7aWYoMjU1PT09ZVt0XSlpZihlW3QrMV0+MTQzKXt0aGlzLmNsb3crPTY1MjgwO3RoaXMuY3Q9OH1lbHNle3QrKzt0aGlzLmNsb3crPWVbdF08PDk7dGhpcy5jdD03O3RoaXMuYnA9dH1lbHNle3QrKzt0aGlzLmNsb3crPXQ8dGhpcy5kYXRhRW5kP2VbdF08PDg6NjUyODA7dGhpcy5jdD04O3RoaXMuYnA9dH1pZih0aGlzLmNsb3c+NjU1MzUpe3RoaXMuY2hpZ2grPXRoaXMuY2xvdz4+MTY7dGhpcy5jbG93Jj02NTUzNX19cmVhZEJpdChlLHQpe2xldCByPWVbdF0+PjEsbj0xJmVbdF07Y29uc3QgaT1hW3JdLHM9aS5xZTtsZXQgbyxjPXRoaXMuYS1zO2lmKHRoaXMuY2hpZ2g8cylpZihjPHMpe2M9cztvPW47cj1pLm5tcHN9ZWxzZXtjPXM7bz0xXm47MT09PWkuc3dpdGNoRmxhZyYmKG49byk7cj1pLm5scHN9ZWxzZXt0aGlzLmNoaWdoLT1zO2lmKDAhPSgzMjc2OCZjKSl7dGhpcy5hPWM7cmV0dXJuIG59aWYoYzxzKXtvPTFebjsxPT09aS5zd2l0Y2hGbGFnJiYobj1vKTtyPWkubmxwc31lbHNle289bjtyPWkubm1wc319ZG97MD09PXRoaXMuY3QmJnRoaXMuYnl0ZUluKCk7Yzw8PTE7dGhpcy5jaGlnaD10aGlzLmNoaWdoPDwxJjY1NTM1fHRoaXMuY2xvdz4+MTUmMTt0aGlzLmNsb3c9dGhpcy5jbG93PDwxJjY1NTM1O3RoaXMuY3QtLX13aGlsZSgwPT0oMzI3NjgmYykpO3RoaXMuYT1jO2VbdF09cjw8MXxuO3JldHVybiBvfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSnBlZ1N0cmVhbT12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO3ZhciByPWEoMTY4KSxuPWEoMTUwKSxpPWEoMTc3KSxzPWEoMTQ0KTtjbGFzcyBKcGVnU3RyZWFtIGV4dGVuZHMgci5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LGEpe2xldCByO2Zvcig7LTEhPT0ocj1lLmdldEJ5dGUoKSk7KWlmKDI1NT09PXIpe2Uuc2tpcCgtMSk7YnJlYWt9c3VwZXIodCk7dGhpcy5zdHJlYW09ZTt0aGlzLmRpY3Q9ZS5kaWN0O3RoaXMubWF5YmVMZW5ndGg9dDt0aGlzLnBhcmFtcz1hfWdldCBieXRlcygpe3JldHVybigwLHMuc2hhZG93KSh0aGlzLCJieXRlcyIsdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpfWVuc3VyZUJ1ZmZlcihlKXt9cmVhZEJsb2NrKCl7aWYodGhpcy5lb2YpcmV0dXJuO2NvbnN0IGU9e2RlY29kZVRyYW5zZm9ybTp2b2lkIDAsY29sb3JUcmFuc2Zvcm06dm9pZCAwfSx0PXRoaXMuZGljdC5nZXRBcnJheSgiRCIsIkRlY29kZSIpO2lmKCh0aGlzLmZvcmNlUkdCQXx8dGhpcy5mb3JjZVJHQikmJkFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGE9dGhpcy5kaWN0LmdldCgiQlBDIiwiQml0c1BlckNvbXBvbmVudCIpfHw4LHI9dC5sZW5ndGgsbj1uZXcgSW50MzJBcnJheShyKTtsZXQgaT0hMTtjb25zdCBzPSgxPDxhKS0xO2ZvcihsZXQgZT0wO2U8cjtlKz0yKXtuW2VdPTI1NioodFtlKzFdLXRbZV0pfDA7bltlKzFdPXRbZV0qc3wwOzI1Nj09PW5bZV0mJjA9PT1uW2UrMV18fChpPSEwKX1pJiYoZS5kZWNvZGVUcmFuc2Zvcm09bil9aWYodGhpcy5wYXJhbXMgaW5zdGFuY2VvZiBuLkRpY3Qpe2NvbnN0IHQ9dGhpcy5wYXJhbXMuZ2V0KCJDb2xvclRyYW5zZm9ybSIpO051bWJlci5pc0ludGVnZXIodCkmJihlLmNvbG9yVHJhbnNmb3JtPXQpfWNvbnN0IGE9bmV3IGkuSnBlZ0ltYWdlKGUpO2EucGFyc2UodGhpcy5ieXRlcyk7Y29uc3Qgcj1hLmdldERhdGEoe3dpZHRoOnRoaXMuZHJhd1dpZHRoLGhlaWdodDp0aGlzLmRyYXdIZWlnaHQsZm9yY2VSR0JBOnRoaXMuZm9yY2VSR0JBLGZvcmNlUkdCOnRoaXMuZm9yY2VSR0IsaXNTb3VyY2VQREY6ITB9KTt0aGlzLmJ1ZmZlcj1yO3RoaXMuYnVmZmVyTGVuZ3RoPXIubGVuZ3RoO3RoaXMuZW9mPSEwfX10LkpwZWdTdHJlYW09SnBlZ1N0cmVhbX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5KcGVnSW1hZ2U9dm9pZCAwO2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTthKDEzOSk7dmFyIHI9YSgxNDQpLG49YSgxNzgpLGk9YSgxNDkpO2NsYXNzIEpwZWdFcnJvciBleHRlbmRzIHIuQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihgSlBFRyBlcnJvcjogJHtlfWAsIkpwZWdFcnJvciIpfX1jbGFzcyBETkxNYXJrZXJFcnJvciBleHRlbmRzIHIuQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsIkROTE1hcmtlckVycm9yIik7dGhpcy5zY2FuTGluZXM9dH19Y2xhc3MgRU9JTWFya2VyRXJyb3IgZXh0ZW5kcyByLkJhc2VFeGNlcHRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiRU9JTWFya2VyRXJyb3IiKX19Y29uc3Qgcz1uZXcgVWludDhBcnJheShbMCwxLDgsMTYsOSwyLDMsMTAsMTcsMjQsMzIsMjUsMTgsMTEsNCw1LDEyLDE5LDI2LDMzLDQwLDQ4LDQxLDM0LDI3LDIwLDEzLDYsNywxNCwyMSwyOCwzNSw0Miw0OSw1Niw1Nyw1MCw0MywzNiwyOSwyMiwxNSwyMywzMCwzNyw0NCw1MSw1OCw1OSw1Miw0NSwzOCwzMSwzOSw0Niw1Myw2MCw2MSw1NCw0Nyw1NSw2Miw2M10pLG89NDAxNyxjPTc5OSxsPTM0MDYsaD0yMjc2LHU9MTU2NyxkPTM3ODQsZj01NzkzLGc9Mjg5NjtmdW5jdGlvbiBidWlsZEh1ZmZtYW5UYWJsZShlLHQpe2xldCBhLHIsbj0wLGk9MTY7Zm9yKDtpPjAmJiFlW2ktMV07KWktLTtjb25zdCBzPVt7Y2hpbGRyZW46W10saW5kZXg6MH1dO2xldCBvLGM9c1swXTtmb3IoYT0wO2E8aTthKyspe2ZvcihyPTA7cjxlW2FdO3IrKyl7Yz1zLnBvcCgpO2MuY2hpbGRyZW5bYy5pbmRleF09dFtuXTtmb3IoO2MuaW5kZXg+MDspYz1zLnBvcCgpO2MuaW5kZXgrKztzLnB1c2goYyk7Zm9yKDtzLmxlbmd0aDw9YTspe3MucHVzaChvPXtjaGlsZHJlbjpbXSxpbmRleDowfSk7Yy5jaGlsZHJlbltjLmluZGV4XT1vLmNoaWxkcmVuO2M9b31uKyt9aWYoYSsxPGkpe3MucHVzaChvPXtjaGlsZHJlbjpbXSxpbmRleDowfSk7Yy5jaGlsZHJlbltjLmluZGV4XT1vLmNoaWxkcmVuO2M9b319cmV0dXJuIHNbMF0uY2hpbGRyZW59ZnVuY3Rpb24gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoZSx0LGEpe3JldHVybiA2NCooKGUuYmxvY2tzUGVyTGluZSsxKSp0K2EpfWZ1bmN0aW9uIGRlY29kZVNjYW4oZSx0LGEsbixvLGMsbCxoLHUpe2xldCBkPWFyZ3VtZW50cy5sZW5ndGg+OSYmdm9pZCAwIT09YXJndW1lbnRzWzldJiZhcmd1bWVudHNbOV07Y29uc3QgZj1hLm1jdXNQZXJMaW5lLGc9YS5wcm9ncmVzc2l2ZSxwPXQ7bGV0IG09MCxiPTA7ZnVuY3Rpb24gcmVhZEJpdCgpe2lmKGI+MCl7Yi0tO3JldHVybiBtPj5iJjF9bT1lW3QrK107aWYoMjU1PT09bSl7Y29uc3Qgcj1lW3QrK107aWYocil7aWYoMjIwPT09ciYmZCl7dCs9Mjtjb25zdCByPSgwLGkucmVhZFVpbnQxNikoZSx0KTt0Kz0yO2lmKHI+MCYmciE9PWEuc2NhbkxpbmVzKXRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRE5MIG1hcmtlciAoMHhGRkRDKSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIscil9ZWxzZSBpZigyMTc9PT1yKXtpZihkKXtjb25zdCBlPXgqKDg9PT1hLnByZWNpc2lvbj84OjApO2lmKGU+MCYmTWF0aC5yb3VuZChhLnNjYW5MaW5lcy9lKT49NSl0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEsIHBvc3NpYmx5IGNhdXNlZCBieSBpbmNvcnJlY3QgYHNjYW5MaW5lc2AgcGFyYW1ldGVyIixlKX10aHJvdyBuZXcgRU9JTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiKX10aHJvdyBuZXcgSnBlZ0Vycm9yKGB1bmV4cGVjdGVkIG1hcmtlciAkeyhtPDw4fHIpLnRvU3RyaW5nKDE2KX1gKX19Yj03O3JldHVybiBtPj4+N31mdW5jdGlvbiBkZWNvZGVIdWZmbWFuKGUpe2xldCB0PWU7Zm9yKDs7KXt0PXRbcmVhZEJpdCgpXTtzd2l0Y2godHlwZW9mIHQpe2Nhc2UibnVtYmVyIjpyZXR1cm4gdDtjYXNlIm9iamVjdCI6Y29udGludWV9dGhyb3cgbmV3IEpwZWdFcnJvcigiaW52YWxpZCBodWZmbWFuIHNlcXVlbmNlIil9fWZ1bmN0aW9uIHJlY2VpdmUoZSl7bGV0IHQ9MDtmb3IoO2U+MDspe3Q9dDw8MXxyZWFkQml0KCk7ZS0tfXJldHVybiB0fWZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQoZSl7aWYoMT09PWUpcmV0dXJuIDE9PT1yZWFkQml0KCk/MTotMTtjb25zdCB0PXJlY2VpdmUoZSk7cmV0dXJuIHQ+PTE8PGUtMT90OnQrKC0xPDxlKSsxfWxldCB5PTA7bGV0IHcsUz0wO2xldCB4PTA7ZnVuY3Rpb24gZGVjb2RlTWN1KGUsdCxhLHIsbil7Y29uc3QgaT1hJWY7eD0oYS9mfDApKmUudityO2NvbnN0IHM9aSplLmgrbjt0KGUsZ2V0QmxvY2tCdWZmZXJPZmZzZXQoZSx4LHMpKX1mdW5jdGlvbiBkZWNvZGVCbG9jayhlLHQsYSl7eD1hL2UuYmxvY2tzUGVyTGluZXwwO2NvbnN0IHI9YSVlLmJsb2Nrc1BlckxpbmU7dChlLGdldEJsb2NrQnVmZmVyT2Zmc2V0KGUseCxyKSl9Y29uc3QgQz1uLmxlbmd0aDtsZXQgdixrLE8sVCxNLEU7RT1nPzA9PT1jPzA9PT1oP2Z1bmN0aW9uIGRlY29kZURDRmlyc3QoZSx0KXtjb25zdCBhPWRlY29kZUh1ZmZtYW4oZS5odWZmbWFuVGFibGVEQykscj0wPT09YT8wOnJlY2VpdmVBbmRFeHRlbmQoYSk8PHU7ZS5ibG9ja0RhdGFbdF09ZS5wcmVkKz1yfTpmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoZSx0KXtlLmJsb2NrRGF0YVt0XXw9cmVhZEJpdCgpPDx1fTowPT09aD9mdW5jdGlvbiBkZWNvZGVBQ0ZpcnN0KGUsdCl7aWYoeT4wKXt5LS07cmV0dXJufWxldCBhPWM7Y29uc3Qgcj1sO2Zvcig7YTw9cjspe2NvbnN0IHI9ZGVjb2RlSHVmZm1hbihlLmh1ZmZtYW5UYWJsZUFDKSxuPTE1JnIsaT1yPj40O2lmKDA9PT1uKXtpZihpPDE1KXt5PXJlY2VpdmUoaSkrKDE8PGkpLTE7YnJlYWt9YSs9MTY7Y29udGludWV9YSs9aTtjb25zdCBvPXNbYV07ZS5ibG9ja0RhdGFbdCtvXT1yZWNlaXZlQW5kRXh0ZW5kKG4pKigxPDx1KTthKyt9fTpmdW5jdGlvbiBkZWNvZGVBQ1N1Y2Nlc3NpdmUoZSx0KXtsZXQgYT1jO2NvbnN0IHI9bDtsZXQgbixpLG89MDtmb3IoO2E8PXI7KXtjb25zdCByPXQrc1thXSxjPWUuYmxvY2tEYXRhW3JdPDA/LTE6MTtzd2l0Y2goUyl7Y2FzZSAwOmk9ZGVjb2RlSHVmZm1hbihlLmh1ZmZtYW5UYWJsZUFDKTtuPTE1Jmk7bz1pPj40O2lmKDA9PT1uKWlmKG88MTUpe3k9cmVjZWl2ZShvKSsoMTw8byk7Uz00fWVsc2V7bz0xNjtTPTF9ZWxzZXtpZigxIT09bil0aHJvdyBuZXcgSnBlZ0Vycm9yKCJpbnZhbGlkIEFDbiBlbmNvZGluZyIpO3c9cmVjZWl2ZUFuZEV4dGVuZChuKTtTPW8/MjozfWNvbnRpbnVlO2Nhc2UgMTpjYXNlIDI6aWYoZS5ibG9ja0RhdGFbcl0pZS5ibG9ja0RhdGFbcl0rPWMqKHJlYWRCaXQoKTw8dSk7ZWxzZXtvLS07MD09PW8mJihTPTI9PT1TPzM6MCl9YnJlYWs7Y2FzZSAzOmlmKGUuYmxvY2tEYXRhW3JdKWUuYmxvY2tEYXRhW3JdKz1jKihyZWFkQml0KCk8PHUpO2Vsc2V7ZS5ibG9ja0RhdGFbcl09dzw8dTtTPTB9YnJlYWs7Y2FzZSA0OmUuYmxvY2tEYXRhW3JdJiYoZS5ibG9ja0RhdGFbcl0rPWMqKHJlYWRCaXQoKTw8dSkpfWErK31pZig0PT09Uyl7eS0tOzA9PT15JiYoUz0wKX19OmZ1bmN0aW9uIGRlY29kZUJhc2VsaW5lKGUsdCl7Y29uc3QgYT1kZWNvZGVIdWZmbWFuKGUuaHVmZm1hblRhYmxlREMpLHI9MD09PWE/MDpyZWNlaXZlQW5kRXh0ZW5kKGEpO2UuYmxvY2tEYXRhW3RdPWUucHJlZCs9cjtsZXQgbj0xO2Zvcig7bjw2NDspe2NvbnN0IGE9ZGVjb2RlSHVmZm1hbihlLmh1ZmZtYW5UYWJsZUFDKSxyPTE1JmEsaT1hPj40O2lmKDA9PT1yKXtpZihpPDE1KWJyZWFrO24rPTE2O2NvbnRpbnVlfW4rPWk7Y29uc3Qgbz1zW25dO2UuYmxvY2tEYXRhW3Qrb109cmVjZWl2ZUFuZEV4dGVuZChyKTtuKyt9fTtsZXQgRCxOPTA7Y29uc3QgUj0xPT09Qz9uWzBdLmJsb2Nrc1BlckxpbmUqblswXS5ibG9ja3NQZXJDb2x1bW46ZiphLm1jdXNQZXJDb2x1bW47bGV0IEwsJDtmb3IoO048PVI7KXtjb25zdCBhPW8/TWF0aC5taW4oUi1OLG8pOlI7aWYoYT4wKXtmb3Ioaz0wO2s8QztrKyspbltrXS5wcmVkPTA7eT0wO2lmKDE9PT1DKXt2PW5bMF07Zm9yKE09MDtNPGE7TSsrKXtkZWNvZGVCbG9jayh2LEUsTik7TisrfX1lbHNlIGZvcihNPTA7TTxhO00rKyl7Zm9yKGs9MDtrPEM7aysrKXt2PW5ba107TD12Lmg7JD12LnY7Zm9yKE89MDtPPCQ7TysrKWZvcihUPTA7VDxMO1QrKylkZWNvZGVNY3UodixFLE4sTyxUKX1OKyt9fWI9MDtEPWZpbmROZXh0RmlsZU1hcmtlcihlLHQpO2lmKCFEKWJyZWFrO2lmKEQuaW52YWxpZCl7Y29uc3QgZT1hPjA/InVuZXhwZWN0ZWQiOiJleGNlc3NpdmUiOygwLHIud2FybikoYGRlY29kZVNjYW4gLSAke2V9IE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogJHtELmludmFsaWR9YCk7dD1ELm9mZnNldH1pZighKEQubWFya2VyPj02NTQ4OCYmRC5tYXJrZXI8PTY1NDk1KSlicmVhazt0Kz0yfXJldHVybiB0LXB9ZnVuY3Rpb24gcXVhbnRpemVBbmRJbnZlcnNlKGUsdCxhKXtjb25zdCByPWUucXVhbnRpemF0aW9uVGFibGUsbj1lLmJsb2NrRGF0YTtsZXQgaSxzLHAsbSxiLHksdyxTLHgsQyx2LGssTyxULE0sRSxEO2lmKCFyKXRocm93IG5ldyBKcGVnRXJyb3IoIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLiIpO2ZvcihsZXQgZT0wO2U8NjQ7ZSs9OCl7eD1uW3QrZV07Qz1uW3QrZSsxXTt2PW5bdCtlKzJdO2s9blt0K2UrM107Tz1uW3QrZSs0XTtUPW5bdCtlKzVdO009blt0K2UrNl07RT1uW3QrZSs3XTt4Kj1yW2VdO2lmKDAhPShDfHZ8a3xPfFR8TXxFKSl7Qyo9cltlKzFdO3YqPXJbZSsyXTtrKj1yW2UrM107Tyo9cltlKzRdO1QqPXJbZSs1XTtNKj1yW2UrNl07RSo9cltlKzddO2k9Zip4KzEyOD4+ODtzPWYqTysxMjg+Pjg7cD12O209TTtiPWcqKEMtRSkrMTI4Pj44O1M9ZyooQytFKSsxMjg+Pjg7eT1rPDw0O3c9VDw8NDtpPWkrcysxPj4xO3M9aS1zO0Q9cCpkK20qdSsxMjg+Pjg7cD1wKnUtbSpkKzEyOD4+ODttPUQ7Yj1iK3crMT4+MTt3PWItdztTPVMreSsxPj4xO3k9Uy15O2k9aSttKzE+PjE7bT1pLW07cz1zK3ArMT4+MTtwPXMtcDtEPWIqaCtTKmwrMjA0OD4+MTI7Yj1iKmwtUypoKzIwNDg+PjEyO1M9RDtEPXkqYyt3Km8rMjA0OD4+MTI7eT15Km8tdypjKzIwNDg+PjEyO3c9RDthW2VdPWkrUzthW2UrN109aS1TO2FbZSsxXT1zK3c7YVtlKzZdPXMtdzthW2UrMl09cCt5O2FbZSs1XT1wLXk7YVtlKzNdPW0rYjthW2UrNF09bS1ifWVsc2V7RD1mKngrNTEyPj4xMDthW2VdPUQ7YVtlKzFdPUQ7YVtlKzJdPUQ7YVtlKzNdPUQ7YVtlKzRdPUQ7YVtlKzVdPUQ7YVtlKzZdPUQ7YVtlKzddPUR9fWZvcihsZXQgZT0wO2U8ODsrK2Upe3g9YVtlXTtDPWFbZSs4XTt2PWFbZSsxNl07az1hW2UrMjRdO089YVtlKzMyXTtUPWFbZSs0MF07TT1hW2UrNDhdO0U9YVtlKzU2XTtpZigwIT0oQ3x2fGt8T3xUfE18RSkpe2k9Zip4KzIwNDg+PjEyO3M9ZipPKzIwNDg+PjEyO3A9djttPU07Yj1nKihDLUUpKzIwNDg+PjEyO1M9ZyooQytFKSsyMDQ4Pj4xMjt5PWs7dz1UO2k9NDExMisoaStzKzE+PjEpO3M9aS1zO0Q9cCpkK20qdSsyMDQ4Pj4xMjtwPXAqdS1tKmQrMjA0OD4+MTI7bT1EO2I9Yit3KzE+PjE7dz1iLXc7Uz1TK3krMT4+MTt5PVMteTtpPWkrbSsxPj4xO209aS1tO3M9cytwKzE+PjE7cD1zLXA7RD1iKmgrUypsKzIwNDg+PjEyO2I9YipsLVMqaCsyMDQ4Pj4xMjtTPUQ7RD15KmMrdypvKzIwNDg+PjEyO3k9eSpvLXcqYysyMDQ4Pj4xMjt3PUQ7eD1pK1M7RT1pLVM7Qz1zK3c7TT1zLXc7dj1wK3k7VD1wLXk7az1tK2I7Tz1tLWI7eDwxNj94PTA6eD49NDA4MD94PTI1NTp4Pj49NDtDPDE2P0M9MDpDPj00MDgwP0M9MjU1OkM+Pj00O3Y8MTY/dj0wOnY+PTQwODA/dj0yNTU6dj4+PTQ7azwxNj9rPTA6az49NDA4MD9rPTI1NTprPj49NDtPPDE2P089MDpPPj00MDgwP089MjU1Ok8+Pj00O1Q8MTY/VD0wOlQ+PTQwODA/VD0yNTU6VD4+PTQ7TTwxNj9NPTA6TT49NDA4MD9NPTI1NTpNPj49NDtFPDE2P0U9MDpFPj00MDgwP0U9MjU1OkU+Pj00O25bdCtlXT14O25bdCtlKzhdPUM7blt0K2UrMTZdPXY7blt0K2UrMjRdPWs7blt0K2UrMzJdPU87blt0K2UrNDBdPVQ7blt0K2UrNDhdPU07blt0K2UrNTZdPUV9ZWxzZXtEPWYqeCs4MTkyPj4xNDtEPUQ8LTIwNDA/MDpEPj0yMDI0PzI1NTpEKzIwNTY+PjQ7blt0K2VdPUQ7blt0K2UrOF09RDtuW3QrZSsxNl09RDtuW3QrZSsyNF09RDtuW3QrZSszMl09RDtuW3QrZSs0MF09RDtuW3QrZSs0OF09RDtuW3QrZSs1Nl09RH19fWZ1bmN0aW9uIGJ1aWxkQ29tcG9uZW50RGF0YShlLHQpe2NvbnN0IGE9dC5ibG9ja3NQZXJMaW5lLHI9dC5ibG9ja3NQZXJDb2x1bW4sbj1uZXcgSW50MTZBcnJheSg2NCk7Zm9yKGxldCBlPTA7ZTxyO2UrKylmb3IobGV0IHI9MDtyPGE7cisrKXtxdWFudGl6ZUFuZEludmVyc2UodCxnZXRCbG9ja0J1ZmZlck9mZnNldCh0LGUsciksbil9cmV0dXJuIHQuYmxvY2tEYXRhfWZ1bmN0aW9uIGZpbmROZXh0RmlsZU1hcmtlcihlLHQpe2xldCBhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0O2NvbnN0IHI9ZS5sZW5ndGgtMTtsZXQgbj1hPHQ/YTp0O2lmKHQ+PXIpcmV0dXJuIG51bGw7Y29uc3Qgcz0oMCxpLnJlYWRVaW50MTYpKGUsdCk7aWYocz49NjU0NzImJnM8PTY1NTM0KXJldHVybntpbnZhbGlkOm51bGwsbWFya2VyOnMsb2Zmc2V0OnR9O2xldCBvPSgwLGkucmVhZFVpbnQxNikoZSxuKTtmb3IoOyEobz49NjU0NzImJm88PTY1NTM0KTspe2lmKCsrbj49cilyZXR1cm4gbnVsbDtvPSgwLGkucmVhZFVpbnQxNikoZSxuKX1yZXR1cm57aW52YWxpZDpzLnRvU3RyaW5nKDE2KSxtYXJrZXI6byxvZmZzZXQ6bn19dC5KcGVnSW1hZ2U9Y2xhc3MgSnBlZ0ltYWdle2NvbnN0cnVjdG9yKCl7bGV0e2RlY29kZVRyYW5zZm9ybTplPW51bGwsY29sb3JUcmFuc2Zvcm06dD0tMX09YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3RoaXMuX2RlY29kZVRyYW5zZm9ybT1lO3RoaXMuX2NvbG9yVHJhbnNmb3JtPXR9cGFyc2UoZSl7bGV0e2RubFNjYW5MaW5lczp0PW51bGx9PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtmdW5jdGlvbiByZWFkRGF0YUJsb2NrKCl7Y29uc3QgdD0oMCxpLnJlYWRVaW50MTYpKGUsbyk7bys9MjtsZXQgYT1vK3QtMjtjb25zdCBuPWZpbmROZXh0RmlsZU1hcmtlcihlLGEsbyk7aWYobj8uaW52YWxpZCl7KDAsci53YXJuKSgicmVhZERhdGFCbG9jayAtIGluY29ycmVjdCBsZW5ndGgsIGN1cnJlbnQgbWFya2VyIGlzOiAiK24uaW52YWxpZCk7YT1uLm9mZnNldH1jb25zdCBzPWUuc3ViYXJyYXkobyxhKTtvKz1zLmxlbmd0aDtyZXR1cm4gc31mdW5jdGlvbiBwcmVwYXJlQ29tcG9uZW50cyhlKXtjb25zdCB0PU1hdGguY2VpbChlLnNhbXBsZXNQZXJMaW5lLzgvZS5tYXhIKSxhPU1hdGguY2VpbChlLnNjYW5MaW5lcy84L2UubWF4Vik7Zm9yKGNvbnN0IHIgb2YgZS5jb21wb25lbnRzKXtjb25zdCBuPU1hdGguY2VpbChNYXRoLmNlaWwoZS5zYW1wbGVzUGVyTGluZS84KSpyLmgvZS5tYXhIKSxpPU1hdGguY2VpbChNYXRoLmNlaWwoZS5zY2FuTGluZXMvOCkqci52L2UubWF4Vikscz10KnIuaCxvPTY0KihhKnIudikqKHMrMSk7ci5ibG9ja0RhdGE9bmV3IEludDE2QXJyYXkobyk7ci5ibG9ja3NQZXJMaW5lPW47ci5ibG9ja3NQZXJDb2x1bW49aX1lLm1jdXNQZXJMaW5lPXQ7ZS5tY3VzUGVyQ29sdW1uPWF9bGV0IGEsbixvPTAsYz1udWxsLGw9bnVsbCxoPTA7Y29uc3QgdT1bXSxkPVtdLGY9W107bGV0IGc9KDAsaS5yZWFkVWludDE2KShlLG8pO28rPTI7aWYoNjU0OTYhPT1nKXRocm93IG5ldyBKcGVnRXJyb3IoIlNPSSBub3QgZm91bmQiKTtnPSgwLGkucmVhZFVpbnQxNikoZSxvKTtvKz0yO2U6Zm9yKDs2NTQ5NyE9PWc7KXtsZXQgcCxtLGI7c3dpdGNoKGcpe2Nhc2UgNjU1MDQ6Y2FzZSA2NTUwNTpjYXNlIDY1NTA2OmNhc2UgNjU1MDc6Y2FzZSA2NTUwODpjYXNlIDY1NTA5OmNhc2UgNjU1MTA6Y2FzZSA2NTUxMTpjYXNlIDY1NTEyOmNhc2UgNjU1MTM6Y2FzZSA2NTUxNDpjYXNlIDY1NTE1OmNhc2UgNjU1MTY6Y2FzZSA2NTUxNzpjYXNlIDY1NTE4OmNhc2UgNjU1MTk6Y2FzZSA2NTUzNDpjb25zdCB5PXJlYWREYXRhQmxvY2soKTs2NTUwND09PWcmJjc0PT09eVswXSYmNzA9PT15WzFdJiY3Mz09PXlbMl0mJjcwPT09eVszXSYmMD09PXlbNF0mJihjPXt2ZXJzaW9uOnttYWpvcjp5WzVdLG1pbm9yOnlbNl19LGRlbnNpdHlVbml0czp5WzddLHhEZW5zaXR5OnlbOF08PDh8eVs5XSx5RGVuc2l0eTp5WzEwXTw8OHx5WzExXSx0aHVtYldpZHRoOnlbMTJdLHRodW1iSGVpZ2h0OnlbMTNdLHRodW1iRGF0YTp5LnN1YmFycmF5KDE0LDE0KzMqeVsxMl0qeVsxM10pfSk7NjU1MTg9PT1nJiY2NT09PXlbMF0mJjEwMD09PXlbMV0mJjExMT09PXlbMl0mJjk4PT09eVszXSYmMTAxPT09eVs0XSYmKGw9e3ZlcnNpb246eVs1XTw8OHx5WzZdLGZsYWdzMDp5WzddPDw4fHlbOF0sZmxhZ3MxOnlbOV08PDh8eVsxMF0sdHJhbnNmb3JtQ29kZTp5WzExXX0pO2JyZWFrO2Nhc2UgNjU0OTk6Y29uc3Qgdz0oMCxpLnJlYWRVaW50MTYpKGUsbyk7bys9Mjtjb25zdCBTPXcrby0yO2xldCB4O2Zvcig7bzxTOyl7Y29uc3QgdD1lW28rK10sYT1uZXcgVWludDE2QXJyYXkoNjQpO2lmKHQ+PjQ9PTApZm9yKG09MDttPDY0O20rKyl7eD1zW21dO2FbeF09ZVtvKytdfWVsc2V7aWYodD4+NCE9MSl0aHJvdyBuZXcgSnBlZ0Vycm9yKCJEUVQgLSBpbnZhbGlkIHRhYmxlIHNwZWMiKTtmb3IobT0wO208NjQ7bSsrKXt4PXNbbV07YVt4XT0oMCxpLnJlYWRVaW50MTYpKGUsbyk7bys9Mn19dVsxNSZ0XT1hfWJyZWFrO2Nhc2UgNjU0NzI6Y2FzZSA2NTQ3MzpjYXNlIDY1NDc0OmlmKGEpdGhyb3cgbmV3IEpwZWdFcnJvcigiT25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkIik7bys9MjthPXt9O2EuZXh0ZW5kZWQ9NjU0NzM9PT1nO2EucHJvZ3Jlc3NpdmU9NjU0NzQ9PT1nO2EucHJlY2lzaW9uPWVbbysrXTtjb25zdCBDPSgwLGkucmVhZFVpbnQxNikoZSxvKTtvKz0yO2Euc2NhbkxpbmVzPXR8fEM7YS5zYW1wbGVzUGVyTGluZT0oMCxpLnJlYWRVaW50MTYpKGUsbyk7bys9MjthLmNvbXBvbmVudHM9W107YS5jb21wb25lbnRJZHM9e307Y29uc3Qgdj1lW28rK107bGV0IGs9MCxPPTA7Zm9yKHA9MDtwPHY7cCsrKXtjb25zdCB0PWVbb10scj1lW28rMV0+PjQsbj0xNSZlW28rMV07azxyJiYoaz1yKTtPPG4mJihPPW4pO2NvbnN0IGk9ZVtvKzJdO2I9YS5jb21wb25lbnRzLnB1c2goe2g6cix2Om4scXVhbnRpemF0aW9uSWQ6aSxxdWFudGl6YXRpb25UYWJsZTpudWxsfSk7YS5jb21wb25lbnRJZHNbdF09Yi0xO28rPTN9YS5tYXhIPWs7YS5tYXhWPU87cHJlcGFyZUNvbXBvbmVudHMoYSk7YnJlYWs7Y2FzZSA2NTQ3Njpjb25zdCBUPSgwLGkucmVhZFVpbnQxNikoZSxvKTtvKz0yO2ZvcihwPTI7cDxUOyl7Y29uc3QgdD1lW28rK10sYT1uZXcgVWludDhBcnJheSgxNik7bGV0IHI9MDtmb3IobT0wO208MTY7bSsrLG8rKylyKz1hW21dPWVbb107Y29uc3Qgbj1uZXcgVWludDhBcnJheShyKTtmb3IobT0wO208cjttKyssbysrKW5bbV09ZVtvXTtwKz0xNytyOyh0Pj40PT0wP2Y6ZClbMTUmdF09YnVpbGRIdWZmbWFuVGFibGUoYSxuKX1icmVhaztjYXNlIDY1NTAxOm8rPTI7bj0oMCxpLnJlYWRVaW50MTYpKGUsbyk7bys9MjticmVhaztjYXNlIDY1NDk4OmNvbnN0IE09MT09KytoJiYhdDtvKz0yO2NvbnN0IEU9ZVtvKytdLEQ9W107Zm9yKHA9MDtwPEU7cCsrKXtjb25zdCB0PWVbbysrXSxyPWEuY29tcG9uZW50SWRzW3RdLG49YS5jb21wb25lbnRzW3JdO24uaW5kZXg9dDtjb25zdCBpPWVbbysrXTtuLmh1ZmZtYW5UYWJsZURDPWZbaT4+NF07bi5odWZmbWFuVGFibGVBQz1kWzE1JmldO0QucHVzaChuKX1jb25zdCBOPWVbbysrXSxSPWVbbysrXSxMPWVbbysrXTt0cnl7Y29uc3QgdD1kZWNvZGVTY2FuKGUsbyxhLEQsbixOLFIsTD4+NCwxNSZMLE0pO28rPXR9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIEROTE1hcmtlckVycm9yKXsoMCxyLndhcm4pKGAke3QubWVzc2FnZX0gLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS5gKTtyZXR1cm4gdGhpcy5wYXJzZShlLHtkbmxTY2FuTGluZXM6dC5zY2FuTGluZXN9KX1pZih0IGluc3RhbmNlb2YgRU9JTWFya2VyRXJyb3IpeygwLHIud2FybikoYCR7dC5tZXNzYWdlfSAtLSBpZ25vcmluZyB0aGUgcmVzdCBvZiB0aGUgaW1hZ2UgZGF0YS5gKTticmVhayBlfXRocm93IHR9YnJlYWs7Y2FzZSA2NTUwMDpvKz00O2JyZWFrO2Nhc2UgNjU1MzU6MjU1IT09ZVtvXSYmby0tO2JyZWFrO2RlZmF1bHQ6Y29uc3QgJD1maW5kTmV4dEZpbGVNYXJrZXIoZSxvLTIsby0zKTtpZigkPy5pbnZhbGlkKXsoMCxyLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSB1bmV4cGVjdGVkIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAiKyQuaW52YWxpZCk7bz0kLm9mZnNldDticmVha31pZighJHx8bz49ZS5sZW5ndGgtMSl7KDAsci53YXJuKSgiSnBlZ0ltYWdlLnBhcnNlIC0gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhIHdpdGhvdXQgZmluZGluZyBhbiBFT0kgbWFya2VyICgweEZGRDkpLiIpO2JyZWFrIGV9dGhyb3cgbmV3IEpwZWdFcnJvcigiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6ICIrZy50b1N0cmluZygxNikpfWc9KDAsaS5yZWFkVWludDE2KShlLG8pO28rPTJ9dGhpcy53aWR0aD1hLnNhbXBsZXNQZXJMaW5lO3RoaXMuaGVpZ2h0PWEuc2NhbkxpbmVzO3RoaXMuamZpZj1jO3RoaXMuYWRvYmU9bDt0aGlzLmNvbXBvbmVudHM9W107Zm9yKGNvbnN0IGUgb2YgYS5jb21wb25lbnRzKXtjb25zdCB0PXVbZS5xdWFudGl6YXRpb25JZF07dCYmKGUucXVhbnRpemF0aW9uVGFibGU9dCk7dGhpcy5jb21wb25lbnRzLnB1c2goe2luZGV4OmUuaW5kZXgsb3V0cHV0OmJ1aWxkQ29tcG9uZW50RGF0YSgwLGUpLHNjYWxlWDplLmgvYS5tYXhILHNjYWxlWTplLnYvYS5tYXhWLGJsb2Nrc1BlckxpbmU6ZS5ibG9ja3NQZXJMaW5lLGJsb2Nrc1BlckNvbHVtbjplLmJsb2Nrc1BlckNvbHVtbn0pfXRoaXMubnVtQ29tcG9uZW50cz10aGlzLmNvbXBvbmVudHMubGVuZ3RofV9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKGUsdCl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtjb25zdCByPXRoaXMud2lkdGgvZSxuPXRoaXMuaGVpZ2h0L3Q7bGV0IGkscyxvLGMsbCxoLHUsZCxmLGcscCxtPTA7Y29uc3QgYj10aGlzLmNvbXBvbmVudHMubGVuZ3RoLHk9ZSp0KmIsdz1uZXcgVWludDhDbGFtcGVkQXJyYXkoeSksUz1uZXcgVWludDMyQXJyYXkoZSkseD00Mjk0OTY3Mjg4O2xldCBDO2Zvcih1PTA7dTxiO3UrKyl7aT10aGlzLmNvbXBvbmVudHNbdV07cz1pLnNjYWxlWCpyO289aS5zY2FsZVkqbjttPXU7cD1pLm91dHB1dDtjPWkuYmxvY2tzUGVyTGluZSsxPDwzO2lmKHMhPT1DKXtmb3IobD0wO2w8ZTtsKyspe2Q9MHxsKnM7U1tsXT0oZCZ4KTw8M3w3JmR9Qz1zfWZvcihoPTA7aDx0O2grKyl7ZD0wfGgqbztnPWMqKGQmeCl8KDcmZCk8PDM7Zm9yKGw9MDtsPGU7bCsrKXt3W21dPXBbZytTW2xdXTttKz1ifX19bGV0IHY9dGhpcy5fZGVjb2RlVHJhbnNmb3JtO2F8fDQhPT1ifHx2fHwodj1uZXcgSW50MzJBcnJheShbLTI1NiwyNTUsLTI1NiwyNTUsLTI1NiwyNTUsLTI1NiwyNTVdKSk7aWYodilmb3IodT0wO3U8eTspZm9yKGQ9MCxmPTA7ZDxiO2QrKyx1KyssZis9Mil3W3VdPSh3W3VdKnZbZl0+PjgpK3ZbZisxXTtyZXR1cm4gd31nZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCl7cmV0dXJuIHRoaXMuYWRvYmU/ISF0aGlzLmFkb2JlLnRyYW5zZm9ybUNvZGU6Mz09PXRoaXMubnVtQ29tcG9uZW50cz8wIT09dGhpcy5fY29sb3JUcmFuc2Zvcm0mJig4MiE9PXRoaXMuY29tcG9uZW50c1swXS5pbmRleHx8NzEhPT10aGlzLmNvbXBvbmVudHNbMV0uaW5kZXh8fDY2IT09dGhpcy5jb21wb25lbnRzWzJdLmluZGV4KToxPT09dGhpcy5fY29sb3JUcmFuc2Zvcm19X2NvbnZlcnRZY2NUb1JnYihlKXtsZXQgdCxhLHI7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bis9Myl7dD1lW25dO2E9ZVtuKzFdO3I9ZVtuKzJdO2Vbbl09dC0xNzkuNDU2KzEuNDAyKnI7ZVtuKzFdPXQrMTM1LjQ1OS0uMzQ0KmEtLjcxNCpyO2VbbisyXT10LTIyNi44MTYrMS43NzIqYX1yZXR1cm4gZX1fY29udmVydFljY1RvUmdiYShlLHQpe2ZvcihsZXQgYT0wLHI9MCxuPWUubGVuZ3RoO2E8bjthKz0zLHIrPTQpe2NvbnN0IG49ZVthXSxpPWVbYSsxXSxzPWVbYSsyXTt0W3JdPW4tMTc5LjQ1NisxLjQwMipzO3RbcisxXT1uKzEzNS40NTktLjM0NCppLS43MTQqczt0W3IrMl09bi0yMjYuODE2KzEuNzcyKmk7dFtyKzNdPTI1NX1yZXR1cm4gdH1fY29udmVydFljY2tUb1JnYihlKXtsZXQgdCxhLHIsbixpPTA7Zm9yKGxldCBzPTAsbz1lLmxlbmd0aDtzPG87cys9NCl7dD1lW3NdO2E9ZVtzKzFdO3I9ZVtzKzJdO249ZVtzKzNdO2VbaSsrXT1hKigtNjYwNjM1NjY5NDIwMzY0ZS0xOSphKy4wMDA0MzcxMzA0NzU5MjYyMzIqci01NDA4MDYxMDA2NDU5OWUtMTgqdCsuMDAwNDg0NDk3OTcxMjAyODEqbi0uMTU0MzYyMTUxODcxMTI2KS0xMjIuNjcxOTU0MDY4OTQrciooLS4wMDA5NTc5NjQzNzg0NDU3NzMqcisuMDAwODE3MDc2OTExMzQ2NjI1KnQtLjAwNDc3MjcxNDA1NDA4NzQ3Km4rMS41MzM4MDI1MzIyMTczNCkrdCooLjAwMDk2MTI1MDE4NDEzMDY4OCp0LS4wMDI2NjI1NzMzMjI4MzkzMypuKy40ODM1NzA4ODQ1MTI2NSkrbiooLS4wMDAzMzYxOTcxNzc2MTgzOTQqbisuNDg0NzkxNTYxNDkwNzc2KTtlW2krK109MTA3LjI2ODAzOTM5NzcyNCthKigyMTk5MjcxMDQ1MjU3NDFlLTE5KmEtLjAwMDY0MDk5MjAxODI5Nzk0NSpyKy4wMDA2NTkzOTcwMDEyNDU1NzcqdCsuMDAwNDI2MTA1NjUyOTM4ODM3Km4tLjE3NjQ5MTc5MjQ2Mjg3NSkrciooLS4wMDA3NzgyNjk5NDE1MTM2ODMqcisuMDAxMzA4NzIyNjE0MDgyNzUqdCsuMDAwNzcwNDgyNjMxODAxMTMyKm4tLjE1MTA1MTQ5Mjc3NTU2MikrdCooLjAwMTI2OTM1MzY4MTE0ODQzKnQtLjAwMjY1MDkwMTg5MDEwODk4Km4rLjI1ODAyOTEwMjA2ODQ1KStuKigtLjAwMDMxODkxMzExNzU4ODMyOCpuLS4yMTM3NDI0MDAzMjM2NjUpO2VbaSsrXT1hKigtLjAwMDU3MDExNTE5Njk3MzY3NyphLTI2MzQwOTA1MTAwNDU4OWUtMTkqcisuMDAyMDc0MTA4ODExNTAxMip0LS4wMDI4ODI2MDIzNjg1MzQ0MipuKy44MTQyNzI5NjgzNTkyOTUpLTIwLjgxMDAxMjU0Njk0NytyKigtMTUzNDk2MDU3NDQwOTc1ZS0xOSpyLS4wMDAxMzI2ODkwNDM5NjE0NDYqdCsuMDAwNTYwODMzNjkxMjQyODEyKm4tLjE5NTE1MjAyNzUzNDA0OSkrdCooLjAwMTc0NDE4MTMyOTI3NTgyKnQtLjAwMjU1MjQzMzIxNDM5MzQ3Km4rLjExNjkzNTAyMDQ2NTE0NSkrbiooLS4wMDAzNDM1MzE5OTY1MTA1NTUqbisuMjQxNjUyNjAyMzI0MDcpfXJldHVybiBlLnN1YmFycmF5KDAsaSl9X2NvbnZlcnRZY2NrVG9SZ2JhKGUpe2ZvcihsZXQgdD0wLGE9ZS5sZW5ndGg7dDxhO3QrPTQpe2NvbnN0IGE9ZVt0XSxyPWVbdCsxXSxuPWVbdCsyXSxpPWVbdCszXTtlW3RdPXIqKC02NjA2MzU2Njk0MjAzNjRlLTE5KnIrLjAwMDQzNzEzMDQ3NTkyNjIzMipuLTU0MDgwNjEwMDY0NTk5ZS0xOCphKy4wMDA0ODQ0OTc5NzEyMDI4MSppLS4xNTQzNjIxNTE4NzExMjYpLTEyMi42NzE5NTQwNjg5NCtuKigtLjAwMDk1Nzk2NDM3ODQ0NTc3MypuKy4wMDA4MTcwNzY5MTEzNDY2MjUqYS0uMDA0NzcyNzE0MDU0MDg3NDcqaSsxLjUzMzgwMjUzMjIxNzM0KSthKiguMDAwOTYxMjUwMTg0MTMwNjg4KmEtLjAwMjY2MjU3MzMyMjgzOTMzKmkrLjQ4MzU3MDg4NDUxMjY1KStpKigtLjAwMDMzNjE5NzE3NzYxODM5NCppKy40ODQ3OTE1NjE0OTA3NzYpO2VbdCsxXT0xMDcuMjY4MDM5Mzk3NzI0K3IqKDIxOTkyNzEwNDUyNTc0MWUtMTkqci0uMDAwNjQwOTkyMDE4Mjk3OTQ1Km4rLjAwMDY1OTM5NzAwMTI0NTU3NyphKy4wMDA0MjYxMDU2NTI5Mzg4MzcqaS0uMTc2NDkxNzkyNDYyODc1KStuKigtLjAwMDc3ODI2OTk0MTUxMzY4MypuKy4wMDEzMDg3MjI2MTQwODI3NSphKy4wMDA3NzA0ODI2MzE4MDExMzIqaS0uMTUxMDUxNDkyNzc1NTYyKSthKiguMDAxMjY5MzUzNjgxMTQ4NDMqYS0uMDAyNjUwOTAxODkwMTA4OTgqaSsuMjU4MDI5MTAyMDY4NDUpK2kqKC0uMDAwMzE4OTEzMTE3NTg4MzI4KmktLjIxMzc0MjQwMDMyMzY2NSk7ZVt0KzJdPXIqKC0uMDAwNTcwMTE1MTk2OTczNjc3KnItMjYzNDA5MDUxMDA0NTg5ZS0xOSpuKy4wMDIwNzQxMDg4MTE1MDEyKmEtLjAwMjg4MjYwMjM2ODUzNDQyKmkrLjgxNDI3Mjk2ODM1OTI5NSktMjAuODEwMDEyNTQ2OTQ3K24qKC0xNTM0OTYwNTc0NDA5NzVlLTE5Km4tLjAwMDEzMjY4OTA0Mzk2MTQ0NiphKy4wMDA1NjA4MzM2OTEyNDI4MTIqaS0uMTk1MTUyMDI3NTM0MDQ5KSthKiguMDAxNzQ0MTgxMzI5Mjc1ODIqYS0uMDAyNTUyNDMzMjE0MzkzNDcqaSsuMTE2OTM1MDIwNDY1MTQ1KStpKigtLjAwMDM0MzUzMTk5NjUxMDU1NSppKy4yNDE2NTI2MDIzMjQwNyk7ZVt0KzNdPTI1NX1yZXR1cm4gZX1fY29udmVydFljY2tUb0NteWsoZSl7bGV0IHQsYSxyO2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7bjxpO24rPTQpe3Q9ZVtuXTthPWVbbisxXTtyPWVbbisyXTtlW25dPTQzNC40NTYtdC0xLjQwMipyO2VbbisxXT0xMTkuNTQxLXQrLjM0NCphKy43MTQqcjtlW24rMl09NDgxLjgxNi10LTEuNzcyKmF9cmV0dXJuIGV9X2NvbnZlcnRDbXlrVG9SZ2IoZSl7bGV0IHQsYSxyLG4saT0wO2ZvcihsZXQgcz0wLG89ZS5sZW5ndGg7czxvO3MrPTQpe3Q9ZVtzXTthPWVbcysxXTtyPWVbcysyXTtuPWVbcyszXTtlW2krK109MjU1K3QqKC02NzQ3MTQ3MDczNjAyNDQxZS0yMCp0Ky4wMDA4Mzc5MjYyMTIxMDEzNzI3KmErLjAwMDI4OTQ3MTgxODg2NDMyOTQqcisuMDAzMjY0MjMxMDU3NTM3ODA2Km4tMS4xMTg1NjExODY3MjAzOTM3KSthKigyNjM3NDEwNzYxNjA4OTQwNWUtMjEqYS04NjI2OTQ5MTU4NjM4NTcyZS0yMCpyLS4wMDAyNzQ4NzY5MDY3NDk5NDkxKm4tLjAyMTU1Njg4Nzk0OTc4OTY3KStyKigtMzg3ODA5OTIxMjg2OTM2M2UtMjAqci0uMDAwMzI2NzgwODI3OTQ4NTI4NipuKy4wNjg2NzQyMjM4NTk1MzQ1KS1uKiguMDAwMzM2MTk3MTc3NjE4MzkzNypuKy43NDMwNjU5MTUxMzQyMjU0KTtlW2krK109MjU1K3QqKC4wMDAxMzU5NjM3MjgxMzU4ODg0OCp0Ky4wMDA5MjQ1MzcxMzI1NzM1ODUqYSsuMDAwMTA1NjczNTk2MTg2ODM1OTMqcisuMDAwNDc5MTg2NDY4NzQzNjUxMipuLS4zMTA5Njg5NTg3NTE1ODc1KSthKigtLjAwMDIzNTQ1MzQ2MTA4MzcwMzQ0KmErLjAwMDI3MDI4NDUyNTM1MzQ3MTQqcisuMDAyMDIwMDMwODk3NzMwNzE1NipuLS43NDg4MDUyMTY3MDE1NDk0KStyKig2ODM0ODE1OTk4MjM1NjYyZS0yMCpyKy4wMDAxNTE2ODQ1MjM2MzQ2MDk3MypuLS4wOTc1MTkyNzc3NDcyODkzMyktbiooLjAwMDMxODkxMzExNzU4ODMyODEqbisuNzM2NDg4MzgwNzczMzE2OCk7ZVtpKytdPTI1NSt0KigxMzU5ODY1MDQxMTM4NTMwN2UtMjEqdCsuMDAwMTI0MjM5NTYxNzU0OTA4NTEqYSsuMDAwNDc1MTk4NTA5NzU4MzU4OSpyLTM2NzI5MzE3NDc2NjMwNDIyZS0yMipuLS4wNTU2MjE4Njk4MDI2NDAzNCkrYSooLjAwMDE2MTQxMzgwNTk4NzI0Njc2KmErLjAwMDk2OTIyMzkxMzA3MjUxODYqcisuMDAwNzc4MjY5MjQ1MDAzNjI1MypuLS40NDAxNTIzMjM2NzUyNjQ2MykrciooNS4wNjg4ODI5MTQwNjg3NjllLTcqcisuMDAxNzc3ODM2OTAxMTM3NTA3MSpuLS43NTkxNDU0NjQ5NzQ5NjA5KS1uKiguMDAwMzQzNTMxOTk2NTEwNTU1MypuKy43MDYzNzcwMTg2MTYwMTQ0KX1yZXR1cm4gZS5zdWJhcnJheSgwLGkpfV9jb252ZXJ0Q215a1RvUmdiYShlKXtmb3IobGV0IHQ9MCxhPWUubGVuZ3RoO3Q8YTt0Kz00KXtjb25zdCBhPWVbdF0scj1lW3QrMV0sbj1lW3QrMl0saT1lW3QrM107ZVt0XT0yNTUrYSooLTY3NDcxNDcwNzM2MDI0NDFlLTIwKmErLjAwMDgzNzkyNjIxMjEwMTM3MjcqcisuMDAwMjg5NDcxODE4ODY0MzI5NCpuKy4wMDMyNjQyMzEwNTc1Mzc4MDYqaS0xLjExODU2MTE4NjcyMDM5MzcpK3IqKDI2Mzc0MTA3NjE2MDg5NDA1ZS0yMSpyLTg2MjY5NDkxNTg2Mzg1NzJlLTIwKm4tLjAwMDI3NDg3NjkwNjc0OTk0OTEqaS0uMDIxNTU2ODg3OTQ5Nzg5NjcpK24qKC0zODc4MDk5MjEyODY5MzYzZS0yMCpuLS4wMDAzMjY3ODA4Mjc5NDg1Mjg2KmkrLjA2ODY3NDIyMzg1OTUzNDUpLWkqKC4wMDAzMzYxOTcxNzc2MTgzOTM3KmkrLjc0MzA2NTkxNTEzNDIyNTQpO2VbdCsxXT0yNTUrYSooLjAwMDEzNTk2MzcyODEzNTg4ODQ4KmErLjAwMDkyNDUzNzEzMjU3MzU4NSpyKy4wMDAxMDU2NzM1OTYxODY4MzU5MypuKy4wMDA0NzkxODY0Njg3NDM2NTEyKmktLjMxMDk2ODk1ODc1MTU4NzUpK3IqKC0uMDAwMjM1NDUzNDYxMDgzNzAzNDQqcisuMDAwMjcwMjg0NTI1MzUzNDcxNCpuKy4wMDIwMjAwMzA4OTc3MzA3MTU2KmktLjc0ODgwNTIxNjcwMTU0OTQpK24qKDY4MzQ4MTU5OTgyMzU2NjJlLTIwKm4rLjAwMDE1MTY4NDUyMzYzNDYwOTczKmktLjA5NzUxOTI3Nzc0NzI4OTMzKS1pKiguMDAwMzE4OTEzMTE3NTg4MzI4MSppKy43MzY0ODgzODA3NzMzMTY4KTtlW3QrMl09MjU1K2EqKDEzNTk4NjUwNDExMzg1MzA3ZS0yMSphKy4wMDAxMjQyMzk1NjE3NTQ5MDg1MSpyKy4wMDA0NzUxOTg1MDk3NTgzNTg5Km4tMzY3MjkzMTc0NzY2MzA0MjJlLTIyKmktLjA1NTYyMTg2OTgwMjY0MDM0KStyKiguMDAwMTYxNDEzODA1OTg3MjQ2NzYqcisuMDAwOTY5MjIzOTEzMDcyNTE4NipuKy4wMDA3NzgyNjkyNDUwMDM2MjUzKmktLjQ0MDE1MjMyMzY3NTI2NDYzKStuKig1LjA2ODg4MjkxNDA2ODc2OWUtNypuKy4wMDE3Nzc4MzY5MDExMzc1MDcxKmktLjc1OTE0NTQ2NDk3NDk2MDkpLWkqKC4wMDAzNDM1MzE5OTY1MTA1NTUzKmkrLjcwNjM3NzAxODYxNjAxNDQpO2VbdCszXT0yNTV9cmV0dXJuIGV9Z2V0RGF0YShlKXtsZXR7d2lkdGg6dCxoZWlnaHQ6YSxmb3JjZVJHQkE6cj0hMSxmb3JjZVJHQjppPSExLGlzU291cmNlUERGOnM9ITF9PWU7aWYodGhpcy5udW1Db21wb25lbnRzPjQpdGhyb3cgbmV3IEpwZWdFcnJvcigiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZSIpO2NvbnN0IG89dGhpcy5fZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh0LGEscyk7aWYoMT09PXRoaXMubnVtQ29tcG9uZW50cyYmKHJ8fGkpKXtjb25zdCBlPW8ubGVuZ3RoKihyPzQ6MyksdD1uZXcgVWludDhDbGFtcGVkQXJyYXkoZSk7bGV0IGE9MDtpZihyKSgwLG4uZ3JheVRvUkdCQSkobyxuZXcgVWludDMyQXJyYXkodC5idWZmZXIpKTtlbHNlIGZvcihjb25zdCBlIG9mIG8pe3RbYSsrXT1lO3RbYSsrXT1lO3RbYSsrXT1lfXJldHVybiB0fWlmKDM9PT10aGlzLm51bUNvbXBvbmVudHMmJnRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKXtpZihyKXtjb25zdCBlPW5ldyBVaW50OENsYW1wZWRBcnJheShvLmxlbmd0aC8zKjQpO3JldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2JhKG8sZSl9cmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihvKX1pZig0PT09dGhpcy5udW1Db21wb25lbnRzKXtpZih0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZClyZXR1cm4gcj90aGlzLl9jb252ZXJ0WWNja1RvUmdiYShvKTppP3RoaXMuX2NvbnZlcnRZY2NrVG9SZ2Iobyk6dGhpcy5fY29udmVydFljY2tUb0NteWsobyk7aWYocilyZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYmEobyk7aWYoaSlyZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYihvKX1yZXR1cm4gb319fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBPWNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBO3QuY29udmVydFRvUkdCQT1mdW5jdGlvbiBjb252ZXJ0VG9SR0JBKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2Ugci5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA6cmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKGUpO2Nhc2Ugci5JbWFnZUtpbmQuUkdCXzI0QlBQOnJldHVybiBmdW5jdGlvbiBjb252ZXJ0UkdCVG9SR0JBKGUpe2xldHtzcmM6dCxzcmNQb3M6YT0wLGRlc3Q6bixkZXN0UG9zOmk9MCx3aWR0aDpzLGhlaWdodDpvfT1lLGM9MDtjb25zdCBsPXQubGVuZ3RoPj4yLGg9bmV3IFVpbnQzMkFycmF5KHQuYnVmZmVyLGEsbCk7aWYoci5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbil7Zm9yKDtjPGwtMjtjKz0zLGkrPTQpe2NvbnN0IGU9aFtjXSx0PWhbYysxXSxhPWhbYysyXTtuW2ldPTQyNzgxOTAwODB8ZTtuW2krMV09ZT4+PjI0fHQ8PDh8NDI3ODE5MDA4MDtuW2krMl09dD4+PjE2fGE8PDE2fDQyNzgxOTAwODA7bltpKzNdPWE+Pj44fDQyNzgxOTAwODB9Zm9yKGxldCBlPTQqYyxhPXQubGVuZ3RoO2U8YTtlKz0zKW5baSsrXT10W2VdfHRbZSsxXTw8OHx0W2UrMl08PDE2fDQyNzgxOTAwODB9ZWxzZXtmb3IoO2M8bC0yO2MrPTMsaSs9NCl7Y29uc3QgZT1oW2NdLHQ9aFtjKzFdLGE9aFtjKzJdO25baV09MjU1fGU7bltpKzFdPWU8PDI0fHQ+Pj44fDI1NTtuW2krMl09dDw8MTZ8YT4+PjE2fDI1NTtuW2krM109YTw8OHwyNTV9Zm9yKGxldCBlPTQqYyxhPXQubGVuZ3RoO2U8YTtlKz0zKW5baSsrXT10W2VdPDwyNHx0W2UrMV08PDE2fHRbZSsyXTw8OHwyNTV9cmV0dXJue3NyY1BvczphLGRlc3RQb3M6aX19KGUpfXJldHVybiBudWxsfTt0LmdyYXlUb1JHQkE9ZnVuY3Rpb24gZ3JheVRvUkdCQShlLHQpe2lmKHIuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pZm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSsrKXRbYV09NjU3OTMqZVthXXw0Mjc4MTkwMDgwO2Vsc2UgZm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSsrKXRbYV09MTY4NDMwMDgqZVthXXwyNTV9O2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTt2YXIgcj1hKDE0NCk7ZnVuY3Rpb24gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEoZSl7bGV0e3NyYzp0LHNyY1BvczphPTAsZGVzdDpuLHdpZHRoOmksaGVpZ2h0OnMsbm9uQmxhY2tDb2xvcjpvPTQyOTQ5NjcyOTUsaW52ZXJzZURlY29kZTpjPSExfT1lO2NvbnN0IGw9ci5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbj80Mjc4MTkwMDgwOjI1NSxbaCx1XT1jP1tvLGxdOltsLG9dLGQ9aT4+MyxmPTcmaSxnPXQubGVuZ3RoO249bmV3IFVpbnQzMkFycmF5KG4uYnVmZmVyKTtsZXQgcD0wO2ZvcihsZXQgZT0wO2U8cztlKyspe2Zvcihjb25zdCBlPWErZDthPGU7YSsrKXtjb25zdCBlPWE8Zz90W2FdOjI1NTtuW3ArK109MTI4JmU/dTpoO25bcCsrXT02NCZlP3U6aDtuW3ArK109MzImZT91Omg7bltwKytdPTE2JmU/dTpoO25bcCsrXT04JmU/dTpoO25bcCsrXT00JmU/dTpoO25bcCsrXT0yJmU/dTpoO25bcCsrXT0xJmU/dTpofWlmKDA9PT1mKWNvbnRpbnVlO2NvbnN0IGU9YTxnP3RbYSsrXToyNTU7Zm9yKGxldCB0PTA7dDxmO3QrKyluW3ArK109ZSYxPDw3LXQ/dTpofXJldHVybntzcmNQb3M6YSxkZXN0UG9zOnB9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5KcHhTdHJlYW09dm9pZCAwO2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTt2YXIgcj1hKDE2OCksbj1hKDE4MCksaT1hKDE0NCk7Y2xhc3MgSnB4U3RyZWFtIGV4dGVuZHMgci5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKHQpO3RoaXMuc3RyZWFtPWU7dGhpcy5kaWN0PWUuZGljdDt0aGlzLm1heWJlTGVuZ3RoPXQ7dGhpcy5wYXJhbXM9YX1nZXQgYnl0ZXMoKXtyZXR1cm4oMCxpLnNoYWRvdykodGhpcywiYnl0ZXMiLHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKX1lbnN1cmVCdWZmZXIoZSl7fXJlYWRCbG9jaygpe2lmKHRoaXMuZW9mKXJldHVybjtjb25zdCBlPW5ldyBuLkpweEltYWdlO2UucGFyc2UodGhpcy5ieXRlcyk7Y29uc3QgdD1lLndpZHRoLGE9ZS5oZWlnaHQscj1lLmNvbXBvbmVudHNDb3VudCxpPWUudGlsZXMubGVuZ3RoO2lmKDE9PT1pKXRoaXMuYnVmZmVyPWUudGlsZXNbMF0uaXRlbXM7ZWxzZXtjb25zdCBuPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KmEqcik7Zm9yKGxldCBhPTA7YTxpO2ErKyl7Y29uc3QgaT1lLnRpbGVzW2FdLHM9aS53aWR0aCxvPWkuaGVpZ2h0LGM9aS5sZWZ0LGw9aS50b3AsaD1pLml0ZW1zO2xldCB1PTAsZD0odCpsK2MpKnI7Y29uc3QgZj10KnIsZz1zKnI7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3QgZT1oLnN1YmFycmF5KHUsdStnKTtuLnNldChlLGQpO3UrPWc7ZCs9Zn19dGhpcy5idWZmZXI9bn10aGlzLmJ1ZmZlckxlbmd0aD10aGlzLmJ1ZmZlci5sZW5ndGg7dGhpcy5lb2Y9ITB9fXQuSnB4U3RyZWFtPUpweFN0cmVhbX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5KcHhJbWFnZT12b2lkIDA7YSgxMzkpO2EoMik7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO3ZhciByPWEoMTQ0KSxuPWEoMTQ5KSxpPWEoMTc1KTtjbGFzcyBKcHhFcnJvciBleHRlbmRzIHIuQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihgSlBYIGVycm9yOiAke2V9YCwiSnB4RXJyb3IiKX19Y29uc3Qgcz17TEw6MCxMSDoxLEhMOjEsSEg6Mn07dC5KcHhJbWFnZT1jbGFzcyBKcHhJbWFnZXtjb25zdHJ1Y3Rvcigpe3RoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2U9ITF9cGFyc2UoZSl7aWYoNjUzNTk9PT0oMCxuLnJlYWRVaW50MTYpKGUsMCkpe3RoaXMucGFyc2VDb2Rlc3RyZWFtKGUsMCxlLmxlbmd0aCk7cmV0dXJufWNvbnN0IHQ9ZS5sZW5ndGg7bGV0IGE9MDtmb3IoO2E8dDspe2xldCBpPTgscz0oMCxuLnJlYWRVaW50MzIpKGUsYSk7Y29uc3Qgbz0oMCxuLnJlYWRVaW50MzIpKGUsYSs0KTthKz1pO2lmKDE9PT1zKXtzPTQyOTQ5NjcyOTYqKDAsbi5yZWFkVWludDMyKShlLGEpKygwLG4ucmVhZFVpbnQzMikoZSxhKzQpO2ErPTg7aSs9OH0wPT09cyYmKHM9dC1hK2kpO2lmKHM8aSl0aHJvdyBuZXcgSnB4RXJyb3IoIkludmFsaWQgYm94IGZpZWxkIHNpemUiKTtjb25zdCBjPXMtaTtsZXQgbD0hMDtzd2l0Y2gobyl7Y2FzZSAxNzg1NzM3ODMyOmw9ITE7YnJlYWs7Y2FzZSAxNjY4MjQ2NjQyOmNvbnN0IHQ9ZVthXTtpZigxPT09dCl7Y29uc3QgdD0oMCxuLnJlYWRVaW50MzIpKGUsYSszKTtzd2l0Y2godCl7Y2FzZSAxNjpjYXNlIDE3OmNhc2UgMTg6YnJlYWs7ZGVmYXVsdDooMCxyLndhcm4pKCJVbmtub3duIGNvbG9yc3BhY2UgIit0KX19ZWxzZSAyPT09dCYmKDAsci5pbmZvKSgiSUNDIHByb2ZpbGUgbm90IHN1cHBvcnRlZCIpO2JyZWFrO2Nhc2UgMTc4NTczNzgyNzp0aGlzLnBhcnNlQ29kZXN0cmVhbShlLGEsYStjKTticmVhaztjYXNlIDE3ODM2MzZlMzoyMTg3OTM3MzghPT0oMCxuLnJlYWRVaW50MzIpKGUsYSkmJigwLHIud2FybikoIkludmFsaWQgSlAyIHNpZ25hdHVyZSIpO2JyZWFrO2Nhc2UgMTc4MzYzNDQ1ODpjYXNlIDE3MTg5MDkyOTY6Y2FzZSAxOTIwMDk5Njk3OmNhc2UgMTkxOTI1MTIzMjpjYXNlIDE3Njg0NDkxMzg6YnJlYWs7ZGVmYXVsdDpjb25zdCBpPVN0cmluZy5mcm9tQ2hhckNvZGUobz4+MjQmMjU1LG8+PjE2JjI1NSxvPj44JjI1NSwyNTUmbyk7KDAsci53YXJuKShgVW5zdXBwb3J0ZWQgaGVhZGVyIHR5cGUgJHtvfSAoJHtpfSkuYCl9bCYmKGErPWMpfX1wYXJzZUltYWdlUHJvcGVydGllcyhlKXtsZXQgdD1lLmdldEJ5dGUoKTtmb3IoO3Q+PTA7KXtjb25zdCBhPXQ7dD1lLmdldEJ5dGUoKTtpZig2NTM2MT09PShhPDw4fHQpKXtlLnNraXAoNCk7Y29uc3QgdD1lLmdldEludDMyKCk+Pj4wLGE9ZS5nZXRJbnQzMigpPj4+MCxyPWUuZ2V0SW50MzIoKT4+PjAsbj1lLmdldEludDMyKCk+Pj4wO2Uuc2tpcCgxNik7Y29uc3QgaT1lLmdldFVpbnQxNigpO3RoaXMud2lkdGg9dC1yO3RoaXMuaGVpZ2h0PWEtbjt0aGlzLmNvbXBvbmVudHNDb3VudD1pO3RoaXMuYml0c1BlckNvbXBvbmVudD04O3JldHVybn19dGhyb3cgbmV3IEpweEVycm9yKCJObyBzaXplIG1hcmtlciBmb3VuZCBpbiBKUFggc3RyZWFtIil9cGFyc2VDb2Rlc3RyZWFtKGUsdCxhKXtjb25zdCBpPXt9O2xldCBzPSExO3RyeXtsZXQgbz10O2Zvcig7bysxPGE7KXtjb25zdCB0PSgwLG4ucmVhZFVpbnQxNikoZSxvKTtvKz0yO2xldCBhLGMsbCxoLHUsZCxmPTA7c3dpdGNoKHQpe2Nhc2UgNjUzNTk6aS5tYWluSGVhZGVyPSEwO2JyZWFrO2Nhc2UgNjU0OTc6YnJlYWs7Y2FzZSA2NTM2MTpmPSgwLG4ucmVhZFVpbnQxNikoZSxvKTtjb25zdCBnPXt9O2cuWHNpej0oMCxuLnJlYWRVaW50MzIpKGUsbys0KTtnLllzaXo9KDAsbi5yZWFkVWludDMyKShlLG8rOCk7Zy5YT3Npej0oMCxuLnJlYWRVaW50MzIpKGUsbysxMik7Zy5ZT3Npej0oMCxuLnJlYWRVaW50MzIpKGUsbysxNik7Zy5YVHNpej0oMCxuLnJlYWRVaW50MzIpKGUsbysyMCk7Zy5ZVHNpej0oMCxuLnJlYWRVaW50MzIpKGUsbysyNCk7Zy5YVE9zaXo9KDAsbi5yZWFkVWludDMyKShlLG8rMjgpO2cuWVRPc2l6PSgwLG4ucmVhZFVpbnQzMikoZSxvKzMyKTtjb25zdCBwPSgwLG4ucmVhZFVpbnQxNikoZSxvKzM2KTtnLkNzaXo9cDtjb25zdCBtPVtdO2E9byszODtmb3IobGV0IHQ9MDt0PHA7dCsrKXtjb25zdCB0PXtwcmVjaXNpb246MSsoMTI3JmVbYV0pLGlzU2lnbmVkOiEhKDEyOCZlW2FdKSxYUnNpejplW2ErMV0sWVJzaXo6ZVthKzJdfTthKz0zO2NhbGN1bGF0ZUNvbXBvbmVudERpbWVuc2lvbnModCxnKTttLnB1c2godCl9aS5TSVo9ZztpLmNvbXBvbmVudHM9bTtjYWxjdWxhdGVUaWxlR3JpZHMoaSxtKTtpLlFDQz1bXTtpLkNPQz1bXTticmVhaztjYXNlIDY1MzcyOmY9KDAsbi5yZWFkVWludDE2KShlLG8pO2NvbnN0IGI9e307YT1vKzI7Yz1lW2ErK107c3dpdGNoKDMxJmMpe2Nhc2UgMDpoPTg7dT0hMDticmVhaztjYXNlIDE6aD0xNjt1PSExO2JyZWFrO2Nhc2UgMjpoPTE2O3U9ITA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1FjZCB2YWx1ZSAiK2MpfWIubm9RdWFudGl6YXRpb249OD09PWg7Yi5zY2FsYXJFeHBvdW5kZWQ9dTtiLmd1YXJkQml0cz1jPj41O2w9W107Zm9yKDthPGYrbzspe2NvbnN0IHQ9e307aWYoOD09PWgpe3QuZXBzaWxvbj1lW2ErK10+PjM7dC5tdT0wfWVsc2V7dC5lcHNpbG9uPWVbYV0+PjM7dC5tdT0oNyZlW2FdKTw8OHxlW2ErMV07YSs9Mn1sLnB1c2godCl9Yi5TUHFjZHM9bDtpZihpLm1haW5IZWFkZXIpaS5RQ0Q9YjtlbHNle2kuY3VycmVudFRpbGUuUUNEPWI7aS5jdXJyZW50VGlsZS5RQ0M9W119YnJlYWs7Y2FzZSA2NTM3MzpmPSgwLG4ucmVhZFVpbnQxNikoZSxvKTtjb25zdCB5PXt9O2E9bysyO2xldCB3O2lmKGkuU0laLkNzaXo8MjU3KXc9ZVthKytdO2Vsc2V7dz0oMCxuLnJlYWRVaW50MTYpKGUsYSk7YSs9Mn1jPWVbYSsrXTtzd2l0Y2goMzEmYyl7Y2FzZSAwOmg9ODt1PSEwO2JyZWFrO2Nhc2UgMTpoPTE2O3U9ITE7YnJlYWs7Y2FzZSAyOmg9MTY7dT0hMDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTUWNkIHZhbHVlICIrYyl9eS5ub1F1YW50aXphdGlvbj04PT09aDt5LnNjYWxhckV4cG91bmRlZD11O3kuZ3VhcmRCaXRzPWM+PjU7bD1bXTtmb3IoO2E8ZitvOyl7Y29uc3QgdD17fTtpZig4PT09aCl7dC5lcHNpbG9uPWVbYSsrXT4+Mzt0Lm11PTB9ZWxzZXt0LmVwc2lsb249ZVthXT4+Mzt0Lm11PSg3JmVbYV0pPDw4fGVbYSsxXTthKz0yfWwucHVzaCh0KX15LlNQcWNkcz1sO2kubWFpbkhlYWRlcj9pLlFDQ1t3XT15OmkuY3VycmVudFRpbGUuUUNDW3ddPXk7YnJlYWs7Y2FzZSA2NTM2MjpmPSgwLG4ucmVhZFVpbnQxNikoZSxvKTtjb25zdCBTPXt9O2E9bysyO2NvbnN0IHg9ZVthKytdO1MuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cz0hISgxJngpO1Muc29wTWFya2VyVXNlZD0hISgyJngpO1MuZXBoTWFya2VyVXNlZD0hISg0JngpO1MucHJvZ3Jlc3Npb25PcmRlcj1lW2ErK107Uy5sYXllcnNDb3VudD0oMCxuLnJlYWRVaW50MTYpKGUsYSk7YSs9MjtTLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtPWVbYSsrXTtTLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudD1lW2ErK107Uy54Y2I9MisoMTUmZVthKytdKTtTLnljYj0yKygxNSZlW2ErK10pO2NvbnN0IEM9ZVthKytdO1Muc2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcz0hISgxJkMpO1MucmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcz0hISgyJkMpO1MudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzPSEhKDQmQyk7Uy52ZXJ0aWNhbGx5U3RyaXBlPSEhKDgmQyk7Uy5wcmVkaWN0YWJsZVRlcm1pbmF0aW9uPSEhKDE2JkMpO1Muc2VnbWVudGF0aW9uU3ltYm9sVXNlZD0hISgzMiZDKTtTLnJldmVyc2libGVUcmFuc2Zvcm1hdGlvbj1lW2ErK107aWYoUy5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKXtjb25zdCB0PVtdO2Zvcig7YTxmK287KXtjb25zdCByPWVbYSsrXTt0LnB1c2goe1BQeDoxNSZyLFBQeTpyPj40fSl9Uy5wcmVjaW5jdHNTaXplcz10fWNvbnN0IHY9W107Uy5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzJiZ2LnB1c2goInNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MiKTtTLnRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcyYmdi5wdXNoKCJ0ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3MiKTtTLnZlcnRpY2FsbHlTdHJpcGUmJnYucHVzaCgidmVydGljYWxseVN0cmlwZSIpO1MucHJlZGljdGFibGVUZXJtaW5hdGlvbiYmdi5wdXNoKCJwcmVkaWN0YWJsZVRlcm1pbmF0aW9uIik7aWYodi5sZW5ndGg+MCl7cz0hMDsoMCxyLndhcm4pKGBKUFg6IFVuc3VwcG9ydGVkIENPRCBvcHRpb25zICgke3Yuam9pbigiLCAiKX0pLmApfWlmKGkubWFpbkhlYWRlcilpLkNPRD1TO2Vsc2V7aS5jdXJyZW50VGlsZS5DT0Q9UztpLmN1cnJlbnRUaWxlLkNPQz1bXX1icmVhaztjYXNlIDY1NDI0OmY9KDAsbi5yZWFkVWludDE2KShlLG8pO2Q9e307ZC5pbmRleD0oMCxuLnJlYWRVaW50MTYpKGUsbysyKTtkLmxlbmd0aD0oMCxuLnJlYWRVaW50MzIpKGUsbys0KTtkLmRhdGFFbmQ9ZC5sZW5ndGgrby0yO2QucGFydEluZGV4PWVbbys4XTtkLnBhcnRzQ291bnQ9ZVtvKzldO2kubWFpbkhlYWRlcj0hMTtpZigwPT09ZC5wYXJ0SW5kZXgpe2QuQ09EPWkuQ09EO2QuQ09DPWkuQ09DLnNsaWNlKDApO2QuUUNEPWkuUUNEO2QuUUNDPWkuUUNDLnNsaWNlKDApfWkuY3VycmVudFRpbGU9ZDticmVhaztjYXNlIDY1NDI3OmQ9aS5jdXJyZW50VGlsZTtpZigwPT09ZC5wYXJ0SW5kZXgpe2luaXRpYWxpemVUaWxlKGksZC5pbmRleCk7YnVpbGRQYWNrZXRzKGkpfWY9ZC5kYXRhRW5kLW87cGFyc2VUaWxlUGFja2V0cyhpLGUsbyxmKTticmVhaztjYXNlIDY1MzYzOigwLHIud2FybikoIkpQWDogQ29kZXN0cmVhbSBjb2RlIDB4RkY1MyAoQ09DKSBpcyBub3QgaW1wbGVtZW50ZWQuIik7Y2FzZSA2NTM2NTpjYXNlIDY1MzY3OmNhc2UgNjUzNjg6Y2FzZSA2NTM4MDpmPSgwLG4ucmVhZFVpbnQxNikoZSxvKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb2Rlc3RyZWFtIGNvZGU6ICIrdC50b1N0cmluZygxNikpfW8rPWZ9fWNhdGNoKGUpe2lmKHN8fHRoaXMuZmFpbE9uQ29ycnVwdGVkSW1hZ2UpdGhyb3cgbmV3IEpweEVycm9yKGUubWVzc2FnZSk7KDAsci53YXJuKShgSlBYOiBUcnlpbmcgdG8gcmVjb3ZlciBmcm9tOiAiJHtlLm1lc3NhZ2V9Ii5gKX10aGlzLnRpbGVzPWZ1bmN0aW9uIHRyYW5zZm9ybUNvbXBvbmVudHMoZSl7Y29uc3QgdD1lLlNJWixhPWUuY29tcG9uZW50cyxyPXQuQ3NpeixuPVtdO2ZvcihsZXQgdD0wLGk9ZS50aWxlcy5sZW5ndGg7dDxpO3QrKyl7Y29uc3QgaT1lLnRpbGVzW3RdLHM9W107Zm9yKGxldCB0PTA7dDxyO3QrKylzW3RdPXRyYW5zZm9ybVRpbGUoZSxpLHQpO2NvbnN0IG89c1swXSxjPW5ldyBVaW50OENsYW1wZWRBcnJheShvLml0ZW1zLmxlbmd0aCpyKSxsPXtsZWZ0Om8ubGVmdCx0b3A6by50b3Asd2lkdGg6by53aWR0aCxoZWlnaHQ6by5oZWlnaHQsaXRlbXM6Y307bGV0IGgsdSxkLGYsZyxwLG0sYj0wO2lmKGkuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybSl7Y29uc3QgZT00PT09cix0PXNbMF0uaXRlbXMsbj1zWzFdLml0ZW1zLG89c1syXS5pdGVtcyxsPWU/c1szXS5pdGVtczpudWxsO2g9YVswXS5wcmVjaXNpb24tODt1PS41KygxMjg8PGgpO2NvbnN0IHk9aS5jb21wb25lbnRzWzBdLHc9ci0zO2Y9dC5sZW5ndGg7aWYoeS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uKWZvcihkPTA7ZDxmO2QrKyxiKz13KXtnPXRbZF0rdTtwPW5bZF07bT1vW2RdO2NvbnN0IGU9Zy0obStwPj4yKTtjW2IrK109ZSttPj5oO2NbYisrXT1lPj5oO2NbYisrXT1lK3A+Pmh9ZWxzZSBmb3IoZD0wO2Q8ZjtkKyssYis9dyl7Zz10W2RdK3U7cD1uW2RdO209b1tkXTtjW2IrK109ZysxLjQwMiptPj5oO2NbYisrXT1nLS4zNDQxMypwLS43MTQxNCptPj5oO2NbYisrXT1nKzEuNzcyKnA+Pmh9aWYoZSlmb3IoZD0wLGI9MztkPGY7ZCsrLGIrPTQpY1tiXT1sW2RdK3U+Pmh9ZWxzZSBmb3IobGV0IGU9MDtlPHI7ZSsrKXtjb25zdCB0PXNbZV0uaXRlbXM7aD1hW2VdLnByZWNpc2lvbi04O3U9LjUrKDEyODw8aCk7Zm9yKGI9ZSxkPTAsZj10Lmxlbmd0aDtkPGY7ZCsrKXtjW2JdPXRbZF0rdT4+aDtiKz1yfX1uLnB1c2gobCl9cmV0dXJuIG59KGkpO3RoaXMud2lkdGg9aS5TSVouWHNpei1pLlNJWi5YT3Npejt0aGlzLmhlaWdodD1pLlNJWi5Zc2l6LWkuU0laLllPc2l6O3RoaXMuY29tcG9uZW50c0NvdW50PWkuU0laLkNzaXp9fTtmdW5jdGlvbiBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKGUsdCl7ZS54MD1NYXRoLmNlaWwodC5YT3Npei9lLlhSc2l6KTtlLngxPU1hdGguY2VpbCh0LlhzaXovZS5YUnNpeik7ZS55MD1NYXRoLmNlaWwodC5ZT3Npei9lLllSc2l6KTtlLnkxPU1hdGguY2VpbCh0LllzaXovZS5ZUnNpeik7ZS53aWR0aD1lLngxLWUueDA7ZS5oZWlnaHQ9ZS55MS1lLnkwfWZ1bmN0aW9uIGNhbGN1bGF0ZVRpbGVHcmlkcyhlLHQpe2NvbnN0IGE9ZS5TSVoscj1bXTtsZXQgbjtjb25zdCBpPU1hdGguY2VpbCgoYS5Yc2l6LWEuWFRPc2l6KS9hLlhUc2l6KSxzPU1hdGguY2VpbCgoYS5Zc2l6LWEuWVRPc2l6KS9hLllUc2l6KTtmb3IobGV0IGU9MDtlPHM7ZSsrKWZvcihsZXQgdD0wO3Q8aTt0Kyspe249e307bi50eDA9TWF0aC5tYXgoYS5YVE9zaXordCphLlhUc2l6LGEuWE9zaXopO24udHkwPU1hdGgubWF4KGEuWVRPc2l6K2UqYS5ZVHNpeixhLllPc2l6KTtuLnR4MT1NYXRoLm1pbihhLlhUT3NpeisodCsxKSphLlhUc2l6LGEuWHNpeik7bi50eTE9TWF0aC5taW4oYS5ZVE9zaXorKGUrMSkqYS5ZVHNpeixhLllzaXopO24ud2lkdGg9bi50eDEtbi50eDA7bi5oZWlnaHQ9bi50eTEtbi50eTA7bi5jb21wb25lbnRzPVtdO3IucHVzaChuKX1lLnRpbGVzPXI7Zm9yKGxldCBlPTAsaT1hLkNzaXo7ZTxpO2UrKyl7Y29uc3QgYT10W2VdO2ZvcihsZXQgdD0wLGk9ci5sZW5ndGg7dDxpO3QrKyl7Y29uc3QgaT17fTtuPXJbdF07aS50Y3gwPU1hdGguY2VpbChuLnR4MC9hLlhSc2l6KTtpLnRjeTA9TWF0aC5jZWlsKG4udHkwL2EuWVJzaXopO2kudGN4MT1NYXRoLmNlaWwobi50eDEvYS5YUnNpeik7aS50Y3kxPU1hdGguY2VpbChuLnR5MS9hLllSc2l6KTtpLndpZHRoPWkudGN4MS1pLnRjeDA7aS5oZWlnaHQ9aS50Y3kxLWkudGN5MDtuLmNvbXBvbmVudHNbZV09aX19fWZ1bmN0aW9uIGdldEJsb2Nrc0RpbWVuc2lvbnMoZSx0LGEpe2NvbnN0IHI9dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMsbj17fTtpZihyLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpe24uUFB4PXIucHJlY2luY3RzU2l6ZXNbYV0uUFB4O24uUFB5PXIucHJlY2luY3RzU2l6ZXNbYV0uUFB5fWVsc2V7bi5QUHg9MTU7bi5QUHk9MTV9bi54Y2JfPWE+MD9NYXRoLm1pbihyLnhjYixuLlBQeC0xKTpNYXRoLm1pbihyLnhjYixuLlBQeCk7bi55Y2JfPWE+MD9NYXRoLm1pbihyLnljYixuLlBQeS0xKTpNYXRoLm1pbihyLnljYixuLlBQeSk7cmV0dXJuIG59ZnVuY3Rpb24gYnVpbGRQcmVjaW5jdHMoZSx0LGEpe2NvbnN0IHI9MTw8YS5QUHgsbj0xPDxhLlBQeSxpPTA9PT10LnJlc0xldmVsLHM9MTw8YS5QUHgrKGk/MDotMSksbz0xPDxhLlBQeSsoaT8wOi0xKSxjPXQudHJ4MT50LnRyeDA/TWF0aC5jZWlsKHQudHJ4MS9yKS1NYXRoLmZsb29yKHQudHJ4MC9yKTowLGw9dC50cnkxPnQudHJ5MD9NYXRoLmNlaWwodC50cnkxL24pLU1hdGguZmxvb3IodC50cnkwL24pOjAsaD1jKmw7dC5wcmVjaW5jdFBhcmFtZXRlcnM9e3ByZWNpbmN0V2lkdGg6cixwcmVjaW5jdEhlaWdodDpuLG51bXByZWNpbmN0c3dpZGU6YyxudW1wcmVjaW5jdHNoaWdoOmwsbnVtcHJlY2luY3RzOmgscHJlY2luY3RXaWR0aEluU3ViYmFuZDpzLHByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kOm99fWZ1bmN0aW9uIGJ1aWxkQ29kZWJsb2NrcyhlLHQsYSl7Y29uc3Qgcj1hLnhjYl8sbj1hLnljYl8saT0xPDxyLHM9MTw8bixvPXQudGJ4MD4+cixjPXQudGJ5MD4+bixsPXQudGJ4MStpLTE+PnIsaD10LnRieTErcy0xPj5uLHU9dC5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycyxkPVtdLGY9W107bGV0IGcscCxtLGI7Zm9yKHA9YztwPGg7cCsrKWZvcihnPW87ZzxsO2crKyl7bT17Y2J4OmcsY2J5OnAsdGJ4MDppKmcsdGJ5MDpzKnAsdGJ4MTppKihnKzEpLHRieTE6cyoocCsxKX07bS50YngwXz1NYXRoLm1heCh0LnRieDAsbS50YngwKTttLnRieTBfPU1hdGgubWF4KHQudGJ5MCxtLnRieTApO20udGJ4MV89TWF0aC5taW4odC50YngxLG0udGJ4MSk7bS50YnkxXz1NYXRoLm1pbih0LnRieTEsbS50YnkxKTtiPU1hdGguZmxvb3IoKG0udGJ4MF8tdC50YngwKS91LnByZWNpbmN0V2lkdGhJblN1YmJhbmQpK01hdGguZmxvb3IoKG0udGJ5MF8tdC50YnkwKS91LnByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kKSp1Lm51bXByZWNpbmN0c3dpZGU7bS5wcmVjaW5jdE51bWJlcj1iO20uc3ViYmFuZFR5cGU9dC50eXBlO20uTGJsb2NrPTM7aWYobS50YngxXzw9bS50YngwX3x8bS50YnkxXzw9bS50YnkwXyljb250aW51ZTtkLnB1c2gobSk7bGV0IGU9ZltiXTtpZih2b2lkIDAhPT1lKXtnPGUuY2J4TWluP2UuY2J4TWluPWc6Zz5lLmNieE1heCYmKGUuY2J4TWF4PWcpO3A8ZS5jYnlNaW4/ZS5jYnhNaW49cDpwPmUuY2J5TWF4JiYoZS5jYnlNYXg9cCl9ZWxzZSBmW2JdPWU9e2NieE1pbjpnLGNieU1pbjpwLGNieE1heDpnLGNieU1heDpwfTttLnByZWNpbmN0PWV9dC5jb2RlYmxvY2tQYXJhbWV0ZXJzPXtjb2RlYmxvY2tXaWR0aDpyLGNvZGVibG9ja0hlaWdodDpuLG51bWNvZGVibG9ja3dpZGU6bC1vKzEsbnVtY29kZWJsb2NraGlnaDpoLWMrMX07dC5jb2RlYmxvY2tzPWQ7dC5wcmVjaW5jdHM9Zn1mdW5jdGlvbiBjcmVhdGVQYWNrZXQoZSx0LGEpe2NvbnN0IHI9W10sbj1lLnN1YmJhbmRzO2ZvcihsZXQgZT0wLGE9bi5sZW5ndGg7ZTxhO2UrKyl7Y29uc3QgYT1uW2VdLmNvZGVibG9ja3M7Zm9yKGxldCBlPTAsbj1hLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPWFbZV07bi5wcmVjaW5jdE51bWJlcj09PXQmJnIucHVzaChuKX19cmV0dXJue2xheWVyTnVtYmVyOmEsY29kZWJsb2NrczpyfX1mdW5jdGlvbiBMYXllclJlc29sdXRpb25Db21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGUpe2NvbnN0IHQ9ZS5TSVosYT1lLmN1cnJlbnRUaWxlLmluZGV4LHI9ZS50aWxlc1thXSxuPXIuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxpPXQuQ3NpejtsZXQgcz0wO2ZvcihsZXQgZT0wO2U8aTtlKyspcz1NYXRoLm1heChzLHIuY29tcG9uZW50c1tlXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KTtsZXQgbz0wLGM9MCxsPTAsaD0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCl7Zm9yKDtvPG47bysrKXtmb3IoO2M8PXM7YysrKXtmb3IoO2w8aTtsKyspe2NvbnN0IGU9ci5jb21wb25lbnRzW2xdO2lmKGM+ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KWNvbnRpbnVlO2NvbnN0IHQ9ZS5yZXNvbHV0aW9uc1tjXSxhPXQucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztmb3IoO2g8YTspe2NvbnN0IGU9Y3JlYXRlUGFja2V0KHQsaCxvKTtoKys7cmV0dXJuIGV9aD0wfWw9MH1jPTB9dGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiBSZXNvbHV0aW9uTGF5ZXJDb21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGUpe2NvbnN0IHQ9ZS5TSVosYT1lLmN1cnJlbnRUaWxlLmluZGV4LHI9ZS50aWxlc1thXSxuPXIuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxpPXQuQ3NpejtsZXQgcz0wO2ZvcihsZXQgZT0wO2U8aTtlKyspcz1NYXRoLm1heChzLHIuY29tcG9uZW50c1tlXS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KTtsZXQgbz0wLGM9MCxsPTAsaD0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCl7Zm9yKDtvPD1zO28rKyl7Zm9yKDtjPG47YysrKXtmb3IoO2w8aTtsKyspe2NvbnN0IGU9ci5jb21wb25lbnRzW2xdO2lmKG8+ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KWNvbnRpbnVlO2NvbnN0IHQ9ZS5yZXNvbHV0aW9uc1tvXSxhPXQucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztmb3IoO2g8YTspe2NvbnN0IGU9Y3JlYXRlUGFja2V0KHQsaCxjKTtoKys7cmV0dXJuIGV9aD0wfWw9MH1jPTB9dGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKGUpe2NvbnN0IHQ9ZS5TSVosYT1lLmN1cnJlbnRUaWxlLmluZGV4LHI9ZS50aWxlc1thXSxuPXIuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxpPXQuQ3NpejtsZXQgcyxvLGMsbCxoPTA7Zm9yKGM9MDtjPGk7YysrKXtjb25zdCBlPXIuY29tcG9uZW50c1tjXTtoPU1hdGgubWF4KGgsZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KX1jb25zdCB1PW5ldyBJbnQzMkFycmF5KGgrMSk7Zm9yKG89MDtvPD1oOysrbyl7bGV0IGU9MDtmb3IoYz0wO2M8aTsrK2Mpe2NvbnN0IHQ9ci5jb21wb25lbnRzW2NdLnJlc29sdXRpb25zO288dC5sZW5ndGgmJihlPU1hdGgubWF4KGUsdFtvXS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzKSl9dVtvXT1lfXM9MDtvPTA7Yz0wO2w9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24gSnB4SW1hZ2VfbmV4dFBhY2tldCgpe2Zvcig7bzw9aDtvKyspe2Zvcig7bDx1W29dO2wrKyl7Zm9yKDtjPGk7YysrKXtjb25zdCBlPXIuY29tcG9uZW50c1tjXTtpZihvPmUuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCljb250aW51ZTtjb25zdCB0PWUucmVzb2x1dGlvbnNbb10sYT10LnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7aWYoIShsPj1hKSl7Zm9yKDtzPG47KXtjb25zdCBlPWNyZWF0ZVBhY2tldCh0LGwscyk7cysrO3JldHVybiBlfXM9MH19Yz0wfWw9MH10aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoZSl7Y29uc3QgdD1lLlNJWixhPWUuY3VycmVudFRpbGUuaW5kZXgscj1lLnRpbGVzW2FdLG49ci5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LGk9dC5Dc2l6LHM9Z2V0UHJlY2luY3RTaXplc0luSW1hZ2VTY2FsZShyKSxvPXM7bGV0IGM9MCxsPTAsaD0wLHU9MCxkPTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKXtmb3IoO2Q8by5tYXhOdW1IaWdoO2QrKyl7Zm9yKDt1PG8ubWF4TnVtV2lkZTt1Kyspe2Zvcig7aDxpO2grKyl7Y29uc3QgZT1yLmNvbXBvbmVudHNbaF0sdD1lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7Zm9yKDtsPD10O2wrKyl7Y29uc3QgdD1lLnJlc29sdXRpb25zW2xdLGE9cy5jb21wb25lbnRzW2hdLnJlc29sdXRpb25zW2xdLHI9Z2V0UHJlY2luY3RJbmRleElmRXhpc3QodSxkLGEsbyx0KTtpZihudWxsIT09cil7Zm9yKDtjPG47KXtjb25zdCBlPWNyZWF0ZVBhY2tldCh0LHIsYyk7YysrO3JldHVybiBlfWM9MH19bD0wfWg9MH11PTB9dGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiBDb21wb25lbnRQb3NpdGlvblJlc29sdXRpb25MYXllckl0ZXJhdG9yKGUpe2NvbnN0IHQ9ZS5TSVosYT1lLmN1cnJlbnRUaWxlLmluZGV4LHI9ZS50aWxlc1thXSxuPXIuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxpPXQuQ3NpeixzPWdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUocik7bGV0IG89MCxjPTAsbD0wLGg9MCx1PTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKXtmb3IoO2w8aTsrK2wpe2NvbnN0IGU9ci5jb21wb25lbnRzW2xdLHQ9cy5jb21wb25lbnRzW2xdLGE9ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50O2Zvcig7dTx0Lm1heE51bUhpZ2g7dSsrKXtmb3IoO2g8dC5tYXhOdW1XaWRlO2grKyl7Zm9yKDtjPD1hO2MrKyl7Y29uc3QgYT1lLnJlc29sdXRpb25zW2NdLHI9dC5yZXNvbHV0aW9uc1tjXSxpPWdldFByZWNpbmN0SW5kZXhJZkV4aXN0KGgsdSxyLHQsYSk7aWYobnVsbCE9PWkpe2Zvcig7bzxuOyl7Y29uc3QgZT1jcmVhdGVQYWNrZXQoYSxpLG8pO28rKztyZXR1cm4gZX1vPTB9fWM9MH1oPTB9dT0wfXRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QoZSx0LGEscixuKXtjb25zdCBpPWUqci5taW5XaWR0aCxzPXQqci5taW5IZWlnaHQ7aWYoaSVhLndpZHRoIT0wfHxzJWEuaGVpZ2h0IT0wKXJldHVybiBudWxsO2NvbnN0IG89cy9hLndpZHRoKm4ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7cmV0dXJuIGkvYS5oZWlnaHQrb31mdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKGUpe2NvbnN0IHQ9ZS5jb21wb25lbnRzLmxlbmd0aDtsZXQgYT1OdW1iZXIuTUFYX1ZBTFVFLHI9TnVtYmVyLk1BWF9WQUxVRSxuPTAsaT0wO2NvbnN0IHM9bmV3IEFycmF5KHQpO2ZvcihsZXQgbz0wO288dDtvKyspe2NvbnN0IHQ9ZS5jb21wb25lbnRzW29dLGM9dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50LGw9bmV3IEFycmF5KGMrMSk7bGV0IGg9TnVtYmVyLk1BWF9WQUxVRSx1PU51bWJlci5NQVhfVkFMVUUsZD0wLGY9MCxnPTE7Zm9yKGxldCBlPWM7ZT49MDstLWUpe2NvbnN0IGE9dC5yZXNvbHV0aW9uc1tlXSxyPWcqYS5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aCxuPWcqYS5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHQ7aD1NYXRoLm1pbihoLHIpO3U9TWF0aC5taW4odSxuKTtkPU1hdGgubWF4KGQsYS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZSk7Zj1NYXRoLm1heChmLGEucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c2hpZ2gpO2xbZV09e3dpZHRoOnIsaGVpZ2h0Om59O2c8PD0xfWE9TWF0aC5taW4oYSxoKTtyPU1hdGgubWluKHIsdSk7bj1NYXRoLm1heChuLGQpO2k9TWF0aC5tYXgoaSxmKTtzW29dPXtyZXNvbHV0aW9uczpsLG1pbldpZHRoOmgsbWluSGVpZ2h0OnUsbWF4TnVtV2lkZTpkLG1heE51bUhpZ2g6Zn19cmV0dXJue2NvbXBvbmVudHM6cyxtaW5XaWR0aDphLG1pbkhlaWdodDpyLG1heE51bVdpZGU6bixtYXhOdW1IaWdoOml9fWZ1bmN0aW9uIGJ1aWxkUGFja2V0cyhlKXtjb25zdCB0PWUuU0laLGE9ZS5jdXJyZW50VGlsZS5pbmRleCxyPWUudGlsZXNbYV0sbj10LkNzaXo7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3QgdD1yLmNvbXBvbmVudHNbZV0sYT10LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsbj1bXSxpPVtdO2ZvcihsZXQgZT0wO2U8PWE7ZSsrKXtjb25zdCByPWdldEJsb2Nrc0RpbWVuc2lvbnMoMCx0LGUpLHM9e30sbz0xPDxhLWU7cy50cngwPU1hdGguY2VpbCh0LnRjeDAvbyk7cy50cnkwPU1hdGguY2VpbCh0LnRjeTAvbyk7cy50cngxPU1hdGguY2VpbCh0LnRjeDEvbyk7cy50cnkxPU1hdGguY2VpbCh0LnRjeTEvbyk7cy5yZXNMZXZlbD1lO2J1aWxkUHJlY2luY3RzKDAscyxyKTtuLnB1c2gocyk7bGV0IGM7aWYoMD09PWUpe2M9e307Yy50eXBlPSJMTCI7Yy50YngwPU1hdGguY2VpbCh0LnRjeDAvbyk7Yy50YnkwPU1hdGguY2VpbCh0LnRjeTAvbyk7Yy50YngxPU1hdGguY2VpbCh0LnRjeDEvbyk7Yy50YnkxPU1hdGguY2VpbCh0LnRjeTEvbyk7Yy5yZXNvbHV0aW9uPXM7YnVpbGRDb2RlYmxvY2tzKDAsYyxyKTtpLnB1c2goYyk7cy5zdWJiYW5kcz1bY119ZWxzZXtjb25zdCBuPTE8PGEtZSsxLG89W107Yz17fTtjLnR5cGU9IkhMIjtjLnRieDA9TWF0aC5jZWlsKHQudGN4MC9uLS41KTtjLnRieTA9TWF0aC5jZWlsKHQudGN5MC9uKTtjLnRieDE9TWF0aC5jZWlsKHQudGN4MS9uLS41KTtjLnRieTE9TWF0aC5jZWlsKHQudGN5MS9uKTtjLnJlc29sdXRpb249cztidWlsZENvZGVibG9ja3MoMCxjLHIpO2kucHVzaChjKTtvLnB1c2goYyk7Yz17fTtjLnR5cGU9IkxIIjtjLnRieDA9TWF0aC5jZWlsKHQudGN4MC9uKTtjLnRieTA9TWF0aC5jZWlsKHQudGN5MC9uLS41KTtjLnRieDE9TWF0aC5jZWlsKHQudGN4MS9uKTtjLnRieTE9TWF0aC5jZWlsKHQudGN5MS9uLS41KTtjLnJlc29sdXRpb249cztidWlsZENvZGVibG9ja3MoMCxjLHIpO2kucHVzaChjKTtvLnB1c2goYyk7Yz17fTtjLnR5cGU9IkhIIjtjLnRieDA9TWF0aC5jZWlsKHQudGN4MC9uLS41KTtjLnRieTA9TWF0aC5jZWlsKHQudGN5MC9uLS41KTtjLnRieDE9TWF0aC5jZWlsKHQudGN4MS9uLS41KTtjLnRieTE9TWF0aC5jZWlsKHQudGN5MS9uLS41KTtjLnJlc29sdXRpb249cztidWlsZENvZGVibG9ja3MoMCxjLHIpO2kucHVzaChjKTtvLnB1c2goYyk7cy5zdWJiYW5kcz1vfX10LnJlc29sdXRpb25zPW47dC5zdWJiYW5kcz1pfWNvbnN0IGk9ci5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7c3dpdGNoKGkpe2Nhc2UgMDpyLnBhY2tldHNJdGVyYXRvcj1uZXcgTGF5ZXJSZXNvbHV0aW9uQ29tcG9uZW50UG9zaXRpb25JdGVyYXRvcihlKTticmVhaztjYXNlIDE6ci5wYWNrZXRzSXRlcmF0b3I9bmV3IFJlc29sdXRpb25MYXllckNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoZSk7YnJlYWs7Y2FzZSAyOnIucGFja2V0c0l0ZXJhdG9yPW5ldyBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKGUpO2JyZWFrO2Nhc2UgMzpyLnBhY2tldHNJdGVyYXRvcj1uZXcgUG9zaXRpb25Db21wb25lbnRSZXNvbHV0aW9uTGF5ZXJJdGVyYXRvcihlKTticmVhaztjYXNlIDQ6ci5wYWNrZXRzSXRlcmF0b3I9bmV3IENvbXBvbmVudFBvc2l0aW9uUmVzb2x1dGlvbkxheWVySXRlcmF0b3IoZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgSnB4RXJyb3IoYFVuc3VwcG9ydGVkIHByb2dyZXNzaW9uIG9yZGVyICR7aX1gKX19ZnVuY3Rpb24gcGFyc2VUaWxlUGFja2V0cyhlLHQsYSxyKXtsZXQgaSxzPTAsbz0wLGM9ITE7ZnVuY3Rpb24gcmVhZEJpdHMoZSl7Zm9yKDtvPGU7KXtjb25zdCBlPXRbYStzXTtzKys7aWYoYyl7aT1pPDw3fGU7bys9NztjPSExfWVsc2V7aT1pPDw4fGU7bys9OH0yNTU9PT1lJiYoYz0hMCl9by09ZTtyZXR1cm4gaT4+Pm8mKDE8PGUpLTF9ZnVuY3Rpb24gc2tpcE1hcmtlcklmRXF1YWwoZSl7aWYoMjU1PT09dFthK3MtMV0mJnRbYStzXT09PWUpe3NraXBCeXRlcygxKTtyZXR1cm4hMH1pZigyNTU9PT10W2Erc10mJnRbYStzKzFdPT09ZSl7c2tpcEJ5dGVzKDIpO3JldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHNraXBCeXRlcyhlKXtzKz1lfWZ1bmN0aW9uIGFsaWduVG9CeXRlKCl7bz0wO2lmKGMpe3MrKztjPSExfX1mdW5jdGlvbiByZWFkQ29kaW5ncGFzc2VzKCl7aWYoMD09PXJlYWRCaXRzKDEpKXJldHVybiAxO2lmKDA9PT1yZWFkQml0cygxKSlyZXR1cm4gMjtsZXQgZT1yZWFkQml0cygyKTtpZihlPDMpcmV0dXJuIGUrMztlPXJlYWRCaXRzKDUpO2lmKGU8MzEpcmV0dXJuIGUrNjtlPXJlYWRCaXRzKDcpO3JldHVybiBlKzM3fWNvbnN0IGw9ZS5jdXJyZW50VGlsZS5pbmRleCxoPWUudGlsZXNbbF0sdT1lLkNPRC5zb3BNYXJrZXJVc2VkLGQ9ZS5DT0QuZXBoTWFya2VyVXNlZCxmPWgucGFja2V0c0l0ZXJhdG9yO2Zvcig7czxyOyl7YWxpZ25Ub0J5dGUoKTt1JiZza2lwTWFya2VySWZFcXVhbCgxNDUpJiZza2lwQnl0ZXMoNCk7Y29uc3QgZT1mLm5leHRQYWNrZXQoKTtpZighcmVhZEJpdHMoMSkpY29udGludWU7Y29uc3Qgcj1lLmxheWVyTnVtYmVyLGk9W107bGV0IG87Zm9yKGxldCB0PTAsYT1lLmNvZGVibG9ja3MubGVuZ3RoO3Q8YTt0Kyspe289ZS5jb2RlYmxvY2tzW3RdO2xldCBhPW8ucHJlY2luY3Q7Y29uc3Qgcz1vLmNieC1hLmNieE1pbixjPW8uY2J5LWEuY2J5TWluO2xldCBsLGgsdT0hMSxkPSExO2lmKHZvaWQgMCE9PW8uaW5jbHVkZWQpdT0hIXJlYWRCaXRzKDEpO2Vsc2V7YT1vLnByZWNpbmN0O2xldCBlO2lmKHZvaWQgMCE9PWEuaW5jbHVzaW9uVHJlZSllPWEuaW5jbHVzaW9uVHJlZTtlbHNle2NvbnN0IHQ9YS5jYnhNYXgtYS5jYnhNaW4rMSxuPWEuY2J5TWF4LWEuY2J5TWluKzE7ZT1uZXcgSW5jbHVzaW9uVHJlZSh0LG4scik7aD1uZXcgVGFnVHJlZSh0LG4pO2EuaW5jbHVzaW9uVHJlZT1lO2EuemVyb0JpdFBsYW5lc1RyZWU9aDtmb3IobGV0IGU9MDtlPHI7ZSsrKWlmKDAhPT1yZWFkQml0cygxKSl0aHJvdyBuZXcgSnB4RXJyb3IoIkludmFsaWQgdGFnIHRyZWUiKX1pZihlLnJlc2V0KHMsYyxyKSlmb3IoOzspe2lmKCFyZWFkQml0cygxKSl7ZS5pbmNyZW1lbnRWYWx1ZShyKTticmVha31sPSFlLm5leHRMZXZlbCgpO2lmKGwpe28uaW5jbHVkZWQ9ITA7dT1kPSEwO2JyZWFrfX19aWYoIXUpY29udGludWU7aWYoZCl7aD1hLnplcm9CaXRQbGFuZXNUcmVlO2gucmVzZXQocyxjKTtmb3IoOzspaWYocmVhZEJpdHMoMSkpe2w9IWgubmV4dExldmVsKCk7aWYobClicmVha31lbHNlIGguaW5jcmVtZW50VmFsdWUoKTtvLnplcm9CaXRQbGFuZXM9aC52YWx1ZX1jb25zdCBmPXJlYWRDb2RpbmdwYXNzZXMoKTtmb3IoO3JlYWRCaXRzKDEpOylvLkxibG9jaysrO2NvbnN0IGc9KDAsbi5sb2cyKShmKSxwPXJlYWRCaXRzKChmPDE8PGc/Zy0xOmcpK28uTGJsb2NrKTtpLnB1c2goe2NvZGVibG9jazpvLGNvZGluZ3Bhc3NlczpmLGRhdGFMZW5ndGg6cH0pfWFsaWduVG9CeXRlKCk7ZCYmc2tpcE1hcmtlcklmRXF1YWwoMTQ2KTtmb3IoO2kubGVuZ3RoPjA7KXtjb25zdCBlPWkuc2hpZnQoKTtvPWUuY29kZWJsb2NrO3ZvaWQgMD09PW8uZGF0YSYmKG8uZGF0YT1bXSk7by5kYXRhLnB1c2goe2RhdGE6dCxzdGFydDphK3MsZW5kOmErcytlLmRhdGFMZW5ndGgsY29kaW5ncGFzc2VzOmUuY29kaW5ncGFzc2VzfSk7cys9ZS5kYXRhTGVuZ3RofX1yZXR1cm4gc31mdW5jdGlvbiBjb3B5Q29lZmZpY2llbnRzKGUsdCxhLHIsbixzLG8sYyxsKXtjb25zdCBoPXIudGJ4MCx1PXIudGJ5MCxkPXIudGJ4MS1yLnRieDAsZj1yLmNvZGVibG9ja3MsZz0iSCI9PT1yLnR5cGUuY2hhckF0KDApPzE6MCxwPSJIIj09PXIudHlwZS5jaGFyQXQoMSk/dDowO2ZvcihsZXQgYT0wLG09Zi5sZW5ndGg7YTxtOysrYSl7Y29uc3QgbT1mW2FdLGI9bS50YngxXy1tLnRieDBfLHk9bS50YnkxXy1tLnRieTBfO2lmKDA9PT1ifHwwPT09eSljb250aW51ZTtpZih2b2lkIDA9PT1tLmRhdGEpY29udGludWU7Y29uc3Qgdz1uZXcgQml0TW9kZWwoYix5LG0uc3ViYmFuZFR5cGUsbS56ZXJvQml0UGxhbmVzLHMpO2xldCBTPTI7Y29uc3QgeD1tLmRhdGE7bGV0IEMsdixrLE89MCxUPTA7Zm9yKEM9MCx2PXgubGVuZ3RoO0M8djtDKyspe2s9eFtDXTtPKz1rLmVuZC1rLnN0YXJ0O1QrPWsuY29kaW5ncGFzc2VzfWNvbnN0IE09bmV3IFVpbnQ4QXJyYXkoTyk7bGV0IEU9MDtmb3IoQz0wLHY9eC5sZW5ndGg7Qzx2O0MrKyl7az14W0NdO2NvbnN0IGU9ay5kYXRhLnN1YmFycmF5KGsuc3RhcnQsay5lbmQpO00uc2V0KGUsRSk7RSs9ZS5sZW5ndGh9Y29uc3QgRD1uZXcgaS5Bcml0aG1ldGljRGVjb2RlcihNLDAsTyk7dy5zZXREZWNvZGVyKEQpO2ZvcihDPTA7QzxUO0MrKyl7c3dpdGNoKFMpe2Nhc2UgMDp3LnJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpO2JyZWFrO2Nhc2UgMTp3LnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7YnJlYWs7Y2FzZSAyOncucnVuQ2xlYW51cFBhc3MoKTtjJiZ3LmNoZWNrU2VnbWVudGF0aW9uU3ltYm9sKCl9bCYmdy5yZXNldCgpO1M9KFMrMSklM31sZXQgTj1tLnRieDBfLWgrKG0udGJ5MF8tdSkqZDtjb25zdCBSPXcuY29lZmZpY2VudHNTaWduLEw9dy5jb2VmZmljZW50c01hZ25pdHVkZSwkPXcuYml0c0RlY29kZWQsXz1vPzA6LjU7bGV0IGosVSxYO0U9MDtjb25zdCBIPSJMTCIhPT1yLnR5cGU7Zm9yKEM9MDtDPHk7QysrKXtjb25zdCBhPTIqKE4vZHwwKSoodC1kKStnK3A7Zm9yKGo9MDtqPGI7aisrKXtVPUxbRV07aWYoMCE9PVUpe1U9KFUrXykqbjswIT09UltFXSYmKFU9LVUpO1g9JFtFXTtlW0g/YSsoTjw8MSk6Tl09byYmWD49cz9VOlUqKDE8PHMtWCl9TisrO0UrK31OKz1kLWJ9fX1mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKGUsdCxhKXtjb25zdCByPXQuY29tcG9uZW50c1thXSxuPXIuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLGk9ci5xdWFudGl6YXRpb25QYXJhbWV0ZXJzLG89bi5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsYz1pLlNQcWNkcyxsPWkuc2NhbGFyRXhwb3VuZGVkLGg9aS5ndWFyZEJpdHMsdT1uLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQsZD1uLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMsZj1lLmNvbXBvbmVudHNbYV0ucHJlY2lzaW9uLGc9bi5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24scD1nP25ldyBSZXZlcnNpYmxlVHJhbnNmb3JtOm5ldyBJcnJldmVyc2libGVUcmFuc2Zvcm0sbT1bXTtsZXQgYj0wO2ZvcihsZXQgZT0wO2U8PW87ZSsrKXtjb25zdCB0PXIucmVzb2x1dGlvbnNbZV0sYT10LnRyeDEtdC50cngwLG49dC50cnkxLXQudHJ5MCxpPW5ldyBGbG9hdDMyQXJyYXkoYSpuKTtmb3IobGV0IHI9MCxuPXQuc3ViYmFuZHMubGVuZ3RoO3I8bjtyKyspe2xldCBuLG87aWYobCl7bj1jW2JdLm11O289Y1tiXS5lcHNpbG9uO2IrK31lbHNle249Y1swXS5tdTtvPWNbMF0uZXBzaWxvbisoZT4wPzEtZTowKX1jb25zdCBwPXQuc3ViYmFuZHNbcl0sbT1zW3AudHlwZV07Y29weUNvZWZmaWNpZW50cyhpLGEsMCxwLGc/MToyKiooZittLW8pKigxK24vMjA0OCksaCtvLTEsZyx1LGQpfW0ucHVzaCh7d2lkdGg6YSxoZWlnaHQ6bixpdGVtczppfSl9Y29uc3QgeT1wLmNhbGN1bGF0ZShtLHIudGN4MCxyLnRjeTApO3JldHVybntsZWZ0OnIudGN4MCx0b3A6ci50Y3kwLHdpZHRoOnkud2lkdGgsaGVpZ2h0OnkuaGVpZ2h0LGl0ZW1zOnkuaXRlbXN9fWZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGUsdCl7Y29uc3QgYT1lLlNJWi5Dc2l6LHI9ZS50aWxlc1t0XTtmb3IobGV0IHQ9MDt0PGE7dCsrKXtjb25zdCBhPXIuY29tcG9uZW50c1t0XSxuPXZvaWQgMCE9PWUuY3VycmVudFRpbGUuUUNDW3RdP2UuY3VycmVudFRpbGUuUUNDW3RdOmUuY3VycmVudFRpbGUuUUNEO2EucXVhbnRpemF0aW9uUGFyYW1ldGVycz1uO2NvbnN0IGk9dm9pZCAwIT09ZS5jdXJyZW50VGlsZS5DT0NbdF0/ZS5jdXJyZW50VGlsZS5DT0NbdF06ZS5jdXJyZW50VGlsZS5DT0Q7YS5jb2RpbmdTdHlsZVBhcmFtZXRlcnM9aX1yLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnM9ZS5jdXJyZW50VGlsZS5DT0R9Y2xhc3MgVGFnVHJlZXtjb25zdHJ1Y3RvcihlLHQpe2NvbnN0IGE9KDAsbi5sb2cyKShNYXRoLm1heChlLHQpKSsxO3RoaXMubGV2ZWxzPVtdO2ZvcihsZXQgcj0wO3I8YTtyKyspe2NvbnN0IGE9e3dpZHRoOmUsaGVpZ2h0OnQsaXRlbXM6W119O3RoaXMubGV2ZWxzLnB1c2goYSk7ZT1NYXRoLmNlaWwoZS8yKTt0PU1hdGguY2VpbCh0LzIpfX1yZXNldChlLHQpe2xldCBhLHI9MCxuPTA7Zm9yKDtyPHRoaXMubGV2ZWxzLmxlbmd0aDspe2E9dGhpcy5sZXZlbHNbcl07Y29uc3QgaT1lK3QqYS53aWR0aDtpZih2b2lkIDAhPT1hLml0ZW1zW2ldKXtuPWEuaXRlbXNbaV07YnJlYWt9YS5pbmRleD1pO2U+Pj0xO3Q+Pj0xO3IrK31yLS07YT10aGlzLmxldmVsc1tyXTthLml0ZW1zW2EuaW5kZXhdPW47dGhpcy5jdXJyZW50TGV2ZWw9cjtkZWxldGUgdGhpcy52YWx1ZX1pbmNyZW1lbnRWYWx1ZSgpe2NvbnN0IGU9dGhpcy5sZXZlbHNbdGhpcy5jdXJyZW50TGV2ZWxdO2UuaXRlbXNbZS5pbmRleF0rK31uZXh0TGV2ZWwoKXtsZXQgZT10aGlzLmN1cnJlbnRMZXZlbCx0PXRoaXMubGV2ZWxzW2VdO2NvbnN0IGE9dC5pdGVtc1t0LmluZGV4XTtlLS07aWYoZTwwKXt0aGlzLnZhbHVlPWE7cmV0dXJuITF9dGhpcy5jdXJyZW50TGV2ZWw9ZTt0PXRoaXMubGV2ZWxzW2VdO3QuaXRlbXNbdC5pbmRleF09YTtyZXR1cm4hMH19Y2xhc3MgSW5jbHVzaW9uVHJlZXtjb25zdHJ1Y3RvcihlLHQsYSl7Y29uc3Qgcj0oMCxuLmxvZzIpKE1hdGgubWF4KGUsdCkpKzE7dGhpcy5sZXZlbHM9W107Zm9yKGxldCBuPTA7bjxyO24rKyl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlKnQpO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKylyW2VdPWE7Y29uc3Qgbj17d2lkdGg6ZSxoZWlnaHQ6dCxpdGVtczpyfTt0aGlzLmxldmVscy5wdXNoKG4pO2U9TWF0aC5jZWlsKGUvMik7dD1NYXRoLmNlaWwodC8yKX19cmVzZXQoZSx0LGEpe2xldCByPTA7Zm9yKDtyPHRoaXMubGV2ZWxzLmxlbmd0aDspe2NvbnN0IG49dGhpcy5sZXZlbHNbcl0saT1lK3Qqbi53aWR0aDtuLmluZGV4PWk7Y29uc3Qgcz1uLml0ZW1zW2ldO2lmKDI1NT09PXMpYnJlYWs7aWYocz5hKXt0aGlzLmN1cnJlbnRMZXZlbD1yO3RoaXMucHJvcGFnYXRlVmFsdWVzKCk7cmV0dXJuITF9ZT4+PTE7dD4+PTE7cisrfXRoaXMuY3VycmVudExldmVsPXItMTtyZXR1cm4hMH1pbmNyZW1lbnRWYWx1ZShlKXtjb25zdCB0PXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTt0Lml0ZW1zW3QuaW5kZXhdPWUrMTt0aGlzLnByb3BhZ2F0ZVZhbHVlcygpfXByb3BhZ2F0ZVZhbHVlcygpe2xldCBlPXRoaXMuY3VycmVudExldmVsLHQ9dGhpcy5sZXZlbHNbZV07Y29uc3QgYT10Lml0ZW1zW3QuaW5kZXhdO2Zvcig7LS1lPj0wOyl7dD10aGlzLmxldmVsc1tlXTt0Lml0ZW1zW3QuaW5kZXhdPWF9fW5leHRMZXZlbCgpe2xldCBlPXRoaXMuY3VycmVudExldmVsLHQ9dGhpcy5sZXZlbHNbZV07Y29uc3QgYT10Lml0ZW1zW3QuaW5kZXhdO3QuaXRlbXNbdC5pbmRleF09MjU1O2UtLTtpZihlPDApcmV0dXJuITE7dGhpcy5jdXJyZW50TGV2ZWw9ZTt0PXRoaXMubGV2ZWxzW2VdO3QuaXRlbXNbdC5pbmRleF09YTtyZXR1cm4hMH19Y2xhc3MgQml0TW9kZWx7c3RhdGljIFVOSUZPUk1fQ09OVEVYVD0xNztzdGF0aWMgUlVOTEVOR1RIX0NPTlRFWFQ9MTg7c3RhdGljIExMQW5kTEhDb250ZXh0c0xhYmVsPW5ldyBVaW50OEFycmF5KFswLDUsOCwwLDMsNyw4LDAsNCw3LDgsMCwwLDAsMCwwLDEsNiw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMiw2LDgsMCwzLDcsOCwwLDQsNyw4LDAsMCwwLDAsMCwyLDYsOCwwLDMsNyw4LDAsNCw3LDgsMCwwLDAsMCwwLDIsNiw4LDAsMyw3LDgsMCw0LDcsOF0pO3N0YXRpYyBITENvbnRleHRMYWJlbD1uZXcgVWludDhBcnJheShbMCwzLDQsMCw1LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwxLDMsNCwwLDYsNyw3LDAsOCw4LDgsMCwwLDAsMCwwLDIsMyw0LDAsNiw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMiwzLDQsMCw2LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwyLDMsNCwwLDYsNyw3LDAsOCw4LDhdKTtzdGF0aWMgSEhDb250ZXh0TGFiZWw9bmV3IFVpbnQ4QXJyYXkoWzAsMSwyLDAsMSwyLDIsMCwyLDIsMiwwLDAsMCwwLDAsMyw0LDUsMCw0LDUsNSwwLDUsNSw1LDAsMCwwLDAsMCw2LDcsNywwLDcsNyw3LDAsNyw3LDcsMCwwLDAsMCwwLDgsOCw4LDAsOCw4LDgsMCw4LDgsOCwwLDAsMCwwLDAsOCw4LDgsMCw4LDgsOCwwLDgsOCw4XSk7Y29uc3RydWN0b3IoZSx0LGEscixuKXt0aGlzLndpZHRoPWU7dGhpcy5oZWlnaHQ9dDtsZXQgaTtpPSJISCI9PT1hP0JpdE1vZGVsLkhIQ29udGV4dExhYmVsOiJITCI9PT1hP0JpdE1vZGVsLkhMQ29udGV4dExhYmVsOkJpdE1vZGVsLkxMQW5kTEhDb250ZXh0c0xhYmVsO3RoaXMuY29udGV4dExhYmVsVGFibGU9aTtjb25zdCBzPWUqdDt0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZT1uZXcgVWludDhBcnJheShzKTt0aGlzLmNvZWZmaWNlbnRzU2lnbj1uZXcgVWludDhBcnJheShzKTtsZXQgbztvPW4+MTQ/bmV3IFVpbnQzMkFycmF5KHMpOm4+Nj9uZXcgVWludDE2QXJyYXkocyk6bmV3IFVpbnQ4QXJyYXkocyk7dGhpcy5jb2VmZmljZW50c01hZ25pdHVkZT1vO3RoaXMucHJvY2Vzc2luZ0ZsYWdzPW5ldyBVaW50OEFycmF5KHMpO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkocyk7aWYoMCE9PXIpZm9yKGxldCBlPTA7ZTxzO2UrKyljW2VdPXI7dGhpcy5iaXRzRGVjb2RlZD1jO3RoaXMucmVzZXQoKX1zZXREZWNvZGVyKGUpe3RoaXMuZGVjb2Rlcj1lfXJlc2V0KCl7dGhpcy5jb250ZXh0cz1uZXcgSW50OEFycmF5KDE5KTt0aGlzLmNvbnRleHRzWzBdPTg7dGhpcy5jb250ZXh0c1tCaXRNb2RlbC5VTklGT1JNX0NPTlRFWFRdPTkyO3RoaXMuY29udGV4dHNbQml0TW9kZWwuUlVOTEVOR1RIX0NPTlRFWFRdPTZ9c2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGUsdCxhKXtjb25zdCByPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLG49dGhpcy53aWR0aCxpPXRoaXMuaGVpZ2h0LHM9dD4wLG89dCsxPG47bGV0IGM7aWYoZT4wKXtjPWEtbjtzJiYocltjLTFdKz0xNik7byYmKHJbYysxXSs9MTYpO3JbY10rPTR9aWYoZSsxPGkpe2M9YStuO3MmJihyW2MtMV0rPTE2KTtvJiYocltjKzFdKz0xNik7cltjXSs9NH1zJiYoclthLTFdKz0xKTtvJiYoclthKzFdKz0xKTtyW2FdfD0xMjh9cnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzKCl7Y29uc3QgZT10aGlzLmRlY29kZXIsdD10aGlzLndpZHRoLGE9dGhpcy5oZWlnaHQscj10aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlLG49dGhpcy5jb2VmZmljZW50c1NpZ24saT10aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSxzPXRoaXMucHJvY2Vzc2luZ0ZsYWdzLG89dGhpcy5jb250ZXh0cyxjPXRoaXMuY29udGV4dExhYmVsVGFibGUsbD10aGlzLmJpdHNEZWNvZGVkO2ZvcihsZXQgaD0wO2g8YTtoKz00KWZvcihsZXQgdT0wO3U8dDt1Kyspe2xldCBkPWgqdCt1O2ZvcihsZXQgZj0wO2Y8NDtmKyssZCs9dCl7Y29uc3QgdD1oK2Y7aWYodD49YSlicmVhaztzW2RdJj0tMjtpZihyW2RdfHwhaVtkXSljb250aW51ZTtjb25zdCBnPWNbaVtkXV07aWYoZS5yZWFkQml0KG8sZykpe2NvbnN0IGU9dGhpcy5kZWNvZGVTaWduQml0KHQsdSxkKTtuW2RdPWU7cltkXT0xO3RoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKHQsdSxkKTtzW2RdfD0yfWxbZF0rKztzW2RdfD0xfX19ZGVjb2RlU2lnbkJpdChlLHQsYSl7Y29uc3Qgcj10aGlzLndpZHRoLG49dGhpcy5oZWlnaHQsaT10aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlLHM9dGhpcy5jb2VmZmljZW50c1NpZ247bGV0IG8sYyxsLGgsdSxkO2g9dD4wJiYwIT09aVthLTFdO2lmKHQrMTxyJiYwIT09aVthKzFdKXtsPXNbYSsxXTtpZihoKXtjPXNbYS0xXTtvPTEtbC1jfWVsc2Ugbz0xLWwtbH1lbHNlIGlmKGgpe2M9c1thLTFdO289MS1jLWN9ZWxzZSBvPTA7Y29uc3QgZj0zKm87aD1lPjAmJjAhPT1pW2Etcl07aWYoZSsxPG4mJjAhPT1pW2Ercl0pe2w9c1thK3JdO2lmKGgpe2M9c1thLXJdO289MS1sLWMrZn1lbHNlIG89MS1sLWwrZn1lbHNlIGlmKGgpe2M9c1thLXJdO289MS1jLWMrZn1lbHNlIG89ZjtpZihvPj0wKXt1PTkrbztkPXRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsdSl9ZWxzZXt1PTktbztkPTFedGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cyx1KX1yZXR1cm4gZH1ydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzcygpe2NvbnN0IGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy53aWR0aCxhPXRoaXMuaGVpZ2h0LHI9dGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSxuPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLGk9dGhpcy5jb250ZXh0cyxzPXRoaXMuYml0c0RlY29kZWQsbz10aGlzLnByb2Nlc3NpbmdGbGFncyxjPXQqYSxsPTQqdDtmb3IobGV0IGEsaD0wO2g8YztoPWEpe2E9TWF0aC5taW4oYyxoK2wpO2ZvcihsZXQgYz0wO2M8dDtjKyspZm9yKGxldCBsPWgrYztsPGE7bCs9dCl7aWYoIXJbbF18fDAhPSgxJm9bbF0pKWNvbnRpbnVlO2xldCB0PTE2O2lmKDAhPSgyJm9bbF0pKXtvW2xdXj0yO3Q9MD09PSgxMjcmbltsXSk/MTU6MTR9Y29uc3QgYT1lLnJlYWRCaXQoaSx0KTtyW2xdPXJbbF08PDF8YTtzW2xdKys7b1tsXXw9MX19fXJ1bkNsZWFudXBQYXNzKCl7Y29uc3QgZT10aGlzLmRlY29kZXIsdD10aGlzLndpZHRoLGE9dGhpcy5oZWlnaHQscj10aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSxuPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUsaT10aGlzLmNvZWZmaWNlbnRzU2lnbixzPXRoaXMuY29udGV4dHMsbz10aGlzLmNvbnRleHRMYWJlbFRhYmxlLGM9dGhpcy5iaXRzRGVjb2RlZCxsPXRoaXMucHJvY2Vzc2luZ0ZsYWdzLGg9dCx1PTIqdCxkPTMqdDtsZXQgZjtmb3IobGV0IGc9MDtnPGE7Zz1mKXtmPU1hdGgubWluKGcrNCxhKTtjb25zdCBwPWcqdCxtPWcrMzxhO2ZvcihsZXQgYT0wO2E8dDthKyspe2NvbnN0IGI9cCthO2xldCB5LHc9MCxTPWIseD1nO2lmKG0mJjA9PT1sW2JdJiYwPT09bFtiK2hdJiYwPT09bFtiK3VdJiYwPT09bFtiK2RdJiYwPT09cltiXSYmMD09PXJbYitoXSYmMD09PXJbYit1XSYmMD09PXJbYitkXSl7aWYoIWUucmVhZEJpdChzLEJpdE1vZGVsLlJVTkxFTkdUSF9DT05URVhUKSl7Y1tiXSsrO2NbYitoXSsrO2NbYit1XSsrO2NbYitkXSsrO2NvbnRpbnVlfXc9ZS5yZWFkQml0KHMsQml0TW9kZWwuVU5JRk9STV9DT05URVhUKTw8MXxlLnJlYWRCaXQocyxCaXRNb2RlbC5VTklGT1JNX0NPTlRFWFQpO2lmKDAhPT13KXt4PWcrdztTKz13KnR9eT10aGlzLmRlY29kZVNpZ25CaXQoeCxhLFMpO2lbU109eTtuW1NdPTE7dGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoeCxhLFMpO2xbU118PTI7Uz1iO2ZvcihsZXQgZT1nO2U8PXg7ZSsrLFMrPXQpY1tTXSsrO3crK31mb3IoeD1nK3c7eDxmO3grKyxTKz10KXtpZihuW1NdfHwwIT0oMSZsW1NdKSljb250aW51ZTtjb25zdCB0PW9bcltTXV07aWYoMT09PWUucmVhZEJpdChzLHQpKXt5PXRoaXMuZGVjb2RlU2lnbkJpdCh4LGEsUyk7aVtTXT15O25bU109MTt0aGlzLnNldE5laWdoYm9yc1NpZ25pZmljYW5jZSh4LGEsUyk7bFtTXXw9Mn1jW1NdKyt9fX19Y2hlY2tTZWdtZW50YXRpb25TeW1ib2woKXtjb25zdCBlPXRoaXMuZGVjb2Rlcix0PXRoaXMuY29udGV4dHM7aWYoMTAhPT0oZS5yZWFkQml0KHQsQml0TW9kZWwuVU5JRk9STV9DT05URVhUKTw8M3xlLnJlYWRCaXQodCxCaXRNb2RlbC5VTklGT1JNX0NPTlRFWFQpPDwyfGUucmVhZEJpdCh0LEJpdE1vZGVsLlVOSUZPUk1fQ09OVEVYVCk8PDF8ZS5yZWFkQml0KHQsQml0TW9kZWwuVU5JRk9STV9DT05URVhUKSkpdGhyb3cgbmV3IEpweEVycm9yKCJJbnZhbGlkIHNlZ21lbnRhdGlvbiBzeW1ib2wiKX19Y2xhc3MgVHJhbnNmb3Jte2NvbnN0cnVjdG9yKCl7dGhpcy5jb25zdHJ1Y3Rvcj09PVRyYW5zZm9ybSYmKDAsci51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIFRyYW5zZm9ybS4iKX1jYWxjdWxhdGUoZSx0LGEpe2xldCByPWVbMF07Zm9yKGxldCBuPTEsaT1lLmxlbmd0aDtuPGk7bisrKXI9dGhpcy5pdGVyYXRlKHIsZVtuXSx0LGEpO3JldHVybiByfWV4dGVuZChlLHQsYSl7bGV0IHI9dC0xLG49dCsxLGk9dCthLTIscz10K2E7ZVtyLS1dPWVbbisrXTtlW3MrK109ZVtpLS1dO2Vbci0tXT1lW24rK107ZVtzKytdPWVbaS0tXTtlW3ItLV09ZVtuKytdO2VbcysrXT1lW2ktLV07ZVtyXT1lW25dO2Vbc109ZVtpXX1maWx0ZXIoZSx0LGEpeygwLHIudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGZpbHRlcmAgY2FsbGVkIil9aXRlcmF0ZShlLHQsYSxyKXtjb25zdCBuPWUud2lkdGgsaT1lLmhlaWdodDtsZXQgcz1lLml0ZW1zO2NvbnN0IG89dC53aWR0aCxjPXQuaGVpZ2h0LGw9dC5pdGVtcztsZXQgaCx1LGQsZixnLHA7Zm9yKGQ9MCxoPTA7aDxpO2grKyl7Zj0yKmgqbztmb3IodT0wO3U8bjt1KyssZCsrLGYrPTIpbFtmXT1zW2RdfXM9ZS5pdGVtcz1udWxsO2NvbnN0IG09bmV3IEZsb2F0MzJBcnJheShvKzgpO2lmKDE9PT1vKXtpZigwIT0oMSZhKSlmb3IocD0wLGQ9MDtwPGM7cCsrLGQrPW8pbFtkXSo9LjV9ZWxzZSBmb3IocD0wLGQ9MDtwPGM7cCsrLGQrPW8pe20uc2V0KGwuc3ViYXJyYXkoZCxkK28pLDQpO3RoaXMuZXh0ZW5kKG0sNCxvKTt0aGlzLmZpbHRlcihtLDQsbyk7bC5zZXQobS5zdWJhcnJheSg0LDQrbyksZCl9bGV0IGI9MTY7Y29uc3QgeT1bXTtmb3IoaD0wO2g8YjtoKyspeS5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoYys4KSk7bGV0IHcsUz0wO2U9NCtjO2lmKDE9PT1jKXtpZigwIT0oMSZyKSlmb3IoZz0wO2c8bztnKyspbFtnXSo9LjV9ZWxzZSBmb3IoZz0wO2c8bztnKyspe2lmKDA9PT1TKXtiPU1hdGgubWluKG8tZyxiKTtmb3IoZD1nLGY9NDtmPGU7ZCs9byxmKyspZm9yKHc9MDt3PGI7dysrKXlbd11bZl09bFtkK3ddO1M9Yn1TLS07Y29uc3QgdD15W1NdO3RoaXMuZXh0ZW5kKHQsNCxjKTt0aGlzLmZpbHRlcih0LDQsYyk7aWYoMD09PVMpe2Q9Zy1iKzE7Zm9yKGY9NDtmPGU7ZCs9byxmKyspZm9yKHc9MDt3PGI7dysrKWxbZCt3XT15W3ddW2ZdfX1yZXR1cm57d2lkdGg6byxoZWlnaHQ6YyxpdGVtczpsfX19Y2xhc3MgSXJyZXZlcnNpYmxlVHJhbnNmb3JtIGV4dGVuZHMgVHJhbnNmb3Jte2ZpbHRlcihlLHQsYSl7Y29uc3Qgcj1hPj4xO2xldCBuLGkscyxvO2NvbnN0IGM9LTEuNTg2MTM0MzQyMDU5OTI0LGw9LS4wNTI5ODAxMTg1NzI5NjEsaD0uODgyOTExMDc1NTMwOTM0LHU9LjQ0MzUwNjg1MjA0Mzk3MSxkPTEuMjMwMTc0MTA0OTE0MDAxO249KHR8PTApLTM7Zm9yKGk9cis0O2ktLTtuKz0yKWVbbl0qPS44MTI4OTMwNjYxMTU5NjA5O249dC0yO3M9dSplW24tMV07Zm9yKGk9ciszO2ktLTtuKz0yKXtvPXUqZVtuKzFdO2Vbbl09ZCplW25dLXMtbztpZighaS0tKWJyZWFrO24rPTI7cz11KmVbbisxXTtlW25dPWQqZVtuXS1zLW99bj10LTE7cz1oKmVbbi0xXTtmb3IoaT1yKzI7aS0tO24rPTIpe289aCplW24rMV07ZVtuXS09cytvO2lmKCFpLS0pYnJlYWs7bis9MjtzPWgqZVtuKzFdO2Vbbl0tPXMrb31uPXQ7cz1sKmVbbi0xXTtmb3IoaT1yKzE7aS0tO24rPTIpe289bCplW24rMV07ZVtuXS09cytvO2lmKCFpLS0pYnJlYWs7bis9MjtzPWwqZVtuKzFdO2Vbbl0tPXMrb31pZigwIT09cil7bj10KzE7cz1jKmVbbi0xXTtmb3IoaT1yO2ktLTtuKz0yKXtvPWMqZVtuKzFdO2Vbbl0tPXMrbztpZighaS0tKWJyZWFrO24rPTI7cz1jKmVbbisxXTtlW25dLT1zK299fX19Y2xhc3MgUmV2ZXJzaWJsZVRyYW5zZm9ybSBleHRlbmRzIFRyYW5zZm9ybXtmaWx0ZXIoZSx0LGEpe2NvbnN0IHI9YT4+MTtsZXQgbixpO2ZvcihuPXR8PTAsaT1yKzE7aS0tO24rPTIpZVtuXS09ZVtuLTFdK2VbbisxXSsyPj4yO2ZvcihuPXQrMSxpPXI7aS0tO24rPTIpZVtuXSs9ZVtuLTFdK2VbbisxXT4+MX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkxaV1N0cmVhbT12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO3ZhciByPWEoMTY4KTtjbGFzcyBMWldTdHJlYW0gZXh0ZW5kcyByLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIodCk7dGhpcy5zdHI9ZTt0aGlzLmRpY3Q9ZS5kaWN0O3RoaXMuY2FjaGVkRGF0YT0wO3RoaXMuYml0c0NhY2hlZD0wO2NvbnN0IHI9NDA5NixuPXtlYXJseUNoYW5nZTphLGNvZGVMZW5ndGg6OSxuZXh0Q29kZToyNTgsZGljdGlvbmFyeVZhbHVlczpuZXcgVWludDhBcnJheShyKSxkaWN0aW9uYXJ5TGVuZ3RoczpuZXcgVWludDE2QXJyYXkociksZGljdGlvbmFyeVByZXZDb2RlczpuZXcgVWludDE2QXJyYXkociksY3VycmVudFNlcXVlbmNlOm5ldyBVaW50OEFycmF5KHIpLGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDowfTtmb3IobGV0IGU9MDtlPDI1NjsrK2Upe24uZGljdGlvbmFyeVZhbHVlc1tlXT1lO24uZGljdGlvbmFyeUxlbmd0aHNbZV09MX10aGlzLmx6d1N0YXRlPW59cmVhZEJpdHMoZSl7bGV0IHQ9dGhpcy5iaXRzQ2FjaGVkLGE9dGhpcy5jYWNoZWREYXRhO2Zvcig7dDxlOyl7Y29uc3QgZT10aGlzLnN0ci5nZXRCeXRlKCk7aWYoLTE9PT1lKXt0aGlzLmVvZj0hMDtyZXR1cm4gbnVsbH1hPWE8PDh8ZTt0Kz04fXRoaXMuYml0c0NhY2hlZD10LT1lO3RoaXMuY2FjaGVkRGF0YT1hO3RoaXMubGFzdENvZGU9bnVsbDtyZXR1cm4gYT4+PnQmKDE8PGUpLTF9cmVhZEJsb2NrKCl7bGV0IGUsdCxhLHI9MTAyNDtjb25zdCBuPXRoaXMubHp3U3RhdGU7aWYoIW4pcmV0dXJuO2NvbnN0IGk9bi5lYXJseUNoYW5nZTtsZXQgcz1uLm5leHRDb2RlO2NvbnN0IG89bi5kaWN0aW9uYXJ5VmFsdWVzLGM9bi5kaWN0aW9uYXJ5TGVuZ3RocyxsPW4uZGljdGlvbmFyeVByZXZDb2RlcztsZXQgaD1uLmNvZGVMZW5ndGgsdT1uLnByZXZDb2RlO2NvbnN0IGQ9bi5jdXJyZW50U2VxdWVuY2U7bGV0IGY9bi5jdXJyZW50U2VxdWVuY2VMZW5ndGgsZz0wLHA9dGhpcy5idWZmZXJMZW5ndGgsbT10aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCtyKTtmb3IoZT0wO2U8NTEyO2UrKyl7Y29uc3QgZT10aGlzLnJlYWRCaXRzKGgpLG49Zj4wO2lmKGU8MjU2KXtkWzBdPWU7Zj0xfWVsc2V7aWYoIShlPj0yNTgpKXtpZigyNTY9PT1lKXtoPTk7cz0yNTg7Zj0wO2NvbnRpbnVlfXRoaXMuZW9mPSEwO2RlbGV0ZSB0aGlzLmx6d1N0YXRlO2JyZWFrfWlmKGU8cyl7Zj1jW2VdO2Zvcih0PWYtMSxhPWU7dD49MDt0LS0pe2RbdF09b1thXTthPWxbYV19fWVsc2UgZFtmKytdPWRbMF19aWYobil7bFtzXT11O2Nbc109Y1t1XSsxO29bc109ZFswXTtzKys7aD1zK2kmcytpLTE/aDowfE1hdGgubWluKE1hdGgubG9nKHMraSkvLjY5MzE0NzE4MDU1OTk0NTMrMSwxMil9dT1lO2crPWY7aWYocjxnKXtkb3tyKz01MTJ9d2hpbGUocjxnKTttPXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoK3IpfWZvcih0PTA7dDxmO3QrKyltW3ArK109ZFt0XX1uLm5leHRDb2RlPXM7bi5jb2RlTGVuZ3RoPWg7bi5wcmV2Q29kZT11O24uY3VycmVudFNlcXVlbmNlTGVuZ3RoPWY7dGhpcy5idWZmZXJMZW5ndGg9cH19dC5MWldTdHJlYW09TFpXU3RyZWFtfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlByZWRpY3RvclN0cmVhbT12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO3ZhciByPWEoMTY4KSxuPWEoMTUwKSxpPWEoMTQ0KTtjbGFzcyBQcmVkaWN0b3JTdHJlYW0gZXh0ZW5kcyByLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIodCk7aWYoIShhIGluc3RhbmNlb2Ygbi5EaWN0KSlyZXR1cm4gZTtjb25zdCByPXRoaXMucHJlZGljdG9yPWEuZ2V0KCJQcmVkaWN0b3IiKXx8MTtpZihyPD0xKXJldHVybiBlO2lmKDIhPT1yJiYocjwxMHx8cj4xNSkpdGhyb3cgbmV3IGkuRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHByZWRpY3RvcjogJHtyfWApO3RoaXMucmVhZEJsb2NrPTI9PT1yP3RoaXMucmVhZEJsb2NrVGlmZjp0aGlzLnJlYWRCbG9ja1BuZzt0aGlzLnN0cj1lO3RoaXMuZGljdD1lLmRpY3Q7Y29uc3Qgcz10aGlzLmNvbG9ycz1hLmdldCgiQ29sb3JzIil8fDEsbz10aGlzLmJpdHM9YS5nZXQoIkJQQyIsIkJpdHNQZXJDb21wb25lbnQiKXx8OCxjPXRoaXMuY29sdW1ucz1hLmdldCgiQ29sdW1ucyIpfHwxO3RoaXMucGl4Qnl0ZXM9cypvKzc+PjM7dGhpcy5yb3dCeXRlcz1jKnMqbys3Pj4zO3JldHVybiB0aGlzfXJlYWRCbG9ja1RpZmYoKXtjb25zdCBlPXRoaXMucm93Qnl0ZXMsdD10aGlzLmJ1ZmZlckxlbmd0aCxhPXRoaXMuZW5zdXJlQnVmZmVyKHQrZSkscj10aGlzLmJpdHMsbj10aGlzLmNvbG9ycyxpPXRoaXMuc3RyLmdldEJ5dGVzKGUpO3RoaXMuZW9mPSFpLmxlbmd0aDtpZih0aGlzLmVvZilyZXR1cm47bGV0IHMsbz0wLGM9MCxsPTAsaD0wLHU9dDtpZigxPT09ciYmMT09PW4pZm9yKHM9MDtzPGU7KytzKXtsZXQgZT1pW3NdXm87ZV49ZT4+MTtlXj1lPj4yO2VePWU+PjQ7bz0oMSZlKTw8NzthW3UrK109ZX1lbHNlIGlmKDg9PT1yKXtmb3Iocz0wO3M8bjsrK3MpYVt1KytdPWlbc107Zm9yKDtzPGU7KytzKXthW3VdPWFbdS1uXStpW3NdO3UrK319ZWxzZSBpZigxNj09PXIpe2NvbnN0IHQ9MipuO2ZvcihzPTA7czx0OysrcylhW3UrK109aVtzXTtmb3IoO3M8ZTtzKz0yKXtjb25zdCBlPSgoMjU1Jmlbc10pPDw4KSsoMjU1JmlbcysxXSkrKCgyNTUmYVt1LXRdKTw8OCkrKDI1NSZhW3UtdCsxXSk7YVt1KytdPWU+PjgmMjU1O2FbdSsrXT0yNTUmZX19ZWxzZXtjb25zdCBlPW5ldyBVaW50OEFycmF5KG4rMSksdT0oMTw8ciktMTtsZXQgZD0wLGY9dDtjb25zdCBnPXRoaXMuY29sdW1ucztmb3Iocz0wO3M8ZzsrK3MpZm9yKGxldCB0PTA7dDxuOysrdCl7aWYobDxyKXtvPW88PDh8MjU1JmlbZCsrXTtsKz04fWVbdF09ZVt0XSsobz4+bC1yKSZ1O2wtPXI7Yz1jPDxyfGVbdF07aCs9cjtpZihoPj04KXthW2YrK109Yz4+aC04JjI1NTtoLT04fX1oPjAmJihhW2YrK109KGM8PDgtaCkrKG8mKDE8PDgtaCktMSkpfXRoaXMuYnVmZmVyTGVuZ3RoKz1lfXJlYWRCbG9ja1BuZygpe2NvbnN0IGU9dGhpcy5yb3dCeXRlcyx0PXRoaXMucGl4Qnl0ZXMsYT10aGlzLnN0ci5nZXRCeXRlKCkscj10aGlzLnN0ci5nZXRCeXRlcyhlKTt0aGlzLmVvZj0hci5sZW5ndGg7aWYodGhpcy5lb2YpcmV0dXJuO2NvbnN0IG49dGhpcy5idWZmZXJMZW5ndGgscz10aGlzLmVuc3VyZUJ1ZmZlcihuK2UpO2xldCBvPXMuc3ViYXJyYXkobi1lLG4pOzA9PT1vLmxlbmd0aCYmKG89bmV3IFVpbnQ4QXJyYXkoZSkpO2xldCBjLGwsaCx1PW47c3dpdGNoKGEpe2Nhc2UgMDpmb3IoYz0wO2M8ZTsrK2Mpc1t1KytdPXJbY107YnJlYWs7Y2FzZSAxOmZvcihjPTA7Yzx0OysrYylzW3UrK109cltjXTtmb3IoO2M8ZTsrK2Mpe3NbdV09c1t1LXRdK3JbY10mMjU1O3UrK31icmVhaztjYXNlIDI6Zm9yKGM9MDtjPGU7KytjKXNbdSsrXT1vW2NdK3JbY10mMjU1O2JyZWFrO2Nhc2UgMzpmb3IoYz0wO2M8dDsrK2Mpc1t1KytdPShvW2NdPj4xKStyW2NdO2Zvcig7YzxlOysrYyl7c1t1XT0ob1tjXStzW3UtdF0+PjEpK3JbY10mMjU1O3UrK31icmVhaztjYXNlIDQ6Zm9yKGM9MDtjPHQ7KytjKXtsPW9bY107aD1yW2NdO3NbdSsrXT1sK2h9Zm9yKDtjPGU7KytjKXtsPW9bY107Y29uc3QgZT1vW2MtdF0sYT1zW3UtdF0sbj1hK2wtZTtsZXQgaT1uLWE7aTwwJiYoaT0taSk7bGV0IGQ9bi1sO2Q8MCYmKGQ9LWQpO2xldCBmPW4tZTtmPDAmJihmPS1mKTtoPXJbY107c1t1KytdPWk8PWQmJmk8PWY/YStoOmQ8PWY/bCtoOmUraH1icmVhaztkZWZhdWx0OnRocm93IG5ldyBpLkZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICR7YX1gKX10aGlzLmJ1ZmZlckxlbmd0aCs9ZX19dC5QcmVkaWN0b3JTdHJlYW09UHJlZGljdG9yU3RyZWFtfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlJ1bkxlbmd0aFN0cmVhbT12b2lkIDA7dmFyIHI9YSgxNjgpO2NsYXNzIFJ1bkxlbmd0aFN0cmVhbSBleHRlbmRzIHIuRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIodCk7dGhpcy5zdHI9ZTt0aGlzLmRpY3Q9ZS5kaWN0fXJlYWRCbG9jaygpe2NvbnN0IGU9dGhpcy5zdHIuZ2V0Qnl0ZXMoMik7aWYoIWV8fGUubGVuZ3RoPDJ8fDEyOD09PWVbMF0pe3RoaXMuZW9mPSEwO3JldHVybn1sZXQgdCxhPXRoaXMuYnVmZmVyTGVuZ3RoLHI9ZVswXTtpZihyPDEyOCl7dD10aGlzLmVuc3VyZUJ1ZmZlcihhK3IrMSk7dFthKytdPWVbMV07aWYocj4wKXtjb25zdCBlPXRoaXMuc3RyLmdldEJ5dGVzKHIpO3Quc2V0KGUsYSk7YSs9cn19ZWxzZXtyPTI1Ny1yO2NvbnN0IG49ZVsxXTt0PXRoaXMuZW5zdXJlQnVmZmVyKGErcisxKTtmb3IobGV0IGU9MDtlPHI7ZSsrKXRbYSsrXT1ufXRoaXMuYnVmZmVyTGVuZ3RoPWF9fXQuUnVuTGVuZ3RoU3RyZWFtPVJ1bkxlbmd0aFN0cmVhbX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5Gb250PXQuRXJyb3JGb250PXZvaWQgMDthKDExNik7YSgxMjYpO2EoMTI4KTthKDEzMSk7YSgxMzMpO2EoMTM1KTthKDEzNyk7YSgxMzkpO2EoMTU3KTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7dmFyIHI9YSgxNDQpLG49YSgxODUpLGk9YSgxODgpLHM9YSgxOTApLG89YSgxODkpLGM9YSgxODcpLGw9YSgxOTEpLGg9YSgxOTIpLHU9YSgxOTMpLGQ9YSgxOTQpLGY9YSgxOTUpLGc9YSgxOTYpLHA9YSgxNjQpLG09YSgxOTcpLGI9YSgxNDkpLHk9YSgxNTQpLHc9YSgxOTgpO2NvbnN0IFM9W1s1NzM0NCw2Mzc0M10sWzEwNDg1NzYsMTExNDEwOV1dLHg9MWUzLEM9WyJhc2NlbnQiLCJiYm94IiwiYmxhY2siLCJib2xkIiwiY2hhclByb2NPcGVyYXRvckxpc3QiLCJjb21wb3NpdGUiLCJjc3NGb250SW5mbyIsImRhdGEiLCJkZWZhdWx0Vk1ldHJpY3MiLCJkZWZhdWx0V2lkdGgiLCJkZXNjZW50IiwiZmFsbGJhY2tOYW1lIiwiZm9udE1hdHJpeCIsImlzSW52YWxpZFBERmpzRm9udCIsImlzVHlwZTNGb250IiwiaXRhbGljIiwibG9hZGVkTmFtZSIsIm1pbWV0eXBlIiwibWlzc2luZ0ZpbGUiLCJuYW1lIiwicmVtZWFzdXJlIiwic3VidHlwZSIsInN5c3RlbUZvbnRJbmZvIiwidHlwZSIsInZlcnRpY2FsIl0sdj1bImNNYXAiLCJkZWZhdWx0RW5jb2RpbmciLCJkaWZmZXJlbmNlcyIsImlzTW9ub3NwYWNlIiwiaXNTZXJpZkZvbnQiLCJpc1N5bWJvbGljRm9udCIsInNlYWNNYXAiLCJ0b0ZvbnRDaGFyIiwidG9Vbmljb2RlIiwidm1ldHJpY3MiLCJ3aWR0aHMiXTtmdW5jdGlvbiBhZGp1c3RXaWR0aHMoZSl7aWYoIWUuZm9udE1hdHJpeClyZXR1cm47aWYoZS5mb250TWF0cml4WzBdPT09ci5GT05UX0lERU5USVRZX01BVFJJWFswXSlyZXR1cm47Y29uc3QgdD0uMDAxL2UuZm9udE1hdHJpeFswXSxhPWUud2lkdGhzO2Zvcihjb25zdCBlIGluIGEpYVtlXSo9dDtlLmRlZmF1bHRXaWR0aCo9dH1mdW5jdGlvbiBhbWVuZEZhbGxiYWNrVG9Vbmljb2RlKGUpe2lmKCFlLmZhbGxiYWNrVG9Vbmljb2RlKXJldHVybjtpZihlLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXApcmV0dXJuO2NvbnN0IHQ9W107Zm9yKGNvbnN0IGEgaW4gZS5mYWxsYmFja1RvVW5pY29kZSllLnRvVW5pY29kZS5oYXMoYSl8fCh0W2FdPWUuZmFsbGJhY2tUb1VuaWNvZGVbYV0pO3QubGVuZ3RoPjAmJmUudG9Vbmljb2RlLmFtZW5kKHQpfWNsYXNzIEdseXBoe2NvbnN0cnVjdG9yKGUsdCxhLHIsbixpLHMsbyxjKXt0aGlzLm9yaWdpbmFsQ2hhckNvZGU9ZTt0aGlzLmZvbnRDaGFyPXQ7dGhpcy51bmljb2RlPWE7dGhpcy5hY2NlbnQ9cjt0aGlzLndpZHRoPW47dGhpcy52bWV0cmljPWk7dGhpcy5vcGVyYXRvckxpc3RJZD1zO3RoaXMuaXNTcGFjZT1vO3RoaXMuaXNJbkZvbnQ9Y31nZXQgY2F0ZWdvcnkoKXtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiY2F0ZWdvcnkiLCgwLHMuZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeSkodGhpcy51bmljb2RlKSwhMCl9fWZ1bmN0aW9uIGludDE2KGUsdCl7cmV0dXJuKGU8PDgpK3R9ZnVuY3Rpb24gd3JpdGVTaWduZWRJbnQxNihlLHQsYSl7ZVt0KzFdPWE7ZVt0XT1hPj4+OH1mdW5jdGlvbiBzaWduZWRJbnQxNihlLHQpe2NvbnN0IGE9KGU8PDgpK3Q7cmV0dXJuIDMyNzY4JmE/YS02NTUzNjphfWZ1bmN0aW9uIHN0cmluZzE2KGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGU+PjgmMjU1LDI1NSZlKX1mdW5jdGlvbiBzYWZlU3RyaW5nMTYoZSl7ZT4zMjc2Nz9lPTMyNzY3OmU8LTMyNzY4JiYoZT0tMzI3NjgpO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGU+PjgmMjU1LDI1NSZlKX1mdW5jdGlvbiBpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZSl7Y29uc3QgdD1lLnBlZWtCeXRlcyg0KTtyZXR1cm4idHRjZiI9PT0oMCxyLmJ5dGVzVG9TdHJpbmcpKHQpfWZ1bmN0aW9uIGdldEZvbnRGaWxlVHlwZShlLHQpe2xldCBhLG4se3R5cGU6aSxzdWJ0eXBlOnMsY29tcG9zaXRlOm99PXQ7aWYoZnVuY3Rpb24gaXNUcnVlVHlwZUZpbGUoZSl7Y29uc3QgdD1lLnBlZWtCeXRlcyg0KTtyZXR1cm4gNjU1MzY9PT0oMCxiLnJlYWRVaW50MzIpKHQsMCl8fCJ0cnVlIj09PSgwLHIuYnl0ZXNUb1N0cmluZykodCl9KGUpfHxpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZSkpYT1vPyJDSURGb250VHlwZTIiOiJUcnVlVHlwZSI7ZWxzZSBpZihmdW5jdGlvbiBpc09wZW5UeXBlRmlsZShlKXtjb25zdCB0PWUucGVla0J5dGVzKDQpO3JldHVybiJPVFRPIj09PSgwLHIuYnl0ZXNUb1N0cmluZykodCl9KGUpKWE9bz8iQ0lERm9udFR5cGUyIjoiT3BlblR5cGUiO2Vsc2UgaWYoZnVuY3Rpb24gaXNUeXBlMUZpbGUoZSl7Y29uc3QgdD1lLnBlZWtCeXRlcygyKTtyZXR1cm4gMzc9PT10WzBdJiYzMz09PXRbMV18fDEyOD09PXRbMF0mJjE9PT10WzFdfShlKSlhPW8/IkNJREZvbnRUeXBlMCI6Ik1NVHlwZTEiPT09aT8iTU1UeXBlMSI6IlR5cGUxIjtlbHNlIGlmKGZ1bmN0aW9uIGlzQ0ZGRmlsZShlKXtjb25zdCB0PWUucGVla0J5dGVzKDQpO3JldHVybiB0WzBdPj0xJiZ0WzNdPj0xJiZ0WzNdPD00fShlKSlpZihvKXthPSJDSURGb250VHlwZTAiO249IkNJREZvbnRUeXBlMEMifWVsc2V7YT0iTU1UeXBlMSI9PT1pPyJNTVR5cGUxIjoiVHlwZTEiO249IlR5cGUxQyJ9ZWxzZXsoMCxyLndhcm4pKCJnZXRGb250RmlsZVR5cGU6IFVuYWJsZSB0byBkZXRlY3QgY29ycmVjdCBmb250IGZpbGUgVHlwZS9TdWJ0eXBlLiIpO2E9aTtuPXN9cmV0dXJuW2Esbl19ZnVuY3Rpb24gYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChlLHQpe2Zvcihjb25zdCBhIGluIHQpZVsrYV09dFthXX1mdW5jdGlvbiBidWlsZFRvRm9udENoYXIoZSx0LGEpe2NvbnN0IHI9W107bGV0IG47Zm9yKGxldCBhPTAsaT1lLmxlbmd0aDthPGk7YSsrKXtuPSgwLHMuZ2V0VW5pY29kZUZvckdseXBoKShlW2FdLHQpOy0xIT09biYmKHJbYV09bil9Zm9yKGNvbnN0IGUgaW4gYSl7bj0oMCxzLmdldFVuaWNvZGVGb3JHbHlwaCkoYVtlXSx0KTstMSE9PW4mJihyWytlXT1uKX1yZXR1cm4gcn1mdW5jdGlvbiBpc01hY05hbWVSZWNvcmQoZSl7cmV0dXJuIDE9PT1lLnBsYXRmb3JtJiYwPT09ZS5lbmNvZGluZyYmMD09PWUubGFuZ3VhZ2V9ZnVuY3Rpb24gaXNXaW5OYW1lUmVjb3JkKGUpe3JldHVybiAzPT09ZS5wbGF0Zm9ybSYmMT09PWUuZW5jb2RpbmcmJjEwMzM9PT1lLmxhbmd1YWdlfWZ1bmN0aW9uIGNvbnZlcnRDaWRTdHJpbmcoZSx0KXtsZXQgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybiB0LmNoYXJDb2RlQXQoMCk7Y2FzZSAyOnJldHVybiB0LmNoYXJDb2RlQXQoMCk8PDh8dC5jaGFyQ29kZUF0KDEpfWNvbnN0IG49YFVuc3VwcG9ydGVkIENJRCBzdHJpbmcgKGNoYXJDb2RlICR7ZX0pOiAiJHt0fSIuYDtpZihhKXRocm93IG5ldyByLkZvcm1hdEVycm9yKG4pOygwLHIud2Fybikobik7cmV0dXJuIHR9ZnVuY3Rpb24gYWRqdXN0TWFwcGluZyhlLHQsYSxuKXtjb25zdCBpPU9iamVjdC5jcmVhdGUobnVsbCkscz1uZXcgTWFwLG89W10sYz1uZXcgU2V0O2xldCBsPTA7bGV0IGg9U1tsXVswXSx1PVNbbF1bMV07Zm9yKGxldCBmIGluIGUpe2Z8PTA7bGV0IGc9ZVtmXTtpZighdChnKSljb250aW51ZTtpZihoPnUpe2wrKztpZihsPj1TLmxlbmd0aCl7KDAsci53YXJuKSgiUmFuIG91dCBvZiBzcGFjZSBpbiBmb250IHByaXZhdGUgdXNlIGFyZWEuIik7YnJlYWt9aD1TW2xdWzBdO3U9U1tsXVsxXX1jb25zdCBwPWgrKzswPT09ZyYmKGc9YSk7bGV0IG09bi5nZXQoZik7InN0cmluZyI9PXR5cGVvZiBtJiYobT1tLmNvZGVQb2ludEF0KDApKTtpZihtJiYhKGQ9bSxTWzBdWzBdPD1kJiZkPD1TWzBdWzFdfHxTWzFdWzBdPD1kJiZkPD1TWzFdWzFdKSYmIWMuaGFzKGcpKXtzLnNldChtLGcpO2MuYWRkKGcpfWlbcF09ZztvW2ZdPXB9dmFyIGQ7cmV0dXJue3RvRm9udENoYXI6byxjaGFyQ29kZVRvR2x5cGhJZDppLHRvVW5pY29kZUV4dHJhTWFwOnMsbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZTpofX1mdW5jdGlvbiBjcmVhdGVDbWFwVGFibGUoZSx0LGEpe2NvbnN0IG49ZnVuY3Rpb24gZ2V0UmFuZ2VzKGUsdCxhKXtjb25zdCByPVtdO2Zvcihjb25zdCB0IGluIGUpZVt0XT49YXx8ci5wdXNoKHtmb250Q2hhckNvZGU6MHx0LGdseXBoSWQ6ZVt0XX0pO2lmKHQpZm9yKGNvbnN0W2Usbl1vZiB0KW4+PWF8fHIucHVzaCh7Zm9udENoYXJDb2RlOmUsZ2x5cGhJZDpufSk7MD09PXIubGVuZ3RoJiZyLnB1c2goe2ZvbnRDaGFyQ29kZTowLGdseXBoSWQ6MH0pO3Iuc29ydCgoZnVuY3Rpb24gZm9udEdldFJhbmdlc1NvcnQoZSx0KXtyZXR1cm4gZS5mb250Q2hhckNvZGUtdC5mb250Q2hhckNvZGV9KSk7Y29uc3Qgbj1bXSxpPXIubGVuZ3RoO2ZvcihsZXQgZT0wO2U8aTspe2NvbnN0IHQ9cltlXS5mb250Q2hhckNvZGUsYT1bcltlXS5nbHlwaElkXTsrK2U7bGV0IHM9dDtmb3IoO2U8aSYmcysxPT09cltlXS5mb250Q2hhckNvZGU7KXthLnB1c2gocltlXS5nbHlwaElkKTsrK3M7KytlO2lmKDY1NTM1PT09cylicmVha31uLnB1c2goW3QscyxhXSl9cmV0dXJuIG59KGUsdCxhKSxpPW4uYXQoLTEpWzFdPjY1NTM1PzI6MTtsZXQgcyxvLGMsbCxoPSJcMFwwIitzdHJpbmcxNihpKSsiXDADXDABIisoMCxyLnN0cmluZzMyKSg0KzgqaSk7Zm9yKHM9bi5sZW5ndGgtMTtzPj0wJiYhKG5bc11bMF08PTY1NTM1KTstLXMpO2NvbnN0IHU9cysxO25bc11bMF08NjU1MzUmJjY1NTM1PT09bltzXVsxXSYmKG5bc11bMV09NjU1MzQpO2NvbnN0IGQ9bltzXVsxXTw2NTUzNT8xOjAsZj11K2QsZz1tLk9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKGYsMik7bGV0IHAsYix5LHcsUz0iIix4PSIiLEM9IiIsdj0iIixrPSIiLE89MDtmb3Iocz0wLG89dTtzPG87cysrKXtwPW5bc107Yj1wWzBdO3k9cFsxXTtTKz1zdHJpbmcxNihiKTt4Kz1zdHJpbmcxNih5KTt3PXBbMl07bGV0IGU9ITA7Zm9yKGM9MSxsPXcubGVuZ3RoO2M8bDsrK2MpaWYod1tjXSE9PXdbYy0xXSsxKXtlPSExO2JyZWFrfWlmKGUpe0MrPXN0cmluZzE2KHdbMF0tYiY2NTUzNSk7dis9c3RyaW5nMTYoMCl9ZWxzZXtjb25zdCBlPTIqKGYtcykrMipPO08rPXktYisxO0MrPXN0cmluZzE2KDApO3YrPXN0cmluZzE2KGUpO2ZvcihjPTAsbD13Lmxlbmd0aDtjPGw7KytjKWsrPXN0cmluZzE2KHdbY10pfX1pZihkPjApe3grPSLDv8O/IjtTKz0iw7/DvyI7Qys9IlwwASI7dis9IlwwXDAifWNvbnN0IFQ9IlwwXDAiK3N0cmluZzE2KDIqZikrc3RyaW5nMTYoZy5yYW5nZSkrc3RyaW5nMTYoZy5lbnRyeSkrc3RyaW5nMTYoZy5yYW5nZVNoaWZ0KSt4KyJcMFwwIitTK0MrditrO2xldCBNPSIiLEU9IiI7aWYoaT4xKXtoKz0iXDADXDBcbiIrKDAsci5zdHJpbmczMikoNCs4KmkrNCtULmxlbmd0aCk7TT0iIjtmb3Iocz0wLG89bi5sZW5ndGg7czxvO3MrKyl7cD1uW3NdO2I9cFswXTt3PXBbMl07bGV0IGU9d1swXTtmb3IoYz0xLGw9dy5sZW5ndGg7YzxsOysrYylpZih3W2NdIT09d1tjLTFdKzEpe3k9cFswXStjLTE7TSs9KDAsci5zdHJpbmczMikoYikrKDAsci5zdHJpbmczMikoeSkrKDAsci5zdHJpbmczMikoZSk7Yj15KzE7ZT13W2NdfU0rPSgwLHIuc3RyaW5nMzIpKGIpKygwLHIuc3RyaW5nMzIpKHBbMV0pKygwLHIuc3RyaW5nMzIpKGUpfUU9IlwwXGZcMFwwIisoMCxyLnN0cmluZzMyKShNLmxlbmd0aCsxNikrIlwwXDBcMFwwIisoMCxyLnN0cmluZzMyKShNLmxlbmd0aC8xMil9cmV0dXJuIGgrIlwwBCIrc3RyaW5nMTYoVC5sZW5ndGgrNCkrVCtFK019ZnVuY3Rpb24gY3JlYXRlT1MyVGFibGUoZSx0LGEpe2F8fD17dW5pdHNQZXJFbTowLHlNYXg6MCx5TWluOjAsYXNjZW50OjAsZGVzY2VudDowfTtsZXQgbj0wLGk9MCxvPTAsYz0wLGw9bnVsbCxoPTAsdT0tMTtpZih0KXtmb3IobGV0IGUgaW4gdCl7ZXw9MDsobD5lfHwhbCkmJihsPWUpO2g8ZSYmKGg9ZSk7dT0oMCxzLmdldFVuaWNvZGVSYW5nZUZvcikoZSx1KTtpZih1PDMyKW58PTE8PHU7ZWxzZSBpZih1PDY0KWl8PTE8PHUtMzI7ZWxzZSBpZih1PDk2KW98PTE8PHUtNjQ7ZWxzZXtpZighKHU8MTIzKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiVW5pY29kZSByYW5nZXMgQml0cyA+IDEyMyBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlIik7Y3w9MTw8dS05Nn19aD42NTUzNSYmKGg9NjU1MzUpfWVsc2V7bD0wO2g9MjU1fWNvbnN0IGQ9ZS5iYm94fHxbMCwwLDAsMF0sZj1hLnVuaXRzUGVyRW18fDEvKGUuZm9udE1hdHJpeHx8ci5GT05UX0lERU5USVRZX01BVFJJWClbMF0sZz1lLmFzY2VudFNjYWxlZD8xOmYveCxwPWEuYXNjZW50fHxNYXRoLnJvdW5kKGcqKGUuYXNjZW50fHxkWzNdKSk7bGV0IG09YS5kZXNjZW50fHxNYXRoLnJvdW5kKGcqKGUuZGVzY2VudHx8ZFsxXSkpO20+MCYmZS5kZXNjZW50PjAmJmRbMV08MCYmKG09LW0pO2NvbnN0IGI9YS55TWF4fHxwLHk9LWEueU1pbnx8LW07cmV0dXJuIlwwAwIkAcO0XDAFXDBcMALCigLCu1wwXDBcMMKMAsKKAsK7XDBcMAHDn1x4MDAxAQJcMFwwXDBcMAYiK1N0cmluZy5mcm9tQ2hhckNvZGUoZS5maXhlZFBpdGNoPzk6MCkrIlwwXDBcMFwwXDBcMCIrKDAsci5zdHJpbmczMikobikrKDAsci5zdHJpbmczMikoaSkrKDAsci5zdHJpbmczMikobykrKDAsci5zdHJpbmczMikoYykrIioyMSoiK3N0cmluZzE2KGUuaXRhbGljQW5nbGU/MTowKStzdHJpbmcxNihsfHxlLmZpcnN0Q2hhcikrc3RyaW5nMTYoaHx8ZS5sYXN0Q2hhcikrc3RyaW5nMTYocCkrc3RyaW5nMTYobSkrIlwwZCIrc3RyaW5nMTYoYikrc3RyaW5nMTYoeSkrIlwwXDBcMFwwXDBcMFwwXDAiK3N0cmluZzE2KGUueEhlaWdodCkrc3RyaW5nMTYoZS5jYXBIZWlnaHQpK3N0cmluZzE2KDApK3N0cmluZzE2KGx8fGUuZmlyc3RDaGFyKSsiXDADIn1mdW5jdGlvbiBjcmVhdGVQb3N0VGFibGUoZSl7Y29uc3QgdD1NYXRoLmZsb29yKDY1NTM2KmUuaXRhbGljQW5nbGUpO3JldHVybiJcMANcMFwwIisoMCxyLnN0cmluZzMyKSh0KSsiXDBcMFwwXDAiKygwLHIuc3RyaW5nMzIpKGUuZml4ZWRQaXRjaD8xOjApKyJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCJ9ZnVuY3Rpb24gY3JlYXRlUG9zdHNjcmlwdE5hbWUoZSl7cmV0dXJuIGUucmVwbGFjZUFsbCgvW15ceDIxLVx4N0VdfFtbXF0oKXt9PD4vJV0vZywiIikuc2xpY2UoMCw2Myl9ZnVuY3Rpb24gY3JlYXRlTmFtZVRhYmxlKGUsdCl7dHx8KHQ9W1tdLFtdXSk7Y29uc3QgYT1bdFswXVswXXx8Ik9yaWdpbmFsIGxpY2VuY2UiLHRbMF1bMV18fGUsdFswXVsyXXx8IlVua25vd24iLHRbMF1bM118fCJ1bmlxdWVJRCIsdFswXVs0XXx8ZSx0WzBdWzVdfHwiVmVyc2lvbiAwLjExIix0WzBdWzZdfHxjcmVhdGVQb3N0c2NyaXB0TmFtZShlKSx0WzBdWzddfHwiVW5rbm93biIsdFswXVs4XXx8IlVua25vd24iLHRbMF1bOV18fCJVbmtub3duIl0scj1bXTtsZXQgbixpLHMsbyxjO2ZvcihuPTAsaT1hLmxlbmd0aDtuPGk7bisrKXtjPXRbMV1bbl18fGFbbl07Y29uc3QgZT1bXTtmb3Iocz0wLG89Yy5sZW5ndGg7czxvO3MrKyllLnB1c2goc3RyaW5nMTYoYy5jaGFyQ29kZUF0KHMpKSk7ci5wdXNoKGUuam9pbigiIikpfWNvbnN0IGw9W2Escl0saD1bIlwwASIsIlwwAyJdLHU9WyJcMFwwIiwiXDABIl0sZD1bIlwwXDAiLCIEXHQiXSxmPWEubGVuZ3RoKmgubGVuZ3RoO2xldCBnPSJcMFwwIitzdHJpbmcxNihmKStzdHJpbmcxNigxMipmKzYpLHA9MDtmb3Iobj0wLGk9aC5sZW5ndGg7bjxpO24rKyl7Y29uc3QgZT1sW25dO2ZvcihzPTAsbz1lLmxlbmd0aDtzPG87cysrKXtjPWVbc107Zys9aFtuXSt1W25dK2Rbbl0rc3RyaW5nMTYocykrc3RyaW5nMTYoYy5sZW5ndGgpK3N0cmluZzE2KHApO3ArPWMubGVuZ3RofX1nKz1hLmpvaW4oIiIpK3Iuam9pbigiIik7cmV0dXJuIGd9dC5Gb250PWNsYXNzIEZvbnR7Y29uc3RydWN0b3IoZSx0LGEpe3RoaXMubmFtZT1lO3RoaXMucHNOYW1lPW51bGw7dGhpcy5taW1ldHlwZT1udWxsO3RoaXMuZGlzYWJsZUZvbnRGYWNlPSExO3RoaXMubG9hZGVkTmFtZT1hLmxvYWRlZE5hbWU7dGhpcy5pc1R5cGUzRm9udD1hLmlzVHlwZTNGb250O3RoaXMubWlzc2luZ0ZpbGU9ITE7dGhpcy5jc3NGb250SW5mbz1hLmNzc0ZvbnRJbmZvO3RoaXMuX2NoYXJzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLl9nbHlwaENhY2hlPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IG49ISEoYS5mbGFncyZpLkZvbnRGbGFncy5TZXJpZik7aWYoIW4mJiFhLmlzU2ltdWxhdGVkRmxhZ3Mpe2NvbnN0IHQ9ZS5yZXBsYWNlQWxsKC9bLF9dL2csIi0iKS5zcGxpdCgiLSIpWzBdLGE9KDAsbC5nZXRTZXJpZkZvbnRzKSgpO2Zvcihjb25zdCBlIG9mIHQuc3BsaXQoIisiKSlpZihhW2VdKXtuPSEwO2JyZWFrfX10aGlzLmlzU2VyaWZGb250PW47dGhpcy5pc1N5bWJvbGljRm9udD0hIShhLmZsYWdzJmkuRm9udEZsYWdzLlN5bWJvbGljKTt0aGlzLmlzTW9ub3NwYWNlPSEhKGEuZmxhZ3MmaS5Gb250RmxhZ3MuRml4ZWRQaXRjaCk7bGV0e3R5cGU6cyxzdWJ0eXBlOm99PWE7dGhpcy50eXBlPXM7dGhpcy5zdWJ0eXBlPW87dGhpcy5zeXN0ZW1Gb250SW5mbz1hLnN5c3RlbUZvbnRJbmZvO2NvbnN0IGM9ZS5tYXRjaCgvXkludmFsaWRQREZqc0ZvbnRfKC4qKV9cZCskLyk7dGhpcy5pc0ludmFsaWRQREZqc0ZvbnQ9ISFjO3RoaXMuaXNJbnZhbGlkUERGanNGb250P3RoaXMuZmFsbGJhY2tOYW1lPWNbMV06dGhpcy5pc01vbm9zcGFjZT90aGlzLmZhbGxiYWNrTmFtZT0ibW9ub3NwYWNlIjp0aGlzLmlzU2VyaWZGb250P3RoaXMuZmFsbGJhY2tOYW1lPSJzZXJpZiI6dGhpcy5mYWxsYmFja05hbWU9InNhbnMtc2VyaWYiO2lmKHRoaXMuc3lzdGVtRm9udEluZm8/Lmd1ZXNzRmFsbGJhY2spe3RoaXMuc3lzdGVtRm9udEluZm8uZ3Vlc3NGYWxsYmFjaz0hMTt0aGlzLnN5c3RlbUZvbnRJbmZvLmNzcys9YCwke3RoaXMuZmFsbGJhY2tOYW1lfWB9dGhpcy5kaWZmZXJlbmNlcz1hLmRpZmZlcmVuY2VzO3RoaXMud2lkdGhzPWEud2lkdGhzO3RoaXMuZGVmYXVsdFdpZHRoPWEuZGVmYXVsdFdpZHRoO3RoaXMuY29tcG9zaXRlPWEuY29tcG9zaXRlO3RoaXMuY01hcD1hLmNNYXA7dGhpcy5jYXBIZWlnaHQ9YS5jYXBIZWlnaHQveDt0aGlzLmFzY2VudD1hLmFzY2VudC94O3RoaXMuZGVzY2VudD1hLmRlc2NlbnQveDt0aGlzLmxpbmVIZWlnaHQ9dGhpcy5hc2NlbnQtdGhpcy5kZXNjZW50O3RoaXMuZm9udE1hdHJpeD1hLmZvbnRNYXRyaXg7dGhpcy5iYm94PWEuYmJveDt0aGlzLmRlZmF1bHRFbmNvZGluZz1hLmRlZmF1bHRFbmNvZGluZzt0aGlzLnRvVW5pY29kZT1hLnRvVW5pY29kZTt0aGlzLnRvRm9udENoYXI9W107aWYoIlR5cGUzIj09PWEudHlwZSl7Zm9yKGxldCBlPTA7ZTwyNTY7ZSsrKXRoaXMudG9Gb250Q2hhcltlXT10aGlzLmRpZmZlcmVuY2VzW2VdfHxhLmRlZmF1bHRFbmNvZGluZ1tlXTtyZXR1cm59dGhpcy5jaWRFbmNvZGluZz1hLmNpZEVuY29kaW5nfHwiIjt0aGlzLnZlcnRpY2FsPSEhYS52ZXJ0aWNhbDtpZih0aGlzLnZlcnRpY2FsKXt0aGlzLnZtZXRyaWNzPWEudm1ldHJpY3M7dGhpcy5kZWZhdWx0Vk1ldHJpY3M9YS5kZWZhdWx0Vk1ldHJpY3N9aWYoIXR8fHQuaXNFbXB0eSl7dCYmKDAsci53YXJuKSgnRm9udCBmaWxlIGlzIGVtcHR5IGluICInK2UrJyIgKCcrdGhpcy5sb2FkZWROYW1lKyIpIik7dGhpcy5mYWxsYmFja1RvU3lzdGVtRm9udChhKTtyZXR1cm59W3Msb109Z2V0Rm9udEZpbGVUeXBlKHQsYSk7cz09PXRoaXMudHlwZSYmbz09PXRoaXMuc3VidHlwZXx8KDAsci5pbmZvKShgSW5jb25zaXN0ZW50IGZvbnQgZmlsZSBUeXBlL1N1YlR5cGUsIGV4cGVjdGVkOiAke3RoaXMudHlwZX0vJHt0aGlzLnN1YnR5cGV9IGJ1dCBmb3VuZDogJHtzfS8ke299LmApO2xldCBoO3RyeXtzd2l0Y2gocyl7Y2FzZSJNTVR5cGUxIjooMCxyLmluZm8pKCJNTVR5cGUxIGZvbnQgKCIrZSsiKSwgZmFsbGluZyBiYWNrIHRvIFR5cGUxLiIpO2Nhc2UiVHlwZTEiOmNhc2UiQ0lERm9udFR5cGUwIjp0aGlzLm1pbWV0eXBlPSJmb250L29wZW50eXBlIjtjb25zdCBuPSJUeXBlMUMiPT09b3x8IkNJREZvbnRUeXBlMEMiPT09bz9uZXcgdS5DRkZGb250KHQsYSk6bmV3IHcuVHlwZTFGb250KGUsdCxhKTthZGp1c3RXaWR0aHMoYSk7aD10aGlzLmNvbnZlcnQoZSxuLGEpO2JyZWFrO2Nhc2UiT3BlblR5cGUiOmNhc2UiVHJ1ZVR5cGUiOmNhc2UiQ0lERm9udFR5cGUyIjp0aGlzLm1pbWV0eXBlPSJmb250L29wZW50eXBlIjtoPXRoaXMuY2hlY2tBbmRSZXBhaXIoZSx0LGEpO2lmKHRoaXMuaXNPcGVuVHlwZSl7YWRqdXN0V2lkdGhzKGEpO3M9Ik9wZW5UeXBlIn1icmVhaztkZWZhdWx0OnRocm93IG5ldyByLkZvcm1hdEVycm9yKGBGb250ICR7c30gaXMgbm90IHN1cHBvcnRlZGApfX1jYXRjaChlKXsoMCxyLndhcm4pKGUpO3RoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQoYSk7cmV0dXJufWFtZW5kRmFsbGJhY2tUb1VuaWNvZGUoYSk7dGhpcy5kYXRhPWg7dGhpcy50eXBlPXM7dGhpcy5zdWJ0eXBlPW87dGhpcy5mb250TWF0cml4PWEuZm9udE1hdHJpeDt0aGlzLndpZHRocz1hLndpZHRoczt0aGlzLmRlZmF1bHRXaWR0aD1hLmRlZmF1bHRXaWR0aDt0aGlzLnRvVW5pY29kZT1hLnRvVW5pY29kZTt0aGlzLnNlYWNNYXA9YS5zZWFjTWFwfWdldCByZW5kZXJlcigpe2NvbnN0IGU9ZC5Gb250UmVuZGVyZXJGYWN0b3J5LmNyZWF0ZSh0aGlzLGkuU0VBQ19BTkFMWVNJU19FTkFCTEVEKTtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywicmVuZGVyZXIiLGUpfWV4cG9ydERhdGEoKXtjb25zdCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF0/Wy4uLkMsLi4udl06Qyx0PU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IGEscjtmb3IoYSBvZiBlKXtyPXRoaXNbYV07dm9pZCAwIT09ciYmKHRbYV09cil9cmV0dXJuIHR9ZmFsbGJhY2tUb1N5c3RlbUZvbnQoZSl7dGhpcy5taXNzaW5nRmlsZT0hMDtjb25zdHtuYW1lOnQsdHlwZTphfT10aGlzO2xldCByPSgwLGkubm9ybWFsaXplRm9udE5hbWUpKHQpO2NvbnN0IG49KDAsbC5nZXRTdGRGb250TWFwKSgpLHU9KDAsbC5nZXROb25TdGRGb250TWFwKSgpLGQ9ISFuW3JdLGc9ISghdVtyXXx8IW5bdVtyXV0pO3I9bltyXXx8dVtyXXx8cjtjb25zdCBwPSgwLGYuZ2V0Rm9udEJhc2ljTWV0cmljcykoKVtyXTtpZihwKXtpc05hTih0aGlzLmFzY2VudCkmJih0aGlzLmFzY2VudD1wLmFzY2VudC94KTtpc05hTih0aGlzLmRlc2NlbnQpJiYodGhpcy5kZXNjZW50PXAuZGVzY2VudC94KTtpc05hTih0aGlzLmNhcEhlaWdodCkmJih0aGlzLmNhcEhlaWdodD1wLmNhcEhlaWdodC94KX10aGlzLmJvbGQ9L2JvbGQvZ2kudGVzdChyKTt0aGlzLml0YWxpYz0vb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChyKTt0aGlzLmJsYWNrPS9CbGFjay9nLnRlc3QodCk7Y29uc3QgbT0vTmFycm93L2cudGVzdCh0KTt0aGlzLnJlbWVhc3VyZT0oIWR8fG0pJiZPYmplY3Qua2V5cyh0aGlzLndpZHRocykubGVuZ3RoPjA7aWYoKGR8fGcpJiYiQ0lERm9udFR5cGUyIj09PWEmJnRoaXMuY2lkRW5jb2Rpbmcuc3RhcnRzV2l0aCgiSWRlbnRpdHktIikpe2NvbnN0IGE9ZS5jaWRUb0dpZE1hcCxyPVtdO2FwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAociwoMCxsLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSk7L0FyaWFsLT9CbGFjay9pLnRlc3QodCk/YXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChyLCgwLGwuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrKSgpKTovQ2FsaWJyaS9pLnRlc3QodCkmJmFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAociwoMCxsLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSkoKSk7aWYoYSl7Zm9yKGNvbnN0IGUgaW4gcil7Y29uc3QgdD1yW2VdO3ZvaWQgMCE9PWFbdF0mJihyWytlXT1hW3RdKX1hLmxlbmd0aCE9PXRoaXMudG9Vbmljb2RlLmxlbmd0aCYmZS5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCYmdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwJiZ0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe2NvbnN0IG49cltlXTt2b2lkIDA9PT1hW25dJiYoclsrZV09dCl9KSl9dGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwfHx0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe3JbK2VdPXR9KSk7dGhpcy50b0ZvbnRDaGFyPXI7dGhpcy50b1VuaWNvZGU9bmV3IGguVG9Vbmljb2RlTWFwKHIpfWVsc2UgaWYoL1N5bWJvbC9pLnRlc3QocikpdGhpcy50b0ZvbnRDaGFyPWJ1aWxkVG9Gb250Q2hhcihjLlN5bWJvbFNldEVuY29kaW5nLCgwLG8uZ2V0R2x5cGhzVW5pY29kZSkoKSx0aGlzLmRpZmZlcmVuY2VzKTtlbHNlIGlmKC9EaW5nYmF0cy9pLnRlc3QocikpdGhpcy50b0ZvbnRDaGFyPWJ1aWxkVG9Gb250Q2hhcihjLlphcGZEaW5nYmF0c0VuY29kaW5nLCgwLG8uZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlKSgpLHRoaXMuZGlmZmVyZW5jZXMpO2Vsc2UgaWYoZCl7Y29uc3QgZT1idWlsZFRvRm9udENoYXIodGhpcy5kZWZhdWx0RW5jb2RpbmcsKDAsby5nZXRHbHlwaHNVbmljb2RlKSgpLHRoaXMuZGlmZmVyZW5jZXMpOyJDSURGb250VHlwZTIiIT09YXx8dGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKCJJZGVudGl0eS0iKXx8dGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwfHx0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbih0LGEpe2VbK3RdPWF9KSk7dGhpcy50b0ZvbnRDaGFyPWV9ZWxzZXtjb25zdCBlPSgwLG8uZ2V0R2x5cGhzVW5pY29kZSkoKSxhPVtdO3RoaXMudG9Vbmljb2RlLmZvckVhY2goKCh0LHIpPT57aWYoIXRoaXMuY29tcG9zaXRlKXtjb25zdCBhPXRoaXMuZGlmZmVyZW5jZXNbdF18fHRoaXMuZGVmYXVsdEVuY29kaW5nW3RdLG49KDAscy5nZXRVbmljb2RlRm9yR2x5cGgpKGEsZSk7LTEhPT1uJiYocj1uKX1hWyt0XT1yfSkpO3RoaXMuY29tcG9zaXRlJiZ0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXAmJi9UYWhvbWF8VmVyZGFuYS9pLnRlc3QodCkmJmFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAoYSwoMCxsLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSk7dGhpcy50b0ZvbnRDaGFyPWF9YW1lbmRGYWxsYmFja1RvVW5pY29kZShlKTt0aGlzLmxvYWRlZE5hbWU9ci5zcGxpdCgiLSIpWzBdfWNoZWNrQW5kUmVwYWlyKGUsdCxhKXtjb25zdCBzPVsiT1MvMiIsImNtYXAiLCJoZWFkIiwiaGhlYSIsImhtdHgiLCJtYXhwIiwibmFtZSIsInBvc3QiLCJsb2NhIiwiZ2x5ZiIsImZwZ20iLCJwcmVwIiwiY3Z0ICIsIkNGRiAiXTtmdW5jdGlvbiByZWFkVGFibGVzKGUsdCl7Y29uc3QgYT1PYmplY3QuY3JlYXRlKG51bGwpO2FbIk9TLzIiXT1udWxsO2EuY21hcD1udWxsO2EuaGVhZD1udWxsO2EuaGhlYT1udWxsO2EuaG10eD1udWxsO2EubWF4cD1udWxsO2EubmFtZT1udWxsO2EucG9zdD1udWxsO2ZvcihsZXQgcj0wO3I8dDtyKyspe2NvbnN0IHQ9cmVhZFRhYmxlRW50cnkoZSk7cy5pbmNsdWRlcyh0LnRhZykmJigwIT09dC5sZW5ndGgmJihhW3QudGFnXT10KSl9cmV0dXJuIGF9ZnVuY3Rpb24gcmVhZFRhYmxlRW50cnkoZSl7Y29uc3QgdD1lLmdldFN0cmluZyg0KSxhPWUuZ2V0SW50MzIoKT4+PjAscj1lLmdldEludDMyKCk+Pj4wLG49ZS5nZXRJbnQzMigpPj4+MCxpPWUucG9zO2UucG9zPWUuc3RhcnR8fDA7ZS5za2lwKHIpO2NvbnN0IHM9ZS5nZXRCeXRlcyhuKTtlLnBvcz1pO2lmKCJoZWFkIj09PXQpe3NbOF09c1s5XT1zWzEwXT1zWzExXT0wO3NbMTddfD0zMn1yZXR1cm57dGFnOnQsY2hlY2tzdW06YSxsZW5ndGg6bixvZmZzZXQ6cixkYXRhOnN9fWZ1bmN0aW9uIHJlYWRPcGVuVHlwZUhlYWRlcihlKXtyZXR1cm57dmVyc2lvbjplLmdldFN0cmluZyg0KSxudW1UYWJsZXM6ZS5nZXRVaW50MTYoKSxzZWFyY2hSYW5nZTplLmdldFVpbnQxNigpLGVudHJ5U2VsZWN0b3I6ZS5nZXRVaW50MTYoKSxyYW5nZVNoaWZ0OmUuZ2V0VWludDE2KCl9fWZ1bmN0aW9uIHNhbml0aXplR2x5cGgoZSx0LGEscixuLGkpe2NvbnN0IHM9e2xlbmd0aDowLHNpemVPZkluc3RydWN0aW9uczowfTtpZih0PDB8fHQ+PWUubGVuZ3RofHxhPmUubGVuZ3RofHxhLXQ8PTEyKXJldHVybiBzO2NvbnN0IG89ZS5zdWJhcnJheSh0LGEpLGM9c2lnbmVkSW50MTYob1syXSxvWzNdKSxsPXNpZ25lZEludDE2KG9bNF0sb1s1XSksaD1zaWduZWRJbnQxNihvWzZdLG9bN10pLHU9c2lnbmVkSW50MTYob1s4XSxvWzldKTtpZihjPmgpe3dyaXRlU2lnbmVkSW50MTYobywyLGgpO3dyaXRlU2lnbmVkSW50MTYobyw2LGMpfWlmKGw+dSl7d3JpdGVTaWduZWRJbnQxNihvLDQsdSk7d3JpdGVTaWduZWRJbnQxNihvLDgsbCl9Y29uc3QgZD1zaWduZWRJbnQxNihvWzBdLG9bMV0pO2lmKGQ8MCl7aWYoZDwtMSlyZXR1cm4gcztyLnNldChvLG4pO3MubGVuZ3RoPW8ubGVuZ3RoO3JldHVybiBzfWxldCBmLGc9MTAscD0wO2ZvcihmPTA7ZjxkO2YrKyl7cD0ob1tnXTw8OHxvW2crMV0pKzE7Zys9Mn1jb25zdCBtPWcsYj1vW2ddPDw4fG9bZysxXTtzLnNpemVPZkluc3RydWN0aW9ucz1iO2crPTIrYjtjb25zdCB5PWc7bGV0IHc9MDtmb3IoZj0wO2Y8cDtmKyspe2NvbnN0IGU9b1tnKytdOzE5MiZlJiYob1tnLTFdPTYzJmUpO2xldCB0PTI7MiZlP3Q9MToxNiZlJiYodD0wKTtsZXQgYT0yOzQmZT9hPTE6MzImZSYmKGE9MCk7Y29uc3Qgcj10K2E7dys9cjtpZig4JmUpe2NvbnN0IGU9b1tnKytdOzA9PT1lJiYob1tnLTFdXj04KTtmKz1lO3crPWUqcn19aWYoMD09PXcpcmV0dXJuIHM7bGV0IFM9Zyt3O2lmKFM+by5sZW5ndGgpcmV0dXJuIHM7aWYoIWkmJmI+MCl7ci5zZXQoby5zdWJhcnJheSgwLG0pLG4pO3Iuc2V0KFswLDBdLG4rbSk7ci5zZXQoby5zdWJhcnJheSh5LFMpLG4rbSsyKTtTLT1iO28ubGVuZ3RoLVM+MyYmKFM9UyszJi00KTtzLmxlbmd0aD1TO3JldHVybiBzfWlmKG8ubGVuZ3RoLVM+Myl7Uz1TKzMmLTQ7ci5zZXQoby5zdWJhcnJheSgwLFMpLG4pO3MubGVuZ3RoPVM7cmV0dXJuIHN9ci5zZXQobyxuKTtzLmxlbmd0aD1vLmxlbmd0aDtyZXR1cm4gc31mdW5jdGlvbiByZWFkTmFtZVRhYmxlKGUpe2NvbnN0IGE9KHQuc3RhcnR8fDApK2Uub2Zmc2V0O3QucG9zPWE7Y29uc3Qgcj1bW10sW11dLG49W10saT1lLmxlbmd0aCxzPWEraTtpZigwIT09dC5nZXRVaW50MTYoKXx8aTw2KXJldHVybltyLG5dO2NvbnN0IG89dC5nZXRVaW50MTYoKSxjPXQuZ2V0VWludDE2KCk7bGV0IGwsaDtmb3IobD0wO2w8byYmdC5wb3MrMTI8PXM7bCsrKXtjb25zdCBlPXtwbGF0Zm9ybTp0LmdldFVpbnQxNigpLGVuY29kaW5nOnQuZ2V0VWludDE2KCksbGFuZ3VhZ2U6dC5nZXRVaW50MTYoKSxuYW1lOnQuZ2V0VWludDE2KCksbGVuZ3RoOnQuZ2V0VWludDE2KCksb2Zmc2V0OnQuZ2V0VWludDE2KCl9Oyhpc01hY05hbWVSZWNvcmQoZSl8fGlzV2luTmFtZVJlY29yZChlKSkmJm4ucHVzaChlKX1mb3IobD0wLGg9bi5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgZT1uW2xdO2lmKGUubGVuZ3RoPD0wKWNvbnRpbnVlO2NvbnN0IGk9YStjK2Uub2Zmc2V0O2lmKGkrZS5sZW5ndGg+cyljb250aW51ZTt0LnBvcz1pO2NvbnN0IG89ZS5uYW1lO2lmKGUuZW5jb2Rpbmcpe2xldCBhPSIiO2ZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrPTIpYSs9U3RyaW5nLmZyb21DaGFyQ29kZSh0LmdldFVpbnQxNigpKTtyWzFdW29dPWF9ZWxzZSByWzBdW29dPXQuZ2V0U3RyaW5nKGUubGVuZ3RoKX1yZXR1cm5bcixuXX1jb25zdCBsPVswLDAsMCwwLDAsMCwwLDAsLTIsLTIsLTIsLTIsMCwwLC0yLC01LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDAsMCwtMSwwLC0xLC0xLC0xLC0xLDEsLTEsLTk5OSwwLDEsMCwtMSwtMiwwLC0xLC0yLC0xLC0xLDAsLTEsLTEsMCwwLC05OTksLTk5OSwtMSwtMSwtMSwtMSwtMiwtOTk5LC0yLC0yLC05OTksMCwtMiwtMiwwLDAsLTIsMCwtMiwwLDAsMCwtMiwtMSwtMSwxLDEsMCwwLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDAsMCwtMSwwLC0xLC0xLDAsLTk5OSwtMSwtMSwtMSwtMSwtMSwtMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwtMiwtOTk5LC05OTksLTk5OSwtOTk5LC05OTksLTEsLTEsLTIsLTIsMCwwLDAsMCwtMSwtMSwtOTk5LC0yLC0yLDAsMCwtMSwtMiwtMiwwLDAsMCwtMSwtMSwtMSwtMl07ZnVuY3Rpb24gc2FuaXRpemVUVFByb2dyYW0oZSx0KXtsZXQgYSxuLGkscyxvLGM9ZS5kYXRhLGg9MCx1PTAsZD0wO2NvbnN0IGY9W10sZz1bXSxwPVtdO2xldCBtPXQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zLGI9ITEseT0wLHc9MDtmb3IobGV0IGU9Yy5sZW5ndGg7aDxlOyl7Y29uc3QgZT1jW2grK107aWYoNjQ9PT1lKXtuPWNbaCsrXTtpZihifHx3KWgrPW47ZWxzZSBmb3IoYT0wO2E8bjthKyspZi5wdXNoKGNbaCsrXSl9ZWxzZSBpZig2NT09PWUpe249Y1toKytdO2lmKGJ8fHcpaCs9MipuO2Vsc2UgZm9yKGE9MDthPG47YSsrKXtpPWNbaCsrXTtmLnB1c2goaTw8OHxjW2grK10pfX1lbHNlIGlmKDE3Nj09KDI0OCZlKSl7bj1lLTE3NisxO2lmKGJ8fHcpaCs9bjtlbHNlIGZvcihhPTA7YTxuO2ErKylmLnB1c2goY1toKytdKX1lbHNlIGlmKDE4ND09KDI0OCZlKSl7bj1lLTE4NCsxO2lmKGJ8fHcpaCs9MipuO2Vsc2UgZm9yKGE9MDthPG47YSsrKXtpPWNbaCsrXTtmLnB1c2goaTw8OHxjW2grK10pfX1lbHNlIGlmKDQzIT09ZXx8bSlpZig0NCE9PWV8fG0pe2lmKDQ1PT09ZSlpZihiKXtiPSExO3U9aH1lbHNle289Zy5wb3AoKTtpZighbyl7KDAsci53YXJuKSgiVFQ6IEVOREYgYmFkIHN0YWNrIik7dC5oaW50c1ZhbGlkPSExO3JldHVybn1zPXAucG9wKCk7Yz1vLmRhdGE7aD1vLmk7dC5mdW5jdGlvbnNTdGFja0RlbHRhc1tzXT1mLmxlbmd0aC1vLnN0YWNrVG9wfWVsc2UgaWYoMTM3PT09ZSl7aWYoYnx8dyl7KDAsci53YXJuKSgiVFQ6IG5lc3RlZCBJREVGcyBub3QgYWxsb3dlZCIpO209ITB9Yj0hMDtkPWh9ZWxzZSBpZig4OD09PWUpKyt5O2Vsc2UgaWYoMjc9PT1lKXc9eTtlbHNlIGlmKDg5PT09ZSl7dz09PXkmJih3PTApOy0teX1lbHNlIGlmKDI4PT09ZSYmIWImJiF3KXtjb25zdCBlPWYuYXQoLTEpO2U+MCYmKGgrPWUtMSl9fWVsc2V7aWYoYnx8dyl7KDAsci53YXJuKSgiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZCIpO209ITB9Yj0hMDtkPWg7cz1mLnBvcCgpO3QuZnVuY3Rpb25zRGVmaW5lZFtzXT17ZGF0YTpjLGk6aH19ZWxzZSBpZighYiYmIXcpe3M9Zi5hdCgtMSk7aWYoaXNOYU4ocykpKDAsci5pbmZvKSgiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpO2Vsc2V7dC5mdW5jdGlvbnNVc2VkW3NdPSEwO2lmKHMgaW4gdC5mdW5jdGlvbnNTdGFja0RlbHRhcyl7Y29uc3QgZT1mLmxlbmd0aCt0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW3NdO2lmKGU8MCl7KDAsci53YXJuKSgiVFQ6IENBTEwgaW52YWxpZCBmdW5jdGlvbnMgc3RhY2sgZGVsdGEuIik7dC5oaW50c1ZhbGlkPSExO3JldHVybn1mLmxlbmd0aD1lfWVsc2UgaWYocyBpbiB0LmZ1bmN0aW9uc0RlZmluZWQmJiFwLmluY2x1ZGVzKHMpKXtnLnB1c2goe2RhdGE6YyxpOmgsc3RhY2tUb3A6Zi5sZW5ndGgtMX0pO3AucHVzaChzKTtvPXQuZnVuY3Rpb25zRGVmaW5lZFtzXTtpZighbyl7KDAsci53YXJuKSgiVFQ6IENBTEwgbm9uLWV4aXN0ZW50IGZ1bmN0aW9uIik7dC5oaW50c1ZhbGlkPSExO3JldHVybn1jPW8uZGF0YTtoPW8uaX19fWlmKCFiJiYhdyl7bGV0IHQ9MDtlPD0xNDI/dD1sW2VdOmU+PTE5MiYmZTw9MjIzP3Q9LTE6ZT49MjI0JiYodD0tMik7aWYoZT49MTEzJiZlPD0xMTcpe249Zi5wb3AoKTtpc05hTihuKXx8KHQ9Miotbil9Zm9yKDt0PDAmJmYubGVuZ3RoPjA7KXtmLnBvcCgpO3QrK31mb3IoO3Q+MDspe2YucHVzaChOYU4pO3QtLX19fXQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zPW07Y29uc3QgUz1bY107aD5jLmxlbmd0aCYmUy5wdXNoKG5ldyBVaW50OEFycmF5KGgtYy5sZW5ndGgpKTtpZihkPnUpeygwLHIud2FybikoIlRUOiBjb21wbGVtZW50aW5nIGEgbWlzc2luZyBmdW5jdGlvbiB0YWlsIik7Uy5wdXNoKG5ldyBVaW50OEFycmF5KFszNCw0NV0pKX0hZnVuY3Rpb24gZm9sZFRUVGFibGUoZSx0KXtpZih0Lmxlbmd0aD4xKXtsZXQgYSxyLG49MDtmb3IoYT0wLHI9dC5sZW5ndGg7YTxyO2ErKyluKz10W2FdLmxlbmd0aDtuPW4rMyYtNDtjb25zdCBpPW5ldyBVaW50OEFycmF5KG4pO2xldCBzPTA7Zm9yKGE9MCxyPXQubGVuZ3RoO2E8cjthKyspe2kuc2V0KHRbYV0scyk7cys9dFthXS5sZW5ndGh9ZS5kYXRhPWk7ZS5sZW5ndGg9bn19KGUsUyl9bGV0IGQsZixiLHc7aWYoaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKHQ9bmV3IHkuU3RyZWFtKG5ldyBVaW50OEFycmF5KHQuZ2V0Qnl0ZXMoKSkpKSl7Y29uc3QgZT1mdW5jdGlvbiByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uRGF0YShlLHQpe2NvbnN0e251bUZvbnRzOmEsb2Zmc2V0VGFibGU6bn09ZnVuY3Rpb24gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkhlYWRlcihlKXtjb25zdCB0PWUuZ2V0U3RyaW5nKDQpOygwLHIuYXNzZXJ0KSgidHRjZiI9PT10LCJNdXN0IGJlIGEgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBmb250LiIpO2NvbnN0IGE9ZS5nZXRVaW50MTYoKSxuPWUuZ2V0VWludDE2KCksaT1lLmdldEludDMyKCk+Pj4wLHM9W107Zm9yKGxldCB0PTA7dDxpO3QrKylzLnB1c2goZS5nZXRJbnQzMigpPj4+MCk7Y29uc3Qgbz17dHRjVGFnOnQsbWFqb3JWZXJzaW9uOmEsbWlub3JWZXJzaW9uOm4sbnVtRm9udHM6aSxvZmZzZXRUYWJsZTpzfTtzd2l0Y2goYSl7Y2FzZSAxOnJldHVybiBvO2Nhc2UgMjpvLmRzaWdUYWc9ZS5nZXRJbnQzMigpPj4+MDtvLmRzaWdMZW5ndGg9ZS5nZXRJbnQzMigpPj4+MDtvLmRzaWdPZmZzZXQ9ZS5nZXRJbnQzMigpPj4+MDtyZXR1cm4gb310aHJvdyBuZXcgci5Gb3JtYXRFcnJvcihgSW52YWxpZCBUcnVlVHlwZSBDb2xsZWN0aW9uIG1ham9yVmVyc2lvbjogJHthfS5gKX0oZSksaT10LnNwbGl0KCIrIik7bGV0IHM7Zm9yKGxldCBvPTA7bzxhO28rKyl7ZS5wb3M9KGUuc3RhcnR8fDApK25bb107Y29uc3QgYT1yZWFkT3BlblR5cGVIZWFkZXIoZSksYz1yZWFkVGFibGVzKGUsYS5udW1UYWJsZXMpO2lmKCFjLm5hbWUpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoJ1RydWVUeXBlIENvbGxlY3Rpb24gZm9udCBtdXN0IGNvbnRhaW4gYSAibmFtZSIgdGFibGUuJyk7Y29uc3RbbF09cmVhZE5hbWVUYWJsZShjLm5hbWUpO2ZvcihsZXQgZT0wLHI9bC5sZW5ndGg7ZTxyO2UrKylmb3IobGV0IHI9MCxuPWxbZV0ubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49bFtlXVtyXT8ucmVwbGFjZUFsbCgvXHMvZywiIik7aWYobil7aWYobj09PXQpcmV0dXJue2hlYWRlcjphLHRhYmxlczpjfTtpZighKGkubGVuZ3RoPDIpKWZvcihjb25zdCBlIG9mIGkpbj09PWUmJihzPXtuYW1lOmUsaGVhZGVyOmEsdGFibGVzOmN9KX19fWlmKHMpeygwLHIud2FybikoYFRydWVUeXBlIENvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiAiJHt0fSIgZm9udCwgZmFsbGluZyBiYWNrIHRvICIke3MubmFtZX0iIGZvbnQgaW5zdGVhZC5gKTtyZXR1cm57aGVhZGVyOnMuaGVhZGVyLHRhYmxlczpzLnRhYmxlc319dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYFRydWVUeXBlIENvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiAiJHt0fSIgZm9udC5gKX0odCx0aGlzLm5hbWUpO2Q9ZS5oZWFkZXI7Zj1lLnRhYmxlc31lbHNle2Q9cmVhZE9wZW5UeXBlSGVhZGVyKHQpO2Y9cmVhZFRhYmxlcyh0LGQubnVtVGFibGVzKX1jb25zdCBTPSFmWyJDRkYgIl07aWYoUyl7aWYoIWYubG9jYSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcignUmVxdWlyZWQgImxvY2EiIHRhYmxlIGlzIG5vdCBmb3VuZCcpO2lmKCFmLmdseWYpeygwLHIud2FybikoJ1JlcXVpcmVkICJnbHlmIiB0YWJsZSBpcyBub3QgZm91bmQgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJyk7Zi5nbHlmPXt0YWc6ImdseWYiLGRhdGE6bmV3IFVpbnQ4QXJyYXkoMCl9fXRoaXMuaXNPcGVuVHlwZT0hMX1lbHNle2NvbnN0IHQ9YS5jb21wb3NpdGUmJihhLmNpZFRvR2lkTWFwPy5sZW5ndGg+MHx8IShhLmNNYXAgaW5zdGFuY2VvZiBwLklkZW50aXR5Q01hcCkpO2lmKCJPVFRPIj09PWQudmVyc2lvbiYmIXR8fCFmLmhlYWR8fCFmLmhoZWF8fCFmLm1heHB8fCFmLnBvc3Qpe3c9bmV3IHkuU3RyZWFtKGZbIkNGRiAiXS5kYXRhKTtiPW5ldyB1LkNGRkZvbnQodyxhKTthZGp1c3RXaWR0aHMoYSk7cmV0dXJuIHRoaXMuY29udmVydChlLGIsYSl9ZGVsZXRlIGYuZ2x5ZjtkZWxldGUgZi5sb2NhO2RlbGV0ZSBmLmZwZ207ZGVsZXRlIGYucHJlcDtkZWxldGUgZlsiY3Z0ICJdO3RoaXMuaXNPcGVuVHlwZT0hMH1pZighZi5tYXhwKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibWF4cCIgdGFibGUgaXMgbm90IGZvdW5kJyk7dC5wb3M9KHQuc3RhcnR8fDApK2YubWF4cC5vZmZzZXQ7Y29uc3QgeD10LmdldEludDMyKCksQz10LmdldFVpbnQxNigpO2lmKGEuc2NhbGVGYWN0b3JzPy5sZW5ndGg9PT1DJiZTKXtjb25zdHtzY2FsZUZhY3RvcnM6ZX09YSx0PWludDE2KGYuaGVhZC5kYXRhWzUwXSxmLmhlYWQuZGF0YVs1MV0pLHI9bmV3IGcuR2x5ZlRhYmxlKHtnbHlmVGFibGU6Zi5nbHlmLmRhdGEsaXNHbHlwaExvY2F0aW9uc0xvbmc6dCxsb2NhVGFibGU6Zi5sb2NhLmRhdGEsbnVtR2x5cGhzOkN9KTtyLnNjYWxlKGUpO2NvbnN0e2dseWY6bixsb2NhOmksaXNMb2NhdGlvbkxvbmc6c309ci53cml0ZSgpO2YuZ2x5Zi5kYXRhPW47Zi5sb2NhLmRhdGE9aTtpZihzIT09ISF0KXtmLmhlYWQuZGF0YVs1MF09MDtmLmhlYWQuZGF0YVs1MV09cz8xOjB9Y29uc3Qgbz1mLmhtdHguZGF0YTtmb3IobGV0IHQ9MDt0PEM7dCsrKXtjb25zdCBhPTQqdCxyPU1hdGgucm91bmQoZVt0XSppbnQxNihvW2FdLG9bYSsxXSkpO29bYV09cj4+OCYyNTU7b1thKzFdPTI1NSZyO3dyaXRlU2lnbmVkSW50MTYobyxhKzIsTWF0aC5yb3VuZChlW3RdKnNpZ25lZEludDE2KG9bYSsyXSxvW2ErM10pKSl9fWxldCB2PUMrMSxrPSEwO2lmKHY+NjU1MzUpe2s9ITE7dj1DOygwLHIud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gZ2x5ZnMgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpfWxldCBPPTAsVD0wO2lmKHg+PTY1NTM2JiZmLm1heHAubGVuZ3RoPj0yMil7dC5wb3MrPTg7aWYodC5nZXRVaW50MTYoKT4yKXtmLm1heHAuZGF0YVsxNF09MDtmLm1heHAuZGF0YVsxNV09Mn10LnBvcys9NDtPPXQuZ2V0VWludDE2KCk7dC5wb3MrPTQ7VD10LmdldFVpbnQxNigpfWYubWF4cC5kYXRhWzRdPXY+Pjg7Zi5tYXhwLmRhdGFbNV09MjU1JnY7Y29uc3QgTT1mdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbXMoZSx0LGEsbil7Y29uc3QgaT17ZnVuY3Rpb25zRGVmaW5lZDpbXSxmdW5jdGlvbnNVc2VkOltdLGZ1bmN0aW9uc1N0YWNrRGVsdGFzOltdLHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczohMSxoaW50c1ZhbGlkOiEwfTtlJiZzYW5pdGl6ZVRUUHJvZ3JhbShlLGkpO3QmJnNhbml0aXplVFRQcm9ncmFtKHQsaSk7ZSYmZnVuY3Rpb24gY2hlY2tJbnZhbGlkRnVuY3Rpb25zKGUsdCl7aWYoIWUudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKWlmKGUuZnVuY3Rpb25zRGVmaW5lZC5sZW5ndGg+dCl7KDAsci53YXJuKSgiVFQ6IG1vcmUgZnVuY3Rpb25zIGRlZmluZWQgdGhhbiBleHBlY3RlZCIpO2UuaGludHNWYWxpZD0hMX1lbHNlIGZvcihsZXQgYT0wLG49ZS5mdW5jdGlvbnNVc2VkLmxlbmd0aDthPG47YSsrKXtpZihhPnQpeygwLHIud2FybikoIlRUOiBpbnZhbGlkIGZ1bmN0aW9uIGlkOiAiK2EpO2UuaGludHNWYWxpZD0hMTtyZXR1cm59aWYoZS5mdW5jdGlvbnNVc2VkW2FdJiYhZS5mdW5jdGlvbnNEZWZpbmVkW2FdKXsoMCxyLndhcm4pKCJUVDogdW5kZWZpbmVkIGZ1bmN0aW9uOiAiK2EpO2UuaGludHNWYWxpZD0hMTtyZXR1cm59fX0oaSxuKTtpZihhJiYxJmEubGVuZ3RoKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KGEubGVuZ3RoKzEpO2Uuc2V0KGEuZGF0YSk7YS5kYXRhPWV9cmV0dXJuIGkuaGludHNWYWxpZH0oZi5mcGdtLGYucHJlcCxmWyJjdnQgIl0sTyk7aWYoIU0pe2RlbGV0ZSBmLmZwZ207ZGVsZXRlIGYucHJlcDtkZWxldGUgZlsiY3Z0ICJdfSFmdW5jdGlvbiBzYW5pdGl6ZU1ldHJpY3MoZSx0LGEsbixpLHMpe2lmKCF0KXthJiYoYS5kYXRhPW51bGwpO3JldHVybn1lLnBvcz0oZS5zdGFydHx8MCkrdC5vZmZzZXQ7ZS5wb3MrPTQ7ZS5wb3MrPTI7ZS5wb3MrPTI7ZS5wb3MrPTI7ZS5wb3MrPTI7ZS5wb3MrPTI7ZS5wb3MrPTI7ZS5wb3MrPTI7ZS5wb3MrPTI7ZS5wb3MrPTI7Y29uc3Qgbz1lLmdldFVpbnQxNigpO2UucG9zKz04O2UucG9zKz0yO2xldCBjPWUuZ2V0VWludDE2KCk7aWYoMCE9PW8pe2lmKCEoMiZpbnQxNihuLmRhdGFbNDRdLG4uZGF0YVs0NV0pKSl7dC5kYXRhWzIyXT0wO3QuZGF0YVsyM109MH19aWYoYz5pKXsoMCxyLmluZm8pKGBUaGUgbnVtT2ZNZXRyaWNzICgke2N9KSBzaG91bGQgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtR2x5cGhzICgke2l9KS5gKTtjPWk7dC5kYXRhWzM0XT0oNjUyODAmYyk+Pjg7dC5kYXRhWzM1XT0yNTUmY31jb25zdCBsPWktYy0oYS5sZW5ndGgtNCpjPj4xKTtpZihsPjApe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgrMipsKTtlLnNldChhLmRhdGEpO2lmKHMpe2VbYS5sZW5ndGhdPWEuZGF0YVsyXTtlW2EubGVuZ3RoKzFdPWEuZGF0YVszXX1hLmRhdGE9ZX19KHQsZi5oaGVhLGYuaG10eCxmLmhlYWQsdixrKTtpZighZi5oZWFkKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGVhZCIgdGFibGUgaXMgbm90IGZvdW5kJyk7IWZ1bmN0aW9uIHNhbml0aXplSGVhZChlLHQsYSl7Y29uc3Qgbj1lLmRhdGEsaT1mdW5jdGlvbiBpbnQzMihlLHQsYSxyKXtyZXR1cm4oZTw8MjQpKyh0PDwxNikrKGE8PDgpK3J9KG5bMF0sblsxXSxuWzJdLG5bM10pO2lmKGk+PjE2IT0xKXsoMCxyLmluZm8pKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogIitpKTtuWzBdPTA7blsxXT0xO25bMl09MDtuWzNdPTB9Y29uc3Qgcz1pbnQxNihuWzUwXSxuWzUxXSk7aWYoczwwfHxzPjEpeygwLHIuaW5mbykoIkF0dGVtcHRpbmcgdG8gZml4IGludmFsaWQgaW5kZXhUb0xvY0Zvcm1hdCBpbiBoZWFkIHRhYmxlOiAiK3MpO2NvbnN0IGU9dCsxO2lmKGE9PT1lPDwxKXtuWzUwXT0wO25bNTFdPTB9ZWxzZXtpZihhIT09ZTw8Mil0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiQ291bGQgbm90IGZpeCBpbmRleFRvTG9jRm9ybWF0OiAiK3MpO25bNTBdPTA7bls1MV09MX19fShmLmhlYWQsQyxTP2YubG9jYS5sZW5ndGg6MCk7bGV0IEU9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihTKXtjb25zdCBlPWludDE2KGYuaGVhZC5kYXRhWzUwXSxmLmhlYWQuZGF0YVs1MV0pLHQ9ZnVuY3Rpb24gc2FuaXRpemVHbHlwaExvY2F0aW9ucyhlLHQsYSxyLG4saSxzKXtsZXQgbyxjLGw7aWYocil7bz00O2M9ZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGVMb25nKGUsdCl7cmV0dXJuIGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXX07bD1mdW5jdGlvbiBmb250SXRlbUVuY29kZUxvbmcoZSx0LGEpe2VbdF09YT4+PjI0JjI1NTtlW3QrMV09YT4+MTYmMjU1O2VbdCsyXT1hPj44JjI1NTtlW3QrM109MjU1JmF9fWVsc2V7bz0yO2M9ZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGUoZSx0KXtyZXR1cm4gZVt0XTw8OXxlW3QrMV08PDF9O2w9ZnVuY3Rpb24gZm9udEl0ZW1FbmNvZGUoZSx0LGEpe2VbdF09YT4+OSYyNTU7ZVt0KzFdPWE+PjEmMjU1fX1jb25zdCBoPWk/YSsxOmEsdT1vKigxK2gpLGQ9bmV3IFVpbnQ4QXJyYXkodSk7ZC5zZXQoZS5kYXRhLnN1YmFycmF5KDAsdSkpO2UuZGF0YT1kO2NvbnN0IGY9dC5kYXRhLGc9Zi5sZW5ndGgscD1uZXcgVWludDhBcnJheShnKTtsZXQgbSxiO2NvbnN0IHk9W107Zm9yKG09MCxiPTA7bTxhKzE7bSsrLGIrPW8pe2xldCBlPWMoZCxiKTtlPmcmJihlPWcpO3kucHVzaCh7aW5kZXg6bSxvZmZzZXQ6ZSxlbmRPZmZzZXQ6MH0pfXkuc29ydCgoKGUsdCk9PmUub2Zmc2V0LXQub2Zmc2V0KSk7Zm9yKG09MDttPGE7bSsrKXlbbV0uZW5kT2Zmc2V0PXlbbSsxXS5vZmZzZXQ7eS5zb3J0KCgoZSx0KT0+ZS5pbmRleC10LmluZGV4KSk7Zm9yKG09MDttPGE7bSsrKXtjb25zdHtvZmZzZXQ6ZSxlbmRPZmZzZXQ6dH09eVttXTtpZigwIT09ZXx8MCE9PXQpYnJlYWs7Y29uc3QgYT15W20rMV0ub2Zmc2V0O2lmKDAhPT1hKXt5W21dLmVuZE9mZnNldD1hO2JyZWFrfX1jb25zdCB3PU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IFM9MDtsKGQsMCxTKTtmb3IobT0wLGI9bzttPGE7bSsrLGIrPW8pe2NvbnN0IGU9c2FuaXRpemVHbHlwaChmLHlbbV0ub2Zmc2V0LHlbbV0uZW5kT2Zmc2V0LHAsUyxuKSx0PWUubGVuZ3RoOzA9PT10JiYod1ttXT0hMCk7ZS5zaXplT2ZJbnN0cnVjdGlvbnM+cyYmKHM9ZS5zaXplT2ZJbnN0cnVjdGlvbnMpO1MrPXQ7bChkLGIsUyl9aWYoMD09PVMpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoWzAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OSwwXSk7Zm9yKG09MCxiPW87bTxoO20rKyxiKz1vKWwoZCxiLGUubGVuZ3RoKTt0LmRhdGE9ZX1lbHNlIGlmKGkpe2NvbnN0IGE9YyhkLG8pO2lmKHAubGVuZ3RoPmErUyl0LmRhdGE9cC5zdWJhcnJheSgwLGErUyk7ZWxzZXt0LmRhdGE9bmV3IFVpbnQ4QXJyYXkoYStTKTt0LmRhdGEuc2V0KHAuc3ViYXJyYXkoMCxTKSl9dC5kYXRhLnNldChwLnN1YmFycmF5KDAsYSksUyk7bChlLmRhdGEsZC5sZW5ndGgtbyxTK2EpfWVsc2UgdC5kYXRhPXAuc3ViYXJyYXkoMCxTKTtyZXR1cm57bWlzc2luZ0dseXBoczp3LG1heFNpemVPZkluc3RydWN0aW9uczpzfX0oZi5sb2NhLGYuZ2x5ZixDLGUsTSxrLFQpO0U9dC5taXNzaW5nR2x5cGhzO2lmKHg+PTY1NTM2JiZmLm1heHAubGVuZ3RoPj0yMil7Zi5tYXhwLmRhdGFbMjZdPXQubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zPj44O2YubWF4cC5kYXRhWzI3XT0yNTUmdC5tYXhTaXplT2ZJbnN0cnVjdGlvbnN9fWlmKCFmLmhoZWEpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoaGVhIiB0YWJsZSBpcyBub3QgZm91bmQnKTtpZigwPT09Zi5oaGVhLmRhdGFbMTBdJiYwPT09Zi5oaGVhLmRhdGFbMTFdKXtmLmhoZWEuZGF0YVsxMF09MjU1O2YuaGhlYS5kYXRhWzExXT0yNTV9Y29uc3QgRD17dW5pdHNQZXJFbTppbnQxNihmLmhlYWQuZGF0YVsxOF0sZi5oZWFkLmRhdGFbMTldKSx5TWF4OnNpZ25lZEludDE2KGYuaGVhZC5kYXRhWzQyXSxmLmhlYWQuZGF0YVs0M10pLHlNaW46c2lnbmVkSW50MTYoZi5oZWFkLmRhdGFbMzhdLGYuaGVhZC5kYXRhWzM5XSksYXNjZW50OnNpZ25lZEludDE2KGYuaGhlYS5kYXRhWzRdLGYuaGhlYS5kYXRhWzVdKSxkZXNjZW50OnNpZ25lZEludDE2KGYuaGhlYS5kYXRhWzZdLGYuaGhlYS5kYXRhWzddKSxsaW5lR2FwOnNpZ25lZEludDE2KGYuaGhlYS5kYXRhWzhdLGYuaGhlYS5kYXRhWzldKX07dGhpcy5hc2NlbnQ9RC5hc2NlbnQvRC51bml0c1BlckVtO3RoaXMuZGVzY2VudD1ELmRlc2NlbnQvRC51bml0c1BlckVtO3RoaXMubGluZUdhcD1ELmxpbmVHYXAvRC51bml0c1BlckVtO2lmKHRoaXMuY3NzRm9udEluZm8/LmxpbmVIZWlnaHQpe3RoaXMubGluZUhlaWdodD10aGlzLmNzc0ZvbnRJbmZvLm1ldHJpY3MubGluZUhlaWdodDt0aGlzLmxpbmVHYXA9dGhpcy5jc3NGb250SW5mby5tZXRyaWNzLmxpbmVHYXB9ZWxzZSB0aGlzLmxpbmVIZWlnaHQ9dGhpcy5hc2NlbnQtdGhpcy5kZXNjZW50K3RoaXMubGluZUdhcDtmLnBvc3QmJmZ1bmN0aW9uIHJlYWRQb3N0U2NyaXB0VGFibGUoZSxhLG4pe2NvbnN0IHM9KHQuc3RhcnR8fDApK2Uub2Zmc2V0O3QucG9zPXM7Y29uc3Qgbz1zK2UubGVuZ3RoLGM9dC5nZXRJbnQzMigpO3Quc2tpcCgyOCk7bGV0IGwsaCx1PSEwO3N3aXRjaChjKXtjYXNlIDY1NTM2Omw9aS5NYWNTdGFuZGFyZEdseXBoT3JkZXJpbmc7YnJlYWs7Y2FzZSAxMzEwNzI6Y29uc3QgZT10LmdldFVpbnQxNigpO2lmKGUhPT1uKXt1PSExO2JyZWFrfWNvbnN0IHM9W107Zm9yKGg9MDtoPGU7KytoKXtjb25zdCBlPXQuZ2V0VWludDE2KCk7aWYoZT49MzI3Njgpe3U9ITE7YnJlYWt9cy5wdXNoKGUpfWlmKCF1KWJyZWFrO2NvbnN0IGQ9W10sZj1bXTtmb3IoO3QucG9zPG87KXtjb25zdCBlPXQuZ2V0Qnl0ZSgpO2YubGVuZ3RoPWU7Zm9yKGg9MDtoPGU7KytoKWZbaF09U3RyaW5nLmZyb21DaGFyQ29kZSh0LmdldEJ5dGUoKSk7ZC5wdXNoKGYuam9pbigiIikpfWw9W107Zm9yKGg9MDtoPGU7KytoKXtjb25zdCBlPXNbaF07ZTwyNTg/bC5wdXNoKGkuTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nW2VdKTpsLnB1c2goZFtlLTI1OF0pfWJyZWFrO2Nhc2UgMTk2NjA4OmJyZWFrO2RlZmF1bHQ6KDAsci53YXJuKSgiVW5rbm93bi91bnN1cHBvcnRlZCBwb3N0IHRhYmxlIHZlcnNpb24gIitjKTt1PSExO2EuZGVmYXVsdEVuY29kaW5nJiYobD1hLmRlZmF1bHRFbmNvZGluZyl9YS5nbHlwaE5hbWVzPWw7cmV0dXJuIHV9KGYucG9zdCxhLEMpO2YucG9zdD17dGFnOiJwb3N0IixkYXRhOmNyZWF0ZVBvc3RUYWJsZShhKX07Y29uc3QgTj1bXTtmdW5jdGlvbiBoYXNHbHlwaChlKXtyZXR1cm4hRVtlXX1pZihhLmNvbXBvc2l0ZSl7Y29uc3QgZT1hLmNpZFRvR2lkTWFwfHxbXSx0PTA9PT1lLmxlbmd0aDthLmNNYXAuZm9yRWFjaCgoZnVuY3Rpb24oYSxuKXsic3RyaW5nIj09dHlwZW9mIG4mJihuPWNvbnZlcnRDaWRTdHJpbmcoYSxuLCEwKSk7aWYobj42NTUzNSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpO2xldCBpPS0xO3Q/aT1uOnZvaWQgMCE9PWVbbl0mJihpPWVbbl0pO2k+PTAmJmk8QyYmaGFzR2x5cGgoaSkmJihOW2FdPWkpfSkpfWVsc2V7Y29uc3QgZT1mdW5jdGlvbiByZWFkQ21hcFRhYmxlKGUsdCxhLG4pe2lmKCFlKXsoMCxyLndhcm4pKCJObyBjbWFwIHRhYmxlIGF2YWlsYWJsZS4iKTtyZXR1cm57cGxhdGZvcm1JZDotMSxlbmNvZGluZ0lkOi0xLG1hcHBpbmdzOltdLGhhc1Nob3J0Q21hcDohMX19bGV0IGkscz0odC5zdGFydHx8MCkrZS5vZmZzZXQ7dC5wb3M9czt0LnNraXAoMik7Y29uc3Qgbz10LmdldFVpbnQxNigpO2xldCBjLGw9ITE7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3Qgcj10LmdldFVpbnQxNigpLGk9dC5nZXRVaW50MTYoKSxzPXQuZ2V0SW50MzIoKT4+PjA7bGV0IGg9ITE7aWYoYz8ucGxhdGZvcm1JZCE9PXJ8fGM/LmVuY29kaW5nSWQhPT1pKXtpZigwIT09cnx8MCE9PWkmJjEhPT1pJiYzIT09aSlpZigxPT09ciYmMD09PWkpaD0hMDtlbHNlIGlmKDMhPT1yfHwxIT09aXx8IW4mJmMpe2lmKGEmJjM9PT1yJiYwPT09aSl7aD0hMDtsZXQgYT0hMDtpZihlPG8tMSl7Y29uc3QgZT10LnBlZWtCeXRlcygyKTtpbnQxNihlWzBdLGVbMV0pPHImJihhPSExKX1hJiYobD0hMCl9fWVsc2V7aD0hMDthfHwobD0hMCl9ZWxzZSBoPSEwO2gmJihjPXtwbGF0Zm9ybUlkOnIsZW5jb2RpbmdJZDppLG9mZnNldDpzfSk7aWYobClicmVha319YyYmKHQucG9zPXMrYy5vZmZzZXQpO2lmKCFjfHwtMT09PXQucGVla0J5dGUoKSl7KDAsci53YXJuKSgiQ291bGQgbm90IGZpbmQgYSBwcmVmZXJyZWQgY21hcCB0YWJsZS4iKTtyZXR1cm57cGxhdGZvcm1JZDotMSxlbmNvZGluZ0lkOi0xLG1hcHBpbmdzOltdLGhhc1Nob3J0Q21hcDohMX19Y29uc3QgaD10LmdldFVpbnQxNigpO2xldCB1PSExO2NvbnN0IGQ9W107bGV0IGYsZztpZigwPT09aCl7dC5za2lwKDQpO2ZvcihmPTA7ZjwyNTY7ZisrKXtjb25zdCBlPXQuZ2V0Qnl0ZSgpO2UmJmQucHVzaCh7Y2hhckNvZGU6ZixnbHlwaElkOmV9KX11PSEwfWVsc2UgaWYoMj09PWgpe3Quc2tpcCg0KTtjb25zdCBlPVtdO2xldCBhPTA7Zm9yKGxldCByPTA7cjwyNTY7cisrKXtjb25zdCByPXQuZ2V0VWludDE2KCk+PjM7ZS5wdXNoKHIpO2E9TWF0aC5tYXgocixhKX1jb25zdCByPVtdO2ZvcihsZXQgZT0wO2U8PWE7ZSsrKXIucHVzaCh7Zmlyc3RDb2RlOnQuZ2V0VWludDE2KCksZW50cnlDb3VudDp0LmdldFVpbnQxNigpLGlkRGVsdGE6c2lnbmVkSW50MTYodC5nZXRCeXRlKCksdC5nZXRCeXRlKCkpLGlkUmFuZ2VQb3M6dC5wb3MrdC5nZXRVaW50MTYoKX0pO2ZvcihsZXQgYT0wO2E8MjU2O2ErKylpZigwPT09ZVthXSl7dC5wb3M9clswXS5pZFJhbmdlUG9zKzIqYTtnPXQuZ2V0VWludDE2KCk7ZC5wdXNoKHtjaGFyQ29kZTphLGdseXBoSWQ6Z30pfWVsc2V7Y29uc3Qgbj1yW2VbYV1dO2ZvcihmPTA7ZjxuLmVudHJ5Q291bnQ7ZisrKXtjb25zdCBlPShhPDw4KStmK24uZmlyc3RDb2RlO3QucG9zPW4uaWRSYW5nZVBvcysyKmY7Zz10LmdldFVpbnQxNigpOzAhPT1nJiYoZz0oZytuLmlkRGVsdGEpJTY1NTM2KTtkLnB1c2goe2NoYXJDb2RlOmUsZ2x5cGhJZDpnfSl9fX1lbHNlIGlmKDQ9PT1oKXt0LnNraXAoNCk7Y29uc3QgZT10LmdldFVpbnQxNigpPj4xO3Quc2tpcCg2KTtjb25zdCBhPVtdO2xldCByO2ZvcihyPTA7cjxlO3IrKylhLnB1c2goe2VuZDp0LmdldFVpbnQxNigpfSk7dC5za2lwKDIpO2ZvcihyPTA7cjxlO3IrKylhW3JdLnN0YXJ0PXQuZ2V0VWludDE2KCk7Zm9yKHI9MDtyPGU7cisrKWFbcl0uZGVsdGE9dC5nZXRVaW50MTYoKTtsZXQgbixvPTA7Zm9yKHI9MDtyPGU7cisrKXtpPWFbcl07Y29uc3Qgcz10LmdldFVpbnQxNigpO2lmKHMpe249KHM+PjEpLShlLXIpO2kub2Zmc2V0SW5kZXg9bjtvPU1hdGgubWF4KG8sbitpLmVuZC1pLnN0YXJ0KzEpfWVsc2UgaS5vZmZzZXRJbmRleD0tMX1jb25zdCBjPVtdO2ZvcihmPTA7ZjxvO2YrKyljLnB1c2godC5nZXRVaW50MTYoKSk7Zm9yKHI9MDtyPGU7cisrKXtpPWFbcl07cz1pLnN0YXJ0O2NvbnN0IGU9aS5lbmQsdD1pLmRlbHRhO249aS5vZmZzZXRJbmRleDtmb3IoZj1zO2Y8PWU7ZisrKWlmKDY1NTM1IT09Zil7Zz1uPDA/ZjpjW24rZi1zXTtnPWcrdCY2NTUzNTtkLnB1c2goe2NoYXJDb2RlOmYsZ2x5cGhJZDpnfSl9fX1lbHNlIGlmKDY9PT1oKXt0LnNraXAoNCk7Y29uc3QgZT10LmdldFVpbnQxNigpLGE9dC5nZXRVaW50MTYoKTtmb3IoZj0wO2Y8YTtmKyspe2c9dC5nZXRVaW50MTYoKTtjb25zdCBhPWUrZjtkLnB1c2goe2NoYXJDb2RlOmEsZ2x5cGhJZDpnfSl9fWVsc2V7aWYoMTIhPT1oKXsoMCxyLndhcm4pKCJjbWFwIHRhYmxlIGhhcyB1bnN1cHBvcnRlZCBmb3JtYXQ6ICIraCk7cmV0dXJue3BsYXRmb3JtSWQ6LTEsZW5jb2RpbmdJZDotMSxtYXBwaW5nczpbXSxoYXNTaG9ydENtYXA6ITF9fXt0LnNraXAoMTApO2NvbnN0IGU9dC5nZXRJbnQzMigpPj4+MDtmb3IoZj0wO2Y8ZTtmKyspe2NvbnN0IGU9dC5nZXRJbnQzMigpPj4+MCxhPXQuZ2V0SW50MzIoKT4+PjA7bGV0IHI9dC5nZXRJbnQzMigpPj4+MDtmb3IobGV0IHQ9ZTt0PD1hO3QrKylkLnB1c2goe2NoYXJDb2RlOnQsZ2x5cGhJZDpyKyt9KX19fWQuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jaGFyQ29kZS10LmNoYXJDb2RlfSkpO2ZvcihsZXQgZT0xO2U8ZC5sZW5ndGg7ZSsrKWlmKGRbZS0xXS5jaGFyQ29kZT09PWRbZV0uY2hhckNvZGUpe2Quc3BsaWNlKGUsMSk7ZS0tfXJldHVybntwbGF0Zm9ybUlkOmMucGxhdGZvcm1JZCxlbmNvZGluZ0lkOmMuZW5jb2RpbmdJZCxtYXBwaW5nczpkLGhhc1Nob3J0Q21hcDp1fX0oZi5jbWFwLHQsdGhpcy5pc1N5bWJvbGljRm9udCxhLmhhc0VuY29kaW5nKSxuPWUucGxhdGZvcm1JZCxzPWUuZW5jb2RpbmdJZCxsPWUubWFwcGluZ3M7bGV0IHU9W10sZD0hMTshYS5oYXNFbmNvZGluZ3x8Ik1hY1JvbWFuRW5jb2RpbmciIT09YS5iYXNlRW5jb2RpbmdOYW1lJiYiV2luQW5zaUVuY29kaW5nIiE9PWEuYmFzZUVuY29kaW5nTmFtZXx8KHU9KDAsYy5nZXRFbmNvZGluZykoYS5iYXNlRW5jb2RpbmdOYW1lKSk7aWYoYS5oYXNFbmNvZGluZyYmIXRoaXMuaXNTeW1ib2xpY0ZvbnQmJigzPT09biYmMT09PXN8fDE9PT1uJiYwPT09cykpe2NvbnN0IGU9KDAsby5nZXRHbHlwaHNVbmljb2RlKSgpO2ZvcihsZXQgdD0wO3Q8MjU2O3QrKyl7bGV0IHI7cj12b2lkIDAhPT10aGlzLmRpZmZlcmVuY2VzW3RdP3RoaXMuZGlmZmVyZW5jZXNbdF06dS5sZW5ndGgmJiIiIT09dVt0XT91W3RdOmMuU3RhbmRhcmRFbmNvZGluZ1t0XTtpZighciljb250aW51ZTtjb25zdCBvPSgwLGkucmVjb3ZlckdseXBoTmFtZSkocixlKTtsZXQgZDszPT09biYmMT09PXM/ZD1lW29dOjE9PT1uJiYwPT09cyYmKGQ9Yy5NYWNSb21hbkVuY29kaW5nLmluZGV4T2YobykpO2lmKHZvaWQgMD09PWQpe2lmKCFhLmdseXBoTmFtZXMmJmEuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAmJiEodGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwKSl7Y29uc3QgZT10aGlzLnRvVW5pY29kZS5nZXQodCk7ZSYmKGQ9ZS5jb2RlUG9pbnRBdCgwKSl9aWYodm9pZCAwPT09ZCljb250aW51ZX1mb3IoY29uc3QgZSBvZiBsKWlmKGUuY2hhckNvZGU9PT1kKXtOW3RdPWUuZ2x5cGhJZDticmVha319fWVsc2UgaWYoMD09PW4pe2Zvcihjb25zdCBlIG9mIGwpTltlLmNoYXJDb2RlXT1lLmdseXBoSWQ7ZD0hMH1lbHNlIGZvcihjb25zdCBlIG9mIGwpe2xldCB0PWUuY2hhckNvZGU7Mz09PW4mJnQ+PTYxNDQwJiZ0PD02MTY5NSYmKHQmPTI1NSk7Tlt0XT1lLmdseXBoSWR9aWYoYS5nbHlwaE5hbWVzJiYodS5sZW5ndGh8fHRoaXMuZGlmZmVyZW5jZXMubGVuZ3RoKSlmb3IobGV0IGU9MDtlPDI1NjsrK2Upe2lmKCFkJiZ2b2lkIDAhPT1OW2VdKWNvbnRpbnVlO2NvbnN0IHQ9dGhpcy5kaWZmZXJlbmNlc1tlXXx8dVtlXTtpZighdCljb250aW51ZTtjb25zdCByPWEuZ2x5cGhOYW1lcy5pbmRleE9mKHQpO3I+MCYmaGFzR2x5cGgocikmJihOW2VdPXIpfX0wPT09Ti5sZW5ndGgmJihOWzBdPTApO2xldCBSPXYtMTtrfHwoUj0wKTtpZighYS5jc3NGb250SW5mbyl7Y29uc3QgZT1hZGp1c3RNYXBwaW5nKE4saGFzR2x5cGgsUix0aGlzLnRvVW5pY29kZSk7dGhpcy50b0ZvbnRDaGFyPWUudG9Gb250Q2hhcjtmLmNtYXA9e3RhZzoiY21hcCIsZGF0YTpjcmVhdGVDbWFwVGFibGUoZS5jaGFyQ29kZVRvR2x5cGhJZCxlLnRvVW5pY29kZUV4dHJhTWFwLHYpfTtmWyJPUy8yIl0mJmZ1bmN0aW9uIHZhbGlkYXRlT1MyVGFibGUoZSx0KXt0LnBvcz0odC5zdGFydHx8MCkrZS5vZmZzZXQ7Y29uc3QgYT10LmdldFVpbnQxNigpO3Quc2tpcCg2MCk7Y29uc3Qgcj10LmdldFVpbnQxNigpO2lmKGE8NCYmNzY4JnIpcmV0dXJuITE7aWYodC5nZXRVaW50MTYoKT50LmdldFVpbnQxNigpKXJldHVybiExO3Quc2tpcCg2KTtpZigwPT09dC5nZXRVaW50MTYoKSlyZXR1cm4hMTtlLmRhdGFbOF09ZS5kYXRhWzldPTA7cmV0dXJuITB9KGZbIk9TLzIiXSx0KXx8KGZbIk9TLzIiXT17dGFnOiJPUy8yIixkYXRhOmNyZWF0ZU9TMlRhYmxlKGEsZS5jaGFyQ29kZVRvR2x5cGhJZCxEKX0pfWlmKCFTKXRyeXt3PW5ldyB5LlN0cmVhbShmWyJDRkYgIl0uZGF0YSk7Yj1uZXcgbi5DRkZQYXJzZXIodyxhLGkuU0VBQ19BTkFMWVNJU19FTkFCTEVEKS5wYXJzZSgpO2IuZHVwbGljYXRlRmlyc3RHbHlwaCgpO2NvbnN0IGU9bmV3IG4uQ0ZGQ29tcGlsZXIoYik7ZlsiQ0ZGICJdLmRhdGE9ZS5jb21waWxlKCl9Y2F0Y2h7KDAsci53YXJuKSgiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiK2EubG9hZGVkTmFtZSl9aWYoZi5uYW1lKXtjb25zdFt0LHJdPXJlYWROYW1lVGFibGUoZi5uYW1lKTtmLm5hbWUuZGF0YT1jcmVhdGVOYW1lVGFibGUoZSx0KTt0aGlzLnBzTmFtZT10WzBdWzZdfHxudWxsO2EuY29tcG9zaXRlfHxmdW5jdGlvbiBhZGp1c3RUcnVlVHlwZVRvVW5pY29kZShlLHQsYSl7aWYoZS5pc0ludGVybmFsRm9udClyZXR1cm47aWYoZS5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcClyZXR1cm47aWYoZS5oYXNFbmNvZGluZylyZXR1cm47aWYoZS50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwKXJldHVybjtpZighdClyZXR1cm47aWYoMD09PWEubGVuZ3RoKXJldHVybjtpZihlLmRlZmF1bHRFbmNvZGluZz09PWMuV2luQW5zaUVuY29kaW5nKXJldHVybjtmb3IoY29uc3QgZSBvZiBhKWlmKCFpc1dpbk5hbWVSZWNvcmQoZSkpcmV0dXJuO2NvbnN0IHI9Yy5XaW5BbnNpRW5jb2Rpbmcsbj1bXSxpPSgwLG8uZ2V0R2x5cGhzVW5pY29kZSkoKTtmb3IoY29uc3QgZSBpbiByKXtjb25zdCB0PXJbZV07aWYoIiI9PT10KWNvbnRpbnVlO2NvbnN0IGE9aVt0XTt2b2lkIDAhPT1hJiYobltlXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpKX1uLmxlbmd0aD4wJiZlLnRvVW5pY29kZS5hbWVuZChuKX0oYSx0aGlzLmlzU3ltYm9saWNGb250LHIpfWVsc2UgZi5uYW1lPXt0YWc6Im5hbWUiLGRhdGE6Y3JlYXRlTmFtZVRhYmxlKHRoaXMubmFtZSl9O2NvbnN0IEw9bmV3IG0uT3BlblR5cGVGaWxlQnVpbGRlcihkLnZlcnNpb24pO2Zvcihjb25zdCBlIGluIGYpTC5hZGRUYWJsZShlLGZbZV0uZGF0YSk7cmV0dXJuIEwudG9BcnJheSgpfWNvbnZlcnQoZSx0LGEpe2EuZml4ZWRQaXRjaD0hMTthLmJ1aWx0SW5FbmNvZGluZyYmZnVuY3Rpb24gYWRqdXN0VHlwZTFUb1VuaWNvZGUoZSx0KXtpZihlLmlzSW50ZXJuYWxGb250KXJldHVybjtpZihlLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKXJldHVybjtpZih0PT09ZS5kZWZhdWx0RW5jb2RpbmcpcmV0dXJuO2lmKGUudG9Vbmljb2RlIGluc3RhbmNlb2YgaC5JZGVudGl0eVRvVW5pY29kZU1hcClyZXR1cm47Y29uc3QgYT1bXSxyPSgwLG8uZ2V0R2x5cGhzVW5pY29kZSkoKTtmb3IoY29uc3QgbiBpbiB0KXtpZihlLmhhc0VuY29kaW5nJiYoZS5iYXNlRW5jb2RpbmdOYW1lfHx2b2lkIDAhPT1lLmRpZmZlcmVuY2VzW25dKSljb250aW51ZTtjb25zdCBpPXRbbl0sbz0oMCxzLmdldFVuaWNvZGVGb3JHbHlwaCkoaSxyKTstMSE9PW8mJihhW25dPVN0cmluZy5mcm9tQ2hhckNvZGUobykpfWEubGVuZ3RoPjAmJmUudG9Vbmljb2RlLmFtZW5kKGEpfShhLGEuYnVpbHRJbkVuY29kaW5nKTtsZXQgbj0xO3QgaW5zdGFuY2VvZiB1LkNGRkZvbnQmJihuPXQubnVtR2x5cGhzLTEpO2NvbnN0IGw9dC5nZXRHbHlwaE1hcHBpbmcoYSk7bGV0IGQ9bnVsbCxmPWwsZz1udWxsO2lmKCFhLmNzc0ZvbnRJbmZvKXtkPWFkanVzdE1hcHBpbmcobCx0Lmhhc0dseXBoSWQuYmluZCh0KSxuLHRoaXMudG9Vbmljb2RlKTt0aGlzLnRvRm9udENoYXI9ZC50b0ZvbnRDaGFyO2Y9ZC5jaGFyQ29kZVRvR2x5cGhJZDtnPWQudG9Vbmljb2RlRXh0cmFNYXB9Y29uc3QgcD10Lm51bUdseXBocztmdW5jdGlvbiBnZXRDaGFyQ29kZXMoZSx0KXtsZXQgYT1udWxsO2Zvcihjb25zdCByIGluIGUpdD09PWVbcl0mJihhfHw9W10pLnB1c2goMHxyKTtyZXR1cm4gYX1mdW5jdGlvbiBjcmVhdGVDaGFyQ29kZShlLHQpe2Zvcihjb25zdCBhIGluIGUpaWYodD09PWVbYV0pcmV0dXJuIDB8YTtkLmNoYXJDb2RlVG9HbHlwaElkW2QubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZV09dDtyZXR1cm4gZC5uZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlKyt9Y29uc3QgYj10LnNlYWNzO2lmKGQmJmkuU0VBQ19BTkFMWVNJU19FTkFCTEVEJiZiPy5sZW5ndGgpe2NvbnN0IGU9YS5mb250TWF0cml4fHxyLkZPTlRfSURFTlRJVFlfTUFUUklYLG49dC5nZXRDaGFyc2V0KCksaT1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihsZXQgdCBpbiBiKXt0fD0wO2NvbnN0IGE9Ylt0XSxyPWMuU3RhbmRhcmRFbmNvZGluZ1thWzJdXSxzPWMuU3RhbmRhcmRFbmNvZGluZ1thWzNdXSxvPW4uaW5kZXhPZihyKSxoPW4uaW5kZXhPZihzKTtpZihvPDB8fGg8MCljb250aW51ZTtjb25zdCB1PXt4OmFbMF0qZVswXSthWzFdKmVbMl0rZVs0XSx5OmFbMF0qZVsxXSthWzFdKmVbM10rZVs1XX0sZj1nZXRDaGFyQ29kZXMobCx0KTtpZihmKWZvcihjb25zdCBlIG9mIGYpe2NvbnN0IHQ9ZC5jaGFyQ29kZVRvR2x5cGhJZCxhPWNyZWF0ZUNoYXJDb2RlKHQsbykscj1jcmVhdGVDaGFyQ29kZSh0LGgpO2lbZV09e2Jhc2VGb250Q2hhckNvZGU6YSxhY2NlbnRGb250Q2hhckNvZGU6cixhY2NlbnRPZmZzZXQ6dX19fWEuc2VhY01hcD1pfWNvbnN0IHk9MS8oYS5mb250TWF0cml4fHxyLkZPTlRfSURFTlRJVFlfTUFUUklYKVswXSx3PW5ldyBtLk9wZW5UeXBlRmlsZUJ1aWxkZXIoIk9UVE8iKTt3LmFkZFRhYmxlKCJDRkYgIix0LmRhdGEpO3cuYWRkVGFibGUoIk9TLzIiLGNyZWF0ZU9TMlRhYmxlKGEsZikpO3cuYWRkVGFibGUoImNtYXAiLGNyZWF0ZUNtYXBUYWJsZShmLGcscCkpO3cuYWRkVGFibGUoImhlYWQiLCJcMAFcMFwwXDBcMBBcMFwwXDBcMFwwXw88w7VcMFwwIitzYWZlU3RyaW5nMTYoeSkrIlwwXDBcMFwwwp5cdn4nXDBcMFwwXDDCnlx2fidcMFwwIitzYWZlU3RyaW5nMTYoYS5kZXNjZW50KSsiD8O/IitzYWZlU3RyaW5nMTYoYS5hc2NlbnQpK3N0cmluZzE2KGEuaXRhbGljQW5nbGU/MjowKSsiXDARXDBcMFwwXDBcMFwwIik7dy5hZGRUYWJsZSgiaGhlYSIsIlwwAVwwXDAiK3NhZmVTdHJpbmcxNihhLmFzY2VudCkrc2FmZVN0cmluZzE2KGEuZGVzY2VudCkrIlwwXDDDv8O/XDBcMFwwXDBcMFwwIitzYWZlU3RyaW5nMTYoYS5jYXBIZWlnaHQpK3NhZmVTdHJpbmcxNihNYXRoLnRhbihhLml0YWxpY0FuZ2xlKSphLnhIZWlnaHQpKyJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiK3N0cmluZzE2KHApKTt3LmFkZFRhYmxlKCJobXR4IixmdW5jdGlvbiBmb250RmllbGRzSG10eCgpe2NvbnN0IGU9dC5jaGFyc3RyaW5ncyxhPXQuY2ZmP3QuY2ZmLndpZHRoczpudWxsO2xldCByPSJcMFwwXDBcMCI7Zm9yKGxldCB0PTEsbj1wO3Q8bjt0Kyspe2xldCBuPTA7aWYoZSl7Y29uc3QgYT1lW3QtMV07bj0id2lkdGgiaW4gYT9hLndpZHRoOjB9ZWxzZSBhJiYobj1NYXRoLmNlaWwoYVt0XXx8MCkpO3IrPXN0cmluZzE2KG4pK3N0cmluZzE2KDApfXJldHVybiByfSgpKTt3LmFkZFRhYmxlKCJtYXhwIiwiXDBcMFBcMCIrc3RyaW5nMTYocCkpO3cuYWRkVGFibGUoIm5hbWUiLGNyZWF0ZU5hbWVUYWJsZShlKSk7dy5hZGRUYWJsZSgicG9zdCIsY3JlYXRlUG9zdFRhYmxlKGEpKTtyZXR1cm4gdy50b0FycmF5KCl9Z2V0IHNwYWNlV2lkdGgoKXtjb25zdCBlPVsic3BhY2UiLCJtaW51cyIsIm9uZSIsImkiLCJJIl07bGV0IHQ7Zm9yKGNvbnN0IGEgb2YgZSl7aWYoYSBpbiB0aGlzLndpZHRocyl7dD10aGlzLndpZHRoc1thXTticmVha31jb25zdCBlPSgwLG8uZ2V0R2x5cGhzVW5pY29kZSkoKVthXTtsZXQgcj0wO2lmKHRoaXMuY29tcG9zaXRlJiZ0aGlzLmNNYXAuY29udGFpbnMoZSkpe3I9dGhpcy5jTWFwLmxvb2t1cChlKTsic3RyaW5nIj09dHlwZW9mIHImJihyPWNvbnZlcnRDaWRTdHJpbmcoZSxyKSl9IXImJnRoaXMudG9Vbmljb2RlJiYocj10aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGUpKTtyPD0wJiYocj1lKTt0PXRoaXMud2lkdGhzW3JdO2lmKHQpYnJlYWt9cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsInNwYWNlV2lkdGgiLHR8fHRoaXMuZGVmYXVsdFdpZHRoKX1fY2hhclRvR2x5cGgoZSl7bGV0IHQsYSxuLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxvPXRoaXMuX2dseXBoQ2FjaGVbZV07aWYobz8uaXNTcGFjZT09PWkpcmV0dXJuIG87bGV0IGM9ZTtpZih0aGlzLmNNYXA/LmNvbnRhaW5zKGUpKXtjPXRoaXMuY01hcC5sb29rdXAoZSk7InN0cmluZyI9PXR5cGVvZiBjJiYoYz1jb252ZXJ0Q2lkU3RyaW5nKGUsYykpfWE9dGhpcy53aWR0aHNbY107Im51bWJlciIhPXR5cGVvZiBhJiYoYT10aGlzLmRlZmF1bHRXaWR0aCk7Y29uc3QgbD10aGlzLnZtZXRyaWNzPy5bY107bGV0IGg9dGhpcy50b1VuaWNvZGUuZ2V0KGUpfHxlOyJudW1iZXIiPT10eXBlb2YgaCYmKGg9U3RyaW5nLmZyb21DaGFyQ29kZShoKSk7bGV0IHU9dm9pZCAwIT09dGhpcy50b0ZvbnRDaGFyW2VdO3Q9dGhpcy50b0ZvbnRDaGFyW2VdfHxlO2lmKHRoaXMubWlzc2luZ0ZpbGUpe2NvbnN0IGE9dGhpcy5kaWZmZXJlbmNlc1tlXXx8dGhpcy5kZWZhdWx0RW5jb2RpbmdbZV07Ii5ub3RkZWYiIT09YSYmIiIhPT1hfHwiVHlwZTEiIT09dGhpcy50eXBlfHwodD0zMik7dD0oMCxzLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKSh0KX10aGlzLmlzVHlwZTNGb250JiYobj10KTtsZXQgZD1udWxsO2lmKHRoaXMuc2VhY01hcD8uW2VdKXt1PSEwO2NvbnN0IGE9dGhpcy5zZWFjTWFwW2VdO3Q9YS5iYXNlRm9udENoYXJDb2RlO2Q9e2ZvbnRDaGFyOlN0cmluZy5mcm9tQ29kZVBvaW50KGEuYWNjZW50Rm9udENoYXJDb2RlKSxvZmZzZXQ6YS5hY2NlbnRPZmZzZXR9fWxldCBmPSIiOyJudW1iZXIiPT10eXBlb2YgdCYmKHQ8PTExMTQxMTE/Zj1TdHJpbmcuZnJvbUNvZGVQb2ludCh0KTooMCxyLndhcm4pKGBjaGFyVG9HbHlwaCAtIGludmFsaWQgZm9udENoYXJDb2RlOiAke3R9YCkpO289bmV3IEdseXBoKGUsZixoLGQsYSxsLG4saSx1KTtyZXR1cm4gdGhpcy5fZ2x5cGhDYWNoZVtlXT1vfWNoYXJzVG9HbHlwaHMoZSl7bGV0IHQ9dGhpcy5fY2hhcnNDYWNoZVtlXTtpZih0KXJldHVybiB0O3Q9W107aWYodGhpcy5jTWFwKXtjb25zdCBhPU9iamVjdC5jcmVhdGUobnVsbCkscj1lLmxlbmd0aDtsZXQgbj0wO2Zvcig7bjxyOyl7dGhpcy5jTWFwLnJlYWRDaGFyQ29kZShlLG4sYSk7Y29uc3R7Y2hhcmNvZGU6cixsZW5ndGg6aX09YTtuKz1pO2NvbnN0IHM9dGhpcy5fY2hhclRvR2x5cGgociwxPT09aSYmMzI9PT1lLmNoYXJDb2RlQXQobi0xKSk7dC5wdXNoKHMpfX1lbHNlIGZvcihsZXQgYT0wLHI9ZS5sZW5ndGg7YTxyOysrYSl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQoYSksbj10aGlzLl9jaGFyVG9HbHlwaChyLDMyPT09cik7dC5wdXNoKG4pfXJldHVybiB0aGlzLl9jaGFyc0NhY2hlW2VdPXR9Z2V0Q2hhclBvc2l0aW9ucyhlKXtjb25zdCB0PVtdO2lmKHRoaXMuY01hcCl7Y29uc3QgYT1PYmplY3QuY3JlYXRlKG51bGwpO2xldCByPTA7Zm9yKDtyPGUubGVuZ3RoOyl7dGhpcy5jTWFwLnJlYWRDaGFyQ29kZShlLHIsYSk7Y29uc3Qgbj1hLmxlbmd0aDt0LnB1c2goW3IscituXSk7cis9bn19ZWxzZSBmb3IobGV0IGE9MCxyPWUubGVuZ3RoO2E8cjsrK2EpdC5wdXNoKFthLGErMV0pO3JldHVybiB0fWdldCBnbHlwaENhY2hlVmFsdWVzKCl7cmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fZ2x5cGhDYWNoZSl9ZW5jb2RlU3RyaW5nKGUpe2NvbnN0IHQ9W10sYT1bXSxoYXNDdXJyZW50QnVmRXJyb3JzPSgpPT50Lmxlbmd0aCUyPT0xLHI9dGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwP2U9PnRoaXMudG9Vbmljb2RlLmNoYXJDb2RlT2YoZSk6ZT0+dGhpcy50b1VuaWNvZGUuY2hhckNvZGVPZihTdHJpbmcuZnJvbUNvZGVQb2ludChlKSk7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPWUuY29kZVBvaW50QXQobik7aT41NTI5NSYmKGk8NTczNDR8fGk+NjU1MzMpJiZuKys7aWYodGhpcy50b1VuaWNvZGUpe2NvbnN0IGU9cihpKTtpZigtMSE9PWUpe2lmKGhhc0N1cnJlbnRCdWZFcnJvcnMoKSl7dC5wdXNoKGEuam9pbigiIikpO2EubGVuZ3RoPTB9Zm9yKGxldCB0PSh0aGlzLmNNYXA/dGhpcy5jTWFwLmdldENoYXJDb2RlTGVuZ3RoKGUpOjEpLTE7dD49MDt0LS0pYS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZT4+OCp0JjI1NSkpO2NvbnRpbnVlfX1pZighaGFzQ3VycmVudEJ1ZkVycm9ycygpKXt0LnB1c2goYS5qb2luKCIiKSk7YS5sZW5ndGg9MH1hLnB1c2goU3RyaW5nLmZyb21Db2RlUG9pbnQoaSkpfXQucHVzaChhLmpvaW4oIiIpKTtyZXR1cm4gdH19O3QuRXJyb3JGb250PWNsYXNzIEVycm9yRm9udHtjb25zdHJ1Y3RvcihlKXt0aGlzLmVycm9yPWU7dGhpcy5sb2FkZWROYW1lPSJnX2ZvbnRfZXJyb3IiO3RoaXMubWlzc2luZ0ZpbGU9ITB9Y2hhcnNUb0dseXBocygpe3JldHVybltdfWVuY29kZVN0cmluZyhlKXtyZXR1cm5bZV19ZXhwb3J0RGF0YSgpe3JldHVybntlcnJvcjp0aGlzLmVycm9yfX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkNGRlRvcERpY3Q9dC5DRkZTdHJpbmdzPXQuQ0ZGU3RhbmRhcmRTdHJpbmdzPXQuQ0ZGUHJpdmF0ZURpY3Q9dC5DRkZQYXJzZXI9dC5DRkZJbmRleD10LkNGRkhlYWRlcj10LkNGRkZEU2VsZWN0PXQuQ0ZGQ29tcGlsZXI9dC5DRkZDaGFyc2V0PXQuQ0ZGPXZvaWQgMDthKDEzOSk7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO3ZhciByPWEoMTQ0KSxuPWEoMTg2KSxpPWEoMTg3KTtjb25zdCBzPVsiLm5vdGRlZiIsInNwYWNlIiwiZXhjbGFtIiwicXVvdGVkYmwiLCJudW1iZXJzaWduIiwiZG9sbGFyIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInF1b3RlcmlnaHQiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsInF1b3RlbGVmdCIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6IiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsImFzY2lpdGlsZGUiLCJleGNsYW1kb3duIiwiY2VudCIsInN0ZXJsaW5nIiwiZnJhY3Rpb24iLCJ5ZW4iLCJmbG9yaW4iLCJzZWN0aW9uIiwiY3VycmVuY3kiLCJxdW90ZXNpbmdsZSIsInF1b3RlZGJsbGVmdCIsImd1aWxsZW1vdGxlZnQiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJmaSIsImZsIiwiZW5kYXNoIiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwicGVyaW9kY2VudGVyZWQiLCJwYXJhZ3JhcGgiLCJidWxsZXQiLCJxdW90ZXNpbmdsYmFzZSIsInF1b3RlZGJsYmFzZSIsInF1b3RlZGJscmlnaHQiLCJndWlsbGVtb3RyaWdodCIsImVsbGlwc2lzIiwicGVydGhvdXNhbmQiLCJxdWVzdGlvbmRvd24iLCJncmF2ZSIsImFjdXRlIiwiY2lyY3VtZmxleCIsInRpbGRlIiwibWFjcm9uIiwiYnJldmUiLCJkb3RhY2NlbnQiLCJkaWVyZXNpcyIsInJpbmciLCJjZWRpbGxhIiwiaHVuZ2FydW1sYXV0Iiwib2dvbmVrIiwiY2Fyb24iLCJlbWRhc2giLCJBRSIsIm9yZGZlbWluaW5lIiwiTHNsYXNoIiwiT3NsYXNoIiwiT0UiLCJvcmRtYXNjdWxpbmUiLCJhZSIsImRvdGxlc3NpIiwibHNsYXNoIiwib3NsYXNoIiwib2UiLCJnZXJtYW5kYmxzIiwib25lc3VwZXJpb3IiLCJsb2dpY2Fsbm90IiwibXUiLCJ0cmFkZW1hcmsiLCJFdGgiLCJvbmVoYWxmIiwicGx1c21pbnVzIiwiVGhvcm4iLCJvbmVxdWFydGVyIiwiZGl2aWRlIiwiYnJva2VuYmFyIiwiZGVncmVlIiwidGhvcm4iLCJ0aHJlZXF1YXJ0ZXJzIiwidHdvc3VwZXJpb3IiLCJyZWdpc3RlcmVkIiwibWludXMiLCJldGgiLCJtdWx0aXBseSIsInRocmVlc3VwZXJpb3IiLCJjb3B5cmlnaHQiLCJBYWN1dGUiLCJBY2lyY3VtZmxleCIsIkFkaWVyZXNpcyIsIkFncmF2ZSIsIkFyaW5nIiwiQXRpbGRlIiwiQ2NlZGlsbGEiLCJFYWN1dGUiLCJFY2lyY3VtZmxleCIsIkVkaWVyZXNpcyIsIkVncmF2ZSIsIklhY3V0ZSIsIkljaXJjdW1mbGV4IiwiSWRpZXJlc2lzIiwiSWdyYXZlIiwiTnRpbGRlIiwiT2FjdXRlIiwiT2NpcmN1bWZsZXgiLCJPZGllcmVzaXMiLCJPZ3JhdmUiLCJPdGlsZGUiLCJTY2Fyb24iLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVkaWVyZXNpcyIsIlVncmF2ZSIsIllhY3V0ZSIsIllkaWVyZXNpcyIsIlpjYXJvbiIsImFhY3V0ZSIsImFjaXJjdW1mbGV4IiwiYWRpZXJlc2lzIiwiYWdyYXZlIiwiYXJpbmciLCJhdGlsZGUiLCJjY2VkaWxsYSIsImVhY3V0ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiZWdyYXZlIiwiaWFjdXRlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJpZ3JhdmUiLCJudGlsZGUiLCJvYWN1dGUiLCJvY2lyY3VtZmxleCIsIm9kaWVyZXNpcyIsIm9ncmF2ZSIsIm90aWxkZSIsInNjYXJvbiIsInVhY3V0ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwidWdyYXZlIiwieWFjdXRlIiwieWRpZXJlc2lzIiwiemNhcm9uIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJ6ZXJvb2xkc3R5bGUiLCJvbmVvbGRzdHlsZSIsInR3b29sZHN0eWxlIiwidGhyZWVvbGRzdHlsZSIsImZvdXJvbGRzdHlsZSIsImZpdmVvbGRzdHlsZSIsInNpeG9sZHN0eWxlIiwic2V2ZW5vbGRzdHlsZSIsImVpZ2h0b2xkc3R5bGUiLCJuaW5lb2xkc3R5bGUiLCJjb21tYXN1cGVyaW9yIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInBlcmlvZHN1cGVyaW9yIiwicXVlc3Rpb25zbWFsbCIsImFzdXBlcmlvciIsImJzdXBlcmlvciIsImNlbnRzdXBlcmlvciIsImRzdXBlcmlvciIsImVzdXBlcmlvciIsImlzdXBlcmlvciIsImxzdXBlcmlvciIsIm1zdXBlcmlvciIsIm5zdXBlcmlvciIsIm9zdXBlcmlvciIsInJzdXBlcmlvciIsInNzdXBlcmlvciIsInRzdXBlcmlvciIsImZmIiwiZmZpIiwiZmZsIiwicGFyZW5sZWZ0aW5mZXJpb3IiLCJwYXJlbnJpZ2h0aW5mZXJpb3IiLCJDaXJjdW1mbGV4c21hbGwiLCJoeXBoZW5zdXBlcmlvciIsIkdyYXZlc21hbGwiLCJBc21hbGwiLCJCc21hbGwiLCJDc21hbGwiLCJEc21hbGwiLCJFc21hbGwiLCJGc21hbGwiLCJHc21hbGwiLCJIc21hbGwiLCJJc21hbGwiLCJKc21hbGwiLCJLc21hbGwiLCJMc21hbGwiLCJNc21hbGwiLCJOc21hbGwiLCJPc21hbGwiLCJQc21hbGwiLCJRc21hbGwiLCJSc21hbGwiLCJTc21hbGwiLCJUc21hbGwiLCJVc21hbGwiLCJWc21hbGwiLCJXc21hbGwiLCJYc21hbGwiLCJZc21hbGwiLCJac21hbGwiLCJjb2xvbm1vbmV0YXJ5Iiwib25lZml0dGVkIiwicnVwaWFoIiwiVGlsZGVzbWFsbCIsImV4Y2xhbWRvd25zbWFsbCIsImNlbnRvbGRzdHlsZSIsIkxzbGFzaHNtYWxsIiwiU2Nhcm9uc21hbGwiLCJaY2Fyb25zbWFsbCIsIkRpZXJlc2lzc21hbGwiLCJCcmV2ZXNtYWxsIiwiQ2Fyb25zbWFsbCIsIkRvdGFjY2VudHNtYWxsIiwiTWFjcm9uc21hbGwiLCJmaWd1cmVkYXNoIiwiaHlwaGVuaW5mZXJpb3IiLCJPZ29uZWtzbWFsbCIsIlJpbmdzbWFsbCIsIkNlZGlsbGFzbWFsbCIsInF1ZXN0aW9uZG93bnNtYWxsIiwib25lZWlnaHRoIiwidGhyZWVlaWdodGhzIiwiZml2ZWVpZ2h0aHMiLCJzZXZlbmVpZ2h0aHMiLCJvbmV0aGlyZCIsInR3b3RoaXJkcyIsInplcm9zdXBlcmlvciIsImZvdXJzdXBlcmlvciIsImZpdmVzdXBlcmlvciIsInNpeHN1cGVyaW9yIiwic2V2ZW5zdXBlcmlvciIsImVpZ2h0c3VwZXJpb3IiLCJuaW5lc3VwZXJpb3IiLCJ6ZXJvaW5mZXJpb3IiLCJvbmVpbmZlcmlvciIsInR3b2luZmVyaW9yIiwidGhyZWVpbmZlcmlvciIsImZvdXJpbmZlcmlvciIsImZpdmVpbmZlcmlvciIsInNpeGluZmVyaW9yIiwic2V2ZW5pbmZlcmlvciIsImVpZ2h0aW5mZXJpb3IiLCJuaW5laW5mZXJpb3IiLCJjZW50aW5mZXJpb3IiLCJkb2xsYXJpbmZlcmlvciIsInBlcmlvZGluZmVyaW9yIiwiY29tbWFpbmZlcmlvciIsIkFncmF2ZXNtYWxsIiwiQWFjdXRlc21hbGwiLCJBY2lyY3VtZmxleHNtYWxsIiwiQXRpbGRlc21hbGwiLCJBZGllcmVzaXNzbWFsbCIsIkFyaW5nc21hbGwiLCJBRXNtYWxsIiwiQ2NlZGlsbGFzbWFsbCIsIkVncmF2ZXNtYWxsIiwiRWFjdXRlc21hbGwiLCJFY2lyY3VtZmxleHNtYWxsIiwiRWRpZXJlc2lzc21hbGwiLCJJZ3JhdmVzbWFsbCIsIklhY3V0ZXNtYWxsIiwiSWNpcmN1bWZsZXhzbWFsbCIsIklkaWVyZXNpc3NtYWxsIiwiRXRoc21hbGwiLCJOdGlsZGVzbWFsbCIsIk9ncmF2ZXNtYWxsIiwiT2FjdXRlc21hbGwiLCJPY2lyY3VtZmxleHNtYWxsIiwiT3RpbGRlc21hbGwiLCJPZGllcmVzaXNzbWFsbCIsIk9Fc21hbGwiLCJPc2xhc2hzbWFsbCIsIlVncmF2ZXNtYWxsIiwiVWFjdXRlc21hbGwiLCJVY2lyY3VtZmxleHNtYWxsIiwiVWRpZXJlc2lzc21hbGwiLCJZYWN1dGVzbWFsbCIsIlRob3Juc21hbGwiLCJZZGllcmVzaXNzbWFsbCIsIjAwMS4wMDAiLCIwMDEuMDAxIiwiMDAxLjAwMiIsIjAwMS4wMDMiLCJCbGFjayIsIkJvbGQiLCJCb29rIiwiTGlnaHQiLCJNZWRpdW0iLCJSZWd1bGFyIiwiUm9tYW4iLCJTZW1pYm9sZCJdO3QuQ0ZGU3RhbmRhcmRTdHJpbmdzPXM7Y29uc3Qgbz0zOTEsYz1bbnVsbCx7aWQ6ImhzdGVtIixtaW46MixzdGFja0NsZWFyaW5nOiEwLHN0ZW06ITB9LG51bGwse2lkOiJ2c3RlbSIsbWluOjIsc3RhY2tDbGVhcmluZzohMCxzdGVtOiEwfSx7aWQ6InZtb3ZldG8iLG1pbjoxLHN0YWNrQ2xlYXJpbmc6ITB9LHtpZDoicmxpbmV0byIsbWluOjIscmVzZXRTdGFjazohMH0se2lkOiJobGluZXRvIixtaW46MSxyZXNldFN0YWNrOiEwfSx7aWQ6InZsaW5ldG8iLG1pbjoxLHJlc2V0U3RhY2s6ITB9LHtpZDoicnJjdXJ2ZXRvIixtaW46NixyZXNldFN0YWNrOiEwfSxudWxsLHtpZDoiY2FsbHN1YnIiLG1pbjoxLHVuZGVmU3RhY2s6ITB9LHtpZDoicmV0dXJuIixtaW46MCx1bmRlZlN0YWNrOiEwfSxudWxsLG51bGwse2lkOiJlbmRjaGFyIixtaW46MCxzdGFja0NsZWFyaW5nOiEwfSxudWxsLG51bGwsbnVsbCx7aWQ6ImhzdGVtaG0iLG1pbjoyLHN0YWNrQ2xlYXJpbmc6ITAsc3RlbTohMH0se2lkOiJoaW50bWFzayIsbWluOjAsc3RhY2tDbGVhcmluZzohMH0se2lkOiJjbnRybWFzayIsbWluOjAsc3RhY2tDbGVhcmluZzohMH0se2lkOiJybW92ZXRvIixtaW46MixzdGFja0NsZWFyaW5nOiEwfSx7aWQ6Imhtb3ZldG8iLG1pbjoxLHN0YWNrQ2xlYXJpbmc6ITB9LHtpZDoidnN0ZW1obSIsbWluOjIsc3RhY2tDbGVhcmluZzohMCxzdGVtOiEwfSx7aWQ6InJjdXJ2ZWxpbmUiLG1pbjo4LHJlc2V0U3RhY2s6ITB9LHtpZDoicmxpbmVjdXJ2ZSIsbWluOjgscmVzZXRTdGFjazohMH0se2lkOiJ2dmN1cnZldG8iLG1pbjo0LHJlc2V0U3RhY2s6ITB9LHtpZDoiaGhjdXJ2ZXRvIixtaW46NCxyZXNldFN0YWNrOiEwfSxudWxsLHtpZDoiY2FsbGdzdWJyIixtaW46MSx1bmRlZlN0YWNrOiEwfSx7aWQ6InZoY3VydmV0byIsbWluOjQscmVzZXRTdGFjazohMH0se2lkOiJodmN1cnZldG8iLG1pbjo0LHJlc2V0U3RhY2s6ITB9XSxsPVtudWxsLG51bGwsbnVsbCx7aWQ6ImFuZCIsbWluOjIsc3RhY2tEZWx0YTotMX0se2lkOiJvciIsbWluOjIsc3RhY2tEZWx0YTotMX0se2lkOiJub3QiLG1pbjoxLHN0YWNrRGVsdGE6MH0sbnVsbCxudWxsLG51bGwse2lkOiJhYnMiLG1pbjoxLHN0YWNrRGVsdGE6MH0se2lkOiJhZGQiLG1pbjoyLHN0YWNrRGVsdGE6LTEsc3RhY2tGbihlLHQpe2VbdC0yXT1lW3QtMl0rZVt0LTFdfX0se2lkOiJzdWIiLG1pbjoyLHN0YWNrRGVsdGE6LTEsc3RhY2tGbihlLHQpe2VbdC0yXT1lW3QtMl0tZVt0LTFdfX0se2lkOiJkaXYiLG1pbjoyLHN0YWNrRGVsdGE6LTEsc3RhY2tGbihlLHQpe2VbdC0yXT1lW3QtMl0vZVt0LTFdfX0sbnVsbCx7aWQ6Im5lZyIsbWluOjEsc3RhY2tEZWx0YTowLHN0YWNrRm4oZSx0KXtlW3QtMV09LWVbdC0xXX19LHtpZDoiZXEiLG1pbjoyLHN0YWNrRGVsdGE6LTF9LG51bGwsbnVsbCx7aWQ6ImRyb3AiLG1pbjoxLHN0YWNrRGVsdGE6LTF9LG51bGwse2lkOiJwdXQiLG1pbjoyLHN0YWNrRGVsdGE6LTJ9LHtpZDoiZ2V0IixtaW46MSxzdGFja0RlbHRhOjB9LHtpZDoiaWZlbHNlIixtaW46NCxzdGFja0RlbHRhOi0zfSx7aWQ6InJhbmRvbSIsbWluOjAsc3RhY2tEZWx0YToxfSx7aWQ6Im11bCIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuKGUsdCl7ZVt0LTJdPWVbdC0yXSplW3QtMV19fSxudWxsLHtpZDoic3FydCIsbWluOjEsc3RhY2tEZWx0YTowfSx7aWQ6ImR1cCIsbWluOjEsc3RhY2tEZWx0YToxfSx7aWQ6ImV4Y2giLG1pbjoyLHN0YWNrRGVsdGE6MH0se2lkOiJpbmRleCIsbWluOjIsc3RhY2tEZWx0YTowfSx7aWQ6InJvbGwiLG1pbjozLHN0YWNrRGVsdGE6LTJ9LG51bGwsbnVsbCxudWxsLHtpZDoiaGZsZXgiLG1pbjo3LHJlc2V0U3RhY2s6ITB9LHtpZDoiZmxleCIsbWluOjEzLHJlc2V0U3RhY2s6ITB9LHtpZDoiaGZsZXgxIixtaW46OSxyZXNldFN0YWNrOiEwfSx7aWQ6ImZsZXgxIixtaW46MTEscmVzZXRTdGFjazohMH1dO3QuQ0ZGUGFyc2VyPWNsYXNzIENGRlBhcnNlcntjb25zdHJ1Y3RvcihlLHQsYSl7dGhpcy5ieXRlcz1lLmdldEJ5dGVzKCk7dGhpcy5wcm9wZXJ0aWVzPXQ7dGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkPSEhYX1wYXJzZSgpe2NvbnN0IGU9dGhpcy5wcm9wZXJ0aWVzLHQ9bmV3IENGRjt0aGlzLmNmZj10O2NvbnN0IGE9dGhpcy5wYXJzZUhlYWRlcigpLHI9dGhpcy5wYXJzZUluZGV4KGEuZW5kUG9zKSxuPXRoaXMucGFyc2VJbmRleChyLmVuZFBvcyksaT10aGlzLnBhcnNlSW5kZXgobi5lbmRQb3MpLHM9dGhpcy5wYXJzZUluZGV4KGkuZW5kUG9zKSxvPXRoaXMucGFyc2VEaWN0KG4ub2JqLmdldCgwKSksYz10aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCxvLHQuc3RyaW5ncyk7dC5oZWFkZXI9YS5vYmo7dC5uYW1lcz10aGlzLnBhcnNlTmFtZUluZGV4KHIub2JqKTt0LnN0cmluZ3M9dGhpcy5wYXJzZVN0cmluZ0luZGV4KGkub2JqKTt0LnRvcERpY3Q9Yzt0Lmdsb2JhbFN1YnJJbmRleD1zLm9iajt0aGlzLnBhcnNlUHJpdmF0ZURpY3QodC50b3BEaWN0KTt0LmlzQ0lERm9udD1jLmhhc05hbWUoIlJPUyIpO2NvbnN0IGw9Yy5nZXRCeU5hbWUoIkNoYXJTdHJpbmdzIiksaD10aGlzLnBhcnNlSW5kZXgobCkub2JqLHU9Yy5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTt1JiYoZS5mb250TWF0cml4PXUpO2NvbnN0IGQ9Yy5nZXRCeU5hbWUoIkZvbnRCQm94Iik7aWYoZCl7ZS5hc2NlbnQ9TWF0aC5tYXgoZFszXSxkWzFdKTtlLmRlc2NlbnQ9TWF0aC5taW4oZFsxXSxkWzNdKTtlLmFzY2VudFNjYWxlZD0hMH1sZXQgZixnO2lmKHQuaXNDSURGb250KXtjb25zdCBlPXRoaXMucGFyc2VJbmRleChjLmdldEJ5TmFtZSgiRkRBcnJheSIpKS5vYmo7Zm9yKGxldCBhPTAscj1lLmNvdW50O2E8cjsrK2Epe2NvbnN0IHI9ZS5nZXQoYSksbj10aGlzLmNyZWF0ZURpY3QoQ0ZGVG9wRGljdCx0aGlzLnBhcnNlRGljdChyKSx0LnN0cmluZ3MpO3RoaXMucGFyc2VQcml2YXRlRGljdChuKTt0LmZkQXJyYXkucHVzaChuKX1nPW51bGw7Zj10aGlzLnBhcnNlQ2hhcnNldHMoYy5nZXRCeU5hbWUoImNoYXJzZXQiKSxoLmNvdW50LHQuc3RyaW5ncywhMCk7dC5mZFNlbGVjdD10aGlzLnBhcnNlRkRTZWxlY3QoYy5nZXRCeU5hbWUoIkZEU2VsZWN0IiksaC5jb3VudCl9ZWxzZXtmPXRoaXMucGFyc2VDaGFyc2V0cyhjLmdldEJ5TmFtZSgiY2hhcnNldCIpLGguY291bnQsdC5zdHJpbmdzLCExKTtnPXRoaXMucGFyc2VFbmNvZGluZyhjLmdldEJ5TmFtZSgiRW5jb2RpbmciKSxlLHQuc3RyaW5ncyxmLmNoYXJzZXQpfXQuY2hhcnNldD1mO3QuZW5jb2Rpbmc9Zztjb25zdCBwPXRoaXMucGFyc2VDaGFyU3RyaW5ncyh7Y2hhclN0cmluZ3M6aCxsb2NhbFN1YnJJbmRleDpjLnByaXZhdGVEaWN0LnN1YnJzSW5kZXgsZ2xvYmFsU3VickluZGV4OnMub2JqLGZkU2VsZWN0OnQuZmRTZWxlY3QsZmRBcnJheTp0LmZkQXJyYXkscHJpdmF0ZURpY3Q6Yy5wcml2YXRlRGljdH0pO3QuY2hhclN0cmluZ3M9cC5jaGFyU3RyaW5nczt0LnNlYWNzPXAuc2VhY3M7dC53aWR0aHM9cC53aWR0aHM7cmV0dXJuIHR9cGFyc2VIZWFkZXIoKXtsZXQgZT10aGlzLmJ5dGVzO2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IGE9MDtmb3IoO2E8dCYmMSE9PWVbYV07KSsrYTtpZihhPj10KXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJJbnZhbGlkIENGRiBoZWFkZXIiKTtpZigwIT09YSl7KDAsci5pbmZvKSgiY2ZmIGRhdGEgaXMgc2hpZnRlZCIpO2U9ZS5zdWJhcnJheShhKTt0aGlzLmJ5dGVzPWV9Y29uc3Qgbj1lWzBdLGk9ZVsxXSxzPWVbMl0sbz1lWzNdO3JldHVybntvYmo6bmV3IENGRkhlYWRlcihuLGkscyxvKSxlbmRQb3M6c319cGFyc2VEaWN0KGUpe2xldCB0PTA7ZnVuY3Rpb24gcGFyc2VPcGVyYW5kKCl7bGV0IGE9ZVt0KytdO2lmKDMwPT09YSlyZXR1cm4gZnVuY3Rpb24gcGFyc2VGbG9hdE9wZXJhbmQoKXtsZXQgYT0iIjtjb25zdCByPTE1LG49WyIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiLiIsIkUiLCJFLSIsbnVsbCwiLSJdLGk9ZS5sZW5ndGg7Zm9yKDt0PGk7KXtjb25zdCBpPWVbdCsrXSxzPWk+PjQsbz0xNSZpO2lmKHM9PT1yKWJyZWFrO2ErPW5bc107aWYobz09PXIpYnJlYWs7YSs9bltvXX1yZXR1cm4gcGFyc2VGbG9hdChhKX0oKTtpZigyOD09PWEpe2E9ZVt0KytdO2E9KGE8PDI0fGVbdCsrXTw8MTYpPj4xNjtyZXR1cm4gYX1pZigyOT09PWEpe2E9ZVt0KytdO2E9YTw8OHxlW3QrK107YT1hPDw4fGVbdCsrXTthPWE8PDh8ZVt0KytdO3JldHVybiBhfWlmKGE+PTMyJiZhPD0yNDYpcmV0dXJuIGEtMTM5O2lmKGE+PTI0NyYmYTw9MjUwKXJldHVybiAyNTYqKGEtMjQ3KStlW3QrK10rMTA4O2lmKGE+PTI1MSYmYTw9MjU0KXJldHVybi0yNTYqKGEtMjUxKS1lW3QrK10tMTA4OygwLHIud2FybikoJ0NGRlBhcnNlcl9wYXJzZURpY3Q6ICInK2ErJyIgaXMgYSByZXNlcnZlZCBjb21tYW5kLicpO3JldHVybiBOYU59bGV0IGE9W107Y29uc3Qgbj1bXTt0PTA7Y29uc3QgaT1lLmxlbmd0aDtmb3IoO3Q8aTspe2xldCByPWVbdF07aWYocjw9MjEpezEyPT09ciYmKHI9cjw8OHxlWysrdF0pO24ucHVzaChbcixhXSk7YT1bXTsrK3R9ZWxzZSBhLnB1c2gocGFyc2VPcGVyYW5kKCkpfXJldHVybiBufXBhcnNlSW5kZXgoZSl7Y29uc3QgdD1uZXcgQ0ZGSW5kZXgsYT10aGlzLmJ5dGVzLHI9YVtlKytdPDw4fGFbZSsrXSxuPVtdO2xldCBpLHMsbz1lO2lmKDAhPT1yKXtjb25zdCB0PWFbZSsrXSxjPWUrKHIrMSkqdC0xO2ZvcihpPTAscz1yKzE7aTxzOysraSl7bGV0IHI9MDtmb3IobGV0IG49MDtuPHQ7KytuKXtyPDw9ODtyKz1hW2UrK119bi5wdXNoKGMrcil9bz1uW3JdfWZvcihpPTAscz1uLmxlbmd0aC0xO2k8czsrK2kpe2NvbnN0IGU9bltpXSxyPW5baSsxXTt0LmFkZChhLnN1YmFycmF5KGUscikpfXJldHVybntvYmo6dCxlbmRQb3M6b319cGFyc2VOYW1lSW5kZXgoZSl7Y29uc3QgdD1bXTtmb3IobGV0IGE9MCxuPWUuY291bnQ7YTxuOysrYSl7Y29uc3Qgbj1lLmdldChhKTt0LnB1c2goKDAsci5ieXRlc1RvU3RyaW5nKShuKSl9cmV0dXJuIHR9cGFyc2VTdHJpbmdJbmRleChlKXtjb25zdCB0PW5ldyBDRkZTdHJpbmdzO2ZvcihsZXQgYT0wLG49ZS5jb3VudDthPG47KythKXtjb25zdCBuPWUuZ2V0KGEpO3QuYWRkKCgwLHIuYnl0ZXNUb1N0cmluZykobikpfXJldHVybiB0fWNyZWF0ZURpY3QoZSx0LGEpe2NvbnN0IHI9bmV3IGUoYSk7Zm9yKGNvbnN0W2UsYV1vZiB0KXIuc2V0QnlLZXkoZSxhKTtyZXR1cm4gcn1wYXJzZUNoYXJTdHJpbmcoZSx0LGEsbil7aWYoIXR8fGUuY2FsbERlcHRoPjEwKXJldHVybiExO2xldCBpPWUuc3RhY2tTaXplO2NvbnN0IHM9ZS5zdGFjaztsZXQgbz10Lmxlbmd0aDtmb3IobGV0IGg9MDtoPG87KXtjb25zdCB1PXRbaCsrXTtsZXQgZD1udWxsO2lmKDEyPT09dSl7Y29uc3QgZT10W2grK107aWYoMD09PWUpe3RbaC0yXT0xMzk7dFtoLTFdPTIyO2k9MH1lbHNlIGQ9bFtlXX1lbHNlIGlmKDI4PT09dSl7c1tpXT0odFtoXTw8MjR8dFtoKzFdPDwxNik+PjE2O2grPTI7aSsrfWVsc2UgaWYoMTQ9PT11KXtpZihpPj00KXtpLT00O2lmKHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCl7ZS5zZWFjPXMuc2xpY2UoaSxpKzQpO3JldHVybiExfX1kPWNbdV19ZWxzZSBpZih1Pj0zMiYmdTw9MjQ2KXtzW2ldPXUtMTM5O2krK31lbHNlIGlmKHU+PTI0NyYmdTw9MjU0KXtzW2ldPXU8MjUxPyh1LTI0Nzw8OCkrdFtoXSsxMDg6LSh1LTI1MTw8OCktdFtoXS0xMDg7aCsrO2krK31lbHNlIGlmKDI1NT09PXUpe3NbaV09KHRbaF08PDI0fHRbaCsxXTw8MTZ8dFtoKzJdPDw4fHRbaCszXSkvNjU1MzY7aCs9NDtpKyt9ZWxzZSBpZigxOT09PXV8fDIwPT09dSl7ZS5oaW50cys9aT4+MTtpZigwPT09ZS5oaW50cyl7dC5jb3B5V2l0aGluKGgtMSxoLC0xKTtoLT0xO28tPTE7Y29udGludWV9aCs9ZS5oaW50cys3Pj4zO2klPTI7ZD1jW3VdfWVsc2V7aWYoMTA9PT11fHwyOT09PXUpe2NvbnN0IHQ9MTA9PT11P2E6bjtpZighdCl7ZD1jW3VdOygwLHIud2FybikoIk1pc3Npbmcgc3VicnNJbmRleCBmb3IgIitkLmlkKTtyZXR1cm4hMX1sZXQgbz0zMjc2ODt0LmNvdW50PDEyNDA/bz0xMDc6dC5jb3VudDwzMzkwMCYmKG89MTEzMSk7Y29uc3QgbD1zWy0taV0rbztpZihsPDB8fGw+PXQuY291bnR8fGlzTmFOKGwpKXtkPWNbdV07KDAsci53YXJuKSgiT3V0IG9mIGJvdW5kcyBzdWJySW5kZXggZm9yICIrZC5pZCk7cmV0dXJuITF9ZS5zdGFja1NpemU9aTtlLmNhbGxEZXB0aCsrO2lmKCF0aGlzLnBhcnNlQ2hhclN0cmluZyhlLHQuZ2V0KGwpLGEsbikpcmV0dXJuITE7ZS5jYWxsRGVwdGgtLTtpPWUuc3RhY2tTaXplO2NvbnRpbnVlfWlmKDExPT09dSl7ZS5zdGFja1NpemU9aTtyZXR1cm4hMH1pZigwPT09dSYmaD09PXQubGVuZ3RoKXt0W2gtMV09MTQ7ZD1jWzE0XX1lbHNle2lmKDk9PT11KXt0LmNvcHlXaXRoaW4oaC0xLGgsLTEpO2gtPTE7by09MTtjb250aW51ZX1kPWNbdV19fWlmKGQpe2lmKGQuc3RlbSl7ZS5oaW50cys9aT4+MTtpZigzPT09dXx8MjM9PT11KWUuaGFzVlN0ZW1zPSEwO2Vsc2UgaWYoZS5oYXNWU3RlbXMmJigxPT09dXx8MTg9PT11KSl7KDAsci53YXJuKSgiQ0ZGIHN0ZW0gaGludHMgYXJlIGluIHdyb25nIG9yZGVyIik7dFtoLTFdPTE9PT11PzM6MjN9fWlmKCJtaW4iaW4gZCYmIWUudW5kZWZTdGFjayYmaTxkLm1pbil7KDAsci53YXJuKSgiTm90IGVub3VnaCBwYXJhbWV0ZXJzIGZvciAiK2QuaWQrIjsgYWN0dWFsOiAiK2krIiwgZXhwZWN0ZWQ6ICIrZC5taW4pO2lmKDA9PT1pKXt0W2gtMV09MTQ7cmV0dXJuITB9cmV0dXJuITF9aWYoZS5maXJzdFN0YWNrQ2xlYXJpbmcmJmQuc3RhY2tDbGVhcmluZyl7ZS5maXJzdFN0YWNrQ2xlYXJpbmc9ITE7aS09ZC5taW47aT49MiYmZC5zdGVtP2klPTI6aT4xJiYoMCxyLndhcm4pKCJGb3VuZCB0b28gbWFueSBwYXJhbWV0ZXJzIGZvciBzdGFjay1jbGVhcmluZyBjb21tYW5kIik7aT4wJiYoZS53aWR0aD1zW2ktMV0pfWlmKCJzdGFja0RlbHRhImluIGQpeyJzdGFja0ZuImluIGQmJmQuc3RhY2tGbihzLGkpO2krPWQuc3RhY2tEZWx0YX1lbHNlIGlmKGQuc3RhY2tDbGVhcmluZylpPTA7ZWxzZSBpZihkLnJlc2V0U3RhY2spe2k9MDtlLnVuZGVmU3RhY2s9ITF9ZWxzZSBpZihkLnVuZGVmU3RhY2spe2k9MDtlLnVuZGVmU3RhY2s9ITA7ZS5maXJzdFN0YWNrQ2xlYXJpbmc9ITF9fX1vPHQubGVuZ3RoJiZ0LmZpbGwoMTQsbyk7ZS5zdGFja1NpemU9aTtyZXR1cm4hMH1wYXJzZUNoYXJTdHJpbmdzKGUpe2xldHtjaGFyU3RyaW5nczp0LGxvY2FsU3VickluZGV4OmEsZ2xvYmFsU3VickluZGV4Om4sZmRTZWxlY3Q6aSxmZEFycmF5OnMscHJpdmF0ZURpY3Q6b309ZTtjb25zdCBjPVtdLGw9W10saD10LmNvdW50O2ZvcihsZXQgZT0wO2U8aDtlKyspe2NvbnN0IGg9dC5nZXQoZSksdT17Y2FsbERlcHRoOjAsc3RhY2tTaXplOjAsc3RhY2s6W10sdW5kZWZTdGFjazohMCxoaW50czowLGZpcnN0U3RhY2tDbGVhcmluZzohMCxzZWFjOm51bGwsd2lkdGg6bnVsbCxoYXNWU3RlbXM6ITF9O2xldCBkPSEwLGY9bnVsbCxnPW87aWYoaSYmcy5sZW5ndGgpe2NvbnN0IHQ9aS5nZXRGREluZGV4KGUpO2lmKC0xPT09dCl7KDAsci53YXJuKSgiR2x5cGggaW5kZXggaXMgbm90IGluIGZkIHNlbGVjdC4iKTtkPSExfWlmKHQ+PXMubGVuZ3RoKXsoMCxyLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTtkPSExfWlmKGQpe2c9c1t0XS5wcml2YXRlRGljdDtmPWcuc3VicnNJbmRleH19ZWxzZSBhJiYoZj1hKTtkJiYoZD10aGlzLnBhcnNlQ2hhclN0cmluZyh1LGgsZixuKSk7aWYobnVsbCE9PXUud2lkdGgpe2NvbnN0IHQ9Zy5nZXRCeU5hbWUoIm5vbWluYWxXaWR0aFgiKTtsW2VdPXQrdS53aWR0aH1lbHNle2NvbnN0IHQ9Zy5nZXRCeU5hbWUoImRlZmF1bHRXaWR0aFgiKTtsW2VdPXR9bnVsbCE9PXUuc2VhYyYmKGNbZV09dS5zZWFjKTtkfHx0LnNldChlLG5ldyBVaW50OEFycmF5KFsxNF0pKX1yZXR1cm57Y2hhclN0cmluZ3M6dCxzZWFjczpjLHdpZHRoczpsfX1lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KGUpe2NvbnN0IHQ9dGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LFtdLGUuc3RyaW5ncyk7ZS5zZXRCeUtleSgxOCxbMCwwXSk7ZS5wcml2YXRlRGljdD10fXBhcnNlUHJpdmF0ZURpY3QoZSl7aWYoIWUuaGFzTmFtZSgiUHJpdmF0ZSIpKXt0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkoZSk7cmV0dXJufWNvbnN0IHQ9ZS5nZXRCeU5hbWUoIlByaXZhdGUiKTtpZighQXJyYXkuaXNBcnJheSh0KXx8MiE9PXQubGVuZ3RoKXtlLnJlbW92ZUJ5TmFtZSgiUHJpdmF0ZSIpO3JldHVybn1jb25zdCBhPXRbMF0scj10WzFdO2lmKDA9PT1hfHxyPj10aGlzLmJ5dGVzLmxlbmd0aCl7dGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KGUpO3JldHVybn1jb25zdCBuPXIrYSxpPXRoaXMuYnl0ZXMuc3ViYXJyYXkocixuKSxzPXRoaXMucGFyc2VEaWN0KGkpLG89dGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LHMsZS5zdHJpbmdzKTtlLnByaXZhdGVEaWN0PW87MD09PW8uZ2V0QnlOYW1lKCJFeHBhbnNpb25GYWN0b3IiKSYmby5zZXRCeU5hbWUoIkV4cGFuc2lvbkZhY3RvciIsLjA2KTtpZighby5nZXRCeU5hbWUoIlN1YnJzIikpcmV0dXJuO2NvbnN0IGM9by5nZXRCeU5hbWUoIlN1YnJzIiksbD1yK2M7aWYoMD09PWN8fGw+PXRoaXMuYnl0ZXMubGVuZ3RoKXt0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkoZSk7cmV0dXJufWNvbnN0IGg9dGhpcy5wYXJzZUluZGV4KGwpO28uc3VicnNJbmRleD1oLm9ian1wYXJzZUNoYXJzZXRzKGUsdCxhLGkpe2lmKDA9PT1lKXJldHVybiBuZXcgQ0ZGQ2hhcnNldCghMCxkLklTT19BRE9CRSxuLklTT0Fkb2JlQ2hhcnNldCk7aWYoMT09PWUpcmV0dXJuIG5ldyBDRkZDaGFyc2V0KCEwLGQuRVhQRVJULG4uRXhwZXJ0Q2hhcnNldCk7aWYoMj09PWUpcmV0dXJuIG5ldyBDRkZDaGFyc2V0KCEwLGQuRVhQRVJUX1NVQlNFVCxuLkV4cGVydFN1YnNldENoYXJzZXQpO2NvbnN0IHM9dGhpcy5ieXRlcyxvPWUsYz1zW2UrK10sbD1baT8wOiIubm90ZGVmIl07bGV0IGgsdSxmO3QtPTE7c3dpdGNoKGMpe2Nhc2UgMDpmb3IoZj0wO2Y8dDtmKyspe2g9c1tlKytdPDw4fHNbZSsrXTtsLnB1c2goaT9oOmEuZ2V0KGgpKX1icmVhaztjYXNlIDE6Zm9yKDtsLmxlbmd0aDw9dDspe2g9c1tlKytdPDw4fHNbZSsrXTt1PXNbZSsrXTtmb3IoZj0wO2Y8PXU7ZisrKWwucHVzaChpP2grKzphLmdldChoKyspKX1icmVhaztjYXNlIDI6Zm9yKDtsLmxlbmd0aDw9dDspe2g9c1tlKytdPDw4fHNbZSsrXTt1PXNbZSsrXTw8OHxzW2UrK107Zm9yKGY9MDtmPD11O2YrKylsLnB1c2goaT9oKys6YS5nZXQoaCsrKSl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiVW5rbm93biBjaGFyc2V0IGZvcm1hdCIpfWNvbnN0IGc9ZSxwPXMuc3ViYXJyYXkobyxnKTtyZXR1cm4gbmV3IENGRkNoYXJzZXQoITEsYyxsLHApfXBhcnNlRW5jb2RpbmcoZSx0LGEsbil7Y29uc3Qgcz1PYmplY3QuY3JlYXRlKG51bGwpLG89dGhpcy5ieXRlcztsZXQgYyxsLGgsdT0hMSxkPW51bGw7aWYoMD09PWV8fDE9PT1lKXt1PSEwO2M9ZTtjb25zdCB0PWU/aS5FeHBlcnRFbmNvZGluZzppLlN0YW5kYXJkRW5jb2Rpbmc7Zm9yKGw9MCxoPW4ubGVuZ3RoO2w8aDtsKyspe2NvbnN0IGU9dC5pbmRleE9mKG5bbF0pOy0xIT09ZSYmKHNbZV09bCl9fWVsc2V7Y29uc3QgdD1lO2M9b1tlKytdO3N3aXRjaCgxMjcmYyl7Y2FzZSAwOmNvbnN0IHQ9b1tlKytdO2ZvcihsPTE7bDw9dDtsKyspc1tvW2UrK11dPWw7YnJlYWs7Y2FzZSAxOmNvbnN0IGE9b1tlKytdO2xldCBuPTE7Zm9yKGw9MDtsPGE7bCsrKXtjb25zdCB0PW9bZSsrXSxhPW9bZSsrXTtmb3IobGV0IGU9dDtlPD10K2E7ZSsrKXNbZV09bisrfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYFVua25vd24gZW5jb2RpbmcgZm9ybWF0OiAke2N9IGluIENGRmApfWNvbnN0IGk9ZTtpZigxMjgmYyl7b1t0XSY9MTI3OyFmdW5jdGlvbiByZWFkU3VwcGxlbWVudCgpe2NvbnN0IHQ9b1tlKytdO2ZvcihsPTA7bDx0O2wrKyl7Y29uc3QgdD1vW2UrK10scj0ob1tlKytdPDw4KSsoMjU1Jm9bZSsrXSk7c1t0XT1uLmluZGV4T2YoYS5nZXQocikpfX0oKX1kPW8uc3ViYXJyYXkodCxpKX1jJj0xMjc7cmV0dXJuIG5ldyBDRkZFbmNvZGluZyh1LGMscyxkKX1wYXJzZUZEU2VsZWN0KGUsdCl7Y29uc3QgYT10aGlzLmJ5dGVzLG49YVtlKytdLGk9W107bGV0IHM7c3dpdGNoKG4pe2Nhc2UgMDpmb3Iocz0wO3M8dDsrK3Mpe2NvbnN0IHQ9YVtlKytdO2kucHVzaCh0KX1icmVhaztjYXNlIDM6Y29uc3Qgbz1hW2UrK108PDh8YVtlKytdO2ZvcihzPTA7czxvOysrcyl7bGV0IHQ9YVtlKytdPDw4fGFbZSsrXTtpZigwPT09cyYmMCE9PXQpeygwLHIud2FybikoInBhcnNlRkRTZWxlY3Q6IFRoZSBmaXJzdCByYW5nZSBtdXN0IGhhdmUgYSBmaXJzdCBHSUQgb2YgMCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4iKTt0PTB9Y29uc3Qgbj1hW2UrK10sbz1hW2VdPDw4fGFbZSsxXTtmb3IobGV0IGU9dDtlPG87KytlKWkucHVzaChuKX1lKz0yO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYHBhcnNlRkRTZWxlY3Q6IFVua25vd24gZm9ybWF0ICIke259Ii5gKX1pZihpLmxlbmd0aCE9PXQpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoInBhcnNlRkRTZWxlY3Q6IEludmFsaWQgZm9udCBkYXRhLiIpO3JldHVybiBuZXcgQ0ZGRkRTZWxlY3QobixpKX19O2NsYXNzIENGRntjb25zdHJ1Y3Rvcigpe3RoaXMuaGVhZGVyPW51bGw7dGhpcy5uYW1lcz1bXTt0aGlzLnRvcERpY3Q9bnVsbDt0aGlzLnN0cmluZ3M9bmV3IENGRlN0cmluZ3M7dGhpcy5nbG9iYWxTdWJySW5kZXg9bnVsbDt0aGlzLmVuY29kaW5nPW51bGw7dGhpcy5jaGFyc2V0PW51bGw7dGhpcy5jaGFyU3RyaW5ncz1udWxsO3RoaXMuZmRBcnJheT1bXTt0aGlzLmZkU2VsZWN0PW51bGw7dGhpcy5pc0NJREZvbnQ9ITF9ZHVwbGljYXRlRmlyc3RHbHlwaCgpe2lmKHRoaXMuY2hhclN0cmluZ3MuY291bnQ+PTY1NTM1KXsoMCxyLndhcm4pKCJOb3QgZW5vdWdoIHNwYWNlIGluIGNoYXJzdHJpbmdzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTtyZXR1cm59Y29uc3QgZT10aGlzLmNoYXJTdHJpbmdzLmdldCgwKTt0aGlzLmNoYXJTdHJpbmdzLmFkZChlKTt0aGlzLmlzQ0lERm9udCYmdGhpcy5mZFNlbGVjdC5mZFNlbGVjdC5wdXNoKHRoaXMuZmRTZWxlY3QuZmRTZWxlY3RbMF0pfWhhc0dseXBoSWQoZSl7aWYoZTwwfHxlPj10aGlzLmNoYXJTdHJpbmdzLmNvdW50KXJldHVybiExO3JldHVybiB0aGlzLmNoYXJTdHJpbmdzLmdldChlKS5sZW5ndGg+MH19dC5DRkY9Q0ZGO2NsYXNzIENGRkhlYWRlcntjb25zdHJ1Y3RvcihlLHQsYSxyKXt0aGlzLm1ham9yPWU7dGhpcy5taW5vcj10O3RoaXMuaGRyU2l6ZT1hO3RoaXMub2ZmU2l6ZT1yfX10LkNGRkhlYWRlcj1DRkZIZWFkZXI7Y2xhc3MgQ0ZGU3RyaW5nc3tjb25zdHJ1Y3Rvcigpe3RoaXMuc3RyaW5ncz1bXX1nZXQoZSl7cmV0dXJuIGU+PTAmJmU8PTM5MD9zW2VdOmUtbzw9dGhpcy5zdHJpbmdzLmxlbmd0aD90aGlzLnN0cmluZ3NbZS1vXTpzWzBdfWdldFNJRChlKXtsZXQgdD1zLmluZGV4T2YoZSk7aWYoLTEhPT10KXJldHVybiB0O3Q9dGhpcy5zdHJpbmdzLmluZGV4T2YoZSk7cmV0dXJuLTEhPT10P3QrbzotMX1hZGQoZSl7dGhpcy5zdHJpbmdzLnB1c2goZSl9Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMuc3RyaW5ncy5sZW5ndGh9fXQuQ0ZGU3RyaW5ncz1DRkZTdHJpbmdzO2NsYXNzIENGRkluZGV4e2NvbnN0cnVjdG9yKCl7dGhpcy5vYmplY3RzPVtdO3RoaXMubGVuZ3RoPTB9YWRkKGUpe3RoaXMubGVuZ3RoKz1lLmxlbmd0aDt0aGlzLm9iamVjdHMucHVzaChlKX1zZXQoZSx0KXt0aGlzLmxlbmd0aCs9dC5sZW5ndGgtdGhpcy5vYmplY3RzW2VdLmxlbmd0aDt0aGlzLm9iamVjdHNbZV09dH1nZXQoZSl7cmV0dXJuIHRoaXMub2JqZWN0c1tlXX1nZXQgY291bnQoKXtyZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aH19dC5DRkZJbmRleD1DRkZJbmRleDtjbGFzcyBDRkZEaWN0e2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5rZXlUb05hbWVNYXA9ZS5rZXlUb05hbWVNYXA7dGhpcy5uYW1lVG9LZXlNYXA9ZS5uYW1lVG9LZXlNYXA7dGhpcy5kZWZhdWx0cz1lLmRlZmF1bHRzO3RoaXMudHlwZXM9ZS50eXBlczt0aGlzLm9wY29kZXM9ZS5vcGNvZGVzO3RoaXMub3JkZXI9ZS5vcmRlcjt0aGlzLnN0cmluZ3M9dDt0aGlzLnZhbHVlcz1PYmplY3QuY3JlYXRlKG51bGwpfXNldEJ5S2V5KGUsdCl7aWYoIShlIGluIHRoaXMua2V5VG9OYW1lTWFwKSlyZXR1cm4hMTtpZigwPT09dC5sZW5ndGgpcmV0dXJuITA7Zm9yKGNvbnN0IGEgb2YgdClpZihpc05hTihhKSl7KDAsci53YXJuKShgSW52YWxpZCBDRkZEaWN0IHZhbHVlOiAiJHt0fSIgZm9yIGtleSAiJHtlfSIuYCk7cmV0dXJuITB9Y29uc3QgYT10aGlzLnR5cGVzW2VdOyJudW0iIT09YSYmInNpZCIhPT1hJiYib2Zmc2V0IiE9PWF8fCh0PXRbMF0pO3RoaXMudmFsdWVzW2VdPXQ7cmV0dXJuITB9c2V0QnlOYW1lKGUsdCl7aWYoIShlIGluIHRoaXMubmFtZVRvS2V5TWFwKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgIiR7ZX0iYCk7dGhpcy52YWx1ZXNbdGhpcy5uYW1lVG9LZXlNYXBbZV1dPXR9aGFzTmFtZShlKXtyZXR1cm4gdGhpcy5uYW1lVG9LZXlNYXBbZV1pbiB0aGlzLnZhbHVlc31nZXRCeU5hbWUoZSl7aWYoIShlIGluIHRoaXMubmFtZVRvS2V5TWFwKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgJHtlfSJgKTtjb25zdCB0PXRoaXMubmFtZVRvS2V5TWFwW2VdO3JldHVybiB0IGluIHRoaXMudmFsdWVzP3RoaXMudmFsdWVzW3RdOnRoaXMuZGVmYXVsdHNbdF19cmVtb3ZlQnlOYW1lKGUpe2RlbGV0ZSB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtlXV19c3RhdGljIGNyZWF0ZVRhYmxlcyhlKXtjb25zdCB0PXtrZXlUb05hbWVNYXA6e30sbmFtZVRvS2V5TWFwOnt9LGRlZmF1bHRzOnt9LHR5cGVzOnt9LG9wY29kZXM6e30sb3JkZXI6W119O2Zvcihjb25zdCBhIG9mIGUpe2NvbnN0IGU9QXJyYXkuaXNBcnJheShhWzBdKT8oYVswXVswXTw8OCkrYVswXVsxXTphWzBdO3Qua2V5VG9OYW1lTWFwW2VdPWFbMV07dC5uYW1lVG9LZXlNYXBbYVsxXV09ZTt0LnR5cGVzW2VdPWFbMl07dC5kZWZhdWx0c1tlXT1hWzNdO3Qub3Bjb2Rlc1tlXT1BcnJheS5pc0FycmF5KGFbMF0pP2FbMF06W2FbMF1dO3Qub3JkZXIucHVzaChlKX1yZXR1cm4gdH19Y29uc3QgaD1bW1sxMiwzMF0sIlJPUyIsWyJzaWQiLCJzaWQiLCJudW0iXSxudWxsXSxbWzEyLDIwXSwiU3ludGhldGljQmFzZSIsIm51bSIsbnVsbF0sWzAsInZlcnNpb24iLCJzaWQiLG51bGxdLFsxLCJOb3RpY2UiLCJzaWQiLG51bGxdLFtbMTIsMF0sIkNvcHlyaWdodCIsInNpZCIsbnVsbF0sWzIsIkZ1bGxOYW1lIiwic2lkIixudWxsXSxbMywiRmFtaWx5TmFtZSIsInNpZCIsbnVsbF0sWzQsIldlaWdodCIsInNpZCIsbnVsbF0sW1sxMiwxXSwiaXNGaXhlZFBpdGNoIiwibnVtIiwwXSxbWzEyLDJdLCJJdGFsaWNBbmdsZSIsIm51bSIsMF0sW1sxMiwzXSwiVW5kZXJsaW5lUG9zaXRpb24iLCJudW0iLC0xMDBdLFtbMTIsNF0sIlVuZGVybGluZVRoaWNrbmVzcyIsIm51bSIsNTBdLFtbMTIsNV0sIlBhaW50VHlwZSIsIm51bSIsMF0sW1sxMiw2XSwiQ2hhcnN0cmluZ1R5cGUiLCJudW0iLDJdLFtbMTIsN10sIkZvbnRNYXRyaXgiLFsibnVtIiwibnVtIiwibnVtIiwibnVtIiwibnVtIiwibnVtIl0sWy4wMDEsMCwwLC4wMDEsMCwwXV0sWzEzLCJVbmlxdWVJRCIsIm51bSIsbnVsbF0sWzUsIkZvbnRCQm94IixbIm51bSIsIm51bSIsIm51bSIsIm51bSJdLFswLDAsMCwwXV0sW1sxMiw4XSwiU3Ryb2tlV2lkdGgiLCJudW0iLDBdLFsxNCwiWFVJRCIsImFycmF5IixudWxsXSxbMTUsImNoYXJzZXQiLCJvZmZzZXQiLDBdLFsxNiwiRW5jb2RpbmciLCJvZmZzZXQiLDBdLFsxNywiQ2hhclN0cmluZ3MiLCJvZmZzZXQiLDBdLFsxOCwiUHJpdmF0ZSIsWyJvZmZzZXQiLCJvZmZzZXQiXSxudWxsXSxbWzEyLDIxXSwiUG9zdFNjcmlwdCIsInNpZCIsbnVsbF0sW1sxMiwyMl0sIkJhc2VGb250TmFtZSIsInNpZCIsbnVsbF0sW1sxMiwyM10sIkJhc2VGb250QmxlbmQiLCJkZWx0YSIsbnVsbF0sW1sxMiwzMV0sIkNJREZvbnRWZXJzaW9uIiwibnVtIiwwXSxbWzEyLDMyXSwiQ0lERm9udFJldmlzaW9uIiwibnVtIiwwXSxbWzEyLDMzXSwiQ0lERm9udFR5cGUiLCJudW0iLDBdLFtbMTIsMzRdLCJDSURDb3VudCIsIm51bSIsODcyMF0sW1sxMiwzNV0sIlVJREJhc2UiLCJudW0iLG51bGxdLFtbMTIsMzddLCJGRFNlbGVjdCIsIm9mZnNldCIsbnVsbF0sW1sxMiwzNl0sIkZEQXJyYXkiLCJvZmZzZXQiLG51bGxdLFtbMTIsMzhdLCJGb250TmFtZSIsInNpZCIsbnVsbF1dO2NsYXNzIENGRlRvcERpY3QgZXh0ZW5kcyBDRkZEaWN0e3N0YXRpYyBnZXQgdGFibGVzKCl7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsInRhYmxlcyIsdGhpcy5jcmVhdGVUYWJsZXMoaCkpfWNvbnN0cnVjdG9yKGUpe3N1cGVyKENGRlRvcERpY3QudGFibGVzLGUpO3RoaXMucHJpdmF0ZURpY3Q9bnVsbH19dC5DRkZUb3BEaWN0PUNGRlRvcERpY3Q7Y29uc3QgdT1bWzYsIkJsdWVWYWx1ZXMiLCJkZWx0YSIsbnVsbF0sWzcsIk90aGVyQmx1ZXMiLCJkZWx0YSIsbnVsbF0sWzgsIkZhbWlseUJsdWVzIiwiZGVsdGEiLG51bGxdLFs5LCJGYW1pbHlPdGhlckJsdWVzIiwiZGVsdGEiLG51bGxdLFtbMTIsOV0sIkJsdWVTY2FsZSIsIm51bSIsLjAzOTYyNV0sW1sxMiwxMF0sIkJsdWVTaGlmdCIsIm51bSIsN10sW1sxMiwxMV0sIkJsdWVGdXp6IiwibnVtIiwxXSxbMTAsIlN0ZEhXIiwibnVtIixudWxsXSxbMTEsIlN0ZFZXIiwibnVtIixudWxsXSxbWzEyLDEyXSwiU3RlbVNuYXBIIiwiZGVsdGEiLG51bGxdLFtbMTIsMTNdLCJTdGVtU25hcFYiLCJkZWx0YSIsbnVsbF0sW1sxMiwxNF0sIkZvcmNlQm9sZCIsIm51bSIsMF0sW1sxMiwxN10sIkxhbmd1YWdlR3JvdXAiLCJudW0iLDBdLFtbMTIsMThdLCJFeHBhbnNpb25GYWN0b3IiLCJudW0iLC4wNl0sW1sxMiwxOV0sImluaXRpYWxSYW5kb21TZWVkIiwibnVtIiwwXSxbMjAsImRlZmF1bHRXaWR0aFgiLCJudW0iLDBdLFsyMSwibm9taW5hbFdpZHRoWCIsIm51bSIsMF0sWzE5LCJTdWJycyIsIm9mZnNldCIsbnVsbF1dO2NsYXNzIENGRlByaXZhdGVEaWN0IGV4dGVuZHMgQ0ZGRGljdHtzdGF0aWMgZ2V0IHRhYmxlcygpe3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJ0YWJsZXMiLHRoaXMuY3JlYXRlVGFibGVzKHUpKX1jb25zdHJ1Y3RvcihlKXtzdXBlcihDRkZQcml2YXRlRGljdC50YWJsZXMsZSk7dGhpcy5zdWJyc0luZGV4PW51bGx9fXQuQ0ZGUHJpdmF0ZURpY3Q9Q0ZGUHJpdmF0ZURpY3Q7Y29uc3QgZD17SVNPX0FET0JFOjAsRVhQRVJUOjEsRVhQRVJUX1NVQlNFVDoyfTtjbGFzcyBDRkZDaGFyc2V0e2NvbnN0cnVjdG9yKGUsdCxhLHIpe3RoaXMucHJlZGVmaW5lZD1lO3RoaXMuZm9ybWF0PXQ7dGhpcy5jaGFyc2V0PWE7dGhpcy5yYXc9cn19dC5DRkZDaGFyc2V0PUNGRkNoYXJzZXQ7Y2xhc3MgQ0ZGRW5jb2Rpbmd7Y29uc3RydWN0b3IoZSx0LGEscil7dGhpcy5wcmVkZWZpbmVkPWU7dGhpcy5mb3JtYXQ9dDt0aGlzLmVuY29kaW5nPWE7dGhpcy5yYXc9cn19Y2xhc3MgQ0ZGRkRTZWxlY3R7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmZvcm1hdD1lO3RoaXMuZmRTZWxlY3Q9dH1nZXRGREluZGV4KGUpe3JldHVybiBlPDB8fGU+PXRoaXMuZmRTZWxlY3QubGVuZ3RoPy0xOnRoaXMuZmRTZWxlY3RbZV19fXQuQ0ZGRkRTZWxlY3Q9Q0ZGRkRTZWxlY3Q7Y2xhc3MgQ0ZGT2Zmc2V0VHJhY2tlcntjb25zdHJ1Y3Rvcigpe3RoaXMub2Zmc2V0cz1PYmplY3QuY3JlYXRlKG51bGwpfWlzVHJhY2tpbmcoZSl7cmV0dXJuIGUgaW4gdGhpcy5vZmZzZXRzfXRyYWNrKGUsdCl7aWYoZSBpbiB0aGlzLm9mZnNldHMpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYEFscmVhZHkgdHJhY2tpbmcgbG9jYXRpb24gb2YgJHtlfWApO3RoaXMub2Zmc2V0c1tlXT10fW9mZnNldChlKXtmb3IoY29uc3QgdCBpbiB0aGlzLm9mZnNldHMpdGhpcy5vZmZzZXRzW3RdKz1lfXNldEVudHJ5TG9jYXRpb24oZSx0LGEpe2lmKCEoZSBpbiB0aGlzLm9mZnNldHMpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKGBOb3QgdHJhY2tpbmcgbG9jYXRpb24gb2YgJHtlfWApO2NvbnN0IG49YS5kYXRhLGk9dGhpcy5vZmZzZXRzW2VdO2ZvcihsZXQgZT0wLGE9dC5sZW5ndGg7ZTxhOysrZSl7Y29uc3QgYT01KmUraSxzPWErMSxvPWErMixjPWErMyxsPWErNDtpZigyOSE9PW5bYV18fDAhPT1uW3NdfHwwIT09bltvXXx8MCE9PW5bY118fDAhPT1uW2xdKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJ3cml0aW5nIHRvIGFuIG9mZnNldCB0aGF0IGlzIG5vdCBlbXB0eSIpO2NvbnN0IGg9dFtlXTtuW2FdPTI5O25bc109aD4+MjQmMjU1O25bb109aD4+MTYmMjU1O25bY109aD4+OCYyNTU7bltsXT0yNTUmaH19fWNsYXNzIENGRkNvbXBpbGVye2NvbnN0cnVjdG9yKGUpe3RoaXMuY2ZmPWV9Y29tcGlsZSgpe2NvbnN0IGU9dGhpcy5jZmYsdD17ZGF0YTpbXSxsZW5ndGg6MCxhZGQoZSl7dHJ5e3RoaXMuZGF0YS5wdXNoKC4uLmUpfWNhdGNoe3RoaXMuZGF0YT10aGlzLmRhdGEuY29uY2F0KGUpfXRoaXMubGVuZ3RoPXRoaXMuZGF0YS5sZW5ndGh9fSxhPXRoaXMuY29tcGlsZUhlYWRlcihlLmhlYWRlcik7dC5hZGQoYSk7Y29uc3Qgbj10aGlzLmNvbXBpbGVOYW1lSW5kZXgoZS5uYW1lcyk7dC5hZGQobik7aWYoZS5pc0NJREZvbnQmJmUudG9wRGljdC5oYXNOYW1lKCJGb250TWF0cml4Iikpe2NvbnN0IHQ9ZS50b3BEaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpO2UudG9wRGljdC5yZW1vdmVCeU5hbWUoIkZvbnRNYXRyaXgiKTtmb3IoY29uc3QgYSBvZiBlLmZkQXJyYXkpe2xldCBlPXQuc2xpY2UoMCk7YS5oYXNOYW1lKCJGb250TWF0cml4IikmJihlPXIuVXRpbC50cmFuc2Zvcm0oZSxhLmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpKSk7YS5zZXRCeU5hbWUoIkZvbnRNYXRyaXgiLGUpfX1jb25zdCBpPWUudG9wRGljdC5nZXRCeU5hbWUoIlhVSUQiKTtpPy5sZW5ndGg+MTYmJmUudG9wRGljdC5yZW1vdmVCeU5hbWUoIlhVSUQiKTtlLnRvcERpY3Quc2V0QnlOYW1lKCJjaGFyc2V0IiwwKTtsZXQgcz10aGlzLmNvbXBpbGVUb3BEaWN0cyhbZS50b3BEaWN0XSx0Lmxlbmd0aCxlLmlzQ0lERm9udCk7dC5hZGQocy5vdXRwdXQpO2NvbnN0IG89cy50cmFja2Vyc1swXSxjPXRoaXMuY29tcGlsZVN0cmluZ0luZGV4KGUuc3RyaW5ncy5zdHJpbmdzKTt0LmFkZChjKTtjb25zdCBsPXRoaXMuY29tcGlsZUluZGV4KGUuZ2xvYmFsU3VickluZGV4KTt0LmFkZChsKTtpZihlLmVuY29kaW5nJiZlLnRvcERpY3QuaGFzTmFtZSgiRW5jb2RpbmciKSlpZihlLmVuY29kaW5nLnByZWRlZmluZWQpby5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsW2UuZW5jb2RpbmcuZm9ybWF0XSx0KTtlbHNle2NvbnN0IGE9dGhpcy5jb21waWxlRW5jb2RpbmcoZS5lbmNvZGluZyk7by5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsW3QubGVuZ3RoXSx0KTt0LmFkZChhKX1jb25zdCBoPXRoaXMuY29tcGlsZUNoYXJzZXQoZS5jaGFyc2V0LGUuY2hhclN0cmluZ3MuY291bnQsZS5zdHJpbmdzLGUuaXNDSURGb250KTtvLnNldEVudHJ5TG9jYXRpb24oImNoYXJzZXQiLFt0Lmxlbmd0aF0sdCk7dC5hZGQoaCk7Y29uc3QgdT10aGlzLmNvbXBpbGVDaGFyU3RyaW5ncyhlLmNoYXJTdHJpbmdzKTtvLnNldEVudHJ5TG9jYXRpb24oIkNoYXJTdHJpbmdzIixbdC5sZW5ndGhdLHQpO3QuYWRkKHUpO2lmKGUuaXNDSURGb250KXtvLnNldEVudHJ5TG9jYXRpb24oIkZEU2VsZWN0IixbdC5sZW5ndGhdLHQpO2NvbnN0IGE9dGhpcy5jb21waWxlRkRTZWxlY3QoZS5mZFNlbGVjdCk7dC5hZGQoYSk7cz10aGlzLmNvbXBpbGVUb3BEaWN0cyhlLmZkQXJyYXksdC5sZW5ndGgsITApO28uc2V0RW50cnlMb2NhdGlvbigiRkRBcnJheSIsW3QubGVuZ3RoXSx0KTt0LmFkZChzLm91dHB1dCk7Y29uc3Qgcj1zLnRyYWNrZXJzO3RoaXMuY29tcGlsZVByaXZhdGVEaWN0cyhlLmZkQXJyYXkscix0KX10aGlzLmNvbXBpbGVQcml2YXRlRGljdHMoW2UudG9wRGljdF0sW29dLHQpO3QuYWRkKFswXSk7cmV0dXJuIHQuZGF0YX1lbmNvZGVOdW1iZXIoZSl7cmV0dXJuIE51bWJlci5pc0ludGVnZXIoZSk/dGhpcy5lbmNvZGVJbnRlZ2VyKGUpOnRoaXMuZW5jb2RlRmxvYXQoZSl9c3RhdGljIGdldCBFbmNvZGVGbG9hdFJlZ0V4cCgpe3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJFbmNvZGVGbG9hdFJlZ0V4cCIsL1wuKFxkKj8pKD86OXs1LDIwfXwwezUsMjB9KVxkezAsMn0oPzplKC4rKXwkKS8pfWVuY29kZUZsb2F0KGUpe2xldCB0PWUudG9TdHJpbmcoKTtjb25zdCBhPUNGRkNvbXBpbGVyLkVuY29kZUZsb2F0UmVnRXhwLmV4ZWModCk7aWYoYSl7Y29uc3Qgcj1wYXJzZUZsb2F0KCIxZSIrKChhWzJdPythWzJdOjApK2FbMV0ubGVuZ3RoKSk7dD0oTWF0aC5yb3VuZChlKnIpL3IpLnRvU3RyaW5nKCl9bGV0IHIsbixpPSIiO2ZvcihyPTAsbj10Lmxlbmd0aDtyPG47KytyKXtjb25zdCBlPXRbcl07aSs9ImUiPT09ZT8iLSI9PT10Wysrcl0/ImMiOiJiIjoiLiI9PT1lPyJhIjoiLSI9PT1lPyJlIjplfWkrPTEmaS5sZW5ndGg/ImYiOiJmZiI7Y29uc3Qgcz1bMzBdO2ZvcihyPTAsbj1pLmxlbmd0aDtyPG47cis9MilzLnB1c2gocGFyc2VJbnQoaS5zdWJzdHJpbmcocixyKzIpLDE2KSk7cmV0dXJuIHN9ZW5jb2RlSW50ZWdlcihlKXtsZXQgdDt0PWU+PS0xMDcmJmU8PTEwNz9bZSsxMzldOmU+PTEwOCYmZTw9MTEzMT9bMjQ3KygoZS09MTA4KT4+OCksMjU1JmVdOmU+PS0xMTMxJiZlPD0tMTA4P1syNTErKChlPS1lLTEwOCk+PjgpLDI1NSZlXTplPj0tMzI3NjgmJmU8PTMyNzY3P1syOCxlPj44JjI1NSwyNTUmZV06WzI5LGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsMjU1JmVdO3JldHVybiB0fWNvbXBpbGVIZWFkZXIoZSl7cmV0dXJuW2UubWFqb3IsZS5taW5vciw0LGUub2ZmU2l6ZV19Y29tcGlsZU5hbWVJbmRleChlKXtjb25zdCB0PW5ldyBDRkZJbmRleDtmb3IoY29uc3QgYSBvZiBlKXtjb25zdCBlPU1hdGgubWluKGEubGVuZ3RoLDEyNyk7bGV0IG49bmV3IEFycmF5KGUpO2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPWFbdF07KGU8IiEifHxlPiJ+Inx8IlsiPT09ZXx8Il0iPT09ZXx8IigiPT09ZXx8IikiPT09ZXx8InsiPT09ZXx8In0iPT09ZXx8IjwiPT09ZXx8Ij4iPT09ZXx8Ii8iPT09ZXx8IiUiPT09ZSkmJihlPSJfIik7blt0XT1lfW49bi5qb2luKCIiKTsiIj09PW4mJihuPSJCYWRfRm9udF9OYW1lIik7dC5hZGQoKDAsci5zdHJpbmdUb0J5dGVzKShuKSl9cmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KHQpfWNvbXBpbGVUb3BEaWN0cyhlLHQsYSl7Y29uc3Qgcj1bXTtsZXQgbj1uZXcgQ0ZGSW5kZXg7Zm9yKGNvbnN0IGkgb2YgZSl7aWYoYSl7aS5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIik7aS5yZW1vdmVCeU5hbWUoIkNJREZvbnRSZXZpc2lvbiIpO2kucmVtb3ZlQnlOYW1lKCJDSURGb250VHlwZSIpO2kucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpO2kucmVtb3ZlQnlOYW1lKCJVSURCYXNlIil9Y29uc3QgZT1uZXcgQ0ZGT2Zmc2V0VHJhY2tlcixzPXRoaXMuY29tcGlsZURpY3QoaSxlKTtyLnB1c2goZSk7bi5hZGQocyk7ZS5vZmZzZXQodCl9bj10aGlzLmNvbXBpbGVJbmRleChuLHIpO3JldHVybnt0cmFja2VyczpyLG91dHB1dDpufX1jb21waWxlUHJpdmF0ZURpY3RzKGUsdCxhKXtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTsrK24pe2NvbnN0IGk9ZVtuXSxzPWkucHJpdmF0ZURpY3Q7aWYoIXN8fCFpLmhhc05hbWUoIlByaXZhdGUiKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiVGhlcmUgbXVzdCBiZSBhIHByaXZhdGUgZGljdGlvbmFyeS4iKTtjb25zdCBvPW5ldyBDRkZPZmZzZXRUcmFja2VyLGM9dGhpcy5jb21waWxlRGljdChzLG8pO2xldCBsPWEubGVuZ3RoO28ub2Zmc2V0KGwpO2MubGVuZ3RofHwobD0wKTt0W25dLnNldEVudHJ5TG9jYXRpb24oIlByaXZhdGUiLFtjLmxlbmd0aCxsXSxhKTthLmFkZChjKTtpZihzLnN1YnJzSW5kZXgmJnMuaGFzTmFtZSgiU3VicnMiKSl7Y29uc3QgZT10aGlzLmNvbXBpbGVJbmRleChzLnN1YnJzSW5kZXgpO28uc2V0RW50cnlMb2NhdGlvbigiU3VicnMiLFtjLmxlbmd0aF0sYSk7YS5hZGQoZSl9fX1jb21waWxlRGljdChlLHQpe2NvbnN0IGE9W107Zm9yKGNvbnN0IG4gb2YgZS5vcmRlcil7aWYoIShuIGluIGUudmFsdWVzKSljb250aW51ZTtsZXQgaT1lLnZhbHVlc1tuXSxzPWUudHlwZXNbbl07QXJyYXkuaXNBcnJheShzKXx8KHM9W3NdKTtBcnJheS5pc0FycmF5KGkpfHwoaT1baV0pO2lmKDAhPT1pLmxlbmd0aCl7Zm9yKGxldCBvPTAsYz1zLmxlbmd0aDtvPGM7KytvKXtjb25zdCBjPXNbb10sbD1pW29dO3N3aXRjaChjKXtjYXNlIm51bSI6Y2FzZSJzaWQiOmEucHVzaCguLi50aGlzLmVuY29kZU51bWJlcihsKSk7YnJlYWs7Y2FzZSJvZmZzZXQiOmNvbnN0IHM9ZS5rZXlUb05hbWVNYXBbbl07dC5pc1RyYWNraW5nKHMpfHx0LnRyYWNrKHMsYS5sZW5ndGgpO2EucHVzaCgyOSwwLDAsMCwwKTticmVhaztjYXNlImFycmF5IjpjYXNlImRlbHRhIjphLnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIobCkpO2ZvcihsZXQgZT0xLHQ9aS5sZW5ndGg7ZTx0OysrZSlhLnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIoaVtlXSkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYFVua25vd24gZGF0YSB0eXBlIG9mICR7Y31gKX19YS5wdXNoKC4uLmUub3Bjb2Rlc1tuXSl9fXJldHVybiBhfWNvbXBpbGVTdHJpbmdJbmRleChlKXtjb25zdCB0PW5ldyBDRkZJbmRleDtmb3IoY29uc3QgYSBvZiBlKXQuYWRkKCgwLHIuc3RyaW5nVG9CeXRlcykoYSkpO3JldHVybiB0aGlzLmNvbXBpbGVJbmRleCh0KX1jb21waWxlQ2hhclN0cmluZ3MoZSl7Y29uc3QgdD1uZXcgQ0ZGSW5kZXg7Zm9yKGxldCBhPTA7YTxlLmNvdW50O2ErKyl7Y29uc3Qgcj1lLmdldChhKTswIT09ci5sZW5ndGg/dC5hZGQocik6dC5hZGQobmV3IFVpbnQ4QXJyYXkoWzEzOSwxNF0pKX1yZXR1cm4gdGhpcy5jb21waWxlSW5kZXgodCl9Y29tcGlsZUNoYXJzZXQoZSx0LGEsbil7bGV0IGk7Y29uc3Qgcz10LTE7aWYobilpPW5ldyBVaW50OEFycmF5KFsyLDAsMCxzPj44JjI1NSwyNTUmc10pO2Vsc2V7aT1uZXcgVWludDhBcnJheSgxKzIqcyk7aVswXT0wO2xldCB0PTA7Y29uc3Qgbj1lLmNoYXJzZXQubGVuZ3RoO2xldCBvPSExO2ZvcihsZXQgcz0xO3M8aS5sZW5ndGg7cys9Mil7bGV0IGM9MDtpZih0PG4pe2NvbnN0IG49ZS5jaGFyc2V0W3QrK107Yz1hLmdldFNJRChuKTtpZigtMT09PWMpe2M9MDtpZighbyl7bz0hMDsoMCxyLndhcm4pKGBDb3VsZG4ndCBmaW5kICR7bn0gaW4gQ0ZGIHN0cmluZ3NgKX19fWlbc109Yz4+OCYyNTU7aVtzKzFdPTI1NSZjfX1yZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShpKX1jb21waWxlRW5jb2RpbmcoZSl7cmV0dXJuIHRoaXMuY29tcGlsZVR5cGVkQXJyYXkoZS5yYXcpfWNvbXBpbGVGRFNlbGVjdChlKXtjb25zdCB0PWUuZm9ybWF0O2xldCBhLHI7c3dpdGNoKHQpe2Nhc2UgMDphPW5ldyBVaW50OEFycmF5KDErZS5mZFNlbGVjdC5sZW5ndGgpO2FbMF09dDtmb3Iocj0wO3I8ZS5mZFNlbGVjdC5sZW5ndGg7cisrKWFbcisxXT1lLmZkU2VsZWN0W3JdO2JyZWFrO2Nhc2UgMzpjb25zdCBuPTA7bGV0IGk9ZS5mZFNlbGVjdFswXTtjb25zdCBzPVt0LDAsMCxuPj44JjI1NSwyNTUmbixpXTtmb3Iocj0xO3I8ZS5mZFNlbGVjdC5sZW5ndGg7cisrKXtjb25zdCB0PWUuZmRTZWxlY3Rbcl07aWYodCE9PWkpe3MucHVzaChyPj44JjI1NSwyNTUmcix0KTtpPXR9fWNvbnN0IG89KHMubGVuZ3RoLTMpLzM7c1sxXT1vPj44JjI1NTtzWzJdPTI1NSZvO3MucHVzaChyPj44JjI1NSwyNTUmcik7YT1uZXcgVWludDhBcnJheShzKX1yZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShhKX1jb21waWxlVHlwZWRBcnJheShlKXtyZXR1cm4gQXJyYXkuZnJvbShlKX1jb21waWxlSW5kZXgoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOltdO2NvbnN0IGE9ZS5vYmplY3RzLHI9YS5sZW5ndGg7aWYoMD09PXIpcmV0dXJuWzAsMF07Y29uc3Qgbj1bcj4+OCYyNTUsMjU1JnJdO2xldCBpLHMsbz0xO2ZvcihpPTA7aTxyOysraSlvKz1hW2ldLmxlbmd0aDtzPW88MjU2PzE6bzw2NTUzNj8yOm88MTY3NzcyMTY/Mzo0O24ucHVzaChzKTtsZXQgYz0xO2ZvcihpPTA7aTxyKzE7aSsrKXsxPT09cz9uLnB1c2goMjU1JmMpOjI9PT1zP24ucHVzaChjPj44JjI1NSwyNTUmYyk6Mz09PXM/bi5wdXNoKGM+PjE2JjI1NSxjPj44JjI1NSwyNTUmYyk6bi5wdXNoKGM+Pj4yNCYyNTUsYz4+MTYmMjU1LGM+PjgmMjU1LDI1NSZjKTthW2ldJiYoYys9YVtpXS5sZW5ndGgpfWZvcihpPTA7aTxyO2krKyl7dFtpXSYmdFtpXS5vZmZzZXQobi5sZW5ndGgpO24ucHVzaCguLi5hW2ldKX1yZXR1cm4gbn19dC5DRkZDb21waWxlcj1DRkZDb21waWxlcn0sKGUsdCk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSVNPQWRvYmVDaGFyc2V0PXQuRXhwZXJ0U3Vic2V0Q2hhcnNldD10LkV4cGVydENoYXJzZXQ9dm9pZCAwO3QuSVNPQWRvYmVDaGFyc2V0PVsiLm5vdGRlZiIsInNwYWNlIiwiZXhjbGFtIiwicXVvdGVkYmwiLCJudW1iZXJzaWduIiwiZG9sbGFyIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInF1b3RlcmlnaHQiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsInF1b3RlbGVmdCIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6IiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsImFzY2lpdGlsZGUiLCJleGNsYW1kb3duIiwiY2VudCIsInN0ZXJsaW5nIiwiZnJhY3Rpb24iLCJ5ZW4iLCJmbG9yaW4iLCJzZWN0aW9uIiwiY3VycmVuY3kiLCJxdW90ZXNpbmdsZSIsInF1b3RlZGJsbGVmdCIsImd1aWxsZW1vdGxlZnQiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJmaSIsImZsIiwiZW5kYXNoIiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwicGVyaW9kY2VudGVyZWQiLCJwYXJhZ3JhcGgiLCJidWxsZXQiLCJxdW90ZXNpbmdsYmFzZSIsInF1b3RlZGJsYmFzZSIsInF1b3RlZGJscmlnaHQiLCJndWlsbGVtb3RyaWdodCIsImVsbGlwc2lzIiwicGVydGhvdXNhbmQiLCJxdWVzdGlvbmRvd24iLCJncmF2ZSIsImFjdXRlIiwiY2lyY3VtZmxleCIsInRpbGRlIiwibWFjcm9uIiwiYnJldmUiLCJkb3RhY2NlbnQiLCJkaWVyZXNpcyIsInJpbmciLCJjZWRpbGxhIiwiaHVuZ2FydW1sYXV0Iiwib2dvbmVrIiwiY2Fyb24iLCJlbWRhc2giLCJBRSIsIm9yZGZlbWluaW5lIiwiTHNsYXNoIiwiT3NsYXNoIiwiT0UiLCJvcmRtYXNjdWxpbmUiLCJhZSIsImRvdGxlc3NpIiwibHNsYXNoIiwib3NsYXNoIiwib2UiLCJnZXJtYW5kYmxzIiwib25lc3VwZXJpb3IiLCJsb2dpY2Fsbm90IiwibXUiLCJ0cmFkZW1hcmsiLCJFdGgiLCJvbmVoYWxmIiwicGx1c21pbnVzIiwiVGhvcm4iLCJvbmVxdWFydGVyIiwiZGl2aWRlIiwiYnJva2VuYmFyIiwiZGVncmVlIiwidGhvcm4iLCJ0aHJlZXF1YXJ0ZXJzIiwidHdvc3VwZXJpb3IiLCJyZWdpc3RlcmVkIiwibWludXMiLCJldGgiLCJtdWx0aXBseSIsInRocmVlc3VwZXJpb3IiLCJjb3B5cmlnaHQiLCJBYWN1dGUiLCJBY2lyY3VtZmxleCIsIkFkaWVyZXNpcyIsIkFncmF2ZSIsIkFyaW5nIiwiQXRpbGRlIiwiQ2NlZGlsbGEiLCJFYWN1dGUiLCJFY2lyY3VtZmxleCIsIkVkaWVyZXNpcyIsIkVncmF2ZSIsIklhY3V0ZSIsIkljaXJjdW1mbGV4IiwiSWRpZXJlc2lzIiwiSWdyYXZlIiwiTnRpbGRlIiwiT2FjdXRlIiwiT2NpcmN1bWZsZXgiLCJPZGllcmVzaXMiLCJPZ3JhdmUiLCJPdGlsZGUiLCJTY2Fyb24iLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVkaWVyZXNpcyIsIlVncmF2ZSIsIllhY3V0ZSIsIllkaWVyZXNpcyIsIlpjYXJvbiIsImFhY3V0ZSIsImFjaXJjdW1mbGV4IiwiYWRpZXJlc2lzIiwiYWdyYXZlIiwiYXJpbmciLCJhdGlsZGUiLCJjY2VkaWxsYSIsImVhY3V0ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiZWdyYXZlIiwiaWFjdXRlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJpZ3JhdmUiLCJudGlsZGUiLCJvYWN1dGUiLCJvY2lyY3VtZmxleCIsIm9kaWVyZXNpcyIsIm9ncmF2ZSIsIm90aWxkZSIsInNjYXJvbiIsInVhY3V0ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwidWdyYXZlIiwieWFjdXRlIiwieWRpZXJlc2lzIiwiemNhcm9uIl07dC5FeHBlcnRDaGFyc2V0PVsiLm5vdGRlZiIsInNwYWNlIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCJjb21tYXN1cGVyaW9yIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInBlcmlvZHN1cGVyaW9yIiwicXVlc3Rpb25zbWFsbCIsImFzdXBlcmlvciIsImJzdXBlcmlvciIsImNlbnRzdXBlcmlvciIsImRzdXBlcmlvciIsImVzdXBlcmlvciIsImlzdXBlcmlvciIsImxzdXBlcmlvciIsIm1zdXBlcmlvciIsIm5zdXBlcmlvciIsIm9zdXBlcmlvciIsInJzdXBlcmlvciIsInNzdXBlcmlvciIsInRzdXBlcmlvciIsImZmIiwiZmkiLCJmbCIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwicGFyZW5yaWdodGluZmVyaW9yIiwiQ2lyY3VtZmxleHNtYWxsIiwiaHlwaGVuc3VwZXJpb3IiLCJHcmF2ZXNtYWxsIiwiQXNtYWxsIiwiQnNtYWxsIiwiQ3NtYWxsIiwiRHNtYWxsIiwiRXNtYWxsIiwiRnNtYWxsIiwiR3NtYWxsIiwiSHNtYWxsIiwiSXNtYWxsIiwiSnNtYWxsIiwiS3NtYWxsIiwiTHNtYWxsIiwiTXNtYWxsIiwiTnNtYWxsIiwiT3NtYWxsIiwiUHNtYWxsIiwiUXNtYWxsIiwiUnNtYWxsIiwiU3NtYWxsIiwiVHNtYWxsIiwiVXNtYWxsIiwiVnNtYWxsIiwiV3NtYWxsIiwiWHNtYWxsIiwiWXNtYWxsIiwiWnNtYWxsIiwiY29sb25tb25ldGFyeSIsIm9uZWZpdHRlZCIsInJ1cGlhaCIsIlRpbGRlc21hbGwiLCJleGNsYW1kb3duc21hbGwiLCJjZW50b2xkc3R5bGUiLCJMc2xhc2hzbWFsbCIsIlNjYXJvbnNtYWxsIiwiWmNhcm9uc21hbGwiLCJEaWVyZXNpc3NtYWxsIiwiQnJldmVzbWFsbCIsIkNhcm9uc21hbGwiLCJEb3RhY2NlbnRzbWFsbCIsIk1hY3JvbnNtYWxsIiwiZmlndXJlZGFzaCIsImh5cGhlbmluZmVyaW9yIiwiT2dvbmVrc21hbGwiLCJSaW5nc21hbGwiLCJDZWRpbGxhc21hbGwiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJxdWVzdGlvbmRvd25zbWFsbCIsIm9uZWVpZ2h0aCIsInRocmVlZWlnaHRocyIsImZpdmVlaWdodGhzIiwic2V2ZW5laWdodGhzIiwib25ldGhpcmQiLCJ0d290aGlyZHMiLCJ6ZXJvc3VwZXJpb3IiLCJvbmVzdXBlcmlvciIsInR3b3N1cGVyaW9yIiwidGhyZWVzdXBlcmlvciIsImZvdXJzdXBlcmlvciIsImZpdmVzdXBlcmlvciIsInNpeHN1cGVyaW9yIiwic2V2ZW5zdXBlcmlvciIsImVpZ2h0c3VwZXJpb3IiLCJuaW5lc3VwZXJpb3IiLCJ6ZXJvaW5mZXJpb3IiLCJvbmVpbmZlcmlvciIsInR3b2luZmVyaW9yIiwidGhyZWVpbmZlcmlvciIsImZvdXJpbmZlcmlvciIsImZpdmVpbmZlcmlvciIsInNpeGluZmVyaW9yIiwic2V2ZW5pbmZlcmlvciIsImVpZ2h0aW5mZXJpb3IiLCJuaW5laW5mZXJpb3IiLCJjZW50aW5mZXJpb3IiLCJkb2xsYXJpbmZlcmlvciIsInBlcmlvZGluZmVyaW9yIiwiY29tbWFpbmZlcmlvciIsIkFncmF2ZXNtYWxsIiwiQWFjdXRlc21hbGwiLCJBY2lyY3VtZmxleHNtYWxsIiwiQXRpbGRlc21hbGwiLCJBZGllcmVzaXNzbWFsbCIsIkFyaW5nc21hbGwiLCJBRXNtYWxsIiwiQ2NlZGlsbGFzbWFsbCIsIkVncmF2ZXNtYWxsIiwiRWFjdXRlc21hbGwiLCJFY2lyY3VtZmxleHNtYWxsIiwiRWRpZXJlc2lzc21hbGwiLCJJZ3JhdmVzbWFsbCIsIklhY3V0ZXNtYWxsIiwiSWNpcmN1bWZsZXhzbWFsbCIsIklkaWVyZXNpc3NtYWxsIiwiRXRoc21hbGwiLCJOdGlsZGVzbWFsbCIsIk9ncmF2ZXNtYWxsIiwiT2FjdXRlc21hbGwiLCJPY2lyY3VtZmxleHNtYWxsIiwiT3RpbGRlc21hbGwiLCJPZGllcmVzaXNzbWFsbCIsIk9Fc21hbGwiLCJPc2xhc2hzbWFsbCIsIlVncmF2ZXNtYWxsIiwiVWFjdXRlc21hbGwiLCJVY2lyY3VtZmxleHNtYWxsIiwiVWRpZXJlc2lzc21hbGwiLCJZYWN1dGVzbWFsbCIsIlRob3Juc21hbGwiLCJZZGllcmVzaXNzbWFsbCJdO3QuRXhwZXJ0U3Vic2V0Q2hhcnNldD1bIi5ub3RkZWYiLCJzcGFjZSIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCJjb21tYXN1cGVyaW9yIiwidGhyZWVxdWFydGVyc2VtZGFzaCIsInBlcmlvZHN1cGVyaW9yIiwiYXN1cGVyaW9yIiwiYnN1cGVyaW9yIiwiY2VudHN1cGVyaW9yIiwiZHN1cGVyaW9yIiwiZXN1cGVyaW9yIiwiaXN1cGVyaW9yIiwibHN1cGVyaW9yIiwibXN1cGVyaW9yIiwibnN1cGVyaW9yIiwib3N1cGVyaW9yIiwicnN1cGVyaW9yIiwic3N1cGVyaW9yIiwidHN1cGVyaW9yIiwiZmYiLCJmaSIsImZsIiwiZmZpIiwiZmZsIiwicGFyZW5sZWZ0aW5mZXJpb3IiLCJwYXJlbnJpZ2h0aW5mZXJpb3IiLCJoeXBoZW5zdXBlcmlvciIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJjZW50b2xkc3R5bGUiLCJmaWd1cmVkYXNoIiwiaHlwaGVuaW5mZXJpb3IiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiXX0sKGUsdCk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuWmFwZkRpbmdiYXRzRW5jb2Rpbmc9dC5XaW5BbnNpRW5jb2Rpbmc9dC5TeW1ib2xTZXRFbmNvZGluZz10LlN0YW5kYXJkRW5jb2Rpbmc9dC5NYWNSb21hbkVuY29kaW5nPXQuRXhwZXJ0RW5jb2Rpbmc9dm9pZCAwO3QuZ2V0RW5jb2Rpbmc9ZnVuY3Rpb24gZ2V0RW5jb2RpbmcoZSl7c3dpdGNoKGUpe2Nhc2UiV2luQW5zaUVuY29kaW5nIjpyZXR1cm4gcztjYXNlIlN0YW5kYXJkRW5jb2RpbmciOnJldHVybiBpO2Nhc2UiTWFjUm9tYW5FbmNvZGluZyI6cmV0dXJuIG47Y2FzZSJTeW1ib2xTZXRFbmNvZGluZyI6cmV0dXJuIG87Y2FzZSJaYXBmRGluZ2JhdHNFbmNvZGluZyI6cmV0dXJuIGM7Y2FzZSJFeHBlcnRFbmNvZGluZyI6cmV0dXJuIGE7Y2FzZSJNYWNFeHBlcnRFbmNvZGluZyI6cmV0dXJuIHI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19O2NvbnN0IGE9WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbXNtYWxsIiwiSHVuZ2FydW1sYXV0c21hbGwiLCIiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwiYW1wZXJzYW5kc21hbGwiLCJBY3V0ZXNtYWxsIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsInF1ZXN0aW9uc21hbGwiLCIiLCJhc3VwZXJpb3IiLCJic3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCJkc3VwZXJpb3IiLCJlc3VwZXJpb3IiLCIiLCIiLCIiLCJpc3VwZXJpb3IiLCIiLCIiLCJsc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJvc3VwZXJpb3IiLCIiLCIiLCJyc3VwZXJpb3IiLCJzc3VwZXJpb3IiLCJ0c3VwZXJpb3IiLCIiLCJmZiIsImZpIiwiZmwiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsIiIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiZXhjbGFtZG93bnNtYWxsIiwiY2VudG9sZHN0eWxlIiwiTHNsYXNoc21hbGwiLCIiLCIiLCJTY2Fyb25zbWFsbCIsIlpjYXJvbnNtYWxsIiwiRGllcmVzaXNzbWFsbCIsIkJyZXZlc21hbGwiLCJDYXJvbnNtYWxsIiwiIiwiRG90YWNjZW50c21hbGwiLCIiLCIiLCJNYWNyb25zbWFsbCIsIiIsIiIsImZpZ3VyZWRhc2giLCJoeXBoZW5pbmZlcmlvciIsIiIsIiIsIk9nb25la3NtYWxsIiwiUmluZ3NtYWxsIiwiQ2VkaWxsYXNtYWxsIiwiIiwiIiwiIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiIiwiIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiLCJBZ3JhdmVzbWFsbCIsIkFhY3V0ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkF0aWxkZXNtYWxsIiwiQWRpZXJlc2lzc21hbGwiLCJBcmluZ3NtYWxsIiwiQUVzbWFsbCIsIkNjZWRpbGxhc21hbGwiLCJFZ3JhdmVzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVkaWVyZXNpc3NtYWxsIiwiSWdyYXZlc21hbGwiLCJJYWN1dGVzbWFsbCIsIkljaXJjdW1mbGV4c21hbGwiLCJJZGllcmVzaXNzbWFsbCIsIkV0aHNtYWxsIiwiTnRpbGRlc21hbGwiLCJPZ3JhdmVzbWFsbCIsIk9hY3V0ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk90aWxkZXNtYWxsIiwiT2RpZXJlc2lzc21hbGwiLCJPRXNtYWxsIiwiT3NsYXNoc21hbGwiLCJVZ3JhdmVzbWFsbCIsIlVhY3V0ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiWWFjdXRlc21hbGwiLCJUaG9ybnNtYWxsIiwiWWRpZXJlc2lzc21hbGwiXTt0LkV4cGVydEVuY29kaW5nPWE7Y29uc3Qgcj1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsImNlbnRvbGRzdHlsZSIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCIiLCJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwiIiwicXVlc3Rpb25zbWFsbCIsIiIsIiIsIiIsIiIsIkV0aHNtYWxsIiwiIiwiIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwib25lZWlnaHRoIiwidGhyZWVlaWdodGhzIiwiZml2ZWVpZ2h0aHMiLCJzZXZlbmVpZ2h0aHMiLCJvbmV0aGlyZCIsInR3b3RoaXJkcyIsIiIsIiIsIiIsIiIsIiIsIiIsImZmIiwiZmkiLCJmbCIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwiIiwicGFyZW5yaWdodGluZmVyaW9yIiwiQ2lyY3VtZmxleHNtYWxsIiwiaHlwaGVuaW5mZXJpb3IiLCJHcmF2ZXNtYWxsIiwiQXNtYWxsIiwiQnNtYWxsIiwiQ3NtYWxsIiwiRHNtYWxsIiwiRXNtYWxsIiwiRnNtYWxsIiwiR3NtYWxsIiwiSHNtYWxsIiwiSXNtYWxsIiwiSnNtYWxsIiwiS3NtYWxsIiwiTHNtYWxsIiwiTXNtYWxsIiwiTnNtYWxsIiwiT3NtYWxsIiwiUHNtYWxsIiwiUXNtYWxsIiwiUnNtYWxsIiwiU3NtYWxsIiwiVHNtYWxsIiwiVXNtYWxsIiwiVnNtYWxsIiwiV3NtYWxsIiwiWHNtYWxsIiwiWXNtYWxsIiwiWnNtYWxsIiwiY29sb25tb25ldGFyeSIsIm9uZWZpdHRlZCIsInJ1cGlhaCIsIlRpbGRlc21hbGwiLCIiLCIiLCJhc3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCIiLCIiLCIiLCIiLCJBYWN1dGVzbWFsbCIsIkFncmF2ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkFkaWVyZXNpc3NtYWxsIiwiQXRpbGRlc21hbGwiLCJBcmluZ3NtYWxsIiwiQ2NlZGlsbGFzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWdyYXZlc21hbGwiLCJFY2lyY3VtZmxleHNtYWxsIiwiRWRpZXJlc2lzc21hbGwiLCJJYWN1dGVzbWFsbCIsIklncmF2ZXNtYWxsIiwiSWNpcmN1bWZsZXhzbWFsbCIsIklkaWVyZXNpc3NtYWxsIiwiTnRpbGRlc21hbGwiLCJPYWN1dGVzbWFsbCIsIk9ncmF2ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk9kaWVyZXNpc3NtYWxsIiwiT3RpbGRlc21hbGwiLCJVYWN1dGVzbWFsbCIsIlVncmF2ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiIiwiZWlnaHRzdXBlcmlvciIsImZvdXJpbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsImVpZ2h0aW5mZXJpb3IiLCJzZXZlbmluZmVyaW9yIiwiU2Nhcm9uc21hbGwiLCIiLCJjZW50aW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsIiIsIkRpZXJlc2lzc21hbGwiLCIiLCJDYXJvbnNtYWxsIiwib3N1cGVyaW9yIiwiZml2ZWluZmVyaW9yIiwiIiwiY29tbWFpbmZlcmlvciIsInBlcmlvZGluZmVyaW9yIiwiWWFjdXRlc21hbGwiLCIiLCJkb2xsYXJpbmZlcmlvciIsIiIsIiIsIlRob3Juc21hbGwiLCIiLCJuaW5laW5mZXJpb3IiLCJ6ZXJvaW5mZXJpb3IiLCJaY2Fyb25zbWFsbCIsIkFFc21hbGwiLCJPc2xhc2hzbWFsbCIsInF1ZXN0aW9uZG93bnNtYWxsIiwib25laW5mZXJpb3IiLCJMc2xhc2hzbWFsbCIsIiIsIiIsIiIsIiIsIiIsIiIsIkNlZGlsbGFzbWFsbCIsIiIsIiIsIiIsIiIsIiIsIk9Fc21hbGwiLCJmaWd1cmVkYXNoIiwiaHlwaGVuc3VwZXJpb3IiLCIiLCIiLCIiLCIiLCJleGNsYW1kb3duc21hbGwiLCIiLCJZZGllcmVzaXNzbWFsbCIsIiIsIm9uZXN1cGVyaW9yIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwiZm91cnN1cGVyaW9yIiwiZml2ZXN1cGVyaW9yIiwic2l4c3VwZXJpb3IiLCJzZXZlbnN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb3N1cGVyaW9yIiwiIiwiZXN1cGVyaW9yIiwicnN1cGVyaW9yIiwidHN1cGVyaW9yIiwiIiwiIiwiaXN1cGVyaW9yIiwic3N1cGVyaW9yIiwiZHN1cGVyaW9yIiwiIiwiIiwiIiwiIiwiIiwibHN1cGVyaW9yIiwiT2dvbmVrc21hbGwiLCJCcmV2ZXNtYWxsIiwiTWFjcm9uc21hbGwiLCJic3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJjb21tYXN1cGVyaW9yIiwicGVyaW9kc3VwZXJpb3IiLCJEb3RhY2NlbnRzbWFsbCIsIlJpbmdzbWFsbCIsIiIsIiIsIiIsIiJdLG49WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXNpbmdsZSIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwiZ3JhdmUiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiIiwiQWRpZXJlc2lzIiwiQXJpbmciLCJDY2VkaWxsYSIsIkVhY3V0ZSIsIk50aWxkZSIsIk9kaWVyZXNpcyIsIlVkaWVyZXNpcyIsImFhY3V0ZSIsImFncmF2ZSIsImFjaXJjdW1mbGV4IiwiYWRpZXJlc2lzIiwiYXRpbGRlIiwiYXJpbmciLCJjY2VkaWxsYSIsImVhY3V0ZSIsImVncmF2ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiaWFjdXRlIiwiaWdyYXZlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJudGlsZGUiLCJvYWN1dGUiLCJvZ3JhdmUiLCJvY2lyY3VtZmxleCIsIm9kaWVyZXNpcyIsIm90aWxkZSIsInVhY3V0ZSIsInVncmF2ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwiZGFnZ2VyIiwiZGVncmVlIiwiY2VudCIsInN0ZXJsaW5nIiwic2VjdGlvbiIsImJ1bGxldCIsInBhcmFncmFwaCIsImdlcm1hbmRibHMiLCJyZWdpc3RlcmVkIiwiY29weXJpZ2h0IiwidHJhZGVtYXJrIiwiYWN1dGUiLCJkaWVyZXNpcyIsIm5vdGVxdWFsIiwiQUUiLCJPc2xhc2giLCJpbmZpbml0eSIsInBsdXNtaW51cyIsImxlc3NlcXVhbCIsImdyZWF0ZXJlcXVhbCIsInllbiIsIm11IiwicGFydGlhbGRpZmYiLCJzdW1tYXRpb24iLCJwcm9kdWN0IiwicGkiLCJpbnRlZ3JhbCIsIm9yZGZlbWluaW5lIiwib3JkbWFzY3VsaW5lIiwiT21lZ2EiLCJhZSIsIm9zbGFzaCIsInF1ZXN0aW9uZG93biIsImV4Y2xhbWRvd24iLCJsb2dpY2Fsbm90IiwicmFkaWNhbCIsImZsb3JpbiIsImFwcHJveGVxdWFsIiwiRGVsdGEiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbGxlbW90cmlnaHQiLCJlbGxpcHNpcyIsInNwYWNlIiwiQWdyYXZlIiwiQXRpbGRlIiwiT3RpbGRlIiwiT0UiLCJvZSIsImVuZGFzaCIsImVtZGFzaCIsInF1b3RlZGJsbGVmdCIsInF1b3RlZGJscmlnaHQiLCJxdW90ZWxlZnQiLCJxdW90ZXJpZ2h0IiwiZGl2aWRlIiwibG96ZW5nZSIsInlkaWVyZXNpcyIsIllkaWVyZXNpcyIsImZyYWN0aW9uIiwiY3VycmVuY3kiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJmaSIsImZsIiwiZGFnZ2VyZGJsIiwicGVyaW9kY2VudGVyZWQiLCJxdW90ZXNpbmdsYmFzZSIsInF1b3RlZGJsYmFzZSIsInBlcnRob3VzYW5kIiwiQWNpcmN1bWZsZXgiLCJFY2lyY3VtZmxleCIsIkFhY3V0ZSIsIkVkaWVyZXNpcyIsIkVncmF2ZSIsIklhY3V0ZSIsIkljaXJjdW1mbGV4IiwiSWRpZXJlc2lzIiwiSWdyYXZlIiwiT2FjdXRlIiwiT2NpcmN1bWZsZXgiLCJhcHBsZSIsIk9ncmF2ZSIsIlVhY3V0ZSIsIlVjaXJjdW1mbGV4IiwiVWdyYXZlIiwiZG90bGVzc2kiLCJjaXJjdW1mbGV4IiwidGlsZGUiLCJtYWNyb24iLCJicmV2ZSIsImRvdGFjY2VudCIsInJpbmciLCJjZWRpbGxhIiwiaHVuZ2FydW1sYXV0Iiwib2dvbmVrIiwiY2Fyb24iXTt0Lk1hY1JvbWFuRW5jb2Rpbmc9bjtjb25zdCBpPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVyaWdodCIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwicXVvdGVsZWZ0IiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsImV4Y2xhbWRvd24iLCJjZW50Iiwic3RlcmxpbmciLCJmcmFjdGlvbiIsInllbiIsImZsb3JpbiIsInNlY3Rpb24iLCJjdXJyZW5jeSIsInF1b3Rlc2luZ2xlIiwicXVvdGVkYmxsZWZ0IiwiZ3VpbGxlbW90bGVmdCIsImd1aWxzaW5nbGxlZnQiLCJndWlsc2luZ2xyaWdodCIsImZpIiwiZmwiLCIiLCJlbmRhc2giLCJkYWdnZXIiLCJkYWdnZXJkYmwiLCJwZXJpb2RjZW50ZXJlZCIsIiIsInBhcmFncmFwaCIsImJ1bGxldCIsInF1b3Rlc2luZ2xiYXNlIiwicXVvdGVkYmxiYXNlIiwicXVvdGVkYmxyaWdodCIsImd1aWxsZW1vdHJpZ2h0IiwiZWxsaXBzaXMiLCJwZXJ0aG91c2FuZCIsIiIsInF1ZXN0aW9uZG93biIsIiIsImdyYXZlIiwiYWN1dGUiLCJjaXJjdW1mbGV4IiwidGlsZGUiLCJtYWNyb24iLCJicmV2ZSIsImRvdGFjY2VudCIsImRpZXJlc2lzIiwiIiwicmluZyIsImNlZGlsbGEiLCIiLCJodW5nYXJ1bWxhdXQiLCJvZ29uZWsiLCJjYXJvbiIsImVtZGFzaCIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIkFFIiwiIiwib3JkZmVtaW5pbmUiLCIiLCIiLCIiLCIiLCJMc2xhc2giLCJPc2xhc2giLCJPRSIsIm9yZG1hc2N1bGluZSIsIiIsIiIsIiIsIiIsIiIsImFlIiwiIiwiIiwiIiwiZG90bGVzc2kiLCIiLCIiLCJsc2xhc2giLCJvc2xhc2giLCJvZSIsImdlcm1hbmRibHMiLCIiLCIiLCIiLCIiXTt0LlN0YW5kYXJkRW5jb2Rpbmc9aTtjb25zdCBzPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVzaW5nbGUiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsImdyYXZlIiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsImJ1bGxldCIsIkV1cm8iLCJidWxsZXQiLCJxdW90ZXNpbmdsYmFzZSIsImZsb3JpbiIsInF1b3RlZGJsYmFzZSIsImVsbGlwc2lzIiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwiY2lyY3VtZmxleCIsInBlcnRob3VzYW5kIiwiU2Nhcm9uIiwiZ3VpbHNpbmdsbGVmdCIsIk9FIiwiYnVsbGV0IiwiWmNhcm9uIiwiYnVsbGV0IiwiYnVsbGV0IiwicXVvdGVsZWZ0IiwicXVvdGVyaWdodCIsInF1b3RlZGJsbGVmdCIsInF1b3RlZGJscmlnaHQiLCJidWxsZXQiLCJlbmRhc2giLCJlbWRhc2giLCJ0aWxkZSIsInRyYWRlbWFyayIsInNjYXJvbiIsImd1aWxzaW5nbHJpZ2h0Iiwib2UiLCJidWxsZXQiLCJ6Y2Fyb24iLCJZZGllcmVzaXMiLCJzcGFjZSIsImV4Y2xhbWRvd24iLCJjZW50Iiwic3RlcmxpbmciLCJjdXJyZW5jeSIsInllbiIsImJyb2tlbmJhciIsInNlY3Rpb24iLCJkaWVyZXNpcyIsImNvcHlyaWdodCIsIm9yZGZlbWluaW5lIiwiZ3VpbGxlbW90bGVmdCIsImxvZ2ljYWxub3QiLCJoeXBoZW4iLCJyZWdpc3RlcmVkIiwibWFjcm9uIiwiZGVncmVlIiwicGx1c21pbnVzIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwiYWN1dGUiLCJtdSIsInBhcmFncmFwaCIsInBlcmlvZGNlbnRlcmVkIiwiY2VkaWxsYSIsIm9uZXN1cGVyaW9yIiwib3JkbWFzY3VsaW5lIiwiZ3VpbGxlbW90cmlnaHQiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJxdWVzdGlvbmRvd24iLCJBZ3JhdmUiLCJBYWN1dGUiLCJBY2lyY3VtZmxleCIsIkF0aWxkZSIsIkFkaWVyZXNpcyIsIkFyaW5nIiwiQUUiLCJDY2VkaWxsYSIsIkVncmF2ZSIsIkVhY3V0ZSIsIkVjaXJjdW1mbGV4IiwiRWRpZXJlc2lzIiwiSWdyYXZlIiwiSWFjdXRlIiwiSWNpcmN1bWZsZXgiLCJJZGllcmVzaXMiLCJFdGgiLCJOdGlsZGUiLCJPZ3JhdmUiLCJPYWN1dGUiLCJPY2lyY3VtZmxleCIsIk90aWxkZSIsIk9kaWVyZXNpcyIsIm11bHRpcGx5IiwiT3NsYXNoIiwiVWdyYXZlIiwiVWFjdXRlIiwiVWNpcmN1bWZsZXgiLCJVZGllcmVzaXMiLCJZYWN1dGUiLCJUaG9ybiIsImdlcm1hbmRibHMiLCJhZ3JhdmUiLCJhYWN1dGUiLCJhY2lyY3VtZmxleCIsImF0aWxkZSIsImFkaWVyZXNpcyIsImFyaW5nIiwiYWUiLCJjY2VkaWxsYSIsImVncmF2ZSIsImVhY3V0ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiaWdyYXZlIiwiaWFjdXRlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJldGgiLCJudGlsZGUiLCJvZ3JhdmUiLCJvYWN1dGUiLCJvY2lyY3VtZmxleCIsIm90aWxkZSIsIm9kaWVyZXNpcyIsImRpdmlkZSIsIm9zbGFzaCIsInVncmF2ZSIsInVhY3V0ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwieWFjdXRlIiwidGhvcm4iLCJ5ZGllcmVzaXMiXTt0LldpbkFuc2lFbmNvZGluZz1zO2NvbnN0IG89WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbSIsInVuaXZlcnNhbCIsIm51bWJlcnNpZ24iLCJleGlzdGVudGlhbCIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJzdWNodGhhdCIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3Rlcmlza21hdGgiLCJwbHVzIiwiY29tbWEiLCJtaW51cyIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiY29uZ3J1ZW50IiwiQWxwaGEiLCJCZXRhIiwiQ2hpIiwiRGVsdGEiLCJFcHNpbG9uIiwiUGhpIiwiR2FtbWEiLCJFdGEiLCJJb3RhIiwidGhldGExIiwiS2FwcGEiLCJMYW1iZGEiLCJNdSIsIk51IiwiT21pY3JvbiIsIlBpIiwiVGhldGEiLCJSaG8iLCJTaWdtYSIsIlRhdSIsIlVwc2lsb24iLCJzaWdtYTEiLCJPbWVnYSIsIlhpIiwiUHNpIiwiWmV0YSIsImJyYWNrZXRsZWZ0IiwidGhlcmVmb3JlIiwiYnJhY2tldHJpZ2h0IiwicGVycGVuZGljdWxhciIsInVuZGVyc2NvcmUiLCJyYWRpY2FsZXgiLCJhbHBoYSIsImJldGEiLCJjaGkiLCJkZWx0YSIsImVwc2lsb24iLCJwaGkiLCJnYW1tYSIsImV0YSIsImlvdGEiLCJwaGkxIiwia2FwcGEiLCJsYW1iZGEiLCJtdSIsIm51Iiwib21pY3JvbiIsInBpIiwidGhldGEiLCJyaG8iLCJzaWdtYSIsInRhdSIsInVwc2lsb24iLCJvbWVnYTEiLCJvbWVnYSIsInhpIiwicHNpIiwiemV0YSIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJzaW1pbGFyIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiRXVybyIsIlVwc2lsb24xIiwibWludXRlIiwibGVzc2VxdWFsIiwiZnJhY3Rpb24iLCJpbmZpbml0eSIsImZsb3JpbiIsImNsdWIiLCJkaWFtb25kIiwiaGVhcnQiLCJzcGFkZSIsImFycm93Ym90aCIsImFycm93bGVmdCIsImFycm93dXAiLCJhcnJvd3JpZ2h0IiwiYXJyb3dkb3duIiwiZGVncmVlIiwicGx1c21pbnVzIiwic2Vjb25kIiwiZ3JlYXRlcmVxdWFsIiwibXVsdGlwbHkiLCJwcm9wb3J0aW9uYWwiLCJwYXJ0aWFsZGlmZiIsImJ1bGxldCIsImRpdmlkZSIsIm5vdGVxdWFsIiwiZXF1aXZhbGVuY2UiLCJhcHByb3hlcXVhbCIsImVsbGlwc2lzIiwiYXJyb3d2ZXJ0ZXgiLCJhcnJvd2hvcml6ZXgiLCJjYXJyaWFnZXJldHVybiIsImFsZXBoIiwiSWZyYWt0dXIiLCJSZnJha3R1ciIsIndlaWVyc3RyYXNzIiwiY2lyY2xlbXVsdGlwbHkiLCJjaXJjbGVwbHVzIiwiZW1wdHlzZXQiLCJpbnRlcnNlY3Rpb24iLCJ1bmlvbiIsInByb3BlcnN1cGVyc2V0IiwicmVmbGV4c3VwZXJzZXQiLCJub3RzdWJzZXQiLCJwcm9wZXJzdWJzZXQiLCJyZWZsZXhzdWJzZXQiLCJlbGVtZW50Iiwibm90ZWxlbWVudCIsImFuZ2xlIiwiZ3JhZGllbnQiLCJyZWdpc3RlcnNlcmlmIiwiY29weXJpZ2h0c2VyaWYiLCJ0cmFkZW1hcmtzZXJpZiIsInByb2R1Y3QiLCJyYWRpY2FsIiwiZG90bWF0aCIsImxvZ2ljYWxub3QiLCJsb2dpY2FsYW5kIiwibG9naWNhbG9yIiwiYXJyb3dkYmxib3RoIiwiYXJyb3dkYmxsZWZ0IiwiYXJyb3dkYmx1cCIsImFycm93ZGJscmlnaHQiLCJhcnJvd2RibGRvd24iLCJsb3plbmdlIiwiYW5nbGVsZWZ0IiwicmVnaXN0ZXJzYW5zIiwiY29weXJpZ2h0c2FucyIsInRyYWRlbWFya3NhbnMiLCJzdW1tYXRpb24iLCJwYXJlbmxlZnR0cCIsInBhcmVubGVmdGV4IiwicGFyZW5sZWZ0YnQiLCJicmFja2V0bGVmdHRwIiwiYnJhY2tldGxlZnRleCIsImJyYWNrZXRsZWZ0YnQiLCJicmFjZWxlZnR0cCIsImJyYWNlbGVmdG1pZCIsImJyYWNlbGVmdGJ0IiwiYnJhY2VleCIsIiIsImFuZ2xlcmlnaHQiLCJpbnRlZ3JhbCIsImludGVncmFsdHAiLCJpbnRlZ3JhbGV4IiwiaW50ZWdyYWxidCIsInBhcmVucmlnaHR0cCIsInBhcmVucmlnaHRleCIsInBhcmVucmlnaHRidCIsImJyYWNrZXRyaWdodHRwIiwiYnJhY2tldHJpZ2h0ZXgiLCJicmFja2V0cmlnaHRidCIsImJyYWNlcmlnaHR0cCIsImJyYWNlcmlnaHRtaWQiLCJicmFjZXJpZ2h0YnQiLCIiXTt0LlN5bWJvbFNldEVuY29kaW5nPW87Y29uc3QgYz1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiYTEiLCJhMiIsImEyMDIiLCJhMyIsImE0IiwiYTUiLCJhMTE5IiwiYTExOCIsImExMTciLCJhMTEiLCJhMTIiLCJhMTMiLCJhMTQiLCJhMTUiLCJhMTYiLCJhMTA1IiwiYTE3IiwiYTE4IiwiYTE5IiwiYTIwIiwiYTIxIiwiYTIyIiwiYTIzIiwiYTI0IiwiYTI1IiwiYTI2IiwiYTI3IiwiYTI4IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJhMTAiLCJhMjkiLCJhMzAiLCJhMzEiLCJhMzIiLCJhMzMiLCJhMzQiLCJhMzUiLCJhMzYiLCJhMzciLCJhMzgiLCJhMzkiLCJhNDAiLCJhNDEiLCJhNDIiLCJhNDMiLCJhNDQiLCJhNDUiLCJhNDYiLCJhNDciLCJhNDgiLCJhNDkiLCJhNTAiLCJhNTEiLCJhNTIiLCJhNTMiLCJhNTQiLCJhNTUiLCJhNTYiLCJhNTciLCJhNTgiLCJhNTkiLCJhNjAiLCJhNjEiLCJhNjIiLCJhNjMiLCJhNjQiLCJhNjUiLCJhNjYiLCJhNjciLCJhNjgiLCJhNjkiLCJhNzAiLCJhNzEiLCJhNzIiLCJhNzMiLCJhNzQiLCJhMjAzIiwiYTc1IiwiYTIwNCIsImE3NiIsImE3NyIsImE3OCIsImE3OSIsImE4MSIsImE4MiIsImE4MyIsImE4NCIsImE5NyIsImE5OCIsImE5OSIsImExMDAiLCIiLCJhODkiLCJhOTAiLCJhOTMiLCJhOTQiLCJhOTEiLCJhOTIiLCJhMjA1IiwiYTg1IiwiYTIwNiIsImE4NiIsImE4NyIsImE4OCIsImE5NSIsImE5NiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsImExMDEiLCJhMTAyIiwiYTEwMyIsImExMDQiLCJhMTA2IiwiYTEwNyIsImExMDgiLCJhMTEyIiwiYTExMSIsImExMTAiLCJhMTA5IiwiYTEyMCIsImExMjEiLCJhMTIyIiwiYTEyMyIsImExMjQiLCJhMTI1IiwiYTEyNiIsImExMjciLCJhMTI4IiwiYTEyOSIsImExMzAiLCJhMTMxIiwiYTEzMiIsImExMzMiLCJhMTM0IiwiYTEzNSIsImExMzYiLCJhMTM3IiwiYTEzOCIsImExMzkiLCJhMTQwIiwiYTE0MSIsImExNDIiLCJhMTQzIiwiYTE0NCIsImExNDUiLCJhMTQ2IiwiYTE0NyIsImExNDgiLCJhMTQ5IiwiYTE1MCIsImExNTEiLCJhMTUyIiwiYTE1MyIsImExNTQiLCJhMTU1IiwiYTE1NiIsImExNTciLCJhMTU4IiwiYTE1OSIsImExNjAiLCJhMTYxIiwiYTE2MyIsImExNjQiLCJhMTk2IiwiYTE2NSIsImExOTIiLCJhMTY2IiwiYTE2NyIsImExNjgiLCJhMTY5IiwiYTE3MCIsImExNzEiLCJhMTcyIiwiYTE3MyIsImExNjIiLCJhMTc0IiwiYTE3NSIsImExNzYiLCJhMTc3IiwiYTE3OCIsImExNzkiLCJhMTkzIiwiYTE4MCIsImExOTkiLCJhMTgxIiwiYTIwMCIsImExODIiLCIiLCJhMjAxIiwiYTE4MyIsImExODQiLCJhMTk3IiwiYTE4NSIsImExOTQiLCJhMTk4IiwiYTE4NiIsImExOTUiLCJhMTg3IiwiYTE4OCIsImExODkiLCJhMTkwIiwiYTE5MSIsIiJdO3QuWmFwZkRpbmdiYXRzRW5jb2Rpbmc9Y30sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5TRUFDX0FOQUxZU0lTX0VOQUJMRUQ9dC5NYWNTdGFuZGFyZEdseXBoT3JkZXJpbmc9dC5Gb250RmxhZ3M9dm9pZCAwO3Qubm9ybWFsaXplRm9udE5hbWU9ZnVuY3Rpb24gbm9ybWFsaXplRm9udE5hbWUoZSl7cmV0dXJuIGUucmVwbGFjZUFsbCgvWyxfXS9nLCItIikucmVwbGFjZUFsbCgvXHMvZywiIil9O3QucmVjb3ZlckdseXBoTmFtZT1yZWNvdmVyR2x5cGhOYW1lO3QudHlwZTFGb250R2x5cGhNYXBwaW5nPWZ1bmN0aW9uIHR5cGUxRm9udEdseXBoTWFwcGluZyhlLHQsYSl7Y29uc3QgaT1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBzLGMsbDtjb25zdCBoPSEhKGUuZmxhZ3Mmby5TeW1ib2xpYyk7aWYoZS5pc0ludGVybmFsRm9udCl7bD10O2ZvcihjPTA7YzxsLmxlbmd0aDtjKyspe3M9YS5pbmRleE9mKGxbY10pO2lbY109cz49MD9zOjB9fWVsc2UgaWYoZS5iYXNlRW5jb2RpbmdOYW1lKXtsPSgwLHIuZ2V0RW5jb2RpbmcpKGUuYmFzZUVuY29kaW5nTmFtZSk7Zm9yKGM9MDtjPGwubGVuZ3RoO2MrKyl7cz1hLmluZGV4T2YobFtjXSk7aVtjXT1zPj0wP3M6MH19ZWxzZSBpZihoKWZvcihjIGluIHQpaVtjXT10W2NdO2Vsc2V7bD1yLlN0YW5kYXJkRW5jb2Rpbmc7Zm9yKGM9MDtjPGwubGVuZ3RoO2MrKyl7cz1hLmluZGV4T2YobFtjXSk7aVtjXT1zPj0wP3M6MH19Y29uc3QgdT1lLmRpZmZlcmVuY2VzO2xldCBkO2lmKHUpZm9yKGMgaW4gdSl7Y29uc3QgZT11W2NdO3M9YS5pbmRleE9mKGUpO2lmKC0xPT09cyl7ZHx8KGQ9KDAsbi5nZXRHbHlwaHNVbmljb2RlKSgpKTtjb25zdCB0PXJlY292ZXJHbHlwaE5hbWUoZSxkKTt0IT09ZSYmKHM9YS5pbmRleE9mKHQpKX1pW2NdPXM+PTA/czowfXJldHVybiBpfTthKDE1Nyk7dmFyIHI9YSgxODcpLG49YSgxODkpLGk9YSgxOTApLHM9YSgxNDQpO3QuU0VBQ19BTkFMWVNJU19FTkFCTEVEPSEwO2NvbnN0IG89e0ZpeGVkUGl0Y2g6MSxTZXJpZjoyLFN5bWJvbGljOjQsU2NyaXB0OjgsTm9uc3ltYm9saWM6MzIsSXRhbGljOjY0LEFsbENhcDo2NTUzNixTbWFsbENhcDoxMzEwNzIsRm9yY2VCb2xkOjI2MjE0NH07dC5Gb250RmxhZ3M9bzt0Lk1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZz1bIi5ub3RkZWYiLCIubnVsbCIsIm5vbm1hcmtpbmdyZXR1cm4iLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXNpbmdsZSIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwiZ3JhdmUiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiQWRpZXJlc2lzIiwiQXJpbmciLCJDY2VkaWxsYSIsIkVhY3V0ZSIsIk50aWxkZSIsIk9kaWVyZXNpcyIsIlVkaWVyZXNpcyIsImFhY3V0ZSIsImFncmF2ZSIsImFjaXJjdW1mbGV4IiwiYWRpZXJlc2lzIiwiYXRpbGRlIiwiYXJpbmciLCJjY2VkaWxsYSIsImVhY3V0ZSIsImVncmF2ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiaWFjdXRlIiwiaWdyYXZlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJudGlsZGUiLCJvYWN1dGUiLCJvZ3JhdmUiLCJvY2lyY3VtZmxleCIsIm9kaWVyZXNpcyIsIm90aWxkZSIsInVhY3V0ZSIsInVncmF2ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwiZGFnZ2VyIiwiZGVncmVlIiwiY2VudCIsInN0ZXJsaW5nIiwic2VjdGlvbiIsImJ1bGxldCIsInBhcmFncmFwaCIsImdlcm1hbmRibHMiLCJyZWdpc3RlcmVkIiwiY29weXJpZ2h0IiwidHJhZGVtYXJrIiwiYWN1dGUiLCJkaWVyZXNpcyIsIm5vdGVxdWFsIiwiQUUiLCJPc2xhc2giLCJpbmZpbml0eSIsInBsdXNtaW51cyIsImxlc3NlcXVhbCIsImdyZWF0ZXJlcXVhbCIsInllbiIsIm11IiwicGFydGlhbGRpZmYiLCJzdW1tYXRpb24iLCJwcm9kdWN0IiwicGkiLCJpbnRlZ3JhbCIsIm9yZGZlbWluaW5lIiwib3JkbWFzY3VsaW5lIiwiT21lZ2EiLCJhZSIsIm9zbGFzaCIsInF1ZXN0aW9uZG93biIsImV4Y2xhbWRvd24iLCJsb2dpY2Fsbm90IiwicmFkaWNhbCIsImZsb3JpbiIsImFwcHJveGVxdWFsIiwiRGVsdGEiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbGxlbW90cmlnaHQiLCJlbGxpcHNpcyIsIm5vbmJyZWFraW5nc3BhY2UiLCJBZ3JhdmUiLCJBdGlsZGUiLCJPdGlsZGUiLCJPRSIsIm9lIiwiZW5kYXNoIiwiZW1kYXNoIiwicXVvdGVkYmxsZWZ0IiwicXVvdGVkYmxyaWdodCIsInF1b3RlbGVmdCIsInF1b3RlcmlnaHQiLCJkaXZpZGUiLCJsb3plbmdlIiwieWRpZXJlc2lzIiwiWWRpZXJlc2lzIiwiZnJhY3Rpb24iLCJjdXJyZW5jeSIsImd1aWxzaW5nbGxlZnQiLCJndWlsc2luZ2xyaWdodCIsImZpIiwiZmwiLCJkYWdnZXJkYmwiLCJwZXJpb2RjZW50ZXJlZCIsInF1b3Rlc2luZ2xiYXNlIiwicXVvdGVkYmxiYXNlIiwicGVydGhvdXNhbmQiLCJBY2lyY3VtZmxleCIsIkVjaXJjdW1mbGV4IiwiQWFjdXRlIiwiRWRpZXJlc2lzIiwiRWdyYXZlIiwiSWFjdXRlIiwiSWNpcmN1bWZsZXgiLCJJZGllcmVzaXMiLCJJZ3JhdmUiLCJPYWN1dGUiLCJPY2lyY3VtZmxleCIsImFwcGxlIiwiT2dyYXZlIiwiVWFjdXRlIiwiVWNpcmN1bWZsZXgiLCJVZ3JhdmUiLCJkb3RsZXNzaSIsImNpcmN1bWZsZXgiLCJ0aWxkZSIsIm1hY3JvbiIsImJyZXZlIiwiZG90YWNjZW50IiwicmluZyIsImNlZGlsbGEiLCJodW5nYXJ1bWxhdXQiLCJvZ29uZWsiLCJjYXJvbiIsIkxzbGFzaCIsImxzbGFzaCIsIlNjYXJvbiIsInNjYXJvbiIsIlpjYXJvbiIsInpjYXJvbiIsImJyb2tlbmJhciIsIkV0aCIsImV0aCIsIllhY3V0ZSIsInlhY3V0ZSIsIlRob3JuIiwidGhvcm4iLCJtaW51cyIsIm11bHRpcGx5Iiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJvbmVoYWxmIiwib25lcXVhcnRlciIsInRocmVlcXVhcnRlcnMiLCJmcmFuYyIsIkdicmV2ZSIsImdicmV2ZSIsIklkb3RhY2NlbnQiLCJTY2VkaWxsYSIsInNjZWRpbGxhIiwiQ2FjdXRlIiwiY2FjdXRlIiwiQ2Nhcm9uIiwiY2Nhcm9uIiwiZGNyb2F0Il07ZnVuY3Rpb24gcmVjb3ZlckdseXBoTmFtZShlLHQpe2lmKHZvaWQgMCE9PXRbZV0pcmV0dXJuIGU7Y29uc3QgYT0oMCxpLmdldFVuaWNvZGVGb3JHbHlwaCkoZSx0KTtpZigtMSE9PWEpZm9yKGNvbnN0IGUgaW4gdClpZih0W2VdPT09YSlyZXR1cm4gZTsoMCxzLmluZm8pKCJVbmFibGUgdG8gcmVjb3ZlciBhIHN0YW5kYXJkIGdseXBoIG5hbWUgZm9yOiAiK2UpO3JldHVybiBlfX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjthLnIodCk7YS5kKHQse2dldERpbmdiYXRzR2x5cGhzVW5pY29kZTooKT0+aSxnZXRHbHlwaHNVbmljb2RlOigpPT5ufSk7dmFyIHI9YSgxNDkpO2NvbnN0IG49KDAsci5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkE9NjU7ZS5BRT0xOTg7ZS5BRWFjdXRlPTUwODtlLkFFbWFjcm9uPTQ4MjtlLkFFc21hbGw9NjM0NjI7ZS5BYWN1dGU9MTkzO2UuQWFjdXRlc21hbGw9NjM0NTc7ZS5BYnJldmU9MjU4O2UuQWJyZXZlYWN1dGU9Nzg1NDtlLkFicmV2ZWN5cmlsbGljPTEyMzI7ZS5BYnJldmVkb3RiZWxvdz03ODYyO2UuQWJyZXZlZ3JhdmU9Nzg1NjtlLkFicmV2ZWhvb2thYm92ZT03ODU4O2UuQWJyZXZldGlsZGU9Nzg2MDtlLkFjYXJvbj00NjE7ZS5BY2lyY2xlPTkzOTg7ZS5BY2lyY3VtZmxleD0xOTQ7ZS5BY2lyY3VtZmxleGFjdXRlPTc4NDQ7ZS5BY2lyY3VtZmxleGRvdGJlbG93PTc4NTI7ZS5BY2lyY3VtZmxleGdyYXZlPTc4NDY7ZS5BY2lyY3VtZmxleGhvb2thYm92ZT03ODQ4O2UuQWNpcmN1bWZsZXhzbWFsbD02MzQ1ODtlLkFjaXJjdW1mbGV4dGlsZGU9Nzg1MDtlLkFjdXRlPTYzMTc3O2UuQWN1dGVzbWFsbD02MzQxMjtlLkFjeXJpbGxpYz0xMDQwO2UuQWRibGdyYXZlPTUxMjtlLkFkaWVyZXNpcz0xOTY7ZS5BZGllcmVzaXNjeXJpbGxpYz0xMjM0O2UuQWRpZXJlc2lzbWFjcm9uPTQ3ODtlLkFkaWVyZXNpc3NtYWxsPTYzNDYwO2UuQWRvdGJlbG93PTc4NDA7ZS5BZG90bWFjcm9uPTQ4MDtlLkFncmF2ZT0xOTI7ZS5BZ3JhdmVzbWFsbD02MzQ1NjtlLkFob29rYWJvdmU9Nzg0MjtlLkFpZWN5cmlsbGljPTEyMzY7ZS5BaW52ZXJ0ZWRicmV2ZT01MTQ7ZS5BbHBoYT05MTM7ZS5BbHBoYXRvbm9zPTkwMjtlLkFtYWNyb249MjU2O2UuQW1vbm9zcGFjZT02NTMxMztlLkFvZ29uZWs9MjYwO2UuQXJpbmc9MTk3O2UuQXJpbmdhY3V0ZT01MDY7ZS5BcmluZ2JlbG93PTc2ODA7ZS5BcmluZ3NtYWxsPTYzNDYxO2UuQXNtYWxsPTYzMzI5O2UuQXRpbGRlPTE5NTtlLkF0aWxkZXNtYWxsPTYzNDU5O2UuQXliYXJtZW5pYW49MTMyOTtlLkI9NjY7ZS5CY2lyY2xlPTkzOTk7ZS5CZG90YWNjZW50PTc2ODI7ZS5CZG90YmVsb3c9NzY4NDtlLkJlY3lyaWxsaWM9MTA0MTtlLkJlbmFybWVuaWFuPTEzMzA7ZS5CZXRhPTkxNDtlLkJob29rPTM4NTtlLkJsaW5lYmVsb3c9NzY4NjtlLkJtb25vc3BhY2U9NjUzMTQ7ZS5CcmV2ZXNtYWxsPTYzMjIwO2UuQnNtYWxsPTYzMzMwO2UuQnRvcGJhcj0zODY7ZS5DPTY3O2UuQ2Fhcm1lbmlhbj0xMzQyO2UuQ2FjdXRlPTI2MjtlLkNhcm9uPTYzMTc4O2UuQ2Fyb25zbWFsbD02MzIyMTtlLkNjYXJvbj0yNjg7ZS5DY2VkaWxsYT0xOTk7ZS5DY2VkaWxsYWFjdXRlPTc2ODg7ZS5DY2VkaWxsYXNtYWxsPTYzNDYzO2UuQ2NpcmNsZT05NDAwO2UuQ2NpcmN1bWZsZXg9MjY0O2UuQ2RvdD0yNjY7ZS5DZG90YWNjZW50PTI2NjtlLkNlZGlsbGFzbWFsbD02MzQxNjtlLkNoYWFybWVuaWFuPTEzNTM7ZS5DaGVhYmtoYXNpYW5jeXJpbGxpYz0xMjEyO2UuQ2hlY3lyaWxsaWM9MTA2MztlLkNoZWRlc2NlbmRlcmFia2hhc2lhbmN5cmlsbGljPTEyMTQ7ZS5DaGVkZXNjZW5kZXJjeXJpbGxpYz0xMjA2O2UuQ2hlZGllcmVzaXNjeXJpbGxpYz0xMjY4O2UuQ2hlaGFybWVuaWFuPTEzNDc7ZS5DaGVraGFrYXNzaWFuY3lyaWxsaWM9MTIyNztlLkNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM9MTIwODtlLkNoaT05MzU7ZS5DaG9vaz0zOTE7ZS5DaXJjdW1mbGV4c21hbGw9NjMyMjI7ZS5DbW9ub3NwYWNlPTY1MzE1O2UuQ29hcm1lbmlhbj0xMzYxO2UuQ3NtYWxsPTYzMzMxO2UuRD02ODtlLkRaPTQ5NztlLkRaY2Fyb249NDUyO2UuRGFhcm1lbmlhbj0xMzMyO2UuRGFmcmljYW49MzkzO2UuRGNhcm9uPTI3MDtlLkRjZWRpbGxhPTc2OTY7ZS5EY2lyY2xlPTk0MDE7ZS5EY2lyY3VtZmxleGJlbG93PTc2OTg7ZS5EY3JvYXQ9MjcyO2UuRGRvdGFjY2VudD03NjkwO2UuRGRvdGJlbG93PTc2OTI7ZS5EZWN5cmlsbGljPTEwNDQ7ZS5EZWljb3B0aWM9MTAwNjtlLkRlbHRhPTg3MTA7ZS5EZWx0YWdyZWVrPTkxNjtlLkRob29rPTM5NDtlLkRpZXJlc2lzPTYzMTc5O2UuRGllcmVzaXNBY3V0ZT02MzE4MDtlLkRpZXJlc2lzR3JhdmU9NjMxODE7ZS5EaWVyZXNpc3NtYWxsPTYzNDAwO2UuRGlnYW1tYWdyZWVrPTk4ODtlLkRqZWN5cmlsbGljPTEwMjY7ZS5EbGluZWJlbG93PTc2OTQ7ZS5EbW9ub3NwYWNlPTY1MzE2O2UuRG90YWNjZW50c21hbGw9NjMyMjM7ZS5Ec2xhc2g9MjcyO2UuRHNtYWxsPTYzMzMyO2UuRHRvcGJhcj0zOTU7ZS5Eej00OTg7ZS5EemNhcm9uPTQ1MztlLkR6ZWFia2hhc2lhbmN5cmlsbGljPTEyNDg7ZS5EemVjeXJpbGxpYz0xMDI5O2UuRHpoZWN5cmlsbGljPTEwMzk7ZS5FPTY5O2UuRWFjdXRlPTIwMTtlLkVhY3V0ZXNtYWxsPTYzNDY1O2UuRWJyZXZlPTI3NjtlLkVjYXJvbj0yODI7ZS5FY2VkaWxsYWJyZXZlPTc3MDg7ZS5FY2hhcm1lbmlhbj0xMzMzO2UuRWNpcmNsZT05NDAyO2UuRWNpcmN1bWZsZXg9MjAyO2UuRWNpcmN1bWZsZXhhY3V0ZT03ODcwO2UuRWNpcmN1bWZsZXhiZWxvdz03NzA0O2UuRWNpcmN1bWZsZXhkb3RiZWxvdz03ODc4O2UuRWNpcmN1bWZsZXhncmF2ZT03ODcyO2UuRWNpcmN1bWZsZXhob29rYWJvdmU9Nzg3NDtlLkVjaXJjdW1mbGV4c21hbGw9NjM0NjY7ZS5FY2lyY3VtZmxleHRpbGRlPTc4NzY7ZS5FY3lyaWxsaWM9MTAyODtlLkVkYmxncmF2ZT01MTY7ZS5FZGllcmVzaXM9MjAzO2UuRWRpZXJlc2lzc21hbGw9NjM0Njc7ZS5FZG90PTI3ODtlLkVkb3RhY2NlbnQ9Mjc4O2UuRWRvdGJlbG93PTc4NjQ7ZS5FZmN5cmlsbGljPTEwNjA7ZS5FZ3JhdmU9MjAwO2UuRWdyYXZlc21hbGw9NjM0NjQ7ZS5FaGFybWVuaWFuPTEzMzU7ZS5FaG9va2Fib3ZlPTc4NjY7ZS5FaWdodHJvbWFuPTg1NTE7ZS5FaW52ZXJ0ZWRicmV2ZT01MTg7ZS5FaW90aWZpZWRjeXJpbGxpYz0xMTI0O2UuRWxjeXJpbGxpYz0xMDUxO2UuRWxldmVucm9tYW49ODU1NDtlLkVtYWNyb249Mjc0O2UuRW1hY3JvbmFjdXRlPTc3MDI7ZS5FbWFjcm9uZ3JhdmU9NzcwMDtlLkVtY3lyaWxsaWM9MTA1MjtlLkVtb25vc3BhY2U9NjUzMTc7ZS5FbmN5cmlsbGljPTEwNTM7ZS5FbmRlc2NlbmRlcmN5cmlsbGljPTExODY7ZS5Fbmc9MzMwO2UuRW5naGVjeXJpbGxpYz0xMTg4O2UuRW5ob29rY3lyaWxsaWM9MTIyMztlLkVvZ29uZWs9MjgwO2UuRW9wZW49NDAwO2UuRXBzaWxvbj05MTc7ZS5FcHNpbG9udG9ub3M9OTA0O2UuRXJjeXJpbGxpYz0xMDU2O2UuRXJldmVyc2VkPTM5ODtlLkVyZXZlcnNlZGN5cmlsbGljPTEwNjk7ZS5Fc2N5cmlsbGljPTEwNTc7ZS5Fc2Rlc2NlbmRlcmN5cmlsbGljPTExOTQ7ZS5Fc2g9NDI1O2UuRXNtYWxsPTYzMzMzO2UuRXRhPTkxOTtlLkV0YXJtZW5pYW49MTMzNjtlLkV0YXRvbm9zPTkwNTtlLkV0aD0yMDg7ZS5FdGhzbWFsbD02MzQ3MjtlLkV0aWxkZT03ODY4O2UuRXRpbGRlYmVsb3c9NzcwNjtlLkV1cm89ODM2NDtlLkV6aD00Mzk7ZS5FemhjYXJvbj00OTQ7ZS5FemhyZXZlcnNlZD00NDA7ZS5GPTcwO2UuRmNpcmNsZT05NDAzO2UuRmRvdGFjY2VudD03NzEwO2UuRmVoYXJtZW5pYW49MTM2NjtlLkZlaWNvcHRpYz05OTY7ZS5GaG9vaz00MDE7ZS5GaXRhY3lyaWxsaWM9MTEzODtlLkZpdmVyb21hbj04NTQ4O2UuRm1vbm9zcGFjZT02NTMxODtlLkZvdXJyb21hbj04NTQ3O2UuRnNtYWxsPTYzMzM0O2UuRz03MTtlLkdCc3F1YXJlPTEzMTkxO2UuR2FjdXRlPTUwMDtlLkdhbW1hPTkxNTtlLkdhbW1hYWZyaWNhbj00MDQ7ZS5HYW5naWFjb3B0aWM9MTAwMjtlLkdicmV2ZT0yODY7ZS5HY2Fyb249NDg2O2UuR2NlZGlsbGE9MjkwO2UuR2NpcmNsZT05NDA0O2UuR2NpcmN1bWZsZXg9Mjg0O2UuR2NvbW1hYWNjZW50PTI5MDtlLkdkb3Q9Mjg4O2UuR2RvdGFjY2VudD0yODg7ZS5HZWN5cmlsbGljPTEwNDM7ZS5HaGFkYXJtZW5pYW49MTM0NjtlLkdoZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTcyO2UuR2hlc3Ryb2tlY3lyaWxsaWM9MTE3MDtlLkdoZXVwdHVybmN5cmlsbGljPTExNjg7ZS5HaG9vaz00MDM7ZS5HaW1hcm1lbmlhbj0xMzMxO2UuR2plY3lyaWxsaWM9MTAyNztlLkdtYWNyb249NzcxMjtlLkdtb25vc3BhY2U9NjUzMTk7ZS5HcmF2ZT02MzE4MjtlLkdyYXZlc21hbGw9NjMzMjg7ZS5Hc21hbGw9NjMzMzU7ZS5Hc21hbGxob29rPTY2NztlLkdzdHJva2U9NDg0O2UuSD03MjtlLkgxODUzMz05Njc5O2UuSDE4NTQzPTk2NDI7ZS5IMTg1NTE9OTY0MztlLkgyMjA3Mz05NjMzO2UuSFBzcXVhcmU9MTMyNTk7ZS5IYWFia2hhc2lhbmN5cmlsbGljPTExOTI7ZS5IYWRlc2NlbmRlcmN5cmlsbGljPTEyMDI7ZS5IYXJkc2lnbmN5cmlsbGljPTEwNjY7ZS5IYmFyPTI5NDtlLkhicmV2ZWJlbG93PTc3MjI7ZS5IY2VkaWxsYT03NzIwO2UuSGNpcmNsZT05NDA1O2UuSGNpcmN1bWZsZXg9MjkyO2UuSGRpZXJlc2lzPTc3MTg7ZS5IZG90YWNjZW50PTc3MTQ7ZS5IZG90YmVsb3c9NzcxNjtlLkhtb25vc3BhY2U9NjUzMjA7ZS5Ib2FybWVuaWFuPTEzNDQ7ZS5Ib3JpY29wdGljPTFlMztlLkhzbWFsbD02MzMzNjtlLkh1bmdhcnVtbGF1dD02MzE4MztlLkh1bmdhcnVtbGF1dHNtYWxsPTYzMjI0O2UuSHpzcXVhcmU9MTMyMDA7ZS5JPTczO2UuSUFjeXJpbGxpYz0xMDcxO2UuSUo9MzA2O2UuSVVjeXJpbGxpYz0xMDcwO2UuSWFjdXRlPTIwNTtlLklhY3V0ZXNtYWxsPTYzNDY5O2UuSWJyZXZlPTMwMDtlLkljYXJvbj00NjM7ZS5JY2lyY2xlPTk0MDY7ZS5JY2lyY3VtZmxleD0yMDY7ZS5JY2lyY3VtZmxleHNtYWxsPTYzNDcwO2UuSWN5cmlsbGljPTEwMzA7ZS5JZGJsZ3JhdmU9NTIwO2UuSWRpZXJlc2lzPTIwNztlLklkaWVyZXNpc2FjdXRlPTc3MjY7ZS5JZGllcmVzaXNjeXJpbGxpYz0xMjUyO2UuSWRpZXJlc2lzc21hbGw9NjM0NzE7ZS5JZG90PTMwNDtlLklkb3RhY2NlbnQ9MzA0O2UuSWRvdGJlbG93PTc4ODI7ZS5JZWJyZXZlY3lyaWxsaWM9MTIzODtlLkllY3lyaWxsaWM9MTA0NTtlLklmcmFrdHVyPTg0NjU7ZS5JZ3JhdmU9MjA0O2UuSWdyYXZlc21hbGw9NjM0Njg7ZS5JaG9va2Fib3ZlPTc4ODA7ZS5JaWN5cmlsbGljPTEwNDg7ZS5JaW52ZXJ0ZWRicmV2ZT01MjI7ZS5JaXNob3J0Y3lyaWxsaWM9MTA0OTtlLkltYWNyb249Mjk4O2UuSW1hY3JvbmN5cmlsbGljPTEyNTA7ZS5JbW9ub3NwYWNlPTY1MzIxO2UuSW5pYXJtZW5pYW49MTMzOTtlLklvY3lyaWxsaWM9MTAyNTtlLklvZ29uZWs9MzAyO2UuSW90YT05MjE7ZS5Jb3RhYWZyaWNhbj00MDY7ZS5Jb3RhZGllcmVzaXM9OTM4O2UuSW90YXRvbm9zPTkwNjtlLklzbWFsbD02MzMzNztlLklzdHJva2U9NDA3O2UuSXRpbGRlPTI5NjtlLkl0aWxkZWJlbG93PTc3MjQ7ZS5JemhpdHNhY3lyaWxsaWM9MTE0MDtlLkl6aGl0c2FkYmxncmF2ZWN5cmlsbGljPTExNDI7ZS5KPTc0O2UuSmFhcm1lbmlhbj0xMzQ1O2UuSmNpcmNsZT05NDA3O2UuSmNpcmN1bWZsZXg9MzA4O2UuSmVjeXJpbGxpYz0xMDMyO2UuSmhlaGFybWVuaWFuPTEzNTU7ZS5KbW9ub3NwYWNlPTY1MzIyO2UuSnNtYWxsPTYzMzM4O2UuSz03NTtlLktCc3F1YXJlPTEzMTg5O2UuS0tzcXVhcmU9MTMyNjE7ZS5LYWJhc2hraXJjeXJpbGxpYz0xMTg0O2UuS2FjdXRlPTc3Mjg7ZS5LYWN5cmlsbGljPTEwNTA7ZS5LYWRlc2NlbmRlcmN5cmlsbGljPTExNzg7ZS5LYWhvb2tjeXJpbGxpYz0xMjE5O2UuS2FwcGE9OTIyO2UuS2FzdHJva2VjeXJpbGxpYz0xMTgyO2UuS2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljPTExODA7ZS5LY2Fyb249NDg4O2UuS2NlZGlsbGE9MzEwO2UuS2NpcmNsZT05NDA4O2UuS2NvbW1hYWNjZW50PTMxMDtlLktkb3RiZWxvdz03NzMwO2UuS2VoYXJtZW5pYW49MTM2NDtlLktlbmFybWVuaWFuPTEzNDM7ZS5LaGFjeXJpbGxpYz0xMDYxO2UuS2hlaWNvcHRpYz05OTg7ZS5LaG9vaz00MDg7ZS5LamVjeXJpbGxpYz0xMDM2O2UuS2xpbmViZWxvdz03NzMyO2UuS21vbm9zcGFjZT02NTMyMztlLktvcHBhY3lyaWxsaWM9MTE1MjtlLktvcHBhZ3JlZWs9OTkwO2UuS3NpY3lyaWxsaWM9MTEzNDtlLktzbWFsbD02MzMzOTtlLkw9NzY7ZS5MSj00NTU7ZS5MTD02MzE2NztlLkxhY3V0ZT0zMTM7ZS5MYW1iZGE9OTIzO2UuTGNhcm9uPTMxNztlLkxjZWRpbGxhPTMxNTtlLkxjaXJjbGU9OTQwOTtlLkxjaXJjdW1mbGV4YmVsb3c9Nzc0MDtlLkxjb21tYWFjY2VudD0zMTU7ZS5MZG90PTMxOTtlLkxkb3RhY2NlbnQ9MzE5O2UuTGRvdGJlbG93PTc3MzQ7ZS5MZG90YmVsb3dtYWNyb249NzczNjtlLkxpd25hcm1lbmlhbj0xMzQwO2UuTGo9NDU2O2UuTGplY3lyaWxsaWM9MTAzMztlLkxsaW5lYmVsb3c9NzczODtlLkxtb25vc3BhY2U9NjUzMjQ7ZS5Mc2xhc2g9MzIxO2UuTHNsYXNoc21hbGw9NjMyMjU7ZS5Mc21hbGw9NjMzNDA7ZS5NPTc3O2UuTUJzcXVhcmU9MTMxOTA7ZS5NYWNyb249NjMxODQ7ZS5NYWNyb25zbWFsbD02MzQwNztlLk1hY3V0ZT03NzQyO2UuTWNpcmNsZT05NDEwO2UuTWRvdGFjY2VudD03NzQ0O2UuTWRvdGJlbG93PTc3NDY7ZS5NZW5hcm1lbmlhbj0xMzQ4O2UuTW1vbm9zcGFjZT02NTMyNTtlLk1zbWFsbD02MzM0MTtlLk10dXJuZWQ9NDEyO2UuTXU9OTI0O2UuTj03ODtlLk5KPTQ1ODtlLk5hY3V0ZT0zMjM7ZS5OY2Fyb249MzI3O2UuTmNlZGlsbGE9MzI1O2UuTmNpcmNsZT05NDExO2UuTmNpcmN1bWZsZXhiZWxvdz03NzU0O2UuTmNvbW1hYWNjZW50PTMyNTtlLk5kb3RhY2NlbnQ9Nzc0ODtlLk5kb3RiZWxvdz03NzUwO2UuTmhvb2tsZWZ0PTQxMztlLk5pbmVyb21hbj04NTUyO2UuTmo9NDU5O2UuTmplY3lyaWxsaWM9MTAzNDtlLk5saW5lYmVsb3c9Nzc1MjtlLk5tb25vc3BhY2U9NjUzMjY7ZS5Ob3dhcm1lbmlhbj0xMzUwO2UuTnNtYWxsPTYzMzQyO2UuTnRpbGRlPTIwOTtlLk50aWxkZXNtYWxsPTYzNDczO2UuTnU9OTI1O2UuTz03OTtlLk9FPTMzODtlLk9Fc21hbGw9NjMyMjY7ZS5PYWN1dGU9MjExO2UuT2FjdXRlc21hbGw9NjM0NzU7ZS5PYmFycmVkY3lyaWxsaWM9MTI1NjtlLk9iYXJyZWRkaWVyZXNpc2N5cmlsbGljPTEyNTg7ZS5PYnJldmU9MzM0O2UuT2Nhcm9uPTQ2NTtlLk9jZW50ZXJlZHRpbGRlPTQxNTtlLk9jaXJjbGU9OTQxMjtlLk9jaXJjdW1mbGV4PTIxMjtlLk9jaXJjdW1mbGV4YWN1dGU9Nzg4ODtlLk9jaXJjdW1mbGV4ZG90YmVsb3c9Nzg5NjtlLk9jaXJjdW1mbGV4Z3JhdmU9Nzg5MDtlLk9jaXJjdW1mbGV4aG9va2Fib3ZlPTc4OTI7ZS5PY2lyY3VtZmxleHNtYWxsPTYzNDc2O2UuT2NpcmN1bWZsZXh0aWxkZT03ODk0O2UuT2N5cmlsbGljPTEwNTQ7ZS5PZGJsYWN1dGU9MzM2O2UuT2RibGdyYXZlPTUyNDtlLk9kaWVyZXNpcz0yMTQ7ZS5PZGllcmVzaXNjeXJpbGxpYz0xMjU0O2UuT2RpZXJlc2lzc21hbGw9NjM0Nzg7ZS5PZG90YmVsb3c9Nzg4NDtlLk9nb25la3NtYWxsPTYzMjI3O2UuT2dyYXZlPTIxMDtlLk9ncmF2ZXNtYWxsPTYzNDc0O2UuT2hhcm1lbmlhbj0xMzY1O2UuT2htPTg0ODY7ZS5PaG9va2Fib3ZlPTc4ODY7ZS5PaG9ybj00MTY7ZS5PaG9ybmFjdXRlPTc4OTg7ZS5PaG9ybmRvdGJlbG93PTc5MDY7ZS5PaG9ybmdyYXZlPTc5MDA7ZS5PaG9ybmhvb2thYm92ZT03OTAyO2UuT2hvcm50aWxkZT03OTA0O2UuT2h1bmdhcnVtbGF1dD0zMzY7ZS5PaT00MTg7ZS5PaW52ZXJ0ZWRicmV2ZT01MjY7ZS5PbWFjcm9uPTMzMjtlLk9tYWNyb25hY3V0ZT03NzYyO2UuT21hY3JvbmdyYXZlPTc3NjA7ZS5PbWVnYT04NDg2O2UuT21lZ2FjeXJpbGxpYz0xMTIwO2UuT21lZ2FncmVlaz05Mzc7ZS5PbWVnYXJvdW5kY3lyaWxsaWM9MTE0NjtlLk9tZWdhdGl0bG9jeXJpbGxpYz0xMTQ4O2UuT21lZ2F0b25vcz05MTE7ZS5PbWljcm9uPTkyNztlLk9taWNyb250b25vcz05MDg7ZS5PbW9ub3NwYWNlPTY1MzI3O2UuT25lcm9tYW49ODU0NDtlLk9vZ29uZWs9NDkwO2UuT29nb25la21hY3Jvbj00OTI7ZS5Pb3Blbj0zOTA7ZS5Pc2xhc2g9MjE2O2UuT3NsYXNoYWN1dGU9NTEwO2UuT3NsYXNoc21hbGw9NjM0ODA7ZS5Pc21hbGw9NjMzNDM7ZS5Pc3Ryb2tlYWN1dGU9NTEwO2UuT3RjeXJpbGxpYz0xMTUwO2UuT3RpbGRlPTIxMztlLk90aWxkZWFjdXRlPTc3NTY7ZS5PdGlsZGVkaWVyZXNpcz03NzU4O2UuT3RpbGRlc21hbGw9NjM0Nzc7ZS5QPTgwO2UuUGFjdXRlPTc3NjQ7ZS5QY2lyY2xlPTk0MTM7ZS5QZG90YWNjZW50PTc3NjY7ZS5QZWN5cmlsbGljPTEwNTU7ZS5QZWhhcm1lbmlhbj0xMzU0O2UuUGVtaWRkbGVob29rY3lyaWxsaWM9MTE5MDtlLlBoaT05MzQ7ZS5QaG9vaz00MjA7ZS5QaT05Mjg7ZS5QaXdyYXJtZW5pYW49MTM2MztlLlBtb25vc3BhY2U9NjUzMjg7ZS5Qc2k9OTM2O2UuUHNpY3lyaWxsaWM9MTEzNjtlLlBzbWFsbD02MzM0NDtlLlE9ODE7ZS5RY2lyY2xlPTk0MTQ7ZS5RbW9ub3NwYWNlPTY1MzI5O2UuUXNtYWxsPTYzMzQ1O2UuUj04MjtlLlJhYXJtZW5pYW49MTM1NjtlLlJhY3V0ZT0zNDA7ZS5SY2Fyb249MzQ0O2UuUmNlZGlsbGE9MzQyO2UuUmNpcmNsZT05NDE1O2UuUmNvbW1hYWNjZW50PTM0MjtlLlJkYmxncmF2ZT01Mjg7ZS5SZG90YWNjZW50PTc3Njg7ZS5SZG90YmVsb3c9Nzc3MDtlLlJkb3RiZWxvd21hY3Jvbj03NzcyO2UuUmVoYXJtZW5pYW49MTM2MDtlLlJmcmFrdHVyPTg0NzY7ZS5SaG89OTI5O2UuUmluZ3NtYWxsPTYzMjI4O2UuUmludmVydGVkYnJldmU9NTMwO2UuUmxpbmViZWxvdz03Nzc0O2UuUm1vbm9zcGFjZT02NTMzMDtlLlJzbWFsbD02MzM0NjtlLlJzbWFsbGludmVydGVkPTY0MTtlLlJzbWFsbGludmVydGVkc3VwZXJpb3I9Njk0O2UuUz04MztlLlNGMDEwMDAwPTk0ODQ7ZS5TRjAyMDAwMD05NDkyO2UuU0YwMzAwMDA9OTQ4ODtlLlNGMDQwMDAwPTk0OTY7ZS5TRjA1MDAwMD05NTMyO2UuU0YwNjAwMDA9OTUxNjtlLlNGMDcwMDAwPTk1MjQ7ZS5TRjA4MDAwMD05NTAwO2UuU0YwOTAwMDA9OTUwODtlLlNGMTAwMDAwPTk0NzI7ZS5TRjExMDAwMD05NDc0O2UuU0YxOTAwMDA9OTU2OTtlLlNGMjAwMDAwPTk1NzA7ZS5TRjIxMDAwMD05NTU4O2UuU0YyMjAwMDA9OTU1NztlLlNGMjMwMDAwPTk1NzE7ZS5TRjI0MDAwMD05NTUzO2UuU0YyNTAwMDA9OTU1OTtlLlNGMjYwMDAwPTk1NjU7ZS5TRjI3MDAwMD05NTY0O2UuU0YyODAwMDA9OTU2MztlLlNGMzYwMDAwPTk1NjY7ZS5TRjM3MDAwMD05NTY3O2UuU0YzODAwMDA9OTU2MjtlLlNGMzkwMDAwPTk1NTY7ZS5TRjQwMDAwMD05NTc3O2UuU0Y0MTAwMDA9OTU3NDtlLlNGNDIwMDAwPTk1Njg7ZS5TRjQzMDAwMD05NTUyO2UuU0Y0NDAwMDA9OTU4MDtlLlNGNDUwMDAwPTk1NzU7ZS5TRjQ2MDAwMD05NTc2O2UuU0Y0NzAwMDA9OTU3MjtlLlNGNDgwMDAwPTk1NzM7ZS5TRjQ5MDAwMD05NTYxO2UuU0Y1MDAwMDA9OTU2MDtlLlNGNTEwMDAwPTk1NTQ7ZS5TRjUyMDAwMD05NTU1O2UuU0Y1MzAwMDA9OTU3OTtlLlNGNTQwMDAwPTk1Nzg7ZS5TYWN1dGU9MzQ2O2UuU2FjdXRlZG90YWNjZW50PTc3ODA7ZS5TYW1waWdyZWVrPTk5MjtlLlNjYXJvbj0zNTI7ZS5TY2Fyb25kb3RhY2NlbnQ9Nzc4MjtlLlNjYXJvbnNtYWxsPTYzMjI5O2UuU2NlZGlsbGE9MzUwO2UuU2Nod2E9Mzk5O2UuU2Nod2FjeXJpbGxpYz0xMjQwO2UuU2Nod2FkaWVyZXNpc2N5cmlsbGljPTEyNDI7ZS5TY2lyY2xlPTk0MTY7ZS5TY2lyY3VtZmxleD0zNDg7ZS5TY29tbWFhY2NlbnQ9NTM2O2UuU2RvdGFjY2VudD03Nzc2O2UuU2RvdGJlbG93PTc3Nzg7ZS5TZG90YmVsb3dkb3RhY2NlbnQ9Nzc4NDtlLlNlaGFybWVuaWFuPTEzNTc7ZS5TZXZlbnJvbWFuPTg1NTA7ZS5TaGFhcm1lbmlhbj0xMzUxO2UuU2hhY3lyaWxsaWM9MTA2NDtlLlNoY2hhY3lyaWxsaWM9MTA2NTtlLlNoZWljb3B0aWM9OTk0O2UuU2hoYWN5cmlsbGljPTEyMTA7ZS5TaGltYWNvcHRpYz0xMDA0O2UuU2lnbWE9OTMxO2UuU2l4cm9tYW49ODU0OTtlLlNtb25vc3BhY2U9NjUzMzE7ZS5Tb2Z0c2lnbmN5cmlsbGljPTEwNjg7ZS5Tc21hbGw9NjMzNDc7ZS5TdGlnbWFncmVlaz05ODY7ZS5UPTg0O2UuVGF1PTkzMjtlLlRiYXI9MzU4O2UuVGNhcm9uPTM1NjtlLlRjZWRpbGxhPTM1NDtlLlRjaXJjbGU9OTQxNztlLlRjaXJjdW1mbGV4YmVsb3c9Nzc5MjtlLlRjb21tYWFjY2VudD0zNTQ7ZS5UZG90YWNjZW50PTc3ODY7ZS5UZG90YmVsb3c9Nzc4ODtlLlRlY3lyaWxsaWM9MTA1ODtlLlRlZGVzY2VuZGVyY3lyaWxsaWM9MTE5NjtlLlRlbnJvbWFuPTg1NTM7ZS5UZXRzZWN5cmlsbGljPTEyMDQ7ZS5UaGV0YT05MjA7ZS5UaG9vaz00Mjg7ZS5UaG9ybj0yMjI7ZS5UaG9ybnNtYWxsPTYzNDg2O2UuVGhyZWVyb21hbj04NTQ2O2UuVGlsZGVzbWFsbD02MzIzMDtlLlRpd25hcm1lbmlhbj0xMzU5O2UuVGxpbmViZWxvdz03NzkwO2UuVG1vbm9zcGFjZT02NTMzMjtlLlRvYXJtZW5pYW49MTMzNztlLlRvbmVmaXZlPTQ0NDtlLlRvbmVzaXg9Mzg4O2UuVG9uZXR3bz00MjM7ZS5UcmV0cm9mbGV4aG9vaz00MzA7ZS5Uc2VjeXJpbGxpYz0xMDYyO2UuVHNoZWN5cmlsbGljPTEwMzU7ZS5Uc21hbGw9NjMzNDg7ZS5Ud2VsdmVyb21hbj04NTU1O2UuVHdvcm9tYW49ODU0NTtlLlU9ODU7ZS5VYWN1dGU9MjE4O2UuVWFjdXRlc21hbGw9NjM0ODI7ZS5VYnJldmU9MzY0O2UuVWNhcm9uPTQ2NztlLlVjaXJjbGU9OTQxODtlLlVjaXJjdW1mbGV4PTIxOTtlLlVjaXJjdW1mbGV4YmVsb3c9Nzc5ODtlLlVjaXJjdW1mbGV4c21hbGw9NjM0ODM7ZS5VY3lyaWxsaWM9MTA1OTtlLlVkYmxhY3V0ZT0zNjg7ZS5VZGJsZ3JhdmU9NTMyO2UuVWRpZXJlc2lzPTIyMDtlLlVkaWVyZXNpc2FjdXRlPTQ3MTtlLlVkaWVyZXNpc2JlbG93PTc3OTQ7ZS5VZGllcmVzaXNjYXJvbj00NzM7ZS5VZGllcmVzaXNjeXJpbGxpYz0xMjY0O2UuVWRpZXJlc2lzZ3JhdmU9NDc1O2UuVWRpZXJlc2lzbWFjcm9uPTQ2OTtlLlVkaWVyZXNpc3NtYWxsPTYzNDg0O2UuVWRvdGJlbG93PTc5MDg7ZS5VZ3JhdmU9MjE3O2UuVWdyYXZlc21hbGw9NjM0ODE7ZS5VaG9va2Fib3ZlPTc5MTA7ZS5VaG9ybj00MzE7ZS5VaG9ybmFjdXRlPTc5MTI7ZS5VaG9ybmRvdGJlbG93PTc5MjA7ZS5VaG9ybmdyYXZlPTc5MTQ7ZS5VaG9ybmhvb2thYm92ZT03OTE2O2UuVWhvcm50aWxkZT03OTE4O2UuVWh1bmdhcnVtbGF1dD0zNjg7ZS5VaHVuZ2FydW1sYXV0Y3lyaWxsaWM9MTI2NjtlLlVpbnZlcnRlZGJyZXZlPTUzNDtlLlVrY3lyaWxsaWM9MTE0NDtlLlVtYWNyb249MzYyO2UuVW1hY3JvbmN5cmlsbGljPTEyNjI7ZS5VbWFjcm9uZGllcmVzaXM9NzgwMjtlLlVtb25vc3BhY2U9NjUzMzM7ZS5Vb2dvbmVrPTM3MDtlLlVwc2lsb249OTMzO2UuVXBzaWxvbjE9OTc4O2UuVXBzaWxvbmFjdXRlaG9va3N5bWJvbGdyZWVrPTk3OTtlLlVwc2lsb25hZnJpY2FuPTQzMztlLlVwc2lsb25kaWVyZXNpcz05Mzk7ZS5VcHNpbG9uZGllcmVzaXNob29rc3ltYm9sZ3JlZWs9OTgwO2UuVXBzaWxvbmhvb2tzeW1ib2w9OTc4O2UuVXBzaWxvbnRvbm9zPTkxMDtlLlVyaW5nPTM2NjtlLlVzaG9ydGN5cmlsbGljPTEwMzg7ZS5Vc21hbGw9NjMzNDk7ZS5Vc3RyYWlnaHRjeXJpbGxpYz0xMTk4O2UuVXN0cmFpZ2h0c3Ryb2tlY3lyaWxsaWM9MTIwMDtlLlV0aWxkZT0zNjA7ZS5VdGlsZGVhY3V0ZT03ODAwO2UuVXRpbGRlYmVsb3c9Nzc5NjtlLlY9ODY7ZS5WY2lyY2xlPTk0MTk7ZS5WZG90YmVsb3c9NzgwNjtlLlZlY3lyaWxsaWM9MTA0MjtlLlZld2FybWVuaWFuPTEzNTg7ZS5WaG9vaz00MzQ7ZS5WbW9ub3NwYWNlPTY1MzM0O2UuVm9hcm1lbmlhbj0xMzUyO2UuVnNtYWxsPTYzMzUwO2UuVnRpbGRlPTc4MDQ7ZS5XPTg3O2UuV2FjdXRlPTc4MTA7ZS5XY2lyY2xlPTk0MjA7ZS5XY2lyY3VtZmxleD0zNzI7ZS5XZGllcmVzaXM9NzgxMjtlLldkb3RhY2NlbnQ9NzgxNDtlLldkb3RiZWxvdz03ODE2O2UuV2dyYXZlPTc4MDg7ZS5XbW9ub3NwYWNlPTY1MzM1O2UuV3NtYWxsPTYzMzUxO2UuWD04ODtlLlhjaXJjbGU9OTQyMTtlLlhkaWVyZXNpcz03ODIwO2UuWGRvdGFjY2VudD03ODE4O2UuWGVoYXJtZW5pYW49MTM0MTtlLlhpPTkyNjtlLlhtb25vc3BhY2U9NjUzMzY7ZS5Yc21hbGw9NjMzNTI7ZS5ZPTg5O2UuWWFjdXRlPTIyMTtlLllhY3V0ZXNtYWxsPTYzNDg1O2UuWWF0Y3lyaWxsaWM9MTEyMjtlLlljaXJjbGU9OTQyMjtlLlljaXJjdW1mbGV4PTM3NDtlLllkaWVyZXNpcz0zNzY7ZS5ZZGllcmVzaXNzbWFsbD02MzQ4NztlLllkb3RhY2NlbnQ9NzgyMjtlLllkb3RiZWxvdz03OTI0O2UuWWVyaWN5cmlsbGljPTEwNjc7ZS5ZZXJ1ZGllcmVzaXNjeXJpbGxpYz0xMjcyO2UuWWdyYXZlPTc5MjI7ZS5ZaG9vaz00MzU7ZS5ZaG9va2Fib3ZlPTc5MjY7ZS5ZaWFybWVuaWFuPTEzNDk7ZS5ZaWN5cmlsbGljPTEwMzE7ZS5ZaXduYXJtZW5pYW49MTM2MjtlLlltb25vc3BhY2U9NjUzMzc7ZS5Zc21hbGw9NjMzNTM7ZS5ZdGlsZGU9NzkyODtlLll1c2JpZ2N5cmlsbGljPTExMzA7ZS5ZdXNiaWdpb3RpZmllZGN5cmlsbGljPTExMzI7ZS5ZdXNsaXR0bGVjeXJpbGxpYz0xMTI2O2UuWXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYz0xMTI4O2UuWj05MDtlLlphYXJtZW5pYW49MTMzNDtlLlphY3V0ZT0zNzc7ZS5aY2Fyb249MzgxO2UuWmNhcm9uc21hbGw9NjMyMzE7ZS5aY2lyY2xlPTk0MjM7ZS5aY2lyY3VtZmxleD03ODI0O2UuWmRvdD0zNzk7ZS5aZG90YWNjZW50PTM3OTtlLlpkb3RiZWxvdz03ODI2O2UuWmVjeXJpbGxpYz0xMDQ3O2UuWmVkZXNjZW5kZXJjeXJpbGxpYz0xMTc2O2UuWmVkaWVyZXNpc2N5cmlsbGljPTEyNDY7ZS5aZXRhPTkxODtlLlpoZWFybWVuaWFuPTEzMzg7ZS5aaGVicmV2ZWN5cmlsbGljPTEyMTc7ZS5aaGVjeXJpbGxpYz0xMDQ2O2UuWmhlZGVzY2VuZGVyY3lyaWxsaWM9MTE3NDtlLlpoZWRpZXJlc2lzY3lyaWxsaWM9MTI0NDtlLlpsaW5lYmVsb3c9NzgyODtlLlptb25vc3BhY2U9NjUzMzg7ZS5ac21hbGw9NjMzNTQ7ZS5ac3Ryb2tlPTQzNztlLmE9OTc7ZS5hYWJlbmdhbGk9MjQzODtlLmFhY3V0ZT0yMjU7ZS5hYWRldmE9MjMxMDtlLmFhZ3VqYXJhdGk9MjY5NDtlLmFhZ3VybXVraGk9MjU2NjtlLmFhbWF0cmFndXJtdWtoaT0yNjIyO2UuYWFydXNxdWFyZT0xMzA1OTtlLmFhdm93ZWxzaWduYmVuZ2FsaT0yNDk0O2UuYWF2b3dlbHNpZ25kZXZhPTIzNjY7ZS5hYXZvd2Vsc2lnbmd1amFyYXRpPTI3NTA7ZS5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW49MTM3NTtlLmFiYnJldmlhdGlvbnNpZ25kZXZhPTI0MTY7ZS5hYmVuZ2FsaT0yNDM3O2UuYWJvcG9tb2ZvPTEyNTcwO2UuYWJyZXZlPTI1OTtlLmFicmV2ZWFjdXRlPTc4NTU7ZS5hYnJldmVjeXJpbGxpYz0xMjMzO2UuYWJyZXZlZG90YmVsb3c9Nzg2MztlLmFicmV2ZWdyYXZlPTc4NTc7ZS5hYnJldmVob29rYWJvdmU9Nzg1OTtlLmFicmV2ZXRpbGRlPTc4NjE7ZS5hY2Fyb249NDYyO2UuYWNpcmNsZT05NDI0O2UuYWNpcmN1bWZsZXg9MjI2O2UuYWNpcmN1bWZsZXhhY3V0ZT03ODQ1O2UuYWNpcmN1bWZsZXhkb3RiZWxvdz03ODUzO2UuYWNpcmN1bWZsZXhncmF2ZT03ODQ3O2UuYWNpcmN1bWZsZXhob29rYWJvdmU9Nzg0OTtlLmFjaXJjdW1mbGV4dGlsZGU9Nzg1MTtlLmFjdXRlPTE4MDtlLmFjdXRlYmVsb3djbWI9NzkxO2UuYWN1dGVjbWI9NzY5O2UuYWN1dGVjb21iPTc2OTtlLmFjdXRlZGV2YT0yMzg4O2UuYWN1dGVsb3dtb2Q9NzE5O2UuYWN1dGV0b25lY21iPTgzMztlLmFjeXJpbGxpYz0xMDcyO2UuYWRibGdyYXZlPTUxMztlLmFkZGFrZ3VybXVraGk9MjY3MztlLmFkZXZhPTIzMDk7ZS5hZGllcmVzaXM9MjI4O2UuYWRpZXJlc2lzY3lyaWxsaWM9MTIzNTtlLmFkaWVyZXNpc21hY3Jvbj00Nzk7ZS5hZG90YmVsb3c9Nzg0MTtlLmFkb3RtYWNyb249NDgxO2UuYWU9MjMwO2UuYWVhY3V0ZT01MDk7ZS5hZWtvcmVhbj0xMjYyNDtlLmFlbWFjcm9uPTQ4MztlLmFmaWkwMDIwOD04MjEzO2UuYWZpaTA4OTQxPTgzNTY7ZS5hZmlpMTAwMTc9MTA0MDtlLmFmaWkxMDAxOD0xMDQxO2UuYWZpaTEwMDE5PTEwNDI7ZS5hZmlpMTAwMjA9MTA0MztlLmFmaWkxMDAyMT0xMDQ0O2UuYWZpaTEwMDIyPTEwNDU7ZS5hZmlpMTAwMjM9MTAyNTtlLmFmaWkxMDAyND0xMDQ2O2UuYWZpaTEwMDI1PTEwNDc7ZS5hZmlpMTAwMjY9MTA0ODtlLmFmaWkxMDAyNz0xMDQ5O2UuYWZpaTEwMDI4PTEwNTA7ZS5hZmlpMTAwMjk9MTA1MTtlLmFmaWkxMDAzMD0xMDUyO2UuYWZpaTEwMDMxPTEwNTM7ZS5hZmlpMTAwMzI9MTA1NDtlLmFmaWkxMDAzMz0xMDU1O2UuYWZpaTEwMDM0PTEwNTY7ZS5hZmlpMTAwMzU9MTA1NztlLmFmaWkxMDAzNj0xMDU4O2UuYWZpaTEwMDM3PTEwNTk7ZS5hZmlpMTAwMzg9MTA2MDtlLmFmaWkxMDAzOT0xMDYxO2UuYWZpaTEwMDQwPTEwNjI7ZS5hZmlpMTAwNDE9MTA2MztlLmFmaWkxMDA0Mj0xMDY0O2UuYWZpaTEwMDQzPTEwNjU7ZS5hZmlpMTAwNDQ9MTA2NjtlLmFmaWkxMDA0NT0xMDY3O2UuYWZpaTEwMDQ2PTEwNjg7ZS5hZmlpMTAwNDc9MTA2OTtlLmFmaWkxMDA0OD0xMDcwO2UuYWZpaTEwMDQ5PTEwNzE7ZS5hZmlpMTAwNTA9MTE2ODtlLmFmaWkxMDA1MT0xMDI2O2UuYWZpaTEwMDUyPTEwMjc7ZS5hZmlpMTAwNTM9MTAyODtlLmFmaWkxMDA1ND0xMDI5O2UuYWZpaTEwMDU1PTEwMzA7ZS5hZmlpMTAwNTY9MTAzMTtlLmFmaWkxMDA1Nz0xMDMyO2UuYWZpaTEwMDU4PTEwMzM7ZS5hZmlpMTAwNTk9MTAzNDtlLmFmaWkxMDA2MD0xMDM1O2UuYWZpaTEwMDYxPTEwMzY7ZS5hZmlpMTAwNjI9MTAzODtlLmFmaWkxMDA2Mz02MzE3MjtlLmFmaWkxMDA2ND02MzE3MztlLmFmaWkxMDA2NT0xMDcyO2UuYWZpaTEwMDY2PTEwNzM7ZS5hZmlpMTAwNjc9MTA3NDtlLmFmaWkxMDA2OD0xMDc1O2UuYWZpaTEwMDY5PTEwNzY7ZS5hZmlpMTAwNzA9MTA3NztlLmFmaWkxMDA3MT0xMTA1O2UuYWZpaTEwMDcyPTEwNzg7ZS5hZmlpMTAwNzM9MTA3OTtlLmFmaWkxMDA3ND0xMDgwO2UuYWZpaTEwMDc1PTEwODE7ZS5hZmlpMTAwNzY9MTA4MjtlLmFmaWkxMDA3Nz0xMDgzO2UuYWZpaTEwMDc4PTEwODQ7ZS5hZmlpMTAwNzk9MTA4NTtlLmFmaWkxMDA4MD0xMDg2O2UuYWZpaTEwMDgxPTEwODc7ZS5hZmlpMTAwODI9MTA4ODtlLmFmaWkxMDA4Mz0xMDg5O2UuYWZpaTEwMDg0PTEwOTA7ZS5hZmlpMTAwODU9MTA5MTtlLmFmaWkxMDA4Nj0xMDkyO2UuYWZpaTEwMDg3PTEwOTM7ZS5hZmlpMTAwODg9MTA5NDtlLmFmaWkxMDA4OT0xMDk1O2UuYWZpaTEwMDkwPTEwOTY7ZS5hZmlpMTAwOTE9MTA5NztlLmFmaWkxMDA5Mj0xMDk4O2UuYWZpaTEwMDkzPTEwOTk7ZS5hZmlpMTAwOTQ9MTEwMDtlLmFmaWkxMDA5NT0xMTAxO2UuYWZpaTEwMDk2PTExMDI7ZS5hZmlpMTAwOTc9MTEwMztlLmFmaWkxMDA5OD0xMTY5O2UuYWZpaTEwMDk5PTExMDY7ZS5hZmlpMTAxMDA9MTEwNztlLmFmaWkxMDEwMT0xMTA4O2UuYWZpaTEwMTAyPTExMDk7ZS5hZmlpMTAxMDM9MTExMDtlLmFmaWkxMDEwND0xMTExO2UuYWZpaTEwMTA1PTExMTI7ZS5hZmlpMTAxMDY9MTExMztlLmFmaWkxMDEwNz0xMTE0O2UuYWZpaTEwMTA4PTExMTU7ZS5hZmlpMTAxMDk9MTExNjtlLmFmaWkxMDExMD0xMTE4O2UuYWZpaTEwMTQ1PTEwMzk7ZS5hZmlpMTAxNDY9MTEyMjtlLmFmaWkxMDE0Nz0xMTM4O2UuYWZpaTEwMTQ4PTExNDA7ZS5hZmlpMTAxOTI9NjMxNzQ7ZS5hZmlpMTAxOTM9MTExOTtlLmFmaWkxMDE5ND0xMTIzO2UuYWZpaTEwMTk1PTExMzk7ZS5hZmlpMTAxOTY9MTE0MTtlLmFmaWkxMDgzMT02MzE3NTtlLmFmaWkxMDgzMj02MzE3NjtlLmFmaWkxMDg0Nj0xMjQxO2UuYWZpaTI5OT04MjA2O2UuYWZpaTMwMD04MjA3O2UuYWZpaTMwMT04MjA1O2UuYWZpaTU3MzgxPTE2NDI7ZS5hZmlpNTczODg9MTU0ODtlLmFmaWk1NzM5Mj0xNjMyO2UuYWZpaTU3MzkzPTE2MzM7ZS5hZmlpNTczOTQ9MTYzNDtlLmFmaWk1NzM5NT0xNjM1O2UuYWZpaTU3Mzk2PTE2MzY7ZS5hZmlpNTczOTc9MTYzNztlLmFmaWk1NzM5OD0xNjM4O2UuYWZpaTU3Mzk5PTE2Mzk7ZS5hZmlpNTc0MDA9MTY0MDtlLmFmaWk1NzQwMT0xNjQxO2UuYWZpaTU3NDAzPTE1NjM7ZS5hZmlpNTc0MDc9MTU2NztlLmFmaWk1NzQwOT0xNTY5O2UuYWZpaTU3NDEwPTE1NzA7ZS5hZmlpNTc0MTE9MTU3MTtlLmFmaWk1NzQxMj0xNTcyO2UuYWZpaTU3NDEzPTE1NzM7ZS5hZmlpNTc0MTQ9MTU3NDtlLmFmaWk1NzQxNT0xNTc1O2UuYWZpaTU3NDE2PTE1NzY7ZS5hZmlpNTc0MTc9MTU3NztlLmFmaWk1NzQxOD0xNTc4O2UuYWZpaTU3NDE5PTE1Nzk7ZS5hZmlpNTc0MjA9MTU4MDtlLmFmaWk1NzQyMT0xNTgxO2UuYWZpaTU3NDIyPTE1ODI7ZS5hZmlpNTc0MjM9MTU4MztlLmFmaWk1NzQyND0xNTg0O2UuYWZpaTU3NDI1PTE1ODU7ZS5hZmlpNTc0MjY9MTU4NjtlLmFmaWk1NzQyNz0xNTg3O2UuYWZpaTU3NDI4PTE1ODg7ZS5hZmlpNTc0Mjk9MTU4OTtlLmFmaWk1NzQzMD0xNTkwO2UuYWZpaTU3NDMxPTE1OTE7ZS5hZmlpNTc0MzI9MTU5MjtlLmFmaWk1NzQzMz0xNTkzO2UuYWZpaTU3NDM0PTE1OTQ7ZS5hZmlpNTc0NDA9MTYwMDtlLmFmaWk1NzQ0MT0xNjAxO2UuYWZpaTU3NDQyPTE2MDI7ZS5hZmlpNTc0NDM9MTYwMztlLmFmaWk1NzQ0ND0xNjA0O2UuYWZpaTU3NDQ1PTE2MDU7ZS5hZmlpNTc0NDY9MTYwNjtlLmFmaWk1NzQ0OD0xNjA4O2UuYWZpaTU3NDQ5PTE2MDk7ZS5hZmlpNTc0NTA9MTYxMDtlLmFmaWk1NzQ1MT0xNjExO2UuYWZpaTU3NDUyPTE2MTI7ZS5hZmlpNTc0NTM9MTYxMztlLmFmaWk1NzQ1ND0xNjE0O2UuYWZpaTU3NDU1PTE2MTU7ZS5hZmlpNTc0NTY9MTYxNjtlLmFmaWk1NzQ1Nz0xNjE3O2UuYWZpaTU3NDU4PTE2MTg7ZS5hZmlpNTc0NzA9MTYwNztlLmFmaWk1NzUwNT0xNzAwO2UuYWZpaTU3NTA2PTE2NjI7ZS5hZmlpNTc1MDc9MTY3MDtlLmFmaWk1NzUwOD0xNjg4O2UuYWZpaTU3NTA5PTE3MTE7ZS5hZmlpNTc1MTE9MTY1NztlLmFmaWk1NzUxMj0xNjcyO2UuYWZpaTU3NTEzPTE2ODE7ZS5hZmlpNTc1MTQ9MTcyMjtlLmFmaWk1NzUxOT0xNzQ2O2UuYWZpaTU3NTM0PTE3NDk7ZS5hZmlpNTc2MzY9ODM2MjtlLmFmaWk1NzY0NT0xNDcwO2UuYWZpaTU3NjU4PTE0NzU7ZS5hZmlpNTc2NjQ9MTQ4ODtlLmFmaWk1NzY2NT0xNDg5O2UuYWZpaTU3NjY2PTE0OTA7ZS5hZmlpNTc2Njc9MTQ5MTtlLmFmaWk1NzY2OD0xNDkyO2UuYWZpaTU3NjY5PTE0OTM7ZS5hZmlpNTc2NzA9MTQ5NDtlLmFmaWk1NzY3MT0xNDk1O2UuYWZpaTU3NjcyPTE0OTY7ZS5hZmlpNTc2NzM9MTQ5NztlLmFmaWk1NzY3ND0xNDk4O2UuYWZpaTU3Njc1PTE0OTk7ZS5hZmlpNTc2NzY9MTUwMDtlLmFmaWk1NzY3Nz0xNTAxO2UuYWZpaTU3Njc4PTE1MDI7ZS5hZmlpNTc2Nzk9MTUwMztlLmFmaWk1NzY4MD0xNTA0O2UuYWZpaTU3NjgxPTE1MDU7ZS5hZmlpNTc2ODI9MTUwNjtlLmFmaWk1NzY4Mz0xNTA3O2UuYWZpaTU3Njg0PTE1MDg7ZS5hZmlpNTc2ODU9MTUwOTtlLmFmaWk1NzY4Nj0xNTEwO2UuYWZpaTU3Njg3PTE1MTE7ZS5hZmlpNTc2ODg9MTUxMjtlLmFmaWk1NzY4OT0xNTEzO2UuYWZpaTU3NjkwPTE1MTQ7ZS5hZmlpNTc2OTQ9NjQyOTg7ZS5hZmlpNTc2OTU9NjQyOTk7ZS5hZmlpNTc3MDA9NjQzMzE7ZS5hZmlpNTc3MDU9NjQyODc7ZS5hZmlpNTc3MTY9MTUyMDtlLmFmaWk1NzcxNz0xNTIxO2UuYWZpaTU3NzE4PTE1MjI7ZS5hZmlpNTc3MjM9NjQzMDk7ZS5hZmlpNTc3OTM9MTQ2MDtlLmFmaWk1Nzc5ND0xNDYxO2UuYWZpaTU3Nzk1PTE0NjI7ZS5hZmlpNTc3OTY9MTQ2NztlLmFmaWk1Nzc5Nz0xNDY0O2UuYWZpaTU3Nzk4PTE0NjM7ZS5hZmlpNTc3OTk9MTQ1NjtlLmFmaWk1NzgwMD0xNDU4O2UuYWZpaTU3ODAxPTE0NTc7ZS5hZmlpNTc4MDI9MTQ1OTtlLmFmaWk1NzgwMz0xNDc0O2UuYWZpaTU3ODA0PTE0NzM7ZS5hZmlpNTc4MDY9MTQ2NTtlLmFmaWk1NzgwNz0xNDY4O2UuYWZpaTU3ODM5PTE0Njk7ZS5hZmlpNTc4NDE9MTQ3MTtlLmFmaWk1Nzg0Mj0xNDcyO2UuYWZpaTU3OTI5PTcwMDtlLmFmaWk2MTI0OD04NDUzO2UuYWZpaTYxMjg5PTg0Njc7ZS5hZmlpNjEzNTI9ODQ3MDtlLmFmaWk2MTU3Mz04MjM2O2UuYWZpaTYxNTc0PTgyMzc7ZS5hZmlpNjE1NzU9ODIzODtlLmFmaWk2MTY2ND04MjA0O2UuYWZpaTYzMTY3PTE2NDU7ZS5hZmlpNjQ5Mzc9NzAxO2UuYWdyYXZlPTIyNDtlLmFndWphcmF0aT0yNjkzO2UuYWd1cm11a2hpPTI1NjU7ZS5haGlyYWdhbmE9MTIzNTQ7ZS5haG9va2Fib3ZlPTc4NDM7ZS5haWJlbmdhbGk9MjQ0ODtlLmFpYm9wb21vZm89MTI1NzQ7ZS5haWRldmE9MjMyMDtlLmFpZWN5cmlsbGljPTEyMzc7ZS5haWd1amFyYXRpPTI3MDQ7ZS5haWd1cm11a2hpPTI1NzY7ZS5haW1hdHJhZ3VybXVraGk9MjYzMjtlLmFpbmFyYWJpYz0xNTkzO2UuYWluZmluYWxhcmFiaWM9NjUyMjY7ZS5haW5pbml0aWFsYXJhYmljPTY1MjI3O2UuYWlubWVkaWFsYXJhYmljPTY1MjI4O2UuYWludmVydGVkYnJldmU9NTE1O2UuYWl2b3dlbHNpZ25iZW5nYWxpPTI1MDQ7ZS5haXZvd2Vsc2lnbmRldmE9MjM3NjtlLmFpdm93ZWxzaWduZ3VqYXJhdGk9Mjc2MDtlLmFrYXRha2FuYT0xMjQ1MDtlLmFrYXRha2FuYWhhbGZ3aWR0aD02NTM5MztlLmFrb3JlYW49MTI2MjM7ZS5hbGVmPTE0ODg7ZS5hbGVmYXJhYmljPTE1NzU7ZS5hbGVmZGFnZXNoaGVicmV3PTY0MzA0O2UuYWxlZmZpbmFsYXJhYmljPTY1MTY2O2UuYWxlZmhhbXphYWJvdmVhcmFiaWM9MTU3MTtlLmFsZWZoYW16YWFib3ZlZmluYWxhcmFiaWM9NjUxNTY7ZS5hbGVmaGFtemFiZWxvd2FyYWJpYz0xNTczO2UuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYz02NTE2MDtlLmFsZWZoZWJyZXc9MTQ4ODtlLmFsZWZsYW1lZGhlYnJldz02NDMzNTtlLmFsZWZtYWRkYWFib3ZlYXJhYmljPTE1NzA7ZS5hbGVmbWFkZGFhYm92ZWZpbmFsYXJhYmljPTY1MTU0O2UuYWxlZm1ha3N1cmFhcmFiaWM9MTYwOTtlLmFsZWZtYWtzdXJhZmluYWxhcmFiaWM9NjUyNjQ7ZS5hbGVmbWFrc3VyYWluaXRpYWxhcmFiaWM9NjUyNjc7ZS5hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYz02NTI2ODtlLmFsZWZwYXRhaGhlYnJldz02NDMwMjtlLmFsZWZxYW1hdHNoZWJyZXc9NjQzMDM7ZS5hbGVwaD04NTAxO2UuYWxsZXF1YWw9ODc4MDtlLmFscGhhPTk0NTtlLmFscGhhdG9ub3M9OTQwO2UuYW1hY3Jvbj0yNTc7ZS5hbW9ub3NwYWNlPTY1MzQ1O2UuYW1wZXJzYW5kPTM4O2UuYW1wZXJzYW5kbW9ub3NwYWNlPTY1Mjg2O2UuYW1wZXJzYW5kc21hbGw9NjMyNzA7ZS5hbXNxdWFyZT0xMzI1MDtlLmFuYm9wb21vZm89MTI1Nzg7ZS5hbmdib3BvbW9mbz0xMjU4MDtlLmFuZ2JyYWNrZXRsZWZ0PTEyMjk2O2UuYW5nYnJhY2tldHJpZ2h0PTEyMjk3O2UuYW5na2hhbmtodXRoYWk9MzY3NDtlLmFuZ2xlPTg3MzY7ZS5hbmdsZWJyYWNrZXRsZWZ0PTEyMjk2O2UuYW5nbGVicmFja2V0bGVmdHZlcnRpY2FsPTY1MDg3O2UuYW5nbGVicmFja2V0cmlnaHQ9MTIyOTc7ZS5hbmdsZWJyYWNrZXRyaWdodHZlcnRpY2FsPTY1MDg4O2UuYW5nbGVsZWZ0PTkwMDE7ZS5hbmdsZXJpZ2h0PTkwMDI7ZS5hbmdzdHJvbT04NDkxO2UuYW5vdGVsZWlhPTkwMztlLmFudWRhdHRhZGV2YT0yMzg2O2UuYW51c3ZhcmFiZW5nYWxpPTI0MzQ7ZS5hbnVzdmFyYWRldmE9MjMwNjtlLmFudXN2YXJhZ3VqYXJhdGk9MjY5MDtlLmFvZ29uZWs9MjYxO2UuYXBhYXRvc3F1YXJlPTEzMDU2O2UuYXBhcmVuPTkzNzI7ZS5hcG9zdHJvcGhlYXJtZW5pYW49MTM3MDtlLmFwb3N0cm9waGVtb2Q9NzAwO2UuYXBwbGU9NjM3NDM7ZS5hcHByb2FjaGVzPTg3ODQ7ZS5hcHByb3hlcXVhbD04Nzc2O2UuYXBwcm94ZXF1YWxvcmltYWdlPTg3ODY7ZS5hcHByb3hpbWF0ZWx5ZXF1YWw9ODc3MztlLmFyYWVhZWtvcmVhbj0xMjY4NjtlLmFyYWVha29yZWFuPTEyNjg1O2UuYXJjPTg5Nzg7ZS5hcmlnaHRoYWxmcmluZz03ODM0O2UuYXJpbmc9MjI5O2UuYXJpbmdhY3V0ZT01MDc7ZS5hcmluZ2JlbG93PTc2ODE7ZS5hcnJvd2JvdGg9ODU5NjtlLmFycm93ZGFzaGRvd249ODY3NTtlLmFycm93ZGFzaGxlZnQ9ODY3MjtlLmFycm93ZGFzaHJpZ2h0PTg2NzQ7ZS5hcnJvd2Rhc2h1cD04NjczO2UuYXJyb3dkYmxib3RoPTg2NjA7ZS5hcnJvd2RibGRvd249ODY1OTtlLmFycm93ZGJsbGVmdD04NjU2O2UuYXJyb3dkYmxyaWdodD04NjU4O2UuYXJyb3dkYmx1cD04NjU3O2UuYXJyb3dkb3duPTg1OTU7ZS5hcnJvd2Rvd25sZWZ0PTg2MDE7ZS5hcnJvd2Rvd25yaWdodD04NjAwO2UuYXJyb3dkb3dud2hpdGU9ODY4MTtlLmFycm93aGVhZGRvd25tb2Q9NzA5O2UuYXJyb3doZWFkbGVmdG1vZD03MDY7ZS5hcnJvd2hlYWRyaWdodG1vZD03MDc7ZS5hcnJvd2hlYWR1cG1vZD03MDg7ZS5hcnJvd2hvcml6ZXg9NjM3MTk7ZS5hcnJvd2xlZnQ9ODU5MjtlLmFycm93bGVmdGRibD04NjU2O2UuYXJyb3dsZWZ0ZGJsc3Ryb2tlPTg2NTM7ZS5hcnJvd2xlZnRvdmVycmlnaHQ9ODY0NjtlLmFycm93bGVmdHdoaXRlPTg2Nzg7ZS5hcnJvd3JpZ2h0PTg1OTQ7ZS5hcnJvd3JpZ2h0ZGJsc3Ryb2tlPTg2NTU7ZS5hcnJvd3JpZ2h0aGVhdnk9MTAxNDI7ZS5hcnJvd3JpZ2h0b3ZlcmxlZnQ9ODY0NDtlLmFycm93cmlnaHR3aGl0ZT04NjgwO2UuYXJyb3d0YWJsZWZ0PTg2NzY7ZS5hcnJvd3RhYnJpZ2h0PTg2Nzc7ZS5hcnJvd3VwPTg1OTM7ZS5hcnJvd3VwZG49ODU5NztlLmFycm93dXBkbmJzZT04NjE2O2UuYXJyb3d1cGRvd25iYXNlPTg2MTY7ZS5hcnJvd3VwbGVmdD04NTk4O2UuYXJyb3d1cGxlZnRvZmRvd249ODY0NTtlLmFycm93dXByaWdodD04NTk5O2UuYXJyb3d1cHdoaXRlPTg2Nzk7ZS5hcnJvd3ZlcnRleD02MzcxODtlLmFzY2lpY2lyY3VtPTk0O2UuYXNjaWljaXJjdW1tb25vc3BhY2U9NjUzNDI7ZS5hc2NpaXRpbGRlPTEyNjtlLmFzY2lpdGlsZGVtb25vc3BhY2U9NjUzNzQ7ZS5hc2NyaXB0PTU5MztlLmFzY3JpcHR0dXJuZWQ9NTk0O2UuYXNtYWxsaGlyYWdhbmE9MTIzNTM7ZS5hc21hbGxrYXRha2FuYT0xMjQ0OTtlLmFzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1MzgzO2UuYXN0ZXJpc2s9NDI7ZS5hc3Rlcmlza2FsdG9uZWFyYWJpYz0xNjQ1O2UuYXN0ZXJpc2thcmFiaWM9MTY0NTtlLmFzdGVyaXNrbWF0aD04NzI3O2UuYXN0ZXJpc2ttb25vc3BhY2U9NjUyOTA7ZS5hc3Rlcmlza3NtYWxsPTY1MTIxO2UuYXN0ZXJpc209ODI1ODtlLmFzdXBlcmlvcj02MzIwOTtlLmFzeW1wdG90aWNhbGx5ZXF1YWw9ODc3MTtlLmF0PTY0O2UuYXRpbGRlPTIyNztlLmF0bW9ub3NwYWNlPTY1MzEyO2UuYXRzbWFsbD02NTEzMTtlLmF0dXJuZWQ9NTkyO2UuYXViZW5nYWxpPTI0NTI7ZS5hdWJvcG9tb2ZvPTEyNTc2O2UuYXVkZXZhPTIzMjQ7ZS5hdWd1amFyYXRpPTI3MDg7ZS5hdWd1cm11a2hpPTI1ODA7ZS5hdWxlbmd0aG1hcmtiZW5nYWxpPTI1MTk7ZS5hdW1hdHJhZ3VybXVraGk9MjYzNjtlLmF1dm93ZWxzaWduYmVuZ2FsaT0yNTA4O2UuYXV2b3dlbHNpZ25kZXZhPTIzODA7ZS5hdXZvd2Vsc2lnbmd1amFyYXRpPTI3NjQ7ZS5hdmFncmFoYWRldmE9MjM2NTtlLmF5YmFybWVuaWFuPTEzNzc7ZS5heWluPTE1MDY7ZS5heWluYWx0b25laGVicmV3PTY0Mjg4O2UuYXlpbmhlYnJldz0xNTA2O2UuYj05ODtlLmJhYmVuZ2FsaT0yNDc2O2UuYmFja3NsYXNoPTkyO2UuYmFja3NsYXNobW9ub3NwYWNlPTY1MzQwO2UuYmFkZXZhPTIzNDg7ZS5iYWd1amFyYXRpPTI3MzI7ZS5iYWd1cm11a2hpPTI2MDQ7ZS5iYWhpcmFnYW5hPTEyNDAwO2UuYmFodHRoYWk9MzY0NztlLmJha2F0YWthbmE9MTI0OTY7ZS5iYXI9MTI0O2UuYmFybW9ub3NwYWNlPTY1MzcyO2UuYmJvcG9tb2ZvPTEyNTQ5O2UuYmNpcmNsZT05NDI1O2UuYmRvdGFjY2VudD03NjgzO2UuYmRvdGJlbG93PTc2ODU7ZS5iZWFtZWRzaXh0ZWVudGhub3Rlcz05ODM2O2UuYmVjYXVzZT04NzU3O2UuYmVjeXJpbGxpYz0xMDczO2UuYmVoYXJhYmljPTE1NzY7ZS5iZWhmaW5hbGFyYWJpYz02NTE2ODtlLmJlaGluaXRpYWxhcmFiaWM9NjUxNjk7ZS5iZWhpcmFnYW5hPTEyNDA5O2UuYmVobWVkaWFsYXJhYmljPTY1MTcwO2UuYmVobWVlbWluaXRpYWxhcmFiaWM9NjQ2NzE7ZS5iZWhtZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1MjA7ZS5iZWhub29uZmluYWxhcmFiaWM9NjQ2MjE7ZS5iZWthdGFrYW5hPTEyNTA1O2UuYmVuYXJtZW5pYW49MTM3ODtlLmJldD0xNDg5O2UuYmV0YT05NDY7ZS5iZXRhc3ltYm9sZ3JlZWs9OTc2O2UuYmV0ZGFnZXNoPTY0MzA1O2UuYmV0ZGFnZXNoaGVicmV3PTY0MzA1O2UuYmV0aGVicmV3PTE0ODk7ZS5iZXRyYWZlaGVicmV3PTY0MzMyO2UuYmhhYmVuZ2FsaT0yNDc3O2UuYmhhZGV2YT0yMzQ5O2UuYmhhZ3VqYXJhdGk9MjczMztlLmJoYWd1cm11a2hpPTI2MDU7ZS5iaG9vaz01OTU7ZS5iaWhpcmFnYW5hPTEyNDAzO2UuYmlrYXRha2FuYT0xMjQ5OTtlLmJpbGFiaWFsY2xpY2s9NjY0O2UuYmluZGlndXJtdWtoaT0yNTYyO2UuYmlydXNxdWFyZT0xMzEwNTtlLmJsYWNrY2lyY2xlPTk2Nzk7ZS5ibGFja2RpYW1vbmQ9OTY3MDtlLmJsYWNrZG93bnBvaW50aW5ndHJpYW5nbGU9OTY2MDtlLmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlcj05NjY4O2UuYmxhY2tsZWZ0cG9pbnRpbmd0cmlhbmdsZT05NjY0O2UuYmxhY2tsZW50aWN1bGFyYnJhY2tldGxlZnQ9MTIzMDQ7ZS5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdHZlcnRpY2FsPTY1MDgzO2UuYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0PTEyMzA1O2UuYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwODQ7ZS5ibGFja2xvd2VybGVmdHRyaWFuZ2xlPTk2OTk7ZS5ibGFja2xvd2VycmlnaHR0cmlhbmdsZT05Njk4O2UuYmxhY2tyZWN0YW5nbGU9OTY0NDtlLmJsYWNrcmlnaHRwb2ludGluZ3BvaW50ZXI9OTY1ODtlLmJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlPTk2NTQ7ZS5ibGFja3NtYWxsc3F1YXJlPTk2NDI7ZS5ibGFja3NtaWxpbmdmYWNlPTk3ODc7ZS5ibGFja3NxdWFyZT05NjMyO2UuYmxhY2tzdGFyPTk3MzM7ZS5ibGFja3VwcGVybGVmdHRyaWFuZ2xlPTk3MDA7ZS5ibGFja3VwcGVycmlnaHR0cmlhbmdsZT05NzAxO2UuYmxhY2t1cHBvaW50aW5nc21hbGx0cmlhbmdsZT05NjUyO2UuYmxhY2t1cHBvaW50aW5ndHJpYW5nbGU9OTY1MDtlLmJsYW5rPTkyNTE7ZS5ibGluZWJlbG93PTc2ODc7ZS5ibG9jaz05NjA4O2UuYm1vbm9zcGFjZT02NTM0NjtlLmJvYmFpbWFpdGhhaT0zNjEwO2UuYm9oaXJhZ2FuYT0xMjQxMjtlLmJva2F0YWthbmE9MTI1MDg7ZS5icGFyZW49OTM3MztlLmJxc3F1YXJlPTEzMjUxO2UuYnJhY2VleD02MzczMjtlLmJyYWNlbGVmdD0xMjM7ZS5icmFjZWxlZnRidD02MzczMTtlLmJyYWNlbGVmdG1pZD02MzczMDtlLmJyYWNlbGVmdG1vbm9zcGFjZT02NTM3MTtlLmJyYWNlbGVmdHNtYWxsPTY1MTE1O2UuYnJhY2VsZWZ0dHA9NjM3Mjk7ZS5icmFjZWxlZnR2ZXJ0aWNhbD02NTA3OTtlLmJyYWNlcmlnaHQ9MTI1O2UuYnJhY2VyaWdodGJ0PTYzNzQyO2UuYnJhY2VyaWdodG1pZD02Mzc0MTtlLmJyYWNlcmlnaHRtb25vc3BhY2U9NjUzNzM7ZS5icmFjZXJpZ2h0c21hbGw9NjUxMTY7ZS5icmFjZXJpZ2h0dHA9NjM3NDA7ZS5icmFjZXJpZ2h0dmVydGljYWw9NjUwODA7ZS5icmFja2V0bGVmdD05MTtlLmJyYWNrZXRsZWZ0YnQ9NjM3Mjg7ZS5icmFja2V0bGVmdGV4PTYzNzI3O2UuYnJhY2tldGxlZnRtb25vc3BhY2U9NjUzMzk7ZS5icmFja2V0bGVmdHRwPTYzNzI2O2UuYnJhY2tldHJpZ2h0PTkzO2UuYnJhY2tldHJpZ2h0YnQ9NjM3Mzk7ZS5icmFja2V0cmlnaHRleD02MzczODtlLmJyYWNrZXRyaWdodG1vbm9zcGFjZT02NTM0MTtlLmJyYWNrZXRyaWdodHRwPTYzNzM3O2UuYnJldmU9NzI4O2UuYnJldmViZWxvd2NtYj04MTQ7ZS5icmV2ZWNtYj03NzQ7ZS5icmV2ZWludmVydGVkYmVsb3djbWI9ODE1O2UuYnJldmVpbnZlcnRlZGNtYj03ODU7ZS5icmV2ZWludmVydGVkZG91YmxlY21iPTg2NTtlLmJyaWRnZWJlbG93Y21iPTgxMDtlLmJyaWRnZWludmVydGVkYmVsb3djbWI9ODI2O2UuYnJva2VuYmFyPTE2NjtlLmJzdHJva2U9Mzg0O2UuYnN1cGVyaW9yPTYzMjEwO2UuYnRvcGJhcj0zODc7ZS5idWhpcmFnYW5hPTEyNDA2O2UuYnVrYXRha2FuYT0xMjUwMjtlLmJ1bGxldD04MjI2O2UuYnVsbGV0aW52ZXJzZT05Njg4O2UuYnVsbGV0b3BlcmF0b3I9ODcyOTtlLmJ1bGxzZXllPTk2Nzg7ZS5jPTk5O2UuY2Fhcm1lbmlhbj0xMzkwO2UuY2FiZW5nYWxpPTI0NTg7ZS5jYWN1dGU9MjYzO2UuY2FkZXZhPTIzMzA7ZS5jYWd1amFyYXRpPTI3MTQ7ZS5jYWd1cm11a2hpPTI1ODY7ZS5jYWxzcXVhcmU9MTMxOTI7ZS5jYW5kcmFiaW5kdWJlbmdhbGk9MjQzMztlLmNhbmRyYWJpbmR1Y21iPTc4NDtlLmNhbmRyYWJpbmR1ZGV2YT0yMzA1O2UuY2FuZHJhYmluZHVndWphcmF0aT0yNjg5O2UuY2Fwc2xvY2s9ODY4MjtlLmNhcmVvZj04NDUzO2UuY2Fyb249NzExO2UuY2Fyb25iZWxvd2NtYj04MTI7ZS5jYXJvbmNtYj03ODA7ZS5jYXJyaWFnZXJldHVybj04NjI5O2UuY2JvcG9tb2ZvPTEyNTY4O2UuY2Nhcm9uPTI2OTtlLmNjZWRpbGxhPTIzMTtlLmNjZWRpbGxhYWN1dGU9NzY4OTtlLmNjaXJjbGU9OTQyNjtlLmNjaXJjdW1mbGV4PTI2NTtlLmNjdXJsPTU5NztlLmNkb3Q9MjY3O2UuY2RvdGFjY2VudD0yNjc7ZS5jZHNxdWFyZT0xMzI1MztlLmNlZGlsbGE9MTg0O2UuY2VkaWxsYWNtYj04MDc7ZS5jZW50PTE2MjtlLmNlbnRpZ3JhZGU9ODQ1MTtlLmNlbnRpbmZlcmlvcj02MzE5OTtlLmNlbnRtb25vc3BhY2U9NjU1MDQ7ZS5jZW50b2xkc3R5bGU9NjMzOTQ7ZS5jZW50c3VwZXJpb3I9NjMyMDA7ZS5jaGFhcm1lbmlhbj0xNDAxO2UuY2hhYmVuZ2FsaT0yNDU5O2UuY2hhZGV2YT0yMzMxO2UuY2hhZ3VqYXJhdGk9MjcxNTtlLmNoYWd1cm11a2hpPTI1ODc7ZS5jaGJvcG9tb2ZvPTEyNTY0O2UuY2hlYWJraGFzaWFuY3lyaWxsaWM9MTIxMztlLmNoZWNrbWFyaz0xMDAwMztlLmNoZWN5cmlsbGljPTEwOTU7ZS5jaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYz0xMjE1O2UuY2hlZGVzY2VuZGVyY3lyaWxsaWM9MTIwNztlLmNoZWRpZXJlc2lzY3lyaWxsaWM9MTI2OTtlLmNoZWhhcm1lbmlhbj0xMzk1O2UuY2hla2hha2Fzc2lhbmN5cmlsbGljPTEyMjg7ZS5jaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljPTEyMDk7ZS5jaGk9OTY3O2UuY2hpZXVjaGFjaXJjbGVrb3JlYW49MTI5MTk7ZS5jaGlldWNoYXBhcmVua29yZWFuPTEyODIzO2UuY2hpZXVjaGNpcmNsZWtvcmVhbj0xMjkwNTtlLmNoaWV1Y2hrb3JlYW49MTI2MTg7ZS5jaGlldWNocGFyZW5rb3JlYW49MTI4MDk7ZS5jaG9jaGFuZ3RoYWk9MzU5NDtlLmNob2NoYW50aGFpPTM1OTI7ZS5jaG9jaGluZ3RoYWk9MzU5MztlLmNob2Nob2V0aGFpPTM1OTY7ZS5jaG9vaz0zOTI7ZS5jaWV1Y2FjaXJjbGVrb3JlYW49MTI5MTg7ZS5jaWV1Y2FwYXJlbmtvcmVhbj0xMjgyMjtlLmNpZXVjY2lyY2xla29yZWFuPTEyOTA0O2UuY2lldWNrb3JlYW49MTI2MTY7ZS5jaWV1Y3BhcmVua29yZWFuPTEyODA4O2UuY2lldWN1cGFyZW5rb3JlYW49MTI4Mjg7ZS5jaXJjbGU9OTY3NTtlLmNpcmNsZWNvcHlydD0xNjk7ZS5jaXJjbGVtdWx0aXBseT04ODU1O2UuY2lyY2xlb3Q9ODg1NztlLmNpcmNsZXBsdXM9ODg1MztlLmNpcmNsZXBvc3RhbG1hcms9MTIzNDI7ZS5jaXJjbGV3aXRobGVmdGhhbGZibGFjaz05NjgwO2UuY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrPTk2ODE7ZS5jaXJjdW1mbGV4PTcxMDtlLmNpcmN1bWZsZXhiZWxvd2NtYj04MTM7ZS5jaXJjdW1mbGV4Y21iPTc3MDtlLmNsZWFyPTg5OTk7ZS5jbGlja2FsdmVvbGFyPTQ1MDtlLmNsaWNrZGVudGFsPTQ0ODtlLmNsaWNrbGF0ZXJhbD00NDk7ZS5jbGlja3JldHJvZmxleD00NTE7ZS5jbHViPTk4Mjc7ZS5jbHVic3VpdGJsYWNrPTk4Mjc7ZS5jbHVic3VpdHdoaXRlPTk4MzE7ZS5jbWN1YmVkc3F1YXJlPTEzMjIwO2UuY21vbm9zcGFjZT02NTM0NztlLmNtc3F1YXJlZHNxdWFyZT0xMzIxNjtlLmNvYXJtZW5pYW49MTQwOTtlLmNvbG9uPTU4O2UuY29sb25tb25ldGFyeT04MzUzO2UuY29sb25tb25vc3BhY2U9NjUzMDY7ZS5jb2xvbnNpZ249ODM1MztlLmNvbG9uc21hbGw9NjUxMDk7ZS5jb2xvbnRyaWFuZ3VsYXJoYWxmbW9kPTcyMTtlLmNvbG9udHJpYW5ndWxhcm1vZD03MjA7ZS5jb21tYT00NDtlLmNvbW1hYWJvdmVjbWI9Nzg3O2UuY29tbWFhYm92ZXJpZ2h0Y21iPTc4OTtlLmNvbW1hYWNjZW50PTYzMTcxO2UuY29tbWFhcmFiaWM9MTU0ODtlLmNvbW1hYXJtZW5pYW49MTM3MztlLmNvbW1haW5mZXJpb3I9NjMyMDE7ZS5jb21tYW1vbm9zcGFjZT02NTI5MjtlLmNvbW1hcmV2ZXJzZWRhYm92ZWNtYj03ODg7ZS5jb21tYXJldmVyc2VkbW9kPTcwMTtlLmNvbW1hc21hbGw9NjUxMDQ7ZS5jb21tYXN1cGVyaW9yPTYzMjAyO2UuY29tbWF0dXJuZWRhYm92ZWNtYj03ODY7ZS5jb21tYXR1cm5lZG1vZD02OTk7ZS5jb21wYXNzPTk3ODg7ZS5jb25ncnVlbnQ9ODc3MztlLmNvbnRvdXJpbnRlZ3JhbD04NzUwO2UuY29udHJvbD04OTYzO2UuY29udHJvbEFDSz02O2UuY29udHJvbEJFTD03O2UuY29udHJvbEJTPTg7ZS5jb250cm9sQ0FOPTI0O2UuY29udHJvbENSPTEzO2UuY29udHJvbERDMT0xNztlLmNvbnRyb2xEQzI9MTg7ZS5jb250cm9sREMzPTE5O2UuY29udHJvbERDND0yMDtlLmNvbnRyb2xERUw9MTI3O2UuY29udHJvbERMRT0xNjtlLmNvbnRyb2xFTT0yNTtlLmNvbnRyb2xFTlE9NTtlLmNvbnRyb2xFT1Q9NDtlLmNvbnRyb2xFU0M9Mjc7ZS5jb250cm9sRVRCPTIzO2UuY29udHJvbEVUWD0zO2UuY29udHJvbEZGPTEyO2UuY29udHJvbEZTPTI4O2UuY29udHJvbEdTPTI5O2UuY29udHJvbEhUPTk7ZS5jb250cm9sTEY9MTA7ZS5jb250cm9sTkFLPTIxO2UuY29udHJvbE5VTEw9MDtlLmNvbnRyb2xSUz0zMDtlLmNvbnRyb2xTST0xNTtlLmNvbnRyb2xTTz0xNDtlLmNvbnRyb2xTT1Q9MjtlLmNvbnRyb2xTVFg9MTtlLmNvbnRyb2xTVUI9MjY7ZS5jb250cm9sU1lOPTIyO2UuY29udHJvbFVTPTMxO2UuY29udHJvbFZUPTExO2UuY29weXJpZ2h0PTE2OTtlLmNvcHlyaWdodHNhbnM9NjM3MjE7ZS5jb3B5cmlnaHRzZXJpZj02MzE5MztlLmNvcm5lcmJyYWNrZXRsZWZ0PTEyMzAwO2UuY29ybmVyYnJhY2tldGxlZnRoYWxmd2lkdGg9NjUzNzg7ZS5jb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsPTY1MDg5O2UuY29ybmVyYnJhY2tldHJpZ2h0PTEyMzAxO2UuY29ybmVyYnJhY2tldHJpZ2h0aGFsZndpZHRoPTY1Mzc5O2UuY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwOTA7ZS5jb3Jwb3JhdGlvbnNxdWFyZT0xMzE4MztlLmNvc3F1YXJlPTEzMjU1O2UuY292ZXJrZ3NxdWFyZT0xMzI1NDtlLmNwYXJlbj05Mzc0O2UuY3J1emVpcm89ODM1NDtlLmNzdHJldGNoZWQ9NjYzO2UuY3VybHlhbmQ9ODkxMTtlLmN1cmx5b3I9ODkxMDtlLmN1cnJlbmN5PTE2NDtlLmN5ckJyZXZlPTYzMTg1O2UuY3lyRmxleD02MzE4NjtlLmN5cmJyZXZlPTYzMTg4O2UuY3lyZmxleD02MzE4OTtlLmQ9MTAwO2UuZGFhcm1lbmlhbj0xMzgwO2UuZGFiZW5nYWxpPTI0NzA7ZS5kYWRhcmFiaWM9MTU5MDtlLmRhZGV2YT0yMzQyO2UuZGFkZmluYWxhcmFiaWM9NjUyMTQ7ZS5kYWRpbml0aWFsYXJhYmljPTY1MjE1O2UuZGFkbWVkaWFsYXJhYmljPTY1MjE2O2UuZGFnZXNoPTE0Njg7ZS5kYWdlc2hoZWJyZXc9MTQ2ODtlLmRhZ2dlcj04MjI0O2UuZGFnZ2VyZGJsPTgyMjU7ZS5kYWd1amFyYXRpPTI3MjY7ZS5kYWd1cm11a2hpPTI1OTg7ZS5kYWhpcmFnYW5hPTEyMzg0O2UuZGFrYXRha2FuYT0xMjQ4MDtlLmRhbGFyYWJpYz0xNTgzO2UuZGFsZXQ9MTQ5MTtlLmRhbGV0ZGFnZXNoPTY0MzA3O2UuZGFsZXRkYWdlc2hoZWJyZXc9NjQzMDc7ZS5kYWxldGhlYnJldz0xNDkxO2UuZGFsZmluYWxhcmFiaWM9NjUxOTQ7ZS5kYW1tYWFyYWJpYz0xNjE1O2UuZGFtbWFsb3dhcmFiaWM9MTYxNTtlLmRhbW1hdGFuYWx0b25lYXJhYmljPTE2MTI7ZS5kYW1tYXRhbmFyYWJpYz0xNjEyO2UuZGFuZGE9MjQwNDtlLmRhcmdhaGVicmV3PTE0NDc7ZS5kYXJnYWxlZnRoZWJyZXc9MTQ0NztlLmRhc2lhcG5ldW1hdGFjeXJpbGxpY2NtYj0xMTU3O2UuZGJsR3JhdmU9NjMxODc7ZS5kYmxhbmdsZWJyYWNrZXRsZWZ0PTEyMjk4O2UuZGJsYW5nbGVicmFja2V0bGVmdHZlcnRpY2FsPTY1MDg1O2UuZGJsYW5nbGVicmFja2V0cmlnaHQ9MTIyOTk7ZS5kYmxhbmdsZWJyYWNrZXRyaWdodHZlcnRpY2FsPTY1MDg2O2UuZGJsYXJjaGludmVydGVkYmVsb3djbWI9ODExO2UuZGJsYXJyb3dsZWZ0PTg2NjA7ZS5kYmxhcnJvd3JpZ2h0PTg2NTg7ZS5kYmxkYW5kYT0yNDA1O2UuZGJsZ3JhdmU9NjMxOTA7ZS5kYmxncmF2ZWNtYj03ODM7ZS5kYmxpbnRlZ3JhbD04NzQ4O2UuZGJsbG93bGluZT04MjE1O2UuZGJsbG93bGluZWNtYj04MTk7ZS5kYmxvdmVybGluZWNtYj04MzE7ZS5kYmxwcmltZW1vZD02OTg7ZS5kYmx2ZXJ0aWNhbGJhcj04MjE0O2UuZGJsdmVydGljYWxsaW5lYWJvdmVjbWI9NzgyO2UuZGJvcG9tb2ZvPTEyNTUzO2UuZGJzcXVhcmU9MTMyNTY7ZS5kY2Fyb249MjcxO2UuZGNlZGlsbGE9NzY5NztlLmRjaXJjbGU9OTQyNztlLmRjaXJjdW1mbGV4YmVsb3c9NzY5OTtlLmRjcm9hdD0yNzM7ZS5kZGFiZW5nYWxpPTI0NjU7ZS5kZGFkZXZhPTIzMzc7ZS5kZGFndWphcmF0aT0yNzIxO2UuZGRhZ3VybXVraGk9MjU5MztlLmRkYWxhcmFiaWM9MTY3MjtlLmRkYWxmaW5hbGFyYWJpYz02NDM5MztlLmRkZGhhZGV2YT0yMzk2O2UuZGRoYWJlbmdhbGk9MjQ2NjtlLmRkaGFkZXZhPTIzMzg7ZS5kZGhhZ3VqYXJhdGk9MjcyMjtlLmRkaGFndXJtdWtoaT0yNTk0O2UuZGRvdGFjY2VudD03NjkxO2UuZGRvdGJlbG93PTc2OTM7ZS5kZWNpbWFsc2VwYXJhdG9yYXJhYmljPTE2NDM7ZS5kZWNpbWFsc2VwYXJhdG9ycGVyc2lhbj0xNjQzO2UuZGVjeXJpbGxpYz0xMDc2O2UuZGVncmVlPTE3NjtlLmRlaGloZWJyZXc9MTQ1MztlLmRlaGlyYWdhbmE9MTIzOTE7ZS5kZWljb3B0aWM9MTAwNztlLmRla2F0YWthbmE9MTI0ODc7ZS5kZWxldGVsZWZ0PTkwMDM7ZS5kZWxldGVyaWdodD04OTk4O2UuZGVsdGE9OTQ4O2UuZGVsdGF0dXJuZWQ9Mzk3O2UuZGVub21pbmF0b3JtaW51c29uZW51bWVyYXRvcmJlbmdhbGk9MjU1MjtlLmRlemg9Njc2O2UuZGhhYmVuZ2FsaT0yNDcxO2UuZGhhZGV2YT0yMzQzO2UuZGhhZ3VqYXJhdGk9MjcyNztlLmRoYWd1cm11a2hpPTI1OTk7ZS5kaG9vaz01OTk7ZS5kaWFseXRpa2F0b25vcz05MDE7ZS5kaWFseXRpa2F0b25vc2NtYj04MzY7ZS5kaWFtb25kPTk4MzA7ZS5kaWFtb25kc3VpdHdoaXRlPTk4MjY7ZS5kaWVyZXNpcz0xNjg7ZS5kaWVyZXNpc2FjdXRlPTYzMTkxO2UuZGllcmVzaXNiZWxvd2NtYj04MDQ7ZS5kaWVyZXNpc2NtYj03NzY7ZS5kaWVyZXNpc2dyYXZlPTYzMTkyO2UuZGllcmVzaXN0b25vcz05MDE7ZS5kaWhpcmFnYW5hPTEyMzg2O2UuZGlrYXRha2FuYT0xMjQ4MjtlLmRpdHRvbWFyaz0xMjI5MTtlLmRpdmlkZT0yNDc7ZS5kaXZpZGVzPTg3Mzk7ZS5kaXZpc2lvbnNsYXNoPTg3MjU7ZS5kamVjeXJpbGxpYz0xMTA2O2UuZGtzaGFkZT05NjE5O2UuZGxpbmViZWxvdz03Njk1O2UuZGxzcXVhcmU9MTMyMDc7ZS5kbWFjcm9uPTI3MztlLmRtb25vc3BhY2U9NjUzNDg7ZS5kbmJsb2NrPTk2MDQ7ZS5kb2NoYWRhdGhhaT0zNTk4O2UuZG9kZWt0aGFpPTM2MDQ7ZS5kb2hpcmFnYW5hPTEyMzkzO2UuZG9rYXRha2FuYT0xMjQ4OTtlLmRvbGxhcj0zNjtlLmRvbGxhcmluZmVyaW9yPTYzMjAzO2UuZG9sbGFybW9ub3NwYWNlPTY1Mjg0O2UuZG9sbGFyb2xkc3R5bGU9NjMyNjg7ZS5kb2xsYXJzbWFsbD02NTEyOTtlLmRvbGxhcnN1cGVyaW9yPTYzMjA0O2UuZG9uZz04MzYzO2UuZG9ydXNxdWFyZT0xMzA5NDtlLmRvdGFjY2VudD03Mjk7ZS5kb3RhY2NlbnRjbWI9Nzc1O2UuZG90YmVsb3djbWI9ODAzO2UuZG90YmVsb3djb21iPTgwMztlLmRvdGthdGFrYW5hPTEyNTM5O2UuZG90bGVzc2k9MzA1O2UuZG90bGVzc2o9NjMxNjY7ZS5kb3RsZXNzanN0cm9rZWhvb2s9NjQ0O2UuZG90bWF0aD04OTAxO2UuZG90dGVkY2lyY2xlPTk2NzY7ZS5kb3VibGV5b2RwYXRhaD02NDI4NztlLmRvdWJsZXlvZHBhdGFoaGVicmV3PTY0Mjg3O2UuZG93bnRhY2tiZWxvd2NtYj03OTg7ZS5kb3dudGFja21vZD03MjU7ZS5kcGFyZW49OTM3NTtlLmRzdXBlcmlvcj02MzIxMTtlLmR0YWlsPTU5ODtlLmR0b3BiYXI9Mzk2O2UuZHVoaXJhZ2FuYT0xMjM4OTtlLmR1a2F0YWthbmE9MTI0ODU7ZS5kej00OTk7ZS5kemFsdG9uZT02NzU7ZS5kemNhcm9uPTQ1NDtlLmR6Y3VybD02Nzc7ZS5kemVhYmtoYXNpYW5jeXJpbGxpYz0xMjQ5O2UuZHplY3lyaWxsaWM9MTEwOTtlLmR6aGVjeXJpbGxpYz0xMTE5O2UuZT0xMDE7ZS5lYWN1dGU9MjMzO2UuZWFydGg9OTc5MztlLmViZW5nYWxpPTI0NDc7ZS5lYm9wb21vZm89MTI1NzI7ZS5lYnJldmU9Mjc3O2UuZWNhbmRyYWRldmE9MjMxNztlLmVjYW5kcmFndWphcmF0aT0yNzAxO2UuZWNhbmRyYXZvd2Vsc2lnbmRldmE9MjM3MztlLmVjYW5kcmF2b3dlbHNpZ25ndWphcmF0aT0yNzU3O2UuZWNhcm9uPTI4MztlLmVjZWRpbGxhYnJldmU9NzcwOTtlLmVjaGFybWVuaWFuPTEzODE7ZS5lY2h5aXduYXJtZW5pYW49MTQxNTtlLmVjaXJjbGU9OTQyODtlLmVjaXJjdW1mbGV4PTIzNDtlLmVjaXJjdW1mbGV4YWN1dGU9Nzg3MTtlLmVjaXJjdW1mbGV4YmVsb3c9NzcwNTtlLmVjaXJjdW1mbGV4ZG90YmVsb3c9Nzg3OTtlLmVjaXJjdW1mbGV4Z3JhdmU9Nzg3MztlLmVjaXJjdW1mbGV4aG9va2Fib3ZlPTc4NzU7ZS5lY2lyY3VtZmxleHRpbGRlPTc4Nzc7ZS5lY3lyaWxsaWM9MTEwODtlLmVkYmxncmF2ZT01MTc7ZS5lZGV2YT0yMzE5O2UuZWRpZXJlc2lzPTIzNTtlLmVkb3Q9Mjc5O2UuZWRvdGFjY2VudD0yNzk7ZS5lZG90YmVsb3c9Nzg2NTtlLmVlZ3VybXVraGk9MjU3NTtlLmVlbWF0cmFndXJtdWtoaT0yNjMxO2UuZWZjeXJpbGxpYz0xMDkyO2UuZWdyYXZlPTIzMjtlLmVndWphcmF0aT0yNzAzO2UuZWhhcm1lbmlhbj0xMzgzO2UuZWhib3BvbW9mbz0xMjU3MztlLmVoaXJhZ2FuYT0xMjM2MDtlLmVob29rYWJvdmU9Nzg2NztlLmVpYm9wb21vZm89MTI1NzU7ZS5laWdodD01NjtlLmVpZ2h0YXJhYmljPTE2NDA7ZS5laWdodGJlbmdhbGk9MjU0MjtlLmVpZ2h0Y2lyY2xlPTkzMTk7ZS5laWdodGNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjk7ZS5laWdodGRldmE9MjQxNDtlLmVpZ2h0ZWVuY2lyY2xlPTkzMjk7ZS5laWdodGVlbnBhcmVuPTkzNDk7ZS5laWdodGVlbnBlcmlvZD05MzY5O2UuZWlnaHRndWphcmF0aT0yNzk4O2UuZWlnaHRndXJtdWtoaT0yNjcwO2UuZWlnaHRoYWNrYXJhYmljPTE2NDA7ZS5laWdodGhhbmd6aG91PTEyMzI4O2UuZWlnaHRobm90ZWJlYW1lZD05ODM1O2UuZWlnaHRpZGVvZ3JhcGhpY3BhcmVuPTEyODM5O2UuZWlnaHRpbmZlcmlvcj04MzI4O2UuZWlnaHRtb25vc3BhY2U9NjUzMDQ7ZS5laWdodG9sZHN0eWxlPTYzMjg4O2UuZWlnaHRwYXJlbj05MzM5O2UuZWlnaHRwZXJpb2Q9OTM1OTtlLmVpZ2h0cGVyc2lhbj0xNzg0O2UuZWlnaHRyb21hbj04NTY3O2UuZWlnaHRzdXBlcmlvcj04MzEyO2UuZWlnaHR0aGFpPTM2NzI7ZS5laW52ZXJ0ZWRicmV2ZT01MTk7ZS5laW90aWZpZWRjeXJpbGxpYz0xMTI1O2UuZWthdGFrYW5hPTEyNDU2O2UuZWthdGFrYW5haGFsZndpZHRoPTY1Mzk2O2UuZWtvbmthcmd1cm11a2hpPTI2NzY7ZS5la29yZWFuPTEyNjI4O2UuZWxjeXJpbGxpYz0xMDgzO2UuZWxlbWVudD04NzEyO2UuZWxldmVuY2lyY2xlPTkzMjI7ZS5lbGV2ZW5wYXJlbj05MzQyO2UuZWxldmVucGVyaW9kPTkzNjI7ZS5lbGV2ZW5yb21hbj04NTcwO2UuZWxsaXBzaXM9ODIzMDtlLmVsbGlwc2lzdmVydGljYWw9ODk0MjtlLmVtYWNyb249Mjc1O2UuZW1hY3JvbmFjdXRlPTc3MDM7ZS5lbWFjcm9uZ3JhdmU9NzcwMTtlLmVtY3lyaWxsaWM9MTA4NDtlLmVtZGFzaD04MjEyO2UuZW1kYXNodmVydGljYWw9NjUwNzM7ZS5lbW9ub3NwYWNlPTY1MzQ5O2UuZW1waGFzaXNtYXJrYXJtZW5pYW49MTM3MTtlLmVtcHR5c2V0PTg3MDk7ZS5lbmJvcG9tb2ZvPTEyNTc5O2UuZW5jeXJpbGxpYz0xMDg1O2UuZW5kYXNoPTgyMTE7ZS5lbmRhc2h2ZXJ0aWNhbD02NTA3NDtlLmVuZGVzY2VuZGVyY3lyaWxsaWM9MTE4NztlLmVuZz0zMzE7ZS5lbmdib3BvbW9mbz0xMjU4MTtlLmVuZ2hlY3lyaWxsaWM9MTE4OTtlLmVuaG9va2N5cmlsbGljPTEyMjQ7ZS5lbnNwYWNlPTgxOTQ7ZS5lb2dvbmVrPTI4MTtlLmVva29yZWFuPTEyNjI3O2UuZW9wZW49NjAzO2UuZW9wZW5jbG9zZWQ9NjY2O2UuZW9wZW5yZXZlcnNlZD02MDQ7ZS5lb3BlbnJldmVyc2VkY2xvc2VkPTYwNjtlLmVvcGVucmV2ZXJzZWRob29rPTYwNTtlLmVwYXJlbj05Mzc2O2UuZXBzaWxvbj05NDk7ZS5lcHNpbG9udG9ub3M9OTQxO2UuZXF1YWw9NjE7ZS5lcXVhbG1vbm9zcGFjZT02NTMwOTtlLmVxdWFsc21hbGw9NjUxMjY7ZS5lcXVhbHN1cGVyaW9yPTgzMTY7ZS5lcXVpdmFsZW5jZT04ODAxO2UuZXJib3BvbW9mbz0xMjU4MjtlLmVyY3lyaWxsaWM9MTA4ODtlLmVyZXZlcnNlZD02MDA7ZS5lcmV2ZXJzZWRjeXJpbGxpYz0xMTAxO2UuZXNjeXJpbGxpYz0xMDg5O2UuZXNkZXNjZW5kZXJjeXJpbGxpYz0xMTk1O2UuZXNoPTY0MztlLmVzaGN1cmw9NjQ2O2UuZXNob3J0ZGV2YT0yMzE4O2UuZXNob3J0dm93ZWxzaWduZGV2YT0yMzc0O2UuZXNocmV2ZXJzZWRsb29wPTQyNjtlLmVzaHNxdWF0cmV2ZXJzZWQ9NjQ1O2UuZXNtYWxsaGlyYWdhbmE9MTIzNTk7ZS5lc21hbGxrYXRha2FuYT0xMjQ1NTtlLmVzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1Mzg2O2UuZXN0aW1hdGVkPTg0OTQ7ZS5lc3VwZXJpb3I9NjMyMTI7ZS5ldGE9OTUxO2UuZXRhcm1lbmlhbj0xMzg0O2UuZXRhdG9ub3M9OTQyO2UuZXRoPTI0MDtlLmV0aWxkZT03ODY5O2UuZXRpbGRlYmVsb3c9NzcwNztlLmV0bmFodGFmb3VraGhlYnJldz0xNDI1O2UuZXRuYWh0YWZvdWtobGVmdGhlYnJldz0xNDI1O2UuZXRuYWh0YWhlYnJldz0xNDI1O2UuZXRuYWh0YWxlZnRoZWJyZXc9MTQyNTtlLmV0dXJuZWQ9NDc3O2UuZXVrb3JlYW49MTI2NDE7ZS5ldXJvPTgzNjQ7ZS5ldm93ZWxzaWduYmVuZ2FsaT0yNTAzO2UuZXZvd2Vsc2lnbmRldmE9MjM3NTtlLmV2b3dlbHNpZ25ndWphcmF0aT0yNzU5O2UuZXhjbGFtPTMzO2UuZXhjbGFtYXJtZW5pYW49MTM3MjtlLmV4Y2xhbWRibD04MjUyO2UuZXhjbGFtZG93bj0xNjE7ZS5leGNsYW1kb3duc21hbGw9NjMzOTM7ZS5leGNsYW1tb25vc3BhY2U9NjUyODE7ZS5leGNsYW1zbWFsbD02MzI2NTtlLmV4aXN0ZW50aWFsPTg3MDc7ZS5lemg9NjU4O2UuZXpoY2Fyb249NDk1O2UuZXpoY3VybD02NTk7ZS5lemhyZXZlcnNlZD00NDE7ZS5lemh0YWlsPTQ0MjtlLmY9MTAyO2UuZmFkZXZhPTIzOTg7ZS5mYWd1cm11a2hpPTI2NTQ7ZS5mYWhyZW5oZWl0PTg0NTc7ZS5mYXRoYWFyYWJpYz0xNjE0O2UuZmF0aGFsb3dhcmFiaWM9MTYxNDtlLmZhdGhhdGFuYXJhYmljPTE2MTE7ZS5mYm9wb21vZm89MTI1NTI7ZS5mY2lyY2xlPTk0Mjk7ZS5mZG90YWNjZW50PTc3MTE7ZS5mZWhhcmFiaWM9MTYwMTtlLmZlaGFybWVuaWFuPTE0MTQ7ZS5mZWhmaW5hbGFyYWJpYz02NTIzNDtlLmZlaGluaXRpYWxhcmFiaWM9NjUyMzU7ZS5mZWhtZWRpYWxhcmFiaWM9NjUyMzY7ZS5mZWljb3B0aWM9OTk3O2UuZmVtYWxlPTk3OTI7ZS5mZj02NDI1NjtlLmZfZj02NDI1NjtlLmZmaT02NDI1OTtlLmZfZl9pPTY0MjU5O2UuZmZsPTY0MjYwO2UuZl9mX2w9NjQyNjA7ZS5maT02NDI1NztlLmZfaT02NDI1NztlLmZpZnRlZW5jaXJjbGU9OTMyNjtlLmZpZnRlZW5wYXJlbj05MzQ2O2UuZmlmdGVlbnBlcmlvZD05MzY2O2UuZmlndXJlZGFzaD04MjEwO2UuZmlsbGVkYm94PTk2MzI7ZS5maWxsZWRyZWN0PTk2NDQ7ZS5maW5hbGthZj0xNDk4O2UuZmluYWxrYWZkYWdlc2g9NjQzMTQ7ZS5maW5hbGthZmRhZ2VzaGhlYnJldz02NDMxNDtlLmZpbmFsa2FmaGVicmV3PTE0OTg7ZS5maW5hbG1lbT0xNTAxO2UuZmluYWxtZW1oZWJyZXc9MTUwMTtlLmZpbmFsbnVuPTE1MDM7ZS5maW5hbG51bmhlYnJldz0xNTAzO2UuZmluYWxwZT0xNTA3O2UuZmluYWxwZWhlYnJldz0xNTA3O2UuZmluYWx0c2FkaT0xNTA5O2UuZmluYWx0c2FkaWhlYnJldz0xNTA5O2UuZmlyc3R0b25lY2hpbmVzZT03MTM7ZS5maXNoZXllPTk2NzM7ZS5maXRhY3lyaWxsaWM9MTEzOTtlLmZpdmU9NTM7ZS5maXZlYXJhYmljPTE2Mzc7ZS5maXZlYmVuZ2FsaT0yNTM5O2UuZml2ZWNpcmNsZT05MzE2O2UuZml2ZWNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjY7ZS5maXZlZGV2YT0yNDExO2UuZml2ZWVpZ2h0aHM9ODU0MTtlLmZpdmVndWphcmF0aT0yNzk1O2UuZml2ZWd1cm11a2hpPTI2Njc7ZS5maXZlaGFja2FyYWJpYz0xNjM3O2UuZml2ZWhhbmd6aG91PTEyMzI1O2UuZml2ZWlkZW9ncmFwaGljcGFyZW49MTI4MzY7ZS5maXZlaW5mZXJpb3I9ODMyNTtlLmZpdmVtb25vc3BhY2U9NjUzMDE7ZS5maXZlb2xkc3R5bGU9NjMyODU7ZS5maXZlcGFyZW49OTMzNjtlLmZpdmVwZXJpb2Q9OTM1NjtlLmZpdmVwZXJzaWFuPTE3ODE7ZS5maXZlcm9tYW49ODU2NDtlLmZpdmVzdXBlcmlvcj04MzA5O2UuZml2ZXRoYWk9MzY2OTtlLmZsPTY0MjU4O2UuZl9sPTY0MjU4O2UuZmxvcmluPTQwMjtlLmZtb25vc3BhY2U9NjUzNTA7ZS5mbXNxdWFyZT0xMzIwOTtlLmZvZmFudGhhaT0zNjE1O2UuZm9mYXRoYWk9MzYxMztlLmZvbmdtYW50aGFpPTM2NjM7ZS5mb3JhbGw9ODcwNDtlLmZvdXI9NTI7ZS5mb3VyYXJhYmljPTE2MzY7ZS5mb3VyYmVuZ2FsaT0yNTM4O2UuZm91cmNpcmNsZT05MzE1O2UuZm91cmNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjU7ZS5mb3VyZGV2YT0yNDEwO2UuZm91cmd1amFyYXRpPTI3OTQ7ZS5mb3VyZ3VybXVraGk9MjY2NjtlLmZvdXJoYWNrYXJhYmljPTE2MzY7ZS5mb3VyaGFuZ3pob3U9MTIzMjQ7ZS5mb3VyaWRlb2dyYXBoaWNwYXJlbj0xMjgzNTtlLmZvdXJpbmZlcmlvcj04MzI0O2UuZm91cm1vbm9zcGFjZT02NTMwMDtlLmZvdXJudW1lcmF0b3JiZW5nYWxpPTI1NTE7ZS5mb3Vyb2xkc3R5bGU9NjMyODQ7ZS5mb3VycGFyZW49OTMzNTtlLmZvdXJwZXJpb2Q9OTM1NTtlLmZvdXJwZXJzaWFuPTE3ODA7ZS5mb3Vycm9tYW49ODU2MztlLmZvdXJzdXBlcmlvcj04MzA4O2UuZm91cnRlZW5jaXJjbGU9OTMyNTtlLmZvdXJ0ZWVucGFyZW49OTM0NTtlLmZvdXJ0ZWVucGVyaW9kPTkzNjU7ZS5mb3VydGhhaT0zNjY4O2UuZm91cnRodG9uZWNoaW5lc2U9NzE1O2UuZnBhcmVuPTkzNzc7ZS5mcmFjdGlvbj04MjYwO2UuZnJhbmM9ODM1NTtlLmc9MTAzO2UuZ2FiZW5nYWxpPTI0NTU7ZS5nYWN1dGU9NTAxO2UuZ2FkZXZhPTIzMjc7ZS5nYWZhcmFiaWM9MTcxMTtlLmdhZmZpbmFsYXJhYmljPTY0NDAzO2UuZ2FmaW5pdGlhbGFyYWJpYz02NDQwNDtlLmdhZm1lZGlhbGFyYWJpYz02NDQwNTtlLmdhZ3VqYXJhdGk9MjcxMTtlLmdhZ3VybXVraGk9MjU4MztlLmdhaGlyYWdhbmE9MTIzNjQ7ZS5nYWthdGFrYW5hPTEyNDYwO2UuZ2FtbWE9OTQ3O2UuZ2FtbWFsYXRpbnNtYWxsPTYxMTtlLmdhbW1hc3VwZXJpb3I9NzM2O2UuZ2FuZ2lhY29wdGljPTEwMDM7ZS5nYm9wb21vZm89MTI1NTc7ZS5nYnJldmU9Mjg3O2UuZ2Nhcm9uPTQ4NztlLmdjZWRpbGxhPTI5MTtlLmdjaXJjbGU9OTQzMDtlLmdjaXJjdW1mbGV4PTI4NTtlLmdjb21tYWFjY2VudD0yOTE7ZS5nZG90PTI4OTtlLmdkb3RhY2NlbnQ9Mjg5O2UuZ2VjeXJpbGxpYz0xMDc1O2UuZ2VoaXJhZ2FuYT0xMjM3MDtlLmdla2F0YWthbmE9MTI0NjY7ZS5nZW9tZXRyaWNhbGx5ZXF1YWw9ODc4NTtlLmdlcmVzaGFjY2VudGhlYnJldz0xNDM2O2UuZ2VyZXNoaGVicmV3PTE1MjM7ZS5nZXJlc2htdXFkYW1oZWJyZXc9MTQzNztlLmdlcm1hbmRibHM9MjIzO2UuZ2Vyc2hheWltYWNjZW50aGVicmV3PTE0Mzg7ZS5nZXJzaGF5aW1oZWJyZXc9MTUyNDtlLmdldGFtYXJrPTEyMzA3O2UuZ2hhYmVuZ2FsaT0yNDU2O2UuZ2hhZGFybWVuaWFuPTEzOTQ7ZS5naGFkZXZhPTIzMjg7ZS5naGFndWphcmF0aT0yNzEyO2UuZ2hhZ3VybXVraGk9MjU4NDtlLmdoYWluYXJhYmljPTE1OTQ7ZS5naGFpbmZpbmFsYXJhYmljPTY1MjMwO2UuZ2hhaW5pbml0aWFsYXJhYmljPTY1MjMxO2UuZ2hhaW5tZWRpYWxhcmFiaWM9NjUyMzI7ZS5naGVtaWRkbGVob29rY3lyaWxsaWM9MTE3MztlLmdoZXN0cm9rZWN5cmlsbGljPTExNzE7ZS5naGV1cHR1cm5jeXJpbGxpYz0xMTY5O2UuZ2hoYWRldmE9MjM5NDtlLmdoaGFndXJtdWtoaT0yNjUwO2UuZ2hvb2s9NjA4O2UuZ2h6c3F1YXJlPTEzMjAzO2UuZ2loaXJhZ2FuYT0xMjM2NjtlLmdpa2F0YWthbmE9MTI0NjI7ZS5naW1hcm1lbmlhbj0xMzc5O2UuZ2ltZWw9MTQ5MDtlLmdpbWVsZGFnZXNoPTY0MzA2O2UuZ2ltZWxkYWdlc2hoZWJyZXc9NjQzMDY7ZS5naW1lbGhlYnJldz0xNDkwO2UuZ2plY3lyaWxsaWM9MTEwNztlLmdsb3R0YWxpbnZlcnRlZHN0cm9rZT00NDY7ZS5nbG90dGFsc3RvcD02NjA7ZS5nbG90dGFsc3RvcGludmVydGVkPTY2MjtlLmdsb3R0YWxzdG9wbW9kPTcwNDtlLmdsb3R0YWxzdG9wcmV2ZXJzZWQ9NjYxO2UuZ2xvdHRhbHN0b3ByZXZlcnNlZG1vZD03MDU7ZS5nbG90dGFsc3RvcHJldmVyc2Vkc3VwZXJpb3I9NzQwO2UuZ2xvdHRhbHN0b3BzdHJva2U9NjczO2UuZ2xvdHRhbHN0b3BzdHJva2VyZXZlcnNlZD02NzQ7ZS5nbWFjcm9uPTc3MTM7ZS5nbW9ub3NwYWNlPTY1MzUxO2UuZ29oaXJhZ2FuYT0xMjM3MjtlLmdva2F0YWthbmE9MTI0Njg7ZS5ncGFyZW49OTM3ODtlLmdwYXNxdWFyZT0xMzIyODtlLmdyYWRpZW50PTg3MTE7ZS5ncmF2ZT05NjtlLmdyYXZlYmVsb3djbWI9NzkwO2UuZ3JhdmVjbWI9NzY4O2UuZ3JhdmVjb21iPTc2ODtlLmdyYXZlZGV2YT0yMzg3O2UuZ3JhdmVsb3dtb2Q9NzE4O2UuZ3JhdmVtb25vc3BhY2U9NjUzNDQ7ZS5ncmF2ZXRvbmVjbWI9ODMyO2UuZ3JlYXRlcj02MjtlLmdyZWF0ZXJlcXVhbD04ODA1O2UuZ3JlYXRlcmVxdWFsb3JsZXNzPTg5MjM7ZS5ncmVhdGVybW9ub3NwYWNlPTY1MzEwO2UuZ3JlYXRlcm9yZXF1aXZhbGVudD04ODE5O2UuZ3JlYXRlcm9ybGVzcz04ODIzO2UuZ3JlYXRlcm92ZXJlcXVhbD04ODA3O2UuZ3JlYXRlcnNtYWxsPTY1MTI1O2UuZ3NjcmlwdD02MDk7ZS5nc3Ryb2tlPTQ4NTtlLmd1aGlyYWdhbmE9MTIzNjg7ZS5ndWlsbGVtb3RsZWZ0PTE3MTtlLmd1aWxsZW1vdHJpZ2h0PTE4NztlLmd1aWxzaW5nbGxlZnQ9ODI0OTtlLmd1aWxzaW5nbHJpZ2h0PTgyNTA7ZS5ndWthdGFrYW5hPTEyNDY0O2UuZ3VyYW11c3F1YXJlPTEzMDgwO2UuZ3lzcXVhcmU9MTMyNTc7ZS5oPTEwNDtlLmhhYWJraGFzaWFuY3lyaWxsaWM9MTE5MztlLmhhYWx0b25lYXJhYmljPTE3Mjk7ZS5oYWJlbmdhbGk9MjQ4OTtlLmhhZGVzY2VuZGVyY3lyaWxsaWM9MTIwMztlLmhhZGV2YT0yMzYxO2UuaGFndWphcmF0aT0yNzQ1O2UuaGFndXJtdWtoaT0yNjE3O2UuaGFoYXJhYmljPTE1ODE7ZS5oYWhmaW5hbGFyYWJpYz02NTE4NjtlLmhhaGluaXRpYWxhcmFiaWM9NjUxODc7ZS5oYWhpcmFnYW5hPTEyMzk5O2UuaGFobWVkaWFsYXJhYmljPTY1MTg4O2UuaGFpdHVzcXVhcmU9MTMwOTg7ZS5oYWthdGFrYW5hPTEyNDk1O2UuaGFrYXRha2FuYWhhbGZ3aWR0aD02NTQxODtlLmhhbGFudGd1cm11a2hpPTI2Mzc7ZS5oYW16YWFyYWJpYz0xNTY5O2UuaGFtemFsb3dhcmFiaWM9MTU2OTtlLmhhbmd1bGZpbGxlcj0xMjY0NDtlLmhhcmRzaWduY3lyaWxsaWM9MTA5ODtlLmhhcnBvb25sZWZ0YmFyYnVwPTg2MzY7ZS5oYXJwb29ucmlnaHRiYXJidXA9ODY0MDtlLmhhc3F1YXJlPTEzMjU4O2UuaGF0YWZwYXRhaD0xNDU4O2UuaGF0YWZwYXRhaDE2PTE0NTg7ZS5oYXRhZnBhdGFoMjM9MTQ1ODtlLmhhdGFmcGF0YWgyZj0xNDU4O2UuaGF0YWZwYXRhaGhlYnJldz0xNDU4O2UuaGF0YWZwYXRhaG5hcnJvd2hlYnJldz0xNDU4O2UuaGF0YWZwYXRhaHF1YXJ0ZXJoZWJyZXc9MTQ1ODtlLmhhdGFmcGF0YWh3aWRlaGVicmV3PTE0NTg7ZS5oYXRhZnFhbWF0cz0xNDU5O2UuaGF0YWZxYW1hdHMxYj0xNDU5O2UuaGF0YWZxYW1hdHMyOD0xNDU5O2UuaGF0YWZxYW1hdHMzND0xNDU5O2UuaGF0YWZxYW1hdHNoZWJyZXc9MTQ1OTtlLmhhdGFmcWFtYXRzbmFycm93aGVicmV3PTE0NTk7ZS5oYXRhZnFhbWF0c3F1YXJ0ZXJoZWJyZXc9MTQ1OTtlLmhhdGFmcWFtYXRzd2lkZWhlYnJldz0xNDU5O2UuaGF0YWZzZWdvbD0xNDU3O2UuaGF0YWZzZWdvbDE3PTE0NTc7ZS5oYXRhZnNlZ29sMjQ9MTQ1NztlLmhhdGFmc2Vnb2wzMD0xNDU3O2UuaGF0YWZzZWdvbGhlYnJldz0xNDU3O2UuaGF0YWZzZWdvbG5hcnJvd2hlYnJldz0xNDU3O2UuaGF0YWZzZWdvbHF1YXJ0ZXJoZWJyZXc9MTQ1NztlLmhhdGFmc2Vnb2x3aWRlaGVicmV3PTE0NTc7ZS5oYmFyPTI5NTtlLmhib3BvbW9mbz0xMjU1OTtlLmhicmV2ZWJlbG93PTc3MjM7ZS5oY2VkaWxsYT03NzIxO2UuaGNpcmNsZT05NDMxO2UuaGNpcmN1bWZsZXg9MjkzO2UuaGRpZXJlc2lzPTc3MTk7ZS5oZG90YWNjZW50PTc3MTU7ZS5oZG90YmVsb3c9NzcxNztlLmhlPTE0OTI7ZS5oZWFydD05ODI5O2UuaGVhcnRzdWl0YmxhY2s9OTgyOTtlLmhlYXJ0c3VpdHdoaXRlPTk4MjU7ZS5oZWRhZ2VzaD02NDMwODtlLmhlZGFnZXNoaGVicmV3PTY0MzA4O2UuaGVoYWx0b25lYXJhYmljPTE3Mjk7ZS5oZWhhcmFiaWM9MTYwNztlLmhlaGVicmV3PTE0OTI7ZS5oZWhmaW5hbGFsdG9uZWFyYWJpYz02NDQyMztlLmhlaGZpbmFsYWx0dHdvYXJhYmljPTY1MjU4O2UuaGVoZmluYWxhcmFiaWM9NjUyNTg7ZS5oZWhoYW16YWFib3ZlZmluYWxhcmFiaWM9NjQ0MjE7ZS5oZWhoYW16YWFib3ZlaXNvbGF0ZWRhcmFiaWM9NjQ0MjA7ZS5oZWhpbml0aWFsYWx0b25lYXJhYmljPTY0NDI0O2UuaGVoaW5pdGlhbGFyYWJpYz02NTI1OTtlLmhlaGlyYWdhbmE9MTI0MDg7ZS5oZWhtZWRpYWxhbHRvbmVhcmFiaWM9NjQ0MjU7ZS5oZWhtZWRpYWxhcmFiaWM9NjUyNjA7ZS5oZWlzZWllcmFzcXVhcmU9MTMxNzk7ZS5oZWthdGFrYW5hPTEyNTA0O2UuaGVrYXRha2FuYWhhbGZ3aWR0aD02NTQyMTtlLmhla3V0YWFydXNxdWFyZT0xMzExMDtlLmhlbmdob29rPTYxNTtlLmhlcnV0dXNxdWFyZT0xMzExMztlLmhldD0xNDk1O2UuaGV0aGVicmV3PTE0OTU7ZS5oaG9vaz02MTQ7ZS5oaG9va3N1cGVyaW9yPTY4OTtlLmhpZXVoYWNpcmNsZWtvcmVhbj0xMjkyMztlLmhpZXVoYXBhcmVua29yZWFuPTEyODI3O2UuaGlldWhjaXJjbGVrb3JlYW49MTI5MDk7ZS5oaWV1aGtvcmVhbj0xMjYyMjtlLmhpZXVocGFyZW5rb3JlYW49MTI4MTM7ZS5oaWhpcmFnYW5hPTEyNDAyO2UuaGlrYXRha2FuYT0xMjQ5ODtlLmhpa2F0YWthbmFoYWxmd2lkdGg9NjU0MTk7ZS5oaXJpcT0xNDYwO2UuaGlyaXExND0xNDYwO2UuaGlyaXEyMT0xNDYwO2UuaGlyaXEyZD0xNDYwO2UuaGlyaXFoZWJyZXc9MTQ2MDtlLmhpcmlxbmFycm93aGVicmV3PTE0NjA7ZS5oaXJpcXF1YXJ0ZXJoZWJyZXc9MTQ2MDtlLmhpcmlxd2lkZWhlYnJldz0xNDYwO2UuaGxpbmViZWxvdz03ODMwO2UuaG1vbm9zcGFjZT02NTM1MjtlLmhvYXJtZW5pYW49MTM5MjtlLmhvaGlwdGhhaT0zNjI3O2UuaG9oaXJhZ2FuYT0xMjQxMTtlLmhva2F0YWthbmE9MTI1MDc7ZS5ob2thdGFrYW5haGFsZndpZHRoPTY1NDIyO2UuaG9sYW09MTQ2NTtlLmhvbGFtMTk9MTQ2NTtlLmhvbGFtMjY9MTQ2NTtlLmhvbGFtMzI9MTQ2NTtlLmhvbGFtaGVicmV3PTE0NjU7ZS5ob2xhbW5hcnJvd2hlYnJldz0xNDY1O2UuaG9sYW1xdWFydGVyaGVicmV3PTE0NjU7ZS5ob2xhbXdpZGVoZWJyZXc9MTQ2NTtlLmhvbm9raHVrdGhhaT0zNjMwO2UuaG9va2Fib3ZlY29tYj03Nzc7ZS5ob29rY21iPTc3NztlLmhvb2twYWxhdGFsaXplZGJlbG93Y21iPTgwMTtlLmhvb2tyZXRyb2ZsZXhiZWxvd2NtYj04MDI7ZS5ob29uc3F1YXJlPTEzMTIyO2UuaG9yaWNvcHRpYz0xMDAxO2UuaG9yaXpvbnRhbGJhcj04MjEzO2UuaG9ybmNtYj03OTU7ZS5ob3RzcHJpbmdzPTk4MzI7ZS5ob3VzZT04OTYyO2UuaHBhcmVuPTkzNzk7ZS5oc3VwZXJpb3I9Njg4O2UuaHR1cm5lZD02MTM7ZS5odWhpcmFnYW5hPTEyNDA1O2UuaHVpaXRvc3F1YXJlPTEzMTA3O2UuaHVrYXRha2FuYT0xMjUwMTtlLmh1a2F0YWthbmFoYWxmd2lkdGg9NjU0MjA7ZS5odW5nYXJ1bWxhdXQ9NzMzO2UuaHVuZ2FydW1sYXV0Y21iPTc3OTtlLmh2PTQwNTtlLmh5cGhlbj00NTtlLmh5cGhlbmluZmVyaW9yPTYzMjA1O2UuaHlwaGVubW9ub3NwYWNlPTY1MjkzO2UuaHlwaGVuc21hbGw9NjUxMjM7ZS5oeXBoZW5zdXBlcmlvcj02MzIwNjtlLmh5cGhlbnR3bz04MjA4O2UuaT0xMDU7ZS5pYWN1dGU9MjM3O2UuaWFjeXJpbGxpYz0xMTAzO2UuaWJlbmdhbGk9MjQzOTtlLmlib3BvbW9mbz0xMjU4MztlLmlicmV2ZT0zMDE7ZS5pY2Fyb249NDY0O2UuaWNpcmNsZT05NDMyO2UuaWNpcmN1bWZsZXg9MjM4O2UuaWN5cmlsbGljPTExMTA7ZS5pZGJsZ3JhdmU9NTIxO2UuaWRlb2dyYXBoZWFydGhjaXJjbGU9MTI5NDM7ZS5pZGVvZ3JhcGhmaXJlY2lyY2xlPTEyOTM5O2UuaWRlb2dyYXBoaWNhbGxpYW5jZXBhcmVuPTEyODYzO2UuaWRlb2dyYXBoaWNjYWxscGFyZW49MTI4NTg7ZS5pZGVvZ3JhcGhpY2NlbnRyZWNpcmNsZT0xMjk2NTtlLmlkZW9ncmFwaGljY2xvc2U9MTIyOTQ7ZS5pZGVvZ3JhcGhpY2NvbW1hPTEyMjg5O2UuaWRlb2dyYXBoaWNjb21tYWxlZnQ9NjUzODA7ZS5pZGVvZ3JhcGhpY2NvbmdyYXR1bGF0aW9ucGFyZW49MTI4NTU7ZS5pZGVvZ3JhcGhpY2NvcnJlY3RjaXJjbGU9MTI5NjM7ZS5pZGVvZ3JhcGhpY2VhcnRocGFyZW49MTI4NDc7ZS5pZGVvZ3JhcGhpY2VudGVycHJpc2VwYXJlbj0xMjg2MTtlLmlkZW9ncmFwaGljZXhjZWxsZW50Y2lyY2xlPTEyOTU3O2UuaWRlb2dyYXBoaWNmZXN0aXZhbHBhcmVuPTEyODY0O2UuaWRlb2dyYXBoaWNmaW5hbmNpYWxjaXJjbGU9MTI5NTA7ZS5pZGVvZ3JhcGhpY2ZpbmFuY2lhbHBhcmVuPTEyODU0O2UuaWRlb2dyYXBoaWNmaXJlcGFyZW49MTI4NDM7ZS5pZGVvZ3JhcGhpY2hhdmVwYXJlbj0xMjg1MDtlLmlkZW9ncmFwaGljaGlnaGNpcmNsZT0xMjk2NDtlLmlkZW9ncmFwaGljaXRlcmF0aW9ubWFyaz0xMjI5MztlLmlkZW9ncmFwaGljbGFib3JjaXJjbGU9MTI5NTI7ZS5pZGVvZ3JhcGhpY2xhYm9ycGFyZW49MTI4NTY7ZS5pZGVvZ3JhcGhpY2xlZnRjaXJjbGU9MTI5Njc7ZS5pZGVvZ3JhcGhpY2xvd2NpcmNsZT0xMjk2NjtlLmlkZW9ncmFwaGljbWVkaWNpbmVjaXJjbGU9MTI5Njk7ZS5pZGVvZ3JhcGhpY21ldGFscGFyZW49MTI4NDY7ZS5pZGVvZ3JhcGhpY21vb25wYXJlbj0xMjg0MjtlLmlkZW9ncmFwaGljbmFtZXBhcmVuPTEyODUyO2UuaWRlb2dyYXBoaWNwZXJpb2Q9MTIyOTA7ZS5pZGVvZ3JhcGhpY3ByaW50Y2lyY2xlPTEyOTU4O2UuaWRlb2dyYXBoaWNyZWFjaHBhcmVuPTEyODY3O2UuaWRlb2dyYXBoaWNyZXByZXNlbnRwYXJlbj0xMjg1NztlLmlkZW9ncmFwaGljcmVzb3VyY2VwYXJlbj0xMjg2MjtlLmlkZW9ncmFwaGljcmlnaHRjaXJjbGU9MTI5Njg7ZS5pZGVvZ3JhcGhpY3NlY3JldGNpcmNsZT0xMjk1MztlLmlkZW9ncmFwaGljc2VsZnBhcmVuPTEyODY2O2UuaWRlb2dyYXBoaWNzb2NpZXR5cGFyZW49MTI4NTE7ZS5pZGVvZ3JhcGhpY3NwYWNlPTEyMjg4O2UuaWRlb2dyYXBoaWNzcGVjaWFscGFyZW49MTI4NTM7ZS5pZGVvZ3JhcGhpY3N0b2NrcGFyZW49MTI4NDk7ZS5pZGVvZ3JhcGhpY3N0dWR5cGFyZW49MTI4NTk7ZS5pZGVvZ3JhcGhpY3N1bnBhcmVuPTEyODQ4O2UuaWRlb2dyYXBoaWNzdXBlcnZpc2VwYXJlbj0xMjg2MDtlLmlkZW9ncmFwaGljd2F0ZXJwYXJlbj0xMjg0NDtlLmlkZW9ncmFwaGljd29vZHBhcmVuPTEyODQ1O2UuaWRlb2dyYXBoaWN6ZXJvPTEyMjk1O2UuaWRlb2dyYXBobWV0YWxjaXJjbGU9MTI5NDI7ZS5pZGVvZ3JhcGhtb29uY2lyY2xlPTEyOTM4O2UuaWRlb2dyYXBobmFtZWNpcmNsZT0xMjk0ODtlLmlkZW9ncmFwaHN1bmNpcmNsZT0xMjk0NDtlLmlkZW9ncmFwaHdhdGVyY2lyY2xlPTEyOTQwO2UuaWRlb2dyYXBod29vZGNpcmNsZT0xMjk0MTtlLmlkZXZhPTIzMTE7ZS5pZGllcmVzaXM9MjM5O2UuaWRpZXJlc2lzYWN1dGU9NzcyNztlLmlkaWVyZXNpc2N5cmlsbGljPTEyNTM7ZS5pZG90YmVsb3c9Nzg4MztlLmllYnJldmVjeXJpbGxpYz0xMjM5O2UuaWVjeXJpbGxpYz0xMDc3O2UuaWV1bmdhY2lyY2xla29yZWFuPTEyOTE3O2UuaWV1bmdhcGFyZW5rb3JlYW49MTI4MjE7ZS5pZXVuZ2NpcmNsZWtvcmVhbj0xMjkwMztlLmlldW5na29yZWFuPTEyNjE1O2UuaWV1bmdwYXJlbmtvcmVhbj0xMjgwNztlLmlncmF2ZT0yMzY7ZS5pZ3VqYXJhdGk9MjY5NTtlLmlndXJtdWtoaT0yNTY3O2UuaWhpcmFnYW5hPTEyMzU2O2UuaWhvb2thYm92ZT03ODgxO2UuaWliZW5nYWxpPTI0NDA7ZS5paWN5cmlsbGljPTEwODA7ZS5paWRldmE9MjMxMjtlLmlpZ3VqYXJhdGk9MjY5NjtlLmlpZ3VybXVraGk9MjU2ODtlLmlpbWF0cmFndXJtdWtoaT0yNjI0O2UuaWludmVydGVkYnJldmU9NTIzO2UuaWlzaG9ydGN5cmlsbGljPTEwODE7ZS5paXZvd2Vsc2lnbmJlbmdhbGk9MjQ5NjtlLmlpdm93ZWxzaWduZGV2YT0yMzY4O2UuaWl2b3dlbHNpZ25ndWphcmF0aT0yNzUyO2UuaWo9MzA3O2UuaWthdGFrYW5hPTEyNDUyO2UuaWthdGFrYW5haGFsZndpZHRoPTY1Mzk0O2UuaWtvcmVhbj0xMjY0MztlLmlsZGU9NzMyO2UuaWx1eWhlYnJldz0xNDUyO2UuaW1hY3Jvbj0yOTk7ZS5pbWFjcm9uY3lyaWxsaWM9MTI1MTtlLmltYWdlb3JhcHByb3hpbWF0ZWx5ZXF1YWw9ODc4NztlLmltYXRyYWd1cm11a2hpPTI2MjM7ZS5pbW9ub3NwYWNlPTY1MzUzO2UuaW5jcmVtZW50PTg3MTA7ZS5pbmZpbml0eT04NzM0O2UuaW5pYXJtZW5pYW49MTM4NztlLmludGVncmFsPTg3NDc7ZS5pbnRlZ3JhbGJvdHRvbT04OTkzO2UuaW50ZWdyYWxidD04OTkzO2UuaW50ZWdyYWxleD02MzczMztlLmludGVncmFsdG9wPTg5OTI7ZS5pbnRlZ3JhbHRwPTg5OTI7ZS5pbnRlcnNlY3Rpb249ODc0NTtlLmludGlzcXVhcmU9MTMwNjE7ZS5pbnZidWxsZXQ9OTY4ODtlLmludmNpcmNsZT05Njg5O2UuaW52c21pbGVmYWNlPTk3ODc7ZS5pb2N5cmlsbGljPTExMDU7ZS5pb2dvbmVrPTMwMztlLmlvdGE9OTUzO2UuaW90YWRpZXJlc2lzPTk3MDtlLmlvdGFkaWVyZXNpc3Rvbm9zPTkxMjtlLmlvdGFsYXRpbj02MTc7ZS5pb3RhdG9ub3M9OTQzO2UuaXBhcmVuPTkzODA7ZS5pcmlndXJtdWtoaT0yNjc0O2UuaXNtYWxsaGlyYWdhbmE9MTIzNTU7ZS5pc21hbGxrYXRha2FuYT0xMjQ1MTtlLmlzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1Mzg0O2UuaXNzaGFyYmVuZ2FsaT0yNTU0O2UuaXN0cm9rZT02MTY7ZS5pc3VwZXJpb3I9NjMyMTM7ZS5pdGVyYXRpb25oaXJhZ2FuYT0xMjQ0NTtlLml0ZXJhdGlvbmthdGFrYW5hPTEyNTQxO2UuaXRpbGRlPTI5NztlLml0aWxkZWJlbG93PTc3MjU7ZS5pdWJvcG9tb2ZvPTEyNTg1O2UuaXVjeXJpbGxpYz0xMTAyO2UuaXZvd2Vsc2lnbmJlbmdhbGk9MjQ5NTtlLml2b3dlbHNpZ25kZXZhPTIzNjc7ZS5pdm93ZWxzaWduZ3VqYXJhdGk9Mjc1MTtlLml6aGl0c2FjeXJpbGxpYz0xMTQxO2UuaXpoaXRzYWRibGdyYXZlY3lyaWxsaWM9MTE0MztlLmo9MTA2O2UuamFhcm1lbmlhbj0xMzkzO2UuamFiZW5nYWxpPTI0NjA7ZS5qYWRldmE9MjMzMjtlLmphZ3VqYXJhdGk9MjcxNjtlLmphZ3VybXVraGk9MjU4ODtlLmpib3BvbW9mbz0xMjU2MDtlLmpjYXJvbj00OTY7ZS5qY2lyY2xlPTk0MzM7ZS5qY2lyY3VtZmxleD0zMDk7ZS5qY3Jvc3NlZHRhaWw9NjY5O2UuamRvdGxlc3NzdHJva2U9NjA3O2UuamVjeXJpbGxpYz0xMTEyO2UuamVlbWFyYWJpYz0xNTgwO2UuamVlbWZpbmFsYXJhYmljPTY1MTgyO2UuamVlbWluaXRpYWxhcmFiaWM9NjUxODM7ZS5qZWVtbWVkaWFsYXJhYmljPTY1MTg0O2UuamVoYXJhYmljPTE2ODg7ZS5qZWhmaW5hbGFyYWJpYz02NDM5NTtlLmpoYWJlbmdhbGk9MjQ2MTtlLmpoYWRldmE9MjMzMztlLmpoYWd1amFyYXRpPTI3MTc7ZS5qaGFndXJtdWtoaT0yNTg5O2UuamhlaGFybWVuaWFuPTE0MDM7ZS5qaXM9MTIyOTI7ZS5qbW9ub3NwYWNlPTY1MzU0O2UuanBhcmVuPTkzODE7ZS5qc3VwZXJpb3I9NjkwO2Uuaz0xMDc7ZS5rYWJhc2hraXJjeXJpbGxpYz0xMTg1O2Uua2FiZW5nYWxpPTI0NTM7ZS5rYWN1dGU9NzcyOTtlLmthY3lyaWxsaWM9MTA4MjtlLmthZGVzY2VuZGVyY3lyaWxsaWM9MTE3OTtlLmthZGV2YT0yMzI1O2Uua2FmPTE0OTk7ZS5rYWZhcmFiaWM9MTYwMztlLmthZmRhZ2VzaD02NDMxNTtlLmthZmRhZ2VzaGhlYnJldz02NDMxNTtlLmthZmZpbmFsYXJhYmljPTY1MjQyO2Uua2FmaGVicmV3PTE0OTk7ZS5rYWZpbml0aWFsYXJhYmljPTY1MjQzO2Uua2FmbWVkaWFsYXJhYmljPTY1MjQ0O2Uua2FmcmFmZWhlYnJldz02NDMzMztlLmthZ3VqYXJhdGk9MjcwOTtlLmthZ3VybXVraGk9MjU4MTtlLmthaGlyYWdhbmE9MTIzNjM7ZS5rYWhvb2tjeXJpbGxpYz0xMjIwO2Uua2FrYXRha2FuYT0xMjQ1OTtlLmtha2F0YWthbmFoYWxmd2lkdGg9NjUzOTg7ZS5rYXBwYT05NTQ7ZS5rYXBwYXN5bWJvbGdyZWVrPTEwMDg7ZS5rYXB5ZW91bm1pZXVta29yZWFuPTEyNjU3O2Uua2FweWVvdW5waGlldXBoa29yZWFuPTEyNjc2O2Uua2FweWVvdW5waWV1cGtvcmVhbj0xMjY2NDtlLmthcHllb3Vuc3NhbmdwaWV1cGtvcmVhbj0xMjY2NTtlLmthcm9yaWlzcXVhcmU9MTMwNjk7ZS5rYXNoaWRhYXV0b2FyYWJpYz0xNjAwO2Uua2FzaGlkYWF1dG9ub3NpZGViZWFyaW5nYXJhYmljPTE2MDA7ZS5rYXNtYWxsa2F0YWthbmE9MTI1MzM7ZS5rYXNxdWFyZT0xMzE4ODtlLmthc3JhYXJhYmljPTE2MTY7ZS5rYXNyYXRhbmFyYWJpYz0xNjEzO2Uua2FzdHJva2VjeXJpbGxpYz0xMTgzO2Uua2F0YWhpcmFwcm9sb25nbWFya2hhbGZ3aWR0aD02NTM5MjtlLmthdmVydGljYWxzdHJva2VjeXJpbGxpYz0xMTgxO2Uua2JvcG9tb2ZvPTEyNTU4O2Uua2NhbHNxdWFyZT0xMzE5MztlLmtjYXJvbj00ODk7ZS5rY2VkaWxsYT0zMTE7ZS5rY2lyY2xlPTk0MzQ7ZS5rY29tbWFhY2NlbnQ9MzExO2Uua2RvdGJlbG93PTc3MzE7ZS5rZWhhcm1lbmlhbj0xNDEyO2Uua2VoaXJhZ2FuYT0xMjM2OTtlLmtla2F0YWthbmE9MTI0NjU7ZS5rZWthdGFrYW5haGFsZndpZHRoPTY1NDAxO2Uua2VuYXJtZW5pYW49MTM5MTtlLmtlc21hbGxrYXRha2FuYT0xMjUzNDtlLmtncmVlbmxhbmRpYz0zMTI7ZS5raGFiZW5nYWxpPTI0NTQ7ZS5raGFjeXJpbGxpYz0xMDkzO2Uua2hhZGV2YT0yMzI2O2Uua2hhZ3VqYXJhdGk9MjcxMDtlLmtoYWd1cm11a2hpPTI1ODI7ZS5raGFoYXJhYmljPTE1ODI7ZS5raGFoZmluYWxhcmFiaWM9NjUxOTA7ZS5raGFoaW5pdGlhbGFyYWJpYz02NTE5MTtlLmtoYWhtZWRpYWxhcmFiaWM9NjUxOTI7ZS5raGVpY29wdGljPTk5OTtlLmtoaGFkZXZhPTIzOTM7ZS5raGhhZ3VybXVraGk9MjY0OTtlLmtoaWV1a2hhY2lyY2xla29yZWFuPTEyOTIwO2Uua2hpZXVraGFwYXJlbmtvcmVhbj0xMjgyNDtlLmtoaWV1a2hjaXJjbGVrb3JlYW49MTI5MDY7ZS5raGlldWtoa29yZWFuPTEyNjE5O2Uua2hpZXVraHBhcmVua29yZWFuPTEyODEwO2Uua2hva2hhaXRoYWk9MzU4NjtlLmtob2tob250aGFpPTM1ODk7ZS5raG9raHVhdHRoYWk9MzU4NztlLmtob2tod2FpdGhhaT0zNTg4O2Uua2hvbXV0dGhhaT0zNjc1O2Uua2hvb2s9NDA5O2Uua2hvcmFraGFuZ3RoYWk9MzU5MDtlLmtoenNxdWFyZT0xMzIwMTtlLmtpaGlyYWdhbmE9MTIzNjU7ZS5raWthdGFrYW5hPTEyNDYxO2Uua2lrYXRha2FuYWhhbGZ3aWR0aD02NTM5OTtlLmtpcm9ndXJhbXVzcXVhcmU9MTMwNzc7ZS5raXJvbWVldG9ydXNxdWFyZT0xMzA3ODtlLmtpcm9zcXVhcmU9MTMwNzY7ZS5raXllb2thY2lyY2xla29yZWFuPTEyOTEwO2Uua2l5ZW9rYXBhcmVua29yZWFuPTEyODE0O2Uua2l5ZW9rY2lyY2xla29yZWFuPTEyODk2O2Uua2l5ZW9ra29yZWFuPTEyNTkzO2Uua2l5ZW9rcGFyZW5rb3JlYW49MTI4MDA7ZS5raXllb2tzaW9za29yZWFuPTEyNTk1O2Uua2plY3lyaWxsaWM9MTExNjtlLmtsaW5lYmVsb3c9NzczMztlLmtsc3F1YXJlPTEzMjA4O2Uua21jdWJlZHNxdWFyZT0xMzIyMjtlLmttb25vc3BhY2U9NjUzNTU7ZS5rbXNxdWFyZWRzcXVhcmU9MTMyMTg7ZS5rb2hpcmFnYW5hPTEyMzcxO2Uua29obXNxdWFyZT0xMzI0ODtlLmtva2FpdGhhaT0zNTg1O2Uua29rYXRha2FuYT0xMjQ2NztlLmtva2F0YWthbmFoYWxmd2lkdGg9NjU0MDI7ZS5rb29wb3NxdWFyZT0xMzA4NjtlLmtvcHBhY3lyaWxsaWM9MTE1MztlLmtvcmVhbnN0YW5kYXJkc3ltYm9sPTEyOTI3O2Uua29yb25pc2NtYj04MzU7ZS5rcGFyZW49OTM4MjtlLmtwYXNxdWFyZT0xMzIyNjtlLmtzaWN5cmlsbGljPTExMzU7ZS5rdHNxdWFyZT0xMzI2MztlLmt0dXJuZWQ9NjcwO2Uua3VoaXJhZ2FuYT0xMjM2NztlLmt1a2F0YWthbmE9MTI0NjM7ZS5rdWthdGFrYW5haGFsZndpZHRoPTY1NDAwO2Uua3ZzcXVhcmU9MTMyNDA7ZS5rd3NxdWFyZT0xMzI0NjtlLmw9MTA4O2UubGFiZW5nYWxpPTI0ODI7ZS5sYWN1dGU9MzE0O2UubGFkZXZhPTIzNTQ7ZS5sYWd1amFyYXRpPTI3Mzg7ZS5sYWd1cm11a2hpPTI2MTA7ZS5sYWtraGFuZ3lhb3RoYWk9MzY1MztlLmxhbWFsZWZmaW5hbGFyYWJpYz02NTI3NjtlLmxhbWFsZWZoYW16YWFib3ZlZmluYWxhcmFiaWM9NjUyNzI7ZS5sYW1hbGVmaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljPTY1MjcxO2UubGFtYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYz02NTI3NDtlLmxhbWFsZWZoYW16YWJlbG93aXNvbGF0ZWRhcmFiaWM9NjUyNzM7ZS5sYW1hbGVmaXNvbGF0ZWRhcmFiaWM9NjUyNzU7ZS5sYW1hbGVmbWFkZGFhYm92ZWZpbmFsYXJhYmljPTY1MjcwO2UubGFtYWxlZm1hZGRhYWJvdmVpc29sYXRlZGFyYWJpYz02NTI2OTtlLmxhbWFyYWJpYz0xNjA0O2UubGFtYmRhPTk1NTtlLmxhbWJkYXN0cm9rZT00MTE7ZS5sYW1lZD0xNTAwO2UubGFtZWRkYWdlc2g9NjQzMTY7ZS5sYW1lZGRhZ2VzaGhlYnJldz02NDMxNjtlLmxhbWVkaGVicmV3PTE1MDA7ZS5sYW1maW5hbGFyYWJpYz02NTI0NjtlLmxhbWhhaGluaXRpYWxhcmFiaWM9NjQ3MTQ7ZS5sYW1pbml0aWFsYXJhYmljPTY1MjQ3O2UubGFtamVlbWluaXRpYWxhcmFiaWM9NjQ3MTM7ZS5sYW1raGFoaW5pdGlhbGFyYWJpYz02NDcxNTtlLmxhbWxhbWhlaGlzb2xhdGVkYXJhYmljPTY1MDEwO2UubGFtbWVkaWFsYXJhYmljPTY1MjQ4O2UubGFtbWVlbWhhaGluaXRpYWxhcmFiaWM9NjQ5MDQ7ZS5sYW1tZWVtaW5pdGlhbGFyYWJpYz02NDcxNjtlLmxhcmdlY2lyY2xlPTk3MTE7ZS5sYmFyPTQxMDtlLmxiZWx0PTYyMDtlLmxib3BvbW9mbz0xMjU1NjtlLmxjYXJvbj0zMTg7ZS5sY2VkaWxsYT0zMTY7ZS5sY2lyY2xlPTk0MzU7ZS5sY2lyY3VtZmxleGJlbG93PTc3NDE7ZS5sY29tbWFhY2NlbnQ9MzE2O2UubGRvdD0zMjA7ZS5sZG90YWNjZW50PTMyMDtlLmxkb3RiZWxvdz03NzM1O2UubGRvdGJlbG93bWFjcm9uPTc3Mzc7ZS5sZWZ0YW5nbGVhYm92ZWNtYj03OTQ7ZS5sZWZ0dGFja2JlbG93Y21iPTc5MjtlLmxlc3M9NjA7ZS5sZXNzZXF1YWw9ODgwNDtlLmxlc3NlcXVhbG9yZ3JlYXRlcj04OTIyO2UubGVzc21vbm9zcGFjZT02NTMwODtlLmxlc3NvcmVxdWl2YWxlbnQ9ODgxODtlLmxlc3NvcmdyZWF0ZXI9ODgyMjtlLmxlc3NvdmVyZXF1YWw9ODgwNjtlLmxlc3NzbWFsbD02NTEyNDtlLmxlemg9NjIyO2UubGZibG9jaz05NjEyO2UubGhvb2tyZXRyb2ZsZXg9NjIxO2UubGlyYT04MzU2O2UubGl3bmFybWVuaWFuPTEzODg7ZS5saj00NTc7ZS5samVjeXJpbGxpYz0xMTEzO2UubGw9NjMxNjg7ZS5sbGFkZXZhPTIzNTU7ZS5sbGFndWphcmF0aT0yNzM5O2UubGxpbmViZWxvdz03NzM5O2UubGxsYWRldmE9MjM1NjtlLmxsdm9jYWxpY2JlbmdhbGk9MjUyOTtlLmxsdm9jYWxpY2RldmE9MjQwMTtlLmxsdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGk9MjUzMTtlLmxsdm9jYWxpY3Zvd2Vsc2lnbmRldmE9MjQwMztlLmxtaWRkbGV0aWxkZT02MTk7ZS5sbW9ub3NwYWNlPTY1MzU2O2UubG1zcXVhcmU9MTMyNjQ7ZS5sb2NodWxhdGhhaT0zNjI4O2UubG9naWNhbGFuZD04NzQzO2UubG9naWNhbG5vdD0xNzI7ZS5sb2dpY2Fsbm90cmV2ZXJzZWQ9ODk3NjtlLmxvZ2ljYWxvcj04NzQ0O2UubG9saW5ndGhhaT0zNjIxO2UubG9uZ3M9MzgzO2UubG93bGluZWNlbnRlcmxpbmU9NjUxMDI7ZS5sb3dsaW5lY21iPTgxODtlLmxvd2xpbmVkYXNoZWQ9NjUxMDE7ZS5sb3plbmdlPTk2NzQ7ZS5scGFyZW49OTM4MztlLmxzbGFzaD0zMjI7ZS5sc3F1YXJlPTg0Njc7ZS5sc3VwZXJpb3I9NjMyMTQ7ZS5sdHNoYWRlPTk2MTc7ZS5sdXRoYWk9MzYyMjtlLmx2b2NhbGljYmVuZ2FsaT0yNDQ0O2UubHZvY2FsaWNkZXZhPTIzMTY7ZS5sdm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGk9MjUzMDtlLmx2b2NhbGljdm93ZWxzaWduZGV2YT0yNDAyO2UubHhzcXVhcmU9MTMyNjc7ZS5tPTEwOTtlLm1hYmVuZ2FsaT0yNDc4O2UubWFjcm9uPTE3NTtlLm1hY3JvbmJlbG93Y21iPTgxNztlLm1hY3JvbmNtYj03NzI7ZS5tYWNyb25sb3dtb2Q9NzE3O2UubWFjcm9ubW9ub3NwYWNlPTY1NTA3O2UubWFjdXRlPTc3NDM7ZS5tYWRldmE9MjM1MDtlLm1hZ3VqYXJhdGk9MjczNDtlLm1hZ3VybXVraGk9MjYwNjtlLm1haGFwYWtoaGVicmV3PTE0NDQ7ZS5tYWhhcGFraGxlZnRoZWJyZXc9MTQ0NDtlLm1haGlyYWdhbmE9MTI0MTQ7ZS5tYWljaGF0dGF3YWxvd2xlZnR0aGFpPTYzNjM3O2UubWFpY2hhdHRhd2Fsb3dyaWdodHRoYWk9NjM2MzY7ZS5tYWljaGF0dGF3YXRoYWk9MzY1OTtlLm1haWNoYXR0YXdhdXBwZXJsZWZ0dGhhaT02MzYzNTtlLm1haWVrbG93bGVmdHRoYWk9NjM2Mjg7ZS5tYWlla2xvd3JpZ2h0dGhhaT02MzYyNztlLm1haWVrdGhhaT0zNjU2O2UubWFpZWt1cHBlcmxlZnR0aGFpPTYzNjI2O2UubWFpaGFuYWthdGxlZnR0aGFpPTYzNjIwO2UubWFpaGFuYWthdHRoYWk9MzYzMztlLm1haXRhaWtodWxlZnR0aGFpPTYzNjI1O2UubWFpdGFpa2h1dGhhaT0zNjU1O2UubWFpdGhvbG93bGVmdHRoYWk9NjM2MzE7ZS5tYWl0aG9sb3dyaWdodHRoYWk9NjM2MzA7ZS5tYWl0aG90aGFpPTM2NTc7ZS5tYWl0aG91cHBlcmxlZnR0aGFpPTYzNjI5O2UubWFpdHJpbG93bGVmdHRoYWk9NjM2MzQ7ZS5tYWl0cmlsb3dyaWdodHRoYWk9NjM2MzM7ZS5tYWl0cml0aGFpPTM2NTg7ZS5tYWl0cml1cHBlcmxlZnR0aGFpPTYzNjMyO2UubWFpeWFtb2t0aGFpPTM2NTQ7ZS5tYWthdGFrYW5hPTEyNTEwO2UubWFrYXRha2FuYWhhbGZ3aWR0aD02NTQyMztlLm1hbGU9OTc5NDtlLm1hbnN5b25zcXVhcmU9MTMxMjc7ZS5tYXFhZmhlYnJldz0xNDcwO2UubWFycz05Nzk0O2UubWFzb3JhY2lyY2xlaGVicmV3PTE0NTU7ZS5tYXNxdWFyZT0xMzE4NztlLm1ib3BvbW9mbz0xMjU1MTtlLm1ic3F1YXJlPTEzMjY4O2UubWNpcmNsZT05NDM2O2UubWN1YmVkc3F1YXJlPTEzMjIxO2UubWRvdGFjY2VudD03NzQ1O2UubWRvdGJlbG93PTc3NDc7ZS5tZWVtYXJhYmljPTE2MDU7ZS5tZWVtZmluYWxhcmFiaWM9NjUyNTA7ZS5tZWVtaW5pdGlhbGFyYWJpYz02NTI1MTtlLm1lZW1tZWRpYWxhcmFiaWM9NjUyNTI7ZS5tZWVtbWVlbWluaXRpYWxhcmFiaWM9NjQ3MjE7ZS5tZWVtbWVlbWlzb2xhdGVkYXJhYmljPTY0NTg0O2UubWVldG9ydXNxdWFyZT0xMzEzMztlLm1laGlyYWdhbmE9MTI0MTc7ZS5tZWl6aWVyYXNxdWFyZT0xMzE4MjtlLm1la2F0YWthbmE9MTI1MTM7ZS5tZWthdGFrYW5haGFsZndpZHRoPTY1NDI2O2UubWVtPTE1MDI7ZS5tZW1kYWdlc2g9NjQzMTg7ZS5tZW1kYWdlc2hoZWJyZXc9NjQzMTg7ZS5tZW1oZWJyZXc9MTUwMjtlLm1lbmFybWVuaWFuPTEzOTY7ZS5tZXJraGFoZWJyZXc9MTQ0NTtlLm1lcmtoYWtlZnVsYWhlYnJldz0xNDQ2O2UubWVya2hha2VmdWxhbGVmdGhlYnJldz0xNDQ2O2UubWVya2hhbGVmdGhlYnJldz0xNDQ1O2UubWhvb2s9NjI1O2UubWh6c3F1YXJlPTEzMjAyO2UubWlkZGxlZG90a2F0YWthbmFoYWxmd2lkdGg9NjUzODE7ZS5taWRkb3Q9MTgzO2UubWlldW1hY2lyY2xla29yZWFuPTEyOTE0O2UubWlldW1hcGFyZW5rb3JlYW49MTI4MTg7ZS5taWV1bWNpcmNsZWtvcmVhbj0xMjkwMDtlLm1pZXVta29yZWFuPTEyNjA5O2UubWlldW1wYW5zaW9za29yZWFuPTEyNjU2O2UubWlldW1wYXJlbmtvcmVhbj0xMjgwNDtlLm1pZXVtcGlldXBrb3JlYW49MTI2NTQ7ZS5taWV1bXNpb3Nrb3JlYW49MTI2NTU7ZS5taWhpcmFnYW5hPTEyNDE1O2UubWlrYXRha2FuYT0xMjUxMTtlLm1pa2F0YWthbmFoYWxmd2lkdGg9NjU0MjQ7ZS5taW51cz04NzIyO2UubWludXNiZWxvd2NtYj04MDA7ZS5taW51c2NpcmNsZT04ODU0O2UubWludXNtb2Q9NzI3O2UubWludXNwbHVzPTg3MjM7ZS5taW51dGU9ODI0MjtlLm1pcmliYWFydXNxdWFyZT0xMzEzMDtlLm1pcmlzcXVhcmU9MTMxMjk7ZS5tbG9uZ2xlZ3R1cm5lZD02MjQ7ZS5tbHNxdWFyZT0xMzIwNjtlLm1tY3ViZWRzcXVhcmU9MTMyMTk7ZS5tbW9ub3NwYWNlPTY1MzU3O2UubW1zcXVhcmVkc3F1YXJlPTEzMjE1O2UubW9oaXJhZ2FuYT0xMjQxODtlLm1vaG1zcXVhcmU9MTMyNDk7ZS5tb2thdGFrYW5hPTEyNTE0O2UubW9rYXRha2FuYWhhbGZ3aWR0aD02NTQyNztlLm1vbHNxdWFyZT0xMzI3MDtlLm1vbWF0aGFpPTM2MTc7ZS5tb3ZlcnNzcXVhcmU9MTMyMjM7ZS5tb3ZlcnNzcXVhcmVkc3F1YXJlPTEzMjI0O2UubXBhcmVuPTkzODQ7ZS5tcGFzcXVhcmU9MTMyMjc7ZS5tc3NxdWFyZT0xMzIzNTtlLm1zdXBlcmlvcj02MzIxNTtlLm10dXJuZWQ9NjIzO2UubXU9MTgxO2UubXUxPTE4MTtlLm11YXNxdWFyZT0xMzE4NjtlLm11Y2hncmVhdGVyPTg4MTE7ZS5tdWNobGVzcz04ODEwO2UubXVmc3F1YXJlPTEzMTk2O2UubXVncmVlaz05NTY7ZS5tdWdzcXVhcmU9MTMxOTc7ZS5tdWhpcmFnYW5hPTEyNDE2O2UubXVrYXRha2FuYT0xMjUxMjtlLm11a2F0YWthbmFoYWxmd2lkdGg9NjU0MjU7ZS5tdWxzcXVhcmU9MTMyMDU7ZS5tdWx0aXBseT0yMTU7ZS5tdW1zcXVhcmU9MTMyMTE7ZS5tdW5haGhlYnJldz0xNDQzO2UubXVuYWhsZWZ0aGVicmV3PTE0NDM7ZS5tdXNpY2Fsbm90ZT05ODM0O2UubXVzaWNhbG5vdGVkYmw9OTgzNTtlLm11c2ljZmxhdHNpZ249OTgzNztlLm11c2ljc2hhcnBzaWduPTk4Mzk7ZS5tdXNzcXVhcmU9MTMyMzQ7ZS5tdXZzcXVhcmU9MTMyMzg7ZS5tdXdzcXVhcmU9MTMyNDQ7ZS5tdm1lZ2FzcXVhcmU9MTMyNDE7ZS5tdnNxdWFyZT0xMzIzOTtlLm13bWVnYXNxdWFyZT0xMzI0NztlLm13c3F1YXJlPTEzMjQ1O2Uubj0xMTA7ZS5uYWJlbmdhbGk9MjQ3MjtlLm5hYmxhPTg3MTE7ZS5uYWN1dGU9MzI0O2UubmFkZXZhPTIzNDQ7ZS5uYWd1amFyYXRpPTI3Mjg7ZS5uYWd1cm11a2hpPTI2MDA7ZS5uYWhpcmFnYW5hPTEyMzk0O2UubmFrYXRha2FuYT0xMjQ5MDtlLm5ha2F0YWthbmFoYWxmd2lkdGg9NjU0MTM7ZS5uYXBvc3Ryb3BoZT0zMjk7ZS5uYXNxdWFyZT0xMzE4NTtlLm5ib3BvbW9mbz0xMjU1NTtlLm5ic3BhY2U9MTYwO2UubmNhcm9uPTMyODtlLm5jZWRpbGxhPTMyNjtlLm5jaXJjbGU9OTQzNztlLm5jaXJjdW1mbGV4YmVsb3c9Nzc1NTtlLm5jb21tYWFjY2VudD0zMjY7ZS5uZG90YWNjZW50PTc3NDk7ZS5uZG90YmVsb3c9Nzc1MTtlLm5laGlyYWdhbmE9MTIzOTc7ZS5uZWthdGFrYW5hPTEyNDkzO2UubmVrYXRha2FuYWhhbGZ3aWR0aD02NTQxNjtlLm5ld3NoZXFlbHNpZ249ODM2MjtlLm5mc3F1YXJlPTEzMTk1O2UubmdhYmVuZ2FsaT0yNDU3O2UubmdhZGV2YT0yMzI5O2UubmdhZ3VqYXJhdGk9MjcxMztlLm5nYWd1cm11a2hpPTI1ODU7ZS5uZ29uZ3V0aGFpPTM1OTE7ZS5uaGlyYWdhbmE9MTI0MzU7ZS5uaG9va2xlZnQ9NjI2O2Uubmhvb2tyZXRyb2ZsZXg9NjI3O2UubmlldW5hY2lyY2xla29yZWFuPTEyOTExO2UubmlldW5hcGFyZW5rb3JlYW49MTI4MTU7ZS5uaWV1bmNpZXVja29yZWFuPTEyNTk3O2UubmlldW5jaXJjbGVrb3JlYW49MTI4OTc7ZS5uaWV1bmhpZXVoa29yZWFuPTEyNTk4O2UubmlldW5rb3JlYW49MTI1OTY7ZS5uaWV1bnBhbnNpb3Nrb3JlYW49MTI2NDg7ZS5uaWV1bnBhcmVua29yZWFuPTEyODAxO2UubmlldW5zaW9za29yZWFuPTEyNjQ3O2UubmlldW50aWtldXRrb3JlYW49MTI2NDY7ZS5uaWhpcmFnYW5hPTEyMzk1O2UubmlrYXRha2FuYT0xMjQ5MTtlLm5pa2F0YWthbmFoYWxmd2lkdGg9NjU0MTQ7ZS5uaWtoYWhpdGxlZnR0aGFpPTYzNjQxO2UubmlraGFoaXR0aGFpPTM2NjE7ZS5uaW5lPTU3O2UubmluZWFyYWJpYz0xNjQxO2UubmluZWJlbmdhbGk9MjU0MztlLm5pbmVjaXJjbGU9OTMyMDtlLm5pbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTMwO2UubmluZWRldmE9MjQxNTtlLm5pbmVndWphcmF0aT0yNzk5O2UubmluZWd1cm11a2hpPTI2NzE7ZS5uaW5laGFja2FyYWJpYz0xNjQxO2UubmluZWhhbmd6aG91PTEyMzI5O2UubmluZWlkZW9ncmFwaGljcGFyZW49MTI4NDA7ZS5uaW5laW5mZXJpb3I9ODMyOTtlLm5pbmVtb25vc3BhY2U9NjUzMDU7ZS5uaW5lb2xkc3R5bGU9NjMyODk7ZS5uaW5lcGFyZW49OTM0MDtlLm5pbmVwZXJpb2Q9OTM2MDtlLm5pbmVwZXJzaWFuPTE3ODU7ZS5uaW5lcm9tYW49ODU2ODtlLm5pbmVzdXBlcmlvcj04MzEzO2UubmluZXRlZW5jaXJjbGU9OTMzMDtlLm5pbmV0ZWVucGFyZW49OTM1MDtlLm5pbmV0ZWVucGVyaW9kPTkzNzA7ZS5uaW5ldGhhaT0zNjczO2Uubmo9NDYwO2UubmplY3lyaWxsaWM9MTExNDtlLm5rYXRha2FuYT0xMjUzMTtlLm5rYXRha2FuYWhhbGZ3aWR0aD02NTQzNztlLm5sZWdyaWdodGxvbmc9NDE0O2UubmxpbmViZWxvdz03NzUzO2Uubm1vbm9zcGFjZT02NTM1ODtlLm5tc3F1YXJlPTEzMjEwO2Uubm5hYmVuZ2FsaT0yNDY3O2Uubm5hZGV2YT0yMzM5O2Uubm5hZ3VqYXJhdGk9MjcyMztlLm5uYWd1cm11a2hpPTI1OTU7ZS5ubm5hZGV2YT0yMzQ1O2Uubm9oaXJhZ2FuYT0xMjM5ODtlLm5va2F0YWthbmE9MTI0OTQ7ZS5ub2thdGFrYW5haGFsZndpZHRoPTY1NDE3O2Uubm9uYnJlYWtpbmdzcGFjZT0xNjA7ZS5ub25lbnRoYWk9MzYwMztlLm5vbnV0aGFpPTM2MDk7ZS5ub29uYXJhYmljPTE2MDY7ZS5ub29uZmluYWxhcmFiaWM9NjUyNTQ7ZS5ub29uZ2h1bm5hYXJhYmljPTE3MjI7ZS5ub29uZ2h1bm5hZmluYWxhcmFiaWM9NjQ0MTU7ZS5ub29uaW5pdGlhbGFyYWJpYz02NTI1NTtlLm5vb25qZWVtaW5pdGlhbGFyYWJpYz02NDcyMjtlLm5vb25qZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1ODc7ZS5ub29ubWVkaWFsYXJhYmljPTY1MjU2O2Uubm9vbm1lZW1pbml0aWFsYXJhYmljPTY0NzI1O2Uubm9vbm1lZW1pc29sYXRlZGFyYWJpYz02NDU5MDtlLm5vb25ub29uZmluYWxhcmFiaWM9NjQ2NTM7ZS5ub3Rjb250YWlucz04NzE2O2Uubm90ZWxlbWVudD04NzEzO2Uubm90ZWxlbWVudG9mPTg3MTM7ZS5ub3RlcXVhbD04ODAwO2Uubm90Z3JlYXRlcj04ODE1O2Uubm90Z3JlYXRlcm5vcmVxdWFsPTg4MTc7ZS5ub3RncmVhdGVybm9ybGVzcz04ODI1O2Uubm90aWRlbnRpY2FsPTg4MDI7ZS5ub3RsZXNzPTg4MTQ7ZS5ub3RsZXNzbm9yZXF1YWw9ODgxNjtlLm5vdHBhcmFsbGVsPTg3NDI7ZS5ub3RwcmVjZWRlcz04ODMyO2Uubm90c3Vic2V0PTg4MzY7ZS5ub3RzdWNjZWVkcz04ODMzO2Uubm90c3VwZXJzZXQ9ODgzNztlLm5vd2FybWVuaWFuPTEzOTg7ZS5ucGFyZW49OTM4NTtlLm5zc3F1YXJlPTEzMjMzO2UubnN1cGVyaW9yPTgzMTk7ZS5udGlsZGU9MjQxO2UubnU9OTU3O2UubnVoaXJhZ2FuYT0xMjM5NjtlLm51a2F0YWthbmE9MTI0OTI7ZS5udWthdGFrYW5haGFsZndpZHRoPTY1NDE1O2UubnVrdGFiZW5nYWxpPTI0OTI7ZS5udWt0YWRldmE9MjM2NDtlLm51a3RhZ3VqYXJhdGk9Mjc0ODtlLm51a3RhZ3VybXVraGk9MjYyMDtlLm51bWJlcnNpZ249MzU7ZS5udW1iZXJzaWdubW9ub3NwYWNlPTY1MjgzO2UubnVtYmVyc2lnbnNtYWxsPTY1MTE5O2UubnVtZXJhbHNpZ25ncmVlaz04ODQ7ZS5udW1lcmFsc2lnbmxvd2VyZ3JlZWs9ODg1O2UubnVtZXJvPTg0NzA7ZS5udW49MTUwNDtlLm51bmRhZ2VzaD02NDMyMDtlLm51bmRhZ2VzaGhlYnJldz02NDMyMDtlLm51bmhlYnJldz0xNTA0O2UubnZzcXVhcmU9MTMyMzc7ZS5ud3NxdWFyZT0xMzI0MztlLm55YWJlbmdhbGk9MjQ2MjtlLm55YWRldmE9MjMzNDtlLm55YWd1amFyYXRpPTI3MTg7ZS5ueWFndXJtdWtoaT0yNTkwO2Uubz0xMTE7ZS5vYWN1dGU9MjQzO2Uub2FuZ3RoYWk9MzYyOTtlLm9iYXJyZWQ9NjI5O2Uub2JhcnJlZGN5cmlsbGljPTEyNTc7ZS5vYmFycmVkZGllcmVzaXNjeXJpbGxpYz0xMjU5O2Uub2JlbmdhbGk9MjQ1MTtlLm9ib3BvbW9mbz0xMjU3MTtlLm9icmV2ZT0zMzU7ZS5vY2FuZHJhZGV2YT0yMzIxO2Uub2NhbmRyYWd1amFyYXRpPTI3MDU7ZS5vY2FuZHJhdm93ZWxzaWduZGV2YT0yMzc3O2Uub2NhbmRyYXZvd2Vsc2lnbmd1amFyYXRpPTI3NjE7ZS5vY2Fyb249NDY2O2Uub2NpcmNsZT05NDM4O2Uub2NpcmN1bWZsZXg9MjQ0O2Uub2NpcmN1bWZsZXhhY3V0ZT03ODg5O2Uub2NpcmN1bWZsZXhkb3RiZWxvdz03ODk3O2Uub2NpcmN1bWZsZXhncmF2ZT03ODkxO2Uub2NpcmN1bWZsZXhob29rYWJvdmU9Nzg5MztlLm9jaXJjdW1mbGV4dGlsZGU9Nzg5NTtlLm9jeXJpbGxpYz0xMDg2O2Uub2RibGFjdXRlPTMzNztlLm9kYmxncmF2ZT01MjU7ZS5vZGV2YT0yMzIzO2Uub2RpZXJlc2lzPTI0NjtlLm9kaWVyZXNpc2N5cmlsbGljPTEyNTU7ZS5vZG90YmVsb3c9Nzg4NTtlLm9lPTMzOTtlLm9la29yZWFuPTEyNjM0O2Uub2dvbmVrPTczMTtlLm9nb25la2NtYj04MDg7ZS5vZ3JhdmU9MjQyO2Uub2d1amFyYXRpPTI3MDc7ZS5vaGFybWVuaWFuPTE0MTM7ZS5vaGlyYWdhbmE9MTIzNjI7ZS5vaG9va2Fib3ZlPTc4ODc7ZS5vaG9ybj00MTc7ZS5vaG9ybmFjdXRlPTc4OTk7ZS5vaG9ybmRvdGJlbG93PTc5MDc7ZS5vaG9ybmdyYXZlPTc5MDE7ZS5vaG9ybmhvb2thYm92ZT03OTAzO2Uub2hvcm50aWxkZT03OTA1O2Uub2h1bmdhcnVtbGF1dD0zMzc7ZS5vaT00MTk7ZS5vaW52ZXJ0ZWRicmV2ZT01Mjc7ZS5va2F0YWthbmE9MTI0NTg7ZS5va2F0YWthbmFoYWxmd2lkdGg9NjUzOTc7ZS5va29yZWFuPTEyNjMxO2Uub2xlaGVicmV3PTE0NTE7ZS5vbWFjcm9uPTMzMztlLm9tYWNyb25hY3V0ZT03NzYzO2Uub21hY3JvbmdyYXZlPTc3NjE7ZS5vbWRldmE9MjM4NDtlLm9tZWdhPTk2OTtlLm9tZWdhMT05ODI7ZS5vbWVnYWN5cmlsbGljPTExMjE7ZS5vbWVnYWxhdGluY2xvc2VkPTYzMTtlLm9tZWdhcm91bmRjeXJpbGxpYz0xMTQ3O2Uub21lZ2F0aXRsb2N5cmlsbGljPTExNDk7ZS5vbWVnYXRvbm9zPTk3NDtlLm9tZ3VqYXJhdGk9Mjc2ODtlLm9taWNyb249OTU5O2Uub21pY3JvbnRvbm9zPTk3MjtlLm9tb25vc3BhY2U9NjUzNTk7ZS5vbmU9NDk7ZS5vbmVhcmFiaWM9MTYzMztlLm9uZWJlbmdhbGk9MjUzNTtlLm9uZWNpcmNsZT05MzEyO2Uub25lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyMjtlLm9uZWRldmE9MjQwNztlLm9uZWRvdGVubGVhZGVyPTgyMjg7ZS5vbmVlaWdodGg9ODUzOTtlLm9uZWZpdHRlZD02MzE5NjtlLm9uZWd1amFyYXRpPTI3OTE7ZS5vbmVndXJtdWtoaT0yNjYzO2Uub25laGFja2FyYWJpYz0xNjMzO2Uub25laGFsZj0xODk7ZS5vbmVoYW5nemhvdT0xMjMyMTtlLm9uZWlkZW9ncmFwaGljcGFyZW49MTI4MzI7ZS5vbmVpbmZlcmlvcj04MzIxO2Uub25lbW9ub3NwYWNlPTY1Mjk3O2Uub25lbnVtZXJhdG9yYmVuZ2FsaT0yNTQ4O2Uub25lb2xkc3R5bGU9NjMyODE7ZS5vbmVwYXJlbj05MzMyO2Uub25lcGVyaW9kPTkzNTI7ZS5vbmVwZXJzaWFuPTE3Nzc7ZS5vbmVxdWFydGVyPTE4ODtlLm9uZXJvbWFuPTg1NjA7ZS5vbmVzdXBlcmlvcj0xODU7ZS5vbmV0aGFpPTM2NjU7ZS5vbmV0aGlyZD04NTMxO2Uub29nb25laz00OTE7ZS5vb2dvbmVrbWFjcm9uPTQ5MztlLm9vZ3VybXVraGk9MjU3OTtlLm9vbWF0cmFndXJtdWtoaT0yNjM1O2Uub29wZW49NTk2O2Uub3BhcmVuPTkzODY7ZS5vcGVuYnVsbGV0PTk3MDI7ZS5vcHRpb249ODk5NztlLm9yZGZlbWluaW5lPTE3MDtlLm9yZG1hc2N1bGluZT0xODY7ZS5vcnRob2dvbmFsPTg3MzU7ZS5vc2hvcnRkZXZhPTIzMjI7ZS5vc2hvcnR2b3dlbHNpZ25kZXZhPTIzNzg7ZS5vc2xhc2g9MjQ4O2Uub3NsYXNoYWN1dGU9NTExO2Uub3NtYWxsaGlyYWdhbmE9MTIzNjE7ZS5vc21hbGxrYXRha2FuYT0xMjQ1NztlLm9zbWFsbGthdGFrYW5haGFsZndpZHRoPTY1Mzg3O2Uub3N0cm9rZWFjdXRlPTUxMTtlLm9zdXBlcmlvcj02MzIxNjtlLm90Y3lyaWxsaWM9MTE1MTtlLm90aWxkZT0yNDU7ZS5vdGlsZGVhY3V0ZT03NzU3O2Uub3RpbGRlZGllcmVzaXM9Nzc1OTtlLm91Ym9wb21vZm89MTI1Nzc7ZS5vdmVybGluZT04MjU0O2Uub3ZlcmxpbmVjZW50ZXJsaW5lPTY1MDk4O2Uub3ZlcmxpbmVjbWI9NzczO2Uub3ZlcmxpbmVkYXNoZWQ9NjUwOTc7ZS5vdmVybGluZWRibHdhdnk9NjUxMDA7ZS5vdmVybGluZXdhdnk9NjUwOTk7ZS5vdmVyc2NvcmU9MTc1O2Uub3Zvd2Vsc2lnbmJlbmdhbGk9MjUwNztlLm92b3dlbHNpZ25kZXZhPTIzNzk7ZS5vdm93ZWxzaWduZ3VqYXJhdGk9Mjc2MztlLnA9MTEyO2UucGFhbXBzc3F1YXJlPTEzMTg0O2UucGFhc2VudG9zcXVhcmU9MTMwOTk7ZS5wYWJlbmdhbGk9MjQ3NDtlLnBhY3V0ZT03NzY1O2UucGFkZXZhPTIzNDY7ZS5wYWdlZG93bj04NjcxO2UucGFnZXVwPTg2NzA7ZS5wYWd1amFyYXRpPTI3MzA7ZS5wYWd1cm11a2hpPTI2MDI7ZS5wYWhpcmFnYW5hPTEyNDAxO2UucGFpeWFubm9pdGhhaT0zNjMxO2UucGFrYXRha2FuYT0xMjQ5NztlLnBhbGF0YWxpemF0aW9uY3lyaWxsaWNjbWI9MTE1NjtlLnBhbG9jaGthY3lyaWxsaWM9MTIxNjtlLnBhbnNpb3Nrb3JlYW49MTI2NzE7ZS5wYXJhZ3JhcGg9MTgyO2UucGFyYWxsZWw9ODc0MTtlLnBhcmVubGVmdD00MDtlLnBhcmVubGVmdGFsdG9uZWFyYWJpYz02NDgzMDtlLnBhcmVubGVmdGJ0PTYzNzI1O2UucGFyZW5sZWZ0ZXg9NjM3MjQ7ZS5wYXJlbmxlZnRpbmZlcmlvcj04MzMzO2UucGFyZW5sZWZ0bW9ub3NwYWNlPTY1Mjg4O2UucGFyZW5sZWZ0c21hbGw9NjUxMTM7ZS5wYXJlbmxlZnRzdXBlcmlvcj04MzE3O2UucGFyZW5sZWZ0dHA9NjM3MjM7ZS5wYXJlbmxlZnR2ZXJ0aWNhbD02NTA3NztlLnBhcmVucmlnaHQ9NDE7ZS5wYXJlbnJpZ2h0YWx0b25lYXJhYmljPTY0ODMxO2UucGFyZW5yaWdodGJ0PTYzNzM2O2UucGFyZW5yaWdodGV4PTYzNzM1O2UucGFyZW5yaWdodGluZmVyaW9yPTgzMzQ7ZS5wYXJlbnJpZ2h0bW9ub3NwYWNlPTY1Mjg5O2UucGFyZW5yaWdodHNtYWxsPTY1MTE0O2UucGFyZW5yaWdodHN1cGVyaW9yPTgzMTg7ZS5wYXJlbnJpZ2h0dHA9NjM3MzQ7ZS5wYXJlbnJpZ2h0dmVydGljYWw9NjUwNzg7ZS5wYXJ0aWFsZGlmZj04NzA2O2UucGFzZXFoZWJyZXc9MTQ3MjtlLnBhc2h0YWhlYnJldz0xNDMzO2UucGFzcXVhcmU9MTMyMjU7ZS5wYXRhaD0xNDYzO2UucGF0YWgxMT0xNDYzO2UucGF0YWgxZD0xNDYzO2UucGF0YWgyYT0xNDYzO2UucGF0YWhoZWJyZXc9MTQ2MztlLnBhdGFobmFycm93aGVicmV3PTE0NjM7ZS5wYXRhaHF1YXJ0ZXJoZWJyZXc9MTQ2MztlLnBhdGFod2lkZWhlYnJldz0xNDYzO2UucGF6ZXJoZWJyZXc9MTQ0MTtlLnBib3BvbW9mbz0xMjU1MDtlLnBjaXJjbGU9OTQzOTtlLnBkb3RhY2NlbnQ9Nzc2NztlLnBlPTE1MDg7ZS5wZWN5cmlsbGljPTEwODc7ZS5wZWRhZ2VzaD02NDMyNDtlLnBlZGFnZXNoaGVicmV3PTY0MzI0O2UucGVlemlzcXVhcmU9MTMxMTU7ZS5wZWZpbmFsZGFnZXNoaGVicmV3PTY0MzIzO2UucGVoYXJhYmljPTE2NjI7ZS5wZWhhcm1lbmlhbj0xNDAyO2UucGVoZWJyZXc9MTUwODtlLnBlaGZpbmFsYXJhYmljPTY0MzQzO2UucGVoaW5pdGlhbGFyYWJpYz02NDM0NDtlLnBlaGlyYWdhbmE9MTI0MTA7ZS5wZWhtZWRpYWxhcmFiaWM9NjQzNDU7ZS5wZWthdGFrYW5hPTEyNTA2O2UucGVtaWRkbGVob29rY3lyaWxsaWM9MTE5MTtlLnBlcmFmZWhlYnJldz02NDMzNDtlLnBlcmNlbnQ9Mzc7ZS5wZXJjZW50YXJhYmljPTE2NDI7ZS5wZXJjZW50bW9ub3NwYWNlPTY1Mjg1O2UucGVyY2VudHNtYWxsPTY1MTMwO2UucGVyaW9kPTQ2O2UucGVyaW9kYXJtZW5pYW49MTQxNztlLnBlcmlvZGNlbnRlcmVkPTE4MztlLnBlcmlvZGhhbGZ3aWR0aD02NTM3NztlLnBlcmlvZGluZmVyaW9yPTYzMjA3O2UucGVyaW9kbW9ub3NwYWNlPTY1Mjk0O2UucGVyaW9kc21hbGw9NjUxMDY7ZS5wZXJpb2RzdXBlcmlvcj02MzIwODtlLnBlcmlzcG9tZW5pZ3JlZWtjbWI9ODM0O2UucGVycGVuZGljdWxhcj04ODY5O2UucGVydGhvdXNhbmQ9ODI0MDtlLnBlc2V0YT04MzU5O2UucGZzcXVhcmU9MTMxOTQ7ZS5waGFiZW5nYWxpPTI0NzU7ZS5waGFkZXZhPTIzNDc7ZS5waGFndWphcmF0aT0yNzMxO2UucGhhZ3VybXVraGk9MjYwMztlLnBoaT05NjY7ZS5waGkxPTk4MTtlLnBoaWV1cGhhY2lyY2xla29yZWFuPTEyOTIyO2UucGhpZXVwaGFwYXJlbmtvcmVhbj0xMjgyNjtlLnBoaWV1cGhjaXJjbGVrb3JlYW49MTI5MDg7ZS5waGlldXBoa29yZWFuPTEyNjIxO2UucGhpZXVwaHBhcmVua29yZWFuPTEyODEyO2UucGhpbGF0aW49NjMyO2UucGhpbnRodXRoYWk9MzY0MjtlLnBoaXN5bWJvbGdyZWVrPTk4MTtlLnBob29rPTQyMTtlLnBob3BoYW50aGFpPTM2MTQ7ZS5waG9waHVuZ3RoYWk9MzYxMjtlLnBob3NhbXBoYW90aGFpPTM2MTY7ZS5waT05NjA7ZS5waWV1cGFjaXJjbGVrb3JlYW49MTI5MTU7ZS5waWV1cGFwYXJlbmtvcmVhbj0xMjgxOTtlLnBpZXVwY2lldWNrb3JlYW49MTI2NjI7ZS5waWV1cGNpcmNsZWtvcmVhbj0xMjkwMTtlLnBpZXVwa2l5ZW9ra29yZWFuPTEyNjU4O2UucGlldXBrb3JlYW49MTI2MTA7ZS5waWV1cHBhcmVua29yZWFuPTEyODA1O2UucGlldXBzaW9za2l5ZW9ra29yZWFuPTEyNjYwO2UucGlldXBzaW9za29yZWFuPTEyNjEyO2UucGlldXBzaW9zdGlrZXV0a29yZWFuPTEyNjYxO2UucGlldXB0aGlldXRoa29yZWFuPTEyNjYzO2UucGlldXB0aWtldXRrb3JlYW49MTI2NTk7ZS5waWhpcmFnYW5hPTEyNDA0O2UucGlrYXRha2FuYT0xMjUwMDtlLnBpc3ltYm9sZ3JlZWs9OTgyO2UucGl3cmFybWVuaWFuPTE0MTE7ZS5wbGFuY2tvdmVyMnBpPTg0NjM7ZS5wbGFuY2tvdmVyMnBpMT04NDYzO2UucGx1cz00MztlLnBsdXNiZWxvd2NtYj03OTk7ZS5wbHVzY2lyY2xlPTg4NTM7ZS5wbHVzbWludXM9MTc3O2UucGx1c21vZD03MjY7ZS5wbHVzbW9ub3NwYWNlPTY1MjkxO2UucGx1c3NtYWxsPTY1MTIyO2UucGx1c3N1cGVyaW9yPTgzMTQ7ZS5wbW9ub3NwYWNlPTY1MzYwO2UucG1zcXVhcmU9MTMyNzI7ZS5wb2hpcmFnYW5hPTEyNDEzO2UucG9pbnRpbmdpbmRleGRvd253aGl0ZT05NzU5O2UucG9pbnRpbmdpbmRleGxlZnR3aGl0ZT05NzU2O2UucG9pbnRpbmdpbmRleHJpZ2h0d2hpdGU9OTc1ODtlLnBvaW50aW5naW5kZXh1cHdoaXRlPTk3NTc7ZS5wb2thdGFrYW5hPTEyNTA5O2UucG9wbGF0aGFpPTM2MTE7ZS5wb3N0YWxtYXJrPTEyMzA2O2UucG9zdGFsbWFya2ZhY2U9MTIzMjA7ZS5wcGFyZW49OTM4NztlLnByZWNlZGVzPTg4MjY7ZS5wcmVzY3JpcHRpb249ODQ3ODtlLnByaW1lbW9kPTY5NztlLnByaW1lcmV2ZXJzZWQ9ODI0NTtlLnByb2R1Y3Q9ODcxOTtlLnByb2plY3RpdmU9ODk2NTtlLnByb2xvbmdlZGthbmE9MTI1NDA7ZS5wcm9wZWxsb3I9ODk4NDtlLnByb3BlcnN1YnNldD04ODM0O2UucHJvcGVyc3VwZXJzZXQ9ODgzNTtlLnByb3BvcnRpb249ODc1OTtlLnByb3BvcnRpb25hbD04NzMzO2UucHNpPTk2ODtlLnBzaWN5cmlsbGljPTExMzc7ZS5wc2lsaXBuZXVtYXRhY3lyaWxsaWNjbWI9MTE1ODtlLnBzc3F1YXJlPTEzMjMyO2UucHVoaXJhZ2FuYT0xMjQwNztlLnB1a2F0YWthbmE9MTI1MDM7ZS5wdnNxdWFyZT0xMzIzNjtlLnB3c3F1YXJlPTEzMjQyO2UucT0xMTM7ZS5xYWRldmE9MjM5MjtlLnFhZG1haGVicmV3PTE0NDg7ZS5xYWZhcmFiaWM9MTYwMjtlLnFhZmZpbmFsYXJhYmljPTY1MjM4O2UucWFmaW5pdGlhbGFyYWJpYz02NTIzOTtlLnFhZm1lZGlhbGFyYWJpYz02NTI0MDtlLnFhbWF0cz0xNDY0O2UucWFtYXRzMTA9MTQ2NDtlLnFhbWF0czFhPTE0NjQ7ZS5xYW1hdHMxYz0xNDY0O2UucWFtYXRzMjc9MTQ2NDtlLnFhbWF0czI5PTE0NjQ7ZS5xYW1hdHMzMz0xNDY0O2UucWFtYXRzZGU9MTQ2NDtlLnFhbWF0c2hlYnJldz0xNDY0O2UucWFtYXRzbmFycm93aGVicmV3PTE0NjQ7ZS5xYW1hdHNxYXRhbmhlYnJldz0xNDY0O2UucWFtYXRzcWF0YW5uYXJyb3doZWJyZXc9MTQ2NDtlLnFhbWF0c3FhdGFucXVhcnRlcmhlYnJldz0xNDY0O2UucWFtYXRzcWF0YW53aWRlaGVicmV3PTE0NjQ7ZS5xYW1hdHNxdWFydGVyaGVicmV3PTE0NjQ7ZS5xYW1hdHN3aWRlaGVicmV3PTE0NjQ7ZS5xYXJuZXlwYXJhaGVicmV3PTE0Mzk7ZS5xYm9wb21vZm89MTI1NjE7ZS5xY2lyY2xlPTk0NDA7ZS5xaG9vaz02NzI7ZS5xbW9ub3NwYWNlPTY1MzYxO2UucW9mPTE1MTE7ZS5xb2ZkYWdlc2g9NjQzMjc7ZS5xb2ZkYWdlc2hoZWJyZXc9NjQzMjc7ZS5xb2ZoZWJyZXc9MTUxMTtlLnFwYXJlbj05Mzg4O2UucXVhcnRlcm5vdGU9OTgzMztlLnF1YnV0cz0xNDY3O2UucXVidXRzMTg9MTQ2NztlLnF1YnV0czI1PTE0Njc7ZS5xdWJ1dHMzMT0xNDY3O2UucXVidXRzaGVicmV3PTE0Njc7ZS5xdWJ1dHNuYXJyb3doZWJyZXc9MTQ2NztlLnF1YnV0c3F1YXJ0ZXJoZWJyZXc9MTQ2NztlLnF1YnV0c3dpZGVoZWJyZXc9MTQ2NztlLnF1ZXN0aW9uPTYzO2UucXVlc3Rpb25hcmFiaWM9MTU2NztlLnF1ZXN0aW9uYXJtZW5pYW49MTM3NDtlLnF1ZXN0aW9uZG93bj0xOTE7ZS5xdWVzdGlvbmRvd25zbWFsbD02MzQyMztlLnF1ZXN0aW9uZ3JlZWs9ODk0O2UucXVlc3Rpb25tb25vc3BhY2U9NjUzMTE7ZS5xdWVzdGlvbnNtYWxsPTYzMjk1O2UucXVvdGVkYmw9MzQ7ZS5xdW90ZWRibGJhc2U9ODIyMjtlLnF1b3RlZGJsbGVmdD04MjIwO2UucXVvdGVkYmxtb25vc3BhY2U9NjUyODI7ZS5xdW90ZWRibHByaW1lPTEyMzE4O2UucXVvdGVkYmxwcmltZXJldmVyc2VkPTEyMzE3O2UucXVvdGVkYmxyaWdodD04MjIxO2UucXVvdGVsZWZ0PTgyMTY7ZS5xdW90ZWxlZnRyZXZlcnNlZD04MjE5O2UucXVvdGVyZXZlcnNlZD04MjE5O2UucXVvdGVyaWdodD04MjE3O2UucXVvdGVyaWdodG49MzI5O2UucXVvdGVzaW5nbGJhc2U9ODIxODtlLnF1b3Rlc2luZ2xlPTM5O2UucXVvdGVzaW5nbGVtb25vc3BhY2U9NjUyODc7ZS5yPTExNDtlLnJhYXJtZW5pYW49MTQwNDtlLnJhYmVuZ2FsaT0yNDgwO2UucmFjdXRlPTM0MTtlLnJhZGV2YT0yMzUyO2UucmFkaWNhbD04NzMwO2UucmFkaWNhbGV4PTYzNzE3O2UucmFkb3ZlcnNzcXVhcmU9MTMyMzA7ZS5yYWRvdmVyc3NxdWFyZWRzcXVhcmU9MTMyMzE7ZS5yYWRzcXVhcmU9MTMyMjk7ZS5yYWZlPTE0NzE7ZS5yYWZlaGVicmV3PTE0NzE7ZS5yYWd1amFyYXRpPTI3MzY7ZS5yYWd1cm11a2hpPTI2MDg7ZS5yYWhpcmFnYW5hPTEyNDI1O2UucmFrYXRha2FuYT0xMjUyMTtlLnJha2F0YWthbmFoYWxmd2lkdGg9NjU0MzE7ZS5yYWxvd2VyZGlhZ29uYWxiZW5nYWxpPTI1NDU7ZS5yYW1pZGRsZWRpYWdvbmFsYmVuZ2FsaT0yNTQ0O2UucmFtc2hvcm49NjEyO2UucmF0aW89ODc1ODtlLnJib3BvbW9mbz0xMjU2NjtlLnJjYXJvbj0zNDU7ZS5yY2VkaWxsYT0zNDM7ZS5yY2lyY2xlPTk0NDE7ZS5yY29tbWFhY2NlbnQ9MzQzO2UucmRibGdyYXZlPTUyOTtlLnJkb3RhY2NlbnQ9Nzc2OTtlLnJkb3RiZWxvdz03NzcxO2UucmRvdGJlbG93bWFjcm9uPTc3NzM7ZS5yZWZlcmVuY2VtYXJrPTgyNTE7ZS5yZWZsZXhzdWJzZXQ9ODgzODtlLnJlZmxleHN1cGVyc2V0PTg4Mzk7ZS5yZWdpc3RlcmVkPTE3NDtlLnJlZ2lzdGVyc2Fucz02MzcyMDtlLnJlZ2lzdGVyc2VyaWY9NjMxOTQ7ZS5yZWhhcmFiaWM9MTU4NTtlLnJlaGFybWVuaWFuPTE0MDg7ZS5yZWhmaW5hbGFyYWJpYz02NTE5ODtlLnJlaGlyYWdhbmE9MTI0Mjg7ZS5yZWthdGFrYW5hPTEyNTI0O2UucmVrYXRha2FuYWhhbGZ3aWR0aD02NTQzNDtlLnJlc2g9MTUxMjtlLnJlc2hkYWdlc2hoZWJyZXc9NjQzMjg7ZS5yZXNoaGVicmV3PTE1MTI7ZS5yZXZlcnNlZHRpbGRlPTg3NjU7ZS5yZXZpYWhlYnJldz0xNDMxO2UucmV2aWFtdWdyYXNoaGVicmV3PTE0MzE7ZS5yZXZsb2dpY2Fsbm90PTg5NzY7ZS5yZmlzaGhvb2s9NjM4O2UucmZpc2hob29rcmV2ZXJzZWQ9NjM5O2UucmhhYmVuZ2FsaT0yNTI1O2UucmhhZGV2YT0yMzk3O2UucmhvPTk2MTtlLnJob29rPTYzNztlLnJob29rdHVybmVkPTYzNTtlLnJob29rdHVybmVkc3VwZXJpb3I9NjkzO2Uucmhvc3ltYm9sZ3JlZWs9MTAwOTtlLnJob3RpY2hvb2ttb2Q9NzM0O2UucmlldWxhY2lyY2xla29yZWFuPTEyOTEzO2UucmlldWxhcGFyZW5rb3JlYW49MTI4MTc7ZS5yaWV1bGNpcmNsZWtvcmVhbj0xMjg5OTtlLnJpZXVsaGlldWhrb3JlYW49MTI2MDg7ZS5yaWV1bGtpeWVva2tvcmVhbj0xMjYwMjtlLnJpZXVsa2l5ZW9rc2lvc2tvcmVhbj0xMjY0OTtlLnJpZXVsa29yZWFuPTEyNjAxO2UucmlldWxtaWV1bWtvcmVhbj0xMjYwMztlLnJpZXVscGFuc2lvc2tvcmVhbj0xMjY1MjtlLnJpZXVscGFyZW5rb3JlYW49MTI4MDM7ZS5yaWV1bHBoaWV1cGhrb3JlYW49MTI2MDc7ZS5yaWV1bHBpZXVwa29yZWFuPTEyNjA0O2UucmlldWxwaWV1cHNpb3Nrb3JlYW49MTI2NTE7ZS5yaWV1bHNpb3Nrb3JlYW49MTI2MDU7ZS5yaWV1bHRoaWV1dGhrb3JlYW49MTI2MDY7ZS5yaWV1bHRpa2V1dGtvcmVhbj0xMjY1MDtlLnJpZXVseWVvcmluaGlldWhrb3JlYW49MTI2NTM7ZS5yaWdodGFuZ2xlPTg3MzU7ZS5yaWdodHRhY2tiZWxvd2NtYj03OTM7ZS5yaWdodHRyaWFuZ2xlPTg4OTU7ZS5yaWhpcmFnYW5hPTEyNDI2O2UucmlrYXRha2FuYT0xMjUyMjtlLnJpa2F0YWthbmFoYWxmd2lkdGg9NjU0MzI7ZS5yaW5nPTczMDtlLnJpbmdiZWxvd2NtYj04MDU7ZS5yaW5nY21iPTc3ODtlLnJpbmdoYWxmbGVmdD03MDM7ZS5yaW5naGFsZmxlZnRhcm1lbmlhbj0xMzY5O2UucmluZ2hhbGZsZWZ0YmVsb3djbWI9Nzk2O2UucmluZ2hhbGZsZWZ0Y2VudGVyZWQ9NzIzO2UucmluZ2hhbGZyaWdodD03MDI7ZS5yaW5naGFsZnJpZ2h0YmVsb3djbWI9ODI1O2UucmluZ2hhbGZyaWdodGNlbnRlcmVkPTcyMjtlLnJpbnZlcnRlZGJyZXZlPTUzMTtlLnJpdHRvcnVzcXVhcmU9MTMxMzc7ZS5ybGluZWJlbG93PTc3NzU7ZS5ybG9uZ2xlZz02MzY7ZS5ybG9uZ2xlZ3R1cm5lZD02MzQ7ZS5ybW9ub3NwYWNlPTY1MzYyO2Uucm9oaXJhZ2FuYT0xMjQyOTtlLnJva2F0YWthbmE9MTI1MjU7ZS5yb2thdGFrYW5haGFsZndpZHRoPTY1NDM1O2Uucm9ydWF0aGFpPTM2MTk7ZS5ycGFyZW49OTM4OTtlLnJyYWJlbmdhbGk9MjUyNDtlLnJyYWRldmE9MjM1MztlLnJyYWd1cm11a2hpPTI2NTI7ZS5ycmVoYXJhYmljPTE2ODE7ZS5ycmVoZmluYWxhcmFiaWM9NjQzOTc7ZS5ycnZvY2FsaWNiZW5nYWxpPTI1Mjg7ZS5ycnZvY2FsaWNkZXZhPTI0MDA7ZS5ycnZvY2FsaWNndWphcmF0aT0yNzg0O2UucnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNTAwO2UucnJ2b2NhbGljdm93ZWxzaWduZGV2YT0yMzcyO2UucnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGk9Mjc1NjtlLnJzdXBlcmlvcj02MzIxNztlLnJ0YmxvY2s9OTYxNjtlLnJ0dXJuZWQ9NjMzO2UucnR1cm5lZHN1cGVyaW9yPTY5MjtlLnJ1aGlyYWdhbmE9MTI0Mjc7ZS5ydWthdGFrYW5hPTEyNTIzO2UucnVrYXRha2FuYWhhbGZ3aWR0aD02NTQzMztlLnJ1cGVlbWFya2JlbmdhbGk9MjU0NjtlLnJ1cGVlc2lnbmJlbmdhbGk9MjU0NztlLnJ1cGlhaD02MzE5NztlLnJ1dGhhaT0zNjIwO2UucnZvY2FsaWNiZW5nYWxpPTI0NDM7ZS5ydm9jYWxpY2RldmE9MjMxNTtlLnJ2b2NhbGljZ3VqYXJhdGk9MjY5OTtlLnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNDk5O2UucnZvY2FsaWN2b3dlbHNpZ25kZXZhPTIzNzE7ZS5ydm9jYWxpY3Zvd2Vsc2lnbmd1amFyYXRpPTI3NTU7ZS5zPTExNTtlLnNhYmVuZ2FsaT0yNDg4O2Uuc2FjdXRlPTM0NztlLnNhY3V0ZWRvdGFjY2VudD03NzgxO2Uuc2FkYXJhYmljPTE1ODk7ZS5zYWRldmE9MjM2MDtlLnNhZGZpbmFsYXJhYmljPTY1MjEwO2Uuc2FkaW5pdGlhbGFyYWJpYz02NTIxMTtlLnNhZG1lZGlhbGFyYWJpYz02NTIxMjtlLnNhZ3VqYXJhdGk9Mjc0NDtlLnNhZ3VybXVraGk9MjYxNjtlLnNhaGlyYWdhbmE9MTIzNzM7ZS5zYWthdGFrYW5hPTEyNDY5O2Uuc2FrYXRha2FuYWhhbGZ3aWR0aD02NTQwMztlLnNhbGxhbGxhaG91YWxheWhld2FzYWxsYW1hcmFiaWM9NjUwMTg7ZS5zYW1la2g9MTUwNTtlLnNhbWVraGRhZ2VzaD02NDMyMTtlLnNhbWVraGRhZ2VzaGhlYnJldz02NDMyMTtlLnNhbWVraGhlYnJldz0xNTA1O2Uuc2FyYWFhdGhhaT0zNjM0O2Uuc2FyYWFldGhhaT0zNjQ5O2Uuc2FyYWFpbWFpbWFsYWl0aGFpPTM2NTI7ZS5zYXJhYWltYWltdWFudGhhaT0zNjUxO2Uuc2FyYWFtdGhhaT0zNjM1O2Uuc2FyYWF0aGFpPTM2MzI7ZS5zYXJhZXRoYWk9MzY0ODtlLnNhcmFpaWxlZnR0aGFpPTYzNjIyO2Uuc2FyYWlpdGhhaT0zNjM3O2Uuc2FyYWlsZWZ0dGhhaT02MzYyMTtlLnNhcmFpdGhhaT0zNjM2O2Uuc2FyYW90aGFpPTM2NTA7ZS5zYXJhdWVlbGVmdHRoYWk9NjM2MjQ7ZS5zYXJhdWVldGhhaT0zNjM5O2Uuc2FyYXVlbGVmdHRoYWk9NjM2MjM7ZS5zYXJhdWV0aGFpPTM2Mzg7ZS5zYXJhdXRoYWk9MzY0MDtlLnNhcmF1dXRoYWk9MzY0MTtlLnNib3BvbW9mbz0xMjU2OTtlLnNjYXJvbj0zNTM7ZS5zY2Fyb25kb3RhY2NlbnQ9Nzc4MztlLnNjZWRpbGxhPTM1MTtlLnNjaHdhPTYwMTtlLnNjaHdhY3lyaWxsaWM9MTI0MTtlLnNjaHdhZGllcmVzaXNjeXJpbGxpYz0xMjQzO2Uuc2Nod2Fob29rPTYwMjtlLnNjaXJjbGU9OTQ0MjtlLnNjaXJjdW1mbGV4PTM0OTtlLnNjb21tYWFjY2VudD01Mzc7ZS5zZG90YWNjZW50PTc3Nzc7ZS5zZG90YmVsb3c9Nzc3OTtlLnNkb3RiZWxvd2RvdGFjY2VudD03Nzg1O2Uuc2VhZ3VsbGJlbG93Y21iPTgyODtlLnNlY29uZD04MjQzO2Uuc2Vjb25kdG9uZWNoaW5lc2U9NzE0O2Uuc2VjdGlvbj0xNjc7ZS5zZWVuYXJhYmljPTE1ODc7ZS5zZWVuZmluYWxhcmFiaWM9NjUyMDI7ZS5zZWVuaW5pdGlhbGFyYWJpYz02NTIwMztlLnNlZW5tZWRpYWxhcmFiaWM9NjUyMDQ7ZS5zZWdvbD0xNDYyO2Uuc2Vnb2wxMz0xNDYyO2Uuc2Vnb2wxZj0xNDYyO2Uuc2Vnb2wyYz0xNDYyO2Uuc2Vnb2xoZWJyZXc9MTQ2MjtlLnNlZ29sbmFycm93aGVicmV3PTE0NjI7ZS5zZWdvbHF1YXJ0ZXJoZWJyZXc9MTQ2MjtlLnNlZ29sdGFoZWJyZXc9MTQyNjtlLnNlZ29sd2lkZWhlYnJldz0xNDYyO2Uuc2VoYXJtZW5pYW49MTQwNTtlLnNlaGlyYWdhbmE9MTIzNzk7ZS5zZWthdGFrYW5hPTEyNDc1O2Uuc2VrYXRha2FuYWhhbGZ3aWR0aD02NTQwNjtlLnNlbWljb2xvbj01OTtlLnNlbWljb2xvbmFyYWJpYz0xNTYzO2Uuc2VtaWNvbG9ubW9ub3NwYWNlPTY1MzA3O2Uuc2VtaWNvbG9uc21hbGw9NjUxMDg7ZS5zZW1pdm9pY2VkbWFya2thbmE9MTI0NDQ7ZS5zZW1pdm9pY2VkbWFya2thbmFoYWxmd2lkdGg9NjU0Mzk7ZS5zZW50aXNxdWFyZT0xMzA5MDtlLnNlbnRvc3F1YXJlPTEzMDkxO2Uuc2V2ZW49NTU7ZS5zZXZlbmFyYWJpYz0xNjM5O2Uuc2V2ZW5iZW5nYWxpPTI1NDE7ZS5zZXZlbmNpcmNsZT05MzE4O2Uuc2V2ZW5jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTI4O2Uuc2V2ZW5kZXZhPTI0MTM7ZS5zZXZlbmVpZ2h0aHM9ODU0MjtlLnNldmVuZ3VqYXJhdGk9Mjc5NztlLnNldmVuZ3VybXVraGk9MjY2OTtlLnNldmVuaGFja2FyYWJpYz0xNjM5O2Uuc2V2ZW5oYW5nemhvdT0xMjMyNztlLnNldmVuaWRlb2dyYXBoaWNwYXJlbj0xMjgzODtlLnNldmVuaW5mZXJpb3I9ODMyNztlLnNldmVubW9ub3NwYWNlPTY1MzAzO2Uuc2V2ZW5vbGRzdHlsZT02MzI4NztlLnNldmVucGFyZW49OTMzODtlLnNldmVucGVyaW9kPTkzNTg7ZS5zZXZlbnBlcnNpYW49MTc4MztlLnNldmVucm9tYW49ODU2NjtlLnNldmVuc3VwZXJpb3I9ODMxMTtlLnNldmVudGVlbmNpcmNsZT05MzI4O2Uuc2V2ZW50ZWVucGFyZW49OTM0ODtlLnNldmVudGVlbnBlcmlvZD05MzY4O2Uuc2V2ZW50aGFpPTM2NzE7ZS5zZnRoeXBoZW49MTczO2Uuc2hhYXJtZW5pYW49MTM5OTtlLnNoYWJlbmdhbGk9MjQ4NjtlLnNoYWN5cmlsbGljPTEwOTY7ZS5zaGFkZGFhcmFiaWM9MTYxNztlLnNoYWRkYWRhbW1hYXJhYmljPTY0NjA5O2Uuc2hhZGRhZGFtbWF0YW5hcmFiaWM9NjQ2MDY7ZS5zaGFkZGFmYXRoYWFyYWJpYz02NDYwODtlLnNoYWRkYWthc3JhYXJhYmljPTY0NjEwO2Uuc2hhZGRha2FzcmF0YW5hcmFiaWM9NjQ2MDc7ZS5zaGFkZT05NjE4O2Uuc2hhZGVkYXJrPTk2MTk7ZS5zaGFkZWxpZ2h0PTk2MTc7ZS5zaGFkZW1lZGl1bT05NjE4O2Uuc2hhZGV2YT0yMzU4O2Uuc2hhZ3VqYXJhdGk9Mjc0MjtlLnNoYWd1cm11a2hpPTI2MTQ7ZS5zaGFsc2hlbGV0aGVicmV3PTE0Mjc7ZS5zaGJvcG9tb2ZvPTEyNTY1O2Uuc2hjaGFjeXJpbGxpYz0xMDk3O2Uuc2hlZW5hcmFiaWM9MTU4ODtlLnNoZWVuZmluYWxhcmFiaWM9NjUyMDY7ZS5zaGVlbmluaXRpYWxhcmFiaWM9NjUyMDc7ZS5zaGVlbm1lZGlhbGFyYWJpYz02NTIwODtlLnNoZWljb3B0aWM9OTk1O2Uuc2hlcWVsPTgzNjI7ZS5zaGVxZWxoZWJyZXc9ODM2MjtlLnNoZXZhPTE0NTY7ZS5zaGV2YTExNT0xNDU2O2Uuc2hldmExNT0xNDU2O2Uuc2hldmEyMj0xNDU2O2Uuc2hldmEyZT0xNDU2O2Uuc2hldmFoZWJyZXc9MTQ1NjtlLnNoZXZhbmFycm93aGVicmV3PTE0NTY7ZS5zaGV2YXF1YXJ0ZXJoZWJyZXc9MTQ1NjtlLnNoZXZhd2lkZWhlYnJldz0xNDU2O2Uuc2hoYWN5cmlsbGljPTEyMTE7ZS5zaGltYWNvcHRpYz0xMDA1O2Uuc2hpbj0xNTEzO2Uuc2hpbmRhZ2VzaD02NDMyOTtlLnNoaW5kYWdlc2hoZWJyZXc9NjQzMjk7ZS5zaGluZGFnZXNoc2hpbmRvdD02NDMwMDtlLnNoaW5kYWdlc2hzaGluZG90aGVicmV3PTY0MzAwO2Uuc2hpbmRhZ2VzaHNpbmRvdD02NDMwMTtlLnNoaW5kYWdlc2hzaW5kb3RoZWJyZXc9NjQzMDE7ZS5zaGluZG90aGVicmV3PTE0NzM7ZS5zaGluaGVicmV3PTE1MTM7ZS5zaGluc2hpbmRvdD02NDI5ODtlLnNoaW5zaGluZG90aGVicmV3PTY0Mjk4O2Uuc2hpbnNpbmRvdD02NDI5OTtlLnNoaW5zaW5kb3RoZWJyZXc9NjQyOTk7ZS5zaG9vaz02NDI7ZS5zaWdtYT05NjM7ZS5zaWdtYTE9OTYyO2Uuc2lnbWFmaW5hbD05NjI7ZS5zaWdtYWx1bmF0ZXN5bWJvbGdyZWVrPTEwMTA7ZS5zaWhpcmFnYW5hPTEyMzc1O2Uuc2lrYXRha2FuYT0xMjQ3MTtlLnNpa2F0YWthbmFoYWxmd2lkdGg9NjU0MDQ7ZS5zaWx1cWhlYnJldz0xNDY5O2Uuc2lsdXFsZWZ0aGVicmV3PTE0Njk7ZS5zaW1pbGFyPTg3NjQ7ZS5zaW5kb3RoZWJyZXc9MTQ3NDtlLnNpb3NhY2lyY2xla29yZWFuPTEyOTE2O2Uuc2lvc2FwYXJlbmtvcmVhbj0xMjgyMDtlLnNpb3NjaWV1Y2tvcmVhbj0xMjY3MDtlLnNpb3NjaXJjbGVrb3JlYW49MTI5MDI7ZS5zaW9za2l5ZW9ra29yZWFuPTEyNjY2O2Uuc2lvc2tvcmVhbj0xMjYxMztlLnNpb3NuaWV1bmtvcmVhbj0xMjY2NztlLnNpb3NwYXJlbmtvcmVhbj0xMjgwNjtlLnNpb3NwaWV1cGtvcmVhbj0xMjY2OTtlLnNpb3N0aWtldXRrb3JlYW49MTI2Njg7ZS5zaXg9NTQ7ZS5zaXhhcmFiaWM9MTYzODtlLnNpeGJlbmdhbGk9MjU0MDtlLnNpeGNpcmNsZT05MzE3O2Uuc2l4Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNztlLnNpeGRldmE9MjQxMjtlLnNpeGd1amFyYXRpPTI3OTY7ZS5zaXhndXJtdWtoaT0yNjY4O2Uuc2l4aGFja2FyYWJpYz0xNjM4O2Uuc2l4aGFuZ3pob3U9MTIzMjY7ZS5zaXhpZGVvZ3JhcGhpY3BhcmVuPTEyODM3O2Uuc2l4aW5mZXJpb3I9ODMyNjtlLnNpeG1vbm9zcGFjZT02NTMwMjtlLnNpeG9sZHN0eWxlPTYzMjg2O2Uuc2l4cGFyZW49OTMzNztlLnNpeHBlcmlvZD05MzU3O2Uuc2l4cGVyc2lhbj0xNzgyO2Uuc2l4cm9tYW49ODU2NTtlLnNpeHN1cGVyaW9yPTgzMTA7ZS5zaXh0ZWVuY2lyY2xlPTkzMjc7ZS5zaXh0ZWVuY3VycmVuY3lkZW5vbWluYXRvcmJlbmdhbGk9MjU1MztlLnNpeHRlZW5wYXJlbj05MzQ3O2Uuc2l4dGVlbnBlcmlvZD05MzY3O2Uuc2l4dGhhaT0zNjcwO2Uuc2xhc2g9NDc7ZS5zbGFzaG1vbm9zcGFjZT02NTI5NTtlLnNsb25nPTM4MztlLnNsb25nZG90YWNjZW50PTc4MzU7ZS5zbWlsZWZhY2U9OTc4NjtlLnNtb25vc3BhY2U9NjUzNjM7ZS5zb2ZwYXN1cWhlYnJldz0xNDc1O2Uuc29mdGh5cGhlbj0xNzM7ZS5zb2Z0c2lnbmN5cmlsbGljPTExMDA7ZS5zb2hpcmFnYW5hPTEyMzgxO2Uuc29rYXRha2FuYT0xMjQ3NztlLnNva2F0YWthbmFoYWxmd2lkdGg9NjU0MDc7ZS5zb2xpZHVzbG9uZ292ZXJsYXljbWI9ODI0O2Uuc29saWR1c3Nob3J0b3ZlcmxheWNtYj04MjM7ZS5zb3J1c2l0aGFpPTM2MjU7ZS5zb3NhbGF0aGFpPTM2MjQ7ZS5zb3NvdGhhaT0zNTk1O2Uuc29zdWF0aGFpPTM2MjY7ZS5zcGFjZT0zMjtlLnNwYWNlaGFja2FyYWJpYz0zMjtlLnNwYWRlPTk4MjQ7ZS5zcGFkZXN1aXRibGFjaz05ODI0O2Uuc3BhZGVzdWl0d2hpdGU9OTgyODtlLnNwYXJlbj05MzkwO2Uuc3F1YXJlYmVsb3djbWI9ODI3O2Uuc3F1YXJlY2M9MTMyNTI7ZS5zcXVhcmVjbT0xMzIxMztlLnNxdWFyZWRpYWdvbmFsY3Jvc3NoYXRjaGZpbGw9OTY0MTtlLnNxdWFyZWhvcml6b250YWxmaWxsPTk2MzY7ZS5zcXVhcmVrZz0xMzE5OTtlLnNxdWFyZWttPTEzMjE0O2Uuc3F1YXJla21jYXBpdGFsPTEzMjYyO2Uuc3F1YXJlbG49MTMyNjU7ZS5zcXVhcmVsb2c9MTMyNjY7ZS5zcXVhcmVtZz0xMzE5ODtlLnNxdWFyZW1pbD0xMzI2OTtlLnNxdWFyZW1tPTEzMjEyO2Uuc3F1YXJlbXNxdWFyZWQ9MTMyMTc7ZS5zcXVhcmVvcnRob2dvbmFsY3Jvc3NoYXRjaGZpbGw9OTYzODtlLnNxdWFyZXVwcGVybGVmdHRvbG93ZXJyaWdodGZpbGw9OTYzOTtlLnNxdWFyZXVwcGVycmlnaHR0b2xvd2VybGVmdGZpbGw9OTY0MDtlLnNxdWFyZXZlcnRpY2FsZmlsbD05NjM3O2Uuc3F1YXJld2hpdGV3aXRoc21hbGxibGFjaz05NjM1O2Uuc3JzcXVhcmU9MTMyNzU7ZS5zc2FiZW5nYWxpPTI0ODc7ZS5zc2FkZXZhPTIzNTk7ZS5zc2FndWphcmF0aT0yNzQzO2Uuc3NhbmdjaWV1Y2tvcmVhbj0xMjYxNztlLnNzYW5naGlldWhrb3JlYW49MTI2Nzc7ZS5zc2FuZ2lldW5na29yZWFuPTEyNjcyO2Uuc3NhbmdraXllb2trb3JlYW49MTI1OTQ7ZS5zc2FuZ25pZXVua29yZWFuPTEyNjQ1O2Uuc3NhbmdwaWV1cGtvcmVhbj0xMjYxMTtlLnNzYW5nc2lvc2tvcmVhbj0xMjYxNDtlLnNzYW5ndGlrZXV0a29yZWFuPTEyNjAwO2Uuc3N1cGVyaW9yPTYzMjE4O2Uuc3Rlcmxpbmc9MTYzO2Uuc3Rlcmxpbmdtb25vc3BhY2U9NjU1MDU7ZS5zdHJva2Vsb25nb3ZlcmxheWNtYj04MjI7ZS5zdHJva2VzaG9ydG92ZXJsYXljbWI9ODIxO2Uuc3Vic2V0PTg4MzQ7ZS5zdWJzZXRub3RlcXVhbD04ODQyO2Uuc3Vic2V0b3JlcXVhbD04ODM4O2Uuc3VjY2VlZHM9ODgyNztlLnN1Y2h0aGF0PTg3MTU7ZS5zdWhpcmFnYW5hPTEyMzc3O2Uuc3VrYXRha2FuYT0xMjQ3MztlLnN1a2F0YWthbmFoYWxmd2lkdGg9NjU0MDU7ZS5zdWt1bmFyYWJpYz0xNjE4O2Uuc3VtbWF0aW9uPTg3MjE7ZS5zdW49OTc4ODtlLnN1cGVyc2V0PTg4MzU7ZS5zdXBlcnNldG5vdGVxdWFsPTg4NDM7ZS5zdXBlcnNldG9yZXF1YWw9ODgzOTtlLnN2c3F1YXJlPTEzMjc2O2Uuc3lvdXdhZXJhc3F1YXJlPTEzMTgwO2UudD0xMTY7ZS50YWJlbmdhbGk9MjQ2ODtlLnRhY2tkb3duPTg4Njg7ZS50YWNrbGVmdD04ODY3O2UudGFkZXZhPTIzNDA7ZS50YWd1amFyYXRpPTI3MjQ7ZS50YWd1cm11a2hpPTI1OTY7ZS50YWhhcmFiaWM9MTU5MTtlLnRhaGZpbmFsYXJhYmljPTY1MjE4O2UudGFoaW5pdGlhbGFyYWJpYz02NTIxOTtlLnRhaGlyYWdhbmE9MTIzODM7ZS50YWhtZWRpYWxhcmFiaWM9NjUyMjA7ZS50YWlzeW91ZXJhc3F1YXJlPTEzMTgxO2UudGFrYXRha2FuYT0xMjQ3OTtlLnRha2F0YWthbmFoYWxmd2lkdGg9NjU0MDg7ZS50YXR3ZWVsYXJhYmljPTE2MDA7ZS50YXU9OTY0O2UudGF2PTE1MTQ7ZS50YXZkYWdlcz02NDMzMDtlLnRhdmRhZ2VzaD02NDMzMDtlLnRhdmRhZ2VzaGhlYnJldz02NDMzMDtlLnRhdmhlYnJldz0xNTE0O2UudGJhcj0zNTk7ZS50Ym9wb21vZm89MTI1NTQ7ZS50Y2Fyb249MzU3O2UudGNjdXJsPTY4MDtlLnRjZWRpbGxhPTM1NTtlLnRjaGVoYXJhYmljPTE2NzA7ZS50Y2hlaGZpbmFsYXJhYmljPTY0Mzc5O2UudGNoZWhpbml0aWFsYXJhYmljPTY0MzgwO2UudGNoZWhtZWRpYWxhcmFiaWM9NjQzODE7ZS50Y2lyY2xlPTk0NDM7ZS50Y2lyY3VtZmxleGJlbG93PTc3OTM7ZS50Y29tbWFhY2NlbnQ9MzU1O2UudGRpZXJlc2lzPTc4MzE7ZS50ZG90YWNjZW50PTc3ODc7ZS50ZG90YmVsb3c9Nzc4OTtlLnRlY3lyaWxsaWM9MTA5MDtlLnRlZGVzY2VuZGVyY3lyaWxsaWM9MTE5NztlLnRlaGFyYWJpYz0xNTc4O2UudGVoZmluYWxhcmFiaWM9NjUxNzQ7ZS50ZWhoYWhpbml0aWFsYXJhYmljPTY0Njc0O2UudGVoaGFoaXNvbGF0ZWRhcmFiaWM9NjQ1MjQ7ZS50ZWhpbml0aWFsYXJhYmljPTY1MTc1O2UudGVoaXJhZ2FuYT0xMjM5MDtlLnRlaGplZW1pbml0aWFsYXJhYmljPTY0NjczO2UudGVoamVlbWlzb2xhdGVkYXJhYmljPTY0NTIzO2UudGVobWFyYnV0YWFyYWJpYz0xNTc3O2UudGVobWFyYnV0YWZpbmFsYXJhYmljPTY1MTcyO2UudGVobWVkaWFsYXJhYmljPTY1MTc2O2UudGVobWVlbWluaXRpYWxhcmFiaWM9NjQ2NzY7ZS50ZWhtZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1MjY7ZS50ZWhub29uZmluYWxhcmFiaWM9NjQ2Mjc7ZS50ZWthdGFrYW5hPTEyNDg2O2UudGVrYXRha2FuYWhhbGZ3aWR0aD02NTQxMTtlLnRlbGVwaG9uZT04NDgxO2UudGVsZXBob25lYmxhY2s9OTc0MjtlLnRlbGlzaGFnZWRvbGFoZWJyZXc9MTQ0MDtlLnRlbGlzaGFxZXRhbmFoZWJyZXc9MTQ0OTtlLnRlbmNpcmNsZT05MzIxO2UudGVuaWRlb2dyYXBoaWNwYXJlbj0xMjg0MTtlLnRlbnBhcmVuPTkzNDE7ZS50ZW5wZXJpb2Q9OTM2MTtlLnRlbnJvbWFuPTg1Njk7ZS50ZXNoPTY3OTtlLnRldD0xNDk2O2UudGV0ZGFnZXNoPTY0MzEyO2UudGV0ZGFnZXNoaGVicmV3PTY0MzEyO2UudGV0aGVicmV3PTE0OTY7ZS50ZXRzZWN5cmlsbGljPTEyMDU7ZS50ZXZpcmhlYnJldz0xNDM1O2UudGV2aXJsZWZ0aGVicmV3PTE0MzU7ZS50aGFiZW5nYWxpPTI0Njk7ZS50aGFkZXZhPTIzNDE7ZS50aGFndWphcmF0aT0yNzI1O2UudGhhZ3VybXVraGk9MjU5NztlLnRoYWxhcmFiaWM9MTU4NDtlLnRoYWxmaW5hbGFyYWJpYz02NTE5NjtlLnRoYW50aGFraGF0bG93bGVmdHRoYWk9NjM2NDA7ZS50aGFudGhha2hhdGxvd3JpZ2h0dGhhaT02MzYzOTtlLnRoYW50aGFraGF0dGhhaT0zNjYwO2UudGhhbnRoYWtoYXR1cHBlcmxlZnR0aGFpPTYzNjM4O2UudGhlaGFyYWJpYz0xNTc5O2UudGhlaGZpbmFsYXJhYmljPTY1MTc4O2UudGhlaGluaXRpYWxhcmFiaWM9NjUxNzk7ZS50aGVobWVkaWFsYXJhYmljPTY1MTgwO2UudGhlcmVleGlzdHM9ODcwNztlLnRoZXJlZm9yZT04NzU2O2UudGhldGE9OTUyO2UudGhldGExPTk3NztlLnRoZXRhc3ltYm9sZ3JlZWs9OTc3O2UudGhpZXV0aGFjaXJjbGVrb3JlYW49MTI5MjE7ZS50aGlldXRoYXBhcmVua29yZWFuPTEyODI1O2UudGhpZXV0aGNpcmNsZWtvcmVhbj0xMjkwNztlLnRoaWV1dGhrb3JlYW49MTI2MjA7ZS50aGlldXRocGFyZW5rb3JlYW49MTI4MTE7ZS50aGlydGVlbmNpcmNsZT05MzI0O2UudGhpcnRlZW5wYXJlbj05MzQ0O2UudGhpcnRlZW5wZXJpb2Q9OTM2NDtlLnRob25hbmdtb250aG90aGFpPTM2MDE7ZS50aG9vaz00Mjk7ZS50aG9waHV0aGFvdGhhaT0zNjAyO2UudGhvcm49MjU0O2UudGhvdGhhaGFudGhhaT0zNjA3O2UudGhvdGhhbnRoYWk9MzYwMDtlLnRob3Rob25ndGhhaT0zNjA4O2UudGhvdGh1bmd0aGFpPTM2MDY7ZS50aG91c2FuZGN5cmlsbGljPTExNTQ7ZS50aG91c2FuZHNzZXBhcmF0b3JhcmFiaWM9MTY0NDtlLnRob3VzYW5kc3NlcGFyYXRvcnBlcnNpYW49MTY0NDtlLnRocmVlPTUxO2UudGhyZWVhcmFiaWM9MTYzNTtlLnRocmVlYmVuZ2FsaT0yNTM3O2UudGhyZWVjaXJjbGU9OTMxNDtlLnRocmVlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNDtlLnRocmVlZGV2YT0yNDA5O2UudGhyZWVlaWdodGhzPTg1NDA7ZS50aHJlZWd1amFyYXRpPTI3OTM7ZS50aHJlZWd1cm11a2hpPTI2NjU7ZS50aHJlZWhhY2thcmFiaWM9MTYzNTtlLnRocmVlaGFuZ3pob3U9MTIzMjM7ZS50aHJlZWlkZW9ncmFwaGljcGFyZW49MTI4MzQ7ZS50aHJlZWluZmVyaW9yPTgzMjM7ZS50aHJlZW1vbm9zcGFjZT02NTI5OTtlLnRocmVlbnVtZXJhdG9yYmVuZ2FsaT0yNTUwO2UudGhyZWVvbGRzdHlsZT02MzI4MztlLnRocmVlcGFyZW49OTMzNDtlLnRocmVlcGVyaW9kPTkzNTQ7ZS50aHJlZXBlcnNpYW49MTc3OTtlLnRocmVlcXVhcnRlcnM9MTkwO2UudGhyZWVxdWFydGVyc2VtZGFzaD02MzE5ODtlLnRocmVlcm9tYW49ODU2MjtlLnRocmVlc3VwZXJpb3I9MTc5O2UudGhyZWV0aGFpPTM2Njc7ZS50aHpzcXVhcmU9MTMyMDQ7ZS50aWhpcmFnYW5hPTEyMzg1O2UudGlrYXRha2FuYT0xMjQ4MTtlLnRpa2F0YWthbmFoYWxmd2lkdGg9NjU0MDk7ZS50aWtldXRhY2lyY2xla29yZWFuPTEyOTEyO2UudGlrZXV0YXBhcmVua29yZWFuPTEyODE2O2UudGlrZXV0Y2lyY2xla29yZWFuPTEyODk4O2UudGlrZXV0a29yZWFuPTEyNTk5O2UudGlrZXV0cGFyZW5rb3JlYW49MTI4MDI7ZS50aWxkZT03MzI7ZS50aWxkZWJlbG93Y21iPTgxNjtlLnRpbGRlY21iPTc3MTtlLnRpbGRlY29tYj03NzE7ZS50aWxkZWRvdWJsZWNtYj04NjQ7ZS50aWxkZW9wZXJhdG9yPTg3NjQ7ZS50aWxkZW92ZXJsYXljbWI9ODIwO2UudGlsZGV2ZXJ0aWNhbGNtYj04MzA7ZS50aW1lc2NpcmNsZT04ODU1O2UudGlwZWhhaGVicmV3PTE0MzA7ZS50aXBlaGFsZWZ0aGVicmV3PTE0MzA7ZS50aXBwaWd1cm11a2hpPTI2NzI7ZS50aXRsb2N5cmlsbGljY21iPTExNTU7ZS50aXduYXJtZW5pYW49MTQwNztlLnRsaW5lYmVsb3c9Nzc5MTtlLnRtb25vc3BhY2U9NjUzNjQ7ZS50b2FybWVuaWFuPTEzODU7ZS50b2hpcmFnYW5hPTEyMzkyO2UudG9rYXRha2FuYT0xMjQ4ODtlLnRva2F0YWthbmFoYWxmd2lkdGg9NjU0MTI7ZS50b25lYmFyZXh0cmFoaWdobW9kPTc0MTtlLnRvbmViYXJleHRyYWxvd21vZD03NDU7ZS50b25lYmFyaGlnaG1vZD03NDI7ZS50b25lYmFybG93bW9kPTc0NDtlLnRvbmViYXJtaWRtb2Q9NzQzO2UudG9uZWZpdmU9NDQ1O2UudG9uZXNpeD0zODk7ZS50b25ldHdvPTQyNDtlLnRvbm9zPTkwMDtlLnRvbnNxdWFyZT0xMzA5NTtlLnRvcGF0YWt0aGFpPTM1OTk7ZS50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQ9MTIzMDg7ZS50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnRzbWFsbD02NTExNztlLnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHZlcnRpY2FsPTY1MDgxO2UudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodD0xMjMwOTtlLnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHRzbWFsbD02NTExODtlLnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHR2ZXJ0aWNhbD02NTA4MjtlLnRvdGFvdGhhaT0zNjA1O2UudHBhbGF0YWxob29rPTQyNztlLnRwYXJlbj05MzkxO2UudHJhZGVtYXJrPTg0ODI7ZS50cmFkZW1hcmtzYW5zPTYzNzIyO2UudHJhZGVtYXJrc2VyaWY9NjMxOTU7ZS50cmV0cm9mbGV4aG9vaz02NDg7ZS50cmlhZ2RuPTk2NjA7ZS50cmlhZ2xmPTk2Njg7ZS50cmlhZ3J0PTk2NTg7ZS50cmlhZ3VwPTk2NTA7ZS50cz02Nzg7ZS50c2FkaT0xNTEwO2UudHNhZGlkYWdlc2g9NjQzMjY7ZS50c2FkaWRhZ2VzaGhlYnJldz02NDMyNjtlLnRzYWRpaGVicmV3PTE1MTA7ZS50c2VjeXJpbGxpYz0xMDk0O2UudHNlcmU9MTQ2MTtlLnRzZXJlMTI9MTQ2MTtlLnRzZXJlMWU9MTQ2MTtlLnRzZXJlMmI9MTQ2MTtlLnRzZXJlaGVicmV3PTE0NjE7ZS50c2VyZW5hcnJvd2hlYnJldz0xNDYxO2UudHNlcmVxdWFydGVyaGVicmV3PTE0NjE7ZS50c2VyZXdpZGVoZWJyZXc9MTQ2MTtlLnRzaGVjeXJpbGxpYz0xMTE1O2UudHN1cGVyaW9yPTYzMjE5O2UudHRhYmVuZ2FsaT0yNDYzO2UudHRhZGV2YT0yMzM1O2UudHRhZ3VqYXJhdGk9MjcxOTtlLnR0YWd1cm11a2hpPTI1OTE7ZS50dGVoYXJhYmljPTE2NTc7ZS50dGVoZmluYWxhcmFiaWM9NjQzNTk7ZS50dGVoaW5pdGlhbGFyYWJpYz02NDM2MDtlLnR0ZWhtZWRpYWxhcmFiaWM9NjQzNjE7ZS50dGhhYmVuZ2FsaT0yNDY0O2UudHRoYWRldmE9MjMzNjtlLnR0aGFndWphcmF0aT0yNzIwO2UudHRoYWd1cm11a2hpPTI1OTI7ZS50dHVybmVkPTY0NztlLnR1aGlyYWdhbmE9MTIzODg7ZS50dWthdGFrYW5hPTEyNDg0O2UudHVrYXRha2FuYWhhbGZ3aWR0aD02NTQxMDtlLnR1c21hbGxoaXJhZ2FuYT0xMjM4NztlLnR1c21hbGxrYXRha2FuYT0xMjQ4MztlLnR1c21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM5MTtlLnR3ZWx2ZWNpcmNsZT05MzIzO2UudHdlbHZlcGFyZW49OTM0MztlLnR3ZWx2ZXBlcmlvZD05MzYzO2UudHdlbHZlcm9tYW49ODU3MTtlLnR3ZW50eWNpcmNsZT05MzMxO2UudHdlbnR5aGFuZ3pob3U9MjEzMTY7ZS50d2VudHlwYXJlbj05MzUxO2UudHdlbnR5cGVyaW9kPTkzNzE7ZS50d289NTA7ZS50d29hcmFiaWM9MTYzNDtlLnR3b2JlbmdhbGk9MjUzNjtlLnR3b2NpcmNsZT05MzEzO2UudHdvY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyMztlLnR3b2RldmE9MjQwODtlLnR3b2RvdGVubGVhZGVyPTgyMjk7ZS50d29kb3RsZWFkZXI9ODIyOTtlLnR3b2RvdGxlYWRlcnZlcnRpY2FsPTY1MDcyO2UudHdvZ3VqYXJhdGk9Mjc5MjtlLnR3b2d1cm11a2hpPTI2NjQ7ZS50d29oYWNrYXJhYmljPTE2MzQ7ZS50d29oYW5nemhvdT0xMjMyMjtlLnR3b2lkZW9ncmFwaGljcGFyZW49MTI4MzM7ZS50d29pbmZlcmlvcj04MzIyO2UudHdvbW9ub3NwYWNlPTY1Mjk4O2UudHdvbnVtZXJhdG9yYmVuZ2FsaT0yNTQ5O2UudHdvb2xkc3R5bGU9NjMyODI7ZS50d29wYXJlbj05MzMzO2UudHdvcGVyaW9kPTkzNTM7ZS50d29wZXJzaWFuPTE3Nzg7ZS50d29yb21hbj04NTYxO2UudHdvc3Ryb2tlPTQ0MztlLnR3b3N1cGVyaW9yPTE3ODtlLnR3b3RoYWk9MzY2NjtlLnR3b3RoaXJkcz04NTMyO2UudT0xMTc7ZS51YWN1dGU9MjUwO2UudWJhcj02NDk7ZS51YmVuZ2FsaT0yNDQxO2UudWJvcG9tb2ZvPTEyNTg0O2UudWJyZXZlPTM2NTtlLnVjYXJvbj00Njg7ZS51Y2lyY2xlPTk0NDQ7ZS51Y2lyY3VtZmxleD0yNTE7ZS51Y2lyY3VtZmxleGJlbG93PTc3OTk7ZS51Y3lyaWxsaWM9MTA5MTtlLnVkYXR0YWRldmE9MjM4NTtlLnVkYmxhY3V0ZT0zNjk7ZS51ZGJsZ3JhdmU9NTMzO2UudWRldmE9MjMxMztlLnVkaWVyZXNpcz0yNTI7ZS51ZGllcmVzaXNhY3V0ZT00NzI7ZS51ZGllcmVzaXNiZWxvdz03Nzk1O2UudWRpZXJlc2lzY2Fyb249NDc0O2UudWRpZXJlc2lzY3lyaWxsaWM9MTI2NTtlLnVkaWVyZXNpc2dyYXZlPTQ3NjtlLnVkaWVyZXNpc21hY3Jvbj00NzA7ZS51ZG90YmVsb3c9NzkwOTtlLnVncmF2ZT0yNDk7ZS51Z3VqYXJhdGk9MjY5NztlLnVndXJtdWtoaT0yNTY5O2UudWhpcmFnYW5hPTEyMzU4O2UudWhvb2thYm92ZT03OTExO2UudWhvcm49NDMyO2UudWhvcm5hY3V0ZT03OTEzO2UudWhvcm5kb3RiZWxvdz03OTIxO2UudWhvcm5ncmF2ZT03OTE1O2UudWhvcm5ob29rYWJvdmU9NzkxNztlLnVob3JudGlsZGU9NzkxOTtlLnVodW5nYXJ1bWxhdXQ9MzY5O2UudWh1bmdhcnVtbGF1dGN5cmlsbGljPTEyNjc7ZS51aW52ZXJ0ZWRicmV2ZT01MzU7ZS51a2F0YWthbmE9MTI0NTQ7ZS51a2F0YWthbmFoYWxmd2lkdGg9NjUzOTU7ZS51a2N5cmlsbGljPTExNDU7ZS51a29yZWFuPTEyNjM2O2UudW1hY3Jvbj0zNjM7ZS51bWFjcm9uY3lyaWxsaWM9MTI2MztlLnVtYWNyb25kaWVyZXNpcz03ODAzO2UudW1hdHJhZ3VybXVraGk9MjYyNTtlLnVtb25vc3BhY2U9NjUzNjU7ZS51bmRlcnNjb3JlPTk1O2UudW5kZXJzY29yZWRibD04MjE1O2UudW5kZXJzY29yZW1vbm9zcGFjZT02NTM0MztlLnVuZGVyc2NvcmV2ZXJ0aWNhbD02NTA3NTtlLnVuZGVyc2NvcmV3YXZ5PTY1MTAzO2UudW5pb249ODc0NjtlLnVuaXZlcnNhbD04NzA0O2UudW9nb25laz0zNzE7ZS51cGFyZW49OTM5MjtlLnVwYmxvY2s9OTYwMDtlLnVwcGVyZG90aGVicmV3PTE0NzY7ZS51cHNpbG9uPTk2NTtlLnVwc2lsb25kaWVyZXNpcz05NzE7ZS51cHNpbG9uZGllcmVzaXN0b25vcz05NDQ7ZS51cHNpbG9ubGF0aW49NjUwO2UudXBzaWxvbnRvbm9zPTk3MztlLnVwdGFja2JlbG93Y21iPTc5NztlLnVwdGFja21vZD03MjQ7ZS51cmFndXJtdWtoaT0yNjc1O2UudXJpbmc9MzY3O2UudXNob3J0Y3lyaWxsaWM9MTExODtlLnVzbWFsbGhpcmFnYW5hPTEyMzU3O2UudXNtYWxsa2F0YWthbmE9MTI0NTM7ZS51c21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM4NTtlLnVzdHJhaWdodGN5cmlsbGljPTExOTk7ZS51c3RyYWlnaHRzdHJva2VjeXJpbGxpYz0xMjAxO2UudXRpbGRlPTM2MTtlLnV0aWxkZWFjdXRlPTc4MDE7ZS51dGlsZGViZWxvdz03Nzk3O2UudXViZW5nYWxpPTI0NDI7ZS51dWRldmE9MjMxNDtlLnV1Z3VqYXJhdGk9MjY5ODtlLnV1Z3VybXVraGk9MjU3MDtlLnV1bWF0cmFndXJtdWtoaT0yNjI2O2UudXV2b3dlbHNpZ25iZW5nYWxpPTI0OTg7ZS51dXZvd2Vsc2lnbmRldmE9MjM3MDtlLnV1dm93ZWxzaWduZ3VqYXJhdGk9Mjc1NDtlLnV2b3dlbHNpZ25iZW5nYWxpPTI0OTc7ZS51dm93ZWxzaWduZGV2YT0yMzY5O2UudXZvd2Vsc2lnbmd1amFyYXRpPTI3NTM7ZS52PTExODtlLnZhZGV2YT0yMzU3O2UudmFndWphcmF0aT0yNzQxO2UudmFndXJtdWtoaT0yNjEzO2UudmFrYXRha2FuYT0xMjUzNTtlLnZhdj0xNDkzO2UudmF2ZGFnZXNoPTY0MzA5O2UudmF2ZGFnZXNoNjU9NjQzMDk7ZS52YXZkYWdlc2hoZWJyZXc9NjQzMDk7ZS52YXZoZWJyZXc9MTQ5MztlLnZhdmhvbGFtPTY0MzMxO2UudmF2aG9sYW1oZWJyZXc9NjQzMzE7ZS52YXZ2YXZoZWJyZXc9MTUyMDtlLnZhdnlvZGhlYnJldz0xNTIxO2UudmNpcmNsZT05NDQ1O2UudmRvdGJlbG93PTc4MDc7ZS52ZWN5cmlsbGljPTEwNzQ7ZS52ZWhhcmFiaWM9MTcwMDtlLnZlaGZpbmFsYXJhYmljPTY0MzYzO2UudmVoaW5pdGlhbGFyYWJpYz02NDM2NDtlLnZlaG1lZGlhbGFyYWJpYz02NDM2NTtlLnZla2F0YWthbmE9MTI1Mzc7ZS52ZW51cz05NzkyO2UudmVydGljYWxiYXI9MTI0O2UudmVydGljYWxsaW5lYWJvdmVjbWI9NzgxO2UudmVydGljYWxsaW5lYmVsb3djbWI9ODA5O2UudmVydGljYWxsaW5lbG93bW9kPTcxNjtlLnZlcnRpY2FsbGluZW1vZD03MTI7ZS52ZXdhcm1lbmlhbj0xNDA2O2Uudmhvb2s9NjUxO2UudmlrYXRha2FuYT0xMjUzNjtlLnZpcmFtYWJlbmdhbGk9MjUwOTtlLnZpcmFtYWRldmE9MjM4MTtlLnZpcmFtYWd1amFyYXRpPTI3NjU7ZS52aXNhcmdhYmVuZ2FsaT0yNDM1O2UudmlzYXJnYWRldmE9MjMwNztlLnZpc2FyZ2FndWphcmF0aT0yNjkxO2Uudm1vbm9zcGFjZT02NTM2NjtlLnZvYXJtZW5pYW49MTQwMDtlLnZvaWNlZGl0ZXJhdGlvbmhpcmFnYW5hPTEyNDQ2O2Uudm9pY2VkaXRlcmF0aW9ua2F0YWthbmE9MTI1NDI7ZS52b2ljZWRtYXJra2FuYT0xMjQ0MztlLnZvaWNlZG1hcmtrYW5haGFsZndpZHRoPTY1NDM4O2Uudm9rYXRha2FuYT0xMjUzODtlLnZwYXJlbj05MzkzO2UudnRpbGRlPTc4MDU7ZS52dHVybmVkPTY1MjtlLnZ1aGlyYWdhbmE9MTI0MzY7ZS52dWthdGFrYW5hPTEyNTMyO2Uudz0xMTk7ZS53YWN1dGU9NzgxMTtlLndhZWtvcmVhbj0xMjYzMztlLndhaGlyYWdhbmE9MTI0MzE7ZS53YWthdGFrYW5hPTEyNTI3O2Uud2FrYXRha2FuYWhhbGZ3aWR0aD02NTQzNjtlLndha29yZWFuPTEyNjMyO2Uud2FzbWFsbGhpcmFnYW5hPTEyNDMwO2Uud2FzbWFsbGthdGFrYW5hPTEyNTI2O2Uud2F0dG9zcXVhcmU9MTMxNDM7ZS53YXZlZGFzaD0xMjMxNjtlLndhdnl1bmRlcnNjb3JldmVydGljYWw9NjUwNzY7ZS53YXdhcmFiaWM9MTYwODtlLndhd2ZpbmFsYXJhYmljPTY1MjYyO2Uud2F3aGFtemFhYm92ZWFyYWJpYz0xNTcyO2Uud2F3aGFtemFhYm92ZWZpbmFsYXJhYmljPTY1MTU4O2Uud2JzcXVhcmU9MTMyNzc7ZS53Y2lyY2xlPTk0NDY7ZS53Y2lyY3VtZmxleD0zNzM7ZS53ZGllcmVzaXM9NzgxMztlLndkb3RhY2NlbnQ9NzgxNTtlLndkb3RiZWxvdz03ODE3O2Uud2VoaXJhZ2FuYT0xMjQzMztlLndlaWVyc3RyYXNzPTg0NzI7ZS53ZWthdGFrYW5hPTEyNTI5O2Uud2Vrb3JlYW49MTI2Mzg7ZS53ZW9rb3JlYW49MTI2Mzc7ZS53Z3JhdmU9NzgwOTtlLndoaXRlYnVsbGV0PTk3MDI7ZS53aGl0ZWNpcmNsZT05Njc1O2Uud2hpdGVjaXJjbGVpbnZlcnNlPTk2ODk7ZS53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0PTEyMzAyO2Uud2hpdGVjb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsPTY1MDkxO2Uud2hpdGVjb3JuZXJicmFja2V0cmlnaHQ9MTIzMDM7ZS53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsPTY1MDkyO2Uud2hpdGVkaWFtb25kPTk2NzE7ZS53aGl0ZWRpYW1vbmRjb250YWluaW5nYmxhY2tzbWFsbGRpYW1vbmQ9OTY3MjtlLndoaXRlZG93bnBvaW50aW5nc21hbGx0cmlhbmdsZT05NjYzO2Uud2hpdGVkb3ducG9pbnRpbmd0cmlhbmdsZT05NjYxO2Uud2hpdGVsZWZ0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2Njc7ZS53aGl0ZWxlZnRwb2ludGluZ3RyaWFuZ2xlPTk2NjU7ZS53aGl0ZWxlbnRpY3VsYXJicmFja2V0bGVmdD0xMjMxMDtlLndoaXRlbGVudGljdWxhcmJyYWNrZXRyaWdodD0xMjMxMTtlLndoaXRlcmlnaHRwb2ludGluZ3NtYWxsdHJpYW5nbGU9OTY1NztlLndoaXRlcmlnaHRwb2ludGluZ3RyaWFuZ2xlPTk2NTU7ZS53aGl0ZXNtYWxsc3F1YXJlPTk2NDM7ZS53aGl0ZXNtaWxpbmdmYWNlPTk3ODY7ZS53aGl0ZXNxdWFyZT05NjMzO2Uud2hpdGVzdGFyPTk3MzQ7ZS53aGl0ZXRlbGVwaG9uZT05NzQzO2Uud2hpdGV0b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQ9MTIzMTI7ZS53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQ9MTIzMTM7ZS53aGl0ZXVwcG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2NTM7ZS53aGl0ZXVwcG9pbnRpbmd0cmlhbmdsZT05NjUxO2Uud2loaXJhZ2FuYT0xMjQzMjtlLndpa2F0YWthbmE9MTI1Mjg7ZS53aWtvcmVhbj0xMjYzOTtlLndtb25vc3BhY2U9NjUzNjc7ZS53b2hpcmFnYW5hPTEyNDM0O2Uud29rYXRha2FuYT0xMjUzMDtlLndva2F0YWthbmFoYWxmd2lkdGg9NjUzODI7ZS53b249ODM2MTtlLndvbm1vbm9zcGFjZT02NTUxMDtlLndvd2FlbnRoYWk9MzYyMztlLndwYXJlbj05Mzk0O2Uud3Jpbmc9NzgzMjtlLndzdXBlcmlvcj02OTU7ZS53dHVybmVkPTY1MztlLnd5bm49NDQ3O2UueD0xMjA7ZS54YWJvdmVjbWI9ODI5O2UueGJvcG9tb2ZvPTEyNTYyO2UueGNpcmNsZT05NDQ3O2UueGRpZXJlc2lzPTc4MjE7ZS54ZG90YWNjZW50PTc4MTk7ZS54ZWhhcm1lbmlhbj0xMzg5O2UueGk9OTU4O2UueG1vbm9zcGFjZT02NTM2ODtlLnhwYXJlbj05Mzk1O2UueHN1cGVyaW9yPTczOTtlLnk9MTIxO2UueWFhZG9zcXVhcmU9MTMxMzQ7ZS55YWJlbmdhbGk9MjQ3OTtlLnlhY3V0ZT0yNTM7ZS55YWRldmE9MjM1MTtlLnlhZWtvcmVhbj0xMjYyNjtlLnlhZ3VqYXJhdGk9MjczNTtlLnlhZ3VybXVraGk9MjYwNztlLnlhaGlyYWdhbmE9MTI0MjA7ZS55YWthdGFrYW5hPTEyNTE2O2UueWFrYXRha2FuYWhhbGZ3aWR0aD02NTQyODtlLnlha29yZWFuPTEyNjI1O2UueWFtYWtrYW50aGFpPTM2NjI7ZS55YXNtYWxsaGlyYWdhbmE9MTI0MTk7ZS55YXNtYWxsa2F0YWthbmE9MTI1MTU7ZS55YXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODg7ZS55YXRjeXJpbGxpYz0xMTIzO2UueWNpcmNsZT05NDQ4O2UueWNpcmN1bWZsZXg9Mzc1O2UueWRpZXJlc2lzPTI1NTtlLnlkb3RhY2NlbnQ9NzgyMztlLnlkb3RiZWxvdz03OTI1O2UueWVoYXJhYmljPTE2MTA7ZS55ZWhiYXJyZWVhcmFiaWM9MTc0NjtlLnllaGJhcnJlZWZpbmFsYXJhYmljPTY0NDMxO2UueWVoZmluYWxhcmFiaWM9NjUyNjY7ZS55ZWhoYW16YWFib3ZlYXJhYmljPTE1NzQ7ZS55ZWhoYW16YWFib3ZlZmluYWxhcmFiaWM9NjUxNjI7ZS55ZWhoYW16YWFib3ZlaW5pdGlhbGFyYWJpYz02NTE2MztlLnllaGhhbXphYWJvdmVtZWRpYWxhcmFiaWM9NjUxNjQ7ZS55ZWhpbml0aWFsYXJhYmljPTY1MjY3O2UueWVobWVkaWFsYXJhYmljPTY1MjY4O2UueWVobWVlbWluaXRpYWxhcmFiaWM9NjQ3MzM7ZS55ZWhtZWVtaXNvbGF0ZWRhcmFiaWM9NjQ2MDA7ZS55ZWhub29uZmluYWxhcmFiaWM9NjQ2NjA7ZS55ZWh0aHJlZWRvdHNiZWxvd2FyYWJpYz0xNzQ1O2UueWVrb3JlYW49MTI2MzA7ZS55ZW49MTY1O2UueWVubW9ub3NwYWNlPTY1NTA5O2UueWVva29yZWFuPTEyNjI5O2UueWVvcmluaGlldWhrb3JlYW49MTI2Nzg7ZS55ZXJhaGJlbnlvbW9oZWJyZXc9MTQ1MDtlLnllcmFoYmVueW9tb2xlZnRoZWJyZXc9MTQ1MDtlLnllcmljeXJpbGxpYz0xMDk5O2UueWVydWRpZXJlc2lzY3lyaWxsaWM9MTI3MztlLnllc2lldW5na29yZWFuPTEyNjczO2UueWVzaWV1bmdwYW5zaW9za29yZWFuPTEyNjc1O2UueWVzaWV1bmdzaW9za29yZWFuPTEyNjc0O2UueWV0aXZoZWJyZXc9MTQzNDtlLnlncmF2ZT03OTIzO2UueWhvb2s9NDM2O2UueWhvb2thYm92ZT03OTI3O2UueWlhcm1lbmlhbj0xMzk3O2UueWljeXJpbGxpYz0xMTExO2UueWlrb3JlYW49MTI2NDI7ZS55aW55YW5nPTk3NzU7ZS55aXduYXJtZW5pYW49MTQxMDtlLnltb25vc3BhY2U9NjUzNjk7ZS55b2Q9MTQ5NztlLnlvZGRhZ2VzaD02NDMxMztlLnlvZGRhZ2VzaGhlYnJldz02NDMxMztlLnlvZGhlYnJldz0xNDk3O2UueW9keW9kaGVicmV3PTE1MjI7ZS55b2R5b2RwYXRhaGhlYnJldz02NDI4NztlLnlvaGlyYWdhbmE9MTI0MjQ7ZS55b2lrb3JlYW49MTI2ODE7ZS55b2thdGFrYW5hPTEyNTIwO2UueW9rYXRha2FuYWhhbGZ3aWR0aD02NTQzMDtlLnlva29yZWFuPTEyNjM1O2UueW9zbWFsbGhpcmFnYW5hPTEyNDIzO2UueW9zbWFsbGthdGFrYW5hPTEyNTE5O2UueW9zbWFsbGthdGFrYW5haGFsZndpZHRoPTY1MzkwO2UueW90Z3JlZWs9MTAxMTtlLnlveWFla29yZWFuPTEyNjgwO2UueW95YWtvcmVhbj0xMjY3OTtlLnlveWFrdGhhaT0zNjE4O2UueW95aW5ndGhhaT0zNTk3O2UueXBhcmVuPTkzOTY7ZS55cG9nZWdyYW1tZW5pPTg5MDtlLnlwb2dlZ3JhbW1lbmlncmVla2NtYj04Mzc7ZS55cj00MjI7ZS55cmluZz03ODMzO2UueXN1cGVyaW9yPTY5NjtlLnl0aWxkZT03OTI5O2UueXR1cm5lZD02NTQ7ZS55dWhpcmFnYW5hPTEyNDIyO2UueXVpa29yZWFuPTEyNjg0O2UueXVrYXRha2FuYT0xMjUxODtlLnl1a2F0YWthbmFoYWxmd2lkdGg9NjU0Mjk7ZS55dWtvcmVhbj0xMjY0MDtlLnl1c2JpZ2N5cmlsbGljPTExMzE7ZS55dXNiaWdpb3RpZmllZGN5cmlsbGljPTExMzM7ZS55dXNsaXR0bGVjeXJpbGxpYz0xMTI3O2UueXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYz0xMTI5O2UueXVzbWFsbGhpcmFnYW5hPTEyNDIxO2UueXVzbWFsbGthdGFrYW5hPTEyNTE3O2UueXVzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1Mzg5O2UueXV5ZWtvcmVhbj0xMjY4MztlLnl1eWVva29yZWFuPTEyNjgyO2UueXlhYmVuZ2FsaT0yNTI3O2UueXlhZGV2YT0yMzk5O2Uuej0xMjI7ZS56YWFybWVuaWFuPTEzODI7ZS56YWN1dGU9Mzc4O2UuemFkZXZhPTIzOTU7ZS56YWd1cm11a2hpPTI2NTE7ZS56YWhhcmFiaWM9MTU5MjtlLnphaGZpbmFsYXJhYmljPTY1MjIyO2UuemFoaW5pdGlhbGFyYWJpYz02NTIyMztlLnphaGlyYWdhbmE9MTIzNzQ7ZS56YWhtZWRpYWxhcmFiaWM9NjUyMjQ7ZS56YWluYXJhYmljPTE1ODY7ZS56YWluZmluYWxhcmFiaWM9NjUyMDA7ZS56YWthdGFrYW5hPTEyNDcwO2UuemFxZWZnYWRvbGhlYnJldz0xNDI5O2UuemFxZWZxYXRhbmhlYnJldz0xNDI4O2UuemFycWFoZWJyZXc9MTQzMjtlLnpheWluPTE0OTQ7ZS56YXlpbmRhZ2VzaD02NDMxMDtlLnpheWluZGFnZXNoaGVicmV3PTY0MzEwO2UuemF5aW5oZWJyZXc9MTQ5NDtlLnpib3BvbW9mbz0xMjU2NztlLnpjYXJvbj0zODI7ZS56Y2lyY2xlPTk0NDk7ZS56Y2lyY3VtZmxleD03ODI1O2UuemN1cmw9NjU3O2UuemRvdD0zODA7ZS56ZG90YWNjZW50PTM4MDtlLnpkb3RiZWxvdz03ODI3O2UuemVjeXJpbGxpYz0xMDc5O2UuemVkZXNjZW5kZXJjeXJpbGxpYz0xMTc3O2UuemVkaWVyZXNpc2N5cmlsbGljPTEyNDc7ZS56ZWhpcmFnYW5hPTEyMzgwO2UuemVrYXRha2FuYT0xMjQ3NjtlLnplcm89NDg7ZS56ZXJvYXJhYmljPTE2MzI7ZS56ZXJvYmVuZ2FsaT0yNTM0O2UuemVyb2RldmE9MjQwNjtlLnplcm9ndWphcmF0aT0yNzkwO2UuemVyb2d1cm11a2hpPTI2NjI7ZS56ZXJvaGFja2FyYWJpYz0xNjMyO2UuemVyb2luZmVyaW9yPTgzMjA7ZS56ZXJvbW9ub3NwYWNlPTY1Mjk2O2UuemVyb29sZHN0eWxlPTYzMjgwO2UuemVyb3BlcnNpYW49MTc3NjtlLnplcm9zdXBlcmlvcj04MzA0O2UuemVyb3RoYWk9MzY2NDtlLnplcm93aWR0aGpvaW5lcj02NTI3OTtlLnplcm93aWR0aG5vbmpvaW5lcj04MjA0O2UuemVyb3dpZHRoc3BhY2U9ODIwMztlLnpldGE9OTUwO2Uuemhib3BvbW9mbz0xMjU2MztlLnpoZWFybWVuaWFuPTEzODY7ZS56aGVicmV2ZWN5cmlsbGljPTEyMTg7ZS56aGVjeXJpbGxpYz0xMDc4O2UuemhlZGVzY2VuZGVyY3lyaWxsaWM9MTE3NTtlLnpoZWRpZXJlc2lzY3lyaWxsaWM9MTI0NTtlLnppaGlyYWdhbmE9MTIzNzY7ZS56aWthdGFrYW5hPTEyNDcyO2Uuemlub3JoZWJyZXc9MTQ1NDtlLnpsaW5lYmVsb3c9NzgyOTtlLnptb25vc3BhY2U9NjUzNzA7ZS56b2hpcmFnYW5hPTEyMzgyO2Uuem9rYXRha2FuYT0xMjQ3ODtlLnpwYXJlbj05Mzk3O2UuenJldHJvZmxleGhvb2s9NjU2O2UuenN0cm9rZT00Mzg7ZS56dWhpcmFnYW5hPTEyMzc4O2UuenVrYXRha2FuYT0xMjQ3NDtlWyIubm90ZGVmIl09MDtlLmFuZ2JyYWNrZXRsZWZ0YmlnPTkwMDE7ZS5hbmdicmFja2V0bGVmdEJpZz05MDAxO2UuYW5nYnJhY2tldGxlZnRiaWdnPTkwMDE7ZS5hbmdicmFja2V0bGVmdEJpZ2c9OTAwMTtlLmFuZ2JyYWNrZXRyaWdodEJpZz05MDAyO2UuYW5nYnJhY2tldHJpZ2h0YmlnPTkwMDI7ZS5hbmdicmFja2V0cmlnaHRCaWdnPTkwMDI7ZS5hbmdicmFja2V0cmlnaHRiaWdnPTkwMDI7ZS5hcnJvd2hvb2tsZWZ0PTg2MTg7ZS5hcnJvd2hvb2tyaWdodD04NjE3O2UuYXJyb3dsZWZ0dG9waGFsZj04NjM2O2UuYXJyb3dsZWZ0Ym90aGFsZj04NjM3O2UuYXJyb3dub3J0aGVhc3Q9ODU5OTtlLmFycm93bm9ydGh3ZXN0PTg1OTg7ZS5hcnJvd3JpZ2h0dG9waGFsZj04NjQwO2UuYXJyb3dyaWdodGJvdGhhbGY9ODY0MTtlLmFycm93c291dGhlYXN0PTg2MDA7ZS5hcnJvd3NvdXRod2VzdD04NjAxO2UuYmFja3NsYXNoYmlnPTg3MjY7ZS5iYWNrc2xhc2hCaWc9ODcyNjtlLmJhY2tzbGFzaEJpZ2c9ODcyNjtlLmJhY2tzbGFzaGJpZ2c9ODcyNjtlLmJhcmRibD04MjE0O2UuYnJhY2VodGlwZG93bmxlZnQ9NjUwNzk7ZS5icmFjZWh0aXBkb3ducmlnaHQ9NjUwNzk7ZS5icmFjZWh0aXB1cGxlZnQ9NjUwODA7ZS5icmFjZWh0aXB1cHJpZ2h0PTY1MDgwO2UuYnJhY2VsZWZ0QmlnPTEyMztlLmJyYWNlbGVmdGJpZz0xMjM7ZS5icmFjZWxlZnRiaWdnPTEyMztlLmJyYWNlbGVmdEJpZ2c9MTIzO2UuYnJhY2VyaWdodEJpZz0xMjU7ZS5icmFjZXJpZ2h0YmlnPTEyNTtlLmJyYWNlcmlnaHRiaWdnPTEyNTtlLmJyYWNlcmlnaHRCaWdnPTEyNTtlLmJyYWNrZXRsZWZ0YmlnPTkxO2UuYnJhY2tldGxlZnRCaWc9OTE7ZS5icmFja2V0bGVmdGJpZ2c9OTE7ZS5icmFja2V0bGVmdEJpZ2c9OTE7ZS5icmFja2V0cmlnaHRCaWc9OTM7ZS5icmFja2V0cmlnaHRiaWc9OTM7ZS5icmFja2V0cmlnaHRiaWdnPTkzO2UuYnJhY2tldHJpZ2h0QmlnZz05MztlLmNlaWxpbmdsZWZ0YmlnPTg5Njg7ZS5jZWlsaW5nbGVmdEJpZz04OTY4O2UuY2VpbGluZ2xlZnRCaWdnPTg5Njg7ZS5jZWlsaW5nbGVmdGJpZ2c9ODk2ODtlLmNlaWxpbmdyaWdodGJpZz04OTY5O2UuY2VpbGluZ3JpZ2h0QmlnPTg5Njk7ZS5jZWlsaW5ncmlnaHRiaWdnPTg5Njk7ZS5jZWlsaW5ncmlnaHRCaWdnPTg5Njk7ZS5jaXJjbGVkb3RkaXNwbGF5PTg4NTc7ZS5jaXJjbGVkb3R0ZXh0PTg4NTc7ZS5jaXJjbGVtdWx0aXBseWRpc3BsYXk9ODg1NTtlLmNpcmNsZW11bHRpcGx5dGV4dD04ODU1O2UuY2lyY2xlcGx1c2Rpc3BsYXk9ODg1MztlLmNpcmNsZXBsdXN0ZXh0PTg4NTM7ZS5jb250aW50ZWdyYWxkaXNwbGF5PTg3NTA7ZS5jb250aW50ZWdyYWx0ZXh0PTg3NTA7ZS5jb3Byb2R1Y3RkaXNwbGF5PTg3MjA7ZS5jb3Byb2R1Y3R0ZXh0PTg3MjA7ZS5mbG9vcmxlZnRCaWc9ODk3MDtlLmZsb29ybGVmdGJpZz04OTcwO2UuZmxvb3JsZWZ0YmlnZz04OTcwO2UuZmxvb3JsZWZ0QmlnZz04OTcwO2UuZmxvb3JyaWdodGJpZz04OTcxO2UuZmxvb3JyaWdodEJpZz04OTcxO2UuZmxvb3JyaWdodEJpZ2c9ODk3MTtlLmZsb29ycmlnaHRiaWdnPTg5NzE7ZS5oYXR3aWRlPTc3MDtlLmhhdHdpZGVyPTc3MDtlLmhhdHdpZGVzdD03NzA7ZS5pbnRlcmNhbD03NDg4O2UuaW50ZWdyYWxkaXNwbGF5PTg3NDc7ZS5pbnRlZ3JhbHRleHQ9ODc0NztlLmludGVyc2VjdGlvbmRpc3BsYXk9ODg5ODtlLmludGVyc2VjdGlvbnRleHQ9ODg5ODtlLmxvZ2ljYWxhbmRkaXNwbGF5PTg3NDM7ZS5sb2dpY2FsYW5kdGV4dD04NzQzO2UubG9naWNhbG9yZGlzcGxheT04NzQ0O2UubG9naWNhbG9ydGV4dD04NzQ0O2UucGFyZW5sZWZ0QmlnPTQwO2UucGFyZW5sZWZ0YmlnPTQwO2UucGFyZW5sZWZ0QmlnZz00MDtlLnBhcmVubGVmdGJpZ2c9NDA7ZS5wYXJlbnJpZ2h0QmlnPTQxO2UucGFyZW5yaWdodGJpZz00MTtlLnBhcmVucmlnaHRCaWdnPTQxO2UucGFyZW5yaWdodGJpZ2c9NDE7ZS5wcmltZT04MjQyO2UucHJvZHVjdGRpc3BsYXk9ODcxOTtlLnByb2R1Y3R0ZXh0PTg3MTk7ZS5yYWRpY2FsYmlnPTg3MzA7ZS5yYWRpY2FsQmlnPTg3MzA7ZS5yYWRpY2FsQmlnZz04NzMwO2UucmFkaWNhbGJpZ2c9ODczMDtlLnJhZGljYWxidD04NzMwO2UucmFkaWNhbHRwPTg3MzA7ZS5yYWRpY2FsdmVydGV4PTg3MzA7ZS5zbGFzaGJpZz00NztlLnNsYXNoQmlnPTQ3O2Uuc2xhc2hCaWdnPTQ3O2Uuc2xhc2hiaWdnPTQ3O2Uuc3VtbWF0aW9uZGlzcGxheT04NzIxO2Uuc3VtbWF0aW9udGV4dD04NzIxO2UudGlsZGV3aWRlPTczMjtlLnRpbGRld2lkZXI9NzMyO2UudGlsZGV3aWRlc3Q9NzMyO2UudW5pb25kaXNwbGF5PTg4OTk7ZS51bmlvbm11bHRpZGlzcGxheT04ODQ2O2UudW5pb25tdWx0aXRleHQ9ODg0NjtlLnVuaW9uc3FkaXNwbGF5PTg4NTI7ZS51bmlvbnNxdGV4dD04ODUyO2UudW5pb250ZXh0PTg4OTk7ZS52ZXh0ZW5kZG91YmxlPTg3NDE7ZS52ZXh0ZW5kc2luZ2xlPTg3Mzl9KSksaT0oMCxyLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MzI7ZS5hMT05OTg1O2UuYTI9OTk4NjtlLmEyMDI9OTk4NztlLmEzPTk5ODg7ZS5hND05NzQyO2UuYTU9OTk5MDtlLmExMTk9OTk5MTtlLmExMTg9OTk5MjtlLmExMTc9OTk5MztlLmExMT05NzU1O2UuYTEyPTk3NTg7ZS5hMTM9OTk5NjtlLmExND05OTk3O2UuYTE1PTk5OTg7ZS5hMTY9OTk5OTtlLmExMDU9MWU0O2UuYTE3PTEwMDAxO2UuYTE4PTEwMDAyO2UuYTE5PTEwMDAzO2UuYTIwPTEwMDA0O2UuYTIxPTEwMDA1O2UuYTIyPTEwMDA2O2UuYTIzPTEwMDA3O2UuYTI0PTEwMDA4O2UuYTI1PTEwMDA5O2UuYTI2PTEwMDEwO2UuYTI3PTEwMDExO2UuYTI4PTEwMDEyO2UuYTY9MTAwMTM7ZS5hNz0xMDAxNDtlLmE4PTEwMDE1O2UuYTk9MTAwMTY7ZS5hMTA9MTAwMTc7ZS5hMjk9MTAwMTg7ZS5hMzA9MTAwMTk7ZS5hMzE9MTAwMjA7ZS5hMzI9MTAwMjE7ZS5hMzM9MTAwMjI7ZS5hMzQ9MTAwMjM7ZS5hMzU9OTczMztlLmEzNj0xMDAyNTtlLmEzNz0xMDAyNjtlLmEzOD0xMDAyNztlLmEzOT0xMDAyODtlLmE0MD0xMDAyOTtlLmE0MT0xMDAzMDtlLmE0Mj0xMDAzMTtlLmE0Mz0xMDAzMjtlLmE0ND0xMDAzMztlLmE0NT0xMDAzNDtlLmE0Nj0xMDAzNTtlLmE0Nz0xMDAzNjtlLmE0OD0xMDAzNztlLmE0OT0xMDAzODtlLmE1MD0xMDAzOTtlLmE1MT0xMDA0MDtlLmE1Mj0xMDA0MTtlLmE1Mz0xMDA0MjtlLmE1ND0xMDA0MztlLmE1NT0xMDA0NDtlLmE1Nj0xMDA0NTtlLmE1Nz0xMDA0NjtlLmE1OD0xMDA0NztlLmE1OT0xMDA0ODtlLmE2MD0xMDA0OTtlLmE2MT0xMDA1MDtlLmE2Mj0xMDA1MTtlLmE2Mz0xMDA1MjtlLmE2ND0xMDA1MztlLmE2NT0xMDA1NDtlLmE2Nj0xMDA1NTtlLmE2Nz0xMDA1NjtlLmE2OD0xMDA1NztlLmE2OT0xMDA1ODtlLmE3MD0xMDA1OTtlLmE3MT05Njc5O2UuYTcyPTEwMDYxO2UuYTczPTk2MzI7ZS5hNzQ9MTAwNjM7ZS5hMjAzPTEwMDY0O2UuYTc1PTEwMDY1O2UuYTIwND0xMDA2NjtlLmE3Nj05NjUwO2UuYTc3PTk2NjA7ZS5hNzg9OTY3MDtlLmE3OT0xMDA3MDtlLmE4MT05Njg3O2UuYTgyPTEwMDcyO2UuYTgzPTEwMDczO2UuYTg0PTEwMDc0O2UuYTk3PTEwMDc1O2UuYTk4PTEwMDc2O2UuYTk5PTEwMDc3O2UuYTEwMD0xMDA3ODtlLmExMDE9MTAwODE7ZS5hMTAyPTEwMDgyO2UuYTEwMz0xMDA4MztlLmExMDQ9MTAwODQ7ZS5hMTA2PTEwMDg1O2UuYTEwNz0xMDA4NjtlLmExMDg9MTAwODc7ZS5hMTEyPTk4Mjc7ZS5hMTExPTk4MzA7ZS5hMTEwPTk4Mjk7ZS5hMTA5PTk4MjQ7ZS5hMTIwPTkzMTI7ZS5hMTIxPTkzMTM7ZS5hMTIyPTkzMTQ7ZS5hMTIzPTkzMTU7ZS5hMTI0PTkzMTY7ZS5hMTI1PTkzMTc7ZS5hMTI2PTkzMTg7ZS5hMTI3PTkzMTk7ZS5hMTI4PTkzMjA7ZS5hMTI5PTkzMjE7ZS5hMTMwPTEwMTAyO2UuYTEzMT0xMDEwMztlLmExMzI9MTAxMDQ7ZS5hMTMzPTEwMTA1O2UuYTEzND0xMDEwNjtlLmExMzU9MTAxMDc7ZS5hMTM2PTEwMTA4O2UuYTEzNz0xMDEwOTtlLmExMzg9MTAxMTA7ZS5hMTM5PTEwMTExO2UuYTE0MD0xMDExMjtlLmExNDE9MTAxMTM7ZS5hMTQyPTEwMTE0O2UuYTE0Mz0xMDExNTtlLmExNDQ9MTAxMTY7ZS5hMTQ1PTEwMTE3O2UuYTE0Nj0xMDExODtlLmExNDc9MTAxMTk7ZS5hMTQ4PTEwMTIwO2UuYTE0OT0xMDEyMTtlLmExNTA9MTAxMjI7ZS5hMTUxPTEwMTIzO2UuYTE1Mj0xMDEyNDtlLmExNTM9MTAxMjU7ZS5hMTU0PTEwMTI2O2UuYTE1NT0xMDEyNztlLmExNTY9MTAxMjg7ZS5hMTU3PTEwMTI5O2UuYTE1OD0xMDEzMDtlLmExNTk9MTAxMzE7ZS5hMTYwPTEwMTMyO2UuYTE2MT04NTk0O2UuYTE2Mz04NTk2O2UuYTE2ND04NTk3O2UuYTE5Nj0xMDEzNjtlLmExNjU9MTAxMzc7ZS5hMTkyPTEwMTM4O2UuYTE2Nj0xMDEzOTtlLmExNjc9MTAxNDA7ZS5hMTY4PTEwMTQxO2UuYTE2OT0xMDE0MjtlLmExNzA9MTAxNDM7ZS5hMTcxPTEwMTQ0O2UuYTE3Mj0xMDE0NTtlLmExNzM9MTAxNDY7ZS5hMTYyPTEwMTQ3O2UuYTE3ND0xMDE0ODtlLmExNzU9MTAxNDk7ZS5hMTc2PTEwMTUwO2UuYTE3Nz0xMDE1MTtlLmExNzg9MTAxNTI7ZS5hMTc5PTEwMTUzO2UuYTE5Mz0xMDE1NDtlLmExODA9MTAxNTU7ZS5hMTk5PTEwMTU2O2UuYTE4MT0xMDE1NztlLmEyMDA9MTAxNTg7ZS5hMTgyPTEwMTU5O2UuYTIwMT0xMDE2MTtlLmExODM9MTAxNjI7ZS5hMTg0PTEwMTYzO2UuYTE5Nz0xMDE2NDtlLmExODU9MTAxNjU7ZS5hMTk0PTEwMTY2O2UuYTE5OD0xMDE2NztlLmExODY9MTAxNjg7ZS5hMTk1PTEwMTY5O2UuYTE4Nz0xMDE3MDtlLmExODg9MTAxNzE7ZS5hMTg5PTEwMTcyO2UuYTE5MD0xMDE3MztlLmExOTE9MTAxNzQ7ZS5hODk9MTAwODg7ZS5hOTA9MTAwODk7ZS5hOTM9MTAwOTA7ZS5hOTQ9MTAwOTE7ZS5hOTE9MTAwOTI7ZS5hOTI9MTAwOTM7ZS5hMjA1PTEwMDk0O2UuYTg1PTEwMDk1O2UuYTIwNj0xMDA5NjtlLmE4Nj0xMDA5NztlLmE4Nz0xMDA5ODtlLmE4OD0xMDA5OTtlLmE5NT0xMDEwMDtlLmE5Nj0xMDEwMTtlWyIubm90ZGVmIl09MH0pKX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjthLnIodCk7YS5kKHQse2NsZWFyVW5pY29kZUNhY2hlczooKT0+Y2xlYXJVbmljb2RlQ2FjaGVzLGdldENoYXJVbmljb2RlQ2F0ZWdvcnk6KCk9PmdldENoYXJVbmljb2RlQ2F0ZWdvcnksZ2V0VW5pY29kZUZvckdseXBoOigpPT5nZXRVbmljb2RlRm9yR2x5cGgsZ2V0VW5pY29kZVJhbmdlRm9yOigpPT5nZXRVbmljb2RlUmFuZ2VGb3IsbWFwU3BlY2lhbFVuaWNvZGVWYWx1ZXM6KCk9Pm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzfSk7Y29uc3Qgcj0oMCxhKDE0OSkuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZVs2MzcyMV09MTY5O2VbNjMxOTNdPTE2OTtlWzYzNzIwXT0xNzQ7ZVs2MzE5NF09MTc0O2VbNjM3MjJdPTg0ODI7ZVs2MzE5NV09ODQ4MjtlWzYzNzI5XT05MTI3O2VbNjM3MzBdPTkxMjg7ZVs2MzczMV09OTEyOTtlWzYzNzQwXT05MTMxO2VbNjM3NDFdPTkxMzI7ZVs2Mzc0Ml09OTEzMztlWzYzNzI2XT05MTIxO2VbNjM3MjddPTkxMjI7ZVs2MzcyOF09OTEyMztlWzYzNzM3XT05MTI0O2VbNjM3MzhdPTkxMjU7ZVs2MzczOV09OTEyNjtlWzYzNzIzXT05MTE1O2VbNjM3MjRdPTkxMTY7ZVs2MzcyNV09OTExNztlWzYzNzM0XT05MTE4O2VbNjM3MzVdPTkxMTk7ZVs2MzczNl09OTEyMH0pKTtmdW5jdGlvbiBtYXBTcGVjaWFsVW5pY29kZVZhbHVlcyhlKXtyZXR1cm4gZT49NjU1MjAmJmU8PTY1NTM1PzA6ZT49NjI5NzYmJmU8PTYzNzQzP3IoKVtlXXx8ZToxNzM9PT1lPzQ1OmV9ZnVuY3Rpb24gZ2V0VW5pY29kZUZvckdseXBoKGUsdCl7bGV0IGE9dFtlXTtpZih2b2lkIDAhPT1hKXJldHVybiBhO2lmKCFlKXJldHVybi0xO2lmKCJ1Ij09PWVbMF0pe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IHI7aWYoNz09PXQmJiJuIj09PWVbMV0mJiJpIj09PWVbMl0pcj1lLnN1YnN0cmluZygzKTtlbHNle2lmKCEodD49NSYmdDw9NykpcmV0dXJuLTE7cj1lLnN1YnN0cmluZygxKX1pZihyPT09ci50b1VwcGVyQ2FzZSgpKXthPXBhcnNlSW50KHIsMTYpO2lmKGE+PTApcmV0dXJuIGF9fXJldHVybi0xfWNvbnN0IG49W1swLDEyN10sWzEyOCwyNTVdLFsyNTYsMzgzXSxbMzg0LDU5MV0sWzU5Miw2ODcsNzQyNCw3NTUxLDc1NTIsNzYxNV0sWzY4OCw3NjcsNDI3NTIsNDI3ODNdLFs3NjgsODc5LDc2MTYsNzY3OV0sWzg4MCwxMDIzXSxbMTEzOTIsMTE1MTldLFsxMDI0LDEyNzksMTI4MCwxMzI3LDExNzQ0LDExNzc1LDQyNTYwLDQyNjU1XSxbMTMyOCwxNDIzXSxbMTQyNCwxNTM1XSxbNDIyNDAsNDI1NTldLFsxNTM2LDE3OTEsMTg3MiwxOTE5XSxbMTk4NCwyMDQ3XSxbMjMwNCwyNDMxXSxbMjQzMiwyNTU5XSxbMjU2MCwyNjg3XSxbMjY4OCwyODE1XSxbMjgxNiwyOTQzXSxbMjk0NCwzMDcxXSxbMzA3MiwzMTk5XSxbMzIwMCwzMzI3XSxbMzMyOCwzNDU1XSxbMzU4NCwzNzExXSxbMzcxMiwzODM5XSxbNDI1Niw0MzUxLDExNTIwLDExNTY3XSxbNjkxMiw3MDM5XSxbNDM1Miw0NjA3XSxbNzY4MCw3OTM1LDExMzYwLDExMzkxLDQyNzg0LDQzMDA3XSxbNzkzNiw4MTkxXSxbODE5Miw4MzAzLDExNzc2LDExOTAzXSxbODMwNCw4MzUxXSxbODM1Miw4Mzk5XSxbODQwMCw4NDQ3XSxbODQ0OCw4NTI3XSxbODUyOCw4NTkxXSxbODU5Miw4NzAzLDEwMjI0LDEwMjM5LDEwNDk2LDEwNjIzLDExMDA4LDExMjYzXSxbODcwNCw4OTU5LDEwNzUyLDExMDA3LDEwMTc2LDEwMjIzLDEwNjI0LDEwNzUxXSxbODk2MCw5MjE1XSxbOTIxNiw5Mjc5XSxbOTI4MCw5MzExXSxbOTMxMiw5NDcxXSxbOTQ3Miw5NTk5XSxbOTYwMCw5NjMxXSxbOTYzMiw5NzI3XSxbOTcyOCw5OTgzXSxbOTk4NCwxMDE3NV0sWzEyMjg4LDEyMzUxXSxbMTIzNTIsMTI0NDddLFsxMjQ0OCwxMjU0MywxMjc4NCwxMjc5OV0sWzEyNTQ0LDEyNTkxLDEyNzA0LDEyNzM1XSxbMTI1OTIsMTI2ODddLFs0MzA3Miw0MzEzNV0sWzEyODAwLDEzMDU1XSxbMTMwNTYsMTMzMTFdLFs0NDAzMiw1NTIxNV0sWzU1Mjk2LDU3MzQzXSxbNjc4NDAsNjc4NzFdLFsxOTk2OCw0MDk1OSwxMTkwNCwxMjAzMSwxMjAzMiwxMjI1NSwxMjI3MiwxMjI4NywxMzMxMiwxOTkwMywxMzEwNzIsMTczNzkxLDEyNjg4LDEyNzAzXSxbNTczNDQsNjM3NDNdLFsxMjczNiwxMjc4Myw2Mzc0NCw2NDI1NSwxOTQ1NjAsMTk1MTAzXSxbNjQyNTYsNjQzMzVdLFs2NDMzNiw2NTAyM10sWzY1MDU2LDY1MDcxXSxbNjUwNDAsNjUwNTVdLFs2NTEwNCw2NTEzNV0sWzY1MTM2LDY1Mjc5XSxbNjUyODAsNjU1MTldLFs2NTUyMCw2NTUzNV0sWzM4NDAsNDA5NV0sWzE3OTIsMTg3MV0sWzE5MjAsMTk4M10sWzM0NTYsMzU4M10sWzQwOTYsNDI1NV0sWzQ2MDgsNDk5MSw0OTkyLDUwMjMsMTE2NDgsMTE3NDNdLFs1MDI0LDUxMTldLFs1MTIwLDU3NTldLFs1NzYwLDU3OTFdLFs1NzkyLDU4ODddLFs2MDE2LDYxNDNdLFs2MTQ0LDYzMTldLFsxMDI0MCwxMDQ5NV0sWzQwOTYwLDQyMTI3XSxbNTg4OCw1OTE5LDU5MjAsNTk1MSw1OTUyLDU5ODMsNTk4NCw2MDE1XSxbNjYzMDQsNjYzNTFdLFs2NjM1Miw2NjM4M10sWzY2NTYwLDY2NjM5XSxbMTE4Nzg0LDExOTAzOSwxMTkwNDAsMTE5Mjk1LDExOTI5NiwxMTkzNzVdLFsxMTk4MDgsMTIwODMxXSxbMTA0NDQ4MCwxMDQ4NTczXSxbNjUwMjQsNjUwMzksOTE3NzYwLDkxNzk5OV0sWzkxNzUwNCw5MTc2MzFdLFs2NDAwLDY0NzldLFs2NDgwLDY1MjddLFs2NTI4LDY2MjNdLFs2NjU2LDY2ODddLFsxMTI2NCwxMTM1OV0sWzExNTY4LDExNjQ3XSxbMTk5MDQsMTk5NjddLFs0MzAwOCw0MzA1NV0sWzY1NTM2LDY1NjYzLDY1NjY0LDY1NzkxLDY1NzkyLDY1ODU1XSxbNjU4NTYsNjU5MzVdLFs2NjQzMiw2NjQ2M10sWzY2NDY0LDY2NTI3XSxbNjY2NDAsNjY2ODddLFs2NjY4OCw2NjczNV0sWzY3NTg0LDY3NjQ3XSxbNjgwOTYsNjgxOTFdLFsxMTk1NTIsMTE5NjQ3XSxbNzM3MjgsNzQ3NTEsNzQ3NTIsNzQ4NzldLFsxMTk2NDgsMTE5Njc5XSxbNzA0MCw3MTAzXSxbNzE2OCw3MjQ3XSxbNzI0OCw3Mjk1XSxbNDMxMzYsNDMyMzFdLFs0MzI2NCw0MzMxMV0sWzQzMzEyLDQzMzU5XSxbNDM1MjAsNDM2MTVdLFs2NTkzNiw2NTk5OV0sWzY2ZTMsNjYwNDddLFs2NjIwOCw2NjI3MSw2NjE3Niw2NjIwNyw2Nzg3Miw2NzkwM10sWzEyNzAyNCwxMjcxMzUsMTI2OTc2LDEyNzAyM11dO2Z1bmN0aW9uIGdldFVuaWNvZGVSYW5nZUZvcihlLHQ9LTEpe2lmKC0xIT09dCl7Y29uc3QgYT1uW3RdO2ZvcihsZXQgcj0wLG49YS5sZW5ndGg7cjxuO3IrPTIpaWYoZT49YVtyXSYmZTw9YVtyKzFdKXJldHVybiB0fWZvcihsZXQgdD0wLGE9bi5sZW5ndGg7dDxhO3QrKyl7Y29uc3QgYT1uW3RdO2ZvcihsZXQgcj0wLG49YS5sZW5ndGg7cjxuO3IrPTIpaWYoZT49YVtyXSYmZTw9YVtyKzFdKXJldHVybiB0fXJldHVybi0xfWNvbnN0IGk9bmV3IFJlZ0V4cCgiXihcXHMpfChcXHB7TW59KXwoXFxwe0NmfSkkIiwidSIpLHM9bmV3IE1hcDtmdW5jdGlvbiBnZXRDaGFyVW5pY29kZUNhdGVnb3J5KGUpe2NvbnN0IHQ9cy5nZXQoZSk7aWYodClyZXR1cm4gdDtjb25zdCBhPWUubWF0Y2goaSkscj17aXNXaGl0ZXNwYWNlOiEhYT8uWzFdLGlzWmVyb1dpZHRoRGlhY3JpdGljOiEhYT8uWzJdLGlzSW52aXNpYmxlRm9ybWF0TWFyazohIWE/LlszXX07cy5zZXQoZSxyKTtyZXR1cm4gcn1mdW5jdGlvbiBjbGVhclVuaWNvZGVDYWNoZXMoKXtzLmNsZWFyKCl9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmdldFNlcmlmRm9udHM9dC5nZXROb25TdGRGb250TWFwPXQuZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzPXQuZ2V0Rm9udE5hbWVUb0ZpbGVNYXA9dm9pZCAwO3QuZ2V0U3RhbmRhcmRGb250TmFtZT1mdW5jdGlvbiBnZXRTdGFuZGFyZEZvbnROYW1lKGUpe2NvbnN0IHQ9KDAsbi5ub3JtYWxpemVGb250TmFtZSkoZSk7cmV0dXJuIGkoKVt0XX07dC5nZXRTeW1ib2xzRm9udHM9dC5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmk9dC5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2s9dC5nZXRTdGRGb250TWFwPXZvaWQgMDt0LmlzS25vd25Gb250TmFtZT1mdW5jdGlvbiBpc0tub3duRm9udE5hbWUoZSl7Y29uc3QgdD0oMCxuLm5vcm1hbGl6ZUZvbnROYW1lKShlKTtyZXR1cm4hIShpKClbdF18fG8oKVt0XXx8YygpW3RdfHxsKClbdF0pfTt2YXIgcj1hKDE0OSksbj1hKDE4OCk7Y29uc3QgaT0oMCxyLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbIlRpbWVzLVJvbWFuIl09IlRpbWVzLVJvbWFuIjtlLkhlbHZldGljYT0iSGVsdmV0aWNhIjtlLkNvdXJpZXI9IkNvdXJpZXIiO2UuU3ltYm9sPSJTeW1ib2wiO2VbIlRpbWVzLUJvbGQiXT0iVGltZXMtQm9sZCI7ZVsiSGVsdmV0aWNhLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiO2VbIkNvdXJpZXItQm9sZCJdPSJDb3VyaWVyLUJvbGQiO2UuWmFwZkRpbmdiYXRzPSJaYXBmRGluZ2JhdHMiO2VbIlRpbWVzLUl0YWxpYyJdPSJUaW1lcy1JdGFsaWMiO2VbIkhlbHZldGljYS1PYmxpcXVlIl09IkhlbHZldGljYS1PYmxpcXVlIjtlWyJDb3VyaWVyLU9ibGlxdWUiXT0iQ291cmllci1PYmxpcXVlIjtlWyJUaW1lcy1Cb2xkSXRhbGljIl09IlRpbWVzLUJvbGRJdGFsaWMiO2VbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO2VbIkNvdXJpZXItQm9sZE9ibGlxdWUiXT0iQ291cmllci1Cb2xkT2JsaXF1ZSI7ZS5BcmlhbE5hcnJvdz0iSGVsdmV0aWNhIjtlWyJBcmlhbE5hcnJvdy1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjtlWyJBcmlhbE5hcnJvdy1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7ZVsiQXJpYWxOYXJyb3ctSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIjtlLkFyaWFsQmxhY2s9IkhlbHZldGljYSI7ZVsiQXJpYWxCbGFjay1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjtlWyJBcmlhbEJsYWNrLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjtlWyJBcmlhbEJsYWNrLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7ZVsiQXJpYWwtQmxhY2siXT0iSGVsdmV0aWNhIjtlWyJBcmlhbC1CbGFjay1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjtlWyJBcmlhbC1CbGFjay1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7ZVsiQXJpYWwtQmxhY2stSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIjtlLkFyaWFsPSJIZWx2ZXRpY2EiO2VbIkFyaWFsLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiO2VbIkFyaWFsLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjtlWyJBcmlhbC1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO2UuQXJpYWxNVD0iSGVsdmV0aWNhIjtlWyJBcmlhbC1Cb2xkSXRhbGljTVQiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjtlWyJBcmlhbC1Cb2xkTVQiXT0iSGVsdmV0aWNhLUJvbGQiO2VbIkFyaWFsLUl0YWxpY01UIl09IkhlbHZldGljYS1PYmxpcXVlIjtlWyJBcmlhbC1Cb2xkSXRhbGljTVQtQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO2VbIkFyaWFsLUJvbGRNVC1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjtlWyJBcmlhbC1JdGFsaWNNVC1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO2UuQXJpYWxVbmljb2RlTVM9IkhlbHZldGljYSI7ZVsiQXJpYWxVbmljb2RlTVMtQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCI7ZVsiQXJpYWxVbmljb2RlTVMtQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO2VbIkFyaWFsVW5pY29kZU1TLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7ZVsiQ291cmllci1Cb2xkSXRhbGljIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiO2VbIkNvdXJpZXItSXRhbGljIl09IkNvdXJpZXItT2JsaXF1ZSI7ZS5Db3VyaWVyTmV3PSJDb3VyaWVyIjtlWyJDb3VyaWVyTmV3LUJvbGQiXT0iQ291cmllci1Cb2xkIjtlWyJDb3VyaWVyTmV3LUJvbGRJdGFsaWMiXT0iQ291cmllci1Cb2xkT2JsaXF1ZSI7ZVsiQ291cmllck5ldy1JdGFsaWMiXT0iQ291cmllci1PYmxpcXVlIjtlWyJDb3VyaWVyTmV3UFMtQm9sZEl0YWxpY01UIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiO2VbIkNvdXJpZXJOZXdQUy1Cb2xkTVQiXT0iQ291cmllci1Cb2xkIjtlWyJDb3VyaWVyTmV3UFMtSXRhbGljTVQiXT0iQ291cmllci1PYmxpcXVlIjtlLkNvdXJpZXJOZXdQU01UPSJDb3VyaWVyIjtlWyJIZWx2ZXRpY2EtQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiO2VbIkhlbHZldGljYS1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO2VbIlN5bWJvbC1Cb2xkIl09IlN5bWJvbCI7ZVsiU3ltYm9sLUJvbGRJdGFsaWMiXT0iU3ltYm9sIjtlWyJTeW1ib2wtSXRhbGljIl09IlN5bWJvbCI7ZS5UaW1lc05ld1JvbWFuPSJUaW1lcy1Sb21hbiI7ZVsiVGltZXNOZXdSb21hbi1Cb2xkIl09IlRpbWVzLUJvbGQiO2VbIlRpbWVzTmV3Um9tYW4tQm9sZEl0YWxpYyJdPSJUaW1lcy1Cb2xkSXRhbGljIjtlWyJUaW1lc05ld1JvbWFuLUl0YWxpYyJdPSJUaW1lcy1JdGFsaWMiO2UuVGltZXNOZXdSb21hblBTPSJUaW1lcy1Sb21hbiI7ZVsiVGltZXNOZXdSb21hblBTLUJvbGQiXT0iVGltZXMtQm9sZCI7ZVsiVGltZXNOZXdSb21hblBTLUJvbGRJdGFsaWMiXT0iVGltZXMtQm9sZEl0YWxpYyI7ZVsiVGltZXNOZXdSb21hblBTLUJvbGRJdGFsaWNNVCJdPSJUaW1lcy1Cb2xkSXRhbGljIjtlWyJUaW1lc05ld1JvbWFuUFMtQm9sZE1UIl09IlRpbWVzLUJvbGQiO2VbIlRpbWVzTmV3Um9tYW5QUy1JdGFsaWMiXT0iVGltZXMtSXRhbGljIjtlWyJUaW1lc05ld1JvbWFuUFMtSXRhbGljTVQiXT0iVGltZXMtSXRhbGljIjtlLlRpbWVzTmV3Um9tYW5QU01UPSJUaW1lcy1Sb21hbiI7ZVsiVGltZXNOZXdSb21hblBTTVQtQm9sZCJdPSJUaW1lcy1Cb2xkIjtlWyJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkSXRhbGljIl09IlRpbWVzLUJvbGRJdGFsaWMiO2VbIlRpbWVzTmV3Um9tYW5QU01ULUl0YWxpYyJdPSJUaW1lcy1JdGFsaWMifSkpO3QuZ2V0U3RkRm9udE1hcD1pO2NvbnN0IHM9KDAsci5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkNvdXJpZXI9IkZveGl0Rml4ZWQucGZiIjtlWyJDb3VyaWVyLUJvbGQiXT0iRm94aXRGaXhlZEJvbGQucGZiIjtlWyJDb3VyaWVyLUJvbGRPYmxpcXVlIl09IkZveGl0Rml4ZWRCb2xkSXRhbGljLnBmYiI7ZVsiQ291cmllci1PYmxpcXVlIl09IkZveGl0Rml4ZWRJdGFsaWMucGZiIjtlLkhlbHZldGljYT0iTGliZXJhdGlvblNhbnMtUmVndWxhci50dGYiO2VbIkhlbHZldGljYS1Cb2xkIl09IkxpYmVyYXRpb25TYW5zLUJvbGQudHRmIjtlWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXT0iTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiO2VbIkhlbHZldGljYS1PYmxpcXVlIl09IkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiO2VbIlRpbWVzLVJvbWFuIl09IkZveGl0U2VyaWYucGZiIjtlWyJUaW1lcy1Cb2xkIl09IkZveGl0U2VyaWZCb2xkLnBmYiI7ZVsiVGltZXMtQm9sZEl0YWxpYyJdPSJGb3hpdFNlcmlmQm9sZEl0YWxpYy5wZmIiO2VbIlRpbWVzLUl0YWxpYyJdPSJGb3hpdFNlcmlmSXRhbGljLnBmYiI7ZS5TeW1ib2w9IkZveGl0U3ltYm9sLnBmYiI7ZS5aYXBmRGluZ2JhdHM9IkZveGl0RGluZ2JhdHMucGZiIjtlWyJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIl09IkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIudHRmIjtlWyJMaWJlcmF0aW9uU2Fucy1Cb2xkIl09IkxpYmVyYXRpb25TYW5zLUJvbGQudHRmIjtlWyJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiXT0iTGliZXJhdGlvblNhbnMtSXRhbGljLnR0ZiI7ZVsiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyJdPSJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljLnR0ZiJ9KSk7dC5nZXRGb250TmFtZVRvRmlsZU1hcD1zO2NvbnN0IG89KDAsci5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkNhbGlicmk9IkhlbHZldGljYSI7ZVsiQ2FsaWJyaS1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIjtlWyJDYWxpYnJpLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjtlWyJDYWxpYnJpLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7ZS5DZW50dXJ5R290aGljPSJIZWx2ZXRpY2EiO2VbIkNlbnR1cnlHb3RoaWMtQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCI7ZVsiQ2VudHVyeUdvdGhpYy1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7ZVsiQ2VudHVyeUdvdGhpYy1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiO2UuQ29taWNTYW5zTVM9IkNvbWljIFNhbnMgTVMiO2VbIkNvbWljU2Fuc01TLUJvbGQiXT0iQ29taWMgU2FucyBNUy1Cb2xkIjtlWyJDb21pY1NhbnNNUy1Cb2xkSXRhbGljIl09IkNvbWljIFNhbnMgTVMtQm9sZEl0YWxpYyI7ZVsiQ29taWNTYW5zTVMtSXRhbGljIl09IkNvbWljIFNhbnMgTVMtSXRhbGljIjtlLkltcGFjdD0iSGVsdmV0aWNhIjtlWyJJdGNTeW1ib2wtQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCI7ZVsiSXRjU3ltYm9sLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjtlWyJJdGNTeW1ib2wtQm9vayJdPSJIZWx2ZXRpY2EiO2VbIkl0Y1N5bWJvbC1Cb29rSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIjtlWyJJdGNTeW1ib2wtTWVkaXVtIl09IkhlbHZldGljYSI7ZVsiSXRjU3ltYm9sLU1lZGl1bUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSI7ZS5MdWNpZGFDb25zb2xlPSJDb3VyaWVyIjtlWyJMdWNpZGFDb25zb2xlLUJvbGQiXT0iQ291cmllci1Cb2xkIjtlWyJMdWNpZGFDb25zb2xlLUJvbGRJdGFsaWMiXT0iQ291cmllci1Cb2xkT2JsaXF1ZSI7ZVsiTHVjaWRhQ29uc29sZS1JdGFsaWMiXT0iQ291cmllci1PYmxpcXVlIjtlWyJMdWNpZGFTYW5zLURlbWkiXT0iSGVsdmV0aWNhLUJvbGQiO2VbIk1TLUdvdGhpYyJdPSJNUyBHb3RoaWMiO2VbIk1TLUdvdGhpYy1Cb2xkIl09Ik1TIEdvdGhpYy1Cb2xkIjtlWyJNUy1Hb3RoaWMtQm9sZEl0YWxpYyJdPSJNUyBHb3RoaWMtQm9sZEl0YWxpYyI7ZVsiTVMtR290aGljLUl0YWxpYyJdPSJNUyBHb3RoaWMtSXRhbGljIjtlWyJNUy1NaW5jaG8iXT0iTVMgTWluY2hvIjtlWyJNUy1NaW5jaG8tQm9sZCJdPSJNUyBNaW5jaG8tQm9sZCI7ZVsiTVMtTWluY2hvLUJvbGRJdGFsaWMiXT0iTVMgTWluY2hvLUJvbGRJdGFsaWMiO2VbIk1TLU1pbmNoby1JdGFsaWMiXT0iTVMgTWluY2hvLUl0YWxpYyI7ZVsiTVMtUEdvdGhpYyJdPSJNUyBQR290aGljIjtlWyJNUy1QR290aGljLUJvbGQiXT0iTVMgUEdvdGhpYy1Cb2xkIjtlWyJNUy1QR290aGljLUJvbGRJdGFsaWMiXT0iTVMgUEdvdGhpYy1Cb2xkSXRhbGljIjtlWyJNUy1QR290aGljLUl0YWxpYyJdPSJNUyBQR290aGljLUl0YWxpYyI7ZVsiTVMtUE1pbmNobyJdPSJNUyBQTWluY2hvIjtlWyJNUy1QTWluY2hvLUJvbGQiXT0iTVMgUE1pbmNoby1Cb2xkIjtlWyJNUy1QTWluY2hvLUJvbGRJdGFsaWMiXT0iTVMgUE1pbmNoby1Cb2xkSXRhbGljIjtlWyJNUy1QTWluY2hvLUl0YWxpYyJdPSJNUyBQTWluY2hvLUl0YWxpYyI7ZS5OdXB0aWFsU2NyaXB0PSJUaW1lcy1JdGFsaWMiO2UuU2Vnb2VVSVN5bWJvbD0iSGVsdmV0aWNhIn0pKTt0LmdldE5vblN0ZEZvbnRNYXA9bztjb25zdCBjPSgwLHIuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZVsiQWRvYmUgSmVuc29uIl09ITA7ZVsiQWRvYmUgVGV4dCJdPSEwO2UuQWxiZXJ0dXM9ITA7ZS5BbGR1cz0hMDtlLkFsZXhhbmRyaWE9ITA7ZS5BbGdlcmlhbj0hMDtlWyJBbWVyaWNhbiBUeXBld3JpdGVyIl09ITA7ZS5BbnRpcXVhPSEwO2UuQXBleD0hMDtlLkFybm89ITA7ZS5Bc3Rlcj0hMDtlLkF1cm9yYT0hMDtlLkJhc2tlcnZpbGxlPSEwO2UuQmVsbD0hMDtlLkJlbWJvPSEwO2VbIkJlbWJvIFNjaG9vbGJvb2siXT0hMDtlLkJlbmd1aWF0PSEwO2VbIkJlcmtlbGV5IE9sZCBTdHlsZSJdPSEwO2VbIkJlcm5oYXJkIE1vZGVybiJdPSEwO2VbIkJlcnRob2xkIENpdHkiXT0hMDtlLkJvZG9uaT0hMDtlWyJCYXVlciBCb2RvbmkiXT0hMDtlWyJCb29rIEFudGlxdWEiXT0hMDtlLkJvb2ttYW49ITA7ZVsiQm9yZGVhdXggUm9tYW4iXT0hMDtlWyJDYWxpZm9ybmlhbiBGQiJdPSEwO2UuQ2FsaXN0bz0hMDtlLkNhbHZlcnQ9ITA7ZS5DYXBpdGFscz0hMDtlLkNhbWJyaWE9ITA7ZS5DYXJ0aWVyPSEwO2UuQ2FzbG9uPSEwO2UuQ2F0dWxsPSEwO2UuQ2VudGF1cj0hMDtlWyJDZW50dXJ5IE9sZCBTdHlsZSJdPSEwO2VbIkNlbnR1cnkgU2Nob29sYm9vayJdPSEwO2UuQ2hhcGFycmFsPSEwO2VbIkNoYXJpcyBTSUwiXT0hMDtlLkNoZWx0ZW5oYW09ITA7ZVsiQ2hvbGxhIFNsYWIiXT0hMDtlLkNsYXJlbmRvbj0hMDtlLkNsZWFyZmFjZT0hMDtlLkNvY2hpbj0hMDtlLkNvbG9ubmE9ITA7ZVsiQ29tcHV0ZXIgTW9kZXJuIl09ITA7ZVsiQ29uY3JldGUgUm9tYW4iXT0hMDtlLkNvbnN0YW50aWE9ITA7ZVsiQ29vcGVyIEJsYWNrIl09ITA7ZS5Db3JvbmE9ITA7ZS5FY290eXBlPSEwO2UuRWd5cHRpZW5uZT0hMDtlLkVsZXBoYW50PSEwO2UuRXhjZWxzaW9yPSEwO2UuRmFpcmZpZWxkPSEwO2VbIkZGIFNjYWxhIl09ITA7ZS5Gb2xrYXJkPSEwO2UuRm9vdGxpZ2h0PSEwO2UuRnJlZVNlcmlmPSEwO2VbIkZyaXogUXVhZHJhdGEiXT0hMDtlLkdhcmFtb25kPSEwO2UuR2VudGl1bT0hMDtlLkdlb3JnaWE9ITA7ZS5HbG91Y2VzdGVyPSEwO2VbIkdvdWR5IE9sZCBTdHlsZSJdPSEwO2VbIkdvdWR5IFNjaG9vbGJvb2siXT0hMDtlWyJHb3VkeSBQcm8gRm9udCJdPSEwO2UuR3Jhbmpvbj0hMDtlWyJHdWFyZGlhbiBFZ3lwdGlhbiJdPSEwO2UuSGVhdGhlcj0hMDtlLkhlcmN1bGVzPSEwO2VbIkhpZ2ggVG93ZXIgVGV4dCJdPSEwO2UuSGlyb3NoaWdlPSEwO2VbIkhvZWZsZXIgVGV4dCJdPSEwO2VbIkh1bWFuYSBTZXJpZiJdPSEwO2UuSW1wcmludD0hMDtlWyJJb25pYyBOby4gNSJdPSEwO2UuSmFuc29uPSEwO2UuSm9hbm5hPSEwO2UuS29yaW5uYT0hMDtlLkxleGljb249ITA7ZS5MaWJlcmF0aW9uU2VyaWY9ITA7ZVsiTGliZXJhdGlvbiBTZXJpZiJdPSEwO2VbIkxpbnV4IExpYmVydGluZSJdPSEwO2UuTGl0ZXJhdHVybmF5YT0hMDtlLkx1Y2lkYT0hMDtlWyJMdWNpZGEgQnJpZ2h0Il09ITA7ZS5NZWxpb3I9ITA7ZS5NZW1waGlzPSEwO2UuTWlsbGVyPSEwO2UuTWluaW9uPSEwO2UuTW9kZXJuPSEwO2VbIk1vbmEgTGlzYSJdPSEwO2VbIk1ycyBFYXZlcyJdPSEwO2VbIk1TIFNlcmlmIl09ITA7ZVsiTXVzZW8gU2xhYiJdPSEwO2VbIk5ldyBZb3JrIl09ITA7ZVsiTmltYnVzIFJvbWFuIl09ITA7ZVsiTlBTIFJhd2xpbnNvbiBSb2Fkd2F5Il09ITA7ZS5OdXB0aWFsU2NyaXB0PSEwO2UuUGFsYXRpbm89ITA7ZS5QZXJwZXR1YT0hMDtlLlBsYW50aW49ITA7ZVsiUGxhbnRpbiBTY2hvb2xib29rIl09ITA7ZS5QbGF5YmlsbD0hMDtlWyJQb29yIFJpY2hhcmQiXT0hMDtlWyJSYXdsaW5zb24gUm9hZHdheSJdPSEwO2UuUmVuYXVsdD0hMDtlLlJlcXVpZW09ITA7ZS5Sb2Nrd2VsbD0hMDtlLlJvbWFuPSEwO2VbIlJvdGlzIFNlcmlmIl09ITA7ZS5TYWJvbj0hMDtlLlNjYWxhPSEwO2UuU2VhZ3VsbD0hMDtlLlNpc3RpbmE9ITA7ZS5Tb3V2ZW5pcj0hMDtlLlNUSVg9ITA7ZVsiU3RvbmUgSW5mb3JtYWwiXT0hMDtlWyJTdG9uZSBTZXJpZiJdPSEwO2UuU3lsZmFlbj0hMDtlLlRpbWVzPSEwO2UuVHJhamFuPSEwO2VbIlRyaW5pdMOpIl09ITA7ZVsiVHJ1bXAgTWVkaWFldmFsIl09ITA7ZS5VdG9waWE9ITA7ZVsiVmFsZSBUeXBlIl09ITA7ZVsiQml0c3RyZWFtIFZlcmEiXT0hMDtlWyJWZXJhIFNlcmlmIl09ITA7ZS5WZXJzYWlsbGVzPSEwO2UuV2FudGVkPSEwO2UuV2Vpc3M9ITA7ZVsiV2lkZSBMYXRpbiJdPSEwO2UuV2luZHNvcj0hMDtlLlhJVFM9ITB9KSk7dC5nZXRTZXJpZkZvbnRzPWM7Y29uc3QgbD0oMCxyLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2UuRGluZ2JhdHM9ITA7ZS5TeW1ib2w9ITA7ZS5aYXBmRGluZ2JhdHM9ITA7ZS5XaW5nZGluZ3M9ITA7ZVsiV2luZ2RpbmdzLUJvbGQiXT0hMDtlWyJXaW5nZGluZ3MtUmVndWxhciJdPSEwfSkpO3QuZ2V0U3ltYm9sc0ZvbnRzPWw7Y29uc3QgaD0oMCxyLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbMl09MTA7ZVszXT0zMjtlWzRdPTMzO2VbNV09MzQ7ZVs2XT0zNTtlWzddPTM2O2VbOF09Mzc7ZVs5XT0zODtlWzEwXT0zOTtlWzExXT00MDtlWzEyXT00MTtlWzEzXT00MjtlWzE0XT00MztlWzE1XT00NDtlWzE2XT00NTtlWzE3XT00NjtlWzE4XT00NztlWzE5XT00ODtlWzIwXT00OTtlWzIxXT01MDtlWzIyXT01MTtlWzIzXT01MjtlWzI0XT01MztlWzI1XT01NDtlWzI2XT01NTtlWzI3XT01NjtlWzI4XT01NztlWzI5XT01ODtlWzMwXT04OTQ7ZVszMV09NjA7ZVszMl09NjE7ZVszM109NjI7ZVszNF09NjM7ZVszNV09NjQ7ZVszNl09NjU7ZVszN109NjY7ZVszOF09Njc7ZVszOV09Njg7ZVs0MF09Njk7ZVs0MV09NzA7ZVs0Ml09NzE7ZVs0M109NzI7ZVs0NF09NzM7ZVs0NV09NzQ7ZVs0Nl09NzU7ZVs0N109NzY7ZVs0OF09Nzc7ZVs0OV09Nzg7ZVs1MF09Nzk7ZVs1MV09ODA7ZVs1Ml09ODE7ZVs1M109ODI7ZVs1NF09ODM7ZVs1NV09ODQ7ZVs1Nl09ODU7ZVs1N109ODY7ZVs1OF09ODc7ZVs1OV09ODg7ZVs2MF09ODk7ZVs2MV09OTA7ZVs2Ml09OTE7ZVs2M109OTI7ZVs2NF09OTM7ZVs2NV09OTQ7ZVs2Nl09OTU7ZVs2N109OTY7ZVs2OF09OTc7ZVs2OV09OTg7ZVs3MF09OTk7ZVs3MV09MTAwO2VbNzJdPTEwMTtlWzczXT0xMDI7ZVs3NF09MTAzO2VbNzVdPTEwNDtlWzc2XT0xMDU7ZVs3N109MTA2O2VbNzhdPTEwNztlWzc5XT0xMDg7ZVs4MF09MTA5O2VbODFdPTExMDtlWzgyXT0xMTE7ZVs4M109MTEyO2VbODRdPTExMztlWzg1XT0xMTQ7ZVs4Nl09MTE1O2VbODddPTExNjtlWzg4XT0xMTc7ZVs4OV09MTE4O2VbOTBdPTExOTtlWzkxXT0xMjA7ZVs5Ml09MTIxO2VbOTNdPTEyMjtlWzk0XT0xMjM7ZVs5NV09MTI0O2VbOTZdPTEyNTtlWzk3XT0xMjY7ZVs5OF09MTk2O2VbOTldPTE5NztlWzEwMF09MTk5O2VbMTAxXT0yMDE7ZVsxMDJdPTIwOTtlWzEwM109MjE0O2VbMTA0XT0yMjA7ZVsxMDVdPTIyNTtlWzEwNl09MjI0O2VbMTA3XT0yMjY7ZVsxMDhdPTIyODtlWzEwOV09MjI3O2VbMTEwXT0yMjk7ZVsxMTFdPTIzMTtlWzExMl09MjMzO2VbMTEzXT0yMzI7ZVsxMTRdPTIzNDtlWzExNV09MjM1O2VbMTE2XT0yMzc7ZVsxMTddPTIzNjtlWzExOF09MjM4O2VbMTE5XT0yMzk7ZVsxMjBdPTI0MTtlWzEyMV09MjQzO2VbMTIyXT0yNDI7ZVsxMjNdPTI0NDtlWzEyNF09MjQ2O2VbMTI1XT0yNDU7ZVsxMjZdPTI1MDtlWzEyN109MjQ5O2VbMTI4XT0yNTE7ZVsxMjldPTI1MjtlWzEzMF09ODIyNDtlWzEzMV09MTc2O2VbMTMyXT0xNjI7ZVsxMzNdPTE2MztlWzEzNF09MTY3O2VbMTM1XT04MjI2O2VbMTM2XT0xODI7ZVsxMzddPTIyMztlWzEzOF09MTc0O2VbMTM5XT0xNjk7ZVsxNDBdPTg0ODI7ZVsxNDFdPTE4MDtlWzE0Ml09MTY4O2VbMTQzXT04ODAwO2VbMTQ0XT0xOTg7ZVsxNDVdPTIxNjtlWzE0Nl09ODczNDtlWzE0N109MTc3O2VbMTQ4XT04ODA0O2VbMTQ5XT04ODA1O2VbMTUwXT0xNjU7ZVsxNTFdPTE4MTtlWzE1Ml09ODcwNjtlWzE1M109ODcyMTtlWzE1NF09ODcxOTtlWzE1Nl09ODc0NztlWzE1N109MTcwO2VbMTU4XT0xODY7ZVsxNTldPTg0ODY7ZVsxNjBdPTIzMDtlWzE2MV09MjQ4O2VbMTYyXT0xOTE7ZVsxNjNdPTE2MTtlWzE2NF09MTcyO2VbMTY1XT04NzMwO2VbMTY2XT00MDI7ZVsxNjddPTg3NzY7ZVsxNjhdPTg3MTA7ZVsxNjldPTE3MTtlWzE3MF09MTg3O2VbMTcxXT04MjMwO2VbMTc5XT04MjIwO2VbMTgwXT04MjIxO2VbMTgxXT04MjE2O2VbMTgyXT04MjE3O2VbMjAwXT0xOTM7ZVsyMDNdPTIwNTtlWzIwN109MjExO2VbMjEwXT0yMTg7ZVsyMjNdPTcxMTtlWzIyNF09MzIxO2VbMjI1XT0zMjI7ZVsyMjZdPTM1MjtlWzIyN109MzUzO2VbMjI4XT0zODE7ZVsyMjldPTM4MjtlWzIzM109MjIxO2VbMjM0XT0yNTM7ZVsyNTJdPTI2MztlWzI1M109MjY4O2VbMjU0XT0yNjk7ZVsyNThdPTI1ODtlWzI2MF09MjYwO2VbMjYxXT0yNjE7ZVsyNjVdPTI4MDtlWzI2Nl09MjgxO2VbMjY3XT0yODI7ZVsyNjhdPTI4MztlWzI2OV09MzEzO2VbMjc1XT0zMjM7ZVsyNzZdPTMyNDtlWzI3OF09MzI4O2VbMjgzXT0zNDQ7ZVsyODRdPTM0NTtlWzI4NV09MzQ2O2VbMjg2XT0zNDc7ZVsyOTJdPTM2NztlWzI5NV09Mzc3O2VbMjk2XT0zNzg7ZVsyOThdPTM4MDtlWzMwNV09OTYzO2VbMzA2XT05NjQ7ZVszMDddPTk2NjtlWzMwOF09ODIxNTtlWzMwOV09ODI1MjtlWzMxMF09ODMxOTtlWzMxMV09ODM1OTtlWzMxMl09ODU5MjtlWzMxM109ODU5MztlWzMzN109OTU1MjtlWzQ5M109MTAzOTtlWzQ5NF09MTA0MDtlWzY3Ml09MTQ4ODtlWzY3M109MTQ4OTtlWzY3NF09MTQ5MDtlWzY3NV09MTQ5MTtlWzY3Nl09MTQ5MjtlWzY3N109MTQ5MztlWzY3OF09MTQ5NDtlWzY3OV09MTQ5NTtlWzY4MF09MTQ5NjtlWzY4MV09MTQ5NztlWzY4Ml09MTQ5ODtlWzY4M109MTQ5OTtlWzY4NF09MTUwMDtlWzY4NV09MTUwMTtlWzY4Nl09MTUwMjtlWzY4N109MTUwMztlWzY4OF09MTUwNDtlWzY4OV09MTUwNTtlWzY5MF09MTUwNjtlWzY5MV09MTUwNztlWzY5Ml09MTUwODtlWzY5M109MTUwOTtlWzY5NF09MTUxMDtlWzY5NV09MTUxMTtlWzY5Nl09MTUxMjtlWzY5N109MTUxMztlWzY5OF09MTUxNDtlWzcwNV09MTUyNDtlWzcwNl09ODM2MjtlWzcxMF09NjQyODg7ZVs3MTFdPTY0Mjk4O2VbNzU5XT0xNjE3O2VbNzYxXT0xNzc2O2VbNzYzXT0xNzc4O2VbNzc1XT0xNjUyO2VbNzc3XT0xNzY0O2VbNzc4XT0xNzgwO2VbNzc5XT0xNzgxO2VbNzgwXT0xNzgyO2VbNzgyXT03NzE7ZVs3ODNdPTY0NzI2O2VbNzg2XT04MzYzO2VbNzg4XT04NTMyO2VbNzkwXT03Njg7ZVs3OTFdPTc2OTtlWzc5Ml09NzY4O2VbNzk1XT04MDM7ZVs3OTddPTY0MzM2O2VbNzk4XT02NDMzNztlWzc5OV09NjQzNDI7ZVs4MDBdPTY0MzQzO2VbODAxXT02NDM0NDtlWzgwMl09NjQzNDU7ZVs4MDNdPTY0MzYyO2VbODA0XT02NDM2MztlWzgwNV09NjQzNjQ7ZVsyNDI0XT03ODIxO2VbMjQyNV09NzgyMjtlWzI0MjZdPTc4MjM7ZVsyNDI3XT03ODI0O2VbMjQyOF09NzgyNTtlWzI0MjldPTc4MjY7ZVsyNDMwXT03ODI3O2VbMjQzM109NzY4MjtlWzI2NzhdPTgwNDU7ZVsyNjc5XT04MDQ2O2VbMjgzMF09MTU1MjtlWzI4MzhdPTY4NjtlWzI4NDBdPTc1MTtlWzI4NDJdPTc1MztlWzI4NDNdPTc1NDtlWzI4NDRdPTc1NTtlWzI4NDZdPTc1NztlWzI4NTZdPTc2NztlWzI4NTddPTg0ODtlWzI4NThdPTg0OTtlWzI4NjJdPTg1MztlWzI4NjNdPTg1NDtlWzI4NjRdPTg1NTtlWzI4NjVdPTg2MTtlWzI4NjZdPTg2MjtlWzI5MDZdPTc0NjA7ZVsyOTA4XT03NDYyO2VbMjkwOV09NzQ2MztlWzI5MTBdPTc0NjQ7ZVsyOTEyXT03NDY2O2VbMjkxM109NzQ2NztlWzI5MTRdPTc0Njg7ZVsyOTE2XT03NDcwO2VbMjkxN109NzQ3MTtlWzI5MThdPTc0NzI7ZVsyOTIwXT03NDc0O2VbMjkyMV09NzQ3NTtlWzI5MjJdPTc0NzY7ZVsyOTI0XT03NDc4O2VbMjkyNV09NzQ3OTtlWzI5MjZdPTc0ODA7ZVsyOTI4XT03NDgyO2VbMjkyOV09NzQ4MztlWzI5MzBdPTc0ODQ7ZVsyOTMyXT03NDg2O2VbMjkzM109NzQ4NztlWzI5MzRdPTc0ODg7ZVsyOTM2XT03NDkwO2VbMjkzN109NzQ5MTtlWzI5MzhdPTc0OTI7ZVsyOTQwXT03NDk0O2VbMjk0MV09NzQ5NTtlWzI5NDJdPTc0OTY7ZVsyOTQ0XT03NDk4O2VbMjk0Nl09NzUwMDtlWzI5NDhdPTc1MDI7ZVsyOTUwXT03NTA0O2VbMjk1MV09NzUwNTtlWzI5NTJdPTc1MDY7ZVsyOTU0XT03NTA4O2VbMjk1NV09NzUwOTtlWzI5NTZdPTc1MTA7ZVsyOTU4XT03NTEyO2VbMjk1OV09NzUxMztlWzI5NjBdPTc1MTQ7ZVsyOTYyXT03NTE2O2VbMjk2M109NzUxNztlWzI5NjRdPTc1MTg7ZVsyOTY2XT03NTIwO2VbMjk2N109NzUyMTtlWzI5NjhdPTc1MjI7ZVsyOTcwXT03NTI0O2VbMjk3MV09NzUyNTtlWzI5NzJdPTc1MjY7ZVsyOTc0XT03NTI4O2VbMjk3NV09NzUyOTtlWzI5NzZdPTc1MzA7ZVsyOTc4XT0xNTM3O2VbMjk3OV09MTUzODtlWzI5ODBdPTE1Mzk7ZVsyOTgyXT0xNTQ5O2VbMjk4M109MTU1MTtlWzI5ODRdPTE1NTI7ZVsyOTg2XT0xNTU0O2VbMjk4N109MTU1NTtlWzI5ODhdPTE1NTY7ZVsyOTkwXT0xNjIzO2VbMjk5MV09MTYyNDtlWzI5OTVdPTE3NzU7ZVsyOTk5XT0xNzkxO2VbMzAwMl09NjQyOTA7ZVszMDAzXT02NDI5MTtlWzMwMDRdPTY0MjkyO2VbMzAwNl09NjQyOTQ7ZVszMDA3XT02NDI5NTtlWzMwMDhdPTY0Mjk2O2VbMzAxMV09MTkwMDtlWzMwMTRdPTgyMjM7ZVszMDE1XT04MjQ0O2VbMzAxN109NzUzMjtlWzMwMThdPTc1MzM7ZVszMDE5XT03NTM0O2VbMzA3NV09NzU5MDtlWzMwNzZdPTc1OTE7ZVszMDc5XT03NTk0O2VbMzA4MF09NzU5NTtlWzMwODNdPTc1OTg7ZVszMDg0XT03NTk5O2VbMzA4N109NzYwMjtlWzMwODhdPTc2MDM7ZVszMDkxXT03NjA2O2VbMzA5Ml09NzYwNztlWzMwOTVdPTc2MTA7ZVszMDk2XT03NjExO2VbMzA5OV09NzYxNDtlWzMxMDBdPTc2MTU7ZVszMTAzXT03NjE4O2VbMzEwNF09NzYxOTtlWzMxMDddPTgzMzc7ZVszMTA4XT04MzM4O2VbMzExNl09MTg4NDtlWzMxMTldPTE4ODU7ZVszMTIwXT0xODg1O2VbMzEyM109MTg4NjtlWzMxMjRdPTE4ODY7ZVszMTI3XT0xODg3O2VbMzEyOF09MTg4NztlWzMxMzFdPTE4ODg7ZVszMTMyXT0xODg4O2VbMzEzNV09MTg4OTtlWzMxMzZdPTE4ODk7ZVszMTM5XT0xODkwO2VbMzE0MF09MTg5MDtlWzMxNDNdPTE4OTE7ZVszMTQ0XT0xODkxO2VbMzE0N109MTg5MjtlWzMxNDhdPTE4OTI7ZVszMTUzXT01ODA7ZVszMTU0XT01ODE7ZVszMTU3XT01ODQ7ZVszMTU4XT01ODU7ZVszMTYxXT01ODg7ZVszMTYyXT01ODk7ZVszMTY1XT04OTE7ZVszMTY2XT04OTI7ZVszMTY5XT0xMjc0O2VbMzE3MF09MTI3NTtlWzMxNzNdPTEyNzg7ZVszMTc0XT0xMjc5O2VbMzE4MV09NzYyMjtlWzMxODJdPTc2MjM7ZVszMjgyXT0xMTc5OTtlWzMzMTZdPTU3ODtlWzMzNzldPTQyNzg1O2VbMzM5M109MTE1OTtlWzM0MTZdPTgzNzd9KSk7dC5nZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHM9aDtjb25zdCB1PSgwLHIuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZVsyMjddPTMyMjtlWzI2NF09MjYxO2VbMjkxXT0zNDZ9KSk7dC5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckFyaWFsQmxhY2s9dTtjb25zdCBkPSgwLHIuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZVsxXT0zMjtlWzRdPTY1O2VbNV09MTkyO2VbNl09MTkzO2VbOV09MTk2O2VbMTddPTY2O2VbMThdPTY3O2VbMjFdPTI2ODtlWzI0XT02ODtlWzI4XT02OTtlWzI5XT0yMDA7ZVszMF09MjAxO2VbMzJdPTI4MjtlWzM4XT03MDtlWzM5XT03MTtlWzQ0XT03MjtlWzQ3XT03MztlWzQ4XT0yMDQ7ZVs0OV09MjA1O2VbNThdPTc0O2VbNjBdPTc1O2VbNjJdPTc2O2VbNjhdPTc3O2VbNjldPTc4O2VbNzVdPTc5O2VbNzZdPTIxMDtlWzgwXT0yMTQ7ZVs4N109ODA7ZVs4OV09ODE7ZVs5MF09ODI7ZVs5Ml09MzQ0O2VbOTRdPTgzO2VbOTddPTM1MjtlWzEwMF09ODQ7ZVsxMDRdPTg1O2VbMTA5XT0yMjA7ZVsxMTVdPTg2O2VbMTE2XT04NztlWzEyMV09ODg7ZVsxMjJdPTg5O2VbMTI0XT0yMjE7ZVsxMjddPTkwO2VbMTI5XT0zODE7ZVsyNThdPTk3O2VbMjU5XT0yMjQ7ZVsyNjBdPTIyNTtlWzI2M109MjI4O2VbMjY4XT0yNjE7ZVsyNzFdPTk4O2VbMjcyXT05OTtlWzI3M109MjYzO2VbMjc1XT0yNjk7ZVsyODJdPTEwMDtlWzI4Nl09MTAxO2VbMjg3XT0yMzI7ZVsyODhdPTIzMztlWzI5MF09MjgzO2VbMjk1XT0yODE7ZVsyOTZdPTEwMjtlWzMzNl09MTAzO2VbMzQ2XT0xMDQ7ZVszNDldPTEwNTtlWzM1MF09MjM2O2VbMzUxXT0yMzc7ZVszNjFdPTEwNjtlWzM2NF09MTA3O2VbMzY3XT0xMDg7ZVszNzFdPTMyMjtlWzM3M109MTA5O2VbMzc0XT0xMTA7ZVszODFdPTExMTtlWzM4Ml09MjQyO2VbMzgzXT0yNDM7ZVszODZdPTI0NjtlWzM5M109MTEyO2VbMzk1XT0xMTM7ZVszOTZdPTExNDtlWzM5OF09MzQ1O2VbNDAwXT0xMTU7ZVs0MDFdPTM0NztlWzQwM109MzUzO2VbNDEwXT0xMTY7ZVs0MzddPTExNztlWzQ0Ml09MjUyO2VbNDQ4XT0xMTg7ZVs0NDldPTExOTtlWzQ1NF09MTIwO2VbNDU1XT0xMjE7ZVs0NTddPTI1MztlWzQ2MF09MTIyO2VbNDYyXT0zODI7ZVs0NjNdPTM4MDtlWzg1M109NDQ7ZVs4NTVdPTU4O2VbODU2XT00NjtlWzg3Nl09NDc7ZVs4NzhdPTQ1O2VbODgyXT00NTtlWzg5NF09NDA7ZVs4OTVdPTQxO2VbODk2XT05MTtlWzg5N109OTM7ZVs5MjNdPTY0O2VbMTAwNF09NDg7ZVsxMDA1XT00OTtlWzEwMDZdPTUwO2VbMTAwN109NTE7ZVsxMDA4XT01MjtlWzEwMDldPTUzO2VbMTAxMF09NTQ7ZVsxMDExXT01NTtlWzEwMTJdPTU2O2VbMTAxM109NTc7ZVsxMDgxXT0zNztlWzEwODVdPTQzO2VbMTA4Nl09NDV9KSk7dC5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmk9ZH0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5Ub1VuaWNvZGVNYXA9dC5JZGVudGl0eVRvVW5pY29kZU1hcD12b2lkIDA7dmFyIHI9YSgxNDQpO3QuVG9Vbmljb2RlTWFwPWNsYXNzIFRvVW5pY29kZU1hcHtjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXTt0aGlzLl9tYXA9ZX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuX21hcC5sZW5ndGh9Zm9yRWFjaChlKXtmb3IoY29uc3QgdCBpbiB0aGlzLl9tYXApZSh0LHRoaXMuX21hcFt0XS5jaGFyQ29kZUF0KDApKX1oYXMoZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX21hcFtlXX1nZXQoZSl7cmV0dXJuIHRoaXMuX21hcFtlXX1jaGFyQ29kZU9mKGUpe2NvbnN0IHQ9dGhpcy5fbWFwO2lmKHQubGVuZ3RoPD02NTUzNilyZXR1cm4gdC5pbmRleE9mKGUpO2Zvcihjb25zdCBhIGluIHQpaWYodFthXT09PWUpcmV0dXJuIDB8YTtyZXR1cm4tMX1hbWVuZChlKXtmb3IoY29uc3QgdCBpbiBlKXRoaXMuX21hcFt0XT1lW3RdfX07dC5JZGVudGl0eVRvVW5pY29kZU1hcD1jbGFzcyBJZGVudGl0eVRvVW5pY29kZU1hcHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZmlyc3RDaGFyPWU7dGhpcy5sYXN0Q2hhcj10fWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5sYXN0Q2hhcisxLXRoaXMuZmlyc3RDaGFyfWZvckVhY2goZSl7Zm9yKGxldCB0PXRoaXMuZmlyc3RDaGFyLGE9dGhpcy5sYXN0Q2hhcjt0PD1hO3QrKyllKHQsdCl9aGFzKGUpe3JldHVybiB0aGlzLmZpcnN0Q2hhcjw9ZSYmZTw9dGhpcy5sYXN0Q2hhcn1nZXQoZSl7aWYodGhpcy5maXJzdENoYXI8PWUmJmU8PXRoaXMubGFzdENoYXIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZSl9Y2hhckNvZGVPZihlKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49dGhpcy5maXJzdENoYXImJmU8PXRoaXMubGFzdENoYXI/ZTotMX1hbWVuZChlKXsoMCxyLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGFtZW5kKCkiKX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkNGRkZvbnQ9dm9pZCAwO3ZhciByPWEoMTg1KSxuPWEoMTg4KSxpPWEoMTQ0KTt0LkNGRkZvbnQ9Y2xhc3MgQ0ZGRm9udHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMucHJvcGVydGllcz10O2NvbnN0IGE9bmV3IHIuQ0ZGUGFyc2VyKGUsdCxuLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7dGhpcy5jZmY9YS5wYXJzZSgpO3RoaXMuY2ZmLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTtjb25zdCBzPW5ldyByLkNGRkNvbXBpbGVyKHRoaXMuY2ZmKTt0aGlzLnNlYWNzPXRoaXMuY2ZmLnNlYWNzO3RyeXt0aGlzLmRhdGE9cy5jb21waWxlKCl9Y2F0Y2h7KDAsaS53YXJuKSgiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiK3QubG9hZGVkTmFtZSk7dGhpcy5kYXRhPWV9dGhpcy5fY3JlYXRlQnVpbHRJbkVuY29kaW5nKCl9Z2V0IG51bUdseXBocygpe3JldHVybiB0aGlzLmNmZi5jaGFyU3RyaW5ncy5jb3VudH1nZXRDaGFyc2V0KCl7cmV0dXJuIHRoaXMuY2ZmLmNoYXJzZXQuY2hhcnNldH1nZXRHbHlwaE1hcHBpbmcoKXtjb25zdCBlPXRoaXMuY2ZmLHQ9dGhpcy5wcm9wZXJ0aWVzLHtjaWRUb0dpZE1hcDphLGNNYXA6cn09dCxpPWUuY2hhcnNldC5jaGFyc2V0O2xldCBzLG87aWYodC5jb21wb3NpdGUpe2xldCB0LG47aWYoYT8ubGVuZ3RoPjApe3Q9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IGU9MCxyPWEubGVuZ3RoO2U8cjtlKyspe2NvbnN0IHI9YVtlXTt2b2lkIDAhPT1yJiYodFtyXT1lKX19cz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGUuaXNDSURGb250KWZvcihvPTA7bzxpLmxlbmd0aDtvKyspe2NvbnN0IGU9aVtvXTtuPXIuY2hhckNvZGVPZihlKTt2b2lkIDAhPT10Py5bbl0mJihuPXRbbl0pO3Nbbl09b31lbHNlIGZvcihvPTA7bzxlLmNoYXJTdHJpbmdzLmNvdW50O28rKyl7bj1yLmNoYXJDb2RlT2Yobyk7c1tuXT1vfXJldHVybiBzfWxldCBjPWUuZW5jb2Rpbmc/ZS5lbmNvZGluZy5lbmNvZGluZzpudWxsO3QuaXNJbnRlcm5hbEZvbnQmJihjPXQuZGVmYXVsdEVuY29kaW5nKTtzPSgwLG4udHlwZTFGb250R2x5cGhNYXBwaW5nKSh0LGMsaSk7cmV0dXJuIHN9aGFzR2x5cGhJZChlKXtyZXR1cm4gdGhpcy5jZmYuaGFzR2x5cGhJZChlKX1fY3JlYXRlQnVpbHRJbkVuY29kaW5nKCl7Y29uc3R7Y2hhcnNldDplLGVuY29kaW5nOnR9PXRoaXMuY2ZmO2lmKCFlfHwhdClyZXR1cm47Y29uc3QgYT1lLmNoYXJzZXQscj10LmVuY29kaW5nLG49W107Zm9yKGNvbnN0IGUgaW4gcil7Y29uc3QgdD1yW2VdO2lmKHQ+PTApe2NvbnN0IHI9YVt0XTtyJiYobltlXT1yKX19bi5sZW5ndGg+MCYmKHRoaXMucHJvcGVydGllcy5idWlsdEluRW5jb2Rpbmc9bil9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5Gb250UmVuZGVyZXJGYWN0b3J5PXZvaWQgMDthKDEzOSk7YSgxNTcpO2EoMTU5KTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7dmFyIHI9YSgxNDQpLG49YSgxODUpLGk9YSgxODkpLHM9YSgxODcpLG89YSgxNTQpO2Z1bmN0aW9uIGdldFVpbnQzMihlLHQpe3JldHVybihlW3RdPDwyNHxlW3QrMV08PDE2fGVbdCsyXTw8OHxlW3QrM10pPj4+MH1mdW5jdGlvbiBnZXRVaW50MTYoZSx0KXtyZXR1cm4gZVt0XTw8OHxlW3QrMV19ZnVuY3Rpb24gZ2V0SW50MTYoZSx0KXtyZXR1cm4oZVt0XTw8MjR8ZVt0KzFdPDwxNik+PjE2fWZ1bmN0aW9uIGdldEludDgoZSx0KXtyZXR1cm4gZVt0XTw8MjQ+PjI0fWZ1bmN0aW9uIGdldEZsb2F0MjE0KGUsdCl7cmV0dXJuIGdldEludDE2KGUsdCkvMTYzODR9ZnVuY3Rpb24gZ2V0U3Vicm91dGluZUJpYXMoZSl7Y29uc3QgdD1lLmxlbmd0aDtsZXQgYT0zMjc2ODt0PDEyNDA/YT0xMDc6dDwzMzkwMCYmKGE9MTEzMSk7cmV0dXJuIGF9ZnVuY3Rpb24gcGFyc2VDbWFwKGUsdCxhKXtjb25zdCBuPTE9PT1nZXRVaW50MTYoZSx0KzIpP2dldFVpbnQzMihlLHQrOCk6Z2V0VWludDMyKGUsdCsxNiksaT1nZXRVaW50MTYoZSx0K24pO2xldCBzLG8sYztpZig0PT09aSl7Z2V0VWludDE2KGUsdCtuKzIpO2NvbnN0IGE9Z2V0VWludDE2KGUsdCtuKzYpPj4xO289dCtuKzE0O3M9W107Zm9yKGM9MDtjPGE7YysrLG8rPTIpc1tjXT17ZW5kOmdldFVpbnQxNihlLG8pfTtvKz0yO2ZvcihjPTA7YzxhO2MrKyxvKz0yKXNbY10uc3RhcnQ9Z2V0VWludDE2KGUsbyk7Zm9yKGM9MDtjPGE7YysrLG8rPTIpc1tjXS5pZERlbHRhPWdldFVpbnQxNihlLG8pO2ZvcihjPTA7YzxhO2MrKyxvKz0yKXtsZXQgdD1nZXRVaW50MTYoZSxvKTtpZigwIT09dCl7c1tjXS5pZHM9W107Zm9yKGxldCBhPTAscj1zW2NdLmVuZC1zW2NdLnN0YXJ0KzE7YTxyO2ErKyl7c1tjXS5pZHNbYV09Z2V0VWludDE2KGUsbyt0KTt0Kz0yfX19cmV0dXJuIHN9aWYoMTI9PT1pKXtjb25zdCBhPWdldFVpbnQzMihlLHQrbisxMik7bz10K24rMTY7cz1bXTtmb3IoYz0wO2M8YTtjKyspe3Q9Z2V0VWludDMyKGUsbyk7cy5wdXNoKHtzdGFydDp0LGVuZDpnZXRVaW50MzIoZSxvKzQpLGlkRGVsdGE6Z2V0VWludDMyKGUsbys4KS10fSk7bys9MTJ9cmV0dXJuIHN9dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYHVuc3VwcG9ydGVkIGNtYXA6ICR7aX1gKX1mdW5jdGlvbiBwYXJzZUNmZihlLHQsYSxyKXtjb25zdCBpPW5ldyBuLkNGRlBhcnNlcihuZXcgby5TdHJlYW0oZSx0LGEtdCkse30scikucGFyc2UoKTtyZXR1cm57Z2x5cGhzOmkuY2hhclN0cmluZ3Mub2JqZWN0cyxzdWJyczppLnRvcERpY3QucHJpdmF0ZURpY3Q/LnN1YnJzSW5kZXg/Lm9iamVjdHMsZ3N1YnJzOmkuZ2xvYmFsU3VickluZGV4Py5vYmplY3RzLGlzQ0ZGQ0lERm9udDppLmlzQ0lERm9udCxmZFNlbGVjdDppLmZkU2VsZWN0LGZkQXJyYXk6aS5mZEFycmF5fX1mdW5jdGlvbiBsb29rdXBDbWFwKGUsdCl7Y29uc3QgYT10LmNvZGVQb2ludEF0KDApO2xldCByPTAsbj0wLGk9ZS5sZW5ndGgtMTtmb3IoO248aTspe2NvbnN0IHQ9bitpKzE+PjE7YTxlW3RdLnN0YXJ0P2k9dC0xOm49dH1lW25dLnN0YXJ0PD1hJiZhPD1lW25dLmVuZCYmKHI9ZVtuXS5pZERlbHRhKyhlW25dLmlkcz9lW25dLmlkc1thLWVbbl0uc3RhcnRdOmEpJjY1NTM1KTtyZXR1cm57Y2hhckNvZGU6YSxnbHlwaElkOnJ9fWZ1bmN0aW9uIGNvbXBpbGVHbHlmKGUsdCxhKXtmdW5jdGlvbiBtb3ZlVG8oZSxhKXt0LnB1c2goe2NtZDoibW92ZVRvIixhcmdzOltlLGFdfSl9ZnVuY3Rpb24gbGluZVRvKGUsYSl7dC5wdXNoKHtjbWQ6ImxpbmVUbyIsYXJnczpbZSxhXX0pfWZ1bmN0aW9uIHF1YWRyYXRpY0N1cnZlVG8oZSxhLHIsbil7dC5wdXNoKHtjbWQ6InF1YWRyYXRpY0N1cnZlVG8iLGFyZ3M6W2UsYSxyLG5dfSl9bGV0IHI9MDtjb25zdCBuPWdldEludDE2KGUscik7bGV0IGkscz0wLG89MDtyKz0xMDtpZihuPDApZG97aT1nZXRVaW50MTYoZSxyKTtjb25zdCBuPWdldFVpbnQxNihlLHIrMik7cis9NDtsZXQgYyxsO2lmKDEmaSl7aWYoMiZpKXtjPWdldEludDE2KGUscik7bD1nZXRJbnQxNihlLHIrMil9ZWxzZXtjPWdldFVpbnQxNihlLHIpO2w9Z2V0VWludDE2KGUscisyKX1yKz00fWVsc2UgaWYoMiZpKXtjPWdldEludDgoZSxyKyspO2w9Z2V0SW50OChlLHIrKyl9ZWxzZXtjPWVbcisrXTtsPWVbcisrXX1pZigyJmkpe3M9YztvPWx9ZWxzZXtzPTA7bz0wfWxldCBoPTEsdT0xLGQ9MCxmPTA7aWYoOCZpKXtoPXU9Z2V0RmxvYXQyMTQoZSxyKTtyKz0yfWVsc2UgaWYoNjQmaSl7aD1nZXRGbG9hdDIxNChlLHIpO3U9Z2V0RmxvYXQyMTQoZSxyKzIpO3IrPTR9ZWxzZSBpZigxMjgmaSl7aD1nZXRGbG9hdDIxNChlLHIpO2Q9Z2V0RmxvYXQyMTQoZSxyKzIpO2Y9Z2V0RmxvYXQyMTQoZSxyKzQpO3U9Z2V0RmxvYXQyMTQoZSxyKzYpO3IrPTh9Y29uc3QgZz1hLmdseXBoc1tuXTtpZihnKXt0LnB1c2goe2NtZDoic2F2ZSJ9LHtjbWQ6InRyYW5zZm9ybSIsYXJnczpbaCxkLGYsdSxzLG9dfSk7Y29tcGlsZUdseWYoZyx0LGEpO3QucHVzaCh7Y21kOiJyZXN0b3JlIn0pfX13aGlsZSgzMiZpKTtlbHNle2NvbnN0IHQ9W107bGV0IGEsYztmb3IoYT0wO2E8bjthKyspe3QucHVzaChnZXRVaW50MTYoZSxyKSk7cis9Mn1yKz0yK2dldFVpbnQxNihlLHIpO2NvbnN0IGw9dC5hdCgtMSkrMSxoPVtdO2Zvcig7aC5sZW5ndGg8bDspe2k9ZVtyKytdO2xldCB0PTE7OCZpJiYodCs9ZVtyKytdKTtmb3IoO3QtLSA+MDspaC5wdXNoKHtmbGFnczppfSl9Zm9yKGE9MDthPGw7YSsrKXtzd2l0Y2goMTgmaFthXS5mbGFncyl7Y2FzZSAwOnMrPWdldEludDE2KGUscik7cis9MjticmVhaztjYXNlIDI6cy09ZVtyKytdO2JyZWFrO2Nhc2UgMTg6cys9ZVtyKytdfWhbYV0ueD1zfWZvcihhPTA7YTxsO2ErKyl7c3dpdGNoKDM2JmhbYV0uZmxhZ3Mpe2Nhc2UgMDpvKz1nZXRJbnQxNihlLHIpO3IrPTI7YnJlYWs7Y2FzZSA0Om8tPWVbcisrXTticmVhaztjYXNlIDM2Om8rPWVbcisrXX1oW2FdLnk9b31sZXQgdT0wO2ZvcihyPTA7cjxuO3IrKyl7Y29uc3QgZT10W3JdLG49aC5zbGljZSh1LGUrMSk7aWYoMSZuWzBdLmZsYWdzKW4ucHVzaChuWzBdKTtlbHNlIGlmKDEmbi5hdCgtMSkuZmxhZ3Mpbi51bnNoaWZ0KG4uYXQoLTEpKTtlbHNle2NvbnN0IGU9e2ZsYWdzOjEseDooblswXS54K24uYXQoLTEpLngpLzIseTooblswXS55K24uYXQoLTEpLnkpLzJ9O24udW5zaGlmdChlKTtuLnB1c2goZSl9bW92ZVRvKG5bMF0ueCxuWzBdLnkpO2ZvcihhPTEsYz1uLmxlbmd0aDthPGM7YSsrKWlmKDEmblthXS5mbGFncylsaW5lVG8oblthXS54LG5bYV0ueSk7ZWxzZSBpZigxJm5bYSsxXS5mbGFncyl7cXVhZHJhdGljQ3VydmVUbyhuW2FdLngsblthXS55LG5bYSsxXS54LG5bYSsxXS55KTthKyt9ZWxzZSBxdWFkcmF0aWNDdXJ2ZVRvKG5bYV0ueCxuW2FdLnksKG5bYV0ueCtuW2ErMV0ueCkvMiwoblthXS55K25bYSsxXS55KS8yKTt1PWUrMX19fWZ1bmN0aW9uIGNvbXBpbGVDaGFyU3RyaW5nKGUsdCxhLG4pe2Z1bmN0aW9uIG1vdmVUbyhlLGEpe3QucHVzaCh7Y21kOiJtb3ZlVG8iLGFyZ3M6W2UsYV19KX1mdW5jdGlvbiBsaW5lVG8oZSxhKXt0LnB1c2goe2NtZDoibGluZVRvIixhcmdzOltlLGFdfSl9ZnVuY3Rpb24gYmV6aWVyQ3VydmVUbyhlLGEscixuLGkscyl7dC5wdXNoKHtjbWQ6ImJlemllckN1cnZlVG8iLGFyZ3M6W2UsYSxyLG4saSxzXX0pfWNvbnN0IGk9W107bGV0IG89MCxjPTAsbD0wOyFmdW5jdGlvbiBwYXJzZShlKXtsZXQgaD0wO2Zvcig7aDxlLmxlbmd0aDspe2xldCB1LGQsZixnLHAsbSxiLHksdyxTPSExLHg9ZVtoKytdO3N3aXRjaCh4KXtjYXNlIDE6Y2FzZSAzOmNhc2UgMTg6Y2FzZSAyMzpsKz1pLmxlbmd0aD4+MTtTPSEwO2JyZWFrO2Nhc2UgNDpjKz1pLnBvcCgpO21vdmVUbyhvLGMpO1M9ITA7YnJlYWs7Y2FzZSA1OmZvcig7aS5sZW5ndGg+MDspe28rPWkuc2hpZnQoKTtjKz1pLnNoaWZ0KCk7bGluZVRvKG8sYyl9YnJlYWs7Y2FzZSA2OmZvcig7aS5sZW5ndGg+MDspe28rPWkuc2hpZnQoKTtsaW5lVG8obyxjKTtpZigwPT09aS5sZW5ndGgpYnJlYWs7Yys9aS5zaGlmdCgpO2xpbmVUbyhvLGMpfWJyZWFrO2Nhc2UgNzpmb3IoO2kubGVuZ3RoPjA7KXtjKz1pLnNoaWZ0KCk7bGluZVRvKG8sYyk7aWYoMD09PWkubGVuZ3RoKWJyZWFrO28rPWkuc2hpZnQoKTtsaW5lVG8obyxjKX1icmVhaztjYXNlIDg6Zm9yKDtpLmxlbmd0aD4wOyl7dT1vK2kuc2hpZnQoKTtmPWMraS5zaGlmdCgpO2Q9dStpLnNoaWZ0KCk7Zz1mK2kuc2hpZnQoKTtvPWQraS5zaGlmdCgpO2M9ZytpLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LGYsZCxnLG8sYyl9YnJlYWs7Y2FzZSAxMDp5PWkucG9wKCk7dz1udWxsO2lmKGEuaXNDRkZDSURGb250KXtjb25zdCBlPWEuZmRTZWxlY3QuZ2V0RkRJbmRleChuKTtpZihlPj0wJiZlPGEuZmRBcnJheS5sZW5ndGgpe2NvbnN0IHQ9YS5mZEFycmF5W2VdO2xldCByO3QucHJpdmF0ZURpY3Q/LnN1YnJzSW5kZXgmJihyPXQucHJpdmF0ZURpY3Quc3VicnNJbmRleC5vYmplY3RzKTtpZihyKXt5Kz1nZXRTdWJyb3V0aW5lQmlhcyhyKTt3PXJbeV19fWVsc2UoMCxyLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKX1lbHNlIHc9YS5zdWJyc1t5K2Euc3VicnNCaWFzXTt3JiZwYXJzZSh3KTticmVhaztjYXNlIDExOnJldHVybjtjYXNlIDEyOng9ZVtoKytdO3N3aXRjaCh4KXtjYXNlIDM0OnU9bytpLnNoaWZ0KCk7ZD11K2kuc2hpZnQoKTtwPWMraS5zaGlmdCgpO289ZCtpLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LGMsZCxwLG8scCk7dT1vK2kuc2hpZnQoKTtkPXUraS5zaGlmdCgpO289ZCtpLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LHAsZCxjLG8sYyk7YnJlYWs7Y2FzZSAzNTp1PW8raS5zaGlmdCgpO2Y9YytpLnNoaWZ0KCk7ZD11K2kuc2hpZnQoKTtnPWYraS5zaGlmdCgpO289ZCtpLnNoaWZ0KCk7Yz1nK2kuc2hpZnQoKTtiZXppZXJDdXJ2ZVRvKHUsZixkLGcsbyxjKTt1PW8raS5zaGlmdCgpO2Y9YytpLnNoaWZ0KCk7ZD11K2kuc2hpZnQoKTtnPWYraS5zaGlmdCgpO289ZCtpLnNoaWZ0KCk7Yz1nK2kuc2hpZnQoKTtiZXppZXJDdXJ2ZVRvKHUsZixkLGcsbyxjKTtpLnBvcCgpO2JyZWFrO2Nhc2UgMzY6dT1vK2kuc2hpZnQoKTtwPWMraS5zaGlmdCgpO2Q9dStpLnNoaWZ0KCk7bT1wK2kuc2hpZnQoKTtvPWQraS5zaGlmdCgpO2JlemllckN1cnZlVG8odSxwLGQsbSxvLG0pO3U9bytpLnNoaWZ0KCk7ZD11K2kuc2hpZnQoKTtiPW0raS5zaGlmdCgpO289ZCtpLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LG0sZCxiLG8sYyk7YnJlYWs7Y2FzZSAzNzpjb25zdCBlPW8sdD1jO3U9bytpLnNoaWZ0KCk7Zj1jK2kuc2hpZnQoKTtkPXUraS5zaGlmdCgpO2c9ZitpLnNoaWZ0KCk7bz1kK2kuc2hpZnQoKTtjPWcraS5zaGlmdCgpO2JlemllckN1cnZlVG8odSxmLGQsZyxvLGMpO3U9bytpLnNoaWZ0KCk7Zj1jK2kuc2hpZnQoKTtkPXUraS5zaGlmdCgpO2c9ZitpLnNoaWZ0KCk7bz1kO2M9ZztNYXRoLmFicyhvLWUpPk1hdGguYWJzKGMtdCk/bys9aS5zaGlmdCgpOmMrPWkuc2hpZnQoKTtiZXppZXJDdXJ2ZVRvKHUsZixkLGcsbyxjKTticmVhaztkZWZhdWx0OnRocm93IG5ldyByLkZvcm1hdEVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAxMiAke3h9YCl9YnJlYWs7Y2FzZSAxNDppZihpLmxlbmd0aD49NCl7Y29uc3QgZT1pLnBvcCgpLHI9aS5wb3AoKTtjPWkucG9wKCk7bz1pLnBvcCgpO3QucHVzaCh7Y21kOiJzYXZlIn0se2NtZDoidHJhbnNsYXRlIixhcmdzOltvLGNdfSk7bGV0IG49bG9va3VwQ21hcChhLmNtYXAsU3RyaW5nLmZyb21DaGFyQ29kZShhLmdseXBoTmFtZU1hcFtzLlN0YW5kYXJkRW5jb2RpbmdbZV1dKSk7Y29tcGlsZUNoYXJTdHJpbmcoYS5nbHlwaHNbbi5nbHlwaElkXSx0LGEsbi5nbHlwaElkKTt0LnB1c2goe2NtZDoicmVzdG9yZSJ9KTtuPWxvb2t1cENtYXAoYS5jbWFwLFN0cmluZy5mcm9tQ2hhckNvZGUoYS5nbHlwaE5hbWVNYXBbcy5TdGFuZGFyZEVuY29kaW5nW3JdXSkpO2NvbXBpbGVDaGFyU3RyaW5nKGEuZ2x5cGhzW24uZ2x5cGhJZF0sdCxhLG4uZ2x5cGhJZCl9cmV0dXJuO2Nhc2UgMTk6Y2FzZSAyMDpsKz1pLmxlbmd0aD4+MTtoKz1sKzc+PjM7Uz0hMDticmVhaztjYXNlIDIxOmMrPWkucG9wKCk7bys9aS5wb3AoKTttb3ZlVG8obyxjKTtTPSEwO2JyZWFrO2Nhc2UgMjI6bys9aS5wb3AoKTttb3ZlVG8obyxjKTtTPSEwO2JyZWFrO2Nhc2UgMjQ6Zm9yKDtpLmxlbmd0aD4yOyl7dT1vK2kuc2hpZnQoKTtmPWMraS5zaGlmdCgpO2Q9dStpLnNoaWZ0KCk7Zz1mK2kuc2hpZnQoKTtvPWQraS5zaGlmdCgpO2M9ZytpLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LGYsZCxnLG8sYyl9bys9aS5zaGlmdCgpO2MrPWkuc2hpZnQoKTtsaW5lVG8obyxjKTticmVhaztjYXNlIDI1OmZvcig7aS5sZW5ndGg+Njspe28rPWkuc2hpZnQoKTtjKz1pLnNoaWZ0KCk7bGluZVRvKG8sYyl9dT1vK2kuc2hpZnQoKTtmPWMraS5zaGlmdCgpO2Q9dStpLnNoaWZ0KCk7Zz1mK2kuc2hpZnQoKTtvPWQraS5zaGlmdCgpO2M9ZytpLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LGYsZCxnLG8sYyk7YnJlYWs7Y2FzZSAyNjppLmxlbmd0aCUyJiYobys9aS5zaGlmdCgpKTtmb3IoO2kubGVuZ3RoPjA7KXt1PW87Zj1jK2kuc2hpZnQoKTtkPXUraS5zaGlmdCgpO2c9ZitpLnNoaWZ0KCk7bz1kO2M9ZytpLnNoaWZ0KCk7YmV6aWVyQ3VydmVUbyh1LGYsZCxnLG8sYyl9YnJlYWs7Y2FzZSAyNzppLmxlbmd0aCUyJiYoYys9aS5zaGlmdCgpKTtmb3IoO2kubGVuZ3RoPjA7KXt1PW8raS5zaGlmdCgpO2Y9YztkPXUraS5zaGlmdCgpO2c9ZitpLnNoaWZ0KCk7bz1kK2kuc2hpZnQoKTtjPWc7YmV6aWVyQ3VydmVUbyh1LGYsZCxnLG8sYyl9YnJlYWs7Y2FzZSAyODppLnB1c2goKGVbaF08PDI0fGVbaCsxXTw8MTYpPj4xNik7aCs9MjticmVhaztjYXNlIDI5Onk9aS5wb3AoKSthLmdzdWJyc0JpYXM7dz1hLmdzdWJyc1t5XTt3JiZwYXJzZSh3KTticmVhaztjYXNlIDMwOmZvcig7aS5sZW5ndGg+MDspe3U9bztmPWMraS5zaGlmdCgpO2Q9dStpLnNoaWZ0KCk7Zz1mK2kuc2hpZnQoKTtvPWQraS5zaGlmdCgpO2M9ZysoMT09PWkubGVuZ3RoP2kuc2hpZnQoKTowKTtiZXppZXJDdXJ2ZVRvKHUsZixkLGcsbyxjKTtpZigwPT09aS5sZW5ndGgpYnJlYWs7dT1vK2kuc2hpZnQoKTtmPWM7ZD11K2kuc2hpZnQoKTtnPWYraS5zaGlmdCgpO2M9ZytpLnNoaWZ0KCk7bz1kKygxPT09aS5sZW5ndGg/aS5zaGlmdCgpOjApO2JlemllckN1cnZlVG8odSxmLGQsZyxvLGMpfWJyZWFrO2Nhc2UgMzE6Zm9yKDtpLmxlbmd0aD4wOyl7dT1vK2kuc2hpZnQoKTtmPWM7ZD11K2kuc2hpZnQoKTtnPWYraS5zaGlmdCgpO2M9ZytpLnNoaWZ0KCk7bz1kKygxPT09aS5sZW5ndGg/aS5zaGlmdCgpOjApO2JlemllckN1cnZlVG8odSxmLGQsZyxvLGMpO2lmKDA9PT1pLmxlbmd0aClicmVhazt1PW87Zj1jK2kuc2hpZnQoKTtkPXUraS5zaGlmdCgpO2c9ZitpLnNoaWZ0KCk7bz1kK2kuc2hpZnQoKTtjPWcrKDE9PT1pLmxlbmd0aD9pLnNoaWZ0KCk6MCk7YmV6aWVyQ3VydmVUbyh1LGYsZCxnLG8sYyl9YnJlYWs7ZGVmYXVsdDppZih4PDMyKXRocm93IG5ldyByLkZvcm1hdEVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAke3h9YCk7aWYoeDwyNDcpaS5wdXNoKHgtMTM5KTtlbHNlIGlmKHg8MjUxKWkucHVzaCgyNTYqKHgtMjQ3KStlW2grK10rMTA4KTtlbHNlIGlmKHg8MjU1KWkucHVzaCgyNTYqLSh4LTI1MSktZVtoKytdLTEwOCk7ZWxzZXtpLnB1c2goKGVbaF08PDI0fGVbaCsxXTw8MTZ8ZVtoKzJdPDw4fGVbaCszXSkvNjU1MzYpO2grPTR9fVMmJihpLmxlbmd0aD0wKX19KGUpfWNvbnN0IGM9W107Y2xhc3MgQ29tcGlsZWRGb250e2NvbnN0cnVjdG9yKGUpe3RoaXMuY29uc3RydWN0b3I9PT1Db21waWxlZEZvbnQmJigwLHIudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBDb21waWxlZEZvbnQuIik7dGhpcy5mb250TWF0cml4PWU7dGhpcy5jb21waWxlZEdseXBocz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZD1PYmplY3QuY3JlYXRlKG51bGwpfWdldFBhdGhKcyhlKXtjb25zdHtjaGFyQ29kZTp0LGdseXBoSWQ6YX09bG9va3VwQ21hcCh0aGlzLmNtYXAsZSk7bGV0IHI9dGhpcy5jb21waWxlZEdseXBoc1thXTtpZighcil0cnl7cj10aGlzLmNvbXBpbGVHbHlwaCh0aGlzLmdseXBoc1thXSxhKTt0aGlzLmNvbXBpbGVkR2x5cGhzW2FdPXJ9Y2F0Y2goZSl7dGhpcy5jb21waWxlZEdseXBoc1thXT1jO3ZvaWQgMD09PXRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFt0XSYmKHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFt0XT1hKTt0aHJvdyBlfXZvaWQgMD09PXRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFt0XSYmKHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFt0XT1hKTtyZXR1cm4gcn1jb21waWxlR2x5cGgoZSx0KXtpZighZXx8MD09PWUubGVuZ3RofHwxND09PWVbMF0pcmV0dXJuIGM7bGV0IGE9dGhpcy5mb250TWF0cml4O2lmKHRoaXMuaXNDRkZDSURGb250KXtjb25zdCBlPXRoaXMuZmRTZWxlY3QuZ2V0RkRJbmRleCh0KTtpZihlPj0wJiZlPHRoaXMuZmRBcnJheS5sZW5ndGgpe2E9dGhpcy5mZEFycmF5W2VdLmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpfHxyLkZPTlRfSURFTlRJVFlfTUFUUklYfWVsc2UoMCxyLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKX1jb25zdCBuPVt7Y21kOiJzYXZlIn0se2NtZDoidHJhbnNmb3JtIixhcmdzOmEuc2xpY2UoKX0se2NtZDoic2NhbGUiLGFyZ3M6WyJzaXplIiwiLXNpemUiXX1dO3RoaXMuY29tcGlsZUdseXBoSW1wbChlLG4sdCk7bi5wdXNoKHtjbWQ6InJlc3RvcmUifSk7cmV0dXJuIG59Y29tcGlsZUdseXBoSW1wbCgpeygwLHIudW5yZWFjaGFibGUpKCJDaGlsZHJlbiBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcy4iKX1oYXNCdWlsdFBhdGgoZSl7Y29uc3R7Y2hhckNvZGU6dCxnbHlwaElkOmF9PWxvb2t1cENtYXAodGhpcy5jbWFwLGUpO3JldHVybiB2b2lkIDAhPT10aGlzLmNvbXBpbGVkR2x5cGhzW2FdJiZ2b2lkIDAhPT10aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbdF19fWNsYXNzIFRydWVUeXBlQ29tcGlsZWQgZXh0ZW5kcyBDb21waWxlZEZvbnR7Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKGF8fFs0ODhlLTYsMCwwLDQ4OGUtNiwwLDBdKTt0aGlzLmdseXBocz1lO3RoaXMuY21hcD10fWNvbXBpbGVHbHlwaEltcGwoZSx0KXtjb21waWxlR2x5ZihlLHQsdGhpcyl9fWNsYXNzIFR5cGUyQ29tcGlsZWQgZXh0ZW5kcyBDb21waWxlZEZvbnR7Y29uc3RydWN0b3IoZSx0LGEscil7c3VwZXIoYXx8Wy4wMDEsMCwwLC4wMDEsMCwwXSk7dGhpcy5nbHlwaHM9ZS5nbHlwaHM7dGhpcy5nc3VicnM9ZS5nc3VicnN8fFtdO3RoaXMuc3VicnM9ZS5zdWJyc3x8W107dGhpcy5jbWFwPXQ7dGhpcy5nbHlwaE5hbWVNYXA9cnx8KDAsaS5nZXRHbHlwaHNVbmljb2RlKSgpO3RoaXMuZ3N1YnJzQmlhcz1nZXRTdWJyb3V0aW5lQmlhcyh0aGlzLmdzdWJycyk7dGhpcy5zdWJyc0JpYXM9Z2V0U3Vicm91dGluZUJpYXModGhpcy5zdWJycyk7dGhpcy5pc0NGRkNJREZvbnQ9ZS5pc0NGRkNJREZvbnQ7dGhpcy5mZFNlbGVjdD1lLmZkU2VsZWN0O3RoaXMuZmRBcnJheT1lLmZkQXJyYXl9Y29tcGlsZUdseXBoSW1wbChlLHQsYSl7Y29tcGlsZUNoYXJTdHJpbmcoZSx0LHRoaXMsYSl9fXQuRm9udFJlbmRlcmVyRmFjdG9yeT1jbGFzcyBGb250UmVuZGVyZXJGYWN0b3J5e3N0YXRpYyBjcmVhdGUoZSx0KXtjb25zdCBhPW5ldyBVaW50OEFycmF5KGUuZGF0YSk7bGV0IG4saSxzLG8sYyxsO2NvbnN0IGg9Z2V0VWludDE2KGEsNCk7Zm9yKGxldCBlPTAsdT0xMjtlPGg7ZSsrLHUrPTE2KXtjb25zdCBlPSgwLHIuYnl0ZXNUb1N0cmluZykoYS5zdWJhcnJheSh1LHUrNCkpLGg9Z2V0VWludDMyKGEsdSs4KSxkPWdldFVpbnQzMihhLHUrMTIpO3N3aXRjaChlKXtjYXNlImNtYXAiOm49cGFyc2VDbWFwKGEsaCk7YnJlYWs7Y2FzZSJnbHlmIjppPWEuc3ViYXJyYXkoaCxoK2QpO2JyZWFrO2Nhc2UibG9jYSI6cz1hLnN1YmFycmF5KGgsaCtkKTticmVhaztjYXNlImhlYWQiOmw9Z2V0VWludDE2KGEsaCsxOCk7Yz1nZXRVaW50MTYoYSxoKzUwKTticmVhaztjYXNlIkNGRiAiOm89cGFyc2VDZmYoYSxoLGgrZCx0KX19aWYoaSl7Y29uc3QgdD1sP1sxL2wsMCwwLDEvbCwwLDBdOmUuZm9udE1hdHJpeDtyZXR1cm4gbmV3IFRydWVUeXBlQ29tcGlsZWQoZnVuY3Rpb24gcGFyc2VHbHlmVGFibGUoZSx0LGEpe2xldCByLG47aWYoYSl7cj00O249Z2V0VWludDMyfWVsc2V7cj0yO249KGUsdCk9PjIqZ2V0VWludDE2KGUsdCl9Y29uc3QgaT1bXTtsZXQgcz1uKHQsMCk7Zm9yKGxldCBhPXI7YTx0Lmxlbmd0aDthKz1yKXtjb25zdCByPW4odCxhKTtpLnB1c2goZS5zdWJhcnJheShzLHIpKTtzPXJ9cmV0dXJuIGl9KGkscyxjKSxuLHQpfXJldHVybiBuZXcgVHlwZTJDb21waWxlZChvLG4sZS5mb250TWF0cml4LGUuZ2x5cGhOYW1lTWFwKX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmdldE1ldHJpY3M9dC5nZXRGb250QmFzaWNNZXRyaWNzPXZvaWQgMDt2YXIgcj1hKDE0OSk7Y29uc3Qgbj0oMCxyLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2UuQ291cmllcj02MDA7ZVsiQ291cmllci1Cb2xkIl09NjAwO2VbIkNvdXJpZXItQm9sZE9ibGlxdWUiXT02MDA7ZVsiQ291cmllci1PYmxpcXVlIl09NjAwO2UuSGVsdmV0aWNhPSgwLHIuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0yNzg7ZS5leGNsYW09Mjc4O2UucXVvdGVkYmw9MzU1O2UubnVtYmVyc2lnbj01NTY7ZS5kb2xsYXI9NTU2O2UucGVyY2VudD04ODk7ZS5hbXBlcnNhbmQ9NjY3O2UucXVvdGVyaWdodD0yMjI7ZS5wYXJlbmxlZnQ9MzMzO2UucGFyZW5yaWdodD0zMzM7ZS5hc3Rlcmlzaz0zODk7ZS5wbHVzPTU4NDtlLmNvbW1hPTI3ODtlLmh5cGhlbj0zMzM7ZS5wZXJpb2Q9Mjc4O2Uuc2xhc2g9Mjc4O2UuemVybz01NTY7ZS5vbmU9NTU2O2UudHdvPTU1NjtlLnRocmVlPTU1NjtlLmZvdXI9NTU2O2UuZml2ZT01NTY7ZS5zaXg9NTU2O2Uuc2V2ZW49NTU2O2UuZWlnaHQ9NTU2O2UubmluZT01NTY7ZS5jb2xvbj0yNzg7ZS5zZW1pY29sb249Mjc4O2UubGVzcz01ODQ7ZS5lcXVhbD01ODQ7ZS5ncmVhdGVyPTU4NDtlLnF1ZXN0aW9uPTU1NjtlLmF0PTEwMTU7ZS5BPTY2NztlLkI9NjY3O2UuQz03MjI7ZS5EPTcyMjtlLkU9NjY3O2UuRj02MTE7ZS5HPTc3ODtlLkg9NzIyO2UuST0yNzg7ZS5KPTUwMDtlLks9NjY3O2UuTD01NTY7ZS5NPTgzMztlLk49NzIyO2UuTz03Nzg7ZS5QPTY2NztlLlE9Nzc4O2UuUj03MjI7ZS5TPTY2NztlLlQ9NjExO2UuVT03MjI7ZS5WPTY2NztlLlc9OTQ0O2UuWD02Njc7ZS5ZPTY2NztlLlo9NjExO2UuYnJhY2tldGxlZnQ9Mjc4O2UuYmFja3NsYXNoPTI3ODtlLmJyYWNrZXRyaWdodD0yNzg7ZS5hc2NpaWNpcmN1bT00Njk7ZS51bmRlcnNjb3JlPTU1NjtlLnF1b3RlbGVmdD0yMjI7ZS5hPTU1NjtlLmI9NTU2O2UuYz01MDA7ZS5kPTU1NjtlLmU9NTU2O2UuZj0yNzg7ZS5nPTU1NjtlLmg9NTU2O2UuaT0yMjI7ZS5qPTIyMjtlLms9NTAwO2UubD0yMjI7ZS5tPTgzMztlLm49NTU2O2Uubz01NTY7ZS5wPTU1NjtlLnE9NTU2O2Uucj0zMzM7ZS5zPTUwMDtlLnQ9Mjc4O2UudT01NTY7ZS52PTUwMDtlLnc9NzIyO2UueD01MDA7ZS55PTUwMDtlLno9NTAwO2UuYnJhY2VsZWZ0PTMzNDtlLmJhcj0yNjA7ZS5icmFjZXJpZ2h0PTMzNDtlLmFzY2lpdGlsZGU9NTg0O2UuZXhjbGFtZG93bj0zMzM7ZS5jZW50PTU1NjtlLnN0ZXJsaW5nPTU1NjtlLmZyYWN0aW9uPTE2NztlLnllbj01NTY7ZS5mbG9yaW49NTU2O2Uuc2VjdGlvbj01NTY7ZS5jdXJyZW5jeT01NTY7ZS5xdW90ZXNpbmdsZT0xOTE7ZS5xdW90ZWRibGxlZnQ9MzMzO2UuZ3VpbGxlbW90bGVmdD01NTY7ZS5ndWlsc2luZ2xsZWZ0PTMzMztlLmd1aWxzaW5nbHJpZ2h0PTMzMztlLmZpPTUwMDtlLmZsPTUwMDtlLmVuZGFzaD01NTY7ZS5kYWdnZXI9NTU2O2UuZGFnZ2VyZGJsPTU1NjtlLnBlcmlvZGNlbnRlcmVkPTI3ODtlLnBhcmFncmFwaD01Mzc7ZS5idWxsZXQ9MzUwO2UucXVvdGVzaW5nbGJhc2U9MjIyO2UucXVvdGVkYmxiYXNlPTMzMztlLnF1b3RlZGJscmlnaHQ9MzMzO2UuZ3VpbGxlbW90cmlnaHQ9NTU2O2UuZWxsaXBzaXM9MWUzO2UucGVydGhvdXNhbmQ9MWUzO2UucXVlc3Rpb25kb3duPTYxMTtlLmdyYXZlPTMzMztlLmFjdXRlPTMzMztlLmNpcmN1bWZsZXg9MzMzO2UudGlsZGU9MzMzO2UubWFjcm9uPTMzMztlLmJyZXZlPTMzMztlLmRvdGFjY2VudD0zMzM7ZS5kaWVyZXNpcz0zMzM7ZS5yaW5nPTMzMztlLmNlZGlsbGE9MzMzO2UuaHVuZ2FydW1sYXV0PTMzMztlLm9nb25laz0zMzM7ZS5jYXJvbj0zMzM7ZS5lbWRhc2g9MWUzO2UuQUU9MWUzO2Uub3JkZmVtaW5pbmU9MzcwO2UuTHNsYXNoPTU1NjtlLk9zbGFzaD03Nzg7ZS5PRT0xZTM7ZS5vcmRtYXNjdWxpbmU9MzY1O2UuYWU9ODg5O2UuZG90bGVzc2k9Mjc4O2UubHNsYXNoPTIyMjtlLm9zbGFzaD02MTE7ZS5vZT05NDQ7ZS5nZXJtYW5kYmxzPTYxMTtlLklkaWVyZXNpcz0yNzg7ZS5lYWN1dGU9NTU2O2UuYWJyZXZlPTU1NjtlLnVodW5nYXJ1bWxhdXQ9NTU2O2UuZWNhcm9uPTU1NjtlLllkaWVyZXNpcz02Njc7ZS5kaXZpZGU9NTg0O2UuWWFjdXRlPTY2NztlLkFjaXJjdW1mbGV4PTY2NztlLmFhY3V0ZT01NTY7ZS5VY2lyY3VtZmxleD03MjI7ZS55YWN1dGU9NTAwO2Uuc2NvbW1hYWNjZW50PTUwMDtlLmVjaXJjdW1mbGV4PTU1NjtlLlVyaW5nPTcyMjtlLlVkaWVyZXNpcz03MjI7ZS5hb2dvbmVrPTU1NjtlLlVhY3V0ZT03MjI7ZS51b2dvbmVrPTU1NjtlLkVkaWVyZXNpcz02Njc7ZS5EY3JvYXQ9NzIyO2UuY29tbWFhY2NlbnQ9MjUwO2UuY29weXJpZ2h0PTczNztlLkVtYWNyb249NjY3O2UuY2Nhcm9uPTUwMDtlLmFyaW5nPTU1NjtlLk5jb21tYWFjY2VudD03MjI7ZS5sYWN1dGU9MjIyO2UuYWdyYXZlPTU1NjtlLlRjb21tYWFjY2VudD02MTE7ZS5DYWN1dGU9NzIyO2UuYXRpbGRlPTU1NjtlLkVkb3RhY2NlbnQ9NjY3O2Uuc2Nhcm9uPTUwMDtlLnNjZWRpbGxhPTUwMDtlLmlhY3V0ZT0yNzg7ZS5sb3plbmdlPTQ3MTtlLlJjYXJvbj03MjI7ZS5HY29tbWFhY2NlbnQ9Nzc4O2UudWNpcmN1bWZsZXg9NTU2O2UuYWNpcmN1bWZsZXg9NTU2O2UuQW1hY3Jvbj02Njc7ZS5yY2Fyb249MzMzO2UuY2NlZGlsbGE9NTAwO2UuWmRvdGFjY2VudD02MTE7ZS5UaG9ybj02Njc7ZS5PbWFjcm9uPTc3ODtlLlJhY3V0ZT03MjI7ZS5TYWN1dGU9NjY3O2UuZGNhcm9uPTY0MztlLlVtYWNyb249NzIyO2UudXJpbmc9NTU2O2UudGhyZWVzdXBlcmlvcj0zMzM7ZS5PZ3JhdmU9Nzc4O2UuQWdyYXZlPTY2NztlLkFicmV2ZT02Njc7ZS5tdWx0aXBseT01ODQ7ZS51YWN1dGU9NTU2O2UuVGNhcm9uPTYxMTtlLnBhcnRpYWxkaWZmPTQ3NjtlLnlkaWVyZXNpcz01MDA7ZS5OYWN1dGU9NzIyO2UuaWNpcmN1bWZsZXg9Mjc4O2UuRWNpcmN1bWZsZXg9NjY3O2UuYWRpZXJlc2lzPTU1NjtlLmVkaWVyZXNpcz01NTY7ZS5jYWN1dGU9NTAwO2UubmFjdXRlPTU1NjtlLnVtYWNyb249NTU2O2UuTmNhcm9uPTcyMjtlLklhY3V0ZT0yNzg7ZS5wbHVzbWludXM9NTg0O2UuYnJva2VuYmFyPTI2MDtlLnJlZ2lzdGVyZWQ9NzM3O2UuR2JyZXZlPTc3ODtlLklkb3RhY2NlbnQ9Mjc4O2Uuc3VtbWF0aW9uPTYwMDtlLkVncmF2ZT02Njc7ZS5yYWN1dGU9MzMzO2Uub21hY3Jvbj01NTY7ZS5aYWN1dGU9NjExO2UuWmNhcm9uPTYxMTtlLmdyZWF0ZXJlcXVhbD01NDk7ZS5FdGg9NzIyO2UuQ2NlZGlsbGE9NzIyO2UubGNvbW1hYWNjZW50PTIyMjtlLnRjYXJvbj0zMTc7ZS5lb2dvbmVrPTU1NjtlLlVvZ29uZWs9NzIyO2UuQWFjdXRlPTY2NztlLkFkaWVyZXNpcz02Njc7ZS5lZ3JhdmU9NTU2O2UuemFjdXRlPTUwMDtlLmlvZ29uZWs9MjIyO2UuT2FjdXRlPTc3ODtlLm9hY3V0ZT01NTY7ZS5hbWFjcm9uPTU1NjtlLnNhY3V0ZT01MDA7ZS5pZGllcmVzaXM9Mjc4O2UuT2NpcmN1bWZsZXg9Nzc4O2UuVWdyYXZlPTcyMjtlLkRlbHRhPTYxMjtlLnRob3JuPTU1NjtlLnR3b3N1cGVyaW9yPTMzMztlLk9kaWVyZXNpcz03Nzg7ZS5tdT01NTY7ZS5pZ3JhdmU9Mjc4O2Uub2h1bmdhcnVtbGF1dD01NTY7ZS5Fb2dvbmVrPTY2NztlLmRjcm9hdD01NTY7ZS50aHJlZXF1YXJ0ZXJzPTgzNDtlLlNjZWRpbGxhPTY2NztlLmxjYXJvbj0yOTk7ZS5LY29tbWFhY2NlbnQ9NjY3O2UuTGFjdXRlPTU1NjtlLnRyYWRlbWFyaz0xZTM7ZS5lZG90YWNjZW50PTU1NjtlLklncmF2ZT0yNzg7ZS5JbWFjcm9uPTI3ODtlLkxjYXJvbj01NTY7ZS5vbmVoYWxmPTgzNDtlLmxlc3NlcXVhbD01NDk7ZS5vY2lyY3VtZmxleD01NTY7ZS5udGlsZGU9NTU2O2UuVWh1bmdhcnVtbGF1dD03MjI7ZS5FYWN1dGU9NjY3O2UuZW1hY3Jvbj01NTY7ZS5nYnJldmU9NTU2O2Uub25lcXVhcnRlcj04MzQ7ZS5TY2Fyb249NjY3O2UuU2NvbW1hYWNjZW50PTY2NztlLk9odW5nYXJ1bWxhdXQ9Nzc4O2UuZGVncmVlPTQwMDtlLm9ncmF2ZT01NTY7ZS5DY2Fyb249NzIyO2UudWdyYXZlPTU1NjtlLnJhZGljYWw9NDUzO2UuRGNhcm9uPTcyMjtlLnJjb21tYWFjY2VudD0zMzM7ZS5OdGlsZGU9NzIyO2Uub3RpbGRlPTU1NjtlLlJjb21tYWFjY2VudD03MjI7ZS5MY29tbWFhY2NlbnQ9NTU2O2UuQXRpbGRlPTY2NztlLkFvZ29uZWs9NjY3O2UuQXJpbmc9NjY3O2UuT3RpbGRlPTc3ODtlLnpkb3RhY2NlbnQ9NTAwO2UuRWNhcm9uPTY2NztlLklvZ29uZWs9Mjc4O2Uua2NvbW1hYWNjZW50PTUwMDtlLm1pbnVzPTU4NDtlLkljaXJjdW1mbGV4PTI3ODtlLm5jYXJvbj01NTY7ZS50Y29tbWFhY2NlbnQ9Mjc4O2UubG9naWNhbG5vdD01ODQ7ZS5vZGllcmVzaXM9NTU2O2UudWRpZXJlc2lzPTU1NjtlLm5vdGVxdWFsPTU0OTtlLmdjb21tYWFjY2VudD01NTY7ZS5ldGg9NTU2O2UuemNhcm9uPTUwMDtlLm5jb21tYWFjY2VudD01NTY7ZS5vbmVzdXBlcmlvcj0zMzM7ZS5pbWFjcm9uPTI3ODtlLkV1cm89NTU2fSkpO2VbIkhlbHZldGljYS1Cb2xkIl09KDAsci5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI3ODtlLmV4Y2xhbT0zMzM7ZS5xdW90ZWRibD00NzQ7ZS5udW1iZXJzaWduPTU1NjtlLmRvbGxhcj01NTY7ZS5wZXJjZW50PTg4OTtlLmFtcGVyc2FuZD03MjI7ZS5xdW90ZXJpZ2h0PTI3ODtlLnBhcmVubGVmdD0zMzM7ZS5wYXJlbnJpZ2h0PTMzMztlLmFzdGVyaXNrPTM4OTtlLnBsdXM9NTg0O2UuY29tbWE9Mjc4O2UuaHlwaGVuPTMzMztlLnBlcmlvZD0yNzg7ZS5zbGFzaD0yNzg7ZS56ZXJvPTU1NjtlLm9uZT01NTY7ZS50d289NTU2O2UudGhyZWU9NTU2O2UuZm91cj01NTY7ZS5maXZlPTU1NjtlLnNpeD01NTY7ZS5zZXZlbj01NTY7ZS5laWdodD01NTY7ZS5uaW5lPTU1NjtlLmNvbG9uPTMzMztlLnNlbWljb2xvbj0zMzM7ZS5sZXNzPTU4NDtlLmVxdWFsPTU4NDtlLmdyZWF0ZXI9NTg0O2UucXVlc3Rpb249NjExO2UuYXQ9OTc1O2UuQT03MjI7ZS5CPTcyMjtlLkM9NzIyO2UuRD03MjI7ZS5FPTY2NztlLkY9NjExO2UuRz03Nzg7ZS5IPTcyMjtlLkk9Mjc4O2UuSj01NTY7ZS5LPTcyMjtlLkw9NjExO2UuTT04MzM7ZS5OPTcyMjtlLk89Nzc4O2UuUD02Njc7ZS5RPTc3ODtlLlI9NzIyO2UuUz02Njc7ZS5UPTYxMTtlLlU9NzIyO2UuVj02Njc7ZS5XPTk0NDtlLlg9NjY3O2UuWT02Njc7ZS5aPTYxMTtlLmJyYWNrZXRsZWZ0PTMzMztlLmJhY2tzbGFzaD0yNzg7ZS5icmFja2V0cmlnaHQ9MzMzO2UuYXNjaWljaXJjdW09NTg0O2UudW5kZXJzY29yZT01NTY7ZS5xdW90ZWxlZnQ9Mjc4O2UuYT01NTY7ZS5iPTYxMTtlLmM9NTU2O2UuZD02MTE7ZS5lPTU1NjtlLmY9MzMzO2UuZz02MTE7ZS5oPTYxMTtlLmk9Mjc4O2Uuaj0yNzg7ZS5rPTU1NjtlLmw9Mjc4O2UubT04ODk7ZS5uPTYxMTtlLm89NjExO2UucD02MTE7ZS5xPTYxMTtlLnI9Mzg5O2Uucz01NTY7ZS50PTMzMztlLnU9NjExO2Uudj01NTY7ZS53PTc3ODtlLng9NTU2O2UueT01NTY7ZS56PTUwMDtlLmJyYWNlbGVmdD0zODk7ZS5iYXI9MjgwO2UuYnJhY2VyaWdodD0zODk7ZS5hc2NpaXRpbGRlPTU4NDtlLmV4Y2xhbWRvd249MzMzO2UuY2VudD01NTY7ZS5zdGVybGluZz01NTY7ZS5mcmFjdGlvbj0xNjc7ZS55ZW49NTU2O2UuZmxvcmluPTU1NjtlLnNlY3Rpb249NTU2O2UuY3VycmVuY3k9NTU2O2UucXVvdGVzaW5nbGU9MjM4O2UucXVvdGVkYmxsZWZ0PTUwMDtlLmd1aWxsZW1vdGxlZnQ9NTU2O2UuZ3VpbHNpbmdsbGVmdD0zMzM7ZS5ndWlsc2luZ2xyaWdodD0zMzM7ZS5maT02MTE7ZS5mbD02MTE7ZS5lbmRhc2g9NTU2O2UuZGFnZ2VyPTU1NjtlLmRhZ2dlcmRibD01NTY7ZS5wZXJpb2RjZW50ZXJlZD0yNzg7ZS5wYXJhZ3JhcGg9NTU2O2UuYnVsbGV0PTM1MDtlLnF1b3Rlc2luZ2xiYXNlPTI3ODtlLnF1b3RlZGJsYmFzZT01MDA7ZS5xdW90ZWRibHJpZ2h0PTUwMDtlLmd1aWxsZW1vdHJpZ2h0PTU1NjtlLmVsbGlwc2lzPTFlMztlLnBlcnRob3VzYW5kPTFlMztlLnF1ZXN0aW9uZG93bj02MTE7ZS5ncmF2ZT0zMzM7ZS5hY3V0ZT0zMzM7ZS5jaXJjdW1mbGV4PTMzMztlLnRpbGRlPTMzMztlLm1hY3Jvbj0zMzM7ZS5icmV2ZT0zMzM7ZS5kb3RhY2NlbnQ9MzMzO2UuZGllcmVzaXM9MzMzO2UucmluZz0zMzM7ZS5jZWRpbGxhPTMzMztlLmh1bmdhcnVtbGF1dD0zMzM7ZS5vZ29uZWs9MzMzO2UuY2Fyb249MzMzO2UuZW1kYXNoPTFlMztlLkFFPTFlMztlLm9yZGZlbWluaW5lPTM3MDtlLkxzbGFzaD02MTE7ZS5Pc2xhc2g9Nzc4O2UuT0U9MWUzO2Uub3JkbWFzY3VsaW5lPTM2NTtlLmFlPTg4OTtlLmRvdGxlc3NpPTI3ODtlLmxzbGFzaD0yNzg7ZS5vc2xhc2g9NjExO2Uub2U9OTQ0O2UuZ2VybWFuZGJscz02MTE7ZS5JZGllcmVzaXM9Mjc4O2UuZWFjdXRlPTU1NjtlLmFicmV2ZT01NTY7ZS51aHVuZ2FydW1sYXV0PTYxMTtlLmVjYXJvbj01NTY7ZS5ZZGllcmVzaXM9NjY3O2UuZGl2aWRlPTU4NDtlLllhY3V0ZT02Njc7ZS5BY2lyY3VtZmxleD03MjI7ZS5hYWN1dGU9NTU2O2UuVWNpcmN1bWZsZXg9NzIyO2UueWFjdXRlPTU1NjtlLnNjb21tYWFjY2VudD01NTY7ZS5lY2lyY3VtZmxleD01NTY7ZS5VcmluZz03MjI7ZS5VZGllcmVzaXM9NzIyO2UuYW9nb25laz01NTY7ZS5VYWN1dGU9NzIyO2UudW9nb25laz02MTE7ZS5FZGllcmVzaXM9NjY3O2UuRGNyb2F0PTcyMjtlLmNvbW1hYWNjZW50PTI1MDtlLmNvcHlyaWdodD03Mzc7ZS5FbWFjcm9uPTY2NztlLmNjYXJvbj01NTY7ZS5hcmluZz01NTY7ZS5OY29tbWFhY2NlbnQ9NzIyO2UubGFjdXRlPTI3ODtlLmFncmF2ZT01NTY7ZS5UY29tbWFhY2NlbnQ9NjExO2UuQ2FjdXRlPTcyMjtlLmF0aWxkZT01NTY7ZS5FZG90YWNjZW50PTY2NztlLnNjYXJvbj01NTY7ZS5zY2VkaWxsYT01NTY7ZS5pYWN1dGU9Mjc4O2UubG96ZW5nZT00OTQ7ZS5SY2Fyb249NzIyO2UuR2NvbW1hYWNjZW50PTc3ODtlLnVjaXJjdW1mbGV4PTYxMTtlLmFjaXJjdW1mbGV4PTU1NjtlLkFtYWNyb249NzIyO2UucmNhcm9uPTM4OTtlLmNjZWRpbGxhPTU1NjtlLlpkb3RhY2NlbnQ9NjExO2UuVGhvcm49NjY3O2UuT21hY3Jvbj03Nzg7ZS5SYWN1dGU9NzIyO2UuU2FjdXRlPTY2NztlLmRjYXJvbj03NDM7ZS5VbWFjcm9uPTcyMjtlLnVyaW5nPTYxMTtlLnRocmVlc3VwZXJpb3I9MzMzO2UuT2dyYXZlPTc3ODtlLkFncmF2ZT03MjI7ZS5BYnJldmU9NzIyO2UubXVsdGlwbHk9NTg0O2UudWFjdXRlPTYxMTtlLlRjYXJvbj02MTE7ZS5wYXJ0aWFsZGlmZj00OTQ7ZS55ZGllcmVzaXM9NTU2O2UuTmFjdXRlPTcyMjtlLmljaXJjdW1mbGV4PTI3ODtlLkVjaXJjdW1mbGV4PTY2NztlLmFkaWVyZXNpcz01NTY7ZS5lZGllcmVzaXM9NTU2O2UuY2FjdXRlPTU1NjtlLm5hY3V0ZT02MTE7ZS51bWFjcm9uPTYxMTtlLk5jYXJvbj03MjI7ZS5JYWN1dGU9Mjc4O2UucGx1c21pbnVzPTU4NDtlLmJyb2tlbmJhcj0yODA7ZS5yZWdpc3RlcmVkPTczNztlLkdicmV2ZT03Nzg7ZS5JZG90YWNjZW50PTI3ODtlLnN1bW1hdGlvbj02MDA7ZS5FZ3JhdmU9NjY3O2UucmFjdXRlPTM4OTtlLm9tYWNyb249NjExO2UuWmFjdXRlPTYxMTtlLlpjYXJvbj02MTE7ZS5ncmVhdGVyZXF1YWw9NTQ5O2UuRXRoPTcyMjtlLkNjZWRpbGxhPTcyMjtlLmxjb21tYWFjY2VudD0yNzg7ZS50Y2Fyb249Mzg5O2UuZW9nb25laz01NTY7ZS5Vb2dvbmVrPTcyMjtlLkFhY3V0ZT03MjI7ZS5BZGllcmVzaXM9NzIyO2UuZWdyYXZlPTU1NjtlLnphY3V0ZT01MDA7ZS5pb2dvbmVrPTI3ODtlLk9hY3V0ZT03Nzg7ZS5vYWN1dGU9NjExO2UuYW1hY3Jvbj01NTY7ZS5zYWN1dGU9NTU2O2UuaWRpZXJlc2lzPTI3ODtlLk9jaXJjdW1mbGV4PTc3ODtlLlVncmF2ZT03MjI7ZS5EZWx0YT02MTI7ZS50aG9ybj02MTE7ZS50d29zdXBlcmlvcj0zMzM7ZS5PZGllcmVzaXM9Nzc4O2UubXU9NjExO2UuaWdyYXZlPTI3ODtlLm9odW5nYXJ1bWxhdXQ9NjExO2UuRW9nb25laz02Njc7ZS5kY3JvYXQ9NjExO2UudGhyZWVxdWFydGVycz04MzQ7ZS5TY2VkaWxsYT02Njc7ZS5sY2Fyb249NDAwO2UuS2NvbW1hYWNjZW50PTcyMjtlLkxhY3V0ZT02MTE7ZS50cmFkZW1hcms9MWUzO2UuZWRvdGFjY2VudD01NTY7ZS5JZ3JhdmU9Mjc4O2UuSW1hY3Jvbj0yNzg7ZS5MY2Fyb249NjExO2Uub25laGFsZj04MzQ7ZS5sZXNzZXF1YWw9NTQ5O2Uub2NpcmN1bWZsZXg9NjExO2UubnRpbGRlPTYxMTtlLlVodW5nYXJ1bWxhdXQ9NzIyO2UuRWFjdXRlPTY2NztlLmVtYWNyb249NTU2O2UuZ2JyZXZlPTYxMTtlLm9uZXF1YXJ0ZXI9ODM0O2UuU2Nhcm9uPTY2NztlLlNjb21tYWFjY2VudD02Njc7ZS5PaHVuZ2FydW1sYXV0PTc3ODtlLmRlZ3JlZT00MDA7ZS5vZ3JhdmU9NjExO2UuQ2Nhcm9uPTcyMjtlLnVncmF2ZT02MTE7ZS5yYWRpY2FsPTU0OTtlLkRjYXJvbj03MjI7ZS5yY29tbWFhY2NlbnQ9Mzg5O2UuTnRpbGRlPTcyMjtlLm90aWxkZT02MTE7ZS5SY29tbWFhY2NlbnQ9NzIyO2UuTGNvbW1hYWNjZW50PTYxMTtlLkF0aWxkZT03MjI7ZS5Bb2dvbmVrPTcyMjtlLkFyaW5nPTcyMjtlLk90aWxkZT03Nzg7ZS56ZG90YWNjZW50PTUwMDtlLkVjYXJvbj02Njc7ZS5Jb2dvbmVrPTI3ODtlLmtjb21tYWFjY2VudD01NTY7ZS5taW51cz01ODQ7ZS5JY2lyY3VtZmxleD0yNzg7ZS5uY2Fyb249NjExO2UudGNvbW1hYWNjZW50PTMzMztlLmxvZ2ljYWxub3Q9NTg0O2Uub2RpZXJlc2lzPTYxMTtlLnVkaWVyZXNpcz02MTE7ZS5ub3RlcXVhbD01NDk7ZS5nY29tbWFhY2NlbnQ9NjExO2UuZXRoPTYxMTtlLnpjYXJvbj01MDA7ZS5uY29tbWFhY2NlbnQ9NjExO2Uub25lc3VwZXJpb3I9MzMzO2UuaW1hY3Jvbj0yNzg7ZS5FdXJvPTU1Nn0pKTtlWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXT0oMCxyLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9Mjc4O2UuZXhjbGFtPTMzMztlLnF1b3RlZGJsPTQ3NDtlLm51bWJlcnNpZ249NTU2O2UuZG9sbGFyPTU1NjtlLnBlcmNlbnQ9ODg5O2UuYW1wZXJzYW5kPTcyMjtlLnF1b3RlcmlnaHQ9Mjc4O2UucGFyZW5sZWZ0PTMzMztlLnBhcmVucmlnaHQ9MzMzO2UuYXN0ZXJpc2s9Mzg5O2UucGx1cz01ODQ7ZS5jb21tYT0yNzg7ZS5oeXBoZW49MzMzO2UucGVyaW9kPTI3ODtlLnNsYXNoPTI3ODtlLnplcm89NTU2O2Uub25lPTU1NjtlLnR3bz01NTY7ZS50aHJlZT01NTY7ZS5mb3VyPTU1NjtlLmZpdmU9NTU2O2Uuc2l4PTU1NjtlLnNldmVuPTU1NjtlLmVpZ2h0PTU1NjtlLm5pbmU9NTU2O2UuY29sb249MzMzO2Uuc2VtaWNvbG9uPTMzMztlLmxlc3M9NTg0O2UuZXF1YWw9NTg0O2UuZ3JlYXRlcj01ODQ7ZS5xdWVzdGlvbj02MTE7ZS5hdD05NzU7ZS5BPTcyMjtlLkI9NzIyO2UuQz03MjI7ZS5EPTcyMjtlLkU9NjY3O2UuRj02MTE7ZS5HPTc3ODtlLkg9NzIyO2UuST0yNzg7ZS5KPTU1NjtlLks9NzIyO2UuTD02MTE7ZS5NPTgzMztlLk49NzIyO2UuTz03Nzg7ZS5QPTY2NztlLlE9Nzc4O2UuUj03MjI7ZS5TPTY2NztlLlQ9NjExO2UuVT03MjI7ZS5WPTY2NztlLlc9OTQ0O2UuWD02Njc7ZS5ZPTY2NztlLlo9NjExO2UuYnJhY2tldGxlZnQ9MzMzO2UuYmFja3NsYXNoPTI3ODtlLmJyYWNrZXRyaWdodD0zMzM7ZS5hc2NpaWNpcmN1bT01ODQ7ZS51bmRlcnNjb3JlPTU1NjtlLnF1b3RlbGVmdD0yNzg7ZS5hPTU1NjtlLmI9NjExO2UuYz01NTY7ZS5kPTYxMTtlLmU9NTU2O2UuZj0zMzM7ZS5nPTYxMTtlLmg9NjExO2UuaT0yNzg7ZS5qPTI3ODtlLms9NTU2O2UubD0yNzg7ZS5tPTg4OTtlLm49NjExO2Uubz02MTE7ZS5wPTYxMTtlLnE9NjExO2Uucj0zODk7ZS5zPTU1NjtlLnQ9MzMzO2UudT02MTE7ZS52PTU1NjtlLnc9Nzc4O2UueD01NTY7ZS55PTU1NjtlLno9NTAwO2UuYnJhY2VsZWZ0PTM4OTtlLmJhcj0yODA7ZS5icmFjZXJpZ2h0PTM4OTtlLmFzY2lpdGlsZGU9NTg0O2UuZXhjbGFtZG93bj0zMzM7ZS5jZW50PTU1NjtlLnN0ZXJsaW5nPTU1NjtlLmZyYWN0aW9uPTE2NztlLnllbj01NTY7ZS5mbG9yaW49NTU2O2Uuc2VjdGlvbj01NTY7ZS5jdXJyZW5jeT01NTY7ZS5xdW90ZXNpbmdsZT0yMzg7ZS5xdW90ZWRibGxlZnQ9NTAwO2UuZ3VpbGxlbW90bGVmdD01NTY7ZS5ndWlsc2luZ2xsZWZ0PTMzMztlLmd1aWxzaW5nbHJpZ2h0PTMzMztlLmZpPTYxMTtlLmZsPTYxMTtlLmVuZGFzaD01NTY7ZS5kYWdnZXI9NTU2O2UuZGFnZ2VyZGJsPTU1NjtlLnBlcmlvZGNlbnRlcmVkPTI3ODtlLnBhcmFncmFwaD01NTY7ZS5idWxsZXQ9MzUwO2UucXVvdGVzaW5nbGJhc2U9Mjc4O2UucXVvdGVkYmxiYXNlPTUwMDtlLnF1b3RlZGJscmlnaHQ9NTAwO2UuZ3VpbGxlbW90cmlnaHQ9NTU2O2UuZWxsaXBzaXM9MWUzO2UucGVydGhvdXNhbmQ9MWUzO2UucXVlc3Rpb25kb3duPTYxMTtlLmdyYXZlPTMzMztlLmFjdXRlPTMzMztlLmNpcmN1bWZsZXg9MzMzO2UudGlsZGU9MzMzO2UubWFjcm9uPTMzMztlLmJyZXZlPTMzMztlLmRvdGFjY2VudD0zMzM7ZS5kaWVyZXNpcz0zMzM7ZS5yaW5nPTMzMztlLmNlZGlsbGE9MzMzO2UuaHVuZ2FydW1sYXV0PTMzMztlLm9nb25laz0zMzM7ZS5jYXJvbj0zMzM7ZS5lbWRhc2g9MWUzO2UuQUU9MWUzO2Uub3JkZmVtaW5pbmU9MzcwO2UuTHNsYXNoPTYxMTtlLk9zbGFzaD03Nzg7ZS5PRT0xZTM7ZS5vcmRtYXNjdWxpbmU9MzY1O2UuYWU9ODg5O2UuZG90bGVzc2k9Mjc4O2UubHNsYXNoPTI3ODtlLm9zbGFzaD02MTE7ZS5vZT05NDQ7ZS5nZXJtYW5kYmxzPTYxMTtlLklkaWVyZXNpcz0yNzg7ZS5lYWN1dGU9NTU2O2UuYWJyZXZlPTU1NjtlLnVodW5nYXJ1bWxhdXQ9NjExO2UuZWNhcm9uPTU1NjtlLllkaWVyZXNpcz02Njc7ZS5kaXZpZGU9NTg0O2UuWWFjdXRlPTY2NztlLkFjaXJjdW1mbGV4PTcyMjtlLmFhY3V0ZT01NTY7ZS5VY2lyY3VtZmxleD03MjI7ZS55YWN1dGU9NTU2O2Uuc2NvbW1hYWNjZW50PTU1NjtlLmVjaXJjdW1mbGV4PTU1NjtlLlVyaW5nPTcyMjtlLlVkaWVyZXNpcz03MjI7ZS5hb2dvbmVrPTU1NjtlLlVhY3V0ZT03MjI7ZS51b2dvbmVrPTYxMTtlLkVkaWVyZXNpcz02Njc7ZS5EY3JvYXQ9NzIyO2UuY29tbWFhY2NlbnQ9MjUwO2UuY29weXJpZ2h0PTczNztlLkVtYWNyb249NjY3O2UuY2Nhcm9uPTU1NjtlLmFyaW5nPTU1NjtlLk5jb21tYWFjY2VudD03MjI7ZS5sYWN1dGU9Mjc4O2UuYWdyYXZlPTU1NjtlLlRjb21tYWFjY2VudD02MTE7ZS5DYWN1dGU9NzIyO2UuYXRpbGRlPTU1NjtlLkVkb3RhY2NlbnQ9NjY3O2Uuc2Nhcm9uPTU1NjtlLnNjZWRpbGxhPTU1NjtlLmlhY3V0ZT0yNzg7ZS5sb3plbmdlPTQ5NDtlLlJjYXJvbj03MjI7ZS5HY29tbWFhY2NlbnQ9Nzc4O2UudWNpcmN1bWZsZXg9NjExO2UuYWNpcmN1bWZsZXg9NTU2O2UuQW1hY3Jvbj03MjI7ZS5yY2Fyb249Mzg5O2UuY2NlZGlsbGE9NTU2O2UuWmRvdGFjY2VudD02MTE7ZS5UaG9ybj02Njc7ZS5PbWFjcm9uPTc3ODtlLlJhY3V0ZT03MjI7ZS5TYWN1dGU9NjY3O2UuZGNhcm9uPTc0MztlLlVtYWNyb249NzIyO2UudXJpbmc9NjExO2UudGhyZWVzdXBlcmlvcj0zMzM7ZS5PZ3JhdmU9Nzc4O2UuQWdyYXZlPTcyMjtlLkFicmV2ZT03MjI7ZS5tdWx0aXBseT01ODQ7ZS51YWN1dGU9NjExO2UuVGNhcm9uPTYxMTtlLnBhcnRpYWxkaWZmPTQ5NDtlLnlkaWVyZXNpcz01NTY7ZS5OYWN1dGU9NzIyO2UuaWNpcmN1bWZsZXg9Mjc4O2UuRWNpcmN1bWZsZXg9NjY3O2UuYWRpZXJlc2lzPTU1NjtlLmVkaWVyZXNpcz01NTY7ZS5jYWN1dGU9NTU2O2UubmFjdXRlPTYxMTtlLnVtYWNyb249NjExO2UuTmNhcm9uPTcyMjtlLklhY3V0ZT0yNzg7ZS5wbHVzbWludXM9NTg0O2UuYnJva2VuYmFyPTI4MDtlLnJlZ2lzdGVyZWQ9NzM3O2UuR2JyZXZlPTc3ODtlLklkb3RhY2NlbnQ9Mjc4O2Uuc3VtbWF0aW9uPTYwMDtlLkVncmF2ZT02Njc7ZS5yYWN1dGU9Mzg5O2Uub21hY3Jvbj02MTE7ZS5aYWN1dGU9NjExO2UuWmNhcm9uPTYxMTtlLmdyZWF0ZXJlcXVhbD01NDk7ZS5FdGg9NzIyO2UuQ2NlZGlsbGE9NzIyO2UubGNvbW1hYWNjZW50PTI3ODtlLnRjYXJvbj0zODk7ZS5lb2dvbmVrPTU1NjtlLlVvZ29uZWs9NzIyO2UuQWFjdXRlPTcyMjtlLkFkaWVyZXNpcz03MjI7ZS5lZ3JhdmU9NTU2O2UuemFjdXRlPTUwMDtlLmlvZ29uZWs9Mjc4O2UuT2FjdXRlPTc3ODtlLm9hY3V0ZT02MTE7ZS5hbWFjcm9uPTU1NjtlLnNhY3V0ZT01NTY7ZS5pZGllcmVzaXM9Mjc4O2UuT2NpcmN1bWZsZXg9Nzc4O2UuVWdyYXZlPTcyMjtlLkRlbHRhPTYxMjtlLnRob3JuPTYxMTtlLnR3b3N1cGVyaW9yPTMzMztlLk9kaWVyZXNpcz03Nzg7ZS5tdT02MTE7ZS5pZ3JhdmU9Mjc4O2Uub2h1bmdhcnVtbGF1dD02MTE7ZS5Fb2dvbmVrPTY2NztlLmRjcm9hdD02MTE7ZS50aHJlZXF1YXJ0ZXJzPTgzNDtlLlNjZWRpbGxhPTY2NztlLmxjYXJvbj00MDA7ZS5LY29tbWFhY2NlbnQ9NzIyO2UuTGFjdXRlPTYxMTtlLnRyYWRlbWFyaz0xZTM7ZS5lZG90YWNjZW50PTU1NjtlLklncmF2ZT0yNzg7ZS5JbWFjcm9uPTI3ODtlLkxjYXJvbj02MTE7ZS5vbmVoYWxmPTgzNDtlLmxlc3NlcXVhbD01NDk7ZS5vY2lyY3VtZmxleD02MTE7ZS5udGlsZGU9NjExO2UuVWh1bmdhcnVtbGF1dD03MjI7ZS5FYWN1dGU9NjY3O2UuZW1hY3Jvbj01NTY7ZS5nYnJldmU9NjExO2Uub25lcXVhcnRlcj04MzQ7ZS5TY2Fyb249NjY3O2UuU2NvbW1hYWNjZW50PTY2NztlLk9odW5nYXJ1bWxhdXQ9Nzc4O2UuZGVncmVlPTQwMDtlLm9ncmF2ZT02MTE7ZS5DY2Fyb249NzIyO2UudWdyYXZlPTYxMTtlLnJhZGljYWw9NTQ5O2UuRGNhcm9uPTcyMjtlLnJjb21tYWFjY2VudD0zODk7ZS5OdGlsZGU9NzIyO2Uub3RpbGRlPTYxMTtlLlJjb21tYWFjY2VudD03MjI7ZS5MY29tbWFhY2NlbnQ9NjExO2UuQXRpbGRlPTcyMjtlLkFvZ29uZWs9NzIyO2UuQXJpbmc9NzIyO2UuT3RpbGRlPTc3ODtlLnpkb3RhY2NlbnQ9NTAwO2UuRWNhcm9uPTY2NztlLklvZ29uZWs9Mjc4O2Uua2NvbW1hYWNjZW50PTU1NjtlLm1pbnVzPTU4NDtlLkljaXJjdW1mbGV4PTI3ODtlLm5jYXJvbj02MTE7ZS50Y29tbWFhY2NlbnQ9MzMzO2UubG9naWNhbG5vdD01ODQ7ZS5vZGllcmVzaXM9NjExO2UudWRpZXJlc2lzPTYxMTtlLm5vdGVxdWFsPTU0OTtlLmdjb21tYWFjY2VudD02MTE7ZS5ldGg9NjExO2UuemNhcm9uPTUwMDtlLm5jb21tYWFjY2VudD02MTE7ZS5vbmVzdXBlcmlvcj0zMzM7ZS5pbWFjcm9uPTI3ODtlLkV1cm89NTU2fSkpO2VbIkhlbHZldGljYS1PYmxpcXVlIl09KDAsci5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI3ODtlLmV4Y2xhbT0yNzg7ZS5xdW90ZWRibD0zNTU7ZS5udW1iZXJzaWduPTU1NjtlLmRvbGxhcj01NTY7ZS5wZXJjZW50PTg4OTtlLmFtcGVyc2FuZD02Njc7ZS5xdW90ZXJpZ2h0PTIyMjtlLnBhcmVubGVmdD0zMzM7ZS5wYXJlbnJpZ2h0PTMzMztlLmFzdGVyaXNrPTM4OTtlLnBsdXM9NTg0O2UuY29tbWE9Mjc4O2UuaHlwaGVuPTMzMztlLnBlcmlvZD0yNzg7ZS5zbGFzaD0yNzg7ZS56ZXJvPTU1NjtlLm9uZT01NTY7ZS50d289NTU2O2UudGhyZWU9NTU2O2UuZm91cj01NTY7ZS5maXZlPTU1NjtlLnNpeD01NTY7ZS5zZXZlbj01NTY7ZS5laWdodD01NTY7ZS5uaW5lPTU1NjtlLmNvbG9uPTI3ODtlLnNlbWljb2xvbj0yNzg7ZS5sZXNzPTU4NDtlLmVxdWFsPTU4NDtlLmdyZWF0ZXI9NTg0O2UucXVlc3Rpb249NTU2O2UuYXQ9MTAxNTtlLkE9NjY3O2UuQj02Njc7ZS5DPTcyMjtlLkQ9NzIyO2UuRT02Njc7ZS5GPTYxMTtlLkc9Nzc4O2UuSD03MjI7ZS5JPTI3ODtlLko9NTAwO2UuSz02Njc7ZS5MPTU1NjtlLk09ODMzO2UuTj03MjI7ZS5PPTc3ODtlLlA9NjY3O2UuUT03Nzg7ZS5SPTcyMjtlLlM9NjY3O2UuVD02MTE7ZS5VPTcyMjtlLlY9NjY3O2UuVz05NDQ7ZS5YPTY2NztlLlk9NjY3O2UuWj02MTE7ZS5icmFja2V0bGVmdD0yNzg7ZS5iYWNrc2xhc2g9Mjc4O2UuYnJhY2tldHJpZ2h0PTI3ODtlLmFzY2lpY2lyY3VtPTQ2OTtlLnVuZGVyc2NvcmU9NTU2O2UucXVvdGVsZWZ0PTIyMjtlLmE9NTU2O2UuYj01NTY7ZS5jPTUwMDtlLmQ9NTU2O2UuZT01NTY7ZS5mPTI3ODtlLmc9NTU2O2UuaD01NTY7ZS5pPTIyMjtlLmo9MjIyO2Uuaz01MDA7ZS5sPTIyMjtlLm09ODMzO2Uubj01NTY7ZS5vPTU1NjtlLnA9NTU2O2UucT01NTY7ZS5yPTMzMztlLnM9NTAwO2UudD0yNzg7ZS51PTU1NjtlLnY9NTAwO2Uudz03MjI7ZS54PTUwMDtlLnk9NTAwO2Uuej01MDA7ZS5icmFjZWxlZnQ9MzM0O2UuYmFyPTI2MDtlLmJyYWNlcmlnaHQ9MzM0O2UuYXNjaWl0aWxkZT01ODQ7ZS5leGNsYW1kb3duPTMzMztlLmNlbnQ9NTU2O2Uuc3Rlcmxpbmc9NTU2O2UuZnJhY3Rpb249MTY3O2UueWVuPTU1NjtlLmZsb3Jpbj01NTY7ZS5zZWN0aW9uPTU1NjtlLmN1cnJlbmN5PTU1NjtlLnF1b3Rlc2luZ2xlPTE5MTtlLnF1b3RlZGJsbGVmdD0zMzM7ZS5ndWlsbGVtb3RsZWZ0PTU1NjtlLmd1aWxzaW5nbGxlZnQ9MzMzO2UuZ3VpbHNpbmdscmlnaHQ9MzMzO2UuZmk9NTAwO2UuZmw9NTAwO2UuZW5kYXNoPTU1NjtlLmRhZ2dlcj01NTY7ZS5kYWdnZXJkYmw9NTU2O2UucGVyaW9kY2VudGVyZWQ9Mjc4O2UucGFyYWdyYXBoPTUzNztlLmJ1bGxldD0zNTA7ZS5xdW90ZXNpbmdsYmFzZT0yMjI7ZS5xdW90ZWRibGJhc2U9MzMzO2UucXVvdGVkYmxyaWdodD0zMzM7ZS5ndWlsbGVtb3RyaWdodD01NTY7ZS5lbGxpcHNpcz0xZTM7ZS5wZXJ0aG91c2FuZD0xZTM7ZS5xdWVzdGlvbmRvd249NjExO2UuZ3JhdmU9MzMzO2UuYWN1dGU9MzMzO2UuY2lyY3VtZmxleD0zMzM7ZS50aWxkZT0zMzM7ZS5tYWNyb249MzMzO2UuYnJldmU9MzMzO2UuZG90YWNjZW50PTMzMztlLmRpZXJlc2lzPTMzMztlLnJpbmc9MzMzO2UuY2VkaWxsYT0zMzM7ZS5odW5nYXJ1bWxhdXQ9MzMzO2Uub2dvbmVrPTMzMztlLmNhcm9uPTMzMztlLmVtZGFzaD0xZTM7ZS5BRT0xZTM7ZS5vcmRmZW1pbmluZT0zNzA7ZS5Mc2xhc2g9NTU2O2UuT3NsYXNoPTc3ODtlLk9FPTFlMztlLm9yZG1hc2N1bGluZT0zNjU7ZS5hZT04ODk7ZS5kb3RsZXNzaT0yNzg7ZS5sc2xhc2g9MjIyO2Uub3NsYXNoPTYxMTtlLm9lPTk0NDtlLmdlcm1hbmRibHM9NjExO2UuSWRpZXJlc2lzPTI3ODtlLmVhY3V0ZT01NTY7ZS5hYnJldmU9NTU2O2UudWh1bmdhcnVtbGF1dD01NTY7ZS5lY2Fyb249NTU2O2UuWWRpZXJlc2lzPTY2NztlLmRpdmlkZT01ODQ7ZS5ZYWN1dGU9NjY3O2UuQWNpcmN1bWZsZXg9NjY3O2UuYWFjdXRlPTU1NjtlLlVjaXJjdW1mbGV4PTcyMjtlLnlhY3V0ZT01MDA7ZS5zY29tbWFhY2NlbnQ9NTAwO2UuZWNpcmN1bWZsZXg9NTU2O2UuVXJpbmc9NzIyO2UuVWRpZXJlc2lzPTcyMjtlLmFvZ29uZWs9NTU2O2UuVWFjdXRlPTcyMjtlLnVvZ29uZWs9NTU2O2UuRWRpZXJlc2lzPTY2NztlLkRjcm9hdD03MjI7ZS5jb21tYWFjY2VudD0yNTA7ZS5jb3B5cmlnaHQ9NzM3O2UuRW1hY3Jvbj02Njc7ZS5jY2Fyb249NTAwO2UuYXJpbmc9NTU2O2UuTmNvbW1hYWNjZW50PTcyMjtlLmxhY3V0ZT0yMjI7ZS5hZ3JhdmU9NTU2O2UuVGNvbW1hYWNjZW50PTYxMTtlLkNhY3V0ZT03MjI7ZS5hdGlsZGU9NTU2O2UuRWRvdGFjY2VudD02Njc7ZS5zY2Fyb249NTAwO2Uuc2NlZGlsbGE9NTAwO2UuaWFjdXRlPTI3ODtlLmxvemVuZ2U9NDcxO2UuUmNhcm9uPTcyMjtlLkdjb21tYWFjY2VudD03Nzg7ZS51Y2lyY3VtZmxleD01NTY7ZS5hY2lyY3VtZmxleD01NTY7ZS5BbWFjcm9uPTY2NztlLnJjYXJvbj0zMzM7ZS5jY2VkaWxsYT01MDA7ZS5aZG90YWNjZW50PTYxMTtlLlRob3JuPTY2NztlLk9tYWNyb249Nzc4O2UuUmFjdXRlPTcyMjtlLlNhY3V0ZT02Njc7ZS5kY2Fyb249NjQzO2UuVW1hY3Jvbj03MjI7ZS51cmluZz01NTY7ZS50aHJlZXN1cGVyaW9yPTMzMztlLk9ncmF2ZT03Nzg7ZS5BZ3JhdmU9NjY3O2UuQWJyZXZlPTY2NztlLm11bHRpcGx5PTU4NDtlLnVhY3V0ZT01NTY7ZS5UY2Fyb249NjExO2UucGFydGlhbGRpZmY9NDc2O2UueWRpZXJlc2lzPTUwMDtlLk5hY3V0ZT03MjI7ZS5pY2lyY3VtZmxleD0yNzg7ZS5FY2lyY3VtZmxleD02Njc7ZS5hZGllcmVzaXM9NTU2O2UuZWRpZXJlc2lzPTU1NjtlLmNhY3V0ZT01MDA7ZS5uYWN1dGU9NTU2O2UudW1hY3Jvbj01NTY7ZS5OY2Fyb249NzIyO2UuSWFjdXRlPTI3ODtlLnBsdXNtaW51cz01ODQ7ZS5icm9rZW5iYXI9MjYwO2UucmVnaXN0ZXJlZD03Mzc7ZS5HYnJldmU9Nzc4O2UuSWRvdGFjY2VudD0yNzg7ZS5zdW1tYXRpb249NjAwO2UuRWdyYXZlPTY2NztlLnJhY3V0ZT0zMzM7ZS5vbWFjcm9uPTU1NjtlLlphY3V0ZT02MTE7ZS5aY2Fyb249NjExO2UuZ3JlYXRlcmVxdWFsPTU0OTtlLkV0aD03MjI7ZS5DY2VkaWxsYT03MjI7ZS5sY29tbWFhY2NlbnQ9MjIyO2UudGNhcm9uPTMxNztlLmVvZ29uZWs9NTU2O2UuVW9nb25laz03MjI7ZS5BYWN1dGU9NjY3O2UuQWRpZXJlc2lzPTY2NztlLmVncmF2ZT01NTY7ZS56YWN1dGU9NTAwO2UuaW9nb25laz0yMjI7ZS5PYWN1dGU9Nzc4O2Uub2FjdXRlPTU1NjtlLmFtYWNyb249NTU2O2Uuc2FjdXRlPTUwMDtlLmlkaWVyZXNpcz0yNzg7ZS5PY2lyY3VtZmxleD03Nzg7ZS5VZ3JhdmU9NzIyO2UuRGVsdGE9NjEyO2UudGhvcm49NTU2O2UudHdvc3VwZXJpb3I9MzMzO2UuT2RpZXJlc2lzPTc3ODtlLm11PTU1NjtlLmlncmF2ZT0yNzg7ZS5vaHVuZ2FydW1sYXV0PTU1NjtlLkVvZ29uZWs9NjY3O2UuZGNyb2F0PTU1NjtlLnRocmVlcXVhcnRlcnM9ODM0O2UuU2NlZGlsbGE9NjY3O2UubGNhcm9uPTI5OTtlLktjb21tYWFjY2VudD02Njc7ZS5MYWN1dGU9NTU2O2UudHJhZGVtYXJrPTFlMztlLmVkb3RhY2NlbnQ9NTU2O2UuSWdyYXZlPTI3ODtlLkltYWNyb249Mjc4O2UuTGNhcm9uPTU1NjtlLm9uZWhhbGY9ODM0O2UubGVzc2VxdWFsPTU0OTtlLm9jaXJjdW1mbGV4PTU1NjtlLm50aWxkZT01NTY7ZS5VaHVuZ2FydW1sYXV0PTcyMjtlLkVhY3V0ZT02Njc7ZS5lbWFjcm9uPTU1NjtlLmdicmV2ZT01NTY7ZS5vbmVxdWFydGVyPTgzNDtlLlNjYXJvbj02Njc7ZS5TY29tbWFhY2NlbnQ9NjY3O2UuT2h1bmdhcnVtbGF1dD03Nzg7ZS5kZWdyZWU9NDAwO2Uub2dyYXZlPTU1NjtlLkNjYXJvbj03MjI7ZS51Z3JhdmU9NTU2O2UucmFkaWNhbD00NTM7ZS5EY2Fyb249NzIyO2UucmNvbW1hYWNjZW50PTMzMztlLk50aWxkZT03MjI7ZS5vdGlsZGU9NTU2O2UuUmNvbW1hYWNjZW50PTcyMjtlLkxjb21tYWFjY2VudD01NTY7ZS5BdGlsZGU9NjY3O2UuQW9nb25laz02Njc7ZS5BcmluZz02Njc7ZS5PdGlsZGU9Nzc4O2UuemRvdGFjY2VudD01MDA7ZS5FY2Fyb249NjY3O2UuSW9nb25laz0yNzg7ZS5rY29tbWFhY2NlbnQ9NTAwO2UubWludXM9NTg0O2UuSWNpcmN1bWZsZXg9Mjc4O2UubmNhcm9uPTU1NjtlLnRjb21tYWFjY2VudD0yNzg7ZS5sb2dpY2Fsbm90PTU4NDtlLm9kaWVyZXNpcz01NTY7ZS51ZGllcmVzaXM9NTU2O2Uubm90ZXF1YWw9NTQ5O2UuZ2NvbW1hYWNjZW50PTU1NjtlLmV0aD01NTY7ZS56Y2Fyb249NTAwO2UubmNvbW1hYWNjZW50PTU1NjtlLm9uZXN1cGVyaW9yPTMzMztlLmltYWNyb249Mjc4O2UuRXVybz01NTZ9KSk7ZS5TeW1ib2w9KDAsci5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI1MDtlLmV4Y2xhbT0zMzM7ZS51bml2ZXJzYWw9NzEzO2UubnVtYmVyc2lnbj01MDA7ZS5leGlzdGVudGlhbD01NDk7ZS5wZXJjZW50PTgzMztlLmFtcGVyc2FuZD03Nzg7ZS5zdWNodGhhdD00Mzk7ZS5wYXJlbmxlZnQ9MzMzO2UucGFyZW5yaWdodD0zMzM7ZS5hc3Rlcmlza21hdGg9NTAwO2UucGx1cz01NDk7ZS5jb21tYT0yNTA7ZS5taW51cz01NDk7ZS5wZXJpb2Q9MjUwO2Uuc2xhc2g9Mjc4O2UuemVybz01MDA7ZS5vbmU9NTAwO2UudHdvPTUwMDtlLnRocmVlPTUwMDtlLmZvdXI9NTAwO2UuZml2ZT01MDA7ZS5zaXg9NTAwO2Uuc2V2ZW49NTAwO2UuZWlnaHQ9NTAwO2UubmluZT01MDA7ZS5jb2xvbj0yNzg7ZS5zZW1pY29sb249Mjc4O2UubGVzcz01NDk7ZS5lcXVhbD01NDk7ZS5ncmVhdGVyPTU0OTtlLnF1ZXN0aW9uPTQ0NDtlLmNvbmdydWVudD01NDk7ZS5BbHBoYT03MjI7ZS5CZXRhPTY2NztlLkNoaT03MjI7ZS5EZWx0YT02MTI7ZS5FcHNpbG9uPTYxMTtlLlBoaT03NjM7ZS5HYW1tYT02MDM7ZS5FdGE9NzIyO2UuSW90YT0zMzM7ZS50aGV0YTE9NjMxO2UuS2FwcGE9NzIyO2UuTGFtYmRhPTY4NjtlLk11PTg4OTtlLk51PTcyMjtlLk9taWNyb249NzIyO2UuUGk9NzY4O2UuVGhldGE9NzQxO2UuUmhvPTU1NjtlLlNpZ21hPTU5MjtlLlRhdT02MTE7ZS5VcHNpbG9uPTY5MDtlLnNpZ21hMT00Mzk7ZS5PbWVnYT03Njg7ZS5YaT02NDU7ZS5Qc2k9Nzk1O2UuWmV0YT02MTE7ZS5icmFja2V0bGVmdD0zMzM7ZS50aGVyZWZvcmU9ODYzO2UuYnJhY2tldHJpZ2h0PTMzMztlLnBlcnBlbmRpY3VsYXI9NjU4O2UudW5kZXJzY29yZT01MDA7ZS5yYWRpY2FsZXg9NTAwO2UuYWxwaGE9NjMxO2UuYmV0YT01NDk7ZS5jaGk9NTQ5O2UuZGVsdGE9NDk0O2UuZXBzaWxvbj00Mzk7ZS5waGk9NTIxO2UuZ2FtbWE9NDExO2UuZXRhPTYwMztlLmlvdGE9MzI5O2UucGhpMT02MDM7ZS5rYXBwYT01NDk7ZS5sYW1iZGE9NTQ5O2UubXU9NTc2O2UubnU9NTIxO2Uub21pY3Jvbj01NDk7ZS5waT01NDk7ZS50aGV0YT01MjE7ZS5yaG89NTQ5O2Uuc2lnbWE9NjAzO2UudGF1PTQzOTtlLnVwc2lsb249NTc2O2Uub21lZ2ExPTcxMztlLm9tZWdhPTY4NjtlLnhpPTQ5MztlLnBzaT02ODY7ZS56ZXRhPTQ5NDtlLmJyYWNlbGVmdD00ODA7ZS5iYXI9MjAwO2UuYnJhY2VyaWdodD00ODA7ZS5zaW1pbGFyPTU0OTtlLkV1cm89NzUwO2UuVXBzaWxvbjE9NjIwO2UubWludXRlPTI0NztlLmxlc3NlcXVhbD01NDk7ZS5mcmFjdGlvbj0xNjc7ZS5pbmZpbml0eT03MTM7ZS5mbG9yaW49NTAwO2UuY2x1Yj03NTM7ZS5kaWFtb25kPTc1MztlLmhlYXJ0PTc1MztlLnNwYWRlPTc1MztlLmFycm93Ym90aD0xMDQyO2UuYXJyb3dsZWZ0PTk4NztlLmFycm93dXA9NjAzO2UuYXJyb3dyaWdodD05ODc7ZS5hcnJvd2Rvd249NjAzO2UuZGVncmVlPTQwMDtlLnBsdXNtaW51cz01NDk7ZS5zZWNvbmQ9NDExO2UuZ3JlYXRlcmVxdWFsPTU0OTtlLm11bHRpcGx5PTU0OTtlLnByb3BvcnRpb25hbD03MTM7ZS5wYXJ0aWFsZGlmZj00OTQ7ZS5idWxsZXQ9NDYwO2UuZGl2aWRlPTU0OTtlLm5vdGVxdWFsPTU0OTtlLmVxdWl2YWxlbmNlPTU0OTtlLmFwcHJveGVxdWFsPTU0OTtlLmVsbGlwc2lzPTFlMztlLmFycm93dmVydGV4PTYwMztlLmFycm93aG9yaXpleD0xZTM7ZS5jYXJyaWFnZXJldHVybj02NTg7ZS5hbGVwaD04MjM7ZS5JZnJha3R1cj02ODY7ZS5SZnJha3R1cj03OTU7ZS53ZWllcnN0cmFzcz05ODc7ZS5jaXJjbGVtdWx0aXBseT03Njg7ZS5jaXJjbGVwbHVzPTc2ODtlLmVtcHR5c2V0PTgyMztlLmludGVyc2VjdGlvbj03Njg7ZS51bmlvbj03Njg7ZS5wcm9wZXJzdXBlcnNldD03MTM7ZS5yZWZsZXhzdXBlcnNldD03MTM7ZS5ub3RzdWJzZXQ9NzEzO2UucHJvcGVyc3Vic2V0PTcxMztlLnJlZmxleHN1YnNldD03MTM7ZS5lbGVtZW50PTcxMztlLm5vdGVsZW1lbnQ9NzEzO2UuYW5nbGU9NzY4O2UuZ3JhZGllbnQ9NzEzO2UucmVnaXN0ZXJzZXJpZj03OTA7ZS5jb3B5cmlnaHRzZXJpZj03OTA7ZS50cmFkZW1hcmtzZXJpZj04OTA7ZS5wcm9kdWN0PTgyMztlLnJhZGljYWw9NTQ5O2UuZG90bWF0aD0yNTA7ZS5sb2dpY2Fsbm90PTcxMztlLmxvZ2ljYWxhbmQ9NjAzO2UubG9naWNhbG9yPTYwMztlLmFycm93ZGJsYm90aD0xMDQyO2UuYXJyb3dkYmxsZWZ0PTk4NztlLmFycm93ZGJsdXA9NjAzO2UuYXJyb3dkYmxyaWdodD05ODc7ZS5hcnJvd2RibGRvd249NjAzO2UubG96ZW5nZT00OTQ7ZS5hbmdsZWxlZnQ9MzI5O2UucmVnaXN0ZXJzYW5zPTc5MDtlLmNvcHlyaWdodHNhbnM9NzkwO2UudHJhZGVtYXJrc2Fucz03ODY7ZS5zdW1tYXRpb249NzEzO2UucGFyZW5sZWZ0dHA9Mzg0O2UucGFyZW5sZWZ0ZXg9Mzg0O2UucGFyZW5sZWZ0YnQ9Mzg0O2UuYnJhY2tldGxlZnR0cD0zODQ7ZS5icmFja2V0bGVmdGV4PTM4NDtlLmJyYWNrZXRsZWZ0YnQ9Mzg0O2UuYnJhY2VsZWZ0dHA9NDk0O2UuYnJhY2VsZWZ0bWlkPTQ5NDtlLmJyYWNlbGVmdGJ0PTQ5NDtlLmJyYWNlZXg9NDk0O2UuYW5nbGVyaWdodD0zMjk7ZS5pbnRlZ3JhbD0yNzQ7ZS5pbnRlZ3JhbHRwPTY4NjtlLmludGVncmFsZXg9Njg2O2UuaW50ZWdyYWxidD02ODY7ZS5wYXJlbnJpZ2h0dHA9Mzg0O2UucGFyZW5yaWdodGV4PTM4NDtlLnBhcmVucmlnaHRidD0zODQ7ZS5icmFja2V0cmlnaHR0cD0zODQ7ZS5icmFja2V0cmlnaHRleD0zODQ7ZS5icmFja2V0cmlnaHRidD0zODQ7ZS5icmFjZXJpZ2h0dHA9NDk0O2UuYnJhY2VyaWdodG1pZD00OTQ7ZS5icmFjZXJpZ2h0YnQ9NDk0O2UuYXBwbGU9NzkwfSkpO2VbIlRpbWVzLVJvbWFuIl09KDAsci5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI1MDtlLmV4Y2xhbT0zMzM7ZS5xdW90ZWRibD00MDg7ZS5udW1iZXJzaWduPTUwMDtlLmRvbGxhcj01MDA7ZS5wZXJjZW50PTgzMztlLmFtcGVyc2FuZD03Nzg7ZS5xdW90ZXJpZ2h0PTMzMztlLnBhcmVubGVmdD0zMzM7ZS5wYXJlbnJpZ2h0PTMzMztlLmFzdGVyaXNrPTUwMDtlLnBsdXM9NTY0O2UuY29tbWE9MjUwO2UuaHlwaGVuPTMzMztlLnBlcmlvZD0yNTA7ZS5zbGFzaD0yNzg7ZS56ZXJvPTUwMDtlLm9uZT01MDA7ZS50d289NTAwO2UudGhyZWU9NTAwO2UuZm91cj01MDA7ZS5maXZlPTUwMDtlLnNpeD01MDA7ZS5zZXZlbj01MDA7ZS5laWdodD01MDA7ZS5uaW5lPTUwMDtlLmNvbG9uPTI3ODtlLnNlbWljb2xvbj0yNzg7ZS5sZXNzPTU2NDtlLmVxdWFsPTU2NDtlLmdyZWF0ZXI9NTY0O2UucXVlc3Rpb249NDQ0O2UuYXQ9OTIxO2UuQT03MjI7ZS5CPTY2NztlLkM9NjY3O2UuRD03MjI7ZS5FPTYxMTtlLkY9NTU2O2UuRz03MjI7ZS5IPTcyMjtlLkk9MzMzO2UuSj0zODk7ZS5LPTcyMjtlLkw9NjExO2UuTT04ODk7ZS5OPTcyMjtlLk89NzIyO2UuUD01NTY7ZS5RPTcyMjtlLlI9NjY3O2UuUz01NTY7ZS5UPTYxMTtlLlU9NzIyO2UuVj03MjI7ZS5XPTk0NDtlLlg9NzIyO2UuWT03MjI7ZS5aPTYxMTtlLmJyYWNrZXRsZWZ0PTMzMztlLmJhY2tzbGFzaD0yNzg7ZS5icmFja2V0cmlnaHQ9MzMzO2UuYXNjaWljaXJjdW09NDY5O2UudW5kZXJzY29yZT01MDA7ZS5xdW90ZWxlZnQ9MzMzO2UuYT00NDQ7ZS5iPTUwMDtlLmM9NDQ0O2UuZD01MDA7ZS5lPTQ0NDtlLmY9MzMzO2UuZz01MDA7ZS5oPTUwMDtlLmk9Mjc4O2Uuaj0yNzg7ZS5rPTUwMDtlLmw9Mjc4O2UubT03Nzg7ZS5uPTUwMDtlLm89NTAwO2UucD01MDA7ZS5xPTUwMDtlLnI9MzMzO2Uucz0zODk7ZS50PTI3ODtlLnU9NTAwO2Uudj01MDA7ZS53PTcyMjtlLng9NTAwO2UueT01MDA7ZS56PTQ0NDtlLmJyYWNlbGVmdD00ODA7ZS5iYXI9MjAwO2UuYnJhY2VyaWdodD00ODA7ZS5hc2NpaXRpbGRlPTU0MTtlLmV4Y2xhbWRvd249MzMzO2UuY2VudD01MDA7ZS5zdGVybGluZz01MDA7ZS5mcmFjdGlvbj0xNjc7ZS55ZW49NTAwO2UuZmxvcmluPTUwMDtlLnNlY3Rpb249NTAwO2UuY3VycmVuY3k9NTAwO2UucXVvdGVzaW5nbGU9MTgwO2UucXVvdGVkYmxsZWZ0PTQ0NDtlLmd1aWxsZW1vdGxlZnQ9NTAwO2UuZ3VpbHNpbmdsbGVmdD0zMzM7ZS5ndWlsc2luZ2xyaWdodD0zMzM7ZS5maT01NTY7ZS5mbD01NTY7ZS5lbmRhc2g9NTAwO2UuZGFnZ2VyPTUwMDtlLmRhZ2dlcmRibD01MDA7ZS5wZXJpb2RjZW50ZXJlZD0yNTA7ZS5wYXJhZ3JhcGg9NDUzO2UuYnVsbGV0PTM1MDtlLnF1b3Rlc2luZ2xiYXNlPTMzMztlLnF1b3RlZGJsYmFzZT00NDQ7ZS5xdW90ZWRibHJpZ2h0PTQ0NDtlLmd1aWxsZW1vdHJpZ2h0PTUwMDtlLmVsbGlwc2lzPTFlMztlLnBlcnRob3VzYW5kPTFlMztlLnF1ZXN0aW9uZG93bj00NDQ7ZS5ncmF2ZT0zMzM7ZS5hY3V0ZT0zMzM7ZS5jaXJjdW1mbGV4PTMzMztlLnRpbGRlPTMzMztlLm1hY3Jvbj0zMzM7ZS5icmV2ZT0zMzM7ZS5kb3RhY2NlbnQ9MzMzO2UuZGllcmVzaXM9MzMzO2UucmluZz0zMzM7ZS5jZWRpbGxhPTMzMztlLmh1bmdhcnVtbGF1dD0zMzM7ZS5vZ29uZWs9MzMzO2UuY2Fyb249MzMzO2UuZW1kYXNoPTFlMztlLkFFPTg4OTtlLm9yZGZlbWluaW5lPTI3NjtlLkxzbGFzaD02MTE7ZS5Pc2xhc2g9NzIyO2UuT0U9ODg5O2Uub3JkbWFzY3VsaW5lPTMxMDtlLmFlPTY2NztlLmRvdGxlc3NpPTI3ODtlLmxzbGFzaD0yNzg7ZS5vc2xhc2g9NTAwO2Uub2U9NzIyO2UuZ2VybWFuZGJscz01MDA7ZS5JZGllcmVzaXM9MzMzO2UuZWFjdXRlPTQ0NDtlLmFicmV2ZT00NDQ7ZS51aHVuZ2FydW1sYXV0PTUwMDtlLmVjYXJvbj00NDQ7ZS5ZZGllcmVzaXM9NzIyO2UuZGl2aWRlPTU2NDtlLllhY3V0ZT03MjI7ZS5BY2lyY3VtZmxleD03MjI7ZS5hYWN1dGU9NDQ0O2UuVWNpcmN1bWZsZXg9NzIyO2UueWFjdXRlPTUwMDtlLnNjb21tYWFjY2VudD0zODk7ZS5lY2lyY3VtZmxleD00NDQ7ZS5VcmluZz03MjI7ZS5VZGllcmVzaXM9NzIyO2UuYW9nb25laz00NDQ7ZS5VYWN1dGU9NzIyO2UudW9nb25laz01MDA7ZS5FZGllcmVzaXM9NjExO2UuRGNyb2F0PTcyMjtlLmNvbW1hYWNjZW50PTI1MDtlLmNvcHlyaWdodD03NjA7ZS5FbWFjcm9uPTYxMTtlLmNjYXJvbj00NDQ7ZS5hcmluZz00NDQ7ZS5OY29tbWFhY2NlbnQ9NzIyO2UubGFjdXRlPTI3ODtlLmFncmF2ZT00NDQ7ZS5UY29tbWFhY2NlbnQ9NjExO2UuQ2FjdXRlPTY2NztlLmF0aWxkZT00NDQ7ZS5FZG90YWNjZW50PTYxMTtlLnNjYXJvbj0zODk7ZS5zY2VkaWxsYT0zODk7ZS5pYWN1dGU9Mjc4O2UubG96ZW5nZT00NzE7ZS5SY2Fyb249NjY3O2UuR2NvbW1hYWNjZW50PTcyMjtlLnVjaXJjdW1mbGV4PTUwMDtlLmFjaXJjdW1mbGV4PTQ0NDtlLkFtYWNyb249NzIyO2UucmNhcm9uPTMzMztlLmNjZWRpbGxhPTQ0NDtlLlpkb3RhY2NlbnQ9NjExO2UuVGhvcm49NTU2O2UuT21hY3Jvbj03MjI7ZS5SYWN1dGU9NjY3O2UuU2FjdXRlPTU1NjtlLmRjYXJvbj01ODg7ZS5VbWFjcm9uPTcyMjtlLnVyaW5nPTUwMDtlLnRocmVlc3VwZXJpb3I9MzAwO2UuT2dyYXZlPTcyMjtlLkFncmF2ZT03MjI7ZS5BYnJldmU9NzIyO2UubXVsdGlwbHk9NTY0O2UudWFjdXRlPTUwMDtlLlRjYXJvbj02MTE7ZS5wYXJ0aWFsZGlmZj00NzY7ZS55ZGllcmVzaXM9NTAwO2UuTmFjdXRlPTcyMjtlLmljaXJjdW1mbGV4PTI3ODtlLkVjaXJjdW1mbGV4PTYxMTtlLmFkaWVyZXNpcz00NDQ7ZS5lZGllcmVzaXM9NDQ0O2UuY2FjdXRlPTQ0NDtlLm5hY3V0ZT01MDA7ZS51bWFjcm9uPTUwMDtlLk5jYXJvbj03MjI7ZS5JYWN1dGU9MzMzO2UucGx1c21pbnVzPTU2NDtlLmJyb2tlbmJhcj0yMDA7ZS5yZWdpc3RlcmVkPTc2MDtlLkdicmV2ZT03MjI7ZS5JZG90YWNjZW50PTMzMztlLnN1bW1hdGlvbj02MDA7ZS5FZ3JhdmU9NjExO2UucmFjdXRlPTMzMztlLm9tYWNyb249NTAwO2UuWmFjdXRlPTYxMTtlLlpjYXJvbj02MTE7ZS5ncmVhdGVyZXF1YWw9NTQ5O2UuRXRoPTcyMjtlLkNjZWRpbGxhPTY2NztlLmxjb21tYWFjY2VudD0yNzg7ZS50Y2Fyb249MzI2O2UuZW9nb25laz00NDQ7ZS5Vb2dvbmVrPTcyMjtlLkFhY3V0ZT03MjI7ZS5BZGllcmVzaXM9NzIyO2UuZWdyYXZlPTQ0NDtlLnphY3V0ZT00NDQ7ZS5pb2dvbmVrPTI3ODtlLk9hY3V0ZT03MjI7ZS5vYWN1dGU9NTAwO2UuYW1hY3Jvbj00NDQ7ZS5zYWN1dGU9Mzg5O2UuaWRpZXJlc2lzPTI3ODtlLk9jaXJjdW1mbGV4PTcyMjtlLlVncmF2ZT03MjI7ZS5EZWx0YT02MTI7ZS50aG9ybj01MDA7ZS50d29zdXBlcmlvcj0zMDA7ZS5PZGllcmVzaXM9NzIyO2UubXU9NTAwO2UuaWdyYXZlPTI3ODtlLm9odW5nYXJ1bWxhdXQ9NTAwO2UuRW9nb25laz02MTE7ZS5kY3JvYXQ9NTAwO2UudGhyZWVxdWFydGVycz03NTA7ZS5TY2VkaWxsYT01NTY7ZS5sY2Fyb249MzQ0O2UuS2NvbW1hYWNjZW50PTcyMjtlLkxhY3V0ZT02MTE7ZS50cmFkZW1hcms9OTgwO2UuZWRvdGFjY2VudD00NDQ7ZS5JZ3JhdmU9MzMzO2UuSW1hY3Jvbj0zMzM7ZS5MY2Fyb249NjExO2Uub25laGFsZj03NTA7ZS5sZXNzZXF1YWw9NTQ5O2Uub2NpcmN1bWZsZXg9NTAwO2UubnRpbGRlPTUwMDtlLlVodW5nYXJ1bWxhdXQ9NzIyO2UuRWFjdXRlPTYxMTtlLmVtYWNyb249NDQ0O2UuZ2JyZXZlPTUwMDtlLm9uZXF1YXJ0ZXI9NzUwO2UuU2Nhcm9uPTU1NjtlLlNjb21tYWFjY2VudD01NTY7ZS5PaHVuZ2FydW1sYXV0PTcyMjtlLmRlZ3JlZT00MDA7ZS5vZ3JhdmU9NTAwO2UuQ2Nhcm9uPTY2NztlLnVncmF2ZT01MDA7ZS5yYWRpY2FsPTQ1MztlLkRjYXJvbj03MjI7ZS5yY29tbWFhY2NlbnQ9MzMzO2UuTnRpbGRlPTcyMjtlLm90aWxkZT01MDA7ZS5SY29tbWFhY2NlbnQ9NjY3O2UuTGNvbW1hYWNjZW50PTYxMTtlLkF0aWxkZT03MjI7ZS5Bb2dvbmVrPTcyMjtlLkFyaW5nPTcyMjtlLk90aWxkZT03MjI7ZS56ZG90YWNjZW50PTQ0NDtlLkVjYXJvbj02MTE7ZS5Jb2dvbmVrPTMzMztlLmtjb21tYWFjY2VudD01MDA7ZS5taW51cz01NjQ7ZS5JY2lyY3VtZmxleD0zMzM7ZS5uY2Fyb249NTAwO2UudGNvbW1hYWNjZW50PTI3ODtlLmxvZ2ljYWxub3Q9NTY0O2Uub2RpZXJlc2lzPTUwMDtlLnVkaWVyZXNpcz01MDA7ZS5ub3RlcXVhbD01NDk7ZS5nY29tbWFhY2NlbnQ9NTAwO2UuZXRoPTUwMDtlLnpjYXJvbj00NDQ7ZS5uY29tbWFhY2NlbnQ9NTAwO2Uub25lc3VwZXJpb3I9MzAwO2UuaW1hY3Jvbj0yNzg7ZS5FdXJvPTUwMH0pKTtlWyJUaW1lcy1Cb2xkIl09KDAsci5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI1MDtlLmV4Y2xhbT0zMzM7ZS5xdW90ZWRibD01NTU7ZS5udW1iZXJzaWduPTUwMDtlLmRvbGxhcj01MDA7ZS5wZXJjZW50PTFlMztlLmFtcGVyc2FuZD04MzM7ZS5xdW90ZXJpZ2h0PTMzMztlLnBhcmVubGVmdD0zMzM7ZS5wYXJlbnJpZ2h0PTMzMztlLmFzdGVyaXNrPTUwMDtlLnBsdXM9NTcwO2UuY29tbWE9MjUwO2UuaHlwaGVuPTMzMztlLnBlcmlvZD0yNTA7ZS5zbGFzaD0yNzg7ZS56ZXJvPTUwMDtlLm9uZT01MDA7ZS50d289NTAwO2UudGhyZWU9NTAwO2UuZm91cj01MDA7ZS5maXZlPTUwMDtlLnNpeD01MDA7ZS5zZXZlbj01MDA7ZS5laWdodD01MDA7ZS5uaW5lPTUwMDtlLmNvbG9uPTMzMztlLnNlbWljb2xvbj0zMzM7ZS5sZXNzPTU3MDtlLmVxdWFsPTU3MDtlLmdyZWF0ZXI9NTcwO2UucXVlc3Rpb249NTAwO2UuYXQ9OTMwO2UuQT03MjI7ZS5CPTY2NztlLkM9NzIyO2UuRD03MjI7ZS5FPTY2NztlLkY9NjExO2UuRz03Nzg7ZS5IPTc3ODtlLkk9Mzg5O2UuSj01MDA7ZS5LPTc3ODtlLkw9NjY3O2UuTT05NDQ7ZS5OPTcyMjtlLk89Nzc4O2UuUD02MTE7ZS5RPTc3ODtlLlI9NzIyO2UuUz01NTY7ZS5UPTY2NztlLlU9NzIyO2UuVj03MjI7ZS5XPTFlMztlLlg9NzIyO2UuWT03MjI7ZS5aPTY2NztlLmJyYWNrZXRsZWZ0PTMzMztlLmJhY2tzbGFzaD0yNzg7ZS5icmFja2V0cmlnaHQ9MzMzO2UuYXNjaWljaXJjdW09NTgxO2UudW5kZXJzY29yZT01MDA7ZS5xdW90ZWxlZnQ9MzMzO2UuYT01MDA7ZS5iPTU1NjtlLmM9NDQ0O2UuZD01NTY7ZS5lPTQ0NDtlLmY9MzMzO2UuZz01MDA7ZS5oPTU1NjtlLmk9Mjc4O2Uuaj0zMzM7ZS5rPTU1NjtlLmw9Mjc4O2UubT04MzM7ZS5uPTU1NjtlLm89NTAwO2UucD01NTY7ZS5xPTU1NjtlLnI9NDQ0O2Uucz0zODk7ZS50PTMzMztlLnU9NTU2O2Uudj01MDA7ZS53PTcyMjtlLng9NTAwO2UueT01MDA7ZS56PTQ0NDtlLmJyYWNlbGVmdD0zOTQ7ZS5iYXI9MjIwO2UuYnJhY2VyaWdodD0zOTQ7ZS5hc2NpaXRpbGRlPTUyMDtlLmV4Y2xhbWRvd249MzMzO2UuY2VudD01MDA7ZS5zdGVybGluZz01MDA7ZS5mcmFjdGlvbj0xNjc7ZS55ZW49NTAwO2UuZmxvcmluPTUwMDtlLnNlY3Rpb249NTAwO2UuY3VycmVuY3k9NTAwO2UucXVvdGVzaW5nbGU9Mjc4O2UucXVvdGVkYmxsZWZ0PTUwMDtlLmd1aWxsZW1vdGxlZnQ9NTAwO2UuZ3VpbHNpbmdsbGVmdD0zMzM7ZS5ndWlsc2luZ2xyaWdodD0zMzM7ZS5maT01NTY7ZS5mbD01NTY7ZS5lbmRhc2g9NTAwO2UuZGFnZ2VyPTUwMDtlLmRhZ2dlcmRibD01MDA7ZS5wZXJpb2RjZW50ZXJlZD0yNTA7ZS5wYXJhZ3JhcGg9NTQwO2UuYnVsbGV0PTM1MDtlLnF1b3Rlc2luZ2xiYXNlPTMzMztlLnF1b3RlZGJsYmFzZT01MDA7ZS5xdW90ZWRibHJpZ2h0PTUwMDtlLmd1aWxsZW1vdHJpZ2h0PTUwMDtlLmVsbGlwc2lzPTFlMztlLnBlcnRob3VzYW5kPTFlMztlLnF1ZXN0aW9uZG93bj01MDA7ZS5ncmF2ZT0zMzM7ZS5hY3V0ZT0zMzM7ZS5jaXJjdW1mbGV4PTMzMztlLnRpbGRlPTMzMztlLm1hY3Jvbj0zMzM7ZS5icmV2ZT0zMzM7ZS5kb3RhY2NlbnQ9MzMzO2UuZGllcmVzaXM9MzMzO2UucmluZz0zMzM7ZS5jZWRpbGxhPTMzMztlLmh1bmdhcnVtbGF1dD0zMzM7ZS5vZ29uZWs9MzMzO2UuY2Fyb249MzMzO2UuZW1kYXNoPTFlMztlLkFFPTFlMztlLm9yZGZlbWluaW5lPTMwMDtlLkxzbGFzaD02Njc7ZS5Pc2xhc2g9Nzc4O2UuT0U9MWUzO2Uub3JkbWFzY3VsaW5lPTMzMDtlLmFlPTcyMjtlLmRvdGxlc3NpPTI3ODtlLmxzbGFzaD0yNzg7ZS5vc2xhc2g9NTAwO2Uub2U9NzIyO2UuZ2VybWFuZGJscz01NTY7ZS5JZGllcmVzaXM9Mzg5O2UuZWFjdXRlPTQ0NDtlLmFicmV2ZT01MDA7ZS51aHVuZ2FydW1sYXV0PTU1NjtlLmVjYXJvbj00NDQ7ZS5ZZGllcmVzaXM9NzIyO2UuZGl2aWRlPTU3MDtlLllhY3V0ZT03MjI7ZS5BY2lyY3VtZmxleD03MjI7ZS5hYWN1dGU9NTAwO2UuVWNpcmN1bWZsZXg9NzIyO2UueWFjdXRlPTUwMDtlLnNjb21tYWFjY2VudD0zODk7ZS5lY2lyY3VtZmxleD00NDQ7ZS5VcmluZz03MjI7ZS5VZGllcmVzaXM9NzIyO2UuYW9nb25laz01MDA7ZS5VYWN1dGU9NzIyO2UudW9nb25laz01NTY7ZS5FZGllcmVzaXM9NjY3O2UuRGNyb2F0PTcyMjtlLmNvbW1hYWNjZW50PTI1MDtlLmNvcHlyaWdodD03NDc7ZS5FbWFjcm9uPTY2NztlLmNjYXJvbj00NDQ7ZS5hcmluZz01MDA7ZS5OY29tbWFhY2NlbnQ9NzIyO2UubGFjdXRlPTI3ODtlLmFncmF2ZT01MDA7ZS5UY29tbWFhY2NlbnQ9NjY3O2UuQ2FjdXRlPTcyMjtlLmF0aWxkZT01MDA7ZS5FZG90YWNjZW50PTY2NztlLnNjYXJvbj0zODk7ZS5zY2VkaWxsYT0zODk7ZS5pYWN1dGU9Mjc4O2UubG96ZW5nZT00OTQ7ZS5SY2Fyb249NzIyO2UuR2NvbW1hYWNjZW50PTc3ODtlLnVjaXJjdW1mbGV4PTU1NjtlLmFjaXJjdW1mbGV4PTUwMDtlLkFtYWNyb249NzIyO2UucmNhcm9uPTQ0NDtlLmNjZWRpbGxhPTQ0NDtlLlpkb3RhY2NlbnQ9NjY3O2UuVGhvcm49NjExO2UuT21hY3Jvbj03Nzg7ZS5SYWN1dGU9NzIyO2UuU2FjdXRlPTU1NjtlLmRjYXJvbj02NzI7ZS5VbWFjcm9uPTcyMjtlLnVyaW5nPTU1NjtlLnRocmVlc3VwZXJpb3I9MzAwO2UuT2dyYXZlPTc3ODtlLkFncmF2ZT03MjI7ZS5BYnJldmU9NzIyO2UubXVsdGlwbHk9NTcwO2UudWFjdXRlPTU1NjtlLlRjYXJvbj02Njc7ZS5wYXJ0aWFsZGlmZj00OTQ7ZS55ZGllcmVzaXM9NTAwO2UuTmFjdXRlPTcyMjtlLmljaXJjdW1mbGV4PTI3ODtlLkVjaXJjdW1mbGV4PTY2NztlLmFkaWVyZXNpcz01MDA7ZS5lZGllcmVzaXM9NDQ0O2UuY2FjdXRlPTQ0NDtlLm5hY3V0ZT01NTY7ZS51bWFjcm9uPTU1NjtlLk5jYXJvbj03MjI7ZS5JYWN1dGU9Mzg5O2UucGx1c21pbnVzPTU3MDtlLmJyb2tlbmJhcj0yMjA7ZS5yZWdpc3RlcmVkPTc0NztlLkdicmV2ZT03Nzg7ZS5JZG90YWNjZW50PTM4OTtlLnN1bW1hdGlvbj02MDA7ZS5FZ3JhdmU9NjY3O2UucmFjdXRlPTQ0NDtlLm9tYWNyb249NTAwO2UuWmFjdXRlPTY2NztlLlpjYXJvbj02Njc7ZS5ncmVhdGVyZXF1YWw9NTQ5O2UuRXRoPTcyMjtlLkNjZWRpbGxhPTcyMjtlLmxjb21tYWFjY2VudD0yNzg7ZS50Y2Fyb249NDE2O2UuZW9nb25laz00NDQ7ZS5Vb2dvbmVrPTcyMjtlLkFhY3V0ZT03MjI7ZS5BZGllcmVzaXM9NzIyO2UuZWdyYXZlPTQ0NDtlLnphY3V0ZT00NDQ7ZS5pb2dvbmVrPTI3ODtlLk9hY3V0ZT03Nzg7ZS5vYWN1dGU9NTAwO2UuYW1hY3Jvbj01MDA7ZS5zYWN1dGU9Mzg5O2UuaWRpZXJlc2lzPTI3ODtlLk9jaXJjdW1mbGV4PTc3ODtlLlVncmF2ZT03MjI7ZS5EZWx0YT02MTI7ZS50aG9ybj01NTY7ZS50d29zdXBlcmlvcj0zMDA7ZS5PZGllcmVzaXM9Nzc4O2UubXU9NTU2O2UuaWdyYXZlPTI3ODtlLm9odW5nYXJ1bWxhdXQ9NTAwO2UuRW9nb25laz02Njc7ZS5kY3JvYXQ9NTU2O2UudGhyZWVxdWFydGVycz03NTA7ZS5TY2VkaWxsYT01NTY7ZS5sY2Fyb249Mzk0O2UuS2NvbW1hYWNjZW50PTc3ODtlLkxhY3V0ZT02Njc7ZS50cmFkZW1hcms9MWUzO2UuZWRvdGFjY2VudD00NDQ7ZS5JZ3JhdmU9Mzg5O2UuSW1hY3Jvbj0zODk7ZS5MY2Fyb249NjY3O2Uub25laGFsZj03NTA7ZS5sZXNzZXF1YWw9NTQ5O2Uub2NpcmN1bWZsZXg9NTAwO2UubnRpbGRlPTU1NjtlLlVodW5nYXJ1bWxhdXQ9NzIyO2UuRWFjdXRlPTY2NztlLmVtYWNyb249NDQ0O2UuZ2JyZXZlPTUwMDtlLm9uZXF1YXJ0ZXI9NzUwO2UuU2Nhcm9uPTU1NjtlLlNjb21tYWFjY2VudD01NTY7ZS5PaHVuZ2FydW1sYXV0PTc3ODtlLmRlZ3JlZT00MDA7ZS5vZ3JhdmU9NTAwO2UuQ2Nhcm9uPTcyMjtlLnVncmF2ZT01NTY7ZS5yYWRpY2FsPTU0OTtlLkRjYXJvbj03MjI7ZS5yY29tbWFhY2NlbnQ9NDQ0O2UuTnRpbGRlPTcyMjtlLm90aWxkZT01MDA7ZS5SY29tbWFhY2NlbnQ9NzIyO2UuTGNvbW1hYWNjZW50PTY2NztlLkF0aWxkZT03MjI7ZS5Bb2dvbmVrPTcyMjtlLkFyaW5nPTcyMjtlLk90aWxkZT03Nzg7ZS56ZG90YWNjZW50PTQ0NDtlLkVjYXJvbj02Njc7ZS5Jb2dvbmVrPTM4OTtlLmtjb21tYWFjY2VudD01NTY7ZS5taW51cz01NzA7ZS5JY2lyY3VtZmxleD0zODk7ZS5uY2Fyb249NTU2O2UudGNvbW1hYWNjZW50PTMzMztlLmxvZ2ljYWxub3Q9NTcwO2Uub2RpZXJlc2lzPTUwMDtlLnVkaWVyZXNpcz01NTY7ZS5ub3RlcXVhbD01NDk7ZS5nY29tbWFhY2NlbnQ9NTAwO2UuZXRoPTUwMDtlLnpjYXJvbj00NDQ7ZS5uY29tbWFhY2NlbnQ9NTU2O2Uub25lc3VwZXJpb3I9MzAwO2UuaW1hY3Jvbj0yNzg7ZS5FdXJvPTUwMH0pKTtlWyJUaW1lcy1Cb2xkSXRhbGljIl09KDAsci5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI1MDtlLmV4Y2xhbT0zODk7ZS5xdW90ZWRibD01NTU7ZS5udW1iZXJzaWduPTUwMDtlLmRvbGxhcj01MDA7ZS5wZXJjZW50PTgzMztlLmFtcGVyc2FuZD03Nzg7ZS5xdW90ZXJpZ2h0PTMzMztlLnBhcmVubGVmdD0zMzM7ZS5wYXJlbnJpZ2h0PTMzMztlLmFzdGVyaXNrPTUwMDtlLnBsdXM9NTcwO2UuY29tbWE9MjUwO2UuaHlwaGVuPTMzMztlLnBlcmlvZD0yNTA7ZS5zbGFzaD0yNzg7ZS56ZXJvPTUwMDtlLm9uZT01MDA7ZS50d289NTAwO2UudGhyZWU9NTAwO2UuZm91cj01MDA7ZS5maXZlPTUwMDtlLnNpeD01MDA7ZS5zZXZlbj01MDA7ZS5laWdodD01MDA7ZS5uaW5lPTUwMDtlLmNvbG9uPTMzMztlLnNlbWljb2xvbj0zMzM7ZS5sZXNzPTU3MDtlLmVxdWFsPTU3MDtlLmdyZWF0ZXI9NTcwO2UucXVlc3Rpb249NTAwO2UuYXQ9ODMyO2UuQT02Njc7ZS5CPTY2NztlLkM9NjY3O2UuRD03MjI7ZS5FPTY2NztlLkY9NjY3O2UuRz03MjI7ZS5IPTc3ODtlLkk9Mzg5O2UuSj01MDA7ZS5LPTY2NztlLkw9NjExO2UuTT04ODk7ZS5OPTcyMjtlLk89NzIyO2UuUD02MTE7ZS5RPTcyMjtlLlI9NjY3O2UuUz01NTY7ZS5UPTYxMTtlLlU9NzIyO2UuVj02Njc7ZS5XPTg4OTtlLlg9NjY3O2UuWT02MTE7ZS5aPTYxMTtlLmJyYWNrZXRsZWZ0PTMzMztlLmJhY2tzbGFzaD0yNzg7ZS5icmFja2V0cmlnaHQ9MzMzO2UuYXNjaWljaXJjdW09NTcwO2UudW5kZXJzY29yZT01MDA7ZS5xdW90ZWxlZnQ9MzMzO2UuYT01MDA7ZS5iPTUwMDtlLmM9NDQ0O2UuZD01MDA7ZS5lPTQ0NDtlLmY9MzMzO2UuZz01MDA7ZS5oPTU1NjtlLmk9Mjc4O2Uuaj0yNzg7ZS5rPTUwMDtlLmw9Mjc4O2UubT03Nzg7ZS5uPTU1NjtlLm89NTAwO2UucD01MDA7ZS5xPTUwMDtlLnI9Mzg5O2Uucz0zODk7ZS50PTI3ODtlLnU9NTU2O2Uudj00NDQ7ZS53PTY2NztlLng9NTAwO2UueT00NDQ7ZS56PTM4OTtlLmJyYWNlbGVmdD0zNDg7ZS5iYXI9MjIwO2UuYnJhY2VyaWdodD0zNDg7ZS5hc2NpaXRpbGRlPTU3MDtlLmV4Y2xhbWRvd249Mzg5O2UuY2VudD01MDA7ZS5zdGVybGluZz01MDA7ZS5mcmFjdGlvbj0xNjc7ZS55ZW49NTAwO2UuZmxvcmluPTUwMDtlLnNlY3Rpb249NTAwO2UuY3VycmVuY3k9NTAwO2UucXVvdGVzaW5nbGU9Mjc4O2UucXVvdGVkYmxsZWZ0PTUwMDtlLmd1aWxsZW1vdGxlZnQ9NTAwO2UuZ3VpbHNpbmdsbGVmdD0zMzM7ZS5ndWlsc2luZ2xyaWdodD0zMzM7ZS5maT01NTY7ZS5mbD01NTY7ZS5lbmRhc2g9NTAwO2UuZGFnZ2VyPTUwMDtlLmRhZ2dlcmRibD01MDA7ZS5wZXJpb2RjZW50ZXJlZD0yNTA7ZS5wYXJhZ3JhcGg9NTAwO2UuYnVsbGV0PTM1MDtlLnF1b3Rlc2luZ2xiYXNlPTMzMztlLnF1b3RlZGJsYmFzZT01MDA7ZS5xdW90ZWRibHJpZ2h0PTUwMDtlLmd1aWxsZW1vdHJpZ2h0PTUwMDtlLmVsbGlwc2lzPTFlMztlLnBlcnRob3VzYW5kPTFlMztlLnF1ZXN0aW9uZG93bj01MDA7ZS5ncmF2ZT0zMzM7ZS5hY3V0ZT0zMzM7ZS5jaXJjdW1mbGV4PTMzMztlLnRpbGRlPTMzMztlLm1hY3Jvbj0zMzM7ZS5icmV2ZT0zMzM7ZS5kb3RhY2NlbnQ9MzMzO2UuZGllcmVzaXM9MzMzO2UucmluZz0zMzM7ZS5jZWRpbGxhPTMzMztlLmh1bmdhcnVtbGF1dD0zMzM7ZS5vZ29uZWs9MzMzO2UuY2Fyb249MzMzO2UuZW1kYXNoPTFlMztlLkFFPTk0NDtlLm9yZGZlbWluaW5lPTI2NjtlLkxzbGFzaD02MTE7ZS5Pc2xhc2g9NzIyO2UuT0U9OTQ0O2Uub3JkbWFzY3VsaW5lPTMwMDtlLmFlPTcyMjtlLmRvdGxlc3NpPTI3ODtlLmxzbGFzaD0yNzg7ZS5vc2xhc2g9NTAwO2Uub2U9NzIyO2UuZ2VybWFuZGJscz01MDA7ZS5JZGllcmVzaXM9Mzg5O2UuZWFjdXRlPTQ0NDtlLmFicmV2ZT01MDA7ZS51aHVuZ2FydW1sYXV0PTU1NjtlLmVjYXJvbj00NDQ7ZS5ZZGllcmVzaXM9NjExO2UuZGl2aWRlPTU3MDtlLllhY3V0ZT02MTE7ZS5BY2lyY3VtZmxleD02Njc7ZS5hYWN1dGU9NTAwO2UuVWNpcmN1bWZsZXg9NzIyO2UueWFjdXRlPTQ0NDtlLnNjb21tYWFjY2VudD0zODk7ZS5lY2lyY3VtZmxleD00NDQ7ZS5VcmluZz03MjI7ZS5VZGllcmVzaXM9NzIyO2UuYW9nb25laz01MDA7ZS5VYWN1dGU9NzIyO2UudW9nb25laz01NTY7ZS5FZGllcmVzaXM9NjY3O2UuRGNyb2F0PTcyMjtlLmNvbW1hYWNjZW50PTI1MDtlLmNvcHlyaWdodD03NDc7ZS5FbWFjcm9uPTY2NztlLmNjYXJvbj00NDQ7ZS5hcmluZz01MDA7ZS5OY29tbWFhY2NlbnQ9NzIyO2UubGFjdXRlPTI3ODtlLmFncmF2ZT01MDA7ZS5UY29tbWFhY2NlbnQ9NjExO2UuQ2FjdXRlPTY2NztlLmF0aWxkZT01MDA7ZS5FZG90YWNjZW50PTY2NztlLnNjYXJvbj0zODk7ZS5zY2VkaWxsYT0zODk7ZS5pYWN1dGU9Mjc4O2UubG96ZW5nZT00OTQ7ZS5SY2Fyb249NjY3O2UuR2NvbW1hYWNjZW50PTcyMjtlLnVjaXJjdW1mbGV4PTU1NjtlLmFjaXJjdW1mbGV4PTUwMDtlLkFtYWNyb249NjY3O2UucmNhcm9uPTM4OTtlLmNjZWRpbGxhPTQ0NDtlLlpkb3RhY2NlbnQ9NjExO2UuVGhvcm49NjExO2UuT21hY3Jvbj03MjI7ZS5SYWN1dGU9NjY3O2UuU2FjdXRlPTU1NjtlLmRjYXJvbj02MDg7ZS5VbWFjcm9uPTcyMjtlLnVyaW5nPTU1NjtlLnRocmVlc3VwZXJpb3I9MzAwO2UuT2dyYXZlPTcyMjtlLkFncmF2ZT02Njc7ZS5BYnJldmU9NjY3O2UubXVsdGlwbHk9NTcwO2UudWFjdXRlPTU1NjtlLlRjYXJvbj02MTE7ZS5wYXJ0aWFsZGlmZj00OTQ7ZS55ZGllcmVzaXM9NDQ0O2UuTmFjdXRlPTcyMjtlLmljaXJjdW1mbGV4PTI3ODtlLkVjaXJjdW1mbGV4PTY2NztlLmFkaWVyZXNpcz01MDA7ZS5lZGllcmVzaXM9NDQ0O2UuY2FjdXRlPTQ0NDtlLm5hY3V0ZT01NTY7ZS51bWFjcm9uPTU1NjtlLk5jYXJvbj03MjI7ZS5JYWN1dGU9Mzg5O2UucGx1c21pbnVzPTU3MDtlLmJyb2tlbmJhcj0yMjA7ZS5yZWdpc3RlcmVkPTc0NztlLkdicmV2ZT03MjI7ZS5JZG90YWNjZW50PTM4OTtlLnN1bW1hdGlvbj02MDA7ZS5FZ3JhdmU9NjY3O2UucmFjdXRlPTM4OTtlLm9tYWNyb249NTAwO2UuWmFjdXRlPTYxMTtlLlpjYXJvbj02MTE7ZS5ncmVhdGVyZXF1YWw9NTQ5O2UuRXRoPTcyMjtlLkNjZWRpbGxhPTY2NztlLmxjb21tYWFjY2VudD0yNzg7ZS50Y2Fyb249MzY2O2UuZW9nb25laz00NDQ7ZS5Vb2dvbmVrPTcyMjtlLkFhY3V0ZT02Njc7ZS5BZGllcmVzaXM9NjY3O2UuZWdyYXZlPTQ0NDtlLnphY3V0ZT0zODk7ZS5pb2dvbmVrPTI3ODtlLk9hY3V0ZT03MjI7ZS5vYWN1dGU9NTAwO2UuYW1hY3Jvbj01MDA7ZS5zYWN1dGU9Mzg5O2UuaWRpZXJlc2lzPTI3ODtlLk9jaXJjdW1mbGV4PTcyMjtlLlVncmF2ZT03MjI7ZS5EZWx0YT02MTI7ZS50aG9ybj01MDA7ZS50d29zdXBlcmlvcj0zMDA7ZS5PZGllcmVzaXM9NzIyO2UubXU9NTc2O2UuaWdyYXZlPTI3ODtlLm9odW5nYXJ1bWxhdXQ9NTAwO2UuRW9nb25laz02Njc7ZS5kY3JvYXQ9NTAwO2UudGhyZWVxdWFydGVycz03NTA7ZS5TY2VkaWxsYT01NTY7ZS5sY2Fyb249MzgyO2UuS2NvbW1hYWNjZW50PTY2NztlLkxhY3V0ZT02MTE7ZS50cmFkZW1hcms9MWUzO2UuZWRvdGFjY2VudD00NDQ7ZS5JZ3JhdmU9Mzg5O2UuSW1hY3Jvbj0zODk7ZS5MY2Fyb249NjExO2Uub25laGFsZj03NTA7ZS5sZXNzZXF1YWw9NTQ5O2Uub2NpcmN1bWZsZXg9NTAwO2UubnRpbGRlPTU1NjtlLlVodW5nYXJ1bWxhdXQ9NzIyO2UuRWFjdXRlPTY2NztlLmVtYWNyb249NDQ0O2UuZ2JyZXZlPTUwMDtlLm9uZXF1YXJ0ZXI9NzUwO2UuU2Nhcm9uPTU1NjtlLlNjb21tYWFjY2VudD01NTY7ZS5PaHVuZ2FydW1sYXV0PTcyMjtlLmRlZ3JlZT00MDA7ZS5vZ3JhdmU9NTAwO2UuQ2Nhcm9uPTY2NztlLnVncmF2ZT01NTY7ZS5yYWRpY2FsPTU0OTtlLkRjYXJvbj03MjI7ZS5yY29tbWFhY2NlbnQ9Mzg5O2UuTnRpbGRlPTcyMjtlLm90aWxkZT01MDA7ZS5SY29tbWFhY2NlbnQ9NjY3O2UuTGNvbW1hYWNjZW50PTYxMTtlLkF0aWxkZT02Njc7ZS5Bb2dvbmVrPTY2NztlLkFyaW5nPTY2NztlLk90aWxkZT03MjI7ZS56ZG90YWNjZW50PTM4OTtlLkVjYXJvbj02Njc7ZS5Jb2dvbmVrPTM4OTtlLmtjb21tYWFjY2VudD01MDA7ZS5taW51cz02MDY7ZS5JY2lyY3VtZmxleD0zODk7ZS5uY2Fyb249NTU2O2UudGNvbW1hYWNjZW50PTI3ODtlLmxvZ2ljYWxub3Q9NjA2O2Uub2RpZXJlc2lzPTUwMDtlLnVkaWVyZXNpcz01NTY7ZS5ub3RlcXVhbD01NDk7ZS5nY29tbWFhY2NlbnQ9NTAwO2UuZXRoPTUwMDtlLnpjYXJvbj0zODk7ZS5uY29tbWFhY2NlbnQ9NTU2O2Uub25lc3VwZXJpb3I9MzAwO2UuaW1hY3Jvbj0yNzg7ZS5FdXJvPTUwMH0pKTtlWyJUaW1lcy1JdGFsaWMiXT0oMCxyLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwO2UuZXhjbGFtPTMzMztlLnF1b3RlZGJsPTQyMDtlLm51bWJlcnNpZ249NTAwO2UuZG9sbGFyPTUwMDtlLnBlcmNlbnQ9ODMzO2UuYW1wZXJzYW5kPTc3ODtlLnF1b3RlcmlnaHQ9MzMzO2UucGFyZW5sZWZ0PTMzMztlLnBhcmVucmlnaHQ9MzMzO2UuYXN0ZXJpc2s9NTAwO2UucGx1cz02NzU7ZS5jb21tYT0yNTA7ZS5oeXBoZW49MzMzO2UucGVyaW9kPTI1MDtlLnNsYXNoPTI3ODtlLnplcm89NTAwO2Uub25lPTUwMDtlLnR3bz01MDA7ZS50aHJlZT01MDA7ZS5mb3VyPTUwMDtlLmZpdmU9NTAwO2Uuc2l4PTUwMDtlLnNldmVuPTUwMDtlLmVpZ2h0PTUwMDtlLm5pbmU9NTAwO2UuY29sb249MzMzO2Uuc2VtaWNvbG9uPTMzMztlLmxlc3M9Njc1O2UuZXF1YWw9Njc1O2UuZ3JlYXRlcj02NzU7ZS5xdWVzdGlvbj01MDA7ZS5hdD05MjA7ZS5BPTYxMTtlLkI9NjExO2UuQz02Njc7ZS5EPTcyMjtlLkU9NjExO2UuRj02MTE7ZS5HPTcyMjtlLkg9NzIyO2UuST0zMzM7ZS5KPTQ0NDtlLks9NjY3O2UuTD01NTY7ZS5NPTgzMztlLk49NjY3O2UuTz03MjI7ZS5QPTYxMTtlLlE9NzIyO2UuUj02MTE7ZS5TPTUwMDtlLlQ9NTU2O2UuVT03MjI7ZS5WPTYxMTtlLlc9ODMzO2UuWD02MTE7ZS5ZPTU1NjtlLlo9NTU2O2UuYnJhY2tldGxlZnQ9Mzg5O2UuYmFja3NsYXNoPTI3ODtlLmJyYWNrZXRyaWdodD0zODk7ZS5hc2NpaWNpcmN1bT00MjI7ZS51bmRlcnNjb3JlPTUwMDtlLnF1b3RlbGVmdD0zMzM7ZS5hPTUwMDtlLmI9NTAwO2UuYz00NDQ7ZS5kPTUwMDtlLmU9NDQ0O2UuZj0yNzg7ZS5nPTUwMDtlLmg9NTAwO2UuaT0yNzg7ZS5qPTI3ODtlLms9NDQ0O2UubD0yNzg7ZS5tPTcyMjtlLm49NTAwO2Uubz01MDA7ZS5wPTUwMDtlLnE9NTAwO2Uucj0zODk7ZS5zPTM4OTtlLnQ9Mjc4O2UudT01MDA7ZS52PTQ0NDtlLnc9NjY3O2UueD00NDQ7ZS55PTQ0NDtlLno9Mzg5O2UuYnJhY2VsZWZ0PTQwMDtlLmJhcj0yNzU7ZS5icmFjZXJpZ2h0PTQwMDtlLmFzY2lpdGlsZGU9NTQxO2UuZXhjbGFtZG93bj0zODk7ZS5jZW50PTUwMDtlLnN0ZXJsaW5nPTUwMDtlLmZyYWN0aW9uPTE2NztlLnllbj01MDA7ZS5mbG9yaW49NTAwO2Uuc2VjdGlvbj01MDA7ZS5jdXJyZW5jeT01MDA7ZS5xdW90ZXNpbmdsZT0yMTQ7ZS5xdW90ZWRibGxlZnQ9NTU2O2UuZ3VpbGxlbW90bGVmdD01MDA7ZS5ndWlsc2luZ2xsZWZ0PTMzMztlLmd1aWxzaW5nbHJpZ2h0PTMzMztlLmZpPTUwMDtlLmZsPTUwMDtlLmVuZGFzaD01MDA7ZS5kYWdnZXI9NTAwO2UuZGFnZ2VyZGJsPTUwMDtlLnBlcmlvZGNlbnRlcmVkPTI1MDtlLnBhcmFncmFwaD01MjM7ZS5idWxsZXQ9MzUwO2UucXVvdGVzaW5nbGJhc2U9MzMzO2UucXVvdGVkYmxiYXNlPTU1NjtlLnF1b3RlZGJscmlnaHQ9NTU2O2UuZ3VpbGxlbW90cmlnaHQ9NTAwO2UuZWxsaXBzaXM9ODg5O2UucGVydGhvdXNhbmQ9MWUzO2UucXVlc3Rpb25kb3duPTUwMDtlLmdyYXZlPTMzMztlLmFjdXRlPTMzMztlLmNpcmN1bWZsZXg9MzMzO2UudGlsZGU9MzMzO2UubWFjcm9uPTMzMztlLmJyZXZlPTMzMztlLmRvdGFjY2VudD0zMzM7ZS5kaWVyZXNpcz0zMzM7ZS5yaW5nPTMzMztlLmNlZGlsbGE9MzMzO2UuaHVuZ2FydW1sYXV0PTMzMztlLm9nb25laz0zMzM7ZS5jYXJvbj0zMzM7ZS5lbWRhc2g9ODg5O2UuQUU9ODg5O2Uub3JkZmVtaW5pbmU9Mjc2O2UuTHNsYXNoPTU1NjtlLk9zbGFzaD03MjI7ZS5PRT05NDQ7ZS5vcmRtYXNjdWxpbmU9MzEwO2UuYWU9NjY3O2UuZG90bGVzc2k9Mjc4O2UubHNsYXNoPTI3ODtlLm9zbGFzaD01MDA7ZS5vZT02Njc7ZS5nZXJtYW5kYmxzPTUwMDtlLklkaWVyZXNpcz0zMzM7ZS5lYWN1dGU9NDQ0O2UuYWJyZXZlPTUwMDtlLnVodW5nYXJ1bWxhdXQ9NTAwO2UuZWNhcm9uPTQ0NDtlLllkaWVyZXNpcz01NTY7ZS5kaXZpZGU9Njc1O2UuWWFjdXRlPTU1NjtlLkFjaXJjdW1mbGV4PTYxMTtlLmFhY3V0ZT01MDA7ZS5VY2lyY3VtZmxleD03MjI7ZS55YWN1dGU9NDQ0O2Uuc2NvbW1hYWNjZW50PTM4OTtlLmVjaXJjdW1mbGV4PTQ0NDtlLlVyaW5nPTcyMjtlLlVkaWVyZXNpcz03MjI7ZS5hb2dvbmVrPTUwMDtlLlVhY3V0ZT03MjI7ZS51b2dvbmVrPTUwMDtlLkVkaWVyZXNpcz02MTE7ZS5EY3JvYXQ9NzIyO2UuY29tbWFhY2NlbnQ9MjUwO2UuY29weXJpZ2h0PTc2MDtlLkVtYWNyb249NjExO2UuY2Nhcm9uPTQ0NDtlLmFyaW5nPTUwMDtlLk5jb21tYWFjY2VudD02Njc7ZS5sYWN1dGU9Mjc4O2UuYWdyYXZlPTUwMDtlLlRjb21tYWFjY2VudD01NTY7ZS5DYWN1dGU9NjY3O2UuYXRpbGRlPTUwMDtlLkVkb3RhY2NlbnQ9NjExO2Uuc2Nhcm9uPTM4OTtlLnNjZWRpbGxhPTM4OTtlLmlhY3V0ZT0yNzg7ZS5sb3plbmdlPTQ3MTtlLlJjYXJvbj02MTE7ZS5HY29tbWFhY2NlbnQ9NzIyO2UudWNpcmN1bWZsZXg9NTAwO2UuYWNpcmN1bWZsZXg9NTAwO2UuQW1hY3Jvbj02MTE7ZS5yY2Fyb249Mzg5O2UuY2NlZGlsbGE9NDQ0O2UuWmRvdGFjY2VudD01NTY7ZS5UaG9ybj02MTE7ZS5PbWFjcm9uPTcyMjtlLlJhY3V0ZT02MTE7ZS5TYWN1dGU9NTAwO2UuZGNhcm9uPTU0NDtlLlVtYWNyb249NzIyO2UudXJpbmc9NTAwO2UudGhyZWVzdXBlcmlvcj0zMDA7ZS5PZ3JhdmU9NzIyO2UuQWdyYXZlPTYxMTtlLkFicmV2ZT02MTE7ZS5tdWx0aXBseT02NzU7ZS51YWN1dGU9NTAwO2UuVGNhcm9uPTU1NjtlLnBhcnRpYWxkaWZmPTQ3NjtlLnlkaWVyZXNpcz00NDQ7ZS5OYWN1dGU9NjY3O2UuaWNpcmN1bWZsZXg9Mjc4O2UuRWNpcmN1bWZsZXg9NjExO2UuYWRpZXJlc2lzPTUwMDtlLmVkaWVyZXNpcz00NDQ7ZS5jYWN1dGU9NDQ0O2UubmFjdXRlPTUwMDtlLnVtYWNyb249NTAwO2UuTmNhcm9uPTY2NztlLklhY3V0ZT0zMzM7ZS5wbHVzbWludXM9Njc1O2UuYnJva2VuYmFyPTI3NTtlLnJlZ2lzdGVyZWQ9NzYwO2UuR2JyZXZlPTcyMjtlLklkb3RhY2NlbnQ9MzMzO2Uuc3VtbWF0aW9uPTYwMDtlLkVncmF2ZT02MTE7ZS5yYWN1dGU9Mzg5O2Uub21hY3Jvbj01MDA7ZS5aYWN1dGU9NTU2O2UuWmNhcm9uPTU1NjtlLmdyZWF0ZXJlcXVhbD01NDk7ZS5FdGg9NzIyO2UuQ2NlZGlsbGE9NjY3O2UubGNvbW1hYWNjZW50PTI3ODtlLnRjYXJvbj0zMDA7ZS5lb2dvbmVrPTQ0NDtlLlVvZ29uZWs9NzIyO2UuQWFjdXRlPTYxMTtlLkFkaWVyZXNpcz02MTE7ZS5lZ3JhdmU9NDQ0O2UuemFjdXRlPTM4OTtlLmlvZ29uZWs9Mjc4O2UuT2FjdXRlPTcyMjtlLm9hY3V0ZT01MDA7ZS5hbWFjcm9uPTUwMDtlLnNhY3V0ZT0zODk7ZS5pZGllcmVzaXM9Mjc4O2UuT2NpcmN1bWZsZXg9NzIyO2UuVWdyYXZlPTcyMjtlLkRlbHRhPTYxMjtlLnRob3JuPTUwMDtlLnR3b3N1cGVyaW9yPTMwMDtlLk9kaWVyZXNpcz03MjI7ZS5tdT01MDA7ZS5pZ3JhdmU9Mjc4O2Uub2h1bmdhcnVtbGF1dD01MDA7ZS5Fb2dvbmVrPTYxMTtlLmRjcm9hdD01MDA7ZS50aHJlZXF1YXJ0ZXJzPTc1MDtlLlNjZWRpbGxhPTUwMDtlLmxjYXJvbj0zMDA7ZS5LY29tbWFhY2NlbnQ9NjY3O2UuTGFjdXRlPTU1NjtlLnRyYWRlbWFyaz05ODA7ZS5lZG90YWNjZW50PTQ0NDtlLklncmF2ZT0zMzM7ZS5JbWFjcm9uPTMzMztlLkxjYXJvbj02MTE7ZS5vbmVoYWxmPTc1MDtlLmxlc3NlcXVhbD01NDk7ZS5vY2lyY3VtZmxleD01MDA7ZS5udGlsZGU9NTAwO2UuVWh1bmdhcnVtbGF1dD03MjI7ZS5FYWN1dGU9NjExO2UuZW1hY3Jvbj00NDQ7ZS5nYnJldmU9NTAwO2Uub25lcXVhcnRlcj03NTA7ZS5TY2Fyb249NTAwO2UuU2NvbW1hYWNjZW50PTUwMDtlLk9odW5nYXJ1bWxhdXQ9NzIyO2UuZGVncmVlPTQwMDtlLm9ncmF2ZT01MDA7ZS5DY2Fyb249NjY3O2UudWdyYXZlPTUwMDtlLnJhZGljYWw9NDUzO2UuRGNhcm9uPTcyMjtlLnJjb21tYWFjY2VudD0zODk7ZS5OdGlsZGU9NjY3O2Uub3RpbGRlPTUwMDtlLlJjb21tYWFjY2VudD02MTE7ZS5MY29tbWFhY2NlbnQ9NTU2O2UuQXRpbGRlPTYxMTtlLkFvZ29uZWs9NjExO2UuQXJpbmc9NjExO2UuT3RpbGRlPTcyMjtlLnpkb3RhY2NlbnQ9Mzg5O2UuRWNhcm9uPTYxMTtlLklvZ29uZWs9MzMzO2Uua2NvbW1hYWNjZW50PTQ0NDtlLm1pbnVzPTY3NTtlLkljaXJjdW1mbGV4PTMzMztlLm5jYXJvbj01MDA7ZS50Y29tbWFhY2NlbnQ9Mjc4O2UubG9naWNhbG5vdD02NzU7ZS5vZGllcmVzaXM9NTAwO2UudWRpZXJlc2lzPTUwMDtlLm5vdGVxdWFsPTU0OTtlLmdjb21tYWFjY2VudD01MDA7ZS5ldGg9NTAwO2UuemNhcm9uPTM4OTtlLm5jb21tYWFjY2VudD01MDA7ZS5vbmVzdXBlcmlvcj0zMDA7ZS5pbWFjcm9uPTI3ODtlLkV1cm89NTAwfSkpO2UuWmFwZkRpbmdiYXRzPSgwLHIuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0yNzg7ZS5hMT05NzQ7ZS5hMj05NjE7ZS5hMjAyPTk3NDtlLmEzPTk4MDtlLmE0PTcxOTtlLmE1PTc4OTtlLmExMTk9NzkwO2UuYTExOD03OTE7ZS5hMTE3PTY5MDtlLmExMT05NjA7ZS5hMTI9OTM5O2UuYTEzPTU0OTtlLmExND04NTU7ZS5hMTU9OTExO2UuYTE2PTkzMztlLmExMDU9OTExO2UuYTE3PTk0NTtlLmExOD05NzQ7ZS5hMTk9NzU1O2UuYTIwPTg0NjtlLmEyMT03NjI7ZS5hMjI9NzYxO2UuYTIzPTU3MTtlLmEyND02Nzc7ZS5hMjU9NzYzO2UuYTI2PTc2MDtlLmEyNz03NTk7ZS5hMjg9NzU0O2UuYTY9NDk0O2UuYTc9NTUyO2UuYTg9NTM3O2UuYTk9NTc3O2UuYTEwPTY5MjtlLmEyOT03ODY7ZS5hMzA9Nzg4O2UuYTMxPTc4ODtlLmEzMj03OTA7ZS5hMzM9NzkzO2UuYTM0PTc5NDtlLmEzNT04MTY7ZS5hMzY9ODIzO2UuYTM3PTc4OTtlLmEzOD04NDE7ZS5hMzk9ODIzO2UuYTQwPTgzMztlLmE0MT04MTY7ZS5hNDI9ODMxO2UuYTQzPTkyMztlLmE0ND03NDQ7ZS5hNDU9NzIzO2UuYTQ2PTc0OTtlLmE0Nz03OTA7ZS5hNDg9NzkyO2UuYTQ5PTY5NTtlLmE1MD03NzY7ZS5hNTE9NzY4O2UuYTUyPTc5MjtlLmE1Mz03NTk7ZS5hNTQ9NzA3O2UuYTU1PTcwODtlLmE1Nj02ODI7ZS5hNTc9NzAxO2UuYTU4PTgyNjtlLmE1OT04MTU7ZS5hNjA9Nzg5O2UuYTYxPTc4OTtlLmE2Mj03MDc7ZS5hNjM9Njg3O2UuYTY0PTY5NjtlLmE2NT02ODk7ZS5hNjY9Nzg2O2UuYTY3PTc4NztlLmE2OD03MTM7ZS5hNjk9NzkxO2UuYTcwPTc4NTtlLmE3MT03OTE7ZS5hNzI9ODczO2UuYTczPTc2MTtlLmE3ND03NjI7ZS5hMjAzPTc2MjtlLmE3NT03NTk7ZS5hMjA0PTc1OTtlLmE3Nj04OTI7ZS5hNzc9ODkyO2UuYTc4PTc4ODtlLmE3OT03ODQ7ZS5hODE9NDM4O2UuYTgyPTEzODtlLmE4Mz0yNzc7ZS5hODQ9NDE1O2UuYTk3PTM5MjtlLmE5OD0zOTI7ZS5hOTk9NjY4O2UuYTEwMD02Njg7ZS5hODk9MzkwO2UuYTkwPTM5MDtlLmE5Mz0zMTc7ZS5hOTQ9MzE3O2UuYTkxPTI3NjtlLmE5Mj0yNzY7ZS5hMjA1PTUwOTtlLmE4NT01MDk7ZS5hMjA2PTQxMDtlLmE4Nj00MTA7ZS5hODc9MjM0O2UuYTg4PTIzNDtlLmE5NT0zMzQ7ZS5hOTY9MzM0O2UuYTEwMT03MzI7ZS5hMTAyPTU0NDtlLmExMDM9NTQ0O2UuYTEwND05MTA7ZS5hMTA2PTY2NztlLmExMDc9NzYwO2UuYTEwOD03NjA7ZS5hMTEyPTc3NjtlLmExMTE9NTk1O2UuYTExMD02OTQ7ZS5hMTA5PTYyNjtlLmExMjA9Nzg4O2UuYTEyMT03ODg7ZS5hMTIyPTc4ODtlLmExMjM9Nzg4O2UuYTEyND03ODg7ZS5hMTI1PTc4ODtlLmExMjY9Nzg4O2UuYTEyNz03ODg7ZS5hMTI4PTc4ODtlLmExMjk9Nzg4O2UuYTEzMD03ODg7ZS5hMTMxPTc4ODtlLmExMzI9Nzg4O2UuYTEzMz03ODg7ZS5hMTM0PTc4ODtlLmExMzU9Nzg4O2UuYTEzNj03ODg7ZS5hMTM3PTc4ODtlLmExMzg9Nzg4O2UuYTEzOT03ODg7ZS5hMTQwPTc4ODtlLmExNDE9Nzg4O2UuYTE0Mj03ODg7ZS5hMTQzPTc4ODtlLmExNDQ9Nzg4O2UuYTE0NT03ODg7ZS5hMTQ2PTc4ODtlLmExNDc9Nzg4O2UuYTE0OD03ODg7ZS5hMTQ5PTc4ODtlLmExNTA9Nzg4O2UuYTE1MT03ODg7ZS5hMTUyPTc4ODtlLmExNTM9Nzg4O2UuYTE1ND03ODg7ZS5hMTU1PTc4ODtlLmExNTY9Nzg4O2UuYTE1Nz03ODg7ZS5hMTU4PTc4ODtlLmExNTk9Nzg4O2UuYTE2MD04OTQ7ZS5hMTYxPTgzODtlLmExNjM9MTAxNjtlLmExNjQ9NDU4O2UuYTE5Nj03NDg7ZS5hMTY1PTkyNDtlLmExOTI9NzQ4O2UuYTE2Nj05MTg7ZS5hMTY3PTkyNztlLmExNjg9OTI4O2UuYTE2OT05Mjg7ZS5hMTcwPTgzNDtlLmExNzE9ODczO2UuYTE3Mj04Mjg7ZS5hMTczPTkyNDtlLmExNjI9OTI0O2UuYTE3ND05MTc7ZS5hMTc1PTkzMDtlLmExNzY9OTMxO2UuYTE3Nz00NjM7ZS5hMTc4PTg4MztlLmExNzk9ODM2O2UuYTE5Mz04MzY7ZS5hMTgwPTg2NztlLmExOTk9ODY3O2UuYTE4MT02OTY7ZS5hMjAwPTY5NjtlLmExODI9ODc0O2UuYTIwMT04NzQ7ZS5hMTgzPTc2MDtlLmExODQ9OTQ2O2UuYTE5Nz03NzE7ZS5hMTg1PTg2NTtlLmExOTQ9NzcxO2UuYTE5OD04ODg7ZS5hMTg2PTk2NztlLmExOTU9ODg4O2UuYTE4Nz04MzE7ZS5hMTg4PTg3MztlLmExODk9OTI3O2UuYTE5MD05NzA7ZS5hMTkxPTkxOH0pKX0pKTt0LmdldE1ldHJpY3M9bjtjb25zdCBpPSgwLHIuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5Db3VyaWVyPXthc2NlbnQ6NjI5LGRlc2NlbnQ6LTE1NyxjYXBIZWlnaHQ6NTYyLHhIZWlnaHQ6LTQyNn07ZVsiQ291cmllci1Cb2xkIl09e2FzY2VudDo2MjksZGVzY2VudDotMTU3LGNhcEhlaWdodDo1NjIseEhlaWdodDo0Mzl9O2VbIkNvdXJpZXItT2JsaXF1ZSJdPXthc2NlbnQ6NjI5LGRlc2NlbnQ6LTE1NyxjYXBIZWlnaHQ6NTYyLHhIZWlnaHQ6NDI2fTtlWyJDb3VyaWVyLUJvbGRPYmxpcXVlIl09e2FzY2VudDo2MjksZGVzY2VudDotMTU3LGNhcEhlaWdodDo1NjIseEhlaWdodDo0MjZ9O2UuSGVsdmV0aWNhPXthc2NlbnQ6NzE4LGRlc2NlbnQ6LTIwNyxjYXBIZWlnaHQ6NzE4LHhIZWlnaHQ6NTIzfTtlWyJIZWx2ZXRpY2EtQm9sZCJdPXthc2NlbnQ6NzE4LGRlc2NlbnQ6LTIwNyxjYXBIZWlnaHQ6NzE4LHhIZWlnaHQ6NTMyfTtlWyJIZWx2ZXRpY2EtT2JsaXF1ZSJdPXthc2NlbnQ6NzE4LGRlc2NlbnQ6LTIwNyxjYXBIZWlnaHQ6NzE4LHhIZWlnaHQ6NTIzfTtlWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXT17YXNjZW50OjcxOCxkZXNjZW50Oi0yMDcsY2FwSGVpZ2h0OjcxOCx4SGVpZ2h0OjUzMn07ZVsiVGltZXMtUm9tYW4iXT17YXNjZW50OjY4MyxkZXNjZW50Oi0yMTcsY2FwSGVpZ2h0OjY2Mix4SGVpZ2h0OjQ1MH07ZVsiVGltZXMtQm9sZCJdPXthc2NlbnQ6NjgzLGRlc2NlbnQ6LTIxNyxjYXBIZWlnaHQ6Njc2LHhIZWlnaHQ6NDYxfTtlWyJUaW1lcy1JdGFsaWMiXT17YXNjZW50OjY4MyxkZXNjZW50Oi0yMTcsY2FwSGVpZ2h0OjY1Myx4SGVpZ2h0OjQ0MX07ZVsiVGltZXMtQm9sZEl0YWxpYyJdPXthc2NlbnQ6NjgzLGRlc2NlbnQ6LTIxNyxjYXBIZWlnaHQ6NjY5LHhIZWlnaHQ6NDYyfTtlLlN5bWJvbD17YXNjZW50Ok1hdGguTmFOLGRlc2NlbnQ6TWF0aC5OYU4sY2FwSGVpZ2h0Ok1hdGguTmFOLHhIZWlnaHQ6TWF0aC5OYU59O2UuWmFwZkRpbmdiYXRzPXthc2NlbnQ6TWF0aC5OYU4sZGVzY2VudDpNYXRoLk5hTixjYXBIZWlnaHQ6TWF0aC5OYU4seEhlaWdodDpNYXRoLk5hTn19KSk7dC5nZXRGb250QmFzaWNNZXRyaWNzPWl9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuR2x5ZlRhYmxlPXZvaWQgMDthKDEzOSk7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO2EoMTU3KTt0LkdseWZUYWJsZT1jbGFzcyBHbHlmVGFibGV7Y29uc3RydWN0b3IoZSl7bGV0e2dseWZUYWJsZTp0LGlzR2x5cGhMb2NhdGlvbnNMb25nOmEsbG9jYVRhYmxlOnIsbnVtR2x5cGhzOm59PWU7dGhpcy5nbHlwaHM9W107Y29uc3QgaT1uZXcgRGF0YVZpZXcoci5idWZmZXIsci5ieXRlT2Zmc2V0LHIuYnl0ZUxlbmd0aCkscz1uZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCksbz1hPzQ6MjtsZXQgYz1hP2kuZ2V0VWludDMyKDApOjIqaS5nZXRVaW50MTYoMCksbD0wO2ZvcihsZXQgZT0wO2U8bjtlKyspe2wrPW87Y29uc3QgZT1hP2kuZ2V0VWludDMyKGwpOjIqaS5nZXRVaW50MTYobCk7aWYoZT09PWMpe3RoaXMuZ2x5cGhzLnB1c2gobmV3IEdseXBoKHt9KSk7Y29udGludWV9Y29uc3QgdD1HbHlwaC5wYXJzZShjLHMpO3RoaXMuZ2x5cGhzLnB1c2godCk7Yz1lfX1nZXRTaXplKCl7cmV0dXJuIHRoaXMuZ2x5cGhzLnJlZHVjZSgoKGUsdCk9PmUrKHQuZ2V0U2l6ZSgpKzMmLTQpKSwwKX13cml0ZSgpe2NvbnN0IGU9dGhpcy5nZXRTaXplKCksdD1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKGUpKSxhPWU+MTMxMDcwLHI9YT80OjIsbj1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKCh0aGlzLmdseXBocy5sZW5ndGgrMSkqcikpO2E/bi5zZXRVaW50MzIoMCwwKTpuLnNldFVpbnQxNigwLDApO2xldCBpPTAscz0wO2Zvcihjb25zdCBlIG9mIHRoaXMuZ2x5cGhzKXtpKz1lLndyaXRlKGksdCk7aT1pKzMmLTQ7cys9cjthP24uc2V0VWludDMyKHMsaSk6bi5zZXRVaW50MTYocyxpPj4xKX1yZXR1cm57aXNMb2NhdGlvbkxvbmc6YSxsb2NhOm5ldyBVaW50OEFycmF5KG4uYnVmZmVyKSxnbHlmOm5ldyBVaW50OEFycmF5KHQuYnVmZmVyKX19c2NhbGUoZSl7Zm9yKGxldCB0PTAsYT10aGlzLmdseXBocy5sZW5ndGg7dDxhO3QrKyl0aGlzLmdseXBoc1t0XS5zY2FsZShlW3RdKX19O2NsYXNzIEdseXBoe2NvbnN0cnVjdG9yKGUpe2xldHtoZWFkZXI6dD1udWxsLHNpbXBsZTphPW51bGwsY29tcG9zaXRlczpyPW51bGx9PWU7dGhpcy5oZWFkZXI9dDt0aGlzLnNpbXBsZT1hO3RoaXMuY29tcG9zaXRlcz1yfXN0YXRpYyBwYXJzZShlLHQpe2NvbnN0W2Escl09R2x5cGhIZWFkZXIucGFyc2UoZSx0KTtlKz1hO2lmKHIubnVtYmVyT2ZDb250b3VyczwwKXtjb25zdCBhPVtdO2Zvcig7Oyl7Y29uc3RbcixuXT1Db21wb3NpdGVHbHlwaC5wYXJzZShlLHQpO2UrPXI7YS5wdXNoKG4pO2lmKCEoMzImbi5mbGFncykpYnJlYWt9cmV0dXJuIG5ldyBHbHlwaCh7aGVhZGVyOnIsY29tcG9zaXRlczphfSl9Y29uc3Qgbj1TaW1wbGVHbHlwaC5wYXJzZShlLHQsci5udW1iZXJPZkNvbnRvdXJzKTtyZXR1cm4gbmV3IEdseXBoKHtoZWFkZXI6cixzaW1wbGU6bn0pfWdldFNpemUoKXtpZighdGhpcy5oZWFkZXIpcmV0dXJuIDA7Y29uc3QgZT10aGlzLnNpbXBsZT90aGlzLnNpbXBsZS5nZXRTaXplKCk6dGhpcy5jb21wb3NpdGVzLnJlZHVjZSgoKGUsdCk9PmUrdC5nZXRTaXplKCkpLDApO3JldHVybiB0aGlzLmhlYWRlci5nZXRTaXplKCkrZX13cml0ZShlLHQpe2lmKCF0aGlzLmhlYWRlcilyZXR1cm4gMDtjb25zdCBhPWU7ZSs9dGhpcy5oZWFkZXIud3JpdGUoZSx0KTtpZih0aGlzLnNpbXBsZSllKz10aGlzLnNpbXBsZS53cml0ZShlLHQpO2Vsc2UgZm9yKGNvbnN0IGEgb2YgdGhpcy5jb21wb3NpdGVzKWUrPWEud3JpdGUoZSx0KTtyZXR1cm4gZS1hfXNjYWxlKGUpe2lmKCF0aGlzLmhlYWRlcilyZXR1cm47Y29uc3QgdD0odGhpcy5oZWFkZXIueE1pbit0aGlzLmhlYWRlci54TWF4KS8yO3RoaXMuaGVhZGVyLnNjYWxlKHQsZSk7aWYodGhpcy5zaW1wbGUpdGhpcy5zaW1wbGUuc2NhbGUodCxlKTtlbHNlIGZvcihjb25zdCBhIG9mIHRoaXMuY29tcG9zaXRlcylhLnNjYWxlKHQsZSl9fWNsYXNzIEdseXBoSGVhZGVye2NvbnN0cnVjdG9yKGUpe2xldHtudW1iZXJPZkNvbnRvdXJzOnQseE1pbjphLHlNaW46cix4TWF4Om4seU1heDppfT1lO3RoaXMubnVtYmVyT2ZDb250b3Vycz10O3RoaXMueE1pbj1hO3RoaXMueU1pbj1yO3RoaXMueE1heD1uO3RoaXMueU1heD1pfXN0YXRpYyBwYXJzZShlLHQpe3JldHVyblsxMCxuZXcgR2x5cGhIZWFkZXIoe251bWJlck9mQ29udG91cnM6dC5nZXRJbnQxNihlKSx4TWluOnQuZ2V0SW50MTYoZSsyKSx5TWluOnQuZ2V0SW50MTYoZSs0KSx4TWF4OnQuZ2V0SW50MTYoZSs2KSx5TWF4OnQuZ2V0SW50MTYoZSs4KX0pXX1nZXRTaXplKCl7cmV0dXJuIDEwfXdyaXRlKGUsdCl7dC5zZXRJbnQxNihlLHRoaXMubnVtYmVyT2ZDb250b3Vycyk7dC5zZXRJbnQxNihlKzIsdGhpcy54TWluKTt0LnNldEludDE2KGUrNCx0aGlzLnlNaW4pO3Quc2V0SW50MTYoZSs2LHRoaXMueE1heCk7dC5zZXRJbnQxNihlKzgsdGhpcy55TWF4KTtyZXR1cm4gMTB9c2NhbGUoZSx0KXt0aGlzLnhNaW49TWF0aC5yb3VuZChlKyh0aGlzLnhNaW4tZSkqdCk7dGhpcy54TWF4PU1hdGgucm91bmQoZSsodGhpcy54TWF4LWUpKnQpfX1jbGFzcyBDb250b3Vye2NvbnN0cnVjdG9yKGUpe2xldHtmbGFnczp0LHhDb29yZGluYXRlczphLHlDb29yZGluYXRlczpyfT1lO3RoaXMueENvb3JkaW5hdGVzPWE7dGhpcy55Q29vcmRpbmF0ZXM9cjt0aGlzLmZsYWdzPXR9fWNsYXNzIFNpbXBsZUdseXBoe2NvbnN0cnVjdG9yKGUpe2xldHtjb250b3Vyczp0LGluc3RydWN0aW9uczphfT1lO3RoaXMuY29udG91cnM9dDt0aGlzLmluc3RydWN0aW9ucz1hfXN0YXRpYyBwYXJzZShlLHQsYSl7Y29uc3Qgcj1bXTtmb3IobGV0IG49MDtuPGE7bisrKXtjb25zdCBhPXQuZ2V0VWludDE2KGUpO2UrPTI7ci5wdXNoKGEpfWNvbnN0IG49clthLTFdKzEsaT10LmdldFVpbnQxNihlKTtlKz0yO2NvbnN0IHM9bmV3IFVpbnQ4QXJyYXkodCkuc2xpY2UoZSxlK2kpO2UrPWk7Y29uc3Qgbz1bXTtmb3IobGV0IGE9MDthPG47ZSsrLGErKyl7bGV0IHI9dC5nZXRVaW50OChlKTtvLnB1c2gocik7aWYoOCZyKXtjb25zdCBuPXQuZ2V0VWludDgoKytlKTtyXj04O2ZvcihsZXQgZT0wO2U8bjtlKyspby5wdXNoKHIpO2ErPW59fWNvbnN0IGM9W107bGV0IGw9W10saD1bXSx1PVtdO2NvbnN0IGQ9W107bGV0IGY9MCxnPTA7Zm9yKGxldCBhPTA7YTxuO2ErKyl7Y29uc3Qgbj1vW2FdO2lmKDImbil7Y29uc3QgYT10LmdldFVpbnQ4KGUrKyk7Zys9MTYmbj9hOi1hO2wucHVzaChnKX1lbHNlIGlmKDE2Jm4pbC5wdXNoKGcpO2Vsc2V7Zys9dC5nZXRJbnQxNihlKTtlKz0yO2wucHVzaChnKX1pZihyW2ZdPT09YSl7ZisrO2MucHVzaChsKTtsPVtdfX1nPTA7Zj0wO2ZvcihsZXQgYT0wO2E8bjthKyspe2NvbnN0IG49b1thXTtpZig0Jm4pe2NvbnN0IGE9dC5nZXRVaW50OChlKyspO2crPTMyJm4/YTotYTtoLnB1c2goZyl9ZWxzZSBpZigzMiZuKWgucHVzaChnKTtlbHNle2crPXQuZ2V0SW50MTYoZSk7ZSs9MjtoLnB1c2goZyl9dS5wdXNoKDEmbnw2NCZuKTtpZihyW2ZdPT09YSl7bD1jW2ZdO2YrKztkLnB1c2gobmV3IENvbnRvdXIoe2ZsYWdzOnUseENvb3JkaW5hdGVzOmwseUNvb3JkaW5hdGVzOmh9KSk7aD1bXTt1PVtdfX1yZXR1cm4gbmV3IFNpbXBsZUdseXBoKHtjb250b3VyczpkLGluc3RydWN0aW9uczpzfSl9Z2V0U2l6ZSgpe2xldCBlPTIqdGhpcy5jb250b3Vycy5sZW5ndGgrMit0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgsdD0wLGE9MDtmb3IoY29uc3QgciBvZiB0aGlzLmNvbnRvdXJzKXtlKz1yLmZsYWdzLmxlbmd0aDtmb3IobGV0IG49MCxpPXIueENvb3JkaW5hdGVzLmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPXIueENvb3JkaW5hdGVzW25dLHM9ci55Q29vcmRpbmF0ZXNbbl07bGV0IG89TWF0aC5hYnMoaS10KTtvPjI1NT9lKz0yOm8+MCYmKGUrPTEpO3Q9aTtvPU1hdGguYWJzKHMtYSk7bz4yNTU/ZSs9MjpvPjAmJihlKz0xKTthPXN9fXJldHVybiBlfXdyaXRlKGUsdCl7Y29uc3QgYT1lLHI9W10sbj1bXSxpPVtdO2xldCBzPTAsbz0wO2Zvcihjb25zdCBhIG9mIHRoaXMuY29udG91cnMpe2ZvcihsZXQgZT0wLHQ9YS54Q29vcmRpbmF0ZXMubGVuZ3RoO2U8dDtlKyspe2xldCB0PWEuZmxhZ3NbZV07Y29uc3QgYz1hLnhDb29yZGluYXRlc1tlXTtsZXQgbD1jLXM7aWYoMD09PWwpe3R8PTE2O3IucHVzaCgwKX1lbHNle2NvbnN0IGU9TWF0aC5hYnMobCk7aWYoZTw9MjU1KXt0fD1sPj0wPzE4OjI7ci5wdXNoKGUpfWVsc2Ugci5wdXNoKGwpfXM9Yztjb25zdCBoPWEueUNvb3JkaW5hdGVzW2VdO2w9aC1vO2lmKDA9PT1sKXt0fD0zMjtuLnB1c2goMCl9ZWxzZXtjb25zdCBlPU1hdGguYWJzKGwpO2lmKGU8PTI1NSl7dHw9bD49MD8zNjo0O24ucHVzaChlKX1lbHNlIG4ucHVzaChsKX1vPWg7aS5wdXNoKHQpfXQuc2V0VWludDE2KGUsci5sZW5ndGgtMSk7ZSs9Mn10LnNldFVpbnQxNihlLHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCk7ZSs9MjtpZih0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpe25ldyBVaW50OEFycmF5KHQuYnVmZmVyLDAsdC5idWZmZXIuYnl0ZUxlbmd0aCkuc2V0KHRoaXMuaW5zdHJ1Y3Rpb25zLGUpO2UrPXRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aH1mb3IoY29uc3QgYSBvZiBpKXQuc2V0VWludDgoZSsrLGEpO2ZvcihsZXQgYT0wLG49ci5sZW5ndGg7YTxuO2ErKyl7Y29uc3Qgbj1yW2FdLHM9aVthXTtpZigyJnMpdC5zZXRVaW50OChlKyssbik7ZWxzZSBpZighKDE2JnMpKXt0LnNldEludDE2KGUsbik7ZSs9Mn19Zm9yKGxldCBhPTAscj1uLmxlbmd0aDthPHI7YSsrKXtjb25zdCByPW5bYV0scz1pW2FdO2lmKDQmcyl0LnNldFVpbnQ4KGUrKyxyKTtlbHNlIGlmKCEoMzImcykpe3Quc2V0SW50MTYoZSxyKTtlKz0yfX1yZXR1cm4gZS1hfXNjYWxlKGUsdCl7Zm9yKGNvbnN0IGEgb2YgdGhpcy5jb250b3VycylpZigwIT09YS54Q29vcmRpbmF0ZXMubGVuZ3RoKWZvcihsZXQgcj0wLG49YS54Q29vcmRpbmF0ZXMubGVuZ3RoO3I8bjtyKyspYS54Q29vcmRpbmF0ZXNbcl09TWF0aC5yb3VuZChlKyhhLnhDb29yZGluYXRlc1tyXS1lKSp0KX19Y2xhc3MgQ29tcG9zaXRlR2x5cGh7Y29uc3RydWN0b3IoZSl7bGV0e2ZsYWdzOnQsZ2x5cGhJbmRleDphLGFyZ3VtZW50MTpyLGFyZ3VtZW50MjpuLHRyYW5zZjppLGluc3RydWN0aW9uczpzfT1lO3RoaXMuZmxhZ3M9dDt0aGlzLmdseXBoSW5kZXg9YTt0aGlzLmFyZ3VtZW50MT1yO3RoaXMuYXJndW1lbnQyPW47dGhpcy50cmFuc2Y9aTt0aGlzLmluc3RydWN0aW9ucz1zfXN0YXRpYyBwYXJzZShlLHQpe2NvbnN0IGE9ZSxyPVtdO2xldCBuPXQuZ2V0VWludDE2KGUpO2NvbnN0IGk9dC5nZXRVaW50MTYoZSsyKTtlKz00O2xldCBzLG87aWYoMSZuKXtpZigyJm4pe3M9dC5nZXRJbnQxNihlKTtvPXQuZ2V0SW50MTYoZSsyKX1lbHNle3M9dC5nZXRVaW50MTYoZSk7bz10LmdldFVpbnQxNihlKzIpfWUrPTQ7bl49MX1lbHNle2lmKDImbil7cz10LmdldEludDgoZSk7bz10LmdldEludDgoZSsxKX1lbHNle3M9dC5nZXRVaW50OChlKTtvPXQuZ2V0VWludDgoZSsxKX1lKz0yfWlmKDgmbil7ci5wdXNoKHQuZ2V0VWludDE2KGUpKTtlKz0yfWVsc2UgaWYoNjQmbil7ci5wdXNoKHQuZ2V0VWludDE2KGUpLHQuZ2V0VWludDE2KGUrMikpO2UrPTR9ZWxzZSBpZigxMjgmbil7ci5wdXNoKHQuZ2V0VWludDE2KGUpLHQuZ2V0VWludDE2KGUrMiksdC5nZXRVaW50MTYoZSs0KSx0LmdldFVpbnQxNihlKzYpKTtlKz04fWxldCBjPW51bGw7aWYoMjU2Jm4pe2NvbnN0IGE9dC5nZXRVaW50MTYoZSk7ZSs9MjtjPW5ldyBVaW50OEFycmF5KHQpLnNsaWNlKGUsZSthKTtlKz1hfXJldHVybltlLWEsbmV3IENvbXBvc2l0ZUdseXBoKHtmbGFnczpuLGdseXBoSW5kZXg6aSxhcmd1bWVudDE6cyxhcmd1bWVudDI6byx0cmFuc2Y6cixpbnN0cnVjdGlvbnM6Y30pXX1nZXRTaXplKCl7bGV0IGU9NCsyKnRoaXMudHJhbnNmLmxlbmd0aDsyNTYmdGhpcy5mbGFncyYmKGUrPTIrdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKTtlKz0yOzImdGhpcy5mbGFncz90aGlzLmFyZ3VtZW50MT49LTEyOCYmdGhpcy5hcmd1bWVudDE8PTEyNyYmdGhpcy5hcmd1bWVudDI+PS0xMjgmJnRoaXMuYXJndW1lbnQyPD0xMjd8fChlKz0yKTp0aGlzLmFyZ3VtZW50MT49MCYmdGhpcy5hcmd1bWVudDE8PTI1NSYmdGhpcy5hcmd1bWVudDI+PTAmJnRoaXMuYXJndW1lbnQyPD0yNTV8fChlKz0yKTtyZXR1cm4gZX13cml0ZShlLHQpe2NvbnN0IGE9ZTsyJnRoaXMuZmxhZ3M/dGhpcy5hcmd1bWVudDE+PS0xMjgmJnRoaXMuYXJndW1lbnQxPD0xMjcmJnRoaXMuYXJndW1lbnQyPj0tMTI4JiZ0aGlzLmFyZ3VtZW50Mjw9MTI3fHwodGhpcy5mbGFnc3w9MSk6dGhpcy5hcmd1bWVudDE+PTAmJnRoaXMuYXJndW1lbnQxPD0yNTUmJnRoaXMuYXJndW1lbnQyPj0wJiZ0aGlzLmFyZ3VtZW50Mjw9MjU1fHwodGhpcy5mbGFnc3w9MSk7dC5zZXRVaW50MTYoZSx0aGlzLmZsYWdzKTt0LnNldFVpbnQxNihlKzIsdGhpcy5nbHlwaEluZGV4KTtlKz00O2lmKDEmdGhpcy5mbGFncyl7aWYoMiZ0aGlzLmZsYWdzKXt0LnNldEludDE2KGUsdGhpcy5hcmd1bWVudDEpO3Quc2V0SW50MTYoZSsyLHRoaXMuYXJndW1lbnQyKX1lbHNle3Quc2V0VWludDE2KGUsdGhpcy5hcmd1bWVudDEpO3Quc2V0VWludDE2KGUrMix0aGlzLmFyZ3VtZW50Mil9ZSs9NH1lbHNle3Quc2V0VWludDgoZSx0aGlzLmFyZ3VtZW50MSk7dC5zZXRVaW50OChlKzEsdGhpcy5hcmd1bWVudDIpO2UrPTJ9aWYoMjU2JnRoaXMuZmxhZ3Mpe3Quc2V0VWludDE2KGUsdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKTtlKz0yO2lmKHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCl7bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsMCx0LmJ1ZmZlci5ieXRlTGVuZ3RoKS5zZXQodGhpcy5pbnN0cnVjdGlvbnMsZSk7ZSs9dGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RofX1yZXR1cm4gZS1hfXNjYWxlKGUsdCl7fX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuT3BlblR5cGVGaWxlQnVpbGRlcj12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO2EoMTM5KTthKDIpO3ZhciByPWEoMTQ5KSxuPWEoMTQ0KTtmdW5jdGlvbiB3cml0ZUludDE2KGUsdCxhKXtlW3RdPWE+PjgmMjU1O2VbdCsxXT0yNTUmYX1mdW5jdGlvbiB3cml0ZUludDMyKGUsdCxhKXtlW3RdPWE+PjI0JjI1NTtlW3QrMV09YT4+MTYmMjU1O2VbdCsyXT1hPj44JjI1NTtlW3QrM109MjU1JmF9ZnVuY3Rpb24gd3JpdGVEYXRhKGUsdCxhKXtpZihhIGluc3RhbmNlb2YgVWludDhBcnJheSllLnNldChhLHQpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBhKWZvcihsZXQgcj0wLG49YS5sZW5ndGg7cjxuO3IrKyllW3QrK109MjU1JmEuY2hhckNvZGVBdChyKTtlbHNlIGZvcihjb25zdCByIG9mIGEpZVt0KytdPTI1NSZyfWNsYXNzIE9wZW5UeXBlRmlsZUJ1aWxkZXJ7Y29uc3RydWN0b3IoZSl7dGhpcy5zZm50PWU7dGhpcy50YWJsZXM9T2JqZWN0LmNyZWF0ZShudWxsKX1zdGF0aWMgZ2V0U2VhcmNoUGFyYW1zKGUsdCl7bGV0IGE9MSxyPTA7Zm9yKDsoYV5lKT5hOyl7YTw8PTE7cisrfWNvbnN0IG49YSp0O3JldHVybntyYW5nZTpuLGVudHJ5OnIscmFuZ2VTaGlmdDp0KmUtbn19dG9BcnJheSgpe2xldCBlPXRoaXMuc2ZudDtjb25zdCB0PXRoaXMudGFibGVzLGE9T2JqZWN0LmtleXModCk7YS5zb3J0KCk7Y29uc3QgaT1hLmxlbmd0aDtsZXQgcyxvLGMsbCxoLHU9MTIrMTYqaTtjb25zdCBkPVt1XTtmb3Iocz0wO3M8aTtzKyspe2w9dFthW3NdXTt1Kz0obC5sZW5ndGgrMyYtNCk+Pj4wO2QucHVzaCh1KX1jb25zdCBmPW5ldyBVaW50OEFycmF5KHUpO2ZvcihzPTA7czxpO3MrKyl7bD10W2Fbc11dO3dyaXRlRGF0YShmLGRbc10sbCl9InRydWUiPT09ZSYmKGU9KDAsbi5zdHJpbmczMikoNjU1MzYpKTtmWzBdPTI1NSZlLmNoYXJDb2RlQXQoMCk7ZlsxXT0yNTUmZS5jaGFyQ29kZUF0KDEpO2ZbMl09MjU1JmUuY2hhckNvZGVBdCgyKTtmWzNdPTI1NSZlLmNoYXJDb2RlQXQoMyk7d3JpdGVJbnQxNihmLDQsaSk7Y29uc3QgZz1PcGVuVHlwZUZpbGVCdWlsZGVyLmdldFNlYXJjaFBhcmFtcyhpLDE2KTt3cml0ZUludDE2KGYsNixnLnJhbmdlKTt3cml0ZUludDE2KGYsOCxnLmVudHJ5KTt3cml0ZUludDE2KGYsMTAsZy5yYW5nZVNoaWZ0KTt1PTEyO2ZvcihzPTA7czxpO3MrKyl7aD1hW3NdO2ZbdV09MjU1JmguY2hhckNvZGVBdCgwKTtmW3UrMV09MjU1JmguY2hhckNvZGVBdCgxKTtmW3UrMl09MjU1JmguY2hhckNvZGVBdCgyKTtmW3UrM109MjU1JmguY2hhckNvZGVBdCgzKTtsZXQgZT0wO2ZvcihvPWRbc10sYz1kW3MrMV07bzxjO28rPTQpe2U9ZSsoMCxyLnJlYWRVaW50MzIpKGYsbyk+Pj4wfXdyaXRlSW50MzIoZix1KzQsZSk7d3JpdGVJbnQzMihmLHUrOCxkW3NdKTt3cml0ZUludDMyKGYsdSsxMix0W2hdLmxlbmd0aCk7dSs9MTZ9cmV0dXJuIGZ9YWRkVGFibGUoZSx0KXtpZihlIGluIHRoaXMudGFibGVzKXRocm93IG5ldyBFcnJvcigiVGFibGUgIitlKyIgYWxyZWFkeSBleGlzdHMiKTt0aGlzLnRhYmxlc1tlXT10fX10Lk9wZW5UeXBlRmlsZUJ1aWxkZXI9T3BlblR5cGVGaWxlQnVpbGRlcn0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5UeXBlMUZvbnQ9dm9pZCAwO2EoMTM5KTt2YXIgcj1hKDE4NSksbj1hKDE0NCksaT1hKDE4OCkscz1hKDE0OSksbz1hKDE1NCksYz1hKDE5OSk7ZnVuY3Rpb24gZmluZEJsb2NrKGUsdCxhKXtjb25zdCByPWUubGVuZ3RoLG49dC5sZW5ndGgsaT1yLW47bGV0IG89YSxjPSExO2Zvcig7bzxpOyl7bGV0IGE9MDtmb3IoO2E8biYmZVtvK2FdPT09dFthXTspYSsrO2lmKGE+PW4pe28rPWE7Zm9yKDtvPHImJigwLHMuaXNXaGl0ZVNwYWNlKShlW29dKTspbysrO2M9ITA7YnJlYWt9bysrfXJldHVybntmb3VuZDpjLGxlbmd0aDpvfX10LlR5cGUxRm9udD1jbGFzcyBUeXBlMUZvbnR7Y29uc3RydWN0b3IoZSx0LGEpe2xldCByPWEubGVuZ3RoMSxzPWEubGVuZ3RoMixsPXQucGVla0J5dGVzKDYpO2NvbnN0IGg9MTI4PT09bFswXSYmMT09PWxbMV07aWYoaCl7dC5za2lwKDYpO3I9bFs1XTw8MjR8bFs0XTw8MTZ8bFszXTw8OHxsWzJdfWNvbnN0IHU9ZnVuY3Rpb24gZ2V0SGVhZGVyQmxvY2soZSx0KXtjb25zdCBhPVsxMDEsMTAxLDEyMCwxMDEsOTldLHI9ZS5wb3M7bGV0IGkscyxjLGw7dHJ5e2k9ZS5nZXRCeXRlcyh0KTtzPWkubGVuZ3RofWNhdGNoe31pZihzPT09dCl7Yz1maW5kQmxvY2soaSxhLHQtMiphLmxlbmd0aCk7aWYoYy5mb3VuZCYmYy5sZW5ndGg9PT10KXJldHVybntzdHJlYW06bmV3IG8uU3RyZWFtKGkpLGxlbmd0aDp0fX0oMCxuLndhcm4pKCdJbnZhbGlkICJMZW5ndGgxIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHRyeWluZyB0byByZWNvdmVyLicpO2UucG9zPXI7Zm9yKDs7KXtjPWZpbmRCbG9jayhlLnBlZWtCeXRlcygyMDQ4KSxhLDApO2lmKDA9PT1jLmxlbmd0aClicmVhaztlLnBvcys9Yy5sZW5ndGg7aWYoYy5mb3VuZCl7bD1lLnBvcy1yO2JyZWFrfX1lLnBvcz1yO2lmKGwpcmV0dXJue3N0cmVhbTpuZXcgby5TdHJlYW0oZS5nZXRCeXRlcyhsKSksbGVuZ3RoOmx9OygwLG4ud2FybikoJ1VuYWJsZSB0byByZWNvdmVyICJMZW5ndGgxIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHVzaW5nIGFzIGlzLicpO3JldHVybntzdHJlYW06bmV3IG8uU3RyZWFtKGUuZ2V0Qnl0ZXModCkpLGxlbmd0aDp0fX0odCxyKTtuZXcgYy5UeXBlMVBhcnNlcih1LnN0cmVhbSwhMSxpLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCkuZXh0cmFjdEZvbnRIZWFkZXIoYSk7aWYoaCl7bD10LmdldEJ5dGVzKDYpO3M9bFs1XTw8MjR8bFs0XTw8MTZ8bFszXTw8OHxsWzJdfWNvbnN0IGQ9ZnVuY3Rpb24gZ2V0RWV4ZWNCbG9jayhlLHQpe2NvbnN0IGE9ZS5nZXRCeXRlcygpO2lmKDA9PT1hLmxlbmd0aCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiZ2V0RWV4ZWNCbG9jayAtIG5vIGZvbnQgcHJvZ3JhbSBmb3VuZC4iKTtyZXR1cm57c3RyZWFtOm5ldyBvLlN0cmVhbShhKSxsZW5ndGg6YS5sZW5ndGh9fSh0KSxmPW5ldyBjLlR5cGUxUGFyc2VyKGQuc3RyZWFtLCEwLGkuU0VBQ19BTkFMWVNJU19FTkFCTEVEKS5leHRyYWN0Rm9udFByb2dyYW0oYSk7Zm9yKGNvbnN0IGUgaW4gZi5wcm9wZXJ0aWVzKWFbZV09Zi5wcm9wZXJ0aWVzW2VdO2NvbnN0IGc9Zi5jaGFyc3RyaW5ncyxwPXRoaXMuZ2V0VHlwZTJDaGFyc3RyaW5ncyhnKSxtPXRoaXMuZ2V0VHlwZTJTdWJycyhmLnN1YnJzKTt0aGlzLmNoYXJzdHJpbmdzPWc7dGhpcy5kYXRhPXRoaXMud3JhcChlLHAsdGhpcy5jaGFyc3RyaW5ncyxtLGEpO3RoaXMuc2VhY3M9dGhpcy5nZXRTZWFjcyhmLmNoYXJzdHJpbmdzKX1nZXQgbnVtR2x5cGhzKCl7cmV0dXJuIHRoaXMuY2hhcnN0cmluZ3MubGVuZ3RoKzF9Z2V0Q2hhcnNldCgpe2NvbnN0IGU9WyIubm90ZGVmIl07Zm9yKGNvbnN0e2dseXBoTmFtZTp0fW9mIHRoaXMuY2hhcnN0cmluZ3MpZS5wdXNoKHQpO3JldHVybiBlfWdldEdseXBoTWFwcGluZyhlKXtjb25zdCB0PXRoaXMuY2hhcnN0cmluZ3M7aWYoZS5jb21wb3NpdGUpe2NvbnN0IGE9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspe2FbZS5jTWFwLmNoYXJDb2RlT2YocildPXIrMX1yZXR1cm4gYX1jb25zdCBhPVsiLm5vdGRlZiJdO2xldCByLG47Zm9yKG49MDtuPHQubGVuZ3RoO24rKylhLnB1c2godFtuXS5nbHlwaE5hbWUpO2NvbnN0IHM9ZS5idWlsdEluRW5jb2Rpbmc7aWYocyl7cj1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdCBlIGluIHMpe249YS5pbmRleE9mKHNbZV0pO24+PTAmJihyW2VdPW4pfX1yZXR1cm4oMCxpLnR5cGUxRm9udEdseXBoTWFwcGluZykoZSxyLGEpfWhhc0dseXBoSWQoZSl7aWYoZTwwfHxlPj10aGlzLm51bUdseXBocylyZXR1cm4hMTtpZigwPT09ZSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5jaGFyc3RyaW5nc1tlLTFdLmNoYXJzdHJpbmcubGVuZ3RoPjB9Z2V0U2VhY3MoZSl7Y29uc3QgdD1bXTtmb3IobGV0IGE9MCxyPWUubGVuZ3RoO2E8cjthKyspe2NvbnN0IHI9ZVthXTtyLnNlYWMmJih0W2ErMV09ci5zZWFjKX1yZXR1cm4gdH1nZXRUeXBlMkNoYXJzdHJpbmdzKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IGEgb2YgZSl0LnB1c2goYS5jaGFyc3RyaW5nKTtyZXR1cm4gdH1nZXRUeXBlMlN1YnJzKGUpe2xldCB0PTA7Y29uc3QgYT1lLmxlbmd0aDt0PWE8MTEzMz8xMDc6YTwzMzc2OT8xMTMxOjMyNzY4O2NvbnN0IHI9W107bGV0IG47Zm9yKG49MDtuPHQ7bisrKXIucHVzaChbMTFdKTtmb3Iobj0wO248YTtuKyspci5wdXNoKGVbbl0pO3JldHVybiByfXdyYXAoZSx0LGEsbixpKXtjb25zdCBzPW5ldyByLkNGRjtzLmhlYWRlcj1uZXcgci5DRkZIZWFkZXIoMSwwLDQsNCk7cy5uYW1lcz1bZV07Y29uc3Qgbz1uZXcgci5DRkZUb3BEaWN0O28uc2V0QnlOYW1lKCJ2ZXJzaW9uIiwzOTEpO28uc2V0QnlOYW1lKCJOb3RpY2UiLDM5Mik7by5zZXRCeU5hbWUoIkZ1bGxOYW1lIiwzOTMpO28uc2V0QnlOYW1lKCJGYW1pbHlOYW1lIiwzOTQpO28uc2V0QnlOYW1lKCJXZWlnaHQiLDM5NSk7by5zZXRCeU5hbWUoIkVuY29kaW5nIixudWxsKTtvLnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsaS5mb250TWF0cml4KTtvLnNldEJ5TmFtZSgiRm9udEJCb3giLGkuYmJveCk7by5zZXRCeU5hbWUoImNoYXJzZXQiLG51bGwpO28uc2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIsbnVsbCk7by5zZXRCeU5hbWUoIlByaXZhdGUiLG51bGwpO3MudG9wRGljdD1vO2NvbnN0IGM9bmV3IHIuQ0ZGU3RyaW5ncztjLmFkZCgiVmVyc2lvbiAwLjExIik7Yy5hZGQoIlNlZSBvcmlnaW5hbCBub3RpY2UiKTtjLmFkZChlKTtjLmFkZChlKTtjLmFkZCgiTWVkaXVtIik7cy5zdHJpbmdzPWM7cy5nbG9iYWxTdWJySW5kZXg9bmV3IHIuQ0ZGSW5kZXg7Y29uc3QgbD10Lmxlbmd0aCxoPVsiLm5vdGRlZiJdO2xldCB1LGQ7Zm9yKHU9MDt1PGw7dSsrKXtjb25zdCBlPWFbdV0uZ2x5cGhOYW1lOy0xPT09ci5DRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihlKSYmYy5hZGQoZSk7aC5wdXNoKGUpfXMuY2hhcnNldD1uZXcgci5DRkZDaGFyc2V0KCExLDAsaCk7Y29uc3QgZj1uZXcgci5DRkZJbmRleDtmLmFkZChbMTM5LDE0XSk7Zm9yKHU9MDt1PGw7dSsrKWYuYWRkKHRbdV0pO3MuY2hhclN0cmluZ3M9Zjtjb25zdCBnPW5ldyByLkNGRlByaXZhdGVEaWN0O2cuc2V0QnlOYW1lKCJTdWJycyIsbnVsbCk7Y29uc3QgcD1bIkJsdWVWYWx1ZXMiLCJPdGhlckJsdWVzIiwiRmFtaWx5Qmx1ZXMiLCJGYW1pbHlPdGhlckJsdWVzIiwiU3RlbVNuYXBIIiwiU3RlbVNuYXBWIiwiQmx1ZVNoaWZ0IiwiQmx1ZUZ1enoiLCJCbHVlU2NhbGUiLCJMYW5ndWFnZUdyb3VwIiwiRXhwYW5zaW9uRmFjdG9yIiwiRm9yY2VCb2xkIiwiU3RkSFciLCJTdGRWVyJdO2Zvcih1PTAsZD1wLmxlbmd0aDt1PGQ7dSsrKXtjb25zdCBlPXBbdV07aWYoIShlIGluIGkucHJpdmF0ZURhdGEpKWNvbnRpbnVlO2NvbnN0IHQ9aS5wcml2YXRlRGF0YVtlXTtpZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgZT10Lmxlbmd0aC0xO2U+MDtlLS0pdFtlXS09dFtlLTFdO2cuc2V0QnlOYW1lKGUsdCl9cy50b3BEaWN0LnByaXZhdGVEaWN0PWc7Y29uc3QgbT1uZXcgci5DRkZJbmRleDtmb3IodT0wLGQ9bi5sZW5ndGg7dTxkO3UrKyltLmFkZChuW3VdKTtnLnN1YnJzSW5kZXg9bTtyZXR1cm4gbmV3IHIuQ0ZGQ29tcGlsZXIocykuY29tcGlsZSgpfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuVHlwZTFQYXJzZXI9dm9pZCAwO2EoMTM5KTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgxNTkpO3ZhciByPWEoMTg3KSxuPWEoMTQ5KSxpPWEoMTU0KSxzPWEoMTQ0KTtjb25zdCBvPVs0XSxjPVs1XSxsPVs2XSxoPVs3XSx1PVs4XSxkPVsxMiwzNV0sZj1bMTRdLGc9WzIxXSxwPVsyMl0sbT1bMzBdLGI9WzMxXTtjbGFzcyBUeXBlMUNoYXJTdHJpbmd7Y29uc3RydWN0b3IoKXt0aGlzLndpZHRoPTA7dGhpcy5sc2I9MDt0aGlzLmZsZXhpbmc9ITE7dGhpcy5vdXRwdXQ9W107dGhpcy5zdGFjaz1bXX1jb252ZXJ0KGUsdCxhKXtjb25zdCByPWUubGVuZ3RoO2xldCBuLGkseSx3PSExO2ZvcihsZXQgUz0wO1M8cjtTKyspe2xldCByPWVbU107aWYocjwzMil7MTI9PT1yJiYocj0ocjw8OCkrZVsrK1NdKTtzd2l0Y2gocil7Y2FzZSAxOmNhc2UgMzpjYXNlIDk6Y2FzZSAzMDcyOmNhc2UgMzA3MzpjYXNlIDMwNzQ6Y2FzZSAzMTA1OnRoaXMuc3RhY2s9W107YnJlYWs7Y2FzZSA0OmlmKHRoaXMuZmxleGluZyl7aWYodGhpcy5zdGFjay5sZW5ndGg8MSl7dz0hMDticmVha31jb25zdCBlPXRoaXMuc3RhY2sucG9wKCk7dGhpcy5zdGFjay5wdXNoKDAsZSk7YnJlYWt9dz10aGlzLmV4ZWN1dGVDb21tYW5kKDEsbyk7YnJlYWs7Y2FzZSA1Onc9dGhpcy5leGVjdXRlQ29tbWFuZCgyLGMpO2JyZWFrO2Nhc2UgNjp3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoMSxsKTticmVhaztjYXNlIDc6dz10aGlzLmV4ZWN1dGVDb21tYW5kKDEsaCk7YnJlYWs7Y2FzZSA4Onc9dGhpcy5leGVjdXRlQ29tbWFuZCg2LHUpO2JyZWFrO2Nhc2UgMTA6aWYodGhpcy5zdGFjay5sZW5ndGg8MSl7dz0hMDticmVha315PXRoaXMuc3RhY2sucG9wKCk7aWYoIXRbeV0pe3c9ITA7YnJlYWt9dz10aGlzLmNvbnZlcnQodFt5XSx0LGEpO2JyZWFrO2Nhc2UgMTE6cmV0dXJuIHc7Y2FzZSAxMzppZih0aGlzLnN0YWNrLmxlbmd0aDwyKXt3PSEwO2JyZWFrfW49dGhpcy5zdGFjay5wb3AoKTtpPXRoaXMuc3RhY2sucG9wKCk7dGhpcy5sc2I9aTt0aGlzLndpZHRoPW47dGhpcy5zdGFjay5wdXNoKG4saSk7dz10aGlzLmV4ZWN1dGVDb21tYW5kKDIscCk7YnJlYWs7Y2FzZSAxNDp0aGlzLm91dHB1dC5wdXNoKGZbMF0pO2JyZWFrO2Nhc2UgMjE6aWYodGhpcy5mbGV4aW5nKWJyZWFrO3c9dGhpcy5leGVjdXRlQ29tbWFuZCgyLGcpO2JyZWFrO2Nhc2UgMjI6aWYodGhpcy5mbGV4aW5nKXt0aGlzLnN0YWNrLnB1c2goMCk7YnJlYWt9dz10aGlzLmV4ZWN1dGVDb21tYW5kKDEscCk7YnJlYWs7Y2FzZSAzMDp3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoNCxtKTticmVhaztjYXNlIDMxOnc9dGhpcy5leGVjdXRlQ29tbWFuZCg0LGIpO2JyZWFrO2Nhc2UgMzA3ODppZihhKXtjb25zdCBlPXRoaXMuc3RhY2suYXQoLTUpO3RoaXMuc2VhYz10aGlzLnN0YWNrLnNwbGljZSgtNCw0KTt0aGlzLnNlYWNbMF0rPXRoaXMubHNiLWU7dz10aGlzLmV4ZWN1dGVDb21tYW5kKDAsZil9ZWxzZSB3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoNCxmKTticmVhaztjYXNlIDMwNzk6aWYodGhpcy5zdGFjay5sZW5ndGg8NCl7dz0hMDticmVha310aGlzLnN0YWNrLnBvcCgpO249dGhpcy5zdGFjay5wb3AoKTtjb25zdCBlPXRoaXMuc3RhY2sucG9wKCk7aT10aGlzLnN0YWNrLnBvcCgpO3RoaXMubHNiPWk7dGhpcy53aWR0aD1uO3RoaXMuc3RhY2sucHVzaChuLGksZSk7dz10aGlzLmV4ZWN1dGVDb21tYW5kKDMsZyk7YnJlYWs7Y2FzZSAzMDg0OmlmKHRoaXMuc3RhY2subGVuZ3RoPDIpe3c9ITA7YnJlYWt9Y29uc3QgUz10aGlzLnN0YWNrLnBvcCgpLHg9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnN0YWNrLnB1c2goeC9TKTticmVhaztjYXNlIDMwODg6aWYodGhpcy5zdGFjay5sZW5ndGg8Mil7dz0hMDticmVha315PXRoaXMuc3RhY2sucG9wKCk7Y29uc3QgQz10aGlzLnN0YWNrLnBvcCgpO2lmKDA9PT15JiYzPT09Qyl7Y29uc3QgZT10aGlzLnN0YWNrLnNwbGljZSgtMTcsMTcpO3RoaXMuc3RhY2sucHVzaChlWzJdK2VbMF0sZVszXStlWzFdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XSxlWzldLGVbMTBdLGVbMTFdLGVbMTJdLGVbMTNdLGVbMTRdKTt3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoMTMsZCwhMCk7dGhpcy5mbGV4aW5nPSExO3RoaXMuc3RhY2sucHVzaChlWzE1XSxlWzE2XSl9ZWxzZSAxPT09eSYmMD09PUMmJih0aGlzLmZsZXhpbmc9ITApO2JyZWFrO2Nhc2UgMzA4OTpicmVhaztkZWZhdWx0OigwLHMud2FybikoJ1Vua25vd24gdHlwZSAxIGNoYXJzdHJpbmcgY29tbWFuZCBvZiAiJytyKyciJyl9aWYodylicmVha31lbHNle3I8PTI0Nj9yLT0xMzk6cj1yPD0yNTA/MjU2KihyLTI0NykrZVsrK1NdKzEwODpyPD0yNTQ/LTI1Niooci0yNTEpLWVbKytTXS0xMDg6KDI1NSZlWysrU10pPDwyNHwoMjU1JmVbKytTXSk8PDE2fCgyNTUmZVsrK1NdKTw8OHwoMjU1JmVbKytTXSk8PDA7dGhpcy5zdGFjay5wdXNoKHIpfX1yZXR1cm4gd31leGVjdXRlQ29tbWFuZChlLHQsYSl7Y29uc3Qgcj10aGlzLnN0YWNrLmxlbmd0aDtpZihlPnIpcmV0dXJuITA7Y29uc3Qgbj1yLWU7Zm9yKGxldCBlPW47ZTxyO2UrKyl7bGV0IHQ9dGhpcy5zdGFja1tlXTtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpKXRoaXMub3V0cHV0LnB1c2goMjgsdD4+OCYyNTUsMjU1JnQpO2Vsc2V7dD02NTUzNip0fDA7dGhpcy5vdXRwdXQucHVzaCgyNTUsdD4+MjQmMjU1LHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCl9fXRoaXMub3V0cHV0LnB1c2goLi4udCk7YT90aGlzLnN0YWNrLnNwbGljZShuLGUpOnRoaXMuc3RhY2subGVuZ3RoPTA7cmV0dXJuITF9fWZ1bmN0aW9uIGlzSGV4RGlnaXQoZSl7cmV0dXJuIGU+PTQ4JiZlPD01N3x8ZT49NjUmJmU8PTcwfHxlPj05NyYmZTw9MTAyfWZ1bmN0aW9uIGRlY3J5cHQoZSx0LGEpe2lmKGE+PWUubGVuZ3RoKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtsZXQgcixuLGk9MHx0O2ZvcihyPTA7cjxhO3IrKylpPTUyODQ1KihlW3JdK2kpKzIyNzE5JjY1NTM1O2NvbnN0IHM9ZS5sZW5ndGgtYSxvPW5ldyBVaW50OEFycmF5KHMpO2ZvcihyPWEsbj0wO248cztyKyssbisrKXtjb25zdCB0PWVbcl07b1tuXT10Xmk+Pjg7aT01Mjg0NSoodCtpKSsyMjcxOSY2NTUzNX1yZXR1cm4gb31mdW5jdGlvbiBpc1NwZWNpYWwoZSl7cmV0dXJuIDQ3PT09ZXx8OTE9PT1lfHw5Mz09PWV8fDEyMz09PWV8fDEyNT09PWV8fDQwPT09ZXx8NDE9PT1lfXQuVHlwZTFQYXJzZXI9Y2xhc3MgVHlwZTFQYXJzZXJ7Y29uc3RydWN0b3IoZSx0LGEpe2lmKHQpe2NvbnN0IHQ9ZS5nZXRCeXRlcygpLGE9ISgoaXNIZXhEaWdpdCh0WzBdKXx8KDAsbi5pc1doaXRlU3BhY2UpKHRbMF0pKSYmaXNIZXhEaWdpdCh0WzFdKSYmaXNIZXhEaWdpdCh0WzJdKSYmaXNIZXhEaWdpdCh0WzNdKSYmaXNIZXhEaWdpdCh0WzRdKSYmaXNIZXhEaWdpdCh0WzVdKSYmaXNIZXhEaWdpdCh0WzZdKSYmaXNIZXhEaWdpdCh0WzddKSk7ZT1uZXcgaS5TdHJlYW0oYT9kZWNyeXB0KHQsNTU2NjUsNCk6ZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGUsdCxhKXtsZXQgcj0wfHQ7Y29uc3Qgbj1lLmxlbmd0aCxpPW5ldyBVaW50OEFycmF5KG4+Pj4xKTtsZXQgcyxvO2ZvcihzPTAsbz0wO3M8bjtzKyspe2NvbnN0IHQ9ZVtzXTtpZighaXNIZXhEaWdpdCh0KSljb250aW51ZTtzKys7bGV0IGE7Zm9yKDtzPG4mJiFpc0hleERpZ2l0KGE9ZVtzXSk7KXMrKztpZihzPG4pe2NvbnN0IGU9cGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZSh0LGEpLDE2KTtpW28rK109ZV5yPj44O3I9NTI4NDUqKGUrcikrMjI3MTkmNjU1MzV9fXJldHVybiBpLnNsaWNlKGEsbyl9KHQsNTU2NjUsNCkpfXRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZD0hIWE7dGhpcy5zdHJlYW09ZTt0aGlzLm5leHRDaGFyKCl9cmVhZE51bWJlckFycmF5KCl7dGhpcy5nZXRUb2tlbigpO2NvbnN0IGU9W107Zm9yKDs7KXtjb25zdCB0PXRoaXMuZ2V0VG9rZW4oKTtpZihudWxsPT09dHx8Il0iPT09dHx8In0iPT09dClicmVhaztlLnB1c2gocGFyc2VGbG9hdCh0fHwwKSl9cmV0dXJuIGV9cmVhZE51bWJlcigpe2NvbnN0IGU9dGhpcy5nZXRUb2tlbigpO3JldHVybiBwYXJzZUZsb2F0KGV8fDApfXJlYWRJbnQoKXtjb25zdCBlPXRoaXMuZ2V0VG9rZW4oKTtyZXR1cm4gMHxwYXJzZUludChlfHwwLDEwKX1yZWFkQm9vbGVhbigpe3JldHVybiJ0cnVlIj09PXRoaXMuZ2V0VG9rZW4oKT8xOjB9bmV4dENoYXIoKXtyZXR1cm4gdGhpcy5jdXJyZW50Q2hhcj10aGlzLnN0cmVhbS5nZXRCeXRlKCl9cHJldkNoYXIoKXt0aGlzLnN0cmVhbS5za2lwKC0yKTtyZXR1cm4gdGhpcy5jdXJyZW50Q2hhcj10aGlzLnN0cmVhbS5nZXRCeXRlKCl9Z2V0VG9rZW4oKXtsZXQgZT0hMSx0PXRoaXMuY3VycmVudENoYXI7Zm9yKDs7KXtpZigtMT09PXQpcmV0dXJuIG51bGw7aWYoZSkxMCE9PXQmJjEzIT09dHx8KGU9ITEpO2Vsc2UgaWYoMzc9PT10KWU9ITA7ZWxzZSBpZighKDAsbi5pc1doaXRlU3BhY2UpKHQpKWJyZWFrO3Q9dGhpcy5uZXh0Q2hhcigpfWlmKGlzU3BlY2lhbCh0KSl7dGhpcy5uZXh0Q2hhcigpO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQpfWxldCBhPSIiO2Rve2ErPVN0cmluZy5mcm9tQ2hhckNvZGUodCk7dD10aGlzLm5leHRDaGFyKCl9d2hpbGUodD49MCYmISgwLG4uaXNXaGl0ZVNwYWNlKSh0KSYmIWlzU3BlY2lhbCh0KSk7cmV0dXJuIGF9cmVhZENoYXJTdHJpbmdzKGUsdCl7cmV0dXJuLTE9PT10P2U6ZGVjcnlwdChlLDQzMzAsdCl9ZXh0cmFjdEZvbnRQcm9ncmFtKGUpe2NvbnN0IHQ9dGhpcy5zdHJlYW0sYT1bXSxyPVtdLG49T2JqZWN0LmNyZWF0ZShudWxsKTtuLmxlbklWPTQ7Y29uc3QgaT17c3VicnM6W10sY2hhcnN0cmluZ3M6W10scHJvcGVydGllczp7cHJpdmF0ZURhdGE6bn19O2xldCBzLG8sYyxsO2Zvcig7bnVsbCE9PShzPXRoaXMuZ2V0VG9rZW4oKSk7KWlmKCIvIj09PXMpe3M9dGhpcy5nZXRUb2tlbigpO3N3aXRjaChzKXtjYXNlIkNoYXJTdHJpbmdzIjp0aGlzLmdldFRva2VuKCk7dGhpcy5nZXRUb2tlbigpO3RoaXMuZ2V0VG9rZW4oKTt0aGlzLmdldFRva2VuKCk7Zm9yKDs7KXtzPXRoaXMuZ2V0VG9rZW4oKTtpZihudWxsPT09c3x8ImVuZCI9PT1zKWJyZWFrO2lmKCIvIiE9PXMpY29udGludWU7Y29uc3QgZT10aGlzLmdldFRva2VuKCk7bz10aGlzLnJlYWRJbnQoKTt0aGlzLmdldFRva2VuKCk7Yz1vPjA/dC5nZXRCeXRlcyhvKTpuZXcgVWludDhBcnJheSgwKTtsPWkucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjtjb25zdCBhPXRoaXMucmVhZENoYXJTdHJpbmdzKGMsbCk7dGhpcy5uZXh0Q2hhcigpO3M9dGhpcy5nZXRUb2tlbigpOyJub2FjY2VzcyI9PT1zP3RoaXMuZ2V0VG9rZW4oKToiLyI9PT1zJiZ0aGlzLnByZXZDaGFyKCk7ci5wdXNoKHtnbHlwaDplLGVuY29kZWQ6YX0pfWJyZWFrO2Nhc2UiU3VicnMiOnRoaXMucmVhZEludCgpO3RoaXMuZ2V0VG9rZW4oKTtmb3IoOyJkdXAiPT09dGhpcy5nZXRUb2tlbigpOyl7Y29uc3QgZT10aGlzLnJlYWRJbnQoKTtvPXRoaXMucmVhZEludCgpO3RoaXMuZ2V0VG9rZW4oKTtjPW8+MD90LmdldEJ5dGVzKG8pOm5ldyBVaW50OEFycmF5KDApO2w9aS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhLmxlbklWO2NvbnN0IHI9dGhpcy5yZWFkQ2hhclN0cmluZ3MoYyxsKTt0aGlzLm5leHRDaGFyKCk7cz10aGlzLmdldFRva2VuKCk7Im5vYWNjZXNzIj09PXMmJnRoaXMuZ2V0VG9rZW4oKTthW2VdPXJ9YnJlYWs7Y2FzZSJCbHVlVmFsdWVzIjpjYXNlIk90aGVyQmx1ZXMiOmNhc2UiRmFtaWx5Qmx1ZXMiOmNhc2UiRmFtaWx5T3RoZXJCbHVlcyI6Y29uc3QgZT10aGlzLnJlYWROdW1iZXJBcnJheSgpO2UubGVuZ3RoPjAmJmUubGVuZ3RoLDA7YnJlYWs7Y2FzZSJTdGVtU25hcEgiOmNhc2UiU3RlbVNuYXBWIjppLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbc109dGhpcy5yZWFkTnVtYmVyQXJyYXkoKTticmVhaztjYXNlIlN0ZEhXIjpjYXNlIlN0ZFZXIjppLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbc109dGhpcy5yZWFkTnVtYmVyQXJyYXkoKVswXTticmVhaztjYXNlIkJsdWVTaGlmdCI6Y2FzZSJsZW5JViI6Y2FzZSJCbHVlRnV6eiI6Y2FzZSJCbHVlU2NhbGUiOmNhc2UiTGFuZ3VhZ2VHcm91cCI6aS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3NdPXRoaXMucmVhZE51bWJlcigpO2JyZWFrO2Nhc2UiRXhwYW5zaW9uRmFjdG9yIjppLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbc109dGhpcy5yZWFkTnVtYmVyKCl8fC4wNjticmVhaztjYXNlIkZvcmNlQm9sZCI6aS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3NdPXRoaXMucmVhZEJvb2xlYW4oKX19Zm9yKGNvbnN0e2VuY29kZWQ6dCxnbHlwaDpufW9mIHIpe2NvbnN0IHI9bmV3IFR5cGUxQ2hhclN0cmluZyxzPXIuY29udmVydCh0LGEsdGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkKTtsZXQgbz1yLm91dHB1dDtzJiYobz1bMTRdKTtjb25zdCBjPXtnbHlwaE5hbWU6bixjaGFyc3RyaW5nOm8sd2lkdGg6ci53aWR0aCxsc2I6ci5sc2Isc2VhYzpyLnNlYWN9OyIubm90ZGVmIj09PW4/aS5jaGFyc3RyaW5ncy51bnNoaWZ0KGMpOmkuY2hhcnN0cmluZ3MucHVzaChjKTtpZihlLmJ1aWx0SW5FbmNvZGluZyl7Y29uc3QgdD1lLmJ1aWx0SW5FbmNvZGluZy5pbmRleE9mKG4pO3Q+LTEmJnZvaWQgMD09PWUud2lkdGhzW3RdJiZ0Pj1lLmZpcnN0Q2hhciYmdDw9ZS5sYXN0Q2hhciYmKGUud2lkdGhzW3RdPXIud2lkdGgpfX1yZXR1cm4gaX1leHRyYWN0Rm9udEhlYWRlcihlKXtsZXQgdDtmb3IoO251bGwhPT0odD10aGlzLmdldFRva2VuKCkpOylpZigiLyI9PT10KXt0PXRoaXMuZ2V0VG9rZW4oKTtzd2l0Y2godCl7Y2FzZSJGb250TWF0cml4Ijpjb25zdCBhPXRoaXMucmVhZE51bWJlckFycmF5KCk7ZS5mb250TWF0cml4PWE7YnJlYWs7Y2FzZSJFbmNvZGluZyI6Y29uc3Qgbj10aGlzLmdldFRva2VuKCk7bGV0IGk7aWYoL15cZCskLy50ZXN0KG4pKXtpPVtdO2NvbnN0IGU9MHxwYXJzZUludChuLDEwKTt0aGlzLmdldFRva2VuKCk7Zm9yKGxldCBhPTA7YTxlO2ErKyl7dD10aGlzLmdldFRva2VuKCk7Zm9yKDsiZHVwIiE9PXQmJiJkZWYiIT09dDspe3Q9dGhpcy5nZXRUb2tlbigpO2lmKG51bGw9PT10KXJldHVybn1pZigiZGVmIj09PXQpYnJlYWs7Y29uc3QgZT10aGlzLnJlYWRJbnQoKTt0aGlzLmdldFRva2VuKCk7Y29uc3QgYT10aGlzLmdldFRva2VuKCk7aVtlXT1hO3RoaXMuZ2V0VG9rZW4oKX19ZWxzZSBpPSgwLHIuZ2V0RW5jb2RpbmcpKG4pO2UuYnVpbHRJbkVuY29kaW5nPWk7YnJlYWs7Y2FzZSJGb250QkJveCI6Y29uc3Qgcz10aGlzLnJlYWROdW1iZXJBcnJheSgpO2UuYXNjZW50PU1hdGgubWF4KHNbM10sc1sxXSk7ZS5kZXNjZW50PU1hdGgubWluKHNbMV0sc1szXSk7ZS5hc2NlbnRTY2FsZWQ9ITB9fX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlBhdHRlcm49dm9pZCAwO3QuZ2V0VGlsaW5nUGF0dGVybklSPWZ1bmN0aW9uIGdldFRpbGluZ1BhdHRlcm5JUihlLHQsYSl7Y29uc3Qgbj10LmdldEFycmF5KCJNYXRyaXgiKSxpPXIuVXRpbC5ub3JtYWxpemVSZWN0KHQuZ2V0QXJyYXkoIkJCb3giKSkscz10LmdldCgiWFN0ZXAiKSxvPXQuZ2V0KCJZU3RlcCIpLGM9dC5nZXQoIlBhaW50VHlwZSIpLGw9dC5nZXQoIlRpbGluZ1R5cGUiKTtpZihpWzJdLWlbMF09PTB8fGlbM10taVsxXT09MCl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcihgSW52YWxpZCBnZXRUaWxpbmdQYXR0ZXJuSVIgL0JCb3ggYXJyYXk6IFske2l9XS5gKTtyZXR1cm5bIlRpbGluZ1BhdHRlcm4iLGEsZSxuLGkscyxvLGMsbF19O2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTthKDEzOSk7YSgxNTkpO3ZhciByPWEoMTQ0KSxuPWEoMTUxKSxpPWEoMTYyKSxzPWEoMTQ5KTtjb25zdCBvPTIsYz0zLGw9NCxoPTUsdT02LGQ9Nzt0LlBhdHRlcm49Y2xhc3MgUGF0dGVybntjb25zdHJ1Y3RvcigpeygwLHIudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBQYXR0ZXJuLiIpfXN0YXRpYyBwYXJzZVNoYWRpbmcoZSx0LGEsaSxmKXtjb25zdCBnPWUgaW5zdGFuY2VvZiBuLkJhc2VTdHJlYW0/ZS5kaWN0OmUscD1nLmdldCgiU2hhZGluZ1R5cGUiKTt0cnl7c3dpdGNoKHApe2Nhc2UgbzpjYXNlIGM6cmV0dXJuIG5ldyBSYWRpYWxBeGlhbFNoYWRpbmcoZyx0LGEsaSxmKTtjYXNlIGw6Y2FzZSBoOmNhc2UgdTpjYXNlIGQ6cmV0dXJuIG5ldyBNZXNoU2hhZGluZyhlLHQsYSxpLGYpO2RlZmF1bHQ6dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIlVuc3VwcG9ydGVkIFNoYWRpbmdUeXBlOiAiK3ApfX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygcy5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLHIud2FybikoZSk7cmV0dXJuIG5ldyBEdW1teVNoYWRpbmd9fX07Y2xhc3MgQmFzZVNoYWRpbmd7c3RhdGljIFNNQUxMX05VTUJFUj0xZS02O2NvbnN0cnVjdG9yKCl7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VTaGFkaW5nJiYoMCxyLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmcuIil9Z2V0SVIoKXsoMCxyLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRJUmAgY2FsbGVkLiIpfX1jbGFzcyBSYWRpYWxBeGlhbFNoYWRpbmcgZXh0ZW5kcyBCYXNlU2hhZGluZ3tjb25zdHJ1Y3RvcihlLHQsYSxuLHMpe3N1cGVyKCk7dGhpcy5jb29yZHNBcnI9ZS5nZXRBcnJheSgiQ29vcmRzIik7dGhpcy5zaGFkaW5nVHlwZT1lLmdldCgiU2hhZGluZ1R5cGUiKTtjb25zdCBvPWkuQ29sb3JTcGFjZS5wYXJzZSh7Y3M6ZS5nZXRSYXcoIkNTIil8fGUuZ2V0UmF3KCJDb2xvclNwYWNlIikseHJlZjp0LHJlc291cmNlczphLHBkZkZ1bmN0aW9uRmFjdG9yeTpuLGxvY2FsQ29sb3JTcGFjZUNhY2hlOnN9KSxsPWUuZ2V0QXJyYXkoIkJCb3giKTt0aGlzLmJib3g9QXJyYXkuaXNBcnJheShsKSYmND09PWwubGVuZ3RoP3IuVXRpbC5ub3JtYWxpemVSZWN0KGwpOm51bGw7bGV0IGg9MCx1PTE7aWYoZS5oYXMoIkRvbWFpbiIpKXtjb25zdCB0PWUuZ2V0QXJyYXkoIkRvbWFpbiIpO2g9dFswXTt1PXRbMV19bGV0IGQ9ITEsZj0hMTtpZihlLmhhcygiRXh0ZW5kIikpe2NvbnN0IHQ9ZS5nZXRBcnJheSgiRXh0ZW5kIik7ZD10WzBdO2Y9dFsxXX1pZighKHRoaXMuc2hhZGluZ1R5cGUhPT1jfHxkJiZmKSl7Y29uc3RbZSx0LGEsbixpLHNdPXRoaXMuY29vcmRzQXJyLG89TWF0aC5oeXBvdChlLW4sdC1pKTthPD1zK28mJnM8PWErbyYmKDAsci53YXJuKSgiVW5zdXBwb3J0ZWQgcmFkaWFsIGdyYWRpZW50LiIpfXRoaXMuZXh0ZW5kU3RhcnQ9ZDt0aGlzLmV4dGVuZEVuZD1mO2NvbnN0IGc9ZS5nZXRSYXcoIkZ1bmN0aW9uIikscD1uLmNyZWF0ZUZyb21BcnJheShnKSxtPSh1LWgpLzg0MCxiPXRoaXMuY29sb3JTdG9wcz1bXTtpZihoPj11fHxtPD0wKXsoMCxyLmluZm8pKCJCYWQgc2hhZGluZyBkb21haW4uIik7cmV0dXJufWNvbnN0IHk9bmV3IEZsb2F0MzJBcnJheShvLm51bUNvbXBzKSx3PW5ldyBGbG9hdDMyQXJyYXkoMSk7bGV0IFMseD0wO3dbMF09aDtwKHcsMCx5LDApO2xldCBDPW8uZ2V0UmdiKHksMCk7Y29uc3Qgdj1yLlV0aWwubWFrZUhleENvbG9yKENbMF0sQ1sxXSxDWzJdKTtiLnB1c2goWzAsdl0pO2xldCBrPTE7d1swXT1oK207cCh3LDAseSwwKTtsZXQgTz1vLmdldFJnYih5LDApLFQ9T1swXS1DWzBdKzEsTT1PWzFdLUNbMV0rMSxFPU9bMl0tQ1syXSsxLEQ9T1swXS1DWzBdLTEsTj1PWzFdLUNbMV0tMSxSPU9bMl0tQ1syXS0xO2ZvcihsZXQgZT0yO2U8ODQwO2UrKyl7d1swXT1oK2UqbTtwKHcsMCx5LDApO1M9by5nZXRSZ2IoeSwwKTtjb25zdCB0PWUteDtUPU1hdGgubWluKFQsKFNbMF0tQ1swXSsxKS90KTtNPU1hdGgubWluKE0sKFNbMV0tQ1sxXSsxKS90KTtFPU1hdGgubWluKEUsKFNbMl0tQ1syXSsxKS90KTtEPU1hdGgubWF4KEQsKFNbMF0tQ1swXS0xKS90KTtOPU1hdGgubWF4KE4sKFNbMV0tQ1sxXS0xKS90KTtSPU1hdGgubWF4KFIsKFNbMl0tQ1syXS0xKS90KTtpZighKEQ8PVQmJk48PU0mJlI8PUUpKXtjb25zdCBlPXIuVXRpbC5tYWtlSGV4Q29sb3IoT1swXSxPWzFdLE9bMl0pO2IucHVzaChbay84NDAsZV0pO1Q9U1swXS1PWzBdKzE7TT1TWzFdLU9bMV0rMTtFPVNbMl0tT1syXSsxO0Q9U1swXS1PWzBdLTE7Tj1TWzFdLU9bMV0tMTtSPVNbMl0tT1syXS0xO3g9aztDPU99az1lO089U31jb25zdCBMPXIuVXRpbC5tYWtlSGV4Q29sb3IoT1swXSxPWzFdLE9bMl0pO2IucHVzaChbMSxMXSk7bGV0ICQ9InRyYW5zcGFyZW50IjtpZihlLmhhcygiQmFja2dyb3VuZCIpKXtTPW8uZ2V0UmdiKGUuZ2V0KCJCYWNrZ3JvdW5kIiksMCk7JD1yLlV0aWwubWFrZUhleENvbG9yKFNbMF0sU1sxXSxTWzJdKX1pZighZCl7Yi51bnNoaWZ0KFswLCRdKTtiWzFdWzBdKz1CYXNlU2hhZGluZy5TTUFMTF9OVU1CRVJ9aWYoIWYpe2IuYXQoLTEpWzBdLT1CYXNlU2hhZGluZy5TTUFMTF9OVU1CRVI7Yi5wdXNoKFsxLCRdKX10aGlzLmNvbG9yU3RvcHM9Yn1nZXRJUigpe2NvbnN0IGU9dGhpcy5jb29yZHNBcnIsdD10aGlzLnNoYWRpbmdUeXBlO2xldCBhLG4saSxzLGw7aWYodD09PW8pe249W2VbMF0sZVsxXV07aT1bZVsyXSxlWzNdXTtzPW51bGw7bD1udWxsO2E9ImF4aWFsIn1lbHNlIGlmKHQ9PT1jKXtuPVtlWzBdLGVbMV1dO2k9W2VbM10sZVs0XV07cz1lWzJdO2w9ZVs1XTthPSJyYWRpYWwifWVsc2UoMCxyLnVucmVhY2hhYmxlKShgZ2V0UGF0dGVybiB0eXBlIHVua25vd246ICR7dH1gKTtyZXR1cm5bIlJhZGlhbEF4aWFsIixhLHRoaXMuYmJveCx0aGlzLmNvbG9yU3RvcHMsbixpLHMsbF19fWNsYXNzIE1lc2hTdHJlYW1SZWFkZXJ7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnN0cmVhbT1lO3RoaXMuY29udGV4dD10O3RoaXMuYnVmZmVyPTA7dGhpcy5idWZmZXJMZW5ndGg9MDtjb25zdCBhPXQubnVtQ29tcHM7dGhpcy50bXBDb21wc0J1Zj1uZXcgRmxvYXQzMkFycmF5KGEpO2NvbnN0IHI9dC5jb2xvclNwYWNlLm51bUNvbXBzO3RoaXMudG1wQ3NDb21wc0J1Zj10LmNvbG9yRm4/bmV3IEZsb2F0MzJBcnJheShyKTp0aGlzLnRtcENvbXBzQnVmfWdldCBoYXNEYXRhKCl7aWYodGhpcy5zdHJlYW0uZW5kKXJldHVybiB0aGlzLnN0cmVhbS5wb3M8dGhpcy5zdHJlYW0uZW5kO2lmKHRoaXMuYnVmZmVyTGVuZ3RoPjApcmV0dXJuITA7Y29uc3QgZT10aGlzLnN0cmVhbS5nZXRCeXRlKCk7aWYoZTwwKXJldHVybiExO3RoaXMuYnVmZmVyPWU7dGhpcy5idWZmZXJMZW5ndGg9ODtyZXR1cm4hMH1yZWFkQml0cyhlKXtsZXQgdD10aGlzLmJ1ZmZlcixhPXRoaXMuYnVmZmVyTGVuZ3RoO2lmKDMyPT09ZSl7aWYoMD09PWEpcmV0dXJuKHRoaXMuc3RyZWFtLmdldEJ5dGUoKTw8MjR8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpPDwxNnx0aGlzLnN0cmVhbS5nZXRCeXRlKCk8PDh8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKT4+PjA7dD10PDwyNHx0aGlzLnN0cmVhbS5nZXRCeXRlKCk8PDE2fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTw8OHx0aGlzLnN0cmVhbS5nZXRCeXRlKCk7Y29uc3QgZT10aGlzLnN0cmVhbS5nZXRCeXRlKCk7dGhpcy5idWZmZXI9ZSYoMTw8YSktMTtyZXR1cm4odDw8OC1hfCgyNTUmZSk+PmEpPj4+MH1pZig4PT09ZSYmMD09PWEpcmV0dXJuIHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtmb3IoO2E8ZTspe3Q9dDw8OHx0aGlzLnN0cmVhbS5nZXRCeXRlKCk7YSs9OH1hLT1lO3RoaXMuYnVmZmVyTGVuZ3RoPWE7dGhpcy5idWZmZXI9dCYoMTw8YSktMTtyZXR1cm4gdD4+YX1hbGlnbigpe3RoaXMuYnVmZmVyPTA7dGhpcy5idWZmZXJMZW5ndGg9MH1yZWFkRmxhZygpe3JldHVybiB0aGlzLnJlYWRCaXRzKHRoaXMuY29udGV4dC5iaXRzUGVyRmxhZyl9cmVhZENvb3JkaW5hdGUoKXtjb25zdCBlPXRoaXMuY29udGV4dC5iaXRzUGVyQ29vcmRpbmF0ZSx0PXRoaXMucmVhZEJpdHMoZSksYT10aGlzLnJlYWRCaXRzKGUpLHI9dGhpcy5jb250ZXh0LmRlY29kZSxuPWU8MzI/MS8oKDE8PGUpLTEpOjIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7cmV0dXJuW3QqbiooclsxXS1yWzBdKStyWzBdLGEqbiooclszXS1yWzJdKStyWzJdXX1yZWFkQ29tcG9uZW50cygpe2NvbnN0IGU9dGhpcy5jb250ZXh0Lm51bUNvbXBzLHQ9dGhpcy5jb250ZXh0LmJpdHNQZXJDb21wb25lbnQsYT10PDMyPzEvKCgxPDx0KS0xKToyLjMyODMwNjQzNjUzODY5NjNlLTEwLHI9dGhpcy5jb250ZXh0LmRlY29kZSxuPXRoaXMudG1wQ29tcHNCdWY7Zm9yKGxldCBpPTAscz00O2k8ZTtpKysscys9Mil7Y29uc3QgZT10aGlzLnJlYWRCaXRzKHQpO25baV09ZSphKihyW3MrMV0tcltzXSkrcltzXX1jb25zdCBpPXRoaXMudG1wQ3NDb21wc0J1Zjt0aGlzLmNvbnRleHQuY29sb3JGbiYmdGhpcy5jb250ZXh0LmNvbG9yRm4obiwwLGksMCk7cmV0dXJuIHRoaXMuY29udGV4dC5jb2xvclNwYWNlLmdldFJnYihpLDApfX1jb25zdCBmPWZ1bmN0aW9uIGdldEJDbG9zdXJlKCl7Y29uc3QgZT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZVt0XXx8PWZ1bmN0aW9uIGJ1aWxkQihlKXtjb25zdCB0PVtdO2ZvcihsZXQgYT0wO2E8PWU7YSsrKXtjb25zdCByPWEvZSxuPTEtcjt0LnB1c2gobmV3IEZsb2F0MzJBcnJheShbbipuKm4sMypyKm4qbiwzKnIqcipuLHIqcipyXSkpfXJldHVybiB0fSh0KX19KCk7Y2xhc3MgTWVzaFNoYWRpbmcgZXh0ZW5kcyBCYXNlU2hhZGluZ3tzdGF0aWMgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQ9MztzdGF0aWMgTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQ9MjA7c3RhdGljIFRSSUFOR0xFX0RFTlNJVFk9MjA7Y29uc3RydWN0b3IoZSx0LGEscyxvKXtzdXBlcigpO2lmKCEoZSBpbnN0YW5jZW9mIG4uQmFzZVN0cmVhbSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIk1lc2ggZGF0YSBpcyBub3QgYSBzdHJlYW0iKTtjb25zdCBjPWUuZGljdDt0aGlzLnNoYWRpbmdUeXBlPWMuZ2V0KCJTaGFkaW5nVHlwZSIpO2NvbnN0IGY9Yy5nZXRBcnJheSgiQkJveCIpO3RoaXMuYmJveD1BcnJheS5pc0FycmF5KGYpJiY0PT09Zi5sZW5ndGg/ci5VdGlsLm5vcm1hbGl6ZVJlY3QoZik6bnVsbDtjb25zdCBnPWkuQ29sb3JTcGFjZS5wYXJzZSh7Y3M6Yy5nZXRSYXcoIkNTIil8fGMuZ2V0UmF3KCJDb2xvclNwYWNlIikseHJlZjp0LHJlc291cmNlczphLHBkZkZ1bmN0aW9uRmFjdG9yeTpzLGxvY2FsQ29sb3JTcGFjZUNhY2hlOm99KTt0aGlzLmJhY2tncm91bmQ9Yy5oYXMoIkJhY2tncm91bmQiKT9nLmdldFJnYihjLmdldCgiQmFja2dyb3VuZCIpLDApOm51bGw7Y29uc3QgcD1jLmdldFJhdygiRnVuY3Rpb24iKSxtPXA/cy5jcmVhdGVGcm9tQXJyYXkocCk6bnVsbDt0aGlzLmNvb3Jkcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZpZ3VyZXM9W107Y29uc3QgYj17Yml0c1BlckNvb3JkaW5hdGU6Yy5nZXQoIkJpdHNQZXJDb29yZGluYXRlIiksYml0c1BlckNvbXBvbmVudDpjLmdldCgiQml0c1BlckNvbXBvbmVudCIpLGJpdHNQZXJGbGFnOmMuZ2V0KCJCaXRzUGVyRmxhZyIpLGRlY29kZTpjLmdldEFycmF5KCJEZWNvZGUiKSxjb2xvckZuOm0sY29sb3JTcGFjZTpnLG51bUNvbXBzOm0/MTpnLm51bUNvbXBzfSx5PW5ldyBNZXNoU3RyZWFtUmVhZGVyKGUsYik7bGV0IHc9ITE7c3dpdGNoKHRoaXMuc2hhZGluZ1R5cGUpe2Nhc2UgbDp0aGlzLl9kZWNvZGVUeXBlNFNoYWRpbmcoeSk7YnJlYWs7Y2FzZSBoOmNvbnN0IGU9MHxjLmdldCgiVmVydGljZXNQZXJSb3ciKTtpZihlPDIpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkludmFsaWQgVmVydGljZXNQZXJSb3ciKTt0aGlzLl9kZWNvZGVUeXBlNVNoYWRpbmcoeSxlKTticmVhaztjYXNlIHU6dGhpcy5fZGVjb2RlVHlwZTZTaGFkaW5nKHkpO3c9ITA7YnJlYWs7Y2FzZSBkOnRoaXMuX2RlY29kZVR5cGU3U2hhZGluZyh5KTt3PSEwO2JyZWFrO2RlZmF1bHQ6KDAsci51bnJlYWNoYWJsZSkoIlVuc3VwcG9ydGVkIG1lc2ggdHlwZS4iKX1pZih3KXt0aGlzLl91cGRhdGVCb3VuZHMoKTtmb3IobGV0IGU9MCx0PXRoaXMuZmlndXJlcy5sZW5ndGg7ZTx0O2UrKyl0aGlzLl9idWlsZEZpZ3VyZUZyb21QYXRjaChlKX10aGlzLl91cGRhdGVCb3VuZHMoKTt0aGlzLl9wYWNrRGF0YSgpfV9kZWNvZGVUeXBlNFNoYWRpbmcoZSl7Y29uc3QgdD10aGlzLmNvb3JkcyxhPXRoaXMuY29sb3JzLG49W10saT1bXTtsZXQgcz0wO2Zvcig7ZS5oYXNEYXRhOyl7Y29uc3Qgbz1lLnJlYWRGbGFnKCksYz1lLnJlYWRDb29yZGluYXRlKCksbD1lLnJlYWRDb21wb25lbnRzKCk7aWYoMD09PXMpe2lmKCEoMDw9byYmbzw9MikpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZTQgZmxhZyIpO3N3aXRjaChvKXtjYXNlIDA6cz0zO2JyZWFrO2Nhc2UgMTppLnB1c2goaS5hdCgtMiksaS5hdCgtMSkpO3M9MTticmVhaztjYXNlIDI6aS5wdXNoKGkuYXQoLTMpLGkuYXQoLTEpKTtzPTF9bi5wdXNoKG8pfWkucHVzaCh0Lmxlbmd0aCk7dC5wdXNoKGMpO2EucHVzaChsKTtzLS07ZS5hbGlnbigpfXRoaXMuZmlndXJlcy5wdXNoKHt0eXBlOiJ0cmlhbmdsZXMiLGNvb3JkczpuZXcgSW50MzJBcnJheShpKSxjb2xvcnM6bmV3IEludDMyQXJyYXkoaSl9KX1fZGVjb2RlVHlwZTVTaGFkaW5nKGUsdCl7Y29uc3QgYT10aGlzLmNvb3JkcyxyPXRoaXMuY29sb3JzLG49W107Zm9yKDtlLmhhc0RhdGE7KXtjb25zdCB0PWUucmVhZENvb3JkaW5hdGUoKSxpPWUucmVhZENvbXBvbmVudHMoKTtuLnB1c2goYS5sZW5ndGgpO2EucHVzaCh0KTtyLnB1c2goaSl9dGhpcy5maWd1cmVzLnB1c2goe3R5cGU6ImxhdHRpY2UiLGNvb3JkczpuZXcgSW50MzJBcnJheShuKSxjb2xvcnM6bmV3IEludDMyQXJyYXkobiksdmVydGljZXNQZXJSb3c6dH0pfV9kZWNvZGVUeXBlNlNoYWRpbmcoZSl7Y29uc3QgdD10aGlzLmNvb3JkcyxhPXRoaXMuY29sb3JzLG49bmV3IEludDMyQXJyYXkoMTYpLGk9bmV3IEludDMyQXJyYXkoNCk7Zm9yKDtlLmhhc0RhdGE7KXtjb25zdCBzPWUucmVhZEZsYWcoKTtpZighKDA8PXMmJnM8PTMpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU2IGZsYWciKTtjb25zdCBvPXQubGVuZ3RoO2ZvcihsZXQgYT0wLHI9MCE9PXM/ODoxMjthPHI7YSsrKXQucHVzaChlLnJlYWRDb29yZGluYXRlKCkpO2NvbnN0IGM9YS5sZW5ndGg7Zm9yKGxldCB0PTAscj0wIT09cz8yOjQ7dDxyO3QrKylhLnB1c2goZS5yZWFkQ29tcG9uZW50cygpKTtsZXQgbCxoLHUsZDtzd2l0Y2gocyl7Y2FzZSAwOm5bMTJdPW8rMztuWzEzXT1vKzQ7blsxNF09bys1O25bMTVdPW8rNjtuWzhdPW8rMjtuWzExXT1vKzc7bls0XT1vKzE7bls3XT1vKzg7blswXT1vO25bMV09bysxMTtuWzJdPW8rMTA7blszXT1vKzk7aVsyXT1jKzE7aVszXT1jKzI7aVswXT1jO2lbMV09YyszO2JyZWFrO2Nhc2UgMTpsPW5bMTJdO2g9blsxM107dT1uWzE0XTtkPW5bMTVdO25bMTJdPWQ7blsxM109byswO25bMTRdPW8rMTtuWzE1XT1vKzI7bls4XT11O25bMTFdPW8rMztuWzRdPWg7bls3XT1vKzQ7blswXT1sO25bMV09bys3O25bMl09bys2O25bM109bys1O2w9aVsyXTtoPWlbM107aVsyXT1oO2lbM109YztpWzBdPWw7aVsxXT1jKzE7YnJlYWs7Y2FzZSAyOmw9blsxNV07aD1uWzExXTtuWzEyXT1uWzNdO25bMTNdPW8rMDtuWzE0XT1vKzE7blsxNV09bysyO25bOF09bls3XTtuWzExXT1vKzM7bls0XT1oO25bN109bys0O25bMF09bDtuWzFdPW8rNztuWzJdPW8rNjtuWzNdPW8rNTtsPWlbM107aVsyXT1pWzFdO2lbM109YztpWzBdPWw7aVsxXT1jKzE7YnJlYWs7Y2FzZSAzOm5bMTJdPW5bMF07blsxM109byswO25bMTRdPW8rMTtuWzE1XT1vKzI7bls4XT1uWzFdO25bMTFdPW8rMztuWzRdPW5bMl07bls3XT1vKzQ7blswXT1uWzNdO25bMV09bys3O25bMl09bys2O25bM109bys1O2lbMl09aVswXTtpWzNdPWM7aVswXT1pWzFdO2lbMV09YysxfW5bNV09dC5sZW5ndGg7dC5wdXNoKFsoLTQqdFtuWzBdXVswXS10W25bMTVdXVswXSs2Kih0W25bNF1dWzBdK3RbblsxXV1bMF0pLTIqKHRbblsxMl1dWzBdK3RbblszXV1bMF0pKzMqKHRbblsxM11dWzBdK3Rbbls3XV1bMF0pKS85LCgtNCp0W25bMF1dWzFdLXRbblsxNV1dWzFdKzYqKHRbbls0XV1bMV0rdFtuWzFdXVsxXSktMioodFtuWzEyXV1bMV0rdFtuWzNdXVsxXSkrMyoodFtuWzEzXV1bMV0rdFtuWzddXVsxXSkpLzldKTtuWzZdPXQubGVuZ3RoO3QucHVzaChbKC00KnRbblszXV1bMF0tdFtuWzEyXV1bMF0rNioodFtuWzJdXVswXSt0W25bN11dWzBdKS0yKih0W25bMF1dWzBdK3RbblsxNV1dWzBdKSszKih0W25bNF1dWzBdK3RbblsxNF1dWzBdKSkvOSwoLTQqdFtuWzNdXVsxXS10W25bMTJdXVsxXSs2Kih0W25bMl1dWzFdK3Rbbls3XV1bMV0pLTIqKHRbblswXV1bMV0rdFtuWzE1XV1bMV0pKzMqKHRbbls0XV1bMV0rdFtuWzE0XV1bMV0pKS85XSk7bls5XT10Lmxlbmd0aDt0LnB1c2goWygtNCp0W25bMTJdXVswXS10W25bM11dWzBdKzYqKHRbbls4XV1bMF0rdFtuWzEzXV1bMF0pLTIqKHRbblswXV1bMF0rdFtuWzE1XV1bMF0pKzMqKHRbblsxMV1dWzBdK3RbblsxXV1bMF0pKS85LCgtNCp0W25bMTJdXVsxXS10W25bM11dWzFdKzYqKHRbbls4XV1bMV0rdFtuWzEzXV1bMV0pLTIqKHRbblswXV1bMV0rdFtuWzE1XV1bMV0pKzMqKHRbblsxMV1dWzFdK3RbblsxXV1bMV0pKS85XSk7blsxMF09dC5sZW5ndGg7dC5wdXNoKFsoLTQqdFtuWzE1XV1bMF0tdFtuWzBdXVswXSs2Kih0W25bMTFdXVswXSt0W25bMTRdXVswXSktMioodFtuWzEyXV1bMF0rdFtuWzNdXVswXSkrMyoodFtuWzJdXVswXSt0W25bOF1dWzBdKSkvOSwoLTQqdFtuWzE1XV1bMV0tdFtuWzBdXVsxXSs2Kih0W25bMTFdXVsxXSt0W25bMTRdXVsxXSktMioodFtuWzEyXV1bMV0rdFtuWzNdXVsxXSkrMyoodFtuWzJdXVsxXSt0W25bOF1dWzFdKSkvOV0pO3RoaXMuZmlndXJlcy5wdXNoKHt0eXBlOiJwYXRjaCIsY29vcmRzOm5ldyBJbnQzMkFycmF5KG4pLGNvbG9yczpuZXcgSW50MzJBcnJheShpKX0pfX1fZGVjb2RlVHlwZTdTaGFkaW5nKGUpe2NvbnN0IHQ9dGhpcy5jb29yZHMsYT10aGlzLmNvbG9ycyxuPW5ldyBJbnQzMkFycmF5KDE2KSxpPW5ldyBJbnQzMkFycmF5KDQpO2Zvcig7ZS5oYXNEYXRhOyl7Y29uc3Qgcz1lLnJlYWRGbGFnKCk7aWYoISgwPD1zJiZzPD0zKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNyBmbGFnIik7Y29uc3Qgbz10Lmxlbmd0aDtmb3IobGV0IGE9MCxyPTAhPT1zPzEyOjE2O2E8cjthKyspdC5wdXNoKGUucmVhZENvb3JkaW5hdGUoKSk7Y29uc3QgYz1hLmxlbmd0aDtmb3IobGV0IHQ9MCxyPTAhPT1zPzI6NDt0PHI7dCsrKWEucHVzaChlLnJlYWRDb21wb25lbnRzKCkpO2xldCBsLGgsdSxkO3N3aXRjaChzKXtjYXNlIDA6blsxMl09byszO25bMTNdPW8rNDtuWzE0XT1vKzU7blsxNV09bys2O25bOF09bysyO25bOV09bysxMztuWzEwXT1vKzE0O25bMTFdPW8rNztuWzRdPW8rMTtuWzVdPW8rMTI7bls2XT1vKzE1O25bN109bys4O25bMF09bztuWzFdPW8rMTE7blsyXT1vKzEwO25bM109bys5O2lbMl09YysxO2lbM109YysyO2lbMF09YztpWzFdPWMrMzticmVhaztjYXNlIDE6bD1uWzEyXTtoPW5bMTNdO3U9blsxNF07ZD1uWzE1XTtuWzEyXT1kO25bMTNdPW8rMDtuWzE0XT1vKzE7blsxNV09bysyO25bOF09dTtuWzldPW8rOTtuWzEwXT1vKzEwO25bMTFdPW8rMztuWzRdPWg7bls1XT1vKzg7bls2XT1vKzExO25bN109bys0O25bMF09bDtuWzFdPW8rNztuWzJdPW8rNjtuWzNdPW8rNTtsPWlbMl07aD1pWzNdO2lbMl09aDtpWzNdPWM7aVswXT1sO2lbMV09YysxO2JyZWFrO2Nhc2UgMjpsPW5bMTVdO2g9blsxMV07blsxMl09blszXTtuWzEzXT1vKzA7blsxNF09bysxO25bMTVdPW8rMjtuWzhdPW5bN107bls5XT1vKzk7blsxMF09bysxMDtuWzExXT1vKzM7bls0XT1oO25bNV09bys4O25bNl09bysxMTtuWzddPW8rNDtuWzBdPWw7blsxXT1vKzc7blsyXT1vKzY7blszXT1vKzU7bD1pWzNdO2lbMl09aVsxXTtpWzNdPWM7aVswXT1sO2lbMV09YysxO2JyZWFrO2Nhc2UgMzpuWzEyXT1uWzBdO25bMTNdPW8rMDtuWzE0XT1vKzE7blsxNV09bysyO25bOF09blsxXTtuWzldPW8rOTtuWzEwXT1vKzEwO25bMTFdPW8rMztuWzRdPW5bMl07bls1XT1vKzg7bls2XT1vKzExO25bN109bys0O25bMF09blszXTtuWzFdPW8rNztuWzJdPW8rNjtuWzNdPW8rNTtpWzJdPWlbMF07aVszXT1jO2lbMF09aVsxXTtpWzFdPWMrMX10aGlzLmZpZ3VyZXMucHVzaCh7dHlwZToicGF0Y2giLGNvb3JkczpuZXcgSW50MzJBcnJheShuKSxjb2xvcnM6bmV3IEludDMyQXJyYXkoaSl9KX19X2J1aWxkRmlndXJlRnJvbVBhdGNoKGUpe2NvbnN0IHQ9dGhpcy5maWd1cmVzW2VdOygwLHIuYXNzZXJ0KSgicGF0Y2giPT09dC50eXBlLCJVbmV4cGVjdGVkIHBhdGNoIG1lc2ggZmlndXJlIik7Y29uc3QgYT10aGlzLmNvb3JkcyxuPXRoaXMuY29sb3JzLGk9dC5jb29yZHMscz10LmNvbG9ycyxvPU1hdGgubWluKGFbaVswXV1bMF0sYVtpWzNdXVswXSxhW2lbMTJdXVswXSxhW2lbMTVdXVswXSksYz1NYXRoLm1pbihhW2lbMF1dWzFdLGFbaVszXV1bMV0sYVtpWzEyXV1bMV0sYVtpWzE1XV1bMV0pLGw9TWF0aC5tYXgoYVtpWzBdXVswXSxhW2lbM11dWzBdLGFbaVsxMl1dWzBdLGFbaVsxNV1dWzBdKSxoPU1hdGgubWF4KGFbaVswXV1bMV0sYVtpWzNdXVsxXSxhW2lbMTJdXVsxXSxhW2lbMTVdXVsxXSk7bGV0IHU9TWF0aC5jZWlsKChsLW8pKk1lc2hTaGFkaW5nLlRSSUFOR0xFX0RFTlNJVFkvKHRoaXMuYm91bmRzWzJdLXRoaXMuYm91bmRzWzBdKSk7dT1NYXRoLm1heChNZXNoU2hhZGluZy5NSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCxNYXRoLm1pbihNZXNoU2hhZGluZy5NQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCx1KSk7bGV0IGQ9TWF0aC5jZWlsKChoLWMpKk1lc2hTaGFkaW5nLlRSSUFOR0xFX0RFTlNJVFkvKHRoaXMuYm91bmRzWzNdLXRoaXMuYm91bmRzWzFdKSk7ZD1NYXRoLm1heChNZXNoU2hhZGluZy5NSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCxNYXRoLm1pbihNZXNoU2hhZGluZy5NQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCxkKSk7Y29uc3QgZz11KzEscD1uZXcgSW50MzJBcnJheSgoZCsxKSpnKSxtPW5ldyBJbnQzMkFycmF5KChkKzEpKmcpO2xldCBiPTA7Y29uc3QgeT1uZXcgVWludDhBcnJheSgzKSx3PW5ldyBVaW50OEFycmF5KDMpLFM9bltzWzBdXSx4PW5bc1sxXV0sQz1uW3NbMl1dLHY9bltzWzNdXSxrPWYoZCksTz1mKHUpO2ZvcihsZXQgZT0wO2U8PWQ7ZSsrKXt5WzBdPShTWzBdKihkLWUpK0NbMF0qZSkvZHwwO3lbMV09KFNbMV0qKGQtZSkrQ1sxXSplKS9kfDA7eVsyXT0oU1syXSooZC1lKStDWzJdKmUpL2R8MDt3WzBdPSh4WzBdKihkLWUpK3ZbMF0qZSkvZHwwO3dbMV09KHhbMV0qKGQtZSkrdlsxXSplKS9kfDA7d1syXT0oeFsyXSooZC1lKSt2WzJdKmUpL2R8MDtmb3IobGV0IHQ9MDt0PD11O3QrKyxiKyspe2lmKCEoMCE9PWUmJmUhPT1kfHwwIT09dCYmdCE9PXUpKWNvbnRpbnVlO2xldCByPTAscz0wLG89MDtmb3IobGV0IG49MDtuPD0zO24rKylmb3IobGV0IGM9MDtjPD0zO2MrKyxvKyspe2NvbnN0IGw9a1tlXVtuXSpPW3RdW2NdO3IrPWFbaVtvXV1bMF0qbDtzKz1hW2lbb11dWzFdKmx9cFtiXT1hLmxlbmd0aDthLnB1c2goW3Isc10pO21bYl09bi5sZW5ndGg7Y29uc3QgYz1uZXcgVWludDhBcnJheSgzKTtjWzBdPSh5WzBdKih1LXQpK3dbMF0qdCkvdXwwO2NbMV09KHlbMV0qKHUtdCkrd1sxXSp0KS91fDA7Y1syXT0oeVsyXSoodS10KSt3WzJdKnQpL3V8MDtuLnB1c2goYyl9fXBbMF09aVswXTttWzBdPXNbMF07cFt1XT1pWzNdO21bdV09c1sxXTtwW2cqZF09aVsxMl07bVtnKmRdPXNbMl07cFtnKmQrdV09aVsxNV07bVtnKmQrdV09c1szXTt0aGlzLmZpZ3VyZXNbZV09e3R5cGU6ImxhdHRpY2UiLGNvb3JkczpwLGNvbG9yczptLHZlcnRpY2VzUGVyUm93Omd9fV91cGRhdGVCb3VuZHMoKXtsZXQgZT10aGlzLmNvb3Jkc1swXVswXSx0PXRoaXMuY29vcmRzWzBdWzFdLGE9ZSxyPXQ7Zm9yKGxldCBuPTEsaT10aGlzLmNvb3Jkcy5sZW5ndGg7bjxpO24rKyl7Y29uc3QgaT10aGlzLmNvb3Jkc1tuXVswXSxzPXRoaXMuY29vcmRzW25dWzFdO2U9ZT5pP2k6ZTt0PXQ+cz9zOnQ7YT1hPGk/aTphO3I9cjxzP3M6cn10aGlzLmJvdW5kcz1bZSx0LGEscl19X3BhY2tEYXRhKCl7bGV0IGUsdCxhLHI7Y29uc3Qgbj10aGlzLmNvb3JkcyxpPW5ldyBGbG9hdDMyQXJyYXkoMipuLmxlbmd0aCk7Zm9yKGU9MCxhPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKXtjb25zdCB0PW5bZV07aVthKytdPXRbMF07aVthKytdPXRbMV19dGhpcy5jb29yZHM9aTtjb25zdCBzPXRoaXMuY29sb3JzLG89bmV3IFVpbnQ4QXJyYXkoMypzLmxlbmd0aCk7Zm9yKGU9MCxhPTAsdD1zLmxlbmd0aDtlPHQ7ZSsrKXtjb25zdCB0PXNbZV07b1thKytdPXRbMF07b1thKytdPXRbMV07b1thKytdPXRbMl19dGhpcy5jb2xvcnM9bztjb25zdCBjPXRoaXMuZmlndXJlcztmb3IoZT0wLHQ9Yy5sZW5ndGg7ZTx0O2UrKyl7Y29uc3QgdD1jW2VdLG49dC5jb29yZHMsaT10LmNvbG9ycztmb3IoYT0wLHI9bi5sZW5ndGg7YTxyO2ErKyl7blthXSo9MjtpW2FdKj0zfX19Z2V0SVIoKXtyZXR1cm5bIk1lc2giLHRoaXMuc2hhZGluZ1R5cGUsdGhpcy5jb29yZHMsdGhpcy5jb2xvcnMsdGhpcy5maWd1cmVzLHRoaXMuYm91bmRzLHRoaXMuYmJveCx0aGlzLmJhY2tncm91bmRdfX1jbGFzcyBEdW1teVNoYWRpbmcgZXh0ZW5kcyBCYXNlU2hhZGluZ3tnZXRJUigpe3JldHVyblsiRHVtbXkiXX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmdldFhmYUZvbnREaWN0PWZ1bmN0aW9uIGdldFhmYUZvbnREaWN0KGUpe2NvbnN0IHQ9ZnVuY3Rpb24gZ2V0WGZhRm9udFdpZHRocyhlKXtjb25zdCB0PWdldFhmYUZvbnROYW1lKGUpO2lmKCF0KXJldHVybiBudWxsO2NvbnN0e2Jhc2VXaWR0aHM6YSxiYXNlTWFwcGluZzpyLGZhY3RvcnM6bn09dCxpPW4/YS5tYXAoKChlLHQpPT5lKm5bdF0pKTphO2xldCBzLG89LTI7Y29uc3QgYz1bXTtmb3IoY29uc3RbZSx0XW9mIHIubWFwKCgoZSx0KT0+W2UsdF0pKS5zb3J0KCgoZSx0KT0+e2xldFthXT1lLFtyXT10O3JldHVybiBhLXJ9KSkpaWYoLTEhPT1lKWlmKGU9PT1vKzEpe3MucHVzaChpW3RdKTtvKz0xfWVsc2V7bz1lO3M9W2lbdF1dO2MucHVzaChlLHMpfXJldHVybiBjfShlKSxhPW5ldyBuLkRpY3QobnVsbCk7YS5zZXQoIkJhc2VGb250IixuLk5hbWUuZ2V0KGUpKTthLnNldCgiVHlwZSIsbi5OYW1lLmdldCgiRm9udCIpKTthLnNldCgiU3VidHlwZSIsbi5OYW1lLmdldCgiQ0lERm9udFR5cGUyIikpO2Euc2V0KCJFbmNvZGluZyIsbi5OYW1lLmdldCgiSWRlbnRpdHktSCIpKTthLnNldCgiQ0lEVG9HSURNYXAiLG4uTmFtZS5nZXQoIklkZW50aXR5IikpO2Euc2V0KCJXIix0KTthLnNldCgiRmlyc3RDaGFyIix0WzBdKTthLnNldCgiTGFzdENoYXIiLHQuYXQoLTIpK3QuYXQoLTEpLmxlbmd0aC0xKTtjb25zdCByPW5ldyBuLkRpY3QobnVsbCk7YS5zZXQoIkZvbnREZXNjcmlwdG9yIixyKTtjb25zdCBpPW5ldyBuLkRpY3QobnVsbCk7aS5zZXQoIk9yZGVyaW5nIiwiSWRlbnRpdHkiKTtpLnNldCgiUmVnaXN0cnkiLCJBZG9iZSIpO2kuc2V0KCJTdXBwbGVtZW50IiwwKTthLnNldCgiQ0lEU3lzdGVtSW5mbyIsaSk7cmV0dXJuIGF9O3QuZ2V0WGZhRm9udE5hbWU9Z2V0WGZhRm9udE5hbWU7YSgxMzkpO3ZhciByPWEoMjAyKSxuPWEoMTUwKSxpPWEoMjAzKSxzPWEoMjA0KSxvPWEoMjA1KSxjPWEoMjA2KSxsPWEoMTQ5KSxoPWEoMTg4KTtjb25zdCB1PSgwLGwuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZVsiTXlyaWFkUHJvLVJlZ3VsYXIiXT1lWyJQZGZKUy1GYWxsYmFjay1SZWd1bGFyIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLGZhY3RvcnM6by5NeXJpYWRQcm9SZWd1bGFyRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZyxtZXRyaWNzOm8uTXlyaWFkUHJvUmVndWxhck1ldHJpY3N9O2VbIk15cmlhZFByby1Cb2xkIl09ZVsiUGRmSlMtRmFsbGJhY2stQm9sZCJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkIixmYWN0b3JzOm8uTXlyaWFkUHJvQm9sZEZhY3RvcnMsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zQm9sZFdpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmcsbWV0cmljczpvLk15cmlhZFByb0JvbGRNZXRyaWNzfTtlWyJNeXJpYWRQcm8tSXQiXT1lWyJNeXJpYWRQcm8tSXRhbGljIl09ZVsiUGRmSlMtRmFsbGJhY2stSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsZmFjdG9yczpvLk15cmlhZFByb0l0YWxpY0ZhY3RvcnMsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nLG1ldHJpY3M6by5NeXJpYWRQcm9JdGFsaWNNZXRyaWNzfTtlWyJNeXJpYWRQcm8tQm9sZEl0Il09ZVsiTXlyaWFkUHJvLUJvbGRJdGFsaWMiXT1lWyJQZGZKUy1GYWxsYmFjay1Cb2xkSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiLGZhY3RvcnM6by5NeXJpYWRQcm9Cb2xkSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyxtZXRyaWNzOm8uTXlyaWFkUHJvQm9sZEl0YWxpY01ldHJpY3N9O2UuQXJpYWxNVD1lLkFyaWFsPWVbIkFyaWFsLVJlZ3VsYXIiXT17bmFtZToiTGliZXJhdGlvblNhbnMtUmVndWxhciIsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zUmVndWxhck1hcHBpbmd9O2VbIkFyaWFsLUJvbGRNVCJdPWVbIkFyaWFsLUJvbGQiXT17bmFtZToiTGliZXJhdGlvblNhbnMtQm9sZCIsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zQm9sZFdpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmd9O2VbIkFyaWFsLUl0YWxpY01UIl09ZVsiQXJpYWwtSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nfTtlWyJBcmlhbC1Cb2xkSXRhbGljTVQiXT1lWyJBcmlhbC1Cb2xkSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nfTtlWyJDYWxpYnJpLVJlZ3VsYXIiXT17bmFtZToiTGliZXJhdGlvblNhbnMtUmVndWxhciIsZmFjdG9yczpyLkNhbGlicmlSZWd1bGFyRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZyxtZXRyaWNzOnIuQ2FsaWJyaVJlZ3VsYXJNZXRyaWNzfTtlWyJDYWxpYnJpLUJvbGQiXT17bmFtZToiTGliZXJhdGlvblNhbnMtQm9sZCIsZmFjdG9yczpyLkNhbGlicmlCb2xkRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZyxtZXRyaWNzOnIuQ2FsaWJyaUJvbGRNZXRyaWNzfTtlWyJDYWxpYnJpLUl0YWxpYyJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLGZhY3RvcnM6ci5DYWxpYnJpSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsbWV0cmljczpyLkNhbGlicmlJdGFsaWNNZXRyaWNzfTtlWyJDYWxpYnJpLUJvbGRJdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsZmFjdG9yczpyLkNhbGlicmlCb2xkSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyxtZXRyaWNzOnIuQ2FsaWJyaUJvbGRJdGFsaWNNZXRyaWNzfTtlWyJTZWdvZXVpLVJlZ3VsYXIiXT17bmFtZToiTGliZXJhdGlvblNhbnMtUmVndWxhciIsZmFjdG9yczpjLlNlZ29ldWlSZWd1bGFyRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZyxtZXRyaWNzOmMuU2Vnb2V1aVJlZ3VsYXJNZXRyaWNzfTtlWyJTZWdvZXVpLUJvbGQiXT17bmFtZToiTGliZXJhdGlvblNhbnMtQm9sZCIsZmFjdG9yczpjLlNlZ29ldWlCb2xkRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZyxtZXRyaWNzOmMuU2Vnb2V1aUJvbGRNZXRyaWNzfTtlWyJTZWdvZXVpLUl0YWxpYyJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLGZhY3RvcnM6Yy5TZWdvZXVpSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsbWV0cmljczpjLlNlZ29ldWlJdGFsaWNNZXRyaWNzfTtlWyJTZWdvZXVpLUJvbGRJdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsZmFjdG9yczpjLlNlZ29ldWlCb2xkSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyxtZXRyaWNzOmMuU2Vnb2V1aUJvbGRJdGFsaWNNZXRyaWNzfTtlWyJIZWx2ZXRpY2EtUmVndWxhciJdPWUuSGVsdmV0aWNhPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIixmYWN0b3JzOmkuSGVsdmV0aWNhUmVndWxhckZhY3RvcnMsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zUmVndWxhck1hcHBpbmcsbWV0cmljczppLkhlbHZldGljYVJlZ3VsYXJNZXRyaWNzfTtlWyJIZWx2ZXRpY2EtQm9sZCJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkIixmYWN0b3JzOmkuSGVsdmV0aWNhQm9sZEZhY3RvcnMsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zQm9sZFdpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmcsbWV0cmljczppLkhlbHZldGljYUJvbGRNZXRyaWNzfTtlWyJIZWx2ZXRpY2EtSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsZmFjdG9yczppLkhlbHZldGljYUl0YWxpY0ZhY3RvcnMsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nLG1ldHJpY3M6aS5IZWx2ZXRpY2FJdGFsaWNNZXRyaWNzfTtlWyJIZWx2ZXRpY2EtQm9sZEl0YWxpYyJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIixmYWN0b3JzOmkuSGVsdmV0aWNhQm9sZEl0YWxpY0ZhY3RvcnMsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY1dpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmcsbWV0cmljczppLkhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzfX0pKTtmdW5jdGlvbiBnZXRYZmFGb250TmFtZShlKXtjb25zdCB0PSgwLGgubm9ybWFsaXplRm9udE5hbWUpKGUpO3JldHVybiB1KClbdF19fSwoZSx0KT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5DYWxpYnJpUmVndWxhck1ldHJpY3M9dC5DYWxpYnJpUmVndWxhckZhY3RvcnM9dC5DYWxpYnJpSXRhbGljTWV0cmljcz10LkNhbGlicmlJdGFsaWNGYWN0b3JzPXQuQ2FsaWJyaUJvbGRNZXRyaWNzPXQuQ2FsaWJyaUJvbGRJdGFsaWNNZXRyaWNzPXQuQ2FsaWJyaUJvbGRJdGFsaWNGYWN0b3JzPXQuQ2FsaWJyaUJvbGRGYWN0b3JzPXZvaWQgMDt0LkNhbGlicmlCb2xkRmFjdG9ycz1bMS4zODc3LDEsMSwxLC45NzgwMSwuOTI0ODIsLjg5NTUyLC45MTEzMywuODE5ODgsLjk3NTY2LC45ODE1MiwuOTM1NDgsLjkzNTQ4LDEuMjc5OCwuODUyODQsLjkyNzk0LDEsLjk2MTM0LDEuNTQ2NTcsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC44Mjg0NSwuODI4NDUsLjg1Mjg0LC44NTI4NCwuODUyODQsLjc1ODU5LC45MjEzOCwuODM5MDgsLjc3NjIsLjczMjkzLC44NzI4OSwuNzMxMzMsLjc1MTQsLjgxOTIxLC44NzM1NiwuOTU5NTgsLjU5NTI2LC43NTcyNywuNjkyMjUsMS4wNDkyNCwuOTEyMSwuODY5NDMsLjc5Nzk1LC44ODE5OCwuNzc5NTgsLjcwODY0LC44MTA1NSwuOTAzOTksLjg4NjUzLC45NjAxNywuODI1NzcsLjc3ODkyLC43ODI1NywuOTc1MDcsMS41NDY1NywuOTc1MDcsLjg1Mjg0LC44OTU1MiwuOTAxNzYsLjg4NzYyLC44Nzg1LC43NTI0MSwuODc4NSwuOTA1MTgsLjk1MDE1LC43NzYxOCwuODc4NSwuODg0MDEsLjkxOTE2LC44NjMwNCwuODg0MDEsLjkxNDg4LC44Nzg1LC44ODAxLC44Nzg1LC44Nzg1LC45MTM0MywuNzE3MywxLjA0MTA2LC44Nzg1LC44NTA3NSwuOTU3OTQsLjgyNjE2LC44NTE2MiwuNzk0OTIsLjg4MzMxLDEuNjk4MDgsLjg4MzMxLC44NTI4NCwuOTc4MDEsLjg5NTUyLC45MTEzMywuODk1NTIsLjkxMTMzLDEuNzgwMSwuODk1NTIsMS4yNDQ4NywxLjEzMjU0LDEuMTI0MDEsLjk2ODM5LC44NTI4NCwuNjg3ODcsLjcwNjQ1LC44NTU5MiwuOTA3NDcsMS4wMTQ2NiwxLjAwODgsLjkwMzIzLDEsMS4wNzQ2MywxLC45MTA1NiwuNzU4MDYsMS4xOTExOCwuOTY4MzksLjc4ODY0LC44Mjg0NSwuODQxMzMsLjc1ODU5LC44MzkwOCwuODM5MDgsLjgzOTA4LC44MzkwOCwuODM5MDgsLjgzOTA4LC43NzUzOSwuNzMyOTMsLjczMTMzLC43MzEzMywuNzMxMzMsLjczMTMzLC45NTk1OCwuOTU5NTgsLjk1OTU4LC45NTk1OCwuODg1MDYsLjkxMjEsLjg2OTQzLC44Njk0MywuODY5NDMsLjg2OTQzLC44Njk0MywuODUyODQsLjg3NTA4LC45MDM5OSwuOTAzOTksLjkwMzk5LC45MDM5OSwuNzc4OTIsLjc5Nzk1LC45MDgwNywuODg3NjIsLjg4NzYyLC44ODc2MiwuODg3NjIsLjg4NzYyLC44ODc2MiwuODcxNSwuNzUyNDEsLjkwNTE4LC45MDUxOCwuOTA1MTgsLjkwNTE4LC44ODQwMSwuODg0MDEsLjg4NDAxLC44ODQwMSwuODc4NSwuODc4NSwuODgwMSwuODgwMSwuODgwMSwuODgwMSwuODgwMSwuOTA3NDcsLjg5MDQ5LC44Nzg1LC44Nzg1LC44Nzg1LC44Nzg1LC44NTE2MiwuODc4NSwuODUxNjIsLjgzOTA4LC44ODc2MiwuODM5MDgsLjg4NzYyLC44MzkwOCwuODg3NjIsLjczMjkzLC43NTI0MSwuNzMyOTMsLjc1MjQxLC43MzI5MywuNzUyNDEsLjczMjkzLC43NTI0MSwuODcyODksLjgzMDE2LC44ODUwNiwuOTMxMjUsLjczMTMzLC45MDUxOCwuNzMxMzMsLjkwNTE4LC43MzEzMywuOTA1MTgsLjczMTMzLC45MDUxOCwuNzMxMzMsLjkwNTE4LC44MTkyMSwuNzc2MTgsLjgxOTIxLC43NzYxOCwuODE5MjEsLjc3NjE4LDEsMSwuODczNTYsLjg3ODUsLjkxMDc1LC44OTYwOCwuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjk1OTU4LC44ODQwMSwuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjc2MjI5LC45MDE2NywuNTk1MjYsLjkxOTE2LDEsMSwuODYzMDQsLjY5MjI1LC44ODQwMSwxLDEsLjcwNDI0LC43OTQ2OCwuOTE5MjYsLjg4MTc1LC43MDgyMywuOTQ5MDMsLjkxMjEsLjg3ODUsMSwxLC45MTIxLC44Nzg1LC44NzgwMiwuODg2NTYsLjg3ODUsLjg2OTQzLC44ODAxLC44Njk0MywuODgwMSwuODY5NDMsLjg4MDEsLjg3NDAyLC44OTI5MSwuNzc5NTgsLjkxMzQzLDEsMSwuNzc5NTgsLjkxMzQzLC43MDg2NCwuNzE3MywuNzA4NjQsLjcxNzMsLjcwODY0LC43MTczLC43MDg2NCwuNzE3MywxLDEsLjgxMDU1LC43NTg0MSwuODEwNTUsMS4wNjQ1MiwuOTAzOTksLjg3ODUsLjkwMzk5LC44Nzg1LC45MDM5OSwuODc4NSwuOTAzOTksLjg3ODUsLjkwMzk5LC44Nzg1LC45MDM5OSwuODc4NSwuOTYwMTcsLjk1Nzk0LC43Nzg5MiwuODUxNjIsLjc3ODkyLC43ODI1NywuNzk0OTIsLjc4MjU3LC43OTQ5MiwuNzgyNTcsLjc5NDkyLC45Mjk3LC41Njg5MiwuODM5MDgsLjg4NzYyLC43NzUzOSwuODcxNSwuODc1MDgsLjg5MDQ5LDEsMSwuODEwNTUsMS4wNDEwNiwxLjIwNTI4LDEuMjA1MjgsMSwxLjE1NTQzLC43MDY3NCwuOTgzODcsLjk0NzIxLDEuMzM0MzEsMS40NTg5NCwuOTUxNjEsMS4wNjMwMywuODM5MDgsLjgwMzUyLC41NzE4NCwuNjk2NSwuNTYyODksLjgyMDAxLC41NjAyOSwuODEyMzUsMS4wMjk4OCwuODM5MDgsLjc3NjIsLjY4MTU2LC44MDM2NywuNzMxMzMsLjc4MjU3LC44NzM1NiwuODY5NDMsLjk1OTU4LC43NTcyNywuODkwMTksMS4wNDkyNCwuOTEyMSwuNzY0OCwuODY5NDMsLjg3MzU2LC43OTc5NSwuNzgyNzUsLjgxMDU1LC43Nzg5MiwuOTc2MiwuODI1NzcsLjk5ODE5LC44NDg5NiwuOTU5NTgsLjc3ODkyLC45NjEwOCwxLjAxNDA3LC44OTA0OSwxLjAyOTg4LC45NDIxMSwuOTYxMDgsLjg5MzYsLjg0MDIxLC44Nzg0MiwuOTYzOTksLjc5MTA5LC44OTA0OSwxLjAwODEzLDEuMDI5ODgsLjg2MDc3LC44NzQ0NSwuOTIwOTksLjg0NzIzLC44NjUxMywuODgwMSwuNzU2MzgsLjg1NzE0LC43ODIxNiwuNzk1ODYsLjg3OTY1LC45NDIxMSwuOTc3NDcsLjc4Mjg3LC45NzkyNiwuODQ5NzEsMS4wMjk4OCwuOTQyMTEsLjg4MDEsLjk0MjExLC44NDk3MSwuNzMxMzMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjkwMjY0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45MDUxOCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA1NDgsMSwxLDEsMSwxLDEsLjk2MDE3LC45NTc5NCwuOTYwMTcsLjk1Nzk0LC45NjAxNywuOTU3OTQsLjc3ODkyLC44NTE2MiwxLDEsLjg5NTUyLC45MDUyNywxLC45MDM2MywuOTI3OTQsLjkyNzk0LC45Mjc5NCwuOTI3OTQsLjg3MDEyLC44NzAxMiwuODcwMTIsLjg5NTUyLC44OTU1MiwxLjQyMjU5LC43MTE0MywxLjA2MTUyLDEsMSwxLjAzMzcyLDEuMDMzNzIsLjk3MTcxLDEuNDk1NiwyLjI4MDcsLjkzODM1LC44MzQwNiwuOTExMzMsLjg0MTA3LC45MTEzMywxLDEsMSwuNzIwMjEsMSwxLjIzMTA4LC44MzQ4OSwuODg1MjUsLjg4NTI1LC44MTQ5OSwuOTA1MjcsMS44MTA1NSwuOTA1MjcsMS44MTA1NSwxLjMxMDA2LDEuNTM3MTEsLjk0NDM0LDEuMDg2OTYsMSwuOTUwMTgsLjc3MTkyLC44NTI4NCwuOTA3NDcsMS4xNzUzNCwuNjk4MjUsLjk3MTYsMS4zNzA3NywuOTA3NDcsLjkwNzQ3LC44NTM1NiwuOTA3NDcsLjkwNzQ3LDEuNDQ5NDcsLjg1Mjg0LC44OTQxLC44OTQxLC43MDU3MiwuOCwuNzA1NzIsLjcwNTcyLC43MDU3MiwuNzA1NzIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45OTg2MiwuOTk4NjIsMSwxLDEsMSwxLDEuMDgwMDQsLjkxMDI3LDEsMSwxLC45OTg2MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA3MjcsLjkwNzI3LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXTt0LkNhbGlicmlCb2xkTWV0cmljcz17bGluZUhlaWdodDoxLjIyMDcsbGluZUdhcDouMjIwN307dC5DYWxpYnJpQm9sZEl0YWxpY0ZhY3RvcnM9WzEuMzg3NywxLDEsMSwuOTc4MDEsLjkyNDgyLC44OTU1MiwuOTExMzMsLjgxOTg4LC45NzU2NiwuOTgxNTIsLjkzNTQ4LC45MzU0OCwxLjI3OTgsLjg1Mjg0LC45Mjc5NCwxLC45NjEzNCwxLjU2MjM5LC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuODI4NDUsLjgyODQ1LC44NTI4NCwuODUyODQsLjg1Mjg0LC43NTg1OSwuOTIxMzgsLjgzOTA4LC43NzYyLC43MTgwNSwuODcyODksLjczMTMzLC43NTE0LC44MTkyMSwuODczNTYsLjk1OTU4LC41OTUyNiwuNzU3MjcsLjY5MjI1LDEuMDQ5MjQsLjkwODcyLC44NTkzOCwuNzk3OTUsLjg3MDY4LC43Nzk1OCwuNjk3NjYsLjgxMDU1LC45MDM5OSwuODg2NTMsLjk2MDY4LC44MjU3NywuNzc4OTIsLjc4MjU3LC45NzUwNywxLjUyOSwuOTc1MDcsLjg1Mjg0LC44OTU1MiwuOTAxNzYsLjk0OTA4LC44NjQxMSwuNzQwMTIsLjg2NDExLC44ODMyMywuOTUwMTUsLjg2NDExLC44NjMzMSwuODg0MDEsLjkxOTE2LC44NjMwNCwuODg0MDEsLjkwMzksLjg2MzMxLC44NjMzMSwuODY0MTEsLjg2NDExLC45MDQ2NCwuNzA4NTIsMS4wNDEwNiwuODYzMzEsLjg0MzcyLC45NTc5NCwuODI2MTYsLjg0NTQ4LC43OTQ5MiwuODgzMzEsMS42OTgwOCwuODgzMzEsLjg1Mjg0LC45NzgwMSwuODk1NTIsLjkxMTMzLC44OTU1MiwuOTExMzMsMS43ODAxLC44OTU1MiwxLjI0NDg3LDEuMTMyNTQsMS4xOTEyOSwuOTY4MzksLjg1Mjg0LC42ODc4NywuNzA2NDUsLjg1NTkyLC45MDc0NywxLjAxNDY2LDEuMDA4OCwuOTAzMjMsMSwxLjA3NDYzLDEsLjkxMDU2LC43NTgwNiwxLjE5MTE4LC45NjgzOSwuNzg4NjQsLjgyODQ1LC44NDEzMywuNzU4NTksLjgzOTA4LC44MzkwOCwuODM5MDgsLjgzOTA4LC44MzkwOCwuODM5MDgsLjc3NTM5LC43MTgwNSwuNzMxMzMsLjczMTMzLC43MzEzMywuNzMxMzMsLjk1OTU4LC45NTk1OCwuOTU5NTgsLjk1OTU4LC44ODUwNiwuOTA4NzIsLjg1OTM4LC44NTkzOCwuODU5MzgsLjg1OTM4LC44NTkzOCwuODUyODQsLjg3MDY4LC45MDM5OSwuOTAzOTksLjkwMzk5LC45MDM5OSwuNzc4OTIsLjc5Nzk1LC45MDgwNywuOTQ5MDgsLjk0OTA4LC45NDkwOCwuOTQ5MDgsLjk0OTA4LC45NDkwOCwuODU4ODcsLjc0MDEyLC44ODMyMywuODgzMjMsLjg4MzIzLC44ODMyMywuODg0MDEsLjg4NDAxLC44ODQwMSwuODg0MDEsLjg3ODUsLjg2MzMxLC44NjMzMSwuODYzMzEsLjg2MzMxLC44NjMzMSwuODYzMzEsLjkwNzQ3LC44OTA0OSwuODYzMzEsLjg2MzMxLC44NjMzMSwuODYzMzEsLjg0NTQ4LC44NjQxMSwuODQ1NDgsLjgzOTA4LC45NDkwOCwuODM5MDgsLjk0OTA4LC44MzkwOCwuOTQ5MDgsLjcxODA1LC43NDAxMiwuNzE4MDUsLjc0MDEyLC43MTgwNSwuNzQwMTIsLjcxODA1LC43NDAxMiwuODcyODksLjc5NTM4LC44ODUwNiwuOTI3MjYsLjczMTMzLC44ODMyMywuNzMxMzMsLjg4MzIzLC43MzEzMywuODgzMjMsLjczMTMzLC44ODMyMywuNzMxMzMsLjg4MzIzLC44MTkyMSwuODY0MTEsLjgxOTIxLC44NjQxMSwuODE5MjEsLjg2NDExLDEsMSwuODczNTYsLjg2MzMxLC45MTA3NSwuODc3NywuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjk1OTU4LC44ODQwMSwuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjc2NDY3LC45MDE2NywuNTk1MjYsLjkxOTE2LDEsMSwuODYzMDQsLjY5MjI1LC44ODQwMSwxLDEsLjcwNDI0LC43NzMxMiwuOTE5MjYsLjg4MTc1LC43MDgyMywuOTQ5MDMsLjkwODcyLC44NjMzMSwxLDEsLjkwODcyLC44NjMzMSwuODY5MDYsLjg4MTE2LC44NjMzMSwuODU5MzgsLjg2MzMxLC44NTkzOCwuODYzMzEsLjg1OTM4LC44NjMzMSwuODc0MDIsLjg2NTQ5LC43Nzk1OCwuOTA0NjQsMSwxLC43Nzk1OCwuOTA0NjQsLjY5NzY2LC43MDg1MiwuNjk3NjYsLjcwODUyLC42OTc2NiwuNzA4NTIsLjY5NzY2LC43MDg1MiwxLDEsLjgxMDU1LC43NTg0MSwuODEwNTUsMS4wNjQ1MiwuOTAzOTksLjg2MzMxLC45MDM5OSwuODYzMzEsLjkwMzk5LC44NjMzMSwuOTAzOTksLjg2MzMxLC45MDM5OSwuODYzMzEsLjkwMzk5LC44NjMzMSwuOTYwNjgsLjk1Nzk0LC43Nzg5MiwuODQ1NDgsLjc3ODkyLC43ODI1NywuNzk0OTIsLjc4MjU3LC43OTQ5MiwuNzgyNTcsLjc5NDkyLC45Mjk3LC41Njg5MiwuODM5MDgsLjk0OTA4LC43NzUzOSwuODU4ODcsLjg3MDY4LC44OTA0OSwxLDEsLjgxMDU1LDEuMDQxMDYsMS4yMDUyOCwxLjIwNTI4LDEsMS4xNTU0MywuNzAwODgsLjk4Mzg3LC45NDcyMSwxLjMzNDMxLDEuNDU4OTQsLjk1MTYxLDEuNDgzODcsLjgzOTA4LC44MDM1MiwuNTcxMTgsLjY5NjUsLjU2MzQ3LC43OTE3OSwuNTU4NTMsLjgwMzQ2LDEuMDI5ODgsLjgzOTA4LC43NzYyLC42NzE3NCwuODYwMzYsLjczMTMzLC43ODI1NywuODczNTYsLjg2NDQxLC45NTk1OCwuNzU3MjcsLjg5MDE5LDEuMDQ5MjQsLjkwODcyLC43NDg4OSwuODU5MzgsLjg3ODkxLC43OTc5NSwuNzk1NywuODEwNTUsLjc3ODkyLC45NzQ0NywuODI1NzcsLjk3NDY2LC44NzE3OSwuOTU5NTgsLjc3ODkyLC45NDI1MiwuOTU2MTIsLjg3NTMsMS4wMjk4OCwuOTI3MzMsLjk0MjUyLC44NzQxMSwuODQwMjEsLjg3MjgsLjk1NjEyLC43NDA4MSwuODc1MywxLjAyMTg5LDEuMDI5ODgsLjg0ODE0LC44NzQ0NSwuOTE4MjIsLjg0NzIzLC44NTY2OCwuODYzMzEsLjgxMzQ0LC44NzU4MSwuNzY0MjIsLjgyMDQ2LC45NjA1NywuOTI3MzMsLjk5Mzc1LC43ODAyMiwuOTU0NTIsLjg2MDE1LDEuMDI5ODgsLjkyNzMzLC44NjMzMSwuOTI3MzMsLjg2MDE1LC43MzEzMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA2MzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjg4MzIzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44NTE3NCwxLDEsMSwxLDEsMSwuOTYwNjgsLjk1Nzk0LC45NjA2OCwuOTU3OTQsLjk2MDY4LC45NTc5NCwuNzc4OTIsLjg0NTQ4LDEsMSwuODk1NTIsLjkwNTI3LDEsLjkwMzYzLC45Mjc5NCwuOTI3OTQsLjkyNzk0LC44OTgwNywuODcwMTIsLjg3MDEyLC44NzAxMiwuODk1NTIsLjg5NTUyLDEuNDIyNTksLjcxMDk0LDEuMDYxNTIsMSwxLDEuMDMzNzIsMS4wMzM3MiwuOTcxNzEsMS40OTU2LDIuMjgwNywuOTI5NzIsLjgzNDA2LC45MTEzMywuODMzMjYsLjkxMTMzLDEsMSwxLC43MjAyMSwxLDEuMjMxMDgsLjgzNDg5LC44ODUyNSwuODg1MjUsLjgxNDk5LC45MDYxNiwxLjgxMDU1LC45MDUyNywxLjgxMDU1LDEuMzEwNywxLjUzNzExLC45NDQzNCwxLjA4Njk2LDEsLjk1MDE4LC43NzE5MiwuODUyODQsLjkwNzQ3LDEuMTc1MzQsLjY5ODI1LC45NzE2LDEuMzcwNzcsLjkwNzQ3LC45MDc0NywuODUzNTYsLjkwNzQ3LC45MDc0NywxLjQ0OTQ3LC44NTI4NCwuODk0MSwuODk0MSwuNzA1NzIsLjgsLjcwNTcyLC43MDU3MiwuNzA1NzIsLjcwNTcyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTk4NjIsLjk5ODYyLDEsMSwxLDEsMSwxLjA4MDA0LC45MTAyNywxLDEsMSwuOTk4NjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjkwNzI3LC45MDcyNywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV07dC5DYWxpYnJpQm9sZEl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yMjA3LGxpbmVHYXA6LjIyMDd9O3QuQ2FsaWJyaUl0YWxpY0ZhY3RvcnM9WzEuMzg3NywxLDEsMSwxLjE3MjIzLDEuMTI5MywuODk1NTIsLjkxMTMzLC44MDM5NSwxLjAyMjY5LDEuMTU2MDEsLjkxMDU2LC45MTA1NiwxLjI3OTgsLjg1Mjg0LC44OTgwNywxLC45MDg2MSwxLjM5NTQzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTYzMDksLjk2MzA5LC44NTI4NCwuODUyODQsLjg1Mjg0LC44MzMxOSwuODgwNzEsLjg2NzUsLjgxNTUyLC43MjM0NiwuODUxOTMsLjczMjA2LC43NTIyLC44MTEwNSwuODYyNzUsLjkwNjg1LC42Mzc3LC43Nzg5MiwuNzU1OTMsMS4wMjYzOCwuODkyNDksLjg0MTE4LC43NzQ1MiwuODUzNzQsLjc1MTg2LC42Nzc4OSwuNzk3NzYsLjg4ODQ0LC44NTA2NiwuOTQzMDksLjc3ODE4LC43MzA2LC43NjY1OSwxLjEwMzY5LDEuMzgzMTMsMS4xMDM2OSwxLjA2MTM5LC44OTU1MiwuODczOSwuOTI0NSwuOTI0NSwuODMyMDMsLjkyNDUsLjg1ODY1LDEuMDk4NDIsLjkyNDUsLjkyNDUsMS4wMzI5NywxLjA3NjkyLC45MDkxOCwxLjAzMjk3LC45NDk1OSwuOTI0NSwuOTIyNzQsLjkyNDUsLjkyNDUsMS4wMjkzMywuNzc4MzIsMS4yMDU2MiwuOTI0NSwuODkxNiwuOTg5ODYsLjg2NjIxLC44OTQ1MywuNzkwMDQsLjk0MTUyLDEuNzcyNTYsLjk0MTUyLC44NTI4NCwuOTc4MDEsLjg5NTUyLC45MTEzMywuODk1NTIsLjkxMTMzLDEuOTE3MjksLjg5NTUyLDEuMTc4ODksMS4xMzI1NCwxLjE2MzU5LC45MjA5OCwuODUyODQsLjY4Nzg3LC43MTM1MywuODQ3MzcsLjkwNzQ3LDEuMDA4OCwxLjAwNDQsLjg3NjgzLDEsMS4wOTA5MSwxLC45MjIyOSwuNzM5LDEuMTU2NDIsLjkyMDk4LC43NjI4OCwuODA1MDQsLjgwOTcyLC43NTg1OSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuNzYzMTgsLjcyMzQ2LC43MzIwNiwuNzMyMDYsLjczMjA2LC43MzIwNiwuOTA2ODUsLjkwNjg1LC45MDY4NSwuOTA2ODUsLjg2NDc3LC44OTI0OSwuODQxMTgsLjg0MTE4LC44NDExOCwuODQxMTgsLjg0MTE4LC44NTI4NCwuODQ1NTcsLjg4ODQ0LC44ODg0NCwuODg4NDQsLjg4ODQ0LC43MzA2LC43NzQ1MiwuODYzMzEsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjg0ODQzLC44MzIwMywuODU4NjUsLjg1ODY1LC44NTg2NSwuODU4NjUsLjgyNjAxLC44MjYwMSwuODI2MDEsLjgyNjAxLC45NDQ2OSwuOTI0NSwuOTIyNzQsLjkyMjc0LC45MjI3NCwuOTIyNzQsLjkyMjc0LC45MDc0NywuODY2NTEsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjg5NDUzLC45MjQ1LC44OTQ1MywuODY3NSwuOTI0NSwuODY3NSwuOTI0NSwuODY3NSwuOTI0NSwuNzIzNDYsLjgzMjAzLC43MjM0NiwuODMyMDMsLjcyMzQ2LC44MzIwMywuNzIzNDYsLjgzMjAzLC44NTE5MywuODg3NSwuODY0NzcsLjk5MDM0LC43MzIwNiwuODU4NjUsLjczMjA2LC44NTg2NSwuNzMyMDYsLjg1ODY1LC43MzIwNiwuODU4NjUsLjczMjA2LC44NTg2NSwuODExMDUsLjkyNDUsLjgxMTA1LC45MjQ1LC44MTEwNSwuOTI0NSwxLDEsLjg2Mjc1LC45MjQ1LC45MDg3MiwuOTM1OTEsLjkwNjg1LC44MjYwMSwuOTA2ODUsLjgyNjAxLC45MDY4NSwuODI2MDEsLjkwNjg1LDEuMDMyOTcsLjkwNjg1LC44MjYwMSwuNzc4OTYsMS4wNTYxMSwuNjM3NywxLjA3NjkyLDEsMSwuOTA5MTgsLjc1NTkzLDEuMDMyOTcsMSwxLC43NjAzMiwuOTM3NSwuOTgxNTYsLjkzNDA3LC43NzI2MSwxLjExNDI5LC44OTI0OSwuOTI0NSwxLDEsLjg5MjQ5LC45MjQ1LC45MjUzNCwuODY2OTgsLjkyNDUsLjg0MTE4LC45MjI3NCwuODQxMTgsLjkyMjc0LC44NDExOCwuOTIyNzQsLjg2NjcsLjg2MjkxLC43NTE4NiwxLjAyOTMzLDEsMSwuNzUxODYsMS4wMjkzMywuNjc3ODksLjc3ODMyLC42Nzc4OSwuNzc4MzIsLjY3Nzg5LC43NzgzMiwuNjc3ODksLjc3ODMyLDEsMSwuNzk3NzYsLjk3NjU1LC43OTc3NiwxLjIzMDIzLC44ODg0NCwuOTI0NSwuODg4NDQsLjkyNDUsLjg4ODQ0LC45MjQ1LC44ODg0NCwuOTI0NSwuODg4NDQsLjkyNDUsLjg4ODQ0LC45MjQ1LC45NDMwOSwuOTg5ODYsLjczMDYsLjg5NDUzLC43MzA2LC43NjY1OSwuNzkwMDQsLjc2NjU5LC43OTAwNCwuNzY2NTksLjc5MDA0LDEuMDkyMzEsLjU0ODczLC44Njc1LC45MjQ1LC43NjMxOCwuODQ4NDMsLjg0NTU3LC44NjY1MSwxLDEsLjc5Nzc2LDEuMjA1NjIsMS4xODYyMiwxLjE4NjIyLDEsMS4xNDM3LC42NzAwOSwuOTYzMzQsLjkzNjk1LDEuMzUxOTEsMS40MDkwOSwuOTUxNjEsMS40ODM4NywuODY3NSwuOTA4NjEsLjYxOTIsLjczNjMsLjY0ODI0LC44MjQxMSwuNTYzMjEsLjg1Njk2LDEuMjM1MTYsLjg2NzUsLjgxNTUyLC43Mjg2LC44NDEzNCwuNzMyMDYsLjc2NjU5LC44NjI3NSwuODQzNjksLjkwNjg1LC43Nzg5MiwuODU4NzEsMS4wMjYzOCwuODkyNDksLjc1ODI4LC44NDExOCwuODU5ODQsLjc3NDUyLC43NjQ2NiwuNzk3NzYsLjczMDYsLjkwNzgyLC43NzgxOCwuOTAzLC44NzI5MSwuOTA2ODUsLjczMDYsLjk5MDU4LDEuMDM2NjcsLjk0NjM1LDEuMjM1MTYsLjk4NDksLjk5MDU4LC45MjM5MywuODkxNiwuOTQyLDEuMDM2NjcsLjc1MDI2LC45NDYzNSwxLjAyOTcsMS4yMzUxNiwuOTA5MTgsLjk0MDQ4LC45ODIxNywuODk3NDYsLjg0MTUzLC45MjI3NCwuODI1MDcsLjg4ODMyLC44NDQzOCwuODgxNzgsMS4wMzUyNSwuOTg0OSwxLjAwMjI1LC43ODA4NiwuOTcyNDgsLjg5NDA0LDEuMjM1MTYsLjk4NDksLjkyMjc0LC45ODQ5LC44OTQwNCwuNzMyMDYsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjg5NjkzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44NTg2NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA5MzMsMSwxLDEsMSwxLDEsLjk0MzA5LC45ODk4NiwuOTQzMDksLjk4OTg2LC45NDMwOSwuOTg5ODYsLjczMDYsLjg5NDUzLDEsMSwuODk1NTIsLjkwNTI3LDEsLjkwMTg2LDEuMTIzMDgsMS4xMjMwOCwxLjEyMzA4LDEuMTIzMDgsMS4yNTY2LDEuMjU2NiwxLjI1NjYsLjg5NTUyLC44OTU1MiwxLjQyMjU5LC42ODk5NCwxLjAzODA5LDEsMSwxLjAxNzYsMS4wMTc2LDEuMTE1MjMsMS40OTU2LDIuMDE0NjIsLjk3ODU4LC44MjYxNiwuOTExMzMsLjgzNDM3LC45MTEzMywxLDEsMSwuNzA1MDgsMSwxLjIzMTA4LC43OTgwMSwuODQ0MjYsLjg0NDI2LC43NzQsLjkwNTcyLDEuODEwNTUsLjkwNzQ5LDEuODEwNTUsMS4yODgwOSwxLjU1NDY5LC45NDQzNCwxLjA3ODA2LDEsLjk3MDk0LC43NTg5LC44NTI4NCwuOTA3NDcsMS4xOTY1OCwuNjk4MjUsLjk3NjIyLDEuMzM1MTIsLjkwNzQ3LC45MDc0NywuODUyODQsLjkwNzQ3LC45MDc0NywxLjQ0OTQ3LC44NTI4NCwuODk0MSwuODk0MSwuNzA1NzIsLjgsLjcwNTcyLC43MDU3MiwuNzA1NzIsLjcwNTcyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTk4NjIsLjk5ODYyLDEsMSwxLDEsMSwxLjAzMzYsLjkxMDI3LDEsMSwxLC45OTg2MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA1ODU5LDEuMDU4NTksMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdO3QuQ2FsaWJyaUl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yMjA3LGxpbmVHYXA6LjIyMDd9O3QuQ2FsaWJyaVJlZ3VsYXJGYWN0b3JzPVsxLjM4NzcsMSwxLDEsMS4xNzIyMywxLjEyOTMsLjg5NTUyLC45MTEzMywuODAzOTUsMS4wMjI2OSwxLjE1NjAxLC45MTA1NiwuOTEwNTYsMS4yNzk4LC44NTI4NCwuODk4MDcsMSwuOTA4NjEsMS4zOTAxNiwuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjk2MzA5LC45NjMwOSwuODUyODQsLjg1Mjg0LC44NTI4NCwuODMzMTksLjg4MDcxLC44Njc1LC44MTU1MiwuNzM4MzQsLjg1MTkzLC43MzIwNiwuNzUyMiwuODExMDUsLjg2Mjc1LC45MDY4NSwuNjM3NywuNzc4OTIsLjc1NTkzLDEuMDI2MzgsLjg5Mzg1LC44NTEyMiwuNzc0NTIsLjg2NTAzLC43NTE4NiwuNjg4ODcsLjc5Nzc2LC44ODg0NCwuODUwNjYsLjk0MjU4LC43NzgxOCwuNzMwNiwuNzY2NTksMS4xMDM2OSwxLjM5MDE2LDEuMTAzNjksMS4wNjEzOSwuODk1NTIsLjg3MzksLjg2MTI4LC45NDQ2OSwuODQ1NywuOTQ0NjksLjg5NDY0LDEuMDk4NDIsLjg0NjM2LC45NDQ2OSwxLjAzMjk3LDEuMDc2OTIsLjkwOTE4LDEuMDMyOTcsLjk1ODk3LC45NDQ2OSwuOTQ4MiwuOTQ0NjksLjk0NDY5LDEuMDQ2OTIsLjc4MjIzLDEuMjA1NjIsLjk0NDY5LC45MDMzMiwuOTg5ODYsLjg2NjIxLC45MDUyNywuNzkwMDQsLjk0MTUyLDEuNzcyNTYsLjk0MTUyLC44NTI4NCwuOTc4MDEsLjg5NTUyLC45MTEzMywuODk1NTIsLjkxMTMzLDEuOTE3MjksLjg5NTUyLDEuMTc4ODksMS4xMzI1NCwxLjA4NzA3LC45MjA5OCwuODUyODQsLjY4Nzg3LC43MTM1MywuODQ3MzcsLjkwNzQ3LDEuMDA4OCwxLjAwNDQsLjg3NjgzLDEsMS4wOTA5MSwxLC45MjIyOSwuNzM5LDEuMTU2NDIsLjkyMDk4LC43NjI4OCwuODA1MDQsLjgwOTcyLC43NTg1OSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuNzYzMTgsLjczODM0LC43MzIwNiwuNzMyMDYsLjczMjA2LC43MzIwNiwuOTA2ODUsLjkwNjg1LC45MDY4NSwuOTA2ODUsLjg2NDc3LC44OTM4NSwuODUxMjIsLjg1MTIyLC44NTEyMiwuODUxMjIsLjg1MTIyLC44NTI4NCwuODUzMTEsLjg4ODQ0LC44ODg0NCwuODg4NDQsLjg4ODQ0LC43MzA2LC43NzQ1MiwuODYzMzEsLjg2MTI4LC44NjEyOCwuODYxMjgsLjg2MTI4LC44NjEyOCwuODYxMjgsLjg2OTMsLjg0NTcsLjg5NDY0LC44OTQ2NCwuODk0NjQsLjg5NDY0LC44MjYwMSwuODI2MDEsLjgyNjAxLC44MjYwMSwuOTQ0NjksLjk0NDY5LC45NDgyLC45NDgyLC45NDgyLC45NDgyLC45NDgyLC45MDc0NywuODY2NTEsLjk0NDY5LC45NDQ2OSwuOTQ0NjksLjk0NDY5LC45MDUyNywuOTQ0NjksLjkwNTI3LC44Njc1LC44NjEyOCwuODY3NSwuODYxMjgsLjg2NzUsLjg2MTI4LC43MzgzNCwuODQ1NywuNzM4MzQsLjg0NTcsLjczODM0LC44NDU3LC43MzgzNCwuODQ1NywuODUxOTMsLjkyNDU0LC44NjQ3NywuOTkyMSwuNzMyMDYsLjg5NDY0LC43MzIwNiwuODk0NjQsLjczMjA2LC44OTQ2NCwuNzMyMDYsLjg5NDY0LC43MzIwNiwuODk0NjQsLjgxMTA1LC44NDYzNiwuODExMDUsLjg0NjM2LC44MTEwNSwuODQ2MzYsMSwxLC44NjI3NSwuOTQ0NjksLjkwODcyLC45NTc4NiwuOTA2ODUsLjgyNjAxLC45MDY4NSwuODI2MDEsLjkwNjg1LC44MjYwMSwuOTA2ODUsMS4wMzI5NywuOTA2ODUsLjgyNjAxLC43Nzc0MSwxLjA1NjExLC42Mzc3LDEuMDc2OTIsMSwxLC45MDkxOCwuNzU1OTMsMS4wMzI5NywxLDEsLjc2MDMyLC45MDQ1MiwuOTgxNTYsMS4xMTg0MiwuNzcyNjEsMS4xMTQyOSwuODkzODUsLjk0NDY5LDEsMSwuODkzODUsLjk0NDY5LC45NTg3NywuODY5MDEsLjk0NDY5LC44NTEyMiwuOTQ4MiwuODUxMjIsLjk0ODIsLjg1MTIyLC45NDgyLC44NjY3LC45MDAxNiwuNzUxODYsMS4wNDY5MiwxLDEsLjc1MTg2LDEuMDQ2OTIsLjY4ODg3LC43ODIyMywuNjg4ODcsLjc4MjIzLC42ODg4NywuNzgyMjMsLjY4ODg3LC43ODIyMywxLDEsLjc5Nzc2LC45MjE4OCwuNzk3NzYsMS4yMzAyMywuODg4NDQsLjk0NDY5LC44ODg0NCwuOTQ0NjksLjg4ODQ0LC45NDQ2OSwuODg4NDQsLjk0NDY5LC44ODg0NCwuOTQ0NjksLjg4ODQ0LC45NDQ2OSwuOTQyNTgsLjk4OTg2LC43MzA2LC45MDUyNywuNzMwNiwuNzY2NTksLjc5MDA0LC43NjY1OSwuNzkwMDQsLjc2NjU5LC43OTAwNCwxLjA5MjMxLC41NDg3MywuODY3NSwuODYxMjgsLjc2MzE4LC44NjkzLC44NTMxMSwuODY2NTEsMSwxLC43OTc3NiwxLjIwNTYyLDEuMTg2MjIsMS4xODYyMiwxLDEuMTQzNywuNjc3NDIsLjk2MzM0LC45MzY5NSwxLjM1MTkxLDEuNDA5MDksLjk1MTYxLDEuNDgzODcsLjg2Njg2LC45MDg2MSwuNjIyNjcsLjc0MzU5LC42NTY0OSwuODU0OTgsLjU2OTYzLC44ODI1NCwxLjIzNTE2LC44Njc1LC44MTU1MiwuNzU0NDMsLjg0NTAzLC43MzIwNiwuNzY2NTksLjg2Mjc1LC44NTEyMiwuOTA2ODUsLjc3ODkyLC44NTc0NiwxLjAyNjM4LC44OTM4NSwuNzU2NTcsLjg1MTIyLC44NjI3NSwuNzc0NTIsLjc0MTcxLC43OTc3NiwuNzMwNiwuOTUxNjUsLjc3ODE4LC44OTc3MiwuODg4MzEsLjkwNjg1LC43MzA2LC45ODE0MiwxLjAyMTkxLC45NjU3NiwxLjIzNTE2LC45OTAxOCwuOTgxNDIsLjkyMzYsLjg5MjU4LC45NDAzNSwxLjAyMTkxLC43ODg0OCwuOTY1NzYsLjk1NjEsMS4yMzUxNiwuOTA5MTgsLjkyNTc4LC45NTQyNCwuODk3NDYsLjgzOTY5LC45NDgyLC44MDExMywuODk0NDIsLjg1MjA4LC44NjE1NSwuOTgwMjIsLjk5MDE4LDEuMDA0NTIsLjgxMjA5LC45OTI0NywuODkxODEsMS4yMzUxNiwuOTkwMTgsLjk0ODIsLjk5MDE4LC44OTE4MSwuNzMyMDYsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjg4ODQ0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44OTQ2NCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTY3NjYsMSwxLDEsMSwxLDEsLjk0MjU4LC45ODk4NiwuOTQyNTgsLjk4OTg2LC45NDI1OCwuOTg5ODYsLjczMDYsLjkwNTI3LDEsMSwuODk1NTIsLjkwNTI3LDEsLjkwMTg2LDEuMTIzMDgsMS4xMjMwOCwxLjEyMzA4LDEuMTIzMDgsMS4yNTY2LDEuMjU2NiwxLjI1NjYsLjg5NTUyLC44OTU1MiwxLjQyMjU5LC42OTA0MywxLjAzODA5LDEsMSwxLjAxNzYsMS4wMTc2LDEuMTE1MjMsMS40OTU2LDIuMDE0NjIsLjk5MzMxLC44MjYxNiwuOTExMzMsLjg0Mjg2LC45MTEzMywxLDEsMSwuNzA1MDgsMSwxLjIzMTA4LC43OTgwMSwuODQ0MjYsLjg0NDI2LC43NzQsLjkwNTI3LDEuODEwNTUsLjkwNTI3LDEuODEwNTUsMS4yODgwOSwxLjU1NDY5LC45NDQzNCwxLjA3ODA2LDEsLjk3MDk0LC43NTg5LC44NTI4NCwuOTA3NDcsMS4xOTY1OCwuNjk4MjUsLjk3NjIyLDEuMzM1MTIsLjkwNzQ3LC45MDc0NywuODUzNTYsLjkwNzQ3LC45MDc0NywxLjQ0OTQ3LC44NTI4NCwuODk0MSwuODk0MSwuNzA1NzIsLjgsLjcwNTcyLC43MDU3MiwuNzA1NzIsLjcwNTcyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTk4NjIsLjk5ODYyLDEsMSwxLDEsMSwxLjAzMzYsLjkxMDI3LDEsMSwxLC45OTg2MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA1ODU5LDEuMDU4NTksMSwxLDEsMS4wNzE4NSwuOTk0MTMsLjk2MzM0LDEuMDgwNjUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXTt0LkNhbGlicmlSZWd1bGFyTWV0cmljcz17bGluZUhlaWdodDoxLjIyMDcsbGluZUdhcDouMjIwN319LChlLHQpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkhlbHZldGljYVJlZ3VsYXJNZXRyaWNzPXQuSGVsdmV0aWNhUmVndWxhckZhY3RvcnM9dC5IZWx2ZXRpY2FJdGFsaWNNZXRyaWNzPXQuSGVsdmV0aWNhSXRhbGljRmFjdG9ycz10LkhlbHZldGljYUJvbGRNZXRyaWNzPXQuSGVsdmV0aWNhQm9sZEl0YWxpY01ldHJpY3M9dC5IZWx2ZXRpY2FCb2xkSXRhbGljRmFjdG9ycz10LkhlbHZldGljYUJvbGRGYWN0b3JzPXZvaWQgMDt0LkhlbHZldGljYUJvbGRGYWN0b3JzPVsuNzYxMTYsMSwxLDEuMDAwNiwuOTk5OTgsLjk5OTc0LC45OTk3MywuOTk5NzMsLjk5OTgyLC45OTk3NywxLjAwMDg3LC45OTk5OCwuOTk5OTgsLjk5OTU5LDEuMDAwMDMsMS4wMDA2LC45OTk5OCwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5OTgsMSwxLjAwMDAzLDEuMDAwMDMsMS4wMDAwMywxLjAwMDI2LC45OTk5LC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMjYsMS4wMDAyMiwuOTk5NzcsMS4wMDA2LC45OTk3MywuOTk5NzcsMS4wMDAyNiwuOTk5OTksLjk5OTc3LDEuMDAwMjIsMS4wMDAwMSwxLjAwMDIyLC45OTk3NywxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMDEsMS4wMDAxNiwxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwuOTk5OTgsMS4wMDA2LC45OTk5OCwxLjAwMDAzLC45OTk3MywuOTk5OTgsLjk5OTczLDEuMDAwMjYsLjk5OTczLDEuMDAwMjYsLjk5OTczLC45OTk5OCwxLjAwMDI2LDEuMDAwMjYsMS4wMDA2LDEuMDAwNiwuOTk5NzMsMS4wMDA2LC45OTk4MiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LC45OTk1OSwuOTk5NzMsLjk5OTk4LDEuMDAwMjYsLjk5OTczLDEuMDAwMjIsLjk5OTczLC45OTk3MywxLC45OTk1OSwxLjAwMDc3LC45OTk1OSwxLjAwMDAzLC45OTk5OCwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA3NywuOTk5NzMsLjk5OTk4LDEuMDAwMjUsLjk5OTY4LC45OTk3MywxLjAwMDAzLDEuMDAwMjUsLjYwMjk5LDEuMDAwMjQsMS4wNjQwOSwxLDEsLjk5OTk4LDEsLjk5OTczLDEuMDAwNiwuOTk5OTgsMSwuOTk5MzYsLjk5OTczLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMjYsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywuOTk5NzcsMSwuOTk5NzcsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTc3LC45OTk3NywxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAwMywxLjAwMDIyLC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5ODIsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjA2NDA5LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwuOTk5NzMsMS4wMDAyNiwuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsMS4wMzM3NCwuOTk5NzcsMS4wMDAyNiwxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNDIsLjk5OTczLC45OTk3MywxLjAwMDYsLjk5OTc3LC45OTk3MywuOTk5NzMsMS4wMDAyNiwxLjAwMDYsMS4wMDAyNiwxLjAwMDYsMS4wMDAyNiwxLjAzODI4LDEuMDAwMjYsLjk5OTk5LDEuMDAwMjYsMS4wMDA2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTkzLC45OTk4LDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMSwxLjAwMDE2LC45OTk3NywuOTk5NTksLjk5OTc3LC45OTk1OSwuOTk5NzcsLjk5OTU5LDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMjYsLjk5OTk4LDEuMDAwMjYsLjgxMjEsMS4wMDAyNiwuOTk5OTgsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsMS4wMDAxNiwxLjAwMDIyLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwxLjAwMDI2LDEsMS4wMDA2LC45OTk3MywuOTk5NzcsLjk5OTczLDEsLjk5OTgyLDEuMDAwMjIsMS4wMDAyNiwxLjAwMDAxLC45OTk3MywxLjAwMDI2LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsMS4wMDAzNCwuOTk5NzcsMSwuOTk5OTcsMS4wMDAyNiwxLjAwMDc4LDEuMDAwMzYsLjk5OTczLDEuMDAwMTMsMS4wMDA2LC45OTk3NywuOTk5NzcsLjk5OTg4LC44NTE0OCwxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMjIsMS4wMDA2LC45OTk3NywxLjAwMDAxLC45OTk5OSwuOTk5NzcsMS4wMDA2OSwxLjAwMDIyLC45OTk3NywxLjAwMDAxLC45OTk4NCwxLjAwMDI2LDEuMDAwMDEsMS4wMDAyNCwxLjAwMDAxLC45OTk5LDEsMS4wMDA2LDEuMDAwMDEsMS4wMDA0MSwuOTk5NjIsMS4wMDAyNiwxLjAwMDYsLjk5OTk1LDEuMDAwNDEsLjk5OTQyLC45OTk3MywuOTk5MjcsMS4wMDA4MiwuOTk5MDIsMS4wMDAyNiwxLjAwMDg3LDEuMDAwNiwxLjAwMDY5LC45OTk3MywuOTk4NjcsLjk5OTczLC45OTkzLDEuMDAwMjYsMS4wMDA0OSwxLjAwMDU2LDEsLjk5OTg4LC45OTkzNSwuOTk5OTUsLjk5OTU0LDEuMDAwNTUsLjk5OTQ1LDEuMDAwMzIsMS4wMDA2LC45OTk5NSwxLjAwMDI2LC45OTk5NSwxLjAwMDMyLDEuMDAwMDEsMS4wMDAwOCwuOTk5NzEsMS4wMDAxOSwuOTk5NCwxLjAwMDAxLDEuMDAwNiwxLjAwMDQ0LC45OTk3MywxLjAwMDIzLDEuMDAwNDcsMSwuOTk5NDIsLjk5NTYxLC45OTk4OSwxLjAwMDM1LC45OTk3NywxLjAwMDM1LC45OTk3NywxLjAwMDE5LC45OTk0NCwxLjAwMDAxLDEuMDAwMjEsLjk5OTI2LDEuMDAwMzUsMS4wMDAzNSwuOTk5NDIsMS4wMDA0OCwuOTk5OTksLjk5OTc3LDEuMDAwMjIsMS4wMDAzNSwxLjAwMDAxLC45OTk3NywxLjAwMDI2LC45OTk4OSwxLjAwMDU3LDEuMDAwMDEsLjk5OTM2LDEuMDAwNTIsMS4wMDAxMiwuOTk5OTYsMS4wMDA0MywxLDEuMDAwMzUsLjk5OTQsLjk5OTc2LDEuMDAwMzUsLjk5OTczLDEuMDAwNTIsMS4wMDA0MSwxLjAwMTE5LDEuMDAwMzcsLjk5OTczLDEuMDAwMDIsLjk5OTg2LDEuMDAwNDEsMS4wMDA0MSwuOTk5MDIsLjk5OTYsMS4wMDAzNCwuOTk5OTksMS4wMDAyNiwuOTk5OTksMS4wMDAyNiwuOTk5NzMsMS4wMDA1MiwuOTk5NzMsMSwuOTk5NzMsMS4wMDA0MSwxLjAwMDc1LC45OTk0LDEuMDAwMywuOTk5OTksMSwxLjAwMDQxLC45OTk1NSwxLC45OTkxNSwuOTk5NzMsLjk5OTczLDEuMDAwMjYsMS4wMDExOSwuOTk5NTUsLjk5OTczLDEuMDAwNiwuOTk5MTEsMS4wMDA2LDEuMDAwMjYsLjk5OTcyLDEuMDAwMjYsLjk5OTAyLDEuMDAwNDEsLjk5OTczLC45OTk5OSwxLDEsMS4wMDAzOCwxLjAwMDUsMS4wMDAxNiwxLjAwMDIyLDEuMDAwMTYsMS4wMDAyMiwxLjAwMDE2LDEuMDAwMjIsMS4wMDAwMSwuOTk5NzMsMSwxLC45OTk3MywxLDEsLjk5OTU1LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLDEsMSwuOTk5NzMsLjk5OTczLC45OTk3MiwxLDEsMS4wMDEwNiwuOTk5OTksLjk5OTk4LC45OTk5OCwuOTk5OTksLjk5OTk4LDEuNjY0NzUsMSwuOTk5NzMsLjk5OTczLDEuMDAwMjMsLjk5OTczLC45OTk3MSwxLjAwMDQ3LDEuMDAwMjMsMSwuOTk5OTEsLjk5OTg0LDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMSwxLDEsMSwxLDEsMSwuOTk5NzIsMSwxLjIwOTg1LDEuMzk3MTMsMS4wMDAwMywxLjAwMDMxLDEuMDAwMTUsMSwuOTk1NjEsMS4wMDAyNywxLjAwMDMxLDEuMDAwMzEsLjk5OTE1LDEuMDAwMzEsMS4wMDAzMSwuOTk5OTksMS4wMDAwMywuOTk5OTksLjk5OTk5LDEuNDExNDQsMS42LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MDU3OSwxLjQwNTc5LDEuMzY2MjUsLjk5OTk5LDEsLjk5ODYxLC45OTg2MSwxLDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsLjk5OTcyLC45OTk5OSwuOTk5OTksLjk5OTk5LC45OTk5OSwxLjQwNDgzLDEsLjk5OTc3LDEuMDAwNTQsMSwxLC45OTk1MywuOTk5NjIsMS4wMDA0MiwuOTk5NSwxLDEsMSwxLDEsMSwxLDEsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LDEsMSwxLDEsMSwxLDEsMSwxLDEsMV07dC5IZWx2ZXRpY2FCb2xkTWV0cmljcz17bGluZUhlaWdodDoxLjIsbGluZUdhcDouMn07dC5IZWx2ZXRpY2FCb2xkSXRhbGljRmFjdG9ycz1bLjc2MTE2LDEsMSwxLjAwMDYsLjk5OTk4LC45OTk3NCwuOTk5NzMsLjk5OTczLC45OTk4MiwuOTk5NzcsMS4wMDA4NywuOTk5OTgsLjk5OTk4LC45OTk1OSwxLjAwMDAzLDEuMDAwNiwuOTk5OTgsMS4wMDA2LDEuMDAwNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTk4LDEsMS4wMDAwMywxLjAwMDAzLDEuMDAwMDMsMS4wMDAyNiwuOTk5OSwuOTk5NzcsLjk5OTc3LC45OTk3NywuOTk5NzcsMS4wMDAwMSwxLjAwMDI2LDEuMDAwMjIsLjk5OTc3LDEuMDAwNiwuOTk5NzMsLjk5OTc3LDEuMDAwMjYsLjk5OTk5LC45OTk3NywxLjAwMDIyLDEuMDAwMDEsMS4wMDAyMiwuOTk5NzcsMS4wMDAwMSwxLjAwMDI2LC45OTk3NywxLjAwMDAxLDEuMDAwMTYsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMjYsLjk5OTk4LDEuMDAwNiwuOTk5OTgsMS4wMDAwMywuOTk5NzMsLjk5OTk4LC45OTk3MywxLjAwMDI2LC45OTk3MywxLjAwMDI2LC45OTk3MywuOTk5OTgsMS4wMDAyNiwxLjAwMDI2LDEuMDAwNiwxLjAwMDYsLjk5OTczLDEuMDAwNiwuOTk5ODIsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwuOTk5NTksLjk5OTczLC45OTk5OCwxLjAwMDI2LC45OTk3MywxLjAwMDIyLC45OTk3MywuOTk5NzMsMSwuOTk5NTksMS4wMDA3NywuOTk5NTksMS4wMDAwMywuOTk5OTgsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDAwNzcsLjk5OTczLC45OTk5OCwxLjAwMDI1LC45OTk2OCwuOTk5NzMsMS4wMDAwMywxLjAwMDI1LC42MDI5OSwxLjAwMDI0LDEuMDY0MDksMSwxLC45OTk5OCwxLC45OTk3MywxLjAwMDYsLjk5OTk4LDEsLjk5OTM2LC45OTk3MywxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDI2LC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LDEsLjk5OTc3LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk3NywuOTk5NzcsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMDMsMS4wMDAyMiwuOTk5NzcsLjk5OTc3LC45OTk3NywuOTk5NzcsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMjYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTgyLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wNjQwOSwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsLjk5OTczLDEuMDAwMjYsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LDEuMDA0NCwuOTk5NzcsMS4wMDAyNiwxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk3MSwuOTk5NzMsLjk5OTczLDEuMDAwNiwuOTk5NzcsLjk5OTczLC45OTk3MywxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LDEuMDEwMTEsMS4wMDAyNiwuOTk5OTksMS4wMDAyNiwxLjAwMDYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTMsLjk5OTgsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwxLDEuMDAwMTYsLjk5OTc3LC45OTk1OSwuOTk5NzcsLjk5OTU5LC45OTk3NywuOTk5NTksMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAyNiwuOTk5OTgsMS4wMDAyNiwuODEyMSwxLjAwMDI2LC45OTk5OCwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwxLjAwMDE2LDEuMDAwMjIsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwxLjAwMDI2LDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwxLjAwMDYsLjk5OTczLC45OTk3NywuOTk5NzMsMSwuOTk5ODIsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMDEsLjk5OTczLDEuMDAwMjYsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTc3LDEsMSwxLjAwMDI2LC45OTk2OSwuOTk5NzIsLjk5OTgxLC45OTk4LDEuMDAwNiwuOTk5NzcsLjk5OTc3LDEuMDAwMjIsLjkxMTU1LDEuMDAwMDEsMS4wMDAyNiwuOTk5NzcsMS4wMDAyMiwxLjAwMDYsLjk5OTc3LDEuMDAwMDEsLjk5OTk5LC45OTk3NywuOTk5NjYsMS4wMDAyMiwxLjAwMDMyLDEuMDAwMDEsLjk5OTQ0LDEuMDAwMjYsMS4wMDAwMSwuOTk5NjgsMS4wMDAwMSwxLjAwMDQ3LDEsMS4wMDA2LDEuMDAwMDEsLjk5OTgxLDEuMDAxMDEsMS4wMDAyNiwxLjAwMDYsLjk5OTQ4LC45OTk4MSwxLjAwMDY0LC45OTk3MywuOTk5NDIsMS4wMDEwMSwxLjAwMDYxLDEuMDAwMjYsMS4wMDA2OSwxLjAwMDYsMS4wMDAxNCwuOTk5NzMsMS4wMTMyMiwuOTk5NzMsMS4wMDA2NSwxLjAwMDI2LDEuMDAwMTIsLjk5OTIzLDEsMS4wMDA2NCwxLjAwMDc2LC45OTk0OCwxLjAwMDU1LDEuMDAwNjMsMS4wMDAwNywuOTk5NDMsMS4wMDA2LC45OTk0OCwxLjAwMDI2LC45OTk0OCwuOTk5NDMsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMjksMS4wMDAzOCwxLjAwMDM1LDEuMDAwMDEsMS4wMDA2LDEuMDAwNiwuOTk5NzMsLjk5OTc4LDEuMDAwMDEsMS4wMDA1NywuOTk5ODksLjk5OTY3LC45OTk2NCwuOTk5NjcsLjk5OTc3LC45OTk5OSwuOTk5NzcsMS4wMDAzOCwuOTk5NzcsMS4wMDAwMSwuOTk5NzMsMS4wMDA2NiwuOTk5NjcsLjk5OTY3LDEuMDAwNDEsLjk5OTk4LC45OTk5OSwuOTk5NzcsMS4wMDAyMiwuOTk5NjcsMS4wMDAwMSwuOTk5NzcsMS4wMDAyNiwuOTk5NjQsMS4wMDAzMSwxLjAwMDAxLC45OTk5OSwuOTk5OTksMSwxLjAwMDIzLDEsMSwuOTk5OTksMS4wMDAzNSwxLjAwMDAxLC45OTk5OSwuOTk5NzMsLjk5OTc3LC45OTk5OSwxLjAwMDU4LC45OTk3MywuOTk5NzMsLjk5OTU1LC45OTk1LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDMyLC45OTk4OSwxLjAwMDM0LC45OTk5OSwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwuOTk5NzMsLjQ1OTk4LC45OTk3MywxLjAwMDI2LC45OTk3MywxLjAwMDAxLC45OTk5OSwuOTk5ODIsLjk5OTk0LC45OTk5NiwxLDEuMDAwNDIsMS4wMDA0NCwxLjAwMDI5LDEuMDAwMjMsLjk5OTczLC45OTk3MywxLjAwMDI2LC45OTk0OSwxLjAwMDAyLC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwuOTk5NzUsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMzIsLjk4Njg1LC45OTk3MywxLjAwMDI2LDEsMSwuOTk5NjYsMS4wMDA0NCwxLjAwMDE2LDEuMDAwMjIsMS4wMDAxNiwxLjAwMDIyLDEuMDAwMTYsMS4wMDAyMiwxLjAwMDAxLC45OTk3MywxLDEsLjk5OTczLDEsMSwuOTk5NTUsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEsMSwxLC45OTk3MywuOTk5NzMsLjk5OTcyLDEsMSwxLjAwMTA2LC45OTk5OSwuOTk5OTgsLjk5OTk4LC45OTk5OSwuOTk5OTgsMS42NjQ3NSwxLC45OTk3MywuOTk5NzMsMSwuOTk5NzMsLjk5OTcxLC45OTk3OCwxLDEsLjk5OTkxLC45OTk4NCwxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwOTgsMSwxLDEsMS4wMDA0OSwxLDEsLjk5OTcyLDEsMS4yMDk4NSwxLjM5NzEzLDEuMDAwMDMsMS4wMDAzMSwxLjAwMDE1LDEsLjk5NTYxLDEuMDAwMjcsMS4wMDAzMSwxLjAwMDMxLC45OTkxNSwxLjAwMDMxLDEuMDAwMzEsLjk5OTk5LDEuMDAwMDMsLjk5OTk5LC45OTk5OSwxLjQxMTQ0LDEuNiwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDA1NzksMS40MDU3OSwxLjM2NjI1LC45OTk5OSwxLC45OTg2MSwuOTk4NjEsMSwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LC45OTk3MiwuOTk5OTksLjk5OTk5LC45OTk5OSwuOTk5OTksMS40MDQ4MywxLC45OTk3NywxLjAwMDU0LDEsMSwuOTk5NTMsLjk5OTYyLDEuMDAwNDIsLjk5OTUsMSwxLDEsMSwxLDEsMSwxLC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdO3QuSGVsdmV0aWNhQm9sZEl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4zNSxsaW5lR2FwOi4yfTt0LkhlbHZldGljYUl0YWxpY0ZhY3RvcnM9Wy43NjExNiwxLDEsMS4wMDA2LDEuMDAwNiwxLjAwMDA2LC45OTk3MywuOTk5NzMsLjk5OTgyLDEuMDAwMDEsMS4wMDA0MywuOTk5OTgsLjk5OTk4LC45OTk1OSwxLjAwMDAzLDEuMDAwNiwuOTk5OTgsMS4wMDA2LDEuMDAwNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA2LDEsMS4wMDAwMywxLjAwMDAzLDEuMDAwMDMsLjk5OTczLC45OTk4NywxLjAwMDAxLDEuMDAwMDEsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMjYsMS4wMDAyMiwuOTk5NzcsMS4wMDA2LDEsMS4wMDAwMSwuOTk5NzMsLjk5OTk5LC45OTk3NywxLjAwMDIyLDEuMDAwMDEsMS4wMDAyMiwuOTk5NzcsMS4wMDAwMSwxLjAwMDI2LC45OTk3NywxLjAwMDAxLDEuMDAwMTYsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMjYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTQ5LC45OTk3MywuOTk5OTgsLjk5OTczLC45OTk3MywxLC45OTk3MywuOTk5NzMsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTI0LC45OTkyNCwxLC45OTkyNCwuOTk5OTksLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk5OCwxLDEuMDAwNiwuOTk5NzMsMSwuOTk5NzcsMSwxLDEsMS4wMDAwNSwxLjAwMDksMS4wMDAwNSwxLjAwMDAzLC45OTk5OCwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA5LC45OTk3MywuOTk5OTgsMS4wMDAyNSwuOTk5NjgsLjk5OTczLDEuMDAwMDMsMS4wMDAyNSwuNjAyOTksMS4wMDAyNCwxLjA2NDA5LDEsMSwuOTk5OTgsMSwuOTk5OCwxLjAwMDYsLjk5OTk4LDEsLjk5OTM2LC45OTk3MywxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDI2LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEsLjk5OTc3LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk3NywuOTk5NzcsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMDMsMS4wMDAyMiwuOTk5NzcsLjk5OTc3LC45OTk3NywuOTk5NzcsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMjYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTgyLDEsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wNjQwOSwxLjAwMDI2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLC45OTk3MywxLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLC45OTk3NywxLC45OTk3NywxLC45OTk3NywxLC45OTk3NywxLC45OTk3NywxLjAyODgsLjk5OTc3LC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDIyLC45OTk3MywxLjAwMDIyLC45OTk3MywxLjAwMDIyLC45OTk3MywxLjAwMDIyLC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTkyNCwxLjAwMDYsMS4wMDA2LC45OTk0NiwxLjAwMDM0LDEsLjk5OTI0LDEuMDAwMDEsMSwxLC45OTk3MywuOTk5MjQsLjk5OTczLC45OTkyNCwuOTk5NzMsMS4wNjMxMSwuOTk5NzMsMS4wMDAyNCwuOTk5NzMsLjk5OTI0LC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLDEuMDAwNDEsLjk5OTgsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEsMS4wMDAxNiwuOTk5NzcsLjk5OTk4LC45OTk3NywuOTk5OTgsLjk5OTc3LC45OTk5OCwxLjAwMDAxLDEsMS4wMDAwMSwxLDEuMDAwMDEsMSwxLjAwMDAxLDEsMS4wMDAyNiwxLjAwMDYsMS4wMDAyNiwuODk1NDcsMS4wMDAyNiwxLjAwMDYsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsMS4wMDAxNiwuOTk5NzcsMS4wMDAwMSwxLDEuMDAwMDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwxLjAwMDI2LDEsLjk5OTI0LC45OTk3MywxLjAwMDAxLC45OTk3MywxLC45OTk4MiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAwMSwxLDEuMDAwMjYsMS4wMDA2LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsMS4wMDAwMSwxLDEuMDAwNTQsLjk5OTc3LDEuMDAwODQsMS4wMDAwNywuOTk5NzMsMS4wMDAxMywuOTk5MjQsMS4wMDAwMSwxLjAwMDAxLC45OTk0NSwuOTEyMjEsMS4wMDAwMSwxLjAwMDI2LC45OTk3NywxLjAwMDIyLDEuMDAwNiwxLjAwMDAxLDEuMDAwMDEsLjk5OTk5LC45OTk3NywuOTk5MzMsMS4wMDAyMiwxLjAwMDU0LDEuMDAwMDEsMS4wMDA2NSwxLjAwMDI2LDEuMDAwMDEsMS4wMDAxLDEuMDAwMDEsMS4wMDA1MiwxLDEuMDAwNiwxLjAwMDAxLC45OTk0NSwuOTk4OTcsLjk5OTY4LC45OTkyNCwxLjAwMDM2LC45OTk0NSwuOTk5NDksMSwxLjAwMDYsLjk5ODk3LC45OTkxOCwuOTk5NjgsLjk5OTExLC45OTkyNCwxLC45OTk2MiwxLjAxNDg3LDEsMS4wMDA1LC45OTk3MywxLjAwMDEyLDEuMDAwNDMsMSwuOTk5OTUsLjk5OTk0LDEuMDAwMzYsLjk5OTQ3LDEuMDAwMTksMS4wMDA2MywxLjAwMDI1LC45OTkyNCwxLjAwMDM2LC45OTk3MywxLjAwMDM2LDEuMDAwMjUsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMjcsMS4wMDAxLDEuMDAwNjgsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LDEsMS4wMDAwOCwuOTk5NTcsLjk5OTcyLC45OTk0LC45OTk1NCwuOTk5NzUsMS4wMDA1MSwxLjAwMDAxLDEuMDAwMTksMS4wMDAwMSwxLjAwMDEsLjk5OTg2LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDM4LC45OTk1NCwuOTk5NTQsLjk5OTQsMS4wMDA2NiwuOTk5OTksLjk5OTc3LDEuMDAwMjIsMS4wMDA1NCwxLjAwMDAxLC45OTk3NywxLjAwMDI2LC45OTk3NSwxLjAwMDEsMS4wMDAwMSwuOTk5OTMsLjk5OTUsLjk5OTU1LDEuMDAwMTYsLjk5OTc4LC45OTk3NCwxLjAwMDE5LDEuMDAwMjIsLjk5OTU1LDEuMDAwNTMsLjk5OTczLDEuMDAwODksMS4wMDAwNSwuOTk5NjcsMS4wMDA0OCwuOTk5NzMsMS4wMDAwMiwxLjAwMDM0LC45OTk3MywuOTk5NzMsLjk5OTY0LDEuMDAwMDYsMS4wMDA2NiwuOTk5NDcsLjk5OTczLC45ODg5NCwuOTk5NzMsMSwuNDQ4OTgsMSwuOTk5NDYsMSwxLjAwMDM5LDEuMDAwODIsLjk5OTkxLC45OTk5MSwuOTk5ODUsMS4wMDAyMiwxLjAwMDIzLDEuMDAwNjEsMS4wMDAwNiwuOTk5NjYsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDAxOSwxLjAwMDgsMSwuOTk5MjQsLjk5OTI0LC45OTkyNCwuOTk5ODMsMS4wMDA0NCwuOTk5NzMsLjk5OTY0LC45ODMzMiwxLC45OTk3MywxLDEsLjk5OTYyLC45OTg5NSwxLjAwMDE2LC45OTk3NywxLjAwMDE2LC45OTk3NywxLjAwMDE2LC45OTk3NywxLjAwMDAxLDEsMSwxLC45OTk3MywxLDEsLjk5OTU1LC45OTkyNCwuOTk5MjQsLjk5OTI0LC45OTkyNCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5NzMsLjk5OTczLC45OTk3MiwxLDEsMS4wMDI2NywuOTk5OTksLjk5OTk4LC45OTk5OCwxLC45OTk5OCwxLjY2NDc1LDEsLjk5OTczLC45OTk3MywxLjAwMDIzLC45OTk3MywxLjAwNDIzLC45OTkyNSwuOTk5OTksMSwuOTk5OTEsLjk5OTg0LDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDA0OSwxLDEuMDAyNDUsMSwxLDEsMSwuOTYzMjksMSwxLjIwOTg1LDEuMzk3MTMsMS4wMDAwMywuODI1NCwxLjAwMDE1LDEsMS4wMDAzNSwxLjAwMDI3LDEuMDAwMzEsMS4wMDAzMSwxLjAwMDAzLDEuMDAwMzEsMS4wMDAzMSwuOTk5OTksMS4wMDAwMywuOTk5OTksLjk5OTk5LDEuNDExNDQsMS42LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MDU3OSwxLjQwNTc5LDEuMzY2MjUsLjk5OTk5LDEsLjk5ODYxLC45OTg2MSwxLDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsLjk1MzE3LC45OTk5OSwuOTk5OTksLjk5OTk5LC45OTk5OSwxLjQwNDgzLDEsLjk5OTc3LDEuMDAwNTQsMSwxLC45OTk1MywuOTk5NjIsMS4wMDA0MiwuOTk5NSwxLDEsMSwxLDEsMSwxLDEsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LDEsMSwxLDEsMSwxLDEsMSwxLDEsMV07dC5IZWx2ZXRpY2FJdGFsaWNNZXRyaWNzPXtsaW5lSGVpZ2h0OjEuMzUsbGluZUdhcDouMn07dC5IZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycz1bLjc2MTE2LDEsMSwxLjAwMDYsMS4wMDA2LDEuMDAwMDYsLjk5OTczLC45OTk3MywuOTk5ODIsMS4wMDAwMSwxLjAwMDQzLC45OTk5OCwuOTk5OTgsLjk5OTU5LDEuMDAwMDMsMS4wMDA2LC45OTk5OCwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDYsMSwxLjAwMDAzLDEuMDAwMDMsMS4wMDAwMywuOTk5NzMsLjk5OTg3LDEuMDAwMDEsMS4wMDAwMSwuOTk5NzcsLjk5OTc3LDEuMDAwMDEsMS4wMDAyNiwxLjAwMDIyLC45OTk3NywxLjAwMDYsMSwxLjAwMDAxLC45OTk3MywuOTk5OTksLjk5OTc3LDEuMDAwMjIsMS4wMDAwMSwxLjAwMDIyLC45OTk3NywxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMDEsMS4wMDAxNiwxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwuOTk5NDksLjk5OTczLC45OTk5OCwuOTk5NzMsLjk5OTczLDEsLjk5OTczLC45OTk3MywxLjAwMDYsLjk5OTczLC45OTk3MywuOTk5MjQsLjk5OTI0LDEsLjk5OTI0LC45OTk5OSwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTk4LDEsMS4wMDA2LC45OTk3MywxLC45OTk3NywxLDEsMSwxLjAwMDA1LDEuMDAwOSwxLjAwMDA1LDEuMDAwMDMsLjk5OTk4LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDksLjk5OTczLC45OTk5OCwxLjAwMDI1LC45OTk2OCwuOTk5NzMsMS4wMDAwMywxLjAwMDI1LC42MDI5OSwxLjAwMDI0LDEuMDY0MDksMSwxLC45OTk5OCwxLC45OTk4LDEuMDAwNiwuOTk5OTgsMSwuOTk5MzYsLjk5OTczLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMjYsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMSwuOTk5NzcsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTc3LC45OTk3NywxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAwMywxLjAwMDIyLC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5ODIsMSwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjA2NDA5LDEuMDAwMjYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEsLjk5OTczLDEsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsLjk5OTc3LDEsLjk5OTc3LDEsLjk5OTc3LDEsLjk5OTc3LDEsLjk5OTc3LDEuMDQ1OTYsLjk5OTc3LC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDIyLC45OTk3MywxLjAwMDIyLC45OTk3MywxLjAwMDIyLC45OTk3MywxLjAwMDIyLC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTkyNCwxLjAwMDYsMS4wMDA2LDEuMDAwMTksMS4wMDAzNCwxLC45OTkyNCwxLjAwMDAxLDEsMSwuOTk5NzMsLjk5OTI0LC45OTk3MywuOTk5MjQsLjk5OTczLDEuMDI1NzIsLjk5OTczLDEuMDAwMDUsLjk5OTczLC45OTkyNCwuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5OTksLjk5OTgsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEsMS4wMDAxNiwuOTk5NzcsLjk5OTk4LC45OTk3NywuOTk5OTgsLjk5OTc3LC45OTk5OCwxLjAwMDAxLDEsMS4wMDAwMSwxLDEuMDAwMDEsMSwxLjAwMDAxLDEsMS4wMDAyNiwxLjAwMDYsMS4wMDAyNiwuODQ1MzMsMS4wMDAyNiwxLjAwMDYsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsMS4wMDAxNiwuOTk5NzcsMS4wMDAwMSwxLDEuMDAwMDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwxLjAwMDI2LDEsLjk5OTI0LC45OTk3MywxLjAwMDAxLC45OTk3MywxLC45OTk4MiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAwMSwxLDEuMDAwMjYsMS4wMDA2LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTI4LDEsLjk5OTc3LDEuMDAwMTMsMS4wMDA1NSwuOTk5NDcsLjk5OTQ1LC45OTk0MSwuOTk5MjQsMS4wMDAwMSwxLjAwMDAxLDEuMDAwNCwuOTE2MjEsMS4wMDAwMSwxLjAwMDI2LC45OTk3NywxLjAwMDIyLDEuMDAwNiwxLjAwMDAxLDEuMDAwMDUsLjk5OTk5LC45OTk3NywxLjAwMDE1LDEuMDAwMjIsLjk5OTc3LDEuMDAwMDEsLjk5OTczLDEuMDAwMjYsMS4wMDAwMSwxLjAwMDE5LDEuMDAwMDEsLjk5OTQ2LDEsMS4wMDA2LDEuMDAwMDEsLjk5OTc4LDEuMDAwNDUsLjk5OTczLC45OTkyNCwxLjAwMDIzLC45OTk3OCwuOTk5NjYsMSwxLjAwMDY1LDEuMDAwNDUsMS4wMDAxOSwuOTk5NzMsLjk5OTczLC45OTkyNCwxLDEsLjk2NDk5LDEsMS4wMDA1NSwuOTk5NzMsMS4wMDAwOCwxLjAwMDI3LDEsLjk5OTcsLjk5OTk1LDEuMDAwMjMsLjk5OTMzLDEuMDAwMTksMS4wMDAxNSwxLjAwMDMxLC45OTkyNCwxLjAwMDIzLC45OTk3MywxLjAwMDIzLDEuMDAwMzEsMS4wMDAwMSwuOTk5MjgsMS4wMDAyOSwxLjAwMDkyLDEuMDAwMzUsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LDEsLjk5OTg4LC45OTk3NSwxLDEuMDAwODIsLjk5NTYxLC45OTk2LDEuMDAwMzUsMS4wMDAwMSwuOTk5NjIsMS4wMDAwMSwxLjAwMDkyLC45OTk2NCwxLjAwMDAxLC45OTk2MywuOTk5OTksMS4wMDAzNSwxLjAwMDM1LDEuMDAwODIsLjk5OTYyLC45OTk5OSwuOTk5NzcsMS4wMDAyMiwxLjAwMDM1LDEuMDAwMDEsLjk5OTc3LDEuMDAwMjYsLjk5OTYsLjk5OTY3LDEuMDAwMDEsMS4wMDAzNCwxLjAwMDc0LDEuMDAwNTQsMS4wMDA1MywxLjAwMDYzLC45OTk3MSwuOTk5NjIsMS4wMDAzNSwuOTk5NzUsLjk5OTc3LC45OTk3MywxLjAwMDQzLC45OTk1MywxLjAwMDcsLjk5OTE1LC45OTk3MywxLjAwMDA4LC45OTg5MiwxLjAwMDczLDEuMDAwNzMsMS4wMDExNCwuOTk5MTUsMS4wMDA3MywuOTk5NTUsLjk5OTczLDEuMDAwOTIsLjk5OTczLDEsLjk5OTk4LDEsMS4wMDAzLDEsMS4wMDA0MywxLjAwMDAxLC45OTk2OSwxLjAwMDMsMSwxLjAwMDM1LDEuMDAwMDEsLjk5OTUsMSwxLjAwMDkyLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDAwNywuOTk5NSwxLC45OTkyNCwxLjAwMDYsLjk5OTI0LC45OTk3MiwxLjAwMDYyLC45OTk3MywxLjAwMTE0LDEuMDAwNzMsMSwuOTk5NTUsMSwxLDEuMDAwNDcsLjk5OTY4LDEuMDAwMTYsLjk5OTc3LDEuMDAwMTYsLjk5OTc3LDEuMDAwMTYsLjk5OTc3LDEuMDAwMDEsMSwxLDEsLjk5OTczLDEsMSwuOTk5NTUsLjk5OTI0LC45OTkyNCwuOTk5MjQsLjk5OTI0LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk3MywuOTk5NzMsLjk5OTcyLDEsMSwxLjAwMjY3LC45OTk5OSwuOTk5OTgsLjk5OTk4LDEsLjk5OTk4LDEuNjY0NzUsMSwuOTk5NzMsLjk5OTczLDEuMDAwMjMsLjk5OTczLC45OTk3MSwuOTk5MjUsMS4wMDAyMywxLC45OTk5MSwuOTk5ODQsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLDEsMSwxLDEsMSwxLC45NjMyOSwxLDEuMjA5ODUsMS4zOTcxMywxLjAwMDAzLC44MjU0LDEuMDAwMTUsMSwxLjAwMDM1LDEuMDAwMjcsMS4wMDAzMSwxLjAwMDMxLC45OTkxNSwxLjAwMDMxLDEuMDAwMzEsLjk5OTk5LDEuMDAwMDMsLjk5OTk5LC45OTk5OSwxLjQxMTQ0LDEuNiwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDA1NzksMS40MDU3OSwxLjM2NjI1LC45OTk5OSwxLC45OTg2MSwuOTk4NjEsMSwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LC45NTMxNywuOTk5OTksLjk5OTk5LC45OTk5OSwuOTk5OTksMS40MDQ4MywxLC45OTk3NywxLjAwMDU0LDEsMSwuOTk5NTMsLjk5OTYyLDEuMDAwNDIsLjk5OTUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXTt0LkhlbHZldGljYVJlZ3VsYXJNZXRyaWNzPXtsaW5lSGVpZ2h0OjEuMixsaW5lR2FwOi4yfX0sKGUsdCk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzPXQuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZz10LkxpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzPXQuTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nPXQuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzPXQuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZz10LkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY1dpZHRocz10LkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmc9dm9pZCAwO3QuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzPVszNjUsMCwzMzMsMjc4LDMzMyw0NzQsNTU2LDU1Niw4ODksNzIyLDIzOCwzMzMsMzMzLDM4OSw1ODQsMjc4LDMzMywyNzgsMjc4LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1NiwzMzMsMzMzLDU4NCw1ODQsNTg0LDYxMSw5NzUsNzIyLDcyMiw3MjIsNzIyLDY2Nyw2MTEsNzc4LDcyMiwyNzgsNTU2LDcyMiw2MTEsODMzLDcyMiw3NzgsNjY3LDc3OCw3MjIsNjY3LDYxMSw3MjIsNjY3LDk0NCw2NjcsNjY3LDYxMSwzMzMsMjc4LDMzMyw1ODQsNTU2LDMzMyw1NTYsNjExLDU1Niw2MTEsNTU2LDMzMyw2MTEsNjExLDI3OCwyNzgsNTU2LDI3OCw4ODksNjExLDYxMSw2MTEsNjExLDM4OSw1NTYsMzMzLDYxMSw1NTYsNzc4LDU1Niw1NTYsNTAwLDM4OSwyODAsMzg5LDU4NCwzMzMsNTU2LDU1Niw1NTYsNTU2LDI4MCw1NTYsMzMzLDczNywzNzAsNTU2LDU4NCw3MzcsNTUyLDQwMCw1NDksMzMzLDMzMywzMzMsNTc2LDU1NiwyNzgsMzMzLDMzMywzNjUsNTU2LDgzNCw4MzQsODM0LDYxMSw3MjIsNzIyLDcyMiw3MjIsNzIyLDcyMiwxZTMsNzIyLDY2Nyw2NjcsNjY3LDY2NywyNzgsMjc4LDI3OCwyNzgsNzIyLDcyMiw3NzgsNzc4LDc3OCw3NzgsNzc4LDU4NCw3NzgsNzIyLDcyMiw3MjIsNzIyLDY2Nyw2NjcsNjExLDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDg4OSw1NTYsNTU2LDU1Niw1NTYsNTU2LDI3OCwyNzgsMjc4LDI3OCw2MTEsNjExLDYxMSw2MTEsNjExLDYxMSw2MTEsNTQ5LDYxMSw2MTEsNjExLDYxMSw2MTEsNTU2LDYxMSw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNzE5LDcyMiw2MTEsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDc3OCw2MTEsNzc4LDYxMSw3NzgsNjExLDc3OCw2MTEsNzIyLDYxMSw3MjIsNjExLDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCw3ODUsNTU2LDU1NiwyNzgsNzIyLDU1Niw1NTYsNjExLDI3OCw2MTEsMjc4LDYxMSwzODUsNjExLDQ3OSw2MTEsMjc4LDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDcwOCw3MjMsNjExLDc3OCw2MTEsNzc4LDYxMSw3NzgsNjExLDFlMyw5NDQsNzIyLDM4OSw3MjIsMzg5LDcyMiwzODksNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2MTEsMzMzLDYxMSw0NzksNjExLDMzMyw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw5NDQsNzc4LDY2Nyw1NTYsNjY3LDYxMSw1MDAsNjExLDUwMCw2MTEsNTAwLDI3OCw1NTYsNzIyLDU1NiwxZTMsODg5LDc3OCw2MTEsNjY3LDU1Niw2MTEsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMyw0NjUsNzIyLDMzMyw4NTMsOTA2LDQ3NCw4MjUsOTI3LDgzOCwyNzgsNzIyLDcyMiw2MDEsNzE5LDY2Nyw2MTEsNzIyLDc3OCwyNzgsNzIyLDY2Nyw4MzMsNzIyLDY0NCw3NzgsNzIyLDY2Nyw2MDAsNjExLDY2Nyw4MjEsNjY3LDgwOSw4MDIsMjc4LDY2Nyw2MTUsNDUxLDYxMSwyNzgsNTgyLDYxNSw2MTAsNTU2LDYwNiw0NzUsNDYwLDYxMSw1NDEsMjc4LDU1OCw1NTYsNjEyLDU1Niw0NDUsNjExLDc2Niw2MTksNTIwLDY4NCw0NDYsNTgyLDcxNSw1NzYsNzUzLDg0NSwyNzgsNTgyLDYxMSw1ODIsODQ1LDY2Nyw2NjksODg1LDU2Nyw3MTEsNjY3LDI3OCwyNzYsNTU2LDEwOTQsMTA2Miw4NzUsNjEwLDcyMiw2MjIsNzE5LDcyMiw3MTksNzIyLDU2Nyw3MTIsNjY3LDkwNCw2MjYsNzE5LDcxOSw2MTAsNzAyLDgzMyw3MjIsNzc4LDcxOSw2NjcsNzIyLDYxMSw2MjIsODU0LDY2Nyw3MzAsNzAzLDEwMDUsMTAxOSw4NzAsOTc5LDcxOSw3MTEsMTAzMSw3MTksNTU2LDYxOCw2MTUsNDE3LDYzNSw1NTYsNzA5LDQ5Nyw2MTUsNjE1LDUwMCw2MzUsNzQwLDYwNCw2MTEsNjA0LDYxMSw1NTYsNDkwLDU1Niw4NzUsNTU2LDYxNSw1ODEsODMzLDg0NCw3MjksODU0LDYxNSw1NTIsODU0LDU4Myw1NTYsNTU2LDYxMSw0MTcsNTUyLDU1NiwyNzgsMjgxLDI3OCw5NjksOTA2LDYxMSw1MDAsNjE1LDU1Niw2MDQsNzc4LDYxMSw0ODcsNDQ3LDk0NCw3NzgsOTQ0LDc3OCw5NDQsNzc4LDY2Nyw1NTYsMzMzLDMzMyw1NTYsMWUzLDFlMyw1NTIsMjc4LDI3OCwyNzgsMjc4LDUwMCw1MDAsNTAwLDU1Niw1NTYsMzUwLDFlMywxZTMsMjQwLDQ3OSwzMzMsMzMzLDYwNCwzMzMsMTY3LDM5Niw1NTYsNTU2LDEwOTQsNTU2LDg4NSw0ODksMTExNSwxZTMsNzY4LDYwMCw4MzQsODM0LDgzNCw4MzQsMWUzLDUwMCwxZTMsNTAwLDFlMyw1MDAsNTAwLDQ5NCw2MTIsODIzLDcxMyw1ODQsNTQ5LDcxMyw5NzksNzIyLDI3NCw1NDksNTQ5LDU4Myw1NDksNTQ5LDYwNCw1ODQsNjA0LDYwNCw3MDgsNjI1LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcyOSw2MDQsNjA0LDM1NCwzNTQsMWUzLDk5MCw5OTAsOTkwLDk5MCw0OTQsNjA0LDYwNCw2MDQsNjA0LDM1NCwxMDIxLDEwNTIsOTE3LDc1MCw3NTAsNTMxLDY1Niw1OTQsNTEwLDUwMCw3NTAsNzUwLDYxMSw2MTEsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywyMjIsMjIyLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzNdO3QuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZz1bLTEsLTEsLTEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1LDI1NiwyNTcsMjU4LDI1OSwyNjAsMjYxLDI2MiwyNjMsMjY0LDI2NSwyNjYsMjY3LDI2OCwyNjksMjcwLDI3MSwyNzIsMjczLDI3NCwyNzUsMjc2LDI3NywyNzgsMjc5LDI4MCwyODEsMjgyLDI4MywyODQsMjg1LDI4NiwyODcsMjg4LDI4OSwyOTAsMjkxLDI5MiwyOTMsMjk0LDI5NSwyOTYsMjk3LDI5OCwyOTksMzAwLDMwMSwzMDIsMzAzLDMwNCwzMDUsMzA2LDMwNywzMDgsMzA5LDMxMCwzMTEsMzEyLDMxMywzMTQsMzE1LDMxNiwzMTcsMzE4LDMxOSwzMjAsMzIxLDMyMiwzMjMsMzI0LDMyNSwzMjYsMzI3LDMyOCwzMjksMzMwLDMzMSwzMzIsMzMzLDMzNCwzMzUsMzM2LDMzNywzMzgsMzM5LDM0MCwzNDEsMzQyLDM0MywzNDQsMzQ1LDM0NiwzNDcsMzQ4LDM0OSwzNTAsMzUxLDM1MiwzNTMsMzU0LDM1NSwzNTYsMzU3LDM1OCwzNTksMzYwLDM2MSwzNjIsMzYzLDM2NCwzNjUsMzY2LDM2NywzNjgsMzY5LDM3MCwzNzEsMzcyLDM3MywzNzQsMzc1LDM3NiwzNzcsMzc4LDM3OSwzODAsMzgxLDM4MiwzODMsNDAyLDUwNiw1MDcsNTA4LDUwOSw1MTAsNTExLDUzNiw1MzcsNTM4LDUzOSw3MTAsNzExLDcxMyw3MjgsNzI5LDczMCw3MzEsNzMyLDczMyw5MDAsOTAxLDkwMiw5MDMsOTA0LDkwNSw5MDYsOTA4LDkxMCw5MTEsOTEyLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksOTMxLDkzMiw5MzMsOTM0LDkzNSw5MzYsOTM3LDkzOCw5MzksOTQwLDk0MSw5NDIsOTQzLDk0NCw5NDUsOTQ2LDk0Nyw5NDgsOTQ5LDk1MCw5NTEsOTUyLDk1Myw5NTQsOTU1LDk1Niw5NTcsOTU4LDk1OSw5NjAsOTYxLDk2Miw5NjMsOTY0LDk2NSw5NjYsOTY3LDk2OCw5NjksOTcwLDk3MSw5NzIsOTczLDk3NCwxMDI0LDEwMjUsMTAyNiwxMDI3LDEwMjgsMTAyOSwxMDMwLDEwMzEsMTAzMiwxMDMzLDEwMzQsMTAzNSwxMDM2LDEwMzcsMTAzOCwxMDM5LDEwNDAsMTA0MSwxMDQyLDEwNDMsMTA0NCwxMDQ1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSwxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsMTEwNCwxMTA1LDExMDYsMTEwNywxMTA4LDExMDksMTExMCwxMTExLDExMTIsMTExMywxMTE0LDExMTUsMTExNiwxMTE3LDExMTgsMTExOSwxMTM4LDExMzksMTE2OCwxMTY5LDc4MDgsNzgwOSw3ODEwLDc4MTEsNzgxMiw3ODEzLDc5MjIsNzkyMyw4MjA4LDgyMDksODIxMSw4MjEyLDgyMTMsODIxNSw4MjE2LDgyMTcsODIxOCw4MjE5LDgyMjAsODIyMSw4MjIyLDgyMjQsODIyNSw4MjI2LDgyMzAsODI0MCw4MjQyLDgyNDMsODI0OSw4MjUwLDgyNTIsODI1NCw4MjYwLDgzMTksODM1NSw4MzU2LDgzNTksODM2NCw4NDUzLDg0NjcsODQ3MCw4NDgyLDg0ODYsODQ5NCw4NTM5LDg1NDAsODU0MSw4NTQyLDg1OTIsODU5Myw4NTk0LDg1OTUsODU5Niw4NTk3LDg2MTYsODcwNiw4NzEwLDg3MTksODcyMSw4NzIyLDg3MzAsODczNCw4NzM1LDg3NDUsODc0Nyw4Nzc2LDg4MDAsODgwMSw4ODA0LDg4MDUsODk2Miw4OTc2LDg5OTIsODk5Myw5NDcyLDk0NzQsOTQ4NCw5NDg4LDk0OTIsOTQ5Niw5NTAwLDk1MDgsOTUxNiw5NTI0LDk1MzIsOTU1Miw5NTUzLDk1NTQsOTU1NSw5NTU2LDk1NTcsOTU1OCw5NTU5LDk1NjAsOTU2MSw5NTYyLDk1NjMsOTU2NCw5NTY1LDk1NjYsOTU2Nyw5NTY4LDk1NjksOTU3MCw5NTcxLDk1NzIsOTU3Myw5NTc0LDk1NzUsOTU3Niw5NTc3LDk1NzgsOTU3OSw5NTgwLDk2MDAsOTYwNCw5NjA4LDk2MTIsOTYxNiw5NjE3LDk2MTgsOTYxOSw5NjMyLDk2MzMsOTY0Miw5NjQzLDk2NDQsOTY1MCw5NjU4LDk2NjAsOTY2OCw5Njc0LDk2NzUsOTY3OSw5Njg4LDk2ODksOTcwMiw5Nzg2LDk3ODcsOTc4OCw5NzkyLDk3OTQsOTgyNCw5ODI3LDk4MjksOTgzMCw5ODM0LDk4MzUsOTgzNiw2MTQ0MSw2MTQ0Miw2MTQ0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMV07dC5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHM9WzM2NSwwLDMzMywyNzgsMzMzLDQ3NCw1NTYsNTU2LDg4OSw3MjIsMjM4LDMzMywzMzMsMzg5LDU4NCwyNzgsMzMzLDI3OCwyNzgsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDMzMywzMzMsNTg0LDU4NCw1ODQsNjExLDk3NSw3MjIsNzIyLDcyMiw3MjIsNjY3LDYxMSw3NzgsNzIyLDI3OCw1NTYsNzIyLDYxMSw4MzMsNzIyLDc3OCw2NjcsNzc4LDcyMiw2NjcsNjExLDcyMiw2NjcsOTQ0LDY2Nyw2NjcsNjExLDMzMywyNzgsMzMzLDU4NCw1NTYsMzMzLDU1Niw2MTEsNTU2LDYxMSw1NTYsMzMzLDYxMSw2MTEsMjc4LDI3OCw1NTYsMjc4LDg4OSw2MTEsNjExLDYxMSw2MTEsMzg5LDU1NiwzMzMsNjExLDU1Niw3NzgsNTU2LDU1Niw1MDAsMzg5LDI4MCwzODksNTg0LDMzMyw1NTYsNTU2LDU1Niw1NTYsMjgwLDU1NiwzMzMsNzM3LDM3MCw1NTYsNTg0LDczNyw1NTIsNDAwLDU0OSwzMzMsMzMzLDMzMyw1NzYsNTU2LDI3OCwzMzMsMzMzLDM2NSw1NTYsODM0LDgzNCw4MzQsNjExLDcyMiw3MjIsNzIyLDcyMiw3MjIsNzIyLDFlMyw3MjIsNjY3LDY2Nyw2NjcsNjY3LDI3OCwyNzgsMjc4LDI3OCw3MjIsNzIyLDc3OCw3NzgsNzc4LDc3OCw3NzgsNTg0LDc3OCw3MjIsNzIyLDcyMiw3MjIsNjY3LDY2Nyw2MTEsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsODg5LDU1Niw1NTYsNTU2LDU1Niw1NTYsMjc4LDI3OCwyNzgsMjc4LDYxMSw2MTEsNjExLDYxMSw2MTEsNjExLDYxMSw1NDksNjExLDYxMSw2MTEsNjExLDYxMSw1NTYsNjExLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw3NDAsNzIyLDYxMSw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNzc4LDYxMSw3NzgsNjExLDc3OCw2MTEsNzc4LDYxMSw3MjIsNjExLDcyMiw2MTEsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDc4Miw1NTYsNTU2LDI3OCw3MjIsNTU2LDU1Niw2MTEsMjc4LDYxMSwyNzgsNjExLDM5Niw2MTEsNDc5LDYxMSwyNzgsNzIyLDYxMSw3MjIsNjExLDcyMiw2MTEsNzA4LDcyMyw2MTEsNzc4LDYxMSw3NzgsNjExLDc3OCw2MTEsMWUzLDk0NCw3MjIsMzg5LDcyMiwzODksNzIyLDM4OSw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDYxMSwzMzMsNjExLDQ3OSw2MTEsMzMzLDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDk0NCw3NzgsNjY3LDU1Niw2NjcsNjExLDUwMCw2MTEsNTAwLDYxMSw1MDAsMjc4LDU1Niw3MjIsNTU2LDFlMyw4ODksNzc4LDYxMSw2NjcsNTU2LDYxMSwzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMyw3MjIsMzMzLDg1NCw5MDYsNDczLDg0NCw5MzAsODQ3LDI3OCw3MjIsNzIyLDYxMCw2NzEsNjY3LDYxMSw3MjIsNzc4LDI3OCw3MjIsNjY3LDgzMyw3MjIsNjU3LDc3OCw3MTgsNjY3LDU5MCw2MTEsNjY3LDgyMiw2NjcsODI5LDc4MSwyNzgsNjY3LDYyMCw0NzksNjExLDI3OCw1OTEsNjIwLDYyMSw1NTYsNjEwLDQ3OSw0OTIsNjExLDU1OCwyNzgsNTY2LDU1Niw2MDMsNTU2LDQ1MCw2MTEsNzEyLDYwNSw1MzIsNjY0LDQwOSw1OTEsNzA0LDU3OCw3NzMsODM0LDI3OCw1OTEsNjExLDU5MSw4MzQsNjY3LDY2Nyw4ODYsNjE0LDcxOSw2NjcsMjc4LDI3OCw1NTYsMTA5NCwxMDQyLDg1NCw2MjIsNzE5LDY3Nyw3MTksNzIyLDcwOCw3MjIsNjE0LDcyMiw2NjcsOTI3LDY0Myw3MTksNzE5LDYxNSw2ODcsODMzLDcyMiw3NzgsNzE5LDY2Nyw3MjIsNjExLDY3Nyw3ODEsNjY3LDcyOSw3MDgsOTc5LDk4OSw4NTQsMWUzLDcwOCw3MTksMTA0Miw3MjksNTU2LDYxOSw2MDQsNTM0LDYxOCw1NTYsNzM2LDUxMCw2MTEsNjExLDUwNyw2MjIsNzQwLDYwNCw2MTEsNjExLDYxMSw1NTYsODg5LDU1Niw4ODUsNTU2LDY0Niw1ODMsODg5LDkzNSw3MDcsODU0LDU5NCw1NTIsODY1LDU4OSw1NTYsNTU2LDYxMSw0NjksNTYzLDU1NiwyNzgsMjc4LDI3OCw5NjksOTA2LDYxMSw1MDcsNjE5LDU1Niw2MTEsNzc4LDYxMSw1NzUsNDY3LDk0NCw3NzgsOTQ0LDc3OCw5NDQsNzc4LDY2Nyw1NTYsMzMzLDMzMyw1NTYsMWUzLDFlMyw1NTIsMjc4LDI3OCwyNzgsMjc4LDUwMCw1MDAsNTAwLDU1Niw1NTYsMzUwLDFlMywxZTMsMjQwLDQ3OSwzMzMsMzMzLDYwNCwzMzMsMTY3LDM5Niw1NTYsNTU2LDExMDQsNTU2LDg4NSw1MTYsMTE0NiwxZTMsNzY4LDYwMCw4MzQsODM0LDgzNCw4MzQsOTk5LDUwMCwxZTMsNTAwLDFlMyw1MDAsNTAwLDQ5NCw2MTIsODIzLDcxMyw1ODQsNTQ5LDcxMyw5NzksNzIyLDI3NCw1NDksNTQ5LDU4Myw1NDksNTQ5LDYwNCw1ODQsNjA0LDYwNCw3MDgsNjI1LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcyOSw2MDQsNjA0LDM1NCwzNTQsMWUzLDk5MCw5OTAsOTkwLDk5MCw0OTQsNjA0LDYwNCw2MDQsNjA0LDM1NCwxMDIxLDEwNTIsOTE3LDc1MCw3NTAsNTMxLDY1Niw1OTQsNTEwLDUwMCw3NTAsNzUwLDYxMSw2MTEsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywyMjIsMjIyLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzNdO3QuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZz1bLTEsLTEsLTEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1LDI1NiwyNTcsMjU4LDI1OSwyNjAsMjYxLDI2MiwyNjMsMjY0LDI2NSwyNjYsMjY3LDI2OCwyNjksMjcwLDI3MSwyNzIsMjczLDI3NCwyNzUsMjc2LDI3NywyNzgsMjc5LDI4MCwyODEsMjgyLDI4MywyODQsMjg1LDI4NiwyODcsMjg4LDI4OSwyOTAsMjkxLDI5MiwyOTMsMjk0LDI5NSwyOTYsMjk3LDI5OCwyOTksMzAwLDMwMSwzMDIsMzAzLDMwNCwzMDUsMzA2LDMwNywzMDgsMzA5LDMxMCwzMTEsMzEyLDMxMywzMTQsMzE1LDMxNiwzMTcsMzE4LDMxOSwzMjAsMzIxLDMyMiwzMjMsMzI0LDMyNSwzMjYsMzI3LDMyOCwzMjksMzMwLDMzMSwzMzIsMzMzLDMzNCwzMzUsMzM2LDMzNywzMzgsMzM5LDM0MCwzNDEsMzQyLDM0MywzNDQsMzQ1LDM0NiwzNDcsMzQ4LDM0OSwzNTAsMzUxLDM1MiwzNTMsMzU0LDM1NSwzNTYsMzU3LDM1OCwzNTksMzYwLDM2MSwzNjIsMzYzLDM2NCwzNjUsMzY2LDM2NywzNjgsMzY5LDM3MCwzNzEsMzcyLDM3MywzNzQsMzc1LDM3NiwzNzcsMzc4LDM3OSwzODAsMzgxLDM4MiwzODMsNDAyLDUwNiw1MDcsNTA4LDUwOSw1MTAsNTExLDUzNiw1MzcsNTM4LDUzOSw3MTAsNzExLDcxMyw3MjgsNzI5LDczMCw3MzEsNzMyLDczMyw5MDAsOTAxLDkwMiw5MDMsOTA0LDkwNSw5MDYsOTA4LDkxMCw5MTEsOTEyLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksOTMxLDkzMiw5MzMsOTM0LDkzNSw5MzYsOTM3LDkzOCw5MzksOTQwLDk0MSw5NDIsOTQzLDk0NCw5NDUsOTQ2LDk0Nyw5NDgsOTQ5LDk1MCw5NTEsOTUyLDk1Myw5NTQsOTU1LDk1Niw5NTcsOTU4LDk1OSw5NjAsOTYxLDk2Miw5NjMsOTY0LDk2NSw5NjYsOTY3LDk2OCw5NjksOTcwLDk3MSw5NzIsOTczLDk3NCwxMDI0LDEwMjUsMTAyNiwxMDI3LDEwMjgsMTAyOSwxMDMwLDEwMzEsMTAzMiwxMDMzLDEwMzQsMTAzNSwxMDM2LDEwMzcsMTAzOCwxMDM5LDEwNDAsMTA0MSwxMDQyLDEwNDMsMTA0NCwxMDQ1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSwxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsMTEwNCwxMTA1LDExMDYsMTEwNywxMTA4LDExMDksMTExMCwxMTExLDExMTIsMTExMywxMTE0LDExMTUsMTExNiwxMTE3LDExMTgsMTExOSwxMTM4LDExMzksMTE2OCwxMTY5LDc4MDgsNzgwOSw3ODEwLDc4MTEsNzgxMiw3ODEzLDc5MjIsNzkyMyw4MjA4LDgyMDksODIxMSw4MjEyLDgyMTMsODIxNSw4MjE2LDgyMTcsODIxOCw4MjE5LDgyMjAsODIyMSw4MjIyLDgyMjQsODIyNSw4MjI2LDgyMzAsODI0MCw4MjQyLDgyNDMsODI0OSw4MjUwLDgyNTIsODI1NCw4MjYwLDgzMTksODM1NSw4MzU2LDgzNTksODM2NCw4NDUzLDg0NjcsODQ3MCw4NDgyLDg0ODYsODQ5NCw4NTM5LDg1NDAsODU0MSw4NTQyLDg1OTIsODU5Myw4NTk0LDg1OTUsODU5Niw4NTk3LDg2MTYsODcwNiw4NzEwLDg3MTksODcyMSw4NzIyLDg3MzAsODczNCw4NzM1LDg3NDUsODc0Nyw4Nzc2LDg4MDAsODgwMSw4ODA0LDg4MDUsODk2Miw4OTc2LDg5OTIsODk5Myw5NDcyLDk0NzQsOTQ4NCw5NDg4LDk0OTIsOTQ5Niw5NTAwLDk1MDgsOTUxNiw5NTI0LDk1MzIsOTU1Miw5NTUzLDk1NTQsOTU1NSw5NTU2LDk1NTcsOTU1OCw5NTU5LDk1NjAsOTU2MSw5NTYyLDk1NjMsOTU2NCw5NTY1LDk1NjYsOTU2Nyw5NTY4LDk1NjksOTU3MCw5NTcxLDk1NzIsOTU3Myw5NTc0LDk1NzUsOTU3Niw5NTc3LDk1NzgsOTU3OSw5NTgwLDk2MDAsOTYwNCw5NjA4LDk2MTIsOTYxNiw5NjE3LDk2MTgsOTYxOSw5NjMyLDk2MzMsOTY0Miw5NjQzLDk2NDQsOTY1MCw5NjU4LDk2NjAsOTY2OCw5Njc0LDk2NzUsOTY3OSw5Njg4LDk2ODksOTcwMiw5Nzg2LDk3ODcsOTc4OCw5NzkyLDk3OTQsOTgyNCw5ODI3LDk4MjksOTgzMCw5ODM0LDk4MzUsOTgzNiw2MTQ0MSw2MTQ0Miw2MTQ0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMV07dC5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocz1bMzY1LDAsMzMzLDI3OCwyNzgsMzU1LDU1Niw1NTYsODg5LDY2NywxOTEsMzMzLDMzMywzODksNTg0LDI3OCwzMzMsMjc4LDI3OCw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsMjc4LDI3OCw1ODQsNTg0LDU4NCw1NTYsMTAxNSw2NjcsNjY3LDcyMiw3MjIsNjY3LDYxMSw3NzgsNzIyLDI3OCw1MDAsNjY3LDU1Niw4MzMsNzIyLDc3OCw2NjcsNzc4LDcyMiw2NjcsNjExLDcyMiw2NjcsOTQ0LDY2Nyw2NjcsNjExLDI3OCwyNzgsMjc4LDQ2OSw1NTYsMzMzLDU1Niw1NTYsNTAwLDU1Niw1NTYsMjc4LDU1Niw1NTYsMjIyLDIyMiw1MDAsMjIyLDgzMyw1NTYsNTU2LDU1Niw1NTYsMzMzLDUwMCwyNzgsNTU2LDUwMCw3MjIsNTAwLDUwMCw1MDAsMzM0LDI2MCwzMzQsNTg0LDMzMyw1NTYsNTU2LDU1Niw1NTYsMjYwLDU1NiwzMzMsNzM3LDM3MCw1NTYsNTg0LDczNyw1NTIsNDAwLDU0OSwzMzMsMzMzLDMzMyw1NzYsNTM3LDI3OCwzMzMsMzMzLDM2NSw1NTYsODM0LDgzNCw4MzQsNjExLDY2Nyw2NjcsNjY3LDY2Nyw2NjcsNjY3LDFlMyw3MjIsNjY3LDY2Nyw2NjcsNjY3LDI3OCwyNzgsMjc4LDI3OCw3MjIsNzIyLDc3OCw3NzgsNzc4LDc3OCw3NzgsNTg0LDc3OCw3MjIsNzIyLDcyMiw3MjIsNjY3LDY2Nyw2MTEsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsODg5LDUwMCw1NTYsNTU2LDU1Niw1NTYsMjc4LDI3OCwyNzgsMjc4LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NDksNjExLDU1Niw1NTYsNTU2LDU1Niw1MDAsNTU2LDUwMCw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw3MjIsNTAwLDcyMiw1MDAsNzIyLDUwMCw3MjIsNTAwLDcyMiw2MjUsNzIyLDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNzc4LDU1Niw3NzgsNTU2LDc3OCw1NTYsNzc4LDU1Niw3MjIsNTU2LDcyMiw1NTYsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDIyMiwyNzgsMjc4LDczMyw0NDQsNTAwLDIyMiw2NjcsNTAwLDUwMCw1NTYsMjIyLDU1NiwyMjIsNTU2LDI4MSw1NTYsNDAwLDU1NiwyMjIsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNjE1LDcyMyw1NTYsNzc4LDU1Niw3NzgsNTU2LDc3OCw1NTYsMWUzLDk0NCw3MjIsMzMzLDcyMiwzMzMsNzIyLDMzMyw2NjcsNTAwLDY2Nyw1MDAsNjY3LDUwMCw2NjcsNTAwLDYxMSwyNzgsNjExLDM1NCw2MTEsMjc4LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDk0NCw3MjIsNjY3LDUwMCw2NjcsNjExLDUwMCw2MTEsNTAwLDYxMSw1MDAsMjIyLDU1Niw2NjcsNTU2LDFlMyw4ODksNzc4LDYxMSw2NjcsNTAwLDYxMSwyNzgsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMyw2NjcsMjc4LDc4OSw4NDYsMzg5LDc5NCw4NjUsNzc1LDIyMiw2NjcsNjY3LDU3MCw2NzEsNjY3LDYxMSw3MjIsNzc4LDI3OCw2NjcsNjY3LDgzMyw3MjIsNjQ4LDc3OCw3MjUsNjY3LDYwMCw2MTEsNjY3LDgzNyw2NjcsODMxLDc2MSwyNzgsNjY3LDU3MCw0MzksNTU1LDIyMiw1NTAsNTcwLDU3MSw1MDAsNTU2LDQzOSw0NjMsNTU1LDU0MiwyMjIsNTAwLDQ5Miw1NDgsNTAwLDQ0Nyw1NTYsNjcwLDU3Myw0ODYsNjAzLDM3NCw1NTAsNjUyLDU0Niw3MjgsNzc5LDIyMiw1NTAsNTU2LDU1MCw3NzksNjY3LDY2Nyw4NDMsNTQ0LDcwOCw2NjcsMjc4LDI3OCw1MDAsMTA2Niw5ODIsODQ0LDU4OSw3MTUsNjM5LDcyNCw2NjcsNjUxLDY2Nyw1NDQsNzA0LDY2Nyw5MTcsNjE0LDcxNSw3MTUsNTg5LDY4Niw4MzMsNzIyLDc3OCw3MjUsNjY3LDcyMiw2MTEsNjM5LDc5NSw2NjcsNzI3LDY3Myw5MjAsOTIzLDgwNSw4ODYsNjUxLDY5NCwxMDIyLDY4Miw1NTYsNTYyLDUyMiw0OTMsNTUzLDU1Niw2ODgsNDY1LDU1Niw1NTYsNDcyLDU2NCw2ODYsNTUwLDU1Niw1NTYsNTU2LDUwMCw4MzMsNTAwLDgzNSw1MDAsNTcyLDUxOCw4MzAsODUxLDYyMSw3MzYsNTI2LDQ5Miw3NTIsNTM0LDU1Niw1NTYsNTU2LDM3OCw0OTYsNTAwLDIyMiwyMjIsMjIyLDkxMCw4MjgsNTU2LDQ3Miw1NjUsNTAwLDU1Niw3NzgsNTU2LDQ5MiwzMzksOTQ0LDcyMiw5NDQsNzIyLDk0NCw3MjIsNjY3LDUwMCwzMzMsMzMzLDU1NiwxZTMsMWUzLDU1MiwyMjIsMjIyLDIyMiwyMjIsMzMzLDMzMywzMzMsNTU2LDU1NiwzNTAsMWUzLDFlMywxODgsMzU0LDMzMywzMzMsNTAwLDMzMywxNjcsMzY1LDU1Niw1NTYsMTA5NCw1NTYsODg1LDMyMywxMDgzLDFlMyw3NjgsNjAwLDgzNCw4MzQsODM0LDgzNCwxZTMsNTAwLDk5OCw1MDAsMWUzLDUwMCw1MDAsNDk0LDYxMiw4MjMsNzEzLDU4NCw1NDksNzEzLDk3OSw3MTksMjc0LDU0OSw1NDksNTg0LDU0OSw1NDksNjA0LDU4NCw2MDQsNjA0LDcwOCw2MjUsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzI5LDYwNCw2MDQsMzU0LDM1NCwxZTMsOTkwLDk5MCw5OTAsOTkwLDQ5NCw2MDQsNjA0LDYwNCw2MDQsMzU0LDEwMjEsMTA1Miw5MTcsNzUwLDc1MCw1MzEsNjU2LDU5NCw1MTAsNTAwLDc1MCw3NTAsNTAwLDUwMCwzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDIyMiwyMjIsMjk0LDI5NCwzMjQsMzI0LDMxNiwzMjgsMzk4LDI4NV07dC5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmc9Wy0xLC0xLC0xLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NSwyNTYsMjU3LDI1OCwyNTksMjYwLDI2MSwyNjIsMjYzLDI2NCwyNjUsMjY2LDI2NywyNjgsMjY5LDI3MCwyNzEsMjcyLDI3MywyNzQsMjc1LDI3NiwyNzcsMjc4LDI3OSwyODAsMjgxLDI4MiwyODMsMjg0LDI4NSwyODYsMjg3LDI4OCwyODksMjkwLDI5MSwyOTIsMjkzLDI5NCwyOTUsMjk2LDI5NywyOTgsMjk5LDMwMCwzMDEsMzAyLDMwMywzMDQsMzA1LDMwNiwzMDcsMzA4LDMwOSwzMTAsMzExLDMxMiwzMTMsMzE0LDMxNSwzMTYsMzE3LDMxOCwzMTksMzIwLDMyMSwzMjIsMzIzLDMyNCwzMjUsMzI2LDMyNywzMjgsMzI5LDMzMCwzMzEsMzMyLDMzMywzMzQsMzM1LDMzNiwzMzcsMzM4LDMzOSwzNDAsMzQxLDM0MiwzNDMsMzQ0LDM0NSwzNDYsMzQ3LDM0OCwzNDksMzUwLDM1MSwzNTIsMzUzLDM1NCwzNTUsMzU2LDM1NywzNTgsMzU5LDM2MCwzNjEsMzYyLDM2MywzNjQsMzY1LDM2NiwzNjcsMzY4LDM2OSwzNzAsMzcxLDM3MiwzNzMsMzc0LDM3NSwzNzYsMzc3LDM3OCwzNzksMzgwLDM4MSwzODIsMzgzLDQwMiw1MDYsNTA3LDUwOCw1MDksNTEwLDUxMSw1MzYsNTM3LDUzOCw1MzksNzEwLDcxMSw3MTMsNzI4LDcyOSw3MzAsNzMxLDczMiw3MzMsOTAwLDkwMSw5MDIsOTAzLDkwNCw5MDUsOTA2LDkwOCw5MTAsOTExLDkxMiw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw5MzgsOTM5LDk0MCw5NDEsOTQyLDk0Myw5NDQsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjIsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LDk3MCw5NzEsOTcyLDk3Myw5NzQsMTAyNCwxMDI1LDEwMjYsMTAyNywxMDI4LDEwMjksMTAzMCwxMDMxLDEwMzIsMTAzMywxMDM0LDEwMzUsMTAzNiwxMDM3LDEwMzgsMTAzOSwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTA3OCwxMDc5LDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMDg4LDEwODksMTA5MCwxMDkxLDEwOTIsMTA5MywxMDk0LDEwOTUsMTA5NiwxMDk3LDEwOTgsMTA5OSwxMTAwLDExMDEsMTEwMiwxMTAzLDExMDQsMTEwNSwxMTA2LDExMDcsMTEwOCwxMTA5LDExMTAsMTExMSwxMTEyLDExMTMsMTExNCwxMTE1LDExMTYsMTExNywxMTE4LDExMTksMTEzOCwxMTM5LDExNjgsMTE2OSw3ODA4LDc4MDksNzgxMCw3ODExLDc4MTIsNzgxMyw3OTIyLDc5MjMsODIwOCw4MjA5LDgyMTEsODIxMiw4MjEzLDgyMTUsODIxNiw4MjE3LDgyMTgsODIxOSw4MjIwLDgyMjEsODIyMiw4MjI0LDgyMjUsODIyNiw4MjMwLDgyNDAsODI0Miw4MjQzLDgyNDksODI1MCw4MjUyLDgyNTQsODI2MCw4MzE5LDgzNTUsODM1Niw4MzU5LDgzNjQsODQ1Myw4NDY3LDg0NzAsODQ4Miw4NDg2LDg0OTQsODUzOSw4NTQwLDg1NDEsODU0Miw4NTkyLDg1OTMsODU5NCw4NTk1LDg1OTYsODU5Nyw4NjE2LDg3MDYsODcxMCw4NzE5LDg3MjEsODcyMiw4NzMwLDg3MzQsODczNSw4NzQ1LDg3NDcsODc3Niw4ODAwLDg4MDEsODgwNCw4ODA1LDg5NjIsODk3Niw4OTkyLDg5OTMsOTQ3Miw5NDc0LDk0ODQsOTQ4OCw5NDkyLDk0OTYsOTUwMCw5NTA4LDk1MTYsOTUyNCw5NTMyLDk1NTIsOTU1Myw5NTU0LDk1NTUsOTU1Niw5NTU3LDk1NTgsOTU1OSw5NTYwLDk1NjEsOTU2Miw5NTYzLDk1NjQsOTU2NSw5NTY2LDk1NjcsOTU2OCw5NTY5LDk1NzAsOTU3MSw5NTcyLDk1NzMsOTU3NCw5NTc1LDk1NzYsOTU3Nyw5NTc4LDk1NzksOTU4MCw5NjAwLDk2MDQsOTYwOCw5NjEyLDk2MTYsOTYxNyw5NjE4LDk2MTksOTYzMiw5NjMzLDk2NDIsOTY0Myw5NjQ0LDk2NTAsOTY1OCw5NjYwLDk2NjgsOTY3NCw5Njc1LDk2NzksOTY4OCw5Njg5LDk3MDIsOTc4Niw5Nzg3LDk3ODgsOTc5Miw5Nzk0LDk4MjQsOTgyNyw5ODI5LDk4MzAsOTgzNCw5ODM1LDk4MzYsNjE0NDEsNjE0NDIsNjE0NDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTFdO3QuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzPVszNjUsMCwzMzMsMjc4LDI3OCwzNTUsNTU2LDU1Niw4ODksNjY3LDE5MSwzMzMsMzMzLDM4OSw1ODQsMjc4LDMzMywyNzgsMjc4LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1NiwyNzgsMjc4LDU4NCw1ODQsNTg0LDU1NiwxMDE1LDY2Nyw2NjcsNzIyLDcyMiw2NjcsNjExLDc3OCw3MjIsMjc4LDUwMCw2NjcsNTU2LDgzMyw3MjIsNzc4LDY2Nyw3NzgsNzIyLDY2Nyw2MTEsNzIyLDY2Nyw5NDQsNjY3LDY2Nyw2MTEsMjc4LDI3OCwyNzgsNDY5LDU1NiwzMzMsNTU2LDU1Niw1MDAsNTU2LDU1NiwyNzgsNTU2LDU1NiwyMjIsMjIyLDUwMCwyMjIsODMzLDU1Niw1NTYsNTU2LDU1NiwzMzMsNTAwLDI3OCw1NTYsNTAwLDcyMiw1MDAsNTAwLDUwMCwzMzQsMjYwLDMzNCw1ODQsMzMzLDU1Niw1NTYsNTU2LDU1NiwyNjAsNTU2LDMzMyw3MzcsMzcwLDU1Niw1ODQsNzM3LDU1Miw0MDAsNTQ5LDMzMywzMzMsMzMzLDU3Niw1MzcsMjc4LDMzMywzMzMsMzY1LDU1Niw4MzQsODM0LDgzNCw2MTEsNjY3LDY2Nyw2NjcsNjY3LDY2Nyw2NjcsMWUzLDcyMiw2NjcsNjY3LDY2Nyw2NjcsMjc4LDI3OCwyNzgsMjc4LDcyMiw3MjIsNzc4LDc3OCw3NzgsNzc4LDc3OCw1ODQsNzc4LDcyMiw3MjIsNzIyLDcyMiw2NjcsNjY3LDYxMSw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw4ODksNTAwLDU1Niw1NTYsNTU2LDU1NiwyNzgsMjc4LDI3OCwyNzgsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU0OSw2MTEsNTU2LDU1Niw1NTYsNTU2LDUwMCw1NTYsNTAwLDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDcyMiw1MDAsNzIyLDUwMCw3MjIsNTAwLDcyMiw1MDAsNzIyLDYxNSw3MjIsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw3NzgsNTU2LDc3OCw1NTYsNzc4LDU1Niw3NzgsNTU2LDcyMiw1NTYsNzIyLDU1NiwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjIyLDI3OCwyNzgsNzM1LDQ0NCw1MDAsMjIyLDY2Nyw1MDAsNTAwLDU1NiwyMjIsNTU2LDIyMiw1NTYsMjkyLDU1NiwzMzQsNTU2LDIyMiw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw2MDQsNzIzLDU1Niw3NzgsNTU2LDc3OCw1NTYsNzc4LDU1NiwxZTMsOTQ0LDcyMiwzMzMsNzIyLDMzMyw3MjIsMzMzLDY2Nyw1MDAsNjY3LDUwMCw2NjcsNTAwLDY2Nyw1MDAsNjExLDI3OCw2MTEsMzc1LDYxMSwyNzgsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsOTQ0LDcyMiw2NjcsNTAwLDY2Nyw2MTEsNTAwLDYxMSw1MDAsNjExLDUwMCwyMjIsNTU2LDY2Nyw1NTYsMWUzLDg4OSw3NzgsNjExLDY2Nyw1MDAsNjExLDI3OCwzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDY2NywyNzgsNzg0LDgzOCwzODQsNzc0LDg1NSw3NTIsMjIyLDY2Nyw2NjcsNTUxLDY2OCw2NjcsNjExLDcyMiw3NzgsMjc4LDY2Nyw2NjgsODMzLDcyMiw2NTAsNzc4LDcyMiw2NjcsNjE4LDYxMSw2NjcsNzk4LDY2Nyw4MzUsNzQ4LDI3OCw2NjcsNTc4LDQ0Niw1NTYsMjIyLDU0Nyw1NzgsNTc1LDUwMCw1NTcsNDQ2LDQ0MSw1NTYsNTU2LDIyMiw1MDAsNTAwLDU3Niw1MDAsNDQ4LDU1Niw2OTAsNTY5LDQ4Miw2MTcsMzk1LDU0Nyw2NDgsNTI1LDcxMyw3ODEsMjIyLDU0Nyw1NTYsNTQ3LDc4MSw2NjcsNjY3LDg2NSw1NDIsNzE5LDY2NywyNzgsMjc4LDUwMCwxMDU3LDEwMTAsODU0LDU4Myw3MjIsNjM1LDcxOSw2NjcsNjU2LDY2Nyw1NDIsNjc3LDY2Nyw5MjMsNjA0LDcxOSw3MTksNTgzLDY1Niw4MzMsNzIyLDc3OCw3MTksNjY3LDcyMiw2MTEsNjM1LDc2MCw2NjcsNzQwLDY2Nyw5MTcsOTM4LDc5Miw4ODUsNjU2LDcxOSwxMDEwLDcyMiw1NTYsNTczLDUzMSwzNjUsNTgzLDU1Niw2NjksNDU4LDU1OSw1NTksNDM4LDU4Myw2ODgsNTUyLDU1Niw1NDIsNTU2LDUwMCw0NTgsNTAwLDgyMyw1MDAsNTczLDUyMSw4MDIsODIzLDYyNSw3MTksNTIxLDUxMCw3NTAsNTQyLDU1Niw1NTYsNTU2LDM2NSw1MTAsNTAwLDIyMiwyNzgsMjIyLDkwNiw4MTIsNTU2LDQzOCw1NTksNTAwLDU1Miw3NzgsNTU2LDQ4OSw0MTEsOTQ0LDcyMiw5NDQsNzIyLDk0NCw3MjIsNjY3LDUwMCwzMzMsMzMzLDU1NiwxZTMsMWUzLDU1MiwyMjIsMjIyLDIyMiwyMjIsMzMzLDMzMywzMzMsNTU2LDU1NiwzNTAsMWUzLDFlMywxODgsMzU0LDMzMywzMzMsNTAwLDMzMywxNjcsMzY1LDU1Niw1NTYsMTA5NCw1NTYsODg1LDMyMywxMDczLDFlMyw3NjgsNjAwLDgzNCw4MzQsODM0LDgzNCwxZTMsNTAwLDFlMyw1MDAsMWUzLDUwMCw1MDAsNDk0LDYxMiw4MjMsNzEzLDU4NCw1NDksNzEzLDk3OSw3MTksMjc0LDU0OSw1NDksNTgzLDU0OSw1NDksNjA0LDU4NCw2MDQsNjA0LDcwOCw2MjUsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzI5LDYwNCw2MDQsMzU0LDM1NCwxZTMsOTkwLDk5MCw5OTAsOTkwLDQ5NCw2MDQsNjA0LDYwNCw2MDQsMzU0LDEwMjEsMTA1Miw5MTcsNzUwLDc1MCw1MzEsNjU2LDU5NCw1MTAsNTAwLDc1MCw3NTAsNTAwLDUwMCwzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDIyMiwyMjIsMjk0LDI5NCwzMjQsMzI0LDMxNiwzMjgsMzk4LDI4NV07dC5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nPVstMSwtMSwtMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwLDExMSwxMTIsMTEzLDExNCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEyMywxMjQsMTI1LDEyNiwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwyNTUsMjU2LDI1NywyNTgsMjU5LDI2MCwyNjEsMjYyLDI2MywyNjQsMjY1LDI2NiwyNjcsMjY4LDI2OSwyNzAsMjcxLDI3MiwyNzMsMjc0LDI3NSwyNzYsMjc3LDI3OCwyNzksMjgwLDI4MSwyODIsMjgzLDI4NCwyODUsMjg2LDI4NywyODgsMjg5LDI5MCwyOTEsMjkyLDI5MywyOTQsMjk1LDI5NiwyOTcsMjk4LDI5OSwzMDAsMzAxLDMwMiwzMDMsMzA0LDMwNSwzMDYsMzA3LDMwOCwzMDksMzEwLDMxMSwzMTIsMzEzLDMxNCwzMTUsMzE2LDMxNywzMTgsMzE5LDMyMCwzMjEsMzIyLDMyMywzMjQsMzI1LDMyNiwzMjcsMzI4LDMyOSwzMzAsMzMxLDMzMiwzMzMsMzM0LDMzNSwzMzYsMzM3LDMzOCwzMzksMzQwLDM0MSwzNDIsMzQzLDM0NCwzNDUsMzQ2LDM0NywzNDgsMzQ5LDM1MCwzNTEsMzUyLDM1MywzNTQsMzU1LDM1NiwzNTcsMzU4LDM1OSwzNjAsMzYxLDM2MiwzNjMsMzY0LDM2NSwzNjYsMzY3LDM2OCwzNjksMzcwLDM3MSwzNzIsMzczLDM3NCwzNzUsMzc2LDM3NywzNzgsMzc5LDM4MCwzODEsMzgyLDM4Myw0MDIsNTA2LDUwNyw1MDgsNTA5LDUxMCw1MTEsNTM2LDUzNyw1MzgsNTM5LDcxMCw3MTEsNzEzLDcyOCw3MjksNzMwLDczMSw3MzIsNzMzLDkwMCw5MDEsOTAyLDkwMyw5MDQsOTA1LDkwNiw5MDgsOTEwLDkxMSw5MTIsOTEzLDkxNCw5MTUsOTE2LDkxNyw5MTgsOTE5LDkyMCw5MjEsOTIyLDkyMyw5MjQsOTI1LDkyNiw5MjcsOTI4LDkyOSw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsOTM4LDkzOSw5NDAsOTQxLDk0Miw5NDMsOTQ0LDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYyLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSw5NzAsOTcxLDk3Miw5NzMsOTc0LDEwMjQsMTAyNSwxMDI2LDEwMjcsMTAyOCwxMDI5LDEwMzAsMTAzMSwxMDMyLDEwMzMsMTAzNCwxMDM1LDEwMzYsMTAzNywxMDM4LDEwMzksMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMywxMTA0LDExMDUsMTEwNiwxMTA3LDExMDgsMTEwOSwxMTEwLDExMTEsMTExMiwxMTEzLDExMTQsMTExNSwxMTE2LDExMTcsMTExOCwxMTE5LDExMzgsMTEzOSwxMTY4LDExNjksNzgwOCw3ODA5LDc4MTAsNzgxMSw3ODEyLDc4MTMsNzkyMiw3OTIzLDgyMDgsODIwOSw4MjExLDgyMTIsODIxMyw4MjE1LDgyMTYsODIxNyw4MjE4LDgyMTksODIyMCw4MjIxLDgyMjIsODIyNCw4MjI1LDgyMjYsODIzMCw4MjQwLDgyNDIsODI0Myw4MjQ5LDgyNTAsODI1Miw4MjU0LDgyNjAsODMxOSw4MzU1LDgzNTYsODM1OSw4MzY0LDg0NTMsODQ2Nyw4NDcwLDg0ODIsODQ4Niw4NDk0LDg1MzksODU0MCw4NTQxLDg1NDIsODU5Miw4NTkzLDg1OTQsODU5NSw4NTk2LDg1OTcsODYxNiw4NzA2LDg3MTAsODcxOSw4NzIxLDg3MjIsODczMCw4NzM0LDg3MzUsODc0NSw4NzQ3LDg3NzYsODgwMCw4ODAxLDg4MDQsODgwNSw4OTYyLDg5NzYsODk5Miw4OTkzLDk0NzIsOTQ3NCw5NDg0LDk0ODgsOTQ5Miw5NDk2LDk1MDAsOTUwOCw5NTE2LDk1MjQsOTUzMiw5NTUyLDk1NTMsOTU1NCw5NTU1LDk1NTYsOTU1Nyw5NTU4LDk1NTksOTU2MCw5NTYxLDk1NjIsOTU2Myw5NTY0LDk1NjUsOTU2Niw5NTY3LDk1NjgsOTU2OSw5NTcwLDk1NzEsOTU3Miw5NTczLDk1NzQsOTU3NSw5NTc2LDk1NzcsOTU3OCw5NTc5LDk1ODAsOTYwMCw5NjA0LDk2MDgsOTYxMiw5NjE2LDk2MTcsOTYxOCw5NjE5LDk2MzIsOTYzMyw5NjQyLDk2NDMsOTY0NCw5NjUwLDk2NTgsOTY2MCw5NjY4LDk2NzQsOTY3NSw5Njc5LDk2ODgsOTY4OSw5NzAyLDk3ODYsOTc4Nyw5Nzg4LDk3OTIsOTc5NCw5ODI0LDk4MjcsOTgyOSw5ODMwLDk4MzQsOTgzNSw5ODM2LDYxNDQxLDYxNDQyLDYxNDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xXX0sKGUsdCk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuTXlyaWFkUHJvUmVndWxhck1ldHJpY3M9dC5NeXJpYWRQcm9SZWd1bGFyRmFjdG9ycz10Lk15cmlhZFByb0l0YWxpY01ldHJpY3M9dC5NeXJpYWRQcm9JdGFsaWNGYWN0b3JzPXQuTXlyaWFkUHJvQm9sZE1ldHJpY3M9dC5NeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcz10Lk15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzPXQuTXlyaWFkUHJvQm9sZEZhY3RvcnM9dm9pZCAwO3QuTXlyaWFkUHJvQm9sZEZhY3RvcnM9WzEuMzY4OTgsMSwxLC43MjcwNiwuODA0NzksLjgzNzM0LC45ODg5NCwuOTk3OTMsLjk4OTcsLjkzODg0LC44NjIwOSwuOTQyOTIsLjk0MjkyLDEuMTY2NjEsMS4wMjA1OCwuOTM1ODIsLjk2Njk0LC45MzU4MiwxLjE5MTM3LC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywuNzgwNzYsLjc4MDc2LDEuMDIwNTgsMS4wMjA1OCwxLjAyMDU4LC43Mjg1MSwuNzg5NjYsLjkwODM4LC44MzYzNywuODIzOTEsLjk2Mzc2LC44MDA2MSwuODYyNzUsLjg3NjgsLjk1NDA3LDEuMDI1OCwuNzM5MDEsLjg1MDIyLC44MzY1NSwxLjAxNTYsLjk1NTQ2LC45MjE3OSwuODcxMDcsLjkyMTc5LC44MjExNCwuODA5NiwuODk3MTMsLjk0NDM4LC45NTM1MywuOTQwODMsLjkxOTA1LC45MDQwNiwuOTQ0NiwuOTQyOTIsMS4xODc3NywuOTQyOTIsMS4wMjA1OCwuODk5MDMsLjkwMDg4LC45NDkzOCwuOTc4OTgsLjgxMDkzLC45NzU3MSwuOTQ5MzgsMS4wMjQsLjk1NzcsLjk1OTMzLC45ODYyMSwxLjA0NzQsLjk3NDU1LC45ODk4MSwuOTY3MiwuOTU5MzMsLjk0NDYsLjk3ODk4LC45NzQwNywuOTc2NDYsLjc4MDM2LDEuMTAyMDgsLjk1NDQyLC45NTI5OCwuOTc1NzksLjkzMzIsLjk0MDM5LC45MzgsLjgwNjg3LDEuMDExNDksLjgwNjg3LDEuMDIwNTgsLjgwNDc5LC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywxLjAxMTQ5LDEuMDA4NzIsLjkwMDg4LC45MTg4MiwxLjAyMTMsLjgzNjEsMS4wMjA1OCwuNjIyOTUsLjU0MzI0LC44OTAyMiwxLjA4NTk1LDEsMSwuOTAwODgsMSwuOTc0NTUsLjkzNTgyLC45MDA4OCwxLDEuMDU2ODYsLjgzNjEsLjk5NjQyLC45OTY0MiwuOTk2NDIsLjcyODUxLC45MDgzOCwuOTA4MzgsLjkwODM4LC45MDgzOCwuOTA4MzgsLjkwODM4LC44NjgsLjgyMzkxLC44MDA2MSwuODAwNjEsLjgwMDYxLC44MDA2MSwxLjAyNTgsMS4wMjU4LDEuMDI1OCwxLjAyNTgsLjk3NDg0LC45NTU0NiwuOTIxNzksLjkyMTc5LC45MjE3OSwuOTIxNzksLjkyMTc5LDEuMDIwNTgsLjkyMTc5LC45NDQzOCwuOTQ0MzgsLjk0NDM4LC45NDQzOCwuOTA0MDYsLjg2OTU4LC45ODIyNSwuOTQ5MzgsLjk0OTM4LC45NDkzOCwuOTQ5MzgsLjk0OTM4LC45NDkzOCwuOTAzMSwuODEwOTMsLjk0OTM4LC45NDkzOCwuOTQ5MzgsLjk0OTM4LC45ODYyMSwuOTg2MjEsLjk4NjIxLC45ODYyMSwuOTM5NjksLjk1OTMzLC45NDQ2LC45NDQ2LC45NDQ2LC45NDQ2LC45NDQ2LDEuMDg1OTUsLjk0NDYsLjk1NDQyLC45NTQ0MiwuOTU0NDIsLjk1NDQyLC45NDAzOSwuOTc4OTgsLjk0MDM5LC45MDgzOCwuOTQ5MzgsLjkwODM4LC45NDkzOCwuOTA4MzgsLjk0OTM4LC44MjM5MSwuODEwOTMsLjgyMzkxLC44MTA5MywuODIzOTEsLjgxMDkzLC44MjM5MSwuODEwOTMsLjk2Mzc2LC44NDMxMywuOTc0ODQsLjk3NTcxLC44MDA2MSwuOTQ5MzgsLjgwMDYxLC45NDkzOCwuODAwNjEsLjk0OTM4LC44MDA2MSwuOTQ5MzgsLjgwMDYxLC45NDkzOCwuODc2OCwuOTU3NywuODc2OCwuOTU3NywuODc2OCwuOTU3NywxLDEsLjk1NDA3LC45NTkzMywuOTcwNjksLjk1OTMzLDEuMDI1OCwuOTg2MjEsMS4wMjU4LC45ODYyMSwxLjAyNTgsLjk4NjIxLDEuMDI1OCwuOTg2MjEsMS4wMjU4LC45ODYyMSwuODg3LDEuMDE1OTEsLjczOTAxLDEuMDQ3NCwxLDEsLjk3NDU1LC44MzY1NSwuOTg5ODEsMSwxLC44MzY1NSwuNzM5NzcsLjgzNjU1LC43MzkwMywuODQ2MzgsMS4wMzMsLjk1NTQ2LC45NTkzMywxLDEsLjk1NTQ2LC45NTkzMywuODI3MSwuOTU0MTcsLjk1OTMzLC45MjE3OSwuOTQ0NiwuOTIxNzksLjk0NDYsLjkyMTc5LC45NDQ2LC45MzYsLjkxOTY0LC44MjExNCwuOTc2NDYsMSwxLC44MjExNCwuOTc2NDYsLjgwOTYsLjc4MDM2LC44MDk2LC43ODAzNiwxLDEsLjgwOTYsLjc4MDM2LDEsMSwuODk3MTMsLjc3NDUyLC44OTcxMywxLjEwMjA4LC45NDQzOCwuOTU0NDIsLjk0NDM4LC45NTQ0MiwuOTQ0MzgsLjk1NDQyLC45NDQzOCwuOTU0NDIsLjk0NDM4LC45NTQ0MiwuOTQ0MzgsLjk1NDQyLC45NDA4MywuOTc1NzksLjkwNDA2LC45NDAzOSwuOTA0MDYsLjk0NDYsLjkzOCwuOTQ0NiwuOTM4LC45NDQ2LC45MzgsMSwuOTk3OTMsLjkwODM4LC45NDkzOCwuODY4LC45MDMxLC45MjE3OSwuOTQ0NiwxLDEsLjg5NzEzLDEuMTAyMDgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwOTg5LC45MzU4LC45MTk0NSwuODMxODEsLjc1MjYxLC44Nzk5MiwuODI5NzYsLjk2MDM0LC44MzY4OSwuOTcyNjgsMS4wMDc4LC45MDgzOCwuODM2MzcsLjgwMTksLjkwMTU3LC44MDA2MSwuOTQ0NiwuOTU0MDcsLjkyNDM2LDEuMDI1OCwuODUwMjIsLjk3MTUzLDEuMDE1NiwuOTU1NDYsLjg5MTkyLC45MjE3OSwuOTIzNjEsLjg3MTA3LC45NjMxOCwuODk3MTMsLjkzNzA0LC45NTYzOCwuOTE5MDUsLjkxNzA5LC45Mjc5NiwxLjAyNTgsLjkzNzA0LC45NDgzNiwxLjAzNzMsLjk1OTMzLDEuMDA3OCwuOTU4NzEsLjk0ODM2LC45NjE3NCwuOTI2MDEsLjk0OTgsLjk4NjA3LC45NTc3NiwuOTU5MzMsMS4wNTQ1MywxLjAwNzgsLjk4Mjc1LC45MzE0LC45NTYxNywuOTE3MDEsMS4wNTk5MywuOTQ0NiwuNzgzNjcsLjk1NTMsMSwuODY4MzIsMS4wMTI4LC45NTg3MSwuOTkzOTQsLjg3NTQ4LC45NjM2MSwuODY3NzQsMS4wMDc4LC45NTg3MSwuOTQ0NiwuOTU4NzEsLjg2Nzc0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjk0MDgzLC45NzU3OSwuOTQwODMsLjk3NTc5LC45NDA4MywuOTc1NzksLjkwNDA2LC45NDAzOSwuOTY2OTQsMSwuODk5MDMsMSwxLDEsLjkzNTgyLC45MzU4MiwuOTM1ODIsMSwuOTA4LC45MDgsLjkxOCwuOTQyMTksLjk0MjE5LC45NjU0NCwxLDEuMjg1LDEsMSwuODEwNzksLjgxMDc5LDEsMSwuNzQ4NTQsMSwxLDEsMSwuOTk3OTMsMSwxLDEsLjY1LDEsMS4zNjE0NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4xNzE3MywxLC44MDUzNSwuNzYxNjksMS4wMjA1OCwxLjA3MzIsMS4wNTQ4NiwxLDEsMS4zMDY5MiwxLjA4NTk1LDEuMDg1OTUsMSwxLjA4NTk1LDEuMDg1OTUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjE2MTYxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdO3QuTXlyaWFkUHJvQm9sZE1ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yLGxpbmVHYXA6LjJ9O3QuTXlyaWFkUHJvQm9sZEl0YWxpY0ZhY3RvcnM9WzEuMzY4OTgsMSwxLC42NjIyNywuODA3NzksLjgxNjI1LC45NzI3NiwuOTcyNzYsLjk3NzMzLC45MjIyMiwuODMyNjYsLjk0MjkyLC45NDI5MiwxLjE2MTQ4LDEuMDIwNTgsLjkzNTgyLC45NjY5NCwuOTM1ODIsMS4xNzMzNywuOTcyNzYsLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjc4MDc2LC43ODA3NiwxLjAyMDU4LDEuMDIwNTgsMS4wMjA1OCwuNzE1NDEsLjc2ODEzLC44NTU3NiwuODA1OTEsLjgwNzI5LC45NDI5OSwuNzc1MTIsLjgzNjU1LC44NjUyMywuOTIyMjIsLjk4NjIxLC43MTc0MywuODE2OTgsLjc5NzI2LC45ODU1OCwuOTIyMjIsLjkwNjM3LC44MzgwOSwuOTA2MzcsLjgwNzI5LC43NjQ2MywuODYyNzUsLjkwNjk5LC45MTYwNSwuOTE1NCwuODUzMDgsLjg1NDU4LC45MDUzMSwuOTQyOTIsMS4yMTI5NiwuOTQyOTIsMS4wMjA1OCwuODk5MDMsMS4xODYxNiwuOTk2MTMsLjkxNjc3LC43ODIxNiwuOTE2NzcsLjkwMDgzLC45ODc5NiwuOTEzNSwuOTIxNjgsLjk1MzgxLC45ODk4MSwuOTUyOTgsLjk1MzgxLC45MzQ1OSwuOTIxNjgsLjkxNTEzLC45MjAwNCwuOTE2NzcsLjk1MDc3LC43NDgsMS4wNDUwMiwuOTE2NzcsLjkyMDYxLC45NDIzNiwuODk1NDQsLjg5MzY0LC45LC44MDY4NywuODU3OCwuODA2ODcsMS4wMjA1OCwuODA3NzksLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjk3Mjc2LC44NTc4LC45OTk3MywxLjE4NjE2LC45MTMzOSwxLjA4MDc0LC44Mjg5MSwxLjAyMDU4LC41NTUwOSwuNzE1MjYsLjg5MDIyLDEuMDg1OTUsMSwxLDEuMTg2MTYsMSwuOTY3MzYsLjkzNTgyLDEuMTg2MTYsMSwxLjA0ODY0LC44MjcxMSwuOTkwNDMsLjk5MDQzLC45OTA0MywuNzE1NDEsLjg1NTc2LC44NTU3NiwuODU1NzYsLjg1NTc2LC44NTU3NiwuODU1NzYsLjg0NSwuODA3MjksLjc3NTEyLC43NzUxMiwuNzc1MTIsLjc3NTEyLC45ODYyMSwuOTg2MjEsLjk4NjIxLC45ODYyMSwuOTU5NjEsLjkyMjIyLC45MDYzNywuOTA2MzcsLjkwNjM3LC45MDYzNywuOTA2MzcsMS4wMjA1OCwuOTAyNTEsLjkwNjk5LC45MDY5OSwuOTA2OTksLjkwNjk5LC44NTQ1OCwuODM2NTksLjk0OTUxLC45OTYxMywuOTk2MTMsLjk5NjEzLC45OTYxMywuOTk2MTMsLjk5NjEzLC44NTgxMSwuNzgyMTYsLjkwMDgzLC45MDA4MywuOTAwODMsLjkwMDgzLC45NTM4MSwuOTUzODEsLjk1MzgxLC45NTM4MSwuOTEzNSwuOTIxNjgsLjkxNTEzLC45MTUxMywuOTE1MTMsLjkxNTEzLC45MTUxMywxLjA4NTk1LC45MTY3NywuOTE2NzcsLjkxNjc3LC45MTY3NywuOTE2NzcsLjg5MzY0LC45MjMzMiwuODkzNjQsLjg1NTc2LC45OTYxMywuODU1NzYsLjk5NjEzLC44NTU3NiwuOTk2MTMsLjgwNzI5LC43ODIxNiwuODA3MjksLjc4MjE2LC44MDcyOSwuNzgyMTYsLjgwNzI5LC43ODIxNiwuOTQyOTksLjc2NzgzLC45NTk2MSwuOTE2NzcsLjc3NTEyLC45MDA4MywuNzc1MTIsLjkwMDgzLC43NzUxMiwuOTAwODMsLjc3NTEyLC45MDA4MywuNzc1MTIsLjkwMDgzLC44NjUyMywuOTEzNSwuODY1MjMsLjkxMzUsLjg2NTIzLC45MTM1LDEsMSwuOTIyMjIsLjkyMTY4LC45MjIyMiwuOTIxNjgsLjk4NjIxLC45NTM4MSwuOTg2MjEsLjk1MzgxLC45ODYyMSwuOTUzODEsLjk4NjIxLC45NTM4MSwuOTg2MjEsLjk1MzgxLC44NjAzNiwuOTcwOTYsLjcxNzQzLC45ODk4MSwxLDEsLjk1Mjk4LC43OTcyNiwuOTUzODEsMSwxLC43OTcyNiwuNjg5NCwuNzk3MjYsLjc0MzIxLC44MTY5MSwxLjAwMDYsLjkyMjIyLC45MjE2OCwxLDEsLjkyMjIyLC45MjE2OCwuNzk0NjQsLjkyMDk4LC45MjE2OCwuOTA2MzcsLjkxNTEzLC45MDYzNywuOTE1MTMsLjkwNjM3LC45MTUxMywuOTA5LC44NzUxNCwuODA3MjksLjk1MDc3LDEsMSwuODA3MjksLjk1MDc3LC43NjQ2MywuNzQ4LC43NjQ2MywuNzQ4LDEsMSwuNzY0NjMsLjc0OCwxLDEsLjg2Mjc1LC43MjY1MSwuODYyNzUsMS4wNDUwMiwuOTA2OTksLjkxNjc3LC45MDY5OSwuOTE2NzcsLjkwNjk5LC45MTY3NywuOTA2OTksLjkxNjc3LC45MDY5OSwuOTE2NzcsLjkwNjk5LC45MTY3NywuOTE1NCwuOTQyMzYsLjg1NDU4LC44OTM2NCwuODU0NTgsLjkwNTMxLC45LC45MDUzMSwuOSwuOTA1MzEsLjksMSwuOTcyNzYsLjg1NTc2LC45OTYxMywuODQ1LC44NTgxMSwuOTAyNTEsLjkxNjc3LDEsMSwuODYyNzUsMS4wNDUwMiwxLjE4NjE2LDEuMTg2MTYsMS4xODYxNiwxLjE4NjE2LDEuMTg2MTYsMS4xODYxNiwxLjE4NjE2LDEuMTg2MTYsMS4xODYxNiwxLjAwODk5LDEuMzA2MjgsLjg1NTc2LC44MDE3OCwuNjY4NjIsLjc5MjcsLjY5MzIzLC44ODEyNywuNzI0NTksLjg5NzExLC45NTM4MSwuODU1NzYsLjgwNTkxLC43ODA1LC45NDcyOSwuNzc1MTIsLjkwNTMxLC45MjIyMiwuOTA2MzcsLjk4NjIxLC44MTY5OCwuOTI2NTUsLjk4NTU4LC45MjIyMiwuODUzNTksLjkwNjM3LC45MDk3NiwuODM4MDksLjk0NTIzLC44NjI3NSwuODM1MDksLjkzMTU3LC44NTMwOCwuODMzOTIsLjkyMzQ2LC45ODYyMSwuODM1MDksLjkyODg2LC45MTMyNCwuOTIxNjgsLjk1MzgxLC45MDY0NiwuOTI4ODYsLjkwNTU3LC44Njg0NywuOTAyNzYsLjkxMzI0LC44Njg0MiwuOTIxNjgsLjk5NTMxLC45NTM4MSwuOTIyNCwuODU0MDgsLjkyNjk5LC44Njg0NywxLjAwNTEsLjkxNTEzLC44MDQ4NywuOTM0ODEsMSwuODgxNTksMS4wNTIxNCwuOTA2NDYsLjk3MzU1LC44MTUzOSwuODkzOTgsLjg1OTIzLC45NTM4MSwuOTA2NDYsLjkxNTEzLC45MDY0NiwuODU5MjMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTE1NCwuOTQyMzYsLjkxNTQsLjk0MjM2LC45MTU0LC45NDIzNiwuODU0NTgsLjg5MzY0LC45NjY5NCwxLC44OTkwMywxLDEsMSwuOTE3ODIsLjkxNzgyLC45MTc4MiwxLC44OTYsLjg5NiwuODk2LC45MzMyLC45MzMyLC45NTk3MywxLDEuMjYsMSwxLC44MDQ3OSwuODAxNzgsMSwxLC44NTYzMywxLDEsMSwxLC45NzI3NiwxLDEsMSwuNjk4LDEsMS4zNjE0NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4xNDU0MiwxLC43OTE5OSwuNzg2OTQsMS4wMjA1OCwxLjAzNDkzLDEuMDU0ODYsMSwxLDEuMjMwMjYsMS4wODU5NSwxLjA4NTk1LDEsMS4wODU5NSwxLjA4NTk1LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4yMDAwNiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXTt0Lk15cmlhZFByb0JvbGRJdGFsaWNNZXRyaWNzPXtsaW5lSGVpZ2h0OjEuMixsaW5lR2FwOi4yfTt0Lk15cmlhZFByb0l0YWxpY0ZhY3RvcnM9WzEuMzY4OTgsMSwxLC42NTUwNywuODQ5NDMsLjg1NjM5LC44ODQ2NSwuODg0NjUsLjg2OTM2LC44ODMwNywuODY5NDgsLjg1MjgzLC44NTI4MywxLjA2MzgzLDEuMDIwNTgsLjc1OTQ1LC45MjE5LC43NTk0NSwxLjE3MzM3LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44ODQ2NSwuNzU5NDUsLjc1OTQ1LDEuMDIwNTgsMS4wMjA1OCwxLjAyMDU4LC42OTA0NiwuNzA5MjYsLjg1MTU4LC43NzgxMiwuNzY4NTIsLjg5NTkxLC43MDQ2NiwuNzYxMjUsLjgwMDk0LC44NjgyMiwuODM4NjQsLjcyOCwuNzcyMTIsLjc5NDc1LC45MzYzNywuODc1MTQsLjg1ODgsLjc2MDEzLC44NTg4LC43MjQyMSwuNjk4NjYsLjc3NTk4LC44NTk5MSwuODA4MTEsLjg3ODMyLC43ODExMiwuNzc1MTIsLjg1NjIsMS4wMjIyLDEuMTg0MTcsMS4wMjIyLDEuMjcwMTQsLjg5OTAzLDEuMTUwMTIsLjkzODU5LC45NDM5OSwuODQ2LC45NDM5OSwuODE0NTMsMS4wMTg2LC45NDIxOSwuOTYwMTcsMS4wMzA3NSwxLjAyMTc1LC45MTIsMS4wMzA3NSwuOTY5OTgsLjk2MDE3LC45Mzg1OSwuOTQzOTksLjk0Mzk5LC45NTQ5MywuNzQ2LDEuMTI2NTgsLjk0NTc4LC45MSwuOTc5LC44ODIsLjg4MiwuODMsLjg1MDM0LC44MzUzNywuODUwMzQsMS4wMjA1OCwuNzA4NjksLjg4NDY1LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44MzUzNywuOTAwODMsMS4xNTAxMiwuOTE2MSwuOTQ1NjUsLjczNTQxLDEuMDIwNTgsLjUzNjA5LC42OTM1MywuNzk1MTksMS4wODU5NSwxLDEsMS4xNTAxMiwxLC45MTk3NCwuNzU5NDUsMS4xNTAxMiwxLC45NDQ2LC43MzM2MSwuOTAwNSwuOTAwNSwuOTAwNSwuNjI4NjQsLjg1MTU4LC44NTE1OCwuODUxNTgsLjg1MTU4LC44NTE1OCwuODUxNTgsLjc3MywuNzY4NTIsLjcwNDY2LC43MDQ2NiwuNzA0NjYsLjcwNDY2LC44Mzg2NCwuODM4NjQsLjgzODY0LC44Mzg2NCwuOTA1NjEsLjg3NTE0LC44NTg4LC44NTg4LC44NTg4LC44NTg4LC44NTg4LDEuMDIwNTgsLjg1NzUxLC44NTk5MSwuODU5OTEsLjg1OTkxLC44NTk5MSwuNzc1MTIsLjc2MDEzLC44ODA3NSwuOTM4NTksLjkzODU5LC45Mzg1OSwuOTM4NTksLjkzODU5LC45Mzg1OSwuODA3NSwuODQ2LC44MTQ1MywuODE0NTMsLjgxNDUzLC44MTQ1MywuODI0MjQsLjgyNDI0LC44MjQyNCwuODI0MjQsLjkyNzgsLjk2MDE3LC45Mzg1OSwuOTM4NTksLjkzODU5LC45Mzg1OSwuOTM4NTksMS4wODU5NSwuODU2MiwuOTQ1NzgsLjk0NTc4LC45NDU3OCwuOTQ1NzgsLjg4MiwuOTQ1NzgsLjg4MiwuODUxNTgsLjkzODU5LC44NTE1OCwuOTM4NTksLjg1MTU4LC45Mzg1OSwuNzY4NTIsLjg0NiwuNzY4NTIsLjg0NiwuNzY4NTIsLjg0NiwuNzY4NTIsLjg0NiwuODk1OTEsLjg1NDQsLjkwNTYxLC45NDM5OSwuNzA0NjYsLjgxNDUzLC43MDQ2NiwuODE0NTMsLjcwNDY2LC44MTQ1MywuNzA0NjYsLjgxNDUzLC43MDQ2NiwuODE0NTMsLjgwMDk0LC45NDIxOSwuODAwOTQsLjk0MjE5LC44MDA5NCwuOTQyMTksMSwxLC44NjgyMiwuOTYwMTcsLjg2ODIyLC45NjAxNywuODM4NjQsLjgyNDI0LC44Mzg2NCwuODI0MjQsLjgzODY0LC44MjQyNCwuODM4NjQsMS4wMzA3NSwuODM4NjQsLjgyNDI0LC44MTQwMiwxLjAyNzM4LC43MjgsMS4wMjE3NSwxLDEsLjkxMiwuNzk0NzUsMS4wMzA3NSwxLDEsLjc5NDc1LC44MzkxMSwuNzk0NzUsLjY2MjY2LC44MDU1MywxLjA2Njc2LC44NzUxNCwuOTYwMTcsMSwxLC44NzUxNCwuOTYwMTcsLjg2ODY1LC44NzM5NiwuOTYwMTcsLjg1ODgsLjkzODU5LC44NTg4LC45Mzg1OSwuODU4OCwuOTM4NTksLjg2NywuODQ3NTksLjcyNDIxLC45NTQ5MywxLDEsLjcyNDIxLC45NTQ5MywuNjk4NjYsLjc0NiwuNjk4NjYsLjc0NiwxLDEsLjY5ODY2LC43NDYsMSwxLC43NzU5OCwuODg0MTcsLjc3NTk4LDEuMTI2NTgsLjg1OTkxLC45NDU3OCwuODU5OTEsLjk0NTc4LC44NTk5MSwuOTQ1NzgsLjg1OTkxLC45NDU3OCwuODU5OTEsLjk0NTc4LC44NTk5MSwuOTQ1NzgsLjg3ODMyLC45NzksLjc3NTEyLC44ODIsLjc3NTEyLC44NTYyLC44MywuODU2MiwuODMsLjg1NjIsLjgzLDEsLjg4NDY1LC44NTE1OCwuOTM4NTksLjc3MywuODA3NSwuODU3NTEsLjg1NjIsMSwxLC43NzU5OCwxLjEyNjU4LDEuMTUwMTIsMS4xNTAxMiwxLjE1MDEyLDEuMTUwMTIsMS4xNTAxMiwxLjE1MzEzLDEuMTUwMTIsMS4xNTAxMiwxLjE1MDEyLDEuMDgxMDYsMS4wMzkwMSwuODUxNTgsLjc3MDI1LC42MjI2NCwuNzY0NiwuNjUzNTEsLjg2MDI2LC42OTQ2MSwuODk5NDcsMS4wMzA3NSwuODUxNTgsLjc3ODEyLC43NjQ0OSwuODg4MzYsLjcwNDY2LC44NTYyLC44NjgyMiwuODU4OCwuODM4NjQsLjc3MjEyLC44NTMwOCwuOTM2MzcsLjg3NTE0LC44MjM1MiwuODU4OCwuODU3MDEsLjc2MDEzLC44OTA1OCwuNzc1OTgsLjgxNTYsLjgyNTY1LC43ODExMiwuNzc4OTksLjg5Mzg2LC44Mzg2NCwuODE1NiwuOTQ4NiwuOTIzODgsLjk2MTg2LDEuMDMwNzUsLjkxMTIzLC45NDg2LC45MzI5OCwuODc4LC45Mzk0MiwuOTIzODgsLjg0NTk2LC45NjE4NiwuOTUxMTksMS4wMzA3NSwuOTIyLC44ODc4NywuOTU4MjksLjg4LC45MzU1OSwuOTM4NTksLjc4ODE1LC45Mzc1OCwxLC44OTIxNywxLjAzNzM3LC45MTEyMywuOTM5NjksLjc3NDg3LC44NTc2OSwuODY3OTksMS4wMzA3NSwuOTExMjMsLjkzODU5LC45MTEyMywuODY3OTksMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuODc4MzIsLjk3OSwuODc4MzIsLjk3OSwuODc4MzIsLjk3OSwuNzc1MTIsLjg4MiwuOTIxOSwxLC44OTkwMywxLDEsMSwuODczMjEsLjg3MzIxLC44NzMyMSwxLDEuMDI3LDEuMDI3LDEuMDI3LC44Njg0NywuODY4NDcsLjc5MTIxLDEsMS4xMjQsMSwxLC43MzU3MiwuNzM1NzIsMSwxLC44NTAzNCwxLDEsMSwxLC44ODQ2NSwxLDEsMSwuNjY5LDEsMS4zNjE0NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4wNDgyOCwxLC43NDk0OCwuNzUxODcsMS4wMjA1OCwuOTgzOTEsMS4wMjExOSwxLDEsMS4wNjIzMywxLjA4NTk1LDEuMDg1OTUsMSwxLjA4NTk1LDEuMDg1OTUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA1MjMzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdO3QuTXlyaWFkUHJvSXRhbGljTWV0cmljcz17bGluZUhlaWdodDoxLjIsbGluZUdhcDouMn07dC5NeXJpYWRQcm9SZWd1bGFyRmFjdG9ycz1bMS4zNjg5OCwxLDEsLjc2MzA1LC44Mjc4NCwuOTQ5MzUsLjg5MzY0LC45MjI0MSwuODkwNzMsLjkwNzA2LC45ODQ3MiwuODUyODMsLjg1MjgzLDEuMDY2NCwxLjAyMDU4LC43NDUwNSwuOTIxOSwuNzQ1MDUsMS4yMzQ1NiwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIyNDEsLjc0NTA1LC43NDUwNSwxLjAyMDU4LDEuMDIwNTgsMS4wMjA1OCwuNzMwMDIsLjcyNjAxLC45MTc1NSwuODEyNiwuODAzMTQsLjkyMjIyLC43Mzc2NCwuNzk3MjYsLjgzMDUxLC45MDI4NCwuODYwMjMsLjc0LC44MTI2LC44NDg2OSwuOTY1MTgsLjkxMTE1LC44ODU4LC43OTc2MSwuODg1OCwuNzQ0OTgsLjczOTE0LC44MTM2MywuODk1OTEsLjgzNjU5LC44OTYzMywuODU2MDgsLjgxMTEsLjkwNTMxLDEuMDIyMiwxLjIyNzM2LDEuMDIyMiwxLjI3MDE0LC44OTkwMywuOTAwODgsLjg2NjY3LDEuMDIzMSwuODk2LDEuMDE0MTEsLjkwMDgzLDEuMDUwOTksMS4wMDUxMiwuOTk3OTMsMS4wNTMyNiwxLjA5Mzc3LC45MzgsMS4wNjIyNiwxLjAwMTE5LC45OTc5MywuOTg3MTQsMS4wMjMxLDEuMDEyMzEsLjk4MTk2LC43OTIsMS4xOTEzNywuOTkwNzQsLjk2MiwxLjAxOTE1LC45MjYsLjk0MiwuODU2LC44NTAzNCwuOTIwMDYsLjg1MDM0LDEuMDIwNTgsLjY5MDY3LC45MjI0MSwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIwMDYsLjkzMzIsLjkwMDg4LC45MTg4MiwuOTM0ODQsLjc1MzM5LDEuMDIwNTgsLjU2ODY2LC41NDMyNCwuNzk1MTksMS4wODU5NSwxLDEsLjkwMDg4LDEsLjk1MzI1LC43NDUwNSwuOTAwODgsMSwuOTcxOTgsLjc1MzM5LC45MTAwOSwuOTEwMDksLjkxMDA5LC42NjQ2NiwuOTE3NTUsLjkxNzU1LC45MTc1NSwuOTE3NTUsLjkxNzU1LC45MTc1NSwuNzg4LC44MDMxNCwuNzM3NjQsLjczNzY0LC43Mzc2NCwuNzM3NjQsLjg2MDIzLC44NjAyMywuODYwMjMsLjg2MDIzLC45MjkxNSwuOTExMTUsLjg4NTgsLjg4NTgsLjg4NTgsLjg4NTgsLjg4NTgsMS4wMjA1OCwuODg1OCwuODk1OTEsLjg5NTkxLC44OTU5MSwuODk1OTEsLjgxMTEsLjc5NjExLC44OTcxMywuODY2NjcsLjg2NjY3LC44NjY2NywuODY2NjcsLjg2NjY3LC44NjY2NywuODY5MzYsLjg5NiwuOTAwODMsLjkwMDgzLC45MDA4MywuOTAwODMsLjg0MjI0LC44NDIyNCwuODQyMjQsLjg0MjI0LC45NzI3NiwuOTk3OTMsLjk4NzE0LC45ODcxNCwuOTg3MTQsLjk4NzE0LC45ODcxNCwxLjA4NTk1LC44OTg3NiwuOTkwNzQsLjk5MDc0LC45OTA3NCwuOTkwNzQsLjk0MiwxLjAyMzEsLjk0MiwuOTE3NTUsLjg2NjY3LC45MTc1NSwuODY2NjcsLjkxNzU1LC44NjY2NywuODAzMTQsLjg5NiwuODAzMTQsLjg5NiwuODAzMTQsLjg5NiwuODAzMTQsLjg5NiwuOTIyMjIsLjkzMzcyLC45MjkxNSwxLjAxNDExLC43Mzc2NCwuOTAwODMsLjczNzY0LC45MDA4MywuNzM3NjQsLjkwMDgzLC43Mzc2NCwuOTAwODMsLjczNzY0LC45MDA4MywuODMwNTEsMS4wMDUxMiwuODMwNTEsMS4wMDUxMiwuODMwNTEsMS4wMDUxMiwxLDEsLjkwMjg0LC45OTc5MywuOTA5NzYsLjk5NzkzLC44NjAyMywuODQyMjQsLjg2MDIzLC44NDIyNCwuODYwMjMsLjg0MjI0LC44NjAyMywxLjA1MzI2LC44NjAyMywuODQyMjQsLjgyODczLDEuMDc0NjksLjc0LDEuMDkzNzcsMSwxLC45MzgsLjg0ODY5LDEuMDYyMjYsMSwxLC44NDg2OSwuODM3MDQsLjg0ODY5LC44MTQ0MSwuODU1ODgsMS4wODkyNywuOTExMTUsLjk5NzkzLDEsMSwuOTExMTUsLjk5NzkzLC45MTg4NywuOTA5OTEsLjk5NzkzLC44ODU4LC45ODcxNCwuODg1OCwuOTg3MTQsLjg4NTgsLjk4NzE0LC44OTQsLjkxNDM0LC43NDQ5OCwuOTgxOTYsMSwxLC43NDQ5OCwuOTgxOTYsLjczOTE0LC43OTIsLjczOTE0LC43OTIsMSwxLC43MzkxNCwuNzkyLDEsMSwuODEzNjMsLjkwNCwuODEzNjMsMS4xOTEzNywuODk1OTEsLjk5MDc0LC44OTU5MSwuOTkwNzQsLjg5NTkxLC45OTA3NCwuODk1OTEsLjk5MDc0LC44OTU5MSwuOTkwNzQsLjg5NTkxLC45OTA3NCwuODk2MzMsMS4wMTkxNSwuODExMSwuOTQyLC44MTExLC45MDUzMSwuODU2LC45MDUzMSwuODU2LC45MDUzMSwuODU2LDEsLjkyMjQxLC45MTc1NSwuODY2NjcsLjc4OCwuODY5MzYsLjg4NTgsLjg5ODc2LDEsMSwuODEzNjMsMS4xOTEzNywuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAzODgsMS4wMzkwMSwuOTIxMzgsLjc4MTA1LC43MTU0LC44NjE2OSwuODA1MTMsLjk0MDA3LC44MjUyOCwuOTg2MTIsMS4wNjIyNiwuOTE3NTUsLjgxMjYsLjgxODg0LC45MjgxOSwuNzM3NjQsLjkwNTMxLC45MDI4NCwuODg1OCwuODYwMjMsLjgxMjYsLjkxMTcyLC45NjUxOCwuOTExMTUsLjgzMDg5LC44ODU4LC44Nzc5MSwuNzk3NjEsLjg5Mjk3LC44MTM2MywuODgxNTcsLjg5OTkyLC44NTYwOCwuODE5OTIsLjk0MzA3LC44NjAyMywuODgxNTcsLjk1MzA4LC45ODY5OSwuOTk3OTMsMS4wNjIyNiwuOTU4MTcsLjk1MzA4LC45NzM1OCwuOTI4LC45ODA4OCwuOTg2OTksLjkyNzYxLC45OTc5MywuOTYwMTcsMS4wNjIyNiwuOTg2LC45NDQsLjk1OTc4LC45MzgsLjk2NzA1LC45ODcxNCwuODA0NDIsLjk4OTcyLDEsLjg5NzYyLDEuMDQ1NTIsLjk1ODE3LC45OTAwNywuODcwNjQsLjkxODc5LC44ODg4OCwxLjA2MjI2LC45NTgxNywuOTg3MTQsLjk1ODE3LC44ODg4OCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44OTYzMywxLjAxOTE1LC44OTYzMywxLjAxOTE1LC44OTYzMywxLjAxOTE1LC44MTExLC45NDIsLjkyMTksMSwuODk5MDMsMSwxLDEsLjkzMTczLC45MzE3MywuOTMxNzMsMSwxLjA2MzA0LDEuMDYzMDQsMS4wNjkwNCwuODk5MDMsLjg5OTAzLC44MDU0OSwxLDEuMTU2LDEsMSwuNzY1NzUsLjc2NTc1LDEsMSwuNzI0NTgsMSwxLDEsMSwuOTIyNDEsMSwxLDEsLjYxOSwxLDEuMzYxNDUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDcyNTcsMSwuNzQ3MDUsLjcxMTE5LDEuMDIwNTgsMS4wMjQsMS4wMjExOSwxLDEsMS4xNTM2LDEuMDg1OTUsMS4wODU5NSwxLDEuMDg1OTUsMS4wODU5NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDU2MzgsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV07dC5NeXJpYWRQcm9SZWd1bGFyTWV0cmljcz17bGluZUhlaWdodDoxLjIsbGluZUdhcDouMn19LChlLHQpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlNlZ29ldWlSZWd1bGFyTWV0cmljcz10LlNlZ29ldWlSZWd1bGFyRmFjdG9ycz10LlNlZ29ldWlJdGFsaWNNZXRyaWNzPXQuU2Vnb2V1aUl0YWxpY0ZhY3RvcnM9dC5TZWdvZXVpQm9sZE1ldHJpY3M9dC5TZWdvZXVpQm9sZEl0YWxpY01ldHJpY3M9dC5TZWdvZXVpQm9sZEl0YWxpY0ZhY3RvcnM9dC5TZWdvZXVpQm9sZEZhY3RvcnM9dm9pZCAwO3QuU2Vnb2V1aUJvbGRGYWN0b3JzPVsxLjc2NzM4LDEsMSwuOTkyOTcsLjk4MjQsMS4wNDAxNiwxLjA2NDk3LDEuMDM0MjQsLjk3NTI5LDEuMTc2NDcsMS4yMzIwMywxLjEwODUsMS4xMDg1LDEuMTY5MzksMS4yMTA3LC45NzU0LDEuMjE0MDgsLjk3NTQsMS41OTU3OCwxLjAzNDI0LDEuMDM0MjQsMS4wMzQyNCwxLjAzNDI0LDEuMDM0MjQsMS4wMzQyNCwxLjAzNDI0LDEuMDM0MjQsMS4wMzQyNCwxLjAzNDI0LC44MTM3OCwuODEzNzgsMS4yMTA3LDEuMjEwNywxLjIxMDcsLjcxNzAzLC45Nzg0NywuOTczNjMsLjg4Nzc2LC44NjQxLDEuMDIwOTYsLjc5Nzk1LC44NTEzMiwuOTE0LDEuMDYwODUsMS4xNDA2LC44MDA3LC44OTg1OCwuODM2OTMsMS4xNDg4OSwxLjA5Mzk4LC45NzQ4OSwuOTIwOTQsLjk3NDg5LC45MDM5OSwuODQwNDEsLjk1OTIzLDEuMDAxMzUsMSwxLjA2NDY3LC45ODI0MywuOTA5OTYsLjk5MzYxLDEuMTA4NSwxLjU2OTQyLDEuMTA4NSwxLjIxMDcsLjc0NjI3LC45NDI4MiwuOTY3NTIsMS4wMTUxOSwuODYzMDQsMS4wMTM1OSwuOTcyNzgsMS4xNTEwMywxLjAxMzU5LC45ODU2MSwxLjAyMjg1LDEuMDIyODUsMS4wMDUyNywxLjAyMjg1LDEuMDMwMiwuOTkwNDEsMS4wMDA4LDEuMDE1MTksMS4wMTM1OSwxLjAyMjU4LC43OTEwNCwxLjE2ODYyLC45OTA0MSwuOTc0NTQsMS4wMjUxMSwuOTkyOTgsLjk2NzUyLC45NTgwMSwuOTQ4NTYsMS4xNjU3OSwuOTQ4NTYsMS4yMTA3LC45ODI0LDEuMDM0MjQsMS4wMzQyNCwxLDEuMDM0MjQsMS4xNjU3OSwuODcyNywxLjM4NzEsMS4xODYyMiwxLjEwODE4LDEuMDQ0NzgsMS4yMTA3LDEuMTg2MjIsLjc1MTU1LC45NDk5NCwxLjI4ODI2LDEuMjE0MDgsMS4yMTQwOCwuOTEwNTYsMSwuOTE1NzIsLjk3NTQsLjY0NjYzLDEuMTgzMjgsMS4yNDg2NiwxLjA0NDc4LDEuMTQxNjksMS4xNTc0OSwxLjE3Mzg5LC43MTcwMywuOTczNjMsLjk3MzYzLC45NzM2MywuOTczNjMsLjk3MzYzLC45NzM2MywuOTM1MDYsLjg2NDEsLjc5Nzk1LC43OTc5NSwuNzk3OTUsLjc5Nzk1LDEuMTQwNiwxLjE0MDYsMS4xNDA2LDEuMTQwNiwxLjAyMDk2LDEuMDkzOTgsLjk3NDI2LC45NzQyNiwuOTc0MjYsLjk3NDI2LC45NzQyNiwxLjIxMDcsLjk3NDg5LDEuMDAxMzUsMS4wMDEzNSwxLjAwMTM1LDEuMDAxMzUsLjkwOTk2LC45MjA5NCwxLjAyNzk4LC45Njc1MiwuOTY3NTIsLjk2NzUyLC45Njc1MiwuOTY3NTIsLjk2NzUyLC45MzEzNiwuODYzMDQsLjk3Mjc4LC45NzI3OCwuOTcyNzgsLjk3Mjc4LDEuMDIyODUsMS4wMjI4NSwxLjAyMjg1LDEuMDIyODUsLjk3MTIyLC45OTA0MSwxLDEsMSwxLDEsMS4yODgyNiwxLjAwMDgsLjk5MDQxLC45OTA0MSwuOTkwNDEsLjk5MDQxLC45Njc1MiwxLjAxNTE5LC45Njc1MiwuOTczNjMsLjk2NzUyLC45NzM2MywuOTY3NTIsLjk3MzYzLC45Njc1MiwuODY0MSwuODYzMDQsLjg2NDEsLjg2MzA0LC44NjQxLC44NjMwNCwuODY0MSwuODYzMDQsMS4wMjA5NiwxLjAzMDU3LDEuMDIwOTYsMS4wMzUxNywuNzk3OTUsLjk3Mjc4LC43OTc5NSwuOTcyNzgsLjc5Nzk1LC45NzI3OCwuNzk3OTUsLjk3Mjc4LC43OTc5NSwuOTcyNzgsLjkxNCwxLjAxMzU5LC45MTQsMS4wMTM1OSwuOTE0LDEuMDEzNTksMSwxLDEuMDYwODUsLjk4NTYxLDEuMDYwODUsMS4wMDg3OSwxLjE0MDYsMS4wMjI4NSwxLjE0MDYsMS4wMjI4NSwxLjE0MDYsMS4wMjI4NSwxLjE0MDYsMS4wMjI4NSwxLjE0MDYsMS4wMjI4NSwuOTcxMzgsMS4wODY5MiwuODAwNywxLjAyMjg1LDEsMSwxLjAwNTI3LC44MzY5MywxLjAyMjg1LDEsMSwuODM2OTMsLjk0NTUsLjgzNjkzLC45MDQxOCwuODM2OTMsMS4xMzAwNSwxLjA5Mzk4LC45OTA0MSwxLDEsMS4wOTM5OCwuOTkwNDEsLjk2NjkyLDEuMDkyNTEsLjk5MDQxLC45NzQ4OSwxLjAwMDgsLjk3NDg5LDEuMDAwOCwuOTc0ODksMS4wMDA4LC45Mzk5NCwuOTc5MzEsLjkwMzk5LDEuMDIyNTgsMSwxLC45MDM5OSwxLjAyMjU4LC44NDA0MSwuNzkxMDQsLjg0MDQxLC43OTEwNCwuODQwNDEsLjc5MTA0LC44NDA0MSwuNzkxMDQsMSwxLC45NTkyMywxLjA3MDM0LC45NTkyMywxLjE2ODYyLDEuMDAxMzUsLjk5MDQxLDEuMDAxMzUsLjk5MDQxLDEuMDAxMzUsLjk5MDQxLDEuMDAxMzUsLjk5MDQxLDEuMDAxMzUsLjk5MDQxLDEuMDAxMzUsLjk5MDQxLDEuMDY0NjcsMS4wMjUxMSwuOTA5OTYsLjk2NzUyLC45MDk5NiwuOTkzNjEsLjk1ODAxLC45OTM2MSwuOTU4MDEsLjk5MzYxLC45NTgwMSwxLjA3NzMzLDEuMDM0MjQsLjk3MzYzLC45Njc1MiwuOTM1MDYsLjkzMTM2LC45NzQ4OSwxLjAwMDgsMSwxLC45NTkyMywxLjE2ODYyLDEuMTUxMDMsMS4xNTEwMywxLjAxMTczLDEuMDM5NTksLjc1OTUzLC44MTM3OCwuNzk5MTIsMS4xNTEwMywxLjIxOTk0LC45NTE2MSwuODc4MTUsMS4wMTE0OSwuODE1MjUsLjc2NzYsLjk4MTY3LDEuMDExMzQsMS4wMjU0NiwuODQwOTcsMS4wMzA4OSwxLjE4MTAyLC45NzM2MywuODg3NzYsLjg1MTM0LC45NzgyNiwuNzk3OTUsLjk5MzYxLDEuMDYwODUsLjk3NDg5LDEuMTQwNiwuODk4NTgsMS4wMzg4LDEuMTQ4ODksMS4wOTM5OCwuODYwMzksLjk3NDg5LDEuMDU5NSwuOTIwOTQsLjk0NzkzLC45NTkyMywuOTA5OTYsLjk5MzQ2LC45ODI0MywxLjAyMTEyLC45NTQ5MywxLjE0MDYsLjkwOTk2LDEuMDM1NzQsMS4wMjU5NywxLjAwMDgsMS4xODEwMiwxLjA2NjI4LDEuMDM1NzQsMS4wMTkyLDEuMDE5MzIsMS4wMDg4NiwuOTc1MzEsMS4wMTA2LDEuMDAwOCwxLjEzMTg5LDEuMTgxMDIsMS4wMjI3NywuOTg2ODMsMS4wMDE2LC45OTU2MSwxLjA3MjM3LDEuMDAwOCwuOTA0MzQsLjk5OTIxLC45MzgwMywuODk2NSwxLjIzMDg1LDEuMDY2MjgsMS4wNDk4MywuOTYyNjgsMS4wNDk5LC45ODQzOSwxLjE4MTAyLDEuMDY2MjgsMS4wMDA4LDEuMDY2MjgsLjk4NDM5LC43OTc5NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA5NDY2LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45NzI3OCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjAyMDY1LDEsMSwxLDEsMSwxLDEuMDY0NjcsMS4wMjUxMSwxLjA2NDY3LDEuMDI1MTEsMS4wNjQ2NywxLjAyNTExLC45MDk5NiwuOTY3NTIsMSwxLjIxNDA4LC44OTkwMywxLDEsLjc1MTU1LDEuMDQzOTQsMS4wNDM5NCwxLjA0Mzk0LDEuMDQzOTQsLjk4NjMzLC45ODYzMywuOTg2MzMsLjczMDQ3LC43MzA0NywxLjIwNjQyLC45MTIxMSwxLjI1NjM1LDEuMjIyLDEuMDI5NTYsMS4wMzM3MiwxLjAzMzcyLC45NjAzOSwxLjI0NjMzLDEsMS4xMjQ1NCwuOTM1MDMsMS4wMzQyNCwxLjE5Njg3LDEuMDM0MjQsMSwxLDEsLjc3MSwxLDEsMS4xNTc0OSwxLjE1NzQ5LDEuMTU3NDksMS4xMDk0OCwuODYyNzksLjk0NDM0LC44NjI3OSwuOTQ0MzQsLjg2MTgyLDEsMSwxLjE2ODk3LDEsLjk2MDg1LC45MDEzNywxLjIxMDcsMS4xODQxNiwxLjEzOTczLC42OTgyNSwuOTcxNiwyLjEwMzM5LDEuMjkwMDQsMS4yOTAwNCwxLjIxMTcyLDEuMjkwMDQsMS4yOTAwNCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuNDI2MDMsMSwuOTk4NjIsLjk5ODYyLDEsLjg3MDI1LC44NzAyNSwuODcwMjUsLjg3MDI1LDEuMTg4NzQsMS40MjYwMywxLDEuNDI2MDMsMS40MjYwMywuOTk4NjIsMSwxLDEsMSwxLDEuMjg4NiwxLjA0MzE1LDEuMTUyOTYsMS4zNDE2MywxLDEsMSwxLjA5MTkzLDEuMDkxOTMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdO3QuU2Vnb2V1aUJvbGRNZXRyaWNzPXtsaW5lSGVpZ2h0OjEuMzMwMDgsbGluZUdhcDowfTt0LlNlZ29ldWlCb2xkSXRhbGljRmFjdG9ycz1bMS43NjczOCwxLDEsLjk4OTQ2LDEuMDM5NTksMS4wNDAxNiwxLjAyODA5LDEuMDM2LC45NzYzOSwxLjEwOTUzLDEuMjMyMDMsMS4xMTE0NCwxLjExMTQ0LDEuMTY5MzksMS4yMTIzNywuOTc1NCwxLjIxMjYxLC45NzU0LDEuNTk3NTQsMS4wMzYsMS4wMzYsMS4wMzYsMS4wMzYsMS4wMzYsMS4wMzYsMS4wMzYsMS4wMzYsMS4wMzYsMS4wMzYsLjgxMzc4LC44MTM3OCwxLjIxMjM3LDEuMjEyMzcsMS4yMTIzNywuNzM1NDEsLjk3ODQ3LC45NzM2MywuODk3MjMsLjg3ODk3LDEuMDQyNiwuNzk0MjksLjg1MjkyLC45MTE0OSwxLjA1ODE1LDEuMTQwNiwuNzk2MzEsLjkwMTI4LC44Mzg1MywxLjA0Mzk2LDEuMTA2MTUsLjk3NTUyLC45NDQzNiwuOTc1NTIsLjg4NjQxLC44MDUyNywuOTYwODMsMS4wMDEzNSwxLDEuMDY3NzcsLjk4MTcsLjkxMTQyLC45OTM2MSwxLjExMTQ0LDEuNTcyOTMsMS4xMTE0NCwxLjIxMjM3LC43NDYyNywxLjMxODE4LDEuMDY1ODUsLjk3MDQyLC44MzA1NSwuOTcwNDIsLjkzNTAzLDEuMTI2MSwuOTcwNDIsLjk3OTIyLDEuMTQyMzYsLjk0NTUyLDEuMDEwNTQsMS4xNDIzNiwxLjAyNDcxLC45NzkyMiwuOTQxNjUsLjk3MDQyLC45NzA0MiwxLjAyNzYsLjc4OTI5LDEuMTI2MSwuOTc5MjIsLjk1ODc0LDEuMDIxOTcsLjk4NTA3LC45Njc1MiwuOTcxNjgsLjk1MTA3LDEuMTY1NzksLjk1MTA3LDEuMjEyMzcsMS4wMzk1OSwxLjAzNiwxLjAzNiwxLDEuMDM2LDEuMTY1NzksLjg3MzU3LDEuMzE4MTgsMS4xODc1NCwxLjI2NzgxLDEuMDUzNTYsMS4yMTIzNywxLjE4NjIyLC43OTQ4NywuOTQ5OTQsMS4yOTAwNCwxLjI0MDQ3LDEuMjQwNDcsMS4zMTgxOCwxLC45MTQ4NCwuOTc1NCwxLjMxODE4LDEuMTM0OSwxLjI0ODY2LDEuMDUzNTYsMS4xMzkzNCwxLjE1NTc0LDEuMTczODksLjczNTQxLC45NzM2MywuOTczNjMsLjk3MzYzLC45NzM2MywuOTczNjMsLjk3MzYzLC45NDM4NSwuODc4OTcsLjc5NDI5LC43OTQyOSwuNzk0MjksLjc5NDI5LDEuMTQwNiwxLjE0MDYsMS4xNDA2LDEuMTQwNiwxLjA0MjYsMS4xMDYxNSwuOTc1NTIsLjk3NTUyLC45NzU1MiwuOTc1NTIsLjk3NTUyLDEuMjEyMzcsLjk3NTUyLDEuMDAxMzUsMS4wMDEzNSwxLjAwMTM1LDEuMDAxMzUsLjkxMTQyLC45NDQzNiwuOTg3MjEsMS4wNjU4NSwxLjA2NTg1LDEuMDY1ODUsMS4wNjU4NSwxLjA2NTg1LDEuMDY1ODUsLjk2NzA1LC44MzA1NSwuOTM1MDMsLjkzNTAzLC45MzUwMywuOTM1MDMsMS4xNDIzNiwxLjE0MjM2LDEuMTQyMzYsMS4xNDIzNiwuOTMxMjUsLjk3OTIyLC45NDE2NSwuOTQxNjUsLjk0MTY1LC45NDE2NSwuOTQxNjUsMS4yOTAwNCwuOTQxNjUsLjk3OTIyLC45NzkyMiwuOTc5MjIsLjk3OTIyLC45Njc1MiwuOTcwNDIsLjk2NzUyLC45NzM2MywxLjA2NTg1LC45NzM2MywxLjA2NTg1LC45NzM2MywxLjA2NTg1LC44Nzg5NywuODMwNTUsLjg3ODk3LC44MzA1NSwuODc4OTcsLjgzMDU1LC44Nzg5NywuODMwNTUsMS4wNDI2LDEuMDAzMywxLjA0MjYsLjk3MDQyLC43OTQyOSwuOTM1MDMsLjc5NDI5LC45MzUwMywuNzk0MjksLjkzNTAzLC43OTQyOSwuOTM1MDMsLjc5NDI5LC45MzUwMywuOTExNDksLjk3MDQyLC45MTE0OSwuOTcwNDIsLjkxMTQ5LC45NzA0MiwxLDEsMS4wNTgxNSwuOTc5MjIsMS4wNTgxNSwuOTc5MjIsMS4xNDA2LDEuMTQyMzYsMS4xNDA2LDEuMTQyMzYsMS4xNDA2LDEuMTQyMzYsMS4xNDA2LDEuMTQyMzYsMS4xNDA2LDEuMTQyMzYsLjk3NDQxLDEuMDQzMDIsLjc5NjMxLDEuMDE1ODIsMSwxLDEuMDEwNTQsLjgzODUzLDEuMTQyMzYsMSwxLC44Mzg1MywxLjA5MTI1LC44Mzg1MywuOTA0MTgsLjgzODUzLDEuMTk1MDgsMS4xMDYxNSwuOTc5MjIsMSwxLDEuMTA2MTUsLjk3OTIyLDEuMDEwMzQsMS4xMDQ2NiwuOTc5MjIsLjk3NTUyLC45NDE2NSwuOTc1NTIsLjk0MTY1LC45NzU1MiwuOTQxNjUsLjkxNjAyLC45MTk4MSwuODg2NDEsMS4wMjc2LDEsMSwuODg2NDEsMS4wMjc2LC44MDUyNywuNzg5MjksLjgwNTI3LC43ODkyOSwuODA1MjcsLjc4OTI5LC44MDUyNywuNzg5MjksMSwxLC45NjA4MywxLjA1NDAzLC45NTkyMywxLjE2ODYyLDEuMDAxMzUsLjk3OTIyLDEuMDAxMzUsLjk3OTIyLDEuMDAxMzUsLjk3OTIyLDEuMDAxMzUsLjk3OTIyLDEuMDAxMzUsLjk3OTIyLDEuMDAxMzUsLjk3OTIyLDEuMDY3NzcsMS4wMjE5NywuOTExNDIsLjk2NzUyLC45MTE0MiwuOTkzNjEsLjk3MTY4LC45OTM2MSwuOTcxNjgsLjk5MzYxLC45NzE2OCwxLjIzMTk5LDEuMDM2LC45NzM2MywxLjA2NTg1LC45NDM4NSwuOTY3MDUsLjk3NTUyLC45NDE2NSwxLDEsLjk2MDgzLDEuMTI2MSwxLjMxODE4LDEuMzE4MTgsMS4zMTgxOCwxLjMxODE4LDEuMzE4MTgsMS4zMTgxOCwxLjMxODE4LDEuMzE4MTgsMS4zMTgxOCwuOTUxNjEsMS4yNzEyNiwxLjAwODExLC44MzI4NCwuNzc3MDIsLjk5MTM3LC45NTI1MywxLjAzNDcsLjg2MTQyLDEuMDcyMDUsMS4xNDIzNiwuOTczNjMsLjg5NzIzLC44Njg2OSwxLjA5ODE4LC43OTQyOSwuOTkzNjEsMS4wNTgxNSwuOTc1NTIsMS4xNDA2LC45MDEyOCwxLjA2NjYyLDEuMDQzOTYsMS4xMDYxNSwuODQ5MTgsLjk3NTUyLDEuMDQ2OTQsLjk0NDM2LC45ODAxNSwuOTYwODMsLjkxMTQyLDEuMDAzNTYsLjk4MTcsMS4wMTk0NSwuOTg5OTksMS4xNDA2LC45MTE0MiwxLjA0OTYxLC45ODk4LDEuMDA2MzksMS4xNDIzNiwxLjA3NTE0LDEuMDQ5NjEsLjk5NjA3LDEuMDI4OTcsMS4wMDgsLjk4OTgsLjk1MTM0LDEuMDA2MzksMS4xMTEyMSwxLjE0MjM2LDEuMDA1MTgsLjk3OTgxLDEuMDIxODYsMSwxLjA4NTc4LC45NDE2NSwuOTkzMTQsLjk4Mzg3LC45MzAyOCwuOTMzNzcsMS4zNTEyNSwxLjA3NTE0LDEuMTA2ODcsLjkzNDkxLDEuMDQyMzIsMS4wMDM1MSwxLjE0MjM2LDEuMDc1MTQsLjk0MTY1LDEuMDc1MTQsMS4wMDM1MSwuNzk0MjksMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4wOTA5NywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTM1MDMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjk2NjA5LDEsMSwxLDEsMSwxLDEuMDY3NzcsMS4wMjE5NywxLjA2Nzc3LDEuMDIxOTcsMS4wNjc3NywxLjAyMTk3LC45MTE0MiwuOTY3NTIsMSwxLjIxMjYxLC44OTkwMywxLDEsLjc1MTU1LDEuMDQ3NDUsMS4wNDc0NSwxLjA0NzQ1LDEuMDQzOTQsLjk4NjMzLC45ODYzMywuOTg2MzMsLjcyOTU5LC43Mjk1OSwxLjIwNTAyLC45MTQwNiwxLjI2NTE0LDEuMjIyLDEuMDI5NTYsMS4wMzM3MiwxLjAzMzcyLC45NjAzOSwxLjI0NjMzLDEsMS4wOTEyNSwuOTMzMjcsMS4wMzMzNiwxLjE2NTQxLDEuMDM2LDEsMSwxLC43NzEsMSwxLDEuMTU1NzQsMS4xNTU3NCwxLjE1NTc0LDEuMTU1NzQsLjg2MzY0LC45NDQzNCwuODYyNzksLjk0NDM0LC44NjIyNCwxLDEsMS4xNjc5OCwxLC45NjA4NSwuOTAwNjgsMS4yMTIzNywxLjE4NDE2LDEuMTM5MDQsLjY5ODI1LC45NzE2LDIuMTAzMzksMS4yOTAwNCwxLjI5MDA0LDEuMjEzMzksMS4yOTAwNCwxLjI5MDA0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS40MjYwMywxLC45OTg2MiwuOTk4NjIsMSwuODcwMjUsLjg3MDI1LC44NzAyNSwuODcwMjUsMS4xODc3NSwxLjQyNjAzLDEsMS40MjYwMywxLjQyNjAzLC45OTg2MiwxLDEsMSwxLDEsMS4yODg2LDEuMDQzMTUsMS4xNTI5NiwxLjM0MTYzLDEsMSwxLDEuMTMyNjksMS4xMzI2OSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV07dC5TZWdvZXVpQm9sZEl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4zMzAwOCxsaW5lR2FwOjB9O3QuU2Vnb2V1aUl0YWxpY0ZhY3RvcnM9WzEuNzY3MzgsMSwxLC45ODk0NiwxLjE0NzYzLDEuMDUzNjUsMS4wNjIzNCwuOTY5MjcsLjkyNTg2LDEuMTUzNzMsMS4xODQxNCwuOTEzNDksLjkxMzQ5LDEuMDc0MDMsMS4xNzMwOCwuNzgzODMsMS4yMDA4OCwuNzgzODMsMS40MjUzMSwuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjc4MzgzLC43ODM4MywxLjE3MzA4LDEuMTczMDgsMS4xNzMwOCwuNzczNDksLjk0NTY1LC45NDcyOSwuODU5NDQsLjg4NTA2LC45ODU4LC43NDgxNywuODAwMTYsLjg4NDQ5LC45ODAzOSwuOTU3ODIsLjY5MjM4LC44OTg5OCwuODMyMzEsLjk4MTgzLDEuMDM5ODksLjk2OTI0LC44NjIzNywuOTY5MjQsLjgwNTk1LC43NDUyNCwuODYwOTEsLjk1NDAyLC45NDE0MywuOTg0NDgsLjg4NTgsLjgzMDg5LC45MzI4NSwxLjA5NDksMS4zOTAxNiwxLjA5NDksMS40NTk5NCwuNzQ2MjcsMS4wNDgzOSwuOTc0NTQsLjk3NDU0LC44NzIwNywuOTc0NTQsLjg3NTMzLDEuMDYxNTEsLjk3NDU0LDEuMDAxNzYsMS4xNjQ4NCwxLjA4MTMyLC45ODA0NywxLjE2NDg0LDEuMDI5ODksMS4wMTA1NCwuOTYyMjUsLjk3NDU0LC45NzQ1NCwxLjA2NTk4LC43OTAwNCwxLjE2MzQ0LDEuMDAzNTEsLjk0NjI5LC45OTczLC45MTAxNiwuOTY3NzcsLjkwNDMsLjkxMDgyLC45MjQ4MSwuOTEwODIsMS4xNzMwOCwuOTU3NDgsLjk2OTI3LC45NjkyNywxLC45NjkyNywuOTI0ODEsLjgwNTk3LDEuMDQ4MzksMS4yMzM5MywxLjE3ODEsLjkyNDUsMS4xNzMwOCwxLjIwODA4LC42MzIxOCwuOTQyNjEsMS4yNDgyMiwxLjA5OTcxLDEuMDk5NzEsMS4wNDgzOSwxLC44NTI3MywuNzgwMzIsMS4wNDgzOSwxLjA5OTcxLDEuMjIzMjYsLjkyNDUsMS4wOTgzNiwxLjEzNTI1LDEuMTUyMjIsLjcwNDI0LC45NDcyOSwuOTQ3MjksLjk0NzI5LC45NDcyOSwuOTQ3MjksLjk0NzI5LC44NTQ5OCwuODg1MDYsLjc0ODE3LC43NDgxNywuNzQ4MTcsLjc0ODE3LC45NTc4MiwuOTU3ODIsLjk1NzgyLC45NTc4MiwuOTg1OCwxLjAzOTg5LC45NjkyNCwuOTY5MjQsLjk2OTI0LC45NjkyNCwuOTY5MjQsMS4xNzMwOCwuOTY5MjQsLjk1NDAyLC45NTQwMiwuOTU0MDIsLjk1NDAyLC44MzA4OSwuODYyMzcsLjg4NDA5LC45NzQ1NCwuOTc0NTQsLjk3NDU0LC45NzQ1NCwuOTc0NTQsLjk3NDU0LC45MjkxNiwuODcyMDcsLjg3NTMzLC44NzUzMywuODc1MzMsLjg3NTMzLC45MzE0NiwuOTMxNDYsLjkzMTQ2LC45MzE0NiwuOTM4NTQsMS4wMTA1NCwuOTYyMjUsLjk2MjI1LC45NjIyNSwuOTYyMjUsLjk2MjI1LDEuMjQ4MjIsLjg3NjEsMS4wMDM1MSwxLjAwMzUxLDEuMDAzNTEsMS4wMDM1MSwuOTY3NzcsLjk3NDU0LC45Njc3NywuOTQ3MjksLjk3NDU0LC45NDcyOSwuOTc0NTQsLjk0NzI5LC45NzQ1NCwuODg1MDYsLjg3MjA3LC44ODUwNiwuODcyMDcsLjg4NTA2LC44NzIwNywuODg1MDYsLjg3MjA3LC45ODU4LC45NTM5MSwuOTg1OCwuOTc0NTQsLjc0ODE3LC44NzUzMywuNzQ4MTcsLjg3NTMzLC43NDgxNywuODc1MzMsLjc0ODE3LC44NzUzMywuNzQ4MTcsLjg3NTMzLC44ODQ0OSwuOTc0NTQsLjg4NDQ5LC45NzQ1NCwuODg0NDksLjk3NDU0LDEsMSwuOTgwMzksMS4wMDE3NiwuOTgwMzksMS4wMDE3NiwuOTU3ODIsLjkzMTQ2LC45NTc4MiwuOTMxNDYsLjk1NzgyLC45MzE0NiwuOTU3ODIsMS4xNjQ4NCwuOTU3ODIsLjkzMTQ2LC44NDQyMSwxLjEyNzYxLC42OTIzOCwxLjA4MTMyLDEsMSwuOTgwNDcsLjgzMjMxLDEuMTY0ODQsMSwxLC44NDcyMywxLjA0ODYxLC44NDcyMywuNzg3NTUsLjgzMjMxLDEuMjM3MzYsMS4wMzk4OSwxLjAxMDU0LDEsMSwxLjAzOTg5LDEuMDEwNTQsLjk4NTcsMS4wMzg0OSwxLjAxMDU0LC45NjkyNCwuOTYyMjUsLjk2OTI0LC45NjIyNSwuOTY5MjQsLjk2MjI1LC45MjM4MywuOTAxNzEsLjgwNTk1LDEuMDY1OTgsMSwxLC44MDU5NSwxLjA2NTk4LC43NDUyNCwuNzkwMDQsLjc0NTI0LC43OTAwNCwuNzQ1MjQsLjc5MDA0LC43NDUyNCwuNzkwMDQsMSwxLC44NjA5MSwxLjAyNzU5LC44NTc3MSwxLjE2MzQ0LC45NTQwMiwxLjAwMzUxLC45NTQwMiwxLjAwMzUxLC45NTQwMiwxLjAwMzUxLC45NTQwMiwxLjAwMzUxLC45NTQwMiwxLjAwMzUxLC45NTQwMiwxLjAwMzUxLC45ODQ0OCwuOTk3MywuODMwODksLjk2Nzc3LC44MzA4OSwuOTMyODUsLjkwNDMsLjkzMjg1LC45MDQzLC45MzI4NSwuOTA0MywxLjMxODY4LC45NjkyNywuOTQ3MjksLjk3NDU0LC44NTQ5OCwuOTI5MTYsLjk2OTI0LC44NzYxLDEsMSwuODYwOTEsMS4xNjM0NCwxLjA0ODM5LDEuMDQ4MzksMS4wNDgzOSwxLjA0ODM5LDEuMDQ4MzksMS4wNDgzOSwxLjA0ODM5LDEuMDQ4MzksMS4wNDgzOSwuODE5NjUsLjgxOTY1LC45NDcyOSwuNzgwMzIsLjcxMDIyLC45MDg4MywuODQxNzEsLjk5ODc3LC43NzU5NiwxLjA1NzM0LDEuMiwuOTQ3MjksLjg1OTQ0LC44Mjc5MSwuOTYwNywuNzQ4MTcsLjkzMjg1LC45ODAzOSwuOTY5MjQsLjk1NzgyLC44OTg5OCwuOTgzMTYsLjk4MTgzLDEuMDM5ODksLjc4NjE0LC45NjkyNCwuOTc2NDIsLjg2MjM3LC44NjA3NSwuODYwOTEsLjgzMDg5LC45MDA4MiwuODg1OCwuOTcyOTYsMS4wMTI4NCwuOTU3ODIsLjgzMDg5LDEuMDk3NiwxLjA0LDEuMDMzNDIsMS4yLDEuMDY3NSwxLjA5NzYsLjk4MjA1LDEuMDM4MDksMS4wNTA5NywxLjA0LC45NTM2NCwxLjAzMzQyLDEuMDU0MDEsMS4yLDEuMDIxNDgsMS4wMTE5LDEuMDQ3MjQsMS4wMTI3LDEuMDI3MzIsLjk2MjI1LC44OTY1LC45Nzc4MywuOTM1NzQsLjk0ODE4LDEuMzA2NzksMS4wNjc1LDEuMTE4MjYsLjk5ODIxLDEuMDU1NywxLjAzMjYsMS4yLDEuMDY3NSwuOTYyMjUsMS4wNjc1LDEuMDMyNiwuNzQ4MTcsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4wMzc1NCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuODc1MzMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjk4NzA1LDEsMSwxLDEsMSwxLC45ODQ0OCwuOTk3MywuOTg0NDgsLjk5NzMsLjk4NDQ4LC45OTczLC44MzA4OSwuOTY3NzcsMSwxLjIwMDg4LC44OTkwMywxLDEsLjc1MTU1LC45NDk0NSwuOTQ5NDUsLjk0OTQ1LC45NDk0NSwxLjEyMzE3LDEuMTIzMTcsMS4xMjMxNywuNjc2MDMsLjY3NjAzLDEuMTU2MjEsLjczNTg0LDEuMjExOTEsMS4yMjEzNSwxLjA2NDgzLC45NDg2OCwuOTQ4NjgsLjk1OTk2LDEuMjQ2MzMsMSwxLjA3NDk3LC44NzcwOSwuOTY5MjcsMS4wMTQ3MywuOTY5MjcsMSwxLDEsLjc3Mjk1LDEsMSwxLjA5ODM2LDEuMDk4MzYsMS4wOTgzNiwxLjAxNTIyLC44NjMyMSwuOTQ0MzQsLjg2NDksLjk0NDM0LC44NjE4MiwxLDEsMS4wODMsMSwuOTE1NzgsLjg2NDM4LDEuMTczMDgsMS4xODQxNiwxLjE0NTg5LC42OTgyNSwuOTc2MjIsMS45Njc5MSwxLjI0ODIyLDEuMjQ4MjIsMS4xNzMwOCwxLjI0ODIyLDEuMjQ4MjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjQyNjAzLDEsLjk5ODYyLC45OTg2MiwxLC44NzAyNSwuODcwMjUsLjg3MDI1LC44NzAyNSwxLjE3OTg0LDEuNDI2MDMsMSwxLjQyNjAzLDEuNDI2MDMsLjk5ODYyLDEsMSwxLDEsMSwxLjI4ODYsMS4wNDMxNSwxLjE1Mjk2LDEuMzQxNjMsMSwxLDEsMS4xMDc0MiwxLjEwNzQyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXTt0LlNlZ29ldWlJdGFsaWNNZXRyaWNzPXtsaW5lSGVpZ2h0OjEuMzMwMDgsbGluZUdhcDowfTt0LlNlZ29ldWlSZWd1bGFyRmFjdG9ycz1bMS43NjczOCwxLDEsLjk4NTk0LDEuMDIyODUsMS4xMDQ1NCwxLjA2MjM0LC45NjkyNywuOTIwMzcsMS4xOTk4NSwxLjIwNDYsLjkwNjE2LC45MDYxNiwxLjA3MTUyLDEuMTcxNCwuNzgwMzIsMS4yMDA4OCwuNzgwMzIsMS40MDI0NiwuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjc4MDMyLC43ODAzMiwxLjE3MTQsMS4xNzE0LDEuMTcxNCwuODA1OTcsLjk0MDg0LC45NjcwNiwuODU5NDQsLjg1NzM0LC45NzA5MywuNzU4NDIsLjc5OTM2LC44ODE5OCwuOTgzMSwuOTU3ODIsLjcxMzg3LC44Njk2OSwuODQ2MzYsMS4wNzc5NiwxLjAzNTg0LC45NjkyNCwuODM5NjgsLjk2OTI0LC44MjgyNiwuNzk2NDksLjg1NzcxLC45NTEzMiwuOTMxMTksLjk4OTY1LC44ODQzMywuODI4NywuOTMzNjUsMS4wODYxMiwxLjM2MzgsMS4wODYxMiwxLjQ1Nzg2LC43NDYyNywuODA0OTksLjkxNDg0LDEuMDU3MDcsLjkyMzgzLDEuMDU4ODIsLjk0MDMsMS4xMjY1NCwxLjA1ODgyLDEuMDE3NTYsMS4wOTAxMSwxLjA5MDExLC45OTQxNCwxLjA5MDExLDEuMDM0LDEuMDE3NTYsMS4wNTM1NiwxLjA1NzA3LDEuMDU4ODIsMS4wNDM5OSwuODQ4NjMsMS4yMTk2OCwxLjAxNzU2LC45NTgwMSwxLjAwMDY4LC45MTc5NywuOTY3NzcsLjkwNDMsLjkwMzUxLC45MjEwNSwuOTAzNTEsMS4xNzE0LC44NTMzNywuOTY5MjcsLjk2OTI3LC45OTkxMiwuOTY5MjcsLjkyMTA1LC44MDU5NywxLjI0MzQsMS4yMDgwOCwxLjA1OTM3LC45MDk1NywxLjE3MTQsMS4yMDgwOCwuNzUxNTUsLjk0MjYxLDEuMjQ2NDQsMS4wOTk3MSwxLjA5OTcxLC44NDc1MSwxLC44NTI3MywuNzgwMzIsLjYxNTg0LDEuMDU0MjUsMS4xNzkxNCwuOTA5NTcsMS4wODY2NSwxLjExNTkzLDEuMTQxNjksLjczMzgxLC45NjcwNiwuOTY3MDYsLjk2NzA2LC45NjcwNiwuOTY3MDYsLjk2NzA2LC44NjAzNSwuODU3MzQsLjc1ODQyLC43NTg0MiwuNzU4NDIsLjc1ODQyLC45NTc4MiwuOTU3ODIsLjk1NzgyLC45NTc4MiwuOTcwOTMsMS4wMzU4NCwuOTY5MjQsLjk2OTI0LC45NjkyNCwuOTY5MjQsLjk2OTI0LDEuMTcxNCwuOTY5MjQsLjk1MTMyLC45NTEzMiwuOTUxMzIsLjk1MTMyLC44Mjg3LC44Mzk2OCwuODkwNDksLjkxNDg0LC45MTQ4NCwuOTE0ODQsLjkxNDg0LC45MTQ4NCwuOTE0ODQsLjkzNTc1LC45MjM4MywuOTQwMywuOTQwMywuOTQwMywuOTQwMywuODcxNywuODcxNywuODcxNywuODcxNywxLjAwNTI3LDEuMDE3NTYsMS4wNTM1NiwxLjA1MzU2LDEuMDUzNTYsMS4wNTM1NiwxLjA1MzU2LDEuMjQ2NDQsLjk1OTIzLDEuMDE3NTYsMS4wMTc1NiwxLjAxNzU2LDEuMDE3NTYsLjk2Nzc3LDEuMDU3MDcsLjk2Nzc3LC45NjcwNiwuOTE0ODQsLjk2NzA2LC45MTQ4NCwuOTY3MDYsLjkxNDg0LC44NTczNCwuOTIzODMsLjg1NzM0LC45MjM4MywuODU3MzQsLjkyMzgzLC44NTczNCwuOTIzODMsLjk3MDkzLDEuMDk2OSwuOTcwOTMsMS4wNTg4MiwuNzU4NDIsLjk0MDMsLjc1ODQyLC45NDAzLC43NTg0MiwuOTQwMywuNzU4NDIsLjk0MDMsLjc1ODQyLC45NDAzLC44ODE5OCwxLjA1ODgyLC44ODE5OCwxLjA1ODgyLC44ODE5OCwxLjA1ODgyLDEsMSwuOTgzMSwxLjAxNzU2LC45ODMxLDEuMDE3NTYsLjk1NzgyLC44NzE3LC45NTc4MiwuODcxNywuOTU3ODIsLjg3MTcsLjk1NzgyLDEuMDkwMTEsLjk1NzgyLC44NzE3LC44NDc4NCwxLjExNTUxLC43MTM4NywxLjA5MDExLDEsMSwuOTk0MTQsLjg0NjM2LDEuMDkwMTEsMSwxLC44NDYzNiwxLjA1MzYsLjg0NjM2LC45NDI5OCwuODQ2MzYsMS4yMzI5NywxLjAzNTg0LDEuMDE3NTYsMSwxLDEuMDM1ODQsMS4wMTc1NiwxLjAwMzIzLDEuMDM0NDQsMS4wMTc1NiwuOTY5MjQsMS4wNTM1NiwuOTY5MjQsMS4wNTM1NiwuOTY5MjQsMS4wNTM1NiwuOTMwNjYsLjk4MjkzLC44MjgyNiwxLjA0Mzk5LDEsMSwuODI4MjYsMS4wNDM5OSwuNzk2NDksLjg0ODYzLC43OTY0OSwuODQ4NjMsLjc5NjQ5LC44NDg2MywuNzk2NDksLjg0ODYzLDEsMSwuODU3NzEsMS4xNzMxOCwuODU3NzEsMS4yMTk2OCwuOTUxMzIsMS4wMTc1NiwuOTUxMzIsMS4wMTc1NiwuOTUxMzIsMS4wMTc1NiwuOTUxMzIsMS4wMTc1NiwuOTUxMzIsMS4wMTc1NiwuOTUxMzIsMS4wMTc1NiwuOTg5NjUsMS4wMDA2OCwuODI4NywuOTY3NzcsLjgyODcsLjkzMzY1LC45MDQzLC45MzM2NSwuOTA0MywuOTMzNjUsLjkwNDMsMS4wODU3MSwuOTY5MjcsLjk2NzA2LC45MTQ4NCwuODYwMzUsLjkzNTc1LC45NjkyNCwuOTU5MjMsMSwxLC44NTc3MSwxLjIxOTY4LDEuMTE0MzcsMS4xMTQzNywuOTMxMDksLjkxMjAyLC42MDQxMSwuODQxNjQsLjU1NTcyLDEuMDExNzMsLjk3MzYxLC44MTgxOCwuODE4MTgsLjk2NjM1LC43ODAzMiwuNzI3MjcsLjkyMzY2LC45ODYwMSwxLjAzNDA1LC43Nzk2OCwxLjA5Nzk5LDEuMiwuOTY3MDYsLjg1OTQ0LC44NTYzOCwuOTY0OTEsLjc1ODQyLC45MzM2NSwuOTgzMSwuOTY5MjQsLjk1NzgyLC44Njk2OSwuOTQxNTIsMS4wNzc5NiwxLjAzNTg0LC43ODQzNywuOTY5MjQsLjk4NzE1LC44Mzk2OCwuODM0OTEsLjg1NzcxLC44Mjg3LC45NDQ5MiwuODg0MzMsLjkyODcsMS4wMDk4LC45NTc4MiwuODI4NywxLjA2MjUsLjk4MjQ4LDEuMDM0MjQsMS4yLDEuMDEwNzEsMS4wNjI1LC45NTI0NiwxLjAzODA5LDEuMDQ5MTIsLjk4MjQ4LDEuMDAyMjEsMS4wMzQyNCwxLjA1NDQzLDEuMiwxLjA0Nzg1LC45OTYwOSwxLjAwMTY5LDEuMDUxNzYsLjk5MzQ2LDEuMDUzNTYsLjkwODcsMS4wMzAwNCwuOTU1NDIsLjkzMTE3LDEuMjMzNjIsMS4wMTA3MSwxLjA3ODMxLDEuMDI1MTIsMS4wNTIwNSwxLjAzNTAyLDEuMiwxLjAxMDcxLDEuMDUzNTYsMS4wMTA3MSwxLjAzNTAyLC43NTg0MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjAzNzE5LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45NDAzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDQwMjEsMSwxLDEsMSwxLDEsLjk4OTY1LDEuMDAwNjgsLjk4OTY1LDEuMDAwNjgsLjk4OTY1LDEuMDAwNjgsLjgyODcsLjk2Nzc3LDEsMS4yMDA4OCwuODk5MDMsMSwxLC43NTE1NSwxLjAzMDc3LDEuMDMwNzcsMS4wMzA3NywxLjAzMDc3LDEuMTMxOTYsMS4xMzE5NiwxLjEzMTk2LC42NzQyOCwuNjc0MjgsMS4xNjAzOSwuNzMyOTEsMS4yMDk5NiwxLjIyMTM1LDEuMDY0ODMsLjk0ODY4LC45NDg2OCwuOTU5OTYsMS4yNDYzMywxLDEuMDc0OTcsLjg3Nzk2LC45NjkyNywxLjAxNTE4LC45NjkyNywxLDEsMSwuNzcyOTUsMSwxLDEuMTA1MzksMS4xMDUzOSwxLjExMzU4LDEuMDY5NjcsLjg2Mjc5LC45NDQzNCwuODYyNzksLjk0NDM0LC44NjE4MiwxLDEsMS4wODMsMSwuOTE1NzgsLjg2NTA3LDEuMTcxNCwxLjE4NDE2LDEuMTQ1ODksLjY5ODI1LC45NzYyMiwxLjk2OTcsMS4yNDgyMiwxLjI0ODIyLDEuMTcyMzgsMS4yNDgyMiwxLjI0ODIyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS40MjYwMywxLC45OTg2MiwuOTk4NjIsMSwuODcwMjUsLjg3MDI1LC44NzAyNSwuODcwMjUsMS4xODA4MywxLjQyNjAzLDEsMS40MjYwMywxLjQyNjAzLC45OTg2MiwxLDEsMSwxLDEsMS4yODg2LDEuMDQzMTUsMS4xNTI5NiwxLjM0MTYzLDEsMSwxLDEuMTA5MzgsMS4xMDkzOCwxLDEsMSwxLjA1NDI1LDEuMDk5NzEsMS4wOTk3MSwxLjA5OTcxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV07dC5TZWdvZXVpUmVndWxhck1ldHJpY3M9e2xpbmVIZWlnaHQ6MS4zMzAwOCxsaW5lR2FwOjB9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlBvc3RTY3JpcHRFdmFsdWF0b3I9dC5Qb3N0U2NyaXB0Q29tcGlsZXI9dC5QREZGdW5jdGlvbkZhY3Rvcnk9dm9pZCAwO3QuaXNQREZGdW5jdGlvbj1mdW5jdGlvbiBpc1BERkZ1bmN0aW9uKGUpe2xldCB0O2lmKGUgaW5zdGFuY2VvZiByLkRpY3QpdD1lO2Vsc2V7aWYoIShlIGluc3RhbmNlb2Ygcy5CYXNlU3RyZWFtKSlyZXR1cm4hMTt0PWUuZGljdH1yZXR1cm4gdC5oYXMoIkZ1bmN0aW9uVHlwZSIpfTthKDIpO2EoMTM5KTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgxNTkpO3ZhciByPWEoMTUwKSxuPWEoMTQ0KSxpPWEoMjA4KSxzPWEoMTUxKSxvPWEoMjA5KTt0LlBERkZ1bmN0aW9uRmFjdG9yeT1jbGFzcyBQREZGdW5jdGlvbkZhY3Rvcnl7Y29uc3RydWN0b3IoZSl7bGV0e3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6YT0hMH09ZTt0aGlzLnhyZWY9dDt0aGlzLmlzRXZhbFN1cHBvcnRlZD0hMSE9PWF9Y3JlYXRlKGUpe2NvbnN0IHQ9dGhpcy5nZXRDYWNoZWQoZSk7aWYodClyZXR1cm4gdDtjb25zdCBhPVBERkZ1bmN0aW9uLnBhcnNlKHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5pc0V2YWxTdXBwb3J0ZWQsZm46ZSBpbnN0YW5jZW9mIHIuUmVmP3RoaXMueHJlZi5mZXRjaChlKTplfSk7dGhpcy5fY2FjaGUoZSxhKTtyZXR1cm4gYX1jcmVhdGVGcm9tQXJyYXkoZSl7Y29uc3QgdD10aGlzLmdldENhY2hlZChlKTtpZih0KXJldHVybiB0O2NvbnN0IGE9UERGRnVuY3Rpb24ucGFyc2VBcnJheSh7eHJlZjp0aGlzLnhyZWYsaXNFdmFsU3VwcG9ydGVkOnRoaXMuaXNFdmFsU3VwcG9ydGVkLGZuT2JqOmUgaW5zdGFuY2VvZiByLlJlZj90aGlzLnhyZWYuZmV0Y2goZSk6ZX0pO3RoaXMuX2NhY2hlKGUsYSk7cmV0dXJuIGF9Z2V0Q2FjaGVkKGUpe2xldCB0O2UgaW5zdGFuY2VvZiByLlJlZj90PWU6ZSBpbnN0YW5jZW9mIHIuRGljdD90PWUub2JqSWQ6ZSBpbnN0YW5jZW9mIHMuQmFzZVN0cmVhbSYmKHQ9ZS5kaWN0Py5vYmpJZCk7aWYodCl7Y29uc3QgZT10aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuZ2V0QnlSZWYodCk7aWYoZSlyZXR1cm4gZX1yZXR1cm4gbnVsbH1fY2FjaGUoZSx0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoJ1BERkZ1bmN0aW9uRmFjdG9yeS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkRnVuY3Rpb24iIGFyZ3VtZW50LicpO2xldCBhO2UgaW5zdGFuY2VvZiByLlJlZj9hPWU6ZSBpbnN0YW5jZW9mIHIuRGljdD9hPWUub2JqSWQ6ZSBpbnN0YW5jZW9mIHMuQmFzZVN0cmVhbSYmKGE9ZS5kaWN0Py5vYmpJZCk7YSYmdGhpcy5fbG9jYWxGdW5jdGlvbkNhY2hlLnNldChudWxsLGEsdCl9Z2V0IF9sb2NhbEZ1bmN0aW9uQ2FjaGUoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiX2xvY2FsRnVuY3Rpb25DYWNoZSIsbmV3IG8uTG9jYWxGdW5jdGlvbkNhY2hlKX19O2Z1bmN0aW9uIHRvTnVtYmVyQXJyYXkoZSl7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG51bGw7Y29uc3QgdD1lLmxlbmd0aDtmb3IobGV0IGE9MDthPHQ7YSsrKWlmKCJudW1iZXIiIT10eXBlb2YgZVthXSl7Y29uc3QgYT1uZXcgQXJyYXkodCk7Zm9yKGxldCByPTA7cjx0O3IrKylhW3JdPStlW3JdO3JldHVybiBhfXJldHVybiBlfWNsYXNzIFBERkZ1bmN0aW9ue3N0YXRpYyBnZXRTYW1wbGVBcnJheShlLHQsYSxyKXtsZXQgbixpLHM9MTtmb3Iobj0wLGk9ZS5sZW5ndGg7bjxpO24rKylzKj1lW25dO3MqPXQ7Y29uc3Qgbz1uZXcgQXJyYXkocyk7bGV0IGM9MCxsPTA7Y29uc3QgaD0xLygyKiphLTEpLHU9ci5nZXRCeXRlcygocyphKzcpLzgpO2xldCBkPTA7Zm9yKG49MDtuPHM7bisrKXtmb3IoO2M8YTspe2w8PD04O2x8PXVbZCsrXTtjKz04fWMtPWE7b1tuXT0obD4+YykqaDtsJj0oMTw8YyktMX1yZXR1cm4gb31zdGF0aWMgcGFyc2UoZSl7bGV0e3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6YSxmbjpyfT1lO2NvbnN0IGk9ci5kaWN0fHxyO3N3aXRjaChpLmdldCgiRnVuY3Rpb25UeXBlIikpe2Nhc2UgMDpyZXR1cm4gdGhpcy5jb25zdHJ1Y3RTYW1wbGVkKHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOmEsZm46cixkaWN0Oml9KTtjYXNlIDE6YnJlYWs7Y2FzZSAyOnJldHVybiB0aGlzLmNvbnN0cnVjdEludGVycG9sYXRlZCh7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDphLGRpY3Q6aX0pO2Nhc2UgMzpyZXR1cm4gdGhpcy5jb25zdHJ1Y3RTdGljaGVkKHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOmEsZGljdDppfSk7Y2FzZSA0OnJldHVybiB0aGlzLmNvbnN0cnVjdFBvc3RTY3JpcHQoe3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6YSxmbjpyLGRpY3Q6aX0pfXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGUgb2YgZnVuY3Rpb24iKX1zdGF0aWMgcGFyc2VBcnJheShlKXtsZXR7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDphLGZuT2JqOnJ9PWU7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuIHRoaXMucGFyc2Uoe3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6YSxmbjpyfSk7Y29uc3Qgbj1bXTtmb3IoY29uc3QgZSBvZiByKW4ucHVzaCh0aGlzLnBhcnNlKHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOmEsZm46dC5mZXRjaElmUmVmKGUpfSkpO3JldHVybiBmdW5jdGlvbihlLHQsYSxyKXtmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspbltpXShlLHQsYSxyK2kpfX1zdGF0aWMgY29uc3RydWN0U2FtcGxlZChlKXtsZXR7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDphLGZuOnIsZGljdDppfT1lO2Z1bmN0aW9uIHRvTXVsdGlBcnJheShlKXtjb25zdCB0PWUubGVuZ3RoLGE9W107bGV0IHI9MDtmb3IobGV0IG49MDtuPHQ7bis9MilhW3IrK109W2Vbbl0sZVtuKzFdXTtyZXR1cm4gYX1mdW5jdGlvbiBpbnRlcnBvbGF0ZShlLHQsYSxyLG4pe3JldHVybiByKyhuLXIpLyhhLXQpKihlLXQpfWxldCBzPXRvTnVtYmVyQXJyYXkoaS5nZXRBcnJheSgiRG9tYWluIikpLG89dG9OdW1iZXJBcnJheShpLmdldEFycmF5KCJSYW5nZSIpKTtpZighc3x8IW8pdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiBvciByYW5nZSIpO2NvbnN0IGM9cy5sZW5ndGgvMixsPW8ubGVuZ3RoLzI7cz10b011bHRpQXJyYXkocyk7bz10b011bHRpQXJyYXkobyk7Y29uc3QgaD10b051bWJlckFycmF5KGkuZ2V0QXJyYXkoIlNpemUiKSksdT1pLmdldCgiQml0c1BlclNhbXBsZSIpLGQ9aS5nZXQoIk9yZGVyIil8fDE7MSE9PWQmJigwLG4uaW5mbykoIk5vIHN1cHBvcnQgZm9yIGN1YmljIHNwbGluZSBpbnRlcnBvbGF0aW9uOiAiK2QpO2xldCBmPXRvTnVtYmVyQXJyYXkoaS5nZXRBcnJheSgiRW5jb2RlIikpO2lmKGYpZj10b011bHRpQXJyYXkoZik7ZWxzZXtmPVtdO2ZvcihsZXQgZT0wO2U8YzsrK2UpZi5wdXNoKFswLGhbZV0tMV0pfWxldCBnPXRvTnVtYmVyQXJyYXkoaS5nZXRBcnJheSgiRGVjb2RlIikpO2c9Zz90b011bHRpQXJyYXkoZyk6bztjb25zdCBwPXRoaXMuZ2V0U2FtcGxlQXJyYXkoaCxsLHUscik7cmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFNhbXBsZWRGbihlLHQsYSxyKXtjb25zdCBuPTE8PGMsaT1uZXcgRmxvYXQ2NEFycmF5KG4pLHU9bmV3IFVpbnQzMkFycmF5KG4pO2xldCBkLG07Zm9yKG09MDttPG47bSsrKWlbbV09MTtsZXQgYj1sLHk9MTtmb3IoZD0wO2Q8YzsrK2Qpe2NvbnN0IGE9c1tkXVswXSxyPXNbZF1bMV07bGV0IG89aW50ZXJwb2xhdGUoTWF0aC5taW4oTWF0aC5tYXgoZVt0K2RdLGEpLHIpLGEscixmW2RdWzBdLGZbZF1bMV0pO2NvbnN0IGM9aFtkXTtvPU1hdGgubWluKE1hdGgubWF4KG8sMCksYy0xKTtjb25zdCBsPW88Yy0xP01hdGguZmxvb3Iobyk6by0xLGc9bCsxLW8scD1vLWwsdz1sKmIsUz13K2I7Zm9yKG09MDttPG47bSsrKWlmKG0meSl7aVttXSo9cDt1W21dKz1TfWVsc2V7aVttXSo9Zzt1W21dKz13fWIqPWM7eTw8PTF9Zm9yKG09MDttPGw7KyttKXtsZXQgZT0wO2ZvcihkPTA7ZDxuO2QrKyllKz1wW3VbZF0rbV0qaVtkXTtlPWludGVycG9sYXRlKGUsMCwxLGdbbV1bMF0sZ1ttXVsxXSk7YVtyK21dPU1hdGgubWluKE1hdGgubWF4KGUsb1ttXVswXSksb1ttXVsxXSl9fX1zdGF0aWMgY29uc3RydWN0SW50ZXJwb2xhdGVkKGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOmEsZGljdDpyfT1lO2NvbnN0IG49dG9OdW1iZXJBcnJheShyLmdldEFycmF5KCJDMCIpKXx8WzBdLGk9dG9OdW1iZXJBcnJheShyLmdldEFycmF5KCJDMSIpKXx8WzFdLHM9ci5nZXQoIk4iKSxvPVtdO2ZvcihsZXQgZT0wLHQ9bi5sZW5ndGg7ZTx0OysrZSlvLnB1c2goaVtlXS1uW2VdKTtjb25zdCBjPW8ubGVuZ3RoO3JldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGbihlLHQsYSxyKXtjb25zdCBpPTE9PT1zP2VbdF06ZVt0XSoqcztmb3IobGV0IGU9MDtlPGM7KytlKWFbcitlXT1uW2VdK2kqb1tlXX19c3RhdGljIGNvbnN0cnVjdFN0aWNoZWQoZSl7bGV0e3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6YSxkaWN0OnJ9PWU7Y29uc3QgaT10b051bWJlckFycmF5KHIuZ2V0QXJyYXkoIkRvbWFpbiIpKTtpZighaSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiTm8gZG9tYWluIik7aWYoMSE9PWkubGVuZ3RoLzIpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkJhZCBkb21haW4gZm9yIHN0aWNoZWQgZnVuY3Rpb24iKTtjb25zdCBzPVtdO2Zvcihjb25zdCBlIG9mIHIuZ2V0KCJGdW5jdGlvbnMiKSlzLnB1c2godGhpcy5wYXJzZSh7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDphLGZuOnQuZmV0Y2hJZlJlZihlKX0pKTtjb25zdCBvPXRvTnVtYmVyQXJyYXkoci5nZXRBcnJheSgiQm91bmRzIikpLGM9dG9OdW1iZXJBcnJheShyLmdldEFycmF5KCJFbmNvZGUiKSksbD1uZXcgRmxvYXQzMkFycmF5KDEpO3JldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRm4oZSx0LGEscil7Y29uc3Qgbj1mdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRnJvbUlSQ2xpcChlLHQsYSl7ZT5hP2U9YTplPHQmJihlPXQpO3JldHVybiBlfShlW3RdLGlbMF0saVsxXSksaD1vLmxlbmd0aDtsZXQgdTtmb3IodT0wO3U8aCYmIShuPG9bdV0pOysrdSk7bGV0IGQ9aVswXTt1PjAmJihkPW9bdS0xXSk7bGV0IGY9aVsxXTt1PG8ubGVuZ3RoJiYoZj1vW3VdKTtjb25zdCBnPWNbMip1XSxwPWNbMip1KzFdO2xbMF09ZD09PWY/ZzpnKyhuLWQpKihwLWcpLyhmLWQpO3NbdV0obCwwLGEscil9fXN0YXRpYyBjb25zdHJ1Y3RQb3N0U2NyaXB0KGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOmEsZm46cixkaWN0OnN9PWU7Y29uc3Qgbz10b051bWJlckFycmF5KHMuZ2V0QXJyYXkoIkRvbWFpbiIpKSxjPXRvTnVtYmVyQXJyYXkocy5nZXRBcnJheSgiUmFuZ2UiKSk7aWYoIW8pdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk5vIGRvbWFpbi4iKTtpZighYyl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiTm8gcmFuZ2UuIik7Y29uc3QgbD1uZXcgaS5Qb3N0U2NyaXB0TGV4ZXIociksaD1uZXcgaS5Qb3N0U2NyaXB0UGFyc2VyKGwpLnBhcnNlKCk7aWYoYSYmbi5GZWF0dXJlVGVzdC5pc0V2YWxTdXBwb3J0ZWQpe2NvbnN0IGU9KG5ldyBQb3N0U2NyaXB0Q29tcGlsZXIpLmNvbXBpbGUoaCxvLGMpO2lmKGUpcmV0dXJuIG5ldyBGdW5jdGlvbigic3JjIiwic3JjT2Zmc2V0IiwiZGVzdCIsImRlc3RPZmZzZXQiLGUpfSgwLG4uaW5mbykoIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7Y29uc3QgdT1jLmxlbmd0aD4+MSxkPW8ubGVuZ3RoPj4xLGY9bmV3IFBvc3RTY3JpcHRFdmFsdWF0b3IoaCksZz1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBwPTgxOTI7Y29uc3QgbT1uZXcgRmxvYXQzMkFycmF5KGQpO3JldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RQb3N0U2NyaXB0Rm4oZSx0LGEscil7bGV0IG4saSxzPSIiO2NvbnN0IG89bTtmb3Iobj0wO248ZDtuKyspe2k9ZVt0K25dO29bbl09aTtzKz1pKyJfIn1jb25zdCBsPWdbc107aWYodm9pZCAwIT09bCl7YS5zZXQobCxyKTtyZXR1cm59Y29uc3QgaD1uZXcgRmxvYXQzMkFycmF5KHUpLGI9Zi5leGVjdXRlKG8pLHk9Yi5sZW5ndGgtdTtmb3Iobj0wO248dTtuKyspe2k9Ylt5K25dO2xldCBlPWNbMipuXTtpZihpPGUpaT1lO2Vsc2V7ZT1jWzIqbisxXTtpPmUmJihpPWUpfWhbbl09aX1pZihwPjApe3AtLTtnW3NdPWh9YS5zZXQoaCxyKX19fWNsYXNzIFBvc3RTY3JpcHRTdGFja3tzdGF0aWMgTUFYX1NUQUNLX1NJWkU9MTAwO2NvbnN0cnVjdG9yKGUpe3RoaXMuc3RhY2s9ZT9BcnJheS5mcm9tKGUpOltdfXB1c2goZSl7aWYodGhpcy5zdGFjay5sZW5ndGg+PVBvc3RTY3JpcHRTdGFjay5NQVhfU1RBQ0tfU0laRSl0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuIik7dGhpcy5zdGFjay5wdXNoKGUpfXBvcCgpe2lmKHRoaXMuc3RhY2subGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiUG9zdFNjcmlwdCBmdW5jdGlvbiBzdGFjayB1bmRlcmZsb3cuIik7cmV0dXJuIHRoaXMuc3RhY2sucG9wKCl9Y29weShlKXtpZih0aGlzLnN0YWNrLmxlbmd0aCtlPj1Qb3N0U2NyaXB0U3RhY2suTUFYX1NUQUNLX1NJWkUpdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpO2NvbnN0IHQ9dGhpcy5zdGFjaztmb3IobGV0IGE9dC5sZW5ndGgtZSxyPWUtMTtyPj0wO3ItLSxhKyspdC5wdXNoKHRbYV0pfWluZGV4KGUpe3RoaXMucHVzaCh0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLWUtMV0pfXJvbGwoZSx0KXtjb25zdCBhPXRoaXMuc3RhY2sscj1hLmxlbmd0aC1lLG49YS5sZW5ndGgtMSxpPXIrKHQtTWF0aC5mbG9vcih0L2UpKmUpO2ZvcihsZXQgZT1yLHQ9bjtlPHQ7ZSsrLHQtLSl7Y29uc3Qgcj1hW2VdO2FbZV09YVt0XTthW3RdPXJ9Zm9yKGxldCBlPXIsdD1pLTE7ZTx0O2UrKyx0LS0pe2NvbnN0IHI9YVtlXTthW2VdPWFbdF07YVt0XT1yfWZvcihsZXQgZT1pLHQ9bjtlPHQ7ZSsrLHQtLSl7Y29uc3Qgcj1hW2VdO2FbZV09YVt0XTthW3RdPXJ9fX1jbGFzcyBQb3N0U2NyaXB0RXZhbHVhdG9ye2NvbnN0cnVjdG9yKGUpe3RoaXMub3BlcmF0b3JzPWV9ZXhlY3V0ZShlKXtjb25zdCB0PW5ldyBQb3N0U2NyaXB0U3RhY2soZSk7bGV0IGE9MDtjb25zdCByPXRoaXMub3BlcmF0b3JzLGk9ci5sZW5ndGg7bGV0IHMsbyxjO2Zvcig7YTxpOyl7cz1yW2ErK107aWYoIm51bWJlciIhPXR5cGVvZiBzKXN3aXRjaChzKXtjYXNlImp6IjpjPXQucG9wKCk7bz10LnBvcCgpO298fChhPWMpO2JyZWFrO2Nhc2UiaiI6bz10LnBvcCgpO2E9bzticmVhaztjYXNlImFicyI6bz10LnBvcCgpO3QucHVzaChNYXRoLmFicyhvKSk7YnJlYWs7Y2FzZSJhZGQiOmM9dC5wb3AoKTtvPXQucG9wKCk7dC5wdXNoKG8rYyk7YnJlYWs7Y2FzZSJhbmQiOmM9dC5wb3AoKTtvPXQucG9wKCk7ImJvb2xlYW4iPT10eXBlb2YgbyYmImJvb2xlYW4iPT10eXBlb2YgYz90LnB1c2gobyYmYyk6dC5wdXNoKG8mYyk7YnJlYWs7Y2FzZSJhdGFuIjpjPXQucG9wKCk7bz10LnBvcCgpO289TWF0aC5hdGFuMihvLGMpL01hdGguUEkqMTgwO288MCYmKG8rPTM2MCk7dC5wdXNoKG8pO2JyZWFrO2Nhc2UiYml0c2hpZnQiOmM9dC5wb3AoKTtvPXQucG9wKCk7bz4wP3QucHVzaChvPDxjKTp0LnB1c2gobz4+Yyk7YnJlYWs7Y2FzZSJjZWlsaW5nIjpvPXQucG9wKCk7dC5wdXNoKE1hdGguY2VpbChvKSk7YnJlYWs7Y2FzZSJjb3B5IjpvPXQucG9wKCk7dC5jb3B5KG8pO2JyZWFrO2Nhc2UiY29zIjpvPXQucG9wKCk7dC5wdXNoKE1hdGguY29zKG8lMzYwLzE4MCpNYXRoLlBJKSk7YnJlYWs7Y2FzZSJjdmkiOm89MHx0LnBvcCgpO3QucHVzaChvKTticmVhaztjYXNlImN2ciI6YnJlYWs7Y2FzZSJkaXYiOmM9dC5wb3AoKTtvPXQucG9wKCk7dC5wdXNoKG8vYyk7YnJlYWs7Y2FzZSJkdXAiOnQuY29weSgxKTticmVhaztjYXNlImVxIjpjPXQucG9wKCk7bz10LnBvcCgpO3QucHVzaChvPT09Yyk7YnJlYWs7Y2FzZSJleGNoIjp0LnJvbGwoMiwxKTticmVhaztjYXNlImV4cCI6Yz10LnBvcCgpO289dC5wb3AoKTt0LnB1c2gobyoqYyk7YnJlYWs7Y2FzZSJmYWxzZSI6dC5wdXNoKCExKTticmVhaztjYXNlImZsb29yIjpvPXQucG9wKCk7dC5wdXNoKE1hdGguZmxvb3IobykpO2JyZWFrO2Nhc2UiZ2UiOmM9dC5wb3AoKTtvPXQucG9wKCk7dC5wdXNoKG8+PWMpO2JyZWFrO2Nhc2UiZ3QiOmM9dC5wb3AoKTtvPXQucG9wKCk7dC5wdXNoKG8+Yyk7YnJlYWs7Y2FzZSJpZGl2IjpjPXQucG9wKCk7bz10LnBvcCgpO3QucHVzaChvL2N8MCk7YnJlYWs7Y2FzZSJpbmRleCI6bz10LnBvcCgpO3QuaW5kZXgobyk7YnJlYWs7Y2FzZSJsZSI6Yz10LnBvcCgpO289dC5wb3AoKTt0LnB1c2gobzw9Yyk7YnJlYWs7Y2FzZSJsbiI6bz10LnBvcCgpO3QucHVzaChNYXRoLmxvZyhvKSk7YnJlYWs7Y2FzZSJsb2ciOm89dC5wb3AoKTt0LnB1c2goTWF0aC5sb2cxMChvKSk7YnJlYWs7Y2FzZSJsdCI6Yz10LnBvcCgpO289dC5wb3AoKTt0LnB1c2gobzxjKTticmVhaztjYXNlIm1vZCI6Yz10LnBvcCgpO289dC5wb3AoKTt0LnB1c2gobyVjKTticmVhaztjYXNlIm11bCI6Yz10LnBvcCgpO289dC5wb3AoKTt0LnB1c2gobypjKTticmVhaztjYXNlIm5lIjpjPXQucG9wKCk7bz10LnBvcCgpO3QucHVzaChvIT09Yyk7YnJlYWs7Y2FzZSJuZWciOm89dC5wb3AoKTt0LnB1c2goLW8pO2JyZWFrO2Nhc2Uibm90IjpvPXQucG9wKCk7ImJvb2xlYW4iPT10eXBlb2Ygbz90LnB1c2goIW8pOnQucHVzaCh+byk7YnJlYWs7Y2FzZSJvciI6Yz10LnBvcCgpO289dC5wb3AoKTsiYm9vbGVhbiI9PXR5cGVvZiBvJiYiYm9vbGVhbiI9PXR5cGVvZiBjP3QucHVzaChvfHxjKTp0LnB1c2gob3xjKTticmVhaztjYXNlInBvcCI6dC5wb3AoKTticmVhaztjYXNlInJvbGwiOmM9dC5wb3AoKTtvPXQucG9wKCk7dC5yb2xsKG8sYyk7YnJlYWs7Y2FzZSJyb3VuZCI6bz10LnBvcCgpO3QucHVzaChNYXRoLnJvdW5kKG8pKTticmVhaztjYXNlInNpbiI6bz10LnBvcCgpO3QucHVzaChNYXRoLnNpbihvJTM2MC8xODAqTWF0aC5QSSkpO2JyZWFrO2Nhc2Uic3FydCI6bz10LnBvcCgpO3QucHVzaChNYXRoLnNxcnQobykpO2JyZWFrO2Nhc2Uic3ViIjpjPXQucG9wKCk7bz10LnBvcCgpO3QucHVzaChvLWMpO2JyZWFrO2Nhc2UidHJ1ZSI6dC5wdXNoKCEwKTticmVhaztjYXNlInRydW5jYXRlIjpvPXQucG9wKCk7bz1vPDA/TWF0aC5jZWlsKG8pOk1hdGguZmxvb3Iobyk7dC5wdXNoKG8pO2JyZWFrO2Nhc2UieG9yIjpjPXQucG9wKCk7bz10LnBvcCgpOyJib29sZWFuIj09dHlwZW9mIG8mJiJib29sZWFuIj09dHlwZW9mIGM/dC5wdXNoKG8hPT1jKTp0LnB1c2gob15jKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBuLkZvcm1hdEVycm9yKGBVbmtub3duIG9wZXJhdG9yICR7c31gKX1lbHNlIHQucHVzaChzKX1yZXR1cm4gdC5zdGFja319dC5Qb3N0U2NyaXB0RXZhbHVhdG9yPVBvc3RTY3JpcHRFdmFsdWF0b3I7Y2xhc3MgQXN0Tm9kZXtjb25zdHJ1Y3RvcihlKXt0aGlzLnR5cGU9ZX12aXNpdChlKXsoMCxuLnVucmVhY2hhYmxlKSgiYWJzdHJhY3QgbWV0aG9kIil9fWNsYXNzIEFzdEFyZ3VtZW50IGV4dGVuZHMgQXN0Tm9kZXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoImFyZ3MiKTt0aGlzLmluZGV4PWU7dGhpcy5taW49dDt0aGlzLm1heD1hfXZpc2l0KGUpe2UudmlzaXRBcmd1bWVudCh0aGlzKX19Y2xhc3MgQXN0TGl0ZXJhbCBleHRlbmRzIEFzdE5vZGV7Y29uc3RydWN0b3IoZSl7c3VwZXIoImxpdGVyYWwiKTt0aGlzLm51bWJlcj1lO3RoaXMubWluPWU7dGhpcy5tYXg9ZX12aXNpdChlKXtlLnZpc2l0TGl0ZXJhbCh0aGlzKX19Y2xhc3MgQXN0QmluYXJ5T3BlcmF0aW9uIGV4dGVuZHMgQXN0Tm9kZXtjb25zdHJ1Y3RvcihlLHQsYSxyLG4pe3N1cGVyKCJiaW5hcnkiKTt0aGlzLm9wPWU7dGhpcy5hcmcxPXQ7dGhpcy5hcmcyPWE7dGhpcy5taW49cjt0aGlzLm1heD1ufXZpc2l0KGUpe2UudmlzaXRCaW5hcnlPcGVyYXRpb24odGhpcyl9fWNsYXNzIEFzdE1pbiBleHRlbmRzIEFzdE5vZGV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigibWF4Iik7dGhpcy5hcmc9ZTt0aGlzLm1pbj1lLm1pbjt0aGlzLm1heD10fXZpc2l0KGUpe2UudmlzaXRNaW4odGhpcyl9fWNsYXNzIEFzdFZhcmlhYmxlIGV4dGVuZHMgQXN0Tm9kZXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoInZhciIpO3RoaXMuaW5kZXg9ZTt0aGlzLm1pbj10O3RoaXMubWF4PWF9dmlzaXQoZSl7ZS52aXNpdFZhcmlhYmxlKHRoaXMpfX1jbGFzcyBBc3RWYXJpYWJsZURlZmluaXRpb24gZXh0ZW5kcyBBc3ROb2Rle2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoImRlZmluaXRpb24iKTt0aGlzLnZhcmlhYmxlPWU7dGhpcy5hcmc9dH12aXNpdChlKXtlLnZpc2l0VmFyaWFibGVEZWZpbml0aW9uKHRoaXMpfX1jbGFzcyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3J7Y29uc3RydWN0b3IoKXt0aGlzLnBhcnRzPVtdfXZpc2l0QXJndW1lbnQoZSl7dGhpcy5wYXJ0cy5wdXNoKCJNYXRoLm1heCgiLGUubWluLCIsIE1hdGgubWluKCIsZS5tYXgsIiwgc3JjW3NyY09mZnNldCArICIsZS5pbmRleCwiXSkpIil9dmlzaXRWYXJpYWJsZShlKXt0aGlzLnBhcnRzLnB1c2goInYiLGUuaW5kZXgpfXZpc2l0TGl0ZXJhbChlKXt0aGlzLnBhcnRzLnB1c2goZS5udW1iZXIpfXZpc2l0QmluYXJ5T3BlcmF0aW9uKGUpe3RoaXMucGFydHMucHVzaCgiKCIpO2UuYXJnMS52aXNpdCh0aGlzKTt0aGlzLnBhcnRzLnB1c2goIiAiLGUub3AsIiAiKTtlLmFyZzIudmlzaXQodGhpcyk7dGhpcy5wYXJ0cy5wdXNoKCIpIil9dmlzaXRWYXJpYWJsZURlZmluaXRpb24oZSl7dGhpcy5wYXJ0cy5wdXNoKCJ2YXIgIik7ZS52YXJpYWJsZS52aXNpdCh0aGlzKTt0aGlzLnBhcnRzLnB1c2goIiA9ICIpO2UuYXJnLnZpc2l0KHRoaXMpO3RoaXMucGFydHMucHVzaCgiOyIpfXZpc2l0TWluKGUpe3RoaXMucGFydHMucHVzaCgiTWF0aC5taW4oIik7ZS5hcmcudmlzaXQodGhpcyk7dGhpcy5wYXJ0cy5wdXNoKCIsICIsZS5tYXgsIikiKX10b1N0cmluZygpe3JldHVybiB0aGlzLnBhcnRzLmpvaW4oIiIpfX1mdW5jdGlvbiBidWlsZEFkZE9wZXJhdGlvbihlLHQpe3JldHVybiJsaXRlcmFsIj09PXQudHlwZSYmMD09PXQubnVtYmVyP2U6ImxpdGVyYWwiPT09ZS50eXBlJiYwPT09ZS5udW1iZXI/dDoibGl0ZXJhbCI9PT10LnR5cGUmJiJsaXRlcmFsIj09PWUudHlwZT9uZXcgQXN0TGl0ZXJhbChlLm51bWJlcit0Lm51bWJlcik6bmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiKyIsZSx0LGUubWluK3QubWluLGUubWF4K3QubWF4KX1mdW5jdGlvbiBidWlsZE11bE9wZXJhdGlvbihlLHQpe2lmKCJsaXRlcmFsIj09PXQudHlwZSl7aWYoMD09PXQubnVtYmVyKXJldHVybiBuZXcgQXN0TGl0ZXJhbCgwKTtpZigxPT09dC5udW1iZXIpcmV0dXJuIGU7aWYoImxpdGVyYWwiPT09ZS50eXBlKXJldHVybiBuZXcgQXN0TGl0ZXJhbChlLm51bWJlcip0Lm51bWJlcil9aWYoImxpdGVyYWwiPT09ZS50eXBlKXtpZigwPT09ZS5udW1iZXIpcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApO2lmKDE9PT1lLm51bWJlcilyZXR1cm4gdH1jb25zdCBhPU1hdGgubWluKGUubWluKnQubWluLGUubWluKnQubWF4LGUubWF4KnQubWluLGUubWF4KnQubWF4KSxyPU1hdGgubWF4KGUubWluKnQubWluLGUubWluKnQubWF4LGUubWF4KnQubWluLGUubWF4KnQubWF4KTtyZXR1cm4gbmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiKiIsZSx0LGEscil9ZnVuY3Rpb24gYnVpbGRTdWJPcGVyYXRpb24oZSx0KXtpZigibGl0ZXJhbCI9PT10LnR5cGUpe2lmKDA9PT10Lm51bWJlcilyZXR1cm4gZTtpZigibGl0ZXJhbCI9PT1lLnR5cGUpcmV0dXJuIG5ldyBBc3RMaXRlcmFsKGUubnVtYmVyLXQubnVtYmVyKX1yZXR1cm4iYmluYXJ5Ij09PXQudHlwZSYmIi0iPT09dC5vcCYmImxpdGVyYWwiPT09ZS50eXBlJiYxPT09ZS5udW1iZXImJiJsaXRlcmFsIj09PXQuYXJnMS50eXBlJiYxPT09dC5hcmcxLm51bWJlcj90LmFyZzI6bmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiLSIsZSx0LGUubWluLXQubWF4LGUubWF4LXQubWluKX1mdW5jdGlvbiBidWlsZE1pbk9wZXJhdGlvbihlLHQpe3JldHVybiBlLm1pbj49dD9uZXcgQXN0TGl0ZXJhbCh0KTplLm1heDw9dD9lOm5ldyBBc3RNaW4oZSx0KX1jbGFzcyBQb3N0U2NyaXB0Q29tcGlsZXJ7Y29tcGlsZShlLHQsYSl7Y29uc3Qgcj1bXSxuPVtdLGk9dC5sZW5ndGg+PjEscz1hLmxlbmd0aD4+MTtsZXQgbyxjLGwsaCx1LGQsZixnLHA9MDtmb3IobGV0IGU9MDtlPGk7ZSsrKXIucHVzaChuZXcgQXN0QXJndW1lbnQoZSx0WzIqZV0sdFsyKmUrMV0pKTtmb3IobGV0IHQ9MCxhPWUubGVuZ3RoO3Q8YTt0Kyspe2c9ZVt0XTtpZigibnVtYmVyIiE9dHlwZW9mIGcpc3dpdGNoKGcpe2Nhc2UiYWRkIjppZihyLmxlbmd0aDwyKXJldHVybiBudWxsO2g9ci5wb3AoKTtsPXIucG9wKCk7ci5wdXNoKGJ1aWxkQWRkT3BlcmF0aW9uKGwsaCkpO2JyZWFrO2Nhc2UiY3ZyIjppZihyLmxlbmd0aDwxKXJldHVybiBudWxsO2JyZWFrO2Nhc2UibXVsIjppZihyLmxlbmd0aDwyKXJldHVybiBudWxsO2g9ci5wb3AoKTtsPXIucG9wKCk7ci5wdXNoKGJ1aWxkTXVsT3BlcmF0aW9uKGwsaCkpO2JyZWFrO2Nhc2Uic3ViIjppZihyLmxlbmd0aDwyKXJldHVybiBudWxsO2g9ci5wb3AoKTtsPXIucG9wKCk7ci5wdXNoKGJ1aWxkU3ViT3BlcmF0aW9uKGwsaCkpO2JyZWFrO2Nhc2UiZXhjaCI6aWYoci5sZW5ndGg8MilyZXR1cm4gbnVsbDt1PXIucG9wKCk7ZD1yLnBvcCgpO3IucHVzaCh1LGQpO2JyZWFrO2Nhc2UicG9wIjppZihyLmxlbmd0aDwxKXJldHVybiBudWxsO3IucG9wKCk7YnJlYWs7Y2FzZSJpbmRleCI6aWYoci5sZW5ndGg8MSlyZXR1cm4gbnVsbDtsPXIucG9wKCk7aWYoImxpdGVyYWwiIT09bC50eXBlKXJldHVybiBudWxsO289bC5udW1iZXI7aWYobzwwfHwhTnVtYmVyLmlzSW50ZWdlcihvKXx8ci5sZW5ndGg8bylyZXR1cm4gbnVsbDt1PXJbci5sZW5ndGgtby0xXTtpZigibGl0ZXJhbCI9PT11LnR5cGV8fCJ2YXIiPT09dS50eXBlKXtyLnB1c2godSk7YnJlYWt9Zj1uZXcgQXN0VmFyaWFibGUocCsrLHUubWluLHUubWF4KTtyW3IubGVuZ3RoLW8tMV09ZjtyLnB1c2goZik7bi5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24oZix1KSk7YnJlYWs7Y2FzZSJkdXAiOmlmKHIubGVuZ3RoPDEpcmV0dXJuIG51bGw7aWYoIm51bWJlciI9PXR5cGVvZiBlW3QrMV0mJiJndCI9PT1lW3QrMl0mJmVbdCszXT09PXQrNyYmImp6Ij09PWVbdCs0XSYmInBvcCI9PT1lW3QrNV0mJmVbdCs2XT09PWVbdCsxXSl7bD1yLnBvcCgpO3IucHVzaChidWlsZE1pbk9wZXJhdGlvbihsLGVbdCsxXSkpO3QrPTY7YnJlYWt9dT1yLmF0KC0xKTtpZigibGl0ZXJhbCI9PT11LnR5cGV8fCJ2YXIiPT09dS50eXBlKXtyLnB1c2godSk7YnJlYWt9Zj1uZXcgQXN0VmFyaWFibGUocCsrLHUubWluLHUubWF4KTtyW3IubGVuZ3RoLTFdPWY7ci5wdXNoKGYpO24ucHVzaChuZXcgQXN0VmFyaWFibGVEZWZpbml0aW9uKGYsdSkpO2JyZWFrO2Nhc2Uicm9sbCI6aWYoci5sZW5ndGg8MilyZXR1cm4gbnVsbDtoPXIucG9wKCk7bD1yLnBvcCgpO2lmKCJsaXRlcmFsIiE9PWgudHlwZXx8ImxpdGVyYWwiIT09bC50eXBlKXJldHVybiBudWxsO2M9aC5udW1iZXI7bz1sLm51bWJlcjtpZihvPD0wfHwhTnVtYmVyLmlzSW50ZWdlcihvKXx8IU51bWJlci5pc0ludGVnZXIoYyl8fHIubGVuZ3RoPG8pcmV0dXJuIG51bGw7Yz0oYyVvK28pJW87aWYoMD09PWMpYnJlYWs7ci5wdXNoKC4uLnIuc3BsaWNlKHIubGVuZ3RoLW8sby1jKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbnVsbH1lbHNlIHIucHVzaChuZXcgQXN0TGl0ZXJhbChnKSl9aWYoci5sZW5ndGghPT1zKXJldHVybiBudWxsO2NvbnN0IG09W107Zm9yKGNvbnN0IGUgb2Ygbil7Y29uc3QgdD1uZXcgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yO2UudmlzaXQodCk7bS5wdXNoKHQudG9TdHJpbmcoKSl9Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtlPHQ7ZSsrKXtjb25zdCB0PXJbZV0sbj1uZXcgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yO3QudmlzaXQobik7Y29uc3QgaT1hWzIqZV0scz1hWzIqZSsxXSxvPVtuLnRvU3RyaW5nKCldO2lmKGk+dC5taW4pe28udW5zaGlmdCgiTWF0aC5tYXgoIixpLCIsICIpO28ucHVzaCgiKSIpfWlmKHM8dC5tYXgpe28udW5zaGlmdCgiTWF0aC5taW4oIixzLCIsICIpO28ucHVzaCgiKSIpfW8udW5zaGlmdCgiZGVzdFtkZXN0T2Zmc2V0ICsgIixlLCJdID0gIik7by5wdXNoKCI7Iik7bS5wdXNoKG8uam9pbigiIikpfXJldHVybiBtLmpvaW4oIlxuIil9fXQuUG9zdFNjcmlwdENvbXBpbGVyPVBvc3RTY3JpcHRDb21waWxlcn0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5Qb3N0U2NyaXB0UGFyc2VyPXQuUG9zdFNjcmlwdExleGVyPXZvaWQgMDthKDEzOSk7dmFyIHI9YSgxNDQpLG49YSgxNTApLGk9YSgxNDkpO3QuUG9zdFNjcmlwdFBhcnNlcj1jbGFzcyBQb3N0U2NyaXB0UGFyc2Vye2NvbnN0cnVjdG9yKGUpe3RoaXMubGV4ZXI9ZTt0aGlzLm9wZXJhdG9ycz1bXTt0aGlzLnRva2VuPW51bGw7dGhpcy5wcmV2PW51bGx9bmV4dFRva2VuKCl7dGhpcy5wcmV2PXRoaXMudG9rZW47dGhpcy50b2tlbj10aGlzLmxleGVyLmdldFRva2VuKCl9YWNjZXB0KGUpe2lmKHRoaXMudG9rZW4udHlwZT09PWUpe3RoaXMubmV4dFRva2VuKCk7cmV0dXJuITB9cmV0dXJuITF9ZXhwZWN0KGUpe2lmKHRoaXMuYWNjZXB0KGUpKXJldHVybiEwO3Rocm93IG5ldyByLkZvcm1hdEVycm9yKGBVbmV4cGVjdGVkIHN5bWJvbDogZm91bmQgJHt0aGlzLnRva2VuLnR5cGV9IGV4cGVjdGVkICR7ZX0uYCl9cGFyc2UoKXt0aGlzLm5leHRUb2tlbigpO3RoaXMuZXhwZWN0KHMuTEJSQUNFKTt0aGlzLnBhcnNlQmxvY2soKTt0aGlzLmV4cGVjdChzLlJCUkFDRSk7cmV0dXJuIHRoaXMub3BlcmF0b3JzfXBhcnNlQmxvY2soKXtmb3IoOzspaWYodGhpcy5hY2NlcHQocy5OVU1CRVIpKXRoaXMub3BlcmF0b3JzLnB1c2godGhpcy5wcmV2LnZhbHVlKTtlbHNlIGlmKHRoaXMuYWNjZXB0KHMuT1BFUkFUT1IpKXRoaXMub3BlcmF0b3JzLnB1c2godGhpcy5wcmV2LnZhbHVlKTtlbHNle2lmKCF0aGlzLmFjY2VwdChzLkxCUkFDRSkpcmV0dXJuO3RoaXMucGFyc2VDb25kaXRpb24oKX19cGFyc2VDb25kaXRpb24oKXtjb25zdCBlPXRoaXMub3BlcmF0b3JzLmxlbmd0aDt0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsbnVsbCk7dGhpcy5wYXJzZUJsb2NrKCk7dGhpcy5leHBlY3Qocy5SQlJBQ0UpO2lmKHRoaXMuYWNjZXB0KHMuSUYpKXt0aGlzLm9wZXJhdG9yc1tlXT10aGlzLm9wZXJhdG9ycy5sZW5ndGg7dGhpcy5vcGVyYXRvcnNbZSsxXT0ianoifWVsc2V7aWYoIXRoaXMuYWNjZXB0KHMuTEJSQUNFKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiUFMgRnVuY3Rpb246IGVycm9yIHBhcnNpbmcgY29uZGl0aW9uYWwuIik7e2NvbnN0IHQ9dGhpcy5vcGVyYXRvcnMubGVuZ3RoO3RoaXMub3BlcmF0b3JzLnB1c2gobnVsbCxudWxsKTtjb25zdCBhPXRoaXMub3BlcmF0b3JzLmxlbmd0aDt0aGlzLnBhcnNlQmxvY2soKTt0aGlzLmV4cGVjdChzLlJCUkFDRSk7dGhpcy5leHBlY3Qocy5JRkVMU0UpO3RoaXMub3BlcmF0b3JzW3RdPXRoaXMub3BlcmF0b3JzLmxlbmd0aDt0aGlzLm9wZXJhdG9yc1t0KzFdPSJqIjt0aGlzLm9wZXJhdG9yc1tlXT1hO3RoaXMub3BlcmF0b3JzW2UrMV09Imp6In19fX07Y29uc3Qgcz17TEJSQUNFOjAsUkJSQUNFOjEsTlVNQkVSOjIsT1BFUkFUT1I6MyxJRjo0LElGRUxTRTo1fTtjbGFzcyBQb3N0U2NyaXB0VG9rZW57c3RhdGljIGdldCBvcENhY2hlKCl7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsIm9wQ2FjaGUiLE9iamVjdC5jcmVhdGUobnVsbCkpfWNvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWU7dGhpcy52YWx1ZT10fXN0YXRpYyBnZXRPcGVyYXRvcihlKXtyZXR1cm4gUG9zdFNjcmlwdFRva2VuLm9wQ2FjaGVbZV18fD1uZXcgUG9zdFNjcmlwdFRva2VuKHMuT1BFUkFUT1IsZSl9c3RhdGljIGdldCBMQlJBQ0UoKXtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiTEJSQUNFIixuZXcgUG9zdFNjcmlwdFRva2VuKHMuTEJSQUNFLCJ7IikpfXN0YXRpYyBnZXQgUkJSQUNFKCl7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsIlJCUkFDRSIsbmV3IFBvc3RTY3JpcHRUb2tlbihzLlJCUkFDRSwifSIpKX1zdGF0aWMgZ2V0IElGKCl7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsIklGIixuZXcgUG9zdFNjcmlwdFRva2VuKHMuSUYsIklGIikpfXN0YXRpYyBnZXQgSUZFTFNFKCl7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsIklGRUxTRSIsbmV3IFBvc3RTY3JpcHRUb2tlbihzLklGRUxTRSwiSUZFTFNFIikpfX10LlBvc3RTY3JpcHRMZXhlcj1jbGFzcyBQb3N0U2NyaXB0TGV4ZXJ7Y29uc3RydWN0b3IoZSl7dGhpcy5zdHJlYW09ZTt0aGlzLm5leHRDaGFyKCk7dGhpcy5zdHJCdWY9W119bmV4dENoYXIoKXtyZXR1cm4gdGhpcy5jdXJyZW50Q2hhcj10aGlzLnN0cmVhbS5nZXRCeXRlKCl9Z2V0VG9rZW4oKXtsZXQgZT0hMSx0PXRoaXMuY3VycmVudENoYXI7Zm9yKDs7KXtpZih0PDApcmV0dXJuIG4uRU9GO2lmKGUpMTAhPT10JiYxMyE9PXR8fChlPSExKTtlbHNlIGlmKDM3PT09dCllPSEwO2Vsc2UgaWYoISgwLGkuaXNXaGl0ZVNwYWNlKSh0KSlicmVhazt0PXRoaXMubmV4dENoYXIoKX1zd2l0Y2goMHx0KXtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OmNhc2UgNDM6Y2FzZSA0NTpjYXNlIDQ2OnJldHVybiBuZXcgUG9zdFNjcmlwdFRva2VuKHMuTlVNQkVSLHRoaXMuZ2V0TnVtYmVyKCkpO2Nhc2UgMTIzOnRoaXMubmV4dENoYXIoKTtyZXR1cm4gUG9zdFNjcmlwdFRva2VuLkxCUkFDRTtjYXNlIDEyNTp0aGlzLm5leHRDaGFyKCk7cmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5SQlJBQ0V9Y29uc3QgYT10aGlzLnN0ckJ1ZjthLmxlbmd0aD0wO2FbMF09U3RyaW5nLmZyb21DaGFyQ29kZSh0KTtmb3IoOyh0PXRoaXMubmV4dENoYXIoKSk+PTAmJih0Pj02NSYmdDw9OTB8fHQ+PTk3JiZ0PD0xMjIpOylhLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh0KSk7Y29uc3Qgcj1hLmpvaW4oIiIpO3N3aXRjaChyLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaWYiOnJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUY7Y2FzZSJpZmVsc2UiOnJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUZFTFNFO2RlZmF1bHQ6cmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5nZXRPcGVyYXRvcihyKX19Z2V0TnVtYmVyKCl7bGV0IGU9dGhpcy5jdXJyZW50Q2hhcjtjb25zdCB0PXRoaXMuc3RyQnVmO3QubGVuZ3RoPTA7dFswXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpO2Zvcig7KGU9dGhpcy5uZXh0Q2hhcigpKT49MCYmKGU+PTQ4JiZlPD01N3x8NDU9PT1lfHw0Nj09PWUpOyl0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7Y29uc3QgYT1wYXJzZUZsb2F0KHQuam9pbigiIikpO2lmKGlzTmFOKGEpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKGBJbnZhbGlkIGZsb2F0aW5nIHBvaW50IG51bWJlcjogJHthfWApO3JldHVybiBhfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuUmVnaW9uYWxJbWFnZUNhY2hlPXQuTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGU9dC5Mb2NhbEltYWdlQ2FjaGU9dC5Mb2NhbEdTdGF0ZUNhY2hlPXQuTG9jYWxGdW5jdGlvbkNhY2hlPXQuTG9jYWxDb2xvclNwYWNlQ2FjaGU9dC5HbG9iYWxJbWFnZUNhY2hlPXZvaWQgMDthKDIpO2EoMTE2KTthKDEyNik7YSgxMjgpO2EoMTMxKTthKDEzMyk7YSgxMzUpO2EoMTM3KTt2YXIgcj1hKDE0NCksbj1hKDE1MCk7Y2xhc3MgQmFzZUxvY2FsQ2FjaGV7Y29uc3RydWN0b3IoZSl7dGhpcy5jb25zdHJ1Y3Rvcj09PUJhc2VMb2NhbENhY2hlJiYoMCxyLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUxvY2FsQ2FjaGUuIik7dGhpcy5fb25seVJlZnM9ITA9PT1lPy5vbmx5UmVmcztpZighdGhpcy5fb25seVJlZnMpe3RoaXMuX25hbWVSZWZNYXA9bmV3IE1hcDt0aGlzLl9pbWFnZU1hcD1uZXcgTWFwfXRoaXMuX2ltYWdlQ2FjaGU9bmV3IG4uUmVmU2V0Q2FjaGV9Z2V0QnlOYW1lKGUpe3RoaXMuX29ubHlSZWZzJiYoMCxyLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGBnZXRCeU5hbWVgIG1ldGhvZC4iKTtjb25zdCB0PXRoaXMuX25hbWVSZWZNYXAuZ2V0KGUpO3JldHVybiB0P3RoaXMuZ2V0QnlSZWYodCk6dGhpcy5faW1hZ2VNYXAuZ2V0KGUpfHxudWxsfWdldEJ5UmVmKGUpe3JldHVybiB0aGlzLl9pbWFnZUNhY2hlLmdldChlKXx8bnVsbH1zZXQoZSx0LGEpeygwLHIudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHNldGAgY2FsbGVkLiIpfX10LkxvY2FsSW1hZ2VDYWNoZT1jbGFzcyBMb2NhbEltYWdlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZXtzZXQoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwsYT1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCdMb2NhbEltYWdlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFyZ3VtZW50LicpO2lmKHQpe2lmKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHQpKXJldHVybjt0aGlzLl9uYW1lUmVmTWFwLnNldChlLHQpO3RoaXMuX2ltYWdlQ2FjaGUucHV0KHQsYSl9ZWxzZSB0aGlzLl9pbWFnZU1hcC5oYXMoZSl8fHRoaXMuX2ltYWdlTWFwLnNldChlLGEpfX07dC5Mb2NhbENvbG9yU3BhY2VDYWNoZT1jbGFzcyBMb2NhbENvbG9yU3BhY2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hle3NldCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwsYT1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZigic3RyaW5nIiE9dHlwZW9mIGUmJiF0KXRocm93IG5ldyBFcnJvcignTG9jYWxDb2xvclNwYWNlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFuZC9vciAicmVmIiBhcmd1bWVudC4nKTtpZih0KXtpZih0aGlzLl9pbWFnZUNhY2hlLmhhcyh0KSlyZXR1cm47bnVsbCE9PWUmJnRoaXMuX25hbWVSZWZNYXAuc2V0KGUsdCk7dGhpcy5faW1hZ2VDYWNoZS5wdXQodCxhKX1lbHNlIHRoaXMuX2ltYWdlTWFwLmhhcyhlKXx8dGhpcy5faW1hZ2VNYXAuc2V0KGUsYSl9fTt0LkxvY2FsRnVuY3Rpb25DYWNoZT1jbGFzcyBMb2NhbEZ1bmN0aW9uQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZXtjb25zdHJ1Y3RvcihlKXtzdXBlcih7b25seVJlZnM6ITB9KX1zZXQoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCx0PWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO2lmKCFlKXRocm93IG5ldyBFcnJvcignTG9jYWxGdW5jdGlvbkNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpO3RoaXMuX2ltYWdlQ2FjaGUuaGFzKGUpfHx0aGlzLl9pbWFnZUNhY2hlLnB1dChlLHQpfX07dC5Mb2NhbEdTdGF0ZUNhY2hlPWNsYXNzIExvY2FsR1N0YXRlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZXtzZXQoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwsYT1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCdMb2NhbEdTdGF0ZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhcmd1bWVudC4nKTtpZih0KXtpZih0aGlzLl9pbWFnZUNhY2hlLmhhcyh0KSlyZXR1cm47dGhpcy5fbmFtZVJlZk1hcC5zZXQoZSx0KTt0aGlzLl9pbWFnZUNhY2hlLnB1dCh0LGEpfWVsc2UgdGhpcy5faW1hZ2VNYXAuaGFzKGUpfHx0aGlzLl9pbWFnZU1hcC5zZXQoZSxhKX19O3QuTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGU9Y2xhc3MgTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZXtjb25zdHJ1Y3RvcihlKXtzdXBlcih7b25seVJlZnM6ITB9KX1zZXQoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCx0PWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO2lmKCFlKXRocm93IG5ldyBFcnJvcignTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7dGhpcy5faW1hZ2VDYWNoZS5oYXMoZSl8fHRoaXMuX2ltYWdlQ2FjaGUucHV0KGUsdCl9fTt0LlJlZ2lvbmFsSW1hZ2VDYWNoZT1jbGFzcyBSZWdpb25hbEltYWdlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZXtjb25zdHJ1Y3RvcihlKXtzdXBlcih7b25seVJlZnM6ITB9KX1zZXQoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCx0PWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO2lmKCFlKXRocm93IG5ldyBFcnJvcignUmVnaW9uYWxJbWFnZUNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpO3RoaXMuX2ltYWdlQ2FjaGUuaGFzKGUpfHx0aGlzLl9pbWFnZUNhY2hlLnB1dChlLHQpfX07Y2xhc3MgR2xvYmFsSW1hZ2VDYWNoZXtzdGF0aWMgTlVNX1BBR0VTX1RIUkVTSE9MRD0yO3N0YXRpYyBNSU5fSU1BR0VTX1RPX0NBQ0hFPTEwO3N0YXRpYyBNQVhfQllURV9TSVpFPTUqci5NQVhfSU1BR0VfU0laRV9UT19DQUNIRTtjb25zdHJ1Y3Rvcigpe3RoaXMuX3JlZkNhY2hlPW5ldyBuLlJlZlNldENhY2hlO3RoaXMuX2ltYWdlQ2FjaGU9bmV3IG4uUmVmU2V0Q2FjaGV9Z2V0IF9ieXRlU2l6ZSgpe2xldCBlPTA7Zm9yKGNvbnN0IHQgb2YgdGhpcy5faW1hZ2VDYWNoZSllKz10LmJ5dGVTaXplO3JldHVybiBlfWdldCBfY2FjaGVMaW1pdFJlYWNoZWQoKXtyZXR1cm4hKHRoaXMuX2ltYWdlQ2FjaGUuc2l6ZTxHbG9iYWxJbWFnZUNhY2hlLk1JTl9JTUFHRVNfVE9fQ0FDSEUpJiYhKHRoaXMuX2J5dGVTaXplPEdsb2JhbEltYWdlQ2FjaGUuTUFYX0JZVEVfU0laRSl9c2hvdWxkQ2FjaGUoZSx0KXtsZXQgYT10aGlzLl9yZWZDYWNoZS5nZXQoZSk7aWYoIWEpe2E9bmV3IFNldDt0aGlzLl9yZWZDYWNoZS5wdXQoZSxhKX1hLmFkZCh0KTtyZXR1cm4hKGEuc2l6ZTxHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpJiYhKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhlKSYmdGhpcy5fY2FjaGVMaW1pdFJlYWNoZWQpfWFkZEJ5dGVTaXplKGUsdCl7Y29uc3QgYT10aGlzLl9pbWFnZUNhY2hlLmdldChlKTthJiYoYS5ieXRlU2l6ZXx8KGEuYnl0ZVNpemU9dCkpfWdldERhdGEoZSx0KXtjb25zdCBhPXRoaXMuX3JlZkNhY2hlLmdldChlKTtpZighYSlyZXR1cm4gbnVsbDtpZihhLnNpemU8R2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKXJldHVybiBudWxsO2NvbnN0IHI9dGhpcy5faW1hZ2VDYWNoZS5nZXQoZSk7aWYoIXIpcmV0dXJuIG51bGw7YS5hZGQodCk7cmV0dXJuIHJ9c2V0RGF0YShlLHQpe2lmKCF0aGlzLl9yZWZDYWNoZS5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCdHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBleHBlY3RlZCAic2hvdWxkQ2FjaGUiIHRvIGhhdmUgYmVlbiBjYWxsZWQuJyk7dGhpcy5faW1hZ2VDYWNoZS5oYXMoZSl8fCh0aGlzLl9jYWNoZUxpbWl0UmVhY2hlZD8oMCxyLndhcm4pKCJHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBjYWNoZSBsaW1pdCByZWFjaGVkLiIpOnRoaXMuX2ltYWdlQ2FjaGUucHV0KGUsdCkpfWNsZWFyKCl7YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXXx8dGhpcy5fcmVmQ2FjaGUuY2xlYXIoKTt0aGlzLl9pbWFnZUNhY2hlLmNsZWFyKCl9fXQuR2xvYmFsSW1hZ2VDYWNoZT1HbG9iYWxJbWFnZUNhY2hlfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmJpZGk9ZnVuY3Rpb24gYmlkaShlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06LTEsYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLGM9ITA7Y29uc3QgbD1lLmxlbmd0aDtpZigwPT09bHx8YSlyZXR1cm4gY3JlYXRlQmlkaVRleHQoZSxjLGEpO3MubGVuZ3RoPWw7by5sZW5ndGg9bDtsZXQgaCx1LGQ9MDtmb3IoaD0wO2g8bDsrK2gpe3NbaF09ZS5jaGFyQXQoaCk7Y29uc3QgdD1lLmNoYXJDb2RlQXQoaCk7bGV0IGE9IkwiO2lmKHQ8PTI1NSlhPW5bdF07ZWxzZSBpZigxNDI0PD10JiZ0PD0xNTI0KWE9IlIiO2Vsc2UgaWYoMTUzNjw9dCYmdDw9MTc5MSl7YT1pWzI1NSZ0XTthfHwoMCxyLndhcm4pKCJCaWRpOiBpbnZhbGlkIFVuaWNvZGUgY2hhcmFjdGVyICIrdC50b1N0cmluZygxNikpfWVsc2UoMTc5Mjw9dCYmdDw9MjIyMHx8NjQzMzY8PXQmJnQ8PTY1MDIzfHw2NTEzNjw9dCYmdDw9NjUyNzkpJiYoYT0iQUwiKTsiUiIhPT1hJiYiQUwiIT09YSYmIkFOIiE9PWF8fGQrKztvW2hdPWF9aWYoMD09PWQpe2M9ITA7cmV0dXJuIGNyZWF0ZUJpZGlUZXh0KGUsYyl9aWYoLTE9PT10KWlmKGQvbDwuMyYmbD40KXtjPSEwO3Q9MH1lbHNle2M9ITE7dD0xfWNvbnN0IGY9W107Zm9yKGg9MDtoPGw7KytoKWZbaF09dDtjb25zdCBnPWlzT2RkKHQpPyJSIjoiTCIscD1nLG09cDtsZXQgYix5PXA7Zm9yKGg9MDtoPGw7KytoKSJOU00iPT09b1toXT9vW2hdPXk6eT1vW2hdO3k9cDtmb3IoaD0wO2g8bDsrK2gpe2I9b1toXTsiRU4iPT09Yj9vW2hdPSJBTCI9PT15PyJBTiI6IkVOIjoiUiIhPT1iJiYiTCIhPT1iJiYiQUwiIT09Ynx8KHk9Yil9Zm9yKGg9MDtoPGw7KytoKXtiPW9baF07IkFMIj09PWImJihvW2hdPSJSIil9Zm9yKGg9MTtoPGwtMTsrK2gpeyJFUyI9PT1vW2hdJiYiRU4iPT09b1toLTFdJiYiRU4iPT09b1toKzFdJiYob1toXT0iRU4iKTsiQ1MiIT09b1toXXx8IkVOIiE9PW9baC0xXSYmIkFOIiE9PW9baC0xXXx8b1toKzFdIT09b1toLTFdfHwob1toXT1vW2gtMV0pfWZvcihoPTA7aDxsOysraClpZigiRU4iPT09b1toXSl7Zm9yKGxldCBlPWgtMTtlPj0wJiYiRVQiPT09b1tlXTstLWUpb1tlXT0iRU4iO2ZvcihsZXQgZT1oKzE7ZTxsJiYiRVQiPT09b1tlXTsrK2Upb1tlXT0iRU4ifWZvcihoPTA7aDxsOysraCl7Yj1vW2hdOyJXUyIhPT1iJiYiRVMiIT09YiYmIkVUIiE9PWImJiJDUyIhPT1ifHwob1toXT0iT04iKX15PXA7Zm9yKGg9MDtoPGw7KytoKXtiPW9baF07IkVOIj09PWI/b1toXT0iTCI9PT15PyJMIjoiRU4iOiJSIiE9PWImJiJMIiE9PWJ8fCh5PWIpfWZvcihoPTA7aDxsOysraClpZigiT04iPT09b1toXSl7Y29uc3QgZT1maW5kVW5lcXVhbChvLGgrMSwiT04iKTtsZXQgdD1wO2g+MCYmKHQ9b1toLTFdKTtsZXQgYT1tO2UrMTxsJiYoYT1vW2UrMV0pOyJMIiE9PXQmJih0PSJSIik7IkwiIT09YSYmKGE9IlIiKTt0PT09YSYmc2V0VmFsdWVzKG8saCxlLHQpO2g9ZS0xfWZvcihoPTA7aDxsOysraCkiT04iPT09b1toXSYmKG9baF09Zyk7Zm9yKGg9MDtoPGw7KytoKXtiPW9baF07aXNFdmVuKGZbaF0pPyJSIj09PWI/ZltoXSs9MToiQU4iIT09YiYmIkVOIiE9PWJ8fChmW2hdKz0yKToiTCIhPT1iJiYiQU4iIT09YiYmIkVOIiE9PWJ8fChmW2hdKz0xKX1sZXQgdyxTPS0xLHg9OTk7Zm9yKGg9MCx1PWYubGVuZ3RoO2g8dTsrK2gpe3c9ZltoXTtTPHcmJihTPXcpO3g+dyYmaXNPZGQodykmJih4PXcpfWZvcih3PVM7dz49eDstLXcpe2xldCBlPS0xO2ZvcihoPTAsdT1mLmxlbmd0aDtoPHU7KytoKWlmKGZbaF08dyl7aWYoZT49MCl7cmV2ZXJzZVZhbHVlcyhzLGUsaCk7ZT0tMX19ZWxzZSBlPDAmJihlPWgpO2U+PTAmJnJldmVyc2VWYWx1ZXMocyxlLGYubGVuZ3RoKX1mb3IoaD0wLHU9cy5sZW5ndGg7aDx1OysraCl7Y29uc3QgZT1zW2hdOyI8IiE9PWUmJiI+IiE9PWV8fChzW2hdPSIiKX1yZXR1cm4gY3JlYXRlQmlkaVRleHQocy5qb2luKCIiKSxjKX07dmFyIHI9YSgxNDQpO2NvbnN0IG49WyJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJTIiwiQiIsIlMiLCJXUyIsIkIiLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQiIsIkIiLCJCIiwiUyIsIldTIiwiT04iLCJPTiIsIkVUIiwiRVQiLCJFVCIsIk9OIiwiT04iLCJPTiIsIk9OIiwiT04iLCJFUyIsIkNTIiwiRVMiLCJDUyIsIkNTIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJDUyIsIk9OIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIk9OIiwiT04iLCJPTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkIiLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQ1MiLCJPTiIsIkVUIiwiRVQiLCJFVCIsIkVUIiwiT04iLCJPTiIsIk9OIiwiT04iLCJMIiwiT04iLCJPTiIsIkJOIiwiT04iLCJPTiIsIkVUIiwiRVQiLCJFTiIsIkVOIiwiT04iLCJMIiwiT04iLCJPTiIsIk9OIiwiRU4iLCJMIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiT04iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiT04iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCJdLGk9WyJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJPTiIsIk9OIiwiQUwiLCJFVCIsIkVUIiwiQUwiLCJDUyIsIkFMIiwiT04iLCJPTiIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFMIiwiQUwiLCIiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkVUIiwiQU4iLCJBTiIsIkFMIiwiQUwiLCJBTCIsIk5TTSIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTiIsIk9OIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk9OIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiQUwiLCJBTCIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIl07ZnVuY3Rpb24gaXNPZGQoZSl7cmV0dXJuIDAhPSgxJmUpfWZ1bmN0aW9uIGlzRXZlbihlKXtyZXR1cm4gMD09KDEmZSl9ZnVuY3Rpb24gZmluZFVuZXF1YWwoZSx0LGEpe2xldCByLG47Zm9yKHI9dCxuPWUubGVuZ3RoO3I8bjsrK3IpaWYoZVtyXSE9PWEpcmV0dXJuIHI7cmV0dXJuIHJ9ZnVuY3Rpb24gc2V0VmFsdWVzKGUsdCxhLHIpe2ZvcihsZXQgbj10O248YTsrK24pZVtuXT1yfWZ1bmN0aW9uIHJldmVyc2VWYWx1ZXMoZSx0LGEpe2ZvcihsZXQgcj10LG49YS0xO3I8bjsrK3IsLS1uKXtjb25zdCB0PWVbcl07ZVtyXT1lW25dO2Vbbl09dH19ZnVuY3Rpb24gY3JlYXRlQmlkaVRleHQoZSx0KXtsZXQgYT0ibHRyIjthcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdP2E9InR0YiI6dHx8KGE9InJ0bCIpO3JldHVybntzdHI6ZSxkaXI6YX19Y29uc3Qgcz1bXSxvPVtdfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmdldEZvbnRTdWJzdGl0dXRpb249ZnVuY3Rpb24gZ2V0Rm9udFN1YnN0aXR1dGlvbihlLHQsYSx1LGQpe2NvbnN0IGY9dT0oMCxyLm5vcm1hbGl6ZUZvbnROYW1lKSh1KTtsZXQgZz1lLmdldChmKTtpZihnKXJldHVybiBnO2xldCBwPWwuZ2V0KHUpO2lmKCFwKWZvcihjb25zdFtlLHRdb2YgaClpZih1LnN0YXJ0c1dpdGgoZSkpe3U9YCR7dH0ke3Uuc3Vic3RyaW5nKGUubGVuZ3RoKX1gO3A9bC5nZXQodSk7YnJlYWt9bGV0IG09ITE7aWYoIXApe3A9bC5nZXQoZCk7bT0hMH1jb25zdCBiPWAke3QuZ2V0RG9jSWQoKX1fcyR7dC5jcmVhdGVGb250SWQoKX1gO2lmKCFwKXtpZighKDAsbi52YWxpZGF0ZUZvbnROYW1lKSh1KSl7ZS5zZXQoZixudWxsKTtyZXR1cm4gbnVsbH1jb25zdCB0PS9ib2xkL2dpLnRlc3QodSksYT0vb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdCh1KTtnPXtjc3M6YixndWVzc0ZhbGxiYWNrOiEwLGxvYWRlZE5hbWU6YixiYXNlRm9udE5hbWU6dSxzcmM6YGxvY2FsKCR7dX0pYCxzdHlsZTp0JiZhJiZjfHx0JiZzfHxhJiZvfHxpfTtlLnNldChmLGcpO3JldHVybiBnfWNvbnN0IHk9W107bSYmKDAsbi52YWxpZGF0ZUZvbnROYW1lKSh1KSYmeS5wdXNoKGBsb2NhbCgke3V9KWApO2NvbnN0e3N0eWxlOncsdWx0aW1hdGU6U309Z2VuZXJhdGVGb250KHAseSxhKSx4PW51bGw9PT1TO2c9e2NzczpgJHtifSR7eD8iIjpgLCR7U31gfWAsZ3Vlc3NGYWxsYmFjazp4LGxvYWRlZE5hbWU6YixiYXNlRm9udE5hbWU6dSxzcmM6eS5qb2luKCIsIiksc3R5bGU6d307ZS5zZXQoZixnKTtyZXR1cm4gZ307YSgxMzkpO3ZhciByPWEoMTg4KSxuPWEoMTQ5KTtjb25zdCBpPXtzdHlsZToibm9ybWFsIix3ZWlnaHQ6Im5vcm1hbCJ9LHM9e3N0eWxlOiJub3JtYWwiLHdlaWdodDoiYm9sZCJ9LG89e3N0eWxlOiJpdGFsaWMiLHdlaWdodDoibm9ybWFsIn0sYz17c3R5bGU6Iml0YWxpYyIsd2VpZ2h0OiJib2xkIn0sbD1uZXcgTWFwKFtbIlRpbWVzLVJvbWFuIix7bG9jYWw6WyJUaW1lcyBOZXcgUm9tYW4iLCJUaW1lcy1Sb21hbiIsIlRpbWVzIiwiTGliZXJhdGlvbiBTZXJpZiIsIk5pbWJ1cyBSb21hbiIsIk5pbWJ1cyBSb21hbiBMIiwiVGlub3MiLCJUaG9ybmRhbGUiLCJUZVggR3lyZSBUZXJtZXMiLCJGcmVlU2VyaWYiLCJEZWphVnUgU2VyaWYiLCJCaXRzdHJlYW0gVmVyYSBTZXJpZiIsIlVidW50dSJdLHN0eWxlOmksdWx0aW1hdGU6InNlcmlmIn1dLFsiVGltZXMtQm9sZCIse2FsaWFzOiJUaW1lcy1Sb21hbiIsc3R5bGU6cyx1bHRpbWF0ZToic2VyaWYifV0sWyJUaW1lcy1JdGFsaWMiLHthbGlhczoiVGltZXMtUm9tYW4iLHN0eWxlOm8sdWx0aW1hdGU6InNlcmlmIn1dLFsiVGltZXMtQm9sZEl0YWxpYyIse2FsaWFzOiJUaW1lcy1Sb21hbiIsc3R5bGU6Yyx1bHRpbWF0ZToic2VyaWYifV0sWyJIZWx2ZXRpY2EiLHtsb2NhbDpbIkhlbHZldGljYSIsIkhlbHZldGljYSBOZXVlIiwiQXJpYWwiLCJBcmlhbCBOb3ZhIiwiTGliZXJhdGlvbiBTYW5zIiwiQXJpbW8iLCJOaW1idXMgU2FucyIsIk5pbWJ1cyBTYW5zIEwiLCJBMDMwIiwiVGVYIEd5cmUgSGVyb3MiLCJGcmVlU2FucyIsIkRlamFWdSBTYW5zIiwiQWxiYW55IiwiQml0c3RyZWFtIFZlcmEgU2FucyIsIkFyaWFsIFVuaWNvZGUgTVMiLCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIkFwcGxlIFN5bWJvbHMiLCJDYW50YXJlbGwiXSxwYXRoOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiIsc3R5bGU6aSx1bHRpbWF0ZToic2Fucy1zZXJpZiJ9XSxbIkhlbHZldGljYS1Cb2xkIix7YWxpYXM6IkhlbHZldGljYSIscGF0aDoiTGliZXJhdGlvblNhbnMtQm9sZC50dGYiLHN0eWxlOnMsdWx0aW1hdGU6InNhbnMtc2VyaWYifV0sWyJIZWx2ZXRpY2EtT2JsaXF1ZSIse2FsaWFzOiJIZWx2ZXRpY2EiLHBhdGg6IkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiLHN0eWxlOm8sdWx0aW1hdGU6InNhbnMtc2VyaWYifV0sWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLHthbGlhczoiSGVsdmV0aWNhIixwYXRoOiJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljLnR0ZiIsc3R5bGU6Yyx1bHRpbWF0ZToic2Fucy1zZXJpZiJ9XSxbIkNvdXJpZXIiLHtsb2NhbDpbIkNvdXJpZXIiLCJDb3VyaWVyIE5ldyIsIkxpYmVyYXRpb24gTW9ubyIsIk5pbWJ1cyBNb25vIiwiTmltYnVzIE1vbm8gTCIsIkNvdXNpbmUiLCJDdW1iZXJsYW5kIiwiVGVYIEd5cmUgQ3Vyc29yIiwiRnJlZU1vbm8iXSxzdHlsZTppLHVsdGltYXRlOiJtb25vc3BhY2UifV0sWyJDb3VyaWVyLUJvbGQiLHthbGlhczoiQ291cmllciIsc3R5bGU6cyx1bHRpbWF0ZToibW9ub3NwYWNlIn1dLFsiQ291cmllci1PYmxpcXVlIix7YWxpYXM6IkNvdXJpZXIiLHN0eWxlOm8sdWx0aW1hdGU6Im1vbm9zcGFjZSJ9XSxbIkNvdXJpZXItQm9sZE9ibGlxdWUiLHthbGlhczoiQ291cmllciIsc3R5bGU6Yyx1bHRpbWF0ZToibW9ub3NwYWNlIn1dLFsiQXJpYWxCbGFjayIse2xvY2FsOlsiQXJpYWwgQmxhY2siXSxzdHlsZTp7c3R5bGU6Im5vcm1hbCIsd2VpZ2h0OiI5MDAifSxmYWxsYmFjazoiSGVsdmV0aWNhLUJvbGQifV0sWyJBcmlhbEJsYWNrLUJvbGQiLHthbGlhczoiQXJpYWxCbGFjayJ9XSxbIkFyaWFsQmxhY2stSXRhbGljIix7YWxpYXM6IkFyaWFsQmxhY2siLHN0eWxlOntzdHlsZToiaXRhbGljIix3ZWlnaHQ6IjkwMCJ9LGZhbGxiYWNrOiJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUifV0sWyJBcmlhbEJsYWNrLUJvbGRJdGFsaWMiLHthbGlhczoiQXJpYWxCbGFjay1JdGFsaWMifV0sWyJBcmlhbE5hcnJvdyIse2xvY2FsOlsiQXJpYWwgTmFycm93IiwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyIsIkhlbHZldGljYSBDb25kZW5zZWQiLCJOaW1idXMgU2FucyBOYXJyb3ciLCJUZVggR3lyZSBIZXJvcyBDbiJdLHN0eWxlOmksZmFsbGJhY2s6IkhlbHZldGljYSJ9XSxbIkFyaWFsTmFycm93LUJvbGQiLHthbGlhczoiQXJpYWxOYXJyb3ciLHN0eWxlOnMsZmFsbGJhY2s6IkhlbHZldGljYS1Cb2xkIn1dLFsiQXJpYWxOYXJyb3ctSXRhbGljIix7YWxpYXM6IkFyaWFsTmFycm93IixzdHlsZTpvLGZhbGxiYWNrOiJIZWx2ZXRpY2EtT2JsaXF1ZSJ9XSxbIkFyaWFsTmFycm93LUJvbGRJdGFsaWMiLHthbGlhczoiQXJpYWxOYXJyb3ciLHN0eWxlOmMsZmFsbGJhY2s6IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJ9XSxbIkNhbGlicmkiLHtsb2NhbDpbIkNhbGlicmkiLCJDYXJsaXRvIl0sc3R5bGU6aSxmYWxsYmFjazoiSGVsdmV0aWNhIn1dLFsiQ2FsaWJyaS1Cb2xkIix7YWxpYXM6IkNhbGlicmkiLHN0eWxlOnMsZmFsbGJhY2s6IkhlbHZldGljYS1Cb2xkIn1dLFsiQ2FsaWJyaS1JdGFsaWMiLHthbGlhczoiQ2FsaWJyaSIsc3R5bGU6byxmYWxsYmFjazoiSGVsdmV0aWNhLU9ibGlxdWUifV0sWyJDYWxpYnJpLUJvbGRJdGFsaWMiLHthbGlhczoiQ2FsaWJyaSIsc3R5bGU6YyxmYWxsYmFjazoiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIn1dLFsiV2luZ2RpbmdzIix7bG9jYWw6WyJXaW5nZGluZ3MiLCJVUlcgRGluZ2JhdHMiXSxzdHlsZTppfV0sWyJXaW5nZGluZ3MtUmVndWxhciIse2FsaWFzOiJXaW5nZGluZ3MifV0sWyJXaW5nZGluZ3MtQm9sZCIse2FsaWFzOiJXaW5nZGluZ3MifV1dKSxoPW5ldyBNYXAoW1siQXJpYWwtQmxhY2siLCJBcmlhbEJsYWNrIl1dKTtmdW5jdGlvbiBnZW5lcmF0ZUZvbnQoZSx0LGEpe2xldHthbGlhczpyLGxvY2FsOm4scGF0aDppLGZhbGxiYWNrOmgsc3R5bGU6dSx1bHRpbWF0ZTpkfT1lLGY9IShhcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSl8fGFyZ3VtZW50c1szXSxnPSEoYXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0pfHxhcmd1bWVudHNbNF0scD1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06IiI7Y29uc3QgbT17c3R5bGU6bnVsbCx1bHRpbWF0ZTpudWxsfTtpZihuKXtjb25zdCBlPXA/YCAke3B9YDoiIjtmb3IoY29uc3QgYSBvZiBuKXQucHVzaChgbG9jYWwoJHthfSR7ZX0pYCl9aWYocil7Y29uc3QgZT1sLmdldChyKSxuPXB8fGZ1bmN0aW9uIGdldFN0eWxlVG9BcHBlbmQoZSl7c3dpdGNoKGUpe2Nhc2UgczpyZXR1cm4iQm9sZCI7Y2FzZSBvOnJldHVybiJJdGFsaWMiO2Nhc2UgYzpyZXR1cm4iQm9sZCBJdGFsaWMiO2RlZmF1bHQ6aWYoImJvbGQiPT09ZT8ud2VpZ2h0KXJldHVybiJCb2xkIjtpZigiaXRhbGljIj09PWU/LnN0eWxlKXJldHVybiJJdGFsaWMifXJldHVybiIifSh1KTtPYmplY3QuYXNzaWduKG0sZ2VuZXJhdGVGb250KGUsdCxhLGYmJiFoLGcmJiFpLG4pKX11JiYobS5zdHlsZT11KTtkJiYobS51bHRpbWF0ZT1kKTtpZihmJiZoKXtjb25zdCBlPWwuZ2V0KGgpLHt1bHRpbWF0ZTpyfT1nZW5lcmF0ZUZvbnQoZSx0LGEsZixnJiYhaSxwKTttLnVsdGltYXRlfHw9cn1nJiZpJiZhJiZ0LnB1c2goYHVybCgke2F9JHtpfSlgKTtyZXR1cm4gbX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSW1hZ2VSZXNpemVyPXZvaWQgMDthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgyKTt2YXIgcj1hKDE0NCk7Y2xhc3MgSW1hZ2VSZXNpemVye2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faW1nRGF0YT1lO3RoaXMuX2lzTWFzaz10fXN0YXRpYyBuZWVkc1RvQmVSZXNpemVkKGUsdCl7aWYoZTw9dGhpcy5fZ29vZFNxdWFyZUxlbmd0aCYmdDw9dGhpcy5fZ29vZFNxdWFyZUxlbmd0aClyZXR1cm4hMTtjb25zdHtNQVhfRElNOmF9PXRoaXM7aWYoZT5hfHx0PmEpcmV0dXJuITA7Y29uc3Qgcj1lKnQ7aWYodGhpcy5faGFzTWF4QXJlYSlyZXR1cm4gcj50aGlzLk1BWF9BUkVBO2lmKHI8dGhpcy5fZ29vZFNxdWFyZUxlbmd0aCoqMilyZXR1cm4hMTtpZih0aGlzLl9hcmVHb29kRGltcyhlLHQpKXt0aGlzLl9nb29kU3F1YXJlTGVuZ3RoPU1hdGgubWF4KHRoaXMuX2dvb2RTcXVhcmVMZW5ndGgsTWF0aC5mbG9vcihNYXRoLnNxcnQoZSp0KSkpO3JldHVybiExfXRoaXMuX2dvb2RTcXVhcmVMZW5ndGg9dGhpcy5fZ3Vlc3NNYXgodGhpcy5fZ29vZFNxdWFyZUxlbmd0aCxhLDEyOCwwKTtyZXR1cm4gcj4odGhpcy5NQVhfQVJFQT10aGlzLl9nb29kU3F1YXJlTGVuZ3RoKioyKX1zdGF0aWMgZ2V0IE1BWF9ESU0oKXtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiTUFYX0RJTSIsdGhpcy5fZ3Vlc3NNYXgoMjA0OCw2NTUzNywwLDEpKX1zdGF0aWMgZ2V0IE1BWF9BUkVBKCl7dGhpcy5faGFzTWF4QXJlYT0hMDtyZXR1cm4oMCxyLnNoYWRvdykodGhpcywiTUFYX0FSRUEiLHRoaXMuX2d1ZXNzTWF4KEltYWdlUmVzaXplci5fZ29vZFNxdWFyZUxlbmd0aCx0aGlzLk1BWF9ESU0sMTI4LDApKioyKX1zdGF0aWMgc2V0IE1BWF9BUkVBKGUpe2lmKGU+PTApe3RoaXMuX2hhc01heEFyZWE9ITA7KDAsci5zaGFkb3cpKHRoaXMsIk1BWF9BUkVBIixlKX19c3RhdGljIHNldE1heEFyZWEoZSl7dGhpcy5faGFzTWF4QXJlYXx8KHRoaXMuTUFYX0FSRUE9ZT4+Mil9c3RhdGljIF9hcmVHb29kRGltcyhlLHQpe3RyeXtjb25zdCBhPW5ldyBPZmZzY3JlZW5DYW52YXMoZSx0KSxyPWEuZ2V0Q29udGV4dCgiMmQiKTtyLmZpbGxSZWN0KDAsMCwxLDEpO2NvbnN0IG49ci5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YVszXTthLndpZHRoPWEuaGVpZ2h0PTE7cmV0dXJuIDAhPT1ufWNhdGNoe3JldHVybiExfX1zdGF0aWMgX2d1ZXNzTWF4KGUsdCxhLHIpe2Zvcig7ZSthKzE8dDspe2NvbnN0IGE9TWF0aC5mbG9vcigoZSt0KS8yKSxuPXJ8fGE7dGhpcy5fYXJlR29vZERpbXMoYSxuKT9lPWE6dD1hfXJldHVybiBlfXN0YXRpYyBhc3luYyBjcmVhdGVJbWFnZShlKXtyZXR1cm4gbmV3IEltYWdlUmVzaXplcihlLGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0pLl9jcmVhdGVJbWFnZSgpfWFzeW5jIF9jcmVhdGVJbWFnZSgpe2NvbnN0IGU9dGhpcy5fZW5jb2RlQk1QKCksdD1uZXcgQmxvYihbZS5idWZmZXJdLHt0eXBlOiJpbWFnZS9ibXAifSksYT1jcmVhdGVJbWFnZUJpdG1hcCh0KSx7TUFYX0FSRUE6cixNQVhfRElNOm59PUltYWdlUmVzaXplcix7X2ltZ0RhdGE6aX09dGhpcyx7d2lkdGg6cyxoZWlnaHQ6b309aSxjPU1hdGgubWF4KHMvbixvL24sTWF0aC5zcXJ0KHMqby9yKSksbD1NYXRoLm1heChjLDIpLGg9TWF0aC5yb3VuZCgxMCooYysxLjI1KSkvMTAvbCx1PU1hdGguZmxvb3IoTWF0aC5sb2cyKGgpKSxkPW5ldyBBcnJheSh1KzIpLmZpbGwoMik7ZFswXT1sO2Quc3BsaWNlKC0xLDEsaC8oMTw8dSkpO2xldCBmPXMsZz1vLHA9YXdhaXQgYTtmb3IoY29uc3QgZSBvZiBkKXtjb25zdCB0PWYsYT1nO2Y9TWF0aC5mbG9vcihmL2UpLTE7Zz1NYXRoLmZsb29yKGcvZSktMTtjb25zdCByPW5ldyBPZmZzY3JlZW5DYW52YXMoZixnKTtyLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKHAsMCwwLHQsYSwwLDAsZixnKTtwPXIudHJhbnNmZXJUb0ltYWdlQml0bWFwKCl9aS5kYXRhPW51bGw7aS5iaXRtYXA9cDtpLndpZHRoPWY7aS5oZWlnaHQ9ZztyZXR1cm4gaX1fZW5jb2RlQk1QKCl7Y29uc3R7d2lkdGg6ZSxoZWlnaHQ6dCxraW5kOmF9PXRoaXMuX2ltZ0RhdGE7bGV0IG4saT10aGlzLl9pbWdEYXRhLmRhdGEscz1uZXcgVWludDhBcnJheSgwKSxvPXMsYz0wO3N3aXRjaChhKXtjYXNlIHIuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOntuPTE7cz1uZXcgVWludDhBcnJheSh0aGlzLl9pc01hc2s/WzI1NSwyNTUsMjU1LDI1NSwwLDAsMCwwXTpbMCwwLDAsMCwyNTUsMjU1LDI1NSwyNTVdKTtjb25zdCBhPWUrNz4+MyxyPWErMyYtNDtpZihhIT09cil7Y29uc3QgZT1uZXcgVWludDhBcnJheShyKnQpO2xldCBuPTA7Zm9yKGxldCBzPTAsbz10KmE7czxvO3MrPWEsbis9cillLnNldChpLnN1YmFycmF5KHMscythKSxuKTtpPWV9YnJlYWt9Y2FzZSByLkltYWdlS2luZC5SR0JfMjRCUFA6bj0yNDtpZigzJmUpe2NvbnN0IGE9MyplLHI9YSszJi00LG49ci1hLHM9bmV3IFVpbnQ4QXJyYXkocip0KTtsZXQgbz0wO2ZvcihsZXQgZT0wLHI9dCphO2U8cjtlKz1hKXtjb25zdCB0PWkuc3ViYXJyYXkoZSxlK2EpO2ZvcihsZXQgZT0wO2U8YTtlKz0zKXtzW28rK109dFtlKzJdO3NbbysrXT10W2UrMV07c1tvKytdPXRbZV19bys9bn1pPXN9ZWxzZSBmb3IobGV0IGU9MCx0PWkubGVuZ3RoO2U8dDtlKz0zKXtjb25zdCB0PWlbZV07aVtlXT1pW2UrMl07aVtlKzJdPXR9YnJlYWs7Y2FzZSByLkltYWdlS2luZC5SR0JBXzMyQlBQOm49MzI7Yz0zO289bmV3IFVpbnQ4QXJyYXkoNjgpO2NvbnN0IGE9bmV3IERhdGFWaWV3KG8uYnVmZmVyKTtpZihyLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKXthLnNldFVpbnQzMigwLDI1NSwhMCk7YS5zZXRVaW50MzIoNCw2NTI4MCwhMCk7YS5zZXRVaW50MzIoOCwxNjcxMTY4MCwhMCk7YS5zZXRVaW50MzIoMTIsNDI3ODE5MDA4MCwhMCl9ZWxzZXthLnNldFVpbnQzMigwLDQyNzgxOTAwODAsITApO2Euc2V0VWludDMyKDQsMTY3MTE2ODAsITApO2Euc2V0VWludDMyKDgsNjUyODAsITApO2Euc2V0VWludDMyKDEyLDI1NSwhMCl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0Iil9bGV0IGw9MDtjb25zdCBoPTQwK28ubGVuZ3RoLHU9MTQraCtzLmxlbmd0aCtpLmxlbmd0aCxkPW5ldyBVaW50OEFycmF5KHUpLGY9bmV3IERhdGFWaWV3KGQuYnVmZmVyKTtmLnNldFVpbnQxNihsLDE5Nzc4LCEwKTtsKz0yO2Yuc2V0VWludDMyKGwsdSwhMCk7bCs9NDtmLnNldFVpbnQzMihsLDAsITApO2wrPTQ7Zi5zZXRVaW50MzIobCwxNCtoK3MubGVuZ3RoLCEwKTtsKz00O2Yuc2V0VWludDMyKGwsaCwhMCk7bCs9NDtmLnNldEludDMyKGwsZSwhMCk7bCs9NDtmLnNldEludDMyKGwsLXQsITApO2wrPTQ7Zi5zZXRVaW50MTYobCwxLCEwKTtsKz0yO2Yuc2V0VWludDE2KGwsbiwhMCk7bCs9MjtmLnNldFVpbnQzMihsLGMsITApO2wrPTQ7Zi5zZXRVaW50MzIobCwwLCEwKTtsKz00O2Yuc2V0SW50MzIobCwwLCEwKTtsKz00O2Yuc2V0SW50MzIobCwwLCEwKTtsKz00O2Yuc2V0VWludDMyKGwscy5sZW5ndGgvNCwhMCk7bCs9NDtmLnNldFVpbnQzMihsLDAsITApO2wrPTQ7ZC5zZXQobyxsKTtsKz1vLmxlbmd0aDtkLnNldChzLGwpO2wrPXMubGVuZ3RoO2Quc2V0KGksbCk7cmV0dXJuIGR9fXQuSW1hZ2VSZXNpemVyPUltYWdlUmVzaXplcjtJbWFnZVJlc2l6ZXIuX2dvb2RTcXVhcmVMZW5ndGg9MjA0OH0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5NdXJtdXJIYXNoM182ND12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO2EoMik7dmFyIHI9YSgxNDQpO2NvbnN0IG49MzI4NTM3NzUyMCxpPTQyOTQ5MDE3NjAscz02NTUzNTt0Lk11cm11ckhhc2gzXzY0PWNsYXNzIE11cm11ckhhc2gzXzY0e2NvbnN0cnVjdG9yKGUpe3RoaXMuaDE9ZT80Mjk0OTY3Mjk1JmU6bjt0aGlzLmgyPWU/NDI5NDk2NzI5NSZlOm59dXBkYXRlKGUpe2xldCB0LGE7aWYoInN0cmluZyI9PXR5cGVvZiBlKXt0PW5ldyBVaW50OEFycmF5KDIqZS5sZW5ndGgpO2E9MDtmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49ZS5jaGFyQ29kZUF0KHIpO2lmKG48PTI1NSl0W2ErK109bjtlbHNle3RbYSsrXT1uPj4+ODt0W2ErK109MjU1Jm59fX1lbHNle2lmKCEoMCxyLmlzQXJyYXlCdWZmZXIpKGUpKXRocm93IG5ldyBFcnJvcigiV3JvbmcgZGF0YSBmb3JtYXQgaW4gTXVybXVySGFzaDNfNjRfdXBkYXRlLiBJbnB1dCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5LiIpO3Q9ZS5zbGljZSgpO2E9dC5ieXRlTGVuZ3RofWNvbnN0IG49YT4+MixvPWEtNCpuLGM9bmV3IFVpbnQzMkFycmF5KHQuYnVmZmVyLDAsbik7bGV0IGw9MCxoPTAsdT10aGlzLmgxLGQ9dGhpcy5oMjtjb25zdCBmPTM0MzI5MTgzNTMsZz00NjE4NDU5MDcscD0xMTYwMSxtPTEzNzE1O2ZvcihsZXQgZT0wO2U8bjtlKyspaWYoMSZlKXtsPWNbZV07bD1sKmYmaXxsKnAmcztsPWw8PDE1fGw+Pj4xNztsPWwqZyZpfGwqbSZzO3VePWw7dT11PDwxM3x1Pj4+MTk7dT01KnUrMzg2NDI5MjE5Nn1lbHNle2g9Y1tlXTtoPWgqZiZpfGgqcCZzO2g9aDw8MTV8aD4+PjE3O2g9aCpnJml8aCptJnM7ZF49aDtkPWQ8PDEzfGQ+Pj4xOTtkPTUqZCszODY0MjkyMTk2fWw9MDtzd2l0Y2gobyl7Y2FzZSAzOmxePXRbNCpuKzJdPDwxNjtjYXNlIDI6bF49dFs0Km4rMV08PDg7Y2FzZSAxOmxePXRbNCpuXTtsPWwqZiZpfGwqcCZzO2w9bDw8MTV8bD4+PjE3O2w9bCpnJml8bCptJnM7MSZuP3VePWw6ZF49bH10aGlzLmgxPXU7dGhpcy5oMj1kfWhleGRpZ2VzdCgpe2xldCBlPXRoaXMuaDEsdD10aGlzLmgyO2VePXQ+Pj4xO2U9Mzk4MTgwNjc5NyplJml8MzYwNDUqZSZzO3Q9NDI4MzU0MzUxMSp0Jml8KDI5NTAxNjM3OTcqKHQ8PDE2fGU+Pj4xNikmaSk+Pj4xNjtlXj10Pj4+MTtlPTQ0NDk4NDQwMyplJml8NjA0OTkqZSZzO3Q9MzMwMTg4MjM2Nip0Jml8KDMxMjA0Mzc4OTMqKHQ8PDE2fGU+Pj4xNikmaSk+Pj4xNjtlXj10Pj4+MTtyZXR1cm4oZT4+PjApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCIwIikrKHQ+Pj4wKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwiMCIpfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuT3BlcmF0b3JMaXN0PXZvaWQgMDthKDIpO2EoMTM5KTthKDg0KTthKDkzKTthKDk0KTthKDk3KTthKDk5KTthKDEwMSk7YSgxMDUpO2EoMTA4KTthKDExNSk7YSgxMTYpO2EoMTI2KTthKDEyOCk7YSgxMzEpO2EoMTMzKTthKDEzNSk7YSgxMzcpO3ZhciByPWEoMTQ0KTtmdW5jdGlvbiBhZGRTdGF0ZShlLHQsYSxyLG4pe2xldCBpPWU7Zm9yKGxldCBlPTAsYT10Lmxlbmd0aC0xO2U8YTtlKyspe2NvbnN0IGE9dFtlXTtpPWlbYV18fD1bXX1pW3QuYXQoLTEpXT17Y2hlY2tGbjphLGl0ZXJhdGVGbjpyLHByb2Nlc3NGbjpufX1jb25zdCBuPVtdO2FkZFN0YXRlKG4sW3IuT1BTLnNhdmUsci5PUFMudHJhbnNmb3JtLHIuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0LHIuT1BTLnJlc3RvcmVdLG51bGwsKGZ1bmN0aW9uIGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwKGUsdCl7Y29uc3QgYT1lLmZuQXJyYXksbj0odC0oZS5pQ3Vyci0zKSklNDtzd2l0Y2gobil7Y2FzZSAwOnJldHVybiBhW3RdPT09ci5PUFMuc2F2ZTtjYXNlIDE6cmV0dXJuIGFbdF09PT1yLk9QUy50cmFuc2Zvcm07Y2FzZSAyOnJldHVybiBhW3RdPT09ci5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q7Y2FzZSAzOnJldHVybiBhW3RdPT09ci5PUFMucmVzdG9yZX10aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbmxpbmVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICR7bn1gKX0pLChmdW5jdGlvbiBmb3VuZElubGluZUltYWdlR3JvdXAoZSx0KXtjb25zdCBhPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9ZS5pQ3VycixzPWktMyxvPWktMixjPWktMSxsPU1hdGgubWluKE1hdGguZmxvb3IoKHQtcykvNCksMjAwKTtpZihsPDEwKXJldHVybiB0LSh0LXMpJTQ7bGV0IGg9MDtjb25zdCB1PVtdO2xldCBkPTAsZj0xLGc9MTtmb3IobGV0IGU9MDtlPGw7ZSsrKXtjb25zdCB0PW5bbysoZTw8MildLGE9bltjKyhlPDwyKV1bMF07aWYoZithLndpZHRoPjFlMyl7aD1NYXRoLm1heChoLGYpO2crPWQrMjtmPTA7ZD0wfXUucHVzaCh7dHJhbnNmb3JtOnQseDpmLHk6Zyx3OmEud2lkdGgsaDphLmhlaWdodH0pO2YrPWEud2lkdGgrMjtkPU1hdGgubWF4KGQsYS5oZWlnaHQpfWNvbnN0IHA9TWF0aC5tYXgoaCxmKSsxLG09ZytkKzEsYj1uZXcgVWludDhBcnJheShwKm0qNCkseT1wPDwyO2ZvcihsZXQgZT0wO2U8bDtlKyspe2NvbnN0IHQ9bltjKyhlPDwyKV1bMF0uZGF0YSxhPXVbZV0udzw8MjtsZXQgcj0wLGk9dVtlXS54K3VbZV0ueSpwPDwyO2Iuc2V0KHQuc3ViYXJyYXkoMCxhKSxpLXkpO2ZvcihsZXQgbj0wLHM9dVtlXS5oO248cztuKyspe2Iuc2V0KHQuc3ViYXJyYXkocixyK2EpLGkpO3IrPWE7aSs9eX1iLnNldCh0LnN1YmFycmF5KHItYSxyKSxpKTtmb3IoO2k+PTA7KXt0W2ktNF09dFtpXTt0W2ktM109dFtpKzFdO3RbaS0yXT10W2krMl07dFtpLTFdPXRbaSszXTt0W2krYV09dFtpK2EtNF07dFtpK2ErMV09dFtpK2EtM107dFtpK2ErMl09dFtpK2EtMl07dFtpK2ErM109dFtpK2EtMV07aS09eX19Y29uc3Qgdz17d2lkdGg6cCxoZWlnaHQ6bX07aWYoZS5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCl7Y29uc3QgZT1uZXcgT2Zmc2NyZWVuQ2FudmFzKHAsbSk7ZS5nZXRDb250ZXh0KCIyZCIpLnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheShiLmJ1ZmZlcikscCxtKSwwLDApO3cuYml0bWFwPWUudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7dy5kYXRhPW51bGx9ZWxzZXt3LmtpbmQ9ci5JbWFnZUtpbmQuUkdCQV8zMkJQUDt3LmRhdGE9Yn1hLnNwbGljZShzLDQqbCxyLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKTtuLnNwbGljZShzLDQqbCxbdyx1XSk7cmV0dXJuIHMrMX0pKTthZGRTdGF0ZShuLFtyLk9QUy5zYXZlLHIuT1BTLnRyYW5zZm9ybSxyLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Qsci5PUFMucmVzdG9yZV0sbnVsbCwoZnVuY3Rpb24gaXRlcmF0ZUltYWdlTWFza0dyb3VwKGUsdCl7Y29uc3QgYT1lLmZuQXJyYXksbj0odC0oZS5pQ3Vyci0zKSklNDtzd2l0Y2gobil7Y2FzZSAwOnJldHVybiBhW3RdPT09ci5PUFMuc2F2ZTtjYXNlIDE6cmV0dXJuIGFbdF09PT1yLk9QUy50cmFuc2Zvcm07Y2FzZSAyOnJldHVybiBhW3RdPT09ci5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0O2Nhc2UgMzpyZXR1cm4gYVt0XT09PXIuT1BTLnJlc3RvcmV9dGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW1hZ2VNYXNrR3JvdXAgLSBpbnZhbGlkIHBvczogJHtufWApfSksKGZ1bmN0aW9uIGZvdW5kSW1hZ2VNYXNrR3JvdXAoZSx0KXtjb25zdCBhPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9ZS5pQ3VycixzPWktMyxvPWktMixjPWktMTtsZXQgbD1NYXRoLmZsb29yKCh0LXMpLzQpO2lmKGw8MTApcmV0dXJuIHQtKHQtcyklNDtsZXQgaCx1LGQ9ITE7Y29uc3QgZj1uW2NdWzBdLGc9bltvXVswXSxwPW5bb11bMV0sbT1uW29dWzJdLGI9bltvXVszXTtpZihwPT09bSl7ZD0hMDtoPW8rNDtsZXQgZT1jKzQ7Zm9yKGxldCB0PTE7dDxsO3QrKyxoKz00LGUrPTQpe3U9bltoXTtpZihuW2VdWzBdIT09Znx8dVswXSE9PWd8fHVbMV0hPT1wfHx1WzJdIT09bXx8dVszXSE9PWIpe3Q8MTA/ZD0hMTpsPXQ7YnJlYWt9fX1pZihkKXtsPU1hdGgubWluKGwsMWUzKTtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkoMipsKTtoPW87Zm9yKGxldCB0PTA7dDxsO3QrKyxoKz00KXt1PW5baF07ZVt0PDwxXT11WzRdO2VbMSsodDw8MSldPXVbNV19YS5zcGxpY2Uocyw0Kmwsci5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KTtuLnNwbGljZShzLDQqbCxbZixnLHAsbSxiLGVdKX1lbHNle2w9TWF0aC5taW4obCwxMDApO2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDxsO3QrKyl7dT1uW28rKHQ8PDIpXTtjb25zdCBhPW5bYysodDw8MildWzBdO2UucHVzaCh7ZGF0YTphLmRhdGEsd2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHQsaW50ZXJwb2xhdGU6YS5pbnRlcnBvbGF0ZSxjb3VudDphLmNvdW50LHRyYW5zZm9ybTp1fSl9YS5zcGxpY2Uocyw0Kmwsci5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXApO24uc3BsaWNlKHMsNCpsLFtlXSl9cmV0dXJuIHMrMX0pKTthZGRTdGF0ZShuLFtyLk9QUy5zYXZlLHIuT1BTLnRyYW5zZm9ybSxyLk9QUy5wYWludEltYWdlWE9iamVjdCxyLk9QUy5yZXN0b3JlXSwoZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmFyZ3NBcnJheSxhPWUuaUN1cnItMjtyZXR1cm4gMD09PXRbYV1bMV0mJjA9PT10W2FdWzJdfSksKGZ1bmN0aW9uIGl0ZXJhdGVJbWFnZUdyb3VwKGUsdCl7Y29uc3QgYT1lLmZuQXJyYXksbj1lLmFyZ3NBcnJheSxpPSh0LShlLmlDdXJyLTMpKSU0O3N3aXRjaChpKXtjYXNlIDA6cmV0dXJuIGFbdF09PT1yLk9QUy5zYXZlO2Nhc2UgMTppZihhW3RdIT09ci5PUFMudHJhbnNmb3JtKXJldHVybiExO2NvbnN0IGk9ZS5pQ3Vyci0yLHM9bltpXVswXSxvPW5baV1bM107cmV0dXJuIG5bdF1bMF09PT1zJiYwPT09blt0XVsxXSYmMD09PW5bdF1bMl0mJm5bdF1bM109PT1vO2Nhc2UgMjppZihhW3RdIT09ci5PUFMucGFpbnRJbWFnZVhPYmplY3QpcmV0dXJuITE7Y29uc3QgYz1uW2UuaUN1cnItMV1bMF07cmV0dXJuIG5bdF1bMF09PT1jO2Nhc2UgMzpyZXR1cm4gYVt0XT09PXIuT1BTLnJlc3RvcmV9dGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAke2l9YCl9KSwoZnVuY3Rpb24oZSx0KXtjb25zdCBhPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9ZS5pQ3VycixzPWktMyxvPWktMixjPW5baS0xXVswXSxsPW5bb11bMF0saD1uW29dWzNdLHU9TWF0aC5taW4oTWF0aC5mbG9vcigodC1zKS80KSwxZTMpO2lmKHU8MylyZXR1cm4gdC0odC1zKSU0O2NvbnN0IGQ9bmV3IEZsb2F0MzJBcnJheSgyKnUpO2xldCBmPW87Zm9yKGxldCBlPTA7ZTx1O2UrKyxmKz00KXtjb25zdCB0PW5bZl07ZFtlPDwxXT10WzRdO2RbMSsoZTw8MSldPXRbNV19Y29uc3QgZz1bYyxsLGgsZF07YS5zcGxpY2Uocyw0KnUsci5PUFMucGFpbnRJbWFnZVhPYmplY3RSZXBlYXQpO24uc3BsaWNlKHMsNCp1LGcpO3JldHVybiBzKzF9KSk7YWRkU3RhdGUobixbci5PUFMuYmVnaW5UZXh0LHIuT1BTLnNldEZvbnQsci5PUFMuc2V0VGV4dE1hdHJpeCxyLk9QUy5zaG93VGV4dCxyLk9QUy5lbmRUZXh0XSxudWxsLChmdW5jdGlvbiBpdGVyYXRlU2hvd1RleHRHcm91cChlLHQpe2NvbnN0IGE9ZS5mbkFycmF5LG49ZS5hcmdzQXJyYXksaT0odC0oZS5pQ3Vyci00KSklNTtzd2l0Y2goaSl7Y2FzZSAwOnJldHVybiBhW3RdPT09ci5PUFMuYmVnaW5UZXh0O2Nhc2UgMTpyZXR1cm4gYVt0XT09PXIuT1BTLnNldEZvbnQ7Y2FzZSAyOnJldHVybiBhW3RdPT09ci5PUFMuc2V0VGV4dE1hdHJpeDtjYXNlIDM6aWYoYVt0XSE9PXIuT1BTLnNob3dUZXh0KXJldHVybiExO2NvbnN0IGk9ZS5pQ3Vyci0zLHM9bltpXVswXSxvPW5baV1bMV07cmV0dXJuIG5bdF1bMF09PT1zJiZuW3RdWzFdPT09bztjYXNlIDQ6cmV0dXJuIGFbdF09PT1yLk9QUy5lbmRUZXh0fXRocm93IG5ldyBFcnJvcihgaXRlcmF0ZVNob3dUZXh0R3JvdXAgLSBpbnZhbGlkIHBvczogJHtpfWApfSksKGZ1bmN0aW9uKGUsdCl7Y29uc3QgYT1lLmZuQXJyYXkscj1lLmFyZ3NBcnJheSxuPWUuaUN1cnIsaT1uLTQscz1uLTMsbz1uLTIsYz1uLTEsbD1uLGg9cltzXVswXSx1PXJbc11bMV07bGV0IGQ9TWF0aC5taW4oTWF0aC5mbG9vcigodC1pKS81KSwxZTMpO2lmKGQ8MylyZXR1cm4gdC0odC1pKSU1O2xldCBmPWk7aWYoaT49NCYmYVtpLTRdPT09YVtzXSYmYVtpLTNdPT09YVtvXSYmYVtpLTJdPT09YVtjXSYmYVtpLTFdPT09YVtsXSYmcltpLTRdWzBdPT09aCYmcltpLTRdWzFdPT09dSl7ZCsrO2YtPTV9bGV0IGc9Zis0O2ZvcihsZXQgZT0xO2U8ZDtlKyspe2Euc3BsaWNlKGcsMyk7ci5zcGxpY2UoZywzKTtnKz0yfXJldHVybiBnKzF9KSk7Y2xhc3MgTnVsbE9wdGltaXplcntjb25zdHJ1Y3RvcihlKXt0aGlzLnF1ZXVlPWV9X29wdGltaXplKCl7fXB1c2goZSx0KXt0aGlzLnF1ZXVlLmZuQXJyYXkucHVzaChlKTt0aGlzLnF1ZXVlLmFyZ3NBcnJheS5wdXNoKHQpO3RoaXMuX29wdGltaXplKCl9Zmx1c2goKXt9cmVzZXQoKXt9fWNsYXNzIFF1ZXVlT3B0aW1pemVyIGV4dGVuZHMgTnVsbE9wdGltaXplcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTt0aGlzLnN0YXRlPW51bGw7dGhpcy5jb250ZXh0PXtpQ3VycjowLGZuQXJyYXk6ZS5mbkFycmF5LGFyZ3NBcnJheTplLmFyZ3NBcnJheSxpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDohMX07dGhpcy5tYXRjaD1udWxsO3RoaXMubGFzdFByb2Nlc3NlZD0wfXNldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZChlKXt0aGlzLmNvbnRleHQuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ9ZX1fb3B0aW1pemUoKXtjb25zdCBlPXRoaXMucXVldWUuZm5BcnJheTtsZXQgdD10aGlzLmxhc3RQcm9jZXNzZWQsYT1lLmxlbmd0aCxyPXRoaXMuc3RhdGUsaT10aGlzLm1hdGNoO2lmKCFyJiYhaSYmdCsxPT09YSYmIW5bZVt0XV0pe3RoaXMubGFzdFByb2Nlc3NlZD1hO3JldHVybn1jb25zdCBzPXRoaXMuY29udGV4dDtmb3IoO3Q8YTspe2lmKGkpe2lmKCgwLGkuaXRlcmF0ZUZuKShzLHQpKXt0Kys7Y29udGludWV9dD0oMCxpLnByb2Nlc3NGbikocyx0KzEpO2E9ZS5sZW5ndGg7aT1udWxsO3I9bnVsbDtpZih0Pj1hKWJyZWFrfXI9KHJ8fG4pW2VbdF1dO2lmKHImJiFBcnJheS5pc0FycmF5KHIpKXtzLmlDdXJyPXQ7dCsrO2lmKCFyLmNoZWNrRm58fCgwLHIuY2hlY2tGbikocykpe2k9cjtyPW51bGx9ZWxzZSByPW51bGx9ZWxzZSB0Kyt9dGhpcy5zdGF0ZT1yO3RoaXMubWF0Y2g9aTt0aGlzLmxhc3RQcm9jZXNzZWQ9dH1mbHVzaCgpe2Zvcig7dGhpcy5tYXRjaDspe2NvbnN0IGU9dGhpcy5xdWV1ZS5mbkFycmF5Lmxlbmd0aDt0aGlzLmxhc3RQcm9jZXNzZWQ9KDAsdGhpcy5tYXRjaC5wcm9jZXNzRm4pKHRoaXMuY29udGV4dCxlKTt0aGlzLm1hdGNoPW51bGw7dGhpcy5zdGF0ZT1udWxsO3RoaXMuX29wdGltaXplKCl9fXJlc2V0KCl7dGhpcy5zdGF0ZT1udWxsO3RoaXMubWF0Y2g9bnVsbDt0aGlzLmxhc3RQcm9jZXNzZWQ9MH19Y2xhc3MgT3BlcmF0b3JMaXN0e3N0YXRpYyBDSFVOS19TSVpFPTFlMztzdGF0aWMgQ0hVTktfU0laRV9BQk9VVD10aGlzLkNIVU5LX1NJWkUtNTtjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTowLHQ9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7dGhpcy5fc3RyZWFtU2luaz10O3RoaXMuZm5BcnJheT1bXTt0aGlzLmFyZ3NBcnJheT1bXTt0aGlzLm9wdGltaXplcj0hdHx8ZSZyLlJlbmRlcmluZ0ludGVudEZsYWcuT1BMSVNUP25ldyBOdWxsT3B0aW1pemVyKHRoaXMpOm5ldyBRdWV1ZU9wdGltaXplcih0aGlzKTt0aGlzLmRlcGVuZGVuY2llcz1uZXcgU2V0O3RoaXMuX3RvdGFsTGVuZ3RoPTA7dGhpcy53ZWlnaHQ9MDt0aGlzLl9yZXNvbHZlZD10P251bGw6UHJvbWlzZS5yZXNvbHZlKCl9c2V0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKGUpe3RoaXMub3B0aW1pemVyLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPWV9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmFyZ3NBcnJheS5sZW5ndGh9Z2V0IHJlYWR5KCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVkfHx0aGlzLl9zdHJlYW1TaW5rLnJlYWR5fWdldCB0b3RhbExlbmd0aCgpe3JldHVybiB0aGlzLl90b3RhbExlbmd0aCt0aGlzLmxlbmd0aH1hZGRPcChlLHQpe3RoaXMub3B0aW1pemVyLnB1c2goZSx0KTt0aGlzLndlaWdodCsrO3RoaXMuX3N0cmVhbVNpbmsmJih0aGlzLndlaWdodD49T3BlcmF0b3JMaXN0LkNIVU5LX1NJWkV8fHRoaXMud2VpZ2h0Pj1PcGVyYXRvckxpc3QuQ0hVTktfU0laRV9BQk9VVCYmKGU9PT1yLk9QUy5yZXN0b3JlfHxlPT09ci5PUFMuZW5kVGV4dCkpJiZ0aGlzLmZsdXNoKCl9YWRkSW1hZ2VPcHMoZSx0LGEpe3ZvaWQgMCE9PWEmJnRoaXMuYWRkT3Aoci5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIsYV0pO3RoaXMuYWRkT3AoZSx0KTt2b2lkIDAhPT1hJiZ0aGlzLmFkZE9wKHIuT1BTLmVuZE1hcmtlZENvbnRlbnQsW10pfWFkZERlcGVuZGVuY3koZSl7aWYoIXRoaXMuZGVwZW5kZW5jaWVzLmhhcyhlKSl7dGhpcy5kZXBlbmRlbmNpZXMuYWRkKGUpO3RoaXMuYWRkT3Aoci5PUFMuZGVwZW5kZW5jeSxbZV0pfX1hZGREZXBlbmRlbmNpZXMoZSl7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLmFkZERlcGVuZGVuY3kodCl9YWRkT3BMaXN0KGUpe2lmKGUgaW5zdGFuY2VvZiBPcGVyYXRvckxpc3Qpe2Zvcihjb25zdCB0IG9mIGUuZGVwZW5kZW5jaWVzKXRoaXMuZGVwZW5kZW5jaWVzLmFkZCh0KTtmb3IobGV0IHQ9MCxhPWUubGVuZ3RoO3Q8YTt0KyspdGhpcy5hZGRPcChlLmZuQXJyYXlbdF0sZS5hcmdzQXJyYXlbdF0pfWVsc2UoMCxyLndhcm4pKCdhZGRPcExpc3QgLSBpZ25vcmluZyBpbnZhbGlkICJvcExpc3QiIHBhcmFtZXRlci4nKX1nZXRJUigpe3JldHVybntmbkFycmF5OnRoaXMuZm5BcnJheSxhcmdzQXJyYXk6dGhpcy5hcmdzQXJyYXksbGVuZ3RoOnRoaXMubGVuZ3RofX1nZXQgX3RyYW5zZmVycygpe2NvbnN0IGU9W10se2ZuQXJyYXk6dCxhcmdzQXJyYXk6YSxsZW5ndGg6bn09dGhpcztmb3IobGV0IGk9MDtpPG47aSsrKXN3aXRjaCh0W2ldKXtjYXNlIHIuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OmNhc2Ugci5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDpjYXNlIHIuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDpjb25zdCB0PWFbaV1bMF07IXQuY2FjaGVkJiZ0LmRhdGE/LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiZlLnB1c2godC5kYXRhLmJ1ZmZlcil9cmV0dXJuIGV9Zmx1c2goKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGw7dGhpcy5vcHRpbWl6ZXIuZmx1c2goKTtjb25zdCBhPXRoaXMubGVuZ3RoO3RoaXMuX3RvdGFsTGVuZ3RoKz1hO3RoaXMuX3N0cmVhbVNpbmsuZW5xdWV1ZSh7Zm5BcnJheTp0aGlzLmZuQXJyYXksYXJnc0FycmF5OnRoaXMuYXJnc0FycmF5LGxhc3RDaHVuazplLHNlcGFyYXRlQW5ub3RzOnQsbGVuZ3RoOmF9LDEsdGhpcy5fdHJhbnNmZXJzKTt0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO3RoaXMuZm5BcnJheS5sZW5ndGg9MDt0aGlzLmFyZ3NBcnJheS5sZW5ndGg9MDt0aGlzLndlaWdodD0wO3RoaXMub3B0aW1pemVyLnJlc2V0KCl9fXQuT3BlcmF0b3JMaXN0PU9wZXJhdG9yTGlzdH0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5QREZJbWFnZT12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO2EoMik7dmFyIHI9YSgxNDQpLG49YSgxNzgpLGk9YSgxNTEpLHM9YSgxNjIpLG89YSgxNjgpLGM9YSgyMTIpLGw9YSgxNzYpLGg9YSgxODApLHU9YSgxNTApO2Z1bmN0aW9uIGRlY29kZUFuZENsYW1wKGUsdCxhLHIpeyhlPXQrZSphKTwwP2U9MDplPnImJihlPXIpO3JldHVybiBlfWZ1bmN0aW9uIHJlc2l6ZUltYWdlTWFzayhlLHQsYSxyLG4saSl7Y29uc3Qgcz1uKmk7bGV0IG87bz10PD04P25ldyBVaW50OEFycmF5KHMpOnQ8PTE2P25ldyBVaW50MTZBcnJheShzKTpuZXcgVWludDMyQXJyYXkocyk7Y29uc3QgYz1hL24sbD1yL2k7bGV0IGgsdSxkLGYsZz0wO2NvbnN0IHA9bmV3IFVpbnQxNkFycmF5KG4pLG09YTtmb3IoaD0wO2g8bjtoKyspcFtoXT1NYXRoLmZsb29yKGgqYyk7Zm9yKGg9MDtoPGk7aCsrKXtkPU1hdGguZmxvb3IoaCpsKSptO2Zvcih1PTA7dTxuO3UrKyl7Zj1kK3BbdV07b1tnKytdPWVbZl19fXJldHVybiBvfWNsYXNzIFBERkltYWdle2NvbnN0cnVjdG9yKGUpe2xldHt4cmVmOnQscmVzOmEsaW1hZ2U6bixpc0lubGluZTpvPSExLHNtYXNrOmM9bnVsbCxtYXNrOmw9bnVsbCxpc01hc2s6ZD0hMSxwZGZGdW5jdGlvbkZhY3Rvcnk6Zixsb2NhbENvbG9yU3BhY2VDYWNoZTpnfT1lO3RoaXMuaW1hZ2U9bjtjb25zdCBwPW4uZGljdCxtPXAuZ2V0KCJGIiwiRmlsdGVyIik7bGV0IGI7aWYobSBpbnN0YW5jZW9mIHUuTmFtZSliPW0ubmFtZTtlbHNlIGlmKEFycmF5LmlzQXJyYXkobSkpe2NvbnN0IGU9dC5mZXRjaElmUmVmKG1bMF0pO2UgaW5zdGFuY2VvZiB1Lk5hbWUmJihiPWUubmFtZSl9c3dpdGNoKGIpe2Nhc2UiSlBYRGVjb2RlIjpjb25zdCBlPW5ldyBoLkpweEltYWdlO2UucGFyc2VJbWFnZVByb3BlcnRpZXMobi5zdHJlYW0pO24uc3RyZWFtLnJlc2V0KCk7bi53aWR0aD1lLndpZHRoO24uaGVpZ2h0PWUuaGVpZ2h0O24uYml0c1BlckNvbXBvbmVudD1lLmJpdHNQZXJDb21wb25lbnQ7bi5udW1Db21wcz1lLmNvbXBvbmVudHNDb3VudDticmVhaztjYXNlIkpCSUcyRGVjb2RlIjpuLmJpdHNQZXJDb21wb25lbnQ9MTtuLm51bUNvbXBzPTF9bGV0IHk9cC5nZXQoIlciLCJXaWR0aCIpLHc9cC5nZXQoIkgiLCJIZWlnaHQiKTtpZihOdW1iZXIuaXNJbnRlZ2VyKG4ud2lkdGgpJiZuLndpZHRoPjAmJk51bWJlci5pc0ludGVnZXIobi5oZWlnaHQpJiZuLmhlaWdodD4wJiYobi53aWR0aCE9PXl8fG4uaGVpZ2h0IT09dykpeygwLHIud2FybikoIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSwgcmF0aGVyIHRoYW4gdGhlIGltYWdlIGRpY3Rpb25hcnkuIik7eT1uLndpZHRoO3c9bi5oZWlnaHR9aWYoeTwxfHx3PDEpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYEludmFsaWQgaW1hZ2Ugd2lkdGg6ICR7eX0gb3IgaGVpZ2h0OiAke3d9YCk7dGhpcy53aWR0aD15O3RoaXMuaGVpZ2h0PXc7dGhpcy5pbnRlcnBvbGF0ZT1wLmdldCgiSSIsIkludGVycG9sYXRlIik7dGhpcy5pbWFnZU1hc2s9cC5nZXQoIklNIiwiSW1hZ2VNYXNrIil8fCExO3RoaXMubWF0dGU9cC5nZXQoIk1hdHRlIil8fCExO2xldCBTPW4uYml0c1BlckNvbXBvbmVudDtpZighUyl7Uz1wLmdldCgiQlBDIiwiQml0c1BlckNvbXBvbmVudCIpO2lmKCFTKXtpZighdGhpcy5pbWFnZU1hc2spdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYEJpdHMgcGVyIGNvbXBvbmVudCBtaXNzaW5nIGluIGltYWdlOiAke3RoaXMuaW1hZ2VNYXNrfWApO1M9MX19dGhpcy5icGM9UztpZighdGhpcy5pbWFnZU1hc2spe2xldCBlPXAuZ2V0UmF3KCJDUyIpfHxwLmdldFJhdygiQ29sb3JTcGFjZSIpO2lmKCFlKXsoMCxyLmluZm8pKCJKUFggaW1hZ2VzICh3aGljaCBkbyBub3QgcmVxdWlyZSBjb2xvciBzcGFjZXMpIik7c3dpdGNoKG4ubnVtQ29tcHMpe2Nhc2UgMTplPXUuTmFtZS5nZXQoIkRldmljZUdyYXkiKTticmVhaztjYXNlIDM6ZT11Lk5hbWUuZ2V0KCJEZXZpY2VSR0IiKTticmVhaztjYXNlIDQ6ZT11Lk5hbWUuZ2V0KCJEZXZpY2VDTVlLIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYEpQWCBpbWFnZXMgd2l0aCAke24ubnVtQ29tcHN9IGNvbG9yIGNvbXBvbmVudHMgbm90IHN1cHBvcnRlZC5gKX19dGhpcy5jb2xvclNwYWNlPXMuQ29sb3JTcGFjZS5wYXJzZSh7Y3M6ZSx4cmVmOnQscmVzb3VyY2VzOm8/YTpudWxsLHBkZkZ1bmN0aW9uRmFjdG9yeTpmLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmd9KTt0aGlzLm51bUNvbXBzPXRoaXMuY29sb3JTcGFjZS5udW1Db21wc310aGlzLmRlY29kZT1wLmdldEFycmF5KCJEIiwiRGVjb2RlIik7dGhpcy5uZWVkc0RlY29kZT0hMTtpZih0aGlzLmRlY29kZSYmKHRoaXMuY29sb3JTcGFjZSYmIXRoaXMuY29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUodGhpcy5kZWNvZGUsUyl8fGQmJiFzLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLDEpKSl7dGhpcy5uZWVkc0RlY29kZT0hMDtjb25zdCBlPSgxPDxTKS0xO3RoaXMuZGVjb2RlQ29lZmZpY2llbnRzPVtdO3RoaXMuZGVjb2RlQWRkZW5kcz1bXTtjb25zdCB0PSJJbmRleGVkIj09PXRoaXMuY29sb3JTcGFjZT8ubmFtZTtmb3IobGV0IGE9MCxyPTA7YTx0aGlzLmRlY29kZS5sZW5ndGg7YSs9MiwrK3Ipe2NvbnN0IG49dGhpcy5kZWNvZGVbYV0saT10aGlzLmRlY29kZVthKzFdO3RoaXMuZGVjb2RlQ29lZmZpY2llbnRzW3JdPXQ/KGktbikvZTppLW47dGhpcy5kZWNvZGVBZGRlbmRzW3JdPXQ/bjplKm59fWlmKGMpdGhpcy5zbWFzaz1uZXcgUERGSW1hZ2Uoe3hyZWY6dCxyZXM6YSxpbWFnZTpjLGlzSW5saW5lOm8scGRmRnVuY3Rpb25GYWN0b3J5OmYsbG9jYWxDb2xvclNwYWNlQ2FjaGU6Z30pO2Vsc2UgaWYobClpZihsIGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtKXtsLmRpY3QuZ2V0KCJJTSIsIkltYWdlTWFzayIpP3RoaXMubWFzaz1uZXcgUERGSW1hZ2Uoe3hyZWY6dCxyZXM6YSxpbWFnZTpsLGlzSW5saW5lOm8saXNNYXNrOiEwLHBkZkZ1bmN0aW9uRmFjdG9yeTpmLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmd9KTooMCxyLndhcm4pKCJJZ25vcmluZyAvTWFzayBpbiBpbWFnZSB3aXRob3V0IC9JbWFnZU1hc2suIil9ZWxzZSB0aGlzLm1hc2s9bH1zdGF0aWMgYXN5bmMgYnVpbGRJbWFnZShlKXtsZXR7eHJlZjp0LHJlczphLGltYWdlOm4saXNJbmxpbmU6cz0hMSxwZGZGdW5jdGlvbkZhY3Rvcnk6byxsb2NhbENvbG9yU3BhY2VDYWNoZTpjfT1lO2NvbnN0IGw9bjtsZXQgaD1udWxsLHU9bnVsbDtjb25zdCBkPW4uZGljdC5nZXQoIlNNYXNrIiksZj1uLmRpY3QuZ2V0KCJNYXNrIik7ZD9kIGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtP2g9ZDooMCxyLndhcm4pKCJVbnN1cHBvcnRlZCAvU01hc2sgZm9ybWF0LiIpOmYmJihmIGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtfHxBcnJheS5pc0FycmF5KGYpP3U9ZjooMCxyLndhcm4pKCJVbnN1cHBvcnRlZCAvTWFzayBmb3JtYXQuIikpO3JldHVybiBuZXcgUERGSW1hZ2Uoe3hyZWY6dCxyZXM6YSxpbWFnZTpsLGlzSW5saW5lOnMsc21hc2s6aCxtYXNrOnUscGRmRnVuY3Rpb25GYWN0b3J5Om8sbG9jYWxDb2xvclNwYWNlQ2FjaGU6Y30pfXN0YXRpYyBjcmVhdGVSYXdNYXNrKGUpe2xldHtpbWdBcnJheTp0LHdpZHRoOmEsaGVpZ2h0OnIsaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW06bixpbnZlcnNlRGVjb2RlOmksaW50ZXJwb2xhdGU6c309ZTtjb25zdCBvPShhKzc+PjMpKnIsYz10LmJ5dGVMZW5ndGg7bGV0IGwsaDtpZighbnx8aSYmIShvPT09YykpaWYoaSl7bD1uZXcgVWludDhBcnJheShvKTtsLnNldCh0KTtsLmZpbGwoMjU1LGMpfWVsc2UgbD1uZXcgVWludDhBcnJheSh0KTtlbHNlIGw9dDtpZihpKWZvcihoPTA7aDxjO2grKylsW2hdXj0yNTU7cmV0dXJue2RhdGE6bCx3aWR0aDphLGhlaWdodDpyLGludGVycG9sYXRlOnN9fXN0YXRpYyBhc3luYyBjcmVhdGVNYXNrKGUpe2xldHtpbWdBcnJheTp0LHdpZHRoOmEsaGVpZ2h0OmksaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW06cyxpbnZlcnNlRGVjb2RlOm8saW50ZXJwb2xhdGU6bCxpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDpoPSExfT1lO2NvbnN0IHU9MT09PWEmJjE9PT1pJiZvPT09KDA9PT10Lmxlbmd0aHx8ISEoMTI4JnRbMF0pKTtpZih1KXJldHVybntpc1NpbmdsZU9wYXF1ZVBpeGVsOnV9O2lmKGgpe2lmKGMuSW1hZ2VSZXNpemVyLm5lZWRzVG9CZVJlc2l6ZWQoYSxpKSl7Y29uc3QgZT1uZXcgVWludDhDbGFtcGVkQXJyYXkoYSppKjQpOygwLG4uY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEpKHtzcmM6dCxkZXN0OmUsd2lkdGg6YSxoZWlnaHQ6aSxub25CbGFja0NvbG9yOjAsaW52ZXJzZURlY29kZTpvfSk7cmV0dXJuIGMuSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKHtraW5kOnIuSW1hZ2VLaW5kLlJHQkFfMzJCUFAsZGF0YTplLHdpZHRoOmEsaGVpZ2h0OmksaW50ZXJwb2xhdGU6bH0pfWNvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcyhhLGkpLHM9ZS5nZXRDb250ZXh0KCIyZCIpLGg9cy5jcmVhdGVJbWFnZURhdGEoYSxpKTsoMCxuLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7c3JjOnQsZGVzdDpoLmRhdGEsd2lkdGg6YSxoZWlnaHQ6aSxub25CbGFja0NvbG9yOjAsaW52ZXJzZURlY29kZTpvfSk7cy5wdXRJbWFnZURhdGEoaCwwLDApO3JldHVybntkYXRhOm51bGwsd2lkdGg6YSxoZWlnaHQ6aSxpbnRlcnBvbGF0ZTpsLGJpdG1hcDplLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpfX1yZXR1cm4gdGhpcy5jcmVhdGVSYXdNYXNrKHtpbWdBcnJheTp0LHdpZHRoOmEsaGVpZ2h0OmksaW52ZXJzZURlY29kZTpvLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOnMsaW50ZXJwb2xhdGU6bH0pfWdldCBkcmF3V2lkdGgoKXtyZXR1cm4gTWF0aC5tYXgodGhpcy53aWR0aCx0aGlzLnNtYXNrPy53aWR0aHx8MCx0aGlzLm1hc2s/LndpZHRofHwwKX1nZXQgZHJhd0hlaWdodCgpe3JldHVybiBNYXRoLm1heCh0aGlzLmhlaWdodCx0aGlzLnNtYXNrPy5oZWlnaHR8fDAsdGhpcy5tYXNrPy5oZWlnaHR8fDApfWRlY29kZUJ1ZmZlcihlKXtjb25zdCB0PXRoaXMuYnBjLGE9dGhpcy5udW1Db21wcyxyPXRoaXMuZGVjb2RlQWRkZW5kcyxuPXRoaXMuZGVjb2RlQ29lZmZpY2llbnRzLGk9KDE8PHQpLTE7bGV0IHMsbztpZigxPT09dCl7Zm9yKHM9MCxvPWUubGVuZ3RoO3M8bztzKyspZVtzXT0rIWVbc107cmV0dXJufWxldCBjPTA7Zm9yKHM9MCxvPXRoaXMud2lkdGgqdGhpcy5oZWlnaHQ7czxvO3MrKylmb3IobGV0IHQ9MDt0PGE7dCsrKXtlW2NdPWRlY29kZUFuZENsYW1wKGVbY10sclt0XSxuW3RdLGkpO2MrK319Z2V0Q29tcG9uZW50cyhlKXtjb25zdCB0PXRoaXMuYnBjO2lmKDg9PT10KXJldHVybiBlO2NvbnN0IGE9dGhpcy53aWR0aCxyPXRoaXMuaGVpZ2h0LG49dGhpcy5udW1Db21wcyxpPWEqcipuO2xldCBzLG89MDtzPXQ8PTg/bmV3IFVpbnQ4QXJyYXkoaSk6dDw9MTY/bmV3IFVpbnQxNkFycmF5KGkpOm5ldyBVaW50MzJBcnJheShpKTtjb25zdCBjPWEqbixsPSgxPDx0KS0xO2xldCBoLHUsZD0wO2lmKDE9PT10KXtsZXQgdCxhLG47Zm9yKGxldCBpPTA7aTxyO2krKyl7YT1kKygtOCZjKTtuPWQrYztmb3IoO2Q8YTspe3U9ZVtvKytdO3NbZF09dT4+NyYxO3NbZCsxXT11Pj42JjE7c1tkKzJdPXU+PjUmMTtzW2QrM109dT4+NCYxO3NbZCs0XT11Pj4zJjE7c1tkKzVdPXU+PjImMTtzW2QrNl09dT4+MSYxO3NbZCs3XT0xJnU7ZCs9OH1pZihkPG4pe3U9ZVtvKytdO3Q9MTI4O2Zvcig7ZDxuOyl7c1tkKytdPSshISh1JnQpO3Q+Pj0xfX19fWVsc2V7bGV0IGE9MDt1PTA7Zm9yKGQ9MCxoPWk7ZDxoOysrZCl7aWYoZCVjPT0wKXt1PTA7YT0wfWZvcig7YTx0Oyl7dT11PDw4fGVbbysrXTthKz04fWNvbnN0IHI9YS10O2xldCBuPXU+PnI7bjwwP249MDpuPmwmJihuPWwpO3NbZF09bjt1Jj0oMTw8ciktMTthPXJ9fXJldHVybiBzfWZpbGxPcGFjaXR5KGUsdCxhLG4saSl7Y29uc3Qgcz10aGlzLnNtYXNrLG89dGhpcy5tYXNrO2xldCBjLGwsaCx1LGQsZjtpZihzKXtsPXMud2lkdGg7aD1zLmhlaWdodDtjPW5ldyBVaW50OENsYW1wZWRBcnJheShsKmgpO3MuZmlsbEdyYXlCdWZmZXIoYyk7bD09PXQmJmg9PT1hfHwoYz1yZXNpemVJbWFnZU1hc2soYyxzLmJwYyxsLGgsdCxhKSl9ZWxzZSBpZihvKWlmKG8gaW5zdGFuY2VvZiBQREZJbWFnZSl7bD1vLndpZHRoO2g9by5oZWlnaHQ7Yz1uZXcgVWludDhDbGFtcGVkQXJyYXkobCpoKTtvLm51bUNvbXBzPTE7by5maWxsR3JheUJ1ZmZlcihjKTtmb3IodT0wLGQ9bCpoO3U8ZDsrK3UpY1t1XT0yNTUtY1t1XTtsPT09dCYmaD09PWF8fChjPXJlc2l6ZUltYWdlTWFzayhjLG8uYnBjLGwsaCx0LGEpKX1lbHNle2lmKCFBcnJheS5pc0FycmF5KG8pKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJVbmtub3duIG1hc2sgZm9ybWF0LiIpO3tjPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KmEpO2NvbnN0IGU9dGhpcy5udW1Db21wcztmb3IodT0wLGQ9dCphO3U8ZDsrK3Upe2xldCB0PTA7Y29uc3QgYT11KmU7Zm9yKGY9MDtmPGU7KytmKXtjb25zdCBlPWlbYStmXSxyPTIqZjtpZihlPG9bcl18fGU+b1tyKzFdKXt0PTI1NTticmVha319Y1t1XT10fX19aWYoYylmb3IodT0wLGY9MyxkPXQqbjt1PGQ7Kyt1LGYrPTQpZVtmXT1jW3VdO2Vsc2UgZm9yKHU9MCxmPTMsZD10Km47dTxkOysrdSxmKz00KWVbZl09MjU1fXVuZG9QcmVibGVuZChlLHQsYSl7Y29uc3Qgcj10aGlzLnNtYXNrPy5tYXR0ZTtpZighcilyZXR1cm47Y29uc3Qgbj10aGlzLmNvbG9yU3BhY2UuZ2V0UmdiKHIsMCksaT1uWzBdLHM9blsxXSxvPW5bMl0sYz10KmEqNDtmb3IobGV0IHQ9MDt0PGM7dCs9NCl7Y29uc3QgYT1lW3QrM107aWYoMD09PWEpe2VbdF09MjU1O2VbdCsxXT0yNTU7ZVt0KzJdPTI1NTtjb250aW51ZX1jb25zdCByPTI1NS9hO2VbdF09KGVbdF0taSkqcitpO2VbdCsxXT0oZVt0KzFdLXMpKnIrcztlW3QrMl09KGVbdCsyXS1vKSpyK299fWFzeW5jIGNyZWF0ZUltYWdlRGF0YSgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF0sdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2NvbnN0IGE9dGhpcy5kcmF3V2lkdGgsbj10aGlzLmRyYXdIZWlnaHQsaT17d2lkdGg6YSxoZWlnaHQ6bixpbnRlcnBvbGF0ZTp0aGlzLmludGVycG9sYXRlLGtpbmQ6MCxkYXRhOm51bGx9LHM9dGhpcy5udW1Db21wcyxvPXRoaXMud2lkdGgsaD10aGlzLmhlaWdodCx1PXRoaXMuYnBjLGQ9bypzKnUrNz4+MyxmPXQmJmMuSW1hZ2VSZXNpemVyLm5lZWRzVG9CZVJlc2l6ZWQoYSxuKTtpZighZSl7bGV0IGU7IkRldmljZUdyYXkiPT09dGhpcy5jb2xvclNwYWNlLm5hbWUmJjE9PT11P2U9ci5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA6IkRldmljZVJHQiIhPT10aGlzLmNvbG9yU3BhY2UubmFtZXx8OCE9PXV8fHRoaXMubmVlZHNEZWNvZGV8fChlPXIuSW1hZ2VLaW5kLlJHQl8yNEJQUCk7aWYoZSYmIXRoaXMuc21hc2smJiF0aGlzLm1hc2smJmE9PT1vJiZuPT09aCl7Y29uc3Qgcz10aGlzLmdldEltYWdlQnl0ZXMoaCpkLHt9KTtpZih0KXJldHVybiBmP2MuSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKHtkYXRhOnMsa2luZDplLHdpZHRoOmEsaGVpZ2h0Om4saW50ZXJwb2xhdGU6dGhpcy5pbnRlcnBvbGF0ZX0sdGhpcy5uZWVkc0RlY29kZSk6dGhpcy5jcmVhdGVCaXRtYXAoZSxvLGgscyk7aS5raW5kPWU7aS5kYXRhPXM7aWYodGhpcy5uZWVkc0RlY29kZSl7KDAsci5hc3NlcnQpKGU9PT1yLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCwiUERGSW1hZ2UuY3JlYXRlSW1hZ2VEYXRhOiBUaGUgaW1hZ2UgbXVzdCBiZSBncmF5c2NhbGUuIik7Y29uc3QgdD1pLmRhdGE7Zm9yKGxldCBlPTAsYT10Lmxlbmd0aDtlPGE7ZSsrKXRbZV1ePTI1NX1yZXR1cm4gaX1pZih0aGlzLmltYWdlIGluc3RhbmNlb2YgbC5KcGVnU3RyZWFtJiYhdGhpcy5zbWFzayYmIXRoaXMubWFzayYmIXRoaXMubmVlZHNEZWNvZGUpe2xldCBlPWgqZDtpZih0JiYhZil7bGV0IHQ9ITE7c3dpdGNoKHRoaXMuY29sb3JTcGFjZS5uYW1lKXtjYXNlIkRldmljZUdyYXkiOmUqPTQ7dD0hMDticmVhaztjYXNlIkRldmljZVJHQiI6ZT1lLzMqNDt0PSEwO2JyZWFrO2Nhc2UiRGV2aWNlQ01ZSyI6dD0hMH1pZih0KXtjb25zdCB0PXRoaXMuZ2V0SW1hZ2VCeXRlcyhlLHtkcmF3V2lkdGg6YSxkcmF3SGVpZ2h0Om4sZm9yY2VSR0JBOiEwfSk7cmV0dXJuIHRoaXMuY3JlYXRlQml0bWFwKHIuSW1hZ2VLaW5kLlJHQkFfMzJCUFAsYSxuLHQpfX1lbHNlIHN3aXRjaCh0aGlzLmNvbG9yU3BhY2UubmFtZSl7Y2FzZSJEZXZpY2VHcmF5IjplKj0zO2Nhc2UiRGV2aWNlUkdCIjpjYXNlIkRldmljZUNNWUsiOmkua2luZD1yLkltYWdlS2luZC5SR0JfMjRCUFA7aS5kYXRhPXRoaXMuZ2V0SW1hZ2VCeXRlcyhlLHtkcmF3V2lkdGg6YSxkcmF3SGVpZ2h0Om4sZm9yY2VSR0I6ITB9KTtyZXR1cm4gZj9jLkltYWdlUmVzaXplci5jcmVhdGVJbWFnZShpKTppfX19Y29uc3QgZz10aGlzLmdldEltYWdlQnl0ZXMoaCpkLHtpbnRlcm5hbDohMH0pLHA9MHxnLmxlbmd0aC9kKm4vaCxtPXRoaXMuZ2V0Q29tcG9uZW50cyhnKTtsZXQgYix5LHcsUyx4LEM7aWYodCYmIWYpe3c9bmV3IE9mZnNjcmVlbkNhbnZhcyhhLG4pO1M9dy5nZXRDb250ZXh0KCIyZCIpO3g9Uy5jcmVhdGVJbWFnZURhdGEoYSxuKTtDPXguZGF0YX1pLmtpbmQ9ci5JbWFnZUtpbmQuUkdCQV8zMkJQUDtpZihlfHx0aGlzLnNtYXNrfHx0aGlzLm1hc2spe3QmJiFmfHwoQz1uZXcgVWludDhDbGFtcGVkQXJyYXkoYSpuKjQpKTtiPTE7eT0hMDt0aGlzLmZpbGxPcGFjaXR5KEMsYSxuLHAsbSl9ZWxzZXtpZighdHx8Zil7aS5raW5kPXIuSW1hZ2VLaW5kLlJHQl8yNEJQUDtDPW5ldyBVaW50OENsYW1wZWRBcnJheShhKm4qMyk7Yj0wfWVsc2V7bmV3IFVpbnQzMkFycmF5KEMuYnVmZmVyKS5maWxsKHIuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4/NDI3ODE5MDA4MDoyNTUpO2I9MX15PSExfXRoaXMubmVlZHNEZWNvZGUmJnRoaXMuZGVjb2RlQnVmZmVyKG0pO3RoaXMuY29sb3JTcGFjZS5maWxsUmdiKEMsbyxoLGEsbixwLHUsbSxiKTt5JiZ0aGlzLnVuZG9QcmVibGVuZChDLGEscCk7aWYodCYmIWYpe1MucHV0SW1hZ2VEYXRhKHgsMCwwKTtyZXR1cm57ZGF0YTpudWxsLHdpZHRoOmEsaGVpZ2h0Om4sYml0bWFwOncudHJhbnNmZXJUb0ltYWdlQml0bWFwKCksaW50ZXJwb2xhdGU6dGhpcy5pbnRlcnBvbGF0ZX19aS5kYXRhPUM7cmV0dXJuIGY/Yy5JbWFnZVJlc2l6ZXIuY3JlYXRlSW1hZ2UoaSk6aX1maWxsR3JheUJ1ZmZlcihlKXtjb25zdCB0PXRoaXMubnVtQ29tcHM7aWYoMSE9PXQpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYFJlYWRpbmcgZ3JheSBzY2FsZSBmcm9tIGEgY29sb3IgaW1hZ2U6ICR7dH1gKTtjb25zdCBhPXRoaXMud2lkdGgsbj10aGlzLmhlaWdodCxpPXRoaXMuYnBjLHM9YSp0KmkrNz4+MyxvPXRoaXMuZ2V0SW1hZ2VCeXRlcyhuKnMse2ludGVybmFsOiEwfSksYz10aGlzLmdldENvbXBvbmVudHMobyk7bGV0IGwsaDtpZigxPT09aSl7aD1hKm47aWYodGhpcy5uZWVkc0RlY29kZSlmb3IobD0wO2w8aDsrK2wpZVtsXT1jW2xdLTEmMjU1O2Vsc2UgZm9yKGw9MDtsPGg7KytsKWVbbF09MjU1Ji1jW2xdO3JldHVybn10aGlzLm5lZWRzRGVjb2RlJiZ0aGlzLmRlY29kZUJ1ZmZlcihjKTtoPWEqbjtjb25zdCB1PTI1NS8oKDE8PGkpLTEpO2ZvcihsPTA7bDxoOysrbCllW2xdPXUqY1tsXX1jcmVhdGVCaXRtYXAoZSx0LGEsaSl7Y29uc3Qgcz1uZXcgT2Zmc2NyZWVuQ2FudmFzKHQsYSksbz1zLmdldENvbnRleHQoIjJkIik7bGV0IGM7aWYoZT09PXIuSW1hZ2VLaW5kLlJHQkFfMzJCUFApYz1uZXcgSW1hZ2VEYXRhKGksdCxhKTtlbHNle2M9by5jcmVhdGVJbWFnZURhdGEodCxhKTsoMCxuLmNvbnZlcnRUb1JHQkEpKHtraW5kOmUsc3JjOmksZGVzdDpuZXcgVWludDMyQXJyYXkoYy5kYXRhLmJ1ZmZlciksd2lkdGg6dCxoZWlnaHQ6YSxpbnZlcnNlRGVjb2RlOnRoaXMubmVlZHNEZWNvZGV9KX1vLnB1dEltYWdlRGF0YShjLDAsMCk7cmV0dXJue2RhdGE6bnVsbCx3aWR0aDp0LGhlaWdodDphLGJpdG1hcDpzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpLGludGVycG9sYXRlOnRoaXMuaW50ZXJwb2xhdGV9fWdldEltYWdlQnl0ZXMoZSx0KXtsZXR7ZHJhd1dpZHRoOmEsZHJhd0hlaWdodDpuLGZvcmNlUkdCQTppPSExLGZvcmNlUkdCOnM9ITEsaW50ZXJuYWw6Yz0hMX09dDt0aGlzLmltYWdlLnJlc2V0KCk7dGhpcy5pbWFnZS5kcmF3V2lkdGg9YXx8dGhpcy53aWR0aDt0aGlzLmltYWdlLmRyYXdIZWlnaHQ9bnx8dGhpcy5oZWlnaHQ7dGhpcy5pbWFnZS5mb3JjZVJHQkE9ISFpO3RoaXMuaW1hZ2UuZm9yY2VSR0I9ISFzO2NvbnN0IGw9dGhpcy5pbWFnZS5nZXRCeXRlcyhlKTtpZihjfHx0aGlzLmltYWdlIGluc3RhbmNlb2Ygby5EZWNvZGVTdHJlYW0pcmV0dXJuIGw7KDAsci5hc3NlcnQpKGwgaW5zdGFuY2VvZiBVaW50OEFycmF5LCdQREZJbWFnZS5nZXRJbWFnZUJ5dGVzOiBVbnN1cHBvcnRlZCAiaW1hZ2VCeXRlcyIgdHlwZS4nKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobCl9fXQuUERGSW1hZ2U9UERGSW1hZ2V9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuaW5jcmVtZW50YWxVcGRhdGU9YXN5bmMgZnVuY3Rpb24gaW5jcmVtZW50YWxVcGRhdGUoZSl7bGV0e29yaWdpbmFsRGF0YTp0LHhyZWZJbmZvOmEsbmV3UmVmczpvLHhyZWY6bD1udWxsLGhhc1hmYTpoPSExLHhmYURhdGFzZXRzUmVmOnU9bnVsbCxoYXNYZmFEYXRhc2V0c0VudHJ5OmQ9ITEsbmVlZEFwcGVhcmFuY2VzOmYsYWNyb0Zvcm1SZWY6Zz1udWxsLGFjcm9Gb3JtOnA9bnVsbCx4ZmFEYXRhOm09bnVsbH09ZTthd2FpdCBhc3luYyBmdW5jdGlvbiB1cGRhdGVBY3JvZm9ybShlKXtsZXR7eHJlZjp0LGFjcm9Gb3JtOmEsYWNyb0Zvcm1SZWY6aSxoYXNYZmE6cyxoYXNYZmFEYXRhc2V0c0VudHJ5Om8seGZhRGF0YXNldHNSZWY6YyxuZWVkQXBwZWFyYW5jZXM6bCxuZXdSZWZzOmh9PWU7IXN8fG98fGN8fCgwLHIud2FybikoIlhGQSAtIENhbm5vdCBzYXZlIGl0Iik7aWYoIWwmJighc3x8IWN8fG8pKXJldHVybjtjb25zdCB1PW5ldyBuLkRpY3QodCk7Zm9yKGNvbnN0IGUgb2YgYS5nZXRLZXlzKCkpdS5zZXQoZSxhLmdldFJhdyhlKSk7aWYocyYmIW8pe2NvbnN0IGU9YS5nZXQoIlhGQSIpLnNsaWNlKCk7ZS5zcGxpY2UoMiwwLCJkYXRhc2V0cyIpO2Uuc3BsaWNlKDMsMCxjKTt1LnNldCgiWEZBIixlKX1sJiZ1LnNldCgiTmVlZEFwcGVhcmFuY2VzIiwhMCk7Y29uc3QgZD10LmVuY3J5cHQ7bGV0IGY9bnVsbDtkJiYoZj1kLmNyZWF0ZUNpcGhlclRyYW5zZm9ybShpLm51bSxpLmdlbikpO2NvbnN0IGc9W107YXdhaXQgd3JpdGVPYmplY3QoaSx1LGcsZik7aC5wdXNoKHtyZWY6aSxkYXRhOmcuam9pbigiIil9KX0oe3hyZWY6bCxhY3JvRm9ybTpwLGFjcm9Gb3JtUmVmOmcsaGFzWGZhOmgsaGFzWGZhRGF0YXNldHNFbnRyeTpkLHhmYURhdGFzZXRzUmVmOnUsbmVlZEFwcGVhcmFuY2VzOmYsbmV3UmVmczpvfSk7aCYmZnVuY3Rpb24gdXBkYXRlWEZBKGUpe2xldHt4ZmFEYXRhOnQseGZhRGF0YXNldHNSZWY6YSxuZXdSZWZzOm4seHJlZjpvfT1lO2lmKG51bGw9PT10KXt0PWZ1bmN0aW9uIHdyaXRlWEZBRGF0YUZvckFjcm9mb3JtKGUsdCl7Y29uc3QgYT1uZXcgcy5TaW1wbGVYTUxQYXJzZXIoe2hhc0F0dHJpYnV0ZXM6ITB9KS5wYXJzZUZyb21TdHJpbmcoZSk7Zm9yKGNvbnN0e3hmYTplfW9mIHQpe2lmKCFlKWNvbnRpbnVlO2NvbnN0e3BhdGg6dCx2YWx1ZTpufT1lO2lmKCF0KWNvbnRpbnVlO2NvbnN0IG89KDAsaS5wYXJzZVhGQVBhdGgpKHQpO2xldCBjPWEuZG9jdW1lbnRFbGVtZW50LnNlYXJjaE5vZGUobywwKTshYyYmby5sZW5ndGg+MSYmKGM9YS5kb2N1bWVudEVsZW1lbnQuc2VhcmNoTm9kZShbby5hdCgtMSldLDApKTtjP2MuY2hpbGROb2Rlcz1BcnJheS5pc0FycmF5KG4pP24ubWFwKChlPT5uZXcgcy5TaW1wbGVET01Ob2RlKCJ2YWx1ZSIsZSkpKTpbbmV3IHMuU2ltcGxlRE9NTm9kZSgiI3RleHQiLG4pXTooMCxyLndhcm4pKGBOb2RlIG5vdCBmb3VuZCBmb3IgcGF0aDogJHt0fWApfWNvbnN0IG49W107YS5kb2N1bWVudEVsZW1lbnQuZHVtcChuKTtyZXR1cm4gbi5qb2luKCIiKX0oby5mZXRjaElmUmVmKGEpLmdldFN0cmluZygpLG4pfWNvbnN0IGM9by5lbmNyeXB0O2lmKGMpe3Q9Yy5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oYS5udW0sYS5nZW4pLmVuY3J5cHRTdHJpbmcodCl9Y29uc3QgbD1gJHthLm51bX0gJHthLmdlbn0gb2JqXG48PCAvVHlwZSAvRW1iZWRkZWRGaWxlIC9MZW5ndGggJHt0Lmxlbmd0aH0+Plxuc3RyZWFtXG5gK3QrIlxuZW5kc3RyZWFtXG5lbmRvYmpcbiI7bi5wdXNoKHtyZWY6YSxkYXRhOmx9KX0oe3hmYURhdGE6bSx4ZmFEYXRhc2V0c1JlZjp1LG5ld1JlZnM6byx4cmVmOmx9KTtjb25zdCBiPW5ldyBuLkRpY3QobnVsbCkseT1hLm5ld1JlZjtsZXQgdyxTO2NvbnN0IHg9dC5hdCgtMSk7aWYoMTA9PT14fHwxMz09PXgpe3c9W107Uz10Lmxlbmd0aH1lbHNle3c9WyJcbiJdO1M9dC5sZW5ndGgrMX1iLnNldCgiU2l6ZSIseS5udW0rMSk7Yi5zZXQoIlByZXYiLGEuc3RhcnRYUmVmKTtiLnNldCgiVHlwZSIsbi5OYW1lLmdldCgiWFJlZiIpKTtudWxsIT09YS5yb290UmVmJiZiLnNldCgiUm9vdCIsYS5yb290UmVmKTtudWxsIT09YS5pbmZvUmVmJiZiLnNldCgiSW5mbyIsYS5pbmZvUmVmKTtudWxsIT09YS5lbmNyeXB0UmVmJiZiLnNldCgiRW5jcnlwdCIsYS5lbmNyeXB0UmVmKTtvLnB1c2goe3JlZjp5LGRhdGE6IiJ9KTtvPW8uc29ydCgoKGUsdCk9PmUucmVmLm51bS10LnJlZi5udW0pKTtjb25zdCBDPVtbMCwxLDY1NTM1XV0sdj1bMCwxXTtsZXQgaz0wO2Zvcihjb25zdHtyZWY6ZSxkYXRhOnR9b2Ygbyl7az1NYXRoLm1heChrLFMpO0MucHVzaChbMSxTLE1hdGgubWluKGUuZ2VuLDY1NTM1KV0pO1MrPXQubGVuZ3RoO3YucHVzaChlLm51bSwxKTt3LnB1c2godCl9Yi5zZXQoIkluZGV4Iix2KTtpZihBcnJheS5pc0FycmF5KGEuZmlsZUlkcykmJmEuZmlsZUlkcy5sZW5ndGg+MCl7Y29uc3QgZT1mdW5jdGlvbiBjb21wdXRlTUQ1KGUsdCl7Y29uc3QgYT1NYXRoLmZsb29yKERhdGUubm93KCkvMWUzKSxuPXQuZmlsZW5hbWV8fCIiLGk9W2EudG9TdHJpbmcoKSxuLGUudG9TdHJpbmcoKV07bGV0IHM9aS5yZWR1Y2UoKChlLHQpPT5lK3QubGVuZ3RoKSwwKTtmb3IoY29uc3QgZSBvZiBPYmplY3QudmFsdWVzKHQuaW5mbykpe2kucHVzaChlKTtzKz1lLmxlbmd0aH1jb25zdCBvPW5ldyBVaW50OEFycmF5KHMpO2xldCBsPTA7Zm9yKGNvbnN0IGUgb2YgaSl7d3JpdGVTdHJpbmcoZSxsLG8pO2wrPWUubGVuZ3RofXJldHVybigwLHIuYnl0ZXNUb1N0cmluZykoKDAsYy5jYWxjdWxhdGVNRDUpKG8pKX0oUyxhKTtiLnNldCgiSUQiLFthLmZpbGVJZHNbMF0sZV0pfWNvbnN0IE89WzEsTWF0aC5jZWlsKE1hdGgubG9nMihrKS84KSwyXSxUPShPWzBdK09bMV0rT1syXSkqQy5sZW5ndGg7Yi5zZXQoIlciLE8pO2Iuc2V0KCJMZW5ndGgiLFQpO3cucHVzaChgJHt5Lm51bX0gJHt5Lmdlbn0gb2JqXG5gKTthd2FpdCB3cml0ZURpY3QoYix3LG51bGwpO3cucHVzaCgiIHN0cmVhbVxuIik7Y29uc3QgTT13LnJlZHVjZSgoKGUsdCk9PmUrdC5sZW5ndGgpLDApLEU9YFxuZW5kc3RyZWFtXG5lbmRvYmpcbnN0YXJ0eHJlZlxuJHtTfVxuJSVFT0ZcbmAsRD1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCtNK1QrRS5sZW5ndGgpO0Quc2V0KHQpO2xldCBOPXQubGVuZ3RoO2Zvcihjb25zdCBlIG9mIHcpe3dyaXRlU3RyaW5nKGUsTixEKTtOKz1lLmxlbmd0aH1mb3IoY29uc3RbZSx0LGFdb2YgQyl7Tj13cml0ZUludChlLE9bMF0sTixEKTtOPXdyaXRlSW50KHQsT1sxXSxOLEQpO049d3JpdGVJbnQoYSxPWzJdLE4sRCl9d3JpdGVTdHJpbmcoRSxOLEQpO3JldHVybiBEfTt0LndyaXRlRGljdD13cml0ZURpY3Q7dC53cml0ZU9iamVjdD13cml0ZU9iamVjdDthKDEzOSk7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO3ZhciByPWEoMTQ0KSxuPWEoMTUwKSxpPWEoMTQ5KSxzPWEoMjE3KSxvPWEoMTUxKSxjPWEoMjE4KTthc3luYyBmdW5jdGlvbiB3cml0ZU9iamVjdChlLHQsYSxyKXthLnB1c2goYCR7ZS5udW19ICR7ZS5nZW59IG9ialxuYCk7dCBpbnN0YW5jZW9mIG4uRGljdD9hd2FpdCB3cml0ZURpY3QodCxhLHIpOnQgaW5zdGFuY2VvZiBvLkJhc2VTdHJlYW0mJmF3YWl0IHdyaXRlU3RyZWFtKHQsYSxyKTthLnB1c2goIlxuZW5kb2JqXG4iKX1hc3luYyBmdW5jdGlvbiB3cml0ZURpY3QoZSx0LGEpe3QucHVzaCgiPDwiKTtmb3IoY29uc3QgciBvZiBlLmdldEtleXMoKSl7dC5wdXNoKGAgLyR7KDAsaS5lc2NhcGVQREZOYW1lKShyKX0gYCk7YXdhaXQgd3JpdGVWYWx1ZShlLmdldFJhdyhyKSx0LGEpfXQucHVzaCgiPj4iKX1hc3luYyBmdW5jdGlvbiB3cml0ZVN0cmVhbShlLHQsYSl7bGV0IGk9ZS5nZXRTdHJpbmcoKTtudWxsIT09YSYmKGk9YS5lbmNyeXB0U3RyaW5nKGkpKTtjb25zdHtkaWN0OnN9PWUsW28sY109YXdhaXQgUHJvbWlzZS5hbGwoW3MuZ2V0QXN5bmMoIkZpbHRlciIpLHMuZ2V0QXN5bmMoIkRlY29kZVBhcm1zIildKSxsPUFycmF5LmlzQXJyYXkobyk/YXdhaXQgcy54cmVmLmZldGNoSWZSZWZBc3luYyhvWzBdKTpvLGg9KDAsbi5pc05hbWUpKGwsIkZsYXRlRGVjb2RlIik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBDb21wcmVzc2lvblN0cmVhbSYmKGkubGVuZ3RoPj0yNTZ8fGgpKXRyeXtjb25zdCBlPSgwLHIuc3RyaW5nVG9CeXRlcykoaSksdD1uZXcgQ29tcHJlc3Npb25TdHJlYW0oImRlZmxhdGUiKSxhPXQud3JpdGFibGUuZ2V0V3JpdGVyKCk7YS53cml0ZShlKTthLmNsb3NlKCk7Y29uc3QgbD1hd2FpdCBuZXcgUmVzcG9uc2UodC5yZWFkYWJsZSkuYXJyYXlCdWZmZXIoKTtpPSgwLHIuYnl0ZXNUb1N0cmluZykobmV3IFVpbnQ4QXJyYXkobCkpO2xldCB1LGQ7aWYobyl7aWYoIWgpe3U9QXJyYXkuaXNBcnJheShvKT9bbi5OYW1lLmdldCgiRmxhdGVEZWNvZGUiKSwuLi5vXTpbbi5OYW1lLmdldCgiRmxhdGVEZWNvZGUiKSxvXTtjJiYoZD1BcnJheS5pc0FycmF5KGMpP1tudWxsLC4uLmNdOltudWxsLGNdKX19ZWxzZSB1PW4uTmFtZS5nZXQoIkZsYXRlRGVjb2RlIik7dSYmcy5zZXQoIkZpbHRlciIsdSk7ZCYmcy5zZXQoIkRlY29kZVBhcm1zIixkKX1jYXRjaChlKXsoMCxyLmluZm8pKGB3cml0ZVN0cmVhbSAtIGNhbm5vdCBjb21wcmVzcyBkYXRhOiAiJHtlfSIuYCl9cy5zZXQoIkxlbmd0aCIsaS5sZW5ndGgpO2F3YWl0IHdyaXRlRGljdChzLHQsYSk7dC5wdXNoKCIgc3RyZWFtXG4iLGksIlxuZW5kc3RyZWFtIil9YXN5bmMgZnVuY3Rpb24gd3JpdGVWYWx1ZShlLHQsYSl7aWYoZSBpbnN0YW5jZW9mIG4uTmFtZSl0LnB1c2goYC8keygwLGkuZXNjYXBlUERGTmFtZSkoZS5uYW1lKX1gKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBuLlJlZil0LnB1c2goYCR7ZS5udW19ICR7ZS5nZW59IFJgKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpYXdhaXQgYXN5bmMgZnVuY3Rpb24gd3JpdGVBcnJheShlLHQsYSl7dC5wdXNoKCJbIik7bGV0IHI9ITA7Zm9yKGNvbnN0IG4gb2YgZSl7cj9yPSExOnQucHVzaCgiICIpO2F3YWl0IHdyaXRlVmFsdWUobix0LGEpfXQucHVzaCgiXSIpfShlLHQsYSk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpe251bGwhPT1hJiYoZT1hLmVuY3J5cHRTdHJpbmcoZSkpO3QucHVzaChgKCR7KDAsaS5lc2NhcGVTdHJpbmcpKGUpfSlgKX1lbHNlIm51bWJlciI9PXR5cGVvZiBlP3QucHVzaCgoMCxpLm51bWJlclRvU3RyaW5nKShlKSk6ImJvb2xlYW4iPT10eXBlb2YgZT90LnB1c2goZS50b1N0cmluZygpKTplIGluc3RhbmNlb2Ygbi5EaWN0P2F3YWl0IHdyaXRlRGljdChlLHQsYSk6ZSBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbT9hd2FpdCB3cml0ZVN0cmVhbShlLHQsYSk6bnVsbD09PWU/dC5wdXNoKCJudWxsIik6KDAsci53YXJuKShgVW5oYW5kbGVkIHZhbHVlIGluIHdyaXRlcjogJHt0eXBlb2YgZX0sIHBsZWFzZSBmaWxlIGEgYnVnLmApfWZ1bmN0aW9uIHdyaXRlSW50KGUsdCxhLHIpe2ZvcihsZXQgbj10K2EtMTtuPmEtMTtuLS0pe3Jbbl09MjU1JmU7ZT4+PTh9cmV0dXJuIGErdH1mdW5jdGlvbiB3cml0ZVN0cmluZyhlLHQsYSl7Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKWFbdCtyXT0yNTUmZS5jaGFyQ29kZUF0KHIpfX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5YTUxQYXJzZXJFcnJvckNvZGU9dC5YTUxQYXJzZXJCYXNlPXQuU2ltcGxlWE1MUGFyc2VyPXQuU2ltcGxlRE9NTm9kZT12b2lkIDA7YSgxMzkpO3ZhciByPWEoMTQ5KTtjb25zdCBuPXtOb0Vycm9yOjAsRW5kT2ZEb2N1bWVudDotMSxVbnRlcm1pbmF0ZWRDZGF0Oi0yLFVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uOi0zLFVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbjotNCxVbnRlcm1pbmF0ZWRDb21tZW50Oi01LE1hbGZvcm1lZEVsZW1lbnQ6LTYsT3V0T2ZNZW1vcnk6LTcsVW50ZXJtaW5hdGVkQXR0cmlidXRlVmFsdWU6LTgsVW50ZXJtaW5hdGVkRWxlbWVudDotOSxFbGVtZW50TmV2ZXJCZWd1bjotMTB9O3QuWE1MUGFyc2VyRXJyb3JDb2RlPW47ZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGUsdCl7Y29uc3QgYT1lW3RdO3JldHVybiIgIj09PWF8fCJcbiI9PT1hfHwiXHIiPT09YXx8Ilx0Ij09PWF9Y2xhc3MgWE1MUGFyc2VyQmFzZXtfcmVzb2x2ZUVudGl0aWVzKGUpe3JldHVybiBlLnJlcGxhY2VBbGwoLyYoW147XSspOy9nLCgoZSx0KT0+e2lmKCIjeCI9PT10LnN1YnN0cmluZygwLDIpKXJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludCh0LnN1YnN0cmluZygyKSwxNikpO2lmKCIjIj09PXQuc3Vic3RyaW5nKDAsMSkpcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KHBhcnNlSW50KHQuc3Vic3RyaW5nKDEpLDEwKSk7c3dpdGNoKHQpe2Nhc2UibHQiOnJldHVybiI8IjtjYXNlImd0IjpyZXR1cm4iPiI7Y2FzZSJhbXAiOnJldHVybiImIjtjYXNlInF1b3QiOnJldHVybiciJztjYXNlImFwb3MiOnJldHVybiInIn1yZXR1cm4gdGhpcy5vblJlc29sdmVFbnRpdHkodCl9KSl9X3BhcnNlQ29udGVudChlLHQpe2NvbnN0IGE9W107bGV0IHI9dDtmdW5jdGlvbiBza2lwV3MoKXtmb3IoO3I8ZS5sZW5ndGgmJmlzV2hpdGVzcGFjZShlLHIpOykrK3J9Zm9yKDtyPGUubGVuZ3RoJiYhaXNXaGl0ZXNwYWNlKGUscikmJiI+IiE9PWVbcl0mJiIvIiE9PWVbcl07KSsrcjtjb25zdCBuPWUuc3Vic3RyaW5nKHQscik7c2tpcFdzKCk7Zm9yKDtyPGUubGVuZ3RoJiYiPiIhPT1lW3JdJiYiLyIhPT1lW3JdJiYiPyIhPT1lW3JdOyl7c2tpcFdzKCk7bGV0IHQ9IiIsbj0iIjtmb3IoO3I8ZS5sZW5ndGgmJiFpc1doaXRlc3BhY2UoZSxyKSYmIj0iIT09ZVtyXTspe3QrPWVbcl07KytyfXNraXBXcygpO2lmKCI9IiE9PWVbcl0pcmV0dXJuIG51bGw7KytyO3NraXBXcygpO2NvbnN0IGk9ZVtyXTtpZignIichPT1pJiYiJyIhPT1pKXJldHVybiBudWxsO2NvbnN0IHM9ZS5pbmRleE9mKGksKytyKTtpZihzPDApcmV0dXJuIG51bGw7bj1lLnN1YnN0cmluZyhyLHMpO2EucHVzaCh7bmFtZTp0LHZhbHVlOnRoaXMuX3Jlc29sdmVFbnRpdGllcyhuKX0pO3I9cysxO3NraXBXcygpfXJldHVybntuYW1lOm4sYXR0cmlidXRlczphLHBhcnNlZDpyLXR9fV9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihlLHQpe2xldCBhPXQ7Zm9yKDthPGUubGVuZ3RoJiYhaXNXaGl0ZXNwYWNlKGUsYSkmJiI+IiE9PWVbYV0mJiI/IiE9PWVbYV0mJiIvIiE9PWVbYV07KSsrYTtjb25zdCByPWUuc3Vic3RyaW5nKHQsYSk7IWZ1bmN0aW9uIHNraXBXcygpe2Zvcig7YTxlLmxlbmd0aCYmaXNXaGl0ZXNwYWNlKGUsYSk7KSsrYX0oKTtjb25zdCBuPWE7Zm9yKDthPGUubGVuZ3RoJiYoIj8iIT09ZVthXXx8Ij4iIT09ZVthKzFdKTspKythO3JldHVybntuYW1lOnIsdmFsdWU6ZS5zdWJzdHJpbmcobixhKSxwYXJzZWQ6YS10fX1wYXJzZVhtbChlKXtsZXQgdD0wO2Zvcig7dDxlLmxlbmd0aDspe2xldCBhPXQ7aWYoIjwiPT09ZVt0XSl7KythO2xldCB0O3N3aXRjaChlW2FdKXtjYXNlIi8iOisrYTt0PWUuaW5kZXhPZigiPiIsYSk7aWYodDwwKXt0aGlzLm9uRXJyb3Iobi5VbnRlcm1pbmF0ZWRFbGVtZW50KTtyZXR1cm59dGhpcy5vbkVuZEVsZW1lbnQoZS5zdWJzdHJpbmcoYSx0KSk7YT10KzE7YnJlYWs7Y2FzZSI/IjorK2E7Y29uc3Qgcj10aGlzLl9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihlLGEpO2lmKCI/PiIhPT1lLnN1YnN0cmluZyhhK3IucGFyc2VkLGErci5wYXJzZWQrMikpe3RoaXMub25FcnJvcihuLlVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uKTtyZXR1cm59dGhpcy5vblBpKHIubmFtZSxyLnZhbHVlKTthKz1yLnBhcnNlZCsyO2JyZWFrO2Nhc2UiISI6aWYoIi0tIj09PWUuc3Vic3RyaW5nKGErMSxhKzMpKXt0PWUuaW5kZXhPZigiLS1ceDNlIixhKzMpO2lmKHQ8MCl7dGhpcy5vbkVycm9yKG4uVW50ZXJtaW5hdGVkQ29tbWVudCk7cmV0dXJufXRoaXMub25Db21tZW50KGUuc3Vic3RyaW5nKGErMyx0KSk7YT10KzN9ZWxzZSBpZigiW0NEQVRBWyI9PT1lLnN1YnN0cmluZyhhKzEsYSs4KSl7dD1lLmluZGV4T2YoIl1dPiIsYSs4KTtpZih0PDApe3RoaXMub25FcnJvcihuLlVudGVybWluYXRlZENkYXQpO3JldHVybn10aGlzLm9uQ2RhdGEoZS5zdWJzdHJpbmcoYSs4LHQpKTthPXQrM31lbHNle2lmKCJET0NUWVBFIiE9PWUuc3Vic3RyaW5nKGErMSxhKzgpKXt0aGlzLm9uRXJyb3Iobi5NYWxmb3JtZWRFbGVtZW50KTtyZXR1cm59e2NvbnN0IHI9ZS5pbmRleE9mKCJbIixhKzgpO2xldCBpPSExO3Q9ZS5pbmRleE9mKCI+IixhKzgpO2lmKHQ8MCl7dGhpcy5vbkVycm9yKG4uVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTtyZXR1cm59aWYocj4wJiZ0PnIpe3Q9ZS5pbmRleE9mKCJdPiIsYSs4KTtpZih0PDApe3RoaXMub25FcnJvcihuLlVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbik7cmV0dXJufWk9ITB9Y29uc3Qgcz1lLnN1YnN0cmluZyhhKzgsdCsoaT8xOjApKTt0aGlzLm9uRG9jdHlwZShzKTthPXQrKGk/MjoxKX19YnJlYWs7ZGVmYXVsdDpjb25zdCBpPXRoaXMuX3BhcnNlQ29udGVudChlLGEpO2lmKG51bGw9PT1pKXt0aGlzLm9uRXJyb3Iobi5NYWxmb3JtZWRFbGVtZW50KTtyZXR1cm59bGV0IHM9ITE7aWYoIi8+Ij09PWUuc3Vic3RyaW5nKGEraS5wYXJzZWQsYStpLnBhcnNlZCsyKSlzPSEwO2Vsc2UgaWYoIj4iIT09ZS5zdWJzdHJpbmcoYStpLnBhcnNlZCxhK2kucGFyc2VkKzEpKXt0aGlzLm9uRXJyb3Iobi5VbnRlcm1pbmF0ZWRFbGVtZW50KTtyZXR1cm59dGhpcy5vbkJlZ2luRWxlbWVudChpLm5hbWUsaS5hdHRyaWJ1dGVzLHMpO2ErPWkucGFyc2VkKyhzPzI6MSl9fWVsc2V7Zm9yKDthPGUubGVuZ3RoJiYiPCIhPT1lW2FdOylhKys7Y29uc3Qgcj1lLnN1YnN0cmluZyh0LGEpO3RoaXMub25UZXh0KHRoaXMuX3Jlc29sdmVFbnRpdGllcyhyKSl9dD1hfX1vblJlc29sdmVFbnRpdHkoZSl7cmV0dXJuYCYke2V9O2B9b25QaShlLHQpe31vbkNvbW1lbnQoZSl7fW9uQ2RhdGEoZSl7fW9uRG9jdHlwZShlKXt9b25UZXh0KGUpe31vbkJlZ2luRWxlbWVudChlLHQsYSl7fW9uRW5kRWxlbWVudChlKXt9b25FcnJvcihlKXt9fXQuWE1MUGFyc2VyQmFzZT1YTUxQYXJzZXJCYXNlO2NsYXNzIFNpbXBsZURPTU5vZGV7Y29uc3RydWN0b3IoZSx0KXt0aGlzLm5vZGVOYW1lPWU7dGhpcy5ub2RlVmFsdWU9dDtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGFyZW50Tm9kZSIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX1nZXQgZmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkTm9kZXM/LlswXX1nZXQgbmV4dFNpYmxpbmcoKXtjb25zdCBlPXRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzO2lmKCFlKXJldHVybjtjb25zdCB0PWUuaW5kZXhPZih0aGlzKTtyZXR1cm4tMSE9PXQ/ZVt0KzFdOnZvaWQgMH1nZXQgdGV4dENvbnRlbnQoKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzP3RoaXMuY2hpbGROb2Rlcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRleHRDb250ZW50fSkpLmpvaW4oIiIpOnRoaXMubm9kZVZhbHVlfHwiIn1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfHxbXX1oYXNDaGlsZE5vZGVzKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlcz8ubGVuZ3RoPjB9c2VhcmNoTm9kZShlLHQpe2lmKHQ+PWUubGVuZ3RoKXJldHVybiB0aGlzO2NvbnN0IGE9ZVt0XSxyPVtdO2xldCBuPXRoaXM7Zm9yKDs7KXtpZihhLm5hbWU9PT1uLm5vZGVOYW1lKXtpZigwIT09YS5wb3Mpe2lmKDA9PT1yLmxlbmd0aClyZXR1cm4gbnVsbDt7Y29uc3RbaV09ci5wb3AoKTtsZXQgcz0wO2Zvcihjb25zdCByIG9mIGkuY2hpbGROb2RlcylpZihhLm5hbWU9PT1yLm5vZGVOYW1lKXtpZihzPT09YS5wb3MpcmV0dXJuIHIuc2VhcmNoTm9kZShlLHQrMSk7cysrfXJldHVybiBuLnNlYXJjaE5vZGUoZSx0KzEpfX17Y29uc3QgYT1uLnNlYXJjaE5vZGUoZSx0KzEpO2lmKG51bGwhPT1hKXJldHVybiBhfX1pZihuLmNoaWxkTm9kZXM/Lmxlbmd0aD4wKXtyLnB1c2goW24sMF0pO249bi5jaGlsZE5vZGVzWzBdfWVsc2V7aWYoMD09PXIubGVuZ3RoKXJldHVybiBudWxsO2Zvcig7MCE9PXIubGVuZ3RoOyl7Y29uc3RbZSx0XT1yLnBvcCgpLGE9dCsxO2lmKGE8ZS5jaGlsZE5vZGVzLmxlbmd0aCl7ci5wdXNoKFtlLGFdKTtuPWUuY2hpbGROb2Rlc1thXTticmVha319aWYoMD09PXIubGVuZ3RoKXJldHVybiBudWxsfX19ZHVtcChlKXtpZigiI3RleHQiIT09dGhpcy5ub2RlTmFtZSl7ZS5wdXNoKGA8JHt0aGlzLm5vZGVOYW1lfWApO2lmKHRoaXMuYXR0cmlidXRlcylmb3IoY29uc3QgdCBvZiB0aGlzLmF0dHJpYnV0ZXMpZS5wdXNoKGAgJHt0Lm5hbWV9PSIkeygwLHIuZW5jb2RlVG9YbWxTdHJpbmcpKHQudmFsdWUpfSJgKTtpZih0aGlzLmhhc0NoaWxkTm9kZXMoKSl7ZS5wdXNoKCI+Iik7Zm9yKGNvbnN0IHQgb2YgdGhpcy5jaGlsZE5vZGVzKXQuZHVtcChlKTtlLnB1c2goYDwvJHt0aGlzLm5vZGVOYW1lfT5gKX1lbHNlIHRoaXMubm9kZVZhbHVlP2UucHVzaChgPiR7KDAsci5lbmNvZGVUb1htbFN0cmluZykodGhpcy5ub2RlVmFsdWUpfTwvJHt0aGlzLm5vZGVOYW1lfT5gKTplLnB1c2goIi8+Iil9ZWxzZSBlLnB1c2goKDAsci5lbmNvZGVUb1htbFN0cmluZykodGhpcy5ub2RlVmFsdWUpKX19dC5TaW1wbGVET01Ob2RlPVNpbXBsZURPTU5vZGU7dC5TaW1wbGVYTUxQYXJzZXI9Y2xhc3MgU2ltcGxlWE1MUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyQmFzZXtjb25zdHJ1Y3RvcihlKXtsZXR7aGFzQXR0cmlidXRlczp0PSExLGxvd2VyQ2FzZU5hbWU6YT0hMX09ZTtzdXBlcigpO3RoaXMuX2N1cnJlbnRGcmFnbWVudD1udWxsO3RoaXMuX3N0YWNrPW51bGw7dGhpcy5fZXJyb3JDb2RlPW4uTm9FcnJvcjt0aGlzLl9oYXNBdHRyaWJ1dGVzPXQ7dGhpcy5fbG93ZXJDYXNlTmFtZT1hfXBhcnNlRnJvbVN0cmluZyhlKXt0aGlzLl9jdXJyZW50RnJhZ21lbnQ9W107dGhpcy5fc3RhY2s9W107dGhpcy5fZXJyb3JDb2RlPW4uTm9FcnJvcjt0aGlzLnBhcnNlWG1sKGUpO2lmKHRoaXMuX2Vycm9yQ29kZSE9PW4uTm9FcnJvcilyZXR1cm47Y29uc3RbdF09dGhpcy5fY3VycmVudEZyYWdtZW50O3JldHVybiB0P3tkb2N1bWVudEVsZW1lbnQ6dH06dm9pZCAwfW9uVGV4dChlKXtpZihmdW5jdGlvbiBpc1doaXRlc3BhY2VTdHJpbmcoZSl7Zm9yKGxldCB0PTAsYT1lLmxlbmd0aDt0PGE7dCsrKWlmKCFpc1doaXRlc3BhY2UoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH0oZSkpcmV0dXJuO2NvbnN0IHQ9bmV3IFNpbXBsZURPTU5vZGUoIiN0ZXh0IixlKTt0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaCh0KX1vbkNkYXRhKGUpe2NvbnN0IHQ9bmV3IFNpbXBsZURPTU5vZGUoIiN0ZXh0IixlKTt0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaCh0KX1vbkJlZ2luRWxlbWVudChlLHQsYSl7dGhpcy5fbG93ZXJDYXNlTmFtZSYmKGU9ZS50b0xvd2VyQ2FzZSgpKTtjb25zdCByPW5ldyBTaW1wbGVET01Ob2RlKGUpO3IuY2hpbGROb2Rlcz1bXTt0aGlzLl9oYXNBdHRyaWJ1dGVzJiYoci5hdHRyaWJ1dGVzPXQpO3RoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKHIpO2lmKCFhKXt0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnRGcmFnbWVudCk7dGhpcy5fY3VycmVudEZyYWdtZW50PXIuY2hpbGROb2Rlc319b25FbmRFbGVtZW50KGUpe3RoaXMuX2N1cnJlbnRGcmFnbWVudD10aGlzLl9zdGFjay5wb3AoKXx8W107Y29uc3QgdD10aGlzLl9jdXJyZW50RnJhZ21lbnQuYXQoLTEpO2lmKCF0KXJldHVybiBudWxsO2Zvcihjb25zdCBlIG9mIHQuY2hpbGROb2RlcyllLnBhcmVudE5vZGU9dDtyZXR1cm4gdH1vbkVycm9yKGUpe3RoaXMuX2Vycm9yQ29kZT1lfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuY2FsY3VsYXRlU0hBMjU2PXQuY2FsY3VsYXRlTUQ1PXQuUERGMjA9dC5QREYxNz10LkNpcGhlclRyYW5zZm9ybUZhY3Rvcnk9dC5BUkNGb3VyQ2lwaGVyPXQuQUVTMjU2Q2lwaGVyPXQuQUVTMTI4Q2lwaGVyPXZvaWQgMDt0LmNhbGN1bGF0ZVNIQTM4ND1jYWxjdWxhdGVTSEEzODQ7dC5jYWxjdWxhdGVTSEE1MTI9dm9pZCAwO2EoODQpO2EoOTMpO2EoOTQpO2EoOTcpO2EoOTkpO2EoMTAxKTthKDEwNSk7YSgxMDgpO2EoMTE1KTthKDEzOSk7dmFyIHI9YSgxNDQpLG49YSgxNTApLGk9YSgyMTkpO2NsYXNzIEFSQ0ZvdXJDaXBoZXJ7Y29uc3RydWN0b3IoZSl7dGhpcy5hPTA7dGhpcy5iPTA7Y29uc3QgdD1uZXcgVWludDhBcnJheSgyNTYpLGE9ZS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTwyNTY7KytlKXRbZV09ZTtmb3IobGV0IHI9MCxuPTA7cjwyNTY7KytyKXtjb25zdCBpPXRbcl07bj1uK2krZVtyJWFdJjI1NTt0W3JdPXRbbl07dFtuXT1pfXRoaXMucz10fWVuY3J5cHRCbG9jayhlKXtsZXQgdD10aGlzLmEsYT10aGlzLmI7Y29uc3Qgcj10aGlzLnMsbj1lLmxlbmd0aCxpPW5ldyBVaW50OEFycmF5KG4pO2ZvcihsZXQgcz0wO3M8bjsrK3Mpe3Q9dCsxJjI1NTtjb25zdCBuPXJbdF07YT1hK24mMjU1O2NvbnN0IG89clthXTtyW3RdPW87clthXT1uO2lbc109ZVtzXV5yW24rbyYyNTVdfXRoaXMuYT10O3RoaXMuYj1hO3JldHVybiBpfWRlY3J5cHRCbG9jayhlKXtyZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZSl9ZW5jcnlwdChlKXtyZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZSl9fXQuQVJDRm91ckNpcGhlcj1BUkNGb3VyQ2lwaGVyO2NvbnN0IHM9ZnVuY3Rpb24gY2FsY3VsYXRlTUQ1Q2xvc3VyZSgpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoWzcsMTIsMTcsMjIsNywxMiwxNywyMiw3LDEyLDE3LDIyLDcsMTIsMTcsMjIsNSw5LDE0LDIwLDUsOSwxNCwyMCw1LDksMTQsMjAsNSw5LDE0LDIwLDQsMTEsMTYsMjMsNCwxMSwxNiwyMyw0LDExLDE2LDIzLDQsMTEsMTYsMjMsNiwxMCwxNSwyMSw2LDEwLDE1LDIxLDYsMTAsMTUsMjEsNiwxMCwxNSwyMV0pLHQ9bmV3IEludDMyQXJyYXkoWy02ODA4NzY5MzYsLTM4OTU2NDU4Niw2MDYxMDU4MTksLTEwNDQ1MjUzMzAsLTE3NjQxODg5NywxMjAwMDgwNDI2LC0xNDczMjMxMzQxLC00NTcwNTk4MywxNzcwMDM1NDE2LC0xOTU4NDE0NDE3LC00MjA2MywtMTk5MDQwNDE2MiwxODA0NjAzNjgyLC00MDM0MTEwMSwtMTUwMjAwMjI5MCwxMjM2NTM1MzI5LC0xNjU3OTY1MTAsLTEwNjk1MDE2MzIsNjQzNzE3NzEzLC0zNzM4OTczMDIsLTcwMTU1ODY5MSwzODAxNjA4MywtNjYwNDc4MzM1LC00MDU1Mzc4NDgsNTY4NDQ2NDM4LC0xMDE5ODAzNjkwLC0xODczNjM5NjEsMTE2MzUzMTUwMSwtMTQ0NDY4MTQ2NywtNTE0MDM3ODQsMTczNTMyODQ3MywtMTkyNjYwNzczNCwtMzc4NTU4LC0yMDIyNTc0NDYzLDE4MzkwMzA1NjIsLTM1MzA5NTU2LC0xNTMwOTkyMDYwLDEyNzI4OTMzNTMsLTE1NTQ5NzYzMiwtMTA5NDczMDY0MCw2ODEyNzkxNzQsLTM1ODUzNzIyMiwtNzIyNTIxOTc5LDc2MDI5MTg5LC02NDAzNjQ0ODcsLTQyMTgxNTgzNSw1MzA3NDI1MjAsLTk5NTMzODY1MSwtMTk4NjMwODQ0LDExMjY4OTE0MTUsLTE0MTYzNTQ5MDUsLTU3NDM0MDU1LDE3MDA0ODU1NzEsLTE4OTQ5ODY2MDYsLTEwNTE1MjMsLTIwNTQ5MjI3OTksMTg3MzMxMzM1OSwtMzA2MTE3NDQsLTE1NjAxOTgzODAsMTMwOTE1MTY0OSwtMTQ1NTIzMDcwLC0xMTIwMjEwMzc5LDcxODc4NzI1OSwtMzQzNDg1NTUxXSk7cmV0dXJuIGZ1bmN0aW9uIGhhc2goYSxyLG4pe2xldCBpPTE3MzI1ODQxOTMscz0tMjcxNzMzODc5LG89LTE3MzI1ODQxOTQsYz0yNzE3MzM4Nzg7Y29uc3QgbD1uKzcyJi02NCxoPW5ldyBVaW50OEFycmF5KGwpO2xldCB1LGQ7Zm9yKHU9MDt1PG47Kyt1KWhbdV09YVtyKytdO2hbdSsrXT0xMjg7Y29uc3QgZj1sLTg7Zm9yKDt1PGY7KWhbdSsrXT0wO2hbdSsrXT1uPDwzJjI1NTtoW3UrK109bj4+NSYyNTU7aFt1KytdPW4+PjEzJjI1NTtoW3UrK109bj4+MjEmMjU1O2hbdSsrXT1uPj4+MjkmMjU1O2hbdSsrXT0wO2hbdSsrXT0wO2hbdSsrXT0wO2NvbnN0IGc9bmV3IEludDMyQXJyYXkoMTYpO2Zvcih1PTA7dTxsOyl7Zm9yKGQ9MDtkPDE2OysrZCx1Kz00KWdbZF09aFt1XXxoW3UrMV08PDh8aFt1KzJdPDwxNnxoW3UrM108PDI0O2xldCBhLHIsbj1pLGw9cyxmPW8scD1jO2ZvcihkPTA7ZDw2NDsrK2Qpe2lmKGQ8MTYpe2E9bCZmfH5sJnA7cj1kfWVsc2UgaWYoZDwzMil7YT1wJmx8fnAmZjtyPTUqZCsxJjE1fWVsc2UgaWYoZDw0OCl7YT1sXmZecDtyPTMqZCs1JjE1fWVsc2V7YT1mXihsfH5wKTtyPTcqZCYxNX1jb25zdCBpPXAscz1uK2ErdFtkXStnW3JdfDAsbz1lW2RdO3A9ZjtmPWw7bD1sKyhzPDxvfHM+Pj4zMi1vKXwwO249aX1pPWkrbnwwO3M9cytsfDA7bz1vK2Z8MDtjPWMrcHwwfXJldHVybiBuZXcgVWludDhBcnJheShbMjU1JmksaT4+OCYyNTUsaT4+MTYmMjU1LGk+Pj4yNCYyNTUsMjU1JnMscz4+OCYyNTUscz4+MTYmMjU1LHM+Pj4yNCYyNTUsMjU1Jm8sbz4+OCYyNTUsbz4+MTYmMjU1LG8+Pj4yNCYyNTUsMjU1JmMsYz4+OCYyNTUsYz4+MTYmMjU1LGM+Pj4yNCYyNTVdKX19KCk7dC5jYWxjdWxhdGVNRDU9cztjbGFzcyBXb3JkNjR7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmhpZ2g9MHxlO3RoaXMubG93PTB8dH1hbmQoZSl7dGhpcy5oaWdoJj1lLmhpZ2g7dGhpcy5sb3cmPWUubG93fXhvcihlKXt0aGlzLmhpZ2hePWUuaGlnaDt0aGlzLmxvd149ZS5sb3d9b3IoZSl7dGhpcy5oaWdofD1lLmhpZ2g7dGhpcy5sb3d8PWUubG93fXNoaWZ0UmlnaHQoZSl7aWYoZT49MzIpe3RoaXMubG93PXRoaXMuaGlnaD4+PmUtMzJ8MDt0aGlzLmhpZ2g9MH1lbHNle3RoaXMubG93PXRoaXMubG93Pj4+ZXx0aGlzLmhpZ2g8PDMyLWU7dGhpcy5oaWdoPXRoaXMuaGlnaD4+PmV8MH19c2hpZnRMZWZ0KGUpe2lmKGU+PTMyKXt0aGlzLmhpZ2g9dGhpcy5sb3c8PGUtMzI7dGhpcy5sb3c9MH1lbHNle3RoaXMuaGlnaD10aGlzLmhpZ2g8PGV8dGhpcy5sb3c+Pj4zMi1lO3RoaXMubG93PDw9ZX19cm90YXRlUmlnaHQoZSl7bGV0IHQsYTtpZigzMiZlKXthPXRoaXMubG93O3Q9dGhpcy5oaWdofWVsc2V7dD10aGlzLmxvdzthPXRoaXMuaGlnaH1lJj0zMTt0aGlzLmxvdz10Pj4+ZXxhPDwzMi1lO3RoaXMuaGlnaD1hPj4+ZXx0PDwzMi1lfW5vdCgpe3RoaXMuaGlnaD1+dGhpcy5oaWdoO3RoaXMubG93PX50aGlzLmxvd31hZGQoZSl7Y29uc3QgdD0odGhpcy5sb3c+Pj4wKSsoZS5sb3c+Pj4wKTtsZXQgYT0odGhpcy5oaWdoPj4+MCkrKGUuaGlnaD4+PjApO3Q+NDI5NDk2NzI5NSYmKGErPTEpO3RoaXMubG93PTB8dDt0aGlzLmhpZ2g9MHxhfWNvcHlUbyhlLHQpe2VbdF09dGhpcy5oaWdoPj4+MjQmMjU1O2VbdCsxXT10aGlzLmhpZ2g+PjE2JjI1NTtlW3QrMl09dGhpcy5oaWdoPj44JjI1NTtlW3QrM109MjU1JnRoaXMuaGlnaDtlW3QrNF09dGhpcy5sb3c+Pj4yNCYyNTU7ZVt0KzVdPXRoaXMubG93Pj4xNiYyNTU7ZVt0KzZdPXRoaXMubG93Pj44JjI1NTtlW3QrN109MjU1JnRoaXMubG93fWFzc2lnbihlKXt0aGlzLmhpZ2g9ZS5oaWdoO3RoaXMubG93PWUubG93fX1jb25zdCBvPWZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTI1NkNsb3N1cmUoKXtmdW5jdGlvbiByb3RyKGUsdCl7cmV0dXJuIGU+Pj50fGU8PDMyLXR9ZnVuY3Rpb24gY2goZSx0LGEpe3JldHVybiBlJnRefmUmYX1mdW5jdGlvbiBtYWooZSx0LGEpe3JldHVybiBlJnReZSZhXnQmYX1mdW5jdGlvbiBzaWdtYShlKXtyZXR1cm4gcm90cihlLDIpXnJvdHIoZSwxMylecm90cihlLDIyKX1mdW5jdGlvbiBzaWdtYVByaW1lKGUpe3JldHVybiByb3RyKGUsNilecm90cihlLDExKV5yb3RyKGUsMjUpfWZ1bmN0aW9uIGxpdHRsZVNpZ21hKGUpe3JldHVybiByb3RyKGUsNylecm90cihlLDE4KV5lPj4+M31jb25zdCBlPVsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdO3JldHVybiBmdW5jdGlvbiBoYXNoKHQsYSxyKXtsZXQgbj0xNzc5MDMzNzAzLGk9MzE0NDEzNDI3NyxzPTEwMTM5MDQyNDIsbz0yNzczNDgwNzYyLGM9MTM1OTg5MzExOSxsPTI2MDA4MjI5MjQsaD01Mjg3MzQ2MzUsdT0xNTQxNDU5MjI1O2NvbnN0IGQ9NjQqTWF0aC5jZWlsKChyKzkpLzY0KSxmPW5ldyBVaW50OEFycmF5KGQpO2xldCBnLHA7Zm9yKGc9MDtnPHI7KytnKWZbZ109dFthKytdO2ZbZysrXT0xMjg7Y29uc3QgbT1kLTg7Zm9yKDtnPG07KWZbZysrXT0wO2ZbZysrXT0wO2ZbZysrXT0wO2ZbZysrXT0wO2ZbZysrXT1yPj4+MjkmMjU1O2ZbZysrXT1yPj4yMSYyNTU7ZltnKytdPXI+PjEzJjI1NTtmW2crK109cj4+NSYyNTU7ZltnKytdPXI8PDMmMjU1O2NvbnN0IGI9bmV3IFVpbnQzMkFycmF5KDY0KTtmb3IoZz0wO2c8ZDspe2ZvcihwPTA7cDwxNjsrK3Ape2JbcF09ZltnXTw8MjR8ZltnKzFdPDwxNnxmW2crMl08PDh8ZltnKzNdO2crPTR9Zm9yKHA9MTY7cDw2NDsrK3ApYltwXT0ocm90cih5PWJbcC0yXSwxNylecm90cih5LDE5KV55Pj4+MTApK2JbcC03XStsaXR0bGVTaWdtYShiW3AtMTVdKStiW3AtMTZdfDA7bGV0IHQsYSxyPW4sZD1pLG09cyx3PW8sUz1jLHg9bCxDPWgsdj11O2ZvcihwPTA7cDw2NDsrK3Ape3Q9ditzaWdtYVByaW1lKFMpK2NoKFMseCxDKStlW3BdK2JbcF07YT1zaWdtYShyKSttYWoocixkLG0pO3Y9QztDPXg7eD1TO1M9dyt0fDA7dz1tO209ZDtkPXI7cj10K2F8MH1uPW4rcnwwO2k9aStkfDA7cz1zK218MDtvPW8rd3wwO2M9YytTfDA7bD1sK3h8MDtoPWgrQ3wwO3U9dSt2fDB9dmFyIHk7cmV0dXJuIG5ldyBVaW50OEFycmF5KFtuPj4yNCYyNTUsbj4+MTYmMjU1LG4+PjgmMjU1LDI1NSZuLGk+PjI0JjI1NSxpPj4xNiYyNTUsaT4+OCYyNTUsMjU1Jmkscz4+MjQmMjU1LHM+PjE2JjI1NSxzPj44JjI1NSwyNTUmcyxvPj4yNCYyNTUsbz4+MTYmMjU1LG8+PjgmMjU1LDI1NSZvLGM+PjI0JjI1NSxjPj4xNiYyNTUsYz4+OCYyNTUsMjU1JmMsbD4+MjQmMjU1LGw+PjE2JjI1NSxsPj44JjI1NSwyNTUmbCxoPj4yNCYyNTUsaD4+MTYmMjU1LGg+PjgmMjU1LDI1NSZoLHU+PjI0JjI1NSx1Pj4xNiYyNTUsdT4+OCYyNTUsMjU1JnVdKX19KCk7dC5jYWxjdWxhdGVTSEEyNTY9bztjb25zdCBjPWZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTUxMkNsb3N1cmUoKXtmdW5jdGlvbiBjaChlLHQsYSxyLG4pe2UuYXNzaWduKHQpO2UuYW5kKGEpO24uYXNzaWduKHQpO24ubm90KCk7bi5hbmQocik7ZS54b3Iobil9ZnVuY3Rpb24gbWFqKGUsdCxhLHIsbil7ZS5hc3NpZ24odCk7ZS5hbmQoYSk7bi5hc3NpZ24odCk7bi5hbmQocik7ZS54b3Iobik7bi5hc3NpZ24oYSk7bi5hbmQocik7ZS54b3Iobil9ZnVuY3Rpb24gc2lnbWEoZSx0LGEpe2UuYXNzaWduKHQpO2Uucm90YXRlUmlnaHQoMjgpO2EuYXNzaWduKHQpO2Eucm90YXRlUmlnaHQoMzQpO2UueG9yKGEpO2EuYXNzaWduKHQpO2Eucm90YXRlUmlnaHQoMzkpO2UueG9yKGEpfWZ1bmN0aW9uIHNpZ21hUHJpbWUoZSx0LGEpe2UuYXNzaWduKHQpO2Uucm90YXRlUmlnaHQoMTQpO2EuYXNzaWduKHQpO2Eucm90YXRlUmlnaHQoMTgpO2UueG9yKGEpO2EuYXNzaWduKHQpO2Eucm90YXRlUmlnaHQoNDEpO2UueG9yKGEpfWZ1bmN0aW9uIGxpdHRsZVNpZ21hKGUsdCxhKXtlLmFzc2lnbih0KTtlLnJvdGF0ZVJpZ2h0KDEpO2EuYXNzaWduKHQpO2Eucm90YXRlUmlnaHQoOCk7ZS54b3IoYSk7YS5hc3NpZ24odCk7YS5zaGlmdFJpZ2h0KDcpO2UueG9yKGEpfWZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUoZSx0LGEpe2UuYXNzaWduKHQpO2Uucm90YXRlUmlnaHQoMTkpO2EuYXNzaWduKHQpO2Eucm90YXRlUmlnaHQoNjEpO2UueG9yKGEpO2EuYXNzaWduKHQpO2Euc2hpZnRSaWdodCg2KTtlLnhvcihhKX1jb25zdCBlPVtuZXcgV29yZDY0KDExMTYzNTI0MDgsMzYwOTc2NzQ1OCksbmV3IFdvcmQ2NCgxODk5NDQ3NDQxLDYwMjg5MTcyNSksbmV3IFdvcmQ2NCgzMDQ5MzIzNDcxLDM5NjQ0ODQzOTkpLG5ldyBXb3JkNjQoMzkyMTAwOTU3MywyMTczMjk1NTQ4KSxuZXcgV29yZDY0KDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxuZXcgV29yZDY0KDE1MDg5NzA5OTMsMzA1MzgzNDI2NSksbmV3IFdvcmQ2NCgyNDUzNjM1NzQ4LDI5Mzc2NzE1NzkpLG5ldyBXb3JkNjQoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxuZXcgV29yZDY0KDM2MjQzODEwODAsMjczNDg4MzM5NCksbmV3IFdvcmQ2NCgzMTA1OTg0MDEsMTE2NDk5NjU0MiksbmV3IFdvcmQ2NCg2MDcyMjUyNzgsMTMyMzYxMDc2NCksbmV3IFdvcmQ2NCgxNDI2ODgxOTg3LDM1OTAzMDQ5OTQpLG5ldyBXb3JkNjQoMTkyNTA3ODM4OCw0MDY4MTgyMzgzKSxuZXcgV29yZDY0KDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxuZXcgV29yZDY0KDI2MTQ4ODgxMDMsNjMzODAzMzE3KSxuZXcgV29yZDY0KDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCksbmV3IFdvcmQ2NCgzODM1MzkwNDAxLDI2NjY2MTM0NTgpLG5ldyBXb3JkNjQoNDAyMjIyNDc3NCw5NDQ3MTExMzkpLG5ldyBXb3JkNjQoMjY0MzQ3MDc4LDIzNDEyNjI3NzMpLG5ldyBXb3JkNjQoNjA0ODA3NjI4LDIwMDc4MDA5MzMpLG5ldyBXb3JkNjQoNzcwMjU1OTgzLDE0OTU5OTA5MDEpLG5ldyBXb3JkNjQoMTI0OTE1MDEyMiwxODU2NDMxMjM1KSxuZXcgV29yZDY0KDE1NTUwODE2OTIsMzE3NTIxODEzMiksbmV3IFdvcmQ2NCgxOTk2MDY0OTg2LDIxOTg5NTA4MzcpLG5ldyBXb3JkNjQoMjU1NDIyMDg4MiwzOTk5NzE5MzM5KSxuZXcgV29yZDY0KDI4MjE4MzQzNDksNzY2Nzg0MDE2KSxuZXcgV29yZDY0KDI5NTI5OTY4MDgsMjU2NjU5NDg3OSksbmV3IFdvcmQ2NCgzMjEwMzEzNjcxLDMyMDMzMzc5NTYpLG5ldyBXb3JkNjQoMzMzNjU3MTg5MSwxMDM0NDU3MDI2KSxuZXcgV29yZDY0KDM1ODQ1Mjg3MTEsMjQ2Njk0ODkwMSksbmV3IFdvcmQ2NCgxMTM5MjY5OTMsMzc1ODMyNjM4MyksbmV3IFdvcmQ2NCgzMzgyNDE4OTUsMTY4NzE3OTM2KSxuZXcgV29yZDY0KDY2NjMwNzIwNSwxMTg4MTc5OTY0KSxuZXcgV29yZDY0KDc3MzUyOTkxMiwxNTQ2MDQ1NzM0KSxuZXcgV29yZDY0KDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSksbmV3IFdvcmQ2NCgxMzk2MTgyMjkxLDI2NDM4MzM4MjMpLG5ldyBXb3JkNjQoMTY5NTE4MzcwMCwyMzQzNTI3MzkwKSxuZXcgV29yZDY0KDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCksbmV3IFdvcmQ2NCgyMTc3MDI2MzUwLDEyMDY3NTkxNDIpLG5ldyBXb3JkNjQoMjQ1Njk1NjAzNywzNDQwNzc2MjcpLG5ldyBXb3JkNjQoMjczMDQ4NTkyMSwxMjkwODYzNDYwKSxuZXcgV29yZDY0KDI4MjAzMDI0MTEsMzE1ODQ1NDI3MyksbmV3IFdvcmQ2NCgzMjU5NzMwODAwLDM1MDU5NTI2NTcpLG5ldyBXb3JkNjQoMzM0NTc2NDc3MSwxMDYyMTcwMDgpLG5ldyBXb3JkNjQoMzUxNjA2NTgxNywzNjA2MDA4MzQ0KSxuZXcgV29yZDY0KDM2MDAzNTI4MDQsMTQzMjcyNTc3NiksbmV3IFdvcmQ2NCg0MDk0NTcxOTA5LDE0NjcwMzE1OTQpLG5ldyBXb3JkNjQoMjc1NDIzMzQ0LDg1MTE2OTcyMCksbmV3IFdvcmQ2NCg0MzAyMjc3MzQsMzEwMDgyMzc1MiksbmV3IFdvcmQ2NCg1MDY5NDg2MTYsMTM2MzI1ODE5NSksbmV3IFdvcmQ2NCg2NTkwNjA1NTYsMzc1MDY4NTU5MyksbmV3IFdvcmQ2NCg4ODM5OTc4NzcsMzc4NTA1MDI4MCksbmV3IFdvcmQ2NCg5NTgxMzk1NzEsMzMxODMwNzQyNyksbmV3IFdvcmQ2NCgxMzIyODIyMjE4LDM4MTI3MjM0MDMpLG5ldyBXb3JkNjQoMTUzNzAwMjA2MywyMDAzMDM0OTk1KSxuZXcgV29yZDY0KDE3NDc4NzM3NzksMzYwMjAzNjg5OSksbmV3IFdvcmQ2NCgxOTU1NTYyMjIyLDE1NzU5OTAwMTIpLG5ldyBXb3JkNjQoMjAyNDEwNDgxNSwxMTI1NTkyOTI4KSxuZXcgV29yZDY0KDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksbmV3IFdvcmQ2NCgyMzYxODUyNDI0LDQ0Mjc3NjA0NCksbmV3IFdvcmQ2NCgyNDI4NDM2NDc0LDU5MzY5ODM0NCksbmV3IFdvcmQ2NCgyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLG5ldyBXb3JkNjQoMzIwNDAzMTQ3OSwyOTk5MzUxNTczKSxuZXcgV29yZDY0KDMzMjkzMjUyOTgsMzgxNTkyMDQyNyksbmV3IFdvcmQ2NCgzMzkxNTY5NjE0LDM5MjgzODM5MDApLG5ldyBXb3JkNjQoMzUxNTI2NzI3MSw1NjYyODA3MTEpLG5ldyBXb3JkNjQoMzk0MDE4NzYwNiwzNDU0MDY5NTM0KSxuZXcgV29yZDY0KDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksbmV3IFdvcmQ2NCgxMTY0MTg0NzQsMTkxNDEzODU1NCksbmV3IFdvcmQ2NCgxNzQyOTI0MjEsMjczMTA1NTI3MCksbmV3IFdvcmQ2NCgyODkzODAzNTYsMzIwMzk5MzAwNiksbmV3IFdvcmQ2NCg0NjAzOTMyNjksMzIwNjIwMzE1KSxuZXcgV29yZDY0KDY4NTQ3MTczMyw1ODc0OTY4MzYpLG5ldyBXb3JkNjQoODUyMTQyOTcxLDEwODY3OTI4NTEpLG5ldyBXb3JkNjQoMTAxNzAzNjI5OCwzNjU1NDMxMDApLG5ldyBXb3JkNjQoMTEyNjAwMDU4MCwyNjE4Mjk3Njc2KSxuZXcgV29yZDY0KDEyODgwMzM0NzAsMzQwOTg1NTE1OCksbmV3IFdvcmQ2NCgxNTAxNTA1OTQ4LDQyMzQ1MDk4NjYpLG5ldyBXb3JkNjQoMTYwNzE2NzkxNSw5ODcxNjc0NjgpLG5ldyBXb3JkNjQoMTgxNjQwMjMxNiwxMjQ2MTg5NTkxKV07cmV0dXJuIGZ1bmN0aW9uIGhhc2godCxhLHIpe2xldCBuLGkscyxvLGMsbCxoLHUsZD1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO2lmKGQpe249bmV3IFdvcmQ2NCgzNDE4MDcwMzY1LDMyMzgzNzEwMzIpO2k9bmV3IFdvcmQ2NCgxNjU0MjcwMjUwLDkxNDE1MDY2Myk7cz1uZXcgV29yZDY0KDI0Mzg1MjkzNzAsODEyNzAyOTk5KTtvPW5ldyBXb3JkNjQoMzU1NDYyMzYwLDQxNDQ5MTI2OTcpO2M9bmV3IFdvcmQ2NCgxNzMxNDA1NDE1LDQyOTA3NzU4NTcpO2w9bmV3IFdvcmQ2NCgyMzk0MTgwMjMxLDE3NTA2MDMwMjUpO2g9bmV3IFdvcmQ2NCgzNjc1MDA4NTI1LDE2OTQwNzY4MzkpO3U9bmV3IFdvcmQ2NCgxMjAzMDYyODEzLDMyMDQwNzU0MjgpfWVsc2V7bj1uZXcgV29yZDY0KDE3NzkwMzM3MDMsNDA4OTIzNTcyMCk7aT1uZXcgV29yZDY0KDMxNDQxMzQyNzcsMjIyNzg3MzU5NSk7cz1uZXcgV29yZDY0KDEwMTM5MDQyNDIsNDI3MTE3NTcyMyk7bz1uZXcgV29yZDY0KDI3NzM0ODA3NjIsMTU5NTc1MDEyOSk7Yz1uZXcgV29yZDY0KDEzNTk4OTMxMTksMjkxNzU2NTEzNyk7bD1uZXcgV29yZDY0KDI2MDA4MjI5MjQsNzI1NTExMTk5KTtoPW5ldyBXb3JkNjQoNTI4NzM0NjM1LDQyMTUzODk1NDcpO3U9bmV3IFdvcmQ2NCgxNTQxNDU5MjI1LDMyNzAzMzIwOSl9Y29uc3QgZj0xMjgqTWF0aC5jZWlsKChyKzE3KS8xMjgpLGc9bmV3IFVpbnQ4QXJyYXkoZik7bGV0IHAsbTtmb3IocD0wO3A8cjsrK3ApZ1twXT10W2ErK107Z1twKytdPTEyODtjb25zdCBiPWYtMTY7Zm9yKDtwPGI7KWdbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT0wO2dbcCsrXT1yPj4+MjkmMjU1O2dbcCsrXT1yPj4yMSYyNTU7Z1twKytdPXI+PjEzJjI1NTtnW3ArK109cj4+NSYyNTU7Z1twKytdPXI8PDMmMjU1O2NvbnN0IHk9bmV3IEFycmF5KDgwKTtmb3IocD0wO3A8ODA7cCsrKXlbcF09bmV3IFdvcmQ2NCgwLDApO2xldCB3PW5ldyBXb3JkNjQoMCwwKSxTPW5ldyBXb3JkNjQoMCwwKSx4PW5ldyBXb3JkNjQoMCwwKSxDPW5ldyBXb3JkNjQoMCwwKSx2PW5ldyBXb3JkNjQoMCwwKSxrPW5ldyBXb3JkNjQoMCwwKSxPPW5ldyBXb3JkNjQoMCwwKSxUPW5ldyBXb3JkNjQoMCwwKTtjb25zdCBNPW5ldyBXb3JkNjQoMCwwKSxFPW5ldyBXb3JkNjQoMCwwKSxEPW5ldyBXb3JkNjQoMCwwKSxOPW5ldyBXb3JkNjQoMCwwKTtsZXQgUixMO2ZvcihwPTA7cDxmOyl7Zm9yKG09MDttPDE2OysrbSl7eVttXS5oaWdoPWdbcF08PDI0fGdbcCsxXTw8MTZ8Z1twKzJdPDw4fGdbcCszXTt5W21dLmxvdz1nW3ArNF08PDI0fGdbcCs1XTw8MTZ8Z1twKzZdPDw4fGdbcCs3XTtwKz04fWZvcihtPTE2O208ODA7KyttKXtSPXlbbV07bGl0dGxlU2lnbWFQcmltZShSLHlbbS0yXSxOKTtSLmFkZCh5W20tN10pO2xpdHRsZVNpZ21hKEQseVttLTE1XSxOKTtSLmFkZChEKTtSLmFkZCh5W20tMTZdKX13LmFzc2lnbihuKTtTLmFzc2lnbihpKTt4LmFzc2lnbihzKTtDLmFzc2lnbihvKTt2LmFzc2lnbihjKTtrLmFzc2lnbihsKTtPLmFzc2lnbihoKTtULmFzc2lnbih1KTtmb3IobT0wO208ODA7KyttKXtNLmFzc2lnbihUKTtzaWdtYVByaW1lKEQsdixOKTtNLmFkZChEKTtjaChELHYsayxPLE4pO00uYWRkKEQpO00uYWRkKGVbbV0pO00uYWRkKHlbbV0pO3NpZ21hKEUsdyxOKTttYWooRCx3LFMseCxOKTtFLmFkZChEKTtSPVQ7VD1PO089aztrPXY7Qy5hZGQoTSk7dj1DO0M9eDt4PVM7Uz13O1IuYXNzaWduKE0pO1IuYWRkKEUpO3c9Un1uLmFkZCh3KTtpLmFkZChTKTtzLmFkZCh4KTtvLmFkZChDKTtjLmFkZCh2KTtsLmFkZChrKTtoLmFkZChPKTt1LmFkZChUKX1pZihkKXtMPW5ldyBVaW50OEFycmF5KDQ4KTtuLmNvcHlUbyhMLDApO2kuY29weVRvKEwsOCk7cy5jb3B5VG8oTCwxNik7by5jb3B5VG8oTCwyNCk7Yy5jb3B5VG8oTCwzMik7bC5jb3B5VG8oTCw0MCl9ZWxzZXtMPW5ldyBVaW50OEFycmF5KDY0KTtuLmNvcHlUbyhMLDApO2kuY29weVRvKEwsOCk7cy5jb3B5VG8oTCwxNik7by5jb3B5VG8oTCwyNCk7Yy5jb3B5VG8oTCwzMik7bC5jb3B5VG8oTCw0MCk7aC5jb3B5VG8oTCw0OCk7dS5jb3B5VG8oTCw1Nil9cmV0dXJuIEx9fSgpO3QuY2FsY3VsYXRlU0hBNTEyPWM7ZnVuY3Rpb24gY2FsY3VsYXRlU0hBMzg0KGUsdCxhKXtyZXR1cm4gYyhlLHQsYSwhMCl9Y2xhc3MgTnVsbENpcGhlcntkZWNyeXB0QmxvY2soZSl7cmV0dXJuIGV9ZW5jcnlwdChlKXtyZXR1cm4gZX19Y2xhc3MgQUVTQmFzZUNpcGhlcntjb25zdHJ1Y3Rvcigpe3RoaXMuY29uc3RydWN0b3I9PT1BRVNCYXNlQ2lwaGVyJiYoMCxyLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQUVTQmFzZUNpcGhlci4iKTt0aGlzLl9zPW5ldyBVaW50OEFycmF5KFs5OSwxMjQsMTE5LDEyMywyNDIsMTA3LDExMSwxOTcsNDgsMSwxMDMsNDMsMjU0LDIxNSwxNzEsMTE4LDIwMiwxMzAsMjAxLDEyNSwyNTAsODksNzEsMjQwLDE3MywyMTIsMTYyLDE3NSwxNTYsMTY0LDExNCwxOTIsMTgzLDI1MywxNDcsMzgsNTQsNjMsMjQ3LDIwNCw1MiwxNjUsMjI5LDI0MSwxMTMsMjE2LDQ5LDIxLDQsMTk5LDM1LDE5NSwyNCwxNTAsNSwxNTQsNywxOCwxMjgsMjI2LDIzNSwzOSwxNzgsMTE3LDksMTMxLDQ0LDI2LDI3LDExMCw5MCwxNjAsODIsNTksMjE0LDE3OSw0MSwyMjcsNDcsMTMyLDgzLDIwOSwwLDIzNywzMiwyNTIsMTc3LDkxLDEwNiwyMDMsMTkwLDU3LDc0LDc2LDg4LDIwNywyMDgsMjM5LDE3MCwyNTEsNjcsNzcsNTEsMTMzLDY5LDI0OSwyLDEyNyw4MCw2MCwxNTksMTY4LDgxLDE2Myw2NCwxNDMsMTQ2LDE1Nyw1NiwyNDUsMTg4LDE4MiwyMTgsMzMsMTYsMjU1LDI0MywyMTAsMjA1LDEyLDE5LDIzNiw5NSwxNTEsNjgsMjMsMTk2LDE2NywxMjYsNjEsMTAwLDkzLDI1LDExNSw5NiwxMjksNzksMjIwLDM0LDQyLDE0NCwxMzYsNzAsMjM4LDE4NCwyMCwyMjIsOTQsMTEsMjE5LDIyNCw1MCw1OCwxMCw3Myw2LDM2LDkyLDE5NCwyMTEsMTcyLDk4LDE0NSwxNDksMjI4LDEyMSwyMzEsMjAwLDU1LDEwOSwxNDEsMjEzLDc4LDE2OSwxMDgsODYsMjQ0LDIzNCwxMDEsMTIyLDE3NCw4LDE4NiwxMjAsMzcsNDYsMjgsMTY2LDE4MCwxOTgsMjMyLDIyMSwxMTYsMzEsNzUsMTg5LDEzOSwxMzgsMTEyLDYyLDE4MSwxMDIsNzIsMywyNDYsMTQsOTcsNTMsODcsMTg1LDEzNCwxOTMsMjksMTU4LDIyNSwyNDgsMTUyLDE3LDEwNSwyMTcsMTQyLDE0OCwxNTUsMzAsMTM1LDIzMywyMDYsODUsNDAsMjIzLDE0MCwxNjEsMTM3LDEzLDE5MSwyMzAsNjYsMTA0LDY1LDE1Myw0NSwxNSwxNzYsODQsMTg3LDIyXSk7dGhpcy5faW52X3M9bmV3IFVpbnQ4QXJyYXkoWzgyLDksMTA2LDIxMyw0OCw1NCwxNjUsNTYsMTkxLDY0LDE2MywxNTgsMTI5LDI0MywyMTUsMjUxLDEyNCwyMjcsNTcsMTMwLDE1NSw0NywyNTUsMTM1LDUyLDE0Miw2Nyw2OCwxOTYsMjIyLDIzMywyMDMsODQsMTIzLDE0OCw1MCwxNjYsMTk0LDM1LDYxLDIzOCw3NiwxNDksMTEsNjYsMjUwLDE5NSw3OCw4LDQ2LDE2MSwxMDIsNDAsMjE3LDM2LDE3OCwxMTgsOTEsMTYyLDczLDEwOSwxMzksMjA5LDM3LDExNCwyNDgsMjQ2LDEwMCwxMzQsMTA0LDE1MiwyMiwyMTIsMTY0LDkyLDIwNCw5MywxMDEsMTgyLDE0NiwxMDgsMTEyLDcyLDgwLDI1MywyMzcsMTg1LDIxOCw5NCwyMSw3MCw4NywxNjcsMTQxLDE1NywxMzIsMTQ0LDIxNiwxNzEsMCwxNDAsMTg4LDIxMSwxMCwyNDcsMjI4LDg4LDUsMTg0LDE3OSw2OSw2LDIwOCw0NCwzMCwxNDMsMjAyLDYzLDE1LDIsMTkzLDE3NSwxODksMywxLDE5LDEzOCwxMDcsNTgsMTQ1LDE3LDY1LDc5LDEwMywyMjAsMjM0LDE1MSwyNDIsMjA3LDIwNiwyNDAsMTgwLDIzMCwxMTUsMTUwLDE3MiwxMTYsMzQsMjMxLDE3Myw1MywxMzMsMjI2LDI0OSw1NSwyMzIsMjgsMTE3LDIyMywxMTAsNzEsMjQxLDI2LDExMywyOSw0MSwxOTcsMTM3LDExMSwxODMsOTgsMTQsMTcwLDI0LDE5MCwyNywyNTIsODYsNjIsNzUsMTk4LDIxMCwxMjEsMzIsMTU0LDIxOSwxOTIsMjU0LDEyMCwyMDUsOTAsMjQ0LDMxLDIyMSwxNjgsNTEsMTM2LDcsMTk5LDQ5LDE3NywxOCwxNiw4OSwzOSwxMjgsMjM2LDk1LDk2LDgxLDEyNywxNjksMjUsMTgxLDc0LDEzLDQ1LDIyOSwxMjIsMTU5LDE0NywyMDEsMTU2LDIzOSwxNjAsMjI0LDU5LDc3LDE3NCw0MiwyNDUsMTc2LDIwMCwyMzUsMTg3LDYwLDEzMSw4MywxNTMsOTcsMjMsNDMsNCwxMjYsMTg2LDExOSwyMTQsMzgsMjI1LDEwNSwyMCw5OSw4NSwzMywxMiwxMjVdKTt0aGlzLl9taXg9bmV3IFVpbnQzMkFycmF5KFswLDIzNTQ3NDE4Nyw0NzA5NDgzNzQsMzAzNzY1Mjc3LDk0MTg5Njc0OCw5MDg5MzM0MTUsNjA3NTMwNTU0LDcwODc4MDg0OSwxODgzNzkzNDk2LDIxMTgyMTQ5OTUsMTgxNzg2NjgzMCwxNjQ5NjM5MjM3LDEyMTUwNjExMDgsMTE4MTA0NTExOSwxNDE3NTYxNjk4LDE1MTc3Njc1MjksMzc2NzU4Njk5Miw0MDAzMDYxMTc5LDQyMzY0Mjk5OTAsNDA2OTI0Njg5MywzNjM1NzMzNjYwLDM2MDI3NzAzMjcsMzI5OTI3ODQ3NCwzNDAwNTI4NzY5LDI0MzAxMjIyMTYsMjY2NDU0MzcxNSwyMzYyMDkwMjM4LDIxOTM4NjI2NDUsMjgzNTEyMzM5NiwyODAxMTA3NDA3LDMwMzU1MzUwNTgsMzEzNTc0MDg4OSwzNjc4MTI0OTIzLDM1NzY4NzA1MTIsMzM0MTM5NDI4NSwzMzc0MzYxNzAyLDM4MTA0OTYzNDMsMzk3NzY3NTM1Niw0Mjc5MDgwMjU3LDQwNDM2MTAxODYsMjg3NjQ5NDYyNywyNzc2MjkyOTA0LDMwNzY2MzkwMjksMzExMDY1MDk0MiwyNDcyMDExNTM1LDI2NDAyNDMyMDQsMjQwMzcyODY2NSwyMTY5MzAzMDU4LDEwMDEwODk5OTUsODk5ODM1NTg0LDY2NjQ2NDczMyw2OTk0MzIxNTAsNTk3Mjc4NDcsMjI2OTA2ODYwLDUzMDQwMDc1MywyOTQ5MzA2ODIsMTI3MzE2ODc4NywxMTcyOTY3MDY0LDE0NzU0MTg1MDEsMTUwOTQzMDQxNCwxOTQyNDM1Nzc1LDIxMTA2Njc0NDQsMTg3NjI0MTgzMywxNjQxODE2MjI2LDI5MTAyMTk3NjYsMjc0MzAzNDEwOSwyOTc2MTUxNTIwLDMyMTE2MjMxNDcsMjUwNTIwMjEzOCwyNjA2NDUzOTY5LDIzMDI2OTAyNTIsMjI2OTcyODQ1NSwzNzExODI5NDIyLDM1NDM1OTkyNjksMzI0MDg5NDM5MiwzNDc1MzEzMzMxLDM4NDM2OTkwNzQsMzk0MzkwNjQ0MSw0MTc4MDYyMjI4LDQxNDQwNDc3NzUsMTMwNjk2NzM2NiwxMTM5NzgxNzA5LDEzNzQ5ODgxMTIsMTYxMDQ1OTczOSwxOTc1NjgzNDM0LDIwNzY5MzUyNjUsMTc3NTI3NjkyNCwxNzQyMzE1MTI3LDEwMzQ4Njc5OTgsODY2NjM3ODQ1LDU2NjAyMTg5Niw4MDA0NDA4MzUsOTI5ODc2OTgsMTkzMTk1MDY1LDQyOTQ1NjE2NCwzOTU0NDE3MTEsMTk4NDgxMjY4NSwyMDE3Nzc4NTY2LDE3ODQ2NjMxOTUsMTY4MzQwNzI0OCwxMzE1NTYyMTQ1LDEwODAwOTQ2MzQsMTM4Mzg1NjMxMSwxNTUxMDM3ODg0LDEwMTAzOTgyOSwxMzUwNTAyMDYsNDM3NzU3MTIzLDMzNzU1Mzg2NCwxMDQyMzg1NjU3LDgwNzk2MjYxMCw1NzM4MDQ3ODMsNzQyMDM5MDEyLDI1MzEwNjc0NTMsMjU2NDAzMzMzNCwyMzI4ODI4OTcxLDIyMjc1NzMwMjQsMjkzNTU2Njg2NSwyNzAwMDk5MzU0LDMwMDE3NTU2NTUsMzE2ODkzNzIyOCwzODY4NTUyODA1LDM5MDI1NjMxODIsNDIwMzE4MTE3MSw0MTAyOTc3OTEyLDM3MzYxNjQ5MzcsMzUwMTc0MTg5MCwzMjY1NDc4NzUxLDM0MzM3MTI5ODAsMTEwNjA0MTU5MSwxMzQwNDYzMTAwLDE1NzY5NzY2MDksMTQwODc0OTAzNCwyMDQzMjExNDgzLDIwMDkxOTU0NzIsMTcwODg0ODMzMywxODA5MDU0MTUwLDgzMjg3NzIzMSwxMDY4MzUxMzk2LDc2Njk0NTQ2NSw1OTk3NjIzNTQsMTU5NDE3OTg3LDEyNjQ1NDY2NCwzNjE5Mjk4NzcsNDYzMTgwMTkwLDI3MDkyNjA4NzEsMjk0MzY4MjM4MCwzMTc4MTA2OTYxLDMwMDk4NzkzODYsMjU3MjY5NzE5NSwyNTM4NjgxMTg0LDIyMzYyMjg3MzMsMjMzNjQzNDU1MCwzNTA5ODcxMTM1LDM3NDUzNDUzMDAsMzQ0MTg1MDM3NywzMjc0NjY3MjY2LDM5MTAxNjE5NzEsMzg3NzE5ODY0OCw0MTEwNTY4NDg1LDQyMTE4MTg3OTgsMjU5NzgwNjQ3NiwyNDk3NjA0NzQzLDIyNjEwODkxNzgsMjI5NTEwMTA3MywyNzMzODU2MTYwLDI5MDIwODc4NTEsMzIwMjQzNzA0NiwyOTY4MDExNDUzLDM5MzYyOTEyODQsMzgzNTAzNjg5NSw0MTM2NDQwNzcwLDQxNjk0MDgyMDEsMzUzNTQ4NjQ1NiwzNzAyNjY1NDU5LDM0NjcxOTIzMDIsMzIzMTcyMjIxMywyMDUxNTE4NzgwLDE5NTEzMTcwNDcsMTcxNjg5MDQxMCwxNzUwOTAyMzA1LDExMTM4MTgzODQsMTI4MjA1MDA3NSwxNTg0NTA0NTgyLDEzNTAwNzg5ODksMTY4ODEwODUyLDY3NTU2NDYzLDM3MTA0OTMzMCw0MDQwMTY3NjEsODQxNzM5NTkyLDEwMDg5MTg1OTUsNzc1NTUwODE0LDU0MDA4MDcyNSwzOTY5NTYyMzY5LDM4MDEzMzIyMzQsNDAzNTQ4OTA0Nyw0MjY5OTA3OTk2LDM1NjkyNTUyMTMsMzY2OTQ2MjU2NiwzMzY2NzU0NjE5LDMzMzI3NDAxNDQsMjYzMTA2NTQzMywyNDYzODc5NzYyLDIxNjAxMTcwNzEsMjM5NTU4ODY3NiwyNzY3NjQ1NTU3LDI4Njg4OTc0MDYsMzEwMjAxMTc0NywzMDY5MDQ5OTYwLDIwMjAwODQ5NywzMzc3ODM2MiwyNzAwNDA0ODcsNTA0NDU5NDM2LDg3NTQ1MTI5Myw5NzU2NTg2NDYsNjc1MDM5NjI3LDY0MTAyNTE1MiwyMDg0NzA0MjMzLDE5MTc1MTg1NjIsMTYxNTg2MTI0NywxODUxMzMyODUyLDExNDc1NTA2NjEsMTI0ODgwMjUxMCwxNDg0MDA1ODQzLDE0NTEwNDQwNTYsOTMzMzAxMzcwLDk2NzMxMTcyOSw3MzMxNTY5NzIsNjMyOTUzNzAzLDI2MDM4ODk1MCwyNTk2NTkxNywzMjg2NzE4MDgsNDk2OTA2MDU5LDEyMDY0Nzc4NTgsMTIzOTQ0Mzc1MywxNTQzMjA4NTAwLDE0NDE5NTI1NzUsMjE0NDE2MTgwNiwxOTA4Njk0Mjc3LDE2NzU1Nzc4ODAsMTg0Mjc1OTQ0MywzNjEwMzY5MjI2LDM2NDQzNzk1ODUsMzQwODExOTUxNiwzMzA3OTE2MjQ3LDQwMTExOTA1MDIsMzc3Njc2NzQ2OSw0MDc3Mzg0NDMyLDQyNDU2MTg2ODMsMjgwOTc3MTE1NCwyODQyNzM3MDQ5LDMxNDQzOTY0MjAsMzA0MzE0MDQ5NSwyNjczNzA1MTUwLDI0MzgyMzc2MjEsMjIwMzAzMjIzMiwyMzcwMjEzNzk1XSk7dGhpcy5fbWl4Q29sPW5ldyBVaW50OEFycmF5KDI1Nik7Zm9yKGxldCBlPTA7ZTwyNTY7ZSsrKXRoaXMuX21peENvbFtlXT1lPDEyOD9lPDwxOmU8PDFeMjc7dGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoMTYpO3RoaXMuYnVmZmVyUG9zaXRpb249MH1fZXhwYW5kS2V5KGUpeygwLHIudW5yZWFjaGFibGUpKCJDYW5ub3QgY2FsbCBgX2V4cGFuZEtleWAgb24gdGhlIGJhc2UgY2xhc3MiKX1fZGVjcnlwdChlLHQpe2xldCBhLHIsbjtjb25zdCBpPW5ldyBVaW50OEFycmF5KDE2KTtpLnNldChlKTtmb3IobGV0IGU9MCxhPXRoaXMuX2tleVNpemU7ZTwxNjsrK2UsKythKWlbZV1ePXRbYV07Zm9yKGxldCBlPXRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbi0xO2U+PTE7LS1lKXthPWlbMTNdO2lbMTNdPWlbOV07aVs5XT1pWzVdO2lbNV09aVsxXTtpWzFdPWE7YT1pWzE0XTtyPWlbMTBdO2lbMTRdPWlbNl07aVsxMF09aVsyXTtpWzZdPWE7aVsyXT1yO2E9aVsxNV07cj1pWzExXTtuPWlbN107aVsxNV09aVszXTtpWzExXT1hO2lbN109cjtpWzNdPW47Zm9yKGxldCBlPTA7ZTwxNjsrK2UpaVtlXT10aGlzLl9pbnZfc1tpW2VdXTtmb3IobGV0IGE9MCxyPTE2KmU7YTwxNjsrK2EsKytyKWlbYV1ePXRbcl07Zm9yKGxldCBlPTA7ZTwxNjtlKz00KXtjb25zdCB0PXRoaXMuX21peFtpW2VdXSxyPXRoaXMuX21peFtpW2UrMV1dLG49dGhpcy5fbWl4W2lbZSsyXV0scz10aGlzLl9taXhbaVtlKzNdXTthPXRecj4+Pjhecjw8MjRebj4+PjE2Xm48PDE2XnM+Pj4yNF5zPDw4O2lbZV09YT4+PjI0JjI1NTtpW2UrMV09YT4+MTYmMjU1O2lbZSsyXT1hPj44JjI1NTtpW2UrM109MjU1JmF9fWE9aVsxM107aVsxM109aVs5XTtpWzldPWlbNV07aVs1XT1pWzFdO2lbMV09YTthPWlbMTRdO3I9aVsxMF07aVsxNF09aVs2XTtpWzEwXT1pWzJdO2lbNl09YTtpWzJdPXI7YT1pWzE1XTtyPWlbMTFdO249aVs3XTtpWzE1XT1pWzNdO2lbMTFdPWE7aVs3XT1yO2lbM109bjtmb3IobGV0IGU9MDtlPDE2OysrZSl7aVtlXT10aGlzLl9pbnZfc1tpW2VdXTtpW2VdXj10W2VdfXJldHVybiBpfV9lbmNyeXB0KGUsdCl7Y29uc3QgYT10aGlzLl9zO2xldCByLG4saTtjb25zdCBzPW5ldyBVaW50OEFycmF5KDE2KTtzLnNldChlKTtmb3IobGV0IGU9MDtlPDE2OysrZSlzW2VdXj10W2VdO2ZvcihsZXQgZT0xO2U8dGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uO2UrKyl7Zm9yKGxldCBlPTA7ZTwxNjsrK2Upc1tlXT1hW3NbZV1dO2k9c1sxXTtzWzFdPXNbNV07c1s1XT1zWzldO3NbOV09c1sxM107c1sxM109aTtpPXNbMl07bj1zWzZdO3NbMl09c1sxMF07c1s2XT1zWzE0XTtzWzEwXT1pO3NbMTRdPW47aT1zWzNdO249c1s3XTtyPXNbMTFdO3NbM109c1sxNV07c1s3XT1pO3NbMTFdPW47c1sxNV09cjtmb3IobGV0IGU9MDtlPDE2O2UrPTQpe2NvbnN0IHQ9c1tlKzBdLGE9c1tlKzFdLG49c1tlKzJdLGk9c1tlKzNdO3I9dF5hXm5eaTtzW2UrMF1ePXJedGhpcy5fbWl4Q29sW3ReYV07c1tlKzFdXj1yXnRoaXMuX21peENvbFthXm5dO3NbZSsyXV49cl50aGlzLl9taXhDb2xbbl5pXTtzW2UrM11ePXJedGhpcy5fbWl4Q29sW2ledF19Zm9yKGxldCBhPTAscj0xNiplO2E8MTY7KythLCsrcilzW2FdXj10W3JdfWZvcihsZXQgZT0wO2U8MTY7KytlKXNbZV09YVtzW2VdXTtpPXNbMV07c1sxXT1zWzVdO3NbNV09c1s5XTtzWzldPXNbMTNdO3NbMTNdPWk7aT1zWzJdO249c1s2XTtzWzJdPXNbMTBdO3NbNl09c1sxNF07c1sxMF09aTtzWzE0XT1uO2k9c1szXTtuPXNbN107cj1zWzExXTtzWzNdPXNbMTVdO3NbN109aTtzWzExXT1uO3NbMTVdPXI7Zm9yKGxldCBlPTAsYT10aGlzLl9rZXlTaXplO2U8MTY7KytlLCsrYSlzW2VdXj10W2FdO3JldHVybiBzfV9kZWNyeXB0QmxvY2syKGUsdCl7Y29uc3QgYT1lLmxlbmd0aDtsZXQgcj10aGlzLmJ1ZmZlcixuPXRoaXMuYnVmZmVyUG9zaXRpb247Y29uc3QgaT1bXTtsZXQgcz10aGlzLml2O2ZvcihsZXQgdD0wO3Q8YTsrK3Qpe3Jbbl09ZVt0XTsrK247aWYobjwxNiljb250aW51ZTtjb25zdCBhPXRoaXMuX2RlY3J5cHQocix0aGlzLl9rZXkpO2ZvcihsZXQgZT0wO2U8MTY7KytlKWFbZV1ePXNbZV07cz1yO2kucHVzaChhKTtyPW5ldyBVaW50OEFycmF5KDE2KTtuPTB9dGhpcy5idWZmZXI9cjt0aGlzLmJ1ZmZlckxlbmd0aD1uO3RoaXMuaXY9cztpZigwPT09aS5sZW5ndGgpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2xldCBvPTE2KmkubGVuZ3RoO2lmKHQpe2NvbnN0IGU9aS5hdCgtMSk7bGV0IHQ9ZVsxNV07aWYodDw9MTYpe2ZvcihsZXQgYT0xNSxyPTE2LXQ7YT49cjstLWEpaWYoZVthXSE9PXQpe3Q9MDticmVha31vLT10O2lbaS5sZW5ndGgtMV09ZS5zdWJhcnJheSgwLDE2LXQpfX1jb25zdCBjPW5ldyBVaW50OEFycmF5KG8pO2ZvcihsZXQgZT0wLHQ9MCxhPWkubGVuZ3RoO2U8YTsrK2UsdCs9MTYpYy5zZXQoaVtlXSx0KTtyZXR1cm4gY31kZWNyeXB0QmxvY2soZSx0KXtsZXQgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtjb25zdCByPWUubGVuZ3RoLG49dGhpcy5idWZmZXI7bGV0IGk9dGhpcy5idWZmZXJQb3NpdGlvbjtpZihhKXRoaXMuaXY9YTtlbHNle2ZvcihsZXQgdD0wO2k8MTYmJnQ8cjsrK3QsKytpKW5baV09ZVt0XTtpZihpPDE2KXt0aGlzLmJ1ZmZlckxlbmd0aD1pO3JldHVybiBuZXcgVWludDhBcnJheSgwKX10aGlzLml2PW47ZT1lLnN1YmFycmF5KDE2KX10aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxNik7dGhpcy5idWZmZXJMZW5ndGg9MDt0aGlzLmRlY3J5cHRCbG9jaz10aGlzLl9kZWNyeXB0QmxvY2syO3JldHVybiB0aGlzLmRlY3J5cHRCbG9jayhlLHQpfWVuY3J5cHQoZSx0KXtjb25zdCBhPWUubGVuZ3RoO2xldCByPXRoaXMuYnVmZmVyLG49dGhpcy5idWZmZXJQb3NpdGlvbjtjb25zdCBpPVtdO3R8fCh0PW5ldyBVaW50OEFycmF5KDE2KSk7Zm9yKGxldCBzPTA7czxhOysrcyl7cltuXT1lW3NdOysrbjtpZihuPDE2KWNvbnRpbnVlO2ZvcihsZXQgZT0wO2U8MTY7KytlKXJbZV1ePXRbZV07Y29uc3QgYT10aGlzLl9lbmNyeXB0KHIsdGhpcy5fa2V5KTt0PWE7aS5wdXNoKGEpO3I9bmV3IFVpbnQ4QXJyYXkoMTYpO249MH10aGlzLmJ1ZmZlcj1yO3RoaXMuYnVmZmVyTGVuZ3RoPW47dGhpcy5pdj10O2lmKDA9PT1pLmxlbmd0aClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7Y29uc3Qgcz0xNippLmxlbmd0aCxvPW5ldyBVaW50OEFycmF5KHMpO2ZvcihsZXQgZT0wLHQ9MCxhPWkubGVuZ3RoO2U8YTsrK2UsdCs9MTYpby5zZXQoaVtlXSx0KTtyZXR1cm4gb319Y2xhc3MgQUVTMTI4Q2lwaGVyIGV4dGVuZHMgQUVTQmFzZUNpcGhlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbj0xMDt0aGlzLl9rZXlTaXplPTE2MDt0aGlzLl9yY29uPW5ldyBVaW50OEFycmF5KFsxNDEsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTQsMTA4LDIxNiwxNzEsNzcsMTU0LDQ3LDk0LDE4OCw5OSwxOTgsMTUxLDUzLDEwNiwyMTIsMTc5LDEyNSwyNTAsMjM5LDE5NywxNDUsNTcsMTE0LDIyOCwyMTEsMTg5LDk3LDE5NCwxNTksMzcsNzQsMTQ4LDUxLDEwMiwyMDQsMTMxLDI5LDU4LDExNiwyMzIsMjAzLDE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0LDEwOCwyMTYsMTcxLDc3LDE1NCw0Nyw5NCwxODgsOTksMTk4LDE1MSw1MywxMDYsMjEyLDE3OSwxMjUsMjUwLDIzOSwxOTcsMTQ1LDU3LDExNCwyMjgsMjExLDE4OSw5NywxOTQsMTU5LDM3LDc0LDE0OCw1MSwxMDIsMjA0LDEzMSwyOSw1OCwxMTYsMjMyLDIwMywxNDEsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTQsMTA4LDIxNiwxNzEsNzcsMTU0LDQ3LDk0LDE4OCw5OSwxOTgsMTUxLDUzLDEwNiwyMTIsMTc5LDEyNSwyNTAsMjM5LDE5NywxNDUsNTcsMTE0LDIyOCwyMTEsMTg5LDk3LDE5NCwxNTksMzcsNzQsMTQ4LDUxLDEwMiwyMDQsMTMxLDI5LDU4LDExNiwyMzIsMjAzLDE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxXSk7dGhpcy5fa2V5PXRoaXMuX2V4cGFuZEtleShlKX1fZXhwYW5kS2V5KGUpe2NvbnN0IHQ9dGhpcy5fcyxhPXRoaXMuX3Jjb24scj1uZXcgVWludDhBcnJheSgxNzYpO3Iuc2V0KGUpO2ZvcihsZXQgZT0xNixuPTE7ZTwxNzY7KytuKXtsZXQgaT1yW2UtM10scz1yW2UtMl0sbz1yW2UtMV0sYz1yW2UtNF07aT10W2ldO3M9dFtzXTtvPXRbb107Yz10W2NdO2lePWFbbl07Zm9yKGxldCB0PTA7dDw0OysrdCl7cltlXT1pXj1yW2UtMTZdO2UrKztyW2VdPXNePXJbZS0xNl07ZSsrO3JbZV09b149cltlLTE2XTtlKys7cltlXT1jXj1yW2UtMTZdO2UrK319cmV0dXJuIHJ9fXQuQUVTMTI4Q2lwaGVyPUFFUzEyOENpcGhlcjtjbGFzcyBBRVMyNTZDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7dGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uPTE0O3RoaXMuX2tleVNpemU9MjI0O3RoaXMuX2tleT10aGlzLl9leHBhbmRLZXkoZSl9X2V4cGFuZEtleShlKXtjb25zdCB0PXRoaXMuX3MsYT1uZXcgVWludDhBcnJheSgyNDApO2Euc2V0KGUpO2xldCByLG4saSxzLG89MTtmb3IobGV0IGU9MzIsYz0xO2U8MjQwOysrYyl7aWYoZSUzMj09MTYpe3I9dFtyXTtuPXRbbl07aT10W2ldO3M9dFtzXX1lbHNlIGlmKGUlMzI9PTApe3I9YVtlLTNdO249YVtlLTJdO2k9YVtlLTFdO3M9YVtlLTRdO3I9dFtyXTtuPXRbbl07aT10W2ldO3M9dFtzXTtyXj1vOyhvPDw9MSk+PTI1NiYmKG89MjU1JigyN15vKSl9Zm9yKGxldCB0PTA7dDw0OysrdCl7YVtlXT1yXj1hW2UtMzJdO2UrKzthW2VdPW5ePWFbZS0zMl07ZSsrO2FbZV09aV49YVtlLTMyXTtlKys7YVtlXT1zXj1hW2UtMzJdO2UrK319cmV0dXJuIGF9fXQuQUVTMjU2Q2lwaGVyPUFFUzI1NkNpcGhlcjtjbGFzcyBQREYxN3tjaGVja093bmVyUGFzc3dvcmQoZSx0LGEsbil7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmxlbmd0aCs1Nik7aS5zZXQoZSwwKTtpLnNldCh0LGUubGVuZ3RoKTtpLnNldChhLGUubGVuZ3RoK3QubGVuZ3RoKTtjb25zdCBzPW8oaSwwLGkubGVuZ3RoKTtyZXR1cm4oMCxyLmlzQXJyYXlFcXVhbCkocyxuKX1jaGVja1VzZXJQYXNzd29yZChlLHQsYSl7Y29uc3Qgbj1uZXcgVWludDhBcnJheShlLmxlbmd0aCs4KTtuLnNldChlLDApO24uc2V0KHQsZS5sZW5ndGgpO2NvbnN0IGk9byhuLDAsbi5sZW5ndGgpO3JldHVybigwLHIuaXNBcnJheUVxdWFsKShpLGEpfWdldE93bmVyS2V5KGUsdCxhLHIpe2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrNTYpO24uc2V0KGUsMCk7bi5zZXQodCxlLmxlbmd0aCk7bi5zZXQoYSxlLmxlbmd0aCt0Lmxlbmd0aCk7Y29uc3QgaT1vKG4sMCxuLmxlbmd0aCk7cmV0dXJuIG5ldyBBRVMyNTZDaXBoZXIoaSkuZGVjcnlwdEJsb2NrKHIsITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX1nZXRVc2VyS2V5KGUsdCxhKXtjb25zdCByPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzgpO3Iuc2V0KGUsMCk7ci5zZXQodCxlLmxlbmd0aCk7Y29uc3Qgbj1vKHIsMCxyLmxlbmd0aCk7cmV0dXJuIG5ldyBBRVMyNTZDaXBoZXIobikuZGVjcnlwdEJsb2NrKGEsITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX19dC5QREYxNz1QREYxNztjbGFzcyBQREYyMHtfaGFzaChlLHQsYSl7bGV0IHI9byh0LDAsdC5sZW5ndGgpLnN1YmFycmF5KDAsMzIpLG49WzBdLGk9MDtmb3IoO2k8NjR8fG4uYXQoLTEpPmktMzI7KXtjb25zdCB0PWUubGVuZ3RoK3IubGVuZ3RoK2EubGVuZ3RoLHM9bmV3IFVpbnQ4QXJyYXkodCk7bGV0IGw9MDtzLnNldChlLGwpO2wrPWUubGVuZ3RoO3Muc2V0KHIsbCk7bCs9ci5sZW5ndGg7cy5zZXQoYSxsKTtjb25zdCBoPW5ldyBVaW50OEFycmF5KDY0KnQpO2ZvcihsZXQgZT0wLGE9MDtlPDY0O2UrKyxhKz10KWguc2V0KHMsYSk7bj1uZXcgQUVTMTI4Q2lwaGVyKHIuc3ViYXJyYXkoMCwxNikpLmVuY3J5cHQoaCxyLnN1YmFycmF5KDE2LDMyKSk7Y29uc3QgdT1uLnNsaWNlKDAsMTYpLnJlZHVjZSgoKGUsdCk9PmUrdCksMCklMzswPT09dT9yPW8obiwwLG4ubGVuZ3RoKToxPT09dT9yPWNhbGN1bGF0ZVNIQTM4NChuLDAsbi5sZW5ndGgpOjI9PT11JiYocj1jKG4sMCxuLmxlbmd0aCkpO2krK31yZXR1cm4gci5zdWJhcnJheSgwLDMyKX1jaGVja093bmVyUGFzc3dvcmQoZSx0LGEsbil7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmxlbmd0aCs1Nik7aS5zZXQoZSwwKTtpLnNldCh0LGUubGVuZ3RoKTtpLnNldChhLGUubGVuZ3RoK3QubGVuZ3RoKTtjb25zdCBzPXRoaXMuX2hhc2goZSxpLGEpO3JldHVybigwLHIuaXNBcnJheUVxdWFsKShzLG4pfWNoZWNrVXNlclBhc3N3b3JkKGUsdCxhKXtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzgpO24uc2V0KGUsMCk7bi5zZXQodCxlLmxlbmd0aCk7Y29uc3QgaT10aGlzLl9oYXNoKGUsbixbXSk7cmV0dXJuKDAsci5pc0FycmF5RXF1YWwpKGksYSl9Z2V0T3duZXJLZXkoZSx0LGEscil7Y29uc3Qgbj1uZXcgVWludDhBcnJheShlLmxlbmd0aCs1Nik7bi5zZXQoZSwwKTtuLnNldCh0LGUubGVuZ3RoKTtuLnNldChhLGUubGVuZ3RoK3QubGVuZ3RoKTtjb25zdCBpPXRoaXMuX2hhc2goZSxuLGEpO3JldHVybiBuZXcgQUVTMjU2Q2lwaGVyKGkpLmRlY3J5cHRCbG9jayhyLCExLG5ldyBVaW50OEFycmF5KDE2KSl9Z2V0VXNlcktleShlLHQsYSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmxlbmd0aCs4KTtyLnNldChlLDApO3Iuc2V0KHQsZS5sZW5ndGgpO2NvbnN0IG49dGhpcy5faGFzaChlLHIsW10pO3JldHVybiBuZXcgQUVTMjU2Q2lwaGVyKG4pLmRlY3J5cHRCbG9jayhhLCExLG5ldyBVaW50OEFycmF5KDE2KSl9fXQuUERGMjA9UERGMjA7Y2xhc3MgQ2lwaGVyVHJhbnNmb3Jte2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3Rvcj1lO3RoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I9dH1jcmVhdGVTdHJlYW0oZSx0KXtjb25zdCBhPW5ldyB0aGlzLlN0cmVhbUNpcGhlckNvbnN0cnVjdG9yO3JldHVybiBuZXcgaS5EZWNyeXB0U3RyZWFtKGUsdCwoZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRGVjcnlwdFN0cmVhbShlLHQpe3JldHVybiBhLmRlY3J5cHRCbG9jayhlLHQpfSkpfWRlY3J5cHRTdHJpbmcoZSl7Y29uc3QgdD1uZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcjtsZXQgYT0oMCxyLnN0cmluZ1RvQnl0ZXMpKGUpO2E9dC5kZWNyeXB0QmxvY2soYSwhMCk7cmV0dXJuKDAsci5ieXRlc1RvU3RyaW5nKShhKX1lbmNyeXB0U3RyaW5nKGUpe2NvbnN0IHQ9bmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3I7aWYodCBpbnN0YW5jZW9mIEFFU0Jhc2VDaXBoZXIpe2NvbnN0IGE9MTYtZS5sZW5ndGglMTY7ZSs9U3RyaW5nLmZyb21DaGFyQ29kZShhKS5yZXBlYXQoYSk7Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxNik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBjcnlwdG8pY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuKTtlbHNlIGZvcihsZXQgZT0wO2U8MTY7ZSsrKW5bZV09TWF0aC5mbG9vcigyNTYqTWF0aC5yYW5kb20oKSk7bGV0IGk9KDAsci5zdHJpbmdUb0J5dGVzKShlKTtpPXQuZW5jcnlwdChpLG4pO2NvbnN0IHM9bmV3IFVpbnQ4QXJyYXkoMTYraS5sZW5ndGgpO3Muc2V0KG4pO3Muc2V0KGksMTYpO3JldHVybigwLHIuYnl0ZXNUb1N0cmluZykocyl9bGV0IGE9KDAsci5zdHJpbmdUb0J5dGVzKShlKTthPXQuZW5jcnlwdChhKTtyZXR1cm4oMCxyLmJ5dGVzVG9TdHJpbmcpKGEpfX1jb25zdCBsPWZ1bmN0aW9uIENpcGhlclRyYW5zZm9ybUZhY3RvcnlDbG9zdXJlKCl7Y29uc3QgZT1uZXcgVWludDhBcnJheShbNDAsMTkxLDc4LDk0LDc4LDExNywxMzgsNjUsMTAwLDAsNzgsODYsMjU1LDI1MCwxLDgsNDYsNDYsMCwxODIsMjA4LDEwNCw2MiwxMjgsNDcsMTIsMTY5LDI1NCwxMDAsODMsMTA1LDEyMl0pO2Z1bmN0aW9uIHByZXBhcmVLZXlEYXRhKHQsYSxyLG4saSxvLGMsbCl7Y29uc3QgaD00MCtyLmxlbmd0aCt0Lmxlbmd0aCx1PW5ldyBVaW50OEFycmF5KGgpO2xldCBkLGYsZz0wO2lmKGEpe2Y9TWF0aC5taW4oMzIsYS5sZW5ndGgpO2Zvcig7ZzxmOysrZyl1W2ddPWFbZ119ZD0wO2Zvcig7ZzwzMjspdVtnKytdPWVbZCsrXTtmb3IoZD0wLGY9ci5sZW5ndGg7ZDxmOysrZCl1W2crK109cltkXTt1W2crK109MjU1Jmk7dVtnKytdPWk+PjgmMjU1O3VbZysrXT1pPj4xNiYyNTU7dVtnKytdPWk+Pj4yNCYyNTU7Zm9yKGQ9MCxmPXQubGVuZ3RoO2Q8ZjsrK2QpdVtnKytdPXRbZF07aWYobz49NCYmIWwpe3VbZysrXT0yNTU7dVtnKytdPTI1NTt1W2crK109MjU1O3VbZysrXT0yNTV9bGV0IHA9cyh1LDAsZyk7Y29uc3QgbT1jPj4zO2lmKG8+PTMpZm9yKGQ9MDtkPDUwOysrZClwPXMocCwwLG0pO2NvbnN0IGI9cC5zdWJhcnJheSgwLG0pO2xldCB5LHc7aWYobz49Myl7Zm9yKGc9MDtnPDMyOysrZyl1W2ddPWVbZ107Zm9yKGQ9MCxmPXQubGVuZ3RoO2Q8ZjsrK2QpdVtnKytdPXRbZF07eT1uZXcgQVJDRm91ckNpcGhlcihiKTt3PXkuZW5jcnlwdEJsb2NrKHModSwwLGcpKTtmPWIubGVuZ3RoO2NvbnN0IGE9bmV3IFVpbnQ4QXJyYXkoZik7Zm9yKGQ9MTtkPD0xOTsrK2Qpe2ZvcihsZXQgZT0wO2U8ZjsrK2UpYVtlXT1iW2VdXmQ7eT1uZXcgQVJDRm91ckNpcGhlcihhKTt3PXkuZW5jcnlwdEJsb2NrKHcpfWZvcihkPTAsZj13Lmxlbmd0aDtkPGY7KytkKWlmKG5bZF0hPT13W2RdKXJldHVybiBudWxsfWVsc2V7eT1uZXcgQVJDRm91ckNpcGhlcihiKTt3PXkuZW5jcnlwdEJsb2NrKGUpO2ZvcihkPTAsZj13Lmxlbmd0aDtkPGY7KytkKWlmKG5bZF0hPT13W2RdKXJldHVybiBudWxsfXJldHVybiBifWNvbnN0IHQ9bi5OYW1lLmdldCgiSWRlbnRpdHkiKTtmdW5jdGlvbiBidWlsZE9iamVjdEtleShlLHQsYSl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTtjb25zdCBuPW5ldyBVaW50OEFycmF5KGEubGVuZ3RoKzkpLGk9YS5sZW5ndGg7bGV0IG87Zm9yKG89MDtvPGk7KytvKW5bb109YVtvXTtuW28rK109MjU1JmU7bltvKytdPWU+PjgmMjU1O25bbysrXT1lPj4xNiYyNTU7bltvKytdPTI1NSZ0O25bbysrXT10Pj44JjI1NTtpZihyKXtuW28rK109MTE1O25bbysrXT02NTtuW28rK109MTA4O25bbysrXT04NH1yZXR1cm4gcyhuLDAsbykuc3ViYXJyYXkoMCxNYXRoLm1pbihhLmxlbmd0aCs1LDE2KSl9ZnVuY3Rpb24gYnVpbGRDaXBoZXJDb25zdHJ1Y3RvcihlLHQsYSxpLHMpe2lmKCEodCBpbnN0YW5jZW9mIG4uTmFtZSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkludmFsaWQgY3J5cHQgZmlsdGVyIG5hbWUuIik7Y29uc3Qgbz1lLmdldCh0Lm5hbWUpO2xldCBjO251bGwhPW8mJihjPW8uZ2V0KCJDRk0iKSk7aWYoIWN8fCJOb25lIj09PWMubmFtZSlyZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JOb25lKCl7cmV0dXJuIG5ldyBOdWxsQ2lwaGVyfTtpZigiVjIiPT09Yy5uYW1lKXJldHVybiBmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1GYWN0b3J5QnVpbGRDaXBoZXJDb25zdHJ1Y3RvclYyKCl7cmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGJ1aWxkT2JqZWN0S2V5KGEsaSxzLCExKSl9O2lmKCJBRVNWMiI9PT1jLm5hbWUpcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yQUVTVjIoKXtyZXR1cm4gbmV3IEFFUzEyOENpcGhlcihidWlsZE9iamVjdEtleShhLGkscywhMCkpfTtpZigiQUVTVjMiPT09Yy5uYW1lKXJldHVybiBmdW5jdGlvbiBjaXBoZXJUcmFuc2Zvcm1GYWN0b3J5QnVpbGRDaXBoZXJDb25zdHJ1Y3RvckFFU1YzKCl7cmV0dXJuIG5ldyBBRVMyNTZDaXBoZXIocyl9O3Rocm93IG5ldyByLkZvcm1hdEVycm9yKCJVbmtub3duIGNyeXB0byBtZXRob2QiKX1yZXR1cm4gY2xhc3MgQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeXtjb25zdHJ1Y3RvcihhLGksbyl7Y29uc3QgYz1hLmdldCgiRmlsdGVyIik7aWYoISgwLG4uaXNOYW1lKShjLCJTdGFuZGFyZCIpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJ1bmtub3duIGVuY3J5cHRpb24gbWV0aG9kIik7dGhpcy5maWx0ZXJOYW1lPWMubmFtZTt0aGlzLmRpY3Q9YTtjb25zdCBsPWEuZ2V0KCJWIik7aWYoIU51bWJlci5pc0ludGVnZXIobCl8fDEhPT1sJiYyIT09bCYmNCE9PWwmJjUhPT1sKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSIpO3RoaXMuYWxnb3JpdGhtPWw7bGV0IGg9YS5nZXQoIkxlbmd0aCIpO2lmKCFoKWlmKGw8PTMpaD00MDtlbHNle2NvbnN0IGU9YS5nZXQoIkNGIiksdD1hLmdldCgiU3RtRiIpO2lmKGUgaW5zdGFuY2VvZiBuLkRpY3QmJnQgaW5zdGFuY2VvZiBuLk5hbWUpe2Uuc3VwcHJlc3NFbmNyeXB0aW9uPSEwO2NvbnN0IGE9ZS5nZXQodC5uYW1lKTtoPWE/LmdldCgiTGVuZ3RoIil8fDEyODtoPDQwJiYoaDw8PTMpfX1pZighTnVtYmVyLmlzSW50ZWdlcihoKXx8aDw0MHx8aCU4IT0wKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJpbnZhbGlkIGtleSBsZW5ndGgiKTtjb25zdCB1PSgwLHIuc3RyaW5nVG9CeXRlcykoYS5nZXQoIk8iKSksZD0oMCxyLnN0cmluZ1RvQnl0ZXMpKGEuZ2V0KCJVIikpLGY9dS5zdWJhcnJheSgwLDMyKSxnPWQuc3ViYXJyYXkoMCwzMikscD1hLmdldCgiUCIpLG09YS5nZXQoIlIiKSxiPSg0PT09bHx8NT09PWwpJiYhMSE9PWEuZ2V0KCJFbmNyeXB0TWV0YWRhdGEiKTt0aGlzLmVuY3J5cHRNZXRhZGF0YT1iO2NvbnN0IHk9KDAsci5zdHJpbmdUb0J5dGVzKShpKTtsZXQgdyxTO2lmKG8pe2lmKDY9PT1tKXRyeXtvPSgwLHIudXRmOFN0cmluZ1RvU3RyaW5nKShvKX1jYXRjaHsoMCxyLndhcm4pKCJDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5OiBVbmFibGUgdG8gY29udmVydCBVVEY4IGVuY29kZWQgcGFzc3dvcmQuIil9dz0oMCxyLnN0cmluZ1RvQnl0ZXMpKG8pfWlmKDUhPT1sKVM9cHJlcGFyZUtleURhdGEoeSx3LGYsZyxwLG0saCxiKTtlbHNle2NvbnN0IGU9dS5zdWJhcnJheSgzMiw0MCksdD11LnN1YmFycmF5KDQwLDQ4KSxuPWQuc3ViYXJyYXkoMCw0OCksaT1kLnN1YmFycmF5KDMyLDQwKSxzPWQuc3ViYXJyYXkoNDAsNDgpLG89KDAsci5zdHJpbmdUb0J5dGVzKShhLmdldCgiT0UiKSksYz0oMCxyLnN0cmluZ1RvQnl0ZXMpKGEuZ2V0KCJVRSIpKTsoMCxyLnN0cmluZ1RvQnl0ZXMpKGEuZ2V0KCJQZXJtcyIpKTtTPWZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRpb25LZXkyMChlLHQsYSxyLG4saSxzLG8sYyxsLGgsdSl7aWYodCl7Y29uc3QgZT1NYXRoLm1pbigxMjcsdC5sZW5ndGgpO3Q9dC5zdWJhcnJheSgwLGUpfWVsc2UgdD1bXTtjb25zdCBkPTY9PT1lP25ldyBQREYyMDpuZXcgUERGMTc7cmV0dXJuIGQuY2hlY2tVc2VyUGFzc3dvcmQodCxvLHMpP2QuZ2V0VXNlcktleSh0LGMsaCk6dC5sZW5ndGgmJmQuY2hlY2tPd25lclBhc3N3b3JkKHQscixpLGEpP2QuZ2V0T3duZXJLZXkodCxuLGksbCk6bnVsbH0obSx3LGYsZSx0LG4sZyxpLHMsbyxjKX1pZighUyYmIW8pdGhyb3cgbmV3IHIuUGFzc3dvcmRFeGNlcHRpb24oIk5vIHBhc3N3b3JkIGdpdmVuIixyLlBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkQpO2lmKCFTJiZvKXtjb25zdCB0PWZ1bmN0aW9uIGRlY29kZVVzZXJQYXNzd29yZCh0LGEscixuKXtjb25zdCBpPW5ldyBVaW50OEFycmF5KDMyKTtsZXQgbz0wO2NvbnN0IGM9TWF0aC5taW4oMzIsdC5sZW5ndGgpO2Zvcig7bzxjOysrbylpW29dPXRbb107bGV0IGw9MDtmb3IoO288MzI7KWlbbysrXT1lW2wrK107bGV0IGg9cyhpLDAsbyk7Y29uc3QgdT1uPj4zO2lmKHI+PTMpZm9yKGw9MDtsPDUwOysrbCloPXMoaCwwLGgubGVuZ3RoKTtsZXQgZCxmO2lmKHI+PTMpe2Y9YTtjb25zdCBlPW5ldyBVaW50OEFycmF5KHUpO2ZvcihsPTE5O2w+PTA7bC0tKXtmb3IobGV0IHQ9MDt0PHU7Kyt0KWVbdF09aFt0XV5sO2Q9bmV3IEFSQ0ZvdXJDaXBoZXIoZSk7Zj1kLmVuY3J5cHRCbG9jayhmKX19ZWxzZXtkPW5ldyBBUkNGb3VyQ2lwaGVyKGguc3ViYXJyYXkoMCx1KSk7Zj1kLmVuY3J5cHRCbG9jayhhKX1yZXR1cm4gZn0odyxmLG0saCk7Uz1wcmVwYXJlS2V5RGF0YSh5LHQsZixnLHAsbSxoLGIpfWlmKCFTKXRocm93IG5ldyByLlBhc3N3b3JkRXhjZXB0aW9uKCJJbmNvcnJlY3QgUGFzc3dvcmQiLHIuUGFzc3dvcmRSZXNwb25zZXMuSU5DT1JSRUNUX1BBU1NXT1JEKTt0aGlzLmVuY3J5cHRpb25LZXk9UztpZihsPj00KXtjb25zdCBlPWEuZ2V0KCJDRiIpO2UgaW5zdGFuY2VvZiBuLkRpY3QmJihlLnN1cHByZXNzRW5jcnlwdGlvbj0hMCk7dGhpcy5jZj1lO3RoaXMuc3RtZj1hLmdldCgiU3RtRiIpfHx0O3RoaXMuc3RyZj1hLmdldCgiU3RyRiIpfHx0O3RoaXMuZWZmPWEuZ2V0KCJFRkYiKXx8dGhpcy5zdG1mfX1jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oZSx0KXtpZig0PT09dGhpcy5hbGdvcml0aG18fDU9PT10aGlzLmFsZ29yaXRobSlyZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybShidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsdGhpcy5zdHJmLGUsdCx0aGlzLmVuY3J5cHRpb25LZXkpLGJ1aWxkQ2lwaGVyQ29uc3RydWN0b3IodGhpcy5jZix0aGlzLnN0bWYsZSx0LHRoaXMuZW5jcnlwdGlvbktleSkpO2NvbnN0IGE9YnVpbGRPYmplY3RLZXkoZSx0LHRoaXMuZW5jcnlwdGlvbktleSwhMSkscj1mdW5jdGlvbiBidWlsZENpcGhlckNpcGhlckNvbnN0cnVjdG9yKCl7cmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGEpfTtyZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybShyLHIpfX19KCk7dC5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5PWx9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuRGVjcnlwdFN0cmVhbT12b2lkIDA7dmFyIHI9YSgxNjgpO2NsYXNzIERlY3J5cHRTdHJlYW0gZXh0ZW5kcyByLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIodCk7dGhpcy5zdHI9ZTt0aGlzLmRpY3Q9ZS5kaWN0O3RoaXMuZGVjcnlwdD1hO3RoaXMubmV4dENodW5rPW51bGw7dGhpcy5pbml0aWFsaXplZD0hMX1yZWFkQmxvY2soKXtsZXQgZTtpZih0aGlzLmluaXRpYWxpemVkKWU9dGhpcy5uZXh0Q2h1bms7ZWxzZXtlPXRoaXMuc3RyLmdldEJ5dGVzKDUxMik7dGhpcy5pbml0aWFsaXplZD0hMH1pZighZXx8MD09PWUubGVuZ3RoKXt0aGlzLmVvZj0hMDtyZXR1cm59dGhpcy5uZXh0Q2h1bms9dGhpcy5zdHIuZ2V0Qnl0ZXMoNTEyKTtjb25zdCB0PXRoaXMubmV4dENodW5rPy5sZW5ndGg+MDtlPSgwLHRoaXMuZGVjcnlwdCkoZSwhdCk7Y29uc3QgYT10aGlzLmJ1ZmZlckxlbmd0aCxyPWErZS5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXIocikuc2V0KGUsYSk7dGhpcy5idWZmZXJMZW5ndGg9cn19dC5EZWNyeXB0U3RyZWFtPURlY3J5cHRTdHJlYW19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQ2F0YWxvZz12b2lkIDA7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO2EoMTM5KTthKDIpO3ZhciByPWEoMTQ5KSxuPWEoMTQ0KSxpPWEoMTUwKSxzPWEoMjIxKSxvPWEoMTUxKSxjPWEoMjIyKSxsPWEoMTYyKSxoPWEoMjIzKSx1PWEoMjA5KSxkPWEoMjI0KSxmPWEoMjI1KTtmdW5jdGlvbiBmZXRjaERlc3RpbmF0aW9uKGUpe2UgaW5zdGFuY2VvZiBpLkRpY3QmJihlPWUuZ2V0KCJEIikpO3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6bnVsbH1jbGFzcyBDYXRhbG9ne2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5wZGZNYW5hZ2VyPWU7dGhpcy54cmVmPXQ7dGhpcy5fY2F0RGljdD10LmdldENhdGFsb2dPYmooKTtpZighKHRoaXMuX2NhdERpY3QgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJDYXRhbG9nIG9iamVjdCBpcyBub3QgYSBkaWN0aW9uYXJ5LiIpO3RoaXMudG9wbGV2ZWxQYWdlc0RpY3Q7dGhpcy5fYWN0dWFsTnVtUGFnZXM9bnVsbDt0aGlzLmZvbnRDYWNoZT1uZXcgaS5SZWZTZXRDYWNoZTt0aGlzLmJ1aWx0SW5DTWFwQ2FjaGU9bmV3IE1hcDt0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZT1uZXcgTWFwO3RoaXMuZ2xvYmFsSW1hZ2VDYWNoZT1uZXcgdS5HbG9iYWxJbWFnZUNhY2hlO3RoaXMucGFnZUtpZHNDb3VudENhY2hlPW5ldyBpLlJlZlNldENhY2hlO3RoaXMucGFnZUluZGV4Q2FjaGU9bmV3IGkuUmVmU2V0Q2FjaGU7dGhpcy5ub25CbGVuZE1vZGVzU2V0PW5ldyBpLlJlZlNldDt0aGlzLnN5c3RlbUZvbnRDYWNoZT1uZXcgTWFwfWdldCB2ZXJzaW9uKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiVmVyc2lvbiIpO2lmKGUgaW5zdGFuY2VvZiBpLk5hbWUpe2lmKHIuUERGX1ZFUlNJT05fUkVHRVhQLnRlc3QoZS5uYW1lKSlyZXR1cm4oMCxuLnNoYWRvdykodGhpcywidmVyc2lvbiIsZS5uYW1lKTsoMCxuLndhcm4pKGBJbnZhbGlkIFBERiBjYXRhbG9nIHZlcnNpb246ICR7ZS5uYW1lfWApfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJ2ZXJzaW9uIixudWxsKX1nZXQgbGFuZygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIkxhbmciKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywibGFuZyIsInN0cmluZyI9PXR5cGVvZiBlPygwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGUpOm51bGwpfWdldCBuZWVkc1JlbmRlcmluZygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk5lZWRzUmVuZGVyaW5nIik7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIm5lZWRzUmVuZGVyaW5nIiwiYm9vbGVhbiI9PXR5cGVvZiBlJiZlKX1nZXQgY29sbGVjdGlvbigpe2xldCBlPW51bGw7dHJ5e2NvbnN0IHQ9dGhpcy5fY2F0RGljdC5nZXQoIkNvbGxlY3Rpb24iKTt0IGluc3RhbmNlb2YgaS5EaWN0JiZ0LnNpemU+MCYmKGU9dCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHIuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLmluZm8pKCJDYW5ub3QgZmV0Y2ggQ29sbGVjdGlvbiBlbnRyeTsgYXNzdW1pbmcgbm8gY29sbGVjdGlvbiBpcyBwcmVzZW50LiIpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJjb2xsZWN0aW9uIixlKX1nZXQgYWNyb0Zvcm0oKXtsZXQgZT1udWxsO3RyeXtjb25zdCB0PXRoaXMuX2NhdERpY3QuZ2V0KCJBY3JvRm9ybSIpO3QgaW5zdGFuY2VvZiBpLkRpY3QmJnQuc2l6ZT4wJiYoZT10KX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygci5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLG4uaW5mbykoIkNhbm5vdCBmZXRjaCBBY3JvRm9ybSBlbnRyeTsgYXNzdW1pbmcgbm8gZm9ybXMgYXJlIHByZXNlbnQuIil9cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImFjcm9Gb3JtIixlKX1nZXQgYWNyb0Zvcm1SZWYoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0UmF3KCJBY3JvRm9ybSIpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJhY3JvRm9ybVJlZiIsZSBpbnN0YW5jZW9mIGkuUmVmP2U6bnVsbCl9Z2V0IG1ldGFkYXRhKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldFJhdygiTWV0YWRhdGEiKTtpZighKGUgaW5zdGFuY2VvZiBpLlJlZikpcmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIm1ldGFkYXRhIixudWxsKTtsZXQgdD1udWxsO3RyeXtjb25zdCBhPXRoaXMueHJlZi5mZXRjaChlLCF0aGlzLnhyZWYuZW5jcnlwdD8uZW5jcnlwdE1ldGFkYXRhKTtpZihhIGluc3RhbmNlb2Ygby5CYXNlU3RyZWFtJiZhLmRpY3QgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IGU9YS5kaWN0LmdldCgiVHlwZSIpLHI9YS5kaWN0LmdldCgiU3VidHlwZSIpO2lmKCgwLGkuaXNOYW1lKShlLCJNZXRhZGF0YSIpJiYoMCxpLmlzTmFtZSkociwiWE1MIikpe2NvbnN0IGU9KDAsbi5zdHJpbmdUb1VURjhTdHJpbmcpKGEuZ2V0U3RyaW5nKCkpO2UmJih0PW5ldyBkLk1ldGFkYXRhUGFyc2VyKGUpLnNlcmlhbGl6YWJsZSl9fX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygci5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLG4uaW5mbykoYFNraXBwaW5nIGludmFsaWQgTWV0YWRhdGE6ICIke2V9Ii5gKX1yZXR1cm4oMCxuLnNoYWRvdykodGhpcywibWV0YWRhdGEiLHQpfWdldCBtYXJrSW5mbygpe2xldCBlPW51bGw7dHJ5e2U9dGhpcy5fcmVhZE1hcmtJbmZvKCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHIuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLndhcm4pKCJVbmFibGUgdG8gcmVhZCBtYXJrIGluZm8uIil9cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIm1hcmtJbmZvIixlKX1fcmVhZE1hcmtJbmZvKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTWFya0luZm8iKTtpZighKGUgaW5zdGFuY2VvZiBpLkRpY3QpKXJldHVybiBudWxsO2NvbnN0IHQ9e01hcmtlZDohMSxVc2VyUHJvcGVydGllczohMSxTdXNwZWN0czohMX07Zm9yKGNvbnN0IGEgaW4gdCl7Y29uc3Qgcj1lLmdldChhKTsiYm9vbGVhbiI9PXR5cGVvZiByJiYodFthXT1yKX1yZXR1cm4gdH1nZXQgc3RydWN0VHJlZVJvb3QoKXtsZXQgZT1udWxsO3RyeXtlPXRoaXMuX3JlYWRTdHJ1Y3RUcmVlUm9vdCgpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiByLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsbi53YXJuKSgiVW5hYmxlIHJlYWQgdG8gc3RydWN0VHJlZVJvb3QgaW5mby4iKX1yZXR1cm4oMCxuLnNoYWRvdykodGhpcywic3RydWN0VHJlZVJvb3QiLGUpfV9yZWFkU3RydWN0VHJlZVJvb3QoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJTdHJ1Y3RUcmVlUm9vdCIpO2lmKCEoZSBpbnN0YW5jZW9mIGkuRGljdCkpcmV0dXJuIG51bGw7Y29uc3QgdD1uZXcgZi5TdHJ1Y3RUcmVlUm9vdChlKTt0LmluaXQoKTtyZXR1cm4gdH1nZXQgdG9wbGV2ZWxQYWdlc0RpY3QoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlcyIpO2lmKCEoZSBpbnN0YW5jZW9mIGkuRGljdCkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgdG9wLWxldmVsIHBhZ2VzIGRpY3Rpb25hcnkuIik7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsInRvcGxldmVsUGFnZXNEaWN0IixlKX1nZXQgZG9jdW1lbnRPdXRsaW5lKCl7bGV0IGU9bnVsbDt0cnl7ZT10aGlzLl9yZWFkRG9jdW1lbnRPdXRsaW5lKCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHIuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLndhcm4pKCJVbmFibGUgdG8gcmVhZCBkb2N1bWVudCBvdXRsaW5lLiIpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJkb2N1bWVudE91dGxpbmUiLGUpfV9yZWFkRG9jdW1lbnRPdXRsaW5lKCl7bGV0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk91dGxpbmVzIik7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4gbnVsbDtlPWUuZ2V0UmF3KCJGaXJzdCIpO2lmKCEoZSBpbnN0YW5jZW9mIGkuUmVmKSlyZXR1cm4gbnVsbDtjb25zdCB0PXtpdGVtczpbXX0sYT1be29iajplLHBhcmVudDp0fV0scj1uZXcgaS5SZWZTZXQ7ci5wdXQoZSk7Y29uc3Qgcz10aGlzLnhyZWYsbz1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7Zm9yKDthLmxlbmd0aD4wOyl7Y29uc3QgdD1hLnNoaWZ0KCksYz1zLmZldGNoSWZSZWYodC5vYmopO2lmKG51bGw9PT1jKWNvbnRpbnVlO2lmKCFjLmhhcygiVGl0bGUiKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7Y29uc3QgaD17dXJsOm51bGwsZGVzdDpudWxsLGFjdGlvbjpudWxsfTtDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoe2Rlc3REaWN0OmMscmVzdWx0T2JqOmgsZG9jQmFzZVVybDp0aGlzLnBkZk1hbmFnZXIuZG9jQmFzZVVybCxkb2NBdHRhY2htZW50czp0aGlzLmF0dGFjaG1lbnRzfSk7Y29uc3QgdT1jLmdldCgiVGl0bGUiKSxkPWMuZ2V0KCJGIil8fDAsZj1jLmdldEFycmF5KCJDIiksZz1jLmdldCgiQ291bnQiKTtsZXQgcD1vOyFBcnJheS5pc0FycmF5KGYpfHwzIT09Zi5sZW5ndGh8fDA9PT1mWzBdJiYwPT09ZlsxXSYmMD09PWZbMl18fChwPWwuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoZiwwKSk7Y29uc3QgbT17YWN0aW9uOmguYWN0aW9uLGF0dGFjaG1lbnQ6aC5hdHRhY2htZW50LGRlc3Q6aC5kZXN0LHVybDpoLnVybCx1bnNhZmVVcmw6aC51bnNhZmVVcmwsbmV3V2luZG93OmgubmV3V2luZG93LHNldE9DR1N0YXRlOmguc2V0T0NHU3RhdGUsdGl0bGU6KDAsbi5zdHJpbmdUb1BERlN0cmluZykodSksY29sb3I6cCxjb3VudDpOdW1iZXIuaXNJbnRlZ2VyKGcpP2c6dm9pZCAwLGJvbGQ6ISEoMiZkKSxpdGFsaWM6ISEoMSZkKSxpdGVtczpbXX07dC5wYXJlbnQuaXRlbXMucHVzaChtKTtlPWMuZ2V0UmF3KCJGaXJzdCIpO2lmKGUgaW5zdGFuY2VvZiBpLlJlZiYmIXIuaGFzKGUpKXthLnB1c2goe29iajplLHBhcmVudDptfSk7ci5wdXQoZSl9ZT1jLmdldFJhdygiTmV4dCIpO2lmKGUgaW5zdGFuY2VvZiBpLlJlZiYmIXIuaGFzKGUpKXthLnB1c2goe29iajplLHBhcmVudDp0LnBhcmVudH0pO3IucHV0KGUpfX1yZXR1cm4gdC5pdGVtcy5sZW5ndGg+MD90Lml0ZW1zOm51bGx9Z2V0IHBlcm1pc3Npb25zKCl7bGV0IGU9bnVsbDt0cnl7ZT10aGlzLl9yZWFkUGVybWlzc2lvbnMoKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygci5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLG4ud2FybikoIlVuYWJsZSB0byByZWFkIHBlcm1pc3Npb25zLiIpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJwZXJtaXNzaW9ucyIsZSl9X3JlYWRQZXJtaXNzaW9ucygpe2NvbnN0IGU9dGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJFbmNyeXB0Iik7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4gbnVsbDtsZXQgdD1lLmdldCgiUCIpO2lmKCJudW1iZXIiIT10eXBlb2YgdClyZXR1cm4gbnVsbDt0Kz0yKiozMjtjb25zdCBhPVtdO2Zvcihjb25zdCBlIGluIG4uUGVybWlzc2lvbkZsYWcpe2NvbnN0IHI9bi5QZXJtaXNzaW9uRmxhZ1tlXTt0JnImJmEucHVzaChyKX1yZXR1cm4gYX1nZXQgb3B0aW9uYWxDb250ZW50Q29uZmlnKCl7bGV0IGU9bnVsbDt0cnl7Y29uc3QgdD10aGlzLl9jYXREaWN0LmdldCgiT0NQcm9wZXJ0aWVzIik7aWYoIXQpcmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIm9wdGlvbmFsQ29udGVudENvbmZpZyIsbnVsbCk7Y29uc3QgYT10LmdldCgiRCIpO2lmKCFhKXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJvcHRpb25hbENvbnRlbnRDb25maWciLG51bGwpO2NvbnN0IHI9dC5nZXQoIk9DR3MiKTtpZighQXJyYXkuaXNBcnJheShyKSlyZXR1cm4oMCxuLnNoYWRvdykodGhpcywib3B0aW9uYWxDb250ZW50Q29uZmlnIixudWxsKTtjb25zdCBzPVtdLG89W107Zm9yKGNvbnN0IGUgb2Ygcil7aWYoIShlIGluc3RhbmNlb2YgaS5SZWYpKWNvbnRpbnVlO28ucHVzaChlKTtjb25zdCB0PXRoaXMueHJlZi5mZXRjaElmUmVmKGUpO3MucHVzaCh7aWQ6ZS50b1N0cmluZygpLG5hbWU6InN0cmluZyI9PXR5cGVvZiB0LmdldCgiTmFtZSIpPygwLG4uc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJOYW1lIikpOm51bGwsaW50ZW50OiJzdHJpbmciPT10eXBlb2YgdC5nZXQoIkludGVudCIpPygwLG4uc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJJbnRlbnQiKSk6bnVsbH0pfWU9dGhpcy5fcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhhLG8pO2UuZ3JvdXBzPXN9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHIuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLndhcm4pKGBVbmFibGUgdG8gcmVhZCBvcHRpb25hbCBjb250ZW50IGNvbmZpZzogJHtlfWApfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJvcHRpb25hbENvbnRlbnRDb25maWciLGUpfV9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnKGUsdCl7ZnVuY3Rpb24gcGFyc2VPbk9mZihlKXtjb25zdCBhPVtdO2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKGNvbnN0IHIgb2YgZSlyIGluc3RhbmNlb2YgaS5SZWYmJnQuaW5jbHVkZXMocikmJmEucHVzaChyLnRvU3RyaW5nKCkpO3JldHVybiBhfWZ1bmN0aW9uIHBhcnNlT3JkZXIoZSl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG51bGw7Y29uc3Qgbj1bXTtmb3IoY29uc3QgcyBvZiBlKXtpZihzIGluc3RhbmNlb2YgaS5SZWYmJnQuaW5jbHVkZXMocykpe3IucHV0KHMpO24ucHVzaChzLnRvU3RyaW5nKCkpO2NvbnRpbnVlfWNvbnN0IGU9cGFyc2VOZXN0ZWRPcmRlcihzLGEpO2UmJm4ucHVzaChlKX1pZihhPjApcmV0dXJuIG47Y29uc3Qgcz1bXTtmb3IoY29uc3QgZSBvZiB0KXIuaGFzKGUpfHxzLnB1c2goZS50b1N0cmluZygpKTtzLmxlbmd0aCYmbi5wdXNoKHtuYW1lOm51bGwsb3JkZXI6c30pO3JldHVybiBufWZ1bmN0aW9uIHBhcnNlTmVzdGVkT3JkZXIoZSx0KXtpZigrK3Q+cyl7KDAsbi53YXJuKSgicGFyc2VOZXN0ZWRPcmRlciAtIHJlYWNoZWQgTUFYX05FU1RFRF9MRVZFTFMuIik7cmV0dXJuIG51bGx9Y29uc3Qgcj1hLmZldGNoSWZSZWYoZSk7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuIG51bGw7Y29uc3QgaT1hLmZldGNoSWZSZWYoclswXSk7aWYoInN0cmluZyIhPXR5cGVvZiBpKXJldHVybiBudWxsO2NvbnN0IG89cGFyc2VPcmRlcihyLnNsaWNlKDEpLHQpO3JldHVybiBvJiZvLmxlbmd0aD97bmFtZTooMCxuLnN0cmluZ1RvUERGU3RyaW5nKShpKSxvcmRlcjpvfTpudWxsfWNvbnN0IGE9dGhpcy54cmVmLHI9bmV3IGkuUmVmU2V0LHM9MTA7cmV0dXJue25hbWU6InN0cmluZyI9PXR5cGVvZiBlLmdldCgiTmFtZSIpPygwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGUuZ2V0KCJOYW1lIikpOm51bGwsY3JlYXRvcjoic3RyaW5nIj09dHlwZW9mIGUuZ2V0KCJDcmVhdG9yIik/KDAsbi5zdHJpbmdUb1BERlN0cmluZykoZS5nZXQoIkNyZWF0b3IiKSk6bnVsbCxiYXNlU3RhdGU6ZS5nZXQoIkJhc2VTdGF0ZSIpaW5zdGFuY2VvZiBpLk5hbWU/ZS5nZXQoIkJhc2VTdGF0ZSIpLm5hbWU6bnVsbCxvbjpwYXJzZU9uT2ZmKGUuZ2V0KCJPTiIpKSxvZmY6cGFyc2VPbk9mZihlLmdldCgiT0ZGIikpLG9yZGVyOnBhcnNlT3JkZXIoZS5nZXQoIk9yZGVyIikpLGdyb3VwczpudWxsfX1zZXRBY3R1YWxOdW1QYWdlcygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3RoaXMuX2FjdHVhbE51bVBhZ2VzPWV9Z2V0IGhhc0FjdHVhbE51bVBhZ2VzKCl7cmV0dXJuIG51bGwhPT10aGlzLl9hY3R1YWxOdW1QYWdlc31nZXQgX3BhZ2VzQ291bnQoKXtjb25zdCBlPXRoaXMudG9wbGV2ZWxQYWdlc0RpY3QuZ2V0KCJDb3VudCIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGUpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJQYWdlIGNvdW50IGluIHRvcC1sZXZlbCBwYWdlcyBkaWN0aW9uYXJ5IGlzIG5vdCBhbiBpbnRlZ2VyLiIpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJfcGFnZXNDb3VudCIsZSl9Z2V0IG51bVBhZ2VzKCl7cmV0dXJuIHRoaXMuaGFzQWN0dWFsTnVtUGFnZXM/dGhpcy5fYWN0dWFsTnVtUGFnZXM6dGhpcy5fcGFnZXNDb3VudH1nZXQgZGVzdGluYXRpb25zKCl7Y29uc3QgZT10aGlzLl9yZWFkRGVzdHMoKSx0PU9iamVjdC5jcmVhdGUobnVsbCk7aWYoZSBpbnN0YW5jZW9mIHMuTmFtZVRyZWUpZm9yKGNvbnN0W2Escl1vZiBlLmdldEFsbCgpKXtjb25zdCBlPWZldGNoRGVzdGluYXRpb24ocik7ZSYmKHRbKDAsbi5zdHJpbmdUb1BERlN0cmluZykoYSldPWUpfWVsc2UgZSBpbnN0YW5jZW9mIGkuRGljdCYmZS5mb3JFYWNoKChmdW5jdGlvbihlLGEpe2NvbnN0IHI9ZmV0Y2hEZXN0aW5hdGlvbihhKTtyJiYodFtlXT1yKX0pKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiZGVzdGluYXRpb25zIix0KX1nZXREZXN0aW5hdGlvbihlKXtjb25zdCB0PXRoaXMuX3JlYWREZXN0cygpO2lmKHQgaW5zdGFuY2VvZiBzLk5hbWVUcmVlKXtjb25zdCBhPWZldGNoRGVzdGluYXRpb24odC5nZXQoZSkpO2lmKGEpcmV0dXJuIGE7Y29uc3Qgcj10aGlzLmRlc3RpbmF0aW9uc1tlXTtpZihyKXsoMCxuLndhcm4pKGBGb3VuZCAiJHtlfSIgYXQgYW4gaW5jb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBOYW1lVHJlZS5gKTtyZXR1cm4gcn19ZWxzZSBpZih0IGluc3RhbmNlb2YgaS5EaWN0KXtjb25zdCBhPWZldGNoRGVzdGluYXRpb24odC5nZXQoZSkpO2lmKGEpcmV0dXJuIGF9cmV0dXJuIG51bGx9X3JlYWREZXN0cygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7cmV0dXJuIGU/LmhhcygiRGVzdHMiKT9uZXcgcy5OYW1lVHJlZShlLmdldFJhdygiRGVzdHMiKSx0aGlzLnhyZWYpOnRoaXMuX2NhdERpY3QuaGFzKCJEZXN0cyIpP3RoaXMuX2NhdERpY3QuZ2V0KCJEZXN0cyIpOnZvaWQgMH1nZXQgcGFnZUxhYmVscygpe2xldCBlPW51bGw7dHJ5e2U9dGhpcy5fcmVhZFBhZ2VMYWJlbHMoKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygci5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLG4ud2FybikoIlVuYWJsZSB0byByZWFkIHBhZ2UgbGFiZWxzLiIpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJwYWdlTGFiZWxzIixlKX1fcmVhZFBhZ2VMYWJlbHMoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlTGFiZWxzIik7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5udW1QYWdlcyk7bGV0IGE9bnVsbCxvPSIiO2NvbnN0IGM9bmV3IHMuTnVtYmVyVHJlZShlLHRoaXMueHJlZikuZ2V0QWxsKCk7bGV0IGw9IiIsaD0xO2ZvcihsZXQgZT0wLHM9dGhpcy5udW1QYWdlcztlPHM7ZSsrKXtjb25zdCBzPWMuZ2V0KGUpO2lmKHZvaWQgMCE9PXMpe2lmKCEocyBpbnN0YW5jZW9mIGkuRGljdCkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlBhZ2VMYWJlbCBpcyBub3QgYSBkaWN0aW9uYXJ5LiIpO2lmKHMuaGFzKCJUeXBlIikmJiEoMCxpLmlzTmFtZSkocy5nZXQoIlR5cGUiKSwiUGFnZUxhYmVsIikpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgdHlwZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtpZihzLmhhcygiUyIpKXtjb25zdCBlPXMuZ2V0KCJTIik7aWYoIShlIGluc3RhbmNlb2YgaS5OYW1lKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiSW52YWxpZCBzdHlsZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTthPWUubmFtZX1lbHNlIGE9bnVsbDtpZihzLmhhcygiUCIpKXtjb25zdCBlPXMuZ2V0KCJQIik7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtvPSgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGUpfWVsc2Ugbz0iIjtpZihzLmhhcygiU3QiKSl7Y29uc3QgZT1zLmdldCgiU3QiKTtpZighKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTEpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIHN0YXJ0IGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpO2g9ZX1lbHNlIGg9MX1zd2l0Y2goYSl7Y2FzZSJEIjpsPWg7YnJlYWs7Y2FzZSJSIjpjYXNlInIiOmw9KDAsci50b1JvbWFuTnVtZXJhbHMpKGgsInIiPT09YSk7YnJlYWs7Y2FzZSJBIjpjYXNlImEiOmNvbnN0IGU9MjYsdD0iYSI9PT1hPzk3OjY1LGk9aC0xO2w9U3RyaW5nLmZyb21DaGFyQ29kZSh0K2klZSkucmVwZWF0KE1hdGguZmxvb3IoaS9lKSsxKTticmVhaztkZWZhdWx0OmlmKGEpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoYEludmFsaWQgc3R5bGUgIiR7YX0iIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LmApO2w9IiJ9dFtlXT1vK2w7aCsrfXJldHVybiB0fWdldCBwYWdlTGF5b3V0KCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiUGFnZUxheW91dCIpO2xldCB0PSIiO2lmKGUgaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKGUubmFtZSl7Y2FzZSJTaW5nbGVQYWdlIjpjYXNlIk9uZUNvbHVtbiI6Y2FzZSJUd29Db2x1bW5MZWZ0IjpjYXNlIlR3b0NvbHVtblJpZ2h0IjpjYXNlIlR3b1BhZ2VMZWZ0IjpjYXNlIlR3b1BhZ2VSaWdodCI6dD1lLm5hbWV9cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsInBhZ2VMYXlvdXQiLHQpfWdldCBwYWdlTW9kZSgpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VNb2RlIik7bGV0IHQ9IlVzZU5vbmUiO2lmKGUgaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKGUubmFtZSl7Y2FzZSJVc2VOb25lIjpjYXNlIlVzZU91dGxpbmVzIjpjYXNlIlVzZVRodW1icyI6Y2FzZSJGdWxsU2NyZWVuIjpjYXNlIlVzZU9DIjpjYXNlIlVzZUF0dGFjaG1lbnRzIjp0PWUubmFtZX1yZXR1cm4oMCxuLnNoYWRvdykodGhpcywicGFnZU1vZGUiLHQpfWdldCB2aWV3ZXJQcmVmZXJlbmNlcygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlZpZXdlclByZWZlcmVuY2VzIik7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4oMCxuLnNoYWRvdykodGhpcywidmlld2VyUHJlZmVyZW5jZXMiLG51bGwpO2xldCB0PW51bGw7Zm9yKGNvbnN0IGEgb2YgZS5nZXRLZXlzKCkpe2NvbnN0IHI9ZS5nZXQoYSk7bGV0IHM7c3dpdGNoKGEpe2Nhc2UiSGlkZVRvb2xiYXIiOmNhc2UiSGlkZU1lbnViYXIiOmNhc2UiSGlkZVdpbmRvd1VJIjpjYXNlIkZpdFdpbmRvdyI6Y2FzZSJDZW50ZXJXaW5kb3ciOmNhc2UiRGlzcGxheURvY1RpdGxlIjpjYXNlIlBpY2tUcmF5QnlQREZTaXplIjoiYm9vbGVhbiI9PXR5cGVvZiByJiYocz1yKTticmVhaztjYXNlIk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSI6aWYociBpbnN0YW5jZW9mIGkuTmFtZSlzd2l0Y2goci5uYW1lKXtjYXNlIlVzZU5vbmUiOmNhc2UiVXNlT3V0bGluZXMiOmNhc2UiVXNlVGh1bWJzIjpjYXNlIlVzZU9DIjpzPXIubmFtZTticmVhaztkZWZhdWx0OnM9IlVzZU5vbmUifWJyZWFrO2Nhc2UiRGlyZWN0aW9uIjppZihyIGluc3RhbmNlb2YgaS5OYW1lKXN3aXRjaChyLm5hbWUpe2Nhc2UiTDJSIjpjYXNlIlIyTCI6cz1yLm5hbWU7YnJlYWs7ZGVmYXVsdDpzPSJMMlIifWJyZWFrO2Nhc2UiVmlld0FyZWEiOmNhc2UiVmlld0NsaXAiOmNhc2UiUHJpbnRBcmVhIjpjYXNlIlByaW50Q2xpcCI6aWYociBpbnN0YW5jZW9mIGkuTmFtZSlzd2l0Y2goci5uYW1lKXtjYXNlIk1lZGlhQm94IjpjYXNlIkNyb3BCb3giOmNhc2UiQmxlZWRCb3giOmNhc2UiVHJpbUJveCI6Y2FzZSJBcnRCb3giOnM9ci5uYW1lO2JyZWFrO2RlZmF1bHQ6cz0iQ3JvcEJveCJ9YnJlYWs7Y2FzZSJQcmludFNjYWxpbmciOmlmKHIgaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKHIubmFtZSl7Y2FzZSJOb25lIjpjYXNlIkFwcERlZmF1bHQiOnM9ci5uYW1lO2JyZWFrO2RlZmF1bHQ6cz0iQXBwRGVmYXVsdCJ9YnJlYWs7Y2FzZSJEdXBsZXgiOmlmKHIgaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKHIubmFtZSl7Y2FzZSJTaW1wbGV4IjpjYXNlIkR1cGxleEZsaXBTaG9ydEVkZ2UiOmNhc2UiRHVwbGV4RmxpcExvbmdFZGdlIjpzPXIubmFtZTticmVhaztkZWZhdWx0OnM9Ik5vbmUifWJyZWFrO2Nhc2UiUHJpbnRQYWdlUmFuZ2UiOmlmKEFycmF5LmlzQXJyYXkocikmJnIubGVuZ3RoJTI9PTApe3IuZXZlcnkoKChlLHQsYSk9Pk51bWJlci5pc0ludGVnZXIoZSkmJmU+MCYmKDA9PT10fHxlPj1hW3QtMV0pJiZlPD10aGlzLm51bVBhZ2VzKSkmJihzPXIpfWJyZWFrO2Nhc2UiTnVtQ29waWVzIjpOdW1iZXIuaXNJbnRlZ2VyKHIpJiZyPjAmJihzPXIpO2JyZWFrO2RlZmF1bHQ6KDAsbi53YXJuKShgSWdub3Jpbmcgbm9uLXN0YW5kYXJkIGtleSBpbiBWaWV3ZXJQcmVmZXJlbmNlczogJHthfS5gKTtjb250aW51ZX1pZih2b2lkIDAhPT1zKXt0fHwodD1PYmplY3QuY3JlYXRlKG51bGwpKTt0W2FdPXN9ZWxzZSgwLG4ud2FybikoYEJhZCB2YWx1ZSwgZm9yIGtleSAiJHthfSIsIGluIFZpZXdlclByZWZlcmVuY2VzOiAke3J9LmApfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJ2aWV3ZXJQcmVmZXJlbmNlcyIsdCl9Z2V0IG9wZW5BY3Rpb24oKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJPcGVuQWN0aW9uIiksdD1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGUgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IGE9bmV3IGkuRGljdCh0aGlzLnhyZWYpO2Euc2V0KCJBIixlKTtjb25zdCByPXt1cmw6bnVsbCxkZXN0Om51bGwsYWN0aW9uOm51bGx9O0NhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7ZGVzdERpY3Q6YSxyZXN1bHRPYmo6cn0pO0FycmF5LmlzQXJyYXkoci5kZXN0KT90LmRlc3Q9ci5kZXN0OnIuYWN0aW9uJiYodC5hY3Rpb249ci5hY3Rpb24pfWVsc2UgQXJyYXkuaXNBcnJheShlKSYmKHQuZGVzdD1lKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywib3BlbkFjdGlvbiIsKDAsbi5vYmplY3RTaXplKSh0KT4wP3Q6bnVsbCl9Z2V0IGF0dGFjaG1lbnRzKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTtsZXQgdD1udWxsO2lmKGUgaW5zdGFuY2VvZiBpLkRpY3QmJmUuaGFzKCJFbWJlZGRlZEZpbGVzIikpe2NvbnN0IGE9bmV3IHMuTmFtZVRyZWUoZS5nZXRSYXcoIkVtYmVkZGVkRmlsZXMiKSx0aGlzLnhyZWYpO2Zvcihjb25zdFtlLHJdb2YgYS5nZXRBbGwoKSl7Y29uc3QgYT1uZXcgaC5GaWxlU3BlYyhyLHRoaXMueHJlZik7dHx8KHQ9T2JqZWN0LmNyZWF0ZShudWxsKSk7dFsoMCxuLnN0cmluZ1RvUERGU3RyaW5nKShlKV09YS5zZXJpYWxpemFibGV9fXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJhdHRhY2htZW50cyIsdCl9Z2V0IHhmYUltYWdlcygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7bGV0IHQ9bnVsbDtpZihlIGluc3RhbmNlb2YgaS5EaWN0JiZlLmhhcygiWEZBSW1hZ2VzIikpe2NvbnN0IGE9bmV3IHMuTmFtZVRyZWUoZS5nZXRSYXcoIlhGQUltYWdlcyIpLHRoaXMueHJlZik7Zm9yKGNvbnN0W2Uscl1vZiBhLmdldEFsbCgpKXt0fHwodD1uZXcgaS5EaWN0KHRoaXMueHJlZikpO3Quc2V0KCgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGUpLHIpfX1yZXR1cm4oMCxuLnNoYWRvdykodGhpcywieGZhSW1hZ2VzIix0KX1fY29sbGVjdEphdmFTY3JpcHQoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpO2xldCB0PW51bGw7ZnVuY3Rpb24gYXBwZW5kSWZKYXZhU2NyaXB0RGljdChlLGEpe2lmKCEoYSBpbnN0YW5jZW9mIGkuRGljdCkpcmV0dXJuO2lmKCEoMCxpLmlzTmFtZSkoYS5nZXQoIlMiKSwiSmF2YVNjcmlwdCIpKXJldHVybjtsZXQgcj1hLmdldCgiSlMiKTtpZihyIGluc3RhbmNlb2Ygby5CYXNlU3RyZWFtKXI9ci5nZXRTdHJpbmcoKTtlbHNlIGlmKCJzdHJpbmciIT10eXBlb2YgcilyZXR1cm47cj0oMCxuLnN0cmluZ1RvUERGU3RyaW5nKShyKS5yZXBsYWNlQWxsKCJcMCIsIiIpOyh0fHw9bmV3IE1hcCkuc2V0KGUscil9aWYoZSBpbnN0YW5jZW9mIGkuRGljdCYmZS5oYXMoIkphdmFTY3JpcHQiKSl7Y29uc3QgdD1uZXcgcy5OYW1lVHJlZShlLmdldFJhdygiSmF2YVNjcmlwdCIpLHRoaXMueHJlZik7Zm9yKGNvbnN0W2UsYV1vZiB0LmdldEFsbCgpKWFwcGVuZElmSmF2YVNjcmlwdERpY3QoKDAsbi5zdHJpbmdUb1BERlN0cmluZykoZSksYSl9Y29uc3QgYT10aGlzLl9jYXREaWN0LmdldCgiT3BlbkFjdGlvbiIpO2EmJmFwcGVuZElmSmF2YVNjcmlwdERpY3QoIk9wZW5BY3Rpb24iLGEpO3JldHVybiB0fWdldCBqYXZhU2NyaXB0KCl7Y29uc3QgZT10aGlzLl9jb2xsZWN0SmF2YVNjcmlwdCgpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJqYXZhU2NyaXB0IixlP1suLi5lLnZhbHVlcygpXTpudWxsKX1nZXQganNBY3Rpb25zKCl7Y29uc3QgZT10aGlzLl9jb2xsZWN0SmF2YVNjcmlwdCgpO2xldCB0PSgwLHIuY29sbGVjdEFjdGlvbnMpKHRoaXMueHJlZix0aGlzLl9jYXREaWN0LG4uRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUpO2lmKGUpe3R8fCh0PU9iamVjdC5jcmVhdGUobnVsbCkpO2Zvcihjb25zdFthLHJdb2YgZSlhIGluIHQ/dFthXS5wdXNoKHIpOnRbYV09W3JdfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJqc0FjdGlvbnMiLHQpfWFzeW5jIGZvbnRGYWxsYmFjayhlLHQpe2NvbnN0IGE9YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mb250Q2FjaGUpO2Zvcihjb25zdCByIG9mIGEpaWYoci5sb2FkZWROYW1lPT09ZSl7ci5mYWxsYmFjayh0KTtyZXR1cm59fWFzeW5jIGNsZWFudXAoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdOygwLGMuY2xlYXJHbG9iYWxDYWNoZXMpKCk7dGhpcy5nbG9iYWxJbWFnZUNhY2hlLmNsZWFyKGUpO3RoaXMucGFnZUtpZHNDb3VudENhY2hlLmNsZWFyKCk7dGhpcy5wYWdlSW5kZXhDYWNoZS5jbGVhcigpO3RoaXMubm9uQmxlbmRNb2Rlc1NldC5jbGVhcigpO2NvbnN0IHQ9YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mb250Q2FjaGUpO2Zvcihjb25zdHtkaWN0OmV9b2YgdClkZWxldGUgZS5jYWNoZUtleTt0aGlzLmZvbnRDYWNoZS5jbGVhcigpO3RoaXMuYnVpbHRJbkNNYXBDYWNoZS5jbGVhcigpO3RoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLmNsZWFyKCk7dGhpcy5zeXN0ZW1Gb250Q2FjaGUuY2xlYXIoKX1hc3luYyBnZXRQYWdlRGljdChlKXtjb25zdCB0PVt0aGlzLnRvcGxldmVsUGFnZXNEaWN0XSxhPW5ldyBpLlJlZlNldCxyPXRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpO3IgaW5zdGFuY2VvZiBpLlJlZiYmYS5wdXQocik7Y29uc3Qgcz10aGlzLnhyZWYsbz10aGlzLnBhZ2VLaWRzQ291bnRDYWNoZSxjPXRoaXMucGFnZUluZGV4Q2FjaGU7bGV0IGw9MDtmb3IoO3QubGVuZ3RoOyl7Y29uc3Qgcj10LnBvcCgpO2lmKHIgaW5zdGFuY2VvZiBpLlJlZil7Y29uc3QgaD1vLmdldChyKTtpZihoPj0wJiZsK2g8PWUpe2wrPWg7Y29udGludWV9aWYoYS5oYXMocikpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlBhZ2VzIHRyZWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlLiIpO2EucHV0KHIpO2NvbnN0IHU9YXdhaXQgcy5mZXRjaEFzeW5jKHIpO2lmKHUgaW5zdGFuY2VvZiBpLkRpY3Qpe2xldCB0PXUuZ2V0UmF3KCJUeXBlIik7dCBpbnN0YW5jZW9mIGkuUmVmJiYodD1hd2FpdCBzLmZldGNoQXN5bmModCkpO2lmKCgwLGkuaXNOYW1lKSh0LCJQYWdlIil8fCF1LmhhcygiS2lkcyIpKXtvLmhhcyhyKXx8by5wdXQociwxKTtjLmhhcyhyKXx8Yy5wdXQocixsKTtpZihsPT09ZSlyZXR1cm5bdSxyXTtsKys7Y29udGludWV9fXQucHVzaCh1KTtjb250aW51ZX1pZighKHIgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkIHJlZmVyZW5jZSBwb2ludHMgdG8gd3JvbmcgdHlwZSBvZiBvYmplY3QuIik7Y29uc3R7b2JqSWQ6aH09cjtsZXQgdT1yLmdldFJhdygiQ291bnQiKTt1IGluc3RhbmNlb2YgaS5SZWYmJih1PWF3YWl0IHMuZmV0Y2hBc3luYyh1KSk7aWYoTnVtYmVyLmlzSW50ZWdlcih1KSYmdT49MCl7aCYmIW8uaGFzKGgpJiZvLnB1dChoLHUpO2lmKGwrdTw9ZSl7bCs9dTtjb250aW51ZX19bGV0IGQ9ci5nZXRSYXcoIktpZHMiKTtkIGluc3RhbmNlb2YgaS5SZWYmJihkPWF3YWl0IHMuZmV0Y2hBc3luYyhkKSk7aWYoIUFycmF5LmlzQXJyYXkoZCkpe2xldCB0PXIuZ2V0UmF3KCJUeXBlIik7dCBpbnN0YW5jZW9mIGkuUmVmJiYodD1hd2FpdCBzLmZldGNoQXN5bmModCkpO2lmKCgwLGkuaXNOYW1lKSh0LCJQYWdlIil8fCFyLmhhcygiS2lkcyIpKXtpZihsPT09ZSlyZXR1cm5bcixudWxsXTtsKys7Y29udGludWV9dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlBhZ2UgZGljdGlvbmFyeSBraWRzIG9iamVjdCBpcyBub3QgYW4gYXJyYXkuIil9Zm9yKGxldCBlPWQubGVuZ3RoLTE7ZT49MDtlLS0pdC5wdXNoKGRbZV0pfXRocm93IG5ldyBFcnJvcihgUGFnZSBpbmRleCAke2V9IG5vdCBmb3VuZC5gKX1hc3luYyBnZXRBbGxQYWdlRGljdHMoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0e2lnbm9yZUVycm9yczp0fT10aGlzLnBkZk1hbmFnZXIuZXZhbHVhdG9yT3B0aW9ucyxhPVt7Y3VycmVudE5vZGU6dGhpcy50b3BsZXZlbFBhZ2VzRGljdCxwb3NJbktpZHM6MH1dLHM9bmV3IGkuUmVmU2V0LG89dGhpcy5fY2F0RGljdC5nZXRSYXcoIlBhZ2VzIik7byBpbnN0YW5jZW9mIGkuUmVmJiZzLnB1dChvKTtjb25zdCBjPW5ldyBNYXAsbD10aGlzLnhyZWYsaD10aGlzLnBhZ2VJbmRleENhY2hlO2xldCB1PTA7ZnVuY3Rpb24gYWRkUGFnZURpY3QoZSx0KXt0JiYhaC5oYXModCkmJmgucHV0KHQsdSk7Yy5zZXQodSsrLFtlLHRdKX1mdW5jdGlvbiBhZGRQYWdlRXJyb3IoYSl7aWYoYSBpbnN0YW5jZW9mIHIuWFJlZkVudHJ5RXhjZXB0aW9uJiYhZSl0aHJvdyBhO2lmKGUmJnQmJjA9PT11KXsoMCxuLndhcm4pKGBnZXRBbGxQYWdlRGljdHMgLSBTa2lwcGluZyBpbnZhbGlkIGZpcnN0IHBhZ2U6ICIke2F9Ii5gKTthPWkuRGljdC5lbXB0eX1jLnNldCh1KyssW2EsbnVsbF0pfWZvcig7YS5sZW5ndGg+MDspe2NvbnN0IGU9YS5hdCgtMSkse2N1cnJlbnROb2RlOnQscG9zSW5LaWRzOnJ9PWU7bGV0IG89dC5nZXRSYXcoIktpZHMiKTtpZihvIGluc3RhbmNlb2YgaS5SZWYpdHJ5e289YXdhaXQgbC5mZXRjaEFzeW5jKG8pfWNhdGNoKGUpe2FkZFBhZ2VFcnJvcihlKTticmVha31pZighQXJyYXkuaXNBcnJheShvKSl7YWRkUGFnZUVycm9yKG5ldyBuLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpKTticmVha31pZihyPj1vLmxlbmd0aCl7YS5wb3AoKTtjb250aW51ZX1jb25zdCBjPW9bcl07bGV0IGg7aWYoYyBpbnN0YW5jZW9mIGkuUmVmKXtpZihzLmhhcyhjKSl7YWRkUGFnZUVycm9yKG5ldyBuLkZvcm1hdEVycm9yKCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS4iKSk7YnJlYWt9cy5wdXQoYyk7dHJ5e2g9YXdhaXQgbC5mZXRjaEFzeW5jKGMpfWNhdGNoKGUpe2FkZFBhZ2VFcnJvcihlKTticmVha319ZWxzZSBoPWM7aWYoIShoIGluc3RhbmNlb2YgaS5EaWN0KSl7YWRkUGFnZUVycm9yKG5ldyBuLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkIHJlZmVyZW5jZSBwb2ludHMgdG8gd3JvbmcgdHlwZSBvZiBvYmplY3QuIikpO2JyZWFrfWxldCB1PWguZ2V0UmF3KCJUeXBlIik7aWYodSBpbnN0YW5jZW9mIGkuUmVmKXRyeXt1PWF3YWl0IGwuZmV0Y2hBc3luYyh1KX1jYXRjaChlKXthZGRQYWdlRXJyb3IoZSk7YnJlYWt9KDAsaS5pc05hbWUpKHUsIlBhZ2UiKXx8IWguaGFzKCJLaWRzIik/YWRkUGFnZURpY3QoaCxjIGluc3RhbmNlb2YgaS5SZWY/YzpudWxsKTphLnB1c2goe2N1cnJlbnROb2RlOmgscG9zSW5LaWRzOjB9KTtlLnBvc0luS2lkcysrfXJldHVybiBjfWdldFBhZ2VJbmRleChlKXtjb25zdCB0PXRoaXMucGFnZUluZGV4Q2FjaGUuZ2V0KGUpO2lmKHZvaWQgMCE9PXQpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KTtjb25zdCBhPXRoaXMueHJlZjtsZXQgcj0wO2NvbnN0IG5leHQ9dD0+ZnVuY3Rpb24gcGFnZXNCZWZvcmVSZWYodCl7bGV0IHIscz0wO3JldHVybiBhLmZldGNoQXN5bmModCkudGhlbigoZnVuY3Rpb24oYSl7aWYoKDAsaS5pc1JlZnNFcXVhbCkodCxlKSYmISgwLGkuaXNEaWN0KShhLCJQYWdlIikmJiEoYSBpbnN0YW5jZW9mIGkuRGljdCYmIWEuaGFzKCJUeXBlIikmJmEuaGFzKCJDb250ZW50cyIpKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVGhlIHJlZmVyZW5jZSBkb2VzIG5vdCBwb2ludCB0byBhIC9QYWdlIGRpY3Rpb25hcnkuIik7aWYoIWEpcmV0dXJuIG51bGw7aWYoIShhIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiTm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTtyPWEuZ2V0UmF3KCJQYXJlbnQiKTtyZXR1cm4gYS5nZXRBc3luYygiUGFyZW50Iil9KSkudGhlbigoZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiUGFyZW50IG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpO3JldHVybiBlLmdldEFzeW5jKCJLaWRzIil9KSkudGhlbigoZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3Qgbz1bXTtsZXQgYz0hMTtmb3IoY29uc3QgciBvZiBlKXtpZighKHIgaW5zdGFuY2VvZiBpLlJlZikpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIktpZCBtdXN0IGJlIGEgcmVmZXJlbmNlLiIpO2lmKCgwLGkuaXNSZWZzRXF1YWwpKHIsdCkpe2M9ITA7YnJlYWt9by5wdXNoKGEuZmV0Y2hBc3luYyhyKS50aGVuKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJLaWQgbm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTtlLmhhcygiQ291bnQiKT9zKz1lLmdldCgiQ291bnQiKTpzKyt9KSkpfWlmKCFjKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJLaWQgcmVmZXJlbmNlIG5vdCBmb3VuZCBpbiBwYXJlbnQncyBraWRzLiIpO3JldHVybiBQcm9taXNlLmFsbChvKS50aGVuKChmdW5jdGlvbigpe3JldHVybltzLHJdfSkpfSkpfSh0KS50aGVuKCh0PT57aWYoIXQpe3RoaXMucGFnZUluZGV4Q2FjaGUucHV0KGUscik7cmV0dXJuIHJ9Y29uc3RbYSxuXT10O3IrPWE7cmV0dXJuIG5leHQobil9KSk7cmV0dXJuIG5leHQoZSl9Z2V0IGJhc2VVcmwoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJVUkkiKTtpZihlIGluc3RhbmNlb2YgaS5EaWN0KXtjb25zdCB0PWUuZ2V0KCJCYXNlIik7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtjb25zdCBlPSgwLG4uY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodCxudWxsLHt0cnlDb252ZXJ0RW5jb2Rpbmc6ITB9KTtpZihlKXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJiYXNlVXJsIixlLmhyZWYpfX1yZXR1cm4oMCxuLnNoYWRvdykodGhpcywiYmFzZVVybCIsbnVsbCl9c3RhdGljIHBhcnNlRGVzdERpY3Rpb25hcnkoZSl7Y29uc3QgdD1lLmRlc3REaWN0O2lmKCEodCBpbnN0YW5jZW9mIGkuRGljdCkpeygwLG4ud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IGBkZXN0RGljdGAgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7cmV0dXJufWNvbnN0IGE9ZS5yZXN1bHRPYmo7aWYoIm9iamVjdCIhPXR5cGVvZiBhKXsoMCxuLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBgcmVzdWx0T2JqYCBtdXN0IGJlIGFuIG9iamVjdC4iKTtyZXR1cm59Y29uc3Qgcz1lLmRvY0Jhc2VVcmx8fG51bGwsYz1lLmRvY0F0dGFjaG1lbnRzfHxudWxsO2xldCBsLGgsdT10LmdldCgiQSIpO2lmKCEodSBpbnN0YW5jZW9mIGkuRGljdCkpaWYodC5oYXMoIkRlc3QiKSl1PXQuZ2V0KCJEZXN0Iik7ZWxzZXt1PXQuZ2V0KCJBQSIpO3UgaW5zdGFuY2VvZiBpLkRpY3QmJih1LmhhcygiRCIpP3U9dS5nZXQoIkQiKTp1LmhhcygiVSIpJiYodT11LmdldCgiVSIpKSl9aWYodSBpbnN0YW5jZW9mIGkuRGljdCl7Y29uc3QgZT11LmdldCgiUyIpO2lmKCEoZSBpbnN0YW5jZW9mIGkuTmFtZSkpeygwLG4ud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IEludmFsaWQgdHlwZSBpbiBBY3Rpb24gZGljdGlvbmFyeS4iKTtyZXR1cm59Y29uc3QgdD1lLm5hbWU7c3dpdGNoKHQpe2Nhc2UiUmVzZXRGb3JtIjpjb25zdCBlPXUuZ2V0KCJGbGFncyIpLHM9MD09KDEmKCJudW1iZXIiPT10eXBlb2YgZT9lOjApKSxkPVtdLGY9W107Zm9yKGNvbnN0IGUgb2YgdS5nZXQoIkZpZWxkcyIpfHxbXSllIGluc3RhbmNlb2YgaS5SZWY/Zi5wdXNoKGUudG9TdHJpbmcoKSk6InN0cmluZyI9PXR5cGVvZiBlJiZkLnB1c2goKDAsbi5zdHJpbmdUb1BERlN0cmluZykoZSkpO2EucmVzZXRGb3JtPXtmaWVsZHM6ZCxyZWZzOmYsaW5jbHVkZTpzfTticmVhaztjYXNlIlVSSSI6bD11LmdldCgiVVJJIik7bCBpbnN0YW5jZW9mIGkuTmFtZSYmKGw9Ii8iK2wubmFtZSk7YnJlYWs7Y2FzZSJHb1RvIjpoPXUuZ2V0KCJEIik7YnJlYWs7Y2FzZSJMYXVuY2giOmNhc2UiR29Ub1IiOmNvbnN0IGc9dS5nZXQoIkYiKTtnIGluc3RhbmNlb2YgaS5EaWN0P2w9Zy5nZXQoIkYiKXx8bnVsbDoic3RyaW5nIj09dHlwZW9mIGcmJihsPWcpO2xldCBwPXUuZ2V0KCJEIik7aWYocCl7cCBpbnN0YW5jZW9mIGkuTmFtZSYmKHA9cC5uYW1lKTtpZigic3RyaW5nIj09dHlwZW9mIGwpe2NvbnN0IGU9bC5zcGxpdCgiIyIpWzBdOyJzdHJpbmciPT10eXBlb2YgcD9sPWUrIiMiK3A6QXJyYXkuaXNBcnJheShwKSYmKGw9ZSsiIyIrSlNPTi5zdHJpbmdpZnkocCkpfX1jb25zdCBtPXUuZ2V0KCJOZXdXaW5kb3ciKTsiYm9vbGVhbiI9PXR5cGVvZiBtJiYoYS5uZXdXaW5kb3c9bSk7YnJlYWs7Y2FzZSJHb1RvRSI6Y29uc3QgYj11LmdldCgiVCIpO2xldCB5O2lmKGMmJmIgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IGU9Yi5nZXQoIlIiKSx0PWIuZ2V0KCJOIik7KDAsaS5pc05hbWUpKGUsIkMiKSYmInN0cmluZyI9PXR5cGVvZiB0JiYoeT1jWygwLG4uc3RyaW5nVG9QREZTdHJpbmcpKHQpXSl9eT9hLmF0dGFjaG1lbnQ9eTooMCxuLndhcm4pKCdwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5pbXBsZW1lbnRlZCAiR29Ub0UiIGFjdGlvbi4nKTticmVhaztjYXNlIk5hbWVkIjpjb25zdCB3PXUuZ2V0KCJOIik7dyBpbnN0YW5jZW9mIGkuTmFtZSYmKGEuYWN0aW9uPXcubmFtZSk7YnJlYWs7Y2FzZSJTZXRPQ0dTdGF0ZSI6Y29uc3QgUz11LmdldCgiU3RhdGUiKSx4PXUuZ2V0KCJQcmVzZXJ2ZVJCIik7aWYoIUFycmF5LmlzQXJyYXkoUyl8fDA9PT1TLmxlbmd0aClicmVhaztjb25zdCBDPVtdO2Zvcihjb25zdCBlIG9mIFMpaWYoZSBpbnN0YW5jZW9mIGkuTmFtZSlzd2l0Y2goZS5uYW1lKXtjYXNlIk9OIjpjYXNlIk9GRiI6Y2FzZSJUb2dnbGUiOkMucHVzaChlLm5hbWUpfWVsc2UgZSBpbnN0YW5jZW9mIGkuUmVmJiZDLnB1c2goZS50b1N0cmluZygpKTtpZihDLmxlbmd0aCE9PVMubGVuZ3RoKWJyZWFrO2Euc2V0T0NHU3RhdGU9e3N0YXRlOkMscHJlc2VydmVSQjoiYm9vbGVhbiIhPXR5cGVvZiB4fHx4fTticmVhaztjYXNlIkphdmFTY3JpcHQiOmNvbnN0IHY9dS5nZXQoIkpTIik7bGV0IGs7diBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbT9rPXYuZ2V0U3RyaW5nKCk6InN0cmluZyI9PXR5cGVvZiB2JiYoaz12KTtjb25zdCBPPWsmJigwLHIucmVjb3ZlckpzVVJMKSgoMCxuLnN0cmluZ1RvUERGU3RyaW5nKShrKSk7aWYoTyl7bD1PLnVybDthLm5ld1dpbmRvdz1PLm5ld1dpbmRvdzticmVha31kZWZhdWx0OmlmKCJKYXZhU2NyaXB0Ij09PXR8fCJTdWJtaXRGb3JtIj09PXQpYnJlYWs7KDAsbi53YXJuKShgcGFyc2VEZXN0RGljdGlvbmFyeSAtIHVuc3VwcG9ydGVkIGFjdGlvbjogIiR7dH0iLmApfX1lbHNlIHQuaGFzKCJEZXN0IikmJihoPXQuZ2V0KCJEZXN0IikpO2lmKCJzdHJpbmciPT10eXBlb2YgbCl7Y29uc3QgZT0oMCxuLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKGwscyx7YWRkRGVmYXVsdFByb3RvY29sOiEwLHRyeUNvbnZlcnRFbmNvZGluZzohMH0pO2UmJihhLnVybD1lLmhyZWYpO2EudW5zYWZlVXJsPWx9aWYoaCl7aCBpbnN0YW5jZW9mIGkuTmFtZSYmKGg9aC5uYW1lKTsic3RyaW5nIj09dHlwZW9mIGg/YS5kZXN0PSgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGgpOkFycmF5LmlzQXJyYXkoaCkmJihhLmRlc3Q9aCl9fX10LkNhdGFsb2c9Q2F0YWxvZ30sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5OdW1iZXJUcmVlPXQuTmFtZVRyZWU9dm9pZCAwO2EoMTM5KTt2YXIgcj1hKDE1MCksbj1hKDE0NCk7Y2xhc3MgTmFtZU9yTnVtYmVyVHJlZXtjb25zdHJ1Y3RvcihlLHQsYSl7dGhpcy5jb25zdHJ1Y3Rvcj09PU5hbWVPck51bWJlclRyZWUmJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBOYW1lT3JOdW1iZXJUcmVlLiIpO3RoaXMucm9vdD1lO3RoaXMueHJlZj10O3RoaXMuX3R5cGU9YX1nZXRBbGwoKXtjb25zdCBlPW5ldyBNYXA7aWYoIXRoaXMucm9vdClyZXR1cm4gZTtjb25zdCB0PXRoaXMueHJlZixhPW5ldyByLlJlZlNldDthLnB1dCh0aGlzLnJvb3QpO2NvbnN0IGk9W3RoaXMucm9vdF07Zm9yKDtpLmxlbmd0aD4wOyl7Y29uc3Qgcz10LmZldGNoSWZSZWYoaS5zaGlmdCgpKTtpZighKHMgaW5zdGFuY2VvZiByLkRpY3QpKWNvbnRpbnVlO2lmKHMuaGFzKCJLaWRzIikpe2NvbnN0IGU9cy5nZXQoIktpZHMiKTtpZighQXJyYXkuaXNBcnJheShlKSljb250aW51ZTtmb3IoY29uc3QgdCBvZiBlKXtpZihhLmhhcyh0KSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcihgRHVwbGljYXRlIGVudHJ5IGluICIke3RoaXMuX3R5cGV9IiB0cmVlLmApO2kucHVzaCh0KTthLnB1dCh0KX1jb250aW51ZX1jb25zdCBvPXMuZ2V0KHRoaXMuX3R5cGUpO2lmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBhPTAscj1vLmxlbmd0aDthPHI7YSs9MillLnNldCh0LmZldGNoSWZSZWYob1thXSksdC5mZXRjaElmUmVmKG9bYSsxXSkpfXJldHVybiBlfWdldChlKXtpZighdGhpcy5yb290KXJldHVybiBudWxsO2NvbnN0IHQ9dGhpcy54cmVmO2xldCBhPXQuZmV0Y2hJZlJlZih0aGlzLnJvb3QpLHI9MDtmb3IoO2EuaGFzKCJLaWRzIik7KXtpZigrK3I+MTApeygwLG4ud2FybikoYFNlYXJjaCBkZXB0aCBsaW1pdCByZWFjaGVkIGZvciAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTtyZXR1cm4gbnVsbH1jb25zdCBpPWEuZ2V0KCJLaWRzIik7aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIG51bGw7bGV0IHM9MCxvPWkubGVuZ3RoLTE7Zm9yKDtzPD1vOyl7Y29uc3Qgcj1zK28+PjEsbj10LmZldGNoSWZSZWYoaVtyXSksYz1uLmdldCgiTGltaXRzIik7aWYoZTx0LmZldGNoSWZSZWYoY1swXSkpbz1yLTE7ZWxzZXtpZighKGU+dC5mZXRjaElmUmVmKGNbMV0pKSl7YT1uO2JyZWFrfXM9cisxfX1pZihzPm8pcmV0dXJuIG51bGx9Y29uc3QgaT1hLmdldCh0aGlzLl90eXBlKTtpZihBcnJheS5pc0FycmF5KGkpKXtsZXQgYT0wLHI9aS5sZW5ndGgtMjtmb3IoO2E8PXI7KXtjb25zdCBuPWErcj4+MSxzPW4rKDEmbiksbz10LmZldGNoSWZSZWYoaVtzXSk7aWYoZTxvKXI9cy0yO2Vsc2V7aWYoIShlPm8pKXJldHVybiB0LmZldGNoSWZSZWYoaVtzKzFdKTthPXMrMn19fXJldHVybiBudWxsfX10Lk5hbWVUcmVlPWNsYXNzIE5hbWVUcmVlIGV4dGVuZHMgTmFtZU9yTnVtYmVyVHJlZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCwiTmFtZXMiKX19O3QuTnVtYmVyVHJlZT1jbGFzcyBOdW1iZXJUcmVlIGV4dGVuZHMgTmFtZU9yTnVtYmVyVHJlZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCwiTnVtcyIpfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuY2xlYXJHbG9iYWxDYWNoZXM9ZnVuY3Rpb24gY2xlYXJHbG9iYWxDYWNoZXMoKXsoMCxyLmNsZWFyUHJpbWl0aXZlQ2FjaGVzKSgpOygwLG4uY2xlYXJVbmljb2RlQ2FjaGVzKSgpfTt2YXIgcj1hKDE1MCksbj1hKDE5MCl9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuRmlsZVNwZWM9dm9pZCAwO3ZhciByPWEoMTQ0KSxuPWEoMTUxKSxpPWEoMTUwKTtmdW5jdGlvbiBwaWNrUGxhdGZvcm1JdGVtKGUpe3JldHVybiBlLmhhcygiVUYiKT9lLmdldCgiVUYiKTplLmhhcygiRiIpP2UuZ2V0KCJGIik6ZS5oYXMoIlVuaXgiKT9lLmdldCgiVW5peCIpOmUuaGFzKCJNYWMiKT9lLmdldCgiTWFjIik6ZS5oYXMoIkRPUyIpP2UuZ2V0KCJET1MiKTpudWxsfXQuRmlsZVNwZWM9Y2xhc3MgRmlsZVNwZWN7Y29uc3RydWN0b3IoZSx0KXtpZihlIGluc3RhbmNlb2YgaS5EaWN0KXt0aGlzLnhyZWY9dDt0aGlzLnJvb3Q9ZTtlLmhhcygiRlMiKSYmKHRoaXMuZnM9ZS5nZXQoIkZTIikpO3RoaXMuZGVzY3JpcHRpb249ZS5oYXMoIkRlc2MiKT8oMCxyLnN0cmluZ1RvUERGU3RyaW5nKShlLmdldCgiRGVzYyIpKToiIjtlLmhhcygiUkYiKSYmKDAsci53YXJuKSgiUmVsYXRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7dGhpcy5jb250ZW50QXZhaWxhYmxlPSEwO2lmKCFlLmhhcygiRUYiKSl7dGhpcy5jb250ZW50QXZhaWxhYmxlPSExOygwLHIud2FybikoIk5vbi1lbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIil9fX1nZXQgZmlsZW5hbWUoKXtpZighdGhpcy5fZmlsZW5hbWUmJnRoaXMucm9vdCl7Y29uc3QgZT1waWNrUGxhdGZvcm1JdGVtKHRoaXMucm9vdCl8fCJ1bm5hbWVkIjt0aGlzLl9maWxlbmFtZT0oMCxyLnN0cmluZ1RvUERGU3RyaW5nKShlKS5yZXBsYWNlQWxsKCJcXFxcIiwiXFwiKS5yZXBsYWNlQWxsKCJcXC8iLCIvIikucmVwbGFjZUFsbCgiXFwiLCIvIil9cmV0dXJuIHRoaXMuX2ZpbGVuYW1lfWdldCBjb250ZW50KCl7aWYoIXRoaXMuY29udGVudEF2YWlsYWJsZSlyZXR1cm4gbnVsbDshdGhpcy5jb250ZW50UmVmJiZ0aGlzLnJvb3QmJih0aGlzLmNvbnRlbnRSZWY9cGlja1BsYXRmb3JtSXRlbSh0aGlzLnJvb3QuZ2V0KCJFRiIpKSk7bGV0IGU9bnVsbDtpZih0aGlzLmNvbnRlbnRSZWYpe2NvbnN0IHQ9dGhpcy54cmVmLmZldGNoSWZSZWYodGhpcy5jb250ZW50UmVmKTt0IGluc3RhbmNlb2Ygbi5CYXNlU3RyZWFtP2U9dC5nZXRCeXRlcygpOigwLHIud2FybikoIkVtYmVkZGVkIGZpbGUgc3BlY2lmaWNhdGlvbiBwb2ludHMgdG8gbm9uLWV4aXN0aW5nL2ludmFsaWQgY29udGVudCIpfWVsc2UoMCxyLndhcm4pKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgaGF2ZSBhIGNvbnRlbnQiKTtyZXR1cm4gZX1nZXQgc2VyaWFsaXphYmxlKCl7cmV0dXJue2ZpbGVuYW1lOnRoaXMuZmlsZW5hbWUsY29udGVudDp0aGlzLmNvbnRlbnR9fX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuTWV0YWRhdGFQYXJzZXI9dm9pZCAwO2EoMik7YSgxMzkpO3ZhciByPWEoMjE3KTt0Lk1ldGFkYXRhUGFyc2VyPWNsYXNzIE1ldGFkYXRhUGFyc2Vye2NvbnN0cnVjdG9yKGUpe2U9dGhpcy5fcmVwYWlyKGUpO2NvbnN0IHQ9bmV3IHIuU2ltcGxlWE1MUGFyc2VyKHtsb3dlckNhc2VOYW1lOiEwfSkucGFyc2VGcm9tU3RyaW5nKGUpO3RoaXMuX21ldGFkYXRhTWFwPW5ldyBNYXA7dGhpcy5fZGF0YT1lO3QmJnRoaXMuX3BhcnNlKHQpfV9yZXBhaXIoZSl7cmV0dXJuIGUucmVwbGFjZSgvXltePF0rLywiIikucmVwbGFjZUFsbCgvPlxcMzc2XFwzNzcoW148XSspL2csKGZ1bmN0aW9uKGUsdCl7Y29uc3QgYT10LnJlcGxhY2VBbGwoL1xcKFswLTNdKShbMC03XSkoWzAtN10pL2csKGZ1bmN0aW9uKGUsdCxhLHIpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDY0KnQrOCphKzEqcil9KSkucmVwbGFjZUFsbCgvJihhbXB8YXBvc3xndHxsdHxxdW90KTsvZywoZnVuY3Rpb24oZSx0KXtzd2l0Y2godCl7Y2FzZSJhbXAiOnJldHVybiImIjtjYXNlImFwb3MiOnJldHVybiInIjtjYXNlImd0IjpyZXR1cm4iPiI7Y2FzZSJsdCI6cmV0dXJuIjwiO2Nhc2UicXVvdCI6cmV0dXJuJyInfXRocm93IG5ldyBFcnJvcihgX3JlcGFpcjogJHt0fSBpc24ndCBkZWZpbmVkLmApfSkpLHI9WyI+Il07Zm9yKGxldCBlPTAsdD1hLmxlbmd0aDtlPHQ7ZSs9Mil7Y29uc3QgdD0yNTYqYS5jaGFyQ29kZUF0KGUpK2EuY2hhckNvZGVBdChlKzEpO3Q+PTMyJiZ0PDEyNyYmNjAhPT10JiY2MiE9PXQmJjM4IT09dD9yLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh0KSk6ci5wdXNoKCImI3giKyg2NTUzNit0KS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpKyI7Iil9cmV0dXJuIHIuam9pbigiIil9KSl9X2dldFNlcXVlbmNlKGUpe2NvbnN0IHQ9ZS5ub2RlTmFtZTtyZXR1cm4icmRmOmJhZyIhPT10JiYicmRmOnNlcSIhPT10JiYicmRmOmFsdCIhPT10P251bGw6ZS5jaGlsZE5vZGVzLmZpbHRlcigoZT0+InJkZjpsaSI9PT1lLm5vZGVOYW1lKSl9X3BhcnNlQXJyYXkoZSl7aWYoIWUuaGFzQ2hpbGROb2RlcygpKXJldHVybjtjb25zdFt0XT1lLmNoaWxkTm9kZXMsYT10aGlzLl9nZXRTZXF1ZW5jZSh0KXx8W107dGhpcy5fbWV0YWRhdGFNYXAuc2V0KGUubm9kZU5hbWUsYS5tYXAoKGU9PmUudGV4dENvbnRlbnQudHJpbSgpKSkpfV9wYXJzZShlKXtsZXQgdD1lLmRvY3VtZW50RWxlbWVudDtpZigicmRmOnJkZiIhPT10Lm5vZGVOYW1lKXt0PXQuZmlyc3RDaGlsZDtmb3IoO3QmJiJyZGY6cmRmIiE9PXQubm9kZU5hbWU7KXQ9dC5uZXh0U2libGluZ31pZih0JiYicmRmOnJkZiI9PT10Lm5vZGVOYW1lJiZ0Lmhhc0NoaWxkTm9kZXMoKSlmb3IoY29uc3QgZSBvZiB0LmNoaWxkTm9kZXMpaWYoInJkZjpkZXNjcmlwdGlvbiI9PT1lLm5vZGVOYW1lKWZvcihjb25zdCB0IG9mIGUuY2hpbGROb2Rlcyl7Y29uc3QgZT10Lm5vZGVOYW1lO3N3aXRjaChlKXtjYXNlIiN0ZXh0Ijpjb250aW51ZTtjYXNlImRjOmNyZWF0b3IiOmNhc2UiZGM6c3ViamVjdCI6dGhpcy5fcGFyc2VBcnJheSh0KTtjb250aW51ZX10aGlzLl9tZXRhZGF0YU1hcC5zZXQoZSx0LnRleHRDb250ZW50LnRyaW0oKSl9fWdldCBzZXJpYWxpemFibGUoKXtyZXR1cm57cGFyc2VkRGF0YTp0aGlzLl9tZXRhZGF0YU1hcCxyYXdEYXRhOnRoaXMuX2RhdGF9fX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuU3RydWN0VHJlZVJvb3Q9dC5TdHJ1Y3RUcmVlUGFnZT12b2lkIDA7YSgxMzkpO3ZhciByPWEoMTUwKSxuPWEoMTQ0KSxpPWEoMjIxKTtjb25zdCBzPSJQQUdFX0NPTlRFTlQiLG89IlNUUkVBTV9DT05URU5UIixjPSJPQkpFQ1QiLGw9IkVMRU1FTlQiO3QuU3RydWN0VHJlZVJvb3Q9Y2xhc3MgU3RydWN0VHJlZVJvb3R7Y29uc3RydWN0b3IoZSl7dGhpcy5kaWN0PWU7dGhpcy5yb2xlTWFwPW5ldyBNYXB9aW5pdCgpe3RoaXMucmVhZFJvbGVNYXAoKX1yZWFkUm9sZU1hcCgpe2NvbnN0IGU9dGhpcy5kaWN0LmdldCgiUm9sZU1hcCIpO2UgaW5zdGFuY2VvZiByLkRpY3QmJmUuZm9yRWFjaCgoKGUsdCk9Pnt0IGluc3RhbmNlb2Ygci5OYW1lJiZ0aGlzLnJvbGVNYXAuc2V0KGUsdC5uYW1lKX0pKX19O2NsYXNzIFN0cnVjdEVsZW1lbnROb2Rle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50cmVlPWU7dGhpcy5kaWN0PXQ7dGhpcy5raWRzPVtdO3RoaXMucGFyc2VLaWRzKCl9Z2V0IHJvbGUoKXtjb25zdCBlPXRoaXMuZGljdC5nZXQoIlMiKSx0PWUgaW5zdGFuY2VvZiByLk5hbWU/ZS5uYW1lOiIiLHtyb290OmF9PXRoaXMudHJlZTtyZXR1cm4gYS5yb2xlTWFwLmhhcyh0KT9hLnJvbGVNYXAuZ2V0KHQpOnR9cGFyc2VLaWRzKCl7bGV0IGU9bnVsbDtjb25zdCB0PXRoaXMuZGljdC5nZXRSYXcoIlBnIik7dCBpbnN0YW5jZW9mIHIuUmVmJiYoZT10LnRvU3RyaW5nKCkpO2NvbnN0IGE9dGhpcy5kaWN0LmdldCgiSyIpO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKGNvbnN0IHQgb2YgYSl7Y29uc3QgYT10aGlzLnBhcnNlS2lkKGUsdCk7YSYmdGhpcy5raWRzLnB1c2goYSl9ZWxzZXtjb25zdCB0PXRoaXMucGFyc2VLaWQoZSxhKTt0JiZ0aGlzLmtpZHMucHVzaCh0KX19cGFyc2VLaWQoZSx0KXtpZihOdW1iZXIuaXNJbnRlZ2VyKHQpKXJldHVybiB0aGlzLnRyZWUucGFnZURpY3Qub2JqSWQhPT1lP251bGw6bmV3IFN0cnVjdEVsZW1lbnQoe3R5cGU6cyxtY2lkOnQscGFnZU9iaklkOmV9KTtsZXQgYT1udWxsO3QgaW5zdGFuY2VvZiByLlJlZj9hPXRoaXMuZGljdC54cmVmLmZldGNoKHQpOnQgaW5zdGFuY2VvZiByLkRpY3QmJihhPXQpO2lmKCFhKXJldHVybiBudWxsO2NvbnN0IG49YS5nZXRSYXcoIlBnIik7biBpbnN0YW5jZW9mIHIuUmVmJiYoZT1uLnRvU3RyaW5nKCkpO2NvbnN0IGk9YS5nZXQoIlR5cGUiKWluc3RhbmNlb2Ygci5OYW1lP2EuZ2V0KCJUeXBlIikubmFtZTpudWxsO3JldHVybiJNQ1IiPT09aT90aGlzLnRyZWUucGFnZURpY3Qub2JqSWQhPT1lP251bGw6bmV3IFN0cnVjdEVsZW1lbnQoe3R5cGU6byxyZWZPYmpJZDphLmdldFJhdygiU3RtIilpbnN0YW5jZW9mIHIuUmVmP2EuZ2V0UmF3KCJTdG0iKS50b1N0cmluZygpOm51bGwscGFnZU9iaklkOmUsbWNpZDphLmdldCgiTUNJRCIpfSk6Ik9CSlIiPT09aT90aGlzLnRyZWUucGFnZURpY3Qub2JqSWQhPT1lP251bGw6bmV3IFN0cnVjdEVsZW1lbnQoe3R5cGU6YyxyZWZPYmpJZDphLmdldFJhdygiT2JqIilpbnN0YW5jZW9mIHIuUmVmP2EuZ2V0UmF3KCJPYmoiKS50b1N0cmluZygpOm51bGwscGFnZU9iaklkOmV9KTpuZXcgU3RydWN0RWxlbWVudCh7dHlwZTpsLGRpY3Q6YX0pfX1jbGFzcyBTdHJ1Y3RFbGVtZW50e2NvbnN0cnVjdG9yKGUpe2xldHt0eXBlOnQsZGljdDphPW51bGwsbWNpZDpyPW51bGwscGFnZU9iaklkOm49bnVsbCxyZWZPYmpJZDppPW51bGx9PWU7dGhpcy50eXBlPXQ7dGhpcy5kaWN0PWE7dGhpcy5tY2lkPXI7dGhpcy5wYWdlT2JqSWQ9bjt0aGlzLnJlZk9iaklkPWk7dGhpcy5wYXJlbnROb2RlPW51bGx9fXQuU3RydWN0VHJlZVBhZ2U9Y2xhc3MgU3RydWN0VHJlZVBhZ2V7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnJvb3Q9ZTt0aGlzLnJvb3REaWN0PWU/ZS5kaWN0Om51bGw7dGhpcy5wYWdlRGljdD10O3RoaXMubm9kZXM9W119cGFyc2UoKXtpZighdGhpcy5yb290fHwhdGhpcy5yb290RGljdClyZXR1cm47Y29uc3QgZT10aGlzLnJvb3REaWN0LmdldCgiUGFyZW50VHJlZSIpO2lmKCFlKXJldHVybjtjb25zdCB0PXRoaXMucGFnZURpY3QuZ2V0KCJTdHJ1Y3RQYXJlbnRzIik7aWYoIU51bWJlci5pc0ludGVnZXIodCkpcmV0dXJuO2NvbnN0IGE9bmV3IGkuTnVtYmVyVHJlZShlLHRoaXMucm9vdERpY3QueHJlZikuZ2V0KHQpO2lmKCFBcnJheS5pc0FycmF5KGEpKXJldHVybjtjb25zdCBuPW5ldyBNYXA7Zm9yKGNvbnN0IGUgb2YgYSllIGluc3RhbmNlb2Ygci5SZWYmJnRoaXMuYWRkTm9kZSh0aGlzLnJvb3REaWN0LnhyZWYuZmV0Y2goZSksbil9YWRkTm9kZShlLHQpe2xldCBhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTowO2lmKGE+NDApeygwLG4ud2FybikoIlN0cnVjdFRyZWUgTUFYX0RFUFRIIHJlYWNoZWQuIik7cmV0dXJuIG51bGx9aWYodC5oYXMoZSkpcmV0dXJuIHQuZ2V0KGUpO2NvbnN0IGk9bmV3IFN0cnVjdEVsZW1lbnROb2RlKHRoaXMsZSk7dC5zZXQoZSxpKTtjb25zdCBzPWUuZ2V0KCJQIik7aWYoIXN8fCgwLHIuaXNOYW1lKShzLmdldCgiVHlwZSIpLCJTdHJ1Y3RUcmVlUm9vdCIpKXt0aGlzLmFkZFRvcExldmVsTm9kZShlLGkpfHx0LmRlbGV0ZShlKTtyZXR1cm4gaX1jb25zdCBvPXRoaXMuYWRkTm9kZShzLHQsYSsxKTtpZighbylyZXR1cm4gaTtsZXQgYz0hMTtmb3IoY29uc3QgdCBvZiBvLmtpZHMpaWYodC50eXBlPT09bCYmdC5kaWN0PT09ZSl7dC5wYXJlbnROb2RlPWk7Yz0hMH1jfHx0LmRlbGV0ZShlKTtyZXR1cm4gaX1hZGRUb3BMZXZlbE5vZGUoZSx0KXtjb25zdCBhPXRoaXMucm9vdERpY3QuZ2V0KCJLIik7aWYoIWEpcmV0dXJuITE7aWYoYSBpbnN0YW5jZW9mIHIuRGljdCl7aWYoYS5vYmpJZCE9PWUub2JqSWQpcmV0dXJuITE7dGhpcy5ub2Rlc1swXT10O3JldHVybiEwfWlmKCFBcnJheS5pc0FycmF5KGEpKXJldHVybiEwO2xldCBuPSExO2ZvcihsZXQgcj0wO3I8YS5sZW5ndGg7cisrKXtjb25zdCBpPWFbcl07aWYoaT8udG9TdHJpbmcoKT09PWUub2JqSWQpe3RoaXMubm9kZXNbcl09dDtuPSEwfX1yZXR1cm4gbn1nZXQgc2VyaWFsaXphYmxlKCl7ZnVuY3Rpb24gbm9kZVRvU2VyaWFsaXphYmxlKGUsdCl7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOjA7aWYoYT40MCl7KDAsbi53YXJuKSgiU3RydWN0VHJlZSB0b28gZGVlcCB0byBiZSBmdWxseSBzZXJpYWxpemVkLiIpO3JldHVybn1jb25zdCByPU9iamVjdC5jcmVhdGUobnVsbCk7ci5yb2xlPWUucm9sZTtyLmNoaWxkcmVuPVtdO3QuY2hpbGRyZW4ucHVzaChyKTtjb25zdCBpPWUuZGljdC5nZXQoIkFsdCIpOyJzdHJpbmciPT10eXBlb2YgaSYmKHIuYWx0PSgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGkpKTtjb25zdCBoPWUuZGljdC5nZXQoIkxhbmciKTsic3RyaW5nIj09dHlwZW9mIGgmJihyLmxhbmc9KDAsbi5zdHJpbmdUb1BERlN0cmluZykoaCkpO2Zvcihjb25zdCB0IG9mIGUua2lkcyl7Y29uc3QgZT10LnR5cGU9PT1sP3QucGFyZW50Tm9kZTpudWxsO2U/bm9kZVRvU2VyaWFsaXphYmxlKGUscixhKzEpOnQudHlwZT09PXN8fHQudHlwZT09PW8/ci5jaGlsZHJlbi5wdXNoKHt0eXBlOiJjb250ZW50IixpZDpgcCR7dC5wYWdlT2JqSWR9X21jJHt0Lm1jaWR9YH0pOnQudHlwZT09PWMmJnIuY2hpbGRyZW4ucHVzaCh7dHlwZToib2JqZWN0IixpZDp0LnJlZk9iaklkfSl9fWNvbnN0IGU9T2JqZWN0LmNyZWF0ZShudWxsKTtlLmNoaWxkcmVuPVtdO2Uucm9sZT0iUm9vdCI7Zm9yKGNvbnN0IHQgb2YgdGhpcy5ub2Rlcyl0JiZub2RlVG9TZXJpYWxpemFibGUodCxlKTtyZXR1cm4gZX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0Lk9iamVjdExvYWRlcj12b2lkIDA7YSgxMzkpO3ZhciByPWEoMTUwKSxuPWEoMTUxKSxpPWEoMTQ5KSxzPWEoMTQ0KTtmdW5jdGlvbiBhZGRDaGlsZHJlbihlLHQpe2lmKGUgaW5zdGFuY2VvZiByLkRpY3QpZT1lLmdldFJhd1ZhbHVlcygpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIG4uQmFzZVN0cmVhbSllPWUuZGljdC5nZXRSYXdWYWx1ZXMoKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybjtmb3IoY29uc3QgaSBvZiBlKSgoYT1pKWluc3RhbmNlb2Ygci5SZWZ8fGEgaW5zdGFuY2VvZiByLkRpY3R8fGEgaW5zdGFuY2VvZiBuLkJhc2VTdHJlYW18fEFycmF5LmlzQXJyYXkoYSkpJiZ0LnB1c2goaSk7dmFyIGF9dC5PYmplY3RMb2FkZXI9Y2xhc3MgT2JqZWN0TG9hZGVye2NvbnN0cnVjdG9yKGUsdCxhKXt0aGlzLmRpY3Q9ZTt0aGlzLmtleXM9dDt0aGlzLnhyZWY9YTt0aGlzLnJlZlNldD1udWxsfWFzeW5jIGxvYWQoKXtpZih0aGlzLnhyZWYuc3RyZWFtLmlzRGF0YUxvYWRlZClyZXR1cm47Y29uc3R7a2V5czplLGRpY3Q6dH09dGhpczt0aGlzLnJlZlNldD1uZXcgci5SZWZTZXQ7Y29uc3QgYT1bXTtmb3IoY29uc3QgciBvZiBlKXtjb25zdCBlPXQuZ2V0UmF3KHIpO3ZvaWQgMCE9PWUmJmEucHVzaChlKX1yZXR1cm4gdGhpcy5fd2FsayhhKX1hc3luYyBfd2FsayhlKXtjb25zdCB0PVtdLGE9W107Zm9yKDtlLmxlbmd0aDspe2xldCBvPWUucG9wKCk7aWYobyBpbnN0YW5jZW9mIHIuUmVmKXtpZih0aGlzLnJlZlNldC5oYXMobykpY29udGludWU7dHJ5e3RoaXMucmVmU2V0LnB1dChvKTtvPXRoaXMueHJlZi5mZXRjaChvKX1jYXRjaChlKXtpZighKGUgaW5zdGFuY2VvZiBpLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSl7KDAscy53YXJuKShgT2JqZWN0TG9hZGVyLl93YWxrIC0gcmVxdWVzdGluZyBhbGwgZGF0YTogIiR7ZX0iLmApO3RoaXMucmVmU2V0PW51bGw7Y29uc3R7bWFuYWdlcjp0fT10aGlzLnhyZWYuc3RyZWFtO3JldHVybiB0LnJlcXVlc3RBbGxDaHVua3MoKX10LnB1c2gobyk7YS5wdXNoKHtiZWdpbjplLmJlZ2luLGVuZDplLmVuZH0pfX1pZihvIGluc3RhbmNlb2Ygbi5CYXNlU3RyZWFtKXtjb25zdCBlPW8uZ2V0QmFzZVN0cmVhbXMoKTtpZihlKXtsZXQgcj0hMTtmb3IoY29uc3QgdCBvZiBlKWlmKCF0LmlzRGF0YUxvYWRlZCl7cj0hMDthLnB1c2goe2JlZ2luOnQuc3RhcnQsZW5kOnQuZW5kfSl9ciYmdC5wdXNoKG8pfX1hZGRDaGlsZHJlbihvLGUpfWlmKGEubGVuZ3RoKXthd2FpdCB0aGlzLnhyZWYuc3RyZWFtLm1hbmFnZXIucmVxdWVzdFJhbmdlcyhhKTtmb3IoY29uc3QgZSBvZiB0KWUgaW5zdGFuY2VvZiByLlJlZiYmdGhpcy5yZWZTZXQucmVtb3ZlKGUpO3JldHVybiB0aGlzLl93YWxrKHQpfXRoaXMucmVmU2V0PW51bGx9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5YRkFGYWN0b3J5PXZvaWQgMDthKDEzOSk7dmFyIHI9YSgyMjgpLG49YSgyMjkpLGk9YSgyNDIpLHM9YSgyMzgpLG89YSgyMzcpLGM9YSgxNDQpLGw9YSgyNDMpLGg9YSgyNTMpO2NsYXNzIFhGQUZhY3Rvcnl7Y29uc3RydWN0b3IoZSl7dHJ5e3RoaXMucm9vdD0obmV3IGwuWEZBUGFyc2VyKS5wYXJzZShYRkFGYWN0b3J5Ll9jcmVhdGVEb2N1bWVudChlKSk7Y29uc3QgdD1uZXcgbi5CaW5kZXIodGhpcy5yb290KTt0aGlzLmZvcm09dC5iaW5kKCk7dGhpcy5kYXRhSGFuZGxlcj1uZXcgaS5EYXRhSGFuZGxlcih0aGlzLnJvb3QsdC5nZXREYXRhKCkpO3RoaXMuZm9ybVtyLiRnbG9iYWxEYXRhXS50ZW1wbGF0ZT10aGlzLmZvcm19Y2F0Y2goZSl7KDAsYy53YXJuKShgWEZBIC0gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcgYW5kIGJpbmRpbmc6ICR7ZX1gKX19aXNWYWxpZCgpe3JldHVybiB0aGlzLnJvb3QmJnRoaXMuZm9ybX1fY3JlYXRlUGFnZXNIZWxwZXIoKXtjb25zdCBlPXRoaXMuZm9ybVtyLiR0b1BhZ2VzXSgpO3JldHVybiBuZXcgUHJvbWlzZSgoKHQsYSk9Pntjb25zdCBuZXh0SXRlcmF0aW9uPSgpPT57dHJ5e2NvbnN0IGE9ZS5uZXh0KCk7YS5kb25lP3QoYS52YWx1ZSk6c2V0VGltZW91dChuZXh0SXRlcmF0aW9uLDApfWNhdGNoKGUpe2EoZSl9fTtzZXRUaW1lb3V0KG5leHRJdGVyYXRpb24sMCl9KSl9YXN5bmMgX2NyZWF0ZVBhZ2VzKCl7dHJ5e3RoaXMucGFnZXM9YXdhaXQgdGhpcy5fY3JlYXRlUGFnZXNIZWxwZXIoKTt0aGlzLmRpbXM9dGhpcy5wYWdlcy5jaGlsZHJlbi5tYXAoKGU9Pntjb25zdHt3aWR0aDp0LGhlaWdodDphfT1lLmF0dHJpYnV0ZXMuc3R5bGU7cmV0dXJuWzAsMCxwYXJzZUludCh0KSxwYXJzZUludChhKV19KSl9Y2F0Y2goZSl7KDAsYy53YXJuKShgWEZBIC0gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGxheW91dDogJHtlfWApfX1nZXRCb3VuZGluZ0JveChlKXtyZXR1cm4gdGhpcy5kaW1zW2VdfWFzeW5jIGdldE51bVBhZ2VzKCl7dGhpcy5wYWdlc3x8YXdhaXQgdGhpcy5fY3JlYXRlUGFnZXMoKTtyZXR1cm4gdGhpcy5kaW1zLmxlbmd0aH1zZXRJbWFnZXMoZSl7dGhpcy5mb3JtW3IuJGdsb2JhbERhdGFdLmltYWdlcz1lfXNldEZvbnRzKGUpe3RoaXMuZm9ybVtyLiRnbG9iYWxEYXRhXS5mb250RmluZGVyPW5ldyBzLkZvbnRGaW5kZXIoZSk7Y29uc3QgdD1bXTtmb3IobGV0IGUgb2YgdGhpcy5mb3JtW3IuJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMpe2U9KDAsby5zdHJpcFF1b3RlcykoZSk7dGhpcy5mb3JtW3IuJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuZmluZChlKXx8dC5wdXNoKGUpfXJldHVybiB0Lmxlbmd0aD4wP3Q6bnVsbH1hcHBlbmRGb250cyhlLHQpe3RoaXMuZm9ybVtyLiRnbG9iYWxEYXRhXS5mb250RmluZGVyLmFkZChlLHQpfWFzeW5jIGdldFBhZ2VzKCl7dGhpcy5wYWdlc3x8YXdhaXQgdGhpcy5fY3JlYXRlUGFnZXMoKTtjb25zdCBlPXRoaXMucGFnZXM7dGhpcy5wYWdlcz1udWxsO3JldHVybiBlfXNlcmlhbGl6ZURhdGEoZSl7cmV0dXJuIHRoaXMuZGF0YUhhbmRsZXIuc2VyaWFsaXplKGUpfXN0YXRpYyBfY3JlYXRlRG9jdW1lbnQoZSl7cmV0dXJuIGVbIi94ZHA6eGRwIl0/T2JqZWN0LnZhbHVlcyhlKS5qb2luKCIiKTplWyJ4ZHA6eGRwIl19c3RhdGljIGdldFJpY2hUZXh0QXNIdG1sKGUpe2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e2xldCB0PW5ldyBsLlhGQVBhcnNlcihoLlhodG1sTmFtZXNwYWNlLCEwKS5wYXJzZShlKTtpZighWyJib2R5IiwieGh0bWwiXS5pbmNsdWRlcyh0W3IuJG5vZGVOYW1lXSkpe2NvbnN0IGU9aC5YaHRtbE5hbWVzcGFjZS5ib2R5KHt9KTtlW3IuJGFwcGVuZENoaWxkXSh0KTt0PWV9Y29uc3QgYT10W3IuJHRvSFRNTF0oKTtpZighYS5zdWNjZXNzKXJldHVybiBudWxsO2NvbnN0e2h0bWw6bn09YSx7YXR0cmlidXRlczppfT1uO2lmKGkpe2kuY2xhc3MmJihpLmNsYXNzPWkuY2xhc3MuZmlsdGVyKChlPT4hZS5zdGFydHNXaXRoKCJ4ZmEiKSkpKTtpLmRpcj0iYXV0byJ9cmV0dXJue2h0bWw6bixzdHI6dFtyLiR0ZXh0XSgpfX1jYXRjaChlKXsoMCxjLndhcm4pKGBYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBvZiByaWNoIHRleHQ6ICR7ZX1gKX1yZXR1cm4gbnVsbH19dC5YRkFGYWN0b3J5PVhGQUZhY3Rvcnl9LChlLHQpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LiR1aWQ9dC4kdG9TdHlsZT10LiR0b1N0cmluZz10LiR0b1BhZ2VzPXQuJHRvSFRNTD10LiR0ZXh0PXQuJHRhYkluZGV4PXQuJHNldFZhbHVlPXQuJHNldFNldEF0dHJpYnV0ZXM9dC4kc2V0SWQ9dC4kc2VhcmNoTm9kZT10LiRyb290PXQuJHJlc29sdmVQcm90b3R5cGVzPXQuJHJlbW92ZUNoaWxkPXQuJHB1c2hQYXJhPXQuJHB1c2hHbHlwaHM9dC4kcG9wUGFyYT10LiRvblRleHQ9dC4kb25DaGlsZENoZWNrPXQuJG9uQ2hpbGQ9dC4kbnNBdHRyaWJ1dGVzPXQuJG5vZGVOYW1lPXQuJG5hbWVzcGFjZUlkPXQuJGxhc3RBdHRyaWJ1dGU9dC4kaXNVc2FibGU9dC4kaXNUcmFuc3BhcmVudD10LiRpc1RoZXJlTW9yZVdpZHRoPXQuJGlzU3BsaXR0YWJsZT10LiRpc05zQWdub3N0aWM9dC4kaXNEZXNjZW5kZW50PXQuJGlzRGF0YVZhbHVlPXQuJGlzQ0RBVEFYbWw9dC4kaXNCaW5kYWJsZT10LiRpbnNlcnRBdD10LiRpbmRleE9mPXQuJGlkcz10LiRoYXNTZXR0YWJsZVZhbHVlPXQuJGdsb2JhbERhdGE9dC4kZ2V0VGVtcGxhdGVSb290PXQuJGdldFN1YmZvcm1QYXJlbnQ9dC4kZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXQ9dC4kZ2V0UGFyZW50PXQuJGdldE5leHRQYWdlPXQuJGdldEV4dHJhPXQuJGdldERhdGFWYWx1ZT10LiRnZXRDb250YWluZWRDaGlsZHJlbj10LiRnZXRDaGlsZHJlbkJ5TmFtZUl0PXQuJGdldENoaWxkcmVuQnlOYW1lPXQuJGdldENoaWxkcmVuQnlDbGFzcz10LiRnZXRDaGlsZHJlbj10LiRnZXRBdmFpbGFibGVTcGFjZT10LiRnZXRBdHRyaWJ1dGVzPXQuJGdldEF0dHJpYnV0ZUl0PXQuJGZsdXNoSFRNTD10LiRmaW5hbGl6ZT10LiRleHRyYT10LiRkdW1wPXQuJGRhdGE9dC4kY29udGVudD10LiRjb25zdW1lZD10LiRjbG9uZT10LiRjbGVhbnVwPXQuJGNsZWFuUGFnZT10LiRjbGVhbj10LiRjaGlsZHJlblRvSFRNTD10LiRhcHBlbmRDaGlsZD10LiRhZGRIVE1MPXQuJGFjY2VwdFdoaXRlc3BhY2U9dm9pZCAwO2NvbnN0IGE9U3ltYm9sKCk7dC4kYWNjZXB0V2hpdGVzcGFjZT1hO2NvbnN0IHI9U3ltYm9sKCk7dC4kYWRkSFRNTD1yO2NvbnN0IG49U3ltYm9sKCk7dC4kYXBwZW5kQ2hpbGQ9bjtjb25zdCBpPVN5bWJvbCgpO3QuJGNoaWxkcmVuVG9IVE1MPWk7Y29uc3Qgcz1TeW1ib2woKTt0LiRjbGVhbj1zO2NvbnN0IG89U3ltYm9sKCk7dC4kY2xlYW5QYWdlPW87Y29uc3QgYz1TeW1ib2woKTt0LiRjbGVhbnVwPWM7Y29uc3QgbD1TeW1ib2woKTt0LiRjbG9uZT1sO2NvbnN0IGg9U3ltYm9sKCk7dC4kY29uc3VtZWQ9aDtjb25zdCB1PVN5bWJvbCgiY29udGVudCIpO3QuJGNvbnRlbnQ9dTtjb25zdCBkPVN5bWJvbCgiZGF0YSIpO3QuJGRhdGE9ZDtjb25zdCBmPVN5bWJvbCgpO3QuJGR1bXA9Zjtjb25zdCBnPVN5bWJvbCgiZXh0cmEiKTt0LiRleHRyYT1nO2NvbnN0IHA9U3ltYm9sKCk7dC4kZmluYWxpemU9cDtjb25zdCBtPVN5bWJvbCgpO3QuJGZsdXNoSFRNTD1tO2NvbnN0IGI9U3ltYm9sKCk7dC4kZ2V0QXR0cmlidXRlSXQ9Yjtjb25zdCB5PVN5bWJvbCgpO3QuJGdldEF0dHJpYnV0ZXM9eTtjb25zdCB3PVN5bWJvbCgpO3QuJGdldEF2YWlsYWJsZVNwYWNlPXc7Y29uc3QgUz1TeW1ib2woKTt0LiRnZXRDaGlsZHJlbkJ5Q2xhc3M9Uztjb25zdCB4PVN5bWJvbCgpO3QuJGdldENoaWxkcmVuQnlOYW1lPXg7Y29uc3QgQz1TeW1ib2woKTt0LiRnZXRDaGlsZHJlbkJ5TmFtZUl0PUM7Y29uc3Qgdj1TeW1ib2woKTt0LiRnZXREYXRhVmFsdWU9djtjb25zdCBrPVN5bWJvbCgpO3QuJGdldEV4dHJhPWs7Y29uc3QgTz1TeW1ib2woKTt0LiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdD1PO2NvbnN0IFQ9U3ltYm9sKCk7dC4kZ2V0Q2hpbGRyZW49VDtjb25zdCBNPVN5bWJvbCgpO3QuJGdldENvbnRhaW5lZENoaWxkcmVuPU07Y29uc3QgRT1TeW1ib2woKTt0LiRnZXROZXh0UGFnZT1FO2NvbnN0IEQ9U3ltYm9sKCk7dC4kZ2V0U3ViZm9ybVBhcmVudD1EO2NvbnN0IE49U3ltYm9sKCk7dC4kZ2V0UGFyZW50PU47Y29uc3QgUj1TeW1ib2woKTt0LiRnZXRUZW1wbGF0ZVJvb3Q9Ujtjb25zdCBMPVN5bWJvbCgpO3QuJGdsb2JhbERhdGE9TDtjb25zdCAkPVN5bWJvbCgpO3QuJGhhc1NldHRhYmxlVmFsdWU9JDtjb25zdCBfPVN5bWJvbCgpO3QuJGlkcz1fO2NvbnN0IGo9U3ltYm9sKCk7dC4kaW5kZXhPZj1qO2NvbnN0IFU9U3ltYm9sKCk7dC4kaW5zZXJ0QXQ9VTtjb25zdCBYPVN5bWJvbCgpO3QuJGlzQ0RBVEFYbWw9WDtjb25zdCBIPVN5bWJvbCgpO3QuJGlzQmluZGFibGU9SDtjb25zdCBxPVN5bWJvbCgpO3QuJGlzRGF0YVZhbHVlPXE7Y29uc3Qgej1TeW1ib2woKTt0LiRpc0Rlc2NlbmRlbnQ9ejtjb25zdCBXPVN5bWJvbCgpO3QuJGlzTnNBZ25vc3RpYz1XO2NvbnN0IEc9U3ltYm9sKCk7dC4kaXNTcGxpdHRhYmxlPUc7Y29uc3QgVj1TeW1ib2woKTt0LiRpc1RoZXJlTW9yZVdpZHRoPVY7Y29uc3QgSz1TeW1ib2woKTt0LiRpc1RyYW5zcGFyZW50PUs7Y29uc3QgWT1TeW1ib2woKTt0LiRpc1VzYWJsZT1ZO2NvbnN0IEo9U3ltYm9sKCk7dC4kbGFzdEF0dHJpYnV0ZT1KO2NvbnN0IFo9U3ltYm9sKCJuYW1lc3BhY2VJZCIpO3QuJG5hbWVzcGFjZUlkPVo7Y29uc3QgUT1TeW1ib2woIm5vZGVOYW1lIik7dC4kbm9kZU5hbWU9UTtjb25zdCBlZT1TeW1ib2woKTt0LiRuc0F0dHJpYnV0ZXM9ZWU7Y29uc3QgdGU9U3ltYm9sKCk7dC4kb25DaGlsZD10ZTtjb25zdCBhZT1TeW1ib2woKTt0LiRvbkNoaWxkQ2hlY2s9YWU7Y29uc3QgcmU9U3ltYm9sKCk7dC4kb25UZXh0PXJlO2NvbnN0IG5lPVN5bWJvbCgpO3QuJHB1c2hHbHlwaHM9bmU7Y29uc3QgaWU9U3ltYm9sKCk7dC4kcG9wUGFyYT1pZTtjb25zdCBzZT1TeW1ib2woKTt0LiRwdXNoUGFyYT1zZTtjb25zdCBvZT1TeW1ib2woKTt0LiRyZW1vdmVDaGlsZD1vZTtjb25zdCBjZT1TeW1ib2woInJvb3QiKTt0LiRyb290PWNlO2NvbnN0IGxlPVN5bWJvbCgpO3QuJHJlc29sdmVQcm90b3R5cGVzPWxlO2NvbnN0IGhlPVN5bWJvbCgpO3QuJHNlYXJjaE5vZGU9aGU7Y29uc3QgdWU9U3ltYm9sKCk7dC4kc2V0SWQ9dWU7Y29uc3QgZGU9U3ltYm9sKCk7dC4kc2V0U2V0QXR0cmlidXRlcz1kZTtjb25zdCBmZT1TeW1ib2woKTt0LiRzZXRWYWx1ZT1mZTtjb25zdCBnZT1TeW1ib2woKTt0LiR0YWJJbmRleD1nZTtjb25zdCBwZT1TeW1ib2woKTt0LiR0ZXh0PXBlO2NvbnN0IG1lPVN5bWJvbCgpO3QuJHRvUGFnZXM9bWU7Y29uc3QgYmU9U3ltYm9sKCk7dC4kdG9IVE1MPWJlO2NvbnN0IHllPVN5bWJvbCgpO3QuJHRvU3RyaW5nPXllO2NvbnN0IHdlPVN5bWJvbCgpO3QuJHRvU3R5bGU9d2U7Y29uc3QgU2U9U3ltYm9sKCJ1aWQiKTt0LiR1aWQ9U2V9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQmluZGVyPXZvaWQgMDthKDEzOSk7dmFyIHI9YSgyMjgpLG49YSgyMzApLGk9YSgyNDEpLHM9YSgyNDApLG89YSgyMzQpLGM9YSgxNDQpO2NvbnN0IGw9by5OYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQ7ZnVuY3Rpb24gY3JlYXRlVGV4dChlKXtjb25zdCB0PW5ldyBuLlRleHQoe30pO3Rbci4kY29udGVudF09ZTtyZXR1cm4gdH10LkJpbmRlcj1jbGFzcyBCaW5kZXJ7Y29uc3RydWN0b3IoZSl7dGhpcy5yb290PWU7dGhpcy5kYXRhc2V0cz1lLmRhdGFzZXRzO3RoaXMuZGF0YT1lLmRhdGFzZXRzPy5kYXRhfHxuZXcgcy5YbWxPYmplY3Qoby5OYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQsImRhdGEiKTt0aGlzLmVtcHR5TWVyZ2U9MD09PXRoaXMuZGF0YVtyLiRnZXRDaGlsZHJlbl0oKS5sZW5ndGg7dGhpcy5yb290LmZvcm09dGhpcy5mb3JtPWUudGVtcGxhdGVbci4kY2xvbmVdKCl9X2lzQ29uc3VtZURhdGEoKXtyZXR1cm4hdGhpcy5lbXB0eU1lcmdlJiZ0aGlzLl9tZXJnZU1vZGV9X2lzTWF0Y2hUZW1wbGF0ZSgpe3JldHVybiF0aGlzLl9pc0NvbnN1bWVEYXRhKCl9YmluZCgpe3RoaXMuX2JpbmRFbGVtZW50KHRoaXMuZm9ybSx0aGlzLmRhdGEpO3JldHVybiB0aGlzLmZvcm19Z2V0RGF0YSgpe3JldHVybiB0aGlzLmRhdGF9X2JpbmRWYWx1ZShlLHQsYSl7ZVtyLiRkYXRhXT10O2lmKGVbci4kaGFzU2V0dGFibGVWYWx1ZV0oKSlpZih0W3IuJGlzRGF0YVZhbHVlXSgpKXtjb25zdCBhPXRbci4kZ2V0RGF0YVZhbHVlXSgpO2Vbci4kc2V0VmFsdWVdKGNyZWF0ZVRleHQoYSkpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIG4uRmllbGQmJiJtdWx0aVNlbGVjdCI9PT1lLnVpPy5jaG9pY2VMaXN0Py5vcGVuKXtjb25zdCBhPXRbci4kZ2V0Q2hpbGRyZW5dKCkubWFwKChlPT5lW3IuJGNvbnRlbnRdLnRyaW0oKSkpLmpvaW4oIlxuIik7ZVtyLiRzZXRWYWx1ZV0oY3JlYXRlVGV4dChhKSl9ZWxzZSB0aGlzLl9pc0NvbnN1bWVEYXRhKCkmJigwLGMud2FybikoIlhGQSAtIE5vZGVzIGhhdmVuJ3QgdGhlIHNhbWUgdHlwZS4iKTtlbHNlIXRbci4kaXNEYXRhVmFsdWVdKCl8fHRoaXMuX2lzTWF0Y2hUZW1wbGF0ZSgpP3RoaXMuX2JpbmRFbGVtZW50KGUsdCk6KDAsYy53YXJuKSgiWEZBIC0gTm9kZXMgaGF2ZW4ndCB0aGUgc2FtZSB0eXBlLiIpfV9maW5kRGF0YUJ5TmFtZVRvQ29uc3VtZShlLHQsYSxuKXtpZighZSlyZXR1cm4gbnVsbDtsZXQgaSxzO2ZvcihsZXQgbj0wO248MztuKyspe2k9YVtyLiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0oZSwhMSwhMCk7Zm9yKDs7KXtzPWkubmV4dCgpLnZhbHVlO2lmKCFzKWJyZWFrO2lmKHQ9PT1zW3IuJGlzRGF0YVZhbHVlXSgpKXJldHVybiBzfWlmKGFbci4kbmFtZXNwYWNlSWRdPT09by5OYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQmJiJkYXRhIj09PWFbci4kbm9kZU5hbWVdKWJyZWFrO2E9YVtyLiRnZXRQYXJlbnRdKCl9aWYoIW4pcmV0dXJuIG51bGw7aT10aGlzLmRhdGFbci4kZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGUsITAsITEpO3M9aS5uZXh0KCkudmFsdWU7aWYocylyZXR1cm4gcztpPXRoaXMuZGF0YVtyLiRnZXRBdHRyaWJ1dGVJdF0oZSwhMCk7cz1pLm5leHQoKS52YWx1ZTtyZXR1cm4gcz8uW3IuJGlzRGF0YVZhbHVlXSgpP3M6bnVsbH1fc2V0UHJvcGVydGllcyhlLHQpe2lmKGUuaGFzT3duUHJvcGVydHkoInNldFByb3BlcnR5IikpZm9yKGNvbnN0e3JlZjphLHRhcmdldDpvLGNvbm5lY3Rpb246bH1vZiBlLnNldFByb3BlcnR5LmNoaWxkcmVuKXtpZihsKWNvbnRpbnVlO2lmKCFhKWNvbnRpbnVlO2NvbnN0IGg9KDAsaS5zZWFyY2hOb2RlKSh0aGlzLnJvb3QsdCxhLCExLCExKTtpZighaCl7KDAsYy53YXJuKShgWEZBIC0gSW52YWxpZCByZWZlcmVuY2U6ICR7YX0uYCk7Y29udGludWV9Y29uc3RbdV09aDtpZighdVtyLiRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YSkpeygwLGMud2FybikoIlhGQSAtIEludmFsaWQgbm9kZTogbXVzdCBiZSBhIGRhdGEgbm9kZS4iKTtjb250aW51ZX1jb25zdCBkPSgwLGkuc2VhcmNoTm9kZSkodGhpcy5yb290LGUsbywhMSwhMSk7aWYoIWQpeygwLGMud2FybikoYFhGQSAtIEludmFsaWQgdGFyZ2V0OiAke299LmApO2NvbnRpbnVlfWNvbnN0W2ZdPWQ7aWYoIWZbci4kaXNEZXNjZW5kZW50XShlKSl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCB0YXJnZXQ6IG11c3QgYmUgYSBwcm9wZXJ0eSBvciBzdWJwcm9wZXJ0eS4iKTtjb250aW51ZX1jb25zdCBnPWZbci4kZ2V0UGFyZW50XSgpO2lmKGYgaW5zdGFuY2VvZiBuLlNldFByb3BlcnR5fHxnIGluc3RhbmNlb2Ygbi5TZXRQcm9wZXJ0eSl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCB0YXJnZXQ6IGNhbm5vdCBiZSBhIHNldFByb3BlcnR5IG9yIG9uZSBvZiBpdHMgcHJvcGVydGllcy4iKTtjb250aW51ZX1pZihmIGluc3RhbmNlb2Ygbi5CaW5kSXRlbXN8fGcgaW5zdGFuY2VvZiBuLkJpbmRJdGVtcyl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCB0YXJnZXQ6IGNhbm5vdCBiZSBhIGJpbmRJdGVtcyBvciBvbmUgb2YgaXRzIHByb3BlcnRpZXMuIik7Y29udGludWV9Y29uc3QgcD11W3IuJHRleHRdKCksbT1mW3IuJG5vZGVOYW1lXTtpZihmIGluc3RhbmNlb2Ygcy5YRkFBdHRyaWJ1dGUpe2NvbnN0IGU9T2JqZWN0LmNyZWF0ZShudWxsKTtlW21dPXA7Y29uc3QgdD1SZWZsZWN0LmNvbnN0cnVjdChPYmplY3QuZ2V0UHJvdG90eXBlT2YoZykuY29uc3RydWN0b3IsW2VdKTtnW21dPXRbbV19ZWxzZSBpZihmLmhhc093blByb3BlcnR5KHIuJGNvbnRlbnQpKXtmW3IuJGRhdGFdPXU7ZltyLiRjb250ZW50XT1wO2Zbci4kZmluYWxpemVdKCl9ZWxzZSgwLGMud2FybikoIlhGQSAtIEludmFsaWQgbm9kZSB0byB1c2UgaW4gc2V0UHJvcGVydHkiKX19X2JpbmRJdGVtcyhlLHQpe2lmKCFlLmhhc093blByb3BlcnR5KCJpdGVtcyIpfHwhZS5oYXNPd25Qcm9wZXJ0eSgiYmluZEl0ZW1zIil8fGUuYmluZEl0ZW1zLmlzRW1wdHkoKSlyZXR1cm47Zm9yKGNvbnN0IHQgb2YgZS5pdGVtcy5jaGlsZHJlbillW3IuJHJlbW92ZUNoaWxkXSh0KTtlLml0ZW1zLmNsZWFyKCk7Y29uc3QgYT1uZXcgbi5JdGVtcyh7fSkscz1uZXcgbi5JdGVtcyh7fSk7ZVtyLiRhcHBlbmRDaGlsZF0oYSk7ZS5pdGVtcy5wdXNoKGEpO2Vbci4kYXBwZW5kQ2hpbGRdKHMpO2UuaXRlbXMucHVzaChzKTtmb3IoY29uc3R7cmVmOm4sbGFiZWxSZWY6byx2YWx1ZVJlZjpsLGNvbm5lY3Rpb246aH1vZiBlLmJpbmRJdGVtcy5jaGlsZHJlbil7aWYoaCljb250aW51ZTtpZighbiljb250aW51ZTtjb25zdCBlPSgwLGkuc2VhcmNoTm9kZSkodGhpcy5yb290LHQsbiwhMSwhMSk7aWYoZSlmb3IoY29uc3QgdCBvZiBlKXtpZighdFtyLiRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKXsoMCxjLndhcm4pKGBYRkEgLSBJbnZhbGlkIHJlZiAoJHtufSk6IG11c3QgYmUgYSBkYXRhc2V0cyBjaGlsZC5gKTtjb250aW51ZX1jb25zdCBlPSgwLGkuc2VhcmNoTm9kZSkodGhpcy5yb290LHQsbywhMCwhMSk7aWYoIWUpeygwLGMud2FybikoYFhGQSAtIEludmFsaWQgbGFiZWw6ICR7b30uYCk7Y29udGludWV9Y29uc3RbaF09ZTtpZighaFtyLiRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIGxhYmVsOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuIik7Y29udGludWV9Y29uc3QgdT0oMCxpLnNlYXJjaE5vZGUpKHRoaXMucm9vdCx0LGwsITAsITEpO2lmKCF1KXsoMCxjLndhcm4pKGBYRkEgLSBJbnZhbGlkIHZhbHVlOiAke2x9LmApO2NvbnRpbnVlfWNvbnN0W2RdPXU7aWYoIWRbci4kaXNEZXNjZW5kZW50XSh0aGlzLmRhdGFzZXRzKSl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBhIGRhdGFzZXRzIGNoaWxkLiIpO2NvbnRpbnVlfWNvbnN0IGY9Y3JlYXRlVGV4dChoW3IuJHRleHRdKCkpLGc9Y3JlYXRlVGV4dChkW3IuJHRleHRdKCkpO2Fbci4kYXBwZW5kQ2hpbGRdKGYpO2EudGV4dC5wdXNoKGYpO3Nbci4kYXBwZW5kQ2hpbGRdKGcpO3MudGV4dC5wdXNoKGcpfWVsc2UoMCxjLndhcm4pKGBYRkEgLSBJbnZhbGlkIHJlZmVyZW5jZTogJHtufS5gKX19X2JpbmRPY2N1cnJlbmNlcyhlLHQsYSl7bGV0IG47aWYodC5sZW5ndGg+MSl7bj1lW3IuJGNsb25lXSgpO25bci4kcmVtb3ZlQ2hpbGRdKG4ub2NjdXIpO24ub2NjdXI9bnVsbH10aGlzLl9iaW5kVmFsdWUoZSx0WzBdLGEpO3RoaXMuX3NldFByb3BlcnRpZXMoZSx0WzBdKTt0aGlzLl9iaW5kSXRlbXMoZSx0WzBdKTtpZigxPT09dC5sZW5ndGgpcmV0dXJuO2NvbnN0IGk9ZVtyLiRnZXRQYXJlbnRdKCkscz1lW3IuJG5vZGVOYW1lXSxvPWlbci4kaW5kZXhPZl0oZSk7Zm9yKGxldCBlPTEsYz10Lmxlbmd0aDtlPGM7ZSsrKXtjb25zdCBjPXRbZV0sbD1uW3IuJGNsb25lXSgpO2lbc10ucHVzaChsKTtpW3IuJGluc2VydEF0XShvK2UsbCk7dGhpcy5fYmluZFZhbHVlKGwsYyxhKTt0aGlzLl9zZXRQcm9wZXJ0aWVzKGwsYyk7dGhpcy5fYmluZEl0ZW1zKGwsYyl9fV9jcmVhdGVPY2N1cnJlbmNlcyhlKXtpZighdGhpcy5lbXB0eU1lcmdlKXJldHVybjtjb25zdHtvY2N1cjp0fT1lO2lmKCF0fHx0LmluaXRpYWw8PTEpcmV0dXJuO2NvbnN0IGE9ZVtyLiRnZXRQYXJlbnRdKCksbj1lW3IuJG5vZGVOYW1lXTtpZighKGFbbl1pbnN0YW5jZW9mIHMuWEZBT2JqZWN0QXJyYXkpKXJldHVybjtsZXQgaTtpPWUubmFtZT9hW25dLmNoaWxkcmVuLmZpbHRlcigodD0+dC5uYW1lPT09ZS5uYW1lKSkubGVuZ3RoOmFbbl0uY2hpbGRyZW4ubGVuZ3RoO2NvbnN0IG89YVtyLiRpbmRleE9mXShlKSsxLGM9dC5pbml0aWFsLWk7aWYoYyl7Y29uc3QgdD1lW3IuJGNsb25lXSgpO3Rbci4kcmVtb3ZlQ2hpbGRdKHQub2NjdXIpO3Qub2NjdXI9bnVsbDthW25dLnB1c2godCk7YVtyLiRpbnNlcnRBdF0obyx0KTtmb3IobGV0IGU9MTtlPGM7ZSsrKXtjb25zdCBpPXRbci4kY2xvbmVdKCk7YVtuXS5wdXNoKGkpO2Fbci4kaW5zZXJ0QXRdKG8rZSxpKX19fV9nZXRPY2N1ckluZm8oZSl7Y29uc3R7bmFtZTp0LG9jY3VyOmF9PWU7aWYoIWF8fCF0KXJldHVyblsxLDFdO2NvbnN0IHI9LTE9PT1hLm1heD8xLzA6YS5tYXg7cmV0dXJuW2EubWluLHJdfV9zZXRBbmRCaW5kKGUsdCl7dGhpcy5fc2V0UHJvcGVydGllcyhlLHQpO3RoaXMuX2JpbmRJdGVtcyhlLHQpO3RoaXMuX2JpbmRFbGVtZW50KGUsdCl9X2JpbmRFbGVtZW50KGUsdCl7Y29uc3QgYT1bXTt0aGlzLl9jcmVhdGVPY2N1cnJlbmNlcyhlKTtmb3IoY29uc3QgbiBvZiBlW3IuJGdldENoaWxkcmVuXSgpKXtpZihuW3IuJGRhdGFdKWNvbnRpbnVlO2lmKHZvaWQgMD09PXRoaXMuX21lcmdlTW9kZSYmInN1YmZvcm0iPT09bltyLiRub2RlTmFtZV0pe3RoaXMuX21lcmdlTW9kZT0iY29uc3VtZURhdGEiPT09bi5tZXJnZU1vZGU7Y29uc3QgZT10W3IuJGdldENoaWxkcmVuXSgpO2lmKGUubGVuZ3RoPjApdGhpcy5fYmluZE9jY3VycmVuY2VzKG4sW2VbMF1dLG51bGwpO2Vsc2UgaWYodGhpcy5lbXB0eU1lcmdlKXtjb25zdCBlPXRbci4kbmFtZXNwYWNlSWRdPT09bD8tMTp0W3IuJG5hbWVzcGFjZUlkXSxhPW5bci4kZGF0YV09bmV3IHMuWG1sT2JqZWN0KGUsbi5uYW1lfHwicm9vdCIpO3Rbci4kYXBwZW5kQ2hpbGRdKGEpO3RoaXMuX2JpbmRFbGVtZW50KG4sYSl9Y29udGludWV9aWYoIW5bci4kaXNCaW5kYWJsZV0oKSljb250aW51ZTtsZXQgZT0hMSxvPW51bGwsaD1udWxsLHU9bnVsbDtpZihuLmJpbmQpe3N3aXRjaChuLmJpbmQubWF0Y2gpe2Nhc2Uibm9uZSI6dGhpcy5fc2V0QW5kQmluZChuLHQpO2NvbnRpbnVlO2Nhc2UiZ2xvYmFsIjplPSEwO2JyZWFrO2Nhc2UiZGF0YVJlZiI6aWYoIW4uYmluZC5yZWYpeygwLGMud2FybikoYFhGQSAtIHJlZiBpcyBlbXB0eSBpbiBub2RlICR7bltyLiRub2RlTmFtZV19LmApO3RoaXMuX3NldEFuZEJpbmQobix0KTtjb250aW51ZX1oPW4uYmluZC5yZWZ9bi5iaW5kLnBpY3R1cmUmJihvPW4uYmluZC5waWN0dXJlW3IuJGNvbnRlbnRdKX1jb25zdFtkLGZdPXRoaXMuX2dldE9jY3VySW5mbyhuKTtpZihoKXt1PSgwLGkuc2VhcmNoTm9kZSkodGhpcy5yb290LHQsaCwhMCwhMSk7aWYobnVsbD09PXUpe3U9KDAsaS5jcmVhdGVEYXRhTm9kZSkodGhpcy5kYXRhLHQsaCk7aWYoIXUpY29udGludWU7dGhpcy5faXNDb25zdW1lRGF0YSgpJiYodVtyLiRjb25zdW1lZF09ITApO3RoaXMuX3NldEFuZEJpbmQobix1KTtjb250aW51ZX10aGlzLl9pc0NvbnN1bWVEYXRhKCkmJih1PXUuZmlsdGVyKChlPT4hZVtyLiRjb25zdW1lZF0pKSk7dS5sZW5ndGg+Zj91PXUuc2xpY2UoMCxmKTowPT09dS5sZW5ndGgmJih1PW51bGwpO3UmJnRoaXMuX2lzQ29uc3VtZURhdGEoKSYmdS5mb3JFYWNoKChlPT57ZVtyLiRjb25zdW1lZF09ITB9KSl9ZWxzZXtpZighbi5uYW1lKXt0aGlzLl9zZXRBbmRCaW5kKG4sdCk7Y29udGludWV9aWYodGhpcy5faXNDb25zdW1lRGF0YSgpKXtjb25zdCBhPVtdO2Zvcig7YS5sZW5ndGg8Zjspe2NvbnN0IGk9dGhpcy5fZmluZERhdGFCeU5hbWVUb0NvbnN1bWUobi5uYW1lLG5bci4kaGFzU2V0dGFibGVWYWx1ZV0oKSx0LGUpO2lmKCFpKWJyZWFrO2lbci4kY29uc3VtZWRdPSEwO2EucHVzaChpKX11PWEubGVuZ3RoPjA/YTpudWxsfWVsc2V7dT10W3IuJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShuLm5hbWUsITEsdGhpcy5lbXB0eU1lcmdlKS5uZXh0KCkudmFsdWU7aWYoIXUpe2lmKDA9PT1kKXthLnB1c2gobik7Y29udGludWV9Y29uc3QgZT10W3IuJG5hbWVzcGFjZUlkXT09PWw/LTE6dFtyLiRuYW1lc3BhY2VJZF07dT1uW3IuJGRhdGFdPW5ldyBzLlhtbE9iamVjdChlLG4ubmFtZSk7dGhpcy5lbXB0eU1lcmdlJiYodVtyLiRjb25zdW1lZF09ITApO3Rbci4kYXBwZW5kQ2hpbGRdKHUpO3RoaXMuX3NldEFuZEJpbmQobix1KTtjb250aW51ZX10aGlzLmVtcHR5TWVyZ2UmJih1W3IuJGNvbnN1bWVkXT0hMCk7dT1bdV19fXU/dGhpcy5fYmluZE9jY3VycmVuY2VzKG4sdSxvKTpkPjA/dGhpcy5fc2V0QW5kQmluZChuLHQpOmEucHVzaChuKX1hLmZvckVhY2goKGU9PmVbci4kZ2V0UGFyZW50XSgpW3IuJHJlbW92ZUNoaWxkXShlKSkpfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuVmFsdWU9dC5UZXh0PXQuVGVtcGxhdGVOYW1lc3BhY2U9dC5UZW1wbGF0ZT10LlNldFByb3BlcnR5PXQuSXRlbXM9dC5GaWVsZD10LkJpbmRJdGVtcz12b2lkIDA7YSgxMTYpO2EoMTI2KTthKDEyOCk7YSgxMzEpO2EoMTMzKTthKDEzNSk7YSgxMzcpO2EoMTM5KTthKDIzMSk7YSgxNDUpO2EoMTQ3KTthKDE0OCk7dmFyIHI9YSgyMjgpLG49YSgyMzQpLGk9YSgyMzUpLHM9YSgyMzYpLG89YSgyNDApLGM9YSgyMzcpLGw9YSgxNDQpLGg9YSgyMzgpLHU9YSgxNDkpLGQ9YSgyNDEpO2NvbnN0IGY9bi5OYW1lc3BhY2VJZHMudGVtcGxhdGUuaWQsZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHA9L15IKFxkKykkLyxtPW5ldyBTZXQoWyJpbWFnZS9naWYiLCJpbWFnZS9qcGVnIiwiaW1hZ2UvanBnIiwiaW1hZ2UvcGpwZWciLCJpbWFnZS9wbmciLCJpbWFnZS9hcG5nIiwiaW1hZ2UveC1wbmciLCJpbWFnZS9ibXAiLCJpbWFnZS94LW1zLWJtcCIsImltYWdlL3RpZmYiLCJpbWFnZS90aWYiLCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iXSksYj1bW1s2Niw3N10sImltYWdlL2JtcCJdLFtbMjU1LDIxNiwyNTVdLCJpbWFnZS9qcGVnIl0sW1s3Myw3Myw0MiwwXSwiaW1hZ2UvdGlmZiJdLFtbNzcsNzcsMCw0Ml0sImltYWdlL3RpZmYiXSxbWzcxLDczLDcwLDU2LDU3LDk3XSwiaW1hZ2UvZ2lmIl0sW1sxMzcsODAsNzgsNzEsMTMsMTAsMjYsMTBdLCJpbWFnZS9wbmciXV07ZnVuY3Rpb24gZ2V0Qm9yZGVyRGltcyhlKXtpZighZXx8IWUuYm9yZGVyKXJldHVybnt3OjAsaDowfTtjb25zdCB0PWUuYm9yZGVyW3IuJGdldEV4dHJhXSgpO3JldHVybiB0P3t3OnQud2lkdGhzWzBdK3Qud2lkdGhzWzJdK3QuaW5zZXRzWzBdK3QuaW5zZXRzWzJdLGg6dC53aWR0aHNbMV0rdC53aWR0aHNbM10rdC5pbnNldHNbMV0rdC5pbnNldHNbM119Ont3OjAsaDowfX1mdW5jdGlvbiBoYXNNYXJnaW4oZSl7cmV0dXJuIGUubWFyZ2luJiYoZS5tYXJnaW4udG9wSW5zZXR8fGUubWFyZ2luLnJpZ2h0SW5zZXR8fGUubWFyZ2luLmJvdHRvbUluc2V0fHxlLm1hcmdpbi5sZWZ0SW5zZXQpfWZ1bmN0aW9uIF9zZXRWYWx1ZShlLHQpe2lmKCFlLnZhbHVlKXtjb25zdCB0PW5ldyBWYWx1ZSh7fSk7ZVtyLiRhcHBlbmRDaGlsZF0odCk7ZS52YWx1ZT10fWUudmFsdWVbci4kc2V0VmFsdWVdKHQpfWZ1bmN0aW9uKmdldENvbnRhaW5lZENoaWxkcmVuKGUpe2Zvcihjb25zdCB0IG9mIGVbci4kZ2V0Q2hpbGRyZW5dKCkpdCBpbnN0YW5jZW9mIFN1YmZvcm1TZXQ/eWllbGQqdFtyLiRnZXRDb250YWluZWRDaGlsZHJlbl0oKTp5aWVsZCB0fWZ1bmN0aW9uIGlzUmVxdWlyZWQoZSl7cmV0dXJuImVycm9yIj09PWUudmFsaWRhdGU/Lm51bGxUZXN0fWZ1bmN0aW9uIHNldFRhYkluZGV4KGUpe2Zvcig7ZTspe2lmKCFlLnRyYXZlcnNhbCl7ZVtyLiR0YWJJbmRleF09ZVtyLiRnZXRQYXJlbnRdKClbci4kdGFiSW5kZXhdO3JldHVybn1pZihlW3IuJHRhYkluZGV4XSlyZXR1cm47bGV0IHQ9bnVsbDtmb3IoY29uc3QgYSBvZiBlLnRyYXZlcnNhbFtyLiRnZXRDaGlsZHJlbl0oKSlpZigibmV4dCI9PT1hLm9wZXJhdGlvbil7dD1hO2JyZWFrfWlmKCF0fHwhdC5yZWYpe2Vbci4kdGFiSW5kZXhdPWVbci4kZ2V0UGFyZW50XSgpW3IuJHRhYkluZGV4XTtyZXR1cm59Y29uc3QgYT1lW3IuJGdldFRlbXBsYXRlUm9vdF0oKTtlW3IuJHRhYkluZGV4XT0rK2Fbci4kdGFiSW5kZXhdO2NvbnN0IG49YVtyLiRzZWFyY2hOb2RlXSh0LnJlZixlKTtpZighbilyZXR1cm47ZT1uWzBdfX1mdW5jdGlvbiBhcHBseUFzc2lzdChlLHQpe2NvbnN0IGE9ZS5hc3Npc3Q7aWYoYSl7Y29uc3QgZT1hW3IuJHRvSFRNTF0oKTtlJiYodC50aXRsZT1lKTtjb25zdCBuPWEucm9sZS5tYXRjaChwKTtpZihuKXtjb25zdCBlPSJoZWFkaW5nIixhPW5bMV07dC5yb2xlPWU7dFsiYXJpYS1sZXZlbCJdPWF9fWlmKCJ0YWJsZSI9PT1lLmxheW91dCl0LnJvbGU9InRhYmxlIjtlbHNlIGlmKCJyb3ciPT09ZS5sYXlvdXQpdC5yb2xlPSJyb3ciO2Vsc2V7Y29uc3QgYT1lW3IuJGdldFBhcmVudF0oKTsicm93Ij09PWEubGF5b3V0JiYodC5yb2xlPSJUSCI9PT1hLmFzc2lzdD8ucm9sZT8iY29sdW1uaGVhZGVyIjoiY2VsbCIpfX1mdW5jdGlvbiBhcmlhTGFiZWwoZSl7aWYoIWUuYXNzaXN0KXJldHVybiBudWxsO2NvbnN0IHQ9ZS5hc3Npc3Q7cmV0dXJuIHQuc3BlYWsmJiIiIT09dC5zcGVha1tyLiRjb250ZW50XT90LnNwZWFrW3IuJGNvbnRlbnRdOnQudG9vbFRpcD90LnRvb2xUaXBbci4kY29udGVudF06bnVsbH1mdW5jdGlvbiB2YWx1ZVRvSHRtbChlKXtyZXR1cm4gYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJ4ZmFSaWNoIl0sc3R5bGU6T2JqZWN0LmNyZWF0ZShudWxsKX0sY2hpbGRyZW46W3tuYW1lOiJzcGFuIixhdHRyaWJ1dGVzOntzdHlsZTpPYmplY3QuY3JlYXRlKG51bGwpfSx2YWx1ZTplfV19KX1mdW5jdGlvbiBzZXRGaXJzdFVuc3BsaXR0YWJsZShlKXtjb25zdCB0PWVbci4kZ2V0VGVtcGxhdGVSb290XSgpO2lmKG51bGw9PT10W3IuJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSl7dFtyLiRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGU9ZTt0W3IuJGV4dHJhXS5ub0xheW91dEZhaWx1cmU9ITB9fWZ1bmN0aW9uIHVuc2V0Rmlyc3RVbnNwbGl0dGFibGUoZSl7Y29uc3QgdD1lW3IuJGdldFRlbXBsYXRlUm9vdF0oKTt0W3IuJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZT09PWUmJih0W3IuJGV4dHJhXS5ub0xheW91dEZhaWx1cmU9ITEpfWZ1bmN0aW9uIGhhbmRsZUJyZWFrKGUpe2lmKGVbci4kZXh0cmFdKXJldHVybiExO2Vbci4kZXh0cmFdPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoImF1dG8iPT09ZS50YXJnZXRUeXBlKXJldHVybiExO2NvbnN0IHQ9ZVtyLiRnZXRUZW1wbGF0ZVJvb3RdKCk7bGV0IGE9bnVsbDtpZihlLnRhcmdldCl7YT10W3IuJHNlYXJjaE5vZGVdKGUudGFyZ2V0LGVbci4kZ2V0UGFyZW50XSgpKTtpZighYSlyZXR1cm4hMTthPWFbMF19Y29uc3R7Y3VycmVudFBhZ2VBcmVhOm4sY3VycmVudENvbnRlbnRBcmVhOml9PXRbci4kZXh0cmFdO2lmKCJwYWdlQXJlYSI9PT1lLnRhcmdldFR5cGUpe2EgaW5zdGFuY2VvZiBQYWdlQXJlYXx8KGE9bnVsbCk7aWYoZS5zdGFydE5ldyl7ZVtyLiRleHRyYV0udGFyZ2V0PWF8fG47cmV0dXJuITB9aWYoYSYmYSE9PW4pe2Vbci4kZXh0cmFdLnRhcmdldD1hO3JldHVybiEwfXJldHVybiExfWEgaW5zdGFuY2VvZiBDb250ZW50QXJlYXx8KGE9bnVsbCk7Y29uc3Qgcz1hJiZhW3IuJGdldFBhcmVudF0oKTtsZXQgbyxjPXM7aWYoZS5zdGFydE5ldylpZihhKXtjb25zdCBlPXMuY29udGVudEFyZWEuY2hpbGRyZW4sdD1lLmluZGV4T2YoaSkscj1lLmluZGV4T2YoYSk7LTEhPT10JiZ0PHImJihjPW51bGwpO289ci0xfWVsc2Ugbz1uLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YoaSk7ZWxzZXtpZighYXx8YT09PWkpcmV0dXJuITE7bz1zLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YoYSktMTtjPXM9PT1uP251bGw6c31lW3IuJGV4dHJhXS50YXJnZXQ9YztlW3IuJGV4dHJhXS5pbmRleD1vO3JldHVybiEwfWZ1bmN0aW9uIGhhbmRsZU92ZXJmbG93KGUsdCxhKXtjb25zdCBuPWVbci4kZ2V0VGVtcGxhdGVSb290XSgpLGk9bltyLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlLHM9dFtyLiRnZXRTdWJmb3JtUGFyZW50XTt0W3IuJGdldFN1YmZvcm1QYXJlbnRdPSgpPT5lO25bci4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT0hMDtjb25zdCBvPXRbci4kdG9IVE1MXShhKTtlW3IuJGFkZEhUTUxdKG8uaHRtbCxvLmJib3gpO25bci4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT1pO3Rbci4kZ2V0U3ViZm9ybVBhcmVudF09c31jbGFzcyBBcHBlYXJhbmNlRmlsdGVyIGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYXBwZWFyYW5jZUZpbHRlciIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgQXJjIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYXJjIiwhMCk7dGhpcy5jaXJjdWxhcj0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuY2lyY3VsYXIsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KTt0aGlzLmhhbmQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaGFuZCxbImV2ZW4iLCJsZWZ0IiwicmlnaHQiXSk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnN0YXJ0QW5nbGU9KDAsYy5nZXRGbG9hdCkoe2RhdGE6ZS5zdGFydEFuZ2xlLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PiEwfSk7dGhpcy5zd2VlcEFuZ2xlPSgwLGMuZ2V0RmxvYXQpKHtkYXRhOmUuc3dlZXBBbmdsZSxkZWZhdWx0VmFsdWU6MzYwLHZhbGlkYXRlOmU9PiEwfSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZWRnZT1udWxsO3RoaXMuZmlsbD1udWxsfVtyLiR0b0hUTUxdKCl7Y29uc3QgZT10aGlzLmVkZ2V8fG5ldyBFZGdlKHt9KSx0PWVbci4kdG9TdHlsZV0oKSxhPU9iamVjdC5jcmVhdGUobnVsbCk7InZpc2libGUiPT09dGhpcy5maWxsPy5wcmVzZW5jZT9PYmplY3QuYXNzaWduKGEsdGhpcy5maWxsW3IuJHRvU3R5bGVdKCkpOmEuZmlsbD0idHJhbnNwYXJlbnQiO2Euc3Ryb2tlV2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKCJ2aXNpYmxlIj09PWUucHJlc2VuY2U/ZS50aGlja25lc3M6MCk7YS5zdHJva2U9dC5jb2xvcjtsZXQgbjtjb25zdCBpPXt4bWxuczpnLHN0eWxlOnt3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIixvdmVyZmxvdzoidmlzaWJsZSJ9fTtpZigzNjA9PT10aGlzLnN3ZWVwQW5nbGUpbj17bmFtZToiZWxsaXBzZSIsYXR0cmlidXRlczp7eG1sbnM6ZyxjeDoiNTAlIixjeToiNTAlIixyeDoiNTAlIixyeToiNTAlIixzdHlsZTphfX07ZWxzZXtjb25zdCBlPXRoaXMuc3RhcnRBbmdsZSpNYXRoLlBJLzE4MCx0PXRoaXMuc3dlZXBBbmdsZSpNYXRoLlBJLzE4MCxyPXRoaXMuc3dlZXBBbmdsZT4xODA/MTowLFtzLG8sYyxsXT1bNTAqKDErTWF0aC5jb3MoZSkpLDUwKigxLU1hdGguc2luKGUpKSw1MCooMStNYXRoLmNvcyhlK3QpKSw1MCooMS1NYXRoLnNpbihlK3QpKV07bj17bmFtZToicGF0aCIsYXR0cmlidXRlczp7eG1sbnM6ZyxkOmBNICR7c30gJHtvfSBBIDUwIDUwIDAgJHtyfSAwICR7Y30gJHtsfWAsdmVjdG9yRWZmZWN0OiJub24tc2NhbGluZy1zdHJva2UiLHN0eWxlOmF9fTtPYmplY3QuYXNzaWduKGkse3ZpZXdCb3g6IjAgMCAxMDAgMTAwIixwcmVzZXJ2ZUFzcGVjdFJhdGlvOiJub25lIn0pfWNvbnN0IG89e25hbWU6InN2ZyIsY2hpbGRyZW46W25dLGF0dHJpYnV0ZXM6aX07aWYoaGFzTWFyZ2luKHRoaXNbci4kZ2V0UGFyZW50XSgpW3IuJGdldFBhcmVudF0oKSkpcmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e3N0eWxlOntkaXNwbGF5OiJpbmxpbmUiLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUifX0sY2hpbGRyZW46W29dfSk7by5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKG8pfX1jbGFzcyBBcmVhIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYXJlYSIsITApO3RoaXMuY29sU3Bhbj0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuY29sU3BhbixkZWZhdWx0VmFsdWU6MSx2YWxpZGF0ZTplPT5lPj0xfHwtMT09PWV9KTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMueD0oMCxjLmdldE1lYXN1cmVtZW50KShlLngsIjBwdCIpO3RoaXMueT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnksIjBwdCIpO3RoaXMuZGVzYz1udWxsO3RoaXMuZXh0cmFzPW51bGw7dGhpcy5hcmVhPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZHJhdz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmV4T2JqZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZXhjbEdyb3VwPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZmllbGQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5zdWJmb3JtPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc3ViZm9ybVNldD1uZXcgby5YRkFPYmplY3RBcnJheX0qW3IuJGdldENvbnRhaW5lZENoaWxkcmVuXSgpe3lpZWxkKmdldENvbnRhaW5lZENoaWxkcmVuKHRoaXMpfVtyLiRpc1RyYW5zcGFyZW50XSgpe3JldHVybiEwfVtyLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfVtyLiRhZGRIVE1MXShlLHQpe2NvbnN0W2EsbixpLHNdPXQ7dGhpc1tyLiRleHRyYV0ud2lkdGg9TWF0aC5tYXgodGhpc1tyLiRleHRyYV0ud2lkdGgsYStpKTt0aGlzW3IuJGV4dHJhXS5oZWlnaHQ9TWF0aC5tYXgodGhpc1tyLiRleHRyYV0uaGVpZ2h0LG4rcyk7dGhpc1tyLiRleHRyYV0uY2hpbGRyZW4ucHVzaChlKX1bci4kZ2V0QXZhaWxhYmxlU3BhY2VdKCl7cmV0dXJuIHRoaXNbci4kZXh0cmFdLmF2YWlsYWJsZVNwYWNlfVtyLiR0b0hUTUxdKGUpe2NvbnN0IHQ9KDAscy50b1N0eWxlKSh0aGlzLCJwb3NpdGlvbiIpLGE9e3N0eWxlOnQsaWQ6dGhpc1tyLiR1aWRdLGNsYXNzOlsieGZhQXJlYSJdfTsoMCxzLmlzUHJpbnRPbmx5KSh0aGlzKSYmYS5jbGFzcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTt0aGlzLm5hbWUmJihhLnhmYU5hbWU9dGhpcy5uYW1lKTtjb25zdCBuPVtdO3RoaXNbci4kZXh0cmFdPXtjaGlsZHJlbjpuLHdpZHRoOjAsaGVpZ2h0OjAsYXZhaWxhYmxlU3BhY2U6ZX07Y29uc3QgaT10aGlzW3IuJGNoaWxkcmVuVG9IVE1MXSh7ZmlsdGVyOm5ldyBTZXQoWyJhcmVhIiwiZHJhdyIsImZpZWxkIiwiZXhjbEdyb3VwIiwic3ViZm9ybSIsInN1YmZvcm1TZXQiXSksaW5jbHVkZTohMH0pO2lmKCFpLnN1Y2Nlc3Mpe2lmKGkuaXNCcmVhaygpKXJldHVybiBpO2RlbGV0ZSB0aGlzW3IuJGV4dHJhXTtyZXR1cm4gYy5IVE1MUmVzdWx0LkZBSUxVUkV9dC53aWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpc1tyLiRleHRyYV0ud2lkdGgpO3QuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzW3IuJGV4dHJhXS5oZWlnaHQpO2NvbnN0IG89e25hbWU6ImRpdiIsYXR0cmlidXRlczphLGNoaWxkcmVuOm59LGw9W3RoaXMueCx0aGlzLnksdGhpc1tyLiRleHRyYV0ud2lkdGgsdGhpc1tyLiRleHRyYV0uaGVpZ2h0XTtkZWxldGUgdGhpc1tyLiRleHRyYV07cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKG8sbCl9fWNsYXNzIEFzc2lzdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImFzc2lzdCIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5yb2xlPWUucm9sZXx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuc3BlYWs9bnVsbDt0aGlzLnRvb2xUaXA9bnVsbH1bci4kdG9IVE1MXSgpe3JldHVybiB0aGlzLnRvb2xUaXA/LltyLiRjb250ZW50XXx8bnVsbH19Y2xhc3MgQmFyY29kZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJhcmNvZGUiLCEwKTt0aGlzLmNoYXJFbmNvZGluZz0oMCxjLmdldEtleXdvcmQpKHtkYXRhOmUuY2hhckVuY29kaW5nP2UuY2hhckVuY29kaW5nLnRvTG93ZXJDYXNlKCk6IiIsZGVmYXVsdFZhbHVlOiIiLHZhbGlkYXRlOmU9PlsidXRmLTgiLCJiaWctZml2ZSIsImZvbnRzcGVjaWZpYyIsImdiayIsImdiLTE4MDMwIiwiZ2ItMjMxMiIsImtzYy01NjAxIiwibm9uZSIsInNoaWZ0LWppcyIsInVjcy0yIiwidXRmLTE2Il0uaW5jbHVkZXMoZSl8fGUubWF0Y2goL2lzby04ODU5LVxkezJ9Lyl9KTt0aGlzLmNoZWNrc3VtPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmNoZWNrc3VtLFsibm9uZSIsIjFtb2QxMCIsIjFtb2QxMF8xbW9kMTEiLCIybW9kMTAiLCJhdXRvIl0pO3RoaXMuZGF0YUNvbHVtbkNvdW50PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5kYXRhQ29sdW1uQ291bnQsZGVmYXVsdFZhbHVlOi0xLHZhbGlkYXRlOmU9PmU+PTB9KTt0aGlzLmRhdGFMZW5ndGg9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmRhdGFMZW5ndGgsZGVmYXVsdFZhbHVlOi0xLHZhbGlkYXRlOmU9PmU+PTB9KTt0aGlzLmRhdGFQcmVwPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmRhdGFQcmVwLFsibm9uZSIsImZsYXRlQ29tcHJlc3MiXSk7dGhpcy5kYXRhUm93Q291bnQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmRhdGFSb3dDb3VudCxkZWZhdWx0VmFsdWU6LTEsdmFsaWRhdGU6ZT0+ZT49MH0pO3RoaXMuZW5kQ2hhcj1lLmVuZENoYXJ8fCIiO3RoaXMuZXJyb3JDb3JyZWN0aW9uTGV2ZWw9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmVycm9yQ29ycmVjdGlvbkxldmVsLGRlZmF1bHRWYWx1ZTotMSx2YWxpZGF0ZTplPT5lPj0wJiZlPD04fSk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm1vZHVsZUhlaWdodD0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1vZHVsZUhlaWdodCwiNW1tIik7dGhpcy5tb2R1bGVXaWR0aD0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1vZHVsZVdpZHRoLCIwLjI1bW0iKTt0aGlzLnByaW50Q2hlY2tEaWdpdD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUucHJpbnRDaGVja0RpZ2l0LGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSk7dGhpcy5yb3dDb2x1bW5SYXRpbz0oMCxjLmdldFJhdGlvKShlLnJvd0NvbHVtblJhdGlvKTt0aGlzLnN0YXJ0Q2hhcj1lLnN0YXJ0Q2hhcnx8IiI7dGhpcy50ZXh0TG9jYXRpb249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudGV4dExvY2F0aW9uLFsiYmVsb3ciLCJhYm92ZSIsImFib3ZlRW1iZWRkZWQiLCJiZWxvd0VtYmVkZGVkIiwibm9uZSJdKTt0aGlzLnRydW5jYXRlPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS50cnVuY2F0ZSxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pO3RoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlP2UudHlwZS50b0xvd2VyQ2FzZSgpOiIiLFsiYXp0ZWMiLCJjb2RhYmFyIiwiY29kZTJvZjVpbmR1c3RyaWFsIiwiY29kZTJvZjVpbnRlcmxlYXZlZCIsImNvZGUyb2Y1bWF0cml4IiwiY29kZTJvZjVzdGFuZGFyZCIsImNvZGUzb2Y5IiwiY29kZTNvZjlleHRlbmRlZCIsImNvZGUxMSIsImNvZGU0OSIsImNvZGU5MyIsImNvZGUxMjgiLCJjb2RlMTI4YSIsImNvZGUxMjhiIiwiY29kZTEyOGMiLCJjb2RlMTI4c3NjYyIsImRhdGFtYXRyaXgiLCJlYW44IiwiZWFuOGFkZDIiLCJlYW44YWRkNSIsImVhbjEzIiwiZWFuMTNhZGQyIiwiZWFuMTNhZGQ1IiwiZWFuMTNwd2NkIiwiZmltIiwibG9nbWFycyIsIm1heGljb2RlIiwibXNpIiwicGRmNDE3IiwicGRmNDE3bWFjcm8iLCJwbGVzc2V5IiwicG9zdGF1c2N1c3QyIiwicG9zdGF1c2N1c3QzIiwicG9zdGF1c3JlcGx5cGFpZCIsInBvc3RhdXNzdGFuZGFyZCIsInBvc3R1a3JtNHNjYyIsInBvc3R1c2RwYmMiLCJwb3N0dXNpbWIiLCJwb3N0dXNzdGFuZGFyZCIsInBvc3R1czV6aXAiLCJxcmNvZGUiLCJyZmlkIiwicnNzMTQiLCJyc3MxNGV4cGFuZGVkIiwicnNzMTRsaW1pdGVkIiwicnNzMTRzdGFja2VkIiwicnNzMTRzdGFja2Vkb21uaSIsInJzczE0dHJ1bmNhdGVkIiwidGVsZXBlbiIsInVjYzEyOCIsInVjYzEyOHJhbmRvbSIsInVjYzEyOHNzY2MiLCJ1cGNhIiwidXBjYWFkZDIiLCJ1cGNhYWRkNSIsInVwY2Fwd2NkIiwidXBjZSIsInVwY2VhZGQyIiwidXBjZWFkZDUiLCJ1cGNlYW4yIiwidXBjZWFuNSIsInVwc21heGljb2RlIl0pO3RoaXMudXBzTW9kZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS51cHNNb2RlLFsidXNDYXJyaWVyIiwiaW50ZXJuYXRpb25hbENhcnJpZXIiLCJzZWN1cmVTeW1ib2wiLCJzdGFuZGFyZFN5bWJvbCJdKTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy53aWRlTmFycm93UmF0aW89KDAsYy5nZXRSYXRpbykoZS53aWRlTmFycm93UmF0aW8pO3RoaXMuZW5jcnlwdD1udWxsO3RoaXMuZXh0cmFzPW51bGx9fWNsYXNzIEJpbmQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJiaW5kIiwhMCk7dGhpcy5tYXRjaD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5tYXRjaCxbIm9uY2UiLCJkYXRhUmVmIiwiZ2xvYmFsIiwibm9uZSJdKTt0aGlzLnJlZj1lLnJlZnx8IiI7dGhpcy5waWN0dXJlPW51bGx9fWNsYXNzIEJpbmRJdGVtcyBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJpbmRJdGVtcyIpO3RoaXMuY29ubmVjdGlvbj1lLmNvbm5lY3Rpb258fCIiO3RoaXMubGFiZWxSZWY9ZS5sYWJlbFJlZnx8IiI7dGhpcy5yZWY9ZS5yZWZ8fCIiO3RoaXMudmFsdWVSZWY9ZS52YWx1ZVJlZnx8IiJ9fXQuQmluZEl0ZW1zPUJpbmRJdGVtcztjbGFzcyBCb29rZW5kIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYm9va2VuZCIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5sZWFkZXI9ZS5sZWFkZXJ8fCIiO3RoaXMudHJhaWxlcj1lLnRyYWlsZXJ8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgQm9vbGVhbkVsZW1lbnQgZXh0ZW5kcyBvLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJvb2xlYW4iKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bci4kdG9IVE1MXShlKXtyZXR1cm4gdmFsdWVUb0h0bWwoMT09PXRoaXNbci4kY29udGVudF0/IjEiOiIwIil9fWNsYXNzIEJvcmRlciBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJvcmRlciIsITApO3RoaXMuYnJlYWs9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYnJlYWssWyJjbG9zZSIsIm9wZW4iXSk7dGhpcy5oYW5kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhhbmQsWyJldmVuIiwibGVmdCIsInJpZ2h0Il0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKTt0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmNvcm5lcj1uZXcgby5YRkFPYmplY3RBcnJheSg0KTt0aGlzLmVkZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXkoNCk7dGhpcy5leHRyYXM9bnVsbDt0aGlzLmZpbGw9bnVsbDt0aGlzLm1hcmdpbj1udWxsfVtyLiRnZXRFeHRyYV0oKXtpZighdGhpc1tyLiRleHRyYV0pe2NvbnN0IGU9dGhpcy5lZGdlLmNoaWxkcmVuLnNsaWNlKCk7aWYoZS5sZW5ndGg8NCl7Y29uc3QgdD1lLmF0KC0xKXx8bmV3IEVkZ2Uoe30pO2ZvcihsZXQgYT1lLmxlbmd0aDthPDQ7YSsrKWUucHVzaCh0KX1jb25zdCB0PWUubWFwKChlPT5lLnRoaWNrbmVzcykpLGE9WzAsMCwwLDBdO2lmKHRoaXMubWFyZ2luKXthWzBdPXRoaXMubWFyZ2luLnRvcEluc2V0O2FbMV09dGhpcy5tYXJnaW4ucmlnaHRJbnNldDthWzJdPXRoaXMubWFyZ2luLmJvdHRvbUluc2V0O2FbM109dGhpcy5tYXJnaW4ubGVmdEluc2V0fXRoaXNbci4kZXh0cmFdPXt3aWR0aHM6dCxpbnNldHM6YSxlZGdlczplfX1yZXR1cm4gdGhpc1tyLiRleHRyYV19W3IuJHRvU3R5bGVdKCl7Y29uc3R7ZWRnZXM6ZX09dGhpc1tyLiRnZXRFeHRyYV0oKSx0PWUubWFwKChlPT57Y29uc3QgdD1lW3IuJHRvU3R5bGVdKCk7dC5jb2xvcnx8PSIjMDAwMDAwIjtyZXR1cm4gdH0pKSxhPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5tYXJnaW4mJk9iamVjdC5hc3NpZ24oYSx0aGlzLm1hcmdpbltyLiR0b1N0eWxlXSgpKTsidmlzaWJsZSI9PT10aGlzLmZpbGw/LnByZXNlbmNlJiZPYmplY3QuYXNzaWduKGEsdGhpcy5maWxsW3IuJHRvU3R5bGVdKCkpO2lmKHRoaXMuY29ybmVyLmNoaWxkcmVuLnNvbWUoKGU9PjAhPT1lLnJhZGl1cykpKXtjb25zdCBlPXRoaXMuY29ybmVyLmNoaWxkcmVuLm1hcCgoZT0+ZVtyLiR0b1N0eWxlXSgpKSk7aWYoMj09PWUubGVuZ3RofHwzPT09ZS5sZW5ndGgpe2NvbnN0IHQ9ZS5hdCgtMSk7Zm9yKGxldCBhPWUubGVuZ3RoO2E8NDthKyspZS5wdXNoKHQpfWEuYm9yZGVyUmFkaXVzPWUubWFwKChlPT5lLnJhZGl1cykpLmpvaW4oIiAiKX1zd2l0Y2godGhpcy5wcmVzZW5jZSl7Y2FzZSJpbnZpc2libGUiOmNhc2UiaGlkZGVuIjphLmJvcmRlclN0eWxlPSIiO2JyZWFrO2Nhc2UiaW5hY3RpdmUiOmEuYm9yZGVyU3R5bGU9Im5vbmUiO2JyZWFrO2RlZmF1bHQ6YS5ib3JkZXJTdHlsZT10Lm1hcCgoZT0+ZS5zdHlsZSkpLmpvaW4oIiAiKX1hLmJvcmRlcldpZHRoPXQubWFwKChlPT5lLndpZHRoKSkuam9pbigiICIpO2EuYm9yZGVyQ29sb3I9dC5tYXAoKGU9PmUuY29sb3IpKS5qb2luKCIgIik7cmV0dXJuIGF9fWNsYXNzIEJyZWFrIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYnJlYWsiLCEwKTt0aGlzLmFmdGVyPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFmdGVyLFsiYXV0byIsImNvbnRlbnRBcmVhIiwicGFnZUFyZWEiLCJwYWdlRXZlbiIsInBhZ2VPZGQiXSk7dGhpcy5hZnRlclRhcmdldD1lLmFmdGVyVGFyZ2V0fHwiIjt0aGlzLmJlZm9yZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5iZWZvcmUsWyJhdXRvIiwiY29udGVudEFyZWEiLCJwYWdlQXJlYSIsInBhZ2VFdmVuIiwicGFnZU9kZCJdKTt0aGlzLmJlZm9yZVRhcmdldD1lLmJlZm9yZVRhcmdldHx8IiI7dGhpcy5ib29rZW5kTGVhZGVyPWUuYm9va2VuZExlYWRlcnx8IiI7dGhpcy5ib29rZW5kVHJhaWxlcj1lLmJvb2tlbmRUcmFpbGVyfHwiIjt0aGlzLmlkPWUuaWR8fCIiO3RoaXMub3ZlcmZsb3dMZWFkZXI9ZS5vdmVyZmxvd0xlYWRlcnx8IiI7dGhpcy5vdmVyZmxvd1RhcmdldD1lLm92ZXJmbG93VGFyZ2V0fHwiIjt0aGlzLm92ZXJmbG93VHJhaWxlcj1lLm92ZXJmbG93VHJhaWxlcnx8IiI7dGhpcy5zdGFydE5ldz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuc3RhcnROZXcsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5leHRyYXM9bnVsbH19Y2xhc3MgQnJlYWtBZnRlciBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJyZWFrQWZ0ZXIiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubGVhZGVyPWUubGVhZGVyfHwiIjt0aGlzLnN0YXJ0TmV3PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5zdGFydE5ldyxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pO3RoaXMudGFyZ2V0PWUudGFyZ2V0fHwiIjt0aGlzLnRhcmdldFR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudGFyZ2V0VHlwZSxbImF1dG8iLCJjb250ZW50QXJlYSIsInBhZ2VBcmVhIl0pO3RoaXMudHJhaWxlcj1lLnRyYWlsZXJ8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLnNjcmlwdD1udWxsfX1jbGFzcyBCcmVha0JlZm9yZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJyZWFrQmVmb3JlIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLmxlYWRlcj1lLmxlYWRlcnx8IiI7dGhpcy5zdGFydE5ldz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuc3RhcnROZXcsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KTt0aGlzLnRhcmdldD1lLnRhcmdldHx8IiI7dGhpcy50YXJnZXRUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnRhcmdldFR5cGUsWyJhdXRvIiwiY29udGVudEFyZWEiLCJwYWdlQXJlYSJdKTt0aGlzLnRyYWlsZXI9ZS50cmFpbGVyfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5zY3JpcHQ9bnVsbH1bci4kdG9IVE1MXShlKXt0aGlzW3IuJGV4dHJhXT17fTtyZXR1cm4gYy5IVE1MUmVzdWx0LkZBSUxVUkV9fWNsYXNzIEJ1dHRvbiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJ1dHRvbiIsITApO3RoaXMuaGlnaGxpZ2h0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhpZ2hsaWdodCxbImludmVydGVkIiwibm9uZSIsIm91dGxpbmUiLCJwdXNoIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZXh0cmFzPW51bGx9W3IuJHRvSFRNTF0oZSl7Y29uc3QgdD10aGlzW3IuJGdldFBhcmVudF0oKVtyLiRnZXRQYXJlbnRdKCksYT17bmFtZToiYnV0dG9uIixhdHRyaWJ1dGVzOntpZDp0aGlzW3IuJHVpZF0sY2xhc3M6WyJ4ZmFCdXR0b24iXSxzdHlsZTp7fX0sY2hpbGRyZW46W119O2Zvcihjb25zdCBlIG9mIHQuZXZlbnQuY2hpbGRyZW4pe2lmKCJjbGljayIhPT1lLmFjdGl2aXR5fHwhZS5zY3JpcHQpY29udGludWU7Y29uc3QgdD0oMCx1LnJlY292ZXJKc1VSTCkoZS5zY3JpcHRbci4kY29udGVudF0pO2lmKCF0KWNvbnRpbnVlO2NvbnN0IG49KDAscy5maXhVUkwpKHQudXJsKTtuJiZhLmNoaWxkcmVuLnB1c2goe25hbWU6ImEiLGF0dHJpYnV0ZXM6e2lkOiJsaW5rIit0aGlzW3IuJHVpZF0saHJlZjpuLG5ld1dpbmRvdzp0Lm5ld1dpbmRvdyxjbGFzczpbInhmYUxpbmsiXSxzdHlsZTp7fX0sY2hpbGRyZW46W119KX1yZXR1cm4gYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoYSl9fWNsYXNzIENhbGN1bGF0ZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNhbGN1bGF0ZSIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5vdmVycmlkZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vdmVycmlkZSxbImRpc2FibGVkIiwiZXJyb3IiLCJpZ25vcmUiLCJ3YXJuaW5nIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmV4dHJhcz1udWxsO3RoaXMubWVzc2FnZT1udWxsO3RoaXMuc2NyaXB0PW51bGx9fWNsYXNzIENhcHRpb24gZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjYXB0aW9uIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnBsYWNlbWVudD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wbGFjZW1lbnQsWyJsZWZ0IiwiYm90dG9tIiwiaW5saW5lIiwicmlnaHQiLCJ0b3AiXSk7dGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKTt0aGlzLnJlc2VydmU9TWF0aC5jZWlsKCgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUucmVzZXJ2ZSkpO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmV4dHJhcz1udWxsO3RoaXMuZm9udD1udWxsO3RoaXMubWFyZ2luPW51bGw7dGhpcy5wYXJhPW51bGw7dGhpcy52YWx1ZT1udWxsfVtyLiRzZXRWYWx1ZV0oZSl7X3NldFZhbHVlKHRoaXMsZSl9W3IuJGdldEV4dHJhXShlKXtpZighdGhpc1tyLiRleHRyYV0pe2xldHt3aWR0aDp0LGhlaWdodDphfT1lO3N3aXRjaCh0aGlzLnBsYWNlbWVudCl7Y2FzZSJsZWZ0IjpjYXNlInJpZ2h0IjpjYXNlImlubGluZSI6dD10aGlzLnJlc2VydmU8PTA/dDp0aGlzLnJlc2VydmU7YnJlYWs7Y2FzZSJ0b3AiOmNhc2UiYm90dG9tIjphPXRoaXMucmVzZXJ2ZTw9MD9hOnRoaXMucmVzZXJ2ZX10aGlzW3IuJGV4dHJhXT0oMCxzLmxheW91dE5vZGUpKHRoaXMse3dpZHRoOnQsaGVpZ2h0OmF9KX1yZXR1cm4gdGhpc1tyLiRleHRyYV19W3IuJHRvSFRNTF0oZSl7aWYoIXRoaXMudmFsdWUpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTt0aGlzW3IuJHB1c2hQYXJhXSgpO2NvbnN0IHQ9dGhpcy52YWx1ZVtyLiR0b0hUTUxdKGUpLmh0bWw7aWYoIXQpe3RoaXNbci4kcG9wUGFyYV0oKTtyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZfWNvbnN0IGE9dGhpcy5yZXNlcnZlO2lmKHRoaXMucmVzZXJ2ZTw9MCl7Y29uc3R7dzp0LGg6YX09dGhpc1tyLiRnZXRFeHRyYV0oZSk7c3dpdGNoKHRoaXMucGxhY2VtZW50KXtjYXNlImxlZnQiOmNhc2UicmlnaHQiOmNhc2UiaW5saW5lIjp0aGlzLnJlc2VydmU9dDticmVhaztjYXNlInRvcCI6Y2FzZSJib3R0b20iOnRoaXMucmVzZXJ2ZT1hfX1jb25zdCBuPVtdOyJzdHJpbmciPT10eXBlb2YgdD9uLnB1c2goe25hbWU6IiN0ZXh0Iix2YWx1ZTp0fSk6bi5wdXNoKHQpO2NvbnN0IGk9KDAscy50b1N0eWxlKSh0aGlzLCJmb250IiwibWFyZ2luIiwidmlzaWJpbGl0eSIpO3N3aXRjaCh0aGlzLnBsYWNlbWVudCl7Y2FzZSJsZWZ0IjpjYXNlInJpZ2h0Ijp0aGlzLnJlc2VydmU+MCYmKGkud2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMucmVzZXJ2ZSkpO2JyZWFrO2Nhc2UidG9wIjpjYXNlImJvdHRvbSI6dGhpcy5yZXNlcnZlPjAmJihpLmhlaWdodD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5yZXNlcnZlKSl9KDAscy5zZXRQYXJhKSh0aGlzLG51bGwsdCk7dGhpc1tyLiRwb3BQYXJhXSgpO3RoaXMucmVzZXJ2ZT1hO3JldHVybiBjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixhdHRyaWJ1dGVzOntzdHlsZTppLGNsYXNzOlsieGZhQ2FwdGlvbiJdfSxjaGlsZHJlbjpufSl9fWNsYXNzIENlcnRpZmljYXRlIGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY2VydGlmaWNhdGUiKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgQ2VydGlmaWNhdGVzIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY2VydGlmaWNhdGVzIiwhMCk7dGhpcy5jcmVkZW50aWFsU2VydmVyUG9saWN5PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy51cmw9ZS51cmx8fCIiO3RoaXMudXJsUG9saWN5PWUudXJsUG9saWN5fHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5lbmNyeXB0aW9uPW51bGw7dGhpcy5pc3N1ZXJzPW51bGw7dGhpcy5rZXlVc2FnZT1udWxsO3RoaXMub2lkcz1udWxsO3RoaXMuc2lnbmluZz1udWxsO3RoaXMuc3ViamVjdEROcz1udWxsfX1jbGFzcyBDaGVja0J1dHRvbiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNoZWNrQnV0dG9uIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm1hcms9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubWFyayxbImRlZmF1bHQiLCJjaGVjayIsImNpcmNsZSIsImNyb3NzIiwiZGlhbW9uZCIsInNxdWFyZSIsInN0YXIiXSk7dGhpcy5zaGFwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5zaGFwZSxbInNxdWFyZSIsInJvdW5kIl0pO3RoaXMuc2l6ZT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnNpemUsIjEwcHQiKTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5ib3JkZXI9bnVsbDt0aGlzLmV4dHJhcz1udWxsO3RoaXMubWFyZ2luPW51bGx9W3IuJHRvSFRNTF0oZSl7Y29uc3QgdD0oMCxzLnRvU3R5bGUpKCJtYXJnaW4iKSxhPSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnNpemUpO3Qud2lkdGg9dC5oZWlnaHQ9YTtsZXQgbixpLG87Y29uc3QgbD10aGlzW3IuJGdldFBhcmVudF0oKVtyLiRnZXRQYXJlbnRdKCksaD1sLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCYmbC5pdGVtcy5jaGlsZHJlblswXVtyLiR0b0hUTUxdKCkuaHRtbHx8W10sdT17b246KHZvaWQgMCE9PWhbMF0/aFswXToib24iKS50b1N0cmluZygpLG9mZjoodm9pZCAwIT09aFsxXT9oWzFdOiJvZmYiKS50b1N0cmluZygpfSxkPShsLnZhbHVlPy5bci4kdGV4dF0oKXx8Im9mZiIpPT09dS5vbnx8dm9pZCAwLGY9bFtyLiRnZXRTdWJmb3JtUGFyZW50XSgpLGc9bFtyLiR1aWRdO2xldCBwO2lmKGYgaW5zdGFuY2VvZiBFeGNsR3JvdXApe289ZltyLiR1aWRdO249InJhZGlvIjtpPSJ4ZmFSYWRpbyI7cD1mW3IuJGRhdGFdPy5bci4kdWlkXXx8ZltyLiR1aWRdfWVsc2V7bj0iY2hlY2tib3giO2k9InhmYUNoZWNrYm94IjtwPWxbci4kZGF0YV0/LltyLiR1aWRdfHxsW3IuJHVpZF19Y29uc3QgbT17bmFtZToiaW5wdXQiLGF0dHJpYnV0ZXM6e2NsYXNzOltpXSxzdHlsZTp0LGZpZWxkSWQ6ZyxkYXRhSWQ6cCx0eXBlOm4sY2hlY2tlZDpkLHhmYU9uOnUub24seGZhT2ZmOnUub2ZmLCJhcmlhLWxhYmVsIjphcmlhTGFiZWwobCksImFyaWEtcmVxdWlyZWQiOiExfX07byYmKG0uYXR0cmlidXRlcy5uYW1lPW8pO2lmKGlzUmVxdWlyZWQobCkpe20uYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdPSEwO20uYXR0cmlidXRlcy5yZXF1aXJlZD0hMH1yZXR1cm4gYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOlttXX0pfX1jbGFzcyBDaG9pY2VMaXN0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY2hvaWNlTGlzdCIsITApO3RoaXMuY29tbWl0T249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY29tbWl0T24sWyJzZWxlY3QiLCJleGl0Il0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5vcGVuPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm9wZW4sWyJ1c2VyQ29udHJvbCIsImFsd2F5cyIsIm11bHRpU2VsZWN0Iiwib25FbnRyeSJdKTt0aGlzLnRleHRFbnRyeT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUudGV4dEVudHJ5LGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuYm9yZGVyPW51bGw7dGhpcy5leHRyYXM9bnVsbDt0aGlzLm1hcmdpbj1udWxsfVtyLiR0b0hUTUxdKGUpe2NvbnN0IHQ9KDAscy50b1N0eWxlKSh0aGlzLCJib3JkZXIiLCJtYXJnaW4iKSxhPXRoaXNbci4kZ2V0UGFyZW50XSgpW3IuJGdldFBhcmVudF0oKSxuPXtmb250U2l6ZTpgY2FsYygke2EuZm9udD8uc2l6ZXx8MTB9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWB9LGk9W107aWYoYS5pdGVtcy5jaGlsZHJlbi5sZW5ndGg+MCl7Y29uc3QgZT1hLml0ZW1zO2xldCB0PTAscz0wO2lmKDI9PT1lLmNoaWxkcmVuLmxlbmd0aCl7dD1lLmNoaWxkcmVuWzBdLnNhdmU7cz0xLXR9Y29uc3Qgbz1lLmNoaWxkcmVuW3RdW3IuJHRvSFRNTF0oKS5odG1sLGM9ZS5jaGlsZHJlbltzXVtyLiR0b0hUTUxdKCkuaHRtbDtsZXQgbD0hMTtjb25zdCBoPWEudmFsdWU/LltyLiR0ZXh0XSgpfHwiIjtmb3IobGV0IGU9MCx0PW8ubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHQ9e25hbWU6Im9wdGlvbiIsYXR0cmlidXRlczp7dmFsdWU6Y1tlXXx8b1tlXSxzdHlsZTpufSx2YWx1ZTpvW2VdfTtjW2VdPT09aCYmKHQuYXR0cmlidXRlcy5zZWxlY3RlZD1sPSEwKTtpLnB1c2godCl9bHx8aS5zcGxpY2UoMCwwLHtuYW1lOiJvcHRpb24iLGF0dHJpYnV0ZXM6e2hpZGRlbjohMCxzZWxlY3RlZDohMH0sdmFsdWU6IiAifSl9Y29uc3Qgbz17Y2xhc3M6WyJ4ZmFTZWxlY3QiXSxmaWVsZElkOmFbci4kdWlkXSxkYXRhSWQ6YVtyLiRkYXRhXT8uW3IuJHVpZF18fGFbci4kdWlkXSxzdHlsZTp0LCJhcmlhLWxhYmVsIjphcmlhTGFiZWwoYSksImFyaWEtcmVxdWlyZWQiOiExfTtpZihpc1JlcXVpcmVkKGEpKXtvWyJhcmlhLXJlcXVpcmVkIl09ITA7by5yZXF1aXJlZD0hMH0ibXVsdGlTZWxlY3QiPT09dGhpcy5vcGVuJiYoby5tdWx0aXBsZT0hMCk7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJsYWJlbCIsYXR0cmlidXRlczp7Y2xhc3M6WyJ4ZmFMYWJlbCJdfSxjaGlsZHJlbjpbe25hbWU6InNlbGVjdCIsY2hpbGRyZW46aSxhdHRyaWJ1dGVzOm99XX0pfX1jbGFzcyBDb2xvciBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNvbG9yIiwhMCk7dGhpcy5jU3BhY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY1NwYWNlLFsiU1JHQiJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLnZhbHVlPWUudmFsdWU/KDAsYy5nZXRDb2xvcikoZS52YWx1ZSk6IiI7dGhpcy5leHRyYXM9bnVsbH1bci4kaGFzU2V0dGFibGVWYWx1ZV0oKXtyZXR1cm4hMX1bci4kdG9TdHlsZV0oKXtyZXR1cm4gdGhpcy52YWx1ZT9sLlV0aWwubWFrZUhleENvbG9yKHRoaXMudmFsdWUucix0aGlzLnZhbHVlLmcsdGhpcy52YWx1ZS5iKTpudWxsfX1jbGFzcyBDb21iIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY29tYiIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5udW1iZXJPZkNlbGxzPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5udW1iZXJPZkNlbGxzLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PmU+PTB9KTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIENvbm5lY3QgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjb25uZWN0IiwhMCk7dGhpcy5jb25uZWN0aW9uPWUuY29ubmVjdGlvbnx8IiI7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnJlZj1lLnJlZnx8IiI7dGhpcy51c2FnZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS51c2FnZSxbImV4cG9ydEFuZEltcG9ydCIsImV4cG9ydE9ubHkiLCJpbXBvcnRPbmx5Il0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLnBpY3R1cmU9bnVsbH19Y2xhc3MgQ29udGVudEFyZWEgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjb250ZW50QXJlYSIsITApO3RoaXMuaD0oMCxjLmdldE1lYXN1cmVtZW50KShlLmgpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy5yZWxldmFudD0oMCxjLmdldFJlbGV2YW50KShlLnJlbGV2YW50KTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy53PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudyk7dGhpcy54PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueCwiMHB0Iik7dGhpcy55PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueSwiMHB0Iik7dGhpcy5kZXNjPW51bGw7dGhpcy5leHRyYXM9bnVsbH1bci4kdG9IVE1MXShlKXtjb25zdCB0PXtsZWZ0OigwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLngpLHRvcDooMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy55KSx3aWR0aDooMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy53KSxoZWlnaHQ6KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMuaCl9LGE9WyJ4ZmFDb250ZW50YXJlYSJdOygwLHMuaXNQcmludE9ubHkpKHRoaXMpJiZhLnB1c2goInhmYVByaW50T25seSIpO3JldHVybiBjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixjaGlsZHJlbjpbXSxhdHRyaWJ1dGVzOntzdHlsZTp0LGNsYXNzOmEsaWQ6dGhpc1tyLiR1aWRdfX0pfX1jbGFzcyBDb3JuZXIgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjb3JuZXIiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMuaW52ZXJ0ZWQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmludmVydGVkLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSk7dGhpcy5qb2luPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmpvaW4sWyJzcXVhcmUiLCJyb3VuZCJdKTt0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pO3RoaXMucmFkaXVzPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUucmFkaXVzKTt0aGlzLnN0cm9rZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5zdHJva2UsWyJzb2xpZCIsImRhc2hEb3QiLCJkYXNoRG90RG90IiwiZGFzaGVkIiwiZG90dGVkIiwiZW1ib3NzZWQiLCJldGNoZWQiLCJsb3dlcmVkIiwicmFpc2VkIl0pO3RoaXMudGhpY2tuZXNzPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudGhpY2tuZXNzLCIwLjVwdCIpO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmNvbG9yPW51bGw7dGhpcy5leHRyYXM9bnVsbH1bci4kdG9TdHlsZV0oKXtjb25zdCBlPSgwLHMudG9TdHlsZSkodGhpcywidmlzaWJpbGl0eSIpO2UucmFkaXVzPSgwLHMubWVhc3VyZVRvU3RyaW5nKSgic3F1YXJlIj09PXRoaXMuam9pbj8wOnRoaXMucmFkaXVzKTtyZXR1cm4gZX19Y2xhc3MgRGF0ZUVsZW1lbnQgZXh0ZW5kcyBvLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGF0ZSIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtyLiRmaW5hbGl6ZV0oKXtjb25zdCBlPXRoaXNbci4kY29udGVudF0udHJpbSgpO3RoaXNbci4kY29udGVudF09ZT9uZXcgRGF0ZShlKTpudWxsfVtyLiR0b0hUTUxdKGUpe3JldHVybiB2YWx1ZVRvSHRtbCh0aGlzW3IuJGNvbnRlbnRdP3RoaXNbci4kY29udGVudF0udG9TdHJpbmcoKToiIil9fWNsYXNzIERhdGVUaW1lIGV4dGVuZHMgby5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImRhdGVUaW1lIik7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W3IuJGZpbmFsaXplXSgpe2NvbnN0IGU9dGhpc1tyLiRjb250ZW50XS50cmltKCk7dGhpc1tyLiRjb250ZW50XT1lP25ldyBEYXRlKGUpOm51bGx9W3IuJHRvSFRNTF0oZSl7cmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbci4kY29udGVudF0/dGhpc1tyLiRjb250ZW50XS50b1N0cmluZygpOiIiKX19Y2xhc3MgRGF0ZVRpbWVFZGl0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGF0ZVRpbWVFZGl0IiwhMCk7dGhpcy5oU2Nyb2xsUG9saWN5PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhTY3JvbGxQb2xpY3ksWyJhdXRvIiwib2ZmIiwib24iXSk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnBpY2tlcj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5waWNrZXIsWyJob3N0Iiwibm9uZSJdKTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5ib3JkZXI9bnVsbDt0aGlzLmNvbWI9bnVsbDt0aGlzLmV4dHJhcz1udWxsO3RoaXMubWFyZ2luPW51bGx9W3IuJHRvSFRNTF0oZSl7Y29uc3QgdD0oMCxzLnRvU3R5bGUpKHRoaXMsImJvcmRlciIsImZvbnQiLCJtYXJnaW4iKSxhPXRoaXNbci4kZ2V0UGFyZW50XSgpW3IuJGdldFBhcmVudF0oKSxuPXtuYW1lOiJpbnB1dCIsYXR0cmlidXRlczp7dHlwZToidGV4dCIsZmllbGRJZDphW3IuJHVpZF0sZGF0YUlkOmFbci4kZGF0YV0/LltyLiR1aWRdfHxhW3IuJHVpZF0sY2xhc3M6WyJ4ZmFUZXh0ZmllbGQiXSxzdHlsZTp0LCJhcmlhLWxhYmVsIjphcmlhTGFiZWwoYSksImFyaWEtcmVxdWlyZWQiOiExfX07aWYoaXNSZXF1aXJlZChhKSl7bi5hdHRyaWJ1dGVzWyJhcmlhLXJlcXVpcmVkIl09ITA7bi5hdHRyaWJ1dGVzLnJlcXVpcmVkPSEwfXJldHVybiBjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToibGFiZWwiLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhTGFiZWwiXX0sY2hpbGRyZW46W25dfSl9fWNsYXNzIERlY2ltYWwgZXh0ZW5kcyBvLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGVjaW1hbCIpO3RoaXMuZnJhY0RpZ2l0cz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZnJhY0RpZ2l0cyxkZWZhdWx0VmFsdWU6Mix2YWxpZGF0ZTplPT4hMH0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5sZWFkRGlnaXRzPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5sZWFkRGlnaXRzLGRlZmF1bHRWYWx1ZTotMSx2YWxpZGF0ZTplPT4hMH0pO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bci4kZmluYWxpemVdKCl7Y29uc3QgZT1wYXJzZUZsb2F0KHRoaXNbci4kY29udGVudF0udHJpbSgpKTt0aGlzW3IuJGNvbnRlbnRdPWlzTmFOKGUpP251bGw6ZX1bci4kdG9IVE1MXShlKXtyZXR1cm4gdmFsdWVUb0h0bWwobnVsbCE9PXRoaXNbci4kY29udGVudF0/dGhpc1tyLiRjb250ZW50XS50b1N0cmluZygpOiIiKX19Y2xhc3MgRGVmYXVsdFVpIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGVmYXVsdFVpIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5leHRyYXM9bnVsbH19Y2xhc3MgRGVzYyBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImRlc2MiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmJvb2xlYW49bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5kYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZGF0ZVRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5kZWNpbWFsPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZXhEYXRhPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZmxvYXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5pbWFnZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmludGVnZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy50ZXh0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMudGltZT1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgRGlnZXN0TWV0aG9kIGV4dGVuZHMgby5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGlnZXN0TWV0aG9kIixbIiIsIlNIQTEiLCJTSEEyNTYiLCJTSEE1MTIiLCJSSVBFTUQxNjAiXSk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIERpZ2VzdE1ldGhvZHMgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkaWdlc3RNZXRob2RzIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZGlnZXN0TWV0aG9kPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBEcmF3IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZHJhdyIsITApO3RoaXMuYW5jaG9yVHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hbmNob3JUeXBlLFsidG9wTGVmdCIsImJvdHRvbUNlbnRlciIsImJvdHRvbUxlZnQiLCJib3R0b21SaWdodCIsIm1pZGRsZUNlbnRlciIsIm1pZGRsZUxlZnQiLCJtaWRkbGVSaWdodCIsInRvcENlbnRlciIsInRvcFJpZ2h0Il0pO3RoaXMuY29sU3Bhbj0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuY29sU3BhbixkZWZhdWx0VmFsdWU6MSx2YWxpZGF0ZTplPT5lPj0xfHwtMT09PWV9KTt0aGlzLmg9ZS5oPygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUuaCk6IiI7dGhpcy5oQWxpZ249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaEFsaWduLFsibGVmdCIsImNlbnRlciIsImp1c3RpZnkiLCJqdXN0aWZ5QWxsIiwicmFkaXgiLCJyaWdodCJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubG9jYWxlPWUubG9jYWxlfHwiIjt0aGlzLm1heEg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhILCIwcHQiKTt0aGlzLm1heFc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhXLCIwcHQiKTt0aGlzLm1pbkg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5ILCIwcHQiKTt0aGlzLm1pblc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5XLCIwcHQiKTt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pO3RoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCk7dGhpcy5yb3RhdGU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnJvdGF0ZSxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT5lJTkwPT0wfSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMudz1lLnc/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS53KToiIjt0aGlzLng9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS54LCIwcHQiKTt0aGlzLnk9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS55LCIwcHQiKTt0aGlzLmFzc2lzdD1udWxsO3RoaXMuYm9yZGVyPW51bGw7dGhpcy5jYXB0aW9uPW51bGw7dGhpcy5kZXNjPW51bGw7dGhpcy5leHRyYXM9bnVsbDt0aGlzLmZvbnQ9bnVsbDt0aGlzLmtlZXA9bnVsbDt0aGlzLm1hcmdpbj1udWxsO3RoaXMucGFyYT1udWxsO3RoaXMudHJhdmVyc2FsPW51bGw7dGhpcy51aT1udWxsO3RoaXMudmFsdWU9bnVsbDt0aGlzLnNldFByb3BlcnR5PW5ldyBvLlhGQU9iamVjdEFycmF5fVtyLiRzZXRWYWx1ZV0oZSl7X3NldFZhbHVlKHRoaXMsZSl9W3IuJHRvSFRNTF0oZSl7c2V0VGFiSW5kZXgodGhpcyk7aWYoImhpZGRlbiI9PT10aGlzLnByZXNlbmNlfHwiaW5hY3RpdmUiPT09dGhpcy5wcmVzZW5jZSlyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZOygwLHMuZml4RGltZW5zaW9ucykodGhpcyk7dGhpc1tyLiRwdXNoUGFyYV0oKTtjb25zdCB0PXRoaXMudyxhPXRoaXMuaCx7dzpuLGg6byxpc0Jyb2tlbjpsfT0oMCxzLmxheW91dE5vZGUpKHRoaXMsZSk7aWYobiYmIiI9PT10aGlzLncpe2lmKGwmJnRoaXNbci4kZ2V0U3ViZm9ybVBhcmVudF0oKVtyLiRpc1RoZXJlTW9yZVdpZHRoXSgpKXt0aGlzW3IuJHBvcFBhcmFdKCk7cmV0dXJuIGMuSFRNTFJlc3VsdC5GQUlMVVJFfXRoaXMudz1ufW8mJiIiPT09dGhpcy5oJiYodGhpcy5oPW8pO3NldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpO2lmKCEoMCxpLmNoZWNrRGltZW5zaW9ucykodGhpcyxlKSl7dGhpcy53PXQ7dGhpcy5oPWE7dGhpc1tyLiRwb3BQYXJhXSgpO3JldHVybiBjLkhUTUxSZXN1bHQuRkFJTFVSRX11bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpO2NvbnN0IGg9KDAscy50b1N0eWxlKSh0aGlzLCJmb250IiwiaEFsaWduIiwiZGltZW5zaW9ucyIsInBvc2l0aW9uIiwicHJlc2VuY2UiLCJyb3RhdGUiLCJhbmNob3JUeXBlIiwiYm9yZGVyIiwibWFyZ2luIik7KDAscy5zZXRNaW5NYXhEaW1lbnNpb25zKSh0aGlzLGgpO2lmKGgubWFyZ2luKXtoLnBhZGRpbmc9aC5tYXJnaW47ZGVsZXRlIGgubWFyZ2lufWNvbnN0IHU9WyJ4ZmFEcmF3Il07dGhpcy5mb250JiZ1LnB1c2goInhmYUZvbnQiKTsoMCxzLmlzUHJpbnRPbmx5KSh0aGlzKSYmdS5wdXNoKCJ4ZmFQcmludE9ubHkiKTtjb25zdCBkPXtzdHlsZTpoLGlkOnRoaXNbci4kdWlkXSxjbGFzczp1fTt0aGlzLm5hbWUmJihkLnhmYU5hbWU9dGhpcy5uYW1lKTtjb25zdCBmPXtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6ZCxjaGlsZHJlbjpbXX07YXBwbHlBc3Npc3QodGhpcyxkKTtjb25zdCBnPSgwLHMuY29tcHV0ZUJib3gpKHRoaXMsZixlKSxwPXRoaXMudmFsdWU/dGhpcy52YWx1ZVtyLiR0b0hUTUxdKGUpLmh0bWw6bnVsbDtpZihudWxsPT09cCl7dGhpcy53PXQ7dGhpcy5oPWE7dGhpc1tyLiRwb3BQYXJhXSgpO3JldHVybiBjLkhUTUxSZXN1bHQuc3VjY2VzcygoMCxzLmNyZWF0ZVdyYXBwZXIpKHRoaXMsZiksZyl9Zi5jaGlsZHJlbi5wdXNoKHApOygwLHMuc2V0UGFyYSkodGhpcyxoLHApO3RoaXMudz10O3RoaXMuaD1hO3RoaXNbci4kcG9wUGFyYV0oKTtyZXR1cm4gYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoKDAscy5jcmVhdGVXcmFwcGVyKSh0aGlzLGYpLGcpfX1jbGFzcyBFZGdlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZWRnZSIsITApO3RoaXMuY2FwPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmNhcCxbInNxdWFyZSIsImJ1dHQiLCJyb3VuZCJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSk7dGhpcy5zdHJva2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc3Ryb2tlLFsic29saWQiLCJkYXNoRG90IiwiZGFzaERvdERvdCIsImRhc2hlZCIsImRvdHRlZCIsImVtYm9zc2VkIiwiZXRjaGVkIiwibG93ZXJlZCIsInJhaXNlZCJdKTt0aGlzLnRoaWNrbmVzcz0oMCxjLmdldE1lYXN1cmVtZW50KShlLnRoaWNrbmVzcywiMC41cHQiKTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5jb2xvcj1udWxsO3RoaXMuZXh0cmFzPW51bGx9W3IuJHRvU3R5bGVdKCl7Y29uc3QgZT0oMCxzLnRvU3R5bGUpKHRoaXMsInZpc2liaWxpdHkiKTtPYmplY3QuYXNzaWduKGUse2xpbmVjYXA6dGhpcy5jYXAsd2lkdGg6KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMudGhpY2tuZXNzKSxjb2xvcjp0aGlzLmNvbG9yP3RoaXMuY29sb3Jbci4kdG9TdHlsZV0oKToiIzAwMDAwMCIsc3R5bGU6IiJ9KTtpZigidmlzaWJsZSIhPT10aGlzLnByZXNlbmNlKWUuc3R5bGU9Im5vbmUiO2Vsc2Ugc3dpdGNoKHRoaXMuc3Ryb2tlKXtjYXNlInNvbGlkIjplLnN0eWxlPSJzb2xpZCI7YnJlYWs7Y2FzZSJkYXNoRG90IjpjYXNlImRhc2hEb3REb3QiOmNhc2UiZGFzaGVkIjplLnN0eWxlPSJkYXNoZWQiO2JyZWFrO2Nhc2UiZG90dGVkIjplLnN0eWxlPSJkb3R0ZWQiO2JyZWFrO2Nhc2UiZW1ib3NzZWQiOmUuc3R5bGU9InJpZGdlIjticmVhaztjYXNlImV0Y2hlZCI6ZS5zdHlsZT0iZ3Jvb3ZlIjticmVhaztjYXNlImxvd2VyZWQiOmUuc3R5bGU9Imluc2V0IjticmVhaztjYXNlInJhaXNlZCI6ZS5zdHlsZT0ib3V0c2V0In1yZXR1cm4gZX19Y2xhc3MgRW5jb2RpbmcgZXh0ZW5kcyBvLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJlbmNvZGluZyIsWyJhZGJlLng1MDkucnNhX3NoYTEiLCJhZGJlLnBrY3M3LmRldGFjaGVkIiwiYWRiZS5wa2NzNy5zaGExIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBFbmNvZGluZ3MgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJlbmNvZGluZ3MiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsib3B0aW9uYWwiLCJyZXF1aXJlZCJdKTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5lbmNvZGluZz1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgRW5jcnlwdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImVuY3J5cHQiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmNlcnRpZmljYXRlPW51bGx9fWNsYXNzIEVuY3J5cHREYXRhIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZW5jcnlwdERhdGEiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMub3BlcmF0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm9wZXJhdGlvbixbImVuY3J5cHQiLCJkZWNyeXB0Il0pO3RoaXMudGFyZ2V0PWUudGFyZ2V0fHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5maWx0ZXI9bnVsbDt0aGlzLm1hbmlmZXN0PW51bGx9fWNsYXNzIEVuY3J5cHRpb24gZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJlbmNyeXB0aW9uIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuY2VydGlmaWNhdGU9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIEVuY3J5cHRpb25NZXRob2QgZXh0ZW5kcyBvLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJlbmNyeXB0aW9uTWV0aG9kIixbIiIsIkFFUzI1Ni1DQkMiLCJUUklQTEVERVMtQ0JDIiwiQUVTMTI4LUNCQyIsIkFFUzE5Mi1DQkMiXSk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIEVuY3J5cHRpb25NZXRob2RzIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZW5jcnlwdGlvbk1ldGhvZHMiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsib3B0aW9uYWwiLCJyZXF1aXJlZCJdKTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5lbmNyeXB0aW9uTWV0aG9kPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBFdmVudCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImV2ZW50IiwhMCk7dGhpcy5hY3Rpdml0eT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hY3Rpdml0eSxbImNsaWNrIiwiY2hhbmdlIiwiZG9jQ2xvc2UiLCJkb2NSZWFkeSIsImVudGVyIiwiZXhpdCIsImZ1bGwiLCJpbmRleENoYW5nZSIsImluaXRpYWxpemUiLCJtb3VzZURvd24iLCJtb3VzZUVudGVyIiwibW91c2VFeGl0IiwibW91c2VVcCIsInBvc3RFeGVjdXRlIiwicG9zdE9wZW4iLCJwb3N0UHJpbnQiLCJwb3N0U2F2ZSIsInBvc3RTaWduIiwicG9zdFN1Ym1pdCIsInByZUV4ZWN1dGUiLCJwcmVPcGVuIiwicHJlUHJpbnQiLCJwcmVTYXZlIiwicHJlU2lnbiIsInByZVN1Ym1pdCIsInJlYWR5IiwidmFsaWRhdGlvblN0YXRlIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5saXN0ZW49KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubGlzdGVuLFsicmVmT25seSIsInJlZkFuZERlc2NlbmRlbnRzIl0pO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMucmVmPWUucmVmfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5leHRyYXM9bnVsbDt0aGlzLmVuY3J5cHREYXRhPW51bGw7dGhpcy5leGVjdXRlPW51bGw7dGhpcy5zY3JpcHQ9bnVsbDt0aGlzLnNpZ25EYXRhPW51bGw7dGhpcy5zdWJtaXQ9bnVsbH19Y2xhc3MgRXhEYXRhIGV4dGVuZHMgby5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImV4RGF0YSIpO3RoaXMuY29udGVudFR5cGU9ZS5jb250ZW50VHlwZXx8IiI7dGhpcy5ocmVmPWUuaHJlZnx8IiI7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm1heExlbmd0aD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWF4TGVuZ3RoLGRlZmF1bHRWYWx1ZTotMSx2YWxpZGF0ZTplPT5lPj0tMX0pO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMucmlkPWUucmlkfHwiIjt0aGlzLnRyYW5zZmVyRW5jb2Rpbmc9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHJhbnNmZXJFbmNvZGluZyxbIm5vbmUiLCJiYXNlNjQiLCJwYWNrYWdlIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bci4kaXNDREFUQVhtbF0oKXtyZXR1cm4idGV4dC9odG1sIj09PXRoaXMuY29udGVudFR5cGV9W3IuJG9uQ2hpbGRdKGUpe2lmKCJ0ZXh0L2h0bWwiPT09dGhpcy5jb250ZW50VHlwZSYmZVtyLiRuYW1lc3BhY2VJZF09PT1uLk5hbWVzcGFjZUlkcy54aHRtbC5pZCl7dGhpc1tyLiRjb250ZW50XT1lO3JldHVybiEwfWlmKCJ0ZXh0L3htbCI9PT10aGlzLmNvbnRlbnRUeXBlKXt0aGlzW3IuJGNvbnRlbnRdPWU7cmV0dXJuITB9cmV0dXJuITF9W3IuJHRvSFRNTF0oZSl7cmV0dXJuInRleHQvaHRtbCI9PT10aGlzLmNvbnRlbnRUeXBlJiZ0aGlzW3IuJGNvbnRlbnRdP3RoaXNbci4kY29udGVudF1bci4kdG9IVE1MXShlKTpjLkhUTUxSZXN1bHQuRU1QVFl9fWNsYXNzIEV4T2JqZWN0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZXhPYmplY3QiLCEwKTt0aGlzLmFyY2hpdmU9ZS5hcmNoaXZlfHwiIjt0aGlzLmNsYXNzSWQ9ZS5jbGFzc0lkfHwiIjt0aGlzLmNvZGVCYXNlPWUuY29kZUJhc2V8fCIiO3RoaXMuY29kZVR5cGU9ZS5jb2RlVHlwZXx8IiI7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5leHRyYXM9bnVsbDt0aGlzLmJvb2xlYW49bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5kYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZGF0ZVRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5kZWNpbWFsPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZXhEYXRhPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZXhPYmplY3Q9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5mbG9hdD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmltYWdlPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuaW50ZWdlcj1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnRleHQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy50aW1lPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBFeGNsR3JvdXAgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJleGNsR3JvdXAiLCEwKTt0aGlzLmFjY2Vzcz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hY2Nlc3MsWyJvcGVuIiwibm9uSW50ZXJhY3RpdmUiLCJwcm90ZWN0ZWQiLCJyZWFkT25seSJdKTt0aGlzLmFjY2Vzc0tleT1lLmFjY2Vzc0tleXx8IiI7dGhpcy5hbmNob3JUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFuY2hvclR5cGUsWyJ0b3BMZWZ0IiwiYm90dG9tQ2VudGVyIiwiYm90dG9tTGVmdCIsImJvdHRvbVJpZ2h0IiwibWlkZGxlQ2VudGVyIiwibWlkZGxlTGVmdCIsIm1pZGRsZVJpZ2h0IiwidG9wQ2VudGVyIiwidG9wUmlnaHQiXSk7dGhpcy5jb2xTcGFuPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5jb2xTcGFuLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PmU+PTF8fC0xPT09ZX0pO3RoaXMuaD1lLmg/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5oKToiIjt0aGlzLmhBbGlnbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oQWxpZ24sWyJsZWZ0IiwiY2VudGVyIiwianVzdGlmeSIsImp1c3RpZnlBbGwiLCJyYWRpeCIsInJpZ2h0Il0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5sYXlvdXQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubGF5b3V0LFsicG9zaXRpb24iLCJsci10YiIsInJsLXJvdyIsInJsLXRiIiwicm93IiwidGFibGUiLCJ0YiJdKTt0aGlzLm1heEg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhILCIwcHQiKTt0aGlzLm1heFc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhXLCIwcHQiKTt0aGlzLm1pbkg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5ILCIwcHQiKTt0aGlzLm1pblc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5XLCIwcHQiKTt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pO3RoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMudz1lLnc/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS53KToiIjt0aGlzLng9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS54LCIwcHQiKTt0aGlzLnk9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS55LCIwcHQiKTt0aGlzLmFzc2lzdD1udWxsO3RoaXMuYmluZD1udWxsO3RoaXMuYm9yZGVyPW51bGw7dGhpcy5jYWxjdWxhdGU9bnVsbDt0aGlzLmNhcHRpb249bnVsbDt0aGlzLmRlc2M9bnVsbDt0aGlzLmV4dHJhcz1udWxsO3RoaXMubWFyZ2luPW51bGw7dGhpcy5wYXJhPW51bGw7dGhpcy50cmF2ZXJzYWw9bnVsbDt0aGlzLnZhbGlkYXRlPW51bGw7dGhpcy5jb25uZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZXZlbnQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5maWVsZD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnNldFByb3BlcnR5PW5ldyBvLlhGQU9iamVjdEFycmF5fVtyLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfVtyLiRoYXNTZXR0YWJsZVZhbHVlXSgpe3JldHVybiEwfVtyLiRzZXRWYWx1ZV0oZSl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5maWVsZC5jaGlsZHJlbil7aWYoIXQudmFsdWUpe2NvbnN0IGU9bmV3IFZhbHVlKHt9KTt0W3IuJGFwcGVuZENoaWxkXShlKTt0LnZhbHVlPWV9dC52YWx1ZVtyLiRzZXRWYWx1ZV0oZSl9fVtyLiRpc1RoZXJlTW9yZVdpZHRoXSgpe3JldHVybiB0aGlzLmxheW91dC5lbmRzV2l0aCgiLXRiIikmJjA9PT10aGlzW3IuJGV4dHJhXS5hdHRlbXB0JiZ0aGlzW3IuJGV4dHJhXS5udW1iZXJJbkxpbmU+MHx8dGhpc1tyLiRnZXRQYXJlbnRdKClbci4kaXNUaGVyZU1vcmVXaWR0aF0oKX1bci4kaXNTcGxpdHRhYmxlXSgpe2NvbnN0IGU9dGhpc1tyLiRnZXRTdWJmb3JtUGFyZW50XSgpO2lmKCFlW3IuJGlzU3BsaXR0YWJsZV0oKSlyZXR1cm4hMTtpZih2b2lkIDAhPT10aGlzW3IuJGV4dHJhXS5faXNTcGxpdHRhYmxlKXJldHVybiB0aGlzW3IuJGV4dHJhXS5faXNTcGxpdHRhYmxlO2lmKCJwb3NpdGlvbiI9PT10aGlzLmxheW91dHx8dGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKXt0aGlzW3IuJGV4dHJhXS5faXNTcGxpdHRhYmxlPSExO3JldHVybiExfWlmKGUubGF5b3V0Py5lbmRzV2l0aCgiLXRiIikmJjAhPT1lW3IuJGV4dHJhXS5udW1iZXJJbkxpbmUpcmV0dXJuITE7dGhpc1tyLiRleHRyYV0uX2lzU3BsaXR0YWJsZT0hMDtyZXR1cm4hMH1bci4kZmx1c2hIVE1MXSgpe3JldHVybigwLGkuZmx1c2hIVE1MKSh0aGlzKX1bci4kYWRkSFRNTF0oZSx0KXsoMCxpLmFkZEhUTUwpKHRoaXMsZSx0KX1bci4kZ2V0QXZhaWxhYmxlU3BhY2VdKCl7cmV0dXJuKDAsaS5nZXRBdmFpbGFibGVTcGFjZSkodGhpcyl9W3IuJHRvSFRNTF0oZSl7c2V0VGFiSW5kZXgodGhpcyk7aWYoImhpZGRlbiI9PT10aGlzLnByZXNlbmNlfHwiaW5hY3RpdmUiPT09dGhpcy5wcmVzZW5jZXx8MD09PXRoaXMuaHx8MD09PXRoaXMudylyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZOygwLHMuZml4RGltZW5zaW9ucykodGhpcyk7Y29uc3QgdD1bXSxhPXtpZDp0aGlzW3IuJHVpZF0sY2xhc3M6W119OygwLHMuc2V0QWNjZXNzKSh0aGlzLGEuY2xhc3MpO3RoaXNbci4kZXh0cmFdfHwodGhpc1tyLiRleHRyYV09T2JqZWN0LmNyZWF0ZShudWxsKSk7T2JqZWN0LmFzc2lnbih0aGlzW3IuJGV4dHJhXSx7Y2hpbGRyZW46dCxhdHRyaWJ1dGVzOmEsYXR0ZW1wdDowLGxpbmU6bnVsbCxudW1iZXJJbkxpbmU6MCxhdmFpbGFibGVTcGFjZTp7d2lkdGg6TWF0aC5taW4odGhpcy53fHwxLzAsZS53aWR0aCksaGVpZ2h0Ok1hdGgubWluKHRoaXMuaHx8MS8wLGUuaGVpZ2h0KX0sd2lkdGg6MCxoZWlnaHQ6MCxwcmV2SGVpZ2h0OjAsY3VycmVudFdpZHRoOjB9KTtjb25zdCBuPXRoaXNbci4kaXNTcGxpdHRhYmxlXSgpO258fHNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpO2lmKCEoMCxpLmNoZWNrRGltZW5zaW9ucykodGhpcyxlKSlyZXR1cm4gYy5IVE1MUmVzdWx0LkZBSUxVUkU7Y29uc3Qgbz1uZXcgU2V0KFsiZmllbGQiXSk7aWYodGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKXtjb25zdCBlPXRoaXNbci4kZ2V0U3ViZm9ybVBhcmVudF0oKS5jb2x1bW5XaWR0aHM7aWYoQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGg+MCl7dGhpc1tyLiRleHRyYV0uY29sdW1uV2lkdGhzPWU7dGhpc1tyLiRleHRyYV0uY3VycmVudENvbHVtbj0wfX1jb25zdCBsPSgwLHMudG9TdHlsZSkodGhpcywiYW5jaG9yVHlwZSIsImRpbWVuc2lvbnMiLCJwb3NpdGlvbiIsInByZXNlbmNlIiwiYm9yZGVyIiwibWFyZ2luIiwiaEFsaWduIiksaD1bInhmYUV4Y2xncm91cCJdLHU9KDAscy5sYXlvdXRDbGFzcykodGhpcyk7dSYmaC5wdXNoKHUpOygwLHMuaXNQcmludE9ubHkpKHRoaXMpJiZoLnB1c2goInhmYVByaW50T25seSIpO2Euc3R5bGU9bDthLmNsYXNzPWg7dGhpcy5uYW1lJiYoYS54ZmFOYW1lPXRoaXMubmFtZSk7dGhpc1tyLiRwdXNoUGFyYV0oKTtjb25zdCBkPSJsci10YiI9PT10aGlzLmxheW91dHx8InJsLXRiIj09PXRoaXMubGF5b3V0LGY9ZD8yOjE7Zm9yKDt0aGlzW3IuJGV4dHJhXS5hdHRlbXB0PGY7dGhpc1tyLiRleHRyYV0uYXR0ZW1wdCsrKXtkJiYxPT09dGhpc1tyLiRleHRyYV0uYXR0ZW1wdCYmKHRoaXNbci4kZXh0cmFdLm51bWJlckluTGluZT0wKTtjb25zdCBlPXRoaXNbci4kY2hpbGRyZW5Ub0hUTUxdKHtmaWx0ZXI6byxpbmNsdWRlOiEwfSk7aWYoZS5zdWNjZXNzKWJyZWFrO2lmKGUuaXNCcmVhaygpKXt0aGlzW3IuJHBvcFBhcmFdKCk7cmV0dXJuIGV9aWYoZCYmMD09PXRoaXNbci4kZXh0cmFdLmF0dGVtcHQmJjA9PT10aGlzW3IuJGV4dHJhXS5udW1iZXJJbkxpbmUmJiF0aGlzW3IuJGdldFRlbXBsYXRlUm9vdF0oKVtyLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKXt0aGlzW3IuJGV4dHJhXS5hdHRlbXB0PWY7YnJlYWt9fXRoaXNbci4kcG9wUGFyYV0oKTtufHx1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpO2lmKHRoaXNbci4kZXh0cmFdLmF0dGVtcHQ9PT1mKXtufHxkZWxldGUgdGhpc1tyLiRleHRyYV07cmV0dXJuIGMuSFRNTFJlc3VsdC5GQUlMVVJFfWxldCBnPTAscD0wO2lmKHRoaXMubWFyZ2luKXtnPXRoaXMubWFyZ2luLmxlZnRJbnNldCt0aGlzLm1hcmdpbi5yaWdodEluc2V0O3A9dGhpcy5tYXJnaW4udG9wSW5zZXQrdGhpcy5tYXJnaW4uYm90dG9tSW5zZXR9Y29uc3QgbT1NYXRoLm1heCh0aGlzW3IuJGV4dHJhXS53aWR0aCtnLHRoaXMud3x8MCksYj1NYXRoLm1heCh0aGlzW3IuJGV4dHJhXS5oZWlnaHQrcCx0aGlzLmh8fDApLHk9W3RoaXMueCx0aGlzLnksbSxiXTsiIj09PXRoaXMudyYmKGwud2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKG0pKTsiIj09PXRoaXMuaCYmKGwuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKShiKSk7Y29uc3Qgdz17bmFtZToiZGl2IixhdHRyaWJ1dGVzOmEsY2hpbGRyZW46dH07YXBwbHlBc3Npc3QodGhpcyxhKTtkZWxldGUgdGhpc1tyLiRleHRyYV07cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyx3KSx5KX19Y2xhc3MgRXhlY3V0ZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImV4ZWN1dGUiKTt0aGlzLmNvbm5lY3Rpb249ZS5jb25uZWN0aW9ufHwiIjt0aGlzLmV4ZWN1dGVUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmV4ZWN1dGVUeXBlLFsiaW1wb3J0IiwicmVtZXJnZSJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMucnVuQXQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucnVuQXQsWyJjbGllbnQiLCJib3RoIiwic2VydmVyIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgRXh0cmFzIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZXh0cmFzIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmV4dHJhcz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuaW1hZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5pbnRlZ2VyPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMudGV4dD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIEZpZWxkIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZmllbGQiLCEwKTt0aGlzLmFjY2Vzcz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hY2Nlc3MsWyJvcGVuIiwibm9uSW50ZXJhY3RpdmUiLCJwcm90ZWN0ZWQiLCJyZWFkT25seSJdKTt0aGlzLmFjY2Vzc0tleT1lLmFjY2Vzc0tleXx8IiI7dGhpcy5hbmNob3JUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFuY2hvclR5cGUsWyJ0b3BMZWZ0IiwiYm90dG9tQ2VudGVyIiwiYm90dG9tTGVmdCIsImJvdHRvbVJpZ2h0IiwibWlkZGxlQ2VudGVyIiwibWlkZGxlTGVmdCIsIm1pZGRsZVJpZ2h0IiwidG9wQ2VudGVyIiwidG9wUmlnaHQiXSk7dGhpcy5jb2xTcGFuPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5jb2xTcGFuLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PmU+PTF8fC0xPT09ZX0pO3RoaXMuaD1lLmg/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5oKToiIjt0aGlzLmhBbGlnbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oQWxpZ24sWyJsZWZ0IiwiY2VudGVyIiwianVzdGlmeSIsImp1c3RpZnlBbGwiLCJyYWRpeCIsInJpZ2h0Il0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5sb2NhbGU9ZS5sb2NhbGV8fCIiO3RoaXMubWF4SD0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1heEgsIjBwdCIpO3RoaXMubWF4Vz0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1heFcsIjBwdCIpO3RoaXMubWluSD0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1pbkgsIjBwdCIpO3RoaXMubWluVz0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1pblcsIjBwdCIpO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSk7dGhpcy5yZWxldmFudD0oMCxjLmdldFJlbGV2YW50KShlLnJlbGV2YW50KTt0aGlzLnJvdGF0ZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUucm90YXRlLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PmUlOTA9PTB9KTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy53PWUudz8oMCxjLmdldE1lYXN1cmVtZW50KShlLncpOiIiO3RoaXMueD0oMCxjLmdldE1lYXN1cmVtZW50KShlLngsIjBwdCIpO3RoaXMueT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnksIjBwdCIpO3RoaXMuYXNzaXN0PW51bGw7dGhpcy5iaW5kPW51bGw7dGhpcy5ib3JkZXI9bnVsbDt0aGlzLmNhbGN1bGF0ZT1udWxsO3RoaXMuY2FwdGlvbj1udWxsO3RoaXMuZGVzYz1udWxsO3RoaXMuZXh0cmFzPW51bGw7dGhpcy5mb250PW51bGw7dGhpcy5mb3JtYXQ9bnVsbDt0aGlzLml0ZW1zPW5ldyBvLlhGQU9iamVjdEFycmF5KDIpO3RoaXMua2VlcD1udWxsO3RoaXMubWFyZ2luPW51bGw7dGhpcy5wYXJhPW51bGw7dGhpcy50cmF2ZXJzYWw9bnVsbDt0aGlzLnVpPW51bGw7dGhpcy52YWxpZGF0ZT1udWxsO3RoaXMudmFsdWU9bnVsbDt0aGlzLmJpbmRJdGVtcz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmNvbm5lY3Q9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5ldmVudD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnNldFByb3BlcnR5PW5ldyBvLlhGQU9iamVjdEFycmF5fVtyLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfVtyLiRzZXRWYWx1ZV0oZSl7X3NldFZhbHVlKHRoaXMsZSl9W3IuJHRvSFRNTF0oZSl7c2V0VGFiSW5kZXgodGhpcyk7aWYoIXRoaXMudWkpe3RoaXMudWk9bmV3IFVpKHt9KTt0aGlzLnVpW3IuJGdsb2JhbERhdGFdPXRoaXNbci4kZ2xvYmFsRGF0YV07dGhpc1tyLiRhcHBlbmRDaGlsZF0odGhpcy51aSk7bGV0IGU7c3dpdGNoKHRoaXMuaXRlbXMuY2hpbGRyZW4ubGVuZ3RoKXtjYXNlIDA6ZT1uZXcgVGV4dEVkaXQoe30pO3RoaXMudWkudGV4dEVkaXQ9ZTticmVhaztjYXNlIDE6ZT1uZXcgQ2hlY2tCdXR0b24oe30pO3RoaXMudWkuY2hlY2tCdXR0b249ZTticmVhaztjYXNlIDI6ZT1uZXcgQ2hvaWNlTGlzdCh7fSk7dGhpcy51aS5jaG9pY2VMaXN0PWV9dGhpcy51aVtyLiRhcHBlbmRDaGlsZF0oZSl9aWYoIXRoaXMudWl8fCJoaWRkZW4iPT09dGhpcy5wcmVzZW5jZXx8ImluYWN0aXZlIj09PXRoaXMucHJlc2VuY2V8fDA9PT10aGlzLmh8fDA9PT10aGlzLncpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTt0aGlzLmNhcHRpb24mJmRlbGV0ZSB0aGlzLmNhcHRpb25bci4kZXh0cmFdO3RoaXNbci4kcHVzaFBhcmFdKCk7Y29uc3QgdD10aGlzLmNhcHRpb24/dGhpcy5jYXB0aW9uW3IuJHRvSFRNTF0oZSkuaHRtbDpudWxsLGE9dGhpcy53LG49dGhpcy5oO2xldCBvPTAsbD0wO2lmKHRoaXMubWFyZ2luKXtvPXRoaXMubWFyZ2luLmxlZnRJbnNldCt0aGlzLm1hcmdpbi5yaWdodEluc2V0O2w9dGhpcy5tYXJnaW4udG9wSW5zZXQrdGhpcy5tYXJnaW4uYm90dG9tSW5zZXR9bGV0IHU9bnVsbDtpZigiIj09PXRoaXMud3x8IiI9PT10aGlzLmgpe2xldCB0PW51bGwsYT1udWxsLG49MCxpPTA7aWYodGhpcy51aS5jaGVja0J1dHRvbiluPWk9dGhpcy51aS5jaGVja0J1dHRvbi5zaXplO2Vsc2V7Y29uc3R7dzp0LGg6YX09KDAscy5sYXlvdXROb2RlKSh0aGlzLGUpO2lmKG51bGwhPT10KXtuPXQ7aT1hfWVsc2UgaT0oMCxoLmdldE1ldHJpY3MpKHRoaXMuZm9udCwhMCkubGluZU5vR2FwfXU9Z2V0Qm9yZGVyRGltcyh0aGlzLnVpW3IuJGdldEV4dHJhXSgpKTtuKz11Lnc7aSs9dS5oO2lmKHRoaXMuY2FwdGlvbil7Y29uc3R7dzpzLGg6byxpc0Jyb2tlbjpsfT10aGlzLmNhcHRpb25bci4kZ2V0RXh0cmFdKGUpO2lmKGwmJnRoaXNbci4kZ2V0U3ViZm9ybVBhcmVudF0oKVtyLiRpc1RoZXJlTW9yZVdpZHRoXSgpKXt0aGlzW3IuJHBvcFBhcmFdKCk7cmV0dXJuIGMuSFRNTFJlc3VsdC5GQUlMVVJFfXQ9czthPW87c3dpdGNoKHRoaXMuY2FwdGlvbi5wbGFjZW1lbnQpe2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6Y2FzZSJpbmxpbmUiOnQrPW47YnJlYWs7Y2FzZSJ0b3AiOmNhc2UiYm90dG9tIjphKz1pfX1lbHNle3Q9bjthPWl9aWYodCYmIiI9PT10aGlzLncpe3QrPW87dGhpcy53PU1hdGgubWluKHRoaXMubWF4Vzw9MD8xLzA6dGhpcy5tYXhXLHRoaXMubWluVysxPHQ/dDp0aGlzLm1pblcpfWlmKGEmJiIiPT09dGhpcy5oKXthKz1sO3RoaXMuaD1NYXRoLm1pbih0aGlzLm1heEg8PTA/MS8wOnRoaXMubWF4SCx0aGlzLm1pbkgrMTxhP2E6dGhpcy5taW5IKX19dGhpc1tyLiRwb3BQYXJhXSgpOygwLHMuZml4RGltZW5zaW9ucykodGhpcyk7c2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7aWYoISgwLGkuY2hlY2tEaW1lbnNpb25zKSh0aGlzLGUpKXt0aGlzLnc9YTt0aGlzLmg9bjt0aGlzW3IuJHBvcFBhcmFdKCk7cmV0dXJuIGMuSFRNTFJlc3VsdC5GQUlMVVJFfXVuc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7Y29uc3QgZD0oMCxzLnRvU3R5bGUpKHRoaXMsImZvbnQiLCJkaW1lbnNpb25zIiwicG9zaXRpb24iLCJyb3RhdGUiLCJhbmNob3JUeXBlIiwicHJlc2VuY2UiLCJtYXJnaW4iLCJoQWxpZ24iKTsoMCxzLnNldE1pbk1heERpbWVuc2lvbnMpKHRoaXMsZCk7Y29uc3QgZj1bInhmYUZpZWxkIl07dGhpcy5mb250JiZmLnB1c2goInhmYUZvbnQiKTsoMCxzLmlzUHJpbnRPbmx5KSh0aGlzKSYmZi5wdXNoKCJ4ZmFQcmludE9ubHkiKTtjb25zdCBnPXtzdHlsZTpkLGlkOnRoaXNbci4kdWlkXSxjbGFzczpmfTtpZihkLm1hcmdpbil7ZC5wYWRkaW5nPWQubWFyZ2luO2RlbGV0ZSBkLm1hcmdpbn0oMCxzLnNldEFjY2VzcykodGhpcyxmKTt0aGlzLm5hbWUmJihnLnhmYU5hbWU9dGhpcy5uYW1lKTtjb25zdCBwPVtdLG09e25hbWU6ImRpdiIsYXR0cmlidXRlczpnLGNoaWxkcmVuOnB9O2FwcGx5QXNzaXN0KHRoaXMsZyk7Y29uc3QgYj10aGlzLmJvcmRlcj90aGlzLmJvcmRlcltyLiR0b1N0eWxlXSgpOm51bGwseT0oMCxzLmNvbXB1dGVCYm94KSh0aGlzLG0sZSksdz10aGlzLnVpW3IuJHRvSFRNTF0oKS5odG1sO2lmKCF3KXtPYmplY3QuYXNzaWduKGQsYik7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyxtKSx5KX10aGlzW3IuJHRhYkluZGV4XSYmKHcuY2hpbGRyZW4/LlswXT93LmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMudGFiaW5kZXg9dGhpc1tyLiR0YWJJbmRleF06dy5hdHRyaWJ1dGVzLnRhYmluZGV4PXRoaXNbci4kdGFiSW5kZXhdKTt3LmF0dHJpYnV0ZXMuc3R5bGV8fCh3LmF0dHJpYnV0ZXMuc3R5bGU9T2JqZWN0LmNyZWF0ZShudWxsKSk7bGV0IFM9bnVsbDtpZih0aGlzLnVpLmJ1dHRvbil7MT09PXcuY2hpbGRyZW4ubGVuZ3RoJiYoW1NdPXcuY2hpbGRyZW4uc3BsaWNlKDAsMSkpO09iamVjdC5hc3NpZ24ody5hdHRyaWJ1dGVzLnN0eWxlLGIpfWVsc2UgT2JqZWN0LmFzc2lnbihkLGIpO3AucHVzaCh3KTtpZih0aGlzLnZhbHVlKWlmKHRoaXMudWkuaW1hZ2VFZGl0KXcuY2hpbGRyZW4ucHVzaCh0aGlzLnZhbHVlW3IuJHRvSFRNTF0oKS5odG1sKTtlbHNlIGlmKCF0aGlzLnVpLmJ1dHRvbil7bGV0IGU9IiI7aWYodGhpcy52YWx1ZS5leERhdGEpZT10aGlzLnZhbHVlLmV4RGF0YVtyLiR0ZXh0XSgpO2Vsc2UgaWYodGhpcy52YWx1ZS50ZXh0KWU9dGhpcy52YWx1ZS50ZXh0W3IuJGdldEV4dHJhXSgpO2Vsc2V7Y29uc3QgdD10aGlzLnZhbHVlW3IuJHRvSFRNTF0oKS5odG1sO251bGwhPT10JiYoZT10LmNoaWxkcmVuWzBdLnZhbHVlKX10aGlzLnVpLnRleHRFZGl0JiZ0aGlzLnZhbHVlLnRleHQ/Lm1heENoYXJzJiYody5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLm1heExlbmd0aD10aGlzLnZhbHVlLnRleHQubWF4Q2hhcnMpO2lmKGUpe2lmKHRoaXMudWkubnVtZXJpY0VkaXQpe2U9cGFyc2VGbG9hdChlKTtlPWlzTmFOKGUpPyIiOmUudG9TdHJpbmcoKX0idGV4dGFyZWEiPT09dy5jaGlsZHJlblswXS5uYW1lP3cuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy50ZXh0Q29udGVudD1lOncuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy52YWx1ZT1lfX1pZighdGhpcy51aS5pbWFnZUVkaXQmJncuY2hpbGRyZW4/LlswXSYmdGhpcy5oKXt1PXV8fGdldEJvcmRlckRpbXModGhpcy51aVtyLiRnZXRFeHRyYV0oKSk7bGV0IHQ9MDtpZih0aGlzLmNhcHRpb24mJlsidG9wIiwiYm90dG9tIl0uaW5jbHVkZXModGhpcy5jYXB0aW9uLnBsYWNlbWVudCkpe3Q9dGhpcy5jYXB0aW9uLnJlc2VydmU7dDw9MCYmKHQ9dGhpcy5jYXB0aW9uW3IuJGdldEV4dHJhXShlKS5oKTtjb25zdCBhPXRoaXMuaC10LWwtdS5oO3cuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQ9KDAscy5tZWFzdXJlVG9TdHJpbmcpKGEpfWVsc2Ugdy5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLnN0eWxlLmhlaWdodD0iMTAwJSJ9UyYmdy5jaGlsZHJlbi5wdXNoKFMpO2lmKCF0KXt3LmF0dHJpYnV0ZXMuY2xhc3MmJncuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFMZWZ0Iik7dGhpcy53PWE7dGhpcy5oPW47cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyxtKSx5KX1pZih0aGlzLnVpLmJ1dHRvbil7ZC5wYWRkaW5nJiZkZWxldGUgZC5wYWRkaW5nOyJkaXYiPT09dC5uYW1lJiYodC5uYW1lPSJzcGFuIik7dy5jaGlsZHJlbi5wdXNoKHQpO3JldHVybiBjLkhUTUxSZXN1bHQuc3VjY2VzcyhtLHkpfXRoaXMudWkuY2hlY2tCdXR0b24mJih0LmF0dHJpYnV0ZXMuY2xhc3NbMF09InhmYUNhcHRpb25Gb3JDaGVja0J1dHRvbiIpO3cuYXR0cmlidXRlcy5jbGFzc3x8KHcuYXR0cmlidXRlcy5jbGFzcz1bXSk7dy5jaGlsZHJlbi5zcGxpY2UoMCwwLHQpO3N3aXRjaCh0aGlzLmNhcHRpb24ucGxhY2VtZW50KXtjYXNlImxlZnQiOmNhc2UiaW5saW5lIjp3LmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhTGVmdCIpO2JyZWFrO2Nhc2UicmlnaHQiOncuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFSaWdodCIpO2JyZWFrO2Nhc2UidG9wIjp3LmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhVG9wIik7YnJlYWs7Y2FzZSJib3R0b20iOncuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFCb3R0b20iKX10aGlzLnc9YTt0aGlzLmg9bjtyZXR1cm4gYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoKDAscy5jcmVhdGVXcmFwcGVyKSh0aGlzLG0pLHkpfX10LkZpZWxkPUZpZWxkO2NsYXNzIEZpbGwgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJmaWxsIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmNvbG9yPW51bGw7dGhpcy5leHRyYXM9bnVsbDt0aGlzLmxpbmVhcj1udWxsO3RoaXMucGF0dGVybj1udWxsO3RoaXMucmFkaWFsPW51bGw7dGhpcy5zb2xpZD1udWxsO3RoaXMuc3RpcHBsZT1udWxsfVtyLiR0b1N0eWxlXSgpe2NvbnN0IGU9dGhpc1tyLiRnZXRQYXJlbnRdKCksdD1lW3IuJGdldFBhcmVudF0oKVtyLiRnZXRQYXJlbnRdKCksYT1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBuPSJjb2xvciIsaT1uO2lmKGUgaW5zdGFuY2VvZiBCb3JkZXIpe249ImJhY2tncm91bmQtY29sb3IiO2k9ImJhY2tncm91bmQiO3QgaW5zdGFuY2VvZiBVaSYmKGEuYmFja2dyb3VuZENvbG9yPSJ3aGl0ZSIpfWlmKGUgaW5zdGFuY2VvZiBSZWN0YW5nbGV8fGUgaW5zdGFuY2VvZiBBcmMpe249aT0iZmlsbCI7YS5maWxsPSJ3aGl0ZSJ9Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2lmKCJleHRyYXMiPT09ZXx8ImNvbG9yIj09PWUpY29udGludWU7Y29uc3QgdD10aGlzW2VdO2lmKCEodCBpbnN0YW5jZW9mIG8uWEZBT2JqZWN0KSljb250aW51ZTtjb25zdCBzPXRbci4kdG9TdHlsZV0odGhpcy5jb2xvcik7cyYmKGFbcy5zdGFydHNXaXRoKCIjIik/bjppXT1zKTtyZXR1cm4gYX1pZih0aGlzLmNvbG9yPy52YWx1ZSl7Y29uc3QgZT10aGlzLmNvbG9yW3IuJHRvU3R5bGVdKCk7YVtlLnN0YXJ0c1dpdGgoIiMiKT9uOmldPWV9cmV0dXJuIGF9fWNsYXNzIEZpbHRlciBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImZpbHRlciIsITApO3RoaXMuYWRkUmV2b2NhdGlvbkluZm89KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYWRkUmV2b2NhdGlvbkluZm8sWyIiLCJyZXF1aXJlZCIsIm9wdGlvbmFsIiwibm9uZSJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLnZlcnNpb249KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTp0aGlzLnZlcnNpb24sZGVmYXVsdFZhbHVlOjUsdmFsaWRhdGU6ZT0+ZT49MSYmZTw9NX0pO3RoaXMuYXBwZWFyYW5jZUZpbHRlcj1udWxsO3RoaXMuY2VydGlmaWNhdGVzPW51bGw7dGhpcy5kaWdlc3RNZXRob2RzPW51bGw7dGhpcy5lbmNvZGluZ3M9bnVsbDt0aGlzLmVuY3J5cHRpb25NZXRob2RzPW51bGw7dGhpcy5oYW5kbGVyPW51bGw7dGhpcy5sb2NrRG9jdW1lbnQ9bnVsbDt0aGlzLm1kcD1udWxsO3RoaXMucmVhc29ucz1udWxsO3RoaXMudGltZVN0YW1wPW51bGx9fWNsYXNzIEZsb2F0IGV4dGVuZHMgby5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImZsb2F0Iik7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W3IuJGZpbmFsaXplXSgpe2NvbnN0IGU9cGFyc2VGbG9hdCh0aGlzW3IuJGNvbnRlbnRdLnRyaW0oKSk7dGhpc1tyLiRjb250ZW50XT1pc05hTihlKT9udWxsOmV9W3IuJHRvSFRNTF0oZSl7cmV0dXJuIHZhbHVlVG9IdG1sKG51bGwhPT10aGlzW3IuJGNvbnRlbnRdP3RoaXNbci4kY29udGVudF0udG9TdHJpbmcoKToiIil9fWNsYXNzIEZvbnQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJmb250IiwhMCk7dGhpcy5iYXNlbGluZVNoaWZ0PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUuYmFzZWxpbmVTaGlmdCk7dGhpcy5mb250SG9yaXpvbnRhbFNjYWxlPSgwLGMuZ2V0RmxvYXQpKHtkYXRhOmUuZm9udEhvcml6b250YWxTY2FsZSxkZWZhdWx0VmFsdWU6MTAwLHZhbGlkYXRlOmU9PmU+PTB9KTt0aGlzLmZvbnRWZXJ0aWNhbFNjYWxlPSgwLGMuZ2V0RmxvYXQpKHtkYXRhOmUuZm9udFZlcnRpY2FsU2NhbGUsZGVmYXVsdFZhbHVlOjEwMCx2YWxpZGF0ZTplPT5lPj0wfSk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLmtlcm5pbmdNb2RlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmtlcm5pbmdNb2RlLFsibm9uZSIsInBhaXIiXSk7dGhpcy5sZXR0ZXJTcGFjaW5nPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubGV0dGVyU3BhY2luZywiMCIpO3RoaXMubGluZVRocm91Z2g9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmxpbmVUaHJvdWdoLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfHwyPT09ZX0pO3RoaXMubGluZVRocm91Z2hQZXJpb2Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubGluZVRocm91Z2hQZXJpb2QsWyJhbGwiLCJ3b3JkIl0pO3RoaXMub3ZlcmxpbmU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLm92ZXJsaW5lLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfHwyPT09ZX0pO3RoaXMub3ZlcmxpbmVQZXJpb2Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUub3ZlcmxpbmVQZXJpb2QsWyJhbGwiLCJ3b3JkIl0pO3RoaXMucG9zdHVyZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wb3N0dXJlLFsibm9ybWFsIiwiaXRhbGljIl0pO3RoaXMuc2l6ZT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnNpemUsIjEwcHQiKTt0aGlzLnR5cGVmYWNlPWUudHlwZWZhY2V8fCJDb3VyaWVyIjt0aGlzLnVuZGVybGluZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUudW5kZXJsaW5lLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfHwyPT09ZX0pO3RoaXMudW5kZXJsaW5lUGVyaW9kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnVuZGVybGluZVBlcmlvZCxbImFsbCIsIndvcmQiXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMud2VpZ2h0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLndlaWdodCxbIm5vcm1hbCIsImJvbGQiXSk7dGhpcy5leHRyYXM9bnVsbDt0aGlzLmZpbGw9bnVsbH1bci4kY2xlYW5dKGUpe3N1cGVyW3IuJGNsZWFuXShlKTt0aGlzW3IuJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMuYWRkKHRoaXMudHlwZWZhY2UpfVtyLiR0b1N0eWxlXSgpe2NvbnN0IGU9KDAscy50b1N0eWxlKSh0aGlzLCJmaWxsIiksdD1lLmNvbG9yO2lmKHQpaWYoIiMwMDAwMDAiPT09dClkZWxldGUgZS5jb2xvcjtlbHNlIGlmKCF0LnN0YXJ0c1dpdGgoIiMiKSl7ZS5iYWNrZ3JvdW5kPXQ7ZS5iYWNrZ3JvdW5kQ2xpcD0idGV4dCI7ZS5jb2xvcj0idHJhbnNwYXJlbnQifXRoaXMuYmFzZWxpbmVTaGlmdCYmKGUudmVydGljYWxBbGlnbj0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5iYXNlbGluZVNoaWZ0KSk7ZS5mb250S2VybmluZz0ibm9uZSI9PT10aGlzLmtlcm5pbmdNb2RlPyJub25lIjoibm9ybWFsIjtlLmxldHRlclNwYWNpbmc9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubGV0dGVyU3BhY2luZyk7aWYoMCE9PXRoaXMubGluZVRocm91Z2gpe2UudGV4dERlY29yYXRpb249ImxpbmUtdGhyb3VnaCI7Mj09PXRoaXMubGluZVRocm91Z2gmJihlLnRleHREZWNvcmF0aW9uU3R5bGU9ImRvdWJsZSIpfWlmKDAhPT10aGlzLm92ZXJsaW5lKXtlLnRleHREZWNvcmF0aW9uPSJvdmVybGluZSI7Mj09PXRoaXMub3ZlcmxpbmUmJihlLnRleHREZWNvcmF0aW9uU3R5bGU9ImRvdWJsZSIpfWUuZm9udFN0eWxlPXRoaXMucG9zdHVyZTtlLmZvbnRTaXplPSgwLHMubWVhc3VyZVRvU3RyaW5nKSguOTkqdGhpcy5zaXplKTsoMCxzLnNldEZvbnRGYW1pbHkpKHRoaXMsdGhpcyx0aGlzW3IuJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIsZSk7aWYoMCE9PXRoaXMudW5kZXJsaW5lKXtlLnRleHREZWNvcmF0aW9uPSJ1bmRlcmxpbmUiOzI9PT10aGlzLnVuZGVybGluZSYmKGUudGV4dERlY29yYXRpb25TdHlsZT0iZG91YmxlIil9ZS5mb250V2VpZ2h0PXRoaXMud2VpZ2h0O3JldHVybiBlfX1jbGFzcyBGb3JtYXQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJmb3JtYXQiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmV4dHJhcz1udWxsO3RoaXMucGljdHVyZT1udWxsfX1jbGFzcyBIYW5kbGVyIGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiaGFuZGxlciIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgSHlwaGVuYXRpb24gZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJoeXBoZW5hdGlvbiIpO3RoaXMuZXhjbHVkZUFsbENhcHM9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmV4Y2x1ZGVBbGxDYXBzLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSk7dGhpcy5leGNsdWRlSW5pdGlhbENhcD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZXhjbHVkZUluaXRpYWxDYXAsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KTt0aGlzLmh5cGhlbmF0ZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuaHlwaGVuYXRlLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnB1c2hDaGFyYWN0ZXJDb3VudD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUucHVzaENoYXJhY3RlckNvdW50LGRlZmF1bHRWYWx1ZTozLHZhbGlkYXRlOmU9PmU+PTB9KTt0aGlzLnJlbWFpbkNoYXJhY3RlckNvdW50PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5yZW1haW5DaGFyYWN0ZXJDb3VudCxkZWZhdWx0VmFsdWU6Myx2YWxpZGF0ZTplPT5lPj0wfSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMud29yZENoYXJhY3RlckNvdW50PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS53b3JkQ2hhcmFjdGVyQ291bnQsZGVmYXVsdFZhbHVlOjcsdmFsaWRhdGU6ZT0+ZT49MH0pfX1jbGFzcyBJbWFnZSBleHRlbmRzIG8uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImltYWdlIik7dGhpcy5hc3BlY3Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYXNwZWN0LFsiZml0IiwiYWN0dWFsIiwiaGVpZ2h0Iiwibm9uZSIsIndpZHRoIl0pO3RoaXMuY29udGVudFR5cGU9ZS5jb250ZW50VHlwZXx8IiI7dGhpcy5ocmVmPWUuaHJlZnx8IiI7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnRyYW5zZmVyRW5jb2Rpbmc9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHJhbnNmZXJFbmNvZGluZyxbImJhc2U2NCIsIm5vbmUiLCJwYWNrYWdlIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bci4kdG9IVE1MXSgpe2lmKHRoaXMuY29udGVudFR5cGUmJiFtLmhhcyh0aGlzLmNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKCkpKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7bGV0IGU9dGhpc1tyLiRnbG9iYWxEYXRhXS5pbWFnZXMmJnRoaXNbci4kZ2xvYmFsRGF0YV0uaW1hZ2VzLmdldCh0aGlzLmhyZWYpO2lmKCFlJiYodGhpcy5ocmVmfHwhdGhpc1tyLiRjb250ZW50XSkpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTtlfHwiYmFzZTY0IiE9PXRoaXMudHJhbnNmZXJFbmNvZGluZ3x8KGU9KDAsbC5zdHJpbmdUb0J5dGVzKShhdG9iKHRoaXNbci4kY29udGVudF0pKSk7aWYoIWUpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTtpZighdGhpcy5jb250ZW50VHlwZSl7Zm9yKGNvbnN0W3QsYV1vZiBiKWlmKGUubGVuZ3RoPnQubGVuZ3RoJiZ0LmV2ZXJ5KCgodCxhKT0+dD09PWVbYV0pKSl7dGhpcy5jb250ZW50VHlwZT1hO2JyZWFrfWlmKCF0aGlzLmNvbnRlbnRUeXBlKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFl9Y29uc3QgdD1uZXcgQmxvYihbZV0se3R5cGU6dGhpcy5jb250ZW50VHlwZX0pO2xldCBhO3N3aXRjaCh0aGlzLmFzcGVjdCl7Y2FzZSJmaXQiOmNhc2UiYWN0dWFsIjpicmVhaztjYXNlImhlaWdodCI6YT17aGVpZ2h0OiIxMDAlIixvYmplY3RGaXQ6ImZpbGwifTticmVhaztjYXNlIm5vbmUiOmE9e3dpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLG9iamVjdEZpdDoiZmlsbCJ9O2JyZWFrO2Nhc2Uid2lkdGgiOmE9e3dpZHRoOiIxMDAlIixvYmplY3RGaXQ6ImZpbGwifX1jb25zdCBuPXRoaXNbci4kZ2V0UGFyZW50XSgpO3JldHVybiBjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiaW1nIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUltYWdlIl0sc3R5bGU6YSxzcmM6VVJMLmNyZWF0ZU9iamVjdFVSTCh0KSxhbHQ6bj9hcmlhTGFiZWwobltyLiRnZXRQYXJlbnRdKCkpOm51bGx9fSl9fWNsYXNzIEltYWdlRWRpdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImltYWdlRWRpdCIsITApO3RoaXMuZGF0YT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5kYXRhLFsibGluayIsImVtYmVkIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuYm9yZGVyPW51bGw7dGhpcy5leHRyYXM9bnVsbDt0aGlzLm1hcmdpbj1udWxsfVtyLiR0b0hUTUxdKGUpe3JldHVybiJlbWJlZCI9PT10aGlzLmRhdGE/Yy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImRpdiIsY2hpbGRyZW46W10sYXR0cmlidXRlczp7fX0pOmMuSFRNTFJlc3VsdC5FTVBUWX19Y2xhc3MgSW50ZWdlciBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJpbnRlZ2VyIik7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W3IuJGZpbmFsaXplXSgpe2NvbnN0IGU9cGFyc2VJbnQodGhpc1tyLiRjb250ZW50XS50cmltKCksMTApO3RoaXNbci4kY29udGVudF09aXNOYU4oZSk/bnVsbDplfVtyLiR0b0hUTUxdKGUpe3JldHVybiB2YWx1ZVRvSHRtbChudWxsIT09dGhpc1tyLiRjb250ZW50XT90aGlzW3IuJGNvbnRlbnRdLnRvU3RyaW5nKCk6IiIpfX1jbGFzcyBJc3N1ZXJzIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiaXNzdWVycyIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmNlcnRpZmljYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBJdGVtcyBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIml0ZW1zIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pO3RoaXMucmVmPWUucmVmfHwiIjt0aGlzLnNhdmU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnNhdmUsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuaW1hZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5pbnRlZ2VyPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMudGV4dD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W3IuJHRvSFRNTF0oKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIHRoaXNbci4kZ2V0Q2hpbGRyZW5dKCkpZS5wdXNoKHRbci4kdGV4dF0oKSk7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKGUpfX10Lkl0ZW1zPUl0ZW1zO2NsYXNzIEtlZXAgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJrZWVwIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjtjb25zdCB0PVsibm9uZSIsImNvbnRlbnRBcmVhIiwicGFnZUFyZWEiXTt0aGlzLmludGFjdD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5pbnRhY3QsdCk7dGhpcy5uZXh0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm5leHQsdCk7dGhpcy5wcmV2aW91cz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmV2aW91cyx0KTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5leHRyYXM9bnVsbH19Y2xhc3MgS2V5VXNhZ2UgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJrZXlVc2FnZSIpO2NvbnN0IHQ9WyIiLCJ5ZXMiLCJubyJdO3RoaXMuY3JsU2lnbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5jcmxTaWduLHQpO3RoaXMuZGF0YUVuY2lwaGVybWVudD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5kYXRhRW5jaXBoZXJtZW50LHQpO3RoaXMuZGVjaXBoZXJPbmx5PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmRlY2lwaGVyT25seSx0KTt0aGlzLmRpZ2l0YWxTaWduYXR1cmU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuZGlnaXRhbFNpZ25hdHVyZSx0KTt0aGlzLmVuY2lwaGVyT25seT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5lbmNpcGhlck9ubHksdCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLmtleUFncmVlbWVudD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5rZXlBZ3JlZW1lbnQsdCk7dGhpcy5rZXlDZXJ0U2lnbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5rZXlDZXJ0U2lnbix0KTt0aGlzLmtleUVuY2lwaGVybWVudD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5rZXlFbmNpcGhlcm1lbnQsdCk7dGhpcy5ub25SZXB1ZGlhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5ub25SZXB1ZGlhdGlvbix0KTt0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBMaW5lIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibGluZSIsITApO3RoaXMuaGFuZD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oYW5kLFsiZXZlbiIsImxlZnQiLCJyaWdodCJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMuc2xvcGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc2xvcGUsWyJcXCIsIi8iXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZWRnZT1udWxsfVtyLiR0b0hUTUxdKCl7Y29uc3QgZT10aGlzW3IuJGdldFBhcmVudF0oKVtyLiRnZXRQYXJlbnRdKCksdD10aGlzLmVkZ2V8fG5ldyBFZGdlKHt9KSxhPXRbci4kdG9TdHlsZV0oKSxuPU9iamVjdC5jcmVhdGUobnVsbCksaT0idmlzaWJsZSI9PT10LnByZXNlbmNlP3QudGhpY2tuZXNzOjA7bi5zdHJva2VXaWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykoaSk7bi5zdHJva2U9YS5jb2xvcjtsZXQgbyxsLGgsdSxkPSIxMDAlIixmPSIxMDAlIjtpZihlLnc8PWkpe1tvLGwsaCx1XT1bIjUwJSIsMCwiNTAlIiwiMTAwJSJdO2Q9bi5zdHJva2VXaWR0aH1lbHNlIGlmKGUuaDw9aSl7W28sbCxoLHVdPVswLCI1MCUiLCIxMDAlIiwiNTAlIl07Zj1uLnN0cm9rZVdpZHRofWVsc2UiXFwiPT09dGhpcy5zbG9wZT9bbyxsLGgsdV09WzAsMCwiMTAwJSIsIjEwMCUiXTpbbyxsLGgsdV09WzAsIjEwMCUiLCIxMDAlIiwwXTtjb25zdCBwPXtuYW1lOiJzdmciLGNoaWxkcmVuOlt7bmFtZToibGluZSIsYXR0cmlidXRlczp7eG1sbnM6Zyx4MTpvLHkxOmwseDI6aCx5Mjp1LHN0eWxlOm59fV0sYXR0cmlidXRlczp7eG1sbnM6Zyx3aWR0aDpkLGhlaWdodDpmLHN0eWxlOntvdmVyZmxvdzoidmlzaWJsZSJ9fX07aWYoaGFzTWFyZ2luKGUpKXJldHVybiBjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixhdHRyaWJ1dGVzOntzdHlsZTp7ZGlzcGxheToiaW5saW5lIix3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn19LGNoaWxkcmVuOltwXX0pO3AuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3JldHVybiBjLkhUTUxSZXN1bHQuc3VjY2VzcyhwKX19Y2xhc3MgTGluZWFyIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibGluZWFyIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbInRvUmlnaHQiLCJ0b0JvdHRvbSIsInRvTGVmdCIsInRvVG9wIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmNvbG9yPW51bGw7dGhpcy5leHRyYXM9bnVsbH1bci4kdG9TdHlsZV0oZSl7ZT1lP2Vbci4kdG9TdHlsZV0oKToiI0ZGRkZGRiI7cmV0dXJuYGxpbmVhci1ncmFkaWVudCgke3RoaXMudHlwZS5yZXBsYWNlKC8oW1JCTFRdKS8sIiAkMSIpLnRvTG93ZXJDYXNlKCl9LCAke2V9LCAke3RoaXMuY29sb3I/dGhpcy5jb2xvcltyLiR0b1N0eWxlXSgpOiIjMDAwMDAwIn0pYH19Y2xhc3MgTG9ja0RvY3VtZW50IGV4dGVuZHMgby5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImxvY2tEb2N1bWVudCIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bci4kZmluYWxpemVdKCl7dGhpc1tyLiRjb250ZW50XT0oMCxjLmdldFN0cmluZ09wdGlvbikodGhpc1tyLiRjb250ZW50XSxbImF1dG8iLCIwIiwiMSJdKX19Y2xhc3MgTWFuaWZlc3QgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJtYW5pZmVzdCIsITApO3RoaXMuYWN0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFjdGlvbixbImluY2x1ZGUiLCJhbGwiLCJleGNsdWRlIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZXh0cmFzPW51bGw7dGhpcy5yZWY9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIE1hcmdpbiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIm1hcmdpbiIsITApO3RoaXMuYm90dG9tSW5zZXQ9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5ib3R0b21JbnNldCwiMCIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5sZWZ0SW5zZXQ9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5sZWZ0SW5zZXQsIjAiKTt0aGlzLnJpZ2h0SW5zZXQ9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5yaWdodEluc2V0LCIwIik7dGhpcy50b3BJbnNldD0oMCxjLmdldE1lYXN1cmVtZW50KShlLnRvcEluc2V0LCIwIik7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZXh0cmFzPW51bGx9W3IuJHRvU3R5bGVdKCl7cmV0dXJue21hcmdpbjooMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy50b3BJbnNldCkrIiAiKygwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnJpZ2h0SW5zZXQpKyIgIisoMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5ib3R0b21JbnNldCkrIiAiKygwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLmxlZnRJbnNldCl9fX1jbGFzcyBNZHAgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJtZHAiKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMucGVybWlzc2lvbnM9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnBlcm1pc3Npb25zLGRlZmF1bHRWYWx1ZToyLHZhbGlkYXRlOmU9PjE9PT1lfHwzPT09ZX0pO3RoaXMuc2lnbmF0dXJlVHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5zaWduYXR1cmVUeXBlLFsiZmlsbGVyIiwiYXV0aG9yIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgTWVkaXVtIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibWVkaXVtIik7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLmltYWdpbmdCQm94PSgwLGMuZ2V0QkJveCkoZS5pbWFnaW5nQkJveCk7dGhpcy5sb25nPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubG9uZyk7dGhpcy5vcmllbnRhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vcmllbnRhdGlvbixbInBvcnRyYWl0IiwibGFuZHNjYXBlIl0pO3RoaXMuc2hvcnQ9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5zaG9ydCk7dGhpcy5zdG9jaz1lLnN0b2NrfHwiIjt0aGlzLnRyYXlJbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50cmF5SW4sWyJhdXRvIiwiZGVsZWdhdGUiLCJwYWdlRnJvbnQiXSk7dGhpcy50cmF5T3V0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnRyYXlPdXQsWyJhdXRvIiwiZGVsZWdhdGUiXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBNZXNzYWdlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibWVzc2FnZSIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMudGV4dD1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgTnVtZXJpY0VkaXQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJudW1lcmljRWRpdCIsITApO3RoaXMuaFNjcm9sbFBvbGljeT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oU2Nyb2xsUG9saWN5LFsiYXV0byIsIm9mZiIsIm9uIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuYm9yZGVyPW51bGw7dGhpcy5jb21iPW51bGw7dGhpcy5leHRyYXM9bnVsbDt0aGlzLm1hcmdpbj1udWxsfVtyLiR0b0hUTUxdKGUpe2NvbnN0IHQ9KDAscy50b1N0eWxlKSh0aGlzLCJib3JkZXIiLCJmb250IiwibWFyZ2luIiksYT10aGlzW3IuJGdldFBhcmVudF0oKVtyLiRnZXRQYXJlbnRdKCksbj17bmFtZToiaW5wdXQiLGF0dHJpYnV0ZXM6e3R5cGU6InRleHQiLGZpZWxkSWQ6YVtyLiR1aWRdLGRhdGFJZDphW3IuJGRhdGFdPy5bci4kdWlkXXx8YVtyLiR1aWRdLGNsYXNzOlsieGZhVGV4dGZpZWxkIl0sc3R5bGU6dCwiYXJpYS1sYWJlbCI6YXJpYUxhYmVsKGEpLCJhcmlhLXJlcXVpcmVkIjohMX19O2lmKGlzUmVxdWlyZWQoYSkpe24uYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdPSEwO24uYXR0cmlidXRlcy5yZXF1aXJlZD0hMH1yZXR1cm4gYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOltuXX0pfX1jbGFzcyBPY2N1ciBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIm9jY3VyIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLmluaXRpYWw9IiIhPT1lLmluaXRpYWw/KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmluaXRpYWwsZGVmYXVsdFZhbHVlOiIiLHZhbGlkYXRlOmU9PiEwfSk6IiI7dGhpcy5tYXg9IiIhPT1lLm1heD8oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWF4LGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PiEwfSk6IiI7dGhpcy5taW49IiIhPT1lLm1pbj8oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWluLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PiEwfSk6IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZXh0cmFzPW51bGx9W3IuJGNsZWFuXSgpe2NvbnN0IGU9dGhpc1tyLiRnZXRQYXJlbnRdKCksdD10aGlzLm1pbjsiIj09PXRoaXMubWluJiYodGhpcy5taW49ZSBpbnN0YW5jZW9mIFBhZ2VBcmVhfHxlIGluc3RhbmNlb2YgUGFnZVNldD8wOjEpOyIiPT09dGhpcy5tYXgmJih0aGlzLm1heD0iIj09PXQ/ZSBpbnN0YW5jZW9mIFBhZ2VBcmVhfHxlIGluc3RhbmNlb2YgUGFnZVNldD8tMToxOnRoaXMubWluKTstMSE9PXRoaXMubWF4JiZ0aGlzLm1heDx0aGlzLm1pbiYmKHRoaXMubWF4PXRoaXMubWluKTsiIj09PXRoaXMuaW5pdGlhbCYmKHRoaXMuaW5pdGlhbD1lIGluc3RhbmNlb2YgVGVtcGxhdGU/MTp0aGlzLm1pbil9fWNsYXNzIE9pZCBleHRlbmRzIG8uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIm9pZCIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBPaWRzIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwib2lkcyIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLm9pZD1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgT3ZlcmZsb3cgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJvdmVyZmxvdyIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5sZWFkZXI9ZS5sZWFkZXJ8fCIiO3RoaXMudGFyZ2V0PWUudGFyZ2V0fHwiIjt0aGlzLnRyYWlsZXI9ZS50cmFpbGVyfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W3IuJGdldEV4dHJhXSgpe2lmKCF0aGlzW3IuJGV4dHJhXSl7Y29uc3QgZT10aGlzW3IuJGdldFBhcmVudF0oKSx0PXRoaXNbci4kZ2V0VGVtcGxhdGVSb290XSgpLGE9dFtyLiRzZWFyY2hOb2RlXSh0aGlzLnRhcmdldCxlKSxuPXRbci4kc2VhcmNoTm9kZV0odGhpcy5sZWFkZXIsZSksaT10W3IuJHNlYXJjaE5vZGVdKHRoaXMudHJhaWxlcixlKTt0aGlzW3IuJGV4dHJhXT17dGFyZ2V0OmE/LlswXXx8bnVsbCxsZWFkZXI6bj8uWzBdfHxudWxsLHRyYWlsZXI6aT8uWzBdfHxudWxsLGFkZExlYWRlcjohMSxhZGRUcmFpbGVyOiExfX1yZXR1cm4gdGhpc1tyLiRleHRyYV19fWNsYXNzIFBhZ2VBcmVhIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwicGFnZUFyZWEiLCEwKTt0aGlzLmJsYW5rT3JOb3RCbGFuaz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5ibGFua09yTm90QmxhbmssWyJhbnkiLCJibGFuayIsIm5vdEJsYW5rIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5pbml0aWFsTnVtYmVyPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5pbml0aWFsTnVtYmVyLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PiEwfSk7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy5udW1iZXJlZD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubnVtYmVyZWQsZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+ITB9KTt0aGlzLm9kZE9yRXZlbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vZGRPckV2ZW4sWyJhbnkiLCJldmVuIiwib2RkIl0pO3RoaXMucGFnZVBvc2l0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnBhZ2VQb3NpdGlvbixbImFueSIsImZpcnN0IiwibGFzdCIsIm9ubHkiLCJyZXN0Il0pO3RoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZGVzYz1udWxsO3RoaXMuZXh0cmFzPW51bGw7dGhpcy5tZWRpdW09bnVsbDt0aGlzLm9jY3VyPW51bGw7dGhpcy5hcmVhPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuY29udGVudEFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5kcmF3PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZXhjbEdyb3VwPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZmllbGQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5zdWJmb3JtPW5ldyBvLlhGQU9iamVjdEFycmF5fVtyLiRpc1VzYWJsZV0oKXtpZighdGhpc1tyLiRleHRyYV0pe3RoaXNbci4kZXh0cmFdPXtudW1iZXJPZlVzZTowfTtyZXR1cm4hMH1yZXR1cm4hdGhpcy5vY2N1cnx8LTE9PT10aGlzLm9jY3VyLm1heHx8dGhpc1tyLiRleHRyYV0ubnVtYmVyT2ZVc2U8dGhpcy5vY2N1ci5tYXh9W3IuJGNsZWFuUGFnZV0oKXtkZWxldGUgdGhpc1tyLiRleHRyYV19W3IuJGdldE5leHRQYWdlXSgpe3RoaXNbci4kZXh0cmFdfHwodGhpc1tyLiRleHRyYV09e251bWJlck9mVXNlOjB9KTtjb25zdCBlPXRoaXNbci4kZ2V0UGFyZW50XSgpO2lmKCJvcmRlcmVkT2NjdXJyZW5jZSI9PT1lLnJlbGF0aW9uJiZ0aGlzW3IuJGlzVXNhYmxlXSgpKXt0aGlzW3IuJGV4dHJhXS5udW1iZXJPZlVzZSs9MTtyZXR1cm4gdGhpc31yZXR1cm4gZVtyLiRnZXROZXh0UGFnZV0oKX1bci4kZ2V0QXZhaWxhYmxlU3BhY2VdKCl7cmV0dXJuIHRoaXNbci4kZXh0cmFdLnNwYWNlfHx7d2lkdGg6MCxoZWlnaHQ6MH19W3IuJHRvSFRNTF0oKXt0aGlzW3IuJGV4dHJhXXx8KHRoaXNbci4kZXh0cmFdPXtudW1iZXJPZlVzZToxfSk7Y29uc3QgZT1bXTt0aGlzW3IuJGV4dHJhXS5jaGlsZHJlbj1lO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtpZih0aGlzLm1lZGl1bSYmdGhpcy5tZWRpdW0uc2hvcnQmJnRoaXMubWVkaXVtLmxvbmcpe3Qud2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubWVkaXVtLnNob3J0KTt0LmhlaWdodD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tZWRpdW0ubG9uZyk7dGhpc1tyLiRleHRyYV0uc3BhY2U9e3dpZHRoOnRoaXMubWVkaXVtLnNob3J0LGhlaWdodDp0aGlzLm1lZGl1bS5sb25nfTtpZigibGFuZHNjYXBlIj09PXRoaXMubWVkaXVtLm9yaWVudGF0aW9uKXtjb25zdCBlPXQud2lkdGg7dC53aWR0aD10LmhlaWdodDt0LmhlaWdodD1lO3RoaXNbci4kZXh0cmFdLnNwYWNlPXt3aWR0aDp0aGlzLm1lZGl1bS5sb25nLGhlaWdodDp0aGlzLm1lZGl1bS5zaG9ydH19fWVsc2UoMCxsLndhcm4pKCJYRkEgLSBObyBtZWRpdW0gc3BlY2lmaWVkIGluIHBhZ2VBcmVhOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKTt0aGlzW3IuJGNoaWxkcmVuVG9IVE1MXSh7ZmlsdGVyOm5ldyBTZXQoWyJhcmVhIiwiZHJhdyIsImZpZWxkIiwic3ViZm9ybSJdKSxpbmNsdWRlOiEwfSk7dGhpc1tyLiRjaGlsZHJlblRvSFRNTF0oe2ZpbHRlcjpuZXcgU2V0KFsiY29udGVudEFyZWEiXSksaW5jbHVkZTohMH0pO3JldHVybiBjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixjaGlsZHJlbjplLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhUGFnZSJdLGlkOnRoaXNbci4kdWlkXSxzdHlsZTp0LHhmYU5hbWU6dGhpcy5uYW1lfX0pfX1jbGFzcyBQYWdlU2V0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwicGFnZVNldCIsITApO3RoaXMuZHVwbGV4SW1wb3NpdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5kdXBsZXhJbXBvc2l0aW9uLFsibG9uZ0VkZ2UiLCJzaG9ydEVkZ2UiXSk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnJlbGF0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnJlbGF0aW9uLFsib3JkZXJlZE9jY3VycmVuY2UiLCJkdXBsZXhQYWdpbmF0ZWQiLCJzaW1wbGV4UGFnaW5hdGVkIl0pO3RoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZXh0cmFzPW51bGw7dGhpcy5vY2N1cj1udWxsO3RoaXMucGFnZUFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5wYWdlU2V0PW5ldyBvLlhGQU9iamVjdEFycmF5fVtyLiRjbGVhblBhZ2VdKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5wYWdlQXJlYS5jaGlsZHJlbillW3IuJGNsZWFuUGFnZV0oKTtmb3IoY29uc3QgZSBvZiB0aGlzLnBhZ2VTZXQuY2hpbGRyZW4pZVtyLiRjbGVhblBhZ2VdKCl9W3IuJGlzVXNhYmxlXSgpe3JldHVybiF0aGlzLm9jY3VyfHwtMT09PXRoaXMub2NjdXIubWF4fHx0aGlzW3IuJGV4dHJhXS5udW1iZXJPZlVzZTx0aGlzLm9jY3VyLm1heH1bci4kZ2V0TmV4dFBhZ2VdKCl7dGhpc1tyLiRleHRyYV18fCh0aGlzW3IuJGV4dHJhXT17bnVtYmVyT2ZVc2U6MSxwYWdlSW5kZXg6LTEscGFnZVNldEluZGV4Oi0xfSk7aWYoIm9yZGVyZWRPY2N1cnJlbmNlIj09PXRoaXMucmVsYXRpb24pe2lmKHRoaXNbci4kZXh0cmFdLnBhZ2VJbmRleCsxPHRoaXMucGFnZUFyZWEuY2hpbGRyZW4ubGVuZ3RoKXt0aGlzW3IuJGV4dHJhXS5wYWdlSW5kZXgrPTE7cmV0dXJuIHRoaXMucGFnZUFyZWEuY2hpbGRyZW5bdGhpc1tyLiRleHRyYV0ucGFnZUluZGV4XVtyLiRnZXROZXh0UGFnZV0oKX1pZih0aGlzW3IuJGV4dHJhXS5wYWdlU2V0SW5kZXgrMTx0aGlzLnBhZ2VTZXQuY2hpbGRyZW4ubGVuZ3RoKXt0aGlzW3IuJGV4dHJhXS5wYWdlU2V0SW5kZXgrPTE7cmV0dXJuIHRoaXMucGFnZVNldC5jaGlsZHJlblt0aGlzW3IuJGV4dHJhXS5wYWdlU2V0SW5kZXhdW3IuJGdldE5leHRQYWdlXSgpfWlmKHRoaXNbci4kaXNVc2FibGVdKCkpe3RoaXNbci4kZXh0cmFdLm51bWJlck9mVXNlKz0xO3RoaXNbci4kZXh0cmFdLnBhZ2VJbmRleD0tMTt0aGlzW3IuJGV4dHJhXS5wYWdlU2V0SW5kZXg9LTE7cmV0dXJuIHRoaXNbci4kZ2V0TmV4dFBhZ2VdKCl9Y29uc3QgZT10aGlzW3IuJGdldFBhcmVudF0oKTtpZihlIGluc3RhbmNlb2YgUGFnZVNldClyZXR1cm4gZVtyLiRnZXROZXh0UGFnZV0oKTt0aGlzW3IuJGNsZWFuUGFnZV0oKTtyZXR1cm4gdGhpc1tyLiRnZXROZXh0UGFnZV0oKX1jb25zdCBlPXRoaXNbci4kZ2V0VGVtcGxhdGVSb290XSgpW3IuJGV4dHJhXS5wYWdlTnVtYmVyLHQ9ZSUyPT0wPyJldmVuIjoib2RkIixhPTA9PT1lPyJmaXJzdCI6InJlc3QiO2xldCBuPXRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZCgoZT0+ZS5vZGRPckV2ZW49PT10JiZlLnBhZ2VQb3NpdGlvbj09PWEpKTtpZihuKXJldHVybiBuO249dGhpcy5wYWdlQXJlYS5jaGlsZHJlbi5maW5kKChlPT4iYW55Ij09PWUub2RkT3JFdmVuJiZlLnBhZ2VQb3NpdGlvbj09PWEpKTtpZihuKXJldHVybiBuO249dGhpcy5wYWdlQXJlYS5jaGlsZHJlbi5maW5kKChlPT4iYW55Ij09PWUub2RkT3JFdmVuJiYiYW55Ij09PWUucGFnZVBvc2l0aW9uKSk7cmV0dXJuIG58fHRoaXMucGFnZUFyZWEuY2hpbGRyZW5bMF19fWNsYXNzIFBhcmEgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJwYXJhIiwhMCk7dGhpcy5oQWxpZ249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaEFsaWduLFsibGVmdCIsImNlbnRlciIsImp1c3RpZnkiLCJqdXN0aWZ5QWxsIiwicmFkaXgiLCJyaWdodCJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubGluZUhlaWdodD1lLmxpbmVIZWlnaHQ/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5saW5lSGVpZ2h0LCIwcHQiKToiIjt0aGlzLm1hcmdpbkxlZnQ9ZS5tYXJnaW5MZWZ0PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWFyZ2luTGVmdCwiMHB0Iik6IiI7dGhpcy5tYXJnaW5SaWdodD1lLm1hcmdpblJpZ2h0PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWFyZ2luUmlnaHQsIjBwdCIpOiIiO3RoaXMub3JwaGFucz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUub3JwaGFucyxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT5lPj0wfSk7dGhpcy5wcmVzZXJ2ZT1lLnByZXNlcnZlfHwiIjt0aGlzLnJhZGl4T2Zmc2V0PWUucmFkaXhPZmZzZXQ/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5yYWRpeE9mZnNldCwiMHB0Iik6IiI7dGhpcy5zcGFjZUFib3ZlPWUuc3BhY2VBYm92ZT8oMCxjLmdldE1lYXN1cmVtZW50KShlLnNwYWNlQWJvdmUsIjBwdCIpOiIiO3RoaXMuc3BhY2VCZWxvdz1lLnNwYWNlQmVsb3c/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5zcGFjZUJlbG93LCIwcHQiKToiIjt0aGlzLnRhYkRlZmF1bHQ9ZS50YWJEZWZhdWx0PygwLGMuZ2V0TWVhc3VyZW1lbnQpKHRoaXMudGFiRGVmYXVsdCk6IiI7dGhpcy50YWJTdG9wcz0oZS50YWJTdG9wc3x8IiIpLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKCgoZSx0KT0+dCUyPT0xPygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUpOmUpKTt0aGlzLnRleHRJbmRlbnQ9ZS50ZXh0SW5kZW50PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudGV4dEluZGVudCwiMHB0Iik6IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMudkFsaWduPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnZBbGlnbixbInRvcCIsImJvdHRvbSIsIm1pZGRsZSJdKTt0aGlzLndpZG93cz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUud2lkb3dzLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PmU+PTB9KTt0aGlzLmh5cGhlbmF0aW9uPW51bGx9W3IuJHRvU3R5bGVdKCl7Y29uc3QgZT0oMCxzLnRvU3R5bGUpKHRoaXMsImhBbGlnbiIpOyIiIT09dGhpcy5tYXJnaW5MZWZ0JiYoZS5wYWRkaW5nTGVmdD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tYXJnaW5MZWZ0KSk7IiIhPT10aGlzLm1hcmdpblJpZ2h0JiYoZS5wYWRkaW5naWdodD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tYXJnaW5SaWdodCkpOyIiIT09dGhpcy5zcGFjZUFib3ZlJiYoZS5wYWRkaW5nVG9wPSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnNwYWNlQWJvdmUpKTsiIiE9PXRoaXMuc3BhY2VCZWxvdyYmKGUucGFkZGluZ0JvdHRvbT0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5zcGFjZUJlbG93KSk7aWYoIiIhPT10aGlzLnRleHRJbmRlbnQpe2UudGV4dEluZGVudD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy50ZXh0SW5kZW50KTsoMCxzLmZpeFRleHRJbmRlbnQpKGUpfXRoaXMubGluZUhlaWdodD4wJiYoZS5saW5lSGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLmxpbmVIZWlnaHQpKTsiIiE9PXRoaXMudGFiRGVmYXVsdCYmKGUudGFiU2l6ZT0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy50YWJEZWZhdWx0KSk7dGhpcy50YWJTdG9wcy5sZW5ndGg7dGhpcy5oeXBoZW5hdGF0aW9uJiZPYmplY3QuYXNzaWduKGUsdGhpcy5oeXBoZW5hdGF0aW9uW3IuJHRvU3R5bGVdKCkpO3JldHVybiBlfX1jbGFzcyBQYXNzd29yZEVkaXQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJwYXNzd29yZEVkaXQiLCEwKTt0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMucGFzc3dvcmRDaGFyPWUucGFzc3dvcmRDaGFyfHwiKiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuYm9yZGVyPW51bGw7dGhpcy5leHRyYXM9bnVsbDt0aGlzLm1hcmdpbj1udWxsfX1jbGFzcyBQYXR0ZXJuIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwicGF0dGVybiIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJjcm9zc0hhdGNoIiwiY3Jvc3NEaWFnb25hbCIsImRpYWdvbmFsTGVmdCIsImRpYWdvbmFsUmlnaHQiLCJob3Jpem9udGFsIiwidmVydGljYWwiXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuY29sb3I9bnVsbDt0aGlzLmV4dHJhcz1udWxsfVtyLiR0b1N0eWxlXShlKXtlPWU/ZVtyLiR0b1N0eWxlXSgpOiIjRkZGRkZGIjtjb25zdCB0PXRoaXMuY29sb3I/dGhpcy5jb2xvcltyLiR0b1N0eWxlXSgpOiIjMDAwMDAwIixhPSJyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50IixuPWAke2V9LCR7ZX0gNXB4LCR7dH0gNXB4LCR7dH0gMTBweGA7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJjcm9zc0hhdGNoIjpyZXR1cm5gJHthfSh0byB0b3AsJHtufSkgJHthfSh0byByaWdodCwke259KWA7Y2FzZSJjcm9zc0RpYWdvbmFsIjpyZXR1cm5gJHthfSg0NWRlZywke259KSAke2F9KC00NWRlZywke259KWA7Y2FzZSJkaWFnb25hbExlZnQiOnJldHVybmAke2F9KDQ1ZGVnLCR7bn0pYDtjYXNlImRpYWdvbmFsUmlnaHQiOnJldHVybmAke2F9KC00NWRlZywke259KWA7Y2FzZSJob3Jpem9udGFsIjpyZXR1cm5gJHthfSh0byB0b3AsJHtufSlgO2Nhc2UidmVydGljYWwiOnJldHVybmAke2F9KHRvIHJpZ2h0LCR7bn0pYH1yZXR1cm4iIn19Y2xhc3MgUGljdHVyZSBleHRlbmRzIG8uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInBpY3R1cmUiKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgUHJvdG8gZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJwcm90byIsITApO3RoaXMuYXBwZWFyYW5jZUZpbHRlcj1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmFyYz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5hc3Npc3Q9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5iYXJjb2RlPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuYmluZEl0ZW1zPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuYm9va2VuZD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmJvb2xlYW49bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5ib3JkZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5icmVhaz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmJyZWFrQWZ0ZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5icmVha0JlZm9yZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmJ1dHRvbj1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmNhbGN1bGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmNhcHRpb249bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5jZXJ0aWZpY2F0ZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmNlcnRpZmljYXRlcz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmNoZWNrQnV0dG9uPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuY2hvaWNlTGlzdD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmNvbG9yPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuY29tYj1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmNvbm5lY3Q9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5jb250ZW50QXJlYT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmNvcm5lcj1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmRhdGU9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5kYXRlVGltZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmRhdGVUaW1lRWRpdD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmRlY2ltYWw9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5kZWZhdWx0VWk9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5kZXNjPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZGlnZXN0TWV0aG9kPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZGlnZXN0TWV0aG9kcz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmRyYXc9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5lZGdlPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZW5jb2Rpbmc9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5lbmNvZGluZ3M9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5lbmNyeXB0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZW5jcnlwdERhdGE9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5lbmNyeXB0aW9uPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZW5jcnlwdGlvbk1ldGhvZD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmVuY3J5cHRpb25NZXRob2RzPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZXZlbnQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5leERhdGE9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5leE9iamVjdD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmV4Y2xHcm91cD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmV4ZWN1dGU9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5leHRyYXM9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5maWVsZD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmZpbGw9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5maWx0ZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5mbG9hdD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmZvbnQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5mb3JtYXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5oYW5kbGVyPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuaHlwaGVuYXRpb249bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5pbWFnZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmltYWdlRWRpdD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmludGVnZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5pc3N1ZXJzPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuaXRlbXM9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5rZWVwPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMua2V5VXNhZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5saW5lPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMubGluZWFyPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMubG9ja0RvY3VtZW50PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMubWFuaWZlc3Q9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5tYXJnaW49bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5tZHA9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5tZWRpdW09bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5tZXNzYWdlPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMubnVtZXJpY0VkaXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5vY2N1cj1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLm9pZD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLm9pZHM9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5vdmVyZmxvdz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnBhZ2VBcmVhPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMucGFnZVNldD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnBhcmE9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5wYXNzd29yZEVkaXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5wYXR0ZXJuPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMucGljdHVyZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnJhZGlhbD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnJlYXNvbj1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnJlYXNvbnM9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5yZWN0YW5nbGU9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5yZWY9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5zY3JpcHQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5zZXRQcm9wZXJ0eT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnNpZ25EYXRhPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc2lnbmF0dXJlPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc2lnbmluZz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnNvbGlkPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc3BlYWs9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5zdGlwcGxlPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc3ViZm9ybT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnN1YmZvcm1TZXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5zdWJqZWN0RE49bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5zdWJqZWN0RE5zPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc3VibWl0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMudGV4dD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnRleHRFZGl0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMudGltZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnRpbWVTdGFtcD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnRvb2xUaXA9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy50cmF2ZXJzYWw9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy50cmF2ZXJzZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnVpPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMudmFsaWRhdGU9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy52YWx1ZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnZhcmlhYmxlcz1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgUmFkaWFsIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwicmFkaWFsIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbInRvRWRnZSIsInRvQ2VudGVyIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmNvbG9yPW51bGw7dGhpcy5leHRyYXM9bnVsbH1bci4kdG9TdHlsZV0oZSl7ZT1lP2Vbci4kdG9TdHlsZV0oKToiI0ZGRkZGRiI7Y29uc3QgdD10aGlzLmNvbG9yP3RoaXMuY29sb3Jbci4kdG9TdHlsZV0oKToiIzAwMDAwMCI7cmV0dXJuYHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgY2VudGVyLCAkeyJ0b0VkZ2UiPT09dGhpcy50eXBlP2Ake2V9LCR7dH1gOmAke3R9LCR7ZX1gfSlgfX1jbGFzcyBSZWFzb24gZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJyZWFzb24iKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgUmVhc29ucyBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInJlYXNvbnMiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsib3B0aW9uYWwiLCJyZXF1aXJlZCJdKTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5yZWFzb249bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIFJlY3RhbmdsZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInJlY3RhbmdsZSIsITApO3RoaXMuaGFuZD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oYW5kLFsiZXZlbiIsImxlZnQiLCJyaWdodCJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmNvcm5lcj1uZXcgby5YRkFPYmplY3RBcnJheSg0KTt0aGlzLmVkZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXkoNCk7dGhpcy5maWxsPW51bGx9W3IuJHRvSFRNTF0oKXtjb25zdCBlPXRoaXMuZWRnZS5jaGlsZHJlbi5sZW5ndGg/dGhpcy5lZGdlLmNoaWxkcmVuWzBdOm5ldyBFZGdlKHt9KSx0PWVbci4kdG9TdHlsZV0oKSxhPU9iamVjdC5jcmVhdGUobnVsbCk7InZpc2libGUiPT09dGhpcy5maWxsPy5wcmVzZW5jZT9PYmplY3QuYXNzaWduKGEsdGhpcy5maWxsW3IuJHRvU3R5bGVdKCkpOmEuZmlsbD0idHJhbnNwYXJlbnQiO2Euc3Ryb2tlV2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKCJ2aXNpYmxlIj09PWUucHJlc2VuY2U/ZS50aGlja25lc3M6MCk7YS5zdHJva2U9dC5jb2xvcjtjb25zdCBuPSh0aGlzLmNvcm5lci5jaGlsZHJlbi5sZW5ndGg/dGhpcy5jb3JuZXIuY2hpbGRyZW5bMF06bmV3IENvcm5lcih7fSkpW3IuJHRvU3R5bGVdKCksaT17bmFtZToic3ZnIixjaGlsZHJlbjpbe25hbWU6InJlY3QiLGF0dHJpYnV0ZXM6e3htbG5zOmcsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIseDowLHk6MCxyeDpuLnJhZGl1cyxyeTpuLnJhZGl1cyxzdHlsZTphfX1dLGF0dHJpYnV0ZXM6e3htbG5zOmcsc3R5bGU6e292ZXJmbG93OiJ2aXNpYmxlIn0sd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSJ9fTtpZihoYXNNYXJnaW4odGhpc1tyLiRnZXRQYXJlbnRdKClbci4kZ2V0UGFyZW50XSgpKSlyZXR1cm4gYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImRpdiIsYXR0cmlidXRlczp7c3R5bGU6e2Rpc3BsYXk6ImlubGluZSIsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSJ9fSxjaGlsZHJlbjpbaV19KTtpLmF0dHJpYnV0ZXMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtyZXR1cm4gYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoaSl9fWNsYXNzIFJlZkVsZW1lbnQgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJyZWYiKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgU2NyaXB0IGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwic2NyaXB0Iik7dGhpcy5iaW5kaW5nPWUuYmluZGluZ3x8IiI7dGhpcy5jb250ZW50VHlwZT1lLmNvbnRlbnRUeXBlfHwiIjt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMucnVuQXQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucnVuQXQsWyJjbGllbnQiLCJib3RoIiwic2VydmVyIl0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgU2V0UHJvcGVydHkgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzZXRQcm9wZXJ0eSIpO3RoaXMuY29ubmVjdGlvbj1lLmNvbm5lY3Rpb258fCIiO3RoaXMucmVmPWUucmVmfHwiIjt0aGlzLnRhcmdldD1lLnRhcmdldHx8IiJ9fXQuU2V0UHJvcGVydHk9U2V0UHJvcGVydHk7Y2xhc3MgU2lnbkRhdGEgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzaWduRGF0YSIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5vcGVyYXRpb249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUub3BlcmF0aW9uLFsic2lnbiIsImNsZWFyIiwidmVyaWZ5Il0pO3RoaXMucmVmPWUucmVmfHwiIjt0aGlzLnRhcmdldD1lLnRhcmdldHx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZmlsdGVyPW51bGw7dGhpcy5tYW5pZmVzdD1udWxsfX1jbGFzcyBTaWduYXR1cmUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzaWduYXR1cmUiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsiUERGMS4zIiwiUERGMS42Il0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmJvcmRlcj1udWxsO3RoaXMuZXh0cmFzPW51bGw7dGhpcy5maWx0ZXI9bnVsbDt0aGlzLm1hbmlmZXN0PW51bGw7dGhpcy5tYXJnaW49bnVsbH19Y2xhc3MgU2lnbmluZyBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInNpZ25pbmciLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsib3B0aW9uYWwiLCJyZXF1aXJlZCJdKTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5jZXJ0aWZpY2F0ZT1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgU29saWQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzb2xpZCIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZXh0cmFzPW51bGx9W3IuJHRvU3R5bGVdKGUpe3JldHVybiBlP2Vbci4kdG9TdHlsZV0oKToiI0ZGRkZGRiJ9fWNsYXNzIFNwZWFrIGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwic3BlYWsiKTt0aGlzLmRpc2FibGU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmRpc2FibGUsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMucHJpb3JpdHk9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJpb3JpdHksWyJjdXN0b20iLCJjYXB0aW9uIiwibmFtZSIsInRvb2xUaXAiXSk7dGhpcy5yaWQ9ZS5yaWR8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgU3RpcHBsZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN0aXBwbGUiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMucmF0ZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUucmF0ZSxkZWZhdWx0VmFsdWU6NTAsdmFsaWRhdGU6ZT0+ZT49MCYmZTw9MTAwfSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuY29sb3I9bnVsbDt0aGlzLmV4dHJhcz1udWxsfVtyLiR0b1N0eWxlXShlKXtjb25zdCB0PXRoaXMucmF0ZS8xMDA7cmV0dXJuIGwuVXRpbC5tYWtlSGV4Q29sb3IoTWF0aC5yb3VuZChlLnZhbHVlLnIqKDEtdCkrdGhpcy52YWx1ZS5yKnQpLE1hdGgucm91bmQoZS52YWx1ZS5nKigxLXQpK3RoaXMudmFsdWUuZyp0KSxNYXRoLnJvdW5kKGUudmFsdWUuYiooMS10KSt0aGlzLnZhbHVlLmIqdCkpfX1jbGFzcyBTdWJmb3JtIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwic3ViZm9ybSIsITApO3RoaXMuYWNjZXNzPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFjY2VzcyxbIm9wZW4iLCJub25JbnRlcmFjdGl2ZSIsInByb3RlY3RlZCIsInJlYWRPbmx5Il0pO3RoaXMuYWxsb3dNYWNybz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuYWxsb3dNYWNybyxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pO3RoaXMuYW5jaG9yVHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hbmNob3JUeXBlLFsidG9wTGVmdCIsImJvdHRvbUNlbnRlciIsImJvdHRvbUxlZnQiLCJib3R0b21SaWdodCIsIm1pZGRsZUNlbnRlciIsIm1pZGRsZUxlZnQiLCJtaWRkbGVSaWdodCIsInRvcENlbnRlciIsInRvcFJpZ2h0Il0pO3RoaXMuY29sU3Bhbj0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuY29sU3BhbixkZWZhdWx0VmFsdWU6MSx2YWxpZGF0ZTplPT5lPj0xfHwtMT09PWV9KTt0aGlzLmNvbHVtbldpZHRocz0oZS5jb2x1bW5XaWR0aHN8fCIiKS50cmltKCkuc3BsaXQoL1xzKy8pLm1hcCgoZT0+Ii0xIj09PWU/LTE6KDAsYy5nZXRNZWFzdXJlbWVudCkoZSkpKTt0aGlzLmg9ZS5oPygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUuaCk6IiI7dGhpcy5oQWxpZ249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaEFsaWduLFsibGVmdCIsImNlbnRlciIsImp1c3RpZnkiLCJqdXN0aWZ5QWxsIiwicmFkaXgiLCJyaWdodCJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubGF5b3V0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmxheW91dCxbInBvc2l0aW9uIiwibHItdGIiLCJybC1yb3ciLCJybC10YiIsInJvdyIsInRhYmxlIiwidGIiXSk7dGhpcy5sb2NhbGU9ZS5sb2NhbGV8fCIiO3RoaXMubWF4SD0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1heEgsIjBwdCIpO3RoaXMubWF4Vz0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1heFcsIjBwdCIpO3RoaXMubWVyZ2VNb2RlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm1lcmdlTW9kZSxbImNvbnN1bWVEYXRhIiwibWF0Y2hUZW1wbGF0ZSJdKTt0aGlzLm1pbkg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5ILCIwcHQiKTt0aGlzLm1pblc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5XLCIwcHQiKTt0aGlzLm5hbWU9ZS5uYW1lfHwiIjt0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pO3RoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCk7dGhpcy5yZXN0b3JlU3RhdGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucmVzdG9yZVN0YXRlLFsibWFudWFsIiwiYXV0byJdKTt0aGlzLnNjb3BlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnNjb3BlLFsibmFtZSIsIm5vbmUiXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMudz1lLnc/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS53KToiIjt0aGlzLng9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS54LCIwcHQiKTt0aGlzLnk9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS55LCIwcHQiKTt0aGlzLmFzc2lzdD1udWxsO3RoaXMuYmluZD1udWxsO3RoaXMuYm9va2VuZD1udWxsO3RoaXMuYm9yZGVyPW51bGw7dGhpcy5icmVhaz1udWxsO3RoaXMuY2FsY3VsYXRlPW51bGw7dGhpcy5kZXNjPW51bGw7dGhpcy5leHRyYXM9bnVsbDt0aGlzLmtlZXA9bnVsbDt0aGlzLm1hcmdpbj1udWxsO3RoaXMub2NjdXI9bnVsbDt0aGlzLm92ZXJmbG93PW51bGw7dGhpcy5wYWdlU2V0PW51bGw7dGhpcy5wYXJhPW51bGw7dGhpcy50cmF2ZXJzYWw9bnVsbDt0aGlzLnZhbGlkYXRlPW51bGw7dGhpcy52YXJpYWJsZXM9bnVsbDt0aGlzLmFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5icmVha0FmdGVyPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuYnJlYWtCZWZvcmU9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5jb25uZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZHJhdz1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmV2ZW50PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuZXhPYmplY3Q9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5leGNsR3JvdXA9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5maWVsZD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnByb3RvPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc2V0UHJvcGVydHk9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5zdWJmb3JtPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc3ViZm9ybVNldD1uZXcgby5YRkFPYmplY3RBcnJheX1bci4kZ2V0U3ViZm9ybVBhcmVudF0oKXtjb25zdCBlPXRoaXNbci4kZ2V0UGFyZW50XSgpO3JldHVybiBlIGluc3RhbmNlb2YgU3ViZm9ybVNldD9lW3IuJGdldFN1YmZvcm1QYXJlbnRdKCk6ZX1bci4kaXNCaW5kYWJsZV0oKXtyZXR1cm4hMH1bci4kaXNUaGVyZU1vcmVXaWR0aF0oKXtyZXR1cm4gdGhpcy5sYXlvdXQuZW5kc1dpdGgoIi10YiIpJiYwPT09dGhpc1tyLiRleHRyYV0uYXR0ZW1wdCYmdGhpc1tyLiRleHRyYV0ubnVtYmVySW5MaW5lPjB8fHRoaXNbci4kZ2V0UGFyZW50XSgpW3IuJGlzVGhlcmVNb3JlV2lkdGhdKCl9KltyLiRnZXRDb250YWluZWRDaGlsZHJlbl0oKXt5aWVsZCpnZXRDb250YWluZWRDaGlsZHJlbih0aGlzKX1bci4kZmx1c2hIVE1MXSgpe3JldHVybigwLGkuZmx1c2hIVE1MKSh0aGlzKX1bci4kYWRkSFRNTF0oZSx0KXsoMCxpLmFkZEhUTUwpKHRoaXMsZSx0KX1bci4kZ2V0QXZhaWxhYmxlU3BhY2VdKCl7cmV0dXJuKDAsaS5nZXRBdmFpbGFibGVTcGFjZSkodGhpcyl9W3IuJGlzU3BsaXR0YWJsZV0oKXtjb25zdCBlPXRoaXNbci4kZ2V0U3ViZm9ybVBhcmVudF0oKTtpZighZVtyLiRpc1NwbGl0dGFibGVdKCkpcmV0dXJuITE7aWYodm9pZCAwIT09dGhpc1tyLiRleHRyYV0uX2lzU3BsaXR0YWJsZSlyZXR1cm4gdGhpc1tyLiRleHRyYV0uX2lzU3BsaXR0YWJsZTtpZigicG9zaXRpb24iPT09dGhpcy5sYXlvdXR8fHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKSl7dGhpc1tyLiRleHRyYV0uX2lzU3BsaXR0YWJsZT0hMTtyZXR1cm4hMX1pZih0aGlzLmtlZXAmJiJub25lIiE9PXRoaXMua2VlcC5pbnRhY3Qpe3RoaXNbci4kZXh0cmFdLl9pc1NwbGl0dGFibGU9ITE7cmV0dXJuITF9aWYoZS5sYXlvdXQ/LmVuZHNXaXRoKCItdGIiKSYmMCE9PWVbci4kZXh0cmFdLm51bWJlckluTGluZSlyZXR1cm4hMTt0aGlzW3IuJGV4dHJhXS5faXNTcGxpdHRhYmxlPSEwO3JldHVybiEwfVtyLiR0b0hUTUxdKGUpe3NldFRhYkluZGV4KHRoaXMpO2lmKHRoaXMuYnJlYWspe2lmKCJhdXRvIiE9PXRoaXMuYnJlYWsuYWZ0ZXJ8fCIiIT09dGhpcy5icmVhay5hZnRlclRhcmdldCl7Y29uc3QgZT1uZXcgQnJlYWtBZnRlcih7dGFyZ2V0VHlwZTp0aGlzLmJyZWFrLmFmdGVyLHRhcmdldDp0aGlzLmJyZWFrLmFmdGVyVGFyZ2V0LHN0YXJ0TmV3OnRoaXMuYnJlYWsuc3RhcnROZXcudG9TdHJpbmcoKX0pO2Vbci4kZ2xvYmFsRGF0YV09dGhpc1tyLiRnbG9iYWxEYXRhXTt0aGlzW3IuJGFwcGVuZENoaWxkXShlKTt0aGlzLmJyZWFrQWZ0ZXIucHVzaChlKX1pZigiYXV0byIhPT10aGlzLmJyZWFrLmJlZm9yZXx8IiIhPT10aGlzLmJyZWFrLmJlZm9yZVRhcmdldCl7Y29uc3QgZT1uZXcgQnJlYWtCZWZvcmUoe3RhcmdldFR5cGU6dGhpcy5icmVhay5iZWZvcmUsdGFyZ2V0OnRoaXMuYnJlYWsuYmVmb3JlVGFyZ2V0LHN0YXJ0TmV3OnRoaXMuYnJlYWsuc3RhcnROZXcudG9TdHJpbmcoKX0pO2Vbci4kZ2xvYmFsRGF0YV09dGhpc1tyLiRnbG9iYWxEYXRhXTt0aGlzW3IuJGFwcGVuZENoaWxkXShlKTt0aGlzLmJyZWFrQmVmb3JlLnB1c2goZSl9aWYoIiIhPT10aGlzLmJyZWFrLm92ZXJmbG93VGFyZ2V0KXtjb25zdCBlPW5ldyBPdmVyZmxvdyh7dGFyZ2V0OnRoaXMuYnJlYWsub3ZlcmZsb3dUYXJnZXQsbGVhZGVyOnRoaXMuYnJlYWsub3ZlcmZsb3dMZWFkZXIsdHJhaWxlcjp0aGlzLmJyZWFrLm92ZXJmbG93VHJhaWxlcn0pO2Vbci4kZ2xvYmFsRGF0YV09dGhpc1tyLiRnbG9iYWxEYXRhXTt0aGlzW3IuJGFwcGVuZENoaWxkXShlKTt0aGlzLm92ZXJmbG93LnB1c2goZSl9dGhpc1tyLiRyZW1vdmVDaGlsZF0odGhpcy5icmVhayk7dGhpcy5icmVhaz1udWxsfWlmKCJoaWRkZW4iPT09dGhpcy5wcmVzZW5jZXx8ImluYWN0aXZlIj09PXRoaXMucHJlc2VuY2UpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTsodGhpcy5icmVha0JlZm9yZS5jaGlsZHJlbi5sZW5ndGg+MXx8dGhpcy5icmVha0FmdGVyLmNoaWxkcmVuLmxlbmd0aD4xKSYmKDAsbC53YXJuKSgiWEZBIC0gU2V2ZXJhbCBicmVha0JlZm9yZSBvciBicmVha0FmdGVyIGluIHN1YmZvcm1zOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKTtpZih0aGlzLmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aD49MSl7Y29uc3QgZT10aGlzLmJyZWFrQmVmb3JlLmNoaWxkcmVuWzBdO2lmKGhhbmRsZUJyZWFrKGUpKXJldHVybiBjLkhUTUxSZXN1bHQuYnJlYWtOb2RlKGUpfWlmKHRoaXNbci4kZXh0cmFdPy5hZnRlckJyZWFrQWZ0ZXIpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTsoMCxzLmZpeERpbWVuc2lvbnMpKHRoaXMpO2NvbnN0IHQ9W10sYT17aWQ6dGhpc1tyLiR1aWRdLGNsYXNzOltdfTsoMCxzLnNldEFjY2VzcykodGhpcyxhLmNsYXNzKTt0aGlzW3IuJGV4dHJhXXx8KHRoaXNbci4kZXh0cmFdPU9iamVjdC5jcmVhdGUobnVsbCkpO09iamVjdC5hc3NpZ24odGhpc1tyLiRleHRyYV0se2NoaWxkcmVuOnQsbGluZTpudWxsLGF0dHJpYnV0ZXM6YSxhdHRlbXB0OjAsbnVtYmVySW5MaW5lOjAsYXZhaWxhYmxlU3BhY2U6e3dpZHRoOk1hdGgubWluKHRoaXMud3x8MS8wLGUud2lkdGgpLGhlaWdodDpNYXRoLm1pbih0aGlzLmh8fDEvMCxlLmhlaWdodCl9LHdpZHRoOjAsaGVpZ2h0OjAscHJldkhlaWdodDowLGN1cnJlbnRXaWR0aDowfSk7Y29uc3Qgbj10aGlzW3IuJGdldFRlbXBsYXRlUm9vdF0oKSxvPW5bci4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSxoPXRoaXNbci4kaXNTcGxpdHRhYmxlXSgpO2h8fHNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpO2lmKCEoMCxpLmNoZWNrRGltZW5zaW9ucykodGhpcyxlKSlyZXR1cm4gYy5IVE1MUmVzdWx0LkZBSUxVUkU7Y29uc3QgdT1uZXcgU2V0KFsiYXJlYSIsImRyYXciLCJleGNsR3JvdXAiLCJmaWVsZCIsInN1YmZvcm0iLCJzdWJmb3JtU2V0Il0pO2lmKHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKSl7Y29uc3QgZT10aGlzW3IuJGdldFN1YmZvcm1QYXJlbnRdKCkuY29sdW1uV2lkdGhzO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPjApe3RoaXNbci4kZXh0cmFdLmNvbHVtbldpZHRocz1lO3RoaXNbci4kZXh0cmFdLmN1cnJlbnRDb2x1bW49MH19Y29uc3QgZD0oMCxzLnRvU3R5bGUpKHRoaXMsImFuY2hvclR5cGUiLCJkaW1lbnNpb25zIiwicG9zaXRpb24iLCJwcmVzZW5jZSIsImJvcmRlciIsIm1hcmdpbiIsImhBbGlnbiIpLGY9WyJ4ZmFTdWJmb3JtIl0sZz0oMCxzLmxheW91dENsYXNzKSh0aGlzKTtnJiZmLnB1c2goZyk7YS5zdHlsZT1kO2EuY2xhc3M9Zjt0aGlzLm5hbWUmJihhLnhmYU5hbWU9dGhpcy5uYW1lKTtpZih0aGlzLm92ZXJmbG93KXtjb25zdCB0PXRoaXMub3ZlcmZsb3dbci4kZ2V0RXh0cmFdKCk7aWYodC5hZGRMZWFkZXIpe3QuYWRkTGVhZGVyPSExO2hhbmRsZU92ZXJmbG93KHRoaXMsdC5sZWFkZXIsZSl9fXRoaXNbci4kcHVzaFBhcmFdKCk7Y29uc3QgcD0ibHItdGIiPT09dGhpcy5sYXlvdXR8fCJybC10YiI9PT10aGlzLmxheW91dCxtPXA/MjoxO2Zvcig7dGhpc1tyLiRleHRyYV0uYXR0ZW1wdDxtO3RoaXNbci4kZXh0cmFdLmF0dGVtcHQrKyl7cCYmMT09PXRoaXNbci4kZXh0cmFdLmF0dGVtcHQmJih0aGlzW3IuJGV4dHJhXS5udW1iZXJJbkxpbmU9MCk7Y29uc3QgZT10aGlzW3IuJGNoaWxkcmVuVG9IVE1MXSh7ZmlsdGVyOnUsaW5jbHVkZTohMH0pO2lmKGUuc3VjY2VzcylicmVhaztpZihlLmlzQnJlYWsoKSl7dGhpc1tyLiRwb3BQYXJhXSgpO3JldHVybiBlfWlmKHAmJjA9PT10aGlzW3IuJGV4dHJhXS5hdHRlbXB0JiYwPT09dGhpc1tyLiRleHRyYV0ubnVtYmVySW5MaW5lJiYhbltyLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKXt0aGlzW3IuJGV4dHJhXS5hdHRlbXB0PW07YnJlYWt9fXRoaXNbci4kcG9wUGFyYV0oKTtofHx1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpO25bci4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT1vO2lmKHRoaXNbci4kZXh0cmFdLmF0dGVtcHQ9PT1tKXt0aGlzLm92ZXJmbG93JiYodGhpc1tyLiRnZXRUZW1wbGF0ZVJvb3RdKClbci4kZXh0cmFdLm92ZXJmbG93Tm9kZT10aGlzLm92ZXJmbG93KTtofHxkZWxldGUgdGhpc1tyLiRleHRyYV07cmV0dXJuIGMuSFRNTFJlc3VsdC5GQUlMVVJFfWlmKHRoaXMub3ZlcmZsb3cpe2NvbnN0IHQ9dGhpcy5vdmVyZmxvd1tyLiRnZXRFeHRyYV0oKTtpZih0LmFkZFRyYWlsZXIpe3QuYWRkVHJhaWxlcj0hMTtoYW5kbGVPdmVyZmxvdyh0aGlzLHQudHJhaWxlcixlKX19bGV0IGI9MCx5PTA7aWYodGhpcy5tYXJnaW4pe2I9dGhpcy5tYXJnaW4ubGVmdEluc2V0K3RoaXMubWFyZ2luLnJpZ2h0SW5zZXQ7eT10aGlzLm1hcmdpbi50b3BJbnNldCt0aGlzLm1hcmdpbi5ib3R0b21JbnNldH1jb25zdCB3PU1hdGgubWF4KHRoaXNbci4kZXh0cmFdLndpZHRoK2IsdGhpcy53fHwwKSxTPU1hdGgubWF4KHRoaXNbci4kZXh0cmFdLmhlaWdodCt5LHRoaXMuaHx8MCkseD1bdGhpcy54LHRoaXMueSx3LFNdOyIiPT09dGhpcy53JiYoZC53aWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykodykpOyIiPT09dGhpcy5oJiYoZC5oZWlnaHQ9KDAscy5tZWFzdXJlVG9TdHJpbmcpKFMpKTtpZigoIjBweCI9PT1kLndpZHRofHwiMHB4Ij09PWQuaGVpZ2h0KSYmMD09PXQubGVuZ3RoKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7Y29uc3QgQz17bmFtZToiZGl2IixhdHRyaWJ1dGVzOmEsY2hpbGRyZW46dH07YXBwbHlBc3Npc3QodGhpcyxhKTtjb25zdCB2PWMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyxDKSx4KTtpZih0aGlzLmJyZWFrQWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoPj0xKXtjb25zdCBlPXRoaXMuYnJlYWtBZnRlci5jaGlsZHJlblswXTtpZihoYW5kbGVCcmVhayhlKSl7dGhpc1tyLiRleHRyYV0uYWZ0ZXJCcmVha0FmdGVyPXY7cmV0dXJuIGMuSFRNTFJlc3VsdC5icmVha05vZGUoZSl9fWRlbGV0ZSB0aGlzW3IuJGV4dHJhXTtyZXR1cm4gdn19Y2xhc3MgU3ViZm9ybVNldCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN1YmZvcm1TZXQiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMucmVsYXRpb249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucmVsYXRpb24sWyJvcmRlcmVkIiwiY2hvaWNlIiwidW5vcmRlcmVkIl0pO3RoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuYm9va2VuZD1udWxsO3RoaXMuYnJlYWs9bnVsbDt0aGlzLmRlc2M9bnVsbDt0aGlzLmV4dHJhcz1udWxsO3RoaXMub2NjdXI9bnVsbDt0aGlzLm92ZXJmbG93PW51bGw7dGhpcy5icmVha0FmdGVyPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuYnJlYWtCZWZvcmU9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5zdWJmb3JtPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc3ViZm9ybVNldD1uZXcgby5YRkFPYmplY3RBcnJheX0qW3IuJGdldENvbnRhaW5lZENoaWxkcmVuXSgpe3lpZWxkKmdldENvbnRhaW5lZENoaWxkcmVuKHRoaXMpfVtyLiRnZXRTdWJmb3JtUGFyZW50XSgpe2xldCBlPXRoaXNbci4kZ2V0UGFyZW50XSgpO2Zvcig7IShlIGluc3RhbmNlb2YgU3ViZm9ybSk7KWU9ZVtyLiRnZXRQYXJlbnRdKCk7cmV0dXJuIGV9W3IuJGlzQmluZGFibGVdKCl7cmV0dXJuITB9fWNsYXNzIFN1YmplY3RETiBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzdWJqZWN0RE4iKTt0aGlzLmRlbGltaXRlcj1lLmRlbGltaXRlcnx8IiwiO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtyLiRmaW5hbGl6ZV0oKXt0aGlzW3IuJGNvbnRlbnRdPW5ldyBNYXAodGhpc1tyLiRjb250ZW50XS5zcGxpdCh0aGlzLmRlbGltaXRlcikubWFwKChlPT57KGU9ZS5zcGxpdCgiPSIsMikpWzBdPWVbMF0udHJpbSgpO3JldHVybiBlfSkpKX19Y2xhc3MgU3ViamVjdEROcyBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN1YmplY3RETnMiLCEwKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsib3B0aW9uYWwiLCJyZXF1aXJlZCJdKTt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5zdWJqZWN0RE49bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIFN1Ym1pdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN1Ym1pdCIsITApO3RoaXMuZW1iZWRQREY9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmVtYmVkUERGLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSk7dGhpcy5mb3JtYXQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuZm9ybWF0LFsieGRwIiwiZm9ybWRhdGEiLCJwZGYiLCJ1cmxlbmNvZGVkIiwieGZkIiwieG1sIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy50YXJnZXQ9ZS50YXJnZXR8fCIiO3RoaXMudGV4dEVuY29kaW5nPSgwLGMuZ2V0S2V5d29yZCkoe2RhdGE6ZS50ZXh0RW5jb2Rpbmc/ZS50ZXh0RW5jb2RpbmcudG9Mb3dlckNhc2UoKToiIixkZWZhdWx0VmFsdWU6IiIsdmFsaWRhdGU6ZT0+WyJ1dGYtOCIsImJpZy1maXZlIiwiZm9udHNwZWNpZmljIiwiZ2JrIiwiZ2ItMTgwMzAiLCJnYi0yMzEyIiwia3NjLTU2MDEiLCJub25lIiwic2hpZnQtamlzIiwidWNzLTIiLCJ1dGYtMTYiXS5pbmNsdWRlcyhlKXx8ZS5tYXRjaCgvaXNvLTg4NTktXGR7Mn0vKX0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLnhkcENvbnRlbnQ9ZS54ZHBDb250ZW50fHwiIjt0aGlzLmVuY3J5cHQ9bnVsbDt0aGlzLmVuY3J5cHREYXRhPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc2lnbkRhdGE9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIFRlbXBsYXRlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidGVtcGxhdGUiLCEwKTt0aGlzLmJhc2VQcm9maWxlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmJhc2VQcm9maWxlLFsiZnVsbCIsImludGVyYWN0aXZlRm9ybXMiXSk7dGhpcy5leHRyYXM9bnVsbDt0aGlzLnN1YmZvcm09bmV3IG8uWEZBT2JqZWN0QXJyYXl9W3IuJGZpbmFsaXplXSgpezA9PT10aGlzLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoJiYoMCxsLndhcm4pKCJYRkEgLSBObyBzdWJmb3JtcyBpbiB0ZW1wbGF0ZSBub2RlLiIpO3RoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGg+PTImJigwLGwud2FybikoIlhGQSAtIFNldmVyYWwgc3ViZm9ybXMgaW4gdGVtcGxhdGUgbm9kZTogcGxlYXNlIGZpbGUgYSBidWcuIik7dGhpc1tyLiR0YWJJbmRleF09NWUzfVtyLiRpc1NwbGl0dGFibGVdKCl7cmV0dXJuITB9W3IuJHNlYXJjaE5vZGVdKGUsdCl7cmV0dXJuIGUuc3RhcnRzV2l0aCgiIyIpP1t0aGlzW3IuJGlkc10uZ2V0KGUuc2xpY2UoMSkpXTooMCxkLnNlYXJjaE5vZGUpKHRoaXMsdCxlLCEwLCEwKX0qW3IuJHRvUGFnZXNdKCl7aWYoIXRoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGNoaWxkcmVuOltdfSk7dGhpc1tyLiRleHRyYV09e292ZXJmbG93Tm9kZTpudWxsLGZpcnN0VW5zcGxpdHRhYmxlOm51bGwsY3VycmVudENvbnRlbnRBcmVhOm51bGwsY3VycmVudFBhZ2VBcmVhOm51bGwsbm9MYXlvdXRGYWlsdXJlOiExLHBhZ2VOdW1iZXI6MSxwYWdlUG9zaXRpb246ImZpcnN0IixvZGRPckV2ZW46Im9kZCIsYmxhbmtPck5vdEJsYW5rOiJub25CbGFuayIscGFyYVN0YWNrOltdfTtjb25zdCBlPXRoaXMuc3ViZm9ybS5jaGlsZHJlblswXTtlLnBhZ2VTZXRbci4kY2xlYW5QYWdlXSgpO2NvbnN0IHQ9ZS5wYWdlU2V0LnBhZ2VBcmVhLmNoaWxkcmVuLGE9e25hbWU6ImRpdiIsY2hpbGRyZW46W119O2xldCBuPW51bGwsaT1udWxsLHM9bnVsbDtpZihlLmJyZWFrQmVmb3JlLmNoaWxkcmVuLmxlbmd0aD49MSl7aT1lLmJyZWFrQmVmb3JlLmNoaWxkcmVuWzBdO3M9aS50YXJnZXR9ZWxzZSBpZihlLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoPj0xJiZlLnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoPj0xKXtpPWUuc3ViZm9ybS5jaGlsZHJlblswXS5icmVha0JlZm9yZS5jaGlsZHJlblswXTtzPWkudGFyZ2V0fWVsc2UgaWYoZS5icmVhaz8uYmVmb3JlVGFyZ2V0KXtpPWUuYnJlYWs7cz1pLmJlZm9yZVRhcmdldH1lbHNlIGlmKGUuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGg+PTEmJmUuc3ViZm9ybS5jaGlsZHJlblswXS5icmVhaz8uYmVmb3JlVGFyZ2V0KXtpPWUuc3ViZm9ybS5jaGlsZHJlblswXS5icmVhaztzPWkuYmVmb3JlVGFyZ2V0fWlmKGkpe2NvbnN0IGU9dGhpc1tyLiRzZWFyY2hOb2RlXShzLGlbci4kZ2V0UGFyZW50XSgpKTtpZihlIGluc3RhbmNlb2YgUGFnZUFyZWEpe249ZTtpW3IuJGV4dHJhXT17fX19bnx8KG49dFswXSk7bltyLiRleHRyYV09e251bWJlck9mVXNlOjF9O2NvbnN0IG89bltyLiRnZXRQYXJlbnRdKCk7b1tyLiRleHRyYV09e251bWJlck9mVXNlOjEscGFnZUluZGV4Om8ucGFnZUFyZWEuY2hpbGRyZW4uaW5kZXhPZihuKSxwYWdlU2V0SW5kZXg6MH07bGV0IGgsdT1udWxsLGQ9bnVsbCxmPSEwLGc9MCxwPTA7Zm9yKDs7KXtpZihmKWc9MDtlbHNle2EuY2hpbGRyZW4ucG9wKCk7aWYoMz09KytnKXsoMCxsLndhcm4pKCJYRkEgLSBTb21ldGhpbmcgZ29lcyB3cm9uZzogcGxlYXNlIGZpbGUgYSBidWcuIik7cmV0dXJuIGF9fWg9bnVsbDt0aGlzW3IuJGV4dHJhXS5jdXJyZW50UGFnZUFyZWE9bjtjb25zdCB0PW5bci4kdG9IVE1MXSgpLmh0bWw7YS5jaGlsZHJlbi5wdXNoKHQpO2lmKHUpe3RoaXNbci4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT0hMDt0LmNoaWxkcmVuLnB1c2godVtyLiR0b0hUTUxdKG5bci4kZXh0cmFdLnNwYWNlKS5odG1sKTt1PW51bGx9aWYoZCl7dGhpc1tyLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlPSEwO3QuY2hpbGRyZW4ucHVzaChkW3IuJHRvSFRNTF0obltyLiRleHRyYV0uc3BhY2UpLmh0bWwpO2Q9bnVsbH1jb25zdCBpPW4uY29udGVudEFyZWEuY2hpbGRyZW4scz10LmNoaWxkcmVuLmZpbHRlcigoZT0+ZS5hdHRyaWJ1dGVzLmNsYXNzLmluY2x1ZGVzKCJ4ZmFDb250ZW50YXJlYSIpKSk7Zj0hMTt0aGlzW3IuJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZT1udWxsO3RoaXNbci4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT0hMTtjb25zdCBmbHVzaD10PT57Y29uc3QgYT1lW3IuJGZsdXNoSFRNTF0oKTtpZihhKXtmfHw9YS5jaGlsZHJlbj8ubGVuZ3RoPjA7c1t0XS5jaGlsZHJlbi5wdXNoKGEpfX07Zm9yKGxldCB0PXAsbj1pLmxlbmd0aDt0PG47dCsrKXtjb25zdCBuPXRoaXNbci4kZXh0cmFdLmN1cnJlbnRDb250ZW50QXJlYT1pW3RdLG89e3dpZHRoOm4udyxoZWlnaHQ6bi5ofTtwPTA7aWYodSl7c1t0XS5jaGlsZHJlbi5wdXNoKHVbci4kdG9IVE1MXShvKS5odG1sKTt1PW51bGx9aWYoZCl7c1t0XS5jaGlsZHJlbi5wdXNoKGRbci4kdG9IVE1MXShvKS5odG1sKTtkPW51bGx9Y29uc3QgYz1lW3IuJHRvSFRNTF0obyk7aWYoYy5zdWNjZXNzKXtpZihjLmh0bWwpe2Z8fD1jLmh0bWwuY2hpbGRyZW4/Lmxlbmd0aD4wO3NbdF0uY2hpbGRyZW4ucHVzaChjLmh0bWwpfWVsc2UhZiYmYS5jaGlsZHJlbi5sZW5ndGg+MSYmYS5jaGlsZHJlbi5wb3AoKTtyZXR1cm4gYX1pZihjLmlzQnJlYWsoKSl7Y29uc3QgZT1jLmJyZWFrTm9kZTtmbHVzaCh0KTtpZigiYXV0byI9PT1lLnRhcmdldFR5cGUpY29udGludWU7aWYoZS5sZWFkZXIpe3U9dGhpc1tyLiRzZWFyY2hOb2RlXShlLmxlYWRlcixlW3IuJGdldFBhcmVudF0oKSk7dT11P3VbMF06bnVsbH1pZihlLnRyYWlsZXIpe2Q9dGhpc1tyLiRzZWFyY2hOb2RlXShlLnRyYWlsZXIsZVtyLiRnZXRQYXJlbnRdKCkpO2Q9ZD9kWzBdOm51bGx9aWYoInBhZ2VBcmVhIj09PWUudGFyZ2V0VHlwZSl7aD1lW3IuJGV4dHJhXS50YXJnZXQ7dD0xLzB9ZWxzZSBpZihlW3IuJGV4dHJhXS50YXJnZXQpe2g9ZVtyLiRleHRyYV0udGFyZ2V0O3A9ZVtyLiRleHRyYV0uaW5kZXgrMTt0PTEvMH1lbHNlIHQ9ZVtyLiRleHRyYV0uaW5kZXh9ZWxzZSBpZih0aGlzW3IuJGV4dHJhXS5vdmVyZmxvd05vZGUpe2NvbnN0IGU9dGhpc1tyLiRleHRyYV0ub3ZlcmZsb3dOb2RlO3RoaXNbci4kZXh0cmFdLm92ZXJmbG93Tm9kZT1udWxsO2NvbnN0IGE9ZVtyLiRnZXRFeHRyYV0oKSxuPWEudGFyZ2V0O2EuYWRkTGVhZGVyPW51bGwhPT1hLmxlYWRlcjthLmFkZFRyYWlsZXI9bnVsbCE9PWEudHJhaWxlcjtmbHVzaCh0KTtjb25zdCBzPXQ7dD0xLzA7aWYobiBpbnN0YW5jZW9mIFBhZ2VBcmVhKWg9bjtlbHNlIGlmKG4gaW5zdGFuY2VvZiBDb250ZW50QXJlYSl7Y29uc3QgZT1pLmluZGV4T2Yobik7aWYoLTEhPT1lKWU+cz90PWUtMTpwPWU7ZWxzZXtoPW5bci4kZ2V0UGFyZW50XSgpO3A9aC5jb250ZW50QXJlYS5jaGlsZHJlbi5pbmRleE9mKG4pfX19ZWxzZSBmbHVzaCh0KX10aGlzW3IuJGV4dHJhXS5wYWdlTnVtYmVyKz0xO2gmJihoW3IuJGlzVXNhYmxlXSgpP2hbci4kZXh0cmFdLm51bWJlck9mVXNlKz0xOmg9bnVsbCk7bj1ofHxuW3IuJGdldE5leHRQYWdlXSgpO3lpZWxkIG51bGx9fX10LlRlbXBsYXRlPVRlbXBsYXRlO2NsYXNzIFRleHQgZXh0ZW5kcyBvLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidGV4dCIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5tYXhDaGFycz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWF4Q2hhcnMsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+ZT49MH0pO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMucmlkPWUucmlkfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W3IuJGFjY2VwdFdoaXRlc3BhY2VdKCl7cmV0dXJuITB9W3IuJG9uQ2hpbGRdKGUpe2lmKGVbci4kbmFtZXNwYWNlSWRdPT09bi5OYW1lc3BhY2VJZHMueGh0bWwuaWQpe3RoaXNbci4kY29udGVudF09ZTtyZXR1cm4hMH0oMCxsLndhcm4pKGBYRkEgLSBJbnZhbGlkIGNvbnRlbnQgaW4gVGV4dDogJHtlW3IuJG5vZGVOYW1lXX0uYCk7cmV0dXJuITF9W3IuJG9uVGV4dF0oZSl7dGhpc1tyLiRjb250ZW50XWluc3RhbmNlb2Ygby5YRkFPYmplY3R8fHN1cGVyW3IuJG9uVGV4dF0oZSl9W3IuJGZpbmFsaXplXSgpeyJzdHJpbmciPT10eXBlb2YgdGhpc1tyLiRjb250ZW50XSYmKHRoaXNbci4kY29udGVudF09dGhpc1tyLiRjb250ZW50XS5yZXBsYWNlQWxsKCJcclxuIiwiXG4iKSl9W3IuJGdldEV4dHJhXSgpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdGhpc1tyLiRjb250ZW50XT90aGlzW3IuJGNvbnRlbnRdLnNwbGl0KC9bXHUyMDI5XHUyMDI4XG5dLykucmVkdWNlKCgoZSx0KT0+e3QmJmUucHVzaCh0KTtyZXR1cm4gZX0pLFtdKS5qb2luKCJcbiIpOnRoaXNbci4kY29udGVudF1bci4kdGV4dF0oKX1bci4kdG9IVE1MXShlKXtpZigic3RyaW5nIj09dHlwZW9mIHRoaXNbci4kY29udGVudF0pe2NvbnN0IGU9dmFsdWVUb0h0bWwodGhpc1tyLiRjb250ZW50XSkuaHRtbDtpZih0aGlzW3IuJGNvbnRlbnRdLmluY2x1ZGVzKCJcdTIwMjkiKSl7ZS5uYW1lPSJkaXYiO2UuY2hpbGRyZW49W107dGhpc1tyLiRjb250ZW50XS5zcGxpdCgiXHUyMDI5IikubWFwKChlPT5lLnNwbGl0KC9bXHUyMDI4XG5dLykucmVkdWNlKCgoZSx0KT0+e2UucHVzaCh7bmFtZToic3BhbiIsdmFsdWU6dH0se25hbWU6ImJyIn0pO3JldHVybiBlfSksW10pKSkuZm9yRWFjaCgodD0+e2UuY2hpbGRyZW4ucHVzaCh7bmFtZToicCIsY2hpbGRyZW46dH0pfSkpfWVsc2UgaWYoL1tcdTIwMjhcbl0vLnRlc3QodGhpc1tyLiRjb250ZW50XSkpe2UubmFtZT0iZGl2IjtlLmNoaWxkcmVuPVtdO3RoaXNbci4kY29udGVudF0uc3BsaXQoL1tcdTIwMjhcbl0vKS5mb3JFYWNoKCh0PT57ZS5jaGlsZHJlbi5wdXNoKHtuYW1lOiJzcGFuIix2YWx1ZTp0fSx7bmFtZToiYnIifSl9KSl9cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKGUpfXJldHVybiB0aGlzW3IuJGNvbnRlbnRdW3IuJHRvSFRNTF0oZSl9fXQuVGV4dD1UZXh0O2NsYXNzIFRleHRFZGl0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidGV4dEVkaXQiLCEwKTt0aGlzLmFsbG93UmljaFRleHQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmFsbG93UmljaFRleHQsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KTt0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubXVsdGlMaW5lPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5tdWx0aUxpbmUsZGVmYXVsdFZhbHVlOiIiLHZhbGlkYXRlOmU9PjA9PT1lfHwxPT09ZX0pO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLnZTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudlNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKTt0aGlzLmJvcmRlcj1udWxsO3RoaXMuY29tYj1udWxsO3RoaXMuZXh0cmFzPW51bGw7dGhpcy5tYXJnaW49bnVsbH1bci4kdG9IVE1MXShlKXtjb25zdCB0PSgwLHMudG9TdHlsZSkodGhpcywiYm9yZGVyIiwiZm9udCIsIm1hcmdpbiIpO2xldCBhO2NvbnN0IG49dGhpc1tyLiRnZXRQYXJlbnRdKClbci4kZ2V0UGFyZW50XSgpOyIiPT09dGhpcy5tdWx0aUxpbmUmJih0aGlzLm11bHRpTGluZT1uIGluc3RhbmNlb2YgRHJhdz8xOjApO2E9MT09PXRoaXMubXVsdGlMaW5lP3tuYW1lOiJ0ZXh0YXJlYSIsYXR0cmlidXRlczp7ZGF0YUlkOm5bci4kZGF0YV0/LltyLiR1aWRdfHxuW3IuJHVpZF0sZmllbGRJZDpuW3IuJHVpZF0sY2xhc3M6WyJ4ZmFUZXh0ZmllbGQiXSxzdHlsZTp0LCJhcmlhLWxhYmVsIjphcmlhTGFiZWwobiksImFyaWEtcmVxdWlyZWQiOiExfX06e25hbWU6ImlucHV0IixhdHRyaWJ1dGVzOnt0eXBlOiJ0ZXh0IixkYXRhSWQ6bltyLiRkYXRhXT8uW3IuJHVpZF18fG5bci4kdWlkXSxmaWVsZElkOm5bci4kdWlkXSxjbGFzczpbInhmYVRleHRmaWVsZCJdLHN0eWxlOnQsImFyaWEtbGFiZWwiOmFyaWFMYWJlbChuKSwiYXJpYS1yZXF1aXJlZCI6ITF9fTtpZihpc1JlcXVpcmVkKG4pKXthLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXT0hMDthLmF0dHJpYnV0ZXMucmVxdWlyZWQ9ITB9cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJsYWJlbCIsYXR0cmlidXRlczp7Y2xhc3M6WyJ4ZmFMYWJlbCJdfSxjaGlsZHJlbjpbYV19KX19Y2xhc3MgVGltZSBleHRlbmRzIG8uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInRpbWUiKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bci4kZmluYWxpemVdKCl7Y29uc3QgZT10aGlzW3IuJGNvbnRlbnRdLnRyaW0oKTt0aGlzW3IuJGNvbnRlbnRdPWU/bmV3IERhdGUoZSk6bnVsbH1bci4kdG9IVE1MXShlKXtyZXR1cm4gdmFsdWVUb0h0bWwodGhpc1tyLiRjb250ZW50XT90aGlzW3IuJGNvbnRlbnRdLnRvU3RyaW5nKCk6IiIpfX1jbGFzcyBUaW1lU3RhbXAgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJ0aW1lU3RhbXAiKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMuc2VydmVyPWUuc2VydmVyfHwiIjt0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBUb29sVGlwIGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidG9vbFRpcCIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5yaWQ9ZS5yaWR8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgVHJhdmVyc2FsIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidHJhdmVyc2FsIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5leHRyYXM9bnVsbDt0aGlzLnRyYXZlcnNlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBUcmF2ZXJzZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInRyYXZlcnNlIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLm9wZXJhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vcGVyYXRpb24sWyJuZXh0IiwiYmFjayIsImRvd24iLCJmaXJzdCIsImxlZnQiLCJyaWdodCIsInVwIl0pO3RoaXMucmVmPWUucmVmfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5leHRyYXM9bnVsbDt0aGlzLnNjcmlwdD1udWxsfWdldCBuYW1lKCl7cmV0dXJuIHRoaXMub3BlcmF0aW9ufVtyLiRpc1RyYW5zcGFyZW50XSgpe3JldHVybiExfX1jbGFzcyBVaSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInVpIiwhMCk7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiI7dGhpcy5leHRyYXM9bnVsbDt0aGlzLnBpY3R1cmU9bnVsbDt0aGlzLmJhcmNvZGU9bnVsbDt0aGlzLmJ1dHRvbj1udWxsO3RoaXMuY2hlY2tCdXR0b249bnVsbDt0aGlzLmNob2ljZUxpc3Q9bnVsbDt0aGlzLmRhdGVUaW1lRWRpdD1udWxsO3RoaXMuZGVmYXVsdFVpPW51bGw7dGhpcy5pbWFnZUVkaXQ9bnVsbDt0aGlzLm51bWVyaWNFZGl0PW51bGw7dGhpcy5wYXNzd29yZEVkaXQ9bnVsbDt0aGlzLnNpZ25hdHVyZT1udWxsO3RoaXMudGV4dEVkaXQ9bnVsbH1bci4kZ2V0RXh0cmFdKCl7aWYodm9pZCAwPT09dGhpc1tyLiRleHRyYV0pe2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtpZigiZXh0cmFzIj09PWV8fCJwaWN0dXJlIj09PWUpY29udGludWU7Y29uc3QgdD10aGlzW2VdO2lmKHQgaW5zdGFuY2VvZiBvLlhGQU9iamVjdCl7dGhpc1tyLiRleHRyYV09dDtyZXR1cm4gdH19dGhpc1tyLiRleHRyYV09bnVsbH1yZXR1cm4gdGhpc1tyLiRleHRyYV19W3IuJHRvSFRNTF0oZSl7Y29uc3QgdD10aGlzW3IuJGdldEV4dHJhXSgpO3JldHVybiB0P3Rbci4kdG9IVE1MXShlKTpjLkhUTUxSZXN1bHQuRU1QVFl9fWNsYXNzIFZhbGlkYXRlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidmFsaWRhdGUiLCEwKTt0aGlzLmZvcm1hdFRlc3Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuZm9ybWF0VGVzdCxbIndhcm5pbmciLCJkaXNhYmxlZCIsImVycm9yIl0pO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5udWxsVGVzdD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5udWxsVGVzdCxbImRpc2FibGVkIiwiZXJyb3IiLCJ3YXJuaW5nIl0pO3RoaXMuc2NyaXB0VGVzdD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5zY3JpcHRUZXN0LFsiZXJyb3IiLCJkaXNhYmxlZCIsIndhcm5pbmciXSk7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuZXh0cmFzPW51bGw7dGhpcy5tZXNzYWdlPW51bGw7dGhpcy5waWN0dXJlPW51bGw7dGhpcy5zY3JpcHQ9bnVsbH19Y2xhc3MgVmFsdWUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJ2YWx1ZSIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5vdmVycmlkZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUub3ZlcnJpZGUsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KTt0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIjt0aGlzLmFyYz1udWxsO3RoaXMuYm9vbGVhbj1udWxsO3RoaXMuZGF0ZT1udWxsO3RoaXMuZGF0ZVRpbWU9bnVsbDt0aGlzLmRlY2ltYWw9bnVsbDt0aGlzLmV4RGF0YT1udWxsO3RoaXMuZmxvYXQ9bnVsbDt0aGlzLmltYWdlPW51bGw7dGhpcy5pbnRlZ2VyPW51bGw7dGhpcy5saW5lPW51bGw7dGhpcy5yZWN0YW5nbGU9bnVsbDt0aGlzLnRleHQ9bnVsbDt0aGlzLnRpbWU9bnVsbH1bci4kc2V0VmFsdWVdKGUpe2NvbnN0IHQ9dGhpc1tyLiRnZXRQYXJlbnRdKCk7aWYodCBpbnN0YW5jZW9mIEZpZWxkJiZ0LnVpPy5pbWFnZUVkaXQpe2lmKCF0aGlzLmltYWdlKXt0aGlzLmltYWdlPW5ldyBJbWFnZSh7fSk7dGhpc1tyLiRhcHBlbmRDaGlsZF0odGhpcy5pbWFnZSl9dGhpcy5pbWFnZVtyLiRjb250ZW50XT1lW3IuJGNvbnRlbnRdO3JldHVybn1jb25zdCBhPWVbci4kbm9kZU5hbWVdO2lmKG51bGw9PT10aGlzW2FdKXtmb3IoY29uc3QgZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSl7Y29uc3QgdD10aGlzW2VdO2lmKHQgaW5zdGFuY2VvZiBvLlhGQU9iamVjdCl7dGhpc1tlXT1udWxsO3RoaXNbci4kcmVtb3ZlQ2hpbGRdKHQpfX10aGlzW2Vbci4kbm9kZU5hbWVdXT1lO3RoaXNbci4kYXBwZW5kQ2hpbGRdKGUpfWVsc2UgdGhpc1thXVtyLiRjb250ZW50XT1lW3IuJGNvbnRlbnRdfVtyLiR0ZXh0XSgpe2lmKHRoaXMuZXhEYXRhKXJldHVybiJzdHJpbmciPT10eXBlb2YgdGhpcy5leERhdGFbci4kY29udGVudF0/dGhpcy5leERhdGFbci4kY29udGVudF0udHJpbSgpOnRoaXMuZXhEYXRhW3IuJGNvbnRlbnRdW3IuJHRleHRdKCkudHJpbSgpO2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtpZigiaW1hZ2UiPT09ZSljb250aW51ZTtjb25zdCB0PXRoaXNbZV07aWYodCBpbnN0YW5jZW9mIG8uWEZBT2JqZWN0KXJldHVybih0W3IuJGNvbnRlbnRdfHwiIikudG9TdHJpbmcoKS50cmltKCl9cmV0dXJuIG51bGx9W3IuJHRvSFRNTF0oZSl7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2NvbnN0IGE9dGhpc1t0XTtpZihhIGluc3RhbmNlb2Ygby5YRkFPYmplY3QpcmV0dXJuIGFbci4kdG9IVE1MXShlKX1yZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZfX10LlZhbHVlPVZhbHVlO2NsYXNzIFZhcmlhYmxlcyBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInZhcmlhYmxlcyIsITApO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiO3RoaXMuYm9vbGVhbj1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmRhdGU9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5kYXRlVGltZT1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmRlY2ltYWw9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5leERhdGE9bmV3IG8uWEZBT2JqZWN0QXJyYXk7dGhpcy5mbG9hdD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLmltYWdlPW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuaW50ZWdlcj1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLm1hbmlmZXN0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMuc2NyaXB0PW5ldyBvLlhGQU9iamVjdEFycmF5O3RoaXMudGV4dD1uZXcgby5YRkFPYmplY3RBcnJheTt0aGlzLnRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W3IuJGlzVHJhbnNwYXJlbnRdKCl7cmV0dXJuITB9fWNsYXNzIFRlbXBsYXRlTmFtZXNwYWNle3N0YXRpY1tuLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZihUZW1wbGF0ZU5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShlKSl7Y29uc3QgYT1UZW1wbGF0ZU5hbWVzcGFjZVtlXSh0KTthW3IuJHNldFNldEF0dHJpYnV0ZXNdKHQpO3JldHVybiBhfX1zdGF0aWMgYXBwZWFyYW5jZUZpbHRlcihlKXtyZXR1cm4gbmV3IEFwcGVhcmFuY2VGaWx0ZXIoZSl9c3RhdGljIGFyYyhlKXtyZXR1cm4gbmV3IEFyYyhlKX1zdGF0aWMgYXJlYShlKXtyZXR1cm4gbmV3IEFyZWEoZSl9c3RhdGljIGFzc2lzdChlKXtyZXR1cm4gbmV3IEFzc2lzdChlKX1zdGF0aWMgYmFyY29kZShlKXtyZXR1cm4gbmV3IEJhcmNvZGUoZSl9c3RhdGljIGJpbmQoZSl7cmV0dXJuIG5ldyBCaW5kKGUpfXN0YXRpYyBiaW5kSXRlbXMoZSl7cmV0dXJuIG5ldyBCaW5kSXRlbXMoZSl9c3RhdGljIGJvb2tlbmQoZSl7cmV0dXJuIG5ldyBCb29rZW5kKGUpfXN0YXRpYyBib29sZWFuKGUpe3JldHVybiBuZXcgQm9vbGVhbkVsZW1lbnQoZSl9c3RhdGljIGJvcmRlcihlKXtyZXR1cm4gbmV3IEJvcmRlcihlKX1zdGF0aWMgYnJlYWsoZSl7cmV0dXJuIG5ldyBCcmVhayhlKX1zdGF0aWMgYnJlYWtBZnRlcihlKXtyZXR1cm4gbmV3IEJyZWFrQWZ0ZXIoZSl9c3RhdGljIGJyZWFrQmVmb3JlKGUpe3JldHVybiBuZXcgQnJlYWtCZWZvcmUoZSl9c3RhdGljIGJ1dHRvbihlKXtyZXR1cm4gbmV3IEJ1dHRvbihlKX1zdGF0aWMgY2FsY3VsYXRlKGUpe3JldHVybiBuZXcgQ2FsY3VsYXRlKGUpfXN0YXRpYyBjYXB0aW9uKGUpe3JldHVybiBuZXcgQ2FwdGlvbihlKX1zdGF0aWMgY2VydGlmaWNhdGUoZSl7cmV0dXJuIG5ldyBDZXJ0aWZpY2F0ZShlKX1zdGF0aWMgY2VydGlmaWNhdGVzKGUpe3JldHVybiBuZXcgQ2VydGlmaWNhdGVzKGUpfXN0YXRpYyBjaGVja0J1dHRvbihlKXtyZXR1cm4gbmV3IENoZWNrQnV0dG9uKGUpfXN0YXRpYyBjaG9pY2VMaXN0KGUpe3JldHVybiBuZXcgQ2hvaWNlTGlzdChlKX1zdGF0aWMgY29sb3IoZSl7cmV0dXJuIG5ldyBDb2xvcihlKX1zdGF0aWMgY29tYihlKXtyZXR1cm4gbmV3IENvbWIoZSl9c3RhdGljIGNvbm5lY3QoZSl7cmV0dXJuIG5ldyBDb25uZWN0KGUpfXN0YXRpYyBjb250ZW50QXJlYShlKXtyZXR1cm4gbmV3IENvbnRlbnRBcmVhKGUpfXN0YXRpYyBjb3JuZXIoZSl7cmV0dXJuIG5ldyBDb3JuZXIoZSl9c3RhdGljIGRhdGUoZSl7cmV0dXJuIG5ldyBEYXRlRWxlbWVudChlKX1zdGF0aWMgZGF0ZVRpbWUoZSl7cmV0dXJuIG5ldyBEYXRlVGltZShlKX1zdGF0aWMgZGF0ZVRpbWVFZGl0KGUpe3JldHVybiBuZXcgRGF0ZVRpbWVFZGl0KGUpfXN0YXRpYyBkZWNpbWFsKGUpe3JldHVybiBuZXcgRGVjaW1hbChlKX1zdGF0aWMgZGVmYXVsdFVpKGUpe3JldHVybiBuZXcgRGVmYXVsdFVpKGUpfXN0YXRpYyBkZXNjKGUpe3JldHVybiBuZXcgRGVzYyhlKX1zdGF0aWMgZGlnZXN0TWV0aG9kKGUpe3JldHVybiBuZXcgRGlnZXN0TWV0aG9kKGUpfXN0YXRpYyBkaWdlc3RNZXRob2RzKGUpe3JldHVybiBuZXcgRGlnZXN0TWV0aG9kcyhlKX1zdGF0aWMgZHJhdyhlKXtyZXR1cm4gbmV3IERyYXcoZSl9c3RhdGljIGVkZ2UoZSl7cmV0dXJuIG5ldyBFZGdlKGUpfXN0YXRpYyBlbmNvZGluZyhlKXtyZXR1cm4gbmV3IEVuY29kaW5nKGUpfXN0YXRpYyBlbmNvZGluZ3MoZSl7cmV0dXJuIG5ldyBFbmNvZGluZ3MoZSl9c3RhdGljIGVuY3J5cHQoZSl7cmV0dXJuIG5ldyBFbmNyeXB0KGUpfXN0YXRpYyBlbmNyeXB0RGF0YShlKXtyZXR1cm4gbmV3IEVuY3J5cHREYXRhKGUpfXN0YXRpYyBlbmNyeXB0aW9uKGUpe3JldHVybiBuZXcgRW5jcnlwdGlvbihlKX1zdGF0aWMgZW5jcnlwdGlvbk1ldGhvZChlKXtyZXR1cm4gbmV3IEVuY3J5cHRpb25NZXRob2QoZSl9c3RhdGljIGVuY3J5cHRpb25NZXRob2RzKGUpe3JldHVybiBuZXcgRW5jcnlwdGlvbk1ldGhvZHMoZSl9c3RhdGljIGV2ZW50KGUpe3JldHVybiBuZXcgRXZlbnQoZSl9c3RhdGljIGV4RGF0YShlKXtyZXR1cm4gbmV3IEV4RGF0YShlKX1zdGF0aWMgZXhPYmplY3QoZSl7cmV0dXJuIG5ldyBFeE9iamVjdChlKX1zdGF0aWMgZXhjbEdyb3VwKGUpe3JldHVybiBuZXcgRXhjbEdyb3VwKGUpfXN0YXRpYyBleGVjdXRlKGUpe3JldHVybiBuZXcgRXhlY3V0ZShlKX1zdGF0aWMgZXh0cmFzKGUpe3JldHVybiBuZXcgRXh0cmFzKGUpfXN0YXRpYyBmaWVsZChlKXtyZXR1cm4gbmV3IEZpZWxkKGUpfXN0YXRpYyBmaWxsKGUpe3JldHVybiBuZXcgRmlsbChlKX1zdGF0aWMgZmlsdGVyKGUpe3JldHVybiBuZXcgRmlsdGVyKGUpfXN0YXRpYyBmbG9hdChlKXtyZXR1cm4gbmV3IEZsb2F0KGUpfXN0YXRpYyBmb250KGUpe3JldHVybiBuZXcgRm9udChlKX1zdGF0aWMgZm9ybWF0KGUpe3JldHVybiBuZXcgRm9ybWF0KGUpfXN0YXRpYyBoYW5kbGVyKGUpe3JldHVybiBuZXcgSGFuZGxlcihlKX1zdGF0aWMgaHlwaGVuYXRpb24oZSl7cmV0dXJuIG5ldyBIeXBoZW5hdGlvbihlKX1zdGF0aWMgaW1hZ2UoZSl7cmV0dXJuIG5ldyBJbWFnZShlKX1zdGF0aWMgaW1hZ2VFZGl0KGUpe3JldHVybiBuZXcgSW1hZ2VFZGl0KGUpfXN0YXRpYyBpbnRlZ2VyKGUpe3JldHVybiBuZXcgSW50ZWdlcihlKX1zdGF0aWMgaXNzdWVycyhlKXtyZXR1cm4gbmV3IElzc3VlcnMoZSl9c3RhdGljIGl0ZW1zKGUpe3JldHVybiBuZXcgSXRlbXMoZSl9c3RhdGljIGtlZXAoZSl7cmV0dXJuIG5ldyBLZWVwKGUpfXN0YXRpYyBrZXlVc2FnZShlKXtyZXR1cm4gbmV3IEtleVVzYWdlKGUpfXN0YXRpYyBsaW5lKGUpe3JldHVybiBuZXcgTGluZShlKX1zdGF0aWMgbGluZWFyKGUpe3JldHVybiBuZXcgTGluZWFyKGUpfXN0YXRpYyBsb2NrRG9jdW1lbnQoZSl7cmV0dXJuIG5ldyBMb2NrRG9jdW1lbnQoZSl9c3RhdGljIG1hbmlmZXN0KGUpe3JldHVybiBuZXcgTWFuaWZlc3QoZSl9c3RhdGljIG1hcmdpbihlKXtyZXR1cm4gbmV3IE1hcmdpbihlKX1zdGF0aWMgbWRwKGUpe3JldHVybiBuZXcgTWRwKGUpfXN0YXRpYyBtZWRpdW0oZSl7cmV0dXJuIG5ldyBNZWRpdW0oZSl9c3RhdGljIG1lc3NhZ2UoZSl7cmV0dXJuIG5ldyBNZXNzYWdlKGUpfXN0YXRpYyBudW1lcmljRWRpdChlKXtyZXR1cm4gbmV3IE51bWVyaWNFZGl0KGUpfXN0YXRpYyBvY2N1cihlKXtyZXR1cm4gbmV3IE9jY3VyKGUpfXN0YXRpYyBvaWQoZSl7cmV0dXJuIG5ldyBPaWQoZSl9c3RhdGljIG9pZHMoZSl7cmV0dXJuIG5ldyBPaWRzKGUpfXN0YXRpYyBvdmVyZmxvdyhlKXtyZXR1cm4gbmV3IE92ZXJmbG93KGUpfXN0YXRpYyBwYWdlQXJlYShlKXtyZXR1cm4gbmV3IFBhZ2VBcmVhKGUpfXN0YXRpYyBwYWdlU2V0KGUpe3JldHVybiBuZXcgUGFnZVNldChlKX1zdGF0aWMgcGFyYShlKXtyZXR1cm4gbmV3IFBhcmEoZSl9c3RhdGljIHBhc3N3b3JkRWRpdChlKXtyZXR1cm4gbmV3IFBhc3N3b3JkRWRpdChlKX1zdGF0aWMgcGF0dGVybihlKXtyZXR1cm4gbmV3IFBhdHRlcm4oZSl9c3RhdGljIHBpY3R1cmUoZSl7cmV0dXJuIG5ldyBQaWN0dXJlKGUpfXN0YXRpYyBwcm90byhlKXtyZXR1cm4gbmV3IFByb3RvKGUpfXN0YXRpYyByYWRpYWwoZSl7cmV0dXJuIG5ldyBSYWRpYWwoZSl9c3RhdGljIHJlYXNvbihlKXtyZXR1cm4gbmV3IFJlYXNvbihlKX1zdGF0aWMgcmVhc29ucyhlKXtyZXR1cm4gbmV3IFJlYXNvbnMoZSl9c3RhdGljIHJlY3RhbmdsZShlKXtyZXR1cm4gbmV3IFJlY3RhbmdsZShlKX1zdGF0aWMgcmVmKGUpe3JldHVybiBuZXcgUmVmRWxlbWVudChlKX1zdGF0aWMgc2NyaXB0KGUpe3JldHVybiBuZXcgU2NyaXB0KGUpfXN0YXRpYyBzZXRQcm9wZXJ0eShlKXtyZXR1cm4gbmV3IFNldFByb3BlcnR5KGUpfXN0YXRpYyBzaWduRGF0YShlKXtyZXR1cm4gbmV3IFNpZ25EYXRhKGUpfXN0YXRpYyBzaWduYXR1cmUoZSl7cmV0dXJuIG5ldyBTaWduYXR1cmUoZSl9c3RhdGljIHNpZ25pbmcoZSl7cmV0dXJuIG5ldyBTaWduaW5nKGUpfXN0YXRpYyBzb2xpZChlKXtyZXR1cm4gbmV3IFNvbGlkKGUpfXN0YXRpYyBzcGVhayhlKXtyZXR1cm4gbmV3IFNwZWFrKGUpfXN0YXRpYyBzdGlwcGxlKGUpe3JldHVybiBuZXcgU3RpcHBsZShlKX1zdGF0aWMgc3ViZm9ybShlKXtyZXR1cm4gbmV3IFN1YmZvcm0oZSl9c3RhdGljIHN1YmZvcm1TZXQoZSl7cmV0dXJuIG5ldyBTdWJmb3JtU2V0KGUpfXN0YXRpYyBzdWJqZWN0RE4oZSl7cmV0dXJuIG5ldyBTdWJqZWN0RE4oZSl9c3RhdGljIHN1YmplY3RETnMoZSl7cmV0dXJuIG5ldyBTdWJqZWN0RE5zKGUpfXN0YXRpYyBzdWJtaXQoZSl7cmV0dXJuIG5ldyBTdWJtaXQoZSl9c3RhdGljIHRlbXBsYXRlKGUpe3JldHVybiBuZXcgVGVtcGxhdGUoZSl9c3RhdGljIHRleHQoZSl7cmV0dXJuIG5ldyBUZXh0KGUpfXN0YXRpYyB0ZXh0RWRpdChlKXtyZXR1cm4gbmV3IFRleHRFZGl0KGUpfXN0YXRpYyB0aW1lKGUpe3JldHVybiBuZXcgVGltZShlKX1zdGF0aWMgdGltZVN0YW1wKGUpe3JldHVybiBuZXcgVGltZVN0YW1wKGUpfXN0YXRpYyB0b29sVGlwKGUpe3JldHVybiBuZXcgVG9vbFRpcChlKX1zdGF0aWMgdHJhdmVyc2FsKGUpe3JldHVybiBuZXcgVHJhdmVyc2FsKGUpfXN0YXRpYyB0cmF2ZXJzZShlKXtyZXR1cm4gbmV3IFRyYXZlcnNlKGUpfXN0YXRpYyB1aShlKXtyZXR1cm4gbmV3IFVpKGUpfXN0YXRpYyB2YWxpZGF0ZShlKXtyZXR1cm4gbmV3IFZhbGlkYXRlKGUpfXN0YXRpYyB2YWx1ZShlKXtyZXR1cm4gbmV3IFZhbHVlKGUpfXN0YXRpYyB2YXJpYWJsZXMoZSl7cmV0dXJuIG5ldyBWYXJpYWJsZXMoZSl9fXQuVGVtcGxhdGVOYW1lc3BhY2U9VGVtcGxhdGVOYW1lc3BhY2V9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7dmFyIHI9YSgzKSxuPWEoNCksaT1hKDI0KSxzPWEoMTEpLG89YSg0NSkuZixjPWEoMzkpLGw9YSgyMzIpLGg9YSg3NSksdT1hKDc2KSxkPWEoMjMzKSxmPWEoODIpLGc9YSg2KSxwPWEoMzYpLG09IkRPTUV4Y2VwdGlvbiIsYj1pKCJFcnJvciIpLHk9aShtKSx3PWZ1bmN0aW9uIERPTUV4Y2VwdGlvbigpe2wodGhpcyxTKTt2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9dShlPDE/dm9pZCAwOmFyZ3VtZW50c1swXSksYT11KGU8Mj92b2lkIDA6YXJndW1lbnRzWzFdLCJFcnJvciIpLHI9bmV3IHkodCxhKSxuPWIodCk7bi5uYW1lPW07byhyLCJzdGFjayIscygxLGYobi5zdGFjaywxKSkpO2gocix0aGlzLHcpO3JldHVybiByfSxTPXcucHJvdG90eXBlPXkucHJvdG90eXBlLHg9InN0YWNrImluIGIobSksQz0ic3RhY2siaW4gbmV3IHkoMSwyKSx2PXkmJmcmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixtKSxrPSEoIXZ8fHYud3JpdGFibGUmJnYuY29uZmlndXJhYmxlKSxPPXgmJiFrJiYhQztyKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZm9yY2VkOnB8fE99LHtET01FeGNlcHRpb246Tz93Onl9KTt2YXIgVD1pKG0pLE09VC5wcm90b3R5cGU7aWYoTS5jb25zdHJ1Y3RvciE9PVQpe3B8fG8oTSwiY29uc3RydWN0b3IiLHMoMSxUKSk7Zm9yKHZhciBFIGluIGQpaWYoYyhkLEUpKXt2YXIgRD1kW0VdLE49RC5zO2MoVCxOKXx8byhULE4scyg2LEQuYykpfX19LChlLHQsYSk9Pnt2YXIgcj1hKDI1KSxuPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihyKHQsZSkpcmV0dXJuIGU7dGhyb3cgbigiSW5jb3JyZWN0IGludm9jYXRpb24iKX19LGU9PntlLmV4cG9ydHM9e0luZGV4U2l6ZUVycm9yOntzOiJJTkRFWF9TSVpFX0VSUiIsYzoxLG06MX0sRE9NU3RyaW5nU2l6ZUVycm9yOntzOiJET01TVFJJTkdfU0laRV9FUlIiLGM6MixtOjB9LEhpZXJhcmNoeVJlcXVlc3RFcnJvcjp7czoiSElFUkFSQ0hZX1JFUVVFU1RfRVJSIixjOjMsbToxfSxXcm9uZ0RvY3VtZW50RXJyb3I6e3M6IldST05HX0RPQ1VNRU5UX0VSUiIsYzo0LG06MX0sSW52YWxpZENoYXJhY3RlckVycm9yOntzOiJJTlZBTElEX0NIQVJBQ1RFUl9FUlIiLGM6NSxtOjF9LE5vRGF0YUFsbG93ZWRFcnJvcjp7czoiTk9fREFUQV9BTExPV0VEX0VSUiIsYzo2LG06MH0sTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyb3I6e3M6Ik5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiIsYzo3LG06MX0sTm90Rm91bmRFcnJvcjp7czoiTk9UX0ZPVU5EX0VSUiIsYzo4LG06MX0sTm90U3VwcG9ydGVkRXJyb3I6e3M6Ik5PVF9TVVBQT1JURURfRVJSIixjOjksbToxfSxJblVzZUF0dHJpYnV0ZUVycm9yOntzOiJJTlVTRV9BVFRSSUJVVEVfRVJSIixjOjEwLG06MX0sSW52YWxpZFN0YXRlRXJyb3I6e3M6IklOVkFMSURfU1RBVEVfRVJSIixjOjExLG06MX0sU3ludGF4RXJyb3I6e3M6IlNZTlRBWF9FUlIiLGM6MTIsbToxfSxJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3I6e3M6IklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiIsYzoxMyxtOjF9LE5hbWVzcGFjZUVycm9yOntzOiJOQU1FU1BBQ0VfRVJSIixjOjE0LG06MX0sSW52YWxpZEFjY2Vzc0Vycm9yOntzOiJJTlZBTElEX0FDQ0VTU19FUlIiLGM6MTUsbToxfSxWYWxpZGF0aW9uRXJyb3I6e3M6IlZBTElEQVRJT05fRVJSIixjOjE2LG06MH0sVHlwZU1pc21hdGNoRXJyb3I6e3M6IlRZUEVfTUlTTUFUQ0hfRVJSIixjOjE3LG06MX0sU2VjdXJpdHlFcnJvcjp7czoiU0VDVVJJVFlfRVJSIixjOjE4LG06MX0sTmV0d29ya0Vycm9yOntzOiJORVRXT1JLX0VSUiIsYzoxOSxtOjF9LEFib3J0RXJyb3I6e3M6IkFCT1JUX0VSUiIsYzoyMCxtOjF9LFVSTE1pc21hdGNoRXJyb3I6e3M6IlVSTF9NSVNNQVRDSF9FUlIiLGM6MjEsbToxfSxRdW90YUV4Y2VlZGVkRXJyb3I6e3M6IlFVT1RBX0VYQ0VFREVEX0VSUiIsYzoyMixtOjF9LFRpbWVvdXRFcnJvcjp7czoiVElNRU9VVF9FUlIiLGM6MjMsbToxfSxJbnZhbGlkTm9kZVR5cGVFcnJvcjp7czoiSU5WQUxJRF9OT0RFX1RZUEVfRVJSIixjOjI0LG06MX0sRGF0YUNsb25lRXJyb3I6e3M6IkRBVEFfQ0xPTkVfRVJSIixjOjI1LG06MX19fSwoZSx0KT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5OYW1lc3BhY2VJZHM9dC4kYnVpbGRYRkFPYmplY3Q9dm9pZCAwO2NvbnN0IGE9U3ltYm9sKCk7dC4kYnVpbGRYRkFPYmplY3Q9YTt0Lk5hbWVzcGFjZUlkcz17Y29uZmlnOntpZDowLGNoZWNrOmU9PmUuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94Y2kvIil9LGNvbm5lY3Rpb25TZXQ6e2lkOjEsY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1jb25uZWN0aW9uLXNldC8iKX0sZGF0YXNldHM6e2lkOjIsY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLyIpfSxmb3JtOntpZDozLGNoZWNrOmU9PmUuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZm9ybS8iKX0sbG9jYWxlU2V0OntpZDo0LGNoZWNrOmU9PmUuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtbG9jYWxlLXNldC8iKX0scGRmOntpZDo1LGNoZWNrOmU9PiJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC9wZGYvIj09PWV9LHNpZ25hdHVyZTp7aWQ6NixjaGVjazplPT4iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI9PT1lfSxzb3VyY2VTZXQ6e2lkOjcsY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1zb3VyY2Utc2V0LyIpfSxzdHlsZXNoZWV0OntpZDo4LGNoZWNrOmU9PiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPT09ZX0sdGVtcGxhdGU6e2lkOjksY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS10ZW1wbGF0ZS8iKX0seGRjOntpZDoxMCxjaGVjazplPT5lLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGRjLyIpfSx4ZHA6e2lkOjExLGNoZWNrOmU9PiJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC8iPT09ZX0seGZkZjp7aWQ6MTIsY2hlY2s6ZT0+Imh0dHA6Ly9ucy5hZG9iZS5jb20veGZkZi8iPT09ZX0seGh0bWw6e2lkOjEzLGNoZWNrOmU9PiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWV9LHhtcG1ldGE6e2lkOjE0LGNoZWNrOmU9PiJodHRwOi8vbnMuYWRvYmUuY29tL3htcG1ldGEvIj09PWV9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5hZGRIVE1MPWZ1bmN0aW9uIGFkZEhUTUwoZSx0LGEpe2NvbnN0IGk9ZVtyLiRleHRyYV0scz1pLmF2YWlsYWJsZVNwYWNlLFtvLGMsbCxoXT1hO3N3aXRjaChlLmxheW91dCl7Y2FzZSJwb3NpdGlvbiI6aS53aWR0aD1NYXRoLm1heChpLndpZHRoLG8rbCk7aS5oZWlnaHQ9TWF0aC5tYXgoaS5oZWlnaHQsYytoKTtpLmNoaWxkcmVuLnB1c2godCk7YnJlYWs7Y2FzZSJsci10YiI6Y2FzZSJybC10YiI6aWYoIWkubGluZXx8MT09PWkuYXR0ZW1wdCl7aS5saW5lPWNyZWF0ZUxpbmUoZSxbXSk7aS5jaGlsZHJlbi5wdXNoKGkubGluZSk7aS5udW1iZXJJbkxpbmU9MH1pLm51bWJlckluTGluZSs9MTtpLmxpbmUuY2hpbGRyZW4ucHVzaCh0KTtpZigwPT09aS5hdHRlbXB0KXtpLmN1cnJlbnRXaWR0aCs9bDtpLmhlaWdodD1NYXRoLm1heChpLmhlaWdodCxpLnByZXZIZWlnaHQraCl9ZWxzZXtpLmN1cnJlbnRXaWR0aD1sO2kucHJldkhlaWdodD1pLmhlaWdodDtpLmhlaWdodCs9aDtpLmF0dGVtcHQ9MH1pLndpZHRoPU1hdGgubWF4KGkud2lkdGgsaS5jdXJyZW50V2lkdGgpO2JyZWFrO2Nhc2Uicmwtcm93IjpjYXNlInJvdyI6e2kuY2hpbGRyZW4ucHVzaCh0KTtpLndpZHRoKz1sO2kuaGVpZ2h0PU1hdGgubWF4KGkuaGVpZ2h0LGgpO2NvbnN0IGU9KDAsbi5tZWFzdXJlVG9TdHJpbmcpKGkuaGVpZ2h0KTtmb3IoY29uc3QgdCBvZiBpLmNoaWxkcmVuKXQuYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQ9ZTticmVha31jYXNlInRhYmxlIjpjYXNlInRiIjppLndpZHRoPU1hdGgubWluKHMud2lkdGgsTWF0aC5tYXgoaS53aWR0aCxsKSk7aS5oZWlnaHQrPWg7aS5jaGlsZHJlbi5wdXNoKHQpfX07dC5jaGVja0RpbWVuc2lvbnM9ZnVuY3Rpb24gY2hlY2tEaW1lbnNpb25zKGUsdCl7aWYobnVsbD09PWVbci4kZ2V0VGVtcGxhdGVSb290XSgpW3IuJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSlyZXR1cm4hMDtpZigwPT09ZS53fHwwPT09ZS5oKXJldHVybiEwO2NvbnN0IGE9ZVtyLiRnZXRTdWJmb3JtUGFyZW50XSgpLG49YVtyLiRleHRyYV0/LmF0dGVtcHR8fDAsWyxpLHMsb109ZnVuY3Rpb24gZ2V0VHJhbnNmb3JtZWRCQm94KGUpe2xldCB0LGEscj0iIj09PWUudz9OYU46ZS53LG49IiI9PT1lLmg/TmFOOmUuaCxbaSxzXT1bMCwwXTtzd2l0Y2goZS5hbmNob3JUeXBlfHwiIil7Y2FzZSJib3R0b21DZW50ZXIiOltpLHNdPVtyLzIsbl07YnJlYWs7Y2FzZSJib3R0b21MZWZ0IjpbaSxzXT1bMCxuXTticmVhaztjYXNlImJvdHRvbVJpZ2h0IjpbaSxzXT1bcixuXTticmVhaztjYXNlIm1pZGRsZUNlbnRlciI6W2ksc109W3IvMixuLzJdO2JyZWFrO2Nhc2UibWlkZGxlTGVmdCI6W2ksc109WzAsbi8yXTticmVhaztjYXNlIm1pZGRsZVJpZ2h0IjpbaSxzXT1bcixuLzJdO2JyZWFrO2Nhc2UidG9wQ2VudGVyIjpbaSxzXT1bci8yLDBdO2JyZWFrO2Nhc2UidG9wUmlnaHQiOltpLHNdPVtyLDBdfXN3aXRjaChlLnJvdGF0ZXx8MCl7Y2FzZSAwOlt0LGFdPVstaSwtc107YnJlYWs7Y2FzZSA5MDpbdCxhXT1bLXMsaV07W3Isbl09W24sLXJdO2JyZWFrO2Nhc2UgMTgwOlt0LGFdPVtpLHNdO1tyLG5dPVstciwtbl07YnJlYWs7Y2FzZSAyNzA6W3QsYV09W3MsLWldO1tyLG5dPVstbixyXX1yZXR1cm5bZS54K3QrTWF0aC5taW4oMCxyKSxlLnkrYStNYXRoLm1pbigwLG4pLE1hdGguYWJzKHIpLE1hdGguYWJzKG4pXX0oZSk7c3dpdGNoKGEubGF5b3V0KXtjYXNlImxyLXRiIjpjYXNlInJsLXRiIjpyZXR1cm4gMD09PW4/ZVtyLiRnZXRUZW1wbGF0ZVJvb3RdKClbci4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT8iIiE9PWUudz9NYXRoLnJvdW5kKHMtdC53aWR0aCk8PTI6dC53aWR0aD4yOiEoIiIhPT1lLmgmJk1hdGgucm91bmQoby10LmhlaWdodCk+MikmJigiIiE9PWUudz9NYXRoLnJvdW5kKHMtdC53aWR0aCk8PTJ8fDA9PT1hW3IuJGV4dHJhXS5udW1iZXJJbkxpbmUmJnQuaGVpZ2h0PjI6dC53aWR0aD4yKTohIWVbci4kZ2V0VGVtcGxhdGVSb290XSgpW3IuJGV4dHJhXS5ub0xheW91dEZhaWx1cmV8fCEoIiIhPT1lLmgmJk1hdGgucm91bmQoby10LmhlaWdodCk+MikmJigoIiI9PT1lLnd8fE1hdGgucm91bmQocy10LndpZHRoKTw9Mnx8IWFbci4kaXNUaGVyZU1vcmVXaWR0aF0oKSkmJnQuaGVpZ2h0PjIpO2Nhc2UidGFibGUiOmNhc2UidGIiOnJldHVybiEhZVtyLiRnZXRUZW1wbGF0ZVJvb3RdKClbci4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZXx8KCIiPT09ZS5ofHxlW3IuJGlzU3BsaXR0YWJsZV0oKT8oIiI9PT1lLnd8fE1hdGgucm91bmQocy10LndpZHRoKTw9Mnx8IWFbci4kaXNUaGVyZU1vcmVXaWR0aF0oKSkmJnQuaGVpZ2h0PjI6TWF0aC5yb3VuZChvLXQuaGVpZ2h0KTw9Mik7Y2FzZSJwb3NpdGlvbiI6aWYoZVtyLiRnZXRUZW1wbGF0ZVJvb3RdKClbci4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSlyZXR1cm4hMDtpZigiIj09PWUuaHx8TWF0aC5yb3VuZChvK2ktdC5oZWlnaHQpPD0yKXJldHVybiEwO3JldHVybiBvK2k+ZVtyLiRnZXRUZW1wbGF0ZVJvb3RdKClbci4kZXh0cmFdLmN1cnJlbnRDb250ZW50QXJlYS5oO2Nhc2Uicmwtcm93IjpjYXNlInJvdyI6cmV0dXJuISFlW3IuJGdldFRlbXBsYXRlUm9vdF0oKVtyLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlfHwoIiI9PT1lLmh8fE1hdGgucm91bmQoby10LmhlaWdodCk8PTIpO2RlZmF1bHQ6cmV0dXJuITB9fTt0LmZsdXNoSFRNTD1mdW5jdGlvbiBmbHVzaEhUTUwoZSl7aWYoIWVbci4kZXh0cmFdKXJldHVybiBudWxsO2NvbnN0IHQ9e25hbWU6ImRpdiIsYXR0cmlidXRlczplW3IuJGV4dHJhXS5hdHRyaWJ1dGVzLGNoaWxkcmVuOmVbci4kZXh0cmFdLmNoaWxkcmVufTtpZihlW3IuJGV4dHJhXS5mYWlsaW5nTm9kZSl7Y29uc3QgYT1lW3IuJGV4dHJhXS5mYWlsaW5nTm9kZVtyLiRmbHVzaEhUTUxdKCk7YSYmKGUubGF5b3V0LmVuZHNXaXRoKCItdGIiKT90LmNoaWxkcmVuLnB1c2goY3JlYXRlTGluZShlLFthXSkpOnQuY2hpbGRyZW4ucHVzaChhKSl9aWYoMD09PXQuY2hpbGRyZW4ubGVuZ3RoKXJldHVybiBudWxsO3JldHVybiB0fTt0LmdldEF2YWlsYWJsZVNwYWNlPWZ1bmN0aW9uIGdldEF2YWlsYWJsZVNwYWNlKGUpe2NvbnN0IHQ9ZVtyLiRleHRyYV0uYXZhaWxhYmxlU3BhY2UsYT1lLm1hcmdpbj9lLm1hcmdpbi50b3BJbnNldCtlLm1hcmdpbi5ib3R0b21JbnNldDowLG49ZS5tYXJnaW4/ZS5tYXJnaW4ubGVmdEluc2V0K2UubWFyZ2luLnJpZ2h0SW5zZXQ6MDtzd2l0Y2goZS5sYXlvdXQpe2Nhc2UibHItdGIiOmNhc2UicmwtdGIiOnJldHVybiAwPT09ZVtyLiRleHRyYV0uYXR0ZW1wdD97d2lkdGg6dC53aWR0aC1uLWVbci4kZXh0cmFdLmN1cnJlbnRXaWR0aCxoZWlnaHQ6dC5oZWlnaHQtYS1lW3IuJGV4dHJhXS5wcmV2SGVpZ2h0fTp7d2lkdGg6dC53aWR0aC1uLGhlaWdodDp0LmhlaWdodC1hLWVbci4kZXh0cmFdLmhlaWdodH07Y2FzZSJybC1yb3ciOmNhc2Uicm93IjpyZXR1cm57d2lkdGg6ZVtyLiRleHRyYV0uY29sdW1uV2lkdGhzLnNsaWNlKGVbci4kZXh0cmFdLmN1cnJlbnRDb2x1bW4pLnJlZHVjZSgoKGUsdCk9PmUrdCkpLGhlaWdodDp0LmhlaWdodC1ufTtjYXNlInRhYmxlIjpjYXNlInRiIjpyZXR1cm57d2lkdGg6dC53aWR0aC1uLGhlaWdodDp0LmhlaWdodC1hLWVbci4kZXh0cmFdLmhlaWdodH07ZGVmYXVsdDpyZXR1cm4gdH19O2EoMTM5KTt2YXIgcj1hKDIyOCksbj1hKDIzNik7ZnVuY3Rpb24gY3JlYXRlTGluZShlLHQpe3JldHVybntuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsibHItdGIiPT09ZS5sYXlvdXQ/InhmYUxyIjoieGZhUmwiXX0sY2hpbGRyZW46dH19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LmNvbXB1dGVCYm94PWZ1bmN0aW9uIGNvbXB1dGVCYm94KGUsdCxhKXtsZXQgbjtpZigiIiE9PWUudyYmIiIhPT1lLmgpbj1bZS54LGUueSxlLncsZS5oXTtlbHNle2lmKCFhKXJldHVybiBudWxsO2xldCBpPWUudztpZigiIj09PWkpe2lmKDA9PT1lLm1heFcpe2NvbnN0IHQ9ZVtyLiRnZXRTdWJmb3JtUGFyZW50XSgpO2k9InBvc2l0aW9uIj09PXQubGF5b3V0JiYiIiE9PXQudz8wOmUubWluV31lbHNlIGk9TWF0aC5taW4oZS5tYXhXLGEud2lkdGgpO3QuYXR0cmlidXRlcy5zdHlsZS53aWR0aD1tZWFzdXJlVG9TdHJpbmcoaSl9bGV0IHM9ZS5oO2lmKCIiPT09cyl7aWYoMD09PWUubWF4SCl7Y29uc3QgdD1lW3IuJGdldFN1YmZvcm1QYXJlbnRdKCk7cz0icG9zaXRpb24iPT09dC5sYXlvdXQmJiIiIT09dC5oPzA6ZS5taW5IfWVsc2Ugcz1NYXRoLm1pbihlLm1heEgsYS5oZWlnaHQpO3QuYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQ9bWVhc3VyZVRvU3RyaW5nKHMpfW49W2UueCxlLnksaSxzXX1yZXR1cm4gbn07dC5jcmVhdGVXcmFwcGVyPWZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIoZSx0KXtjb25zdHthdHRyaWJ1dGVzOmF9PXQse3N0eWxlOm59PWEsaT17bmFtZToiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbInhmYVdyYXBwZXIiXSxzdHlsZTpPYmplY3QuY3JlYXRlKG51bGwpfSxjaGlsZHJlbjpbXX07YS5jbGFzcy5wdXNoKCJ4ZmFXcmFwcGVkIik7aWYoZS5ib3JkZXIpe2NvbnN0e3dpZHRoczphLGluc2V0czpzfT1lLmJvcmRlcltyLiRleHRyYV07bGV0IG8sYyxsPXNbMF0saD1zWzNdO2NvbnN0IHU9c1swXStzWzJdLGQ9c1sxXStzWzNdO3N3aXRjaChlLmJvcmRlci5oYW5kKXtjYXNlImV2ZW4iOmwtPWFbMF0vMjtoLT1hWzNdLzI7bz1gY2FsYygxMDAlICsgJHsoYVsxXSthWzNdKS8yLWR9cHgpYDtjPWBjYWxjKDEwMCUgKyAkeyhhWzBdK2FbMl0pLzItdX1weClgO2JyZWFrO2Nhc2UibGVmdCI6bC09YVswXTtoLT1hWzNdO289YGNhbGMoMTAwJSArICR7YVsxXSthWzNdLWR9cHgpYDtjPWBjYWxjKDEwMCUgKyAke2FbMF0rYVsyXS11fXB4KWA7YnJlYWs7Y2FzZSJyaWdodCI6bz1kP2BjYWxjKDEwMCUgLSAke2R9cHgpYDoiMTAwJSI7Yz11P2BjYWxjKDEwMCUgLSAke3V9cHgpYDoiMTAwJSJ9Y29uc3QgZj1bInhmYUJvcmRlciJdO2lzUHJpbnRPbmx5KGUuYm9yZGVyKSYmZi5wdXNoKCJ4ZmFQcmludE9ubHkiKTtjb25zdCBnPXtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOmYsc3R5bGU6e3RvcDpgJHtsfXB4YCxsZWZ0OmAke2h9cHhgLHdpZHRoOm8saGVpZ2h0OmN9fSxjaGlsZHJlbjpbXX07Zm9yKGNvbnN0IGUgb2ZbImJvcmRlciIsImJvcmRlcldpZHRoIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJSYWRpdXMiLCJib3JkZXJTdHlsZSJdKWlmKHZvaWQgMCE9PW5bZV0pe2cuYXR0cmlidXRlcy5zdHlsZVtlXT1uW2VdO2RlbGV0ZSBuW2VdfWkuY2hpbGRyZW4ucHVzaChnLHQpfWVsc2UgaS5jaGlsZHJlbi5wdXNoKHQpO2Zvcihjb25zdCBlIG9mWyJiYWNrZ3JvdW5kIiwiYmFja2dyb3VuZENsaXAiLCJ0b3AiLCJsZWZ0Iiwid2lkdGgiLCJoZWlnaHQiLCJtaW5XaWR0aCIsIm1pbkhlaWdodCIsIm1heFdpZHRoIiwibWF4SGVpZ2h0IiwidHJhbnNmb3JtIiwidHJhbnNmb3JtT3JpZ2luIiwidmlzaWJpbGl0eSJdKWlmKHZvaWQgMCE9PW5bZV0pe2kuYXR0cmlidXRlcy5zdHlsZVtlXT1uW2VdO2RlbGV0ZSBuW2VdfWkuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiPT09bi5wb3NpdGlvbj8iYWJzb2x1dGUiOiJyZWxhdGl2ZSI7ZGVsZXRlIG4ucG9zaXRpb247aWYobi5hbGlnblNlbGYpe2kuYXR0cmlidXRlcy5zdHlsZS5hbGlnblNlbGY9bi5hbGlnblNlbGY7ZGVsZXRlIG4uYWxpZ25TZWxmfXJldHVybiBpfTt0LmZpeERpbWVuc2lvbnM9ZnVuY3Rpb24gZml4RGltZW5zaW9ucyhlKXtjb25zdCB0PWVbci4kZ2V0U3ViZm9ybVBhcmVudF0oKTtpZih0LmxheW91dD8uaW5jbHVkZXMoInJvdyIpKXtjb25zdCBhPXRbci4kZXh0cmFdLG49ZS5jb2xTcGFuO2xldCBpO2k9LTE9PT1uP2EuY29sdW1uV2lkdGhzLnNsaWNlKGEuY3VycmVudENvbHVtbikucmVkdWNlKCgoZSx0KT0+ZSt0KSwwKTphLmNvbHVtbldpZHRocy5zbGljZShhLmN1cnJlbnRDb2x1bW4sYS5jdXJyZW50Q29sdW1uK24pLnJlZHVjZSgoKGUsdCk9PmUrdCksMCk7aXNOYU4oaSl8fChlLnc9aSl9dC5sYXlvdXQmJiJwb3NpdGlvbiIhPT10LmxheW91dCYmKGUueD1lLnk9MCk7InRhYmxlIj09PWUubGF5b3V0JiYiIj09PWUudyYmQXJyYXkuaXNBcnJheShlLmNvbHVtbldpZHRocykmJihlLnc9ZS5jb2x1bW5XaWR0aHMucmVkdWNlKCgoZSx0KT0+ZSt0KSwwKSl9O3QuZml4VGV4dEluZGVudD1mdW5jdGlvbiBmaXhUZXh0SW5kZW50KGUpe2NvbnN0IHQ9KDAsaS5nZXRNZWFzdXJlbWVudCkoZS50ZXh0SW5kZW50LCIwcHgiKTtpZih0Pj0wKXJldHVybjtjb25zdCBhPSJwYWRkaW5nIisoImxlZnQiPT0oInJpZ2h0Ij09PWUudGV4dEFsaWduPyJyaWdodCI6ImxlZnQiKT8iTGVmdCI6IlJpZ2h0Iikscj0oMCxpLmdldE1lYXN1cmVtZW50KShlW2FdLCIwcHgiKTtlW2FdPXItdCsicHgifTt0LmZpeFVSTD1mdW5jdGlvbiBmaXhVUkwoZSl7Y29uc3QgdD0oMCxuLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKGUsbnVsbCx7YWRkRGVmYXVsdFByb3RvY29sOiEwLHRyeUNvbnZlcnRFbmNvZGluZzohMH0pO3JldHVybiB0P3QuaHJlZjpudWxsfTt0LmlzUHJpbnRPbmx5PWlzUHJpbnRPbmx5O3QubGF5b3V0Q2xhc3M9ZnVuY3Rpb24gbGF5b3V0Q2xhc3MoZSl7c3dpdGNoKGUubGF5b3V0KXtjYXNlInBvc2l0aW9uIjpkZWZhdWx0OnJldHVybiJ4ZmFQb3NpdGlvbiI7Y2FzZSJsci10YiI6cmV0dXJuInhmYUxyVGIiO2Nhc2Uicmwtcm93IjpyZXR1cm4ieGZhUmxSb3ciO2Nhc2UicmwtdGIiOnJldHVybiJ4ZmFSbFRiIjtjYXNlInJvdyI6cmV0dXJuInhmYVJvdyI7Y2FzZSJ0YWJsZSI6cmV0dXJuInhmYVRhYmxlIjtjYXNlInRiIjpyZXR1cm4ieGZhVGIifX07dC5sYXlvdXROb2RlPWZ1bmN0aW9uIGxheW91dE5vZGUoZSx0KXtsZXQgYT1udWxsLG49bnVsbCxpPSExO2lmKCghZS53fHwhZS5oKSYmZS52YWx1ZSl7bGV0IHM9MCxvPTA7aWYoZS5tYXJnaW4pe3M9ZS5tYXJnaW4ubGVmdEluc2V0K2UubWFyZ2luLnJpZ2h0SW5zZXQ7bz1lLm1hcmdpbi50b3BJbnNldCtlLm1hcmdpbi5ib3R0b21JbnNldH1sZXQgYz1udWxsLGw9bnVsbDtpZihlLnBhcmEpe2w9T2JqZWN0LmNyZWF0ZShudWxsKTtjPSIiPT09ZS5wYXJhLmxpbmVIZWlnaHQ/bnVsbDplLnBhcmEubGluZUhlaWdodDtsLnRvcD0iIj09PWUucGFyYS5zcGFjZUFib3ZlPzA6ZS5wYXJhLnNwYWNlQWJvdmU7bC5ib3R0b209IiI9PT1lLnBhcmEuc3BhY2VCZWxvdz8wOmUucGFyYS5zcGFjZUJlbG93O2wubGVmdD0iIj09PWUucGFyYS5tYXJnaW5MZWZ0PzA6ZS5wYXJhLm1hcmdpbkxlZnQ7bC5yaWdodD0iIj09PWUucGFyYS5tYXJnaW5SaWdodD8wOmUucGFyYS5tYXJnaW5SaWdodH1sZXQgaD1lLmZvbnQ7aWYoIWgpe2NvbnN0IHQ9ZVtyLiRnZXRUZW1wbGF0ZVJvb3RdKCk7bGV0IGE9ZVtyLiRnZXRQYXJlbnRdKCk7Zm9yKDthJiZhIT09dDspe2lmKGEuZm9udCl7aD1hLmZvbnQ7YnJlYWt9YT1hW3IuJGdldFBhcmVudF0oKX19Y29uc3QgdT0oZS53fHx0LndpZHRoKS1zLGQ9ZVtyLiRnbG9iYWxEYXRhXS5mb250RmluZGVyO2lmKGUudmFsdWUuZXhEYXRhJiZlLnZhbHVlLmV4RGF0YVtyLiRjb250ZW50XSYmInRleHQvaHRtbCI9PT1lLnZhbHVlLmV4RGF0YS5jb250ZW50VHlwZSl7Y29uc3QgdD1sYXlvdXRUZXh0KGUudmFsdWUuZXhEYXRhW3IuJGNvbnRlbnRdLGgsbCxjLGQsdSk7bj10LndpZHRoO2E9dC5oZWlnaHQ7aT10LmlzQnJva2VufWVsc2V7Y29uc3QgdD1lLnZhbHVlW3IuJHRleHRdKCk7aWYodCl7Y29uc3QgZT1sYXlvdXRUZXh0KHQsaCxsLGMsZCx1KTtuPWUud2lkdGg7YT1lLmhlaWdodDtpPWUuaXNCcm9rZW59fW51bGw9PT1ufHxlLnd8fChuKz1zKTtudWxsPT09YXx8ZS5ofHwoYSs9byl9cmV0dXJue3c6bixoOmEsaXNCcm9rZW46aX19O3QubWVhc3VyZVRvU3RyaW5nPW1lYXN1cmVUb1N0cmluZzt0LnNldEFjY2Vzcz1mdW5jdGlvbiBzZXRBY2Nlc3MoZSx0KXtzd2l0Y2goZS5hY2Nlc3Mpe2Nhc2Uibm9uSW50ZXJhY3RpdmUiOnQucHVzaCgieGZhTm9uSW50ZXJhY3RpdmUiKTticmVhaztjYXNlInJlYWRPbmx5Ijp0LnB1c2goInhmYVJlYWRPbmx5Iik7YnJlYWs7Y2FzZSJwcm90ZWN0ZWQiOnQucHVzaCgieGZhRGlzYWJsZWQiKX19O3Quc2V0Rm9udEZhbWlseT1mdW5jdGlvbiBzZXRGb250RmFtaWx5KGUsdCxhLHIpe2lmKCFhKXtkZWxldGUgci5mb250RmFtaWx5O3JldHVybn1jb25zdCBuPSgwLGkuc3RyaXBRdW90ZXMpKGUudHlwZWZhY2UpO3IuZm9udEZhbWlseT1gIiR7bn0iYDtjb25zdCBvPWEuZmluZChuKTtpZihvKXtjb25zdHtmb250RmFtaWx5OmF9PW8ucmVndWxhci5jc3NGb250SW5mbzthIT09biYmKHIuZm9udEZhbWlseT1gIiR7YX0iYCk7Y29uc3QgaT1nZXRDdXJyZW50UGFyYSh0KTtpZihpJiYiIiE9PWkubGluZUhlaWdodClyZXR1cm47aWYoci5saW5lSGVpZ2h0KXJldHVybjtjb25zdCBjPSgwLHMuc2VsZWN0Rm9udCkoZSxvKTtjJiYoci5saW5lSGVpZ2h0PU1hdGgubWF4KDEuMixjLmxpbmVIZWlnaHQpKX19O3Quc2V0TWluTWF4RGltZW5zaW9ucz1mdW5jdGlvbiBzZXRNaW5NYXhEaW1lbnNpb25zKGUsdCl7aWYoInBvc2l0aW9uIj09PWVbci4kZ2V0U3ViZm9ybVBhcmVudF0oKS5sYXlvdXQpe2UubWluVz4wJiYodC5taW5XaWR0aD1tZWFzdXJlVG9TdHJpbmcoZS5taW5XKSk7ZS5tYXhXPjAmJih0Lm1heFdpZHRoPW1lYXN1cmVUb1N0cmluZyhlLm1heFcpKTtlLm1pbkg+MCYmKHQubWluSGVpZ2h0PW1lYXN1cmVUb1N0cmluZyhlLm1pbkgpKTtlLm1heEg+MCYmKHQubWF4SGVpZ2h0PW1lYXN1cmVUb1N0cmluZyhlLm1heEgpKX19O3Quc2V0UGFyYT1mdW5jdGlvbiBzZXRQYXJhKGUsdCxhKXtpZihhLmF0dHJpYnV0ZXMuY2xhc3M/LmluY2x1ZGVzKCJ4ZmFSaWNoIikpe2lmKHQpeyIiPT09ZS5oJiYodC5oZWlnaHQ9ImF1dG8iKTsiIj09PWUudyYmKHQud2lkdGg9ImF1dG8iKX1jb25zdCBuPWdldEN1cnJlbnRQYXJhKGUpO2lmKG4pe2NvbnN0IGU9YS5hdHRyaWJ1dGVzLnN0eWxlO2UuZGlzcGxheT0iZmxleCI7ZS5mbGV4RGlyZWN0aW9uPSJjb2x1bW4iO3N3aXRjaChuLnZBbGlnbil7Y2FzZSJ0b3AiOmUuanVzdGlmeUNvbnRlbnQ9InN0YXJ0IjticmVhaztjYXNlImJvdHRvbSI6ZS5qdXN0aWZ5Q29udGVudD0iZW5kIjticmVhaztjYXNlIm1pZGRsZSI6ZS5qdXN0aWZ5Q29udGVudD0iY2VudGVyIn1jb25zdCB0PW5bci4kdG9TdHlsZV0oKTtmb3IoY29uc3RbYSxyXW9mIE9iamVjdC5lbnRyaWVzKHQpKWEgaW4gZXx8KGVbYV09cil9fX07dC50b1N0eWxlPWZ1bmN0aW9uIHRvU3R5bGUoZSl7Y29uc3QgdD1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcih2YXIgYT1hcmd1bWVudHMubGVuZ3RoLGk9bmV3IEFycmF5KGE+MT9hLTE6MCkscz0xO3M8YTtzKyspaVtzLTFdPWFyZ3VtZW50c1tzXTtmb3IoY29uc3QgYSBvZiBpKXtjb25zdCBpPWVbYV07aWYobnVsbCE9PWkpaWYobC5oYXNPd25Qcm9wZXJ0eShhKSlsW2FdKGUsdCk7ZWxzZSBpZihpIGluc3RhbmNlb2YgYy5YRkFPYmplY3Qpe2NvbnN0IGU9aVtyLiR0b1N0eWxlXSgpO2U/T2JqZWN0LmFzc2lnbih0LGUpOigwLG4ud2FybikoYChERUJVRykgLSBYRkEgLSBzdHlsZSBmb3IgJHthfSBub3QgaW1wbGVtZW50ZWQgeWV0YCl9fXJldHVybiB0fTthKDEzOSk7dmFyIHI9YSgyMjgpLG49YSgxNDQpLGk9YSgyMzcpLHM9YSgyMzgpLG89YSgyMzkpLGM9YSgyNDApO2Z1bmN0aW9uIG1lYXN1cmVUb1N0cmluZyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/IjBweCI6TnVtYmVyLmlzSW50ZWdlcihlKT9gJHtlfXB4YDpgJHtlLnRvRml4ZWQoMil9cHhgfWNvbnN0IGw9e2FuY2hvclR5cGUoZSx0KXtjb25zdCBhPWVbci4kZ2V0U3ViZm9ybVBhcmVudF0oKTtpZihhJiYoIWEubGF5b3V0fHwicG9zaXRpb24iPT09YS5sYXlvdXQpKXsidHJhbnNmb3JtImluIHR8fCh0LnRyYW5zZm9ybT0iIik7c3dpdGNoKGUuYW5jaG9yVHlwZSl7Y2FzZSJib3R0b21DZW50ZXIiOnQudHJhbnNmb3JtKz0idHJhbnNsYXRlKC01MCUsIC0xMDAlKSI7YnJlYWs7Y2FzZSJib3R0b21MZWZ0Ijp0LnRyYW5zZm9ybSs9InRyYW5zbGF0ZSgwLC0xMDAlKSI7YnJlYWs7Y2FzZSJib3R0b21SaWdodCI6dC50cmFuc2Zvcm0rPSJ0cmFuc2xhdGUoLTEwMCUsLTEwMCUpIjticmVhaztjYXNlIm1pZGRsZUNlbnRlciI6dC50cmFuc2Zvcm0rPSJ0cmFuc2xhdGUoLTUwJSwtNTAlKSI7YnJlYWs7Y2FzZSJtaWRkbGVMZWZ0Ijp0LnRyYW5zZm9ybSs9InRyYW5zbGF0ZSgwLC01MCUpIjticmVhaztjYXNlIm1pZGRsZVJpZ2h0Ijp0LnRyYW5zZm9ybSs9InRyYW5zbGF0ZSgtMTAwJSwtNTAlKSI7YnJlYWs7Y2FzZSJ0b3BDZW50ZXIiOnQudHJhbnNmb3JtKz0idHJhbnNsYXRlKC01MCUsMCkiO2JyZWFrO2Nhc2UidG9wUmlnaHQiOnQudHJhbnNmb3JtKz0idHJhbnNsYXRlKC0xMDAlLDApIn19fSxkaW1lbnNpb25zKGUsdCl7Y29uc3QgYT1lW3IuJGdldFN1YmZvcm1QYXJlbnRdKCk7bGV0IG49ZS53O2NvbnN0IGk9ZS5oO2lmKGEubGF5b3V0Py5pbmNsdWRlcygicm93Iikpe2NvbnN0IHQ9YVtyLiRleHRyYV0saT1lLmNvbFNwYW47bGV0IHM7aWYoLTE9PT1pKXtzPXQuY29sdW1uV2lkdGhzLnNsaWNlKHQuY3VycmVudENvbHVtbikucmVkdWNlKCgoZSx0KT0+ZSt0KSwwKTt0LmN1cnJlbnRDb2x1bW49MH1lbHNle3M9dC5jb2x1bW5XaWR0aHMuc2xpY2UodC5jdXJyZW50Q29sdW1uLHQuY3VycmVudENvbHVtbitpKS5yZWR1Y2UoKChlLHQpPT5lK3QpLDApO3QuY3VycmVudENvbHVtbj0odC5jdXJyZW50Q29sdW1uK2UuY29sU3BhbikldC5jb2x1bW5XaWR0aHMubGVuZ3RofWlzTmFOKHMpfHwobj1lLnc9cyl9dC53aWR0aD0iIiE9PW4/bWVhc3VyZVRvU3RyaW5nKG4pOiJhdXRvIjt0LmhlaWdodD0iIiE9PWk/bWVhc3VyZVRvU3RyaW5nKGkpOiJhdXRvIn0scG9zaXRpb24oZSx0KXtjb25zdCBhPWVbci4kZ2V0U3ViZm9ybVBhcmVudF0oKTtpZighYT8ubGF5b3V0fHwicG9zaXRpb24iPT09YS5sYXlvdXQpe3QucG9zaXRpb249ImFic29sdXRlIjt0LmxlZnQ9bWVhc3VyZVRvU3RyaW5nKGUueCk7dC50b3A9bWVhc3VyZVRvU3RyaW5nKGUueSl9fSxyb3RhdGUoZSx0KXtpZihlLnJvdGF0ZSl7InRyYW5zZm9ybSJpbiB0fHwodC50cmFuc2Zvcm09IiIpO3QudHJhbnNmb3JtKz1gcm90YXRlKC0ke2Uucm90YXRlfWRlZylgO3QudHJhbnNmb3JtT3JpZ2luPSJ0b3AgbGVmdCJ9fSxwcmVzZW5jZShlLHQpe3N3aXRjaChlLnByZXNlbmNlKXtjYXNlImludmlzaWJsZSI6dC52aXNpYmlsaXR5PSJoaWRkZW4iO2JyZWFrO2Nhc2UiaGlkZGVuIjpjYXNlImluYWN0aXZlIjp0LmRpc3BsYXk9Im5vbmUifX0saEFsaWduKGUsdCl7aWYoInBhcmEiPT09ZVtyLiRub2RlTmFtZV0pc3dpdGNoKGUuaEFsaWduKXtjYXNlImp1c3RpZnlBbGwiOnQudGV4dEFsaWduPSJqdXN0aWZ5LWFsbCI7YnJlYWs7Y2FzZSJyYWRpeCI6dC50ZXh0QWxpZ249ImxlZnQiO2JyZWFrO2RlZmF1bHQ6dC50ZXh0QWxpZ249ZS5oQWxpZ259ZWxzZSBzd2l0Y2goZS5oQWxpZ24pe2Nhc2UibGVmdCI6dC5hbGlnblNlbGY9InN0YXJ0IjticmVhaztjYXNlImNlbnRlciI6dC5hbGlnblNlbGY9ImNlbnRlciI7YnJlYWs7Y2FzZSJyaWdodCI6dC5hbGlnblNlbGY9ImVuZCJ9fSxtYXJnaW4oZSx0KXtlLm1hcmdpbiYmKHQubWFyZ2luPWUubWFyZ2luW3IuJHRvU3R5bGVdKCkubWFyZ2luKX19O2Z1bmN0aW9uIGxheW91dFRleHQoZSx0LGEsbixpLHMpe2NvbnN0IGM9bmV3IG8uVGV4dE1lYXN1cmUodCxhLG4saSk7InN0cmluZyI9PXR5cGVvZiBlP2MuYWRkU3RyaW5nKGUpOmVbci4kcHVzaEdseXBoc10oYyk7cmV0dXJuIGMuY29tcHV0ZShzKX1mdW5jdGlvbiBpc1ByaW50T25seShlKXtyZXR1cm4gZS5yZWxldmFudC5sZW5ndGg+MCYmIWUucmVsZXZhbnRbMF0uZXhjbHVkZWQmJiJwcmludCI9PT1lLnJlbGV2YW50WzBdLnZpZXduYW1lfWZ1bmN0aW9uIGdldEN1cnJlbnRQYXJhKGUpe2NvbnN0IHQ9ZVtyLiRnZXRUZW1wbGF0ZVJvb3RdKClbci4kZXh0cmFdLnBhcmFTdGFjaztyZXR1cm4gdC5sZW5ndGg/dC5hdCgtMSk6bnVsbH19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuSFRNTFJlc3VsdD12b2lkIDA7dC5nZXRCQm94PWZ1bmN0aW9uIGdldEJCb3goZSl7Y29uc3QgdD0tMTtpZighZSlyZXR1cm57eDp0LHk6dCx3aWR0aDp0LGhlaWdodDp0fTtjb25zdCBhPWUudHJpbSgpLnNwbGl0KC9ccyosXHMqLykubWFwKChlPT5nZXRNZWFzdXJlbWVudChlLCItMSIpKSk7aWYoYS5sZW5ndGg8NHx8YVsyXTwwfHxhWzNdPDApcmV0dXJue3g6dCx5OnQsd2lkdGg6dCxoZWlnaHQ6dH07Y29uc3RbcixuLGksc109YTtyZXR1cm57eDpyLHk6bix3aWR0aDppLGhlaWdodDpzfX07dC5nZXRDb2xvcj1mdW5jdGlvbiBnZXRDb2xvcihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06WzAsMCwwXSxbYSxyLG5dPXQ7aWYoIWUpcmV0dXJue3I6YSxnOnIsYjpufTtjb25zdCBpPWUudHJpbSgpLnNwbGl0KC9ccyosXHMqLykubWFwKChlPT5NYXRoLm1pbihNYXRoLm1heCgwLHBhcnNlSW50KGUudHJpbSgpLDEwKSksMjU1KSkpLm1hcCgoZT0+aXNOYU4oZSk/MDplKSk7aWYoaS5sZW5ndGg8MylyZXR1cm57cjphLGc6cixiOm59O1thLHIsbl09aTtyZXR1cm57cjphLGc6cixiOm59fTt0LmdldEZsb2F0PWZ1bmN0aW9uIGdldEZsb2F0KGUpe2xldHtkYXRhOnQsZGVmYXVsdFZhbHVlOmEsdmFsaWRhdGU6cn09ZTtpZighdClyZXR1cm4gYTt0PXQudHJpbSgpO2NvbnN0IG49cGFyc2VGbG9hdCh0KTtpZighaXNOYU4obikmJnIobikpcmV0dXJuIG47cmV0dXJuIGF9O3QuZ2V0SW50ZWdlcj1mdW5jdGlvbiBnZXRJbnRlZ2VyKGUpe2xldHtkYXRhOnQsZGVmYXVsdFZhbHVlOmEsdmFsaWRhdGU6cn09ZTtpZighdClyZXR1cm4gYTt0PXQudHJpbSgpO2NvbnN0IG49cGFyc2VJbnQodCwxMCk7aWYoIWlzTmFOKG4pJiZyKG4pKXJldHVybiBuO3JldHVybiBhfTt0LmdldEtleXdvcmQ9Z2V0S2V5d29yZDt0LmdldE1lYXN1cmVtZW50PWdldE1lYXN1cmVtZW50O3QuZ2V0UmF0aW89ZnVuY3Rpb24gZ2V0UmF0aW8oZSl7aWYoIWUpcmV0dXJue251bToxLGRlbjoxfTtjb25zdCB0PWUudHJpbSgpLnNwbGl0KC9ccyo6XHMqLykubWFwKChlPT5wYXJzZUZsb2F0KGUpKSkuZmlsdGVyKChlPT4haXNOYU4oZSkpKTsxPT09dC5sZW5ndGgmJnQucHVzaCgxKTtpZigwPT09dC5sZW5ndGgpcmV0dXJue251bToxLGRlbjoxfTtjb25zdFthLHJdPXQ7cmV0dXJue251bTphLGRlbjpyfX07dC5nZXRSZWxldmFudD1mdW5jdGlvbiBnZXRSZWxldmFudChlKXtpZighZSlyZXR1cm5bXTtyZXR1cm4gZS50cmltKCkuc3BsaXQoL1xzKy8pLm1hcCgoZT0+KHtleGNsdWRlZDoiLSI9PT1lWzBdLHZpZXduYW1lOmUuc3Vic3RyaW5nKDEpfSkpKX07dC5nZXRTdHJpbmdPcHRpb249ZnVuY3Rpb24gZ2V0U3RyaW5nT3B0aW9uKGUsdCl7cmV0dXJuIGdldEtleXdvcmQoe2RhdGE6ZSxkZWZhdWx0VmFsdWU6dFswXSx2YWxpZGF0ZTplPT50LmluY2x1ZGVzKGUpfSl9O3Quc3RyaXBRdW90ZXM9ZnVuY3Rpb24gc3RyaXBRdW90ZXMoZSl7aWYoZS5zdGFydHNXaXRoKCInIil8fGUuc3RhcnRzV2l0aCgnIicpKXJldHVybiBlLnNsaWNlKDEsLTEpO3JldHVybiBlfTthKDEzOSk7dmFyIHI9YSgxNDQpO2NvbnN0IG49e3B0OmU9PmUsY206ZT0+ZS8yLjU0KjcyLG1tOmU9PmUvMjUuNCo3MixpbjplPT43MiplLHB4OmU9PmV9LGk9LyhbKy1dP1xkK1wuP1xkKikoLiopLztmdW5jdGlvbiBnZXRLZXl3b3JkKGUpe2xldHtkYXRhOnQsZGVmYXVsdFZhbHVlOmEsdmFsaWRhdGU6cn09ZTtpZighdClyZXR1cm4gYTt0PXQudHJpbSgpO3JldHVybiByKHQpP3Q6YX1mdW5jdGlvbiBnZXRNZWFzdXJlbWVudChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IjAiO3R8fD0iMCI7aWYoIWUpcmV0dXJuIGdldE1lYXN1cmVtZW50KHQpO2NvbnN0IGE9ZS50cmltKCkubWF0Y2goaSk7aWYoIWEpcmV0dXJuIGdldE1lYXN1cmVtZW50KHQpO2NvbnN0WyxyLHNdPWEsbz1wYXJzZUZsb2F0KHIpO2lmKGlzTmFOKG8pKXJldHVybiBnZXRNZWFzdXJlbWVudCh0KTtpZigwPT09bylyZXR1cm4gMDtjb25zdCBjPW5bc107cmV0dXJuIGM/YyhvKTpvfWNsYXNzIEhUTUxSZXN1bHR7c3RhdGljIGdldCBGQUlMVVJFKCl7cmV0dXJuKDAsci5zaGFkb3cpKHRoaXMsIkZBSUxVUkUiLG5ldyBIVE1MUmVzdWx0KCExLG51bGwsbnVsbCxudWxsKSl9c3RhdGljIGdldCBFTVBUWSgpe3JldHVybigwLHIuc2hhZG93KSh0aGlzLCJFTVBUWSIsbmV3IEhUTUxSZXN1bHQoITAsbnVsbCxudWxsLG51bGwpKX1jb25zdHJ1Y3RvcihlLHQsYSxyKXt0aGlzLnN1Y2Nlc3M9ZTt0aGlzLmh0bWw9dDt0aGlzLmJib3g9YTt0aGlzLmJyZWFrTm9kZT1yfWlzQnJlYWsoKXtyZXR1cm4hIXRoaXMuYnJlYWtOb2RlfXN0YXRpYyBicmVha05vZGUoZSl7cmV0dXJuIG5ldyBIVE1MUmVzdWx0KCExLG51bGwsbnVsbCxlKX1zdGF0aWMgc3VjY2VzcyhlKXtyZXR1cm4gbmV3IEhUTUxSZXN1bHQoITAsZSxhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbCxudWxsKX19dC5IVE1MUmVzdWx0PUhUTUxSZXN1bHR9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuRm9udEZpbmRlcj12b2lkIDA7dC5nZXRNZXRyaWNzPWZ1bmN0aW9uIGdldE1ldHJpY3MoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxhPW51bGw7aWYoZSl7Y29uc3QgdD0oMCxuLnN0cmlwUXVvdGVzKShlLnR5cGVmYWNlKSxpPWVbci4kZ2xvYmFsRGF0YV0uZm9udEZpbmRlci5maW5kKHQpO2E9c2VsZWN0Rm9udChlLGkpfWlmKCFhKXJldHVybntsaW5lSGVpZ2h0OjEyLGxpbmVHYXA6MixsaW5lTm9HYXA6MTB9O2NvbnN0IGk9ZS5zaXplfHwxMCxzPWEubGluZUhlaWdodD9NYXRoLm1heCh0PzA6MS4yLGEubGluZUhlaWdodCk6MS4yLG89dm9pZCAwPT09YS5saW5lR2FwPy4yOmEubGluZUdhcDtyZXR1cm57bGluZUhlaWdodDpzKmksbGluZUdhcDpvKmksbGluZU5vR2FwOk1hdGgubWF4KDEscy1vKSppfX07dC5zZWxlY3RGb250PXNlbGVjdEZvbnQ7YSgxMTYpO2EoMTI2KTthKDEyOCk7YSgxMzEpO2EoMTMzKTthKDEzNSk7YSgxMzcpO2EoMTM5KTt2YXIgcj1hKDIyOCksbj1hKDIzNyksaT1hKDE0NCk7dC5Gb250RmluZGVyPWNsYXNzIEZvbnRGaW5kZXJ7Y29uc3RydWN0b3IoZSl7dGhpcy5mb250cz1uZXcgTWFwO3RoaXMuY2FjaGU9bmV3IE1hcDt0aGlzLndhcm5lZD1uZXcgU2V0O3RoaXMuZGVmYXVsdEZvbnQ9bnVsbDt0aGlzLmFkZChlKX1hZGQoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGw7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLmFkZFBkZkZvbnQodCk7Zm9yKGNvbnN0IGUgb2YgdGhpcy5mb250cy52YWx1ZXMoKSllLnJlZ3VsYXJ8fChlLnJlZ3VsYXI9ZS5pdGFsaWN8fGUuYm9sZHx8ZS5ib2xkaXRhbGljKTtpZighdHx8MD09PXQuc2l6ZSlyZXR1cm47Y29uc3QgYT10aGlzLmZvbnRzLmdldCgiUGRmSlMtRmFsbGJhY2stUGRmSlMtWEZBIik7Zm9yKGNvbnN0IGUgb2YgdCl0aGlzLmZvbnRzLnNldChlLGEpfWFkZFBkZkZvbnQoZSl7Y29uc3QgdD1lLmNzc0ZvbnRJbmZvLGE9dC5mb250RmFtaWx5O2xldCByPXRoaXMuZm9udHMuZ2V0KGEpO2lmKCFyKXtyPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5mb250cy5zZXQoYSxyKTt0aGlzLmRlZmF1bHRGb250fHwodGhpcy5kZWZhdWx0Rm9udD1yKX1sZXQgbj0iIjtjb25zdCBpPXBhcnNlRmxvYXQodC5mb250V2VpZ2h0KTswIT09cGFyc2VGbG9hdCh0Lml0YWxpY0FuZ2xlKT9uPWk+PTcwMD8iYm9sZGl0YWxpYyI6Iml0YWxpYyI6aT49NzAwJiYobj0iYm9sZCIpO2lmKCFuKXsoZS5uYW1lLmluY2x1ZGVzKCJCb2xkIil8fGUucHNOYW1lPy5pbmNsdWRlcygiQm9sZCIpKSYmKG49ImJvbGQiKTsoZS5uYW1lLmluY2x1ZGVzKCJJdGFsaWMiKXx8ZS5uYW1lLmVuZHNXaXRoKCJJdCIpfHxlLnBzTmFtZT8uaW5jbHVkZXMoIkl0YWxpYyIpfHxlLnBzTmFtZT8uZW5kc1dpdGgoIkl0IikpJiYobis9Iml0YWxpYyIpfW58fChuPSJyZWd1bGFyIik7cltuXT1lfWdldERlZmF1bHQoKXtyZXR1cm4gdGhpcy5kZWZhdWx0Rm9udH1maW5kKGUpe2xldCB0PSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV0sYT10aGlzLmZvbnRzLmdldChlKXx8dGhpcy5jYWNoZS5nZXQoZSk7aWYoYSlyZXR1cm4gYTtjb25zdCByPS8sfC18X3wgfGJvbGRpdGFsaWN8Ym9sZHxpdGFsaWN8cmVndWxhcnxpdC9naTtsZXQgbj1lLnJlcGxhY2VBbGwociwiIik7YT10aGlzLmZvbnRzLmdldChuKTtpZihhKXt0aGlzLmNhY2hlLnNldChlLGEpO3JldHVybiBhfW49bi50b0xvd2VyQ2FzZSgpO2NvbnN0IHM9W107Zm9yKGNvbnN0W2UsdF1vZiB0aGlzLmZvbnRzLmVudHJpZXMoKSllLnJlcGxhY2VBbGwociwiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG4pJiZzLnB1c2godCk7aWYoMD09PXMubGVuZ3RoKWZvcihjb25zdFssZV1vZiB0aGlzLmZvbnRzLmVudHJpZXMoKSllLnJlZ3VsYXIubmFtZT8ucmVwbGFjZUFsbChyLCIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobikmJnMucHVzaChlKTtpZigwPT09cy5sZW5ndGgpe249bi5yZXBsYWNlQWxsKC9wc210fG10L2dpLCIiKTtmb3IoY29uc3RbZSx0XW9mIHRoaXMuZm9udHMuZW50cmllcygpKWUucmVwbGFjZUFsbChyLCIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobikmJnMucHVzaCh0KX1pZigwPT09cy5sZW5ndGgpZm9yKGNvbnN0IGUgb2YgdGhpcy5mb250cy52YWx1ZXMoKSllLnJlZ3VsYXIubmFtZT8ucmVwbGFjZUFsbChyLCIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobikmJnMucHVzaChlKTtpZihzLmxlbmd0aD49MSl7MSE9PXMubGVuZ3RoJiZ0JiYoMCxpLndhcm4pKGBYRkEgLSBUb28gbWFueSBjaG9pY2VzIHRvIGd1ZXNzIHRoZSBjb3JyZWN0IGZvbnQ6ICR7ZX1gKTt0aGlzLmNhY2hlLnNldChlLHNbMF0pO3JldHVybiBzWzBdfWlmKHQmJiF0aGlzLndhcm5lZC5oYXMoZSkpe3RoaXMud2FybmVkLmFkZChlKTsoMCxpLndhcm4pKGBYRkEgLSBDYW5ub3QgZmluZCB0aGUgZm9udDogJHtlfWApfXJldHVybiBudWxsfX07ZnVuY3Rpb24gc2VsZWN0Rm9udChlLHQpe3JldHVybiJpdGFsaWMiPT09ZS5wb3N0dXJlPyJib2xkIj09PWUud2VpZ2h0P3QuYm9sZGl0YWxpYzp0Lml0YWxpYzoiYm9sZCI9PT1lLndlaWdodD90LmJvbGQ6dC5yZWd1bGFyfX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5UZXh0TWVhc3VyZT12b2lkIDA7YSgxMzkpO3ZhciByPWEoMjM4KTtjbGFzcyBGb250SW5mb3tjb25zdHJ1Y3RvcihlLHQsYSxuKXt0aGlzLmxpbmVIZWlnaHQ9YTt0aGlzLnBhcmFNYXJnaW49dHx8e3RvcDowLGJvdHRvbTowLGxlZnQ6MCxyaWdodDowfTtpZighZSl7W3RoaXMucGRmRm9udCx0aGlzLnhmYUZvbnRdPXRoaXMuZGVmYXVsdEZvbnQobik7cmV0dXJufXRoaXMueGZhRm9udD17dHlwZWZhY2U6ZS50eXBlZmFjZSxwb3N0dXJlOmUucG9zdHVyZSx3ZWlnaHQ6ZS53ZWlnaHQsc2l6ZTplLnNpemUsbGV0dGVyU3BhY2luZzplLmxldHRlclNwYWNpbmd9O2NvbnN0IGk9bi5maW5kKGUudHlwZWZhY2UpO2lmKGkpe3RoaXMucGRmRm9udD0oMCxyLnNlbGVjdEZvbnQpKGUsaSk7dGhpcy5wZGZGb250fHwoW3RoaXMucGRmRm9udCx0aGlzLnhmYUZvbnRdPXRoaXMuZGVmYXVsdEZvbnQobikpfWVsc2VbdGhpcy5wZGZGb250LHRoaXMueGZhRm9udF09dGhpcy5kZWZhdWx0Rm9udChuKX1kZWZhdWx0Rm9udChlKXtjb25zdCB0PWUuZmluZCgiSGVsdmV0aWNhIiwhMSl8fGUuZmluZCgiTXlyaWFkIFBybyIsITEpfHxlLmZpbmQoIkFyaWFsIiwhMSl8fGUuZ2V0RGVmYXVsdCgpO2lmKHQ/LnJlZ3VsYXIpe2NvbnN0IGU9dC5yZWd1bGFyO3JldHVybltlLHt0eXBlZmFjZTplLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHkscG9zdHVyZToibm9ybWFsIix3ZWlnaHQ6Im5vcm1hbCIsc2l6ZToxMCxsZXR0ZXJTcGFjaW5nOjB9XX1yZXR1cm5bbnVsbCx7dHlwZWZhY2U6IkNvdXJpZXIiLHBvc3R1cmU6Im5vcm1hbCIsd2VpZ2h0OiJub3JtYWwiLHNpemU6MTAsbGV0dGVyU3BhY2luZzowfV19fWNsYXNzIEZvbnRTZWxlY3Rvcntjb25zdHJ1Y3RvcihlLHQsYSxyKXt0aGlzLmZvbnRGaW5kZXI9cjt0aGlzLnN0YWNrPVtuZXcgRm9udEluZm8oZSx0LGEscildfXB1c2hEYXRhKGUsdCxhKXtjb25zdCByPXRoaXMuc3RhY2suYXQoLTEpO2Zvcihjb25zdCB0IG9mWyJ0eXBlZmFjZSIsInBvc3R1cmUiLCJ3ZWlnaHQiLCJzaXplIiwibGV0dGVyU3BhY2luZyJdKWVbdF18fChlW3RdPXIueGZhRm9udFt0XSk7Zm9yKGNvbnN0IGUgb2ZbInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdKWlzTmFOKHRbZV0pJiYodFtlXT1yLnBhcmFNYXJnaW5bZV0pO2NvbnN0IG49bmV3IEZvbnRJbmZvKGUsdCxhfHxyLmxpbmVIZWlnaHQsdGhpcy5mb250RmluZGVyKTtuLnBkZkZvbnR8fChuLnBkZkZvbnQ9ci5wZGZGb250KTt0aGlzLnN0YWNrLnB1c2gobil9cG9wRm9udCgpe3RoaXMuc3RhY2sucG9wKCl9dG9wRm9udCgpe3JldHVybiB0aGlzLnN0YWNrLmF0KC0xKX19dC5UZXh0TWVhc3VyZT1jbGFzcyBUZXh0TWVhc3VyZXtjb25zdHJ1Y3RvcihlLHQsYSxyKXt0aGlzLmdseXBocz1bXTt0aGlzLmZvbnRTZWxlY3Rvcj1uZXcgRm9udFNlbGVjdG9yKGUsdCxhLHIpO3RoaXMuZXh0cmFIZWlnaHQ9MH1wdXNoRGF0YShlLHQsYSl7dGhpcy5mb250U2VsZWN0b3IucHVzaERhdGEoZSx0LGEpfXBvcEZvbnQoZSl7cmV0dXJuIHRoaXMuZm9udFNlbGVjdG9yLnBvcEZvbnQoKX1hZGRQYXJhKCl7Y29uc3QgZT10aGlzLmZvbnRTZWxlY3Rvci50b3BGb250KCk7dGhpcy5leHRyYUhlaWdodCs9ZS5wYXJhTWFyZ2luLnRvcCtlLnBhcmFNYXJnaW4uYm90dG9tfWFkZFN0cmluZyhlKXtpZighZSlyZXR1cm47Y29uc3QgdD10aGlzLmZvbnRTZWxlY3Rvci50b3BGb250KCksYT10LnhmYUZvbnQuc2l6ZTtpZih0LnBkZkZvbnQpe2NvbnN0IHI9dC54ZmFGb250LmxldHRlclNwYWNpbmcsbj10LnBkZkZvbnQsaT1uLmxpbmVIZWlnaHR8fDEuMixzPXQubGluZUhlaWdodHx8TWF0aC5tYXgoMS4yLGkpKmEsbz1pLSh2b2lkIDA9PT1uLmxpbmVHYXA/LjI6bi5saW5lR2FwKSxjPU1hdGgubWF4KDEsbykqYSxsPWEvMWUzLGg9bi5kZWZhdWx0V2lkdGh8fG4uY2hhcnNUb0dseXBocygiICIpWzBdLndpZHRoO2Zvcihjb25zdCB0IG9mIGUuc3BsaXQoL1tcdTIwMjlcbl0vKSl7Y29uc3QgZT1uLmVuY29kZVN0cmluZyh0KS5qb2luKCIiKSxhPW4uY2hhcnNUb0dseXBocyhlKTtmb3IoY29uc3QgZSBvZiBhKXtjb25zdCB0PWUud2lkdGh8fGg7dGhpcy5nbHlwaHMucHVzaChbdCpsK3IscyxjLGUudW5pY29kZSwhMV0pfXRoaXMuZ2x5cGhzLnB1c2goWzAsMCwwLCJcbiIsITBdKX10aGlzLmdseXBocy5wb3AoKX1lbHNle2Zvcihjb25zdCB0IG9mIGUuc3BsaXQoL1tcdTIwMjlcbl0vKSl7Zm9yKGNvbnN0IGUgb2YgdC5zcGxpdCgiIikpdGhpcy5nbHlwaHMucHVzaChbYSwxLjIqYSxhLGUsITFdKTt0aGlzLmdseXBocy5wdXNoKFswLDAsMCwiXG4iLCEwXSl9dGhpcy5nbHlwaHMucG9wKCl9fWNvbXB1dGUoZSl7bGV0IHQ9LTEsYT0wLHI9MCxuPTAsaT0wLHM9MCxvPSExLGM9ITA7Zm9yKGxldCBsPTAsaD10aGlzLmdseXBocy5sZW5ndGg7bDxoO2wrKyl7Y29uc3RbaCx1LGQsZixnXT10aGlzLmdseXBoc1tsXSxwPSIgIj09PWYsbT1jP2Q6dTtpZihnKXtyPU1hdGgubWF4KHIsaSk7aT0wO24rPXM7cz1tO3Q9LTE7YT0wO2M9ITF9ZWxzZSBpZihwKWlmKGkraD5lKXtyPU1hdGgubWF4KHIsaSk7aT0wO24rPXM7cz1tO3Q9LTE7YT0wO289ITA7Yz0hMX1lbHNle3M9TWF0aC5tYXgobSxzKTthPWk7aSs9aDt0PWx9ZWxzZSBpZihpK2g+ZSl7bis9cztzPW07aWYoLTEhPT10KXtsPXQ7cj1NYXRoLm1heChyLGEpO2k9MDt0PS0xO2E9MH1lbHNle3I9TWF0aC5tYXgocixpKTtpPWh9bz0hMDtjPSExfWVsc2V7aSs9aDtzPU1hdGgubWF4KG0scyl9fXI9TWF0aC5tYXgocixpKTtuKz1zK3RoaXMuZXh0cmFIZWlnaHQ7cmV0dXJue3dpZHRoOjEuMDIqcixoZWlnaHQ6bixpc0Jyb2tlbjpvfX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlhtbE9iamVjdD10LlhGQU9iamVjdEFycmF5PXQuWEZBT2JqZWN0PXQuWEZBQXR0cmlidXRlPXQuU3RyaW5nT2JqZWN0PXQuT3B0aW9uT2JqZWN0PXQuT3B0aW9uMTA9dC5PcHRpb24wMT10LkludGVnZXJPYmplY3Q9dC5Db250ZW50T2JqZWN0PXZvaWQgMDthKDEzOSk7YSgxMTYpO2EoMTI2KTthKDEyOCk7YSgxMzEpO2EoMTMzKTthKDEzNSk7YSgxMzcpO3ZhciByPWEoMjI4KSxuPWEoMjM3KSxpPWEoMTQ0KSxzPWEoMTQ5KSxvPWEoMjM0KSxjPWEoMjQxKTtjb25zdCBsPVN5bWJvbCgpLGg9U3ltYm9sKCksdT1TeW1ib2woKSxkPVN5bWJvbCgiX2NoaWxkcmVuIiksZj1TeW1ib2woKSxnPVN5bWJvbCgpLHA9U3ltYm9sKCksbT1TeW1ib2woKSxiPVN5bWJvbCgpLHk9U3ltYm9sKCksdz1TeW1ib2woKSxTPVN5bWJvbCgpLHg9U3ltYm9sKCksQz1TeW1ib2woInBhcmVudCIpLHY9U3ltYm9sKCksaz1TeW1ib2woKSxPPVN5bWJvbCgpO2xldCBUPTA7Y29uc3QgTT1vLk5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDtjbGFzcyBYRkFPYmplY3R7Y29uc3RydWN0b3IoZSx0KXtsZXQgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO3RoaXNbci4kbmFtZXNwYWNlSWRdPWU7dGhpc1tyLiRub2RlTmFtZV09dDt0aGlzW3ddPWE7dGhpc1tDXT1udWxsO3RoaXNbZF09W107dGhpc1tyLiR1aWRdPWAke3R9JHtUKyt9YDt0aGlzW3IuJGdsb2JhbERhdGFdPW51bGx9Z2V0IGlzWEZBT2JqZWN0KCl7cmV0dXJuITB9Z2V0IGlzWEZBT2JqZWN0QXJyYXkoKXtyZXR1cm4hMX1jcmVhdGVOb2RlcyhlKXtsZXQgdD10aGlzLGE9bnVsbDtmb3IoY29uc3R7bmFtZTpuLGluZGV4Oml9b2YgZSl7Zm9yKGxldCBlPTAscz1pc0Zpbml0ZShpKT9pOjA7ZTw9cztlKyspe2NvbnN0IGU9dFtyLiRuYW1lc3BhY2VJZF09PT1NPy0xOnRbci4kbmFtZXNwYWNlSWRdO2E9bmV3IFhtbE9iamVjdChlLG4pO3Rbci4kYXBwZW5kQ2hpbGRdKGEpfXQ9YX1yZXR1cm4gYX1bci4kb25DaGlsZF0oZSl7aWYoIXRoaXNbd118fCF0aGlzW3IuJG9uQ2hpbGRDaGVja10oZSkpcmV0dXJuITE7Y29uc3QgdD1lW3IuJG5vZGVOYW1lXSxhPXRoaXNbdF07aWYoIShhIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpKXtudWxsIT09YSYmdGhpc1tyLiRyZW1vdmVDaGlsZF0oYSk7dGhpc1t0XT1lO3RoaXNbci4kYXBwZW5kQ2hpbGRdKGUpO3JldHVybiEwfWlmKGEucHVzaChlKSl7dGhpc1tyLiRhcHBlbmRDaGlsZF0oZSk7cmV0dXJuITB9bGV0IG49IiI7dGhpcy5pZD9uPWAgKGlkOiAke3RoaXMuaWR9KWA6dGhpcy5uYW1lJiYobj1gIChuYW1lOiAke3RoaXMubmFtZX0gJHt0aGlzLmgudmFsdWV9KWApOygwLGkud2FybikoYFhGQSAtIG5vZGUgIiR7dGhpc1tyLiRub2RlTmFtZV19IiR7bn0gaGFzIGFscmVhZHkgZW5vdWdoICIke3R9IiFgKTtyZXR1cm4hMX1bci4kb25DaGlsZENoZWNrXShlKXtyZXR1cm4gdGhpcy5oYXNPd25Qcm9wZXJ0eShlW3IuJG5vZGVOYW1lXSkmJmVbci4kbmFtZXNwYWNlSWRdPT09dGhpc1tyLiRuYW1lc3BhY2VJZF19W3IuJGlzTnNBZ25vc3RpY10oKXtyZXR1cm4hMX1bci4kYWNjZXB0V2hpdGVzcGFjZV0oKXtyZXR1cm4hMX1bci4kaXNDREFUQVhtbF0oKXtyZXR1cm4hMX1bci4kaXNCaW5kYWJsZV0oKXtyZXR1cm4hMX1bci4kcG9wUGFyYV0oKXt0aGlzLnBhcmEmJnRoaXNbci4kZ2V0VGVtcGxhdGVSb290XSgpW3IuJGV4dHJhXS5wYXJhU3RhY2sucG9wKCl9W3IuJHB1c2hQYXJhXSgpe3RoaXNbci4kZ2V0VGVtcGxhdGVSb290XSgpW3IuJGV4dHJhXS5wYXJhU3RhY2sucHVzaCh0aGlzLnBhcmEpfVtyLiRzZXRJZF0oZSl7dGhpcy5pZCYmdGhpc1tyLiRuYW1lc3BhY2VJZF09PT1vLk5hbWVzcGFjZUlkcy50ZW1wbGF0ZS5pZCYmZS5zZXQodGhpcy5pZCx0aGlzKX1bci4kZ2V0VGVtcGxhdGVSb290XSgpe3JldHVybiB0aGlzW3IuJGdsb2JhbERhdGFdLnRlbXBsYXRlfVtyLiRpc1NwbGl0dGFibGVdKCl7cmV0dXJuITF9W3IuJGlzVGhlcmVNb3JlV2lkdGhdKCl7cmV0dXJuITF9W3IuJGFwcGVuZENoaWxkXShlKXtlW0NdPXRoaXM7dGhpc1tkXS5wdXNoKGUpOyFlW3IuJGdsb2JhbERhdGFdJiZ0aGlzW3IuJGdsb2JhbERhdGFdJiYoZVtyLiRnbG9iYWxEYXRhXT10aGlzW3IuJGdsb2JhbERhdGFdKX1bci4kcmVtb3ZlQ2hpbGRdKGUpe2NvbnN0IHQ9dGhpc1tkXS5pbmRleE9mKGUpO3RoaXNbZF0uc3BsaWNlKHQsMSl9W3IuJGhhc1NldHRhYmxlVmFsdWVdKCl7cmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkoInZhbHVlIil9W3IuJHNldFZhbHVlXShlKXt9W3IuJG9uVGV4dF0oZSl7fVtyLiRmaW5hbGl6ZV0oKXt9W3IuJGNsZWFuXShlKXtkZWxldGUgdGhpc1t3XTtpZih0aGlzW3IuJGNsZWFudXBdKXtlLmNsZWFuKHRoaXNbci4kY2xlYW51cF0pO2RlbGV0ZSB0aGlzW3IuJGNsZWFudXBdfX1bci4kaW5kZXhPZl0oZSl7cmV0dXJuIHRoaXNbZF0uaW5kZXhPZihlKX1bci4kaW5zZXJ0QXRdKGUsdCl7dFtDXT10aGlzO3RoaXNbZF0uc3BsaWNlKGUsMCx0KTshdFtyLiRnbG9iYWxEYXRhXSYmdGhpc1tyLiRnbG9iYWxEYXRhXSYmKHRbci4kZ2xvYmFsRGF0YV09dGhpc1tyLiRnbG9iYWxEYXRhXSl9W3IuJGlzVHJhbnNwYXJlbnRdKCl7cmV0dXJuIXRoaXMubmFtZX1bci4kbGFzdEF0dHJpYnV0ZV0oKXtyZXR1cm4iIn1bci4kdGV4dF0oKXtyZXR1cm4gMD09PXRoaXNbZF0ubGVuZ3RoP3RoaXNbci4kY29udGVudF06dGhpc1tkXS5tYXAoKGU9PmVbci4kdGV4dF0oKSkpLmpvaW4oIiIpfWdldFt1XSgpe2NvbnN0IGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO2lmKCFlLl9hdHRyaWJ1dGVzKXtjb25zdCB0PWUuX2F0dHJpYnV0ZXM9bmV3IFNldDtmb3IoY29uc3QgZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSl7aWYobnVsbD09PXRoaXNbZV18fHRoaXNbZV1pbnN0YW5jZW9mIFhGQU9iamVjdHx8dGhpc1tlXWluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpYnJlYWs7dC5hZGQoZSl9fXJldHVybigwLGkuc2hhZG93KSh0aGlzLHUsZS5fYXR0cmlidXRlcyl9W3IuJGlzRGVzY2VuZGVudF0oZSl7bGV0IHQ9dGhpcztmb3IoO3Q7KXtpZih0PT09ZSlyZXR1cm4hMDt0PXRbci4kZ2V0UGFyZW50XSgpfXJldHVybiExfVtyLiRnZXRQYXJlbnRdKCl7cmV0dXJuIHRoaXNbQ119W3IuJGdldFN1YmZvcm1QYXJlbnRdKCl7cmV0dXJuIHRoaXNbci4kZ2V0UGFyZW50XSgpfVtyLiRnZXRDaGlsZHJlbl0oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDtyZXR1cm4gZT90aGlzW2VdOnRoaXNbZF19W3IuJGR1bXBdKCl7Y29uc3QgZT1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXNbci4kY29udGVudF0mJihlLiRjb250ZW50PXRoaXNbci4kY29udGVudF0pO2Zvcihjb25zdCB0IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtjb25zdCBhPXRoaXNbdF07bnVsbCE9PWEmJihhIGluc3RhbmNlb2YgWEZBT2JqZWN0P2VbdF09YVtyLiRkdW1wXSgpOmEgaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheT9hLmlzRW1wdHkoKXx8KGVbdF09YS5kdW1wKCkpOmVbdF09YSl9cmV0dXJuIGV9W3IuJHRvU3R5bGVdKCl7cmV0dXJuIG51bGx9W3IuJHRvSFRNTF0oKXtyZXR1cm4gbi5IVE1MUmVzdWx0LkVNUFRZfSpbci4kZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCl7Zm9yKGNvbnN0IGUgb2YgdGhpc1tyLiRnZXRDaGlsZHJlbl0oKSl5aWVsZCBlfSpbbV0oZSx0KXtmb3IoY29uc3QgYSBvZiB0aGlzW3IuJGdldENvbnRhaW5lZENoaWxkcmVuXSgpKWlmKCFlfHx0PT09ZS5oYXMoYVtyLiRub2RlTmFtZV0pKXtjb25zdCBlPXRoaXNbci4kZ2V0QXZhaWxhYmxlU3BhY2VdKCksdD1hW3IuJHRvSFRNTF0oZSk7dC5zdWNjZXNzfHwodGhpc1tyLiRleHRyYV0uZmFpbGluZ05vZGU9YSk7eWllbGQgdH19W3IuJGZsdXNoSFRNTF0oKXtyZXR1cm4gbnVsbH1bci4kYWRkSFRNTF0oZSx0KXt0aGlzW3IuJGV4dHJhXS5jaGlsZHJlbi5wdXNoKGUpfVtyLiRnZXRBdmFpbGFibGVTcGFjZV0oKXt9W3IuJGNoaWxkcmVuVG9IVE1MXShlKXtsZXR7ZmlsdGVyOnQ9bnVsbCxpbmNsdWRlOmE9ITB9PWU7aWYodGhpc1tyLiRleHRyYV0uZ2VuZXJhdG9yKXtjb25zdCBlPXRoaXNbci4kZ2V0QXZhaWxhYmxlU3BhY2VdKCksdD10aGlzW3IuJGV4dHJhXS5mYWlsaW5nTm9kZVtyLiR0b0hUTUxdKGUpO2lmKCF0LnN1Y2Nlc3MpcmV0dXJuIHQ7dC5odG1sJiZ0aGlzW3IuJGFkZEhUTUxdKHQuaHRtbCx0LmJib3gpO2RlbGV0ZSB0aGlzW3IuJGV4dHJhXS5mYWlsaW5nTm9kZX1lbHNlIHRoaXNbci4kZXh0cmFdLmdlbmVyYXRvcj10aGlzW21dKHQsYSk7Zm9yKDs7KXtjb25zdCBlPXRoaXNbci4kZXh0cmFdLmdlbmVyYXRvci5uZXh0KCk7aWYoZS5kb25lKWJyZWFrO2NvbnN0IHQ9ZS52YWx1ZTtpZighdC5zdWNjZXNzKXJldHVybiB0O3QuaHRtbCYmdGhpc1tyLiRhZGRIVE1MXSh0Lmh0bWwsdC5iYm94KX10aGlzW3IuJGV4dHJhXS5nZW5lcmF0b3I9bnVsbDtyZXR1cm4gbi5IVE1MUmVzdWx0LkVNUFRZfVtyLiRzZXRTZXRBdHRyaWJ1dGVzXShlKXt0aGlzW2tdPW5ldyBTZXQoT2JqZWN0LmtleXMoZSkpfVt5XShlKXtjb25zdCB0PXRoaXNbdV0sYT10aGlzW2tdO3JldHVyblsuLi5lXS5maWx0ZXIoKGU9PnQuaGFzKGUpJiYhYS5oYXMoZSkpKX1bci4kcmVzb2x2ZVByb3RvdHlwZXNdKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpuZXcgU2V0O2Zvcihjb25zdCBhIG9mIHRoaXNbZF0pYVt2XShlLHQpfVt2XShlLHQpe2NvbnN0IGE9dGhpc1tiXShlLHQpO2E/dGhpc1tsXShhLGUsdCk6dGhpc1tyLiRyZXNvbHZlUHJvdG90eXBlc10oZSx0KX1bYl0oZSx0KXtjb25zdHt1c2U6YSx1c2VocmVmOm59PXRoaXM7aWYoIWEmJiFuKXJldHVybiBudWxsO2xldCBzPW51bGwsbz1udWxsLGg9bnVsbCx1PWE7aWYobil7dT1uO24uc3RhcnRzV2l0aCgiI3NvbSgiKSYmbi5lbmRzV2l0aCgiKSIpP289bi5zbGljZSg1LC0xKTpuLnN0YXJ0c1dpdGgoIi4jc29tKCIpJiZuLmVuZHNXaXRoKCIpIik/bz1uLnNsaWNlKDYsLTEpOm4uc3RhcnRzV2l0aCgiIyIpP2g9bi5zbGljZSgxKTpuLnN0YXJ0c1dpdGgoIi4jIikmJihoPW4uc2xpY2UoMikpfWVsc2UgYS5zdGFydHNXaXRoKCIjIik/aD1hLnNsaWNlKDEpOm89YTt0aGlzLnVzZT10aGlzLnVzZWhyZWY9IiI7aWYoaClzPWUuZ2V0KGgpO2Vsc2V7cz0oMCxjLnNlYXJjaE5vZGUpKGUuZ2V0KHIuJHJvb3QpLHRoaXMsbywhMCwhMSk7cyYmKHM9c1swXSl9aWYoIXMpeygwLGkud2FybikoYFhGQSAtIEludmFsaWQgcHJvdG90eXBlIHJlZmVyZW5jZTogJHt1fS5gKTtyZXR1cm4gbnVsbH1pZihzW3IuJG5vZGVOYW1lXSE9PXRoaXNbci4kbm9kZU5hbWVdKXsoMCxpLndhcm4pKGBYRkEgLSBJbmNvbXBhdGlibGUgcHJvdG90eXBlOiAke3Nbci4kbm9kZU5hbWVdfSAhPT0gJHt0aGlzW3IuJG5vZGVOYW1lXX0uYCk7cmV0dXJuIG51bGx9aWYodC5oYXMocykpeygwLGkud2FybikoIlhGQSAtIEN5Y2xlIGRldGVjdGVkIGluIHByb3RvdHlwZXMgdXNlLiIpO3JldHVybiBudWxsfXQuYWRkKHMpO2NvbnN0IGQ9c1tiXShlLHQpO2QmJnNbbF0oZCxlLHQpO3Nbci4kcmVzb2x2ZVByb3RvdHlwZXNdKGUsdCk7dC5kZWxldGUocyk7cmV0dXJuIHN9W2xdKGUsdCxhKXtpZihhLmhhcyhlKSl7KDAsaS53YXJuKSgiWEZBIC0gQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvdG90eXBlcyB1c2UuIik7cmV0dXJufSF0aGlzW3IuJGNvbnRlbnRdJiZlW3IuJGNvbnRlbnRdJiYodGhpc1tyLiRjb250ZW50XT1lW3IuJGNvbnRlbnRdKTtuZXcgU2V0KGEpLmFkZChlKTtmb3IoY29uc3QgdCBvZiB0aGlzW3ldKGVba10pKXt0aGlzW3RdPWVbdF07dGhpc1trXSYmdGhpc1trXS5hZGQodCl9Zm9yKGNvbnN0IG4gb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2lmKHRoaXNbdV0uaGFzKG4pKWNvbnRpbnVlO2NvbnN0IGk9dGhpc1tuXSxzPWVbbl07aWYoaSBpbnN0YW5jZW9mIFhGQU9iamVjdEFycmF5KXtmb3IoY29uc3QgZSBvZiBpW2RdKWVbdl0odCxhKTtmb3IobGV0IG49aVtkXS5sZW5ndGgsbz1zW2RdLmxlbmd0aDtuPG87bisrKXtjb25zdCBzPWVbZF1bbl1bci4kY2xvbmVdKCk7aWYoIWkucHVzaChzKSlicmVhaztzW0NdPXRoaXM7dGhpc1tkXS5wdXNoKHMpO3Nbdl0odCxhKX19ZWxzZSBpZihudWxsPT09aSl7aWYobnVsbCE9PXMpe2NvbnN0IGU9c1tyLiRjbG9uZV0oKTtlW0NdPXRoaXM7dGhpc1tuXT1lO3RoaXNbZF0ucHVzaChlKTtlW3ZdKHQsYSl9fWVsc2V7aVtyLiRyZXNvbHZlUHJvdG90eXBlc10odCxhKTtzJiZpW2xdKHMsdCxhKX19fXN0YXRpY1tmXShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLm1hcCgoZT0+WEZBT2JqZWN0W2ZdKGUpKSk6Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZT9PYmplY3QuYXNzaWduKHt9LGUpOmV9W3IuJGNsb25lXSgpe2NvbnN0IGU9T2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGhpcykpdHJ5e2VbdF09dGhpc1t0XX1jYXRjaHsoMCxpLnNoYWRvdykoZSx0LHRoaXNbdF0pfWVbci4kdWlkXT1gJHtlW3IuJG5vZGVOYW1lXX0ke1QrK31gO2VbZF09W107Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2lmKHRoaXNbdV0uaGFzKHQpKXtlW3RdPVhGQU9iamVjdFtmXSh0aGlzW3RdKTtjb250aW51ZX1jb25zdCBhPXRoaXNbdF07ZVt0XT1hIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXk/bmV3IFhGQU9iamVjdEFycmF5KGFbU10pOm51bGx9Zm9yKGNvbnN0IHQgb2YgdGhpc1tkXSl7Y29uc3QgYT10W3IuJG5vZGVOYW1lXSxuPXRbci4kY2xvbmVdKCk7ZVtkXS5wdXNoKG4pO25bQ109ZTtudWxsPT09ZVthXT9lW2FdPW46ZVthXVtkXS5wdXNoKG4pfXJldHVybiBlfVtyLiRnZXRDaGlsZHJlbl0oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDtyZXR1cm4gZT90aGlzW2RdLmZpbHRlcigodD0+dFtyLiRub2RlTmFtZV09PT1lKSk6dGhpc1tkXX1bci4kZ2V0Q2hpbGRyZW5CeUNsYXNzXShlKXtyZXR1cm4gdGhpc1tlXX1bci4kZ2V0Q2hpbGRyZW5CeU5hbWVdKGUsdCl7bGV0IGE9IShhcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSl8fGFyZ3VtZW50c1syXTtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzW3IuJGdldENoaWxkcmVuQnlOYW1lSXRdKGUsdCxhKSl9W3IuJGdldENoaWxkcmVuQnlOYW1lSXRdKGUsdCl7dmFyIGE9dGhpcztsZXQgbj0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO3JldHVybiBmdW5jdGlvbiooKXtpZigicGFyZW50IiE9PWUpe2Zvcihjb25zdCBuIG9mIGFbZF0pe25bci4kbm9kZU5hbWVdPT09ZSYmKHlpZWxkIG4pO24ubmFtZT09PWUmJih5aWVsZCBuKTsodHx8bltyLiRpc1RyYW5zcGFyZW50XSgpKSYmKHlpZWxkKm5bci4kZ2V0Q2hpbGRyZW5CeU5hbWVJdF0oZSx0LCExKSl9biYmYVt1XS5oYXMoZSkmJih5aWVsZCBuZXcgWEZBQXR0cmlidXRlKGEsZSxhW2VdKSl9ZWxzZSB5aWVsZCBhW0NdfSgpfX10LlhGQU9iamVjdD1YRkFPYmplY3Q7Y2xhc3MgWEZBT2JqZWN0QXJyYXl7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MS8wO3RoaXNbU109ZTt0aGlzW2RdPVtdfWdldCBpc1hGQU9iamVjdCgpe3JldHVybiExfWdldCBpc1hGQU9iamVjdEFycmF5KCl7cmV0dXJuITB9cHVzaChlKXtpZih0aGlzW2RdLmxlbmd0aDw9dGhpc1tTXSl7dGhpc1tkXS5wdXNoKGUpO3JldHVybiEwfSgwLGkud2FybikoYFhGQSAtIG5vZGUgIiR7ZVtyLiRub2RlTmFtZV19IiBhY2NlcHRzIG5vIG1vcmUgdGhhbiAke3RoaXNbU119IGNoaWxkcmVuYCk7cmV0dXJuITF9aXNFbXB0eSgpe3JldHVybiAwPT09dGhpc1tkXS5sZW5ndGh9ZHVtcCgpe3JldHVybiAxPT09dGhpc1tkXS5sZW5ndGg/dGhpc1tkXVswXVtyLiRkdW1wXSgpOnRoaXNbZF0ubWFwKChlPT5lW3IuJGR1bXBdKCkpKX1bci4kY2xvbmVdKCl7Y29uc3QgZT1uZXcgWEZBT2JqZWN0QXJyYXkodGhpc1tTXSk7ZVtkXT10aGlzW2RdLm1hcCgoZT0+ZVtyLiRjbG9uZV0oKSkpO3JldHVybiBlfWdldCBjaGlsZHJlbigpe3JldHVybiB0aGlzW2RdfWNsZWFyKCl7dGhpc1tkXS5sZW5ndGg9MH19dC5YRkFPYmplY3RBcnJheT1YRkFPYmplY3RBcnJheTtjbGFzcyBYRkFBdHRyaWJ1dGV7Y29uc3RydWN0b3IoZSx0LGEpe3RoaXNbQ109ZTt0aGlzW3IuJG5vZGVOYW1lXT10O3RoaXNbci4kY29udGVudF09YTt0aGlzW3IuJGNvbnN1bWVkXT0hMTt0aGlzW3IuJHVpZF09ImF0dHJpYnV0ZSIrVCsrfVtyLiRnZXRQYXJlbnRdKCl7cmV0dXJuIHRoaXNbQ119W3IuJGlzRGF0YVZhbHVlXSgpe3JldHVybiEwfVtyLiRnZXREYXRhVmFsdWVdKCl7cmV0dXJuIHRoaXNbci4kY29udGVudF0udHJpbSgpfVtyLiRzZXRWYWx1ZV0oZSl7ZT1lLnZhbHVlfHwiIjt0aGlzW3IuJGNvbnRlbnRdPWUudG9TdHJpbmcoKX1bci4kdGV4dF0oKXtyZXR1cm4gdGhpc1tyLiRjb250ZW50XX1bci4kaXNEZXNjZW5kZW50XShlKXtyZXR1cm4gdGhpc1tDXT09PWV8fHRoaXNbQ11bci4kaXNEZXNjZW5kZW50XShlKX19dC5YRkFBdHRyaWJ1dGU9WEZBQXR0cmlidXRlO2NsYXNzIFhtbE9iamVjdCBleHRlbmRzIFhGQU9iamVjdHtjb25zdHJ1Y3RvcihlLHQpe2xldCBhPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTtzdXBlcihlLHQpO3RoaXNbci4kY29udGVudF09IiI7dGhpc1tnXT1udWxsO2lmKCIjdGV4dCIhPT10KXtjb25zdCBlPW5ldyBNYXA7dGhpc1toXT1lO2Zvcihjb25zdFt0LHJdb2YgT2JqZWN0LmVudHJpZXMoYSkpZS5zZXQodCxuZXcgWEZBQXR0cmlidXRlKHRoaXMsdCxyKSk7aWYoYS5oYXNPd25Qcm9wZXJ0eShyLiRuc0F0dHJpYnV0ZXMpKXtjb25zdCBlPWFbci4kbnNBdHRyaWJ1dGVzXS54ZmEuZGF0YU5vZGU7dm9pZCAwIT09ZSYmKCJkYXRhR3JvdXAiPT09ZT90aGlzW2ddPSExOiJkYXRhVmFsdWUiPT09ZSYmKHRoaXNbZ109ITApKX19dGhpc1tyLiRjb25zdW1lZF09ITF9W3IuJHRvU3RyaW5nXShlKXtjb25zdCB0PXRoaXNbci4kbm9kZU5hbWVdO2lmKCIjdGV4dCI9PT10KXtlLnB1c2goKDAscy5lbmNvZGVUb1htbFN0cmluZykodGhpc1tyLiRjb250ZW50XSkpO3JldHVybn1jb25zdCBhPSgwLGkudXRmOFN0cmluZ1RvU3RyaW5nKSh0KSxuPXRoaXNbci4kbmFtZXNwYWNlSWRdPT09TT8ieGZhOiI6IiI7ZS5wdXNoKGA8JHtufSR7YX1gKTtmb3IoY29uc3RbdCxhXW9mIHRoaXNbaF0uZW50cmllcygpKXtjb25zdCBuPSgwLGkudXRmOFN0cmluZ1RvU3RyaW5nKSh0KTtlLnB1c2goYCAke259PSIkeygwLHMuZW5jb2RlVG9YbWxTdHJpbmcpKGFbci4kY29udGVudF0pfSJgKX1udWxsIT09dGhpc1tnXSYmKHRoaXNbZ10/ZS5wdXNoKCcgeGZhOmRhdGFOb2RlPSJkYXRhVmFsdWUiJyk6ZS5wdXNoKCcgeGZhOmRhdGFOb2RlPSJkYXRhR3JvdXAiJykpO2lmKHRoaXNbci4kY29udGVudF18fDAhPT10aGlzW2RdLmxlbmd0aCl7ZS5wdXNoKCI+Iik7aWYodGhpc1tyLiRjb250ZW50XSkic3RyaW5nIj09dHlwZW9mIHRoaXNbci4kY29udGVudF0/ZS5wdXNoKCgwLHMuZW5jb2RlVG9YbWxTdHJpbmcpKHRoaXNbci4kY29udGVudF0pKTp0aGlzW3IuJGNvbnRlbnRdW3IuJHRvU3RyaW5nXShlKTtlbHNlIGZvcihjb25zdCB0IG9mIHRoaXNbZF0pdFtyLiR0b1N0cmluZ10oZSk7ZS5wdXNoKGA8LyR7bn0ke2F9PmApfWVsc2UgZS5wdXNoKCIvPiIpfVtyLiRvbkNoaWxkXShlKXtpZih0aGlzW3IuJGNvbnRlbnRdKXtjb25zdCBlPW5ldyBYbWxPYmplY3QodGhpc1tyLiRuYW1lc3BhY2VJZF0sIiN0ZXh0Iik7dGhpc1tyLiRhcHBlbmRDaGlsZF0oZSk7ZVtyLiRjb250ZW50XT10aGlzW3IuJGNvbnRlbnRdO3RoaXNbci4kY29udGVudF09IiJ9dGhpc1tyLiRhcHBlbmRDaGlsZF0oZSk7cmV0dXJuITB9W3IuJG9uVGV4dF0oZSl7dGhpc1tyLiRjb250ZW50XSs9ZX1bci4kZmluYWxpemVdKCl7aWYodGhpc1tyLiRjb250ZW50XSYmdGhpc1tkXS5sZW5ndGg+MCl7Y29uc3QgZT1uZXcgWG1sT2JqZWN0KHRoaXNbci4kbmFtZXNwYWNlSWRdLCIjdGV4dCIpO3RoaXNbci4kYXBwZW5kQ2hpbGRdKGUpO2Vbci4kY29udGVudF09dGhpc1tyLiRjb250ZW50XTtkZWxldGUgdGhpc1tyLiRjb250ZW50XX19W3IuJHRvSFRNTF0oKXtyZXR1cm4iI3RleHQiPT09dGhpc1tyLiRub2RlTmFtZV0/bi5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6IiN0ZXh0Iix2YWx1ZTp0aGlzW3IuJGNvbnRlbnRdfSk6bi5IVE1MUmVzdWx0LkVNUFRZfVtyLiRnZXRDaGlsZHJlbl0oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDtyZXR1cm4gZT90aGlzW2RdLmZpbHRlcigodD0+dFtyLiRub2RlTmFtZV09PT1lKSk6dGhpc1tkXX1bci4kZ2V0QXR0cmlidXRlc10oKXtyZXR1cm4gdGhpc1toXX1bci4kZ2V0Q2hpbGRyZW5CeUNsYXNzXShlKXtjb25zdCB0PXRoaXNbaF0uZ2V0KGUpO3JldHVybiB2b2lkIDAhPT10P3Q6dGhpc1tyLiRnZXRDaGlsZHJlbl0oZSl9KltyLiRnZXRDaGlsZHJlbkJ5TmFtZUl0XShlLHQpe2NvbnN0IGE9dGhpc1toXS5nZXQoZSk7YSYmKHlpZWxkIGEpO2Zvcihjb25zdCBhIG9mIHRoaXNbZF0pe2Fbci4kbm9kZU5hbWVdPT09ZSYmKHlpZWxkIGEpO3QmJih5aWVsZCphW3IuJGdldENoaWxkcmVuQnlOYW1lSXRdKGUsdCkpfX0qW3IuJGdldEF0dHJpYnV0ZUl0XShlLHQpe2NvbnN0IGE9dGhpc1toXS5nZXQoZSk7IWF8fHQmJmFbci4kY29uc3VtZWRdfHwoeWllbGQgYSk7Zm9yKGNvbnN0IGEgb2YgdGhpc1tkXSl5aWVsZCphW3IuJGdldEF0dHJpYnV0ZUl0XShlLHQpfSpbci4kZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGUsdCxhKXtmb3IoY29uc3QgbiBvZiB0aGlzW2RdKXtuW3IuJG5vZGVOYW1lXSE9PWV8fGEmJm5bci4kY29uc3VtZWRdfHwoeWllbGQgbik7dCYmKHlpZWxkKm5bci4kZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGUsdCxhKSl9fVtyLiRpc0RhdGFWYWx1ZV0oKXtyZXR1cm4gbnVsbD09PXRoaXNbZ10/MD09PXRoaXNbZF0ubGVuZ3RofHx0aGlzW2RdWzBdW3IuJG5hbWVzcGFjZUlkXT09PW8uTmFtZXNwYWNlSWRzLnhodG1sLmlkOnRoaXNbZ119W3IuJGdldERhdGFWYWx1ZV0oKXtyZXR1cm4gbnVsbD09PXRoaXNbZ10/MD09PXRoaXNbZF0ubGVuZ3RoP3RoaXNbci4kY29udGVudF0udHJpbSgpOnRoaXNbZF1bMF1bci4kbmFtZXNwYWNlSWRdPT09by5OYW1lc3BhY2VJZHMueGh0bWwuaWQ/dGhpc1tkXVswXVtyLiR0ZXh0XSgpLnRyaW0oKTpudWxsOnRoaXNbci4kY29udGVudF0udHJpbSgpfVtyLiRzZXRWYWx1ZV0oZSl7ZT1lLnZhbHVlfHwiIjt0aGlzW3IuJGNvbnRlbnRdPWUudG9TdHJpbmcoKX1bci4kZHVtcF0oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtlJiYodC4kbnM9dGhpc1tyLiRuYW1lc3BhY2VJZF0pO3RoaXNbci4kY29udGVudF0mJih0LiRjb250ZW50PXRoaXNbci4kY29udGVudF0pO3QuJG5hbWU9dGhpc1tyLiRub2RlTmFtZV07dC5jaGlsZHJlbj1bXTtmb3IoY29uc3QgYSBvZiB0aGlzW2RdKXQuY2hpbGRyZW4ucHVzaChhW3IuJGR1bXBdKGUpKTt0LmF0dHJpYnV0ZXM9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3RbZSxhXW9mIHRoaXNbaF0pdC5hdHRyaWJ1dGVzW2VdPWFbci4kY29udGVudF07cmV0dXJuIHR9fXQuWG1sT2JqZWN0PVhtbE9iamVjdDtjbGFzcyBDb250ZW50T2JqZWN0IGV4dGVuZHMgWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KTt0aGlzW3IuJGNvbnRlbnRdPSIifVtyLiRvblRleHRdKGUpe3RoaXNbci4kY29udGVudF0rPWV9W3IuJGZpbmFsaXplXSgpe319dC5Db250ZW50T2JqZWN0PUNvbnRlbnRPYmplY3Q7Y2xhc3MgT3B0aW9uT2JqZWN0IGV4dGVuZHMgQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoZSx0KTt0aGlzW3hdPWF9W3IuJGZpbmFsaXplXSgpe3RoaXNbci4kY29udGVudF09KDAsbi5nZXRLZXl3b3JkKSh7ZGF0YTp0aGlzW3IuJGNvbnRlbnRdLGRlZmF1bHRWYWx1ZTp0aGlzW3hdWzBdLHZhbGlkYXRlOmU9PnRoaXNbeF0uaW5jbHVkZXMoZSl9KX1bci4kY2xlYW5dKGUpe3N1cGVyW3IuJGNsZWFuXShlKTtkZWxldGUgdGhpc1t4XX19dC5PcHRpb25PYmplY3Q9T3B0aW9uT2JqZWN0O2NsYXNzIFN0cmluZ09iamVjdCBleHRlbmRzIENvbnRlbnRPYmplY3R7W3IuJGZpbmFsaXplXSgpe3RoaXNbci4kY29udGVudF09dGhpc1tyLiRjb250ZW50XS50cmltKCl9fXQuU3RyaW5nT2JqZWN0PVN0cmluZ09iamVjdDtjbGFzcyBJbnRlZ2VyT2JqZWN0IGV4dGVuZHMgQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlLHQsYSxyKXtzdXBlcihlLHQpO3RoaXNbcF09YTt0aGlzW09dPXJ9W3IuJGZpbmFsaXplXSgpe3RoaXNbci4kY29udGVudF09KDAsbi5nZXRJbnRlZ2VyKSh7ZGF0YTp0aGlzW3IuJGNvbnRlbnRdLGRlZmF1bHRWYWx1ZTp0aGlzW3BdLHZhbGlkYXRlOnRoaXNbT119KX1bci4kY2xlYW5dKGUpe3N1cGVyW3IuJGNsZWFuXShlKTtkZWxldGUgdGhpc1twXTtkZWxldGUgdGhpc1tPXX19dC5JbnRlZ2VyT2JqZWN0PUludGVnZXJPYmplY3Q7dC5PcHRpb24wMT1jbGFzcyBPcHRpb24wMSBleHRlbmRzIEludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQsMCwoZT0+MT09PWUpKX19O3QuT3B0aW9uMTA9Y2xhc3MgT3B0aW9uMTAgZXh0ZW5kcyBJbnRlZ2VyT2JqZWN0e2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0LDEsKGU9PjA9PT1lKSl9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5jcmVhdGVEYXRhTm9kZT1mdW5jdGlvbiBjcmVhdGVEYXRhTm9kZShlLHQsYSl7Y29uc3QgaT1wYXJzZUV4cHJlc3Npb24oYSk7aWYoIWkpcmV0dXJuIG51bGw7aWYoaS5zb21lKChlPT5lLm9wZXJhdG9yPT09by5kb3REb3QpKSlyZXR1cm4gbnVsbDtjb25zdCBzPWMuZ2V0KGlbMF0ubmFtZSk7bGV0IGw9MDtpZihzKXtlPXMoZSx0KTtsPTF9ZWxzZSBlPXR8fGU7Zm9yKGxldCB0PWkubGVuZ3RoO2w8dDtsKyspe2NvbnN0e25hbWU6dCxvcGVyYXRvcjphLGluZGV4OnN9PWlbbF07aWYoIWlzRmluaXRlKHMpKXtpW2xdLmluZGV4PTA7cmV0dXJuIGUuY3JlYXRlTm9kZXMoaS5zbGljZShsKSl9bGV0IGM7c3dpdGNoKGEpe2Nhc2Ugby5kb3Q6Yz1lW3IuJGdldENoaWxkcmVuQnlOYW1lXSh0LCExKTticmVhaztjYXNlIG8uZG90RG90OmM9ZVtyLiRnZXRDaGlsZHJlbkJ5TmFtZV0odCwhMCk7YnJlYWs7Y2FzZSBvLmRvdEhhc2g6Yz1lW3IuJGdldENoaWxkcmVuQnlDbGFzc10odCk7Yz1jLmlzWEZBT2JqZWN0QXJyYXk/Yy5jaGlsZHJlbjpbY119aWYoMD09PWMubGVuZ3RoKXJldHVybiBlLmNyZWF0ZU5vZGVzKGkuc2xpY2UobCkpO2lmKCEoczxjLmxlbmd0aCkpe2lbbF0uaW5kZXg9cy1jLmxlbmd0aDtyZXR1cm4gZS5jcmVhdGVOb2RlcyhpLnNsaWNlKGwpKX17Y29uc3QgdD1jW3NdO2lmKCF0LmlzWEZBT2JqZWN0KXsoMCxuLndhcm4pKCJYRkEgLSBDYW5ub3QgY3JlYXRlIGEgbm9kZS4iKTtyZXR1cm4gbnVsbH1lPXR9fXJldHVybiBudWxsfTt0LnNlYXJjaE5vZGU9ZnVuY3Rpb24gc2VhcmNoTm9kZShlLHQsYSl7bGV0IG49IShhcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSl8fGFyZ3VtZW50c1szXSxpPSEoYXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0pfHxhcmd1bWVudHNbNF07Y29uc3Qgcz1wYXJzZUV4cHJlc3Npb24oYSxuKTtpZighcylyZXR1cm4gbnVsbDtjb25zdCBoPWMuZ2V0KHNbMF0ubmFtZSk7bGV0IHUsZD0wO2lmKGgpe3U9ITA7ZT1baChlLHQpXTtkPTF9ZWxzZXt1PW51bGw9PT10O2U9W3R8fGVdfWZvcihsZXQgYT1zLmxlbmd0aDtkPGE7ZCsrKXtjb25zdHtuYW1lOmEsY2FjaGVOYW1lOm4sb3BlcmF0b3I6YyxpbmRleDpofT1zW2RdLGY9W107Zm9yKGNvbnN0IHQgb2YgZSl7aWYoIXQuaXNYRkFPYmplY3QpY29udGludWU7bGV0IGUscztpZihpKXtzPWwuZ2V0KHQpO2lmKCFzKXtzPW5ldyBNYXA7bC5zZXQodCxzKX1lPXMuZ2V0KG4pfWlmKCFlKXtzd2l0Y2goYyl7Y2FzZSBvLmRvdDplPXRbci4kZ2V0Q2hpbGRyZW5CeU5hbWVdKGEsITEpO2JyZWFrO2Nhc2Ugby5kb3REb3Q6ZT10W3IuJGdldENoaWxkcmVuQnlOYW1lXShhLCEwKTticmVhaztjYXNlIG8uZG90SGFzaDplPXRbci4kZ2V0Q2hpbGRyZW5CeUNsYXNzXShhKTtlPWUuaXNYRkFPYmplY3RBcnJheT9lLmNoaWxkcmVuOltlXX1pJiZzLnNldChuLGUpfWUubGVuZ3RoPjAmJmYucHVzaChlKX1pZigwIT09Zi5sZW5ndGh8fHV8fDAhPT1kKWU9aXNGaW5pdGUoaCk/Zi5maWx0ZXIoKGU9Pmg8ZS5sZW5ndGgpKS5tYXAoKGU9PmVbaF0pKTpmLmZsYXQoKTtlbHNle2NvbnN0IGE9dFtyLiRnZXRQYXJlbnRdKCk7aWYoISh0PWEpKXJldHVybiBudWxsO2Q9LTE7ZT1bdF19fWlmKDA9PT1lLmxlbmd0aClyZXR1cm4gbnVsbDtyZXR1cm4gZX07YSgxMzkpO3ZhciByPWEoMjI4KSxuPWEoMTQ0KTtjb25zdCBpPS9eW14uW10rLyxzPS9eW15cXV0rLyxvPXtkb3Q6MCxkb3REb3Q6MSxkb3RIYXNoOjIsZG90QnJhY2tldDozLGRvdFBhcmVuOjR9LGM9bmV3IE1hcChbWyIkZGF0YSIsKGUsdCk9PmUuZGF0YXNldHM/ZS5kYXRhc2V0cy5kYXRhOmVdLFsiJHJlY29yZCIsKGUsdCk9PihlLmRhdGFzZXRzP2UuZGF0YXNldHMuZGF0YTplKVtyLiRnZXRDaGlsZHJlbl0oKVswXV0sWyIkdGVtcGxhdGUiLChlLHQpPT5lLnRlbXBsYXRlXSxbIiRjb25uZWN0aW9uU2V0IiwoZSx0KT0+ZS5jb25uZWN0aW9uU2V0XSxbIiRmb3JtIiwoZSx0KT0+ZS5mb3JtXSxbIiRsYXlvdXQiLChlLHQpPT5lLmxheW91dF0sWyIkaG9zdCIsKGUsdCk9PmUuaG9zdF0sWyIkZGF0YVdpbmRvdyIsKGUsdCk9PmUuZGF0YVdpbmRvd10sWyIkZXZlbnQiLChlLHQpPT5lLmV2ZW50XSxbIiEiLChlLHQpPT5lLmRhdGFzZXRzXSxbIiR4ZmEiLChlLHQpPT5lXSxbInhmYSIsKGUsdCk9PmVdLFsiJCIsKGUsdCk9PnRdXSksbD1uZXcgV2Vha01hcDtmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZSx0KXtsZXQgYT0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdLHI9ZS5tYXRjaChpKTtpZighcilyZXR1cm4gbnVsbDtsZXRbY109cjtjb25zdCBsPVt7bmFtZTpjLGNhY2hlTmFtZToiLiIrYyxpbmRleDowLGpzOm51bGwsZm9ybUNhbGM6bnVsbCxvcGVyYXRvcjpvLmRvdH1dO2xldCBoPWMubGVuZ3RoO2Zvcig7aDxlLmxlbmd0aDspe2NvbnN0IGQ9aDtpZigiWyI9PT1lLmNoYXJBdChoKyspKXtyPWUuc2xpY2UoaCkubWF0Y2gocyk7aWYoIXIpeygwLG4ud2FybikoIlhGQSAtIEludmFsaWQgaW5kZXggaW4gU09NIGV4cHJlc3Npb24iKTtyZXR1cm4gbnVsbH1sLmF0KC0xKS5pbmRleD0iKiI9PT0odT0odT1yWzBdKS50cmltKCkpPzEvMDpwYXJzZUludCh1LDEwKXx8MDtoKz1yWzBdLmxlbmd0aCsxO2NvbnRpbnVlfWxldCBmO3N3aXRjaChlLmNoYXJBdChoKSl7Y2FzZSIuIjppZighdClyZXR1cm4gbnVsbDtoKys7Zj1vLmRvdERvdDticmVhaztjYXNlIiMiOmgrKztmPW8uZG90SGFzaDticmVhaztjYXNlIlsiOmlmKGEpeygwLG4ud2FybikoIlhGQSAtIFNPTSBleHByZXNzaW9uIGNvbnRhaW5zIGEgRm9ybUNhbGMgc3ViZXhwcmVzc2lvbiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub3cuIik7cmV0dXJuIG51bGx9Zj1vLmRvdEJyYWNrZXQ7YnJlYWs7Y2FzZSIoIjppZihhKXsoMCxuLndhcm4pKCJYRkEgLSBTT00gZXhwcmVzc2lvbiBjb250YWlucyBhIEphdmFTY3JpcHQgc3ViZXhwcmVzc2lvbiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub3cuIik7cmV0dXJuIG51bGx9Zj1vLmRvdFBhcmVuO2JyZWFrO2RlZmF1bHQ6Zj1vLmRvdH1yPWUuc2xpY2UoaCkubWF0Y2goaSk7aWYoIXIpYnJlYWs7W2NdPXI7aCs9Yy5sZW5ndGg7bC5wdXNoKHtuYW1lOmMsY2FjaGVOYW1lOmUuc2xpY2UoZCxoKSxvcGVyYXRvcjpmLGluZGV4OjAsanM6bnVsbCxmb3JtQ2FsYzpudWxsfSl9dmFyIHU7cmV0dXJuIGx9fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkRhdGFIYW5kbGVyPXZvaWQgMDthKDEzOSk7dmFyIHI9YSgyMjgpO3QuRGF0YUhhbmRsZXI9Y2xhc3MgRGF0YUhhbmRsZXJ7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmRhdGE9dDt0aGlzLmRhdGFzZXQ9ZS5kYXRhc2V0c3x8bnVsbH1zZXJpYWxpemUoZSl7Y29uc3QgdD1bWy0xLHRoaXMuZGF0YVtyLiRnZXRDaGlsZHJlbl0oKV1dO2Zvcig7dC5sZW5ndGg+MDspe2NvbnN0IGE9dC5hdCgtMSksW24saV09YTtpZihuKzE9PT1pLmxlbmd0aCl7dC5wb3AoKTtjb250aW51ZX1jb25zdCBzPWlbKythWzBdXSxvPWUuZ2V0KHNbci4kdWlkXSk7aWYobylzW3IuJHNldFZhbHVlXShvKTtlbHNle2NvbnN0IHQ9c1tyLiRnZXRBdHRyaWJ1dGVzXSgpO2Zvcihjb25zdCBhIG9mIHQudmFsdWVzKCkpe2NvbnN0IHQ9ZS5nZXQoYVtyLiR1aWRdKTtpZih0KXthW3IuJHNldFZhbHVlXSh0KTticmVha319fWNvbnN0IGM9c1tyLiRnZXRDaGlsZHJlbl0oKTtjLmxlbmd0aD4wJiZ0LnB1c2goWy0xLGNdKX1jb25zdCBhPVsnPHhmYTpkYXRhc2V0cyB4bWxuczp4ZmE9Imh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyI+J107aWYodGhpcy5kYXRhc2V0KWZvcihjb25zdCBlIG9mIHRoaXMuZGF0YXNldFtyLiRnZXRDaGlsZHJlbl0oKSkiZGF0YSIhPT1lW3IuJG5vZGVOYW1lXSYmZVtyLiR0b1N0cmluZ10oYSk7dGhpcy5kYXRhW3IuJHRvU3RyaW5nXShhKTthLnB1c2goIjwveGZhOmRhdGFzZXRzPiIpO3JldHVybiBhLmpvaW4oIiIpfX19LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuWEZBUGFyc2VyPXZvaWQgMDthKDExNik7YSgxMjYpO2EoMTI4KTthKDEzMSk7YSgxMzMpO2EoMTM1KTthKDEzNyk7YSgxMzkpO3ZhciByPWEoMjI4KSxuPWEoMjE3KSxpPWEoMjQ0KSxzPWEoMTQ0KTtjbGFzcyBYRkFQYXJzZXIgZXh0ZW5kcyBuLlhNTFBhcnNlckJhc2V7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbCx0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07c3VwZXIoKTt0aGlzLl9idWlsZGVyPW5ldyBpLkJ1aWxkZXIoZSk7dGhpcy5fc3RhY2s9W107dGhpcy5fZ2xvYmFsRGF0YT17dXNlZFR5cGVmYWNlczpuZXcgU2V0fTt0aGlzLl9pZHM9bmV3IE1hcDt0aGlzLl9jdXJyZW50PXRoaXMuX2J1aWxkZXIuYnVpbGRSb290KHRoaXMuX2lkcyk7dGhpcy5fZXJyb3JDb2RlPW4uWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7dGhpcy5fd2hpdGVSZWdleD0vXlxzKyQvO3RoaXMuX25ic3BzPS9ceGEwKy9nO3RoaXMuX3JpY2hUZXh0PXR9cGFyc2UoZSl7dGhpcy5wYXJzZVhtbChlKTtpZih0aGlzLl9lcnJvckNvZGU9PT1uLlhNTFBhcnNlckVycm9yQ29kZS5Ob0Vycm9yKXt0aGlzLl9jdXJyZW50W3IuJGZpbmFsaXplXSgpO3JldHVybiB0aGlzLl9jdXJyZW50LmVsZW1lbnR9fW9uVGV4dChlKXtlPWUucmVwbGFjZSh0aGlzLl9uYnNwcywoZT0+ZS5zbGljZSgxKSsiICIpKTt0aGlzLl9yaWNoVGV4dHx8dGhpcy5fY3VycmVudFtyLiRhY2NlcHRXaGl0ZXNwYWNlXSgpP3RoaXMuX2N1cnJlbnRbci4kb25UZXh0XShlLHRoaXMuX3JpY2hUZXh0KTp0aGlzLl93aGl0ZVJlZ2V4LnRlc3QoZSl8fHRoaXMuX2N1cnJlbnRbci4kb25UZXh0XShlLnRyaW0oKSl9b25DZGF0YShlKXt0aGlzLl9jdXJyZW50W3IuJG9uVGV4dF0oZSl9X21rQXR0cmlidXRlcyhlLHQpe2xldCBhPW51bGwsbj1udWxsO2NvbnN0IGk9T2JqZWN0LmNyZWF0ZSh7fSk7Zm9yKGNvbnN0e25hbWU6byx2YWx1ZTpjfW9mIGUpaWYoInhtbG5zIj09PW8pYT8oMCxzLndhcm4pKGBYRkEgLSBtdWx0aXBsZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBpbiA8JHt0fT5gKTphPWM7ZWxzZSBpZihvLnN0YXJ0c1dpdGgoInhtbG5zOiIpKXtjb25zdCBlPW8uc3Vic3RyaW5nKDYpO258fChuPVtdKTtuLnB1c2goe3ByZWZpeDplLHZhbHVlOmN9KX1lbHNle2NvbnN0IGU9by5pbmRleE9mKCI6Iik7aWYoLTE9PT1lKWlbb109YztlbHNle2xldCB0PWlbci4kbnNBdHRyaWJ1dGVzXTt0fHwodD1pW3IuJG5zQXR0cmlidXRlc109T2JqZWN0LmNyZWF0ZShudWxsKSk7Y29uc3RbYSxuXT1bby5zbGljZSgwLGUpLG8uc2xpY2UoZSsxKV07KHRbYV18fD1PYmplY3QuY3JlYXRlKG51bGwpKVtuXT1jfX1yZXR1cm5bYSxuLGldfV9nZXROYW1lQW5kUHJlZml4KGUsdCl7Y29uc3QgYT1lLmluZGV4T2YoIjoiKTtyZXR1cm4tMT09PWE/W2UsbnVsbF06W2Uuc3Vic3RyaW5nKGErMSksdD8iIjplLnN1YnN0cmluZygwLGEpXX1vbkJlZ2luRWxlbWVudChlLHQsYSl7Y29uc3RbbixpLHNdPXRoaXMuX21rQXR0cmlidXRlcyh0LGUpLFtvLGNdPXRoaXMuX2dldE5hbWVBbmRQcmVmaXgoZSx0aGlzLl9idWlsZGVyLmlzTnNBZ25vc3RpYygpKSxsPXRoaXMuX2J1aWxkZXIuYnVpbGQoe25zUHJlZml4OmMsbmFtZTpvLGF0dHJpYnV0ZXM6cyxuYW1lc3BhY2U6bixwcmVmaXhlczppfSk7bFtyLiRnbG9iYWxEYXRhXT10aGlzLl9nbG9iYWxEYXRhO2lmKGEpe2xbci4kZmluYWxpemVdKCk7dGhpcy5fY3VycmVudFtyLiRvbkNoaWxkXShsKSYmbFtyLiRzZXRJZF0odGhpcy5faWRzKTtsW3IuJGNsZWFuXSh0aGlzLl9idWlsZGVyKX1lbHNle3RoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudCk7dGhpcy5fY3VycmVudD1sfX1vbkVuZEVsZW1lbnQoZSl7Y29uc3QgdD10aGlzLl9jdXJyZW50O2lmKHRbci4kaXNDREFUQVhtbF0oKSYmInN0cmluZyI9PXR5cGVvZiB0W3IuJGNvbnRlbnRdKXtjb25zdCBlPW5ldyBYRkFQYXJzZXI7ZS5fZ2xvYmFsRGF0YT10aGlzLl9nbG9iYWxEYXRhO2NvbnN0IGE9ZS5wYXJzZSh0W3IuJGNvbnRlbnRdKTt0W3IuJGNvbnRlbnRdPW51bGw7dFtyLiRvbkNoaWxkXShhKX10W3IuJGZpbmFsaXplXSgpO3RoaXMuX2N1cnJlbnQ9dGhpcy5fc3RhY2sucG9wKCk7dGhpcy5fY3VycmVudFtyLiRvbkNoaWxkXSh0KSYmdFtyLiRzZXRJZF0odGhpcy5faWRzKTt0W3IuJGNsZWFuXSh0aGlzLl9idWlsZGVyKX1vbkVycm9yKGUpe3RoaXMuX2Vycm9yQ29kZT1lfX10LlhGQVBhcnNlcj1YRkFQYXJzZXJ9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQnVpbGRlcj12b2lkIDA7YSgxMzkpO3ZhciByPWEoMjM0KSxuPWEoMjI4KSxpPWEoMjQ1KSxzPWEoMjMwKSxvPWEoMjU0KSxjPWEoMTQ0KSxsPWEoMjQwKTtjbGFzcyBSb290IGV4dGVuZHMgbC5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoLTEsInJvb3QiLE9iamVjdC5jcmVhdGUobnVsbCkpO3RoaXMuZWxlbWVudD1udWxsO3RoaXNbbi4kaWRzXT1lfVtuLiRvbkNoaWxkXShlKXt0aGlzLmVsZW1lbnQ9ZTtyZXR1cm4hMH1bbi4kZmluYWxpemVdKCl7c3VwZXJbbi4kZmluYWxpemVdKCk7aWYodGhpcy5lbGVtZW50LnRlbXBsYXRlIGluc3RhbmNlb2Ygcy5UZW1wbGF0ZSl7dGhpc1tuLiRpZHNdLnNldChuLiRyb290LHRoaXMuZWxlbWVudCk7dGhpcy5lbGVtZW50LnRlbXBsYXRlW24uJHJlc29sdmVQcm90b3R5cGVzXSh0aGlzW24uJGlkc10pO3RoaXMuZWxlbWVudC50ZW1wbGF0ZVtuLiRpZHNdPXRoaXNbbi4kaWRzXX19fWNsYXNzIEVtcHR5IGV4dGVuZHMgbC5YRkFPYmplY3R7Y29uc3RydWN0b3IoKXtzdXBlcigtMSwiIixPYmplY3QuY3JlYXRlKG51bGwpKX1bbi4kb25DaGlsZF0oZSl7cmV0dXJuITF9fXQuQnVpbGRlcj1jbGFzcyBCdWlsZGVye2NvbnN0cnVjdG9yKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7dGhpcy5fbmFtZXNwYWNlU3RhY2s9W107dGhpcy5fbnNBZ25vc3RpY0xldmVsPTA7dGhpcy5fbmFtZXNwYWNlUHJlZml4ZXM9bmV3IE1hcDt0aGlzLl9uYW1lc3BhY2VzPW5ldyBNYXA7dGhpcy5fbmV4dE5zSWQ9TWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhyLk5hbWVzcGFjZUlkcykubWFwKChlPT57bGV0e2lkOnR9PWU7cmV0dXJuIHR9KSkpO3RoaXMuX2N1cnJlbnROYW1lc3BhY2U9ZXx8bmV3IG8uVW5rbm93bk5hbWVzcGFjZSgrK3RoaXMuX25leHROc0lkKX1idWlsZFJvb3QoZSl7cmV0dXJuIG5ldyBSb290KGUpfWJ1aWxkKGUpe2xldHtuc1ByZWZpeDp0LG5hbWU6YSxhdHRyaWJ1dGVzOnMsbmFtZXNwYWNlOm8scHJlZml4ZXM6Y309ZTtjb25zdCBsPW51bGwhPT1vO2lmKGwpe3RoaXMuX25hbWVzcGFjZVN0YWNrLnB1c2godGhpcy5fY3VycmVudE5hbWVzcGFjZSk7dGhpcy5fY3VycmVudE5hbWVzcGFjZT10aGlzLl9zZWFyY2hOYW1lc3BhY2Uobyl9YyYmdGhpcy5fYWRkTmFtZXNwYWNlUHJlZml4KGMpO2lmKHMuaGFzT3duUHJvcGVydHkobi4kbnNBdHRyaWJ1dGVzKSl7Y29uc3QgZT1pLk5hbWVzcGFjZVNldFVwLmRhdGFzZXRzLHQ9c1tuLiRuc0F0dHJpYnV0ZXNdO2xldCBhPW51bGw7Zm9yKGNvbnN0W3Isbl1vZiBPYmplY3QuZW50cmllcyh0KSl7aWYodGhpcy5fZ2V0TmFtZXNwYWNlVG9Vc2Uocik9PT1lKXthPXt4ZmE6bn07YnJlYWt9fWE/c1tuLiRuc0F0dHJpYnV0ZXNdPWE6ZGVsZXRlIHNbbi4kbnNBdHRyaWJ1dGVzXX1jb25zdCBoPXRoaXMuX2dldE5hbWVzcGFjZVRvVXNlKHQpLHU9aD8uW3IuJGJ1aWxkWEZBT2JqZWN0XShhLHMpfHxuZXcgRW1wdHk7dVtuLiRpc05zQWdub3N0aWNdKCkmJnRoaXMuX25zQWdub3N0aWNMZXZlbCsrOyhsfHxjfHx1W24uJGlzTnNBZ25vc3RpY10oKSkmJih1W24uJGNsZWFudXBdPXtoYXNOYW1lc3BhY2U6bCxwcmVmaXhlczpjLG5zQWdub3N0aWM6dVtuLiRpc05zQWdub3N0aWNdKCl9KTtyZXR1cm4gdX1pc05zQWdub3N0aWMoKXtyZXR1cm4gdGhpcy5fbnNBZ25vc3RpY0xldmVsPjB9X3NlYXJjaE5hbWVzcGFjZShlKXtsZXQgdD10aGlzLl9uYW1lc3BhY2VzLmdldChlKTtpZih0KXJldHVybiB0O2Zvcihjb25zdFthLHtjaGVjazpufV1vZiBPYmplY3QuZW50cmllcyhyLk5hbWVzcGFjZUlkcykpaWYobihlKSl7dD1pLk5hbWVzcGFjZVNldFVwW2FdO2lmKHQpe3RoaXMuX25hbWVzcGFjZXMuc2V0KGUsdCk7cmV0dXJuIHR9YnJlYWt9dD1uZXcgby5Vbmtub3duTmFtZXNwYWNlKCsrdGhpcy5fbmV4dE5zSWQpO3RoaXMuX25hbWVzcGFjZXMuc2V0KGUsdCk7cmV0dXJuIHR9X2FkZE5hbWVzcGFjZVByZWZpeChlKXtmb3IoY29uc3R7cHJlZml4OnQsdmFsdWU6YX1vZiBlKXtjb25zdCBlPXRoaXMuX3NlYXJjaE5hbWVzcGFjZShhKTtsZXQgcj10aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQodCk7aWYoIXIpe3I9W107dGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMuc2V0KHQscil9ci5wdXNoKGUpfX1fZ2V0TmFtZXNwYWNlVG9Vc2UoZSl7aWYoIWUpcmV0dXJuIHRoaXMuX2N1cnJlbnROYW1lc3BhY2U7Y29uc3QgdD10aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQoZSk7aWYodD8ubGVuZ3RoPjApcmV0dXJuIHQuYXQoLTEpOygwLGMud2FybikoYFVua25vd24gbmFtZXNwYWNlIHByZWZpeDogJHtlfS5gKTtyZXR1cm4gbnVsbH1jbGVhbihlKXtjb25zdHtoYXNOYW1lc3BhY2U6dCxwcmVmaXhlczphLG5zQWdub3N0aWM6cn09ZTt0JiYodGhpcy5fY3VycmVudE5hbWVzcGFjZT10aGlzLl9uYW1lc3BhY2VTdGFjay5wb3AoKSk7YSYmYS5mb3JFYWNoKChlPT57bGV0e3ByZWZpeDp0fT1lO3RoaXMuX25hbWVzcGFjZVByZWZpeGVzLmdldCh0KS5wb3AoKX0pKTtyJiZ0aGlzLl9uc0Fnbm9zdGljTGV2ZWwtLX19fSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0Lk5hbWVzcGFjZVNldFVwPXZvaWQgMDt2YXIgcj1hKDI0Niksbj1hKDI0NyksaT1hKDI0OCkscz1hKDI0OSksbz1hKDI1MCksYz1hKDI1MSksbD1hKDIzMCksaD1hKDI1MiksdT1hKDI1Myk7Y29uc3QgZD17Y29uZmlnOnIuQ29uZmlnTmFtZXNwYWNlLGNvbm5lY3Rpb246bi5Db25uZWN0aW9uU2V0TmFtZXNwYWNlLGRhdGFzZXRzOmkuRGF0YXNldHNOYW1lc3BhY2UsbG9jYWxlU2V0OnMuTG9jYWxlU2V0TmFtZXNwYWNlLHNpZ25hdHVyZTpvLlNpZ25hdHVyZU5hbWVzcGFjZSxzdHlsZXNoZWV0OmMuU3R5bGVzaGVldE5hbWVzcGFjZSx0ZW1wbGF0ZTpsLlRlbXBsYXRlTmFtZXNwYWNlLHhkcDpoLlhkcE5hbWVzcGFjZSx4aHRtbDp1LlhodG1sTmFtZXNwYWNlfTt0Lk5hbWVzcGFjZVNldFVwPWR9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQ29uZmlnTmFtZXNwYWNlPXZvaWQgMDthKDEzOSk7dmFyIHI9YSgyMzQpLG49YSgyMjgpLGk9YSgyNDApLHM9YSgyMzcpLG89YSgxNDQpO2NvbnN0IGM9ci5OYW1lc3BhY2VJZHMuY29uZmlnLmlkO2NsYXNzIEFjcm9iYXQgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhY3JvYmF0IiwhMCk7dGhpcy5hY3JvYmF0Nz1udWxsO3RoaXMuYXV0b1NhdmU9bnVsbDt0aGlzLmNvbW1vbj1udWxsO3RoaXMudmFsaWRhdGU9bnVsbDt0aGlzLnZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzPW51bGw7dGhpcy5zdWJtaXRVcmw9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIEFjcm9iYXQ3IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWNyb2JhdDciLCEwKTt0aGlzLmR5bmFtaWNSZW5kZXI9bnVsbH19Y2xhc3MgQURCRV9KU0NvbnNvbGUgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJBREJFX0pTQ29uc29sZSIsWyJkZWxlZ2F0ZSIsIkVuYWJsZSIsIkRpc2FibGUiXSl9fWNsYXNzIEFEQkVfSlNEZWJ1Z2dlciBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIkFEQkVfSlNEZWJ1Z2dlciIsWyJkZWxlZ2F0ZSIsIkVuYWJsZSIsIkRpc2FibGUiXSl9fWNsYXNzIEFkZFNpbGVudFByaW50IGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhZGRTaWxlbnRQcmludCIpfX1jbGFzcyBBZGRWaWV3ZXJQcmVmZXJlbmNlcyBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWRkVmlld2VyUHJlZmVyZW5jZXMiKX19Y2xhc3MgQWRqdXN0RGF0YSBleHRlbmRzIGkuT3B0aW9uMTB7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWRqdXN0RGF0YSIpfX1jbGFzcyBBZG9iZUV4dGVuc2lvbkxldmVsIGV4dGVuZHMgaS5JbnRlZ2VyT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImFkb2JlRXh0ZW5zaW9uTGV2ZWwiLDAsKGU9PmU+PTEmJmU8PTgpKX19Y2xhc3MgQWdlbnQgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhZ2VudCIsITApO3RoaXMubmFtZT1lLm5hbWU/ZS5uYW1lLnRyaW0oKToiIjt0aGlzLmNvbW1vbj1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgQWx3YXlzRW1iZWQgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWx3YXlzRW1iZWQiKX19Y2xhc3MgQW1kIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYW1kIil9fWNsYXNzIEFyZWEgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhcmVhIik7dGhpcy5sZXZlbD0oMCxzLmdldEludGVnZXIpKHtkYXRhOmUubGV2ZWwsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+ZT49MSYmZTw9M30pO3RoaXMubmFtZT0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5uYW1lLFsiIiwiYmFyY29kZSIsImNvcmVpbml0IiwiZGV2aWNlRHJpdmVyIiwiZm9udCIsImdlbmVyYWwiLCJsYXlvdXQiLCJtZXJnZSIsInNjcmlwdCIsInNpZ25hdHVyZSIsInNvdXJjZVNldCIsInRlbXBsYXRlQ2FjaGUiXSl9fWNsYXNzIEF0dHJpYnV0ZXMgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhdHRyaWJ1dGVzIixbInByZXNlcnZlIiwiZGVsZWdhdGUiLCJpZ25vcmUiXSl9fWNsYXNzIEF1dG9TYXZlIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYXV0b1NhdmUiLFsiZGlzYWJsZWQiLCJlbmFibGVkIl0pfX1jbGFzcyBCYXNlIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYmFzZSIpfX1jbGFzcyBCYXRjaE91dHB1dCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImJhdGNoT3V0cHV0Iik7dGhpcy5mb3JtYXQ9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUuZm9ybWF0LFsibm9uZSIsImNvbmNhdCIsInppcCIsInppcENvbXByZXNzIl0pfX1jbGFzcyBCZWhhdmlvck92ZXJyaWRlIGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImJlaGF2aW9yT3ZlcnJpZGUiKX1bbi4kZmluYWxpemVdKCl7dGhpc1tuLiRjb250ZW50XT1uZXcgTWFwKHRoaXNbbi4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoKGU9PmUuaW5jbHVkZXMoIjoiKSkpLm1hcCgoZT0+ZS5zcGxpdCgiOiIsMikpKSl9fWNsYXNzIENhY2hlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY2FjaGUiLCEwKTt0aGlzLnRlbXBsYXRlQ2FjaGU9bnVsbH19Y2xhc3MgQ2hhbmdlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjaGFuZ2UiKX19Y2xhc3MgQ29tbW9uIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29tbW9uIiwhMCk7dGhpcy5kYXRhPW51bGw7dGhpcy5sb2NhbGU9bnVsbDt0aGlzLmxvY2FsZVNldD1udWxsO3RoaXMubWVzc2FnaW5nPW51bGw7dGhpcy5zdXBwcmVzc0Jhbm5lcj1udWxsO3RoaXMudGVtcGxhdGU9bnVsbDt0aGlzLnZhbGlkYXRpb25NZXNzYWdpbmc9bnVsbDt0aGlzLnZlcnNpb25Db250cm9sPW51bGw7dGhpcy5sb2c9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIENvbXByZXNzIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29tcHJlc3MiKTt0aGlzLnNjb3BlPSgwLHMuZ2V0U3RyaW5nT3B0aW9uKShlLnNjb3BlLFsiaW1hZ2VPbmx5IiwiZG9jdW1lbnQiXSl9fWNsYXNzIENvbXByZXNzTG9naWNhbFN0cnVjdHVyZSBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlIil9fWNsYXNzIENvbXByZXNzT2JqZWN0U3RyZWFtIGV4dGVuZHMgaS5PcHRpb24xMHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjb21wcmVzc09iamVjdFN0cmVhbSIpfX1jbGFzcyBDb21wcmVzc2lvbiBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNvbXByZXNzaW9uIiwhMCk7dGhpcy5jb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmU9bnVsbDt0aGlzLmNvbXByZXNzT2JqZWN0U3RyZWFtPW51bGw7dGhpcy5sZXZlbD1udWxsO3RoaXMudHlwZT1udWxsfX1jbGFzcyBDb25maWcgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjb25maWciLCEwKTt0aGlzLmFjcm9iYXQ9bnVsbDt0aGlzLnByZXNlbnQ9bnVsbDt0aGlzLnRyYWNlPW51bGw7dGhpcy5hZ2VudD1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgQ29uZm9ybWFuY2UgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjb25mb3JtYW5jZSIsWyJBIiwiQiJdKX19Y2xhc3MgQ29udGVudENvcHkgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNvbnRlbnRDb3B5Iil9fWNsYXNzIENvcGllcyBleHRlbmRzIGkuSW50ZWdlck9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjb3BpZXMiLDEsKGU9PmU+PTEpKX19Y2xhc3MgQ3JlYXRvciBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNyZWF0b3IiKX19Y2xhc3MgQ3VycmVudFBhZ2UgZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY3VycmVudFBhZ2UiLDAsKGU9PmU+PTApKX19Y2xhc3MgRGF0YSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImRhdGEiLCEwKTt0aGlzLmFkanVzdERhdGE9bnVsbDt0aGlzLmF0dHJpYnV0ZXM9bnVsbDt0aGlzLmluY3JlbWVudGFsTG9hZD1udWxsO3RoaXMub3V0cHV0WFNMPW51bGw7dGhpcy5yYW5nZT1udWxsO3RoaXMucmVjb3JkPW51bGw7dGhpcy5zdGFydE5vZGU9bnVsbDt0aGlzLnVyaT1udWxsO3RoaXMud2luZG93PW51bGw7dGhpcy54c2w9bnVsbDt0aGlzLmV4Y2x1ZGVOUz1uZXcgaS5YRkFPYmplY3RBcnJheTt0aGlzLnRyYW5zZm9ybT1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgRGVidWcgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkZWJ1ZyIsITApO3RoaXMudXJpPW51bGx9fWNsYXNzIERlZmF1bHRUeXBlZmFjZSBleHRlbmRzIGkuQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkZWZhdWx0VHlwZWZhY2UiKTt0aGlzLndyaXRpbmdTY3JpcHQ9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUud3JpdGluZ1NjcmlwdCxbIioiLCJBcmFiaWMiLCJDeXJpbGxpYyIsIkVhc3RFdXJvcGVhblJvbWFuIiwiR3JlZWsiLCJIZWJyZXciLCJKYXBhbmVzZSIsIktvcmVhbiIsIlJvbWFuIiwiU2ltcGxpZmllZENoaW5lc2UiLCJUaGFpIiwiVHJhZGl0aW9uYWxDaGluZXNlIiwiVmlldG5hbWVzZSJdKX19Y2xhc3MgRGVzdGluYXRpb24gZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkZXN0aW5hdGlvbiIsWyJwZGYiLCJwY2wiLCJwcyIsIndlYkNsaWVudCIsInpwbCJdKX19Y2xhc3MgRG9jdW1lbnRBc3NlbWJseSBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZG9jdW1lbnRBc3NlbWJseSIpfX1jbGFzcyBEcml2ZXIgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkcml2ZXIiLCEwKTt0aGlzLm5hbWU9ZS5uYW1lP2UubmFtZS50cmltKCk6IiI7dGhpcy5mb250SW5mbz1udWxsO3RoaXMueGRjPW51bGx9fWNsYXNzIER1cGxleE9wdGlvbiBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImR1cGxleE9wdGlvbiIsWyJzaW1wbGV4IiwiZHVwbGV4RmxpcExvbmdFZGdlIiwiZHVwbGV4RmxpcFNob3J0RWRnZSJdKX19Y2xhc3MgRHluYW1pY1JlbmRlciBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImR5bmFtaWNSZW5kZXIiLFsiZm9yYmlkZGVuIiwicmVxdWlyZWQiXSl9fWNsYXNzIEVtYmVkIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbWJlZCIpfX1jbGFzcyBFbmNyeXB0IGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmNyeXB0Iil9fWNsYXNzIEVuY3J5cHRpb24gZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmNyeXB0aW9uIiwhMCk7dGhpcy5lbmNyeXB0PW51bGw7dGhpcy5lbmNyeXB0aW9uTGV2ZWw9bnVsbDt0aGlzLnBlcm1pc3Npb25zPW51bGx9fWNsYXNzIEVuY3J5cHRpb25MZXZlbCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImVuY3J5cHRpb25MZXZlbCIsWyI0MGJpdCIsIjEyOGJpdCJdKX19Y2xhc3MgRW5mb3JjZSBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImVuZm9yY2UiKX19Y2xhc3MgRXF1YXRlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZXF1YXRlIik7dGhpcy5mb3JjZT0oMCxzLmdldEludGVnZXIpKHtkYXRhOmUuZm9yY2UsZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+MD09PWV9KTt0aGlzLmZyb209ZS5mcm9tfHwiIjt0aGlzLnRvPWUudG98fCIifX1jbGFzcyBFcXVhdGVSYW5nZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImVxdWF0ZVJhbmdlIik7dGhpcy5mcm9tPWUuZnJvbXx8IiI7dGhpcy50bz1lLnRvfHwiIjt0aGlzLl91bmljb2RlUmFuZ2U9ZS51bmljb2RlUmFuZ2V8fCIifWdldCB1bmljb2RlUmFuZ2UoKXtjb25zdCBlPVtdLHQ9L1VcKyhbMC05YS1mQS1GXSspLyxhPXRoaXMuX3VuaWNvZGVSYW5nZTtmb3IobGV0IHIgb2YgYS5zcGxpdCgiLCIpLm1hcCgoZT0+ZS50cmltKCkpKS5maWx0ZXIoKGU9PiEhZSkpKXtyPXIuc3BsaXQoIi0iLDIpLm1hcCgoZT0+e2NvbnN0IGE9ZS5tYXRjaCh0KTtyZXR1cm4gYT9wYXJzZUludChhWzFdLDE2KTowfSkpOzE9PT1yLmxlbmd0aCYmci5wdXNoKHJbMF0pO2UucHVzaChyKX1yZXR1cm4oMCxvLnNoYWRvdykodGhpcywidW5pY29kZVJhbmdlIixlKX19Y2xhc3MgRXhjbHVkZSBleHRlbmRzIGkuQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJleGNsdWRlIil9W24uJGZpbmFsaXplXSgpe3RoaXNbbi4kY29udGVudF09dGhpc1tuLiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcigoZT0+ZSYmWyJjYWxjdWxhdGUiLCJjbG9zZSIsImVudGVyIiwiZXhpdCIsImluaXRpYWxpemUiLCJyZWFkeSIsInZhbGlkYXRlIl0uaW5jbHVkZXMoZSkpKX19Y2xhc3MgRXhjbHVkZU5TIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZXhjbHVkZU5TIil9fWNsYXNzIEZsaXBMYWJlbCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImZsaXBMYWJlbCIsWyJ1c2VQcmludGVyU2V0dGluZyIsIm9uIiwib2ZmIl0pfX1jbGFzcyBGb250SW5mbyBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImZvbnRJbmZvIiwhMCk7dGhpcy5lbWJlZD1udWxsO3RoaXMubWFwPW51bGw7dGhpcy5zdWJzZXRCZWxvdz1udWxsO3RoaXMuYWx3YXlzRW1iZWQ9bmV3IGkuWEZBT2JqZWN0QXJyYXk7dGhpcy5kZWZhdWx0VHlwZWZhY2U9bmV3IGkuWEZBT2JqZWN0QXJyYXk7dGhpcy5uZXZlckVtYmVkPW5ldyBpLlhGQU9iamVjdEFycmF5fX1jbGFzcyBGb3JtRmllbGRGaWxsaW5nIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJmb3JtRmllbGRGaWxsaW5nIil9fWNsYXNzIEdyb3VwUGFyZW50IGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZ3JvdXBQYXJlbnQiKX19Y2xhc3MgSWZFbXB0eSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImlmRW1wdHkiLFsiZGF0YVZhbHVlIiwiZGF0YUdyb3VwIiwiaWdub3JlIiwicmVtb3ZlIl0pfX1jbGFzcyBJbmNsdWRlWERQQ29udGVudCBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImluY2x1ZGVYRFBDb250ZW50Iil9fWNsYXNzIEluY3JlbWVudGFsTG9hZCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImluY3JlbWVudGFsTG9hZCIsWyJub25lIiwiZm9yd2FyZE9ubHkiXSl9fWNsYXNzIEluY3JlbWVudGFsTWVyZ2UgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImluY3JlbWVudGFsTWVyZ2UiKX19Y2xhc3MgSW50ZXJhY3RpdmUgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImludGVyYWN0aXZlIil9fWNsYXNzIEpvZyBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImpvZyIsWyJ1c2VQcmludGVyU2V0dGluZyIsIm5vbmUiLCJwYWdlU2V0Il0pfX1jbGFzcyBMYWJlbFByaW50ZXIgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJsYWJlbFByaW50ZXIiLCEwKTt0aGlzLm5hbWU9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUubmFtZSxbInpwbCIsImRwbCIsImlwbCIsInRjcGwiXSk7dGhpcy5iYXRjaE91dHB1dD1udWxsO3RoaXMuZmxpcExhYmVsPW51bGw7dGhpcy5mb250SW5mbz1udWxsO3RoaXMueGRjPW51bGx9fWNsYXNzIExheW91dCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxheW91dCIsWyJwYWdpbmF0ZSIsInBhbmVsIl0pfX1jbGFzcyBMZXZlbCBleHRlbmRzIGkuSW50ZWdlck9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJsZXZlbCIsMCwoZT0+ZT4wKSl9fWNsYXNzIExpbmVhcml6ZWQgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxpbmVhcml6ZWQiKX19Y2xhc3MgTG9jYWxlIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibG9jYWxlIil9fWNsYXNzIExvY2FsZVNldCBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxvY2FsZVNldCIpfX1jbGFzcyBMb2cgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJsb2ciLCEwKTt0aGlzLm1vZGU9bnVsbDt0aGlzLnRocmVzaG9sZD1udWxsO3RoaXMudG89bnVsbDt0aGlzLnVyaT1udWxsfX1jbGFzcyBNYXBFbGVtZW50IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibWFwIiwhMCk7dGhpcy5lcXVhdGU9bmV3IGkuWEZBT2JqZWN0QXJyYXk7dGhpcy5lcXVhdGVSYW5nZT1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgTWVkaXVtSW5mbyBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm1lZGl1bUluZm8iLCEwKTt0aGlzLm1hcD1udWxsfX1jbGFzcyBNZXNzYWdlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibWVzc2FnZSIsITApO3RoaXMubXNnSWQ9bnVsbDt0aGlzLnNldmVyaXR5PW51bGx9fWNsYXNzIE1lc3NhZ2luZyBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm1lc3NhZ2luZyIsITApO3RoaXMubWVzc2FnZT1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgTW9kZSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm1vZGUiLFsiYXBwZW5kIiwib3ZlcndyaXRlIl0pfX1jbGFzcyBNb2RpZnlBbm5vdHMgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm1vZGlmeUFubm90cyIpfX1jbGFzcyBNc2dJZCBleHRlbmRzIGkuSW50ZWdlck9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJtc2dJZCIsMSwoZT0+ZT49MSkpfX1jbGFzcyBOYW1lQXR0ciBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm5hbWVBdHRyIil9fWNsYXNzIE5ldmVyRW1iZWQgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibmV2ZXJFbWJlZCIpfX1jbGFzcyBOdW1iZXJPZkNvcGllcyBleHRlbmRzIGkuSW50ZWdlck9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJudW1iZXJPZkNvcGllcyIsbnVsbCwoZT0+ZT49MiYmZTw9NSkpfX1jbGFzcyBPcGVuQWN0aW9uIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywib3BlbkFjdGlvbiIsITApO3RoaXMuZGVzdGluYXRpb249bnVsbH19Y2xhc3MgT3V0cHV0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywib3V0cHV0IiwhMCk7dGhpcy50bz1udWxsO3RoaXMudHlwZT1udWxsO3RoaXMudXJpPW51bGx9fWNsYXNzIE91dHB1dEJpbiBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm91dHB1dEJpbiIpfX1jbGFzcyBPdXRwdXRYU0wgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJvdXRwdXRYU0wiLCEwKTt0aGlzLnVyaT1udWxsfX1jbGFzcyBPdmVycHJpbnQgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJvdmVycHJpbnQiLFsibm9uZSIsImJvdGgiLCJkcmF3IiwiZmllbGQiXSl9fWNsYXNzIFBhY2tldHMgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWNrZXRzIil9W24uJGZpbmFsaXplXSgpeyIqIiE9PXRoaXNbbi4kY29udGVudF0mJih0aGlzW24uJGNvbnRlbnRdPXRoaXNbbi4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoKGU9PlsiY29uZmlnIiwiZGF0YXNldHMiLCJ0ZW1wbGF0ZSIsInhmZGYiLCJ4c2x0Il0uaW5jbHVkZXMoZSkpKSl9fWNsYXNzIFBhZ2VPZmZzZXQgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWdlT2Zmc2V0Iik7dGhpcy54PSgwLHMuZ2V0SW50ZWdlcikoe2RhdGE6ZS54LGRlZmF1bHRWYWx1ZToidXNlWERDU2V0dGluZyIsdmFsaWRhdGU6ZT0+ITB9KTt0aGlzLnk9KDAscy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnksZGVmYXVsdFZhbHVlOiJ1c2VYRENTZXR0aW5nIix2YWxpZGF0ZTplPT4hMH0pfX1jbGFzcyBQYWdlUmFuZ2UgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWdlUmFuZ2UiKX1bbi4kZmluYWxpemVdKCl7Y29uc3QgZT10aGlzW24uJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKChlPT5wYXJzZUludChlLDEwKSkpLHQ9W107Zm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSs9Mil0LnB1c2goZS5zbGljZShhLGErMikpO3RoaXNbbi4kY29udGVudF09dH19Y2xhc3MgUGFnaW5hdGlvbiBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBhZ2luYXRpb24iLFsic2ltcGxleCIsImR1cGxleFNob3J0RWRnZSIsImR1cGxleExvbmdFZGdlIl0pfX1jbGFzcyBQYWdpbmF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWdpbmF0aW9uT3ZlcnJpZGUiLFsibm9uZSIsImZvcmNlRHVwbGV4IiwiZm9yY2VEdXBsZXhMb25nRWRnZSIsImZvcmNlRHVwbGV4U2hvcnRFZGdlIiwiZm9yY2VTaW1wbGV4Il0pfX1jbGFzcyBQYXJ0IGV4dGVuZHMgaS5JbnRlZ2VyT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBhcnQiLDEsKGU9PiExKSl9fWNsYXNzIFBjbCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBjbCIsITApO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMuYmF0Y2hPdXRwdXQ9bnVsbDt0aGlzLmZvbnRJbmZvPW51bGw7dGhpcy5qb2c9bnVsbDt0aGlzLm1lZGl1bUluZm89bnVsbDt0aGlzLm91dHB1dEJpbj1udWxsO3RoaXMucGFnZU9mZnNldD1udWxsO3RoaXMuc3RhcGxlPW51bGw7dGhpcy54ZGM9bnVsbH19Y2xhc3MgUGRmIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicGRmIiwhMCk7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy5hZG9iZUV4dGVuc2lvbkxldmVsPW51bGw7dGhpcy5iYXRjaE91dHB1dD1udWxsO3RoaXMuY29tcHJlc3Npb249bnVsbDt0aGlzLmNyZWF0b3I9bnVsbDt0aGlzLmVuY3J5cHRpb249bnVsbDt0aGlzLmZvbnRJbmZvPW51bGw7dGhpcy5pbnRlcmFjdGl2ZT1udWxsO3RoaXMubGluZWFyaXplZD1udWxsO3RoaXMub3BlbkFjdGlvbj1udWxsO3RoaXMucGRmYT1udWxsO3RoaXMucHJvZHVjZXI9bnVsbDt0aGlzLnJlbmRlclBvbGljeT1udWxsO3RoaXMuc2NyaXB0TW9kZWw9bnVsbDt0aGlzLnNpbGVudFByaW50PW51bGw7dGhpcy5zdWJtaXRGb3JtYXQ9bnVsbDt0aGlzLnRhZ2dlZD1udWxsO3RoaXMudmVyc2lvbj1udWxsO3RoaXMudmlld2VyUHJlZmVyZW5jZXM9bnVsbDt0aGlzLnhkYz1udWxsfX1jbGFzcyBQZGZhIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicGRmYSIsITApO3RoaXMuYW1kPW51bGw7dGhpcy5jb25mb3JtYW5jZT1udWxsO3RoaXMuaW5jbHVkZVhEUENvbnRlbnQ9bnVsbDt0aGlzLnBhcnQ9bnVsbH19Y2xhc3MgUGVybWlzc2lvbnMgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwZXJtaXNzaW9ucyIsITApO3RoaXMuYWNjZXNzaWJsZUNvbnRlbnQ9bnVsbDt0aGlzLmNoYW5nZT1udWxsO3RoaXMuY29udGVudENvcHk9bnVsbDt0aGlzLmRvY3VtZW50QXNzZW1ibHk9bnVsbDt0aGlzLmZvcm1GaWVsZEZpbGxpbmc9bnVsbDt0aGlzLm1vZGlmeUFubm90cz1udWxsO3RoaXMucGxhaW50ZXh0TWV0YWRhdGE9bnVsbDt0aGlzLnByaW50PW51bGw7dGhpcy5wcmludEhpZ2hRdWFsaXR5PW51bGx9fWNsYXNzIFBpY2tUcmF5QnlQREZTaXplIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwaWNrVHJheUJ5UERGU2l6ZSIpfX1jbGFzcyBQaWN0dXJlIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicGljdHVyZSIpfX1jbGFzcyBQbGFpbnRleHRNZXRhZGF0YSBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicGxhaW50ZXh0TWV0YWRhdGEiKX19Y2xhc3MgUHJlc2VuY2UgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwcmVzZW5jZSIsWyJwcmVzZXJ2ZSIsImRpc3NvbHZlIiwiZGlzc29sdmVTdHJ1Y3R1cmUiLCJpZ25vcmUiLCJyZW1vdmUiXSl9fWNsYXNzIFByZXNlbnQgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwcmVzZW50IiwhMCk7dGhpcy5iZWhhdmlvck92ZXJyaWRlPW51bGw7dGhpcy5jYWNoZT1udWxsO3RoaXMuY29tbW9uPW51bGw7dGhpcy5jb3BpZXM9bnVsbDt0aGlzLmRlc3RpbmF0aW9uPW51bGw7dGhpcy5pbmNyZW1lbnRhbE1lcmdlPW51bGw7dGhpcy5sYXlvdXQ9bnVsbDt0aGlzLm91dHB1dD1udWxsO3RoaXMub3ZlcnByaW50PW51bGw7dGhpcy5wYWdpbmF0aW9uPW51bGw7dGhpcy5wYWdpbmF0aW9uT3ZlcnJpZGU9bnVsbDt0aGlzLnNjcmlwdD1udWxsO3RoaXMudmFsaWRhdGU9bnVsbDt0aGlzLnhkcD1udWxsO3RoaXMuZHJpdmVyPW5ldyBpLlhGQU9iamVjdEFycmF5O3RoaXMubGFiZWxQcmludGVyPW5ldyBpLlhGQU9iamVjdEFycmF5O3RoaXMucGNsPW5ldyBpLlhGQU9iamVjdEFycmF5O3RoaXMucGRmPW5ldyBpLlhGQU9iamVjdEFycmF5O3RoaXMucHM9bmV3IGkuWEZBT2JqZWN0QXJyYXk7dGhpcy5zdWJtaXRVcmw9bmV3IGkuWEZBT2JqZWN0QXJyYXk7dGhpcy53ZWJDbGllbnQ9bmV3IGkuWEZBT2JqZWN0QXJyYXk7dGhpcy56cGw9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIFByaW50IGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwcmludCIpfX1jbGFzcyBQcmludEhpZ2hRdWFsaXR5IGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwcmludEhpZ2hRdWFsaXR5Iil9fWNsYXNzIFByaW50U2NhbGluZyBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInByaW50U2NhbGluZyIsWyJhcHBkZWZhdWx0Iiwibm9TY2FsaW5nIl0pfX1jbGFzcyBQcmludGVyTmFtZSBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInByaW50ZXJOYW1lIil9fWNsYXNzIFByb2R1Y2VyIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicHJvZHVjZXIiKX19Y2xhc3MgUHMgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwcyIsITApO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMuYmF0Y2hPdXRwdXQ9bnVsbDt0aGlzLmZvbnRJbmZvPW51bGw7dGhpcy5qb2c9bnVsbDt0aGlzLm1lZGl1bUluZm89bnVsbDt0aGlzLm91dHB1dEJpbj1udWxsO3RoaXMuc3RhcGxlPW51bGw7dGhpcy54ZGM9bnVsbH19Y2xhc3MgUmFuZ2UgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicmFuZ2UiKX1bbi4kZmluYWxpemVdKCl7dGhpc1tuLiRjb250ZW50XT10aGlzW24uJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMqLFxzKi8sMikubWFwKChlPT5lLnNwbGl0KCItIikubWFwKChlPT5wYXJzZUludChlLnRyaW0oKSwxMCkpKSkpLmZpbHRlcigoZT0+ZS5ldmVyeSgoZT0+IWlzTmFOKGUpKSkpKS5tYXAoKGU9PnsxPT09ZS5sZW5ndGgmJmUucHVzaChlWzBdKTtyZXR1cm4gZX0pKX19Y2xhc3MgUmVjb3JkIGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInJlY29yZCIpfVtuLiRmaW5hbGl6ZV0oKXt0aGlzW24uJGNvbnRlbnRdPXRoaXNbbi4kY29udGVudF0udHJpbSgpO2NvbnN0IGU9cGFyc2VJbnQodGhpc1tuLiRjb250ZW50XSwxMCk7IWlzTmFOKGUpJiZlPj0wJiYodGhpc1tuLiRjb250ZW50XT1lKX19Y2xhc3MgUmVsZXZhbnQgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicmVsZXZhbnQiKX1bbi4kZmluYWxpemVdKCl7dGhpc1tuLiRjb250ZW50XT10aGlzW24uJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLyl9fWNsYXNzIFJlbmFtZSBleHRlbmRzIGkuQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJyZW5hbWUiKX1bbi4kZmluYWxpemVdKCl7dGhpc1tuLiRjb250ZW50XT10aGlzW24uJGNvbnRlbnRdLnRyaW0oKTsodGhpc1tuLiRjb250ZW50XS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInhtbCIpfHxuZXcgUmVnRXhwKCJbXFxwe0x9X11bXFxwe0x9XFxkLl9cXHB7TX0tXSoiLCJ1IikudGVzdCh0aGlzW24uJGNvbnRlbnRdKSkmJigwLG8ud2FybikoIlhGQSAtIFJlbmFtZTogaW52YWxpZCBYRkEgbmFtZSIpfX1jbGFzcyBSZW5kZXJQb2xpY3kgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJyZW5kZXJQb2xpY3kiLFsic2VydmVyIiwiY2xpZW50Il0pfX1jbGFzcyBSdW5TY3JpcHRzIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicnVuU2NyaXB0cyIsWyJib3RoIiwiY2xpZW50Iiwibm9uZSIsInNlcnZlciJdKX19Y2xhc3MgU2NyaXB0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic2NyaXB0IiwhMCk7dGhpcy5jdXJyZW50UGFnZT1udWxsO3RoaXMuZXhjbHVkZT1udWxsO3RoaXMucnVuU2NyaXB0cz1udWxsfX1jbGFzcyBTY3JpcHRNb2RlbCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInNjcmlwdE1vZGVsIixbIlhGQSIsIm5vbmUiXSl9fWNsYXNzIFNldmVyaXR5IGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic2V2ZXJpdHkiLFsiaWdub3JlIiwiZXJyb3IiLCJpbmZvcm1hdGlvbiIsInRyYWNlIiwid2FybmluZyJdKX19Y2xhc3MgU2lsZW50UHJpbnQgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJzaWxlbnRQcmludCIsITApO3RoaXMuYWRkU2lsZW50UHJpbnQ9bnVsbDt0aGlzLnByaW50ZXJOYW1lPW51bGx9fWNsYXNzIFN0YXBsZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN0YXBsZSIpO3RoaXMubW9kZT0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5tb2RlLFsidXNlUHJpbnRlclNldHRpbmciLCJvbiIsIm9mZiJdKX19Y2xhc3MgU3RhcnROb2RlIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic3RhcnROb2RlIil9fWNsYXNzIFN0YXJ0UGFnZSBleHRlbmRzIGkuSW50ZWdlck9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJzdGFydFBhZ2UiLDAsKGU9PiEwKSl9fWNsYXNzIFN1Ym1pdEZvcm1hdCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN1Ym1pdEZvcm1hdCIsWyJodG1sIiwiZGVsZWdhdGUiLCJmZGYiLCJ4bWwiLCJwZGYiXSl9fWNsYXNzIFN1Ym1pdFVybCBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN1Ym1pdFVybCIpfX1jbGFzcyBTdWJzZXRCZWxvdyBleHRlbmRzIGkuSW50ZWdlck9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJzdWJzZXRCZWxvdyIsMTAwLChlPT5lPj0wJiZlPD0xMDApKX19Y2xhc3MgU3VwcHJlc3NCYW5uZXIgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN1cHByZXNzQmFubmVyIil9fWNsYXNzIFRhZ2dlZCBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidGFnZ2VkIil9fWNsYXNzIFRlbXBsYXRlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidGVtcGxhdGUiLCEwKTt0aGlzLmJhc2U9bnVsbDt0aGlzLnJlbGV2YW50PW51bGw7dGhpcy5zdGFydFBhZ2U9bnVsbDt0aGlzLnVyaT1udWxsO3RoaXMueHNsPW51bGx9fWNsYXNzIFRocmVzaG9sZCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRocmVzaG9sZCIsWyJ0cmFjZSIsImVycm9yIiwiaW5mb3JtYXRpb24iLCJ3YXJuaW5nIl0pfX1jbGFzcyBUbyBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRvIixbIm51bGwiLCJtZW1vcnkiLCJzdGRlcnIiLCJzdGRvdXQiLCJzeXN0ZW0iLCJ1cmkiXSl9fWNsYXNzIFRlbXBsYXRlQ2FjaGUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ0ZW1wbGF0ZUNhY2hlIik7dGhpcy5tYXhFbnRyaWVzPSgwLHMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5tYXhFbnRyaWVzLGRlZmF1bHRWYWx1ZTo1LHZhbGlkYXRlOmU9PmU+PTB9KX19Y2xhc3MgVHJhY2UgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ0cmFjZSIsITApO3RoaXMuYXJlYT1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgVHJhbnNmb3JtIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidHJhbnNmb3JtIiwhMCk7dGhpcy5ncm91cFBhcmVudD1udWxsO3RoaXMuaWZFbXB0eT1udWxsO3RoaXMubmFtZUF0dHI9bnVsbDt0aGlzLnBpY3R1cmU9bnVsbDt0aGlzLnByZXNlbmNlPW51bGw7dGhpcy5yZW5hbWU9bnVsbDt0aGlzLndoaXRlc3BhY2U9bnVsbH19Y2xhc3MgVHlwZSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInR5cGUiLFsibm9uZSIsImFzY2lpODUiLCJhc2NpaUhleCIsImNjaXR0ZmF4IiwiZmxhdGUiLCJsenciLCJydW5MZW5ndGgiLCJuYXRpdmUiLCJ4ZHAiLCJtZXJnZWRYRFAiXSl9fWNsYXNzIFVyaSBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInVyaSIpfX1jbGFzcyBWYWxpZGF0ZSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInZhbGlkYXRlIixbInByZVN1Ym1pdCIsInByZVByaW50IiwicHJlRXhlY3V0ZSIsInByZVNhdmUiXSl9fWNsYXNzIFZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIil9W24uJGZpbmFsaXplXSgpe3RoaXNbbi4kY29udGVudF09dGhpc1tuLiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcigoZT0+WyJkb2NSZWFkeSIsInBvc3RTaWduIl0uaW5jbHVkZXMoZSkpKX19Y2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2luZyBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInZhbGlkYXRpb25NZXNzYWdpbmciLFsiYWxsTWVzc2FnZXNJbmRpdmlkdWFsbHkiLCJhbGxNZXNzYWdlc1RvZ2V0aGVyIiwiZmlyc3RNZXNzYWdlT25seSIsIm5vTWVzc2FnZXMiXSl9fWNsYXNzIFZlcnNpb24gZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ2ZXJzaW9uIixbIjEuNyIsIjEuNiIsIjEuNSIsIjEuNCIsIjEuMyIsIjEuMiJdKX19Y2xhc3MgVmVyc2lvbkNvbnRyb2wgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJWZXJzaW9uQ29udHJvbCIpO3RoaXMub3V0cHV0QmVsb3c9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUub3V0cHV0QmVsb3csWyJ3YXJuIiwiZXJyb3IiLCJ1cGRhdGUiXSk7dGhpcy5zb3VyY2VBYm92ZT0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5zb3VyY2VBYm92ZSxbIndhcm4iLCJlcnJvciJdKTt0aGlzLnNvdXJjZUJlbG93PSgwLHMuZ2V0U3RyaW5nT3B0aW9uKShlLnNvdXJjZUJlbG93LFsidXBkYXRlIiwibWFpbnRhaW4iXSl9fWNsYXNzIFZpZXdlclByZWZlcmVuY2VzIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidmlld2VyUHJlZmVyZW5jZXMiLCEwKTt0aGlzLkFEQkVfSlNDb25zb2xlPW51bGw7dGhpcy5BREJFX0pTRGVidWdnZXI9bnVsbDt0aGlzLmFkZFZpZXdlclByZWZlcmVuY2VzPW51bGw7dGhpcy5kdXBsZXhPcHRpb249bnVsbDt0aGlzLmVuZm9yY2U9bnVsbDt0aGlzLm51bWJlck9mQ29waWVzPW51bGw7dGhpcy5wYWdlUmFuZ2U9bnVsbDt0aGlzLnBpY2tUcmF5QnlQREZTaXplPW51bGw7dGhpcy5wcmludFNjYWxpbmc9bnVsbH19Y2xhc3MgV2ViQ2xpZW50IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywid2ViQ2xpZW50IiwhMCk7dGhpcy5uYW1lPWUubmFtZT9lLm5hbWUudHJpbSgpOiIiO3RoaXMuZm9udEluZm89bnVsbDt0aGlzLnhkYz1udWxsfX1jbGFzcyBXaGl0ZXNwYWNlIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywid2hpdGVzcGFjZSIsWyJwcmVzZXJ2ZSIsImx0cmltIiwibm9ybWFsaXplIiwicnRyaW0iLCJ0cmltIl0pfX1jbGFzcyBXaW5kb3cgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywid2luZG93Iil9W24uJGZpbmFsaXplXSgpe2NvbnN0IGU9dGhpc1tuLiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKixccyovLDIpLm1hcCgoZT0+cGFyc2VJbnQoZSwxMCkpKTtpZihlLnNvbWUoKGU9PmlzTmFOKGUpKSkpdGhpc1tuLiRjb250ZW50XT1bMCwwXTtlbHNlezE9PT1lLmxlbmd0aCYmZS5wdXNoKGVbMF0pO3RoaXNbbi4kY29udGVudF09ZX19fWNsYXNzIFhkYyBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInhkYyIsITApO3RoaXMudXJpPW5ldyBpLlhGQU9iamVjdEFycmF5O3RoaXMueHNsPW5ldyBpLlhGQU9iamVjdEFycmF5fX1jbGFzcyBYZHAgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ4ZHAiLCEwKTt0aGlzLnBhY2tldHM9bnVsbH19Y2xhc3MgWHNsIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywieHNsIiwhMCk7dGhpcy5kZWJ1Zz1udWxsO3RoaXMudXJpPW51bGx9fWNsYXNzIFpwbCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInpwbCIsITApO3RoaXMubmFtZT1lLm5hbWU/ZS5uYW1lLnRyaW0oKToiIjt0aGlzLmJhdGNoT3V0cHV0PW51bGw7dGhpcy5mbGlwTGFiZWw9bnVsbDt0aGlzLmZvbnRJbmZvPW51bGw7dGhpcy54ZGM9bnVsbH19Y2xhc3MgQ29uZmlnTmFtZXNwYWNle3N0YXRpY1tyLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZihDb25maWdOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIENvbmZpZ05hbWVzcGFjZVtlXSh0KX1zdGF0aWMgYWNyb2JhdChlKXtyZXR1cm4gbmV3IEFjcm9iYXQoZSl9c3RhdGljIGFjcm9iYXQ3KGUpe3JldHVybiBuZXcgQWNyb2JhdDcoZSl9c3RhdGljIEFEQkVfSlNDb25zb2xlKGUpe3JldHVybiBuZXcgQURCRV9KU0NvbnNvbGUoZSl9c3RhdGljIEFEQkVfSlNEZWJ1Z2dlcihlKXtyZXR1cm4gbmV3IEFEQkVfSlNEZWJ1Z2dlcihlKX1zdGF0aWMgYWRkU2lsZW50UHJpbnQoZSl7cmV0dXJuIG5ldyBBZGRTaWxlbnRQcmludChlKX1zdGF0aWMgYWRkVmlld2VyUHJlZmVyZW5jZXMoZSl7cmV0dXJuIG5ldyBBZGRWaWV3ZXJQcmVmZXJlbmNlcyhlKX1zdGF0aWMgYWRqdXN0RGF0YShlKXtyZXR1cm4gbmV3IEFkanVzdERhdGEoZSl9c3RhdGljIGFkb2JlRXh0ZW5zaW9uTGV2ZWwoZSl7cmV0dXJuIG5ldyBBZG9iZUV4dGVuc2lvbkxldmVsKGUpfXN0YXRpYyBhZ2VudChlKXtyZXR1cm4gbmV3IEFnZW50KGUpfXN0YXRpYyBhbHdheXNFbWJlZChlKXtyZXR1cm4gbmV3IEFsd2F5c0VtYmVkKGUpfXN0YXRpYyBhbWQoZSl7cmV0dXJuIG5ldyBBbWQoZSl9c3RhdGljIGFyZWEoZSl7cmV0dXJuIG5ldyBBcmVhKGUpfXN0YXRpYyBhdHRyaWJ1dGVzKGUpe3JldHVybiBuZXcgQXR0cmlidXRlcyhlKX1zdGF0aWMgYXV0b1NhdmUoZSl7cmV0dXJuIG5ldyBBdXRvU2F2ZShlKX1zdGF0aWMgYmFzZShlKXtyZXR1cm4gbmV3IEJhc2UoZSl9c3RhdGljIGJhdGNoT3V0cHV0KGUpe3JldHVybiBuZXcgQmF0Y2hPdXRwdXQoZSl9c3RhdGljIGJlaGF2aW9yT3ZlcnJpZGUoZSl7cmV0dXJuIG5ldyBCZWhhdmlvck92ZXJyaWRlKGUpfXN0YXRpYyBjYWNoZShlKXtyZXR1cm4gbmV3IENhY2hlKGUpfXN0YXRpYyBjaGFuZ2UoZSl7cmV0dXJuIG5ldyBDaGFuZ2UoZSl9c3RhdGljIGNvbW1vbihlKXtyZXR1cm4gbmV3IENvbW1vbihlKX1zdGF0aWMgY29tcHJlc3MoZSl7cmV0dXJuIG5ldyBDb21wcmVzcyhlKX1zdGF0aWMgY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlKGUpe3JldHVybiBuZXcgQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlKGUpfXN0YXRpYyBjb21wcmVzc09iamVjdFN0cmVhbShlKXtyZXR1cm4gbmV3IENvbXByZXNzT2JqZWN0U3RyZWFtKGUpfXN0YXRpYyBjb21wcmVzc2lvbihlKXtyZXR1cm4gbmV3IENvbXByZXNzaW9uKGUpfXN0YXRpYyBjb25maWcoZSl7cmV0dXJuIG5ldyBDb25maWcoZSl9c3RhdGljIGNvbmZvcm1hbmNlKGUpe3JldHVybiBuZXcgQ29uZm9ybWFuY2UoZSl9c3RhdGljIGNvbnRlbnRDb3B5KGUpe3JldHVybiBuZXcgQ29udGVudENvcHkoZSl9c3RhdGljIGNvcGllcyhlKXtyZXR1cm4gbmV3IENvcGllcyhlKX1zdGF0aWMgY3JlYXRvcihlKXtyZXR1cm4gbmV3IENyZWF0b3IoZSl9c3RhdGljIGN1cnJlbnRQYWdlKGUpe3JldHVybiBuZXcgQ3VycmVudFBhZ2UoZSl9c3RhdGljIGRhdGEoZSl7cmV0dXJuIG5ldyBEYXRhKGUpfXN0YXRpYyBkZWJ1ZyhlKXtyZXR1cm4gbmV3IERlYnVnKGUpfXN0YXRpYyBkZWZhdWx0VHlwZWZhY2UoZSl7cmV0dXJuIG5ldyBEZWZhdWx0VHlwZWZhY2UoZSl9c3RhdGljIGRlc3RpbmF0aW9uKGUpe3JldHVybiBuZXcgRGVzdGluYXRpb24oZSl9c3RhdGljIGRvY3VtZW50QXNzZW1ibHkoZSl7cmV0dXJuIG5ldyBEb2N1bWVudEFzc2VtYmx5KGUpfXN0YXRpYyBkcml2ZXIoZSl7cmV0dXJuIG5ldyBEcml2ZXIoZSl9c3RhdGljIGR1cGxleE9wdGlvbihlKXtyZXR1cm4gbmV3IER1cGxleE9wdGlvbihlKX1zdGF0aWMgZHluYW1pY1JlbmRlcihlKXtyZXR1cm4gbmV3IER5bmFtaWNSZW5kZXIoZSl9c3RhdGljIGVtYmVkKGUpe3JldHVybiBuZXcgRW1iZWQoZSl9c3RhdGljIGVuY3J5cHQoZSl7cmV0dXJuIG5ldyBFbmNyeXB0KGUpfXN0YXRpYyBlbmNyeXB0aW9uKGUpe3JldHVybiBuZXcgRW5jcnlwdGlvbihlKX1zdGF0aWMgZW5jcnlwdGlvbkxldmVsKGUpe3JldHVybiBuZXcgRW5jcnlwdGlvbkxldmVsKGUpfXN0YXRpYyBlbmZvcmNlKGUpe3JldHVybiBuZXcgRW5mb3JjZShlKX1zdGF0aWMgZXF1YXRlKGUpe3JldHVybiBuZXcgRXF1YXRlKGUpfXN0YXRpYyBlcXVhdGVSYW5nZShlKXtyZXR1cm4gbmV3IEVxdWF0ZVJhbmdlKGUpfXN0YXRpYyBleGNsdWRlKGUpe3JldHVybiBuZXcgRXhjbHVkZShlKX1zdGF0aWMgZXhjbHVkZU5TKGUpe3JldHVybiBuZXcgRXhjbHVkZU5TKGUpfXN0YXRpYyBmbGlwTGFiZWwoZSl7cmV0dXJuIG5ldyBGbGlwTGFiZWwoZSl9c3RhdGljIGZvbnRJbmZvKGUpe3JldHVybiBuZXcgRm9udEluZm8oZSl9c3RhdGljIGZvcm1GaWVsZEZpbGxpbmcoZSl7cmV0dXJuIG5ldyBGb3JtRmllbGRGaWxsaW5nKGUpfXN0YXRpYyBncm91cFBhcmVudChlKXtyZXR1cm4gbmV3IEdyb3VwUGFyZW50KGUpfXN0YXRpYyBpZkVtcHR5KGUpe3JldHVybiBuZXcgSWZFbXB0eShlKX1zdGF0aWMgaW5jbHVkZVhEUENvbnRlbnQoZSl7cmV0dXJuIG5ldyBJbmNsdWRlWERQQ29udGVudChlKX1zdGF0aWMgaW5jcmVtZW50YWxMb2FkKGUpe3JldHVybiBuZXcgSW5jcmVtZW50YWxMb2FkKGUpfXN0YXRpYyBpbmNyZW1lbnRhbE1lcmdlKGUpe3JldHVybiBuZXcgSW5jcmVtZW50YWxNZXJnZShlKX1zdGF0aWMgaW50ZXJhY3RpdmUoZSl7cmV0dXJuIG5ldyBJbnRlcmFjdGl2ZShlKX1zdGF0aWMgam9nKGUpe3JldHVybiBuZXcgSm9nKGUpfXN0YXRpYyBsYWJlbFByaW50ZXIoZSl7cmV0dXJuIG5ldyBMYWJlbFByaW50ZXIoZSl9c3RhdGljIGxheW91dChlKXtyZXR1cm4gbmV3IExheW91dChlKX1zdGF0aWMgbGV2ZWwoZSl7cmV0dXJuIG5ldyBMZXZlbChlKX1zdGF0aWMgbGluZWFyaXplZChlKXtyZXR1cm4gbmV3IExpbmVhcml6ZWQoZSl9c3RhdGljIGxvY2FsZShlKXtyZXR1cm4gbmV3IExvY2FsZShlKX1zdGF0aWMgbG9jYWxlU2V0KGUpe3JldHVybiBuZXcgTG9jYWxlU2V0KGUpfXN0YXRpYyBsb2coZSl7cmV0dXJuIG5ldyBMb2coZSl9c3RhdGljIG1hcChlKXtyZXR1cm4gbmV3IE1hcEVsZW1lbnQoZSl9c3RhdGljIG1lZGl1bUluZm8oZSl7cmV0dXJuIG5ldyBNZWRpdW1JbmZvKGUpfXN0YXRpYyBtZXNzYWdlKGUpe3JldHVybiBuZXcgTWVzc2FnZShlKX1zdGF0aWMgbWVzc2FnaW5nKGUpe3JldHVybiBuZXcgTWVzc2FnaW5nKGUpfXN0YXRpYyBtb2RlKGUpe3JldHVybiBuZXcgTW9kZShlKX1zdGF0aWMgbW9kaWZ5QW5ub3RzKGUpe3JldHVybiBuZXcgTW9kaWZ5QW5ub3RzKGUpfXN0YXRpYyBtc2dJZChlKXtyZXR1cm4gbmV3IE1zZ0lkKGUpfXN0YXRpYyBuYW1lQXR0cihlKXtyZXR1cm4gbmV3IE5hbWVBdHRyKGUpfXN0YXRpYyBuZXZlckVtYmVkKGUpe3JldHVybiBuZXcgTmV2ZXJFbWJlZChlKX1zdGF0aWMgbnVtYmVyT2ZDb3BpZXMoZSl7cmV0dXJuIG5ldyBOdW1iZXJPZkNvcGllcyhlKX1zdGF0aWMgb3BlbkFjdGlvbihlKXtyZXR1cm4gbmV3IE9wZW5BY3Rpb24oZSl9c3RhdGljIG91dHB1dChlKXtyZXR1cm4gbmV3IE91dHB1dChlKX1zdGF0aWMgb3V0cHV0QmluKGUpe3JldHVybiBuZXcgT3V0cHV0QmluKGUpfXN0YXRpYyBvdXRwdXRYU0woZSl7cmV0dXJuIG5ldyBPdXRwdXRYU0woZSl9c3RhdGljIG92ZXJwcmludChlKXtyZXR1cm4gbmV3IE92ZXJwcmludChlKX1zdGF0aWMgcGFja2V0cyhlKXtyZXR1cm4gbmV3IFBhY2tldHMoZSl9c3RhdGljIHBhZ2VPZmZzZXQoZSl7cmV0dXJuIG5ldyBQYWdlT2Zmc2V0KGUpfXN0YXRpYyBwYWdlUmFuZ2UoZSl7cmV0dXJuIG5ldyBQYWdlUmFuZ2UoZSl9c3RhdGljIHBhZ2luYXRpb24oZSl7cmV0dXJuIG5ldyBQYWdpbmF0aW9uKGUpfXN0YXRpYyBwYWdpbmF0aW9uT3ZlcnJpZGUoZSl7cmV0dXJuIG5ldyBQYWdpbmF0aW9uT3ZlcnJpZGUoZSl9c3RhdGljIHBhcnQoZSl7cmV0dXJuIG5ldyBQYXJ0KGUpfXN0YXRpYyBwY2woZSl7cmV0dXJuIG5ldyBQY2woZSl9c3RhdGljIHBkZihlKXtyZXR1cm4gbmV3IFBkZihlKX1zdGF0aWMgcGRmYShlKXtyZXR1cm4gbmV3IFBkZmEoZSl9c3RhdGljIHBlcm1pc3Npb25zKGUpe3JldHVybiBuZXcgUGVybWlzc2lvbnMoZSl9c3RhdGljIHBpY2tUcmF5QnlQREZTaXplKGUpe3JldHVybiBuZXcgUGlja1RyYXlCeVBERlNpemUoZSl9c3RhdGljIHBpY3R1cmUoZSl7cmV0dXJuIG5ldyBQaWN0dXJlKGUpfXN0YXRpYyBwbGFpbnRleHRNZXRhZGF0YShlKXtyZXR1cm4gbmV3IFBsYWludGV4dE1ldGFkYXRhKGUpfXN0YXRpYyBwcmVzZW5jZShlKXtyZXR1cm4gbmV3IFByZXNlbmNlKGUpfXN0YXRpYyBwcmVzZW50KGUpe3JldHVybiBuZXcgUHJlc2VudChlKX1zdGF0aWMgcHJpbnQoZSl7cmV0dXJuIG5ldyBQcmludChlKX1zdGF0aWMgcHJpbnRIaWdoUXVhbGl0eShlKXtyZXR1cm4gbmV3IFByaW50SGlnaFF1YWxpdHkoZSl9c3RhdGljIHByaW50U2NhbGluZyhlKXtyZXR1cm4gbmV3IFByaW50U2NhbGluZyhlKX1zdGF0aWMgcHJpbnRlck5hbWUoZSl7cmV0dXJuIG5ldyBQcmludGVyTmFtZShlKX1zdGF0aWMgcHJvZHVjZXIoZSl7cmV0dXJuIG5ldyBQcm9kdWNlcihlKX1zdGF0aWMgcHMoZSl7cmV0dXJuIG5ldyBQcyhlKX1zdGF0aWMgcmFuZ2UoZSl7cmV0dXJuIG5ldyBSYW5nZShlKX1zdGF0aWMgcmVjb3JkKGUpe3JldHVybiBuZXcgUmVjb3JkKGUpfXN0YXRpYyByZWxldmFudChlKXtyZXR1cm4gbmV3IFJlbGV2YW50KGUpfXN0YXRpYyByZW5hbWUoZSl7cmV0dXJuIG5ldyBSZW5hbWUoZSl9c3RhdGljIHJlbmRlclBvbGljeShlKXtyZXR1cm4gbmV3IFJlbmRlclBvbGljeShlKX1zdGF0aWMgcnVuU2NyaXB0cyhlKXtyZXR1cm4gbmV3IFJ1blNjcmlwdHMoZSl9c3RhdGljIHNjcmlwdChlKXtyZXR1cm4gbmV3IFNjcmlwdChlKX1zdGF0aWMgc2NyaXB0TW9kZWwoZSl7cmV0dXJuIG5ldyBTY3JpcHRNb2RlbChlKX1zdGF0aWMgc2V2ZXJpdHkoZSl7cmV0dXJuIG5ldyBTZXZlcml0eShlKX1zdGF0aWMgc2lsZW50UHJpbnQoZSl7cmV0dXJuIG5ldyBTaWxlbnRQcmludChlKX1zdGF0aWMgc3RhcGxlKGUpe3JldHVybiBuZXcgU3RhcGxlKGUpfXN0YXRpYyBzdGFydE5vZGUoZSl7cmV0dXJuIG5ldyBTdGFydE5vZGUoZSl9c3RhdGljIHN0YXJ0UGFnZShlKXtyZXR1cm4gbmV3IFN0YXJ0UGFnZShlKX1zdGF0aWMgc3VibWl0Rm9ybWF0KGUpe3JldHVybiBuZXcgU3VibWl0Rm9ybWF0KGUpfXN0YXRpYyBzdWJtaXRVcmwoZSl7cmV0dXJuIG5ldyBTdWJtaXRVcmwoZSl9c3RhdGljIHN1YnNldEJlbG93KGUpe3JldHVybiBuZXcgU3Vic2V0QmVsb3coZSl9c3RhdGljIHN1cHByZXNzQmFubmVyKGUpe3JldHVybiBuZXcgU3VwcHJlc3NCYW5uZXIoZSl9c3RhdGljIHRhZ2dlZChlKXtyZXR1cm4gbmV3IFRhZ2dlZChlKX1zdGF0aWMgdGVtcGxhdGUoZSl7cmV0dXJuIG5ldyBUZW1wbGF0ZShlKX1zdGF0aWMgdGVtcGxhdGVDYWNoZShlKXtyZXR1cm4gbmV3IFRlbXBsYXRlQ2FjaGUoZSl9c3RhdGljIHRocmVzaG9sZChlKXtyZXR1cm4gbmV3IFRocmVzaG9sZChlKX1zdGF0aWMgdG8oZSl7cmV0dXJuIG5ldyBUbyhlKX1zdGF0aWMgdHJhY2UoZSl7cmV0dXJuIG5ldyBUcmFjZShlKX1zdGF0aWMgdHJhbnNmb3JtKGUpe3JldHVybiBuZXcgVHJhbnNmb3JtKGUpfXN0YXRpYyB0eXBlKGUpe3JldHVybiBuZXcgVHlwZShlKX1zdGF0aWMgdXJpKGUpe3JldHVybiBuZXcgVXJpKGUpfXN0YXRpYyB2YWxpZGF0ZShlKXtyZXR1cm4gbmV3IFZhbGlkYXRlKGUpfXN0YXRpYyB2YWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcyhlKXtyZXR1cm4gbmV3IFZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzKGUpfXN0YXRpYyB2YWxpZGF0aW9uTWVzc2FnaW5nKGUpe3JldHVybiBuZXcgVmFsaWRhdGlvbk1lc3NhZ2luZyhlKX1zdGF0aWMgdmVyc2lvbihlKXtyZXR1cm4gbmV3IFZlcnNpb24oZSl9c3RhdGljIHZlcnNpb25Db250cm9sKGUpe3JldHVybiBuZXcgVmVyc2lvbkNvbnRyb2woZSl9c3RhdGljIHZpZXdlclByZWZlcmVuY2VzKGUpe3JldHVybiBuZXcgVmlld2VyUHJlZmVyZW5jZXMoZSl9c3RhdGljIHdlYkNsaWVudChlKXtyZXR1cm4gbmV3IFdlYkNsaWVudChlKX1zdGF0aWMgd2hpdGVzcGFjZShlKXtyZXR1cm4gbmV3IFdoaXRlc3BhY2UoZSl9c3RhdGljIHdpbmRvdyhlKXtyZXR1cm4gbmV3IFdpbmRvdyhlKX1zdGF0aWMgeGRjKGUpe3JldHVybiBuZXcgWGRjKGUpfXN0YXRpYyB4ZHAoZSl7cmV0dXJuIG5ldyBYZHAoZSl9c3RhdGljIHhzbChlKXtyZXR1cm4gbmV3IFhzbChlKX1zdGF0aWMgenBsKGUpe3JldHVybiBuZXcgWnBsKGUpfX10LkNvbmZpZ05hbWVzcGFjZT1Db25maWdOYW1lc3BhY2V9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuQ29ubmVjdGlvblNldE5hbWVzcGFjZT12b2lkIDA7dmFyIHI9YSgyMzQpLG49YSgyNDApO2NvbnN0IGk9ci5OYW1lc3BhY2VJZHMuY29ubmVjdGlvblNldC5pZDtjbGFzcyBDb25uZWN0aW9uU2V0IGV4dGVuZHMgbi5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoaSwiY29ubmVjdGlvblNldCIsITApO3RoaXMud3NkbENvbm5lY3Rpb249bmV3IG4uWEZBT2JqZWN0QXJyYXk7dGhpcy54bWxDb25uZWN0aW9uPW5ldyBuLlhGQU9iamVjdEFycmF5O3RoaXMueHNkQ29ubmVjdGlvbj1uZXcgbi5YRkFPYmplY3RBcnJheX19Y2xhc3MgRWZmZWN0aXZlSW5wdXRQb2xpY3kgZXh0ZW5kcyBuLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJlZmZlY3RpdmVJbnB1dFBvbGljeSIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBFZmZlY3RpdmVPdXRwdXRQb2xpY3kgZXh0ZW5kcyBuLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJlZmZlY3RpdmVPdXRwdXRQb2xpY3kiKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgT3BlcmF0aW9uIGV4dGVuZHMgbi5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoaSwib3BlcmF0aW9uIik7dGhpcy5pZD1lLmlkfHwiIjt0aGlzLmlucHV0PWUuaW5wdXR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMub3V0cHV0PWUub3V0cHV0fHwiIjt0aGlzLnVzZT1lLnVzZXx8IiI7dGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIFJvb3RFbGVtZW50IGV4dGVuZHMgbi5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoaSwicm9vdEVsZW1lbnQiKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgU29hcEFjdGlvbiBleHRlbmRzIG4uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInNvYXBBY3Rpb24iKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgU29hcEFkZHJlc3MgZXh0ZW5kcyBuLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJzb2FwQWRkcmVzcyIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBVcmkgZXh0ZW5kcyBuLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ1cmkiKTt0aGlzLmlkPWUuaWR8fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMudXNlPWUudXNlfHwiIjt0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgV3NkbEFkZHJlc3MgZXh0ZW5kcyBuLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ3c2RsQWRkcmVzcyIpO3RoaXMuaWQ9ZS5pZHx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy51c2U9ZS51c2V8fCIiO3RoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBXc2RsQ29ubmVjdGlvbiBleHRlbmRzIG4uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksIndzZGxDb25uZWN0aW9uIiwhMCk7dGhpcy5kYXRhRGVzY3JpcHRpb249ZS5kYXRhRGVzY3JpcHRpb258fCIiO3RoaXMubmFtZT1lLm5hbWV8fCIiO3RoaXMuZWZmZWN0aXZlSW5wdXRQb2xpY3k9bnVsbDt0aGlzLmVmZmVjdGl2ZU91dHB1dFBvbGljeT1udWxsO3RoaXMub3BlcmF0aW9uPW51bGw7dGhpcy5zb2FwQWN0aW9uPW51bGw7dGhpcy5zb2FwQWRkcmVzcz1udWxsO3RoaXMud3NkbEFkZHJlc3M9bnVsbH19Y2xhc3MgWG1sQ29ubmVjdGlvbiBleHRlbmRzIG4uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInhtbENvbm5lY3Rpb24iLCEwKTt0aGlzLmRhdGFEZXNjcmlwdGlvbj1lLmRhdGFEZXNjcmlwdGlvbnx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy51cmk9bnVsbH19Y2xhc3MgWHNkQ29ubmVjdGlvbiBleHRlbmRzIG4uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInhzZENvbm5lY3Rpb24iLCEwKTt0aGlzLmRhdGFEZXNjcmlwdGlvbj1lLmRhdGFEZXNjcmlwdGlvbnx8IiI7dGhpcy5uYW1lPWUubmFtZXx8IiI7dGhpcy5yb290RWxlbWVudD1udWxsO3RoaXMudXJpPW51bGx9fWNsYXNzIENvbm5lY3Rpb25TZXROYW1lc3BhY2V7c3RhdGljW3IuJGJ1aWxkWEZBT2JqZWN0XShlLHQpe2lmKENvbm5lY3Rpb25TZXROYW1lc3BhY2UuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIENvbm5lY3Rpb25TZXROYW1lc3BhY2VbZV0odCl9c3RhdGljIGNvbm5lY3Rpb25TZXQoZSl7cmV0dXJuIG5ldyBDb25uZWN0aW9uU2V0KGUpfXN0YXRpYyBlZmZlY3RpdmVJbnB1dFBvbGljeShlKXtyZXR1cm4gbmV3IEVmZmVjdGl2ZUlucHV0UG9saWN5KGUpfXN0YXRpYyBlZmZlY3RpdmVPdXRwdXRQb2xpY3koZSl7cmV0dXJuIG5ldyBFZmZlY3RpdmVPdXRwdXRQb2xpY3koZSl9c3RhdGljIG9wZXJhdGlvbihlKXtyZXR1cm4gbmV3IE9wZXJhdGlvbihlKX1zdGF0aWMgcm9vdEVsZW1lbnQoZSl7cmV0dXJuIG5ldyBSb290RWxlbWVudChlKX1zdGF0aWMgc29hcEFjdGlvbihlKXtyZXR1cm4gbmV3IFNvYXBBY3Rpb24oZSl9c3RhdGljIHNvYXBBZGRyZXNzKGUpe3JldHVybiBuZXcgU29hcEFkZHJlc3MoZSl9c3RhdGljIHVyaShlKXtyZXR1cm4gbmV3IFVyaShlKX1zdGF0aWMgd3NkbEFkZHJlc3MoZSl7cmV0dXJuIG5ldyBXc2RsQWRkcmVzcyhlKX1zdGF0aWMgd3NkbENvbm5lY3Rpb24oZSl7cmV0dXJuIG5ldyBXc2RsQ29ubmVjdGlvbihlKX1zdGF0aWMgeG1sQ29ubmVjdGlvbihlKXtyZXR1cm4gbmV3IFhtbENvbm5lY3Rpb24oZSl9c3RhdGljIHhzZENvbm5lY3Rpb24oZSl7cmV0dXJuIG5ldyBYc2RDb25uZWN0aW9uKGUpfX10LkNvbm5lY3Rpb25TZXROYW1lc3BhY2U9Q29ubmVjdGlvblNldE5hbWVzcGFjZX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5EYXRhc2V0c05hbWVzcGFjZT12b2lkIDA7dmFyIHI9YSgyMjgpLG49YSgyMzQpLGk9YSgyNDApO2NvbnN0IHM9bi5OYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQ7Y2xhc3MgRGF0YSBleHRlbmRzIGkuWG1sT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsImRhdGEiLGUpfVtyLiRpc05zQWdub3N0aWNdKCl7cmV0dXJuITB9fWNsYXNzIERhdGFzZXRzIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF0YXNldHMiLCEwKTt0aGlzLmRhdGE9bnVsbDt0aGlzLlNpZ25hdHVyZT1udWxsfVtyLiRvbkNoaWxkXShlKXtjb25zdCB0PWVbci4kbm9kZU5hbWVdOygiZGF0YSI9PT10JiZlW3IuJG5hbWVzcGFjZUlkXT09PXN8fCJTaWduYXR1cmUiPT09dCYmZVtyLiRuYW1lc3BhY2VJZF09PT1uLk5hbWVzcGFjZUlkcy5zaWduYXR1cmUuaWQpJiYodGhpc1t0XT1lKTt0aGlzW3IuJGFwcGVuZENoaWxkXShlKX19Y2xhc3MgRGF0YXNldHNOYW1lc3BhY2V7c3RhdGljW24uJGJ1aWxkWEZBT2JqZWN0XShlLHQpe2lmKERhdGFzZXRzTmFtZXNwYWNlLmhhc093blByb3BlcnR5KGUpKXJldHVybiBEYXRhc2V0c05hbWVzcGFjZVtlXSh0KX1zdGF0aWMgZGF0YXNldHMoZSl7cmV0dXJuIG5ldyBEYXRhc2V0cyhlKX1zdGF0aWMgZGF0YShlKXtyZXR1cm4gbmV3IERhdGEoZSl9fXQuRGF0YXNldHNOYW1lc3BhY2U9RGF0YXNldHNOYW1lc3BhY2V9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuTG9jYWxlU2V0TmFtZXNwYWNlPXZvaWQgMDt2YXIgcj1hKDIzNCksbj1hKDI0MCksaT1hKDIzNyk7Y29uc3Qgcz1yLk5hbWVzcGFjZUlkcy5sb2NhbGVTZXQuaWQ7Y2xhc3MgQ2FsZW5kYXJTeW1ib2xzIGV4dGVuZHMgbi5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiY2FsZW5kYXJTeW1ib2xzIiwhMCk7dGhpcy5uYW1lPSJncmVnb3JpYW4iO3RoaXMuZGF5TmFtZXM9bmV3IG4uWEZBT2JqZWN0QXJyYXkoMik7dGhpcy5lcmFOYW1lcz1udWxsO3RoaXMubWVyaWRpZW1OYW1lcz1udWxsO3RoaXMubW9udGhOYW1lcz1uZXcgbi5YRkFPYmplY3RBcnJheSgyKX19Y2xhc3MgQ3VycmVuY3lTeW1ib2wgZXh0ZW5kcyBuLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJjdXJyZW5jeVN5bWJvbCIpO3RoaXMubmFtZT0oMCxpLmdldFN0cmluZ09wdGlvbikoZS5uYW1lLFsic3ltYm9sIiwiaXNvbmFtZSIsImRlY2ltYWwiXSl9fWNsYXNzIEN1cnJlbmN5U3ltYm9scyBleHRlbmRzIG4uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsImN1cnJlbmN5U3ltYm9scyIsITApO3RoaXMuY3VycmVuY3lTeW1ib2w9bmV3IG4uWEZBT2JqZWN0QXJyYXkoMyl9fWNsYXNzIERhdGVQYXR0ZXJuIGV4dGVuZHMgbi5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF0ZVBhdHRlcm4iKTt0aGlzLm5hbWU9KDAsaS5nZXRTdHJpbmdPcHRpb24pKGUubmFtZSxbImZ1bGwiLCJsb25nIiwibWVkIiwic2hvcnQiXSl9fWNsYXNzIERhdGVQYXR0ZXJucyBleHRlbmRzIG4uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsImRhdGVQYXR0ZXJucyIsITApO3RoaXMuZGF0ZVBhdHRlcm49bmV3IG4uWEZBT2JqZWN0QXJyYXkoNCl9fWNsYXNzIERhdGVUaW1lU3ltYm9scyBleHRlbmRzIG4uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJkYXRlVGltZVN5bWJvbHMiKX19Y2xhc3MgRGF5IGV4dGVuZHMgbi5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF5Iil9fWNsYXNzIERheU5hbWVzIGV4dGVuZHMgbi5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF5TmFtZXMiLCEwKTt0aGlzLmFiYnI9KDAsaS5nZXRJbnRlZ2VyKSh7ZGF0YTplLmFiYnIsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KTt0aGlzLmRheT1uZXcgbi5YRkFPYmplY3RBcnJheSg3KX19Y2xhc3MgRXJhIGV4dGVuZHMgbi5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZXJhIil9fWNsYXNzIEVyYU5hbWVzIGV4dGVuZHMgbi5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZXJhTmFtZXMiLCEwKTt0aGlzLmVyYT1uZXcgbi5YRkFPYmplY3RBcnJheSgyKX19Y2xhc3MgTG9jYWxlIGV4dGVuZHMgbi5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywibG9jYWxlIiwhMCk7dGhpcy5kZXNjPWUuZGVzY3x8IiI7dGhpcy5uYW1lPSJpc29uYW1lIjt0aGlzLmNhbGVuZGFyU3ltYm9scz1udWxsO3RoaXMuY3VycmVuY3lTeW1ib2xzPW51bGw7dGhpcy5kYXRlUGF0dGVybnM9bnVsbDt0aGlzLmRhdGVUaW1lU3ltYm9scz1udWxsO3RoaXMubnVtYmVyUGF0dGVybnM9bnVsbDt0aGlzLm51bWJlclN5bWJvbHM9bnVsbDt0aGlzLnRpbWVQYXR0ZXJucz1udWxsO3RoaXMudHlwZUZhY2VzPW51bGx9fWNsYXNzIExvY2FsZVNldCBleHRlbmRzIG4uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsImxvY2FsZVNldCIsITApO3RoaXMubG9jYWxlPW5ldyBuLlhGQU9iamVjdEFycmF5fX1jbGFzcyBNZXJpZGllbSBleHRlbmRzIG4uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsIm1lcmlkaWVtIil9fWNsYXNzIE1lcmlkaWVtTmFtZXMgZXh0ZW5kcyBuLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJtZXJpZGllbU5hbWVzIiwhMCk7dGhpcy5tZXJpZGllbT1uZXcgbi5YRkFPYmplY3RBcnJheSgyKX19Y2xhc3MgTW9udGggZXh0ZW5kcyBuLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJtb250aCIpfX1jbGFzcyBNb250aE5hbWVzIGV4dGVuZHMgbi5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywibW9udGhOYW1lcyIsITApO3RoaXMuYWJicj0oMCxpLmdldEludGVnZXIpKHtkYXRhOmUuYWJicixkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pO3RoaXMubW9udGg9bmV3IG4uWEZBT2JqZWN0QXJyYXkoMTIpfX1jbGFzcyBOdW1iZXJQYXR0ZXJuIGV4dGVuZHMgbi5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywibnVtYmVyUGF0dGVybiIpO3RoaXMubmFtZT0oMCxpLmdldFN0cmluZ09wdGlvbikoZS5uYW1lLFsiZnVsbCIsImxvbmciLCJtZWQiLCJzaG9ydCJdKX19Y2xhc3MgTnVtYmVyUGF0dGVybnMgZXh0ZW5kcyBuLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJudW1iZXJQYXR0ZXJucyIsITApO3RoaXMubnVtYmVyUGF0dGVybj1uZXcgbi5YRkFPYmplY3RBcnJheSg0KX19Y2xhc3MgTnVtYmVyU3ltYm9sIGV4dGVuZHMgbi5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywibnVtYmVyU3ltYm9sIik7dGhpcy5uYW1lPSgwLGkuZ2V0U3RyaW5nT3B0aW9uKShlLm5hbWUsWyJkZWNpbWFsIiwiZ3JvdXBpbmciLCJwZXJjZW50IiwibWludXMiLCJ6ZXJvIl0pfX1jbGFzcyBOdW1iZXJTeW1ib2xzIGV4dGVuZHMgbi5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywibnVtYmVyU3ltYm9scyIsITApO3RoaXMubnVtYmVyU3ltYm9sPW5ldyBuLlhGQU9iamVjdEFycmF5KDUpfX1jbGFzcyBUaW1lUGF0dGVybiBleHRlbmRzIG4uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsInRpbWVQYXR0ZXJuIik7dGhpcy5uYW1lPSgwLGkuZ2V0U3RyaW5nT3B0aW9uKShlLm5hbWUsWyJmdWxsIiwibG9uZyIsIm1lZCIsInNob3J0Il0pfX1jbGFzcyBUaW1lUGF0dGVybnMgZXh0ZW5kcyBuLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJ0aW1lUGF0dGVybnMiLCEwKTt0aGlzLnRpbWVQYXR0ZXJuPW5ldyBuLlhGQU9iamVjdEFycmF5KDQpfX1jbGFzcyBUeXBlRmFjZSBleHRlbmRzIG4uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsInR5cGVGYWNlIiwhMCk7dGhpcy5uYW1lPSIifGUubmFtZX19Y2xhc3MgVHlwZUZhY2VzIGV4dGVuZHMgbi5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywidHlwZUZhY2VzIiwhMCk7dGhpcy50eXBlRmFjZT1uZXcgbi5YRkFPYmplY3RBcnJheX19Y2xhc3MgTG9jYWxlU2V0TmFtZXNwYWNle3N0YXRpY1tyLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZihMb2NhbGVTZXROYW1lc3BhY2UuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIExvY2FsZVNldE5hbWVzcGFjZVtlXSh0KX1zdGF0aWMgY2FsZW5kYXJTeW1ib2xzKGUpe3JldHVybiBuZXcgQ2FsZW5kYXJTeW1ib2xzKGUpfXN0YXRpYyBjdXJyZW5jeVN5bWJvbChlKXtyZXR1cm4gbmV3IEN1cnJlbmN5U3ltYm9sKGUpfXN0YXRpYyBjdXJyZW5jeVN5bWJvbHMoZSl7cmV0dXJuIG5ldyBDdXJyZW5jeVN5bWJvbHMoZSl9c3RhdGljIGRhdGVQYXR0ZXJuKGUpe3JldHVybiBuZXcgRGF0ZVBhdHRlcm4oZSl9c3RhdGljIGRhdGVQYXR0ZXJucyhlKXtyZXR1cm4gbmV3IERhdGVQYXR0ZXJucyhlKX1zdGF0aWMgZGF0ZVRpbWVTeW1ib2xzKGUpe3JldHVybiBuZXcgRGF0ZVRpbWVTeW1ib2xzKGUpfXN0YXRpYyBkYXkoZSl7cmV0dXJuIG5ldyBEYXkoZSl9c3RhdGljIGRheU5hbWVzKGUpe3JldHVybiBuZXcgRGF5TmFtZXMoZSl9c3RhdGljIGVyYShlKXtyZXR1cm4gbmV3IEVyYShlKX1zdGF0aWMgZXJhTmFtZXMoZSl7cmV0dXJuIG5ldyBFcmFOYW1lcyhlKX1zdGF0aWMgbG9jYWxlKGUpe3JldHVybiBuZXcgTG9jYWxlKGUpfXN0YXRpYyBsb2NhbGVTZXQoZSl7cmV0dXJuIG5ldyBMb2NhbGVTZXQoZSl9c3RhdGljIG1lcmlkaWVtKGUpe3JldHVybiBuZXcgTWVyaWRpZW0oZSl9c3RhdGljIG1lcmlkaWVtTmFtZXMoZSl7cmV0dXJuIG5ldyBNZXJpZGllbU5hbWVzKGUpfXN0YXRpYyBtb250aChlKXtyZXR1cm4gbmV3IE1vbnRoKGUpfXN0YXRpYyBtb250aE5hbWVzKGUpe3JldHVybiBuZXcgTW9udGhOYW1lcyhlKX1zdGF0aWMgbnVtYmVyUGF0dGVybihlKXtyZXR1cm4gbmV3IE51bWJlclBhdHRlcm4oZSl9c3RhdGljIG51bWJlclBhdHRlcm5zKGUpe3JldHVybiBuZXcgTnVtYmVyUGF0dGVybnMoZSl9c3RhdGljIG51bWJlclN5bWJvbChlKXtyZXR1cm4gbmV3IE51bWJlclN5bWJvbChlKX1zdGF0aWMgbnVtYmVyU3ltYm9scyhlKXtyZXR1cm4gbmV3IE51bWJlclN5bWJvbHMoZSl9c3RhdGljIHRpbWVQYXR0ZXJuKGUpe3JldHVybiBuZXcgVGltZVBhdHRlcm4oZSl9c3RhdGljIHRpbWVQYXR0ZXJucyhlKXtyZXR1cm4gbmV3IFRpbWVQYXR0ZXJucyhlKX1zdGF0aWMgdHlwZUZhY2UoZSl7cmV0dXJuIG5ldyBUeXBlRmFjZShlKX1zdGF0aWMgdHlwZUZhY2VzKGUpe3JldHVybiBuZXcgVHlwZUZhY2VzKGUpfX10LkxvY2FsZVNldE5hbWVzcGFjZT1Mb2NhbGVTZXROYW1lc3BhY2V9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuU2lnbmF0dXJlTmFtZXNwYWNlPXZvaWQgMDt2YXIgcj1hKDIzNCksbj1hKDI0MCk7Y29uc3QgaT1yLk5hbWVzcGFjZUlkcy5zaWduYXR1cmUuaWQ7Y2xhc3MgU2lnbmF0dXJlIGV4dGVuZHMgbi5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoaSwic2lnbmF0dXJlIiwhMCl9fWNsYXNzIFNpZ25hdHVyZU5hbWVzcGFjZXtzdGF0aWNbci4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoU2lnbmF0dXJlTmFtZXNwYWNlLmhhc093blByb3BlcnR5KGUpKXJldHVybiBTaWduYXR1cmVOYW1lc3BhY2VbZV0odCl9c3RhdGljIHNpZ25hdHVyZShlKXtyZXR1cm4gbmV3IFNpZ25hdHVyZShlKX19dC5TaWduYXR1cmVOYW1lc3BhY2U9U2lnbmF0dXJlTmFtZXNwYWNlfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlN0eWxlc2hlZXROYW1lc3BhY2U9dm9pZCAwO3ZhciByPWEoMjM0KSxuPWEoMjQwKTtjb25zdCBpPXIuTmFtZXNwYWNlSWRzLnN0eWxlc2hlZXQuaWQ7Y2xhc3MgU3R5bGVzaGVldCBleHRlbmRzIG4uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInN0eWxlc2hlZXQiLCEwKX19Y2xhc3MgU3R5bGVzaGVldE5hbWVzcGFjZXtzdGF0aWNbci4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoU3R5bGVzaGVldE5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gU3R5bGVzaGVldE5hbWVzcGFjZVtlXSh0KX1zdGF0aWMgc3R5bGVzaGVldChlKXtyZXR1cm4gbmV3IFN0eWxlc2hlZXQoZSl9fXQuU3R5bGVzaGVldE5hbWVzcGFjZT1TdHlsZXNoZWV0TmFtZXNwYWNlfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlhkcE5hbWVzcGFjZT12b2lkIDA7dmFyIHI9YSgyMzQpLG49YSgyMjgpLGk9YSgyNDApO2NvbnN0IHM9ci5OYW1lc3BhY2VJZHMueGRwLmlkO2NsYXNzIFhkcCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsInhkcCIsITApO3RoaXMudXVpZD1lLnV1aWR8fCIiO3RoaXMudGltZVN0YW1wPWUudGltZVN0YW1wfHwiIjt0aGlzLmNvbmZpZz1udWxsO3RoaXMuY29ubmVjdGlvblNldD1udWxsO3RoaXMuZGF0YXNldHM9bnVsbDt0aGlzLmxvY2FsZVNldD1udWxsO3RoaXMuc3R5bGVzaGVldD1uZXcgaS5YRkFPYmplY3RBcnJheTt0aGlzLnRlbXBsYXRlPW51bGx9W24uJG9uQ2hpbGRDaGVja10oZSl7Y29uc3QgdD1yLk5hbWVzcGFjZUlkc1tlW24uJG5vZGVOYW1lXV07cmV0dXJuIHQmJmVbbi4kbmFtZXNwYWNlSWRdPT09dC5pZH19Y2xhc3MgWGRwTmFtZXNwYWNle3N0YXRpY1tyLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZihYZHBOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIFhkcE5hbWVzcGFjZVtlXSh0KX1zdGF0aWMgeGRwKGUpe3JldHVybiBuZXcgWGRwKGUpfX10LlhkcE5hbWVzcGFjZT1YZHBOYW1lc3BhY2V9LChlLHQsYSk9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3QuWGh0bWxOYW1lc3BhY2U9dm9pZCAwO2EoMTE2KTthKDEyNik7YSgxMjgpO2EoMTMxKTthKDEzMyk7YSgxMzUpO2EoMTM3KTt2YXIgcj1hKDIyOCksbj1hKDIzNCksaT1hKDIzNikscz1hKDIzNyksbz1hKDI0MCk7Y29uc3QgYz1uLk5hbWVzcGFjZUlkcy54aHRtbC5pZCxsPVN5bWJvbCgpLGg9bmV3IFNldChbImNvbG9yIiwiZm9udCIsImZvbnQtZmFtaWx5IiwiZm9udC1zaXplIiwiZm9udC1zdHJldGNoIiwiZm9udC1zdHlsZSIsImZvbnQtd2VpZ2h0IiwibWFyZ2luIiwibWFyZ2luLWJvdHRvbSIsIm1hcmdpbi1sZWZ0IiwibWFyZ2luLXJpZ2h0IiwibWFyZ2luLXRvcCIsImxldHRlci1zcGFjaW5nIiwibGluZS1oZWlnaHQiLCJvcnBoYW5zIiwicGFnZS1icmVhay1hZnRlciIsInBhZ2UtYnJlYWstYmVmb3JlIiwicGFnZS1icmVhay1pbnNpZGUiLCJ0YWItaW50ZXJ2YWwiLCJ0YWItc3RvcCIsInRleHQtYWxpZ24iLCJ0ZXh0LWRlY29yYXRpb24iLCJ0ZXh0LWluZGVudCIsInZlcnRpY2FsLWFsaWduIiwid2lkb3dzIiwia2VybmluZy1tb2RlIiwieGZhLWZvbnQtaG9yaXpvbnRhbC1zY2FsZSIsInhmYS1mb250LXZlcnRpY2FsLXNjYWxlIiwieGZhLXNwYWNlcnVuIiwieGZhLXRhYi1zdG9wcyJdKSx1PW5ldyBNYXAoW1sicGFnZS1icmVhay1hZnRlciIsImJyZWFrQWZ0ZXIiXSxbInBhZ2UtYnJlYWstYmVmb3JlIiwiYnJlYWtCZWZvcmUiXSxbInBhZ2UtYnJlYWstaW5zaWRlIiwiYnJlYWtJbnNpZGUiXSxbImtlcm5pbmctbW9kZSIsZT0+Im5vbmUiPT09ZT8ibm9uZSI6Im5vcm1hbCJdLFsieGZhLWZvbnQtaG9yaXpvbnRhbC1zY2FsZSIsZT0+YHNjYWxlWCgke01hdGgubWF4KDAsTWF0aC5taW4ocGFyc2VJbnQoZSkvMTAwKSkudG9GaXhlZCgyKX0pYF0sWyJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIsZT0+YHNjYWxlWSgke01hdGgubWF4KDAsTWF0aC5taW4ocGFyc2VJbnQoZSkvMTAwKSkudG9GaXhlZCgyKX0pYF0sWyJ4ZmEtc3BhY2VydW4iLCIiXSxbInhmYS10YWItc3RvcHMiLCIiXSxbImZvbnQtc2l6ZSIsKGUsdCk9PntlPXQuZm9udFNpemU9KDAscy5nZXRNZWFzdXJlbWVudCkoZSk7cmV0dXJuKDAsaS5tZWFzdXJlVG9TdHJpbmcpKC45OSplKX1dLFsibGV0dGVyLXNwYWNpbmciLGU9PigwLGkubWVhc3VyZVRvU3RyaW5nKSgoMCxzLmdldE1lYXN1cmVtZW50KShlKSldLFsibGluZS1oZWlnaHQiLGU9PigwLGkubWVhc3VyZVRvU3RyaW5nKSgoMCxzLmdldE1lYXN1cmVtZW50KShlKSldLFsibWFyZ2luIixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbIm1hcmdpbi1ib3R0b20iLGU9PigwLGkubWVhc3VyZVRvU3RyaW5nKSgoMCxzLmdldE1lYXN1cmVtZW50KShlKSldLFsibWFyZ2luLWxlZnQiLGU9PigwLGkubWVhc3VyZVRvU3RyaW5nKSgoMCxzLmdldE1lYXN1cmVtZW50KShlKSldLFsibWFyZ2luLXJpZ2h0IixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbIm1hcmdpbi10b3AiLGU9PigwLGkubWVhc3VyZVRvU3RyaW5nKSgoMCxzLmdldE1lYXN1cmVtZW50KShlKSldLFsidGV4dC1pbmRlbnQiLGU9PigwLGkubWVhc3VyZVRvU3RyaW5nKSgoMCxzLmdldE1lYXN1cmVtZW50KShlKSldLFsiZm9udC1mYW1pbHkiLGU9PmVdLFsidmVydGljYWwtYWxpZ24iLGU9PigwLGkubWVhc3VyZVRvU3RyaW5nKSgoMCxzLmdldE1lYXN1cmVtZW50KShlKSldXSksZD0vXHMrL2csZj0vW1xyXG5dKy9nLGc9L1xyXG4/L2c7ZnVuY3Rpb24gbWFwU3R5bGUoZSx0LGEpe2NvbnN0IG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gbjtjb25zdCBvPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0W3QsYV1vZiBlLnNwbGl0KCI7IikubWFwKChlPT5lLnNwbGl0KCI6IiwyKSkpKXtjb25zdCBlPXUuZ2V0KHQpO2lmKCIiPT09ZSljb250aW51ZTtsZXQgcj1hO2UmJihyPSJzdHJpbmciPT10eXBlb2YgZT9lOmUoYSxvKSk7dC5lbmRzV2l0aCgic2NhbGUiKT9uLnRyYW5zZm9ybT1uLnRyYW5zZm9ybT9gJHtuW3RdfSAke3J9YDpyOm5bdC5yZXBsYWNlQWxsKC8tKFthLXpBLVpdKS9nLCgoZSx0KT0+dC50b1VwcGVyQ2FzZSgpKSldPXJ9bi5mb250RmFtaWx5JiYoMCxpLnNldEZvbnRGYW1pbHkpKHt0eXBlZmFjZTpuLmZvbnRGYW1pbHksd2VpZ2h0Om4uZm9udFdlaWdodHx8Im5vcm1hbCIscG9zdHVyZTpuLmZvbnRTdHlsZXx8Im5vcm1hbCIsc2l6ZTpvLmZvbnRTaXplfHwwfSx0LHRbci4kZ2xvYmFsRGF0YV0uZm9udEZpbmRlcixuKTtpZihhJiZuLnZlcnRpY2FsQWxpZ24mJiIwcHgiIT09bi52ZXJ0aWNhbEFsaWduJiZuLmZvbnRTaXplKXtjb25zdCBlPS41ODMsdD0uMzMzLGE9KDAscy5nZXRNZWFzdXJlbWVudCkobi5mb250U2l6ZSk7bi5mb250U2l6ZT0oMCxpLm1lYXN1cmVUb1N0cmluZykoYSplKTtuLnZlcnRpY2FsQWxpZ249KDAsaS5tZWFzdXJlVG9TdHJpbmcpKE1hdGguc2lnbigoMCxzLmdldE1lYXN1cmVtZW50KShuLnZlcnRpY2FsQWxpZ24pKSphKnQpfWEmJm4uZm9udFNpemUmJihuLmZvbnRTaXplPWBjYWxjKCR7bi5mb250U2l6ZX0gKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWApOygwLGkuZml4VGV4dEluZGVudCkobik7cmV0dXJuIG59Y29uc3QgcD1uZXcgU2V0KFsiYm9keSIsImh0bWwiXSk7Y2xhc3MgWGh0bWxPYmplY3QgZXh0ZW5kcyBvLlhtbE9iamVjdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGMsdCk7dGhpc1tsXT0hMTt0aGlzLnN0eWxlPWUuc3R5bGV8fCIifVtyLiRjbGVhbl0oZSl7c3VwZXJbci4kY2xlYW5dKGUpO3RoaXMuc3R5bGU9ZnVuY3Rpb24gY2hlY2tTdHlsZShlKXtyZXR1cm4gZS5zdHlsZT9lLnN0eWxlLnRyaW0oKS5zcGxpdCgvXHMqO1xzKi8pLmZpbHRlcigoZT0+ISFlKSkubWFwKChlPT5lLnNwbGl0KC9ccyo6XHMqLywyKSkpLmZpbHRlcigodD0+e2xldFthLG5dPXQ7ImZvbnQtZmFtaWx5Ij09PWEmJmVbci4kZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcy5hZGQobik7cmV0dXJuIGguaGFzKGEpfSkpLm1hcCgoZT0+ZS5qb2luKCI6IikpKS5qb2luKCI7Iik6IiJ9KHRoaXMpfVtyLiRhY2NlcHRXaGl0ZXNwYWNlXSgpe3JldHVybiFwLmhhcyh0aGlzW3IuJG5vZGVOYW1lXSl9W3IuJG9uVGV4dF0oZSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSl0aGlzW2xdPSEwO2Vsc2V7ZT1lLnJlcGxhY2VBbGwoZiwiIik7dGhpcy5zdHlsZS5pbmNsdWRlcygieGZhLXNwYWNlcnVuOnllcyIpfHwoZT1lLnJlcGxhY2VBbGwoZCwiICIpKX1lJiYodGhpc1tyLiRjb250ZW50XSs9ZSl9W3IuJHB1c2hHbHlwaHNdKGUpe2xldCB0PSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07Y29uc3QgYT1PYmplY3QuY3JlYXRlKG51bGwpLG49e3RvcDpOYU4sYm90dG9tOk5hTixsZWZ0Ok5hTixyaWdodDpOYU59O2xldCBpPW51bGw7Zm9yKGNvbnN0W2UsdF1vZiB0aGlzLnN0eWxlLnNwbGl0KCI7IikubWFwKChlPT5lLnNwbGl0KCI6IiwyKSkpKXN3aXRjaChlKXtjYXNlImZvbnQtZmFtaWx5IjphLnR5cGVmYWNlPSgwLHMuc3RyaXBRdW90ZXMpKHQpO2JyZWFrO2Nhc2UiZm9udC1zaXplIjphLnNpemU9KDAscy5nZXRNZWFzdXJlbWVudCkodCk7YnJlYWs7Y2FzZSJmb250LXdlaWdodCI6YS53ZWlnaHQ9dDticmVhaztjYXNlImZvbnQtc3R5bGUiOmEucG9zdHVyZT10O2JyZWFrO2Nhc2UibGV0dGVyLXNwYWNpbmciOmEubGV0dGVyU3BhY2luZz0oMCxzLmdldE1lYXN1cmVtZW50KSh0KTticmVhaztjYXNlIm1hcmdpbiI6Y29uc3QgZT10LnNwbGl0KC8gXHQvKS5tYXAoKGU9PigwLHMuZ2V0TWVhc3VyZW1lbnQpKGUpKSk7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDE6bi50b3A9bi5ib3R0b209bi5sZWZ0PW4ucmlnaHQ9ZVswXTticmVhaztjYXNlIDI6bi50b3A9bi5ib3R0b209ZVswXTtuLmxlZnQ9bi5yaWdodD1lWzFdO2JyZWFrO2Nhc2UgMzpuLnRvcD1lWzBdO24uYm90dG9tPWVbMl07bi5sZWZ0PW4ucmlnaHQ9ZVsxXTticmVhaztjYXNlIDQ6bi50b3A9ZVswXTtuLmxlZnQ9ZVsxXTtuLmJvdHRvbT1lWzJdO24ucmlnaHQ9ZVszXX1icmVhaztjYXNlIm1hcmdpbi10b3AiOm4udG9wPSgwLHMuZ2V0TWVhc3VyZW1lbnQpKHQpO2JyZWFrO2Nhc2UibWFyZ2luLWJvdHRvbSI6bi5ib3R0b209KDAscy5nZXRNZWFzdXJlbWVudCkodCk7YnJlYWs7Y2FzZSJtYXJnaW4tbGVmdCI6bi5sZWZ0PSgwLHMuZ2V0TWVhc3VyZW1lbnQpKHQpO2JyZWFrO2Nhc2UibWFyZ2luLXJpZ2h0IjpuLnJpZ2h0PSgwLHMuZ2V0TWVhc3VyZW1lbnQpKHQpO2JyZWFrO2Nhc2UibGluZS1oZWlnaHQiOmk9KDAscy5nZXRNZWFzdXJlbWVudCkodCl9ZS5wdXNoRGF0YShhLG4saSk7aWYodGhpc1tyLiRjb250ZW50XSllLmFkZFN0cmluZyh0aGlzW3IuJGNvbnRlbnRdKTtlbHNlIGZvcihjb25zdCB0IG9mIHRoaXNbci4kZ2V0Q2hpbGRyZW5dKCkpIiN0ZXh0IiE9PXRbci4kbm9kZU5hbWVdP3Rbci4kcHVzaEdseXBoc10oZSk6ZS5hZGRTdHJpbmcodFtyLiRjb250ZW50XSk7dCYmZS5wb3BGb250KCl9W3IuJHRvSFRNTF0oZSl7Y29uc3QgdD1bXTt0aGlzW3IuJGV4dHJhXT17Y2hpbGRyZW46dH07dGhpc1tyLiRjaGlsZHJlblRvSFRNTF0oe30pO2lmKDA9PT10Lmxlbmd0aCYmIXRoaXNbci4kY29udGVudF0pcmV0dXJuIHMuSFRNTFJlc3VsdC5FTVBUWTtsZXQgYTthPXRoaXNbbF0/dGhpc1tyLiRjb250ZW50XT90aGlzW3IuJGNvbnRlbnRdLnJlcGxhY2VBbGwoZywiXG4iKTp2b2lkIDA6dGhpc1tyLiRjb250ZW50XXx8dm9pZCAwO3JldHVybiBzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZTp0aGlzW3IuJG5vZGVOYW1lXSxhdHRyaWJ1dGVzOntocmVmOnRoaXMuaHJlZixzdHlsZTptYXBTdHlsZSh0aGlzLnN0eWxlLHRoaXMsdGhpc1tsXSl9LGNoaWxkcmVuOnQsdmFsdWU6YX0pfX1jbGFzcyBBIGV4dGVuZHMgWGh0bWxPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiYSIpO3RoaXMuaHJlZj0oMCxpLmZpeFVSTCkoZS5ocmVmKXx8IiJ9fWNsYXNzIEIgZXh0ZW5kcyBYaHRtbE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJiIil9W3IuJHB1c2hHbHlwaHNdKGUpe2UucHVzaEZvbnQoe3dlaWdodDoiYm9sZCJ9KTtzdXBlcltyLiRwdXNoR2x5cGhzXShlKTtlLnBvcEZvbnQoKX19Y2xhc3MgQm9keSBleHRlbmRzIFhodG1sT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsImJvZHkiKX1bci4kdG9IVE1MXShlKXtjb25zdCB0PXN1cGVyW3IuJHRvSFRNTF0oZSkse2h0bWw6YX09dDtpZighYSlyZXR1cm4gcy5IVE1MUmVzdWx0LkVNUFRZO2EubmFtZT0iZGl2IjthLmF0dHJpYnV0ZXMuY2xhc3M9WyJ4ZmFSaWNoIl07cmV0dXJuIHR9fWNsYXNzIEJyIGV4dGVuZHMgWGh0bWxPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiYnIiKX1bci4kdGV4dF0oKXtyZXR1cm4iXG4ifVtyLiRwdXNoR2x5cGhzXShlKXtlLmFkZFN0cmluZygiXG4iKX1bci4kdG9IVE1MXShlKXtyZXR1cm4gcy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImJyIn0pfX1jbGFzcyBIdG1sIGV4dGVuZHMgWGh0bWxPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiaHRtbCIpfVtyLiR0b0hUTUxdKGUpe2NvbnN0IHQ9W107dGhpc1tyLiRleHRyYV09e2NoaWxkcmVuOnR9O3RoaXNbci4kY2hpbGRyZW5Ub0hUTUxdKHt9KTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhUmljaCJdLHN0eWxlOnt9fSx2YWx1ZTp0aGlzW3IuJGNvbnRlbnRdfHwiIn0pO2lmKDE9PT10Lmxlbmd0aCl7Y29uc3QgZT10WzBdO2lmKGUuYXR0cmlidXRlcz8uY2xhc3MuaW5jbHVkZXMoInhmYVJpY2giKSlyZXR1cm4gcy5IVE1MUmVzdWx0LnN1Y2Nlc3MoZSl9cmV0dXJuIHMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhUmljaCJdLHN0eWxlOnt9fSxjaGlsZHJlbjp0fSl9fWNsYXNzIEkgZXh0ZW5kcyBYaHRtbE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJpIil9W3IuJHB1c2hHbHlwaHNdKGUpe2UucHVzaEZvbnQoe3Bvc3R1cmU6Iml0YWxpYyJ9KTtzdXBlcltyLiRwdXNoR2x5cGhzXShlKTtlLnBvcEZvbnQoKX19Y2xhc3MgTGkgZXh0ZW5kcyBYaHRtbE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJsaSIpfX1jbGFzcyBPbCBleHRlbmRzIFhodG1sT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIm9sIil9fWNsYXNzIFAgZXh0ZW5kcyBYaHRtbE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJwIil9W3IuJHB1c2hHbHlwaHNdKGUpe3N1cGVyW3IuJHB1c2hHbHlwaHNdKGUsITEpO2UuYWRkU3RyaW5nKCJcbiIpO2UuYWRkUGFyYSgpO2UucG9wRm9udCgpfVtyLiR0ZXh0XSgpe3JldHVybiB0aGlzW3IuJGdldFBhcmVudF0oKVtyLiRnZXRDaGlsZHJlbl0oKS5hdCgtMSk9PT10aGlzP3N1cGVyW3IuJHRleHRdKCk6c3VwZXJbci4kdGV4dF0oKSsiXG4ifX1jbGFzcyBTcGFuIGV4dGVuZHMgWGh0bWxPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwic3BhbiIpfX1jbGFzcyBTdWIgZXh0ZW5kcyBYaHRtbE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJzdWIiKX19Y2xhc3MgU3VwIGV4dGVuZHMgWGh0bWxPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwic3VwIil9fWNsYXNzIFVsIGV4dGVuZHMgWGh0bWxPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwidWwiKX19Y2xhc3MgWGh0bWxOYW1lc3BhY2V7c3RhdGljW24uJGJ1aWxkWEZBT2JqZWN0XShlLHQpe2lmKFhodG1sTmFtZXNwYWNlLmhhc093blByb3BlcnR5KGUpKXJldHVybiBYaHRtbE5hbWVzcGFjZVtlXSh0KX1zdGF0aWMgYShlKXtyZXR1cm4gbmV3IEEoZSl9c3RhdGljIGIoZSl7cmV0dXJuIG5ldyBCKGUpfXN0YXRpYyBib2R5KGUpe3JldHVybiBuZXcgQm9keShlKX1zdGF0aWMgYnIoZSl7cmV0dXJuIG5ldyBCcihlKX1zdGF0aWMgaHRtbChlKXtyZXR1cm4gbmV3IEh0bWwoZSl9c3RhdGljIGkoZSl7cmV0dXJuIG5ldyBJKGUpfXN0YXRpYyBsaShlKXtyZXR1cm4gbmV3IExpKGUpfXN0YXRpYyBvbChlKXtyZXR1cm4gbmV3IE9sKGUpfXN0YXRpYyBwKGUpe3JldHVybiBuZXcgUChlKX1zdGF0aWMgc3BhbihlKXtyZXR1cm4gbmV3IFNwYW4oZSl9c3RhdGljIHN1YihlKXtyZXR1cm4gbmV3IFN1YihlKX1zdGF0aWMgc3VwKGUpe3JldHVybiBuZXcgU3VwKGUpfXN0YXRpYyB1bChlKXtyZXR1cm4gbmV3IFVsKGUpfX10LlhodG1sTmFtZXNwYWNlPVhodG1sTmFtZXNwYWNlfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LlVua25vd25OYW1lc3BhY2U9dm9pZCAwO3ZhciByPWEoMjM0KSxuPWEoMjQwKTtjbGFzcyBVbmtub3duTmFtZXNwYWNle2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZXNwYWNlSWQ9ZX1bci4kYnVpbGRYRkFPYmplY3RdKGUsdCl7cmV0dXJuIG5ldyBuLlhtbE9iamVjdCh0aGlzLm5hbWVzcGFjZUlkLGUsdCl9fXQuVW5rbm93bk5hbWVzcGFjZT1Vbmtub3duTmFtZXNwYWNlfSwoZSx0LGEpPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt0LkRhdGFzZXRSZWFkZXI9dm9pZCAwO2EoMik7dmFyIHI9YSgxNDQpLG49YSgxNDkpLGk9YSgyMTcpO2Z1bmN0aW9uIGRlY29kZVN0cmluZyhlKXt0cnl7cmV0dXJuKDAsci5zdHJpbmdUb1VURjhTdHJpbmcpKGUpfWNhdGNoKHQpeygwLHIud2FybikoYFVURi04IGRlY29kaW5nIGZhaWxlZDogIiR7dH0iLmApO3JldHVybiBlfX1jbGFzcyBEYXRhc2V0WE1MUGFyc2VyIGV4dGVuZHMgaS5TaW1wbGVYTUxQYXJzZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7dGhpcy5ub2RlPW51bGx9b25FbmRFbGVtZW50KGUpe2NvbnN0IHQ9c3VwZXIub25FbmRFbGVtZW50KGUpO2lmKHQmJiJ4ZmE6ZGF0YXNldHMiPT09ZSl7dGhpcy5ub2RlPXQ7dGhyb3cgbmV3IEVycm9yKCJBYm9ydGluZyBEYXRhc2V0WE1MUGFyc2VyLiIpfX19dC5EYXRhc2V0UmVhZGVyPWNsYXNzIERhdGFzZXRSZWFkZXJ7Y29uc3RydWN0b3IoZSl7aWYoZS5kYXRhc2V0cyl0aGlzLm5vZGU9bmV3IGkuU2ltcGxlWE1MUGFyc2VyKHtoYXNBdHRyaWJ1dGVzOiEwfSkucGFyc2VGcm9tU3RyaW5nKGUuZGF0YXNldHMpLmRvY3VtZW50RWxlbWVudDtlbHNle2NvbnN0IHQ9bmV3IERhdGFzZXRYTUxQYXJzZXIoe2hhc0F0dHJpYnV0ZXM6ITB9KTt0cnl7dC5wYXJzZUZyb21TdHJpbmcoZVsieGRwOnhkcCJdKX1jYXRjaHt9dGhpcy5ub2RlPXQubm9kZX19Z2V0VmFsdWUoZSl7aWYoIXRoaXMubm9kZXx8IWUpcmV0dXJuIiI7Y29uc3QgdD10aGlzLm5vZGUuc2VhcmNoTm9kZSgoMCxuLnBhcnNlWEZBUGF0aCkoZSksMCk7aWYoIXQpcmV0dXJuIiI7Y29uc3QgYT10LmZpcnN0Q2hpbGQ7cmV0dXJuInZhbHVlIj09PWE/Lm5vZGVOYW1lP3QuY2hpbGRyZW4ubWFwKChlPT5kZWNvZGVTdHJpbmcoZS50ZXh0Q29udGVudCkpKTpkZWNvZGVTdHJpbmcodC50ZXh0Q29udGVudCl9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5YUmVmPXZvaWQgMDthKDExNik7YSgxMjYpO2EoMTI4KTthKDEzMSk7YSgxMzMpO2EoMTM1KTthKDEzNyk7YSg4NCk7YSg5Myk7YSg5NCk7YSg5Nyk7YSg5OSk7YSgxMDEpO2EoMTA1KTthKDEwOCk7YSgxMTUpO2EoMTM5KTthKDIpO3ZhciByPWEoMTQ0KSxuPWEoMTUwKSxpPWEoMTY2KSxzPWEoMTQ5KSxvPWEoMTUxKSxjPWEoMjE4KTt0LlhSZWY9Y2xhc3MgWFJlZnsjYT1udWxsO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5zdHJlYW09ZTt0aGlzLnBkZk1hbmFnZXI9dDt0aGlzLmVudHJpZXM9W107dGhpcy5feHJlZlN0bXM9bmV3IFNldDt0aGlzLl9jYWNoZU1hcD1uZXcgTWFwO3RoaXMuX3BlbmRpbmdSZWZzPW5ldyBuLlJlZlNldDt0aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtPW51bGw7dGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtPW51bGx9Z2V0TmV3UGVyc2lzdGVudFJlZihlKXtudWxsPT09dGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSYmKHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW09dGhpcy5lbnRyaWVzLmxlbmd0aHx8MSk7Y29uc3QgdD10aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtKys7dGhpcy5fY2FjaGVNYXAuc2V0KHQsZSk7cmV0dXJuIG4uUmVmLmdldCh0LDApfWdldE5ld1RlbXBvcmFyeVJlZigpe251bGw9PT10aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0mJih0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW09dGhpcy5lbnRyaWVzLmxlbmd0aHx8MSk7cmV0dXJuIG4uUmVmLmdldCh0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0rKywwKX1yZXNldE5ld1RlbXBvcmFyeVJlZigpe3RoaXMuX25ld1RlbXBvcmFyeVJlZk51bT1udWxsfXNldFN0YXJ0WFJlZihlKXt0aGlzLnN0YXJ0WFJlZlF1ZXVlPVtlXX1wYXJzZSgpe2xldCBlLHQsYSxpPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07aWYoaSl7KDAsci53YXJuKSgiSW5kZXhpbmcgYWxsIFBERiBvYmplY3RzIik7ZT10aGlzLmluZGV4T2JqZWN0cygpfWVsc2UgZT10aGlzLnJlYWRYUmVmKCk7ZS5hc3NpZ25YcmVmKHRoaXMpO3RoaXMudHJhaWxlcj1lO3RyeXt0PWUuZ2V0KCJFbmNyeXB0Iil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxyLndhcm4pKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiRW5jcnlwdCIgcmVmZXJlbmNlOiAiJHtlfSIuYCl9aWYodCBpbnN0YW5jZW9mIG4uRGljdCl7Y29uc3QgYT1lLmdldCgiSUQiKSxyPWE/Lmxlbmd0aD9hWzBdOiIiO3Quc3VwcHJlc3NFbmNyeXB0aW9uPSEwO3RoaXMuZW5jcnlwdD1uZXcgYy5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KHQscix0aGlzLnBkZk1hbmFnZXIucGFzc3dvcmQpfXRyeXthPWUuZ2V0KCJSb290Iil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxyLndhcm4pKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiUm9vdCIgcmVmZXJlbmNlOiAiJHtlfSIuYCl9aWYoYSBpbnN0YW5jZW9mIG4uRGljdCl0cnl7aWYoYS5nZXQoIlBhZ2VzIilpbnN0YW5jZW9mIG4uRGljdCl7dGhpcy5yb290PWE7cmV0dXJufX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygcy5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLHIud2FybikoYFhSZWYucGFyc2UgLSBJbnZhbGlkICJQYWdlcyIgcmVmZXJlbmNlOiAiJHtlfSIuYCl9aWYoIWkpdGhyb3cgbmV3IHMuWFJlZlBhcnNlRXhjZXB0aW9uO3Rocm93IG5ldyByLkludmFsaWRQREZFeGNlcHRpb24oIkludmFsaWQgUm9vdCByZWZlcmVuY2UuIil9cHJvY2Vzc1hSZWZUYWJsZShlKXsidGFibGVTdGF0ZSJpbiB0aGlzfHwodGhpcy50YWJsZVN0YXRlPXtlbnRyeU51bTowLHN0cmVhbVBvczplLmxleGVyLnN0cmVhbS5wb3MscGFyc2VyQnVmMTplLmJ1ZjEscGFyc2VyQnVmMjplLmJ1ZjJ9KTtjb25zdCB0PXRoaXMucmVhZFhSZWZUYWJsZShlKTtpZighKDAsbi5pc0NtZCkodCwidHJhaWxlciIpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBmaW5kIHRyYWlsZXIgZGljdGlvbmFyeSIpO2xldCBhPWUuZ2V0T2JqKCk7YSBpbnN0YW5jZW9mIG4uRGljdHx8IWEuZGljdHx8KGE9YS5kaWN0KTtpZighKGEgaW5zdGFuY2VvZiBuLkRpY3QpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBwYXJzZSB0cmFpbGVyIGRpY3Rpb25hcnkiKTtkZWxldGUgdGhpcy50YWJsZVN0YXRlO3JldHVybiBhfXJlYWRYUmVmVGFibGUoZSl7Y29uc3QgdD1lLmxleGVyLnN0cmVhbSxhPXRoaXMudGFibGVTdGF0ZTt0LnBvcz1hLnN0cmVhbVBvcztlLmJ1ZjE9YS5wYXJzZXJCdWYxO2UuYnVmMj1hLnBhcnNlckJ1ZjI7bGV0IGk7Zm9yKDs7KXtpZighKCJmaXJzdEVudHJ5TnVtImluIGEpfHwhKCJlbnRyeUNvdW50ImluIGEpKXtpZigoMCxuLmlzQ21kKShpPWUuZ2V0T2JqKCksInRyYWlsZXIiKSlicmVhazthLmZpcnN0RW50cnlOdW09aTthLmVudHJ5Q291bnQ9ZS5nZXRPYmooKX1sZXQgcz1hLmZpcnN0RW50cnlOdW07Y29uc3Qgbz1hLmVudHJ5Q291bnQ7aWYoIU51bWJlci5pc0ludGVnZXIocyl8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHdyb25nIHR5cGVzIGluIHN1YnNlY3Rpb24gaGVhZGVyIik7Zm9yKGxldCBpPWEuZW50cnlOdW07aTxvO2krKyl7YS5zdHJlYW1Qb3M9dC5wb3M7YS5lbnRyeU51bT1pO2EucGFyc2VyQnVmMT1lLmJ1ZjE7YS5wYXJzZXJCdWYyPWUuYnVmMjtjb25zdCBjPXt9O2Mub2Zmc2V0PWUuZ2V0T2JqKCk7Yy5nZW49ZS5nZXRPYmooKTtjb25zdCBsPWUuZ2V0T2JqKCk7aWYobCBpbnN0YW5jZW9mIG4uQ21kKXN3aXRjaChsLmNtZCl7Y2FzZSJmIjpjLmZyZWU9ITA7YnJlYWs7Y2FzZSJuIjpjLnVuY29tcHJlc3NlZD0hMH1pZighTnVtYmVyLmlzSW50ZWdlcihjLm9mZnNldCl8fCFOdW1iZXIuaXNJbnRlZ2VyKGMuZ2VuKXx8IWMuZnJlZSYmIWMudW5jb21wcmVzc2VkKXRocm93IG5ldyByLkZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluIFhSZWYgc3Vic2VjdGlvbjogJHtzfSwgJHtvfWApOzA9PT1pJiZjLmZyZWUmJjE9PT1zJiYocz0wKTt0aGlzLmVudHJpZXNbaStzXXx8KHRoaXMuZW50cmllc1tpK3NdPWMpfWEuZW50cnlOdW09MDthLnN0cmVhbVBvcz10LnBvczthLnBhcnNlckJ1ZjE9ZS5idWYxO2EucGFyc2VyQnVmMj1lLmJ1ZjI7ZGVsZXRlIGEuZmlyc3RFbnRyeU51bTtkZWxldGUgYS5lbnRyeUNvdW50fWlmKHRoaXMuZW50cmllc1swXSYmIXRoaXMuZW50cmllc1swXS5mcmVlKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0Iik7cmV0dXJuIGl9cHJvY2Vzc1hSZWZTdHJlYW0oZSl7aWYoISgic3RyZWFtU3RhdGUiaW4gdGhpcykpe2NvbnN0IHQ9ZS5kaWN0LGE9dC5nZXQoIlciKTtsZXQgcj10LmdldCgiSW5kZXgiKTtyfHwocj1bMCx0LmdldCgiU2l6ZSIpXSk7dGhpcy5zdHJlYW1TdGF0ZT17ZW50cnlSYW5nZXM6cixieXRlV2lkdGhzOmEsZW50cnlOdW06MCxzdHJlYW1Qb3M6ZS5wb3N9fXRoaXMucmVhZFhSZWZTdHJlYW0oZSk7ZGVsZXRlIHRoaXMuc3RyZWFtU3RhdGU7cmV0dXJuIGUuZGljdH1yZWFkWFJlZlN0cmVhbShlKXtjb25zdCB0PXRoaXMuc3RyZWFtU3RhdGU7ZS5wb3M9dC5zdHJlYW1Qb3M7Y29uc3RbYSxuLGldPXQuYnl0ZVdpZHRocyxzPXQuZW50cnlSYW5nZXM7Zm9yKDtzLmxlbmd0aD4wOyl7Y29uc3RbbyxjXT1zO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG8pfHwhTnVtYmVyLmlzSW50ZWdlcihjKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIHJhbmdlIGZpZWxkczogJHtvfSwgJHtjfWApO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGEpfHwhTnVtYmVyLmlzSW50ZWdlcihuKXx8IU51bWJlci5pc0ludGVnZXIoaSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAke299LCAke2N9YCk7Zm9yKGxldCBzPXQuZW50cnlOdW07czxjOysrcyl7dC5lbnRyeU51bT1zO3Quc3RyZWFtUG9zPWUucG9zO2xldCBjPTAsbD0wLGg9MDtmb3IobGV0IHQ9MDt0PGE7Kyt0KXtjb25zdCB0PWUuZ2V0Qnl0ZSgpO2lmKC0xPT09dCl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIGJ5dGVXaWR0aHMgJ3R5cGUnLiIpO2M9Yzw8OHx0fTA9PT1hJiYoYz0xKTtmb3IobGV0IHQ9MDt0PG47Kyt0KXtjb25zdCB0PWUuZ2V0Qnl0ZSgpO2lmKC0xPT09dCl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIGJ5dGVXaWR0aHMgJ29mZnNldCcuIik7bD1sPDw4fHR9Zm9yKGxldCB0PTA7dDxpOysrdCl7Y29uc3QgdD1lLmdldEJ5dGUoKTtpZigtMT09PXQpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICdnZW5lcmF0aW9uJy4iKTtoPWg8PDh8dH1jb25zdCB1PXt9O3Uub2Zmc2V0PWw7dS5nZW49aDtzd2l0Y2goYyl7Y2FzZSAwOnUuZnJlZT0hMDticmVhaztjYXNlIDE6dS51bmNvbXByZXNzZWQ9ITA7YnJlYWs7Y2FzZSAyOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSB0eXBlOiAke2N9YCl9dGhpcy5lbnRyaWVzW28rc118fCh0aGlzLmVudHJpZXNbbytzXT11KX10LmVudHJ5TnVtPTA7dC5zdHJlYW1Qb3M9ZS5wb3M7cy5zcGxpY2UoMCwyKX19aW5kZXhPYmplY3RzKCl7ZnVuY3Rpb24gcmVhZFRva2VuKGUsdCl7bGV0IGE9IiIscj1lW3RdO2Zvcig7MTAhPT1yJiYxMyE9PXImJjYwIT09ciYmISgrK3Q+PWUubGVuZ3RoKTspe2ErPVN0cmluZy5mcm9tQ2hhckNvZGUocik7cj1lW3RdfXJldHVybiBhfWZ1bmN0aW9uIHNraXBVbnRpbChlLHQsYSl7Y29uc3Qgcj1hLmxlbmd0aCxuPWUubGVuZ3RoO2xldCBpPTA7Zm9yKDt0PG47KXtsZXQgbj0wO2Zvcig7bjxyJiZlW3Qrbl09PT1hW25dOykrK247aWYobj49cilicmVhazt0Kys7aSsrfXJldHVybiBpfWNvbnN0IGU9L1xiKGVuZG9ianxcZCtccytcZCtccytvYmp8eHJlZnx0cmFpbGVyXHMqPDwpXGIvZyx0PS9cYihzdGFydHhyZWZ8XGQrXHMrXGQrXHMrb2JqKVxiL2csYT0vXihcZCspXHMrKFxkKylccytvYmpcYi8sbz1uZXcgVWludDhBcnJheShbMTE2LDExNCw5NywxMDUsMTA4LDEwMSwxMTRdKSxjPW5ldyBVaW50OEFycmF5KFsxMTUsMTE2LDk3LDExNCwxMTYsMTIwLDExNCwxMDEsMTAyXSksbD1uZXcgVWludDhBcnJheShbNDcsODgsODIsMTAxLDEwMl0pO3RoaXMuZW50cmllcy5sZW5ndGg9MDt0aGlzLl9jYWNoZU1hcC5jbGVhcigpO2NvbnN0IGg9dGhpcy5zdHJlYW07aC5wb3M9MDtjb25zdCB1PWguZ2V0Qnl0ZXMoKSxkPSgwLHIuYnl0ZXNUb1N0cmluZykodSksZj11Lmxlbmd0aDtsZXQgZz1oLnN0YXJ0O2NvbnN0IHA9W10sbT1bXTtmb3IoO2c8Zjspe2xldCBuPXVbZ107aWYoOT09PW58fDEwPT09bnx8MTM9PT1ufHwzMj09PW4peysrZztjb250aW51ZX1pZigzNz09PW4pe2RveysrZztpZihnPj1mKWJyZWFrO249dVtnXX13aGlsZSgxMCE9PW4mJjEzIT09bik7Y29udGludWV9Y29uc3QgYj1yZWFkVG9rZW4odSxnKTtsZXQgeTtpZihiLnN0YXJ0c1dpdGgoInhyZWYiKSYmKDQ9PT1iLmxlbmd0aHx8L1xzLy50ZXN0KGJbNF0pKSl7Zys9c2tpcFVudGlsKHUsZyxvKTtwLnB1c2goZyk7Zys9c2tpcFVudGlsKHUsZyxjKX1lbHNlIGlmKHk9YS5leGVjKGIpKXtjb25zdCB0PTB8eVsxXSxhPTB8eVsyXSxuPWcrYi5sZW5ndGg7bGV0IG8sYz0hMTtpZih0aGlzLmVudHJpZXNbdF0pe2lmKHRoaXMuZW50cmllc1t0XS5nZW49PT1hKXRyeXtuZXcgaS5QYXJzZXIoe2xleGVyOm5ldyBpLkxleGVyKGgubWFrZVN1YlN0cmVhbShuKSl9KS5nZXRPYmooKTtjPSEwfWNhdGNoKGUpe2UgaW5zdGFuY2VvZiBzLlBhcnNlckVPRkV4Y2VwdGlvbj8oMCxyLndhcm4pKGBpbmRleE9iamVjdHMgLS0gY2hlY2tpbmcgb2JqZWN0ICgke2J9KTogIiR7ZX0iLmApOmM9ITB9fWVsc2UgYz0hMDtjJiYodGhpcy5lbnRyaWVzW3RdPXtvZmZzZXQ6Zy1oLnN0YXJ0LGdlbjphLHVuY29tcHJlc3NlZDohMH0pO2UubGFzdEluZGV4PW47Y29uc3QgcD1lLmV4ZWMoZCk7aWYocCl7bz1lLmxhc3RJbmRleCsxLWc7aWYoImVuZG9iaiIhPT1wWzFdKXsoMCxyLndhcm4pKGBpbmRleE9iamVjdHM6IEZvdW5kICIke3BbMV19IiBpbnNpZGUgb2YgYW5vdGhlciAib2JqIiwgY2F1c2VkIGJ5IG1pc3NpbmcgImVuZG9iaiIgLS0gdHJ5aW5nIHRvIHJlY292ZXIuYCk7by09cFsxXS5sZW5ndGgrMX19ZWxzZSBvPWYtZztjb25zdCB3PXUuc3ViYXJyYXkoZyxnK28pLFM9c2tpcFVudGlsKHcsMCxsKTtpZihTPG8mJndbUys1XTw2NCl7bS5wdXNoKGctaC5zdGFydCk7dGhpcy5feHJlZlN0bXMuYWRkKGctaC5zdGFydCl9Zys9b31lbHNlIGlmKGIuc3RhcnRzV2l0aCgidHJhaWxlciIpJiYoNz09PWIubGVuZ3RofHwvXHMvLnRlc3QoYls3XSkpKXtwLnB1c2goZyk7Y29uc3QgZT1nK2IubGVuZ3RoO2xldCBhO3QubGFzdEluZGV4PWU7Y29uc3Qgbj10LmV4ZWMoZCk7aWYobil7YT10Lmxhc3RJbmRleCsxLWc7aWYoInN0YXJ0eHJlZiIhPT1uWzFdKXsoMCxyLndhcm4pKGBpbmRleE9iamVjdHM6IEZvdW5kICIke25bMV19IiBhZnRlciAidHJhaWxlciIsIGNhdXNlZCBieSBtaXNzaW5nICJzdGFydHhyZWYiIC0tIHRyeWluZyB0byByZWNvdmVyLmApO2EtPW5bMV0ubGVuZ3RoKzF9fWVsc2UgYT1mLWc7Zys9YX1lbHNlIGcrPWIubGVuZ3RoKzF9Zm9yKGNvbnN0IGUgb2YgbSl7dGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKGUpO3RoaXMucmVhZFhSZWYoITApfWNvbnN0IGI9W107bGV0IHksdyxTPSExO2Zvcihjb25zdCBlIG9mIHApe2gucG9zPWU7Y29uc3QgdD1uZXcgaS5QYXJzZXIoe2xleGVyOm5ldyBpLkxleGVyKGgpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITAscmVjb3ZlcnlNb2RlOiEwfSksYT10LmdldE9iaigpO2lmKCEoMCxuLmlzQ21kKShhLCJ0cmFpbGVyIikpY29udGludWU7Y29uc3Qgcj10LmdldE9iaigpO2lmKHIgaW5zdGFuY2VvZiBuLkRpY3Qpe2IucHVzaChyKTtyLmhhcygiRW5jcnlwdCIpJiYoUz0hMCl9fWZvcihjb25zdCBlIG9mWy4uLmIsImdlbkZhbGxiYWNrIiwuLi5iXSl7aWYoImdlbkZhbGxiYWNrIj09PWUpe2lmKCF3KWJyZWFrO3RoaXMuX2dlbmVyYXRpb25GYWxsYmFjaz0hMDtjb250aW51ZX1sZXQgdD0hMTt0cnl7Y29uc3QgYT1lLmdldCgiUm9vdCIpO2lmKCEoYSBpbnN0YW5jZW9mIG4uRGljdCkpY29udGludWU7Y29uc3Qgcj1hLmdldCgiUGFnZXMiKTtpZighKHIgaW5zdGFuY2VvZiBuLkRpY3QpKWNvbnRpbnVlO2NvbnN0IGk9ci5nZXQoIkNvdW50Iik7TnVtYmVyLmlzSW50ZWdlcihpKSYmKHQ9ITApfWNhdGNoKGUpe3c9ZTtjb250aW51ZX1pZih0JiYoIVN8fGUuaGFzKCJFbmNyeXB0IikpJiZlLmhhcygiSUQiKSlyZXR1cm4gZTt5PWV9aWYoeSlyZXR1cm4geTtpZih0aGlzLnRvcERpY3QpcmV0dXJuIHRoaXMudG9wRGljdDt0aHJvdyBuZXcgci5JbnZhbGlkUERGRXhjZXB0aW9uKCJJbnZhbGlkIFBERiBzdHJ1Y3R1cmUuIil9cmVhZFhSZWYoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0IHQ9dGhpcy5zdHJlYW0sYT1uZXcgU2V0O2Zvcig7dGhpcy5zdGFydFhSZWZRdWV1ZS5sZW5ndGg7KXt0cnl7Y29uc3QgZT10aGlzLnN0YXJ0WFJlZlF1ZXVlWzBdO2lmKGEuaGFzKGUpKXsoMCxyLndhcm4pKCJyZWFkWFJlZiAtIHNraXBwaW5nIFhSZWYgdGFibGUgc2luY2UgaXQgd2FzIGFscmVhZHkgcGFyc2VkLiIpO3RoaXMuc3RhcnRYUmVmUXVldWUuc2hpZnQoKTtjb250aW51ZX1hLmFkZChlKTt0LnBvcz1lK3Quc3RhcnQ7Y29uc3Qgcz1uZXcgaS5QYXJzZXIoe2xleGVyOm5ldyBpLkxleGVyKHQpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITB9KTtsZXQgYyxsPXMuZ2V0T2JqKCk7aWYoKDAsbi5pc0NtZCkobCwieHJlZiIpKXtjPXRoaXMucHJvY2Vzc1hSZWZUYWJsZShzKTt0aGlzLnRvcERpY3R8fCh0aGlzLnRvcERpY3Q9Yyk7bD1jLmdldCgiWFJlZlN0bSIpO2lmKE51bWJlci5pc0ludGVnZXIobCkmJiF0aGlzLl94cmVmU3Rtcy5oYXMobCkpe3RoaXMuX3hyZWZTdG1zLmFkZChsKTt0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gobCk7dGhpcy4jYT8/PWx9fWVsc2V7aWYoIU51bWJlci5pc0ludGVnZXIobCkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBzdHJlYW0gaGVhZGVyIik7aWYoIShOdW1iZXIuaXNJbnRlZ2VyKHMuZ2V0T2JqKCkpJiYoMCxuLmlzQ21kKShzLmdldE9iaigpLCJvYmoiKSYmKGw9cy5nZXRPYmooKSlpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBzdHJlYW0iKTtjPXRoaXMucHJvY2Vzc1hSZWZTdHJlYW0obCk7dGhpcy50b3BEaWN0fHwodGhpcy50b3BEaWN0PWMpO2lmKCFjKXRocm93IG5ldyByLkZvcm1hdEVycm9yKCJGYWlsZWQgdG8gcmVhZCBYUmVmIHN0cmVhbSIpfWw9Yy5nZXQoIlByZXYiKTtOdW1iZXIuaXNJbnRlZ2VyKGwpP3RoaXMuc3RhcnRYUmVmUXVldWUucHVzaChsKTpsIGluc3RhbmNlb2Ygbi5SZWYmJnRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChsLm51bSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxyLmluZm8pKCIod2hpbGUgcmVhZGluZyBYUmVmKTogIitlKX10aGlzLnN0YXJ0WFJlZlF1ZXVlLnNoaWZ0KCl9aWYodGhpcy50b3BEaWN0KXJldHVybiB0aGlzLnRvcERpY3Q7aWYoIWUpdGhyb3cgbmV3IHMuWFJlZlBhcnNlRXhjZXB0aW9ufWdldCBsYXN0WFJlZlN0cmVhbVBvcygpe3JldHVybiB0aGlzLiNhPz8odGhpcy5feHJlZlN0bXMuc2l6ZT4wP01hdGgubWF4KC4uLnRoaXMuX3hyZWZTdG1zKTpudWxsKX1nZXRFbnRyeShlKXtjb25zdCB0PXRoaXMuZW50cmllc1tlXTtyZXR1cm4gdCYmIXQuZnJlZSYmdC5vZmZzZXQ/dDpudWxsfWZldGNoSWZSZWYoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtyZXR1cm4gZSBpbnN0YW5jZW9mIG4uUmVmP3RoaXMuZmV0Y2goZSx0KTplfWZldGNoKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07aWYoIShlIGluc3RhbmNlb2Ygbi5SZWYpKXRocm93IG5ldyBFcnJvcigicmVmIG9iamVjdCBpcyBub3QgYSByZWZlcmVuY2UiKTtjb25zdCBhPWUubnVtLGk9dGhpcy5fY2FjaGVNYXAuZ2V0KGEpO2lmKHZvaWQgMCE9PWkpe2kgaW5zdGFuY2VvZiBuLkRpY3QmJiFpLm9iaklkJiYoaS5vYmpJZD1lLnRvU3RyaW5nKCkpO3JldHVybiBpfWxldCBzPXRoaXMuZ2V0RW50cnkoYSk7aWYobnVsbD09PXMpe3RoaXMuX2NhY2hlTWFwLnNldChhLHMpO3JldHVybiBzfWlmKHRoaXMuX3BlbmRpbmdSZWZzLmhhcyhlKSl7dGhpcy5fcGVuZGluZ1JlZnMucmVtb3ZlKGUpOygwLHIud2FybikoYElnbm9yaW5nIGNpcmN1bGFyIHJlZmVyZW5jZTogJHtlfS5gKTtyZXR1cm4gbi5DSVJDVUxBUl9SRUZ9dGhpcy5fcGVuZGluZ1JlZnMucHV0KGUpO3RyeXtzPXMudW5jb21wcmVzc2VkP3RoaXMuZmV0Y2hVbmNvbXByZXNzZWQoZSxzLHQpOnRoaXMuZmV0Y2hDb21wcmVzc2VkKGUscyx0KTt0aGlzLl9wZW5kaW5nUmVmcy5yZW1vdmUoZSl9Y2F0Y2godCl7dGhpcy5fcGVuZGluZ1JlZnMucmVtb3ZlKGUpO3Rocm93IHR9cyBpbnN0YW5jZW9mIG4uRGljdD9zLm9iaklkPWUudG9TdHJpbmcoKTpzIGluc3RhbmNlb2Ygby5CYXNlU3RyZWFtJiYocy5kaWN0Lm9iaklkPWUudG9TdHJpbmcoKSk7cmV0dXJuIHN9ZmV0Y2hVbmNvbXByZXNzZWQoZSx0KXtsZXQgYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO2NvbnN0IGM9ZS5nZW47bGV0IGw9ZS5udW07aWYodC5nZW4hPT1jKXtjb25zdCBpPWBJbmNvbnNpc3RlbnQgZ2VuZXJhdGlvbiBpbiBYUmVmOiAke2V9YDtpZih0aGlzLl9nZW5lcmF0aW9uRmFsbGJhY2smJnQuZ2VuPGMpeygwLHIud2FybikoaSk7cmV0dXJuIHRoaXMuZmV0Y2hVbmNvbXByZXNzZWQobi5SZWYuZ2V0KGwsdC5nZW4pLHQsYSl9dGhyb3cgbmV3IHMuWFJlZkVudHJ5RXhjZXB0aW9uKGkpfWNvbnN0IGg9dGhpcy5zdHJlYW0ubWFrZVN1YlN0cmVhbSh0Lm9mZnNldCt0aGlzLnN0cmVhbS5zdGFydCksdT1uZXcgaS5QYXJzZXIoe2xleGVyOm5ldyBpLkxleGVyKGgpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITB9KSxkPXUuZ2V0T2JqKCksZj11LmdldE9iaigpLGc9dS5nZXRPYmooKTtpZihkIT09bHx8ZiE9PWN8fCEoZyBpbnN0YW5jZW9mIG4uQ21kKSl0aHJvdyBuZXcgcy5YUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke2V9YCk7aWYoIm9iaiIhPT1nLmNtZCl7aWYoZy5jbWQuc3RhcnRzV2l0aCgib2JqIikpe2w9cGFyc2VJbnQoZy5jbWQuc3Vic3RyaW5nKDMpLDEwKTtpZighTnVtYmVyLmlzTmFOKGwpKXJldHVybiBsfXRocm93IG5ldyBzLlhSZWZFbnRyeUV4Y2VwdGlvbihgQmFkICh1bmNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7ZX1gKX0odD10aGlzLmVuY3J5cHQmJiFhP3UuZ2V0T2JqKHRoaXMuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obCxjKSk6dS5nZXRPYmooKSlpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbXx8dGhpcy5fY2FjaGVNYXAuc2V0KGwsdCk7cmV0dXJuIHR9ZmV0Y2hDb21wcmVzc2VkKGUsdCl7Y29uc3QgYT10Lm9mZnNldCxjPXRoaXMuZmV0Y2gobi5SZWYuZ2V0KGEsMCkpO2lmKCEoYyBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoImJhZCBPYmpTdG0gc3RyZWFtIik7Y29uc3QgbD1jLmRpY3QuZ2V0KCJGaXJzdCIpLGg9Yy5kaWN0LmdldCgiTiIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGwpfHwhTnVtYmVyLmlzSW50ZWdlcihoKSl0aHJvdyBuZXcgci5Gb3JtYXRFcnJvcigiaW52YWxpZCBmaXJzdCBhbmQgbiBwYXJhbWV0ZXJzIGZvciBPYmpTdG0gc3RyZWFtIik7bGV0IHU9bmV3IGkuUGFyc2VyKHtsZXhlcjpuZXcgaS5MZXhlcihjKSx4cmVmOnRoaXMsYWxsb3dTdHJlYW1zOiEwfSk7Y29uc3QgZD1uZXcgQXJyYXkoaCksZj1uZXcgQXJyYXkoaCk7Zm9yKGxldCBlPTA7ZTxoOysrZSl7Y29uc3QgdD11LmdldE9iaigpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpKXRocm93IG5ldyByLkZvcm1hdEVycm9yKGBpbnZhbGlkIG9iamVjdCBudW1iZXIgaW4gdGhlIE9ialN0bSBzdHJlYW06ICR7dH1gKTtjb25zdCBhPXUuZ2V0T2JqKCk7aWYoIU51bWJlci5pc0ludGVnZXIoYSkpdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoYGludmFsaWQgb2JqZWN0IG9mZnNldCBpbiB0aGUgT2JqU3RtIHN0cmVhbTogJHthfWApO2RbZV09dDtmW2VdPWF9Y29uc3QgZz0oYy5zdGFydHx8MCkrbCxwPW5ldyBBcnJheShoKTtmb3IobGV0IGU9MDtlPGg7KytlKXtjb25zdCB0PWU8aC0xP2ZbZSsxXS1mW2VdOnZvaWQgMDtpZih0PDApdGhyb3cgbmV3IHIuRm9ybWF0RXJyb3IoIkludmFsaWQgb2Zmc2V0IGluIHRoZSBPYmpTdG0gc3RyZWFtLiIpO3U9bmV3IGkuUGFyc2VyKHtsZXhlcjpuZXcgaS5MZXhlcihjLm1ha2VTdWJTdHJlYW0oZytmW2VdLHQsYy5kaWN0KSkseHJlZjp0aGlzLGFsbG93U3RyZWFtczohMH0pO2NvbnN0IG49dS5nZXRPYmooKTtwW2VdPW47aWYobiBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbSljb250aW51ZTtjb25zdCBzPWRbZV0sbD10aGlzLmVudHJpZXNbc107bCYmbC5vZmZzZXQ9PT1hJiZsLmdlbj09PWUmJnRoaXMuX2NhY2hlTWFwLnNldChzLG4pfWlmKHZvaWQgMD09PSh0PXBbdC5nZW5dKSl0aHJvdyBuZXcgcy5YUmVmRW50cnlFeGNlcHRpb24oYEJhZCAoY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogJHtlfWApO3JldHVybiB0fWFzeW5jIGZldGNoSWZSZWZBc3luYyhlLHQpe3JldHVybiBlIGluc3RhbmNlb2Ygbi5SZWY/dGhpcy5mZXRjaEFzeW5jKGUsdCk6ZX1hc3luYyBmZXRjaEFzeW5jKGUsdCl7dHJ5e3JldHVybiB0aGlzLmZldGNoKGUsdCl9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2Ygcy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikpdGhyb3cgYTthd2FpdCB0aGlzLnBkZk1hbmFnZXIucmVxdWVzdFJhbmdlKGEuYmVnaW4sYS5lbmQpO3JldHVybiB0aGlzLmZldGNoQXN5bmMoZSx0KX19Z2V0Q2F0YWxvZ09iaigpe3JldHVybiB0aGlzLnJvb3R9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5NZXNzYWdlSGFuZGxlcj12b2lkIDA7YSgyKTt2YXIgcj1hKDE0NCk7Y29uc3Qgbj0xLGk9MixzPTEsbz0yLGM9MyxsPTQsaD01LHU9NixkPTcsZj04O2Z1bmN0aW9uIHdyYXBSZWFzb24oZSl7ZSBpbnN0YW5jZW9mIEVycm9yfHwib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfHwoMCxyLnVucmVhY2hhYmxlKSgnd3JhcFJlYXNvbjogRXhwZWN0ZWQgInJlYXNvbiIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTtzd2l0Y2goZS5uYW1lKXtjYXNlIkFib3J0RXhjZXB0aW9uIjpyZXR1cm4gbmV3IHIuQWJvcnRFeGNlcHRpb24oZS5tZXNzYWdlKTtjYXNlIk1pc3NpbmdQREZFeGNlcHRpb24iOnJldHVybiBuZXcgci5NaXNzaW5nUERGRXhjZXB0aW9uKGUubWVzc2FnZSk7Y2FzZSJQYXNzd29yZEV4Y2VwdGlvbiI6cmV0dXJuIG5ldyByLlBhc3N3b3JkRXhjZXB0aW9uKGUubWVzc2FnZSxlLmNvZGUpO2Nhc2UiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjpyZXR1cm4gbmV3IHIuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGUubWVzc2FnZSxlLnN0YXR1cyk7Y2FzZSJVbmtub3duRXJyb3JFeGNlcHRpb24iOnJldHVybiBuZXcgci5Vbmtub3duRXJyb3JFeGNlcHRpb24oZS5tZXNzYWdlLGUuZGV0YWlscyk7ZGVmYXVsdDpyZXR1cm4gbmV3IHIuVW5rbm93bkVycm9yRXhjZXB0aW9uKGUubWVzc2FnZSxlLnRvU3RyaW5nKCkpfX10Lk1lc3NhZ2VIYW5kbGVyPWNsYXNzIE1lc3NhZ2VIYW5kbGVye2NvbnN0cnVjdG9yKGUsdCxhKXt0aGlzLnNvdXJjZU5hbWU9ZTt0aGlzLnRhcmdldE5hbWU9dDt0aGlzLmNvbU9iaj1hO3RoaXMuY2FsbGJhY2tJZD0xO3RoaXMuc3RyZWFtSWQ9MTt0aGlzLnN0cmVhbVNpbmtzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5zdHJlYW1Db250cm9sbGVycz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLmFjdGlvbkhhbmRsZXI9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLl9vbkNvbU9iak9uTWVzc2FnZT1lPT57Y29uc3QgdD1lLmRhdGE7aWYodC50YXJnZXROYW1lIT09dGhpcy5zb3VyY2VOYW1lKXJldHVybjtpZih0LnN0cmVhbSl7dGhpcy4jcih0KTtyZXR1cm59aWYodC5jYWxsYmFjayl7Y29uc3QgZT10LmNhbGxiYWNrSWQsYT10aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2VdO2lmKCFhKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgJHtlfWApO2RlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2VdO2lmKHQuY2FsbGJhY2s9PT1uKWEucmVzb2x2ZSh0LmRhdGEpO2Vsc2V7aWYodC5jYWxsYmFjayE9PWkpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTthLnJlamVjdCh3cmFwUmVhc29uKHQucmVhc29uKSl9cmV0dXJufWNvbnN0IHI9dGhpcy5hY3Rpb25IYW5kbGVyW3QuYWN0aW9uXTtpZighcil0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAke3QuYWN0aW9ufWApO2lmKHQuY2FsbGJhY2tJZCl7Y29uc3QgZT10aGlzLnNvdXJjZU5hbWUscz10LnNvdXJjZU5hbWU7bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe2Uocih0LmRhdGEpKX0pKS50aGVuKChmdW5jdGlvbihyKXthLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmUsdGFyZ2V0TmFtZTpzLGNhbGxiYWNrOm4sY2FsbGJhY2tJZDp0LmNhbGxiYWNrSWQsZGF0YTpyfSl9KSwoZnVuY3Rpb24ocil7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTplLHRhcmdldE5hbWU6cyxjYWxsYmFjazppLGNhbGxiYWNrSWQ6dC5jYWxsYmFja0lkLHJlYXNvbjp3cmFwUmVhc29uKHIpfSl9KSl9ZWxzZSB0LnN0cmVhbUlkP3RoaXMuI24odCk6cih0LmRhdGEpfTthLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKX1vbihlLHQpe2NvbnN0IGE9dGhpcy5hY3Rpb25IYW5kbGVyO2lmKGFbZV0pdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkICIke2V9ImApO2FbZV09dH1zZW5kKGUsdCxhKXt0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTp0aGlzLnNvdXJjZU5hbWUsdGFyZ2V0TmFtZTp0aGlzLnRhcmdldE5hbWUsYWN0aW9uOmUsZGF0YTp0fSxhKX1zZW5kV2l0aFByb21pc2UoZSx0LGEpe2NvbnN0IG49dGhpcy5jYWxsYmFja0lkKyssaT1uZXcgci5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW25dPWk7dHJ5e3RoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnRoaXMuc291cmNlTmFtZSx0YXJnZXROYW1lOnRoaXMudGFyZ2V0TmFtZSxhY3Rpb246ZSxjYWxsYmFja0lkOm4sZGF0YTp0fSxhKX1jYXRjaChlKXtpLnJlamVjdChlKX1yZXR1cm4gaS5wcm9taXNlfXNlbmRXaXRoU3RyZWFtKGUsdCxhLG4pe2NvbnN0IGk9dGhpcy5zdHJlYW1JZCsrLG89dGhpcy5zb3VyY2VOYW1lLGM9dGhpcy50YXJnZXROYW1lLGw9dGhpcy5jb21PYmo7cmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7c3RhcnQ6YT0+e2NvbnN0IHM9bmV3IHIuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy5zdHJlYW1Db250cm9sbGVyc1tpXT17Y29udHJvbGxlcjphLHN0YXJ0Q2FsbDpzLHB1bGxDYWxsOm51bGwsY2FuY2VsQ2FsbDpudWxsLGlzQ2xvc2VkOiExfTtsLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOm8sdGFyZ2V0TmFtZTpjLGFjdGlvbjplLHN0cmVhbUlkOmksZGF0YTp0LGRlc2lyZWRTaXplOmEuZGVzaXJlZFNpemV9LG4pO3JldHVybiBzLnByb21pc2V9LHB1bGw6ZT0+e2NvbnN0IHQ9bmV3IHIuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy5zdHJlYW1Db250cm9sbGVyc1tpXS5wdWxsQ2FsbD10O2wucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6byx0YXJnZXROYW1lOmMsc3RyZWFtOnUsc3RyZWFtSWQ6aSxkZXNpcmVkU2l6ZTplLmRlc2lyZWRTaXplfSk7cmV0dXJuIHQucHJvbWlzZX0sY2FuY2VsOmU9PnsoMCxyLmFzc2VydCkoZSBpbnN0YW5jZW9mIEVycm9yLCJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7Y29uc3QgdD1uZXcgci5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2ldLmNhbmNlbENhbGw9dDt0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2ldLmlzQ2xvc2VkPSEwO2wucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6byx0YXJnZXROYW1lOmMsc3RyZWFtOnMsc3RyZWFtSWQ6aSxyZWFzb246d3JhcFJlYXNvbihlKX0pO3JldHVybiB0LnByb21pc2V9fSxhKX0jbihlKXtjb25zdCB0PWUuc3RyZWFtSWQsYT10aGlzLnNvdXJjZU5hbWUsbj1lLnNvdXJjZU5hbWUsaT10aGlzLmNvbU9iaixzPXRoaXMsbz10aGlzLmFjdGlvbkhhbmRsZXJbZS5hY3Rpb25dLHU9e2VucXVldWUoZSl7bGV0IHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjEsbz1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZih0aGlzLmlzQ2FuY2VsbGVkKXJldHVybjtjb25zdCBjPXRoaXMuZGVzaXJlZFNpemU7dGhpcy5kZXNpcmVkU2l6ZS09cztpZihjPjAmJnRoaXMuZGVzaXJlZFNpemU8PTApe3RoaXMuc2lua0NhcGFiaWxpdHk9bmV3IHIuUHJvbWlzZUNhcGFiaWxpdHk7dGhpcy5yZWFkeT10aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2V9aS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6bixzdHJlYW06bCxzdHJlYW1JZDp0LGNodW5rOmV9LG8pfSxjbG9zZSgpe2lmKCF0aGlzLmlzQ2FuY2VsbGVkKXt0aGlzLmlzQ2FuY2VsbGVkPSEwO2kucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6YSx0YXJnZXROYW1lOm4sc3RyZWFtOmMsc3RyZWFtSWQ6dH0pO2RlbGV0ZSBzLnN0cmVhbVNpbmtzW3RdfX0sZXJyb3IoZSl7KDAsci5hc3NlcnQpKGUgaW5zdGFuY2VvZiBFcnJvciwiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7aWYoIXRoaXMuaXNDYW5jZWxsZWQpe3RoaXMuaXNDYW5jZWxsZWQ9ITA7aS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6bixzdHJlYW06aCxzdHJlYW1JZDp0LHJlYXNvbjp3cmFwUmVhc29uKGUpfSl9fSxzaW5rQ2FwYWJpbGl0eTpuZXcgci5Qcm9taXNlQ2FwYWJpbGl0eSxvblB1bGw6bnVsbCxvbkNhbmNlbDpudWxsLGlzQ2FuY2VsbGVkOiExLGRlc2lyZWRTaXplOmUuZGVzaXJlZFNpemUscmVhZHk6bnVsbH07dS5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7dS5yZWFkeT11LnNpbmtDYXBhYmlsaXR5LnByb21pc2U7dGhpcy5zdHJlYW1TaW5rc1t0XT11O25ldyBQcm9taXNlKChmdW5jdGlvbih0KXt0KG8oZS5kYXRhLHUpKX0pKS50aGVuKChmdW5jdGlvbigpe2kucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6YSx0YXJnZXROYW1lOm4sc3RyZWFtOmYsc3RyZWFtSWQ6dCxzdWNjZXNzOiEwfSl9KSwoZnVuY3Rpb24oZSl7aS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6bixzdHJlYW06ZixzdHJlYW1JZDp0LHJlYXNvbjp3cmFwUmVhc29uKGUpfSl9KSl9I3IoZSl7Y29uc3QgdD1lLnN0cmVhbUlkLGE9dGhpcy5zb3VyY2VOYW1lLG49ZS5zb3VyY2VOYW1lLGk9dGhpcy5jb21PYmosZz10aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdLHA9dGhpcy5zdHJlYW1TaW5rc1t0XTtzd2l0Y2goZS5zdHJlYW0pe2Nhc2UgZjplLnN1Y2Nlc3M/Zy5zdGFydENhbGwucmVzb2x2ZSgpOmcuc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGUucmVhc29uKSk7YnJlYWs7Y2FzZSBkOmUuc3VjY2Vzcz9nLnB1bGxDYWxsLnJlc29sdmUoKTpnLnB1bGxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGUucmVhc29uKSk7YnJlYWs7Y2FzZSB1OmlmKCFwKXtpLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmEsdGFyZ2V0TmFtZTpuLHN0cmVhbTpkLHN0cmVhbUlkOnQsc3VjY2VzczohMH0pO2JyZWFrfXAuZGVzaXJlZFNpemU8PTAmJmUuZGVzaXJlZFNpemU+MCYmcC5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7cC5kZXNpcmVkU2l6ZT1lLmRlc2lyZWRTaXplO25ldyBQcm9taXNlKChmdW5jdGlvbihlKXtlKHAub25QdWxsPy4oKSl9KSkudGhlbigoZnVuY3Rpb24oKXtpLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmEsdGFyZ2V0TmFtZTpuLHN0cmVhbTpkLHN0cmVhbUlkOnQsc3VjY2VzczohMH0pfSksKGZ1bmN0aW9uKGUpe2kucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6YSx0YXJnZXROYW1lOm4sc3RyZWFtOmQsc3RyZWFtSWQ6dCxyZWFzb246d3JhcFJlYXNvbihlKX0pfSkpO2JyZWFrO2Nhc2UgbDooMCxyLmFzc2VydCkoZywiZW5xdWV1ZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpO2lmKGcuaXNDbG9zZWQpYnJlYWs7Zy5jb250cm9sbGVyLmVucXVldWUoZS5jaHVuayk7YnJlYWs7Y2FzZSBjOigwLHIuYXNzZXJ0KShnLCJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpO2lmKGcuaXNDbG9zZWQpYnJlYWs7Zy5pc0Nsb3NlZD0hMDtnLmNvbnRyb2xsZXIuY2xvc2UoKTt0aGlzLiNpKGcsdCk7YnJlYWs7Y2FzZSBoOigwLHIuYXNzZXJ0KShnLCJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpO2cuY29udHJvbGxlci5lcnJvcih3cmFwUmVhc29uKGUucmVhc29uKSk7dGhpcy4jaShnLHQpO2JyZWFrO2Nhc2UgbzplLnN1Y2Nlc3M/Zy5jYW5jZWxDYWxsLnJlc29sdmUoKTpnLmNhbmNlbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZS5yZWFzb24pKTt0aGlzLiNpKGcsdCk7YnJlYWs7Y2FzZSBzOmlmKCFwKWJyZWFrO25ldyBQcm9taXNlKChmdW5jdGlvbih0KXt0KHAub25DYW5jZWw/Lih3cmFwUmVhc29uKGUucmVhc29uKSkpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7aS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTphLHRhcmdldE5hbWU6bixzdHJlYW06byxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbihlKXtpLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmEsdGFyZ2V0TmFtZTpuLHN0cmVhbTpvLHN0cmVhbUlkOnQscmVhc29uOndyYXBSZWFzb24oZSl9KX0pKTtwLnNpbmtDYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGUucmVhc29uKSk7cC5pc0NhbmNlbGxlZD0hMDtkZWxldGUgdGhpcy5zdHJlYW1TaW5rc1t0XTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBzdHJlYW0gY2FzZSIpfX1hc3luYyNpKGUsdCl7YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtlLnN0YXJ0Q2FsbD8ucHJvbWlzZSxlLnB1bGxDYWxsPy5wcm9taXNlLGUuY2FuY2VsQ2FsbD8ucHJvbWlzZV0pO2RlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdfWRlc3Ryb3koKXt0aGlzLmNvbU9iai5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSl9fX0sKGUsdCxhKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dC5QREZXb3JrZXJTdHJlYW09dm9pZCAwO2EoMTM5KTt2YXIgcj1hKDE0NCk7dC5QREZXb3JrZXJTdHJlYW09Y2xhc3MgUERGV29ya2VyU3RyZWFte2NvbnN0cnVjdG9yKGUpe3RoaXMuX21zZ0hhbmRsZXI9ZTt0aGlzLl9jb250ZW50TGVuZ3RoPW51bGw7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI9bnVsbDt0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzPVtdfWdldEZ1bGxSZWFkZXIoKXsoMCxyLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCJQREZXb3JrZXJTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTt0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1uZXcgUERGV29ya2VyU3RyZWFtUmVhZGVyKHRoaXMuX21zZ0hhbmRsZXIpO3JldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcn1nZXRSYW5nZVJlYWRlcihlLHQpe2NvbnN0IGE9bmV3IFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyKGUsdCx0aGlzLl9tc2dIYW5kbGVyKTt0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2goYSk7cmV0dXJuIGF9Y2FuY2VsQWxsUmVxdWVzdHMoZSl7dGhpcy5fZnVsbFJlcXVlc3RSZWFkZXImJnRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLmNhbmNlbChlKTtmb3IoY29uc3QgdCBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKXQuY2FuY2VsKGUpfX07Y2xhc3MgUERGV29ya2VyU3RyZWFtUmVhZGVye2NvbnN0cnVjdG9yKGUpe3RoaXMuX21zZ0hhbmRsZXI9ZTt0aGlzLm9uUHJvZ3Jlc3M9bnVsbDt0aGlzLl9jb250ZW50TGVuZ3RoPW51bGw7dGhpcy5faXNSYW5nZVN1cHBvcnRlZD0hMTt0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZD0hMTtjb25zdCB0PXRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFJlYWRlciIpO3RoaXMuX3JlYWRlcj10LmdldFJlYWRlcigpO3RoaXMuX2hlYWRlcnNSZWFkeT10aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiUmVhZGVySGVhZGVyc1JlYWR5IikudGhlbigoZT0+e3RoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPWUuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7dGhpcy5faXNSYW5nZVN1cHBvcnRlZD1lLmlzUmFuZ2VTdXBwb3J0ZWQ7dGhpcy5fY29udGVudExlbmd0aD1lLmNvbnRlbnRMZW5ndGh9KSl9Z2V0IGhlYWRlcnNSZWFkeSgpe3JldHVybiB0aGlzLl9oZWFkZXJzUmVhZHl9Z2V0IGNvbnRlbnRMZW5ndGgoKXtyZXR1cm4gdGhpcy5fY29udGVudExlbmd0aH1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWR9Z2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKXtyZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZH1hc3luYyByZWFkKCl7Y29uc3R7dmFsdWU6ZSxkb25lOnR9PWF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7cmV0dXJuIHQ/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfTp7dmFsdWU6ZS5idWZmZXIsZG9uZTohMX19Y2FuY2VsKGUpe3RoaXMuX3JlYWRlci5jYW5jZWwoZSl9fWNsYXNzIFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVye2NvbnN0cnVjdG9yKGUsdCxhKXt0aGlzLl9tc2dIYW5kbGVyPWE7dGhpcy5vblByb2dyZXNzPW51bGw7Y29uc3Qgcj10aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJHZXRSYW5nZVJlYWRlciIse2JlZ2luOmUsZW5kOnR9KTt0aGlzLl9yZWFkZXI9ci5nZXRSZWFkZXIoKX1nZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKXtyZXR1cm4hMX1hc3luYyByZWFkKCl7Y29uc3R7dmFsdWU6ZSxkb25lOnR9PWF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7cmV0dXJuIHQ/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfTp7dmFsdWU6ZS5idWZmZXIsZG9uZTohMX19Y2FuY2VsKGUpe3RoaXMuX3JlYWRlci5jYW5jZWwoZSl9fX1dLHQ9e307ZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhhKXt2YXIgcj10W2FdO2lmKHZvaWQgMCE9PXIpcmV0dXJuIHIuZXhwb3J0czt2YXIgbj10W2FdPXtleHBvcnRzOnt9fTtlW2FdLmNhbGwobi5leHBvcnRzLG4sbi5leHBvcnRzLF9fd19wZGZqc19yZXF1aXJlX18pO3JldHVybiBuLmV4cG9ydHN9X193X3BkZmpzX3JlcXVpcmVfXy5kPShlLHQpPT57Zm9yKHZhciBhIGluIHQpX193X3BkZmpzX3JlcXVpcmVfXy5vKHQsYSkmJiFfX3dfcGRmanNfcmVxdWlyZV9fLm8oZSxhKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsYSx7ZW51bWVyYWJsZTohMCxnZXQ6dFthXX0pfTtfX3dfcGRmanNfcmVxdWlyZV9fLm89KGUsdCk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpO19fd19wZGZqc19yZXF1aXJlX18ucj1lPT57InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX07dmFyIGE9e307KCgpPT57InVzZSBzdHJpY3QiO3ZhciBlPWE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJXb3JrZXJNZXNzYWdlSGFuZGxlciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuV29ya2VyTWVzc2FnZUhhbmRsZXJ9fSk7dmFyIHQ9X193X3BkZmpzX3JlcXVpcmVfXygxKX0pKCk7cmV0dXJuIGF9KSgpKSk7'; \ No newline at end of file +export const workerStr = 'KCgpPT57InVzZSBzdHJpY3QiO3ZhciBlPXs3NzU3OihlLHQscik9Pnt2YXIgbixhO2Z1bmN0aW9uIGkoZSx0LHIpe3JldHVybih0PWZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUsdCl7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSlyZXR1cm4gZTt2YXIgcj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIG49ci5jYWxsKGUsInN0cmluZyIpO2lmKCJvYmplY3QiIT10eXBlb2YgbilyZXR1cm4gbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybiBTdHJpbmcoZSl9KGUpO3JldHVybiJzeW1ib2wiPT10eXBlb2YgdD90OlN0cmluZyh0KX0odCkpaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1yLGV9ZnVuY3Rpb24gcyhlLHQpe2woZSx0KSx0LmFkZChlKX1mdW5jdGlvbiBvKGUsdCxyKXtpZighdC5oYXMoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZSIpO3JldHVybiByfWZ1bmN0aW9uIGMoZSx0LHIpe2woZSx0KSx0LnNldChlLHIpfWZ1bmN0aW9uIGwoZSx0KXtpZih0LmhhcyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdCIpfWZ1bmN0aW9uIGgoZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5nZXQ/dC5nZXQuY2FsbChlKTp0LnZhbHVlfShlLGQoZSx0LCJnZXQiKSl9ZnVuY3Rpb24gdShlLHQscil7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyKXtpZih0LnNldCl0LnNldC5jYWxsKGUscik7ZWxzZXtpZighdC53cml0YWJsZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gc2V0IHJlYWQgb25seSBwcml2YXRlIGZpZWxkIik7dC52YWx1ZT1yfX0oZSxkKGUsdCwic2V0Iikscikscn1mdW5jdGlvbiBkKGUsdCxyKXtpZighdC5oYXMoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvICIrcisiIHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlIik7cmV0dXJuIHQuZ2V0KGUpfXIoNTgzNykscigxNzAzKSxyKDk1NzUpLHIoMjQ3Mikscig4Njc1KSxyKDMxMDUpLHIoMzQwOCkscigyOTU4KSxyKDM0NjIpLHIoMzgyNCkscigyOTc0KSxyKDE0MzkpLHIoNzU4NSkscig1MzE1KSxyKDM5NDgpLHIoNzY1OCkscig4Njc0KSxyKDc3MjcpLHIoNDk0NCkscigzNzkyKSxyKDk3MTQpLHIoMTU1MCkscig0OTE2KSxyKDMxMjMpLHIoMTgxNykscig0NzIzKSxyKDYzMTQpLHIoNTMwNikscig3NjAxKSxyKDEyOTkpLHIoNzYzNSkscig4MjY0KSxyKDcyODcpLHIoOTc0MykscigyNzA3KSxyKDU1ODEpLHIoNzE0NSkscig2Njk5KSxyKDIwMjMpLHIoNjc1NSkscigyODUpLHIoMTYzNykscig2MjI5KSxyKDczMzApLHIoMjA2Mikscig4NzU3KSxyKDkxMzUpLHIoNDEyOSkscig2OTc3KSxyKDEwNTgpLHIoNDYwMykscig4NDUwKSxyKDQ2NzgpLHIoOTYwMSkscigyMjYyKSxyKDIwODcpLHIoNTQxKSxyKDMyMTApLHIoNTgyNykscig1NDM4KSxyKDgyNTUpLHIoNDE5Nykscig1MTI1KSxyKDQ1MDYpLHIoNTEwOSkscig2NDk1KSxyKDg4NjIpLHIoNzg1Mikscig3NzE0KSxyKDI4MDEpLHIoMTE3NCkscig3OTIyKSxlPXIuaG1kKGUpLG49Z2xvYmFsVGhpcyxhPSgpPT4oKCk9Pnt2YXIgZT1bLChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Xb3JrZXJUYXNrPXQuV29ya2VyTWVzc2FnZUhhbmRsZXI9dm9pZCAwLHIoMikscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTE2KSxyKDEyNikscigxMjgpLHIoMTMxKSxyKDEzMykscigxMzUpLHIoMTM3KSxyKDEzOSkscigxNDMpO3ZhciBuPXIoMTQ0KSxhPXIoMTQ5KSxpPXIoMTUwKSxzPXIoMTUyKSxvPXIoMTU2KSxjPXIoMjIyKSxsPXIoMjE2KSxoPXIoMjU3KSx1PXIoMjU4KTtjbGFzcyBke2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZT1lLHRoaXMudGVybWluYXRlZD0hMSx0aGlzLl9jYXBhYmlsaXR5PW5ldyBuLlByb21pc2VDYXBhYmlsaXR5fWdldCBmaW5pc2hlZCgpe3JldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2V9ZmluaXNoKCl7dGhpcy5fY2FwYWJpbGl0eS5yZXNvbHZlKCl9dGVybWluYXRlKCl7dGhpcy50ZXJtaW5hdGVkPSEwfWVuc3VyZU5vdFRlcm1pbmF0ZWQoKXtpZih0aGlzLnRlcm1pbmF0ZWQpdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgdGFzayB3YXMgdGVybWluYXRlZCIpfX10LldvcmtlclRhc2s9ZDtjbGFzcyBme3N0YXRpYyBzZXR1cChlLHQpe2xldCByPSExO2Uub24oInRlc3QiLChmdW5jdGlvbih0KXtyfHwocj0hMCxlLnNlbmQoInRlc3QiLHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl9KSksZS5vbigiY29uZmlndXJlIiwoZnVuY3Rpb24oZSl7KDAsbi5zZXRWZXJib3NpdHlMZXZlbCkoZS52ZXJib3NpdHkpfSkpLGUub24oIkdldERvY1JlcXVlc3QiLChmdW5jdGlvbihlKXtyZXR1cm4gZi5jcmVhdGVEb2N1bWVudEhhbmRsZXIoZSx0KX0pKX1zdGF0aWMgY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGUsdCl7bGV0IHIsZj0hMSxnPW51bGw7Y29uc3QgcD1uZXcgU2V0LG09KDAsbi5nZXRWZXJib3NpdHlMZXZlbCkoKSx7ZG9jSWQ6YixhcGlWZXJzaW9uOnl9PWUsdz0iMy45LjE3OSI7aWYoeSE9PXcpdGhyb3cgbmV3IEVycm9yKCdUaGUgQVBJIHZlcnNpb24gIicuY29uY2F0KHksJyIgZG9lcyBub3QgbWF0Y2ggdGhlIFdvcmtlciB2ZXJzaW9uICInKS5jb25jYXQodywnIi4nKSk7Y29uc3Qgdj1bXTtmb3IoY29uc3QgZSBpbltdKXYucHVzaChlKTtpZih2Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBgQXJyYXkucHJvdG90eXBlYCBjb250YWlucyB1bmV4cGVjdGVkIGVudW1lcmFibGUgcHJvcGVydGllczogIit2LmpvaW4oIiwgIikrIjsgdGh1cyBicmVha2luZyBlLmcuIGBmb3IuLi5pbmAgaXRlcmF0aW9uIG9mIGBBcnJheWBzLiIpO2NvbnN0IHg9YisiX3dvcmtlciI7bGV0IFM9bmV3IGguTWVzc2FnZUhhbmRsZXIoeCxiLHQpO2Z1bmN0aW9uIEEoKXtpZihmKXRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIil9ZnVuY3Rpb24gayhlKXtwLmFkZChlKX1mdW5jdGlvbiBDKGUpe2UuZmluaXNoKCkscC5kZWxldGUoZSl9YXN5bmMgZnVuY3Rpb24gTyhlKXthd2FpdCByLmVuc3VyZURvYygiY2hlY2tIZWFkZXIiKSxhd2FpdCByLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKSxhd2FpdCByLmVuc3VyZURvYygicGFyc2UiLFtlXSksYXdhaXQgci5lbnN1cmVEb2MoImNoZWNrRmlyc3RQYWdlIixbZV0pLGF3YWl0IHIuZW5zdXJlRG9jKCJjaGVja0xhc3RQYWdlIixbZV0pO2NvbnN0IHQ9YXdhaXQgci5lbnN1cmVEb2MoImlzUHVyZVhmYSIpO2lmKHQpe2NvbnN0IGU9bmV3IGQoImxvYWRYZmFGb250cyIpO2soZSksYXdhaXQgUHJvbWlzZS5hbGwoW3IubG9hZFhmYUZvbnRzKFMsZSkuY2F0Y2goKGU9Pnt9KSkudGhlbigoKCk9PkMoZSkpKSxyLmxvYWRYZmFJbWFnZXMoKV0pfWNvbnN0W24sYV09YXdhaXQgUHJvbWlzZS5hbGwoW3IuZW5zdXJlRG9jKCJudW1QYWdlcyIpLHIuZW5zdXJlRG9jKCJmaW5nZXJwcmludHMiKV0pO3JldHVybntudW1QYWdlczpuLGZpbmdlcnByaW50czphLGh0bWxGb3JYZmE6dD9hd2FpdCByLmVuc3VyZURvYygiaHRtbEZvclhmYSIpOm51bGx9fXJldHVybiBTLm9uKCJHZXRQYWdlIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIuZ2V0UGFnZShlLnBhZ2VJbmRleCkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKFtyLmVuc3VyZShlLCJyb3RhdGUiKSxyLmVuc3VyZShlLCJyZWYiKSxyLmVuc3VyZShlLCJ1c2VyVW5pdCIpLHIuZW5zdXJlKGUsInZpZXciKV0pLnRoZW4oKGZ1bmN0aW9uKGUpe2xldFt0LHIsbixhXT1lO3JldHVybntyb3RhdGU6dCxyZWY6cix1c2VyVW5pdDpuLHZpZXc6YX19KSl9KSl9KSksUy5vbigiR2V0UGFnZUluZGV4IiwoZnVuY3Rpb24oZSl7Y29uc3QgdD1pLlJlZi5nZXQoZS5udW0sZS5nZW4pO3JldHVybiByLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsW3RdKX0pKSxTLm9uKCJHZXREZXN0aW5hdGlvbnMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJkZXN0aW5hdGlvbnMiKX0pKSxTLm9uKCJHZXREZXN0aW5hdGlvbiIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZUNhdGFsb2coImdldERlc3RpbmF0aW9uIixbZS5pZF0pfSkpLFMub24oIkdldFBhZ2VMYWJlbHMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJwYWdlTGFiZWxzIil9KSksUy5vbigiR2V0UGFnZUxheW91dCIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZUNhdGFsb2coInBhZ2VMYXlvdXQiKX0pKSxTLm9uKCJHZXRQYWdlTW9kZSIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZUNhdGFsb2coInBhZ2VNb2RlIil9KSksUy5vbigiR2V0Vmlld2VyUHJlZmVyZW5jZXMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJ2aWV3ZXJQcmVmZXJlbmNlcyIpfSkpLFMub24oIkdldE9wZW5BY3Rpb24iLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJvcGVuQWN0aW9uIil9KSksUy5vbigiR2V0QXR0YWNobWVudHMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJhdHRhY2htZW50cyIpfSkpLFMub24oIkdldEphdmFTY3JpcHQiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJqYXZhU2NyaXB0Iil9KSksUy5vbigiR2V0RG9jSlNBY3Rpb25zIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIil9KSksUy5vbigiR2V0UGFnZUpTQWN0aW9ucyIsKGZ1bmN0aW9uKGUpe2xldHtwYWdlSW5kZXg6dH09ZTtyZXR1cm4gci5nZXRQYWdlKHQpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZShlLCJqc0FjdGlvbnMiKX0pKX0pKSxTLm9uKCJHZXRPdXRsaW5lIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIuZW5zdXJlQ2F0YWxvZygiZG9jdW1lbnRPdXRsaW5lIil9KSksUy5vbigiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIuZW5zdXJlQ2F0YWxvZygib3B0aW9uYWxDb250ZW50Q29uZmlnIil9KSksUy5vbigiR2V0UGVybWlzc2lvbnMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJwZXJtaXNzaW9ucyIpfSkpLFMub24oIkdldE1ldGFkYXRhIiwoZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKFtyLmVuc3VyZURvYygiZG9jdW1lbnRJbmZvIiksci5lbnN1cmVDYXRhbG9nKCJtZXRhZGF0YSIpXSl9KSksUy5vbigiR2V0TWFya0luZm8iLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVDYXRhbG9nKCJtYXJrSW5mbyIpfSkpLFMub24oIkdldERhdGEiLChmdW5jdGlvbihlKXtyZXR1cm4gci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYnl0ZXN9KSl9KSksUy5vbigiR2V0QW5ub3RhdGlvbnMiLChmdW5jdGlvbihlKXtsZXR7cGFnZUluZGV4OnQsaW50ZW50Om59PWU7cmV0dXJuIHIuZ2V0UGFnZSh0KS50aGVuKChmdW5jdGlvbihlKXtjb25zdCByPW5ldyBkKCJHZXRBbm5vdGF0aW9uczogcGFnZSAiLmNvbmNhdCh0KSk7cmV0dXJuIGsociksZS5nZXRBbm5vdGF0aW9uc0RhdGEoUyxyLG4pLnRoZW4oKGU9PihDKHIpLGUpKSwoZT0+e3Rocm93IEMociksZX0pKX0pKX0pKSxTLm9uKCJHZXRGaWVsZE9iamVjdHMiLChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpfSkpLFMub24oIkhhc0pTQWN0aW9ucyIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZURvYygiaGFzSlNBY3Rpb25zIil9KSksUy5vbigiR2V0Q2FsY3VsYXRpb25PcmRlcklkcyIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmVuc3VyZURvYygiY2FsY3VsYXRpb25PcmRlcklkcyIpfSkpLFMub24oIlNhdmVEb2N1bWVudCIsKGFzeW5jIGZ1bmN0aW9uKGUpe2xldHtpc1B1cmVYZmE6dCxudW1QYWdlczpzLGFubm90YXRpb25TdG9yYWdlOmMsZmlsZW5hbWU6aH09ZTtjb25zdCB1PVtyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKSxyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIiksci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybVJlZiIpLHIuZW5zdXJlRG9jKCJzdGFydFhSZWYiKSxyLmVuc3VyZURvYygibGluZWFyaXphdGlvbiIpXSxmPXQ/bnVsbDooMCxhLmdldE5ld0Fubm90YXRpb25zTWFwKShjKSxnPWF3YWl0IHIuZW5zdXJlRG9jKCJ4cmVmIik7aWYoZil7Y29uc3QgZT1vLkFubm90YXRpb25GYWN0b3J5LmdlbmVyYXRlSW1hZ2VzKGMudmFsdWVzKCksZyxyLmV2YWx1YXRvck9wdGlvbnMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpO2Zvcihjb25zdFt0LG5db2YgZil1LnB1c2goci5nZXRQYWdlKHQpLnRoZW4oKHI9Pntjb25zdCBhPW5ldyBkKCJTYXZlIChlZGl0b3IpOiBwYWdlICIuY29uY2F0KHQpKTtyZXR1cm4gci5zYXZlTmV3QW5ub3RhdGlvbnMoUyxhLG4sZSkuZmluYWxseSgoZnVuY3Rpb24oKXtDKGEpfSkpfSkpKX1pZih0KXUucHVzaChyLnNlcmlhbGl6ZVhmYURhdGEoYykpO2Vsc2UgZm9yKGxldCBlPTA7ZTxzO2UrKyl1LnB1c2goci5nZXRQYWdlKGUpLnRoZW4oKGZ1bmN0aW9uKHQpe2NvbnN0IHI9bmV3IGQoIlNhdmU6IHBhZ2UgIi5jb25jYXQoZSkpO3JldHVybiB0LnNhdmUoUyxyLGMpLmZpbmFsbHkoKGZ1bmN0aW9uKCl7QyhyKX0pKX0pKSk7cmV0dXJuIFByb21pc2UuYWxsKHUpLnRoZW4oKGZ1bmN0aW9uKGUpe2xldFtyLGEscyxvLGMsLi4udV09ZSxkPVtdLGY9bnVsbDtpZih0KXtpZihmPXVbMF0sIWYpcmV0dXJuIHIuYnl0ZXN9ZWxzZSBpZihkPXUuZmxhdCgyKSwwPT09ZC5sZW5ndGgpcmV0dXJuIHIuYnl0ZXM7Y29uc3QgcD1zJiZhIGluc3RhbmNlb2YgaS5EaWN0JiZkLnNvbWUoKGU9PmUubmVlZEFwcGVhcmFuY2VzKSksbT1hIGluc3RhbmNlb2YgaS5EaWN0JiZhLmdldCgiWEZBIil8fG51bGw7bGV0IGI9bnVsbCx5PSExO2lmKEFycmF5LmlzQXJyYXkobSkpe2ZvcihsZXQgZT0wLHQ9bS5sZW5ndGg7ZTx0O2UrPTIpImRhdGFzZXRzIj09PW1bZV0mJihiPW1bZSsxXSx5PSEwKTtudWxsPT09YiYmKGI9Zy5nZXROZXdUZW1wb3JhcnlSZWYoKSl9ZWxzZSBtJiYoMCxuLndhcm4pKCJVbnN1cHBvcnRlZCBYRkEgdHlwZS4iKTtsZXQgdz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGcudHJhaWxlcil7dmFyIHY7Y29uc3QgZT1PYmplY3QuY3JlYXRlKG51bGwpLHQ9Zy50cmFpbGVyLmdldCgiSW5mbyIpfHxudWxsO3QgaW5zdGFuY2VvZiBpLkRpY3QmJnQuZm9yRWFjaCgoKHQscik9Pnsic3RyaW5nIj09dHlwZW9mIHImJihlW3RdPSgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKHIpKX0pKSx3PXtyb290UmVmOmcudHJhaWxlci5nZXRSYXcoIlJvb3QiKXx8bnVsbCxlbmNyeXB0UmVmOmcudHJhaWxlci5nZXRSYXcoIkVuY3J5cHQiKXx8bnVsbCxuZXdSZWY6Zy5nZXROZXdUZW1wb3JhcnlSZWYoKSxpbmZvUmVmOmcudHJhaWxlci5nZXRSYXcoIkluZm8iKXx8bnVsbCxpbmZvOmUsZmlsZUlkczpnLnRyYWlsZXIuZ2V0KCJJRCIpfHxudWxsLHN0YXJ0WFJlZjpjP286bnVsbCE9PSh2PWcubGFzdFhSZWZTdHJlYW1Qb3MpJiZ2b2lkIDAhPT12P3Y6byxmaWxlbmFtZTpofX1yZXR1cm4oMCxsLmluY3JlbWVudGFsVXBkYXRlKSh7b3JpZ2luYWxEYXRhOnIuYnl0ZXMseHJlZkluZm86dyxuZXdSZWZzOmQseHJlZjpnLGhhc1hmYTohIW0seGZhRGF0YXNldHNSZWY6YixoYXNYZmFEYXRhc2V0c0VudHJ5OnksbmVlZEFwcGVhcmFuY2VzOnAsYWNyb0Zvcm1SZWY6cyxhY3JvRm9ybTphLHhmYURhdGE6Zn0pLmZpbmFsbHkoKCgpPT57Zy5yZXNldE5ld1RlbXBvcmFyeVJlZigpfSkpfSkpfSkpLFMub24oIkdldE9wZXJhdG9yTGlzdCIsKGZ1bmN0aW9uKGUsdCl7Y29uc3QgYT1lLnBhZ2VJbmRleDtyLmdldFBhZ2UoYSkudGhlbigoZnVuY3Rpb24ocil7Y29uc3QgaT1uZXcgZCgiR2V0T3BlcmF0b3JMaXN0OiBwYWdlICIuY29uY2F0KGEpKTtrKGkpO2NvbnN0IHM9bT49bi5WZXJib3NpdHlMZXZlbC5JTkZPUz9EYXRlLm5vdygpOjA7ci5nZXRPcGVyYXRvckxpc3Qoe2hhbmRsZXI6UyxzaW5rOnQsdGFzazppLGludGVudDplLmludGVudCxjYWNoZUtleTplLmNhY2hlS2V5LGFubm90YXRpb25TdG9yYWdlOmUuYW5ub3RhdGlvblN0b3JhZ2V9KS50aGVuKChmdW5jdGlvbihlKXtDKGkpLHMmJigwLG4uaW5mbykoInBhZ2U9Ii5jb25jYXQoYSsxLCIgLSBnZXRPcGVyYXRvckxpc3Q6IHRpbWU9IikuY29uY2F0KERhdGUubm93KCktcywibXMsIGxlbj0iKS5jb25jYXQoZS5sZW5ndGgpKSx0LmNsb3NlKCl9KSwoZnVuY3Rpb24oZSl7QyhpKSxpLnRlcm1pbmF0ZWR8fHQuZXJyb3IoZSl9KSl9KSl9KSksUy5vbigiR2V0VGV4dENvbnRlbnQiLChmdW5jdGlvbihlLHQpe2NvbnN0e3BhZ2VJbmRleDphLGluY2x1ZGVNYXJrZWRDb250ZW50OmksZGlzYWJsZU5vcm1hbGl6YXRpb246c309ZTtyLmdldFBhZ2UoYSkudGhlbigoZnVuY3Rpb24oZSl7Y29uc3Qgcj1uZXcgZCgiR2V0VGV4dENvbnRlbnQ6IHBhZ2UgIithKTtrKHIpO2NvbnN0IG89bT49bi5WZXJib3NpdHlMZXZlbC5JTkZPUz9EYXRlLm5vdygpOjA7ZS5leHRyYWN0VGV4dENvbnRlbnQoe2hhbmRsZXI6Uyx0YXNrOnIsc2luazp0LGluY2x1ZGVNYXJrZWRDb250ZW50OmksZGlzYWJsZU5vcm1hbGl6YXRpb246c30pLnRoZW4oKGZ1bmN0aW9uKCl7QyhyKSxvJiYoMCxuLmluZm8pKCJwYWdlPSIuY29uY2F0KGErMSwiIC0gZ2V0VGV4dENvbnRlbnQ6IHRpbWU9IikrKERhdGUubm93KCktbykrIm1zIiksdC5jbG9zZSgpfSksKGZ1bmN0aW9uKGUpe0Mociksci50ZXJtaW5hdGVkfHx0LmVycm9yKGUpfSkpfSkpfSkpLFMub24oIkdldFN0cnVjdFRyZWUiLChmdW5jdGlvbihlKXtyZXR1cm4gci5nZXRQYWdlKGUucGFnZUluZGV4KS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gci5lbnN1cmUoZSwiZ2V0U3RydWN0VHJlZSIpfSkpfSkpLFMub24oIkZvbnRGYWxsYmFjayIsKGZ1bmN0aW9uKGUpe3JldHVybiByLmZvbnRGYWxsYmFjayhlLmlkLFMpfSkpLFMub24oIkNsZWFudXAiLChmdW5jdGlvbihlKXtyZXR1cm4gci5jbGVhbnVwKCEwKX0pKSxTLm9uKCJUZXJtaW5hdGUiLChmdW5jdGlvbihlKXtmPSEwO2NvbnN0IHQ9W107aWYocil7ci50ZXJtaW5hdGUobmV3IG4uQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7Y29uc3QgZT1yLmNsZWFudXAoKTt0LnB1c2goZSkscj1udWxsfWVsc2UoMCxjLmNsZWFyR2xvYmFsQ2FjaGVzKSgpO2cmJmcobmV3IG4uQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7Zm9yKGNvbnN0IGUgb2YgcCl0LnB1c2goZS5maW5pc2hlZCksZS50ZXJtaW5hdGUoKTtyZXR1cm4gUHJvbWlzZS5hbGwodCkudGhlbigoZnVuY3Rpb24oKXtTLmRlc3Ryb3koKSxTPW51bGx9KSl9KSksUy5vbigiUmVhZHkiLChmdW5jdGlvbih0KXshZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtBKCksUy5zZW5kKCJHZXREb2MiLHtwZGZJbmZvOmV9KX1mdW5jdGlvbiBpKGUpe2lmKEEoKSxlIGluc3RhbmNlb2Ygbi5QYXNzd29yZEV4Y2VwdGlvbil7Y29uc3QgdD1uZXcgZCgiUGFzc3dvcmRFeGNlcHRpb246IHJlc3BvbnNlICIuY29uY2F0KGUuY29kZSkpO2sodCksUy5zZW5kV2l0aFByb21pc2UoIlBhc3N3b3JkUmVxdWVzdCIsZSkudGhlbigoZnVuY3Rpb24oZSl7bGV0e3Bhc3N3b3JkOm59PWU7Qyh0KSxyLnVwZGF0ZVBhc3N3b3JkKG4pLG8oKX0pKS5jYXRjaCgoZnVuY3Rpb24oKXtDKHQpLFMuc2VuZCgiRG9jRXhjZXB0aW9uIixlKX0pKX1lbHNlIGUgaW5zdGFuY2VvZiBuLkludmFsaWRQREZFeGNlcHRpb258fGUgaW5zdGFuY2VvZiBuLk1pc3NpbmdQREZFeGNlcHRpb258fGUgaW5zdGFuY2VvZiBuLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbnx8ZSBpbnN0YW5jZW9mIG4uVW5rbm93bkVycm9yRXhjZXB0aW9uP1Muc2VuZCgiRG9jRXhjZXB0aW9uIixlKTpTLnNlbmQoIkRvY0V4Y2VwdGlvbiIsbmV3IG4uVW5rbm93bkVycm9yRXhjZXB0aW9uKGUubWVzc2FnZSxlLnRvU3RyaW5nKCkpKX1mdW5jdGlvbiBvKCl7QSgpLE8oITEpLnRoZW4odCwoZnVuY3Rpb24oZSl7QSgpLGUgaW5zdGFuY2VvZiBhLlhSZWZQYXJzZUV4Y2VwdGlvbj9yLnJlcXVlc3RMb2FkZWRTdHJlYW0oKS50aGVuKChmdW5jdGlvbigpe0EoKSxPKCEwKS50aGVuKHQsaSl9KSk6aShlKX0pKX1BKCksZnVuY3Rpb24oZSl7bGV0e2RhdGE6dCxwYXNzd29yZDpyLGRpc2FibGVBdXRvRmV0Y2g6aSxyYW5nZUNodW5rU2l6ZTpvLGxlbmd0aDpjLGRvY0Jhc2VVcmw6bCxlbmFibGVYZmE6aCxldmFsdWF0b3JPcHRpb25zOmR9PWU7Y29uc3QgZj17c291cmNlOm51bGwsZGlzYWJsZUF1dG9GZXRjaDppLGRvY0Jhc2VVcmw6bCxkb2NJZDpiLGVuYWJsZVhmYTpoLGV2YWx1YXRvck9wdGlvbnM6ZCxoYW5kbGVyOlMsbGVuZ3RoOmMscGFzc3dvcmQ6cixyYW5nZUNodW5rU2l6ZTpvfSxwPW5ldyBuLlByb21pc2VDYXBhYmlsaXR5O2xldCBtO2lmKHQpe3RyeXtmLnNvdXJjZT10LG09bmV3IHMuTG9jYWxQZGZNYW5hZ2VyKGYpLHAucmVzb2x2ZShtKX1jYXRjaChlKXtwLnJlamVjdChlKX1yZXR1cm4gcC5wcm9taXNlfWxldCB5LHc9W107dHJ5e3k9bmV3IHUuUERGV29ya2VyU3RyZWFtKFMpfWNhdGNoKGUpe3JldHVybiBwLnJlamVjdChlKSxwLnByb21pc2V9Y29uc3Qgdj15LmdldEZ1bGxSZWFkZXIoKTt2LmhlYWRlcnNSZWFkeS50aGVuKChmdW5jdGlvbigpe2lmKHYuaXNSYW5nZVN1cHBvcnRlZCl7Zi5zb3VyY2U9eSxmLmxlbmd0aD12LmNvbnRlbnRMZW5ndGgsZi5kaXNhYmxlQXV0b0ZldGNofHwoZi5kaXNhYmxlQXV0b0ZldGNoPXYuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpLG09bmV3IHMuTmV0d29ya1BkZk1hbmFnZXIoZik7Zm9yKGNvbnN0IGUgb2YgdyltLnNlbmRQcm9ncmVzc2l2ZURhdGEoZSk7dz1bXSxwLnJlc29sdmUobSksZz1udWxsfX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cC5yZWplY3QoZSksZz1udWxsfSkpO2xldCB4PTA7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe3YucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIGUocil7bGV0e3ZhbHVlOmksZG9uZTpvfT1yO3RyeXtpZihBKCksbylyZXR1cm4gbXx8ZnVuY3Rpb24oKXtjb25zdCBlPSgwLGEuYXJyYXlCdWZmZXJzVG9CeXRlcykodyk7YyYmZS5sZW5ndGghPT1jJiYoMCxuLndhcm4pKCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWwiKTt0cnl7Zi5zb3VyY2U9ZSxtPW5ldyBzLkxvY2FsUGRmTWFuYWdlcihmKSxwLnJlc29sdmUobSl9Y2F0Y2goZSl7cC5yZWplY3QoZSl9dz1bXX0oKSx2b2lkKGc9bnVsbCk7eCs9aS5ieXRlTGVuZ3RoLHYuaXNTdHJlYW1pbmdTdXBwb3J0ZWR8fFMuc2VuZCgiRG9jUHJvZ3Jlc3MiLHtsb2FkZWQ6eCx0b3RhbDpNYXRoLm1heCh4LHYuY29udGVudExlbmd0aHx8MCl9KSxtP20uc2VuZFByb2dyZXNzaXZlRGF0YShpKTp3LnB1c2goaSksdi5yZWFkKCkudGhlbihlLHQpfWNhdGNoKHIpe3Qocil9fSksdCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3AucmVqZWN0KGUpLGc9bnVsbH0pKSxnPWZ1bmN0aW9uKGUpe3kuY2FuY2VsQWxsUmVxdWVzdHMoZSl9LHAucHJvbWlzZX0oZSkudGhlbigoZnVuY3Rpb24oZSl7aWYoZil0aHJvdyBlLnRlcm1pbmF0ZShuZXcgbi5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKSxuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpO3I9ZSxyLnJlcXVlc3RMb2FkZWRTdHJlYW0oITApLnRoZW4oKGU9PntTLnNlbmQoIkRhdGFMb2FkZWQiLHtsZW5ndGg6ZS5ieXRlcy5ieXRlTGVuZ3RofSl9KSl9KSkudGhlbihvLGkpfShlKSxlPW51bGx9KSkseH1zdGF0aWMgaW5pdGlhbGl6ZUZyb21Qb3J0KGUpe2NvbnN0IHQ9bmV3IGguTWVzc2FnZUhhbmRsZXIoIndvcmtlciIsIm1haW4iLGUpO2Yuc2V0dXAodCxlKSx0LnNlbmQoInJlYWR5IixudWxsKX19dC5Xb3JrZXJNZXNzYWdlSGFuZGxlcj1mLCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93JiYhbi5pc05vZGVKUyYmInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5wb3N0TWVzc2FnZSYmIm9ubWVzc2FnZSJpbiBlfShzZWxmKSYmZi5pbml0aWFsaXplRnJvbVBvcnQoc2VsZil9LChlLHQscik9Pnt2YXIgbj1yKDMpLGE9cig0KSxpPXIoNjkpLHM9cig3MCksbz0iV2ViQXNzZW1ibHkiLGM9YVtvXSxsPTchPT1FcnJvcigiZSIse2NhdXNlOjd9KS5jYXVzZSxoPWZ1bmN0aW9uKGUsdCl7dmFyIHI9e307cltlXT1zKGUsdCxsKSxuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsYXJpdHk6MSxmb3JjZWQ6bH0scil9LHU9ZnVuY3Rpb24oZSx0KXtpZihjJiZjW2VdKXt2YXIgcj17fTtyW2VdPXMobysiLiIrZSx0LGwpLG4oe3RhcmdldDpvLHN0YXQ6ITAsY29uc3RydWN0b3I6ITAsYXJpdHk6MSxmb3JjZWQ6bH0scil9fTtoKCJFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiRXZhbEVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSxoKCJSYW5nZUVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSxoKCJSZWZlcmVuY2VFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiU3ludGF4RXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpLGgoIlR5cGVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiVVJJRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpLHUoIkNvbXBpbGVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksdSgiTGlua0Vycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSx1KCJSdW50aW1lRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpfSwoZSx0LHIpPT57dmFyIG49cig0KSxhPXIoNSkuZixpPXIoNDQpLHM9cig0OCksbz1yKDM4KSxjPXIoNTYpLGw9cig2OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHIsaCx1LGQsZixnPWUudGFyZ2V0LHA9ZS5nbG9iYWwsbT1lLnN0YXQ7aWYocj1wP246bT9uW2ddfHxvKGcse30pOihuW2ddfHx7fSkucHJvdG90eXBlKWZvcihoIGluIHQpe2lmKGQ9dFtoXSx1PWUuZG9udENhbGxHZXRTZXQ/KGY9YShyLGgpKSYmZi52YWx1ZTpyW2hdLCFsKHA/aDpnKyhtPyIuIjoiIyIpK2gsZS5mb3JjZWQpJiZ2b2lkIDAhPT11KXtpZih0eXBlb2YgZD09dHlwZW9mIHUpY29udGludWU7YyhkLHUpfShlLnNoYW18fHUmJnUuc2hhbSkmJmkoZCwic2hhbSIsITApLHMocixoLGQsZSl9fX0sZnVuY3Rpb24oZSl7dmFyIHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuTWF0aD09TWF0aCYmZX07ZS5leHBvcnRzPXQoIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzKXx8dCgib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93KXx8dCgib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYpfHx0KCJvYmplY3QiPT10eXBlb2Ygci5nJiZyLmcpfHxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfHx0aGlzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfSwoZSx0LHIpPT57dmFyIG49cig2KSxhPXIoOCksaT1yKDEwKSxzPXIoMTEpLG89cigxMiksYz1yKDE4KSxsPXIoMzkpLGg9cig0MiksdT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO3QuZj1uP3U6ZnVuY3Rpb24oZSx0KXtpZihlPW8oZSksdD1jKHQpLGgpdHJ5e3JldHVybiB1KGUsdCl9Y2F0Y2goZSl7fWlmKGwoZSx0KSlyZXR1cm4gcyghYShpLmYsZSx0KSxlW3RdKX19LChlLHQscik9Pnt2YXIgbj1yKDcpO2UuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LDEse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pWzFdfSkpfSxlPT57ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4hIWUoKX1jYXRjaChlKXtyZXR1cm4hMH19fSwoZSx0LHIpPT57dmFyIG49cig5KSxhPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsO2UuZXhwb3J0cz1uP2EuYmluZChhKTpmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGEsYXJndW1lbnRzKX19LChlLHQscik9Pnt2YXIgbj1yKDcpO2UuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe30uYmluZCgpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBlfHxlLmhhc093blByb3BlcnR5KCJwcm90b3R5cGUiKX0pKX0sKGUsdCk9Pnt2YXIgcj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsYT1uJiYhci5jYWxsKHsxOjJ9LDEpO3QuZj1hP2Z1bmN0aW9uKGUpe3ZhciB0PW4odGhpcyxlKTtyZXR1cm4hIXQmJnQuZW51bWVyYWJsZX06cn0sZT0+e2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybntlbnVtZXJhYmxlOiEoMSZlKSxjb25maWd1cmFibGU6ISgyJmUpLHdyaXRhYmxlOiEoNCZlKSx2YWx1ZTp0fX19LChlLHQscik9Pnt2YXIgbj1yKDEzKSxhPXIoMTYpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbihhKGUpKX19LChlLHQscik9Pnt2YXIgbj1yKDE0KSxhPXIoNyksaT1yKDE1KSxzPU9iamVjdCxvPW4oIiIuc3BsaXQpO2UuZXhwb3J0cz1hKChmdW5jdGlvbigpe3JldHVybiFzKCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIlN0cmluZyI9PWkoZSk/byhlLCIiKTpzKGUpfTpzfSwoZSx0LHIpPT57dmFyIG49cig5KSxhPUZ1bmN0aW9uLnByb3RvdHlwZSxpPWEuY2FsbCxzPW4mJmEuYmluZC5iaW5kKGksaSk7ZS5leHBvcnRzPW4/czpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaS5hcHBseShlLGFyZ3VtZW50cyl9fX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9bih7fS50b1N0cmluZyksaT1uKCIiLnNsaWNlKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGkoYShlKSw4LC0xKX19LChlLHQscik9Pnt2YXIgbj1yKDE3KSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobihlKSl0aHJvdyBhKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK2UpO3JldHVybiBlfX0sZT0+e2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZX19LChlLHQscik9Pnt2YXIgbj1yKDE5KSxhPXIoMjMpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKGUsInN0cmluZyIpO3JldHVybiBhKHQpP3Q6dCsiIn19LChlLHQscik9Pnt2YXIgbj1yKDgpLGE9cigyMCksaT1yKDIzKSxzPXIoMzApLG89cigzMyksYz1yKDM0KSxsPVR5cGVFcnJvcixoPWMoInRvUHJpbWl0aXZlIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoIWEoZSl8fGkoZSkpcmV0dXJuIGU7dmFyIHIsYz1zKGUsaCk7aWYoYyl7aWYodm9pZCAwPT09dCYmKHQ9ImRlZmF1bHQiKSxyPW4oYyxlLHQpLCFhKHIpfHxpKHIpKXJldHVybiByO3Rocm93IGwoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfXJldHVybiB2b2lkIDA9PT10JiYodD0ibnVtYmVyIiksbyhlLHQpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMjEpLGE9cigyMiksaT1hLmFsbDtlLmV4cG9ydHM9YS5JU19IVE1MRERBP2Z1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZT9udWxsIT09ZTpuKGUpfHxlPT09aX06ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP251bGwhPT1lOm4oZSl9fSwoZSx0LHIpPT57dmFyIG49cigyMiksYT1uLmFsbDtlLmV4cG9ydHM9bi5JU19IVE1MRERBP2Z1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfHxlPT09YX06ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9fSxlPT57dmFyIHQ9Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuYWxsLHI9dm9pZCAwPT09dCYmdm9pZCAwIT09dDtlLmV4cG9ydHM9e2FsbDp0LElTX0hUTUxEREE6cn19LChlLHQscik9Pnt2YXIgbj1yKDI0KSxhPXIoMjEpLGk9cigyNSkscz1yKDI2KSxvPU9iamVjdDtlLmV4cG9ydHM9cz9mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3ZhciB0PW4oIlN5bWJvbCIpO3JldHVybiBhKHQpJiZpKHQucHJvdG90eXBlLG8oZSkpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDIxKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyPyhyPW5bZV0sYShyKT9yOnZvaWQgMCk6bltlXSYmbltlXVt0XTt2YXIgcn19LChlLHQscik9Pnt2YXIgbj1yKDE0KTtlLmV4cG9ydHM9bih7fS5pc1Byb3RvdHlwZU9mKX0sKGUsdCxyKT0+e3ZhciBuPXIoMjcpO2UuZXhwb3J0cz1uJiYhU3ltYm9sLnNoYW0mJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yfSwoZSx0LHIpPT57dmFyIG49cigyOCksYT1yKDcpLGk9cig0KS5TdHJpbmc7ZS5leHBvcnRzPSEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmIWEoKGZ1bmN0aW9uKCl7dmFyIGU9U3ltYm9sKCk7cmV0dXJuIWkoZSl8fCEoT2JqZWN0KGUpaW5zdGFuY2VvZiBTeW1ib2wpfHwhU3ltYm9sLnNoYW0mJm4mJm48NDF9KSl9LChlLHQscik9Pnt2YXIgbixhLGk9cig0KSxzPXIoMjkpLG89aS5wcm9jZXNzLGM9aS5EZW5vLGw9byYmby52ZXJzaW9uc3x8YyYmYy52ZXJzaW9uLGg9bCYmbC52ODtoJiYoYT0obj1oLnNwbGl0KCIuIikpWzBdPjAmJm5bMF08ND8xOisoblswXStuWzFdKSksIWEmJnMmJighKG49cy5tYXRjaCgvRWRnZVwvKFxkKykvKSl8fG5bMV0+PTc0KSYmKG49cy5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pKSYmKGE9K25bMV0pLGUuZXhwb3J0cz1hfSxlPT57ZS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZTdHJpbmcobmF2aWdhdG9yLnVzZXJBZ2VudCl8fCIifSwoZSx0LHIpPT57dmFyIG49cigzMSksYT1yKDE3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lW3RdO3JldHVybiBhKHIpP3ZvaWQgMDpuKHIpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMjEpLGE9cigzMiksaT1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKG4oZSkpcmV0dXJuIGU7dGhyb3cgaShhKGUpKyIgaXMgbm90IGEgZnVuY3Rpb24iKX19LGU9Pnt2YXIgdD1TdHJpbmc7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gdChlKX1jYXRjaChlKXtyZXR1cm4iT2JqZWN0In19fSwoZSx0LHIpPT57dmFyIG49cig4KSxhPXIoMjEpLGk9cigyMCkscz1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbztpZigic3RyaW5nIj09PXQmJmEocj1lLnRvU3RyaW5nKSYmIWkobz1uKHIsZSkpKXJldHVybiBvO2lmKGEocj1lLnZhbHVlT2YpJiYhaShvPW4ocixlKSkpcmV0dXJuIG87aWYoInN0cmluZyIhPT10JiZhKHI9ZS50b1N0cmluZykmJiFpKG89bihyLGUpKSlyZXR1cm4gbzt0aHJvdyBzKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LChlLHQscik9Pnt2YXIgbj1yKDQpLGE9cigzNSksaT1yKDM5KSxzPXIoNDEpLG89cigyNyksYz1yKDI2KSxsPW4uU3ltYm9sLGg9YSgid2tzIiksdT1jP2wuZm9yfHxsOmwmJmwud2l0aG91dFNldHRlcnx8cztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGkoaCxlKXx8KGhbZV09byYmaShsLGUpP2xbZV06dSgiU3ltYm9sLiIrZSkpLGhbZV19fSwoZSx0LHIpPT57dmFyIG49cigzNiksYT1yKDM3KTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFbZV18fChhW2VdPXZvaWQgMCE9PXQ/dDp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOiIzLjMxLjEiLG1vZGU6bj8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE0LTIwMjMgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkiLGxpY2Vuc2U6Imh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2Jsb2IvdjMuMzEuMS9MSUNFTlNFIixzb3VyY2U6Imh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzIn0pfSxlPT57ZS5leHBvcnRzPSExfSwoZSx0LHIpPT57dmFyIG49cig0KSxhPXIoMzgpLGk9Il9fY29yZS1qc19zaGFyZWRfXyIscz1uW2ldfHxhKGkse30pO2UuZXhwb3J0cz1zfSwoZSx0LHIpPT57dmFyIG49cig0KSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt0cnl7YShuLGUse3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSl9Y2F0Y2gocil7bltlXT10fXJldHVybiB0fX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9cig0MCksaT1uKHt9Lmhhc093blByb3BlcnR5KTtlLmV4cG9ydHM9T2JqZWN0Lmhhc093bnx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShhKGUpLHQpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMTYpLGE9T2JqZWN0O2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gYShuKGUpKX19LChlLHQscik9Pnt2YXIgbj1yKDE0KSxhPTAsaT1NYXRoLnJhbmRvbSgpLHM9bigxLi50b1N0cmluZyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJTeW1ib2woIisodm9pZCAwPT09ZT8iIjplKSsiKV8iK3MoKythK2ksMzYpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNiksYT1yKDcpLGk9cig0Myk7ZS5leHBvcnRzPSFuJiYhYSgoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KGkoImRpdiIpLCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pKX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDIwKSxpPW4uZG9jdW1lbnQscz1hKGkpJiZhKGkuY3JlYXRlRWxlbWVudCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBzP2kuY3JlYXRlRWxlbWVudChlKTp7fX19LChlLHQscik9Pnt2YXIgbj1yKDYpLGE9cig0NSksaT1yKDExKTtlLmV4cG9ydHM9bj9mdW5jdGlvbihlLHQscil7cmV0dXJuIGEuZihlLHQsaSgxLHIpKX06ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlW3RdPXIsZX19LChlLHQscik9Pnt2YXIgbj1yKDYpLGE9cig0MiksaT1yKDQ2KSxzPXIoNDcpLG89cigxOCksYz1UeXBlRXJyb3IsbD1PYmplY3QuZGVmaW5lUHJvcGVydHksaD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHU9ImVudW1lcmFibGUiLGQ9ImNvbmZpZ3VyYWJsZSIsZj0id3JpdGFibGUiO3QuZj1uP2k/ZnVuY3Rpb24oZSx0LHIpe2lmKHMoZSksdD1vKHQpLHMociksImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJwcm90b3R5cGUiPT09dCYmInZhbHVlImluIHImJmYgaW4gciYmIXJbZl0pe3ZhciBuPWgoZSx0KTtuJiZuW2ZdJiYoZVt0XT1yLnZhbHVlLHI9e2NvbmZpZ3VyYWJsZTpkIGluIHI/cltkXTpuW2RdLGVudW1lcmFibGU6dSBpbiByP3JbdV06blt1XSx3cml0YWJsZTohMX0pfXJldHVybiBsKGUsdCxyKX06bDpmdW5jdGlvbihlLHQscil7aWYocyhlKSx0PW8odCkscyhyKSxhKXRyeXtyZXR1cm4gbChlLHQscil9Y2F0Y2goZSl7fWlmKCJnZXQiaW4gcnx8InNldCJpbiByKXRocm93IGMoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIHImJihlW3RdPXIudmFsdWUpLGV9fSwoZSx0LHIpPT57dmFyIG49cig2KSxhPXIoNyk7ZS5leHBvcnRzPW4mJmEoKGZ1bmN0aW9uKCl7cmV0dXJuIDQyIT1PYmplY3QuZGVmaW5lUHJvcGVydHkoKGZ1bmN0aW9uKCl7fSksInByb3RvdHlwZSIse3ZhbHVlOjQyLHdyaXRhYmxlOiExfSkucHJvdG90eXBlfSkpfSwoZSx0LHIpPT57dmFyIG49cigyMCksYT1TdHJpbmcsaT1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKG4oZSkpcmV0dXJuIGU7dGhyb3cgaShhKGUpKyIgaXMgbm90IGFuIG9iamVjdCIpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMjEpLGE9cig0NSksaT1yKDQ5KSxzPXIoMzgpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscixvKXtvfHwobz17fSk7dmFyIGM9by5lbnVtZXJhYmxlLGw9dm9pZCAwIT09by5uYW1lP28ubmFtZTp0O2lmKG4ocikmJmkocixsLG8pLG8uZ2xvYmFsKWM/ZVt0XT1yOnModCxyKTtlbHNle3RyeXtvLnVuc2FmZT9lW3RdJiYoYz0hMCk6ZGVsZXRlIGVbdF19Y2F0Y2goZSl7fWM/ZVt0XT1yOmEuZihlLHQse3ZhbHVlOnIsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6IW8ubm9uQ29uZmlndXJhYmxlLHdyaXRhYmxlOiFvLm5vbldyaXRhYmxlfSl9cmV0dXJuIGV9fSwoZSx0LHIpPT57dmFyIG49cigxNCksYT1yKDcpLGk9cigyMSkscz1yKDM5KSxvPXIoNiksYz1yKDUwKS5DT05GSUdVUkFCTEUsbD1yKDUxKSxoPXIoNTIpLHU9aC5lbmZvcmNlLGQ9aC5nZXQsZj1TdHJpbmcsZz1PYmplY3QuZGVmaW5lUHJvcGVydHkscD1uKCIiLnNsaWNlKSxtPW4oIiIucmVwbGFjZSksYj1uKFtdLmpvaW4pLHk9byYmIWEoKGZ1bmN0aW9uKCl7cmV0dXJuIDghPT1nKChmdW5jdGlvbigpe30pLCJsZW5ndGgiLHt2YWx1ZTo4fSkubGVuZ3RofSkpLHc9U3RyaW5nKFN0cmluZykuc3BsaXQoIlN0cmluZyIpLHY9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXsiU3ltYm9sKCI9PT1wKGYodCksMCw3KSYmKHQ9IlsiK20oZih0KSwvXlN5bWJvbFwoKFteKV0qKVwpLywiJDEiKSsiXSIpLHImJnIuZ2V0dGVyJiYodD0iZ2V0ICIrdCksciYmci5zZXR0ZXImJih0PSJzZXQgIit0KSwoIXMoZSwibmFtZSIpfHxjJiZlLm5hbWUhPT10KSYmKG8/ZyhlLCJuYW1lIix7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KTplLm5hbWU9dCkseSYmciYmcyhyLCJhcml0eSIpJiZlLmxlbmd0aCE9PXIuYXJpdHkmJmcoZSwibGVuZ3RoIix7dmFsdWU6ci5hcml0eX0pO3RyeXtyJiZzKHIsImNvbnN0cnVjdG9yIikmJnIuY29uc3RydWN0b3I/byYmZyhlLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pOmUucHJvdG90eXBlJiYoZS5wcm90b3R5cGU9dm9pZCAwKX1jYXRjaChlKXt9dmFyIG49dShlKTtyZXR1cm4gcyhuLCJzb3VyY2UiKXx8KG4uc291cmNlPWIodywic3RyaW5nIj09dHlwZW9mIHQ/dDoiIikpLGV9O0Z1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz12KChmdW5jdGlvbigpe3JldHVybiBpKHRoaXMpJiZkKHRoaXMpLnNvdXJjZXx8bCh0aGlzKX0pLCJ0b1N0cmluZyIpfSwoZSx0LHIpPT57dmFyIG49cig2KSxhPXIoMzkpLGk9RnVuY3Rpb24ucHJvdG90eXBlLHM9biYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixvPWEoaSwibmFtZSIpLGM9byYmInNvbWV0aGluZyI9PT1mdW5jdGlvbigpe30ubmFtZSxsPW8mJighbnx8biYmcyhpLCJuYW1lIikuY29uZmlndXJhYmxlKTtlLmV4cG9ydHM9e0VYSVNUUzpvLFBST1BFUjpjLENPTkZJR1VSQUJMRTpsfX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9cigyMSksaT1yKDM3KSxzPW4oRnVuY3Rpb24udG9TdHJpbmcpO2EoaS5pbnNwZWN0U291cmNlKXx8KGkuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gcyhlKX0pLGUuZXhwb3J0cz1pLmluc3BlY3RTb3VyY2V9LChlLHQscik9Pnt2YXIgbixhLGkscz1yKDUzKSxvPXIoNCksYz1yKDIwKSxsPXIoNDQpLGg9cigzOSksdT1yKDM3KSxkPXIoNTQpLGY9cig1NSksZz0iT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQiLHA9by5UeXBlRXJyb3IsbT1vLldlYWtNYXA7aWYoc3x8dS5zdGF0ZSl7dmFyIGI9dS5zdGF0ZXx8KHUuc3RhdGU9bmV3IG0pO2IuZ2V0PWIuZ2V0LGIuaGFzPWIuaGFzLGIuc2V0PWIuc2V0LG49ZnVuY3Rpb24oZSx0KXtpZihiLmhhcyhlKSl0aHJvdyBwKGcpO3JldHVybiB0LmZhY2FkZT1lLGIuc2V0KGUsdCksdH0sYT1mdW5jdGlvbihlKXtyZXR1cm4gYi5nZXQoZSl8fHt9fSxpPWZ1bmN0aW9uKGUpe3JldHVybiBiLmhhcyhlKX19ZWxzZXt2YXIgeT1kKCJzdGF0ZSIpO2ZbeV09ITAsbj1mdW5jdGlvbihlLHQpe2lmKGgoZSx5KSl0aHJvdyBwKGcpO3JldHVybiB0LmZhY2FkZT1lLGwoZSx5LHQpLHR9LGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSx5KT9lW3ldOnt9fSxpPWZ1bmN0aW9uKGUpe3JldHVybiBoKGUseSl9fWUuZXhwb3J0cz17c2V0Om4sZ2V0OmEsaGFzOmksZW5mb3JjZTpmdW5jdGlvbihlKXtyZXR1cm4gaShlKT9hKGUpOm4oZSx7fSl9LGdldHRlckZvcjpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI7aWYoIWModCl8fChyPWEodCkpLnR5cGUhPT1lKXRocm93IHAoIkluY29tcGF0aWJsZSByZWNlaXZlciwgIitlKyIgcmVxdWlyZWQiKTtyZXR1cm4gcn19fX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDIxKSxpPW4uV2Vha01hcDtlLmV4cG9ydHM9YShpKSYmL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhpKSl9LChlLHQscik9Pnt2YXIgbj1yKDM1KSxhPXIoNDEpLGk9bigia2V5cyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaVtlXXx8KGlbZV09YShlKSl9fSxlPT57ZS5leHBvcnRzPXt9fSwoZSx0LHIpPT57dmFyIG49cigzOSksYT1yKDU3KSxpPXIoNSkscz1yKDQ1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe2Zvcih2YXIgbz1hKHQpLGM9cy5mLGw9aS5mLGg9MDtoPG8ubGVuZ3RoO2grKyl7dmFyIHU9b1toXTtuKGUsdSl8fHImJm4ocix1KXx8YyhlLHUsbCh0LHUpKX19fSwoZSx0LHIpPT57dmFyIG49cigyNCksYT1yKDE0KSxpPXIoNTgpLHM9cig2Nyksbz1yKDQ3KSxjPWEoW10uY29uY2F0KTtlLmV4cG9ydHM9bigiUmVmbGVjdCIsIm93bktleXMiKXx8ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mKG8oZSkpLHI9cy5mO3JldHVybiByP2ModCxyKGUpKTp0fX0sKGUsdCxyKT0+e3ZhciBuPXIoNTkpLGE9cig2NikuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTt0LmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKGUpe3JldHVybiBuKGUsYSl9fSwoZSx0LHIpPT57dmFyIG49cigxNCksYT1yKDM5KSxpPXIoMTIpLHM9cig2MCkuaW5kZXhPZixvPXIoNTUpLGM9bihbXS5wdXNoKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcixuPWkoZSksbD0wLGg9W107Zm9yKHIgaW4gbikhYShvLHIpJiZhKG4scikmJmMoaCxyKTtmb3IoO3QubGVuZ3RoPmw7KWEobixyPXRbbCsrXSkmJih+cyhoLHIpfHxjKGgscikpO3JldHVybiBofX0sKGUsdCxyKT0+e3ZhciBuPXIoMTIpLGE9cig2MSksaT1yKDY0KSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LHIscyl7dmFyIG8sYz1uKHQpLGw9aShjKSxoPWEocyxsKTtpZihlJiZyIT1yKXtmb3IoO2w+aDspaWYoKG89Y1toKytdKSE9bylyZXR1cm4hMH1lbHNlIGZvcig7bD5oO2grKylpZigoZXx8aCBpbiBjKSYmY1toXT09PXIpcmV0dXJuIGV8fGh8fDA7cmV0dXJuIWUmJi0xfX07ZS5leHBvcnRzPXtpbmNsdWRlczpzKCEwKSxpbmRleE9mOnMoITEpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNjIpLGE9TWF0aC5tYXgsaT1NYXRoLm1pbjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1uKGUpO3JldHVybiByPDA/YShyK3QsMCk6aShyLHQpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNjMpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD0rZTtyZXR1cm4gdCE9dHx8MD09PXQ/MDpuKHQpfX0sZT0+e3ZhciB0PU1hdGguY2VpbCxyPU1hdGguZmxvb3I7ZS5leHBvcnRzPU1hdGgudHJ1bmN8fGZ1bmN0aW9uKGUpe3ZhciBuPStlO3JldHVybihuPjA/cjp0KShuKX19LChlLHQscik9Pnt2YXIgbj1yKDY1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZS5sZW5ndGgpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNjIpLGE9TWF0aC5taW47ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlPjA/YShuKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxlPT57ZS5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LChlLHQpPT57dC5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LChlLHQscik9Pnt2YXIgbj1yKDcpLGE9cigyMSksaT0vI3xcLnByb3RvdHlwZVwuLyxzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Y1tvKGUpXTtyZXR1cm4gcj09aHx8ciE9bCYmKGEodCk/bih0KTohIXQpfSxvPXMubm9ybWFsaXplPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZShpLCIuIikudG9Mb3dlckNhc2UoKX0sYz1zLmRhdGE9e30sbD1zLk5BVElWRT0iTiIsaD1zLlBPTFlGSUxMPSJQIjtlLmV4cG9ydHM9c30sKGUsdCxyKT0+e3ZhciBuPXIoOSksYT1GdW5jdGlvbi5wcm90b3R5cGUsaT1hLmFwcGx5LHM9YS5jYWxsO2UuZXhwb3J0cz0ib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuYXBwbHl8fChuP3MuYmluZChpKTpmdW5jdGlvbigpe3JldHVybiBzLmFwcGx5KGksYXJndW1lbnRzKX0pfSwoZSx0LHIpPT57dmFyIG49cigyNCksYT1yKDM5KSxpPXIoNDQpLHM9cigyNSksbz1yKDcxKSxjPXIoNTYpLGw9cig3NCksaD1yKDc1KSx1PXIoNzYpLGQ9cig4MCksZj1yKDgxKSxnPXIoNikscD1yKDM2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIsbSl7dmFyIGI9InN0YWNrVHJhY2VMaW1pdCIseT1tPzI6MSx3PWUuc3BsaXQoIi4iKSx2PXdbdy5sZW5ndGgtMV0seD1uLmFwcGx5KG51bGwsdyk7aWYoeCl7dmFyIFM9eC5wcm90b3R5cGU7aWYoIXAmJmEoUywiY2F1c2UiKSYmZGVsZXRlIFMuY2F1c2UsIXIpcmV0dXJuIHg7dmFyIEE9bigiRXJyb3IiKSxrPXQoKGZ1bmN0aW9uKGUsdCl7dmFyIHI9dShtP3Q6ZSx2b2lkIDApLG49bT9uZXcgeChlKTpuZXcgeDtyZXR1cm4gdm9pZCAwIT09ciYmaShuLCJtZXNzYWdlIixyKSxmKG4sayxuLnN0YWNrLDIpLHRoaXMmJnMoUyx0aGlzKSYmaChuLHRoaXMsayksYXJndW1lbnRzLmxlbmd0aD55JiZkKG4sYXJndW1lbnRzW3ldKSxufSkpO2lmKGsucHJvdG90eXBlPVMsIkVycm9yIiE9PXY/bz9vKGssQSk6YyhrLEEse25hbWU6ITB9KTpnJiZiIGluIHgmJihsKGsseCxiKSxsKGsseCwicHJlcGFyZVN0YWNrVHJhY2UiKSksYyhrLHgpLCFwKXRyeXtTLm5hbWUhPT12JiZpKFMsIm5hbWUiLHYpLFMuY29uc3RydWN0b3I9a31jYXRjaChlKXt9cmV0dXJuIGt9fX0sKGUsdCxyKT0+e3ZhciBuPXIoNzIpLGE9cig0NyksaT1yKDczKTtlLmV4cG9ydHM9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIGUsdD0hMSxyPXt9O3RyeXsoZT1uKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIsInNldCIpKShyLFtdKSx0PXIgaW5zdGFuY2VvZiBBcnJheX1jYXRjaChlKXt9cmV0dXJuIGZ1bmN0aW9uKHIsbil7cmV0dXJuIGEociksaShuKSx0P2UocixuKTpyLl9fcHJvdG9fXz1uLHJ9fSgpOnZvaWQgMCl9LChlLHQscik9Pnt2YXIgbj1yKDE0KSxhPXIoMzEpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dHJ5e3JldHVybiBuKGEoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpW3JdKSl9Y2F0Y2goZSl7fX19LChlLHQscik9Pnt2YXIgbj1yKDIxKSxhPVN0cmluZyxpPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlfHxuKGUpKXJldHVybiBlO3Rocm93IGkoIkNhbid0IHNldCAiK2EoZSkrIiBhcyBhIHByb3RvdHlwZSIpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNDUpLmY7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtyIGluIGV8fG4oZSxyLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbcl19LHNldDpmdW5jdGlvbihlKXt0W3JdPWV9fSl9fSwoZSx0LHIpPT57dmFyIG49cigyMSksYT1yKDIwKSxpPXIoNzEpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dmFyIHMsbztyZXR1cm4gaSYmbihzPXQuY29uc3RydWN0b3IpJiZzIT09ciYmYShvPXMucHJvdG90eXBlKSYmbyE9PXIucHJvdG90eXBlJiZpKGUsbyksZX19LChlLHQscik9Pnt2YXIgbj1yKDc3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09ZT9hcmd1bWVudHMubGVuZ3RoPDI/IiI6dDpuKGUpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNzgpLGE9U3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiU3ltYm9sIj09PW4oZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyIpO3JldHVybiBhKGUpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNzkpLGE9cigyMSksaT1yKDE1KSxzPXIoMzQpKCJ0b1N0cmluZ1RhZyIpLG89T2JqZWN0LGM9IkFyZ3VtZW50cyI9PWkoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKTtlLmV4cG9ydHM9bj9pOmZ1bmN0aW9uKGUpe3ZhciB0LHIsbjtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihyPWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBlW3RdfWNhdGNoKGUpe319KHQ9byhlKSxzKSk/cjpjP2kodCk6Ik9iamVjdCI9PShuPWkodCkpJiZhKHQuY2FsbGVlKT8iQXJndW1lbnRzIjpufX0sKGUsdCxyKT0+e3ZhciBuPXt9O25bcigzNCkoInRvU3RyaW5nVGFnIildPSJ6IixlLmV4cG9ydHM9IltvYmplY3Qgel0iPT09U3RyaW5nKG4pfSwoZSx0LHIpPT57dmFyIG49cigyMCksYT1yKDQ0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtuKHQpJiYiY2F1c2UiaW4gdCYmYShlLCJjYXVzZSIsdC5jYXVzZSl9fSwoZSx0LHIpPT57dmFyIG49cig0NCksYT1yKDgyKSxpPXIoODMpLHM9RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLG8pe2kmJihzP3MoZSx0KTpuKGUsInN0YWNrIixhKHIsbykpKX19LChlLHQscik9Pnt2YXIgbj1yKDE0KSxhPUVycm9yLGk9bigiIi5yZXBsYWNlKSxzPVN0cmluZyhhKCJ6eGNhc2QiKS5zdGFjayksbz0vXG5ccyphdCBbXjpdKjpbXlxuXSovLGM9by50ZXN0KHMpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKGMmJiJzdHJpbmciPT10eXBlb2YgZSYmIWEucHJlcGFyZVN0YWNrVHJhY2UpZm9yKDt0LS07KWU9aShlLG8sIiIpO3JldHVybiBlfX0sKGUsdCxyKT0+e3ZhciBuPXIoNyksYT1yKDExKTtlLmV4cG9ydHM9IW4oKGZ1bmN0aW9uKCl7dmFyIGU9RXJyb3IoImEiKTtyZXR1cm4hKCJzdGFjayJpbiBlKXx8KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdGFjayIsYSgxLDcpKSw3IT09ZS5zdGFjayl9KSl9LChlLHQscik9Pnt2YXIgbj1yKDg1KSxhPXIoOTApLmZpbmRMYXN0LGk9bi5hVHlwZWRBcnJheTsoMCxuLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QpKCJmaW5kTGFzdCIsKGZ1bmN0aW9uKGUpe3JldHVybiBhKGkodGhpcyksZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSl9LChlLHQscik9Pnt2YXIgbixhLGkscz1yKDg2KSxvPXIoNiksYz1yKDQpLGw9cigyMSksaD1yKDIwKSx1PXIoMzkpLGQ9cig3OCksZj1yKDMyKSxnPXIoNDQpLHA9cig0OCksbT1yKDg3KSxiPXIoMjUpLHk9cig4OCksdz1yKDcxKSx2PXIoMzQpLHg9cig0MSksUz1yKDUyKSxBPVMuZW5mb3JjZSxrPVMuZ2V0LEM9Yy5JbnQ4QXJyYXksTz1DJiZDLnByb3RvdHlwZSxGPWMuVWludDhDbGFtcGVkQXJyYXksST1GJiZGLnByb3RvdHlwZSxUPUMmJnkoQyksTT1PJiZ5KE8pLEU9T2JqZWN0LnByb3RvdHlwZSxQPWMuVHlwZUVycm9yLFI9digidG9TdHJpbmdUYWciKSxOPXgoIlRZUEVEX0FSUkFZX1RBRyIpLEQ9IlR5cGVkQXJyYXlDb25zdHJ1Y3RvciIsQj1zJiYhIXcmJiJPcGVyYSIhPT1kKGMub3BlcmEpLEw9ITEsXz17SW50OEFycmF5OjEsVWludDhBcnJheToxLFVpbnQ4Q2xhbXBlZEFycmF5OjEsSW50MTZBcnJheToyLFVpbnQxNkFycmF5OjIsSW50MzJBcnJheTo0LFVpbnQzMkFycmF5OjQsRmxvYXQzMkFycmF5OjQsRmxvYXQ2NEFycmF5Ojh9LGo9e0JpZ0ludDY0QXJyYXk6OCxCaWdVaW50NjRBcnJheTo4fSxVPWZ1bmN0aW9uKGUpe2lmKCFoKGUpKXJldHVybiExO3ZhciB0PWQoZSk7cmV0dXJuIHUoXyx0KXx8dShqLHQpfTtmb3IobiBpbiBfKShpPShhPWNbbl0pJiZhLnByb3RvdHlwZSk/QShpKVtEXT1hOkI9ITE7Zm9yKG4gaW4gaikoaT0oYT1jW25dKSYmYS5wcm90b3R5cGUpJiYoQShpKVtEXT1hKTtpZigoIUJ8fCFsKFQpfHxUPT09RnVuY3Rpb24ucHJvdG90eXBlKSYmKFQ9ZnVuY3Rpb24oKXt0aHJvdyBQKCJJbmNvcnJlY3QgaW52b2NhdGlvbiIpfSxCKSlmb3IobiBpbiBfKWNbbl0mJncoY1tuXSxUKTtpZigoIUJ8fCFNfHxNPT09RSkmJihNPVQucHJvdG90eXBlLEIpKWZvcihuIGluIF8pY1tuXSYmdyhjW25dLnByb3RvdHlwZSxNKTtpZihCJiZ5KEkpIT09TSYmdyhJLE0pLG8mJiF1KE0sUikpZm9yKG4gaW4gTD0hMCxtKE0sUix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMpP3RoaXNbTl06dm9pZCAwfX0pLF8pY1tuXSYmZyhjW25dLE4sbik7ZS5leHBvcnRzPXtOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOkIsVFlQRURfQVJSQVlfVEFHOkwmJk4sYVR5cGVkQXJyYXk6ZnVuY3Rpb24oZSl7aWYoVShlKSlyZXR1cm4gZTt0aHJvdyBQKCJUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXkiKX0sYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtpZihsKGUpJiYoIXd8fGIoVCxlKSkpcmV0dXJuIGU7dGhyb3cgUChmKGUpKyIgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IiKX0sZXhwb3J0VHlwZWRBcnJheU1ldGhvZDpmdW5jdGlvbihlLHQscixuKXtpZihvKXtpZihyKWZvcih2YXIgYSBpbiBfKXt2YXIgaT1jW2FdO2lmKGkmJnUoaS5wcm90b3R5cGUsZSkpdHJ5e2RlbGV0ZSBpLnByb3RvdHlwZVtlXX1jYXRjaChyKXt0cnl7aS5wcm90b3R5cGVbZV09dH1jYXRjaChlKXt9fX1NW2VdJiYhcnx8cChNLGUscj90OkImJk9bZV18fHQsbil9fSxleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbixhO2lmKG8pe2lmKHcpe2lmKHIpZm9yKG4gaW4gXylpZigoYT1jW25dKSYmdShhLGUpKXRyeXtkZWxldGUgYVtlXX1jYXRjaChlKXt9aWYoVFtlXSYmIXIpcmV0dXJuO3RyeXtyZXR1cm4gcChULGUscj90OkImJlRbZV18fHQpfWNhdGNoKGUpe319Zm9yKG4gaW4gXykhKGE9Y1tuXSl8fGFbZV0mJiFyfHxwKGEsZSx0KX19LGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjpmdW5jdGlvbiBlKHQpe3ZhciByPXkodCk7aWYoaChyKSl7dmFyIG49ayhyKTtyZXR1cm4gbiYmdShuLEQpP25bRF06ZShyKX19LGlzVmlldzpmdW5jdGlvbihlKXtpZighaChlKSlyZXR1cm4hMTt2YXIgdD1kKGUpO3JldHVybiJEYXRhVmlldyI9PT10fHx1KF8sdCl8fHUoaix0KX0saXNUeXBlZEFycmF5OlUsVHlwZWRBcnJheTpULFR5cGVkQXJyYXlQcm90b3R5cGU6TX19LGU9PntlLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBEYXRhVmlld30sKGUsdCxyKT0+e3ZhciBuPXIoNDkpLGE9cig0NSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gci5nZXQmJm4oci5nZXQsdCx7Z2V0dGVyOiEwfSksci5zZXQmJm4oci5zZXQsdCx7c2V0dGVyOiEwfSksYS5mKGUsdCxyKX19LChlLHQscik9Pnt2YXIgbj1yKDM5KSxhPXIoMjEpLGk9cig0MCkscz1yKDU0KSxvPXIoODkpLGM9cygiSUVfUFJPVE8iKSxsPU9iamVjdCxoPWwucHJvdG90eXBlO2UuZXhwb3J0cz1vP2wuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9aShlKTtpZihuKHQsYykpcmV0dXJuIHRbY107dmFyIHI9dC5jb25zdHJ1Y3RvcjtyZXR1cm4gYShyKSYmdCBpbnN0YW5jZW9mIHI/ci5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIGw/aDpudWxsfX0sKGUsdCxyKT0+e3ZhciBuPXIoNyk7ZS5leHBvcnRzPSFuKChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBlKSE9PWUucHJvdG90eXBlfSkpfSwoZSx0LHIpPT57dmFyIG49cig5MSksYT1yKDEzKSxpPXIoNDApLHM9cig2NCksbz1mdW5jdGlvbihlKXt2YXIgdD0xPT1lO3JldHVybiBmdW5jdGlvbihyLG8sYyl7Zm9yKHZhciBsLGg9aShyKSx1PWEoaCksZD1uKG8sYyksZj1zKHUpO2YtLSA+MDspaWYoZChsPXVbZl0sZixoKSlzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiBsO2Nhc2UgMTpyZXR1cm4gZn1yZXR1cm4gdD8tMTp2b2lkIDB9fTtlLmV4cG9ydHM9e2ZpbmRMYXN0Om8oMCksZmluZExhc3RJbmRleDpvKDEpfX0sKGUsdCxyKT0+e3ZhciBuPXIoOTIpLGE9cigzMSksaT1yKDkpLHM9bihuLmJpbmQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBhKGUpLHZvaWQgMD09PXQ/ZTppP3MoZSx0KTpmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19fSwoZSx0LHIpPT57dmFyIG49cigxNSksYT1yKDE0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoIkZ1bmN0aW9uIj09PW4oZSkpcmV0dXJuIGEoZSl9fSwoZSx0LHIpPT57dmFyIG49cig4NSksYT1yKDkwKS5maW5kTGFzdEluZGV4LGk9bi5hVHlwZWRBcnJheTsoMCxuLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QpKCJmaW5kTGFzdEluZGV4IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEoaSh0aGlzKSxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0pKX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDgpLGk9cig4NSkscz1yKDY0KSxvPXIoOTUpLGM9cig0MCksbD1yKDcpLGg9bi5SYW5nZUVycm9yLHU9bi5JbnQ4QXJyYXksZD11JiZ1LnByb3RvdHlwZSxmPWQmJmQuc2V0LGc9aS5hVHlwZWRBcnJheSxwPWkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxtPSFsKChmdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OENsYW1wZWRBcnJheSgyKTtyZXR1cm4gYShmLGUse2xlbmd0aDoxLDA6M30sMSksMyE9PWVbMV19KSksYj1tJiZpLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MmJmwoKGZ1bmN0aW9uKCl7dmFyIGU9bmV3IHUoMik7cmV0dXJuIGUuc2V0KDEpLGUuc2V0KCIyIiwxKSwwIT09ZVswXXx8MiE9PWVbMV19KSk7cCgic2V0IiwoZnVuY3Rpb24oZSl7Zyh0aGlzKTt2YXIgdD1vKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDEpLHI9YyhlKTtpZihtKXJldHVybiBhKGYsdGhpcyxyLHQpO3ZhciBuPXRoaXMubGVuZ3RoLGk9cyhyKSxsPTA7aWYoaSt0Pm4pdGhyb3cgaCgiV3JvbmcgbGVuZ3RoIik7Zm9yKDtsPGk7KXRoaXNbdCtsXT1yW2wrK119KSwhbXx8Yil9LChlLHQscik9Pnt2YXIgbj1yKDk2KSxhPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9bihlKTtpZihyJXQpdGhyb3cgYSgiV3Jvbmcgb2Zmc2V0Iik7cmV0dXJuIHJ9fSwoZSx0LHIpPT57dmFyIG49cig2MiksYT1SYW5nZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKGUpO2lmKHQ8MCl0aHJvdyBhKCJUaGUgYXJndW1lbnQgY2FuJ3QgYmUgbGVzcyB0aGFuIDAiKTtyZXR1cm4gdH19LChlLHQscik9Pnt2YXIgbj1yKDk4KSxhPXIoODUpLGk9YS5hVHlwZWRBcnJheSxzPWEuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxvPWEuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yO3MoInRvUmV2ZXJzZWQiLChmdW5jdGlvbigpe3JldHVybiBuKGkodGhpcyksbyh0aGlzKSl9KSl9LChlLHQscik9Pnt2YXIgbj1yKDY0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9bihlKSxhPW5ldyB0KHIpLGk9MDtpPHI7aSsrKWFbaV09ZVtyLWktMV07cmV0dXJuIGF9fSwoZSx0LHIpPT57dmFyIG49cig4NSksYT1yKDE0KSxpPXIoMzEpLHM9cigxMDApLG89bi5hVHlwZWRBcnJheSxjPW4uZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yLGw9bi5leHBvcnRUeXBlZEFycmF5TWV0aG9kLGg9YShuLlR5cGVkQXJyYXlQcm90b3R5cGUuc29ydCk7bCgidG9Tb3J0ZWQiLChmdW5jdGlvbihlKXt2b2lkIDAhPT1lJiZpKGUpO3ZhciB0PW8odGhpcykscj1zKGModCksdCk7cmV0dXJuIGgocixlKX0pKX0sKGUsdCxyKT0+e3ZhciBuPXIoNjQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj0wLGE9bih0KSxpPW5ldyBlKGEpO2E+cjspaVtyXT10W3IrK107cmV0dXJuIGl9fSwoZSx0LHIpPT57dmFyIG49cigxMDIpLGE9cig4NSksaT1yKDEwMykscz1yKDYyKSxvPXIoMTA0KSxjPWEuYVR5cGVkQXJyYXksbD1hLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcixoPWEuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCx1PSEhZnVuY3Rpb24oKXt0cnl7bmV3IEludDhBcnJheSgxKS53aXRoKDIse3ZhbHVlT2Y6ZnVuY3Rpb24oKXt0aHJvdyA4fX0pfWNhdGNoKGUpe3JldHVybiA4PT09ZX19KCk7aCgid2l0aCIse3dpdGg6ZnVuY3Rpb24oZSx0KXt2YXIgcj1jKHRoaXMpLGE9cyhlKSxoPWkocik/byh0KTordDtyZXR1cm4gbihyLGwociksYSxoKX19LndpdGgsIXUpfSwoZSx0LHIpPT57dmFyIG49cig2NCksYT1yKDYyKSxpPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLHMpe3ZhciBvPW4oZSksYz1hKHIpLGw9YzwwP28rYzpjO2lmKGw+PW98fGw8MCl0aHJvdyBpKCJJbmNvcnJlY3QgaW5kZXgiKTtmb3IodmFyIGg9bmV3IHQobyksdT0wO3U8bzt1KyspaFt1XT11PT09bD9zOmVbdV07cmV0dXJuIGh9fSwoZSx0LHIpPT57dmFyIG49cig3OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW4oZSk7cmV0dXJuIkJpZ0ludDY0QXJyYXkiPT10fHwiQmlnVWludDY0QXJyYXkiPT10fX0sKGUsdCxyKT0+e3ZhciBuPXIoMTkpLGE9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKGUsIm51bWJlciIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBhKCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnQiKTtyZXR1cm4gQmlnSW50KHQpfX0sKGUsdCxyKT0+e3ZhciBuPXIoNiksYT1yKDg3KSxpPXIoMTA2KSxzPUFycmF5QnVmZmVyLnByb3RvdHlwZTtuJiYhKCJkZXRhY2hlZCJpbiBzKSYmYShzLCJkZXRhY2hlZCIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzKX19KX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9cigxMDcpLGk9bihBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigwIT09YShlKSlyZXR1cm4hMTt0cnl7cmV0dXJuIGkoZSwwLDApLCExfWNhdGNoKGUpe3JldHVybiEwfX19LChlLHQscik9Pnt2YXIgbj1yKDcyKSxhPXIoMTUpLGk9VHlwZUVycm9yO2UuZXhwb3J0cz1uKEFycmF5QnVmZmVyLnByb3RvdHlwZSwiYnl0ZUxlbmd0aCIsImdldCIpfHxmdW5jdGlvbihlKXtpZigiQXJyYXlCdWZmZXIiIT1hKGUpKXRocm93IGkoIkFycmF5QnVmZmVyIGV4cGVjdGVkIik7cmV0dXJuIGUuYnl0ZUxlbmd0aH19LChlLHQscik9Pnt2YXIgbj1yKDMpLGE9cigxMDkpO2EmJm4oe3RhcmdldDoiQXJyYXlCdWZmZXIiLHByb3RvOiEwfSx7dHJhbnNmZXI6ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCwhMCl9fSl9LChlLHQscik9Pnt2YXIgbj1yKDQpLGE9cigxNCksaT1yKDcyKSxzPXIoMTEwKSxvPXIoMTA2KSxjPXIoMTA3KSxsPXIoMTExKSxoPW4uVHlwZUVycm9yLHU9bi5zdHJ1Y3R1cmVkQ2xvbmUsZD1uLkFycmF5QnVmZmVyLGY9bi5EYXRhVmlldyxnPU1hdGgubWluLHA9ZC5wcm90b3R5cGUsbT1mLnByb3RvdHlwZSxiPWEocC5zbGljZSkseT1pKHAsInJlc2l6YWJsZSIsImdldCIpLHc9aShwLCJtYXhCeXRlTGVuZ3RoIiwiZ2V0Iiksdj1hKG0uZ2V0SW50OCkseD1hKG0uc2V0SW50OCk7ZS5leHBvcnRzPWwmJmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1jKGUpLGE9dm9pZCAwPT09dD9uOnModCksaT0heXx8IXkoZSk7aWYobyhlKSl0aHJvdyBoKCJBcnJheUJ1ZmZlciBpcyBkZXRhY2hlZCIpO3ZhciBsPXUoZSx7dHJhbnNmZXI6W2VdfSk7aWYobj09YSYmKHJ8fGkpKXJldHVybiBsO2lmKG4+PWEmJighcnx8aSkpcmV0dXJuIGIobCwwLGEpO2Zvcih2YXIgcD1yJiYhaSYmdz97bWF4Qnl0ZUxlbmd0aDp3KGwpfTp2b2lkIDAsbT1uZXcgZChhLHApLFM9bmV3IGYobCksQT1uZXcgZihtKSxrPWcoYSxuKSxDPTA7QzxrO0MrKyl4KEEsQyx2KFMsQykpO3JldHVybiBtfX0sKGUsdCxyKT0+e3ZhciBuPXIoNjIpLGE9cig2NSksaT1SYW5nZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lKXJldHVybiAwO3ZhciB0PW4oZSkscj1hKHQpO2lmKHQhPT1yKXRocm93IGkoIldyb25nIGxlbmd0aCBvciBpbmRleCIpO3JldHVybiByfX0sKGUsdCxyKT0+e3ZhciBuPXIoNCksYT1yKDcpLGk9cigyOCkscz1yKDExMiksbz1yKDExMyksYz1yKDExNCksbD1uLnN0cnVjdHVyZWRDbG9uZTtlLmV4cG9ydHM9ISFsJiYhYSgoZnVuY3Rpb24oKXtpZihvJiZpPjkyfHxjJiZpPjk0fHxzJiZpPjk3KXJldHVybiExO3ZhciBlPW5ldyBBcnJheUJ1ZmZlcig4KSx0PWwoZSx7dHJhbnNmZXI6W2VdfSk7cmV0dXJuIDAhPWUuYnl0ZUxlbmd0aHx8OCE9dC5ieXRlTGVuZ3RofSkpfSwoZSx0LHIpPT57dmFyIG49cigxMTMpLGE9cigxMTQpO2UuZXhwb3J0cz0hbiYmIWEmJiJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50fSxlPT57ZS5leHBvcnRzPSJvYmplY3QiPT10eXBlb2YgRGVubyYmRGVubyYmIm9iamVjdCI9PXR5cGVvZiBEZW5vLnZlcnNpb259LChlLHQscik9Pnt2YXIgbj1yKDE1KTtlLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBwcm9jZXNzJiYicHJvY2VzcyI9PW4ocHJvY2Vzcyl9LChlLHQscik9Pnt2YXIgbj1yKDMpLGE9cigxMDkpO2EmJm4oe3RhcmdldDoiQXJyYXlCdWZmZXIiLHByb3RvOiEwfSx7dHJhbnNmZXJUb0ZpeGVkTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcyxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTp2b2lkIDAsITEpfX0pfSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoMTE3KTtuKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IXIoMTI1KSgiZGlmZmVyZW5jZSIpfSx7ZGlmZmVyZW5jZTphfSl9LChlLHQscik9Pnt2YXIgbj1yKDExOCksYT1yKDExOSksaT1yKDEyMCkscz1yKDEyMyksbz1yKDEyNCksYz1yKDEyMSksbD1yKDEyMiksaD1hLmhhcyx1PWEucmVtb3ZlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKHRoaXMpLHI9byhlKSxhPWkodCk7cmV0dXJuIHModCk8PXIuc2l6ZT9jKHQsKGZ1bmN0aW9uKGUpe3IuaW5jbHVkZXMoZSkmJnUoYSxlKX0pKTpsKHIuZ2V0SXRlcmF0b3IoKSwoZnVuY3Rpb24oZSl7aCh0LGUpJiZ1KGEsZSl9KSksYX19LChlLHQscik9Pnt2YXIgbj1yKDExOSkuaGFzO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbihlKSxlfX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9U2V0LnByb3RvdHlwZTtlLmV4cG9ydHM9e1NldCxhZGQ6bihhLmFkZCksaGFzOm4oYS5oYXMpLHJlbW92ZTpuKGEuZGVsZXRlKSxwcm90bzphfX0sKGUsdCxyKT0+e3ZhciBuPXIoMTE5KSxhPXIoMTIxKSxpPW4uU2V0LHM9bi5hZGQ7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBpO3JldHVybiBhKGUsKGZ1bmN0aW9uKGUpe3ModCxlKX0pKSx0fX0sKGUsdCxyKT0+e3ZhciBuPXIoMTQpLGE9cigxMjIpLGk9cigxMTkpLHM9aS5TZXQsbz1pLnByb3RvLGM9bihvLmZvckVhY2gpLGw9bihvLmtleXMpLGg9bChuZXcgcykubmV4dDtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiByP2EobChlKSx0LGgpOmMoZSx0KX19LChlLHQscik9Pnt2YXIgbj1yKDgpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBhLGkscz1yfHxlLm5leHQ7IShhPW4ocyxlKSkuZG9uZTspaWYodm9pZCAwIT09KGk9dChhLnZhbHVlKSkpcmV0dXJuIGl9fSwoZSx0LHIpPT57dmFyIG49cig3MiksYT1yKDExOSk7ZS5leHBvcnRzPW4oYS5wcm90bywic2l6ZSIsImdldCIpfHxmdW5jdGlvbihlKXtyZXR1cm4gZS5zaXplfX0sKGUsdCxyKT0+e3ZhciBuPXIoMzEpLGE9cig0NyksaT1yKDgpLHM9cig2Miksbz1UeXBlRXJyb3IsYz1NYXRoLm1heCxsPWZ1bmN0aW9uKGUsdCxyLG4pe3RoaXMuc2V0PWUsdGhpcy5zaXplPXQsdGhpcy5oYXM9cix0aGlzLmtleXM9bn07bC5wcm90b3R5cGU9e2dldEl0ZXJhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIGEoaSh0aGlzLmtleXMsdGhpcy5zZXQpKX0saW5jbHVkZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGkodGhpcy5oYXMsdGhpcy5zZXQsZSl9fSxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7YShlKTt2YXIgdD0rZS5zaXplO2lmKHQhPXQpdGhyb3cgbygiSW52YWxpZCBzaXplIik7cmV0dXJuIG5ldyBsKGUsYyhzKHQpLDApLG4oZS5oYXMpLG4oZS5rZXlzKSl9fSwoZSx0LHIpPT57dmFyIG49cigyNCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4obmV3KG4oIlNldCIpKSlbZV0oe3NpemU6MCxoYXM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sa2V5czpmdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ITB9fX19fSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fX0sKGUsdCxyKT0+e3ZhciBuPXIoMyksYT1yKDcpLGk9cigxMjcpO24oe3RhcmdldDoiU2V0Iixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohcigxMjUpKCJpbnRlcnNlY3Rpb24iKXx8YSgoZnVuY3Rpb24oKXtyZXR1cm4iMywyIiE9QXJyYXkuZnJvbShuZXcgU2V0KFsxLDIsM10pLmludGVyc2VjdGlvbihuZXcgU2V0KFszLDJdKSkpfSkpfSx7aW50ZXJzZWN0aW9uOml9KX0sKGUsdCxyKT0+e3ZhciBuPXIoMTE4KSxhPXIoMTE5KSxpPXIoMTIzKSxzPXIoMTI0KSxvPXIoMTIxKSxjPXIoMTIyKSxsPWEuU2V0LGg9YS5hZGQsdT1hLmhhcztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bih0aGlzKSxyPXMoZSksYT1uZXcgbDtyZXR1cm4gaSh0KT5yLnNpemU/YyhyLmdldEl0ZXJhdG9yKCksKGZ1bmN0aW9uKGUpe3UodCxlKSYmaChhLGUpfSkpOm8odCwoZnVuY3Rpb24oZSl7ci5pbmNsdWRlcyhlKSYmaChhLGUpfSkpLGF9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoMTI5KTtuKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IXIoMTI1KSgiaXNEaXNqb2ludEZyb20iKX0se2lzRGlzam9pbnRGcm9tOmF9KX0sKGUsdCxyKT0+e3ZhciBuPXIoMTE4KSxhPXIoMTE5KS5oYXMsaT1yKDEyMykscz1yKDEyNCksbz1yKDEyMSksYz1yKDEyMiksbD1yKDEzMCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW4odGhpcykscj1zKGUpO2lmKGkodCk8PXIuc2l6ZSlyZXR1cm4hMSE9PW8odCwoZnVuY3Rpb24oZSl7aWYoci5pbmNsdWRlcyhlKSlyZXR1cm4hMX0pLCEwKTt2YXIgaD1yLmdldEl0ZXJhdG9yKCk7cmV0dXJuITEhPT1jKGgsKGZ1bmN0aW9uKGUpe2lmKGEodCxlKSlyZXR1cm4gbChoLCJub3JtYWwiLCExKX0pKX19LChlLHQscik9Pnt2YXIgbj1yKDgpLGE9cig0NyksaT1yKDMwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3ZhciBzLG87YShlKTt0cnl7aWYoIShzPWkoZSwicmV0dXJuIikpKXtpZigidGhyb3ciPT09dCl0aHJvdyByO3JldHVybiByfXM9bihzLGUpfWNhdGNoKGUpe289ITAscz1lfWlmKCJ0aHJvdyI9PT10KXRocm93IHI7aWYobyl0aHJvdyBzO3JldHVybiBhKHMpLHJ9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoMTMyKTtuKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IXIoMTI1KSgiaXNTdWJzZXRPZiIpfSx7aXNTdWJzZXRPZjphfSl9LChlLHQscik9Pnt2YXIgbj1yKDExOCksYT1yKDEyMyksaT1yKDEyMSkscz1yKDEyNCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW4odGhpcykscj1zKGUpO3JldHVybiEoYSh0KT5yLnNpemUpJiYhMSE9PWkodCwoZnVuY3Rpb24oZSl7aWYoIXIuaW5jbHVkZXMoZSkpcmV0dXJuITF9KSwhMCl9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoMTM0KTtuKHt0YXJnZXQ6IlNldCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6IXIoMTI1KSgiaXNTdXBlcnNldE9mIil9LHtpc1N1cGVyc2V0T2Y6YX0pfSwoZSx0LHIpPT57dmFyIG49cigxMTgpLGE9cigxMTkpLmhhcyxpPXIoMTIzKSxzPXIoMTI0KSxvPXIoMTIyKSxjPXIoMTMwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bih0aGlzKSxyPXMoZSk7aWYoaSh0KTxyLnNpemUpcmV0dXJuITE7dmFyIGw9ci5nZXRJdGVyYXRvcigpO3JldHVybiExIT09byhsLChmdW5jdGlvbihlKXtpZighYSh0LGUpKXJldHVybiBjKGwsIm5vcm1hbCIsITEpfSkpfX0sKGUsdCxyKT0+e3ZhciBuPXIoMyksYT1yKDEzNik7bih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOiFyKDEyNSkoInN5bW1ldHJpY0RpZmZlcmVuY2UiKX0se3N5bW1ldHJpY0RpZmZlcmVuY2U6YX0pfSwoZSx0LHIpPT57dmFyIG49cigxMTgpLGE9cigxMTkpLGk9cigxMjApLHM9cigxMjQpLG89cigxMjIpLGM9YS5hZGQsbD1hLmhhcyxoPWEucmVtb3ZlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKHRoaXMpLHI9cyhlKS5nZXRJdGVyYXRvcigpLGE9aSh0KTtyZXR1cm4gbyhyLChmdW5jdGlvbihlKXtsKHQsZSk/aChhLGUpOmMoYSxlKX0pKSxhfX0sKGUsdCxyKT0+e3ZhciBuPXIoMyksYT1yKDEzOCk7bih7dGFyZ2V0OiJTZXQiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOiFyKDEyNSkoInVuaW9uIil9LHt1bmlvbjphfSl9LChlLHQscik9Pnt2YXIgbj1yKDExOCksYT1yKDExOSkuYWRkLGk9cigxMjApLHM9cigxMjQpLG89cigxMjIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKHRoaXMpLHI9cyhlKS5nZXRJdGVyYXRvcigpLGM9aSh0KTtyZXR1cm4gbyhyLChmdW5jdGlvbihlKXthKGMsZSl9KSksY319LChlLHQscik9Pnt2YXIgbj1yKDMpLGE9cig0MCksaT1yKDY0KSxzPXIoMTQwKSxvPXIoMTQyKTtuKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxhcml0eToxLGZvcmNlZDpyKDcpKChmdW5jdGlvbigpe3JldHVybiA0Mjk0OTY3Mjk3IT09W10ucHVzaC5jYWxsKHtsZW5ndGg6NDI5NDk2NzI5Nn0sMSl9KSl8fCFmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sImxlbmd0aCIse3dyaXRhYmxlOiExfSkucHVzaCgpfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKX0se3B1c2g6ZnVuY3Rpb24oZSl7dmFyIHQ9YSh0aGlzKSxyPWkodCksbj1hcmd1bWVudHMubGVuZ3RoO28ocituKTtmb3IodmFyIGM9MDtjPG47YysrKXRbcl09YXJndW1lbnRzW2NdLHIrKztyZXR1cm4gcyh0LHIpLHJ9fSl9LChlLHQscik9Pnt2YXIgbj1yKDYpLGE9cigxNDEpLGk9VHlwZUVycm9yLHM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixvPW4mJiFmdW5jdGlvbigpe2lmKHZvaWQgMCE9PXRoaXMpcmV0dXJuITA7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwibGVuZ3RoIix7d3JpdGFibGU6ITF9KS5sZW5ndGg9MX1jYXRjaChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFR5cGVFcnJvcn19KCk7ZS5leHBvcnRzPW8/ZnVuY3Rpb24oZSx0KXtpZihhKGUpJiYhcyhlLCJsZW5ndGgiKS53cml0YWJsZSl0aHJvdyBpKCJDYW5ub3Qgc2V0IHJlYWQgb25seSAubGVuZ3RoIik7cmV0dXJuIGUubGVuZ3RoPXR9OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubGVuZ3RoPXR9fSwoZSx0LHIpPT57dmFyIG49cigxNSk7ZS5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJBcnJheSI9PW4oZSl9fSxlPT57dmFyIHQ9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihlPjkwMDcxOTkyNTQ3NDA5OTEpdGhyb3cgdCgiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7cmV0dXJuIGV9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoNCksaT1yKDg3KSxzPXIoNiksbz1UeXBlRXJyb3IsYz1PYmplY3QuZGVmaW5lUHJvcGVydHksbD1hLnNlbGYhPT1hO3RyeXtpZihzKXt2YXIgaD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsInNlbGYiKTshbCYmaCYmaC5nZXQmJmguZW51bWVyYWJsZXx8aShhLCJzZWxmIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldDpmdW5jdGlvbihlKXtpZih0aGlzIT09YSl0aHJvdyBvKCJJbGxlZ2FsIGludm9jYXRpb24iKTtjKGEsInNlbGYiLHt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9ZWxzZSBuKHtnbG9iYWw6ITAsc2ltcGxlOiEwLGZvcmNlZDpsfSx7c2VsZjphfSl9Y2F0Y2goZSl7fX0sKGUsdCxyKT0+e3ZhciBuO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlZlcmJvc2l0eUxldmVsPXQuVXRpbD10LlVua25vd25FcnJvckV4Y2VwdGlvbj10LlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbj10LlRleHRSZW5kZXJpbmdNb2RlPXQuUmVuZGVyaW5nSW50ZW50RmxhZz10LlByb21pc2VDYXBhYmlsaXR5PXQuUGVybWlzc2lvbkZsYWc9dC5QYXNzd29yZFJlc3BvbnNlcz10LlBhc3N3b3JkRXhjZXB0aW9uPXQuUGFnZUFjdGlvbkV2ZW50VHlwZT10Lk9QUz10Lk1pc3NpbmdQREZFeGNlcHRpb249dC5NQVhfSU1BR0VfU0laRV9UT19DQUNIRT10LkxJTkVfRkFDVE9SPXQuTElORV9ERVNDRU5UX0ZBQ1RPUj10LkludmFsaWRQREZFeGNlcHRpb249dC5JbWFnZUtpbmQ9dC5JREVOVElUWV9NQVRSSVg9dC5Gb3JtYXRFcnJvcj10LkZlYXR1cmVUZXN0PXQuRk9OVF9JREVOVElUWV9NQVRSSVg9dC5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZT10LkNNYXBDb21wcmVzc2lvblR5cGU9dC5CYXNlRXhjZXB0aW9uPXQuQkFTRUxJTkVfRkFDVE9SPXQuQW5ub3RhdGlvblR5cGU9dC5Bbm5vdGF0aW9uUmVwbHlUeXBlPXQuQW5ub3RhdGlvbk1vZGU9dC5Bbm5vdGF0aW9uRmxhZz10LkFubm90YXRpb25GaWVsZEZsYWc9dC5Bbm5vdGF0aW9uRWRpdG9yVHlwZT10LkFubm90YXRpb25FZGl0b3JQcmVmaXg9dC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZT10LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9dC5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlPXQuQWJvcnRFeGNlcHRpb249dm9pZCAwLHQuYXNzZXJ0PWZ1bmN0aW9uKGUsdCl7ZXx8bCh0KX0sdC5ieXRlc1RvU3RyaW5nPWcsdC5jcmVhdGVWYWxpZEFic29sdXRlVXJsPWZ1bmN0aW9uKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7aWYoIWUpcmV0dXJuIG51bGw7dHJ5e2lmKHImJiJzdHJpbmciPT10eXBlb2YgZSl7aWYoci5hZGREZWZhdWx0UHJvdG9jb2wmJmUuc3RhcnRzV2l0aCgid3d3LiIpKXtjb25zdCB0PWUubWF0Y2goL1wuL2cpOyhudWxsPT10P3ZvaWQgMDp0Lmxlbmd0aCk+PTImJihlPSJodHRwOi8vIi5jb25jYXQoZSkpfWlmKHIudHJ5Q29udmVydEVuY29kaW5nKXRyeXtlPXkoZSl9Y2F0Y2goZSl7fX1jb25zdCBuPXQ/bmV3IFVSTChlLHQpOm5ldyBVUkwoZSk7aWYoZnVuY3Rpb24oZSl7c3dpdGNoKG51bGw9PWU/dm9pZCAwOmUucHJvdG9jb2wpe2Nhc2UiaHR0cDoiOmNhc2UiaHR0cHM6IjpjYXNlImZ0cDoiOmNhc2UibWFpbHRvOiI6Y2FzZSJ0ZWw6IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0obikpcmV0dXJuIG59Y2F0Y2goZSl7fXJldHVybiBudWxsfSx0LmdldE1vZGlmaWNhdGlvbkRhdGU9ZnVuY3Rpb24oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bmV3IERhdGU7cmV0dXJuW2UuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLChlLmdldFVUQ01vbnRoKCkrMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENEYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpXS5qb2luKCIiKX0sdC5nZXRVdWlkPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0byYmImZ1bmN0aW9uIj09dHlwZW9mKG51bGw9PT0oZT1jcnlwdG8pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnJhbmRvbVVVSUQpKXJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoMzIpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgY3J5cHRvJiYiZnVuY3Rpb24iPT10eXBlb2YobnVsbD09PSh0PWNyeXB0byl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZ2V0UmFuZG9tVmFsdWVzKSljcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHIpO2Vsc2UgZm9yKGxldCBlPTA7ZTwzMjtlKyspcltlXT1NYXRoLmZsb29yKDI1NSpNYXRoLnJhbmRvbSgpKTtyZXR1cm4gZyhyKX0sdC5nZXRWZXJib3NpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBzfSx0LmluZm89ZnVuY3Rpb24oZSl7cz49aS5JTkZPUyYmY29uc29sZS5sb2coIkluZm86ICIuY29uY2F0KGUpKX0sdC5pc0FycmF5QnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmdm9pZCAwIT09KG51bGw9PWU/dm9pZCAwOmUuYnl0ZUxlbmd0aCl9LHQuaXNBcnJheUVxdWFsPWZ1bmN0aW9uKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspaWYoZVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9LHQuaXNOb2RlSlM9dm9pZCAwLHQubm9ybWFsaXplVW5pY29kZT1mdW5jdGlvbihlKXtyZXR1cm4gd3x8KHc9LyhbXHhBMFx4QjVcdTAzN0VcdTBFQjNcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMTI2XHVGQjAwLVx1RkIwNFx1RkIwNlx1RkIyMC1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJBMVx1RkJBNC1cdUZCQTlcdUZCQUUtXHVGQkIxXHVGQkQzLVx1RkJEQ1x1RkJERS1cdUZCRTdcdUZCRUEtXHVGQkY4XHVGQkZDXHVGQkZEXHVGQzAwLVx1RkM1RFx1RkM2NC1cdUZDRjFcdUZDRjUtXHVGRDNEXHVGRDg4XHVGREY0XHVGREZBXHVGREZCXHVGRTcxXHVGRTc3XHVGRTc5XHVGRTdCXHVGRTdEXSspfChcdUZCMDUrKS9nLHY9bmV3IE1hcChbWyLvrIUiLCLFv3QiXV0pKSxlLnJlcGxhY2VBbGwodywoKGUsdCxyKT0+dD90Lm5vcm1hbGl6ZSgiTkZLQyIpOnYuZ2V0KHIpKSl9LHQub2JqZWN0RnJvbU1hcD1mdW5jdGlvbihlKXtjb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0W3Isbl1vZiBlKXRbcl09bjtyZXR1cm4gdH0sdC5vYmplY3RTaXplPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGh9LHQuc2V0VmVyYm9zaXR5TGV2ZWw9ZnVuY3Rpb24oZSl7TnVtYmVyLmlzSW50ZWdlcihlKSYmKHM9ZSl9LHQuc2hhZG93PWQsdC5zdHJpbmczMj1mdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LDI1NSZlKX0sdC5zdHJpbmdUb0J5dGVzPXAsdC5zdHJpbmdUb1BERlN0cmluZz1mdW5jdGlvbihlKXtpZihlWzBdPj0iw68iKXtsZXQgdDtpZigiw74iPT09ZVswXSYmIsO/Ij09PWVbMV0/dD0idXRmLTE2YmUiOiLDvyI9PT1lWzBdJiYiw74iPT09ZVsxXT90PSJ1dGYtMTZsZSI6IsOvIj09PWVbMF0mJiLCuyI9PT1lWzFdJiYiwr8iPT09ZVsyXSYmKHQ9InV0Zi04IiksdCl0cnl7Y29uc3Qgcj1uZXcgVGV4dERlY29kZXIodCx7ZmF0YWw6ITB9KSxuPXAoZSk7cmV0dXJuIHIuZGVjb2RlKG4pfWNhdGNoKGUpe28oJ3N0cmluZ1RvUERGU3RyaW5nOiAiJy5jb25jYXQoZSwnIi4nKSl9fWNvbnN0IHQ9W107Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtjb25zdCBuPWJbZS5jaGFyQ29kZUF0KHIpXTt0LnB1c2gobj9TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOmUuY2hhckF0KHIpKX1yZXR1cm4gdC5qb2luKCIiKX0sdC5zdHJpbmdUb1VURjhTdHJpbmc9eSx0LnVucmVhY2hhYmxlPWwsdC51dGY4U3RyaW5nVG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSl9LHQud2Fybj1vLHIoMikscigxNDUpLHIoMTQ3KSxyKDE0OCkscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KTtjb25zdCBhPSEoIm9iamVjdCIhPXR5cGVvZiBwcm9jZXNzfHxwcm9jZXNzKyIiIT0iW29iamVjdCBwcm9jZXNzXSJ8fHByb2Nlc3MudmVyc2lvbnMubnd8fHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24mJnByb2Nlc3MudHlwZSYmImJyb3dzZXIiIT09cHJvY2Vzcy50eXBlKTt0LmlzTm9kZUpTPWEsdC5JREVOVElUWV9NQVRSSVg9WzEsMCwwLDEsMCwwXSx0LkZPTlRfSURFTlRJVFlfTUFUUklYPVsuMDAxLDAsMCwuMDAxLDAsMF0sdC5NQVhfSU1BR0VfU0laRV9UT19DQUNIRT0xZTcsdC5MSU5FX0ZBQ1RPUj0xLjM1LHQuTElORV9ERVNDRU5UX0ZBQ1RPUj0uMzUsdC5CQVNFTElORV9GQUNUT1I9LjI1OTI1OTI1OTI1OTI1OTI0LHQuUmVuZGVyaW5nSW50ZW50RmxhZz17QU5ZOjEsRElTUExBWToyLFBSSU5UOjQsU0FWRTo4LEFOTk9UQVRJT05TX0ZPUk1TOjE2LEFOTk9UQVRJT05TX1NUT1JBR0U6MzIsQU5OT1RBVElPTlNfRElTQUJMRTo2NCxPUExJU1Q6MjU2fSx0LkFubm90YXRpb25Nb2RlPXtESVNBQkxFOjAsRU5BQkxFOjEsRU5BQkxFX0ZPUk1TOjIsRU5BQkxFX1NUT1JBR0U6M30sdC5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4PSJwZGZqc19pbnRlcm5hbF9lZGl0b3JfIix0LkFubm90YXRpb25FZGl0b3JUeXBlPXtESVNBQkxFOi0xLE5PTkU6MCxGUkVFVEVYVDozLFNUQU1QOjEzLElOSzoxNX0sdC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZT17UkVTSVpFOjEsRlJFRVRFWFRfU0laRToxMSxGUkVFVEVYVF9DT0xPUjoxMixGUkVFVEVYVF9PUEFDSVRZOjEzLElOS19DT0xPUjoyMSxJTktfVEhJQ0tORVNTOjIyLElOS19PUEFDSVRZOjIzfSx0LlBlcm1pc3Npb25GbGFnPXtQUklOVDo0LE1PRElGWV9DT05URU5UUzo4LENPUFk6MTYsTU9ESUZZX0FOTk9UQVRJT05TOjMyLEZJTExfSU5URVJBQ1RJVkVfRk9STVM6MjU2LENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6NTEyLEFTU0VNQkxFOjEwMjQsUFJJTlRfSElHSF9RVUFMSVRZOjIwNDh9LHQuVGV4dFJlbmRlcmluZ01vZGU9e0ZJTEw6MCxTVFJPS0U6MSxGSUxMX1NUUk9LRToyLElOVklTSUJMRTozLEZJTExfQUREX1RPX1BBVEg6NCxTVFJPS0VfQUREX1RPX1BBVEg6NSxGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDo2LEFERF9UT19QQVRIOjcsRklMTF9TVFJPS0VfTUFTSzozLEFERF9UT19QQVRIX0ZMQUc6NH0sdC5JbWFnZUtpbmQ9e0dSQVlTQ0FMRV8xQlBQOjEsUkdCXzI0QlBQOjIsUkdCQV8zMkJQUDozfSx0LkFubm90YXRpb25UeXBlPXtURVhUOjEsTElOSzoyLEZSRUVURVhUOjMsTElORTo0LFNRVUFSRTo1LENJUkNMRTo2LFBPTFlHT046NyxQT0xZTElORTo4LEhJR0hMSUdIVDo5LFVOREVSTElORToxMCxTUVVJR0dMWToxMSxTVFJJS0VPVVQ6MTIsU1RBTVA6MTMsQ0FSRVQ6MTQsSU5LOjE1LFBPUFVQOjE2LEZJTEVBVFRBQ0hNRU5UOjE3LFNPVU5EOjE4LE1PVklFOjE5LFdJREdFVDoyMCxTQ1JFRU46MjEsUFJJTlRFUk1BUks6MjIsVFJBUE5FVDoyMyxXQVRFUk1BUks6MjQsVEhSRUVEOjI1LFJFREFDVDoyNn0sdC5Bbm5vdGF0aW9uUmVwbHlUeXBlPXtHUk9VUDoiR3JvdXAiLFJFUExZOiJSIn0sdC5Bbm5vdGF0aW9uRmxhZz17SU5WSVNJQkxFOjEsSElEREVOOjIsUFJJTlQ6NCxOT1pPT006OCxOT1JPVEFURToxNixOT1ZJRVc6MzIsUkVBRE9OTFk6NjQsTE9DS0VEOjEyOCxUT0dHTEVOT1ZJRVc6MjU2LExPQ0tFRENPTlRFTlRTOjUxMn0sdC5Bbm5vdGF0aW9uRmllbGRGbGFnPXtSRUFET05MWToxLFJFUVVJUkVEOjIsTk9FWFBPUlQ6NCxNVUxUSUxJTkU6NDA5NixQQVNTV09SRDo4MTkyLE5PVE9HR0xFVE9PRkY6MTYzODQsUkFESU86MzI3NjgsUFVTSEJVVFRPTjo2NTUzNixDT01CTzoxMzEwNzIsRURJVDoyNjIxNDQsU09SVDo1MjQyODgsRklMRVNFTEVDVDoxMDQ4NTc2LE1VTFRJU0VMRUNUOjIwOTcxNTIsRE9OT1RTUEVMTENIRUNLOjQxOTQzMDQsRE9OT1RTQ1JPTEw6ODM4ODYwOCxDT01COjE2Nzc3MjE2LFJJQ0hURVhUOjMzNTU0NDMyLFJBRElPU0lOVU5JU09OOjMzNTU0NDMyLENPTU1JVE9OU0VMQ0hBTkdFOjY3MTA4ODY0fSx0LkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU9e1NPTElEOjEsREFTSEVEOjIsQkVWRUxFRDozLElOU0VUOjQsVU5ERVJMSU5FOjV9LHQuQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZT17RToiTW91c2UgRW50ZXIiLFg6Ik1vdXNlIEV4aXQiLEQ6Ik1vdXNlIERvd24iLFU6Ik1vdXNlIFVwIixGbzoiRm9jdXMiLEJsOiJCbHVyIixQTzoiUGFnZU9wZW4iLFBDOiJQYWdlQ2xvc2UiLFBWOiJQYWdlVmlzaWJsZSIsUEk6IlBhZ2VJbnZpc2libGUiLEs6IktleXN0cm9rZSIsRjoiRm9ybWF0IixWOiJWYWxpZGF0ZSIsQzoiQ2FsY3VsYXRlIn0sdC5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZT17V0M6IldpbGxDbG9zZSIsV1M6IldpbGxTYXZlIixEUzoiRGlkU2F2ZSIsV1A6IldpbGxQcmludCIsRFA6IkRpZFByaW50In0sdC5QYWdlQWN0aW9uRXZlbnRUeXBlPXtPOiJQYWdlT3BlbiIsQzoiUGFnZUNsb3NlIn07Y29uc3QgaT17RVJST1JTOjAsV0FSTklOR1M6MSxJTkZPUzo1fTt0LlZlcmJvc2l0eUxldmVsPWksdC5DTWFwQ29tcHJlc3Npb25UeXBlPXtOT05FOjAsQklOQVJZOjF9LHQuT1BTPXtkZXBlbmRlbmN5OjEsc2V0TGluZVdpZHRoOjIsc2V0TGluZUNhcDozLHNldExpbmVKb2luOjQsc2V0TWl0ZXJMaW1pdDo1LHNldERhc2g6NixzZXRSZW5kZXJpbmdJbnRlbnQ6NyxzZXRGbGF0bmVzczo4LHNldEdTdGF0ZTo5LHNhdmU6MTAscmVzdG9yZToxMSx0cmFuc2Zvcm06MTIsbW92ZVRvOjEzLGxpbmVUbzoxNCxjdXJ2ZVRvOjE1LGN1cnZlVG8yOjE2LGN1cnZlVG8zOjE3LGNsb3NlUGF0aDoxOCxyZWN0YW5nbGU6MTksc3Ryb2tlOjIwLGNsb3NlU3Ryb2tlOjIxLGZpbGw6MjIsZW9GaWxsOjIzLGZpbGxTdHJva2U6MjQsZW9GaWxsU3Ryb2tlOjI1LGNsb3NlRmlsbFN0cm9rZToyNixjbG9zZUVPRmlsbFN0cm9rZToyNyxlbmRQYXRoOjI4LGNsaXA6MjksZW9DbGlwOjMwLGJlZ2luVGV4dDozMSxlbmRUZXh0OjMyLHNldENoYXJTcGFjaW5nOjMzLHNldFdvcmRTcGFjaW5nOjM0LHNldEhTY2FsZTozNSxzZXRMZWFkaW5nOjM2LHNldEZvbnQ6Mzcsc2V0VGV4dFJlbmRlcmluZ01vZGU6Mzgsc2V0VGV4dFJpc2U6MzksbW92ZVRleHQ6NDAsc2V0TGVhZGluZ01vdmVUZXh0OjQxLHNldFRleHRNYXRyaXg6NDIsbmV4dExpbmU6NDMsc2hvd1RleHQ6NDQsc2hvd1NwYWNlZFRleHQ6NDUsbmV4dExpbmVTaG93VGV4dDo0NixuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDo0NyxzZXRDaGFyV2lkdGg6NDgsc2V0Q2hhcldpZHRoQW5kQm91bmRzOjQ5LHNldFN0cm9rZUNvbG9yU3BhY2U6NTAsc2V0RmlsbENvbG9yU3BhY2U6NTEsc2V0U3Ryb2tlQ29sb3I6NTIsc2V0U3Ryb2tlQ29sb3JOOjUzLHNldEZpbGxDb2xvcjo1NCxzZXRGaWxsQ29sb3JOOjU1LHNldFN0cm9rZUdyYXk6NTYsc2V0RmlsbEdyYXk6NTcsc2V0U3Ryb2tlUkdCQ29sb3I6NTgsc2V0RmlsbFJHQkNvbG9yOjU5LHNldFN0cm9rZUNNWUtDb2xvcjo2MCxzZXRGaWxsQ01ZS0NvbG9yOjYxLHNoYWRpbmdGaWxsOjYyLGJlZ2luSW5saW5lSW1hZ2U6NjMsYmVnaW5JbWFnZURhdGE6NjQsZW5kSW5saW5lSW1hZ2U6NjUscGFpbnRYT2JqZWN0OjY2LG1hcmtQb2ludDo2NyxtYXJrUG9pbnRQcm9wczo2OCxiZWdpbk1hcmtlZENvbnRlbnQ6NjksYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6NzAsZW5kTWFya2VkQ29udGVudDo3MSxiZWdpbkNvbXBhdDo3MixlbmRDb21wYXQ6NzMscGFpbnRGb3JtWE9iamVjdEJlZ2luOjc0LHBhaW50Rm9ybVhPYmplY3RFbmQ6NzUsYmVnaW5Hcm91cDo3NixlbmRHcm91cDo3NyxiZWdpbkFubm90YXRpb246ODAsZW5kQW5ub3RhdGlvbjo4MSxwYWludEltYWdlTWFza1hPYmplY3Q6ODMscGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6ODQscGFpbnRJbWFnZVhPYmplY3Q6ODUscGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6ODYscGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDo4NyxwYWludEltYWdlWE9iamVjdFJlcGVhdDo4OCxwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6ODkscGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOjkwLGNvbnN0cnVjdFBhdGg6OTF9LHQuUGFzc3dvcmRSZXNwb25zZXM9e05FRURfUEFTU1dPUkQ6MSxJTkNPUlJFQ1RfUEFTU1dPUkQ6Mn07bGV0IHM9aS5XQVJOSU5HUztmdW5jdGlvbiBvKGUpe3M+PWkuV0FSTklOR1MmJmNvbnNvbGUubG9nKCJXYXJuaW5nOiAiLmNvbmNhdChlKSl9ZnVuY3Rpb24gbChlKXt0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gZChlLHQscil7bGV0IG49YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6cixlbnVtZXJhYmxlOiFuLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMX0pLHJ9Y29uc3QgZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXt0aGlzLmNvbnN0cnVjdG9yPT09ZSYmbCgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUV4Y2VwdGlvbi4iKSx0aGlzLm1lc3NhZ2U9dCx0aGlzLm5hbWU9cn1yZXR1cm4gZS5wcm90b3R5cGU9bmV3IEVycm9yLGUuY29uc3RydWN0b3I9ZSxlfSgpO2Z1bmN0aW9uIGcoZSl7Im9iamVjdCI9PXR5cGVvZiBlJiZ2b2lkIDAhPT0obnVsbD09ZT92b2lkIDA6ZS5sZW5ndGgpfHxsKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7Y29uc3QgdD1lLmxlbmd0aCxyPTgxOTI7aWYodDxyKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZSk7Y29uc3Qgbj1bXTtmb3IobGV0IGE9MDthPHQ7YSs9cil7Y29uc3QgaT1NYXRoLm1pbihhK3IsdCkscz1lLnN1YmFycmF5KGEsaSk7bi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxzKSl9cmV0dXJuIG4uam9pbigiIil9ZnVuY3Rpb24gcChlKXsic3RyaW5nIiE9dHlwZW9mIGUmJmwoIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXMiKTtjb25zdCB0PWUubGVuZ3RoLHI9bmV3IFVpbnQ4QXJyYXkodCk7Zm9yKGxldCBuPTA7bjx0OysrbilyW25dPTI1NSZlLmNoYXJDb2RlQXQobik7cmV0dXJuIHJ9dC5CYXNlRXhjZXB0aW9uPWYsdC5QYXNzd29yZEV4Y2VwdGlvbj1jbGFzcyBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLCJQYXNzd29yZEV4Y2VwdGlvbiIpLHRoaXMuY29kZT10fX0sdC5Vbmtub3duRXJyb3JFeGNlcHRpb249Y2xhc3MgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSwiVW5rbm93bkVycm9yRXhjZXB0aW9uIiksdGhpcy5kZXRhaWxzPXR9fSx0LkludmFsaWRQREZFeGNlcHRpb249Y2xhc3MgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIkludmFsaWRQREZFeGNlcHRpb24iKX19LHQuTWlzc2luZ1BERkV4Y2VwdGlvbj1jbGFzcyBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiTWlzc2luZ1BERkV4Y2VwdGlvbiIpfX0sdC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb249Y2xhc3MgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIiksdGhpcy5zdGF0dXM9dH19LHQuRm9ybWF0RXJyb3I9Y2xhc3MgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIkZvcm1hdEVycm9yIil9fSx0LkFib3J0RXhjZXB0aW9uPWNsYXNzIGV4dGVuZHMgZntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJBYm9ydEV4Y2VwdGlvbiIpfX0sdC5GZWF0dXJlVGVzdD1jbGFzc3tzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCl7cmV0dXJuIGQodGhpcywiaXNMaXR0bGVFbmRpYW4iLGZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gZVswXT0xLDE9PT1uZXcgVWludDMyQXJyYXkoZS5idWZmZXIsMCwxKVswXX0oKSl9c3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKXtyZXR1cm4gZCh0aGlzLCJpc0V2YWxTdXBwb3J0ZWQiLGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgRnVuY3Rpb24oIiIpLCEwfWNhdGNoKGUpe3JldHVybiExfX0oKSl9c3RhdGljIGdldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpe3JldHVybiBkKHRoaXMsImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIiwidW5kZWZpbmVkIiE9dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyl9c3RhdGljIGdldCBwbGF0Zm9ybSgpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yP2QodGhpcywicGxhdGZvcm0iLHtpc1dpbjohMSxpc01hYzohMX0pOmQodGhpcywicGxhdGZvcm0iLHtpc1dpbjpuYXZpZ2F0b3IucGxhdGZvcm0uaW5jbHVkZXMoIldpbiIpLGlzTWFjOm5hdmlnYXRvci5wbGF0Zm9ybS5pbmNsdWRlcygiTWFjIil9KX19O2NvbnN0IG09Wy4uLkFycmF5KDI1Nikua2V5cygpXS5tYXAoKGU9PmUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkpO3QuVXRpbD1jbGFzc3tzdGF0aWMgbWFrZUhleENvbG9yKGUsdCxyKXtyZXR1cm4iIyIuY29uY2F0KG1bZV0pLmNvbmNhdChtW3RdKS5jb25jYXQobVtyXSl9c3RhdGljIHNjYWxlTWluTWF4KGUsdCl7bGV0IHI7ZVswXT8oZVswXTwwJiYocj10WzBdLHRbMF09dFsxXSx0WzFdPXIpLHRbMF0qPWVbMF0sdFsxXSo9ZVswXSxlWzNdPDAmJihyPXRbMl0sdFsyXT10WzNdLHRbM109ciksdFsyXSo9ZVszXSx0WzNdKj1lWzNdKToocj10WzBdLHRbMF09dFsyXSx0WzJdPXIscj10WzFdLHRbMV09dFszXSx0WzNdPXIsZVsxXTwwJiYocj10WzJdLHRbMl09dFszXSx0WzNdPXIpLHRbMl0qPWVbMV0sdFszXSo9ZVsxXSxlWzJdPDAmJihyPXRbMF0sdFswXT10WzFdLHRbMV09ciksdFswXSo9ZVsyXSx0WzFdKj1lWzJdKSx0WzBdKz1lWzRdLHRbMV0rPWVbNF0sdFsyXSs9ZVs1XSx0WzNdKz1lWzVdfXN0YXRpYyB0cmFuc2Zvcm0oZSx0KXtyZXR1cm5bZVswXSp0WzBdK2VbMl0qdFsxXSxlWzFdKnRbMF0rZVszXSp0WzFdLGVbMF0qdFsyXStlWzJdKnRbM10sZVsxXSp0WzJdK2VbM10qdFszXSxlWzBdKnRbNF0rZVsyXSp0WzVdK2VbNF0sZVsxXSp0WzRdK2VbM10qdFs1XStlWzVdXX1zdGF0aWMgYXBwbHlUcmFuc2Zvcm0oZSx0KXtyZXR1cm5bZVswXSp0WzBdK2VbMV0qdFsyXSt0WzRdLGVbMF0qdFsxXStlWzFdKnRbM10rdFs1XV19c3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShlLHQpe2NvbnN0IHI9dFswXSp0WzNdLXRbMV0qdFsyXTtyZXR1cm5bKGVbMF0qdFszXS1lWzFdKnRbMl0rdFsyXSp0WzVdLXRbNF0qdFszXSkvciwoLWVbMF0qdFsxXStlWzFdKnRbMF0rdFs0XSp0WzFdLXRbNV0qdFswXSkvcl19c3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KGUsdCl7Y29uc3Qgcj10aGlzLmFwcGx5VHJhbnNmb3JtKGUsdCksbj10aGlzLmFwcGx5VHJhbnNmb3JtKGUuc2xpY2UoMiw0KSx0KSxhPXRoaXMuYXBwbHlUcmFuc2Zvcm0oW2VbMF0sZVszXV0sdCksaT10aGlzLmFwcGx5VHJhbnNmb3JtKFtlWzJdLGVbMV1dLHQpO3JldHVybltNYXRoLm1pbihyWzBdLG5bMF0sYVswXSxpWzBdKSxNYXRoLm1pbihyWzFdLG5bMV0sYVsxXSxpWzFdKSxNYXRoLm1heChyWzBdLG5bMF0sYVswXSxpWzBdKSxNYXRoLm1heChyWzFdLG5bMV0sYVsxXSxpWzFdKV19c3RhdGljIGludmVyc2VUcmFuc2Zvcm0oZSl7Y29uc3QgdD1lWzBdKmVbM10tZVsxXSplWzJdO3JldHVybltlWzNdL3QsLWVbMV0vdCwtZVsyXS90LGVbMF0vdCwoZVsyXSplWzVdLWVbNF0qZVszXSkvdCwoZVs0XSplWzFdLWVbNV0qZVswXSkvdF19c3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKGUpe2NvbnN0IHQ9W2VbMF0sZVsyXSxlWzFdLGVbM11dLHI9ZVswXSp0WzBdK2VbMV0qdFsyXSxuPWVbMF0qdFsxXStlWzFdKnRbM10sYT1lWzJdKnRbMF0rZVszXSp0WzJdLGk9ZVsyXSp0WzFdK2VbM10qdFszXSxzPShyK2kpLzIsbz1NYXRoLnNxcnQoKHIraSkqKjItNCoocippLWEqbikpLzIsYz1zK298fDEsbD1zLW98fDE7cmV0dXJuW01hdGguc3FydChjKSxNYXRoLnNxcnQobCldfXN0YXRpYyBub3JtYWxpemVSZWN0KGUpe2NvbnN0IHQ9ZS5zbGljZSgwKTtyZXR1cm4gZVswXT5lWzJdJiYodFswXT1lWzJdLHRbMl09ZVswXSksZVsxXT5lWzNdJiYodFsxXT1lWzNdLHRbM109ZVsxXSksdH1zdGF0aWMgaW50ZXJzZWN0KGUsdCl7Y29uc3Qgcj1NYXRoLm1heChNYXRoLm1pbihlWzBdLGVbMl0pLE1hdGgubWluKHRbMF0sdFsyXSkpLG49TWF0aC5taW4oTWF0aC5tYXgoZVswXSxlWzJdKSxNYXRoLm1heCh0WzBdLHRbMl0pKTtpZihyPm4pcmV0dXJuIG51bGw7Y29uc3QgYT1NYXRoLm1heChNYXRoLm1pbihlWzFdLGVbM10pLE1hdGgubWluKHRbMV0sdFszXSkpLGk9TWF0aC5taW4oTWF0aC5tYXgoZVsxXSxlWzNdKSxNYXRoLm1heCh0WzFdLHRbM10pKTtyZXR1cm4gYT5pP251bGw6W3IsYSxuLGldfXN0YXRpYyBiZXppZXJCb3VuZGluZ0JveChlLHQscixuLGEsaSxzLG8pe2NvbnN0IGM9W10sbD1bW10sW11dO2xldCBoLHUsZCxmLGcscCxtLGI7Zm9yKGxldCBsPTA7bDwyOysrbClpZigwPT09bD8odT02KmUtMTIqcis2KmEsaD0tMyplKzkqci05KmErMypzLGQ9MypyLTMqZSk6KHU9Nip0LTEyKm4rNippLGg9LTMqdCs5Km4tOSppKzMqbyxkPTMqbi0zKnQpLE1hdGguYWJzKGgpPDFlLTEyKXtpZihNYXRoLmFicyh1KTwxZS0xMiljb250aW51ZTtmPS1kL3UsMDxmJiZmPDEmJmMucHVzaChmKX1lbHNlIG09dSp1LTQqZCpoLGI9TWF0aC5zcXJ0KG0pLG08MHx8KGc9KC11K2IpLygyKmgpLDA8ZyYmZzwxJiZjLnB1c2goZykscD0oLXUtYikvKDIqaCksMDxwJiZwPDEmJmMucHVzaChwKSk7bGV0IHksdz1jLmxlbmd0aDtjb25zdCB2PXc7Zm9yKDt3LS07KWY9Y1t3XSx5PTEtZixsWzBdW3ddPXkqeSp5KmUrMyp5KnkqZipyKzMqeSpmKmYqYStmKmYqZipzLGxbMV1bd109eSp5KnkqdCszKnkqeSpmKm4rMyp5KmYqZippK2YqZipmKm87cmV0dXJuIGxbMF1bdl09ZSxsWzFdW3ZdPXQsbFswXVt2KzFdPXMsbFsxXVt2KzFdPW8sbFswXS5sZW5ndGg9bFsxXS5sZW5ndGg9disyLFtNYXRoLm1pbiguLi5sWzBdKSxNYXRoLm1pbiguLi5sWzFdKSxNYXRoLm1heCguLi5sWzBdKSxNYXRoLm1heCguLi5sWzFdKV19fTtjb25zdCBiPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3MjgsNzExLDcxMCw3MjksNzMzLDczMSw3MzAsNzMyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDgyMjYsODIyNCw4MjI1LDgyMzAsODIxMiw4MjExLDQwMiw4MjYwLDgyNDksODI1MCw4NzIyLDgyNDAsODIyMiw4MjIwLDgyMjEsODIxNiw4MjE3LDgyMTgsODQ4Miw2NDI1Nyw2NDI1OCwzMjEsMzM4LDM1MiwzNzYsMzgxLDMwNSwzMjIsMzM5LDM1MywzODIsMCw4MzY0XTtmdW5jdGlvbiB5KGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGUpKX10LlByb21pc2VDYXBhYmlsaXR5PShuPW5ldyBXZWFrTWFwLGNsYXNze2NvbnN0cnVjdG9yKCl7Yyh0aGlzLG4se3dyaXRhYmxlOiEwLHZhbHVlOiExfSksdGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKCgoZSx0KT0+e3RoaXMucmVzb2x2ZT10PT57dSh0aGlzLG4sITApLGUodCl9LHRoaXMucmVqZWN0PWU9Pnt1KHRoaXMsbiwhMCksdChlKX19KSl9Z2V0IHNldHRsZWQoKXtyZXR1cm4gaCh0aGlzLG4pfX0pO2xldCB3PW51bGwsdj1udWxsfSwoZSx0LHIpPT57dmFyIG49cig0OCksYT1yKDE0KSxpPXIoNzcpLHM9cigxNDYpLG89VVJMU2VhcmNoUGFyYW1zLGM9by5wcm90b3R5cGUsbD1hKGMuYXBwZW5kKSxoPWEoYy5kZWxldGUpLHU9YShjLmZvckVhY2gpLGQ9YShbXS5wdXNoKSxmPW5ldyBvKCJhPTEmYT0yIik7Zi5kZWxldGUoImEiLDEpLGYrIiIhPSJhPTIiJiZuKGMsImRlbGV0ZSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj10PDI/dm9pZCAwOmFyZ3VtZW50c1sxXTtpZih0JiZ2b2lkIDA9PT1yKXJldHVybiBoKHRoaXMsZSk7dmFyIG49W107dSh0aGlzLChmdW5jdGlvbihlLHQpe2Qobix7a2V5OnQsdmFsdWU6ZX0pfSkpLHModCwxKTtmb3IodmFyIGEsbz1pKGUpLGM9aShyKSxmPTAsZz0wLHA9ITEsbT1uLmxlbmd0aDtmPG07KWE9bltmKytdLHB8fGEua2V5PT09bz8ocD0hMCxoKHRoaXMsYS5rZXkpKTpnKys7Zm9yKDtnPG07KShhPW5bZysrXSkua2V5PT09byYmYS52YWx1ZT09PWN8fGwodGhpcyxhLmtleSxhLnZhbHVlKX0pLHtlbnVtZXJhYmxlOiEwLHVuc2FmZTohMH0pfSxlPT57dmFyIHQ9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHIpe2lmKGU8cil0aHJvdyB0KCJOb3QgZW5vdWdoIGFyZ3VtZW50cyIpO3JldHVybiBlfX0sKGUsdCxyKT0+e3ZhciBuPXIoNDgpLGE9cigxNCksaT1yKDc3KSxzPXIoMTQ2KSxvPVVSTFNlYXJjaFBhcmFtcyxjPW8ucHJvdG90eXBlLGw9YShjLmdldEFsbCksaD1hKGMuaGFzKTtuZXcgbygiYT0xIikuaGFzKCJhIiwyKSYmbihjLCJoYXMiLChmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHI9dDwyP3ZvaWQgMDphcmd1bWVudHNbMV07aWYodCYmdm9pZCAwPT09cilyZXR1cm4gaCh0aGlzLGUpO3ZhciBuPWwodGhpcyxlKTtzKHQsMSk7Zm9yKHZhciBhPWkociksbz0wO288bi5sZW5ndGg7KWlmKG5bbysrXT09PWEpcmV0dXJuITA7cmV0dXJuITF9KSx7ZW51bWVyYWJsZTohMCx1bnNhZmU6ITB9KX0sKGUsdCxyKT0+e3ZhciBuPXIoNiksYT1yKDE0KSxpPXIoODcpLHM9VVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZSxvPWEocy5mb3JFYWNoKTtuJiYhKCJzaXplImluIHMpJiZpKHMsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiBvKHRoaXMsKGZ1bmN0aW9uKCl7ZSsrfSkpLGV9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5YUmVmUGFyc2VFeGNlcHRpb249dC5YUmVmRW50cnlFeGNlcHRpb249dC5QYXJzZXJFT0ZFeGNlcHRpb249dC5QREZfVkVSU0lPTl9SRUdFWFA9dC5NaXNzaW5nRGF0YUV4Y2VwdGlvbj12b2lkIDAsdC5hcnJheUJ1ZmZlcnNUb0J5dGVzPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7aWYoMD09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2lmKDE9PT10KXJldHVybiBuZXcgVWludDhBcnJheShlWzBdKTtsZXQgcj0wO2ZvcihsZXQgbj0wO248dDtuKyspcis9ZVtuXS5ieXRlTGVuZ3RoO2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkocik7bGV0IGE9MDtmb3IobGV0IHI9MDtyPHQ7cisrKXtjb25zdCB0PW5ldyBVaW50OEFycmF5KGVbcl0pO24uc2V0KHQsYSksYSs9dC5ieXRlTGVuZ3RofXJldHVybiBufSx0LmNvbGxlY3RBY3Rpb25zPWZ1bmN0aW9uKGUsdCxyKXtjb25zdCBpPU9iamVjdC5jcmVhdGUobnVsbCkscz1oKHtkaWN0OnQsa2V5OiJBQSIsc3RvcFdoZW5Gb3VuZDohMX0pO2lmKHMpZm9yKGxldCB0PXMubGVuZ3RoLTE7dD49MDt0LS0pe2NvbnN0IG49c1t0XTtpZihuIGluc3RhbmNlb2YgYS5EaWN0KWZvcihjb25zdCB0IG9mIG4uZ2V0S2V5cygpKXtjb25zdCBzPXJbdF07aWYoIXMpY29udGludWU7Y29uc3Qgbz1bXTtkKG4uZ2V0UmF3KHQpLGUsbyxuZXcgYS5SZWZTZXQpLG8ubGVuZ3RoPjAmJihpW3NdPW8pfX1pZih0LmhhcygiQSIpKXtjb25zdCByPVtdO2QodC5nZXQoIkEiKSxlLHIsbmV3IGEuUmVmU2V0KSxyLmxlbmd0aD4wJiYoaS5BY3Rpb249cil9cmV0dXJuKDAsbi5vYmplY3RTaXplKShpKT4wP2k6bnVsbH0sdC5lbmNvZGVUb1htbFN0cmluZz1mdW5jdGlvbihlKXtjb25zdCB0PVtdO2xldCByPTA7Zm9yKGxldCBuPTAsYT1lLmxlbmd0aDtuPGE7bisrKXtjb25zdCBhPWUuY29kZVBvaW50QXQobik7aWYoMzI8PWEmJmE8PTEyNil7Y29uc3QgaT1mW2FdO2kmJihyPG4mJnQucHVzaChlLnN1YnN0cmluZyhyLG4pKSx0LnB1c2goaSkscj1uKzEpfWVsc2UgcjxuJiZ0LnB1c2goZS5zdWJzdHJpbmcocixuKSksdC5wdXNoKCImI3giLmNvbmNhdChhLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLCI7IikpLGE+NTUyOTUmJihhPDU3MzQ0fHxhPjY1NTMzKSYmbisrLHI9bisxfXJldHVybiAwPT09dC5sZW5ndGg/ZToocjxlLmxlbmd0aCYmdC5wdXNoKGUuc3Vic3RyaW5nKHIsZS5sZW5ndGgpKSx0LmpvaW4oIiIpKX0sdC5lc2NhcGVQREZOYW1lPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9W107bGV0IHI9MDtmb3IobGV0IG49MCxhPWUubGVuZ3RoO248YTtuKyspe2NvbnN0IGE9ZS5jaGFyQ29kZUF0KG4pOyhhPDMzfHxhPjEyNnx8MzU9PT1hfHw0MD09PWF8fDQxPT09YXx8NjA9PT1hfHw2Mj09PWF8fDkxPT09YXx8OTM9PT1hfHwxMjM9PT1hfHwxMjU9PT1hfHw0Nz09PWF8fDM3PT09YSkmJihyPG4mJnQucHVzaChlLnN1YnN0cmluZyhyLG4pKSx0LnB1c2goIiMiLmNvbmNhdChhLnRvU3RyaW5nKDE2KSkpLHI9bisxKX1yZXR1cm4gMD09PXQubGVuZ3RoP2U6KHI8ZS5sZW5ndGgmJnQucHVzaChlLnN1YnN0cmluZyhyLGUubGVuZ3RoKSksdC5qb2luKCIiKSl9LHQuZXNjYXBlU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2VBbGwoLyhbKClcXFxuXHJdKS9nLChlPT4iXG4iPT09ZT8iXFxuIjoiXHIiPT09ZT8iXFxyIjoiXFwiLmNvbmNhdChlKSkpfSx0LmdldEluaGVyaXRhYmxlUHJvcGVydHk9aCx0LmdldExvb2t1cFRhYmxlRmFjdG9yeT1mdW5jdGlvbihlKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSYmKHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxlKHQpLGU9bnVsbCksdH19LHQuZ2V0TmV3QW5ub3RhdGlvbnNNYXA9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3QgdD1uZXcgTWFwO2Zvcihjb25zdFtyLGFdb2YgZSl7aWYoIXIuc3RhcnRzV2l0aChuLkFubm90YXRpb25FZGl0b3JQcmVmaXgpKWNvbnRpbnVlO2xldCBlPXQuZ2V0KGEucGFnZUluZGV4KTtlfHwoZT1bXSx0LnNldChhLnBhZ2VJbmRleCxlKSksZS5wdXNoKGEpfXJldHVybiB0LnNpemU+MD90Om51bGx9LHQuZ2V0Um90YXRpb25NYXRyaXg9ZnVuY3Rpb24oZSx0LHIpe3N3aXRjaChlKXtjYXNlIDkwOnJldHVyblswLDEsLTEsMCx0LDBdO2Nhc2UgMTgwOnJldHVyblstMSwwLDAsLTEsdCxyXTtjYXNlIDI3MDpyZXR1cm5bMCwtMSwxLDAsMCxyXTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCByb3RhdGlvbiIpfX0sdC5pc0FzY2lpPWZ1bmN0aW9uKGUpe3JldHVybi9eW1x4MDAtXHg3Rl0qJC8udGVzdChlKX0sdC5pc1doaXRlU3BhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIDMyPT09ZXx8OT09PWV8fDEzPT09ZXx8MTA9PT1lfSx0LmxvZzI9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8PTA/MDpNYXRoLmNlaWwoTWF0aC5sb2cyKGUpKX0sdC5udW1iZXJUb1N0cmluZz1mdW5jdGlvbihlKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGUpKXJldHVybiBlLnRvU3RyaW5nKCk7Y29uc3QgdD1NYXRoLnJvdW5kKDEwMCplKTtyZXR1cm4gdCUxMDA9PTA/KHQvMTAwKS50b1N0cmluZygpOnQlMTA9PTA/ZS50b0ZpeGVkKDEpOmUudG9GaXhlZCgyKX0sdC5wYXJzZVhGQVBhdGg9ZnVuY3Rpb24oZSl7Y29uc3QgdD0vKC4rKVxbKFxkKylcXSQvO3JldHVybiBlLnNwbGl0KCIuIikubWFwKChlPT57Y29uc3Qgcj1lLm1hdGNoKHQpO3JldHVybiByP3tuYW1lOnJbMV0scG9zOnBhcnNlSW50KHJbMl0sMTApfTp7bmFtZTplLHBvczowfX0pKX0sdC5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPDwyND4+MjR9LHQucmVhZFVpbnQxNj1mdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPDw4fGVbdCsxXX0sdC5yZWFkVWludDMyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXSk+Pj4wfSx0LnJlY292ZXJKc1VSTD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBSZWdFeHAoIl5cXHMqKCIrWyJhcHAubGF1bmNoVVJMIiwid2luZG93Lm9wZW4iLCJ4ZmEuaG9zdC5nb3RvVVJMIl0uam9pbigifCIpLnJlcGxhY2VBbGwoIi4iLCJcXC4iKSsiKVxcKCg/Oid8XCIpKFteJ1wiXSopKD86J3xcIikoPzosXFxzKihcXHcrKVxcKXxcXCkpIiwiaSIpLmV4ZWMoZSk7aWYobnVsbCE9dCYmdFsyXSl7Y29uc3QgZT10WzJdO2xldCByPSExO3JldHVybiJ0cnVlIj09PXRbM10mJiJhcHAubGF1bmNoVVJMIj09PXRbMV0mJihyPSEwKSx7dXJsOmUsbmV3V2luZG93OnJ9fXJldHVybiBudWxsfSx0LnN0cmluZ1RvVVRGMTZIZXhTdHJpbmc9ZnVuY3Rpb24oZSl7Y29uc3QgdD1bXTtmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49ZS5jaGFyQ29kZUF0KHIpO3QucHVzaCgobj4+OCYyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIiksKDI1NSZuKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKX1yZXR1cm4gdC5qb2luKCIiKX0sdC5zdHJpbmdUb1VURjE2U3RyaW5nPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9W107YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSYmdC5wdXNoKCLDvsO/Iik7Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtjb25zdCBuPWUuY2hhckNvZGVBdChyKTt0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShuPj44JjI1NSksU3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmbikpfXJldHVybiB0LmpvaW4oIiIpfSx0LnRvUm9tYW5OdW1lcmFscz1mdW5jdGlvbihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdOygwLG4uYXNzZXJ0KShOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPjAsIlRoZSBudW1iZXIgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4iKTtjb25zdCByPVtdO2xldCBhO2Zvcig7ZT49MWUzOyllLT0xZTMsci5wdXNoKCJNIik7YT1lLzEwMHwwLGUlPTEwMCxyLnB1c2godVthXSksYT1lLzEwfDAsZSU9MTAsci5wdXNoKHVbMTArYV0pLHIucHVzaCh1WzIwK2VdKTtjb25zdCBpPXIuam9pbigiIik7cmV0dXJuIHQ/aS50b0xvd2VyQ2FzZSgpOml9LHQudmFsaWRhdGVDU1NGb250PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IFNldChbIjEwMCIsIjIwMCIsIjMwMCIsIjQwMCIsIjUwMCIsIjYwMCIsIjcwMCIsIjgwMCIsIjkwMCIsIjEwMDAiLCJub3JtYWwiLCJib2xkIiwiYm9sZGVyIiwibGlnaHRlciJdKSx7Zm9udEZhbWlseTpyLGZvbnRXZWlnaHQ6bixpdGFsaWNBbmdsZTphfT1lO2lmKCFnKHIsITApKXJldHVybiExO2NvbnN0IGk9bj9uLnRvU3RyaW5nKCk6IiI7ZS5mb250V2VpZ2h0PXQuaGFzKGkpP2k6IjQwMCI7Y29uc3Qgcz1wYXJzZUZsb2F0KGEpO3JldHVybiBlLml0YWxpY0FuZ2xlPWlzTmFOKHMpfHxzPC05MHx8cz45MD8iMTQiOmEudG9TdHJpbmcoKSwhMH0sdC52YWxpZGF0ZUZvbnROYW1lPWcscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTM5KSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNykscigyKTt2YXIgbj1yKDE0NCksYT1yKDE1MCksaT1yKDE1MSk7dC5QREZfVkVSU0lPTl9SRUdFWFA9L15bMS05XVwuXGQkLztjbGFzcyBzIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoIk1pc3NpbmcgZGF0YSBbIi5jb25jYXQoZSwiLCAiKS5jb25jYXQodCwiKSIpLCJNaXNzaW5nRGF0YUV4Y2VwdGlvbiIpLHRoaXMuYmVnaW49ZSx0aGlzLmVuZD10fX10Lk1pc3NpbmdEYXRhRXhjZXB0aW9uPXM7Y2xhc3MgbyBleHRlbmRzIG4uQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJQYXJzZXJFT0ZFeGNlcHRpb24iKX19dC5QYXJzZXJFT0ZFeGNlcHRpb249bztjbGFzcyBjIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIlhSZWZFbnRyeUV4Y2VwdGlvbiIpfX10LlhSZWZFbnRyeUV4Y2VwdGlvbj1jO2NsYXNzIGwgZXh0ZW5kcyBuLkJhc2VFeGNlcHRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiWFJlZlBhcnNlRXhjZXB0aW9uIil9fWZ1bmN0aW9uIGgoZSl7bGV0IHQse2RpY3Q6cixrZXk6bixnZXRBcnJheTppPSExLHN0b3BXaGVuRm91bmQ6cz0hMH09ZTtjb25zdCBvPW5ldyBhLlJlZlNldDtmb3IoO3IgaW5zdGFuY2VvZiBhLkRpY3QmJighci5vYmpJZHx8IW8uaGFzKHIub2JqSWQpKTspe3Iub2JqSWQmJm8ucHV0KHIub2JqSWQpO2NvbnN0IGU9aT9yLmdldEFycmF5KG4pOnIuZ2V0KG4pO2lmKHZvaWQgMCE9PWUpe2lmKHMpcmV0dXJuIGU7KHR8fCh0PVtdKSkucHVzaChlKX1yPXIuZ2V0KCJQYXJlbnQiKX1yZXR1cm4gdH10LlhSZWZQYXJzZUV4Y2VwdGlvbj1sO2NvbnN0IHU9WyIiLCJDIiwiQ0MiLCJDQ0MiLCJDRCIsIkQiLCJEQyIsIkRDQyIsIkRDQ0MiLCJDTSIsIiIsIlgiLCJYWCIsIlhYWCIsIlhMIiwiTCIsIkxYIiwiTFhYIiwiTFhYWCIsIlhDIiwiIiwiSSIsIklJIiwiSUlJIiwiSVYiLCJWIiwiVkkiLCJWSUkiLCJWSUlJIiwiSVgiXTtmdW5jdGlvbiBkKGUsdCxyLHMpe2lmKCFlKXJldHVybjtsZXQgbz1udWxsO2lmKGUgaW5zdGFuY2VvZiBhLlJlZil7aWYocy5oYXMoZSkpcmV0dXJuO289ZSxzLnB1dChvKSxlPXQuZmV0Y2goZSl9aWYoQXJyYXkuaXNBcnJheShlKSlmb3IoY29uc3QgbiBvZiBlKWQobix0LHIscyk7ZWxzZSBpZihlIGluc3RhbmNlb2YgYS5EaWN0KXtpZigoMCxhLmlzTmFtZSkoZS5nZXQoIlMiKSwiSmF2YVNjcmlwdCIpKXtjb25zdCB0PWUuZ2V0KCJKUyIpO2xldCBhO3QgaW5zdGFuY2VvZiBpLkJhc2VTdHJlYW0/YT10LmdldFN0cmluZygpOiJzdHJpbmciPT10eXBlb2YgdCYmKGE9dCksYSYmKGE9KDAsbi5zdHJpbmdUb1BERlN0cmluZykoYSkucmVwbGFjZUFsbCgiXDAiLCIiKSksYSYmci5wdXNoKGEpfWQoZS5nZXRSYXcoIk5leHQiKSx0LHIscyl9byYmcy5yZW1vdmUobyl9Y29uc3QgZj17NjA6IiZsdDsiLDYyOiImZ3Q7IiwzODoiJmFtcDsiLDM0OiImcXVvdDsiLDM5OiImYXBvczsifTtmdW5jdGlvbiBnKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07Y29uc3Qgcj0vXigifCcpLiooInwnKSQvLmV4ZWMoZSk7aWYociYmclsxXT09PXJbMl0pe2lmKG5ldyBSZWdFeHAoIlteXFxcXF0iLmNvbmNhdChyWzFdKSkudGVzdChlLnNsaWNlKDEsLTEpKSlyZXR1cm4gdCYmKDAsbi53YXJuKSgiRm9udEZhbWlseSBjb250YWlucyB1bmVzY2FwZWQgIi5jb25jYXQoclsxXSwiOiAiKS5jb25jYXQoZSwiLiIpKSwhMX1lbHNlIGZvcihjb25zdCByIG9mIGUuc3BsaXQoL1sgXHRdKy8pKWlmKC9eKFxkfCgtKFxkfC0pKSkvLnRlc3Qocil8fCEvXltcdy1cXF0rJC8udGVzdChyKSlyZXR1cm4gdCYmKDAsbi53YXJuKSgiRm9udEZhbWlseSBjb250YWlucyBpbnZhbGlkIDxjdXN0b20taWRlbnQ+OiAiLmNvbmNhdChlLCIuIikpLCExO3JldHVybiEwfX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlJlZlNldENhY2hlPXQuUmVmU2V0PXQuUmVmPXQuTmFtZT10LkVPRj10LkRpY3Q9dC5DbWQ9dC5DSVJDVUxBUl9SRUY9dm9pZCAwLHQuY2xlYXJQcmltaXRpdmVDYWNoZXM9ZnVuY3Rpb24oKXtzPU9iamVjdC5jcmVhdGUobnVsbCksbz1PYmplY3QuY3JlYXRlKG51bGwpLGM9T2JqZWN0LmNyZWF0ZShudWxsKX0sdC5pc0NtZD1mdW5jdGlvbihlLHQpe3JldHVybiBlIGluc3RhbmNlb2YgaCYmKHZvaWQgMD09PXR8fGUuY21kPT09dCl9LHQuaXNEaWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBkJiYodm9pZCAwPT09dHx8bShlLmdldCgiVHlwZSIpLHQpKX0sdC5pc05hbWU9bSx0LmlzUmVmc0VxdWFsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubnVtPT09dC5udW0mJmUuZ2VuPT09dC5nZW59LHIoMTM5KSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIG49cigxNDQpO2NvbnN0IGE9U3ltYm9sKCJDSVJDVUxBUl9SRUYiKTt0LkNJUkNVTEFSX1JFRj1hO2NvbnN0IGk9U3ltYm9sKCJFT0YiKTt0LkVPRj1pO2xldCBzPU9iamVjdC5jcmVhdGUobnVsbCksbz1PYmplY3QuY3JlYXRlKG51bGwpLGM9T2JqZWN0LmNyZWF0ZShudWxsKTtjbGFzcyBse2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZT1lfXN0YXRpYyBnZXQoZSl7dmFyIHQ7cmV0dXJuKHQ9bylbZV18fCh0W2VdPW5ldyBsKGUpKX19dC5OYW1lPWw7Y2xhc3MgaHtjb25zdHJ1Y3RvcihlKXt0aGlzLmNtZD1lfXN0YXRpYyBnZXQoZSl7dmFyIHQ7cmV0dXJuKHQ9cylbZV18fCh0W2VdPW5ldyBoKGUpKX19dC5DbWQ9aDtjb25zdCB1PWZ1bmN0aW9uKCl7cmV0dXJuIHV9O2NsYXNzIGR7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDt0aGlzLl9tYXA9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLnhyZWY9ZSx0aGlzLm9iaklkPW51bGwsdGhpcy5zdXBwcmVzc0VuY3J5cHRpb249ITEsdGhpcy5fX25vblNlcmlhbGl6YWJsZV9fPXV9YXNzaWduWHJlZihlKXt0aGlzLnhyZWY9ZX1nZXQgc2l6ZSgpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApLmxlbmd0aH1nZXQoZSx0LHIpe2xldCBuPXRoaXMuX21hcFtlXTtyZXR1cm4gdm9pZCAwPT09biYmdm9pZCAwIT09dCYmKG49dGhpcy5fbWFwW3RdLHZvaWQgMD09PW4mJnZvaWQgMCE9PXImJihuPXRoaXMuX21hcFtyXSkpLG4gaW5zdGFuY2VvZiBmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoKG4sdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOm59YXN5bmMgZ2V0QXN5bmMoZSx0LHIpe2xldCBuPXRoaXMuX21hcFtlXTtyZXR1cm4gdm9pZCAwPT09biYmdm9pZCAwIT09dCYmKG49dGhpcy5fbWFwW3RdLHZvaWQgMD09PW4mJnZvaWQgMCE9PXImJihuPXRoaXMuX21hcFtyXSkpLG4gaW5zdGFuY2VvZiBmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoQXN5bmMobix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik6bn1nZXRBcnJheShlLHQscil7bGV0IG49dGhpcy5fbWFwW2VdO2lmKHZvaWQgMD09PW4mJnZvaWQgMCE9PXQmJihuPXRoaXMuX21hcFt0XSx2b2lkIDA9PT1uJiZ2b2lkIDAhPT1yJiYobj10aGlzLl9tYXBbcl0pKSxuIGluc3RhbmNlb2YgZiYmdGhpcy54cmVmJiYobj10aGlzLnhyZWYuZmV0Y2gobix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbikpLEFycmF5LmlzQXJyYXkobikpe249bi5zbGljZSgpO2ZvcihsZXQgZT0wLHQ9bi5sZW5ndGg7ZTx0O2UrKyluW2VdaW5zdGFuY2VvZiBmJiZ0aGlzLnhyZWYmJihuW2VdPXRoaXMueHJlZi5mZXRjaChuW2VdLHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKSl9cmV0dXJuIG59Z2V0UmF3KGUpe3JldHVybiB0aGlzLl9tYXBbZV19Z2V0S2V5cygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tYXApfWdldFJhd1ZhbHVlcygpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX21hcCl9c2V0KGUsdCl7dGhpcy5fbWFwW2VdPXR9aGFzKGUpe3JldHVybiB2b2lkIDAhPT10aGlzLl9tYXBbZV19Zm9yRWFjaChlKXtmb3IoY29uc3QgdCBpbiB0aGlzLl9tYXApZSh0LHRoaXMuZ2V0KHQpKX1zdGF0aWMgZ2V0IGVtcHR5KCl7Y29uc3QgZT1uZXcgZChudWxsKTtyZXR1cm4gZS5zZXQ9KGUsdCk9PnsoMCxuLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGBzZXRgIG9uIHRoZSBlbXB0eSBkaWN0aW9uYXJ5LiIpfSwoMCxuLnNoYWRvdykodGhpcywiZW1wdHkiLGUpfXN0YXRpYyBtZXJnZShlKXtsZXR7eHJlZjp0LGRpY3RBcnJheTpyLG1lcmdlU3ViRGljdHM6bj0hMX09ZTtjb25zdCBhPW5ldyBkKHQpLGk9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiByKWlmKGUgaW5zdGFuY2VvZiBkKWZvcihjb25zdFt0LHJdb2YgT2JqZWN0LmVudHJpZXMoZS5fbWFwKSl7bGV0IGU9aS5nZXQodCk7aWYodm9pZCAwPT09ZSllPVtdLGkuc2V0KHQsZSk7ZWxzZSBpZighKG4mJnIgaW5zdGFuY2VvZiBkKSljb250aW51ZTtlLnB1c2gocil9Zm9yKGNvbnN0W2Uscl1vZiBpKXtpZigxPT09ci5sZW5ndGh8fCEoclswXWluc3RhbmNlb2YgZCkpe2EuX21hcFtlXT1yWzBdO2NvbnRpbnVlfWNvbnN0IG49bmV3IGQodCk7Zm9yKGNvbnN0IGUgb2Ygcilmb3IoY29uc3RbdCxyXW9mIE9iamVjdC5lbnRyaWVzKGUuX21hcCkpdm9pZCAwPT09bi5fbWFwW3RdJiYobi5fbWFwW3RdPXIpO24uc2l6ZT4wJiYoYS5fbWFwW2VdPW4pfXJldHVybiBpLmNsZWFyKCksYS5zaXplPjA/YTpkLmVtcHR5fX10LkRpY3Q9ZDtjbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5udW09ZSx0aGlzLmdlbj10fXRvU3RyaW5nKCl7cmV0dXJuIDA9PT10aGlzLmdlbj8iIi5jb25jYXQodGhpcy5udW0sIlIiKToiIi5jb25jYXQodGhpcy5udW0sIlIiKS5jb25jYXQodGhpcy5nZW4pfXN0YXRpYyBmcm9tU3RyaW5nKGUpe2NvbnN0IHQ9Y1tlXTtpZih0KXJldHVybiB0O2NvbnN0IHI9L14oXGQrKVIoXGQqKSQvLmV4ZWMoZSk7cmV0dXJuIHImJiIwIiE9PXJbMV0/Y1tlXT1uZXcgZihwYXJzZUludChyWzFdKSxyWzJdP3BhcnNlSW50KHJbMl0pOjApOm51bGx9c3RhdGljIGdldChlLHQpe3ZhciByO2NvbnN0IG49MD09PXQ/IiIuY29uY2F0KGUsIlIiKToiIi5jb25jYXQoZSwiUiIpLmNvbmNhdCh0KTtyZXR1cm4ocj1jKVtuXXx8KHJbbl09bmV3IGYoZSx0KSl9fXQuUmVmPWY7Y2xhc3MgZ3tjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3RoaXMuX3NldD1uZXcgU2V0KG51bGw9PWU/dm9pZCAwOmUuX3NldCl9aGFzKGUpe3JldHVybiB0aGlzLl9zZXQuaGFzKGUudG9TdHJpbmcoKSl9cHV0KGUpe3RoaXMuX3NldC5hZGQoZS50b1N0cmluZygpKX1yZW1vdmUoZSl7dGhpcy5fc2V0LmRlbGV0ZShlLnRvU3RyaW5nKCkpfVtTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHRoaXMuX3NldC52YWx1ZXMoKX1jbGVhcigpe3RoaXMuX3NldC5jbGVhcigpfX10LlJlZlNldD1nO2NsYXNzIHB7Y29uc3RydWN0b3IoKXt0aGlzLl9tYXA9bmV3IE1hcH1nZXQgc2l6ZSgpe3JldHVybiB0aGlzLl9tYXAuc2l6ZX1nZXQoZSl7cmV0dXJuIHRoaXMuX21hcC5nZXQoZS50b1N0cmluZygpKX1oYXMoZSl7cmV0dXJuIHRoaXMuX21hcC5oYXMoZS50b1N0cmluZygpKX1wdXQoZSx0KXt0aGlzLl9tYXAuc2V0KGUudG9TdHJpbmcoKSx0KX1wdXRBbGlhcyhlLHQpe3RoaXMuX21hcC5zZXQoZS50b1N0cmluZygpLHRoaXMuZ2V0KHQpKX1bU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiB0aGlzLl9tYXAudmFsdWVzKCl9Y2xlYXIoKXt0aGlzLl9tYXAuY2xlYXIoKX19ZnVuY3Rpb24gbShlLHQpe3JldHVybiBlIGluc3RhbmNlb2YgbCYmKHZvaWQgMD09PXR8fGUubmFtZT09PXQpfXQuUmVmU2V0Q2FjaGU9cH0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkJhc2VTdHJlYW09dm9pZCAwO3ZhciBuPXIoMTQ0KTtjbGFzcyBhe2NvbnN0cnVjdG9yKCl7dGhpcy5jb25zdHJ1Y3Rvcj09PWEmJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU3RyZWFtLiIpfWdldCBsZW5ndGgoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgZ2V0dGVyIGBsZW5ndGhgIGFjY2Vzc2VkIil9Z2V0IGlzRW1wdHkoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgZ2V0dGVyIGBpc0VtcHR5YCBhY2Nlc3NlZCIpfWdldCBpc0RhdGFMb2FkZWQoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiaXNEYXRhTG9hZGVkIiwhMCl9Z2V0Qnl0ZSgpeygwLG4udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVgIGNhbGxlZCIpfWdldEJ5dGVzKGUpeygwLG4udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVzYCBjYWxsZWQiKX1wZWVrQnl0ZSgpe2NvbnN0IGU9dGhpcy5nZXRCeXRlKCk7cmV0dXJuLTEhPT1lJiZ0aGlzLnBvcy0tLGV9cGVla0J5dGVzKGUpe2NvbnN0IHQ9dGhpcy5nZXRCeXRlcyhlKTtyZXR1cm4gdGhpcy5wb3MtPXQubGVuZ3RoLHR9Z2V0VWludDE2KCl7Y29uc3QgZT10aGlzLmdldEJ5dGUoKSx0PXRoaXMuZ2V0Qnl0ZSgpO3JldHVybi0xPT09ZXx8LTE9PT10Py0xOihlPDw4KSt0fWdldEludDMyKCl7cmV0dXJuKHRoaXMuZ2V0Qnl0ZSgpPDwyNCkrKHRoaXMuZ2V0Qnl0ZSgpPDwxNikrKHRoaXMuZ2V0Qnl0ZSgpPDw4KSt0aGlzLmdldEJ5dGUoKX1nZXRCeXRlUmFuZ2UoZSx0KXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRCeXRlUmFuZ2VgIGNhbGxlZCIpfWdldFN0cmluZyhlKXtyZXR1cm4oMCxuLmJ5dGVzVG9TdHJpbmcpKHRoaXMuZ2V0Qnl0ZXMoZSkpfXNraXAoZSl7dGhpcy5wb3MrPWV8fDF9cmVzZXQoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGByZXNldGAgY2FsbGVkIil9bW92ZVN0YXJ0KCl7KDAsbi51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgbW92ZVN0YXJ0YCBjYWxsZWQiKX1tYWtlU3ViU3RyZWFtKGUsdCl7KDAsbi51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgbWFrZVN1YlN0cmVhbWAgY2FsbGVkIil9Z2V0QmFzZVN0cmVhbXMoKXtyZXR1cm4gbnVsbH19dC5CYXNlU3RyZWFtPWF9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5OZXR3b3JrUGRmTWFuYWdlcj10LkxvY2FsUGRmTWFuYWdlcj12b2lkIDA7dmFyIG49cigxNDQpLGE9cigxNTMpLGk9cigxNDkpLHM9cigxNTUpLG89cigxNTQpO2NsYXNzIGN7Y29uc3RydWN0b3IoZSl7dmFyIHQ7dGhpcy5jb25zdHJ1Y3Rvcj09PWMmJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlUGRmTWFuYWdlci4iKSx0aGlzLl9kb2NCYXNlVXJsPWZ1bmN0aW9uKGUpe2lmKGUpe2NvbnN0IHQ9KDAsbi5jcmVhdGVWYWxpZEFic29sdXRlVXJsKShlKTtpZih0KXJldHVybiB0LmhyZWY7KDAsbi53YXJuKSgnSW52YWxpZCBhYnNvbHV0ZSBkb2NCYXNlVXJsOiAiJy5jb25jYXQoZSwnIi4nKSl9cmV0dXJuIG51bGx9KGUuZG9jQmFzZVVybCksdGhpcy5fZG9jSWQ9ZS5kb2NJZCx0aGlzLl9wYXNzd29yZD1lLnBhc3N3b3JkLHRoaXMuZW5hYmxlWGZhPWUuZW5hYmxlWGZhLCh0PWUuZXZhbHVhdG9yT3B0aW9ucykuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQmJih0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPW4uRmVhdHVyZVRlc3QuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpLHRoaXMuZXZhbHVhdG9yT3B0aW9ucz1lLmV2YWx1YXRvck9wdGlvbnN9Z2V0IGRvY0lkKCl7cmV0dXJuIHRoaXMuX2RvY0lkfWdldCBwYXNzd29yZCgpe3JldHVybiB0aGlzLl9wYXNzd29yZH1nZXQgZG9jQmFzZVVybCgpe2NvbnN0IGU9dGhpcy5wZGZEb2N1bWVudC5jYXRhbG9nO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJkb2NCYXNlVXJsIixlLmJhc2VVcmx8fHRoaXMuX2RvY0Jhc2VVcmwpfWVuc3VyZURvYyhlLHQpe3JldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LGUsdCl9ZW5zdXJlWFJlZihlLHQpe3JldHVybiB0aGlzLmVuc3VyZSh0aGlzLnBkZkRvY3VtZW50LnhyZWYsZSx0KX1lbnN1cmVDYXRhbG9nKGUsdCl7cmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZyxlLHQpfWdldFBhZ2UoZSl7cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZShlKX1mb250RmFsbGJhY2soZSx0KXtyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5mb250RmFsbGJhY2soZSx0KX1sb2FkWGZhRm9udHMoZSx0KXtyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5sb2FkWGZhRm9udHMoZSx0KX1sb2FkWGZhSW1hZ2VzKCl7cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQubG9hZFhmYUltYWdlcygpfXNlcmlhbGl6ZVhmYURhdGEoZSl7cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuc2VyaWFsaXplWGZhRGF0YShlKX1jbGVhbnVwKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5jbGVhbnVwKGUpfWFzeW5jIGVuc3VyZShlLHQscil7KDAsbi51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgZW5zdXJlYCBjYWxsZWQiKX1yZXF1ZXN0UmFuZ2UoZSx0KXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0UmFuZ2VgIGNhbGxlZCIpfXJlcXVlc3RMb2FkZWRTdHJlYW0oKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0TG9hZGVkU3RyZWFtYCBjYWxsZWQiKX1zZW5kUHJvZ3Jlc3NpdmVEYXRhKGUpeygwLG4udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHNlbmRQcm9ncmVzc2l2ZURhdGFgIGNhbGxlZCIpfXVwZGF0ZVBhc3N3b3JkKGUpe3RoaXMuX3Bhc3N3b3JkPWV9dGVybWluYXRlKGUpeygwLG4udW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHRlcm1pbmF0ZWAgY2FsbGVkIil9fXQuTG9jYWxQZGZNYW5hZ2VyPWNsYXNzIGV4dGVuZHMgY3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PW5ldyBvLlN0cmVhbShlLnNvdXJjZSk7dGhpcy5wZGZEb2N1bWVudD1uZXcgcy5QREZEb2N1bWVudCh0aGlzLHQpLHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2U9UHJvbWlzZS5yZXNvbHZlKHQpfWFzeW5jIGVuc3VyZShlLHQscil7Y29uc3Qgbj1lW3RdO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkoZSxyKTpufXJlcXVlc3RSYW5nZShlLHQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKX1yZXF1ZXN0TG9hZGVkU3RyZWFtKCl7cmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbVByb21pc2V9dGVybWluYXRlKGUpe319LHQuTmV0d29ya1BkZk1hbmFnZXI9Y2xhc3MgZXh0ZW5kcyBje2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuc3RyZWFtTWFuYWdlcj1uZXcgYS5DaHVua2VkU3RyZWFtTWFuYWdlcihlLnNvdXJjZSx7bXNnSGFuZGxlcjplLmhhbmRsZXIsbGVuZ3RoOmUubGVuZ3RoLGRpc2FibGVBdXRvRmV0Y2g6ZS5kaXNhYmxlQXV0b0ZldGNoLHJhbmdlQ2h1bmtTaXplOmUucmFuZ2VDaHVua1NpemV9KSx0aGlzLnBkZkRvY3VtZW50PW5ldyBzLlBERkRvY3VtZW50KHRoaXMsdGhpcy5zdHJlYW1NYW5hZ2VyLmdldFN0cmVhbSgpKX1hc3luYyBlbnN1cmUoZSx0LHIpe3RyeXtjb25zdCBuPWVbdF07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseShlLHIpOm59Y2F0Y2gobil7aWYoIShuIGluc3RhbmNlb2YgaS5NaXNzaW5nRGF0YUV4Y2VwdGlvbikpdGhyb3cgbjtyZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0UmFuZ2Uobi5iZWdpbixuLmVuZCksdGhpcy5lbnN1cmUoZSx0LHIpfX1yZXF1ZXN0UmFuZ2UoZSx0KXtyZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RSYW5nZShlLHQpfXJlcXVlc3RMb2FkZWRTdHJlYW0oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdEFsbENodW5rcyhlKX1zZW5kUHJvZ3Jlc3NpdmVEYXRhKGUpe3RoaXMuc3RyZWFtTWFuYWdlci5vblJlY2VpdmVEYXRhKHtjaHVuazplfSl9dGVybWluYXRlKGUpe3RoaXMuc3RyZWFtTWFuYWdlci5hYm9ydChlKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ2h1bmtlZFN0cmVhbU1hbmFnZXI9dC5DaHVua2VkU3RyZWFtPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoMTM5KSxyKDIpO3ZhciBuPXIoMTQ5KSxhPXIoMTQ0KSxpPXIoMTU0KTtjbGFzcyBzIGV4dGVuZHMgaS5TdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKG5ldyBVaW50OEFycmF5KGUpLDAsZSxudWxsKSx0aGlzLmNodW5rU2l6ZT10LHRoaXMuX2xvYWRlZENodW5rcz1uZXcgU2V0LHRoaXMubnVtQ2h1bmtzPU1hdGguY2VpbChlL3QpLHRoaXMubWFuYWdlcj1yLHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoPTAsdGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaz0tMX1nZXRNaXNzaW5nQ2h1bmtzKCl7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MCxyPXRoaXMubnVtQ2h1bmtzO3Q8cjsrK3QpdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyh0KXx8ZS5wdXNoKHQpO3JldHVybiBlfWdldCBudW1DaHVua3NMb2FkZWQoKXtyZXR1cm4gdGhpcy5fbG9hZGVkQ2h1bmtzLnNpemV9Z2V0IGlzRGF0YUxvYWRlZCgpe3JldHVybiB0aGlzLm51bUNodW5rc0xvYWRlZD09PXRoaXMubnVtQ2h1bmtzfW9uUmVjZWl2ZURhdGEoZSx0KXtjb25zdCByPXRoaXMuY2h1bmtTaXplO2lmKGUlciE9MCl0aHJvdyBuZXcgRXJyb3IoIkJhZCBiZWdpbiBvZmZzZXQ6ICIuY29uY2F0KGUpKTtjb25zdCBuPWUrdC5ieXRlTGVuZ3RoO2lmKG4lciE9MCYmbiE9PXRoaXMuYnl0ZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQmFkIGVuZCBvZmZzZXQ6ICIuY29uY2F0KG4pKTt0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheSh0KSxlKTtjb25zdCBhPU1hdGguZmxvb3IoZS9yKSxpPU1hdGguZmxvb3IoKG4tMSkvcikrMTtmb3IobGV0IGU9YTtlPGk7KytlKXRoaXMuX2xvYWRlZENodW5rcy5hZGQoZSl9b25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGUpe2xldCB0PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoO2NvbnN0IHI9TWF0aC5mbG9vcih0L3RoaXMuY2h1bmtTaXplKTt0aGlzLmJ5dGVzLnNldChuZXcgVWludDhBcnJheShlKSx0KSx0Kz1lLmJ5dGVMZW5ndGgsdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg9dDtjb25zdCBuPXQ+PXRoaXMuZW5kP3RoaXMubnVtQ2h1bmtzOk1hdGguZmxvb3IodC90aGlzLmNodW5rU2l6ZSk7Zm9yKGxldCBlPXI7ZTxuOysrZSl0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGUpfWVuc3VyZUJ5dGUoZSl7aWYoZTx0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aClyZXR1cm47Y29uc3QgdD1NYXRoLmZsb29yKGUvdGhpcy5jaHVua1NpemUpO2lmKCEodD50aGlzLm51bUNodW5rcykmJnQhPT10aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rKXtpZighdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyh0KSl0aHJvdyBuZXcgbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbihlLGUrMSk7dGhpcy5sYXN0U3VjY2Vzc2Z1bEVuc3VyZUJ5dGVDaHVuaz10fX1lbnN1cmVSYW5nZShlLHQpe2lmKGU+PXQpcmV0dXJuO2lmKHQ8PXRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKXJldHVybjtjb25zdCByPU1hdGguZmxvb3IoZS90aGlzLmNodW5rU2l6ZSk7aWYocj50aGlzLm51bUNodW5rcylyZXR1cm47Y29uc3QgYT1NYXRoLm1pbihNYXRoLmZsb29yKCh0LTEpL3RoaXMuY2h1bmtTaXplKSsxLHRoaXMubnVtQ2h1bmtzKTtmb3IobGV0IGk9cjtpPGE7KytpKWlmKCF0aGlzLl9sb2FkZWRDaHVua3MuaGFzKGkpKXRocm93IG5ldyBuLk1pc3NpbmdEYXRhRXhjZXB0aW9uKGUsdCl9bmV4dEVtcHR5Q2h1bmsoZSl7Y29uc3QgdD10aGlzLm51bUNodW5rcztmb3IobGV0IHI9MDtyPHQ7KytyKXtjb25zdCBuPShlK3IpJXQ7aWYoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMobikpcmV0dXJuIG59cmV0dXJuIG51bGx9aGFzQ2h1bmsoZSl7cmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5oYXMoZSl9Z2V0Qnl0ZSgpe2NvbnN0IGU9dGhpcy5wb3M7cmV0dXJuIGU+PXRoaXMuZW5kPy0xOihlPj10aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVCeXRlKGUpLHRoaXMuYnl0ZXNbdGhpcy5wb3MrK10pfWdldEJ5dGVzKGUpe2NvbnN0IHQ9dGhpcy5ieXRlcyxyPXRoaXMucG9zLG49dGhpcy5lbmQ7aWYoIWUpcmV0dXJuIG4+dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgmJnRoaXMuZW5zdXJlUmFuZ2UocixuKSx0LnN1YmFycmF5KHIsbik7bGV0IGE9citlO3JldHVybiBhPm4mJihhPW4pLGE+dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgmJnRoaXMuZW5zdXJlUmFuZ2UocixhKSx0aGlzLnBvcz1hLHQuc3ViYXJyYXkocixhKX1nZXRCeXRlUmFuZ2UoZSx0KXtyZXR1cm4gZTwwJiYoZT0wKSx0PnRoaXMuZW5kJiYodD10aGlzLmVuZCksdD50aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVSYW5nZShlLHQpLHRoaXMuYnl0ZXMuc3ViYXJyYXkoZSx0KX1tYWtlU3ViU3RyZWFtKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7ZnVuY3Rpb24gbigpe310P2UrdD50aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCYmdGhpcy5lbnN1cmVSYW5nZShlLGUrdCk6ZT49dGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgmJnRoaXMuZW5zdXJlQnl0ZShlKSxuLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHRoaXMpLG4ucHJvdG90eXBlLmdldE1pc3NpbmdDaHVua3M9ZnVuY3Rpb24oKXtjb25zdCBlPXRoaXMuY2h1bmtTaXplLHQ9TWF0aC5mbG9vcih0aGlzLnN0YXJ0L2UpLHI9TWF0aC5mbG9vcigodGhpcy5lbmQtMSkvZSkrMSxuPVtdO2ZvcihsZXQgZT10O2U8cjsrK2UpdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhlKXx8bi5wdXNoKGUpO3JldHVybiBufSxPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsImlzRGF0YUxvYWRlZCIse2dldCgpe3JldHVybiB0aGlzLm51bUNodW5rc0xvYWRlZD09PXRoaXMubnVtQ2h1bmtzfHwwPT09dGhpcy5nZXRNaXNzaW5nQ2h1bmtzKCkubGVuZ3RofSxjb25maWd1cmFibGU6ITB9KTtjb25zdCBhPW5ldyBuO3JldHVybiBhLnBvcz1hLnN0YXJ0PWUsYS5lbmQ9ZSt0fHx0aGlzLmVuZCxhLmRpY3Q9cixhfWdldEJhc2VTdHJlYW1zKCl7cmV0dXJuW3RoaXNdfX10LkNodW5rZWRTdHJlYW09cyx0LkNodW5rZWRTdHJlYW1NYW5hZ2VyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5sZW5ndGg9dC5sZW5ndGgsdGhpcy5jaHVua1NpemU9dC5yYW5nZUNodW5rU2l6ZSx0aGlzLnN0cmVhbT1uZXcgcyh0aGlzLmxlbmd0aCx0aGlzLmNodW5rU2l6ZSx0aGlzKSx0aGlzLnBkZk5ldHdvcmtTdHJlYW09ZSx0aGlzLmRpc2FibGVBdXRvRmV0Y2g9dC5kaXNhYmxlQXV0b0ZldGNoLHRoaXMubXNnSGFuZGxlcj10Lm1zZ0hhbmRsZXIsdGhpcy5jdXJyUmVxdWVzdElkPTAsdGhpcy5fY2h1bmtzTmVlZGVkQnlSZXF1ZXN0PW5ldyBNYXAsdGhpcy5fcmVxdWVzdHNCeUNodW5rPW5ldyBNYXAsdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3Q9bmV3IE1hcCx0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aD0wLHRoaXMuYWJvcnRlZD0hMSx0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5PW5ldyBhLlByb21pc2VDYXBhYmlsaXR5fXNlbmRSZXF1ZXN0KGUsdCl7Y29uc3Qgcj10aGlzLnBkZk5ldHdvcmtTdHJlYW0uZ2V0UmFuZ2VSZWFkZXIoZSx0KTtyLmlzU3RyZWFtaW5nU3VwcG9ydGVkfHwoci5vblByb2dyZXNzPXRoaXMub25Qcm9ncmVzcy5iaW5kKHRoaXMpKTtsZXQgYT1bXSxpPTA7cmV0dXJuIG5ldyBQcm9taXNlKCgoZSx0KT0+e2NvbnN0IHM9bz0+e2xldHt2YWx1ZTpjLGRvbmU6bH09bzt0cnl7aWYobCl7Y29uc3QgdD0oMCxuLmFycmF5QnVmZmVyc1RvQnl0ZXMpKGEpO3JldHVybiBhPW51bGwsdm9pZCBlKHQpfWkrPWMuYnl0ZUxlbmd0aCxyLmlzU3RyZWFtaW5nU3VwcG9ydGVkJiZ0aGlzLm9uUHJvZ3Jlc3Moe2xvYWRlZDppfSksYS5wdXNoKGMpLHIucmVhZCgpLnRoZW4ocyx0KX1jYXRjaChlKXt0KGUpfX07ci5yZWFkKCkudGhlbihzLHQpfSkpLnRoZW4oKHQ9Pnt0aGlzLmFib3J0ZWR8fHRoaXMub25SZWNlaXZlRGF0YSh7Y2h1bms6dCxiZWdpbjplfSl9KSl9cmVxdWVzdEFsbENodW5rcygpe2lmKCEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXSkpe2NvbnN0IGU9dGhpcy5zdHJlYW0uZ2V0TWlzc2luZ0NodW5rcygpO3RoaXMuX3JlcXVlc3RDaHVua3MoZSl9cmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucHJvbWlzZX1fcmVxdWVzdENodW5rcyhlKXtjb25zdCB0PXRoaXMuY3VyclJlcXVlc3RJZCsrLHI9bmV3IFNldDt0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Quc2V0KHQscik7Zm9yKGNvbnN0IHQgb2YgZSl0aGlzLnN0cmVhbS5oYXNDaHVuayh0KXx8ci5hZGQodCk7aWYoMD09PXIuc2l6ZSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgbj1uZXcgYS5Qcm9taXNlQ2FwYWJpbGl0eTt0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC5zZXQodCxuKTtjb25zdCBpPVtdO2Zvcihjb25zdCBlIG9mIHIpe2xldCByPXRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoZSk7cnx8KHI9W10sdGhpcy5fcmVxdWVzdHNCeUNodW5rLnNldChlLHIpLGkucHVzaChlKSksci5wdXNoKHQpfWlmKGkubGVuZ3RoPjApe2NvbnN0IGU9dGhpcy5ncm91cENodW5rcyhpKTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPXQuYmVnaW5DaHVuayp0aGlzLmNodW5rU2l6ZSxyPU1hdGgubWluKHQuZW5kQ2h1bmsqdGhpcy5jaHVua1NpemUsdGhpcy5sZW5ndGgpO3RoaXMuc2VuZFJlcXVlc3QoZSxyKS5jYXRjaChuLnJlamVjdCl9fXJldHVybiBuLnByb21pc2UuY2F0Y2goKGU9PntpZighdGhpcy5hYm9ydGVkKXRocm93IGV9KSl9Z2V0U3RyZWFtKCl7cmV0dXJuIHRoaXMuc3RyZWFtfXJlcXVlc3RSYW5nZShlLHQpe3Q9TWF0aC5taW4odCx0aGlzLmxlbmd0aCk7Y29uc3Qgcj10aGlzLmdldEJlZ2luQ2h1bmsoZSksbj10aGlzLmdldEVuZENodW5rKHQpLGE9W107Zm9yKGxldCBlPXI7ZTxuOysrZSlhLnB1c2goZSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RDaHVua3MoYSl9cmVxdWVzdFJhbmdlcygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXTtjb25zdCB0PVtdO2Zvcihjb25zdCByIG9mIGUpe2NvbnN0IGU9dGhpcy5nZXRCZWdpbkNodW5rKHIuYmVnaW4pLG49dGhpcy5nZXRFbmRDaHVuayhyLmVuZCk7Zm9yKGxldCByPWU7cjxuOysrcil0LmluY2x1ZGVzKHIpfHx0LnB1c2gocil9cmV0dXJuIHQuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSkpLHRoaXMuX3JlcXVlc3RDaHVua3ModCl9Z3JvdXBDaHVua3MoZSl7Y29uc3QgdD1bXTtsZXQgcj0tMSxuPS0xO2ZvcihsZXQgYT0wLGk9ZS5sZW5ndGg7YTxpOysrYSl7Y29uc3QgaT1lW2FdO3I8MCYmKHI9aSksbj49MCYmbisxIT09aSYmKHQucHVzaCh7YmVnaW5DaHVuazpyLGVuZENodW5rOm4rMX0pLHI9aSksYSsxPT09ZS5sZW5ndGgmJnQucHVzaCh7YmVnaW5DaHVuazpyLGVuZENodW5rOmkrMX0pLG49aX1yZXR1cm4gdH1vblByb2dyZXNzKGUpe3RoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIse2xvYWRlZDp0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQqdGhpcy5jaHVua1NpemUrZS5sb2FkZWQsdG90YWw6dGhpcy5sZW5ndGh9KX1vblJlY2VpdmVEYXRhKGUpe2NvbnN0IHQ9ZS5jaHVuayxyPXZvaWQgMD09PWUuYmVnaW4sbj1yP3RoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoOmUuYmVnaW4sYT1uK3QuYnl0ZUxlbmd0aCxpPU1hdGguZmxvb3Iobi90aGlzLmNodW5rU2l6ZSkscz1hPHRoaXMubGVuZ3RoP01hdGguZmxvb3IoYS90aGlzLmNodW5rU2l6ZSk6TWF0aC5jZWlsKGEvdGhpcy5jaHVua1NpemUpO3I/KHRoaXMuc3RyZWFtLm9uUmVjZWl2ZVByb2dyZXNzaXZlRGF0YSh0KSx0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aD1hKTp0aGlzLnN0cmVhbS5vblJlY2VpdmVEYXRhKG4sdCksdGhpcy5zdHJlYW0uaXNEYXRhTG9hZGVkJiZ0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlc29sdmUodGhpcy5zdHJlYW0pO2NvbnN0IG89W107Zm9yKGxldCBlPWk7ZTxzOysrZSl7Y29uc3QgdD10aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGUpO2lmKHQpe3RoaXMuX3JlcXVlc3RzQnlDaHVuay5kZWxldGUoZSk7Zm9yKGNvbnN0IHIgb2YgdCl7Y29uc3QgdD10aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QuZ2V0KHIpO3QuaGFzKGUpJiZ0LmRlbGV0ZShlKSx0LnNpemU+MHx8by5wdXNoKHIpfX19aWYoIXRoaXMuZGlzYWJsZUF1dG9GZXRjaCYmMD09PXRoaXMuX3JlcXVlc3RzQnlDaHVuay5zaXplKXtsZXQgZTtpZigxPT09dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKXtjb25zdCB0PXRoaXMuc3RyZWFtLm51bUNodW5rcy0xO3RoaXMuc3RyZWFtLmhhc0NodW5rKHQpfHwoZT10KX1lbHNlIGU9dGhpcy5zdHJlYW0ubmV4dEVtcHR5Q2h1bmsocyk7TnVtYmVyLmlzSW50ZWdlcihlKSYmdGhpcy5fcmVxdWVzdENodW5rcyhbZV0pfWZvcihjb25zdCBlIG9mIG8pe2NvbnN0IHQ9dGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KGUpO3RoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShlKSx0LnJlc29sdmUoKX10aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLHtsb2FkZWQ6dGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkKnRoaXMuY2h1bmtTaXplLHRvdGFsOnRoaXMubGVuZ3RofSl9b25FcnJvcihlKXt0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnJlamVjdChlKX1nZXRCZWdpbkNodW5rKGUpe3JldHVybiBNYXRoLmZsb29yKGUvdGhpcy5jaHVua1NpemUpfWdldEVuZENodW5rKGUpe3JldHVybiBNYXRoLmZsb29yKChlLTEpL3RoaXMuY2h1bmtTaXplKSsxfWFib3J0KGUpe3RoaXMuYWJvcnRlZD0hMCx0aGlzLnBkZk5ldHdvcmtTdHJlYW0mJnRoaXMucGRmTmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhlKTtmb3IoY29uc3QgdCBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSl0LnJlamVjdChlKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU3RyaW5nU3RyZWFtPXQuU3RyZWFtPXQuTnVsbFN0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTUxKSxhPXIoMTQ0KTtjbGFzcyBpIGV4dGVuZHMgbi5CYXNlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCxyLG4pe3N1cGVyKCksdGhpcy5ieXRlcz1lIGluc3RhbmNlb2YgVWludDhBcnJheT9lOm5ldyBVaW50OEFycmF5KGUpLHRoaXMuc3RhcnQ9dHx8MCx0aGlzLnBvcz10aGlzLnN0YXJ0LHRoaXMuZW5kPXQrcnx8dGhpcy5ieXRlcy5sZW5ndGgsdGhpcy5kaWN0PW59Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmVuZC10aGlzLnN0YXJ0fWdldCBpc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLmxlbmd0aH1nZXRCeXRlKCl7cmV0dXJuIHRoaXMucG9zPj10aGlzLmVuZD8tMTp0aGlzLmJ5dGVzW3RoaXMucG9zKytdfWdldEJ5dGVzKGUpe2NvbnN0IHQ9dGhpcy5ieXRlcyxyPXRoaXMucG9zLG49dGhpcy5lbmQ7aWYoIWUpcmV0dXJuIHQuc3ViYXJyYXkocixuKTtsZXQgYT1yK2U7cmV0dXJuIGE+biYmKGE9biksdGhpcy5wb3M9YSx0LnN1YmFycmF5KHIsYSl9Z2V0Qnl0ZVJhbmdlKGUsdCl7cmV0dXJuIGU8MCYmKGU9MCksdD50aGlzLmVuZCYmKHQ9dGhpcy5lbmQpLHRoaXMuYnl0ZXMuc3ViYXJyYXkoZSx0KX1yZXNldCgpe3RoaXMucG9zPXRoaXMuc3RhcnR9bW92ZVN0YXJ0KCl7dGhpcy5zdGFydD10aGlzLnBvc31tYWtlU3ViU3RyZWFtKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7cmV0dXJuIG5ldyBpKHRoaXMuYnl0ZXMuYnVmZmVyLGUsdCxyKX19dC5TdHJlYW09aSx0LlN0cmluZ1N0cmVhbT1jbGFzcyBleHRlbmRzIGl7Y29uc3RydWN0b3IoZSl7c3VwZXIoKDAsYS5zdHJpbmdUb0J5dGVzKShlKSl9fSx0Lk51bGxTdHJlYW09Y2xhc3MgZXh0ZW5kcyBpe2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IFVpbnQ4QXJyYXkoMCkpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5QYWdlPXQuUERGRG9jdW1lbnQ9dm9pZCAwLHIoMikscigxMzkpLHIoMTE2KSxyKDEyNikscigxMjgpLHIoMTMxKSxyKDEzMykscigxMzUpLHIoMTM3KSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpLGE9cigxNTYpLGk9cigxNDkpLGM9cigxNTApLGw9cigyMDEpLGg9cigxNTEpLHU9cigyMTgpLGQ9cigyMjApLGY9cigyMjIpLGc9cigyNTUpLHA9cigxNjYpLG09cigxNTQpLGI9cigyMjYpLHk9cigyMTQpLHc9cigxNjMpLHY9cigxNjgpLHg9cigyMjUpLFM9cigyMTYpLEE9cigyMjcpLGs9cigyNTYpO2NvbnN0IEM9WzAsMCw2MTIsNzkyXTt2YXIgTz1uZXcgV2Vha1NldDtjbGFzcyBGe2NvbnN0cnVjdG9yKGUpe3ModGhpcyxPKTtsZXR7cGRmTWFuYWdlcjp0LHhyZWY6cixwYWdlSW5kZXg6bixwYWdlRGljdDphLHJlZjppLGdsb2JhbElkRmFjdG9yeTpvLGZvbnRDYWNoZTpjLGJ1aWx0SW5DTWFwQ2FjaGU6bCxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6aCxnbG9iYWxJbWFnZUNhY2hlOnUsc3lzdGVtRm9udENhY2hlOmQsbm9uQmxlbmRNb2Rlc1NldDpmLHhmYUZhY3Rvcnk6Z309ZTt0aGlzLnBkZk1hbmFnZXI9dCx0aGlzLnBhZ2VJbmRleD1uLHRoaXMucGFnZURpY3Q9YSx0aGlzLnhyZWY9cix0aGlzLnJlZj1pLHRoaXMuZm9udENhY2hlPWMsdGhpcy5idWlsdEluQ01hcENhY2hlPWwsdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGU9aCx0aGlzLmdsb2JhbEltYWdlQ2FjaGU9dSx0aGlzLnN5c3RlbUZvbnRDYWNoZT1kLHRoaXMubm9uQmxlbmRNb2Rlc1NldD1mLHRoaXMuZXZhbHVhdG9yT3B0aW9ucz10LmV2YWx1YXRvck9wdGlvbnMsdGhpcy5yZXNvdXJjZXNQcm9taXNlPW51bGwsdGhpcy54ZmFGYWN0b3J5PWc7Y29uc3QgcD17b2JqOjB9O3RoaXMuX2xvY2FsSWRGYWN0b3J5PWNsYXNzIGV4dGVuZHMgb3tzdGF0aWMgY3JlYXRlT2JqSWQoKXtyZXR1cm4icCIuY29uY2F0KG4sIl8iKS5jb25jYXQoKytwLm9iail9c3RhdGljIGdldFBhZ2VPYmpJZCgpe3JldHVybiJwIi5jb25jYXQoaS50b1N0cmluZygpKX19fV9nZXRJbmhlcml0YWJsZVByb3BlcnR5KGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07Y29uc3Qgcj0oMCxpLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnRoaXMucGFnZURpY3Qsa2V5OmUsZ2V0QXJyYXk6dCxzdG9wV2hlbkZvdW5kOiExfSk7cmV0dXJuIEFycmF5LmlzQXJyYXkocik/MSE9PXIubGVuZ3RoJiZyWzBdaW5zdGFuY2VvZiBjLkRpY3Q/Yy5EaWN0Lm1lcmdlKHt4cmVmOnRoaXMueHJlZixkaWN0QXJyYXk6cn0pOnJbMF06cn1nZXQgY29udGVudCgpe3JldHVybiB0aGlzLnBhZ2VEaWN0LmdldEFycmF5KCJDb250ZW50cyIpfWdldCByZXNvdXJjZXMoKXtjb25zdCBlPXRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJlc291cmNlcyIpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJyZXNvdXJjZXMiLGUgaW5zdGFuY2VvZiBjLkRpY3Q/ZTpjLkRpY3QuZW1wdHkpfV9nZXRCb3VuZGluZ0JveChlKXtpZih0aGlzLnhmYURhdGEpcmV0dXJuIHRoaXMueGZhRGF0YS5iYm94O2xldCB0PXRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoZSwhMCk7aWYoQXJyYXkuaXNBcnJheSh0KSYmND09PXQubGVuZ3RoKXtpZih0PW4uVXRpbC5ub3JtYWxpemVSZWN0KHQpLHRbMl0tdFswXT4wJiZ0WzNdLXRbMV0+MClyZXR1cm4gdDsoMCxuLndhcm4pKCJFbXB0eSwgb3IgaW52YWxpZCwgLyIuY29uY2F0KGUsIiBlbnRyeS4iKSl9cmV0dXJuIG51bGx9Z2V0IG1lZGlhQm94KCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIm1lZGlhQm94Iix0aGlzLl9nZXRCb3VuZGluZ0JveCgiTWVkaWFCb3giKXx8Qyl9Z2V0IGNyb3BCb3goKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiY3JvcEJveCIsdGhpcy5fZ2V0Qm91bmRpbmdCb3goIkNyb3BCb3giKXx8dGhpcy5tZWRpYUJveCl9Z2V0IHVzZXJVbml0KCl7bGV0IGU9dGhpcy5wYWdlRGljdC5nZXQoIlVzZXJVbml0Iik7cmV0dXJuKCJudW1iZXIiIT10eXBlb2YgZXx8ZTw9MCkmJihlPTEpLCgwLG4uc2hhZG93KSh0aGlzLCJ1c2VyVW5pdCIsZSl9Z2V0IHZpZXcoKXtjb25zdHtjcm9wQm94OmUsbWVkaWFCb3g6dH09dGhpcztpZihlIT09dCYmISgwLG4uaXNBcnJheUVxdWFsKShlLHQpKXtjb25zdCByPW4uVXRpbC5pbnRlcnNlY3QoZSx0KTtpZihyJiZyWzJdLXJbMF0+MCYmclszXS1yWzFdPjApcmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsInZpZXciLHIpOygwLG4ud2FybikoIkVtcHR5IC9Dcm9wQm94IGFuZCAvTWVkaWFCb3ggaW50ZXJzZWN0aW9uLiIpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJ2aWV3Iix0KX1nZXQgcm90YXRlKCl7bGV0IGU9dGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiUm90YXRlIil8fDA7cmV0dXJuIGUlOTAhPTA/ZT0wOmU+PTM2MD9lJT0zNjA6ZTwwJiYoZT0oZSUzNjArMzYwKSUzNjApLCgwLG4uc2hhZG93KSh0aGlzLCJyb3RhdGUiLGUpfV9vblN1YlN0cmVhbUVycm9yKGUsdCl7aWYoIXRoaXMuZXZhbHVhdG9yT3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxuLndhcm4pKCJnZXRDb250ZW50U3RyZWFtIC0gaWdub3Jpbmcgc3ViLXN0cmVhbSAoIi5jb25jYXQodCwnKTogIicpLmNvbmNhdChlLCciLicpKX1nZXRDb250ZW50U3RyZWFtKCl7cmV0dXJuIHRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywiY29udGVudCIpLnRoZW4oKGU9PmUgaW5zdGFuY2VvZiBoLkJhc2VTdHJlYW0/ZTpBcnJheS5pc0FycmF5KGUpP25ldyB2LlN0cmVhbXNTZXF1ZW5jZVN0cmVhbShlLHRoaXMuX29uU3ViU3RyZWFtRXJyb3IuYmluZCh0aGlzKSk6bmV3IG0uTnVsbFN0cmVhbSkpfWdldCB4ZmFEYXRhKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsInhmYURhdGEiLHRoaXMueGZhRmFjdG9yeT97YmJveDp0aGlzLnhmYUZhY3RvcnkuZ2V0Qm91bmRpbmdCb3godGhpcy5wYWdlSW5kZXgpfTpudWxsKX1hc3luYyBzYXZlTmV3QW5ub3RhdGlvbnMoZSx0LHIsbil7aWYodGhpcy54ZmFGYWN0b3J5KXRocm93IG5ldyBFcnJvcigiWEZBOiBDYW5ub3Qgc2F2ZSBuZXcgYW5ub3RhdGlvbnMuIik7Y29uc3QgaT1uZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOmUscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pLHM9bmV3IGMuUmVmU2V0LGw9bmV3IGMuUmVmU2V0O28odGhpcyxPLEkpLmNhbGwodGhpcyxyLHMsbCk7Y29uc3QgaD10aGlzLnBhZ2VEaWN0LHU9dGhpcy5hbm5vdGF0aW9ucy5maWx0ZXIoKGU9PiEoZSBpbnN0YW5jZW9mIGMuUmVmJiZzLmhhcyhlKSkpKSxkPWF3YWl0IGEuQW5ub3RhdGlvbkZhY3Rvcnkuc2F2ZU5ld0Fubm90YXRpb25zKGksdCxyLG4pO2Zvcihjb25zdHtyZWY6ZX1vZiBkLmFubm90YXRpb25zKWUgaW5zdGFuY2VvZiBjLlJlZiYmIWwuaGFzKGUpJiZ1LnB1c2goZSk7Y29uc3QgZj1oLmdldCgiQW5ub3RzIik7aC5zZXQoIkFubm90cyIsdSk7Y29uc3QgZz1bXTtsZXQgcD1udWxsO3RoaXMueHJlZi5lbmNyeXB0JiYocD10aGlzLnhyZWYuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbikpLGF3YWl0KDAsUy53cml0ZU9iamVjdCkodGhpcy5yZWYsaCxnLHApLGYmJmguc2V0KCJBbm5vdHMiLGYpO2NvbnN0IG09ZC5kZXBlbmRlbmNpZXM7cmV0dXJuIG0ucHVzaCh7cmVmOnRoaXMucmVmLGRhdGE6Zy5qb2luKCIiKX0sLi4uZC5hbm5vdGF0aW9ucyksbX1zYXZlKGUsdCxyKXtjb25zdCBhPW5ldyB3LlBhcnRpYWxFdmFsdWF0b3Ioe3hyZWY6dGhpcy54cmVmLGhhbmRsZXI6ZSxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgsaWRGYWN0b3J5OnRoaXMuX2xvY2FsSWRGYWN0b3J5LGZvbnRDYWNoZTp0aGlzLmZvbnRDYWNoZSxidWlsdEluQ01hcENhY2hlOnRoaXMuYnVpbHRJbkNNYXBDYWNoZSxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6dGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsZ2xvYmFsSW1hZ2VDYWNoZTp0aGlzLmdsb2JhbEltYWdlQ2FjaGUsc3lzdGVtRm9udENhY2hlOnRoaXMuc3lzdGVtRm9udENhY2hlLG9wdGlvbnM6dGhpcy5ldmFsdWF0b3JPcHRpb25zfSk7cmV0dXJuIHRoaXMuX3BhcnNlZEFubm90YXRpb25zLnRoZW4oKGZ1bmN0aW9uKGUpe2NvbnN0IGk9W107Zm9yKGNvbnN0IHMgb2YgZSlzLm11c3RCZVByaW50ZWQocikmJmkucHVzaChzLnNhdmUoYSx0LHIpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4oMCxuLndhcm4pKCdzYXZlIC0gaWdub3JpbmcgYW5ub3RhdGlvbiBkYXRhIGR1cmluZyAiJy5jb25jYXQodC5uYW1lLCciIHRhc2s6ICInKS5jb25jYXQoZSwnIi4nKSksbnVsbH0pKSk7cmV0dXJuIFByb21pc2UuYWxsKGkpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLmZpbHRlcigoZT0+ISFlKSl9KSl9KSl9bG9hZFJlc291cmNlcyhlKXtyZXR1cm4gdGhpcy5yZXNvdXJjZXNQcm9taXNlfHwodGhpcy5yZXNvdXJjZXNQcm9taXNlPXRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywicmVzb3VyY2VzIikpLHRoaXMucmVzb3VyY2VzUHJvbWlzZS50aGVuKCgoKT0+bmV3IGIuT2JqZWN0TG9hZGVyKHRoaXMucmVzb3VyY2VzLGUsdGhpcy54cmVmKS5sb2FkKCkpKX1nZXRPcGVyYXRvckxpc3QoZSl7bGV0e2hhbmRsZXI6dCxzaW5rOnIsdGFzazpzLGludGVudDpsLGNhY2hlS2V5OmgsYW5ub3RhdGlvblN0b3JhZ2U6dT1udWxsfT1lO2NvbnN0IGQ9dGhpcy5nZXRDb250ZW50U3RyZWFtKCksZj10aGlzLmxvYWRSZXNvdXJjZXMoWyJDb2xvclNwYWNlIiwiRXh0R1N0YXRlIiwiRm9udCIsIlBhdHRlcm4iLCJQcm9wZXJ0aWVzIiwiU2hhZGluZyIsIlhPYmplY3QiXSksZz1uZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOnQscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pLHA9dGhpcy54ZmFGYWN0b3J5P251bGw6KDAsaS5nZXROZXdBbm5vdGF0aW9uc01hcCkodSk7bGV0IG09bnVsbCxiPVByb21pc2UucmVzb2x2ZShudWxsKTtpZihwKXtsZXQgZTtjb25zdCB0PXAuZ2V0KHRoaXMucGFnZUluZGV4KTtpZih0KXtjb25zdCByPW5ldyBTZXQ7Zm9yKGNvbnN0e2JpdG1hcElkOmUsYml0bWFwOm59b2YgdCkhZXx8bnx8ci5oYXMoZSl8fHIuYWRkKGUpO2NvbnN0e2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOml9PXRoaXMuZXZhbHVhdG9yT3B0aW9ucztpZihyLnNpemU+MCl7Y29uc3Qgcz10LnNsaWNlKCk7Zm9yKGNvbnN0W2UsdF1vZiB1KWUuc3RhcnRzV2l0aChuLkFubm90YXRpb25FZGl0b3JQcmVmaXgpJiZ0LmJpdG1hcCYmci5oYXModC5iaXRtYXBJZCkmJnMucHVzaCh0KTtlPWEuQW5ub3RhdGlvbkZhY3RvcnkuZ2VuZXJhdGVJbWFnZXMocyx0aGlzLnhyZWYsaSl9ZWxzZSBlPWEuQW5ub3RhdGlvbkZhY3RvcnkuZ2VuZXJhdGVJbWFnZXModCx0aGlzLnhyZWYsaSk7bT1uZXcgYy5SZWZTZXQsbyh0aGlzLE8sSSkuY2FsbCh0aGlzLHQsbSxudWxsKSxiPWEuQW5ub3RhdGlvbkZhY3RvcnkucHJpbnROZXdBbm5vdGF0aW9ucyhnLHMsdCxlKX19Y29uc3Qgdj1Qcm9taXNlLmFsbChbZCxmXSkudGhlbigoZT0+e2xldFtuXT1lO2NvbnN0IGE9bmV3IHkuT3BlcmF0b3JMaXN0KGwscik7cmV0dXJuIHQuc2VuZCgiU3RhcnRSZW5kZXJQYWdlIix7dHJhbnNwYXJlbmN5OmcuaGFzQmxlbmRNb2Rlcyh0aGlzLnJlc291cmNlcyx0aGlzLm5vbkJsZW5kTW9kZXNTZXQpLHBhZ2VJbmRleDp0aGlzLnBhZ2VJbmRleCxjYWNoZUtleTpofSksZy5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTpuLHRhc2s6cyxyZXNvdXJjZXM6dGhpcy5yZXNvdXJjZXMsb3BlcmF0b3JMaXN0OmF9KS50aGVuKChmdW5jdGlvbigpe3JldHVybiBhfSkpfSkpO3JldHVybiBQcm9taXNlLmFsbChbdix0aGlzLl9wYXJzZWRBbm5vdGF0aW9ucyxiXSkudGhlbigoZnVuY3Rpb24oZSl7bGV0W3QscixhXT1lO2lmKGEpe3I9ci5maWx0ZXIoKGU9PiEoZS5yZWYmJm0uaGFzKGUucmVmKSkpKTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKyspe2NvbnN0IG49YVtlXTtpZihuLnJlZlRvUmVwbGFjZSl7Y29uc3QgaT1yLmZpbmRJbmRleCgoZT0+ZS5yZWYmJigwLGMuaXNSZWZzRXF1YWwpKGUucmVmLG4ucmVmVG9SZXBsYWNlKSkpO2k+PTAmJihyLnNwbGljZShpLDEsbiksYS5zcGxpY2UoZS0tLDEpLHQtLSl9fXI9ci5jb25jYXQoYSl9aWYoMD09PXIubGVuZ3RofHxsJm4uUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19ESVNBQkxFKXJldHVybiB0LmZsdXNoKCEwKSx7bGVuZ3RoOnQudG90YWxMZW5ndGh9O2NvbnN0IGk9ISEobCZuLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRk9STVMpLG89ISEobCZuLlJlbmRlcmluZ0ludGVudEZsYWcuQU5ZKSxoPSEhKGwmbi5SZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVkpLGQ9ISEobCZuLlJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQpLGY9W107Zm9yKGNvbnN0IGUgb2Ygcikob3x8aCYmZS5tdXN0QmVWaWV3ZWQodSl8fGQmJmUubXVzdEJlUHJpbnRlZCh1KSkmJmYucHVzaChlLmdldE9wZXJhdG9yTGlzdChnLHMsbCxpLHUpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4oMCxuLndhcm4pKCdnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICInLmNvbmNhdChzLm5hbWUsJyIgdGFzazogIicpLmNvbmNhdChlLCciLicpKSx7b3BMaXN0Om51bGwsc2VwYXJhdGVGb3JtOiExLHNlcGFyYXRlQ2FudmFzOiExfX0pKSk7cmV0dXJuIFByb21pc2UuYWxsKGYpLnRoZW4oKGZ1bmN0aW9uKGUpe2xldCByPSExLG49ITE7Zm9yKGNvbnN0e29wTGlzdDphLHNlcGFyYXRlRm9ybTppLHNlcGFyYXRlQ2FudmFzOnN9b2YgZSl0LmFkZE9wTGlzdChhKSxyfHwocj1pKSxufHwobj1zKTtyZXR1cm4gdC5mbHVzaCghMCx7Zm9ybTpyLGNhbnZhczpufSkse2xlbmd0aDp0LnRvdGFsTGVuZ3RofX0pKX0pKX1leHRyYWN0VGV4dENvbnRlbnQoZSl7bGV0e2hhbmRsZXI6dCx0YXNrOnIsaW5jbHVkZU1hcmtlZENvbnRlbnQ6bixkaXNhYmxlTm9ybWFsaXphdGlvbjphLHNpbms6aX09ZTtjb25zdCBzPXRoaXMuZ2V0Q29udGVudFN0cmVhbSgpLG89dGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwiRm9udCIsIlByb3BlcnRpZXMiLCJYT2JqZWN0Il0pO3JldHVybiBQcm9taXNlLmFsbChbcyxvXSkudGhlbigoZT0+e2xldFtzXT1lO3JldHVybiBuZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOnQscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pLmdldFRleHRDb250ZW50KHtzdHJlYW06cyx0YXNrOnIscmVzb3VyY2VzOnRoaXMucmVzb3VyY2VzLGluY2x1ZGVNYXJrZWRDb250ZW50Om4sZGlzYWJsZU5vcm1hbGl6YXRpb246YSxzaW5rOmksdmlld0JveDp0aGlzLnZpZXd9KX0pKX1hc3luYyBnZXRTdHJ1Y3RUcmVlKCl7Y29uc3QgZT1hd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygic3RydWN0VHJlZVJvb3QiKTtyZXR1cm4gZT8oYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCJfcGFyc2VTdHJ1Y3RUcmVlIixbZV0pKS5zZXJpYWxpemFibGU6bnVsbH1fcGFyc2VTdHJ1Y3RUcmVlKGUpe2NvbnN0IHQ9bmV3IHguU3RydWN0VHJlZVBhZ2UoZSx0aGlzLnBhZ2VEaWN0KTtyZXR1cm4gdC5wYXJzZSgpLHR9YXN5bmMgZ2V0QW5ub3RhdGlvbnNEYXRhKGUsdCxyKXtjb25zdCBhPWF3YWl0IHRoaXMuX3BhcnNlZEFubm90YXRpb25zO2lmKDA9PT1hLmxlbmd0aClyZXR1cm5bXTtjb25zdCBpPVtdLHM9W107bGV0IG87Y29uc3QgYz0hIShyJm4uUmVuZGVyaW5nSW50ZW50RmxhZy5BTlkpLGw9ISEociZuLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksaD0hIShyJm4uUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7Zm9yKGNvbnN0IHIgb2YgYSl7Y29uc3QgYT1jfHxsJiZyLnZpZXdhYmxlOyhhfHxoJiZyLnByaW50YWJsZSkmJmkucHVzaChyLmRhdGEpLHIuaGFzVGV4dENvbnRlbnQmJmEmJihvfHwobz1uZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOmUscGFnZUluZGV4OnRoaXMucGFnZUluZGV4LGlkRmFjdG9yeTp0aGlzLl9sb2NhbElkRmFjdG9yeSxmb250Q2FjaGU6dGhpcy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6dGhpcy5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTp0aGlzLnN5c3RlbUZvbnRDYWNoZSxvcHRpb25zOnRoaXMuZXZhbHVhdG9yT3B0aW9uc30pKSxzLnB1c2goci5leHRyYWN0VGV4dENvbnRlbnQobyx0LFstMS8wLC0xLzAsMS8wLDEvMF0pLmNhdGNoKChmdW5jdGlvbihlKXsoMCxuLndhcm4pKCdnZXRBbm5vdGF0aW9uc0RhdGEgLSBpZ25vcmluZyB0ZXh0Q29udGVudCBkdXJpbmcgIicuY29uY2F0KHQubmFtZSwnIiB0YXNrOiAiJykuY29uY2F0KGUsJyIuJykpfSkpKSl9cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHMpLGl9Z2V0IGFubm90YXRpb25zKCl7Y29uc3QgZT10aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KCJBbm5vdHMiKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiYW5ub3RhdGlvbnMiLEFycmF5LmlzQXJyYXkoZSk/ZTpbXSl9Z2V0IF9wYXJzZWRBbm5vdGF0aW9ucygpe2NvbnN0IGU9dGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCJhbm5vdGF0aW9ucyIpLnRoZW4oKCgpPT57Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiB0aGlzLmFubm90YXRpb25zKWUucHVzaChhLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh0aGlzLnhyZWYsdCx0aGlzLnBkZk1hbmFnZXIsdGhpcy5fbG9jYWxJZEZhY3RvcnksITEpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4oMCxuLndhcm4pKCdfcGFyc2VkQW5ub3RhdGlvbnM6ICInLmNvbmNhdChlLCciLicpKSxudWxsfSkpKTtyZXR1cm4gUHJvbWlzZS5hbGwoZSkudGhlbigoZnVuY3Rpb24oZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiBlO2NvbnN0IHQ9W107bGV0IHI7Zm9yKGNvbnN0IG4gb2YgZSluJiYobiBpbnN0YW5jZW9mIGEuUG9wdXBBbm5vdGF0aW9uPyhyfHwocj1bXSkpLnB1c2gobik6dC5wdXNoKG4pKTtyZXR1cm4gciYmdC5wdXNoKC4uLnIpLHR9KSl9KSk7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIl9wYXJzZWRBbm5vdGF0aW9ucyIsZSl9Z2V0IGpzQWN0aW9ucygpe2NvbnN0IGU9KDAsaS5jb2xsZWN0QWN0aW9ucykodGhpcy54cmVmLHRoaXMucGFnZURpY3Qsbi5QYWdlQWN0aW9uRXZlbnRUeXBlKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywianNBY3Rpb25zIixlKX19ZnVuY3Rpb24gSShlLHQscil7Zm9yKGNvbnN0IGEgb2YgZSlpZihhLmlkKXtjb25zdCBlPWMuUmVmLmZyb21TdHJpbmcoYS5pZCk7aWYoIWUpeygwLG4ud2FybikoIkEgbm9uLWxpbmtlZCBhbm5vdGF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZDogIi5jb25jYXQoYS5pZCkpO2NvbnRpbnVlfWlmKGEuZGVsZXRlZCl7dC5wdXQoZSk7Y29udGludWV9bnVsbD09cnx8ci5wdXQoZSksYS5yZWY9ZSxkZWxldGUgYS5pZH19dC5QYWdlPUY7Y29uc3QgVD1uZXcgVWludDhBcnJheShbMzcsODAsNjgsNzAsNDVdKSxNPW5ldyBVaW50OEFycmF5KFsxMTUsMTE2LDk3LDExNCwxMTYsMTIwLDExNCwxMDEsMTAyXSksRT1uZXcgVWludDhBcnJheShbMTAxLDExMCwxMDAsMTExLDk4LDEwNl0pO2Z1bmN0aW9uIFAoZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MTAyNCxuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107Y29uc3QgYT10Lmxlbmd0aCxpPWUucGVla0J5dGVzKHIpLHM9aS5sZW5ndGgtYTtpZihzPD0wKXJldHVybiExO2lmKG4pe2NvbnN0IHI9YS0xO2xldCBuPWkubGVuZ3RoLTE7Zm9yKDtuPj1yOyl7bGV0IHM9MDtmb3IoO3M8YSYmaVtuLXNdPT09dFtyLXNdOylzKys7aWYocz49YSlyZXR1cm4gZS5wb3MrPW4tciwhMDtuLS19fWVsc2V7bGV0IHI9MDtmb3IoO3I8PXM7KXtsZXQgbj0wO2Zvcig7bjxhJiZpW3Irbl09PT10W25dOyluKys7aWYobj49YSlyZXR1cm4gZS5wb3MrPXIsITA7cisrfX1yZXR1cm4hMX10LlBERkRvY3VtZW50PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7aWYodC5sZW5ndGg8PTApdGhyb3cgbmV3IG4uSW52YWxpZFBERkV4Y2VwdGlvbigiVGhlIFBERiBmaWxlIGlzIGVtcHR5LCBpLmUuIGl0cyBzaXplIGlzIHplcm8gYnl0ZXMuIik7dGhpcy5wZGZNYW5hZ2VyPWUsdGhpcy5zdHJlYW09dCx0aGlzLnhyZWY9bmV3IGsuWFJlZih0LGUpLHRoaXMuX3BhZ2VQcm9taXNlcz1uZXcgTWFwLHRoaXMuX3ZlcnNpb249bnVsbDtjb25zdCByPXtmb250OjB9O3RoaXMuX2dsb2JhbElkRmFjdG9yeT1jbGFzc3tzdGF0aWMgZ2V0RG9jSWQoKXtyZXR1cm4iZ18iLmNvbmNhdChlLmRvY0lkKX1zdGF0aWMgY3JlYXRlRm9udElkKCl7cmV0dXJuImYiKyArK3IuZm9udH1zdGF0aWMgY3JlYXRlT2JqSWQoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBjcmVhdGVPYmpJZGAgY2FsbGVkLiIpfXN0YXRpYyBnZXRQYWdlT2JqSWQoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRQYWdlT2JqSWRgIGNhbGxlZC4iKX19fXBhcnNlKGUpe3RoaXMueHJlZi5wYXJzZShlKSx0aGlzLmNhdGFsb2c9bmV3IGQuQ2F0YWxvZyh0aGlzLnBkZk1hbmFnZXIsdGhpcy54cmVmKX1nZXQgbGluZWFyaXphdGlvbigpe2xldCBlPW51bGw7dHJ5e2U9cC5MaW5lYXJpemF0aW9uLmNyZWF0ZSh0aGlzLnN0cmVhbSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGkuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLmluZm8pKGUpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJsaW5lYXJpemF0aW9uIixlKX1nZXQgc3RhcnRYUmVmKCl7Y29uc3QgZT10aGlzLnN0cmVhbTtsZXQgdD0wO2lmKHRoaXMubGluZWFyaXphdGlvbillLnJlc2V0KCksUChlLEUpJiYodD1lLnBvcys2LWUuc3RhcnQpO2Vsc2V7Y29uc3Qgcj0xMDI0LG49TS5sZW5ndGg7bGV0IGE9ITEscz1lLmVuZDtmb3IoOyFhJiZzPjA7KXMtPXItbixzPDAmJihzPTApLGUucG9zPXMsYT1QKGUsTSxyLCEwKTtpZihhKXtsZXQgcjtlLnNraXAoOSk7ZG97cj1lLmdldEJ5dGUoKX13aGlsZSgoMCxpLmlzV2hpdGVTcGFjZSkocikpO2xldCBuPSIiO2Zvcig7cj49MzImJnI8PTU3OyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpLHI9ZS5nZXRCeXRlKCk7dD1wYXJzZUludChuLDEwKSxpc05hTih0KSYmKHQ9MCl9fXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJzdGFydFhSZWYiLHQpfWNoZWNrSGVhZGVyKCl7Y29uc3QgZT10aGlzLnN0cmVhbTtpZihlLnJlc2V0KCksIVAoZSxUKSlyZXR1cm47ZS5tb3ZlU3RhcnQoKSxlLnNraXAoVC5sZW5ndGgpO2xldCB0LHI9IiI7Zm9yKDsodD1lLmdldEJ5dGUoKSk+MzImJnIubGVuZ3RoPDc7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUodCk7aS5QREZfVkVSU0lPTl9SRUdFWFAudGVzdChyKT90aGlzLl92ZXJzaW9uPXI6KDAsbi53YXJuKSgiSW52YWxpZCBQREYgaGVhZGVyIHZlcnNpb246ICIuY29uY2F0KHIpKX1wYXJzZVN0YXJ0WFJlZigpe3RoaXMueHJlZi5zZXRTdGFydFhSZWYodGhpcy5zdGFydFhSZWYpfWdldCBudW1QYWdlcygpe2xldCBlPTA7cmV0dXJuIGU9dGhpcy5jYXRhbG9nLmhhc0FjdHVhbE51bVBhZ2VzP3RoaXMuY2F0YWxvZy5udW1QYWdlczp0aGlzLnhmYUZhY3Rvcnk/dGhpcy54ZmFGYWN0b3J5LmdldE51bVBhZ2VzKCk6dGhpcy5saW5lYXJpemF0aW9uP3RoaXMubGluZWFyaXphdGlvbi5udW1QYWdlczp0aGlzLmNhdGFsb2cubnVtUGFnZXMsKDAsbi5zaGFkb3cpKHRoaXMsIm51bVBhZ2VzIixlKX1faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06MDtyZXR1cm4hIUFycmF5LmlzQXJyYXkoZSkmJmUuZXZlcnkoKGU9PntpZighKChlPXRoaXMueHJlZi5mZXRjaElmUmVmKGUpKWluc3RhbmNlb2YgYy5EaWN0KSlyZXR1cm4hMTtpZihlLmhhcygiS2lkcyIpKXJldHVybisrdD4xMD8oKDAsbi53YXJuKSgiX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXM6IG1heGltdW0gcmVjdXJzaW9uIGRlcHRoIHJlYWNoZWQiKSwhMSk6dGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhlLmdldCgiS2lkcyIpLHQpO2NvbnN0IHI9KDAsYy5pc05hbWUpKGUuZ2V0KCJGVCIpLCJTaWciKSxhPWUuZ2V0KCJSZWN0IiksaT1BcnJheS5pc0FycmF5KGEpJiZhLmV2ZXJ5KChlPT4wPT09ZSkpO3JldHVybiByJiZpfSkpfWdldCBfeGZhU3RyZWFtcygpe2NvbnN0IGU9dGhpcy5jYXRhbG9nLmFjcm9Gb3JtO2lmKCFlKXJldHVybiBudWxsO2NvbnN0IHQ9ZS5nZXQoIlhGQSIpLHI9eyJ4ZHA6eGRwIjoiIix0ZW1wbGF0ZToiIixkYXRhc2V0czoiIixjb25maWc6IiIsY29ubmVjdGlvblNldDoiIixsb2NhbGVTZXQ6IiIsc3R5bGVzaGVldDoiIiwiL3hkcDp4ZHAiOiIifTtpZih0IGluc3RhbmNlb2YgaC5CYXNlU3RyZWFtJiYhdC5pc0VtcHR5KXJldHVybiByWyJ4ZHA6eGRwIl09dCxyO2lmKCFBcnJheS5pc0FycmF5KHQpfHwwPT09dC5sZW5ndGgpcmV0dXJuIG51bGw7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Mil7bGV0IGE7aWYoYT0wPT09ZT8ieGRwOnhkcCI6ZT09PW4tMj8iL3hkcDp4ZHAiOnRbZV0sIXIuaGFzT3duUHJvcGVydHkoYSkpY29udGludWU7Y29uc3QgaT10aGlzLnhyZWYuZmV0Y2hJZlJlZih0W2UrMV0pO2kgaW5zdGFuY2VvZiBoLkJhc2VTdHJlYW0mJiFpLmlzRW1wdHkmJihyW2FdPWkpfXJldHVybiByfWdldCB4ZmFEYXRhc2V0cygpe2NvbnN0IGU9dGhpcy5feGZhU3RyZWFtcztpZighZSlyZXR1cm4oMCxuLnNoYWRvdykodGhpcywieGZhRGF0YXNldHMiLG51bGwpO2Zvcihjb25zdCB0IG9mWyJkYXRhc2V0cyIsInhkcDp4ZHAiXSl7Y29uc3Qgcj1lW3RdO2lmKHIpdHJ5e2NvbnN0IGU9e1t0XTooMCxuLnN0cmluZ1RvVVRGOFN0cmluZykoci5nZXRTdHJpbmcoKSl9O3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJ4ZmFEYXRhc2V0cyIsbmV3IGcuRGF0YXNldFJlYWRlcihlKSl9Y2F0Y2goZSl7KDAsbi53YXJuKSgiWEZBIC0gSW52YWxpZCB1dGYtOCBzdHJpbmcuIik7YnJlYWt9fXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJ4ZmFEYXRhc2V0cyIsbnVsbCl9Z2V0IHhmYURhdGEoKXtjb25zdCBlPXRoaXMuX3hmYVN0cmVhbXM7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3QgdD1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdFtyLGFdb2YgT2JqZWN0LmVudHJpZXMoZSkpaWYoYSl0cnl7dFtyXT0oMCxuLnN0cmluZ1RvVVRGOFN0cmluZykoYS5nZXRTdHJpbmcoKSl9Y2F0Y2goZSl7cmV0dXJuKDAsbi53YXJuKSgiWEZBIC0gSW52YWxpZCB1dGYtOCBzdHJpbmcuIiksbnVsbH1yZXR1cm4gdH1nZXQgeGZhRmFjdG9yeSgpe2xldCBlO3JldHVybiB0aGlzLnBkZk1hbmFnZXIuZW5hYmxlWGZhJiZ0aGlzLmNhdGFsb2cubmVlZHNSZW5kZXJpbmcmJnRoaXMuZm9ybUluZm8uaGFzWGZhJiYhdGhpcy5mb3JtSW5mby5oYXNBY3JvRm9ybSYmKGU9dGhpcy54ZmFEYXRhKSwoMCxuLnNoYWRvdykodGhpcywieGZhRmFjdG9yeSIsZT9uZXcgQS5YRkFGYWN0b3J5KGUpOm51bGwpfWdldCBpc1B1cmVYZmEoKXtyZXR1cm4hIXRoaXMueGZhRmFjdG9yeSYmdGhpcy54ZmFGYWN0b3J5LmlzVmFsaWQoKX1nZXQgaHRtbEZvclhmYSgpe3JldHVybiB0aGlzLnhmYUZhY3Rvcnk/dGhpcy54ZmFGYWN0b3J5LmdldFBhZ2VzKCk6bnVsbH1hc3luYyBsb2FkWGZhSW1hZ2VzKCl7Y29uc3QgZT1hd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygieGZhSW1hZ2VzIik7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9ZS5nZXRLZXlzKCkscj1uZXcgYi5PYmplY3RMb2FkZXIoZSx0LHRoaXMueHJlZik7YXdhaXQgci5sb2FkKCk7Y29uc3Qgbj1uZXcgTWFwO2Zvcihjb25zdCByIG9mIHQpe2NvbnN0IHQ9ZS5nZXQocik7dCBpbnN0YW5jZW9mIGguQmFzZVN0cmVhbSYmbi5zZXQocix0LmdldEJ5dGVzKCkpfXRoaXMueGZhRmFjdG9yeS5zZXRJbWFnZXMobil9YXN5bmMgbG9hZFhmYUZvbnRzKGUsdCl7Y29uc3Qgcj1hd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKTtpZighcilyZXR1cm47Y29uc3QgYT1hd2FpdCByLmdldEFzeW5jKCJEUiIpO2lmKCEoYSBpbnN0YW5jZW9mIGMuRGljdCkpcmV0dXJuO2NvbnN0IHM9bmV3IGIuT2JqZWN0TG9hZGVyKGEsWyJGb250Il0sdGhpcy54cmVmKTthd2FpdCBzLmxvYWQoKTtjb25zdCBvPWEuZ2V0KCJGb250Iik7aWYoIShvIGluc3RhbmNlb2YgYy5EaWN0KSlyZXR1cm47Y29uc3QgaD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5wZGZNYW5hZ2VyLmV2YWx1YXRvck9wdGlvbnMpO2gudXNlU3lzdGVtRm9udHM9ITE7Y29uc3QgdT1uZXcgdy5QYXJ0aWFsRXZhbHVhdG9yKHt4cmVmOnRoaXMueHJlZixoYW5kbGVyOmUscGFnZUluZGV4Oi0xLGlkRmFjdG9yeTp0aGlzLl9nbG9iYWxJZEZhY3RvcnksZm9udENhY2hlOnRoaXMuY2F0YWxvZy5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTp0aGlzLmNhdGFsb2cuYnVpbHRJbkNNYXBDYWNoZSxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6dGhpcy5jYXRhbG9nLnN0YW5kYXJkRm9udERhdGFDYWNoZSxvcHRpb25zOmh9KSxkPW5ldyB5Lk9wZXJhdG9yTGlzdCxmPVtdLGc9e2dldCBmb250KCl7cmV0dXJuIGYuYXQoLTEpfSxzZXQgZm9udChlKXtmLnB1c2goZSl9LGNsb25lKCl7cmV0dXJuIHRoaXN9fSxwPW5ldyBNYXA7by5mb3JFYWNoKCgoZSx0KT0+e3Auc2V0KGUsdCl9KSk7Y29uc3QgbT1bXTtmb3IoY29uc3RbZSxyXW9mIHApe2NvbnN0IHM9ci5nZXQoIkZvbnREZXNjcmlwdG9yIik7aWYoIShzIGluc3RhbmNlb2YgYy5EaWN0KSljb250aW51ZTtsZXQgbz1zLmdldCgiRm9udEZhbWlseSIpO289by5yZXBsYWNlQWxsKC9bIF0rKFxkKS9nLCIkMSIpO2NvbnN0IGw9e2ZvbnRGYW1pbHk6byxmb250V2VpZ2h0OnMuZ2V0KCJGb250V2VpZ2h0IiksaXRhbGljQW5nbGU6LXMuZ2V0KCJJdGFsaWNBbmdsZSIpfTsoMCxpLnZhbGlkYXRlQ1NTRm9udCkobCkmJm0ucHVzaCh1LmhhbmRsZVNldEZvbnQoYSxbYy5OYW1lLmdldChlKSwxXSxudWxsLGQsdCxnLG51bGwsbCkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybigwLG4ud2FybikoJ2xvYWRYZmFGb250czogIicuY29uY2F0KGUsJyIuJykpLG51bGx9KSkpfWF3YWl0IFByb21pc2UuYWxsKG0pO2NvbnN0IHY9dGhpcy54ZmFGYWN0b3J5LnNldEZvbnRzKGYpO2lmKCF2KXJldHVybjtoLmlnbm9yZUVycm9ycz0hMCxtLmxlbmd0aD0wLGYubGVuZ3RoPTA7Y29uc3QgeD1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIHYpKDAsbC5nZXRYZmFGb250TmFtZSkoIiIuY29uY2F0KGUsIi1SZWd1bGFyIikpfHx4LmFkZChlKTt4LnNpemUmJnYucHVzaCgiUGRmSlMtRmFsbGJhY2siKTtmb3IoY29uc3QgZSBvZiB2KWlmKCF4LmhhcyhlKSlmb3IoY29uc3QgciBvZlt7bmFtZToiUmVndWxhciIsZm9udFdlaWdodDo0MDAsaXRhbGljQW5nbGU6MH0se25hbWU6IkJvbGQiLGZvbnRXZWlnaHQ6NzAwLGl0YWxpY0FuZ2xlOjB9LHtuYW1lOiJJdGFsaWMiLGZvbnRXZWlnaHQ6NDAwLGl0YWxpY0FuZ2xlOjEyfSx7bmFtZToiQm9sZEl0YWxpYyIsZm9udFdlaWdodDo3MDAsaXRhbGljQW5nbGU6MTJ9XSl7Y29uc3QgaT0iIi5jb25jYXQoZSwiLSIpLmNvbmNhdChyLm5hbWUpLHM9KDAsbC5nZXRYZmFGb250RGljdCkoaSk7bS5wdXNoKHUuaGFuZGxlU2V0Rm9udChhLFtjLk5hbWUuZ2V0KGkpLDFdLG51bGwsZCx0LGcscyx7Zm9udEZhbWlseTplLGZvbnRXZWlnaHQ6ci5mb250V2VpZ2h0LGl0YWxpY0FuZ2xlOnIuaXRhbGljQW5nbGV9KS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuKDAsbi53YXJuKSgnbG9hZFhmYUZvbnRzOiAiJy5jb25jYXQoZSwnIi4nKSksbnVsbH0pKSl9YXdhaXQgUHJvbWlzZS5hbGwobSksdGhpcy54ZmFGYWN0b3J5LmFwcGVuZEZvbnRzKGYseCl9YXN5bmMgc2VyaWFsaXplWGZhRGF0YShlKXtyZXR1cm4gdGhpcy54ZmFGYWN0b3J5P3RoaXMueGZhRmFjdG9yeS5zZXJpYWxpemVEYXRhKGUpOm51bGx9Z2V0IHZlcnNpb24oKXtyZXR1cm4gdGhpcy5jYXRhbG9nLnZlcnNpb258fHRoaXMuX3ZlcnNpb259Z2V0IGZvcm1JbmZvKCl7Y29uc3QgZT17aGFzRmllbGRzOiExLGhhc0Fjcm9Gb3JtOiExLGhhc1hmYTohMSxoYXNTaWduYXR1cmVzOiExfSx0PXRoaXMuY2F0YWxvZy5hY3JvRm9ybTtpZighdClyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiZm9ybUluZm8iLGUpO3RyeXtjb25zdCByPXQuZ2V0KCJGaWVsZHMiKSxuPUFycmF5LmlzQXJyYXkocikmJnIubGVuZ3RoPjA7ZS5oYXNGaWVsZHM9bjtjb25zdCBhPXQuZ2V0KCJYRkEiKTtlLmhhc1hmYT1BcnJheS5pc0FycmF5KGEpJiZhLmxlbmd0aD4wfHxhIGluc3RhbmNlb2YgaC5CYXNlU3RyZWFtJiYhYS5pc0VtcHR5O2NvbnN0IGk9ISEoMSZ0LmdldCgiU2lnRmxhZ3MiKSkscz1pJiZ0aGlzLl9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKHIpO2UuaGFzQWNyb0Zvcm09biYmIXMsZS5oYXNTaWduYXR1cmVzPWl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGkuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLndhcm4pKCdDYW5ub3QgZmV0Y2ggZm9ybSBpbmZvcm1hdGlvbjogIicuY29uY2F0KGUsJyIuJykpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJmb3JtSW5mbyIsZSl9Z2V0IGRvY3VtZW50SW5mbygpe2NvbnN0IGU9e1BERkZvcm1hdFZlcnNpb246dGhpcy52ZXJzaW9uLExhbmd1YWdlOnRoaXMuY2F0YWxvZy5sYW5nLEVuY3J5cHRGaWx0ZXJOYW1lOnRoaXMueHJlZi5lbmNyeXB0P3RoaXMueHJlZi5lbmNyeXB0LmZpbHRlck5hbWU6bnVsbCxJc0xpbmVhcml6ZWQ6ISF0aGlzLmxpbmVhcml6YXRpb24sSXNBY3JvRm9ybVByZXNlbnQ6dGhpcy5mb3JtSW5mby5oYXNBY3JvRm9ybSxJc1hGQVByZXNlbnQ6dGhpcy5mb3JtSW5mby5oYXNYZmEsSXNDb2xsZWN0aW9uUHJlc2VudDohIXRoaXMuY2F0YWxvZy5jb2xsZWN0aW9uLElzU2lnbmF0dXJlc1ByZXNlbnQ6dGhpcy5mb3JtSW5mby5oYXNTaWduYXR1cmVzfTtsZXQgdDt0cnl7dD10aGlzLnhyZWYudHJhaWxlci5nZXQoIkluZm8iKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgaS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLG4uaW5mbykoIlRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuIil9aWYoISh0IGluc3RhbmNlb2YgYy5EaWN0KSlyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiZG9jdW1lbnRJbmZvIixlKTtmb3IoY29uc3QgciBvZiB0LmdldEtleXMoKSl7Y29uc3QgYT10LmdldChyKTtzd2l0Y2gocil7Y2FzZSJUaXRsZSI6Y2FzZSJBdXRob3IiOmNhc2UiU3ViamVjdCI6Y2FzZSJLZXl3b3JkcyI6Y2FzZSJDcmVhdG9yIjpjYXNlIlByb2R1Y2VyIjpjYXNlIkNyZWF0aW9uRGF0ZSI6Y2FzZSJNb2REYXRlIjppZigic3RyaW5nIj09dHlwZW9mIGEpe2Vbcl09KDAsbi5zdHJpbmdUb1BERlN0cmluZykoYSk7Y29udGludWV9YnJlYWs7Y2FzZSJUcmFwcGVkIjppZihhIGluc3RhbmNlb2YgYy5OYW1lKXtlW3JdPWE7Y29udGludWV9YnJlYWs7ZGVmYXVsdDpsZXQgdDtzd2l0Y2godHlwZW9mIGEpe2Nhc2Uic3RyaW5nIjp0PSgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGEpO2JyZWFrO2Nhc2UibnVtYmVyIjpjYXNlImJvb2xlYW4iOnQ9YTticmVhaztkZWZhdWx0OmEgaW5zdGFuY2VvZiBjLk5hbWUmJih0PWEpfWlmKHZvaWQgMD09PXQpeygwLG4ud2FybikoJ0JhZCB2YWx1ZSwgZm9yIGN1c3RvbSBrZXkgIicuY29uY2F0KHIsJyIsIGluIEluZm86ICcpLmNvbmNhdChhLCIuIikpO2NvbnRpbnVlfWUuQ3VzdG9tfHwoZS5DdXN0b209T2JqZWN0LmNyZWF0ZShudWxsKSksZS5DdXN0b21bcl09dDtjb250aW51ZX0oMCxuLndhcm4pKCdCYWQgdmFsdWUsIGZvciBrZXkgIicuY29uY2F0KHIsJyIsIGluIEluZm86ICcpLmNvbmNhdChhLCIuIikpfXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJkb2N1bWVudEluZm8iLGUpfWdldCBmaW5nZXJwcmludHMoKXtmdW5jdGlvbiBlKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmZS5sZW5ndGg+MCYmIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiE9PWV9ZnVuY3Rpb24gdChlKXtjb25zdCB0PVtdO2Zvcihjb25zdCByIG9mIGUpe2NvbnN0IGU9ci50b1N0cmluZygxNik7dC5wdXNoKGUucGFkU3RhcnQoMiwiMCIpKX1yZXR1cm4gdC5qb2luKCIiKX1jb25zdCByPXRoaXMueHJlZi50cmFpbGVyLmdldCgiSUQiKTtsZXQgYSxpO3JldHVybiBBcnJheS5pc0FycmF5KHIpJiZlKHJbMF0pPyhhPSgwLG4uc3RyaW5nVG9CeXRlcykoclswXSksclsxXSE9PXJbMF0mJmUoclsxXSkmJihpPSgwLG4uc3RyaW5nVG9CeXRlcykoclsxXSkpKTphPSgwLHUuY2FsY3VsYXRlTUQ1KSh0aGlzLnN0cmVhbS5nZXRCeXRlUmFuZ2UoMCwxMDI0KSwwLDEwMjQpLCgwLG4uc2hhZG93KSh0aGlzLCJmaW5nZXJwcmludHMiLFt0KGEpLGk/dChpKTpudWxsXSl9YXN5bmMgX2dldExpbmVhcml6YXRpb25QYWdlKGUpe2NvbnN0e2NhdGFsb2c6dCxsaW5lYXJpemF0aW9uOnIseHJlZjphfT10aGlzLGk9Yy5SZWYuZ2V0KHIub2JqZWN0TnVtYmVyRmlyc3QsMCk7dHJ5e2NvbnN0IGU9YXdhaXQgYS5mZXRjaEFzeW5jKGkpO2lmKGUgaW5zdGFuY2VvZiBjLkRpY3Qpe2xldCByPWUuZ2V0UmF3KCJUeXBlIik7aWYociBpbnN0YW5jZW9mIGMuUmVmJiYocj1hd2FpdCBhLmZldGNoQXN5bmMocikpLCgwLGMuaXNOYW1lKShyLCJQYWdlIil8fCFlLmhhcygiVHlwZSIpJiYhZS5oYXMoIktpZHMiKSlyZXR1cm4gdC5wYWdlS2lkc0NvdW50Q2FjaGUuaGFzKGkpfHx0LnBhZ2VLaWRzQ291bnRDYWNoZS5wdXQoaSwxKSx0LnBhZ2VJbmRleENhY2hlLmhhcyhpKXx8dC5wYWdlSW5kZXhDYWNoZS5wdXQoaSwwKSxbZSxpXX10aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVGhlIExpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2Vzbid0IHBvaW50IHRvIGEgdmFsaWQgUGFnZSBkaWN0aW9uYXJ5LiIpfWNhdGNoKHIpe3JldHVybigwLG4ud2FybikoJ19nZXRMaW5lYXJpemF0aW9uUGFnZTogIicuY29uY2F0KHIubWVzc2FnZSwnIi4nKSksdC5nZXRQYWdlRGljdChlKX19Z2V0UGFnZShlKXtjb25zdCB0PXRoaXMuX3BhZ2VQcm9taXNlcy5nZXQoZSk7aWYodClyZXR1cm4gdDtjb25zdHtjYXRhbG9nOnIsbGluZWFyaXphdGlvbjpuLHhmYUZhY3Rvcnk6YX09dGhpcztsZXQgaTtyZXR1cm4gaT1hP1Byb21pc2UucmVzb2x2ZShbYy5EaWN0LmVtcHR5LG51bGxdKToobnVsbD09bj92b2lkIDA6bi5wYWdlRmlyc3QpPT09ZT90aGlzLl9nZXRMaW5lYXJpemF0aW9uUGFnZShlKTpyLmdldFBhZ2VEaWN0KGUpLGk9aS50aGVuKCh0PT57bGV0W24saV09dDtyZXR1cm4gbmV3IEYoe3BkZk1hbmFnZXI6dGhpcy5wZGZNYW5hZ2VyLHhyZWY6dGhpcy54cmVmLHBhZ2VJbmRleDplLHBhZ2VEaWN0Om4scmVmOmksZ2xvYmFsSWRGYWN0b3J5OnRoaXMuX2dsb2JhbElkRmFjdG9yeSxmb250Q2FjaGU6ci5mb250Q2FjaGUsYnVpbHRJbkNNYXBDYWNoZTpyLmJ1aWx0SW5DTWFwQ2FjaGUsc3RhbmRhcmRGb250RGF0YUNhY2hlOnIuc3RhbmRhcmRGb250RGF0YUNhY2hlLGdsb2JhbEltYWdlQ2FjaGU6ci5nbG9iYWxJbWFnZUNhY2hlLHN5c3RlbUZvbnRDYWNoZTpyLnN5c3RlbUZvbnRDYWNoZSxub25CbGVuZE1vZGVzU2V0OnIubm9uQmxlbmRNb2Rlc1NldCx4ZmFGYWN0b3J5OmF9KX0pKSx0aGlzLl9wYWdlUHJvbWlzZXMuc2V0KGUsaSksaX1hc3luYyBjaGVja0ZpcnN0UGFnZSgpe2lmKCEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXSkpdHJ5e2F3YWl0IHRoaXMuZ2V0UGFnZSgwKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgaS5YUmVmRW50cnlFeGNlcHRpb24pdGhyb3cgdGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZSgwKSxhd2FpdCB0aGlzLmNsZWFudXAoKSxuZXcgaS5YUmVmUGFyc2VFeGNlcHRpb259fWFzeW5jIGNoZWNrTGFzdFBhZ2UoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0e2NhdGFsb2c6dCxwZGZNYW5hZ2VyOnJ9PXRoaXM7bGV0IGE7dC5zZXRBY3R1YWxOdW1QYWdlcygpO3RyeXtpZihhd2FpdCBQcm9taXNlLmFsbChbci5lbnN1cmVEb2MoInhmYUZhY3RvcnkiKSxyLmVuc3VyZURvYygibGluZWFyaXphdGlvbiIpLHIuZW5zdXJlQ2F0YWxvZygibnVtUGFnZXMiKV0pLHRoaXMueGZhRmFjdG9yeSlyZXR1cm47aWYoYT10aGlzLmxpbmVhcml6YXRpb24/dGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOnQubnVtUGFnZXMsIU51bWJlci5pc0ludGVnZXIoYSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlBhZ2UgY291bnQgaXMgbm90IGFuIGludGVnZXIuIik7aWYoYTw9MSlyZXR1cm47YXdhaXQgdGhpcy5nZXRQYWdlKGEtMSl9Y2F0Y2gocyl7aWYodGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZShhLTEpLGF3YWl0IHRoaXMuY2xlYW51cCgpLHMgaW5zdGFuY2VvZiBpLlhSZWZFbnRyeUV4Y2VwdGlvbiYmIWUpdGhyb3cgbmV3IGkuWFJlZlBhcnNlRXhjZXB0aW9uO2xldCBvOygwLG4ud2FybikoImNoZWNrTGFzdFBhZ2UgLSBpbnZhbGlkIC9QYWdlcyB0cmVlIC9Db3VudDogIi5jb25jYXQoYSwiLiIpKTt0cnl7bz1hd2FpdCB0LmdldEFsbFBhZ2VEaWN0cyhlKX1jYXRjaChyKXtpZihyIGluc3RhbmNlb2YgaS5YUmVmRW50cnlFeGNlcHRpb24mJiFlKXRocm93IG5ldyBpLlhSZWZQYXJzZUV4Y2VwdGlvbjtyZXR1cm4gdm9pZCB0LnNldEFjdHVhbE51bVBhZ2VzKDEpfWZvcihjb25zdFtlLFtuLGFdXW9mIG8pe2xldCBpO24gaW5zdGFuY2VvZiBFcnJvcj8oaT1Qcm9taXNlLnJlamVjdChuKSxpLmNhdGNoKCgoKT0+e30pKSk6aT1Qcm9taXNlLnJlc29sdmUobmV3IEYoe3BkZk1hbmFnZXI6cix4cmVmOnRoaXMueHJlZixwYWdlSW5kZXg6ZSxwYWdlRGljdDpuLHJlZjphLGdsb2JhbElkRmFjdG9yeTp0aGlzLl9nbG9iYWxJZEZhY3RvcnksZm9udENhY2hlOnQuZm9udENhY2hlLGJ1aWx0SW5DTWFwQ2FjaGU6dC5idWlsdEluQ01hcENhY2hlLHN0YW5kYXJkRm9udERhdGFDYWNoZTp0LnN0YW5kYXJkRm9udERhdGFDYWNoZSxnbG9iYWxJbWFnZUNhY2hlOnQuZ2xvYmFsSW1hZ2VDYWNoZSxzeXN0ZW1Gb250Q2FjaGU6dC5zeXN0ZW1Gb250Q2FjaGUsbm9uQmxlbmRNb2Rlc1NldDp0Lm5vbkJsZW5kTW9kZXNTZXQseGZhRmFjdG9yeTpudWxsfSkpLHRoaXMuX3BhZ2VQcm9taXNlcy5zZXQoZSxpKX10LnNldEFjdHVhbE51bVBhZ2VzKG8uc2l6ZSl9fWZvbnRGYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLmNhdGFsb2cuZm9udEZhbGxiYWNrKGUsdCl9YXN5bmMgY2xlYW51cCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY2F0YWxvZz90aGlzLmNhdGFsb2cuY2xlYW51cChlKTooMCxmLmNsZWFyR2xvYmFsQ2FjaGVzKSgpfV9jb2xsZWN0RmllbGRPYmplY3RzKGUsdCxyKXtjb25zdCBpPXRoaXMueHJlZi5mZXRjaElmUmVmKHQpO2lmKGkuaGFzKCJUIikpe2NvbnN0IHQ9KDAsbi5zdHJpbmdUb1BERlN0cmluZykoaS5nZXQoIlQiKSk7ZT0iIj09PWU/dDoiIi5jb25jYXQoZSwiLiIpLmNvbmNhdCh0KX1pZighaS5oYXMoIktpZHMiKSYmL1xbXGQrXF0kLy50ZXN0KGUpJiYoZT1lLnN1YnN0cmluZygwLGUubGFzdEluZGV4T2YoIlsiKSkpLHIuaGFzKGUpfHxyLnNldChlLFtdKSxyLmdldChlKS5wdXNoKGEuQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlKHRoaXMueHJlZix0LHRoaXMucGRmTWFuYWdlcix0aGlzLl9sb2NhbElkRmFjdG9yeSwhMCkudGhlbigoZT0+bnVsbD09ZT92b2lkIDA6ZS5nZXRGaWVsZE9iamVjdCgpKSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3JldHVybigwLG4ud2FybikoJ19jb2xsZWN0RmllbGRPYmplY3RzOiAiJy5jb25jYXQoZSwnIi4nKSksbnVsbH0pKSksaS5oYXMoIktpZHMiKSl7Y29uc3QgdD1pLmdldCgiS2lkcyIpO2Zvcihjb25zdCBuIG9mIHQpdGhpcy5fY29sbGVjdEZpZWxkT2JqZWN0cyhlLG4scil9fWdldCBmaWVsZE9iamVjdHMoKXtpZighdGhpcy5mb3JtSW5mby5oYXNGaWVsZHMpcmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImZpZWxkT2JqZWN0cyIsUHJvbWlzZS5yZXNvbHZlKG51bGwpKTtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCksdD1uZXcgTWFwO2Zvcihjb25zdCBlIG9mIHRoaXMuY2F0YWxvZy5hY3JvRm9ybS5nZXQoIkZpZWxkcyIpKXRoaXMuX2NvbGxlY3RGaWVsZE9iamVjdHMoIiIsZSx0KTtjb25zdCByPVtdO2Zvcihjb25zdFtuLGFdb2YgdClyLnB1c2goUHJvbWlzZS5hbGwoYSkudGhlbigodD0+eyh0PXQuZmlsdGVyKChlPT4hIWUpKSkubGVuZ3RoPjAmJihlW25dPXQpfSkpKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiZmllbGRPYmplY3RzIixQcm9taXNlLmFsbChyKS50aGVuKCgoKT0+ZSkpKX1nZXQgaGFzSlNBY3Rpb25zKCl7Y29uc3QgZT10aGlzLnBkZk1hbmFnZXIuZW5zdXJlRG9jKCJfcGFyc2VIYXNKU0FjdGlvbnMiKTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiaGFzSlNBY3Rpb25zIixlKX1hc3luYyBfcGFyc2VIYXNKU0FjdGlvbnMoKXtjb25zdFtlLHRdPWF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIiksdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiZmllbGRPYmplY3RzIildKTtyZXR1cm4hIWV8fCEhdCYmT2JqZWN0LnZhbHVlcyh0KS5zb21lKChlPT5lLnNvbWUoKGU9Pm51bGwhPT1lLmFjdGlvbnMpKSkpfWdldCBjYWxjdWxhdGlvbk9yZGVySWRzKCl7Y29uc3QgZT10aGlzLmNhdGFsb2cuYWNyb0Zvcm07aWYobnVsbD09ZXx8IWUuaGFzKCJDTyIpKXJldHVybigwLG4uc2hhZG93KSh0aGlzLCJjYWxjdWxhdGlvbk9yZGVySWRzIixudWxsKTtjb25zdCB0PWUuZ2V0KCJDTyIpO2lmKCFBcnJheS5pc0FycmF5KHQpfHwwPT09dC5sZW5ndGgpcmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImNhbGN1bGF0aW9uT3JkZXJJZHMiLG51bGwpO2NvbnN0IHI9W107Zm9yKGNvbnN0IGUgb2YgdCllIGluc3RhbmNlb2YgYy5SZWYmJnIucHVzaChlLnRvU3RyaW5nKCkpO3JldHVybiAwPT09ci5sZW5ndGg/KDAsbi5zaGFkb3cpKHRoaXMsImNhbGN1bGF0aW9uT3JkZXJJZHMiLG51bGwpOigwLG4uc2hhZG93KSh0aGlzLCJjYWxjdWxhdGlvbk9yZGVySWRzIixyKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuUG9wdXBBbm5vdGF0aW9uPXQuTWFya3VwQW5ub3RhdGlvbj10LkFubm90YXRpb25GYWN0b3J5PXQuQW5ub3RhdGlvbkJvcmRlclN0eWxlPXQuQW5ub3RhdGlvbj12b2lkIDAsdC5nZXRRdWFkUG9pbnRzPXYscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDE1NykscigxNTkpO3ZhciBuPXIoMTQ0KSxhPXIoMTQ5KSxpPXIoMTYxKSxzPXIoMTUwKSxvPXIoMTU0KSxjPXIoMjE2KSxsPXIoMTUxKSxoPXIoMjEwKSx1PXIoMjIwKSxkPXIoMTYyKSxmPXIoMjIzKSxnPXIoMTc2KSxwPXIoMjI2KSxtPXIoMjE0KSxiPXIoMjI3KTtmdW5jdGlvbiB5KGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQ7Y29uc3Qgcj10fHxuZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG51bGw7Y2FzZSAxOnJldHVybiBkLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYkl0ZW0oZSwwLHIsMCkscjtjYXNlIDM6cmV0dXJuIGQuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2JJdGVtKGUsMCxyLDApLHI7Y2FzZSA0OnJldHVybiBkLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYkl0ZW0oZSwwLHIsMCkscjtkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiB3KGUpe3JldHVybiBBcnJheS5mcm9tKGUsKGU9PmUvMjU1KSl9ZnVuY3Rpb24gdihlLHQpe2NvbnN0IHI9ZS5nZXRBcnJheSgiUXVhZFBvaW50cyIpO2lmKCFBcnJheS5pc0FycmF5KHIpfHwwPT09ci5sZW5ndGh8fHIubGVuZ3RoJTg+MClyZXR1cm4gbnVsbDtjb25zdCBuPVtdO2ZvcihsZXQgZT0wLGE9ci5sZW5ndGgvODtlPGE7ZSsrKXtsZXQgYT0xLzAsaT0tMS8wLHM9MS8wLG89LTEvMDtmb3IobGV0IHQ9OCplLG49OCplKzg7dDxuO3QrPTIpe2NvbnN0IGU9clt0XSxuPXJbdCsxXTthPU1hdGgubWluKGUsYSksaT1NYXRoLm1heChlLGkpLHM9TWF0aC5taW4obixzKSxvPU1hdGgubWF4KG4sbyl9aWYobnVsbCE9PXQmJihhPHRbMF18fGk+dFsyXXx8czx0WzFdfHxvPnRbM10pKXJldHVybiBudWxsO24ucHVzaChbe3g6YSx5Om99LHt4OmkseTpvfSx7eDphLHk6c30se3g6aSx5OnN9XSl9cmV0dXJuIG59ZnVuY3Rpb24geChlLHQscil7Y29uc3RbYSxpLHMsb109bi5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHQscik7aWYoYT09PXN8fGk9PT1vKXJldHVyblsxLDAsMCwxLGVbMF0sZVsxXV07Y29uc3QgYz0oZVsyXS1lWzBdKS8ocy1hKSxsPShlWzNdLWVbMV0pLyhvLWkpO3JldHVybltjLDAsMCxsLGVbMF0tYSpjLGVbMV0taSpsXX10LkFubm90YXRpb25GYWN0b3J5PWNsYXNze3N0YXRpYyBjcmVhdGUoZSx0LHIsbixhKXtyZXR1cm4gUHJvbWlzZS5hbGwoW3IuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKSxyLmVuc3VyZUNhdGFsb2coImJhc2VVcmwiKSxyLmVuc3VyZUNhdGFsb2coImF0dGFjaG1lbnRzIiksci5lbnN1cmVEb2MoInhmYURhdGFzZXRzIiksYT90aGlzLl9nZXRQYWdlSW5kZXgoZSx0LHIpOi0xXSkudGhlbigoaT0+e2xldFtzLG8sYyxsLGhdPWk7cmV0dXJuIHIuZW5zdXJlKHRoaXMsIl9jcmVhdGUiLFtlLHQscixuLHMsYyxsLGEsaF0pfSkpfXN0YXRpYyBfY3JlYXRlKGUsdCxyLGksbyl7bGV0IGM9YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOm51bGwsbD1hcmd1bWVudHMubGVuZ3RoPjY/YXJndW1lbnRzWzZdOnZvaWQgMCxoPWFyZ3VtZW50cy5sZW5ndGg+Nz9hcmd1bWVudHNbN106dm9pZCAwLHU9YXJndW1lbnRzLmxlbmd0aD44JiZ2b2lkIDAhPT1hcmd1bWVudHNbOF0/YXJndW1lbnRzWzhdOi0xO2NvbnN0IGQ9ZS5mZXRjaElmUmVmKHQpO2lmKCEoZCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IGY9dCBpbnN0YW5jZW9mIHMuUmVmP3QudG9TdHJpbmcoKToiYW5ub3RfIi5jb25jYXQoaS5jcmVhdGVPYmpJZCgpKTtsZXQgZz1kLmdldCgiU3VidHlwZSIpO2c9ZyBpbnN0YW5jZW9mIHMuTmFtZT9nLm5hbWU6bnVsbDtjb25zdCBwPW8gaW5zdGFuY2VvZiBzLkRpY3Q/bzpzLkRpY3QuZW1wdHksbT17eHJlZjplLHJlZjp0LGRpY3Q6ZCxzdWJ0eXBlOmcsaWQ6ZixwZGZNYW5hZ2VyOnIsYWNyb0Zvcm06cCxhdHRhY2htZW50czpjLHhmYURhdGFzZXRzOmwsY29sbGVjdEZpZWxkczpoLG5lZWRBcHBlYXJhbmNlczohaCYmITA9PT1wLmdldCgiTmVlZEFwcGVhcmFuY2VzIikscGFnZUluZGV4OnUsZXZhbHVhdG9yT3B0aW9uczpyLmV2YWx1YXRvck9wdGlvbnN9O3N3aXRjaChnKXtjYXNlIkxpbmsiOnJldHVybiBuZXcgRShtKTtjYXNlIlRleHQiOnJldHVybiBuZXcgTShtKTtjYXNlIldpZGdldCI6bGV0IGU9KDAsYS5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDpkLGtleToiRlQifSk7c3dpdGNoKGU9ZSBpbnN0YW5jZW9mIHMuTmFtZT9lLm5hbWU6bnVsbCxlKXtjYXNlIlR4IjpyZXR1cm4gbmV3IE8obSk7Y2FzZSJCdG4iOnJldHVybiBuZXcgRihtKTtjYXNlIkNoIjpyZXR1cm4gbmV3IEkobSk7Y2FzZSJTaWciOnJldHVybiBuZXcgVChtKX1yZXR1cm4oMCxuLndhcm4pKCdVbmltcGxlbWVudGVkIHdpZGdldCBmaWVsZCB0eXBlICInLmNvbmNhdChlLCciLCBmYWxsaW5nIGJhY2sgdG8gYmFzZSBmaWVsZCB0eXBlLicpKSxuZXcgQyhtKTtjYXNlIlBvcHVwIjpyZXR1cm4gbmV3IFAobSk7Y2FzZSJGcmVlVGV4dCI6cmV0dXJuIG5ldyBSKG0pO2Nhc2UiTGluZSI6cmV0dXJuIG5ldyBOKG0pO2Nhc2UiU3F1YXJlIjpyZXR1cm4gbmV3IEQobSk7Y2FzZSJDaXJjbGUiOnJldHVybiBuZXcgQihtKTtjYXNlIlBvbHlMaW5lIjpyZXR1cm4gbmV3IEwobSk7Y2FzZSJQb2x5Z29uIjpyZXR1cm4gbmV3IF8obSk7Y2FzZSJDYXJldCI6cmV0dXJuIG5ldyBqKG0pO2Nhc2UiSW5rIjpyZXR1cm4gbmV3IFUobSk7Y2FzZSJIaWdobGlnaHQiOnJldHVybiBuZXcgJChtKTtjYXNlIlVuZGVybGluZSI6cmV0dXJuIG5ldyBYKG0pO2Nhc2UiU3F1aWdnbHkiOnJldHVybiBuZXcgSChtKTtjYXNlIlN0cmlrZU91dCI6cmV0dXJuIG5ldyBxKG0pO2Nhc2UiU3RhbXAiOnJldHVybiBuZXcgeihtKTtjYXNlIkZpbGVBdHRhY2htZW50IjpyZXR1cm4gbmV3IEcobSk7ZGVmYXVsdDpyZXR1cm4gaHx8KGc/KDAsbi53YXJuKSgnVW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9uIHR5cGUgIicuY29uY2F0KGcsJyIsIGZhbGxpbmcgYmFjayB0byBiYXNlIGFubm90YXRpb24uJykpOigwLG4ud2FybikoIkFubm90YXRpb24gaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgL1N1YnR5cGUuIikpLG5ldyBTKG0pfX1zdGF0aWMgYXN5bmMgX2dldFBhZ2VJbmRleChlLHQscil7dHJ5e2NvbnN0IG49YXdhaXQgZS5mZXRjaElmUmVmQXN5bmModCk7aWYoIShuIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm4tMTtjb25zdCBhPW4uZ2V0UmF3KCJQIik7cmV0dXJuIGEgaW5zdGFuY2VvZiBzLlJlZj9hd2FpdCByLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsW2FdKTotMX1jYXRjaChlKXtyZXR1cm4oMCxuLndhcm4pKCdfZ2V0UGFnZUluZGV4OiAiJy5jb25jYXQoZSwnIi4nKSksLTF9fXN0YXRpYyBnZW5lcmF0ZUltYWdlcyhlLHQscil7aWYoIXIpcmV0dXJuKDAsbi53YXJuKSgiZ2VuZXJhdGVJbWFnZXM6IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkLCBjYW5ub3Qgc2F2ZSBvciBwcmludCBzb21lIGFubm90YXRpb25zIHdpdGggaW1hZ2VzLiIpLG51bGw7bGV0IGE7Zm9yKGNvbnN0e2JpdG1hcElkOnIsYml0bWFwOm59b2YgZSluJiYoYXx8KGE9bmV3IE1hcCksYS5zZXQocix6LmNyZWF0ZUltYWdlKG4sdCkpKTtyZXR1cm4gYX1zdGF0aWMgYXN5bmMgc2F2ZU5ld0Fubm90YXRpb25zKGUsdCxyLGEpe2NvbnN0IGk9ZS54cmVmO2xldCBvO2NvbnN0IGw9W10saD1bXSx7aXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6dX09ZS5vcHRpb25zO2Zvcihjb25zdCBkIG9mIHIpaWYoIWQuZGVsZXRlZClzd2l0Y2goZC5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBuLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOmlmKCFvKXtjb25zdCBlPW5ldyBzLkRpY3QoaSk7ZS5zZXQoIkJhc2VGb250IixzLk5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSksZS5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkZvbnQiKSksZS5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIlR5cGUxIikpLGUuc2V0KCJFbmNvZGluZyIscy5OYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpO2NvbnN0IHQ9W107bz1pLmdldE5ld1RlbXBvcmFyeVJlZigpLGF3YWl0KDAsYy53cml0ZU9iamVjdCkobyxlLHQsbnVsbCksbC5wdXNoKHtyZWY6byxkYXRhOnQuam9pbigiIil9KX1oLnB1c2goUi5jcmVhdGVOZXdBbm5vdGF0aW9uKGksZCxsLHtldmFsdWF0b3I6ZSx0YXNrOnQsYmFzZUZvbnRSZWY6b30pKTticmVhaztjYXNlIG4uQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LOmgucHVzaChVLmNyZWF0ZU5ld0Fubm90YXRpb24oaSxkLGwpKTticmVhaztjYXNlIG4uQW5ub3RhdGlvbkVkaXRvclR5cGUuU1RBTVA6aWYoIXUpYnJlYWs7Y29uc3Qgcj1hd2FpdCBhLmdldChkLmJpdG1hcElkKTtpZihyLmltYWdlU3RyZWFtKXtjb25zdHtpbWFnZVN0cmVhbTplLHNtYXNrU3RyZWFtOnR9PXIsbj1bXTtpZih0KXtjb25zdCByPWkuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7YXdhaXQoMCxjLndyaXRlT2JqZWN0KShyLHQsbixudWxsKSxsLnB1c2goe3JlZjpyLGRhdGE6bi5qb2luKCIiKX0pLGUuZGljdC5zZXQoIlNNYXNrIixyKSxuLmxlbmd0aD0wfWNvbnN0IGE9ci5pbWFnZVJlZj1pLmdldE5ld1RlbXBvcmFyeVJlZigpO2F3YWl0KDAsYy53cml0ZU9iamVjdCkoYSxlLG4sbnVsbCksbC5wdXNoKHtyZWY6YSxkYXRhOm4uam9pbigiIil9KSxyLmltYWdlU3RyZWFtPXIuc21hc2tTdHJlYW09bnVsbH1oLnB1c2goei5jcmVhdGVOZXdBbm5vdGF0aW9uKGksZCxsLHtpbWFnZTpyfSkpfXJldHVybnthbm5vdGF0aW9uczphd2FpdCBQcm9taXNlLmFsbChoKSxkZXBlbmRlbmNpZXM6bH19c3RhdGljIGFzeW5jIHByaW50TmV3QW5ub3RhdGlvbnMoZSx0LHIsYSl7aWYoIXIpcmV0dXJuIG51bGw7Y29uc3R7b3B0aW9uczppLHhyZWY6c309ZSxvPVtdO2Zvcihjb25zdCBjIG9mIHIpaWYoIWMuZGVsZXRlZClzd2l0Y2goYy5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBuLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOm8ucHVzaChSLmNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihzLGMse2V2YWx1YXRvcjplLHRhc2s6dCxldmFsdWF0b3JPcHRpb25zOml9KSk7YnJlYWs7Y2FzZSBuLkFubm90YXRpb25FZGl0b3JUeXBlLklOSzpvLnB1c2goVS5jcmVhdGVOZXdQcmludEFubm90YXRpb24ocyxjLHtldmFsdWF0b3JPcHRpb25zOml9KSk7YnJlYWs7Y2FzZSBuLkFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOmlmKCFpLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKWJyZWFrO2NvbnN0IHI9YXdhaXQgYS5nZXQoYy5iaXRtYXBJZCk7aWYoci5pbWFnZVN0cmVhbSl7Y29uc3R7aW1hZ2VTdHJlYW06ZSxzbWFza1N0cmVhbTp0fT1yO3QmJmUuZGljdC5zZXQoIlNNYXNrIix0KSxyLmltYWdlUmVmPW5ldyBnLkpwZWdTdHJlYW0oZSxlLmxlbmd0aCksci5pbWFnZVN0cmVhbT1yLnNtYXNrU3RyZWFtPW51bGx9by5wdXNoKHouY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKHMsYyx7aW1hZ2U6cixldmFsdWF0b3JPcHRpb25zOml9KSl9cmV0dXJuIFByb21pc2UuYWxsKG8pfX07Y2xhc3MgU3tjb25zdHJ1Y3RvcihlKXtjb25zdHtkaWN0OnQseHJlZjpyfT1lO3RoaXMuc2V0VGl0bGUodC5nZXQoIlQiKSksdGhpcy5zZXRDb250ZW50cyh0LmdldCgiQ29udGVudHMiKSksdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKHQuZ2V0KCJNIikpLHRoaXMuc2V0RmxhZ3ModC5nZXQoIkYiKSksdGhpcy5zZXRSZWN0YW5nbGUodC5nZXRBcnJheSgiUmVjdCIpKSx0aGlzLnNldENvbG9yKHQuZ2V0QXJyYXkoIkMiKSksdGhpcy5zZXRCb3JkZXJTdHlsZSh0KSx0aGlzLnNldEFwcGVhcmFuY2UodCksdGhpcy5zZXRPcHRpb25hbENvbnRlbnQodCk7Y29uc3QgaT10LmdldCgiTUsiKTt0aGlzLnNldEJvcmRlckFuZEJhY2tncm91bmRDb2xvcnMoaSksdGhpcy5zZXRSb3RhdGlvbihpLHQpLHRoaXMucmVmPWUucmVmIGluc3RhbmNlb2Ygcy5SZWY/ZS5yZWY6bnVsbCx0aGlzLl9zdHJlYW1zPVtdLHRoaXMuYXBwZWFyYW5jZSYmdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuYXBwZWFyYW5jZSk7Y29uc3Qgbz0hISh0aGlzLmZsYWdzJm4uQW5ub3RhdGlvbkZsYWcuTE9DS0VEKSxjPSEhKHRoaXMuZmxhZ3Mmbi5Bbm5vdGF0aW9uRmxhZy5MT0NLRURDT05URU5UUyk7aWYodGhpcy5kYXRhPXthbm5vdGF0aW9uRmxhZ3M6dGhpcy5mbGFncyxib3JkZXJTdHlsZTp0aGlzLmJvcmRlclN0eWxlLGNvbG9yOnRoaXMuY29sb3IsYmFja2dyb3VuZENvbG9yOnRoaXMuYmFja2dyb3VuZENvbG9yLGJvcmRlckNvbG9yOnRoaXMuYm9yZGVyQ29sb3Iscm90YXRpb246dGhpcy5yb3RhdGlvbixjb250ZW50c09iajp0aGlzLl9jb250ZW50cyxoYXNBcHBlYXJhbmNlOiEhdGhpcy5hcHBlYXJhbmNlLGlkOmUuaWQsbW9kaWZpY2F0aW9uRGF0ZTp0aGlzLm1vZGlmaWNhdGlvbkRhdGUscmVjdDp0aGlzLnJlY3RhbmdsZSxzdWJ0eXBlOmUuc3VidHlwZSxoYXNPd25DYW52YXM6ITEsbm9Sb3RhdGU6ISEodGhpcy5mbGFncyZuLkFubm90YXRpb25GbGFnLk5PUk9UQVRFKSxub0hUTUw6byYmY30sZS5jb2xsZWN0RmllbGRzKXtjb25zdCBpPXQuZ2V0KCJLaWRzIik7aWYoQXJyYXkuaXNBcnJheShpKSl7Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiBpKXQgaW5zdGFuY2VvZiBzLlJlZiYmZS5wdXNoKHQudG9TdHJpbmcoKSk7MCE9PWUubGVuZ3RoJiYodGhpcy5kYXRhLmtpZElkcz1lKX10aGlzLmRhdGEuYWN0aW9ucz0oMCxhLmNvbGxlY3RBY3Rpb25zKShyLHQsbi5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlKSx0aGlzLmRhdGEuZmllbGROYW1lPXRoaXMuX2NvbnN0cnVjdEZpZWxkTmFtZSh0KSx0aGlzLmRhdGEucGFnZUluZGV4PWUucGFnZUluZGV4fXRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPWUuZXZhbHVhdG9yT3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCx0aGlzLl9mYWxsYmFja0ZvbnREaWN0PW51bGwsdGhpcy5fbmVlZEFwcGVhcmFuY2VzPSExfV9oYXNGbGFnKGUsdCl7cmV0dXJuISEoZSZ0KX1faXNWaWV3YWJsZShlKXtyZXR1cm4hdGhpcy5faGFzRmxhZyhlLG4uQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKSYmIXRoaXMuX2hhc0ZsYWcoZSxuLkFubm90YXRpb25GbGFnLk5PVklFVyl9X2lzUHJpbnRhYmxlKGUpe3JldHVybiB0aGlzLl9oYXNGbGFnKGUsbi5Bbm5vdGF0aW9uRmxhZy5QUklOVCkmJiF0aGlzLl9oYXNGbGFnKGUsbi5Bbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpfW11c3RCZVZpZXdlZChlKXt2YXIgdDtjb25zdCByPW51bGw9PWV8fG51bGw9PT0odD1lLmdldCh0aGlzLmRhdGEuaWQpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5oaWRkZW47cmV0dXJuIHZvaWQgMCE9PXI/IXI6dGhpcy52aWV3YWJsZSYmIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncyxuLkFubm90YXRpb25GbGFnLkhJRERFTil9bXVzdEJlUHJpbnRlZChlKXt2YXIgdDtjb25zdCByPW51bGw9PWV8fG51bGw9PT0odD1lLmdldCh0aGlzLmRhdGEuaWQpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5wcmludDtyZXR1cm4gdm9pZCAwIT09cj9yOnRoaXMucHJpbnRhYmxlfWdldCB2aWV3YWJsZSgpe3JldHVybiBudWxsIT09dGhpcy5kYXRhLnF1YWRQb2ludHMmJigwPT09dGhpcy5mbGFnc3x8dGhpcy5faXNWaWV3YWJsZSh0aGlzLmZsYWdzKSl9Z2V0IHByaW50YWJsZSgpe3JldHVybiBudWxsIT09dGhpcy5kYXRhLnF1YWRQb2ludHMmJjAhPT10aGlzLmZsYWdzJiZ0aGlzLl9pc1ByaW50YWJsZSh0aGlzLmZsYWdzKX1fcGFyc2VTdHJpbmdIZWxwZXIoZSl7Y29uc3QgdD0ic3RyaW5nIj09dHlwZW9mIGU/KDAsbi5zdHJpbmdUb1BERlN0cmluZykoZSk6IiI7cmV0dXJue3N0cjp0LGRpcjp0JiYicnRsIj09PSgwLGguYmlkaSkodCkuZGlyPyJydGwiOiJsdHIifX1zZXREZWZhdWx0QXBwZWFyYW5jZShlKXtjb25zdCB0PSgwLGEuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6ZS5kaWN0LGtleToiREEifSl8fGUuYWNyb0Zvcm0uZ2V0KCJEQSIpO3RoaXMuX2RlZmF1bHRBcHBlYXJhbmNlPSJzdHJpbmciPT10eXBlb2YgdD90OiIiLHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE9KDAsaS5wYXJzZURlZmF1bHRBcHBlYXJhbmNlKSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSl9c2V0VGl0bGUoZSl7dGhpcy5fdGl0bGU9dGhpcy5fcGFyc2VTdHJpbmdIZWxwZXIoZSl9c2V0Q29udGVudHMoZSl7dGhpcy5fY29udGVudHM9dGhpcy5fcGFyc2VTdHJpbmdIZWxwZXIoZSl9c2V0TW9kaWZpY2F0aW9uRGF0ZShlKXt0aGlzLm1vZGlmaWNhdGlvbkRhdGU9InN0cmluZyI9PXR5cGVvZiBlP2U6bnVsbH1zZXRGbGFncyhlKXt0aGlzLmZsYWdzPU51bWJlci5pc0ludGVnZXIoZSkmJmU+MD9lOjB9aGFzRmxhZyhlKXtyZXR1cm4gdGhpcy5faGFzRmxhZyh0aGlzLmZsYWdzLGUpfXNldFJlY3RhbmdsZShlKXt0aGlzLnJlY3RhbmdsZT1BcnJheS5pc0FycmF5KGUpJiY0PT09ZS5sZW5ndGg/bi5VdGlsLm5vcm1hbGl6ZVJlY3QoZSk6WzAsMCwwLDBdfXNldENvbG9yKGUpe3RoaXMuY29sb3I9eShlKX1zZXRMaW5lRW5kaW5ncyhlKXtpZih0aGlzLmxpbmVFbmRpbmdzPVsiTm9uZSIsIk5vbmUiXSxBcnJheS5pc0FycmF5KGUpJiYyPT09ZS5sZW5ndGgpZm9yKGxldCB0PTA7dDwyO3QrKyl7Y29uc3Qgcj1lW3RdO2lmKHIgaW5zdGFuY2VvZiBzLk5hbWUpc3dpdGNoKHIubmFtZSl7Y2FzZSJOb25lIjpjb250aW51ZTtjYXNlIlNxdWFyZSI6Y2FzZSJDaXJjbGUiOmNhc2UiRGlhbW9uZCI6Y2FzZSJPcGVuQXJyb3ciOmNhc2UiQ2xvc2VkQXJyb3ciOmNhc2UiQnV0dCI6Y2FzZSJST3BlbkFycm93IjpjYXNlIlJDbG9zZWRBcnJvdyI6Y2FzZSJTbGFzaCI6dGhpcy5saW5lRW5kaW5nc1t0XT1yLm5hbWU7Y29udGludWV9KDAsbi53YXJuKSgiSWdub3JpbmcgaW52YWxpZCBsaW5lRW5kaW5nOiAiLmNvbmNhdChyKSl9fXNldFJvdGF0aW9uKGUsdCl7dGhpcy5yb3RhdGlvbj0wO2xldCByPWUgaW5zdGFuY2VvZiBzLkRpY3Q/ZS5nZXQoIlIiKXx8MDp0LmdldCgiUm90YXRlIil8fDA7TnVtYmVyLmlzSW50ZWdlcihyKSYmMCE9PXImJihyJT0zNjAscjwwJiYocis9MzYwKSxyJTkwPT0wJiYodGhpcy5yb3RhdGlvbj1yKSl9c2V0Qm9yZGVyQW5kQmFja2dyb3VuZENvbG9ycyhlKXtlIGluc3RhbmNlb2Ygcy5EaWN0Pyh0aGlzLmJvcmRlckNvbG9yPXkoZS5nZXRBcnJheSgiQkMiKSxudWxsKSx0aGlzLmJhY2tncm91bmRDb2xvcj15KGUuZ2V0QXJyYXkoIkJHIiksbnVsbCkpOnRoaXMuYm9yZGVyQ29sb3I9dGhpcy5iYWNrZ3JvdW5kQ29sb3I9bnVsbH1zZXRCb3JkZXJTdHlsZShlKXtpZih0aGlzLmJvcmRlclN0eWxlPW5ldyBBLGUgaW5zdGFuY2VvZiBzLkRpY3QpaWYoZS5oYXMoIkJTIikpe2NvbnN0IHQ9ZS5nZXQoIkJTIikscj10LmdldCgiVHlwZSIpO3ImJiEoMCxzLmlzTmFtZSkociwiQm9yZGVyIil8fCh0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKHQuZ2V0KCJXIiksdGhpcy5yZWN0YW5nbGUpLHRoaXMuYm9yZGVyU3R5bGUuc2V0U3R5bGUodC5nZXQoIlMiKSksdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkodC5nZXRBcnJheSgiRCIpKSl9ZWxzZSBpZihlLmhhcygiQm9yZGVyIikpe2NvbnN0IHQ9ZS5nZXRBcnJheSgiQm9yZGVyIik7QXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+PTMmJih0aGlzLmJvcmRlclN0eWxlLnNldEhvcml6b250YWxDb3JuZXJSYWRpdXModFswXSksdGhpcy5ib3JkZXJTdHlsZS5zZXRWZXJ0aWNhbENvcm5lclJhZGl1cyh0WzFdKSx0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKHRbMl0sdGhpcy5yZWN0YW5nbGUpLDQ9PT10Lmxlbmd0aCYmdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkodFszXSwhMCkpfWVsc2UgdGhpcy5ib3JkZXJTdHlsZS5zZXRXaWR0aCgwKX1zZXRBcHBlYXJhbmNlKGUpe3RoaXMuYXBwZWFyYW5jZT1udWxsO2NvbnN0IHQ9ZS5nZXQoIkFQIik7aWYoISh0IGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm47Y29uc3Qgcj10LmdldCgiTiIpO2lmKHIgaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0pcmV0dXJuIHZvaWQodGhpcy5hcHBlYXJhbmNlPXIpO2lmKCEociBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IG49ZS5nZXQoIkFTIik7aWYoIShuIGluc3RhbmNlb2Ygcy5OYW1lJiZyLmhhcyhuLm5hbWUpKSlyZXR1cm47Y29uc3QgYT1yLmdldChuLm5hbWUpO2EgaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0mJih0aGlzLmFwcGVhcmFuY2U9YSl9c2V0T3B0aW9uYWxDb250ZW50KGUpe3RoaXMub2M9bnVsbDtjb25zdCB0PWUuZ2V0KCJPQyIpO3QgaW5zdGFuY2VvZiBzLk5hbWU/KDAsbi53YXJuKSgic2V0T3B0aW9uYWxDb250ZW50OiBTdXBwb3J0IGZvciAvTmFtZS1lbnRyeSBpcyBub3QgaW1wbGVtZW50ZWQuIik6dCBpbnN0YW5jZW9mIHMuRGljdCYmKHRoaXMub2M9dCl9bG9hZFJlc291cmNlcyhlLHQpe3JldHVybiB0LmRpY3QuZ2V0QXN5bmMoIlJlc291cmNlcyIpLnRoZW4oKHQ9PntpZih0KXJldHVybiBuZXcgcC5PYmplY3RMb2FkZXIodCxlLHQueHJlZikubG9hZCgpLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSl9KSl9YXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGUsdCxyLGEsaSl7Y29uc3QgYz10aGlzLmRhdGE7bGV0IGw9dGhpcy5hcHBlYXJhbmNlO2NvbnN0IGg9ISEodGhpcy5kYXRhLmhhc093bkNhbnZhcyYmciZuLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSk7aWYoIWwpe2lmKCFoKXJldHVybntvcExpc3Q6bmV3IG0uT3BlcmF0b3JMaXN0LHNlcGFyYXRlRm9ybTohMSxzZXBhcmF0ZUNhbnZhczohMX07bD1uZXcgby5TdHJpbmdTdHJlYW0oIiIpLGwuZGljdD1uZXcgcy5EaWN0fWNvbnN0IHU9bC5kaWN0LGQ9YXdhaXQgdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwiQ29sb3JTcGFjZSIsIlBhdHRlcm4iLCJTaGFkaW5nIiwiWE9iamVjdCIsIkZvbnQiXSxsKSxmPXUuZ2V0QXJyYXkoIkJCb3giKXx8WzAsMCwxLDFdLGc9dS5nZXRBcnJheSgiTWF0cml4Iil8fFsxLDAsMCwxLDAsMF0scD14KGMucmVjdCxmLGcpLGI9bmV3IG0uT3BlcmF0b3JMaXN0O2xldCB5O3JldHVybiB0aGlzLm9jJiYoeT1hd2FpdCBlLnBhcnNlTWFya2VkQ29udGVudFByb3BzKHRoaXMub2MsbnVsbCkpLHZvaWQgMCE9PXkmJmIuYWRkT3Aobi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIseV0pLGIuYWRkT3Aobi5PUFMuYmVnaW5Bbm5vdGF0aW9uLFtjLmlkLGMucmVjdCxwLGcsaF0pLGF3YWl0IGUuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06bCx0YXNrOnQscmVzb3VyY2VzOmQsb3BlcmF0b3JMaXN0OmIsZmFsbGJhY2tGb250RGljdDp0aGlzLl9mYWxsYmFja0ZvbnREaWN0fSksYi5hZGRPcChuLk9QUy5lbmRBbm5vdGF0aW9uLFtdKSx2b2lkIDAhPT15JiZiLmFkZE9wKG4uT1BTLmVuZE1hcmtlZENvbnRlbnQsW10pLHRoaXMucmVzZXQoKSx7b3BMaXN0OmIsc2VwYXJhdGVGb3JtOiExLHNlcGFyYXRlQ2FudmFzOmh9fWFzeW5jIHNhdmUoZSx0LHIpe3JldHVybiBudWxsfWdldCBoYXNUZXh0Q29udGVudCgpe3JldHVybiExfWFzeW5jIGV4dHJhY3RUZXh0Q29udGVudChlLHQscil7aWYoIXRoaXMuYXBwZWFyYW5jZSlyZXR1cm47Y29uc3QgYT1hd2FpdCB0aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCJGb250IiwiUHJvcGVydGllcyIsIlhPYmplY3QiXSx0aGlzLmFwcGVhcmFuY2UpLGk9W10scz1bXTtsZXQgbz1udWxsO2NvbnN0IGM9e2Rlc2lyZWRTaXplOk1hdGguSW5maW5pdHkscmVhZHk6ITAsZW5xdWV1ZShlLHQpe2Zvcihjb25zdCB0IG9mIGUuaXRlbXMpdm9pZCAwIT09dC5zdHImJihvfHwobz10LnRyYW5zZm9ybS5zbGljZSgtMikpLHMucHVzaCh0LnN0ciksdC5oYXNFT0wmJihpLnB1c2gocy5qb2luKCIiKSkscy5sZW5ndGg9MCkpfX07aWYoYXdhaXQgZS5nZXRUZXh0Q29udGVudCh7c3RyZWFtOnRoaXMuYXBwZWFyYW5jZSx0YXNrOnQscmVzb3VyY2VzOmEsaW5jbHVkZU1hcmtlZENvbnRlbnQ6ITAsc2luazpjLHZpZXdCb3g6cn0pLHRoaXMucmVzZXQoKSxzLmxlbmd0aCYmaS5wdXNoKHMuam9pbigiIikpLGkubGVuZ3RoPjF8fGlbMF0pe2NvbnN0IGU9dGhpcy5hcHBlYXJhbmNlLmRpY3QsdD1lLmdldEFycmF5KCJCQm94Iil8fFswLDAsMSwxXSxyPWUuZ2V0QXJyYXkoIk1hdHJpeCIpfHxbMSwwLDAsMSwwLDBdLGE9dGhpcy5kYXRhLnJlY3Qscz14KGEsdCxyKTtzWzRdLT1hWzBdLHNbNV0tPWFbMV0sbz1uLlV0aWwuYXBwbHlUcmFuc2Zvcm0obyxzKSxvPW4uVXRpbC5hcHBseVRyYW5zZm9ybShvLHIpLHRoaXMuZGF0YS50ZXh0UG9zaXRpb249byx0aGlzLmRhdGEudGV4dENvbnRlbnQ9aX19Z2V0RmllbGRPYmplY3QoKXtyZXR1cm4gdGhpcy5kYXRhLmtpZElkcz97aWQ6dGhpcy5kYXRhLmlkLGFjdGlvbnM6dGhpcy5kYXRhLmFjdGlvbnMsbmFtZTp0aGlzLmRhdGEuZmllbGROYW1lLHN0cm9rZUNvbG9yOnRoaXMuZGF0YS5ib3JkZXJDb2xvcixmaWxsQ29sb3I6dGhpcy5kYXRhLmJhY2tncm91bmRDb2xvcix0eXBlOiIiLGtpZElkczp0aGlzLmRhdGEua2lkSWRzLHBhZ2U6dGhpcy5kYXRhLnBhZ2VJbmRleCxyb3RhdGlvbjp0aGlzLnJvdGF0aW9ufTpudWxsfXJlc2V0KCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fc3RyZWFtcyllLnJlc2V0KCl9X2NvbnN0cnVjdEZpZWxkTmFtZShlKXtpZighZS5oYXMoIlQiKSYmIWUuaGFzKCJQYXJlbnQiKSlyZXR1cm4oMCxuLndhcm4pKCJVbmtub3duIGZpZWxkIG5hbWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBmaWVsZCBuYW1lLiIpLCIiO2lmKCFlLmhhcygiUGFyZW50IikpcmV0dXJuKDAsbi5zdHJpbmdUb1BERlN0cmluZykoZS5nZXQoIlQiKSk7Y29uc3QgdD1bXTtlLmhhcygiVCIpJiZ0LnVuc2hpZnQoKDAsbi5zdHJpbmdUb1BERlN0cmluZykoZS5nZXQoIlQiKSkpO2xldCByPWU7Y29uc3QgYT1uZXcgcy5SZWZTZXQ7Zm9yKGUub2JqSWQmJmEucHV0KGUub2JqSWQpO3IuaGFzKCJQYXJlbnQiKSYmKHI9ci5nZXQoIlBhcmVudCIpLHIgaW5zdGFuY2VvZiBzLkRpY3QmJighci5vYmpJZHx8IWEuaGFzKHIub2JqSWQpKSk7KWlmKHIub2JqSWQmJmEucHV0KHIub2JqSWQpLHIuaGFzKCJUIikpe2NvbnN0IGU9KDAsbi5zdHJpbmdUb1BERlN0cmluZykoci5nZXQoIlQiKSk7ZS5zdGFydHNXaXRoKCIjIil8fHQudW5zaGlmdChlKX1yZXR1cm4gdC5qb2luKCIuIil9fXQuQW5ub3RhdGlvbj1TO2NsYXNzIEF7Y29uc3RydWN0b3IoKXt0aGlzLndpZHRoPTEsdGhpcy5zdHlsZT1uLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQsdGhpcy5kYXNoQXJyYXk9WzNdLHRoaXMuaG9yaXpvbnRhbENvcm5lclJhZGl1cz0wLHRoaXMudmVydGljYWxDb3JuZXJSYWRpdXM9MH1zZXRXaWR0aChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06WzAsMCwwLDBdO2lmKGUgaW5zdGFuY2VvZiBzLk5hbWUpdGhpcy53aWR0aD0wO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZihlPjApe2NvbnN0IHI9KHRbMl0tdFswXSkvMixhPSh0WzNdLXRbMV0pLzI7cj4wJiZhPjAmJihlPnJ8fGU+YSkmJigoMCxuLndhcm4pKCJBbm5vdGF0aW9uQm9yZGVyU3R5bGUuc2V0V2lkdGggLSBpZ25vcmluZyB3aWR0aDogIi5jb25jYXQoZSkpLGU9MSl9dGhpcy53aWR0aD1lfX1zZXRTdHlsZShlKXtpZihlIGluc3RhbmNlb2Ygcy5OYW1lKXN3aXRjaChlLm5hbWUpe2Nhc2UiUyI6dGhpcy5zdHlsZT1uLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ7YnJlYWs7Y2FzZSJEIjp0aGlzLnN0eWxlPW4uQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ7YnJlYWs7Y2FzZSJCIjp0aGlzLnN0eWxlPW4uQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEO2JyZWFrO2Nhc2UiSSI6dGhpcy5zdHlsZT1uLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ7YnJlYWs7Y2FzZSJVIjp0aGlzLnN0eWxlPW4uQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkV9fXNldERhc2hBcnJheShlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPjApe2xldCByPSEwLG49ITA7Zm9yKGNvbnN0IHQgb2YgZSl7aWYoISgrdD49MCkpe3I9ITE7YnJlYWt9dD4wJiYobj0hMSl9ciYmIW4/KHRoaXMuZGFzaEFycmF5PWUsdCYmdGhpcy5zZXRTdHlsZShzLk5hbWUuZ2V0KCJEIikpKTp0aGlzLndpZHRoPTB9ZWxzZSBlJiYodGhpcy53aWR0aD0wKX1zZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKGUpe051bWJlci5pc0ludGVnZXIoZSkmJih0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXM9ZSl9c2V0VmVydGljYWxDb3JuZXJSYWRpdXMoZSl7TnVtYmVyLmlzSW50ZWdlcihlKSYmKHRoaXMudmVydGljYWxDb3JuZXJSYWRpdXM9ZSl9fXQuQW5ub3RhdGlvbkJvcmRlclN0eWxlPUE7Y2xhc3MgayBleHRlbmRzIFN7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7Y29uc3R7ZGljdDp0fT1lO2lmKHQuaGFzKCJJUlQiKSl7Y29uc3QgZT10LmdldFJhdygiSVJUIik7dGhpcy5kYXRhLmluUmVwbHlUbz1lIGluc3RhbmNlb2Ygcy5SZWY/ZS50b1N0cmluZygpOm51bGw7Y29uc3Qgcj10LmdldCgiUlQiKTt0aGlzLmRhdGEucmVwbHlUeXBlPXIgaW5zdGFuY2VvZiBzLk5hbWU/ci5uYW1lOm4uQW5ub3RhdGlvblJlcGx5VHlwZS5SRVBMWX1sZXQgcj1udWxsO2lmKHRoaXMuZGF0YS5yZXBseVR5cGU9PT1uLkFubm90YXRpb25SZXBseVR5cGUuR1JPVVApe2NvbnN0IGU9dC5nZXQoIklSVCIpO3RoaXMuc2V0VGl0bGUoZS5nZXQoIlQiKSksdGhpcy5kYXRhLnRpdGxlT2JqPXRoaXMuX3RpdGxlLHRoaXMuc2V0Q29udGVudHMoZS5nZXQoIkNvbnRlbnRzIikpLHRoaXMuZGF0YS5jb250ZW50c09iaj10aGlzLl9jb250ZW50cyxlLmhhcygiQ3JlYXRpb25EYXRlIik/KHRoaXMuc2V0Q3JlYXRpb25EYXRlKGUuZ2V0KCJDcmVhdGlvbkRhdGUiKSksdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZT10aGlzLmNyZWF0aW9uRGF0ZSk6dGhpcy5kYXRhLmNyZWF0aW9uRGF0ZT1udWxsLGUuaGFzKCJNIik/KHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShlLmdldCgiTSIpKSx0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZT10aGlzLm1vZGlmaWNhdGlvbkRhdGUpOnRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlPW51bGwscj1lLmdldFJhdygiUG9wdXAiKSxlLmhhcygiQyIpPyh0aGlzLnNldENvbG9yKGUuZ2V0QXJyYXkoIkMiKSksdGhpcy5kYXRhLmNvbG9yPXRoaXMuY29sb3IpOnRoaXMuZGF0YS5jb2xvcj1udWxsfWVsc2UgdGhpcy5kYXRhLnRpdGxlT2JqPXRoaXMuX3RpdGxlLHRoaXMuc2V0Q3JlYXRpb25EYXRlKHQuZ2V0KCJDcmVhdGlvbkRhdGUiKSksdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZT10aGlzLmNyZWF0aW9uRGF0ZSxyPXQuZ2V0UmF3KCJQb3B1cCIpLHQuaGFzKCJDIil8fCh0aGlzLmRhdGEuY29sb3I9bnVsbCk7dGhpcy5kYXRhLnBvcHVwUmVmPXIgaW5zdGFuY2VvZiBzLlJlZj9yLnRvU3RyaW5nKCk6bnVsbCx0LmhhcygiUkMiKSYmKHRoaXMuZGF0YS5yaWNoVGV4dD1iLlhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwodC5nZXQoIlJDIikpKX1zZXRDcmVhdGlvbkRhdGUoZSl7dGhpcy5jcmVhdGlvbkRhdGU9InN0cmluZyI9PXR5cGVvZiBlP2U6bnVsbH1fc2V0RGVmYXVsdEFwcGVhcmFuY2UoZSl7bGV0e3hyZWY6dCxleHRyYTpyLHN0cm9rZUNvbG9yOm4sZmlsbENvbG9yOmEsYmxlbmRNb2RlOmksc3Ryb2tlQWxwaGE6YyxmaWxsQWxwaGE6bCxwb2ludHNDYWxsYmFjazpofT1lLHU9TnVtYmVyLk1BWF9WQUxVRSxkPU51bWJlci5NQVhfVkFMVUUsZj1OdW1iZXIuTUlOX1ZBTFVFLGc9TnVtYmVyLk1JTl9WQUxVRTtjb25zdCBwPVsicSJdO3ImJnAucHVzaChyKSxuJiZwLnB1c2goIiIuY29uY2F0KG5bMF0sIiAiKS5jb25jYXQoblsxXSwiICIpLmNvbmNhdChuWzJdLCIgUkciKSksYSYmcC5wdXNoKCIiLmNvbmNhdChhWzBdLCIgIikuY29uY2F0KGFbMV0sIiAiKS5jb25jYXQoYVsyXSwiIHJnIikpO2xldCBtPXRoaXMuZGF0YS5xdWFkUG9pbnRzO218fChtPVtbe3g6dGhpcy5yZWN0YW5nbGVbMF0seTp0aGlzLnJlY3RhbmdsZVszXX0se3g6dGhpcy5yZWN0YW5nbGVbMl0seTp0aGlzLnJlY3RhbmdsZVszXX0se3g6dGhpcy5yZWN0YW5nbGVbMF0seTp0aGlzLnJlY3RhbmdsZVsxXX0se3g6dGhpcy5yZWN0YW5nbGVbMl0seTp0aGlzLnJlY3RhbmdsZVsxXX1dXSk7Zm9yKGNvbnN0IGUgb2YgbSl7Y29uc3RbdCxyLG4sYV09aChwLGUpO3U9TWF0aC5taW4odSx0KSxmPU1hdGgubWF4KGYsciksZD1NYXRoLm1pbihkLG4pLGc9TWF0aC5tYXgoZyxhKX1wLnB1c2goIlEiKTtjb25zdCBiPW5ldyBzLkRpY3QodCkseT1uZXcgcy5EaWN0KHQpO3kuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpO2NvbnN0IHc9bmV3IG8uU3RyaW5nU3RyZWFtKHAuam9pbigiICIpKTt3LmRpY3Q9eSxiLnNldCgiRm0wIix3KTtjb25zdCB2PW5ldyBzLkRpY3QodCk7aSYmdi5zZXQoIkJNIixzLk5hbWUuZ2V0KGkpKSwibnVtYmVyIj09dHlwZW9mIGMmJnYuc2V0KCJDQSIsYyksIm51bWJlciI9PXR5cGVvZiBsJiZ2LnNldCgiY2EiLGwpO2NvbnN0IHg9bmV3IHMuRGljdCh0KTt4LnNldCgiR1MwIix2KTtjb25zdCBTPW5ldyBzLkRpY3QodCk7Uy5zZXQoIkV4dEdTdGF0ZSIseCksUy5zZXQoIlhPYmplY3QiLGIpO2NvbnN0IEE9bmV3IHMuRGljdCh0KTtBLnNldCgiUmVzb3VyY2VzIixTKTtjb25zdCBrPXRoaXMuZGF0YS5yZWN0PVt1LGQsZixnXTtBLnNldCgiQkJveCIsayksdGhpcy5hcHBlYXJhbmNlPW5ldyBvLlN0cmluZ1N0cmVhbSgiL0dTMCBncyAvRm0wIERvIiksdGhpcy5hcHBlYXJhbmNlLmRpY3Q9QSx0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5hcHBlYXJhbmNlLHcpfXN0YXRpYyBhc3luYyBjcmVhdGVOZXdBbm5vdGF0aW9uKGUsdCxyLG4pe2NvbnN0IGE9dC5yZWZ8fGUuZ2V0TmV3VGVtcG9yYXJ5UmVmKCksaT1hd2FpdCB0aGlzLmNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0odCxlLG4pLHM9W107bGV0IG87aWYoaSl7Y29uc3Qgbj1lLmdldE5ld1RlbXBvcmFyeVJlZigpO289dGhpcy5jcmVhdGVOZXdEaWN0KHQsZSx7YXBSZWY6bn0pO2NvbnN0IGE9ZS5lbmNyeXB0P2UuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obi5udW0sbi5nZW4pOm51bGw7YXdhaXQoMCxjLndyaXRlT2JqZWN0KShuLGkscyxhKSxyLnB1c2goe3JlZjpuLGRhdGE6cy5qb2luKCIiKX0pfWVsc2Ugbz10aGlzLmNyZWF0ZU5ld0RpY3QodCxlLHt9KTtzLmxlbmd0aD0wO2NvbnN0IGw9ZS5lbmNyeXB0P2UuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oYS5udW0sYS5nZW4pOm51bGw7cmV0dXJuIGF3YWl0KDAsYy53cml0ZU9iamVjdCkoYSxvLHMsbCkse3JlZjphLGRhdGE6cy5qb2luKCIiKX19c3RhdGljIGFzeW5jIGNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihlLHQscil7Y29uc3Qgbj1hd2FpdCB0aGlzLmNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0odCxlLHIpLGE9dGhpcy5jcmVhdGVOZXdEaWN0KHQsZSx7YXA6bn0pLGk9bmV3IHRoaXMucHJvdG90eXBlLmNvbnN0cnVjdG9yKHtkaWN0OmEseHJlZjplLGV2YWx1YXRvck9wdGlvbnM6ci5ldmFsdWF0b3JPcHRpb25zfSk7cmV0dXJuIHQucmVmJiYoaS5yZWY9aS5yZWZUb1JlcGxhY2U9dC5yZWYpLGl9fXQuTWFya3VwQW5ub3RhdGlvbj1rO2NsYXNzIEMgZXh0ZW5kcyBTe2NvbnN0cnVjdG9yKGUpe3ZhciB0O3N1cGVyKGUpO2NvbnN0e2RpY3Q6cix4cmVmOml9PWUsbz10aGlzLmRhdGE7dGhpcy5fbmVlZEFwcGVhcmFuY2VzPWUubmVlZEFwcGVhcmFuY2VzLG8uYW5ub3RhdGlvblR5cGU9bi5Bbm5vdGF0aW9uVHlwZS5XSURHRVQsdm9pZCAwPT09by5maWVsZE5hbWUmJihvLmZpZWxkTmFtZT10aGlzLl9jb25zdHJ1Y3RGaWVsZE5hbWUocikpLG8uZmllbGROYW1lJiYvXFtcZCtcXSQvLnRlc3Qoby5maWVsZE5hbWUpJiYhci5oYXMoIktpZHMiKSYmKG8uYmFzZUZpZWxkTmFtZT1vLmZpZWxkTmFtZS5zdWJzdHJpbmcoMCxvLmZpZWxkTmFtZS5sYXN0SW5kZXhPZigiWyIpKSksdm9pZCAwPT09by5hY3Rpb25zJiYoby5hY3Rpb25zPSgwLGEuY29sbGVjdEFjdGlvbnMpKGkscixuLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGUpKTtsZXQgYz0oMCxhLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnIsa2V5OiJWIixnZXRBcnJheTohMH0pO28uZmllbGRWYWx1ZT10aGlzLl9kZWNvZGVGb3JtVmFsdWUoYyk7Y29uc3QgbD0oMCxhLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnIsa2V5OiJEViIsZ2V0QXJyYXk6ITB9KTtpZihvLmRlZmF1bHRGaWVsZFZhbHVlPXRoaXMuX2RlY29kZUZvcm1WYWx1ZShsKSx2b2lkIDA9PT1jJiZlLnhmYURhdGFzZXRzKXtjb25zdCB0PXRoaXMuX3RpdGxlLnN0cjt0JiYodGhpcy5faGFzVmFsdWVGcm9tWEZBPSEwLG8uZmllbGRWYWx1ZT1jPWUueGZhRGF0YXNldHMuZ2V0VmFsdWUodCkpfXZvaWQgMD09PWMmJm51bGwhPT1vLmRlZmF1bHRGaWVsZFZhbHVlJiYoby5maWVsZFZhbHVlPW8uZGVmYXVsdEZpZWxkVmFsdWUpLG8uYWx0ZXJuYXRpdmVUZXh0PSgwLG4uc3RyaW5nVG9QREZTdHJpbmcpKHIuZ2V0KCJUVSIpfHwiIiksdGhpcy5zZXREZWZhdWx0QXBwZWFyYW5jZShlKSxvLmhhc0FwcGVhcmFuY2V8fChvLmhhc0FwcGVhcmFuY2U9dGhpcy5fbmVlZEFwcGVhcmFuY2VzJiZ2b2lkIDAhPT1vLmZpZWxkVmFsdWUmJm51bGwhPT1vLmZpZWxkVmFsdWUpO2NvbnN0IGg9KDAsYS5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDpyLGtleToiRlQifSk7by5maWVsZFR5cGU9aCBpbnN0YW5jZW9mIHMuTmFtZT9oLm5hbWU6bnVsbDtjb25zdCB1PSgwLGEuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6cixrZXk6IkRSIn0pLGQ9ZS5hY3JvRm9ybS5nZXQoIkRSIiksZj1udWxsPT09KHQ9dGhpcy5hcHBlYXJhbmNlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5kaWN0LmdldCgiUmVzb3VyY2VzIik7dGhpcy5fZmllbGRSZXNvdXJjZXM9e2xvY2FsUmVzb3VyY2VzOnUsYWNyb0Zvcm1SZXNvdXJjZXM6ZCxhcHBlYXJhbmNlUmVzb3VyY2VzOmYsbWVyZ2VkUmVzb3VyY2VzOnMuRGljdC5tZXJnZSh7eHJlZjppLGRpY3RBcnJheTpbdSxmLGRdLG1lcmdlU3ViRGljdHM6ITB9KX0sby5maWVsZEZsYWdzPSgwLGEuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6cixrZXk6IkZmIn0pLCghTnVtYmVyLmlzSW50ZWdlcihvLmZpZWxkRmxhZ3MpfHxvLmZpZWxkRmxhZ3M8MCkmJihvLmZpZWxkRmxhZ3M9MCksby5yZWFkT25seT10aGlzLmhhc0ZpZWxkRmxhZyhuLkFubm90YXRpb25GaWVsZEZsYWcuUkVBRE9OTFkpLG8ucmVxdWlyZWQ9dGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlJFUVVJUkVEKSxvLmhpZGRlbj10aGlzLl9oYXNGbGFnKG8uYW5ub3RhdGlvbkZsYWdzLG4uQW5ub3RhdGlvbkZsYWcuSElEREVOKX1fZGVjb2RlRm9ybVZhbHVlKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UuZmlsdGVyKChlPT4ic3RyaW5nIj09dHlwZW9mIGUpKS5tYXAoKGU9PigwLG4uc3RyaW5nVG9QREZTdHJpbmcpKGUpKSk6ZSBpbnN0YW5jZW9mIHMuTmFtZT8oMCxuLnN0cmluZ1RvUERGU3RyaW5nKShlLm5hbWUpOiJzdHJpbmciPT10eXBlb2YgZT8oMCxuLnN0cmluZ1RvUERGU3RyaW5nKShlKTpudWxsfWhhc0ZpZWxkRmxhZyhlKXtyZXR1cm4hISh0aGlzLmRhdGEuZmllbGRGbGFncyZlKX1nZXRSb3RhdGlvbk1hdHJpeChlKXt2YXIgdDtsZXQgcj1udWxsPT1lfHxudWxsPT09KHQ9ZS5nZXQodGhpcy5kYXRhLmlkKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQucm90YXRpb247aWYodm9pZCAwPT09ciYmKHI9dGhpcy5yb3RhdGlvbiksMD09PXIpcmV0dXJuIG4uSURFTlRJVFlfTUFUUklYO2NvbnN0IGk9dGhpcy5kYXRhLnJlY3RbMl0tdGhpcy5kYXRhLnJlY3RbMF0scz10aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXTtyZXR1cm4oMCxhLmdldFJvdGF0aW9uTWF0cml4KShyLGkscyl9Z2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGUpe3ZhciB0O2xldCByPW51bGw9PWV8fG51bGw9PT0odD1lLmdldCh0aGlzLmRhdGEuaWQpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5yb3RhdGlvbjtpZih2b2lkIDA9PT1yJiYocj10aGlzLnJvdGF0aW9uKSwhdGhpcy5iYWNrZ3JvdW5kQ29sb3ImJiF0aGlzLmJvcmRlckNvbG9yKXJldHVybiIiO2NvbnN0IG49dGhpcy5kYXRhLnJlY3RbMl0tdGhpcy5kYXRhLnJlY3RbMF0sYT10aGlzLmRhdGEucmVjdFszXS10aGlzLmRhdGEucmVjdFsxXSxzPTA9PT1yfHwxODA9PT1yPyIwIDAgIi5jb25jYXQobiwiICIpLmNvbmNhdChhLCIgcmUiKToiMCAwICIuY29uY2F0KGEsIiAiKS5jb25jYXQobiwiIHJlIik7bGV0IG89IiI7cmV0dXJuIHRoaXMuYmFja2dyb3VuZENvbG9yJiYobz0iIi5jb25jYXQoKDAsaS5nZXRQZGZDb2xvcikodGhpcy5iYWNrZ3JvdW5kQ29sb3IsITApLCIgIikuY29uY2F0KHMsIiBmICIpKSx0aGlzLmJvcmRlckNvbG9yJiYobys9IiIuY29uY2F0KHRoaXMuYm9yZGVyU3R5bGUud2lkdGh8fDEsIiB3ICIpLmNvbmNhdCgoMCxpLmdldFBkZkNvbG9yKSh0aGlzLmJvcmRlckNvbG9yLCExKSwiICIpLmNvbmNhdChzLCIgUyAiKSksb31hc3luYyBnZXRPcGVyYXRvckxpc3QoZSx0LHIsYSxpKXtpZihhJiYhKHRoaXMgaW5zdGFuY2VvZiBUKSYmIXRoaXMuZGF0YS5ub0hUTUwmJiF0aGlzLmRhdGEuaGFzT3duQ2FudmFzKXJldHVybntvcExpc3Q6bmV3IG0uT3BlcmF0b3JMaXN0LHNlcGFyYXRlRm9ybTohMCxzZXBhcmF0ZUNhbnZhczohMX07aWYoIXRoaXMuX2hhc1RleHQpcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChlLHQscixhLGkpO2NvbnN0IHM9YXdhaXQgdGhpcy5fZ2V0QXBwZWFyYW5jZShlLHQscixpKTtpZih0aGlzLmFwcGVhcmFuY2UmJm51bGw9PT1zKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsYSxpKTtjb25zdCBjPW5ldyBtLk9wZXJhdG9yTGlzdDtpZighdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2V8fG51bGw9PT1zKXJldHVybntvcExpc3Q6YyxzZXBhcmF0ZUZvcm06ITEsc2VwYXJhdGVDYW52YXM6ITF9O2NvbnN0IGw9ISEodGhpcy5kYXRhLmhhc093bkNhbnZhcyYmciZuLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksaD1bMCwwLHRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdLHRoaXMuZGF0YS5yZWN0WzNdLXRoaXMuZGF0YS5yZWN0WzFdXSx1PXgodGhpcy5kYXRhLnJlY3QsaCxbMSwwLDAsMSwwLDBdKTtsZXQgZDt0aGlzLm9jJiYoZD1hd2FpdCBlLnBhcnNlTWFya2VkQ29udGVudFByb3BzKHRoaXMub2MsbnVsbCkpLHZvaWQgMCE9PWQmJmMuYWRkT3Aobi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIsZF0pLGMuYWRkT3Aobi5PUFMuYmVnaW5Bbm5vdGF0aW9uLFt0aGlzLmRhdGEuaWQsdGhpcy5kYXRhLnJlY3QsdSx0aGlzLmdldFJvdGF0aW9uTWF0cml4KGkpLGxdKTtjb25zdCBmPW5ldyBvLlN0cmluZ1N0cmVhbShzKTtyZXR1cm4gYXdhaXQgZS5nZXRPcGVyYXRvckxpc3Qoe3N0cmVhbTpmLHRhc2s6dCxyZXNvdXJjZXM6dGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLG9wZXJhdG9yTGlzdDpjfSksYy5hZGRPcChuLk9QUy5lbmRBbm5vdGF0aW9uLFtdKSx2b2lkIDAhPT1kJiZjLmFkZE9wKG4uT1BTLmVuZE1hcmtlZENvbnRlbnQsW10pLHtvcExpc3Q6YyxzZXBhcmF0ZUZvcm06ITEsc2VwYXJhdGVDYW52YXM6bH19X2dldE1LRGljdChlKXtjb25zdCB0PW5ldyBzLkRpY3QobnVsbCk7cmV0dXJuIGUmJnQuc2V0KCJSIixlKSx0aGlzLmJvcmRlckNvbG9yJiZ0LnNldCgiQkMiLHcodGhpcy5ib3JkZXJDb2xvcikpLHRoaXMuYmFja2dyb3VuZENvbG9yJiZ0LnNldCgiQkciLHcodGhpcy5iYWNrZ3JvdW5kQ29sb3IpKSx0LnNpemU+MD90Om51bGx9YW1lbmRTYXZlZERpY3QoZSx0KXt9YXN5bmMgc2F2ZShlLHQscil7dmFyIGk7Y29uc3QgbD1udWxsPT1yP3ZvaWQgMDpyLmdldCh0aGlzLmRhdGEuaWQpO2xldCBoPW51bGw9PWw/dm9pZCAwOmwudmFsdWUsdT1udWxsPT1sP3ZvaWQgMDpsLnJvdGF0aW9uO2lmKGg9PT10aGlzLmRhdGEuZmllbGRWYWx1ZXx8dm9pZCAwPT09aCl7aWYoIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSYmdm9pZCAwPT09dSlyZXR1cm4gbnVsbDtofHwoaD10aGlzLmRhdGEuZmllbGRWYWx1ZSl9aWYodm9pZCAwPT09dSYmIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSYmQXJyYXkuaXNBcnJheShoKSYmQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZmllbGRWYWx1ZSkmJmgubGVuZ3RoPT09dGhpcy5kYXRhLmZpZWxkVmFsdWUubGVuZ3RoJiZoLmV2ZXJ5KCgoZSx0KT0+ZT09PXRoaXMuZGF0YS5maWVsZFZhbHVlW3RdKSkpcmV0dXJuIG51bGw7dm9pZCAwPT09dSYmKHU9dGhpcy5yb3RhdGlvbik7bGV0IGQ9bnVsbDtpZighdGhpcy5fbmVlZEFwcGVhcmFuY2VzJiYoZD1hd2FpdCB0aGlzLl9nZXRBcHBlYXJhbmNlKGUsdCxuLlJlbmRlcmluZ0ludGVudEZsYWcuU0FWRSxyKSxudWxsPT09ZCkpcmV0dXJuIG51bGw7bGV0IGY9ITE7bnVsbCE9PShpPWQpJiZ2b2lkIDAhPT1pJiZpLm5lZWRBcHBlYXJhbmNlcyYmKGY9ITAsZD1udWxsKTtjb25zdHt4cmVmOmd9PWUscD1nLmZldGNoSWZSZWYodGhpcy5yZWYpO2lmKCEocCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuIG51bGw7Y29uc3QgbT1uZXcgcy5EaWN0KGcpO2Zvcihjb25zdCBlIG9mIHAuZ2V0S2V5cygpKSJBUCIhPT1lJiZtLnNldChlLHAuZ2V0UmF3KGUpKTtjb25zdCBiPXtwYXRoOnRoaXMuZGF0YS5maWVsZE5hbWUsdmFsdWU6aH0seT1lPT4oMCxhLmlzQXNjaWkpKGUpP2U6KDAsYS5zdHJpbmdUb1VURjE2U3RyaW5nKShlLCEwKTttLnNldCgiViIsQXJyYXkuaXNBcnJheShoKT9oLm1hcCh5KTp5KGgpKSx0aGlzLmFtZW5kU2F2ZWREaWN0KHIsbSk7Y29uc3Qgdz10aGlzLl9nZXRNS0RpY3QodSk7dyYmbS5zZXQoIk1LIix3KTtjb25zdCB2PWcuZW5jcnlwdCx4PXY/di5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbik6bnVsbCxTPVtdLEE9W3tyZWY6dGhpcy5yZWYsZGF0YToiIix4ZmE6YixuZWVkQXBwZWFyYW5jZXM6Zn1dO2lmKG51bGwhPT1kKXtjb25zdCBlPWcuZ2V0TmV3VGVtcG9yYXJ5UmVmKCksdD1uZXcgcy5EaWN0KGcpO20uc2V0KCJBUCIsdCksdC5zZXQoIk4iLGUpO2xldCBhPW51bGw7diYmKGE9di5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oZS5udW0sZS5nZW4pKTtjb25zdCBpPXRoaXMuX2dldFNhdmVGaWVsZFJlc291cmNlcyhnKSxsPW5ldyBvLlN0cmluZ1N0cmVhbShkKSxoPWwuZGljdD1uZXcgcy5EaWN0KGcpO2guc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpLGguc2V0KCJSZXNvdXJjZXMiLGkpLGguc2V0KCJCQm94IixbMCwwLHRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdLHRoaXMuZGF0YS5yZWN0WzNdLXRoaXMuZGF0YS5yZWN0WzFdXSk7Y29uc3QgdT10aGlzLmdldFJvdGF0aW9uTWF0cml4KHIpO3UhPT1uLklERU5USVRZX01BVFJJWCYmaC5zZXQoIk1hdHJpeCIsdSksYXdhaXQoMCxjLndyaXRlT2JqZWN0KShlLGwsUyxhKSxBLnB1c2goe3JlZjplLGRhdGE6Uy5qb2luKCIiKSx4ZmE6bnVsbCxuZWVkQXBwZWFyYW5jZXM6ITF9KSxTLmxlbmd0aD0wfXJldHVybiBtLnNldCgiTSIsIkQ6Ii5jb25jYXQoKDAsbi5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSksYXdhaXQoMCxjLndyaXRlT2JqZWN0KSh0aGlzLnJlZixtLFMseCksQVswXS5kYXRhPVMuam9pbigiIiksQX1hc3luYyBfZ2V0QXBwZWFyYW5jZShlLHQscixzKXtpZih0aGlzLmhhc0ZpZWxkRmxhZyhuLkFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQpKXJldHVybiBudWxsO2NvbnN0IG89bnVsbD09cz92b2lkIDA6cy5nZXQodGhpcy5kYXRhLmlkKTtsZXQgYyxsO2lmKG8mJihjPW8uZm9ybWF0dGVkVmFsdWV8fG8udmFsdWUsbD1vLnJvdGF0aW9uKSx2b2lkIDA9PT1sJiZ2b2lkIDA9PT1jJiYhdGhpcy5fbmVlZEFwcGVhcmFuY2VzJiYoIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQXx8dGhpcy5hcHBlYXJhbmNlKSlyZXR1cm4gbnVsbDtjb25zdCBoPXRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKHMpO2lmKHZvaWQgMD09PWMmJihjPXRoaXMuZGF0YS5maWVsZFZhbHVlLCFjKSlyZXR1cm4iL1R4IEJNQyBxICIuY29uY2F0KGgsIlEgRU1DIik7aWYoQXJyYXkuaXNBcnJheShjKSYmMT09PWMubGVuZ3RoJiYoYz1jWzBdKSwoMCxuLmFzc2VydCkoInN0cmluZyI9PXR5cGVvZiBjLCJFeHBlY3RlZCBgdmFsdWVgIHRvIGJlIGEgc3RyaW5nLiIpLGM9Yy50cmltKCksdGhpcy5kYXRhLmNvbWJvKXtjb25zdCBlPXRoaXMuZGF0YS5vcHRpb25zLmZpbmQoKGU9PntsZXR7ZXhwb3J0VmFsdWU6dH09ZTtyZXR1cm4gYz09PXR9KSk7Yz0obnVsbD09ZT92b2lkIDA6ZS5kaXNwbGF5VmFsdWUpfHxjfWlmKCIiPT09YylyZXR1cm4iL1R4IEJNQyBxICIuY29uY2F0KGgsIlEgRU1DIik7dm9pZCAwPT09bCYmKGw9dGhpcy5yb3RhdGlvbik7bGV0IHUsZD0tMTt0aGlzLmRhdGEubXVsdGlMaW5lPyh1PWMuc3BsaXQoL1xyXG4/fFxuLykubWFwKChlPT5lLm5vcm1hbGl6ZSgiTkZDIikpKSxkPXUubGVuZ3RoKTp1PVtjLnJlcGxhY2UoL1xyXG4/fFxuLywiIikubm9ybWFsaXplKCJORkMiKV07bGV0IGY9dGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV0sZz10aGlzLmRhdGEucmVjdFsyXS10aGlzLmRhdGEucmVjdFswXTs5MCE9PWwmJjI3MCE9PWx8fChbZyxmXT1bZixnXSksdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2V8fCh0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhPSgwLGkucGFyc2VEZWZhdWx0QXBwZWFyYW5jZSkodGhpcy5fZGVmYXVsdEFwcGVhcmFuY2U9Ii9IZWx2ZXRpY2EgMCBUZiAwIGciKSk7bGV0IHAsbSxiLHk9YXdhaXQgQy5fZ2V0Rm9udERhdGEoZSx0LHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEsdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzKTtjb25zdCB3PVtdO2xldCB2PSExO2Zvcihjb25zdCBlIG9mIHUpe2NvbnN0IHQ9eS5lbmNvZGVTdHJpbmcoZSk7dC5sZW5ndGg+MSYmKHY9ITApLHcucHVzaCh0LmpvaW4oIiIpKX1pZih2JiZyJm4uUmVuZGVyaW5nSW50ZW50RmxhZy5TQVZFKXJldHVybntuZWVkQXBwZWFyYW5jZXM6ITB9O2lmKHYmJnRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKXtjb25zdCByPXRoaXMuZGF0YS5jb21iPyJtb25vc3BhY2UiOiJzYW5zLXNlcmlmIixuPW5ldyBpLkZha2VVbmljb2RlRm9udChlLnhyZWYscikscz1uLmNyZWF0ZUZvbnRSZXNvdXJjZXModS5qb2luKCIiKSksbz1zLmdldFJhdygiRm9udCIpO2lmKHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcy5oYXMoIkZvbnQiKSl7Y29uc3QgZT10aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMuZ2V0KCJGb250Iik7Zm9yKGNvbnN0IHQgb2Ygby5nZXRLZXlzKCkpZS5zZXQodCxvLmdldFJhdyh0KSl9ZWxzZSB0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMuc2V0KCJGb250IixvKTtjb25zdCBsPW4uZm9udE5hbWUubmFtZTt5PWF3YWl0IEMuX2dldEZvbnREYXRhKGUsdCx7Zm9udE5hbWU6bCxmb250U2l6ZTowfSxzKTtmb3IobGV0IGU9MCx0PXcubGVuZ3RoO2U8dDtlKyspd1tlXT0oMCxhLnN0cmluZ1RvVVRGMTZTdHJpbmcpKHVbZV0pO2NvbnN0IGg9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEpO3RoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udFNpemU9MCx0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnROYW1lPWwsW3AsbSxiXT10aGlzLl9jb21wdXRlRm9udFNpemUoZi0yLGctNCxjLHksZCksdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YT1ofWVsc2UgdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWR8fCgwLG4ud2FybikoIl9nZXRBcHBlYXJhbmNlOiBPZmZzY3JlZW5DYW52YXMgaXMgbm90IHN1cHBvcnRlZCwgYW5ub3RhdGlvbiBtYXkgbm90IHJlbmRlciBjb3JyZWN0bHkuIiksW3AsbSxiXT10aGlzLl9jb21wdXRlRm9udFNpemUoZi0yLGctNCxjLHksZCk7bGV0IHg9eS5kZXNjZW50O3g9aXNOYU4oeCk/bi5CQVNFTElORV9GQUNUT1IqYjpNYXRoLm1heChuLkJBU0VMSU5FX0ZBQ1RPUipiLE1hdGguYWJzKHgpKm0pO2NvbnN0IFM9TWF0aC5taW4oTWF0aC5mbG9vcigoZi1tKS8yKSwxKSxBPXRoaXMuZGF0YS50ZXh0QWxpZ25tZW50O2lmKHRoaXMuZGF0YS5tdWx0aUxpbmUpcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UocCx3LHksbSxnLGYsQSwyLFMseCxiLHMpO2lmKHRoaXMuZGF0YS5jb21iKXJldHVybiB0aGlzLl9nZXRDb21iQXBwZWFyYW5jZShwLHksd1swXSxtLGcsZiwyLFMseCxiLHMpO2NvbnN0IGs9Uyt4O3JldHVybiAwPT09QXx8QT4yPyIvVHggQk1DIHEgIi5jb25jYXQoaCwiQlQgIikrcCsiIDEgMCAwIDEgIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoMiksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoayksIiBUbSAoIikuY29uY2F0KCgwLGEuZXNjYXBlU3RyaW5nKSh3WzBdKSwiKSBUaiBFVCBRIEVNQyIpOiIvVHggQk1DIHEgIi5jb25jYXQoaCwiQlQgIikrcCsiIDEgMCAwIDEgMCAwIFRtICIuY29uY2F0KHRoaXMuX3JlbmRlclRleHQod1swXSx5LG0sZyxBLHtzaGlmdDowfSwyLGspLCIgRVQgUSBFTUMiKX1zdGF0aWMgYXN5bmMgX2dldEZvbnREYXRhKGUsdCxyLG4pe2NvbnN0IGE9bmV3IG0uT3BlcmF0b3JMaXN0LGk9e2ZvbnQ6bnVsbCxjbG9uZSgpe3JldHVybiB0aGlzfX0se2ZvbnROYW1lOm8sZm9udFNpemU6Y309cjtyZXR1cm4gYXdhaXQgZS5oYW5kbGVTZXRGb250KG4sW28mJnMuTmFtZS5nZXQobyksY10sbnVsbCxhLHQsaSxudWxsKSxpLmZvbnR9X2dldFRleHRXaWR0aChlLHQpe3JldHVybiB0LmNoYXJzVG9HbHlwaHMoZSkucmVkdWNlKCgoZSx0KT0+ZSt0LndpZHRoKSwwKS8xZTN9X2NvbXB1dGVGb250U2l6ZShlLHQscixhLHMpe2xldHtmb250U2l6ZTpvfT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLGM9KG98fDEyKSpuLkxJTkVfRkFDVE9SLGw9TWF0aC5yb3VuZChlL2MpO2lmKCFvKXtjb25zdCBoPWU9Pk1hdGguZmxvb3IoMTAwKmUpLzEwMDtpZigtMT09PXMpe2NvbnN0IGk9dGhpcy5fZ2V0VGV4dFdpZHRoKHIsYSk7bz1oKE1hdGgubWluKGUvbi5MSU5FX0ZBQ1RPUixpPnQ/dC9pOjEvMCkpLGw9MX1lbHNle2NvbnN0IGk9ci5zcGxpdCgvXHJcbj98XG4vKSx1PVtdO2Zvcihjb25zdCBlIG9mIGkpe2NvbnN0IHQ9YS5lbmNvZGVTdHJpbmcoZSkuam9pbigiIikscj1hLmNoYXJzVG9HbHlwaHModCksbj1hLmdldENoYXJQb3NpdGlvbnModCk7dS5wdXNoKHtsaW5lOnQsZ2x5cGhzOnIscG9zaXRpb25zOm59KX1jb25zdCBkPXI9PntsZXQgbj0wO2Zvcihjb25zdCBpIG9mIHUpaWYobis9dGhpcy5fc3BsaXRMaW5lKG51bGwsYSxyLHQsaSkubGVuZ3RoKnIsbj5lKXJldHVybiEwO3JldHVybiExfTtmb3IobD1NYXRoLm1heChsLHMpO2M9ZS9sLG89aChjL24uTElORV9GQUNUT1IpLGQobyk7KWwrK31jb25zdHtmb250TmFtZTp1LGZvbnRDb2xvcjpkfT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO3RoaXMuX2RlZmF1bHRBcHBlYXJhbmNlPSgwLGkuY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2UpKHtmb250U2l6ZTpvLGZvbnROYW1lOnUsZm9udENvbG9yOmR9KX1yZXR1cm5bdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UsbyxlL2xdfV9yZW5kZXJUZXh0KGUsdCxyLG4saSxzLG8sYyl7bGV0IGw7bD0xPT09aT8obi10aGlzLl9nZXRUZXh0V2lkdGgoZSx0KSpyKS8yOjI9PT1pP24tdGhpcy5fZ2V0VGV4dFdpZHRoKGUsdCkqci1vOm87Y29uc3QgaD0oMCxhLm51bWJlclRvU3RyaW5nKShsLXMuc2hpZnQpO3JldHVybiBzLnNoaWZ0PWwsIiIuY29uY2F0KGgsIiAiKS5jb25jYXQoYz0oMCxhLm51bWJlclRvU3RyaW5nKShjKSwiIFRkICgiKS5jb25jYXQoKDAsYS5lc2NhcGVTdHJpbmcpKGUpLCIpIFRqIil9X2dldFNhdmVGaWVsZFJlc291cmNlcyhlKXt2YXIgdDtjb25zdHtsb2NhbFJlc291cmNlczpyLGFwcGVhcmFuY2VSZXNvdXJjZXM6bixhY3JvRm9ybVJlc291cmNlczphfT10aGlzLl9maWVsZFJlc291cmNlcyxpPW51bGw9PT0odD10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhKXx8dm9pZCAwPT09dD92b2lkIDA6dC5mb250TmFtZTtpZighaSlyZXR1cm4gcnx8cy5EaWN0LmVtcHR5O2Zvcihjb25zdCBlIG9mW3Isbl0paWYoZSBpbnN0YW5jZW9mIHMuRGljdCl7Y29uc3QgdD1lLmdldCgiRm9udCIpO2lmKHQgaW5zdGFuY2VvZiBzLkRpY3QmJnQuaGFzKGkpKXJldHVybiBlfWlmKGEgaW5zdGFuY2VvZiBzLkRpY3Qpe2NvbnN0IHQ9YS5nZXQoIkZvbnQiKTtpZih0IGluc3RhbmNlb2Ygcy5EaWN0JiZ0LmhhcyhpKSl7Y29uc3Qgbj1uZXcgcy5EaWN0KGUpO24uc2V0KGksdC5nZXRSYXcoaSkpO2NvbnN0IGE9bmV3IHMuRGljdChlKTtyZXR1cm4gYS5zZXQoIkZvbnQiLG4pLHMuRGljdC5tZXJnZSh7eHJlZjplLGRpY3RBcnJheTpbYSxyXSxtZXJnZVN1YkRpY3RzOiEwfSl9fXJldHVybiByfHxzLkRpY3QuZW1wdHl9Z2V0RmllbGRPYmplY3QoKXtyZXR1cm4gbnVsbH19Y2xhc3MgTyBleHRlbmRzIEN7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEucmVhZE9ubHkmJiF0aGlzLmRhdGEubm9IVE1MLHRoaXMuX2hhc1RleHQ9ITA7Y29uc3QgdD1lLmRpY3Q7InN0cmluZyIhPXR5cGVvZiB0aGlzLmRhdGEuZmllbGRWYWx1ZSYmKHRoaXMuZGF0YS5maWVsZFZhbHVlPSIiKTtsZXQgcj0oMCxhLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHtkaWN0OnQsa2V5OiJRIn0pOyghTnVtYmVyLmlzSW50ZWdlcihyKXx8cjwwfHxyPjIpJiYocj1udWxsKSx0aGlzLmRhdGEudGV4dEFsaWdubWVudD1yO2xldCBpPSgwLGEuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoe2RpY3Q6dCxrZXk6Ik1heExlbiJ9KTsoIU51bWJlci5pc0ludGVnZXIoaSl8fGk8MCkmJihpPTApLHRoaXMuZGF0YS5tYXhMZW49aSx0aGlzLmRhdGEubXVsdGlMaW5lPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpLHRoaXMuZGF0YS5jb21iPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSYmIXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpJiYhdGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKSYmIXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSYmMCE9PXRoaXMuZGF0YS5tYXhMZW4sdGhpcy5kYXRhLmRvTm90U2Nyb2xsPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5ET05PVFNDUk9MTCl9Z2V0IGhhc1RleHRDb250ZW50KCl7cmV0dXJuISF0aGlzLmFwcGVhcmFuY2UmJiF0aGlzLl9uZWVkQXBwZWFyYW5jZXN9X2dldENvbWJBcHBlYXJhbmNlKGUsdCxyLG4saSxzLG8sYyxsLGgsdSl7Y29uc3QgZD1pL3RoaXMuZGF0YS5tYXhMZW4sZj10aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyh1KSxnPVtdLHA9dC5nZXRDaGFyUG9zaXRpb25zKHIpO2Zvcihjb25zdFtlLHRdb2YgcClnLnB1c2goIigiLmNvbmNhdCgoMCxhLmVzY2FwZVN0cmluZykoci5zdWJzdHJpbmcoZSx0KSksIikgVGoiKSk7Y29uc3QgbT1nLmpvaW4oIiAiLmNvbmNhdCgoMCxhLm51bWJlclRvU3RyaW5nKShkKSwiIDAgVGQgIikpO3JldHVybiIvVHggQk1DIHEgIi5jb25jYXQoZiwiQlQgIikrZSsiIDEgMCAwIDEgIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykobyksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoYytsKSwiIFRtICIpLmNvbmNhdChtLCIgRVQgUSBFTUMiKX1fZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZShlLHQscixuLGkscyxvLGMsbCxoLHUsZCl7Y29uc3QgZj1bXSxnPWktMipjLHA9e3NoaWZ0OjB9O2ZvcihsZXQgZT0wLGE9dC5sZW5ndGg7ZTxhO2UrKyl7Y29uc3QgYT10W2VdLHM9dGhpcy5fc3BsaXRMaW5lKGEscixuLGcpO2ZvcihsZXQgdD0wLGE9cy5sZW5ndGg7dDxhO3QrKyl7Y29uc3QgYT1zW3RdLGQ9MD09PWUmJjA9PT10Py1sLSh1LWgpOi11O2YucHVzaCh0aGlzLl9yZW5kZXJUZXh0KGEscixuLGksbyxwLGMsZCkpfX1jb25zdCBtPXRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGQpLGI9Zi5qb2luKCJcbiIpO3JldHVybiIvVHggQk1DIHEgIi5jb25jYXQobSwiQlQgIikrZSsiIDEgMCAwIDEgMCAiLmNvbmNhdCgoMCxhLm51bWJlclRvU3RyaW5nKShzKSwiIFRtICIpLmNvbmNhdChiLCIgRVQgUSBFTUMiKX1fc3BsaXRMaW5lKGUsdCxyLG4pe2xldCBhPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7fTtlPWEubGluZXx8ZTtjb25zdCBpPWEuZ2x5cGhzfHx0LmNoYXJzVG9HbHlwaHMoZSk7aWYoaS5sZW5ndGg8PTEpcmV0dXJuW2VdO2NvbnN0IHM9YS5wb3NpdGlvbnN8fHQuZ2V0Q2hhclBvc2l0aW9ucyhlKSxvPXIvMWUzLGM9W107bGV0IGw9LTEsaD0tMSx1PS0xLGQ9MCxmPTA7Zm9yKGxldCB0PTAscj1pLmxlbmd0aDt0PHI7dCsrKXtjb25zdFtyLGFdPXNbdF0sZz1pW3RdLHA9Zy53aWR0aCpvOyIgIj09PWcudW5pY29kZT9mK3A+bj8oYy5wdXNoKGUuc3Vic3RyaW5nKGQscikpLGQ9cixmPXAsbD0tMSx1PS0xKTooZis9cCxsPXIsaD1hLHU9dCk6ZitwPm4/LTEhPT1sPyhjLnB1c2goZS5zdWJzdHJpbmcoZCxoKSksZD1oLHQ9dSsxLGw9LTEsZj0wKTooYy5wdXNoKGUuc3Vic3RyaW5nKGQscikpLGQ9cixmPXApOmYrPXB9cmV0dXJuIGQ8ZS5sZW5ndGgmJmMucHVzaChlLnN1YnN0cmluZyhkLGUubGVuZ3RoKSksY31nZXRGaWVsZE9iamVjdCgpe3JldHVybntpZDp0aGlzLmRhdGEuaWQsdmFsdWU6dGhpcy5kYXRhLmZpZWxkVmFsdWUsZGVmYXVsdFZhbHVlOnRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZXx8IiIsbXVsdGlsaW5lOnRoaXMuZGF0YS5tdWx0aUxpbmUscGFzc3dvcmQ6dGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKSxjaGFyTGltaXQ6dGhpcy5kYXRhLm1heExlbixjb21iOnRoaXMuZGF0YS5jb21iLGVkaXRhYmxlOiF0aGlzLmRhdGEucmVhZE9ubHksaGlkZGVuOnRoaXMuZGF0YS5oaWRkZW4sbmFtZTp0aGlzLmRhdGEuZmllbGROYW1lLHJlY3Q6dGhpcy5kYXRhLnJlY3QsYWN0aW9uczp0aGlzLmRhdGEuYWN0aW9ucyxwYWdlOnRoaXMuZGF0YS5wYWdlSW5kZXgsc3Ryb2tlQ29sb3I6dGhpcy5kYXRhLmJvcmRlckNvbG9yLGZpbGxDb2xvcjp0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLHJvdGF0aW9uOnRoaXMucm90YXRpb24sdHlwZToidGV4dCJ9fX1jbGFzcyBGIGV4dGVuZHMgQ3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmNoZWNrZWRBcHBlYXJhbmNlPW51bGwsdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlPW51bGwsdGhpcy5kYXRhLmNoZWNrQm94PSF0aGlzLmhhc0ZpZWxkRmxhZyhuLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pJiYhdGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pLHRoaXMuZGF0YS5yYWRpb0J1dHRvbj10aGlzLmhhc0ZpZWxkRmxhZyhuLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pJiYhdGhpcy5oYXNGaWVsZEZsYWcobi5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pLHRoaXMuZGF0YS5wdXNoQnV0dG9uPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5QVVNIQlVUVE9OKSx0aGlzLmRhdGEuaXNUb29sdGlwT25seT0hMSx0aGlzLmRhdGEuY2hlY2tCb3g/dGhpcy5fcHJvY2Vzc0NoZWNrQm94KGUpOnRoaXMuZGF0YS5yYWRpb0J1dHRvbj90aGlzLl9wcm9jZXNzUmFkaW9CdXR0b24oZSk6dGhpcy5kYXRhLnB1c2hCdXR0b24/KHRoaXMuZGF0YS5oYXNPd25DYW52YXM9ITAsdGhpcy5fcHJvY2Vzc1B1c2hCdXR0b24oZSkpOigwLG4ud2FybikoIkludmFsaWQgZmllbGQgZmxhZ3MgZm9yIGJ1dHRvbiB3aWRnZXQgYW5ub3RhdGlvbiIpfWFzeW5jIGdldE9wZXJhdG9yTGlzdChlLHQscixhLGkpe2lmKHRoaXMuZGF0YS5wdXNoQnV0dG9uKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsITEsaSk7bGV0IHM9bnVsbCxvPW51bGw7aWYoaSl7Y29uc3QgZT1pLmdldCh0aGlzLmRhdGEuaWQpO3M9ZT9lLnZhbHVlOm51bGwsbz1lP2Uucm90YXRpb246bnVsbH1pZihudWxsPT09cyYmdGhpcy5hcHBlYXJhbmNlKXJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsYSxpKTtudWxsPT1zJiYocz10aGlzLmRhdGEuY2hlY2tCb3g/dGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuZXhwb3J0VmFsdWU6dGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuYnV0dG9uVmFsdWUpO2NvbnN0IGM9cz90aGlzLmNoZWNrZWRBcHBlYXJhbmNlOnRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTtpZihjKXtjb25zdCBzPXRoaXMuYXBwZWFyYW5jZSxsPWMuZGljdC5nZXRBcnJheSgiTWF0cml4Iil8fG4uSURFTlRJVFlfTUFUUklYO28mJmMuZGljdC5zZXQoIk1hdHJpeCIsdGhpcy5nZXRSb3RhdGlvbk1hdHJpeChpKSksdGhpcy5hcHBlYXJhbmNlPWM7Y29uc3QgaD1zdXBlci5nZXRPcGVyYXRvckxpc3QoZSx0LHIsYSxpKTtyZXR1cm4gdGhpcy5hcHBlYXJhbmNlPXMsYy5kaWN0LnNldCgiTWF0cml4IixsKSxofXJldHVybntvcExpc3Q6bmV3IG0uT3BlcmF0b3JMaXN0LHNlcGFyYXRlRm9ybTohMSxzZXBhcmF0ZUNhbnZhczohMX19YXN5bmMgc2F2ZShlLHQscil7cmV0dXJuIHRoaXMuZGF0YS5jaGVja0JveD90aGlzLl9zYXZlQ2hlY2tib3goZSx0LHIpOnRoaXMuZGF0YS5yYWRpb0J1dHRvbj90aGlzLl9zYXZlUmFkaW9CdXR0b24oZSx0LHIpOm51bGx9YXN5bmMgX3NhdmVDaGVja2JveChlLHQscil7aWYoIXIpcmV0dXJuIG51bGw7Y29uc3QgYT1yLmdldCh0aGlzLmRhdGEuaWQpO2xldCBpPW51bGw9PWE/dm9pZCAwOmEucm90YXRpb24sbz1udWxsPT1hP3ZvaWQgMDphLnZhbHVlO2lmKHZvaWQgMD09PWkpe2lmKHZvaWQgMD09PW8pcmV0dXJuIG51bGw7aWYodGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuZXhwb3J0VmFsdWU9PT1vKXJldHVybiBudWxsfWNvbnN0IGw9ZS54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpO2lmKCEobCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuIG51bGw7dm9pZCAwPT09aSYmKGk9dGhpcy5yb3RhdGlvbiksdm9pZCAwPT09byYmKG89dGhpcy5kYXRhLmZpZWxkVmFsdWU9PT10aGlzLmRhdGEuZXhwb3J0VmFsdWUpO2NvbnN0IGg9e3BhdGg6dGhpcy5kYXRhLmZpZWxkTmFtZSx2YWx1ZTpvP3RoaXMuZGF0YS5leHBvcnRWYWx1ZToiIn0sdT1zLk5hbWUuZ2V0KG8/dGhpcy5kYXRhLmV4cG9ydFZhbHVlOiJPZmYiKTtsLnNldCgiViIsdSksbC5zZXQoIkFTIix1KSxsLnNldCgiTSIsIkQ6Ii5jb25jYXQoKDAsbi5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSk7Y29uc3QgZD10aGlzLl9nZXRNS0RpY3QoaSk7ZCYmbC5zZXQoIk1LIixkKTtjb25zdCBmPWUueHJlZi5lbmNyeXB0O2xldCBnPW51bGw7ZiYmKGc9Zi5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbikpO2NvbnN0IHA9WyIiLmNvbmNhdCh0aGlzLnJlZi5udW0sIiAiKS5jb25jYXQodGhpcy5yZWYuZ2VuLCIgb2JqXG4iKV07cmV0dXJuIGF3YWl0KDAsYy53cml0ZURpY3QpKGwscCxnKSxwLnB1c2goIlxuZW5kb2JqXG4iKSxbe3JlZjp0aGlzLnJlZixkYXRhOnAuam9pbigiIikseGZhOmh9XX1hc3luYyBfc2F2ZVJhZGlvQnV0dG9uKGUsdCxyKXtpZighcilyZXR1cm4gbnVsbDtjb25zdCBhPXIuZ2V0KHRoaXMuZGF0YS5pZCk7bGV0IGk9bnVsbD09YT92b2lkIDA6YS5yb3RhdGlvbixvPW51bGw9PWE/dm9pZCAwOmEudmFsdWU7aWYodm9pZCAwPT09aSl7aWYodm9pZCAwPT09bylyZXR1cm4gbnVsbDtpZih0aGlzLmRhdGEuZmllbGRWYWx1ZT09PXRoaXMuZGF0YS5idXR0b25WYWx1ZT09PW8pcmV0dXJuIG51bGx9Y29uc3QgbD1lLnhyZWYuZmV0Y2hJZlJlZih0aGlzLnJlZik7aWYoIShsIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm4gbnVsbDt2b2lkIDA9PT1vJiYobz10aGlzLmRhdGEuZmllbGRWYWx1ZT09PXRoaXMuZGF0YS5idXR0b25WYWx1ZSksdm9pZCAwPT09aSYmKGk9dGhpcy5yb3RhdGlvbik7Y29uc3QgaD17cGF0aDp0aGlzLmRhdGEuZmllbGROYW1lLHZhbHVlOm8/dGhpcy5kYXRhLmJ1dHRvblZhbHVlOiIifSx1PXMuTmFtZS5nZXQobz90aGlzLmRhdGEuYnV0dG9uVmFsdWU6Ik9mZiIpO2xldCBkPW51bGw7Y29uc3QgZj1lLnhyZWYuZW5jcnlwdDtpZihvKWlmKHRoaXMucGFyZW50IGluc3RhbmNlb2Ygcy5SZWYpe2NvbnN0IHQ9ZS54cmVmLmZldGNoKHRoaXMucGFyZW50KTtsZXQgcj1udWxsO2YmJihyPWYuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucGFyZW50Lm51bSx0aGlzLnBhcmVudC5nZW4pKSx0LnNldCgiViIsdSksZD1bIiIuY29uY2F0KHRoaXMucGFyZW50Lm51bSwiICIpLmNvbmNhdCh0aGlzLnBhcmVudC5nZW4sIiBvYmpcbiIpXSxhd2FpdCgwLGMud3JpdGVEaWN0KSh0LGQsciksZC5wdXNoKCJcbmVuZG9ialxuIil9ZWxzZSB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIHMuRGljdCYmdGhpcy5wYXJlbnQuc2V0KCJWIix1KTtsLnNldCgiQVMiLHUpLGwuc2V0KCJNIiwiRDoiLmNvbmNhdCgoMCxuLmdldE1vZGlmaWNhdGlvbkRhdGUpKCkpKTtjb25zdCBnPXRoaXMuX2dldE1LRGljdChpKTtnJiZsLnNldCgiTUsiLGcpO2xldCBwPW51bGw7ZiYmKHA9Zi5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLHRoaXMucmVmLmdlbikpO2NvbnN0IG09WyIiLmNvbmNhdCh0aGlzLnJlZi5udW0sIiAiKS5jb25jYXQodGhpcy5yZWYuZ2VuLCIgb2JqXG4iKV07YXdhaXQoMCxjLndyaXRlRGljdCkobCxtLHApLG0ucHVzaCgiXG5lbmRvYmpcbiIpO2NvbnN0IGI9W3tyZWY6dGhpcy5yZWYsZGF0YTptLmpvaW4oIiIpLHhmYTpofV07cmV0dXJuIG51bGwhPT1kJiZiLnB1c2goe3JlZjp0aGlzLnBhcmVudCxkYXRhOmQuam9pbigiIikseGZhOm51bGx9KSxifV9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UoZSx0KXtjb25zdCByPXRoaXMuZGF0YS5yZWN0WzJdLXRoaXMuZGF0YS5yZWN0WzBdLGk9dGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV0sYz1bMCwwLHIsaV0sbD0uOCpNYXRoLm1pbihyLGkpO2xldCBoLHU7ImNoZWNrIj09PXQ/KGg9e3dpZHRoOi43NTUqbCxoZWlnaHQ6LjcwNSpsfSx1PSIzIik6ImRpc2MiPT09dD8oaD17d2lkdGg6Ljc5MSpsLGhlaWdodDouNzA1Kmx9LHU9ImwiKTooMCxuLnVucmVhY2hhYmxlKSgiX2dldERlZmF1bHRDaGVja2VkQXBwZWFyYW5jZSAtIHVuc3VwcG9ydGVkIHR5cGU6ICIuY29uY2F0KHQpKTtjb25zdCBkPSJxIEJUIC9QZGZKc1phRGIgIi5jb25jYXQobCwiIFRmIDAgZyAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoKHItaC53aWR0aCkvMiksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoKGktaC5oZWlnaHQpLzIpLCIgVGQgKCIpLmNvbmNhdCh1LCIpIFRqIEVUIFEiKSxmPW5ldyBzLkRpY3QoZS54cmVmKTtmLnNldCgiRm9ybVR5cGUiLDEpLGYuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpLGYuc2V0KCJUeXBlIixzLk5hbWUuZ2V0KCJYT2JqZWN0IikpLGYuc2V0KCJCQm94IixjKSxmLnNldCgiTWF0cml4IixbMSwwLDAsMSwwLDBdKSxmLnNldCgiTGVuZ3RoIixkLmxlbmd0aCk7Y29uc3QgZz1uZXcgcy5EaWN0KGUueHJlZikscD1uZXcgcy5EaWN0KGUueHJlZik7cC5zZXQoIlBkZkpzWmFEYiIsdGhpcy5mYWxsYmFja0ZvbnREaWN0KSxnLnNldCgiRm9udCIscCksZi5zZXQoIlJlc291cmNlcyIsZyksdGhpcy5jaGVja2VkQXBwZWFyYW5jZT1uZXcgby5TdHJpbmdTdHJlYW0oZCksdGhpcy5jaGVja2VkQXBwZWFyYW5jZS5kaWN0PWYsdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpfV9wcm9jZXNzQ2hlY2tCb3goZSl7Y29uc3QgdD1lLmRpY3QuZ2V0KCJBUCIpO2lmKCEodCBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuO2NvbnN0IHI9dC5nZXQoIk4iKTtpZighKHIgaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybjtjb25zdCBuPXRoaXMuX2RlY29kZUZvcm1WYWx1ZShlLmRpY3QuZ2V0KCJBUyIpKTsic3RyaW5nIj09dHlwZW9mIG4mJih0aGlzLmRhdGEuZmllbGRWYWx1ZT1uKTtjb25zdCBhPW51bGwhPT10aGlzLmRhdGEuZmllbGRWYWx1ZSYmIk9mZiIhPT10aGlzLmRhdGEuZmllbGRWYWx1ZT90aGlzLmRhdGEuZmllbGRWYWx1ZToiWWVzIixpPXIuZ2V0S2V5cygpO2lmKDA9PT1pLmxlbmd0aClpLnB1c2goIk9mZiIsYSk7ZWxzZSBpZigxPT09aS5sZW5ndGgpIk9mZiI9PT1pWzBdP2kucHVzaChhKTppLnVuc2hpZnQoIk9mZiIpO2Vsc2UgaWYoaS5pbmNsdWRlcyhhKSlpLmxlbmd0aD0wLGkucHVzaCgiT2ZmIixhKTtlbHNle2NvbnN0IGU9aS5maW5kKChlPT4iT2ZmIiE9PWUpKTtpLmxlbmd0aD0wLGkucHVzaCgiT2ZmIixlKX1pLmluY2x1ZGVzKHRoaXMuZGF0YS5maWVsZFZhbHVlKXx8KHRoaXMuZGF0YS5maWVsZFZhbHVlPSJPZmYiKSx0aGlzLmRhdGEuZXhwb3J0VmFsdWU9aVsxXTtjb25zdCBvPXIuZ2V0KHRoaXMuZGF0YS5leHBvcnRWYWx1ZSk7dGhpcy5jaGVja2VkQXBwZWFyYW5jZT1vIGluc3RhbmNlb2YgbC5CYXNlU3RyZWFtP286bnVsbDtjb25zdCBjPXIuZ2V0KCJPZmYiKTt0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2U9YyBpbnN0YW5jZW9mIGwuQmFzZVN0cmVhbT9jOm51bGwsdGhpcy5jaGVja2VkQXBwZWFyYW5jZT90aGlzLl9zdHJlYW1zLnB1c2godGhpcy5jaGVja2VkQXBwZWFyYW5jZSk6dGhpcy5fZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKGUsImNoZWNrIiksdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlJiZ0aGlzLl9zdHJlYW1zLnB1c2godGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKSx0aGlzLl9mYWxsYmFja0ZvbnREaWN0PXRoaXMuZmFsbGJhY2tGb250RGljdH1fcHJvY2Vzc1JhZGlvQnV0dG9uKGUpe3RoaXMuZGF0YS5maWVsZFZhbHVlPXRoaXMuZGF0YS5idXR0b25WYWx1ZT1udWxsO2NvbnN0IHQ9ZS5kaWN0LmdldCgiUGFyZW50Iik7aWYodCBpbnN0YW5jZW9mIHMuRGljdCl7dGhpcy5wYXJlbnQ9ZS5kaWN0LmdldFJhdygiUGFyZW50Iik7Y29uc3Qgcj10LmdldCgiViIpO3IgaW5zdGFuY2VvZiBzLk5hbWUmJih0aGlzLmRhdGEuZmllbGRWYWx1ZT10aGlzLl9kZWNvZGVGb3JtVmFsdWUocikpfWNvbnN0IHI9ZS5kaWN0LmdldCgiQVAiKTtpZighKHIgaW5zdGFuY2VvZiBzLkRpY3QpKXJldHVybjtjb25zdCBuPXIuZ2V0KCJOIik7aWYoIShuIGluc3RhbmNlb2Ygcy5EaWN0KSlyZXR1cm47Zm9yKGNvbnN0IGUgb2Ygbi5nZXRLZXlzKCkpaWYoIk9mZiIhPT1lKXt0aGlzLmRhdGEuYnV0dG9uVmFsdWU9dGhpcy5fZGVjb2RlRm9ybVZhbHVlKGUpO2JyZWFrfWNvbnN0IGE9bi5nZXQodGhpcy5kYXRhLmJ1dHRvblZhbHVlKTt0aGlzLmNoZWNrZWRBcHBlYXJhbmNlPWEgaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0/YTpudWxsO2NvbnN0IGk9bi5nZXQoIk9mZiIpO3RoaXMudW5jaGVja2VkQXBwZWFyYW5jZT1pIGluc3RhbmNlb2YgbC5CYXNlU3RyZWFtP2k6bnVsbCx0aGlzLmNoZWNrZWRBcHBlYXJhbmNlP3RoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKTp0aGlzLl9nZXREZWZhdWx0Q2hlY2tlZEFwcGVhcmFuY2UoZSwiZGlzYyIpLHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSYmdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSksdGhpcy5fZmFsbGJhY2tGb250RGljdD10aGlzLmZhbGxiYWNrRm9udERpY3R9X3Byb2Nlc3NQdXNoQnV0dG9uKGUpe2UuZGljdC5oYXMoIkEiKXx8ZS5kaWN0LmhhcygiQUEiKXx8dGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dD8odGhpcy5kYXRhLmlzVG9vbHRpcE9ubHk9IWUuZGljdC5oYXMoIkEiKSYmIWUuZGljdC5oYXMoIkFBIiksdS5DYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoe2Rlc3REaWN0OmUuZGljdCxyZXN1bHRPYmo6dGhpcy5kYXRhLGRvY0Jhc2VVcmw6ZS5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmwsZG9jQXR0YWNobWVudHM6ZS5hdHRhY2htZW50c30pKTooMCxuLndhcm4pKCJQdXNoIGJ1dHRvbnMgd2l0aG91dCBhY3Rpb24gZGljdGlvbmFyaWVzIGFyZSBub3Qgc3VwcG9ydGVkIil9Z2V0RmllbGRPYmplY3QoKXtsZXQgZSx0PSJidXR0b24iO3JldHVybiB0aGlzLmRhdGEuY2hlY2tCb3g/KHQ9ImNoZWNrYm94IixlPXRoaXMuZGF0YS5leHBvcnRWYWx1ZSk6dGhpcy5kYXRhLnJhZGlvQnV0dG9uJiYodD0icmFkaW9idXR0b24iLGU9dGhpcy5kYXRhLmJ1dHRvblZhbHVlKSx7aWQ6dGhpcy5kYXRhLmlkLHZhbHVlOnRoaXMuZGF0YS5maWVsZFZhbHVlfHwiT2ZmIixkZWZhdWx0VmFsdWU6dGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlLGV4cG9ydFZhbHVlczplLGVkaXRhYmxlOiF0aGlzLmRhdGEucmVhZE9ubHksbmFtZTp0aGlzLmRhdGEuZmllbGROYW1lLHJlY3Q6dGhpcy5kYXRhLnJlY3QsaGlkZGVuOnRoaXMuZGF0YS5oaWRkZW4sYWN0aW9uczp0aGlzLmRhdGEuYWN0aW9ucyxwYWdlOnRoaXMuZGF0YS5wYWdlSW5kZXgsc3Ryb2tlQ29sb3I6dGhpcy5kYXRhLmJvcmRlckNvbG9yLGZpbGxDb2xvcjp0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLHJvdGF0aW9uOnRoaXMucm90YXRpb24sdHlwZTp0fX1nZXQgZmFsbGJhY2tGb250RGljdCgpe2NvbnN0IGU9bmV3IHMuRGljdDtyZXR1cm4gZS5zZXQoIkJhc2VGb250IixzLk5hbWUuZ2V0KCJaYXBmRGluZ2JhdHMiKSksZS5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKSxlLnNldCgiU3VidHlwZSIscy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpLGUuc2V0KCJFbmNvZGluZyIscy5OYW1lLmdldCgiWmFwZkRpbmdiYXRzRW5jb2RpbmciKSksKDAsbi5zaGFkb3cpKHRoaXMsImZhbGxiYWNrRm9udERpY3QiLGUpfX1jbGFzcyBJIGV4dGVuZHMgQ3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO3RoaXMuaW5kaWNlcz10LmdldEFycmF5KCJJIiksdGhpcy5oYXNJbmRpY2VzPUFycmF5LmlzQXJyYXkodGhpcy5pbmRpY2VzKSYmdGhpcy5pbmRpY2VzLmxlbmd0aD4wLHRoaXMuZGF0YS5vcHRpb25zPVtdO2NvbnN0IGk9KDAsYS5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7ZGljdDp0LGtleToiT3B0In0pO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBlPTAsdD1pLmxlbmd0aDtlPHQ7ZSsrKXtjb25zdCB0PXIuZmV0Y2hJZlJlZihpW2VdKSxuPUFycmF5LmlzQXJyYXkodCk7dGhpcy5kYXRhLm9wdGlvbnNbZV09e2V4cG9ydFZhbHVlOnRoaXMuX2RlY29kZUZvcm1WYWx1ZShuP3IuZmV0Y2hJZlJlZih0WzBdKTp0KSxkaXNwbGF5VmFsdWU6dGhpcy5fZGVjb2RlRm9ybVZhbHVlKG4/ci5mZXRjaElmUmVmKHRbMV0pOnQpfX1pZih0aGlzLmhhc0luZGljZXMpe3RoaXMuZGF0YS5maWVsZFZhbHVlPVtdO2NvbnN0IGU9dGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoO2Zvcihjb25zdCB0IG9mIHRoaXMuaW5kaWNlcylOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wJiZ0PGUmJnRoaXMuZGF0YS5maWVsZFZhbHVlLnB1c2godGhpcy5kYXRhLm9wdGlvbnNbdF0uZXhwb3J0VmFsdWUpfWVsc2Uic3RyaW5nIj09dHlwZW9mIHRoaXMuZGF0YS5maWVsZFZhbHVlP3RoaXMuZGF0YS5maWVsZFZhbHVlPVt0aGlzLmRhdGEuZmllbGRWYWx1ZV06dGhpcy5kYXRhLmZpZWxkVmFsdWV8fCh0aGlzLmRhdGEuZmllbGRWYWx1ZT1bXSk7dGhpcy5kYXRhLmNvbWJvPXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CTyksdGhpcy5kYXRhLm11bHRpU2VsZWN0PXRoaXMuaGFzRmllbGRGbGFnKG4uQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSVNFTEVDVCksdGhpcy5faGFzVGV4dD0hMH1nZXRGaWVsZE9iamVjdCgpe2NvbnN0IGU9dGhpcy5kYXRhLmNvbWJvPyJjb21ib2JveCI6Imxpc3Rib3giLHQ9dGhpcy5kYXRhLmZpZWxkVmFsdWUubGVuZ3RoPjA/dGhpcy5kYXRhLmZpZWxkVmFsdWVbMF06bnVsbDtyZXR1cm57aWQ6dGhpcy5kYXRhLmlkLHZhbHVlOnQsZGVmYXVsdFZhbHVlOnRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSxlZGl0YWJsZTohdGhpcy5kYXRhLnJlYWRPbmx5LG5hbWU6dGhpcy5kYXRhLmZpZWxkTmFtZSxyZWN0OnRoaXMuZGF0YS5yZWN0LG51bUl0ZW1zOnRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCxtdWx0aXBsZVNlbGVjdGlvbjp0aGlzLmRhdGEubXVsdGlTZWxlY3QsaGlkZGVuOnRoaXMuZGF0YS5oaWRkZW4sYWN0aW9uczp0aGlzLmRhdGEuYWN0aW9ucyxpdGVtczp0aGlzLmRhdGEub3B0aW9ucyxwYWdlOnRoaXMuZGF0YS5wYWdlSW5kZXgsc3Ryb2tlQ29sb3I6dGhpcy5kYXRhLmJvcmRlckNvbG9yLGZpbGxDb2xvcjp0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLHJvdGF0aW9uOnRoaXMucm90YXRpb24sdHlwZTplfX1hbWVuZFNhdmVkRGljdChlLHQpe3ZhciByO2lmKCF0aGlzLmhhc0luZGljZXMpcmV0dXJuO2xldCBuPW51bGw9PWV8fG51bGw9PT0ocj1lLmdldCh0aGlzLmRhdGEuaWQpKXx8dm9pZCAwPT09cj92b2lkIDA6ci52YWx1ZTtBcnJheS5pc0FycmF5KG4pfHwobj1bbl0pO2NvbnN0IGE9W10se29wdGlvbnM6aX09dGhpcy5kYXRhO2ZvcihsZXQgZT0wLHQ9MCxyPWkubGVuZ3RoO2U8cjtlKyspaVtlXS5leHBvcnRWYWx1ZT09PW5bdF0mJihhLnB1c2goZSksdCs9MSk7dC5zZXQoIkkiLGEpfWFzeW5jIF9nZXRBcHBlYXJhbmNlKGUsdCxyLGEpe2lmKHRoaXMuZGF0YS5jb21ibylyZXR1cm4gc3VwZXIuX2dldEFwcGVhcmFuY2UoZSx0LHIsYSk7bGV0IHMsbztjb25zdCBjPW51bGw9PWE/dm9pZCAwOmEuZ2V0KHRoaXMuZGF0YS5pZCk7aWYoYyYmKG89Yy5yb3RhdGlvbixzPWMudmFsdWUpLHZvaWQgMD09PW8mJnZvaWQgMD09PXMmJiF0aGlzLl9uZWVkQXBwZWFyYW5jZXMpcmV0dXJuIG51bGw7dm9pZCAwPT09cz9zPXRoaXMuZGF0YS5maWVsZFZhbHVlOkFycmF5LmlzQXJyYXkocyl8fChzPVtzXSk7bGV0IGw9dGhpcy5kYXRhLnJlY3RbM10tdGhpcy5kYXRhLnJlY3RbMV0saD10aGlzLmRhdGEucmVjdFsyXS10aGlzLmRhdGEucmVjdFswXTs5MCE9PW8mJjI3MCE9PW98fChbaCxsXT1bbCxoXSk7Y29uc3QgdT10aGlzLmRhdGEub3B0aW9ucy5sZW5ndGgsZD1bXTtmb3IobGV0IGU9MDtlPHU7ZSsrKXtjb25zdHtleHBvcnRWYWx1ZTp0fT10aGlzLmRhdGEub3B0aW9uc1tlXTtzLmluY2x1ZGVzKHQpJiZkLnB1c2goZSl9dGhpcy5fZGVmYXVsdEFwcGVhcmFuY2V8fCh0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhPSgwLGkucGFyc2VEZWZhdWx0QXBwZWFyYW5jZSkodGhpcy5fZGVmYXVsdEFwcGVhcmFuY2U9Ii9IZWx2ZXRpY2EgMCBUZiAwIGciKSk7Y29uc3QgZj1hd2FpdCBDLl9nZXRGb250RGF0YShlLHQsdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSx0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMpO2xldCBnLHtmb250U2l6ZTpwfT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO2lmKHApZz10aGlzLl9kZWZhdWx0QXBwZWFyYW5jZTtlbHNle2NvbnN0IGU9KGwtMSkvdTtsZXQgdCxyPS0xO2Zvcihjb25zdHtkaXNwbGF5VmFsdWU6ZX1vZiB0aGlzLmRhdGEub3B0aW9ucyl7Y29uc3Qgbj10aGlzLl9nZXRUZXh0V2lkdGgoZSxmKTtuPnImJihyPW4sdD1lKX1bZyxwXT10aGlzLl9jb21wdXRlRm9udFNpemUoZSxoLTQsdCxmLC0xKX1jb25zdCBtPXAqbi5MSU5FX0ZBQ1RPUixiPShtLXApLzIseT1NYXRoLmZsb29yKGwvbSk7bGV0IHc9MDtpZihkLmxlbmd0aD4wKXtjb25zdCBlPU1hdGgubWluKC4uLmQpLHQ9TWF0aC5tYXgoLi4uZCk7dz1NYXRoLm1heCgwLHQteSsxKSx3PmUmJih3PWUpfWNvbnN0IHY9TWF0aC5taW4odyt5KzEsdSkseD1bIi9UeCBCTUMgcSIsIjEgMSAiLmNvbmNhdChoLCIgIikuY29uY2F0KGwsIiByZSBXIG4iKV07aWYoZC5sZW5ndGgpe3gucHVzaCgiMC42MDAwMDYgMC43NTY4NjYgMC44NTQ5MDQgcmciKTtmb3IoY29uc3QgZSBvZiBkKXc8PWUmJmU8diYmeC5wdXNoKCIxICIuY29uY2F0KGwtKGUtdysxKSptLCIgIikuY29uY2F0KGgsIiAiKS5jb25jYXQobSwiIHJlIGYiKSl9eC5wdXNoKCJCVCIsZywiMSAwIDAgMSAwICIuY29uY2F0KGwsIiBUbSIpKTtjb25zdCBTPXtzaGlmdDowfTtmb3IobGV0IGU9dztlPHY7ZSsrKXtjb25zdHtkaXNwbGF5VmFsdWU6dH09dGhpcy5kYXRhLm9wdGlvbnNbZV0scj1lPT09dz9iOjA7eC5wdXNoKHRoaXMuX3JlbmRlclRleHQodCxmLHAsaCwwLFMsMiwtbStyKSl9cmV0dXJuIHgucHVzaCgiRVQgUSBFTUMiKSx4LmpvaW4oIlxuIil9fWNsYXNzIFQgZXh0ZW5kcyBDe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuZGF0YS5maWVsZFZhbHVlPW51bGwsdGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEubm9Sb3RhdGV9Z2V0RmllbGRPYmplY3QoKXtyZXR1cm57aWQ6dGhpcy5kYXRhLmlkLHZhbHVlOm51bGwscGFnZTp0aGlzLmRhdGEucGFnZUluZGV4LHR5cGU6InNpZ25hdHVyZSJ9fX1jbGFzcyBNIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmRhdGEubm9Sb3RhdGU9ITAsdGhpcy5kYXRhLmhhc093bkNhbnZhcz10aGlzLmRhdGEubm9Sb3RhdGU7Y29uc3R7ZGljdDp0fT1lO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLlRFWFQsdGhpcy5kYXRhLmhhc0FwcGVhcmFuY2U/dGhpcy5kYXRhLm5hbWU9Ik5vSWNvbiI6KHRoaXMuZGF0YS5yZWN0WzFdPXRoaXMuZGF0YS5yZWN0WzNdLTIyLHRoaXMuZGF0YS5yZWN0WzJdPXRoaXMuZGF0YS5yZWN0WzBdKzIyLHRoaXMuZGF0YS5uYW1lPXQuaGFzKCJOYW1lIik/dC5nZXQoIk5hbWUiKS5uYW1lOiJOb3RlIiksdC5oYXMoIlN0YXRlIik/KHRoaXMuZGF0YS5zdGF0ZT10LmdldCgiU3RhdGUiKXx8bnVsbCx0aGlzLmRhdGEuc3RhdGVNb2RlbD10LmdldCgiU3RhdGVNb2RlbCIpfHxudWxsKToodGhpcy5kYXRhLnN0YXRlPW51bGwsdGhpcy5kYXRhLnN0YXRlTW9kZWw9bnVsbCl9fWNsYXNzIEUgZXh0ZW5kcyBTe2NvbnN0cnVjdG9yKGUpe3ZhciB0O3N1cGVyKGUpLHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLkxJTks7Y29uc3Qgcj12KGUuZGljdCx0aGlzLnJlY3RhbmdsZSk7ciYmKHRoaXMuZGF0YS5xdWFkUG9pbnRzPXIpLCh0PXRoaXMuZGF0YSkuYm9yZGVyQ29sb3J8fCh0LmJvcmRlckNvbG9yPXRoaXMuZGF0YS5jb2xvciksdS5DYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoe2Rlc3REaWN0OmUuZGljdCxyZXN1bHRPYmo6dGhpcy5kYXRhLGRvY0Jhc2VVcmw6ZS5wZGZNYW5hZ2VyLmRvY0Jhc2VVcmwsZG9jQXR0YWNobWVudHM6ZS5hdHRhY2htZW50c30pfX1jbGFzcyBQIGV4dGVuZHMgU3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnR9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuUE9QVVAsdGhpcy5kYXRhLnJlY3RbMF0hPT10aGlzLmRhdGEucmVjdFsyXSYmdGhpcy5kYXRhLnJlY3RbMV0hPT10aGlzLmRhdGEucmVjdFszXXx8KHRoaXMuZGF0YS5yZWN0PW51bGwpO2xldCByPXQuZ2V0KCJQYXJlbnQiKTtpZighcilyZXR1cm4gdm9pZCgwLG4ud2FybikoIlBvcHVwIGFubm90YXRpb24gaGFzIGEgbWlzc2luZyBvciBpbnZhbGlkIHBhcmVudCBhbm5vdGF0aW9uLiIpO2NvbnN0IGE9ci5nZXRBcnJheSgiUmVjdCIpO3RoaXMuZGF0YS5wYXJlbnRSZWN0PUFycmF5LmlzQXJyYXkoYSkmJjQ9PT1hLmxlbmd0aD9uLlV0aWwubm9ybWFsaXplUmVjdChhKTpudWxsO2NvbnN0IGk9ci5nZXQoIlJUIik7aWYoKDAscy5pc05hbWUpKGksbi5Bbm5vdGF0aW9uUmVwbHlUeXBlLkdST1VQKSYmKHI9ci5nZXQoIklSVCIpKSxyLmhhcygiTSIpPyh0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUoci5nZXQoIk0iKSksdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGU9dGhpcy5tb2RpZmljYXRpb25EYXRlKTp0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZT1udWxsLHIuaGFzKCJDIik/KHRoaXMuc2V0Q29sb3Ioci5nZXRBcnJheSgiQyIpKSx0aGlzLmRhdGEuY29sb3I9dGhpcy5jb2xvcik6dGhpcy5kYXRhLmNvbG9yPW51bGwsIXRoaXMudmlld2FibGUpe2NvbnN0IGU9ci5nZXQoIkYiKTt0aGlzLl9pc1ZpZXdhYmxlKGUpJiZ0aGlzLnNldEZsYWdzKGUpfXRoaXMuc2V0VGl0bGUoci5nZXQoIlQiKSksdGhpcy5kYXRhLnRpdGxlT2JqPXRoaXMuX3RpdGxlLHRoaXMuc2V0Q29udGVudHMoci5nZXQoIkNvbnRlbnRzIikpLHRoaXMuZGF0YS5jb250ZW50c09iaj10aGlzLl9jb250ZW50cyxyLmhhcygiUkMiKSYmKHRoaXMuZGF0YS5yaWNoVGV4dD1iLlhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwoci5nZXQoIlJDIikpKSx0aGlzLmRhdGEub3Blbj0hIXQuZ2V0KCJPcGVuIil9fXQuUG9wdXBBbm5vdGF0aW9uPVA7Y2xhc3MgUiBleHRlbmRzIGt7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5kYXRhLmhhc093bkNhbnZhcz0hMDtjb25zdHtldmFsdWF0b3JPcHRpb25zOnQseHJlZjpyfT1lO2lmKHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLkZSRUVURVhULHRoaXMuc2V0RGVmYXVsdEFwcGVhcmFuY2UoZSksdGhpcy5hcHBlYXJhbmNlKXtjb25zdHtmb250Q29sb3I6ZSxmb250U2l6ZTpufT0oMCxpLnBhcnNlQXBwZWFyYW5jZVN0cmVhbSkodGhpcy5hcHBlYXJhbmNlLHQscik7dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250Q29sb3I9ZSx0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplPW58fDEwfWVsc2UgaWYodGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpe3ZhciBhO2NvbnN0IHQ9ZS5kaWN0LmdldCgiQ0EiKSxuPW5ldyBpLkZha2VVbmljb2RlRm9udChyLCJzYW5zLXNlcmlmIik7KGE9dGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSkuZm9udFNpemV8fChhLmZvbnRTaXplPTEwKTtjb25zdHtmb250Q29sb3I6cyxmb250U2l6ZTpvfT10aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO3RoaXMuYXBwZWFyYW5jZT1uLmNyZWF0ZUFwcGVhcmFuY2UodGhpcy5fY29udGVudHMuc3RyLHRoaXMucmVjdGFuZ2xlLHRoaXMucm90YXRpb24sbyxzLHQpLHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmFwcGVhcmFuY2UsaS5GYWtlVW5pY29kZUZvbnQudG9Vbmljb2RlU3RyZWFtKX1lbHNlKDAsbi53YXJuKSgiRnJlZVRleHRBbm5vdGF0aW9uOiBPZmZzY3JlZW5DYW52YXMgaXMgbm90IHN1cHBvcnRlZCwgYW5ub3RhdGlvbiBtYXkgbm90IHJlbmRlciBjb3JyZWN0bHkuIil9Z2V0IGhhc1RleHRDb250ZW50KCl7cmV0dXJuISF0aGlzLmFwcGVhcmFuY2V9c3RhdGljIGNyZWF0ZU5ld0RpY3QoZSx0LHIpe2xldHthcFJlZjpvLGFwOmN9PXI7Y29uc3R7Y29sb3I6bCxmb250U2l6ZTpoLHJlY3Q6dSxyb3RhdGlvbjpkLHVzZXI6Zix2YWx1ZTpnfT1lLHA9bmV3IHMuRGljdCh0KTtwLnNldCgiVHlwZSIscy5OYW1lLmdldCgiQW5ub3QiKSkscC5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIkZyZWVUZXh0IikpLHAuc2V0KCJDcmVhdGlvbkRhdGUiLCJEOiIuY29uY2F0KCgwLG4uZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKSkpLHAuc2V0KCJSZWN0Iix1KTtjb25zdCBtPSIvSGVsdiAiLmNvbmNhdChoLCIgVGYgIikuY29uY2F0KCgwLGkuZ2V0UGRmQ29sb3IpKGwsITApKTtpZihwLnNldCgiREEiLG0pLHAuc2V0KCJDb250ZW50cyIsKDAsYS5pc0FzY2lpKShnKT9nOigwLGEuc3RyaW5nVG9VVEYxNlN0cmluZykoZywhMCkpLHAuc2V0KCJGIiw0KSxwLnNldCgiQm9yZGVyIixbMCwwLDBdKSxwLnNldCgiUm90YXRlIixkKSxmJiZwLnNldCgiVCIsKDAsYS5pc0FzY2lpKShmKT9mOigwLGEuc3RyaW5nVG9VVEYxNlN0cmluZykoZiwhMCkpLG98fGMpe2NvbnN0IGU9bmV3IHMuRGljdCh0KTtwLnNldCgiQVAiLGUpLG8/ZS5zZXQoIk4iLG8pOmUuc2V0KCJOIixjKX1yZXR1cm4gcH1zdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShlLHQscil7Y29uc3R7YmFzZUZvbnRSZWY6YyxldmFsdWF0b3I6bCx0YXNrOmh9PXIse2NvbG9yOnUsZm9udFNpemU6ZCxyZWN0OmYscm90YXRpb246Zyx2YWx1ZTpwfT1lLG09bmV3IHMuRGljdCh0KSxiPW5ldyBzLkRpY3QodCk7aWYoYyliLnNldCgiSGVsdiIsYyk7ZWxzZXtjb25zdCBlPW5ldyBzLkRpY3QodCk7ZS5zZXQoIkJhc2VGb250IixzLk5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSksZS5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkZvbnQiKSksZS5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIlR5cGUxIikpLGUuc2V0KCJFbmNvZGluZyIscy5OYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpLGIuc2V0KCJIZWx2IixlKX1tLnNldCgiRm9udCIsYik7Y29uc3QgeT1hd2FpdCBDLl9nZXRGb250RGF0YShsLGgse2ZvbnROYW1lOiJIZWx2Iixmb250U2l6ZTpkfSxtKSxbdyx2LHgsU109ZjtsZXQgQT14LXcsaz1TLXY7ZyUxODAhPTAmJihbQSxrXT1bayxBXSk7Y29uc3QgTz1wLnNwbGl0KCJcbiIpLEY9ZC8xZTM7bGV0IEk9LTEvMDtjb25zdCBUPVtdO2ZvcihsZXQgZSBvZiBPKXtjb25zdCB0PXkuZW5jb2RlU3RyaW5nKGUpO2lmKHQubGVuZ3RoPjEpcmV0dXJuIG51bGw7ZT10LmpvaW4oIiIpLFQucHVzaChlKTtsZXQgcj0wO2NvbnN0IG49eS5jaGFyc1RvR2x5cGhzKGUpO2Zvcihjb25zdCBlIG9mIG4pcis9ZS53aWR0aCpGO0k9TWF0aC5tYXgoSSxyKX1sZXQgTT0xO0k+QSYmKE09QS9JKTtsZXQgRT0xO2NvbnN0IFA9bi5MSU5FX0ZBQ1RPUipkLFI9KG4uTElORV9GQUNUT1Itbi5MSU5FX0RFU0NFTlRfRkFDVE9SKSpkLE49UCpPLmxlbmd0aDtOPmsmJihFPWsvTik7Y29uc3QgRD1kKk1hdGgubWluKE0sRSk7bGV0IEIsTCxfO3N3aXRjaChnKXtjYXNlIDA6Xz1bMSwwLDAsMV0sTD1bZlswXSxmWzFdLEEsa10sQj1bZlswXSxmWzNdLVJdO2JyZWFrO2Nhc2UgOTA6Xz1bMCwxLC0xLDBdLEw9W2ZbMV0sLWZbMl0sQSxrXSxCPVtmWzFdLC1mWzBdLVJdO2JyZWFrO2Nhc2UgMTgwOl89Wy0xLDAsMCwtMV0sTD1bLWZbMl0sLWZbM10sQSxrXSxCPVstZlsyXSwtZlsxXS1SXTticmVhaztjYXNlIDI3MDpfPVswLC0xLDEsMF0sTD1bLWZbM10sZlswXSxBLGtdLEI9Wy1mWzNdLGZbMl0tUl19Y29uc3Qgaj1bInEiLCIiLmNvbmNhdChfLmpvaW4oIiAiKSwiIDAgMCBjbSIpLCIiLmNvbmNhdChMLmpvaW4oIiAiKSwiIHJlIFcgbiIpLCJCVCIsIiIuY29uY2F0KCgwLGkuZ2V0UGRmQ29sb3IpKHUsITApKSwiMCBUYyAvSGVsdiAiLmNvbmNhdCgoMCxhLm51bWJlclRvU3RyaW5nKShEKSwiIFRmIildO2oucHVzaCgiIi5jb25jYXQoQi5qb2luKCIgIiksIiBUZCAoIikuY29uY2F0KCgwLGEuZXNjYXBlU3RyaW5nKShUWzBdKSwiKSBUaiIpKTtjb25zdCBVPSgwLGEubnVtYmVyVG9TdHJpbmcpKFApO2ZvcihsZXQgZT0xLHQ9VC5sZW5ndGg7ZTx0O2UrKyl7Y29uc3QgdD1UW2VdO2oucHVzaCgiMCAtIi5jb25jYXQoVSwiIFRkICgiKS5jb25jYXQoKDAsYS5lc2NhcGVTdHJpbmcpKHQpLCIpIFRqIikpfWoucHVzaCgiRVQiLCJRIik7Y29uc3QgJD1qLmpvaW4oIlxuIiksWD1uZXcgcy5EaWN0KHQpO1guc2V0KCJGb3JtVHlwZSIsMSksWC5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIkZvcm0iKSksWC5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIlhPYmplY3QiKSksWC5zZXQoIkJCb3giLGYpLFguc2V0KCJSZXNvdXJjZXMiLG0pLFguc2V0KCJNYXRyaXgiLFsxLDAsMCwxLC1mWzBdLC1mWzFdXSk7Y29uc3QgSD1uZXcgby5TdHJpbmdTdHJlYW0oJCk7cmV0dXJuIEguZGljdD1YLEh9fWNsYXNzIE4gZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuTElORSx0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZTtjb25zdCBhPXQuZ2V0QXJyYXkoIkwiKTtpZih0aGlzLmRhdGEubGluZUNvb3JkaW5hdGVzPW4uVXRpbC5ub3JtYWxpemVSZWN0KGEpLHRoaXMuc2V0TGluZUVuZGluZ3ModC5nZXRBcnJheSgiTEUiKSksdGhpcy5kYXRhLmxpbmVFbmRpbmdzPXRoaXMubGluZUVuZGluZ3MsIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxpPXQuZ2V0KCJDQSIpLHM9eSh0LmdldEFycmF5KCJJQyIpLG51bGwpLG89cz93KHMpOm51bGwsYz1vP2k6bnVsbCxsPXRoaXMuYm9yZGVyU3R5bGUud2lkdGh8fDEsaD0yKmwsdT1bdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1swXS1oLHRoaXMuZGF0YS5saW5lQ29vcmRpbmF0ZXNbMV0taCx0aGlzLmRhdGEubGluZUNvb3JkaW5hdGVzWzJdK2gsdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1szXStoXTtuLlV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLHUpfHwodGhpcy5yZWN0YW5nbGU9dSksdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2Uoe3hyZWY6cixleHRyYToiIi5jb25jYXQobCwiIHciKSxzdHJva2VDb2xvcjplLGZpbGxDb2xvcjpvLHN0cm9rZUFscGhhOmksZmlsbEFscGhhOmMscG9pbnRzQ2FsbGJhY2s6KGUsdCk9PihlLnB1c2goIiIuY29uY2F0KGFbMF0sIiAiKS5jb25jYXQoYVsxXSwiIG0iKSwiIi5jb25jYXQoYVsyXSwiICIpLmNvbmNhdChhWzNdLCIgbCIpLCJTIiksW3RbMF0ueC1sLHRbMV0ueCtsLHRbM10ueS1sLHRbMV0ueStsXSl9KX19fWNsYXNzIEQgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7aWYodGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuU1FVQVJFLHRoaXMuZGF0YS5oYXNPd25DYW52YXM9dGhpcy5kYXRhLm5vUm90YXRlLCF0aGlzLmFwcGVhcmFuY2Upe2NvbnN0IGU9dGhpcy5jb2xvcj93KHRoaXMuY29sb3IpOlswLDAsMF0sbj10LmdldCgiQ0EiKSxhPXkodC5nZXRBcnJheSgiSUMiKSxudWxsKSxpPWE/dyhhKTpudWxsLHM9aT9uOm51bGw7aWYoMD09PXRoaXMuYm9yZGVyU3R5bGUud2lkdGgmJiFpKXJldHVybjt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjpyLGV4dHJhOiIiLmNvbmNhdCh0aGlzLmJvcmRlclN0eWxlLndpZHRoLCIgdyIpLHN0cm9rZUNvbG9yOmUsZmlsbENvbG9yOmksc3Ryb2tlQWxwaGE6bixmaWxsQWxwaGE6cyxwb2ludHNDYWxsYmFjazooZSx0KT0+e2NvbnN0IHI9dFsyXS54K3RoaXMuYm9yZGVyU3R5bGUud2lkdGgvMixuPXRbMl0ueSt0aGlzLmJvcmRlclN0eWxlLndpZHRoLzIsYT10WzNdLngtdFsyXS54LXRoaXMuYm9yZGVyU3R5bGUud2lkdGgscz10WzFdLnktdFszXS55LXRoaXMuYm9yZGVyU3R5bGUud2lkdGg7cmV0dXJuIGUucHVzaCgiIi5jb25jYXQociwiICIpLmNvbmNhdChuLCIgIikuY29uY2F0KGEsIiAiKS5jb25jYXQocywiIHJlIikpLGk/ZS5wdXNoKCJCIik6ZS5wdXNoKCJTIiksW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV19fSl9fX1jbGFzcyBCIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO2lmKHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLkNJUkNMRSwhdGhpcy5hcHBlYXJhbmNlKXtjb25zdCBlPXRoaXMuY29sb3I/dyh0aGlzLmNvbG9yKTpbMCwwLDBdLG49dC5nZXQoIkNBIiksYT15KHQuZ2V0QXJyYXkoIklDIiksbnVsbCksaT1hP3coYSk6bnVsbCxzPWk/bjpudWxsO2lmKDA9PT10aGlzLmJvcmRlclN0eWxlLndpZHRoJiYhaSlyZXR1cm47Y29uc3Qgbz00LzMqTWF0aC50YW4oTWF0aC5QSS84KTt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjpyLGV4dHJhOiIiLmNvbmNhdCh0aGlzLmJvcmRlclN0eWxlLndpZHRoLCIgdyIpLHN0cm9rZUNvbG9yOmUsZmlsbENvbG9yOmksc3Ryb2tlQWxwaGE6bixmaWxsQWxwaGE6cyxwb2ludHNDYWxsYmFjazooZSx0KT0+e2NvbnN0IHI9dFswXS54K3RoaXMuYm9yZGVyU3R5bGUud2lkdGgvMixuPXRbMF0ueS10aGlzLmJvcmRlclN0eWxlLndpZHRoLzIsYT10WzNdLngtdGhpcy5ib3JkZXJTdHlsZS53aWR0aC8yLHM9dFszXS55K3RoaXMuYm9yZGVyU3R5bGUud2lkdGgvMixjPXIrKGEtcikvMixsPW4rKHMtbikvMixoPShhLXIpLzIqbyx1PShzLW4pLzIqbztyZXR1cm4gZS5wdXNoKCIiLmNvbmNhdChjLCIgIikuY29uY2F0KHMsIiBtIiksIiIuY29uY2F0KGMraCwiICIpLmNvbmNhdChzLCIgIikuY29uY2F0KGEsIiAiKS5jb25jYXQobCt1LCIgIikuY29uY2F0KGEsIiAiKS5jb25jYXQobCwiIGMiKSwiIi5jb25jYXQoYSwiICIpLmNvbmNhdChsLXUsIiAiKS5jb25jYXQoYytoLCIgIikuY29uY2F0KG4sIiAiKS5jb25jYXQoYywiICIpLmNvbmNhdChuLCIgYyIpLCIiLmNvbmNhdChjLWgsIiAiKS5jb25jYXQobiwiICIpLmNvbmNhdChyLCIgIikuY29uY2F0KGwtdSwiICIpLmNvbmNhdChyLCIgIikuY29uY2F0KGwsIiBjIiksIiIuY29uY2F0KHIsIiAiKS5jb25jYXQobCt1LCIgIikuY29uY2F0KGMtaCwiICIpLmNvbmNhdChzLCIgIikuY29uY2F0KGMsIiAiKS5jb25jYXQocywiIGMiKSwiaCIpLGk/ZS5wdXNoKCJCIik6ZS5wdXNoKCJTIiksW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV19fSl9fX1jbGFzcyBMIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO3RoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLlBPTFlMSU5FLHRoaXMuZGF0YS5oYXNPd25DYW52YXM9dGhpcy5kYXRhLm5vUm90YXRlLHRoaXMuZGF0YS52ZXJ0aWNlcz1bXSx0aGlzIGluc3RhbmNlb2YgX3x8KHRoaXMuc2V0TGluZUVuZGluZ3ModC5nZXRBcnJheSgiTEUiKSksdGhpcy5kYXRhLmxpbmVFbmRpbmdzPXRoaXMubGluZUVuZGluZ3MpO2NvbnN0IGE9dC5nZXRBcnJheSgiVmVydGljZXMiKTtpZihBcnJheS5pc0FycmF5KGEpKXtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKz0yKXRoaXMuZGF0YS52ZXJ0aWNlcy5wdXNoKHt4OmFbZV0seTphW2UrMV19KTtpZighdGhpcy5hcHBlYXJhbmNlKXtjb25zdCBlPXRoaXMuY29sb3I/dyh0aGlzLmNvbG9yKTpbMCwwLDBdLGE9dC5nZXQoIkNBIiksaT10aGlzLmJvcmRlclN0eWxlLndpZHRofHwxLHM9MippLG89WzEvMCwxLzAsLTEvMCwtMS8wXTtmb3IoY29uc3QgZSBvZiB0aGlzLmRhdGEudmVydGljZXMpb1swXT1NYXRoLm1pbihvWzBdLGUueC1zKSxvWzFdPU1hdGgubWluKG9bMV0sZS55LXMpLG9bMl09TWF0aC5tYXgob1syXSxlLngrcyksb1szXT1NYXRoLm1heChvWzNdLGUueStzKTtuLlV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLG8pfHwodGhpcy5yZWN0YW5nbGU9byksdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2Uoe3hyZWY6cixleHRyYToiIi5jb25jYXQoaSwiIHciKSxzdHJva2VDb2xvcjplLHN0cm9rZUFscGhhOmEscG9pbnRzQ2FsbGJhY2s6KGUsdCk9Pntjb25zdCByPXRoaXMuZGF0YS52ZXJ0aWNlcztmb3IobGV0IHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5wdXNoKCIiLmNvbmNhdChyW3RdLngsIiAiKS5jb25jYXQoclt0XS55LCIgIikuY29uY2F0KDA9PT10PyJtIjoibCIpKTtyZXR1cm4gZS5wdXNoKCJTIiksW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV19fSl9fX19Y2xhc3MgXyBleHRlbmRzIEx7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuUE9MWUdPTn19Y2xhc3MgaiBleHRlbmRzIGt7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuQ0FSRVR9fWNsYXNzIFUgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuZGF0YS5oYXNPd25DYW52YXM9dGhpcy5kYXRhLm5vUm90YXRlO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7dGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuSU5LLHRoaXMuZGF0YS5pbmtMaXN0cz1bXTtjb25zdCBhPXQuZ2V0QXJyYXkoIklua0xpc3QiKTtpZihBcnJheS5pc0FycmF5KGEpKXtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDsrK2Upe3RoaXMuZGF0YS5pbmtMaXN0cy5wdXNoKFtdKTtmb3IobGV0IHQ9MCxuPWFbZV0ubGVuZ3RoO3Q8bjt0Kz0yKXRoaXMuZGF0YS5pbmtMaXN0c1tlXS5wdXNoKHt4OnIuZmV0Y2hJZlJlZihhW2VdW3RdKSx5OnIuZmV0Y2hJZlJlZihhW2VdW3QrMV0pfSl9aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxhPXQuZ2V0KCJDQSIpLGk9dGhpcy5ib3JkZXJTdHlsZS53aWR0aHx8MSxzPTIqaSxvPVsxLzAsMS8wLC0xLzAsLTEvMF07Zm9yKGNvbnN0IGUgb2YgdGhpcy5kYXRhLmlua0xpc3RzKWZvcihjb25zdCB0IG9mIGUpb1swXT1NYXRoLm1pbihvWzBdLHQueC1zKSxvWzFdPU1hdGgubWluKG9bMV0sdC55LXMpLG9bMl09TWF0aC5tYXgob1syXSx0Lngrcyksb1szXT1NYXRoLm1heChvWzNdLHQueStzKTtuLlV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLG8pfHwodGhpcy5yZWN0YW5nbGU9byksdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2Uoe3hyZWY6cixleHRyYToiIi5jb25jYXQoaSwiIHciKSxzdHJva2VDb2xvcjplLHN0cm9rZUFscGhhOmEscG9pbnRzQ2FsbGJhY2s6KGUsdCk9Pntmb3IoY29uc3QgdCBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpe2ZvcihsZXQgcj0wLG49dC5sZW5ndGg7cjxuO3IrKyllLnB1c2goIiIuY29uY2F0KHRbcl0ueCwiICIpLmNvbmNhdCh0W3JdLnksIiAiKS5jb25jYXQoMD09PXI/Im0iOiJsIikpO2UucHVzaCgiUyIpfXJldHVyblt0WzBdLngsdFsxXS54LHRbM10ueSx0WzFdLnldfX0pfX19c3RhdGljIGNyZWF0ZU5ld0RpY3QoZSx0LHIpe2xldHthcFJlZjphLGFwOml9PXI7Y29uc3R7Y29sb3I6byxvcGFjaXR5OmMscGF0aHM6bCxyZWN0Omgscm90YXRpb246dSx0aGlja25lc3M6ZH09ZSxmPW5ldyBzLkRpY3QodCk7Zi5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkFubm90IikpLGYuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJJbmsiKSksZi5zZXQoIkNyZWF0aW9uRGF0ZSIsIkQ6Ii5jb25jYXQoKDAsbi5nZXRNb2RpZmljYXRpb25EYXRlKSgpKSksZi5zZXQoIlJlY3QiLGgpLGYuc2V0KCJJbmtMaXN0IixsLm1hcCgoZT0+ZS5wb2ludHMpKSksZi5zZXQoIkYiLDQpLGYuc2V0KCJSb3RhdGUiLHUpO2NvbnN0IGc9bmV3IHMuRGljdCh0KTtmLnNldCgiQlMiLGcpLGcuc2V0KCJXIixkKSxmLnNldCgiQyIsQXJyYXkuZnJvbShvLChlPT5lLzI1NSkpKSxmLnNldCgiQ0EiLGMpO2NvbnN0IHA9bmV3IHMuRGljdCh0KTtyZXR1cm4gZi5zZXQoIkFQIixwKSxhP3Auc2V0KCJOIixhKTpwLnNldCgiTiIsaSksZn1zdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShlLHQscil7Y29uc3R7Y29sb3I6bixyZWN0OmMscGF0aHM6bCx0aGlja25lc3M6aCxvcGFjaXR5OnV9PWUsZD1bIiIuY29uY2F0KGgsIiB3IDEgSiAxIGoiKSwiIi5jb25jYXQoKDAsaS5nZXRQZGZDb2xvcikobiwhMSkpXTsxIT09dSYmZC5wdXNoKCIvUjAgZ3MiKTtjb25zdCBmPVtdO2Zvcihjb25zdHtiZXppZXI6ZX1vZiBsKXtmLmxlbmd0aD0wLGYucHVzaCgiIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoZVswXSksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoZVsxXSksIiBtIikpO2ZvcihsZXQgdD0yLHI9ZS5sZW5ndGg7dDxyO3QrPTYpe2NvbnN0IHI9ZS5zbGljZSh0LHQrNikubWFwKGEubnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKTtmLnB1c2goIiIuY29uY2F0KHIsIiBjIikpfWYucHVzaCgiUyIpLGQucHVzaChmLmpvaW4oIlxuIikpfWNvbnN0IGc9ZC5qb2luKCJcbiIpLHA9bmV3IHMuRGljdCh0KTtpZihwLnNldCgiRm9ybVR5cGUiLDEpLHAuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGb3JtIikpLHAuc2V0KCJUeXBlIixzLk5hbWUuZ2V0KCJYT2JqZWN0IikpLHAuc2V0KCJCQm94IixjKSxwLnNldCgiTGVuZ3RoIixnLmxlbmd0aCksMSE9PXUpe2NvbnN0IGU9bmV3IHMuRGljdCh0KSxyPW5ldyBzLkRpY3QodCksbj1uZXcgcy5EaWN0KHQpO24uc2V0KCJDQSIsdSksbi5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKSxyLnNldCgiUjAiLG4pLGUuc2V0KCJFeHRHU3RhdGUiLHIpLHAuc2V0KCJSZXNvdXJjZXMiLGUpfWNvbnN0IG09bmV3IG8uU3RyaW5nU3RyZWFtKGcpO3JldHVybiBtLmRpY3Q9cCxtfX1jbGFzcyAkIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO2lmKHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLkhJR0hMSUdIVCx0aGlzLmRhdGEucXVhZFBvaW50cz12KHQsbnVsbCkpe3ZhciBhO2NvbnN0IGU9bnVsbD09PShhPXRoaXMuYXBwZWFyYW5jZSl8fHZvaWQgMD09PWE/dm9pZCAwOmEuZGljdC5nZXQoIlJlc291cmNlcyIpO2lmKCF0aGlzLmFwcGVhcmFuY2V8fG51bGw9PWV8fCFlLmhhcygiRXh0R1N0YXRlIikpe3RoaXMuYXBwZWFyYW5jZSYmKDAsbi53YXJuKSgiSGlnaGxpZ2h0QW5ub3RhdGlvbiAtIGlnbm9yaW5nIGJ1aWx0LWluIGFwcGVhcmFuY2Ugc3RyZWFtLiIpO2NvbnN0IGU9dGhpcy5jb2xvcj93KHRoaXMuY29sb3IpOlsxLDEsMF0sYT10LmdldCgiQ0EiKTt0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7eHJlZjpyLGZpbGxDb2xvcjplLGJsZW5kTW9kZToiTXVsdGlwbHkiLGZpbGxBbHBoYTphLHBvaW50c0NhbGxiYWNrOihlLHQpPT4oZS5wdXNoKCIiLmNvbmNhdCh0WzBdLngsIiAiKS5jb25jYXQodFswXS55LCIgbSIpLCIiLmNvbmNhdCh0WzFdLngsIiAiKS5jb25jYXQodFsxXS55LCIgbCIpLCIiLmNvbmNhdCh0WzNdLngsIiAiKS5jb25jYXQodFszXS55LCIgbCIpLCIiLmNvbmNhdCh0WzJdLngsIiAiKS5jb25jYXQodFsyXS55LCIgbCIpLCJmIiksW3RbMF0ueCx0WzFdLngsdFszXS55LHRbMV0ueV0pfSl9fWVsc2UgdGhpcy5kYXRhLnBvcHVwUmVmPW51bGx9fWNsYXNzIFggZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7aWYodGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuVU5ERVJMSU5FLHRoaXMuZGF0YS5xdWFkUG9pbnRzPXYodCxudWxsKSl7aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxuPXQuZ2V0KCJDQSIpO3RoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHt4cmVmOnIsZXh0cmE6IltdIDAgZCAwLjU3MSB3IixzdHJva2VDb2xvcjplLHN0cm9rZUFscGhhOm4scG9pbnRzQ2FsbGJhY2s6KGUsdCk9PihlLnB1c2goIiIuY29uY2F0KHRbMl0ueCwiICIpLmNvbmNhdCh0WzJdLnkrMS4zLCIgbSIpLCIiLmNvbmNhdCh0WzNdLngsIiAiKS5jb25jYXQodFszXS55KzEuMywiIGwiKSwiUyIpLFt0WzBdLngsdFsxXS54LHRbM10ueSx0WzFdLnldKX0pfX1lbHNlIHRoaXMuZGF0YS5wb3B1cFJlZj1udWxsfX1jbGFzcyBIIGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdHtkaWN0OnQseHJlZjpyfT1lO2lmKHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZT1uLkFubm90YXRpb25UeXBlLlNRVUlHR0xZLHRoaXMuZGF0YS5xdWFkUG9pbnRzPXYodCxudWxsKSl7aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxuPXQuZ2V0KCJDQSIpO3RoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHt4cmVmOnIsZXh0cmE6IltdIDAgZCAxIHciLHN0cm9rZUNvbG9yOmUsc3Ryb2tlQWxwaGE6bixwb2ludHNDYWxsYmFjazooZSx0KT0+e2NvbnN0IHI9KHRbMF0ueS10WzJdLnkpLzY7bGV0IG49cixhPXRbMl0ueDtjb25zdCBpPXRbMl0ueSxzPXRbM10ueDtlLnB1c2goIiIuY29uY2F0KGEsIiAiKS5jb25jYXQoaStuLCIgbSIpKTtkb3thKz0yLG49MD09PW4/cjowLGUucHVzaCgiIi5jb25jYXQoYSwiICIpLmNvbmNhdChpK24sIiBsIikpfXdoaWxlKGE8cyk7cmV0dXJuIGUucHVzaCgiUyIpLFt0WzJdLngscyxpLTIqcixpKzIqcl19fSl9fWVsc2UgdGhpcy5kYXRhLnBvcHVwUmVmPW51bGx9fWNsYXNzIHEgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWU7aWYodGhpcy5kYXRhLmFubm90YXRpb25UeXBlPW4uQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VULHRoaXMuZGF0YS5xdWFkUG9pbnRzPXYodCxudWxsKSl7aWYoIXRoaXMuYXBwZWFyYW5jZSl7Y29uc3QgZT10aGlzLmNvbG9yP3codGhpcy5jb2xvcik6WzAsMCwwXSxuPXQuZ2V0KCJDQSIpO3RoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHt4cmVmOnIsZXh0cmE6IltdIDAgZCAxIHciLHN0cm9rZUNvbG9yOmUsc3Ryb2tlQWxwaGE6bixwb2ludHNDYWxsYmFjazooZSx0KT0+KGUucHVzaCgodFswXS54K3RbMl0ueCkvMisiICIrKHRbMF0ueSt0WzJdLnkpLzIrIiBtIiwodFsxXS54K3RbM10ueCkvMisiICIrKHRbMV0ueSt0WzNdLnkpLzIrIiBsIiwiUyIpLFt0WzBdLngsdFsxXS54LHRbM10ueSx0WzFdLnldKX0pfX1lbHNlIHRoaXMuZGF0YS5wb3B1cFJlZj1udWxsfX1jbGFzcyB6IGV4dGVuZHMga3tjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9bi5Bbm5vdGF0aW9uVHlwZS5TVEFNUCx0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZX1zdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2UoZSx0KXtjb25zdHt3aWR0aDpyLGhlaWdodDphfT1lLGk9bmV3IE9mZnNjcmVlbkNhbnZhcyhyLGEpLGM9aS5nZXRDb250ZXh0KCIyZCIse2FscGhhOiEwfSk7Yy5kcmF3SW1hZ2UoZSwwLDApO2NvbnN0IGw9Yy5nZXRJbWFnZURhdGEoMCwwLHIsYSkuZGF0YSxoPW5ldyBVaW50MzJBcnJheShsLmJ1ZmZlciksdT1oLnNvbWUobi5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbj9lPT5lPj4+MjQhPTI1NTplPT4yNTUhPSgyNTUmZSkpO3UmJihjLmZpbGxTdHlsZT0id2hpdGUiLGMuZmlsbFJlY3QoMCwwLHIsYSksYy5kcmF3SW1hZ2UoZSwwLDApKTtjb25zdCBkPWkuY29udmVydFRvQmxvYih7dHlwZToiaW1hZ2UvanBlZyIscXVhbGl0eToxfSkudGhlbigoZT0+ZS5hcnJheUJ1ZmZlcigpKSksZj1zLk5hbWUuZ2V0KCJYT2JqZWN0IiksZz1zLk5hbWUuZ2V0KCJJbWFnZSIpLHA9bmV3IHMuRGljdCh0KTtwLnNldCgiVHlwZSIsZikscC5zZXQoIlN1YnR5cGUiLGcpLHAuc2V0KCJCaXRzUGVyQ29tcG9uZW50Iiw4KSxwLnNldCgiQ29sb3JTcGFjZSIscy5OYW1lLmdldCgiRGV2aWNlUkdCIikpLHAuc2V0KCJGaWx0ZXIiLHMuTmFtZS5nZXQoIkRDVERlY29kZSIpKSxwLnNldCgiQkJveCIsWzAsMCxyLGFdKSxwLnNldCgiV2lkdGgiLHIpLHAuc2V0KCJIZWlnaHQiLGEpO2xldCBtPW51bGw7aWYodSl7Y29uc3QgZT1uZXcgVWludDhBcnJheShoLmxlbmd0aCk7aWYobi5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbilmb3IobGV0IHQ9MCxyPWgubGVuZ3RoO3Q8cjt0KyspZVt0XT1oW3RdPj4+MjQ7ZWxzZSBmb3IobGV0IHQ9MCxyPWgubGVuZ3RoO3Q8cjt0KyspZVt0XT0yNTUmaFt0XTtjb25zdCBpPW5ldyBzLkRpY3QodCk7aS5zZXQoIlR5cGUiLGYpLGkuc2V0KCJTdWJ0eXBlIixnKSxpLnNldCgiQml0c1BlckNvbXBvbmVudCIsOCksaS5zZXQoIkNvbG9yU3BhY2UiLHMuTmFtZS5nZXQoIkRldmljZUdyYXkiKSksaS5zZXQoIldpZHRoIixyKSxpLnNldCgiSGVpZ2h0IixhKSxtPW5ldyBvLlN0cmVhbShlLDAsMCxpKX1yZXR1cm57aW1hZ2VTdHJlYW06bmV3IG8uU3RyZWFtKGF3YWl0IGQsMCwwLHApLHNtYXNrU3RyZWFtOm0sd2lkdGg6cixoZWlnaHQ6YX19c3RhdGljIGNyZWF0ZU5ld0RpY3QoZSx0LHIpe2xldHthcFJlZjppLGFwOm99PXI7Y29uc3R7cmVjdDpjLHJvdGF0aW9uOmwsdXNlcjpofT1lLHU9bmV3IHMuRGljdCh0KTtpZih1LnNldCgiVHlwZSIscy5OYW1lLmdldCgiQW5ub3QiKSksdS5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIlN0YW1wIikpLHUuc2V0KCJDcmVhdGlvbkRhdGUiLCJEOiIuY29uY2F0KCgwLG4uZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKSkpLHUuc2V0KCJSZWN0IixjKSx1LnNldCgiRiIsNCksdS5zZXQoIkJvcmRlciIsWzAsMCwwXSksdS5zZXQoIlJvdGF0ZSIsbCksaCYmdS5zZXQoIlQiLCgwLGEuaXNBc2NpaSkoaCk/aDooMCxhLnN0cmluZ1RvVVRGMTZTdHJpbmcpKGgsITApKSxpfHxvKXtjb25zdCBlPW5ldyBzLkRpY3QodCk7dS5zZXQoIkFQIixlKSxpP2Uuc2V0KCJOIixpKTplLnNldCgiTiIsbyl9cmV0dXJuIHV9c3RhdGljIGFzeW5jIGNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0oZSx0LHIpe2NvbnN0e3JvdGF0aW9uOm59PWUse2ltYWdlUmVmOmksd2lkdGg6YyxoZWlnaHQ6bH09ci5pbWFnZSxoPW5ldyBzLkRpY3QodCksdT1uZXcgcy5EaWN0KHQpO2guc2V0KCJYT2JqZWN0Iix1KSx1LnNldCgiSW0wIixpKTtjb25zdCBkPSJxICIuY29uY2F0KGMsIiAwIDAgIikuY29uY2F0KGwsIiAwIDAgY20gL0ltMCBEbyBRIiksZj1uZXcgcy5EaWN0KHQpO2lmKGYuc2V0KCJGb3JtVHlwZSIsMSksZi5zZXQoIlN1YnR5cGUiLHMuTmFtZS5nZXQoIkZvcm0iKSksZi5zZXQoIlR5cGUiLHMuTmFtZS5nZXQoIlhPYmplY3QiKSksZi5zZXQoIkJCb3giLFswLDAsYyxsXSksZi5zZXQoIlJlc291cmNlcyIsaCksbil7Y29uc3QgZT0oMCxhLmdldFJvdGF0aW9uTWF0cml4KShuLGMsbCk7Zi5zZXQoIk1hdHJpeCIsZSl9Y29uc3QgZz1uZXcgby5TdHJpbmdTdHJlYW0oZCk7cmV0dXJuIGcuZGljdD1mLGd9fWNsYXNzIEcgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO2NvbnN0e2RpY3Q6dCx4cmVmOnJ9PWUsYT1uZXcgZi5GaWxlU3BlYyh0LmdldCgiRlMiKSxyKTt0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGU9bi5Bbm5vdGF0aW9uVHlwZS5GSUxFQVRUQUNITUVOVCx0aGlzLmRhdGEuaGFzT3duQ2FudmFzPXRoaXMuZGF0YS5ub1JvdGF0ZSx0aGlzLmRhdGEuZmlsZT1hLnNlcmlhbGl6YWJsZTtjb25zdCBpPXQuZ2V0KCJOYW1lIik7dGhpcy5kYXRhLm5hbWU9aSBpbnN0YW5jZW9mIHMuTmFtZT8oMCxuLnN0cmluZ1RvUERGU3RyaW5nKShpLm5hbWUpOiJQdXNoUGluIn19fSwoZSx0LHIpPT57dmFyIG49cig0KSxhPXIoNiksaT1yKDg3KSxzPXIoMTU4KSxvPXIoNyksYz1uLlJlZ0V4cCxsPWMucHJvdG90eXBlO2EmJm8oKGZ1bmN0aW9uKCl7dmFyIGU9ITA7dHJ5e2MoIi4iLCJkIil9Y2F0Y2godCl7ZT0hMX12YXIgdD17fSxyPSIiLG49ZT8iZGdpbXN5IjoiZ2ltc3kiLGE9ZnVuY3Rpb24oZSxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcis9biwhMH19KX0saT17ZG90QWxsOiJzIixnbG9iYWw6ImciLGlnbm9yZUNhc2U6ImkiLG11bHRpbGluZToibSIsc3RpY2t5OiJ5In07Zm9yKHZhciBzIGluIGUmJihpLmhhc0luZGljZXM9ImQiKSxpKWEocyxpW3NdKTtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihsLCJmbGFncyIpLmdldC5jYWxsKHQpIT09bnx8ciE9PW59KSkmJmkobCwiZmxhZ3MiLHtjb25maWd1cmFibGU6ITAsZ2V0OnN9KX0sKGUsdCxyKT0+e3ZhciBuPXIoNDcpO2UuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlPW4odGhpcyksdD0iIjtyZXR1cm4gZS5oYXNJbmRpY2VzJiYodCs9ImQiKSxlLmdsb2JhbCYmKHQrPSJnIiksZS5pZ25vcmVDYXNlJiYodCs9ImkiKSxlLm11bHRpbGluZSYmKHQrPSJtIiksZS5kb3RBbGwmJih0Kz0icyIpLGUudW5pY29kZSYmKHQrPSJ1IiksZS51bmljb2RlU2V0cyYmKHQrPSJ2IiksZS5zdGlja3kmJih0Kz0ieSIpLHR9fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoNDApLGk9cig2NCkscz1yKDE0MCksbz1yKDE2MCksYz1yKDE0Mik7bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsYXJpdHk6MSxmb3JjZWQ6MSE9PVtdLnVuc2hpZnQoMCl8fCFmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sImxlbmd0aCIse3dyaXRhYmxlOiExfSkudW5zaGlmdCgpfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKX0se3Vuc2hpZnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9YSh0aGlzKSxyPWkodCksbj1hcmd1bWVudHMubGVuZ3RoO2lmKG4pe2MocituKTtmb3IodmFyIGw9cjtsLS07KXt2YXIgaD1sK247bCBpbiB0P3RbaF09dFtsXTpvKHQsaCl9Zm9yKHZhciB1PTA7dTxuO3UrKyl0W3VdPWFyZ3VtZW50c1t1XX1yZXR1cm4gcyh0LHIrbil9fSl9LChlLHQscik9Pnt2YXIgbj1yKDMyKSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighZGVsZXRlIGVbdF0pdGhyb3cgYSgiQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAiK24odCkrIiBvZiAiK24oZSkpfX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZha2VVbmljb2RlRm9udD12b2lkIDAsdC5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZT1mdW5jdGlvbihlKXtsZXR7Zm9udFNpemU6dCxmb250TmFtZTpyLGZvbnRDb2xvcjpufT1lO3JldHVybiIvIi5jb25jYXQoKDAsYS5lc2NhcGVQREZOYW1lKShyKSwiICIpLmNvbmNhdCh0LCIgVGYgIikuY29uY2F0KGYobiwhMCkpfSx0LmdldFBkZkNvbG9yPWYsdC5wYXJzZUFwcGVhcmFuY2VTdHJlYW09ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBuZXcgZChlLHQscikucGFyc2UoKX0sdC5wYXJzZURlZmF1bHRBcHBlYXJhbmNlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdShlKS5wYXJzZSgpfSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigxMzkpO3ZhciBuPXIoMTUwKSxhPXIoMTQ5KSxpPXIoMTQ0KSxzPXIoMTYyKSxvPXIoMTYzKSxjPXIoMjA5KSxsPXIoMjA3KSxoPXIoMTU0KTtjbGFzcyB1IGV4dGVuZHMgby5FdmFsdWF0b3JQcmVwcm9jZXNzb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIobmV3IGguU3RyaW5nU3RyZWFtKGUpKX1wYXJzZSgpe2NvbnN0IGU9e2ZuOjAsYXJnczpbXX0sdD17Zm9udFNpemU6MCxmb250TmFtZToiIixmb250Q29sb3I6bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpfTt0cnl7Zm9yKDtlLmFyZ3MubGVuZ3RoPTAsdGhpcy5yZWFkKGUpOyl7aWYoMCE9PXRoaXMuc2F2ZWRTdGF0ZXNEZXB0aCljb250aW51ZTtjb25zdHtmbjpyLGFyZ3M6YX09ZTtzd2l0Y2goMHxyKXtjYXNlIGkuT1BTLnNldEZvbnQ6Y29uc3RbZSxyXT1hO2UgaW5zdGFuY2VvZiBuLk5hbWUmJih0LmZvbnROYW1lPWUubmFtZSksIm51bWJlciI9PXR5cGVvZiByJiZyPjAmJih0LmZvbnRTaXplPXIpO2JyZWFrO2Nhc2UgaS5PUFMuc2V0RmlsbFJHQkNvbG9yOnMuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2JJdGVtKGEsMCx0LmZvbnRDb2xvciwwKTticmVhaztjYXNlIGkuT1BTLnNldEZpbGxHcmF5OnMuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShhLDAsdC5mb250Q29sb3IsMCk7YnJlYWs7Y2FzZSBpLk9QUy5zZXRGaWxsQ01ZS0NvbG9yOnMuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiSXRlbShhLDAsdC5mb250Q29sb3IsMCl9fX1jYXRjaChlKXsoMCxpLndhcm4pKCdwYXJzZURlZmF1bHRBcHBlYXJhbmNlIC0gaWdub3JpbmcgZXJyb3JzOiAiJy5jb25jYXQoZSwnIi4nKSl9cmV0dXJuIHR9fWNsYXNzIGQgZXh0ZW5kcyBvLkV2YWx1YXRvclByZXByb2Nlc3Nvcntjb25zdHJ1Y3RvcihlLHQscil7dmFyIG47c3VwZXIoZSksdGhpcy5zdHJlYW09ZSx0aGlzLmV2YWx1YXRvck9wdGlvbnM9dCx0aGlzLnhyZWY9cix0aGlzLnJlc291cmNlcz1udWxsPT09KG49ZS5kaWN0KXx8dm9pZCAwPT09bj92b2lkIDA6bi5nZXQoIlJlc291cmNlcyIpfXBhcnNlKCl7Y29uc3QgZT17Zm46MCxhcmdzOltdfTtsZXQgdD17c2NhbGVGYWN0b3I6MSxmb250U2l6ZTowLGZvbnROYW1lOiIiLGZvbnRDb2xvcjpuZXcgVWludDhDbGFtcGVkQXJyYXkoMyksZmlsbENvbG9yU3BhY2U6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheX0scj0hMTtjb25zdCBhPVtdO3RyeXtmb3IoO2UuYXJncy5sZW5ndGg9MCwhciYmdGhpcy5yZWFkKGUpOyl7Y29uc3R7Zm46byxhcmdzOmN9PWU7c3dpdGNoKDB8byl7Y2FzZSBpLk9QUy5zYXZlOmEucHVzaCh7c2NhbGVGYWN0b3I6dC5zY2FsZUZhY3Rvcixmb250U2l6ZTp0LmZvbnRTaXplLGZvbnROYW1lOnQuZm9udE5hbWUsZm9udENvbG9yOnQuZm9udENvbG9yLnNsaWNlKCksZmlsbENvbG9yU3BhY2U6dC5maWxsQ29sb3JTcGFjZX0pO2JyZWFrO2Nhc2UgaS5PUFMucmVzdG9yZTp0PWEucG9wKCl8fHQ7YnJlYWs7Y2FzZSBpLk9QUy5zZXRUZXh0TWF0cml4OnQuc2NhbGVGYWN0b3IqPU1hdGguaHlwb3QoY1swXSxjWzFdKTticmVhaztjYXNlIGkuT1BTLnNldEZvbnQ6Y29uc3RbZSxvXT1jO2UgaW5zdGFuY2VvZiBuLk5hbWUmJih0LmZvbnROYW1lPWUubmFtZSksIm51bWJlciI9PXR5cGVvZiBvJiZvPjAmJih0LmZvbnRTaXplPW8qdC5zY2FsZUZhY3Rvcik7YnJlYWs7Y2FzZSBpLk9QUy5zZXRGaWxsQ29sb3JTcGFjZTp0LmZpbGxDb2xvclNwYWNlPXMuQ29sb3JTcGFjZS5wYXJzZSh7Y3M6Y1swXSx4cmVmOnRoaXMueHJlZixyZXNvdXJjZXM6dGhpcy5yZXNvdXJjZXMscGRmRnVuY3Rpb25GYWN0b3J5OnRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxsb2NhbENvbG9yU3BhY2VDYWNoZTp0aGlzLl9sb2NhbENvbG9yU3BhY2VDYWNoZX0pO2JyZWFrO2Nhc2UgaS5PUFMuc2V0RmlsbENvbG9yOnQuZmlsbENvbG9yU3BhY2UuZ2V0UmdiSXRlbShjLDAsdC5mb250Q29sb3IsMCk7YnJlYWs7Y2FzZSBpLk9QUy5zZXRGaWxsUkdCQ29sb3I6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYkl0ZW0oYywwLHQuZm9udENvbG9yLDApO2JyZWFrO2Nhc2UgaS5PUFMuc2V0RmlsbEdyYXk6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2JJdGVtKGMsMCx0LmZvbnRDb2xvciwwKTticmVhaztjYXNlIGkuT1BTLnNldEZpbGxDTVlLQ29sb3I6cy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2JJdGVtKGMsMCx0LmZvbnRDb2xvciwwKTticmVhaztjYXNlIGkuT1BTLnNob3dUZXh0OmNhc2UgaS5PUFMuc2hvd1NwYWNlZFRleHQ6Y2FzZSBpLk9QUy5uZXh0TGluZVNob3dUZXh0OmNhc2UgaS5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6cj0hMH19fWNhdGNoKGUpeygwLGkud2FybikoJ3BhcnNlQXBwZWFyYW5jZVN0cmVhbSAtIGlnbm9yaW5nIGVycm9yczogIicuY29uY2F0KGUsJyIuJykpfXJldHVybiB0aGlzLnN0cmVhbS5yZXNldCgpLGRlbGV0ZSB0LnNjYWxlRmFjdG9yLGRlbGV0ZSB0LmZpbGxDb2xvclNwYWNlLHR9Z2V0IF9sb2NhbENvbG9yU3BhY2VDYWNoZSgpe3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJfbG9jYWxDb2xvclNwYWNlQ2FjaGUiLG5ldyBjLkxvY2FsQ29sb3JTcGFjZUNhY2hlKX1nZXQgX3BkZkZ1bmN0aW9uRmFjdG9yeSgpe2NvbnN0IGU9bmV3IGwuUERGRnVuY3Rpb25GYWN0b3J5KHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5ldmFsdWF0b3JPcHRpb25zLmlzRXZhbFN1cHBvcnRlZH0pO3JldHVybigwLGkuc2hhZG93KSh0aGlzLCJfcGRmRnVuY3Rpb25GYWN0b3J5IixlKX19ZnVuY3Rpb24gZihlLHQpe2lmKGVbMF09PT1lWzFdJiZlWzFdPT09ZVsyXSl7Y29uc3Qgcj1lWzBdLzI1NTtyZXR1cm4iIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykociksIiAiKS5jb25jYXQodD8iZyI6IkciKX1yZXR1cm4gQXJyYXkuZnJvbShlLChlPT4oMCxhLm51bWJlclRvU3RyaW5nKShlLzI1NSkpKS5qb2luKCIgIikrIiAiKyh0PyJyZyI6IlJHIil9Y2xhc3MgZ3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMueHJlZj1lLHRoaXMud2lkdGhzPW51bGwsdGhpcy5maXJzdENoYXI9MS8wLHRoaXMubGFzdENoYXI9LTEvMCx0aGlzLmZvbnRGYW1pbHk9dDtjb25zdCByPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKTt0aGlzLmN0eE1lYXN1cmU9ci5nZXRDb250ZXh0KCIyZCIpLGcuX2ZvbnROYW1lSWR8fChnLl9mb250TmFtZUlkPTEpLHRoaXMuZm9udE5hbWU9bi5OYW1lLmdldCgiSW52YWxpZFBERmpzRm9udF8iLmNvbmNhdCh0LCJfIikuY29uY2F0KGcuX2ZvbnROYW1lSWQrKykpfWdldCB0b1VuaWNvZGVSZWYoKXtpZighZy5fdG9Vbmljb2RlUmVmKXtjb25zdCBlPSIvQ0lESW5pdCAvUHJvY1NldCBmaW5kcmVzb3VyY2UgYmVnaW5cbjEyIGRpY3QgYmVnaW5cbmJlZ2luY21hcFxuL0NJRFN5c3RlbUluZm9cbjw8IC9SZWdpc3RyeSAoQWRvYmUpXG4vT3JkZXJpbmcgKFVDUykgL1N1cHBsZW1lbnQgMCA+PiBkZWZcbi9DTWFwTmFtZSAvQWRvYmUtSWRlbnRpdHktVUNTIGRlZlxuL0NNYXBUeXBlIDIgZGVmXG4xIGJlZ2luY29kZXNwYWNlcmFuZ2VcbjwwMDAwPiA8RkZGRj5cbmVuZGNvZGVzcGFjZXJhbmdlXG4xIGJlZ2luYmZyYW5nZVxuPDAwMDA+IDxGRkZGPiA8MDAwMD5cbmVuZGJmcmFuZ2VcbmVuZGNtYXAgQ01hcE5hbWUgY3VycmVudGRpY3QgL0NNYXAgZGVmaW5lcmVzb3VyY2UgcG9wIGVuZCBlbmQiLHQ9Zy50b1VuaWNvZGVTdHJlYW09bmV3IGguU3RyaW5nU3RyZWFtKGUpLHI9bmV3IG4uRGljdCh0aGlzLnhyZWYpO3QuZGljdD1yLHIuc2V0KCJMZW5ndGgiLGUubGVuZ3RoKSxnLl90b1VuaWNvZGVSZWY9dGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYodCl9cmV0dXJuIGcuX3RvVW5pY29kZVJlZn1nZXQgZm9udERlc2NyaXB0b3JSZWYoKXtpZighZy5fZm9udERlc2NyaXB0b3JSZWYpe2NvbnN0IGU9bmV3IG4uRGljdCh0aGlzLnhyZWYpO2Uuc2V0KCJUeXBlIixuLk5hbWUuZ2V0KCJGb250RGVzY3JpcHRvciIpKSxlLnNldCgiRm9udE5hbWUiLHRoaXMuZm9udE5hbWUpLGUuc2V0KCJGb250RmFtaWx5IiwiTXlyaWFkUHJvIFJlZ3VsYXIiKSxlLnNldCgiRm9udEJCb3giLFswLDAsMCwwXSksZS5zZXQoIkZvbnRTdHJldGNoIixuLk5hbWUuZ2V0KCJOb3JtYWwiKSksZS5zZXQoIkZvbnRXZWlnaHQiLDQwMCksZS5zZXQoIkl0YWxpY0FuZ2xlIiwwKSxnLl9mb250RGVzY3JpcHRvclJlZj10aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihlKX1yZXR1cm4gZy5fZm9udERlc2NyaXB0b3JSZWZ9Z2V0IGRlc2NlbmRhbnRGb250UmVmKCl7Y29uc3QgZT1uZXcgbi5EaWN0KHRoaXMueHJlZik7ZS5zZXQoIkJhc2VGb250Iix0aGlzLmZvbnROYW1lKSxlLnNldCgiVHlwZSIsbi5OYW1lLmdldCgiRm9udCIpKSxlLnNldCgiU3VidHlwZSIsbi5OYW1lLmdldCgiQ0lERm9udFR5cGUwIikpLGUuc2V0KCJDSURUb0dJRE1hcCIsbi5OYW1lLmdldCgiSWRlbnRpdHkiKSksZS5zZXQoIkZpcnN0Q2hhciIsdGhpcy5maXJzdENoYXIpLGUuc2V0KCJMYXN0Q2hhciIsdGhpcy5sYXN0Q2hhciksZS5zZXQoIkZvbnREZXNjcmlwdG9yIix0aGlzLmZvbnREZXNjcmlwdG9yUmVmKSxlLnNldCgiRFciLDFlMyk7Y29uc3QgdD1bXSxyPVsuLi50aGlzLndpZHRocy5lbnRyaWVzKCldLnNvcnQoKTtsZXQgYT1udWxsLGk9bnVsbDtmb3IoY29uc3RbZSxuXW9mIHIpYT9lPT09YStpLmxlbmd0aD9pLnB1c2gobik6KHQucHVzaChhLGkpLGE9ZSxpPVtuXSk6KGE9ZSxpPVtuXSk7YSYmdC5wdXNoKGEsaSksZS5zZXQoIlciLHQpO2NvbnN0IHM9bmV3IG4uRGljdCh0aGlzLnhyZWYpO3JldHVybiBzLnNldCgiT3JkZXJpbmciLCJJZGVudGl0eSIpLHMuc2V0KCJSZWdpc3RyeSIsIkFkb2JlIikscy5zZXQoIlN1cHBsZW1lbnQiLDApLGUuc2V0KCJDSURTeXN0ZW1JbmZvIixzKSx0aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihlKX1nZXQgYmFzZUZvbnRSZWYoKXtjb25zdCBlPW5ldyBuLkRpY3QodGhpcy54cmVmKTtyZXR1cm4gZS5zZXQoIkJhc2VGb250Iix0aGlzLmZvbnROYW1lKSxlLnNldCgiVHlwZSIsbi5OYW1lLmdldCgiRm9udCIpKSxlLnNldCgiU3VidHlwZSIsbi5OYW1lLmdldCgiVHlwZTAiKSksZS5zZXQoIkVuY29kaW5nIixuLk5hbWUuZ2V0KCJJZGVudGl0eS1IIikpLGUuc2V0KCJEZXNjZW5kYW50Rm9udHMiLFt0aGlzLmRlc2NlbmRhbnRGb250UmVmXSksZS5zZXQoIlRvVW5pY29kZSIsdGhpcy50b1VuaWNvZGVSZWYpLHRoaXMueHJlZi5nZXROZXdQZXJzaXN0ZW50UmVmKGUpfWdldCByZXNvdXJjZXMoKXtjb25zdCBlPW5ldyBuLkRpY3QodGhpcy54cmVmKSx0PW5ldyBuLkRpY3QodGhpcy54cmVmKTtyZXR1cm4gdC5zZXQodGhpcy5mb250TmFtZS5uYW1lLHRoaXMuYmFzZUZvbnRSZWYpLGUuc2V0KCJGb250Iix0KSxlfV9jcmVhdGVDb250ZXh0KCl7cmV0dXJuIHRoaXMud2lkdGhzPW5ldyBNYXAsdGhpcy5jdHhNZWFzdXJlLmZvbnQ9IjEwMDBweCAiLmNvbmNhdCh0aGlzLmZvbnRGYW1pbHkpLHRoaXMuY3R4TWVhc3VyZX1jcmVhdGVGb250UmVzb3VyY2VzKGUpe2NvbnN0IHQ9dGhpcy5fY3JlYXRlQ29udGV4dCgpO2Zvcihjb25zdCByIG9mIGUuc3BsaXQoL1xyXG4/fFxuLykpZm9yKGNvbnN0IGUgb2Ygci5zcGxpdCgiIikpe2NvbnN0IHI9ZS5jaGFyQ29kZUF0KDApO2lmKHRoaXMud2lkdGhzLmhhcyhyKSljb250aW51ZTtjb25zdCBuPXQubWVhc3VyZVRleHQoZSksYT1NYXRoLmNlaWwobi53aWR0aCk7dGhpcy53aWR0aHMuc2V0KHIsYSksdGhpcy5maXJzdENoYXI9TWF0aC5taW4ocix0aGlzLmZpcnN0Q2hhciksdGhpcy5sYXN0Q2hhcj1NYXRoLm1heChyLHRoaXMubGFzdENoYXIpfXJldHVybiB0aGlzLnJlc291cmNlc31jcmVhdGVBcHBlYXJhbmNlKGUsdCxyLHMsbyxjKXtjb25zdCBsPXRoaXMuX2NyZWF0ZUNvbnRleHQoKSx1PVtdO2xldCBkPS0xLzA7Zm9yKGNvbnN0IHQgb2YgZS5zcGxpdCgvXHJcbj98XG4vKSl7dS5wdXNoKHQpO2NvbnN0IGU9bC5tZWFzdXJlVGV4dCh0KS53aWR0aDtkPU1hdGgubWF4KGQsZSk7Zm9yKGNvbnN0IGUgb2YgdC5zcGxpdCgiIikpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KDApO2xldCByPXRoaXMud2lkdGhzLmdldCh0KTtpZih2b2lkIDA9PT1yKXtjb25zdCBuPWwubWVhc3VyZVRleHQoZSk7cj1NYXRoLmNlaWwobi53aWR0aCksdGhpcy53aWR0aHMuc2V0KHQsciksdGhpcy5maXJzdENoYXI9TWF0aC5taW4odCx0aGlzLmZpcnN0Q2hhciksdGhpcy5sYXN0Q2hhcj1NYXRoLm1heCh0LHRoaXMubGFzdENoYXIpfX19ZCo9cy8xZTM7Y29uc3RbZyxwLG0sYl09dDtsZXQgeT1tLWcsdz1iLXA7ciUxODAhPTAmJihbeSx3XT1bdyx5XSk7bGV0IHY9MTtkPnkmJih2PXkvZCk7bGV0IHg9MTtjb25zdCBTPWkuTElORV9GQUNUT1IqcyxBPWkuTElORV9ERVNDRU5UX0ZBQ1RPUipzLGs9Uyp1Lmxlbmd0aDtrPncmJih4PXcvayk7Y29uc3QgQz1zKk1hdGgubWluKHYseCksTz1bInEiLCIwIDAgIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykoeSksIiAiKS5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykodyksIiByZSBXIG4iKSwiQlQiLCIxIDAgMCAxIDAgIi5jb25jYXQoKDAsYS5udW1iZXJUb1N0cmluZykodytBKSwiIFRtIDAgVGMgIikuY29uY2F0KGYobywhMCkpLCIvIi5jb25jYXQodGhpcy5mb250TmFtZS5uYW1lLCIgIikuY29uY2F0KCgwLGEubnVtYmVyVG9TdHJpbmcpKEMpLCIgVGYiKV0se3Jlc291cmNlczpGfT10aGlzO2lmKDEhPT0oYz0ibnVtYmVyIj09dHlwZW9mIGMmJmM+PTAmJmM8PTE/YzoxKSl7Ty5wdXNoKCIvUjAgZ3MiKTtjb25zdCBlPW5ldyBuLkRpY3QodGhpcy54cmVmKSx0PW5ldyBuLkRpY3QodGhpcy54cmVmKTt0LnNldCgiY2EiLGMpLHQuc2V0KCJDQSIsYyksdC5zZXQoIlR5cGUiLG4uTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKSxlLnNldCgiUjAiLHQpLEYuc2V0KCJFeHRHU3RhdGUiLGUpfWNvbnN0IEk9KDAsYS5udW1iZXJUb1N0cmluZykoUyk7Zm9yKGNvbnN0IGUgb2YgdSlPLnB1c2goIjAgLSIuY29uY2F0KEksIiBUZCA8IikuY29uY2F0KCgwLGEuc3RyaW5nVG9VVEYxNkhleFN0cmluZykoZSksIj4gVGoiKSk7Ty5wdXNoKCJFVCIsIlEiKTtjb25zdCBUPU8uam9pbigiXG4iKSxNPW5ldyBuLkRpY3QodGhpcy54cmVmKTtpZihNLnNldCgiU3VidHlwZSIsbi5OYW1lLmdldCgiRm9ybSIpKSxNLnNldCgiVHlwZSIsbi5OYW1lLmdldCgiWE9iamVjdCIpKSxNLnNldCgiQkJveCIsWzAsMCx5LHddKSxNLnNldCgiTGVuZ3RoIixULmxlbmd0aCksTS5zZXQoIlJlc291cmNlcyIsRikscil7Y29uc3QgZT0oMCxhLmdldFJvdGF0aW9uTWF0cml4KShyLHksdyk7TS5zZXQoIk1hdHJpeCIsZSl9Y29uc3QgRT1uZXcgaC5TdHJpbmdTdHJlYW0oVCk7cmV0dXJuIEUuZGljdD1NLEV9fXQuRmFrZVVuaWNvZGVGb250PWd9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Db2xvclNwYWNlPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigyKTt2YXIgbj1yKDE0NCksYT1yKDE1MCksaT1yKDE1MSkscz1yKDE0OSk7Y2xhc3Mgb3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY29uc3RydWN0b3I9PT1vJiYoMCxuLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQ29sb3JTcGFjZS4iKSx0aGlzLm5hbWU9ZSx0aGlzLm51bUNvbXBzPXR9Z2V0UmdiKGUsdCl7Y29uc3Qgcj1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7cmV0dXJuIHRoaXMuZ2V0UmdiSXRlbShlLHQsciwwKSxyfWdldFJnYkl0ZW0oZSx0LHIsYSl7KDAsbi51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldFJnYkl0ZW0iKX1nZXRSZ2JCdWZmZXIoZSx0LHIsYSxpLHMsbyl7KDAsbi51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBDb2xvclNwYWNlLmdldFJnYkJ1ZmZlciIpfWdldE91dHB1dExlbmd0aChlLHQpeygwLG4udW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRPdXRwdXRMZW5ndGgiKX1pc1Bhc3N0aHJvdWdoKGUpe3JldHVybiExfWlzRGVmYXVsdERlY29kZShlLHQpe3JldHVybiBvLmlzRGVmYXVsdERlY29kZShlLHRoaXMubnVtQ29tcHMpfWZpbGxSZ2IoZSx0LHIsbixhLGkscyxvLGMpe2NvbnN0IGw9dCpyO2xldCBoPW51bGw7Y29uc3QgdT0xPDxzLGQ9ciE9PWF8fHQhPT1uO2lmKHRoaXMuaXNQYXNzdGhyb3VnaChzKSloPW87ZWxzZSBpZigxPT09dGhpcy5udW1Db21wcyYmbD51JiYiRGV2aWNlR3JheSIhPT10aGlzLm5hbWUmJiJEZXZpY2VSR0IiIT09dGhpcy5uYW1lKXtjb25zdCB0PXM8PTg/bmV3IFVpbnQ4QXJyYXkodSk6bmV3IFVpbnQxNkFycmF5KHUpO2ZvcihsZXQgZT0wO2U8dTtlKyspdFtlXT1lO2NvbnN0IHI9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMqdSk7aWYodGhpcy5nZXRSZ2JCdWZmZXIodCwwLHUsciwwLHMsMCksZCl7aD1uZXcgVWludDhBcnJheSgzKmwpO2xldCBlPTA7Zm9yKGxldCB0PTA7dDxsOysrdCl7Y29uc3Qgbj0zKm9bdF07aFtlKytdPXJbbl0saFtlKytdPXJbbisxXSxoW2UrK109cltuKzJdfX1lbHNle2xldCB0PTA7Zm9yKGxldCBuPTA7bjxsOysrbil7Y29uc3QgYT0zKm9bbl07ZVt0KytdPXJbYV0sZVt0KytdPXJbYSsxXSxlW3QrK109clthKzJdLHQrPWN9fX1lbHNlIGQ/KGg9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMqbCksdGhpcy5nZXRSZ2JCdWZmZXIobywwLGwsaCwwLHMsMCkpOnRoaXMuZ2V0UmdiQnVmZmVyKG8sMCxuKmksZSwwLHMsYyk7aWYoaClpZihkKSFmdW5jdGlvbihlLHQscixuLGEsaSxzKXtzPTEhPT1zPzA6cztjb25zdCBvPXIvYSxjPW4vaTtsZXQgbCxoPTA7Y29uc3QgdT1uZXcgVWludDE2QXJyYXkoYSksZD0zKnI7Zm9yKGxldCBlPTA7ZTxhO2UrKyl1W2VdPTMqTWF0aC5mbG9vcihlKm8pO2ZvcihsZXQgcj0wO3I8aTtyKyspe2NvbnN0IG49TWF0aC5mbG9vcihyKmMpKmQ7Zm9yKGxldCByPTA7cjxhO3IrKylsPW4rdVtyXSx0W2grK109ZVtsKytdLHRbaCsrXT1lW2wrK10sdFtoKytdPWVbbCsrXSxoKz1zfX0oaCxlLHQscixuLGEsYyk7ZWxzZXtsZXQgdD0wLHI9MDtmb3IobGV0IGE9MCxzPW4qaTthPHM7YSsrKWVbdCsrXT1oW3IrK10sZVt0KytdPWhbcisrXSxlW3QrK109aFtyKytdLHQrPWN9fWdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywidXNlc1plcm9Ub09uZVJhbmdlIiwhMCl9c3RhdGljIF9jYWNoZShlLHQscixuKXtpZighcil0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTtpZighbil0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgInBhcnNlZENvbG9yU3BhY2UiIGFyZ3VtZW50LicpO2xldCBpLHM7ZSBpbnN0YW5jZW9mIGEuUmVmJiYocz1lLGU9dC5mZXRjaChlKSksZSBpbnN0YW5jZW9mIGEuTmFtZSYmKGk9ZS5uYW1lKSwoaXx8cykmJnIuc2V0KGkscyxuKX1zdGF0aWMgZ2V0Q2FjaGVkKGUsdCxyKXtpZighcil0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuZ2V0Q2FjaGVkIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTtpZihlIGluc3RhbmNlb2YgYS5SZWYpe2NvbnN0IG49ci5nZXRCeVJlZihlKTtpZihuKXJldHVybiBuO3RyeXtlPXQuZmV0Y2goZSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZX19aWYoZSBpbnN0YW5jZW9mIGEuTmFtZSl7Y29uc3QgdD1yLmdldEJ5TmFtZShlLm5hbWUpO2lmKHQpcmV0dXJuIHR9cmV0dXJuIG51bGx9c3RhdGljIGFzeW5jIHBhcnNlQXN5bmMoZSl7bGV0e2NzOnQseHJlZjpyLHJlc291cmNlczpuPW51bGwscGRmRnVuY3Rpb25GYWN0b3J5OmEsbG9jYWxDb2xvclNwYWNlQ2FjaGU6aX09ZTtjb25zdCBzPXRoaXMuX3BhcnNlKHQscixuLGEpO3JldHVybiB0aGlzLl9jYWNoZSh0LHIsaSxzKSxzfXN0YXRpYyBwYXJzZShlKXtsZXR7Y3M6dCx4cmVmOnIscmVzb3VyY2VzOm49bnVsbCxwZGZGdW5jdGlvbkZhY3Rvcnk6YSxsb2NhbENvbG9yU3BhY2VDYWNoZTppfT1lO2NvbnN0IHM9dGhpcy5nZXRDYWNoZWQodCxyLGkpO2lmKHMpcmV0dXJuIHM7Y29uc3Qgbz10aGlzLl9wYXJzZSh0LHIsbixhKTtyZXR1cm4gdGhpcy5fY2FjaGUodCxyLGksbyksb31zdGF0aWMgX3BhcnNlKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsaT1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMDtpZigoZT10LmZldGNoSWZSZWYoZSkpaW5zdGFuY2VvZiBhLk5hbWUpc3dpdGNoKGUubmFtZSl7Y2FzZSJHIjpjYXNlIkRldmljZUdyYXkiOnJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTtjYXNlIlJHQiI6Y2FzZSJEZXZpY2VSR0IiOnJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiO2Nhc2UiQ01ZSyI6Y2FzZSJEZXZpY2VDTVlLIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7Y2FzZSJQYXR0ZXJuIjpyZXR1cm4gbmV3IGwobnVsbCk7ZGVmYXVsdDppZihyIGluc3RhbmNlb2YgYS5EaWN0KXtjb25zdCBuPXIuZ2V0KCJDb2xvclNwYWNlIik7aWYobiBpbnN0YW5jZW9mIGEuRGljdCl7Y29uc3Qgcz1uLmdldChlLm5hbWUpO2lmKHMpe2lmKHMgaW5zdGFuY2VvZiBhLk5hbWUpcmV0dXJuIHRoaXMuX3BhcnNlKHMsdCxyLGkpO2U9czticmVha319fXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbnJlY29nbml6ZWQgQ29sb3JTcGFjZTogIi5jb25jYXQoZS5uYW1lKSl9aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgYT10LmZldGNoSWZSZWYoZVswXSkubmFtZTtsZXQgcyxvLHUsZCxmLGI7c3dpdGNoKGEpe2Nhc2UiRyI6Y2FzZSJEZXZpY2VHcmF5IjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7Y2FzZSJSR0IiOmNhc2UiRGV2aWNlUkdCIjpyZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjtjYXNlIkNNWUsiOmNhc2UiRGV2aWNlQ01ZSyI6cmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrO2Nhc2UiQ2FsR3JheSI6cmV0dXJuIHM9dC5mZXRjaElmUmVmKGVbMV0pLGQ9cy5nZXRBcnJheSgiV2hpdGVQb2ludCIpLGY9cy5nZXRBcnJheSgiQmxhY2tQb2ludCIpLGI9cy5nZXQoIkdhbW1hIiksbmV3IGcoZCxmLGIpO2Nhc2UiQ2FsUkdCIjpzPXQuZmV0Y2hJZlJlZihlWzFdKSxkPXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKSxmPXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKSxiPXMuZ2V0QXJyYXkoIkdhbW1hIik7Y29uc3QgeT1zLmdldEFycmF5KCJNYXRyaXgiKTtyZXR1cm4gbmV3IHAoZCxmLGIseSk7Y2FzZSJJQ0NCYXNlZCI6Y29uc3Qgdz10LmZldGNoSWZSZWYoZVsxXSkuZGljdDtvPXcuZ2V0KCJOIik7Y29uc3Qgdj13LmdldCgiQWx0ZXJuYXRlIik7aWYodil7Y29uc3QgZT10aGlzLl9wYXJzZSh2LHQscixpKTtpZihlLm51bUNvbXBzPT09bylyZXR1cm4gZTsoMCxuLndhcm4pKCJJQ0NCYXNlZCBjb2xvciBzcGFjZTogSWdub3JpbmcgaW5jb3JyZWN0IC9BbHRlcm5hdGUgZW50cnkuIil9aWYoMT09PW8pcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5O2lmKDM9PT1vKXJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiO2lmKDQ9PT1vKXJldHVybiB0aGlzLnNpbmdsZXRvbnMuY215azticmVhaztjYXNlIlBhdHRlcm4iOnJldHVybiB1PWVbMV18fG51bGwsdSYmKHU9dGhpcy5fcGFyc2UodSx0LHIsaSkpLG5ldyBsKHUpO2Nhc2UiSSI6Y2FzZSJJbmRleGVkIjp1PXRoaXMuX3BhcnNlKGVbMV0sdCxyLGkpO2NvbnN0IHg9dC5mZXRjaElmUmVmKGVbMl0pKzEsUz10LmZldGNoSWZSZWYoZVszXSk7cmV0dXJuIG5ldyBoKHUseCxTKTtjYXNlIlNlcGFyYXRpb24iOmNhc2UiRGV2aWNlTiI6Y29uc3QgQT10LmZldGNoSWZSZWYoZVsxXSk7bz1BcnJheS5pc0FycmF5KEEpP0EubGVuZ3RoOjEsdT10aGlzLl9wYXJzZShlWzJdLHQscixpKTtjb25zdCBrPWkuY3JlYXRlKGVbM10pO3JldHVybiBuZXcgYyhvLHUsayk7Y2FzZSJMYWIiOnM9dC5mZXRjaElmUmVmKGVbMV0pLGQ9cy5nZXRBcnJheSgiV2hpdGVQb2ludCIpLGY9cy5nZXRBcnJheSgiQmxhY2tQb2ludCIpO2NvbnN0IEM9cy5nZXRBcnJheSgiUmFuZ2UiKTtyZXR1cm4gbmV3IG0oZCxmLEMpO2RlZmF1bHQ6dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVuaW1wbGVtZW50ZWQgQ29sb3JTcGFjZSBvYmplY3Q6ICIuY29uY2F0KGEpKX19dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogIi5jb25jYXQoZSkpfXN0YXRpYyBpc0RlZmF1bHREZWNvZGUoZSx0KXtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4hMDtpZigyKnQhPT1lLmxlbmd0aClyZXR1cm4oMCxuLndhcm4pKCJUaGUgZGVjb2RlIG1hcCBpcyBub3QgdGhlIGNvcnJlY3QgbGVuZ3RoIiksITA7Zm9yKGxldCB0PTAscj1lLmxlbmd0aDt0PHI7dCs9MilpZigwIT09ZVt0XXx8MSE9PWVbdCsxXSlyZXR1cm4hMTtyZXR1cm4hMH1zdGF0aWMgZ2V0IHNpbmdsZXRvbnMoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywic2luZ2xldG9ucyIse2dldCBncmF5KCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImdyYXkiLG5ldyB1KX0sZ2V0IHJnYigpe3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJyZ2IiLG5ldyBkKX0sZ2V0IGNteWsoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiY215ayIsbmV3IGYpfX0pfX10LkNvbG9yU3BhY2U9bztjbGFzcyBjIGV4dGVuZHMgb3tjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoIkFsdGVybmF0ZSIsZSksdGhpcy5iYXNlPXQsdGhpcy50aW50Rm49cix0aGlzLnRtcEJ1Zj1uZXcgRmxvYXQzMkFycmF5KHQubnVtQ29tcHMpfWdldFJnYkl0ZW0oZSx0LHIsbil7Y29uc3QgYT10aGlzLnRtcEJ1Zjt0aGlzLnRpbnRGbihlLHQsYSwwKSx0aGlzLmJhc2UuZ2V0UmdiSXRlbShhLDAscixuKX1nZXRSZ2JCdWZmZXIoZSx0LHIsbixhLGkscyl7Y29uc3Qgbz10aGlzLnRpbnRGbixjPXRoaXMuYmFzZSxsPTEvKCgxPDxpKS0xKSxoPWMubnVtQ29tcHMsdT1jLnVzZXNaZXJvVG9PbmVSYW5nZSxkPShjLmlzUGFzc3Rocm91Z2goOCl8fCF1KSYmMD09PXM7bGV0IGY9ZD9hOjA7Y29uc3QgZz1kP246bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGgqcikscD10aGlzLm51bUNvbXBzLG09bmV3IEZsb2F0MzJBcnJheShwKSxiPW5ldyBGbG9hdDMyQXJyYXkoaCk7bGV0IHksdztmb3IoeT0wO3k8cjt5Kyspe2Zvcih3PTA7dzxwO3crKyltW3ddPWVbdCsrXSpsO2lmKG8obSwwLGIsMCksdSlmb3Iodz0wO3c8aDt3KyspZ1tmKytdPTI1NSpiW3ddO2Vsc2UgYy5nZXRSZ2JJdGVtKGIsMCxnLGYpLGYrPWh9ZHx8Yy5nZXRSZ2JCdWZmZXIoZywwLHIsbixhLDgscyl9Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIHRoaXMuYmFzZS5nZXRPdXRwdXRMZW5ndGgoZSp0aGlzLmJhc2UubnVtQ29tcHMvdGhpcy5udW1Db21wcyx0KX19Y2xhc3MgbCBleHRlbmRzIG97Y29uc3RydWN0b3IoZSl7c3VwZXIoIlBhdHRlcm4iLG51bGwpLHRoaXMuYmFzZT1lfWlzRGVmYXVsdERlY29kZShlLHQpeygwLG4udW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgUGF0dGVybkNTLmlzRGVmYXVsdERlY29kZSIpfX1jbGFzcyBoIGV4dGVuZHMgb3tjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoIkluZGV4ZWQiLDEpLHRoaXMuYmFzZT1lLHRoaXMuaGlnaFZhbD10O2NvbnN0IGE9ZS5udW1Db21wcyp0O2lmKHRoaXMubG9va3VwPW5ldyBVaW50OEFycmF5KGEpLHIgaW5zdGFuY2VvZiBpLkJhc2VTdHJlYW0pe2NvbnN0IGU9ci5nZXRCeXRlcyhhKTt0aGlzLmxvb2t1cC5zZXQoZSl9ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkluZGV4ZWRDUyAtIHVucmVjb2duaXplZCBsb29rdXAgdGFibGU6ICIuY29uY2F0KHIpKTtmb3IobGV0IGU9MDtlPGE7KytlKXRoaXMubG9va3VwW2VdPTI1NSZyLmNoYXJDb2RlQXQoZSl9fWdldFJnYkl0ZW0oZSx0LHIsbil7Y29uc3QgYT10aGlzLmJhc2UubnVtQ29tcHMsaT1lW3RdKmE7dGhpcy5iYXNlLmdldFJnYkJ1ZmZlcih0aGlzLmxvb2t1cCxpLDEscixuLDgsMCl9Z2V0UmdiQnVmZmVyKGUsdCxyLG4sYSxpLHMpe2NvbnN0IG89dGhpcy5iYXNlLGM9by5udW1Db21wcyxsPW8uZ2V0T3V0cHV0TGVuZ3RoKGMscyksaD10aGlzLmxvb2t1cDtmb3IobGV0IGk9MDtpPHI7KytpKXtjb25zdCByPWVbdCsrXSpjO28uZ2V0UmdiQnVmZmVyKGgsciwxLG4sYSw4LHMpLGErPWx9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGUqdGhpcy5iYXNlLm51bUNvbXBzLHQpfWlzRGVmYXVsdERlY29kZShlLHQpe3JldHVybiFBcnJheS5pc0FycmF5KGUpfHwoMiE9PWUubGVuZ3RoPygoMCxuLndhcm4pKCJEZWNvZGUgbWFwIGxlbmd0aCBpcyBub3QgY29ycmVjdCIpLCEwKTohTnVtYmVyLmlzSW50ZWdlcih0KXx8dDwxPygoMCxuLndhcm4pKCJCaXRzIHBlciBjb21wb25lbnQgaXMgbm90IGNvcnJlY3QiKSwhMCk6MD09PWVbMF0mJmVbMV09PT0oMTw8dCktMSl9fWNsYXNzIHUgZXh0ZW5kcyBve2NvbnN0cnVjdG9yKCl7c3VwZXIoIkRldmljZUdyYXkiLDEpfWdldFJnYkl0ZW0oZSx0LHIsbil7Y29uc3QgYT0yNTUqZVt0XTtyW25dPXJbbisxXT1yW24rMl09YX1nZXRSZ2JCdWZmZXIoZSx0LHIsbixhLGkscyl7Y29uc3Qgbz0yNTUvKCgxPDxpKS0xKTtsZXQgYz10LGw9YTtmb3IobGV0IHQ9MDt0PHI7Kyt0KXtjb25zdCB0PW8qZVtjKytdO25bbCsrXT10LG5bbCsrXT10LG5bbCsrXT10LGwrPXN9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiBlKigzK3QpfX1jbGFzcyBkIGV4dGVuZHMgb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCJEZXZpY2VSR0IiLDMpfWdldFJnYkl0ZW0oZSx0LHIsbil7cltuXT0yNTUqZVt0XSxyW24rMV09MjU1KmVbdCsxXSxyW24rMl09MjU1KmVbdCsyXX1nZXRSZ2JCdWZmZXIoZSx0LHIsbixhLGkscyl7aWYoOD09PWkmJjA9PT1zKXJldHVybiB2b2lkIG4uc2V0KGUuc3ViYXJyYXkodCx0KzMqciksYSk7Y29uc3Qgbz0yNTUvKCgxPDxpKS0xKTtsZXQgYz10LGw9YTtmb3IobGV0IHQ9MDt0PHI7Kyt0KW5bbCsrXT1vKmVbYysrXSxuW2wrK109byplW2MrK10sbltsKytdPW8qZVtjKytdLGwrPXN9Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfWlzUGFzc3Rocm91Z2goZSl7cmV0dXJuIDg9PT1lfX1jb25zdCBmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQscixuLGEpe2NvbnN0IGk9ZVt0XSpyLHM9ZVt0KzFdKnIsbz1lW3QrMl0qcixjPWVbdCszXSpyO25bYV09MjU1K2kqKC00LjM4NzMzMjM4NDYwOTk4OCppKzU0LjQ4NjE1MTk0MTg5MTc2KnMrMTguODIyOTA1MDIxNjUzMDIqbysyMTIuMjU2NjI0NTE2Mzk1ODUqYy0yODUuMjMzMTAyNjEzNzAwNCkrcyooMS43MTQ5NzYzNDc3MzYyMTM0KnMtNS42MDk2NzM2OTA0MDQ3MzE1Km8rLTE3Ljg3Mzg3MDg2MTQxNTQ0NCpjLTUuNDk3MDA2NDI3MTk2MzY2KStvKigtMi41MjE3MzQwMTMxNjgzMDMzKm8tMjEuMjQ4OTIzMzM3MzUzMDczKmMrMTcuNTExOTI3MDg0MTgxMykrYyooLTIxLjg2MTIyMTQ3NDYzNjA1KmMtMTg5LjQ4MTgwODM1OTIyNzQ3KSxuW2ErMV09MjU1K2kqKDguODQxMDQxNDIyMDM2MTQ5KmkrNjAuMTE4MDI3MDQ1NTk3MzY2KnMrNi44NzE0MjU1OTIwNDkwMDcqbyszMS4xNTkxMDAxMzAwNTU5MjIqYy03OS4yOTcwODQ0ODE2NTQ4KStzKigtMTUuMzEwMzYxMzA2OTY3ODE3KnMrMTcuNTc1MjUxMjYxMTA5NDgyKm8rMTMxLjM1MjUwOTEyNDkzOTc2KmMtMTkwLjk0NTMzMDI1ODg5NTEpK28qKDQuNDQ0MzM5MTAyODUyNzM5Km8rOS44NjMyODYxNDkzNDA1KmMtMjQuODY3NDE1ODI1NTU4NzgpK2MqKC0yMC43MzczMjU0NzExODEwMzQqYy0xODcuODA0NTM3MDk3MTk1NzgpLG5bYSsyXT0yNTUraSooLjg4NDI1MjI0MzAwMDMyOTYqaSs4LjA3ODY3NzUwMzExMjkyOCpzKzMwLjg5OTc4MzA5NzAzNzI5Km8tLjIzODgzMjM4Njg5MTc4OTM0KmMtMTQuMTgzNTc2Nzk5NjczMjg2KStzKigxMC40OTU5MzI3MzQzMjA3MipzKzYzLjAyMzc4NDk0NzU0MDUyKm8rNTAuNjA2OTU3NjU2MzYwNzM0KmMtMTEyLjIzODg0MjUzNzE5MjQ4KStvKiguMDMyOTYwNDExMTQ4NzMyMTcqbysxMTUuNjAzODQ0NDk2NDY2NDEqYy0xOTMuNTgyMDkzNTY4NjE1MDUpK2MqKC0yMi4zMzgxNjgwNzMwOTg4NipjLTE4MC4xMjYxMzk3NDcwODM2Nyl9cmV0dXJuIGNsYXNzIGV4dGVuZHMgb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCJEZXZpY2VDTVlLIiw0KX1nZXRSZ2JJdGVtKHQscixuLGEpe2UodCxyLDEsbixhKX1nZXRSZ2JCdWZmZXIodCxyLG4sYSxpLHMsbyl7Y29uc3QgYz0xLygoMTw8cyktMSk7Zm9yKGxldCBzPTA7czxuO3MrKyllKHQscixjLGEsaSkscis9NCxpKz0zK299Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUvNCooMyt0KXwwfX19KCksZz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LHIsbixhLGkpe2NvbnN0IHM9KHRbcl0qaSkqKmUuRyxvPWUuWVcqcyxjPU1hdGgubWF4KDI5NS44Km8qKi4zMzMzMzMzMzMzMzMzMzMzLTQwLjgsMCk7blthXT1jLG5bYSsxXT1jLG5bYSsyXT1jfXJldHVybiBjbGFzcyBleHRlbmRzIG97Y29uc3RydWN0b3IoZSx0LHIpe2lmKHN1cGVyKCJDYWxHcmF5IiwxKSwhZSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXkiKTtpZih0fHwodD1bMCwwLDBdKSxyfHwocj0xKSx0aGlzLlhXPWVbMF0sdGhpcy5ZVz1lWzFdLHRoaXMuWlc9ZVsyXSx0aGlzLlhCPXRbMF0sdGhpcy5ZQj10WzFdLHRoaXMuWkI9dFsyXSx0aGlzLkc9cix0aGlzLlhXPDB8fHRoaXMuWlc8MHx8MSE9PXRoaXMuWVcpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAiLmNvbmNhdCh0aGlzLm5hbWUsIiwgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIikpOyh0aGlzLlhCPDB8fHRoaXMuWUI8MHx8dGhpcy5aQjwwKSYmKCgwLG4uaW5mbykoIkludmFsaWQgQmxhY2tQb2ludCBmb3IgIi5jb25jYXQodGhpcy5uYW1lLCIsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpKSx0aGlzLlhCPXRoaXMuWUI9dGhpcy5aQj0wKSwwPT09dGhpcy5YQiYmMD09PXRoaXMuWUImJjA9PT10aGlzLlpCfHwoMCxuLndhcm4pKCIiLmNvbmNhdCh0aGlzLm5hbWUsIiwgQmxhY2tQb2ludDogWEI6ICIpLmNvbmNhdCh0aGlzLlhCLCIsIFlCOiAiKS5jb25jYXQodGhpcy5ZQiwiLCBaQjogIikuY29uY2F0KHRoaXMuWkIsIiwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLiIpKSx0aGlzLkc8MSYmKCgwLG4uaW5mbykoIkludmFsaWQgR2FtbWE6ICIuY29uY2F0KHRoaXMuRywiIGZvciAiKS5jb25jYXQodGhpcy5uYW1lLCIsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpKSx0aGlzLkc9MSl9Z2V0UmdiSXRlbSh0LHIsbixhKXtlKHRoaXMsdCxyLG4sYSwxKX1nZXRSZ2JCdWZmZXIodCxyLG4sYSxpLHMsbyl7Y29uc3QgYz0xLygoMTw8cyktMSk7Zm9yKGxldCBzPTA7czxuOysrcyllKHRoaXMsdCxyLGEsaSxjKSxyKz0xLGkrPTMrb31nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZSooMyt0KX19fSgpLHA9ZnVuY3Rpb24oKXtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkoWy44OTUxLC4yNjY0LC0uMTYxNCwtLjc1MDIsMS43MTM1LC4wMzY3LC4wMzg5LC0uMDY4NSwxLjAyOTZdKSx0PW5ldyBGbG9hdDMyQXJyYXkoWy45ODY5OTI5LC0uMTQ3MDU0MywuMTU5OTYyNywuNDMyMzA1MywuNTE4MzYwMywuMDQ5MjkxMiwtLjAwODUyODcsLjA0MDA0MjgsLjk2ODQ4NjddKSxyPW5ldyBGbG9hdDMyQXJyYXkoWzMuMjQwNDU0MiwtMS41MzcxMzg1LC0uNDk4NTMxNCwtLjk2OTI2NiwxLjg3NjAxMDgsLjA0MTU1NiwuMDU1NjQzNCwtLjIwNDAyNTksMS4wNTcyMjUyXSksYT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMV0pLGk9bmV3IEZsb2F0MzJBcnJheSgzKSxzPW5ldyBGbG9hdDMyQXJyYXkoMyksYz1uZXcgRmxvYXQzMkFycmF5KDMpLGw9KDI0LzExNikqKjMvODtmdW5jdGlvbiBoKGUsdCxyKXtyWzBdPWVbMF0qdFswXStlWzFdKnRbMV0rZVsyXSp0WzJdLHJbMV09ZVszXSp0WzBdK2VbNF0qdFsxXStlWzVdKnRbMl0sclsyXT1lWzZdKnRbMF0rZVs3XSp0WzFdK2VbOF0qdFsyXX1mdW5jdGlvbiB1KGUpe3JldHVybiBlPD0uMDAzMTMwOD9kKDAsMSwxMi45MiplKTplPj0uOTk1NTQ1MjU/MTpkKDAsMSwxLjA1NSplKiooMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIGQoZSx0LHIpe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKHQscikpfWZ1bmN0aW9uIGYoZSl7cmV0dXJuIGU8MD8tZigtZSk6ZT44PygoZSsxNikvMTE2KSoqMzplKmx9ZnVuY3Rpb24gZyhuLG8sbCxnLHAsbSl7Y29uc3QgYj1kKDAsMSxvW2xdKm0pLHk9ZCgwLDEsb1tsKzFdKm0pLHc9ZCgwLDEsb1tsKzJdKm0pLHY9MT09PWI/MTpiKipuLkdSLHg9MT09PXk/MTp5KipuLkdHLFM9MT09PXc/MTp3KipuLkdCLEE9bi5NWEEqdituLk1YQip4K24uTVhDKlMsaz1uLk1ZQSp2K24uTVlCKngrbi5NWUMqUyxDPW4uTVpBKnYrbi5NWkIqeCtuLk1aQypTLE89cztPWzBdPUEsT1sxXT1rLE9bMl09Qztjb25zdCBGPWM7IWZ1bmN0aW9uKHIsbixhKXtpZigxPT09clswXSYmMT09PXJbMl0pcmV0dXJuIGFbMF09blswXSxhWzFdPW5bMV0sdm9pZChhWzJdPW5bMl0pO2NvbnN0IHM9YTtoKGUsbixzKTtjb25zdCBvPWk7IWZ1bmN0aW9uKGUsdCxyKXtyWzBdPTEqdFswXS9lWzBdLHJbMV09MSp0WzFdL2VbMV0sclsyXT0xKnRbMl0vZVsyXX0ocixzLG8pLGgodCxvLGEpfShuLndoaXRlUG9pbnQsTyxGKTtjb25zdCBJPXM7IWZ1bmN0aW9uKGUsdCxyKXtpZigwPT09ZVswXSYmMD09PWVbMV0mJjA9PT1lWzJdKXJldHVybiByWzBdPXRbMF0sclsxXT10WzFdLHZvaWQoclsyXT10WzJdKTtjb25zdCBuPWYoMCksYT0oMS1uKS8oMS1mKGVbMF0pKSxpPTEtYSxzPSgxLW4pLygxLWYoZVsxXSkpLG89MS1zLGM9KDEtbikvKDEtZihlWzJdKSksbD0xLWM7clswXT10WzBdKmEraSxyWzFdPXRbMV0qcytvLHJbMl09dFsyXSpjK2x9KG4uYmxhY2tQb2ludCxGLEkpO2NvbnN0IFQ9YzshZnVuY3Rpb24ocixuLGEpe2NvbnN0IHM9YTtoKGUsbixzKTtjb25zdCBvPWk7IWZ1bmN0aW9uKGUsdCxyKXtyWzBdPS45NTA0Nyp0WzBdL2VbMF0sclsxXT0xKnRbMV0vZVsxXSxyWzJdPTEuMDg4ODMqdFsyXS9lWzJdfShyLHMsbyksaCh0LG8sYSl9KGEsSSxUKTtjb25zdCBNPXM7aChyLFQsTSksZ1twXT0yNTUqdShNWzBdKSxnW3ArMV09MjU1KnUoTVsxXSksZ1twKzJdPTI1NSp1KE1bMl0pfXJldHVybiBjbGFzcyBleHRlbmRzIG97Y29uc3RydWN0b3IoZSx0LHIsYSl7aWYoc3VwZXIoIkNhbFJHQiIsMyksIWUpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxSR0IiKTt0fHwodD1uZXcgRmxvYXQzMkFycmF5KDMpKSxyfHwocj1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMV0pKSxhfHwoYT1uZXcgRmxvYXQzMkFycmF5KFsxLDAsMCwwLDEsMCwwLDAsMV0pKTtjb25zdCBpPWVbMF0scz1lWzFdLG89ZVsyXTt0aGlzLndoaXRlUG9pbnQ9ZTtjb25zdCBjPXRbMF0sbD10WzFdLGg9dFsyXTtpZih0aGlzLmJsYWNrUG9pbnQ9dCx0aGlzLkdSPXJbMF0sdGhpcy5HRz1yWzFdLHRoaXMuR0I9clsyXSx0aGlzLk1YQT1hWzBdLHRoaXMuTVlBPWFbMV0sdGhpcy5NWkE9YVsyXSx0aGlzLk1YQj1hWzNdLHRoaXMuTVlCPWFbNF0sdGhpcy5NWkI9YVs1XSx0aGlzLk1YQz1hWzZdLHRoaXMuTVlDPWFbN10sdGhpcy5NWkM9YVs4XSxpPDB8fG88MHx8MSE9PXMpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAiLmNvbmNhdCh0aGlzLm5hbWUsIiwgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIikpOyhjPDB8fGw8MHx8aDwwKSYmKCgwLG4uaW5mbykoIkludmFsaWQgQmxhY2tQb2ludCBmb3IgIi5jb25jYXQodGhpcy5uYW1lLCIgWyIpLmNvbmNhdChjLCIsICIpLmNvbmNhdChsLCIsICIpLmNvbmNhdChoLCJdLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC4iKSksdGhpcy5ibGFja1BvaW50PW5ldyBGbG9hdDMyQXJyYXkoMykpLCh0aGlzLkdSPDB8fHRoaXMuR0c8MHx8dGhpcy5HQjwwKSYmKCgwLG4uaW5mbykoIkludmFsaWQgR2FtbWEgWyIuY29uY2F0KHRoaXMuR1IsIiwgIikuY29uY2F0KHRoaXMuR0csIiwgIikuY29uY2F0KHRoaXMuR0IsIl0gZm9yICIpLmNvbmNhdCh0aGlzLm5hbWUsIiwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuIikpLHRoaXMuR1I9dGhpcy5HRz10aGlzLkdCPTEpfWdldFJnYkl0ZW0oZSx0LHIsbil7Zyh0aGlzLGUsdCxyLG4sMSl9Z2V0UmdiQnVmZmVyKGUsdCxyLG4sYSxpLHMpe2NvbnN0IG89MS8oKDE8PGkpLTEpO2ZvcihsZXQgaT0wO2k8cjsrK2kpZyh0aGlzLGUsdCxuLGEsbyksdCs9MyxhKz0zK3N9Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfX19KCksbT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGU+PTYvMjk/ZSoqMzoxMDgvODQxKihlLTQvMjkpfWZ1bmN0aW9uIHQoZSx0LHIsbil7cmV0dXJuIHIrZSoobi1yKS90fWZ1bmN0aW9uIHIocixuLGEsaSxzLG8pe2xldCBjPW5bYV0sbD1uW2ErMV0saD1uW2ErMl07ITEhPT1pJiYoYz10KGMsaSwwLDEwMCksbD10KGwsaSxyLmFtaW4sci5hbWF4KSxoPXQoaCxpLHIuYm1pbixyLmJtYXgpKSxsPnIuYW1heD9sPXIuYW1heDpsPHIuYW1pbiYmKGw9ci5hbWluKSxoPnIuYm1heD9oPXIuYm1heDpoPHIuYm1pbiYmKGg9ci5ibWluKTtjb25zdCB1PShjKzE2KS8xMTYsZD11K2wvNTAwLGY9dS1oLzIwMCxnPXIuWFcqZShkKSxwPXIuWVcqZSh1KSxtPXIuWlcqZShmKTtsZXQgYix5LHc7ci5aVzwxPyhiPTMuMTMzOSpnKy0xLjYxNypwKy0uNDkwNiptLHk9LS45Nzg1KmcrMS45MTYqcCsuMDMzMyptLHc9LjA3MipnKy0uMjI5KnArMS40MDU3Km0pOihiPTMuMjQwNipnKy0xLjUzNzIqcCstLjQ5ODYqbSx5PS0uOTY4OSpnKzEuODc1OCpwKy4wNDE1Km0sdz0uMDU1NypnKy0uMjA0KnArMS4wNTcqbSksc1tvXT0yNTUqTWF0aC5zcXJ0KGIpLHNbbysxXT0yNTUqTWF0aC5zcXJ0KHkpLHNbbysyXT0yNTUqTWF0aC5zcXJ0KHcpfXJldHVybiBjbGFzcyBleHRlbmRzIG97Y29uc3RydWN0b3IoZSx0LHIpe2lmKHN1cGVyKCJMYWIiLDMpLCFlKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgTGFiIik7aWYodHx8KHQ9WzAsMCwwXSkscnx8KHI9Wy0xMDAsMTAwLC0xMDAsMTAwXSksdGhpcy5YVz1lWzBdLHRoaXMuWVc9ZVsxXSx0aGlzLlpXPWVbMl0sdGhpcy5hbWluPXJbMF0sdGhpcy5hbWF4PXJbMV0sdGhpcy5ibWluPXJbMl0sdGhpcy5ibWF4PXJbM10sdGhpcy5YQj10WzBdLHRoaXMuWUI9dFsxXSx0aGlzLlpCPXRbMl0sdGhpcy5YVzwwfHx0aGlzLlpXPDB8fDEhPT10aGlzLllXKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cywgbm8gZmFsbGJhY2sgYXZhaWxhYmxlIik7KHRoaXMuWEI8MHx8dGhpcy5ZQjwwfHx0aGlzLlpCPDApJiYoKDAsbi5pbmZvKSgiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCIpLHRoaXMuWEI9dGhpcy5ZQj10aGlzLlpCPTApLCh0aGlzLmFtaW4+dGhpcy5hbWF4fHx0aGlzLmJtaW4+dGhpcy5ibWF4KSYmKCgwLG4uaW5mbykoIkludmFsaWQgUmFuZ2UsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0cyIpLHRoaXMuYW1pbj0tMTAwLHRoaXMuYW1heD0xMDAsdGhpcy5ibWluPS0xMDAsdGhpcy5ibWF4PTEwMCl9Z2V0UmdiSXRlbShlLHQsbixhKXtyKHRoaXMsZSx0LCExLG4sYSl9Z2V0UmdiQnVmZmVyKGUsdCxuLGEsaSxzLG8pe2NvbnN0IGM9KDE8PHMpLTE7Zm9yKGxldCBzPTA7czxuO3MrKylyKHRoaXMsZSx0LGMsYSxpKSx0Kz0zLGkrPTMrb31nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZSooMyt0KS8zfDB9aXNEZWZhdWx0RGVjb2RlKGUsdCl7cmV0dXJuITB9Z2V0IHVzZXNaZXJvVG9PbmVSYW5nZSgpe3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJ1c2VzWmVyb1RvT25lUmFuZ2UiLCExKX19fSgpfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuUGFydGlhbEV2YWx1YXRvcj10LkV2YWx1YXRvclByZXByb2Nlc3Nvcj12b2lkIDAscigxMzkpLHIoMikscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTE2KSxyKDEyNikscigxMjgpLHIoMTMxKSxyKDEzMykscigxMzUpLHIoMTM3KSxyKDE1NykscigxNTkpO3ZhciBuPXIoMTQ0KSxhPXIoMTY0KSxzPXIoMTUwKSxvPXIoMTg0KSxjPXIoMTg3KSxsPXIoMTkxKSxoPXIoMjAwKSx1PXIoMjAxKSxkPXIoMTkyKSxmPXIoMjA3KSxnPXIoMTY2KSxwPXIoMjA5KSxtPXIoMTU0KSxiPXIoMTUxKSx5PXIoMjEwKSx3PXIoMTYyKSx2PXIoMTY4KSx4PXIoMTg4KSxTPXIoMjExKSxBPXIoMTg5KSxrPXIoMTQ5KSxDPXIoMTk1KSxPPXIoMTkwKSxGPXIoMjEyKSxJPXIoMjEzKSxUPXIoMjE0KSxNPXIoMjE1KTtjb25zdCBFPU9iamVjdC5mcmVlemUoe21heEltYWdlU2l6ZTotMSxkaXNhYmxlRm9udEZhY2U6ITEsaWdub3JlRXJyb3JzOiExLGlzRXZhbFN1cHBvcnRlZDohMCxpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDohMSxjYW52YXNNYXhBcmVhSW5CeXRlczotMSxmb250RXh0cmFQcm9wZXJ0aWVzOiExLHVzZVN5c3RlbUZvbnRzOiEwLGNNYXBVcmw6bnVsbCxzdGFuZGFyZEZvbnREYXRhVXJsOm51bGx9KSxQPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIFIoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPVIodCwhMCk7aWYoZSlyZXR1cm4gZX1yZXR1cm4oMCxuLndhcm4pKCJVbnN1cHBvcnRlZCBibGVuZCBtb2RlIEFycmF5OiAiLmNvbmNhdChlKSksInNvdXJjZS1vdmVyIn1pZighKGUgaW5zdGFuY2VvZiBzLk5hbWUpKXJldHVybiB0P251bGw6InNvdXJjZS1vdmVyIjtzd2l0Y2goZS5uYW1lKXtjYXNlIk5vcm1hbCI6Y2FzZSJDb21wYXRpYmxlIjpyZXR1cm4ic291cmNlLW92ZXIiO2Nhc2UiTXVsdGlwbHkiOnJldHVybiJtdWx0aXBseSI7Y2FzZSJTY3JlZW4iOnJldHVybiJzY3JlZW4iO2Nhc2UiT3ZlcmxheSI6cmV0dXJuIm92ZXJsYXkiO2Nhc2UiRGFya2VuIjpyZXR1cm4iZGFya2VuIjtjYXNlIkxpZ2h0ZW4iOnJldHVybiJsaWdodGVuIjtjYXNlIkNvbG9yRG9kZ2UiOnJldHVybiJjb2xvci1kb2RnZSI7Y2FzZSJDb2xvckJ1cm4iOnJldHVybiJjb2xvci1idXJuIjtjYXNlIkhhcmRMaWdodCI6cmV0dXJuImhhcmQtbGlnaHQiO2Nhc2UiU29mdExpZ2h0IjpyZXR1cm4ic29mdC1saWdodCI7Y2FzZSJEaWZmZXJlbmNlIjpyZXR1cm4iZGlmZmVyZW5jZSI7Y2FzZSJFeGNsdXNpb24iOnJldHVybiJleGNsdXNpb24iO2Nhc2UiSHVlIjpyZXR1cm4iaHVlIjtjYXNlIlNhdHVyYXRpb24iOnJldHVybiJzYXR1cmF0aW9uIjtjYXNlIkNvbG9yIjpyZXR1cm4iY29sb3IiO2Nhc2UiTHVtaW5vc2l0eSI6cmV0dXJuImx1bWlub3NpdHkifXJldHVybiB0P251bGw6KCgwLG4ud2FybikoIlVuc3VwcG9ydGVkIGJsZW5kIG1vZGU6ICIuY29uY2F0KGUubmFtZSkpLCJzb3VyY2Utb3ZlciIpfWZ1bmN0aW9uIE4oZSl7dmFyIHQ7ZS5mbj09PW4uT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCYmKG51bGw9PT0odD1lLmFyZ3NbMF0pfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmNvdW50KT4wJiZlLmFyZ3NbMF0uY291bnQrK31jbGFzcyBEe2NvbnN0cnVjdG9yKCl7dGhpcy5yZXNldCgpfWNoZWNrKCl7cmV0dXJuISgrK3RoaXMuY2hlY2tlZDxELkNIRUNLX1RJTUVfRVZFUlkpJiYodGhpcy5jaGVja2VkPTAsdGhpcy5lbmRUaW1lPD1EYXRlLm5vdygpKX1yZXNldCgpe3RoaXMuZW5kVGltZT1EYXRlLm5vdygpK0QuVElNRV9TTE9UX0RVUkFUSU9OX01TLHRoaXMuY2hlY2tlZD0wfX1pKEQsIlRJTUVfU0xPVF9EVVJBVElPTl9NUyIsMjApLGkoRCwiQ0hFQ0tfVElNRV9FVkVSWSIsMTAwKTtjbGFzcyBCe2NvbnN0cnVjdG9yKGUpe2xldHt4cmVmOnQsaGFuZGxlcjpyLHBhZ2VJbmRleDpuLGlkRmFjdG9yeTphLGZvbnRDYWNoZTppLGJ1aWx0SW5DTWFwQ2FjaGU6cyxzdGFuZGFyZEZvbnREYXRhQ2FjaGU6byxnbG9iYWxJbWFnZUNhY2hlOmMsc3lzdGVtRm9udENhY2hlOmwsb3B0aW9uczpoPW51bGx9PWU7dGhpcy54cmVmPXQsdGhpcy5oYW5kbGVyPXIsdGhpcy5wYWdlSW5kZXg9bix0aGlzLmlkRmFjdG9yeT1hLHRoaXMuZm9udENhY2hlPWksdGhpcy5idWlsdEluQ01hcENhY2hlPXMsdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGU9byx0aGlzLmdsb2JhbEltYWdlQ2FjaGU9Yyx0aGlzLnN5c3RlbUZvbnRDYWNoZT1sLHRoaXMub3B0aW9ucz1ofHxFLHRoaXMucGFyc2luZ1R5cGUzRm9udD0hMSx0aGlzLl9yZWdpb25hbEltYWdlQ2FjaGU9bmV3IHAuUmVnaW9uYWxJbWFnZUNhY2hlLHRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZD10aGlzLmZldGNoQnVpbHRJbkNNYXAuYmluZCh0aGlzKSxGLkltYWdlUmVzaXplci5zZXRNYXhBcmVhKHRoaXMub3B0aW9ucy5jYW52YXNNYXhBcmVhSW5CeXRlcyl9Z2V0IF9wZGZGdW5jdGlvbkZhY3RvcnkoKXtjb25zdCBlPW5ldyBmLlBERkZ1bmN0aW9uRmFjdG9yeSh7eHJlZjp0aGlzLnhyZWYsaXNFdmFsU3VwcG9ydGVkOnRoaXMub3B0aW9ucy5pc0V2YWxTdXBwb3J0ZWR9KTtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiX3BkZkZ1bmN0aW9uRmFjdG9yeSIsZSl9Y2xvbmUoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDtjb25zdCB0PU9iamVjdC5jcmVhdGUodGhpcyk7cmV0dXJuIHQub3B0aW9ucz1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5vcHRpb25zLGUpLHR9aGFzQmxlbmRNb2RlcyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHMuRGljdCkpcmV0dXJuITE7aWYoZS5vYmpJZCYmdC5oYXMoZS5vYmpJZCkpcmV0dXJuITE7Y29uc3Qgcj1uZXcgcy5SZWZTZXQodCk7ZS5vYmpJZCYmci5wdXQoZS5vYmpJZCk7Y29uc3QgYT1bZV0saT10aGlzLnhyZWY7Zm9yKDthLmxlbmd0aDspe2NvbnN0IGU9YS5zaGlmdCgpLG89ZS5nZXQoIkV4dEdTdGF0ZSIpO2lmKG8gaW5zdGFuY2VvZiBzLkRpY3QpZm9yKGxldCBlIG9mIG8uZ2V0UmF3VmFsdWVzKCkpe2lmKGUgaW5zdGFuY2VvZiBzLlJlZil7aWYoci5oYXMoZSkpY29udGludWU7dHJ5e2U9aS5mZXRjaChlKX1jYXRjaCh0KXtyLnB1dChlKSwoMCxuLmluZm8pKCdoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJy5jb25jYXQodCwnIi4nKSk7Y29udGludWV9fWlmKCEoZSBpbnN0YW5jZW9mIHMuRGljdCkpY29udGludWU7ZS5vYmpJZCYmci5wdXQoZS5vYmpJZCk7Y29uc3QgYT1lLmdldCgiQk0iKTtpZihhIGluc3RhbmNlb2Ygcy5OYW1lKXtpZigiTm9ybWFsIiE9PWEubmFtZSlyZXR1cm4hMH1lbHNlIGlmKHZvaWQgMCE9PWEmJkFycmF5LmlzQXJyYXkoYSkpZm9yKGNvbnN0IGUgb2YgYSlpZihlIGluc3RhbmNlb2Ygcy5OYW1lJiYiTm9ybWFsIiE9PWUubmFtZSlyZXR1cm4hMH1jb25zdCBjPWUuZ2V0KCJYT2JqZWN0Iik7aWYoYyBpbnN0YW5jZW9mIHMuRGljdClmb3IobGV0IGUgb2YgYy5nZXRSYXdWYWx1ZXMoKSl7aWYoZSBpbnN0YW5jZW9mIHMuUmVmKXtpZihyLmhhcyhlKSljb250aW51ZTt0cnl7ZT1pLmZldGNoKGUpfWNhdGNoKHQpe3IucHV0KGUpLCgwLG4uaW5mbykoJ2hhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBYT2JqZWN0OiAiJy5jb25jYXQodCwnIi4nKSk7Y29udGludWV9fWlmKCEoZSBpbnN0YW5jZW9mIGIuQmFzZVN0cmVhbSkpY29udGludWU7ZS5kaWN0Lm9iaklkJiZyLnB1dChlLmRpY3Qub2JqSWQpO2NvbnN0IG89ZS5kaWN0LmdldCgiUmVzb3VyY2VzIik7IShvIGluc3RhbmNlb2Ygcy5EaWN0KXx8by5vYmpJZCYmci5oYXMoby5vYmpJZCl8fChhLnB1c2gobyksby5vYmpJZCYmci5wdXQoby5vYmpJZCkpfX1mb3IoY29uc3QgZSBvZiByKXQucHV0KGUpO3JldHVybiExfWFzeW5jIGZldGNoQnVpbHRJbkNNYXAoZSl7Y29uc3QgdD10aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuZ2V0KGUpO2lmKHQpcmV0dXJuIHQ7bGV0IHI7aWYobnVsbCE9PXRoaXMub3B0aW9ucy5jTWFwVXJsKXtjb25zdCB0PSIiLmNvbmNhdCh0aGlzLm9wdGlvbnMuY01hcFVybCkuY29uY2F0KGUsIi5iY21hcCIpLGE9YXdhaXQgZmV0Y2godCk7aWYoIWEub2spdGhyb3cgbmV3IEVycm9yKCdmZXRjaEJ1aWx0SW5DTWFwOiBmYWlsZWQgdG8gZmV0Y2ggZmlsZSAiJy5jb25jYXQodCwnIiB3aXRoICInKS5jb25jYXQoYS5zdGF0dXNUZXh0LCciLicpKTtyPXtjTWFwRGF0YTpuZXcgVWludDhBcnJheShhd2FpdCBhLmFycmF5QnVmZmVyKCkpLGNvbXByZXNzaW9uVHlwZTpuLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZfX1lbHNlIHI9YXdhaXQgdGhpcy5oYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hCdWlsdEluQ01hcCIse25hbWU6ZX0pO3JldHVybiByLmNvbXByZXNzaW9uVHlwZSE9PW4uQ01hcENvbXByZXNzaW9uVHlwZS5OT05FJiZ0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuc2V0KGUscikscn1hc3luYyBmZXRjaFN0YW5kYXJkRm9udERhdGEoZSl7Y29uc3QgdD10aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5nZXQoZSk7aWYodClyZXR1cm4gbmV3IG0uU3RyZWFtKHQpO2lmKHRoaXMub3B0aW9ucy51c2VTeXN0ZW1Gb250cyYmIlN5bWJvbCIhPT1lJiYiWmFwZkRpbmdiYXRzIiE9PWUpcmV0dXJuIG51bGw7Y29uc3Qgcj0oMCxsLmdldEZvbnROYW1lVG9GaWxlTWFwKSgpW2VdO2xldCBhO2lmKG51bGwhPT10aGlzLm9wdGlvbnMuc3RhbmRhcmRGb250RGF0YVVybCl7Y29uc3QgZT0iIi5jb25jYXQodGhpcy5vcHRpb25zLnN0YW5kYXJkRm9udERhdGFVcmwpLmNvbmNhdChyKSx0PWF3YWl0IGZldGNoKGUpO3Qub2s/YT1hd2FpdCB0LmFycmF5QnVmZmVyKCk6KDAsbi53YXJuKSgnZmV0Y2hTdGFuZGFyZEZvbnREYXRhOiBmYWlsZWQgdG8gZmV0Y2ggZmlsZSAiJy5jb25jYXQoZSwnIiB3aXRoICInKS5jb25jYXQodC5zdGF0dXNUZXh0LCciLicpKX1lbHNlIHRyeXthPWF3YWl0IHRoaXMuaGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkZldGNoU3RhbmRhcmRGb250RGF0YSIse2ZpbGVuYW1lOnJ9KX1jYXRjaChlKXsoMCxuLndhcm4pKCdmZXRjaFN0YW5kYXJkRm9udERhdGE6IGZhaWxlZCB0byBmZXRjaCBmaWxlICInLmNvbmNhdChyLCciIHdpdGggIicpLmNvbmNhdChlLCciLicpKX1yZXR1cm4gYT8odGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUuc2V0KGUsYSksbmV3IG0uU3RyZWFtKGEpKTpudWxsfWFzeW5jIGJ1aWxkRm9ybVhPYmplY3QoZSx0LHIsYSxpLG8sYyl7Y29uc3QgbD10LmRpY3QsaD1sLmdldEFycmF5KCJNYXRyaXgiKTtsZXQgdSxkLGY9bC5nZXRBcnJheSgiQkJveCIpO2Y9QXJyYXkuaXNBcnJheShmKSYmND09PWYubGVuZ3RoP24uVXRpbC5ub3JtYWxpemVSZWN0KGYpOm51bGwsbC5oYXMoIk9DIikmJih1PWF3YWl0IHRoaXMucGFyc2VNYXJrZWRDb250ZW50UHJvcHMobC5nZXQoIk9DIiksZSkpLHZvaWQgMCE9PXUmJmEuYWRkT3Aobi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsWyJPQyIsdV0pO2NvbnN0IGc9bC5nZXQoIkdyb3VwIik7aWYoZyl7ZD17bWF0cml4OmgsYmJveDpmLHNtYXNrOnIsaXNvbGF0ZWQ6ITEsa25vY2tvdXQ6ITF9O2NvbnN0IHQ9Zy5nZXQoIlMiKTtsZXQgaT1udWxsO2lmKCgwLHMuaXNOYW1lKSh0LCJUcmFuc3BhcmVuY3kiKSYmKGQuaXNvbGF0ZWQ9Zy5nZXQoIkkiKXx8ITEsZC5rbm9ja291dD1nLmdldCgiSyIpfHwhMSxnLmhhcygiQ1MiKSkpe2NvbnN0IHQ9Zy5nZXRSYXcoIkNTIik7aT13LkNvbG9yU3BhY2UuZ2V0Q2FjaGVkKHQsdGhpcy54cmVmLGMpfHxhd2FpdCB0aGlzLnBhcnNlQ29sb3JTcGFjZSh7Y3M6dCxyZXNvdXJjZXM6ZSxsb2NhbENvbG9yU3BhY2VDYWNoZTpjfSl9bnVsbCE9ciYmci5iYWNrZHJvcCYmKGl8fChpPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYiksci5iYWNrZHJvcD1pLmdldFJnYihyLmJhY2tkcm9wLDApKSxhLmFkZE9wKG4uT1BTLmJlZ2luR3JvdXAsW2RdKX1jb25zdCBwPWc/W2gsbnVsbF06W2gsZl07cmV0dXJuIGEuYWRkT3Aobi5PUFMucGFpbnRGb3JtWE9iamVjdEJlZ2luLHApLHRoaXMuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06dCx0YXNrOmkscmVzb3VyY2VzOmwuZ2V0KCJSZXNvdXJjZXMiKXx8ZSxvcGVyYXRvckxpc3Q6YSxpbml0aWFsU3RhdGU6b30pLnRoZW4oKGZ1bmN0aW9uKCl7YS5hZGRPcChuLk9QUy5wYWludEZvcm1YT2JqZWN0RW5kLFtdKSxnJiZhLmFkZE9wKG4uT1BTLmVuZEdyb3VwLFtkXSksdm9pZCAwIT09dSYmYS5hZGRPcChuLk9QUy5lbmRNYXJrZWRDb250ZW50LFtdKX0pKX1fc2VuZEltZ0RhdGEoZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO2NvbnN0IG49dD9bdC5iaXRtYXB8fHQuZGF0YS5idWZmZXJdOm51bGw7cmV0dXJuIHRoaXMucGFyc2luZ1R5cGUzRm9udHx8cj90aGlzLmhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIixbZSwiSW1hZ2UiLHRdLG4pOnRoaXMuaGFuZGxlci5zZW5kKCJvYmoiLFtlLHRoaXMucGFnZUluZGV4LCJJbWFnZSIsdF0sbil9YXN5bmMgYnVpbGRQYWludEltYWdlWE9iamVjdChlKXtsZXR7cmVzb3VyY2VzOnQsaW1hZ2U6cixpc0lubGluZTphPSExLG9wZXJhdG9yTGlzdDppLGNhY2hlS2V5OnMsbG9jYWxJbWFnZUNhY2hlOm8sbG9jYWxDb2xvclNwYWNlQ2FjaGU6Y309ZTtjb25zdCBsPXIuZGljdCxoPWwub2JqSWQsdT1sLmdldCgiVyIsIldpZHRoIiksZD1sLmdldCgiSCIsIkhlaWdodCIpO2lmKCF1fHwibnVtYmVyIiE9dHlwZW9mIHV8fCFkfHwibnVtYmVyIiE9dHlwZW9mIGQpcmV0dXJuIHZvaWQoMCxuLndhcm4pKCJJbWFnZSBkaW1lbnNpb25zIGFyZSBtaXNzaW5nLCBvciBub3QgbnVtYmVycy4iKTtjb25zdCBmPXRoaXMub3B0aW9ucy5tYXhJbWFnZVNpemU7aWYoLTEhPT1mJiZ1KmQ+Zil7Y29uc3QgZT0iSW1hZ2UgZXhjZWVkZWQgbWF4aW11bSBhbGxvd2VkIHNpemUgYW5kIHdhcyByZW1vdmVkLiI7aWYodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycylyZXR1cm4gdm9pZCgwLG4ud2FybikoZSk7dGhyb3cgbmV3IEVycm9yKGUpfWxldCBnLHAsbTtpZihsLmhhcygiT0MiKSYmKGc9YXdhaXQgdGhpcy5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhsLmdldCgiT0MiKSx0KSksbC5nZXQoIklNIiwiSW1hZ2VNYXNrIikpe2NvbnN0IGU9bC5nZXQoIkkiLCJJbnRlcnBvbGF0ZSIpLHQ9dSs3Pj4zLGE9ci5nZXRCeXRlcyh0KmQpLGM9bC5nZXRBcnJheSgiRCIsIkRlY29kZSIpO2lmKHRoaXMucGFyc2luZ1R5cGUzRm9udCl7aWYocD1NLlBERkltYWdlLmNyZWF0ZVJhd01hc2soe2ltZ0FycmF5OmEsd2lkdGg6dSxoZWlnaHQ6ZCxpbWFnZUlzRnJvbURlY29kZVN0cmVhbTpyIGluc3RhbmNlb2Ygdi5EZWNvZGVTdHJlYW0saW52ZXJzZURlY29kZToobnVsbD09Yz92b2lkIDA6Y1swXSk+MCxpbnRlcnBvbGF0ZTplfSkscC5jYWNoZWQ9ISFzLG09W3BdLGkuYWRkSW1hZ2VPcHMobi5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LG0sZykscyl7Y29uc3QgZT17Zm46bi5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LGFyZ3M6bSxvcHRpb25hbENvbnRlbnQ6Z307by5zZXQocyxoLGUpLGgmJnRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCxoLGUpfXJldHVybn1pZihwPWF3YWl0IE0uUERGSW1hZ2UuY3JlYXRlTWFzayh7aW1nQXJyYXk6YSx3aWR0aDp1LGhlaWdodDpkLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOnIgaW5zdGFuY2VvZiB2LkRlY29kZVN0cmVhbSxpbnZlcnNlRGVjb2RlOihudWxsPT1jP3ZvaWQgMDpjWzBdKT4wLGludGVycG9sYXRlOmUsaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6dGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkfSkscC5pc1NpbmdsZU9wYXF1ZVBpeGVsKXtpZihpLmFkZEltYWdlT3BzKG4uT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzayxbXSxnKSxzKXtjb25zdCBlPXtmbjpuLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2ssYXJnczpbXSxvcHRpb25hbENvbnRlbnQ6Z307by5zZXQocyxoLGUpLGgmJnRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCxoLGUpfXJldHVybn1jb25zdCBmPSJtYXNrXyIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmNyZWF0ZU9iaklkKCkpO2lmKGkuYWRkRGVwZW5kZW5jeShmKSx0aGlzLl9zZW5kSW1nRGF0YShmLHApLG09W3tkYXRhOmYsd2lkdGg6cC53aWR0aCxoZWlnaHQ6cC5oZWlnaHQsaW50ZXJwb2xhdGU6cC5pbnRlcnBvbGF0ZSxjb3VudDoxfV0saS5hZGRJbWFnZU9wcyhuLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsbSxnKSxzKXtjb25zdCBlPXtmbjpuLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsYXJnczptLG9wdGlvbmFsQ29udGVudDpnfTtvLnNldChzLGgsZSksaCYmdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLGgsZSl9cmV0dXJufWlmKGEmJiFsLmhhcygiU01hc2siKSYmIWwuaGFzKCJNYXNrIikmJnUrZDwyMDApe2NvbnN0IGU9bmV3IE0uUERGSW1hZ2Uoe3hyZWY6dGhpcy54cmVmLHJlczp0LGltYWdlOnIsaXNJbmxpbmU6YSxwZGZGdW5jdGlvbkZhY3Rvcnk6dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9KTtyZXR1cm4gcD1hd2FpdCBlLmNyZWF0ZUltYWdlRGF0YSghMCwhMSksaS5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZD10aGlzLm9wdGlvbnMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQsdm9pZCBpLmFkZEltYWdlT3BzKG4uT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0LFtwXSxnKX1sZXQgYj0iaW1nXyIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmNyZWF0ZU9iaklkKCkpLHk9ITE7aWYodGhpcy5wYXJzaW5nVHlwZTNGb250P2I9IiIuY29uY2F0KHRoaXMuaWRGYWN0b3J5LmdldERvY0lkKCksIl90eXBlM18iKS5jb25jYXQoYik6aCYmKHk9dGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNob3VsZENhY2hlKGgsdGhpcy5wYWdlSW5kZXgpLHkmJihiPSIiLmNvbmNhdCh0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpLCJfIikuY29uY2F0KGIpKSksaS5hZGREZXBlbmRlbmN5KGIpLG09W2IsdSxkXSxNLlBERkltYWdlLmJ1aWxkSW1hZ2Uoe3hyZWY6dGhpcy54cmVmLHJlczp0LGltYWdlOnIsaXNJbmxpbmU6YSxwZGZGdW5jdGlvbkZhY3Rvcnk6dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9KS50aGVuKChhc3luYyBlPT57aWYocD1hd2FpdCBlLmNyZWF0ZUltYWdlRGF0YSghMSx0aGlzLm9wdGlvbnMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpLHMmJmgmJnkpe2NvbnN0IGU9cC5iaXRtYXA/cC53aWR0aCpwLmhlaWdodCo0OnAuZGF0YS5sZW5ndGg7dGhpcy5nbG9iYWxJbWFnZUNhY2hlLmFkZEJ5dGVTaXplKGgsZSl9cmV0dXJuIHRoaXMuX3NlbmRJbWdEYXRhKGIscCx5KX0pKS5jYXRjaCgoZT0+KCgwLG4ud2FybikoJ1VuYWJsZSB0byBkZWNvZGUgaW1hZ2UgIicuY29uY2F0KGIsJyI6ICInKS5jb25jYXQoZSwnIi4nKSksdGhpcy5fc2VuZEltZ0RhdGEoYixudWxsLHkpKSkpLGkuYWRkSW1hZ2VPcHMobi5PUFMucGFpbnRJbWFnZVhPYmplY3QsbSxnKSxzKXtjb25zdCBlPXtmbjpuLk9QUy5wYWludEltYWdlWE9iamVjdCxhcmdzOm0sb3B0aW9uYWxDb250ZW50Omd9O28uc2V0KHMsaCxlKSxoJiYodGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLGgsZSkseSYmKCgwLG4uYXNzZXJ0KSghYSwiQ2Fubm90IGNhY2hlIGFuIGlubGluZSBpbWFnZSBnbG9iYWxseS4iKSx0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YShoLHtvYmpJZDpiLGZuOm4uT1BTLnBhaW50SW1hZ2VYT2JqZWN0LGFyZ3M6bSxvcHRpb25hbENvbnRlbnQ6ZyxieXRlU2l6ZTowfSkpKX19aGFuZGxlU01hc2soZSx0LHIsbixhLGkpe2NvbnN0IHM9ZS5nZXQoIkciKSxvPXtzdWJ0eXBlOmUuZ2V0KCJTIikubmFtZSxiYWNrZHJvcDplLmdldCgiQkMiKX0sYz1lLmdldCgiVFIiKTtpZigoMCxmLmlzUERGRnVuY3Rpb24pKGMpKXtjb25zdCBlPXRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUoYyksdD1uZXcgVWludDhBcnJheSgyNTYpLHI9bmV3IEZsb2F0MzJBcnJheSgxKTtmb3IobGV0IG49MDtuPDI1NjtuKyspclswXT1uLzI1NSxlKHIsMCxyLDApLHRbbl09MjU1KnJbMF18MDtvLnRyYW5zZmVyTWFwPXR9cmV0dXJuIHRoaXMuYnVpbGRGb3JtWE9iamVjdCh0LHMsbyxyLG4sYS5zdGF0ZS5jbG9uZSgpLGkpfWhhbmRsZVRyYW5zZmVyRnVuY3Rpb24oZSl7bGV0IHQ7aWYoQXJyYXkuaXNBcnJheShlKSl0PWU7ZWxzZXtpZighKDAsZi5pc1BERkZ1bmN0aW9uKShlKSlyZXR1cm4gbnVsbDt0PVtlXX1jb25zdCByPVtdO2xldCBuPTAsYT0wO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9dGhpcy54cmVmLmZldGNoSWZSZWYoZSk7aWYobisrLCgwLHMuaXNOYW1lKSh0LCJJZGVudGl0eSIpKXtyLnB1c2gobnVsbCk7Y29udGludWV9aWYoISgwLGYuaXNQREZGdW5jdGlvbikodCkpcmV0dXJuIG51bGw7Y29uc3QgaT10aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHQpLG89bmV3IFVpbnQ4QXJyYXkoMjU2KSxjPW5ldyBGbG9hdDMyQXJyYXkoMSk7Zm9yKGxldCBlPTA7ZTwyNTY7ZSsrKWNbMF09ZS8yNTUsaShjLDAsYywwKSxvW2VdPTI1NSpjWzBdfDA7ci5wdXNoKG8pLGErK31yZXR1cm4gMSE9PW4mJjQhPT1ufHwwPT09YT9udWxsOnJ9aGFuZGxlVGlsaW5nVHlwZShlLHQscixhLGksbyxjLGwpe2NvbnN0IHU9bmV3IFQuT3BlcmF0b3JMaXN0LGQ9cy5EaWN0Lm1lcmdlKHt4cmVmOnRoaXMueHJlZixkaWN0QXJyYXk6W2kuZ2V0KCJSZXNvdXJjZXMiKSxyXX0pO3JldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7c3RyZWFtOmEsdGFzazpjLHJlc291cmNlczpkLG9wZXJhdG9yTGlzdDp1fSkudGhlbigoZnVuY3Rpb24oKXtjb25zdCByPXUuZ2V0SVIoKSxuPSgwLGguZ2V0VGlsaW5nUGF0dGVybklSKShyLGksdCk7by5hZGREZXBlbmRlbmNpZXModS5kZXBlbmRlbmNpZXMpLG8uYWRkT3AoZSxuKSxpLm9iaklkJiZsLnNldChudWxsLGkub2JqSWQse29wZXJhdG9yTGlzdElSOnIsZGljdDppfSl9KSkuY2F0Y2goKGU9PntpZighKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKSl7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxuLndhcm4pKCdoYW5kbGVUaWxpbmdUeXBlIC0gaWdub3JpbmcgcGF0dGVybjogIicuY29uY2F0KGUsJyIuJykpfX0pKX1oYW5kbGVTZXRGb250KGUsdCxyLG4sYSxpKXtsZXQgYz1hcmd1bWVudHMubGVuZ3RoPjYmJnZvaWQgMCE9PWFyZ3VtZW50c1s2XT9hcmd1bWVudHNbNl06bnVsbCxsPWFyZ3VtZW50cy5sZW5ndGg+NyYmdm9pZCAwIT09YXJndW1lbnRzWzddP2FyZ3VtZW50c1s3XTpudWxsO2NvbnN0IGg9KG51bGw9PXQ/dm9pZCAwOnRbMF0paW5zdGFuY2VvZiBzLk5hbWU/dFswXS5uYW1lOm51bGw7cmV0dXJuIHRoaXMubG9hZEZvbnQoaCxyLGUsYyxsKS50aGVuKCh0PT50LmZvbnQuaXNUeXBlM0ZvbnQ/dC5sb2FkVHlwZTNEYXRhKHRoaXMsZSxhKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBuLmFkZERlcGVuZGVuY2llcyh0LnR5cGUzRGVwZW5kZW5jaWVzKSx0fSkpLmNhdGNoKChlPT5uZXcgTCh7bG9hZGVkTmFtZToiZ19mb250X2Vycm9yIixmb250Om5ldyBvLkVycm9yRm9udCgiVHlwZTMgZm9udCBsb2FkIGVycm9yOiAiLmNvbmNhdChlKSksZGljdDp0LmZvbnQsZXZhbHVhdG9yT3B0aW9uczp0aGlzLm9wdGlvbnN9KSkpOnQpKS50aGVuKChlPT4oaS5mb250PWUuZm9udCxlLnNlbmQodGhpcy5oYW5kbGVyKSxlLmxvYWRlZE5hbWUpKSl9aGFuZGxlVGV4dChlLHQpe2NvbnN0IHI9dC5mb250LGE9ci5jaGFyc1RvR2x5cGhzKGUpO3JldHVybiByLmRhdGEmJih0LnRleHRSZW5kZXJpbmdNb2RlJm4uVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEhfRkxBR3x8IlBhdHRlcm4iPT09dC5maWxsQ29sb3JTcGFjZS5uYW1lfHxyLmRpc2FibGVGb250RmFjZXx8dGhpcy5vcHRpb25zLmRpc2FibGVGb250RmFjZSkmJkIuYnVpbGRGb250UGF0aHMocixhLHRoaXMuaGFuZGxlcix0aGlzLm9wdGlvbnMpLGF9ZW5zdXJlU3RhdGVGb250KGUpe2lmKGUuZm9udClyZXR1cm47Y29uc3QgdD1uZXcgbi5Gb3JtYXRFcnJvcigiTWlzc2luZyBzZXRGb250IChUZikgb3BlcmF0b3IgYmVmb3JlIHRleHQgcmVuZGVyaW5nIG9wZXJhdG9yLiIpO2lmKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IHQ7KDAsbi53YXJuKSgnZW5zdXJlU3RhdGVGb250OiAiJy5jb25jYXQodCwnIi4nKSl9YXN5bmMgc2V0R1N0YXRlKGUpe2xldHtyZXNvdXJjZXM6dCxnU3RhdGU6cixvcGVyYXRvckxpc3Q6YSxjYWNoZUtleTppLHRhc2s6byxzdGF0ZU1hbmFnZXI6Yyxsb2NhbEdTdGF0ZUNhY2hlOmwsbG9jYWxDb2xvclNwYWNlQ2FjaGU6aH09ZTtjb25zdCB1PXIub2JqSWQ7bGV0IGQ9ITA7Y29uc3QgZj1bXTtsZXQgZz1Qcm9taXNlLnJlc29sdmUoKTtmb3IoY29uc3QgZSBvZiByLmdldEtleXMoKSl7Y29uc3QgaT1yLmdldChlKTtzd2l0Y2goZSl7Y2FzZSJUeXBlIjpicmVhaztjYXNlIkxXIjpjYXNlIkxDIjpjYXNlIkxKIjpjYXNlIk1MIjpjYXNlIkQiOmNhc2UiUkkiOmNhc2UiRkwiOmNhc2UiQ0EiOmNhc2UiY2EiOmYucHVzaChbZSxpXSk7YnJlYWs7Y2FzZSJGb250IjpkPSExLGc9Zy50aGVuKCgoKT0+dGhpcy5oYW5kbGVTZXRGb250KHQsbnVsbCxpWzBdLGEsbyxjLnN0YXRlKS50aGVuKChmdW5jdGlvbih0KXthLmFkZERlcGVuZGVuY3kodCksZi5wdXNoKFtlLFt0LGlbMV1dXSl9KSkpKTticmVhaztjYXNlIkJNIjpmLnB1c2goW2UsUihpKV0pO2JyZWFrO2Nhc2UiU01hc2siOmlmKCgwLHMuaXNOYW1lKShpLCJOb25lIikpe2YucHVzaChbZSwhMV0pO2JyZWFrfWkgaW5zdGFuY2VvZiBzLkRpY3Q/KGQ9ITEsZz1nLnRoZW4oKCgpPT50aGlzLmhhbmRsZVNNYXNrKGksdCxhLG8sYyxoKSkpLGYucHVzaChbZSwhMF0pKTooMCxuLndhcm4pKCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlIik7YnJlYWs7Y2FzZSJUUiI6Y29uc3Qgcj10aGlzLmhhbmRsZVRyYW5zZmVyRnVuY3Rpb24oaSk7Zi5wdXNoKFtlLHJdKTticmVhaztjYXNlIk9QIjpjYXNlIm9wIjpjYXNlIk9QTSI6Y2FzZSJCRyI6Y2FzZSJCRzIiOmNhc2UiVUNSIjpjYXNlIlVDUjIiOmNhc2UiVFIyIjpjYXNlIkhUIjpjYXNlIlNNIjpjYXNlIlNBIjpjYXNlIkFJUyI6Y2FzZSJUSyI6KDAsbi5pbmZvKSgiZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiK2UpO2JyZWFrO2RlZmF1bHQ6KDAsbi5pbmZvKSgiVW5rbm93biBncmFwaGljIHN0YXRlIG9wZXJhdG9yICIrZSl9fXJldHVybiBnLnRoZW4oKGZ1bmN0aW9uKCl7Zi5sZW5ndGg+MCYmYS5hZGRPcChuLk9QUy5zZXRHU3RhdGUsW2ZdKSxkJiZsLnNldChpLHUsZil9KSl9bG9hZEZvbnQoZSx0LHIpe3ZhciBhO2xldCBpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsLGM9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOm51bGw7Y29uc3QgbD1hc3luYygpPT5uZXcgTCh7bG9hZGVkTmFtZToiZ19mb250X2Vycm9yIixmb250Om5ldyBvLkVycm9yRm9udCgnRm9udCAiJy5jb25jYXQoZSwnIiBpcyBub3QgYXZhaWxhYmxlLicpKSxkaWN0OnQsZXZhbHVhdG9yT3B0aW9uczp0aGlzLm9wdGlvbnN9KTtsZXQgaDtpZih0KXQgaW5zdGFuY2VvZiBzLlJlZiYmKGg9dCk7ZWxzZXtjb25zdCB0PXIuZ2V0KCJGb250Iik7dCYmKGg9dC5nZXRSYXcoZSkpfWlmKGgpe2lmKHRoaXMucGFyc2luZ1R5cGUzRm9udCYmdGhpcy50eXBlM0ZvbnRSZWZzLmhhcyhoKSlyZXR1cm4gbCgpO2lmKHRoaXMuZm9udENhY2hlLmhhcyhoKSlyZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KGgpO3Q9dGhpcy54cmVmLmZldGNoSWZSZWYoaCl9aWYoISh0IGluc3RhbmNlb2Ygcy5EaWN0KSl7aWYoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMmJiF0aGlzLnBhcnNpbmdUeXBlM0ZvbnQpcmV0dXJuKDAsbi53YXJuKSgnRm9udCAiJy5jb25jYXQoZSwnIiBpcyBub3QgYXZhaWxhYmxlLicpKSxsKCk7KDAsbi53YXJuKSgnRm9udCAiJy5jb25jYXQoZSwnIiBpcyBub3QgYXZhaWxhYmxlIC0tIGF0dGVtcHRpbmcgdG8gZmFsbGJhY2sgdG8gYSBkZWZhdWx0IGZvbnQuJykpLHQ9aXx8Qi5mYWxsYmFja0ZvbnREaWN0fWlmKHQuY2FjaGVLZXkmJnRoaXMuZm9udENhY2hlLmhhcyh0LmNhY2hlS2V5KSlyZXR1cm4gdGhpcy5mb250Q2FjaGUuZ2V0KHQuY2FjaGVLZXkpO2NvbnN0IHU9bmV3IG4uUHJvbWlzZUNhcGFiaWxpdHk7bGV0IGQ7dHJ5e2Q9dGhpcy5wcmVFdmFsdWF0ZUZvbnQodCksZC5jc3NGb250SW5mbz1jfWNhdGNoKGUpe3JldHVybigwLG4ud2FybikoJ2xvYWRGb250IC0gcHJlRXZhbHVhdGVGb250IGZhaWxlZDogIicuY29uY2F0KGUsJyIuJykpLGwoKX1jb25zdHtkZXNjcmlwdG9yOmYsaGFzaDpnfT1kLHA9aCBpbnN0YW5jZW9mIHMuUmVmO2xldCBtO2lmKGcmJmYgaW5zdGFuY2VvZiBzLkRpY3Qpe2NvbnN0IGU9Zi5mb250QWxpYXNlc3x8KGYuZm9udEFsaWFzZXM9T2JqZWN0LmNyZWF0ZShudWxsKSk7aWYoZVtnXSl7Y29uc3QgdD1lW2ddLmFsaWFzUmVmO2lmKHAmJnQmJnRoaXMuZm9udENhY2hlLmhhcyh0KSlyZXR1cm4gdGhpcy5mb250Q2FjaGUucHV0QWxpYXMoaCx0KSx0aGlzLmZvbnRDYWNoZS5nZXQoaCl9ZWxzZSBlW2ddPXtmb250SUQ6dGhpcy5pZEZhY3RvcnkuY3JlYXRlRm9udElkKCl9O3AmJihlW2ddLmFsaWFzUmVmPWgpLG09ZVtnXS5mb250SUR9ZWxzZSBtPXRoaXMuaWRGYWN0b3J5LmNyZWF0ZUZvbnRJZCgpO3JldHVybigwLG4uYXNzZXJ0KShudWxsPT09KGE9bSl8fHZvaWQgMD09PWE/dm9pZCAwOmEuc3RhcnRzV2l0aCgiZiIpLCdUaGUgImZvbnRJRCIgbXVzdCBiZSAoY29ycmVjdGx5KSBkZWZpbmVkLicpLHA/dGhpcy5mb250Q2FjaGUucHV0KGgsdS5wcm9taXNlKToodC5jYWNoZUtleT0iY2FjaGVLZXlfIi5jb25jYXQobSksdGhpcy5mb250Q2FjaGUucHV0KHQuY2FjaGVLZXksdS5wcm9taXNlKSksdC5sb2FkZWROYW1lPSIiLmNvbmNhdCh0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpLCJfIikuY29uY2F0KG0pLHRoaXMudHJhbnNsYXRlRm9udChkKS50aGVuKChlPT57dS5yZXNvbHZlKG5ldyBMKHtsb2FkZWROYW1lOnQubG9hZGVkTmFtZSxmb250OmUsZGljdDp0LGV2YWx1YXRvck9wdGlvbnM6dGhpcy5vcHRpb25zfSkpfSkpLmNhdGNoKChlPT57KDAsbi53YXJuKSgnbG9hZEZvbnQgLSB0cmFuc2xhdGVGb250IGZhaWxlZDogIicuY29uY2F0KGUsJyIuJykpLHUucmVzb2x2ZShuZXcgTCh7bG9hZGVkTmFtZTp0LmxvYWRlZE5hbWUsZm9udDpuZXcgby5FcnJvckZvbnQoZSBpbnN0YW5jZW9mIEVycm9yP2UubWVzc2FnZTplKSxkaWN0OnQsZXZhbHVhdG9yT3B0aW9uczp0aGlzLm9wdGlvbnN9KSl9KSksdS5wcm9taXNlfWJ1aWxkUGF0aChlLHQscil7bGV0IGE9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTtjb25zdCBpPWUubGVuZ3RoLTE7aWYocnx8KHI9W10pLGk8MHx8ZS5mbkFycmF5W2ldIT09bi5PUFMuY29uc3RydWN0UGF0aCl7bGV0IGk7c3dpdGNoKGEmJigoMCxuLndhcm4pKCdFbmNvdW50ZXJlZCBwYXRoIG9wZXJhdG9yICInLmNvbmNhdCh0LCciIGluc2lkZSBvZiBhIHRleHQgb2JqZWN0LicpKSxlLmFkZE9wKG4uT1BTLnNhdmUsbnVsbCkpLHQpe2Nhc2Ugbi5PUFMucmVjdGFuZ2xlOmNvbnN0IGU9clswXStyWzJdLHQ9clsxXStyWzNdO2k9W01hdGgubWluKHJbMF0sZSksTWF0aC5tYXgoclswXSxlKSxNYXRoLm1pbihyWzFdLHQpLE1hdGgubWF4KHJbMV0sdCldO2JyZWFrO2Nhc2Ugbi5PUFMubW92ZVRvOmNhc2Ugbi5PUFMubGluZVRvOmk9W3JbMF0sclswXSxyWzFdLHJbMV1dO2JyZWFrO2RlZmF1bHQ6aT1bMS8wLC0xLzAsMS8wLC0xLzBdfWUuYWRkT3Aobi5PUFMuY29uc3RydWN0UGF0aCxbW3RdLHIsaV0pLGEmJmUuYWRkT3Aobi5PUFMucmVzdG9yZSxudWxsKX1lbHNle2NvbnN0IGE9ZS5hcmdzQXJyYXlbaV07YVswXS5wdXNoKHQpLGFbMV0ucHVzaCguLi5yKTtjb25zdCBzPWFbMl07c3dpdGNoKHQpe2Nhc2Ugbi5PUFMucmVjdGFuZ2xlOmNvbnN0IGU9clswXStyWzJdLHQ9clsxXStyWzNdO3NbMF09TWF0aC5taW4oc1swXSxyWzBdLGUpLHNbMV09TWF0aC5tYXgoc1sxXSxyWzBdLGUpLHNbMl09TWF0aC5taW4oc1syXSxyWzFdLHQpLHNbM109TWF0aC5tYXgoc1szXSxyWzFdLHQpO2JyZWFrO2Nhc2Ugbi5PUFMubW92ZVRvOmNhc2Ugbi5PUFMubGluZVRvOnNbMF09TWF0aC5taW4oc1swXSxyWzBdKSxzWzFdPU1hdGgubWF4KHNbMV0sclswXSksc1syXT1NYXRoLm1pbihzWzJdLHJbMV0pLHNbM109TWF0aC5tYXgoc1szXSxyWzFdKX19fXBhcnNlQ29sb3JTcGFjZShlKXtsZXR7Y3M6dCxyZXNvdXJjZXM6cixsb2NhbENvbG9yU3BhY2VDYWNoZTphfT1lO3JldHVybiB3LkNvbG9yU3BhY2UucGFyc2VBc3luYyh7Y3M6dCx4cmVmOnRoaXMueHJlZixyZXNvdXJjZXM6cixwZGZGdW5jdGlvbkZhY3Rvcnk6dGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LGxvY2FsQ29sb3JTcGFjZUNhY2hlOmF9KS5jYXRjaCgoZT0+e2lmKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKXJldHVybiBudWxsO2lmKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpcmV0dXJuKDAsbi53YXJuKSgncGFyc2VDb2xvclNwYWNlIC0gaWdub3JpbmcgQ29sb3JTcGFjZTogIicuY29uY2F0KGUsJyIuJykpLG51bGw7dGhyb3cgZX0pKX1wYXJzZVNoYWRpbmcoZSl7bGV0e3NoYWRpbmc6dCxyZXNvdXJjZXM6cixsb2NhbENvbG9yU3BhY2VDYWNoZTpuLGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZTphfT1lLGk9YS5nZXQodCk7aWYoIWkpe2NvbnN0IGU9aC5QYXR0ZXJuLnBhcnNlU2hhZGluZyh0LHRoaXMueHJlZixyLHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSxuKS5nZXRJUigpO2k9InBhdHRlcm5fIi5jb25jYXQodGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKSksdGhpcy5wYXJzaW5nVHlwZTNGb250JiYoaT0iIi5jb25jYXQodGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKSwiX3R5cGUzXyIpLmNvbmNhdChpKSksYS5zZXQodCxpKSx0aGlzLnBhcnNpbmdUeXBlM0ZvbnQ/dGhpcy5oYW5kbGVyLnNlbmQoImNvbW1vbm9iaiIsW2ksIlBhdHRlcm4iLGVdKTp0aGlzLmhhbmRsZXIuc2VuZCgib2JqIixbaSx0aGlzLnBhZ2VJbmRleCwiUGF0dGVybiIsZV0pfXJldHVybiBpfWhhbmRsZUNvbG9yTihlLHQscixhLGksbyxjLGwsdSxkKXtjb25zdCBmPXIucG9wKCk7aWYoZiBpbnN0YW5jZW9mIHMuTmFtZSl7Y29uc3QgZz1pLmdldFJhdyhmLm5hbWUpLHA9ZyBpbnN0YW5jZW9mIHMuUmVmJiZ1LmdldEJ5UmVmKGcpO2lmKHApdHJ5e2NvbnN0IG49YS5iYXNlP2EuYmFzZS5nZXRSZ2IociwwKTpudWxsLGk9KDAsaC5nZXRUaWxpbmdQYXR0ZXJuSVIpKHAub3BlcmF0b3JMaXN0SVIscC5kaWN0LG4pO3JldHVybiB2b2lkIGUuYWRkT3AodCxpKX1jYXRjaChlKXt9Y29uc3QgbT10aGlzLnhyZWYuZmV0Y2hJZlJlZihnKTtpZihtKXtjb25zdCBpPW0gaW5zdGFuY2VvZiBiLkJhc2VTdHJlYW0/bS5kaWN0Om0scz1pLmdldCgiUGF0dGVyblR5cGUiKTtpZigxPT09cyl7Y29uc3Qgbj1hLmJhc2U/YS5iYXNlLmdldFJnYihyLDApOm51bGw7cmV0dXJuIHRoaXMuaGFuZGxlVGlsaW5nVHlwZSh0LG4sbyxtLGksZSxjLHUpfWlmKDI9PT1zKXtjb25zdCByPWkuZ2V0KCJTaGFkaW5nIiksbj1pLmdldEFycmF5KCJNYXRyaXgiKSxhPXRoaXMucGFyc2VTaGFkaW5nKHtzaGFkaW5nOnIscmVzb3VyY2VzOm8sbG9jYWxDb2xvclNwYWNlQ2FjaGU6bCxsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGU6ZH0pO3JldHVybiB2b2lkIGUuYWRkT3AodCxbIlNoYWRpbmciLGEsbl0pfXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIFBhdHRlcm5UeXBlOiAiLmNvbmNhdChzKSl9fXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIFBhdHRlcm5OYW1lOiAiLmNvbmNhdChmKSl9X3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24oZSx0LHIpe2lmKCsrdD4xMClyZXR1cm4gdm9pZCgwLG4ud2FybikoIlZpc2liaWxpdHkgZXhwcmVzc2lvbiBpcyB0b28gZGVlcGx5IG5lc3RlZCIpO2NvbnN0IGE9ZS5sZW5ndGgsaT10aGlzLnhyZWYuZmV0Y2hJZlJlZihlWzBdKTtpZighKGE8MikmJmkgaW5zdGFuY2VvZiBzLk5hbWUpe3N3aXRjaChpLm5hbWUpe2Nhc2UiQW5kIjpjYXNlIk9yIjpjYXNlIk5vdCI6ci5wdXNoKGkubmFtZSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdm9pZCgwLG4ud2FybikoIkludmFsaWQgb3BlcmF0b3IgIi5jb25jYXQoaS5uYW1lLCIgaW4gdmlzaWJpbGl0eSBleHByZXNzaW9uIikpfWZvcihsZXQgbj0xO248YTtuKyspe2NvbnN0IGE9ZVtuXSxpPXRoaXMueHJlZi5mZXRjaElmUmVmKGEpO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IGU9W107ci5wdXNoKGUpLHRoaXMuX3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24oaSx0LGUpfWVsc2UgYSBpbnN0YW5jZW9mIHMuUmVmJiZyLnB1c2goYS50b1N0cmluZygpKX19ZWxzZSgwLG4ud2FybikoIkludmFsaWQgdmlzaWJpbGl0eSBleHByZXNzaW9uIil9YXN5bmMgcGFyc2VNYXJrZWRDb250ZW50UHJvcHMoZSx0KXtsZXQgcjtpZihlIGluc3RhbmNlb2Ygcy5OYW1lKXI9dC5nZXQoIlByb3BlcnRpZXMiKS5nZXQoZS5uYW1lKTtlbHNle2lmKCEoZSBpbnN0YW5jZW9mIHMuRGljdCkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk9wdGlvbmFsIGNvbnRlbnQgcHJvcGVydGllcyBtYWxmb3JtZWQuIik7cj1lfWNvbnN0IGE9ci5nZXQoIlR5cGUiKS5uYW1lO2lmKCJPQ0ciPT09YSlyZXR1cm57dHlwZTphLGlkOnIub2JqSWR9O2lmKCJPQ01EIj09PWEpe2NvbnN0IGU9ci5nZXQoIlZFIik7aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgdD1bXTtpZih0aGlzLl9wYXJzZVZpc2liaWxpdHlFeHByZXNzaW9uKGUsMCx0KSx0Lmxlbmd0aD4wKXJldHVybnt0eXBlOiJPQ01EIixleHByZXNzaW9uOnR9fWNvbnN0IHQ9ci5nZXQoIk9DR3MiKTtpZihBcnJheS5pc0FycmF5KHQpfHx0IGluc3RhbmNlb2Ygcy5EaWN0KXtjb25zdCBlPVtdO2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGNvbnN0IHIgb2YgdCllLnB1c2goci50b1N0cmluZygpKTtlbHNlIGUucHVzaCh0Lm9iaklkKTtyZXR1cm57dHlwZTphLGlkczplLHBvbGljeTpyLmdldCgiUCIpaW5zdGFuY2VvZiBzLk5hbWU/ci5nZXQoIlAiKS5uYW1lOm51bGwsZXhwcmVzc2lvbjpudWxsfX1pZih0IGluc3RhbmNlb2Ygcy5SZWYpcmV0dXJue3R5cGU6YSxpZDp0LnRvU3RyaW5nKCl9fXJldHVybiBudWxsfWdldE9wZXJhdG9yTGlzdChlKXtsZXR7c3RyZWFtOnQsdGFzazpyLHJlc291cmNlczphLG9wZXJhdG9yTGlzdDppLGluaXRpYWxTdGF0ZTpvPW51bGwsZmFsbGJhY2tGb250RGljdDpjPW51bGx9PWU7aWYoYXx8KGE9cy5EaWN0LmVtcHR5KSxvfHwobz1uZXcgVSksIWkpdGhyb3cgbmV3IEVycm9yKCdnZXRPcGVyYXRvckxpc3Q6IG1pc3NpbmcgIm9wZXJhdG9yTGlzdCIgcGFyYW1ldGVyJyk7Y29uc3QgbD10aGlzLGg9dGhpcy54cmVmO2xldCB1PSExO2NvbnN0IGQ9bmV3IHAuTG9jYWxJbWFnZUNhY2hlLGY9bmV3IHAuTG9jYWxDb2xvclNwYWNlQ2FjaGUsZz1uZXcgcC5Mb2NhbEdTdGF0ZUNhY2hlLG09bmV3IHAuTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUseT1uZXcgTWFwLHY9YS5nZXQoIlhPYmplY3QiKXx8cy5EaWN0LmVtcHR5LHg9YS5nZXQoIlBhdHRlcm4iKXx8cy5EaWN0LmVtcHR5LFM9bmV3IF8obyksQT1uZXcgJCh0LGgsUyksaz1uZXcgRDtmdW5jdGlvbiBDKGUpe2ZvcihsZXQgZT0wLHQ9QS5zYXZlZFN0YXRlc0RlcHRoO2U8dDtlKyspaS5hZGRPcChuLk9QUy5yZXN0b3JlLFtdKX1yZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uIGUodCxvKXtjb25zdCBwPWZ1bmN0aW9uKHIpe1Byb21pc2UuYWxsKFtyLGkucmVhZHldKS50aGVuKChmdW5jdGlvbigpe3RyeXtlKHQsbyl9Y2F0Y2goZSl7byhlKX19KSxvKX07ci5lbnN1cmVOb3RUZXJtaW5hdGVkKCksay5yZXNldCgpO2NvbnN0IE89e307bGV0IEYsSSxULE0sRSxSO2Zvcig7IShGPWsuY2hlY2soKSkmJihPLmFyZ3M9bnVsbCxBLnJlYWQoTykpOyl7bGV0IGU9Ty5hcmdzLHQ9Ty5mbjtzd2l0Y2goMHx0KXtjYXNlIG4uT1BTLnBhaW50WE9iamVjdDppZihSPWVbMF1pbnN0YW5jZW9mIHMuTmFtZSxFPWVbMF0ubmFtZSxSKXtjb25zdCB0PWQuZ2V0QnlOYW1lKEUpO2lmKHQpe2kuYWRkSW1hZ2VPcHModC5mbix0LmFyZ3MsdC5vcHRpb25hbENvbnRlbnQpLE4odCksZT1udWxsO2NvbnRpbnVlfX1yZXR1cm4gdm9pZCBwKG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe2lmKCFSKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTtsZXQgbz12LmdldFJhdyhFKTtpZihvIGluc3RhbmNlb2Ygcy5SZWYpe2NvbnN0IHQ9ZC5nZXRCeVJlZihvKXx8bC5fcmVnaW9uYWxJbWFnZUNhY2hlLmdldEJ5UmVmKG8pO2lmKHQpcmV0dXJuIGkuYWRkSW1hZ2VPcHModC5mbix0LmFyZ3MsdC5vcHRpb25hbENvbnRlbnQpLE4odCksdm9pZCBlKCk7Y29uc3Qgcj1sLmdsb2JhbEltYWdlQ2FjaGUuZ2V0RGF0YShvLGwucGFnZUluZGV4KTtpZihyKXJldHVybiBpLmFkZERlcGVuZGVuY3koci5vYmpJZCksaS5hZGRJbWFnZU9wcyhyLmZuLHIuYXJncyxyLm9wdGlvbmFsQ29udGVudCksdm9pZCBlKCk7bz1oLmZldGNoKG8pfWlmKCEobyBpbnN0YW5jZW9mIGIuQmFzZVN0cmVhbSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7Y29uc3QgYz1vLmRpY3QuZ2V0KCJTdWJ0eXBlIik7aWYoIShjIGluc3RhbmNlb2Ygcy5OYW1lKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpO2lmKCJGb3JtIiE9PWMubmFtZSlpZigiSW1hZ2UiIT09Yy5uYW1lKXtpZigiUFMiIT09Yy5uYW1lKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmhhbmRsZWQgWE9iamVjdCBzdWJ0eXBlICIuY29uY2F0KGMubmFtZSkpOygwLG4uaW5mbykoIklnbm9yZWQgWE9iamVjdCBzdWJ0eXBlIFBTIiksZSgpfWVsc2UgbC5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHtyZXNvdXJjZXM6YSxpbWFnZTpvLG9wZXJhdG9yTGlzdDppLGNhY2hlS2V5OkUsbG9jYWxJbWFnZUNhY2hlOmQsbG9jYWxDb2xvclNwYWNlQ2FjaGU6Zn0pLnRoZW4oZSx0KTtlbHNlIFMuc2F2ZSgpLGwuYnVpbGRGb3JtWE9iamVjdChhLG8sbnVsbCxpLHIsUy5zdGF0ZS5jbG9uZSgpLGYpLnRoZW4oKGZ1bmN0aW9uKCl7Uy5yZXN0b3JlKCksZSgpfSksdCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIG4uQWJvcnRFeGNlcHRpb24pKXtpZighbC5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ2dldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIFhPYmplY3Q6ICInLmNvbmNhdChlLCciLicpKX19KSkpO2Nhc2Ugbi5PUFMuc2V0Rm9udDp2YXIgRD1lWzFdO3JldHVybiB2b2lkIHAobC5oYW5kbGVTZXRGb250KGEsZSxudWxsLGkscixTLnN0YXRlLGMpLnRoZW4oKGZ1bmN0aW9uKGUpe2kuYWRkRGVwZW5kZW5jeShlKSxpLmFkZE9wKG4uT1BTLnNldEZvbnQsW2UsRF0pfSkpKTtjYXNlIG4uT1BTLmJlZ2luVGV4dDp1PSEwO2JyZWFrO2Nhc2Ugbi5PUFMuZW5kVGV4dDp1PSExO2JyZWFrO2Nhc2Ugbi5PUFMuZW5kSW5saW5lSW1hZ2U6dmFyIEI9ZVswXS5jYWNoZUtleTtpZihCKXtjb25zdCB0PWQuZ2V0QnlOYW1lKEIpO2lmKHQpe2kuYWRkSW1hZ2VPcHModC5mbix0LmFyZ3MsdC5vcHRpb25hbENvbnRlbnQpLE4odCksZT1udWxsO2NvbnRpbnVlfX1yZXR1cm4gdm9pZCBwKGwuYnVpbGRQYWludEltYWdlWE9iamVjdCh7cmVzb3VyY2VzOmEsaW1hZ2U6ZVswXSxpc0lubGluZTohMCxvcGVyYXRvckxpc3Q6aSxjYWNoZUtleTpCLGxvY2FsSW1hZ2VDYWNoZTpkLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmZ9KSk7Y2FzZSBuLk9QUy5zaG93VGV4dDppZighUy5zdGF0ZS5mb250KXtsLmVuc3VyZVN0YXRlRm9udChTLnN0YXRlKTtjb250aW51ZX1lWzBdPWwuaGFuZGxlVGV4dChlWzBdLFMuc3RhdGUpO2JyZWFrO2Nhc2Ugbi5PUFMuc2hvd1NwYWNlZFRleHQ6aWYoIVMuc3RhdGUuZm9udCl7bC5lbnN1cmVTdGF0ZUZvbnQoUy5zdGF0ZSk7Y29udGludWV9dmFyIEw9W10sXz1TLnN0YXRlO2Zvcihjb25zdCB0IG9mIGVbMF0pInN0cmluZyI9PXR5cGVvZiB0P0wucHVzaCguLi5sLmhhbmRsZVRleHQodCxfKSk6Im51bWJlciI9PXR5cGVvZiB0JiZMLnB1c2godCk7ZVswXT1MLHQ9bi5PUFMuc2hvd1RleHQ7YnJlYWs7Y2FzZSBuLk9QUy5uZXh0TGluZVNob3dUZXh0OmlmKCFTLnN0YXRlLmZvbnQpe2wuZW5zdXJlU3RhdGVGb250KFMuc3RhdGUpO2NvbnRpbnVlfWkuYWRkT3Aobi5PUFMubmV4dExpbmUpLGVbMF09bC5oYW5kbGVUZXh0KGVbMF0sUy5zdGF0ZSksdD1uLk9QUy5zaG93VGV4dDticmVhaztjYXNlIG4uT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OmlmKCFTLnN0YXRlLmZvbnQpe2wuZW5zdXJlU3RhdGVGb250KFMuc3RhdGUpO2NvbnRpbnVlfWkuYWRkT3Aobi5PUFMubmV4dExpbmUpLGkuYWRkT3Aobi5PUFMuc2V0V29yZFNwYWNpbmcsW2Uuc2hpZnQoKV0pLGkuYWRkT3Aobi5PUFMuc2V0Q2hhclNwYWNpbmcsW2Uuc2hpZnQoKV0pLGVbMF09bC5oYW5kbGVUZXh0KGVbMF0sUy5zdGF0ZSksdD1uLk9QUy5zaG93VGV4dDticmVhaztjYXNlIG4uT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlOlMuc3RhdGUudGV4dFJlbmRlcmluZ01vZGU9ZVswXTticmVhaztjYXNlIG4uT1BTLnNldEZpbGxDb2xvclNwYWNlOntjb25zdCB0PXcuQ29sb3JTcGFjZS5nZXRDYWNoZWQoZVswXSxoLGYpO2lmKHQpe1Muc3RhdGUuZmlsbENvbG9yU3BhY2U9dDtjb250aW51ZX1yZXR1cm4gdm9pZCBwKGwucGFyc2VDb2xvclNwYWNlKHtjczplWzBdLHJlc291cmNlczphLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmZ9KS50aGVuKChmdW5jdGlvbihlKXtlJiYoUy5zdGF0ZS5maWxsQ29sb3JTcGFjZT1lKX0pKSl9Y2FzZSBuLk9QUy5zZXRTdHJva2VDb2xvclNwYWNlOntjb25zdCB0PXcuQ29sb3JTcGFjZS5nZXRDYWNoZWQoZVswXSxoLGYpO2lmKHQpe1Muc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT10O2NvbnRpbnVlfXJldHVybiB2b2lkIHAobC5wYXJzZUNvbG9yU3BhY2Uoe2NzOmVbMF0scmVzb3VyY2VzOmEsbG9jYWxDb2xvclNwYWNlQ2FjaGU6Zn0pLnRoZW4oKGZ1bmN0aW9uKGUpe2UmJihTLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U9ZSl9KSkpfWNhc2Ugbi5PUFMuc2V0RmlsbENvbG9yOk09Uy5zdGF0ZS5maWxsQ29sb3JTcGFjZSxlPU0uZ2V0UmdiKGUsMCksdD1uLk9QUy5zZXRGaWxsUkdCQ29sb3I7YnJlYWs7Y2FzZSBuLk9QUy5zZXRTdHJva2VDb2xvcjpNPVMuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSxlPU0uZ2V0UmdiKGUsMCksdD1uLk9QUy5zZXRTdHJva2VSR0JDb2xvcjticmVhaztjYXNlIG4uT1BTLnNldEZpbGxHcmF5OlMuc3RhdGUuZmlsbENvbG9yU3BhY2U9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheSxlPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKGUsMCksdD1uLk9QUy5zZXRGaWxsUkdCQ29sb3I7YnJlYWs7Y2FzZSBuLk9QUy5zZXRTdHJva2VHcmF5OlMuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT13LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LGU9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2IoZSwwKSx0PW4uT1BTLnNldFN0cm9rZVJHQkNvbG9yO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0RmlsbENNWUtDb2xvcjpTLnN0YXRlLmZpbGxDb2xvclNwYWNlPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWssZT13LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYihlLDApLHQ9bi5PUFMuc2V0RmlsbFJHQkNvbG9yO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOlMuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZT13LkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLGU9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoZSwwKSx0PW4uT1BTLnNldFN0cm9rZVJHQkNvbG9yO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0RmlsbFJHQkNvbG9yOlMuc3RhdGUuZmlsbENvbG9yU3BhY2U9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLGU9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihlLDApO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I6Uy5zdGF0ZS5zdHJva2VDb2xvclNwYWNlPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYixlPXcuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoZSwwKTticmVhaztjYXNlIG4uT1BTLnNldEZpbGxDb2xvck46aWYoTT1TLnN0YXRlLmZpbGxDb2xvclNwYWNlLCJQYXR0ZXJuIj09PU0ubmFtZSlyZXR1cm4gdm9pZCBwKGwuaGFuZGxlQ29sb3JOKGksbi5PUFMuc2V0RmlsbENvbG9yTixlLE0seCxhLHIsZixtLHkpKTtlPU0uZ2V0UmdiKGUsMCksdD1uLk9QUy5zZXRGaWxsUkdCQ29sb3I7YnJlYWs7Y2FzZSBuLk9QUy5zZXRTdHJva2VDb2xvck46aWYoTT1TLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UsIlBhdHRlcm4iPT09TS5uYW1lKXJldHVybiB2b2lkIHAobC5oYW5kbGVDb2xvck4oaSxuLk9QUy5zZXRTdHJva2VDb2xvck4sZSxNLHgsYSxyLGYsbSx5KSk7ZT1NLmdldFJnYihlLDApLHQ9bi5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7YnJlYWs7Y2FzZSBuLk9QUy5zaGFkaW5nRmlsbDp2YXIgaj1hLmdldCgiU2hhZGluZyIpO2lmKCFqKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJObyBzaGFkaW5nIHJlc291cmNlIGZvdW5kIik7dmFyIFU9ai5nZXQoZVswXS5uYW1lKTtpZighVSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiTm8gc2hhZGluZyBvYmplY3QgZm91bmQiKTtlPVtsLnBhcnNlU2hhZGluZyh7c2hhZGluZzpVLHJlc291cmNlczphLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmYsbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlOnl9KV0sdD1uLk9QUy5zaGFkaW5nRmlsbDticmVhaztjYXNlIG4uT1BTLnNldEdTdGF0ZTppZihSPWVbMF1pbnN0YW5jZW9mIHMuTmFtZSxFPWVbMF0ubmFtZSxSKXtjb25zdCB0PWcuZ2V0QnlOYW1lKEUpO2lmKHQpe3QubGVuZ3RoPjAmJmkuYWRkT3Aobi5PUFMuc2V0R1N0YXRlLFt0XSksZT1udWxsO2NvbnRpbnVlfX1yZXR1cm4gdm9pZCBwKG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe2lmKCFSKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJHU3RhdGUgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpO2NvbnN0IG89YS5nZXQoIkV4dEdTdGF0ZSIpO2lmKCEobyBpbnN0YW5jZW9mIHMuRGljdCkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkV4dEdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpO2NvbnN0IGM9by5nZXQoRSk7aWYoIShjIGluc3RhbmNlb2Ygcy5EaWN0KSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7bC5zZXRHU3RhdGUoe3Jlc291cmNlczphLGdTdGF0ZTpjLG9wZXJhdG9yTGlzdDppLGNhY2hlS2V5OkUsdGFzazpyLHN0YXRlTWFuYWdlcjpTLGxvY2FsR1N0YXRlQ2FjaGU6Zyxsb2NhbENvbG9yU3BhY2VDYWNoZTpmfSkudGhlbihlLHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKSl7aWYoIWwub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxuLndhcm4pKCdnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICInLmNvbmNhdChlLCciLicpKX19KSkpO2Nhc2Ugbi5PUFMubW92ZVRvOmNhc2Ugbi5PUFMubGluZVRvOmNhc2Ugbi5PUFMuY3VydmVUbzpjYXNlIG4uT1BTLmN1cnZlVG8yOmNhc2Ugbi5PUFMuY3VydmVUbzM6Y2FzZSBuLk9QUy5jbG9zZVBhdGg6Y2FzZSBuLk9QUy5yZWN0YW5nbGU6bC5idWlsZFBhdGgoaSx0LGUsdSk7Y29udGludWU7Y2FzZSBuLk9QUy5tYXJrUG9pbnQ6Y2FzZSBuLk9QUy5tYXJrUG9pbnRQcm9wczpjYXNlIG4uT1BTLmJlZ2luQ29tcGF0OmNhc2Ugbi5PUFMuZW5kQ29tcGF0OmNvbnRpbnVlO2Nhc2Ugbi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6aWYoIShlWzBdaW5zdGFuY2VvZiBzLk5hbWUpKXsoMCxuLndhcm4pKCJFeHBlY3RlZCBuYW1lIGZvciBiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyBhcmcwPSIuY29uY2F0KGVbMF0pKTtjb250aW51ZX1pZigiT0MiPT09ZVswXS5uYW1lKXJldHVybiB2b2lkIHAobC5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhlWzFdLGEpLnRoZW4oKGU9PntpLmFkZE9wKG4uT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLFsiT0MiLGVdKX0pKS5jYXRjaCgoZT0+e2lmKCEoZSBpbnN0YW5jZW9mIG4uQWJvcnRFeGNlcHRpb24pKXtpZighbC5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ2dldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiAiJy5jb25jYXQoZSwnIi4nKSl9fSkpKTtlPVtlWzBdLm5hbWUsZVsxXWluc3RhbmNlb2Ygcy5EaWN0P2VbMV0uZ2V0KCJNQ0lEIik6bnVsbF07YnJlYWs7Y2FzZSBuLk9QUy5iZWdpbk1hcmtlZENvbnRlbnQ6Y2FzZSBuLk9QUy5lbmRNYXJrZWRDb250ZW50OmRlZmF1bHQ6aWYobnVsbCE9PWUpe2ZvcihJPTAsVD1lLmxlbmd0aDtJPFQmJiEoZVtJXWluc3RhbmNlb2Ygcy5EaWN0KTtJKyspO2lmKEk8VCl7KDAsbi53YXJuKSgiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3Jpbmcgb3BlcmF0b3I6ICIrdCk7Y29udGludWV9fX1pLmFkZE9wKHQsZSl9Rj9wKFApOihDKCksdCgpKX0pKS5jYXRjaCgoZT0+e2lmKCEoZSBpbnN0YW5jZW9mIG4uQWJvcnRFeGNlcHRpb24pKXtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ2dldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGVycm9ycyBkdXJpbmcgIicuY29uY2F0KHIubmFtZSwnIiB0YXNrOiAiJykuY29uY2F0KGUsJyIuJykpLEMoKX19KSl9Z2V0VGV4dENvbnRlbnQoZSl7bGV0e3N0cmVhbTp0LHRhc2s6cixyZXNvdXJjZXM6YSxzdGF0ZU1hbmFnZXI6aT1udWxsLGluY2x1ZGVNYXJrZWRDb250ZW50Om89ITEsc2luazpjLHNlZW5TdHlsZXM6bD1uZXcgU2V0LHZpZXdCb3g6aCxtYXJrZWRDb250ZW50RGF0YTp1PW51bGwsZGlzYWJsZU5vcm1hbGl6YXRpb246ZD0hMX09ZTthfHwoYT1zLkRpY3QuZW1wdHkpLGl8fChpPW5ldyBfKG5ldyBqKSksbyYmKHV8fCh1PXtsZXZlbDowfSkpO2NvbnN0IGY9e2l0ZW1zOltdLHN0eWxlczpPYmplY3QuY3JlYXRlKG51bGwpfSxnPXtpbml0aWFsaXplZDohMSxzdHI6W10sdG90YWxXaWR0aDowLHRvdGFsSGVpZ2h0OjAsd2lkdGg6MCxoZWlnaHQ6MCx2ZXJ0aWNhbDohMSxwcmV2VHJhbnNmb3JtOm51bGwsdGV4dEFkdmFuY2VTY2FsZTowLHNwYWNlSW5GbG93TWluOjAsc3BhY2VJbkZsb3dNYXg6MCx0cmFja2luZ1NwYWNlTWluOjEvMCxuZWdhdGl2ZVNwYWNlTWF4Oi0xLzAsbm90QVNwYWNlOi0xLzAsdHJhbnNmb3JtOm51bGwsZm9udE5hbWU6bnVsbCxoYXNFT0w6ITF9LG09WyIgIiwiICJdO2xldCB3PTA7ZnVuY3Rpb24gdihlKXtjb25zdCB0PSh3KzEpJTIscj0iICIhPT1tW3ddJiYiICI9PT1tW3RdO3JldHVybiBtW3ddPWUsdz10LHJ9ZnVuY3Rpb24geCgpe3JldHVybiIgIiE9PW1bd10mJiIgIj09PW1bKHcrMSklMl19ZnVuY3Rpb24gUygpe21bMF09bVsxXT0iICIsdz0wfWNvbnN0IEE9dGhpcyxrPXRoaXMueHJlZixDPVtdO2xldCBPPW51bGw7Y29uc3QgRj1uZXcgcC5Mb2NhbEltYWdlQ2FjaGUsST1uZXcgcC5Mb2NhbEdTdGF0ZUNhY2hlLFQ9bmV3ICQodCxrLGkpO2xldCBNO2Z1bmN0aW9uIEUoZSl7bGV0e3dpZHRoOnQ9MCxoZWlnaHQ6cj0wLHRyYW5zZm9ybTpuPWcucHJldlRyYW5zZm9ybSxmb250TmFtZTphPWcuZm9udE5hbWV9PWU7Zi5pdGVtcy5wdXNoKHtzdHI6IiAiLGRpcjoibHRyIix3aWR0aDp0LGhlaWdodDpyLHRyYW5zZm9ybTpuLGZvbnROYW1lOmEsaGFzRU9MOiExfSl9ZnVuY3Rpb24gUigpe2NvbnN0IGU9TS5mb250LHQ9W00uZm9udFNpemUqTS50ZXh0SFNjYWxlLDAsMCxNLmZvbnRTaXplLDAsTS50ZXh0UmlzZV07aWYoZS5pc1R5cGUzRm9udCYmKE0uZm9udFNpemU8PTF8fGUuaXNDaGFyQkJveCkmJiEoMCxuLmlzQXJyYXlFcXVhbCkoTS5mb250TWF0cml4LG4uRk9OVF9JREVOVElUWV9NQVRSSVgpKXtjb25zdCByPWUuYmJveFszXS1lLmJib3hbMV07cj4wJiYodFszXSo9cipNLmZvbnRNYXRyaXhbM10pfXJldHVybiBuLlV0aWwudHJhbnNmb3JtKE0uY3RtLG4uVXRpbC50cmFuc2Zvcm0oTS50ZXh0TWF0cml4LHQpKX1mdW5jdGlvbiBOKCl7aWYoZy5pbml0aWFsaXplZClyZXR1cm4gZztjb25zdHtmb250OmUsbG9hZGVkTmFtZTp0fT1NO2wuaGFzKHQpfHwobC5hZGQodCksZi5zdHlsZXNbdF09e2ZvbnRGYW1pbHk6ZS5mYWxsYmFja05hbWUsYXNjZW50OmUuYXNjZW50LGRlc2NlbnQ6ZS5kZXNjZW50LHZlcnRpY2FsOmUudmVydGljYWx9KSxnLmZvbnROYW1lPXQ7Y29uc3Qgcj1nLnRyYW5zZm9ybT1SKCk7ZS52ZXJ0aWNhbD8oZy53aWR0aD1nLnRvdGFsV2lkdGg9TWF0aC5oeXBvdChyWzBdLHJbMV0pLGcuaGVpZ2h0PWcudG90YWxIZWlnaHQ9MCxnLnZlcnRpY2FsPSEwKTooZy53aWR0aD1nLnRvdGFsV2lkdGg9MCxnLmhlaWdodD1nLnRvdGFsSGVpZ2h0PU1hdGguaHlwb3QoclsyXSxyWzNdKSxnLnZlcnRpY2FsPSExKTtjb25zdCBuPU1hdGguaHlwb3QoTS50ZXh0TGluZU1hdHJpeFswXSxNLnRleHRMaW5lTWF0cml4WzFdKSxhPU1hdGguaHlwb3QoTS5jdG1bMF0sTS5jdG1bMV0pO2cudGV4dEFkdmFuY2VTY2FsZT1hKm47Y29uc3R7Zm9udFNpemU6aX09TTtyZXR1cm4gZy50cmFja2luZ1NwYWNlTWluPS4xMDIqaSxnLm5vdEFTcGFjZT0uMDMqaSxnLm5lZ2F0aXZlU3BhY2VNYXg9LS4yKmksZy5zcGFjZUluRmxvd01pbj0uMTAyKmksZy5zcGFjZUluRmxvd01heD0uNippLGcuaGFzRU9MPSExLGcuaW5pdGlhbGl6ZWQ9ITAsZ31mdW5jdGlvbiBCKCl7aWYoIWcuaW5pdGlhbGl6ZWQpcmV0dXJuO2NvbnN0IGU9TWF0aC5oeXBvdChNLnRleHRMaW5lTWF0cml4WzBdLE0udGV4dExpbmVNYXRyaXhbMV0pLHQ9TWF0aC5oeXBvdChNLmN0bVswXSxNLmN0bVsxXSkqZTt0IT09Zy50ZXh0QWR2YW5jZVNjYWxlJiYoZy52ZXJ0aWNhbD8oZy50b3RhbEhlaWdodCs9Zy5oZWlnaHQqZy50ZXh0QWR2YW5jZVNjYWxlLGcuaGVpZ2h0PTApOihnLnRvdGFsV2lkdGgrPWcud2lkdGgqZy50ZXh0QWR2YW5jZVNjYWxlLGcud2lkdGg9MCksZy50ZXh0QWR2YW5jZVNjYWxlPXQpfWZ1bmN0aW9uIEwoZSx0KXtyZXR1cm4gQS5sb2FkRm9udChlLHQsYSkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZm9udC5pc1R5cGUzRm9udD9lLmxvYWRUeXBlM0RhdGEoQSxhLHIpLmNhdGNoKChmdW5jdGlvbigpe30pKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBlfSkpOmV9KSkudGhlbigoZnVuY3Rpb24oZSl7TS5sb2FkZWROYW1lPWUubG9hZGVkTmFtZSxNLmZvbnQ9ZS5mb250LE0uZm9udE1hdHJpeD1lLmZvbnQuZm9udE1hdHJpeHx8bi5GT05UX0lERU5USVRZX01BVFJJWH0pKX1mdW5jdGlvbiBVKGUsdCxyKXtjb25zdCBuPU1hdGguaHlwb3QoclswXSxyWzFdKTtyZXR1cm5bKHJbMF0qZStyWzFdKnQpL24sKHJbMl0qZStyWzNdKnQpL25dfWZ1bmN0aW9uIFgoZSl7dmFyIHQ7Y29uc3Qgcj1SKCk7bGV0IG49cls0XSxhPXJbNV07aWYobnVsbCE9PSh0PU0uZm9udCkmJnZvaWQgMCE9PXQmJnQudmVydGljYWwpe2lmKG48aFswXXx8bj5oWzJdfHxhK2U8aFsxXXx8YT5oWzNdKXJldHVybiExfWVsc2UgaWYobitlPGhbMF18fG4+aFsyXXx8YTxoWzFdfHxhPmhbM10pcmV0dXJuITE7aWYoIU0uZm9udHx8IWcucHJldlRyYW5zZm9ybSlyZXR1cm4hMDtsZXQgaT1nLnByZXZUcmFuc2Zvcm1bNF0scz1nLnByZXZUcmFuc2Zvcm1bNV07aWYoaT09PW4mJnM9PT1hKXJldHVybiEwO2xldCBvPS0xO3N3aXRjaChyWzBdJiYwPT09clsxXSYmMD09PXJbMl0/bz1yWzBdPjA/MDoxODA6clsxXSYmMD09PXJbMF0mJjA9PT1yWzNdJiYobz1yWzFdPjA/OTA6MjcwKSxvKXtjYXNlIDA6YnJlYWs7Y2FzZSA5MDpbbixhXT1bYSxuXSxbaSxzXT1bcyxpXTticmVhaztjYXNlIDE4MDpbbixhLGksc109Wy1uLC1hLC1pLC1zXTticmVhaztjYXNlIDI3MDpbbixhXT1bLWEsLW5dLFtpLHNdPVstcywtaV07YnJlYWs7ZGVmYXVsdDpbbixhXT1VKG4sYSxyKSxbaSxzXT1VKGkscyxnLnByZXZUcmFuc2Zvcm0pfWlmKE0uZm9udC52ZXJ0aWNhbCl7Y29uc3QgZT0ocy1hKS9nLnRleHRBZHZhbmNlU2NhbGUsdD1uLWkscj1NYXRoLnNpZ24oZy5oZWlnaHQpO3JldHVybiBlPHIqZy5uZWdhdGl2ZVNwYWNlTWF4P01hdGguYWJzKHQpPi41Kmcud2lkdGg/KHEoKSwhMCk6KFMoKSxHKCksITApOk1hdGguYWJzKHQpPmcud2lkdGg/KHEoKSwhMCk6KGU8PXIqZy5ub3RBU3BhY2UmJlMoKSxlPD1yKmcudHJhY2tpbmdTcGFjZU1pbj94KCk/KFMoKSxHKCksRSh7aGVpZ2h0Ok1hdGguYWJzKGUpfSkpOmcuaGVpZ2h0Kz1lOnooZSxnLnByZXZUcmFuc2Zvcm0scil8fCgwPT09Zy5zdHIubGVuZ3RoPyhTKCksRSh7aGVpZ2h0Ok1hdGguYWJzKGUpfSkpOmcuaGVpZ2h0Kz1lKSxNYXRoLmFicyh0KT4uMjUqZy53aWR0aCYmRygpLCEwKX1jb25zdCBjPShuLWkpL2cudGV4dEFkdmFuY2VTY2FsZSxsPWEtcyx1PU1hdGguc2lnbihnLndpZHRoKTtyZXR1cm4gYzx1KmcubmVnYXRpdmVTcGFjZU1heD9NYXRoLmFicyhsKT4uNSpnLmhlaWdodD8ocSgpLCEwKTooUygpLEcoKSwhMCk6TWF0aC5hYnMobCk+Zy5oZWlnaHQ/KHEoKSwhMCk6KGM8PXUqZy5ub3RBU3BhY2UmJlMoKSxjPD11KmcudHJhY2tpbmdTcGFjZU1pbj94KCk/KFMoKSxHKCksRSh7d2lkdGg6TWF0aC5hYnMoYyl9KSk6Zy53aWR0aCs9Yzp6KGMsZy5wcmV2VHJhbnNmb3JtLHUpfHwoMD09PWcuc3RyLmxlbmd0aD8oUygpLEUoe3dpZHRoOk1hdGguYWJzKGMpfSkpOmcud2lkdGgrPWMpLE1hdGguYWJzKGwpPi4yNSpnLmhlaWdodCYmRygpLCEwKX1mdW5jdGlvbiBIKGUpe2xldHtjaGFyczp0LGV4dHJhU3BhY2luZzpyfT1lO2NvbnN0IG49TS5mb250O2lmKCF0KXtjb25zdCBlPU0uY2hhclNwYWNpbmcrcjtyZXR1cm4gdm9pZChlJiYobi52ZXJ0aWNhbD9NLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwtZSk6TS50cmFuc2xhdGVUZXh0TWF0cml4KGUqTS50ZXh0SFNjYWxlLDApKSl9Y29uc3QgYT1uLmNoYXJzVG9HbHlwaHModCksaT1NLmZvbnRNYXRyaXhbMF0qTS5mb250U2l6ZTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHM9YVtlXSx7Y2F0ZWdvcnk6b309cztpZihvLmlzSW52aXNpYmxlRm9ybWF0TWFyayljb250aW51ZTtsZXQgYz1NLmNoYXJTcGFjaW5nKyhlKzE9PT10P3I6MCksbD1zLndpZHRoO24udmVydGljYWwmJihsPXMudm1ldHJpYz9zLnZtZXRyaWNbMF06LWwpO2xldCBoPWwqaTtpZihvLmlzV2hpdGVzcGFjZSl7bi52ZXJ0aWNhbD8oYys9LWgrTS53b3JkU3BhY2luZyxNLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwtYykpOihjKz1oK00ud29yZFNwYWNpbmcsTS50cmFuc2xhdGVUZXh0TWF0cml4KGMqTS50ZXh0SFNjYWxlLDApKSx2KCIgIik7Y29udGludWV9aWYoIW8uaXNaZXJvV2lkdGhEaWFjcml0aWMmJiFYKGgpKXtuLnZlcnRpY2FsP00udHJhbnNsYXRlVGV4dE1hdHJpeCgwLGgpOk0udHJhbnNsYXRlVGV4dE1hdHJpeChoKk0udGV4dEhTY2FsZSwwKTtjb250aW51ZX1jb25zdCB1PU4oKTtvLmlzWmVyb1dpZHRoRGlhY3JpdGljJiYoaD0wKSxuLnZlcnRpY2FsPyhNLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCxoKSxoPU1hdGguYWJzKGgpLHUuaGVpZ2h0Kz1oKTooaCo9TS50ZXh0SFNjYWxlLE0udHJhbnNsYXRlVGV4dE1hdHJpeChoLDApLHUud2lkdGgrPWgpLGgmJih1LnByZXZUcmFuc2Zvcm09UigpKTtjb25zdCBkPXMudW5pY29kZTt2KGQpJiZ1LnN0ci5wdXNoKCIgIiksdS5zdHIucHVzaChkKSxjJiYobi52ZXJ0aWNhbD9NLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwtYyk6TS50cmFuc2xhdGVUZXh0TWF0cml4KGMqTS50ZXh0SFNjYWxlLDApKX19ZnVuY3Rpb24gcSgpe1MoKSxnLmluaXRpYWxpemVkPyhnLmhhc0VPTD0hMCxHKCkpOmYuaXRlbXMucHVzaCh7c3RyOiIiLGRpcjoibHRyIix3aWR0aDowLGhlaWdodDowLHRyYW5zZm9ybTpSKCksZm9udE5hbWU6TS5sb2FkZWROYW1lLGhhc0VPTDohMH0pfWZ1bmN0aW9uIHooZSx0LHIpe2lmKHIqZy5zcGFjZUluRmxvd01pbjw9ZSYmZTw9cipnLnNwYWNlSW5GbG93TWF4KXJldHVybiBnLmluaXRpYWxpemVkJiYoUygpLGcuc3RyLnB1c2goIiAiKSksITE7Y29uc3Qgbj1nLmZvbnROYW1lO2xldCBhPTA7cmV0dXJuIGcudmVydGljYWwmJihhPWUsZT0wKSxHKCksUygpLEUoe3dpZHRoOk1hdGguYWJzKGUpLGhlaWdodDpNYXRoLmFicyhhKSx0cmFuc2Zvcm06dHx8UigpLGZvbnROYW1lOm59KSwhMH1mdW5jdGlvbiBHKCl7Zy5pbml0aWFsaXplZCYmZy5zdHImJihnLnZlcnRpY2FsP2cudG90YWxIZWlnaHQrPWcuaGVpZ2h0KmcudGV4dEFkdmFuY2VTY2FsZTpnLnRvdGFsV2lkdGgrPWcud2lkdGgqZy50ZXh0QWR2YW5jZVNjYWxlLGYuaXRlbXMucHVzaChmdW5jdGlvbihlKXtsZXQgdD1lLnN0ci5qb2luKCIiKTtkfHwodD0oMCxuLm5vcm1hbGl6ZVVuaWNvZGUpKHQpKTtjb25zdCByPSgwLHkuYmlkaSkodCwtMSxlLnZlcnRpY2FsKTtyZXR1cm57c3RyOnIuc3RyLGRpcjpyLmRpcix3aWR0aDpNYXRoLmFicyhlLnRvdGFsV2lkdGgpLGhlaWdodDpNYXRoLmFicyhlLnRvdGFsSGVpZ2h0KSx0cmFuc2Zvcm06ZS50cmFuc2Zvcm0sZm9udE5hbWU6ZS5mb250TmFtZSxoYXNFT0w6ZS5oYXNFT0x9fShnKSksZy5pbml0aWFsaXplZD0hMSxnLnN0ci5sZW5ndGg9MCl9ZnVuY3Rpb24gVygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07Y29uc3QgdD1mLml0ZW1zLmxlbmd0aDswPT09dHx8ZSYmdDwxMHx8KGMuZW5xdWV1ZShmLHQpLGYuaXRlbXM9W10sZi5zdHlsZXM9T2JqZWN0LmNyZWF0ZShudWxsKSl9Y29uc3QgVj1uZXcgRDtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uIGUodCxnKXtjb25zdCBwPWZ1bmN0aW9uKHIpe1coITApLFByb21pc2UuYWxsKFtyLGMucmVhZHldKS50aGVuKChmdW5jdGlvbigpe3RyeXtlKHQsZyl9Y2F0Y2goZSl7ZyhlKX19KSxnKX07ci5lbnN1cmVOb3RUZXJtaW5hdGVkKCksVi5yZXNldCgpO2NvbnN0IG09e307bGV0IHksdz1bXTtmb3IoOyEoeT1WLmNoZWNrKCkpJiYody5sZW5ndGg9MCxtLmFyZ3M9dyxULnJlYWQobSkpOyl7Y29uc3QgZT1NO009aS5zdGF0ZTtjb25zdCB0PW0uZm47c3dpdGNoKHc9bS5hcmdzLDB8dCl7Y2FzZSBuLk9QUy5zZXRGb250OnZhciB2PXdbMF0ubmFtZSx4PXdbMV07aWYoTS5mb250JiZ2PT09TS5mb250TmFtZSYmeD09PU0uZm9udFNpemUpYnJlYWs7cmV0dXJuIEcoKSxNLmZvbnROYW1lPXYsTS5mb250U2l6ZT14LHZvaWQgcChMKHYsbnVsbCkpO2Nhc2Ugbi5PUFMuc2V0VGV4dFJpc2U6TS50ZXh0UmlzZT13WzBdO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0SFNjYWxlOk0udGV4dEhTY2FsZT13WzBdLzEwMDticmVhaztjYXNlIG4uT1BTLnNldExlYWRpbmc6TS5sZWFkaW5nPXdbMF07YnJlYWs7Y2FzZSBuLk9QUy5tb3ZlVGV4dDpNLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KHdbMF0sd1sxXSksTS50ZXh0TWF0cml4PU0udGV4dExpbmVNYXRyaXguc2xpY2UoKTticmVhaztjYXNlIG4uT1BTLnNldExlYWRpbmdNb3ZlVGV4dDpNLmxlYWRpbmc9LXdbMV0sTS50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCh3WzBdLHdbMV0pLE0udGV4dE1hdHJpeD1NLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7YnJlYWs7Y2FzZSBuLk9QUy5uZXh0TGluZTpNLmNhcnJpYWdlUmV0dXJuKCk7YnJlYWs7Y2FzZSBuLk9QUy5zZXRUZXh0TWF0cml4Ok0uc2V0VGV4dE1hdHJpeCh3WzBdLHdbMV0sd1syXSx3WzNdLHdbNF0sd1s1XSksTS5zZXRUZXh0TGluZU1hdHJpeCh3WzBdLHdbMV0sd1syXSx3WzNdLHdbNF0sd1s1XSksQigpO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0Q2hhclNwYWNpbmc6TS5jaGFyU3BhY2luZz13WzBdO2JyZWFrO2Nhc2Ugbi5PUFMuc2V0V29yZFNwYWNpbmc6TS53b3JkU3BhY2luZz13WzBdO2JyZWFrO2Nhc2Ugbi5PUFMuYmVnaW5UZXh0Ok0udGV4dE1hdHJpeD1uLklERU5USVRZX01BVFJJWC5zbGljZSgpLE0udGV4dExpbmVNYXRyaXg9bi5JREVOVElUWV9NQVRSSVguc2xpY2UoKTticmVhaztjYXNlIG4uT1BTLnNob3dTcGFjZWRUZXh0OmlmKCFpLnN0YXRlLmZvbnQpe0EuZW5zdXJlU3RhdGVGb250KGkuc3RhdGUpO2NvbnRpbnVlfWNvbnN0IHQ9KE0uZm9udC52ZXJ0aWNhbD8xOi0xKSpNLmZvbnRTaXplLzFlMyxnPXdbMF07Zm9yKGxldCBlPTAscj1nLmxlbmd0aDtlPHI7ZSsrKXtjb25zdCByPWdbZV07aWYoInN0cmluZyI9PXR5cGVvZiByKUMucHVzaChyKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgciYmMCE9PXIpe2NvbnN0IGU9Qy5qb2luKCIiKTtDLmxlbmd0aD0wLEgoe2NoYXJzOmUsZXh0cmFTcGFjaW5nOnIqdH0pfX1pZihDLmxlbmd0aD4wKXtjb25zdCBlPUMuam9pbigiIik7Qy5sZW5ndGg9MCxIKHtjaGFyczplLGV4dHJhU3BhY2luZzowfSl9YnJlYWs7Y2FzZSBuLk9QUy5zaG93VGV4dDppZighaS5zdGF0ZS5mb250KXtBLmVuc3VyZVN0YXRlRm9udChpLnN0YXRlKTtjb250aW51ZX1IKHtjaGFyczp3WzBdLGV4dHJhU3BhY2luZzowfSk7YnJlYWs7Y2FzZSBuLk9QUy5uZXh0TGluZVNob3dUZXh0OmlmKCFpLnN0YXRlLmZvbnQpe0EuZW5zdXJlU3RhdGVGb250KGkuc3RhdGUpO2NvbnRpbnVlfU0uY2FycmlhZ2VSZXR1cm4oKSxIKHtjaGFyczp3WzBdLGV4dHJhU3BhY2luZzowfSk7YnJlYWs7Y2FzZSBuLk9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDppZighaS5zdGF0ZS5mb250KXtBLmVuc3VyZVN0YXRlRm9udChpLnN0YXRlKTtjb250aW51ZX1NLndvcmRTcGFjaW5nPXdbMF0sTS5jaGFyU3BhY2luZz13WzFdLE0uY2FycmlhZ2VSZXR1cm4oKSxIKHtjaGFyczp3WzJdLGV4dHJhU3BhY2luZzowfSk7YnJlYWs7Y2FzZSBuLk9QUy5wYWludFhPYmplY3Q6RygpLE98fChPPWEuZ2V0KCJYT2JqZWN0Iil8fHMuRGljdC5lbXB0eSk7dmFyIFM9d1swXWluc3RhbmNlb2Ygcy5OYW1lLEU9d1swXS5uYW1lO2lmKFMmJkYuZ2V0QnlOYW1lKEUpKWJyZWFrO3JldHVybiB2b2lkIHAobmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7aWYoIVMpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlhPYmplY3QgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpO2xldCBmPU8uZ2V0UmF3KEUpO2lmKGYgaW5zdGFuY2VvZiBzLlJlZil7aWYoRi5nZXRCeVJlZihmKSlyZXR1cm4gdm9pZCBlKCk7aWYoQS5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoZixBLnBhZ2VJbmRleCkpcmV0dXJuIHZvaWQgZSgpO2Y9ay5mZXRjaChmKX1pZighKGYgaW5zdGFuY2VvZiBiLkJhc2VTdHJlYW0pKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJYT2JqZWN0IHNob3VsZCBiZSBhIHN0cmVhbSIpO2NvbnN0IGc9Zi5kaWN0LmdldCgiU3VidHlwZSIpO2lmKCEoZyBpbnN0YW5jZW9mIHMuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGUiKTtpZigiRm9ybSIhPT1nLm5hbWUpcmV0dXJuIEYuc2V0KEUsZi5kaWN0Lm9iaklkLCEwKSx2b2lkIGUoKTtjb25zdCBwPWkuc3RhdGUuY2xvbmUoKSxtPW5ldyBfKHApLHk9Zi5kaWN0LmdldEFycmF5KCJNYXRyaXgiKTtBcnJheS5pc0FycmF5KHkpJiY2PT09eS5sZW5ndGgmJm0udHJhbnNmb3JtKHkpLFcoKTtjb25zdCB3PXtlbnF1ZXVlSW52b2tlZDohMSxlbnF1ZXVlKGUsdCl7dGhpcy5lbnF1ZXVlSW52b2tlZD0hMCxjLmVucXVldWUoZSx0KX0sZ2V0IGRlc2lyZWRTaXplKCl7cmV0dXJuIGMuZGVzaXJlZFNpemV9LGdldCByZWFkeSgpe3JldHVybiBjLnJlYWR5fX07QS5nZXRUZXh0Q29udGVudCh7c3RyZWFtOmYsdGFzazpyLHJlc291cmNlczpmLmRpY3QuZ2V0KCJSZXNvdXJjZXMiKXx8YSxzdGF0ZU1hbmFnZXI6bSxpbmNsdWRlTWFya2VkQ29udGVudDpvLHNpbms6dyxzZWVuU3R5bGVzOmwsdmlld0JveDpoLG1hcmtlZENvbnRlbnREYXRhOnUsZGlzYWJsZU5vcm1hbGl6YXRpb246ZH0pLnRoZW4oKGZ1bmN0aW9uKCl7dy5lbnF1ZXVlSW52b2tlZHx8Ri5zZXQoRSxmLmRpY3Qub2JqSWQsITApLGUoKX0pLHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKSl7aWYoIUEub3B0aW9ucy5pZ25vcmVFcnJvcnMpdGhyb3cgZTsoMCxuLndhcm4pKCdnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIFhPYmplY3Q6ICInLmNvbmNhdChlLCciLicpKX19KSkpO2Nhc2Ugbi5PUFMuc2V0R1N0YXRlOmlmKFM9d1swXWluc3RhbmNlb2Ygcy5OYW1lLEU9d1swXS5uYW1lLFMmJkkuZ2V0QnlOYW1lKEUpKWJyZWFrO3JldHVybiB2b2lkIHAobmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7aWYoIVMpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7Y29uc3Qgcj1hLmdldCgiRXh0R1N0YXRlIik7aWYoIShyIGluc3RhbmNlb2Ygcy5EaWN0KSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7Y29uc3QgaT1yLmdldChFKTtpZighKGkgaW5zdGFuY2VvZiBzLkRpY3QpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJHU3RhdGUgc2hvdWxkIGJlIGEgZGljdGlvbmFyeS4iKTtjb25zdCBvPWkuZ2V0KCJGb250Iik7bz8oRygpLE0uZm9udE5hbWU9bnVsbCxNLmZvbnRTaXplPW9bMV0sTChudWxsLG9bMF0pLnRoZW4oZSx0KSk6KEkuc2V0KEUsaS5vYmpJZCwhMCksZSgpKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7aWYoIShlIGluc3RhbmNlb2Ygbi5BYm9ydEV4Y2VwdGlvbikpe2lmKCFBLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7KDAsbi53YXJuKSgnZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICInLmNvbmNhdChlLCciLicpKX19KSkpO2Nhc2Ugbi5PUFMuYmVnaW5NYXJrZWRDb250ZW50OkcoKSxvJiYodS5sZXZlbCsrLGYuaXRlbXMucHVzaCh7dHlwZToiYmVnaW5NYXJrZWRDb250ZW50Iix0YWc6d1swXWluc3RhbmNlb2Ygcy5OYW1lP3dbMF0ubmFtZTpudWxsfSkpO2JyZWFrO2Nhc2Ugbi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6aWYoRygpLG8pe3UubGV2ZWwrKztsZXQgZT1udWxsO3dbMV1pbnN0YW5jZW9mIHMuRGljdCYmKGU9d1sxXS5nZXQoIk1DSUQiKSksZi5pdGVtcy5wdXNoKHt0eXBlOiJiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyIsaWQ6TnVtYmVyLmlzSW50ZWdlcihlKT8iIi5jb25jYXQoQS5pZEZhY3RvcnkuZ2V0UGFnZU9iaklkKCksIl9tYyIpLmNvbmNhdChlKTpudWxsLHRhZzp3WzBdaW5zdGFuY2VvZiBzLk5hbWU/d1swXS5uYW1lOm51bGx9KX1icmVhaztjYXNlIG4uT1BTLmVuZE1hcmtlZENvbnRlbnQ6aWYoRygpLG8pe2lmKDA9PT11LmxldmVsKWJyZWFrO3UubGV2ZWwtLSxmLml0ZW1zLnB1c2goe3R5cGU6ImVuZE1hcmtlZENvbnRlbnQifSl9YnJlYWs7Y2FzZSBuLk9QUy5yZXN0b3JlOiFlfHxlLmZvbnQ9PT1NLmZvbnQmJmUuZm9udFNpemU9PT1NLmZvbnRTaXplJiZlLmZvbnROYW1lPT09TS5mb250TmFtZXx8RygpfWlmKGYuaXRlbXMubGVuZ3RoPj1jLmRlc2lyZWRTaXplKXt5PSEwO2JyZWFrfX15P3AoUCk6KEcoKSxXKCksdCgpKX0pKS5jYXRjaCgoZT0+e2lmKCEoZSBpbnN0YW5jZW9mIG4uQWJvcnRFeGNlcHRpb24pKXtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ2dldFRleHRDb250ZW50IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJy5jb25jYXQoci5uYW1lLCciIHRhc2s6ICInKS5jb25jYXQoZSwnIi4nKSksRygpLFcoKX19KSl9ZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGUsdCxyKXtjb25zdCBhPXRoaXMueHJlZjtsZXQgaTtjb25zdCBvPXRoaXMucmVhZFRvVW5pY29kZShyLnRvVW5pY29kZXx8ZS5nZXQoIlRvVW5pY29kZSIpfHx0LmdldCgiVG9Vbmljb2RlIikpO2lmKHIuY29tcG9zaXRlKXtjb25zdCB0PWUuZ2V0KCJDSURTeXN0ZW1JbmZvIik7dCBpbnN0YW5jZW9mIHMuRGljdCYmKHIuY2lkU3lzdGVtSW5mbz17cmVnaXN0cnk6KDAsbi5zdHJpbmdUb1BERlN0cmluZykodC5nZXQoIlJlZ2lzdHJ5IikpLG9yZGVyaW5nOigwLG4uc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJPcmRlcmluZyIpKSxzdXBwbGVtZW50OnQuZ2V0KCJTdXBwbGVtZW50Iil9KTt0cnl7Y29uc3QgdD1lLmdldCgiQ0lEVG9HSURNYXAiKTt0IGluc3RhbmNlb2YgYi5CYXNlU3RyZWFtJiYoaT10LmdldEJ5dGVzKCkpfWNhdGNoKGUpe2lmKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IGU7KDAsbi53YXJuKSgnZXh0cmFjdERhdGFTdHJ1Y3R1cmVzIC0gaWdub3JpbmcgQ0lEVG9HSURNYXAgZGF0YTogIicuY29uY2F0KGUsJyIuJykpfX1jb25zdCBoPVtdO2xldCB1LGQ9bnVsbDtpZihlLmhhcygiRW5jb2RpbmciKSl7aWYodT1lLmdldCgiRW5jb2RpbmciKSx1IGluc3RhbmNlb2Ygcy5EaWN0KXtpZihkPXUuZ2V0KCJCYXNlRW5jb2RpbmciKSxkPWQgaW5zdGFuY2VvZiBzLk5hbWU/ZC5uYW1lOm51bGwsdS5oYXMoIkRpZmZlcmVuY2VzIikpe2NvbnN0IGU9dS5nZXQoIkRpZmZlcmVuY2VzIik7bGV0IHQ9MDtmb3IoY29uc3QgciBvZiBlKXtjb25zdCBlPWEuZmV0Y2hJZlJlZihyKTtpZigibnVtYmVyIj09dHlwZW9mIGUpdD1lO2Vsc2V7aWYoIShlIGluc3RhbmNlb2Ygcy5OYW1lKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiSW52YWxpZCBlbnRyeSBpbiAnRGlmZmVyZW5jZXMnIGFycmF5OiAiLmNvbmNhdChlKSk7aFt0KytdPWUubmFtZX19fX1lbHNlIGlmKHUgaW5zdGFuY2VvZiBzLk5hbWUpZD11Lm5hbWU7ZWxzZXtjb25zdCBlPSJFbmNvZGluZyBpcyBub3QgYSBOYW1lIG5vciBhIERpY3QiO2lmKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKGUpOygwLG4ud2FybikoZSl9Ik1hY1JvbWFuRW5jb2RpbmciIT09ZCYmIk1hY0V4cGVydEVuY29kaW5nIiE9PWQmJiJXaW5BbnNpRW5jb2RpbmciIT09ZCYmKGQ9bnVsbCl9Y29uc3QgZj0hci5maWxlfHxyLmlzSW50ZXJuYWxGb250LGc9KDAsbC5nZXRTeW1ib2xzRm9udHMpKClbci5uYW1lXTtpZihkJiZmJiZnJiYoZD1udWxsKSxkKXIuZGVmYXVsdEVuY29kaW5nPSgwLGMuZ2V0RW5jb2RpbmcpKGQpO2Vsc2V7Y29uc3QgZT0hIShyLmZsYWdzJnguRm9udEZsYWdzLlN5bWJvbGljKSx0PSEhKHIuZmxhZ3MmeC5Gb250RmxhZ3MuTm9uc3ltYm9saWMpO3U9Yy5TdGFuZGFyZEVuY29kaW5nLCJUcnVlVHlwZSIhPT1yLnR5cGV8fHR8fCh1PWMuV2luQW5zaUVuY29kaW5nKSwoZXx8ZykmJih1PWMuTWFjUm9tYW5FbmNvZGluZyxmJiYoL1N5bWJvbC9pLnRlc3Qoci5uYW1lKT91PWMuU3ltYm9sU2V0RW5jb2Rpbmc6L0RpbmdiYXRzL2kudGVzdChyLm5hbWUpP3U9Yy5aYXBmRGluZ2JhdHNFbmNvZGluZzovV2luZ2RpbmdzL2kudGVzdChyLm5hbWUpJiYodT1jLldpbkFuc2lFbmNvZGluZykpKSxyLmRlZmF1bHRFbmNvZGluZz11fXJldHVybiByLmRpZmZlcmVuY2VzPWgsci5iYXNlRW5jb2RpbmdOYW1lPWQsci5oYXNFbmNvZGluZz0hIWR8fGgubGVuZ3RoPjAsci5kaWN0PWUsby50aGVuKChlPT4oci50b1VuaWNvZGU9ZSx0aGlzLmJ1aWxkVG9Vbmljb2RlKHIpKSkpLnRoZW4oKGU9PihyLnRvVW5pY29kZT1lLGkmJihyLmNpZFRvR2lkTWFwPXRoaXMucmVhZENpZFRvR2lkTWFwKGksZSkpLHIpKSl9X3NpbXBsZUZvbnRUb1VuaWNvZGUoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTsoMCxuLmFzc2VydCkoIWUuY29tcG9zaXRlLCJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7Y29uc3Qgcj1bXSxhPWUuZGVmYXVsdEVuY29kaW5nLnNsaWNlKCksaT1lLmJhc2VFbmNvZGluZ05hbWUscz1lLmRpZmZlcmVuY2VzO2Zvcihjb25zdCBlIGluIHMpe2NvbnN0IHQ9c1tlXTsiLm5vdGRlZiIhPT10JiYoYVtlXT10KX1jb25zdCBvPSgwLEEuZ2V0R2x5cGhzVW5pY29kZSkoKTtmb3IoY29uc3QgbiBpbiBhKXtsZXQgcz1hW25dO2lmKCIiPT09cyljb250aW51ZTtsZXQgbD1vW3NdO2lmKHZvaWQgMCE9PWwpe3Jbbl09U3RyaW5nLmZyb21DaGFyQ29kZShsKTtjb250aW51ZX1sZXQgaD0wO3N3aXRjaChzWzBdKXtjYXNlIkciOjM9PT1zLmxlbmd0aCYmKGg9cGFyc2VJbnQocy5zdWJzdHJpbmcoMSksMTYpKTticmVhaztjYXNlImciOjU9PT1zLmxlbmd0aCYmKGg9cGFyc2VJbnQocy5zdWJzdHJpbmcoMSksMTYpKTticmVhaztjYXNlIkMiOmNhc2UiYyI6aWYocy5sZW5ndGg+PTMmJnMubGVuZ3RoPD00KXtjb25zdCByPXMuc3Vic3RyaW5nKDEpO2lmKHQpe2g9cGFyc2VJbnQociwxNik7YnJlYWt9aWYoaD0rcixOdW1iZXIuaXNOYU4oaCkmJk51bWJlci5pc0ludGVnZXIocGFyc2VJbnQociwxNikpKXJldHVybiB0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKGUsITApfWJyZWFrO2Nhc2UidSI6bD0oMCxPLmdldFVuaWNvZGVGb3JHbHlwaCkocyxvKSwtMSE9PWwmJihoPWwpO2JyZWFrO2RlZmF1bHQ6c3dpdGNoKHMpe2Nhc2UiZl9oIjpjYXNlImZfdCI6Y2FzZSJUX2giOnJbbl09cy5yZXBsYWNlQWxsKCJfIiwiIik7Y29udGludWV9fWlmKGg+MCYmaDw9MTExNDExMSYmTnVtYmVyLmlzSW50ZWdlcihoKSl7aWYoaSYmaD09PStuKXtjb25zdCBlPSgwLGMuZ2V0RW5jb2RpbmcpKGkpO2lmKGUmJihzPWVbbl0pKXtyW25dPVN0cmluZy5mcm9tQ2hhckNvZGUob1tzXSk7Y29udGludWV9fXJbbl09U3RyaW5nLmZyb21Db2RlUG9pbnQoaCl9fXJldHVybiByfWFzeW5jIGJ1aWxkVG9Vbmljb2RlKGUpe3ZhciB0O2lmKGUuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXA9KG51bGw9PT0odD1lLnRvVW5pY29kZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQubGVuZ3RoKT4wLGUuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApcmV0dXJuIWUuY29tcG9zaXRlJiZlLmhhc0VuY29kaW5nJiYoZS5mYWxsYmFja1RvVW5pY29kZT10aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKGUpKSxlLnRvVW5pY29kZTtpZighZS5jb21wb3NpdGUpcmV0dXJuIG5ldyBkLlRvVW5pY29kZU1hcCh0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKGUpKTtpZihlLmNvbXBvc2l0ZSYmKGUuY01hcC5idWlsdEluQ01hcCYmIShlLmNNYXAgaW5zdGFuY2VvZiBhLklkZW50aXR5Q01hcCl8fCJBZG9iZSI9PT1lLmNpZFN5c3RlbUluZm8ucmVnaXN0cnkmJigiR0IxIj09PWUuY2lkU3lzdGVtSW5mby5vcmRlcmluZ3x8IkNOUzEiPT09ZS5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nfHwiSmFwYW4xIj09PWUuY2lkU3lzdGVtSW5mby5vcmRlcmluZ3x8IktvcmVhMSI9PT1lLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcpKSl7Y29uc3R7cmVnaXN0cnk6dCxvcmRlcmluZzpyfT1lLmNpZFN5c3RlbUluZm8saT1zLk5hbWUuZ2V0KCIiLmNvbmNhdCh0LCItIikuY29uY2F0KHIsIi1VQ1MyIikpLG89YXdhaXQgYS5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOmksZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSksYz1bXSxsPVtdO3JldHVybiBlLmNNYXAuZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXtpZih0PjY1NTM1KXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJNYXggc2l6ZSBvZiBDSUQgaXMgNjUsNTM1Iik7Y29uc3Qgcj1vLmxvb2t1cCh0KTtpZihyKXtsLmxlbmd0aD0wO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrPTIpbC5wdXNoKChyLmNoYXJDb2RlQXQoZSk8PDgpK3IuY2hhckNvZGVBdChlKzEpKTtjW2VdPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4ubCl9fSkpLG5ldyBkLlRvVW5pY29kZU1hcChjKX1yZXR1cm4gbmV3IGQuSWRlbnRpdHlUb1VuaWNvZGVNYXAoZS5maXJzdENoYXIsZS5sYXN0Q2hhcil9cmVhZFRvVW5pY29kZShlKXtyZXR1cm4gZT9lIGluc3RhbmNlb2Ygcy5OYW1lP2EuQ01hcEZhY3RvcnkuY3JlYXRlKHtlbmNvZGluZzplLGZldGNoQnVpbHRJbkNNYXA6dGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLHVzZUNNYXA6bnVsbH0pLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYS5JZGVudGl0eUNNYXA/bmV3IGQuSWRlbnRpdHlUb1VuaWNvZGVNYXAoMCw2NTUzNSk6bmV3IGQuVG9Vbmljb2RlTWFwKGUuZ2V0TWFwKCkpfSkpOmUgaW5zdGFuY2VvZiBiLkJhc2VTdHJlYW0/YS5DTWFwRmFjdG9yeS5jcmVhdGUoe2VuY29kaW5nOmUsZmV0Y2hCdWlsdEluQ01hcDp0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsdXNlQ01hcDpudWxsfSkudGhlbigoZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGEuSWRlbnRpdHlDTWFwKXJldHVybiBuZXcgZC5JZGVudGl0eVRvVW5pY29kZU1hcCgwLDY1NTM1KTtjb25zdCB0PW5ldyBBcnJheShlLmxlbmd0aCk7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSxyKXtpZigibnVtYmVyIj09dHlwZW9mIHIpcmV0dXJuIHZvaWQodFtlXT1TdHJpbmcuZnJvbUNvZGVQb2ludChyKSk7Y29uc3Qgbj1bXTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrPTIpe2NvbnN0IHQ9ci5jaGFyQ29kZUF0KGUpPDw4fHIuY2hhckNvZGVBdChlKzEpO2lmKDU1Mjk2IT0oNjM0ODgmdCkpe24ucHVzaCh0KTtjb250aW51ZX1lKz0yO2NvbnN0IGE9ci5jaGFyQ29kZUF0KGUpPDw4fHIuY2hhckNvZGVBdChlKzEpO24ucHVzaCgoKDEwMjMmdCk8PDEwKSsoMTAyMyZhKSs2NTUzNil9dFtlXT1TdHJpbmcuZnJvbUNvZGVQb2ludCguLi5uKX0pKSxuZXcgZC5Ub1VuaWNvZGVNYXAodCl9KSwoZT0+e2lmKGUgaW5zdGFuY2VvZiBuLkFib3J0RXhjZXB0aW9uKXJldHVybiBudWxsO2lmKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpcmV0dXJuKDAsbi53YXJuKSgncmVhZFRvVW5pY29kZSAtIGlnbm9yaW5nIFRvVW5pY29kZSBkYXRhOiAiJy5jb25jYXQoZSwnIi4nKSksbnVsbDt0aHJvdyBlfSkpOlByb21pc2UucmVzb2x2ZShudWxsKTpQcm9taXNlLnJlc29sdmUobnVsbCl9cmVhZENpZFRvR2lkTWFwKGUsdCl7Y29uc3Qgcj1bXTtmb3IobGV0IG49MCxhPWUubGVuZ3RoO248YTtuKyspe2NvbnN0IGE9ZVtuKytdPDw4fGVbbl0saT1uPj4xOygwIT09YXx8dC5oYXMoaSkpJiYocltpXT1hKX1yZXR1cm4gcn1leHRyYWN0V2lkdGhzKGUsdCxyKXtjb25zdCBuPXRoaXMueHJlZjtsZXQgYT1bXSxpPTA7Y29uc3Qgbz1bXTtsZXQgYyxsLGgsdSxkLGYsZyxwO2lmKHIuY29tcG9zaXRlKXtpZihpPWUuaGFzKCJEVyIpP2UuZ2V0KCJEVyIpOjFlMyxwPWUuZ2V0KCJXIikscClmb3IobD0wLGg9cC5sZW5ndGg7bDxoO2wrKylpZihmPW4uZmV0Y2hJZlJlZihwW2wrK10pLGc9bi5mZXRjaElmUmVmKHBbbF0pLEFycmF5LmlzQXJyYXkoZykpZm9yKHU9MCxkPWcubGVuZ3RoO3U8ZDt1KyspYVtmKytdPW4uZmV0Y2hJZlJlZihnW3VdKTtlbHNle2NvbnN0IGU9bi5mZXRjaElmUmVmKHBbKytsXSk7Zm9yKHU9Zjt1PD1nO3UrKylhW3VdPWV9aWYoci52ZXJ0aWNhbCl7bGV0IHQ9ZS5nZXRBcnJheSgiRFcyIil8fFs4ODAsLTFlM107aWYoYz1bdFsxXSwuNSppLHRbMF1dLHQ9ZS5nZXQoIlcyIiksdClmb3IobD0wLGg9dC5sZW5ndGg7bDxoO2wrKylpZihmPW4uZmV0Y2hJZlJlZih0W2wrK10pLGc9bi5mZXRjaElmUmVmKHRbbF0pLEFycmF5LmlzQXJyYXkoZykpZm9yKHU9MCxkPWcubGVuZ3RoO3U8ZDt1Kyspb1tmKytdPVtuLmZldGNoSWZSZWYoZ1t1KytdKSxuLmZldGNoSWZSZWYoZ1t1KytdKSxuLmZldGNoSWZSZWYoZ1t1XSldO2Vsc2V7Y29uc3QgZT1bbi5mZXRjaElmUmVmKHRbKytsXSksbi5mZXRjaElmUmVmKHRbKytsXSksbi5mZXRjaElmUmVmKHRbKytsXSldO2Zvcih1PWY7dTw9Zzt1Kyspb1t1XT1lfX19ZWxzZXtjb25zdCBvPXIuZmlyc3RDaGFyO2lmKHA9ZS5nZXQoIldpZHRocyIpLHApe2Zvcih1PW8sbD0wLGg9cC5sZW5ndGg7bDxoO2wrKylhW3UrK109bi5mZXRjaElmUmVmKHBbbF0pO2k9cGFyc2VGbG9hdCh0LmdldCgiTWlzc2luZ1dpZHRoIikpfHwwfWVsc2V7Y29uc3QgdD1lLmdldCgiQmFzZUZvbnQiKTtpZih0IGluc3RhbmNlb2Ygcy5OYW1lKXtjb25zdCBlPXRoaXMuZ2V0QmFzZUZvbnRNZXRyaWNzKHQubmFtZSk7YT10aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKGUud2lkdGhzLHIpLGk9ZS5kZWZhdWx0V2lkdGh9fX1sZXQgbT0hMCxiPWk7Zm9yKGNvbnN0IGUgaW4gYSl7Y29uc3QgdD1hW2VdO2lmKHQpaWYoYil7aWYoYiE9PXQpe209ITE7YnJlYWt9fWVsc2UgYj10fW0/ci5mbGFnc3w9eC5Gb250RmxhZ3MuRml4ZWRQaXRjaDpyLmZsYWdzJj1+eC5Gb250RmxhZ3MuRml4ZWRQaXRjaCxyLmRlZmF1bHRXaWR0aD1pLHIud2lkdGhzPWEsci5kZWZhdWx0Vk1ldHJpY3M9YyxyLnZtZXRyaWNzPW99aXNTZXJpZkZvbnQoZSl7Y29uc3QgdD1lLnNwbGl0KCItIilbMF07cmV0dXJuIHQgaW4oMCxsLmdldFNlcmlmRm9udHMpKCl8fC9zZXJpZi9naS50ZXN0KHQpfWdldEJhc2VGb250TWV0cmljcyhlKXtsZXQgdD0wLHI9T2JqZWN0LmNyZWF0ZShudWxsKSxuPSExLGE9KDAsbC5nZXRTdGRGb250TWFwKSgpW2VdfHxlO2NvbnN0IGk9KDAsQy5nZXRNZXRyaWNzKSgpO2EgaW4gaXx8KGE9dGhpcy5pc1NlcmlmRm9udChlKT8iVGltZXMtUm9tYW4iOiJIZWx2ZXRpY2EiKTtjb25zdCBzPWlbYV07cmV0dXJuIm51bWJlciI9PXR5cGVvZiBzPyh0PXMsbj0hMCk6cj1zKCkse2RlZmF1bHRXaWR0aDp0LG1vbm9zcGFjZTpuLHdpZHRoczpyfX1idWlsZENoYXJDb2RlVG9XaWR0aChlLHQpe2NvbnN0IHI9T2JqZWN0LmNyZWF0ZShudWxsKSxuPXQuZGlmZmVyZW5jZXMsYT10LmRlZmF1bHRFbmNvZGluZztmb3IobGV0IHQ9MDt0PDI1Njt0KyspdCBpbiBuJiZlW25bdF1dP3JbdF09ZVtuW3RdXTp0IGluIGEmJmVbYVt0XV0mJihyW3RdPWVbYVt0XV0pO3JldHVybiByfXByZUV2YWx1YXRlRm9udChlKXtjb25zdCB0PWU7bGV0IHI9ZS5nZXQoIlN1YnR5cGUiKTtpZighKHIgaW5zdGFuY2VvZiBzLk5hbWUpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpO2xldCBhLGksbz0hMTtpZigiVHlwZTAiPT09ci5uYW1lKXtjb25zdCB0PWUuZ2V0KCJEZXNjZW5kYW50Rm9udHMiKTtpZighdCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRGVzY2VuZGFudCBmb250cyBhcmUgbm90IHNwZWNpZmllZCIpO2lmKCEoKGU9QXJyYXkuaXNBcnJheSh0KT90aGlzLnhyZWYuZmV0Y2hJZlJlZih0WzBdKTp0KWluc3RhbmNlb2Ygcy5EaWN0KSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRGVzY2VuZGFudCBmb250IGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7aWYocj1lLmdldCgiU3VidHlwZSIpLCEociBpbnN0YW5jZW9mIHMuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBTdWJ0eXBlIik7bz0hMH1jb25zdCBjPWUuZ2V0KCJGaXJzdENoYXIiKXx8MCxsPWUuZ2V0KCJMYXN0Q2hhciIpfHwobz82NTUzNToyNTUpLGg9ZS5nZXQoIkZvbnREZXNjcmlwdG9yIik7aWYoaCl7YT1uZXcgSS5NdXJtdXJIYXNoM182NDtjb25zdCByPXQuZ2V0UmF3KCJFbmNvZGluZyIpO2lmKHIgaW5zdGFuY2VvZiBzLk5hbWUpYS51cGRhdGUoci5uYW1lKTtlbHNlIGlmKHIgaW5zdGFuY2VvZiBzLlJlZilhLnVwZGF0ZShyLnRvU3RyaW5nKCkpO2Vsc2UgaWYociBpbnN0YW5jZW9mIHMuRGljdClmb3IoY29uc3QgZSBvZiByLmdldFJhd1ZhbHVlcygpKWlmKGUgaW5zdGFuY2VvZiBzLk5hbWUpYS51cGRhdGUoZS5uYW1lKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBzLlJlZilhLnVwZGF0ZShlLnRvU3RyaW5nKCkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgdD1lLmxlbmd0aCxyPW5ldyBBcnJheSh0KTtmb3IobGV0IG49MDtuPHQ7bisrKXtjb25zdCB0PWVbbl07dCBpbnN0YW5jZW9mIHMuTmFtZT9yW25dPXQubmFtZTooIm51bWJlciI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2Ygcy5SZWYpJiYocltuXT10LnRvU3RyaW5nKCkpfWEudXBkYXRlKHIuam9pbigpKX1pZihhLnVwZGF0ZSgiIi5jb25jYXQoYywiLSIpLmNvbmNhdChsKSksaT1lLmdldCgiVG9Vbmljb2RlIil8fHQuZ2V0KCJUb1VuaWNvZGUiKSxpIGluc3RhbmNlb2YgYi5CYXNlU3RyZWFtKXtjb25zdCBlPWkuc3RyfHxpLHQ9ZS5idWZmZXI/bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIuYnVmZmVyLDAsZS5idWZmZXJMZW5ndGgpOm5ldyBVaW50OEFycmF5KGUuYnl0ZXMuYnVmZmVyLGUuc3RhcnQsZS5lbmQtZS5zdGFydCk7YS51cGRhdGUodCl9ZWxzZSBpIGluc3RhbmNlb2Ygcy5OYW1lJiZhLnVwZGF0ZShpLm5hbWUpO2NvbnN0IG49ZS5nZXQoIldpZHRocyIpfHx0LmdldCgiV2lkdGhzIik7aWYoQXJyYXkuaXNBcnJheShuKSl7Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiBuKSgibnVtYmVyIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBzLlJlZikmJmUucHVzaCh0LnRvU3RyaW5nKCkpO2EudXBkYXRlKGUuam9pbigpKX1pZihvKXthLnVwZGF0ZSgiY29tcG9zaXRlRm9udCIpO2NvbnN0IHI9ZS5nZXQoIlciKXx8dC5nZXQoIlciKTtpZihBcnJheS5pc0FycmF5KHIpKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIHIpaWYoIm51bWJlciI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2Ygcy5SZWYpZS5wdXNoKHQudG9TdHJpbmcoKSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXtjb25zdCByPVtdO2Zvcihjb25zdCBlIG9mIHQpKCJudW1iZXIiPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIHMuUmVmKSYmci5wdXNoKGUudG9TdHJpbmcoKSk7ZS5wdXNoKCJbIi5jb25jYXQoci5qb2luKCksIl0iKSl9YS51cGRhdGUoZS5qb2luKCkpfWNvbnN0IG49ZS5nZXRSYXcoIkNJRFRvR0lETWFwIil8fHQuZ2V0UmF3KCJDSURUb0dJRE1hcCIpO24gaW5zdGFuY2VvZiBzLk5hbWU/YS51cGRhdGUobi5uYW1lKTpuIGluc3RhbmNlb2Ygcy5SZWY/YS51cGRhdGUobi50b1N0cmluZygpKTpuIGluc3RhbmNlb2YgYi5CYXNlU3RyZWFtJiZhLnVwZGF0ZShuLnBlZWtCeXRlcygpKX19cmV0dXJue2Rlc2NyaXB0b3I6aCxkaWN0OmUsYmFzZURpY3Q6dCxjb21wb3NpdGU6byx0eXBlOnIubmFtZSxmaXJzdENoYXI6YyxsYXN0Q2hhcjpsLHRvVW5pY29kZTppLGhhc2g6YT9hLmhleGRpZ2VzdCgpOiIifX1hc3luYyB0cmFuc2xhdGVGb250KGUpe3ZhciB0LHI7bGV0e2Rlc2NyaXB0b3I6aSxkaWN0OmMsYmFzZURpY3Q6aCxjb21wb3NpdGU6ZCx0eXBlOmYsZmlyc3RDaGFyOmcsbGFzdENoYXI6cCx0b1VuaWNvZGU6Yixjc3NGb250SW5mbzp5fT1lO2NvbnN0IHc9IlR5cGUzIj09PWY7bGV0IHY7aWYoIWkpe2lmKCF3KXtsZXQgZT1jLmdldCgiQmFzZUZvbnQiKTtpZighKGUgaW5zdGFuY2VvZiBzLk5hbWUpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJCYXNlIGZvbnQgaXMgbm90IHNwZWNpZmllZCIpO2U9ZS5uYW1lLnJlcGxhY2VBbGwoL1ssX10vZywiLSIpO2NvbnN0IHQ9dGhpcy5nZXRCYXNlRm9udE1ldHJpY3MoZSkscj1lLnNwbGl0KCItIilbMF0sYT0odGhpcy5pc1NlcmlmRm9udChyKT94LkZvbnRGbGFncy5TZXJpZjowKXwodC5tb25vc3BhY2U/eC5Gb250RmxhZ3MuRml4ZWRQaXRjaDowKXwoKDAsbC5nZXRTeW1ib2xzRm9udHMpKClbcl0/eC5Gb250RmxhZ3MuU3ltYm9saWM6eC5Gb250RmxhZ3MuTm9uc3ltYm9saWMpO3Y9e3R5cGU6ZixuYW1lOmUsbG9hZGVkTmFtZTpoLmxvYWRlZE5hbWUsc3lzdGVtRm9udEluZm86bnVsbCx3aWR0aHM6dC53aWR0aHMsZGVmYXVsdFdpZHRoOnQuZGVmYXVsdFdpZHRoLGlzU2ltdWxhdGVkRmxhZ3M6ITAsZmxhZ3M6YSxmaXJzdENoYXI6ZyxsYXN0Q2hhcjpwLHRvVW5pY29kZTpiLHhIZWlnaHQ6MCxjYXBIZWlnaHQ6MCxpdGFsaWNBbmdsZTowLGlzVHlwZTNGb250Ond9O2NvbnN0IGk9Yy5nZXQoIldpZHRocyIpLHU9KDAsbC5nZXRTdGFuZGFyZEZvbnROYW1lKShlKTtsZXQgZD1udWxsO3JldHVybiB1JiYoZD1hd2FpdCB0aGlzLmZldGNoU3RhbmRhcmRGb250RGF0YSh1KSx2LmlzSW50ZXJuYWxGb250PSEhZCksIXYuaXNJbnRlcm5hbEZvbnQmJnRoaXMub3B0aW9ucy51c2VTeXN0ZW1Gb250cyYmKHYuc3lzdGVtRm9udEluZm89KDAsUy5nZXRGb250U3Vic3RpdHV0aW9uKSh0aGlzLnN5c3RlbUZvbnRDYWNoZSx0aGlzLmlkRmFjdG9yeSx0aGlzLm9wdGlvbnMuc3RhbmRhcmRGb250RGF0YVVybCxlLHUpKSx0aGlzLmV4dHJhY3REYXRhU3RydWN0dXJlcyhjLGMsdikudGhlbigocj0+e2lmKGkpe2NvbnN0IGU9W107bGV0IHQ9Zztmb3IoY29uc3QgciBvZiBpKWVbdCsrXT10aGlzLnhyZWYuZmV0Y2hJZlJlZihyKTtyLndpZHRocz1lfWVsc2Ugci53aWR0aHM9dGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aCh0LndpZHRocyxyKTtyZXR1cm4gbmV3IG8uRm9udChlLGQscil9KSl9aT1uZXcgcy5EaWN0KG51bGwpLGkuc2V0KCJGb250TmFtZSIscy5OYW1lLmdldChmKSksaS5zZXQoIkZvbnRCQm94IixjLmdldEFycmF5KCJGb250QkJveCIpfHxbMCwwLDAsMF0pfWxldCBBPWkuZ2V0KCJGb250TmFtZSIpLGs9Yy5nZXQoIkJhc2VGb250Iik7InN0cmluZyI9PXR5cGVvZiBBJiYoQT1zLk5hbWUuZ2V0KEEpKSwic3RyaW5nIj09dHlwZW9mIGsmJihrPXMuTmFtZS5nZXQoaykpO2NvbnN0IEM9bnVsbD09PSh0PUEpfHx2b2lkIDA9PT10P3ZvaWQgMDp0Lm5hbWUsTz1udWxsPT09KHI9ayl8fHZvaWQgMD09PXI/dm9pZCAwOnIubmFtZTtpZih3fHxDPT09T3x8KCgwLG4uaW5mbykoIlRoZSBGb250RGVzY3JpcHRvcidzIEZvbnROYW1lIGlzIFwiIi5jb25jYXQoQywnIiBidXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBGb250XCdzIEJhc2VGb250ICInKS5jb25jYXQoTywnIi4nKSksQyYmTyYmKE8uc3RhcnRzV2l0aChDKXx8ISgwLGwuaXNLbm93bkZvbnROYW1lKShDKSYmKDAsbC5pc0tub3duRm9udE5hbWUpKE8pKSYmKEE9bnVsbCkpLEF8fChBPWspLCEoQSBpbnN0YW5jZW9mIHMuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBuYW1lIik7bGV0IEYsSSxULE0sRTt0cnl7Rj1pLmdldCgiRm9udEZpbGUiLCJGb250RmlsZTIiLCJGb250RmlsZTMiKX1jYXRjaChlKXtpZighdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyl0aHJvdyBlOygwLG4ud2FybikoJ3RyYW5zbGF0ZUZvbnQgLSBmZXRjaGluZyAiJy5jb25jYXQoQS5uYW1lLCciIGZvbnQgZmlsZTogIicpLmNvbmNhdChlLCciLicpKSxGPW5ldyBtLk51bGxTdHJlYW19bGV0IFA9ITEsUj1udWxsLE49bnVsbDtpZihGKXtpZihGLmRpY3Qpe2NvbnN0IGU9Ri5kaWN0LmdldCgiU3VidHlwZSIpO2UgaW5zdGFuY2VvZiBzLk5hbWUmJihJPWUubmFtZSksVD1GLmRpY3QuZ2V0KCJMZW5ndGgxIiksTT1GLmRpY3QuZ2V0KCJMZW5ndGgyIiksRT1GLmRpY3QuZ2V0KCJMZW5ndGgzIil9fWVsc2UgaWYoeSl7Y29uc3QgZT0oMCx1LmdldFhmYUZvbnROYW1lKShBLm5hbWUpO2UmJih5LmZvbnRGYW1pbHk9IiIuY29uY2F0KHkuZm9udEZhbWlseSwiLVBkZkpTLVhGQSIpLHkubWV0cmljcz1lLm1ldHJpY3N8fG51bGwsUj1lLmZhY3RvcnN8fG51bGwsRj1hd2FpdCB0aGlzLmZldGNoU3RhbmRhcmRGb250RGF0YShlLm5hbWUpLFA9ISFGLGg9Yz0oMCx1LmdldFhmYUZvbnREaWN0KShBLm5hbWUpLGQ9ITApfWVsc2UgaWYoIXcpe2NvbnN0IGU9KDAsbC5nZXRTdGFuZGFyZEZvbnROYW1lKShBLm5hbWUpO2UmJihGPWF3YWl0IHRoaXMuZmV0Y2hTdGFuZGFyZEZvbnREYXRhKGUpLFA9ISFGKSwhUCYmdGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzJiYoTj0oMCxTLmdldEZvbnRTdWJzdGl0dXRpb24pKHRoaXMuc3lzdGVtRm9udENhY2hlLHRoaXMuaWRGYWN0b3J5LHRoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsLEEubmFtZSxlKSl9aWYodj17dHlwZTpmLG5hbWU6QS5uYW1lLHN1YnR5cGU6SSxmaWxlOkYsbGVuZ3RoMTpULGxlbmd0aDI6TSxsZW5ndGgzOkUsaXNJbnRlcm5hbEZvbnQ6UCxsb2FkZWROYW1lOmgubG9hZGVkTmFtZSxjb21wb3NpdGU6ZCxmaXhlZFBpdGNoOiExLGZvbnRNYXRyaXg6Yy5nZXRBcnJheSgiRm9udE1hdHJpeCIpfHxuLkZPTlRfSURFTlRJVFlfTUFUUklYLGZpcnN0Q2hhcjpnLGxhc3RDaGFyOnAsdG9Vbmljb2RlOmIsYmJveDppLmdldEFycmF5KCJGb250QkJveCIpfHxjLmdldEFycmF5KCJGb250QkJveCIpLGFzY2VudDppLmdldCgiQXNjZW50IiksZGVzY2VudDppLmdldCgiRGVzY2VudCIpLHhIZWlnaHQ6aS5nZXQoIlhIZWlnaHQiKXx8MCxjYXBIZWlnaHQ6aS5nZXQoIkNhcEhlaWdodCIpfHwwLGZsYWdzOmkuZ2V0KCJGbGFncyIpLGl0YWxpY0FuZ2xlOmkuZ2V0KCJJdGFsaWNBbmdsZSIpfHwwLGlzVHlwZTNGb250OncsY3NzRm9udEluZm86eSxzY2FsZUZhY3RvcnM6UixzeXN0ZW1Gb250SW5mbzpOfSxkKXtjb25zdCBlPWguZ2V0KCJFbmNvZGluZyIpO2UgaW5zdGFuY2VvZiBzLk5hbWUmJih2LmNpZEVuY29kaW5nPWUubmFtZSk7Y29uc3QgdD1hd2FpdCBhLkNNYXBGYWN0b3J5LmNyZWF0ZSh7ZW5jb2Rpbmc6ZSxmZXRjaEJ1aWx0SW5DTWFwOnRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCx1c2VDTWFwOm51bGx9KTt2LmNNYXA9dCx2LnZlcnRpY2FsPXYuY01hcC52ZXJ0aWNhbH1yZXR1cm4gdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoYyxoLHYpLnRoZW4oKGU9Pih0aGlzLmV4dHJhY3RXaWR0aHMoYyxpLGUpLG5ldyBvLkZvbnQoQS5uYW1lLEYsZSkpKSl9c3RhdGljIGJ1aWxkRm9udFBhdGhzKGUsdCxyLGEpe2Z1bmN0aW9uIGkodCl7Y29uc3QgaT0iIi5jb25jYXQoZS5sb2FkZWROYW1lLCJfcGF0aF8iKS5jb25jYXQodCk7dHJ5e2lmKGUucmVuZGVyZXIuaGFzQnVpbHRQYXRoKHQpKXJldHVybjtyLnNlbmQoImNvbW1vbm9iaiIsW2ksIkZvbnRQYXRoIixlLnJlbmRlcmVyLmdldFBhdGhKcyh0KV0pfWNhdGNoKGUpe2lmKGEuaWdub3JlRXJyb3JzKXJldHVybiB2b2lkKDAsbi53YXJuKSgiYnVpbGRGb250UGF0aHMgLSBpZ25vcmluZyAiLmNvbmNhdChpLCcgZ2x5cGg6ICInKS5jb25jYXQoZSwnIi4nKSk7dGhyb3cgZX19Zm9yKGNvbnN0IGUgb2YgdCl7aShlLmZvbnRDaGFyKTtjb25zdCB0PWUuYWNjZW50OyhudWxsPT10P3ZvaWQgMDp0LmZvbnRDaGFyKSYmaSh0LmZvbnRDaGFyKX19c3RhdGljIGdldCBmYWxsYmFja0ZvbnREaWN0KCl7Y29uc3QgZT1uZXcgcy5EaWN0O3JldHVybiBlLnNldCgiQmFzZUZvbnQiLHMuTmFtZS5nZXQoIkhlbHZldGljYSIpKSxlLnNldCgiVHlwZSIscy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpLGUuc2V0KCJTdWJ0eXBlIixzLk5hbWUuZ2V0KCJGYWxsYmFja1R5cGUiKSksZS5zZXQoIkVuY29kaW5nIixzLk5hbWUuZ2V0KCJXaW5BbnNpRW5jb2RpbmciKSksKDAsbi5zaGFkb3cpKHRoaXMsImZhbGxiYWNrRm9udERpY3QiLGUpfX10LlBhcnRpYWxFdmFsdWF0b3I9QjtjbGFzcyBMe2NvbnN0cnVjdG9yKGUpe2xldHtsb2FkZWROYW1lOnQsZm9udDpyLGRpY3Q6bixldmFsdWF0b3JPcHRpb25zOmF9PWU7dGhpcy5sb2FkZWROYW1lPXQsdGhpcy5mb250PXIsdGhpcy5kaWN0PW4sdGhpcy5fZXZhbHVhdG9yT3B0aW9ucz1hfHxFLHRoaXMudHlwZTNMb2FkZWQ9bnVsbCx0aGlzLnR5cGUzRGVwZW5kZW5jaWVzPXIuaXNUeXBlM0ZvbnQ/bmV3IFNldDpudWxsLHRoaXMuc2VudD0hMX1zZW5kKGUpe3RoaXMuc2VudHx8KHRoaXMuc2VudD0hMCxlLnNlbmQoImNvbW1vbm9iaiIsW3RoaXMubG9hZGVkTmFtZSwiRm9udCIsdGhpcy5mb250LmV4cG9ydERhdGEodGhpcy5fZXZhbHVhdG9yT3B0aW9ucy5mb250RXh0cmFQcm9wZXJ0aWVzKV0pKX1mYWxsYmFjayhlKXt0aGlzLmZvbnQuZGF0YSYmKHRoaXMuZm9udC5kaXNhYmxlRm9udEZhY2U9ITAsQi5idWlsZEZvbnRQYXRocyh0aGlzLmZvbnQsdGhpcy5mb250LmdseXBoQ2FjaGVWYWx1ZXMsZSx0aGlzLl9ldmFsdWF0b3JPcHRpb25zKSl9bG9hZFR5cGUzRGF0YShlLHQscil7aWYodGhpcy50eXBlM0xvYWRlZClyZXR1cm4gdGhpcy50eXBlM0xvYWRlZDtpZighdGhpcy5mb250LmlzVHlwZTNGb250KXRocm93IG5ldyBFcnJvcigiTXVzdCBiZSBhIFR5cGUzIGZvbnQuIik7Y29uc3QgYT1lLmNsb25lKHtpZ25vcmVFcnJvcnM6ITF9KTthLnBhcnNpbmdUeXBlM0ZvbnQ9ITA7Y29uc3QgaT1uZXcgcy5SZWZTZXQoZS50eXBlM0ZvbnRSZWZzKTt0aGlzLmRpY3Qub2JqSWQmJiFpLmhhcyh0aGlzLmRpY3Qub2JqSWQpJiZpLnB1dCh0aGlzLmRpY3Qub2JqSWQpLGEudHlwZTNGb250UmVmcz1pO2NvbnN0IG89dGhpcy5mb250LGM9dGhpcy50eXBlM0RlcGVuZGVuY2llcztsZXQgbD1Qcm9taXNlLnJlc29sdmUoKTtjb25zdCBoPXRoaXMuZGljdC5nZXQoIkNoYXJQcm9jcyIpLHU9dGhpcy5kaWN0LmdldCgiUmVzb3VyY2VzIil8fHQsZD1PYmplY3QuY3JlYXRlKG51bGwpLGY9bi5VdGlsLm5vcm1hbGl6ZVJlY3Qoby5iYm94fHxbMCwwLDAsMF0pLGc9ZlsyXS1mWzBdLHA9ZlszXS1mWzFdLG09TWF0aC5oeXBvdChnLHApO2Zvcihjb25zdCBlIG9mIGguZ2V0S2V5cygpKWw9bC50aGVuKCgoKT0+e2NvbnN0IHQ9aC5nZXQoZSksaT1uZXcgVC5PcGVyYXRvckxpc3Q7cmV0dXJuIGEuZ2V0T3BlcmF0b3JMaXN0KHtzdHJlYW06dCx0YXNrOnIscmVzb3VyY2VzOnUsb3BlcmF0b3JMaXN0Oml9KS50aGVuKCgoKT0+e2kuZm5BcnJheVswXT09PW4uT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcyYmdGhpcy5fcmVtb3ZlVHlwZTNDb2xvck9wZXJhdG9ycyhpLG0pLGRbZV09aS5nZXRJUigpO2Zvcihjb25zdCBlIG9mIGkuZGVwZW5kZW5jaWVzKWMuYWRkKGUpfSkpLmNhdGNoKChmdW5jdGlvbih0KXsoMCxuLndhcm4pKCdUeXBlMyBmb250IHJlc291cmNlICInLmNvbmNhdChlLCciIGlzIG5vdCBhdmFpbGFibGUuJykpO2NvbnN0IHI9bmV3IFQuT3BlcmF0b3JMaXN0O2RbZV09ci5nZXRJUigpfSkpfSkpO3JldHVybiB0aGlzLnR5cGUzTG9hZGVkPWwudGhlbigoKCk9PntvLmNoYXJQcm9jT3BlcmF0b3JMaXN0PWQsdGhpcy5fYmJveCYmKG8uaXNDaGFyQkJveD0hMCxvLmJib3g9dGhpcy5fYmJveCl9KSksdGhpcy50eXBlM0xvYWRlZH1fcmVtb3ZlVHlwZTNDb2xvck9wZXJhdG9ycyhlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06TmFOO2NvbnN0IHI9bi5VdGlsLm5vcm1hbGl6ZVJlY3QoZS5hcmdzQXJyYXlbMF0uc2xpY2UoMikpLGE9clsyXS1yWzBdLGk9clszXS1yWzFdLHM9TWF0aC5oeXBvdChhLGkpOzA9PT1hfHwwPT09aT8oZS5mbkFycmF5LnNwbGljZSgwLDEpLGUuYXJnc0FycmF5LnNwbGljZSgwLDEpKTooMD09PXR8fE1hdGgucm91bmQocy90KT49MTApJiYodGhpcy5fYmJveHx8KHRoaXMuX2Jib3g9WzEvMCwxLzAsLTEvMCwtMS8wXSksdGhpcy5fYmJveFswXT1NYXRoLm1pbih0aGlzLl9iYm94WzBdLHJbMF0pLHRoaXMuX2Jib3hbMV09TWF0aC5taW4odGhpcy5fYmJveFsxXSxyWzFdKSx0aGlzLl9iYm94WzJdPU1hdGgubWF4KHRoaXMuX2Jib3hbMl0sclsyXSksdGhpcy5fYmJveFszXT1NYXRoLm1heCh0aGlzLl9iYm94WzNdLHJbM10pKTtsZXQgbz0wLGM9ZS5sZW5ndGg7Zm9yKDtvPGM7KXtzd2l0Y2goZS5mbkFycmF5W29dKXtjYXNlIG4uT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kczpicmVhaztjYXNlIG4uT1BTLnNldFN0cm9rZUNvbG9yU3BhY2U6Y2FzZSBuLk9QUy5zZXRGaWxsQ29sb3JTcGFjZTpjYXNlIG4uT1BTLnNldFN0cm9rZUNvbG9yOmNhc2Ugbi5PUFMuc2V0U3Ryb2tlQ29sb3JOOmNhc2Ugbi5PUFMuc2V0RmlsbENvbG9yOmNhc2Ugbi5PUFMuc2V0RmlsbENvbG9yTjpjYXNlIG4uT1BTLnNldFN0cm9rZUdyYXk6Y2FzZSBuLk9QUy5zZXRGaWxsR3JheTpjYXNlIG4uT1BTLnNldFN0cm9rZVJHQkNvbG9yOmNhc2Ugbi5PUFMuc2V0RmlsbFJHQkNvbG9yOmNhc2Ugbi5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOmNhc2Ugbi5PUFMuc2V0RmlsbENNWUtDb2xvcjpjYXNlIG4uT1BTLnNoYWRpbmdGaWxsOmNhc2Ugbi5PUFMuc2V0UmVuZGVyaW5nSW50ZW50OmUuZm5BcnJheS5zcGxpY2UobywxKSxlLmFyZ3NBcnJheS5zcGxpY2UobywxKSxjLS07Y29udGludWU7Y2FzZSBuLk9QUy5zZXRHU3RhdGU6Y29uc3RbdF09ZS5hcmdzQXJyYXlbb107bGV0IHI9MCxhPXQubGVuZ3RoO2Zvcig7cjxhOyl7Y29uc3RbZV09dFtyXTtzd2l0Y2goZSl7Y2FzZSJUUiI6Y2FzZSJUUjIiOmNhc2UiSFQiOmNhc2UiQkciOmNhc2UiQkcyIjpjYXNlIlVDUiI6Y2FzZSJVQ1IyIjp0LnNwbGljZShyLDEpLGEtLTtjb250aW51ZX1yKyt9fW8rK319fWNsYXNzIF97Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bmV3IFU7dGhpcy5zdGF0ZT1lLHRoaXMuc3RhdGVTdGFjaz1bXX1zYXZlKCl7Y29uc3QgZT10aGlzLnN0YXRlO3RoaXMuc3RhdGVTdGFjay5wdXNoKHRoaXMuc3RhdGUpLHRoaXMuc3RhdGU9ZS5jbG9uZSgpfXJlc3RvcmUoKXtjb25zdCBlPXRoaXMuc3RhdGVTdGFjay5wb3AoKTtlJiYodGhpcy5zdGF0ZT1lKX10cmFuc2Zvcm0oZSl7dGhpcy5zdGF0ZS5jdG09bi5VdGlsLnRyYW5zZm9ybSh0aGlzLnN0YXRlLmN0bSxlKX19Y2xhc3Mgantjb25zdHJ1Y3Rvcigpe3RoaXMuY3RtPW5ldyBGbG9hdDMyQXJyYXkobi5JREVOVElUWV9NQVRSSVgpLHRoaXMuZm9udE5hbWU9bnVsbCx0aGlzLmZvbnRTaXplPTAsdGhpcy5sb2FkZWROYW1lPW51bGwsdGhpcy5mb250PW51bGwsdGhpcy5mb250TWF0cml4PW4uRk9OVF9JREVOVElUWV9NQVRSSVgsdGhpcy50ZXh0TWF0cml4PW4uSURFTlRJVFlfTUFUUklYLnNsaWNlKCksdGhpcy50ZXh0TGluZU1hdHJpeD1uLklERU5USVRZX01BVFJJWC5zbGljZSgpLHRoaXMuY2hhclNwYWNpbmc9MCx0aGlzLndvcmRTcGFjaW5nPTAsdGhpcy5sZWFkaW5nPTAsdGhpcy50ZXh0SFNjYWxlPTEsdGhpcy50ZXh0UmlzZT0wfXNldFRleHRNYXRyaXgoZSx0LHIsbixhLGkpe2NvbnN0IHM9dGhpcy50ZXh0TWF0cml4O3NbMF09ZSxzWzFdPXQsc1syXT1yLHNbM109bixzWzRdPWEsc1s1XT1pfXNldFRleHRMaW5lTWF0cml4KGUsdCxyLG4sYSxpKXtjb25zdCBzPXRoaXMudGV4dExpbmVNYXRyaXg7c1swXT1lLHNbMV09dCxzWzJdPXIsc1szXT1uLHNbNF09YSxzWzVdPWl9dHJhbnNsYXRlVGV4dE1hdHJpeChlLHQpe2NvbnN0IHI9dGhpcy50ZXh0TWF0cml4O3JbNF09clswXSplK3JbMl0qdCtyWzRdLHJbNV09clsxXSplK3JbM10qdCtyWzVdfXRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGUsdCl7Y29uc3Qgcj10aGlzLnRleHRMaW5lTWF0cml4O3JbNF09clswXSplK3JbMl0qdCtyWzRdLHJbNV09clsxXSplK3JbM10qdCtyWzVdfWNhcnJpYWdlUmV0dXJuKCl7dGhpcy50cmFuc2xhdGVUZXh0TGluZU1hdHJpeCgwLC10aGlzLmxlYWRpbmcpLHRoaXMudGV4dE1hdHJpeD10aGlzLnRleHRMaW5lTWF0cml4LnNsaWNlKCl9Y2xvbmUoKXtjb25zdCBlPU9iamVjdC5jcmVhdGUodGhpcyk7cmV0dXJuIGUudGV4dE1hdHJpeD10aGlzLnRleHRNYXRyaXguc2xpY2UoKSxlLnRleHRMaW5lTWF0cml4PXRoaXMudGV4dExpbmVNYXRyaXguc2xpY2UoKSxlLmZvbnRNYXRyaXg9dGhpcy5mb250TWF0cml4LnNsaWNlKCksZX19Y2xhc3MgVXtjb25zdHJ1Y3Rvcigpe3RoaXMuY3RtPW5ldyBGbG9hdDMyQXJyYXkobi5JREVOVElUWV9NQVRSSVgpLHRoaXMuZm9udD1udWxsLHRoaXMudGV4dFJlbmRlcmluZ01vZGU9bi5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMLHRoaXMuZmlsbENvbG9yU3BhY2U9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheSx0aGlzLnN0cm9rZUNvbG9yU3BhY2U9dy5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheX1jbG9uZSgpe3JldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpfX1jbGFzcyAke3N0YXRpYyBnZXQgb3BNYXAoKXtjb25zdCBlPSgwLGsuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS53PXtpZDpuLk9QUy5zZXRMaW5lV2lkdGgsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5KPXtpZDpuLk9QUy5zZXRMaW5lQ2FwLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuaj17aWQ6bi5PUFMuc2V0TGluZUpvaW4sbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5NPXtpZDpuLk9QUy5zZXRNaXRlckxpbWl0LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuZD17aWQ6bi5PUFMuc2V0RGFzaCxudW1BcmdzOjIsdmFyaWFibGVBcmdzOiExfSxlLnJpPXtpZDpuLk9QUy5zZXRSZW5kZXJpbmdJbnRlbnQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5pPXtpZDpuLk9QUy5zZXRGbGF0bmVzcyxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLmdzPXtpZDpuLk9QUy5zZXRHU3RhdGUsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5xPXtpZDpuLk9QUy5zYXZlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuUT17aWQ6bi5PUFMucmVzdG9yZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLmNtPXtpZDpuLk9QUy50cmFuc2Zvcm0sbnVtQXJnczo2LHZhcmlhYmxlQXJnczohMX0sZS5tPXtpZDpuLk9QUy5tb3ZlVG8sbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5sPXtpZDpuLk9QUy5saW5lVG8sbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5jPXtpZDpuLk9QUy5jdXJ2ZVRvLG51bUFyZ3M6Nix2YXJpYWJsZUFyZ3M6ITF9LGUudj17aWQ6bi5PUFMuY3VydmVUbzIsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMX0sZS55PXtpZDpuLk9QUy5jdXJ2ZVRvMyxudW1BcmdzOjQsdmFyaWFibGVBcmdzOiExfSxlLmg9e2lkOm4uT1BTLmNsb3NlUGF0aCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLnJlPXtpZDpuLk9QUy5yZWN0YW5nbGUsbnVtQXJnczo0LHZhcmlhYmxlQXJnczohMX0sZS5TPXtpZDpuLk9QUy5zdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5zPXtpZDpuLk9QUy5jbG9zZVN0cm9rZSxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLmY9e2lkOm4uT1BTLmZpbGwsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5GPXtpZDpuLk9QUy5maWxsLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGVbImYqIl09e2lkOm4uT1BTLmVvRmlsbCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLkI9e2lkOm4uT1BTLmZpbGxTdHJva2UsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZVsiQioiXT17aWQ6bi5PUFMuZW9GaWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuYj17aWQ6bi5PUFMuY2xvc2VGaWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGVbImIqIl09e2lkOm4uT1BTLmNsb3NlRU9GaWxsU3Ryb2tlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUubj17aWQ6bi5PUFMuZW5kUGF0aCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLlc9e2lkOm4uT1BTLmNsaXAsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZVsiVyoiXT17aWQ6bi5PUFMuZW9DbGlwLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuQlQ9e2lkOm4uT1BTLmJlZ2luVGV4dCxudW1BcmdzOjAsdmFyaWFibGVBcmdzOiExfSxlLkVUPXtpZDpuLk9QUy5lbmRUZXh0LG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuVGM9e2lkOm4uT1BTLnNldENoYXJTcGFjaW5nLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuVHc9e2lkOm4uT1BTLnNldFdvcmRTcGFjaW5nLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuVHo9e2lkOm4uT1BTLnNldEhTY2FsZSxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLlRMPXtpZDpuLk9QUy5zZXRMZWFkaW5nLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuVGY9e2lkOm4uT1BTLnNldEZvbnQsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5Ucj17aWQ6bi5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGUsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5Ucz17aWQ6bi5PUFMuc2V0VGV4dFJpc2UsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5UZD17aWQ6bi5PUFMubW92ZVRleHQsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5URD17aWQ6bi5PUFMuc2V0TGVhZGluZ01vdmVUZXh0LG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9LGUuVG09e2lkOm4uT1BTLnNldFRleHRNYXRyaXgsbnVtQXJnczo2LHZhcmlhYmxlQXJnczohMX0sZVsiVCoiXT17aWQ6bi5PUFMubmV4dExpbmUsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5Uaj17aWQ6bi5PUFMuc2hvd1RleHQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5USj17aWQ6bi5PUFMuc2hvd1NwYWNlZFRleHQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZVsiJyJdPXtpZDpuLk9QUy5uZXh0TGluZVNob3dUZXh0LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGVbJyInXT17aWQ6bi5PUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQsbnVtQXJnczozLHZhcmlhYmxlQXJnczohMX0sZS5kMD17aWQ6bi5PUFMuc2V0Q2hhcldpZHRoLG51bUFyZ3M6Mix2YXJpYWJsZUFyZ3M6ITF9LGUuZDE9e2lkOm4uT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcyxudW1BcmdzOjYsdmFyaWFibGVBcmdzOiExfSxlLkNTPXtpZDpuLk9QUy5zZXRTdHJva2VDb2xvclNwYWNlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuY3M9e2lkOm4uT1BTLnNldEZpbGxDb2xvclNwYWNlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuU0M9e2lkOm4uT1BTLnNldFN0cm9rZUNvbG9yLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITB9LGUuU0NOPXtpZDpuLk9QUy5zZXRTdHJva2VDb2xvck4sbnVtQXJnczozMyx2YXJpYWJsZUFyZ3M6ITB9LGUuc2M9e2lkOm4uT1BTLnNldEZpbGxDb2xvcixudW1BcmdzOjQsdmFyaWFibGVBcmdzOiEwfSxlLnNjbj17aWQ6bi5PUFMuc2V0RmlsbENvbG9yTixudW1BcmdzOjMzLHZhcmlhYmxlQXJnczohMH0sZS5HPXtpZDpuLk9QUy5zZXRTdHJva2VHcmF5LG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuZz17aWQ6bi5PUFMuc2V0RmlsbEdyYXksbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5SRz17aWQ6bi5PUFMuc2V0U3Ryb2tlUkdCQ29sb3IsbnVtQXJnczozLHZhcmlhYmxlQXJnczohMX0sZS5yZz17aWQ6bi5PUFMuc2V0RmlsbFJHQkNvbG9yLG51bUFyZ3M6Myx2YXJpYWJsZUFyZ3M6ITF9LGUuSz17aWQ6bi5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yLG51bUFyZ3M6NCx2YXJpYWJsZUFyZ3M6ITF9LGUuaz17aWQ6bi5PUFMuc2V0RmlsbENNWUtDb2xvcixudW1BcmdzOjQsdmFyaWFibGVBcmdzOiExfSxlLnNoPXtpZDpuLk9QUy5zaGFkaW5nRmlsbCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLkJJPXtpZDpuLk9QUy5iZWdpbklubGluZUltYWdlLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuSUQ9e2lkOm4uT1BTLmJlZ2luSW1hZ2VEYXRhLG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuRUk9e2lkOm4uT1BTLmVuZElubGluZUltYWdlLG51bUFyZ3M6MSx2YXJpYWJsZUFyZ3M6ITF9LGUuRG89e2lkOm4uT1BTLnBhaW50WE9iamVjdCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLk1QPXtpZDpuLk9QUy5tYXJrUG9pbnQsbnVtQXJnczoxLHZhcmlhYmxlQXJnczohMX0sZS5EUD17aWQ6bi5PUFMubWFya1BvaW50UHJvcHMsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5CTUM9e2lkOm4uT1BTLmJlZ2luTWFya2VkQ29udGVudCxudW1BcmdzOjEsdmFyaWFibGVBcmdzOiExfSxlLkJEQz17aWQ6bi5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsbnVtQXJnczoyLHZhcmlhYmxlQXJnczohMX0sZS5FTUM9e2lkOm4uT1BTLmVuZE1hcmtlZENvbnRlbnQsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5CWD17aWQ6bi5PUFMuYmVnaW5Db21wYXQsbnVtQXJnczowLHZhcmlhYmxlQXJnczohMX0sZS5FWD17aWQ6bi5PUFMuZW5kQ29tcGF0LG51bUFyZ3M6MCx2YXJpYWJsZUFyZ3M6ITF9LGUuQk09bnVsbCxlLkJEPW51bGwsZS50cnVlPW51bGwsZS5mYT1udWxsLGUuZmFsPW51bGwsZS5mYWxzPW51bGwsZS5mYWxzZT1udWxsLGUubnU9bnVsbCxlLm51bD1udWxsLGUubnVsbD1udWxsfSkpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJvcE1hcCIsZSgpKX1jb25zdHJ1Y3RvcihlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpuZXcgXzt0aGlzLnBhcnNlcj1uZXcgZy5QYXJzZXIoe2xleGVyOm5ldyBnLkxleGVyKGUsJC5vcE1hcCkseHJlZjp0fSksdGhpcy5zdGF0ZU1hbmFnZXI9cix0aGlzLm5vblByb2Nlc3NlZEFyZ3M9W10sdGhpcy5faXNQYXRoT3A9ITEsdGhpcy5fbnVtSW52YWxpZFBhdGhPUFM9MH1nZXQgc2F2ZWRTdGF0ZXNEZXB0aCgpe3JldHVybiB0aGlzLnN0YXRlTWFuYWdlci5zdGF0ZVN0YWNrLmxlbmd0aH1yZWFkKGUpe2xldCB0PWUuYXJncztmb3IoOzspe2NvbnN0IHI9dGhpcy5wYXJzZXIuZ2V0T2JqKCk7aWYociBpbnN0YW5jZW9mIHMuQ21kKXtjb25zdCBhPXIuY21kLGk9JC5vcE1hcFthXTtpZighaSl7KDAsbi53YXJuKSgnVW5rbm93biBjb21tYW5kICInLmNvbmNhdChhLCciLicpKTtjb250aW51ZX1jb25zdCBzPWkuaWQsbz1pLm51bUFyZ3M7bGV0IGM9bnVsbCE9PXQ/dC5sZW5ndGg6MDtpZih0aGlzLl9pc1BhdGhPcHx8KHRoaXMuX251bUludmFsaWRQYXRoT1BTPTApLHRoaXMuX2lzUGF0aE9wPXM+PW4uT1BTLm1vdmVUbyYmczw9bi5PUFMuZW5kUGF0aCxpLnZhcmlhYmxlQXJncyljPm8mJigwLG4uaW5mbykoIkNvbW1hbmQgIi5jb25jYXQoYSwiOiBleHBlY3RlZCBbMCwgIikuY29uY2F0KG8sIl0gYXJncywgYnV0IHJlY2VpdmVkICIpLmNvbmNhdChjLCIgYXJncy4iKSk7ZWxzZXtpZihjIT09byl7Y29uc3QgZT10aGlzLm5vblByb2Nlc3NlZEFyZ3M7Zm9yKDtjPm87KWUucHVzaCh0LnNoaWZ0KCkpLGMtLTtmb3IoO2M8byYmMCE9PWUubGVuZ3RoOyludWxsPT09dCYmKHQ9W10pLHQudW5zaGlmdChlLnBvcCgpKSxjKyt9aWYoYzxvKXtjb25zdCBlPSJjb21tYW5kICIuY29uY2F0KGEsIjogZXhwZWN0ZWQgIikuY29uY2F0KG8sIiBhcmdzLCBidXQgcmVjZWl2ZWQgIikuY29uY2F0KGMsIiBhcmdzLiIpO2lmKHRoaXMuX2lzUGF0aE9wJiYrK3RoaXMuX251bUludmFsaWRQYXRoT1BTPiQuTUFYX0lOVkFMSURfUEFUSF9PUFMpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgIi5jb25jYXQoZSkpOygwLG4ud2FybikoIlNraXBwaW5nICIuY29uY2F0KGUpKSxudWxsIT09dCYmKHQubGVuZ3RoPTApO2NvbnRpbnVlfX1yZXR1cm4gdGhpcy5wcmVwcm9jZXNzQ29tbWFuZChzLHQpLGUuZm49cyxlLmFyZ3M9dCwhMH1pZihyPT09cy5FT0YpcmV0dXJuITE7aWYobnVsbCE9PXImJihudWxsPT09dCYmKHQ9W10pLHQucHVzaChyKSx0Lmxlbmd0aD4zMykpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyIpfX1wcmVwcm9jZXNzQ29tbWFuZChlLHQpe3N3aXRjaCgwfGUpe2Nhc2Ugbi5PUFMuc2F2ZTp0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7YnJlYWs7Y2FzZSBuLk9QUy5yZXN0b3JlOnRoaXMuc3RhdGVNYW5hZ2VyLnJlc3RvcmUoKTticmVhaztjYXNlIG4uT1BTLnRyYW5zZm9ybTp0aGlzLnN0YXRlTWFuYWdlci50cmFuc2Zvcm0odCl9fX1pKCQsIk1BWF9JTlZBTElEX1BBVEhfT1BTIiwxMCksdC5FdmFsdWF0b3JQcmVwcm9jZXNzb3I9JH0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LklkZW50aXR5Q01hcD10LkNNYXBGYWN0b3J5PXQuQ01hcD12b2lkIDAscigxMzkpLHIoMik7dmFyIG49cigxNDQpLGE9cigxNTApLGk9cigxNTEpLHM9cigxNjUpLG89cigxNjYpLGM9cigxNDkpLGw9cigxNTQpO2NvbnN0IGg9WyJBZG9iZS1HQjEtVUNTMiIsIkFkb2JlLUNOUzEtVUNTMiIsIkFkb2JlLUphcGFuMS1VQ1MyIiwiQWRvYmUtS29yZWExLVVDUzIiLCI3OC1FVUMtSCIsIjc4LUVVQy1WIiwiNzgtSCIsIjc4LVJLU0otSCIsIjc4LVJLU0otViIsIjc4LVYiLCI3OG1zLVJLU0otSCIsIjc4bXMtUktTSi1WIiwiODNwdi1SS1NKLUgiLCI5MG1zLVJLU0otSCIsIjkwbXMtUktTSi1WIiwiOTBtc3AtUktTSi1IIiwiOTBtc3AtUktTSi1WIiwiOTBwdi1SS1NKLUgiLCI5MHB2LVJLU0otViIsIkFkZC1IIiwiQWRkLVJLU0otSCIsIkFkZC1SS1NKLVYiLCJBZGQtViIsIkFkb2JlLUNOUzEtMCIsIkFkb2JlLUNOUzEtMSIsIkFkb2JlLUNOUzEtMiIsIkFkb2JlLUNOUzEtMyIsIkFkb2JlLUNOUzEtNCIsIkFkb2JlLUNOUzEtNSIsIkFkb2JlLUNOUzEtNiIsIkFkb2JlLUdCMS0wIiwiQWRvYmUtR0IxLTEiLCJBZG9iZS1HQjEtMiIsIkFkb2JlLUdCMS0zIiwiQWRvYmUtR0IxLTQiLCJBZG9iZS1HQjEtNSIsIkFkb2JlLUphcGFuMS0wIiwiQWRvYmUtSmFwYW4xLTEiLCJBZG9iZS1KYXBhbjEtMiIsIkFkb2JlLUphcGFuMS0zIiwiQWRvYmUtSmFwYW4xLTQiLCJBZG9iZS1KYXBhbjEtNSIsIkFkb2JlLUphcGFuMS02IiwiQWRvYmUtS29yZWExLTAiLCJBZG9iZS1Lb3JlYTEtMSIsIkFkb2JlLUtvcmVhMS0yIiwiQjUtSCIsIkI1LVYiLCJCNXBjLUgiLCJCNXBjLVYiLCJDTlMtRVVDLUgiLCJDTlMtRVVDLVYiLCJDTlMxLUgiLCJDTlMxLVYiLCJDTlMyLUgiLCJDTlMyLVYiLCJFVEhLLUI1LUgiLCJFVEhLLUI1LVYiLCJFVGVuLUI1LUgiLCJFVGVuLUI1LVYiLCJFVGVubXMtQjUtSCIsIkVUZW5tcy1CNS1WIiwiRVVDLUgiLCJFVUMtViIsIkV4dC1IIiwiRXh0LVJLU0otSCIsIkV4dC1SS1NKLVYiLCJFeHQtViIsIkdCLUVVQy1IIiwiR0ItRVVDLVYiLCJHQi1IIiwiR0ItViIsIkdCSy1FVUMtSCIsIkdCSy1FVUMtViIsIkdCSzJLLUgiLCJHQksySy1WIiwiR0JLcC1FVUMtSCIsIkdCS3AtRVVDLVYiLCJHQlQtRVVDLUgiLCJHQlQtRVVDLVYiLCJHQlQtSCIsIkdCVC1WIiwiR0JUcGMtRVVDLUgiLCJHQlRwYy1FVUMtViIsIkdCcGMtRVVDLUgiLCJHQnBjLUVVQy1WIiwiSCIsIkhLZGxhLUI1LUgiLCJIS2RsYS1CNS1WIiwiSEtkbGItQjUtSCIsIkhLZGxiLUI1LVYiLCJIS2djY3MtQjUtSCIsIkhLZ2Njcy1CNS1WIiwiSEttMzE0LUI1LUgiLCJIS20zMTQtQjUtViIsIkhLbTQ3MS1CNS1IIiwiSEttNDcxLUI1LVYiLCJIS3Njcy1CNS1IIiwiSEtzY3MtQjUtViIsIkhhbmtha3UiLCJIaXJhZ2FuYSIsIktTQy1FVUMtSCIsIktTQy1FVUMtViIsIktTQy1IIiwiS1NDLUpvaGFiLUgiLCJLU0MtSm9oYWItViIsIktTQy1WIiwiS1NDbXMtVUhDLUgiLCJLU0Ntcy1VSEMtSFctSCIsIktTQ21zLVVIQy1IVy1WIiwiS1NDbXMtVUhDLVYiLCJLU0NwYy1FVUMtSCIsIktTQ3BjLUVVQy1WIiwiS2F0YWthbmEiLCJOV1AtSCIsIk5XUC1WIiwiUktTSi1IIiwiUktTSi1WIiwiUm9tYW4iLCJVbmlDTlMtVUNTMi1IIiwiVW5pQ05TLVVDUzItViIsIlVuaUNOUy1VVEYxNi1IIiwiVW5pQ05TLVVURjE2LVYiLCJVbmlDTlMtVVRGMzItSCIsIlVuaUNOUy1VVEYzMi1WIiwiVW5pQ05TLVVURjgtSCIsIlVuaUNOUy1VVEY4LVYiLCJVbmlHQi1VQ1MyLUgiLCJVbmlHQi1VQ1MyLVYiLCJVbmlHQi1VVEYxNi1IIiwiVW5pR0ItVVRGMTYtViIsIlVuaUdCLVVURjMyLUgiLCJVbmlHQi1VVEYzMi1WIiwiVW5pR0ItVVRGOC1IIiwiVW5pR0ItVVRGOC1WIiwiVW5pSklTLVVDUzItSCIsIlVuaUpJUy1VQ1MyLUhXLUgiLCJVbmlKSVMtVUNTMi1IVy1WIiwiVW5pSklTLVVDUzItViIsIlVuaUpJUy1VVEYxNi1IIiwiVW5pSklTLVVURjE2LVYiLCJVbmlKSVMtVVRGMzItSCIsIlVuaUpJUy1VVEYzMi1WIiwiVW5pSklTLVVURjgtSCIsIlVuaUpJUy1VVEY4LVYiLCJVbmlKSVMyMDA0LVVURjE2LUgiLCJVbmlKSVMyMDA0LVVURjE2LVYiLCJVbmlKSVMyMDA0LVVURjMyLUgiLCJVbmlKSVMyMDA0LVVURjMyLVYiLCJVbmlKSVMyMDA0LVVURjgtSCIsIlVuaUpJUzIwMDQtVVRGOC1WIiwiVW5pSklTUHJvLVVDUzItSFctViIsIlVuaUpJU1Byby1VQ1MyLVYiLCJVbmlKSVNQcm8tVVRGOC1WIiwiVW5pSklTWDAyMTMtVVRGMzItSCIsIlVuaUpJU1gwMjEzLVVURjMyLVYiLCJVbmlKSVNYMDIxMzIwMDQtVVRGMzItSCIsIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1WIiwiVW5pS1MtVUNTMi1IIiwiVW5pS1MtVUNTMi1WIiwiVW5pS1MtVVRGMTYtSCIsIlVuaUtTLVVURjE2LVYiLCJVbmlLUy1VVEYzMi1IIiwiVW5pS1MtVVRGMzItViIsIlVuaUtTLVVURjgtSCIsIlVuaUtTLVVURjgtViIsIlYiLCJXUC1TeW1ib2wiXSx1PTIqKjI0LTE7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07dGhpcy5jb2Rlc3BhY2VSYW5nZXM9W1tdLFtdLFtdLFtdXSx0aGlzLm51bUNvZGVzcGFjZVJhbmdlcz0wLHRoaXMuX21hcD1bXSx0aGlzLm5hbWU9IiIsdGhpcy52ZXJ0aWNhbD0hMSx0aGlzLnVzZUNNYXA9bnVsbCx0aGlzLmJ1aWx0SW5DTWFwPWV9YWRkQ29kZXNwYWNlUmFuZ2UoZSx0LHIpe3RoaXMuY29kZXNwYWNlUmFuZ2VzW2UtMV0ucHVzaCh0LHIpLHRoaXMubnVtQ29kZXNwYWNlUmFuZ2VzKyt9bWFwQ2lkUmFuZ2UoZSx0LHIpe2lmKHQtZT51KXRocm93IG5ldyBFcnJvcigibWFwQ2lkUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7Zm9yKDtlPD10Oyl0aGlzLl9tYXBbZSsrXT1yKyt9bWFwQmZSYW5nZShlLHQscil7aWYodC1lPnUpdGhyb3cgbmV3IEVycm9yKCJtYXBCZlJhbmdlIC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpO2NvbnN0IG49ci5sZW5ndGgtMTtmb3IoO2U8PXQ7KXt0aGlzLl9tYXBbZSsrXT1yO2NvbnN0IHQ9ci5jaGFyQ29kZUF0KG4pKzE7cj10PjI1NT9yLnN1YnN0cmluZygwLG4tMSkrU3RyaW5nLmZyb21DaGFyQ29kZShyLmNoYXJDb2RlQXQobi0xKSsxKSsiXDAiOnIuc3Vic3RyaW5nKDAsbikrU3RyaW5nLmZyb21DaGFyQ29kZSh0KX19bWFwQmZSYW5nZVRvQXJyYXkoZSx0LHIpe2lmKHQtZT51KXRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZVRvQXJyYXkgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7Y29uc3Qgbj1yLmxlbmd0aDtsZXQgYT0wO2Zvcig7ZTw9dCYmYTxuOyl0aGlzLl9tYXBbZV09clthKytdLCsrZX1tYXBPbmUoZSx0KXt0aGlzLl9tYXBbZV09dH1sb29rdXAoZSl7cmV0dXJuIHRoaXMuX21hcFtlXX1jb250YWlucyhlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fbWFwW2VdfWZvckVhY2goZSl7Y29uc3QgdD10aGlzLl9tYXAscj10Lmxlbmd0aDtpZihyPD02NTUzNilmb3IobGV0IG49MDtuPHI7bisrKXZvaWQgMCE9PXRbbl0mJmUobix0W25dKTtlbHNlIGZvcihjb25zdCByIGluIHQpZShyLHRbcl0pfWNoYXJDb2RlT2YoZSl7Y29uc3QgdD10aGlzLl9tYXA7aWYodC5sZW5ndGg8PTY1NTM2KXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKGNvbnN0IHIgaW4gdClpZih0W3JdPT09ZSlyZXR1cm4gMHxyO3JldHVybi0xfWdldE1hcCgpe3JldHVybiB0aGlzLl9tYXB9cmVhZENoYXJDb2RlKGUsdCxyKXtsZXQgbj0wO2NvbnN0IGE9dGhpcy5jb2Rlc3BhY2VSYW5nZXM7Zm9yKGxldCBpPTAscz1hLmxlbmd0aDtpPHM7aSsrKXtuPShuPDw4fGUuY2hhckNvZGVBdCh0K2kpKT4+PjA7Y29uc3Qgcz1hW2ldO2ZvcihsZXQgZT0wLHQ9cy5sZW5ndGg7ZTx0Oyl7Y29uc3QgdD1zW2UrK10sYT1zW2UrK107aWYobj49dCYmbjw9YSlyZXR1cm4gci5jaGFyY29kZT1uLHZvaWQoci5sZW5ndGg9aSsxKX19ci5jaGFyY29kZT0wLHIubGVuZ3RoPTF9Z2V0Q2hhckNvZGVMZW5ndGgoZSl7Y29uc3QgdD10aGlzLmNvZGVzcGFjZVJhbmdlcztmb3IobGV0IHI9MCxuPXQubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49dFtyXTtmb3IobGV0IHQ9MCxhPW4ubGVuZ3RoO3Q8YTspe2NvbnN0IGE9blt0KytdLGk9blt0KytdO2lmKGU+PWEmJmU8PWkpcmV0dXJuIHIrMX19cmV0dXJuIDF9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLl9tYXAubGVuZ3RofWdldCBpc0lkZW50aXR5Q01hcCgpe2lmKCJJZGVudGl0eS1IIiE9PXRoaXMubmFtZSYmIklkZW50aXR5LVYiIT09dGhpcy5uYW1lKXJldHVybiExO2lmKDY1NTM2IT09dGhpcy5fbWFwLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGU9MDtlPDY1NTM2O2UrKylpZih0aGlzLl9tYXBbZV0hPT1lKXJldHVybiExO3JldHVybiEwfX10LkNNYXA9ZDtjbGFzcyBmIGV4dGVuZHMgZHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCksdGhpcy52ZXJ0aWNhbD1lLHRoaXMuYWRkQ29kZXNwYWNlUmFuZ2UodCwwLDY1NTM1KX1tYXBDaWRSYW5nZShlLHQscil7KDAsbi51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBDaWRSYW5nZSIpfW1hcEJmUmFuZ2UoZSx0LHIpeygwLG4udW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZSIpfW1hcEJmUmFuZ2VUb0FycmF5KGUsdCxyKXsoMCxuLnVucmVhY2hhYmxlKSgic2hvdWxkIG5vdCBjYWxsIG1hcEJmUmFuZ2VUb0FycmF5Iil9bWFwT25lKGUsdCl7KDAsbi51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBDaWRPbmUiKX1sb29rdXAoZSl7cmV0dXJuIE51bWJlci5pc0ludGVnZXIoZSkmJmU8PTY1NTM1P2U6dm9pZCAwfWNvbnRhaW5zKGUpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPD02NTUzNX1mb3JFYWNoKGUpe2ZvcihsZXQgdD0wO3Q8PTY1NTM1O3QrKyllKHQsdCl9Y2hhckNvZGVPZihlKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihlKSYmZTw9NjU1MzU/ZTotMX1nZXRNYXAoKXtjb25zdCBlPW5ldyBBcnJheSg2NTUzNik7Zm9yKGxldCB0PTA7dDw9NjU1MzU7dCsrKWVbdF09dDtyZXR1cm4gZX1nZXQgbGVuZ3RoKCl7cmV0dXJuIDY1NTM2fWdldCBpc0lkZW50aXR5Q01hcCgpeygwLG4udW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGFjY2VzcyAuaXNJZGVudGl0eUNNYXAiKX19ZnVuY3Rpb24gZyhlKXtsZXQgdD0wO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXQ9dDw8OHxlLmNoYXJDb2RlQXQocik7cmV0dXJuIHQ+Pj4wfWZ1bmN0aW9uIHAoZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJNYWxmb3JtZWQgQ01hcDogZXhwZWN0ZWQgc3RyaW5nLiIpfWZ1bmN0aW9uIG0oZSl7aWYoIU51bWJlci5pc0ludGVnZXIoZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBpbnQuIil9ZnVuY3Rpb24gYihlLHQpe2Zvcig7Oyl7bGV0IHI9dC5nZXRPYmooKTtpZihyPT09YS5FT0YpYnJlYWs7aWYoKDAsYS5pc0NtZCkociwiZW5kYmZjaGFyIikpcmV0dXJuO3Aocik7Y29uc3Qgbj1nKHIpO3I9dC5nZXRPYmooKSxwKHIpO2NvbnN0IGk9cjtlLm1hcE9uZShuLGkpfX1mdW5jdGlvbiB5KGUsdCl7Zm9yKDs7KXtsZXQgcj10LmdldE9iaigpO2lmKHI9PT1hLkVPRilicmVhaztpZigoMCxhLmlzQ21kKShyLCJlbmRiZnJhbmdlIikpcmV0dXJuO3Aocik7Y29uc3Qgbj1nKHIpO3I9dC5nZXRPYmooKSxwKHIpO2NvbnN0IGk9ZyhyKTtpZihyPXQuZ2V0T2JqKCksTnVtYmVyLmlzSW50ZWdlcihyKXx8InN0cmluZyI9PXR5cGVvZiByKXtjb25zdCB0PU51bWJlci5pc0ludGVnZXIocik/U3RyaW5nLmZyb21DaGFyQ29kZShyKTpyO2UubWFwQmZSYW5nZShuLGksdCl9ZWxzZXtpZighKDAsYS5pc0NtZCkociwiWyIpKWJyZWFrO3tyPXQuZ2V0T2JqKCk7Y29uc3Qgcz1bXTtmb3IoOyEoMCxhLmlzQ21kKShyLCJdIikmJnIhPT1hLkVPRjspcy5wdXNoKHIpLHI9dC5nZXRPYmooKTtlLm1hcEJmUmFuZ2VUb0FycmF5KG4saSxzKX19fXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGJmIHJhbmdlLiIpfWZ1bmN0aW9uIHcoZSx0KXtmb3IoOzspe2xldCByPXQuZ2V0T2JqKCk7aWYocj09PWEuRU9GKWJyZWFrO2lmKCgwLGEuaXNDbWQpKHIsImVuZGNpZGNoYXIiKSlyZXR1cm47cChyKTtjb25zdCBuPWcocik7cj10LmdldE9iaigpLG0ocik7Y29uc3QgaT1yO2UubWFwT25lKG4saSl9fWZ1bmN0aW9uIHYoZSx0KXtmb3IoOzspe2xldCByPXQuZ2V0T2JqKCk7aWYocj09PWEuRU9GKWJyZWFrO2lmKCgwLGEuaXNDbWQpKHIsImVuZGNpZHJhbmdlIikpcmV0dXJuO3Aocik7Y29uc3Qgbj1nKHIpO3I9dC5nZXRPYmooKSxwKHIpO2NvbnN0IGk9ZyhyKTtyPXQuZ2V0T2JqKCksbShyKTtjb25zdCBzPXI7ZS5tYXBDaWRSYW5nZShuLGkscyl9fWZ1bmN0aW9uIHgoZSx0KXtmb3IoOzspe2xldCByPXQuZ2V0T2JqKCk7aWYocj09PWEuRU9GKWJyZWFrO2lmKCgwLGEuaXNDbWQpKHIsImVuZGNvZGVzcGFjZXJhbmdlIikpcmV0dXJuO2lmKCJzdHJpbmciIT10eXBlb2YgcilicmVhaztjb25zdCBuPWcocik7aWYocj10LmdldE9iaigpLCJzdHJpbmciIT10eXBlb2YgcilicmVhaztjb25zdCBpPWcocik7ZS5hZGRDb2Rlc3BhY2VSYW5nZShyLmxlbmd0aCxuLGkpfXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGNvZGVzcGFjZSByYW5nZS4iKX1mdW5jdGlvbiBTKGUsdCl7Y29uc3Qgcj10LmdldE9iaigpO051bWJlci5pc0ludGVnZXIocikmJihlLnZlcnRpY2FsPSEhcil9ZnVuY3Rpb24gQShlLHQpe2NvbnN0IHI9dC5nZXRPYmooKTtyIGluc3RhbmNlb2YgYS5OYW1lJiYoZS5uYW1lPXIubmFtZSl9YXN5bmMgZnVuY3Rpb24gayhlLHQscixpKXtsZXQgcyxvO2U6Zm9yKDs7KXRyeXtjb25zdCByPXQuZ2V0T2JqKCk7aWYocj09PWEuRU9GKWJyZWFrO2lmKHIgaW5zdGFuY2VvZiBhLk5hbWUpIldNb2RlIj09PXIubmFtZT9TKGUsdCk6IkNNYXBOYW1lIj09PXIubmFtZSYmQShlLHQpLHM9cjtlbHNlIGlmKHIgaW5zdGFuY2VvZiBhLkNtZClzd2l0Y2goci5jbWQpe2Nhc2UiZW5kY21hcCI6YnJlYWsgZTtjYXNlInVzZWNtYXAiOnMgaW5zdGFuY2VvZiBhLk5hbWUmJihvPXMubmFtZSk7YnJlYWs7Y2FzZSJiZWdpbmNvZGVzcGFjZXJhbmdlIjp4KGUsdCk7YnJlYWs7Y2FzZSJiZWdpbmJmY2hhciI6YihlLHQpO2JyZWFrO2Nhc2UiYmVnaW5jaWRjaGFyIjp3KGUsdCk7YnJlYWs7Y2FzZSJiZWdpbmJmcmFuZ2UiOnkoZSx0KTticmVhaztjYXNlImJlZ2luY2lkcmFuZ2UiOnYoZSx0KX19Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIGMuTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxuLndhcm4pKCJJbnZhbGlkIGNNYXAgZGF0YTogIitlKTtjb250aW51ZX1yZXR1cm4haSYmbyYmKGk9byksaT9DKGUscixpKTplfWFzeW5jIGZ1bmN0aW9uIEMoZSx0LHIpe2lmKGUudXNlQ01hcD1hd2FpdCBPKHIsdCksMD09PWUubnVtQ29kZXNwYWNlUmFuZ2VzKXtjb25zdCB0PWUudXNlQ01hcC5jb2Rlc3BhY2VSYW5nZXM7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZS5jb2Rlc3BhY2VSYW5nZXNbcl09dFtyXS5zbGljZSgpO2UubnVtQ29kZXNwYWNlUmFuZ2VzPWUudXNlQ01hcC5udW1Db2Rlc3BhY2VSYW5nZXN9cmV0dXJuIGUudXNlQ01hcC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2UuY29udGFpbnModCl8fGUubWFwT25lKHQsZS51c2VDTWFwLmxvb2t1cCh0KSl9KSksZX1hc3luYyBmdW5jdGlvbiBPKGUsdCl7aWYoIklkZW50aXR5LUgiPT09ZSlyZXR1cm4gbmV3IGYoITEsMik7aWYoIklkZW50aXR5LVYiPT09ZSlyZXR1cm4gbmV3IGYoITAsMik7aWYoIWguaW5jbHVkZXMoZSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIENNYXAgbmFtZTogIitlKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIkJ1aWx0LWluIENNYXAgcGFyYW1ldGVycyBhcmUgbm90IHByb3ZpZGVkLiIpO2NvbnN0e2NNYXBEYXRhOnIsY29tcHJlc3Npb25UeXBlOmF9PWF3YWl0IHQoZSksaT1uZXcgZCghMCk7aWYoYT09PW4uQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkpcmV0dXJuKG5ldyBzLkJpbmFyeUNNYXBSZWFkZXIpLnByb2Nlc3MocixpLChlPT5DKGksdCxlKSkpO2lmKGE9PT1uLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORSl7Y29uc3QgZT1uZXcgby5MZXhlcihuZXcgbC5TdHJlYW0ocikpO3JldHVybiBrKGksZSx0LG51bGwpfXRocm93IG5ldyBFcnJvcignSW52YWxpZCBDTWFwICJjb21wcmVzc2lvblR5cGUiIHZhbHVlOiAnLmNvbmNhdChhKSl9dC5JZGVudGl0eUNNYXA9Zix0LkNNYXBGYWN0b3J5PWNsYXNze3N0YXRpYyBhc3luYyBjcmVhdGUoZSl7bGV0e2VuY29kaW5nOnQsZmV0Y2hCdWlsdEluQ01hcDpyLHVzZUNNYXA6bn09ZTtpZih0IGluc3RhbmNlb2YgYS5OYW1lKXJldHVybiBPKHQubmFtZSxyKTtpZih0IGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtKXtjb25zdCBlPWF3YWl0IGsobmV3IGQsbmV3IG8uTGV4ZXIodCkscixuKTtyZXR1cm4gZS5pc0lkZW50aXR5Q01hcD9PKGUubmFtZSxyKTplfXRocm93IG5ldyBFcnJvcigiRW5jb2RpbmcgcmVxdWlyZWQuIil9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkJpbmFyeUNNYXBSZWFkZXI9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDIpO3ZhciBuPXIoMTQ0KTtmdW5jdGlvbiBhKGUsdCl7bGV0IHI9MDtmb3IobGV0IG49MDtuPD10O24rKylyPXI8PDh8ZVtuXTtyZXR1cm4gcj4+PjB9ZnVuY3Rpb24gaShlLHQpe3JldHVybiAxPT09dD9TdHJpbmcuZnJvbUNoYXJDb2RlKGVbMF0sZVsxXSk6Mz09PXQ/U3RyaW5nLmZyb21DaGFyQ29kZShlWzBdLGVbMV0sZVsyXSxlWzNdKTpTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmUuc3ViYXJyYXkoMCx0KzEpKX1mdW5jdGlvbiBzKGUsdCxyKXtsZXQgbj0wO2ZvcihsZXQgYT1yO2E+PTA7YS0tKW4rPWVbYV0rdFthXSxlW2FdPTI1NSZuLG4+Pj04fWZ1bmN0aW9uIG8oZSx0KXtsZXQgcj0xO2ZvcihsZXQgbj10O24+PTAmJnI+MDtuLS0pcis9ZVtuXSxlW25dPTI1NSZyLHI+Pj04fWNvbnN0IGM9MTY7Y2xhc3MgbHtjb25zdHJ1Y3RvcihlKXt0aGlzLmJ1ZmZlcj1lLHRoaXMucG9zPTAsdGhpcy5lbmQ9ZS5sZW5ndGgsdGhpcy50bXBCdWY9bmV3IFVpbnQ4QXJyYXkoMTkpfXJlYWRCeXRlKCl7cmV0dXJuIHRoaXMucG9zPj10aGlzLmVuZD8tMTp0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXX1yZWFkTnVtYmVyKCl7bGV0IGUsdD0wO2Rve2NvbnN0IHI9dGhpcy5yZWFkQnl0ZSgpO2lmKHI8MCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTtlPSEoMTI4JnIpLHQ9dDw8N3wxMjcmcn13aGlsZSghZSk7cmV0dXJuIHR9cmVhZFNpZ25lZCgpe2NvbnN0IGU9dGhpcy5yZWFkTnVtYmVyKCk7cmV0dXJuIDEmZT9+KGU+Pj4xKTplPj4+MX1yZWFkSGV4KGUsdCl7ZS5zZXQodGhpcy5idWZmZXIuc3ViYXJyYXkodGhpcy5wb3MsdGhpcy5wb3MrdCsxKSksdGhpcy5wb3MrPXQrMX1yZWFkSGV4TnVtYmVyKGUsdCl7bGV0IHI7Y29uc3QgYT10aGlzLnRtcEJ1ZjtsZXQgaT0wO2Rve2NvbnN0IGU9dGhpcy5yZWFkQnl0ZSgpO2lmKGU8MCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTtyPSEoMTI4JmUpLGFbaSsrXT0xMjcmZX13aGlsZSghcik7bGV0IHM9dCxvPTAsYz0wO2Zvcig7cz49MDspe2Zvcig7Yzw4JiZhLmxlbmd0aD4wOylvfD1hWy0taV08PGMsYys9NztlW3NdPTI1NSZvLHMtLSxvPj49OCxjLT04fX1yZWFkSGV4U2lnbmVkKGUsdCl7dGhpcy5yZWFkSGV4TnVtYmVyKGUsdCk7Y29uc3Qgcj0xJmVbdF0/MjU1OjA7bGV0IG49MDtmb3IobGV0IGE9MDthPD10O2ErKyluPSgxJm4pPDw4fGVbYV0sZVthXT1uPj4xXnJ9cmVhZFN0cmluZygpe2NvbnN0IGU9dGhpcy5yZWFkTnVtYmVyKCksdD1uZXcgQXJyYXkoZSk7Zm9yKGxldCByPTA7cjxlO3IrKyl0W3JdPXRoaXMucmVhZE51bWJlcigpO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLnQpfX10LkJpbmFyeUNNYXBSZWFkZXI9Y2xhc3N7YXN5bmMgcHJvY2VzcyhlLHQscil7Y29uc3Qgbj1uZXcgbChlKSxoPW4ucmVhZEJ5dGUoKTt0LnZlcnRpY2FsPSEhKDEmaCk7bGV0IHU9bnVsbDtjb25zdCBkPW5ldyBVaW50OEFycmF5KGMpLGY9bmV3IFVpbnQ4QXJyYXkoYyksZz1uZXcgVWludDhBcnJheShjKSxwPW5ldyBVaW50OEFycmF5KGMpLG09bmV3IFVpbnQ4QXJyYXkoYyk7bGV0IGIseTtmb3IoOyh5PW4ucmVhZEJ5dGUoKSk+PTA7KXtjb25zdCBlPXk+PjU7aWYoNz09PWUpe3N3aXRjaCgzMSZ5KXtjYXNlIDA6bi5yZWFkU3RyaW5nKCk7YnJlYWs7Y2FzZSAxOnU9bi5yZWFkU3RyaW5nKCl9Y29udGludWV9Y29uc3Qgcj0hISgxNiZ5KSxsPTE1Jnk7aWYobCsxPmMpdGhyb3cgbmV3IEVycm9yKCJCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3M6IEludmFsaWQgZGF0YVNpemUuIik7Y29uc3QgaD0xLHc9bi5yZWFkTnVtYmVyKCk7c3dpdGNoKGUpe2Nhc2UgMDpuLnJlYWRIZXgoZCxsKSxuLnJlYWRIZXhOdW1iZXIoZixsKSxzKGYsZCxsKSx0LmFkZENvZGVzcGFjZVJhbmdlKGwrMSxhKGQsbCksYShmLGwpKTtmb3IobGV0IGU9MTtlPHc7ZSsrKW8oZixsKSxuLnJlYWRIZXhOdW1iZXIoZCxsKSxzKGQsZixsKSxuLnJlYWRIZXhOdW1iZXIoZixsKSxzKGYsZCxsKSx0LmFkZENvZGVzcGFjZVJhbmdlKGwrMSxhKGQsbCksYShmLGwpKTticmVhaztjYXNlIDE6bi5yZWFkSGV4KGQsbCksbi5yZWFkSGV4TnVtYmVyKGYsbCkscyhmLGQsbCksbi5yZWFkTnVtYmVyKCk7Zm9yKGxldCBlPTE7ZTx3O2UrKylvKGYsbCksbi5yZWFkSGV4TnVtYmVyKGQsbCkscyhkLGYsbCksbi5yZWFkSGV4TnVtYmVyKGYsbCkscyhmLGQsbCksbi5yZWFkTnVtYmVyKCk7YnJlYWs7Y2FzZSAyOm4ucmVhZEhleChnLGwpLGI9bi5yZWFkTnVtYmVyKCksdC5tYXBPbmUoYShnLGwpLGIpO2ZvcihsZXQgZT0xO2U8dztlKyspbyhnLGwpLHJ8fChuLnJlYWRIZXhOdW1iZXIobSxsKSxzKGcsbSxsKSksYj1uLnJlYWRTaWduZWQoKSsoYisxKSx0Lm1hcE9uZShhKGcsbCksYik7YnJlYWs7Y2FzZSAzOm4ucmVhZEhleChkLGwpLG4ucmVhZEhleE51bWJlcihmLGwpLHMoZixkLGwpLGI9bi5yZWFkTnVtYmVyKCksdC5tYXBDaWRSYW5nZShhKGQsbCksYShmLGwpLGIpO2ZvcihsZXQgZT0xO2U8dztlKyspbyhmLGwpLHI/ZC5zZXQoZik6KG4ucmVhZEhleE51bWJlcihkLGwpLHMoZCxmLGwpKSxuLnJlYWRIZXhOdW1iZXIoZixsKSxzKGYsZCxsKSxiPW4ucmVhZE51bWJlcigpLHQubWFwQ2lkUmFuZ2UoYShkLGwpLGEoZixsKSxiKTticmVhaztjYXNlIDQ6bi5yZWFkSGV4KGcsaCksbi5yZWFkSGV4KHAsbCksdC5tYXBPbmUoYShnLGgpLGkocCxsKSk7Zm9yKGxldCBlPTE7ZTx3O2UrKylvKGcsaCkscnx8KG4ucmVhZEhleE51bWJlcihtLGgpLHMoZyxtLGgpKSxvKHAsbCksbi5yZWFkSGV4U2lnbmVkKG0sbCkscyhwLG0sbCksdC5tYXBPbmUoYShnLGgpLGkocCxsKSk7YnJlYWs7Y2FzZSA1Om4ucmVhZEhleChkLGgpLG4ucmVhZEhleE51bWJlcihmLGgpLHMoZixkLGgpLG4ucmVhZEhleChwLGwpLHQubWFwQmZSYW5nZShhKGQsaCksYShmLGgpLGkocCxsKSk7Zm9yKGxldCBlPTE7ZTx3O2UrKylvKGYsaCkscj9kLnNldChmKToobi5yZWFkSGV4TnVtYmVyKGQsaCkscyhkLGYsaCkpLG4ucmVhZEhleE51bWJlcihmLGgpLHMoZixkLGgpLG4ucmVhZEhleChwLGwpLHQubWFwQmZSYW5nZShhKGQsaCksYShmLGgpLGkocCxsKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkJpbmFyeUNNYXBSZWFkZXIucHJvY2VzcyAtIHVua25vd24gdHlwZTogIi5jb25jYXQoZSkpfX1yZXR1cm4gdT9yKHUpOnR9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlBhcnNlcj10LkxpbmVhcml6YXRpb249dC5MZXhlcj12b2lkIDAscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDIpO3ZhciBuPXIoMTQ0KSxhPXIoMTUwKSxpPXIoMTQ5KSxzPXIoMTU0KSxvPXIoMTY3KSxjPXIoMTY5KSxsPXIoMTcwKSxoPXIoMTcyKSx1PXIoMTczKSxkPXIoMTc2KSxmPXIoMTc5KSxnPXIoMTgxKSxwPXIoMTgyKSxtPXIoMTgzKTtjbGFzcyBie2NvbnN0cnVjdG9yKGUpe2xldHtsZXhlcjp0LHhyZWY6cixhbGxvd1N0cmVhbXM6bj0hMSxyZWNvdmVyeU1vZGU6YT0hMX09ZTt0aGlzLmxleGVyPXQsdGhpcy54cmVmPXIsdGhpcy5hbGxvd1N0cmVhbXM9bix0aGlzLnJlY292ZXJ5TW9kZT1hLHRoaXMuaW1hZ2VDYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2ltYWdlSWQ9MCx0aGlzLnJlZmlsbCgpfXJlZmlsbCgpe3RoaXMuYnVmMT10aGlzLmxleGVyLmdldE9iaigpLHRoaXMuYnVmMj10aGlzLmxleGVyLmdldE9iaigpfXNoaWZ0KCl7dGhpcy5idWYyIGluc3RhbmNlb2YgYS5DbWQmJiJJRCI9PT10aGlzLmJ1ZjIuY21kPyh0aGlzLmJ1ZjE9dGhpcy5idWYyLHRoaXMuYnVmMj1udWxsKToodGhpcy5idWYxPXRoaXMuYnVmMix0aGlzLmJ1ZjI9dGhpcy5sZXhlci5nZXRPYmooKSl9dHJ5U2hpZnQoKXt0cnl7cmV0dXJuIHRoaXMuc2hpZnQoKSwhMH1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgaS5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlO3JldHVybiExfX1nZXRPYmooKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDtjb25zdCB0PXRoaXMuYnVmMTtpZih0aGlzLnNoaWZ0KCksdCBpbnN0YW5jZW9mIGEuQ21kKXN3aXRjaCh0LmNtZCl7Y2FzZSJCSSI6cmV0dXJuIHRoaXMubWFrZUlubGluZUltYWdlKGUpO2Nhc2UiWyI6Y29uc3Qgcj1bXTtmb3IoOyEoMCxhLmlzQ21kKSh0aGlzLmJ1ZjEsIl0iKSYmdGhpcy5idWYxIT09YS5FT0Y7KXIucHVzaCh0aGlzLmdldE9iaihlKSk7aWYodGhpcy5idWYxPT09YS5FT0Ype2lmKHRoaXMucmVjb3ZlcnlNb2RlKXJldHVybiByO3Rocm93IG5ldyBpLlBhcnNlckVPRkV4Y2VwdGlvbigiRW5kIG9mIGZpbGUgaW5zaWRlIGFycmF5LiIpfXJldHVybiB0aGlzLnNoaWZ0KCkscjtjYXNlIjw8Ijpjb25zdCBzPW5ldyBhLkRpY3QodGhpcy54cmVmKTtmb3IoOyEoMCxhLmlzQ21kKSh0aGlzLmJ1ZjEsIj4+IikmJnRoaXMuYnVmMSE9PWEuRU9GOyl7aWYoISh0aGlzLmJ1ZjEgaW5zdGFuY2VvZiBhLk5hbWUpKXsoMCxuLmluZm8pKCJNYWxmb3JtZWQgZGljdGlvbmFyeToga2V5IG11c3QgYmUgYSBuYW1lIG9iamVjdCIpLHRoaXMuc2hpZnQoKTtjb250aW51ZX1jb25zdCB0PXRoaXMuYnVmMS5uYW1lO2lmKHRoaXMuc2hpZnQoKSx0aGlzLmJ1ZjE9PT1hLkVPRilicmVhaztzLnNldCh0LHRoaXMuZ2V0T2JqKGUpKX1pZih0aGlzLmJ1ZjE9PT1hLkVPRil7aWYodGhpcy5yZWNvdmVyeU1vZGUpcmV0dXJuIHM7dGhyb3cgbmV3IGkuUGFyc2VyRU9GRXhjZXB0aW9uKCJFbmQgb2YgZmlsZSBpbnNpZGUgZGljdGlvbmFyeS4iKX1yZXR1cm4oMCxhLmlzQ21kKSh0aGlzLmJ1ZjIsInN0cmVhbSIpP3RoaXMuYWxsb3dTdHJlYW1zP3RoaXMubWFrZVN0cmVhbShzLGUpOnM6KHRoaXMuc2hpZnQoKSxzKTtkZWZhdWx0OnJldHVybiB0fWlmKE51bWJlci5pc0ludGVnZXIodCkpe2lmKE51bWJlci5pc0ludGVnZXIodGhpcy5idWYxKSYmKDAsYS5pc0NtZCkodGhpcy5idWYyLCJSIikpe2NvbnN0IGU9YS5SZWYuZ2V0KHQsdGhpcy5idWYxKTtyZXR1cm4gdGhpcy5zaGlmdCgpLHRoaXMuc2hpZnQoKSxlfXJldHVybiB0fXJldHVybiJzdHJpbmciPT10eXBlb2YgdCYmZT9lLmRlY3J5cHRTdHJpbmcodCk6dH1maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKXtjb25zdHtrbm93bkNvbW1hbmRzOnR9PXRoaXMubGV4ZXIscj1lLnBvcztsZXQgbyxjLGw9MDtmb3IoOy0xIT09KG89ZS5nZXRCeXRlKCkpOylpZigwPT09bClsPTY5PT09bz8xOjA7ZWxzZSBpZigxPT09bClsPTczPT09bz8yOjA7ZWxzZSBpZigzMj09PW98fDEwPT09b3x8MTM9PT1vKXtjPWUucG9zO2NvbnN0IHI9ZS5wZWVrQnl0ZXMoMTUpLGk9ci5sZW5ndGg7aWYoMD09PWkpYnJlYWs7Zm9yKGxldCBlPTA7ZTxpO2UrKylpZihvPXJbZV0sKDAhPT1vfHwwPT09cltlKzFdKSYmMTAhPT1vJiYxMyE9PW8mJihvPDMyfHxvPjEyNykpe2w9MDticmVha31pZigyIT09bCljb250aW51ZTtpZighdCl7KDAsbi53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQgLSBgbGV4ZXIua25vd25Db21tYW5kc2AgaXMgdW5kZWZpbmVkLiIpO2NvbnRpbnVlfWNvbnN0IGg9bmV3IHYobmV3IHMuU3RyZWFtKHIuc2xpY2UoKSksdCk7aC5faGV4U3RyaW5nV2Fybj0oKT0+e307bGV0IHU9MDtmb3IoOzspe2NvbnN0IGU9aC5nZXRPYmooKTtpZihlPT09YS5FT0Ype2w9MDticmVha31pZihlIGluc3RhbmNlb2YgYS5DbWQpe2NvbnN0IHI9dFtlLmNtZF07aWYoIXIpe2w9MDticmVha31pZihyLnZhcmlhYmxlQXJncz91PD1yLm51bUFyZ3M6dT09PXIubnVtQXJncylicmVhazt1PTB9ZWxzZSB1Kyt9aWYoMj09PWwpYnJlYWt9ZWxzZSBsPTA7LTE9PT1vJiYoKDAsbi53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQ6IFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhvdXQgZmluZGluZyBhIHZhbGlkIEVJIG1hcmtlciIpLGMmJigoMCxuLndhcm4pKCcuLi4gdHJ5aW5nIHRvIHJlY292ZXIgYnkgdXNpbmcgdGhlIGxhc3QgIkVJIiBvY2N1cnJlbmNlLicpLGUuc2tpcCgtKGUucG9zLWMpKSkpO2xldCBoPTQ7cmV0dXJuIGUuc2tpcCgtaCksbz1lLnBlZWtCeXRlKCksZS5za2lwKGgpLCgwLGkuaXNXaGl0ZVNwYWNlKShvKXx8aC0tLGUucG9zLWgtcn1maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKGUpe2NvbnN0IHQ9ZS5wb3M7bGV0IHIsYSxpPSExO2Zvcig7LTEhPT0ocj1lLmdldEJ5dGUoKSk7KWlmKDI1NT09PXIpe3N3aXRjaChlLmdldEJ5dGUoKSl7Y2FzZSAwOmJyZWFrO2Nhc2UgMjU1OmUuc2tpcCgtMSk7YnJlYWs7Y2FzZSAyMTc6aT0hMDticmVhaztjYXNlIDE5MjpjYXNlIDE5MzpjYXNlIDE5NDpjYXNlIDE5NTpjYXNlIDE5NzpjYXNlIDE5ODpjYXNlIDE5OTpjYXNlIDIwMTpjYXNlIDIwMjpjYXNlIDIwMzpjYXNlIDIwNTpjYXNlIDIwNjpjYXNlIDIwNzpjYXNlIDE5NjpjYXNlIDIwNDpjYXNlIDIxODpjYXNlIDIxOTpjYXNlIDIyMDpjYXNlIDIyMTpjYXNlIDIyMjpjYXNlIDIyMzpjYXNlIDIyNDpjYXNlIDIyNTpjYXNlIDIyNjpjYXNlIDIyNzpjYXNlIDIyODpjYXNlIDIyOTpjYXNlIDIzMDpjYXNlIDIzMTpjYXNlIDIzMjpjYXNlIDIzMzpjYXNlIDIzNDpjYXNlIDIzNTpjYXNlIDIzNjpjYXNlIDIzNzpjYXNlIDIzODpjYXNlIDIzOTpjYXNlIDI1NDphPWUuZ2V0VWludDE2KCksYT4yP2Uuc2tpcChhLTIpOmUuc2tpcCgtMil9aWYoaSlicmVha31jb25zdCBzPWUucG9zLXQ7cmV0dXJuLTE9PT1yPygoMCxuLndhcm4pKCJJbmxpbmUgRENURGVjb2RlIGltYWdlIHN0cmVhbTogRU9JIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpLGUuc2tpcCgtcyksdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKSk6KHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKGUpLHMpfWZpbmRBU0NJSTg1RGVjb2RlSW5saW5lU3RyZWFtRW5kKGUpe2NvbnN0IHQ9ZS5wb3M7bGV0IHI7Zm9yKDstMSE9PShyPWUuZ2V0Qnl0ZSgpKTspaWYoMTI2PT09cil7Y29uc3QgdD1lLnBvcztmb3Iocj1lLnBlZWtCeXRlKCk7KDAsaS5pc1doaXRlU3BhY2UpKHIpOyllLnNraXAoKSxyPWUucGVla0J5dGUoKTtpZig2Mj09PXIpe2Uuc2tpcCgpO2JyZWFrfWlmKGUucG9zPnQpe2NvbnN0IHQ9ZS5wZWVrQnl0ZXMoMik7aWYoNjk9PT10WzBdJiY3Mz09PXRbMV0pYnJlYWt9fWNvbnN0IGE9ZS5wb3MtdDtyZXR1cm4tMT09PXI/KCgwLG4ud2FybikoIklubGluZSBBU0NJSTg1RGVjb2RlIGltYWdlIHN0cmVhbTogRU9EIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpLGUuc2tpcCgtYSksdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChlKSk6KHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKGUpLGEpfWZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChlKXtjb25zdCB0PWUucG9zO2xldCByO2Zvcig7LTEhPT0ocj1lLmdldEJ5dGUoKSkmJjYyIT09cjspO2NvbnN0IGE9ZS5wb3MtdDtyZXR1cm4tMT09PXI/KCgwLG4ud2FybikoIklubGluZSBBU0NJSUhleERlY29kZSBpbWFnZSBzdHJlYW06IEVPRCBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKSxlLnNraXAoLWEpLHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoZSkpOih0aGlzLmlubGluZVN0cmVhbVNraXBFSShlKSxhKX1pbmxpbmVTdHJlYW1Ta2lwRUkoZSl7bGV0IHQscj0wO2Zvcig7LTEhPT0odD1lLmdldEJ5dGUoKSk7KWlmKDA9PT1yKXI9Njk9PT10PzE6MDtlbHNlIGlmKDE9PT1yKXI9NzM9PT10PzI6MDtlbHNlIGlmKDI9PT1yKWJyZWFrfW1ha2VJbmxpbmVJbWFnZShlKXtjb25zdCB0PXRoaXMubGV4ZXIscj10LnN0cmVhbSxpPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHM7Zm9yKDshKDAsYS5pc0NtZCkodGhpcy5idWYxLCJJRCIpJiZ0aGlzLmJ1ZjEhPT1hLkVPRjspe2lmKCEodGhpcy5idWYxIGluc3RhbmNlb2YgYS5OYW1lKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRGljdGlvbmFyeSBrZXkgbXVzdCBiZSBhIG5hbWUgb2JqZWN0Iik7Y29uc3QgdD10aGlzLmJ1ZjEubmFtZTtpZih0aGlzLnNoaWZ0KCksdGhpcy5idWYxPT09YS5FT0YpYnJlYWs7aVt0XT10aGlzLmdldE9iaihlKX0tMSE9PXQuYmVnaW5JbmxpbmVJbWFnZVBvcyYmKHM9ci5wb3MtdC5iZWdpbklubGluZUltYWdlUG9zKTtjb25zdCBvPXRoaXMueHJlZi5mZXRjaElmUmVmKGkuRnx8aS5GaWx0ZXIpO2xldCBjO2lmKG8gaW5zdGFuY2VvZiBhLk5hbWUpYz1vLm5hbWU7ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pKXtjb25zdCBlPXRoaXMueHJlZi5mZXRjaElmUmVmKG9bMF0pO2UgaW5zdGFuY2VvZiBhLk5hbWUmJihjPWUubmFtZSl9Y29uc3QgbD1yLnBvcztsZXQgaCx1O3N3aXRjaChjKXtjYXNlIkRDVCI6Y2FzZSJEQ1REZWNvZGUiOmg9dGhpcy5maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKHIpO2JyZWFrO2Nhc2UiQTg1IjpjYXNlIkFTQ0lJODVEZWNvZGUiOmg9dGhpcy5maW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChyKTticmVhaztjYXNlIkFIeCI6Y2FzZSJBU0NJSUhleERlY29kZSI6aD10aGlzLmZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChyKTticmVhaztkZWZhdWx0Omg9dGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChyKX1pZihoPDFlMyYmcz4wKXtjb25zdCBlPXIucG9zO3IucG9zPXQuYmVnaW5JbmxpbmVJbWFnZVBvcyx1PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9W10scj1lLmxlbmd0aDtsZXQgbj0wO2Zvcig7bjxyLTE7KXQucHVzaChlW24rK108PDh8ZVtuKytdKTtyZXR1cm4gbjxyJiZ0LnB1c2goZVtuXSkscisiXyIrU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHQpfShyLmdldEJ5dGVzKHMraCkpLHIucG9zPWU7Y29uc3Qgbj10aGlzLmltYWdlQ2FjaGVbdV07aWYodm9pZCAwIT09bilyZXR1cm4gdGhpcy5idWYyPWEuQ21kLmdldCgiRUkiKSx0aGlzLnNoaWZ0KCksbi5yZXNldCgpLG59Y29uc3QgZD1uZXcgYS5EaWN0KHRoaXMueHJlZik7Zm9yKGNvbnN0IGUgaW4gaSlkLnNldChlLGlbZV0pO2xldCBmPXIubWFrZVN1YlN0cmVhbShsLGgsZCk7cmV0dXJuIGUmJihmPWUuY3JlYXRlU3RyZWFtKGYsaCkpLGY9dGhpcy5maWx0ZXIoZixkLGgpLGYuZGljdD1kLHZvaWQgMCE9PXUmJihmLmNhY2hlS2V5PSJpbmxpbmVfaW1nXyIrICsrdGhpcy5faW1hZ2VJZCx0aGlzLmltYWdlQ2FjaGVbdV09ZiksdGhpcy5idWYyPWEuQ21kLmdldCgiRUkiKSx0aGlzLnNoaWZ0KCksZn1fZmluZFN0cmVhbUxlbmd0aChlLHQpe2NvbnN0e3N0cmVhbTpyfT10aGlzLmxleGVyO3IucG9zPWU7Y29uc3Qgbj10Lmxlbmd0aDtmb3IoO3IucG9zPHIuZW5kOyl7Y29uc3QgYT1yLnBlZWtCeXRlcygyMDQ4KSxpPWEubGVuZ3RoLW47aWYoaTw9MClicmVhaztsZXQgcz0wO2Zvcig7czxpOyl7bGV0IGk9MDtmb3IoO2k8biYmYVtzK2ldPT09dFtpXTspaSsrO2lmKGk+PW4pcmV0dXJuIHIucG9zKz1zLHIucG9zLWU7cysrfXIucG9zKz1pfXJldHVybi0xfW1ha2VTdHJlYW0oZSx0KXtjb25zdCByPXRoaXMubGV4ZXI7bGV0IHM9ci5zdHJlYW07ci5za2lwVG9OZXh0TGluZSgpO2NvbnN0IG89cy5wb3MtMTtsZXQgYz1lLmdldCgiTGVuZ3RoIik7aWYoTnVtYmVyLmlzSW50ZWdlcihjKXx8KCgwLG4uaW5mbykoJ0JhZCBsZW5ndGggIicuY29uY2F0KGMmJmMudG9TdHJpbmcoKSwnIiBpbiBzdHJlYW0uJykpLGM9MCkscy5wb3M9bytjLHIubmV4dENoYXIoKSx0aGlzLnRyeVNoaWZ0KCkmJigwLGEuaXNDbWQpKHRoaXMuYnVmMiwiZW5kc3RyZWFtIikpdGhpcy5zaGlmdCgpO2Vsc2V7Y29uc3QgZT1uZXcgVWludDhBcnJheShbMTAxLDExMCwxMDAsMTE1LDExNiwxMTQsMTAxLDk3LDEwOV0pO2xldCB0PXRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgobyxlKTtpZih0PDApe2NvbnN0IHI9MTtmb3IobGV0IGE9MTthPD1yO2ErKyl7Y29uc3Qgcj1lLmxlbmd0aC1hLGM9ZS5zbGljZSgwLHIpLGw9dGhpcy5fZmluZFN0cmVhbUxlbmd0aChvLGMpO2lmKGw+PTApe2NvbnN0IGU9cy5wZWVrQnl0ZXMocisxKVtyXTtpZighKDAsaS5pc1doaXRlU3BhY2UpKGUpKWJyZWFrOygwLG4uaW5mbykoJ0ZvdW5kICInLmNvbmNhdCgoMCxuLmJ5dGVzVG9TdHJpbmcpKGMpLCciIHdoZW4gc2VhcmNoaW5nIGZvciBlbmRzdHJlYW0gY29tbWFuZC4nKSksdD1sO2JyZWFrfX1pZih0PDApdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk1pc3NpbmcgZW5kc3RyZWFtIGNvbW1hbmQuIil9Yz10LHIubmV4dENoYXIoKSx0aGlzLnNoaWZ0KCksdGhpcy5zaGlmdCgpfXJldHVybiB0aGlzLnNoaWZ0KCkscz1zLm1ha2VTdWJTdHJlYW0obyxjLGUpLHQmJihzPXQuY3JlYXRlU3RyZWFtKHMsYykpLHM9dGhpcy5maWx0ZXIocyxlLGMpLHMuZGljdD1lLHN9ZmlsdGVyKGUsdCxyKXtsZXQgaT10LmdldCgiRiIsIkZpbHRlciIpLHM9dC5nZXQoIkRQIiwiRGVjb2RlUGFybXMiKTtpZihpIGluc3RhbmNlb2YgYS5OYW1lKXJldHVybiBBcnJheS5pc0FycmF5KHMpJiYoMCxuLndhcm4pKCIvRGVjb2RlUGFybXMgc2hvdWxkIG5vdCBiZSBhbiBBcnJheSwgd2hlbiAvRmlsdGVyIGlzIGEgTmFtZS4iKSx0aGlzLm1ha2VGaWx0ZXIoZSxpLm5hbWUscixzKTtsZXQgbz1yO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IHQ9aSxyPXM7Zm9yKGxldCBjPTAsbD10Lmxlbmd0aDtjPGw7KytjKXtpZihpPXRoaXMueHJlZi5mZXRjaElmUmVmKHRbY10pLCEoaSBpbnN0YW5jZW9mIGEuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoJ0JhZCBmaWx0ZXIgbmFtZSAiJy5jb25jYXQoaSwnIicpKTtzPW51bGwsQXJyYXkuaXNBcnJheShyKSYmYyBpbiByJiYocz10aGlzLnhyZWYuZmV0Y2hJZlJlZihyW2NdKSksZT10aGlzLm1ha2VGaWx0ZXIoZSxpLm5hbWUsbyxzKSxvPW51bGx9fXJldHVybiBlfW1ha2VGaWx0ZXIoZSx0LHIsYSl7aWYoMD09PXIpcmV0dXJuKDAsbi53YXJuKSgnRW1wdHkgIicuY29uY2F0KHQsJyIgc3RyZWFtLicpKSxuZXcgcy5OdWxsU3RyZWFtO3RyeXtzd2l0Y2godCl7Y2FzZSJGbCI6Y2FzZSJGbGF0ZURlY29kZSI6cmV0dXJuIGE/bmV3IHAuUHJlZGljdG9yU3RyZWFtKG5ldyBoLkZsYXRlU3RyZWFtKGUscikscixhKTpuZXcgaC5GbGF0ZVN0cmVhbShlLHIpO2Nhc2UiTFpXIjpjYXNlIkxaV0RlY29kZSI6bGV0IHQ9MTtyZXR1cm4gYT8oYS5oYXMoIkVhcmx5Q2hhbmdlIikmJih0PWEuZ2V0KCJFYXJseUNoYW5nZSIpKSxuZXcgcC5QcmVkaWN0b3JTdHJlYW0obmV3IGcuTFpXU3RyZWFtKGUscix0KSxyLGEpKTpuZXcgZy5MWldTdHJlYW0oZSxyLHQpO2Nhc2UiRENUIjpjYXNlIkRDVERlY29kZSI6cmV0dXJuIG5ldyBkLkpwZWdTdHJlYW0oZSxyLGEpO2Nhc2UiSlBYIjpjYXNlIkpQWERlY29kZSI6cmV0dXJuIG5ldyBmLkpweFN0cmVhbShlLHIsYSk7Y2FzZSJBODUiOmNhc2UiQVNDSUk4NURlY29kZSI6cmV0dXJuIG5ldyBvLkFzY2lpODVTdHJlYW0oZSxyKTtjYXNlIkFIeCI6Y2FzZSJBU0NJSUhleERlY29kZSI6cmV0dXJuIG5ldyBjLkFzY2lpSGV4U3RyZWFtKGUscik7Y2FzZSJDQ0YiOmNhc2UiQ0NJVFRGYXhEZWNvZGUiOnJldHVybiBuZXcgbC5DQ0lUVEZheFN0cmVhbShlLHIsYSk7Y2FzZSJSTCI6Y2FzZSJSdW5MZW5ndGhEZWNvZGUiOnJldHVybiBuZXcgbS5SdW5MZW5ndGhTdHJlYW0oZSxyKTtjYXNlIkpCSUcyRGVjb2RlIjpyZXR1cm4gbmV3IHUuSmJpZzJTdHJlYW0oZSxyLGEpfXJldHVybigwLG4ud2FybikoJ0ZpbHRlciAiJy5jb25jYXQodCwnIiBpcyBub3Qgc3VwcG9ydGVkLicpKSxlfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBpLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7cmV0dXJuKDAsbi53YXJuKSgnSW52YWxpZCBzdHJlYW06ICInLmNvbmNhdChlLCciJykpLG5ldyBzLk51bGxTdHJlYW19fX10LlBhcnNlcj1iO2NvbnN0IHk9WzEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMiwwLDAsMiwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdO2Z1bmN0aW9uIHcoZSl7cmV0dXJuIGU+PTQ4JiZlPD01Nz8xNSZlOmU+PTY1JiZlPD03MHx8ZT49OTcmJmU8PTEwMj85KygxNSZlKTotMX1jbGFzcyB2e2NvbnN0cnVjdG9yKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO3RoaXMuc3RyZWFtPWUsdGhpcy5uZXh0Q2hhcigpLHRoaXMuc3RyQnVmPVtdLHRoaXMua25vd25Db21tYW5kcz10LHRoaXMuX2hleFN0cmluZ051bVdhcm49MCx0aGlzLmJlZ2luSW5saW5lSW1hZ2VQb3M9LTF9bmV4dENoYXIoKXtyZXR1cm4gdGhpcy5jdXJyZW50Q2hhcj10aGlzLnN0cmVhbS5nZXRCeXRlKCl9cGVla0NoYXIoKXtyZXR1cm4gdGhpcy5zdHJlYW0ucGVla0J5dGUoKX1nZXROdW1iZXIoKXtsZXQgZT10aGlzLmN1cnJlbnRDaGFyLHQ9ITEscj0wLGE9MTtpZig0NT09PWU/KGE9LTEsZT10aGlzLm5leHRDaGFyKCksNDU9PT1lJiYoZT10aGlzLm5leHRDaGFyKCkpKTo0Mz09PWUmJihlPXRoaXMubmV4dENoYXIoKSksMTA9PT1lfHwxMz09PWUpZG97ZT10aGlzLm5leHRDaGFyKCl9d2hpbGUoMTA9PT1lfHwxMz09PWUpO2lmKDQ2PT09ZSYmKHI9MTAsZT10aGlzLm5leHRDaGFyKCkpLGU8NDh8fGU+NTcpe2NvbnN0IHQ9IkludmFsaWQgbnVtYmVyOiAiLmNvbmNhdChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpLCIgKGNoYXJDb2RlICIpLmNvbmNhdChlLCIpIik7aWYoKDAsaS5pc1doaXRlU3BhY2UpKGUpfHwtMT09PWUpcmV0dXJuKDAsbi5pbmZvKSgnTGV4ZXIuZ2V0TnVtYmVyIC0gIicuY29uY2F0KHQsJyIuJykpLDA7dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IodCl9bGV0IHM9ZS00OCxvPTAsYz0xO2Zvcig7KGU9dGhpcy5uZXh0Q2hhcigpKT49MDspaWYoZT49NDgmJmU8PTU3KXtjb25zdCBuPWUtNDg7dD9vPTEwKm8rbjooMCE9PXImJihyKj0xMCkscz0xMCpzK24pfWVsc2UgaWYoNDY9PT1lKXtpZigwIT09cilicmVhaztyPTF9ZWxzZSBpZig0NT09PWUpKDAsbi53YXJuKSgiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlIik7ZWxzZXtpZig2OSE9PWUmJjEwMSE9PWUpYnJlYWs7aWYoZT10aGlzLnBlZWtDaGFyKCksNDM9PT1lfHw0NT09PWUpYz00NT09PWU/LTE6MSx0aGlzLm5leHRDaGFyKCk7ZWxzZSBpZihlPDQ4fHxlPjU3KWJyZWFrO3Q9ITB9cmV0dXJuIDAhPT1yJiYocy89ciksdCYmKHMqPTEwKiooYypvKSksYSpzfWdldFN0cmluZygpe2xldCBlPTEsdD0hMTtjb25zdCByPXRoaXMuc3RyQnVmO3IubGVuZ3RoPTA7bGV0IGE9dGhpcy5uZXh0Q2hhcigpO2Zvcig7Oyl7bGV0IGk9ITE7c3dpdGNoKDB8YSl7Y2FzZS0xOigwLG4ud2FybikoIlVudGVybWluYXRlZCBzdHJpbmciKSx0PSEwO2JyZWFrO2Nhc2UgNDA6KytlLHIucHVzaCgiKCIpO2JyZWFrO2Nhc2UgNDE6MD09LS1lPyh0aGlzLm5leHRDaGFyKCksdD0hMCk6ci5wdXNoKCIpIik7YnJlYWs7Y2FzZSA5Mjpzd2l0Y2goYT10aGlzLm5leHRDaGFyKCksYSl7Y2FzZS0xOigwLG4ud2FybikoIlVudGVybWluYXRlZCBzdHJpbmciKSx0PSEwO2JyZWFrO2Nhc2UgMTEwOnIucHVzaCgiXG4iKTticmVhaztjYXNlIDExNDpyLnB1c2goIlxyIik7YnJlYWs7Y2FzZSAxMTY6ci5wdXNoKCJcdCIpO2JyZWFrO2Nhc2UgOTg6ci5wdXNoKCJcYiIpO2JyZWFrO2Nhc2UgMTAyOnIucHVzaCgiXGYiKTticmVhaztjYXNlIDkyOmNhc2UgNDA6Y2FzZSA0MTpyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhKSk7YnJlYWs7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmxldCBlPTE1JmE7YT10aGlzLm5leHRDaGFyKCksaT0hMCxhPj00OCYmYTw9NTUmJihlPShlPDwzKSsoMTUmYSksYT10aGlzLm5leHRDaGFyKCksYT49NDgmJmE8PTU1JiYoaT0hMSxlPShlPDwzKSsoMTUmYSkpKSxyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7YnJlYWs7Y2FzZSAxMzoxMD09PXRoaXMucGVla0NoYXIoKSYmdGhpcy5uZXh0Q2hhcigpO2JyZWFrO2Nhc2UgMTA6YnJlYWs7ZGVmYXVsdDpyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhKSl9YnJlYWs7ZGVmYXVsdDpyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShhKSl9aWYodClicmVhaztpfHwoYT10aGlzLm5leHRDaGFyKCkpfXJldHVybiByLmpvaW4oIiIpfWdldE5hbWUoKXtsZXQgZSx0O2NvbnN0IHI9dGhpcy5zdHJCdWY7Zm9yKHIubGVuZ3RoPTA7KGU9dGhpcy5uZXh0Q2hhcigpKT49MCYmIXlbZV07KWlmKDM1PT09ZSl7aWYoZT10aGlzLm5leHRDaGFyKCkseVtlXSl7KDAsbi53YXJuKSgiTGV4ZXJfZ2V0TmFtZTogTlVNQkVSIFNJR04gKCMpIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsIG51bWJlci4iKSxyLnB1c2goIiMiKTticmVha31jb25zdCBhPXcoZSk7aWYoLTEhPT1hKXt0PWUsZT10aGlzLm5leHRDaGFyKCk7Y29uc3QgaT13KGUpO2lmKC0xPT09aSl7aWYoKDAsbi53YXJuKSgiTGV4ZXJfZ2V0TmFtZTogSWxsZWdhbCBkaWdpdCAoIi5jb25jYXQoU3RyaW5nLmZyb21DaGFyQ29kZShlKSwiKSBpbiBoZXhhZGVjaW1hbCBudW1iZXIuIikpLHIucHVzaCgiIyIsU3RyaW5nLmZyb21DaGFyQ29kZSh0KSkseVtlXSlicmVhaztyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7Y29udGludWV9ci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoYTw8NHxpKSl9ZWxzZSByLnB1c2goIiMiLFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpfWVsc2Ugci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpO3JldHVybiByLmxlbmd0aD4xMjcmJigwLG4ud2FybikoIk5hbWUgdG9rZW4gaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZCBieSB0aGUgc3BlYzogIi5jb25jYXQoci5sZW5ndGgpKSxhLk5hbWUuZ2V0KHIuam9pbigiIikpfV9oZXhTdHJpbmdXYXJuKGUpezUhPXRoaXMuX2hleFN0cmluZ051bVdhcm4rKz90aGlzLl9oZXhTdHJpbmdOdW1XYXJuPjV8fCgwLG4ud2FybikoImdldEhleFN0cmluZyAtIGlnbm9yaW5nIGludmFsaWQgY2hhcmFjdGVyOiAiLmNvbmNhdChlKSk6KDAsbi53YXJuKSgiZ2V0SGV4U3RyaW5nIC0gaWdub3JpbmcgYWRkaXRpb25hbCBpbnZhbGlkIGNoYXJhY3RlcnMuIil9Z2V0SGV4U3RyaW5nKCl7Y29uc3QgZT10aGlzLnN0ckJ1ZjtlLmxlbmd0aD0wO2xldCB0LHIsYT10aGlzLmN1cnJlbnRDaGFyLGk9ITA7Zm9yKHRoaXMuX2hleFN0cmluZ051bVdhcm49MDs7KXtpZihhPDApeygwLG4ud2FybikoIlVudGVybWluYXRlZCBoZXggc3RyaW5nIik7YnJlYWt9aWYoNjI9PT1hKXt0aGlzLm5leHRDaGFyKCk7YnJlYWt9aWYoMSE9PXlbYV0pe2lmKGkpe2lmKHQ9dyhhKSwtMT09PXQpe3RoaXMuX2hleFN0cmluZ1dhcm4oYSksYT10aGlzLm5leHRDaGFyKCk7Y29udGludWV9fWVsc2V7aWYocj13KGEpLC0xPT09cil7dGhpcy5faGV4U3RyaW5nV2FybihhKSxhPXRoaXMubmV4dENoYXIoKTtjb250aW51ZX1lLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh0PDw0fHIpKX1pPSFpLGE9dGhpcy5uZXh0Q2hhcigpfWVsc2UgYT10aGlzLm5leHRDaGFyKCl9cmV0dXJuIGUuam9pbigiIil9Z2V0T2JqKCl7bGV0IGU9ITEsdD10aGlzLmN1cnJlbnRDaGFyO2Zvcig7Oyl7aWYodDwwKXJldHVybiBhLkVPRjtpZihlKTEwIT09dCYmMTMhPT10fHwoZT0hMSk7ZWxzZSBpZigzNz09PXQpZT0hMDtlbHNlIGlmKDEhPT15W3RdKWJyZWFrO3Q9dGhpcy5uZXh0Q2hhcigpfXN3aXRjaCgwfHQpe2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6Y2FzZSA0MzpjYXNlIDQ1OmNhc2UgNDY6cmV0dXJuIHRoaXMuZ2V0TnVtYmVyKCk7Y2FzZSA0MDpyZXR1cm4gdGhpcy5nZXRTdHJpbmcoKTtjYXNlIDQ3OnJldHVybiB0aGlzLmdldE5hbWUoKTtjYXNlIDkxOnJldHVybiB0aGlzLm5leHRDaGFyKCksYS5DbWQuZ2V0KCJbIik7Y2FzZSA5MzpyZXR1cm4gdGhpcy5uZXh0Q2hhcigpLGEuQ21kLmdldCgiXSIpO2Nhc2UgNjA6cmV0dXJuIHQ9dGhpcy5uZXh0Q2hhcigpLDYwPT09dD8odGhpcy5uZXh0Q2hhcigpLGEuQ21kLmdldCgiPDwiKSk6dGhpcy5nZXRIZXhTdHJpbmcoKTtjYXNlIDYyOnJldHVybiB0PXRoaXMubmV4dENoYXIoKSw2Mj09PXQ/KHRoaXMubmV4dENoYXIoKSxhLkNtZC5nZXQoIj4+IikpOmEuQ21kLmdldCgiPiIpO2Nhc2UgMTIzOnJldHVybiB0aGlzLm5leHRDaGFyKCksYS5DbWQuZ2V0KCJ7Iik7Y2FzZSAxMjU6cmV0dXJuIHRoaXMubmV4dENoYXIoKSxhLkNtZC5nZXQoIn0iKTtjYXNlIDQxOnRocm93IHRoaXMubmV4dENoYXIoKSxuZXcgbi5Gb3JtYXRFcnJvcigiSWxsZWdhbCBjaGFyYWN0ZXI6ICIuY29uY2F0KHQpKX1sZXQgcj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpO2lmKHQ8MzJ8fHQ+MTI3KXtjb25zdCBlPXRoaXMucGVla0NoYXIoKTtpZihlPj0zMiYmZTw9MTI3KXJldHVybiB0aGlzLm5leHRDaGFyKCksYS5DbWQuZ2V0KHIpfWNvbnN0IGk9dGhpcy5rbm93bkNvbW1hbmRzO2xldCBzPXZvaWQgMCE9PShudWxsPT1pP3ZvaWQgMDppW3JdKTtmb3IoOyh0PXRoaXMubmV4dENoYXIoKSk+PTAmJiF5W3RdOyl7Y29uc3QgZT1yK1N0cmluZy5mcm9tQ2hhckNvZGUodCk7aWYocyYmdm9pZCAwPT09aVtlXSlicmVhaztpZigxMjg9PT1yLmxlbmd0aCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogIi5jb25jYXQoci5sZW5ndGgpKTtyPWUscz12b2lkIDAhPT0obnVsbD09aT92b2lkIDA6aVtyXSl9cmV0dXJuInRydWUiPT09cnx8ImZhbHNlIiE9PXImJigibnVsbCI9PT1yP251bGw6KCJCSSI9PT1yJiYodGhpcy5iZWdpbklubGluZUltYWdlUG9zPXRoaXMuc3RyZWFtLnBvcyksYS5DbWQuZ2V0KHIpKSl9c2tpcFRvTmV4dExpbmUoKXtsZXQgZT10aGlzLmN1cnJlbnRDaGFyO2Zvcig7ZT49MDspe2lmKDEzPT09ZSl7ZT10aGlzLm5leHRDaGFyKCksMTA9PT1lJiZ0aGlzLm5leHRDaGFyKCk7YnJlYWt9aWYoMTA9PT1lKXt0aGlzLm5leHRDaGFyKCk7YnJlYWt9ZT10aGlzLm5leHRDaGFyKCl9fX10LkxleGVyPXYsdC5MaW5lYXJpemF0aW9uPWNsYXNze3N0YXRpYyBjcmVhdGUoZSl7ZnVuY3Rpb24gdChlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07Y29uc3Qgbj1lLmdldCh0KTtpZihOdW1iZXIuaXNJbnRlZ2VyKG4pJiYocj9uPj0wOm4+MCkpcmV0dXJuIG47dGhyb3cgbmV3IEVycm9yKCdUaGUgIicuY29uY2F0KHQsJyIgcGFyYW1ldGVyIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4nKSl9Y29uc3Qgcj1uZXcgYih7bGV4ZXI6bmV3IHYoZSkseHJlZjpudWxsfSksbj1yLmdldE9iaigpLGk9ci5nZXRPYmooKSxzPXIuZ2V0T2JqKCksbz1yLmdldE9iaigpO2xldCBjLGw7aWYoIShOdW1iZXIuaXNJbnRlZ2VyKG4pJiZOdW1iZXIuaXNJbnRlZ2VyKGkpJiYoMCxhLmlzQ21kKShzLCJvYmoiKSYmbyBpbnN0YW5jZW9mIGEuRGljdCYmIm51bWJlciI9PXR5cGVvZihjPW8uZ2V0KCJMaW5lYXJpemVkIikpJiZjPjApKXJldHVybiBudWxsO2lmKChsPXQobywiTCIpKSE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcignVGhlICJMIiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2VzIG5vdCBlcXVhbCB0aGUgc3RyZWFtIGxlbmd0aC4nKTtyZXR1cm57bGVuZ3RoOmwsaGludHM6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmdldCgiSCIpO2xldCByO2lmKEFycmF5LmlzQXJyYXkodCkmJigyPT09KHI9dC5sZW5ndGgpfHw0PT09cikpe2ZvcihsZXQgZT0wO2U8cjtlKyspe2NvbnN0IHI9dFtlXTtpZighKE51bWJlci5pc0ludGVnZXIocikmJnI+MCkpdGhyb3cgbmV3IEVycm9yKCJIaW50ICgiLmNvbmNhdChlLCIpIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKSl9cmV0dXJuIHR9dGhyb3cgbmV3IEVycm9yKCJIaW50IGFycmF5IGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKX0obyksb2JqZWN0TnVtYmVyRmlyc3Q6dChvLCJPIiksZW5kRmlyc3Q6dChvLCJFIiksbnVtUGFnZXM6dChvLCJOIiksbWFpblhSZWZFbnRyaWVzT2Zmc2V0OnQobywiVCIpLHBhZ2VGaXJzdDpvLmhhcygiUCIpP3QobywiUCIsITApOjB9fX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Bc2NpaTg1U3RyZWFtPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNjgpLGE9cigxNDkpO2NsYXNzIGkgZXh0ZW5kcyBuLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQpe3QmJih0Kj0uOCksc3VwZXIodCksdGhpcy5zdHI9ZSx0aGlzLmRpY3Q9ZS5kaWN0LHRoaXMuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoNSl9cmVhZEJsb2NrKCl7Y29uc3QgZT10aGlzLnN0cjtsZXQgdD1lLmdldEJ5dGUoKTtmb3IoOygwLGEuaXNXaGl0ZVNwYWNlKSh0KTspdD1lLmdldEJ5dGUoKTtpZigtMT09PXR8fDEyNj09PXQpcmV0dXJuIHZvaWQodGhpcy5lb2Y9ITApO2NvbnN0IHI9dGhpcy5idWZmZXJMZW5ndGg7bGV0IG4saTtpZigxMjI9PT10KXtmb3Iobj10aGlzLmVuc3VyZUJ1ZmZlcihyKzQpLGk9MDtpPDQ7KytpKW5bcitpXT0wO3RoaXMuYnVmZmVyTGVuZ3RoKz00fWVsc2V7Y29uc3Qgcz10aGlzLmlucHV0O2ZvcihzWzBdPXQsaT0xO2k8NTsrK2kpe2Zvcih0PWUuZ2V0Qnl0ZSgpOygwLGEuaXNXaGl0ZVNwYWNlKSh0KTspdD1lLmdldEJ5dGUoKTtpZihzW2ldPXQsLTE9PT10fHwxMjY9PT10KWJyZWFrfWlmKG49dGhpcy5lbnN1cmVCdWZmZXIocitpLTEpLHRoaXMuYnVmZmVyTGVuZ3RoKz1pLTEsaTw1KXtmb3IoO2k8NTsrK2kpc1tpXT0xMTc7dGhpcy5lb2Y9ITB9bGV0IG89MDtmb3IoaT0wO2k8NTsrK2kpbz04NSpvKyhzW2ldLTMzKTtmb3IoaT0zO2k+PTA7LS1pKW5bcitpXT0yNTUmbyxvPj49OH19fXQuQXNjaWk4NVN0cmVhbT1pfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU3RyZWFtc1NlcXVlbmNlU3RyZWFtPXQuRGVjb2RlU3RyZWFtPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigxMzkpO3ZhciBuPXIoMTUxKSxhPXIoMTU0KTtjb25zdCBpPW5ldyBVaW50OEFycmF5KDApO2NsYXNzIHMgZXh0ZW5kcyBuLkJhc2VTdHJlYW17Y29uc3RydWN0b3IoZSl7aWYoc3VwZXIoKSx0aGlzLl9yYXdNaW5CdWZmZXJMZW5ndGg9ZXx8MCx0aGlzLnBvcz0wLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5lb2Y9ITEsdGhpcy5idWZmZXI9aSx0aGlzLm1pbkJ1ZmZlckxlbmd0aD01MTIsZSlmb3IoO3RoaXMubWluQnVmZmVyTGVuZ3RoPGU7KXRoaXMubWluQnVmZmVyTGVuZ3RoKj0yfWdldCBpc0VtcHR5KCl7Zm9yKDshdGhpcy5lb2YmJjA9PT10aGlzLmJ1ZmZlckxlbmd0aDspdGhpcy5yZWFkQmxvY2soKTtyZXR1cm4gMD09PXRoaXMuYnVmZmVyTGVuZ3RofWVuc3VyZUJ1ZmZlcihlKXtjb25zdCB0PXRoaXMuYnVmZmVyO2lmKGU8PXQuYnl0ZUxlbmd0aClyZXR1cm4gdDtsZXQgcj10aGlzLm1pbkJ1ZmZlckxlbmd0aDtmb3IoO3I8ZTspcio9Mjtjb25zdCBuPW5ldyBVaW50OEFycmF5KHIpO3JldHVybiBuLnNldCh0KSx0aGlzLmJ1ZmZlcj1ufWdldEJ5dGUoKXtjb25zdCBlPXRoaXMucG9zO2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8PWU7KXtpZih0aGlzLmVvZilyZXR1cm4tMTt0aGlzLnJlYWRCbG9jaygpfXJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXX1nZXRCeXRlcyhlKXtjb25zdCB0PXRoaXMucG9zO2xldCByO2lmKGUpe2Zvcih0aGlzLmVuc3VyZUJ1ZmZlcih0K2UpLHI9dCtlOyF0aGlzLmVvZiYmdGhpcy5idWZmZXJMZW5ndGg8cjspdGhpcy5yZWFkQmxvY2soKTtjb25zdCBuPXRoaXMuYnVmZmVyTGVuZ3RoO3I+biYmKHI9bil9ZWxzZXtmb3IoOyF0aGlzLmVvZjspdGhpcy5yZWFkQmxvY2soKTtyPXRoaXMuYnVmZmVyTGVuZ3RofXJldHVybiB0aGlzLnBvcz1yLHRoaXMuYnVmZmVyLnN1YmFycmF5KHQscil9cmVzZXQoKXt0aGlzLnBvcz0wfW1ha2VTdWJTdHJlYW0oZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZih2b2lkIDA9PT10KWZvcig7IXRoaXMuZW9mOyl0aGlzLnJlYWRCbG9jaygpO2Vsc2V7Y29uc3Qgcj1lK3Q7Zm9yKDt0aGlzLmJ1ZmZlckxlbmd0aDw9ciYmIXRoaXMuZW9mOyl0aGlzLnJlYWRCbG9jaygpfXJldHVybiBuZXcgYS5TdHJlYW0odGhpcy5idWZmZXIsZSx0LHIpfWdldEJhc2VTdHJlYW1zKCl7cmV0dXJuIHRoaXMuc3RyP3RoaXMuc3RyLmdldEJhc2VTdHJlYW1zKCk6bnVsbH19dC5EZWNvZGVTdHJlYW09cyx0LlN0cmVhbXNTZXF1ZW5jZVN0cmVhbT1jbGFzcyBleHRlbmRzIHN7Y29uc3RydWN0b3IoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm51bGwscj0wO2Zvcihjb25zdCB0IG9mIGUpcis9dCBpbnN0YW5jZW9mIHM/dC5fcmF3TWluQnVmZmVyTGVuZ3RoOnQubGVuZ3RoO3N1cGVyKHIpLHRoaXMuc3RyZWFtcz1lLHRoaXMuX29uRXJyb3I9dH1yZWFkQmxvY2soKXtjb25zdCBlPXRoaXMuc3RyZWFtcztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHZvaWQodGhpcy5lb2Y9ITApO2NvbnN0IHQ9ZS5zaGlmdCgpO2xldCByO3RyeXtyPXQuZ2V0Qnl0ZXMoKX1jYXRjaChlKXt2YXIgbjtpZih0aGlzLl9vbkVycm9yKXJldHVybiB2b2lkIHRoaXMuX29uRXJyb3IoZSxudWxsPT09KG49dC5kaWN0KXx8dm9pZCAwPT09bj92b2lkIDA6bi5vYmpJZCk7dGhyb3cgZX1jb25zdCBhPXRoaXMuYnVmZmVyTGVuZ3RoLGk9YStyLmxlbmd0aDt0aGlzLmVuc3VyZUJ1ZmZlcihpKS5zZXQocixhKSx0aGlzLmJ1ZmZlckxlbmd0aD1pfWdldEJhc2VTdHJlYW1zKCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgdCBvZiB0aGlzLnN0cmVhbXMpe2NvbnN0IHI9dC5nZXRCYXNlU3RyZWFtcygpO3ImJmUucHVzaCguLi5yKX1yZXR1cm4gZS5sZW5ndGg+MD9lOm51bGx9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkFzY2lpSGV4U3RyZWFtPXZvaWQgMDt2YXIgbj1yKDE2OCk7Y2xhc3MgYSBleHRlbmRzIG4uRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCl7dCYmKHQqPS41KSxzdXBlcih0KSx0aGlzLnN0cj1lLHRoaXMuZGljdD1lLmRpY3QsdGhpcy5maXJzdERpZ2l0PS0xfXJlYWRCbG9jaygpe2NvbnN0IGU9dGhpcy5zdHIuZ2V0Qnl0ZXMoOGUzKTtpZighZS5sZW5ndGgpcmV0dXJuIHZvaWQodGhpcy5lb2Y9ITApO2NvbnN0IHQ9ZS5sZW5ndGgrMT4+MSxyPXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoK3QpO2xldCBuPXRoaXMuYnVmZmVyTGVuZ3RoLGE9dGhpcy5maXJzdERpZ2l0O2Zvcihjb25zdCB0IG9mIGUpe2xldCBlO2lmKHQ+PTQ4JiZ0PD01NyllPTE1JnQ7ZWxzZXtpZighKHQ+PTY1JiZ0PD03MHx8dD49OTcmJnQ8PTEwMikpe2lmKDYyPT09dCl7dGhpcy5lb2Y9ITA7YnJlYWt9Y29udGludWV9ZT05KygxNSZ0KX1hPDA/YT1lOihyW24rK109YTw8NHxlLGE9LTEpfWE+PTAmJnRoaXMuZW9mJiYocltuKytdPWE8PDQsYT0tMSksdGhpcy5maXJzdERpZ2l0PWEsdGhpcy5idWZmZXJMZW5ndGg9bn19dC5Bc2NpaUhleFN0cmVhbT1hfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ0NJVFRGYXhTdHJlYW09dm9pZCAwO3ZhciBuPXIoMTcxKSxhPXIoMTY4KSxpPXIoMTUwKTtjbGFzcyBzIGV4dGVuZHMgYS5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKHQpLHRoaXMuc3RyPWUsdGhpcy5kaWN0PWUuZGljdCxyIGluc3RhbmNlb2YgaS5EaWN0fHwocj1pLkRpY3QuZW1wdHkpO2NvbnN0IGE9e25leHQ6KCk9PmUuZ2V0Qnl0ZSgpfTt0aGlzLmNjaXR0RmF4RGVjb2Rlcj1uZXcgbi5DQ0lUVEZheERlY29kZXIoYSx7SzpyLmdldCgiSyIpLEVuZE9mTGluZTpyLmdldCgiRW5kT2ZMaW5lIiksRW5jb2RlZEJ5dGVBbGlnbjpyLmdldCgiRW5jb2RlZEJ5dGVBbGlnbiIpLENvbHVtbnM6ci5nZXQoIkNvbHVtbnMiKSxSb3dzOnIuZ2V0KCJSb3dzIiksRW5kT2ZCbG9jazpyLmdldCgiRW5kT2ZCbG9jayIpLEJsYWNrSXMxOnIuZ2V0KCJCbGFja0lzMSIpfSl9cmVhZEJsb2NrKCl7Zm9yKDshdGhpcy5lb2Y7KXtjb25zdCBlPXRoaXMuY2NpdHRGYXhEZWNvZGVyLnJlYWROZXh0Q2hhcigpO2lmKC0xPT09ZSlyZXR1cm4gdm9pZCh0aGlzLmVvZj0hMCk7dGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGgrMSksdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZX19fXQuQ0NJVFRGYXhTdHJlYW09c30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkNDSVRURmF4RGVjb2Rlcj12b2lkIDAscigyKSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpO2NvbnN0IGE9LTEsaT1bWy0xLC0xXSxbLTEsLTFdLFs3LDhdLFs3LDddLFs2LDZdLFs2LDZdLFs2LDVdLFs2LDVdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFs0LDBdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDFdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDRdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFszLDNdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdLFsxLDJdXSxzPVtbLTEsLTFdLFsxMiwtMl0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjExMl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjMwNF0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjQzMl0sWzEyLDI0OTZdLFsxMiwyNTYwXV0sbz1bWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbOCwyOV0sWzgsMjldLFs4LDMwXSxbOCwzMF0sWzgsNDVdLFs4LDQ1XSxbOCw0Nl0sWzgsNDZdLFs3LDIyXSxbNywyMl0sWzcsMjJdLFs3LDIyXSxbNywyM10sWzcsMjNdLFs3LDIzXSxbNywyM10sWzgsNDddLFs4LDQ3XSxbOCw0OF0sWzgsNDhdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzYsMTNdLFs2LDEzXSxbNiwxM10sWzcsMjBdLFs3LDIwXSxbNywyMF0sWzcsMjBdLFs4LDMzXSxbOCwzM10sWzgsMzRdLFs4LDM0XSxbOCwzNV0sWzgsMzVdLFs4LDM2XSxbOCwzNl0sWzgsMzddLFs4LDM3XSxbOCwzOF0sWzgsMzhdLFs3LDE5XSxbNywxOV0sWzcsMTldLFs3LDE5XSxbOCwzMV0sWzgsMzFdLFs4LDMyXSxbOCwzMl0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMV0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbNiwxMl0sWzYsMTJdLFs2LDEyXSxbOCw1M10sWzgsNTNdLFs4LDU0XSxbOCw1NF0sWzcsMjZdLFs3LDI2XSxbNywyNl0sWzcsMjZdLFs4LDM5XSxbOCwzOV0sWzgsNDBdLFs4LDQwXSxbOCw0MV0sWzgsNDFdLFs4LDQyXSxbOCw0Ml0sWzgsNDNdLFs4LDQzXSxbOCw0NF0sWzgsNDRdLFs3LDIxXSxbNywyMV0sWzcsMjFdLFs3LDIxXSxbNywyOF0sWzcsMjhdLFs3LDI4XSxbNywyOF0sWzgsNjFdLFs4LDYxXSxbOCw2Ml0sWzgsNjJdLFs4LDYzXSxbOCw2M10sWzgsMF0sWzgsMF0sWzgsMzIwXSxbOCwzMjBdLFs4LDM4NF0sWzgsMzg0XSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTBdLFs1LDEwXSxbNSwxMF0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs1LDExXSxbNSwxMV0sWzUsMTFdLFs3LDI3XSxbNywyN10sWzcsMjddLFs3LDI3XSxbOCw1OV0sWzgsNTldLFs4LDYwXSxbOCw2MF0sWzksMTQ3Ml0sWzksMTUzNl0sWzksMTYwMF0sWzksMTcyOF0sWzcsMThdLFs3LDE4XSxbNywxOF0sWzcsMThdLFs3LDI0XSxbNywyNF0sWzcsMjRdLFs3LDI0XSxbOCw0OV0sWzgsNDldLFs4LDUwXSxbOCw1MF0sWzgsNTFdLFs4LDUxXSxbOCw1Ml0sWzgsNTJdLFs3LDI1XSxbNywyNV0sWzcsMjVdLFs3LDI1XSxbOCw1NV0sWzgsNTVdLFs4LDU2XSxbOCw1Nl0sWzgsNTddLFs4LDU3XSxbOCw1OF0sWzgsNThdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxOTJdLFs2LDE5Ml0sWzYsMTkyXSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbNiwxNjY0XSxbOCw0NDhdLFs4LDQ0OF0sWzgsNTEyXSxbOCw1MTJdLFs5LDcwNF0sWzksNzY4XSxbOCw2NDBdLFs4LDY0MF0sWzgsNTc2XSxbOCw1NzZdLFs5LDgzMl0sWzksODk2XSxbOSw5NjBdLFs5LDEwMjRdLFs5LDEwODhdLFs5LDExNTJdLFs5LDEyMTZdLFs5LDEyODBdLFs5LDEzNDRdLFs5LDE0MDhdLFs3LDI1Nl0sWzcsMjU2XSxbNywyNTZdLFs3LDI1Nl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsMl0sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzQsM10sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSwxMjhdLFs1LDEyOF0sWzUsMTI4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw4XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNSw5XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE2XSxbNiwxNl0sWzYsMTZdLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzYsMTddLFs2LDE3XSxbNiwxN10sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNF0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNF0sWzYsMTRdLFs2LDE0XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs2LDE1XSxbNiwxNV0sWzYsMTVdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNSw2NF0sWzUsNjRdLFs1LDY0XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw2XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XSxbNCw3XV0sYz1bWy0xLC0xXSxbLTEsLTFdLFsxMiwtMl0sWzEyLC0yXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFsxMSwxNzkyXSxbMTEsMTc5Ml0sWzExLDE3OTJdLFsxMSwxNzkyXSxbMTIsMTk4NF0sWzEyLDE5ODRdLFsxMiwyMDQ4XSxbMTIsMjA0OF0sWzEyLDIxMTJdLFsxMiwyMTEyXSxbMTIsMjE3Nl0sWzEyLDIxNzZdLFsxMiwyMjQwXSxbMTIsMjI0MF0sWzEyLDIzMDRdLFsxMiwyMzA0XSxbMTEsMTg1Nl0sWzExLDE4NTZdLFsxMSwxODU2XSxbMTEsMTg1Nl0sWzExLDE5MjBdLFsxMSwxOTIwXSxbMTEsMTkyMF0sWzExLDE5MjBdLFsxMiwyMzY4XSxbMTIsMjM2OF0sWzEyLDI0MzJdLFsxMiwyNDMyXSxbMTIsMjQ5Nl0sWzEyLDI0OTZdLFsxMiwyNTYwXSxbMTIsMjU2MF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMCwxOF0sWzEwLDE4XSxbMTAsMThdLFsxMiw1Ml0sWzEyLDUyXSxbMTMsNjQwXSxbMTMsNzA0XSxbMTMsNzY4XSxbMTMsODMyXSxbMTIsNTVdLFsxMiw1NV0sWzEyLDU2XSxbMTIsNTZdLFsxMywxMjgwXSxbMTMsMTM0NF0sWzEzLDE0MDhdLFsxMywxNDcyXSxbMTIsNTldLFsxMiw1OV0sWzEyLDYwXSxbMTIsNjBdLFsxMywxNTM2XSxbMTMsMTYwMF0sWzExLDI0XSxbMTEsMjRdLFsxMSwyNF0sWzExLDI0XSxbMTEsMjVdLFsxMSwyNV0sWzExLDI1XSxbMTEsMjVdLFsxMywxNjY0XSxbMTMsMTcyOF0sWzEyLDMyMF0sWzEyLDMyMF0sWzEyLDM4NF0sWzEyLDM4NF0sWzEyLDQ0OF0sWzEyLDQ0OF0sWzEzLDUxMl0sWzEzLDU3Nl0sWzEyLDUzXSxbMTIsNTNdLFsxMiw1NF0sWzEyLDU0XSxbMTMsODk2XSxbMTMsOTYwXSxbMTMsMTAyNF0sWzEzLDEwODhdLFsxMywxMTUyXSxbMTMsMTIxNl0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdLFsxMCw2NF0sWzEwLDY0XSxbMTAsNjRdXSxsPVtbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzgsMTNdLFs4LDEzXSxbOCwxM10sWzExLDIzXSxbMTEsMjNdLFsxMiw1MF0sWzEyLDUxXSxbMTIsNDRdLFsxMiw0NV0sWzEyLDQ2XSxbMTIsNDddLFsxMiw1N10sWzEyLDU4XSxbMTIsNjFdLFsxMiwyNTZdLFsxMCwxNl0sWzEwLDE2XSxbMTAsMTZdLFsxMCwxNl0sWzEwLDE3XSxbMTAsMTddLFsxMCwxN10sWzEwLDE3XSxbMTIsNDhdLFsxMiw0OV0sWzEyLDYyXSxbMTIsNjNdLFsxMiwzMF0sWzEyLDMxXSxbMTIsMzJdLFsxMiwzM10sWzEyLDQwXSxbMTIsNDFdLFsxMSwyMl0sWzExLDIyXSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzgsMTRdLFs4LDE0XSxbOCwxNF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMF0sWzcsMTBdLFs3LDEwXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs3LDExXSxbNywxMV0sWzcsMTFdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzksMTVdLFs5LDE1XSxbOSwxNV0sWzEyLDEyOF0sWzEyLDE5Ml0sWzEyLDI2XSxbMTIsMjddLFsxMiwyOF0sWzEyLDI5XSxbMTEsMTldLFsxMSwxOV0sWzExLDIwXSxbMTEsMjBdLFsxMiwzNF0sWzEyLDM1XSxbMTIsMzZdLFsxMiwzN10sWzEyLDM4XSxbMTIsMzldLFsxMSwyMV0sWzExLDIxXSxbMTIsNDJdLFsxMiw0M10sWzEwLDBdLFsxMCwwXSxbMTAsMF0sWzEwLDBdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl0sWzcsMTJdLFs3LDEyXSxbNywxMl1dLGg9W1stMSwtMV0sWy0xLC0xXSxbLTEsLTFdLFstMSwtMV0sWzYsOV0sWzYsOF0sWzUsN10sWzUsN10sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNl0sWzQsNV0sWzQsNV0sWzQsNV0sWzQsNV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsMV0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzMsNF0sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsM10sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl0sWzIsMl1dO3QuQ0NJVFRGYXhEZWNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3ZhciB0O2xldCByLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCFlfHwiZnVuY3Rpb24iIT10eXBlb2YgZS5uZXh0KXRocm93IG5ldyBFcnJvcignQ0NJVFRGYXhEZWNvZGVyIC0gaW52YWxpZCAic291cmNlIiBwYXJhbWV0ZXIuJyk7Zm9yKHRoaXMuc291cmNlPWUsdGhpcy5lb2Y9ITEsdGhpcy5lbmNvZGluZz1uLkt8fDAsdGhpcy5lb2xpbmU9bi5FbmRPZkxpbmV8fCExLHRoaXMuYnl0ZUFsaWduPW4uRW5jb2RlZEJ5dGVBbGlnbnx8ITEsdGhpcy5jb2x1bW5zPW4uQ29sdW1uc3x8MTcyOCx0aGlzLnJvd3M9bi5Sb3dzfHwwLHRoaXMuZW9ibG9jaz1udWxsPT09KHQ9bi5FbmRPZkJsb2NrKXx8dm9pZCAwPT09dHx8dCx0aGlzLmJsYWNrPW4uQmxhY2tJczF8fCExLHRoaXMuY29kaW5nTGluZT1uZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zKzEpLHRoaXMucmVmTGluZT1uZXcgVWludDMyQXJyYXkodGhpcy5jb2x1bW5zKzIpLHRoaXMuY29kaW5nTGluZVswXT10aGlzLmNvbHVtbnMsdGhpcy5jb2RpbmdQb3M9MCx0aGlzLnJvdz0wLHRoaXMubmV4dExpbmUyRD10aGlzLmVuY29kaW5nPDAsdGhpcy5pbnB1dEJpdHM9MCx0aGlzLmlucHV0QnVmPTAsdGhpcy5vdXRwdXRCaXRzPTAsdGhpcy5yb3dzRG9uZT0hMTswPT09KHI9dGhpcy5fbG9va0JpdHMoMTIpKTspdGhpcy5fZWF0Qml0cygxKTsxPT09ciYmdGhpcy5fZWF0Qml0cygxMiksdGhpcy5lbmNvZGluZz4wJiYodGhpcy5uZXh0TGluZTJEPSF0aGlzLl9sb29rQml0cygxKSx0aGlzLl9lYXRCaXRzKDEpKX1yZWFkTmV4dENoYXIoKXtpZih0aGlzLmVvZilyZXR1cm4tMTtjb25zdCBlPXRoaXMucmVmTGluZSx0PXRoaXMuY29kaW5nTGluZSxyPXRoaXMuY29sdW1ucztsZXQgaSxzLG8sYyxsO2lmKDA9PT10aGlzLm91dHB1dEJpdHMpe2lmKHRoaXMucm93c0RvbmUmJih0aGlzLmVvZj0hMCksdGhpcy5lb2YpcmV0dXJuLTE7bGV0IG8sbCxoO2lmKHRoaXMuZXJyPSExLHRoaXMubmV4dExpbmUyRCl7Zm9yKGM9MDt0W2NdPHI7KytjKWVbY109dFtjXTtmb3IoZVtjKytdPXIsZVtjXT1yLHRbMF09MCx0aGlzLmNvZGluZ1Bvcz0wLGk9MCxzPTA7dFt0aGlzLmNvZGluZ1Bvc108cjspc3dpdGNoKG89dGhpcy5fZ2V0VHdvRGltQ29kZSgpLG8pe2Nhc2UgMDp0aGlzLl9hZGRQaXhlbHMoZVtpKzFdLHMpLGVbaSsxXTxyJiYoaSs9Mik7YnJlYWs7Y2FzZSAxOmlmKG89bD0wLHMpe2Rve28rPWg9dGhpcy5fZ2V0QmxhY2tDb2RlKCl9d2hpbGUoaD49NjQpO2Rve2wrPWg9dGhpcy5fZ2V0V2hpdGVDb2RlKCl9d2hpbGUoaD49NjQpfWVsc2V7ZG97bys9aD10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShoPj02NCk7ZG97bCs9aD10aGlzLl9nZXRCbGFja0NvZGUoKX13aGlsZShoPj02NCl9Zm9yKHRoaXMuX2FkZFBpeGVscyh0W3RoaXMuY29kaW5nUG9zXStvLHMpLHRbdGhpcy5jb2RpbmdQb3NdPHImJnRoaXMuX2FkZFBpeGVscyh0W3RoaXMuY29kaW5nUG9zXStsLDFecyk7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9MjticmVhaztjYXNlIDc6aWYodGhpcy5fYWRkUGl4ZWxzKGVbaV0rMyxzKSxzXj0xLHRbdGhpcy5jb2RpbmdQb3NdPHIpZm9yKCsraTtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yO2JyZWFrO2Nhc2UgNTppZih0aGlzLl9hZGRQaXhlbHMoZVtpXSsyLHMpLHNePTEsdFt0aGlzLmNvZGluZ1Bvc108cilmb3IoKytpO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTI7YnJlYWs7Y2FzZSAzOmlmKHRoaXMuX2FkZFBpeGVscyhlW2ldKzEscyksc149MSx0W3RoaXMuY29kaW5nUG9zXTxyKWZvcigrK2k7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9MjticmVhaztjYXNlIDI6aWYodGhpcy5fYWRkUGl4ZWxzKGVbaV0scyksc149MSx0W3RoaXMuY29kaW5nUG9zXTxyKWZvcigrK2k7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9MjticmVhaztjYXNlIDg6aWYodGhpcy5fYWRkUGl4ZWxzTmVnKGVbaV0tMyxzKSxzXj0xLHRbdGhpcy5jb2RpbmdQb3NdPHIpZm9yKGk+MD8tLWk6KytpO2VbaV08PXRbdGhpcy5jb2RpbmdQb3NdJiZlW2ldPHI7KWkrPTI7YnJlYWs7Y2FzZSA2OmlmKHRoaXMuX2FkZFBpeGVsc05lZyhlW2ldLTIscyksc149MSx0W3RoaXMuY29kaW5nUG9zXTxyKWZvcihpPjA/LS1pOisraTtlW2ldPD10W3RoaXMuY29kaW5nUG9zXSYmZVtpXTxyOylpKz0yO2JyZWFrO2Nhc2UgNDppZih0aGlzLl9hZGRQaXhlbHNOZWcoZVtpXS0xLHMpLHNePTEsdFt0aGlzLmNvZGluZ1Bvc108cilmb3IoaT4wPy0taTorK2k7ZVtpXTw9dFt0aGlzLmNvZGluZ1Bvc10mJmVbaV08cjspaSs9MjticmVhaztjYXNlIGE6dGhpcy5fYWRkUGl4ZWxzKHIsMCksdGhpcy5lb2Y9ITA7YnJlYWs7ZGVmYXVsdDooMCxuLmluZm8pKCJiYWQgMmQgY29kZSIpLHRoaXMuX2FkZFBpeGVscyhyLDApLHRoaXMuZXJyPSEwfX1lbHNlIGZvcih0WzBdPTAsdGhpcy5jb2RpbmdQb3M9MCxzPTA7dFt0aGlzLmNvZGluZ1Bvc108cjspe2lmKG89MCxzKWRve28rPWg9dGhpcy5fZ2V0QmxhY2tDb2RlKCl9d2hpbGUoaD49NjQpO2Vsc2UgZG97bys9aD10aGlzLl9nZXRXaGl0ZUNvZGUoKX13aGlsZShoPj02NCk7dGhpcy5fYWRkUGl4ZWxzKHRbdGhpcy5jb2RpbmdQb3NdK28scyksc149MX1sZXQgdT0hMTtpZih0aGlzLmJ5dGVBbGlnbiYmKHRoaXMuaW5wdXRCaXRzJj0tOCksdGhpcy5lb2Jsb2NrfHx0aGlzLnJvdyE9PXRoaXMucm93cy0xKXtpZihvPXRoaXMuX2xvb2tCaXRzKDEyKSx0aGlzLmVvbGluZSlmb3IoO28hPT1hJiYxIT09bzspdGhpcy5fZWF0Qml0cygxKSxvPXRoaXMuX2xvb2tCaXRzKDEyKTtlbHNlIGZvcig7MD09PW87KXRoaXMuX2VhdEJpdHMoMSksbz10aGlzLl9sb29rQml0cygxMik7MT09PW8/KHRoaXMuX2VhdEJpdHMoMTIpLHU9ITApOm89PT1hJiYodGhpcy5lb2Y9ITApfWVsc2UgdGhpcy5yb3dzRG9uZT0hMDtpZighdGhpcy5lb2YmJnRoaXMuZW5jb2Rpbmc+MCYmIXRoaXMucm93c0RvbmUmJih0aGlzLm5leHRMaW5lMkQ9IXRoaXMuX2xvb2tCaXRzKDEpLHRoaXMuX2VhdEJpdHMoMSkpLHRoaXMuZW9ibG9jayYmdSYmdGhpcy5ieXRlQWxpZ24pe2lmKG89dGhpcy5fbG9va0JpdHMoMTIpLDE9PT1vKXtpZih0aGlzLl9lYXRCaXRzKDEyKSx0aGlzLmVuY29kaW5nPjAmJih0aGlzLl9sb29rQml0cygxKSx0aGlzLl9lYXRCaXRzKDEpKSx0aGlzLmVuY29kaW5nPj0wKWZvcihjPTA7Yzw0OysrYylvPXRoaXMuX2xvb2tCaXRzKDEyKSwxIT09byYmKDAsbi5pbmZvKSgiYmFkIHJ0YyBjb2RlOiAiK28pLHRoaXMuX2VhdEJpdHMoMTIpLHRoaXMuZW5jb2Rpbmc+MCYmKHRoaXMuX2xvb2tCaXRzKDEpLHRoaXMuX2VhdEJpdHMoMSkpO3RoaXMuZW9mPSEwfX1lbHNlIGlmKHRoaXMuZXJyJiZ0aGlzLmVvbGluZSl7Zm9yKDs7KXtpZihvPXRoaXMuX2xvb2tCaXRzKDEzKSxvPT09YSlyZXR1cm4gdGhpcy5lb2Y9ITAsLTE7aWYobz4+MT09MSlicmVhazt0aGlzLl9lYXRCaXRzKDEpfXRoaXMuX2VhdEJpdHMoMTIpLHRoaXMuZW5jb2Rpbmc+MCYmKHRoaXMuX2VhdEJpdHMoMSksdGhpcy5uZXh0TGluZTJEPSEoMSZvKSl9dGhpcy5vdXRwdXRCaXRzPXRbMF0+MD90W3RoaXMuY29kaW5nUG9zPTBdOnRbdGhpcy5jb2RpbmdQb3M9MV0sdGhpcy5yb3crK31pZih0aGlzLm91dHB1dEJpdHM+PTgpbD0xJnRoaXMuY29kaW5nUG9zPzA6MjU1LHRoaXMub3V0cHV0Qml0cy09OCwwPT09dGhpcy5vdXRwdXRCaXRzJiZ0W3RoaXMuY29kaW5nUG9zXTxyJiYodGhpcy5jb2RpbmdQb3MrKyx0aGlzLm91dHB1dEJpdHM9dFt0aGlzLmNvZGluZ1Bvc10tdFt0aGlzLmNvZGluZ1Bvcy0xXSk7ZWxzZXtvPTgsbD0wO2Rve2lmKCJudW1iZXIiIT10eXBlb2YgdGhpcy5vdXRwdXRCaXRzKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdJbnZhbGlkIC9DQ0lUVEZheERlY29kZSBkYXRhLCAib3V0cHV0Qml0cyIgbXVzdCBiZSBhIG51bWJlci4nKTt0aGlzLm91dHB1dEJpdHM+bz8obDw8PW8sMSZ0aGlzLmNvZGluZ1Bvc3x8KGx8PTI1NT4+OC1vKSx0aGlzLm91dHB1dEJpdHMtPW8sbz0wKToobDw8PXRoaXMub3V0cHV0Qml0cywxJnRoaXMuY29kaW5nUG9zfHwobHw9MjU1Pj44LXRoaXMub3V0cHV0Qml0cyksby09dGhpcy5vdXRwdXRCaXRzLHRoaXMub3V0cHV0Qml0cz0wLHRbdGhpcy5jb2RpbmdQb3NdPHI/KHRoaXMuY29kaW5nUG9zKyssdGhpcy5vdXRwdXRCaXRzPXRbdGhpcy5jb2RpbmdQb3NdLXRbdGhpcy5jb2RpbmdQb3MtMV0pOm8+MCYmKGw8PD1vLG89MCkpfXdoaWxlKG8pfXJldHVybiB0aGlzLmJsYWNrJiYobF49MjU1KSxsfV9hZGRQaXhlbHMoZSx0KXtjb25zdCByPXRoaXMuY29kaW5nTGluZTtsZXQgYT10aGlzLmNvZGluZ1BvcztlPnJbYV0mJihlPnRoaXMuY29sdW1ucyYmKCgwLG4uaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKSx0aGlzLmVycj0hMCxlPXRoaXMuY29sdW1ucyksMSZhXnQmJisrYSxyW2FdPWUpLHRoaXMuY29kaW5nUG9zPWF9X2FkZFBpeGVsc05lZyhlLHQpe2NvbnN0IHI9dGhpcy5jb2RpbmdMaW5lO2xldCBhPXRoaXMuY29kaW5nUG9zO2lmKGU+clthXSllPnRoaXMuY29sdW1ucyYmKCgwLG4uaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKSx0aGlzLmVycj0hMCxlPXRoaXMuY29sdW1ucyksMSZhXnQmJisrYSxyW2FdPWU7ZWxzZSBpZihlPHJbYV0pe2ZvcihlPDAmJigoMCxuLmluZm8pKCJpbnZhbGlkIGNvZGUiKSx0aGlzLmVycj0hMCxlPTApO2E+MCYmZTxyW2EtMV07KS0tYTtyW2FdPWV9dGhpcy5jb2RpbmdQb3M9YX1fZmluZFRhYmxlQ29kZShlLHQscixuKXtjb25zdCBpPW58fDA7Zm9yKGxldCBuPWU7bjw9dDsrK24pe2xldCBlPXRoaXMuX2xvb2tCaXRzKG4pO2lmKGU9PT1hKXJldHVyblshMCwxLCExXTtpZihuPHQmJihlPDw9dC1uKSwhaXx8ZT49aSl7Y29uc3QgdD1yW2UtaV07aWYodFswXT09PW4pcmV0dXJuIHRoaXMuX2VhdEJpdHMobiksWyEwLHRbMV0sITBdfX1yZXR1cm5bITEsMCwhMV19X2dldFR3b0RpbUNvZGUoKXtsZXQgZSx0PTA7aWYodGhpcy5lb2Jsb2NrKXt2YXIgcjtpZih0PXRoaXMuX2xvb2tCaXRzKDcpLGU9aVt0XSwobnVsbD09PShyPWUpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyWzBdKT4wKXJldHVybiB0aGlzLl9lYXRCaXRzKGVbMF0pLGVbMV19ZWxzZXtjb25zdCBlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMSw3LGkpO2lmKGVbMF0mJmVbMl0pcmV0dXJuIGVbMV19cmV0dXJuKDAsbi5pbmZvKSgiQmFkIHR3byBkaW0gY29kZSIpLGF9X2dldFdoaXRlQ29kZSgpe2xldCBlLHQ9MDtpZih0aGlzLmVvYmxvY2spe2lmKHQ9dGhpcy5fbG9va0JpdHMoMTIpLHQ9PT1hKXJldHVybiAxO2lmKGU9dD4+NT09MD9zW3RdOm9bdD4+M10sZVswXT4wKXJldHVybiB0aGlzLl9lYXRCaXRzKGVbMF0pLGVbMV19ZWxzZXtsZXQgZT10aGlzLl9maW5kVGFibGVDb2RlKDEsOSxvKTtpZihlWzBdKXJldHVybiBlWzFdO2lmKGU9dGhpcy5fZmluZFRhYmxlQ29kZSgxMSwxMixzKSxlWzBdKXJldHVybiBlWzFdfXJldHVybigwLG4uaW5mbykoImJhZCB3aGl0ZSBjb2RlIiksdGhpcy5fZWF0Qml0cygxKSwxfV9nZXRCbGFja0NvZGUoKXtsZXQgZSx0O2lmKHRoaXMuZW9ibG9jayl7aWYoZT10aGlzLl9sb29rQml0cygxMyksZT09PWEpcmV0dXJuIDE7aWYodD1lPj43PT0wP2NbZV06ZT4+OT09MCYmZT4+NyE9MD9sWyhlPj4xKS02NF06aFtlPj43XSx0WzBdPjApcmV0dXJuIHRoaXMuX2VhdEJpdHModFswXSksdFsxXX1lbHNle2xldCBlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMiw2LGgpO2lmKGVbMF0pcmV0dXJuIGVbMV07aWYoZT10aGlzLl9maW5kVGFibGVDb2RlKDcsMTIsbCw2NCksZVswXSlyZXR1cm4gZVsxXTtpZihlPXRoaXMuX2ZpbmRUYWJsZUNvZGUoMTAsMTMsYyksZVswXSlyZXR1cm4gZVsxXX1yZXR1cm4oMCxuLmluZm8pKCJiYWQgYmxhY2sgY29kZSIpLHRoaXMuX2VhdEJpdHMoMSksMX1fbG9va0JpdHMoZSl7bGV0IHQ7Zm9yKDt0aGlzLmlucHV0Qml0czxlOyl7aWYoLTE9PT0odD10aGlzLnNvdXJjZS5uZXh0KCkpKXJldHVybiAwPT09dGhpcy5pbnB1dEJpdHM/YTp0aGlzLmlucHV0QnVmPDxlLXRoaXMuaW5wdXRCaXRzJjY1NTM1Pj4xNi1lO3RoaXMuaW5wdXRCdWY9dGhpcy5pbnB1dEJ1Zjw8OHx0LHRoaXMuaW5wdXRCaXRzKz04fXJldHVybiB0aGlzLmlucHV0QnVmPj50aGlzLmlucHV0Qml0cy1lJjY1NTM1Pj4xNi1lfV9lYXRCaXRzKGUpeyh0aGlzLmlucHV0Qml0cy09ZSk8MCYmKHRoaXMuaW5wdXRCaXRzPTApfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5GbGF0ZVN0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTY4KSxhPXIoMTQ0KTtjb25zdCBpPW5ldyBJbnQzMkFycmF5KFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSkscz1uZXcgSW50MzJBcnJheShbMyw0LDUsNiw3LDgsOSwxMCw2NTU0Nyw2NTU0OSw2NTU1MSw2NTU1MywxMzEwOTEsMTMxMDk1LDEzMTA5OSwxMzExMDMsMTk2NjQzLDE5NjY1MSwxOTY2NTksMTk2NjY3LDI2MjIxMSwyNjIyMjcsMjYyMjQzLDI2MjI1OSwzMjc4MTEsMzI3ODQzLDMyNzg3NSwzMjc5MDcsMjU4LDI1OCwyNThdKSxvPW5ldyBJbnQzMkFycmF5KFsxLDIsMyw0LDY1NTQxLDY1NTQzLDEzMTA4MSwxMzEwODUsMTk2NjI1LDE5NjYzMywyNjIxNzcsMjYyMTkzLDMyNzc0NSwzMjc3NzcsMzkzMzQ1LDM5MzQwOSw0NTkwMDksNDU5MTM3LDUyNDgwMSw1MjUwNTcsNTkwODQ5LDU5MTM2MSw2NTc0MDksNjU4NDMzLDcyNDk5Myw3MjcwNDEsNzk0NjI1LDc5ODcyMSw4NjgzNTMsODc2NTQ1XSksYz1bbmV3IEludDMyQXJyYXkoWzQ1OTAwOCw1MjQzNjgsNTI0MzA0LDUyNDU2OCw0NTkwMjQsNTI0NDAwLDUyNDMzNiw1OTAwMTYsNDU5MDE2LDUyNDM4NCw1MjQzMjAsNTg5OTg0LDUyNDI4OCw1MjQ0MTYsNTI0MzUyLDU5MDA0OCw0NTkwMTIsNTI0Mzc2LDUyNDMxMiw1ODk5NjgsNDU5MDI4LDUyNDQwOCw1MjQzNDQsNTkwMDMyLDQ1OTAyMCw1MjQzOTIsNTI0MzI4LDU5ZTQsNTI0Mjk2LDUyNDQyNCw1MjQzNjAsNTkwMDY0LDQ1OTAxMCw1MjQzNzIsNTI0MzA4LDUyNDU3Miw0NTkwMjYsNTI0NDA0LDUyNDM0MCw1OTAwMjQsNDU5MDE4LDUyNDM4OCw1MjQzMjQsNTg5OTkyLDUyNDI5Miw1MjQ0MjAsNTI0MzU2LDU5MDA1Niw0NTkwMTQsNTI0MzgwLDUyNDMxNiw1ODk5NzYsNDU5MDMwLDUyNDQxMiw1MjQzNDgsNTkwMDQwLDQ1OTAyMiw1MjQzOTYsNTI0MzMyLDU5MDAwOCw1MjQzMDAsNTI0NDI4LDUyNDM2NCw1OTAwNzIsNDU5MDA5LDUyNDM3MCw1MjQzMDYsNTI0NTcwLDQ1OTAyNSw1MjQ0MDIsNTI0MzM4LDU5MDAyMCw0NTkwMTcsNTI0Mzg2LDUyNDMyMiw1ODk5ODgsNTI0MjkwLDUyNDQxOCw1MjQzNTQsNTkwMDUyLDQ1OTAxMyw1MjQzNzgsNTI0MzE0LDU4OTk3Miw0NTkwMjksNTI0NDEwLDUyNDM0Niw1OTAwMzYsNDU5MDIxLDUyNDM5NCw1MjQzMzAsNTkwMDA0LDUyNDI5OCw1MjQ0MjYsNTI0MzYyLDU5MDA2OCw0NTkwMTEsNTI0Mzc0LDUyNDMxMCw1MjQ1NzQsNDU5MDI3LDUyNDQwNiw1MjQzNDIsNTkwMDI4LDQ1OTAxOSw1MjQzOTAsNTI0MzI2LDU4OTk5Niw1MjQyOTQsNTI0NDIyLDUyNDM1OCw1OTAwNjAsNDU5MDE1LDUyNDM4Miw1MjQzMTgsNTg5OTgwLDQ1OTAzMSw1MjQ0MTQsNTI0MzUwLDU5MDA0NCw0NTkwMjMsNTI0Mzk4LDUyNDMzNCw1OTAwMTIsNTI0MzAyLDUyNDQzMCw1MjQzNjYsNTkwMDc2LDQ1OTAwOCw1MjQzNjksNTI0MzA1LDUyNDU2OSw0NTkwMjQsNTI0NDAxLDUyNDMzNyw1OTAwMTgsNDU5MDE2LDUyNDM4NSw1MjQzMjEsNTg5OTg2LDUyNDI4OSw1MjQ0MTcsNTI0MzUzLDU5MDA1MCw0NTkwMTIsNTI0Mzc3LDUyNDMxMyw1ODk5NzAsNDU5MDI4LDUyNDQwOSw1MjQzNDUsNTkwMDM0LDQ1OTAyMCw1MjQzOTMsNTI0MzI5LDU5MDAwMiw1MjQyOTcsNTI0NDI1LDUyNDM2MSw1OTAwNjYsNDU5MDEwLDUyNDM3Myw1MjQzMDksNTI0NTczLDQ1OTAyNiw1MjQ0MDUsNTI0MzQxLDU5MDAyNiw0NTkwMTgsNTI0Mzg5LDUyNDMyNSw1ODk5OTQsNTI0MjkzLDUyNDQyMSw1MjQzNTcsNTkwMDU4LDQ1OTAxNCw1MjQzODEsNTI0MzE3LDU4OTk3OCw0NTkwMzAsNTI0NDEzLDUyNDM0OSw1OTAwNDIsNDU5MDIyLDUyNDM5Nyw1MjQzMzMsNTkwMDEwLDUyNDMwMSw1MjQ0MjksNTI0MzY1LDU5MDA3NCw0NTkwMDksNTI0MzcxLDUyNDMwNyw1MjQ1NzEsNDU5MDI1LDUyNDQwMyw1MjQzMzksNTkwMDIyLDQ1OTAxNyw1MjQzODcsNTI0MzIzLDU4OTk5MCw1MjQyOTEsNTI0NDE5LDUyNDM1NSw1OTAwNTQsNDU5MDEzLDUyNDM3OSw1MjQzMTUsNTg5OTc0LDQ1OTAyOSw1MjQ0MTEsNTI0MzQ3LDU5MDAzOCw0NTkwMjEsNTI0Mzk1LDUyNDMzMSw1OTAwMDYsNTI0Mjk5LDUyNDQyNyw1MjQzNjMsNTkwMDcwLDQ1OTAxMSw1MjQzNzUsNTI0MzExLDUyNDU3NSw0NTkwMjcsNTI0NDA3LDUyNDM0Myw1OTAwMzAsNDU5MDE5LDUyNDM5MSw1MjQzMjcsNTg5OTk4LDUyNDI5NSw1MjQ0MjMsNTI0MzU5LDU5MDA2Miw0NTkwMTUsNTI0MzgzLDUyNDMxOSw1ODk5ODIsNDU5MDMxLDUyNDQxNSw1MjQzNTEsNTkwMDQ2LDQ1OTAyMyw1MjQzOTksNTI0MzM1LDU5MDAxNCw1MjQzMDMsNTI0NDMxLDUyNDM2Nyw1OTAwNzgsNDU5MDA4LDUyNDM2OCw1MjQzMDQsNTI0NTY4LDQ1OTAyNCw1MjQ0MDAsNTI0MzM2LDU5MDAxNyw0NTkwMTYsNTI0Mzg0LDUyNDMyMCw1ODk5ODUsNTI0Mjg4LDUyNDQxNiw1MjQzNTIsNTkwMDQ5LDQ1OTAxMiw1MjQzNzYsNTI0MzEyLDU4OTk2OSw0NTkwMjgsNTI0NDA4LDUyNDM0NCw1OTAwMzMsNDU5MDIwLDUyNDM5Miw1MjQzMjgsNTkwMDAxLDUyNDI5Niw1MjQ0MjQsNTI0MzYwLDU5MDA2NSw0NTkwMTAsNTI0MzcyLDUyNDMwOCw1MjQ1NzIsNDU5MDI2LDUyNDQwNCw1MjQzNDAsNTkwMDI1LDQ1OTAxOCw1MjQzODgsNTI0MzI0LDU4OTk5Myw1MjQyOTIsNTI0NDIwLDUyNDM1Niw1OTAwNTcsNDU5MDE0LDUyNDM4MCw1MjQzMTYsNTg5OTc3LDQ1OTAzMCw1MjQ0MTIsNTI0MzQ4LDU5MDA0MSw0NTkwMjIsNTI0Mzk2LDUyNDMzMiw1OTAwMDksNTI0MzAwLDUyNDQyOCw1MjQzNjQsNTkwMDczLDQ1OTAwOSw1MjQzNzAsNTI0MzA2LDUyNDU3MCw0NTkwMjUsNTI0NDAyLDUyNDMzOCw1OTAwMjEsNDU5MDE3LDUyNDM4Niw1MjQzMjIsNTg5OTg5LDUyNDI5MCw1MjQ0MTgsNTI0MzU0LDU5MDA1Myw0NTkwMTMsNTI0Mzc4LDUyNDMxNCw1ODk5NzMsNDU5MDI5LDUyNDQxMCw1MjQzNDYsNTkwMDM3LDQ1OTAyMSw1MjQzOTQsNTI0MzMwLDU5MDAwNSw1MjQyOTgsNTI0NDI2LDUyNDM2Miw1OTAwNjksNDU5MDExLDUyNDM3NCw1MjQzMTAsNTI0NTc0LDQ1OTAyNyw1MjQ0MDYsNTI0MzQyLDU5MDAyOSw0NTkwMTksNTI0MzkwLDUyNDMyNiw1ODk5OTcsNTI0Mjk0LDUyNDQyMiw1MjQzNTgsNTkwMDYxLDQ1OTAxNSw1MjQzODIsNTI0MzE4LDU4OTk4MSw0NTkwMzEsNTI0NDE0LDUyNDM1MCw1OTAwNDUsNDU5MDIzLDUyNDM5OCw1MjQzMzQsNTkwMDEzLDUyNDMwMiw1MjQ0MzAsNTI0MzY2LDU5MDA3Nyw0NTkwMDgsNTI0MzY5LDUyNDMwNSw1MjQ1NjksNDU5MDI0LDUyNDQwMSw1MjQzMzcsNTkwMDE5LDQ1OTAxNiw1MjQzODUsNTI0MzIxLDU4OTk4Nyw1MjQyODksNTI0NDE3LDUyNDM1Myw1OTAwNTEsNDU5MDEyLDUyNDM3Nyw1MjQzMTMsNTg5OTcxLDQ1OTAyOCw1MjQ0MDksNTI0MzQ1LDU5MDAzNSw0NTkwMjAsNTI0MzkzLDUyNDMyOSw1OTAwMDMsNTI0Mjk3LDUyNDQyNSw1MjQzNjEsNTkwMDY3LDQ1OTAxMCw1MjQzNzMsNTI0MzA5LDUyNDU3Myw0NTkwMjYsNTI0NDA1LDUyNDM0MSw1OTAwMjcsNDU5MDE4LDUyNDM4OSw1MjQzMjUsNTg5OTk1LDUyNDI5Myw1MjQ0MjEsNTI0MzU3LDU5MDA1OSw0NTkwMTQsNTI0MzgxLDUyNDMxNyw1ODk5NzksNDU5MDMwLDUyNDQxMyw1MjQzNDksNTkwMDQzLDQ1OTAyMiw1MjQzOTcsNTI0MzMzLDU5MDAxMSw1MjQzMDEsNTI0NDI5LDUyNDM2NSw1OTAwNzUsNDU5MDA5LDUyNDM3MSw1MjQzMDcsNTI0NTcxLDQ1OTAyNSw1MjQ0MDMsNTI0MzM5LDU5MDAyMyw0NTkwMTcsNTI0Mzg3LDUyNDMyMyw1ODk5OTEsNTI0MjkxLDUyNDQxOSw1MjQzNTUsNTkwMDU1LDQ1OTAxMyw1MjQzNzksNTI0MzE1LDU4OTk3NSw0NTkwMjksNTI0NDExLDUyNDM0Nyw1OTAwMzksNDU5MDIxLDUyNDM5NSw1MjQzMzEsNTkwMDA3LDUyNDI5OSw1MjQ0MjcsNTI0MzYzLDU5MDA3MSw0NTkwMTEsNTI0Mzc1LDUyNDMxMSw1MjQ1NzUsNDU5MDI3LDUyNDQwNyw1MjQzNDMsNTkwMDMxLDQ1OTAxOSw1MjQzOTEsNTI0MzI3LDU4OTk5OSw1MjQyOTUsNTI0NDIzLDUyNDM1OSw1OTAwNjMsNDU5MDE1LDUyNDM4Myw1MjQzMTksNTg5OTgzLDQ1OTAzMSw1MjQ0MTUsNTI0MzUxLDU5MDA0Nyw0NTkwMjMsNTI0Mzk5LDUyNDMzNSw1OTAwMTUsNTI0MzAzLDUyNDQzMSw1MjQzNjcsNTkwMDc5XSksOV0sbD1bbmV3IEludDMyQXJyYXkoWzMyNzY4MCwzMjc2OTYsMzI3Njg4LDMyNzcwNCwzMjc2ODQsMzI3NzAwLDMyNzY5MiwzMjc3MDgsMzI3NjgyLDMyNzY5OCwzMjc2OTAsMzI3NzA2LDMyNzY4NiwzMjc3MDIsMzI3Njk0LDAsMzI3NjgxLDMyNzY5NywzMjc2ODksMzI3NzA1LDMyNzY4NSwzMjc3MDEsMzI3NjkzLDMyNzcwOSwzMjc2ODMsMzI3Njk5LDMyNzY5MSwzMjc3MDcsMzI3Njg3LDMyNzcwMywzMjc2OTUsMF0pLDVdO2NsYXNzIGggZXh0ZW5kcyBuLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKHQpLHRoaXMuc3RyPWUsdGhpcy5kaWN0PWUuZGljdDtjb25zdCByPWUuZ2V0Qnl0ZSgpLG49ZS5nZXRCeXRlKCk7aWYoLTE9PT1yfHwtMT09PW4pdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogIi5jb25jYXQociwiLCAiKS5jb25jYXQobikpO2lmKDghPSgxNSZyKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAiLmNvbmNhdChyLCIsICIpLmNvbmNhdChuKSk7aWYoKChyPDw4KStuKSUzMSE9MCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06ICIuY29uY2F0KHIsIiwgIikuY29uY2F0KG4pKTtpZigzMiZuKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJGRElDVCBiaXQgc2V0IGluIGZsYXRlIHN0cmVhbTogIi5jb25jYXQociwiLCAiKS5jb25jYXQobikpO3RoaXMuY29kZVNpemU9MCx0aGlzLmNvZGVCdWY9MH1nZXRCaXRzKGUpe2NvbnN0IHQ9dGhpcy5zdHI7bGV0IHIsbj10aGlzLmNvZGVTaXplLGk9dGhpcy5jb2RlQnVmO2Zvcig7bjxlOyl7aWYoLTE9PT0ocj10LmdldEJ5dGUoKSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkJhZCBlbmNvZGluZyBpbiBmbGF0ZSBzdHJlYW0iKTtpfD1yPDxuLG4rPTh9cmV0dXJuIHI9aSYoMTw8ZSktMSx0aGlzLmNvZGVCdWY9aT4+ZSx0aGlzLmNvZGVTaXplPW4tPWUscn1nZXRDb2RlKGUpe2NvbnN0IHQ9dGhpcy5zdHIscj1lWzBdLG49ZVsxXTtsZXQgaSxzPXRoaXMuY29kZVNpemUsbz10aGlzLmNvZGVCdWY7Zm9yKDtzPG4mJi0xIT09KGk9dC5nZXRCeXRlKCkpOylvfD1pPDxzLHMrPTg7Y29uc3QgYz1yW28mKDE8PG4pLTFdLGw9Yz4+MTYsaD02NTUzNSZjO2lmKGw8MXx8czxsKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtIik7cmV0dXJuIHRoaXMuY29kZUJ1Zj1vPj5sLHRoaXMuY29kZVNpemU9cy1sLGh9Z2VuZXJhdGVIdWZmbWFuVGFibGUoZSl7Y29uc3QgdD1lLmxlbmd0aDtsZXQgcixuPTA7Zm9yKHI9MDtyPHQ7KytyKWVbcl0+biYmKG49ZVtyXSk7Y29uc3QgYT0xPDxuLGk9bmV3IEludDMyQXJyYXkoYSk7Zm9yKGxldCBzPTEsbz0wLGM9MjtzPD1uOysrcyxvPDw9MSxjPDw9MSlmb3IobGV0IG49MDtuPHQ7KytuKWlmKGVbbl09PT1zKXtsZXQgZT0wLHQ9bztmb3Iocj0wO3I8czsrK3IpZT1lPDwxfDEmdCx0Pj49MTtmb3Iocj1lO3I8YTtyKz1jKWlbcl09czw8MTZ8bjsrK299cmV0dXJuW2ksbl19cmVhZEJsb2NrKCl7bGV0IGUsdDtjb25zdCByPXRoaXMuc3RyO2xldCBuLGgsdT10aGlzLmdldEJpdHMoMyk7aWYoMSZ1JiYodGhpcy5lb2Y9ITApLHU+Pj0xLDA9PT11KXtsZXQgdDtpZigtMT09PSh0PXIuZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTtsZXQgbj10O2lmKC0xPT09KHQ9ci5nZXRCeXRlKCkpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpO2lmKG58PXQ8PDgsLTE9PT0odD1yLmdldEJ5dGUoKSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7bGV0IGk9dDtpZigtMT09PSh0PXIuZ2V0Qnl0ZSgpKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTtpZihpfD10PDw4LGkhPT0oNjU1MzUmfm4pJiYoMCE9PW58fDAhPT1pKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiQmFkIHVuY29tcHJlc3NlZCBibG9jayBsZW5ndGggaW4gZmxhdGUgc3RyZWFtIik7dGhpcy5jb2RlQnVmPTAsdGhpcy5jb2RlU2l6ZT0wO2NvbnN0IHM9dGhpcy5idWZmZXJMZW5ndGgsbz1zK247aWYoZT10aGlzLmVuc3VyZUJ1ZmZlcihvKSx0aGlzLmJ1ZmZlckxlbmd0aD1vLDA9PT1uKS0xPT09ci5wZWVrQnl0ZSgpJiYodGhpcy5lb2Y9ITApO2Vsc2V7Y29uc3QgdD1yLmdldEJ5dGVzKG4pO2Uuc2V0KHQscyksdC5sZW5ndGg8biYmKHRoaXMuZW9mPSEwKX1yZXR1cm59aWYoMT09PXUpbj1jLGg9bDtlbHNle2lmKDIhPT11KXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJVbmtub3duIGJsb2NrIHR5cGUgaW4gZmxhdGUgc3RyZWFtIik7e2NvbnN0IGU9dGhpcy5nZXRCaXRzKDUpKzI1NyxyPXRoaXMuZ2V0Qml0cyg1KSsxLGE9dGhpcy5nZXRCaXRzKDQpKzQscz1uZXcgVWludDhBcnJheShpLmxlbmd0aCk7bGV0IG87Zm9yKG89MDtvPGE7KytvKXNbaVtvXV09dGhpcy5nZXRCaXRzKDMpO2NvbnN0IGM9dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShzKTt0PTAsbz0wO2NvbnN0IGw9ZStyLHU9bmV3IFVpbnQ4QXJyYXkobCk7bGV0IGQsZixnO2Zvcig7bzxsOyl7Y29uc3QgZT10aGlzLmdldENvZGUoYyk7aWYoMTY9PT1lKWQ9MixmPTMsZz10O2Vsc2UgaWYoMTc9PT1lKWQ9MyxmPTMsZz10PTA7ZWxzZXtpZigxOCE9PWUpe3VbbysrXT10PWU7Y29udGludWV9ZD03LGY9MTEsZz10PTB9bGV0IHI9dGhpcy5nZXRCaXRzKGQpK2Y7Zm9yKDtyLS0gPjA7KXVbbysrXT1nfW49dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZSh1LnN1YmFycmF5KDAsZSkpLGg9dGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZSh1LnN1YmFycmF5KGUsbCkpfX1lPXRoaXMuYnVmZmVyO2xldCBkPWU/ZS5sZW5ndGg6MCxmPXRoaXMuYnVmZmVyTGVuZ3RoO2Zvcig7Oyl7bGV0IHI9dGhpcy5nZXRDb2RlKG4pO2lmKHI8MjU2KXtmKzE+PWQmJihlPXRoaXMuZW5zdXJlQnVmZmVyKGYrMSksZD1lLmxlbmd0aCksZVtmKytdPXI7Y29udGludWV9aWYoMjU2PT09cilyZXR1cm4gdm9pZCh0aGlzLmJ1ZmZlckxlbmd0aD1mKTtyLT0yNTcscj1zW3JdO2xldCBhPXI+PjE2O2E+MCYmKGE9dGhpcy5nZXRCaXRzKGEpKSx0PSg2NTUzNSZyKSthLHI9dGhpcy5nZXRDb2RlKGgpLHI9b1tyXSxhPXI+PjE2LGE+MCYmKGE9dGhpcy5nZXRCaXRzKGEpKTtjb25zdCBpPSg2NTUzNSZyKSthO2YrdD49ZCYmKGU9dGhpcy5lbnN1cmVCdWZmZXIoZit0KSxkPWUubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHQ7KytyLCsrZillW2ZdPWVbZi1pXX19fXQuRmxhdGVTdHJlYW09aH0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkpiaWcyU3RyZWFtPXZvaWQgMCxyKDEzOSk7dmFyIG49cigxNTEpLGE9cigxNjgpLGk9cigxNTApLHM9cigxNzQpLG89cigxNDQpO2NsYXNzIGMgZXh0ZW5kcyBhLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIodCksdGhpcy5zdHJlYW09ZSx0aGlzLmRpY3Q9ZS5kaWN0LHRoaXMubWF5YmVMZW5ndGg9dCx0aGlzLnBhcmFtcz1yfWdldCBieXRlcygpe3JldHVybigwLG8uc2hhZG93KSh0aGlzLCJieXRlcyIsdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpfWVuc3VyZUJ1ZmZlcihlKXt9cmVhZEJsb2NrKCl7aWYodGhpcy5lb2YpcmV0dXJuO2NvbnN0IGU9bmV3IHMuSmJpZzJJbWFnZSx0PVtdO2lmKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgaS5EaWN0KXtjb25zdCBlPXRoaXMucGFyYW1zLmdldCgiSkJJRzJHbG9iYWxzIik7aWYoZSBpbnN0YW5jZW9mIG4uQmFzZVN0cmVhbSl7Y29uc3Qgcj1lLmdldEJ5dGVzKCk7dC5wdXNoKHtkYXRhOnIsc3RhcnQ6MCxlbmQ6ci5sZW5ndGh9KX19dC5wdXNoKHtkYXRhOnRoaXMuYnl0ZXMsc3RhcnQ6MCxlbmQ6dGhpcy5ieXRlcy5sZW5ndGh9KTtjb25zdCByPWUucGFyc2VDaHVua3ModCksYT1yLmxlbmd0aDtmb3IobGV0IGU9MDtlPGE7ZSsrKXJbZV1ePTI1NTt0aGlzLmJ1ZmZlcj1yLHRoaXMuYnVmZmVyTGVuZ3RoPWEsdGhpcy5lb2Y9ITB9fXQuSmJpZzJTdHJlYW09Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkpiaWcySW1hZ2U9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDEzOSkscigyKTt2YXIgbj1yKDE0NCksYT1yKDE0OSksaT1yKDE3NSkscz1yKDE3MSk7Y2xhc3MgbyBleHRlbmRzIG4uQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcigiSkJJRzIgZXJyb3I6ICIuY29uY2F0KGUpLCJKYmlnMkVycm9yIil9fWNsYXNzIGN7Z2V0Q29udGV4dHMoZSl7cmV0dXJuIGUgaW4gdGhpcz90aGlzW2VdOnRoaXNbZV09bmV3IEludDhBcnJheSg2NTUzNil9fWNsYXNzIGx7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuZGF0YT1lLHRoaXMuc3RhcnQ9dCx0aGlzLmVuZD1yfWdldCBkZWNvZGVyKCl7Y29uc3QgZT1uZXcgaS5Bcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsdGhpcy5zdGFydCx0aGlzLmVuZCk7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImRlY29kZXIiLGUpfWdldCBjb250ZXh0Q2FjaGUoKXtjb25zdCBlPW5ldyBjO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJjb250ZXh0Q2FjaGUiLGUpfX1jb25zdCBoPTIqKjMxLTEsdT0tKDIqKjMxKTtmdW5jdGlvbiBkKGUsdCxyKXtjb25zdCBuPWUuZ2V0Q29udGV4dHModCk7bGV0IGE9MTtmdW5jdGlvbiBpKGUpe2xldCB0PTA7Zm9yKGxldCBpPTA7aTxlO2krKyl7Y29uc3QgZT1yLnJlYWRCaXQobixhKTthPWE8MjU2P2E8PDF8ZTo1MTEmKGE8PDF8ZSl8MjU2LHQ9dDw8MXxlfXJldHVybiB0Pj4+MH1jb25zdCBzPWkoMSksbz1pKDEpP2koMSk/aSgxKT9pKDEpP2koMSk/aSgzMikrNDQzNjppKDEyKSszNDA6aSg4KSs4NDppKDYpKzIwOmkoNCkrNDppKDIpO2xldCBjO3JldHVybiAwPT09cz9jPW86bz4wJiYoYz0tbyksYz49dSYmYzw9aD9jOm51bGx9ZnVuY3Rpb24gZihlLHQscil7Y29uc3Qgbj1lLmdldENvbnRleHRzKCJJQUlEIik7bGV0IGE9MTtmb3IobGV0IGU9MDtlPHI7ZSsrKWE9YTw8MXx0LnJlYWRCaXQobixhKTtyZXR1cm4gcjwzMT9hJigxPDxyKS0xOjIxNDc0ODM2NDcmYX1jb25zdCBnPVsiU3ltYm9sRGljdGlvbmFyeSIsbnVsbCxudWxsLG51bGwsIkludGVybWVkaWF0ZVRleHRSZWdpb24iLG51bGwsIkltbWVkaWF0ZVRleHRSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiUGF0dGVybkRpY3Rpb25hcnkiLG51bGwsbnVsbCxudWxsLCJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24iLCJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZ2lvbiIsbnVsbCwiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZ2lvbiIsIkludGVybWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uIixudWxsLCJJbW1lZGlhdGVHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLG51bGwsbnVsbCxudWxsLG51bGwsIlBhZ2VJbmZvcm1hdGlvbiIsIkVuZE9mUGFnZSIsIkVuZE9mU3RyaXBlIiwiRW5kT2ZGaWxlIiwiUHJvZmlsZXMiLCJUYWJsZXMiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiRXh0ZW5zaW9uIl0scD1bW3t4Oi0xLHk6LTJ9LHt4OjAseTotMn0se3g6MSx5Oi0yfSx7eDotMix5Oi0xfSx7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6Mix5Oi0xfSx7eDotNCx5OjB9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XSxbe3g6LTEseTotMn0se3g6MCx5Oi0yfSx7eDoxLHk6LTJ9LHt4OjIseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4OjIseTotMX0se3g6LTMseTowfSx7eDotMix5OjB9LHt4Oi0xLHk6MH1dLFt7eDotMSx5Oi0yfSx7eDowLHk6LTJ9LHt4OjEseTotMn0se3g6LTIseTotMX0se3g6LTEseTotMX0se3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0yLHk6MH0se3g6LTEseTowfV0sW3t4Oi0zLHk6LTF9LHt4Oi0yLHk6LTF9LHt4Oi0xLHk6LTF9LHt4OjAseTotMX0se3g6MSx5Oi0xfSx7eDotNCx5OjB9LHt4Oi0zLHk6MH0se3g6LTIseTowfSx7eDotMSx5OjB9XV0sbT1be2NvZGluZzpbe3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH1dLHJlZmVyZW5jZTpbe3g6MCx5Oi0xfSx7eDoxLHk6LTF9LHt4Oi0xLHk6MH0se3g6MCx5OjB9LHt4OjEseTowfSx7eDotMSx5OjF9LHt4OjAseToxfSx7eDoxLHk6MX1dfSx7Y29kaW5nOlt7eDotMSx5Oi0xfSx7eDowLHk6LTF9LHt4OjEseTotMX0se3g6LTEseTowfV0scmVmZXJlbmNlOlt7eDowLHk6LTF9LHt4Oi0xLHk6MH0se3g6MCx5OjB9LHt4OjEseTowfSx7eDowLHk6MX0se3g6MSx5OjF9XX1dLGI9WzM5NzE3LDE5NDEsMjI5LDQwNV0seT1bMzIsOF07ZnVuY3Rpb24gdyhlLHQscixuLGEsaSxzLG8pe2lmKGUpcmV0dXJuIEwobmV3IE4oby5kYXRhLG8uc3RhcnQsby5lbmQpLHQsciwhMSk7aWYoMD09PW4mJiFpJiYhYSYmND09PXMubGVuZ3RoJiYzPT09c1swXS54JiYtMT09PXNbMF0ueSYmLTM9PT1zWzFdLngmJi0xPT09c1sxXS55JiYyPT09c1syXS54JiYtMj09PXNbMl0ueSYmLTI9PT1zWzNdLngmJi0yPT09c1szXS55KXJldHVybiBmdW5jdGlvbihlLHQscil7Y29uc3Qgbj1yLmRlY29kZXIsYT1yLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKSxpPVtdO2xldCBzLG8sYyxsLGgsdSxkO2ZvcihvPTA7bzx0O28rKylmb3IoaD1pW29dPW5ldyBVaW50OEFycmF5KGUpLHU9bzwxP2g6aVtvLTFdLGQ9bzwyP2g6aVtvLTJdLHM9ZFswXTw8MTN8ZFsxXTw8MTJ8ZFsyXTw8MTF8dVswXTw8N3x1WzFdPDw2fHVbMl08PDV8dVszXTw8NCxjPTA7YzxlO2MrKyloW2NdPWw9bi5yZWFkQml0KGEscykscz0oMzE3MzUmcyk8PDF8KGMrMzxlP2RbYyszXTw8MTE6MCl8KGMrNDxlP3VbYys0XTw8NDowKXxsO3JldHVybiBpfSh0LHIsbyk7Y29uc3QgYz0hIWksbD1wW25dLmNvbmNhdChzKTtsLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUueS10Lnl8fGUueC10Lnh9KSk7Y29uc3QgaD1sLmxlbmd0aCx1PW5ldyBJbnQ4QXJyYXkoaCksZD1uZXcgSW50OEFycmF5KGgpLGY9W107bGV0IGcsbSx5PTAsdz0wLHY9MCx4PTA7Zm9yKG09MDttPGg7bSsrKXVbbV09bFttXS54LGRbbV09bFttXS55LHc9TWF0aC5taW4odyxsW21dLngpLHY9TWF0aC5tYXgodixsW21dLngpLHg9TWF0aC5taW4oeCxsW21dLnkpLG08aC0xJiZsW21dLnk9PT1sW20rMV0ueSYmbFttXS54PT09bFttKzFdLngtMT95fD0xPDxoLTEtbTpmLnB1c2gobSk7Y29uc3QgUz1mLmxlbmd0aCxBPW5ldyBJbnQ4QXJyYXkoUyksaz1uZXcgSW50OEFycmF5KFMpLEM9bmV3IFVpbnQxNkFycmF5KFMpO2ZvcihnPTA7ZzxTO2crKyltPWZbZ10sQVtnXT1sW21dLngsa1tnXT1sW21dLnksQ1tnXT0xPDxoLTEtbTtjb25zdCBPPS13LEY9LXgsST10LXYsVD1iW25dO2xldCBNPW5ldyBVaW50OEFycmF5KHQpO2NvbnN0IEU9W10sUD1vLmRlY29kZXIsUj1vLmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKTtsZXQgRCxCLF8saixVLCQ9MCxYPTA7Zm9yKGxldCBlPTA7ZTxyO2UrKylpZihhJiYoJF49UC5yZWFkQml0KFIsVCksJCkpRS5wdXNoKE0pO2Vsc2UgZm9yKE09bmV3IFVpbnQ4QXJyYXkoTSksRS5wdXNoKE0pLEQ9MDtEPHQ7RCsrKXtpZihjJiZpW2VdW0RdKXtNW0RdPTA7Y29udGludWV9aWYoRD49TyYmRDxJJiZlPj1GKWZvcihYPVg8PDEmeSxtPTA7bTxTO20rKylCPWUra1ttXSxfPUQrQVttXSxqPUVbQl1bX10saiYmKGo9Q1ttXSxYfD1qKTtlbHNlIGZvcihYPTAsVT1oLTEsbT0wO208aDttKyssVS0tKV89RCt1W21dLF8+PTAmJl88dCYmKEI9ZStkW21dLEI+PTAmJihqPUVbQl1bX10saiYmKFh8PWo8PFUpKSk7Y29uc3Qgcj1QLnJlYWRCaXQoUixYKTtNW0RdPXJ9cmV0dXJuIEV9ZnVuY3Rpb24gdihlLHQscixuLGEsaSxzLGMsbCl7bGV0IGg9bVtyXS5jb2Rpbmc7MD09PXImJihoPWguY29uY2F0KFtjWzBdXSkpO2NvbnN0IHU9aC5sZW5ndGgsZD1uZXcgSW50MzJBcnJheSh1KSxmPW5ldyBJbnQzMkFycmF5KHUpO2xldCBnO2ZvcihnPTA7Zzx1O2crKylkW2ddPWhbZ10ueCxmW2ddPWhbZ10ueTtsZXQgcD1tW3JdLnJlZmVyZW5jZTswPT09ciYmKHA9cC5jb25jYXQoW2NbMV1dKSk7Y29uc3QgYj1wLmxlbmd0aCx3PW5ldyBJbnQzMkFycmF5KGIpLHY9bmV3IEludDMyQXJyYXkoYik7Zm9yKGc9MDtnPGI7ZysrKXdbZ109cFtnXS54LHZbZ109cFtnXS55O2NvbnN0IHg9blswXS5sZW5ndGgsUz1uLmxlbmd0aCxBPXlbcl0saz1bXSxDPWwuZGVjb2RlcixPPWwuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpO2xldCBGPTA7Zm9yKGxldCByPTA7cjx0O3IrKyl7aWYocyYmKEZePUMucmVhZEJpdChPLEEpLEYpKXRocm93IG5ldyBvKCJwcmVkaWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTtjb25zdCB0PW5ldyBVaW50OEFycmF5KGUpO2sucHVzaCh0KTtmb3IobGV0IHM9MDtzPGU7cysrKXtsZXQgbyxjLGw9MDtmb3IoZz0wO2c8dTtnKyspbz1yK2ZbZ10sYz1zK2RbZ10sbzwwfHxjPDB8fGM+PWU/bDw8PTE6bD1sPDwxfGtbb11bY107Zm9yKGc9MDtnPGI7ZysrKW89cit2W2ddLWksYz1zK3dbZ10tYSxvPDB8fG8+PVN8fGM8MHx8Yz49eD9sPDw9MTpsPWw8PDF8bltvXVtjXTtjb25zdCBoPUMucmVhZEJpdChPLGwpO3Rbc109aH19cmV0dXJuIGt9ZnVuY3Rpb24geChlLHQscixuLGEsaSxzLGMsbCxoLHUsZyxwLG0sYix5LHcseCxTKXtpZihlJiZ0KXRocm93IG5ldyBvKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7Y29uc3QgQT1bXTtsZXQgayxDO2ZvcihrPTA7azxuO2srKyl7aWYoQz1uZXcgVWludDhBcnJheShyKSxhKWZvcihsZXQgZT0wO2U8cjtlKyspQ1tlXT1hO0EucHVzaChDKX1jb25zdCBPPXcuZGVjb2RlcixGPXcuY29udGV4dENhY2hlO2xldCBJPWU/LW0udGFibGVEZWx0YVQuZGVjb2RlKFMpOi1kKEYsIklBRFQiLE8pLFQ9MDtmb3Ioaz0wO2s8aTspe0krPWU/bS50YWJsZURlbHRhVC5kZWNvZGUoUyk6ZChGLCJJQURUIixPKSxUKz1lP20udGFibGVGaXJzdFMuZGVjb2RlKFMpOmQoRiwiSUFGUyIsTyk7bGV0IG49VDtmb3IoOzspe2xldCBhPTA7cz4xJiYoYT1lP1MucmVhZEJpdHMoeCk6ZChGLCJJQUlUIixPKSk7Y29uc3QgaT1zKkkrYSxUPWU/bS5zeW1ib2xJRFRhYmxlLmRlY29kZShTKTpmKEYsTyxsKSxNPXQmJihlP1MucmVhZEJpdCgpOmQoRiwiSUFSSSIsTykpO2xldCBFPWNbVF0sUD1FWzBdLmxlbmd0aCxSPUUubGVuZ3RoO2lmKE0pe2NvbnN0IGU9ZChGLCJJQVJEVyIsTyksdD1kKEYsIklBUkRIIixPKTtQKz1lLFIrPXQsRT12KFAsUixiLEUsKGU+PjEpK2QoRiwiSUFSRFgiLE8pLCh0Pj4xKStkKEYsIklBUkRZIixPKSwhMSx5LHcpfWNvbnN0IE49aS0oMSZnPzA6Ui0xKSxEPW4tKDImZz9QLTE6MCk7bGV0IEIsTCxfO2lmKGgpe2ZvcihCPTA7QjxSO0IrKyl7aWYoQz1BW0QrQl0sIUMpY29udGludWU7Xz1FW0JdO2NvbnN0IGU9TWF0aC5taW4oci1OLFApO3N3aXRjaChwKXtjYXNlIDA6Zm9yKEw9MDtMPGU7TCsrKUNbTitMXXw9X1tMXTticmVhaztjYXNlIDI6Zm9yKEw9MDtMPGU7TCsrKUNbTitMXV49X1tMXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBvKCJvcGVyYXRvciAiLmNvbmNhdChwLCIgaXMgbm90IHN1cHBvcnRlZCIpKX19bis9Ui0xfWVsc2V7Zm9yKEw9MDtMPFI7TCsrKWlmKEM9QVtOK0xdLEMpc3dpdGNoKF89RVtMXSxwKXtjYXNlIDA6Zm9yKEI9MDtCPFA7QisrKUNbRCtCXXw9X1tCXTticmVhaztjYXNlIDI6Zm9yKEI9MDtCPFA7QisrKUNbRCtCXV49X1tCXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBvKCJvcGVyYXRvciAiLmNvbmNhdChwLCIgaXMgbm90IHN1cHBvcnRlZCIpKX1uKz1QLTF9aysrO2NvbnN0IGo9ZT9tLnRhYmxlRGVsdGFTLmRlY29kZShTKTpkKEYsIklBRFMiLE8pO2lmKG51bGw9PT1qKWJyZWFrO24rPWordX19cmV0dXJuIEF9ZnVuY3Rpb24gUyhlLHQpe2NvbnN0IHI9e307ci5udW1iZXI9KDAsYS5yZWFkVWludDMyKShlLHQpO2NvbnN0IG49ZVt0KzRdLGk9NjMmbjtpZighZ1tpXSl0aHJvdyBuZXcgbygiaW52YWxpZCBzZWdtZW50IHR5cGU6ICIraSk7ci50eXBlPWksci50eXBlTmFtZT1nW2ldLHIuZGVmZXJyZWROb25SZXRhaW49ISEoMTI4Jm4pO2NvbnN0IHM9ISEoNjQmbiksYz1lW3QrNV07bGV0IGw9Yz4+NSY3O2NvbnN0IGg9WzMxJmNdO2xldCB1PXQrNjtpZig3PT09Yyl7bD01MzY4NzA5MTEmKDAsYS5yZWFkVWludDMyKShlLHUtMSksdSs9MztsZXQgdD1sKzc+PjM7Zm9yKGhbMF09ZVt1KytdOy0tdD4wOyloLnB1c2goZVt1KytdKX1lbHNlIGlmKDU9PT1jfHw2PT09Yyl0aHJvdyBuZXcgbygiaW52YWxpZCByZWZlcnJlZC10byBmbGFncyIpO3IucmV0YWluQml0cz1oO2xldCBkPTQ7ci5udW1iZXI8PTI1Nj9kPTE6ci5udW1iZXI8PTY1NTM2JiYoZD0yKTtjb25zdCBmPVtdO2xldCBwLG07Zm9yKHA9MDtwPGw7cCsrKXtsZXQgdDt0PTE9PT1kP2VbdV06Mj09PWQ/KDAsYS5yZWFkVWludDE2KShlLHUpOigwLGEucmVhZFVpbnQzMikoZSx1KSxmLnB1c2godCksdSs9ZH1pZihyLnJlZmVycmVkVG89ZixzPyhyLnBhZ2VBc3NvY2lhdGlvbj0oMCxhLnJlYWRVaW50MzIpKGUsdSksdSs9NCk6ci5wYWdlQXNzb2NpYXRpb249ZVt1KytdLHIubGVuZ3RoPSgwLGEucmVhZFVpbnQzMikoZSx1KSx1Kz00LDQyOTQ5NjcyOTU9PT1yLmxlbmd0aCl7aWYoMzghPT1pKXRocm93IG5ldyBvKCJpbnZhbGlkIHVua25vd24gc2VnbWVudCBsZW5ndGgiKTt7Y29uc3QgdD1rKGUsdSksbj0hISgxJmVbdStDXSksYT02LGk9bmV3IFVpbnQ4QXJyYXkoYSk7Zm9yKG58fChpWzBdPTI1NSxpWzFdPTE3MiksaVsyXT10LmhlaWdodD4+PjI0JjI1NSxpWzNdPXQuaGVpZ2h0Pj4xNiYyNTUsaVs0XT10LmhlaWdodD4+OCYyNTUsaVs1XT0yNTUmdC5oZWlnaHQscD11LG09ZS5sZW5ndGg7cDxtO3ArKyl7bGV0IHQ9MDtmb3IoO3Q8YSYmaVt0XT09PWVbcCt0XTspdCsrO2lmKHQ9PT1hKXtyLmxlbmd0aD1wK2E7YnJlYWt9fWlmKDQyOTQ5NjcyOTU9PT1yLmxlbmd0aCl0aHJvdyBuZXcgbygic2VnbWVudCBlbmQgd2FzIG5vdCBmb3VuZCIpfX1yZXR1cm4gci5oZWFkZXJFbmQ9dSxyfWZ1bmN0aW9uIEEoZSx0LHIsbil7Y29uc3QgYT1bXTtsZXQgaT1yO2Zvcig7aTxuOyl7Y29uc3Qgcj1TKHQsaSk7aT1yLmhlYWRlckVuZDtjb25zdCBuPXtoZWFkZXI6cixkYXRhOnR9O2lmKGUucmFuZG9tQWNjZXNzfHwobi5zdGFydD1pLGkrPXIubGVuZ3RoLG4uZW5kPWkpLGEucHVzaChuKSw1MT09PXIudHlwZSlicmVha31pZihlLnJhbmRvbUFjY2Vzcylmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKyspYVtlXS5zdGFydD1pLGkrPWFbZV0uaGVhZGVyLmxlbmd0aCxhW2VdLmVuZD1pO3JldHVybiBhfWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm57d2lkdGg6KDAsYS5yZWFkVWludDMyKShlLHQpLGhlaWdodDooMCxhLnJlYWRVaW50MzIpKGUsdCs0KSx4OigwLGEucmVhZFVpbnQzMikoZSx0KzgpLHk6KDAsYS5yZWFkVWludDMyKShlLHQrMTIpLGNvbWJpbmF0aW9uT3BlcmF0b3I6NyZlW3QrMTZdfX1jb25zdCBDPTE3O2Z1bmN0aW9uIE8oZSx0KXtjb25zdCByPWUuaGVhZGVyLG49ZS5kYXRhLGk9ZS5lbmQ7bGV0IHMsYyxsLGgsdT1lLnN0YXJ0O3N3aXRjaChyLnR5cGUpe2Nhc2UgMDpjb25zdCBlPXt9LHQ9KDAsYS5yZWFkVWludDE2KShuLHUpO2lmKGUuaHVmZm1hbj0hISgxJnQpLGUucmVmaW5lbWVudD0hISgyJnQpLGUuaHVmZm1hbkRIU2VsZWN0b3I9dD4+MiYzLGUuaHVmZm1hbkRXU2VsZWN0b3I9dD4+NCYzLGUuYml0bWFwU2l6ZVNlbGVjdG9yPXQ+PjYmMSxlLmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3I9dD4+NyYxLGUuYml0bWFwQ29kaW5nQ29udGV4dFVzZWQ9ISEoMjU2JnQpLGUuYml0bWFwQ29kaW5nQ29udGV4dFJldGFpbmVkPSEhKDUxMiZ0KSxlLnRlbXBsYXRlPXQ+PjEwJjMsZS5yZWZpbmVtZW50VGVtcGxhdGU9dD4+MTImMSx1Kz0yLCFlLmh1ZmZtYW4pe2ZvcihoPTA9PT1lLnRlbXBsYXRlPzQ6MSxjPVtdLGw9MDtsPGg7bCsrKWMucHVzaCh7eDooMCxhLnJlYWRJbnQ4KShuLHUpLHk6KDAsYS5yZWFkSW50OCkobix1KzEpfSksdSs9MjtlLmF0PWN9aWYoZS5yZWZpbmVtZW50JiYhZS5yZWZpbmVtZW50VGVtcGxhdGUpe2ZvcihjPVtdLGw9MDtsPDI7bCsrKWMucHVzaCh7eDooMCxhLnJlYWRJbnQ4KShuLHUpLHk6KDAsYS5yZWFkSW50OCkobix1KzEpfSksdSs9MjtlLnJlZmluZW1lbnRBdD1jfWUubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHM9KDAsYS5yZWFkVWludDMyKShuLHUpLHUrPTQsZS5udW1iZXJPZk5ld1N5bWJvbHM9KDAsYS5yZWFkVWludDMyKShuLHUpLHUrPTQscz1bZSxyLm51bWJlcixyLnJlZmVycmVkVG8sbix1LGldO2JyZWFrO2Nhc2UgNjpjYXNlIDc6Y29uc3QgZD17fTtkLmluZm89ayhuLHUpLHUrPUM7Y29uc3QgZj0oMCxhLnJlYWRVaW50MTYpKG4sdSk7aWYodSs9MixkLmh1ZmZtYW49ISEoMSZmKSxkLnJlZmluZW1lbnQ9ISEoMiZmKSxkLmxvZ1N0cmlwU2l6ZT1mPj4yJjMsZC5zdHJpcFNpemU9MTw8ZC5sb2dTdHJpcFNpemUsZC5yZWZlcmVuY2VDb3JuZXI9Zj4+NCYzLGQudHJhbnNwb3NlZD0hISg2NCZmKSxkLmNvbWJpbmF0aW9uT3BlcmF0b3I9Zj4+NyYzLGQuZGVmYXVsdFBpeGVsVmFsdWU9Zj4+OSYxLGQuZHNPZmZzZXQ9Zjw8MTc+PjI3LGQucmVmaW5lbWVudFRlbXBsYXRlPWY+PjE1JjEsZC5odWZmbWFuKXtjb25zdCBlPSgwLGEucmVhZFVpbnQxNikobix1KTt1Kz0yLGQuaHVmZm1hbkZTPTMmZSxkLmh1ZmZtYW5EUz1lPj4yJjMsZC5odWZmbWFuRFQ9ZT4+NCYzLGQuaHVmZm1hblJlZmluZW1lbnREVz1lPj42JjMsZC5odWZmbWFuUmVmaW5lbWVudERIPWU+PjgmMyxkLmh1ZmZtYW5SZWZpbmVtZW50RFg9ZT4+MTAmMyxkLmh1ZmZtYW5SZWZpbmVtZW50RFk9ZT4+MTImMyxkLmh1ZmZtYW5SZWZpbmVtZW50U2l6ZVNlbGVjdG9yPSEhKDE2Mzg0JmUpfWlmKGQucmVmaW5lbWVudCYmIWQucmVmaW5lbWVudFRlbXBsYXRlKXtmb3IoYz1bXSxsPTA7bDwyO2wrKyljLnB1c2goe3g6KDAsYS5yZWFkSW50OCkobix1KSx5OigwLGEucmVhZEludDgpKG4sdSsxKX0pLHUrPTI7ZC5yZWZpbmVtZW50QXQ9Y31kLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzPSgwLGEucmVhZFVpbnQzMikobix1KSx1Kz00LHM9W2Qsci5yZWZlcnJlZFRvLG4sdSxpXTticmVhaztjYXNlIDE2OmNvbnN0IGc9e30scD1uW3UrK107Zy5tbXI9ISEoMSZwKSxnLnRlbXBsYXRlPXA+PjEmMyxnLnBhdHRlcm5XaWR0aD1uW3UrK10sZy5wYXR0ZXJuSGVpZ2h0PW5bdSsrXSxnLm1heFBhdHRlcm5JbmRleD0oMCxhLnJlYWRVaW50MzIpKG4sdSksdSs9NCxzPVtnLHIubnVtYmVyLG4sdSxpXTticmVhaztjYXNlIDIyOmNhc2UgMjM6Y29uc3QgbT17fTttLmluZm89ayhuLHUpLHUrPUM7Y29uc3QgYj1uW3UrK107bS5tbXI9ISEoMSZiKSxtLnRlbXBsYXRlPWI+PjEmMyxtLmVuYWJsZVNraXA9ISEoOCZiKSxtLmNvbWJpbmF0aW9uT3BlcmF0b3I9Yj4+NCY3LG0uZGVmYXVsdFBpeGVsVmFsdWU9Yj4+NyYxLG0uZ3JpZFdpZHRoPSgwLGEucmVhZFVpbnQzMikobix1KSx1Kz00LG0uZ3JpZEhlaWdodD0oMCxhLnJlYWRVaW50MzIpKG4sdSksdSs9NCxtLmdyaWRPZmZzZXRYPTQyOTQ5NjcyOTUmKDAsYS5yZWFkVWludDMyKShuLHUpLHUrPTQsbS5ncmlkT2Zmc2V0WT00Mjk0OTY3Mjk1JigwLGEucmVhZFVpbnQzMikobix1KSx1Kz00LG0uZ3JpZFZlY3Rvclg9KDAsYS5yZWFkVWludDE2KShuLHUpLHUrPTIsbS5ncmlkVmVjdG9yWT0oMCxhLnJlYWRVaW50MTYpKG4sdSksdSs9MixzPVttLHIucmVmZXJyZWRUbyxuLHUsaV07YnJlYWs7Y2FzZSAzODpjYXNlIDM5OmNvbnN0IHk9e307eS5pbmZvPWsobix1KSx1Kz1DO2NvbnN0IHc9blt1KytdO2lmKHkubW1yPSEhKDEmdykseS50ZW1wbGF0ZT13Pj4xJjMseS5wcmVkaWN0aW9uPSEhKDgmdyksIXkubW1yKXtmb3IoaD0wPT09eS50ZW1wbGF0ZT80OjEsYz1bXSxsPTA7bDxoO2wrKyljLnB1c2goe3g6KDAsYS5yZWFkSW50OCkobix1KSx5OigwLGEucmVhZEludDgpKG4sdSsxKX0pLHUrPTI7eS5hdD1jfXM9W3ksbix1LGldO2JyZWFrO2Nhc2UgNDg6Y29uc3Qgdj17d2lkdGg6KDAsYS5yZWFkVWludDMyKShuLHUpLGhlaWdodDooMCxhLnJlYWRVaW50MzIpKG4sdSs0KSxyZXNvbHV0aW9uWDooMCxhLnJlYWRVaW50MzIpKG4sdSs4KSxyZXNvbHV0aW9uWTooMCxhLnJlYWRVaW50MzIpKG4sdSsxMil9OzQyOTQ5NjcyOTU9PT12LmhlaWdodCYmZGVsZXRlIHYuaGVpZ2h0O2NvbnN0IHg9blt1KzE2XTsoMCxhLnJlYWRVaW50MTYpKG4sdSsxNyksdi5sb3NzbGVzcz0hISgxJngpLHYucmVmaW5lbWVudD0hISgyJngpLHYuZGVmYXVsdFBpeGVsVmFsdWU9eD4+MiYxLHYuY29tYmluYXRpb25PcGVyYXRvcj14Pj4zJjMsdi5yZXF1aXJlc0J1ZmZlcj0hISgzMiZ4KSx2LmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZT0hISg2NCZ4KSxzPVt2XTticmVhaztjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDYyOmJyZWFrO2Nhc2UgNTM6cz1bci5udW1iZXIsbix1LGldO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG8oInNlZ21lbnQgdHlwZSAiLmNvbmNhdChyLnR5cGVOYW1lLCIoIikuY29uY2F0KHIudHlwZSwiKSBpcyBub3QgaW1wbGVtZW50ZWQiKSl9Y29uc3QgZD0ib24iK3IudHlwZU5hbWU7ZCBpbiB0JiZ0W2RdLmFwcGx5KHQscyl9ZnVuY3Rpb24gRihlLHQpe2ZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKylPKGVbcl0sdCl9Y2xhc3MgSXtvblBhZ2VJbmZvcm1hdGlvbihlKXt0aGlzLmN1cnJlbnRQYWdlSW5mbz1lO2NvbnN0IHQ9ZS53aWR0aCs3Pj4zLHI9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQqZS5oZWlnaHQpO2UuZGVmYXVsdFBpeGVsVmFsdWUmJnIuZmlsbCgyNTUpLHRoaXMuYnVmZmVyPXJ9ZHJhd0JpdG1hcChlLHQpe2NvbnN0IHI9dGhpcy5jdXJyZW50UGFnZUluZm8sbj1lLndpZHRoLGE9ZS5oZWlnaHQsaT1yLndpZHRoKzc+PjMscz1yLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZT9lLmNvbWJpbmF0aW9uT3BlcmF0b3I6ci5jb21iaW5hdGlvbk9wZXJhdG9yLGM9dGhpcy5idWZmZXIsbD0xMjg+Pig3JmUueCk7bGV0IGgsdSxkLGYsZz1lLnkqaSsoZS54Pj4zKTtzd2l0Y2gocyl7Y2FzZSAwOmZvcihoPTA7aDxhO2grKyl7Zm9yKGQ9bCxmPWcsdT0wO3U8bjt1KyspdFtoXVt1XSYmKGNbZl18PWQpLGQ+Pj0xLGR8fChkPTEyOCxmKyspO2crPWl9YnJlYWs7Y2FzZSAyOmZvcihoPTA7aDxhO2grKyl7Zm9yKGQ9bCxmPWcsdT0wO3U8bjt1KyspdFtoXVt1XSYmKGNbZl1ePWQpLGQ+Pj0xLGR8fChkPTEyOCxmKyspO2crPWl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygib3BlcmF0b3IgIi5jb25jYXQocywiIGlzIG5vdCBzdXBwb3J0ZWQiKSl9fW9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbihlLHQscixuKXtjb25zdCBhPWUuaW5mbyxpPW5ldyBsKHQscixuKSxzPXcoZS5tbXIsYS53aWR0aCxhLmhlaWdodCxlLnRlbXBsYXRlLGUucHJlZGljdGlvbixudWxsLGUuYXQsaSk7dGhpcy5kcmF3Qml0bWFwKGEscyl9b25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiguLi5hcmd1bWVudHMpfW9uU3ltYm9sRGljdGlvbmFyeShlLHQscixuLGkscyl7bGV0IGMsaDtlLmh1ZmZtYW4mJihjPWZ1bmN0aW9uKGUsdCxyKXtsZXQgbixhLGkscyxjPTA7c3dpdGNoKGUuaHVmZm1hbkRIU2VsZWN0b3Ipe2Nhc2UgMDpjYXNlIDE6bj1SKGUuaHVmZm1hbkRIU2VsZWN0b3IrNCk7YnJlYWs7Y2FzZSAzOm49RChjLHQsciksYysrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG8oImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpfXN3aXRjaChlLmh1ZmZtYW5EV1NlbGVjdG9yKXtjYXNlIDA6Y2FzZSAxOmE9UihlLmh1ZmZtYW5EV1NlbGVjdG9yKzIpO2JyZWFrO2Nhc2UgMzphPUQoYyx0LHIpLGMrKzticmVhaztkZWZhdWx0OnRocm93IG5ldyBvKCJpbnZhbGlkIEh1ZmZtYW4gRFcgc2VsZWN0b3IiKX1yZXR1cm4gZS5iaXRtYXBTaXplU2VsZWN0b3I/KGk9RChjLHQsciksYysrKTppPVIoMSkscz1lLmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3I/RChjLHQscik6UigxKSx7dGFibGVEZWx0YUhlaWdodDpuLHRhYmxlRGVsdGFXaWR0aDphLHRhYmxlQml0bWFwU2l6ZTppLHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzOnN9fShlLHIsdGhpcy5jdXN0b21UYWJsZXMpLGg9bmV3IE4obixpLHMpKTtsZXQgdT10aGlzLnN5bWJvbHM7dXx8KHRoaXMuc3ltYm9scz11PXt9KTtjb25zdCBnPVtdO2Zvcihjb25zdCBlIG9mIHIpe2NvbnN0IHQ9dVtlXTt0JiZnLnB1c2goLi4udCl9Y29uc3QgcD1uZXcgbChuLGkscyk7dVt0XT1mdW5jdGlvbihlLHQscixuLGkscyxjLGwsaCx1LGcscCl7aWYoZSYmdCl0aHJvdyBuZXcgbygic3ltYm9sIHJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTtjb25zdCBtPVtdO2xldCBiPTAseT0oMCxhLmxvZzIpKHIubGVuZ3RoK24pO2NvbnN0IFM9Zy5kZWNvZGVyLEE9Zy5jb250ZXh0Q2FjaGU7bGV0IGssQztmb3IoZSYmKGs9UigxKSxDPVtdLHk9TWF0aC5tYXgoeSwxKSk7bS5sZW5ndGg8bjspe2IrPWU/cy50YWJsZURlbHRhSGVpZ2h0LmRlY29kZShwKTpkKEEsIklBREgiLFMpO2xldCBuPTAsYT0wO2NvbnN0IGk9ZT9DLmxlbmd0aDowO2Zvcig7Oyl7Y29uc3QgaT1lP3MudGFibGVEZWx0YVdpZHRoLmRlY29kZShwKTpkKEEsIklBRFciLFMpO2lmKG51bGw9PT1pKWJyZWFrO2xldCBvO2lmKG4rPWksYSs9bix0KXtjb25zdCBhPWQoQSwiSUFBSSIsUyk7aWYoYT4xKW89eChlLHQsbixiLDAsYSwxLHIuY29uY2F0KG0pLHksMCwwLDEsMCxzLGgsdSxnLDAscCk7ZWxzZXtjb25zdCBlPWYoQSxTLHkpLHQ9ZChBLCJJQVJEWCIsUyksYT1kKEEsIklBUkRZIixTKTtvPXYobixiLGgsZTxyLmxlbmd0aD9yW2VdOm1bZS1yLmxlbmd0aF0sdCxhLCExLHUsZyl9bS5wdXNoKG8pfWVsc2UgZT9DLnB1c2gobik6KG89dyghMSxuLGIsYywhMSxudWxsLGwsZyksbS5wdXNoKG8pKX1pZihlJiYhdCl7Y29uc3QgZT1zLnRhYmxlQml0bWFwU2l6ZS5kZWNvZGUocCk7bGV0IHQ7aWYocC5ieXRlQWxpZ24oKSwwPT09ZSl0PUIocCxhLGIpO2Vsc2V7Y29uc3Qgcj1wLmVuZCxuPXAucG9zaXRpb24rZTtwLmVuZD1uLHQ9TChwLGEsYiwhMSkscC5lbmQ9cixwLnBvc2l0aW9uPW59Y29uc3Qgcj1DLmxlbmd0aDtpZihpPT09ci0xKW0ucHVzaCh0KTtlbHNle2xldCBlLG4sYSxzLG8sYz0wO2ZvcihlPWk7ZTxyO2UrKyl7Zm9yKHM9Q1tlXSxhPWMrcyxvPVtdLG49MDtuPGI7bisrKW8ucHVzaCh0W25dLnN1YmFycmF5KGMsYSkpO20ucHVzaChvKSxjPWF9fX19Y29uc3QgTz1bXSxGPVtdO2xldCBJLFQsTT0hMTtjb25zdCBFPXIubGVuZ3RoK247Zm9yKDtGLmxlbmd0aDxFOyl7bGV0IHQ9ZT9rLmRlY29kZShwKTpkKEEsIklBRVgiLFMpO2Zvcig7dC0tOylGLnB1c2goTSk7TT0hTX1mb3IoST0wLFQ9ci5sZW5ndGg7STxUO0krKylGW0ldJiZPLnB1c2gocltJXSk7Zm9yKGxldCBlPTA7ZTxuO0krKyxlKyspRltJXSYmTy5wdXNoKG1bZV0pO3JldHVybiBPfShlLmh1ZmZtYW4sZS5yZWZpbmVtZW50LGcsZS5udW1iZXJPZk5ld1N5bWJvbHMsZS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scyxjLGUudGVtcGxhdGUsZS5hdCxlLnJlZmluZW1lbnRUZW1wbGF0ZSxlLnJlZmluZW1lbnRBdCxwLGgpfW9uSW1tZWRpYXRlVGV4dFJlZ2lvbihlLHQscixuLGkpe2NvbnN0IHM9ZS5pbmZvO2xldCBjLGg7Y29uc3QgdT10aGlzLnN5bWJvbHMsZD1bXTtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PXVbZV07dCYmZC5wdXNoKC4uLnQpfWNvbnN0IGY9KDAsYS5sb2cyKShkLmxlbmd0aCk7ZS5odWZmbWFuJiYoaD1uZXcgTihyLG4saSksYz1mdW5jdGlvbihlLHQscixuLGEpe2NvbnN0IGk9W107Zm9yKGxldCBlPTA7ZTw9MzQ7ZSsrKXtjb25zdCB0PWEucmVhZEJpdHMoNCk7aS5wdXNoKG5ldyBUKFtlLHQsMCwwXSkpfWNvbnN0IHM9bmV3IEUoaSwhMSk7aS5sZW5ndGg9MDtmb3IobGV0IGU9MDtlPG47KXtjb25zdCB0PXMuZGVjb2RlKGEpO2lmKHQ+PTMyKXtsZXQgcixuLHM7c3dpdGNoKHQpe2Nhc2UgMzI6aWYoMD09PWUpdGhyb3cgbmV3IG8oIm5vIHByZXZpb3VzIHZhbHVlIGluIHN5bWJvbCBJRCB0YWJsZSIpO249YS5yZWFkQml0cygyKSszLHI9aVtlLTFdLnByZWZpeExlbmd0aDticmVhaztjYXNlIDMzOm49YS5yZWFkQml0cygzKSszLHI9MDticmVhaztjYXNlIDM0Om49YS5yZWFkQml0cyg3KSsxMSxyPTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygiaW52YWxpZCBjb2RlIGxlbmd0aCBpbiBzeW1ib2wgSUQgdGFibGUiKX1mb3Iocz0wO3M8bjtzKyspaS5wdXNoKG5ldyBUKFtlLHIsMCwwXSkpLGUrK31lbHNlIGkucHVzaChuZXcgVChbZSx0LDAsMF0pKSxlKyt9YS5ieXRlQWxpZ24oKTtjb25zdCBjPW5ldyBFKGksITEpO2xldCBsLGgsdSxkPTA7c3dpdGNoKGUuaHVmZm1hbkZTKXtjYXNlIDA6Y2FzZSAxOmw9UihlLmh1ZmZtYW5GUys2KTticmVhaztjYXNlIDM6bD1EKGQsdCxyKSxkKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIil9c3dpdGNoKGUuaHVmZm1hbkRTKXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpoPVIoZS5odWZmbWFuRFMrOCk7YnJlYWs7Y2FzZSAzOmg9RChkLHQsciksZCsrO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG8oImludmFsaWQgSHVmZm1hbiBEUyBzZWxlY3RvciIpfXN3aXRjaChlLmh1ZmZtYW5EVCl7Y2FzZSAwOmNhc2UgMTpjYXNlIDI6dT1SKGUuaHVmZm1hbkRUKzExKTticmVhaztjYXNlIDM6dT1EKGQsdCxyKSxkKys7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygiaW52YWxpZCBIdWZmbWFuIERUIHNlbGVjdG9yIil9aWYoZS5yZWZpbmVtZW50KXRocm93IG5ldyBvKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7cmV0dXJue3N5bWJvbElEVGFibGU6Yyx0YWJsZUZpcnN0UzpsLHRhYmxlRGVsdGFTOmgsdGFibGVEZWx0YVQ6dX19KGUsdCx0aGlzLmN1c3RvbVRhYmxlcyxkLmxlbmd0aCxoKSk7Y29uc3QgZz1uZXcgbChyLG4saSkscD14KGUuaHVmZm1hbixlLnJlZmluZW1lbnQscy53aWR0aCxzLmhlaWdodCxlLmRlZmF1bHRQaXhlbFZhbHVlLGUubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMsZS5zdHJpcFNpemUsZCxmLGUudHJhbnNwb3NlZCxlLmRzT2Zmc2V0LGUucmVmZXJlbmNlQ29ybmVyLGUuY29tYmluYXRpb25PcGVyYXRvcixjLGUucmVmaW5lbWVudFRlbXBsYXRlLGUucmVmaW5lbWVudEF0LGcsZS5sb2dTdHJpcFNpemUsaCk7dGhpcy5kcmF3Qml0bWFwKHMscCl9b25JbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24oKXt0aGlzLm9uSW1tZWRpYXRlVGV4dFJlZ2lvbiguLi5hcmd1bWVudHMpfW9uUGF0dGVybkRpY3Rpb25hcnkoZSx0LHIsbixhKXtsZXQgaT10aGlzLnBhdHRlcm5zO2l8fCh0aGlzLnBhdHRlcm5zPWk9e30pO2NvbnN0IHM9bmV3IGwocixuLGEpO2lbdF09ZnVuY3Rpb24oZSx0LHIsbixhLGkpe2NvbnN0IHM9W107ZXx8KHMucHVzaCh7eDotdCx5OjB9KSwwPT09YSYmcy5wdXNoKHt4Oi0zLHk6LTF9LHt4OjIseTotMn0se3g6LTIseTotMn0pKTtjb25zdCBvPXcoZSwobisxKSp0LHIsYSwhMSxudWxsLHMsaSksYz1bXTtmb3IobGV0IGU9MDtlPD1uO2UrKyl7Y29uc3Qgbj1bXSxhPXQqZSxpPWErdDtmb3IobGV0IGU9MDtlPHI7ZSsrKW4ucHVzaChvW2VdLnN1YmFycmF5KGEsaSkpO2MucHVzaChuKX1yZXR1cm4gY30oZS5tbXIsZS5wYXR0ZXJuV2lkdGgsZS5wYXR0ZXJuSGVpZ2h0LGUubWF4UGF0dGVybkluZGV4LGUudGVtcGxhdGUscyl9b25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbihlLHQscixuLGkpe2NvbnN0IHM9dGhpcy5wYXR0ZXJuc1t0WzBdXSxjPWUuaW5mbyxoPW5ldyBsKHIsbixpKSx1PWZ1bmN0aW9uKGUsdCxyLG4saSxzLGMsbCxoLHUsZCxmLGcscCxtKXtpZihjKXRocm93IG5ldyBvKCJza2lwIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZigwIT09bCl0aHJvdyBuZXcgbygnb3BlcmF0b3IgIicuY29uY2F0KGwsJyIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb24nKSk7Y29uc3QgYj1bXTtsZXQgeSx2LHg7Zm9yKHk9MDt5PGk7eSsrKXtpZih4PW5ldyBVaW50OEFycmF5KG4pLHMpZm9yKHY9MDt2PG47disrKXhbdl09cztiLnB1c2goeCl9Y29uc3QgUz10Lmxlbmd0aCxBPXRbMF0saz1BWzBdLmxlbmd0aCxDPUEubGVuZ3RoLE89KDAsYS5sb2cyKShTKSxGPVtdO2V8fChGLnB1c2goe3g6cjw9MT8zOjIseTotMX0pLDA9PT1yJiZGLnB1c2goe3g6LTMseTotMX0se3g6Mix5Oi0yfSx7eDotMix5Oi0yfSkpO2NvbnN0IEk9W107bGV0IFQsTSxFLFAsUixELEIsXyxqLFUsJDtmb3IoZSYmKFQ9bmV3IE4obS5kYXRhLG0uc3RhcnQsbS5lbmQpKSx5PU8tMTt5Pj0wO3ktLSlNPWU/TChULGgsdSwhMCk6dyghMSxoLHUsciwhMSxudWxsLEYsbSksSVt5XT1NO2ZvcihFPTA7RTx1O0UrKylmb3IoUD0wO1A8aDtQKyspe2ZvcihSPTAsRD0wLHY9Ty0xO3Y+PTA7di0tKVJePUlbdl1bRV1bUF0sRHw9Ujw8djtpZihCPXRbRF0sXz1kK0UqcCtQKmc+Pjgsaj1mK0UqZy1QKnA+PjgsXz49MCYmXytrPD1uJiZqPj0wJiZqK0M8PWkpZm9yKHk9MDt5PEM7eSsrKWZvcigkPWJbait5XSxVPUJbeV0sdj0wO3Y8azt2KyspJFtfK3ZdfD1VW3ZdO2Vsc2V7bGV0IGUsdDtmb3IoeT0wO3k8Qzt5KyspaWYodD1qK3ksISh0PDB8fHQ+PWkpKWZvcigkPWJbdF0sVT1CW3ldLHY9MDt2PGs7disrKWU9Xyt2LGU+PTAmJmU8biYmKCRbZV18PVVbdl0pfX1yZXR1cm4gYn0oZS5tbXIscyxlLnRlbXBsYXRlLGMud2lkdGgsYy5oZWlnaHQsZS5kZWZhdWx0UGl4ZWxWYWx1ZSxlLmVuYWJsZVNraXAsZS5jb21iaW5hdGlvbk9wZXJhdG9yLGUuZ3JpZFdpZHRoLGUuZ3JpZEhlaWdodCxlLmdyaWRPZmZzZXRYLGUuZ3JpZE9mZnNldFksZS5ncmlkVmVjdG9yWCxlLmdyaWRWZWN0b3JZLGgpO3RoaXMuZHJhd0JpdG1hcChjLHUpfW9uSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbigpe3RoaXMub25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiguLi5hcmd1bWVudHMpfW9uVGFibGVzKGUsdCxyLG4pe2xldCBpPXRoaXMuY3VzdG9tVGFibGVzO2l8fCh0aGlzLmN1c3RvbVRhYmxlcz1pPXt9KSxpW2VdPWZ1bmN0aW9uKGUsdCxyKXtjb25zdCBuPWVbdF0saT00Mjk0OTY3Mjk1JigwLGEucmVhZFVpbnQzMikoZSx0KzEpLHM9NDI5NDk2NzI5NSYoMCxhLnJlYWRVaW50MzIpKGUsdCs1KSxvPW5ldyBOKGUsdCs5LHIpLGM9MSsobj4+MSY3KSxsPTErKG4+PjQmNyksaD1bXTtsZXQgdSxkLGY9aTtkb3t1PW8ucmVhZEJpdHMoYyksZD1vLnJlYWRCaXRzKGwpLGgucHVzaChuZXcgVChbZix1LGQsMF0pKSxmKz0xPDxkfXdoaWxlKGY8cyk7cmV0dXJuIHU9by5yZWFkQml0cyhjKSxoLnB1c2gobmV3IFQoW2ktMSx1LDMyLDAsImxvd2VyIl0pKSx1PW8ucmVhZEJpdHMoYyksaC5wdXNoKG5ldyBUKFtzLHUsMzIsMF0pKSwxJm4mJih1PW8ucmVhZEJpdHMoYyksaC5wdXNoKG5ldyBUKFt1LDBdKSkpLG5ldyBFKGgsITEpfSh0LHIsbil9fWNsYXNzIFR7Y29uc3RydWN0b3IoZSl7Mj09PWUubGVuZ3RoPyh0aGlzLmlzT09CPSEwLHRoaXMucmFuZ2VMb3c9MCx0aGlzLnByZWZpeExlbmd0aD1lWzBdLHRoaXMucmFuZ2VMZW5ndGg9MCx0aGlzLnByZWZpeENvZGU9ZVsxXSx0aGlzLmlzTG93ZXJSYW5nZT0hMSk6KHRoaXMuaXNPT0I9ITEsdGhpcy5yYW5nZUxvdz1lWzBdLHRoaXMucHJlZml4TGVuZ3RoPWVbMV0sdGhpcy5yYW5nZUxlbmd0aD1lWzJdLHRoaXMucHJlZml4Q29kZT1lWzNdLHRoaXMuaXNMb3dlclJhbmdlPSJsb3dlciI9PT1lWzRdKX19Y2xhc3MgTXtjb25zdHJ1Y3RvcihlKXt0aGlzLmNoaWxkcmVuPVtdLGU/KHRoaXMuaXNMZWFmPSEwLHRoaXMucmFuZ2VMZW5ndGg9ZS5yYW5nZUxlbmd0aCx0aGlzLnJhbmdlTG93PWUucmFuZ2VMb3csdGhpcy5pc0xvd2VyUmFuZ2U9ZS5pc0xvd2VyUmFuZ2UsdGhpcy5pc09PQj1lLmlzT09CKTp0aGlzLmlzTGVhZj0hMX1idWlsZFRyZWUoZSx0KXtjb25zdCByPWUucHJlZml4Q29kZT4+dCYxO2lmKHQ8PTApdGhpcy5jaGlsZHJlbltyXT1uZXcgTShlKTtlbHNle2xldCBuPXRoaXMuY2hpbGRyZW5bcl07bnx8KHRoaXMuY2hpbGRyZW5bcl09bj1uZXcgTShudWxsKSksbi5idWlsZFRyZWUoZSx0LTEpfX1kZWNvZGVOb2RlKGUpe2lmKHRoaXMuaXNMZWFmKXtpZih0aGlzLmlzT09CKXJldHVybiBudWxsO2NvbnN0IHQ9ZS5yZWFkQml0cyh0aGlzLnJhbmdlTGVuZ3RoKTtyZXR1cm4gdGhpcy5yYW5nZUxvdysodGhpcy5pc0xvd2VyUmFuZ2U/LXQ6dCl9Y29uc3QgdD10aGlzLmNoaWxkcmVuW2UucmVhZEJpdCgpXTtpZighdCl0aHJvdyBuZXcgbygiaW52YWxpZCBIdWZmbWFuIGRhdGEiKTtyZXR1cm4gdC5kZWNvZGVOb2RlKGUpfX1jbGFzcyBFe2NvbnN0cnVjdG9yKGUsdCl7dHx8dGhpcy5hc3NpZ25QcmVmaXhDb2RlcyhlKSx0aGlzLnJvb3ROb2RlPW5ldyBNKG51bGwpO2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyl7Y29uc3Qgcj1lW3RdO3IucHJlZml4TGVuZ3RoPjAmJnRoaXMucm9vdE5vZGUuYnVpbGRUcmVlKHIsci5wcmVmaXhMZW5ndGgtMSl9fWRlY29kZShlKXtyZXR1cm4gdGhpcy5yb290Tm9kZS5kZWNvZGVOb2RlKGUpfWFzc2lnblByZWZpeENvZGVzKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IHI9MDtmb3IobGV0IG49MDtuPHQ7bisrKXI9TWF0aC5tYXgocixlW25dLnByZWZpeExlbmd0aCk7Y29uc3Qgbj1uZXcgVWludDMyQXJyYXkocisxKTtmb3IobGV0IHI9MDtyPHQ7cisrKW5bZVtyXS5wcmVmaXhMZW5ndGhdKys7bGV0IGEsaSxzLG89MSxjPTA7Zm9yKG5bMF09MDtvPD1yOyl7Zm9yKGM9YytuW28tMV08PDEsYT1jLGk9MDtpPHQ7KXM9ZVtpXSxzLnByZWZpeExlbmd0aD09PW8mJihzLnByZWZpeENvZGU9YSxhKyspLGkrKztvKyt9fX1jb25zdCBQPXt9O2Z1bmN0aW9uIFIoZSl7bGV0IHQscj1QW2VdO2lmKHIpcmV0dXJuIHI7c3dpdGNoKGUpe2Nhc2UgMTp0PVtbMCwxLDQsMF0sWzE2LDIsOCwyXSxbMjcyLDMsMTYsNl0sWzY1ODA4LDMsMzIsN11dO2JyZWFrO2Nhc2UgMjp0PVtbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFs3NSw2LDMyLDYyXSxbNiw2M11dO2JyZWFrO2Nhc2UgMzp0PVtbLTI1Niw4LDgsMjU0XSxbMCwxLDAsMF0sWzEsMiwwLDJdLFsyLDMsMCw2XSxbMyw0LDMsMTRdLFsxMSw1LDYsMzBdLFstMjU3LDgsMzIsMjU1LCJsb3dlciJdLFs3NSw3LDMyLDEyNl0sWzYsNjJdXTticmVhaztjYXNlIDQ6dD1bWzEsMSwwLDBdLFsyLDIsMCwyXSxbMywzLDAsNl0sWzQsNCwzLDE0XSxbMTIsNSw2LDMwXSxbNzYsNSwzMiwzMV1dO2JyZWFrO2Nhc2UgNTp0PVtbLTI1NSw3LDgsMTI2XSxbMSwxLDAsMF0sWzIsMiwwLDJdLFszLDMsMCw2XSxbNCw0LDMsMTRdLFsxMiw1LDYsMzBdLFstMjU2LDcsMzIsMTI3LCJsb3dlciJdLFs3Niw2LDMyLDYyXV07YnJlYWs7Y2FzZSA2OnQ9W1stMjA0OCw1LDEwLDI4XSxbLTEwMjQsNCw5LDhdLFstNTEyLDQsOCw5XSxbLTI1Niw0LDcsMTBdLFstMTI4LDUsNiwyOV0sWy02NCw1LDUsMzBdLFstMzIsNCw1LDExXSxbMCwyLDcsMF0sWzEyOCwzLDcsMl0sWzI1NiwzLDgsM10sWzUxMiw0LDksMTJdLFsxMDI0LDQsMTAsMTNdLFstMjA0OSw2LDMyLDYyLCJsb3dlciJdLFsyMDQ4LDYsMzIsNjNdXTticmVhaztjYXNlIDc6dD1bWy0xMDI0LDQsOSw4XSxbLTUxMiwzLDgsMF0sWy0yNTYsNCw3LDldLFstMTI4LDUsNiwyNl0sWy02NCw1LDUsMjddLFstMzIsNCw1LDEwXSxbMCw0LDUsMTFdLFszMiw1LDUsMjhdLFs2NCw1LDYsMjldLFsxMjgsNCw3LDEyXSxbMjU2LDMsOCwxXSxbNTEyLDMsOSwyXSxbMTAyNCwzLDEwLDNdLFstMTAyNSw1LDMyLDMwLCJsb3dlciJdLFsyMDQ4LDUsMzIsMzFdXTticmVhaztjYXNlIDg6dD1bWy0xNSw4LDMsMjUyXSxbLTcsOSwxLDUwOF0sWy01LDgsMSwyNTNdLFstMyw5LDAsNTA5XSxbLTIsNywwLDEyNF0sWy0xLDQsMCwxMF0sWzAsMiwxLDBdLFsyLDUsMCwyNl0sWzMsNiwwLDU4XSxbNCwzLDQsNF0sWzIwLDYsMSw1OV0sWzIyLDQsNCwxMV0sWzM4LDQsNSwxMl0sWzcwLDUsNiwyN10sWzEzNCw1LDcsMjhdLFsyNjIsNiw3LDYwXSxbMzkwLDcsOCwxMjVdLFs2NDYsNiwxMCw2MV0sWy0xNiw5LDMyLDUxMCwibG93ZXIiXSxbMTY3MCw5LDMyLDUxMV0sWzIsMV1dO2JyZWFrO2Nhc2UgOTp0PVtbLTMxLDgsNCwyNTJdLFstMTUsOSwyLDUwOF0sWy0xMSw4LDIsMjUzXSxbLTcsOSwxLDUwOV0sWy01LDcsMSwxMjRdLFstMyw0LDEsMTBdLFstMSwzLDEsMl0sWzEsMywxLDNdLFszLDUsMSwyNl0sWzUsNiwxLDU4XSxbNywzLDUsNF0sWzM5LDYsMiw1OV0sWzQzLDQsNSwxMV0sWzc1LDQsNiwxMl0sWzEzOSw1LDcsMjddLFsyNjcsNSw4LDI4XSxbNTIzLDYsOCw2MF0sWzc3OSw3LDksMTI1XSxbMTI5MSw2LDExLDYxXSxbLTMyLDksMzIsNTEwLCJsb3dlciJdLFszMzM5LDksMzIsNTExXSxbMiwwXV07YnJlYWs7Y2FzZSAxMDp0PVtbLTIxLDcsNCwxMjJdLFstNSw4LDAsMjUyXSxbLTQsNywwLDEyM10sWy0zLDUsMCwyNF0sWy0yLDIsMiwwXSxbMiw1LDAsMjVdLFszLDYsMCw1NF0sWzQsNywwLDEyNF0sWzUsOCwwLDI1M10sWzYsMiw2LDFdLFs3MCw1LDUsMjZdLFsxMDIsNiw1LDU1XSxbMTM0LDYsNiw1Nl0sWzE5OCw2LDcsNTddLFszMjYsNiw4LDU4XSxbNTgyLDYsOSw1OV0sWzEwOTQsNiwxMCw2MF0sWzIxMTgsNywxMSwxMjVdLFstMjIsOCwzMiwyNTQsImxvd2VyIl0sWzQxNjYsOCwzMiwyNTVdLFsyLDJdXTticmVhaztjYXNlIDExOnQ9W1sxLDEsMCwwXSxbMiwyLDEsMl0sWzQsNCwwLDEyXSxbNSw0LDEsMTNdLFs3LDUsMSwyOF0sWzksNSwyLDI5XSxbMTMsNiwyLDYwXSxbMTcsNywyLDEyMl0sWzIxLDcsMywxMjNdLFsyOSw3LDQsMTI0XSxbNDUsNyw1LDEyNV0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDEyOnQ9W1sxLDEsMCwwXSxbMiwyLDAsMl0sWzMsMywxLDZdLFs1LDUsMCwyOF0sWzYsNSwxLDI5XSxbOCw2LDEsNjBdLFsxMCw3LDAsMTIyXSxbMTEsNywxLDEyM10sWzEzLDcsMiwxMjRdLFsxNyw3LDMsMTI1XSxbMjUsNyw0LDEyNl0sWzQxLDgsNSwyNTRdLFs3Myw4LDMyLDI1NV1dO2JyZWFrO2Nhc2UgMTM6dD1bWzEsMSwwLDBdLFsyLDMsMCw0XSxbMyw0LDAsMTJdLFs0LDUsMCwyOF0sWzUsNCwxLDEzXSxbNywzLDMsNV0sWzE1LDYsMSw1OF0sWzE3LDYsMiw1OV0sWzIxLDYsMyw2MF0sWzI5LDYsNCw2MV0sWzQ1LDYsNSw2Ml0sWzc3LDcsNiwxMjZdLFsxNDEsNywzMiwxMjddXTticmVhaztjYXNlIDE0OnQ9W1stMiwzLDAsNF0sWy0xLDMsMCw1XSxbMCwxLDAsMF0sWzEsMywwLDZdLFsyLDMsMCw3XV07YnJlYWs7Y2FzZSAxNTp0PVtbLTI0LDcsNCwxMjRdLFstOCw2LDIsNjBdLFstNCw1LDEsMjhdLFstMiw0LDAsMTJdLFstMSwzLDAsNF0sWzAsMSwwLDBdLFsxLDMsMCw1XSxbMiw0LDAsMTNdLFszLDUsMSwyOV0sWzUsNiwyLDYxXSxbOSw3LDQsMTI1XSxbLTI1LDcsMzIsMTI2LCJsb3dlciJdLFsyNSw3LDMyLDEyN11dO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG8oInN0YW5kYXJkIHRhYmxlIEIuIi5jb25jYXQoZSwiIGRvZXMgbm90IGV4aXN0IikpfWZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKyl0W2VdPW5ldyBUKHRbZV0pO3JldHVybiByPW5ldyBFKHQsITApLFBbZV09cixyfWNsYXNzIE57Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuZGF0YT1lLHRoaXMuc3RhcnQ9dCx0aGlzLmVuZD1yLHRoaXMucG9zaXRpb249dCx0aGlzLnNoaWZ0PS0xLHRoaXMuY3VycmVudEJ5dGU9MH1yZWFkQml0KCl7aWYodGhpcy5zaGlmdDwwKXtpZih0aGlzLnBvc2l0aW9uPj10aGlzLmVuZCl0aHJvdyBuZXcgbygiZW5kIG9mIGRhdGEgd2hpbGUgcmVhZGluZyBiaXQiKTt0aGlzLmN1cnJlbnRCeXRlPXRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdLHRoaXMuc2hpZnQ9N31jb25zdCBlPXRoaXMuY3VycmVudEJ5dGU+PnRoaXMuc2hpZnQmMTtyZXR1cm4gdGhpcy5zaGlmdC0tLGV9cmVhZEJpdHMoZSl7bGV0IHQscj0wO2Zvcih0PWUtMTt0Pj0wO3QtLSlyfD10aGlzLnJlYWRCaXQoKTw8dDtyZXR1cm4gcn1ieXRlQWxpZ24oKXt0aGlzLnNoaWZ0PS0xfW5leHQoKXtyZXR1cm4gdGhpcy5wb3NpdGlvbj49dGhpcy5lbmQ/LTE6dGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK119fWZ1bmN0aW9uIEQoZSx0LHIpe2xldCBuPTA7Zm9yKGxldCBhPTAsaT10Lmxlbmd0aDthPGk7YSsrKXtjb25zdCBpPXJbdFthXV07aWYoaSl7aWYoZT09PW4pcmV0dXJuIGk7bisrfX10aHJvdyBuZXcgbygiY2FuJ3QgZmluZCBjdXN0b20gSHVmZm1hbiB0YWJsZSIpfWZ1bmN0aW9uIEIoZSx0LHIpe2NvbnN0IG49W107Zm9yKGxldCBhPTA7YTxyO2ErKyl7Y29uc3Qgcj1uZXcgVWludDhBcnJheSh0KTtuLnB1c2gocik7Zm9yKGxldCBuPTA7bjx0O24rKylyW25dPWUucmVhZEJpdCgpO2UuYnl0ZUFsaWduKCl9cmV0dXJuIG59ZnVuY3Rpb24gTChlLHQscixuKXtjb25zdCBhPXtLOi0xLENvbHVtbnM6dCxSb3dzOnIsQmxhY2tJczE6ITAsRW5kT2ZCbG9jazpufSxpPW5ldyBzLkNDSVRURmF4RGVjb2RlcihlLGEpLG89W107bGV0IGMsbD0hMTtmb3IobGV0IGU9MDtlPHI7ZSsrKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQpO28ucHVzaChlKTtsZXQgcj0tMTtmb3IobGV0IG49MDtuPHQ7bisrKXI8MCYmKGM9aS5yZWFkTmV4dENoYXIoKSwtMT09PWMmJihjPTAsbD0hMCkscj03KSxlW25dPWM+PnImMSxyLS19aWYobiYmIWwpe2NvbnN0IGU9NTtmb3IobGV0IHQ9MDt0PGUmJi0xIT09aS5yZWFkTmV4dENoYXIoKTt0KyspO31yZXR1cm4gb310LkpiaWcySW1hZ2U9Y2xhc3N7cGFyc2VDaHVua3MoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IEk7Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cisrKXtjb25zdCBuPWVbcl07RihBKHt9LG4uZGF0YSxuLnN0YXJ0LG4uZW5kKSx0KX1yZXR1cm4gdC5idWZmZXJ9KGUpfXBhcnNlKGUpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBKYmlnMkltYWdlLnBhcnNlIil9fX0sKGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Bcml0aG1ldGljRGVjb2Rlcj12b2lkIDA7Y29uc3Qgcj1be3FlOjIyMDE3LG5tcHM6MSxubHBzOjEsc3dpdGNoRmxhZzoxfSx7cWU6MTMzMTMsbm1wczoyLG5scHM6Nixzd2l0Y2hGbGFnOjB9LHtxZTo2MTQ1LG5tcHM6MyxubHBzOjksc3dpdGNoRmxhZzowfSx7cWU6Mjc1MyxubXBzOjQsbmxwczoxMixzd2l0Y2hGbGFnOjB9LHtxZToxMzEzLG5tcHM6NSxubHBzOjI5LHN3aXRjaEZsYWc6MH0se3FlOjU0NSxubXBzOjM4LG5scHM6MzMsc3dpdGNoRmxhZzowfSx7cWU6MjIwMTcsbm1wczo3LG5scHM6Nixzd2l0Y2hGbGFnOjF9LHtxZToyMTUwNSxubXBzOjgsbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxODQzMyxubXBzOjksbmxwczoxNCxzd2l0Y2hGbGFnOjB9LHtxZToxNDMzNyxubXBzOjEwLG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MTIyODksbm1wczoxMSxubHBzOjE3LHN3aXRjaEZsYWc6MH0se3FlOjkyMTcsbm1wczoxMixubHBzOjE4LHN3aXRjaEZsYWc6MH0se3FlOjcxNjksbm1wczoxMyxubHBzOjIwLHN3aXRjaEZsYWc6MH0se3FlOjU2MzMsbm1wczoyOSxubHBzOjIxLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6MTUsbmxwczoxNCxzd2l0Y2hGbGFnOjF9LHtxZToyMTUwNSxubXBzOjE2LG5scHM6MTQsc3dpdGNoRmxhZzowfSx7cWU6MjA3Mzcsbm1wczoxNyxubHBzOjE1LHN3aXRjaEZsYWc6MH0se3FlOjE4NDMzLG5tcHM6MTgsbmxwczoxNixzd2l0Y2hGbGFnOjB9LHtxZToxNDMzNyxubXBzOjE5LG5scHM6MTcsc3dpdGNoRmxhZzowfSx7cWU6MTMzMTMsbm1wczoyMCxubHBzOjE4LHN3aXRjaEZsYWc6MH0se3FlOjEyMjg5LG5tcHM6MjEsbmxwczoxOSxzd2l0Y2hGbGFnOjB9LHtxZToxMDI0MSxubXBzOjIyLG5scHM6MTksc3dpdGNoRmxhZzowfSx7cWU6OTIxNyxubXBzOjIzLG5scHM6MjAsc3dpdGNoRmxhZzowfSx7cWU6ODcwNSxubXBzOjI0LG5scHM6MjEsc3dpdGNoRmxhZzowfSx7cWU6NzE2OSxubXBzOjI1LG5scHM6MjIsc3dpdGNoRmxhZzowfSx7cWU6NjE0NSxubXBzOjI2LG5scHM6MjMsc3dpdGNoRmxhZzowfSx7cWU6NTYzMyxubXBzOjI3LG5scHM6MjQsc3dpdGNoRmxhZzowfSx7cWU6NTEyMSxubXBzOjI4LG5scHM6MjUsc3dpdGNoRmxhZzowfSx7cWU6NDYwOSxubXBzOjI5LG5scHM6MjYsc3dpdGNoRmxhZzowfSx7cWU6NDM1MyxubXBzOjMwLG5scHM6Mjcsc3dpdGNoRmxhZzowfSx7cWU6Mjc1MyxubXBzOjMxLG5scHM6Mjgsc3dpdGNoRmxhZzowfSx7cWU6MjQ5NyxubXBzOjMyLG5scHM6Mjksc3dpdGNoRmxhZzowfSx7cWU6MjIwOSxubXBzOjMzLG5scHM6MzAsc3dpdGNoRmxhZzowfSx7cWU6MTMxMyxubXBzOjM0LG5scHM6MzEsc3dpdGNoRmxhZzowfSx7cWU6MTA4OSxubXBzOjM1LG5scHM6MzIsc3dpdGNoRmxhZzowfSx7cWU6NjczLG5tcHM6MzYsbmxwczozMyxzd2l0Y2hGbGFnOjB9LHtxZTo1NDUsbm1wczozNyxubHBzOjM0LHN3aXRjaEZsYWc6MH0se3FlOjMyMSxubXBzOjM4LG5scHM6MzUsc3dpdGNoRmxhZzowfSx7cWU6MjczLG5tcHM6MzksbmxwczozNixzd2l0Y2hGbGFnOjB9LHtxZToxMzMsbm1wczo0MCxubHBzOjM3LHN3aXRjaEZsYWc6MH0se3FlOjczLG5tcHM6NDEsbmxwczozOCxzd2l0Y2hGbGFnOjB9LHtxZTozNyxubXBzOjQyLG5scHM6Mzksc3dpdGNoRmxhZzowfSx7cWU6MjEsbm1wczo0MyxubHBzOjQwLHN3aXRjaEZsYWc6MH0se3FlOjksbm1wczo0NCxubHBzOjQxLHN3aXRjaEZsYWc6MH0se3FlOjUsbm1wczo0NSxubHBzOjQyLHN3aXRjaEZsYWc6MH0se3FlOjEsbm1wczo0NSxubHBzOjQzLHN3aXRjaEZsYWc6MH0se3FlOjIyMDE3LG5tcHM6NDYsbmxwczo0Nixzd2l0Y2hGbGFnOjB9XTt0LkFyaXRobWV0aWNEZWNvZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxyKXt0aGlzLmRhdGE9ZSx0aGlzLmJwPXQsdGhpcy5kYXRhRW5kPXIsdGhpcy5jaGlnaD1lW3RdLHRoaXMuY2xvdz0wLHRoaXMuYnl0ZUluKCksdGhpcy5jaGlnaD10aGlzLmNoaWdoPDw3JjY1NTM1fHRoaXMuY2xvdz4+OSYxMjcsdGhpcy5jbG93PXRoaXMuY2xvdzw8NyY2NTUzNSx0aGlzLmN0LT03LHRoaXMuYT0zMjc2OH1ieXRlSW4oKXtjb25zdCBlPXRoaXMuZGF0YTtsZXQgdD10aGlzLmJwOzI1NT09PWVbdF0/ZVt0KzFdPjE0Mz8odGhpcy5jbG93Kz02NTI4MCx0aGlzLmN0PTgpOih0KyssdGhpcy5jbG93Kz1lW3RdPDw5LHRoaXMuY3Q9Nyx0aGlzLmJwPXQpOih0KyssdGhpcy5jbG93Kz10PHRoaXMuZGF0YUVuZD9lW3RdPDw4OjY1MjgwLHRoaXMuY3Q9OCx0aGlzLmJwPXQpLHRoaXMuY2xvdz42NTUzNSYmKHRoaXMuY2hpZ2grPXRoaXMuY2xvdz4+MTYsdGhpcy5jbG93Jj02NTUzNSl9cmVhZEJpdChlLHQpe2xldCBuPWVbdF0+PjEsYT0xJmVbdF07Y29uc3QgaT1yW25dLHM9aS5xZTtsZXQgbyxjPXRoaXMuYS1zO2lmKHRoaXMuY2hpZ2g8cyljPHM/KGM9cyxvPWEsbj1pLm5tcHMpOihjPXMsbz0xXmEsMT09PWkuc3dpdGNoRmxhZyYmKGE9byksbj1pLm5scHMpO2Vsc2V7aWYodGhpcy5jaGlnaC09cywwIT0oMzI3NjgmYykpcmV0dXJuIHRoaXMuYT1jLGE7YzxzPyhvPTFeYSwxPT09aS5zd2l0Y2hGbGFnJiYoYT1vKSxuPWkubmxwcyk6KG89YSxuPWkubm1wcyl9ZG97MD09PXRoaXMuY3QmJnRoaXMuYnl0ZUluKCksYzw8PTEsdGhpcy5jaGlnaD10aGlzLmNoaWdoPDwxJjY1NTM1fHRoaXMuY2xvdz4+MTUmMSx0aGlzLmNsb3c9dGhpcy5jbG93PDwxJjY1NTM1LHRoaXMuY3QtLX13aGlsZSgwPT0oMzI3NjgmYykpO3JldHVybiB0aGlzLmE9YyxlW3RdPW48PDF8YSxvfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5KcGVnU3RyZWFtPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNjgpLGE9cigxNTApLGk9cigxNzcpLHM9cigxNDQpO2NsYXNzIG8gZXh0ZW5kcyBuLkRlY29kZVN0cmVhbXtjb25zdHJ1Y3RvcihlLHQscil7bGV0IG47Zm9yKDstMSE9PShuPWUuZ2V0Qnl0ZSgpKTspaWYoMjU1PT09bil7ZS5za2lwKC0xKTticmVha31zdXBlcih0KSx0aGlzLnN0cmVhbT1lLHRoaXMuZGljdD1lLmRpY3QsdGhpcy5tYXliZUxlbmd0aD10LHRoaXMucGFyYW1zPXJ9Z2V0IGJ5dGVzKCl7cmV0dXJuKDAscy5zaGFkb3cpKHRoaXMsImJ5dGVzIix0aGlzLnN0cmVhbS5nZXRCeXRlcyh0aGlzLm1heWJlTGVuZ3RoKSl9ZW5zdXJlQnVmZmVyKGUpe31yZWFkQmxvY2soKXtpZih0aGlzLmVvZilyZXR1cm47Y29uc3QgZT17ZGVjb2RlVHJhbnNmb3JtOnZvaWQgMCxjb2xvclRyYW5zZm9ybTp2b2lkIDB9LHQ9dGhpcy5kaWN0LmdldEFycmF5KCJEIiwiRGVjb2RlIik7aWYoKHRoaXMuZm9yY2VSR0JBfHx0aGlzLmZvcmNlUkdCKSYmQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgcj10aGlzLmRpY3QuZ2V0KCJCUEMiLCJCaXRzUGVyQ29tcG9uZW50Iil8fDgsbj10Lmxlbmd0aCxhPW5ldyBJbnQzMkFycmF5KG4pO2xldCBpPSExO2NvbnN0IHM9KDE8PHIpLTE7Zm9yKGxldCBlPTA7ZTxuO2UrPTIpYVtlXT0yNTYqKHRbZSsxXS10W2VdKXwwLGFbZSsxXT10W2VdKnN8MCwyNTY9PT1hW2VdJiYwPT09YVtlKzFdfHwoaT0hMCk7aSYmKGUuZGVjb2RlVHJhbnNmb3JtPWEpfWlmKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgYS5EaWN0KXtjb25zdCB0PXRoaXMucGFyYW1zLmdldCgiQ29sb3JUcmFuc2Zvcm0iKTtOdW1iZXIuaXNJbnRlZ2VyKHQpJiYoZS5jb2xvclRyYW5zZm9ybT10KX1jb25zdCByPW5ldyBpLkpwZWdJbWFnZShlKTtyLnBhcnNlKHRoaXMuYnl0ZXMpO2NvbnN0IG49ci5nZXREYXRhKHt3aWR0aDp0aGlzLmRyYXdXaWR0aCxoZWlnaHQ6dGhpcy5kcmF3SGVpZ2h0LGZvcmNlUkdCQTp0aGlzLmZvcmNlUkdCQSxmb3JjZVJHQjp0aGlzLmZvcmNlUkdCLGlzU291cmNlUERGOiEwfSk7dGhpcy5idWZmZXI9bix0aGlzLmJ1ZmZlckxlbmd0aD1uLmxlbmd0aCx0aGlzLmVvZj0hMH19dC5KcGVnU3RyZWFtPW99LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5KcGVnSW1hZ2U9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDEzOSk7dmFyIG49cigxNDQpLGE9cigxNzgpLGk9cigxNDkpO2NsYXNzIHMgZXh0ZW5kcyBuLkJhc2VFeGNlcHRpb257Y29uc3RydWN0b3IoZSl7c3VwZXIoIkpQRUcgZXJyb3I6ICIuY29uY2F0KGUpLCJKcGVnRXJyb3IiKX19Y2xhc3MgbyBleHRlbmRzIG4uQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsIkROTE1hcmtlckVycm9yIiksdGhpcy5zY2FuTGluZXM9dH19Y2xhc3MgYyBleHRlbmRzIG4uQmFzZUV4Y2VwdGlvbntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJFT0lNYXJrZXJFcnJvciIpfX1jb25zdCBsPW5ldyBVaW50OEFycmF5KFswLDEsOCwxNiw5LDIsMywxMCwxNywyNCwzMiwyNSwxOCwxMSw0LDUsMTIsMTksMjYsMzMsNDAsNDgsNDEsMzQsMjcsMjAsMTMsNiw3LDE0LDIxLDI4LDM1LDQyLDQ5LDU2LDU3LDUwLDQzLDM2LDI5LDIyLDE1LDIzLDMwLDM3LDQ0LDUxLDU4LDU5LDUyLDQ1LDM4LDMxLDM5LDQ2LDUzLDYwLDYxLDU0LDQ3LDU1LDYyLDYzXSksaD00MDE3LHU9Nzk5LGQ9MzQwNixmPTIyNzYsZz0xNTY3LHA9Mzc4NCxtPTU3OTMsYj0yODk2O2Z1bmN0aW9uIHkoZSx0KXtsZXQgcixuLGE9MCxpPTE2O2Zvcig7aT4wJiYhZVtpLTFdOylpLS07Y29uc3Qgcz1be2NoaWxkcmVuOltdLGluZGV4OjB9XTtsZXQgbyxjPXNbMF07Zm9yKHI9MDtyPGk7cisrKXtmb3Iobj0wO248ZVtyXTtuKyspe2ZvcihjPXMucG9wKCksYy5jaGlsZHJlbltjLmluZGV4XT10W2FdO2MuaW5kZXg+MDspYz1zLnBvcCgpO2ZvcihjLmluZGV4Kysscy5wdXNoKGMpO3MubGVuZ3RoPD1yOylzLnB1c2gobz17Y2hpbGRyZW46W10saW5kZXg6MH0pLGMuY2hpbGRyZW5bYy5pbmRleF09by5jaGlsZHJlbixjPW87YSsrfXIrMTxpJiYocy5wdXNoKG89e2NoaWxkcmVuOltdLGluZGV4OjB9KSxjLmNoaWxkcmVuW2MuaW5kZXhdPW8uY2hpbGRyZW4sYz1vKX1yZXR1cm4gc1swXS5jaGlsZHJlbn1mdW5jdGlvbiB3KGUsdCxyKXtyZXR1cm4gNjQqKChlLmJsb2Nrc1BlckxpbmUrMSkqdCtyKX1mdW5jdGlvbiB2KGUsdCxyLGEsaCx1LGQsZixnKXtsZXQgcD1hcmd1bWVudHMubGVuZ3RoPjkmJnZvaWQgMCE9PWFyZ3VtZW50c1s5XSYmYXJndW1lbnRzWzldO2NvbnN0IG09ci5tY3VzUGVyTGluZSxiPXIucHJvZ3Jlc3NpdmUseT10O2xldCB2PTAseD0wO2Z1bmN0aW9uIFMoKXtpZih4PjApcmV0dXJuIHgtLSx2Pj54JjE7aWYodj1lW3QrK10sMjU1PT09dil7Y29uc3Qgbj1lW3QrK107aWYobil7aWYoMjIwPT09biYmcCl7dCs9Mjtjb25zdCBuPSgwLGkucmVhZFVpbnQxNikoZSx0KTtpZih0Kz0yLG4+MCYmbiE9PXIuc2NhbkxpbmVzKXRocm93IG5ldyBvKCJGb3VuZCBETkwgbWFya2VyICgweEZGREMpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIixuKX1lbHNlIGlmKDIxNz09PW4pe2lmKHApe2NvbnN0IGU9TSooOD09PXIucHJlY2lzaW9uPzg6MCk7aWYoZT4wJiZNYXRoLnJvdW5kKHIuc2NhbkxpbmVzL2UpPj01KXRocm93IG5ldyBvKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhLCBwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlciIsZSl9dGhyb3cgbmV3IGMoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEiKX10aHJvdyBuZXcgcygidW5leHBlY3RlZCBtYXJrZXIgIi5jb25jYXQoKHY8PDh8bikudG9TdHJpbmcoMTYpKSl9fXJldHVybiB4PTcsdj4+Pjd9ZnVuY3Rpb24gayhlKXtsZXQgdD1lO2Zvcig7Oyl7c3dpdGNoKHQ9dFtTKCldLHR5cGVvZiB0KXtjYXNlIm51bWJlciI6cmV0dXJuIHQ7Y2FzZSJvYmplY3QiOmNvbnRpbnVlfXRocm93IG5ldyBzKCJpbnZhbGlkIGh1ZmZtYW4gc2VxdWVuY2UiKX19ZnVuY3Rpb24gQyhlKXtsZXQgdD0wO2Zvcig7ZT4wOyl0PXQ8PDF8UygpLGUtLTtyZXR1cm4gdH1mdW5jdGlvbiBPKGUpe2lmKDE9PT1lKXJldHVybiAxPT09UygpPzE6LTE7Y29uc3QgdD1DKGUpO3JldHVybiB0Pj0xPDxlLTE/dDp0KygtMTw8ZSkrMX1sZXQgRixJPTAsVD0wLE09MDtmdW5jdGlvbiBFKGUsdCxyLG4sYSl7Y29uc3QgaT1yJW07TT0oci9tfDApKmUudituO2NvbnN0IHM9aSplLmgrYTt0KGUsdyhlLE0scykpfWZ1bmN0aW9uIFAoZSx0LHIpe009ci9lLmJsb2Nrc1BlckxpbmV8MDtjb25zdCBuPXIlZS5ibG9ja3NQZXJMaW5lO3QoZSx3KGUsTSxuKSl9Y29uc3QgUj1hLmxlbmd0aDtsZXQgTixELEIsTCxfLGo7aj1iPzA9PT11PzA9PT1mP2Z1bmN0aW9uKGUsdCl7Y29uc3Qgcj1rKGUuaHVmZm1hblRhYmxlREMpLG49MD09PXI/MDpPKHIpPDxnO2UuYmxvY2tEYXRhW3RdPWUucHJlZCs9bn06ZnVuY3Rpb24oZSx0KXtlLmJsb2NrRGF0YVt0XXw9UygpPDxnfTowPT09Zj9mdW5jdGlvbihlLHQpe2lmKEk+MClyZXR1cm4gdm9pZCBJLS07bGV0IHI9dTtjb25zdCBuPWQ7Zm9yKDtyPD1uOyl7Y29uc3Qgbj1rKGUuaHVmZm1hblRhYmxlQUMpLGE9MTUmbixpPW4+PjQ7aWYoMD09PWEpe2lmKGk8MTUpe0k9QyhpKSsoMTw8aSktMTticmVha31yKz0xNjtjb250aW51ZX1yKz1pO2NvbnN0IHM9bFtyXTtlLmJsb2NrRGF0YVt0K3NdPU8oYSkqKDE8PGcpLHIrK319OmZ1bmN0aW9uKGUsdCl7bGV0IHI9dTtjb25zdCBuPWQ7bGV0IGEsaSxvPTA7Zm9yKDtyPD1uOyl7Y29uc3Qgbj10K2xbcl0sYz1lLmJsb2NrRGF0YVtuXTwwPy0xOjE7c3dpdGNoKFQpe2Nhc2UgMDppZihpPWsoZS5odWZmbWFuVGFibGVBQyksYT0xNSZpLG89aT4+NCwwPT09YSlvPDE1PyhJPUMobykrKDE8PG8pLFQ9NCk6KG89MTYsVD0xKTtlbHNle2lmKDEhPT1hKXRocm93IG5ldyBzKCJpbnZhbGlkIEFDbiBlbmNvZGluZyIpO0Y9TyhhKSxUPW8/MjozfWNvbnRpbnVlO2Nhc2UgMTpjYXNlIDI6ZS5ibG9ja0RhdGFbbl0/ZS5ibG9ja0RhdGFbbl0rPWMqKFMoKTw8Zyk6KG8tLSwwPT09byYmKFQ9Mj09PVQ/MzowKSk7YnJlYWs7Y2FzZSAzOmUuYmxvY2tEYXRhW25dP2UuYmxvY2tEYXRhW25dKz1jKihTKCk8PGcpOihlLmJsb2NrRGF0YVtuXT1GPDxnLFQ9MCk7YnJlYWs7Y2FzZSA0OmUuYmxvY2tEYXRhW25dJiYoZS5ibG9ja0RhdGFbbl0rPWMqKFMoKTw8ZykpfXIrK300PT09VCYmKEktLSwwPT09SSYmKFQ9MCkpfTpmdW5jdGlvbihlLHQpe2NvbnN0IHI9ayhlLmh1ZmZtYW5UYWJsZURDKSxuPTA9PT1yPzA6TyhyKTtlLmJsb2NrRGF0YVt0XT1lLnByZWQrPW47bGV0IGE9MTtmb3IoO2E8NjQ7KXtjb25zdCByPWsoZS5odWZmbWFuVGFibGVBQyksbj0xNSZyLGk9cj4+NDtpZigwPT09bil7aWYoaTwxNSlicmVhazthKz0xNjtjb250aW51ZX1hKz1pO2NvbnN0IHM9bFthXTtlLmJsb2NrRGF0YVt0K3NdPU8obiksYSsrfX07bGV0IFUsJD0wO2NvbnN0IFg9MT09PVI/YVswXS5ibG9ja3NQZXJMaW5lKmFbMF0uYmxvY2tzUGVyQ29sdW1uOm0qci5tY3VzUGVyQ29sdW1uO2xldCBILHE7Zm9yKDskPD1YOyl7Y29uc3Qgcj1oP01hdGgubWluKFgtJCxoKTpYO2lmKHI+MCl7Zm9yKEQ9MDtEPFI7RCsrKWFbRF0ucHJlZD0wO2lmKEk9MCwxPT09Uilmb3IoTj1hWzBdLF89MDtfPHI7XysrKVAoTixqLCQpLCQrKztlbHNlIGZvcihfPTA7XzxyO18rKyl7Zm9yKEQ9MDtEPFI7RCsrKWZvcihOPWFbRF0sSD1OLmgscT1OLnYsQj0wO0I8cTtCKyspZm9yKEw9MDtMPEg7TCsrKUUoTixqLCQsQixMKTskKyt9fWlmKHg9MCxVPUEoZSx0KSwhVSlicmVhaztpZihVLmludmFsaWQpe2NvbnN0IGU9cj4wPyJ1bmV4cGVjdGVkIjoiZXhjZXNzaXZlIjsoMCxuLndhcm4pKCJkZWNvZGVTY2FuIC0gIi5jb25jYXQoZSwiIE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogIikuY29uY2F0KFUuaW52YWxpZCkpLHQ9VS5vZmZzZXR9aWYoIShVLm1hcmtlcj49NjU0ODgmJlUubWFya2VyPD02NTQ5NSkpYnJlYWs7dCs9Mn1yZXR1cm4gdC15fWZ1bmN0aW9uIHgoZSx0LHIpe2NvbnN0IG49ZS5xdWFudGl6YXRpb25UYWJsZSxhPWUuYmxvY2tEYXRhO2xldCBpLG8sYyxsLHksdyx2LHgsUyxBLGssQyxPLEYsSSxULE07aWYoIW4pdGhyb3cgbmV3IHMoIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLiIpO2ZvcihsZXQgZT0wO2U8NjQ7ZSs9OClTPWFbdCtlXSxBPWFbdCtlKzFdLGs9YVt0K2UrMl0sQz1hW3QrZSszXSxPPWFbdCtlKzRdLEY9YVt0K2UrNV0sST1hW3QrZSs2XSxUPWFbdCtlKzddLFMqPW5bZV0sMCE9KEF8a3xDfE98RnxJfFQpPyhBKj1uW2UrMV0sayo9bltlKzJdLEMqPW5bZSszXSxPKj1uW2UrNF0sRio9bltlKzVdLEkqPW5bZSs2XSxUKj1uW2UrN10saT1tKlMrMTI4Pj44LG89bSpPKzEyOD4+OCxjPWssbD1JLHk9YiooQS1UKSsxMjg+PjgseD1iKihBK1QpKzEyOD4+OCx3PUM8PDQsdj1GPDw0LGk9aStvKzE+PjEsbz1pLW8sTT1jKnArbCpnKzEyOD4+OCxjPWMqZy1sKnArMTI4Pj44LGw9TSx5PXkrdisxPj4xLHY9eS12LHg9eCt3KzE+PjEsdz14LXcsaT1pK2wrMT4+MSxsPWktbCxvPW8rYysxPj4xLGM9by1jLE09eSpmK3gqZCsyMDQ4Pj4xMix5PXkqZC14KmYrMjA0OD4+MTIseD1NLE09dyp1K3YqaCsyMDQ4Pj4xMix3PXcqaC12KnUrMjA0OD4+MTIsdj1NLHJbZV09aSt4LHJbZSs3XT1pLXgscltlKzFdPW8rdixyW2UrNl09by12LHJbZSsyXT1jK3cscltlKzVdPWMtdyxyW2UrM109bCt5LHJbZSs0XT1sLXkpOihNPW0qUys1MTI+PjEwLHJbZV09TSxyW2UrMV09TSxyW2UrMl09TSxyW2UrM109TSxyW2UrNF09TSxyW2UrNV09TSxyW2UrNl09TSxyW2UrN109TSk7Zm9yKGxldCBlPTA7ZTw4OysrZSlTPXJbZV0sQT1yW2UrOF0saz1yW2UrMTZdLEM9cltlKzI0XSxPPXJbZSszMl0sRj1yW2UrNDBdLEk9cltlKzQ4XSxUPXJbZSs1Nl0sMCE9KEF8a3xDfE98RnxJfFQpPyhpPW0qUysyMDQ4Pj4xMixvPW0qTysyMDQ4Pj4xMixjPWssbD1JLHk9YiooQS1UKSsyMDQ4Pj4xMix4PWIqKEErVCkrMjA0OD4+MTIsdz1DLHY9RixpPTQxMTIrKGkrbysxPj4xKSxvPWktbyxNPWMqcCtsKmcrMjA0OD4+MTIsYz1jKmctbCpwKzIwNDg+PjEyLGw9TSx5PXkrdisxPj4xLHY9eS12LHg9eCt3KzE+PjEsdz14LXcsaT1pK2wrMT4+MSxsPWktbCxvPW8rYysxPj4xLGM9by1jLE09eSpmK3gqZCsyMDQ4Pj4xMix5PXkqZC14KmYrMjA0OD4+MTIseD1NLE09dyp1K3YqaCsyMDQ4Pj4xMix3PXcqaC12KnUrMjA0OD4+MTIsdj1NLFM9aSt4LFQ9aS14LEE9byt2LEk9by12LGs9Yyt3LEY9Yy13LEM9bCt5LE89bC15LFM8MTY/Uz0wOlM+PTQwODA/Uz0yNTU6Uz4+PTQsQTwxNj9BPTA6QT49NDA4MD9BPTI1NTpBPj49NCxrPDE2P2s9MDprPj00MDgwP2s9MjU1Oms+Pj00LEM8MTY/Qz0wOkM+PTQwODA/Qz0yNTU6Qz4+PTQsTzwxNj9PPTA6Tz49NDA4MD9PPTI1NTpPPj49NCxGPDE2P0Y9MDpGPj00MDgwP0Y9MjU1OkY+Pj00LEk8MTY/ST0wOkk+PTQwODA/ST0yNTU6ST4+PTQsVDwxNj9UPTA6VD49NDA4MD9UPTI1NTpUPj49NCxhW3QrZV09UyxhW3QrZSs4XT1BLGFbdCtlKzE2XT1rLGFbdCtlKzI0XT1DLGFbdCtlKzMyXT1PLGFbdCtlKzQwXT1GLGFbdCtlKzQ4XT1JLGFbdCtlKzU2XT1UKTooTT1tKlMrODE5Mj4+MTQsTT1NPC0yMDQwPzA6TT49MjAyND8yNTU6TSsyMDU2Pj40LGFbdCtlXT1NLGFbdCtlKzhdPU0sYVt0K2UrMTZdPU0sYVt0K2UrMjRdPU0sYVt0K2UrMzJdPU0sYVt0K2UrNDBdPU0sYVt0K2UrNDhdPU0sYVt0K2UrNTZdPU0pfWZ1bmN0aW9uIFMoZSx0KXtjb25zdCByPXQuYmxvY2tzUGVyTGluZSxuPXQuYmxvY2tzUGVyQ29sdW1uLGE9bmV3IEludDE2QXJyYXkoNjQpO2ZvcihsZXQgZT0wO2U8bjtlKyspZm9yKGxldCBuPTA7bjxyO24rKyl4KHQsdyh0LGUsbiksYSk7cmV0dXJuIHQuYmxvY2tEYXRhfWZ1bmN0aW9uIEEoZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dDtjb25zdCBuPWUubGVuZ3RoLTE7bGV0IGE9cjx0P3I6dDtpZih0Pj1uKXJldHVybiBudWxsO2NvbnN0IHM9KDAsaS5yZWFkVWludDE2KShlLHQpO2lmKHM+PTY1NDcyJiZzPD02NTUzNClyZXR1cm57aW52YWxpZDpudWxsLG1hcmtlcjpzLG9mZnNldDp0fTtsZXQgbz0oMCxpLnJlYWRVaW50MTYpKGUsYSk7Zm9yKDshKG8+PTY1NDcyJiZvPD02NTUzNCk7KXtpZigrK2E+PW4pcmV0dXJuIG51bGw7bz0oMCxpLnJlYWRVaW50MTYpKGUsYSl9cmV0dXJue2ludmFsaWQ6cy50b1N0cmluZygxNiksbWFya2VyOm8sb2Zmc2V0OmF9fXQuSnBlZ0ltYWdlPWNsYXNze2NvbnN0cnVjdG9yKCl7bGV0e2RlY29kZVRyYW5zZm9ybTplPW51bGwsY29sb3JUcmFuc2Zvcm06dD0tMX09YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3RoaXMuX2RlY29kZVRyYW5zZm9ybT1lLHRoaXMuX2NvbG9yVHJhbnNmb3JtPXR9cGFyc2UoZSl7bGV0e2RubFNjYW5MaW5lczp0PW51bGx9PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtmdW5jdGlvbiByKCl7Y29uc3QgdD0oMCxpLnJlYWRVaW50MTYpKGUsZCk7ZCs9MjtsZXQgcj1kK3QtMjtjb25zdCBhPUEoZSxyLGQpO251bGwhPWEmJmEuaW52YWxpZCYmKCgwLG4ud2FybikoInJlYWREYXRhQmxvY2sgLSBpbmNvcnJlY3QgbGVuZ3RoLCBjdXJyZW50IG1hcmtlciBpczogIithLmludmFsaWQpLHI9YS5vZmZzZXQpO2NvbnN0IHM9ZS5zdWJhcnJheShkLHIpO3JldHVybiBkKz1zLmxlbmd0aCxzfWZ1bmN0aW9uIGEoZSl7Y29uc3QgdD1NYXRoLmNlaWwoZS5zYW1wbGVzUGVyTGluZS84L2UubWF4SCkscj1NYXRoLmNlaWwoZS5zY2FuTGluZXMvOC9lLm1heFYpO2Zvcihjb25zdCBuIG9mIGUuY29tcG9uZW50cyl7Y29uc3QgYT1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2FtcGxlc1BlckxpbmUvOCkqbi5oL2UubWF4SCksaT1NYXRoLmNlaWwoTWF0aC5jZWlsKGUuc2NhbkxpbmVzLzgpKm4udi9lLm1heFYpLHM9dCpuLmgsbz1yKm4udio2NCoocysxKTtuLmJsb2NrRGF0YT1uZXcgSW50MTZBcnJheShvKSxuLmJsb2Nrc1BlckxpbmU9YSxuLmJsb2Nrc1BlckNvbHVtbj1pfWUubWN1c1BlckxpbmU9dCxlLm1jdXNQZXJDb2x1bW49cn1sZXQgaCx1LGQ9MCxmPW51bGwsZz1udWxsLHA9MDtjb25zdCBtPVtdLGI9W10sdz1bXTtsZXQgeD0oMCxpLnJlYWRVaW50MTYpKGUsZCk7aWYoZCs9Miw2NTQ5NiE9PXgpdGhyb3cgbmV3IHMoIlNPSSBub3QgZm91bmQiKTt4PSgwLGkucmVhZFVpbnQxNikoZSxkKSxkKz0yO2U6Zm9yKDs2NTQ5NyE9PXg7KXtsZXQgUyxrLEM7c3dpdGNoKHgpe2Nhc2UgNjU1MDQ6Y2FzZSA2NTUwNTpjYXNlIDY1NTA2OmNhc2UgNjU1MDc6Y2FzZSA2NTUwODpjYXNlIDY1NTA5OmNhc2UgNjU1MTA6Y2FzZSA2NTUxMTpjYXNlIDY1NTEyOmNhc2UgNjU1MTM6Y2FzZSA2NTUxNDpjYXNlIDY1NTE1OmNhc2UgNjU1MTY6Y2FzZSA2NTUxNzpjYXNlIDY1NTE4OmNhc2UgNjU1MTk6Y2FzZSA2NTUzNDpjb25zdCBPPXIoKTs2NTUwND09PXgmJjc0PT09T1swXSYmNzA9PT1PWzFdJiY3Mz09PU9bMl0mJjcwPT09T1szXSYmMD09PU9bNF0mJihmPXt2ZXJzaW9uOnttYWpvcjpPWzVdLG1pbm9yOk9bNl19LGRlbnNpdHlVbml0czpPWzddLHhEZW5zaXR5Ok9bOF08PDh8T1s5XSx5RGVuc2l0eTpPWzEwXTw8OHxPWzExXSx0aHVtYldpZHRoOk9bMTJdLHRodW1iSGVpZ2h0Ok9bMTNdLHRodW1iRGF0YTpPLnN1YmFycmF5KDE0LDE0KzMqT1sxMl0qT1sxM10pfSksNjU1MTg9PT14JiY2NT09PU9bMF0mJjEwMD09PU9bMV0mJjExMT09PU9bMl0mJjk4PT09T1szXSYmMTAxPT09T1s0XSYmKGc9e3ZlcnNpb246T1s1XTw8OHxPWzZdLGZsYWdzMDpPWzddPDw4fE9bOF0sZmxhZ3MxOk9bOV08PDh8T1sxMF0sdHJhbnNmb3JtQ29kZTpPWzExXX0pO2JyZWFrO2Nhc2UgNjU0OTk6Y29uc3QgRj0oMCxpLnJlYWRVaW50MTYpKGUsZCk7ZCs9Mjtjb25zdCBJPUYrZC0yO2xldCBUO2Zvcig7ZDxJOyl7Y29uc3QgdD1lW2QrK10scj1uZXcgVWludDE2QXJyYXkoNjQpO2lmKHQ+PjQ9PTApZm9yKGs9MDtrPDY0O2srKylUPWxba10scltUXT1lW2QrK107ZWxzZXtpZih0Pj40IT0xKXRocm93IG5ldyBzKCJEUVQgLSBpbnZhbGlkIHRhYmxlIHNwZWMiKTtmb3Ioaz0wO2s8NjQ7aysrKVQ9bFtrXSxyW1RdPSgwLGkucmVhZFVpbnQxNikoZSxkKSxkKz0yfW1bMTUmdF09cn1icmVhaztjYXNlIDY1NDcyOmNhc2UgNjU0NzM6Y2FzZSA2NTQ3NDppZihoKXRocm93IG5ldyBzKCJPbmx5IHNpbmdsZSBmcmFtZSBKUEVHcyBzdXBwb3J0ZWQiKTtkKz0yLGg9e30saC5leHRlbmRlZD02NTQ3Mz09PXgsaC5wcm9ncmVzc2l2ZT02NTQ3ND09PXgsaC5wcmVjaXNpb249ZVtkKytdO2NvbnN0IE09KDAsaS5yZWFkVWludDE2KShlLGQpO2QrPTIsaC5zY2FuTGluZXM9dHx8TSxoLnNhbXBsZXNQZXJMaW5lPSgwLGkucmVhZFVpbnQxNikoZSxkKSxkKz0yLGguY29tcG9uZW50cz1bXSxoLmNvbXBvbmVudElkcz17fTtjb25zdCBFPWVbZCsrXTtsZXQgUD0wLFI9MDtmb3IoUz0wO1M8RTtTKyspe2NvbnN0IHQ9ZVtkXSxyPWVbZCsxXT4+NCxuPTE1JmVbZCsxXTtQPHImJihQPXIpLFI8biYmKFI9bik7Y29uc3QgYT1lW2QrMl07Qz1oLmNvbXBvbmVudHMucHVzaCh7aDpyLHY6bixxdWFudGl6YXRpb25JZDphLHF1YW50aXphdGlvblRhYmxlOm51bGx9KSxoLmNvbXBvbmVudElkc1t0XT1DLTEsZCs9M31oLm1heEg9UCxoLm1heFY9UixhKGgpO2JyZWFrO2Nhc2UgNjU0NzY6Y29uc3QgTj0oMCxpLnJlYWRVaW50MTYpKGUsZCk7Zm9yKGQrPTIsUz0yO1M8Tjspe2NvbnN0IHQ9ZVtkKytdLHI9bmV3IFVpbnQ4QXJyYXkoMTYpO2xldCBuPTA7Zm9yKGs9MDtrPDE2O2srKyxkKyspbis9cltrXT1lW2RdO2NvbnN0IGE9bmV3IFVpbnQ4QXJyYXkobik7Zm9yKGs9MDtrPG47aysrLGQrKylhW2tdPWVbZF07Uys9MTcrbiwodD4+ND09MD93OmIpWzE1JnRdPXkocixhKX1icmVhaztjYXNlIDY1NTAxOmQrPTIsdT0oMCxpLnJlYWRVaW50MTYpKGUsZCksZCs9MjticmVhaztjYXNlIDY1NDk4OmNvbnN0IEQ9MT09KytwJiYhdDtkKz0yO2NvbnN0IEI9ZVtkKytdLEw9W107Zm9yKFM9MDtTPEI7UysrKXtjb25zdCB0PWVbZCsrXSxyPWguY29tcG9uZW50SWRzW3RdLG49aC5jb21wb25lbnRzW3JdO24uaW5kZXg9dDtjb25zdCBhPWVbZCsrXTtuLmh1ZmZtYW5UYWJsZURDPXdbYT4+NF0sbi5odWZmbWFuVGFibGVBQz1iWzE1JmFdLEwucHVzaChuKX1jb25zdCBfPWVbZCsrXSxqPWVbZCsrXSxVPWVbZCsrXTt0cnl7Y29uc3QgdD12KGUsZCxoLEwsdSxfLGosVT4+NCwxNSZVLEQpO2QrPXR9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIG8pcmV0dXJuKDAsbi53YXJuKSgiIi5jb25jYXQodC5tZXNzYWdlLCIgLS0gYXR0ZW1wdGluZyB0byByZS1wYXJzZSB0aGUgSlBFRyBpbWFnZS4iKSksdGhpcy5wYXJzZShlLHtkbmxTY2FuTGluZXM6dC5zY2FuTGluZXN9KTtpZih0IGluc3RhbmNlb2YgYyl7KDAsbi53YXJuKSgiIi5jb25jYXQodC5tZXNzYWdlLCIgLS0gaWdub3JpbmcgdGhlIHJlc3Qgb2YgdGhlIGltYWdlIGRhdGEuIikpO2JyZWFrIGV9dGhyb3cgdH1icmVhaztjYXNlIDY1NTAwOmQrPTQ7YnJlYWs7Y2FzZSA2NTUzNToyNTUhPT1lW2RdJiZkLS07YnJlYWs7ZGVmYXVsdDpjb25zdCAkPUEoZSxkLTIsZC0zKTtpZihudWxsIT0kJiYkLmludmFsaWQpeygwLG4ud2FybikoIkpwZWdJbWFnZS5wYXJzZSAtIHVuZXhwZWN0ZWQgZGF0YSwgY3VycmVudCBtYXJrZXIgaXM6ICIrJC5pbnZhbGlkKSxkPSQub2Zmc2V0O2JyZWFrfWlmKCEkfHxkPj1lLmxlbmd0aC0xKXsoMCxuLndhcm4pKCJKcGVnSW1hZ2UucGFyc2UgLSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGltYWdlIGRhdGEgd2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuIik7YnJlYWsgZX10aHJvdyBuZXcgcygiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6ICIreC50b1N0cmluZygxNikpfXg9KDAsaS5yZWFkVWludDE2KShlLGQpLGQrPTJ9dGhpcy53aWR0aD1oLnNhbXBsZXNQZXJMaW5lLHRoaXMuaGVpZ2h0PWguc2NhbkxpbmVzLHRoaXMuamZpZj1mLHRoaXMuYWRvYmU9Zyx0aGlzLmNvbXBvbmVudHM9W107Zm9yKGNvbnN0IGUgb2YgaC5jb21wb25lbnRzKXtjb25zdCB0PW1bZS5xdWFudGl6YXRpb25JZF07dCYmKGUucXVhbnRpemF0aW9uVGFibGU9dCksdGhpcy5jb21wb25lbnRzLnB1c2goe2luZGV4OmUuaW5kZXgsb3V0cHV0OlMoMCxlKSxzY2FsZVg6ZS5oL2gubWF4SCxzY2FsZVk6ZS52L2gubWF4VixibG9ja3NQZXJMaW5lOmUuYmxvY2tzUGVyTGluZSxibG9ja3NQZXJDb2x1bW46ZS5ibG9ja3NQZXJDb2x1bW59KX10aGlzLm51bUNvbXBvbmVudHM9dGhpcy5jb21wb25lbnRzLmxlbmd0aH1fZ2V0TGluZWFyaXplZEJsb2NrRGF0YShlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07Y29uc3Qgbj10aGlzLndpZHRoL2UsYT10aGlzLmhlaWdodC90O2xldCBpLHMsbyxjLGwsaCx1LGQsZixnLHAsbT0wO2NvbnN0IGI9dGhpcy5jb21wb25lbnRzLmxlbmd0aCx5PWUqdCpiLHc9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHkpLHY9bmV3IFVpbnQzMkFycmF5KGUpLHg9NDI5NDk2NzI4ODtsZXQgUztmb3IodT0wO3U8Yjt1Kyspe2lmKGk9dGhpcy5jb21wb25lbnRzW3VdLHM9aS5zY2FsZVgqbixvPWkuc2NhbGVZKmEsbT11LHA9aS5vdXRwdXQsYz1pLmJsb2Nrc1BlckxpbmUrMTw8MyxzIT09Uyl7Zm9yKGw9MDtsPGU7bCsrKWQ9MHxsKnMsdltsXT0oZCZ4KTw8M3w3JmQ7Uz1zfWZvcihoPTA7aDx0O2grKylmb3IoZD0wfGgqbyxnPWMqKGQmeCl8KDcmZCk8PDMsbD0wO2w8ZTtsKyspd1ttXT1wW2crdltsXV0sbSs9Yn1sZXQgQT10aGlzLl9kZWNvZGVUcmFuc2Zvcm07aWYocnx8NCE9PWJ8fEF8fChBPW5ldyBJbnQzMkFycmF5KFstMjU2LDI1NSwtMjU2LDI1NSwtMjU2LDI1NSwtMjU2LDI1NV0pKSxBKWZvcih1PTA7dTx5Oylmb3IoZD0wLGY9MDtkPGI7ZCsrLHUrKyxmKz0yKXdbdV09KHdbdV0qQVtmXT4+OCkrQVtmKzFdO3JldHVybiB3fWdldCBfaXNDb2xvckNvbnZlcnNpb25OZWVkZWQoKXtyZXR1cm4gdGhpcy5hZG9iZT8hIXRoaXMuYWRvYmUudHJhbnNmb3JtQ29kZTozPT09dGhpcy5udW1Db21wb25lbnRzPzAhPT10aGlzLl9jb2xvclRyYW5zZm9ybSYmKDgyIT09dGhpcy5jb21wb25lbnRzWzBdLmluZGV4fHw3MSE9PXRoaXMuY29tcG9uZW50c1sxXS5pbmRleHx8NjYhPT10aGlzLmNvbXBvbmVudHNbMl0uaW5kZXgpOjE9PT10aGlzLl9jb2xvclRyYW5zZm9ybX1fY29udmVydFljY1RvUmdiKGUpe2xldCB0LHIsbjtmb3IobGV0IGE9MCxpPWUubGVuZ3RoO2E8aTthKz0zKXQ9ZVthXSxyPWVbYSsxXSxuPWVbYSsyXSxlW2FdPXQtMTc5LjQ1NisxLjQwMipuLGVbYSsxXT10KzEzNS40NTktLjM0NCpyLS43MTQqbixlW2ErMl09dC0yMjYuODE2KzEuNzcyKnI7cmV0dXJuIGV9X2NvbnZlcnRZY2NUb1JnYmEoZSx0KXtmb3IobGV0IHI9MCxuPTAsYT1lLmxlbmd0aDtyPGE7cis9MyxuKz00KXtjb25zdCBhPWVbcl0saT1lW3IrMV0scz1lW3IrMl07dFtuXT1hLTE3OS40NTYrMS40MDIqcyx0W24rMV09YSsxMzUuNDU5LS4zNDQqaS0uNzE0KnMsdFtuKzJdPWEtMjI2LjgxNisxLjc3MippLHRbbiszXT0yNTV9cmV0dXJuIHR9X2NvbnZlcnRZY2NrVG9SZ2IoZSl7bGV0IHQscixuLGEsaT0wO2ZvcihsZXQgcz0wLG89ZS5sZW5ndGg7czxvO3MrPTQpdD1lW3NdLHI9ZVtzKzFdLG49ZVtzKzJdLGE9ZVtzKzNdLGVbaSsrXT1yKigtNjYwNjM1NjY5NDIwMzY0ZS0xOSpyKy4wMDA0MzcxMzA0NzU5MjYyMzIqbi01NDA4MDYxMDA2NDU5OWUtMTgqdCsuMDAwNDg0NDk3OTcxMjAyODEqYS0uMTU0MzYyMTUxODcxMTI2KS0xMjIuNjcxOTU0MDY4OTQrbiooLS4wMDA5NTc5NjQzNzg0NDU3NzMqbisuMDAwODE3MDc2OTExMzQ2NjI1KnQtLjAwNDc3MjcxNDA1NDA4NzQ3KmErMS41MzM4MDI1MzIyMTczNCkrdCooLjAwMDk2MTI1MDE4NDEzMDY4OCp0LS4wMDI2NjI1NzMzMjI4MzkzMyphKy40ODM1NzA4ODQ1MTI2NSkrYSooLS4wMDAzMzYxOTcxNzc2MTgzOTQqYSsuNDg0NzkxNTYxNDkwNzc2KSxlW2krK109MTA3LjI2ODAzOTM5NzcyNCtyKigyMTk5MjcxMDQ1MjU3NDFlLTE5KnItLjAwMDY0MDk5MjAxODI5Nzk0NSpuKy4wMDA2NTkzOTcwMDEyNDU1NzcqdCsuMDAwNDI2MTA1NjUyOTM4ODM3KmEtLjE3NjQ5MTc5MjQ2Mjg3NSkrbiooLS4wMDA3NzgyNjk5NDE1MTM2ODMqbisuMDAxMzA4NzIyNjE0MDgyNzUqdCsuMDAwNzcwNDgyNjMxODAxMTMyKmEtLjE1MTA1MTQ5Mjc3NTU2MikrdCooLjAwMTI2OTM1MzY4MTE0ODQzKnQtLjAwMjY1MDkwMTg5MDEwODk4KmErLjI1ODAyOTEwMjA2ODQ1KSthKigtLjAwMDMxODkxMzExNzU4ODMyOCphLS4yMTM3NDI0MDAzMjM2NjUpLGVbaSsrXT1yKigtLjAwMDU3MDExNTE5Njk3MzY3NypyLTI2MzQwOTA1MTAwNDU4OWUtMTkqbisuMDAyMDc0MTA4ODExNTAxMip0LS4wMDI4ODI2MDIzNjg1MzQ0MiphKy44MTQyNzI5NjgzNTkyOTUpLTIwLjgxMDAxMjU0Njk0NytuKigtMTUzNDk2MDU3NDQwOTc1ZS0xOSpuLS4wMDAxMzI2ODkwNDM5NjE0NDYqdCsuMDAwNTYwODMzNjkxMjQyODEyKmEtLjE5NTE1MjAyNzUzNDA0OSkrdCooLjAwMTc0NDE4MTMyOTI3NTgyKnQtLjAwMjU1MjQzMzIxNDM5MzQ3KmErLjExNjkzNTAyMDQ2NTE0NSkrYSooLS4wMDAzNDM1MzE5OTY1MTA1NTUqYSsuMjQxNjUyNjAyMzI0MDcpO3JldHVybiBlLnN1YmFycmF5KDAsaSl9X2NvbnZlcnRZY2NrVG9SZ2JhKGUpe2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrPTQpe2NvbnN0IHI9ZVt0XSxuPWVbdCsxXSxhPWVbdCsyXSxpPWVbdCszXTtlW3RdPW4qKC02NjA2MzU2Njk0MjAzNjRlLTE5Km4rLjAwMDQzNzEzMDQ3NTkyNjIzMiphLTU0MDgwNjEwMDY0NTk5ZS0xOCpyKy4wMDA0ODQ0OTc5NzEyMDI4MSppLS4xNTQzNjIxNTE4NzExMjYpLTEyMi42NzE5NTQwNjg5NCthKigtLjAwMDk1Nzk2NDM3ODQ0NTc3MyphKy4wMDA4MTcwNzY5MTEzNDY2MjUqci0uMDA0NzcyNzE0MDU0MDg3NDcqaSsxLjUzMzgwMjUzMjIxNzM0KStyKiguMDAwOTYxMjUwMTg0MTMwNjg4KnItLjAwMjY2MjU3MzMyMjgzOTMzKmkrLjQ4MzU3MDg4NDUxMjY1KStpKigtLjAwMDMzNjE5NzE3NzYxODM5NCppKy40ODQ3OTE1NjE0OTA3NzYpLGVbdCsxXT0xMDcuMjY4MDM5Mzk3NzI0K24qKDIxOTkyNzEwNDUyNTc0MWUtMTkqbi0uMDAwNjQwOTkyMDE4Mjk3OTQ1KmErLjAwMDY1OTM5NzAwMTI0NTU3NypyKy4wMDA0MjYxMDU2NTI5Mzg4MzcqaS0uMTc2NDkxNzkyNDYyODc1KSthKigtLjAwMDc3ODI2OTk0MTUxMzY4MyphKy4wMDEzMDg3MjI2MTQwODI3NSpyKy4wMDA3NzA0ODI2MzE4MDExMzIqaS0uMTUxMDUxNDkyNzc1NTYyKStyKiguMDAxMjY5MzUzNjgxMTQ4NDMqci0uMDAyNjUwOTAxODkwMTA4OTgqaSsuMjU4MDI5MTAyMDY4NDUpK2kqKC0uMDAwMzE4OTEzMTE3NTg4MzI4KmktLjIxMzc0MjQwMDMyMzY2NSksZVt0KzJdPW4qKC0uMDAwNTcwMTE1MTk2OTczNjc3Km4tMjYzNDA5MDUxMDA0NTg5ZS0xOSphKy4wMDIwNzQxMDg4MTE1MDEyKnItLjAwMjg4MjYwMjM2ODUzNDQyKmkrLjgxNDI3Mjk2ODM1OTI5NSktMjAuODEwMDEyNTQ2OTQ3K2EqKC0xNTM0OTYwNTc0NDA5NzVlLTE5KmEtLjAwMDEzMjY4OTA0Mzk2MTQ0NipyKy4wMDA1NjA4MzM2OTEyNDI4MTIqaS0uMTk1MTUyMDI3NTM0MDQ5KStyKiguMDAxNzQ0MTgxMzI5Mjc1ODIqci0uMDAyNTUyNDMzMjE0MzkzNDcqaSsuMTE2OTM1MDIwNDY1MTQ1KStpKigtLjAwMDM0MzUzMTk5NjUxMDU1NSppKy4yNDE2NTI2MDIzMjQwNyksZVt0KzNdPTI1NX1yZXR1cm4gZX1fY29udmVydFljY2tUb0NteWsoZSl7bGV0IHQscixuO2ZvcihsZXQgYT0wLGk9ZS5sZW5ndGg7YTxpO2ErPTQpdD1lW2FdLHI9ZVthKzFdLG49ZVthKzJdLGVbYV09NDM0LjQ1Ni10LTEuNDAyKm4sZVthKzFdPTExOS41NDEtdCsuMzQ0KnIrLjcxNCpuLGVbYSsyXT00ODEuODE2LXQtMS43NzIqcjtyZXR1cm4gZX1fY29udmVydENteWtUb1JnYihlKXtsZXQgdCxyLG4sYSxpPTA7Zm9yKGxldCBzPTAsbz1lLmxlbmd0aDtzPG87cys9NCl0PWVbc10scj1lW3MrMV0sbj1lW3MrMl0sYT1lW3MrM10sZVtpKytdPTI1NSt0KigtNjc0NzE0NzA3MzYwMjQ0MWUtMjAqdCsuMDAwODM3OTI2MjEyMTAxMzcyNypyKy4wMDAyODk0NzE4MTg4NjQzMjk0Km4rLjAwMzI2NDIzMTA1NzUzNzgwNiphLTEuMTE4NTYxMTg2NzIwMzkzNykrciooMjYzNzQxMDc2MTYwODk0MDVlLTIxKnItODYyNjk0OTE1ODYzODU3MmUtMjAqbi0uMDAwMjc0ODc2OTA2NzQ5OTQ5MSphLS4wMjE1NTY4ODc5NDk3ODk2NykrbiooLTM4NzgwOTkyMTI4NjkzNjNlLTIwKm4tLjAwMDMyNjc4MDgyNzk0ODUyODYqYSsuMDY4Njc0MjIzODU5NTM0NSktYSooLjAwMDMzNjE5NzE3NzYxODM5MzcqYSsuNzQzMDY1OTE1MTM0MjI1NCksZVtpKytdPTI1NSt0KiguMDAwMTM1OTYzNzI4MTM1ODg4NDgqdCsuMDAwOTI0NTM3MTMyNTczNTg1KnIrLjAwMDEwNTY3MzU5NjE4NjgzNTkzKm4rLjAwMDQ3OTE4NjQ2ODc0MzY1MTIqYS0uMzEwOTY4OTU4NzUxNTg3NSkrciooLS4wMDAyMzU0NTM0NjEwODM3MDM0NCpyKy4wMDAyNzAyODQ1MjUzNTM0NzE0Km4rLjAwMjAyMDAzMDg5NzczMDcxNTYqYS0uNzQ4ODA1MjE2NzAxNTQ5NCkrbiooNjgzNDgxNTk5ODIzNTY2MmUtMjAqbisuMDAwMTUxNjg0NTIzNjM0NjA5NzMqYS0uMDk3NTE5Mjc3NzQ3Mjg5MzMpLWEqKC4wMDAzMTg5MTMxMTc1ODgzMjgxKmErLjczNjQ4ODM4MDc3MzMxNjgpLGVbaSsrXT0yNTUrdCooMTM1OTg2NTA0MTEzODUzMDdlLTIxKnQrLjAwMDEyNDIzOTU2MTc1NDkwODUxKnIrLjAwMDQ3NTE5ODUwOTc1ODM1ODkqbi0zNjcyOTMxNzQ3NjYzMDQyMmUtMjIqYS0uMDU1NjIxODY5ODAyNjQwMzQpK3IqKC4wMDAxNjE0MTM4MDU5ODcyNDY3NipyKy4wMDA5NjkyMjM5MTMwNzI1MTg2Km4rLjAwMDc3ODI2OTI0NTAwMzYyNTMqYS0uNDQwMTUyMzIzNjc1MjY0NjMpK24qKDUuMDY4ODgyOTE0MDY4NzY5ZS03Km4rLjAwMTc3NzgzNjkwMTEzNzUwNzEqYS0uNzU5MTQ1NDY0OTc0OTYwOSktYSooLjAwMDM0MzUzMTk5NjUxMDU1NTMqYSsuNzA2Mzc3MDE4NjE2MDE0NCk7cmV0dXJuIGUuc3ViYXJyYXkoMCxpKX1fY29udmVydENteWtUb1JnYmEoZSl7Zm9yKGxldCB0PTAscj1lLmxlbmd0aDt0PHI7dCs9NCl7Y29uc3Qgcj1lW3RdLG49ZVt0KzFdLGE9ZVt0KzJdLGk9ZVt0KzNdO2VbdF09MjU1K3IqKC02NzQ3MTQ3MDczNjAyNDQxZS0yMCpyKy4wMDA4Mzc5MjYyMTIxMDEzNzI3Km4rLjAwMDI4OTQ3MTgxODg2NDMyOTQqYSsuMDAzMjY0MjMxMDU3NTM3ODA2KmktMS4xMTg1NjExODY3MjAzOTM3KStuKigyNjM3NDEwNzYxNjA4OTQwNWUtMjEqbi04NjI2OTQ5MTU4NjM4NTcyZS0yMCphLS4wMDAyNzQ4NzY5MDY3NDk5NDkxKmktLjAyMTU1Njg4Nzk0OTc4OTY3KSthKigtMzg3ODA5OTIxMjg2OTM2M2UtMjAqYS0uMDAwMzI2NzgwODI3OTQ4NTI4NippKy4wNjg2NzQyMjM4NTk1MzQ1KS1pKiguMDAwMzM2MTk3MTc3NjE4MzkzNyppKy43NDMwNjU5MTUxMzQyMjU0KSxlW3QrMV09MjU1K3IqKC4wMDAxMzU5NjM3MjgxMzU4ODg0OCpyKy4wMDA5MjQ1MzcxMzI1NzM1ODUqbisuMDAwMTA1NjczNTk2MTg2ODM1OTMqYSsuMDAwNDc5MTg2NDY4NzQzNjUxMippLS4zMTA5Njg5NTg3NTE1ODc1KStuKigtLjAwMDIzNTQ1MzQ2MTA4MzcwMzQ0Km4rLjAwMDI3MDI4NDUyNTM1MzQ3MTQqYSsuMDAyMDIwMDMwODk3NzMwNzE1NippLS43NDg4MDUyMTY3MDE1NDk0KSthKig2ODM0ODE1OTk4MjM1NjYyZS0yMCphKy4wMDAxNTE2ODQ1MjM2MzQ2MDk3MyppLS4wOTc1MTkyNzc3NDcyODkzMyktaSooLjAwMDMxODkxMzExNzU4ODMyODEqaSsuNzM2NDg4MzgwNzczMzE2OCksZVt0KzJdPTI1NStyKigxMzU5ODY1MDQxMTM4NTMwN2UtMjEqcisuMDAwMTI0MjM5NTYxNzU0OTA4NTEqbisuMDAwNDc1MTk4NTA5NzU4MzU4OSphLTM2NzI5MzE3NDc2NjMwNDIyZS0yMippLS4wNTU2MjE4Njk4MDI2NDAzNCkrbiooLjAwMDE2MTQxMzgwNTk4NzI0Njc2Km4rLjAwMDk2OTIyMzkxMzA3MjUxODYqYSsuMDAwNzc4MjY5MjQ1MDAzNjI1MyppLS40NDAxNTIzMjM2NzUyNjQ2MykrYSooNS4wNjg4ODI5MTQwNjg3NjllLTcqYSsuMDAxNzc3ODM2OTAxMTM3NTA3MSppLS43NTkxNDU0NjQ5NzQ5NjA5KS1pKiguMDAwMzQzNTMxOTk2NTEwNTU1MyppKy43MDYzNzcwMTg2MTYwMTQ0KSxlW3QrM109MjU1fXJldHVybiBlfWdldERhdGEoZSl7bGV0e3dpZHRoOnQsaGVpZ2h0OnIsZm9yY2VSR0JBOm49ITEsZm9yY2VSR0I6aT0hMSxpc1NvdXJjZVBERjpvPSExfT1lO2lmKHRoaXMubnVtQ29tcG9uZW50cz40KXRocm93IG5ldyBzKCJVbnN1cHBvcnRlZCBjb2xvciBtb2RlIik7Y29uc3QgYz10aGlzLl9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHQscixvKTtpZigxPT09dGhpcy5udW1Db21wb25lbnRzJiYobnx8aSkpe2NvbnN0IGU9Yy5sZW5ndGgqKG4/NDozKSx0PW5ldyBVaW50OENsYW1wZWRBcnJheShlKTtsZXQgcj0wO2lmKG4pKDAsYS5ncmF5VG9SR0JBKShjLG5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlcikpO2Vsc2UgZm9yKGNvbnN0IGUgb2YgYyl0W3IrK109ZSx0W3IrK109ZSx0W3IrK109ZTtyZXR1cm4gdH1pZigzPT09dGhpcy5udW1Db21wb25lbnRzJiZ0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCl7aWYobil7Y29uc3QgZT1uZXcgVWludDhDbGFtcGVkQXJyYXkoYy5sZW5ndGgvMyo0KTtyZXR1cm4gdGhpcy5fY29udmVydFljY1RvUmdiYShjLGUpfXJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2IoYyl9aWYoND09PXRoaXMubnVtQ29tcG9uZW50cyl7aWYodGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpcmV0dXJuIG4/dGhpcy5fY29udmVydFljY2tUb1JnYmEoYyk6aT90aGlzLl9jb252ZXJ0WWNja1RvUmdiKGMpOnRoaXMuX2NvbnZlcnRZY2NrVG9DbXlrKGMpO2lmKG4pcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2JhKGMpO2lmKGkpcmV0dXJuIHRoaXMuX2NvbnZlcnRDbXlrVG9SZ2IoYyl9cmV0dXJuIGN9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBPWEsdC5jb252ZXJ0VG9SR0JBPWZ1bmN0aW9uKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2Ugbi5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA6cmV0dXJuIGEoZSk7Y2FzZSBuLkltYWdlS2luZC5SR0JfMjRCUFA6cmV0dXJuIGZ1bmN0aW9uKGUpe2xldHtzcmM6dCxzcmNQb3M6cj0wLGRlc3Q6YSxkZXN0UG9zOmk9MCx3aWR0aDpzLGhlaWdodDpvfT1lLGM9MDtjb25zdCBsPXQubGVuZ3RoPj4yLGg9bmV3IFVpbnQzMkFycmF5KHQuYnVmZmVyLHIsbCk7aWYobi5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbil7Zm9yKDtjPGwtMjtjKz0zLGkrPTQpe2NvbnN0IGU9aFtjXSx0PWhbYysxXSxyPWhbYysyXTthW2ldPTQyNzgxOTAwODB8ZSxhW2krMV09ZT4+PjI0fHQ8PDh8NDI3ODE5MDA4MCxhW2krMl09dD4+PjE2fHI8PDE2fDQyNzgxOTAwODAsYVtpKzNdPXI+Pj44fDQyNzgxOTAwODB9Zm9yKGxldCBlPTQqYyxyPXQubGVuZ3RoO2U8cjtlKz0zKWFbaSsrXT10W2VdfHRbZSsxXTw8OHx0W2UrMl08PDE2fDQyNzgxOTAwODB9ZWxzZXtmb3IoO2M8bC0yO2MrPTMsaSs9NCl7Y29uc3QgZT1oW2NdLHQ9aFtjKzFdLHI9aFtjKzJdO2FbaV09MjU1fGUsYVtpKzFdPWU8PDI0fHQ+Pj44fDI1NSxhW2krMl09dDw8MTZ8cj4+PjE2fDI1NSxhW2krM109cjw8OHwyNTV9Zm9yKGxldCBlPTQqYyxyPXQubGVuZ3RoO2U8cjtlKz0zKWFbaSsrXT10W2VdPDwyNHx0W2UrMV08PDE2fHRbZSsyXTw8OHwyNTV9cmV0dXJue3NyY1BvczpyLGRlc3RQb3M6aX19KGUpfXJldHVybiBudWxsfSx0LmdyYXlUb1JHQkE9ZnVuY3Rpb24oZSx0KXtpZihuLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKWZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl0W3JdPTY1NzkzKmVbcl18NDI3ODE5MDA4MDtlbHNlIGZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl0W3JdPTE2ODQzMDA4KmVbcl18MjU1fSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpO2Z1bmN0aW9uIGEoZSl7bGV0e3NyYzp0LHNyY1BvczpyPTAsZGVzdDphLHdpZHRoOmksaGVpZ2h0OnMsbm9uQmxhY2tDb2xvcjpvPTQyOTQ5NjcyOTUsaW52ZXJzZURlY29kZTpjPSExfT1lO2NvbnN0IGw9bi5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbj80Mjc4MTkwMDgwOjI1NSxbaCx1XT1jP1tvLGxdOltsLG9dLGQ9aT4+MyxmPTcmaSxnPXQubGVuZ3RoO2E9bmV3IFVpbnQzMkFycmF5KGEuYnVmZmVyKTtsZXQgcD0wO2ZvcihsZXQgZT0wO2U8cztlKyspe2Zvcihjb25zdCBlPXIrZDtyPGU7cisrKXtjb25zdCBlPXI8Zz90W3JdOjI1NTthW3ArK109MTI4JmU/dTpoLGFbcCsrXT02NCZlP3U6aCxhW3ArK109MzImZT91OmgsYVtwKytdPTE2JmU/dTpoLGFbcCsrXT04JmU/dTpoLGFbcCsrXT00JmU/dTpoLGFbcCsrXT0yJmU/dTpoLGFbcCsrXT0xJmU/dTpofWlmKDA9PT1mKWNvbnRpbnVlO2NvbnN0IGU9cjxnP3RbcisrXToyNTU7Zm9yKGxldCB0PTA7dDxmO3QrKylhW3ArK109ZSYxPDw3LXQ/dTpofXJldHVybntzcmNQb3M6cixkZXN0UG9zOnB9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkpweFN0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTY4KSxhPXIoMTgwKSxpPXIoMTQ0KTtjbGFzcyBzIGV4dGVuZHMgbi5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKHQpLHRoaXMuc3RyZWFtPWUsdGhpcy5kaWN0PWUuZGljdCx0aGlzLm1heWJlTGVuZ3RoPXQsdGhpcy5wYXJhbXM9cn1nZXQgYnl0ZXMoKXtyZXR1cm4oMCxpLnNoYWRvdykodGhpcywiYnl0ZXMiLHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKX1lbnN1cmVCdWZmZXIoZSl7fXJlYWRCbG9jaygpe2lmKHRoaXMuZW9mKXJldHVybjtjb25zdCBlPW5ldyBhLkpweEltYWdlO2UucGFyc2UodGhpcy5ieXRlcyk7Y29uc3QgdD1lLndpZHRoLHI9ZS5oZWlnaHQsbj1lLmNvbXBvbmVudHNDb3VudCxpPWUudGlsZXMubGVuZ3RoO2lmKDE9PT1pKXRoaXMuYnVmZmVyPWUudGlsZXNbMF0uaXRlbXM7ZWxzZXtjb25zdCBhPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KnIqbik7Zm9yKGxldCByPTA7cjxpO3IrKyl7Y29uc3QgaT1lLnRpbGVzW3JdLHM9aS53aWR0aCxvPWkuaGVpZ2h0LGM9aS5sZWZ0LGw9aS50b3AsaD1pLml0ZW1zO2xldCB1PTAsZD0odCpsK2MpKm47Y29uc3QgZj10Km4sZz1zKm47Zm9yKGxldCBlPTA7ZTxvO2UrKyl7Y29uc3QgZT1oLnN1YmFycmF5KHUsdStnKTthLnNldChlLGQpLHUrPWcsZCs9Zn19dGhpcy5idWZmZXI9YX10aGlzLmJ1ZmZlckxlbmd0aD10aGlzLmJ1ZmZlci5sZW5ndGgsdGhpcy5lb2Y9ITB9fXQuSnB4U3RyZWFtPXN9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5KcHhJbWFnZT12b2lkIDAscigxMzkpLHIoMikscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTQ0KSxhPXIoMTQ5KSxzPXIoMTc1KTtjbGFzcyBvIGV4dGVuZHMgbi5CYXNlRXhjZXB0aW9ue2NvbnN0cnVjdG9yKGUpe3N1cGVyKCJKUFggZXJyb3I6ICIuY29uY2F0KGUpLCJKcHhFcnJvciIpfX1jb25zdCBjPXtMTDowLExIOjEsSEw6MSxISDoyfTtmdW5jdGlvbiBsKGUsdCl7ZS54MD1NYXRoLmNlaWwodC5YT3Npei9lLlhSc2l6KSxlLngxPU1hdGguY2VpbCh0LlhzaXovZS5YUnNpeiksZS55MD1NYXRoLmNlaWwodC5ZT3Npei9lLllSc2l6KSxlLnkxPU1hdGguY2VpbCh0LllzaXovZS5ZUnNpeiksZS53aWR0aD1lLngxLWUueDAsZS5oZWlnaHQ9ZS55MS1lLnkwfWZ1bmN0aW9uIGgoZSx0KXtjb25zdCByPWUuU0laLG49W107bGV0IGE7Y29uc3QgaT1NYXRoLmNlaWwoKHIuWHNpei1yLlhUT3Npeikvci5YVHNpeikscz1NYXRoLmNlaWwoKHIuWXNpei1yLllUT3Npeikvci5ZVHNpeik7Zm9yKGxldCBlPTA7ZTxzO2UrKylmb3IobGV0IHQ9MDt0PGk7dCsrKWE9e30sYS50eDA9TWF0aC5tYXgoci5YVE9zaXordCpyLlhUc2l6LHIuWE9zaXopLGEudHkwPU1hdGgubWF4KHIuWVRPc2l6K2Uqci5ZVHNpeixyLllPc2l6KSxhLnR4MT1NYXRoLm1pbihyLlhUT3NpeisodCsxKSpyLlhUc2l6LHIuWHNpeiksYS50eTE9TWF0aC5taW4oci5ZVE9zaXorKGUrMSkqci5ZVHNpeixyLllzaXopLGEud2lkdGg9YS50eDEtYS50eDAsYS5oZWlnaHQ9YS50eTEtYS50eTAsYS5jb21wb25lbnRzPVtdLG4ucHVzaChhKTtlLnRpbGVzPW47Zm9yKGxldCBlPTAsaT1yLkNzaXo7ZTxpO2UrKyl7Y29uc3Qgcj10W2VdO2ZvcihsZXQgdD0wLGk9bi5sZW5ndGg7dDxpO3QrKyl7Y29uc3QgaT17fTthPW5bdF0saS50Y3gwPU1hdGguY2VpbChhLnR4MC9yLlhSc2l6KSxpLnRjeTA9TWF0aC5jZWlsKGEudHkwL3IuWVJzaXopLGkudGN4MT1NYXRoLmNlaWwoYS50eDEvci5YUnNpeiksaS50Y3kxPU1hdGguY2VpbChhLnR5MS9yLllSc2l6KSxpLndpZHRoPWkudGN4MS1pLnRjeDAsaS5oZWlnaHQ9aS50Y3kxLWkudGN5MCxhLmNvbXBvbmVudHNbZV09aX19fWZ1bmN0aW9uIHUoZSx0LHIpe2NvbnN0IG49dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMsYT17fTtyZXR1cm4gbi5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzPyhhLlBQeD1uLnByZWNpbmN0c1NpemVzW3JdLlBQeCxhLlBQeT1uLnByZWNpbmN0c1NpemVzW3JdLlBQeSk6KGEuUFB4PTE1LGEuUFB5PTE1KSxhLnhjYl89cj4wP01hdGgubWluKG4ueGNiLGEuUFB4LTEpOk1hdGgubWluKG4ueGNiLGEuUFB4KSxhLnljYl89cj4wP01hdGgubWluKG4ueWNiLGEuUFB5LTEpOk1hdGgubWluKG4ueWNiLGEuUFB5KSxhfWZ1bmN0aW9uIGQoZSx0LHIpe2NvbnN0IG49MTw8ci5QUHgsYT0xPDxyLlBQeSxpPTA9PT10LnJlc0xldmVsLHM9MTw8ci5QUHgrKGk/MDotMSksbz0xPDxyLlBQeSsoaT8wOi0xKSxjPXQudHJ4MT50LnRyeDA/TWF0aC5jZWlsKHQudHJ4MS9uKS1NYXRoLmZsb29yKHQudHJ4MC9uKTowLGw9dC50cnkxPnQudHJ5MD9NYXRoLmNlaWwodC50cnkxL2EpLU1hdGguZmxvb3IodC50cnkwL2EpOjAsaD1jKmw7dC5wcmVjaW5jdFBhcmFtZXRlcnM9e3ByZWNpbmN0V2lkdGg6bixwcmVjaW5jdEhlaWdodDphLG51bXByZWNpbmN0c3dpZGU6YyxudW1wcmVjaW5jdHNoaWdoOmwsbnVtcHJlY2luY3RzOmgscHJlY2luY3RXaWR0aEluU3ViYmFuZDpzLHByZWNpbmN0SGVpZ2h0SW5TdWJiYW5kOm99fWZ1bmN0aW9uIGYoZSx0LHIpe2NvbnN0IG49ci54Y2JfLGE9ci55Y2JfLGk9MTw8bixzPTE8PGEsbz10LnRieDA+Pm4sYz10LnRieTA+PmEsbD10LnRieDEraS0xPj5uLGg9dC50YnkxK3MtMT4+YSx1PXQucmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMsZD1bXSxmPVtdO2xldCBnLHAsbSxiO2ZvcihwPWM7cDxoO3ArKylmb3IoZz1vO2c8bDtnKyspe2lmKG09e2NieDpnLGNieTpwLHRieDA6aSpnLHRieTA6cypwLHRieDE6aSooZysxKSx0YnkxOnMqKHArMSl9LG0udGJ4MF89TWF0aC5tYXgodC50YngwLG0udGJ4MCksbS50YnkwXz1NYXRoLm1heCh0LnRieTAsbS50YnkwKSxtLnRieDFfPU1hdGgubWluKHQudGJ4MSxtLnRieDEpLG0udGJ5MV89TWF0aC5taW4odC50YnkxLG0udGJ5MSksYj1NYXRoLmZsb29yKChtLnRieDBfLXQudGJ4MCkvdS5wcmVjaW5jdFdpZHRoSW5TdWJiYW5kKStNYXRoLmZsb29yKChtLnRieTBfLXQudGJ5MCkvdS5wcmVjaW5jdEhlaWdodEluU3ViYmFuZCkqdS5udW1wcmVjaW5jdHN3aWRlLG0ucHJlY2luY3ROdW1iZXI9YixtLnN1YmJhbmRUeXBlPXQudHlwZSxtLkxibG9jaz0zLG0udGJ4MV88PW0udGJ4MF98fG0udGJ5MV88PW0udGJ5MF8pY29udGludWU7ZC5wdXNoKG0pO2xldCBlPWZbYl07dm9pZCAwIT09ZT8oZzxlLmNieE1pbj9lLmNieE1pbj1nOmc+ZS5jYnhNYXgmJihlLmNieE1heD1nKSxwPGUuY2J5TWluP2UuY2J4TWluPXA6cD5lLmNieU1heCYmKGUuY2J5TWF4PXApKTpmW2JdPWU9e2NieE1pbjpnLGNieU1pbjpwLGNieE1heDpnLGNieU1heDpwfSxtLnByZWNpbmN0PWV9dC5jb2RlYmxvY2tQYXJhbWV0ZXJzPXtjb2RlYmxvY2tXaWR0aDpuLGNvZGVibG9ja0hlaWdodDphLG51bWNvZGVibG9ja3dpZGU6bC1vKzEsbnVtY29kZWJsb2NraGlnaDpoLWMrMX0sdC5jb2RlYmxvY2tzPWQsdC5wcmVjaW5jdHM9Zn1mdW5jdGlvbiBnKGUsdCxyKXtjb25zdCBuPVtdLGE9ZS5zdWJiYW5kcztmb3IobGV0IGU9MCxyPWEubGVuZ3RoO2U8cjtlKyspe2NvbnN0IHI9YVtlXS5jb2RlYmxvY2tzO2ZvcihsZXQgZT0wLGE9ci5sZW5ndGg7ZTxhO2UrKyl7Y29uc3QgYT1yW2VdO2EucHJlY2luY3ROdW1iZXI9PT10JiZuLnB1c2goYSl9fXJldHVybntsYXllck51bWJlcjpyLGNvZGVibG9ja3M6bn19ZnVuY3Rpb24gcChlKXtjb25zdCB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxuPWUudGlsZXNbcl0sYT1uLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsaT10LkNzaXo7bGV0IHM9MDtmb3IobGV0IGU9MDtlPGk7ZSsrKXM9TWF0aC5tYXgocyxuLmNvbXBvbmVudHNbZV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7bGV0IGM9MCxsPTAsaD0wLHU9MDt0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24oKXtmb3IoO2M8YTtjKyspe2Zvcig7bDw9cztsKyspe2Zvcig7aDxpO2grKyl7Y29uc3QgZT1uLmNvbXBvbmVudHNbaF07aWYobD5lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpY29udGludWU7Y29uc3QgdD1lLnJlc29sdXRpb25zW2xdLHI9dC5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO2Zvcig7dTxyOyl7Y29uc3QgZT1nKHQsdSxjKTtyZXR1cm4gdSsrLGV9dT0wfWg9MH1sPTB9dGhyb3cgbmV3IG8oIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIG0oZSl7Y29uc3QgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsbj1lLnRpbGVzW3JdLGE9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLmxheWVyc0NvdW50LGk9dC5Dc2l6O2xldCBzPTA7Zm9yKGxldCBlPTA7ZTxpO2UrKylzPU1hdGgubWF4KHMsbi5jb21wb25lbnRzW2VdLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpO2xldCBjPTAsbD0wLGg9MCx1PTA7dGhpcy5uZXh0UGFja2V0PWZ1bmN0aW9uKCl7Zm9yKDtjPD1zO2MrKyl7Zm9yKDtsPGE7bCsrKXtmb3IoO2g8aTtoKyspe2NvbnN0IGU9bi5jb21wb25lbnRzW2hdO2lmKGM+ZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KWNvbnRpbnVlO2NvbnN0IHQ9ZS5yZXNvbHV0aW9uc1tjXSxyPXQucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cztmb3IoO3U8cjspe2NvbnN0IGU9Zyh0LHUsbCk7cmV0dXJuIHUrKyxlfXU9MH1oPTB9bD0wfXRocm93IG5ldyBvKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiBiKGUpe2NvbnN0IHQ9ZS5TSVoscj1lLmN1cnJlbnRUaWxlLmluZGV4LG49ZS50aWxlc1tyXSxhPW4uY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxpPXQuQ3NpejtsZXQgcyxjLGwsaCx1PTA7Zm9yKGw9MDtsPGk7bCsrKXtjb25zdCBlPW4uY29tcG9uZW50c1tsXTt1PU1hdGgubWF4KHUsZS5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KX1jb25zdCBkPW5ldyBJbnQzMkFycmF5KHUrMSk7Zm9yKGM9MDtjPD11OysrYyl7bGV0IGU9MDtmb3IobD0wO2w8aTsrK2wpe2NvbnN0IHQ9bi5jb21wb25lbnRzW2xdLnJlc29sdXRpb25zO2M8dC5sZW5ndGgmJihlPU1hdGgubWF4KGUsdFtjXS5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzKSl9ZFtjXT1lfXM9MCxjPTAsbD0wLGg9MCx0aGlzLm5leHRQYWNrZXQ9ZnVuY3Rpb24oKXtmb3IoO2M8PXU7YysrKXtmb3IoO2g8ZFtjXTtoKyspe2Zvcig7bDxpO2wrKyl7Y29uc3QgZT1uLmNvbXBvbmVudHNbbF07aWYoYz5lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpY29udGludWU7Y29uc3QgdD1lLnJlc29sdXRpb25zW2NdLHI9dC5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzO2lmKCEoaD49cikpe2Zvcig7czxhOyl7Y29uc3QgZT1nKHQsaCxzKTtyZXR1cm4gcysrLGV9cz0wfX1sPTB9aD0wfXRocm93IG5ldyBvKCJPdXQgb2YgcGFja2V0cyIpfX1mdW5jdGlvbiB5KGUpe2NvbnN0IHQ9ZS5TSVoscj1lLmN1cnJlbnRUaWxlLmluZGV4LG49ZS50aWxlc1tyXSxhPW4uY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudCxpPXQuQ3NpeixzPXgobiksYz1zO2xldCBsPTAsaD0wLHU9MCxkPTAsZj0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbigpe2Zvcig7ZjxjLm1heE51bUhpZ2g7ZisrKXtmb3IoO2Q8Yy5tYXhOdW1XaWRlO2QrKyl7Zm9yKDt1PGk7dSsrKXtjb25zdCBlPW4uY29tcG9uZW50c1t1XSx0PWUuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDtmb3IoO2g8PXQ7aCsrKXtjb25zdCB0PWUucmVzb2x1dGlvbnNbaF0scj1zLmNvbXBvbmVudHNbdV0ucmVzb2x1dGlvbnNbaF0sbj12KGQsZixyLGMsdCk7aWYobnVsbCE9PW4pe2Zvcig7bDxhOyl7Y29uc3QgZT1nKHQsbixsKTtyZXR1cm4gbCsrLGV9bD0wfX1oPTB9dT0wfWQ9MH10aHJvdyBuZXcgbygiT3V0IG9mIHBhY2tldHMiKX19ZnVuY3Rpb24gdyhlKXtjb25zdCB0PWUuU0laLHI9ZS5jdXJyZW50VGlsZS5pbmRleCxuPWUudGlsZXNbcl0sYT1uLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQsaT10LkNzaXoscz14KG4pO2xldCBjPTAsbD0wLGg9MCx1PTAsZD0wO3RoaXMubmV4dFBhY2tldD1mdW5jdGlvbigpe2Zvcig7aDxpOysraCl7Y29uc3QgZT1uLmNvbXBvbmVudHNbaF0sdD1zLmNvbXBvbmVudHNbaF0scj1lLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7Zm9yKDtkPHQubWF4TnVtSGlnaDtkKyspe2Zvcig7dTx0Lm1heE51bVdpZGU7dSsrKXtmb3IoO2w8PXI7bCsrKXtjb25zdCByPWUucmVzb2x1dGlvbnNbbF0sbj10LnJlc29sdXRpb25zW2xdLGk9dih1LGQsbix0LHIpO2lmKG51bGwhPT1pKXtmb3IoO2M8YTspe2NvbnN0IGU9ZyhyLGksYyk7cmV0dXJuIGMrKyxlfWM9MH19bD0wfXU9MH1kPTB9dGhyb3cgbmV3IG8oIk91dCBvZiBwYWNrZXRzIil9fWZ1bmN0aW9uIHYoZSx0LHIsbixhKXtjb25zdCBpPWUqbi5taW5XaWR0aCxzPXQqbi5taW5IZWlnaHQ7aWYoaSVyLndpZHRoIT0wfHxzJXIuaGVpZ2h0IT0wKXJldHVybiBudWxsO2NvbnN0IG89cy9yLndpZHRoKmEucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7cmV0dXJuIGkvci5oZWlnaHQrb31mdW5jdGlvbiB4KGUpe2NvbnN0IHQ9ZS5jb21wb25lbnRzLmxlbmd0aDtsZXQgcj1OdW1iZXIuTUFYX1ZBTFVFLG49TnVtYmVyLk1BWF9WQUxVRSxhPTAsaT0wO2NvbnN0IHM9bmV3IEFycmF5KHQpO2ZvcihsZXQgbz0wO288dDtvKyspe2NvbnN0IHQ9ZS5jb21wb25lbnRzW29dLGM9dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50LGw9bmV3IEFycmF5KGMrMSk7bGV0IGg9TnVtYmVyLk1BWF9WQUxVRSx1PU51bWJlci5NQVhfVkFMVUUsZD0wLGY9MCxnPTE7Zm9yKGxldCBlPWM7ZT49MDstLWUpe2NvbnN0IHI9dC5yZXNvbHV0aW9uc1tlXSxuPWcqci5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aCxhPWcqci5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHQ7aD1NYXRoLm1pbihoLG4pLHU9TWF0aC5taW4odSxhKSxkPU1hdGgubWF4KGQsci5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZSksZj1NYXRoLm1heChmLHIucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c2hpZ2gpLGxbZV09e3dpZHRoOm4saGVpZ2h0OmF9LGc8PD0xfXI9TWF0aC5taW4ocixoKSxuPU1hdGgubWluKG4sdSksYT1NYXRoLm1heChhLGQpLGk9TWF0aC5tYXgoaSxmKSxzW29dPXtyZXNvbHV0aW9uczpsLG1pbldpZHRoOmgsbWluSGVpZ2h0OnUsbWF4TnVtV2lkZTpkLG1heE51bUhpZ2g6Zn19cmV0dXJue2NvbXBvbmVudHM6cyxtaW5XaWR0aDpyLG1pbkhlaWdodDpuLG1heE51bVdpZGU6YSxtYXhOdW1IaWdoOml9fWZ1bmN0aW9uIFMoZSl7Y29uc3QgdD1lLlNJWixyPWUuY3VycmVudFRpbGUuaW5kZXgsbj1lLnRpbGVzW3JdLGE9dC5Dc2l6O2ZvcihsZXQgZT0wO2U8YTtlKyspe2NvbnN0IHQ9bi5jb21wb25lbnRzW2VdLHI9dC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50LGE9W10saT1bXTtmb3IobGV0IGU9MDtlPD1yO2UrKyl7Y29uc3Qgbj11KDAsdCxlKSxzPXt9LG89MTw8ci1lO2xldCBjO2lmKHMudHJ4MD1NYXRoLmNlaWwodC50Y3gwL28pLHMudHJ5MD1NYXRoLmNlaWwodC50Y3kwL28pLHMudHJ4MT1NYXRoLmNlaWwodC50Y3gxL28pLHMudHJ5MT1NYXRoLmNlaWwodC50Y3kxL28pLHMucmVzTGV2ZWw9ZSxkKDAscyxuKSxhLnB1c2gocyksMD09PWUpYz17fSxjLnR5cGU9IkxMIixjLnRieDA9TWF0aC5jZWlsKHQudGN4MC9vKSxjLnRieTA9TWF0aC5jZWlsKHQudGN5MC9vKSxjLnRieDE9TWF0aC5jZWlsKHQudGN4MS9vKSxjLnRieTE9TWF0aC5jZWlsKHQudGN5MS9vKSxjLnJlc29sdXRpb249cyxmKDAsYyxuKSxpLnB1c2goYykscy5zdWJiYW5kcz1bY107ZWxzZXtjb25zdCBhPTE8PHItZSsxLG89W107Yz17fSxjLnR5cGU9IkhMIixjLnRieDA9TWF0aC5jZWlsKHQudGN4MC9hLS41KSxjLnRieTA9TWF0aC5jZWlsKHQudGN5MC9hKSxjLnRieDE9TWF0aC5jZWlsKHQudGN4MS9hLS41KSxjLnRieTE9TWF0aC5jZWlsKHQudGN5MS9hKSxjLnJlc29sdXRpb249cyxmKDAsYyxuKSxpLnB1c2goYyksby5wdXNoKGMpLGM9e30sYy50eXBlPSJMSCIsYy50YngwPU1hdGguY2VpbCh0LnRjeDAvYSksYy50YnkwPU1hdGguY2VpbCh0LnRjeTAvYS0uNSksYy50YngxPU1hdGguY2VpbCh0LnRjeDEvYSksYy50YnkxPU1hdGguY2VpbCh0LnRjeTEvYS0uNSksYy5yZXNvbHV0aW9uPXMsZigwLGMsbiksaS5wdXNoKGMpLG8ucHVzaChjKSxjPXt9LGMudHlwZT0iSEgiLGMudGJ4MD1NYXRoLmNlaWwodC50Y3gwL2EtLjUpLGMudGJ5MD1NYXRoLmNlaWwodC50Y3kwL2EtLjUpLGMudGJ4MT1NYXRoLmNlaWwodC50Y3gxL2EtLjUpLGMudGJ5MT1NYXRoLmNlaWwodC50Y3kxL2EtLjUpLGMucmVzb2x1dGlvbj1zLGYoMCxjLG4pLGkucHVzaChjKSxvLnB1c2goYykscy5zdWJiYW5kcz1vfX10LnJlc29sdXRpb25zPWEsdC5zdWJiYW5kcz1pfWNvbnN0IGk9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7c3dpdGNoKGkpe2Nhc2UgMDpuLnBhY2tldHNJdGVyYXRvcj1uZXcgcChlKTticmVhaztjYXNlIDE6bi5wYWNrZXRzSXRlcmF0b3I9bmV3IG0oZSk7YnJlYWs7Y2FzZSAyOm4ucGFja2V0c0l0ZXJhdG9yPW5ldyBiKGUpO2JyZWFrO2Nhc2UgMzpuLnBhY2tldHNJdGVyYXRvcj1uZXcgeShlKTticmVhaztjYXNlIDQ6bi5wYWNrZXRzSXRlcmF0b3I9bmV3IHcoZSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbygiVW5zdXBwb3J0ZWQgcHJvZ3Jlc3Npb24gb3JkZXIgIi5jb25jYXQoaSkpfX1mdW5jdGlvbiBBKGUsdCxyLG4pe2xldCBpLHM9MCxjPTAsbD0hMTtmdW5jdGlvbiBoKGUpe2Zvcig7YzxlOyl7Y29uc3QgZT10W3Irc107cysrLGw/KGk9aTw8N3xlLGMrPTcsbD0hMSk6KGk9aTw8OHxlLGMrPTgpLDI1NT09PWUmJihsPSEwKX1yZXR1cm4gYy09ZSxpPj4+YyYoMTw8ZSktMX1mdW5jdGlvbiB1KGUpe3JldHVybiAyNTU9PT10W3Ircy0xXSYmdFtyK3NdPT09ZT8oZCgxKSwhMCk6MjU1PT09dFtyK3NdJiZ0W3IrcysxXT09PWUmJihkKDIpLCEwKX1mdW5jdGlvbiBkKGUpe3MrPWV9ZnVuY3Rpb24gZigpe2M9MCxsJiYocysrLGw9ITEpfWZ1bmN0aW9uIGcoKXtpZigwPT09aCgxKSlyZXR1cm4gMTtpZigwPT09aCgxKSlyZXR1cm4gMjtsZXQgZT1oKDIpO3JldHVybiBlPDM/ZSszOihlPWgoNSksZTwzMT9lKzY6KGU9aCg3KSxlKzM3KSl9Y29uc3QgcD1lLmN1cnJlbnRUaWxlLmluZGV4LG09ZS50aWxlc1twXSxiPWUuQ09ELnNvcE1hcmtlclVzZWQseT1lLkNPRC5lcGhNYXJrZXJVc2VkLHc9bS5wYWNrZXRzSXRlcmF0b3I7Zm9yKDtzPG47KXtmKCksYiYmdSgxNDUpJiZkKDQpO2NvbnN0IGU9dy5uZXh0UGFja2V0KCk7aWYoIWgoMSkpY29udGludWU7Y29uc3Qgbj1lLmxheWVyTnVtYmVyLGk9W107bGV0IGM7Zm9yKGxldCB0PTAscj1lLmNvZGVibG9ja3MubGVuZ3RoO3Q8cjt0Kyspe2M9ZS5jb2RlYmxvY2tzW3RdO2xldCByPWMucHJlY2luY3Q7Y29uc3Qgcz1jLmNieC1yLmNieE1pbixsPWMuY2J5LXIuY2J5TWluO2xldCB1LGQsZj0hMSxwPSExO2lmKHZvaWQgMCE9PWMuaW5jbHVkZWQpZj0hIWgoMSk7ZWxzZXtsZXQgZTtpZihyPWMucHJlY2luY3Qsdm9pZCAwIT09ci5pbmNsdXNpb25UcmVlKWU9ci5pbmNsdXNpb25UcmVlO2Vsc2V7Y29uc3QgdD1yLmNieE1heC1yLmNieE1pbisxLGE9ci5jYnlNYXgtci5jYnlNaW4rMTtlPW5ldyBJKHQsYSxuKSxkPW5ldyBGKHQsYSksci5pbmNsdXNpb25UcmVlPWUsci56ZXJvQml0UGxhbmVzVHJlZT1kO2ZvcihsZXQgZT0wO2U8bjtlKyspaWYoMCE9PWgoMSkpdGhyb3cgbmV3IG8oIkludmFsaWQgdGFnIHRyZWUiKX1pZihlLnJlc2V0KHMsbCxuKSlmb3IoOzspe2lmKCFoKDEpKXtlLmluY3JlbWVudFZhbHVlKG4pO2JyZWFrfWlmKHU9IWUubmV4dExldmVsKCksdSl7Yy5pbmNsdWRlZD0hMCxmPXA9ITA7YnJlYWt9fX1pZighZiljb250aW51ZTtpZihwKXtmb3IoZD1yLnplcm9CaXRQbGFuZXNUcmVlLGQucmVzZXQocyxsKTs7KWlmKGgoMSkpe2lmKHU9IWQubmV4dExldmVsKCksdSlicmVha31lbHNlIGQuaW5jcmVtZW50VmFsdWUoKTtjLnplcm9CaXRQbGFuZXM9ZC52YWx1ZX1jb25zdCBtPWcoKTtmb3IoO2goMSk7KWMuTGJsb2NrKys7Y29uc3QgYj0oMCxhLmxvZzIpKG0pLHk9aCgobTwxPDxiP2ItMTpiKStjLkxibG9jayk7aS5wdXNoKHtjb2RlYmxvY2s6Yyxjb2RpbmdwYXNzZXM6bSxkYXRhTGVuZ3RoOnl9KX1mb3IoZigpLHkmJnUoMTQ2KTtpLmxlbmd0aD4wOyl7Y29uc3QgZT1pLnNoaWZ0KCk7Yz1lLmNvZGVibG9jayx2b2lkIDA9PT1jLmRhdGEmJihjLmRhdGE9W10pLGMuZGF0YS5wdXNoKHtkYXRhOnQsc3RhcnQ6citzLGVuZDpyK3MrZS5kYXRhTGVuZ3RoLGNvZGluZ3Bhc3NlczplLmNvZGluZ3Bhc3Nlc30pLHMrPWUuZGF0YUxlbmd0aH19cmV0dXJuIHN9ZnVuY3Rpb24gayhlLHQscixuLGEsaSxvLGMsbCl7Y29uc3QgaD1uLnRieDAsdT1uLnRieTAsZD1uLnRieDEtbi50YngwLGY9bi5jb2RlYmxvY2tzLGc9IkgiPT09bi50eXBlLmNoYXJBdCgwKT8xOjAscD0iSCI9PT1uLnR5cGUuY2hhckF0KDEpP3Q6MDtmb3IobGV0IHI9MCxtPWYubGVuZ3RoO3I8bTsrK3Ipe2NvbnN0IG09ZltyXSxiPW0udGJ4MV8tbS50YngwXyx5PW0udGJ5MV8tbS50YnkwXztpZigwPT09Ynx8MD09PXkpY29udGludWU7aWYodm9pZCAwPT09bS5kYXRhKWNvbnRpbnVlO2NvbnN0IHc9bmV3IFQoYix5LG0uc3ViYmFuZFR5cGUsbS56ZXJvQml0UGxhbmVzLGkpO2xldCB2PTI7Y29uc3QgeD1tLmRhdGE7bGV0IFMsQSxrLEM9MCxPPTA7Zm9yKFM9MCxBPXgubGVuZ3RoO1M8QTtTKyspaz14W1NdLEMrPWsuZW5kLWsuc3RhcnQsTys9ay5jb2RpbmdwYXNzZXM7Y29uc3QgRj1uZXcgVWludDhBcnJheShDKTtsZXQgST0wO2ZvcihTPTAsQT14Lmxlbmd0aDtTPEE7UysrKXtrPXhbU107Y29uc3QgZT1rLmRhdGEuc3ViYXJyYXkoay5zdGFydCxrLmVuZCk7Ri5zZXQoZSxJKSxJKz1lLmxlbmd0aH1jb25zdCBNPW5ldyBzLkFyaXRobWV0aWNEZWNvZGVyKEYsMCxDKTtmb3Iody5zZXREZWNvZGVyKE0pLFM9MDtTPE87UysrKXtzd2l0Y2godil7Y2FzZSAwOncucnVuU2lnbmlmaWNhbmNlUHJvcGFnYXRpb25QYXNzKCk7YnJlYWs7Y2FzZSAxOncucnVuTWFnbml0dWRlUmVmaW5lbWVudFBhc3MoKTticmVhaztjYXNlIDI6dy5ydW5DbGVhbnVwUGFzcygpLGMmJncuY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKX1sJiZ3LnJlc2V0KCksdj0odisxKSUzfWxldCBFPW0udGJ4MF8taCsobS50YnkwXy11KSpkO2NvbnN0IFA9dy5jb2VmZmljZW50c1NpZ24sUj13LmNvZWZmaWNlbnRzTWFnbml0dWRlLE49dy5iaXRzRGVjb2RlZCxEPW8/MDouNTtsZXQgQixMLF87ST0wO2NvbnN0IGo9IkxMIiE9PW4udHlwZTtmb3IoUz0wO1M8eTtTKyspe2NvbnN0IHI9MiooRS9kfDApKih0LWQpK2crcDtmb3IoQj0wO0I8YjtCKyspTD1SW0ldLDAhPT1MJiYoTD0oTCtEKSphLDAhPT1QW0ldJiYoTD0tTCksXz1OW0ldLGVbaj9yKyhFPDwxKTpFXT1vJiZfPj1pP0w6TCooMTw8aS1fKSksRSsrLEkrKztFKz1kLWJ9fX1mdW5jdGlvbiBDKGUsdCxyKXtjb25zdCBuPXQuY29tcG9uZW50c1tyXSxhPW4uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLGk9bi5xdWFudGl6YXRpb25QYXJhbWV0ZXJzLHM9YS5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsbz1pLlNQcWNkcyxsPWkuc2NhbGFyRXhwb3VuZGVkLGg9aS5ndWFyZEJpdHMsdT1hLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQsZD1hLnJlc2V0Q29udGV4dFByb2JhYmlsaXRpZXMsZj1lLmNvbXBvbmVudHNbcl0ucHJlY2lzaW9uLGc9YS5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24scD1nP25ldyBQOm5ldyBFLG09W107bGV0IGI9MDtmb3IobGV0IGU9MDtlPD1zO2UrKyl7Y29uc3QgdD1uLnJlc29sdXRpb25zW2VdLHI9dC50cngxLXQudHJ4MCxhPXQudHJ5MS10LnRyeTAsaT1uZXcgRmxvYXQzMkFycmF5KHIqYSk7Zm9yKGxldCBuPTAsYT10LnN1YmJhbmRzLmxlbmd0aDtuPGE7bisrKXtsZXQgYSxzO2w/KGE9b1tiXS5tdSxzPW9bYl0uZXBzaWxvbixiKyspOihhPW9bMF0ubXUscz1vWzBdLmVwc2lsb24rKGU+MD8xLWU6MCkpO2NvbnN0IHA9dC5zdWJiYW5kc1tuXSxtPWNbcC50eXBlXTtrKGksciwwLHAsZz8xOjIqKihmK20tcykqKDErYS8yMDQ4KSxoK3MtMSxnLHUsZCl9bS5wdXNoKHt3aWR0aDpyLGhlaWdodDphLGl0ZW1zOml9KX1jb25zdCB5PXAuY2FsY3VsYXRlKG0sbi50Y3gwLG4udGN5MCk7cmV0dXJue2xlZnQ6bi50Y3gwLHRvcDpuLnRjeTAsd2lkdGg6eS53aWR0aCxoZWlnaHQ6eS5oZWlnaHQsaXRlbXM6eS5pdGVtc319ZnVuY3Rpb24gTyhlLHQpe2NvbnN0IHI9ZS5TSVouQ3NpeixuPWUudGlsZXNbdF07Zm9yKGxldCB0PTA7dDxyO3QrKyl7Y29uc3Qgcj1uLmNvbXBvbmVudHNbdF0sYT12b2lkIDAhPT1lLmN1cnJlbnRUaWxlLlFDQ1t0XT9lLmN1cnJlbnRUaWxlLlFDQ1t0XTplLmN1cnJlbnRUaWxlLlFDRDtyLnF1YW50aXphdGlvblBhcmFtZXRlcnM9YTtjb25zdCBpPXZvaWQgMCE9PWUuY3VycmVudFRpbGUuQ09DW3RdP2UuY3VycmVudFRpbGUuQ09DW3RdOmUuY3VycmVudFRpbGUuQ09EO3IuY29kaW5nU3R5bGVQYXJhbWV0ZXJzPWl9bi5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzPWUuY3VycmVudFRpbGUuQ09EfXQuSnB4SW1hZ2U9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmZhaWxPbkNvcnJ1cHRlZEltYWdlPSExfXBhcnNlKGUpe2lmKDY1MzU5PT09KDAsYS5yZWFkVWludDE2KShlLDApKXJldHVybiB2b2lkIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGUsMCxlLmxlbmd0aCk7Y29uc3QgdD1lLmxlbmd0aDtsZXQgcj0wO2Zvcig7cjx0Oyl7bGV0IGk9OCxzPSgwLGEucmVhZFVpbnQzMikoZSxyKTtjb25zdCBjPSgwLGEucmVhZFVpbnQzMikoZSxyKzQpO2lmKHIrPWksMT09PXMmJihzPTQyOTQ5NjcyOTYqKDAsYS5yZWFkVWludDMyKShlLHIpKygwLGEucmVhZFVpbnQzMikoZSxyKzQpLHIrPTgsaSs9OCksMD09PXMmJihzPXQtcitpKSxzPGkpdGhyb3cgbmV3IG8oIkludmFsaWQgYm94IGZpZWxkIHNpemUiKTtjb25zdCBsPXMtaTtsZXQgaD0hMDtzd2l0Y2goYyl7Y2FzZSAxNzg1NzM3ODMyOmg9ITE7YnJlYWs7Y2FzZSAxNjY4MjQ2NjQyOmNvbnN0IHQ9ZVtyXTtpZigxPT09dCl7Y29uc3QgdD0oMCxhLnJlYWRVaW50MzIpKGUsciszKTtzd2l0Y2godCl7Y2FzZSAxNjpjYXNlIDE3OmNhc2UgMTg6YnJlYWs7ZGVmYXVsdDooMCxuLndhcm4pKCJVbmtub3duIGNvbG9yc3BhY2UgIit0KX19ZWxzZSAyPT09dCYmKDAsbi5pbmZvKSgiSUNDIHByb2ZpbGUgbm90IHN1cHBvcnRlZCIpO2JyZWFrO2Nhc2UgMTc4NTczNzgyNzp0aGlzLnBhcnNlQ29kZXN0cmVhbShlLHIscitsKTticmVhaztjYXNlIDE3ODM2MzZlMzoyMTg3OTM3MzghPT0oMCxhLnJlYWRVaW50MzIpKGUscikmJigwLG4ud2FybikoIkludmFsaWQgSlAyIHNpZ25hdHVyZSIpO2JyZWFrO2Nhc2UgMTc4MzYzNDQ1ODpjYXNlIDE3MTg5MDkyOTY6Y2FzZSAxOTIwMDk5Njk3OmNhc2UgMTkxOTI1MTIzMjpjYXNlIDE3Njg0NDkxMzg6YnJlYWs7ZGVmYXVsdDpjb25zdCBpPVN0cmluZy5mcm9tQ2hhckNvZGUoYz4+MjQmMjU1LGM+PjE2JjI1NSxjPj44JjI1NSwyNTUmYyk7KDAsbi53YXJuKSgiVW5zdXBwb3J0ZWQgaGVhZGVyIHR5cGUgIi5jb25jYXQoYywiICgiKS5jb25jYXQoaSwiKS4iKSl9aCYmKHIrPWwpfX1wYXJzZUltYWdlUHJvcGVydGllcyhlKXtsZXQgdD1lLmdldEJ5dGUoKTtmb3IoO3Q+PTA7KXtjb25zdCByPXQ7aWYodD1lLmdldEJ5dGUoKSw2NTM2MT09KHI8PDh8dCkpe2Uuc2tpcCg0KTtjb25zdCB0PWUuZ2V0SW50MzIoKT4+PjAscj1lLmdldEludDMyKCk+Pj4wLG49ZS5nZXRJbnQzMigpPj4+MCxhPWUuZ2V0SW50MzIoKT4+PjA7ZS5za2lwKDE2KTtjb25zdCBpPWUuZ2V0VWludDE2KCk7cmV0dXJuIHRoaXMud2lkdGg9dC1uLHRoaXMuaGVpZ2h0PXItYSx0aGlzLmNvbXBvbmVudHNDb3VudD1pLHZvaWQodGhpcy5iaXRzUGVyQ29tcG9uZW50PTgpfX10aHJvdyBuZXcgbygiTm8gc2l6ZSBtYXJrZXIgZm91bmQgaW4gSlBYIHN0cmVhbSIpfXBhcnNlQ29kZXN0cmVhbShlLHQscil7Y29uc3QgaT17fTtsZXQgcz0hMTt0cnl7bGV0IG89dDtmb3IoO28rMTxyOyl7Y29uc3QgdD0oMCxhLnJlYWRVaW50MTYpKGUsbyk7bys9MjtsZXQgcixjLHUsZCxmLGcscD0wO3N3aXRjaCh0KXtjYXNlIDY1MzU5OmkubWFpbkhlYWRlcj0hMDticmVhaztjYXNlIDY1NDk3OmJyZWFrO2Nhc2UgNjUzNjE6cD0oMCxhLnJlYWRVaW50MTYpKGUsbyk7Y29uc3QgbT17fTttLlhzaXo9KDAsYS5yZWFkVWludDMyKShlLG8rNCksbS5Zc2l6PSgwLGEucmVhZFVpbnQzMikoZSxvKzgpLG0uWE9zaXo9KDAsYS5yZWFkVWludDMyKShlLG8rMTIpLG0uWU9zaXo9KDAsYS5yZWFkVWludDMyKShlLG8rMTYpLG0uWFRzaXo9KDAsYS5yZWFkVWludDMyKShlLG8rMjApLG0uWVRzaXo9KDAsYS5yZWFkVWludDMyKShlLG8rMjQpLG0uWFRPc2l6PSgwLGEucmVhZFVpbnQzMikoZSxvKzI4KSxtLllUT3Npej0oMCxhLnJlYWRVaW50MzIpKGUsbyszMik7Y29uc3QgYj0oMCxhLnJlYWRVaW50MTYpKGUsbyszNik7bS5Dc2l6PWI7Y29uc3QgeT1bXTtyPW8rMzg7Zm9yKGxldCB0PTA7dDxiO3QrKyl7Y29uc3QgdD17cHJlY2lzaW9uOjErKDEyNyZlW3JdKSxpc1NpZ25lZDohISgxMjgmZVtyXSksWFJzaXo6ZVtyKzFdLFlSc2l6OmVbcisyXX07cis9MyxsKHQsbSkseS5wdXNoKHQpfWkuU0laPW0saS5jb21wb25lbnRzPXksaChpLHkpLGkuUUNDPVtdLGkuQ09DPVtdO2JyZWFrO2Nhc2UgNjUzNzI6cD0oMCxhLnJlYWRVaW50MTYpKGUsbyk7Y29uc3Qgdz17fTtzd2l0Y2gocj1vKzIsYz1lW3IrK10sMzEmYyl7Y2FzZSAwOmQ9OCxmPSEwO2JyZWFrO2Nhc2UgMTpkPTE2LGY9ITE7YnJlYWs7Y2FzZSAyOmQ9MTYsZj0hMDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTUWNkIHZhbHVlICIrYyl9Zm9yKHcubm9RdWFudGl6YXRpb249OD09PWQsdy5zY2FsYXJFeHBvdW5kZWQ9Zix3Lmd1YXJkQml0cz1jPj41LHU9W107cjxwK287KXtjb25zdCB0PXt9Ozg9PT1kPyh0LmVwc2lsb249ZVtyKytdPj4zLHQubXU9MCk6KHQuZXBzaWxvbj1lW3JdPj4zLHQubXU9KDcmZVtyXSk8PDh8ZVtyKzFdLHIrPTIpLHUucHVzaCh0KX13LlNQcWNkcz11LGkubWFpbkhlYWRlcj9pLlFDRD13OihpLmN1cnJlbnRUaWxlLlFDRD13LGkuY3VycmVudFRpbGUuUUNDPVtdKTticmVhaztjYXNlIDY1MzczOnA9KDAsYS5yZWFkVWludDE2KShlLG8pO2NvbnN0IHY9e307bGV0IHg7c3dpdGNoKHI9bysyLGkuU0laLkNzaXo8MjU3P3g9ZVtyKytdOih4PSgwLGEucmVhZFVpbnQxNikoZSxyKSxyKz0yKSxjPWVbcisrXSwzMSZjKXtjYXNlIDA6ZD04LGY9ITA7YnJlYWs7Y2FzZSAxOmQ9MTYsZj0hMTticmVhaztjYXNlIDI6ZD0xNixmPSEwO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFNRY2QgdmFsdWUgIitjKX1mb3Iodi5ub1F1YW50aXphdGlvbj04PT09ZCx2LnNjYWxhckV4cG91bmRlZD1mLHYuZ3VhcmRCaXRzPWM+PjUsdT1bXTtyPHArbzspe2NvbnN0IHQ9e307OD09PWQ/KHQuZXBzaWxvbj1lW3IrK10+PjMsdC5tdT0wKToodC5lcHNpbG9uPWVbcl0+PjMsdC5tdT0oNyZlW3JdKTw8OHxlW3IrMV0scis9MiksdS5wdXNoKHQpfXYuU1BxY2RzPXUsaS5tYWluSGVhZGVyP2kuUUNDW3hdPXY6aS5jdXJyZW50VGlsZS5RQ0NbeF09djticmVhaztjYXNlIDY1MzYyOnA9KDAsYS5yZWFkVWludDE2KShlLG8pO2NvbnN0IGs9e307cj1vKzI7Y29uc3QgQz1lW3IrK107ay5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzPSEhKDEmQyksay5zb3BNYXJrZXJVc2VkPSEhKDImQyksay5lcGhNYXJrZXJVc2VkPSEhKDQmQyksay5wcm9ncmVzc2lvbk9yZGVyPWVbcisrXSxrLmxheWVyc0NvdW50PSgwLGEucmVhZFVpbnQxNikoZSxyKSxyKz0yLGsubXVsdGlwbGVDb21wb25lbnRUcmFuc2Zvcm09ZVtyKytdLGsuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50PWVbcisrXSxrLnhjYj0yKygxNSZlW3IrK10pLGsueWNiPTIrKDE1JmVbcisrXSk7Y29uc3QgRj1lW3IrK107aWYoay5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzPSEhKDEmRiksay5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzPSEhKDImRiksay50ZXJtaW5hdGlvbk9uRWFjaENvZGluZ1Bhc3M9ISEoNCZGKSxrLnZlcnRpY2FsbHlTdHJpcGU9ISEoOCZGKSxrLnByZWRpY3RhYmxlVGVybWluYXRpb249ISEoMTYmRiksay5zZWdtZW50YXRpb25TeW1ib2xVc2VkPSEhKDMyJkYpLGsucmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uPWVbcisrXSxrLmVudHJvcHlDb2RlcldpdGhDdXN0b21QcmVjaW5jdHMpe2NvbnN0IHQ9W107Zm9yKDtyPHArbzspe2NvbnN0IG49ZVtyKytdO3QucHVzaCh7UFB4OjE1Jm4sUFB5Om4+PjR9KX1rLnByZWNpbmN0c1NpemVzPXR9Y29uc3QgST1bXTtrLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MmJkkucHVzaCgic2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyIpLGsudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzJiZJLnB1c2goInRlcm1pbmF0aW9uT25FYWNoQ29kaW5nUGFzcyIpLGsudmVydGljYWxseVN0cmlwZSYmSS5wdXNoKCJ2ZXJ0aWNhbGx5U3RyaXBlIiksay5wcmVkaWN0YWJsZVRlcm1pbmF0aW9uJiZJLnB1c2goInByZWRpY3RhYmxlVGVybWluYXRpb24iKSxJLmxlbmd0aD4wJiYocz0hMCwoMCxuLndhcm4pKCJKUFg6IFVuc3VwcG9ydGVkIENPRCBvcHRpb25zICgiLmNvbmNhdChJLmpvaW4oIiwgIiksIikuIikpKSxpLm1haW5IZWFkZXI/aS5DT0Q9azooaS5jdXJyZW50VGlsZS5DT0Q9ayxpLmN1cnJlbnRUaWxlLkNPQz1bXSk7YnJlYWs7Y2FzZSA2NTQyNDpwPSgwLGEucmVhZFVpbnQxNikoZSxvKSxnPXt9LGcuaW5kZXg9KDAsYS5yZWFkVWludDE2KShlLG8rMiksZy5sZW5ndGg9KDAsYS5yZWFkVWludDMyKShlLG8rNCksZy5kYXRhRW5kPWcubGVuZ3RoK28tMixnLnBhcnRJbmRleD1lW28rOF0sZy5wYXJ0c0NvdW50PWVbbys5XSxpLm1haW5IZWFkZXI9ITEsMD09PWcucGFydEluZGV4JiYoZy5DT0Q9aS5DT0QsZy5DT0M9aS5DT0Muc2xpY2UoMCksZy5RQ0Q9aS5RQ0QsZy5RQ0M9aS5RQ0Muc2xpY2UoMCkpLGkuY3VycmVudFRpbGU9ZzticmVhaztjYXNlIDY1NDI3Omc9aS5jdXJyZW50VGlsZSwwPT09Zy5wYXJ0SW5kZXgmJihPKGksZy5pbmRleCksUyhpKSkscD1nLmRhdGFFbmQtbyxBKGksZSxvLHApO2JyZWFrO2Nhc2UgNjUzNjM6KDAsbi53YXJuKSgiSlBYOiBDb2Rlc3RyZWFtIGNvZGUgMHhGRjUzIChDT0MpIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTtjYXNlIDY1MzY1OmNhc2UgNjUzNjc6Y2FzZSA2NTM2ODpjYXNlIDY1MzgwOnA9KDAsYS5yZWFkVWludDE2KShlLG8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvZGVzdHJlYW0gY29kZTogIit0LnRvU3RyaW5nKDE2KSl9bys9cH19Y2F0Y2goZSl7aWYoc3x8dGhpcy5mYWlsT25Db3JydXB0ZWRJbWFnZSl0aHJvdyBuZXcgbyhlLm1lc3NhZ2UpOygwLG4ud2FybikoJ0pQWDogVHJ5aW5nIHRvIHJlY292ZXIgZnJvbTogIicuY29uY2F0KGUubWVzc2FnZSwnIi4nKSl9dGhpcy50aWxlcz1mdW5jdGlvbihlKXtjb25zdCB0PWUuU0laLHI9ZS5jb21wb25lbnRzLG49dC5Dc2l6LGE9W107Zm9yKGxldCB0PTAsaT1lLnRpbGVzLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPWUudGlsZXNbdF0scz1bXTtmb3IobGV0IHQ9MDt0PG47dCsrKXNbdF09QyhlLGksdCk7Y29uc3Qgbz1zWzBdLGM9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG8uaXRlbXMubGVuZ3RoKm4pLGw9e2xlZnQ6by5sZWZ0LHRvcDpvLnRvcCx3aWR0aDpvLndpZHRoLGhlaWdodDpvLmhlaWdodCxpdGVtczpjfTtsZXQgaCx1LGQsZixnLHAsbSxiPTA7aWYoaS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKXtjb25zdCBlPTQ9PT1uLHQ9c1swXS5pdGVtcyxhPXNbMV0uaXRlbXMsbz1zWzJdLml0ZW1zLGw9ZT9zWzNdLml0ZW1zOm51bGw7aD1yWzBdLnByZWNpc2lvbi04LHU9LjUrKDEyODw8aCk7Y29uc3QgeT1pLmNvbXBvbmVudHNbMF0sdz1uLTM7aWYoZj10Lmxlbmd0aCx5LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24pZm9yKGQ9MDtkPGY7ZCsrLGIrPXcpe2c9dFtkXSt1LHA9YVtkXSxtPW9bZF07Y29uc3QgZT1nLShtK3A+PjIpO2NbYisrXT1lK20+PmgsY1tiKytdPWU+PmgsY1tiKytdPWUrcD4+aH1lbHNlIGZvcihkPTA7ZDxmO2QrKyxiKz13KWc9dFtkXSt1LHA9YVtkXSxtPW9bZF0sY1tiKytdPWcrMS40MDIqbT4+aCxjW2IrK109Zy0uMzQ0MTMqcC0uNzE0MTQqbT4+aCxjW2IrK109ZysxLjc3MipwPj5oO2lmKGUpZm9yKGQ9MCxiPTM7ZDxmO2QrKyxiKz00KWNbYl09bFtkXSt1Pj5ofWVsc2UgZm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3QgdD1zW2VdLml0ZW1zO2ZvcihoPXJbZV0ucHJlY2lzaW9uLTgsdT0uNSsoMTI4PDxoKSxiPWUsZD0wLGY9dC5sZW5ndGg7ZDxmO2QrKyljW2JdPXRbZF0rdT4+aCxiKz1ufWEucHVzaChsKX1yZXR1cm4gYX0oaSksdGhpcy53aWR0aD1pLlNJWi5Yc2l6LWkuU0laLlhPc2l6LHRoaXMuaGVpZ2h0PWkuU0laLllzaXotaS5TSVouWU9zaXosdGhpcy5jb21wb25lbnRzQ291bnQ9aS5TSVouQ3Npen19O2NsYXNzIEZ7Y29uc3RydWN0b3IoZSx0KXtjb25zdCByPSgwLGEubG9nMikoTWF0aC5tYXgoZSx0KSkrMTt0aGlzLmxldmVscz1bXTtmb3IobGV0IG49MDtuPHI7bisrKXtjb25zdCByPXt3aWR0aDplLGhlaWdodDp0LGl0ZW1zOltdfTt0aGlzLmxldmVscy5wdXNoKHIpLGU9TWF0aC5jZWlsKGUvMiksdD1NYXRoLmNlaWwodC8yKX19cmVzZXQoZSx0KXtsZXQgcixuPTAsYT0wO2Zvcig7bjx0aGlzLmxldmVscy5sZW5ndGg7KXtyPXRoaXMubGV2ZWxzW25dO2NvbnN0IGk9ZSt0KnIud2lkdGg7aWYodm9pZCAwIT09ci5pdGVtc1tpXSl7YT1yLml0ZW1zW2ldO2JyZWFrfXIuaW5kZXg9aSxlPj49MSx0Pj49MSxuKyt9bi0tLHI9dGhpcy5sZXZlbHNbbl0sci5pdGVtc1tyLmluZGV4XT1hLHRoaXMuY3VycmVudExldmVsPW4sZGVsZXRlIHRoaXMudmFsdWV9aW5jcmVtZW50VmFsdWUoKXtjb25zdCBlPXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTtlLml0ZW1zW2UuaW5kZXhdKyt9bmV4dExldmVsKCl7bGV0IGU9dGhpcy5jdXJyZW50TGV2ZWwsdD10aGlzLmxldmVsc1tlXTtjb25zdCByPXQuaXRlbXNbdC5pbmRleF07cmV0dXJuIGUtLSxlPDA/KHRoaXMudmFsdWU9ciwhMSk6KHRoaXMuY3VycmVudExldmVsPWUsdD10aGlzLmxldmVsc1tlXSx0Lml0ZW1zW3QuaW5kZXhdPXIsITApfX1jbGFzcyBJe2NvbnN0cnVjdG9yKGUsdCxyKXtjb25zdCBuPSgwLGEubG9nMikoTWF0aC5tYXgoZSx0KSkrMTt0aGlzLmxldmVscz1bXTtmb3IobGV0IGE9MDthPG47YSsrKXtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUqdCk7Zm9yKGxldCBlPTAsdD1uLmxlbmd0aDtlPHQ7ZSsrKW5bZV09cjtjb25zdCBhPXt3aWR0aDplLGhlaWdodDp0LGl0ZW1zOm59O3RoaXMubGV2ZWxzLnB1c2goYSksZT1NYXRoLmNlaWwoZS8yKSx0PU1hdGguY2VpbCh0LzIpfX1yZXNldChlLHQscil7bGV0IG49MDtmb3IoO248dGhpcy5sZXZlbHMubGVuZ3RoOyl7Y29uc3QgYT10aGlzLmxldmVsc1tuXSxpPWUrdCphLndpZHRoO2EuaW5kZXg9aTtjb25zdCBzPWEuaXRlbXNbaV07aWYoMjU1PT09cylicmVhaztpZihzPnIpcmV0dXJuIHRoaXMuY3VycmVudExldmVsPW4sdGhpcy5wcm9wYWdhdGVWYWx1ZXMoKSwhMTtlPj49MSx0Pj49MSxuKyt9cmV0dXJuIHRoaXMuY3VycmVudExldmVsPW4tMSwhMH1pbmNyZW1lbnRWYWx1ZShlKXtjb25zdCB0PXRoaXMubGV2ZWxzW3RoaXMuY3VycmVudExldmVsXTt0Lml0ZW1zW3QuaW5kZXhdPWUrMSx0aGlzLnByb3BhZ2F0ZVZhbHVlcygpfXByb3BhZ2F0ZVZhbHVlcygpe2xldCBlPXRoaXMuY3VycmVudExldmVsLHQ9dGhpcy5sZXZlbHNbZV07Y29uc3Qgcj10Lml0ZW1zW3QuaW5kZXhdO2Zvcig7LS1lPj0wOyl0PXRoaXMubGV2ZWxzW2VdLHQuaXRlbXNbdC5pbmRleF09cn1uZXh0TGV2ZWwoKXtsZXQgZT10aGlzLmN1cnJlbnRMZXZlbCx0PXRoaXMubGV2ZWxzW2VdO2NvbnN0IHI9dC5pdGVtc1t0LmluZGV4XTtyZXR1cm4gdC5pdGVtc1t0LmluZGV4XT0yNTUsZS0tLCEoZTwwfHwodGhpcy5jdXJyZW50TGV2ZWw9ZSx0PXRoaXMubGV2ZWxzW2VdLHQuaXRlbXNbdC5pbmRleF09ciwwKSl9fWNsYXNzIFR7Y29uc3RydWN0b3IoZSx0LHIsbixhKXtsZXQgaTt0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9dCxpPSJISCI9PT1yP1QuSEhDb250ZXh0TGFiZWw6IkhMIj09PXI/VC5ITENvbnRleHRMYWJlbDpULkxMQW5kTEhDb250ZXh0c0xhYmVsLHRoaXMuY29udGV4dExhYmVsVGFibGU9aTtjb25zdCBzPWUqdDtsZXQgbzt0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZT1uZXcgVWludDhBcnJheShzKSx0aGlzLmNvZWZmaWNlbnRzU2lnbj1uZXcgVWludDhBcnJheShzKSxvPWE+MTQ/bmV3IFVpbnQzMkFycmF5KHMpOmE+Nj9uZXcgVWludDE2QXJyYXkocyk6bmV3IFVpbnQ4QXJyYXkocyksdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZT1vLHRoaXMucHJvY2Vzc2luZ0ZsYWdzPW5ldyBVaW50OEFycmF5KHMpO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkocyk7aWYoMCE9PW4pZm9yKGxldCBlPTA7ZTxzO2UrKyljW2VdPW47dGhpcy5iaXRzRGVjb2RlZD1jLHRoaXMucmVzZXQoKX1zZXREZWNvZGVyKGUpe3RoaXMuZGVjb2Rlcj1lfXJlc2V0KCl7dGhpcy5jb250ZXh0cz1uZXcgSW50OEFycmF5KDE5KSx0aGlzLmNvbnRleHRzWzBdPTgsdGhpcy5jb250ZXh0c1tULlVOSUZPUk1fQ09OVEVYVF09OTIsdGhpcy5jb250ZXh0c1tULlJVTkxFTkdUSF9DT05URVhUXT02fXNldE5laWdoYm9yc1NpZ25pZmljYW5jZShlLHQscil7Y29uc3Qgbj10aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSxhPXRoaXMud2lkdGgsaT10aGlzLmhlaWdodCxzPXQ+MCxvPXQrMTxhO2xldCBjO2U+MCYmKGM9ci1hLHMmJihuW2MtMV0rPTE2KSxvJiYobltjKzFdKz0xNiksbltjXSs9NCksZSsxPGkmJihjPXIrYSxzJiYobltjLTFdKz0xNiksbyYmKG5bYysxXSs9MTYpLG5bY10rPTQpLHMmJihuW3ItMV0rPTEpLG8mJihuW3IrMV0rPTEpLG5bcl18PTEyOH1ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKXtjb25zdCBlPXRoaXMuZGVjb2Rlcix0PXRoaXMud2lkdGgscj10aGlzLmhlaWdodCxuPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUsYT10aGlzLmNvZWZmaWNlbnRzU2lnbixpPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLHM9dGhpcy5wcm9jZXNzaW5nRmxhZ3Msbz10aGlzLmNvbnRleHRzLGM9dGhpcy5jb250ZXh0TGFiZWxUYWJsZSxsPXRoaXMuYml0c0RlY29kZWQ7Zm9yKGxldCBoPTA7aDxyO2grPTQpZm9yKGxldCB1PTA7dTx0O3UrKyl7bGV0IGQ9aCp0K3U7Zm9yKGxldCBmPTA7Zjw0O2YrKyxkKz10KXtjb25zdCB0PWgrZjtpZih0Pj1yKWJyZWFrO2lmKHNbZF0mPS0yLG5bZF18fCFpW2RdKWNvbnRpbnVlO2NvbnN0IGc9Y1tpW2RdXTtpZihlLnJlYWRCaXQobyxnKSl7Y29uc3QgZT10aGlzLmRlY29kZVNpZ25CaXQodCx1LGQpO2FbZF09ZSxuW2RdPTEsdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UodCx1LGQpLHNbZF18PTJ9bFtkXSsrLHNbZF18PTF9fX1kZWNvZGVTaWduQml0KGUsdCxyKXtjb25zdCBuPXRoaXMud2lkdGgsYT10aGlzLmhlaWdodCxpPXRoaXMuY29lZmZpY2VudHNNYWduaXR1ZGUscz10aGlzLmNvZWZmaWNlbnRzU2lnbjtsZXQgbyxjLGwsaCx1LGQ7aD10PjAmJjAhPT1pW3ItMV0sdCsxPG4mJjAhPT1pW3IrMV0/KGw9c1tyKzFdLGg/KGM9c1tyLTFdLG89MS1sLWMpOm89MS1sLWwpOmg/KGM9c1tyLTFdLG89MS1jLWMpOm89MDtjb25zdCBmPTMqbztyZXR1cm4gaD1lPjAmJjAhPT1pW3Itbl0sZSsxPGEmJjAhPT1pW3Irbl0/KGw9c1tyK25dLGg/KGM9c1tyLW5dLG89MS1sLWMrZik6bz0xLWwtbCtmKTpoPyhjPXNbci1uXSxvPTEtYy1jK2YpOm89ZixvPj0wPyh1PTkrbyxkPXRoaXMuZGVjb2Rlci5yZWFkQml0KHRoaXMuY29udGV4dHMsdSkpOih1PTktbyxkPTFedGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cyx1KSksZH1ydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzcygpe2NvbnN0IGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy53aWR0aCxyPXRoaXMuaGVpZ2h0LG49dGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSxhPXRoaXMubmVpZ2hib3JzU2lnbmlmaWNhbmNlLGk9dGhpcy5jb250ZXh0cyxzPXRoaXMuYml0c0RlY29kZWQsbz10aGlzLnByb2Nlc3NpbmdGbGFncyxjPXQqcixsPTQqdDtmb3IobGV0IHIsaD0wO2g8YztoPXIpe3I9TWF0aC5taW4oYyxoK2wpO2ZvcihsZXQgYz0wO2M8dDtjKyspZm9yKGxldCBsPWgrYztsPHI7bCs9dCl7aWYoIW5bbF18fDAhPSgxJm9bbF0pKWNvbnRpbnVlO2xldCB0PTE2OzAhPSgyJm9bbF0pJiYob1tsXV49Mix0PTA9PSgxMjcmYVtsXSk/MTU6MTQpO2NvbnN0IHI9ZS5yZWFkQml0KGksdCk7bltsXT1uW2xdPDwxfHIsc1tsXSsrLG9bbF18PTF9fX1ydW5DbGVhbnVwUGFzcygpe2NvbnN0IGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy53aWR0aCxyPXRoaXMuaGVpZ2h0LG49dGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2UsYT10aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlLGk9dGhpcy5jb2VmZmljZW50c1NpZ24scz10aGlzLmNvbnRleHRzLG89dGhpcy5jb250ZXh0TGFiZWxUYWJsZSxjPXRoaXMuYml0c0RlY29kZWQsbD10aGlzLnByb2Nlc3NpbmdGbGFncyxoPXQsdT0yKnQsZD0zKnQ7bGV0IGY7Zm9yKGxldCBnPTA7ZzxyO2c9Zil7Zj1NYXRoLm1pbihnKzQscik7Y29uc3QgcD1nKnQsbT1nKzM8cjtmb3IobGV0IHI9MDtyPHQ7cisrKXtjb25zdCBiPXArcjtsZXQgeSx3PTAsdj1iLHg9ZztpZihtJiYwPT09bFtiXSYmMD09PWxbYitoXSYmMD09PWxbYit1XSYmMD09PWxbYitkXSYmMD09PW5bYl0mJjA9PT1uW2IraF0mJjA9PT1uW2IrdV0mJjA9PT1uW2IrZF0pe2lmKCFlLnJlYWRCaXQocyxULlJVTkxFTkdUSF9DT05URVhUKSl7Y1tiXSsrLGNbYitoXSsrLGNbYit1XSsrLGNbYitkXSsrO2NvbnRpbnVlfXc9ZS5yZWFkQml0KHMsVC5VTklGT1JNX0NPTlRFWFQpPDwxfGUucmVhZEJpdChzLFQuVU5JRk9STV9DT05URVhUKSwwIT09dyYmKHg9Zyt3LHYrPXcqdCkseT10aGlzLmRlY29kZVNpZ25CaXQoeCxyLHYpLGlbdl09eSxhW3ZdPTEsdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoeCxyLHYpLGxbdl18PTIsdj1iO2ZvcihsZXQgZT1nO2U8PXg7ZSsrLHYrPXQpY1t2XSsrO3crK31mb3IoeD1nK3c7eDxmO3grKyx2Kz10KXtpZihhW3ZdfHwwIT0oMSZsW3ZdKSljb250aW51ZTtjb25zdCB0PW9bblt2XV07MT09PWUucmVhZEJpdChzLHQpJiYoeT10aGlzLmRlY29kZVNpZ25CaXQoeCxyLHYpLGlbdl09eSxhW3ZdPTEsdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoeCxyLHYpLGxbdl18PTIpLGNbdl0rK319fX1jaGVja1NlZ21lbnRhdGlvblN5bWJvbCgpe2NvbnN0IGU9dGhpcy5kZWNvZGVyLHQ9dGhpcy5jb250ZXh0cztpZigxMCE9KGUucmVhZEJpdCh0LFQuVU5JRk9STV9DT05URVhUKTw8M3xlLnJlYWRCaXQodCxULlVOSUZPUk1fQ09OVEVYVCk8PDJ8ZS5yZWFkQml0KHQsVC5VTklGT1JNX0NPTlRFWFQpPDwxfGUucmVhZEJpdCh0LFQuVU5JRk9STV9DT05URVhUKSkpdGhyb3cgbmV3IG8oIkludmFsaWQgc2VnbWVudGF0aW9uIHN5bWJvbCIpfX1pKFQsIlVOSUZPUk1fQ09OVEVYVCIsMTcpLGkoVCwiUlVOTEVOR1RIX0NPTlRFWFQiLDE4KSxpKFQsIkxMQW5kTEhDb250ZXh0c0xhYmVsIixuZXcgVWludDhBcnJheShbMCw1LDgsMCwzLDcsOCwwLDQsNyw4LDAsMCwwLDAsMCwxLDYsOCwwLDMsNyw4LDAsNCw3LDgsMCwwLDAsMCwwLDIsNiw4LDAsMyw3LDgsMCw0LDcsOCwwLDAsMCwwLDAsMiw2LDgsMCwzLDcsOCwwLDQsNyw4LDAsMCwwLDAsMCwyLDYsOCwwLDMsNyw4LDAsNCw3LDhdKSksaShULCJITENvbnRleHRMYWJlbCIsbmV3IFVpbnQ4QXJyYXkoWzAsMyw0LDAsNSw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMSwzLDQsMCw2LDcsNywwLDgsOCw4LDAsMCwwLDAsMCwyLDMsNCwwLDYsNyw3LDAsOCw4LDgsMCwwLDAsMCwwLDIsMyw0LDAsNiw3LDcsMCw4LDgsOCwwLDAsMCwwLDAsMiwzLDQsMCw2LDcsNywwLDgsOCw4XSkpLGkoVCwiSEhDb250ZXh0TGFiZWwiLG5ldyBVaW50OEFycmF5KFswLDEsMiwwLDEsMiwyLDAsMiwyLDIsMCwwLDAsMCwwLDMsNCw1LDAsNCw1LDUsMCw1LDUsNSwwLDAsMCwwLDAsNiw3LDcsMCw3LDcsNywwLDcsNyw3LDAsMCwwLDAsMCw4LDgsOCwwLDgsOCw4LDAsOCw4LDgsMCwwLDAsMCwwLDgsOCw4LDAsOCw4LDgsMCw4LDgsOF0pKTtjbGFzcyBNe2NvbnN0cnVjdG9yKCl7dGhpcy5jb25zdHJ1Y3Rvcj09PU0mJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBUcmFuc2Zvcm0uIil9Y2FsY3VsYXRlKGUsdCxyKXtsZXQgbj1lWzBdO2ZvcihsZXQgYT0xLGk9ZS5sZW5ndGg7YTxpO2ErKyluPXRoaXMuaXRlcmF0ZShuLGVbYV0sdCxyKTtyZXR1cm4gbn1leHRlbmQoZSx0LHIpe2xldCBuPXQtMSxhPXQrMSxpPXQrci0yLHM9dCtyO2Vbbi0tXT1lW2ErK10sZVtzKytdPWVbaS0tXSxlW24tLV09ZVthKytdLGVbcysrXT1lW2ktLV0sZVtuLS1dPWVbYSsrXSxlW3MrK109ZVtpLS1dLGVbbl09ZVthXSxlW3NdPWVbaV19ZmlsdGVyKGUsdCxyKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBmaWx0ZXJgIGNhbGxlZCIpfWl0ZXJhdGUoZSx0LHIsbil7Y29uc3QgYT1lLndpZHRoLGk9ZS5oZWlnaHQ7bGV0IHM9ZS5pdGVtcztjb25zdCBvPXQud2lkdGgsYz10LmhlaWdodCxsPXQuaXRlbXM7bGV0IGgsdSxkLGYsZyxwO2ZvcihkPTAsaD0wO2g8aTtoKyspZm9yKGY9MipoKm8sdT0wO3U8YTt1KyssZCsrLGYrPTIpbFtmXT1zW2RdO3M9ZS5pdGVtcz1udWxsO2NvbnN0IG09bmV3IEZsb2F0MzJBcnJheShvKzgpO2lmKDE9PT1vKXtpZigwIT0oMSZyKSlmb3IocD0wLGQ9MDtwPGM7cCsrLGQrPW8pbFtkXSo9LjV9ZWxzZSBmb3IocD0wLGQ9MDtwPGM7cCsrLGQrPW8pbS5zZXQobC5zdWJhcnJheShkLGQrbyksNCksdGhpcy5leHRlbmQobSw0LG8pLHRoaXMuZmlsdGVyKG0sNCxvKSxsLnNldChtLnN1YmFycmF5KDQsNCtvKSxkKTtsZXQgYj0xNjtjb25zdCB5PVtdO2ZvcihoPTA7aDxiO2grKyl5LnB1c2gobmV3IEZsb2F0MzJBcnJheShjKzgpKTtsZXQgdyx2PTA7aWYoZT00K2MsMT09PWMpe2lmKDAhPSgxJm4pKWZvcihnPTA7ZzxvO2crKylsW2ddKj0uNX1lbHNlIGZvcihnPTA7ZzxvO2crKyl7aWYoMD09PXYpe2ZvcihiPU1hdGgubWluKG8tZyxiKSxkPWcsZj00O2Y8ZTtkKz1vLGYrKylmb3Iodz0wO3c8Yjt3KyspeVt3XVtmXT1sW2Qrd107dj1ifXYtLTtjb25zdCB0PXlbdl07aWYodGhpcy5leHRlbmQodCw0LGMpLHRoaXMuZmlsdGVyKHQsNCxjKSwwPT09dilmb3IoZD1nLWIrMSxmPTQ7ZjxlO2QrPW8sZisrKWZvcih3PTA7dzxiO3crKylsW2Qrd109eVt3XVtmXX1yZXR1cm57d2lkdGg6byxoZWlnaHQ6YyxpdGVtczpsfX19Y2xhc3MgRSBleHRlbmRzIE17ZmlsdGVyKGUsdCxyKXtjb25zdCBuPXI+PjE7bGV0IGEsaSxzLG87Y29uc3QgYz0tMS41ODYxMzQzNDIwNTk5MjQsbD0tLjA1Mjk4MDExODU3Mjk2MSxoPS44ODI5MTEwNzU1MzA5MzQsdT0uNDQzNTA2ODUyMDQzOTcxLGQ9MS4yMzAxNzQxMDQ5MTQwMDE7Zm9yKGE9KHR8PTApLTMsaT1uKzQ7aS0tO2ErPTIpZVthXSo9LjgxMjg5MzA2NjExNTk2MDk7Zm9yKGE9dC0yLHM9dSplW2EtMV0saT1uKzM7aS0tJiYobz11KmVbYSsxXSxlW2FdPWQqZVthXS1zLW8saS0tKTthKz0yKWErPTIscz11KmVbYSsxXSxlW2FdPWQqZVthXS1zLW87Zm9yKGE9dC0xLHM9aCplW2EtMV0saT1uKzI7aS0tJiYobz1oKmVbYSsxXSxlW2FdLT1zK28saS0tKTthKz0yKWErPTIscz1oKmVbYSsxXSxlW2FdLT1zK287Zm9yKGE9dCxzPWwqZVthLTFdLGk9bisxO2ktLSYmKG89bCplW2ErMV0sZVthXS09cytvLGktLSk7YSs9MilhKz0yLHM9bCplW2ErMV0sZVthXS09cytvO2lmKDAhPT1uKWZvcihhPXQrMSxzPWMqZVthLTFdLGk9bjtpLS0mJihvPWMqZVthKzFdLGVbYV0tPXMrbyxpLS0pO2ErPTIpYSs9MixzPWMqZVthKzFdLGVbYV0tPXMrb319Y2xhc3MgUCBleHRlbmRzIE17ZmlsdGVyKGUsdCxyKXtjb25zdCBuPXI+PjE7bGV0IGEsaTtmb3IoYT10fD0wLGk9bisxO2ktLTthKz0yKWVbYV0tPWVbYS0xXStlW2ErMV0rMj4+Mjtmb3IoYT10KzEsaT1uO2ktLTthKz0yKWVbYV0rPWVbYS0xXStlW2ErMV0+PjF9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkxaV1N0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTY4KTtjbGFzcyBhIGV4dGVuZHMgbi5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKHQpLHRoaXMuc3RyPWUsdGhpcy5kaWN0PWUuZGljdCx0aGlzLmNhY2hlZERhdGE9MCx0aGlzLmJpdHNDYWNoZWQ9MDtjb25zdCBuPTQwOTYsYT17ZWFybHlDaGFuZ2U6cixjb2RlTGVuZ3RoOjksbmV4dENvZGU6MjU4LGRpY3Rpb25hcnlWYWx1ZXM6bmV3IFVpbnQ4QXJyYXkobiksZGljdGlvbmFyeUxlbmd0aHM6bmV3IFVpbnQxNkFycmF5KG4pLGRpY3Rpb25hcnlQcmV2Q29kZXM6bmV3IFVpbnQxNkFycmF5KG4pLGN1cnJlbnRTZXF1ZW5jZTpuZXcgVWludDhBcnJheShuKSxjdXJyZW50U2VxdWVuY2VMZW5ndGg6MH07Zm9yKGxldCBlPTA7ZTwyNTY7KytlKWEuZGljdGlvbmFyeVZhbHVlc1tlXT1lLGEuZGljdGlvbmFyeUxlbmd0aHNbZV09MTt0aGlzLmx6d1N0YXRlPWF9cmVhZEJpdHMoZSl7bGV0IHQ9dGhpcy5iaXRzQ2FjaGVkLHI9dGhpcy5jYWNoZWREYXRhO2Zvcig7dDxlOyl7Y29uc3QgZT10aGlzLnN0ci5nZXRCeXRlKCk7aWYoLTE9PT1lKXJldHVybiB0aGlzLmVvZj0hMCxudWxsO3I9cjw8OHxlLHQrPTh9cmV0dXJuIHRoaXMuYml0c0NhY2hlZD10LT1lLHRoaXMuY2FjaGVkRGF0YT1yLHRoaXMubGFzdENvZGU9bnVsbCxyPj4+dCYoMTw8ZSktMX1yZWFkQmxvY2soKXtsZXQgZSx0LHIsbj0xMDI0O2NvbnN0IGE9dGhpcy5sendTdGF0ZTtpZighYSlyZXR1cm47Y29uc3QgaT1hLmVhcmx5Q2hhbmdlO2xldCBzPWEubmV4dENvZGU7Y29uc3Qgbz1hLmRpY3Rpb25hcnlWYWx1ZXMsYz1hLmRpY3Rpb25hcnlMZW5ndGhzLGw9YS5kaWN0aW9uYXJ5UHJldkNvZGVzO2xldCBoPWEuY29kZUxlbmd0aCx1PWEucHJldkNvZGU7Y29uc3QgZD1hLmN1cnJlbnRTZXF1ZW5jZTtsZXQgZj1hLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aCxnPTAscD10aGlzLmJ1ZmZlckxlbmd0aCxtPXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoK24pO2ZvcihlPTA7ZTw1MTI7ZSsrKXtjb25zdCBlPXRoaXMucmVhZEJpdHMoaCksYT1mPjA7aWYoZTwyNTYpZFswXT1lLGY9MTtlbHNle2lmKCEoZT49MjU4KSl7aWYoMjU2PT09ZSl7aD05LHM9MjU4LGY9MDtjb250aW51ZX10aGlzLmVvZj0hMCxkZWxldGUgdGhpcy5sendTdGF0ZTticmVha31pZihlPHMpZm9yKGY9Y1tlXSx0PWYtMSxyPWU7dD49MDt0LS0pZFt0XT1vW3JdLHI9bFtyXTtlbHNlIGRbZisrXT1kWzBdfWlmKGEmJihsW3NdPXUsY1tzXT1jW3VdKzEsb1tzXT1kWzBdLHMrKyxoPXMraSZzK2ktMT9oOjB8TWF0aC5taW4oTWF0aC5sb2cocytpKS8uNjkzMTQ3MTgwNTU5OTQ1MysxLDEyKSksdT1lLGcrPWYsbjxnKXtkb3tuKz01MTJ9d2hpbGUobjxnKTttPXRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoK24pfWZvcih0PTA7dDxmO3QrKyltW3ArK109ZFt0XX1hLm5leHRDb2RlPXMsYS5jb2RlTGVuZ3RoPWgsYS5wcmV2Q29kZT11LGEuY3VycmVudFNlcXVlbmNlTGVuZ3RoPWYsdGhpcy5idWZmZXJMZW5ndGg9cH19dC5MWldTdHJlYW09YX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlByZWRpY3RvclN0cmVhbT12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTY4KSxhPXIoMTUwKSxpPXIoMTQ0KTtjbGFzcyBzIGV4dGVuZHMgbi5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0LHIpe2lmKHN1cGVyKHQpLCEociBpbnN0YW5jZW9mIGEuRGljdCkpcmV0dXJuIGU7Y29uc3Qgbj10aGlzLnByZWRpY3Rvcj1yLmdldCgiUHJlZGljdG9yIil8fDE7aWYobjw9MSlyZXR1cm4gZTtpZigyIT09biYmKG48MTB8fG4+MTUpKXRocm93IG5ldyBpLkZvcm1hdEVycm9yKCJVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICIuY29uY2F0KG4pKTt0aGlzLnJlYWRCbG9jaz0yPT09bj90aGlzLnJlYWRCbG9ja1RpZmY6dGhpcy5yZWFkQmxvY2tQbmcsdGhpcy5zdHI9ZSx0aGlzLmRpY3Q9ZS5kaWN0O2NvbnN0IHM9dGhpcy5jb2xvcnM9ci5nZXQoIkNvbG9ycyIpfHwxLG89dGhpcy5iaXRzPXIuZ2V0KCJCUEMiLCJCaXRzUGVyQ29tcG9uZW50Iil8fDgsYz10aGlzLmNvbHVtbnM9ci5nZXQoIkNvbHVtbnMiKXx8MTtyZXR1cm4gdGhpcy5waXhCeXRlcz1zKm8rNz4+Myx0aGlzLnJvd0J5dGVzPWMqcypvKzc+PjMsdGhpc31yZWFkQmxvY2tUaWZmKCl7Y29uc3QgZT10aGlzLnJvd0J5dGVzLHQ9dGhpcy5idWZmZXJMZW5ndGgscj10aGlzLmVuc3VyZUJ1ZmZlcih0K2UpLG49dGhpcy5iaXRzLGE9dGhpcy5jb2xvcnMsaT10aGlzLnN0ci5nZXRCeXRlcyhlKTtpZih0aGlzLmVvZj0haS5sZW5ndGgsdGhpcy5lb2YpcmV0dXJuO2xldCBzLG89MCxjPTAsbD0wLGg9MCx1PXQ7aWYoMT09PW4mJjE9PT1hKWZvcihzPTA7czxlOysrcyl7bGV0IGU9aVtzXV5vO2VePWU+PjEsZV49ZT4+MixlXj1lPj40LG89KDEmZSk8PDcsclt1KytdPWV9ZWxzZSBpZig4PT09bil7Zm9yKHM9MDtzPGE7KytzKXJbdSsrXT1pW3NdO2Zvcig7czxlOysrcylyW3VdPXJbdS1hXStpW3NdLHUrK31lbHNlIGlmKDE2PT09bil7Y29uc3QgdD0yKmE7Zm9yKHM9MDtzPHQ7KytzKXJbdSsrXT1pW3NdO2Zvcig7czxlO3MrPTIpe2NvbnN0IGU9KCgyNTUmaVtzXSk8PDgpKygyNTUmaVtzKzFdKSsoKDI1NSZyW3UtdF0pPDw4KSsoMjU1JnJbdS10KzFdKTtyW3UrK109ZT4+OCYyNTUsclt1KytdPTI1NSZlfX1lbHNle2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoYSsxKSx1PSgxPDxuKS0xO2xldCBkPTAsZj10O2NvbnN0IGc9dGhpcy5jb2x1bW5zO2ZvcihzPTA7czxnOysrcylmb3IobGV0IHQ9MDt0PGE7Kyt0KWw8biYmKG89bzw8OHwyNTUmaVtkKytdLGwrPTgpLGVbdF09ZVt0XSsobz4+bC1uKSZ1LGwtPW4sYz1jPDxufGVbdF0saCs9bixoPj04JiYocltmKytdPWM+PmgtOCYyNTUsaC09OCk7aD4wJiYocltmKytdPShjPDw4LWgpKyhvJigxPDw4LWgpLTEpKX10aGlzLmJ1ZmZlckxlbmd0aCs9ZX1yZWFkQmxvY2tQbmcoKXtjb25zdCBlPXRoaXMucm93Qnl0ZXMsdD10aGlzLnBpeEJ5dGVzLHI9dGhpcy5zdHIuZ2V0Qnl0ZSgpLG49dGhpcy5zdHIuZ2V0Qnl0ZXMoZSk7aWYodGhpcy5lb2Y9IW4ubGVuZ3RoLHRoaXMuZW9mKXJldHVybjtjb25zdCBhPXRoaXMuYnVmZmVyTGVuZ3RoLHM9dGhpcy5lbnN1cmVCdWZmZXIoYStlKTtsZXQgbz1zLnN1YmFycmF5KGEtZSxhKTswPT09by5sZW5ndGgmJihvPW5ldyBVaW50OEFycmF5KGUpKTtsZXQgYyxsLGgsdT1hO3N3aXRjaChyKXtjYXNlIDA6Zm9yKGM9MDtjPGU7KytjKXNbdSsrXT1uW2NdO2JyZWFrO2Nhc2UgMTpmb3IoYz0wO2M8dDsrK2Mpc1t1KytdPW5bY107Zm9yKDtjPGU7KytjKXNbdV09c1t1LXRdK25bY10mMjU1LHUrKzticmVhaztjYXNlIDI6Zm9yKGM9MDtjPGU7KytjKXNbdSsrXT1vW2NdK25bY10mMjU1O2JyZWFrO2Nhc2UgMzpmb3IoYz0wO2M8dDsrK2Mpc1t1KytdPShvW2NdPj4xKStuW2NdO2Zvcig7YzxlOysrYylzW3VdPShvW2NdK3NbdS10XT4+MSkrbltjXSYyNTUsdSsrO2JyZWFrO2Nhc2UgNDpmb3IoYz0wO2M8dDsrK2MpbD1vW2NdLGg9bltjXSxzW3UrK109bCtoO2Zvcig7YzxlOysrYyl7bD1vW2NdO2NvbnN0IGU9b1tjLXRdLHI9c1t1LXRdLGE9citsLWU7bGV0IGk9YS1yO2k8MCYmKGk9LWkpO2xldCBkPWEtbDtkPDAmJihkPS1kKTtsZXQgZj1hLWU7ZjwwJiYoZj0tZiksaD1uW2NdLHNbdSsrXT1pPD1kJiZpPD1mP3IraDpkPD1mP2wraDplK2h9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaS5Gb3JtYXRFcnJvcigiVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAiLmNvbmNhdChyKSl9dGhpcy5idWZmZXJMZW5ndGgrPWV9fXQuUHJlZGljdG9yU3RyZWFtPXN9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5SdW5MZW5ndGhTdHJlYW09dm9pZCAwO3ZhciBuPXIoMTY4KTtjbGFzcyBhIGV4dGVuZHMgbi5EZWNvZGVTdHJlYW17Y29uc3RydWN0b3IoZSx0KXtzdXBlcih0KSx0aGlzLnN0cj1lLHRoaXMuZGljdD1lLmRpY3R9cmVhZEJsb2NrKCl7Y29uc3QgZT10aGlzLnN0ci5nZXRCeXRlcygyKTtpZighZXx8ZS5sZW5ndGg8Mnx8MTI4PT09ZVswXSlyZXR1cm4gdm9pZCh0aGlzLmVvZj0hMCk7bGV0IHQscj10aGlzLmJ1ZmZlckxlbmd0aCxuPWVbMF07aWYobjwxMjgpe2lmKHQ9dGhpcy5lbnN1cmVCdWZmZXIocituKzEpLHRbcisrXT1lWzFdLG4+MCl7Y29uc3QgZT10aGlzLnN0ci5nZXRCeXRlcyhuKTt0LnNldChlLHIpLHIrPW59fWVsc2V7bj0yNTctbjtjb25zdCBhPWVbMV07dD10aGlzLmVuc3VyZUJ1ZmZlcihyK24rMSk7Zm9yKGxldCBlPTA7ZTxuO2UrKyl0W3IrK109YX10aGlzLmJ1ZmZlckxlbmd0aD1yfX10LlJ1bkxlbmd0aFN0cmVhbT1hfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRm9udD10LkVycm9yRm9udD12b2lkIDAscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoMTM5KSxyKDE1Nykscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpO3ZhciBuPXIoMTQ0KSxhPXIoMTg1KSxpPXIoMTg4KSxzPXIoMTkwKSxvPXIoMTg5KSxjPXIoMTg3KSxsPXIoMTkxKSxoPXIoMTkyKSx1PXIoMTkzKSxkPXIoMTk0KSxmPXIoMTk1KSxnPXIoMTk2KSxwPXIoMTY0KSxtPXIoMTk3KSxiPXIoMTQ5KSx5PXIoMTU0KSx3PXIoMTk4KTtjb25zdCB2PVtbNTczNDQsNjM3NDNdLFsxMDQ4NTc2LDExMTQxMDldXSx4PTFlMyxTPVsiYXNjZW50IiwiYmJveCIsImJsYWNrIiwiYm9sZCIsImNoYXJQcm9jT3BlcmF0b3JMaXN0IiwiY29tcG9zaXRlIiwiY3NzRm9udEluZm8iLCJkYXRhIiwiZGVmYXVsdFZNZXRyaWNzIiwiZGVmYXVsdFdpZHRoIiwiZGVzY2VudCIsImZhbGxiYWNrTmFtZSIsImZvbnRNYXRyaXgiLCJpc0ludmFsaWRQREZqc0ZvbnQiLCJpc1R5cGUzRm9udCIsIml0YWxpYyIsImxvYWRlZE5hbWUiLCJtaW1ldHlwZSIsIm1pc3NpbmdGaWxlIiwibmFtZSIsInJlbWVhc3VyZSIsInN1YnR5cGUiLCJzeXN0ZW1Gb250SW5mbyIsInR5cGUiLCJ2ZXJ0aWNhbCJdLEE9WyJjTWFwIiwiZGVmYXVsdEVuY29kaW5nIiwiZGlmZmVyZW5jZXMiLCJpc01vbm9zcGFjZSIsImlzU2VyaWZGb250IiwiaXNTeW1ib2xpY0ZvbnQiLCJzZWFjTWFwIiwidG9Gb250Q2hhciIsInRvVW5pY29kZSIsInZtZXRyaWNzIiwid2lkdGhzIl07ZnVuY3Rpb24gayhlKXtpZighZS5mb250TWF0cml4KXJldHVybjtpZihlLmZvbnRNYXRyaXhbMF09PT1uLkZPTlRfSURFTlRJVFlfTUFUUklYWzBdKXJldHVybjtjb25zdCB0PS4wMDEvZS5mb250TWF0cml4WzBdLHI9ZS53aWR0aHM7Zm9yKGNvbnN0IGUgaW4gcilyW2VdKj10O2UuZGVmYXVsdFdpZHRoKj10fWZ1bmN0aW9uIEMoZSl7aWYoIWUuZmFsbGJhY2tUb1VuaWNvZGUpcmV0dXJuO2lmKGUudG9Vbmljb2RlIGluc3RhbmNlb2YgaC5JZGVudGl0eVRvVW5pY29kZU1hcClyZXR1cm47Y29uc3QgdD1bXTtmb3IoY29uc3QgciBpbiBlLmZhbGxiYWNrVG9Vbmljb2RlKWUudG9Vbmljb2RlLmhhcyhyKXx8KHRbcl09ZS5mYWxsYmFja1RvVW5pY29kZVtyXSk7dC5sZW5ndGg+MCYmZS50b1VuaWNvZGUuYW1lbmQodCl9Y2xhc3MgT3tjb25zdHJ1Y3RvcihlLHQscixuLGEsaSxzLG8sYyl7dGhpcy5vcmlnaW5hbENoYXJDb2RlPWUsdGhpcy5mb250Q2hhcj10LHRoaXMudW5pY29kZT1yLHRoaXMuYWNjZW50PW4sdGhpcy53aWR0aD1hLHRoaXMudm1ldHJpYz1pLHRoaXMub3BlcmF0b3JMaXN0SWQ9cyx0aGlzLmlzU3BhY2U9byx0aGlzLmlzSW5Gb250PWN9Z2V0IGNhdGVnb3J5KCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsImNhdGVnb3J5IiwoMCxzLmdldENoYXJVbmljb2RlQ2F0ZWdvcnkpKHRoaXMudW5pY29kZSksITApfX1mdW5jdGlvbiBGKGUsdCl7cmV0dXJuKGU8PDgpK3R9ZnVuY3Rpb24gSShlLHQscil7ZVt0KzFdPXIsZVt0XT1yPj4+OH1mdW5jdGlvbiBUKGUsdCl7Y29uc3Qgcj0oZTw8OCkrdDtyZXR1cm4gMzI3Njgmcj9yLTY1NTM2OnJ9ZnVuY3Rpb24gTShlKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlPj44JjI1NSwyNTUmZSl9ZnVuY3Rpb24gRShlKXtyZXR1cm4gZT4zMjc2Nz9lPTMyNzY3OmU8LTMyNzY4JiYoZT0tMzI3NjgpLFN0cmluZy5mcm9tQ2hhckNvZGUoZT4+OCYyNTUsMjU1JmUpfWZ1bmN0aW9uIFAoZSl7Y29uc3QgdD1lLnBlZWtCeXRlcyg0KTtyZXR1cm4idHRjZiI9PT0oMCxuLmJ5dGVzVG9TdHJpbmcpKHQpfWZ1bmN0aW9uIFIoZSx0KXtmb3IoY29uc3QgciBpbiB0KWVbK3JdPXRbcl19ZnVuY3Rpb24gTihlLHQscil7Y29uc3Qgbj1bXTtsZXQgYTtmb3IobGV0IHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspYT0oMCxzLmdldFVuaWNvZGVGb3JHbHlwaCkoZVtyXSx0KSwtMSE9PWEmJihuW3JdPWEpO2Zvcihjb25zdCBlIGluIHIpYT0oMCxzLmdldFVuaWNvZGVGb3JHbHlwaCkocltlXSx0KSwtMSE9PWEmJihuWytlXT1hKTtyZXR1cm4gbn1mdW5jdGlvbiBEKGUpe3JldHVybiAxPT09ZS5wbGF0Zm9ybSYmMD09PWUuZW5jb2RpbmcmJjA9PT1lLmxhbmd1YWdlfWZ1bmN0aW9uIEIoZSl7cmV0dXJuIDM9PT1lLnBsYXRmb3JtJiYxPT09ZS5lbmNvZGluZyYmMTAzMz09PWUubGFuZ3VhZ2V9ZnVuY3Rpb24gTChlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIHQuY2hhckNvZGVBdCgwKTtjYXNlIDI6cmV0dXJuIHQuY2hhckNvZGVBdCgwKTw8OHx0LmNoYXJDb2RlQXQoMSl9Y29uc3QgYT0iVW5zdXBwb3J0ZWQgQ0lEIHN0cmluZyAoY2hhckNvZGUgIi5jb25jYXQoZSwnKTogIicpLmNvbmNhdCh0LCciLicpO2lmKHIpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoYSk7cmV0dXJuKDAsbi53YXJuKShhKSx0fWZ1bmN0aW9uIF8oZSx0LHIsYSl7Y29uc3QgaT1PYmplY3QuY3JlYXRlKG51bGwpLHM9bmV3IE1hcCxvPVtdLGM9bmV3IFNldDtsZXQgbD0wLGg9dltsXVswXSx1PXZbbF1bMV07Zm9yKGxldCBmIGluIGUpe2Z8PTA7bGV0IGc9ZVtmXTtpZighdChnKSljb250aW51ZTtpZihoPnUpe2lmKGwrKyxsPj12Lmxlbmd0aCl7KDAsbi53YXJuKSgiUmFuIG91dCBvZiBzcGFjZSBpbiBmb250IHByaXZhdGUgdXNlIGFyZWEuIik7YnJlYWt9aD12W2xdWzBdLHU9dltsXVsxXX1jb25zdCBwPWgrKzswPT09ZyYmKGc9cik7bGV0IG09YS5nZXQoZik7InN0cmluZyI9PXR5cGVvZiBtJiYobT1tLmNvZGVQb2ludEF0KDApKSwhbXx8KGQ9bSx2WzBdWzBdPD1kJiZkPD12WzBdWzFdfHx2WzFdWzBdPD1kJiZkPD12WzFdWzFdKXx8Yy5oYXMoZyl8fChzLnNldChtLGcpLGMuYWRkKGcpKSxpW3BdPWcsb1tmXT1wfXZhciBkO3JldHVybnt0b0ZvbnRDaGFyOm8sY2hhckNvZGVUb0dseXBoSWQ6aSx0b1VuaWNvZGVFeHRyYU1hcDpzLG5leHRBdmFpbGFibGVGb250Q2hhckNvZGU6aH19ZnVuY3Rpb24gaihlLHQscil7Y29uc3QgYT1mdW5jdGlvbihlLHQscil7Y29uc3Qgbj1bXTtmb3IoY29uc3QgdCBpbiBlKWVbdF0+PXJ8fG4ucHVzaCh7Zm9udENoYXJDb2RlOjB8dCxnbHlwaElkOmVbdF19KTtpZih0KWZvcihjb25zdFtlLGFdb2YgdClhPj1yfHxuLnB1c2goe2ZvbnRDaGFyQ29kZTplLGdseXBoSWQ6YX0pOzA9PT1uLmxlbmd0aCYmbi5wdXNoKHtmb250Q2hhckNvZGU6MCxnbHlwaElkOjB9KSxuLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZm9udENoYXJDb2RlLXQuZm9udENoYXJDb2RlfSkpO2NvbnN0IGE9W10saT1uLmxlbmd0aDtmb3IobGV0IGU9MDtlPGk7KXtjb25zdCB0PW5bZV0uZm9udENoYXJDb2RlLHI9W25bZV0uZ2x5cGhJZF07KytlO2xldCBzPXQ7Zm9yKDtlPGkmJnMrMT09PW5bZV0uZm9udENoYXJDb2RlJiYoci5wdXNoKG5bZV0uZ2x5cGhJZCksKytzLCsrZSw2NTUzNSE9PXMpOyk7YS5wdXNoKFt0LHMscl0pfXJldHVybiBhfShlLHQsciksaT1hLmF0KC0xKVsxXT42NTUzNT8yOjE7bGV0IHMsbyxjLGwsaD0iXDBcMCIrTShpKSsiXDADXDABIisoMCxuLnN0cmluZzMyKSg0KzgqaSk7Zm9yKHM9YS5sZW5ndGgtMTtzPj0wJiYhKGFbc11bMF08PTY1NTM1KTstLXMpO2NvbnN0IHU9cysxO2Fbc11bMF08NjU1MzUmJjY1NTM1PT09YVtzXVsxXSYmKGFbc11bMV09NjU1MzQpO2NvbnN0IGQ9YVtzXVsxXTw2NTUzNT8xOjAsZj11K2QsZz1tLk9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKGYsMik7bGV0IHAsYix5LHcsdj0iIix4PSIiLFM9IiIsQT0iIixrPSIiLEM9MDtmb3Iocz0wLG89dTtzPG87cysrKXtwPWFbc10sYj1wWzBdLHk9cFsxXSx2Kz1NKGIpLHgrPU0oeSksdz1wWzJdO2xldCBlPSEwO2ZvcihjPTEsbD13Lmxlbmd0aDtjPGw7KytjKWlmKHdbY10hPT13W2MtMV0rMSl7ZT0hMTticmVha31pZihlKVMrPU0od1swXS1iJjY1NTM1KSxBKz1NKDApO2Vsc2V7Y29uc3QgZT0yKihmLXMpKzIqQztmb3IoQys9eS1iKzEsUys9TSgwKSxBKz1NKGUpLGM9MCxsPXcubGVuZ3RoO2M8bDsrK2Mpays9TSh3W2NdKX19ZD4wJiYoeCs9IsO/w78iLHYrPSLDv8O/IixTKz0iXDABIixBKz0iXDBcMCIpO2NvbnN0IE89IlwwXDAiK00oMipmKStNKGcucmFuZ2UpK00oZy5lbnRyeSkrTShnLnJhbmdlU2hpZnQpK3grIlwwXDAiK3YrUytBK2s7bGV0IEY9IiIsST0iIjtpZihpPjEpe2ZvcihoKz0iXDADXDBcbiIrKDAsbi5zdHJpbmczMikoNCs4KmkrNCtPLmxlbmd0aCksRj0iIixzPTAsbz1hLmxlbmd0aDtzPG87cysrKXtwPWFbc10sYj1wWzBdLHc9cFsyXTtsZXQgZT13WzBdO2ZvcihjPTEsbD13Lmxlbmd0aDtjPGw7KytjKXdbY10hPT13W2MtMV0rMSYmKHk9cFswXStjLTEsRis9KDAsbi5zdHJpbmczMikoYikrKDAsbi5zdHJpbmczMikoeSkrKDAsbi5zdHJpbmczMikoZSksYj15KzEsZT13W2NdKTtGKz0oMCxuLnN0cmluZzMyKShiKSsoMCxuLnN0cmluZzMyKShwWzFdKSsoMCxuLnN0cmluZzMyKShlKX1JPSJcMFxmXDBcMCIrKDAsbi5zdHJpbmczMikoRi5sZW5ndGgrMTYpKyJcMFwwXDBcMCIrKDAsbi5zdHJpbmczMikoRi5sZW5ndGgvMTIpfXJldHVybiBoKyJcMAQiK00oTy5sZW5ndGgrNCkrTytJK0Z9ZnVuY3Rpb24gVShlLHQscil7cnx8KHI9e3VuaXRzUGVyRW06MCx5TWF4OjAseU1pbjowLGFzY2VudDowLGRlc2NlbnQ6MH0pO2xldCBhPTAsaT0wLG89MCxjPTAsbD1udWxsLGg9MCx1PS0xO2lmKHQpe2ZvcihsZXQgZSBpbiB0KWlmKGV8PTAsKGw+ZXx8IWwpJiYobD1lKSxoPGUmJihoPWUpLHU9KDAscy5nZXRVbmljb2RlUmFuZ2VGb3IpKGUsdSksdTwzMilhfD0xPDx1O2Vsc2UgaWYodTw2NClpfD0xPDx1LTMyO2Vsc2UgaWYodTw5NilvfD0xPDx1LTY0O2Vsc2V7aWYoISh1PDEyMykpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVuaWNvZGUgcmFuZ2VzIEJpdHMgPiAxMjMgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZSIpO2N8PTE8PHUtOTZ9aD42NTUzNSYmKGg9NjU1MzUpfWVsc2UgbD0wLGg9MjU1O2NvbnN0IGQ9ZS5iYm94fHxbMCwwLDAsMF0sZj1yLnVuaXRzUGVyRW18fDEvKGUuZm9udE1hdHJpeHx8bi5GT05UX0lERU5USVRZX01BVFJJWClbMF0sZz1lLmFzY2VudFNjYWxlZD8xOmYveCxwPXIuYXNjZW50fHxNYXRoLnJvdW5kKGcqKGUuYXNjZW50fHxkWzNdKSk7bGV0IG09ci5kZXNjZW50fHxNYXRoLnJvdW5kKGcqKGUuZGVzY2VudHx8ZFsxXSkpO20+MCYmZS5kZXNjZW50PjAmJmRbMV08MCYmKG09LW0pO2NvbnN0IGI9ci55TWF4fHxwLHk9LXIueU1pbnx8LW07cmV0dXJuIlwwAwIkAcO0XDAFXDBcMALCigLCu1wwXDBcMMKMAsKKAsK7XDBcMAHDn1x4MDAxAQJcMFwwXDBcMAYiK1N0cmluZy5mcm9tQ2hhckNvZGUoZS5maXhlZFBpdGNoPzk6MCkrIlwwXDBcMFwwXDBcMCIrKDAsbi5zdHJpbmczMikoYSkrKDAsbi5zdHJpbmczMikoaSkrKDAsbi5zdHJpbmczMikobykrKDAsbi5zdHJpbmczMikoYykrIioyMSoiK00oZS5pdGFsaWNBbmdsZT8xOjApK00obHx8ZS5maXJzdENoYXIpK00oaHx8ZS5sYXN0Q2hhcikrTShwKStNKG0pKyJcMGQiK00oYikrTSh5KSsiXDBcMFwwXDBcMFwwXDBcMCIrTShlLnhIZWlnaHQpK00oZS5jYXBIZWlnaHQpK00oMCkrTShsfHxlLmZpcnN0Q2hhcikrIlwwAyJ9ZnVuY3Rpb24gJChlKXtjb25zdCB0PU1hdGguZmxvb3IoNjU1MzYqZS5pdGFsaWNBbmdsZSk7cmV0dXJuIlwwA1wwXDAiKygwLG4uc3RyaW5nMzIpKHQpKyJcMFwwXDBcMCIrKDAsbi5zdHJpbmczMikoZS5maXhlZFBpdGNoPzE6MCkrIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIn1mdW5jdGlvbiBYKGUpe3JldHVybiBlLnJlcGxhY2VBbGwoL1teXHgyMS1ceDdFXXxbW1xdKCl7fTw+LyVdL2csIiIpLnNsaWNlKDAsNjMpfWZ1bmN0aW9uIEgoZSx0KXt0fHwodD1bW10sW11dKTtjb25zdCByPVt0WzBdWzBdfHwiT3JpZ2luYWwgbGljZW5jZSIsdFswXVsxXXx8ZSx0WzBdWzJdfHwiVW5rbm93biIsdFswXVszXXx8InVuaXF1ZUlEIix0WzBdWzRdfHxlLHRbMF1bNV18fCJWZXJzaW9uIDAuMTEiLHRbMF1bNl18fFgoZSksdFswXVs3XXx8IlVua25vd24iLHRbMF1bOF18fCJVbmtub3duIix0WzBdWzldfHwiVW5rbm93biJdLG49W107bGV0IGEsaSxzLG8sYztmb3IoYT0wLGk9ci5sZW5ndGg7YTxpO2ErKyl7Yz10WzFdW2FdfHxyW2FdO2NvbnN0IGU9W107Zm9yKHM9MCxvPWMubGVuZ3RoO3M8bztzKyspZS5wdXNoKE0oYy5jaGFyQ29kZUF0KHMpKSk7bi5wdXNoKGUuam9pbigiIikpfWNvbnN0IGw9W3Isbl0saD1bIlwwASIsIlwwAyJdLHU9WyJcMFwwIiwiXDABIl0sZD1bIlwwXDAiLCIEXHQiXSxmPXIubGVuZ3RoKmgubGVuZ3RoO2xldCBnPSJcMFwwIitNKGYpK00oMTIqZis2KSxwPTA7Zm9yKGE9MCxpPWgubGVuZ3RoO2E8aTthKyspe2NvbnN0IGU9bFthXTtmb3Iocz0wLG89ZS5sZW5ndGg7czxvO3MrKyljPWVbc10sZys9aFthXSt1W2FdK2RbYV0rTShzKStNKGMubGVuZ3RoKStNKHApLHArPWMubGVuZ3RofXJldHVybiBnKz1yLmpvaW4oIiIpK24uam9pbigiIiksZ310LkZvbnQ9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LHIpe3ZhciBhO3RoaXMubmFtZT1lLHRoaXMucHNOYW1lPW51bGwsdGhpcy5taW1ldHlwZT1udWxsLHRoaXMuZGlzYWJsZUZvbnRGYWNlPSExLHRoaXMubG9hZGVkTmFtZT1yLmxvYWRlZE5hbWUsdGhpcy5pc1R5cGUzRm9udD1yLmlzVHlwZTNGb250LHRoaXMubWlzc2luZ0ZpbGU9ITEsdGhpcy5jc3NGb250SW5mbz1yLmNzc0ZvbnRJbmZvLHRoaXMuX2NoYXJzQ2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9nbHlwaENhY2hlPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHM9ISEoci5mbGFncyZpLkZvbnRGbGFncy5TZXJpZik7aWYoIXMmJiFyLmlzU2ltdWxhdGVkRmxhZ3Mpe2NvbnN0IHQ9ZS5yZXBsYWNlQWxsKC9bLF9dL2csIi0iKS5zcGxpdCgiLSIpWzBdLHI9KDAsbC5nZXRTZXJpZkZvbnRzKSgpO2Zvcihjb25zdCBlIG9mIHQuc3BsaXQoIisiKSlpZihyW2VdKXtzPSEwO2JyZWFrfX10aGlzLmlzU2VyaWZGb250PXMsdGhpcy5pc1N5bWJvbGljRm9udD0hIShyLmZsYWdzJmkuRm9udEZsYWdzLlN5bWJvbGljKSx0aGlzLmlzTW9ub3NwYWNlPSEhKHIuZmxhZ3MmaS5Gb250RmxhZ3MuRml4ZWRQaXRjaCk7bGV0e3R5cGU6byxzdWJ0eXBlOmN9PXI7dGhpcy50eXBlPW8sdGhpcy5zdWJ0eXBlPWMsdGhpcy5zeXN0ZW1Gb250SW5mbz1yLnN5c3RlbUZvbnRJbmZvO2NvbnN0IGg9ZS5tYXRjaCgvXkludmFsaWRQREZqc0ZvbnRfKC4qKV9cZCskLyk7aWYodGhpcy5pc0ludmFsaWRQREZqc0ZvbnQ9ISFoLHRoaXMuaXNJbnZhbGlkUERGanNGb250P3RoaXMuZmFsbGJhY2tOYW1lPWhbMV06dGhpcy5pc01vbm9zcGFjZT90aGlzLmZhbGxiYWNrTmFtZT0ibW9ub3NwYWNlIjp0aGlzLmlzU2VyaWZGb250P3RoaXMuZmFsbGJhY2tOYW1lPSJzZXJpZiI6dGhpcy5mYWxsYmFja05hbWU9InNhbnMtc2VyaWYiLG51bGwhPT0oYT10aGlzLnN5c3RlbUZvbnRJbmZvKSYmdm9pZCAwIT09YSYmYS5ndWVzc0ZhbGxiYWNrJiYodGhpcy5zeXN0ZW1Gb250SW5mby5ndWVzc0ZhbGxiYWNrPSExLHRoaXMuc3lzdGVtRm9udEluZm8uY3NzKz0iLCIuY29uY2F0KHRoaXMuZmFsbGJhY2tOYW1lKSksdGhpcy5kaWZmZXJlbmNlcz1yLmRpZmZlcmVuY2VzLHRoaXMud2lkdGhzPXIud2lkdGhzLHRoaXMuZGVmYXVsdFdpZHRoPXIuZGVmYXVsdFdpZHRoLHRoaXMuY29tcG9zaXRlPXIuY29tcG9zaXRlLHRoaXMuY01hcD1yLmNNYXAsdGhpcy5jYXBIZWlnaHQ9ci5jYXBIZWlnaHQveCx0aGlzLmFzY2VudD1yLmFzY2VudC94LHRoaXMuZGVzY2VudD1yLmRlc2NlbnQveCx0aGlzLmxpbmVIZWlnaHQ9dGhpcy5hc2NlbnQtdGhpcy5kZXNjZW50LHRoaXMuZm9udE1hdHJpeD1yLmZvbnRNYXRyaXgsdGhpcy5iYm94PXIuYmJveCx0aGlzLmRlZmF1bHRFbmNvZGluZz1yLmRlZmF1bHRFbmNvZGluZyx0aGlzLnRvVW5pY29kZT1yLnRvVW5pY29kZSx0aGlzLnRvRm9udENoYXI9W10sIlR5cGUzIj09PXIudHlwZSl7Zm9yKGxldCBlPTA7ZTwyNTY7ZSsrKXRoaXMudG9Gb250Q2hhcltlXT10aGlzLmRpZmZlcmVuY2VzW2VdfHxyLmRlZmF1bHRFbmNvZGluZ1tlXTtyZXR1cm59aWYodGhpcy5jaWRFbmNvZGluZz1yLmNpZEVuY29kaW5nfHwiIix0aGlzLnZlcnRpY2FsPSEhci52ZXJ0aWNhbCx0aGlzLnZlcnRpY2FsJiYodGhpcy52bWV0cmljcz1yLnZtZXRyaWNzLHRoaXMuZGVmYXVsdFZNZXRyaWNzPXIuZGVmYXVsdFZNZXRyaWNzKSwhdHx8dC5pc0VtcHR5KXJldHVybiB0JiYoMCxuLndhcm4pKCdGb250IGZpbGUgaXMgZW1wdHkgaW4gIicrZSsnIiAoJyt0aGlzLmxvYWRlZE5hbWUrIikiKSx2b2lkIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocik7bGV0IGQ7W28sY109ZnVuY3Rpb24oZSx0KXtsZXQgcixhLHt0eXBlOmksc3VidHlwZTpzLGNvbXBvc2l0ZTpvfT10O3JldHVybiBmdW5jdGlvbihlKXtjb25zdCB0PWUucGVla0J5dGVzKDQpO3JldHVybiA2NTUzNj09PSgwLGIucmVhZFVpbnQzMikodCwwKXx8InRydWUiPT09KDAsbi5ieXRlc1RvU3RyaW5nKSh0KX0oZSl8fFAoZSk/cj1vPyJDSURGb250VHlwZTIiOiJUcnVlVHlwZSI6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLnBlZWtCeXRlcyg0KTtyZXR1cm4iT1RUTyI9PT0oMCxuLmJ5dGVzVG9TdHJpbmcpKHQpfShlKT9yPW8/IkNJREZvbnRUeXBlMiI6Ik9wZW5UeXBlIjpmdW5jdGlvbihlKXtjb25zdCB0PWUucGVla0J5dGVzKDIpO3JldHVybiAzNz09PXRbMF0mJjMzPT09dFsxXXx8MTI4PT09dFswXSYmMT09PXRbMV19KGUpP3I9bz8iQ0lERm9udFR5cGUwIjoiTU1UeXBlMSI9PT1pPyJNTVR5cGUxIjoiVHlwZTEiOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS5wZWVrQnl0ZXMoNCk7cmV0dXJuIHRbMF0+PTEmJnRbM10+PTEmJnRbM108PTR9KGUpP28/KHI9IkNJREZvbnRUeXBlMCIsYT0iQ0lERm9udFR5cGUwQyIpOihyPSJNTVR5cGUxIj09PWk/Ik1NVHlwZTEiOiJUeXBlMSIsYT0iVHlwZTFDIik6KCgwLG4ud2FybikoImdldEZvbnRGaWxlVHlwZTogVW5hYmxlIHRvIGRldGVjdCBjb3JyZWN0IGZvbnQgZmlsZSBUeXBlL1N1YnR5cGUuIikscj1pLGE9cyksW3IsYV19KHQsciksbz09PXRoaXMudHlwZSYmYz09PXRoaXMuc3VidHlwZXx8KDAsbi5pbmZvKSgiSW5jb25zaXN0ZW50IGZvbnQgZmlsZSBUeXBlL1N1YlR5cGUsIGV4cGVjdGVkOiAiLmNvbmNhdCh0aGlzLnR5cGUsIi8iKS5jb25jYXQodGhpcy5zdWJ0eXBlLCIgYnV0IGZvdW5kOiAiKS5jb25jYXQobywiLyIpLmNvbmNhdChjLCIuIikpO3RyeXtzd2l0Y2gobyl7Y2FzZSJNTVR5cGUxIjooMCxuLmluZm8pKCJNTVR5cGUxIGZvbnQgKCIrZSsiKSwgZmFsbGluZyBiYWNrIHRvIFR5cGUxLiIpO2Nhc2UiVHlwZTEiOmNhc2UiQ0lERm9udFR5cGUwIjp0aGlzLm1pbWV0eXBlPSJmb250L29wZW50eXBlIjtjb25zdCBhPSJUeXBlMUMiPT09Y3x8IkNJREZvbnRUeXBlMEMiPT09Yz9uZXcgdS5DRkZGb250KHQscik6bmV3IHcuVHlwZTFGb250KGUsdCxyKTtrKHIpLGQ9dGhpcy5jb252ZXJ0KGUsYSxyKTticmVhaztjYXNlIk9wZW5UeXBlIjpjYXNlIlRydWVUeXBlIjpjYXNlIkNJREZvbnRUeXBlMiI6dGhpcy5taW1ldHlwZT0iZm9udC9vcGVudHlwZSIsZD10aGlzLmNoZWNrQW5kUmVwYWlyKGUsdCxyKSx0aGlzLmlzT3BlblR5cGUmJihrKHIpLG89Ik9wZW5UeXBlIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiRm9udCAiLmNvbmNhdChvLCIgaXMgbm90IHN1cHBvcnRlZCIpKX19Y2F0Y2goZSl7cmV0dXJuKDAsbi53YXJuKShlKSx2b2lkIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocil9QyhyKSx0aGlzLmRhdGE9ZCx0aGlzLnR5cGU9byx0aGlzLnN1YnR5cGU9Yyx0aGlzLmZvbnRNYXRyaXg9ci5mb250TWF0cml4LHRoaXMud2lkdGhzPXIud2lkdGhzLHRoaXMuZGVmYXVsdFdpZHRoPXIuZGVmYXVsdFdpZHRoLHRoaXMudG9Vbmljb2RlPXIudG9Vbmljb2RlLHRoaXMuc2VhY01hcD1yLnNlYWNNYXB9Z2V0IHJlbmRlcmVyKCl7Y29uc3QgZT1kLkZvbnRSZW5kZXJlckZhY3RvcnkuY3JlYXRlKHRoaXMsaS5TRUFDX0FOQUxZU0lTX0VOQUJMRUQpO3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJyZW5kZXJlciIsZSl9ZXhwb3J0RGF0YSgpe2NvbnN0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXT9bLi4uUywuLi5BXTpTLHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgcixuO2ZvcihyIG9mIGUpbj10aGlzW3JdLHZvaWQgMCE9PW4mJih0W3JdPW4pO3JldHVybiB0fWZhbGxiYWNrVG9TeXN0ZW1Gb250KGUpe3RoaXMubWlzc2luZ0ZpbGU9ITA7Y29uc3R7bmFtZTp0LHR5cGU6cn09dGhpcztsZXQgbj0oMCxpLm5vcm1hbGl6ZUZvbnROYW1lKSh0KTtjb25zdCBhPSgwLGwuZ2V0U3RkRm9udE1hcCkoKSx1PSgwLGwuZ2V0Tm9uU3RkRm9udE1hcCkoKSxkPSEhYVtuXSxnPSEoIXVbbl18fCFhW3Vbbl1dKTtuPWFbbl18fHVbbl18fG47Y29uc3QgcD0oMCxmLmdldEZvbnRCYXNpY01ldHJpY3MpKClbbl07cCYmKGlzTmFOKHRoaXMuYXNjZW50KSYmKHRoaXMuYXNjZW50PXAuYXNjZW50L3gpLGlzTmFOKHRoaXMuZGVzY2VudCkmJih0aGlzLmRlc2NlbnQ9cC5kZXNjZW50L3gpLGlzTmFOKHRoaXMuY2FwSGVpZ2h0KSYmKHRoaXMuY2FwSGVpZ2h0PXAuY2FwSGVpZ2h0L3gpKSx0aGlzLmJvbGQ9L2JvbGQvZ2kudGVzdChuKSx0aGlzLml0YWxpYz0vb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChuKSx0aGlzLmJsYWNrPS9CbGFjay9nLnRlc3QodCk7Y29uc3QgbT0vTmFycm93L2cudGVzdCh0KTtpZih0aGlzLnJlbWVhc3VyZT0oIWR8fG0pJiZPYmplY3Qua2V5cyh0aGlzLndpZHRocykubGVuZ3RoPjAsKGR8fGcpJiYiQ0lERm9udFR5cGUyIj09PXImJnRoaXMuY2lkRW5jb2Rpbmcuc3RhcnRzV2l0aCgiSWRlbnRpdHktIikpe2NvbnN0IHI9ZS5jaWRUb0dpZE1hcCxuPVtdO2lmKFIobiwoMCxsLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSksL0FyaWFsLT9CbGFjay9pLnRlc3QodCk/UihuLCgwLGwuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrKSgpKTovQ2FsaWJyaS9pLnRlc3QodCkmJlIobiwoMCxsLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSkoKSkscil7Zm9yKGNvbnN0IGUgaW4gbil7Y29uc3QgdD1uW2VdO3ZvaWQgMCE9PXJbdF0mJihuWytlXT1yW3RdKX1yLmxlbmd0aCE9PXRoaXMudG9Vbmljb2RlLmxlbmd0aCYmZS5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCYmdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwJiZ0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe2NvbnN0IGE9bltlXTt2b2lkIDA9PT1yW2FdJiYoblsrZV09dCl9KSl9dGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwfHx0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe25bK2VdPXR9KSksdGhpcy50b0ZvbnRDaGFyPW4sdGhpcy50b1VuaWNvZGU9bmV3IGguVG9Vbmljb2RlTWFwKG4pfWVsc2UgaWYoL1N5bWJvbC9pLnRlc3QobikpdGhpcy50b0ZvbnRDaGFyPU4oYy5TeW1ib2xTZXRFbmNvZGluZywoMCxvLmdldEdseXBoc1VuaWNvZGUpKCksdGhpcy5kaWZmZXJlbmNlcyk7ZWxzZSBpZigvRGluZ2JhdHMvaS50ZXN0KG4pKXRoaXMudG9Gb250Q2hhcj1OKGMuWmFwZkRpbmdiYXRzRW5jb2RpbmcsKDAsby5nZXREaW5nYmF0c0dseXBoc1VuaWNvZGUpKCksdGhpcy5kaWZmZXJlbmNlcyk7ZWxzZSBpZihkKXtjb25zdCBlPU4odGhpcy5kZWZhdWx0RW5jb2RpbmcsKDAsby5nZXRHbHlwaHNVbmljb2RlKSgpLHRoaXMuZGlmZmVyZW5jZXMpOyJDSURGb250VHlwZTIiIT09cnx8dGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKCJJZGVudGl0eS0iKXx8dGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBoLklkZW50aXR5VG9Vbmljb2RlTWFwfHx0aGlzLnRvVW5pY29kZS5mb3JFYWNoKChmdW5jdGlvbih0LHIpe2VbK3RdPXJ9KSksdGhpcy50b0ZvbnRDaGFyPWV9ZWxzZXtjb25zdCBlPSgwLG8uZ2V0R2x5cGhzVW5pY29kZSkoKSxyPVtdO3RoaXMudG9Vbmljb2RlLmZvckVhY2goKCh0LG4pPT57aWYoIXRoaXMuY29tcG9zaXRlKXtjb25zdCByPXRoaXMuZGlmZmVyZW5jZXNbdF18fHRoaXMuZGVmYXVsdEVuY29kaW5nW3RdLGE9KDAscy5nZXRVbmljb2RlRm9yR2x5cGgpKHIsZSk7LTEhPT1hJiYobj1hKX1yWyt0XT1ufSkpLHRoaXMuY29tcG9zaXRlJiZ0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXAmJi9UYWhvbWF8VmVyZGFuYS9pLnRlc3QodCkmJlIociwoMCxsLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSksdGhpcy50b0ZvbnRDaGFyPXJ9QyhlKSx0aGlzLmxvYWRlZE5hbWU9bi5zcGxpdCgiLSIpWzBdfWNoZWNrQW5kUmVwYWlyKGUsdCxyKXt2YXIgcyxsO2NvbnN0IGQ9WyJPUy8yIiwiY21hcCIsImhlYWQiLCJoaGVhIiwiaG10eCIsIm1heHAiLCJuYW1lIiwicG9zdCIsImxvY2EiLCJnbHlmIiwiZnBnbSIsInByZXAiLCJjdnQgIiwiQ0ZGICJdO2Z1bmN0aW9uIGYoZSx0KXtjb25zdCByPU9iamVjdC5jcmVhdGUobnVsbCk7clsiT1MvMiJdPW51bGwsci5jbWFwPW51bGwsci5oZWFkPW51bGwsci5oaGVhPW51bGwsci5obXR4PW51bGwsci5tYXhwPW51bGwsci5uYW1lPW51bGwsci5wb3N0PW51bGw7Zm9yKGxldCBuPTA7bjx0O24rKyl7Y29uc3QgdD1iKGUpO2QuaW5jbHVkZXModC50YWcpJiYwIT09dC5sZW5ndGgmJihyW3QudGFnXT10KX1yZXR1cm4gcn1mdW5jdGlvbiBiKGUpe2NvbnN0IHQ9ZS5nZXRTdHJpbmcoNCkscj1lLmdldEludDMyKCk+Pj4wLG49ZS5nZXRJbnQzMigpPj4+MCxhPWUuZ2V0SW50MzIoKT4+PjAsaT1lLnBvcztlLnBvcz1lLnN0YXJ0fHwwLGUuc2tpcChuKTtjb25zdCBzPWUuZ2V0Qnl0ZXMoYSk7cmV0dXJuIGUucG9zPWksImhlYWQiPT09dCYmKHNbOF09c1s5XT1zWzEwXT1zWzExXT0wLHNbMTddfD0zMikse3RhZzp0LGNoZWNrc3VtOnIsbGVuZ3RoOmEsb2Zmc2V0Om4sZGF0YTpzfX1mdW5jdGlvbiB3KGUpe3JldHVybnt2ZXJzaW9uOmUuZ2V0U3RyaW5nKDQpLG51bVRhYmxlczplLmdldFVpbnQxNigpLHNlYXJjaFJhbmdlOmUuZ2V0VWludDE2KCksZW50cnlTZWxlY3RvcjplLmdldFVpbnQxNigpLHJhbmdlU2hpZnQ6ZS5nZXRVaW50MTYoKX19ZnVuY3Rpb24gdihlLHQscixuLGEsaSl7Y29uc3Qgcz17bGVuZ3RoOjAsc2l6ZU9mSW5zdHJ1Y3Rpb25zOjB9O2lmKHQ8MHx8dD49ZS5sZW5ndGh8fHI+ZS5sZW5ndGh8fHItdDw9MTIpcmV0dXJuIHM7Y29uc3Qgbz1lLnN1YmFycmF5KHQsciksYz1UKG9bMl0sb1szXSksbD1UKG9bNF0sb1s1XSksaD1UKG9bNl0sb1s3XSksdT1UKG9bOF0sb1s5XSk7Yz5oJiYoSShvLDIsaCksSShvLDYsYykpLGw+dSYmKEkobyw0LHUpLEkobyw4LGwpKTtjb25zdCBkPVQob1swXSxvWzFdKTtpZihkPDApcmV0dXJuIGQ8LTF8fChuLnNldChvLGEpLHMubGVuZ3RoPW8ubGVuZ3RoKSxzO2xldCBmLGc9MTAscD0wO2ZvcihmPTA7ZjxkO2YrKylwPTErKG9bZ108PDh8b1tnKzFdKSxnKz0yO2NvbnN0IG09ZyxiPW9bZ108PDh8b1tnKzFdO3Muc2l6ZU9mSW5zdHJ1Y3Rpb25zPWIsZys9MitiO2NvbnN0IHk9ZztsZXQgdz0wO2ZvcihmPTA7ZjxwO2YrKyl7Y29uc3QgZT1vW2crK107MTkyJmUmJihvW2ctMV09NjMmZSk7bGV0IHQ9MjsyJmU/dD0xOjE2JmUmJih0PTApO2xldCByPTI7NCZlP3I9MTozMiZlJiYocj0wKTtjb25zdCBuPXQrcjtpZih3Kz1uLDgmZSl7Y29uc3QgZT1vW2crK107MD09PWUmJihvW2ctMV1ePTgpLGYrPWUsdys9ZSpufX1pZigwPT09dylyZXR1cm4gcztsZXQgdj1nK3c7cmV0dXJuIHY+by5sZW5ndGg/czohaSYmYj4wPyhuLnNldChvLnN1YmFycmF5KDAsbSksYSksbi5zZXQoWzAsMF0sYSttKSxuLnNldChvLnN1YmFycmF5KHksdiksYSttKzIpLHYtPWIsby5sZW5ndGgtdj4zJiYodj12KzMmLTQpLHMubGVuZ3RoPXYscyk6by5sZW5ndGgtdj4zPyh2PXYrMyYtNCxuLnNldChvLnN1YmFycmF5KDAsdiksYSkscy5sZW5ndGg9dixzKToobi5zZXQobyxhKSxzLmxlbmd0aD1vLmxlbmd0aCxzKX1mdW5jdGlvbiB4KGUpe2NvbnN0IHI9KHQuc3RhcnR8fDApK2Uub2Zmc2V0O3QucG9zPXI7Y29uc3Qgbj1bW10sW11dLGE9W10saT1lLmxlbmd0aCxzPXIraTtpZigwIT09dC5nZXRVaW50MTYoKXx8aTw2KXJldHVybltuLGFdO2NvbnN0IG89dC5nZXRVaW50MTYoKSxjPXQuZ2V0VWludDE2KCk7bGV0IGwsaDtmb3IobD0wO2w8byYmdC5wb3MrMTI8PXM7bCsrKXtjb25zdCBlPXtwbGF0Zm9ybTp0LmdldFVpbnQxNigpLGVuY29kaW5nOnQuZ2V0VWludDE2KCksbGFuZ3VhZ2U6dC5nZXRVaW50MTYoKSxuYW1lOnQuZ2V0VWludDE2KCksbGVuZ3RoOnQuZ2V0VWludDE2KCksb2Zmc2V0OnQuZ2V0VWludDE2KCl9OyhEKGUpfHxCKGUpKSYmYS5wdXNoKGUpfWZvcihsPTAsaD1hLmxlbmd0aDtsPGg7bCsrKXtjb25zdCBlPWFbbF07aWYoZS5sZW5ndGg8PTApY29udGludWU7Y29uc3QgaT1yK2MrZS5vZmZzZXQ7aWYoaStlLmxlbmd0aD5zKWNvbnRpbnVlO3QucG9zPWk7Y29uc3Qgbz1lLm5hbWU7aWYoZS5lbmNvZGluZyl7bGV0IHI9IiI7Zm9yKGxldCBuPTAsYT1lLmxlbmd0aDtuPGE7bis9MilyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHQuZ2V0VWludDE2KCkpO25bMV1bb109cn1lbHNlIG5bMF1bb109dC5nZXRTdHJpbmcoZS5sZW5ndGgpfXJldHVybltuLGFdfWNvbnN0IFM9WzAsMCwwLDAsMCwwLDAsMCwtMiwtMiwtMiwtMiwwLDAsLTIsLTUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwwLC0xLDAsLTEsLTEsLTEsLTEsMSwtMSwtOTk5LDAsMSwwLC0xLC0yLDAsLTEsLTIsLTEsLTEsMCwtMSwtMSwwLDAsLTk5OSwtOTk5LC0xLC0xLC0xLC0xLC0yLC05OTksLTIsLTIsLTk5OSwwLC0yLC0yLDAsMCwtMiwwLC0yLDAsMCwwLC0yLC0xLC0xLDEsMSwwLDAsLTEsLTEsLTEsLTEsLTEsLTEsLTEsMCwwLC0xLDAsLTEsLTEsMCwtOTk5LC0xLC0xLC0xLC0xLC0xLC0xLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLC0yLC05OTksLTk5OSwtOTk5LC05OTksLTk5OSwtMSwtMSwtMiwtMiwwLDAsMCwwLC0xLC0xLC05OTksLTIsLTIsMCwwLC0xLC0yLC0yLDAsMCwwLC0xLC0xLC0xLC0yXTtmdW5jdGlvbiBBKGUsdCl7bGV0IHIsYSxpLHMsbyxjPWUuZGF0YSxsPTAsaD0wLHU9MDtjb25zdCBkPVtdLGY9W10sZz1bXTtsZXQgcD10LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyxtPSExLGI9MCx5PTA7Zm9yKGxldCBlPWMubGVuZ3RoO2w8ZTspe2NvbnN0IGU9Y1tsKytdO2lmKDY0PT09ZSlpZihhPWNbbCsrXSxtfHx5KWwrPWE7ZWxzZSBmb3Iocj0wO3I8YTtyKyspZC5wdXNoKGNbbCsrXSk7ZWxzZSBpZig2NT09PWUpaWYoYT1jW2wrK10sbXx8eSlsKz0yKmE7ZWxzZSBmb3Iocj0wO3I8YTtyKyspaT1jW2wrK10sZC5wdXNoKGk8PDh8Y1tsKytdKTtlbHNlIGlmKDE3Nj09KDI0OCZlKSlpZihhPWUtMTc2KzEsbXx8eSlsKz1hO2Vsc2UgZm9yKHI9MDtyPGE7cisrKWQucHVzaChjW2wrK10pO2Vsc2UgaWYoMTg0PT0oMjQ4JmUpKWlmKGE9ZS0xODQrMSxtfHx5KWwrPTIqYTtlbHNlIGZvcihyPTA7cjxhO3IrKylpPWNbbCsrXSxkLnB1c2goaTw8OHxjW2wrK10pO2Vsc2UgaWYoNDMhPT1lfHxwKWlmKDQ0IT09ZXx8cCl7aWYoNDU9PT1lKWlmKG0pbT0hMSxoPWw7ZWxzZXtpZihvPWYucG9wKCksIW8pcmV0dXJuKDAsbi53YXJuKSgiVFQ6IEVOREYgYmFkIHN0YWNrIiksdm9pZCh0LmhpbnRzVmFsaWQ9ITEpO3M9Zy5wb3AoKSxjPW8uZGF0YSxsPW8uaSx0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW3NdPWQubGVuZ3RoLW8uc3RhY2tUb3B9ZWxzZSBpZigxMzc9PT1lKShtfHx5KSYmKCgwLG4ud2FybikoIlRUOiBuZXN0ZWQgSURFRnMgbm90IGFsbG93ZWQiKSxwPSEwKSxtPSEwLHU9bDtlbHNlIGlmKDg4PT09ZSkrK2I7ZWxzZSBpZigyNz09PWUpeT1iO2Vsc2UgaWYoODk9PT1lKXk9PT1iJiYoeT0wKSwtLWI7ZWxzZSBpZigyOD09PWUmJiFtJiYheSl7Y29uc3QgZT1kLmF0KC0xKTtlPjAmJihsKz1lLTEpfX1lbHNlKG18fHkpJiYoKDAsbi53YXJuKSgiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZCIpLHA9ITApLG09ITAsdT1sLHM9ZC5wb3AoKSx0LmZ1bmN0aW9uc0RlZmluZWRbc109e2RhdGE6YyxpOmx9O2Vsc2UgaWYoIW0mJiF5KWlmKHM9ZC5hdCgtMSksaXNOYU4ocykpKDAsbi5pbmZvKSgiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpO2Vsc2UgaWYodC5mdW5jdGlvbnNVc2VkW3NdPSEwLHMgaW4gdC5mdW5jdGlvbnNTdGFja0RlbHRhcyl7Y29uc3QgZT1kLmxlbmd0aCt0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW3NdO2lmKGU8MClyZXR1cm4oMCxuLndhcm4pKCJUVDogQ0FMTCBpbnZhbGlkIGZ1bmN0aW9ucyBzdGFjayBkZWx0YS4iKSx2b2lkKHQuaGludHNWYWxpZD0hMSk7ZC5sZW5ndGg9ZX1lbHNlIGlmKHMgaW4gdC5mdW5jdGlvbnNEZWZpbmVkJiYhZy5pbmNsdWRlcyhzKSl7aWYoZi5wdXNoKHtkYXRhOmMsaTpsLHN0YWNrVG9wOmQubGVuZ3RoLTF9KSxnLnB1c2gocyksbz10LmZ1bmN0aW9uc0RlZmluZWRbc10sIW8pcmV0dXJuKDAsbi53YXJuKSgiVFQ6IENBTEwgbm9uLWV4aXN0ZW50IGZ1bmN0aW9uIiksdm9pZCh0LmhpbnRzVmFsaWQ9ITEpO2M9by5kYXRhLGw9by5pfWlmKCFtJiYheSl7bGV0IHQ9MDtmb3IoZTw9MTQyP3Q9U1tlXTplPj0xOTImJmU8PTIyMz90PS0xOmU+PTIyNCYmKHQ9LTIpLGU+PTExMyYmZTw9MTE3JiYoYT1kLnBvcCgpLGlzTmFOKGEpfHwodD0yKi1hKSk7dDwwJiZkLmxlbmd0aD4wOylkLnBvcCgpLHQrKztmb3IoO3Q+MDspZC5wdXNoKE5hTiksdC0tfX10LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucz1wO2NvbnN0IHc9W2NdO2w+Yy5sZW5ndGgmJncucHVzaChuZXcgVWludDhBcnJheShsLWMubGVuZ3RoKSksdT5oJiYoKDAsbi53YXJuKSgiVFQ6IGNvbXBsZW1lbnRpbmcgYSBtaXNzaW5nIGZ1bmN0aW9uIHRhaWwiKSx3LnB1c2gobmV3IFVpbnQ4QXJyYXkoWzM0LDQ1XSkpKSxmdW5jdGlvbihlLHQpe2lmKHQubGVuZ3RoPjEpe2xldCByLG4sYT0wO2ZvcihyPTAsbj10Lmxlbmd0aDtyPG47cisrKWErPXRbcl0ubGVuZ3RoO2E9YSszJi00O2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IHM9MDtmb3Iocj0wLG49dC5sZW5ndGg7cjxuO3IrKylpLnNldCh0W3JdLHMpLHMrPXRbcl0ubGVuZ3RoO2UuZGF0YT1pLGUubGVuZ3RoPWF9fShlLHcpfWxldCBDLE8sTSxFO2lmKFAodD1uZXcgeS5TdHJlYW0obmV3IFVpbnQ4QXJyYXkodC5nZXRCeXRlcygpKSkpKXtjb25zdCBlPWZ1bmN0aW9uKGUsdCl7Y29uc3R7bnVtRm9udHM6cixvZmZzZXRUYWJsZTphfT1mdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0U3RyaW5nKDQpOygwLG4uYXNzZXJ0KSgidHRjZiI9PT10LCJNdXN0IGJlIGEgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBmb250LiIpO2NvbnN0IHI9ZS5nZXRVaW50MTYoKSxhPWUuZ2V0VWludDE2KCksaT1lLmdldEludDMyKCk+Pj4wLHM9W107Zm9yKGxldCB0PTA7dDxpO3QrKylzLnB1c2goZS5nZXRJbnQzMigpPj4+MCk7Y29uc3Qgbz17dHRjVGFnOnQsbWFqb3JWZXJzaW9uOnIsbWlub3JWZXJzaW9uOmEsbnVtRm9udHM6aSxvZmZzZXRUYWJsZTpzfTtzd2l0Y2gocil7Y2FzZSAxOnJldHVybiBvO2Nhc2UgMjpyZXR1cm4gby5kc2lnVGFnPWUuZ2V0SW50MzIoKT4+PjAsby5kc2lnTGVuZ3RoPWUuZ2V0SW50MzIoKT4+PjAsby5kc2lnT2Zmc2V0PWUuZ2V0SW50MzIoKT4+PjAsb310aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiSW52YWxpZCBUcnVlVHlwZSBDb2xsZWN0aW9uIG1ham9yVmVyc2lvbjogIi5jb25jYXQociwiLiIpKX0oZSksaT10LnNwbGl0KCIrIik7bGV0IHM7Zm9yKGxldCBjPTA7YzxyO2MrKyl7ZS5wb3M9KGUuc3RhcnR8fDApK2FbY107Y29uc3Qgcj13KGUpLGw9ZihlLHIubnVtVGFibGVzKTtpZighbC5uYW1lKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQgbXVzdCBjb250YWluIGEgIm5hbWUiIHRhYmxlLicpO2NvbnN0W2hdPXgobC5uYW1lKTtmb3IobGV0IGU9MCxuPWgubGVuZ3RoO2U8bjtlKyspZm9yKGxldCBuPTAsYT1oW2VdLmxlbmd0aDtuPGE7bisrKXt2YXIgbztjb25zdCBhPW51bGw9PT0obz1oW2VdW25dKXx8dm9pZCAwPT09bz92b2lkIDA6by5yZXBsYWNlQWxsKC9ccy9nLCIiKTtpZihhKXtpZihhPT09dClyZXR1cm57aGVhZGVyOnIsdGFibGVzOmx9O2lmKCEoaS5sZW5ndGg8MikpZm9yKGNvbnN0IGUgb2YgaSlhPT09ZSYmKHM9e25hbWU6ZSxoZWFkZXI6cix0YWJsZXM6bH0pfX19aWYocylyZXR1cm4oMCxuLndhcm4pKCdUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gIicuY29uY2F0KHQsJyIgZm9udCwgZmFsbGluZyBiYWNrIHRvICInKS5jb25jYXQocy5uYW1lLCciIGZvbnQgaW5zdGVhZC4nKSkse2hlYWRlcjpzLmhlYWRlcix0YWJsZXM6cy50YWJsZXN9O3Rocm93IG5ldyBuLkZvcm1hdEVycm9yKCdUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gIicuY29uY2F0KHQsJyIgZm9udC4nKSl9KHQsdGhpcy5uYW1lKTtDPWUuaGVhZGVyLE89ZS50YWJsZXN9ZWxzZSBDPXcodCksTz1mKHQsQy5udW1UYWJsZXMpO2NvbnN0IFI9IU9bIkNGRiAiXTtpZihSKXtpZighTy5sb2NhKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibG9jYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7Ty5nbHlmfHwoKDAsbi53YXJuKSgnUmVxdWlyZWQgImdseWYiIHRhYmxlIGlzIG5vdCBmb3VuZCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKSxPLmdseWY9e3RhZzoiZ2x5ZiIsZGF0YTpuZXcgVWludDhBcnJheSgwKX0pLHRoaXMuaXNPcGVuVHlwZT0hMX1lbHNle3ZhciBOO2NvbnN0IHQ9ci5jb21wb3NpdGUmJigobnVsbD09PShOPXIuY2lkVG9HaWRNYXApfHx2b2lkIDA9PT1OP3ZvaWQgMDpOLmxlbmd0aCk+MHx8IShyLmNNYXAgaW5zdGFuY2VvZiBwLklkZW50aXR5Q01hcCkpO2lmKCJPVFRPIj09PUMudmVyc2lvbiYmIXR8fCFPLmhlYWR8fCFPLmhoZWF8fCFPLm1heHB8fCFPLnBvc3QpcmV0dXJuIEU9bmV3IHkuU3RyZWFtKE9bIkNGRiAiXS5kYXRhKSxNPW5ldyB1LkNGRkZvbnQoRSxyKSxrKHIpLHRoaXMuY29udmVydChlLE0scik7ZGVsZXRlIE8uZ2x5ZixkZWxldGUgTy5sb2NhLGRlbGV0ZSBPLmZwZ20sZGVsZXRlIE8ucHJlcCxkZWxldGUgT1siY3Z0ICJdLHRoaXMuaXNPcGVuVHlwZT0hMH1pZighTy5tYXhwKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibWF4cCIgdGFibGUgaXMgbm90IGZvdW5kJyk7dC5wb3M9KHQuc3RhcnR8fDApK08ubWF4cC5vZmZzZXQ7Y29uc3QgWD10LmdldEludDMyKCkscT10LmdldFVpbnQxNigpO2lmKChudWxsPT09KHM9ci5zY2FsZUZhY3RvcnMpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmxlbmd0aCk9PT1xJiZSKXtjb25zdHtzY2FsZUZhY3RvcnM6ZX09cix0PUYoTy5oZWFkLmRhdGFbNTBdLE8uaGVhZC5kYXRhWzUxXSksbj1uZXcgZy5HbHlmVGFibGUoe2dseWZUYWJsZTpPLmdseWYuZGF0YSxpc0dseXBoTG9jYXRpb25zTG9uZzp0LGxvY2FUYWJsZTpPLmxvY2EuZGF0YSxudW1HbHlwaHM6cX0pO24uc2NhbGUoZSk7Y29uc3R7Z2x5ZjphLGxvY2E6aSxpc0xvY2F0aW9uTG9uZzpzfT1uLndyaXRlKCk7Ty5nbHlmLmRhdGE9YSxPLmxvY2EuZGF0YT1pLHMhPT0hIXQmJihPLmhlYWQuZGF0YVs1MF09MCxPLmhlYWQuZGF0YVs1MV09cz8xOjApO2NvbnN0IG89Ty5obXR4LmRhdGE7Zm9yKGxldCB0PTA7dDxxO3QrKyl7Y29uc3Qgcj00KnQsbj1NYXRoLnJvdW5kKGVbdF0qRihvW3JdLG9bcisxXSkpO29bcl09bj4+OCYyNTUsb1tyKzFdPTI1NSZuLEkobyxyKzIsTWF0aC5yb3VuZChlW3RdKlQob1tyKzJdLG9bciszXSkpKX19bGV0IHo9cSsxLEc9ITA7ej42NTUzNSYmKEc9ITEsej1xLCgwLG4ud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gZ2x5ZnMgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpKTtsZXQgVz0wLFY9MDtYPj02NTUzNiYmTy5tYXhwLmxlbmd0aD49MjImJih0LnBvcys9OCx0LmdldFVpbnQxNigpPjImJihPLm1heHAuZGF0YVsxNF09MCxPLm1heHAuZGF0YVsxNV09MiksdC5wb3MrPTQsVz10LmdldFVpbnQxNigpLHQucG9zKz00LFY9dC5nZXRVaW50MTYoKSksTy5tYXhwLmRhdGFbNF09ej4+OCxPLm1heHAuZGF0YVs1XT0yNTUmejtjb25zdCBLPWZ1bmN0aW9uKGUsdCxyLGEpe2NvbnN0IGk9e2Z1bmN0aW9uc0RlZmluZWQ6W10sZnVuY3Rpb25zVXNlZDpbXSxmdW5jdGlvbnNTdGFja0RlbHRhczpbXSx0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnM6ITEsaGludHNWYWxpZDohMH07aWYoZSYmQShlLGkpLHQmJkEodCxpKSxlJiZmdW5jdGlvbihlLHQpe2lmKCFlLnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucylpZihlLmZ1bmN0aW9uc0RlZmluZWQubGVuZ3RoPnQpKDAsbi53YXJuKSgiVFQ6IG1vcmUgZnVuY3Rpb25zIGRlZmluZWQgdGhhbiBleHBlY3RlZCIpLGUuaGludHNWYWxpZD0hMTtlbHNlIGZvcihsZXQgcj0wLGE9ZS5mdW5jdGlvbnNVc2VkLmxlbmd0aDtyPGE7cisrKXtpZihyPnQpcmV0dXJuKDAsbi53YXJuKSgiVFQ6IGludmFsaWQgZnVuY3Rpb24gaWQ6ICIrciksdm9pZChlLmhpbnRzVmFsaWQ9ITEpO2lmKGUuZnVuY3Rpb25zVXNlZFtyXSYmIWUuZnVuY3Rpb25zRGVmaW5lZFtyXSlyZXR1cm4oMCxuLndhcm4pKCJUVDogdW5kZWZpbmVkIGZ1bmN0aW9uOiAiK3IpLHZvaWQoZS5oaW50c1ZhbGlkPSExKX19KGksYSksciYmMSZyLmxlbmd0aCl7Y29uc3QgZT1uZXcgVWludDhBcnJheShyLmxlbmd0aCsxKTtlLnNldChyLmRhdGEpLHIuZGF0YT1lfXJldHVybiBpLmhpbnRzVmFsaWR9KE8uZnBnbSxPLnByZXAsT1siY3Z0ICJdLFcpO2lmKEt8fChkZWxldGUgTy5mcGdtLGRlbGV0ZSBPLnByZXAsZGVsZXRlIE9bImN2dCAiXSksZnVuY3Rpb24oZSx0LHIsYSxpLHMpe2lmKCF0KXJldHVybiB2b2lkKHImJihyLmRhdGE9bnVsbCkpO2UucG9zPShlLnN0YXJ0fHwwKSt0Lm9mZnNldCxlLnBvcys9NCxlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9MixlLnBvcys9Mjtjb25zdCBvPWUuZ2V0VWludDE2KCk7ZS5wb3MrPTgsZS5wb3MrPTI7bGV0IGM9ZS5nZXRVaW50MTYoKTswIT09byYmKDImRihhLmRhdGFbNDRdLGEuZGF0YVs0NV0pfHwodC5kYXRhWzIyXT0wLHQuZGF0YVsyM109MCkpLGM+aSYmKCgwLG4uaW5mbykoIlRoZSBudW1PZk1ldHJpY3MgKCIuY29uY2F0KGMsIikgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bUdseXBocyAoIikuY29uY2F0KGksIikuIikpLGM9aSx0LmRhdGFbMzRdPSg2NTI4MCZjKT4+OCx0LmRhdGFbMzVdPTI1NSZjKTtjb25zdCBsPWktYy0oci5sZW5ndGgtNCpjPj4xKTtpZihsPjApe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoci5sZW5ndGgrMipsKTtlLnNldChyLmRhdGEpLHMmJihlW3IubGVuZ3RoXT1yLmRhdGFbMl0sZVtyLmxlbmd0aCsxXT1yLmRhdGFbM10pLHIuZGF0YT1lfX0odCxPLmhoZWEsTy5obXR4LE8uaGVhZCx6LEcpLCFPLmhlYWQpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoZWFkIiB0YWJsZSBpcyBub3QgZm91bmQnKTshZnVuY3Rpb24oZSx0LHIpe2NvbnN0IGE9ZS5kYXRhLGk9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuKGU8PDI0KSsodDw8MTYpKyhyPDw4KStufShhWzBdLGFbMV0sYVsyXSxhWzNdKTtpPj4xNiE9MSYmKCgwLG4uaW5mbykoIkF0dGVtcHRpbmcgdG8gZml4IGludmFsaWQgdmVyc2lvbiBpbiBoZWFkIHRhYmxlOiAiK2kpLGFbMF09MCxhWzFdPTEsYVsyXT0wLGFbM109MCk7Y29uc3Qgcz1GKGFbNTBdLGFbNTFdKTtpZihzPDB8fHM+MSl7KDAsbi5pbmZvKSgiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCBpbmRleFRvTG9jRm9ybWF0IGluIGhlYWQgdGFibGU6ICIrcyk7Y29uc3QgZT10KzE7aWYocj09PWU8PDEpYVs1MF09MCxhWzUxXT0wO2Vsc2V7aWYociE9PWU8PDIpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkNvdWxkIG5vdCBmaXggaW5kZXhUb0xvY0Zvcm1hdDogIitzKTthWzUwXT0wLGFbNTFdPTF9fX0oTy5oZWFkLHEsUj9PLmxvY2EubGVuZ3RoOjApO2xldCBZPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoUil7Y29uc3QgZT1GKE8uaGVhZC5kYXRhWzUwXSxPLmhlYWQuZGF0YVs1MV0pLHQ9ZnVuY3Rpb24oZSx0LHIsbixhLGkscyl7bGV0IG8sYyxsO24/KG89NCxjPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF08PDI0fGVbdCsxXTw8MTZ8ZVt0KzJdPDw4fGVbdCszXX0sbD1mdW5jdGlvbihlLHQscil7ZVt0XT1yPj4+MjQmMjU1LGVbdCsxXT1yPj4xNiYyNTUsZVt0KzJdPXI+PjgmMjU1LGVbdCszXT0yNTUmcn0pOihvPTIsYz1mdW5jdGlvbihlLHQpe3JldHVybiBlW3RdPDw5fGVbdCsxXTw8MX0sbD1mdW5jdGlvbihlLHQscil7ZVt0XT1yPj45JjI1NSxlW3QrMV09cj4+MSYyNTV9KTtjb25zdCBoPWk/cisxOnIsdT1vKigxK2gpLGQ9bmV3IFVpbnQ4QXJyYXkodSk7ZC5zZXQoZS5kYXRhLnN1YmFycmF5KDAsdSkpLGUuZGF0YT1kO2NvbnN0IGY9dC5kYXRhLGc9Zi5sZW5ndGgscD1uZXcgVWludDhBcnJheShnKTtsZXQgbSxiO2NvbnN0IHk9W107Zm9yKG09MCxiPTA7bTxyKzE7bSsrLGIrPW8pe2xldCBlPWMoZCxiKTtlPmcmJihlPWcpLHkucHVzaCh7aW5kZXg6bSxvZmZzZXQ6ZSxlbmRPZmZzZXQ6MH0pfWZvcih5LnNvcnQoKChlLHQpPT5lLm9mZnNldC10Lm9mZnNldCkpLG09MDttPHI7bSsrKXlbbV0uZW5kT2Zmc2V0PXlbbSsxXS5vZmZzZXQ7Zm9yKHkuc29ydCgoKGUsdCk9PmUuaW5kZXgtdC5pbmRleCkpLG09MDttPHI7bSsrKXtjb25zdHtvZmZzZXQ6ZSxlbmRPZmZzZXQ6dH09eVttXTtpZigwIT09ZXx8MCE9PXQpYnJlYWs7Y29uc3Qgcj15W20rMV0ub2Zmc2V0O2lmKDAhPT1yKXt5W21dLmVuZE9mZnNldD1yO2JyZWFrfX1jb25zdCB3PU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHg9MDtmb3IobChkLDAseCksbT0wLGI9bzttPHI7bSsrLGIrPW8pe2NvbnN0IGU9dihmLHlbbV0ub2Zmc2V0LHlbbV0uZW5kT2Zmc2V0LHAseCxhKSx0PWUubGVuZ3RoOzA9PT10JiYod1ttXT0hMCksZS5zaXplT2ZJbnN0cnVjdGlvbnM+cyYmKHM9ZS5zaXplT2ZJbnN0cnVjdGlvbnMpLHgrPXQsbChkLGIseCl9aWYoMD09PXgpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoWzAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0OSwwXSk7Zm9yKG09MCxiPW87bTxoO20rKyxiKz1vKWwoZCxiLGUubGVuZ3RoKTt0LmRhdGE9ZX1lbHNlIGlmKGkpe2NvbnN0IHI9YyhkLG8pO3AubGVuZ3RoPnIreD90LmRhdGE9cC5zdWJhcnJheSgwLHIreCk6KHQuZGF0YT1uZXcgVWludDhBcnJheShyK3gpLHQuZGF0YS5zZXQocC5zdWJhcnJheSgwLHgpKSksdC5kYXRhLnNldChwLnN1YmFycmF5KDAscikseCksbChlLmRhdGEsZC5sZW5ndGgtbyx4K3IpfWVsc2UgdC5kYXRhPXAuc3ViYXJyYXkoMCx4KTtyZXR1cm57bWlzc2luZ0dseXBoczp3LG1heFNpemVPZkluc3RydWN0aW9uczpzfX0oTy5sb2NhLE8uZ2x5ZixxLGUsSyxHLFYpO1k9dC5taXNzaW5nR2x5cGhzLFg+PTY1NTM2JiZPLm1heHAubGVuZ3RoPj0yMiYmKE8ubWF4cC5kYXRhWzI2XT10Lm1heFNpemVPZkluc3RydWN0aW9ucz4+OCxPLm1heHAuZGF0YVsyN109MjU1JnQubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKX1pZighTy5oaGVhKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAiaGhlYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7MD09PU8uaGhlYS5kYXRhWzEwXSYmMD09PU8uaGhlYS5kYXRhWzExXSYmKE8uaGhlYS5kYXRhWzEwXT0yNTUsTy5oaGVhLmRhdGFbMTFdPTI1NSk7Y29uc3QgSj17dW5pdHNQZXJFbTpGKE8uaGVhZC5kYXRhWzE4XSxPLmhlYWQuZGF0YVsxOV0pLHlNYXg6VChPLmhlYWQuZGF0YVs0Ml0sTy5oZWFkLmRhdGFbNDNdKSx5TWluOlQoTy5oZWFkLmRhdGFbMzhdLE8uaGVhZC5kYXRhWzM5XSksYXNjZW50OlQoTy5oaGVhLmRhdGFbNF0sTy5oaGVhLmRhdGFbNV0pLGRlc2NlbnQ6VChPLmhoZWEuZGF0YVs2XSxPLmhoZWEuZGF0YVs3XSksbGluZUdhcDpUKE8uaGhlYS5kYXRhWzhdLE8uaGhlYS5kYXRhWzldKX07dGhpcy5hc2NlbnQ9Si5hc2NlbnQvSi51bml0c1BlckVtLHRoaXMuZGVzY2VudD1KLmRlc2NlbnQvSi51bml0c1BlckVtLHRoaXMubGluZUdhcD1KLmxpbmVHYXAvSi51bml0c1BlckVtLG51bGwhPT0obD10aGlzLmNzc0ZvbnRJbmZvKSYmdm9pZCAwIT09bCYmbC5saW5lSGVpZ2h0Pyh0aGlzLmxpbmVIZWlnaHQ9dGhpcy5jc3NGb250SW5mby5tZXRyaWNzLmxpbmVIZWlnaHQsdGhpcy5saW5lR2FwPXRoaXMuY3NzRm9udEluZm8ubWV0cmljcy5saW5lR2FwKTp0aGlzLmxpbmVIZWlnaHQ9dGhpcy5hc2NlbnQtdGhpcy5kZXNjZW50K3RoaXMubGluZUdhcCxPLnBvc3QmJmZ1bmN0aW9uKGUscixhKXtjb25zdCBzPSh0LnN0YXJ0fHwwKStlLm9mZnNldDt0LnBvcz1zO2NvbnN0IG89cytlLmxlbmd0aCxjPXQuZ2V0SW50MzIoKTt0LnNraXAoMjgpO2xldCBsLGgsdT0hMDtzd2l0Y2goYyl7Y2FzZSA2NTUzNjpsPWkuTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nO2JyZWFrO2Nhc2UgMTMxMDcyOmNvbnN0IGU9dC5nZXRVaW50MTYoKTtpZihlIT09YSl7dT0hMTticmVha31jb25zdCBzPVtdO2ZvcihoPTA7aDxlOysraCl7Y29uc3QgZT10LmdldFVpbnQxNigpO2lmKGU+PTMyNzY4KXt1PSExO2JyZWFrfXMucHVzaChlKX1pZighdSlicmVhaztjb25zdCBkPVtdLGY9W107Zm9yKDt0LnBvczxvOyl7Y29uc3QgZT10LmdldEJ5dGUoKTtmb3IoZi5sZW5ndGg9ZSxoPTA7aDxlOysraClmW2hdPVN0cmluZy5mcm9tQ2hhckNvZGUodC5nZXRCeXRlKCkpO2QucHVzaChmLmpvaW4oIiIpKX1mb3IobD1bXSxoPTA7aDxlOysraCl7Y29uc3QgZT1zW2hdO2U8MjU4P2wucHVzaChpLk1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZ1tlXSk6bC5wdXNoKGRbZS0yNThdKX1icmVhaztjYXNlIDE5NjYwODpicmVhaztkZWZhdWx0OigwLG4ud2FybikoIlVua25vd24vdW5zdXBwb3J0ZWQgcG9zdCB0YWJsZSB2ZXJzaW9uICIrYyksdT0hMSxyLmRlZmF1bHRFbmNvZGluZyYmKGw9ci5kZWZhdWx0RW5jb2RpbmcpfXIuZ2x5cGhOYW1lcz1sfShPLnBvc3QscixxKSxPLnBvc3Q9e3RhZzoicG9zdCIsZGF0YTokKHIpfTtjb25zdCBaPVtdO2Z1bmN0aW9uIFEoZSl7cmV0dXJuIVlbZV19aWYoci5jb21wb3NpdGUpe2NvbnN0IGU9ci5jaWRUb0dpZE1hcHx8W10sdD0wPT09ZS5sZW5ndGg7ci5jTWFwLmZvckVhY2goKGZ1bmN0aW9uKHIsYSl7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYoYT1MKHIsYSwhMCkpLGE+NjU1MzUpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk1heCBzaXplIG9mIENJRCBpcyA2NSw1MzUiKTtsZXQgaT0tMTt0P2k9YTp2b2lkIDAhPT1lW2FdJiYoaT1lW2FdKSxpPj0wJiZpPHEmJlEoaSkmJihaW3JdPWkpfSkpfWVsc2V7Y29uc3QgZT1mdW5jdGlvbihlLHQscixhKXtpZighZSlyZXR1cm4oMCxuLndhcm4pKCJObyBjbWFwIHRhYmxlIGF2YWlsYWJsZS4iKSx7cGxhdGZvcm1JZDotMSxlbmNvZGluZ0lkOi0xLG1hcHBpbmdzOltdLGhhc1Nob3J0Q21hcDohMX07bGV0IGkscz0odC5zdGFydHx8MCkrZS5vZmZzZXQ7dC5wb3M9cyx0LnNraXAoMik7Y29uc3Qgbz10LmdldFVpbnQxNigpO2xldCBjLGw9ITE7Zm9yKGxldCBlPTA7ZTxvO2UrKyl7dmFyIGgsdTtjb25zdCBuPXQuZ2V0VWludDE2KCksaT10LmdldFVpbnQxNigpLHM9dC5nZXRJbnQzMigpPj4+MDtsZXQgZD0hMTtpZigobnVsbD09PShoPWMpfHx2b2lkIDA9PT1oP3ZvaWQgMDpoLnBsYXRmb3JtSWQpIT09bnx8KG51bGw9PT0odT1jKXx8dm9pZCAwPT09dT92b2lkIDA6dS5lbmNvZGluZ0lkKSE9PWkpe2lmKDAhPT1ufHwwIT09aSYmMSE9PWkmJjMhPT1pKWlmKDE9PT1uJiYwPT09aSlkPSEwO2Vsc2UgaWYoMyE9PW58fDEhPT1pfHwhYSYmYyl7aWYociYmMz09PW4mJjA9PT1pKXtkPSEwO2xldCByPSEwO2lmKGU8by0xKXtjb25zdCBlPXQucGVla0J5dGVzKDIpO0YoZVswXSxlWzFdKTxuJiYocj0hMSl9ciYmKGw9ITApfX1lbHNlIGQ9ITAscnx8KGw9ITApO2Vsc2UgZD0hMDtpZihkJiYoYz17cGxhdGZvcm1JZDpuLGVuY29kaW5nSWQ6aSxvZmZzZXQ6c30pLGwpYnJlYWt9fWlmKGMmJih0LnBvcz1zK2Mub2Zmc2V0KSwhY3x8LTE9PT10LnBlZWtCeXRlKCkpcmV0dXJuKDAsbi53YXJuKSgiQ291bGQgbm90IGZpbmQgYSBwcmVmZXJyZWQgY21hcCB0YWJsZS4iKSx7cGxhdGZvcm1JZDotMSxlbmNvZGluZ0lkOi0xLG1hcHBpbmdzOltdLGhhc1Nob3J0Q21hcDohMX07Y29uc3QgZD10LmdldFVpbnQxNigpO2xldCBmPSExO2NvbnN0IGc9W107bGV0IHAsbTtpZigwPT09ZCl7Zm9yKHQuc2tpcCg0KSxwPTA7cDwyNTY7cCsrKXtjb25zdCBlPXQuZ2V0Qnl0ZSgpO2UmJmcucHVzaCh7Y2hhckNvZGU6cCxnbHlwaElkOmV9KX1mPSEwfWVsc2UgaWYoMj09PWQpe3Quc2tpcCg0KTtjb25zdCBlPVtdO2xldCByPTA7Zm9yKGxldCBuPTA7bjwyNTY7bisrKXtjb25zdCBuPXQuZ2V0VWludDE2KCk+PjM7ZS5wdXNoKG4pLHI9TWF0aC5tYXgobixyKX1jb25zdCBuPVtdO2ZvcihsZXQgZT0wO2U8PXI7ZSsrKW4ucHVzaCh7Zmlyc3RDb2RlOnQuZ2V0VWludDE2KCksZW50cnlDb3VudDp0LmdldFVpbnQxNigpLGlkRGVsdGE6VCh0LmdldEJ5dGUoKSx0LmdldEJ5dGUoKSksaWRSYW5nZVBvczp0LnBvcyt0LmdldFVpbnQxNigpfSk7Zm9yKGxldCByPTA7cjwyNTY7cisrKWlmKDA9PT1lW3JdKXQucG9zPW5bMF0uaWRSYW5nZVBvcysyKnIsbT10LmdldFVpbnQxNigpLGcucHVzaCh7Y2hhckNvZGU6cixnbHlwaElkOm19KTtlbHNle2NvbnN0IGE9bltlW3JdXTtmb3IocD0wO3A8YS5lbnRyeUNvdW50O3ArKyl7Y29uc3QgZT0ocjw8OCkrcCthLmZpcnN0Q29kZTt0LnBvcz1hLmlkUmFuZ2VQb3MrMipwLG09dC5nZXRVaW50MTYoKSwwIT09bSYmKG09KG0rYS5pZERlbHRhKSU2NTUzNiksZy5wdXNoKHtjaGFyQ29kZTplLGdseXBoSWQ6bX0pfX19ZWxzZSBpZig0PT09ZCl7dC5za2lwKDQpO2NvbnN0IGU9dC5nZXRVaW50MTYoKT4+MTt0LnNraXAoNik7Y29uc3Qgcj1bXTtsZXQgbjtmb3Iobj0wO248ZTtuKyspci5wdXNoKHtlbmQ6dC5nZXRVaW50MTYoKX0pO2Zvcih0LnNraXAoMiksbj0wO248ZTtuKyspcltuXS5zdGFydD10LmdldFVpbnQxNigpO2ZvcihuPTA7bjxlO24rKylyW25dLmRlbHRhPXQuZ2V0VWludDE2KCk7bGV0IGEsbz0wO2ZvcihuPTA7bjxlO24rKyl7aT1yW25dO2NvbnN0IHM9dC5nZXRVaW50MTYoKTtzPyhhPShzPj4xKS0oZS1uKSxpLm9mZnNldEluZGV4PWEsbz1NYXRoLm1heChvLGEraS5lbmQtaS5zdGFydCsxKSk6aS5vZmZzZXRJbmRleD0tMX1jb25zdCBjPVtdO2ZvcihwPTA7cDxvO3ArKyljLnB1c2godC5nZXRVaW50MTYoKSk7Zm9yKG49MDtuPGU7bisrKXtpPXJbbl0scz1pLnN0YXJ0O2NvbnN0IGU9aS5lbmQsdD1pLmRlbHRhO2ZvcihhPWkub2Zmc2V0SW5kZXgscD1zO3A8PWU7cCsrKTY1NTM1IT09cCYmKG09YTwwP3A6Y1thK3Atc10sbT1tK3QmNjU1MzUsZy5wdXNoKHtjaGFyQ29kZTpwLGdseXBoSWQ6bX0pKX19ZWxzZSBpZig2PT09ZCl7dC5za2lwKDQpO2NvbnN0IGU9dC5nZXRVaW50MTYoKSxyPXQuZ2V0VWludDE2KCk7Zm9yKHA9MDtwPHI7cCsrKXttPXQuZ2V0VWludDE2KCk7Y29uc3Qgcj1lK3A7Zy5wdXNoKHtjaGFyQ29kZTpyLGdseXBoSWQ6bX0pfX1lbHNle2lmKDEyIT09ZClyZXR1cm4oMCxuLndhcm4pKCJjbWFwIHRhYmxlIGhhcyB1bnN1cHBvcnRlZCBmb3JtYXQ6ICIrZCkse3BsYXRmb3JtSWQ6LTEsZW5jb2RpbmdJZDotMSxtYXBwaW5nczpbXSxoYXNTaG9ydENtYXA6ITF9O3t0LnNraXAoMTApO2NvbnN0IGU9dC5nZXRJbnQzMigpPj4+MDtmb3IocD0wO3A8ZTtwKyspe2NvbnN0IGU9dC5nZXRJbnQzMigpPj4+MCxyPXQuZ2V0SW50MzIoKT4+PjA7bGV0IG49dC5nZXRJbnQzMigpPj4+MDtmb3IobGV0IHQ9ZTt0PD1yO3QrKylnLnB1c2goe2NoYXJDb2RlOnQsZ2x5cGhJZDpuKyt9KX19fWcuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jaGFyQ29kZS10LmNoYXJDb2RlfSkpO2ZvcihsZXQgZT0xO2U8Zy5sZW5ndGg7ZSsrKWdbZS0xXS5jaGFyQ29kZT09PWdbZV0uY2hhckNvZGUmJihnLnNwbGljZShlLDEpLGUtLSk7cmV0dXJue3BsYXRmb3JtSWQ6Yy5wbGF0Zm9ybUlkLGVuY29kaW5nSWQ6Yy5lbmNvZGluZ0lkLG1hcHBpbmdzOmcsaGFzU2hvcnRDbWFwOmZ9fShPLmNtYXAsdCx0aGlzLmlzU3ltYm9saWNGb250LHIuaGFzRW5jb2RpbmcpLGE9ZS5wbGF0Zm9ybUlkLHM9ZS5lbmNvZGluZ0lkLGw9ZS5tYXBwaW5ncztsZXQgdT1bXSxkPSExO2lmKCFyLmhhc0VuY29kaW5nfHwiTWFjUm9tYW5FbmNvZGluZyIhPT1yLmJhc2VFbmNvZGluZ05hbWUmJiJXaW5BbnNpRW5jb2RpbmciIT09ci5iYXNlRW5jb2RpbmdOYW1lfHwodT0oMCxjLmdldEVuY29kaW5nKShyLmJhc2VFbmNvZGluZ05hbWUpKSxyLmhhc0VuY29kaW5nJiYhdGhpcy5pc1N5bWJvbGljRm9udCYmKDM9PT1hJiYxPT09c3x8MT09PWEmJjA9PT1zKSl7Y29uc3QgZT0oMCxvLmdldEdseXBoc1VuaWNvZGUpKCk7Zm9yKGxldCB0PTA7dDwyNTY7dCsrKXtsZXQgbjtpZihuPXZvaWQgMCE9PXRoaXMuZGlmZmVyZW5jZXNbdF0/dGhpcy5kaWZmZXJlbmNlc1t0XTp1Lmxlbmd0aCYmIiIhPT11W3RdP3VbdF06Yy5TdGFuZGFyZEVuY29kaW5nW3RdLCFuKWNvbnRpbnVlO2NvbnN0IG89KDAsaS5yZWNvdmVyR2x5cGhOYW1lKShuLGUpO2xldCBkO2lmKDM9PT1hJiYxPT09cz9kPWVbb106MT09PWEmJjA9PT1zJiYoZD1jLk1hY1JvbWFuRW5jb2RpbmcuaW5kZXhPZihvKSksdm9pZCAwPT09ZCl7aWYoIXIuZ2x5cGhOYW1lcyYmci5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCYmISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXApKXtjb25zdCBlPXRoaXMudG9Vbmljb2RlLmdldCh0KTtlJiYoZD1lLmNvZGVQb2ludEF0KDApKX1pZih2b2lkIDA9PT1kKWNvbnRpbnVlfWZvcihjb25zdCBlIG9mIGwpaWYoZS5jaGFyQ29kZT09PWQpe1pbdF09ZS5nbHlwaElkO2JyZWFrfX19ZWxzZSBpZigwPT09YSl7Zm9yKGNvbnN0IGUgb2YgbClaW2UuY2hhckNvZGVdPWUuZ2x5cGhJZDtkPSEwfWVsc2UgZm9yKGNvbnN0IGUgb2YgbCl7bGV0IHQ9ZS5jaGFyQ29kZTszPT09YSYmdD49NjE0NDAmJnQ8PTYxNjk1JiYodCY9MjU1KSxaW3RdPWUuZ2x5cGhJZH1pZihyLmdseXBoTmFtZXMmJih1Lmxlbmd0aHx8dGhpcy5kaWZmZXJlbmNlcy5sZW5ndGgpKWZvcihsZXQgZT0wO2U8MjU2OysrZSl7aWYoIWQmJnZvaWQgMCE9PVpbZV0pY29udGludWU7Y29uc3QgdD10aGlzLmRpZmZlcmVuY2VzW2VdfHx1W2VdO2lmKCF0KWNvbnRpbnVlO2NvbnN0IG49ci5nbHlwaE5hbWVzLmluZGV4T2YodCk7bj4wJiZRKG4pJiYoWltlXT1uKX19MD09PVoubGVuZ3RoJiYoWlswXT0wKTtsZXQgZWU9ei0xO2lmKEd8fChlZT0wKSwhci5jc3NGb250SW5mbyl7Y29uc3QgZT1fKFosUSxlZSx0aGlzLnRvVW5pY29kZSk7dGhpcy50b0ZvbnRDaGFyPWUudG9Gb250Q2hhcixPLmNtYXA9e3RhZzoiY21hcCIsZGF0YTpqKGUuY2hhckNvZGVUb0dseXBoSWQsZS50b1VuaWNvZGVFeHRyYU1hcCx6KX0sT1siT1MvMiJdJiZmdW5jdGlvbihlLHQpe3QucG9zPSh0LnN0YXJ0fHwwKStlLm9mZnNldDtjb25zdCByPXQuZ2V0VWludDE2KCk7dC5za2lwKDYwKTtjb25zdCBuPXQuZ2V0VWludDE2KCk7cmV0dXJuIShyPDQmJjc2OCZufHx0LmdldFVpbnQxNigpPnQuZ2V0VWludDE2KCl8fCh0LnNraXAoNiksMD09PXQuZ2V0VWludDE2KCl8fChlLmRhdGFbOF09ZS5kYXRhWzldPTAsMCkpKX0oT1siT1MvMiJdLHQpfHwoT1siT1MvMiJdPXt0YWc6Ik9TLzIiLGRhdGE6VShyLGUuY2hhckNvZGVUb0dseXBoSWQsSil9KX1pZighUil0cnl7RT1uZXcgeS5TdHJlYW0oT1siQ0ZGICJdLmRhdGEpLE09bmV3IGEuQ0ZGUGFyc2VyKEUscixpLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCkucGFyc2UoKSxNLmR1cGxpY2F0ZUZpcnN0R2x5cGgoKTtjb25zdCBlPW5ldyBhLkNGRkNvbXBpbGVyKE0pO09bIkNGRiAiXS5kYXRhPWUuY29tcGlsZSgpfWNhdGNoKGUpeygwLG4ud2FybikoIkZhaWxlZCB0byBjb21waWxlIGZvbnQgIityLmxvYWRlZE5hbWUpfWlmKE8ubmFtZSl7Y29uc3RbdCxuXT14KE8ubmFtZSk7Ty5uYW1lLmRhdGE9SChlLHQpLHRoaXMucHNOYW1lPXRbMF1bNl18fG51bGwsci5jb21wb3NpdGV8fGZ1bmN0aW9uKGUsdCxyKXtpZihlLmlzSW50ZXJuYWxGb250KXJldHVybjtpZihlLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKXJldHVybjtpZihlLmhhc0VuY29kaW5nKXJldHVybjtpZihlLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXApcmV0dXJuO2lmKCF0KXJldHVybjtpZigwPT09ci5sZW5ndGgpcmV0dXJuO2lmKGUuZGVmYXVsdEVuY29kaW5nPT09Yy5XaW5BbnNpRW5jb2RpbmcpcmV0dXJuO2Zvcihjb25zdCBlIG9mIHIpaWYoIUIoZSkpcmV0dXJuO2NvbnN0IG49Yy5XaW5BbnNpRW5jb2RpbmcsYT1bXSxpPSgwLG8uZ2V0R2x5cGhzVW5pY29kZSkoKTtmb3IoY29uc3QgZSBpbiBuKXtjb25zdCB0PW5bZV07aWYoIiI9PT10KWNvbnRpbnVlO2NvbnN0IHI9aVt0XTt2b2lkIDAhPT1yJiYoYVtlXT1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpKX1hLmxlbmd0aD4wJiZlLnRvVW5pY29kZS5hbWVuZChhKX0ocix0aGlzLmlzU3ltYm9saWNGb250LG4pfWVsc2UgTy5uYW1lPXt0YWc6Im5hbWUiLGRhdGE6SCh0aGlzLm5hbWUpfTtjb25zdCB0ZT1uZXcgbS5PcGVuVHlwZUZpbGVCdWlsZGVyKEMudmVyc2lvbik7Zm9yKGNvbnN0IGUgaW4gTyl0ZS5hZGRUYWJsZShlLE9bZV0uZGF0YSk7cmV0dXJuIHRlLnRvQXJyYXkoKX1jb252ZXJ0KGUsdCxyKXtyLmZpeGVkUGl0Y2g9ITEsci5idWlsdEluRW5jb2RpbmcmJmZ1bmN0aW9uKGUsdCl7aWYoZS5pc0ludGVybmFsRm9udClyZXR1cm47aWYoZS5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcClyZXR1cm47aWYodD09PWUuZGVmYXVsdEVuY29kaW5nKXJldHVybjtpZihlLnRvVW5pY29kZSBpbnN0YW5jZW9mIGguSWRlbnRpdHlUb1VuaWNvZGVNYXApcmV0dXJuO2NvbnN0IHI9W10sbj0oMCxvLmdldEdseXBoc1VuaWNvZGUpKCk7Zm9yKGNvbnN0IGEgaW4gdCl7aWYoZS5oYXNFbmNvZGluZyYmKGUuYmFzZUVuY29kaW5nTmFtZXx8dm9pZCAwIT09ZS5kaWZmZXJlbmNlc1thXSkpY29udGludWU7Y29uc3QgaT10W2FdLG89KDAscy5nZXRVbmljb2RlRm9yR2x5cGgpKGksbik7LTEhPT1vJiYoclthXT1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pKX1yLmxlbmd0aD4wJiZlLnRvVW5pY29kZS5hbWVuZChyKX0ocixyLmJ1aWx0SW5FbmNvZGluZyk7bGV0IGE9MTt0IGluc3RhbmNlb2YgdS5DRkZGb250JiYoYT10Lm51bUdseXBocy0xKTtjb25zdCBsPXQuZ2V0R2x5cGhNYXBwaW5nKHIpO2xldCBkPW51bGwsZj1sLGc9bnVsbDtyLmNzc0ZvbnRJbmZvfHwoZD1fKGwsdC5oYXNHbHlwaElkLmJpbmQodCksYSx0aGlzLnRvVW5pY29kZSksdGhpcy50b0ZvbnRDaGFyPWQudG9Gb250Q2hhcixmPWQuY2hhckNvZGVUb0dseXBoSWQsZz1kLnRvVW5pY29kZUV4dHJhTWFwKTtjb25zdCBwPXQubnVtR2x5cGhzO2Z1bmN0aW9uIGIoZSx0KXtsZXQgcj1udWxsO2Zvcihjb25zdCBuIGluIGUpdD09PWVbbl0mJihyfHwocj1bXSkpLnB1c2goMHxuKTtyZXR1cm4gcn1mdW5jdGlvbiB5KGUsdCl7Zm9yKGNvbnN0IHIgaW4gZSlpZih0PT09ZVtyXSlyZXR1cm4gMHxyO3JldHVybiBkLmNoYXJDb2RlVG9HbHlwaElkW2QubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZV09dCxkLm5leHRBdmFpbGFibGVGb250Q2hhckNvZGUrK31jb25zdCB3PXQuc2VhY3M7aWYoZCYmaS5TRUFDX0FOQUxZU0lTX0VOQUJMRUQmJm51bGwhPXcmJncubGVuZ3RoKXtjb25zdCBlPXIuZm9udE1hdHJpeHx8bi5GT05UX0lERU5USVRZX01BVFJJWCxhPXQuZ2V0Q2hhcnNldCgpLGk9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IHQgaW4gdyl7dHw9MDtjb25zdCByPXdbdF0sbj1jLlN0YW5kYXJkRW5jb2RpbmdbclsyXV0scz1jLlN0YW5kYXJkRW5jb2RpbmdbclszXV0sbz1hLmluZGV4T2YobiksaD1hLmluZGV4T2Yocyk7aWYobzwwfHxoPDApY29udGludWU7Y29uc3QgdT17eDpyWzBdKmVbMF0rclsxXSplWzJdK2VbNF0seTpyWzBdKmVbMV0rclsxXSplWzNdK2VbNV19LGY9YihsLHQpO2lmKGYpZm9yKGNvbnN0IGUgb2YgZil7Y29uc3QgdD1kLmNoYXJDb2RlVG9HbHlwaElkLHI9eSh0LG8pLG49eSh0LGgpO2lbZV09e2Jhc2VGb250Q2hhckNvZGU6cixhY2NlbnRGb250Q2hhckNvZGU6bixhY2NlbnRPZmZzZXQ6dX19fXIuc2VhY01hcD1pfWNvbnN0IHY9MS8oci5mb250TWF0cml4fHxuLkZPTlRfSURFTlRJVFlfTUFUUklYKVswXSx4PW5ldyBtLk9wZW5UeXBlRmlsZUJ1aWxkZXIoIk9UVE8iKTtyZXR1cm4geC5hZGRUYWJsZSgiQ0ZGICIsdC5kYXRhKSx4LmFkZFRhYmxlKCJPUy8yIixVKHIsZikpLHguYWRkVGFibGUoImNtYXAiLGooZixnLHApKSx4LmFkZFRhYmxlKCJoZWFkIiwiXDABXDBcMFwwXDAQXDBcMFwwXDBcMF8PPMO1XDBcMCIrRSh2KSsiXDBcMFwwXDDCnlx2fidcMFwwXDBcMMKeXHZ+J1wwXDAiK0Uoci5kZXNjZW50KSsiD8O/IitFKHIuYXNjZW50KStNKHIuaXRhbGljQW5nbGU/MjowKSsiXDARXDBcMFwwXDBcMFwwIikseC5hZGRUYWJsZSgiaGhlYSIsIlwwAVwwXDAiK0Uoci5hc2NlbnQpK0Uoci5kZXNjZW50KSsiXDBcMMO/w79cMFwwXDBcMFwwXDAiK0Uoci5jYXBIZWlnaHQpK0UoTWF0aC50YW4oci5pdGFsaWNBbmdsZSkqci54SGVpZ2h0KSsiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIitNKHApKSx4LmFkZFRhYmxlKCJobXR4IixmdW5jdGlvbigpe2NvbnN0IGU9dC5jaGFyc3RyaW5ncyxyPXQuY2ZmP3QuY2ZmLndpZHRoczpudWxsO2xldCBuPSJcMFwwXDBcMCI7Zm9yKGxldCB0PTEsYT1wO3Q8YTt0Kyspe2xldCBhPTA7aWYoZSl7Y29uc3Qgcj1lW3QtMV07YT0id2lkdGgiaW4gcj9yLndpZHRoOjB9ZWxzZSByJiYoYT1NYXRoLmNlaWwoclt0XXx8MCkpO24rPU0oYSkrTSgwKX1yZXR1cm4gbn0oKSkseC5hZGRUYWJsZSgibWF4cCIsIlwwXDBQXDAiK00ocCkpLHguYWRkVGFibGUoIm5hbWUiLEgoZSkpLHguYWRkVGFibGUoInBvc3QiLCQocikpLHgudG9BcnJheSgpfWdldCBzcGFjZVdpZHRoKCl7Y29uc3QgZT1bInNwYWNlIiwibWludXMiLCJvbmUiLCJpIiwiSSJdO2xldCB0O2Zvcihjb25zdCByIG9mIGUpe2lmKHIgaW4gdGhpcy53aWR0aHMpe3Q9dGhpcy53aWR0aHNbcl07YnJlYWt9Y29uc3QgZT0oMCxvLmdldEdseXBoc1VuaWNvZGUpKClbcl07bGV0IG49MDtpZih0aGlzLmNvbXBvc2l0ZSYmdGhpcy5jTWFwLmNvbnRhaW5zKGUpJiYobj10aGlzLmNNYXAubG9va3VwKGUpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49TChlLG4pKSksIW4mJnRoaXMudG9Vbmljb2RlJiYobj10aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGUpKSxuPD0wJiYobj1lKSx0PXRoaXMud2lkdGhzW25dLHQpYnJlYWt9cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsInNwYWNlV2lkdGgiLHR8fHRoaXMuZGVmYXVsdFdpZHRoKX1fY2hhclRvR2x5cGgoZSl7dmFyIHQscixhLGk7bGV0IG8sYyxsLGg9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSx1PXRoaXMuX2dseXBoQ2FjaGVbZV07aWYoKG51bGw9PT0odD11KXx8dm9pZCAwPT09dD92b2lkIDA6dC5pc1NwYWNlKT09PWgpcmV0dXJuIHU7bGV0IGQ9ZTtudWxsIT09KHI9dGhpcy5jTWFwKSYmdm9pZCAwIT09ciYmci5jb250YWlucyhlKSYmKGQ9dGhpcy5jTWFwLmxvb2t1cChlKSwic3RyaW5nIj09dHlwZW9mIGQmJihkPUwoZSxkKSkpLGM9dGhpcy53aWR0aHNbZF0sIm51bWJlciIhPXR5cGVvZiBjJiYoYz10aGlzLmRlZmF1bHRXaWR0aCk7Y29uc3QgZj1udWxsPT09KGE9dGhpcy52bWV0cmljcyl8fHZvaWQgMD09PWE/dm9pZCAwOmFbZF07bGV0IGc9dGhpcy50b1VuaWNvZGUuZ2V0KGUpfHxlOyJudW1iZXIiPT10eXBlb2YgZyYmKGc9U3RyaW5nLmZyb21DaGFyQ29kZShnKSk7bGV0IHA9dm9pZCAwIT09dGhpcy50b0ZvbnRDaGFyW2VdO2lmKG89dGhpcy50b0ZvbnRDaGFyW2VdfHxlLHRoaXMubWlzc2luZ0ZpbGUpe2NvbnN0IHQ9dGhpcy5kaWZmZXJlbmNlc1tlXXx8dGhpcy5kZWZhdWx0RW5jb2RpbmdbZV07Ii5ub3RkZWYiIT09dCYmIiIhPT10fHwiVHlwZTEiIT09dGhpcy50eXBlfHwobz0zMiksbz0oMCxzLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKShvKX10aGlzLmlzVHlwZTNGb250JiYobD1vKTtsZXQgbT1udWxsO2lmKG51bGwhPT0oaT10aGlzLnNlYWNNYXApJiZ2b2lkIDAhPT1pJiZpW2VdKXtwPSEwO2NvbnN0IHQ9dGhpcy5zZWFjTWFwW2VdO289dC5iYXNlRm9udENoYXJDb2RlLG09e2ZvbnRDaGFyOlN0cmluZy5mcm9tQ29kZVBvaW50KHQuYWNjZW50Rm9udENoYXJDb2RlKSxvZmZzZXQ6dC5hY2NlbnRPZmZzZXR9fWxldCBiPSIiO3JldHVybiJudW1iZXIiPT10eXBlb2YgbyYmKG88PTExMTQxMTE/Yj1TdHJpbmcuZnJvbUNvZGVQb2ludChvKTooMCxuLndhcm4pKCJjaGFyVG9HbHlwaCAtIGludmFsaWQgZm9udENoYXJDb2RlOiAiLmNvbmNhdChvKSkpLHU9bmV3IE8oZSxiLGcsbSxjLGYsbCxoLHApLHRoaXMuX2dseXBoQ2FjaGVbZV09dX1jaGFyc1RvR2x5cGhzKGUpe2xldCB0PXRoaXMuX2NoYXJzQ2FjaGVbZV07aWYodClyZXR1cm4gdDtpZih0PVtdLHRoaXMuY01hcCl7Y29uc3Qgcj1PYmplY3QuY3JlYXRlKG51bGwpLG49ZS5sZW5ndGg7bGV0IGE9MDtmb3IoO2E8bjspe3RoaXMuY01hcC5yZWFkQ2hhckNvZGUoZSxhLHIpO2NvbnN0e2NoYXJjb2RlOm4sbGVuZ3RoOml9PXI7YSs9aTtjb25zdCBzPXRoaXMuX2NoYXJUb0dseXBoKG4sMT09PWkmJjMyPT09ZS5jaGFyQ29kZUF0KGEtMSkpO3QucHVzaChzKX19ZWxzZSBmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjsrK3Ipe2NvbnN0IG49ZS5jaGFyQ29kZUF0KHIpLGE9dGhpcy5fY2hhclRvR2x5cGgobiwzMj09PW4pO3QucHVzaChhKX1yZXR1cm4gdGhpcy5fY2hhcnNDYWNoZVtlXT10fWdldENoYXJQb3NpdGlvbnMoZSl7Y29uc3QgdD1bXTtpZih0aGlzLmNNYXApe2NvbnN0IHI9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgbj0wO2Zvcig7bjxlLmxlbmd0aDspe3RoaXMuY01hcC5yZWFkQ2hhckNvZGUoZSxuLHIpO2NvbnN0IGE9ci5sZW5ndGg7dC5wdXNoKFtuLG4rYV0pLG4rPWF9fWVsc2UgZm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47KytyKXQucHVzaChbcixyKzFdKTtyZXR1cm4gdH1nZXQgZ2x5cGhDYWNoZVZhbHVlcygpe3JldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2dseXBoQ2FjaGUpfWVuY29kZVN0cmluZyhlKXtjb25zdCB0PVtdLHI9W10sbj0oKT0+dC5sZW5ndGglMj09MSxhPXRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgaC5JZGVudGl0eVRvVW5pY29kZU1hcD9lPT50aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGUpOmU9PnRoaXMudG9Vbmljb2RlLmNoYXJDb2RlT2YoU3RyaW5nLmZyb21Db2RlUG9pbnQoZSkpO2ZvcihsZXQgaT0wLHM9ZS5sZW5ndGg7aTxzO2krKyl7Y29uc3Qgcz1lLmNvZGVQb2ludEF0KGkpO2lmKHM+NTUyOTUmJihzPDU3MzQ0fHxzPjY1NTMzKSYmaSsrLHRoaXMudG9Vbmljb2RlKXtjb25zdCBlPWEocyk7aWYoLTEhPT1lKXtuKCkmJih0LnB1c2goci5qb2luKCIiKSksci5sZW5ndGg9MCk7Zm9yKGxldCB0PSh0aGlzLmNNYXA/dGhpcy5jTWFwLmdldENoYXJDb2RlTGVuZ3RoKGUpOjEpLTE7dD49MDt0LS0pci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZT4+OCp0JjI1NSkpO2NvbnRpbnVlfX1uKCl8fCh0LnB1c2goci5qb2luKCIiKSksci5sZW5ndGg9MCksci5wdXNoKFN0cmluZy5mcm9tQ29kZVBvaW50KHMpKX1yZXR1cm4gdC5wdXNoKHIuam9pbigiIikpLHR9fSx0LkVycm9yRm9udD1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmVycm9yPWUsdGhpcy5sb2FkZWROYW1lPSJnX2ZvbnRfZXJyb3IiLHRoaXMubWlzc2luZ0ZpbGU9ITB9Y2hhcnNUb0dseXBocygpe3JldHVybltdfWVuY29kZVN0cmluZyhlKXtyZXR1cm5bZV19ZXhwb3J0RGF0YSgpe3JldHVybntlcnJvcjp0aGlzLmVycm9yfX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ0ZGVG9wRGljdD10LkNGRlN0cmluZ3M9dC5DRkZTdGFuZGFyZFN0cmluZ3M9dC5DRkZQcml2YXRlRGljdD10LkNGRlBhcnNlcj10LkNGRkluZGV4PXQuQ0ZGSGVhZGVyPXQuQ0ZGRkRTZWxlY3Q9dC5DRkZDb21waWxlcj10LkNGRkNoYXJzZXQ9dC5DRkY9dm9pZCAwLHIoMTM5KSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpLGE9cigxODYpLGk9cigxODcpO2NvbnN0IHM9WyIubm90ZGVmIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVyaWdodCIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwicXVvdGVsZWZ0IiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsImV4Y2xhbWRvd24iLCJjZW50Iiwic3RlcmxpbmciLCJmcmFjdGlvbiIsInllbiIsImZsb3JpbiIsInNlY3Rpb24iLCJjdXJyZW5jeSIsInF1b3Rlc2luZ2xlIiwicXVvdGVkYmxsZWZ0IiwiZ3VpbGxlbW90bGVmdCIsImd1aWxzaW5nbGxlZnQiLCJndWlsc2luZ2xyaWdodCIsImZpIiwiZmwiLCJlbmRhc2giLCJkYWdnZXIiLCJkYWdnZXJkYmwiLCJwZXJpb2RjZW50ZXJlZCIsInBhcmFncmFwaCIsImJ1bGxldCIsInF1b3Rlc2luZ2xiYXNlIiwicXVvdGVkYmxiYXNlIiwicXVvdGVkYmxyaWdodCIsImd1aWxsZW1vdHJpZ2h0IiwiZWxsaXBzaXMiLCJwZXJ0aG91c2FuZCIsInF1ZXN0aW9uZG93biIsImdyYXZlIiwiYWN1dGUiLCJjaXJjdW1mbGV4IiwidGlsZGUiLCJtYWNyb24iLCJicmV2ZSIsImRvdGFjY2VudCIsImRpZXJlc2lzIiwicmluZyIsImNlZGlsbGEiLCJodW5nYXJ1bWxhdXQiLCJvZ29uZWsiLCJjYXJvbiIsImVtZGFzaCIsIkFFIiwib3JkZmVtaW5pbmUiLCJMc2xhc2giLCJPc2xhc2giLCJPRSIsIm9yZG1hc2N1bGluZSIsImFlIiwiZG90bGVzc2kiLCJsc2xhc2giLCJvc2xhc2giLCJvZSIsImdlcm1hbmRibHMiLCJvbmVzdXBlcmlvciIsImxvZ2ljYWxub3QiLCJtdSIsInRyYWRlbWFyayIsIkV0aCIsIm9uZWhhbGYiLCJwbHVzbWludXMiLCJUaG9ybiIsIm9uZXF1YXJ0ZXIiLCJkaXZpZGUiLCJicm9rZW5iYXIiLCJkZWdyZWUiLCJ0aG9ybiIsInRocmVlcXVhcnRlcnMiLCJ0d29zdXBlcmlvciIsInJlZ2lzdGVyZWQiLCJtaW51cyIsImV0aCIsIm11bHRpcGx5IiwidGhyZWVzdXBlcmlvciIsImNvcHlyaWdodCIsIkFhY3V0ZSIsIkFjaXJjdW1mbGV4IiwiQWRpZXJlc2lzIiwiQWdyYXZlIiwiQXJpbmciLCJBdGlsZGUiLCJDY2VkaWxsYSIsIkVhY3V0ZSIsIkVjaXJjdW1mbGV4IiwiRWRpZXJlc2lzIiwiRWdyYXZlIiwiSWFjdXRlIiwiSWNpcmN1bWZsZXgiLCJJZGllcmVzaXMiLCJJZ3JhdmUiLCJOdGlsZGUiLCJPYWN1dGUiLCJPY2lyY3VtZmxleCIsIk9kaWVyZXNpcyIsIk9ncmF2ZSIsIk90aWxkZSIsIlNjYXJvbiIsIlVhY3V0ZSIsIlVjaXJjdW1mbGV4IiwiVWRpZXJlc2lzIiwiVWdyYXZlIiwiWWFjdXRlIiwiWWRpZXJlc2lzIiwiWmNhcm9uIiwiYWFjdXRlIiwiYWNpcmN1bWZsZXgiLCJhZGllcmVzaXMiLCJhZ3JhdmUiLCJhcmluZyIsImF0aWxkZSIsImNjZWRpbGxhIiwiZWFjdXRlIiwiZWNpcmN1bWZsZXgiLCJlZGllcmVzaXMiLCJlZ3JhdmUiLCJpYWN1dGUiLCJpY2lyY3VtZmxleCIsImlkaWVyZXNpcyIsImlncmF2ZSIsIm50aWxkZSIsIm9hY3V0ZSIsIm9jaXJjdW1mbGV4Iiwib2RpZXJlc2lzIiwib2dyYXZlIiwib3RpbGRlIiwic2Nhcm9uIiwidWFjdXRlIiwidWNpcmN1bWZsZXgiLCJ1ZGllcmVzaXMiLCJ1Z3JhdmUiLCJ5YWN1dGUiLCJ5ZGllcmVzaXMiLCJ6Y2Fyb24iLCJleGNsYW1zbWFsbCIsIkh1bmdhcnVtbGF1dHNtYWxsIiwiZG9sbGFyb2xkc3R5bGUiLCJkb2xsYXJzdXBlcmlvciIsImFtcGVyc2FuZHNtYWxsIiwiQWN1dGVzbWFsbCIsInBhcmVubGVmdHN1cGVyaW9yIiwicGFyZW5yaWdodHN1cGVyaW9yIiwidHdvZG90ZW5sZWFkZXIiLCJvbmVkb3RlbmxlYWRlciIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbW1hc3VwZXJpb3IiLCJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwicGVyaW9kc3VwZXJpb3IiLCJxdWVzdGlvbnNtYWxsIiwiYXN1cGVyaW9yIiwiYnN1cGVyaW9yIiwiY2VudHN1cGVyaW9yIiwiZHN1cGVyaW9yIiwiZXN1cGVyaW9yIiwiaXN1cGVyaW9yIiwibHN1cGVyaW9yIiwibXN1cGVyaW9yIiwibnN1cGVyaW9yIiwib3N1cGVyaW9yIiwicnN1cGVyaW9yIiwic3N1cGVyaW9yIiwidHN1cGVyaW9yIiwiZmYiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiZXhjbGFtZG93bnNtYWxsIiwiY2VudG9sZHN0eWxlIiwiTHNsYXNoc21hbGwiLCJTY2Fyb25zbWFsbCIsIlpjYXJvbnNtYWxsIiwiRGllcmVzaXNzbWFsbCIsIkJyZXZlc21hbGwiLCJDYXJvbnNtYWxsIiwiRG90YWNjZW50c21hbGwiLCJNYWNyb25zbWFsbCIsImZpZ3VyZWRhc2giLCJoeXBoZW5pbmZlcmlvciIsIk9nb25la3NtYWxsIiwiUmluZ3NtYWxsIiwiQ2VkaWxsYXNtYWxsIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiemVyb3N1cGVyaW9yIiwiZm91cnN1cGVyaW9yIiwiZml2ZXN1cGVyaW9yIiwic2l4c3VwZXJpb3IiLCJzZXZlbnN1cGVyaW9yIiwiZWlnaHRzdXBlcmlvciIsIm5pbmVzdXBlcmlvciIsInplcm9pbmZlcmlvciIsIm9uZWluZmVyaW9yIiwidHdvaW5mZXJpb3IiLCJ0aHJlZWluZmVyaW9yIiwiZm91cmluZmVyaW9yIiwiZml2ZWluZmVyaW9yIiwic2l4aW5mZXJpb3IiLCJzZXZlbmluZmVyaW9yIiwiZWlnaHRpbmZlcmlvciIsIm5pbmVpbmZlcmlvciIsImNlbnRpbmZlcmlvciIsImRvbGxhcmluZmVyaW9yIiwicGVyaW9kaW5mZXJpb3IiLCJjb21tYWluZmVyaW9yIiwiQWdyYXZlc21hbGwiLCJBYWN1dGVzbWFsbCIsIkFjaXJjdW1mbGV4c21hbGwiLCJBdGlsZGVzbWFsbCIsIkFkaWVyZXNpc3NtYWxsIiwiQXJpbmdzbWFsbCIsIkFFc21hbGwiLCJDY2VkaWxsYXNtYWxsIiwiRWdyYXZlc21hbGwiLCJFYWN1dGVzbWFsbCIsIkVjaXJjdW1mbGV4c21hbGwiLCJFZGllcmVzaXNzbWFsbCIsIklncmF2ZXNtYWxsIiwiSWFjdXRlc21hbGwiLCJJY2lyY3VtZmxleHNtYWxsIiwiSWRpZXJlc2lzc21hbGwiLCJFdGhzbWFsbCIsIk50aWxkZXNtYWxsIiwiT2dyYXZlc21hbGwiLCJPYWN1dGVzbWFsbCIsIk9jaXJjdW1mbGV4c21hbGwiLCJPdGlsZGVzbWFsbCIsIk9kaWVyZXNpc3NtYWxsIiwiT0VzbWFsbCIsIk9zbGFzaHNtYWxsIiwiVWdyYXZlc21hbGwiLCJVYWN1dGVzbWFsbCIsIlVjaXJjdW1mbGV4c21hbGwiLCJVZGllcmVzaXNzbWFsbCIsIllhY3V0ZXNtYWxsIiwiVGhvcm5zbWFsbCIsIllkaWVyZXNpc3NtYWxsIiwiMDAxLjAwMCIsIjAwMS4wMDEiLCIwMDEuMDAyIiwiMDAxLjAwMyIsIkJsYWNrIiwiQm9sZCIsIkJvb2siLCJMaWdodCIsIk1lZGl1bSIsIlJlZ3VsYXIiLCJSb21hbiIsIlNlbWlib2xkIl07dC5DRkZTdGFuZGFyZFN0cmluZ3M9cztjb25zdCBvPVtudWxsLHtpZDoiaHN0ZW0iLG1pbjoyLHN0YWNrQ2xlYXJpbmc6ITAsc3RlbTohMH0sbnVsbCx7aWQ6InZzdGVtIixtaW46MixzdGFja0NsZWFyaW5nOiEwLHN0ZW06ITB9LHtpZDoidm1vdmV0byIsbWluOjEsc3RhY2tDbGVhcmluZzohMH0se2lkOiJybGluZXRvIixtaW46MixyZXNldFN0YWNrOiEwfSx7aWQ6ImhsaW5ldG8iLG1pbjoxLHJlc2V0U3RhY2s6ITB9LHtpZDoidmxpbmV0byIsbWluOjEscmVzZXRTdGFjazohMH0se2lkOiJycmN1cnZldG8iLG1pbjo2LHJlc2V0U3RhY2s6ITB9LG51bGwse2lkOiJjYWxsc3ViciIsbWluOjEsdW5kZWZTdGFjazohMH0se2lkOiJyZXR1cm4iLG1pbjowLHVuZGVmU3RhY2s6ITB9LG51bGwsbnVsbCx7aWQ6ImVuZGNoYXIiLG1pbjowLHN0YWNrQ2xlYXJpbmc6ITB9LG51bGwsbnVsbCxudWxsLHtpZDoiaHN0ZW1obSIsbWluOjIsc3RhY2tDbGVhcmluZzohMCxzdGVtOiEwfSx7aWQ6ImhpbnRtYXNrIixtaW46MCxzdGFja0NsZWFyaW5nOiEwfSx7aWQ6ImNudHJtYXNrIixtaW46MCxzdGFja0NsZWFyaW5nOiEwfSx7aWQ6InJtb3ZldG8iLG1pbjoyLHN0YWNrQ2xlYXJpbmc6ITB9LHtpZDoiaG1vdmV0byIsbWluOjEsc3RhY2tDbGVhcmluZzohMH0se2lkOiJ2c3RlbWhtIixtaW46MixzdGFja0NsZWFyaW5nOiEwLHN0ZW06ITB9LHtpZDoicmN1cnZlbGluZSIsbWluOjgscmVzZXRTdGFjazohMH0se2lkOiJybGluZWN1cnZlIixtaW46OCxyZXNldFN0YWNrOiEwfSx7aWQ6InZ2Y3VydmV0byIsbWluOjQscmVzZXRTdGFjazohMH0se2lkOiJoaGN1cnZldG8iLG1pbjo0LHJlc2V0U3RhY2s6ITB9LG51bGwse2lkOiJjYWxsZ3N1YnIiLG1pbjoxLHVuZGVmU3RhY2s6ITB9LHtpZDoidmhjdXJ2ZXRvIixtaW46NCxyZXNldFN0YWNrOiEwfSx7aWQ6Imh2Y3VydmV0byIsbWluOjQscmVzZXRTdGFjazohMH1dLGM9W251bGwsbnVsbCxudWxsLHtpZDoiYW5kIixtaW46MixzdGFja0RlbHRhOi0xfSx7aWQ6Im9yIixtaW46MixzdGFja0RlbHRhOi0xfSx7aWQ6Im5vdCIsbWluOjEsc3RhY2tEZWx0YTowfSxudWxsLG51bGwsbnVsbCx7aWQ6ImFicyIsbWluOjEsc3RhY2tEZWx0YTowfSx7aWQ6ImFkZCIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuKGUsdCl7ZVt0LTJdPWVbdC0yXStlW3QtMV19fSx7aWQ6InN1YiIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuKGUsdCl7ZVt0LTJdPWVbdC0yXS1lW3QtMV19fSx7aWQ6ImRpdiIsbWluOjIsc3RhY2tEZWx0YTotMSxzdGFja0ZuKGUsdCl7ZVt0LTJdPWVbdC0yXS9lW3QtMV19fSxudWxsLHtpZDoibmVnIixtaW46MSxzdGFja0RlbHRhOjAsc3RhY2tGbihlLHQpe2VbdC0xXT0tZVt0LTFdfX0se2lkOiJlcSIsbWluOjIsc3RhY2tEZWx0YTotMX0sbnVsbCxudWxsLHtpZDoiZHJvcCIsbWluOjEsc3RhY2tEZWx0YTotMX0sbnVsbCx7aWQ6InB1dCIsbWluOjIsc3RhY2tEZWx0YTotMn0se2lkOiJnZXQiLG1pbjoxLHN0YWNrRGVsdGE6MH0se2lkOiJpZmVsc2UiLG1pbjo0LHN0YWNrRGVsdGE6LTN9LHtpZDoicmFuZG9tIixtaW46MCxzdGFja0RlbHRhOjF9LHtpZDoibXVsIixtaW46MixzdGFja0RlbHRhOi0xLHN0YWNrRm4oZSx0KXtlW3QtMl09ZVt0LTJdKmVbdC0xXX19LG51bGwse2lkOiJzcXJ0IixtaW46MSxzdGFja0RlbHRhOjB9LHtpZDoiZHVwIixtaW46MSxzdGFja0RlbHRhOjF9LHtpZDoiZXhjaCIsbWluOjIsc3RhY2tEZWx0YTowfSx7aWQ6ImluZGV4IixtaW46MixzdGFja0RlbHRhOjB9LHtpZDoicm9sbCIsbWluOjMsc3RhY2tEZWx0YTotMn0sbnVsbCxudWxsLG51bGwse2lkOiJoZmxleCIsbWluOjcscmVzZXRTdGFjazohMH0se2lkOiJmbGV4IixtaW46MTMscmVzZXRTdGFjazohMH0se2lkOiJoZmxleDEiLG1pbjo5LHJlc2V0U3RhY2s6ITB9LHtpZDoiZmxleDEiLG1pbjoxMSxyZXNldFN0YWNrOiEwfV07dC5DRkZQYXJzZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuYnl0ZXM9ZS5nZXRCeXRlcygpLHRoaXMucHJvcGVydGllcz10LHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZD0hIXJ9cGFyc2UoKXtjb25zdCBlPXRoaXMucHJvcGVydGllcyx0PW5ldyBsO3RoaXMuY2ZmPXQ7Y29uc3Qgcj10aGlzLnBhcnNlSGVhZGVyKCksbj10aGlzLnBhcnNlSW5kZXgoci5lbmRQb3MpLGE9dGhpcy5wYXJzZUluZGV4KG4uZW5kUG9zKSxpPXRoaXMucGFyc2VJbmRleChhLmVuZFBvcykscz10aGlzLnBhcnNlSW5kZXgoaS5lbmRQb3MpLG89dGhpcy5wYXJzZURpY3QoYS5vYmouZ2V0KDApKSxjPXRoaXMuY3JlYXRlRGljdChwLG8sdC5zdHJpbmdzKTt0LmhlYWRlcj1yLm9iaix0Lm5hbWVzPXRoaXMucGFyc2VOYW1lSW5kZXgobi5vYmopLHQuc3RyaW5ncz10aGlzLnBhcnNlU3RyaW5nSW5kZXgoaS5vYmopLHQudG9wRGljdD1jLHQuZ2xvYmFsU3VickluZGV4PXMub2JqLHRoaXMucGFyc2VQcml2YXRlRGljdCh0LnRvcERpY3QpLHQuaXNDSURGb250PWMuaGFzTmFtZSgiUk9TIik7Y29uc3QgaD1jLmdldEJ5TmFtZSgiQ2hhclN0cmluZ3MiKSx1PXRoaXMucGFyc2VJbmRleChoKS5vYmosZD1jLmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpO2QmJihlLmZvbnRNYXRyaXg9ZCk7Y29uc3QgZj1jLmdldEJ5TmFtZSgiRm9udEJCb3giKTtsZXQgZyxtO2lmKGYmJihlLmFzY2VudD1NYXRoLm1heChmWzNdLGZbMV0pLGUuZGVzY2VudD1NYXRoLm1pbihmWzFdLGZbM10pLGUuYXNjZW50U2NhbGVkPSEwKSx0LmlzQ0lERm9udCl7Y29uc3QgZT10aGlzLnBhcnNlSW5kZXgoYy5nZXRCeU5hbWUoIkZEQXJyYXkiKSkub2JqO2ZvcihsZXQgcj0wLG49ZS5jb3VudDtyPG47KytyKXtjb25zdCBuPWUuZ2V0KHIpLGE9dGhpcy5jcmVhdGVEaWN0KHAsdGhpcy5wYXJzZURpY3QobiksdC5zdHJpbmdzKTt0aGlzLnBhcnNlUHJpdmF0ZURpY3QoYSksdC5mZEFycmF5LnB1c2goYSl9bT1udWxsLGc9dGhpcy5wYXJzZUNoYXJzZXRzKGMuZ2V0QnlOYW1lKCJjaGFyc2V0IiksdS5jb3VudCx0LnN0cmluZ3MsITApLHQuZmRTZWxlY3Q9dGhpcy5wYXJzZUZEU2VsZWN0KGMuZ2V0QnlOYW1lKCJGRFNlbGVjdCIpLHUuY291bnQpfWVsc2UgZz10aGlzLnBhcnNlQ2hhcnNldHMoYy5nZXRCeU5hbWUoImNoYXJzZXQiKSx1LmNvdW50LHQuc3RyaW5ncywhMSksbT10aGlzLnBhcnNlRW5jb2RpbmcoYy5nZXRCeU5hbWUoIkVuY29kaW5nIiksZSx0LnN0cmluZ3MsZy5jaGFyc2V0KTt0LmNoYXJzZXQ9Zyx0LmVuY29kaW5nPW07Y29uc3QgYj10aGlzLnBhcnNlQ2hhclN0cmluZ3Moe2NoYXJTdHJpbmdzOnUsbG9jYWxTdWJySW5kZXg6Yy5wcml2YXRlRGljdC5zdWJyc0luZGV4LGdsb2JhbFN1YnJJbmRleDpzLm9iaixmZFNlbGVjdDp0LmZkU2VsZWN0LGZkQXJyYXk6dC5mZEFycmF5LHByaXZhdGVEaWN0OmMucHJpdmF0ZURpY3R9KTtyZXR1cm4gdC5jaGFyU3RyaW5ncz1iLmNoYXJTdHJpbmdzLHQuc2VhY3M9Yi5zZWFjcyx0LndpZHRocz1iLndpZHRocyx0fXBhcnNlSGVhZGVyKCl7bGV0IGU9dGhpcy5ieXRlcztjb25zdCB0PWUubGVuZ3RoO2xldCByPTA7Zm9yKDtyPHQmJjEhPT1lW3JdOykrK3I7aWYocj49dCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiSW52YWxpZCBDRkYgaGVhZGVyIik7MCE9PXImJigoMCxuLmluZm8pKCJjZmYgZGF0YSBpcyBzaGlmdGVkIiksZT1lLnN1YmFycmF5KHIpLHRoaXMuYnl0ZXM9ZSk7Y29uc3QgYT1lWzBdLGk9ZVsxXSxzPWVbMl0sbz1lWzNdO3JldHVybntvYmo6bmV3IGgoYSxpLHMsbyksZW5kUG9zOnN9fXBhcnNlRGljdChlKXtsZXQgdD0wO2Z1bmN0aW9uIHIoKXtsZXQgcj1lW3QrK107cmV0dXJuIDMwPT09cj9mdW5jdGlvbigpe2xldCByPSIiO2NvbnN0IG49WyIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiLiIsIkUiLCJFLSIsbnVsbCwiLSJdLGE9ZS5sZW5ndGg7Zm9yKDt0PGE7KXtjb25zdCBhPWVbdCsrXSxpPWE+PjQscz0xNSZhO2lmKDE1PT09aSlicmVhaztpZihyKz1uW2ldLDE1PT09cylicmVhaztyKz1uW3NdfXJldHVybiBwYXJzZUZsb2F0KHIpfSgpOjI4PT09cj8ocj1lW3QrK10scj0ocjw8MjR8ZVt0KytdPDwxNik+PjE2LHIpOjI5PT09cj8ocj1lW3QrK10scj1yPDw4fGVbdCsrXSxyPXI8PDh8ZVt0KytdLHI9cjw8OHxlW3QrK10scik6cj49MzImJnI8PTI0Nj9yLTEzOTpyPj0yNDcmJnI8PTI1MD8yNTYqKHItMjQ3KStlW3QrK10rMTA4OnI+PTI1MSYmcjw9MjU0Py0yNTYqKHItMjUxKS1lW3QrK10tMTA4OigoMCxuLndhcm4pKCdDRkZQYXJzZXJfcGFyc2VEaWN0OiAiJytyKyciIGlzIGEgcmVzZXJ2ZWQgY29tbWFuZC4nKSxOYU4pfWxldCBhPVtdO2NvbnN0IGk9W107dD0wO2NvbnN0IHM9ZS5sZW5ndGg7Zm9yKDt0PHM7KXtsZXQgbj1lW3RdO248PTIxPygxMj09PW4mJihuPW48PDh8ZVsrK3RdKSxpLnB1c2goW24sYV0pLGE9W10sKyt0KTphLnB1c2gocigpKX1yZXR1cm4gaX1wYXJzZUluZGV4KGUpe2NvbnN0IHQ9bmV3IGQscj10aGlzLmJ5dGVzLG49cltlKytdPDw4fHJbZSsrXSxhPVtdO2xldCBpLHMsbz1lO2lmKDAhPT1uKXtjb25zdCB0PXJbZSsrXSxjPWUrKG4rMSkqdC0xO2ZvcihpPTAscz1uKzE7aTxzOysraSl7bGV0IG49MDtmb3IobGV0IGE9MDthPHQ7KythKW48PD04LG4rPXJbZSsrXTthLnB1c2goYytuKX1vPWFbbl19Zm9yKGk9MCxzPWEubGVuZ3RoLTE7aTxzOysraSl7Y29uc3QgZT1hW2ldLG49YVtpKzFdO3QuYWRkKHIuc3ViYXJyYXkoZSxuKSl9cmV0dXJue29iajp0LGVuZFBvczpvfX1wYXJzZU5hbWVJbmRleChlKXtjb25zdCB0PVtdO2ZvcihsZXQgcj0wLGE9ZS5jb3VudDtyPGE7KytyKXtjb25zdCBhPWUuZ2V0KHIpO3QucHVzaCgoMCxuLmJ5dGVzVG9TdHJpbmcpKGEpKX1yZXR1cm4gdH1wYXJzZVN0cmluZ0luZGV4KGUpe2NvbnN0IHQ9bmV3IHU7Zm9yKGxldCByPTAsYT1lLmNvdW50O3I8YTsrK3Ipe2NvbnN0IGE9ZS5nZXQocik7dC5hZGQoKDAsbi5ieXRlc1RvU3RyaW5nKShhKSl9cmV0dXJuIHR9Y3JlYXRlRGljdChlLHQscil7Y29uc3Qgbj1uZXcgZShyKTtmb3IoY29uc3RbZSxyXW9mIHQpbi5zZXRCeUtleShlLHIpO3JldHVybiBufXBhcnNlQ2hhclN0cmluZyhlLHQscixhKXtpZighdHx8ZS5jYWxsRGVwdGg+MTApcmV0dXJuITE7bGV0IGk9ZS5zdGFja1NpemU7Y29uc3Qgcz1lLnN0YWNrO2xldCBsPXQubGVuZ3RoO2ZvcihsZXQgaD0wO2g8bDspe2NvbnN0IHU9dFtoKytdO2xldCBkPW51bGw7aWYoMTI9PT11KXtjb25zdCBlPXRbaCsrXTswPT09ZT8odFtoLTJdPTEzOSx0W2gtMV09MjIsaT0wKTpkPWNbZV19ZWxzZSBpZigyOD09PXUpc1tpXT0odFtoXTw8MjR8dFtoKzFdPDwxNik+PjE2LGgrPTIsaSsrO2Vsc2UgaWYoMTQ9PT11KXtpZihpPj00JiYoaS09NCx0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQpKXJldHVybiBlLnNlYWM9cy5zbGljZShpLGkrNCksITE7ZD1vW3VdfWVsc2UgaWYodT49MzImJnU8PTI0NilzW2ldPXUtMTM5LGkrKztlbHNlIGlmKHU+PTI0NyYmdTw9MjU0KXNbaV09dTwyNTE/KHUtMjQ3PDw4KSt0W2hdKzEwODotKHUtMjUxPDw4KS10W2hdLTEwOCxoKyssaSsrO2Vsc2UgaWYoMjU1PT09dSlzW2ldPSh0W2hdPDwyNHx0W2grMV08PDE2fHRbaCsyXTw8OHx0W2grM10pLzY1NTM2LGgrPTQsaSsrO2Vsc2UgaWYoMTk9PT11fHwyMD09PXUpe2lmKGUuaGludHMrPWk+PjEsMD09PWUuaGludHMpe3QuY29weVdpdGhpbihoLTEsaCwtMSksaC09MSxsLT0xO2NvbnRpbnVlfWgrPWUuaGludHMrNz4+MyxpJT0yLGQ9b1t1XX1lbHNle2lmKDEwPT09dXx8Mjk9PT11KXtjb25zdCB0PTEwPT09dT9yOmE7aWYoIXQpcmV0dXJuIGQ9b1t1XSwoMCxuLndhcm4pKCJNaXNzaW5nIHN1YnJzSW5kZXggZm9yICIrZC5pZCksITE7bGV0IGM9MzI3Njg7dC5jb3VudDwxMjQwP2M9MTA3OnQuY291bnQ8MzM5MDAmJihjPTExMzEpO2NvbnN0IGw9c1stLWldK2M7aWYobDwwfHxsPj10LmNvdW50fHxpc05hTihsKSlyZXR1cm4gZD1vW3VdLCgwLG4ud2FybikoIk91dCBvZiBib3VuZHMgc3VickluZGV4IGZvciAiK2QuaWQpLCExO2lmKGUuc3RhY2tTaXplPWksZS5jYWxsRGVwdGgrKywhdGhpcy5wYXJzZUNoYXJTdHJpbmcoZSx0LmdldChsKSxyLGEpKXJldHVybiExO2UuY2FsbERlcHRoLS0saT1lLnN0YWNrU2l6ZTtjb250aW51ZX1pZigxMT09PXUpcmV0dXJuIGUuc3RhY2tTaXplPWksITA7aWYoMD09PXUmJmg9PT10Lmxlbmd0aCl0W2gtMV09MTQsZD1vWzE0XTtlbHNle2lmKDk9PT11KXt0LmNvcHlXaXRoaW4oaC0xLGgsLTEpLGgtPTEsbC09MTtjb250aW51ZX1kPW9bdV19fWlmKGQpe2lmKGQuc3RlbSYmKGUuaGludHMrPWk+PjEsMz09PXV8fDIzPT09dT9lLmhhc1ZTdGVtcz0hMDohZS5oYXNWU3RlbXN8fDEhPT11JiYxOCE9PXV8fCgoMCxuLndhcm4pKCJDRkYgc3RlbSBoaW50cyBhcmUgaW4gd3Jvbmcgb3JkZXIiKSx0W2gtMV09MT09PXU/MzoyMykpLCJtaW4iaW4gZCYmIWUudW5kZWZTdGFjayYmaTxkLm1pbilyZXR1cm4oMCxuLndhcm4pKCJOb3QgZW5vdWdoIHBhcmFtZXRlcnMgZm9yICIrZC5pZCsiOyBhY3R1YWw6ICIraSsiLCBleHBlY3RlZDogIitkLm1pbiksMD09PWkmJih0W2gtMV09MTQsITApO2UuZmlyc3RTdGFja0NsZWFyaW5nJiZkLnN0YWNrQ2xlYXJpbmcmJihlLmZpcnN0U3RhY2tDbGVhcmluZz0hMSxpLT1kLm1pbixpPj0yJiZkLnN0ZW0/aSU9MjppPjEmJigwLG4ud2FybikoIkZvdW5kIHRvbyBtYW55IHBhcmFtZXRlcnMgZm9yIHN0YWNrLWNsZWFyaW5nIGNvbW1hbmQiKSxpPjAmJihlLndpZHRoPXNbaS0xXSkpLCJzdGFja0RlbHRhImluIGQ/KCJzdGFja0ZuImluIGQmJmQuc3RhY2tGbihzLGkpLGkrPWQuc3RhY2tEZWx0YSk6ZC5zdGFja0NsZWFyaW5nP2k9MDpkLnJlc2V0U3RhY2s/KGk9MCxlLnVuZGVmU3RhY2s9ITEpOmQudW5kZWZTdGFjayYmKGk9MCxlLnVuZGVmU3RhY2s9ITAsZS5maXJzdFN0YWNrQ2xlYXJpbmc9ITEpfX1yZXR1cm4gbDx0Lmxlbmd0aCYmdC5maWxsKDE0LGwpLGUuc3RhY2tTaXplPWksITB9cGFyc2VDaGFyU3RyaW5ncyhlKXtsZXR7Y2hhclN0cmluZ3M6dCxsb2NhbFN1YnJJbmRleDpyLGdsb2JhbFN1YnJJbmRleDphLGZkU2VsZWN0OmksZmRBcnJheTpzLHByaXZhdGVEaWN0Om99PWU7Y29uc3QgYz1bXSxsPVtdLGg9dC5jb3VudDtmb3IobGV0IGU9MDtlPGg7ZSsrKXtjb25zdCBoPXQuZ2V0KGUpLHU9e2NhbGxEZXB0aDowLHN0YWNrU2l6ZTowLHN0YWNrOltdLHVuZGVmU3RhY2s6ITAsaGludHM6MCxmaXJzdFN0YWNrQ2xlYXJpbmc6ITAsc2VhYzpudWxsLHdpZHRoOm51bGwsaGFzVlN0ZW1zOiExfTtsZXQgZD0hMCxmPW51bGwsZz1vO2lmKGkmJnMubGVuZ3RoKXtjb25zdCB0PWkuZ2V0RkRJbmRleChlKTstMT09PXQmJigoMCxuLndhcm4pKCJHbHlwaCBpbmRleCBpcyBub3QgaW4gZmQgc2VsZWN0LiIpLGQ9ITEpLHQ+PXMubGVuZ3RoJiYoKDAsbi53YXJuKSgiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIiksZD0hMSksZCYmKGc9c1t0XS5wcml2YXRlRGljdCxmPWcuc3VicnNJbmRleCl9ZWxzZSByJiYoZj1yKTtpZihkJiYoZD10aGlzLnBhcnNlQ2hhclN0cmluZyh1LGgsZixhKSksbnVsbCE9PXUud2lkdGgpe2NvbnN0IHQ9Zy5nZXRCeU5hbWUoIm5vbWluYWxXaWR0aFgiKTtsW2VdPXQrdS53aWR0aH1lbHNle2NvbnN0IHQ9Zy5nZXRCeU5hbWUoImRlZmF1bHRXaWR0aFgiKTtsW2VdPXR9bnVsbCE9PXUuc2VhYyYmKGNbZV09dS5zZWFjKSxkfHx0LnNldChlLG5ldyBVaW50OEFycmF5KFsxNF0pKX1yZXR1cm57Y2hhclN0cmluZ3M6dCxzZWFjczpjLHdpZHRoczpsfX1lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KGUpe2NvbnN0IHQ9dGhpcy5jcmVhdGVEaWN0KGIsW10sZS5zdHJpbmdzKTtlLnNldEJ5S2V5KDE4LFswLDBdKSxlLnByaXZhdGVEaWN0PXR9cGFyc2VQcml2YXRlRGljdChlKXtpZighZS5oYXNOYW1lKCJQcml2YXRlIikpcmV0dXJuIHZvaWQgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KGUpO2NvbnN0IHQ9ZS5nZXRCeU5hbWUoIlByaXZhdGUiKTtpZighQXJyYXkuaXNBcnJheSh0KXx8MiE9PXQubGVuZ3RoKXJldHVybiB2b2lkIGUucmVtb3ZlQnlOYW1lKCJQcml2YXRlIik7Y29uc3Qgcj10WzBdLG49dFsxXTtpZigwPT09cnx8bj49dGhpcy5ieXRlcy5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KGUpO2NvbnN0IGE9bityLGk9dGhpcy5ieXRlcy5zdWJhcnJheShuLGEpLHM9dGhpcy5wYXJzZURpY3QoaSksbz10aGlzLmNyZWF0ZURpY3QoYixzLGUuc3RyaW5ncyk7aWYoZS5wcml2YXRlRGljdD1vLDA9PT1vLmdldEJ5TmFtZSgiRXhwYW5zaW9uRmFjdG9yIikmJm8uc2V0QnlOYW1lKCJFeHBhbnNpb25GYWN0b3IiLC4wNiksIW8uZ2V0QnlOYW1lKCJTdWJycyIpKXJldHVybjtjb25zdCBjPW8uZ2V0QnlOYW1lKCJTdWJycyIpLGw9bitjO2lmKDA9PT1jfHxsPj10aGlzLmJ5dGVzLmxlbmd0aClyZXR1cm4gdm9pZCB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkoZSk7Y29uc3QgaD10aGlzLnBhcnNlSW5kZXgobCk7by5zdWJyc0luZGV4PWgub2JqfXBhcnNlQ2hhcnNldHMoZSx0LHIsaSl7aWYoMD09PWUpcmV0dXJuIG5ldyB3KCEwLHkuSVNPX0FET0JFLGEuSVNPQWRvYmVDaGFyc2V0KTtpZigxPT09ZSlyZXR1cm4gbmV3IHcoITAseS5FWFBFUlQsYS5FeHBlcnRDaGFyc2V0KTtpZigyPT09ZSlyZXR1cm4gbmV3IHcoITAseS5FWFBFUlRfU1VCU0VULGEuRXhwZXJ0U3Vic2V0Q2hhcnNldCk7Y29uc3Qgcz10aGlzLmJ5dGVzLG89ZSxjPXNbZSsrXSxsPVtpPzA6Ii5ub3RkZWYiXTtsZXQgaCx1LGQ7c3dpdGNoKHQtPTEsYyl7Y2FzZSAwOmZvcihkPTA7ZDx0O2QrKyloPXNbZSsrXTw8OHxzW2UrK10sbC5wdXNoKGk/aDpyLmdldChoKSk7YnJlYWs7Y2FzZSAxOmZvcig7bC5sZW5ndGg8PXQ7KWZvcihoPXNbZSsrXTw8OHxzW2UrK10sdT1zW2UrK10sZD0wO2Q8PXU7ZCsrKWwucHVzaChpP2grKzpyLmdldChoKyspKTticmVhaztjYXNlIDI6Zm9yKDtsLmxlbmd0aDw9dDspZm9yKGg9c1tlKytdPDw4fHNbZSsrXSx1PXNbZSsrXTw8OHxzW2UrK10sZD0wO2Q8PXU7ZCsrKWwucHVzaChpP2grKzpyLmdldChoKyspKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIGNoYXJzZXQgZm9ybWF0Iil9Y29uc3QgZj1lLGc9cy5zdWJhcnJheShvLGYpO3JldHVybiBuZXcgdyghMSxjLGwsZyl9cGFyc2VFbmNvZGluZyhlLHQscixhKXtjb25zdCBzPU9iamVjdC5jcmVhdGUobnVsbCksbz10aGlzLmJ5dGVzO2xldCBjLGwsaCx1PSExLGQ9bnVsbDtpZigwPT09ZXx8MT09PWUpe3U9ITAsYz1lO2NvbnN0IHQ9ZT9pLkV4cGVydEVuY29kaW5nOmkuU3RhbmRhcmRFbmNvZGluZztmb3IobD0wLGg9YS5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgZT10LmluZGV4T2YoYVtsXSk7LTEhPT1lJiYoc1tlXT1sKX19ZWxzZXtjb25zdCB0PWU7c3dpdGNoKGM9b1tlKytdLDEyNyZjKXtjYXNlIDA6Y29uc3QgdD1vW2UrK107Zm9yKGw9MTtsPD10O2wrKylzW29bZSsrXV09bDticmVhaztjYXNlIDE6Y29uc3Qgcj1vW2UrK107bGV0IGE9MTtmb3IobD0wO2w8cjtsKyspe2NvbnN0IHQ9b1tlKytdLHI9b1tlKytdO2ZvcihsZXQgZT10O2U8PXQrcjtlKyspc1tlXT1hKyt9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVW5rbm93biBlbmNvZGluZyBmb3JtYXQ6ICIuY29uY2F0KGMsIiBpbiBDRkYiKSl9Y29uc3QgaT1lOzEyOCZjJiYob1t0XSY9MTI3LGZ1bmN0aW9uKCl7Y29uc3QgdD1vW2UrK107Zm9yKGw9MDtsPHQ7bCsrKXtjb25zdCB0PW9bZSsrXSxuPShvW2UrK108PDgpKygyNTUmb1tlKytdKTtzW3RdPWEuaW5kZXhPZihyLmdldChuKSl9fSgpKSxkPW8uc3ViYXJyYXkodCxpKX1yZXR1cm4gYyY9MTI3LG5ldyB2KHUsYyxzLGQpfXBhcnNlRkRTZWxlY3QoZSx0KXtjb25zdCByPXRoaXMuYnl0ZXMsYT1yW2UrK10saT1bXTtsZXQgcztzd2l0Y2goYSl7Y2FzZSAwOmZvcihzPTA7czx0Oysrcyl7Y29uc3QgdD1yW2UrK107aS5wdXNoKHQpfWJyZWFrO2Nhc2UgMzpjb25zdCBvPXJbZSsrXTw8OHxyW2UrK107Zm9yKHM9MDtzPG87KytzKXtsZXQgdD1yW2UrK108PDh8cltlKytdOzA9PT1zJiYwIT09dCYmKCgwLG4ud2FybikoInBhcnNlRkRTZWxlY3Q6IFRoZSBmaXJzdCByYW5nZSBtdXN0IGhhdmUgYSBmaXJzdCBHSUQgb2YgMCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4iKSx0PTApO2NvbnN0IGE9cltlKytdLG89cltlXTw8OHxyW2UrMV07Zm9yKGxldCBlPXQ7ZTxvOysrZSlpLnB1c2goYSl9ZSs9MjticmVhaztkZWZhdWx0OnRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdwYXJzZUZEU2VsZWN0OiBVbmtub3duIGZvcm1hdCAiJy5jb25jYXQoYSwnIi4nKSl9aWYoaS5sZW5ndGghPT10KXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJwYXJzZUZEU2VsZWN0OiBJbnZhbGlkIGZvbnQgZGF0YS4iKTtyZXR1cm4gbmV3IHgoYSxpKX19O2NsYXNzIGx7Y29uc3RydWN0b3IoKXt0aGlzLmhlYWRlcj1udWxsLHRoaXMubmFtZXM9W10sdGhpcy50b3BEaWN0PW51bGwsdGhpcy5zdHJpbmdzPW5ldyB1LHRoaXMuZ2xvYmFsU3VickluZGV4PW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHRoaXMuY2hhcnNldD1udWxsLHRoaXMuY2hhclN0cmluZ3M9bnVsbCx0aGlzLmZkQXJyYXk9W10sdGhpcy5mZFNlbGVjdD1udWxsLHRoaXMuaXNDSURGb250PSExfWR1cGxpY2F0ZUZpcnN0R2x5cGgoKXtpZih0aGlzLmNoYXJTdHJpbmdzLmNvdW50Pj02NTUzNSlyZXR1cm4gdm9pZCgwLG4ud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gY2hhcnN0cmluZ3MgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpO2NvbnN0IGU9dGhpcy5jaGFyU3RyaW5ncy5nZXQoMCk7dGhpcy5jaGFyU3RyaW5ncy5hZGQoZSksdGhpcy5pc0NJREZvbnQmJnRoaXMuZmRTZWxlY3QuZmRTZWxlY3QucHVzaCh0aGlzLmZkU2VsZWN0LmZkU2VsZWN0WzBdKX1oYXNHbHlwaElkKGUpe3JldHVybiEoZTwwfHxlPj10aGlzLmNoYXJTdHJpbmdzLmNvdW50KSYmdGhpcy5jaGFyU3RyaW5ncy5nZXQoZSkubGVuZ3RoPjB9fXQuQ0ZGPWw7Y2xhc3MgaHtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLm1ham9yPWUsdGhpcy5taW5vcj10LHRoaXMuaGRyU2l6ZT1yLHRoaXMub2ZmU2l6ZT1ufX10LkNGRkhlYWRlcj1oO2NsYXNzIHV7Y29uc3RydWN0b3IoKXt0aGlzLnN0cmluZ3M9W119Z2V0KGUpe3JldHVybiBlPj0wJiZlPD0zOTA/c1tlXTplLTM5MTw9dGhpcy5zdHJpbmdzLmxlbmd0aD90aGlzLnN0cmluZ3NbZS0zOTFdOnNbMF19Z2V0U0lEKGUpe2xldCB0PXMuaW5kZXhPZihlKTtyZXR1cm4tMSE9PXQ/dDoodD10aGlzLnN0cmluZ3MuaW5kZXhPZihlKSwtMSE9PXQ/dCszOTE6LTEpfWFkZChlKXt0aGlzLnN0cmluZ3MucHVzaChlKX1nZXQgY291bnQoKXtyZXR1cm4gdGhpcy5zdHJpbmdzLmxlbmd0aH19dC5DRkZTdHJpbmdzPXU7Y2xhc3MgZHtjb25zdHJ1Y3Rvcigpe3RoaXMub2JqZWN0cz1bXSx0aGlzLmxlbmd0aD0wfWFkZChlKXt0aGlzLmxlbmd0aCs9ZS5sZW5ndGgsdGhpcy5vYmplY3RzLnB1c2goZSl9c2V0KGUsdCl7dGhpcy5sZW5ndGgrPXQubGVuZ3RoLXRoaXMub2JqZWN0c1tlXS5sZW5ndGgsdGhpcy5vYmplY3RzW2VdPXR9Z2V0KGUpe3JldHVybiB0aGlzLm9iamVjdHNbZV19Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMub2JqZWN0cy5sZW5ndGh9fXQuQ0ZGSW5kZXg9ZDtjbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5rZXlUb05hbWVNYXA9ZS5rZXlUb05hbWVNYXAsdGhpcy5uYW1lVG9LZXlNYXA9ZS5uYW1lVG9LZXlNYXAsdGhpcy5kZWZhdWx0cz1lLmRlZmF1bHRzLHRoaXMudHlwZXM9ZS50eXBlcyx0aGlzLm9wY29kZXM9ZS5vcGNvZGVzLHRoaXMub3JkZXI9ZS5vcmRlcix0aGlzLnN0cmluZ3M9dCx0aGlzLnZhbHVlcz1PYmplY3QuY3JlYXRlKG51bGwpfXNldEJ5S2V5KGUsdCl7aWYoIShlIGluIHRoaXMua2V5VG9OYW1lTWFwKSlyZXR1cm4hMTtpZigwPT09dC5sZW5ndGgpcmV0dXJuITA7Zm9yKGNvbnN0IHIgb2YgdClpZihpc05hTihyKSlyZXR1cm4oMCxuLndhcm4pKCdJbnZhbGlkIENGRkRpY3QgdmFsdWU6ICInLmNvbmNhdCh0LCciIGZvciBrZXkgIicpLmNvbmNhdChlLCciLicpKSwhMDtjb25zdCByPXRoaXMudHlwZXNbZV07cmV0dXJuIm51bSIhPT1yJiYic2lkIiE9PXImJiJvZmZzZXQiIT09cnx8KHQ9dFswXSksdGhpcy52YWx1ZXNbZV09dCwhMH1zZXRCeU5hbWUoZSx0KXtpZighKGUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCdJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAiJy5jb25jYXQoZSwnIicpKTt0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtlXV09dH1oYXNOYW1lKGUpe3JldHVybiB0aGlzLm5hbWVUb0tleU1hcFtlXWluIHRoaXMudmFsdWVzfWdldEJ5TmFtZShlKXtpZighKGUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAiLmNvbmNhdChlLCciJykpO2NvbnN0IHQ9dGhpcy5uYW1lVG9LZXlNYXBbZV07cmV0dXJuIHQgaW4gdGhpcy52YWx1ZXM/dGhpcy52YWx1ZXNbdF06dGhpcy5kZWZhdWx0c1t0XX1yZW1vdmVCeU5hbWUoZSl7ZGVsZXRlIHRoaXMudmFsdWVzW3RoaXMubmFtZVRvS2V5TWFwW2VdXX1zdGF0aWMgY3JlYXRlVGFibGVzKGUpe2NvbnN0IHQ9e2tleVRvTmFtZU1hcDp7fSxuYW1lVG9LZXlNYXA6e30sZGVmYXVsdHM6e30sdHlwZXM6e30sb3Bjb2Rlczp7fSxvcmRlcjpbXX07Zm9yKGNvbnN0IHIgb2YgZSl7Y29uc3QgZT1BcnJheS5pc0FycmF5KHJbMF0pPyhyWzBdWzBdPDw4KStyWzBdWzFdOnJbMF07dC5rZXlUb05hbWVNYXBbZV09clsxXSx0Lm5hbWVUb0tleU1hcFtyWzFdXT1lLHQudHlwZXNbZV09clsyXSx0LmRlZmF1bHRzW2VdPXJbM10sdC5vcGNvZGVzW2VdPUFycmF5LmlzQXJyYXkoclswXSk/clswXTpbclswXV0sdC5vcmRlci5wdXNoKGUpfXJldHVybiB0fX1jb25zdCBnPVtbWzEyLDMwXSwiUk9TIixbInNpZCIsInNpZCIsIm51bSJdLG51bGxdLFtbMTIsMjBdLCJTeW50aGV0aWNCYXNlIiwibnVtIixudWxsXSxbMCwidmVyc2lvbiIsInNpZCIsbnVsbF0sWzEsIk5vdGljZSIsInNpZCIsbnVsbF0sW1sxMiwwXSwiQ29weXJpZ2h0Iiwic2lkIixudWxsXSxbMiwiRnVsbE5hbWUiLCJzaWQiLG51bGxdLFszLCJGYW1pbHlOYW1lIiwic2lkIixudWxsXSxbNCwiV2VpZ2h0Iiwic2lkIixudWxsXSxbWzEyLDFdLCJpc0ZpeGVkUGl0Y2giLCJudW0iLDBdLFtbMTIsMl0sIkl0YWxpY0FuZ2xlIiwibnVtIiwwXSxbWzEyLDNdLCJVbmRlcmxpbmVQb3NpdGlvbiIsIm51bSIsLTEwMF0sW1sxMiw0XSwiVW5kZXJsaW5lVGhpY2tuZXNzIiwibnVtIiw1MF0sW1sxMiw1XSwiUGFpbnRUeXBlIiwibnVtIiwwXSxbWzEyLDZdLCJDaGFyc3RyaW5nVHlwZSIsIm51bSIsMl0sW1sxMiw3XSwiRm9udE1hdHJpeCIsWyJudW0iLCJudW0iLCJudW0iLCJudW0iLCJudW0iLCJudW0iXSxbLjAwMSwwLDAsLjAwMSwwLDBdXSxbMTMsIlVuaXF1ZUlEIiwibnVtIixudWxsXSxbNSwiRm9udEJCb3giLFsibnVtIiwibnVtIiwibnVtIiwibnVtIl0sWzAsMCwwLDBdXSxbWzEyLDhdLCJTdHJva2VXaWR0aCIsIm51bSIsMF0sWzE0LCJYVUlEIiwiYXJyYXkiLG51bGxdLFsxNSwiY2hhcnNldCIsIm9mZnNldCIsMF0sWzE2LCJFbmNvZGluZyIsIm9mZnNldCIsMF0sWzE3LCJDaGFyU3RyaW5ncyIsIm9mZnNldCIsMF0sWzE4LCJQcml2YXRlIixbIm9mZnNldCIsIm9mZnNldCJdLG51bGxdLFtbMTIsMjFdLCJQb3N0U2NyaXB0Iiwic2lkIixudWxsXSxbWzEyLDIyXSwiQmFzZUZvbnROYW1lIiwic2lkIixudWxsXSxbWzEyLDIzXSwiQmFzZUZvbnRCbGVuZCIsImRlbHRhIixudWxsXSxbWzEyLDMxXSwiQ0lERm9udFZlcnNpb24iLCJudW0iLDBdLFtbMTIsMzJdLCJDSURGb250UmV2aXNpb24iLCJudW0iLDBdLFtbMTIsMzNdLCJDSURGb250VHlwZSIsIm51bSIsMF0sW1sxMiwzNF0sIkNJRENvdW50IiwibnVtIiw4NzIwXSxbWzEyLDM1XSwiVUlEQmFzZSIsIm51bSIsbnVsbF0sW1sxMiwzN10sIkZEU2VsZWN0Iiwib2Zmc2V0IixudWxsXSxbWzEyLDM2XSwiRkRBcnJheSIsIm9mZnNldCIsbnVsbF0sW1sxMiwzOF0sIkZvbnROYW1lIiwic2lkIixudWxsXV07Y2xhc3MgcCBleHRlbmRzIGZ7c3RhdGljIGdldCB0YWJsZXMoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywidGFibGVzIix0aGlzLmNyZWF0ZVRhYmxlcyhnKSl9Y29uc3RydWN0b3IoZSl7c3VwZXIocC50YWJsZXMsZSksdGhpcy5wcml2YXRlRGljdD1udWxsfX10LkNGRlRvcERpY3Q9cDtjb25zdCBtPVtbNiwiQmx1ZVZhbHVlcyIsImRlbHRhIixudWxsXSxbNywiT3RoZXJCbHVlcyIsImRlbHRhIixudWxsXSxbOCwiRmFtaWx5Qmx1ZXMiLCJkZWx0YSIsbnVsbF0sWzksIkZhbWlseU90aGVyQmx1ZXMiLCJkZWx0YSIsbnVsbF0sW1sxMiw5XSwiQmx1ZVNjYWxlIiwibnVtIiwuMDM5NjI1XSxbWzEyLDEwXSwiQmx1ZVNoaWZ0IiwibnVtIiw3XSxbWzEyLDExXSwiQmx1ZUZ1enoiLCJudW0iLDFdLFsxMCwiU3RkSFciLCJudW0iLG51bGxdLFsxMSwiU3RkVlciLCJudW0iLG51bGxdLFtbMTIsMTJdLCJTdGVtU25hcEgiLCJkZWx0YSIsbnVsbF0sW1sxMiwxM10sIlN0ZW1TbmFwViIsImRlbHRhIixudWxsXSxbWzEyLDE0XSwiRm9yY2VCb2xkIiwibnVtIiwwXSxbWzEyLDE3XSwiTGFuZ3VhZ2VHcm91cCIsIm51bSIsMF0sW1sxMiwxOF0sIkV4cGFuc2lvbkZhY3RvciIsIm51bSIsLjA2XSxbWzEyLDE5XSwiaW5pdGlhbFJhbmRvbVNlZWQiLCJudW0iLDBdLFsyMCwiZGVmYXVsdFdpZHRoWCIsIm51bSIsMF0sWzIxLCJub21pbmFsV2lkdGhYIiwibnVtIiwwXSxbMTksIlN1YnJzIiwib2Zmc2V0IixudWxsXV07Y2xhc3MgYiBleHRlbmRzIGZ7c3RhdGljIGdldCB0YWJsZXMoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywidGFibGVzIix0aGlzLmNyZWF0ZVRhYmxlcyhtKSl9Y29uc3RydWN0b3IoZSl7c3VwZXIoYi50YWJsZXMsZSksdGhpcy5zdWJyc0luZGV4PW51bGx9fXQuQ0ZGUHJpdmF0ZURpY3Q9Yjtjb25zdCB5PXtJU09fQURPQkU6MCxFWFBFUlQ6MSxFWFBFUlRfU1VCU0VUOjJ9O2NsYXNzIHd7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy5wcmVkZWZpbmVkPWUsdGhpcy5mb3JtYXQ9dCx0aGlzLmNoYXJzZXQ9cix0aGlzLnJhdz1ufX10LkNGRkNoYXJzZXQ9dztjbGFzcyB2e2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMucHJlZGVmaW5lZD1lLHRoaXMuZm9ybWF0PXQsdGhpcy5lbmNvZGluZz1yLHRoaXMucmF3PW59fWNsYXNzIHh7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmZvcm1hdD1lLHRoaXMuZmRTZWxlY3Q9dH1nZXRGREluZGV4KGUpe3JldHVybiBlPDB8fGU+PXRoaXMuZmRTZWxlY3QubGVuZ3RoPy0xOnRoaXMuZmRTZWxlY3RbZV19fXQuQ0ZGRkRTZWxlY3Q9eDtjbGFzcyBTe2NvbnN0cnVjdG9yKCl7dGhpcy5vZmZzZXRzPU9iamVjdC5jcmVhdGUobnVsbCl9aXNUcmFja2luZyhlKXtyZXR1cm4gZSBpbiB0aGlzLm9mZnNldHN9dHJhY2soZSx0KXtpZihlIGluIHRoaXMub2Zmc2V0cyl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiQWxyZWFkeSB0cmFja2luZyBsb2NhdGlvbiBvZiAiLmNvbmNhdChlKSk7dGhpcy5vZmZzZXRzW2VdPXR9b2Zmc2V0KGUpe2Zvcihjb25zdCB0IGluIHRoaXMub2Zmc2V0cyl0aGlzLm9mZnNldHNbdF0rPWV9c2V0RW50cnlMb2NhdGlvbihlLHQscil7aWYoIShlIGluIHRoaXMub2Zmc2V0cykpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIk5vdCB0cmFja2luZyBsb2NhdGlvbiBvZiAiLmNvbmNhdChlKSk7Y29uc3QgYT1yLmRhdGEsaT10aGlzLm9mZnNldHNbZV07Zm9yKGxldCBlPTAscj10Lmxlbmd0aDtlPHI7KytlKXtjb25zdCByPTUqZStpLHM9cisxLG89cisyLGM9ciszLGw9cis0O2lmKDI5IT09YVtyXXx8MCE9PWFbc118fDAhPT1hW29dfHwwIT09YVtjXXx8MCE9PWFbbF0pdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIndyaXRpbmcgdG8gYW4gb2Zmc2V0IHRoYXQgaXMgbm90IGVtcHR5Iik7Y29uc3QgaD10W2VdO2Fbcl09MjksYVtzXT1oPj4yNCYyNTUsYVtvXT1oPj4xNiYyNTUsYVtjXT1oPj44JjI1NSxhW2xdPTI1NSZofX19Y2xhc3MgQXtjb25zdHJ1Y3RvcihlKXt0aGlzLmNmZj1lfWNvbXBpbGUoKXtjb25zdCBlPXRoaXMuY2ZmLHQ9e2RhdGE6W10sbGVuZ3RoOjAsYWRkKGUpe3RyeXt0aGlzLmRhdGEucHVzaCguLi5lKX1jYXRjaCh0KXt0aGlzLmRhdGE9dGhpcy5kYXRhLmNvbmNhdChlKX10aGlzLmxlbmd0aD10aGlzLmRhdGEubGVuZ3RofX0scj10aGlzLmNvbXBpbGVIZWFkZXIoZS5oZWFkZXIpO3QuYWRkKHIpO2NvbnN0IGE9dGhpcy5jb21waWxlTmFtZUluZGV4KGUubmFtZXMpO2lmKHQuYWRkKGEpLGUuaXNDSURGb250JiZlLnRvcERpY3QuaGFzTmFtZSgiRm9udE1hdHJpeCIpKXtjb25zdCB0PWUudG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTtlLnRvcERpY3QucmVtb3ZlQnlOYW1lKCJGb250TWF0cml4Iik7Zm9yKGNvbnN0IHIgb2YgZS5mZEFycmF5KXtsZXQgZT10LnNsaWNlKDApO3IuaGFzTmFtZSgiRm9udE1hdHJpeCIpJiYoZT1uLlV0aWwudHJhbnNmb3JtKGUsci5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKSkpLHIuc2V0QnlOYW1lKCJGb250TWF0cml4IixlKX19Y29uc3QgaT1lLnRvcERpY3QuZ2V0QnlOYW1lKCJYVUlEIik7KG51bGw9PWk/dm9pZCAwOmkubGVuZ3RoKT4xNiYmZS50b3BEaWN0LnJlbW92ZUJ5TmFtZSgiWFVJRCIpLGUudG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLDApO2xldCBzPXRoaXMuY29tcGlsZVRvcERpY3RzKFtlLnRvcERpY3RdLHQubGVuZ3RoLGUuaXNDSURGb250KTt0LmFkZChzLm91dHB1dCk7Y29uc3Qgbz1zLnRyYWNrZXJzWzBdLGM9dGhpcy5jb21waWxlU3RyaW5nSW5kZXgoZS5zdHJpbmdzLnN0cmluZ3MpO3QuYWRkKGMpO2NvbnN0IGw9dGhpcy5jb21waWxlSW5kZXgoZS5nbG9iYWxTdWJySW5kZXgpO2lmKHQuYWRkKGwpLGUuZW5jb2RpbmcmJmUudG9wRGljdC5oYXNOYW1lKCJFbmNvZGluZyIpKWlmKGUuZW5jb2RpbmcucHJlZGVmaW5lZClvLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIixbZS5lbmNvZGluZy5mb3JtYXRdLHQpO2Vsc2V7Y29uc3Qgcj10aGlzLmNvbXBpbGVFbmNvZGluZyhlLmVuY29kaW5nKTtvLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIixbdC5sZW5ndGhdLHQpLHQuYWRkKHIpfWNvbnN0IGg9dGhpcy5jb21waWxlQ2hhcnNldChlLmNoYXJzZXQsZS5jaGFyU3RyaW5ncy5jb3VudCxlLnN0cmluZ3MsZS5pc0NJREZvbnQpO28uc2V0RW50cnlMb2NhdGlvbigiY2hhcnNldCIsW3QubGVuZ3RoXSx0KSx0LmFkZChoKTtjb25zdCB1PXRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKGUuY2hhclN0cmluZ3MpO2lmKG8uc2V0RW50cnlMb2NhdGlvbigiQ2hhclN0cmluZ3MiLFt0Lmxlbmd0aF0sdCksdC5hZGQodSksZS5pc0NJREZvbnQpe28uc2V0RW50cnlMb2NhdGlvbigiRkRTZWxlY3QiLFt0Lmxlbmd0aF0sdCk7Y29uc3Qgcj10aGlzLmNvbXBpbGVGRFNlbGVjdChlLmZkU2VsZWN0KTt0LmFkZChyKSxzPXRoaXMuY29tcGlsZVRvcERpY3RzKGUuZmRBcnJheSx0Lmxlbmd0aCwhMCksby5zZXRFbnRyeUxvY2F0aW9uKCJGREFycmF5IixbdC5sZW5ndGhdLHQpLHQuYWRkKHMub3V0cHV0KTtjb25zdCBuPXMudHJhY2tlcnM7dGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKGUuZmRBcnJheSxuLHQpfXJldHVybiB0aGlzLmNvbXBpbGVQcml2YXRlRGljdHMoW2UudG9wRGljdF0sW29dLHQpLHQuYWRkKFswXSksdC5kYXRhfWVuY29kZU51bWJlcihlKXtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihlKT90aGlzLmVuY29kZUludGVnZXIoZSk6dGhpcy5lbmNvZGVGbG9hdChlKX1zdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIkVuY29kZUZsb2F0UmVnRXhwIiwvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyl9ZW5jb2RlRmxvYXQoZSl7bGV0IHQ9ZS50b1N0cmluZygpO2NvbnN0IHI9QS5FbmNvZGVGbG9hdFJlZ0V4cC5leGVjKHQpO2lmKHIpe2NvbnN0IG49cGFyc2VGbG9hdCgiMWUiKygoclsyXT8rclsyXTowKStyWzFdLmxlbmd0aCkpO3Q9KE1hdGgucm91bmQoZSpuKS9uKS50b1N0cmluZygpfWxldCBuLGEsaT0iIjtmb3Iobj0wLGE9dC5sZW5ndGg7bjxhOysrbil7Y29uc3QgZT10W25dO2krPSJlIj09PWU/Ii0iPT09dFsrK25dPyJjIjoiYiI6Ii4iPT09ZT8iYSI6Ii0iPT09ZT8iZSI6ZX1pKz0xJmkubGVuZ3RoPyJmIjoiZmYiO2NvbnN0IHM9WzMwXTtmb3Iobj0wLGE9aS5sZW5ndGg7bjxhO24rPTIpcy5wdXNoKHBhcnNlSW50KGkuc3Vic3RyaW5nKG4sbisyKSwxNikpO3JldHVybiBzfWVuY29kZUludGVnZXIoZSl7bGV0IHQ7cmV0dXJuIHQ9ZT49LTEwNyYmZTw9MTA3P1tlKzEzOV06ZT49MTA4JiZlPD0xMTMxP1syNDcrKChlLT0xMDgpPj44KSwyNTUmZV06ZT49LTExMzEmJmU8PS0xMDg/WzI1MSsoKGU9LWUtMTA4KT4+OCksMjU1JmVdOmU+PS0zMjc2OCYmZTw9MzI3Njc/WzI4LGU+PjgmMjU1LDI1NSZlXTpbMjksZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwyNTUmZV0sdH1jb21waWxlSGVhZGVyKGUpe3JldHVybltlLm1ham9yLGUubWlub3IsNCxlLm9mZlNpemVdfWNvbXBpbGVOYW1lSW5kZXgoZSl7Y29uc3QgdD1uZXcgZDtmb3IoY29uc3QgciBvZiBlKXtjb25zdCBlPU1hdGgubWluKHIubGVuZ3RoLDEyNyk7bGV0IGE9bmV3IEFycmF5KGUpO2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPXJbdF07KGU8IiEifHxlPiJ+Inx8IlsiPT09ZXx8Il0iPT09ZXx8IigiPT09ZXx8IikiPT09ZXx8InsiPT09ZXx8In0iPT09ZXx8IjwiPT09ZXx8Ij4iPT09ZXx8Ii8iPT09ZXx8IiUiPT09ZSkmJihlPSJfIiksYVt0XT1lfWE9YS5qb2luKCIiKSwiIj09PWEmJihhPSJCYWRfRm9udF9OYW1lIiksdC5hZGQoKDAsbi5zdHJpbmdUb0J5dGVzKShhKSl9cmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KHQpfWNvbXBpbGVUb3BEaWN0cyhlLHQscil7Y29uc3Qgbj1bXTtsZXQgYT1uZXcgZDtmb3IoY29uc3QgaSBvZiBlKXtyJiYoaS5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIiksaS5yZW1vdmVCeU5hbWUoIkNJREZvbnRSZXZpc2lvbiIpLGkucmVtb3ZlQnlOYW1lKCJDSURGb250VHlwZSIpLGkucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpLGkucmVtb3ZlQnlOYW1lKCJVSURCYXNlIikpO2NvbnN0IGU9bmV3IFMscz10aGlzLmNvbXBpbGVEaWN0KGksZSk7bi5wdXNoKGUpLGEuYWRkKHMpLGUub2Zmc2V0KHQpfXJldHVybiBhPXRoaXMuY29tcGlsZUluZGV4KGEsbikse3RyYWNrZXJzOm4sb3V0cHV0OmF9fWNvbXBpbGVQcml2YXRlRGljdHMoZSx0LHIpe2ZvcihsZXQgYT0wLGk9ZS5sZW5ndGg7YTxpOysrYSl7Y29uc3QgaT1lW2FdLHM9aS5wcml2YXRlRGljdDtpZighc3x8IWkuaGFzTmFtZSgiUHJpdmF0ZSIpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJUaGVyZSBtdXN0IGJlIGEgcHJpdmF0ZSBkaWN0aW9uYXJ5LiIpO2NvbnN0IG89bmV3IFMsYz10aGlzLmNvbXBpbGVEaWN0KHMsbyk7bGV0IGw9ci5sZW5ndGg7aWYoby5vZmZzZXQobCksYy5sZW5ndGh8fChsPTApLHRbYV0uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsW2MubGVuZ3RoLGxdLHIpLHIuYWRkKGMpLHMuc3VicnNJbmRleCYmcy5oYXNOYW1lKCJTdWJycyIpKXtjb25zdCBlPXRoaXMuY29tcGlsZUluZGV4KHMuc3VicnNJbmRleCk7by5zZXRFbnRyeUxvY2F0aW9uKCJTdWJycyIsW2MubGVuZ3RoXSxyKSxyLmFkZChlKX19fWNvbXBpbGVEaWN0KGUsdCl7Y29uc3Qgcj1bXTtmb3IoY29uc3QgYSBvZiBlLm9yZGVyKXtpZighKGEgaW4gZS52YWx1ZXMpKWNvbnRpbnVlO2xldCBpPWUudmFsdWVzW2FdLHM9ZS50eXBlc1thXTtpZihBcnJheS5pc0FycmF5KHMpfHwocz1bc10pLEFycmF5LmlzQXJyYXkoaSl8fChpPVtpXSksMCE9PWkubGVuZ3RoKXtmb3IobGV0IG89MCxjPXMubGVuZ3RoO288YzsrK28pe2NvbnN0IGM9c1tvXSxsPWlbb107c3dpdGNoKGMpe2Nhc2UibnVtIjpjYXNlInNpZCI6ci5wdXNoKC4uLnRoaXMuZW5jb2RlTnVtYmVyKGwpKTticmVhaztjYXNlIm9mZnNldCI6Y29uc3Qgcz1lLmtleVRvTmFtZU1hcFthXTt0LmlzVHJhY2tpbmcocyl8fHQudHJhY2socyxyLmxlbmd0aCksci5wdXNoKDI5LDAsMCwwLDApO2JyZWFrO2Nhc2UiYXJyYXkiOmNhc2UiZGVsdGEiOnIucHVzaCguLi50aGlzLmVuY29kZU51bWJlcihsKSk7Zm9yKGxldCBlPTEsdD1pLmxlbmd0aDtlPHQ7KytlKXIucHVzaCguLi50aGlzLmVuY29kZU51bWJlcihpW2VdKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVW5rbm93biBkYXRhIHR5cGUgb2YgIi5jb25jYXQoYykpfX1yLnB1c2goLi4uZS5vcGNvZGVzW2FdKX19cmV0dXJuIHJ9Y29tcGlsZVN0cmluZ0luZGV4KGUpe2NvbnN0IHQ9bmV3IGQ7Zm9yKGNvbnN0IHIgb2YgZSl0LmFkZCgoMCxuLnN0cmluZ1RvQnl0ZXMpKHIpKTtyZXR1cm4gdGhpcy5jb21waWxlSW5kZXgodCl9Y29tcGlsZUNoYXJTdHJpbmdzKGUpe2NvbnN0IHQ9bmV3IGQ7Zm9yKGxldCByPTA7cjxlLmNvdW50O3IrKyl7Y29uc3Qgbj1lLmdldChyKTswIT09bi5sZW5ndGg/dC5hZGQobik6dC5hZGQobmV3IFVpbnQ4QXJyYXkoWzEzOSwxNF0pKX1yZXR1cm4gdGhpcy5jb21waWxlSW5kZXgodCl9Y29tcGlsZUNoYXJzZXQoZSx0LHIsYSl7bGV0IGk7Y29uc3Qgcz10LTE7aWYoYSlpPW5ldyBVaW50OEFycmF5KFsyLDAsMCxzPj44JjI1NSwyNTUmc10pO2Vsc2V7aT1uZXcgVWludDhBcnJheSgxKzIqcyksaVswXT0wO2xldCB0PTA7Y29uc3QgYT1lLmNoYXJzZXQubGVuZ3RoO2xldCBvPSExO2ZvcihsZXQgcz0xO3M8aS5sZW5ndGg7cys9Mil7bGV0IGM9MDtpZih0PGEpe2NvbnN0IGE9ZS5jaGFyc2V0W3QrK107Yz1yLmdldFNJRChhKSwtMT09PWMmJihjPTAsb3x8KG89ITAsKDAsbi53YXJuKSgiQ291bGRuJ3QgZmluZCAiLmNvbmNhdChhLCIgaW4gQ0ZGIHN0cmluZ3MiKSkpKX1pW3NdPWM+PjgmMjU1LGlbcysxXT0yNTUmY319cmV0dXJuIHRoaXMuY29tcGlsZVR5cGVkQXJyYXkoaSl9Y29tcGlsZUVuY29kaW5nKGUpe3JldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KGUucmF3KX1jb21waWxlRkRTZWxlY3QoZSl7Y29uc3QgdD1lLmZvcm1hdDtsZXQgcixuO3N3aXRjaCh0KXtjYXNlIDA6Zm9yKHI9bmV3IFVpbnQ4QXJyYXkoMStlLmZkU2VsZWN0Lmxlbmd0aCksclswXT10LG49MDtuPGUuZmRTZWxlY3QubGVuZ3RoO24rKylyW24rMV09ZS5mZFNlbGVjdFtuXTticmVhaztjYXNlIDM6Y29uc3QgYT0wO2xldCBpPWUuZmRTZWxlY3RbMF07Y29uc3Qgcz1bdCwwLDAsYT4+OCYyNTUsMjU1JmEsaV07Zm9yKG49MTtuPGUuZmRTZWxlY3QubGVuZ3RoO24rKyl7Y29uc3QgdD1lLmZkU2VsZWN0W25dO3QhPT1pJiYocy5wdXNoKG4+PjgmMjU1LDI1NSZuLHQpLGk9dCl9Y29uc3Qgbz0ocy5sZW5ndGgtMykvMztzWzFdPW8+PjgmMjU1LHNbMl09MjU1Jm8scy5wdXNoKG4+PjgmMjU1LDI1NSZuKSxyPW5ldyBVaW50OEFycmF5KHMpfXJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KHIpfWNvbXBpbGVUeXBlZEFycmF5KGUpe3JldHVybiBBcnJheS5mcm9tKGUpfWNvbXBpbGVJbmRleChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06W107Y29uc3Qgcj1lLm9iamVjdHMsbj1yLmxlbmd0aDtpZigwPT09bilyZXR1cm5bMCwwXTtjb25zdCBhPVtuPj44JjI1NSwyNTUmbl07bGV0IGkscyxvPTE7Zm9yKGk9MDtpPG47KytpKW8rPXJbaV0ubGVuZ3RoO3M9bzwyNTY/MTpvPDY1NTM2PzI6bzwxNjc3NzIxNj8zOjQsYS5wdXNoKHMpO2xldCBjPTE7Zm9yKGk9MDtpPG4rMTtpKyspMT09PXM/YS5wdXNoKDI1NSZjKToyPT09cz9hLnB1c2goYz4+OCYyNTUsMjU1JmMpOjM9PT1zP2EucHVzaChjPj4xNiYyNTUsYz4+OCYyNTUsMjU1JmMpOmEucHVzaChjPj4+MjQmMjU1LGM+PjE2JjI1NSxjPj44JjI1NSwyNTUmYykscltpXSYmKGMrPXJbaV0ubGVuZ3RoKTtmb3IoaT0wO2k8bjtpKyspdFtpXSYmdFtpXS5vZmZzZXQoYS5sZW5ndGgpLGEucHVzaCguLi5yW2ldKTtyZXR1cm4gYX19dC5DRkZDb21waWxlcj1BfSwoZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LklTT0Fkb2JlQ2hhcnNldD10LkV4cGVydFN1YnNldENoYXJzZXQ9dC5FeHBlcnRDaGFyc2V0PXZvaWQgMCx0LklTT0Fkb2JlQ2hhcnNldD1bIi5ub3RkZWYiLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXJpZ2h0IiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrIiwicGx1cyIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJhdCIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiYnJhY2tldGxlZnQiLCJiYWNrc2xhc2giLCJicmFja2V0cmlnaHQiLCJhc2NpaWNpcmN1bSIsInVuZGVyc2NvcmUiLCJxdW90ZWxlZnQiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiZXhjbGFtZG93biIsImNlbnQiLCJzdGVybGluZyIsImZyYWN0aW9uIiwieWVuIiwiZmxvcmluIiwic2VjdGlvbiIsImN1cnJlbmN5IiwicXVvdGVzaW5nbGUiLCJxdW90ZWRibGxlZnQiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZmkiLCJmbCIsImVuZGFzaCIsImRhZ2dlciIsImRhZ2dlcmRibCIsInBlcmlvZGNlbnRlcmVkIiwicGFyYWdyYXBoIiwiYnVsbGV0IiwicXVvdGVzaW5nbGJhc2UiLCJxdW90ZWRibGJhc2UiLCJxdW90ZWRibHJpZ2h0IiwiZ3VpbGxlbW90cmlnaHQiLCJlbGxpcHNpcyIsInBlcnRob3VzYW5kIiwicXVlc3Rpb25kb3duIiwiZ3JhdmUiLCJhY3V0ZSIsImNpcmN1bWZsZXgiLCJ0aWxkZSIsIm1hY3JvbiIsImJyZXZlIiwiZG90YWNjZW50IiwiZGllcmVzaXMiLCJyaW5nIiwiY2VkaWxsYSIsImh1bmdhcnVtbGF1dCIsIm9nb25layIsImNhcm9uIiwiZW1kYXNoIiwiQUUiLCJvcmRmZW1pbmluZSIsIkxzbGFzaCIsIk9zbGFzaCIsIk9FIiwib3JkbWFzY3VsaW5lIiwiYWUiLCJkb3RsZXNzaSIsImxzbGFzaCIsIm9zbGFzaCIsIm9lIiwiZ2VybWFuZGJscyIsIm9uZXN1cGVyaW9yIiwibG9naWNhbG5vdCIsIm11IiwidHJhZGVtYXJrIiwiRXRoIiwib25laGFsZiIsInBsdXNtaW51cyIsIlRob3JuIiwib25lcXVhcnRlciIsImRpdmlkZSIsImJyb2tlbmJhciIsImRlZ3JlZSIsInRob3JuIiwidGhyZWVxdWFydGVycyIsInR3b3N1cGVyaW9yIiwicmVnaXN0ZXJlZCIsIm1pbnVzIiwiZXRoIiwibXVsdGlwbHkiLCJ0aHJlZXN1cGVyaW9yIiwiY29weXJpZ2h0IiwiQWFjdXRlIiwiQWNpcmN1bWZsZXgiLCJBZGllcmVzaXMiLCJBZ3JhdmUiLCJBcmluZyIsIkF0aWxkZSIsIkNjZWRpbGxhIiwiRWFjdXRlIiwiRWNpcmN1bWZsZXgiLCJFZGllcmVzaXMiLCJFZ3JhdmUiLCJJYWN1dGUiLCJJY2lyY3VtZmxleCIsIklkaWVyZXNpcyIsIklncmF2ZSIsIk50aWxkZSIsIk9hY3V0ZSIsIk9jaXJjdW1mbGV4IiwiT2RpZXJlc2lzIiwiT2dyYXZlIiwiT3RpbGRlIiwiU2Nhcm9uIiwiVWFjdXRlIiwiVWNpcmN1bWZsZXgiLCJVZGllcmVzaXMiLCJVZ3JhdmUiLCJZYWN1dGUiLCJZZGllcmVzaXMiLCJaY2Fyb24iLCJhYWN1dGUiLCJhY2lyY3VtZmxleCIsImFkaWVyZXNpcyIsImFncmF2ZSIsImFyaW5nIiwiYXRpbGRlIiwiY2NlZGlsbGEiLCJlYWN1dGUiLCJlY2lyY3VtZmxleCIsImVkaWVyZXNpcyIsImVncmF2ZSIsImlhY3V0ZSIsImljaXJjdW1mbGV4IiwiaWRpZXJlc2lzIiwiaWdyYXZlIiwibnRpbGRlIiwib2FjdXRlIiwib2NpcmN1bWZsZXgiLCJvZGllcmVzaXMiLCJvZ3JhdmUiLCJvdGlsZGUiLCJzY2Fyb24iLCJ1YWN1dGUiLCJ1Y2lyY3VtZmxleCIsInVkaWVyZXNpcyIsInVncmF2ZSIsInlhY3V0ZSIsInlkaWVyZXNpcyIsInpjYXJvbiJdLHQuRXhwZXJ0Q2hhcnNldD1bIi5ub3RkZWYiLCJzcGFjZSIsImV4Y2xhbXNtYWxsIiwiSHVuZ2FydW1sYXV0c21hbGwiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwiYW1wZXJzYW5kc21hbGwiLCJBY3V0ZXNtYWxsIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsInF1ZXN0aW9uc21hbGwiLCJhc3VwZXJpb3IiLCJic3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCJkc3VwZXJpb3IiLCJlc3VwZXJpb3IiLCJpc3VwZXJpb3IiLCJsc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJvc3VwZXJpb3IiLCJyc3VwZXJpb3IiLCJzc3VwZXJpb3IiLCJ0c3VwZXJpb3IiLCJmZiIsImZpIiwiZmwiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiZXhjbGFtZG93bnNtYWxsIiwiY2VudG9sZHN0eWxlIiwiTHNsYXNoc21hbGwiLCJTY2Fyb25zbWFsbCIsIlpjYXJvbnNtYWxsIiwiRGllcmVzaXNzbWFsbCIsIkJyZXZlc21hbGwiLCJDYXJvbnNtYWxsIiwiRG90YWNjZW50c21hbGwiLCJNYWNyb25zbWFsbCIsImZpZ3VyZWRhc2giLCJoeXBoZW5pbmZlcmlvciIsIk9nb25la3NtYWxsIiwiUmluZ3NtYWxsIiwiQ2VkaWxsYXNtYWxsIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiLCJBZ3JhdmVzbWFsbCIsIkFhY3V0ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkF0aWxkZXNtYWxsIiwiQWRpZXJlc2lzc21hbGwiLCJBcmluZ3NtYWxsIiwiQUVzbWFsbCIsIkNjZWRpbGxhc21hbGwiLCJFZ3JhdmVzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVkaWVyZXNpc3NtYWxsIiwiSWdyYXZlc21hbGwiLCJJYWN1dGVzbWFsbCIsIkljaXJjdW1mbGV4c21hbGwiLCJJZGllcmVzaXNzbWFsbCIsIkV0aHNtYWxsIiwiTnRpbGRlc21hbGwiLCJPZ3JhdmVzbWFsbCIsIk9hY3V0ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk90aWxkZXNtYWxsIiwiT2RpZXJlc2lzc21hbGwiLCJPRXNtYWxsIiwiT3NsYXNoc21hbGwiLCJVZ3JhdmVzbWFsbCIsIlVhY3V0ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiWWFjdXRlc21hbGwiLCJUaG9ybnNtYWxsIiwiWWRpZXJlc2lzc21hbGwiXSx0LkV4cGVydFN1YnNldENoYXJzZXQ9WyIubm90ZGVmIiwic3BhY2UiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsImFzdXBlcmlvciIsImJzdXBlcmlvciIsImNlbnRzdXBlcmlvciIsImRzdXBlcmlvciIsImVzdXBlcmlvciIsImlzdXBlcmlvciIsImxzdXBlcmlvciIsIm1zdXBlcmlvciIsIm5zdXBlcmlvciIsIm9zdXBlcmlvciIsInJzdXBlcmlvciIsInNzdXBlcmlvciIsInRzdXBlcmlvciIsImZmIiwiZmkiLCJmbCIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwicGFyZW5yaWdodGluZmVyaW9yIiwiaHlwaGVuc3VwZXJpb3IiLCJjb2xvbm1vbmV0YXJ5Iiwib25lZml0dGVkIiwicnVwaWFoIiwiY2VudG9sZHN0eWxlIiwiZmlndXJlZGFzaCIsImh5cGhlbmluZmVyaW9yIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwib25lZWlnaHRoIiwidGhyZWVlaWdodGhzIiwiZml2ZWVpZ2h0aHMiLCJzZXZlbmVpZ2h0aHMiLCJvbmV0aGlyZCIsInR3b3RoaXJkcyIsInplcm9zdXBlcmlvciIsIm9uZXN1cGVyaW9yIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwiZm91cnN1cGVyaW9yIiwiZml2ZXN1cGVyaW9yIiwic2l4c3VwZXJpb3IiLCJzZXZlbnN1cGVyaW9yIiwiZWlnaHRzdXBlcmlvciIsIm5pbmVzdXBlcmlvciIsInplcm9pbmZlcmlvciIsIm9uZWluZmVyaW9yIiwidHdvaW5mZXJpb3IiLCJ0aHJlZWluZmVyaW9yIiwiZm91cmluZmVyaW9yIiwiZml2ZWluZmVyaW9yIiwic2l4aW5mZXJpb3IiLCJzZXZlbmluZmVyaW9yIiwiZWlnaHRpbmZlcmlvciIsIm5pbmVpbmZlcmlvciIsImNlbnRpbmZlcmlvciIsImRvbGxhcmluZmVyaW9yIiwicGVyaW9kaW5mZXJpb3IiLCJjb21tYWluZmVyaW9yIl19LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWmFwZkRpbmdiYXRzRW5jb2Rpbmc9dC5XaW5BbnNpRW5jb2Rpbmc9dC5TeW1ib2xTZXRFbmNvZGluZz10LlN0YW5kYXJkRW5jb2Rpbmc9dC5NYWNSb21hbkVuY29kaW5nPXQuRXhwZXJ0RW5jb2Rpbmc9dm9pZCAwLHQuZ2V0RW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UiV2luQW5zaUVuY29kaW5nIjpyZXR1cm4gcztjYXNlIlN0YW5kYXJkRW5jb2RpbmciOnJldHVybiBpO2Nhc2UiTWFjUm9tYW5FbmNvZGluZyI6cmV0dXJuIGE7Y2FzZSJTeW1ib2xTZXRFbmNvZGluZyI6cmV0dXJuIG87Y2FzZSJaYXBmRGluZ2JhdHNFbmNvZGluZyI6cmV0dXJuIGM7Y2FzZSJFeHBlcnRFbmNvZGluZyI6cmV0dXJuIHI7Y2FzZSJNYWNFeHBlcnRFbmNvZGluZyI6cmV0dXJuIG47ZGVmYXVsdDpyZXR1cm4gbnVsbH19O2NvbnN0IHI9WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbXNtYWxsIiwiSHVuZ2FydW1sYXV0c21hbGwiLCIiLCJkb2xsYXJvbGRzdHlsZSIsImRvbGxhcnN1cGVyaW9yIiwiYW1wZXJzYW5kc21hbGwiLCJBY3V0ZXNtYWxsIiwicGFyZW5sZWZ0c3VwZXJpb3IiLCJwYXJlbnJpZ2h0c3VwZXJpb3IiLCJ0d29kb3RlbmxlYWRlciIsIm9uZWRvdGVubGVhZGVyIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJmcmFjdGlvbiIsInplcm9vbGRzdHlsZSIsIm9uZW9sZHN0eWxlIiwidHdvb2xkc3R5bGUiLCJ0aHJlZW9sZHN0eWxlIiwiZm91cm9sZHN0eWxlIiwiZml2ZW9sZHN0eWxlIiwic2l4b2xkc3R5bGUiLCJzZXZlbm9sZHN0eWxlIiwiZWlnaHRvbGRzdHlsZSIsIm5pbmVvbGRzdHlsZSIsImNvbG9uIiwic2VtaWNvbG9uIiwiY29tbWFzdXBlcmlvciIsInRocmVlcXVhcnRlcnNlbWRhc2giLCJwZXJpb2RzdXBlcmlvciIsInF1ZXN0aW9uc21hbGwiLCIiLCJhc3VwZXJpb3IiLCJic3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCJkc3VwZXJpb3IiLCJlc3VwZXJpb3IiLCIiLCIiLCIiLCJpc3VwZXJpb3IiLCIiLCIiLCJsc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJvc3VwZXJpb3IiLCIiLCIiLCJyc3VwZXJpb3IiLCJzc3VwZXJpb3IiLCJ0c3VwZXJpb3IiLCIiLCJmZiIsImZpIiwiZmwiLCJmZmkiLCJmZmwiLCJwYXJlbmxlZnRpbmZlcmlvciIsIiIsInBhcmVucmlnaHRpbmZlcmlvciIsIkNpcmN1bWZsZXhzbWFsbCIsImh5cGhlbnN1cGVyaW9yIiwiR3JhdmVzbWFsbCIsIkFzbWFsbCIsIkJzbWFsbCIsIkNzbWFsbCIsIkRzbWFsbCIsIkVzbWFsbCIsIkZzbWFsbCIsIkdzbWFsbCIsIkhzbWFsbCIsIklzbWFsbCIsIkpzbWFsbCIsIktzbWFsbCIsIkxzbWFsbCIsIk1zbWFsbCIsIk5zbWFsbCIsIk9zbWFsbCIsIlBzbWFsbCIsIlFzbWFsbCIsIlJzbWFsbCIsIlNzbWFsbCIsIlRzbWFsbCIsIlVzbWFsbCIsIlZzbWFsbCIsIldzbWFsbCIsIlhzbWFsbCIsIllzbWFsbCIsIlpzbWFsbCIsImNvbG9ubW9uZXRhcnkiLCJvbmVmaXR0ZWQiLCJydXBpYWgiLCJUaWxkZXNtYWxsIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiZXhjbGFtZG93bnNtYWxsIiwiY2VudG9sZHN0eWxlIiwiTHNsYXNoc21hbGwiLCIiLCIiLCJTY2Fyb25zbWFsbCIsIlpjYXJvbnNtYWxsIiwiRGllcmVzaXNzbWFsbCIsIkJyZXZlc21hbGwiLCJDYXJvbnNtYWxsIiwiIiwiRG90YWNjZW50c21hbGwiLCIiLCIiLCJNYWNyb25zbWFsbCIsIiIsIiIsImZpZ3VyZWRhc2giLCJoeXBoZW5pbmZlcmlvciIsIiIsIiIsIk9nb25la3NtYWxsIiwiUmluZ3NtYWxsIiwiQ2VkaWxsYXNtYWxsIiwiIiwiIiwiIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwicXVlc3Rpb25kb3duc21hbGwiLCJvbmVlaWdodGgiLCJ0aHJlZWVpZ2h0aHMiLCJmaXZlZWlnaHRocyIsInNldmVuZWlnaHRocyIsIm9uZXRoaXJkIiwidHdvdGhpcmRzIiwiIiwiIiwiemVyb3N1cGVyaW9yIiwib25lc3VwZXJpb3IiLCJ0d29zdXBlcmlvciIsInRocmVlc3VwZXJpb3IiLCJmb3Vyc3VwZXJpb3IiLCJmaXZlc3VwZXJpb3IiLCJzaXhzdXBlcmlvciIsInNldmVuc3VwZXJpb3IiLCJlaWdodHN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb2luZmVyaW9yIiwib25laW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJmb3VyaW5mZXJpb3IiLCJmaXZlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsInNldmVuaW5mZXJpb3IiLCJlaWdodGluZmVyaW9yIiwibmluZWluZmVyaW9yIiwiY2VudGluZmVyaW9yIiwiZG9sbGFyaW5mZXJpb3IiLCJwZXJpb2RpbmZlcmlvciIsImNvbW1haW5mZXJpb3IiLCJBZ3JhdmVzbWFsbCIsIkFhY3V0ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkF0aWxkZXNtYWxsIiwiQWRpZXJlc2lzc21hbGwiLCJBcmluZ3NtYWxsIiwiQUVzbWFsbCIsIkNjZWRpbGxhc21hbGwiLCJFZ3JhdmVzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWNpcmN1bWZsZXhzbWFsbCIsIkVkaWVyZXNpc3NtYWxsIiwiSWdyYXZlc21hbGwiLCJJYWN1dGVzbWFsbCIsIkljaXJjdW1mbGV4c21hbGwiLCJJZGllcmVzaXNzbWFsbCIsIkV0aHNtYWxsIiwiTnRpbGRlc21hbGwiLCJPZ3JhdmVzbWFsbCIsIk9hY3V0ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk90aWxkZXNtYWxsIiwiT2RpZXJlc2lzc21hbGwiLCJPRXNtYWxsIiwiT3NsYXNoc21hbGwiLCJVZ3JhdmVzbWFsbCIsIlVhY3V0ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiWWFjdXRlc21hbGwiLCJUaG9ybnNtYWxsIiwiWWRpZXJlc2lzc21hbGwiXTt0LkV4cGVydEVuY29kaW5nPXI7Y29uc3Qgbj1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiZXhjbGFtc21hbGwiLCJIdW5nYXJ1bWxhdXRzbWFsbCIsImNlbnRvbGRzdHlsZSIsImRvbGxhcm9sZHN0eWxlIiwiZG9sbGFyc3VwZXJpb3IiLCJhbXBlcnNhbmRzbWFsbCIsIkFjdXRlc21hbGwiLCJwYXJlbmxlZnRzdXBlcmlvciIsInBhcmVucmlnaHRzdXBlcmlvciIsInR3b2RvdGVubGVhZGVyIiwib25lZG90ZW5sZWFkZXIiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsImZyYWN0aW9uIiwiemVyb29sZHN0eWxlIiwib25lb2xkc3R5bGUiLCJ0d29vbGRzdHlsZSIsInRocmVlb2xkc3R5bGUiLCJmb3Vyb2xkc3R5bGUiLCJmaXZlb2xkc3R5bGUiLCJzaXhvbGRzdHlsZSIsInNldmVub2xkc3R5bGUiLCJlaWdodG9sZHN0eWxlIiwibmluZW9sZHN0eWxlIiwiY29sb24iLCJzZW1pY29sb24iLCIiLCJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwiIiwicXVlc3Rpb25zbWFsbCIsIiIsIiIsIiIsIiIsIkV0aHNtYWxsIiwiIiwiIiwib25lcXVhcnRlciIsIm9uZWhhbGYiLCJ0aHJlZXF1YXJ0ZXJzIiwib25lZWlnaHRoIiwidGhyZWVlaWdodGhzIiwiZml2ZWVpZ2h0aHMiLCJzZXZlbmVpZ2h0aHMiLCJvbmV0aGlyZCIsInR3b3RoaXJkcyIsIiIsIiIsIiIsIiIsIiIsIiIsImZmIiwiZmkiLCJmbCIsImZmaSIsImZmbCIsInBhcmVubGVmdGluZmVyaW9yIiwiIiwicGFyZW5yaWdodGluZmVyaW9yIiwiQ2lyY3VtZmxleHNtYWxsIiwiaHlwaGVuaW5mZXJpb3IiLCJHcmF2ZXNtYWxsIiwiQXNtYWxsIiwiQnNtYWxsIiwiQ3NtYWxsIiwiRHNtYWxsIiwiRXNtYWxsIiwiRnNtYWxsIiwiR3NtYWxsIiwiSHNtYWxsIiwiSXNtYWxsIiwiSnNtYWxsIiwiS3NtYWxsIiwiTHNtYWxsIiwiTXNtYWxsIiwiTnNtYWxsIiwiT3NtYWxsIiwiUHNtYWxsIiwiUXNtYWxsIiwiUnNtYWxsIiwiU3NtYWxsIiwiVHNtYWxsIiwiVXNtYWxsIiwiVnNtYWxsIiwiV3NtYWxsIiwiWHNtYWxsIiwiWXNtYWxsIiwiWnNtYWxsIiwiY29sb25tb25ldGFyeSIsIm9uZWZpdHRlZCIsInJ1cGlhaCIsIlRpbGRlc21hbGwiLCIiLCIiLCJhc3VwZXJpb3IiLCJjZW50c3VwZXJpb3IiLCIiLCIiLCIiLCIiLCJBYWN1dGVzbWFsbCIsIkFncmF2ZXNtYWxsIiwiQWNpcmN1bWZsZXhzbWFsbCIsIkFkaWVyZXNpc3NtYWxsIiwiQXRpbGRlc21hbGwiLCJBcmluZ3NtYWxsIiwiQ2NlZGlsbGFzbWFsbCIsIkVhY3V0ZXNtYWxsIiwiRWdyYXZlc21hbGwiLCJFY2lyY3VtZmxleHNtYWxsIiwiRWRpZXJlc2lzc21hbGwiLCJJYWN1dGVzbWFsbCIsIklncmF2ZXNtYWxsIiwiSWNpcmN1bWZsZXhzbWFsbCIsIklkaWVyZXNpc3NtYWxsIiwiTnRpbGRlc21hbGwiLCJPYWN1dGVzbWFsbCIsIk9ncmF2ZXNtYWxsIiwiT2NpcmN1bWZsZXhzbWFsbCIsIk9kaWVyZXNpc3NtYWxsIiwiT3RpbGRlc21hbGwiLCJVYWN1dGVzbWFsbCIsIlVncmF2ZXNtYWxsIiwiVWNpcmN1bWZsZXhzbWFsbCIsIlVkaWVyZXNpc3NtYWxsIiwiIiwiZWlnaHRzdXBlcmlvciIsImZvdXJpbmZlcmlvciIsInRocmVlaW5mZXJpb3IiLCJzaXhpbmZlcmlvciIsImVpZ2h0aW5mZXJpb3IiLCJzZXZlbmluZmVyaW9yIiwiU2Nhcm9uc21hbGwiLCIiLCJjZW50aW5mZXJpb3IiLCJ0d29pbmZlcmlvciIsIiIsIkRpZXJlc2lzc21hbGwiLCIiLCJDYXJvbnNtYWxsIiwib3N1cGVyaW9yIiwiZml2ZWluZmVyaW9yIiwiIiwiY29tbWFpbmZlcmlvciIsInBlcmlvZGluZmVyaW9yIiwiWWFjdXRlc21hbGwiLCIiLCJkb2xsYXJpbmZlcmlvciIsIiIsIiIsIlRob3Juc21hbGwiLCIiLCJuaW5laW5mZXJpb3IiLCJ6ZXJvaW5mZXJpb3IiLCJaY2Fyb25zbWFsbCIsIkFFc21hbGwiLCJPc2xhc2hzbWFsbCIsInF1ZXN0aW9uZG93bnNtYWxsIiwib25laW5mZXJpb3IiLCJMc2xhc2hzbWFsbCIsIiIsIiIsIiIsIiIsIiIsIiIsIkNlZGlsbGFzbWFsbCIsIiIsIiIsIiIsIiIsIiIsIk9Fc21hbGwiLCJmaWd1cmVkYXNoIiwiaHlwaGVuc3VwZXJpb3IiLCIiLCIiLCIiLCIiLCJleGNsYW1kb3duc21hbGwiLCIiLCJZZGllcmVzaXNzbWFsbCIsIiIsIm9uZXN1cGVyaW9yIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwiZm91cnN1cGVyaW9yIiwiZml2ZXN1cGVyaW9yIiwic2l4c3VwZXJpb3IiLCJzZXZlbnN1cGVyaW9yIiwibmluZXN1cGVyaW9yIiwiemVyb3N1cGVyaW9yIiwiIiwiZXN1cGVyaW9yIiwicnN1cGVyaW9yIiwidHN1cGVyaW9yIiwiIiwiIiwiaXN1cGVyaW9yIiwic3N1cGVyaW9yIiwiZHN1cGVyaW9yIiwiIiwiIiwiIiwiIiwiIiwibHN1cGVyaW9yIiwiT2dvbmVrc21hbGwiLCJCcmV2ZXNtYWxsIiwiTWFjcm9uc21hbGwiLCJic3VwZXJpb3IiLCJuc3VwZXJpb3IiLCJtc3VwZXJpb3IiLCJjb21tYXN1cGVyaW9yIiwicGVyaW9kc3VwZXJpb3IiLCJEb3RhY2NlbnRzbWFsbCIsIlJpbmdzbWFsbCIsIiIsIiIsIiIsIiJdLGE9WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbSIsInF1b3RlZGJsIiwibnVtYmVyc2lnbiIsImRvbGxhciIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJxdW90ZXNpbmdsZSIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwiZ3JhdmUiLCJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLCJwIiwicSIsInIiLCJzIiwidCIsInUiLCJ2IiwidyIsIngiLCJ5IiwieiIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJhc2NpaXRpbGRlIiwiIiwiQWRpZXJlc2lzIiwiQXJpbmciLCJDY2VkaWxsYSIsIkVhY3V0ZSIsIk50aWxkZSIsIk9kaWVyZXNpcyIsIlVkaWVyZXNpcyIsImFhY3V0ZSIsImFncmF2ZSIsImFjaXJjdW1mbGV4IiwiYWRpZXJlc2lzIiwiYXRpbGRlIiwiYXJpbmciLCJjY2VkaWxsYSIsImVhY3V0ZSIsImVncmF2ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiaWFjdXRlIiwiaWdyYXZlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJudGlsZGUiLCJvYWN1dGUiLCJvZ3JhdmUiLCJvY2lyY3VtZmxleCIsIm9kaWVyZXNpcyIsIm90aWxkZSIsInVhY3V0ZSIsInVncmF2ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwiZGFnZ2VyIiwiZGVncmVlIiwiY2VudCIsInN0ZXJsaW5nIiwic2VjdGlvbiIsImJ1bGxldCIsInBhcmFncmFwaCIsImdlcm1hbmRibHMiLCJyZWdpc3RlcmVkIiwiY29weXJpZ2h0IiwidHJhZGVtYXJrIiwiYWN1dGUiLCJkaWVyZXNpcyIsIm5vdGVxdWFsIiwiQUUiLCJPc2xhc2giLCJpbmZpbml0eSIsInBsdXNtaW51cyIsImxlc3NlcXVhbCIsImdyZWF0ZXJlcXVhbCIsInllbiIsIm11IiwicGFydGlhbGRpZmYiLCJzdW1tYXRpb24iLCJwcm9kdWN0IiwicGkiLCJpbnRlZ3JhbCIsIm9yZGZlbWluaW5lIiwib3JkbWFzY3VsaW5lIiwiT21lZ2EiLCJhZSIsIm9zbGFzaCIsInF1ZXN0aW9uZG93biIsImV4Y2xhbWRvd24iLCJsb2dpY2Fsbm90IiwicmFkaWNhbCIsImZsb3JpbiIsImFwcHJveGVxdWFsIiwiRGVsdGEiLCJndWlsbGVtb3RsZWZ0IiwiZ3VpbGxlbW90cmlnaHQiLCJlbGxpcHNpcyIsInNwYWNlIiwiQWdyYXZlIiwiQXRpbGRlIiwiT3RpbGRlIiwiT0UiLCJvZSIsImVuZGFzaCIsImVtZGFzaCIsInF1b3RlZGJsbGVmdCIsInF1b3RlZGJscmlnaHQiLCJxdW90ZWxlZnQiLCJxdW90ZXJpZ2h0IiwiZGl2aWRlIiwibG96ZW5nZSIsInlkaWVyZXNpcyIsIllkaWVyZXNpcyIsImZyYWN0aW9uIiwiY3VycmVuY3kiLCJndWlsc2luZ2xsZWZ0IiwiZ3VpbHNpbmdscmlnaHQiLCJmaSIsImZsIiwiZGFnZ2VyZGJsIiwicGVyaW9kY2VudGVyZWQiLCJxdW90ZXNpbmdsYmFzZSIsInF1b3RlZGJsYmFzZSIsInBlcnRob3VzYW5kIiwiQWNpcmN1bWZsZXgiLCJFY2lyY3VtZmxleCIsIkFhY3V0ZSIsIkVkaWVyZXNpcyIsIkVncmF2ZSIsIklhY3V0ZSIsIkljaXJjdW1mbGV4IiwiSWRpZXJlc2lzIiwiSWdyYXZlIiwiT2FjdXRlIiwiT2NpcmN1bWZsZXgiLCJhcHBsZSIsIk9ncmF2ZSIsIlVhY3V0ZSIsIlVjaXJjdW1mbGV4IiwiVWdyYXZlIiwiZG90bGVzc2kiLCJjaXJjdW1mbGV4IiwidGlsZGUiLCJtYWNyb24iLCJicmV2ZSIsImRvdGFjY2VudCIsInJpbmciLCJjZWRpbGxhIiwiaHVuZ2FydW1sYXV0Iiwib2dvbmVrIiwiY2Fyb24iXTt0Lk1hY1JvbWFuRW5jb2Rpbmc9YTtjb25zdCBpPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVyaWdodCIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3RlcmlzayIsInBsdXMiLCJjb21tYSIsImh5cGhlbiIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiYXQiLCJBIiwiQiIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSCIsIkkiLCJKIiwiSyIsIkwiLCJNIiwiTiIsIk8iLCJQIiwiUSIsIlIiLCJTIiwiVCIsIlUiLCJWIiwiVyIsIlgiLCJZIiwiWiIsImJyYWNrZXRsZWZ0IiwiYmFja3NsYXNoIiwiYnJhY2tldHJpZ2h0IiwiYXNjaWljaXJjdW0iLCJ1bmRlcnNjb3JlIiwicXVvdGVsZWZ0IiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsImV4Y2xhbWRvd24iLCJjZW50Iiwic3RlcmxpbmciLCJmcmFjdGlvbiIsInllbiIsImZsb3JpbiIsInNlY3Rpb24iLCJjdXJyZW5jeSIsInF1b3Rlc2luZ2xlIiwicXVvdGVkYmxsZWZ0IiwiZ3VpbGxlbW90bGVmdCIsImd1aWxzaW5nbGxlZnQiLCJndWlsc2luZ2xyaWdodCIsImZpIiwiZmwiLCIiLCJlbmRhc2giLCJkYWdnZXIiLCJkYWdnZXJkYmwiLCJwZXJpb2RjZW50ZXJlZCIsIiIsInBhcmFncmFwaCIsImJ1bGxldCIsInF1b3Rlc2luZ2xiYXNlIiwicXVvdGVkYmxiYXNlIiwicXVvdGVkYmxyaWdodCIsImd1aWxsZW1vdHJpZ2h0IiwiZWxsaXBzaXMiLCJwZXJ0aG91c2FuZCIsIiIsInF1ZXN0aW9uZG93biIsIiIsImdyYXZlIiwiYWN1dGUiLCJjaXJjdW1mbGV4IiwidGlsZGUiLCJtYWNyb24iLCJicmV2ZSIsImRvdGFjY2VudCIsImRpZXJlc2lzIiwiIiwicmluZyIsImNlZGlsbGEiLCIiLCJodW5nYXJ1bWxhdXQiLCJvZ29uZWsiLCJjYXJvbiIsImVtZGFzaCIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIkFFIiwiIiwib3JkZmVtaW5pbmUiLCIiLCIiLCIiLCIiLCJMc2xhc2giLCJPc2xhc2giLCJPRSIsIm9yZG1hc2N1bGluZSIsIiIsIiIsIiIsIiIsIiIsImFlIiwiIiwiIiwiIiwiZG90bGVzc2kiLCIiLCIiLCJsc2xhc2giLCJvc2xhc2giLCJvZSIsImdlcm1hbmRibHMiLCIiLCIiLCIiLCIiXTt0LlN0YW5kYXJkRW5jb2Rpbmc9aTtjb25zdCBzPVsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwic3BhY2UiLCJleGNsYW0iLCJxdW90ZWRibCIsIm51bWJlcnNpZ24iLCJkb2xsYXIiLCJwZXJjZW50IiwiYW1wZXJzYW5kIiwicXVvdGVzaW5nbGUiLCJwYXJlbmxlZnQiLCJwYXJlbnJpZ2h0IiwiYXN0ZXJpc2siLCJwbHVzIiwiY29tbWEiLCJoeXBoZW4iLCJwZXJpb2QiLCJzbGFzaCIsInplcm8iLCJvbmUiLCJ0d28iLCJ0aHJlZSIsImZvdXIiLCJmaXZlIiwic2l4Iiwic2V2ZW4iLCJlaWdodCIsIm5pbmUiLCJjb2xvbiIsInNlbWljb2xvbiIsImxlc3MiLCJlcXVhbCIsImdyZWF0ZXIiLCJxdWVzdGlvbiIsImF0IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCJicmFja2V0bGVmdCIsImJhY2tzbGFzaCIsImJyYWNrZXRyaWdodCIsImFzY2lpY2lyY3VtIiwidW5kZXJzY29yZSIsImdyYXZlIiwiYSIsImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsImgiLCJpIiwiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwicCIsInEiLCJyIiwicyIsInQiLCJ1IiwidiIsInciLCJ4IiwieSIsInoiLCJicmFjZWxlZnQiLCJiYXIiLCJicmFjZXJpZ2h0IiwiYXNjaWl0aWxkZSIsImJ1bGxldCIsIkV1cm8iLCJidWxsZXQiLCJxdW90ZXNpbmdsYmFzZSIsImZsb3JpbiIsInF1b3RlZGJsYmFzZSIsImVsbGlwc2lzIiwiZGFnZ2VyIiwiZGFnZ2VyZGJsIiwiY2lyY3VtZmxleCIsInBlcnRob3VzYW5kIiwiU2Nhcm9uIiwiZ3VpbHNpbmdsbGVmdCIsIk9FIiwiYnVsbGV0IiwiWmNhcm9uIiwiYnVsbGV0IiwiYnVsbGV0IiwicXVvdGVsZWZ0IiwicXVvdGVyaWdodCIsInF1b3RlZGJsbGVmdCIsInF1b3RlZGJscmlnaHQiLCJidWxsZXQiLCJlbmRhc2giLCJlbWRhc2giLCJ0aWxkZSIsInRyYWRlbWFyayIsInNjYXJvbiIsImd1aWxzaW5nbHJpZ2h0Iiwib2UiLCJidWxsZXQiLCJ6Y2Fyb24iLCJZZGllcmVzaXMiLCJzcGFjZSIsImV4Y2xhbWRvd24iLCJjZW50Iiwic3RlcmxpbmciLCJjdXJyZW5jeSIsInllbiIsImJyb2tlbmJhciIsInNlY3Rpb24iLCJkaWVyZXNpcyIsImNvcHlyaWdodCIsIm9yZGZlbWluaW5lIiwiZ3VpbGxlbW90bGVmdCIsImxvZ2ljYWxub3QiLCJoeXBoZW4iLCJyZWdpc3RlcmVkIiwibWFjcm9uIiwiZGVncmVlIiwicGx1c21pbnVzIiwidHdvc3VwZXJpb3IiLCJ0aHJlZXN1cGVyaW9yIiwiYWN1dGUiLCJtdSIsInBhcmFncmFwaCIsInBlcmlvZGNlbnRlcmVkIiwiY2VkaWxsYSIsIm9uZXN1cGVyaW9yIiwib3JkbWFzY3VsaW5lIiwiZ3VpbGxlbW90cmlnaHQiLCJvbmVxdWFydGVyIiwib25laGFsZiIsInRocmVlcXVhcnRlcnMiLCJxdWVzdGlvbmRvd24iLCJBZ3JhdmUiLCJBYWN1dGUiLCJBY2lyY3VtZmxleCIsIkF0aWxkZSIsIkFkaWVyZXNpcyIsIkFyaW5nIiwiQUUiLCJDY2VkaWxsYSIsIkVncmF2ZSIsIkVhY3V0ZSIsIkVjaXJjdW1mbGV4IiwiRWRpZXJlc2lzIiwiSWdyYXZlIiwiSWFjdXRlIiwiSWNpcmN1bWZsZXgiLCJJZGllcmVzaXMiLCJFdGgiLCJOdGlsZGUiLCJPZ3JhdmUiLCJPYWN1dGUiLCJPY2lyY3VtZmxleCIsIk90aWxkZSIsIk9kaWVyZXNpcyIsIm11bHRpcGx5IiwiT3NsYXNoIiwiVWdyYXZlIiwiVWFjdXRlIiwiVWNpcmN1bWZsZXgiLCJVZGllcmVzaXMiLCJZYWN1dGUiLCJUaG9ybiIsImdlcm1hbmRibHMiLCJhZ3JhdmUiLCJhYWN1dGUiLCJhY2lyY3VtZmxleCIsImF0aWxkZSIsImFkaWVyZXNpcyIsImFyaW5nIiwiYWUiLCJjY2VkaWxsYSIsImVncmF2ZSIsImVhY3V0ZSIsImVjaXJjdW1mbGV4IiwiZWRpZXJlc2lzIiwiaWdyYXZlIiwiaWFjdXRlIiwiaWNpcmN1bWZsZXgiLCJpZGllcmVzaXMiLCJldGgiLCJudGlsZGUiLCJvZ3JhdmUiLCJvYWN1dGUiLCJvY2lyY3VtZmxleCIsIm90aWxkZSIsIm9kaWVyZXNpcyIsImRpdmlkZSIsIm9zbGFzaCIsInVncmF2ZSIsInVhY3V0ZSIsInVjaXJjdW1mbGV4IiwidWRpZXJlc2lzIiwieWFjdXRlIiwidGhvcm4iLCJ5ZGllcmVzaXMiXTt0LldpbkFuc2lFbmNvZGluZz1zO2NvbnN0IG89WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJzcGFjZSIsImV4Y2xhbSIsInVuaXZlcnNhbCIsIm51bWJlcnNpZ24iLCJleGlzdGVudGlhbCIsInBlcmNlbnQiLCJhbXBlcnNhbmQiLCJzdWNodGhhdCIsInBhcmVubGVmdCIsInBhcmVucmlnaHQiLCJhc3Rlcmlza21hdGgiLCJwbHVzIiwiY29tbWEiLCJtaW51cyIsInBlcmlvZCIsInNsYXNoIiwiemVybyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsImNvbG9uIiwic2VtaWNvbG9uIiwibGVzcyIsImVxdWFsIiwiZ3JlYXRlciIsInF1ZXN0aW9uIiwiY29uZ3J1ZW50IiwiQWxwaGEiLCJCZXRhIiwiQ2hpIiwiRGVsdGEiLCJFcHNpbG9uIiwiUGhpIiwiR2FtbWEiLCJFdGEiLCJJb3RhIiwidGhldGExIiwiS2FwcGEiLCJMYW1iZGEiLCJNdSIsIk51IiwiT21pY3JvbiIsIlBpIiwiVGhldGEiLCJSaG8iLCJTaWdtYSIsIlRhdSIsIlVwc2lsb24iLCJzaWdtYTEiLCJPbWVnYSIsIlhpIiwiUHNpIiwiWmV0YSIsImJyYWNrZXRsZWZ0IiwidGhlcmVmb3JlIiwiYnJhY2tldHJpZ2h0IiwicGVycGVuZGljdWxhciIsInVuZGVyc2NvcmUiLCJyYWRpY2FsZXgiLCJhbHBoYSIsImJldGEiLCJjaGkiLCJkZWx0YSIsImVwc2lsb24iLCJwaGkiLCJnYW1tYSIsImV0YSIsImlvdGEiLCJwaGkxIiwia2FwcGEiLCJsYW1iZGEiLCJtdSIsIm51Iiwib21pY3JvbiIsInBpIiwidGhldGEiLCJyaG8iLCJzaWdtYSIsInRhdSIsInVwc2lsb24iLCJvbWVnYTEiLCJvbWVnYSIsInhpIiwicHNpIiwiemV0YSIsImJyYWNlbGVmdCIsImJhciIsImJyYWNlcmlnaHQiLCJzaW1pbGFyIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiRXVybyIsIlVwc2lsb24xIiwibWludXRlIiwibGVzc2VxdWFsIiwiZnJhY3Rpb24iLCJpbmZpbml0eSIsImZsb3JpbiIsImNsdWIiLCJkaWFtb25kIiwiaGVhcnQiLCJzcGFkZSIsImFycm93Ym90aCIsImFycm93bGVmdCIsImFycm93dXAiLCJhcnJvd3JpZ2h0IiwiYXJyb3dkb3duIiwiZGVncmVlIiwicGx1c21pbnVzIiwic2Vjb25kIiwiZ3JlYXRlcmVxdWFsIiwibXVsdGlwbHkiLCJwcm9wb3J0aW9uYWwiLCJwYXJ0aWFsZGlmZiIsImJ1bGxldCIsImRpdmlkZSIsIm5vdGVxdWFsIiwiZXF1aXZhbGVuY2UiLCJhcHByb3hlcXVhbCIsImVsbGlwc2lzIiwiYXJyb3d2ZXJ0ZXgiLCJhcnJvd2hvcml6ZXgiLCJjYXJyaWFnZXJldHVybiIsImFsZXBoIiwiSWZyYWt0dXIiLCJSZnJha3R1ciIsIndlaWVyc3RyYXNzIiwiY2lyY2xlbXVsdGlwbHkiLCJjaXJjbGVwbHVzIiwiZW1wdHlzZXQiLCJpbnRlcnNlY3Rpb24iLCJ1bmlvbiIsInByb3BlcnN1cGVyc2V0IiwicmVmbGV4c3VwZXJzZXQiLCJub3RzdWJzZXQiLCJwcm9wZXJzdWJzZXQiLCJyZWZsZXhzdWJzZXQiLCJlbGVtZW50Iiwibm90ZWxlbWVudCIsImFuZ2xlIiwiZ3JhZGllbnQiLCJyZWdpc3RlcnNlcmlmIiwiY29weXJpZ2h0c2VyaWYiLCJ0cmFkZW1hcmtzZXJpZiIsInByb2R1Y3QiLCJyYWRpY2FsIiwiZG90bWF0aCIsImxvZ2ljYWxub3QiLCJsb2dpY2FsYW5kIiwibG9naWNhbG9yIiwiYXJyb3dkYmxib3RoIiwiYXJyb3dkYmxsZWZ0IiwiYXJyb3dkYmx1cCIsImFycm93ZGJscmlnaHQiLCJhcnJvd2RibGRvd24iLCJsb3plbmdlIiwiYW5nbGVsZWZ0IiwicmVnaXN0ZXJzYW5zIiwiY29weXJpZ2h0c2FucyIsInRyYWRlbWFya3NhbnMiLCJzdW1tYXRpb24iLCJwYXJlbmxlZnR0cCIsInBhcmVubGVmdGV4IiwicGFyZW5sZWZ0YnQiLCJicmFja2V0bGVmdHRwIiwiYnJhY2tldGxlZnRleCIsImJyYWNrZXRsZWZ0YnQiLCJicmFjZWxlZnR0cCIsImJyYWNlbGVmdG1pZCIsImJyYWNlbGVmdGJ0IiwiYnJhY2VleCIsIiIsImFuZ2xlcmlnaHQiLCJpbnRlZ3JhbCIsImludGVncmFsdHAiLCJpbnRlZ3JhbGV4IiwiaW50ZWdyYWxidCIsInBhcmVucmlnaHR0cCIsInBhcmVucmlnaHRleCIsInBhcmVucmlnaHRidCIsImJyYWNrZXRyaWdodHRwIiwiYnJhY2tldHJpZ2h0ZXgiLCJicmFja2V0cmlnaHRidCIsImJyYWNlcmlnaHR0cCIsImJyYWNlcmlnaHRtaWQiLCJicmFjZXJpZ2h0YnQiLCIiXTt0LlN5bWJvbFNldEVuY29kaW5nPW87Y29uc3QgYz1bIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsInNwYWNlIiwiYTEiLCJhMiIsImEyMDIiLCJhMyIsImE0IiwiYTUiLCJhMTE5IiwiYTExOCIsImExMTciLCJhMTEiLCJhMTIiLCJhMTMiLCJhMTQiLCJhMTUiLCJhMTYiLCJhMTA1IiwiYTE3IiwiYTE4IiwiYTE5IiwiYTIwIiwiYTIxIiwiYTIyIiwiYTIzIiwiYTI0IiwiYTI1IiwiYTI2IiwiYTI3IiwiYTI4IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJhMTAiLCJhMjkiLCJhMzAiLCJhMzEiLCJhMzIiLCJhMzMiLCJhMzQiLCJhMzUiLCJhMzYiLCJhMzciLCJhMzgiLCJhMzkiLCJhNDAiLCJhNDEiLCJhNDIiLCJhNDMiLCJhNDQiLCJhNDUiLCJhNDYiLCJhNDciLCJhNDgiLCJhNDkiLCJhNTAiLCJhNTEiLCJhNTIiLCJhNTMiLCJhNTQiLCJhNTUiLCJhNTYiLCJhNTciLCJhNTgiLCJhNTkiLCJhNjAiLCJhNjEiLCJhNjIiLCJhNjMiLCJhNjQiLCJhNjUiLCJhNjYiLCJhNjciLCJhNjgiLCJhNjkiLCJhNzAiLCJhNzEiLCJhNzIiLCJhNzMiLCJhNzQiLCJhMjAzIiwiYTc1IiwiYTIwNCIsImE3NiIsImE3NyIsImE3OCIsImE3OSIsImE4MSIsImE4MiIsImE4MyIsImE4NCIsImE5NyIsImE5OCIsImE5OSIsImExMDAiLCIiLCJhODkiLCJhOTAiLCJhOTMiLCJhOTQiLCJhOTEiLCJhOTIiLCJhMjA1IiwiYTg1IiwiYTIwNiIsImE4NiIsImE4NyIsImE4OCIsImE5NSIsImE5NiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsImExMDEiLCJhMTAyIiwiYTEwMyIsImExMDQiLCJhMTA2IiwiYTEwNyIsImExMDgiLCJhMTEyIiwiYTExMSIsImExMTAiLCJhMTA5IiwiYTEyMCIsImExMjEiLCJhMTIyIiwiYTEyMyIsImExMjQiLCJhMTI1IiwiYTEyNiIsImExMjciLCJhMTI4IiwiYTEyOSIsImExMzAiLCJhMTMxIiwiYTEzMiIsImExMzMiLCJhMTM0IiwiYTEzNSIsImExMzYiLCJhMTM3IiwiYTEzOCIsImExMzkiLCJhMTQwIiwiYTE0MSIsImExNDIiLCJhMTQzIiwiYTE0NCIsImExNDUiLCJhMTQ2IiwiYTE0NyIsImExNDgiLCJhMTQ5IiwiYTE1MCIsImExNTEiLCJhMTUyIiwiYTE1MyIsImExNTQiLCJhMTU1IiwiYTE1NiIsImExNTciLCJhMTU4IiwiYTE1OSIsImExNjAiLCJhMTYxIiwiYTE2MyIsImExNjQiLCJhMTk2IiwiYTE2NSIsImExOTIiLCJhMTY2IiwiYTE2NyIsImExNjgiLCJhMTY5IiwiYTE3MCIsImExNzEiLCJhMTcyIiwiYTE3MyIsImExNjIiLCJhMTc0IiwiYTE3NSIsImExNzYiLCJhMTc3IiwiYTE3OCIsImExNzkiLCJhMTkzIiwiYTE4MCIsImExOTkiLCJhMTgxIiwiYTIwMCIsImExODIiLCIiLCJhMjAxIiwiYTE4MyIsImExODQiLCJhMTk3IiwiYTE4NSIsImExOTQiLCJhMTk4IiwiYTE4NiIsImExOTUiLCJhMTg3IiwiYTE4OCIsImExODkiLCJhMTkwIiwiYTE5MSIsIiJdO3QuWmFwZkRpbmdiYXRzRW5jb2Rpbmc9Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlNFQUNfQU5BTFlTSVNfRU5BQkxFRD10Lk1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZz10LkZvbnRGbGFncz12b2lkIDAsdC5ub3JtYWxpemVGb250TmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlQWxsKC9bLF9dL2csIi0iKS5yZXBsYWNlQWxsKC9ccy9nLCIiKX0sdC5yZWNvdmVyR2x5cGhOYW1lPWMsdC50eXBlMUZvbnRHbHlwaE1hcHBpbmc9ZnVuY3Rpb24oZSx0LHIpe2NvbnN0IGk9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgcyxsLGg7Y29uc3QgdT0hIShlLmZsYWdzJm8uU3ltYm9saWMpO2lmKGUuaXNJbnRlcm5hbEZvbnQpZm9yKGg9dCxsPTA7bDxoLmxlbmd0aDtsKyspcz1yLmluZGV4T2YoaFtsXSksaVtsXT1zPj0wP3M6MDtlbHNlIGlmKGUuYmFzZUVuY29kaW5nTmFtZSlmb3IoaD0oMCxuLmdldEVuY29kaW5nKShlLmJhc2VFbmNvZGluZ05hbWUpLGw9MDtsPGgubGVuZ3RoO2wrKylzPXIuaW5kZXhPZihoW2xdKSxpW2xdPXM+PTA/czowO2Vsc2UgaWYodSlmb3IobCBpbiB0KWlbbF09dFtsXTtlbHNlIGZvcihoPW4uU3RhbmRhcmRFbmNvZGluZyxsPTA7bDxoLmxlbmd0aDtsKyspcz1yLmluZGV4T2YoaFtsXSksaVtsXT1zPj0wP3M6MDtjb25zdCBkPWUuZGlmZmVyZW5jZXM7bGV0IGY7aWYoZClmb3IobCBpbiBkKXtjb25zdCBlPWRbbF07aWYocz1yLmluZGV4T2YoZSksLTE9PT1zKXtmfHwoZj0oMCxhLmdldEdseXBoc1VuaWNvZGUpKCkpO2NvbnN0IHQ9YyhlLGYpO3QhPT1lJiYocz1yLmluZGV4T2YodCkpfWlbbF09cz49MD9zOjB9cmV0dXJuIGl9LHIoMTU3KTt2YXIgbj1yKDE4NyksYT1yKDE4OSksaT1yKDE5MCkscz1yKDE0NCk7dC5TRUFDX0FOQUxZU0lTX0VOQUJMRUQ9ITA7Y29uc3Qgbz17Rml4ZWRQaXRjaDoxLFNlcmlmOjIsU3ltYm9saWM6NCxTY3JpcHQ6OCxOb25zeW1ib2xpYzozMixJdGFsaWM6NjQsQWxsQ2FwOjY1NTM2LFNtYWxsQ2FwOjEzMTA3MixGb3JjZUJvbGQ6MjYyMTQ0fTtmdW5jdGlvbiBjKGUsdCl7aWYodm9pZCAwIT09dFtlXSlyZXR1cm4gZTtjb25zdCByPSgwLGkuZ2V0VW5pY29kZUZvckdseXBoKShlLHQpO2lmKC0xIT09cilmb3IoY29uc3QgZSBpbiB0KWlmKHRbZV09PT1yKXJldHVybiBlO3JldHVybigwLHMuaW5mbykoIlVuYWJsZSB0byByZWNvdmVyIGEgc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3I6ICIrZSksZX10LkZvbnRGbGFncz1vLHQuTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nPVsiLm5vdGRlZiIsIi5udWxsIiwibm9ubWFya2luZ3JldHVybiIsInNwYWNlIiwiZXhjbGFtIiwicXVvdGVkYmwiLCJudW1iZXJzaWduIiwiZG9sbGFyIiwicGVyY2VudCIsImFtcGVyc2FuZCIsInF1b3Rlc2luZ2xlIiwicGFyZW5sZWZ0IiwicGFyZW5yaWdodCIsImFzdGVyaXNrIiwicGx1cyIsImNvbW1hIiwiaHlwaGVuIiwicGVyaW9kIiwic2xhc2giLCJ6ZXJvIiwib25lIiwidHdvIiwidGhyZWUiLCJmb3VyIiwiZml2ZSIsInNpeCIsInNldmVuIiwiZWlnaHQiLCJuaW5lIiwiY29sb24iLCJzZW1pY29sb24iLCJsZXNzIiwiZXF1YWwiLCJncmVhdGVyIiwicXVlc3Rpb24iLCJhdCIsIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIsIkciLCJIIiwiSSIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIsIlAiLCJRIiwiUiIsIlMiLCJUIiwiVSIsIlYiLCJXIiwiWCIsIlkiLCJaIiwiYnJhY2tldGxlZnQiLCJiYWNrc2xhc2giLCJicmFja2V0cmlnaHQiLCJhc2NpaWNpcmN1bSIsInVuZGVyc2NvcmUiLCJncmF2ZSIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsImciLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6IiwiYnJhY2VsZWZ0IiwiYmFyIiwiYnJhY2VyaWdodCIsImFzY2lpdGlsZGUiLCJBZGllcmVzaXMiLCJBcmluZyIsIkNjZWRpbGxhIiwiRWFjdXRlIiwiTnRpbGRlIiwiT2RpZXJlc2lzIiwiVWRpZXJlc2lzIiwiYWFjdXRlIiwiYWdyYXZlIiwiYWNpcmN1bWZsZXgiLCJhZGllcmVzaXMiLCJhdGlsZGUiLCJhcmluZyIsImNjZWRpbGxhIiwiZWFjdXRlIiwiZWdyYXZlIiwiZWNpcmN1bWZsZXgiLCJlZGllcmVzaXMiLCJpYWN1dGUiLCJpZ3JhdmUiLCJpY2lyY3VtZmxleCIsImlkaWVyZXNpcyIsIm50aWxkZSIsIm9hY3V0ZSIsIm9ncmF2ZSIsIm9jaXJjdW1mbGV4Iiwib2RpZXJlc2lzIiwib3RpbGRlIiwidWFjdXRlIiwidWdyYXZlIiwidWNpcmN1bWZsZXgiLCJ1ZGllcmVzaXMiLCJkYWdnZXIiLCJkZWdyZWUiLCJjZW50Iiwic3RlcmxpbmciLCJzZWN0aW9uIiwiYnVsbGV0IiwicGFyYWdyYXBoIiwiZ2VybWFuZGJscyIsInJlZ2lzdGVyZWQiLCJjb3B5cmlnaHQiLCJ0cmFkZW1hcmsiLCJhY3V0ZSIsImRpZXJlc2lzIiwibm90ZXF1YWwiLCJBRSIsIk9zbGFzaCIsImluZmluaXR5IiwicGx1c21pbnVzIiwibGVzc2VxdWFsIiwiZ3JlYXRlcmVxdWFsIiwieWVuIiwibXUiLCJwYXJ0aWFsZGlmZiIsInN1bW1hdGlvbiIsInByb2R1Y3QiLCJwaSIsImludGVncmFsIiwib3JkZmVtaW5pbmUiLCJvcmRtYXNjdWxpbmUiLCJPbWVnYSIsImFlIiwib3NsYXNoIiwicXVlc3Rpb25kb3duIiwiZXhjbGFtZG93biIsImxvZ2ljYWxub3QiLCJyYWRpY2FsIiwiZmxvcmluIiwiYXBwcm94ZXF1YWwiLCJEZWx0YSIsImd1aWxsZW1vdGxlZnQiLCJndWlsbGVtb3RyaWdodCIsImVsbGlwc2lzIiwibm9uYnJlYWtpbmdzcGFjZSIsIkFncmF2ZSIsIkF0aWxkZSIsIk90aWxkZSIsIk9FIiwib2UiLCJlbmRhc2giLCJlbWRhc2giLCJxdW90ZWRibGxlZnQiLCJxdW90ZWRibHJpZ2h0IiwicXVvdGVsZWZ0IiwicXVvdGVyaWdodCIsImRpdmlkZSIsImxvemVuZ2UiLCJ5ZGllcmVzaXMiLCJZZGllcmVzaXMiLCJmcmFjdGlvbiIsImN1cnJlbmN5IiwiZ3VpbHNpbmdsbGVmdCIsImd1aWxzaW5nbHJpZ2h0IiwiZmkiLCJmbCIsImRhZ2dlcmRibCIsInBlcmlvZGNlbnRlcmVkIiwicXVvdGVzaW5nbGJhc2UiLCJxdW90ZWRibGJhc2UiLCJwZXJ0aG91c2FuZCIsIkFjaXJjdW1mbGV4IiwiRWNpcmN1bWZsZXgiLCJBYWN1dGUiLCJFZGllcmVzaXMiLCJFZ3JhdmUiLCJJYWN1dGUiLCJJY2lyY3VtZmxleCIsIklkaWVyZXNpcyIsIklncmF2ZSIsIk9hY3V0ZSIsIk9jaXJjdW1mbGV4IiwiYXBwbGUiLCJPZ3JhdmUiLCJVYWN1dGUiLCJVY2lyY3VtZmxleCIsIlVncmF2ZSIsImRvdGxlc3NpIiwiY2lyY3VtZmxleCIsInRpbGRlIiwibWFjcm9uIiwiYnJldmUiLCJkb3RhY2NlbnQiLCJyaW5nIiwiY2VkaWxsYSIsImh1bmdhcnVtbGF1dCIsIm9nb25layIsImNhcm9uIiwiTHNsYXNoIiwibHNsYXNoIiwiU2Nhcm9uIiwic2Nhcm9uIiwiWmNhcm9uIiwiemNhcm9uIiwiYnJva2VuYmFyIiwiRXRoIiwiZXRoIiwiWWFjdXRlIiwieWFjdXRlIiwiVGhvcm4iLCJ0aG9ybiIsIm1pbnVzIiwibXVsdGlwbHkiLCJvbmVzdXBlcmlvciIsInR3b3N1cGVyaW9yIiwidGhyZWVzdXBlcmlvciIsIm9uZWhhbGYiLCJvbmVxdWFydGVyIiwidGhyZWVxdWFydGVycyIsImZyYW5jIiwiR2JyZXZlIiwiZ2JyZXZlIiwiSWRvdGFjY2VudCIsIlNjZWRpbGxhIiwic2NlZGlsbGEiLCJDYWN1dGUiLCJjYWN1dGUiLCJDY2Fyb24iLCJjY2Fyb24iLCJkY3JvYXQiXX0sKGUsdCxyKT0+e3Iucih0KSxyLmQodCx7Z2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlOigpPT5pLGdldEdseXBoc1VuaWNvZGU6KCk9PmF9KTt2YXIgbj1yKDE0OSk7Y29uc3QgYT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2UuQT02NSxlLkFFPTE5OCxlLkFFYWN1dGU9NTA4LGUuQUVtYWNyb249NDgyLGUuQUVzbWFsbD02MzQ2MixlLkFhY3V0ZT0xOTMsZS5BYWN1dGVzbWFsbD02MzQ1NyxlLkFicmV2ZT0yNTgsZS5BYnJldmVhY3V0ZT03ODU0LGUuQWJyZXZlY3lyaWxsaWM9MTIzMixlLkFicmV2ZWRvdGJlbG93PTc4NjIsZS5BYnJldmVncmF2ZT03ODU2LGUuQWJyZXZlaG9va2Fib3ZlPTc4NTgsZS5BYnJldmV0aWxkZT03ODYwLGUuQWNhcm9uPTQ2MSxlLkFjaXJjbGU9OTM5OCxlLkFjaXJjdW1mbGV4PTE5NCxlLkFjaXJjdW1mbGV4YWN1dGU9Nzg0NCxlLkFjaXJjdW1mbGV4ZG90YmVsb3c9Nzg1MixlLkFjaXJjdW1mbGV4Z3JhdmU9Nzg0NixlLkFjaXJjdW1mbGV4aG9va2Fib3ZlPTc4NDgsZS5BY2lyY3VtZmxleHNtYWxsPTYzNDU4LGUuQWNpcmN1bWZsZXh0aWxkZT03ODUwLGUuQWN1dGU9NjMxNzcsZS5BY3V0ZXNtYWxsPTYzNDEyLGUuQWN5cmlsbGljPTEwNDAsZS5BZGJsZ3JhdmU9NTEyLGUuQWRpZXJlc2lzPTE5NixlLkFkaWVyZXNpc2N5cmlsbGljPTEyMzQsZS5BZGllcmVzaXNtYWNyb249NDc4LGUuQWRpZXJlc2lzc21hbGw9NjM0NjAsZS5BZG90YmVsb3c9Nzg0MCxlLkFkb3RtYWNyb249NDgwLGUuQWdyYXZlPTE5MixlLkFncmF2ZXNtYWxsPTYzNDU2LGUuQWhvb2thYm92ZT03ODQyLGUuQWllY3lyaWxsaWM9MTIzNixlLkFpbnZlcnRlZGJyZXZlPTUxNCxlLkFscGhhPTkxMyxlLkFscGhhdG9ub3M9OTAyLGUuQW1hY3Jvbj0yNTYsZS5BbW9ub3NwYWNlPTY1MzEzLGUuQW9nb25laz0yNjAsZS5BcmluZz0xOTcsZS5BcmluZ2FjdXRlPTUwNixlLkFyaW5nYmVsb3c9NzY4MCxlLkFyaW5nc21hbGw9NjM0NjEsZS5Bc21hbGw9NjMzMjksZS5BdGlsZGU9MTk1LGUuQXRpbGRlc21hbGw9NjM0NTksZS5BeWJhcm1lbmlhbj0xMzI5LGUuQj02NixlLkJjaXJjbGU9OTM5OSxlLkJkb3RhY2NlbnQ9NzY4MixlLkJkb3RiZWxvdz03Njg0LGUuQmVjeXJpbGxpYz0xMDQxLGUuQmVuYXJtZW5pYW49MTMzMCxlLkJldGE9OTE0LGUuQmhvb2s9Mzg1LGUuQmxpbmViZWxvdz03Njg2LGUuQm1vbm9zcGFjZT02NTMxNCxlLkJyZXZlc21hbGw9NjMyMjAsZS5Cc21hbGw9NjMzMzAsZS5CdG9wYmFyPTM4NixlLkM9NjcsZS5DYWFybWVuaWFuPTEzNDIsZS5DYWN1dGU9MjYyLGUuQ2Fyb249NjMxNzgsZS5DYXJvbnNtYWxsPTYzMjIxLGUuQ2Nhcm9uPTI2OCxlLkNjZWRpbGxhPTE5OSxlLkNjZWRpbGxhYWN1dGU9NzY4OCxlLkNjZWRpbGxhc21hbGw9NjM0NjMsZS5DY2lyY2xlPTk0MDAsZS5DY2lyY3VtZmxleD0yNjQsZS5DZG90PTI2NixlLkNkb3RhY2NlbnQ9MjY2LGUuQ2VkaWxsYXNtYWxsPTYzNDE2LGUuQ2hhYXJtZW5pYW49MTM1MyxlLkNoZWFia2hhc2lhbmN5cmlsbGljPTEyMTIsZS5DaGVjeXJpbGxpYz0xMDYzLGUuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWM9MTIxNCxlLkNoZWRlc2NlbmRlcmN5cmlsbGljPTEyMDYsZS5DaGVkaWVyZXNpc2N5cmlsbGljPTEyNjgsZS5DaGVoYXJtZW5pYW49MTM0NyxlLkNoZWtoYWthc3NpYW5jeXJpbGxpYz0xMjI3LGUuQ2hldmVydGljYWxzdHJva2VjeXJpbGxpYz0xMjA4LGUuQ2hpPTkzNSxlLkNob29rPTM5MSxlLkNpcmN1bWZsZXhzbWFsbD02MzIyMixlLkNtb25vc3BhY2U9NjUzMTUsZS5Db2FybWVuaWFuPTEzNjEsZS5Dc21hbGw9NjMzMzEsZS5EPTY4LGUuRFo9NDk3LGUuRFpjYXJvbj00NTIsZS5EYWFybWVuaWFuPTEzMzIsZS5EYWZyaWNhbj0zOTMsZS5EY2Fyb249MjcwLGUuRGNlZGlsbGE9NzY5NixlLkRjaXJjbGU9OTQwMSxlLkRjaXJjdW1mbGV4YmVsb3c9NzY5OCxlLkRjcm9hdD0yNzIsZS5EZG90YWNjZW50PTc2OTAsZS5EZG90YmVsb3c9NzY5MixlLkRlY3lyaWxsaWM9MTA0NCxlLkRlaWNvcHRpYz0xMDA2LGUuRGVsdGE9ODcxMCxlLkRlbHRhZ3JlZWs9OTE2LGUuRGhvb2s9Mzk0LGUuRGllcmVzaXM9NjMxNzksZS5EaWVyZXNpc0FjdXRlPTYzMTgwLGUuRGllcmVzaXNHcmF2ZT02MzE4MSxlLkRpZXJlc2lzc21hbGw9NjM0MDAsZS5EaWdhbW1hZ3JlZWs9OTg4LGUuRGplY3lyaWxsaWM9MTAyNixlLkRsaW5lYmVsb3c9NzY5NCxlLkRtb25vc3BhY2U9NjUzMTYsZS5Eb3RhY2NlbnRzbWFsbD02MzIyMyxlLkRzbGFzaD0yNzIsZS5Ec21hbGw9NjMzMzIsZS5EdG9wYmFyPTM5NSxlLkR6PTQ5OCxlLkR6Y2Fyb249NDUzLGUuRHplYWJraGFzaWFuY3lyaWxsaWM9MTI0OCxlLkR6ZWN5cmlsbGljPTEwMjksZS5EemhlY3lyaWxsaWM9MTAzOSxlLkU9NjksZS5FYWN1dGU9MjAxLGUuRWFjdXRlc21hbGw9NjM0NjUsZS5FYnJldmU9Mjc2LGUuRWNhcm9uPTI4MixlLkVjZWRpbGxhYnJldmU9NzcwOCxlLkVjaGFybWVuaWFuPTEzMzMsZS5FY2lyY2xlPTk0MDIsZS5FY2lyY3VtZmxleD0yMDIsZS5FY2lyY3VtZmxleGFjdXRlPTc4NzAsZS5FY2lyY3VtZmxleGJlbG93PTc3MDQsZS5FY2lyY3VtZmxleGRvdGJlbG93PTc4NzgsZS5FY2lyY3VtZmxleGdyYXZlPTc4NzIsZS5FY2lyY3VtZmxleGhvb2thYm92ZT03ODc0LGUuRWNpcmN1bWZsZXhzbWFsbD02MzQ2NixlLkVjaXJjdW1mbGV4dGlsZGU9Nzg3NixlLkVjeXJpbGxpYz0xMDI4LGUuRWRibGdyYXZlPTUxNixlLkVkaWVyZXNpcz0yMDMsZS5FZGllcmVzaXNzbWFsbD02MzQ2NyxlLkVkb3Q9Mjc4LGUuRWRvdGFjY2VudD0yNzgsZS5FZG90YmVsb3c9Nzg2NCxlLkVmY3lyaWxsaWM9MTA2MCxlLkVncmF2ZT0yMDAsZS5FZ3JhdmVzbWFsbD02MzQ2NCxlLkVoYXJtZW5pYW49MTMzNSxlLkVob29rYWJvdmU9Nzg2NixlLkVpZ2h0cm9tYW49ODU1MSxlLkVpbnZlcnRlZGJyZXZlPTUxOCxlLkVpb3RpZmllZGN5cmlsbGljPTExMjQsZS5FbGN5cmlsbGljPTEwNTEsZS5FbGV2ZW5yb21hbj04NTU0LGUuRW1hY3Jvbj0yNzQsZS5FbWFjcm9uYWN1dGU9NzcwMixlLkVtYWNyb25ncmF2ZT03NzAwLGUuRW1jeXJpbGxpYz0xMDUyLGUuRW1vbm9zcGFjZT02NTMxNyxlLkVuY3lyaWxsaWM9MTA1MyxlLkVuZGVzY2VuZGVyY3lyaWxsaWM9MTE4NixlLkVuZz0zMzAsZS5FbmdoZWN5cmlsbGljPTExODgsZS5Fbmhvb2tjeXJpbGxpYz0xMjIzLGUuRW9nb25laz0yODAsZS5Fb3Blbj00MDAsZS5FcHNpbG9uPTkxNyxlLkVwc2lsb250b25vcz05MDQsZS5FcmN5cmlsbGljPTEwNTYsZS5FcmV2ZXJzZWQ9Mzk4LGUuRXJldmVyc2VkY3lyaWxsaWM9MTA2OSxlLkVzY3lyaWxsaWM9MTA1NyxlLkVzZGVzY2VuZGVyY3lyaWxsaWM9MTE5NCxlLkVzaD00MjUsZS5Fc21hbGw9NjMzMzMsZS5FdGE9OTE5LGUuRXRhcm1lbmlhbj0xMzM2LGUuRXRhdG9ub3M9OTA1LGUuRXRoPTIwOCxlLkV0aHNtYWxsPTYzNDcyLGUuRXRpbGRlPTc4NjgsZS5FdGlsZGViZWxvdz03NzA2LGUuRXVybz04MzY0LGUuRXpoPTQzOSxlLkV6aGNhcm9uPTQ5NCxlLkV6aHJldmVyc2VkPTQ0MCxlLkY9NzAsZS5GY2lyY2xlPTk0MDMsZS5GZG90YWNjZW50PTc3MTAsZS5GZWhhcm1lbmlhbj0xMzY2LGUuRmVpY29wdGljPTk5NixlLkZob29rPTQwMSxlLkZpdGFjeXJpbGxpYz0xMTM4LGUuRml2ZXJvbWFuPTg1NDgsZS5GbW9ub3NwYWNlPTY1MzE4LGUuRm91cnJvbWFuPTg1NDcsZS5Gc21hbGw9NjMzMzQsZS5HPTcxLGUuR0JzcXVhcmU9MTMxOTEsZS5HYWN1dGU9NTAwLGUuR2FtbWE9OTE1LGUuR2FtbWFhZnJpY2FuPTQwNCxlLkdhbmdpYWNvcHRpYz0xMDAyLGUuR2JyZXZlPTI4NixlLkdjYXJvbj00ODYsZS5HY2VkaWxsYT0yOTAsZS5HY2lyY2xlPTk0MDQsZS5HY2lyY3VtZmxleD0yODQsZS5HY29tbWFhY2NlbnQ9MjkwLGUuR2RvdD0yODgsZS5HZG90YWNjZW50PTI4OCxlLkdlY3lyaWxsaWM9MTA0MyxlLkdoYWRhcm1lbmlhbj0xMzQ2LGUuR2hlbWlkZGxlaG9va2N5cmlsbGljPTExNzIsZS5HaGVzdHJva2VjeXJpbGxpYz0xMTcwLGUuR2hldXB0dXJuY3lyaWxsaWM9MTE2OCxlLkdob29rPTQwMyxlLkdpbWFybWVuaWFuPTEzMzEsZS5HamVjeXJpbGxpYz0xMDI3LGUuR21hY3Jvbj03NzEyLGUuR21vbm9zcGFjZT02NTMxOSxlLkdyYXZlPTYzMTgyLGUuR3JhdmVzbWFsbD02MzMyOCxlLkdzbWFsbD02MzMzNSxlLkdzbWFsbGhvb2s9NjY3LGUuR3N0cm9rZT00ODQsZS5IPTcyLGUuSDE4NTMzPTk2NzksZS5IMTg1NDM9OTY0MixlLkgxODU1MT05NjQzLGUuSDIyMDczPTk2MzMsZS5IUHNxdWFyZT0xMzI1OSxlLkhhYWJraGFzaWFuY3lyaWxsaWM9MTE5MixlLkhhZGVzY2VuZGVyY3lyaWxsaWM9MTIwMixlLkhhcmRzaWduY3lyaWxsaWM9MTA2NixlLkhiYXI9Mjk0LGUuSGJyZXZlYmVsb3c9NzcyMixlLkhjZWRpbGxhPTc3MjAsZS5IY2lyY2xlPTk0MDUsZS5IY2lyY3VtZmxleD0yOTIsZS5IZGllcmVzaXM9NzcxOCxlLkhkb3RhY2NlbnQ9NzcxNCxlLkhkb3RiZWxvdz03NzE2LGUuSG1vbm9zcGFjZT02NTMyMCxlLkhvYXJtZW5pYW49MTM0NCxlLkhvcmljb3B0aWM9MWUzLGUuSHNtYWxsPTYzMzM2LGUuSHVuZ2FydW1sYXV0PTYzMTgzLGUuSHVuZ2FydW1sYXV0c21hbGw9NjMyMjQsZS5IenNxdWFyZT0xMzIwMCxlLkk9NzMsZS5JQWN5cmlsbGljPTEwNzEsZS5JSj0zMDYsZS5JVWN5cmlsbGljPTEwNzAsZS5JYWN1dGU9MjA1LGUuSWFjdXRlc21hbGw9NjM0NjksZS5JYnJldmU9MzAwLGUuSWNhcm9uPTQ2MyxlLkljaXJjbGU9OTQwNixlLkljaXJjdW1mbGV4PTIwNixlLkljaXJjdW1mbGV4c21hbGw9NjM0NzAsZS5JY3lyaWxsaWM9MTAzMCxlLklkYmxncmF2ZT01MjAsZS5JZGllcmVzaXM9MjA3LGUuSWRpZXJlc2lzYWN1dGU9NzcyNixlLklkaWVyZXNpc2N5cmlsbGljPTEyNTIsZS5JZGllcmVzaXNzbWFsbD02MzQ3MSxlLklkb3Q9MzA0LGUuSWRvdGFjY2VudD0zMDQsZS5JZG90YmVsb3c9Nzg4MixlLkllYnJldmVjeXJpbGxpYz0xMjM4LGUuSWVjeXJpbGxpYz0xMDQ1LGUuSWZyYWt0dXI9ODQ2NSxlLklncmF2ZT0yMDQsZS5JZ3JhdmVzbWFsbD02MzQ2OCxlLklob29rYWJvdmU9Nzg4MCxlLklpY3lyaWxsaWM9MTA0OCxlLklpbnZlcnRlZGJyZXZlPTUyMixlLklpc2hvcnRjeXJpbGxpYz0xMDQ5LGUuSW1hY3Jvbj0yOTgsZS5JbWFjcm9uY3lyaWxsaWM9MTI1MCxlLkltb25vc3BhY2U9NjUzMjEsZS5Jbmlhcm1lbmlhbj0xMzM5LGUuSW9jeXJpbGxpYz0xMDI1LGUuSW9nb25laz0zMDIsZS5Jb3RhPTkyMSxlLklvdGFhZnJpY2FuPTQwNixlLklvdGFkaWVyZXNpcz05MzgsZS5Jb3RhdG9ub3M9OTA2LGUuSXNtYWxsPTYzMzM3LGUuSXN0cm9rZT00MDcsZS5JdGlsZGU9Mjk2LGUuSXRpbGRlYmVsb3c9NzcyNCxlLkl6aGl0c2FjeXJpbGxpYz0xMTQwLGUuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWM9MTE0MixlLko9NzQsZS5KYWFybWVuaWFuPTEzNDUsZS5KY2lyY2xlPTk0MDcsZS5KY2lyY3VtZmxleD0zMDgsZS5KZWN5cmlsbGljPTEwMzIsZS5KaGVoYXJtZW5pYW49MTM1NSxlLkptb25vc3BhY2U9NjUzMjIsZS5Kc21hbGw9NjMzMzgsZS5LPTc1LGUuS0JzcXVhcmU9MTMxODksZS5LS3NxdWFyZT0xMzI2MSxlLkthYmFzaGtpcmN5cmlsbGljPTExODQsZS5LYWN1dGU9NzcyOCxlLkthY3lyaWxsaWM9MTA1MCxlLkthZGVzY2VuZGVyY3lyaWxsaWM9MTE3OCxlLkthaG9va2N5cmlsbGljPTEyMTksZS5LYXBwYT05MjIsZS5LYXN0cm9rZWN5cmlsbGljPTExODIsZS5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM9MTE4MCxlLktjYXJvbj00ODgsZS5LY2VkaWxsYT0zMTAsZS5LY2lyY2xlPTk0MDgsZS5LY29tbWFhY2NlbnQ9MzEwLGUuS2RvdGJlbG93PTc3MzAsZS5LZWhhcm1lbmlhbj0xMzY0LGUuS2VuYXJtZW5pYW49MTM0MyxlLktoYWN5cmlsbGljPTEwNjEsZS5LaGVpY29wdGljPTk5OCxlLktob29rPTQwOCxlLktqZWN5cmlsbGljPTEwMzYsZS5LbGluZWJlbG93PTc3MzIsZS5LbW9ub3NwYWNlPTY1MzIzLGUuS29wcGFjeXJpbGxpYz0xMTUyLGUuS29wcGFncmVlaz05OTAsZS5Lc2ljeXJpbGxpYz0xMTM0LGUuS3NtYWxsPTYzMzM5LGUuTD03NixlLkxKPTQ1NSxlLkxMPTYzMTY3LGUuTGFjdXRlPTMxMyxlLkxhbWJkYT05MjMsZS5MY2Fyb249MzE3LGUuTGNlZGlsbGE9MzE1LGUuTGNpcmNsZT05NDA5LGUuTGNpcmN1bWZsZXhiZWxvdz03NzQwLGUuTGNvbW1hYWNjZW50PTMxNSxlLkxkb3Q9MzE5LGUuTGRvdGFjY2VudD0zMTksZS5MZG90YmVsb3c9NzczNCxlLkxkb3RiZWxvd21hY3Jvbj03NzM2LGUuTGl3bmFybWVuaWFuPTEzNDAsZS5Maj00NTYsZS5MamVjeXJpbGxpYz0xMDMzLGUuTGxpbmViZWxvdz03NzM4LGUuTG1vbm9zcGFjZT02NTMyNCxlLkxzbGFzaD0zMjEsZS5Mc2xhc2hzbWFsbD02MzIyNSxlLkxzbWFsbD02MzM0MCxlLk09NzcsZS5NQnNxdWFyZT0xMzE5MCxlLk1hY3Jvbj02MzE4NCxlLk1hY3JvbnNtYWxsPTYzNDA3LGUuTWFjdXRlPTc3NDIsZS5NY2lyY2xlPTk0MTAsZS5NZG90YWNjZW50PTc3NDQsZS5NZG90YmVsb3c9Nzc0NixlLk1lbmFybWVuaWFuPTEzNDgsZS5NbW9ub3NwYWNlPTY1MzI1LGUuTXNtYWxsPTYzMzQxLGUuTXR1cm5lZD00MTIsZS5NdT05MjQsZS5OPTc4LGUuTko9NDU4LGUuTmFjdXRlPTMyMyxlLk5jYXJvbj0zMjcsZS5OY2VkaWxsYT0zMjUsZS5OY2lyY2xlPTk0MTEsZS5OY2lyY3VtZmxleGJlbG93PTc3NTQsZS5OY29tbWFhY2NlbnQ9MzI1LGUuTmRvdGFjY2VudD03NzQ4LGUuTmRvdGJlbG93PTc3NTAsZS5OaG9va2xlZnQ9NDEzLGUuTmluZXJvbWFuPTg1NTIsZS5Oaj00NTksZS5OamVjeXJpbGxpYz0xMDM0LGUuTmxpbmViZWxvdz03NzUyLGUuTm1vbm9zcGFjZT02NTMyNixlLk5vd2FybWVuaWFuPTEzNTAsZS5Oc21hbGw9NjMzNDIsZS5OdGlsZGU9MjA5LGUuTnRpbGRlc21hbGw9NjM0NzMsZS5OdT05MjUsZS5PPTc5LGUuT0U9MzM4LGUuT0VzbWFsbD02MzIyNixlLk9hY3V0ZT0yMTEsZS5PYWN1dGVzbWFsbD02MzQ3NSxlLk9iYXJyZWRjeXJpbGxpYz0xMjU2LGUuT2JhcnJlZGRpZXJlc2lzY3lyaWxsaWM9MTI1OCxlLk9icmV2ZT0zMzQsZS5PY2Fyb249NDY1LGUuT2NlbnRlcmVkdGlsZGU9NDE1LGUuT2NpcmNsZT05NDEyLGUuT2NpcmN1bWZsZXg9MjEyLGUuT2NpcmN1bWZsZXhhY3V0ZT03ODg4LGUuT2NpcmN1bWZsZXhkb3RiZWxvdz03ODk2LGUuT2NpcmN1bWZsZXhncmF2ZT03ODkwLGUuT2NpcmN1bWZsZXhob29rYWJvdmU9Nzg5MixlLk9jaXJjdW1mbGV4c21hbGw9NjM0NzYsZS5PY2lyY3VtZmxleHRpbGRlPTc4OTQsZS5PY3lyaWxsaWM9MTA1NCxlLk9kYmxhY3V0ZT0zMzYsZS5PZGJsZ3JhdmU9NTI0LGUuT2RpZXJlc2lzPTIxNCxlLk9kaWVyZXNpc2N5cmlsbGljPTEyNTQsZS5PZGllcmVzaXNzbWFsbD02MzQ3OCxlLk9kb3RiZWxvdz03ODg0LGUuT2dvbmVrc21hbGw9NjMyMjcsZS5PZ3JhdmU9MjEwLGUuT2dyYXZlc21hbGw9NjM0NzQsZS5PaGFybWVuaWFuPTEzNjUsZS5PaG09ODQ4NixlLk9ob29rYWJvdmU9Nzg4NixlLk9ob3JuPTQxNixlLk9ob3JuYWN1dGU9Nzg5OCxlLk9ob3JuZG90YmVsb3c9NzkwNixlLk9ob3JuZ3JhdmU9NzkwMCxlLk9ob3JuaG9va2Fib3ZlPTc5MDIsZS5PaG9ybnRpbGRlPTc5MDQsZS5PaHVuZ2FydW1sYXV0PTMzNixlLk9pPTQxOCxlLk9pbnZlcnRlZGJyZXZlPTUyNixlLk9tYWNyb249MzMyLGUuT21hY3JvbmFjdXRlPTc3NjIsZS5PbWFjcm9uZ3JhdmU9Nzc2MCxlLk9tZWdhPTg0ODYsZS5PbWVnYWN5cmlsbGljPTExMjAsZS5PbWVnYWdyZWVrPTkzNyxlLk9tZWdhcm91bmRjeXJpbGxpYz0xMTQ2LGUuT21lZ2F0aXRsb2N5cmlsbGljPTExNDgsZS5PbWVnYXRvbm9zPTkxMSxlLk9taWNyb249OTI3LGUuT21pY3JvbnRvbm9zPTkwOCxlLk9tb25vc3BhY2U9NjUzMjcsZS5PbmVyb21hbj04NTQ0LGUuT29nb25laz00OTAsZS5Pb2dvbmVrbWFjcm9uPTQ5MixlLk9vcGVuPTM5MCxlLk9zbGFzaD0yMTYsZS5Pc2xhc2hhY3V0ZT01MTAsZS5Pc2xhc2hzbWFsbD02MzQ4MCxlLk9zbWFsbD02MzM0MyxlLk9zdHJva2VhY3V0ZT01MTAsZS5PdGN5cmlsbGljPTExNTAsZS5PdGlsZGU9MjEzLGUuT3RpbGRlYWN1dGU9Nzc1NixlLk90aWxkZWRpZXJlc2lzPTc3NTgsZS5PdGlsZGVzbWFsbD02MzQ3NyxlLlA9ODAsZS5QYWN1dGU9Nzc2NCxlLlBjaXJjbGU9OTQxMyxlLlBkb3RhY2NlbnQ9Nzc2NixlLlBlY3lyaWxsaWM9MTA1NSxlLlBlaGFybWVuaWFuPTEzNTQsZS5QZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTkwLGUuUGhpPTkzNCxlLlBob29rPTQyMCxlLlBpPTkyOCxlLlBpd3Jhcm1lbmlhbj0xMzYzLGUuUG1vbm9zcGFjZT02NTMyOCxlLlBzaT05MzYsZS5Qc2ljeXJpbGxpYz0xMTM2LGUuUHNtYWxsPTYzMzQ0LGUuUT04MSxlLlFjaXJjbGU9OTQxNCxlLlFtb25vc3BhY2U9NjUzMjksZS5Rc21hbGw9NjMzNDUsZS5SPTgyLGUuUmFhcm1lbmlhbj0xMzU2LGUuUmFjdXRlPTM0MCxlLlJjYXJvbj0zNDQsZS5SY2VkaWxsYT0zNDIsZS5SY2lyY2xlPTk0MTUsZS5SY29tbWFhY2NlbnQ9MzQyLGUuUmRibGdyYXZlPTUyOCxlLlJkb3RhY2NlbnQ9Nzc2OCxlLlJkb3RiZWxvdz03NzcwLGUuUmRvdGJlbG93bWFjcm9uPTc3NzIsZS5SZWhhcm1lbmlhbj0xMzYwLGUuUmZyYWt0dXI9ODQ3NixlLlJobz05MjksZS5SaW5nc21hbGw9NjMyMjgsZS5SaW52ZXJ0ZWRicmV2ZT01MzAsZS5SbGluZWJlbG93PTc3NzQsZS5SbW9ub3NwYWNlPTY1MzMwLGUuUnNtYWxsPTYzMzQ2LGUuUnNtYWxsaW52ZXJ0ZWQ9NjQxLGUuUnNtYWxsaW52ZXJ0ZWRzdXBlcmlvcj02OTQsZS5TPTgzLGUuU0YwMTAwMDA9OTQ4NCxlLlNGMDIwMDAwPTk0OTIsZS5TRjAzMDAwMD05NDg4LGUuU0YwNDAwMDA9OTQ5NixlLlNGMDUwMDAwPTk1MzIsZS5TRjA2MDAwMD05NTE2LGUuU0YwNzAwMDA9OTUyNCxlLlNGMDgwMDAwPTk1MDAsZS5TRjA5MDAwMD05NTA4LGUuU0YxMDAwMDA9OTQ3MixlLlNGMTEwMDAwPTk0NzQsZS5TRjE5MDAwMD05NTY5LGUuU0YyMDAwMDA9OTU3MCxlLlNGMjEwMDAwPTk1NTgsZS5TRjIyMDAwMD05NTU3LGUuU0YyMzAwMDA9OTU3MSxlLlNGMjQwMDAwPTk1NTMsZS5TRjI1MDAwMD05NTU5LGUuU0YyNjAwMDA9OTU2NSxlLlNGMjcwMDAwPTk1NjQsZS5TRjI4MDAwMD05NTYzLGUuU0YzNjAwMDA9OTU2NixlLlNGMzcwMDAwPTk1NjcsZS5TRjM4MDAwMD05NTYyLGUuU0YzOTAwMDA9OTU1NixlLlNGNDAwMDAwPTk1NzcsZS5TRjQxMDAwMD05NTc0LGUuU0Y0MjAwMDA9OTU2OCxlLlNGNDMwMDAwPTk1NTIsZS5TRjQ0MDAwMD05NTgwLGUuU0Y0NTAwMDA9OTU3NSxlLlNGNDYwMDAwPTk1NzYsZS5TRjQ3MDAwMD05NTcyLGUuU0Y0ODAwMDA9OTU3MyxlLlNGNDkwMDAwPTk1NjEsZS5TRjUwMDAwMD05NTYwLGUuU0Y1MTAwMDA9OTU1NCxlLlNGNTIwMDAwPTk1NTUsZS5TRjUzMDAwMD05NTc5LGUuU0Y1NDAwMDA9OTU3OCxlLlNhY3V0ZT0zNDYsZS5TYWN1dGVkb3RhY2NlbnQ9Nzc4MCxlLlNhbXBpZ3JlZWs9OTkyLGUuU2Nhcm9uPTM1MixlLlNjYXJvbmRvdGFjY2VudD03NzgyLGUuU2Nhcm9uc21hbGw9NjMyMjksZS5TY2VkaWxsYT0zNTAsZS5TY2h3YT0zOTksZS5TY2h3YWN5cmlsbGljPTEyNDAsZS5TY2h3YWRpZXJlc2lzY3lyaWxsaWM9MTI0MixlLlNjaXJjbGU9OTQxNixlLlNjaXJjdW1mbGV4PTM0OCxlLlNjb21tYWFjY2VudD01MzYsZS5TZG90YWNjZW50PTc3NzYsZS5TZG90YmVsb3c9Nzc3OCxlLlNkb3RiZWxvd2RvdGFjY2VudD03Nzg0LGUuU2VoYXJtZW5pYW49MTM1NyxlLlNldmVucm9tYW49ODU1MCxlLlNoYWFybWVuaWFuPTEzNTEsZS5TaGFjeXJpbGxpYz0xMDY0LGUuU2hjaGFjeXJpbGxpYz0xMDY1LGUuU2hlaWNvcHRpYz05OTQsZS5TaGhhY3lyaWxsaWM9MTIxMCxlLlNoaW1hY29wdGljPTEwMDQsZS5TaWdtYT05MzEsZS5TaXhyb21hbj04NTQ5LGUuU21vbm9zcGFjZT02NTMzMSxlLlNvZnRzaWduY3lyaWxsaWM9MTA2OCxlLlNzbWFsbD02MzM0NyxlLlN0aWdtYWdyZWVrPTk4NixlLlQ9ODQsZS5UYXU9OTMyLGUuVGJhcj0zNTgsZS5UY2Fyb249MzU2LGUuVGNlZGlsbGE9MzU0LGUuVGNpcmNsZT05NDE3LGUuVGNpcmN1bWZsZXhiZWxvdz03NzkyLGUuVGNvbW1hYWNjZW50PTM1NCxlLlRkb3RhY2NlbnQ9Nzc4NixlLlRkb3RiZWxvdz03Nzg4LGUuVGVjeXJpbGxpYz0xMDU4LGUuVGVkZXNjZW5kZXJjeXJpbGxpYz0xMTk2LGUuVGVucm9tYW49ODU1MyxlLlRldHNlY3lyaWxsaWM9MTIwNCxlLlRoZXRhPTkyMCxlLlRob29rPTQyOCxlLlRob3JuPTIyMixlLlRob3Juc21hbGw9NjM0ODYsZS5UaHJlZXJvbWFuPTg1NDYsZS5UaWxkZXNtYWxsPTYzMjMwLGUuVGl3bmFybWVuaWFuPTEzNTksZS5UbGluZWJlbG93PTc3OTAsZS5UbW9ub3NwYWNlPTY1MzMyLGUuVG9hcm1lbmlhbj0xMzM3LGUuVG9uZWZpdmU9NDQ0LGUuVG9uZXNpeD0zODgsZS5Ub25ldHdvPTQyMyxlLlRyZXRyb2ZsZXhob29rPTQzMCxlLlRzZWN5cmlsbGljPTEwNjIsZS5Uc2hlY3lyaWxsaWM9MTAzNSxlLlRzbWFsbD02MzM0OCxlLlR3ZWx2ZXJvbWFuPTg1NTUsZS5Ud29yb21hbj04NTQ1LGUuVT04NSxlLlVhY3V0ZT0yMTgsZS5VYWN1dGVzbWFsbD02MzQ4MixlLlVicmV2ZT0zNjQsZS5VY2Fyb249NDY3LGUuVWNpcmNsZT05NDE4LGUuVWNpcmN1bWZsZXg9MjE5LGUuVWNpcmN1bWZsZXhiZWxvdz03Nzk4LGUuVWNpcmN1bWZsZXhzbWFsbD02MzQ4MyxlLlVjeXJpbGxpYz0xMDU5LGUuVWRibGFjdXRlPTM2OCxlLlVkYmxncmF2ZT01MzIsZS5VZGllcmVzaXM9MjIwLGUuVWRpZXJlc2lzYWN1dGU9NDcxLGUuVWRpZXJlc2lzYmVsb3c9Nzc5NCxlLlVkaWVyZXNpc2Nhcm9uPTQ3MyxlLlVkaWVyZXNpc2N5cmlsbGljPTEyNjQsZS5VZGllcmVzaXNncmF2ZT00NzUsZS5VZGllcmVzaXNtYWNyb249NDY5LGUuVWRpZXJlc2lzc21hbGw9NjM0ODQsZS5VZG90YmVsb3c9NzkwOCxlLlVncmF2ZT0yMTcsZS5VZ3JhdmVzbWFsbD02MzQ4MSxlLlVob29rYWJvdmU9NzkxMCxlLlVob3JuPTQzMSxlLlVob3JuYWN1dGU9NzkxMixlLlVob3JuZG90YmVsb3c9NzkyMCxlLlVob3JuZ3JhdmU9NzkxNCxlLlVob3JuaG9va2Fib3ZlPTc5MTYsZS5VaG9ybnRpbGRlPTc5MTgsZS5VaHVuZ2FydW1sYXV0PTM2OCxlLlVodW5nYXJ1bWxhdXRjeXJpbGxpYz0xMjY2LGUuVWludmVydGVkYnJldmU9NTM0LGUuVWtjeXJpbGxpYz0xMTQ0LGUuVW1hY3Jvbj0zNjIsZS5VbWFjcm9uY3lyaWxsaWM9MTI2MixlLlVtYWNyb25kaWVyZXNpcz03ODAyLGUuVW1vbm9zcGFjZT02NTMzMyxlLlVvZ29uZWs9MzcwLGUuVXBzaWxvbj05MzMsZS5VcHNpbG9uMT05NzgsZS5VcHNpbG9uYWN1dGVob29rc3ltYm9sZ3JlZWs9OTc5LGUuVXBzaWxvbmFmcmljYW49NDMzLGUuVXBzaWxvbmRpZXJlc2lzPTkzOSxlLlVwc2lsb25kaWVyZXNpc2hvb2tzeW1ib2xncmVlaz05ODAsZS5VcHNpbG9uaG9va3N5bWJvbD05NzgsZS5VcHNpbG9udG9ub3M9OTEwLGUuVXJpbmc9MzY2LGUuVXNob3J0Y3lyaWxsaWM9MTAzOCxlLlVzbWFsbD02MzM0OSxlLlVzdHJhaWdodGN5cmlsbGljPTExOTgsZS5Vc3RyYWlnaHRzdHJva2VjeXJpbGxpYz0xMjAwLGUuVXRpbGRlPTM2MCxlLlV0aWxkZWFjdXRlPTc4MDAsZS5VdGlsZGViZWxvdz03Nzk2LGUuVj04NixlLlZjaXJjbGU9OTQxOSxlLlZkb3RiZWxvdz03ODA2LGUuVmVjeXJpbGxpYz0xMDQyLGUuVmV3YXJtZW5pYW49MTM1OCxlLlZob29rPTQzNCxlLlZtb25vc3BhY2U9NjUzMzQsZS5Wb2FybWVuaWFuPTEzNTIsZS5Wc21hbGw9NjMzNTAsZS5WdGlsZGU9NzgwNCxlLlc9ODcsZS5XYWN1dGU9NzgxMCxlLldjaXJjbGU9OTQyMCxlLldjaXJjdW1mbGV4PTM3MixlLldkaWVyZXNpcz03ODEyLGUuV2RvdGFjY2VudD03ODE0LGUuV2RvdGJlbG93PTc4MTYsZS5XZ3JhdmU9NzgwOCxlLldtb25vc3BhY2U9NjUzMzUsZS5Xc21hbGw9NjMzNTEsZS5YPTg4LGUuWGNpcmNsZT05NDIxLGUuWGRpZXJlc2lzPTc4MjAsZS5YZG90YWNjZW50PTc4MTgsZS5YZWhhcm1lbmlhbj0xMzQxLGUuWGk9OTI2LGUuWG1vbm9zcGFjZT02NTMzNixlLlhzbWFsbD02MzM1MixlLlk9ODksZS5ZYWN1dGU9MjIxLGUuWWFjdXRlc21hbGw9NjM0ODUsZS5ZYXRjeXJpbGxpYz0xMTIyLGUuWWNpcmNsZT05NDIyLGUuWWNpcmN1bWZsZXg9Mzc0LGUuWWRpZXJlc2lzPTM3NixlLllkaWVyZXNpc3NtYWxsPTYzNDg3LGUuWWRvdGFjY2VudD03ODIyLGUuWWRvdGJlbG93PTc5MjQsZS5ZZXJpY3lyaWxsaWM9MTA2NyxlLlllcnVkaWVyZXNpc2N5cmlsbGljPTEyNzIsZS5ZZ3JhdmU9NzkyMixlLllob29rPTQzNSxlLllob29rYWJvdmU9NzkyNixlLllpYXJtZW5pYW49MTM0OSxlLllpY3lyaWxsaWM9MTAzMSxlLllpd25hcm1lbmlhbj0xMzYyLGUuWW1vbm9zcGFjZT02NTMzNyxlLllzbWFsbD02MzM1MyxlLll0aWxkZT03OTI4LGUuWXVzYmlnY3lyaWxsaWM9MTEzMCxlLll1c2JpZ2lvdGlmaWVkY3lyaWxsaWM9MTEzMixlLll1c2xpdHRsZWN5cmlsbGljPTExMjYsZS5ZdXNsaXR0bGVpb3RpZmllZGN5cmlsbGljPTExMjgsZS5aPTkwLGUuWmFhcm1lbmlhbj0xMzM0LGUuWmFjdXRlPTM3NyxlLlpjYXJvbj0zODEsZS5aY2Fyb25zbWFsbD02MzIzMSxlLlpjaXJjbGU9OTQyMyxlLlpjaXJjdW1mbGV4PTc4MjQsZS5aZG90PTM3OSxlLlpkb3RhY2NlbnQ9Mzc5LGUuWmRvdGJlbG93PTc4MjYsZS5aZWN5cmlsbGljPTEwNDcsZS5aZWRlc2NlbmRlcmN5cmlsbGljPTExNzYsZS5aZWRpZXJlc2lzY3lyaWxsaWM9MTI0NixlLlpldGE9OTE4LGUuWmhlYXJtZW5pYW49MTMzOCxlLlpoZWJyZXZlY3lyaWxsaWM9MTIxNyxlLlpoZWN5cmlsbGljPTEwNDYsZS5aaGVkZXNjZW5kZXJjeXJpbGxpYz0xMTc0LGUuWmhlZGllcmVzaXNjeXJpbGxpYz0xMjQ0LGUuWmxpbmViZWxvdz03ODI4LGUuWm1vbm9zcGFjZT02NTMzOCxlLlpzbWFsbD02MzM1NCxlLlpzdHJva2U9NDM3LGUuYT05NyxlLmFhYmVuZ2FsaT0yNDM4LGUuYWFjdXRlPTIyNSxlLmFhZGV2YT0yMzEwLGUuYWFndWphcmF0aT0yNjk0LGUuYWFndXJtdWtoaT0yNTY2LGUuYWFtYXRyYWd1cm11a2hpPTI2MjIsZS5hYXJ1c3F1YXJlPTEzMDU5LGUuYWF2b3dlbHNpZ25iZW5nYWxpPTI0OTQsZS5hYXZvd2Vsc2lnbmRldmE9MjM2NixlLmFhdm93ZWxzaWduZ3VqYXJhdGk9Mjc1MCxlLmFiYnJldmlhdGlvbm1hcmthcm1lbmlhbj0xMzc1LGUuYWJicmV2aWF0aW9uc2lnbmRldmE9MjQxNixlLmFiZW5nYWxpPTI0MzcsZS5hYm9wb21vZm89MTI1NzAsZS5hYnJldmU9MjU5LGUuYWJyZXZlYWN1dGU9Nzg1NSxlLmFicmV2ZWN5cmlsbGljPTEyMzMsZS5hYnJldmVkb3RiZWxvdz03ODYzLGUuYWJyZXZlZ3JhdmU9Nzg1NyxlLmFicmV2ZWhvb2thYm92ZT03ODU5LGUuYWJyZXZldGlsZGU9Nzg2MSxlLmFjYXJvbj00NjIsZS5hY2lyY2xlPTk0MjQsZS5hY2lyY3VtZmxleD0yMjYsZS5hY2lyY3VtZmxleGFjdXRlPTc4NDUsZS5hY2lyY3VtZmxleGRvdGJlbG93PTc4NTMsZS5hY2lyY3VtZmxleGdyYXZlPTc4NDcsZS5hY2lyY3VtZmxleGhvb2thYm92ZT03ODQ5LGUuYWNpcmN1bWZsZXh0aWxkZT03ODUxLGUuYWN1dGU9MTgwLGUuYWN1dGViZWxvd2NtYj03OTEsZS5hY3V0ZWNtYj03NjksZS5hY3V0ZWNvbWI9NzY5LGUuYWN1dGVkZXZhPTIzODgsZS5hY3V0ZWxvd21vZD03MTksZS5hY3V0ZXRvbmVjbWI9ODMzLGUuYWN5cmlsbGljPTEwNzIsZS5hZGJsZ3JhdmU9NTEzLGUuYWRkYWtndXJtdWtoaT0yNjczLGUuYWRldmE9MjMwOSxlLmFkaWVyZXNpcz0yMjgsZS5hZGllcmVzaXNjeXJpbGxpYz0xMjM1LGUuYWRpZXJlc2lzbWFjcm9uPTQ3OSxlLmFkb3RiZWxvdz03ODQxLGUuYWRvdG1hY3Jvbj00ODEsZS5hZT0yMzAsZS5hZWFjdXRlPTUwOSxlLmFla29yZWFuPTEyNjI0LGUuYWVtYWNyb249NDgzLGUuYWZpaTAwMjA4PTgyMTMsZS5hZmlpMDg5NDE9ODM1NixlLmFmaWkxMDAxNz0xMDQwLGUuYWZpaTEwMDE4PTEwNDEsZS5hZmlpMTAwMTk9MTA0MixlLmFmaWkxMDAyMD0xMDQzLGUuYWZpaTEwMDIxPTEwNDQsZS5hZmlpMTAwMjI9MTA0NSxlLmFmaWkxMDAyMz0xMDI1LGUuYWZpaTEwMDI0PTEwNDYsZS5hZmlpMTAwMjU9MTA0NyxlLmFmaWkxMDAyNj0xMDQ4LGUuYWZpaTEwMDI3PTEwNDksZS5hZmlpMTAwMjg9MTA1MCxlLmFmaWkxMDAyOT0xMDUxLGUuYWZpaTEwMDMwPTEwNTI7ZS5hZmlpMTAwMzE9MTA1MyxlLmFmaWkxMDAzMj0xMDU0LGUuYWZpaTEwMDMzPTEwNTUsZS5hZmlpMTAwMzQ9MTA1NixlLmFmaWkxMDAzNT0xMDU3LGUuYWZpaTEwMDM2PTEwNTgsZS5hZmlpMTAwMzc9MTA1OSxlLmFmaWkxMDAzOD0xMDYwLGUuYWZpaTEwMDM5PTEwNjEsZS5hZmlpMTAwNDA9MTA2MixlLmFmaWkxMDA0MT0xMDYzLGUuYWZpaTEwMDQyPTEwNjQsZS5hZmlpMTAwNDM9MTA2NSxlLmFmaWkxMDA0ND0xMDY2LGUuYWZpaTEwMDQ1PTEwNjcsZS5hZmlpMTAwNDY9MTA2OCxlLmFmaWkxMDA0Nz0xMDY5LGUuYWZpaTEwMDQ4PTEwNzAsZS5hZmlpMTAwNDk9MTA3MSxlLmFmaWkxMDA1MD0xMTY4LGUuYWZpaTEwMDUxPTEwMjYsZS5hZmlpMTAwNTI9MTAyNyxlLmFmaWkxMDA1Mz0xMDI4LGUuYWZpaTEwMDU0PTEwMjksZS5hZmlpMTAwNTU9MTAzMCxlLmFmaWkxMDA1Nj0xMDMxLGUuYWZpaTEwMDU3PTEwMzIsZS5hZmlpMTAwNTg9MTAzMyxlLmFmaWkxMDA1OT0xMDM0LGUuYWZpaTEwMDYwPTEwMzUsZS5hZmlpMTAwNjE9MTAzNixlLmFmaWkxMDA2Mj0xMDM4LGUuYWZpaTEwMDYzPTYzMTcyLGUuYWZpaTEwMDY0PTYzMTczLGUuYWZpaTEwMDY1PTEwNzIsZS5hZmlpMTAwNjY9MTA3MyxlLmFmaWkxMDA2Nz0xMDc0LGUuYWZpaTEwMDY4PTEwNzUsZS5hZmlpMTAwNjk9MTA3NixlLmFmaWkxMDA3MD0xMDc3LGUuYWZpaTEwMDcxPTExMDUsZS5hZmlpMTAwNzI9MTA3OCxlLmFmaWkxMDA3Mz0xMDc5LGUuYWZpaTEwMDc0PTEwODAsZS5hZmlpMTAwNzU9MTA4MSxlLmFmaWkxMDA3Nj0xMDgyLGUuYWZpaTEwMDc3PTEwODMsZS5hZmlpMTAwNzg9MTA4NCxlLmFmaWkxMDA3OT0xMDg1LGUuYWZpaTEwMDgwPTEwODYsZS5hZmlpMTAwODE9MTA4NyxlLmFmaWkxMDA4Mj0xMDg4LGUuYWZpaTEwMDgzPTEwODksZS5hZmlpMTAwODQ9MTA5MCxlLmFmaWkxMDA4NT0xMDkxLGUuYWZpaTEwMDg2PTEwOTIsZS5hZmlpMTAwODc9MTA5MyxlLmFmaWkxMDA4OD0xMDk0LGUuYWZpaTEwMDg5PTEwOTUsZS5hZmlpMTAwOTA9MTA5NixlLmFmaWkxMDA5MT0xMDk3LGUuYWZpaTEwMDkyPTEwOTgsZS5hZmlpMTAwOTM9MTA5OSxlLmFmaWkxMDA5ND0xMTAwLGUuYWZpaTEwMDk1PTExMDEsZS5hZmlpMTAwOTY9MTEwMixlLmFmaWkxMDA5Nz0xMTAzLGUuYWZpaTEwMDk4PTExNjksZS5hZmlpMTAwOTk9MTEwNixlLmFmaWkxMDEwMD0xMTA3LGUuYWZpaTEwMTAxPTExMDgsZS5hZmlpMTAxMDI9MTEwOSxlLmFmaWkxMDEwMz0xMTEwLGUuYWZpaTEwMTA0PTExMTEsZS5hZmlpMTAxMDU9MTExMixlLmFmaWkxMDEwNj0xMTEzLGUuYWZpaTEwMTA3PTExMTQsZS5hZmlpMTAxMDg9MTExNSxlLmFmaWkxMDEwOT0xMTE2LGUuYWZpaTEwMTEwPTExMTgsZS5hZmlpMTAxNDU9MTAzOSxlLmFmaWkxMDE0Nj0xMTIyLGUuYWZpaTEwMTQ3PTExMzgsZS5hZmlpMTAxNDg9MTE0MCxlLmFmaWkxMDE5Mj02MzE3NCxlLmFmaWkxMDE5Mz0xMTE5LGUuYWZpaTEwMTk0PTExMjMsZS5hZmlpMTAxOTU9MTEzOSxlLmFmaWkxMDE5Nj0xMTQxLGUuYWZpaTEwODMxPTYzMTc1LGUuYWZpaTEwODMyPTYzMTc2LGUuYWZpaTEwODQ2PTEyNDEsZS5hZmlpMjk5PTgyMDYsZS5hZmlpMzAwPTgyMDcsZS5hZmlpMzAxPTgyMDUsZS5hZmlpNTczODE9MTY0MixlLmFmaWk1NzM4OD0xNTQ4LGUuYWZpaTU3MzkyPTE2MzIsZS5hZmlpNTczOTM9MTYzMyxlLmFmaWk1NzM5ND0xNjM0LGUuYWZpaTU3Mzk1PTE2MzUsZS5hZmlpNTczOTY9MTYzNixlLmFmaWk1NzM5Nz0xNjM3LGUuYWZpaTU3Mzk4PTE2MzgsZS5hZmlpNTczOTk9MTYzOSxlLmFmaWk1NzQwMD0xNjQwLGUuYWZpaTU3NDAxPTE2NDEsZS5hZmlpNTc0MDM9MTU2MyxlLmFmaWk1NzQwNz0xNTY3LGUuYWZpaTU3NDA5PTE1NjksZS5hZmlpNTc0MTA9MTU3MCxlLmFmaWk1NzQxMT0xNTcxLGUuYWZpaTU3NDEyPTE1NzIsZS5hZmlpNTc0MTM9MTU3MyxlLmFmaWk1NzQxND0xNTc0LGUuYWZpaTU3NDE1PTE1NzUsZS5hZmlpNTc0MTY9MTU3NixlLmFmaWk1NzQxNz0xNTc3LGUuYWZpaTU3NDE4PTE1NzgsZS5hZmlpNTc0MTk9MTU3OSxlLmFmaWk1NzQyMD0xNTgwLGUuYWZpaTU3NDIxPTE1ODEsZS5hZmlpNTc0MjI9MTU4MixlLmFmaWk1NzQyMz0xNTgzLGUuYWZpaTU3NDI0PTE1ODQsZS5hZmlpNTc0MjU9MTU4NSxlLmFmaWk1NzQyNj0xNTg2LGUuYWZpaTU3NDI3PTE1ODcsZS5hZmlpNTc0Mjg9MTU4OCxlLmFmaWk1NzQyOT0xNTg5LGUuYWZpaTU3NDMwPTE1OTAsZS5hZmlpNTc0MzE9MTU5MSxlLmFmaWk1NzQzMj0xNTkyLGUuYWZpaTU3NDMzPTE1OTMsZS5hZmlpNTc0MzQ9MTU5NCxlLmFmaWk1NzQ0MD0xNjAwLGUuYWZpaTU3NDQxPTE2MDEsZS5hZmlpNTc0NDI9MTYwMixlLmFmaWk1NzQ0Mz0xNjAzLGUuYWZpaTU3NDQ0PTE2MDQsZS5hZmlpNTc0NDU9MTYwNSxlLmFmaWk1NzQ0Nj0xNjA2LGUuYWZpaTU3NDQ4PTE2MDgsZS5hZmlpNTc0NDk9MTYwOSxlLmFmaWk1NzQ1MD0xNjEwLGUuYWZpaTU3NDUxPTE2MTEsZS5hZmlpNTc0NTI9MTYxMixlLmFmaWk1NzQ1Mz0xNjEzLGUuYWZpaTU3NDU0PTE2MTQsZS5hZmlpNTc0NTU9MTYxNSxlLmFmaWk1NzQ1Nj0xNjE2LGUuYWZpaTU3NDU3PTE2MTcsZS5hZmlpNTc0NTg9MTYxOCxlLmFmaWk1NzQ3MD0xNjA3LGUuYWZpaTU3NTA1PTE3MDAsZS5hZmlpNTc1MDY9MTY2MixlLmFmaWk1NzUwNz0xNjcwLGUuYWZpaTU3NTA4PTE2ODgsZS5hZmlpNTc1MDk9MTcxMSxlLmFmaWk1NzUxMT0xNjU3LGUuYWZpaTU3NTEyPTE2NzIsZS5hZmlpNTc1MTM9MTY4MSxlLmFmaWk1NzUxND0xNzIyLGUuYWZpaTU3NTE5PTE3NDYsZS5hZmlpNTc1MzQ9MTc0OSxlLmFmaWk1NzYzNj04MzYyLGUuYWZpaTU3NjQ1PTE0NzAsZS5hZmlpNTc2NTg9MTQ3NSxlLmFmaWk1NzY2ND0xNDg4LGUuYWZpaTU3NjY1PTE0ODksZS5hZmlpNTc2NjY9MTQ5MCxlLmFmaWk1NzY2Nz0xNDkxLGUuYWZpaTU3NjY4PTE0OTIsZS5hZmlpNTc2Njk9MTQ5MyxlLmFmaWk1NzY3MD0xNDk0LGUuYWZpaTU3NjcxPTE0OTUsZS5hZmlpNTc2NzI9MTQ5NixlLmFmaWk1NzY3Mz0xNDk3LGUuYWZpaTU3Njc0PTE0OTgsZS5hZmlpNTc2NzU9MTQ5OSxlLmFmaWk1NzY3Nj0xNTAwLGUuYWZpaTU3Njc3PTE1MDEsZS5hZmlpNTc2Nzg9MTUwMixlLmFmaWk1NzY3OT0xNTAzLGUuYWZpaTU3NjgwPTE1MDQsZS5hZmlpNTc2ODE9MTUwNSxlLmFmaWk1NzY4Mj0xNTA2LGUuYWZpaTU3NjgzPTE1MDcsZS5hZmlpNTc2ODQ9MTUwOCxlLmFmaWk1NzY4NT0xNTA5LGUuYWZpaTU3Njg2PTE1MTAsZS5hZmlpNTc2ODc9MTUxMSxlLmFmaWk1NzY4OD0xNTEyLGUuYWZpaTU3Njg5PTE1MTMsZS5hZmlpNTc2OTA9MTUxNCxlLmFmaWk1NzY5ND02NDI5OCxlLmFmaWk1NzY5NT02NDI5OSxlLmFmaWk1NzcwMD02NDMzMSxlLmFmaWk1NzcwNT02NDI4NyxlLmFmaWk1NzcxNj0xNTIwLGUuYWZpaTU3NzE3PTE1MjEsZS5hZmlpNTc3MTg9MTUyMixlLmFmaWk1NzcyMz02NDMwOSxlLmFmaWk1Nzc5Mz0xNDYwLGUuYWZpaTU3Nzk0PTE0NjEsZS5hZmlpNTc3OTU9MTQ2MixlLmFmaWk1Nzc5Nj0xNDY3LGUuYWZpaTU3Nzk3PTE0NjQsZS5hZmlpNTc3OTg9MTQ2MyxlLmFmaWk1Nzc5OT0xNDU2LGUuYWZpaTU3ODAwPTE0NTgsZS5hZmlpNTc4MDE9MTQ1NyxlLmFmaWk1NzgwMj0xNDU5LGUuYWZpaTU3ODAzPTE0NzQsZS5hZmlpNTc4MDQ9MTQ3MyxlLmFmaWk1NzgwNj0xNDY1LGUuYWZpaTU3ODA3PTE0NjgsZS5hZmlpNTc4Mzk9MTQ2OSxlLmFmaWk1Nzg0MT0xNDcxLGUuYWZpaTU3ODQyPTE0NzIsZS5hZmlpNTc5Mjk9NzAwLGUuYWZpaTYxMjQ4PTg0NTMsZS5hZmlpNjEyODk9ODQ2NyxlLmFmaWk2MTM1Mj04NDcwLGUuYWZpaTYxNTczPTgyMzYsZS5hZmlpNjE1NzQ9ODIzNyxlLmFmaWk2MTU3NT04MjM4LGUuYWZpaTYxNjY0PTgyMDQsZS5hZmlpNjMxNjc9MTY0NSxlLmFmaWk2NDkzNz03MDEsZS5hZ3JhdmU9MjI0LGUuYWd1amFyYXRpPTI2OTMsZS5hZ3VybXVraGk9MjU2NSxlLmFoaXJhZ2FuYT0xMjM1NCxlLmFob29rYWJvdmU9Nzg0MyxlLmFpYmVuZ2FsaT0yNDQ4LGUuYWlib3BvbW9mbz0xMjU3NCxlLmFpZGV2YT0yMzIwLGUuYWllY3lyaWxsaWM9MTIzNyxlLmFpZ3VqYXJhdGk9MjcwNCxlLmFpZ3VybXVraGk9MjU3NixlLmFpbWF0cmFndXJtdWtoaT0yNjMyLGUuYWluYXJhYmljPTE1OTMsZS5haW5maW5hbGFyYWJpYz02NTIyNixlLmFpbmluaXRpYWxhcmFiaWM9NjUyMjcsZS5haW5tZWRpYWxhcmFiaWM9NjUyMjgsZS5haW52ZXJ0ZWRicmV2ZT01MTUsZS5haXZvd2Vsc2lnbmJlbmdhbGk9MjUwNCxlLmFpdm93ZWxzaWduZGV2YT0yMzc2LGUuYWl2b3dlbHNpZ25ndWphcmF0aT0yNzYwLGUuYWthdGFrYW5hPTEyNDUwLGUuYWthdGFrYW5haGFsZndpZHRoPTY1MzkzLGUuYWtvcmVhbj0xMjYyMyxlLmFsZWY9MTQ4OCxlLmFsZWZhcmFiaWM9MTU3NSxlLmFsZWZkYWdlc2hoZWJyZXc9NjQzMDQsZS5hbGVmZmluYWxhcmFiaWM9NjUxNjYsZS5hbGVmaGFtemFhYm92ZWFyYWJpYz0xNTcxLGUuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYz02NTE1NixlLmFsZWZoYW16YWJlbG93YXJhYmljPTE1NzMsZS5hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljPTY1MTYwLGUuYWxlZmhlYnJldz0xNDg4LGUuYWxlZmxhbWVkaGVicmV3PTY0MzM1LGUuYWxlZm1hZGRhYWJvdmVhcmFiaWM9MTU3MCxlLmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWM9NjUxNTQsZS5hbGVmbWFrc3VyYWFyYWJpYz0xNjA5LGUuYWxlZm1ha3N1cmFmaW5hbGFyYWJpYz02NTI2NCxlLmFsZWZtYWtzdXJhaW5pdGlhbGFyYWJpYz02NTI2NyxlLmFsZWZtYWtzdXJhbWVkaWFsYXJhYmljPTY1MjY4LGUuYWxlZnBhdGFoaGVicmV3PTY0MzAyLGUuYWxlZnFhbWF0c2hlYnJldz02NDMwMyxlLmFsZXBoPTg1MDEsZS5hbGxlcXVhbD04NzgwLGUuYWxwaGE9OTQ1LGUuYWxwaGF0b25vcz05NDAsZS5hbWFjcm9uPTI1NyxlLmFtb25vc3BhY2U9NjUzNDUsZS5hbXBlcnNhbmQ9MzgsZS5hbXBlcnNhbmRtb25vc3BhY2U9NjUyODYsZS5hbXBlcnNhbmRzbWFsbD02MzI3MCxlLmFtc3F1YXJlPTEzMjUwLGUuYW5ib3BvbW9mbz0xMjU3OCxlLmFuZ2JvcG9tb2ZvPTEyNTgwLGUuYW5nYnJhY2tldGxlZnQ9MTIyOTYsZS5hbmdicmFja2V0cmlnaHQ9MTIyOTcsZS5hbmdraGFua2h1dGhhaT0zNjc0LGUuYW5nbGU9ODczNixlLmFuZ2xlYnJhY2tldGxlZnQ9MTIyOTYsZS5hbmdsZWJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODcsZS5hbmdsZWJyYWNrZXRyaWdodD0xMjI5NyxlLmFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwODgsZS5hbmdsZWxlZnQ9OTAwMSxlLmFuZ2xlcmlnaHQ9OTAwMixlLmFuZ3N0cm9tPTg0OTEsZS5hbm90ZWxlaWE9OTAzLGUuYW51ZGF0dGFkZXZhPTIzODYsZS5hbnVzdmFyYWJlbmdhbGk9MjQzNCxlLmFudXN2YXJhZGV2YT0yMzA2LGUuYW51c3ZhcmFndWphcmF0aT0yNjkwLGUuYW9nb25laz0yNjEsZS5hcGFhdG9zcXVhcmU9MTMwNTYsZS5hcGFyZW49OTM3MixlLmFwb3N0cm9waGVhcm1lbmlhbj0xMzcwLGUuYXBvc3Ryb3BoZW1vZD03MDAsZS5hcHBsZT02Mzc0MyxlLmFwcHJvYWNoZXM9ODc4NCxlLmFwcHJveGVxdWFsPTg3NzYsZS5hcHByb3hlcXVhbG9yaW1hZ2U9ODc4NixlLmFwcHJveGltYXRlbHllcXVhbD04NzczLGUuYXJhZWFla29yZWFuPTEyNjg2LGUuYXJhZWFrb3JlYW49MTI2ODUsZS5hcmM9ODk3OCxlLmFyaWdodGhhbGZyaW5nPTc4MzQsZS5hcmluZz0yMjksZS5hcmluZ2FjdXRlPTUwNyxlLmFyaW5nYmVsb3c9NzY4MSxlLmFycm93Ym90aD04NTk2LGUuYXJyb3dkYXNoZG93bj04Njc1LGUuYXJyb3dkYXNobGVmdD04NjcyLGUuYXJyb3dkYXNocmlnaHQ9ODY3NCxlLmFycm93ZGFzaHVwPTg2NzMsZS5hcnJvd2RibGJvdGg9ODY2MCxlLmFycm93ZGJsZG93bj04NjU5LGUuYXJyb3dkYmxsZWZ0PTg2NTYsZS5hcnJvd2RibHJpZ2h0PTg2NTgsZS5hcnJvd2RibHVwPTg2NTcsZS5hcnJvd2Rvd249ODU5NSxlLmFycm93ZG93bmxlZnQ9ODYwMSxlLmFycm93ZG93bnJpZ2h0PTg2MDAsZS5hcnJvd2Rvd253aGl0ZT04NjgxLGUuYXJyb3doZWFkZG93bm1vZD03MDksZS5hcnJvd2hlYWRsZWZ0bW9kPTcwNixlLmFycm93aGVhZHJpZ2h0bW9kPTcwNyxlLmFycm93aGVhZHVwbW9kPTcwOCxlLmFycm93aG9yaXpleD02MzcxOSxlLmFycm93bGVmdD04NTkyLGUuYXJyb3dsZWZ0ZGJsPTg2NTYsZS5hcnJvd2xlZnRkYmxzdHJva2U9ODY1MyxlLmFycm93bGVmdG92ZXJyaWdodD04NjQ2LGUuYXJyb3dsZWZ0d2hpdGU9ODY3OCxlLmFycm93cmlnaHQ9ODU5NCxlLmFycm93cmlnaHRkYmxzdHJva2U9ODY1NSxlLmFycm93cmlnaHRoZWF2eT0xMDE0MixlLmFycm93cmlnaHRvdmVybGVmdD04NjQ0LGUuYXJyb3dyaWdodHdoaXRlPTg2ODAsZS5hcnJvd3RhYmxlZnQ9ODY3NixlLmFycm93dGFicmlnaHQ9ODY3NyxlLmFycm93dXA9ODU5MyxlLmFycm93dXBkbj04NTk3LGUuYXJyb3d1cGRuYnNlPTg2MTYsZS5hcnJvd3VwZG93bmJhc2U9ODYxNixlLmFycm93dXBsZWZ0PTg1OTgsZS5hcnJvd3VwbGVmdG9mZG93bj04NjQ1LGUuYXJyb3d1cHJpZ2h0PTg1OTksZS5hcnJvd3Vwd2hpdGU9ODY3OSxlLmFycm93dmVydGV4PTYzNzE4LGUuYXNjaWljaXJjdW09OTQsZS5hc2NpaWNpcmN1bW1vbm9zcGFjZT02NTM0MixlLmFzY2lpdGlsZGU9MTI2LGUuYXNjaWl0aWxkZW1vbm9zcGFjZT02NTM3NCxlLmFzY3JpcHQ9NTkzLGUuYXNjcmlwdHR1cm5lZD01OTQsZS5hc21hbGxoaXJhZ2FuYT0xMjM1MyxlLmFzbWFsbGthdGFrYW5hPTEyNDQ5LGUuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODMsZS5hc3Rlcmlzaz00MixlLmFzdGVyaXNrYWx0b25lYXJhYmljPTE2NDUsZS5hc3Rlcmlza2FyYWJpYz0xNjQ1LGUuYXN0ZXJpc2ttYXRoPTg3MjcsZS5hc3Rlcmlza21vbm9zcGFjZT02NTI5MCxlLmFzdGVyaXNrc21hbGw9NjUxMjEsZS5hc3RlcmlzbT04MjU4LGUuYXN1cGVyaW9yPTYzMjA5LGUuYXN5bXB0b3RpY2FsbHllcXVhbD04NzcxLGUuYXQ9NjQsZS5hdGlsZGU9MjI3LGUuYXRtb25vc3BhY2U9NjUzMTIsZS5hdHNtYWxsPTY1MTMxLGUuYXR1cm5lZD01OTIsZS5hdWJlbmdhbGk9MjQ1MixlLmF1Ym9wb21vZm89MTI1NzYsZS5hdWRldmE9MjMyNCxlLmF1Z3VqYXJhdGk9MjcwOCxlLmF1Z3VybXVraGk9MjU4MCxlLmF1bGVuZ3RobWFya2JlbmdhbGk9MjUxOSxlLmF1bWF0cmFndXJtdWtoaT0yNjM2LGUuYXV2b3dlbHNpZ25iZW5nYWxpPTI1MDgsZS5hdXZvd2Vsc2lnbmRldmE9MjM4MCxlLmF1dm93ZWxzaWduZ3VqYXJhdGk9Mjc2NCxlLmF2YWdyYWhhZGV2YT0yMzY1LGUuYXliYXJtZW5pYW49MTM3NyxlLmF5aW49MTUwNixlLmF5aW5hbHRvbmVoZWJyZXc9NjQyODgsZS5heWluaGVicmV3PTE1MDYsZS5iPTk4LGUuYmFiZW5nYWxpPTI0NzYsZS5iYWNrc2xhc2g9OTIsZS5iYWNrc2xhc2htb25vc3BhY2U9NjUzNDAsZS5iYWRldmE9MjM0OCxlLmJhZ3VqYXJhdGk9MjczMixlLmJhZ3VybXVraGk9MjYwNCxlLmJhaGlyYWdhbmE9MTI0MDAsZS5iYWh0dGhhaT0zNjQ3LGUuYmFrYXRha2FuYT0xMjQ5NixlLmJhcj0xMjQsZS5iYXJtb25vc3BhY2U9NjUzNzIsZS5iYm9wb21vZm89MTI1NDksZS5iY2lyY2xlPTk0MjUsZS5iZG90YWNjZW50PTc2ODMsZS5iZG90YmVsb3c9NzY4NSxlLmJlYW1lZHNpeHRlZW50aG5vdGVzPTk4MzYsZS5iZWNhdXNlPTg3NTcsZS5iZWN5cmlsbGljPTEwNzMsZS5iZWhhcmFiaWM9MTU3NixlLmJlaGZpbmFsYXJhYmljPTY1MTY4LGUuYmVoaW5pdGlhbGFyYWJpYz02NTE2OSxlLmJlaGlyYWdhbmE9MTI0MDksZS5iZWhtZWRpYWxhcmFiaWM9NjUxNzAsZS5iZWhtZWVtaW5pdGlhbGFyYWJpYz02NDY3MSxlLmJlaG1lZW1pc29sYXRlZGFyYWJpYz02NDUyMCxlLmJlaG5vb25maW5hbGFyYWJpYz02NDYyMSxlLmJla2F0YWthbmE9MTI1MDUsZS5iZW5hcm1lbmlhbj0xMzc4LGUuYmV0PTE0ODksZS5iZXRhPTk0NixlLmJldGFzeW1ib2xncmVlaz05NzYsZS5iZXRkYWdlc2g9NjQzMDUsZS5iZXRkYWdlc2hoZWJyZXc9NjQzMDUsZS5iZXRoZWJyZXc9MTQ4OSxlLmJldHJhZmVoZWJyZXc9NjQzMzIsZS5iaGFiZW5nYWxpPTI0NzcsZS5iaGFkZXZhPTIzNDksZS5iaGFndWphcmF0aT0yNzMzLGUuYmhhZ3VybXVraGk9MjYwNSxlLmJob29rPTU5NSxlLmJpaGlyYWdhbmE9MTI0MDMsZS5iaWthdGFrYW5hPTEyNDk5LGUuYmlsYWJpYWxjbGljaz02NjQsZS5iaW5kaWd1cm11a2hpPTI1NjIsZS5iaXJ1c3F1YXJlPTEzMTA1LGUuYmxhY2tjaXJjbGU9OTY3OSxlLmJsYWNrZGlhbW9uZD05NjcwLGUuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZT05NjYwLGUuYmxhY2tsZWZ0cG9pbnRpbmdwb2ludGVyPTk2NjgsZS5ibGFja2xlZnRwb2ludGluZ3RyaWFuZ2xlPTk2NjQsZS5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdD0xMjMwNCxlLmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODMsZS5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQ9MTIzMDUsZS5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbD02NTA4NCxlLmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGU9OTY5OSxlLmJsYWNrbG93ZXJyaWdodHRyaWFuZ2xlPTk2OTgsZS5ibGFja3JlY3RhbmdsZT05NjQ0LGUuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlcj05NjU4LGUuYmxhY2tyaWdodHBvaW50aW5ndHJpYW5nbGU9OTY1NCxlLmJsYWNrc21hbGxzcXVhcmU9OTY0MixlLmJsYWNrc21pbGluZ2ZhY2U9OTc4NyxlLmJsYWNrc3F1YXJlPTk2MzIsZS5ibGFja3N0YXI9OTczMyxlLmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGU9OTcwMCxlLmJsYWNrdXBwZXJyaWdodHRyaWFuZ2xlPTk3MDEsZS5ibGFja3VwcG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2NTIsZS5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZT05NjUwLGUuYmxhbms9OTI1MSxlLmJsaW5lYmVsb3c9NzY4NyxlLmJsb2NrPTk2MDgsZS5ibW9ub3NwYWNlPTY1MzQ2LGUuYm9iYWltYWl0aGFpPTM2MTAsZS5ib2hpcmFnYW5hPTEyNDEyLGUuYm9rYXRha2FuYT0xMjUwOCxlLmJwYXJlbj05MzczLGUuYnFzcXVhcmU9MTMyNTEsZS5icmFjZWV4PTYzNzMyLGUuYnJhY2VsZWZ0PTEyMyxlLmJyYWNlbGVmdGJ0PTYzNzMxLGUuYnJhY2VsZWZ0bWlkPTYzNzMwLGUuYnJhY2VsZWZ0bW9ub3NwYWNlPTY1MzcxLGUuYnJhY2VsZWZ0c21hbGw9NjUxMTUsZS5icmFjZWxlZnR0cD02MzcyOSxlLmJyYWNlbGVmdHZlcnRpY2FsPTY1MDc5LGUuYnJhY2VyaWdodD0xMjUsZS5icmFjZXJpZ2h0YnQ9NjM3NDIsZS5icmFjZXJpZ2h0bWlkPTYzNzQxLGUuYnJhY2VyaWdodG1vbm9zcGFjZT02NTM3MyxlLmJyYWNlcmlnaHRzbWFsbD02NTExNixlLmJyYWNlcmlnaHR0cD02Mzc0MCxlLmJyYWNlcmlnaHR2ZXJ0aWNhbD02NTA4MCxlLmJyYWNrZXRsZWZ0PTkxLGUuYnJhY2tldGxlZnRidD02MzcyOCxlLmJyYWNrZXRsZWZ0ZXg9NjM3MjcsZS5icmFja2V0bGVmdG1vbm9zcGFjZT02NTMzOSxlLmJyYWNrZXRsZWZ0dHA9NjM3MjYsZS5icmFja2V0cmlnaHQ9OTMsZS5icmFja2V0cmlnaHRidD02MzczOSxlLmJyYWNrZXRyaWdodGV4PTYzNzM4LGUuYnJhY2tldHJpZ2h0bW9ub3NwYWNlPTY1MzQxLGUuYnJhY2tldHJpZ2h0dHA9NjM3MzcsZS5icmV2ZT03MjgsZS5icmV2ZWJlbG93Y21iPTgxNCxlLmJyZXZlY21iPTc3NCxlLmJyZXZlaW52ZXJ0ZWRiZWxvd2NtYj04MTUsZS5icmV2ZWludmVydGVkY21iPTc4NSxlLmJyZXZlaW52ZXJ0ZWRkb3VibGVjbWI9ODY1LGUuYnJpZGdlYmVsb3djbWI9ODEwLGUuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYj04MjYsZS5icm9rZW5iYXI9MTY2LGUuYnN0cm9rZT0zODQsZS5ic3VwZXJpb3I9NjMyMTAsZS5idG9wYmFyPTM4NyxlLmJ1aGlyYWdhbmE9MTI0MDYsZS5idWthdGFrYW5hPTEyNTAyLGUuYnVsbGV0PTgyMjYsZS5idWxsZXRpbnZlcnNlPTk2ODgsZS5idWxsZXRvcGVyYXRvcj04NzI5LGUuYnVsbHNleWU9OTY3OCxlLmM9OTksZS5jYWFybWVuaWFuPTEzOTAsZS5jYWJlbmdhbGk9MjQ1OCxlLmNhY3V0ZT0yNjMsZS5jYWRldmE9MjMzMCxlLmNhZ3VqYXJhdGk9MjcxNCxlLmNhZ3VybXVraGk9MjU4NixlLmNhbHNxdWFyZT0xMzE5MixlLmNhbmRyYWJpbmR1YmVuZ2FsaT0yNDMzLGUuY2FuZHJhYmluZHVjbWI9Nzg0LGUuY2FuZHJhYmluZHVkZXZhPTIzMDUsZS5jYW5kcmFiaW5kdWd1amFyYXRpPTI2ODksZS5jYXBzbG9jaz04NjgyLGUuY2FyZW9mPTg0NTMsZS5jYXJvbj03MTEsZS5jYXJvbmJlbG93Y21iPTgxMixlLmNhcm9uY21iPTc4MCxlLmNhcnJpYWdlcmV0dXJuPTg2MjksZS5jYm9wb21vZm89MTI1NjgsZS5jY2Fyb249MjY5LGUuY2NlZGlsbGE9MjMxLGUuY2NlZGlsbGFhY3V0ZT03Njg5LGUuY2NpcmNsZT05NDI2LGUuY2NpcmN1bWZsZXg9MjY1LGUuY2N1cmw9NTk3LGUuY2RvdD0yNjcsZS5jZG90YWNjZW50PTI2NyxlLmNkc3F1YXJlPTEzMjUzLGUuY2VkaWxsYT0xODQsZS5jZWRpbGxhY21iPTgwNyxlLmNlbnQ9MTYyLGUuY2VudGlncmFkZT04NDUxLGUuY2VudGluZmVyaW9yPTYzMTk5LGUuY2VudG1vbm9zcGFjZT02NTUwNCxlLmNlbnRvbGRzdHlsZT02MzM5NCxlLmNlbnRzdXBlcmlvcj02MzIwMCxlLmNoYWFybWVuaWFuPTE0MDEsZS5jaGFiZW5nYWxpPTI0NTksZS5jaGFkZXZhPTIzMzEsZS5jaGFndWphcmF0aT0yNzE1LGUuY2hhZ3VybXVraGk9MjU4NyxlLmNoYm9wb21vZm89MTI1NjQsZS5jaGVhYmtoYXNpYW5jeXJpbGxpYz0xMjEzLGUuY2hlY2ttYXJrPTEwMDAzLGUuY2hlY3lyaWxsaWM9MTA5NSxlLmNoZWRlc2NlbmRlcmFia2hhc2lhbmN5cmlsbGljPTEyMTUsZS5jaGVkZXNjZW5kZXJjeXJpbGxpYz0xMjA3LGUuY2hlZGllcmVzaXNjeXJpbGxpYz0xMjY5LGUuY2hlaGFybWVuaWFuPTEzOTUsZS5jaGVraGFrYXNzaWFuY3lyaWxsaWM9MTIyOCxlLmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWM9MTIwOSxlLmNoaT05NjcsZS5jaGlldWNoYWNpcmNsZWtvcmVhbj0xMjkxOSxlLmNoaWV1Y2hhcGFyZW5rb3JlYW49MTI4MjMsZS5jaGlldWNoY2lyY2xla29yZWFuPTEyOTA1LGUuY2hpZXVjaGtvcmVhbj0xMjYxOCxlLmNoaWV1Y2hwYXJlbmtvcmVhbj0xMjgwOSxlLmNob2NoYW5ndGhhaT0zNTk0LGUuY2hvY2hhbnRoYWk9MzU5MixlLmNob2NoaW5ndGhhaT0zNTkzLGUuY2hvY2hvZXRoYWk9MzU5NixlLmNob29rPTM5MixlLmNpZXVjYWNpcmNsZWtvcmVhbj0xMjkxOCxlLmNpZXVjYXBhcmVua29yZWFuPTEyODIyLGUuY2lldWNjaXJjbGVrb3JlYW49MTI5MDQsZS5jaWV1Y2tvcmVhbj0xMjYxNixlLmNpZXVjcGFyZW5rb3JlYW49MTI4MDgsZS5jaWV1Y3VwYXJlbmtvcmVhbj0xMjgyOCxlLmNpcmNsZT05Njc1LGUuY2lyY2xlY29weXJ0PTE2OSxlLmNpcmNsZW11bHRpcGx5PTg4NTUsZS5jaXJjbGVvdD04ODU3LGUuY2lyY2xlcGx1cz04ODUzLGUuY2lyY2xlcG9zdGFsbWFyaz0xMjM0MixlLmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrPTk2ODAsZS5jaXJjbGV3aXRocmlnaHRoYWxmYmxhY2s9OTY4MSxlLmNpcmN1bWZsZXg9NzEwLGUuY2lyY3VtZmxleGJlbG93Y21iPTgxMyxlLmNpcmN1bWZsZXhjbWI9NzcwLGUuY2xlYXI9ODk5OSxlLmNsaWNrYWx2ZW9sYXI9NDUwLGUuY2xpY2tkZW50YWw9NDQ4LGUuY2xpY2tsYXRlcmFsPTQ0OSxlLmNsaWNrcmV0cm9mbGV4PTQ1MSxlLmNsdWI9OTgyNyxlLmNsdWJzdWl0YmxhY2s9OTgyNyxlLmNsdWJzdWl0d2hpdGU9OTgzMSxlLmNtY3ViZWRzcXVhcmU9MTMyMjAsZS5jbW9ub3NwYWNlPTY1MzQ3LGUuY21zcXVhcmVkc3F1YXJlPTEzMjE2LGUuY29hcm1lbmlhbj0xNDA5LGUuY29sb249NTgsZS5jb2xvbm1vbmV0YXJ5PTgzNTMsZS5jb2xvbm1vbm9zcGFjZT02NTMwNixlLmNvbG9uc2lnbj04MzUzLGUuY29sb25zbWFsbD02NTEwOSxlLmNvbG9udHJpYW5ndWxhcmhhbGZtb2Q9NzIxLGUuY29sb250cmlhbmd1bGFybW9kPTcyMCxlLmNvbW1hPTQ0LGUuY29tbWFhYm92ZWNtYj03ODcsZS5jb21tYWFib3ZlcmlnaHRjbWI9Nzg5LGUuY29tbWFhY2NlbnQ9NjMxNzEsZS5jb21tYWFyYWJpYz0xNTQ4LGUuY29tbWFhcm1lbmlhbj0xMzczLGUuY29tbWFpbmZlcmlvcj02MzIwMSxlLmNvbW1hbW9ub3NwYWNlPTY1MjkyLGUuY29tbWFyZXZlcnNlZGFib3ZlY21iPTc4OCxlLmNvbW1hcmV2ZXJzZWRtb2Q9NzAxLGUuY29tbWFzbWFsbD02NTEwNCxlLmNvbW1hc3VwZXJpb3I9NjMyMDIsZS5jb21tYXR1cm5lZGFib3ZlY21iPTc4NixlLmNvbW1hdHVybmVkbW9kPTY5OSxlLmNvbXBhc3M9OTc4OCxlLmNvbmdydWVudD04NzczLGUuY29udG91cmludGVncmFsPTg3NTAsZS5jb250cm9sPTg5NjMsZS5jb250cm9sQUNLPTYsZS5jb250cm9sQkVMPTcsZS5jb250cm9sQlM9OCxlLmNvbnRyb2xDQU49MjQsZS5jb250cm9sQ1I9MTMsZS5jb250cm9sREMxPTE3LGUuY29udHJvbERDMj0xOCxlLmNvbnRyb2xEQzM9MTksZS5jb250cm9sREM0PTIwLGUuY29udHJvbERFTD0xMjcsZS5jb250cm9sRExFPTE2LGUuY29udHJvbEVNPTI1LGUuY29udHJvbEVOUT01LGUuY29udHJvbEVPVD00LGUuY29udHJvbEVTQz0yNyxlLmNvbnRyb2xFVEI9MjMsZS5jb250cm9sRVRYPTMsZS5jb250cm9sRkY9MTIsZS5jb250cm9sRlM9MjgsZS5jb250cm9sR1M9MjksZS5jb250cm9sSFQ9OSxlLmNvbnRyb2xMRj0xMCxlLmNvbnRyb2xOQUs9MjEsZS5jb250cm9sTlVMTD0wLGUuY29udHJvbFJTPTMwLGUuY29udHJvbFNJPTE1LGUuY29udHJvbFNPPTE0LGUuY29udHJvbFNPVD0yLGUuY29udHJvbFNUWD0xLGUuY29udHJvbFNVQj0yNixlLmNvbnRyb2xTWU49MjIsZS5jb250cm9sVVM9MzEsZS5jb250cm9sVlQ9MTEsZS5jb3B5cmlnaHQ9MTY5LGUuY29weXJpZ2h0c2Fucz02MzcyMSxlLmNvcHlyaWdodHNlcmlmPTYzMTkzLGUuY29ybmVyYnJhY2tldGxlZnQ9MTIzMDAsZS5jb3JuZXJicmFja2V0bGVmdGhhbGZ3aWR0aD02NTM3OCxlLmNvcm5lcmJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODksZS5jb3JuZXJicmFja2V0cmlnaHQ9MTIzMDEsZS5jb3JuZXJicmFja2V0cmlnaHRoYWxmd2lkdGg9NjUzNzksZS5jb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbD02NTA5MCxlLmNvcnBvcmF0aW9uc3F1YXJlPTEzMTgzLGUuY29zcXVhcmU9MTMyNTUsZS5jb3Zlcmtnc3F1YXJlPTEzMjU0LGUuY3BhcmVuPTkzNzQsZS5jcnV6ZWlybz04MzU0LGUuY3N0cmV0Y2hlZD02NjMsZS5jdXJseWFuZD04OTExLGUuY3VybHlvcj04OTEwLGUuY3VycmVuY3k9MTY0LGUuY3lyQnJldmU9NjMxODUsZS5jeXJGbGV4PTYzMTg2LGUuY3lyYnJldmU9NjMxODgsZS5jeXJmbGV4PTYzMTg5LGUuZD0xMDAsZS5kYWFybWVuaWFuPTEzODAsZS5kYWJlbmdhbGk9MjQ3MCxlLmRhZGFyYWJpYz0xNTkwLGUuZGFkZXZhPTIzNDIsZS5kYWRmaW5hbGFyYWJpYz02NTIxNCxlLmRhZGluaXRpYWxhcmFiaWM9NjUyMTUsZS5kYWRtZWRpYWxhcmFiaWM9NjUyMTYsZS5kYWdlc2g9MTQ2OCxlLmRhZ2VzaGhlYnJldz0xNDY4LGUuZGFnZ2VyPTgyMjQsZS5kYWdnZXJkYmw9ODIyNSxlLmRhZ3VqYXJhdGk9MjcyNixlLmRhZ3VybXVraGk9MjU5OCxlLmRhaGlyYWdhbmE9MTIzODQsZS5kYWthdGFrYW5hPTEyNDgwLGUuZGFsYXJhYmljPTE1ODMsZS5kYWxldD0xNDkxLGUuZGFsZXRkYWdlc2g9NjQzMDcsZS5kYWxldGRhZ2VzaGhlYnJldz02NDMwNyxlLmRhbGV0aGVicmV3PTE0OTEsZS5kYWxmaW5hbGFyYWJpYz02NTE5NCxlLmRhbW1hYXJhYmljPTE2MTUsZS5kYW1tYWxvd2FyYWJpYz0xNjE1LGUuZGFtbWF0YW5hbHRvbmVhcmFiaWM9MTYxMixlLmRhbW1hdGFuYXJhYmljPTE2MTIsZS5kYW5kYT0yNDA0LGUuZGFyZ2FoZWJyZXc9MTQ0NyxlLmRhcmdhbGVmdGhlYnJldz0xNDQ3LGUuZGFzaWFwbmV1bWF0YWN5cmlsbGljY21iPTExNTcsZS5kYmxHcmF2ZT02MzE4NyxlLmRibGFuZ2xlYnJhY2tldGxlZnQ9MTIyOTgsZS5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODUsZS5kYmxhbmdsZWJyYWNrZXRyaWdodD0xMjI5OSxlLmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwODYsZS5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYj04MTEsZS5kYmxhcnJvd2xlZnQ9ODY2MCxlLmRibGFycm93cmlnaHQ9ODY1OCxlLmRibGRhbmRhPTI0MDUsZS5kYmxncmF2ZT02MzE5MCxlLmRibGdyYXZlY21iPTc4MyxlLmRibGludGVncmFsPTg3NDgsZS5kYmxsb3dsaW5lPTgyMTUsZS5kYmxsb3dsaW5lY21iPTgxOSxlLmRibG92ZXJsaW5lY21iPTgzMSxlLmRibHByaW1lbW9kPTY5OCxlLmRibHZlcnRpY2FsYmFyPTgyMTQsZS5kYmx2ZXJ0aWNhbGxpbmVhYm92ZWNtYj03ODIsZS5kYm9wb21vZm89MTI1NTMsZS5kYnNxdWFyZT0xMzI1NixlLmRjYXJvbj0yNzEsZS5kY2VkaWxsYT03Njk3LGUuZGNpcmNsZT05NDI3LGUuZGNpcmN1bWZsZXhiZWxvdz03Njk5LGUuZGNyb2F0PTI3MyxlLmRkYWJlbmdhbGk9MjQ2NSxlLmRkYWRldmE9MjMzNyxlLmRkYWd1amFyYXRpPTI3MjEsZS5kZGFndXJtdWtoaT0yNTkzLGUuZGRhbGFyYWJpYz0xNjcyLGUuZGRhbGZpbmFsYXJhYmljPTY0MzkzLGUuZGRkaGFkZXZhPTIzOTYsZS5kZGhhYmVuZ2FsaT0yNDY2LGUuZGRoYWRldmE9MjMzOCxlLmRkaGFndWphcmF0aT0yNzIyLGUuZGRoYWd1cm11a2hpPTI1OTQsZS5kZG90YWNjZW50PTc2OTEsZS5kZG90YmVsb3c9NzY5MyxlLmRlY2ltYWxzZXBhcmF0b3JhcmFiaWM9MTY0MyxlLmRlY2ltYWxzZXBhcmF0b3JwZXJzaWFuPTE2NDMsZS5kZWN5cmlsbGljPTEwNzYsZS5kZWdyZWU9MTc2LGUuZGVoaWhlYnJldz0xNDUzLGUuZGVoaXJhZ2FuYT0xMjM5MSxlLmRlaWNvcHRpYz0xMDA3LGUuZGVrYXRha2FuYT0xMjQ4NyxlLmRlbGV0ZWxlZnQ9OTAwMyxlLmRlbGV0ZXJpZ2h0PTg5OTgsZS5kZWx0YT05NDgsZS5kZWx0YXR1cm5lZD0zOTcsZS5kZW5vbWluYXRvcm1pbnVzb25lbnVtZXJhdG9yYmVuZ2FsaT0yNTUyLGUuZGV6aD02NzYsZS5kaGFiZW5nYWxpPTI0NzEsZS5kaGFkZXZhPTIzNDMsZS5kaGFndWphcmF0aT0yNzI3LGUuZGhhZ3VybXVraGk9MjU5OSxlLmRob29rPTU5OSxlLmRpYWx5dGlrYXRvbm9zPTkwMSxlLmRpYWx5dGlrYXRvbm9zY21iPTgzNixlLmRpYW1vbmQ9OTgzMCxlLmRpYW1vbmRzdWl0d2hpdGU9OTgyNixlLmRpZXJlc2lzPTE2OCxlLmRpZXJlc2lzYWN1dGU9NjMxOTEsZS5kaWVyZXNpc2JlbG93Y21iPTgwNCxlLmRpZXJlc2lzY21iPTc3NixlLmRpZXJlc2lzZ3JhdmU9NjMxOTIsZS5kaWVyZXNpc3Rvbm9zPTkwMSxlLmRpaGlyYWdhbmE9MTIzODYsZS5kaWthdGFrYW5hPTEyNDgyLGUuZGl0dG9tYXJrPTEyMjkxLGUuZGl2aWRlPTI0NyxlLmRpdmlkZXM9ODczOSxlLmRpdmlzaW9uc2xhc2g9ODcyNSxlLmRqZWN5cmlsbGljPTExMDYsZS5ka3NoYWRlPTk2MTksZS5kbGluZWJlbG93PTc2OTUsZS5kbHNxdWFyZT0xMzIwNyxlLmRtYWNyb249MjczLGUuZG1vbm9zcGFjZT02NTM0OCxlLmRuYmxvY2s9OTYwNCxlLmRvY2hhZGF0aGFpPTM1OTgsZS5kb2Rla3RoYWk9MzYwNCxlLmRvaGlyYWdhbmE9MTIzOTMsZS5kb2thdGFrYW5hPTEyNDg5LGUuZG9sbGFyPTM2O2UuZG9sbGFyaW5mZXJpb3I9NjMyMDMsZS5kb2xsYXJtb25vc3BhY2U9NjUyODQsZS5kb2xsYXJvbGRzdHlsZT02MzI2OCxlLmRvbGxhcnNtYWxsPTY1MTI5LGUuZG9sbGFyc3VwZXJpb3I9NjMyMDQsZS5kb25nPTgzNjMsZS5kb3J1c3F1YXJlPTEzMDk0LGUuZG90YWNjZW50PTcyOSxlLmRvdGFjY2VudGNtYj03NzUsZS5kb3RiZWxvd2NtYj04MDMsZS5kb3RiZWxvd2NvbWI9ODAzLGUuZG90a2F0YWthbmE9MTI1MzksZS5kb3RsZXNzaT0zMDUsZS5kb3RsZXNzaj02MzE2NixlLmRvdGxlc3Nqc3Ryb2tlaG9vaz02NDQsZS5kb3RtYXRoPTg5MDEsZS5kb3R0ZWRjaXJjbGU9OTY3NixlLmRvdWJsZXlvZHBhdGFoPTY0Mjg3LGUuZG91YmxleW9kcGF0YWhoZWJyZXc9NjQyODcsZS5kb3dudGFja2JlbG93Y21iPTc5OCxlLmRvd250YWNrbW9kPTcyNSxlLmRwYXJlbj05Mzc1LGUuZHN1cGVyaW9yPTYzMjExLGUuZHRhaWw9NTk4LGUuZHRvcGJhcj0zOTYsZS5kdWhpcmFnYW5hPTEyMzg5LGUuZHVrYXRha2FuYT0xMjQ4NSxlLmR6PTQ5OSxlLmR6YWx0b25lPTY3NSxlLmR6Y2Fyb249NDU0LGUuZHpjdXJsPTY3NyxlLmR6ZWFia2hhc2lhbmN5cmlsbGljPTEyNDksZS5kemVjeXJpbGxpYz0xMTA5LGUuZHpoZWN5cmlsbGljPTExMTksZS5lPTEwMSxlLmVhY3V0ZT0yMzMsZS5lYXJ0aD05NzkzLGUuZWJlbmdhbGk9MjQ0NyxlLmVib3BvbW9mbz0xMjU3MixlLmVicmV2ZT0yNzcsZS5lY2FuZHJhZGV2YT0yMzE3LGUuZWNhbmRyYWd1amFyYXRpPTI3MDEsZS5lY2FuZHJhdm93ZWxzaWduZGV2YT0yMzczLGUuZWNhbmRyYXZvd2Vsc2lnbmd1amFyYXRpPTI3NTcsZS5lY2Fyb249MjgzLGUuZWNlZGlsbGFicmV2ZT03NzA5LGUuZWNoYXJtZW5pYW49MTM4MSxlLmVjaHlpd25hcm1lbmlhbj0xNDE1LGUuZWNpcmNsZT05NDI4LGUuZWNpcmN1bWZsZXg9MjM0LGUuZWNpcmN1bWZsZXhhY3V0ZT03ODcxLGUuZWNpcmN1bWZsZXhiZWxvdz03NzA1LGUuZWNpcmN1bWZsZXhkb3RiZWxvdz03ODc5LGUuZWNpcmN1bWZsZXhncmF2ZT03ODczLGUuZWNpcmN1bWZsZXhob29rYWJvdmU9Nzg3NSxlLmVjaXJjdW1mbGV4dGlsZGU9Nzg3NyxlLmVjeXJpbGxpYz0xMTA4LGUuZWRibGdyYXZlPTUxNyxlLmVkZXZhPTIzMTksZS5lZGllcmVzaXM9MjM1LGUuZWRvdD0yNzksZS5lZG90YWNjZW50PTI3OSxlLmVkb3RiZWxvdz03ODY1LGUuZWVndXJtdWtoaT0yNTc1LGUuZWVtYXRyYWd1cm11a2hpPTI2MzEsZS5lZmN5cmlsbGljPTEwOTIsZS5lZ3JhdmU9MjMyLGUuZWd1amFyYXRpPTI3MDMsZS5laGFybWVuaWFuPTEzODMsZS5laGJvcG9tb2ZvPTEyNTczLGUuZWhpcmFnYW5hPTEyMzYwLGUuZWhvb2thYm92ZT03ODY3LGUuZWlib3BvbW9mbz0xMjU3NSxlLmVpZ2h0PTU2LGUuZWlnaHRhcmFiaWM9MTY0MCxlLmVpZ2h0YmVuZ2FsaT0yNTQyLGUuZWlnaHRjaXJjbGU9OTMxOSxlLmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyOSxlLmVpZ2h0ZGV2YT0yNDE0LGUuZWlnaHRlZW5jaXJjbGU9OTMyOSxlLmVpZ2h0ZWVucGFyZW49OTM0OSxlLmVpZ2h0ZWVucGVyaW9kPTkzNjksZS5laWdodGd1amFyYXRpPTI3OTgsZS5laWdodGd1cm11a2hpPTI2NzAsZS5laWdodGhhY2thcmFiaWM9MTY0MCxlLmVpZ2h0aGFuZ3pob3U9MTIzMjgsZS5laWdodGhub3RlYmVhbWVkPTk4MzUsZS5laWdodGlkZW9ncmFwaGljcGFyZW49MTI4MzksZS5laWdodGluZmVyaW9yPTgzMjgsZS5laWdodG1vbm9zcGFjZT02NTMwNCxlLmVpZ2h0b2xkc3R5bGU9NjMyODgsZS5laWdodHBhcmVuPTkzMzksZS5laWdodHBlcmlvZD05MzU5LGUuZWlnaHRwZXJzaWFuPTE3ODQsZS5laWdodHJvbWFuPTg1NjcsZS5laWdodHN1cGVyaW9yPTgzMTIsZS5laWdodHRoYWk9MzY3MixlLmVpbnZlcnRlZGJyZXZlPTUxOSxlLmVpb3RpZmllZGN5cmlsbGljPTExMjUsZS5la2F0YWthbmE9MTI0NTYsZS5la2F0YWthbmFoYWxmd2lkdGg9NjUzOTYsZS5la29ua2FyZ3VybXVraGk9MjY3NixlLmVrb3JlYW49MTI2MjgsZS5lbGN5cmlsbGljPTEwODMsZS5lbGVtZW50PTg3MTIsZS5lbGV2ZW5jaXJjbGU9OTMyMixlLmVsZXZlbnBhcmVuPTkzNDIsZS5lbGV2ZW5wZXJpb2Q9OTM2MixlLmVsZXZlbnJvbWFuPTg1NzAsZS5lbGxpcHNpcz04MjMwLGUuZWxsaXBzaXN2ZXJ0aWNhbD04OTQyLGUuZW1hY3Jvbj0yNzUsZS5lbWFjcm9uYWN1dGU9NzcwMyxlLmVtYWNyb25ncmF2ZT03NzAxLGUuZW1jeXJpbGxpYz0xMDg0LGUuZW1kYXNoPTgyMTIsZS5lbWRhc2h2ZXJ0aWNhbD02NTA3MyxlLmVtb25vc3BhY2U9NjUzNDksZS5lbXBoYXNpc21hcmthcm1lbmlhbj0xMzcxLGUuZW1wdHlzZXQ9ODcwOSxlLmVuYm9wb21vZm89MTI1NzksZS5lbmN5cmlsbGljPTEwODUsZS5lbmRhc2g9ODIxMSxlLmVuZGFzaHZlcnRpY2FsPTY1MDc0LGUuZW5kZXNjZW5kZXJjeXJpbGxpYz0xMTg3LGUuZW5nPTMzMSxlLmVuZ2JvcG9tb2ZvPTEyNTgxLGUuZW5naGVjeXJpbGxpYz0xMTg5LGUuZW5ob29rY3lyaWxsaWM9MTIyNCxlLmVuc3BhY2U9ODE5NCxlLmVvZ29uZWs9MjgxLGUuZW9rb3JlYW49MTI2MjcsZS5lb3Blbj02MDMsZS5lb3BlbmNsb3NlZD02NjYsZS5lb3BlbnJldmVyc2VkPTYwNCxlLmVvcGVucmV2ZXJzZWRjbG9zZWQ9NjA2LGUuZW9wZW5yZXZlcnNlZGhvb2s9NjA1LGUuZXBhcmVuPTkzNzYsZS5lcHNpbG9uPTk0OSxlLmVwc2lsb250b25vcz05NDEsZS5lcXVhbD02MSxlLmVxdWFsbW9ub3NwYWNlPTY1MzA5LGUuZXF1YWxzbWFsbD02NTEyNixlLmVxdWFsc3VwZXJpb3I9ODMxNixlLmVxdWl2YWxlbmNlPTg4MDEsZS5lcmJvcG9tb2ZvPTEyNTgyLGUuZXJjeXJpbGxpYz0xMDg4LGUuZXJldmVyc2VkPTYwMCxlLmVyZXZlcnNlZGN5cmlsbGljPTExMDEsZS5lc2N5cmlsbGljPTEwODksZS5lc2Rlc2NlbmRlcmN5cmlsbGljPTExOTUsZS5lc2g9NjQzLGUuZXNoY3VybD02NDYsZS5lc2hvcnRkZXZhPTIzMTgsZS5lc2hvcnR2b3dlbHNpZ25kZXZhPTIzNzQsZS5lc2hyZXZlcnNlZGxvb3A9NDI2LGUuZXNoc3F1YXRyZXZlcnNlZD02NDUsZS5lc21hbGxoaXJhZ2FuYT0xMjM1OSxlLmVzbWFsbGthdGFrYW5hPTEyNDU1LGUuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODYsZS5lc3RpbWF0ZWQ9ODQ5NCxlLmVzdXBlcmlvcj02MzIxMixlLmV0YT05NTEsZS5ldGFybWVuaWFuPTEzODQsZS5ldGF0b25vcz05NDIsZS5ldGg9MjQwLGUuZXRpbGRlPTc4NjksZS5ldGlsZGViZWxvdz03NzA3LGUuZXRuYWh0YWZvdWtoaGVicmV3PTE0MjUsZS5ldG5haHRhZm91a2hsZWZ0aGVicmV3PTE0MjUsZS5ldG5haHRhaGVicmV3PTE0MjUsZS5ldG5haHRhbGVmdGhlYnJldz0xNDI1LGUuZXR1cm5lZD00NzcsZS5ldWtvcmVhbj0xMjY0MSxlLmV1cm89ODM2NCxlLmV2b3dlbHNpZ25iZW5nYWxpPTI1MDMsZS5ldm93ZWxzaWduZGV2YT0yMzc1LGUuZXZvd2Vsc2lnbmd1amFyYXRpPTI3NTksZS5leGNsYW09MzMsZS5leGNsYW1hcm1lbmlhbj0xMzcyLGUuZXhjbGFtZGJsPTgyNTIsZS5leGNsYW1kb3duPTE2MSxlLmV4Y2xhbWRvd25zbWFsbD02MzM5MyxlLmV4Y2xhbW1vbm9zcGFjZT02NTI4MSxlLmV4Y2xhbXNtYWxsPTYzMjY1LGUuZXhpc3RlbnRpYWw9ODcwNyxlLmV6aD02NTgsZS5lemhjYXJvbj00OTUsZS5lemhjdXJsPTY1OSxlLmV6aHJldmVyc2VkPTQ0MSxlLmV6aHRhaWw9NDQyLGUuZj0xMDIsZS5mYWRldmE9MjM5OCxlLmZhZ3VybXVraGk9MjY1NCxlLmZhaHJlbmhlaXQ9ODQ1NyxlLmZhdGhhYXJhYmljPTE2MTQsZS5mYXRoYWxvd2FyYWJpYz0xNjE0LGUuZmF0aGF0YW5hcmFiaWM9MTYxMSxlLmZib3BvbW9mbz0xMjU1MixlLmZjaXJjbGU9OTQyOSxlLmZkb3RhY2NlbnQ9NzcxMSxlLmZlaGFyYWJpYz0xNjAxLGUuZmVoYXJtZW5pYW49MTQxNCxlLmZlaGZpbmFsYXJhYmljPTY1MjM0LGUuZmVoaW5pdGlhbGFyYWJpYz02NTIzNSxlLmZlaG1lZGlhbGFyYWJpYz02NTIzNixlLmZlaWNvcHRpYz05OTcsZS5mZW1hbGU9OTc5MixlLmZmPTY0MjU2LGUuZl9mPTY0MjU2LGUuZmZpPTY0MjU5LGUuZl9mX2k9NjQyNTksZS5mZmw9NjQyNjAsZS5mX2ZfbD02NDI2MCxlLmZpPTY0MjU3LGUuZl9pPTY0MjU3LGUuZmlmdGVlbmNpcmNsZT05MzI2LGUuZmlmdGVlbnBhcmVuPTkzNDYsZS5maWZ0ZWVucGVyaW9kPTkzNjYsZS5maWd1cmVkYXNoPTgyMTAsZS5maWxsZWRib3g9OTYzMixlLmZpbGxlZHJlY3Q9OTY0NCxlLmZpbmFsa2FmPTE0OTgsZS5maW5hbGthZmRhZ2VzaD02NDMxNCxlLmZpbmFsa2FmZGFnZXNoaGVicmV3PTY0MzE0LGUuZmluYWxrYWZoZWJyZXc9MTQ5OCxlLmZpbmFsbWVtPTE1MDEsZS5maW5hbG1lbWhlYnJldz0xNTAxLGUuZmluYWxudW49MTUwMyxlLmZpbmFsbnVuaGVicmV3PTE1MDMsZS5maW5hbHBlPTE1MDcsZS5maW5hbHBlaGVicmV3PTE1MDcsZS5maW5hbHRzYWRpPTE1MDksZS5maW5hbHRzYWRpaGVicmV3PTE1MDksZS5maXJzdHRvbmVjaGluZXNlPTcxMyxlLmZpc2hleWU9OTY3MyxlLmZpdGFjeXJpbGxpYz0xMTM5LGUuZml2ZT01MyxlLmZpdmVhcmFiaWM9MTYzNyxlLmZpdmViZW5nYWxpPTI1MzksZS5maXZlY2lyY2xlPTkzMTYsZS5maXZlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNixlLmZpdmVkZXZhPTI0MTEsZS5maXZlZWlnaHRocz04NTQxLGUuZml2ZWd1amFyYXRpPTI3OTUsZS5maXZlZ3VybXVraGk9MjY2NyxlLmZpdmVoYWNrYXJhYmljPTE2MzcsZS5maXZlaGFuZ3pob3U9MTIzMjUsZS5maXZlaWRlb2dyYXBoaWNwYXJlbj0xMjgzNixlLmZpdmVpbmZlcmlvcj04MzI1LGUuZml2ZW1vbm9zcGFjZT02NTMwMSxlLmZpdmVvbGRzdHlsZT02MzI4NSxlLmZpdmVwYXJlbj05MzM2LGUuZml2ZXBlcmlvZD05MzU2LGUuZml2ZXBlcnNpYW49MTc4MSxlLmZpdmVyb21hbj04NTY0LGUuZml2ZXN1cGVyaW9yPTgzMDksZS5maXZldGhhaT0zNjY5LGUuZmw9NjQyNTgsZS5mX2w9NjQyNTgsZS5mbG9yaW49NDAyLGUuZm1vbm9zcGFjZT02NTM1MCxlLmZtc3F1YXJlPTEzMjA5LGUuZm9mYW50aGFpPTM2MTUsZS5mb2ZhdGhhaT0zNjEzLGUuZm9uZ21hbnRoYWk9MzY2MyxlLmZvcmFsbD04NzA0LGUuZm91cj01MixlLmZvdXJhcmFiaWM9MTYzNixlLmZvdXJiZW5nYWxpPTI1MzgsZS5mb3VyY2lyY2xlPTkzMTUsZS5mb3VyY2lyY2xlaW52ZXJzZXNhbnNzZXJpZj0xMDEyNSxlLmZvdXJkZXZhPTI0MTAsZS5mb3VyZ3VqYXJhdGk9Mjc5NCxlLmZvdXJndXJtdWtoaT0yNjY2LGUuZm91cmhhY2thcmFiaWM9MTYzNixlLmZvdXJoYW5nemhvdT0xMjMyNCxlLmZvdXJpZGVvZ3JhcGhpY3BhcmVuPTEyODM1LGUuZm91cmluZmVyaW9yPTgzMjQsZS5mb3VybW9ub3NwYWNlPTY1MzAwLGUuZm91cm51bWVyYXRvcmJlbmdhbGk9MjU1MSxlLmZvdXJvbGRzdHlsZT02MzI4NCxlLmZvdXJwYXJlbj05MzM1LGUuZm91cnBlcmlvZD05MzU1LGUuZm91cnBlcnNpYW49MTc4MCxlLmZvdXJyb21hbj04NTYzLGUuZm91cnN1cGVyaW9yPTgzMDgsZS5mb3VydGVlbmNpcmNsZT05MzI1LGUuZm91cnRlZW5wYXJlbj05MzQ1LGUuZm91cnRlZW5wZXJpb2Q9OTM2NSxlLmZvdXJ0aGFpPTM2NjgsZS5mb3VydGh0b25lY2hpbmVzZT03MTUsZS5mcGFyZW49OTM3NyxlLmZyYWN0aW9uPTgyNjAsZS5mcmFuYz04MzU1LGUuZz0xMDMsZS5nYWJlbmdhbGk9MjQ1NSxlLmdhY3V0ZT01MDEsZS5nYWRldmE9MjMyNyxlLmdhZmFyYWJpYz0xNzExLGUuZ2FmZmluYWxhcmFiaWM9NjQ0MDMsZS5nYWZpbml0aWFsYXJhYmljPTY0NDA0LGUuZ2FmbWVkaWFsYXJhYmljPTY0NDA1LGUuZ2FndWphcmF0aT0yNzExLGUuZ2FndXJtdWtoaT0yNTgzLGUuZ2FoaXJhZ2FuYT0xMjM2NCxlLmdha2F0YWthbmE9MTI0NjAsZS5nYW1tYT05NDcsZS5nYW1tYWxhdGluc21hbGw9NjExLGUuZ2FtbWFzdXBlcmlvcj03MzYsZS5nYW5naWFjb3B0aWM9MTAwMyxlLmdib3BvbW9mbz0xMjU1NyxlLmdicmV2ZT0yODcsZS5nY2Fyb249NDg3LGUuZ2NlZGlsbGE9MjkxLGUuZ2NpcmNsZT05NDMwLGUuZ2NpcmN1bWZsZXg9Mjg1LGUuZ2NvbW1hYWNjZW50PTI5MSxlLmdkb3Q9Mjg5LGUuZ2RvdGFjY2VudD0yODksZS5nZWN5cmlsbGljPTEwNzUsZS5nZWhpcmFnYW5hPTEyMzcwLGUuZ2VrYXRha2FuYT0xMjQ2NixlLmdlb21ldHJpY2FsbHllcXVhbD04Nzg1LGUuZ2VyZXNoYWNjZW50aGVicmV3PTE0MzYsZS5nZXJlc2hoZWJyZXc9MTUyMyxlLmdlcmVzaG11cWRhbWhlYnJldz0xNDM3LGUuZ2VybWFuZGJscz0yMjMsZS5nZXJzaGF5aW1hY2NlbnRoZWJyZXc9MTQzOCxlLmdlcnNoYXlpbWhlYnJldz0xNTI0LGUuZ2V0YW1hcms9MTIzMDcsZS5naGFiZW5nYWxpPTI0NTYsZS5naGFkYXJtZW5pYW49MTM5NCxlLmdoYWRldmE9MjMyOCxlLmdoYWd1amFyYXRpPTI3MTIsZS5naGFndXJtdWtoaT0yNTg0LGUuZ2hhaW5hcmFiaWM9MTU5NCxlLmdoYWluZmluYWxhcmFiaWM9NjUyMzAsZS5naGFpbmluaXRpYWxhcmFiaWM9NjUyMzEsZS5naGFpbm1lZGlhbGFyYWJpYz02NTIzMixlLmdoZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTczLGUuZ2hlc3Ryb2tlY3lyaWxsaWM9MTE3MSxlLmdoZXVwdHVybmN5cmlsbGljPTExNjksZS5naGhhZGV2YT0yMzk0LGUuZ2hoYWd1cm11a2hpPTI2NTAsZS5naG9vaz02MDgsZS5naHpzcXVhcmU9MTMyMDMsZS5naWhpcmFnYW5hPTEyMzY2LGUuZ2lrYXRha2FuYT0xMjQ2MixlLmdpbWFybWVuaWFuPTEzNzksZS5naW1lbD0xNDkwLGUuZ2ltZWxkYWdlc2g9NjQzMDYsZS5naW1lbGRhZ2VzaGhlYnJldz02NDMwNixlLmdpbWVsaGVicmV3PTE0OTAsZS5namVjeXJpbGxpYz0xMTA3LGUuZ2xvdHRhbGludmVydGVkc3Ryb2tlPTQ0NixlLmdsb3R0YWxzdG9wPTY2MCxlLmdsb3R0YWxzdG9waW52ZXJ0ZWQ9NjYyLGUuZ2xvdHRhbHN0b3Btb2Q9NzA0LGUuZ2xvdHRhbHN0b3ByZXZlcnNlZD02NjEsZS5nbG90dGFsc3RvcHJldmVyc2VkbW9kPTcwNSxlLmdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvcj03NDAsZS5nbG90dGFsc3RvcHN0cm9rZT02NzMsZS5nbG90dGFsc3RvcHN0cm9rZXJldmVyc2VkPTY3NCxlLmdtYWNyb249NzcxMyxlLmdtb25vc3BhY2U9NjUzNTEsZS5nb2hpcmFnYW5hPTEyMzcyLGUuZ29rYXRha2FuYT0xMjQ2OCxlLmdwYXJlbj05Mzc4LGUuZ3Bhc3F1YXJlPTEzMjI4LGUuZ3JhZGllbnQ9ODcxMSxlLmdyYXZlPTk2LGUuZ3JhdmViZWxvd2NtYj03OTAsZS5ncmF2ZWNtYj03NjgsZS5ncmF2ZWNvbWI9NzY4LGUuZ3JhdmVkZXZhPTIzODcsZS5ncmF2ZWxvd21vZD03MTgsZS5ncmF2ZW1vbm9zcGFjZT02NTM0NCxlLmdyYXZldG9uZWNtYj04MzIsZS5ncmVhdGVyPTYyLGUuZ3JlYXRlcmVxdWFsPTg4MDUsZS5ncmVhdGVyZXF1YWxvcmxlc3M9ODkyMyxlLmdyZWF0ZXJtb25vc3BhY2U9NjUzMTAsZS5ncmVhdGVyb3JlcXVpdmFsZW50PTg4MTksZS5ncmVhdGVyb3JsZXNzPTg4MjMsZS5ncmVhdGVyb3ZlcmVxdWFsPTg4MDcsZS5ncmVhdGVyc21hbGw9NjUxMjUsZS5nc2NyaXB0PTYwOSxlLmdzdHJva2U9NDg1LGUuZ3VoaXJhZ2FuYT0xMjM2OCxlLmd1aWxsZW1vdGxlZnQ9MTcxLGUuZ3VpbGxlbW90cmlnaHQ9MTg3LGUuZ3VpbHNpbmdsbGVmdD04MjQ5LGUuZ3VpbHNpbmdscmlnaHQ9ODI1MCxlLmd1a2F0YWthbmE9MTI0NjQsZS5ndXJhbXVzcXVhcmU9MTMwODAsZS5neXNxdWFyZT0xMzI1NyxlLmg9MTA0LGUuaGFhYmtoYXNpYW5jeXJpbGxpYz0xMTkzLGUuaGFhbHRvbmVhcmFiaWM9MTcyOSxlLmhhYmVuZ2FsaT0yNDg5LGUuaGFkZXNjZW5kZXJjeXJpbGxpYz0xMjAzLGUuaGFkZXZhPTIzNjEsZS5oYWd1amFyYXRpPTI3NDUsZS5oYWd1cm11a2hpPTI2MTcsZS5oYWhhcmFiaWM9MTU4MSxlLmhhaGZpbmFsYXJhYmljPTY1MTg2LGUuaGFoaW5pdGlhbGFyYWJpYz02NTE4NyxlLmhhaGlyYWdhbmE9MTIzOTksZS5oYWhtZWRpYWxhcmFiaWM9NjUxODgsZS5oYWl0dXNxdWFyZT0xMzA5OCxlLmhha2F0YWthbmE9MTI0OTUsZS5oYWthdGFrYW5haGFsZndpZHRoPTY1NDE4LGUuaGFsYW50Z3VybXVraGk9MjYzNyxlLmhhbXphYXJhYmljPTE1NjksZS5oYW16YWxvd2FyYWJpYz0xNTY5LGUuaGFuZ3VsZmlsbGVyPTEyNjQ0LGUuaGFyZHNpZ25jeXJpbGxpYz0xMDk4LGUuaGFycG9vbmxlZnRiYXJidXA9ODYzNixlLmhhcnBvb25yaWdodGJhcmJ1cD04NjQwLGUuaGFzcXVhcmU9MTMyNTgsZS5oYXRhZnBhdGFoPTE0NTgsZS5oYXRhZnBhdGFoMTY9MTQ1OCxlLmhhdGFmcGF0YWgyMz0xNDU4LGUuaGF0YWZwYXRhaDJmPTE0NTgsZS5oYXRhZnBhdGFoaGVicmV3PTE0NTgsZS5oYXRhZnBhdGFobmFycm93aGVicmV3PTE0NTgsZS5oYXRhZnBhdGFocXVhcnRlcmhlYnJldz0xNDU4LGUuaGF0YWZwYXRhaHdpZGVoZWJyZXc9MTQ1OCxlLmhhdGFmcWFtYXRzPTE0NTksZS5oYXRhZnFhbWF0czFiPTE0NTksZS5oYXRhZnFhbWF0czI4PTE0NTksZS5oYXRhZnFhbWF0czM0PTE0NTksZS5oYXRhZnFhbWF0c2hlYnJldz0xNDU5LGUuaGF0YWZxYW1hdHNuYXJyb3doZWJyZXc9MTQ1OSxlLmhhdGFmcWFtYXRzcXVhcnRlcmhlYnJldz0xNDU5LGUuaGF0YWZxYW1hdHN3aWRlaGVicmV3PTE0NTksZS5oYXRhZnNlZ29sPTE0NTcsZS5oYXRhZnNlZ29sMTc9MTQ1NyxlLmhhdGFmc2Vnb2wyND0xNDU3LGUuaGF0YWZzZWdvbDMwPTE0NTcsZS5oYXRhZnNlZ29saGVicmV3PTE0NTcsZS5oYXRhZnNlZ29sbmFycm93aGVicmV3PTE0NTcsZS5oYXRhZnNlZ29scXVhcnRlcmhlYnJldz0xNDU3LGUuaGF0YWZzZWdvbHdpZGVoZWJyZXc9MTQ1NyxlLmhiYXI9Mjk1LGUuaGJvcG9tb2ZvPTEyNTU5LGUuaGJyZXZlYmVsb3c9NzcyMyxlLmhjZWRpbGxhPTc3MjEsZS5oY2lyY2xlPTk0MzEsZS5oY2lyY3VtZmxleD0yOTMsZS5oZGllcmVzaXM9NzcxOSxlLmhkb3RhY2NlbnQ9NzcxNSxlLmhkb3RiZWxvdz03NzE3LGUuaGU9MTQ5MixlLmhlYXJ0PTk4MjksZS5oZWFydHN1aXRibGFjaz05ODI5LGUuaGVhcnRzdWl0d2hpdGU9OTgyNSxlLmhlZGFnZXNoPTY0MzA4LGUuaGVkYWdlc2hoZWJyZXc9NjQzMDgsZS5oZWhhbHRvbmVhcmFiaWM9MTcyOSxlLmhlaGFyYWJpYz0xNjA3LGUuaGVoZWJyZXc9MTQ5MixlLmhlaGZpbmFsYWx0b25lYXJhYmljPTY0NDIzLGUuaGVoZmluYWxhbHR0d29hcmFiaWM9NjUyNTgsZS5oZWhmaW5hbGFyYWJpYz02NTI1OCxlLmhlaGhhbXphYWJvdmVmaW5hbGFyYWJpYz02NDQyMSxlLmhlaGhhbXphYWJvdmVpc29sYXRlZGFyYWJpYz02NDQyMCxlLmhlaGluaXRpYWxhbHRvbmVhcmFiaWM9NjQ0MjQsZS5oZWhpbml0aWFsYXJhYmljPTY1MjU5LGUuaGVoaXJhZ2FuYT0xMjQwOCxlLmhlaG1lZGlhbGFsdG9uZWFyYWJpYz02NDQyNSxlLmhlaG1lZGlhbGFyYWJpYz02NTI2MCxlLmhlaXNlaWVyYXNxdWFyZT0xMzE3OSxlLmhla2F0YWthbmE9MTI1MDQsZS5oZWthdGFrYW5haGFsZndpZHRoPTY1NDIxLGUuaGVrdXRhYXJ1c3F1YXJlPTEzMTEwLGUuaGVuZ2hvb2s9NjE1LGUuaGVydXR1c3F1YXJlPTEzMTEzLGUuaGV0PTE0OTUsZS5oZXRoZWJyZXc9MTQ5NSxlLmhob29rPTYxNCxlLmhob29rc3VwZXJpb3I9Njg5LGUuaGlldWhhY2lyY2xla29yZWFuPTEyOTIzLGUuaGlldWhhcGFyZW5rb3JlYW49MTI4MjcsZS5oaWV1aGNpcmNsZWtvcmVhbj0xMjkwOSxlLmhpZXVoa29yZWFuPTEyNjIyLGUuaGlldWhwYXJlbmtvcmVhbj0xMjgxMyxlLmhpaGlyYWdhbmE9MTI0MDIsZS5oaWthdGFrYW5hPTEyNDk4LGUuaGlrYXRha2FuYWhhbGZ3aWR0aD02NTQxOSxlLmhpcmlxPTE0NjAsZS5oaXJpcTE0PTE0NjAsZS5oaXJpcTIxPTE0NjAsZS5oaXJpcTJkPTE0NjAsZS5oaXJpcWhlYnJldz0xNDYwLGUuaGlyaXFuYXJyb3doZWJyZXc9MTQ2MCxlLmhpcmlxcXVhcnRlcmhlYnJldz0xNDYwLGUuaGlyaXF3aWRlaGVicmV3PTE0NjAsZS5obGluZWJlbG93PTc4MzAsZS5obW9ub3NwYWNlPTY1MzUyLGUuaG9hcm1lbmlhbj0xMzkyLGUuaG9oaXB0aGFpPTM2MjcsZS5ob2hpcmFnYW5hPTEyNDExLGUuaG9rYXRha2FuYT0xMjUwNyxlLmhva2F0YWthbmFoYWxmd2lkdGg9NjU0MjIsZS5ob2xhbT0xNDY1LGUuaG9sYW0xOT0xNDY1LGUuaG9sYW0yNj0xNDY1LGUuaG9sYW0zMj0xNDY1LGUuaG9sYW1oZWJyZXc9MTQ2NSxlLmhvbGFtbmFycm93aGVicmV3PTE0NjUsZS5ob2xhbXF1YXJ0ZXJoZWJyZXc9MTQ2NSxlLmhvbGFtd2lkZWhlYnJldz0xNDY1LGUuaG9ub2todWt0aGFpPTM2MzAsZS5ob29rYWJvdmVjb21iPTc3NyxlLmhvb2tjbWI9Nzc3LGUuaG9va3BhbGF0YWxpemVkYmVsb3djbWI9ODAxLGUuaG9va3JldHJvZmxleGJlbG93Y21iPTgwMixlLmhvb25zcXVhcmU9MTMxMjIsZS5ob3JpY29wdGljPTEwMDEsZS5ob3Jpem9udGFsYmFyPTgyMTMsZS5ob3JuY21iPTc5NSxlLmhvdHNwcmluZ3M9OTgzMixlLmhvdXNlPTg5NjIsZS5ocGFyZW49OTM3OSxlLmhzdXBlcmlvcj02ODgsZS5odHVybmVkPTYxMyxlLmh1aGlyYWdhbmE9MTI0MDUsZS5odWlpdG9zcXVhcmU9MTMxMDcsZS5odWthdGFrYW5hPTEyNTAxLGUuaHVrYXRha2FuYWhhbGZ3aWR0aD02NTQyMCxlLmh1bmdhcnVtbGF1dD03MzMsZS5odW5nYXJ1bWxhdXRjbWI9Nzc5LGUuaHY9NDA1LGUuaHlwaGVuPTQ1LGUuaHlwaGVuaW5mZXJpb3I9NjMyMDUsZS5oeXBoZW5tb25vc3BhY2U9NjUyOTMsZS5oeXBoZW5zbWFsbD02NTEyMyxlLmh5cGhlbnN1cGVyaW9yPTYzMjA2LGUuaHlwaGVudHdvPTgyMDgsZS5pPTEwNSxlLmlhY3V0ZT0yMzcsZS5pYWN5cmlsbGljPTExMDMsZS5pYmVuZ2FsaT0yNDM5LGUuaWJvcG9tb2ZvPTEyNTgzLGUuaWJyZXZlPTMwMSxlLmljYXJvbj00NjQsZS5pY2lyY2xlPTk0MzIsZS5pY2lyY3VtZmxleD0yMzgsZS5pY3lyaWxsaWM9MTExMCxlLmlkYmxncmF2ZT01MjEsZS5pZGVvZ3JhcGhlYXJ0aGNpcmNsZT0xMjk0MyxlLmlkZW9ncmFwaGZpcmVjaXJjbGU9MTI5MzksZS5pZGVvZ3JhcGhpY2FsbGlhbmNlcGFyZW49MTI4NjMsZS5pZGVvZ3JhcGhpY2NhbGxwYXJlbj0xMjg1OCxlLmlkZW9ncmFwaGljY2VudHJlY2lyY2xlPTEyOTY1LGUuaWRlb2dyYXBoaWNjbG9zZT0xMjI5NCxlLmlkZW9ncmFwaGljY29tbWE9MTIyODksZS5pZGVvZ3JhcGhpY2NvbW1hbGVmdD02NTM4MCxlLmlkZW9ncmFwaGljY29uZ3JhdHVsYXRpb25wYXJlbj0xMjg1NSxlLmlkZW9ncmFwaGljY29ycmVjdGNpcmNsZT0xMjk2MyxlLmlkZW9ncmFwaGljZWFydGhwYXJlbj0xMjg0NyxlLmlkZW9ncmFwaGljZW50ZXJwcmlzZXBhcmVuPTEyODYxLGUuaWRlb2dyYXBoaWNleGNlbGxlbnRjaXJjbGU9MTI5NTcsZS5pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW49MTI4NjQsZS5pZGVvZ3JhcGhpY2ZpbmFuY2lhbGNpcmNsZT0xMjk1MCxlLmlkZW9ncmFwaGljZmluYW5jaWFscGFyZW49MTI4NTQsZS5pZGVvZ3JhcGhpY2ZpcmVwYXJlbj0xMjg0MyxlLmlkZW9ncmFwaGljaGF2ZXBhcmVuPTEyODUwLGUuaWRlb2dyYXBoaWNoaWdoY2lyY2xlPTEyOTY0LGUuaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrPTEyMjkzLGUuaWRlb2dyYXBoaWNsYWJvcmNpcmNsZT0xMjk1MixlLmlkZW9ncmFwaGljbGFib3JwYXJlbj0xMjg1NixlLmlkZW9ncmFwaGljbGVmdGNpcmNsZT0xMjk2NyxlLmlkZW9ncmFwaGljbG93Y2lyY2xlPTEyOTY2LGUuaWRlb2dyYXBoaWNtZWRpY2luZWNpcmNsZT0xMjk2OSxlLmlkZW9ncmFwaGljbWV0YWxwYXJlbj0xMjg0NixlLmlkZW9ncmFwaGljbW9vbnBhcmVuPTEyODQyLGUuaWRlb2dyYXBoaWNuYW1lcGFyZW49MTI4NTIsZS5pZGVvZ3JhcGhpY3BlcmlvZD0xMjI5MCxlLmlkZW9ncmFwaGljcHJpbnRjaXJjbGU9MTI5NTgsZS5pZGVvZ3JhcGhpY3JlYWNocGFyZW49MTI4NjcsZS5pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuPTEyODU3LGUuaWRlb2dyYXBoaWNyZXNvdXJjZXBhcmVuPTEyODYyLGUuaWRlb2dyYXBoaWNyaWdodGNpcmNsZT0xMjk2OCxlLmlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlPTEyOTUzLGUuaWRlb2dyYXBoaWNzZWxmcGFyZW49MTI4NjYsZS5pZGVvZ3JhcGhpY3NvY2lldHlwYXJlbj0xMjg1MSxlLmlkZW9ncmFwaGljc3BhY2U9MTIyODgsZS5pZGVvZ3JhcGhpY3NwZWNpYWxwYXJlbj0xMjg1MyxlLmlkZW9ncmFwaGljc3RvY2twYXJlbj0xMjg0OSxlLmlkZW9ncmFwaGljc3R1ZHlwYXJlbj0xMjg1OSxlLmlkZW9ncmFwaGljc3VucGFyZW49MTI4NDgsZS5pZGVvZ3JhcGhpY3N1cGVydmlzZXBhcmVuPTEyODYwLGUuaWRlb2dyYXBoaWN3YXRlcnBhcmVuPTEyODQ0LGUuaWRlb2dyYXBoaWN3b29kcGFyZW49MTI4NDUsZS5pZGVvZ3JhcGhpY3plcm89MTIyOTUsZS5pZGVvZ3JhcGhtZXRhbGNpcmNsZT0xMjk0MixlLmlkZW9ncmFwaG1vb25jaXJjbGU9MTI5MzgsZS5pZGVvZ3JhcGhuYW1lY2lyY2xlPTEyOTQ4LGUuaWRlb2dyYXBoc3VuY2lyY2xlPTEyOTQ0LGUuaWRlb2dyYXBod2F0ZXJjaXJjbGU9MTI5NDAsZS5pZGVvZ3JhcGh3b29kY2lyY2xlPTEyOTQxLGUuaWRldmE9MjMxMSxlLmlkaWVyZXNpcz0yMzksZS5pZGllcmVzaXNhY3V0ZT03NzI3LGUuaWRpZXJlc2lzY3lyaWxsaWM9MTI1MyxlLmlkb3RiZWxvdz03ODgzLGUuaWVicmV2ZWN5cmlsbGljPTEyMzksZS5pZWN5cmlsbGljPTEwNzcsZS5pZXVuZ2FjaXJjbGVrb3JlYW49MTI5MTcsZS5pZXVuZ2FwYXJlbmtvcmVhbj0xMjgyMSxlLmlldW5nY2lyY2xla29yZWFuPTEyOTAzLGUuaWV1bmdrb3JlYW49MTI2MTUsZS5pZXVuZ3BhcmVua29yZWFuPTEyODA3LGUuaWdyYXZlPTIzNixlLmlndWphcmF0aT0yNjk1LGUuaWd1cm11a2hpPTI1NjcsZS5paGlyYWdhbmE9MTIzNTYsZS5paG9va2Fib3ZlPTc4ODEsZS5paWJlbmdhbGk9MjQ0MCxlLmlpY3lyaWxsaWM9MTA4MCxlLmlpZGV2YT0yMzEyLGUuaWlndWphcmF0aT0yNjk2LGUuaWlndXJtdWtoaT0yNTY4LGUuaWltYXRyYWd1cm11a2hpPTI2MjQsZS5paW52ZXJ0ZWRicmV2ZT01MjMsZS5paXNob3J0Y3lyaWxsaWM9MTA4MSxlLmlpdm93ZWxzaWduYmVuZ2FsaT0yNDk2LGUuaWl2b3dlbHNpZ25kZXZhPTIzNjgsZS5paXZvd2Vsc2lnbmd1amFyYXRpPTI3NTIsZS5paj0zMDcsZS5pa2F0YWthbmE9MTI0NTIsZS5pa2F0YWthbmFoYWxmd2lkdGg9NjUzOTQsZS5pa29yZWFuPTEyNjQzLGUuaWxkZT03MzIsZS5pbHV5aGVicmV3PTE0NTIsZS5pbWFjcm9uPTI5OSxlLmltYWNyb25jeXJpbGxpYz0xMjUxLGUuaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbD04Nzg3LGUuaW1hdHJhZ3VybXVraGk9MjYyMyxlLmltb25vc3BhY2U9NjUzNTMsZS5pbmNyZW1lbnQ9ODcxMCxlLmluZmluaXR5PTg3MzQsZS5pbmlhcm1lbmlhbj0xMzg3LGUuaW50ZWdyYWw9ODc0NyxlLmludGVncmFsYm90dG9tPTg5OTMsZS5pbnRlZ3JhbGJ0PTg5OTMsZS5pbnRlZ3JhbGV4PTYzNzMzLGUuaW50ZWdyYWx0b3A9ODk5MixlLmludGVncmFsdHA9ODk5MixlLmludGVyc2VjdGlvbj04NzQ1LGUuaW50aXNxdWFyZT0xMzA2MSxlLmludmJ1bGxldD05Njg4LGUuaW52Y2lyY2xlPTk2ODksZS5pbnZzbWlsZWZhY2U9OTc4NyxlLmlvY3lyaWxsaWM9MTEwNSxlLmlvZ29uZWs9MzAzLGUuaW90YT05NTMsZS5pb3RhZGllcmVzaXM9OTcwLGUuaW90YWRpZXJlc2lzdG9ub3M9OTEyLGUuaW90YWxhdGluPTYxNyxlLmlvdGF0b25vcz05NDMsZS5pcGFyZW49OTM4MCxlLmlyaWd1cm11a2hpPTI2NzQsZS5pc21hbGxoaXJhZ2FuYT0xMjM1NSxlLmlzbWFsbGthdGFrYW5hPTEyNDUxLGUuaXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODQsZS5pc3NoYXJiZW5nYWxpPTI1NTQsZS5pc3Ryb2tlPTYxNixlLmlzdXBlcmlvcj02MzIxMyxlLml0ZXJhdGlvbmhpcmFnYW5hPTEyNDQ1LGUuaXRlcmF0aW9ua2F0YWthbmE9MTI1NDEsZS5pdGlsZGU9Mjk3LGUuaXRpbGRlYmVsb3c9NzcyNSxlLml1Ym9wb21vZm89MTI1ODUsZS5pdWN5cmlsbGljPTExMDIsZS5pdm93ZWxzaWduYmVuZ2FsaT0yNDk1LGUuaXZvd2Vsc2lnbmRldmE9MjM2NyxlLml2b3dlbHNpZ25ndWphcmF0aT0yNzUxLGUuaXpoaXRzYWN5cmlsbGljPTExNDEsZS5pemhpdHNhZGJsZ3JhdmVjeXJpbGxpYz0xMTQzLGUuaj0xMDYsZS5qYWFybWVuaWFuPTEzOTMsZS5qYWJlbmdhbGk9MjQ2MCxlLmphZGV2YT0yMzMyLGUuamFndWphcmF0aT0yNzE2LGUuamFndXJtdWtoaT0yNTg4LGUuamJvcG9tb2ZvPTEyNTYwLGUuamNhcm9uPTQ5NixlLmpjaXJjbGU9OTQzMyxlLmpjaXJjdW1mbGV4PTMwOSxlLmpjcm9zc2VkdGFpbD02NjksZS5qZG90bGVzc3N0cm9rZT02MDcsZS5qZWN5cmlsbGljPTExMTIsZS5qZWVtYXJhYmljPTE1ODAsZS5qZWVtZmluYWxhcmFiaWM9NjUxODIsZS5qZWVtaW5pdGlhbGFyYWJpYz02NTE4MyxlLmplZW1tZWRpYWxhcmFiaWM9NjUxODQsZS5qZWhhcmFiaWM9MTY4OCxlLmplaGZpbmFsYXJhYmljPTY0Mzk1LGUuamhhYmVuZ2FsaT0yNDYxLGUuamhhZGV2YT0yMzMzLGUuamhhZ3VqYXJhdGk9MjcxNyxlLmpoYWd1cm11a2hpPTI1ODksZS5qaGVoYXJtZW5pYW49MTQwMyxlLmppcz0xMjI5MixlLmptb25vc3BhY2U9NjUzNTQsZS5qcGFyZW49OTM4MSxlLmpzdXBlcmlvcj02OTAsZS5rPTEwNyxlLmthYmFzaGtpcmN5cmlsbGljPTExODUsZS5rYWJlbmdhbGk9MjQ1MyxlLmthY3V0ZT03NzI5LGUua2FjeXJpbGxpYz0xMDgyLGUua2FkZXNjZW5kZXJjeXJpbGxpYz0xMTc5LGUua2FkZXZhPTIzMjUsZS5rYWY9MTQ5OSxlLmthZmFyYWJpYz0xNjAzLGUua2FmZGFnZXNoPTY0MzE1LGUua2FmZGFnZXNoaGVicmV3PTY0MzE1LGUua2FmZmluYWxhcmFiaWM9NjUyNDIsZS5rYWZoZWJyZXc9MTQ5OSxlLmthZmluaXRpYWxhcmFiaWM9NjUyNDMsZS5rYWZtZWRpYWxhcmFiaWM9NjUyNDQsZS5rYWZyYWZlaGVicmV3PTY0MzMzLGUua2FndWphcmF0aT0yNzA5LGUua2FndXJtdWtoaT0yNTgxLGUua2FoaXJhZ2FuYT0xMjM2MyxlLmthaG9va2N5cmlsbGljPTEyMjAsZS5rYWthdGFrYW5hPTEyNDU5LGUua2FrYXRha2FuYWhhbGZ3aWR0aD02NTM5OCxlLmthcHBhPTk1NCxlLmthcHBhc3ltYm9sZ3JlZWs9MTAwOCxlLmthcHllb3VubWlldW1rb3JlYW49MTI2NTcsZS5rYXB5ZW91bnBoaWV1cGhrb3JlYW49MTI2NzYsZS5rYXB5ZW91bnBpZXVwa29yZWFuPTEyNjY0LGUua2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuPTEyNjY1LGUua2Fyb3JpaXNxdWFyZT0xMzA2OSxlLmthc2hpZGFhdXRvYXJhYmljPTE2MDAsZS5rYXNoaWRhYXV0b25vc2lkZWJlYXJpbmdhcmFiaWM9MTYwMCxlLmthc21hbGxrYXRha2FuYT0xMjUzMyxlLmthc3F1YXJlPTEzMTg4LGUua2FzcmFhcmFiaWM9MTYxNixlLmthc3JhdGFuYXJhYmljPTE2MTMsZS5rYXN0cm9rZWN5cmlsbGljPTExODMsZS5rYXRhaGlyYXByb2xvbmdtYXJraGFsZndpZHRoPTY1MzkyLGUua2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljPTExODEsZS5rYm9wb21vZm89MTI1NTgsZS5rY2Fsc3F1YXJlPTEzMTkzLGUua2Nhcm9uPTQ4OSxlLmtjZWRpbGxhPTMxMSxlLmtjaXJjbGU9OTQzNCxlLmtjb21tYWFjY2VudD0zMTEsZS5rZG90YmVsb3c9NzczMSxlLmtlaGFybWVuaWFuPTE0MTIsZS5rZWhpcmFnYW5hPTEyMzY5LGUua2VrYXRha2FuYT0xMjQ2NSxlLmtla2F0YWthbmFoYWxmd2lkdGg9NjU0MDEsZS5rZW5hcm1lbmlhbj0xMzkxLGUua2VzbWFsbGthdGFrYW5hPTEyNTM0LGUua2dyZWVubGFuZGljPTMxMixlLmtoYWJlbmdhbGk9MjQ1NCxlLmtoYWN5cmlsbGljPTEwOTMsZS5raGFkZXZhPTIzMjYsZS5raGFndWphcmF0aT0yNzEwLGUua2hhZ3VybXVraGk9MjU4MixlLmtoYWhhcmFiaWM9MTU4MixlLmtoYWhmaW5hbGFyYWJpYz02NTE5MCxlLmtoYWhpbml0aWFsYXJhYmljPTY1MTkxLGUua2hhaG1lZGlhbGFyYWJpYz02NTE5MixlLmtoZWljb3B0aWM9OTk5LGUua2hoYWRldmE9MjM5MyxlLmtoaGFndXJtdWtoaT0yNjQ5LGUua2hpZXVraGFjaXJjbGVrb3JlYW49MTI5MjAsZS5raGlldWtoYXBhcmVua29yZWFuPTEyODI0LGUua2hpZXVraGNpcmNsZWtvcmVhbj0xMjkwNixlLmtoaWV1a2hrb3JlYW49MTI2MTksZS5raGlldWtocGFyZW5rb3JlYW49MTI4MTAsZS5raG9raGFpdGhhaT0zNTg2LGUua2hva2hvbnRoYWk9MzU4OSxlLmtob2todWF0dGhhaT0zNTg3LGUua2hva2h3YWl0aGFpPTM1ODgsZS5raG9tdXR0aGFpPTM2NzUsZS5raG9vaz00MDksZS5raG9yYWtoYW5ndGhhaT0zNTkwLGUua2h6c3F1YXJlPTEzMjAxLGUua2loaXJhZ2FuYT0xMjM2NSxlLmtpa2F0YWthbmE9MTI0NjEsZS5raWthdGFrYW5haGFsZndpZHRoPTY1Mzk5LGUua2lyb2d1cmFtdXNxdWFyZT0xMzA3NyxlLmtpcm9tZWV0b3J1c3F1YXJlPTEzMDc4LGUua2lyb3NxdWFyZT0xMzA3NixlLmtpeWVva2FjaXJjbGVrb3JlYW49MTI5MTAsZS5raXllb2thcGFyZW5rb3JlYW49MTI4MTQsZS5raXllb2tjaXJjbGVrb3JlYW49MTI4OTYsZS5raXllb2trb3JlYW49MTI1OTMsZS5raXllb2twYXJlbmtvcmVhbj0xMjgwMCxlLmtpeWVva3Npb3Nrb3JlYW49MTI1OTU7ZS5ramVjeXJpbGxpYz0xMTE2LGUua2xpbmViZWxvdz03NzMzLGUua2xzcXVhcmU9MTMyMDgsZS5rbWN1YmVkc3F1YXJlPTEzMjIyLGUua21vbm9zcGFjZT02NTM1NSxlLmttc3F1YXJlZHNxdWFyZT0xMzIxOCxlLmtvaGlyYWdhbmE9MTIzNzEsZS5rb2htc3F1YXJlPTEzMjQ4LGUua29rYWl0aGFpPTM1ODUsZS5rb2thdGFrYW5hPTEyNDY3LGUua29rYXRha2FuYWhhbGZ3aWR0aD02NTQwMixlLmtvb3Bvc3F1YXJlPTEzMDg2LGUua29wcGFjeXJpbGxpYz0xMTUzLGUua29yZWFuc3RhbmRhcmRzeW1ib2w9MTI5MjcsZS5rb3JvbmlzY21iPTgzNSxlLmtwYXJlbj05MzgyLGUua3Bhc3F1YXJlPTEzMjI2LGUua3NpY3lyaWxsaWM9MTEzNSxlLmt0c3F1YXJlPTEzMjYzLGUua3R1cm5lZD02NzAsZS5rdWhpcmFnYW5hPTEyMzY3LGUua3VrYXRha2FuYT0xMjQ2MyxlLmt1a2F0YWthbmFoYWxmd2lkdGg9NjU0MDAsZS5rdnNxdWFyZT0xMzI0MCxlLmt3c3F1YXJlPTEzMjQ2LGUubD0xMDgsZS5sYWJlbmdhbGk9MjQ4MixlLmxhY3V0ZT0zMTQsZS5sYWRldmE9MjM1NCxlLmxhZ3VqYXJhdGk9MjczOCxlLmxhZ3VybXVraGk9MjYxMCxlLmxha2toYW5neWFvdGhhaT0zNjUzLGUubGFtYWxlZmZpbmFsYXJhYmljPTY1Mjc2LGUubGFtYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYz02NTI3MixlLmxhbWFsZWZoYW16YWFib3ZlaXNvbGF0ZWRhcmFiaWM9NjUyNzEsZS5sYW1hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljPTY1Mjc0LGUubGFtYWxlZmhhbXphYmVsb3dpc29sYXRlZGFyYWJpYz02NTI3MyxlLmxhbWFsZWZpc29sYXRlZGFyYWJpYz02NTI3NSxlLmxhbWFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWM9NjUyNzAsZS5sYW1hbGVmbWFkZGFhYm92ZWlzb2xhdGVkYXJhYmljPTY1MjY5LGUubGFtYXJhYmljPTE2MDQsZS5sYW1iZGE9OTU1LGUubGFtYmRhc3Ryb2tlPTQxMSxlLmxhbWVkPTE1MDAsZS5sYW1lZGRhZ2VzaD02NDMxNixlLmxhbWVkZGFnZXNoaGVicmV3PTY0MzE2LGUubGFtZWRoZWJyZXc9MTUwMCxlLmxhbWZpbmFsYXJhYmljPTY1MjQ2LGUubGFtaGFoaW5pdGlhbGFyYWJpYz02NDcxNCxlLmxhbWluaXRpYWxhcmFiaWM9NjUyNDcsZS5sYW1qZWVtaW5pdGlhbGFyYWJpYz02NDcxMyxlLmxhbWtoYWhpbml0aWFsYXJhYmljPTY0NzE1LGUubGFtbGFtaGVoaXNvbGF0ZWRhcmFiaWM9NjUwMTAsZS5sYW1tZWRpYWxhcmFiaWM9NjUyNDgsZS5sYW1tZWVtaGFoaW5pdGlhbGFyYWJpYz02NDkwNCxlLmxhbW1lZW1pbml0aWFsYXJhYmljPTY0NzE2LGUubGFyZ2VjaXJjbGU9OTcxMSxlLmxiYXI9NDEwLGUubGJlbHQ9NjIwLGUubGJvcG9tb2ZvPTEyNTU2LGUubGNhcm9uPTMxOCxlLmxjZWRpbGxhPTMxNixlLmxjaXJjbGU9OTQzNSxlLmxjaXJjdW1mbGV4YmVsb3c9Nzc0MSxlLmxjb21tYWFjY2VudD0zMTYsZS5sZG90PTMyMCxlLmxkb3RhY2NlbnQ9MzIwLGUubGRvdGJlbG93PTc3MzUsZS5sZG90YmVsb3dtYWNyb249NzczNyxlLmxlZnRhbmdsZWFib3ZlY21iPTc5NCxlLmxlZnR0YWNrYmVsb3djbWI9NzkyLGUubGVzcz02MCxlLmxlc3NlcXVhbD04ODA0LGUubGVzc2VxdWFsb3JncmVhdGVyPTg5MjIsZS5sZXNzbW9ub3NwYWNlPTY1MzA4LGUubGVzc29yZXF1aXZhbGVudD04ODE4LGUubGVzc29yZ3JlYXRlcj04ODIyLGUubGVzc292ZXJlcXVhbD04ODA2LGUubGVzc3NtYWxsPTY1MTI0LGUubGV6aD02MjIsZS5sZmJsb2NrPTk2MTIsZS5saG9va3JldHJvZmxleD02MjEsZS5saXJhPTgzNTYsZS5saXduYXJtZW5pYW49MTM4OCxlLmxqPTQ1NyxlLmxqZWN5cmlsbGljPTExMTMsZS5sbD02MzE2OCxlLmxsYWRldmE9MjM1NSxlLmxsYWd1amFyYXRpPTI3MzksZS5sbGluZWJlbG93PTc3MzksZS5sbGxhZGV2YT0yMzU2LGUubGx2b2NhbGljYmVuZ2FsaT0yNTI5LGUubGx2b2NhbGljZGV2YT0yNDAxLGUubGx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNTMxLGUubGx2b2NhbGljdm93ZWxzaWduZGV2YT0yNDAzLGUubG1pZGRsZXRpbGRlPTYxOSxlLmxtb25vc3BhY2U9NjUzNTYsZS5sbXNxdWFyZT0xMzI2NCxlLmxvY2h1bGF0aGFpPTM2MjgsZS5sb2dpY2FsYW5kPTg3NDMsZS5sb2dpY2Fsbm90PTE3MixlLmxvZ2ljYWxub3RyZXZlcnNlZD04OTc2LGUubG9naWNhbG9yPTg3NDQsZS5sb2xpbmd0aGFpPTM2MjEsZS5sb25ncz0zODMsZS5sb3dsaW5lY2VudGVybGluZT02NTEwMixlLmxvd2xpbmVjbWI9ODE4LGUubG93bGluZWRhc2hlZD02NTEwMSxlLmxvemVuZ2U9OTY3NCxlLmxwYXJlbj05MzgzLGUubHNsYXNoPTMyMixlLmxzcXVhcmU9ODQ2NyxlLmxzdXBlcmlvcj02MzIxNCxlLmx0c2hhZGU9OTYxNyxlLmx1dGhhaT0zNjIyLGUubHZvY2FsaWNiZW5nYWxpPTI0NDQsZS5sdm9jYWxpY2RldmE9MjMxNixlLmx2b2NhbGljdm93ZWxzaWduYmVuZ2FsaT0yNTMwLGUubHZvY2FsaWN2b3dlbHNpZ25kZXZhPTI0MDIsZS5seHNxdWFyZT0xMzI2NyxlLm09MTA5LGUubWFiZW5nYWxpPTI0NzgsZS5tYWNyb249MTc1LGUubWFjcm9uYmVsb3djbWI9ODE3LGUubWFjcm9uY21iPTc3MixlLm1hY3Jvbmxvd21vZD03MTcsZS5tYWNyb25tb25vc3BhY2U9NjU1MDcsZS5tYWN1dGU9Nzc0MyxlLm1hZGV2YT0yMzUwLGUubWFndWphcmF0aT0yNzM0LGUubWFndXJtdWtoaT0yNjA2LGUubWFoYXBha2hoZWJyZXc9MTQ0NCxlLm1haGFwYWtobGVmdGhlYnJldz0xNDQ0LGUubWFoaXJhZ2FuYT0xMjQxNCxlLm1haWNoYXR0YXdhbG93bGVmdHRoYWk9NjM2MzcsZS5tYWljaGF0dGF3YWxvd3JpZ2h0dGhhaT02MzYzNixlLm1haWNoYXR0YXdhdGhhaT0zNjU5LGUubWFpY2hhdHRhd2F1cHBlcmxlZnR0aGFpPTYzNjM1LGUubWFpZWtsb3dsZWZ0dGhhaT02MzYyOCxlLm1haWVrbG93cmlnaHR0aGFpPTYzNjI3LGUubWFpZWt0aGFpPTM2NTYsZS5tYWlla3VwcGVybGVmdHRoYWk9NjM2MjYsZS5tYWloYW5ha2F0bGVmdHRoYWk9NjM2MjAsZS5tYWloYW5ha2F0dGhhaT0zNjMzLGUubWFpdGFpa2h1bGVmdHRoYWk9NjM2MjUsZS5tYWl0YWlraHV0aGFpPTM2NTUsZS5tYWl0aG9sb3dsZWZ0dGhhaT02MzYzMSxlLm1haXRob2xvd3JpZ2h0dGhhaT02MzYzMCxlLm1haXRob3RoYWk9MzY1NyxlLm1haXRob3VwcGVybGVmdHRoYWk9NjM2MjksZS5tYWl0cmlsb3dsZWZ0dGhhaT02MzYzNCxlLm1haXRyaWxvd3JpZ2h0dGhhaT02MzYzMyxlLm1haXRyaXRoYWk9MzY1OCxlLm1haXRyaXVwcGVybGVmdHRoYWk9NjM2MzIsZS5tYWl5YW1va3RoYWk9MzY1NCxlLm1ha2F0YWthbmE9MTI1MTAsZS5tYWthdGFrYW5haGFsZndpZHRoPTY1NDIzLGUubWFsZT05Nzk0LGUubWFuc3lvbnNxdWFyZT0xMzEyNyxlLm1hcWFmaGVicmV3PTE0NzAsZS5tYXJzPTk3OTQsZS5tYXNvcmFjaXJjbGVoZWJyZXc9MTQ1NSxlLm1hc3F1YXJlPTEzMTg3LGUubWJvcG9tb2ZvPTEyNTUxLGUubWJzcXVhcmU9MTMyNjgsZS5tY2lyY2xlPTk0MzYsZS5tY3ViZWRzcXVhcmU9MTMyMjEsZS5tZG90YWNjZW50PTc3NDUsZS5tZG90YmVsb3c9Nzc0NyxlLm1lZW1hcmFiaWM9MTYwNSxlLm1lZW1maW5hbGFyYWJpYz02NTI1MCxlLm1lZW1pbml0aWFsYXJhYmljPTY1MjUxLGUubWVlbW1lZGlhbGFyYWJpYz02NTI1MixlLm1lZW1tZWVtaW5pdGlhbGFyYWJpYz02NDcyMSxlLm1lZW1tZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1ODQsZS5tZWV0b3J1c3F1YXJlPTEzMTMzLGUubWVoaXJhZ2FuYT0xMjQxNyxlLm1laXppZXJhc3F1YXJlPTEzMTgyLGUubWVrYXRha2FuYT0xMjUxMyxlLm1la2F0YWthbmFoYWxmd2lkdGg9NjU0MjYsZS5tZW09MTUwMixlLm1lbWRhZ2VzaD02NDMxOCxlLm1lbWRhZ2VzaGhlYnJldz02NDMxOCxlLm1lbWhlYnJldz0xNTAyLGUubWVuYXJtZW5pYW49MTM5NixlLm1lcmtoYWhlYnJldz0xNDQ1LGUubWVya2hha2VmdWxhaGVicmV3PTE0NDYsZS5tZXJraGFrZWZ1bGFsZWZ0aGVicmV3PTE0NDYsZS5tZXJraGFsZWZ0aGVicmV3PTE0NDUsZS5taG9vaz02MjUsZS5taHpzcXVhcmU9MTMyMDIsZS5taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aD02NTM4MSxlLm1pZGRvdD0xODMsZS5taWV1bWFjaXJjbGVrb3JlYW49MTI5MTQsZS5taWV1bWFwYXJlbmtvcmVhbj0xMjgxOCxlLm1pZXVtY2lyY2xla29yZWFuPTEyOTAwLGUubWlldW1rb3JlYW49MTI2MDksZS5taWV1bXBhbnNpb3Nrb3JlYW49MTI2NTYsZS5taWV1bXBhcmVua29yZWFuPTEyODA0LGUubWlldW1waWV1cGtvcmVhbj0xMjY1NCxlLm1pZXVtc2lvc2tvcmVhbj0xMjY1NSxlLm1paGlyYWdhbmE9MTI0MTUsZS5taWthdGFrYW5hPTEyNTExLGUubWlrYXRha2FuYWhhbGZ3aWR0aD02NTQyNCxlLm1pbnVzPTg3MjIsZS5taW51c2JlbG93Y21iPTgwMCxlLm1pbnVzY2lyY2xlPTg4NTQsZS5taW51c21vZD03MjcsZS5taW51c3BsdXM9ODcyMyxlLm1pbnV0ZT04MjQyLGUubWlyaWJhYXJ1c3F1YXJlPTEzMTMwLGUubWlyaXNxdWFyZT0xMzEyOSxlLm1sb25nbGVndHVybmVkPTYyNCxlLm1sc3F1YXJlPTEzMjA2LGUubW1jdWJlZHNxdWFyZT0xMzIxOSxlLm1tb25vc3BhY2U9NjUzNTcsZS5tbXNxdWFyZWRzcXVhcmU9MTMyMTUsZS5tb2hpcmFnYW5hPTEyNDE4LGUubW9obXNxdWFyZT0xMzI0OSxlLm1va2F0YWthbmE9MTI1MTQsZS5tb2thdGFrYW5haGFsZndpZHRoPTY1NDI3LGUubW9sc3F1YXJlPTEzMjcwLGUubW9tYXRoYWk9MzYxNyxlLm1vdmVyc3NxdWFyZT0xMzIyMyxlLm1vdmVyc3NxdWFyZWRzcXVhcmU9MTMyMjQsZS5tcGFyZW49OTM4NCxlLm1wYXNxdWFyZT0xMzIyNyxlLm1zc3F1YXJlPTEzMjM1LGUubXN1cGVyaW9yPTYzMjE1LGUubXR1cm5lZD02MjMsZS5tdT0xODEsZS5tdTE9MTgxLGUubXVhc3F1YXJlPTEzMTg2LGUubXVjaGdyZWF0ZXI9ODgxMSxlLm11Y2hsZXNzPTg4MTAsZS5tdWZzcXVhcmU9MTMxOTYsZS5tdWdyZWVrPTk1NixlLm11Z3NxdWFyZT0xMzE5NyxlLm11aGlyYWdhbmE9MTI0MTYsZS5tdWthdGFrYW5hPTEyNTEyLGUubXVrYXRha2FuYWhhbGZ3aWR0aD02NTQyNSxlLm11bHNxdWFyZT0xMzIwNSxlLm11bHRpcGx5PTIxNSxlLm11bXNxdWFyZT0xMzIxMSxlLm11bmFoaGVicmV3PTE0NDMsZS5tdW5haGxlZnRoZWJyZXc9MTQ0MyxlLm11c2ljYWxub3RlPTk4MzQsZS5tdXNpY2Fsbm90ZWRibD05ODM1LGUubXVzaWNmbGF0c2lnbj05ODM3LGUubXVzaWNzaGFycHNpZ249OTgzOSxlLm11c3NxdWFyZT0xMzIzNCxlLm11dnNxdWFyZT0xMzIzOCxlLm11d3NxdWFyZT0xMzI0NCxlLm12bWVnYXNxdWFyZT0xMzI0MSxlLm12c3F1YXJlPTEzMjM5LGUubXdtZWdhc3F1YXJlPTEzMjQ3LGUubXdzcXVhcmU9MTMyNDUsZS5uPTExMCxlLm5hYmVuZ2FsaT0yNDcyLGUubmFibGE9ODcxMSxlLm5hY3V0ZT0zMjQsZS5uYWRldmE9MjM0NCxlLm5hZ3VqYXJhdGk9MjcyOCxlLm5hZ3VybXVraGk9MjYwMCxlLm5haGlyYWdhbmE9MTIzOTQsZS5uYWthdGFrYW5hPTEyNDkwLGUubmFrYXRha2FuYWhhbGZ3aWR0aD02NTQxMyxlLm5hcG9zdHJvcGhlPTMyOSxlLm5hc3F1YXJlPTEzMTg1LGUubmJvcG9tb2ZvPTEyNTU1LGUubmJzcGFjZT0xNjAsZS5uY2Fyb249MzI4LGUubmNlZGlsbGE9MzI2LGUubmNpcmNsZT05NDM3LGUubmNpcmN1bWZsZXhiZWxvdz03NzU1LGUubmNvbW1hYWNjZW50PTMyNixlLm5kb3RhY2NlbnQ9Nzc0OSxlLm5kb3RiZWxvdz03NzUxLGUubmVoaXJhZ2FuYT0xMjM5NyxlLm5la2F0YWthbmE9MTI0OTMsZS5uZWthdGFrYW5haGFsZndpZHRoPTY1NDE2LGUubmV3c2hlcWVsc2lnbj04MzYyLGUubmZzcXVhcmU9MTMxOTUsZS5uZ2FiZW5nYWxpPTI0NTcsZS5uZ2FkZXZhPTIzMjksZS5uZ2FndWphcmF0aT0yNzEzLGUubmdhZ3VybXVraGk9MjU4NSxlLm5nb25ndXRoYWk9MzU5MSxlLm5oaXJhZ2FuYT0xMjQzNSxlLm5ob29rbGVmdD02MjYsZS5uaG9va3JldHJvZmxleD02MjcsZS5uaWV1bmFjaXJjbGVrb3JlYW49MTI5MTEsZS5uaWV1bmFwYXJlbmtvcmVhbj0xMjgxNSxlLm5pZXVuY2lldWNrb3JlYW49MTI1OTcsZS5uaWV1bmNpcmNsZWtvcmVhbj0xMjg5NyxlLm5pZXVuaGlldWhrb3JlYW49MTI1OTgsZS5uaWV1bmtvcmVhbj0xMjU5NixlLm5pZXVucGFuc2lvc2tvcmVhbj0xMjY0OCxlLm5pZXVucGFyZW5rb3JlYW49MTI4MDEsZS5uaWV1bnNpb3Nrb3JlYW49MTI2NDcsZS5uaWV1bnRpa2V1dGtvcmVhbj0xMjY0NixlLm5paGlyYWdhbmE9MTIzOTUsZS5uaWthdGFrYW5hPTEyNDkxLGUubmlrYXRha2FuYWhhbGZ3aWR0aD02NTQxNCxlLm5pa2hhaGl0bGVmdHRoYWk9NjM2NDEsZS5uaWtoYWhpdHRoYWk9MzY2MSxlLm5pbmU9NTcsZS5uaW5lYXJhYmljPTE2NDEsZS5uaW5lYmVuZ2FsaT0yNTQzLGUubmluZWNpcmNsZT05MzIwLGUubmluZWNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMzAsZS5uaW5lZGV2YT0yNDE1LGUubmluZWd1amFyYXRpPTI3OTksZS5uaW5lZ3VybXVraGk9MjY3MSxlLm5pbmVoYWNrYXJhYmljPTE2NDEsZS5uaW5laGFuZ3pob3U9MTIzMjksZS5uaW5laWRlb2dyYXBoaWNwYXJlbj0xMjg0MCxlLm5pbmVpbmZlcmlvcj04MzI5LGUubmluZW1vbm9zcGFjZT02NTMwNSxlLm5pbmVvbGRzdHlsZT02MzI4OSxlLm5pbmVwYXJlbj05MzQwLGUubmluZXBlcmlvZD05MzYwLGUubmluZXBlcnNpYW49MTc4NSxlLm5pbmVyb21hbj04NTY4LGUubmluZXN1cGVyaW9yPTgzMTMsZS5uaW5ldGVlbmNpcmNsZT05MzMwLGUubmluZXRlZW5wYXJlbj05MzUwLGUubmluZXRlZW5wZXJpb2Q9OTM3MCxlLm5pbmV0aGFpPTM2NzMsZS5uaj00NjAsZS5uamVjeXJpbGxpYz0xMTE0LGUubmthdGFrYW5hPTEyNTMxLGUubmthdGFrYW5haGFsZndpZHRoPTY1NDM3LGUubmxlZ3JpZ2h0bG9uZz00MTQsZS5ubGluZWJlbG93PTc3NTMsZS5ubW9ub3NwYWNlPTY1MzU4LGUubm1zcXVhcmU9MTMyMTAsZS5ubmFiZW5nYWxpPTI0NjcsZS5ubmFkZXZhPTIzMzksZS5ubmFndWphcmF0aT0yNzIzLGUubm5hZ3VybXVraGk9MjU5NSxlLm5ubmFkZXZhPTIzNDUsZS5ub2hpcmFnYW5hPTEyMzk4LGUubm9rYXRha2FuYT0xMjQ5NCxlLm5va2F0YWthbmFoYWxmd2lkdGg9NjU0MTcsZS5ub25icmVha2luZ3NwYWNlPTE2MCxlLm5vbmVudGhhaT0zNjAzLGUubm9udXRoYWk9MzYwOSxlLm5vb25hcmFiaWM9MTYwNixlLm5vb25maW5hbGFyYWJpYz02NTI1NCxlLm5vb25naHVubmFhcmFiaWM9MTcyMixlLm5vb25naHVubmFmaW5hbGFyYWJpYz02NDQxNSxlLm5vb25pbml0aWFsYXJhYmljPTY1MjU1LGUubm9vbmplZW1pbml0aWFsYXJhYmljPTY0NzIyLGUubm9vbmplZW1pc29sYXRlZGFyYWJpYz02NDU4NyxlLm5vb25tZWRpYWxhcmFiaWM9NjUyNTYsZS5ub29ubWVlbWluaXRpYWxhcmFiaWM9NjQ3MjUsZS5ub29ubWVlbWlzb2xhdGVkYXJhYmljPTY0NTkwLGUubm9vbm5vb25maW5hbGFyYWJpYz02NDY1MyxlLm5vdGNvbnRhaW5zPTg3MTYsZS5ub3RlbGVtZW50PTg3MTMsZS5ub3RlbGVtZW50b2Y9ODcxMyxlLm5vdGVxdWFsPTg4MDAsZS5ub3RncmVhdGVyPTg4MTUsZS5ub3RncmVhdGVybm9yZXF1YWw9ODgxNyxlLm5vdGdyZWF0ZXJub3JsZXNzPTg4MjUsZS5ub3RpZGVudGljYWw9ODgwMixlLm5vdGxlc3M9ODgxNCxlLm5vdGxlc3Nub3JlcXVhbD04ODE2LGUubm90cGFyYWxsZWw9ODc0MixlLm5vdHByZWNlZGVzPTg4MzIsZS5ub3RzdWJzZXQ9ODgzNixlLm5vdHN1Y2NlZWRzPTg4MzMsZS5ub3RzdXBlcnNldD04ODM3LGUubm93YXJtZW5pYW49MTM5OCxlLm5wYXJlbj05Mzg1LGUubnNzcXVhcmU9MTMyMzMsZS5uc3VwZXJpb3I9ODMxOSxlLm50aWxkZT0yNDEsZS5udT05NTcsZS5udWhpcmFnYW5hPTEyMzk2LGUubnVrYXRha2FuYT0xMjQ5MixlLm51a2F0YWthbmFoYWxmd2lkdGg9NjU0MTUsZS5udWt0YWJlbmdhbGk9MjQ5MixlLm51a3RhZGV2YT0yMzY0LGUubnVrdGFndWphcmF0aT0yNzQ4LGUubnVrdGFndXJtdWtoaT0yNjIwLGUubnVtYmVyc2lnbj0zNSxlLm51bWJlcnNpZ25tb25vc3BhY2U9NjUyODMsZS5udW1iZXJzaWduc21hbGw9NjUxMTksZS5udW1lcmFsc2lnbmdyZWVrPTg4NCxlLm51bWVyYWxzaWdubG93ZXJncmVlaz04ODUsZS5udW1lcm89ODQ3MCxlLm51bj0xNTA0LGUubnVuZGFnZXNoPTY0MzIwLGUubnVuZGFnZXNoaGVicmV3PTY0MzIwLGUubnVuaGVicmV3PTE1MDQsZS5udnNxdWFyZT0xMzIzNyxlLm53c3F1YXJlPTEzMjQzLGUubnlhYmVuZ2FsaT0yNDYyLGUubnlhZGV2YT0yMzM0LGUubnlhZ3VqYXJhdGk9MjcxOCxlLm55YWd1cm11a2hpPTI1OTAsZS5vPTExMSxlLm9hY3V0ZT0yNDMsZS5vYW5ndGhhaT0zNjI5LGUub2JhcnJlZD02MjksZS5vYmFycmVkY3lyaWxsaWM9MTI1NyxlLm9iYXJyZWRkaWVyZXNpc2N5cmlsbGljPTEyNTksZS5vYmVuZ2FsaT0yNDUxLGUub2JvcG9tb2ZvPTEyNTcxLGUub2JyZXZlPTMzNSxlLm9jYW5kcmFkZXZhPTIzMjEsZS5vY2FuZHJhZ3VqYXJhdGk9MjcwNSxlLm9jYW5kcmF2b3dlbHNpZ25kZXZhPTIzNzcsZS5vY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGk9Mjc2MSxlLm9jYXJvbj00NjYsZS5vY2lyY2xlPTk0MzgsZS5vY2lyY3VtZmxleD0yNDQsZS5vY2lyY3VtZmxleGFjdXRlPTc4ODksZS5vY2lyY3VtZmxleGRvdGJlbG93PTc4OTcsZS5vY2lyY3VtZmxleGdyYXZlPTc4OTEsZS5vY2lyY3VtZmxleGhvb2thYm92ZT03ODkzLGUub2NpcmN1bWZsZXh0aWxkZT03ODk1LGUub2N5cmlsbGljPTEwODYsZS5vZGJsYWN1dGU9MzM3LGUub2RibGdyYXZlPTUyNSxlLm9kZXZhPTIzMjMsZS5vZGllcmVzaXM9MjQ2LGUub2RpZXJlc2lzY3lyaWxsaWM9MTI1NSxlLm9kb3RiZWxvdz03ODg1LGUub2U9MzM5LGUub2Vrb3JlYW49MTI2MzQsZS5vZ29uZWs9NzMxLGUub2dvbmVrY21iPTgwOCxlLm9ncmF2ZT0yNDIsZS5vZ3VqYXJhdGk9MjcwNyxlLm9oYXJtZW5pYW49MTQxMyxlLm9oaXJhZ2FuYT0xMjM2MixlLm9ob29rYWJvdmU9Nzg4NyxlLm9ob3JuPTQxNyxlLm9ob3JuYWN1dGU9Nzg5OSxlLm9ob3JuZG90YmVsb3c9NzkwNyxlLm9ob3JuZ3JhdmU9NzkwMSxlLm9ob3JuaG9va2Fib3ZlPTc5MDMsZS5vaG9ybnRpbGRlPTc5MDUsZS5vaHVuZ2FydW1sYXV0PTMzNyxlLm9pPTQxOSxlLm9pbnZlcnRlZGJyZXZlPTUyNyxlLm9rYXRha2FuYT0xMjQ1OCxlLm9rYXRha2FuYWhhbGZ3aWR0aD02NTM5NyxlLm9rb3JlYW49MTI2MzEsZS5vbGVoZWJyZXc9MTQ1MSxlLm9tYWNyb249MzMzLGUub21hY3JvbmFjdXRlPTc3NjMsZS5vbWFjcm9uZ3JhdmU9Nzc2MSxlLm9tZGV2YT0yMzg0LGUub21lZ2E9OTY5LGUub21lZ2ExPTk4MixlLm9tZWdhY3lyaWxsaWM9MTEyMSxlLm9tZWdhbGF0aW5jbG9zZWQ9NjMxLGUub21lZ2Fyb3VuZGN5cmlsbGljPTExNDcsZS5vbWVnYXRpdGxvY3lyaWxsaWM9MTE0OSxlLm9tZWdhdG9ub3M9OTc0LGUub21ndWphcmF0aT0yNzY4LGUub21pY3Jvbj05NTksZS5vbWljcm9udG9ub3M9OTcyLGUub21vbm9zcGFjZT02NTM1OSxlLm9uZT00OSxlLm9uZWFyYWJpYz0xNjMzLGUub25lYmVuZ2FsaT0yNTM1LGUub25lY2lyY2xlPTkzMTIsZS5vbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTIyLGUub25lZGV2YT0yNDA3LGUub25lZG90ZW5sZWFkZXI9ODIyOCxlLm9uZWVpZ2h0aD04NTM5LGUub25lZml0dGVkPTYzMTk2LGUub25lZ3VqYXJhdGk9Mjc5MSxlLm9uZWd1cm11a2hpPTI2NjMsZS5vbmVoYWNrYXJhYmljPTE2MzMsZS5vbmVoYWxmPTE4OSxlLm9uZWhhbmd6aG91PTEyMzIxLGUub25laWRlb2dyYXBoaWNwYXJlbj0xMjgzMixlLm9uZWluZmVyaW9yPTgzMjEsZS5vbmVtb25vc3BhY2U9NjUyOTcsZS5vbmVudW1lcmF0b3JiZW5nYWxpPTI1NDgsZS5vbmVvbGRzdHlsZT02MzI4MSxlLm9uZXBhcmVuPTkzMzIsZS5vbmVwZXJpb2Q9OTM1MixlLm9uZXBlcnNpYW49MTc3NyxlLm9uZXF1YXJ0ZXI9MTg4LGUub25lcm9tYW49ODU2MCxlLm9uZXN1cGVyaW9yPTE4NSxlLm9uZXRoYWk9MzY2NSxlLm9uZXRoaXJkPTg1MzEsZS5vb2dvbmVrPTQ5MSxlLm9vZ29uZWttYWNyb249NDkzLGUub29ndXJtdWtoaT0yNTc5LGUub29tYXRyYWd1cm11a2hpPTI2MzUsZS5vb3Blbj01OTYsZS5vcGFyZW49OTM4NixlLm9wZW5idWxsZXQ9OTcwMixlLm9wdGlvbj04OTk3LGUub3JkZmVtaW5pbmU9MTcwLGUub3JkbWFzY3VsaW5lPTE4NixlLm9ydGhvZ29uYWw9ODczNSxlLm9zaG9ydGRldmE9MjMyMixlLm9zaG9ydHZvd2Vsc2lnbmRldmE9MjM3OCxlLm9zbGFzaD0yNDgsZS5vc2xhc2hhY3V0ZT01MTEsZS5vc21hbGxoaXJhZ2FuYT0xMjM2MSxlLm9zbWFsbGthdGFrYW5hPTEyNDU3LGUub3NtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODcsZS5vc3Ryb2tlYWN1dGU9NTExLGUub3N1cGVyaW9yPTYzMjE2LGUub3RjeXJpbGxpYz0xMTUxLGUub3RpbGRlPTI0NSxlLm90aWxkZWFjdXRlPTc3NTcsZS5vdGlsZGVkaWVyZXNpcz03NzU5LGUub3Vib3BvbW9mbz0xMjU3NyxlLm92ZXJsaW5lPTgyNTQsZS5vdmVybGluZWNlbnRlcmxpbmU9NjUwOTgsZS5vdmVybGluZWNtYj03NzMsZS5vdmVybGluZWRhc2hlZD02NTA5NyxlLm92ZXJsaW5lZGJsd2F2eT02NTEwMCxlLm92ZXJsaW5ld2F2eT02NTA5OSxlLm92ZXJzY29yZT0xNzUsZS5vdm93ZWxzaWduYmVuZ2FsaT0yNTA3LGUub3Zvd2Vsc2lnbmRldmE9MjM3OSxlLm92b3dlbHNpZ25ndWphcmF0aT0yNzYzLGUucD0xMTIsZS5wYWFtcHNzcXVhcmU9MTMxODQsZS5wYWFzZW50b3NxdWFyZT0xMzA5OSxlLnBhYmVuZ2FsaT0yNDc0LGUucGFjdXRlPTc3NjUsZS5wYWRldmE9MjM0NixlLnBhZ2Vkb3duPTg2NzEsZS5wYWdldXA9ODY3MCxlLnBhZ3VqYXJhdGk9MjczMCxlLnBhZ3VybXVraGk9MjYwMixlLnBhaGlyYWdhbmE9MTI0MDEsZS5wYWl5YW5ub2l0aGFpPTM2MzEsZS5wYWthdGFrYW5hPTEyNDk3LGUucGFsYXRhbGl6YXRpb25jeXJpbGxpY2NtYj0xMTU2LGUucGFsb2Noa2FjeXJpbGxpYz0xMjE2LGUucGFuc2lvc2tvcmVhbj0xMjY3MSxlLnBhcmFncmFwaD0xODIsZS5wYXJhbGxlbD04NzQxLGUucGFyZW5sZWZ0PTQwLGUucGFyZW5sZWZ0YWx0b25lYXJhYmljPTY0ODMwLGUucGFyZW5sZWZ0YnQ9NjM3MjUsZS5wYXJlbmxlZnRleD02MzcyNCxlLnBhcmVubGVmdGluZmVyaW9yPTgzMzMsZS5wYXJlbmxlZnRtb25vc3BhY2U9NjUyODgsZS5wYXJlbmxlZnRzbWFsbD02NTExMyxlLnBhcmVubGVmdHN1cGVyaW9yPTgzMTcsZS5wYXJlbmxlZnR0cD02MzcyMyxlLnBhcmVubGVmdHZlcnRpY2FsPTY1MDc3LGUucGFyZW5yaWdodD00MSxlLnBhcmVucmlnaHRhbHRvbmVhcmFiaWM9NjQ4MzEsZS5wYXJlbnJpZ2h0YnQ9NjM3MzYsZS5wYXJlbnJpZ2h0ZXg9NjM3MzUsZS5wYXJlbnJpZ2h0aW5mZXJpb3I9ODMzNCxlLnBhcmVucmlnaHRtb25vc3BhY2U9NjUyODksZS5wYXJlbnJpZ2h0c21hbGw9NjUxMTQsZS5wYXJlbnJpZ2h0c3VwZXJpb3I9ODMxOCxlLnBhcmVucmlnaHR0cD02MzczNCxlLnBhcmVucmlnaHR2ZXJ0aWNhbD02NTA3OCxlLnBhcnRpYWxkaWZmPTg3MDYsZS5wYXNlcWhlYnJldz0xNDcyLGUucGFzaHRhaGVicmV3PTE0MzMsZS5wYXNxdWFyZT0xMzIyNSxlLnBhdGFoPTE0NjMsZS5wYXRhaDExPTE0NjMsZS5wYXRhaDFkPTE0NjMsZS5wYXRhaDJhPTE0NjMsZS5wYXRhaGhlYnJldz0xNDYzLGUucGF0YWhuYXJyb3doZWJyZXc9MTQ2MyxlLnBhdGFocXVhcnRlcmhlYnJldz0xNDYzLGUucGF0YWh3aWRlaGVicmV3PTE0NjMsZS5wYXplcmhlYnJldz0xNDQxLGUucGJvcG9tb2ZvPTEyNTUwLGUucGNpcmNsZT05NDM5LGUucGRvdGFjY2VudD03NzY3LGUucGU9MTUwOCxlLnBlY3lyaWxsaWM9MTA4NyxlLnBlZGFnZXNoPTY0MzI0LGUucGVkYWdlc2hoZWJyZXc9NjQzMjQsZS5wZWV6aXNxdWFyZT0xMzExNSxlLnBlZmluYWxkYWdlc2hoZWJyZXc9NjQzMjMsZS5wZWhhcmFiaWM9MTY2MixlLnBlaGFybWVuaWFuPTE0MDIsZS5wZWhlYnJldz0xNTA4LGUucGVoZmluYWxhcmFiaWM9NjQzNDMsZS5wZWhpbml0aWFsYXJhYmljPTY0MzQ0LGUucGVoaXJhZ2FuYT0xMjQxMCxlLnBlaG1lZGlhbGFyYWJpYz02NDM0NSxlLnBla2F0YWthbmE9MTI1MDYsZS5wZW1pZGRsZWhvb2tjeXJpbGxpYz0xMTkxLGUucGVyYWZlaGVicmV3PTY0MzM0LGUucGVyY2VudD0zNyxlLnBlcmNlbnRhcmFiaWM9MTY0MixlLnBlcmNlbnRtb25vc3BhY2U9NjUyODUsZS5wZXJjZW50c21hbGw9NjUxMzAsZS5wZXJpb2Q9NDYsZS5wZXJpb2Rhcm1lbmlhbj0xNDE3LGUucGVyaW9kY2VudGVyZWQ9MTgzLGUucGVyaW9kaGFsZndpZHRoPTY1Mzc3LGUucGVyaW9kaW5mZXJpb3I9NjMyMDcsZS5wZXJpb2Rtb25vc3BhY2U9NjUyOTQsZS5wZXJpb2RzbWFsbD02NTEwNixlLnBlcmlvZHN1cGVyaW9yPTYzMjA4LGUucGVyaXNwb21lbmlncmVla2NtYj04MzQsZS5wZXJwZW5kaWN1bGFyPTg4NjksZS5wZXJ0aG91c2FuZD04MjQwLGUucGVzZXRhPTgzNTksZS5wZnNxdWFyZT0xMzE5NCxlLnBoYWJlbmdhbGk9MjQ3NSxlLnBoYWRldmE9MjM0NyxlLnBoYWd1amFyYXRpPTI3MzEsZS5waGFndXJtdWtoaT0yNjAzLGUucGhpPTk2NixlLnBoaTE9OTgxLGUucGhpZXVwaGFjaXJjbGVrb3JlYW49MTI5MjIsZS5waGlldXBoYXBhcmVua29yZWFuPTEyODI2LGUucGhpZXVwaGNpcmNsZWtvcmVhbj0xMjkwOCxlLnBoaWV1cGhrb3JlYW49MTI2MjEsZS5waGlldXBocGFyZW5rb3JlYW49MTI4MTIsZS5waGlsYXRpbj02MzIsZS5waGludGh1dGhhaT0zNjQyLGUucGhpc3ltYm9sZ3JlZWs9OTgxLGUucGhvb2s9NDIxLGUucGhvcGhhbnRoYWk9MzYxNCxlLnBob3BodW5ndGhhaT0zNjEyLGUucGhvc2FtcGhhb3RoYWk9MzYxNixlLnBpPTk2MCxlLnBpZXVwYWNpcmNsZWtvcmVhbj0xMjkxNSxlLnBpZXVwYXBhcmVua29yZWFuPTEyODE5LGUucGlldXBjaWV1Y2tvcmVhbj0xMjY2MixlLnBpZXVwY2lyY2xla29yZWFuPTEyOTAxLGUucGlldXBraXllb2trb3JlYW49MTI2NTgsZS5waWV1cGtvcmVhbj0xMjYxMCxlLnBpZXVwcGFyZW5rb3JlYW49MTI4MDUsZS5waWV1cHNpb3NraXllb2trb3JlYW49MTI2NjAsZS5waWV1cHNpb3Nrb3JlYW49MTI2MTIsZS5waWV1cHNpb3N0aWtldXRrb3JlYW49MTI2NjEsZS5waWV1cHRoaWV1dGhrb3JlYW49MTI2NjMsZS5waWV1cHRpa2V1dGtvcmVhbj0xMjY1OSxlLnBpaGlyYWdhbmE9MTI0MDQsZS5waWthdGFrYW5hPTEyNTAwLGUucGlzeW1ib2xncmVlaz05ODIsZS5waXdyYXJtZW5pYW49MTQxMSxlLnBsYW5ja292ZXIycGk9ODQ2MyxlLnBsYW5ja292ZXIycGkxPTg0NjMsZS5wbHVzPTQzLGUucGx1c2JlbG93Y21iPTc5OSxlLnBsdXNjaXJjbGU9ODg1MyxlLnBsdXNtaW51cz0xNzcsZS5wbHVzbW9kPTcyNixlLnBsdXNtb25vc3BhY2U9NjUyOTEsZS5wbHVzc21hbGw9NjUxMjIsZS5wbHVzc3VwZXJpb3I9ODMxNCxlLnBtb25vc3BhY2U9NjUzNjAsZS5wbXNxdWFyZT0xMzI3MixlLnBvaGlyYWdhbmE9MTI0MTMsZS5wb2ludGluZ2luZGV4ZG93bndoaXRlPTk3NTksZS5wb2ludGluZ2luZGV4bGVmdHdoaXRlPTk3NTYsZS5wb2ludGluZ2luZGV4cmlnaHR3aGl0ZT05NzU4LGUucG9pbnRpbmdpbmRleHVwd2hpdGU9OTc1NyxlLnBva2F0YWthbmE9MTI1MDksZS5wb3BsYXRoYWk9MzYxMSxlLnBvc3RhbG1hcms9MTIzMDYsZS5wb3N0YWxtYXJrZmFjZT0xMjMyMCxlLnBwYXJlbj05Mzg3LGUucHJlY2VkZXM9ODgyNixlLnByZXNjcmlwdGlvbj04NDc4LGUucHJpbWVtb2Q9Njk3LGUucHJpbWVyZXZlcnNlZD04MjQ1LGUucHJvZHVjdD04NzE5LGUucHJvamVjdGl2ZT04OTY1LGUucHJvbG9uZ2Vka2FuYT0xMjU0MCxlLnByb3BlbGxvcj04OTg0LGUucHJvcGVyc3Vic2V0PTg4MzQsZS5wcm9wZXJzdXBlcnNldD04ODM1LGUucHJvcG9ydGlvbj04NzU5LGUucHJvcG9ydGlvbmFsPTg3MzMsZS5wc2k9OTY4LGUucHNpY3lyaWxsaWM9MTEzNyxlLnBzaWxpcG5ldW1hdGFjeXJpbGxpY2NtYj0xMTU4LGUucHNzcXVhcmU9MTMyMzIsZS5wdWhpcmFnYW5hPTEyNDA3LGUucHVrYXRha2FuYT0xMjUwMyxlLnB2c3F1YXJlPTEzMjM2LGUucHdzcXVhcmU9MTMyNDIsZS5xPTExMyxlLnFhZGV2YT0yMzkyLGUucWFkbWFoZWJyZXc9MTQ0OCxlLnFhZmFyYWJpYz0xNjAyLGUucWFmZmluYWxhcmFiaWM9NjUyMzgsZS5xYWZpbml0aWFsYXJhYmljPTY1MjM5LGUucWFmbWVkaWFsYXJhYmljPTY1MjQwLGUucWFtYXRzPTE0NjQsZS5xYW1hdHMxMD0xNDY0LGUucWFtYXRzMWE9MTQ2NCxlLnFhbWF0czFjPTE0NjQsZS5xYW1hdHMyNz0xNDY0LGUucWFtYXRzMjk9MTQ2NCxlLnFhbWF0czMzPTE0NjQsZS5xYW1hdHNkZT0xNDY0LGUucWFtYXRzaGVicmV3PTE0NjQsZS5xYW1hdHNuYXJyb3doZWJyZXc9MTQ2NCxlLnFhbWF0c3FhdGFuaGVicmV3PTE0NjQsZS5xYW1hdHNxYXRhbm5hcnJvd2hlYnJldz0xNDY0LGUucWFtYXRzcWF0YW5xdWFydGVyaGVicmV3PTE0NjQsZS5xYW1hdHNxYXRhbndpZGVoZWJyZXc9MTQ2NCxlLnFhbWF0c3F1YXJ0ZXJoZWJyZXc9MTQ2NCxlLnFhbWF0c3dpZGVoZWJyZXc9MTQ2NCxlLnFhcm5leXBhcmFoZWJyZXc9MTQzOSxlLnFib3BvbW9mbz0xMjU2MSxlLnFjaXJjbGU9OTQ0MCxlLnFob29rPTY3MixlLnFtb25vc3BhY2U9NjUzNjEsZS5xb2Y9MTUxMSxlLnFvZmRhZ2VzaD02NDMyNyxlLnFvZmRhZ2VzaGhlYnJldz02NDMyNyxlLnFvZmhlYnJldz0xNTExLGUucXBhcmVuPTkzODgsZS5xdWFydGVybm90ZT05ODMzLGUucXVidXRzPTE0NjcsZS5xdWJ1dHMxOD0xNDY3LGUucXVidXRzMjU9MTQ2NyxlLnF1YnV0czMxPTE0NjcsZS5xdWJ1dHNoZWJyZXc9MTQ2NyxlLnF1YnV0c25hcnJvd2hlYnJldz0xNDY3LGUucXVidXRzcXVhcnRlcmhlYnJldz0xNDY3LGUucXVidXRzd2lkZWhlYnJldz0xNDY3LGUucXVlc3Rpb249NjMsZS5xdWVzdGlvbmFyYWJpYz0xNTY3LGUucXVlc3Rpb25hcm1lbmlhbj0xMzc0LGUucXVlc3Rpb25kb3duPTE5MSxlLnF1ZXN0aW9uZG93bnNtYWxsPTYzNDIzLGUucXVlc3Rpb25ncmVlaz04OTQsZS5xdWVzdGlvbm1vbm9zcGFjZT02NTMxMSxlLnF1ZXN0aW9uc21hbGw9NjMyOTUsZS5xdW90ZWRibD0zNCxlLnF1b3RlZGJsYmFzZT04MjIyLGUucXVvdGVkYmxsZWZ0PTgyMjAsZS5xdW90ZWRibG1vbm9zcGFjZT02NTI4MixlLnF1b3RlZGJscHJpbWU9MTIzMTgsZS5xdW90ZWRibHByaW1lcmV2ZXJzZWQ9MTIzMTcsZS5xdW90ZWRibHJpZ2h0PTgyMjEsZS5xdW90ZWxlZnQ9ODIxNixlLnF1b3RlbGVmdHJldmVyc2VkPTgyMTksZS5xdW90ZXJldmVyc2VkPTgyMTksZS5xdW90ZXJpZ2h0PTgyMTcsZS5xdW90ZXJpZ2h0bj0zMjksZS5xdW90ZXNpbmdsYmFzZT04MjE4LGUucXVvdGVzaW5nbGU9MzksZS5xdW90ZXNpbmdsZW1vbm9zcGFjZT02NTI4NyxlLnI9MTE0LGUucmFhcm1lbmlhbj0xNDA0LGUucmFiZW5nYWxpPTI0ODAsZS5yYWN1dGU9MzQxLGUucmFkZXZhPTIzNTIsZS5yYWRpY2FsPTg3MzAsZS5yYWRpY2FsZXg9NjM3MTcsZS5yYWRvdmVyc3NxdWFyZT0xMzIzMCxlLnJhZG92ZXJzc3F1YXJlZHNxdWFyZT0xMzIzMSxlLnJhZHNxdWFyZT0xMzIyOSxlLnJhZmU9MTQ3MSxlLnJhZmVoZWJyZXc9MTQ3MSxlLnJhZ3VqYXJhdGk9MjczNixlLnJhZ3VybXVraGk9MjYwOCxlLnJhaGlyYWdhbmE9MTI0MjUsZS5yYWthdGFrYW5hPTEyNTIxLGUucmFrYXRha2FuYWhhbGZ3aWR0aD02NTQzMSxlLnJhbG93ZXJkaWFnb25hbGJlbmdhbGk9MjU0NSxlLnJhbWlkZGxlZGlhZ29uYWxiZW5nYWxpPTI1NDQsZS5yYW1zaG9ybj02MTIsZS5yYXRpbz04NzU4LGUucmJvcG9tb2ZvPTEyNTY2LGUucmNhcm9uPTM0NSxlLnJjZWRpbGxhPTM0MyxlLnJjaXJjbGU9OTQ0MSxlLnJjb21tYWFjY2VudD0zNDMsZS5yZGJsZ3JhdmU9NTI5LGUucmRvdGFjY2VudD03NzY5LGUucmRvdGJlbG93PTc3NzEsZS5yZG90YmVsb3dtYWNyb249Nzc3MyxlLnJlZmVyZW5jZW1hcms9ODI1MSxlLnJlZmxleHN1YnNldD04ODM4LGUucmVmbGV4c3VwZXJzZXQ9ODgzOSxlLnJlZ2lzdGVyZWQ9MTc0LGUucmVnaXN0ZXJzYW5zPTYzNzIwLGUucmVnaXN0ZXJzZXJpZj02MzE5NCxlLnJlaGFyYWJpYz0xNTg1LGUucmVoYXJtZW5pYW49MTQwOCxlLnJlaGZpbmFsYXJhYmljPTY1MTk4LGUucmVoaXJhZ2FuYT0xMjQyOCxlLnJla2F0YWthbmE9MTI1MjQ7ZS5yZWthdGFrYW5haGFsZndpZHRoPTY1NDM0LGUucmVzaD0xNTEyLGUucmVzaGRhZ2VzaGhlYnJldz02NDMyOCxlLnJlc2hoZWJyZXc9MTUxMixlLnJldmVyc2VkdGlsZGU9ODc2NSxlLnJldmlhaGVicmV3PTE0MzEsZS5yZXZpYW11Z3Jhc2hoZWJyZXc9MTQzMSxlLnJldmxvZ2ljYWxub3Q9ODk3NixlLnJmaXNoaG9vaz02MzgsZS5yZmlzaGhvb2tyZXZlcnNlZD02MzksZS5yaGFiZW5nYWxpPTI1MjUsZS5yaGFkZXZhPTIzOTcsZS5yaG89OTYxLGUucmhvb2s9NjM3LGUucmhvb2t0dXJuZWQ9NjM1LGUucmhvb2t0dXJuZWRzdXBlcmlvcj02OTMsZS5yaG9zeW1ib2xncmVlaz0xMDA5LGUucmhvdGljaG9va21vZD03MzQsZS5yaWV1bGFjaXJjbGVrb3JlYW49MTI5MTMsZS5yaWV1bGFwYXJlbmtvcmVhbj0xMjgxNyxlLnJpZXVsY2lyY2xla29yZWFuPTEyODk5LGUucmlldWxoaWV1aGtvcmVhbj0xMjYwOCxlLnJpZXVsa2l5ZW9ra29yZWFuPTEyNjAyLGUucmlldWxraXllb2tzaW9za29yZWFuPTEyNjQ5LGUucmlldWxrb3JlYW49MTI2MDEsZS5yaWV1bG1pZXVta29yZWFuPTEyNjAzLGUucmlldWxwYW5zaW9za29yZWFuPTEyNjUyLGUucmlldWxwYXJlbmtvcmVhbj0xMjgwMyxlLnJpZXVscGhpZXVwaGtvcmVhbj0xMjYwNyxlLnJpZXVscGlldXBrb3JlYW49MTI2MDQsZS5yaWV1bHBpZXVwc2lvc2tvcmVhbj0xMjY1MSxlLnJpZXVsc2lvc2tvcmVhbj0xMjYwNSxlLnJpZXVsdGhpZXV0aGtvcmVhbj0xMjYwNixlLnJpZXVsdGlrZXV0a29yZWFuPTEyNjUwLGUucmlldWx5ZW9yaW5oaWV1aGtvcmVhbj0xMjY1MyxlLnJpZ2h0YW5nbGU9ODczNSxlLnJpZ2h0dGFja2JlbG93Y21iPTc5MyxlLnJpZ2h0dHJpYW5nbGU9ODg5NSxlLnJpaGlyYWdhbmE9MTI0MjYsZS5yaWthdGFrYW5hPTEyNTIyLGUucmlrYXRha2FuYWhhbGZ3aWR0aD02NTQzMixlLnJpbmc9NzMwLGUucmluZ2JlbG93Y21iPTgwNSxlLnJpbmdjbWI9Nzc4LGUucmluZ2hhbGZsZWZ0PTcwMyxlLnJpbmdoYWxmbGVmdGFybWVuaWFuPTEzNjksZS5yaW5naGFsZmxlZnRiZWxvd2NtYj03OTYsZS5yaW5naGFsZmxlZnRjZW50ZXJlZD03MjMsZS5yaW5naGFsZnJpZ2h0PTcwMixlLnJpbmdoYWxmcmlnaHRiZWxvd2NtYj04MjUsZS5yaW5naGFsZnJpZ2h0Y2VudGVyZWQ9NzIyLGUucmludmVydGVkYnJldmU9NTMxLGUucml0dG9ydXNxdWFyZT0xMzEzNyxlLnJsaW5lYmVsb3c9Nzc3NSxlLnJsb25nbGVnPTYzNixlLnJsb25nbGVndHVybmVkPTYzNCxlLnJtb25vc3BhY2U9NjUzNjIsZS5yb2hpcmFnYW5hPTEyNDI5LGUucm9rYXRha2FuYT0xMjUyNSxlLnJva2F0YWthbmFoYWxmd2lkdGg9NjU0MzUsZS5yb3J1YXRoYWk9MzYxOSxlLnJwYXJlbj05Mzg5LGUucnJhYmVuZ2FsaT0yNTI0LGUucnJhZGV2YT0yMzUzLGUucnJhZ3VybXVraGk9MjY1MixlLnJyZWhhcmFiaWM9MTY4MSxlLnJyZWhmaW5hbGFyYWJpYz02NDM5NyxlLnJydm9jYWxpY2JlbmdhbGk9MjUyOCxlLnJydm9jYWxpY2RldmE9MjQwMCxlLnJydm9jYWxpY2d1amFyYXRpPTI3ODQsZS5ycnZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpPTI1MDAsZS5ycnZvY2FsaWN2b3dlbHNpZ25kZXZhPTIzNzIsZS5ycnZvY2FsaWN2b3dlbHNpZ25ndWphcmF0aT0yNzU2LGUucnN1cGVyaW9yPTYzMjE3LGUucnRibG9jaz05NjE2LGUucnR1cm5lZD02MzMsZS5ydHVybmVkc3VwZXJpb3I9NjkyLGUucnVoaXJhZ2FuYT0xMjQyNyxlLnJ1a2F0YWthbmE9MTI1MjMsZS5ydWthdGFrYW5haGFsZndpZHRoPTY1NDMzLGUucnVwZWVtYXJrYmVuZ2FsaT0yNTQ2LGUucnVwZWVzaWduYmVuZ2FsaT0yNTQ3LGUucnVwaWFoPTYzMTk3LGUucnV0aGFpPTM2MjAsZS5ydm9jYWxpY2JlbmdhbGk9MjQ0MyxlLnJ2b2NhbGljZGV2YT0yMzE1LGUucnZvY2FsaWNndWphcmF0aT0yNjk5LGUucnZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpPTI0OTksZS5ydm9jYWxpY3Zvd2Vsc2lnbmRldmE9MjM3MSxlLnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGk9Mjc1NSxlLnM9MTE1LGUuc2FiZW5nYWxpPTI0ODgsZS5zYWN1dGU9MzQ3LGUuc2FjdXRlZG90YWNjZW50PTc3ODEsZS5zYWRhcmFiaWM9MTU4OSxlLnNhZGV2YT0yMzYwLGUuc2FkZmluYWxhcmFiaWM9NjUyMTAsZS5zYWRpbml0aWFsYXJhYmljPTY1MjExLGUuc2FkbWVkaWFsYXJhYmljPTY1MjEyLGUuc2FndWphcmF0aT0yNzQ0LGUuc2FndXJtdWtoaT0yNjE2LGUuc2FoaXJhZ2FuYT0xMjM3MyxlLnNha2F0YWthbmE9MTI0NjksZS5zYWthdGFrYW5haGFsZndpZHRoPTY1NDAzLGUuc2FsbGFsbGFob3VhbGF5aGV3YXNhbGxhbWFyYWJpYz02NTAxOCxlLnNhbWVraD0xNTA1LGUuc2FtZWtoZGFnZXNoPTY0MzIxLGUuc2FtZWtoZGFnZXNoaGVicmV3PTY0MzIxLGUuc2FtZWtoaGVicmV3PTE1MDUsZS5zYXJhYWF0aGFpPTM2MzQsZS5zYXJhYWV0aGFpPTM2NDksZS5zYXJhYWltYWltYWxhaXRoYWk9MzY1MixlLnNhcmFhaW1haW11YW50aGFpPTM2NTEsZS5zYXJhYW10aGFpPTM2MzUsZS5zYXJhYXRoYWk9MzYzMixlLnNhcmFldGhhaT0zNjQ4LGUuc2FyYWlpbGVmdHRoYWk9NjM2MjIsZS5zYXJhaWl0aGFpPTM2MzcsZS5zYXJhaWxlZnR0aGFpPTYzNjIxLGUuc2FyYWl0aGFpPTM2MzYsZS5zYXJhb3RoYWk9MzY1MCxlLnNhcmF1ZWVsZWZ0dGhhaT02MzYyNCxlLnNhcmF1ZWV0aGFpPTM2MzksZS5zYXJhdWVsZWZ0dGhhaT02MzYyMyxlLnNhcmF1ZXRoYWk9MzYzOCxlLnNhcmF1dGhhaT0zNjQwLGUuc2FyYXV1dGhhaT0zNjQxLGUuc2JvcG9tb2ZvPTEyNTY5LGUuc2Nhcm9uPTM1MyxlLnNjYXJvbmRvdGFjY2VudD03NzgzLGUuc2NlZGlsbGE9MzUxLGUuc2Nod2E9NjAxLGUuc2Nod2FjeXJpbGxpYz0xMjQxLGUuc2Nod2FkaWVyZXNpc2N5cmlsbGljPTEyNDMsZS5zY2h3YWhvb2s9NjAyLGUuc2NpcmNsZT05NDQyLGUuc2NpcmN1bWZsZXg9MzQ5LGUuc2NvbW1hYWNjZW50PTUzNyxlLnNkb3RhY2NlbnQ9Nzc3NyxlLnNkb3RiZWxvdz03Nzc5LGUuc2RvdGJlbG93ZG90YWNjZW50PTc3ODUsZS5zZWFndWxsYmVsb3djbWI9ODI4LGUuc2Vjb25kPTgyNDMsZS5zZWNvbmR0b25lY2hpbmVzZT03MTQsZS5zZWN0aW9uPTE2NyxlLnNlZW5hcmFiaWM9MTU4NyxlLnNlZW5maW5hbGFyYWJpYz02NTIwMixlLnNlZW5pbml0aWFsYXJhYmljPTY1MjAzLGUuc2Vlbm1lZGlhbGFyYWJpYz02NTIwNCxlLnNlZ29sPTE0NjIsZS5zZWdvbDEzPTE0NjIsZS5zZWdvbDFmPTE0NjIsZS5zZWdvbDJjPTE0NjIsZS5zZWdvbGhlYnJldz0xNDYyLGUuc2Vnb2xuYXJyb3doZWJyZXc9MTQ2MixlLnNlZ29scXVhcnRlcmhlYnJldz0xNDYyLGUuc2Vnb2x0YWhlYnJldz0xNDI2LGUuc2Vnb2x3aWRlaGVicmV3PTE0NjIsZS5zZWhhcm1lbmlhbj0xNDA1LGUuc2VoaXJhZ2FuYT0xMjM3OSxlLnNla2F0YWthbmE9MTI0NzUsZS5zZWthdGFrYW5haGFsZndpZHRoPTY1NDA2LGUuc2VtaWNvbG9uPTU5LGUuc2VtaWNvbG9uYXJhYmljPTE1NjMsZS5zZW1pY29sb25tb25vc3BhY2U9NjUzMDcsZS5zZW1pY29sb25zbWFsbD02NTEwOCxlLnNlbWl2b2ljZWRtYXJra2FuYT0xMjQ0NCxlLnNlbWl2b2ljZWRtYXJra2FuYWhhbGZ3aWR0aD02NTQzOSxlLnNlbnRpc3F1YXJlPTEzMDkwLGUuc2VudG9zcXVhcmU9MTMwOTEsZS5zZXZlbj01NSxlLnNldmVuYXJhYmljPTE2MzksZS5zZXZlbmJlbmdhbGk9MjU0MSxlLnNldmVuY2lyY2xlPTkzMTgsZS5zZXZlbmNpcmNsZWludmVyc2VzYW5zc2VyaWY9MTAxMjgsZS5zZXZlbmRldmE9MjQxMyxlLnNldmVuZWlnaHRocz04NTQyLGUuc2V2ZW5ndWphcmF0aT0yNzk3LGUuc2V2ZW5ndXJtdWtoaT0yNjY5LGUuc2V2ZW5oYWNrYXJhYmljPTE2MzksZS5zZXZlbmhhbmd6aG91PTEyMzI3LGUuc2V2ZW5pZGVvZ3JhcGhpY3BhcmVuPTEyODM4LGUuc2V2ZW5pbmZlcmlvcj04MzI3LGUuc2V2ZW5tb25vc3BhY2U9NjUzMDMsZS5zZXZlbm9sZHN0eWxlPTYzMjg3LGUuc2V2ZW5wYXJlbj05MzM4LGUuc2V2ZW5wZXJpb2Q9OTM1OCxlLnNldmVucGVyc2lhbj0xNzgzLGUuc2V2ZW5yb21hbj04NTY2LGUuc2V2ZW5zdXBlcmlvcj04MzExLGUuc2V2ZW50ZWVuY2lyY2xlPTkzMjgsZS5zZXZlbnRlZW5wYXJlbj05MzQ4LGUuc2V2ZW50ZWVucGVyaW9kPTkzNjgsZS5zZXZlbnRoYWk9MzY3MSxlLnNmdGh5cGhlbj0xNzMsZS5zaGFhcm1lbmlhbj0xMzk5LGUuc2hhYmVuZ2FsaT0yNDg2LGUuc2hhY3lyaWxsaWM9MTA5NixlLnNoYWRkYWFyYWJpYz0xNjE3LGUuc2hhZGRhZGFtbWFhcmFiaWM9NjQ2MDksZS5zaGFkZGFkYW1tYXRhbmFyYWJpYz02NDYwNixlLnNoYWRkYWZhdGhhYXJhYmljPTY0NjA4LGUuc2hhZGRha2FzcmFhcmFiaWM9NjQ2MTAsZS5zaGFkZGFrYXNyYXRhbmFyYWJpYz02NDYwNyxlLnNoYWRlPTk2MTgsZS5zaGFkZWRhcms9OTYxOSxlLnNoYWRlbGlnaHQ9OTYxNyxlLnNoYWRlbWVkaXVtPTk2MTgsZS5zaGFkZXZhPTIzNTgsZS5zaGFndWphcmF0aT0yNzQyLGUuc2hhZ3VybXVraGk9MjYxNCxlLnNoYWxzaGVsZXRoZWJyZXc9MTQyNyxlLnNoYm9wb21vZm89MTI1NjUsZS5zaGNoYWN5cmlsbGljPTEwOTcsZS5zaGVlbmFyYWJpYz0xNTg4LGUuc2hlZW5maW5hbGFyYWJpYz02NTIwNixlLnNoZWVuaW5pdGlhbGFyYWJpYz02NTIwNyxlLnNoZWVubWVkaWFsYXJhYmljPTY1MjA4LGUuc2hlaWNvcHRpYz05OTUsZS5zaGVxZWw9ODM2MixlLnNoZXFlbGhlYnJldz04MzYyLGUuc2hldmE9MTQ1NixlLnNoZXZhMTE1PTE0NTYsZS5zaGV2YTE1PTE0NTYsZS5zaGV2YTIyPTE0NTYsZS5zaGV2YTJlPTE0NTYsZS5zaGV2YWhlYnJldz0xNDU2LGUuc2hldmFuYXJyb3doZWJyZXc9MTQ1NixlLnNoZXZhcXVhcnRlcmhlYnJldz0xNDU2LGUuc2hldmF3aWRlaGVicmV3PTE0NTYsZS5zaGhhY3lyaWxsaWM9MTIxMSxlLnNoaW1hY29wdGljPTEwMDUsZS5zaGluPTE1MTMsZS5zaGluZGFnZXNoPTY0MzI5LGUuc2hpbmRhZ2VzaGhlYnJldz02NDMyOSxlLnNoaW5kYWdlc2hzaGluZG90PTY0MzAwLGUuc2hpbmRhZ2VzaHNoaW5kb3RoZWJyZXc9NjQzMDAsZS5zaGluZGFnZXNoc2luZG90PTY0MzAxLGUuc2hpbmRhZ2VzaHNpbmRvdGhlYnJldz02NDMwMSxlLnNoaW5kb3RoZWJyZXc9MTQ3MyxlLnNoaW5oZWJyZXc9MTUxMyxlLnNoaW5zaGluZG90PTY0Mjk4LGUuc2hpbnNoaW5kb3RoZWJyZXc9NjQyOTgsZS5zaGluc2luZG90PTY0Mjk5LGUuc2hpbnNpbmRvdGhlYnJldz02NDI5OSxlLnNob29rPTY0MixlLnNpZ21hPTk2MyxlLnNpZ21hMT05NjIsZS5zaWdtYWZpbmFsPTk2MixlLnNpZ21hbHVuYXRlc3ltYm9sZ3JlZWs9MTAxMCxlLnNpaGlyYWdhbmE9MTIzNzUsZS5zaWthdGFrYW5hPTEyNDcxLGUuc2lrYXRha2FuYWhhbGZ3aWR0aD02NTQwNCxlLnNpbHVxaGVicmV3PTE0NjksZS5zaWx1cWxlZnRoZWJyZXc9MTQ2OSxlLnNpbWlsYXI9ODc2NCxlLnNpbmRvdGhlYnJldz0xNDc0LGUuc2lvc2FjaXJjbGVrb3JlYW49MTI5MTYsZS5zaW9zYXBhcmVua29yZWFuPTEyODIwLGUuc2lvc2NpZXVja29yZWFuPTEyNjcwLGUuc2lvc2NpcmNsZWtvcmVhbj0xMjkwMixlLnNpb3NraXllb2trb3JlYW49MTI2NjYsZS5zaW9za29yZWFuPTEyNjEzLGUuc2lvc25pZXVua29yZWFuPTEyNjY3LGUuc2lvc3BhcmVua29yZWFuPTEyODA2LGUuc2lvc3BpZXVwa29yZWFuPTEyNjY5LGUuc2lvc3Rpa2V1dGtvcmVhbj0xMjY2OCxlLnNpeD01NCxlLnNpeGFyYWJpYz0xNjM4LGUuc2l4YmVuZ2FsaT0yNTQwLGUuc2l4Y2lyY2xlPTkzMTcsZS5zaXhjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTI3LGUuc2l4ZGV2YT0yNDEyLGUuc2l4Z3VqYXJhdGk9Mjc5NixlLnNpeGd1cm11a2hpPTI2NjgsZS5zaXhoYWNrYXJhYmljPTE2MzgsZS5zaXhoYW5nemhvdT0xMjMyNixlLnNpeGlkZW9ncmFwaGljcGFyZW49MTI4MzcsZS5zaXhpbmZlcmlvcj04MzI2LGUuc2l4bW9ub3NwYWNlPTY1MzAyLGUuc2l4b2xkc3R5bGU9NjMyODYsZS5zaXhwYXJlbj05MzM3LGUuc2l4cGVyaW9kPTkzNTcsZS5zaXhwZXJzaWFuPTE3ODIsZS5zaXhyb21hbj04NTY1LGUuc2l4c3VwZXJpb3I9ODMxMCxlLnNpeHRlZW5jaXJjbGU9OTMyNyxlLnNpeHRlZW5jdXJyZW5jeWRlbm9taW5hdG9yYmVuZ2FsaT0yNTUzLGUuc2l4dGVlbnBhcmVuPTkzNDcsZS5zaXh0ZWVucGVyaW9kPTkzNjcsZS5zaXh0aGFpPTM2NzAsZS5zbGFzaD00NyxlLnNsYXNobW9ub3NwYWNlPTY1Mjk1LGUuc2xvbmc9MzgzLGUuc2xvbmdkb3RhY2NlbnQ9NzgzNSxlLnNtaWxlZmFjZT05Nzg2LGUuc21vbm9zcGFjZT02NTM2MyxlLnNvZnBhc3VxaGVicmV3PTE0NzUsZS5zb2Z0aHlwaGVuPTE3MyxlLnNvZnRzaWduY3lyaWxsaWM9MTEwMCxlLnNvaGlyYWdhbmE9MTIzODEsZS5zb2thdGFrYW5hPTEyNDc3LGUuc29rYXRha2FuYWhhbGZ3aWR0aD02NTQwNyxlLnNvbGlkdXNsb25nb3ZlcmxheWNtYj04MjQsZS5zb2xpZHVzc2hvcnRvdmVybGF5Y21iPTgyMyxlLnNvcnVzaXRoYWk9MzYyNSxlLnNvc2FsYXRoYWk9MzYyNCxlLnNvc290aGFpPTM1OTUsZS5zb3N1YXRoYWk9MzYyNixlLnNwYWNlPTMyLGUuc3BhY2VoYWNrYXJhYmljPTMyLGUuc3BhZGU9OTgyNCxlLnNwYWRlc3VpdGJsYWNrPTk4MjQsZS5zcGFkZXN1aXR3aGl0ZT05ODI4LGUuc3BhcmVuPTkzOTAsZS5zcXVhcmViZWxvd2NtYj04MjcsZS5zcXVhcmVjYz0xMzI1MixlLnNxdWFyZWNtPTEzMjEzLGUuc3F1YXJlZGlhZ29uYWxjcm9zc2hhdGNoZmlsbD05NjQxLGUuc3F1YXJlaG9yaXpvbnRhbGZpbGw9OTYzNixlLnNxdWFyZWtnPTEzMTk5LGUuc3F1YXJla209MTMyMTQsZS5zcXVhcmVrbWNhcGl0YWw9MTMyNjIsZS5zcXVhcmVsbj0xMzI2NSxlLnNxdWFyZWxvZz0xMzI2NixlLnNxdWFyZW1nPTEzMTk4LGUuc3F1YXJlbWlsPTEzMjY5LGUuc3F1YXJlbW09MTMyMTIsZS5zcXVhcmVtc3F1YXJlZD0xMzIxNyxlLnNxdWFyZW9ydGhvZ29uYWxjcm9zc2hhdGNoZmlsbD05NjM4LGUuc3F1YXJldXBwZXJsZWZ0dG9sb3dlcnJpZ2h0ZmlsbD05NjM5LGUuc3F1YXJldXBwZXJyaWdodHRvbG93ZXJsZWZ0ZmlsbD05NjQwLGUuc3F1YXJldmVydGljYWxmaWxsPTk2MzcsZS5zcXVhcmV3aGl0ZXdpdGhzbWFsbGJsYWNrPTk2MzUsZS5zcnNxdWFyZT0xMzI3NSxlLnNzYWJlbmdhbGk9MjQ4NyxlLnNzYWRldmE9MjM1OSxlLnNzYWd1amFyYXRpPTI3NDMsZS5zc2FuZ2NpZXVja29yZWFuPTEyNjE3LGUuc3NhbmdoaWV1aGtvcmVhbj0xMjY3NyxlLnNzYW5naWV1bmdrb3JlYW49MTI2NzIsZS5zc2FuZ2tpeWVva2tvcmVhbj0xMjU5NCxlLnNzYW5nbmlldW5rb3JlYW49MTI2NDUsZS5zc2FuZ3BpZXVwa29yZWFuPTEyNjExLGUuc3NhbmdzaW9za29yZWFuPTEyNjE0LGUuc3Nhbmd0aWtldXRrb3JlYW49MTI2MDAsZS5zc3VwZXJpb3I9NjMyMTgsZS5zdGVybGluZz0xNjMsZS5zdGVybGluZ21vbm9zcGFjZT02NTUwNSxlLnN0cm9rZWxvbmdvdmVybGF5Y21iPTgyMixlLnN0cm9rZXNob3J0b3ZlcmxheWNtYj04MjEsZS5zdWJzZXQ9ODgzNCxlLnN1YnNldG5vdGVxdWFsPTg4NDIsZS5zdWJzZXRvcmVxdWFsPTg4MzgsZS5zdWNjZWVkcz04ODI3LGUuc3VjaHRoYXQ9ODcxNSxlLnN1aGlyYWdhbmE9MTIzNzcsZS5zdWthdGFrYW5hPTEyNDczLGUuc3VrYXRha2FuYWhhbGZ3aWR0aD02NTQwNSxlLnN1a3VuYXJhYmljPTE2MTgsZS5zdW1tYXRpb249ODcyMSxlLnN1bj05Nzg4LGUuc3VwZXJzZXQ9ODgzNSxlLnN1cGVyc2V0bm90ZXF1YWw9ODg0MyxlLnN1cGVyc2V0b3JlcXVhbD04ODM5LGUuc3ZzcXVhcmU9MTMyNzYsZS5zeW91d2FlcmFzcXVhcmU9MTMxODAsZS50PTExNixlLnRhYmVuZ2FsaT0yNDY4LGUudGFja2Rvd249ODg2OCxlLnRhY2tsZWZ0PTg4NjcsZS50YWRldmE9MjM0MCxlLnRhZ3VqYXJhdGk9MjcyNCxlLnRhZ3VybXVraGk9MjU5NixlLnRhaGFyYWJpYz0xNTkxLGUudGFoZmluYWxhcmFiaWM9NjUyMTgsZS50YWhpbml0aWFsYXJhYmljPTY1MjE5LGUudGFoaXJhZ2FuYT0xMjM4MyxlLnRhaG1lZGlhbGFyYWJpYz02NTIyMCxlLnRhaXN5b3VlcmFzcXVhcmU9MTMxODEsZS50YWthdGFrYW5hPTEyNDc5LGUudGFrYXRha2FuYWhhbGZ3aWR0aD02NTQwOCxlLnRhdHdlZWxhcmFiaWM9MTYwMCxlLnRhdT05NjQsZS50YXY9MTUxNCxlLnRhdmRhZ2VzPTY0MzMwLGUudGF2ZGFnZXNoPTY0MzMwLGUudGF2ZGFnZXNoaGVicmV3PTY0MzMwLGUudGF2aGVicmV3PTE1MTQsZS50YmFyPTM1OSxlLnRib3BvbW9mbz0xMjU1NCxlLnRjYXJvbj0zNTcsZS50Y2N1cmw9NjgwLGUudGNlZGlsbGE9MzU1LGUudGNoZWhhcmFiaWM9MTY3MCxlLnRjaGVoZmluYWxhcmFiaWM9NjQzNzksZS50Y2hlaGluaXRpYWxhcmFiaWM9NjQzODAsZS50Y2hlaG1lZGlhbGFyYWJpYz02NDM4MSxlLnRjaXJjbGU9OTQ0MyxlLnRjaXJjdW1mbGV4YmVsb3c9Nzc5MyxlLnRjb21tYWFjY2VudD0zNTUsZS50ZGllcmVzaXM9NzgzMSxlLnRkb3RhY2NlbnQ9Nzc4NyxlLnRkb3RiZWxvdz03Nzg5LGUudGVjeXJpbGxpYz0xMDkwLGUudGVkZXNjZW5kZXJjeXJpbGxpYz0xMTk3LGUudGVoYXJhYmljPTE1NzgsZS50ZWhmaW5hbGFyYWJpYz02NTE3NCxlLnRlaGhhaGluaXRpYWxhcmFiaWM9NjQ2NzQsZS50ZWhoYWhpc29sYXRlZGFyYWJpYz02NDUyNCxlLnRlaGluaXRpYWxhcmFiaWM9NjUxNzUsZS50ZWhpcmFnYW5hPTEyMzkwLGUudGVoamVlbWluaXRpYWxhcmFiaWM9NjQ2NzMsZS50ZWhqZWVtaXNvbGF0ZWRhcmFiaWM9NjQ1MjMsZS50ZWhtYXJidXRhYXJhYmljPTE1NzcsZS50ZWhtYXJidXRhZmluYWxhcmFiaWM9NjUxNzIsZS50ZWhtZWRpYWxhcmFiaWM9NjUxNzYsZS50ZWhtZWVtaW5pdGlhbGFyYWJpYz02NDY3NixlLnRlaG1lZW1pc29sYXRlZGFyYWJpYz02NDUyNixlLnRlaG5vb25maW5hbGFyYWJpYz02NDYyNyxlLnRla2F0YWthbmE9MTI0ODYsZS50ZWthdGFrYW5haGFsZndpZHRoPTY1NDExLGUudGVsZXBob25lPTg0ODEsZS50ZWxlcGhvbmVibGFjaz05NzQyLGUudGVsaXNoYWdlZG9sYWhlYnJldz0xNDQwLGUudGVsaXNoYXFldGFuYWhlYnJldz0xNDQ5LGUudGVuY2lyY2xlPTkzMjEsZS50ZW5pZGVvZ3JhcGhpY3BhcmVuPTEyODQxLGUudGVucGFyZW49OTM0MSxlLnRlbnBlcmlvZD05MzYxLGUudGVucm9tYW49ODU2OSxlLnRlc2g9Njc5LGUudGV0PTE0OTYsZS50ZXRkYWdlc2g9NjQzMTIsZS50ZXRkYWdlc2hoZWJyZXc9NjQzMTIsZS50ZXRoZWJyZXc9MTQ5NixlLnRldHNlY3lyaWxsaWM9MTIwNSxlLnRldmlyaGVicmV3PTE0MzUsZS50ZXZpcmxlZnRoZWJyZXc9MTQzNSxlLnRoYWJlbmdhbGk9MjQ2OSxlLnRoYWRldmE9MjM0MSxlLnRoYWd1amFyYXRpPTI3MjUsZS50aGFndXJtdWtoaT0yNTk3LGUudGhhbGFyYWJpYz0xNTg0LGUudGhhbGZpbmFsYXJhYmljPTY1MTk2LGUudGhhbnRoYWtoYXRsb3dsZWZ0dGhhaT02MzY0MCxlLnRoYW50aGFraGF0bG93cmlnaHR0aGFpPTYzNjM5LGUudGhhbnRoYWtoYXR0aGFpPTM2NjAsZS50aGFudGhha2hhdHVwcGVybGVmdHRoYWk9NjM2MzgsZS50aGVoYXJhYmljPTE1NzksZS50aGVoZmluYWxhcmFiaWM9NjUxNzgsZS50aGVoaW5pdGlhbGFyYWJpYz02NTE3OSxlLnRoZWhtZWRpYWxhcmFiaWM9NjUxODAsZS50aGVyZWV4aXN0cz04NzA3LGUudGhlcmVmb3JlPTg3NTYsZS50aGV0YT05NTIsZS50aGV0YTE9OTc3LGUudGhldGFzeW1ib2xncmVlaz05NzcsZS50aGlldXRoYWNpcmNsZWtvcmVhbj0xMjkyMSxlLnRoaWV1dGhhcGFyZW5rb3JlYW49MTI4MjUsZS50aGlldXRoY2lyY2xla29yZWFuPTEyOTA3LGUudGhpZXV0aGtvcmVhbj0xMjYyMCxlLnRoaWV1dGhwYXJlbmtvcmVhbj0xMjgxMSxlLnRoaXJ0ZWVuY2lyY2xlPTkzMjQsZS50aGlydGVlbnBhcmVuPTkzNDQsZS50aGlydGVlbnBlcmlvZD05MzY0LGUudGhvbmFuZ21vbnRob3RoYWk9MzYwMSxlLnRob29rPTQyOSxlLnRob3BodXRoYW90aGFpPTM2MDIsZS50aG9ybj0yNTQsZS50aG90aGFoYW50aGFpPTM2MDcsZS50aG90aGFudGhhaT0zNjAwLGUudGhvdGhvbmd0aGFpPTM2MDgsZS50aG90aHVuZ3RoYWk9MzYwNixlLnRob3VzYW5kY3lyaWxsaWM9MTE1NCxlLnRob3VzYW5kc3NlcGFyYXRvcmFyYWJpYz0xNjQ0LGUudGhvdXNhbmRzc2VwYXJhdG9ycGVyc2lhbj0xNjQ0LGUudGhyZWU9NTEsZS50aHJlZWFyYWJpYz0xNjM1LGUudGhyZWViZW5nYWxpPTI1MzcsZS50aHJlZWNpcmNsZT05MzE0LGUudGhyZWVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTI0LGUudGhyZWVkZXZhPTI0MDksZS50aHJlZWVpZ2h0aHM9ODU0MCxlLnRocmVlZ3VqYXJhdGk9Mjc5MyxlLnRocmVlZ3VybXVraGk9MjY2NSxlLnRocmVlaGFja2FyYWJpYz0xNjM1LGUudGhyZWVoYW5nemhvdT0xMjMyMyxlLnRocmVlaWRlb2dyYXBoaWNwYXJlbj0xMjgzNCxlLnRocmVlaW5mZXJpb3I9ODMyMyxlLnRocmVlbW9ub3NwYWNlPTY1Mjk5LGUudGhyZWVudW1lcmF0b3JiZW5nYWxpPTI1NTAsZS50aHJlZW9sZHN0eWxlPTYzMjgzLGUudGhyZWVwYXJlbj05MzM0LGUudGhyZWVwZXJpb2Q9OTM1NCxlLnRocmVlcGVyc2lhbj0xNzc5LGUudGhyZWVxdWFydGVycz0xOTAsZS50aHJlZXF1YXJ0ZXJzZW1kYXNoPTYzMTk4LGUudGhyZWVyb21hbj04NTYyLGUudGhyZWVzdXBlcmlvcj0xNzksZS50aHJlZXRoYWk9MzY2NyxlLnRoenNxdWFyZT0xMzIwNCxlLnRpaGlyYWdhbmE9MTIzODUsZS50aWthdGFrYW5hPTEyNDgxLGUudGlrYXRha2FuYWhhbGZ3aWR0aD02NTQwOSxlLnRpa2V1dGFjaXJjbGVrb3JlYW49MTI5MTIsZS50aWtldXRhcGFyZW5rb3JlYW49MTI4MTYsZS50aWtldXRjaXJjbGVrb3JlYW49MTI4OTgsZS50aWtldXRrb3JlYW49MTI1OTksZS50aWtldXRwYXJlbmtvcmVhbj0xMjgwMixlLnRpbGRlPTczMixlLnRpbGRlYmVsb3djbWI9ODE2LGUudGlsZGVjbWI9NzcxLGUudGlsZGVjb21iPTc3MSxlLnRpbGRlZG91YmxlY21iPTg2NCxlLnRpbGRlb3BlcmF0b3I9ODc2NCxlLnRpbGRlb3ZlcmxheWNtYj04MjAsZS50aWxkZXZlcnRpY2FsY21iPTgzMCxlLnRpbWVzY2lyY2xlPTg4NTUsZS50aXBlaGFoZWJyZXc9MTQzMCxlLnRpcGVoYWxlZnRoZWJyZXc9MTQzMCxlLnRpcHBpZ3VybXVraGk9MjY3MixlLnRpdGxvY3lyaWxsaWNjbWI9MTE1NSxlLnRpd25hcm1lbmlhbj0xNDA3LGUudGxpbmViZWxvdz03NzkxLGUudG1vbm9zcGFjZT02NTM2NCxlLnRvYXJtZW5pYW49MTM4NSxlLnRvaGlyYWdhbmE9MTIzOTIsZS50b2thdGFrYW5hPTEyNDg4LGUudG9rYXRha2FuYWhhbGZ3aWR0aD02NTQxMixlLnRvbmViYXJleHRyYWhpZ2htb2Q9NzQxLGUudG9uZWJhcmV4dHJhbG93bW9kPTc0NSxlLnRvbmViYXJoaWdobW9kPTc0MixlLnRvbmViYXJsb3dtb2Q9NzQ0LGUudG9uZWJhcm1pZG1vZD03NDMsZS50b25lZml2ZT00NDUsZS50b25lc2l4PTM4OSxlLnRvbmV0d289NDI0LGUudG9ub3M9OTAwLGUudG9uc3F1YXJlPTEzMDk1LGUudG9wYXRha3RoYWk9MzU5OSxlLnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdD0xMjMwOCxlLnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHNtYWxsPTY1MTE3LGUudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0dmVydGljYWw9NjUwODEsZS50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0PTEyMzA5LGUudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHNtYWxsPTY1MTE4LGUudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHZlcnRpY2FsPTY1MDgyLGUudG90YW90aGFpPTM2MDUsZS50cGFsYXRhbGhvb2s9NDI3LGUudHBhcmVuPTkzOTEsZS50cmFkZW1hcms9ODQ4MixlLnRyYWRlbWFya3NhbnM9NjM3MjIsZS50cmFkZW1hcmtzZXJpZj02MzE5NSxlLnRyZXRyb2ZsZXhob29rPTY0OCxlLnRyaWFnZG49OTY2MCxlLnRyaWFnbGY9OTY2OCxlLnRyaWFncnQ9OTY1OCxlLnRyaWFndXA9OTY1MCxlLnRzPTY3OCxlLnRzYWRpPTE1MTAsZS50c2FkaWRhZ2VzaD02NDMyNixlLnRzYWRpZGFnZXNoaGVicmV3PTY0MzI2LGUudHNhZGloZWJyZXc9MTUxMCxlLnRzZWN5cmlsbGljPTEwOTQsZS50c2VyZT0xNDYxLGUudHNlcmUxMj0xNDYxLGUudHNlcmUxZT0xNDYxLGUudHNlcmUyYj0xNDYxLGUudHNlcmVoZWJyZXc9MTQ2MSxlLnRzZXJlbmFycm93aGVicmV3PTE0NjEsZS50c2VyZXF1YXJ0ZXJoZWJyZXc9MTQ2MSxlLnRzZXJld2lkZWhlYnJldz0xNDYxLGUudHNoZWN5cmlsbGljPTExMTUsZS50c3VwZXJpb3I9NjMyMTksZS50dGFiZW5nYWxpPTI0NjMsZS50dGFkZXZhPTIzMzUsZS50dGFndWphcmF0aT0yNzE5LGUudHRhZ3VybXVraGk9MjU5MSxlLnR0ZWhhcmFiaWM9MTY1NyxlLnR0ZWhmaW5hbGFyYWJpYz02NDM1OSxlLnR0ZWhpbml0aWFsYXJhYmljPTY0MzYwLGUudHRlaG1lZGlhbGFyYWJpYz02NDM2MSxlLnR0aGFiZW5nYWxpPTI0NjQsZS50dGhhZGV2YT0yMzM2LGUudHRoYWd1amFyYXRpPTI3MjAsZS50dGhhZ3VybXVraGk9MjU5MixlLnR0dXJuZWQ9NjQ3LGUudHVoaXJhZ2FuYT0xMjM4OCxlLnR1a2F0YWthbmE9MTI0ODQsZS50dWthdGFrYW5haGFsZndpZHRoPTY1NDEwLGUudHVzbWFsbGhpcmFnYW5hPTEyMzg3LGUudHVzbWFsbGthdGFrYW5hPTEyNDgzLGUudHVzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1MzkxLGUudHdlbHZlY2lyY2xlPTkzMjMsZS50d2VsdmVwYXJlbj05MzQzLGUudHdlbHZlcGVyaW9kPTkzNjMsZS50d2VsdmVyb21hbj04NTcxLGUudHdlbnR5Y2lyY2xlPTkzMzEsZS50d2VudHloYW5nemhvdT0yMTMxNixlLnR3ZW50eXBhcmVuPTkzNTEsZS50d2VudHlwZXJpb2Q9OTM3MSxlLnR3bz01MCxlLnR3b2FyYWJpYz0xNjM0LGUudHdvYmVuZ2FsaT0yNTM2LGUudHdvY2lyY2xlPTkzMTMsZS50d29jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmPTEwMTIzLGUudHdvZGV2YT0yNDA4LGUudHdvZG90ZW5sZWFkZXI9ODIyOSxlLnR3b2RvdGxlYWRlcj04MjI5LGUudHdvZG90bGVhZGVydmVydGljYWw9NjUwNzIsZS50d29ndWphcmF0aT0yNzkyLGUudHdvZ3VybXVraGk9MjY2NCxlLnR3b2hhY2thcmFiaWM9MTYzNCxlLnR3b2hhbmd6aG91PTEyMzIyLGUudHdvaWRlb2dyYXBoaWNwYXJlbj0xMjgzMyxlLnR3b2luZmVyaW9yPTgzMjIsZS50d29tb25vc3BhY2U9NjUyOTgsZS50d29udW1lcmF0b3JiZW5nYWxpPTI1NDksZS50d29vbGRzdHlsZT02MzI4MixlLnR3b3BhcmVuPTkzMzMsZS50d29wZXJpb2Q9OTM1MyxlLnR3b3BlcnNpYW49MTc3OCxlLnR3b3JvbWFuPTg1NjEsZS50d29zdHJva2U9NDQzLGUudHdvc3VwZXJpb3I9MTc4LGUudHdvdGhhaT0zNjY2LGUudHdvdGhpcmRzPTg1MzIsZS51PTExNyxlLnVhY3V0ZT0yNTAsZS51YmFyPTY0OSxlLnViZW5nYWxpPTI0NDEsZS51Ym9wb21vZm89MTI1ODQsZS51YnJldmU9MzY1LGUudWNhcm9uPTQ2OCxlLnVjaXJjbGU9OTQ0NCxlLnVjaXJjdW1mbGV4PTI1MSxlLnVjaXJjdW1mbGV4YmVsb3c9Nzc5OSxlLnVjeXJpbGxpYz0xMDkxLGUudWRhdHRhZGV2YT0yMzg1LGUudWRibGFjdXRlPTM2OSxlLnVkYmxncmF2ZT01MzMsZS51ZGV2YT0yMzEzLGUudWRpZXJlc2lzPTI1MixlLnVkaWVyZXNpc2FjdXRlPTQ3MixlLnVkaWVyZXNpc2JlbG93PTc3OTUsZS51ZGllcmVzaXNjYXJvbj00NzQsZS51ZGllcmVzaXNjeXJpbGxpYz0xMjY1LGUudWRpZXJlc2lzZ3JhdmU9NDc2LGUudWRpZXJlc2lzbWFjcm9uPTQ3MCxlLnVkb3RiZWxvdz03OTA5LGUudWdyYXZlPTI0OSxlLnVndWphcmF0aT0yNjk3LGUudWd1cm11a2hpPTI1NjksZS51aGlyYWdhbmE9MTIzNTgsZS51aG9va2Fib3ZlPTc5MTEsZS51aG9ybj00MzIsZS51aG9ybmFjdXRlPTc5MTMsZS51aG9ybmRvdGJlbG93PTc5MjEsZS51aG9ybmdyYXZlPTc5MTUsZS51aG9ybmhvb2thYm92ZT03OTE3LGUudWhvcm50aWxkZT03OTE5LGUudWh1bmdhcnVtbGF1dD0zNjksZS51aHVuZ2FydW1sYXV0Y3lyaWxsaWM9MTI2NyxlLnVpbnZlcnRlZGJyZXZlPTUzNSxlLnVrYXRha2FuYT0xMjQ1NCxlLnVrYXRha2FuYWhhbGZ3aWR0aD02NTM5NSxlLnVrY3lyaWxsaWM9MTE0NSxlLnVrb3JlYW49MTI2MzYsZS51bWFjcm9uPTM2MyxlLnVtYWNyb25jeXJpbGxpYz0xMjYzLGUudW1hY3JvbmRpZXJlc2lzPTc4MDMsZS51bWF0cmFndXJtdWtoaT0yNjI1LGUudW1vbm9zcGFjZT02NTM2NSxlLnVuZGVyc2NvcmU9OTUsZS51bmRlcnNjb3JlZGJsPTgyMTUsZS51bmRlcnNjb3JlbW9ub3NwYWNlPTY1MzQzLGUudW5kZXJzY29yZXZlcnRpY2FsPTY1MDc1LGUudW5kZXJzY29yZXdhdnk9NjUxMDMsZS51bmlvbj04NzQ2LGUudW5pdmVyc2FsPTg3MDQsZS51b2dvbmVrPTM3MSxlLnVwYXJlbj05MzkyLGUudXBibG9jaz05NjAwLGUudXBwZXJkb3RoZWJyZXc9MTQ3NixlLnVwc2lsb249OTY1LGUudXBzaWxvbmRpZXJlc2lzPTk3MSxlLnVwc2lsb25kaWVyZXNpc3Rvbm9zPTk0NCxlLnVwc2lsb25sYXRpbj02NTAsZS51cHNpbG9udG9ub3M9OTczLGUudXB0YWNrYmVsb3djbWI9Nzk3LGUudXB0YWNrbW9kPTcyNCxlLnVyYWd1cm11a2hpPTI2NzUsZS51cmluZz0zNjcsZS51c2hvcnRjeXJpbGxpYz0xMTE4LGUudXNtYWxsaGlyYWdhbmE9MTIzNTcsZS51c21hbGxrYXRha2FuYT0xMjQ1MyxlLnVzbWFsbGthdGFrYW5haGFsZndpZHRoPTY1Mzg1LGUudXN0cmFpZ2h0Y3lyaWxsaWM9MTE5OSxlLnVzdHJhaWdodHN0cm9rZWN5cmlsbGljPTEyMDEsZS51dGlsZGU9MzYxLGUudXRpbGRlYWN1dGU9NzgwMSxlLnV0aWxkZWJlbG93PTc3OTcsZS51dWJlbmdhbGk9MjQ0MixlLnV1ZGV2YT0yMzE0LGUudXVndWphcmF0aT0yNjk4LGUudXVndXJtdWtoaT0yNTcwLGUudXVtYXRyYWd1cm11a2hpPTI2MjYsZS51dXZvd2Vsc2lnbmJlbmdhbGk9MjQ5OCxlLnV1dm93ZWxzaWduZGV2YT0yMzcwLGUudXV2b3dlbHNpZ25ndWphcmF0aT0yNzU0LGUudXZvd2Vsc2lnbmJlbmdhbGk9MjQ5NyxlLnV2b3dlbHNpZ25kZXZhPTIzNjksZS51dm93ZWxzaWduZ3VqYXJhdGk9Mjc1MyxlLnY9MTE4LGUudmFkZXZhPTIzNTcsZS52YWd1amFyYXRpPTI3NDEsZS52YWd1cm11a2hpPTI2MTMsZS52YWthdGFrYW5hPTEyNTM1LGUudmF2PTE0OTMsZS52YXZkYWdlc2g9NjQzMDksZS52YXZkYWdlc2g2NT02NDMwOSxlLnZhdmRhZ2VzaGhlYnJldz02NDMwOSxlLnZhdmhlYnJldz0xNDkzLGUudmF2aG9sYW09NjQzMzEsZS52YXZob2xhbWhlYnJldz02NDMzMSxlLnZhdnZhdmhlYnJldz0xNTIwLGUudmF2eW9kaGVicmV3PTE1MjEsZS52Y2lyY2xlPTk0NDUsZS52ZG90YmVsb3c9NzgwNyxlLnZlY3lyaWxsaWM9MTA3NCxlLnZlaGFyYWJpYz0xNzAwLGUudmVoZmluYWxhcmFiaWM9NjQzNjMsZS52ZWhpbml0aWFsYXJhYmljPTY0MzY0LGUudmVobWVkaWFsYXJhYmljPTY0MzY1LGUudmVrYXRha2FuYT0xMjUzNyxlLnZlbnVzPTk3OTIsZS52ZXJ0aWNhbGJhcj0xMjQsZS52ZXJ0aWNhbGxpbmVhYm92ZWNtYj03ODEsZS52ZXJ0aWNhbGxpbmViZWxvd2NtYj04MDksZS52ZXJ0aWNhbGxpbmVsb3dtb2Q9NzE2LGUudmVydGljYWxsaW5lbW9kPTcxMixlLnZld2FybWVuaWFuPTE0MDYsZS52aG9vaz02NTEsZS52aWthdGFrYW5hPTEyNTM2LGUudmlyYW1hYmVuZ2FsaT0yNTA5LGUudmlyYW1hZGV2YT0yMzgxLGUudmlyYW1hZ3VqYXJhdGk9Mjc2NSxlLnZpc2FyZ2FiZW5nYWxpPTI0MzUsZS52aXNhcmdhZGV2YT0yMzA3LGUudmlzYXJnYWd1amFyYXRpPTI2OTEsZS52bW9ub3NwYWNlPTY1MzY2LGUudm9hcm1lbmlhbj0xNDAwLGUudm9pY2VkaXRlcmF0aW9uaGlyYWdhbmE9MTI0NDYsZS52b2ljZWRpdGVyYXRpb25rYXRha2FuYT0xMjU0MixlLnZvaWNlZG1hcmtrYW5hPTEyNDQzLGUudm9pY2VkbWFya2thbmFoYWxmd2lkdGg9NjU0MzgsZS52b2thdGFrYW5hPTEyNTM4LGUudnBhcmVuPTkzOTMsZS52dGlsZGU9NzgwNSxlLnZ0dXJuZWQ9NjUyLGUudnVoaXJhZ2FuYT0xMjQzNixlLnZ1a2F0YWthbmE9MTI1MzIsZS53PTExOSxlLndhY3V0ZT03ODExLGUud2Fla29yZWFuPTEyNjMzLGUud2FoaXJhZ2FuYT0xMjQzMSxlLndha2F0YWthbmE9MTI1MjcsZS53YWthdGFrYW5haGFsZndpZHRoPTY1NDM2LGUud2Frb3JlYW49MTI2MzIsZS53YXNtYWxsaGlyYWdhbmE9MTI0MzAsZS53YXNtYWxsa2F0YWthbmE9MTI1MjYsZS53YXR0b3NxdWFyZT0xMzE0MyxlLndhdmVkYXNoPTEyMzE2LGUud2F2eXVuZGVyc2NvcmV2ZXJ0aWNhbD02NTA3NixlLndhd2FyYWJpYz0xNjA4LGUud2F3ZmluYWxhcmFiaWM9NjUyNjIsZS53YXdoYW16YWFib3ZlYXJhYmljPTE1NzIsZS53YXdoYW16YWFib3ZlZmluYWxhcmFiaWM9NjUxNTgsZS53YnNxdWFyZT0xMzI3NyxlLndjaXJjbGU9OTQ0NixlLndjaXJjdW1mbGV4PTM3MyxlLndkaWVyZXNpcz03ODEzLGUud2RvdGFjY2VudD03ODE1LGUud2RvdGJlbG93PTc4MTcsZS53ZWhpcmFnYW5hPTEyNDMzLGUud2VpZXJzdHJhc3M9ODQ3MixlLndla2F0YWthbmE9MTI1MjksZS53ZWtvcmVhbj0xMjYzOCxlLndlb2tvcmVhbj0xMjYzNyxlLndncmF2ZT03ODA5LGUud2hpdGVidWxsZXQ9OTcwMixlLndoaXRlY2lyY2xlPTk2NzUsZS53aGl0ZWNpcmNsZWludmVyc2U9OTY4OSxlLndoaXRlY29ybmVyYnJhY2tldGxlZnQ9MTIzMDIsZS53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0dmVydGljYWw9NjUwOTEsZS53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodD0xMjMwMyxlLndoaXRlY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWw9NjUwOTIsZS53aGl0ZWRpYW1vbmQ9OTY3MSxlLndoaXRlZGlhbW9uZGNvbnRhaW5pbmdibGFja3NtYWxsZGlhbW9uZD05NjcyLGUud2hpdGVkb3ducG9pbnRpbmdzbWFsbHRyaWFuZ2xlPTk2NjM7ZS53aGl0ZWRvd25wb2ludGluZ3RyaWFuZ2xlPTk2NjEsZS53aGl0ZWxlZnRwb2ludGluZ3NtYWxsdHJpYW5nbGU9OTY2NyxlLndoaXRlbGVmdHBvaW50aW5ndHJpYW5nbGU9OTY2NSxlLndoaXRlbGVudGljdWxhcmJyYWNrZXRsZWZ0PTEyMzEwLGUud2hpdGVsZW50aWN1bGFyYnJhY2tldHJpZ2h0PTEyMzExLGUud2hpdGVyaWdodHBvaW50aW5nc21hbGx0cmlhbmdsZT05NjU3LGUud2hpdGVyaWdodHBvaW50aW5ndHJpYW5nbGU9OTY1NSxlLndoaXRlc21hbGxzcXVhcmU9OTY0MyxlLndoaXRlc21pbGluZ2ZhY2U9OTc4NixlLndoaXRlc3F1YXJlPTk2MzMsZS53aGl0ZXN0YXI9OTczNCxlLndoaXRldGVsZXBob25lPTk3NDMsZS53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdD0xMjMxMixlLndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodD0xMjMxMyxlLndoaXRldXBwb2ludGluZ3NtYWxsdHJpYW5nbGU9OTY1MyxlLndoaXRldXBwb2ludGluZ3RyaWFuZ2xlPTk2NTEsZS53aWhpcmFnYW5hPTEyNDMyLGUud2lrYXRha2FuYT0xMjUyOCxlLndpa29yZWFuPTEyNjM5LGUud21vbm9zcGFjZT02NTM2NyxlLndvaGlyYWdhbmE9MTI0MzQsZS53b2thdGFrYW5hPTEyNTMwLGUud29rYXRha2FuYWhhbGZ3aWR0aD02NTM4MixlLndvbj04MzYxLGUud29ubW9ub3NwYWNlPTY1NTEwLGUud293YWVudGhhaT0zNjIzLGUud3BhcmVuPTkzOTQsZS53cmluZz03ODMyLGUud3N1cGVyaW9yPTY5NSxlLnd0dXJuZWQ9NjUzLGUud3lubj00NDcsZS54PTEyMCxlLnhhYm92ZWNtYj04MjksZS54Ym9wb21vZm89MTI1NjIsZS54Y2lyY2xlPTk0NDcsZS54ZGllcmVzaXM9NzgyMSxlLnhkb3RhY2NlbnQ9NzgxOSxlLnhlaGFybWVuaWFuPTEzODksZS54aT05NTgsZS54bW9ub3NwYWNlPTY1MzY4LGUueHBhcmVuPTkzOTUsZS54c3VwZXJpb3I9NzM5LGUueT0xMjEsZS55YWFkb3NxdWFyZT0xMzEzNCxlLnlhYmVuZ2FsaT0yNDc5LGUueWFjdXRlPTI1MyxlLnlhZGV2YT0yMzUxLGUueWFla29yZWFuPTEyNjI2LGUueWFndWphcmF0aT0yNzM1LGUueWFndXJtdWtoaT0yNjA3LGUueWFoaXJhZ2FuYT0xMjQyMCxlLnlha2F0YWthbmE9MTI1MTYsZS55YWthdGFrYW5haGFsZndpZHRoPTY1NDI4LGUueWFrb3JlYW49MTI2MjUsZS55YW1ha2thbnRoYWk9MzY2MixlLnlhc21hbGxoaXJhZ2FuYT0xMjQxOSxlLnlhc21hbGxrYXRha2FuYT0xMjUxNSxlLnlhc21hbGxrYXRha2FuYWhhbGZ3aWR0aD02NTM4OCxlLnlhdGN5cmlsbGljPTExMjMsZS55Y2lyY2xlPTk0NDgsZS55Y2lyY3VtZmxleD0zNzUsZS55ZGllcmVzaXM9MjU1LGUueWRvdGFjY2VudD03ODIzLGUueWRvdGJlbG93PTc5MjUsZS55ZWhhcmFiaWM9MTYxMCxlLnllaGJhcnJlZWFyYWJpYz0xNzQ2LGUueWVoYmFycmVlZmluYWxhcmFiaWM9NjQ0MzEsZS55ZWhmaW5hbGFyYWJpYz02NTI2NixlLnllaGhhbXphYWJvdmVhcmFiaWM9MTU3NCxlLnllaGhhbXphYWJvdmVmaW5hbGFyYWJpYz02NTE2MixlLnllaGhhbXphYWJvdmVpbml0aWFsYXJhYmljPTY1MTYzLGUueWVoaGFtemFhYm92ZW1lZGlhbGFyYWJpYz02NTE2NCxlLnllaGluaXRpYWxhcmFiaWM9NjUyNjcsZS55ZWhtZWRpYWxhcmFiaWM9NjUyNjgsZS55ZWhtZWVtaW5pdGlhbGFyYWJpYz02NDczMyxlLnllaG1lZW1pc29sYXRlZGFyYWJpYz02NDYwMCxlLnllaG5vb25maW5hbGFyYWJpYz02NDY2MCxlLnllaHRocmVlZG90c2JlbG93YXJhYmljPTE3NDUsZS55ZWtvcmVhbj0xMjYzMCxlLnllbj0xNjUsZS55ZW5tb25vc3BhY2U9NjU1MDksZS55ZW9rb3JlYW49MTI2MjksZS55ZW9yaW5oaWV1aGtvcmVhbj0xMjY3OCxlLnllcmFoYmVueW9tb2hlYnJldz0xNDUwLGUueWVyYWhiZW55b21vbGVmdGhlYnJldz0xNDUwLGUueWVyaWN5cmlsbGljPTEwOTksZS55ZXJ1ZGllcmVzaXNjeXJpbGxpYz0xMjczLGUueWVzaWV1bmdrb3JlYW49MTI2NzMsZS55ZXNpZXVuZ3BhbnNpb3Nrb3JlYW49MTI2NzUsZS55ZXNpZXVuZ3Npb3Nrb3JlYW49MTI2NzQsZS55ZXRpdmhlYnJldz0xNDM0LGUueWdyYXZlPTc5MjMsZS55aG9vaz00MzYsZS55aG9va2Fib3ZlPTc5MjcsZS55aWFybWVuaWFuPTEzOTcsZS55aWN5cmlsbGljPTExMTEsZS55aWtvcmVhbj0xMjY0MixlLnlpbnlhbmc9OTc3NSxlLnlpd25hcm1lbmlhbj0xNDEwLGUueW1vbm9zcGFjZT02NTM2OSxlLnlvZD0xNDk3LGUueW9kZGFnZXNoPTY0MzEzLGUueW9kZGFnZXNoaGVicmV3PTY0MzEzLGUueW9kaGVicmV3PTE0OTcsZS55b2R5b2RoZWJyZXc9MTUyMixlLnlvZHlvZHBhdGFoaGVicmV3PTY0Mjg3LGUueW9oaXJhZ2FuYT0xMjQyNCxlLnlvaWtvcmVhbj0xMjY4MSxlLnlva2F0YWthbmE9MTI1MjAsZS55b2thdGFrYW5haGFsZndpZHRoPTY1NDMwLGUueW9rb3JlYW49MTI2MzUsZS55b3NtYWxsaGlyYWdhbmE9MTI0MjMsZS55b3NtYWxsa2F0YWthbmE9MTI1MTksZS55b3NtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzOTAsZS55b3RncmVlaz0xMDExLGUueW95YWVrb3JlYW49MTI2ODAsZS55b3lha29yZWFuPTEyNjc5LGUueW95YWt0aGFpPTM2MTgsZS55b3lpbmd0aGFpPTM1OTcsZS55cGFyZW49OTM5NixlLnlwb2dlZ3JhbW1lbmk9ODkwLGUueXBvZ2VncmFtbWVuaWdyZWVrY21iPTgzNyxlLnlyPTQyMixlLnlyaW5nPTc4MzMsZS55c3VwZXJpb3I9Njk2LGUueXRpbGRlPTc5MjksZS55dHVybmVkPTY1NCxlLnl1aGlyYWdhbmE9MTI0MjIsZS55dWlrb3JlYW49MTI2ODQsZS55dWthdGFrYW5hPTEyNTE4LGUueXVrYXRha2FuYWhhbGZ3aWR0aD02NTQyOSxlLnl1a29yZWFuPTEyNjQwLGUueXVzYmlnY3lyaWxsaWM9MTEzMSxlLnl1c2JpZ2lvdGlmaWVkY3lyaWxsaWM9MTEzMyxlLnl1c2xpdHRsZWN5cmlsbGljPTExMjcsZS55dXNsaXR0bGVpb3RpZmllZGN5cmlsbGljPTExMjksZS55dXNtYWxsaGlyYWdhbmE9MTI0MjEsZS55dXNtYWxsa2F0YWthbmE9MTI1MTcsZS55dXNtYWxsa2F0YWthbmFoYWxmd2lkdGg9NjUzODksZS55dXlla29yZWFuPTEyNjgzLGUueXV5ZW9rb3JlYW49MTI2ODIsZS55eWFiZW5nYWxpPTI1MjcsZS55eWFkZXZhPTIzOTksZS56PTEyMixlLnphYXJtZW5pYW49MTM4MixlLnphY3V0ZT0zNzgsZS56YWRldmE9MjM5NSxlLnphZ3VybXVraGk9MjY1MSxlLnphaGFyYWJpYz0xNTkyLGUuemFoZmluYWxhcmFiaWM9NjUyMjIsZS56YWhpbml0aWFsYXJhYmljPTY1MjIzLGUuemFoaXJhZ2FuYT0xMjM3NCxlLnphaG1lZGlhbGFyYWJpYz02NTIyNCxlLnphaW5hcmFiaWM9MTU4NixlLnphaW5maW5hbGFyYWJpYz02NTIwMCxlLnpha2F0YWthbmE9MTI0NzAsZS56YXFlZmdhZG9saGVicmV3PTE0MjksZS56YXFlZnFhdGFuaGVicmV3PTE0MjgsZS56YXJxYWhlYnJldz0xNDMyLGUuemF5aW49MTQ5NCxlLnpheWluZGFnZXNoPTY0MzEwLGUuemF5aW5kYWdlc2hoZWJyZXc9NjQzMTAsZS56YXlpbmhlYnJldz0xNDk0LGUuemJvcG9tb2ZvPTEyNTY3LGUuemNhcm9uPTM4MixlLnpjaXJjbGU9OTQ0OSxlLnpjaXJjdW1mbGV4PTc4MjUsZS56Y3VybD02NTcsZS56ZG90PTM4MCxlLnpkb3RhY2NlbnQ9MzgwLGUuemRvdGJlbG93PTc4MjcsZS56ZWN5cmlsbGljPTEwNzksZS56ZWRlc2NlbmRlcmN5cmlsbGljPTExNzcsZS56ZWRpZXJlc2lzY3lyaWxsaWM9MTI0NyxlLnplaGlyYWdhbmE9MTIzODAsZS56ZWthdGFrYW5hPTEyNDc2LGUuemVybz00OCxlLnplcm9hcmFiaWM9MTYzMixlLnplcm9iZW5nYWxpPTI1MzQsZS56ZXJvZGV2YT0yNDA2LGUuemVyb2d1amFyYXRpPTI3OTAsZS56ZXJvZ3VybXVraGk9MjY2MixlLnplcm9oYWNrYXJhYmljPTE2MzIsZS56ZXJvaW5mZXJpb3I9ODMyMCxlLnplcm9tb25vc3BhY2U9NjUyOTYsZS56ZXJvb2xkc3R5bGU9NjMyODAsZS56ZXJvcGVyc2lhbj0xNzc2LGUuemVyb3N1cGVyaW9yPTgzMDQsZS56ZXJvdGhhaT0zNjY0LGUuemVyb3dpZHRoam9pbmVyPTY1Mjc5LGUuemVyb3dpZHRobm9uam9pbmVyPTgyMDQsZS56ZXJvd2lkdGhzcGFjZT04MjAzLGUuemV0YT05NTAsZS56aGJvcG9tb2ZvPTEyNTYzLGUuemhlYXJtZW5pYW49MTM4NixlLnpoZWJyZXZlY3lyaWxsaWM9MTIxOCxlLnpoZWN5cmlsbGljPTEwNzgsZS56aGVkZXNjZW5kZXJjeXJpbGxpYz0xMTc1LGUuemhlZGllcmVzaXNjeXJpbGxpYz0xMjQ1LGUuemloaXJhZ2FuYT0xMjM3NixlLnppa2F0YWthbmE9MTI0NzIsZS56aW5vcmhlYnJldz0xNDU0LGUuemxpbmViZWxvdz03ODI5LGUuem1vbm9zcGFjZT02NTM3MCxlLnpvaGlyYWdhbmE9MTIzODIsZS56b2thdGFrYW5hPTEyNDc4LGUuenBhcmVuPTkzOTcsZS56cmV0cm9mbGV4aG9vaz02NTYsZS56c3Ryb2tlPTQzOCxlLnp1aGlyYWdhbmE9MTIzNzgsZS56dWthdGFrYW5hPTEyNDc0LGVbIi5ub3RkZWYiXT0wLGUuYW5nYnJhY2tldGxlZnRiaWc9OTAwMSxlLmFuZ2JyYWNrZXRsZWZ0QmlnPTkwMDEsZS5hbmdicmFja2V0bGVmdGJpZ2c9OTAwMSxlLmFuZ2JyYWNrZXRsZWZ0QmlnZz05MDAxLGUuYW5nYnJhY2tldHJpZ2h0QmlnPTkwMDIsZS5hbmdicmFja2V0cmlnaHRiaWc9OTAwMixlLmFuZ2JyYWNrZXRyaWdodEJpZ2c9OTAwMixlLmFuZ2JyYWNrZXRyaWdodGJpZ2c9OTAwMixlLmFycm93aG9va2xlZnQ9ODYxOCxlLmFycm93aG9va3JpZ2h0PTg2MTcsZS5hcnJvd2xlZnR0b3BoYWxmPTg2MzYsZS5hcnJvd2xlZnRib3RoYWxmPTg2MzcsZS5hcnJvd25vcnRoZWFzdD04NTk5LGUuYXJyb3dub3J0aHdlc3Q9ODU5OCxlLmFycm93cmlnaHR0b3BoYWxmPTg2NDAsZS5hcnJvd3JpZ2h0Ym90aGFsZj04NjQxLGUuYXJyb3dzb3V0aGVhc3Q9ODYwMCxlLmFycm93c291dGh3ZXN0PTg2MDEsZS5iYWNrc2xhc2hiaWc9ODcyNixlLmJhY2tzbGFzaEJpZz04NzI2LGUuYmFja3NsYXNoQmlnZz04NzI2LGUuYmFja3NsYXNoYmlnZz04NzI2LGUuYmFyZGJsPTgyMTQsZS5icmFjZWh0aXBkb3dubGVmdD02NTA3OSxlLmJyYWNlaHRpcGRvd25yaWdodD02NTA3OSxlLmJyYWNlaHRpcHVwbGVmdD02NTA4MCxlLmJyYWNlaHRpcHVwcmlnaHQ9NjUwODAsZS5icmFjZWxlZnRCaWc9MTIzLGUuYnJhY2VsZWZ0YmlnPTEyMyxlLmJyYWNlbGVmdGJpZ2c9MTIzLGUuYnJhY2VsZWZ0QmlnZz0xMjMsZS5icmFjZXJpZ2h0QmlnPTEyNSxlLmJyYWNlcmlnaHRiaWc9MTI1LGUuYnJhY2VyaWdodGJpZ2c9MTI1LGUuYnJhY2VyaWdodEJpZ2c9MTI1LGUuYnJhY2tldGxlZnRiaWc9OTEsZS5icmFja2V0bGVmdEJpZz05MSxlLmJyYWNrZXRsZWZ0YmlnZz05MSxlLmJyYWNrZXRsZWZ0QmlnZz05MSxlLmJyYWNrZXRyaWdodEJpZz05MyxlLmJyYWNrZXRyaWdodGJpZz05MyxlLmJyYWNrZXRyaWdodGJpZ2c9OTMsZS5icmFja2V0cmlnaHRCaWdnPTkzLGUuY2VpbGluZ2xlZnRiaWc9ODk2OCxlLmNlaWxpbmdsZWZ0QmlnPTg5NjgsZS5jZWlsaW5nbGVmdEJpZ2c9ODk2OCxlLmNlaWxpbmdsZWZ0YmlnZz04OTY4LGUuY2VpbGluZ3JpZ2h0YmlnPTg5NjksZS5jZWlsaW5ncmlnaHRCaWc9ODk2OSxlLmNlaWxpbmdyaWdodGJpZ2c9ODk2OSxlLmNlaWxpbmdyaWdodEJpZ2c9ODk2OSxlLmNpcmNsZWRvdGRpc3BsYXk9ODg1NyxlLmNpcmNsZWRvdHRleHQ9ODg1NyxlLmNpcmNsZW11bHRpcGx5ZGlzcGxheT04ODU1LGUuY2lyY2xlbXVsdGlwbHl0ZXh0PTg4NTUsZS5jaXJjbGVwbHVzZGlzcGxheT04ODUzLGUuY2lyY2xlcGx1c3RleHQ9ODg1MyxlLmNvbnRpbnRlZ3JhbGRpc3BsYXk9ODc1MCxlLmNvbnRpbnRlZ3JhbHRleHQ9ODc1MCxlLmNvcHJvZHVjdGRpc3BsYXk9ODcyMCxlLmNvcHJvZHVjdHRleHQ9ODcyMCxlLmZsb29ybGVmdEJpZz04OTcwLGUuZmxvb3JsZWZ0YmlnPTg5NzAsZS5mbG9vcmxlZnRiaWdnPTg5NzAsZS5mbG9vcmxlZnRCaWdnPTg5NzAsZS5mbG9vcnJpZ2h0YmlnPTg5NzEsZS5mbG9vcnJpZ2h0QmlnPTg5NzEsZS5mbG9vcnJpZ2h0QmlnZz04OTcxLGUuZmxvb3JyaWdodGJpZ2c9ODk3MSxlLmhhdHdpZGU9NzcwLGUuaGF0d2lkZXI9NzcwLGUuaGF0d2lkZXN0PTc3MCxlLmludGVyY2FsPTc0ODgsZS5pbnRlZ3JhbGRpc3BsYXk9ODc0NyxlLmludGVncmFsdGV4dD04NzQ3LGUuaW50ZXJzZWN0aW9uZGlzcGxheT04ODk4LGUuaW50ZXJzZWN0aW9udGV4dD04ODk4LGUubG9naWNhbGFuZGRpc3BsYXk9ODc0MyxlLmxvZ2ljYWxhbmR0ZXh0PTg3NDMsZS5sb2dpY2Fsb3JkaXNwbGF5PTg3NDQsZS5sb2dpY2Fsb3J0ZXh0PTg3NDQsZS5wYXJlbmxlZnRCaWc9NDAsZS5wYXJlbmxlZnRiaWc9NDAsZS5wYXJlbmxlZnRCaWdnPTQwLGUucGFyZW5sZWZ0YmlnZz00MCxlLnBhcmVucmlnaHRCaWc9NDEsZS5wYXJlbnJpZ2h0YmlnPTQxLGUucGFyZW5yaWdodEJpZ2c9NDEsZS5wYXJlbnJpZ2h0YmlnZz00MSxlLnByaW1lPTgyNDIsZS5wcm9kdWN0ZGlzcGxheT04NzE5LGUucHJvZHVjdHRleHQ9ODcxOSxlLnJhZGljYWxiaWc9ODczMCxlLnJhZGljYWxCaWc9ODczMCxlLnJhZGljYWxCaWdnPTg3MzAsZS5yYWRpY2FsYmlnZz04NzMwLGUucmFkaWNhbGJ0PTg3MzAsZS5yYWRpY2FsdHA9ODczMCxlLnJhZGljYWx2ZXJ0ZXg9ODczMCxlLnNsYXNoYmlnPTQ3LGUuc2xhc2hCaWc9NDcsZS5zbGFzaEJpZ2c9NDcsZS5zbGFzaGJpZ2c9NDcsZS5zdW1tYXRpb25kaXNwbGF5PTg3MjEsZS5zdW1tYXRpb250ZXh0PTg3MjEsZS50aWxkZXdpZGU9NzMyLGUudGlsZGV3aWRlcj03MzIsZS50aWxkZXdpZGVzdD03MzIsZS51bmlvbmRpc3BsYXk9ODg5OSxlLnVuaW9ubXVsdGlkaXNwbGF5PTg4NDYsZS51bmlvbm11bHRpdGV4dD04ODQ2LGUudW5pb25zcWRpc3BsYXk9ODg1MixlLnVuaW9uc3F0ZXh0PTg4NTIsZS51bmlvbnRleHQ9ODg5OSxlLnZleHRlbmRkb3VibGU9ODc0MSxlLnZleHRlbmRzaW5nbGU9ODczOX0pKSxpPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0zMixlLmExPTk5ODUsZS5hMj05OTg2LGUuYTIwMj05OTg3LGUuYTM9OTk4OCxlLmE0PTk3NDIsZS5hNT05OTkwLGUuYTExOT05OTkxLGUuYTExOD05OTkyLGUuYTExNz05OTkzLGUuYTExPTk3NTUsZS5hMTI9OTc1OCxlLmExMz05OTk2LGUuYTE0PTk5OTcsZS5hMTU9OTk5OCxlLmExNj05OTk5LGUuYTEwNT0xZTQsZS5hMTc9MTAwMDEsZS5hMTg9MTAwMDIsZS5hMTk9MTAwMDMsZS5hMjA9MTAwMDQsZS5hMjE9MTAwMDUsZS5hMjI9MTAwMDYsZS5hMjM9MTAwMDcsZS5hMjQ9MTAwMDgsZS5hMjU9MTAwMDksZS5hMjY9MTAwMTAsZS5hMjc9MTAwMTEsZS5hMjg9MTAwMTIsZS5hNj0xMDAxMyxlLmE3PTEwMDE0LGUuYTg9MTAwMTUsZS5hOT0xMDAxNixlLmExMD0xMDAxNyxlLmEyOT0xMDAxOCxlLmEzMD0xMDAxOSxlLmEzMT0xMDAyMCxlLmEzMj0xMDAyMSxlLmEzMz0xMDAyMixlLmEzND0xMDAyMyxlLmEzNT05NzMzLGUuYTM2PTEwMDI1LGUuYTM3PTEwMDI2LGUuYTM4PTEwMDI3LGUuYTM5PTEwMDI4LGUuYTQwPTEwMDI5LGUuYTQxPTEwMDMwLGUuYTQyPTEwMDMxLGUuYTQzPTEwMDMyLGUuYTQ0PTEwMDMzLGUuYTQ1PTEwMDM0LGUuYTQ2PTEwMDM1LGUuYTQ3PTEwMDM2LGUuYTQ4PTEwMDM3LGUuYTQ5PTEwMDM4LGUuYTUwPTEwMDM5LGUuYTUxPTEwMDQwLGUuYTUyPTEwMDQxLGUuYTUzPTEwMDQyLGUuYTU0PTEwMDQzLGUuYTU1PTEwMDQ0LGUuYTU2PTEwMDQ1LGUuYTU3PTEwMDQ2LGUuYTU4PTEwMDQ3LGUuYTU5PTEwMDQ4LGUuYTYwPTEwMDQ5LGUuYTYxPTEwMDUwLGUuYTYyPTEwMDUxLGUuYTYzPTEwMDUyLGUuYTY0PTEwMDUzLGUuYTY1PTEwMDU0LGUuYTY2PTEwMDU1LGUuYTY3PTEwMDU2LGUuYTY4PTEwMDU3LGUuYTY5PTEwMDU4LGUuYTcwPTEwMDU5LGUuYTcxPTk2NzksZS5hNzI9MTAwNjEsZS5hNzM9OTYzMixlLmE3ND0xMDA2MyxlLmEyMDM9MTAwNjQsZS5hNzU9MTAwNjUsZS5hMjA0PTEwMDY2LGUuYTc2PTk2NTAsZS5hNzc9OTY2MCxlLmE3OD05NjcwLGUuYTc5PTEwMDcwLGUuYTgxPTk2ODcsZS5hODI9MTAwNzIsZS5hODM9MTAwNzMsZS5hODQ9MTAwNzQsZS5hOTc9MTAwNzUsZS5hOTg9MTAwNzYsZS5hOTk9MTAwNzcsZS5hMTAwPTEwMDc4LGUuYTEwMT0xMDA4MSxlLmExMDI9MTAwODIsZS5hMTAzPTEwMDgzLGUuYTEwND0xMDA4NCxlLmExMDY9MTAwODUsZS5hMTA3PTEwMDg2LGUuYTEwOD0xMDA4NyxlLmExMTI9OTgyNyxlLmExMTE9OTgzMCxlLmExMTA9OTgyOSxlLmExMDk9OTgyNCxlLmExMjA9OTMxMixlLmExMjE9OTMxMyxlLmExMjI9OTMxNCxlLmExMjM9OTMxNSxlLmExMjQ9OTMxNixlLmExMjU9OTMxNyxlLmExMjY9OTMxOCxlLmExMjc9OTMxOSxlLmExMjg9OTMyMCxlLmExMjk9OTMyMSxlLmExMzA9MTAxMDIsZS5hMTMxPTEwMTAzLGUuYTEzMj0xMDEwNCxlLmExMzM9MTAxMDUsZS5hMTM0PTEwMTA2LGUuYTEzNT0xMDEwNyxlLmExMzY9MTAxMDgsZS5hMTM3PTEwMTA5LGUuYTEzOD0xMDExMCxlLmExMzk9MTAxMTEsZS5hMTQwPTEwMTEyLGUuYTE0MT0xMDExMyxlLmExNDI9MTAxMTQsZS5hMTQzPTEwMTE1LGUuYTE0ND0xMDExNixlLmExNDU9MTAxMTcsZS5hMTQ2PTEwMTE4LGUuYTE0Nz0xMDExOSxlLmExNDg9MTAxMjAsZS5hMTQ5PTEwMTIxLGUuYTE1MD0xMDEyMixlLmExNTE9MTAxMjMsZS5hMTUyPTEwMTI0LGUuYTE1Mz0xMDEyNSxlLmExNTQ9MTAxMjYsZS5hMTU1PTEwMTI3LGUuYTE1Nj0xMDEyOCxlLmExNTc9MTAxMjksZS5hMTU4PTEwMTMwLGUuYTE1OT0xMDEzMSxlLmExNjA9MTAxMzIsZS5hMTYxPTg1OTQsZS5hMTYzPTg1OTYsZS5hMTY0PTg1OTcsZS5hMTk2PTEwMTM2LGUuYTE2NT0xMDEzNyxlLmExOTI9MTAxMzgsZS5hMTY2PTEwMTM5LGUuYTE2Nz0xMDE0MCxlLmExNjg9MTAxNDEsZS5hMTY5PTEwMTQyLGUuYTE3MD0xMDE0MyxlLmExNzE9MTAxNDQsZS5hMTcyPTEwMTQ1LGUuYTE3Mz0xMDE0NixlLmExNjI9MTAxNDcsZS5hMTc0PTEwMTQ4LGUuYTE3NT0xMDE0OSxlLmExNzY9MTAxNTAsZS5hMTc3PTEwMTUxLGUuYTE3OD0xMDE1MixlLmExNzk9MTAxNTMsZS5hMTkzPTEwMTU0LGUuYTE4MD0xMDE1NSxlLmExOTk9MTAxNTYsZS5hMTgxPTEwMTU3LGUuYTIwMD0xMDE1OCxlLmExODI9MTAxNTksZS5hMjAxPTEwMTYxLGUuYTE4Mz0xMDE2MixlLmExODQ9MTAxNjMsZS5hMTk3PTEwMTY0LGUuYTE4NT0xMDE2NSxlLmExOTQ9MTAxNjYsZS5hMTk4PTEwMTY3LGUuYTE4Nj0xMDE2OCxlLmExOTU9MTAxNjksZS5hMTg3PTEwMTcwLGUuYTE4OD0xMDE3MSxlLmExODk9MTAxNzIsZS5hMTkwPTEwMTczLGUuYTE5MT0xMDE3NCxlLmE4OT0xMDA4OCxlLmE5MD0xMDA4OSxlLmE5Mz0xMDA5MCxlLmE5ND0xMDA5MSxlLmE5MT0xMDA5MixlLmE5Mj0xMDA5MyxlLmEyMDU9MTAwOTQsZS5hODU9MTAwOTUsZS5hMjA2PTEwMDk2LGUuYTg2PTEwMDk3LGUuYTg3PTEwMDk4LGUuYTg4PTEwMDk5LGUuYTk1PTEwMTAwLGUuYTk2PTEwMTAxLGVbIi5ub3RkZWYiXT0wfSkpfSwoZSx0LHIpPT57ci5yKHQpLHIuZCh0LHtjbGVhclVuaWNvZGVDYWNoZXM6KCk9PnUsZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeTooKT0+aCxnZXRVbmljb2RlRm9yR2x5cGg6KCk9PmksZ2V0VW5pY29kZVJhbmdlRm9yOigpPT5vLG1hcFNwZWNpYWxVbmljb2RlVmFsdWVzOigpPT5hfSk7Y29uc3Qgbj0oMCxyKDE0OSkuZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZVs2MzcyMV09MTY5LGVbNjMxOTNdPTE2OSxlWzYzNzIwXT0xNzQsZVs2MzE5NF09MTc0LGVbNjM3MjJdPTg0ODIsZVs2MzE5NV09ODQ4MixlWzYzNzI5XT05MTI3LGVbNjM3MzBdPTkxMjgsZVs2MzczMV09OTEyOSxlWzYzNzQwXT05MTMxLGVbNjM3NDFdPTkxMzIsZVs2Mzc0Ml09OTEzMyxlWzYzNzI2XT05MTIxLGVbNjM3MjddPTkxMjIsZVs2MzcyOF09OTEyMyxlWzYzNzM3XT05MTI0LGVbNjM3MzhdPTkxMjUsZVs2MzczOV09OTEyNixlWzYzNzIzXT05MTE1LGVbNjM3MjRdPTkxMTYsZVs2MzcyNV09OTExNyxlWzYzNzM0XT05MTE4LGVbNjM3MzVdPTkxMTksZVs2MzczNl09OTEyMH0pKTtmdW5jdGlvbiBhKGUpe3JldHVybiBlPj02NTUyMCYmZTw9NjU1MzU/MDplPj02Mjk3NiYmZTw9NjM3NDM/bigpW2VdfHxlOjE3Mz09PWU/NDU6ZX1mdW5jdGlvbiBpKGUsdCl7bGV0IHI9dFtlXTtpZih2b2lkIDAhPT1yKXJldHVybiByO2lmKCFlKXJldHVybi0xO2lmKCJ1Ij09PWVbMF0pe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IG47aWYoNz09PXQmJiJuIj09PWVbMV0mJiJpIj09PWVbMl0pbj1lLnN1YnN0cmluZygzKTtlbHNle2lmKCEodD49NSYmdDw9NykpcmV0dXJuLTE7bj1lLnN1YnN0cmluZygxKX1pZihuPT09bi50b1VwcGVyQ2FzZSgpJiYocj1wYXJzZUludChuLDE2KSxyPj0wKSlyZXR1cm4gcn1yZXR1cm4tMX1jb25zdCBzPVtbMCwxMjddLFsxMjgsMjU1XSxbMjU2LDM4M10sWzM4NCw1OTFdLFs1OTIsNjg3LDc0MjQsNzU1MSw3NTUyLDc2MTVdLFs2ODgsNzY3LDQyNzUyLDQyNzgzXSxbNzY4LDg3OSw3NjE2LDc2NzldLFs4ODAsMTAyM10sWzExMzkyLDExNTE5XSxbMTAyNCwxMjc5LDEyODAsMTMyNywxMTc0NCwxMTc3NSw0MjU2MCw0MjY1NV0sWzEzMjgsMTQyM10sWzE0MjQsMTUzNV0sWzQyMjQwLDQyNTU5XSxbMTUzNiwxNzkxLDE4NzIsMTkxOV0sWzE5ODQsMjA0N10sWzIzMDQsMjQzMV0sWzI0MzIsMjU1OV0sWzI1NjAsMjY4N10sWzI2ODgsMjgxNV0sWzI4MTYsMjk0M10sWzI5NDQsMzA3MV0sWzMwNzIsMzE5OV0sWzMyMDAsMzMyN10sWzMzMjgsMzQ1NV0sWzM1ODQsMzcxMV0sWzM3MTIsMzgzOV0sWzQyNTYsNDM1MSwxMTUyMCwxMTU2N10sWzY5MTIsNzAzOV0sWzQzNTIsNDYwN10sWzc2ODAsNzkzNSwxMTM2MCwxMTM5MSw0Mjc4NCw0MzAwN10sWzc5MzYsODE5MV0sWzgxOTIsODMwMywxMTc3NiwxMTkwM10sWzgzMDQsODM1MV0sWzgzNTIsODM5OV0sWzg0MDAsODQ0N10sWzg0NDgsODUyN10sWzg1MjgsODU5MV0sWzg1OTIsODcwMywxMDIyNCwxMDIzOSwxMDQ5NiwxMDYyMywxMTAwOCwxMTI2M10sWzg3MDQsODk1OSwxMDc1MiwxMTAwNywxMDE3NiwxMDIyMywxMDYyNCwxMDc1MV0sWzg5NjAsOTIxNV0sWzkyMTYsOTI3OV0sWzkyODAsOTMxMV0sWzkzMTIsOTQ3MV0sWzk0NzIsOTU5OV0sWzk2MDAsOTYzMV0sWzk2MzIsOTcyN10sWzk3MjgsOTk4M10sWzk5ODQsMTAxNzVdLFsxMjI4OCwxMjM1MV0sWzEyMzUyLDEyNDQ3XSxbMTI0NDgsMTI1NDMsMTI3ODQsMTI3OTldLFsxMjU0NCwxMjU5MSwxMjcwNCwxMjczNV0sWzEyNTkyLDEyNjg3XSxbNDMwNzIsNDMxMzVdLFsxMjgwMCwxMzA1NV0sWzEzMDU2LDEzMzExXSxbNDQwMzIsNTUyMTVdLFs1NTI5Niw1NzM0M10sWzY3ODQwLDY3ODcxXSxbMTk5NjgsNDA5NTksMTE5MDQsMTIwMzEsMTIwMzIsMTIyNTUsMTIyNzIsMTIyODcsMTMzMTIsMTk5MDMsMTMxMDcyLDE3Mzc5MSwxMjY4OCwxMjcwM10sWzU3MzQ0LDYzNzQzXSxbMTI3MzYsMTI3ODMsNjM3NDQsNjQyNTUsMTk0NTYwLDE5NTEwM10sWzY0MjU2LDY0MzM1XSxbNjQzMzYsNjUwMjNdLFs2NTA1Niw2NTA3MV0sWzY1MDQwLDY1MDU1XSxbNjUxMDQsNjUxMzVdLFs2NTEzNiw2NTI3OV0sWzY1MjgwLDY1NTE5XSxbNjU1MjAsNjU1MzVdLFszODQwLDQwOTVdLFsxNzkyLDE4NzFdLFsxOTIwLDE5ODNdLFszNDU2LDM1ODNdLFs0MDk2LDQyNTVdLFs0NjA4LDQ5OTEsNDk5Miw1MDIzLDExNjQ4LDExNzQzXSxbNTAyNCw1MTE5XSxbNTEyMCw1NzU5XSxbNTc2MCw1NzkxXSxbNTc5Miw1ODg3XSxbNjAxNiw2MTQzXSxbNjE0NCw2MzE5XSxbMTAyNDAsMTA0OTVdLFs0MDk2MCw0MjEyN10sWzU4ODgsNTkxOSw1OTIwLDU5NTEsNTk1Miw1OTgzLDU5ODQsNjAxNV0sWzY2MzA0LDY2MzUxXSxbNjYzNTIsNjYzODNdLFs2NjU2MCw2NjYzOV0sWzExODc4NCwxMTkwMzksMTE5MDQwLDExOTI5NSwxMTkyOTYsMTE5Mzc1XSxbMTE5ODA4LDEyMDgzMV0sWzEwNDQ0ODAsMTA0ODU3M10sWzY1MDI0LDY1MDM5LDkxNzc2MCw5MTc5OTldLFs5MTc1MDQsOTE3NjMxXSxbNjQwMCw2NDc5XSxbNjQ4MCw2NTI3XSxbNjUyOCw2NjIzXSxbNjY1Niw2Njg3XSxbMTEyNjQsMTEzNTldLFsxMTU2OCwxMTY0N10sWzE5OTA0LDE5OTY3XSxbNDMwMDgsNDMwNTVdLFs2NTUzNiw2NTY2Myw2NTY2NCw2NTc5MSw2NTc5Miw2NTg1NV0sWzY1ODU2LDY1OTM1XSxbNjY0MzIsNjY0NjNdLFs2NjQ2NCw2NjUyN10sWzY2NjQwLDY2Njg3XSxbNjY2ODgsNjY3MzVdLFs2NzU4NCw2NzY0N10sWzY4MDk2LDY4MTkxXSxbMTE5NTUyLDExOTY0N10sWzczNzI4LDc0NzUxLDc0NzUyLDc0ODc5XSxbMTE5NjQ4LDExOTY3OV0sWzcwNDAsNzEwM10sWzcxNjgsNzI0N10sWzcyNDgsNzI5NV0sWzQzMTM2LDQzMjMxXSxbNDMyNjQsNDMzMTFdLFs0MzMxMiw0MzM1OV0sWzQzNTIwLDQzNjE1XSxbNjU5MzYsNjU5OTldLFs2NmUzLDY2MDQ3XSxbNjYyMDgsNjYyNzEsNjYxNzYsNjYyMDcsNjc4NzIsNjc5MDNdLFsxMjcwMjQsMTI3MTM1LDEyNjk3NiwxMjcwMjNdXTtmdW5jdGlvbiBvKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTotMTtpZigtMSE9PXQpe2NvbnN0IHI9c1t0XTtmb3IobGV0IG49MCxhPXIubGVuZ3RoO248YTtuKz0yKWlmKGU+PXJbbl0mJmU8PXJbbisxXSlyZXR1cm4gdH1mb3IobGV0IHQ9MCxyPXMubGVuZ3RoO3Q8cjt0Kyspe2NvbnN0IHI9c1t0XTtmb3IobGV0IG49MCxhPXIubGVuZ3RoO248YTtuKz0yKWlmKGU+PXJbbl0mJmU8PXJbbisxXSlyZXR1cm4gdH1yZXR1cm4tMX1jb25zdCBjPW5ldyBSZWdFeHAoIl4oXFxzKXwoXFxwe01ufSl8KFxccHtDZn0pJCIsInUiKSxsPW5ldyBNYXA7ZnVuY3Rpb24gaChlKXtjb25zdCB0PWwuZ2V0KGUpO2lmKHQpcmV0dXJuIHQ7Y29uc3Qgcj1lLm1hdGNoKGMpLG49e2lzV2hpdGVzcGFjZTohKG51bGw9PXJ8fCFyWzFdKSxpc1plcm9XaWR0aERpYWNyaXRpYzohKG51bGw9PXJ8fCFyWzJdKSxpc0ludmlzaWJsZUZvcm1hdE1hcms6IShudWxsPT1yfHwhclszXSl9O3JldHVybiBsLnNldChlLG4pLG59ZnVuY3Rpb24gdSgpe2wuY2xlYXIoKX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRTZXJpZkZvbnRzPXQuZ2V0Tm9uU3RkRm9udE1hcD10LmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cz10LmdldEZvbnROYW1lVG9GaWxlTWFwPXZvaWQgMCx0LmdldFN0YW5kYXJkRm9udE5hbWU9ZnVuY3Rpb24oZSl7Y29uc3QgdD0oMCxhLm5vcm1hbGl6ZUZvbnROYW1lKShlKTtyZXR1cm4gaSgpW3RdfSx0LmdldFN5bWJvbHNGb250cz10LmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaT10LmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaz10LmdldFN0ZEZvbnRNYXA9dm9pZCAwLHQuaXNLbm93bkZvbnROYW1lPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9KDAsYS5ub3JtYWxpemVGb250TmFtZSkoZSk7cmV0dXJuISEoaSgpW3RdfHxvKClbdF18fGMoKVt0XXx8bCgpW3RdKX07dmFyIG49cigxNDkpLGE9cigxODgpO2NvbnN0IGk9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlWyJUaW1lcy1Sb21hbiJdPSJUaW1lcy1Sb21hbiIsZS5IZWx2ZXRpY2E9IkhlbHZldGljYSIsZS5Db3VyaWVyPSJDb3VyaWVyIixlLlN5bWJvbD0iU3ltYm9sIixlWyJUaW1lcy1Cb2xkIl09IlRpbWVzLUJvbGQiLGVbIkhlbHZldGljYS1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIixlWyJDb3VyaWVyLUJvbGQiXT0iQ291cmllci1Cb2xkIixlLlphcGZEaW5nYmF0cz0iWmFwZkRpbmdiYXRzIixlWyJUaW1lcy1JdGFsaWMiXT0iVGltZXMtSXRhbGljIixlWyJIZWx2ZXRpY2EtT2JsaXF1ZSJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZVsiQ291cmllci1PYmxpcXVlIl09IkNvdXJpZXItT2JsaXF1ZSIsZVsiVGltZXMtQm9sZEl0YWxpYyJdPSJUaW1lcy1Cb2xkSXRhbGljIixlWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIixlWyJDb3VyaWVyLUJvbGRPYmxpcXVlIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiLGUuQXJpYWxOYXJyb3c9IkhlbHZldGljYSIsZVsiQXJpYWxOYXJyb3ctQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQXJpYWxOYXJyb3ctQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLGVbIkFyaWFsTmFycm93LUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZS5BcmlhbEJsYWNrPSJIZWx2ZXRpY2EiLGVbIkFyaWFsQmxhY2stQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQXJpYWxCbGFjay1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiQXJpYWxCbGFjay1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiLGVbIkFyaWFsLUJsYWNrIl09IkhlbHZldGljYSIsZVsiQXJpYWwtQmxhY2stQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQXJpYWwtQmxhY2stQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLGVbIkFyaWFsLUJsYWNrLUl0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZS5BcmlhbD0iSGVsdmV0aWNhIixlWyJBcmlhbC1Cb2xkIl09IkhlbHZldGljYS1Cb2xkIixlWyJBcmlhbC1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiQXJpYWwtSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIixlLkFyaWFsTVQ9IkhlbHZldGljYSIsZVsiQXJpYWwtQm9sZEl0YWxpY01UIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiQXJpYWwtQm9sZE1UIl09IkhlbHZldGljYS1Cb2xkIixlWyJBcmlhbC1JdGFsaWNNVCJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZVsiQXJpYWwtQm9sZEl0YWxpY01ULUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIixlWyJBcmlhbC1Cb2xkTVQtQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQXJpYWwtSXRhbGljTVQtSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIixlLkFyaWFsVW5pY29kZU1TPSJIZWx2ZXRpY2EiLGVbIkFyaWFsVW5pY29kZU1TLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiLGVbIkFyaWFsVW5pY29kZU1TLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIixlWyJBcmlhbFVuaWNvZGVNUy1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiLGVbIkNvdXJpZXItQm9sZEl0YWxpYyJdPSJDb3VyaWVyLUJvbGRPYmxpcXVlIixlWyJDb3VyaWVyLUl0YWxpYyJdPSJDb3VyaWVyLU9ibGlxdWUiLGUuQ291cmllck5ldz0iQ291cmllciIsZVsiQ291cmllck5ldy1Cb2xkIl09IkNvdXJpZXItQm9sZCIsZVsiQ291cmllck5ldy1Cb2xkSXRhbGljIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiLGVbIkNvdXJpZXJOZXctSXRhbGljIl09IkNvdXJpZXItT2JsaXF1ZSIsZVsiQ291cmllck5ld1BTLUJvbGRJdGFsaWNNVCJdPSJDb3VyaWVyLUJvbGRPYmxpcXVlIixlWyJDb3VyaWVyTmV3UFMtQm9sZE1UIl09IkNvdXJpZXItQm9sZCIsZVsiQ291cmllck5ld1BTLUl0YWxpY01UIl09IkNvdXJpZXItT2JsaXF1ZSIsZS5Db3VyaWVyTmV3UFNNVD0iQ291cmllciIsZVsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiXT0iSGVsdmV0aWNhLUJvbGRPYmxpcXVlIixlWyJIZWx2ZXRpY2EtSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIixlWyJTeW1ib2wtQm9sZCJdPSJTeW1ib2wiLGVbIlN5bWJvbC1Cb2xkSXRhbGljIl09IlN5bWJvbCIsZVsiU3ltYm9sLUl0YWxpYyJdPSJTeW1ib2wiLGUuVGltZXNOZXdSb21hbj0iVGltZXMtUm9tYW4iLGVbIlRpbWVzTmV3Um9tYW4tQm9sZCJdPSJUaW1lcy1Cb2xkIixlWyJUaW1lc05ld1JvbWFuLUJvbGRJdGFsaWMiXT0iVGltZXMtQm9sZEl0YWxpYyIsZVsiVGltZXNOZXdSb21hbi1JdGFsaWMiXT0iVGltZXMtSXRhbGljIixlLlRpbWVzTmV3Um9tYW5QUz0iVGltZXMtUm9tYW4iLGVbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkIl09IlRpbWVzLUJvbGQiLGVbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljIl09IlRpbWVzLUJvbGRJdGFsaWMiLGVbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljTVQiXT0iVGltZXMtQm9sZEl0YWxpYyIsZVsiVGltZXNOZXdSb21hblBTLUJvbGRNVCJdPSJUaW1lcy1Cb2xkIixlWyJUaW1lc05ld1JvbWFuUFMtSXRhbGljIl09IlRpbWVzLUl0YWxpYyIsZVsiVGltZXNOZXdSb21hblBTLUl0YWxpY01UIl09IlRpbWVzLUl0YWxpYyIsZS5UaW1lc05ld1JvbWFuUFNNVD0iVGltZXMtUm9tYW4iLGVbIlRpbWVzTmV3Um9tYW5QU01ULUJvbGQiXT0iVGltZXMtQm9sZCIsZVsiVGltZXNOZXdSb21hblBTTVQtQm9sZEl0YWxpYyJdPSJUaW1lcy1Cb2xkSXRhbGljIixlWyJUaW1lc05ld1JvbWFuUFNNVC1JdGFsaWMiXT0iVGltZXMtSXRhbGljIn0pKTt0LmdldFN0ZEZvbnRNYXA9aTtjb25zdCBzPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5Db3VyaWVyPSJGb3hpdEZpeGVkLnBmYiIsZVsiQ291cmllci1Cb2xkIl09IkZveGl0Rml4ZWRCb2xkLnBmYiIsZVsiQ291cmllci1Cb2xkT2JsaXF1ZSJdPSJGb3hpdEZpeGVkQm9sZEl0YWxpYy5wZmIiLGVbIkNvdXJpZXItT2JsaXF1ZSJdPSJGb3hpdEZpeGVkSXRhbGljLnBmYiIsZS5IZWx2ZXRpY2E9IkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIudHRmIixlWyJIZWx2ZXRpY2EtQm9sZCJdPSJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiIsZVsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl09IkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMudHRmIixlWyJIZWx2ZXRpY2EtT2JsaXF1ZSJdPSJMaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmIixlWyJUaW1lcy1Sb21hbiJdPSJGb3hpdFNlcmlmLnBmYiIsZVsiVGltZXMtQm9sZCJdPSJGb3hpdFNlcmlmQm9sZC5wZmIiLGVbIlRpbWVzLUJvbGRJdGFsaWMiXT0iRm94aXRTZXJpZkJvbGRJdGFsaWMucGZiIixlWyJUaW1lcy1JdGFsaWMiXT0iRm94aXRTZXJpZkl0YWxpYy5wZmIiLGUuU3ltYm9sPSJGb3hpdFN5bWJvbC5wZmIiLGUuWmFwZkRpbmdiYXRzPSJGb3hpdERpbmdiYXRzLnBmYiIsZVsiTGliZXJhdGlvblNhbnMtUmVndWxhciJdPSJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiIsZVsiTGliZXJhdGlvblNhbnMtQm9sZCJdPSJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiIsZVsiTGliZXJhdGlvblNhbnMtSXRhbGljIl09IkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiLGVbIkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiXT0iTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYifSkpO3QuZ2V0Rm9udE5hbWVUb0ZpbGVNYXA9cztjb25zdCBvPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5DYWxpYnJpPSJIZWx2ZXRpY2EiLGVbIkNhbGlicmktQm9sZCJdPSJIZWx2ZXRpY2EtQm9sZCIsZVsiQ2FsaWJyaS1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiQ2FsaWJyaS1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiLGUuQ2VudHVyeUdvdGhpYz0iSGVsdmV0aWNhIixlWyJDZW50dXJ5R290aGljLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiLGVbIkNlbnR1cnlHb3RoaWMtQm9sZEl0YWxpYyJdPSJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLGVbIkNlbnR1cnlHb3RoaWMtSXRhbGljIl09IkhlbHZldGljYS1PYmxpcXVlIixlLkNvbWljU2Fuc01TPSJDb21pYyBTYW5zIE1TIixlWyJDb21pY1NhbnNNUy1Cb2xkIl09IkNvbWljIFNhbnMgTVMtQm9sZCIsZVsiQ29taWNTYW5zTVMtQm9sZEl0YWxpYyJdPSJDb21pYyBTYW5zIE1TLUJvbGRJdGFsaWMiLGVbIkNvbWljU2Fuc01TLUl0YWxpYyJdPSJDb21pYyBTYW5zIE1TLUl0YWxpYyIsZS5JbXBhY3Q9IkhlbHZldGljYSIsZVsiSXRjU3ltYm9sLUJvbGQiXT0iSGVsdmV0aWNhLUJvbGQiLGVbIkl0Y1N5bWJvbC1Cb2xkSXRhbGljIl09IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsZVsiSXRjU3ltYm9sLUJvb2siXT0iSGVsdmV0aWNhIixlWyJJdGNTeW1ib2wtQm9va0l0YWxpYyJdPSJIZWx2ZXRpY2EtT2JsaXF1ZSIsZVsiSXRjU3ltYm9sLU1lZGl1bSJdPSJIZWx2ZXRpY2EiLGVbIkl0Y1N5bWJvbC1NZWRpdW1JdGFsaWMiXT0iSGVsdmV0aWNhLU9ibGlxdWUiLGUuTHVjaWRhQ29uc29sZT0iQ291cmllciIsZVsiTHVjaWRhQ29uc29sZS1Cb2xkIl09IkNvdXJpZXItQm9sZCIsZVsiTHVjaWRhQ29uc29sZS1Cb2xkSXRhbGljIl09IkNvdXJpZXItQm9sZE9ibGlxdWUiLGVbIkx1Y2lkYUNvbnNvbGUtSXRhbGljIl09IkNvdXJpZXItT2JsaXF1ZSIsZVsiTHVjaWRhU2Fucy1EZW1pIl09IkhlbHZldGljYS1Cb2xkIixlWyJNUy1Hb3RoaWMiXT0iTVMgR290aGljIixlWyJNUy1Hb3RoaWMtQm9sZCJdPSJNUyBHb3RoaWMtQm9sZCIsZVsiTVMtR290aGljLUJvbGRJdGFsaWMiXT0iTVMgR290aGljLUJvbGRJdGFsaWMiLGVbIk1TLUdvdGhpYy1JdGFsaWMiXT0iTVMgR290aGljLUl0YWxpYyIsZVsiTVMtTWluY2hvIl09Ik1TIE1pbmNobyIsZVsiTVMtTWluY2hvLUJvbGQiXT0iTVMgTWluY2hvLUJvbGQiLGVbIk1TLU1pbmNoby1Cb2xkSXRhbGljIl09Ik1TIE1pbmNoby1Cb2xkSXRhbGljIixlWyJNUy1NaW5jaG8tSXRhbGljIl09Ik1TIE1pbmNoby1JdGFsaWMiLGVbIk1TLVBHb3RoaWMiXT0iTVMgUEdvdGhpYyIsZVsiTVMtUEdvdGhpYy1Cb2xkIl09Ik1TIFBHb3RoaWMtQm9sZCIsZVsiTVMtUEdvdGhpYy1Cb2xkSXRhbGljIl09Ik1TIFBHb3RoaWMtQm9sZEl0YWxpYyIsZVsiTVMtUEdvdGhpYy1JdGFsaWMiXT0iTVMgUEdvdGhpYy1JdGFsaWMiLGVbIk1TLVBNaW5jaG8iXT0iTVMgUE1pbmNobyIsZVsiTVMtUE1pbmNoby1Cb2xkIl09Ik1TIFBNaW5jaG8tQm9sZCIsZVsiTVMtUE1pbmNoby1Cb2xkSXRhbGljIl09Ik1TIFBNaW5jaG8tQm9sZEl0YWxpYyIsZVsiTVMtUE1pbmNoby1JdGFsaWMiXT0iTVMgUE1pbmNoby1JdGFsaWMiLGUuTnVwdGlhbFNjcmlwdD0iVGltZXMtSXRhbGljIixlLlNlZ29lVUlTeW1ib2w9IkhlbHZldGljYSJ9KSk7dC5nZXROb25TdGRGb250TWFwPW87Y29uc3QgYz0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbIkFkb2JlIEplbnNvbiJdPSEwLGVbIkFkb2JlIFRleHQiXT0hMCxlLkFsYmVydHVzPSEwLGUuQWxkdXM9ITAsZS5BbGV4YW5kcmlhPSEwLGUuQWxnZXJpYW49ITAsZVsiQW1lcmljYW4gVHlwZXdyaXRlciJdPSEwLGUuQW50aXF1YT0hMCxlLkFwZXg9ITAsZS5Bcm5vPSEwLGUuQXN0ZXI9ITAsZS5BdXJvcmE9ITAsZS5CYXNrZXJ2aWxsZT0hMCxlLkJlbGw9ITAsZS5CZW1ibz0hMCxlWyJCZW1ibyBTY2hvb2xib29rIl09ITAsZS5CZW5ndWlhdD0hMCxlWyJCZXJrZWxleSBPbGQgU3R5bGUiXT0hMCxlWyJCZXJuaGFyZCBNb2Rlcm4iXT0hMCxlWyJCZXJ0aG9sZCBDaXR5Il09ITAsZS5Cb2Rvbmk9ITAsZVsiQmF1ZXIgQm9kb25pIl09ITAsZVsiQm9vayBBbnRpcXVhIl09ITAsZS5Cb29rbWFuPSEwLGVbIkJvcmRlYXV4IFJvbWFuIl09ITAsZVsiQ2FsaWZvcm5pYW4gRkIiXT0hMCxlLkNhbGlzdG89ITAsZS5DYWx2ZXJ0PSEwLGUuQ2FwaXRhbHM9ITAsZS5DYW1icmlhPSEwLGUuQ2FydGllcj0hMCxlLkNhc2xvbj0hMCxlLkNhdHVsbD0hMCxlLkNlbnRhdXI9ITAsZVsiQ2VudHVyeSBPbGQgU3R5bGUiXT0hMCxlWyJDZW50dXJ5IFNjaG9vbGJvb2siXT0hMCxlLkNoYXBhcnJhbD0hMCxlWyJDaGFyaXMgU0lMIl09ITAsZS5DaGVsdGVuaGFtPSEwLGVbIkNob2xsYSBTbGFiIl09ITAsZS5DbGFyZW5kb249ITAsZS5DbGVhcmZhY2U9ITAsZS5Db2NoaW49ITAsZS5Db2xvbm5hPSEwLGVbIkNvbXB1dGVyIE1vZGVybiJdPSEwLGVbIkNvbmNyZXRlIFJvbWFuIl09ITAsZS5Db25zdGFudGlhPSEwLGVbIkNvb3BlciBCbGFjayJdPSEwLGUuQ29yb25hPSEwLGUuRWNvdHlwZT0hMCxlLkVneXB0aWVubmU9ITAsZS5FbGVwaGFudD0hMCxlLkV4Y2Vsc2lvcj0hMCxlLkZhaXJmaWVsZD0hMCxlWyJGRiBTY2FsYSJdPSEwLGUuRm9sa2FyZD0hMCxlLkZvb3RsaWdodD0hMCxlLkZyZWVTZXJpZj0hMCxlWyJGcml6IFF1YWRyYXRhIl09ITAsZS5HYXJhbW9uZD0hMCxlLkdlbnRpdW09ITAsZS5HZW9yZ2lhPSEwLGUuR2xvdWNlc3Rlcj0hMCxlWyJHb3VkeSBPbGQgU3R5bGUiXT0hMCxlWyJHb3VkeSBTY2hvb2xib29rIl09ITAsZVsiR291ZHkgUHJvIEZvbnQiXT0hMCxlLkdyYW5qb249ITAsZVsiR3VhcmRpYW4gRWd5cHRpYW4iXT0hMCxlLkhlYXRoZXI9ITAsZS5IZXJjdWxlcz0hMCxlWyJIaWdoIFRvd2VyIFRleHQiXT0hMCxlLkhpcm9zaGlnZT0hMCxlWyJIb2VmbGVyIFRleHQiXT0hMCxlWyJIdW1hbmEgU2VyaWYiXT0hMCxlLkltcHJpbnQ9ITAsZVsiSW9uaWMgTm8uIDUiXT0hMCxlLkphbnNvbj0hMCxlLkpvYW5uYT0hMCxlLktvcmlubmE9ITAsZS5MZXhpY29uPSEwLGUuTGliZXJhdGlvblNlcmlmPSEwLGVbIkxpYmVyYXRpb24gU2VyaWYiXT0hMCxlWyJMaW51eCBMaWJlcnRpbmUiXT0hMCxlLkxpdGVyYXR1cm5heWE9ITAsZS5MdWNpZGE9ITAsZVsiTHVjaWRhIEJyaWdodCJdPSEwLGUuTWVsaW9yPSEwLGUuTWVtcGhpcz0hMCxlLk1pbGxlcj0hMCxlLk1pbmlvbj0hMCxlLk1vZGVybj0hMCxlWyJNb25hIExpc2EiXT0hMCxlWyJNcnMgRWF2ZXMiXT0hMCxlWyJNUyBTZXJpZiJdPSEwLGVbIk11c2VvIFNsYWIiXT0hMCxlWyJOZXcgWW9yayJdPSEwLGVbIk5pbWJ1cyBSb21hbiJdPSEwLGVbIk5QUyBSYXdsaW5zb24gUm9hZHdheSJdPSEwLGUuTnVwdGlhbFNjcmlwdD0hMCxlLlBhbGF0aW5vPSEwLGUuUGVycGV0dWE9ITAsZS5QbGFudGluPSEwLGVbIlBsYW50aW4gU2Nob29sYm9vayJdPSEwLGUuUGxheWJpbGw9ITAsZVsiUG9vciBSaWNoYXJkIl09ITAsZVsiUmF3bGluc29uIFJvYWR3YXkiXT0hMCxlLlJlbmF1bHQ9ITAsZS5SZXF1aWVtPSEwLGUuUm9ja3dlbGw9ITAsZS5Sb21hbj0hMCxlWyJSb3RpcyBTZXJpZiJdPSEwLGUuU2Fib249ITAsZS5TY2FsYT0hMCxlLlNlYWd1bGw9ITAsZS5TaXN0aW5hPSEwLGUuU291dmVuaXI9ITAsZS5TVElYPSEwLGVbIlN0b25lIEluZm9ybWFsIl09ITAsZVsiU3RvbmUgU2VyaWYiXT0hMCxlLlN5bGZhZW49ITAsZS5UaW1lcz0hMCxlLlRyYWphbj0hMCxlWyJUcmluaXTDqSJdPSEwLGVbIlRydW1wIE1lZGlhZXZhbCJdPSEwLGUuVXRvcGlhPSEwLGVbIlZhbGUgVHlwZSJdPSEwLGVbIkJpdHN0cmVhbSBWZXJhIl09ITAsZVsiVmVyYSBTZXJpZiJdPSEwLGUuVmVyc2FpbGxlcz0hMCxlLldhbnRlZD0hMCxlLldlaXNzPSEwLGVbIldpZGUgTGF0aW4iXT0hMCxlLldpbmRzb3I9ITAsZS5YSVRTPSEwfSkpO3QuZ2V0U2VyaWZGb250cz1jO2NvbnN0IGw9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkRpbmdiYXRzPSEwLGUuU3ltYm9sPSEwLGUuWmFwZkRpbmdiYXRzPSEwLGUuV2luZ2RpbmdzPSEwLGVbIldpbmdkaW5ncy1Cb2xkIl09ITAsZVsiV2luZ2RpbmdzLVJlZ3VsYXIiXT0hMH0pKTt0LmdldFN5bWJvbHNGb250cz1sO2NvbnN0IGg9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlWzJdPTEwLGVbM109MzIsZVs0XT0zMyxlWzVdPTM0LGVbNl09MzUsZVs3XT0zNixlWzhdPTM3LGVbOV09MzgsZVsxMF09MzksZVsxMV09NDAsZVsxMl09NDEsZVsxM109NDIsZVsxNF09NDMsZVsxNV09NDQsZVsxNl09NDUsZVsxN109NDYsZVsxOF09NDcsZVsxOV09NDgsZVsyMF09NDksZVsyMV09NTAsZVsyMl09NTEsZVsyM109NTIsZVsyNF09NTMsZVsyNV09NTQsZVsyNl09NTUsZVsyN109NTYsZVsyOF09NTcsZVsyOV09NTgsZVszMF09ODk0LGVbMzFdPTYwLGVbMzJdPTYxLGVbMzNdPTYyLGVbMzRdPTYzLGVbMzVdPTY0LGVbMzZdPTY1LGVbMzddPTY2LGVbMzhdPTY3LGVbMzldPTY4LGVbNDBdPTY5LGVbNDFdPTcwLGVbNDJdPTcxLGVbNDNdPTcyLGVbNDRdPTczLGVbNDVdPTc0LGVbNDZdPTc1LGVbNDddPTc2LGVbNDhdPTc3LGVbNDldPTc4LGVbNTBdPTc5LGVbNTFdPTgwLGVbNTJdPTgxLGVbNTNdPTgyLGVbNTRdPTgzLGVbNTVdPTg0LGVbNTZdPTg1LGVbNTddPTg2LGVbNThdPTg3LGVbNTldPTg4LGVbNjBdPTg5LGVbNjFdPTkwLGVbNjJdPTkxLGVbNjNdPTkyLGVbNjRdPTkzLGVbNjVdPTk0LGVbNjZdPTk1LGVbNjddPTk2LGVbNjhdPTk3LGVbNjldPTk4LGVbNzBdPTk5LGVbNzFdPTEwMCxlWzcyXT0xMDEsZVs3M109MTAyLGVbNzRdPTEwMyxlWzc1XT0xMDQsZVs3Nl09MTA1LGVbNzddPTEwNixlWzc4XT0xMDcsZVs3OV09MTA4LGVbODBdPTEwOSxlWzgxXT0xMTAsZVs4Ml09MTExLGVbODNdPTExMixlWzg0XT0xMTMsZVs4NV09MTE0LGVbODZdPTExNSxlWzg3XT0xMTYsZVs4OF09MTE3LGVbODldPTExOCxlWzkwXT0xMTksZVs5MV09MTIwLGVbOTJdPTEyMSxlWzkzXT0xMjIsZVs5NF09MTIzLGVbOTVdPTEyNCxlWzk2XT0xMjUsZVs5N109MTI2LGVbOThdPTE5NixlWzk5XT0xOTcsZVsxMDBdPTE5OSxlWzEwMV09MjAxLGVbMTAyXT0yMDksZVsxMDNdPTIxNCxlWzEwNF09MjIwLGVbMTA1XT0yMjUsZVsxMDZdPTIyNCxlWzEwN109MjI2LGVbMTA4XT0yMjgsZVsxMDldPTIyNyxlWzExMF09MjI5LGVbMTExXT0yMzEsZVsxMTJdPTIzMyxlWzExM109MjMyLGVbMTE0XT0yMzQsZVsxMTVdPTIzNSxlWzExNl09MjM3LGVbMTE3XT0yMzYsZVsxMThdPTIzOCxlWzExOV09MjM5LGVbMTIwXT0yNDEsZVsxMjFdPTI0MyxlWzEyMl09MjQyLGVbMTIzXT0yNDQsZVsxMjRdPTI0NixlWzEyNV09MjQ1LGVbMTI2XT0yNTAsZVsxMjddPTI0OSxlWzEyOF09MjUxLGVbMTI5XT0yNTIsZVsxMzBdPTgyMjQsZVsxMzFdPTE3NixlWzEzMl09MTYyLGVbMTMzXT0xNjMsZVsxMzRdPTE2NyxlWzEzNV09ODIyNixlWzEzNl09MTgyLGVbMTM3XT0yMjMsZVsxMzhdPTE3NCxlWzEzOV09MTY5LGVbMTQwXT04NDgyLGVbMTQxXT0xODAsZVsxNDJdPTE2OCxlWzE0M109ODgwMCxlWzE0NF09MTk4LGVbMTQ1XT0yMTYsZVsxNDZdPTg3MzQsZVsxNDddPTE3NyxlWzE0OF09ODgwNCxlWzE0OV09ODgwNSxlWzE1MF09MTY1LGVbMTUxXT0xODEsZVsxNTJdPTg3MDYsZVsxNTNdPTg3MjEsZVsxNTRdPTg3MTksZVsxNTZdPTg3NDcsZVsxNTddPTE3MCxlWzE1OF09MTg2LGVbMTU5XT04NDg2LGVbMTYwXT0yMzAsZVsxNjFdPTI0OCxlWzE2Ml09MTkxLGVbMTYzXT0xNjEsZVsxNjRdPTE3MixlWzE2NV09ODczMCxlWzE2Nl09NDAyLGVbMTY3XT04Nzc2LGVbMTY4XT04NzEwLGVbMTY5XT0xNzEsZVsxNzBdPTE4NyxlWzE3MV09ODIzMCxlWzE3OV09ODIyMCxlWzE4MF09ODIyMSxlWzE4MV09ODIxNixlWzE4Ml09ODIxNyxlWzIwMF09MTkzLGVbMjAzXT0yMDUsZVsyMDddPTIxMSxlWzIxMF09MjE4LGVbMjIzXT03MTEsZVsyMjRdPTMyMSxlWzIyNV09MzIyLGVbMjI2XT0zNTIsZVsyMjddPTM1MyxlWzIyOF09MzgxLGVbMjI5XT0zODIsZVsyMzNdPTIyMSxlWzIzNF09MjUzLGVbMjUyXT0yNjMsZVsyNTNdPTI2OCxlWzI1NF09MjY5LGVbMjU4XT0yNTgsZVsyNjBdPTI2MCxlWzI2MV09MjYxLGVbMjY1XT0yODAsZVsyNjZdPTI4MSxlWzI2N109MjgyLGVbMjY4XT0yODMsZVsyNjldPTMxMyxlWzI3NV09MzIzLGVbMjc2XT0zMjQsZVsyNzhdPTMyOCxlWzI4M109MzQ0LGVbMjg0XT0zNDUsZVsyODVdPTM0NixlWzI4Nl09MzQ3LGVbMjkyXT0zNjcsZVsyOTVdPTM3NyxlWzI5Nl09Mzc4LGVbMjk4XT0zODAsZVszMDVdPTk2MyxlWzMwNl09OTY0LGVbMzA3XT05NjYsZVszMDhdPTgyMTUsZVszMDldPTgyNTIsZVszMTBdPTgzMTksZVszMTFdPTgzNTksZVszMTJdPTg1OTIsZVszMTNdPTg1OTMsZVszMzddPTk1NTIsZVs0OTNdPTEwMzksZVs0OTRdPTEwNDAsZVs2NzJdPTE0ODgsZVs2NzNdPTE0ODksZVs2NzRdPTE0OTAsZVs2NzVdPTE0OTEsZVs2NzZdPTE0OTIsZVs2NzddPTE0OTMsZVs2NzhdPTE0OTQsZVs2NzldPTE0OTUsZVs2ODBdPTE0OTYsZVs2ODFdPTE0OTcsZVs2ODJdPTE0OTgsZVs2ODNdPTE0OTksZVs2ODRdPTE1MDAsZVs2ODVdPTE1MDEsZVs2ODZdPTE1MDIsZVs2ODddPTE1MDMsZVs2ODhdPTE1MDQsZVs2ODldPTE1MDUsZVs2OTBdPTE1MDYsZVs2OTFdPTE1MDcsZVs2OTJdPTE1MDgsZVs2OTNdPTE1MDksZVs2OTRdPTE1MTAsZVs2OTVdPTE1MTEsZVs2OTZdPTE1MTIsZVs2OTddPTE1MTMsZVs2OThdPTE1MTQsZVs3MDVdPTE1MjQsZVs3MDZdPTgzNjIsZVs3MTBdPTY0Mjg4LGVbNzExXT02NDI5OCxlWzc1OV09MTYxNyxlWzc2MV09MTc3NixlWzc2M109MTc3OCxlWzc3NV09MTY1MixlWzc3N109MTc2NCxlWzc3OF09MTc4MCxlWzc3OV09MTc4MSxlWzc4MF09MTc4MixlWzc4Ml09NzcxLGVbNzgzXT02NDcyNixlWzc4Nl09ODM2MyxlWzc4OF09ODUzMixlWzc5MF09NzY4LGVbNzkxXT03NjksZVs3OTJdPTc2OCxlWzc5NV09ODAzLGVbNzk3XT02NDMzNixlWzc5OF09NjQzMzcsZVs3OTldPTY0MzQyLGVbODAwXT02NDM0MyxlWzgwMV09NjQzNDQsZVs4MDJdPTY0MzQ1LGVbODAzXT02NDM2MixlWzgwNF09NjQzNjMsZVs4MDVdPTY0MzY0LGVbMjQyNF09NzgyMSxlWzI0MjVdPTc4MjIsZVsyNDI2XT03ODIzLGVbMjQyN109NzgyNCxlWzI0MjhdPTc4MjUsZVsyNDI5XT03ODI2LGVbMjQzMF09NzgyNyxlWzI0MzNdPTc2ODIsZVsyNjc4XT04MDQ1LGVbMjY3OV09ODA0NixlWzI4MzBdPTE1NTIsZVsyODM4XT02ODYsZVsyODQwXT03NTEsZVsyODQyXT03NTMsZVsyODQzXT03NTQsZVsyODQ0XT03NTUsZVsyODQ2XT03NTcsZVsyODU2XT03NjcsZVsyODU3XT04NDgsZVsyODU4XT04NDksZVsyODYyXT04NTMsZVsyODYzXT04NTQsZVsyODY0XT04NTUsZVsyODY1XT04NjEsZVsyODY2XT04NjIsZVsyOTA2XT03NDYwLGVbMjkwOF09NzQ2MixlWzI5MDldPTc0NjMsZVsyOTEwXT03NDY0LGVbMjkxMl09NzQ2NixlWzI5MTNdPTc0NjcsZVsyOTE0XT03NDY4LGVbMjkxNl09NzQ3MCxlWzI5MTddPTc0NzEsZVsyOTE4XT03NDcyLGVbMjkyMF09NzQ3NCxlWzI5MjFdPTc0NzUsZVsyOTIyXT03NDc2LGVbMjkyNF09NzQ3OCxlWzI5MjVdPTc0NzksZVsyOTI2XT03NDgwLGVbMjkyOF09NzQ4MixlWzI5MjldPTc0ODMsZVsyOTMwXT03NDg0LGVbMjkzMl09NzQ4NixlWzI5MzNdPTc0ODcsZVsyOTM0XT03NDg4LGVbMjkzNl09NzQ5MCxlWzI5MzddPTc0OTEsZVsyOTM4XT03NDkyLGVbMjk0MF09NzQ5NCxlWzI5NDFdPTc0OTUsZVsyOTQyXT03NDk2LGVbMjk0NF09NzQ5OCxlWzI5NDZdPTc1MDAsZVsyOTQ4XT03NTAyLGVbMjk1MF09NzUwNCxlWzI5NTFdPTc1MDUsZVsyOTUyXT03NTA2LGVbMjk1NF09NzUwOCxlWzI5NTVdPTc1MDksZVsyOTU2XT03NTEwLGVbMjk1OF09NzUxMixlWzI5NTldPTc1MTMsZVsyOTYwXT03NTE0LGVbMjk2Ml09NzUxNixlWzI5NjNdPTc1MTcsZVsyOTY0XT03NTE4LGVbMjk2Nl09NzUyMCxlWzI5NjddPTc1MjEsZVsyOTY4XT03NTIyLGVbMjk3MF09NzUyNCxlWzI5NzFdPTc1MjUsZVsyOTcyXT03NTI2LGVbMjk3NF09NzUyOCxlWzI5NzVdPTc1MjksZVsyOTc2XT03NTMwLGVbMjk3OF09MTUzNyxlWzI5NzldPTE1MzgsZVsyOTgwXT0xNTM5LGVbMjk4Ml09MTU0OSxlWzI5ODNdPTE1NTEsZVsyOTg0XT0xNTUyLGVbMjk4Nl09MTU1NCxlWzI5ODddPTE1NTUsZVsyOTg4XT0xNTU2LGVbMjk5MF09MTYyMyxlWzI5OTFdPTE2MjQsZVsyOTk1XT0xNzc1LGVbMjk5OV09MTc5MSxlWzMwMDJdPTY0MjkwLGVbMzAwM109NjQyOTEsZVszMDA0XT02NDI5MixlWzMwMDZdPTY0Mjk0LGVbMzAwN109NjQyOTUsZVszMDA4XT02NDI5NixlWzMwMTFdPTE5MDAsZVszMDE0XT04MjIzLGVbMzAxNV09ODI0NCxlWzMwMTddPTc1MzIsZVszMDE4XT03NTMzLGVbMzAxOV09NzUzNCxlWzMwNzVdPTc1OTAsZVszMDc2XT03NTkxLGVbMzA3OV09NzU5NCxlWzMwODBdPTc1OTUsZVszMDgzXT03NTk4LGVbMzA4NF09NzU5OSxlWzMwODddPTc2MDIsZVszMDg4XT03NjAzLGVbMzA5MV09NzYwNixlWzMwOTJdPTc2MDcsZVszMDk1XT03NjEwLGVbMzA5Nl09NzYxMSxlWzMwOTldPTc2MTQsZVszMTAwXT03NjE1LGVbMzEwM109NzYxOCxlWzMxMDRdPTc2MTksZVszMTA3XT04MzM3LGVbMzEwOF09ODMzOCxlWzMxMTZdPTE4ODQsZVszMTE5XT0xODg1LGVbMzEyMF09MTg4NSxlWzMxMjNdPTE4ODYsZVszMTI0XT0xODg2LGVbMzEyN109MTg4NyxlWzMxMjhdPTE4ODcsZVszMTMxXT0xODg4LGVbMzEzMl09MTg4OCxlWzMxMzVdPTE4ODksZVszMTM2XT0xODg5LGVbMzEzOV09MTg5MCxlWzMxNDBdPTE4OTAsZVszMTQzXT0xODkxLGVbMzE0NF09MTg5MSxlWzMxNDddPTE4OTIsZVszMTQ4XT0xODkyLGVbMzE1M109NTgwLGVbMzE1NF09NTgxLGVbMzE1N109NTg0LGVbMzE1OF09NTg1LGVbMzE2MV09NTg4LGVbMzE2Ml09NTg5LGVbMzE2NV09ODkxLGVbMzE2Nl09ODkyLGVbMzE2OV09MTI3NCxlWzMxNzBdPTEyNzUsZVszMTczXT0xMjc4LGVbMzE3NF09MTI3OSxlWzMxODFdPTc2MjIsZVszMTgyXT03NjIzLGVbMzI4Ml09MTE3OTksZVszMzE2XT01NzgsZVszMzc5XT00Mjc4NSxlWzMzOTNdPTExNTksZVszNDE2XT04Mzc3fSkpO3QuZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzPWg7Y29uc3QgdT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbMjI3XT0zMjIsZVsyNjRdPTI2MSxlWzI5MV09MzQ2fSkpO3QuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrPXU7Y29uc3QgZD0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2VbMV09MzIsZVs0XT02NSxlWzVdPTE5MixlWzZdPTE5MyxlWzldPTE5NixlWzE3XT02NixlWzE4XT02NyxlWzIxXT0yNjgsZVsyNF09NjgsZVsyOF09NjksZVsyOV09MjAwLGVbMzBdPTIwMSxlWzMyXT0yODIsZVszOF09NzAsZVszOV09NzEsZVs0NF09NzIsZVs0N109NzMsZVs0OF09MjA0LGVbNDldPTIwNSxlWzU4XT03NCxlWzYwXT03NSxlWzYyXT03NixlWzY4XT03NyxlWzY5XT03OCxlWzc1XT03OSxlWzc2XT0yMTAsZVs4MF09MjE0LGVbODddPTgwLGVbODldPTgxLGVbOTBdPTgyLGVbOTJdPTM0NCxlWzk0XT04MyxlWzk3XT0zNTIsZVsxMDBdPTg0LGVbMTA0XT04NSxlWzEwOV09MjIwLGVbMTE1XT04NixlWzExNl09ODcsZVsxMjFdPTg4LGVbMTIyXT04OSxlWzEyNF09MjIxLGVbMTI3XT05MCxlWzEyOV09MzgxLGVbMjU4XT05NyxlWzI1OV09MjI0LGVbMjYwXT0yMjUsZVsyNjNdPTIyOCxlWzI2OF09MjYxLGVbMjcxXT05OCxlWzI3Ml09OTksZVsyNzNdPTI2MyxlWzI3NV09MjY5LGVbMjgyXT0xMDAsZVsyODZdPTEwMSxlWzI4N109MjMyLGVbMjg4XT0yMzMsZVsyOTBdPTI4MyxlWzI5NV09MjgxLGVbMjk2XT0xMDIsZVszMzZdPTEwMyxlWzM0Nl09MTA0LGVbMzQ5XT0xMDUsZVszNTBdPTIzNixlWzM1MV09MjM3LGVbMzYxXT0xMDYsZVszNjRdPTEwNyxlWzM2N109MTA4LGVbMzcxXT0zMjIsZVszNzNdPTEwOSxlWzM3NF09MTEwLGVbMzgxXT0xMTEsZVszODJdPTI0MixlWzM4M109MjQzLGVbMzg2XT0yNDYsZVszOTNdPTExMixlWzM5NV09MTEzLGVbMzk2XT0xMTQsZVszOThdPTM0NSxlWzQwMF09MTE1LGVbNDAxXT0zNDcsZVs0MDNdPTM1MyxlWzQxMF09MTE2LGVbNDM3XT0xMTcsZVs0NDJdPTI1MixlWzQ0OF09MTE4LGVbNDQ5XT0xMTksZVs0NTRdPTEyMCxlWzQ1NV09MTIxLGVbNDU3XT0yNTMsZVs0NjBdPTEyMixlWzQ2Ml09MzgyLGVbNDYzXT0zODAsZVs4NTNdPTQ0LGVbODU1XT01OCxlWzg1Nl09NDYsZVs4NzZdPTQ3LGVbODc4XT00NSxlWzg4Ml09NDUsZVs4OTRdPTQwLGVbODk1XT00MSxlWzg5Nl09OTEsZVs4OTddPTkzLGVbOTIzXT02NCxlWzEwMDRdPTQ4LGVbMTAwNV09NDksZVsxMDA2XT01MCxlWzEwMDddPTUxLGVbMTAwOF09NTIsZVsxMDA5XT01MyxlWzEwMTBdPTU0LGVbMTAxMV09NTUsZVsxMDEyXT01NixlWzEwMTNdPTU3LGVbMTA4MV09MzcsZVsxMDg1XT00MyxlWzEwODZdPTQ1fSkpO3QuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpPWR9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Ub1VuaWNvZGVNYXA9dC5JZGVudGl0eVRvVW5pY29kZU1hcD12b2lkIDA7dmFyIG49cigxNDQpO3QuVG9Vbmljb2RlTWFwPWNsYXNze2NvbnN0cnVjdG9yKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOltdO3RoaXMuX21hcD1lfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbWFwLmxlbmd0aH1mb3JFYWNoKGUpe2Zvcihjb25zdCB0IGluIHRoaXMuX21hcCllKHQsdGhpcy5fbWFwW3RdLmNoYXJDb2RlQXQoMCkpfWhhcyhlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fbWFwW2VdfWdldChlKXtyZXR1cm4gdGhpcy5fbWFwW2VdfWNoYXJDb2RlT2YoZSl7Y29uc3QgdD10aGlzLl9tYXA7aWYodC5sZW5ndGg8PTY1NTM2KXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKGNvbnN0IHIgaW4gdClpZih0W3JdPT09ZSlyZXR1cm4gMHxyO3JldHVybi0xfWFtZW5kKGUpe2Zvcihjb25zdCB0IGluIGUpdGhpcy5fbWFwW3RdPWVbdF19fSx0LklkZW50aXR5VG9Vbmljb2RlTWFwPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5maXJzdENoYXI9ZSx0aGlzLmxhc3RDaGFyPXR9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxhc3RDaGFyKzEtdGhpcy5maXJzdENoYXJ9Zm9yRWFjaChlKXtmb3IobGV0IHQ9dGhpcy5maXJzdENoYXIscj10aGlzLmxhc3RDaGFyO3Q8PXI7dCsrKWUodCx0KX1oYXMoZSl7cmV0dXJuIHRoaXMuZmlyc3RDaGFyPD1lJiZlPD10aGlzLmxhc3RDaGFyfWdldChlKXtpZih0aGlzLmZpcnN0Q2hhcjw9ZSYmZTw9dGhpcy5sYXN0Q2hhcilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlKX1jaGFyQ29kZU9mKGUpe3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGUpJiZlPj10aGlzLmZpcnN0Q2hhciYmZTw9dGhpcy5sYXN0Q2hhcj9lOi0xfWFtZW5kKGUpeygwLG4udW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgYW1lbmQoKSIpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5DRkZGb250PXZvaWQgMDt2YXIgbj1yKDE4NSksYT1yKDE4OCksaT1yKDE0NCk7dC5DRkZGb250PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5wcm9wZXJ0aWVzPXQ7Y29uc3Qgcj1uZXcgbi5DRkZQYXJzZXIoZSx0LGEuU0VBQ19BTkFMWVNJU19FTkFCTEVEKTt0aGlzLmNmZj1yLnBhcnNlKCksdGhpcy5jZmYuZHVwbGljYXRlRmlyc3RHbHlwaCgpO2NvbnN0IHM9bmV3IG4uQ0ZGQ29tcGlsZXIodGhpcy5jZmYpO3RoaXMuc2VhY3M9dGhpcy5jZmYuc2VhY3M7dHJ5e3RoaXMuZGF0YT1zLmNvbXBpbGUoKX1jYXRjaChyKXsoMCxpLndhcm4pKCJGYWlsZWQgdG8gY29tcGlsZSBmb250ICIrdC5sb2FkZWROYW1lKSx0aGlzLmRhdGE9ZX10aGlzLl9jcmVhdGVCdWlsdEluRW5jb2RpbmcoKX1nZXQgbnVtR2x5cGhzKCl7cmV0dXJuIHRoaXMuY2ZmLmNoYXJTdHJpbmdzLmNvdW50fWdldENoYXJzZXQoKXtyZXR1cm4gdGhpcy5jZmYuY2hhcnNldC5jaGFyc2V0fWdldEdseXBoTWFwcGluZygpe2NvbnN0IGU9dGhpcy5jZmYsdD10aGlzLnByb3BlcnRpZXMse2NpZFRvR2lkTWFwOnIsY01hcDpufT10LGk9ZS5jaGFyc2V0LmNoYXJzZXQ7bGV0IHMsbztpZih0LmNvbXBvc2l0ZSl7bGV0IHQsYTtpZigobnVsbD09cj92b2lkIDA6ci5sZW5ndGgpPjApe3Q9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IGU9MCxuPXIubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49cltlXTt2b2lkIDAhPT1uJiYodFtuXT1lKX19aWYocz1PYmplY3QuY3JlYXRlKG51bGwpLGUuaXNDSURGb250KWZvcihvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBjO2NvbnN0IGU9aVtvXTthPW4uY2hhckNvZGVPZihlKSx2b2lkIDAhPT0obnVsbD09PShjPXQpfHx2b2lkIDA9PT1jP3ZvaWQgMDpjW2FdKSYmKGE9dFthXSksc1thXT1vfWVsc2UgZm9yKG89MDtvPGUuY2hhclN0cmluZ3MuY291bnQ7bysrKWE9bi5jaGFyQ29kZU9mKG8pLHNbYV09bztyZXR1cm4gc31sZXQgbD1lLmVuY29kaW5nP2UuZW5jb2RpbmcuZW5jb2Rpbmc6bnVsbDtyZXR1cm4gdC5pc0ludGVybmFsRm9udCYmKGw9dC5kZWZhdWx0RW5jb2RpbmcpLHM9KDAsYS50eXBlMUZvbnRHbHlwaE1hcHBpbmcpKHQsbCxpKSxzfWhhc0dseXBoSWQoZSl7cmV0dXJuIHRoaXMuY2ZmLmhhc0dseXBoSWQoZSl9X2NyZWF0ZUJ1aWx0SW5FbmNvZGluZygpe2NvbnN0e2NoYXJzZXQ6ZSxlbmNvZGluZzp0fT10aGlzLmNmZjtpZighZXx8IXQpcmV0dXJuO2NvbnN0IHI9ZS5jaGFyc2V0LG49dC5lbmNvZGluZyxhPVtdO2Zvcihjb25zdCBlIGluIG4pe2NvbnN0IHQ9bltlXTtpZih0Pj0wKXtjb25zdCBuPXJbdF07biYmKGFbZV09bil9fWEubGVuZ3RoPjAmJih0aGlzLnByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nPWEpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Gb250UmVuZGVyZXJGYWN0b3J5PXZvaWQgMCxyKDEzOSkscigxNTcpLHIoMTU5KSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpLGE9cigxODUpLGk9cigxODkpLHM9cigxODcpLG89cigxNTQpO2Z1bmN0aW9uIGMoZSx0KXtyZXR1cm4oZVt0XTw8MjR8ZVt0KzFdPDwxNnxlW3QrMl08PDh8ZVt0KzNdKT4+PjB9ZnVuY3Rpb24gbChlLHQpe3JldHVybiBlW3RdPDw4fGVbdCsxXX1mdW5jdGlvbiBoKGUsdCl7cmV0dXJuKGVbdF08PDI0fGVbdCsxXTw8MTYpPj4xNn1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIGVbdF08PDI0Pj4yNH1mdW5jdGlvbiBkKGUsdCl7cmV0dXJuIGgoZSx0KS8xNjM4NH1mdW5jdGlvbiBmKGUpe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IHI9MzI3Njg7cmV0dXJuIHQ8MTI0MD9yPTEwNzp0PDMzOTAwJiYocj0xMTMxKSxyfWZ1bmN0aW9uIGcoZSx0LHIpe2NvbnN0IGE9MT09PWwoZSx0KzIpP2MoZSx0KzgpOmMoZSx0KzE2KSxpPWwoZSx0K2EpO2xldCBzLG8saDtpZig0PT09aSl7bChlLHQrYSsyKTtjb25zdCByPWwoZSx0K2ErNik+PjE7Zm9yKG89dCthKzE0LHM9W10saD0wO2g8cjtoKyssbys9MilzW2hdPXtlbmQ6bChlLG8pfTtmb3Iobys9MixoPTA7aDxyO2grKyxvKz0yKXNbaF0uc3RhcnQ9bChlLG8pO2ZvcihoPTA7aDxyO2grKyxvKz0yKXNbaF0uaWREZWx0YT1sKGUsbyk7Zm9yKGg9MDtoPHI7aCsrLG8rPTIpe2xldCB0PWwoZSxvKTtpZigwIT09dCl7c1toXS5pZHM9W107Zm9yKGxldCByPTAsbj1zW2hdLmVuZC1zW2hdLnN0YXJ0KzE7cjxuO3IrKylzW2hdLmlkc1tyXT1sKGUsbyt0KSx0Kz0yfX1yZXR1cm4gc31pZigxMj09PWkpe2NvbnN0IHI9YyhlLHQrYSsxMik7Zm9yKG89dCthKzE2LHM9W10saD0wO2g8cjtoKyspdD1jKGUsbykscy5wdXNoKHtzdGFydDp0LGVuZDpjKGUsbys0KSxpZERlbHRhOmMoZSxvKzgpLXR9KSxvKz0xMjtyZXR1cm4gc310aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigidW5zdXBwb3J0ZWQgY21hcDogIi5jb25jYXQoaSkpfWZ1bmN0aW9uIHAoZSx0LHIsbil7dmFyIGkscztjb25zdCBjPW5ldyBhLkNGRlBhcnNlcihuZXcgby5TdHJlYW0oZSx0LHItdCkse30sbikucGFyc2UoKTtyZXR1cm57Z2x5cGhzOmMuY2hhclN0cmluZ3Mub2JqZWN0cyxzdWJyczpudWxsPT09KGk9Yy50b3BEaWN0LnByaXZhdGVEaWN0KXx8dm9pZCAwPT09aXx8bnVsbD09PShpPWkuc3VicnNJbmRleCl8fHZvaWQgMD09PWk/dm9pZCAwOmkub2JqZWN0cyxnc3VicnM6bnVsbD09PShzPWMuZ2xvYmFsU3VickluZGV4KXx8dm9pZCAwPT09cz92b2lkIDA6cy5vYmplY3RzLGlzQ0ZGQ0lERm9udDpjLmlzQ0lERm9udCxmZFNlbGVjdDpjLmZkU2VsZWN0LGZkQXJyYXk6Yy5mZEFycmF5fX1mdW5jdGlvbiBtKGUsdCl7Y29uc3Qgcj10LmNvZGVQb2ludEF0KDApO2xldCBuPTAsYT0wLGk9ZS5sZW5ndGgtMTtmb3IoO2E8aTspe2NvbnN0IHQ9YStpKzE+PjE7cjxlW3RdLnN0YXJ0P2k9dC0xOmE9dH1yZXR1cm4gZVthXS5zdGFydDw9ciYmcjw9ZVthXS5lbmQmJihuPWVbYV0uaWREZWx0YSsoZVthXS5pZHM/ZVthXS5pZHNbci1lW2FdLnN0YXJ0XTpyKSY2NTUzNSkse2NoYXJDb2RlOnIsZ2x5cGhJZDpufX1mdW5jdGlvbiBiKGUsdCxyKXtmdW5jdGlvbiBuKGUscil7dC5wdXNoKHtjbWQ6Im1vdmVUbyIsYXJnczpbZSxyXX0pfWZ1bmN0aW9uIGEoZSxyKXt0LnB1c2goe2NtZDoibGluZVRvIixhcmdzOltlLHJdfSl9ZnVuY3Rpb24gaShlLHIsbixhKXt0LnB1c2goe2NtZDoicXVhZHJhdGljQ3VydmVUbyIsYXJnczpbZSxyLG4sYV19KX1sZXQgcz0wO2NvbnN0IG89aChlLHMpO2xldCBjLGY9MCxnPTA7aWYocys9MTAsbzwwKWRve2M9bChlLHMpO2NvbnN0IG49bChlLHMrMik7bGV0IGEsaTtzKz00LDEmYz8oMiZjPyhhPWgoZSxzKSxpPWgoZSxzKzIpKTooYT1sKGUscyksaT1sKGUscysyKSkscys9NCk6MiZjPyhhPXUoZSxzKyspLGk9dShlLHMrKykpOihhPWVbcysrXSxpPWVbcysrXSksMiZjPyhmPWEsZz1pKTooZj0wLGc9MCk7bGV0IG89MSxwPTEsbT0wLHk9MDs4JmM/KG89cD1kKGUscykscys9Mik6NjQmYz8obz1kKGUscykscD1kKGUscysyKSxzKz00KToxMjgmYyYmKG89ZChlLHMpLG09ZChlLHMrMikseT1kKGUscys0KSxwPWQoZSxzKzYpLHMrPTgpO2NvbnN0IHc9ci5nbHlwaHNbbl07dyYmKHQucHVzaCh7Y21kOiJzYXZlIn0se2NtZDoidHJhbnNmb3JtIixhcmdzOltvLG0seSxwLGYsZ119KSxiKHcsdCxyKSx0LnB1c2goe2NtZDoicmVzdG9yZSJ9KSl9d2hpbGUoMzImYyk7ZWxzZXtjb25zdCB0PVtdO2xldCByLHU7Zm9yKHI9MDtyPG87cisrKXQucHVzaChsKGUscykpLHMrPTI7cys9MitsKGUscyk7Y29uc3QgZD10LmF0KC0xKSsxLHA9W107Zm9yKDtwLmxlbmd0aDxkOyl7Yz1lW3MrK107bGV0IHQ9MTtmb3IoOCZjJiYodCs9ZVtzKytdKTt0LS0gPjA7KXAucHVzaCh7ZmxhZ3M6Y30pfWZvcihyPTA7cjxkO3IrKyl7c3dpdGNoKDE4JnBbcl0uZmxhZ3Mpe2Nhc2UgMDpmKz1oKGUscykscys9MjticmVhaztjYXNlIDI6Zi09ZVtzKytdO2JyZWFrO2Nhc2UgMTg6Zis9ZVtzKytdfXBbcl0ueD1mfWZvcihyPTA7cjxkO3IrKyl7c3dpdGNoKDM2JnBbcl0uZmxhZ3Mpe2Nhc2UgMDpnKz1oKGUscykscys9MjticmVhaztjYXNlIDQ6Zy09ZVtzKytdO2JyZWFrO2Nhc2UgMzY6Zys9ZVtzKytdfXBbcl0ueT1nfWxldCBtPTA7Zm9yKHM9MDtzPG87cysrKXtjb25zdCBlPXRbc10sbz1wLnNsaWNlKG0sZSsxKTtpZigxJm9bMF0uZmxhZ3Mpby5wdXNoKG9bMF0pO2Vsc2UgaWYoMSZvLmF0KC0xKS5mbGFncylvLnVuc2hpZnQoby5hdCgtMSkpO2Vsc2V7Y29uc3QgZT17ZmxhZ3M6MSx4OihvWzBdLngrby5hdCgtMSkueCkvMix5OihvWzBdLnkrby5hdCgtMSkueSkvMn07by51bnNoaWZ0KGUpLG8ucHVzaChlKX1mb3IobihvWzBdLngsb1swXS55KSxyPTEsdT1vLmxlbmd0aDtyPHU7cisrKTEmb1tyXS5mbGFncz9hKG9bcl0ueCxvW3JdLnkpOjEmb1tyKzFdLmZsYWdzPyhpKG9bcl0ueCxvW3JdLnksb1tyKzFdLngsb1tyKzFdLnkpLHIrKyk6aShvW3JdLngsb1tyXS55LChvW3JdLngrb1tyKzFdLngpLzIsKG9bcl0ueStvW3IrMV0ueSkvMik7bT1lKzF9fX1mdW5jdGlvbiB5KGUsdCxyLGEpe2Z1bmN0aW9uIGkoZSxyKXt0LnB1c2goe2NtZDoibW92ZVRvIixhcmdzOltlLHJdfSl9ZnVuY3Rpb24gbyhlLHIpe3QucHVzaCh7Y21kOiJsaW5lVG8iLGFyZ3M6W2Uscl19KX1mdW5jdGlvbiBjKGUscixuLGEsaSxzKXt0LnB1c2goe2NtZDoiYmV6aWVyQ3VydmVUbyIsYXJnczpbZSxyLG4sYSxpLHNdfSl9Y29uc3QgbD1bXTtsZXQgaD0wLHU9MCxkPTA7IWZ1bmN0aW9uIGUoZyl7bGV0IHA9MDtmb3IoO3A8Zy5sZW5ndGg7KXtsZXQgdyx2LHgsUyxBLGssQyxPLEYsST0hMSxUPWdbcCsrXTtzd2l0Y2goVCl7Y2FzZSAxOmNhc2UgMzpjYXNlIDE4OmNhc2UgMjM6ZCs9bC5sZW5ndGg+PjEsST0hMDticmVhaztjYXNlIDQ6dSs9bC5wb3AoKSxpKGgsdSksST0hMDticmVhaztjYXNlIDU6Zm9yKDtsLmxlbmd0aD4wOyloKz1sLnNoaWZ0KCksdSs9bC5zaGlmdCgpLG8oaCx1KTticmVhaztjYXNlIDY6Zm9yKDtsLmxlbmd0aD4wJiYoaCs9bC5zaGlmdCgpLG8oaCx1KSwwIT09bC5sZW5ndGgpOyl1Kz1sLnNoaWZ0KCksbyhoLHUpO2JyZWFrO2Nhc2UgNzpmb3IoO2wubGVuZ3RoPjAmJih1Kz1sLnNoaWZ0KCksbyhoLHUpLDAhPT1sLmxlbmd0aCk7KWgrPWwuc2hpZnQoKSxvKGgsdSk7YnJlYWs7Y2FzZSA4OmZvcig7bC5sZW5ndGg+MDspdz1oK2wuc2hpZnQoKSx4PXUrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksUz14K2wuc2hpZnQoKSxoPXYrbC5zaGlmdCgpLHU9UytsLnNoaWZ0KCksYyh3LHgsdixTLGgsdSk7YnJlYWs7Y2FzZSAxMDppZihPPWwucG9wKCksRj1udWxsLHIuaXNDRkZDSURGb250KXtjb25zdCBlPXIuZmRTZWxlY3QuZ2V0RkRJbmRleChhKTtpZihlPj0wJiZlPHIuZmRBcnJheS5sZW5ndGgpe3ZhciBiO2NvbnN0IHQ9ci5mZEFycmF5W2VdO2xldCBuOyhudWxsPT09KGI9dC5wcml2YXRlRGljdCl8fHZvaWQgMD09PWI/dm9pZCAwOmIuc3VicnNJbmRleCkmJihuPXQucHJpdmF0ZURpY3Quc3VicnNJbmRleC5vYmplY3RzKSxuJiYoTys9ZihuKSxGPW5bT10pfWVsc2UoMCxuLndhcm4pKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKX1lbHNlIEY9ci5zdWJyc1tPK3Iuc3VicnNCaWFzXTtGJiZlKEYpO2JyZWFrO2Nhc2UgMTE6cmV0dXJuO2Nhc2UgMTI6c3dpdGNoKFQ9Z1twKytdLFQpe2Nhc2UgMzQ6dz1oK2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLEE9dStsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSxjKHcsdSx2LEEsaCxBKSx3PWgrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSxjKHcsQSx2LHUsaCx1KTticmVhaztjYXNlIDM1Onc9aCtsLnNoaWZ0KCkseD11K2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSx1PVMrbC5zaGlmdCgpLGModyx4LHYsUyxoLHUpLHc9aCtsLnNoaWZ0KCkseD11K2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSx1PVMrbC5zaGlmdCgpLGModyx4LHYsUyxoLHUpLGwucG9wKCk7YnJlYWs7Y2FzZSAzNjp3PWgrbC5zaGlmdCgpLEE9dStsLnNoaWZ0KCksdj13K2wuc2hpZnQoKSxrPUErbC5zaGlmdCgpLGg9ditsLnNoaWZ0KCksYyh3LEEsdixrLGgsayksdz1oK2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLEM9aytsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSxjKHcsayx2LEMsaCx1KTticmVhaztjYXNlIDM3OmNvbnN0IGU9aCx0PXU7dz1oK2wuc2hpZnQoKSx4PXUrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksUz14K2wuc2hpZnQoKSxoPXYrbC5zaGlmdCgpLHU9UytsLnNoaWZ0KCksYyh3LHgsdixTLGgsdSksdz1oK2wuc2hpZnQoKSx4PXUrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksUz14K2wuc2hpZnQoKSxoPXYsdT1TLE1hdGguYWJzKGgtZSk+TWF0aC5hYnModS10KT9oKz1sLnNoaWZ0KCk6dSs9bC5zaGlmdCgpLGModyx4LHYsUyxoLHUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoInVua25vd24gb3BlcmF0b3I6IDEyICIuY29uY2F0KFQpKX1icmVhaztjYXNlIDE0OmlmKGwubGVuZ3RoPj00KXtjb25zdCBlPWwucG9wKCksbj1sLnBvcCgpO3U9bC5wb3AoKSxoPWwucG9wKCksdC5wdXNoKHtjbWQ6InNhdmUifSx7Y21kOiJ0cmFuc2xhdGUiLGFyZ3M6W2gsdV19KTtsZXQgYT1tKHIuY21hcCxTdHJpbmcuZnJvbUNoYXJDb2RlKHIuZ2x5cGhOYW1lTWFwW3MuU3RhbmRhcmRFbmNvZGluZ1tlXV0pKTt5KHIuZ2x5cGhzW2EuZ2x5cGhJZF0sdCxyLGEuZ2x5cGhJZCksdC5wdXNoKHtjbWQ6InJlc3RvcmUifSksYT1tKHIuY21hcCxTdHJpbmcuZnJvbUNoYXJDb2RlKHIuZ2x5cGhOYW1lTWFwW3MuU3RhbmRhcmRFbmNvZGluZ1tuXV0pKSx5KHIuZ2x5cGhzW2EuZ2x5cGhJZF0sdCxyLGEuZ2x5cGhJZCl9cmV0dXJuO2Nhc2UgMTk6Y2FzZSAyMDpkKz1sLmxlbmd0aD4+MSxwKz1kKzc+PjMsST0hMDticmVhaztjYXNlIDIxOnUrPWwucG9wKCksaCs9bC5wb3AoKSxpKGgsdSksST0hMDticmVhaztjYXNlIDIyOmgrPWwucG9wKCksaShoLHUpLEk9ITA7YnJlYWs7Y2FzZSAyNDpmb3IoO2wubGVuZ3RoPjI7KXc9aCtsLnNoaWZ0KCkseD11K2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksaD12K2wuc2hpZnQoKSx1PVMrbC5zaGlmdCgpLGModyx4LHYsUyxoLHUpO2grPWwuc2hpZnQoKSx1Kz1sLnNoaWZ0KCksbyhoLHUpO2JyZWFrO2Nhc2UgMjU6Zm9yKDtsLmxlbmd0aD42OyloKz1sLnNoaWZ0KCksdSs9bC5zaGlmdCgpLG8oaCx1KTt3PWgrbC5zaGlmdCgpLHg9dStsLnNoaWZ0KCksdj13K2wuc2hpZnQoKSxTPXgrbC5zaGlmdCgpLGg9ditsLnNoaWZ0KCksdT1TK2wuc2hpZnQoKSxjKHcseCx2LFMsaCx1KTticmVhaztjYXNlIDI2OmZvcihsLmxlbmd0aCUyJiYoaCs9bC5zaGlmdCgpKTtsLmxlbmd0aD4wOyl3PWgseD11K2wuc2hpZnQoKSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksaD12LHU9UytsLnNoaWZ0KCksYyh3LHgsdixTLGgsdSk7YnJlYWs7Y2FzZSAyNzpmb3IobC5sZW5ndGglMiYmKHUrPWwuc2hpZnQoKSk7bC5sZW5ndGg+MDspdz1oK2wuc2hpZnQoKSx4PXUsdj13K2wuc2hpZnQoKSxTPXgrbC5zaGlmdCgpLGg9ditsLnNoaWZ0KCksdT1TLGModyx4LHYsUyxoLHUpO2JyZWFrO2Nhc2UgMjg6bC5wdXNoKChnW3BdPDwyNHxnW3ArMV08PDE2KT4+MTYpLHArPTI7YnJlYWs7Y2FzZSAyOTpPPWwucG9wKCkrci5nc3VicnNCaWFzLEY9ci5nc3VicnNbT10sRiYmZShGKTticmVhaztjYXNlIDMwOmZvcig7bC5sZW5ndGg+MCYmKHc9aCx4PXUrbC5zaGlmdCgpLHY9dytsLnNoaWZ0KCksUz14K2wuc2hpZnQoKSxoPXYrbC5zaGlmdCgpLHU9UysoMT09PWwubGVuZ3RoP2wuc2hpZnQoKTowKSxjKHcseCx2LFMsaCx1KSwwIT09bC5sZW5ndGgpOyl3PWgrbC5zaGlmdCgpLHg9dSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksdT1TK2wuc2hpZnQoKSxoPXYrKDE9PT1sLmxlbmd0aD9sLnNoaWZ0KCk6MCksYyh3LHgsdixTLGgsdSk7YnJlYWs7Y2FzZSAzMTpmb3IoO2wubGVuZ3RoPjAmJih3PWgrbC5zaGlmdCgpLHg9dSx2PXcrbC5zaGlmdCgpLFM9eCtsLnNoaWZ0KCksdT1TK2wuc2hpZnQoKSxoPXYrKDE9PT1sLmxlbmd0aD9sLnNoaWZ0KCk6MCksYyh3LHgsdixTLGgsdSksMCE9PWwubGVuZ3RoKTspdz1oLHg9dStsLnNoaWZ0KCksdj13K2wuc2hpZnQoKSxTPXgrbC5zaGlmdCgpLGg9ditsLnNoaWZ0KCksdT1TKygxPT09bC5sZW5ndGg/bC5zaGlmdCgpOjApLGModyx4LHYsUyxoLHUpO2JyZWFrO2RlZmF1bHQ6aWYoVDwzMil0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigidW5rbm93biBvcGVyYXRvcjogIi5jb25jYXQoVCkpO1Q8MjQ3P2wucHVzaChULTEzOSk6VDwyNTE/bC5wdXNoKDI1NiooVC0yNDcpK2dbcCsrXSsxMDgpOlQ8MjU1P2wucHVzaCgyNTYqLShULTI1MSktZ1twKytdLTEwOCk6KGwucHVzaCgoZ1twXTw8MjR8Z1twKzFdPDwxNnxnW3ArMl08PDh8Z1twKzNdKS82NTUzNikscCs9NCl9SSYmKGwubGVuZ3RoPTApfX0oZSl9Y29uc3Qgdz1bXTtjbGFzcyB2e2NvbnN0cnVjdG9yKGUpe3RoaXMuY29uc3RydWN0b3I9PT12JiYoMCxuLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQ29tcGlsZWRGb250LiIpLHRoaXMuZm9udE1hdHJpeD1lLHRoaXMuY29tcGlsZWRHbHlwaHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWQ9T2JqZWN0LmNyZWF0ZShudWxsKX1nZXRQYXRoSnMoZSl7Y29uc3R7Y2hhckNvZGU6dCxnbHlwaElkOnJ9PW0odGhpcy5jbWFwLGUpO2xldCBuPXRoaXMuY29tcGlsZWRHbHlwaHNbcl07aWYoIW4pdHJ5e249dGhpcy5jb21waWxlR2x5cGgodGhpcy5nbHlwaHNbcl0sciksdGhpcy5jb21waWxlZEdseXBoc1tyXT1ufWNhdGNoKGUpe3Rocm93IHRoaXMuY29tcGlsZWRHbHlwaHNbcl09dyx2b2lkIDA9PT10aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbdF0mJih0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbdF09ciksZX1yZXR1cm4gdm9pZCAwPT09dGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW3RdJiYodGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW3RdPXIpLG59Y29tcGlsZUdseXBoKGUsdCl7aWYoIWV8fDA9PT1lLmxlbmd0aHx8MTQ9PT1lWzBdKXJldHVybiB3O2xldCByPXRoaXMuZm9udE1hdHJpeDtpZih0aGlzLmlzQ0ZGQ0lERm9udCl7Y29uc3QgZT10aGlzLmZkU2VsZWN0LmdldEZESW5kZXgodCk7ZT49MCYmZTx0aGlzLmZkQXJyYXkubGVuZ3RoP3I9dGhpcy5mZEFycmF5W2VdLmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpfHxuLkZPTlRfSURFTlRJVFlfTUFUUklYOigwLG4ud2FybikoIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LiIpfWNvbnN0IGE9W3tjbWQ6InNhdmUifSx7Y21kOiJ0cmFuc2Zvcm0iLGFyZ3M6ci5zbGljZSgpfSx7Y21kOiJzY2FsZSIsYXJnczpbInNpemUiLCItc2l6ZSJdfV07cmV0dXJuIHRoaXMuY29tcGlsZUdseXBoSW1wbChlLGEsdCksYS5wdXNoKHtjbWQ6InJlc3RvcmUifSksYX1jb21waWxlR2x5cGhJbXBsKCl7KDAsbi51bnJlYWNoYWJsZSkoIkNoaWxkcmVuIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzLiIpfWhhc0J1aWx0UGF0aChlKXtjb25zdHtjaGFyQ29kZTp0LGdseXBoSWQ6cn09bSh0aGlzLmNtYXAsZSk7cmV0dXJuIHZvaWQgMCE9PXRoaXMuY29tcGlsZWRHbHlwaHNbcl0mJnZvaWQgMCE9PXRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFt0XX19Y2xhc3MgeCBleHRlbmRzIHZ7Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKHJ8fFs0ODhlLTYsMCwwLDQ4OGUtNiwwLDBdKSx0aGlzLmdseXBocz1lLHRoaXMuY21hcD10fWNvbXBpbGVHbHlwaEltcGwoZSx0KXtiKGUsdCx0aGlzKX19Y2xhc3MgUyBleHRlbmRzIHZ7Y29uc3RydWN0b3IoZSx0LHIsbil7c3VwZXIocnx8Wy4wMDEsMCwwLC4wMDEsMCwwXSksdGhpcy5nbHlwaHM9ZS5nbHlwaHMsdGhpcy5nc3VicnM9ZS5nc3VicnN8fFtdLHRoaXMuc3VicnM9ZS5zdWJyc3x8W10sdGhpcy5jbWFwPXQsdGhpcy5nbHlwaE5hbWVNYXA9bnx8KDAsaS5nZXRHbHlwaHNVbmljb2RlKSgpLHRoaXMuZ3N1YnJzQmlhcz1mKHRoaXMuZ3N1YnJzKSx0aGlzLnN1YnJzQmlhcz1mKHRoaXMuc3VicnMpLHRoaXMuaXNDRkZDSURGb250PWUuaXNDRkZDSURGb250LHRoaXMuZmRTZWxlY3Q9ZS5mZFNlbGVjdCx0aGlzLmZkQXJyYXk9ZS5mZEFycmF5fWNvbXBpbGVHbHlwaEltcGwoZSx0LHIpe3koZSx0LHRoaXMscil9fXQuRm9udFJlbmRlcmVyRmFjdG9yeT1jbGFzc3tzdGF0aWMgY3JlYXRlKGUsdCl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmRhdGEpO2xldCBhLGkscyxvLGgsdTtjb25zdCBkPWwociw0KTtmb3IobGV0IGU9MCxmPTEyO2U8ZDtlKyssZis9MTYpe2NvbnN0IGU9KDAsbi5ieXRlc1RvU3RyaW5nKShyLnN1YmFycmF5KGYsZis0KSksZD1jKHIsZis4KSxtPWMocixmKzEyKTtzd2l0Y2goZSl7Y2FzZSJjbWFwIjphPWcocixkKTticmVhaztjYXNlImdseWYiOmk9ci5zdWJhcnJheShkLGQrbSk7YnJlYWs7Y2FzZSJsb2NhIjpzPXIuc3ViYXJyYXkoZCxkK20pO2JyZWFrO2Nhc2UiaGVhZCI6dT1sKHIsZCsxOCksaD1sKHIsZCs1MCk7YnJlYWs7Y2FzZSJDRkYgIjpvPXAocixkLGQrbSx0KX19aWYoaSl7Y29uc3QgdD11P1sxL3UsMCwwLDEvdSwwLDBdOmUuZm9udE1hdHJpeDtyZXR1cm4gbmV3IHgoZnVuY3Rpb24oZSx0LHIpe2xldCBuLGE7cj8obj00LGE9Yyk6KG49MixhPShlLHQpPT4yKmwoZSx0KSk7Y29uc3QgaT1bXTtsZXQgcz1hKHQsMCk7Zm9yKGxldCByPW47cjx0Lmxlbmd0aDtyKz1uKXtjb25zdCBuPWEodCxyKTtpLnB1c2goZS5zdWJhcnJheShzLG4pKSxzPW59cmV0dXJuIGl9KGkscyxoKSxhLHQpfXJldHVybiBuZXcgUyhvLGEsZS5mb250TWF0cml4LGUuZ2x5cGhOYW1lTWFwKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0TWV0cmljcz10LmdldEZvbnRCYXNpY01ldHJpY3M9dm9pZCAwO3ZhciBuPXIoMTQ5KTtjb25zdCBhPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5Db3VyaWVyPTYwMCxlWyJDb3VyaWVyLUJvbGQiXT02MDAsZVsiQ291cmllci1Cb2xkT2JsaXF1ZSJdPTYwMCxlWyJDb3VyaWVyLU9ibGlxdWUiXT02MDAsZS5IZWx2ZXRpY2E9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI3OCxlLmV4Y2xhbT0yNzgsZS5xdW90ZWRibD0zNTUsZS5udW1iZXJzaWduPTU1NixlLmRvbGxhcj01NTYsZS5wZXJjZW50PTg4OSxlLmFtcGVyc2FuZD02NjcsZS5xdW90ZXJpZ2h0PTIyMixlLnBhcmVubGVmdD0zMzMsZS5wYXJlbnJpZ2h0PTMzMyxlLmFzdGVyaXNrPTM4OSxlLnBsdXM9NTg0LGUuY29tbWE9Mjc4LGUuaHlwaGVuPTMzMyxlLnBlcmlvZD0yNzgsZS5zbGFzaD0yNzgsZS56ZXJvPTU1NixlLm9uZT01NTYsZS50d289NTU2LGUudGhyZWU9NTU2LGUuZm91cj01NTYsZS5maXZlPTU1NixlLnNpeD01NTYsZS5zZXZlbj01NTYsZS5laWdodD01NTYsZS5uaW5lPTU1NixlLmNvbG9uPTI3OCxlLnNlbWljb2xvbj0yNzgsZS5sZXNzPTU4NCxlLmVxdWFsPTU4NCxlLmdyZWF0ZXI9NTg0LGUucXVlc3Rpb249NTU2LGUuYXQ9MTAxNSxlLkE9NjY3LGUuQj02NjcsZS5DPTcyMixlLkQ9NzIyLGUuRT02NjcsZS5GPTYxMSxlLkc9Nzc4LGUuSD03MjIsZS5JPTI3OCxlLko9NTAwLGUuSz02NjcsZS5MPTU1NixlLk09ODMzLGUuTj03MjIsZS5PPTc3OCxlLlA9NjY3LGUuUT03NzgsZS5SPTcyMixlLlM9NjY3LGUuVD02MTEsZS5VPTcyMixlLlY9NjY3LGUuVz05NDQsZS5YPTY2NyxlLlk9NjY3LGUuWj02MTEsZS5icmFja2V0bGVmdD0yNzgsZS5iYWNrc2xhc2g9Mjc4LGUuYnJhY2tldHJpZ2h0PTI3OCxlLmFzY2lpY2lyY3VtPTQ2OSxlLnVuZGVyc2NvcmU9NTU2LGUucXVvdGVsZWZ0PTIyMixlLmE9NTU2LGUuYj01NTYsZS5jPTUwMCxlLmQ9NTU2LGUuZT01NTYsZS5mPTI3OCxlLmc9NTU2LGUuaD01NTYsZS5pPTIyMixlLmo9MjIyLGUuaz01MDAsZS5sPTIyMixlLm09ODMzLGUubj01NTYsZS5vPTU1NixlLnA9NTU2LGUucT01NTYsZS5yPTMzMyxlLnM9NTAwLGUudD0yNzgsZS51PTU1NixlLnY9NTAwLGUudz03MjIsZS54PTUwMCxlLnk9NTAwLGUuej01MDAsZS5icmFjZWxlZnQ9MzM0LGUuYmFyPTI2MCxlLmJyYWNlcmlnaHQ9MzM0LGUuYXNjaWl0aWxkZT01ODQsZS5leGNsYW1kb3duPTMzMyxlLmNlbnQ9NTU2LGUuc3Rlcmxpbmc9NTU2LGUuZnJhY3Rpb249MTY3LGUueWVuPTU1NixlLmZsb3Jpbj01NTYsZS5zZWN0aW9uPTU1NixlLmN1cnJlbmN5PTU1NixlLnF1b3Rlc2luZ2xlPTE5MSxlLnF1b3RlZGJsbGVmdD0zMzMsZS5ndWlsbGVtb3RsZWZ0PTU1NixlLmd1aWxzaW5nbGxlZnQ9MzMzLGUuZ3VpbHNpbmdscmlnaHQ9MzMzLGUuZmk9NTAwLGUuZmw9NTAwLGUuZW5kYXNoPTU1NixlLmRhZ2dlcj01NTYsZS5kYWdnZXJkYmw9NTU2LGUucGVyaW9kY2VudGVyZWQ9Mjc4LGUucGFyYWdyYXBoPTUzNyxlLmJ1bGxldD0zNTAsZS5xdW90ZXNpbmdsYmFzZT0yMjIsZS5xdW90ZWRibGJhc2U9MzMzLGUucXVvdGVkYmxyaWdodD0zMzMsZS5ndWlsbGVtb3RyaWdodD01NTYsZS5lbGxpcHNpcz0xZTMsZS5wZXJ0aG91c2FuZD0xZTMsZS5xdWVzdGlvbmRvd249NjExLGUuZ3JhdmU9MzMzLGUuYWN1dGU9MzMzLGUuY2lyY3VtZmxleD0zMzMsZS50aWxkZT0zMzMsZS5tYWNyb249MzMzLGUuYnJldmU9MzMzLGUuZG90YWNjZW50PTMzMyxlLmRpZXJlc2lzPTMzMyxlLnJpbmc9MzMzLGUuY2VkaWxsYT0zMzMsZS5odW5nYXJ1bWxhdXQ9MzMzLGUub2dvbmVrPTMzMyxlLmNhcm9uPTMzMyxlLmVtZGFzaD0xZTMsZS5BRT0xZTMsZS5vcmRmZW1pbmluZT0zNzAsZS5Mc2xhc2g9NTU2LGUuT3NsYXNoPTc3OCxlLk9FPTFlMyxlLm9yZG1hc2N1bGluZT0zNjUsZS5hZT04ODksZS5kb3RsZXNzaT0yNzgsZS5sc2xhc2g9MjIyLGUub3NsYXNoPTYxMSxlLm9lPTk0NCxlLmdlcm1hbmRibHM9NjExLGUuSWRpZXJlc2lzPTI3OCxlLmVhY3V0ZT01NTYsZS5hYnJldmU9NTU2LGUudWh1bmdhcnVtbGF1dD01NTYsZS5lY2Fyb249NTU2LGUuWWRpZXJlc2lzPTY2NyxlLmRpdmlkZT01ODQsZS5ZYWN1dGU9NjY3LGUuQWNpcmN1bWZsZXg9NjY3LGUuYWFjdXRlPTU1NixlLlVjaXJjdW1mbGV4PTcyMixlLnlhY3V0ZT01MDAsZS5zY29tbWFhY2NlbnQ9NTAwLGUuZWNpcmN1bWZsZXg9NTU2LGUuVXJpbmc9NzIyLGUuVWRpZXJlc2lzPTcyMixlLmFvZ29uZWs9NTU2LGUuVWFjdXRlPTcyMixlLnVvZ29uZWs9NTU2LGUuRWRpZXJlc2lzPTY2NyxlLkRjcm9hdD03MjIsZS5jb21tYWFjY2VudD0yNTAsZS5jb3B5cmlnaHQ9NzM3LGUuRW1hY3Jvbj02NjcsZS5jY2Fyb249NTAwLGUuYXJpbmc9NTU2LGUuTmNvbW1hYWNjZW50PTcyMixlLmxhY3V0ZT0yMjIsZS5hZ3JhdmU9NTU2LGUuVGNvbW1hYWNjZW50PTYxMSxlLkNhY3V0ZT03MjIsZS5hdGlsZGU9NTU2LGUuRWRvdGFjY2VudD02NjcsZS5zY2Fyb249NTAwLGUuc2NlZGlsbGE9NTAwLGUuaWFjdXRlPTI3OCxlLmxvemVuZ2U9NDcxLGUuUmNhcm9uPTcyMixlLkdjb21tYWFjY2VudD03NzgsZS51Y2lyY3VtZmxleD01NTYsZS5hY2lyY3VtZmxleD01NTYsZS5BbWFjcm9uPTY2NyxlLnJjYXJvbj0zMzMsZS5jY2VkaWxsYT01MDAsZS5aZG90YWNjZW50PTYxMSxlLlRob3JuPTY2NyxlLk9tYWNyb249Nzc4LGUuUmFjdXRlPTcyMixlLlNhY3V0ZT02NjcsZS5kY2Fyb249NjQzLGUuVW1hY3Jvbj03MjIsZS51cmluZz01NTYsZS50aHJlZXN1cGVyaW9yPTMzMyxlLk9ncmF2ZT03NzgsZS5BZ3JhdmU9NjY3LGUuQWJyZXZlPTY2NyxlLm11bHRpcGx5PTU4NCxlLnVhY3V0ZT01NTYsZS5UY2Fyb249NjExLGUucGFydGlhbGRpZmY9NDc2LGUueWRpZXJlc2lzPTUwMCxlLk5hY3V0ZT03MjIsZS5pY2lyY3VtZmxleD0yNzgsZS5FY2lyY3VtZmxleD02NjcsZS5hZGllcmVzaXM9NTU2LGUuZWRpZXJlc2lzPTU1NixlLmNhY3V0ZT01MDAsZS5uYWN1dGU9NTU2LGUudW1hY3Jvbj01NTYsZS5OY2Fyb249NzIyLGUuSWFjdXRlPTI3OCxlLnBsdXNtaW51cz01ODQsZS5icm9rZW5iYXI9MjYwLGUucmVnaXN0ZXJlZD03MzcsZS5HYnJldmU9Nzc4LGUuSWRvdGFjY2VudD0yNzgsZS5zdW1tYXRpb249NjAwLGUuRWdyYXZlPTY2NyxlLnJhY3V0ZT0zMzMsZS5vbWFjcm9uPTU1NixlLlphY3V0ZT02MTEsZS5aY2Fyb249NjExLGUuZ3JlYXRlcmVxdWFsPTU0OSxlLkV0aD03MjIsZS5DY2VkaWxsYT03MjIsZS5sY29tbWFhY2NlbnQ9MjIyLGUudGNhcm9uPTMxNyxlLmVvZ29uZWs9NTU2LGUuVW9nb25laz03MjIsZS5BYWN1dGU9NjY3LGUuQWRpZXJlc2lzPTY2NyxlLmVncmF2ZT01NTYsZS56YWN1dGU9NTAwLGUuaW9nb25laz0yMjIsZS5PYWN1dGU9Nzc4LGUub2FjdXRlPTU1NixlLmFtYWNyb249NTU2LGUuc2FjdXRlPTUwMCxlLmlkaWVyZXNpcz0yNzgsZS5PY2lyY3VtZmxleD03NzgsZS5VZ3JhdmU9NzIyLGUuRGVsdGE9NjEyLGUudGhvcm49NTU2LGUudHdvc3VwZXJpb3I9MzMzLGUuT2RpZXJlc2lzPTc3OCxlLm11PTU1NixlLmlncmF2ZT0yNzgsZS5vaHVuZ2FydW1sYXV0PTU1NixlLkVvZ29uZWs9NjY3LGUuZGNyb2F0PTU1NixlLnRocmVlcXVhcnRlcnM9ODM0LGUuU2NlZGlsbGE9NjY3LGUubGNhcm9uPTI5OSxlLktjb21tYWFjY2VudD02NjcsZS5MYWN1dGU9NTU2LGUudHJhZGVtYXJrPTFlMyxlLmVkb3RhY2NlbnQ9NTU2LGUuSWdyYXZlPTI3OCxlLkltYWNyb249Mjc4LGUuTGNhcm9uPTU1NixlLm9uZWhhbGY9ODM0LGUubGVzc2VxdWFsPTU0OSxlLm9jaXJjdW1mbGV4PTU1NixlLm50aWxkZT01NTYsZS5VaHVuZ2FydW1sYXV0PTcyMixlLkVhY3V0ZT02NjcsZS5lbWFjcm9uPTU1NixlLmdicmV2ZT01NTYsZS5vbmVxdWFydGVyPTgzNCxlLlNjYXJvbj02NjcsZS5TY29tbWFhY2NlbnQ9NjY3LGUuT2h1bmdhcnVtbGF1dD03NzgsZS5kZWdyZWU9NDAwLGUub2dyYXZlPTU1NixlLkNjYXJvbj03MjIsZS51Z3JhdmU9NTU2LGUucmFkaWNhbD00NTMsZS5EY2Fyb249NzIyLGUucmNvbW1hYWNjZW50PTMzMyxlLk50aWxkZT03MjIsZS5vdGlsZGU9NTU2LGUuUmNvbW1hYWNjZW50PTcyMixlLkxjb21tYWFjY2VudD01NTYsZS5BdGlsZGU9NjY3LGUuQW9nb25laz02NjcsZS5BcmluZz02NjcsZS5PdGlsZGU9Nzc4LGUuemRvdGFjY2VudD01MDAsZS5FY2Fyb249NjY3LGUuSW9nb25laz0yNzgsZS5rY29tbWFhY2NlbnQ9NTAwLGUubWludXM9NTg0LGUuSWNpcmN1bWZsZXg9Mjc4LGUubmNhcm9uPTU1NixlLnRjb21tYWFjY2VudD0yNzgsZS5sb2dpY2Fsbm90PTU4NCxlLm9kaWVyZXNpcz01NTYsZS51ZGllcmVzaXM9NTU2LGUubm90ZXF1YWw9NTQ5LGUuZ2NvbW1hYWNjZW50PTU1NixlLmV0aD01NTYsZS56Y2Fyb249NTAwLGUubmNvbW1hYWNjZW50PTU1NixlLm9uZXN1cGVyaW9yPTMzMyxlLmltYWNyb249Mjc4LGUuRXVybz01NTZ9KSksZVsiSGVsdmV0aWNhLUJvbGQiXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9Mjc4LGUuZXhjbGFtPTMzMyxlLnF1b3RlZGJsPTQ3NCxlLm51bWJlcnNpZ249NTU2LGUuZG9sbGFyPTU1NixlLnBlcmNlbnQ9ODg5LGUuYW1wZXJzYW5kPTcyMixlLnF1b3RlcmlnaHQ9Mjc4LGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9Mzg5LGUucGx1cz01ODQsZS5jb21tYT0yNzgsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI3OCxlLnNsYXNoPTI3OCxlLnplcm89NTU2LGUub25lPTU1NixlLnR3bz01NTYsZS50aHJlZT01NTYsZS5mb3VyPTU1NixlLmZpdmU9NTU2LGUuc2l4PTU1NixlLnNldmVuPTU1NixlLmVpZ2h0PTU1NixlLm5pbmU9NTU2LGUuY29sb249MzMzLGUuc2VtaWNvbG9uPTMzMyxlLmxlc3M9NTg0LGUuZXF1YWw9NTg0LGUuZ3JlYXRlcj01ODQsZS5xdWVzdGlvbj02MTEsZS5hdD05NzUsZS5BPTcyMixlLkI9NzIyLGUuQz03MjIsZS5EPTcyMixlLkU9NjY3LGUuRj02MTEsZS5HPTc3OCxlLkg9NzIyLGUuST0yNzgsZS5KPTU1NixlLks9NzIyLGUuTD02MTEsZS5NPTgzMyxlLk49NzIyLGUuTz03NzgsZS5QPTY2NyxlLlE9Nzc4LGUuUj03MjIsZS5TPTY2NyxlLlQ9NjExLGUuVT03MjIsZS5WPTY2NyxlLlc9OTQ0LGUuWD02NjcsZS5ZPTY2NyxlLlo9NjExLGUuYnJhY2tldGxlZnQ9MzMzLGUuYmFja3NsYXNoPTI3OCxlLmJyYWNrZXRyaWdodD0zMzMsZS5hc2NpaWNpcmN1bT01ODQsZS51bmRlcnNjb3JlPTU1NixlLnF1b3RlbGVmdD0yNzgsZS5hPTU1NixlLmI9NjExLGUuYz01NTYsZS5kPTYxMSxlLmU9NTU2LGUuZj0zMzMsZS5nPTYxMSxlLmg9NjExLGUuaT0yNzgsZS5qPTI3OCxlLms9NTU2LGUubD0yNzgsZS5tPTg4OSxlLm49NjExLGUubz02MTEsZS5wPTYxMSxlLnE9NjExLGUucj0zODksZS5zPTU1NixlLnQ9MzMzLGUudT02MTEsZS52PTU1NixlLnc9Nzc4LGUueD01NTYsZS55PTU1NixlLno9NTAwLGUuYnJhY2VsZWZ0PTM4OSxlLmJhcj0yODAsZS5icmFjZXJpZ2h0PTM4OSxlLmFzY2lpdGlsZGU9NTg0LGUuZXhjbGFtZG93bj0zMzMsZS5jZW50PTU1NixlLnN0ZXJsaW5nPTU1NixlLmZyYWN0aW9uPTE2NyxlLnllbj01NTYsZS5mbG9yaW49NTU2LGUuc2VjdGlvbj01NTYsZS5jdXJyZW5jeT01NTYsZS5xdW90ZXNpbmdsZT0yMzgsZS5xdW90ZWRibGxlZnQ9NTAwLGUuZ3VpbGxlbW90bGVmdD01NTYsZS5ndWlsc2luZ2xsZWZ0PTMzMyxlLmd1aWxzaW5nbHJpZ2h0PTMzMyxlLmZpPTYxMSxlLmZsPTYxMSxlLmVuZGFzaD01NTYsZS5kYWdnZXI9NTU2LGUuZGFnZ2VyZGJsPTU1NixlLnBlcmlvZGNlbnRlcmVkPTI3OCxlLnBhcmFncmFwaD01NTYsZS5idWxsZXQ9MzUwLGUucXVvdGVzaW5nbGJhc2U9Mjc4LGUucXVvdGVkYmxiYXNlPTUwMCxlLnF1b3RlZGJscmlnaHQ9NTAwLGUuZ3VpbGxlbW90cmlnaHQ9NTU2LGUuZWxsaXBzaXM9MWUzLGUucGVydGhvdXNhbmQ9MWUzLGUucXVlc3Rpb25kb3duPTYxMSxlLmdyYXZlPTMzMyxlLmFjdXRlPTMzMyxlLmNpcmN1bWZsZXg9MzMzLGUudGlsZGU9MzMzLGUubWFjcm9uPTMzMyxlLmJyZXZlPTMzMyxlLmRvdGFjY2VudD0zMzMsZS5kaWVyZXNpcz0zMzMsZS5yaW5nPTMzMyxlLmNlZGlsbGE9MzMzLGUuaHVuZ2FydW1sYXV0PTMzMyxlLm9nb25laz0zMzMsZS5jYXJvbj0zMzMsZS5lbWRhc2g9MWUzLGUuQUU9MWUzLGUub3JkZmVtaW5pbmU9MzcwLGUuTHNsYXNoPTYxMSxlLk9zbGFzaD03NzgsZS5PRT0xZTMsZS5vcmRtYXNjdWxpbmU9MzY1LGUuYWU9ODg5LGUuZG90bGVzc2k9Mjc4LGUubHNsYXNoPTI3OCxlLm9zbGFzaD02MTEsZS5vZT05NDQsZS5nZXJtYW5kYmxzPTYxMSxlLklkaWVyZXNpcz0yNzgsZS5lYWN1dGU9NTU2LGUuYWJyZXZlPTU1NixlLnVodW5nYXJ1bWxhdXQ9NjExLGUuZWNhcm9uPTU1NixlLllkaWVyZXNpcz02NjcsZS5kaXZpZGU9NTg0LGUuWWFjdXRlPTY2NyxlLkFjaXJjdW1mbGV4PTcyMixlLmFhY3V0ZT01NTYsZS5VY2lyY3VtZmxleD03MjIsZS55YWN1dGU9NTU2LGUuc2NvbW1hYWNjZW50PTU1NixlLmVjaXJjdW1mbGV4PTU1NixlLlVyaW5nPTcyMixlLlVkaWVyZXNpcz03MjIsZS5hb2dvbmVrPTU1NixlLlVhY3V0ZT03MjIsZS51b2dvbmVrPTYxMSxlLkVkaWVyZXNpcz02NjcsZS5EY3JvYXQ9NzIyLGUuY29tbWFhY2NlbnQ9MjUwLGUuY29weXJpZ2h0PTczNyxlLkVtYWNyb249NjY3LGUuY2Nhcm9uPTU1NixlLmFyaW5nPTU1NixlLk5jb21tYWFjY2VudD03MjIsZS5sYWN1dGU9Mjc4LGUuYWdyYXZlPTU1NixlLlRjb21tYWFjY2VudD02MTEsZS5DYWN1dGU9NzIyLGUuYXRpbGRlPTU1NixlLkVkb3RhY2NlbnQ9NjY3LGUuc2Nhcm9uPTU1NixlLnNjZWRpbGxhPTU1NixlLmlhY3V0ZT0yNzgsZS5sb3plbmdlPTQ5NCxlLlJjYXJvbj03MjIsZS5HY29tbWFhY2NlbnQ9Nzc4LGUudWNpcmN1bWZsZXg9NjExLGUuYWNpcmN1bWZsZXg9NTU2LGUuQW1hY3Jvbj03MjIsZS5yY2Fyb249Mzg5LGUuY2NlZGlsbGE9NTU2LGUuWmRvdGFjY2VudD02MTEsZS5UaG9ybj02NjcsZS5PbWFjcm9uPTc3OCxlLlJhY3V0ZT03MjIsZS5TYWN1dGU9NjY3LGUuZGNhcm9uPTc0MyxlLlVtYWNyb249NzIyLGUudXJpbmc9NjExLGUudGhyZWVzdXBlcmlvcj0zMzMsZS5PZ3JhdmU9Nzc4LGUuQWdyYXZlPTcyMixlLkFicmV2ZT03MjIsZS5tdWx0aXBseT01ODQsZS51YWN1dGU9NjExLGUuVGNhcm9uPTYxMSxlLnBhcnRpYWxkaWZmPTQ5NCxlLnlkaWVyZXNpcz01NTYsZS5OYWN1dGU9NzIyLGUuaWNpcmN1bWZsZXg9Mjc4LGUuRWNpcmN1bWZsZXg9NjY3LGUuYWRpZXJlc2lzPTU1NixlLmVkaWVyZXNpcz01NTYsZS5jYWN1dGU9NTU2LGUubmFjdXRlPTYxMSxlLnVtYWNyb249NjExLGUuTmNhcm9uPTcyMixlLklhY3V0ZT0yNzgsZS5wbHVzbWludXM9NTg0LGUuYnJva2VuYmFyPTI4MCxlLnJlZ2lzdGVyZWQ9NzM3LGUuR2JyZXZlPTc3OCxlLklkb3RhY2NlbnQ9Mjc4LGUuc3VtbWF0aW9uPTYwMCxlLkVncmF2ZT02NjcsZS5yYWN1dGU9Mzg5LGUub21hY3Jvbj02MTEsZS5aYWN1dGU9NjExLGUuWmNhcm9uPTYxMSxlLmdyZWF0ZXJlcXVhbD01NDksZS5FdGg9NzIyLGUuQ2NlZGlsbGE9NzIyLGUubGNvbW1hYWNjZW50PTI3OCxlLnRjYXJvbj0zODksZS5lb2dvbmVrPTU1NixlLlVvZ29uZWs9NzIyLGUuQWFjdXRlPTcyMixlLkFkaWVyZXNpcz03MjIsZS5lZ3JhdmU9NTU2LGUuemFjdXRlPTUwMCxlLmlvZ29uZWs9Mjc4LGUuT2FjdXRlPTc3OCxlLm9hY3V0ZT02MTEsZS5hbWFjcm9uPTU1NixlLnNhY3V0ZT01NTYsZS5pZGllcmVzaXM9Mjc4LGUuT2NpcmN1bWZsZXg9Nzc4LGUuVWdyYXZlPTcyMixlLkRlbHRhPTYxMixlLnRob3JuPTYxMSxlLnR3b3N1cGVyaW9yPTMzMyxlLk9kaWVyZXNpcz03NzgsZS5tdT02MTEsZS5pZ3JhdmU9Mjc4LGUub2h1bmdhcnVtbGF1dD02MTEsZS5Fb2dvbmVrPTY2NyxlLmRjcm9hdD02MTEsZS50aHJlZXF1YXJ0ZXJzPTgzNCxlLlNjZWRpbGxhPTY2NyxlLmxjYXJvbj00MDAsZS5LY29tbWFhY2NlbnQ9NzIyLGUuTGFjdXRlPTYxMSxlLnRyYWRlbWFyaz0xZTMsZS5lZG90YWNjZW50PTU1NixlLklncmF2ZT0yNzgsZS5JbWFjcm9uPTI3OCxlLkxjYXJvbj02MTEsZS5vbmVoYWxmPTgzNCxlLmxlc3NlcXVhbD01NDksZS5vY2lyY3VtZmxleD02MTEsZS5udGlsZGU9NjExLGUuVWh1bmdhcnVtbGF1dD03MjIsZS5FYWN1dGU9NjY3LGUuZW1hY3Jvbj01NTYsZS5nYnJldmU9NjExLGUub25lcXVhcnRlcj04MzQsZS5TY2Fyb249NjY3LGUuU2NvbW1hYWNjZW50PTY2NyxlLk9odW5nYXJ1bWxhdXQ9Nzc4LGUuZGVncmVlPTQwMCxlLm9ncmF2ZT02MTEsZS5DY2Fyb249NzIyLGUudWdyYXZlPTYxMSxlLnJhZGljYWw9NTQ5LGUuRGNhcm9uPTcyMixlLnJjb21tYWFjY2VudD0zODksZS5OdGlsZGU9NzIyLGUub3RpbGRlPTYxMSxlLlJjb21tYWFjY2VudD03MjIsZS5MY29tbWFhY2NlbnQ9NjExLGUuQXRpbGRlPTcyMixlLkFvZ29uZWs9NzIyLGUuQXJpbmc9NzIyLGUuT3RpbGRlPTc3OCxlLnpkb3RhY2NlbnQ9NTAwLGUuRWNhcm9uPTY2NyxlLklvZ29uZWs9Mjc4LGUua2NvbW1hYWNjZW50PTU1NixlLm1pbnVzPTU4NCxlLkljaXJjdW1mbGV4PTI3OCxlLm5jYXJvbj02MTEsZS50Y29tbWFhY2NlbnQ9MzMzLGUubG9naWNhbG5vdD01ODQsZS5vZGllcmVzaXM9NjExLGUudWRpZXJlc2lzPTYxMSxlLm5vdGVxdWFsPTU0OSxlLmdjb21tYWFjY2VudD02MTEsZS5ldGg9NjExLGUuemNhcm9uPTUwMCxlLm5jb21tYWFjY2VudD02MTEsZS5vbmVzdXBlcmlvcj0zMzMsZS5pbWFjcm9uPTI3OCxlLkV1cm89NTU2fSkpLGVbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0yNzgsZS5leGNsYW09MzMzLGUucXVvdGVkYmw9NDc0LGUubnVtYmVyc2lnbj01NTYsZS5kb2xsYXI9NTU2LGUucGVyY2VudD04ODksZS5hbXBlcnNhbmQ9NzIyLGUucXVvdGVyaWdodD0yNzgsZS5wYXJlbmxlZnQ9MzMzLGUucGFyZW5yaWdodD0zMzMsZS5hc3Rlcmlzaz0zODksZS5wbHVzPTU4NCxlLmNvbW1hPTI3OCxlLmh5cGhlbj0zMzMsZS5wZXJpb2Q9Mjc4LGUuc2xhc2g9Mjc4LGUuemVybz01NTYsZS5vbmU9NTU2LGUudHdvPTU1NixlLnRocmVlPTU1NixlLmZvdXI9NTU2LGUuZml2ZT01NTYsZS5zaXg9NTU2LGUuc2V2ZW49NTU2LGUuZWlnaHQ9NTU2LGUubmluZT01NTYsZS5jb2xvbj0zMzMsZS5zZW1pY29sb249MzMzLGUubGVzcz01ODQsZS5lcXVhbD01ODQsZS5ncmVhdGVyPTU4NCxlLnF1ZXN0aW9uPTYxMSxlLmF0PTk3NSxlLkE9NzIyLGUuQj03MjIsZS5DPTcyMixlLkQ9NzIyLGUuRT02NjcsZS5GPTYxMSxlLkc9Nzc4LGUuSD03MjIsZS5JPTI3OCxlLko9NTU2LGUuSz03MjIsZS5MPTYxMSxlLk09ODMzLGUuTj03MjIsZS5PPTc3OCxlLlA9NjY3LGUuUT03NzgsZS5SPTcyMixlLlM9NjY3LGUuVD02MTEsZS5VPTcyMixlLlY9NjY3LGUuVz05NDQsZS5YPTY2NyxlLlk9NjY3LGUuWj02MTEsZS5icmFja2V0bGVmdD0zMzMsZS5iYWNrc2xhc2g9Mjc4LGUuYnJhY2tldHJpZ2h0PTMzMyxlLmFzY2lpY2lyY3VtPTU4NCxlLnVuZGVyc2NvcmU9NTU2LGUucXVvdGVsZWZ0PTI3OCxlLmE9NTU2LGUuYj02MTEsZS5jPTU1NixlLmQ9NjExLGUuZT01NTYsZS5mPTMzMyxlLmc9NjExLGUuaD02MTEsZS5pPTI3OCxlLmo9Mjc4LGUuaz01NTYsZS5sPTI3OCxlLm09ODg5LGUubj02MTEsZS5vPTYxMSxlLnA9NjExLGUucT02MTEsZS5yPTM4OSxlLnM9NTU2LGUudD0zMzMsZS51PTYxMSxlLnY9NTU2LGUudz03NzgsZS54PTU1NixlLnk9NTU2LGUuej01MDAsZS5icmFjZWxlZnQ9Mzg5LGUuYmFyPTI4MCxlLmJyYWNlcmlnaHQ9Mzg5LGUuYXNjaWl0aWxkZT01ODQsZS5leGNsYW1kb3duPTMzMyxlLmNlbnQ9NTU2LGUuc3Rlcmxpbmc9NTU2LGUuZnJhY3Rpb249MTY3LGUueWVuPTU1NixlLmZsb3Jpbj01NTYsZS5zZWN0aW9uPTU1NixlLmN1cnJlbmN5PTU1NixlLnF1b3Rlc2luZ2xlPTIzOCxlLnF1b3RlZGJsbGVmdD01MDAsZS5ndWlsbGVtb3RsZWZ0PTU1NixlLmd1aWxzaW5nbGxlZnQ9MzMzLGUuZ3VpbHNpbmdscmlnaHQ9MzMzLGUuZmk9NjExLGUuZmw9NjExLGUuZW5kYXNoPTU1NixlLmRhZ2dlcj01NTYsZS5kYWdnZXJkYmw9NTU2LGUucGVyaW9kY2VudGVyZWQ9Mjc4LGUucGFyYWdyYXBoPTU1NixlLmJ1bGxldD0zNTAsZS5xdW90ZXNpbmdsYmFzZT0yNzgsZS5xdW90ZWRibGJhc2U9NTAwLGUucXVvdGVkYmxyaWdodD01MDAsZS5ndWlsbGVtb3RyaWdodD01NTYsZS5lbGxpcHNpcz0xZTMsZS5wZXJ0aG91c2FuZD0xZTMsZS5xdWVzdGlvbmRvd249NjExLGUuZ3JhdmU9MzMzLGUuYWN1dGU9MzMzLGUuY2lyY3VtZmxleD0zMzMsZS50aWxkZT0zMzMsZS5tYWNyb249MzMzLGUuYnJldmU9MzMzLGUuZG90YWNjZW50PTMzMyxlLmRpZXJlc2lzPTMzMyxlLnJpbmc9MzMzLGUuY2VkaWxsYT0zMzMsZS5odW5nYXJ1bWxhdXQ9MzMzLGUub2dvbmVrPTMzMyxlLmNhcm9uPTMzMyxlLmVtZGFzaD0xZTMsZS5BRT0xZTMsZS5vcmRmZW1pbmluZT0zNzAsZS5Mc2xhc2g9NjExLGUuT3NsYXNoPTc3OCxlLk9FPTFlMyxlLm9yZG1hc2N1bGluZT0zNjUsZS5hZT04ODksZS5kb3RsZXNzaT0yNzgsZS5sc2xhc2g9Mjc4LGUub3NsYXNoPTYxMSxlLm9lPTk0NCxlLmdlcm1hbmRibHM9NjExLGUuSWRpZXJlc2lzPTI3OCxlLmVhY3V0ZT01NTYsZS5hYnJldmU9NTU2LGUudWh1bmdhcnVtbGF1dD02MTEsZS5lY2Fyb249NTU2LGUuWWRpZXJlc2lzPTY2NyxlLmRpdmlkZT01ODQsZS5ZYWN1dGU9NjY3LGUuQWNpcmN1bWZsZXg9NzIyLGUuYWFjdXRlPTU1NixlLlVjaXJjdW1mbGV4PTcyMixlLnlhY3V0ZT01NTYsZS5zY29tbWFhY2NlbnQ9NTU2LGUuZWNpcmN1bWZsZXg9NTU2LGUuVXJpbmc9NzIyLGUuVWRpZXJlc2lzPTcyMixlLmFvZ29uZWs9NTU2LGUuVWFjdXRlPTcyMixlLnVvZ29uZWs9NjExLGUuRWRpZXJlc2lzPTY2NyxlLkRjcm9hdD03MjIsZS5jb21tYWFjY2VudD0yNTAsZS5jb3B5cmlnaHQ9NzM3LGUuRW1hY3Jvbj02NjcsZS5jY2Fyb249NTU2LGUuYXJpbmc9NTU2LGUuTmNvbW1hYWNjZW50PTcyMixlLmxhY3V0ZT0yNzgsZS5hZ3JhdmU9NTU2LGUuVGNvbW1hYWNjZW50PTYxMSxlLkNhY3V0ZT03MjIsZS5hdGlsZGU9NTU2LGUuRWRvdGFjY2VudD02NjcsZS5zY2Fyb249NTU2LGUuc2NlZGlsbGE9NTU2LGUuaWFjdXRlPTI3OCxlLmxvemVuZ2U9NDk0LGUuUmNhcm9uPTcyMixlLkdjb21tYWFjY2VudD03NzgsZS51Y2lyY3VtZmxleD02MTEsZS5hY2lyY3VtZmxleD01NTYsZS5BbWFjcm9uPTcyMixlLnJjYXJvbj0zODksZS5jY2VkaWxsYT01NTYsZS5aZG90YWNjZW50PTYxMSxlLlRob3JuPTY2NyxlLk9tYWNyb249Nzc4LGUuUmFjdXRlPTcyMixlLlNhY3V0ZT02NjcsZS5kY2Fyb249NzQzLGUuVW1hY3Jvbj03MjIsZS51cmluZz02MTEsZS50aHJlZXN1cGVyaW9yPTMzMyxlLk9ncmF2ZT03NzgsZS5BZ3JhdmU9NzIyLGUuQWJyZXZlPTcyMixlLm11bHRpcGx5PTU4NCxlLnVhY3V0ZT02MTEsZS5UY2Fyb249NjExLGUucGFydGlhbGRpZmY9NDk0LGUueWRpZXJlc2lzPTU1NixlLk5hY3V0ZT03MjIsZS5pY2lyY3VtZmxleD0yNzgsZS5FY2lyY3VtZmxleD02NjcsZS5hZGllcmVzaXM9NTU2LGUuZWRpZXJlc2lzPTU1NixlLmNhY3V0ZT01NTYsZS5uYWN1dGU9NjExLGUudW1hY3Jvbj02MTEsZS5OY2Fyb249NzIyLGUuSWFjdXRlPTI3OCxlLnBsdXNtaW51cz01ODQsZS5icm9rZW5iYXI9MjgwLGUucmVnaXN0ZXJlZD03MzcsZS5HYnJldmU9Nzc4LGUuSWRvdGFjY2VudD0yNzgsZS5zdW1tYXRpb249NjAwLGUuRWdyYXZlPTY2NyxlLnJhY3V0ZT0zODksZS5vbWFjcm9uPTYxMSxlLlphY3V0ZT02MTEsZS5aY2Fyb249NjExLGUuZ3JlYXRlcmVxdWFsPTU0OSxlLkV0aD03MjIsZS5DY2VkaWxsYT03MjIsZS5sY29tbWFhY2NlbnQ9Mjc4LGUudGNhcm9uPTM4OSxlLmVvZ29uZWs9NTU2LGUuVW9nb25laz03MjIsZS5BYWN1dGU9NzIyLGUuQWRpZXJlc2lzPTcyMixlLmVncmF2ZT01NTYsZS56YWN1dGU9NTAwLGUuaW9nb25laz0yNzgsZS5PYWN1dGU9Nzc4LGUub2FjdXRlPTYxMSxlLmFtYWNyb249NTU2LGUuc2FjdXRlPTU1NixlLmlkaWVyZXNpcz0yNzgsZS5PY2lyY3VtZmxleD03NzgsZS5VZ3JhdmU9NzIyLGUuRGVsdGE9NjEyLGUudGhvcm49NjExLGUudHdvc3VwZXJpb3I9MzMzLGUuT2RpZXJlc2lzPTc3OCxlLm11PTYxMSxlLmlncmF2ZT0yNzgsZS5vaHVuZ2FydW1sYXV0PTYxMSxlLkVvZ29uZWs9NjY3LGUuZGNyb2F0PTYxMSxlLnRocmVlcXVhcnRlcnM9ODM0LGUuU2NlZGlsbGE9NjY3LGUubGNhcm9uPTQwMCxlLktjb21tYWFjY2VudD03MjIsZS5MYWN1dGU9NjExLGUudHJhZGVtYXJrPTFlMyxlLmVkb3RhY2NlbnQ9NTU2LGUuSWdyYXZlPTI3OCxlLkltYWNyb249Mjc4LGUuTGNhcm9uPTYxMSxlLm9uZWhhbGY9ODM0LGUubGVzc2VxdWFsPTU0OSxlLm9jaXJjdW1mbGV4PTYxMSxlLm50aWxkZT02MTEsZS5VaHVuZ2FydW1sYXV0PTcyMixlLkVhY3V0ZT02NjcsZS5lbWFjcm9uPTU1NixlLmdicmV2ZT02MTEsZS5vbmVxdWFydGVyPTgzNCxlLlNjYXJvbj02NjcsZS5TY29tbWFhY2NlbnQ9NjY3LGUuT2h1bmdhcnVtbGF1dD03NzgsZS5kZWdyZWU9NDAwLGUub2dyYXZlPTYxMSxlLkNjYXJvbj03MjIsZS51Z3JhdmU9NjExLGUucmFkaWNhbD01NDksZS5EY2Fyb249NzIyLGUucmNvbW1hYWNjZW50PTM4OSxlLk50aWxkZT03MjIsZS5vdGlsZGU9NjExLGUuUmNvbW1hYWNjZW50PTcyMixlLkxjb21tYWFjY2VudD02MTEsZS5BdGlsZGU9NzIyLGUuQW9nb25laz03MjIsZS5BcmluZz03MjIsZS5PdGlsZGU9Nzc4LGUuemRvdGFjY2VudD01MDAsZS5FY2Fyb249NjY3LGUuSW9nb25laz0yNzgsZS5rY29tbWFhY2NlbnQ9NTU2LGUubWludXM9NTg0LGUuSWNpcmN1bWZsZXg9Mjc4LGUubmNhcm9uPTYxMSxlLnRjb21tYWFjY2VudD0zMzMsZS5sb2dpY2Fsbm90PTU4NCxlLm9kaWVyZXNpcz02MTEsZS51ZGllcmVzaXM9NjExLGUubm90ZXF1YWw9NTQ5LGUuZ2NvbW1hYWNjZW50PTYxMSxlLmV0aD02MTEsZS56Y2Fyb249NTAwLGUubmNvbW1hYWNjZW50PTYxMSxlLm9uZXN1cGVyaW9yPTMzMyxlLmltYWNyb249Mjc4LGUuRXVybz01NTZ9KSksZVsiSGVsdmV0aWNhLU9ibGlxdWUiXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9Mjc4LGUuZXhjbGFtPTI3OCxlLnF1b3RlZGJsPTM1NSxlLm51bWJlcnNpZ249NTU2LGUuZG9sbGFyPTU1NixlLnBlcmNlbnQ9ODg5LGUuYW1wZXJzYW5kPTY2NyxlLnF1b3RlcmlnaHQ9MjIyLGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9Mzg5LGUucGx1cz01ODQsZS5jb21tYT0yNzgsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI3OCxlLnNsYXNoPTI3OCxlLnplcm89NTU2LGUub25lPTU1NixlLnR3bz01NTYsZS50aHJlZT01NTYsZS5mb3VyPTU1NixlLmZpdmU9NTU2LGUuc2l4PTU1NixlLnNldmVuPTU1NixlLmVpZ2h0PTU1NixlLm5pbmU9NTU2LGUuY29sb249Mjc4LGUuc2VtaWNvbG9uPTI3OCxlLmxlc3M9NTg0LGUuZXF1YWw9NTg0LGUuZ3JlYXRlcj01ODQsZS5xdWVzdGlvbj01NTYsZS5hdD0xMDE1LGUuQT02NjcsZS5CPTY2NyxlLkM9NzIyLGUuRD03MjIsZS5FPTY2NyxlLkY9NjExLGUuRz03NzgsZS5IPTcyMixlLkk9Mjc4LGUuSj01MDAsZS5LPTY2NyxlLkw9NTU2LGUuTT04MzMsZS5OPTcyMixlLk89Nzc4LGUuUD02NjcsZS5RPTc3OCxlLlI9NzIyLGUuUz02NjcsZS5UPTYxMSxlLlU9NzIyLGUuVj02NjcsZS5XPTk0NCxlLlg9NjY3LGUuWT02NjcsZS5aPTYxMSxlLmJyYWNrZXRsZWZ0PTI3OCxlLmJhY2tzbGFzaD0yNzgsZS5icmFja2V0cmlnaHQ9Mjc4LGUuYXNjaWljaXJjdW09NDY5LGUudW5kZXJzY29yZT01NTYsZS5xdW90ZWxlZnQ9MjIyLGUuYT01NTYsZS5iPTU1NixlLmM9NTAwLGUuZD01NTYsZS5lPTU1NixlLmY9Mjc4LGUuZz01NTYsZS5oPTU1NixlLmk9MjIyLGUuaj0yMjIsZS5rPTUwMCxlLmw9MjIyLGUubT04MzMsZS5uPTU1NixlLm89NTU2LGUucD01NTYsZS5xPTU1NixlLnI9MzMzLGUucz01MDAsZS50PTI3OCxlLnU9NTU2LGUudj01MDAsZS53PTcyMixlLng9NTAwLGUueT01MDAsZS56PTUwMCxlLmJyYWNlbGVmdD0zMzQsZS5iYXI9MjYwLGUuYnJhY2VyaWdodD0zMzQsZS5hc2NpaXRpbGRlPTU4NCxlLmV4Y2xhbWRvd249MzMzLGUuY2VudD01NTYsZS5zdGVybGluZz01NTYsZS5mcmFjdGlvbj0xNjcsZS55ZW49NTU2LGUuZmxvcmluPTU1NixlLnNlY3Rpb249NTU2LGUuY3VycmVuY3k9NTU2LGUucXVvdGVzaW5nbGU9MTkxLGUucXVvdGVkYmxsZWZ0PTMzMyxlLmd1aWxsZW1vdGxlZnQ9NTU2LGUuZ3VpbHNpbmdsbGVmdD0zMzMsZS5ndWlsc2luZ2xyaWdodD0zMzMsZS5maT01MDAsZS5mbD01MDAsZS5lbmRhc2g9NTU2LGUuZGFnZ2VyPTU1NixlLmRhZ2dlcmRibD01NTYsZS5wZXJpb2RjZW50ZXJlZD0yNzgsZS5wYXJhZ3JhcGg9NTM3LGUuYnVsbGV0PTM1MCxlLnF1b3Rlc2luZ2xiYXNlPTIyMixlLnF1b3RlZGJsYmFzZT0zMzMsZS5xdW90ZWRibHJpZ2h0PTMzMyxlLmd1aWxsZW1vdHJpZ2h0PTU1NixlLmVsbGlwc2lzPTFlMyxlLnBlcnRob3VzYW5kPTFlMyxlLnF1ZXN0aW9uZG93bj02MTEsZS5ncmF2ZT0zMzMsZS5hY3V0ZT0zMzMsZS5jaXJjdW1mbGV4PTMzMyxlLnRpbGRlPTMzMyxlLm1hY3Jvbj0zMzMsZS5icmV2ZT0zMzMsZS5kb3RhY2NlbnQ9MzMzLGUuZGllcmVzaXM9MzMzLGUucmluZz0zMzMsZS5jZWRpbGxhPTMzMyxlLmh1bmdhcnVtbGF1dD0zMzMsZS5vZ29uZWs9MzMzLGUuY2Fyb249MzMzLGUuZW1kYXNoPTFlMyxlLkFFPTFlMyxlLm9yZGZlbWluaW5lPTM3MCxlLkxzbGFzaD01NTYsZS5Pc2xhc2g9Nzc4LGUuT0U9MWUzLGUub3JkbWFzY3VsaW5lPTM2NSxlLmFlPTg4OSxlLmRvdGxlc3NpPTI3OCxlLmxzbGFzaD0yMjIsZS5vc2xhc2g9NjExLGUub2U9OTQ0LGUuZ2VybWFuZGJscz02MTEsZS5JZGllcmVzaXM9Mjc4LGUuZWFjdXRlPTU1NixlLmFicmV2ZT01NTYsZS51aHVuZ2FydW1sYXV0PTU1NixlLmVjYXJvbj01NTYsZS5ZZGllcmVzaXM9NjY3LGUuZGl2aWRlPTU4NCxlLllhY3V0ZT02NjcsZS5BY2lyY3VtZmxleD02NjcsZS5hYWN1dGU9NTU2LGUuVWNpcmN1bWZsZXg9NzIyLGUueWFjdXRlPTUwMCxlLnNjb21tYWFjY2VudD01MDAsZS5lY2lyY3VtZmxleD01NTYsZS5VcmluZz03MjIsZS5VZGllcmVzaXM9NzIyLGUuYW9nb25laz01NTYsZS5VYWN1dGU9NzIyLGUudW9nb25laz01NTYsZS5FZGllcmVzaXM9NjY3LGUuRGNyb2F0PTcyMixlLmNvbW1hYWNjZW50PTI1MCxlLmNvcHlyaWdodD03MzcsZS5FbWFjcm9uPTY2NyxlLmNjYXJvbj01MDAsZS5hcmluZz01NTYsZS5OY29tbWFhY2NlbnQ9NzIyLGUubGFjdXRlPTIyMixlLmFncmF2ZT01NTYsZS5UY29tbWFhY2NlbnQ9NjExLGUuQ2FjdXRlPTcyMixlLmF0aWxkZT01NTYsZS5FZG90YWNjZW50PTY2NyxlLnNjYXJvbj01MDAsZS5zY2VkaWxsYT01MDAsZS5pYWN1dGU9Mjc4LGUubG96ZW5nZT00NzEsZS5SY2Fyb249NzIyLGUuR2NvbW1hYWNjZW50PTc3OCxlLnVjaXJjdW1mbGV4PTU1NixlLmFjaXJjdW1mbGV4PTU1NixlLkFtYWNyb249NjY3LGUucmNhcm9uPTMzMyxlLmNjZWRpbGxhPTUwMCxlLlpkb3RhY2NlbnQ9NjExLGUuVGhvcm49NjY3LGUuT21hY3Jvbj03NzgsZS5SYWN1dGU9NzIyLGUuU2FjdXRlPTY2NyxlLmRjYXJvbj02NDMsZS5VbWFjcm9uPTcyMixlLnVyaW5nPTU1NixlLnRocmVlc3VwZXJpb3I9MzMzLGUuT2dyYXZlPTc3OCxlLkFncmF2ZT02NjcsZS5BYnJldmU9NjY3LGUubXVsdGlwbHk9NTg0LGUudWFjdXRlPTU1NixlLlRjYXJvbj02MTEsZS5wYXJ0aWFsZGlmZj00NzYsZS55ZGllcmVzaXM9NTAwLGUuTmFjdXRlPTcyMixlLmljaXJjdW1mbGV4PTI3OCxlLkVjaXJjdW1mbGV4PTY2NyxlLmFkaWVyZXNpcz01NTYsZS5lZGllcmVzaXM9NTU2LGUuY2FjdXRlPTUwMCxlLm5hY3V0ZT01NTYsZS51bWFjcm9uPTU1NixlLk5jYXJvbj03MjIsZS5JYWN1dGU9Mjc4LGUucGx1c21pbnVzPTU4NCxlLmJyb2tlbmJhcj0yNjAsZS5yZWdpc3RlcmVkPTczNyxlLkdicmV2ZT03NzgsZS5JZG90YWNjZW50PTI3OCxlLnN1bW1hdGlvbj02MDAsZS5FZ3JhdmU9NjY3LGUucmFjdXRlPTMzMyxlLm9tYWNyb249NTU2LGUuWmFjdXRlPTYxMSxlLlpjYXJvbj02MTEsZS5ncmVhdGVyZXF1YWw9NTQ5LGUuRXRoPTcyMixlLkNjZWRpbGxhPTcyMixlLmxjb21tYWFjY2VudD0yMjIsZS50Y2Fyb249MzE3LGUuZW9nb25laz01NTYsZS5Vb2dvbmVrPTcyMixlLkFhY3V0ZT02NjcsZS5BZGllcmVzaXM9NjY3LGUuZWdyYXZlPTU1NixlLnphY3V0ZT01MDAsZS5pb2dvbmVrPTIyMixlLk9hY3V0ZT03NzgsZS5vYWN1dGU9NTU2LGUuYW1hY3Jvbj01NTYsZS5zYWN1dGU9NTAwLGUuaWRpZXJlc2lzPTI3OCxlLk9jaXJjdW1mbGV4PTc3OCxlLlVncmF2ZT03MjIsZS5EZWx0YT02MTIsZS50aG9ybj01NTYsZS50d29zdXBlcmlvcj0zMzMsZS5PZGllcmVzaXM9Nzc4LGUubXU9NTU2LGUuaWdyYXZlPTI3OCxlLm9odW5nYXJ1bWxhdXQ9NTU2LGUuRW9nb25laz02NjcsZS5kY3JvYXQ9NTU2LGUudGhyZWVxdWFydGVycz04MzQsZS5TY2VkaWxsYT02NjcsZS5sY2Fyb249Mjk5LGUuS2NvbW1hYWNjZW50PTY2NyxlLkxhY3V0ZT01NTYsZS50cmFkZW1hcms9MWUzLGUuZWRvdGFjY2VudD01NTYsZS5JZ3JhdmU9Mjc4LGUuSW1hY3Jvbj0yNzgsZS5MY2Fyb249NTU2LGUub25laGFsZj04MzQsZS5sZXNzZXF1YWw9NTQ5LGUub2NpcmN1bWZsZXg9NTU2LGUubnRpbGRlPTU1NixlLlVodW5nYXJ1bWxhdXQ9NzIyLGUuRWFjdXRlPTY2NyxlLmVtYWNyb249NTU2LGUuZ2JyZXZlPTU1NixlLm9uZXF1YXJ0ZXI9ODM0LGUuU2Nhcm9uPTY2NyxlLlNjb21tYWFjY2VudD02NjcsZS5PaHVuZ2FydW1sYXV0PTc3OCxlLmRlZ3JlZT00MDAsZS5vZ3JhdmU9NTU2LGUuQ2Nhcm9uPTcyMixlLnVncmF2ZT01NTYsZS5yYWRpY2FsPTQ1MyxlLkRjYXJvbj03MjIsZS5yY29tbWFhY2NlbnQ9MzMzLGUuTnRpbGRlPTcyMixlLm90aWxkZT01NTYsZS5SY29tbWFhY2NlbnQ9NzIyLGUuTGNvbW1hYWNjZW50PTU1NixlLkF0aWxkZT02NjcsZS5Bb2dvbmVrPTY2NyxlLkFyaW5nPTY2NyxlLk90aWxkZT03NzgsZS56ZG90YWNjZW50PTUwMCxlLkVjYXJvbj02NjcsZS5Jb2dvbmVrPTI3OCxlLmtjb21tYWFjY2VudD01MDAsZS5taW51cz01ODQsZS5JY2lyY3VtZmxleD0yNzgsZS5uY2Fyb249NTU2LGUudGNvbW1hYWNjZW50PTI3OCxlLmxvZ2ljYWxub3Q9NTg0LGUub2RpZXJlc2lzPTU1NixlLnVkaWVyZXNpcz01NTYsZS5ub3RlcXVhbD01NDksZS5nY29tbWFhY2NlbnQ9NTU2LGUuZXRoPTU1NixlLnpjYXJvbj01MDAsZS5uY29tbWFhY2NlbnQ9NTU2LGUub25lc3VwZXJpb3I9MzMzLGUuaW1hY3Jvbj0yNzgsZS5FdXJvPTU1Nn0pKSxlLlN5bWJvbD0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwLGUuZXhjbGFtPTMzMyxlLnVuaXZlcnNhbD03MTMsZS5udW1iZXJzaWduPTUwMCxlLmV4aXN0ZW50aWFsPTU0OSxlLnBlcmNlbnQ9ODMzLGUuYW1wZXJzYW5kPTc3OCxlLnN1Y2h0aGF0PTQzOSxlLnBhcmVubGVmdD0zMzMsZS5wYXJlbnJpZ2h0PTMzMyxlLmFzdGVyaXNrbWF0aD01MDAsZS5wbHVzPTU0OSxlLmNvbW1hPTI1MCxlLm1pbnVzPTU0OSxlLnBlcmlvZD0yNTAsZS5zbGFzaD0yNzgsZS56ZXJvPTUwMCxlLm9uZT01MDAsZS50d289NTAwLGUudGhyZWU9NTAwLGUuZm91cj01MDAsZS5maXZlPTUwMCxlLnNpeD01MDAsZS5zZXZlbj01MDAsZS5laWdodD01MDAsZS5uaW5lPTUwMCxlLmNvbG9uPTI3OCxlLnNlbWljb2xvbj0yNzgsZS5sZXNzPTU0OSxlLmVxdWFsPTU0OSxlLmdyZWF0ZXI9NTQ5LGUucXVlc3Rpb249NDQ0LGUuY29uZ3J1ZW50PTU0OSxlLkFscGhhPTcyMixlLkJldGE9NjY3LGUuQ2hpPTcyMixlLkRlbHRhPTYxMixlLkVwc2lsb249NjExLGUuUGhpPTc2MyxlLkdhbW1hPTYwMyxlLkV0YT03MjIsZS5Jb3RhPTMzMyxlLnRoZXRhMT02MzEsZS5LYXBwYT03MjIsZS5MYW1iZGE9Njg2LGUuTXU9ODg5LGUuTnU9NzIyLGUuT21pY3Jvbj03MjIsZS5QaT03NjgsZS5UaGV0YT03NDEsZS5SaG89NTU2LGUuU2lnbWE9NTkyLGUuVGF1PTYxMSxlLlVwc2lsb249NjkwLGUuc2lnbWExPTQzOSxlLk9tZWdhPTc2OCxlLlhpPTY0NSxlLlBzaT03OTUsZS5aZXRhPTYxMSxlLmJyYWNrZXRsZWZ0PTMzMyxlLnRoZXJlZm9yZT04NjMsZS5icmFja2V0cmlnaHQ9MzMzLGUucGVycGVuZGljdWxhcj02NTgsZS51bmRlcnNjb3JlPTUwMCxlLnJhZGljYWxleD01MDAsZS5hbHBoYT02MzEsZS5iZXRhPTU0OSxlLmNoaT01NDksZS5kZWx0YT00OTQsZS5lcHNpbG9uPTQzOSxlLnBoaT01MjEsZS5nYW1tYT00MTEsZS5ldGE9NjAzLGUuaW90YT0zMjksZS5waGkxPTYwMyxlLmthcHBhPTU0OSxlLmxhbWJkYT01NDksZS5tdT01NzYsZS5udT01MjEsZS5vbWljcm9uPTU0OSxlLnBpPTU0OSxlLnRoZXRhPTUyMSxlLnJobz01NDksZS5zaWdtYT02MDMsZS50YXU9NDM5LGUudXBzaWxvbj01NzYsZS5vbWVnYTE9NzEzLGUub21lZ2E9Njg2LGUueGk9NDkzLGUucHNpPTY4NixlLnpldGE9NDk0LGUuYnJhY2VsZWZ0PTQ4MCxlLmJhcj0yMDAsZS5icmFjZXJpZ2h0PTQ4MCxlLnNpbWlsYXI9NTQ5LGUuRXVybz03NTAsZS5VcHNpbG9uMT02MjAsZS5taW51dGU9MjQ3LGUubGVzc2VxdWFsPTU0OSxlLmZyYWN0aW9uPTE2NyxlLmluZmluaXR5PTcxMyxlLmZsb3Jpbj01MDAsZS5jbHViPTc1MyxlLmRpYW1vbmQ9NzUzLGUuaGVhcnQ9NzUzLGUuc3BhZGU9NzUzLGUuYXJyb3dib3RoPTEwNDIsZS5hcnJvd2xlZnQ9OTg3LGUuYXJyb3d1cD02MDMsZS5hcnJvd3JpZ2h0PTk4NyxlLmFycm93ZG93bj02MDMsZS5kZWdyZWU9NDAwLGUucGx1c21pbnVzPTU0OSxlLnNlY29uZD00MTEsZS5ncmVhdGVyZXF1YWw9NTQ5LGUubXVsdGlwbHk9NTQ5LGUucHJvcG9ydGlvbmFsPTcxMyxlLnBhcnRpYWxkaWZmPTQ5NCxlLmJ1bGxldD00NjAsZS5kaXZpZGU9NTQ5LGUubm90ZXF1YWw9NTQ5LGUuZXF1aXZhbGVuY2U9NTQ5LGUuYXBwcm94ZXF1YWw9NTQ5LGUuZWxsaXBzaXM9MWUzLGUuYXJyb3d2ZXJ0ZXg9NjAzLGUuYXJyb3dob3JpemV4PTFlMyxlLmNhcnJpYWdlcmV0dXJuPTY1OCxlLmFsZXBoPTgyMyxlLklmcmFrdHVyPTY4NixlLlJmcmFrdHVyPTc5NSxlLndlaWVyc3RyYXNzPTk4NyxlLmNpcmNsZW11bHRpcGx5PTc2OCxlLmNpcmNsZXBsdXM9NzY4LGUuZW1wdHlzZXQ9ODIzLGUuaW50ZXJzZWN0aW9uPTc2OCxlLnVuaW9uPTc2OCxlLnByb3BlcnN1cGVyc2V0PTcxMyxlLnJlZmxleHN1cGVyc2V0PTcxMyxlLm5vdHN1YnNldD03MTMsZS5wcm9wZXJzdWJzZXQ9NzEzLGUucmVmbGV4c3Vic2V0PTcxMyxlLmVsZW1lbnQ9NzEzLGUubm90ZWxlbWVudD03MTMsZS5hbmdsZT03NjgsZS5ncmFkaWVudD03MTMsZS5yZWdpc3RlcnNlcmlmPTc5MCxlLmNvcHlyaWdodHNlcmlmPTc5MCxlLnRyYWRlbWFya3NlcmlmPTg5MCxlLnByb2R1Y3Q9ODIzLGUucmFkaWNhbD01NDksZS5kb3RtYXRoPTI1MCxlLmxvZ2ljYWxub3Q9NzEzLGUubG9naWNhbGFuZD02MDMsZS5sb2dpY2Fsb3I9NjAzLGUuYXJyb3dkYmxib3RoPTEwNDIsZS5hcnJvd2RibGxlZnQ9OTg3LGUuYXJyb3dkYmx1cD02MDMsZS5hcnJvd2RibHJpZ2h0PTk4NyxlLmFycm93ZGJsZG93bj02MDMsZS5sb3plbmdlPTQ5NCxlLmFuZ2xlbGVmdD0zMjksZS5yZWdpc3RlcnNhbnM9NzkwLGUuY29weXJpZ2h0c2Fucz03OTAsZS50cmFkZW1hcmtzYW5zPTc4NixlLnN1bW1hdGlvbj03MTMsZS5wYXJlbmxlZnR0cD0zODQsZS5wYXJlbmxlZnRleD0zODQsZS5wYXJlbmxlZnRidD0zODQsZS5icmFja2V0bGVmdHRwPTM4NCxlLmJyYWNrZXRsZWZ0ZXg9Mzg0LGUuYnJhY2tldGxlZnRidD0zODQsZS5icmFjZWxlZnR0cD00OTQsZS5icmFjZWxlZnRtaWQ9NDk0LGUuYnJhY2VsZWZ0YnQ9NDk0LGUuYnJhY2VleD00OTQsZS5hbmdsZXJpZ2h0PTMyOSxlLmludGVncmFsPTI3NCxlLmludGVncmFsdHA9Njg2LGUuaW50ZWdyYWxleD02ODYsZS5pbnRlZ3JhbGJ0PTY4NixlLnBhcmVucmlnaHR0cD0zODQsZS5wYXJlbnJpZ2h0ZXg9Mzg0LGUucGFyZW5yaWdodGJ0PTM4NCxlLmJyYWNrZXRyaWdodHRwPTM4NCxlLmJyYWNrZXRyaWdodGV4PTM4NCxlLmJyYWNrZXRyaWdodGJ0PTM4NCxlLmJyYWNlcmlnaHR0cD00OTQsZS5icmFjZXJpZ2h0bWlkPTQ5NCxlLmJyYWNlcmlnaHRidD00OTQsZS5hcHBsZT03OTB9KSksZVsiVGltZXMtUm9tYW4iXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwLGUuZXhjbGFtPTMzMyxlLnF1b3RlZGJsPTQwOCxlLm51bWJlcnNpZ249NTAwLGUuZG9sbGFyPTUwMCxlLnBlcmNlbnQ9ODMzLGUuYW1wZXJzYW5kPTc3OCxlLnF1b3RlcmlnaHQ9MzMzLGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9NTAwLGUucGx1cz01NjQsZS5jb21tYT0yNTAsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI1MCxlLnNsYXNoPTI3OCxlLnplcm89NTAwLGUub25lPTUwMCxlLnR3bz01MDAsZS50aHJlZT01MDAsZS5mb3VyPTUwMCxlLmZpdmU9NTAwLGUuc2l4PTUwMCxlLnNldmVuPTUwMCxlLmVpZ2h0PTUwMCxlLm5pbmU9NTAwLGUuY29sb249Mjc4LGUuc2VtaWNvbG9uPTI3OCxlLmxlc3M9NTY0LGUuZXF1YWw9NTY0LGUuZ3JlYXRlcj01NjQsZS5xdWVzdGlvbj00NDQsZS5hdD05MjEsZS5BPTcyMixlLkI9NjY3LGUuQz02NjcsZS5EPTcyMixlLkU9NjExLGUuRj01NTYsZS5HPTcyMixlLkg9NzIyLGUuST0zMzMsZS5KPTM4OSxlLks9NzIyLGUuTD02MTEsZS5NPTg4OSxlLk49NzIyLGUuTz03MjIsZS5QPTU1NixlLlE9NzIyLGUuUj02NjcsZS5TPTU1NixlLlQ9NjExLGUuVT03MjIsZS5WPTcyMixlLlc9OTQ0LGUuWD03MjIsZS5ZPTcyMixlLlo9NjExLGUuYnJhY2tldGxlZnQ9MzMzLGUuYmFja3NsYXNoPTI3OCxlLmJyYWNrZXRyaWdodD0zMzMsZS5hc2NpaWNpcmN1bT00NjksZS51bmRlcnNjb3JlPTUwMCxlLnF1b3RlbGVmdD0zMzMsZS5hPTQ0NCxlLmI9NTAwLGUuYz00NDQsZS5kPTUwMCxlLmU9NDQ0LGUuZj0zMzMsZS5nPTUwMCxlLmg9NTAwLGUuaT0yNzgsZS5qPTI3OCxlLms9NTAwLGUubD0yNzgsZS5tPTc3OCxlLm49NTAwLGUubz01MDAsZS5wPTUwMCxlLnE9NTAwLGUucj0zMzMsZS5zPTM4OSxlLnQ9Mjc4LGUudT01MDAsZS52PTUwMCxlLnc9NzIyLGUueD01MDAsZS55PTUwMCxlLno9NDQ0LGUuYnJhY2VsZWZ0PTQ4MCxlLmJhcj0yMDAsZS5icmFjZXJpZ2h0PTQ4MCxlLmFzY2lpdGlsZGU9NTQxLGUuZXhjbGFtZG93bj0zMzMsZS5jZW50PTUwMCxlLnN0ZXJsaW5nPTUwMCxlLmZyYWN0aW9uPTE2NyxlLnllbj01MDAsZS5mbG9yaW49NTAwLGUuc2VjdGlvbj01MDAsZS5jdXJyZW5jeT01MDAsZS5xdW90ZXNpbmdsZT0xODAsZS5xdW90ZWRibGxlZnQ9NDQ0LGUuZ3VpbGxlbW90bGVmdD01MDAsZS5ndWlsc2luZ2xsZWZ0PTMzMyxlLmd1aWxzaW5nbHJpZ2h0PTMzMyxlLmZpPTU1NixlLmZsPTU1NixlLmVuZGFzaD01MDAsZS5kYWdnZXI9NTAwLGUuZGFnZ2VyZGJsPTUwMCxlLnBlcmlvZGNlbnRlcmVkPTI1MCxlLnBhcmFncmFwaD00NTMsZS5idWxsZXQ9MzUwLGUucXVvdGVzaW5nbGJhc2U9MzMzLGUucXVvdGVkYmxiYXNlPTQ0NCxlLnF1b3RlZGJscmlnaHQ9NDQ0LGUuZ3VpbGxlbW90cmlnaHQ9NTAwLGUuZWxsaXBzaXM9MWUzLGUucGVydGhvdXNhbmQ9MWUzLGUucXVlc3Rpb25kb3duPTQ0NCxlLmdyYXZlPTMzMyxlLmFjdXRlPTMzMyxlLmNpcmN1bWZsZXg9MzMzLGUudGlsZGU9MzMzLGUubWFjcm9uPTMzMyxlLmJyZXZlPTMzMyxlLmRvdGFjY2VudD0zMzMsZS5kaWVyZXNpcz0zMzMsZS5yaW5nPTMzMyxlLmNlZGlsbGE9MzMzLGUuaHVuZ2FydW1sYXV0PTMzMyxlLm9nb25laz0zMzMsZS5jYXJvbj0zMzMsZS5lbWRhc2g9MWUzLGUuQUU9ODg5LGUub3JkZmVtaW5pbmU9Mjc2LGUuTHNsYXNoPTYxMSxlLk9zbGFzaD03MjIsZS5PRT04ODksZS5vcmRtYXNjdWxpbmU9MzEwLGUuYWU9NjY3LGUuZG90bGVzc2k9Mjc4LGUubHNsYXNoPTI3OCxlLm9zbGFzaD01MDAsZS5vZT03MjIsZS5nZXJtYW5kYmxzPTUwMCxlLklkaWVyZXNpcz0zMzMsZS5lYWN1dGU9NDQ0LGUuYWJyZXZlPTQ0NCxlLnVodW5nYXJ1bWxhdXQ9NTAwLGUuZWNhcm9uPTQ0NCxlLllkaWVyZXNpcz03MjIsZS5kaXZpZGU9NTY0LGUuWWFjdXRlPTcyMixlLkFjaXJjdW1mbGV4PTcyMixlLmFhY3V0ZT00NDQsZS5VY2lyY3VtZmxleD03MjIsZS55YWN1dGU9NTAwLGUuc2NvbW1hYWNjZW50PTM4OSxlLmVjaXJjdW1mbGV4PTQ0NCxlLlVyaW5nPTcyMixlLlVkaWVyZXNpcz03MjIsZS5hb2dvbmVrPTQ0NCxlLlVhY3V0ZT03MjIsZS51b2dvbmVrPTUwMCxlLkVkaWVyZXNpcz02MTEsZS5EY3JvYXQ9NzIyLGUuY29tbWFhY2NlbnQ9MjUwLGUuY29weXJpZ2h0PTc2MCxlLkVtYWNyb249NjExLGUuY2Nhcm9uPTQ0NCxlLmFyaW5nPTQ0NCxlLk5jb21tYWFjY2VudD03MjIsZS5sYWN1dGU9Mjc4LGUuYWdyYXZlPTQ0NCxlLlRjb21tYWFjY2VudD02MTEsZS5DYWN1dGU9NjY3LGUuYXRpbGRlPTQ0NCxlLkVkb3RhY2NlbnQ9NjExLGUuc2Nhcm9uPTM4OSxlLnNjZWRpbGxhPTM4OSxlLmlhY3V0ZT0yNzgsZS5sb3plbmdlPTQ3MSxlLlJjYXJvbj02NjcsZS5HY29tbWFhY2NlbnQ9NzIyLGUudWNpcmN1bWZsZXg9NTAwLGUuYWNpcmN1bWZsZXg9NDQ0LGUuQW1hY3Jvbj03MjIsZS5yY2Fyb249MzMzLGUuY2NlZGlsbGE9NDQ0LGUuWmRvdGFjY2VudD02MTEsZS5UaG9ybj01NTYsZS5PbWFjcm9uPTcyMixlLlJhY3V0ZT02NjcsZS5TYWN1dGU9NTU2LGUuZGNhcm9uPTU4OCxlLlVtYWNyb249NzIyLGUudXJpbmc9NTAwLGUudGhyZWVzdXBlcmlvcj0zMDAsZS5PZ3JhdmU9NzIyLGUuQWdyYXZlPTcyMixlLkFicmV2ZT03MjIsZS5tdWx0aXBseT01NjQsZS51YWN1dGU9NTAwLGUuVGNhcm9uPTYxMSxlLnBhcnRpYWxkaWZmPTQ3NixlLnlkaWVyZXNpcz01MDAsZS5OYWN1dGU9NzIyLGUuaWNpcmN1bWZsZXg9Mjc4LGUuRWNpcmN1bWZsZXg9NjExLGUuYWRpZXJlc2lzPTQ0NCxlLmVkaWVyZXNpcz00NDQsZS5jYWN1dGU9NDQ0LGUubmFjdXRlPTUwMCxlLnVtYWNyb249NTAwLGUuTmNhcm9uPTcyMixlLklhY3V0ZT0zMzMsZS5wbHVzbWludXM9NTY0LGUuYnJva2VuYmFyPTIwMCxlLnJlZ2lzdGVyZWQ9NzYwLGUuR2JyZXZlPTcyMixlLklkb3RhY2NlbnQ9MzMzLGUuc3VtbWF0aW9uPTYwMCxlLkVncmF2ZT02MTEsZS5yYWN1dGU9MzMzLGUub21hY3Jvbj01MDAsZS5aYWN1dGU9NjExLGUuWmNhcm9uPTYxMSxlLmdyZWF0ZXJlcXVhbD01NDksZS5FdGg9NzIyLGUuQ2NlZGlsbGE9NjY3LGUubGNvbW1hYWNjZW50PTI3OCxlLnRjYXJvbj0zMjYsZS5lb2dvbmVrPTQ0NCxlLlVvZ29uZWs9NzIyLGUuQWFjdXRlPTcyMixlLkFkaWVyZXNpcz03MjIsZS5lZ3JhdmU9NDQ0LGUuemFjdXRlPTQ0NCxlLmlvZ29uZWs9Mjc4LGUuT2FjdXRlPTcyMixlLm9hY3V0ZT01MDAsZS5hbWFjcm9uPTQ0NCxlLnNhY3V0ZT0zODksZS5pZGllcmVzaXM9Mjc4LGUuT2NpcmN1bWZsZXg9NzIyLGUuVWdyYXZlPTcyMixlLkRlbHRhPTYxMixlLnRob3JuPTUwMCxlLnR3b3N1cGVyaW9yPTMwMCxlLk9kaWVyZXNpcz03MjIsZS5tdT01MDAsZS5pZ3JhdmU9Mjc4LGUub2h1bmdhcnVtbGF1dD01MDAsZS5Fb2dvbmVrPTYxMSxlLmRjcm9hdD01MDAsZS50aHJlZXF1YXJ0ZXJzPTc1MCxlLlNjZWRpbGxhPTU1NixlLmxjYXJvbj0zNDQsZS5LY29tbWFhY2NlbnQ9NzIyLGUuTGFjdXRlPTYxMSxlLnRyYWRlbWFyaz05ODAsZS5lZG90YWNjZW50PTQ0NCxlLklncmF2ZT0zMzMsZS5JbWFjcm9uPTMzMyxlLkxjYXJvbj02MTEsZS5vbmVoYWxmPTc1MCxlLmxlc3NlcXVhbD01NDksZS5vY2lyY3VtZmxleD01MDAsZS5udGlsZGU9NTAwLGUuVWh1bmdhcnVtbGF1dD03MjIsZS5FYWN1dGU9NjExLGUuZW1hY3Jvbj00NDQsZS5nYnJldmU9NTAwLGUub25lcXVhcnRlcj03NTAsZS5TY2Fyb249NTU2LGUuU2NvbW1hYWNjZW50PTU1NixlLk9odW5nYXJ1bWxhdXQ9NzIyLGUuZGVncmVlPTQwMCxlLm9ncmF2ZT01MDAsZS5DY2Fyb249NjY3LGUudWdyYXZlPTUwMCxlLnJhZGljYWw9NDUzLGUuRGNhcm9uPTcyMixlLnJjb21tYWFjY2VudD0zMzMsZS5OdGlsZGU9NzIyLGUub3RpbGRlPTUwMCxlLlJjb21tYWFjY2VudD02NjcsZS5MY29tbWFhY2NlbnQ9NjExLGUuQXRpbGRlPTcyMixlLkFvZ29uZWs9NzIyLGUuQXJpbmc9NzIyLGUuT3RpbGRlPTcyMixlLnpkb3RhY2NlbnQ9NDQ0LGUuRWNhcm9uPTYxMSxlLklvZ29uZWs9MzMzLGUua2NvbW1hYWNjZW50PTUwMCxlLm1pbnVzPTU2NCxlLkljaXJjdW1mbGV4PTMzMyxlLm5jYXJvbj01MDAsZS50Y29tbWFhY2NlbnQ9Mjc4LGUubG9naWNhbG5vdD01NjQsZS5vZGllcmVzaXM9NTAwLGUudWRpZXJlc2lzPTUwMCxlLm5vdGVxdWFsPTU0OSxlLmdjb21tYWFjY2VudD01MDAsZS5ldGg9NTAwLGUuemNhcm9uPTQ0NCxlLm5jb21tYWFjY2VudD01MDAsZS5vbmVzdXBlcmlvcj0zMDAsZS5pbWFjcm9uPTI3OCxlLkV1cm89NTAwfSkpLGVbIlRpbWVzLUJvbGQiXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwLGUuZXhjbGFtPTMzMyxlLnF1b3RlZGJsPTU1NSxlLm51bWJlcnNpZ249NTAwLGUuZG9sbGFyPTUwMCxlLnBlcmNlbnQ9MWUzLGUuYW1wZXJzYW5kPTgzMyxlLnF1b3RlcmlnaHQ9MzMzLGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9NTAwLGUucGx1cz01NzAsZS5jb21tYT0yNTAsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI1MCxlLnNsYXNoPTI3OCxlLnplcm89NTAwLGUub25lPTUwMCxlLnR3bz01MDAsZS50aHJlZT01MDAsZS5mb3VyPTUwMCxlLmZpdmU9NTAwLGUuc2l4PTUwMCxlLnNldmVuPTUwMCxlLmVpZ2h0PTUwMCxlLm5pbmU9NTAwLGUuY29sb249MzMzLGUuc2VtaWNvbG9uPTMzMyxlLmxlc3M9NTcwLGUuZXF1YWw9NTcwLGUuZ3JlYXRlcj01NzAsZS5xdWVzdGlvbj01MDAsZS5hdD05MzAsZS5BPTcyMixlLkI9NjY3LGUuQz03MjIsZS5EPTcyMixlLkU9NjY3LGUuRj02MTEsZS5HPTc3OCxlLkg9Nzc4LGUuST0zODksZS5KPTUwMCxlLks9Nzc4LGUuTD02NjcsZS5NPTk0NCxlLk49NzIyLGUuTz03NzgsZS5QPTYxMSxlLlE9Nzc4LGUuUj03MjIsZS5TPTU1NixlLlQ9NjY3LGUuVT03MjIsZS5WPTcyMixlLlc9MWUzLGUuWD03MjIsZS5ZPTcyMixlLlo9NjY3LGUuYnJhY2tldGxlZnQ9MzMzLGUuYmFja3NsYXNoPTI3OCxlLmJyYWNrZXRyaWdodD0zMzMsZS5hc2NpaWNpcmN1bT01ODEsZS51bmRlcnNjb3JlPTUwMCxlLnF1b3RlbGVmdD0zMzMsZS5hPTUwMCxlLmI9NTU2LGUuYz00NDQsZS5kPTU1NixlLmU9NDQ0LGUuZj0zMzMsZS5nPTUwMCxlLmg9NTU2LGUuaT0yNzgsZS5qPTMzMyxlLms9NTU2LGUubD0yNzgsZS5tPTgzMyxlLm49NTU2LGUubz01MDAsZS5wPTU1NixlLnE9NTU2LGUucj00NDQsZS5zPTM4OSxlLnQ9MzMzLGUudT01NTYsZS52PTUwMCxlLnc9NzIyLGUueD01MDAsZS55PTUwMCxlLno9NDQ0LGUuYnJhY2VsZWZ0PTM5NCxlLmJhcj0yMjAsZS5icmFjZXJpZ2h0PTM5NCxlLmFzY2lpdGlsZGU9NTIwLGUuZXhjbGFtZG93bj0zMzMsZS5jZW50PTUwMCxlLnN0ZXJsaW5nPTUwMCxlLmZyYWN0aW9uPTE2NyxlLnllbj01MDAsZS5mbG9yaW49NTAwLGUuc2VjdGlvbj01MDAsZS5jdXJyZW5jeT01MDAsZS5xdW90ZXNpbmdsZT0yNzgsZS5xdW90ZWRibGxlZnQ9NTAwLGUuZ3VpbGxlbW90bGVmdD01MDAsZS5ndWlsc2luZ2xsZWZ0PTMzMyxlLmd1aWxzaW5nbHJpZ2h0PTMzMyxlLmZpPTU1NixlLmZsPTU1NixlLmVuZGFzaD01MDAsZS5kYWdnZXI9NTAwLGUuZGFnZ2VyZGJsPTUwMCxlLnBlcmlvZGNlbnRlcmVkPTI1MCxlLnBhcmFncmFwaD01NDAsZS5idWxsZXQ9MzUwLGUucXVvdGVzaW5nbGJhc2U9MzMzLGUucXVvdGVkYmxiYXNlPTUwMCxlLnF1b3RlZGJscmlnaHQ9NTAwLGUuZ3VpbGxlbW90cmlnaHQ9NTAwLGUuZWxsaXBzaXM9MWUzLGUucGVydGhvdXNhbmQ9MWUzLGUucXVlc3Rpb25kb3duPTUwMCxlLmdyYXZlPTMzMyxlLmFjdXRlPTMzMyxlLmNpcmN1bWZsZXg9MzMzLGUudGlsZGU9MzMzLGUubWFjcm9uPTMzMyxlLmJyZXZlPTMzMyxlLmRvdGFjY2VudD0zMzMsZS5kaWVyZXNpcz0zMzMsZS5yaW5nPTMzMyxlLmNlZGlsbGE9MzMzLGUuaHVuZ2FydW1sYXV0PTMzMyxlLm9nb25laz0zMzMsZS5jYXJvbj0zMzMsZS5lbWRhc2g9MWUzLGUuQUU9MWUzLGUub3JkZmVtaW5pbmU9MzAwLGUuTHNsYXNoPTY2NyxlLk9zbGFzaD03NzgsZS5PRT0xZTMsZS5vcmRtYXNjdWxpbmU9MzMwLGUuYWU9NzIyLGUuZG90bGVzc2k9Mjc4LGUubHNsYXNoPTI3OCxlLm9zbGFzaD01MDAsZS5vZT03MjIsZS5nZXJtYW5kYmxzPTU1NixlLklkaWVyZXNpcz0zODksZS5lYWN1dGU9NDQ0LGUuYWJyZXZlPTUwMCxlLnVodW5nYXJ1bWxhdXQ9NTU2LGUuZWNhcm9uPTQ0NCxlLllkaWVyZXNpcz03MjIsZS5kaXZpZGU9NTcwLGUuWWFjdXRlPTcyMixlLkFjaXJjdW1mbGV4PTcyMixlLmFhY3V0ZT01MDAsZS5VY2lyY3VtZmxleD03MjIsZS55YWN1dGU9NTAwLGUuc2NvbW1hYWNjZW50PTM4OSxlLmVjaXJjdW1mbGV4PTQ0NCxlLlVyaW5nPTcyMixlLlVkaWVyZXNpcz03MjIsZS5hb2dvbmVrPTUwMCxlLlVhY3V0ZT03MjIsZS51b2dvbmVrPTU1NixlLkVkaWVyZXNpcz02NjcsZS5EY3JvYXQ9NzIyLGUuY29tbWFhY2NlbnQ9MjUwLGUuY29weXJpZ2h0PTc0NyxlLkVtYWNyb249NjY3LGUuY2Nhcm9uPTQ0NCxlLmFyaW5nPTUwMCxlLk5jb21tYWFjY2VudD03MjIsZS5sYWN1dGU9Mjc4LGUuYWdyYXZlPTUwMCxlLlRjb21tYWFjY2VudD02NjcsZS5DYWN1dGU9NzIyLGUuYXRpbGRlPTUwMCxlLkVkb3RhY2NlbnQ9NjY3LGUuc2Nhcm9uPTM4OSxlLnNjZWRpbGxhPTM4OSxlLmlhY3V0ZT0yNzgsZS5sb3plbmdlPTQ5NCxlLlJjYXJvbj03MjIsZS5HY29tbWFhY2NlbnQ9Nzc4LGUudWNpcmN1bWZsZXg9NTU2LGUuYWNpcmN1bWZsZXg9NTAwLGUuQW1hY3Jvbj03MjIsZS5yY2Fyb249NDQ0LGUuY2NlZGlsbGE9NDQ0LGUuWmRvdGFjY2VudD02NjcsZS5UaG9ybj02MTEsZS5PbWFjcm9uPTc3OCxlLlJhY3V0ZT03MjIsZS5TYWN1dGU9NTU2LGUuZGNhcm9uPTY3MixlLlVtYWNyb249NzIyLGUudXJpbmc9NTU2LGUudGhyZWVzdXBlcmlvcj0zMDAsZS5PZ3JhdmU9Nzc4LGUuQWdyYXZlPTcyMixlLkFicmV2ZT03MjIsZS5tdWx0aXBseT01NzAsZS51YWN1dGU9NTU2LGUuVGNhcm9uPTY2NyxlLnBhcnRpYWxkaWZmPTQ5NCxlLnlkaWVyZXNpcz01MDAsZS5OYWN1dGU9NzIyLGUuaWNpcmN1bWZsZXg9Mjc4LGUuRWNpcmN1bWZsZXg9NjY3LGUuYWRpZXJlc2lzPTUwMCxlLmVkaWVyZXNpcz00NDQsZS5jYWN1dGU9NDQ0LGUubmFjdXRlPTU1NixlLnVtYWNyb249NTU2LGUuTmNhcm9uPTcyMixlLklhY3V0ZT0zODksZS5wbHVzbWludXM9NTcwLGUuYnJva2VuYmFyPTIyMCxlLnJlZ2lzdGVyZWQ9NzQ3LGUuR2JyZXZlPTc3OCxlLklkb3RhY2NlbnQ9Mzg5LGUuc3VtbWF0aW9uPTYwMCxlLkVncmF2ZT02NjcsZS5yYWN1dGU9NDQ0LGUub21hY3Jvbj01MDAsZS5aYWN1dGU9NjY3LGUuWmNhcm9uPTY2NyxlLmdyZWF0ZXJlcXVhbD01NDksZS5FdGg9NzIyLGUuQ2NlZGlsbGE9NzIyLGUubGNvbW1hYWNjZW50PTI3OCxlLnRjYXJvbj00MTYsZS5lb2dvbmVrPTQ0NCxlLlVvZ29uZWs9NzIyLGUuQWFjdXRlPTcyMixlLkFkaWVyZXNpcz03MjIsZS5lZ3JhdmU9NDQ0LGUuemFjdXRlPTQ0NCxlLmlvZ29uZWs9Mjc4LGUuT2FjdXRlPTc3OCxlLm9hY3V0ZT01MDAsZS5hbWFjcm9uPTUwMCxlLnNhY3V0ZT0zODksZS5pZGllcmVzaXM9Mjc4LGUuT2NpcmN1bWZsZXg9Nzc4LGUuVWdyYXZlPTcyMixlLkRlbHRhPTYxMixlLnRob3JuPTU1NixlLnR3b3N1cGVyaW9yPTMwMCxlLk9kaWVyZXNpcz03NzgsZS5tdT01NTYsZS5pZ3JhdmU9Mjc4LGUub2h1bmdhcnVtbGF1dD01MDAsZS5Fb2dvbmVrPTY2NyxlLmRjcm9hdD01NTYsZS50aHJlZXF1YXJ0ZXJzPTc1MCxlLlNjZWRpbGxhPTU1NixlLmxjYXJvbj0zOTQsZS5LY29tbWFhY2NlbnQ9Nzc4LGUuTGFjdXRlPTY2NyxlLnRyYWRlbWFyaz0xZTMsZS5lZG90YWNjZW50PTQ0NCxlLklncmF2ZT0zODksZS5JbWFjcm9uPTM4OSxlLkxjYXJvbj02NjcsZS5vbmVoYWxmPTc1MCxlLmxlc3NlcXVhbD01NDksZS5vY2lyY3VtZmxleD01MDAsZS5udGlsZGU9NTU2LGUuVWh1bmdhcnVtbGF1dD03MjIsZS5FYWN1dGU9NjY3LGUuZW1hY3Jvbj00NDQsZS5nYnJldmU9NTAwLGUub25lcXVhcnRlcj03NTAsZS5TY2Fyb249NTU2LGUuU2NvbW1hYWNjZW50PTU1NixlLk9odW5nYXJ1bWxhdXQ9Nzc4LGUuZGVncmVlPTQwMCxlLm9ncmF2ZT01MDAsZS5DY2Fyb249NzIyLGUudWdyYXZlPTU1NixlLnJhZGljYWw9NTQ5LGUuRGNhcm9uPTcyMixlLnJjb21tYWFjY2VudD00NDQsZS5OdGlsZGU9NzIyLGUub3RpbGRlPTUwMCxlLlJjb21tYWFjY2VudD03MjIsZS5MY29tbWFhY2NlbnQ9NjY3LGUuQXRpbGRlPTcyMixlLkFvZ29uZWs9NzIyLGUuQXJpbmc9NzIyLGUuT3RpbGRlPTc3OCxlLnpkb3RhY2NlbnQ9NDQ0LGUuRWNhcm9uPTY2NyxlLklvZ29uZWs9Mzg5LGUua2NvbW1hYWNjZW50PTU1NixlLm1pbnVzPTU3MCxlLkljaXJjdW1mbGV4PTM4OSxlLm5jYXJvbj01NTYsZS50Y29tbWFhY2NlbnQ9MzMzLGUubG9naWNhbG5vdD01NzAsZS5vZGllcmVzaXM9NTAwLGUudWRpZXJlc2lzPTU1NixlLm5vdGVxdWFsPTU0OSxlLmdjb21tYWFjY2VudD01MDAsZS5ldGg9NTAwLGUuemNhcm9uPTQ0NCxlLm5jb21tYWFjY2VudD01NTYsZS5vbmVzdXBlcmlvcj0zMDAsZS5pbWFjcm9uPTI3OCxlLkV1cm89NTAwfSkpLGVbIlRpbWVzLUJvbGRJdGFsaWMiXT0oMCxuLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoKGZ1bmN0aW9uKGUpe2Uuc3BhY2U9MjUwLGUuZXhjbGFtPTM4OSxlLnF1b3RlZGJsPTU1NSxlLm51bWJlcnNpZ249NTAwLGUuZG9sbGFyPTUwMCxlLnBlcmNlbnQ9ODMzLGUuYW1wZXJzYW5kPTc3OCxlLnF1b3RlcmlnaHQ9MzMzLGUucGFyZW5sZWZ0PTMzMyxlLnBhcmVucmlnaHQ9MzMzLGUuYXN0ZXJpc2s9NTAwLGUucGx1cz01NzAsZS5jb21tYT0yNTAsZS5oeXBoZW49MzMzLGUucGVyaW9kPTI1MCxlLnNsYXNoPTI3OCxlLnplcm89NTAwLGUub25lPTUwMCxlLnR3bz01MDAsZS50aHJlZT01MDAsZS5mb3VyPTUwMCxlLmZpdmU9NTAwLGUuc2l4PTUwMCxlLnNldmVuPTUwMCxlLmVpZ2h0PTUwMCxlLm5pbmU9NTAwLGUuY29sb249MzMzLGUuc2VtaWNvbG9uPTMzMyxlLmxlc3M9NTcwLGUuZXF1YWw9NTcwLGUuZ3JlYXRlcj01NzAsZS5xdWVzdGlvbj01MDAsZS5hdD04MzIsZS5BPTY2NyxlLkI9NjY3LGUuQz02NjcsZS5EPTcyMixlLkU9NjY3LGUuRj02NjcsZS5HPTcyMixlLkg9Nzc4LGUuST0zODksZS5KPTUwMCxlLks9NjY3LGUuTD02MTEsZS5NPTg4OSxlLk49NzIyLGUuTz03MjIsZS5QPTYxMSxlLlE9NzIyLGUuUj02NjcsZS5TPTU1NixlLlQ9NjExLGUuVT03MjIsZS5WPTY2NyxlLlc9ODg5LGUuWD02NjcsZS5ZPTYxMSxlLlo9NjExLGUuYnJhY2tldGxlZnQ9MzMzLGUuYmFja3NsYXNoPTI3OCxlLmJyYWNrZXRyaWdodD0zMzMsZS5hc2NpaWNpcmN1bT01NzAsZS51bmRlcnNjb3JlPTUwMCxlLnF1b3RlbGVmdD0zMzMsZS5hPTUwMCxlLmI9NTAwLGUuYz00NDQsZS5kPTUwMCxlLmU9NDQ0LGUuZj0zMzMsZS5nPTUwMCxlLmg9NTU2LGUuaT0yNzgsZS5qPTI3OCxlLms9NTAwLGUubD0yNzgsZS5tPTc3OCxlLm49NTU2LGUubz01MDAsZS5wPTUwMCxlLnE9NTAwLGUucj0zODksZS5zPTM4OSxlLnQ9Mjc4LGUudT01NTYsZS52PTQ0NCxlLnc9NjY3LGUueD01MDAsZS55PTQ0NCxlLno9Mzg5LGUuYnJhY2VsZWZ0PTM0OCxlLmJhcj0yMjAsZS5icmFjZXJpZ2h0PTM0OCxlLmFzY2lpdGlsZGU9NTcwLGUuZXhjbGFtZG93bj0zODksZS5jZW50PTUwMCxlLnN0ZXJsaW5nPTUwMCxlLmZyYWN0aW9uPTE2NyxlLnllbj01MDAsZS5mbG9yaW49NTAwLGUuc2VjdGlvbj01MDAsZS5jdXJyZW5jeT01MDAsZS5xdW90ZXNpbmdsZT0yNzgsZS5xdW90ZWRibGxlZnQ9NTAwLGUuZ3VpbGxlbW90bGVmdD01MDAsZS5ndWlsc2luZ2xsZWZ0PTMzMyxlLmd1aWxzaW5nbHJpZ2h0PTMzMyxlLmZpPTU1NixlLmZsPTU1NixlLmVuZGFzaD01MDAsZS5kYWdnZXI9NTAwLGUuZGFnZ2VyZGJsPTUwMCxlLnBlcmlvZGNlbnRlcmVkPTI1MCxlLnBhcmFncmFwaD01MDAsZS5idWxsZXQ9MzUwLGUucXVvdGVzaW5nbGJhc2U9MzMzLGUucXVvdGVkYmxiYXNlPTUwMCxlLnF1b3RlZGJscmlnaHQ9NTAwLGUuZ3VpbGxlbW90cmlnaHQ9NTAwLGUuZWxsaXBzaXM9MWUzLGUucGVydGhvdXNhbmQ9MWUzLGUucXVlc3Rpb25kb3duPTUwMCxlLmdyYXZlPTMzMyxlLmFjdXRlPTMzMyxlLmNpcmN1bWZsZXg9MzMzLGUudGlsZGU9MzMzLGUubWFjcm9uPTMzMyxlLmJyZXZlPTMzMyxlLmRvdGFjY2VudD0zMzMsZS5kaWVyZXNpcz0zMzMsZS5yaW5nPTMzMyxlLmNlZGlsbGE9MzMzLGUuaHVuZ2FydW1sYXV0PTMzMyxlLm9nb25laz0zMzMsZS5jYXJvbj0zMzMsZS5lbWRhc2g9MWUzLGUuQUU9OTQ0LGUub3JkZmVtaW5pbmU9MjY2LGUuTHNsYXNoPTYxMSxlLk9zbGFzaD03MjIsZS5PRT05NDQsZS5vcmRtYXNjdWxpbmU9MzAwLGUuYWU9NzIyLGUuZG90bGVzc2k9Mjc4LGUubHNsYXNoPTI3OCxlLm9zbGFzaD01MDAsZS5vZT03MjIsZS5nZXJtYW5kYmxzPTUwMCxlLklkaWVyZXNpcz0zODksZS5lYWN1dGU9NDQ0LGUuYWJyZXZlPTUwMCxlLnVodW5nYXJ1bWxhdXQ9NTU2LGUuZWNhcm9uPTQ0NCxlLllkaWVyZXNpcz02MTEsZS5kaXZpZGU9NTcwLGUuWWFjdXRlPTYxMSxlLkFjaXJjdW1mbGV4PTY2NyxlLmFhY3V0ZT01MDAsZS5VY2lyY3VtZmxleD03MjIsZS55YWN1dGU9NDQ0LGUuc2NvbW1hYWNjZW50PTM4OSxlLmVjaXJjdW1mbGV4PTQ0NCxlLlVyaW5nPTcyMixlLlVkaWVyZXNpcz03MjIsZS5hb2dvbmVrPTUwMCxlLlVhY3V0ZT03MjIsZS51b2dvbmVrPTU1NixlLkVkaWVyZXNpcz02NjcsZS5EY3JvYXQ9NzIyLGUuY29tbWFhY2NlbnQ9MjUwLGUuY29weXJpZ2h0PTc0NyxlLkVtYWNyb249NjY3LGUuY2Nhcm9uPTQ0NCxlLmFyaW5nPTUwMCxlLk5jb21tYWFjY2VudD03MjIsZS5sYWN1dGU9Mjc4LGUuYWdyYXZlPTUwMCxlLlRjb21tYWFjY2VudD02MTEsZS5DYWN1dGU9NjY3LGUuYXRpbGRlPTUwMCxlLkVkb3RhY2NlbnQ9NjY3LGUuc2Nhcm9uPTM4OSxlLnNjZWRpbGxhPTM4OSxlLmlhY3V0ZT0yNzgsZS5sb3plbmdlPTQ5NCxlLlJjYXJvbj02NjcsZS5HY29tbWFhY2NlbnQ9NzIyLGUudWNpcmN1bWZsZXg9NTU2LGUuYWNpcmN1bWZsZXg9NTAwLGUuQW1hY3Jvbj02NjcsZS5yY2Fyb249Mzg5LGUuY2NlZGlsbGE9NDQ0LGUuWmRvdGFjY2VudD02MTEsZS5UaG9ybj02MTEsZS5PbWFjcm9uPTcyMixlLlJhY3V0ZT02NjcsZS5TYWN1dGU9NTU2LGUuZGNhcm9uPTYwOCxlLlVtYWNyb249NzIyLGUudXJpbmc9NTU2LGUudGhyZWVzdXBlcmlvcj0zMDAsZS5PZ3JhdmU9NzIyLGUuQWdyYXZlPTY2NyxlLkFicmV2ZT02NjcsZS5tdWx0aXBseT01NzAsZS51YWN1dGU9NTU2LGUuVGNhcm9uPTYxMSxlLnBhcnRpYWxkaWZmPTQ5NCxlLnlkaWVyZXNpcz00NDQsZS5OYWN1dGU9NzIyLGUuaWNpcmN1bWZsZXg9Mjc4LGUuRWNpcmN1bWZsZXg9NjY3LGUuYWRpZXJlc2lzPTUwMCxlLmVkaWVyZXNpcz00NDQsZS5jYWN1dGU9NDQ0LGUubmFjdXRlPTU1NixlLnVtYWNyb249NTU2LGUuTmNhcm9uPTcyMixlLklhY3V0ZT0zODksZS5wbHVzbWludXM9NTcwLGUuYnJva2VuYmFyPTIyMCxlLnJlZ2lzdGVyZWQ9NzQ3LGUuR2JyZXZlPTcyMixlLklkb3RhY2NlbnQ9Mzg5LGUuc3VtbWF0aW9uPTYwMCxlLkVncmF2ZT02NjcsZS5yYWN1dGU9Mzg5LGUub21hY3Jvbj01MDAsZS5aYWN1dGU9NjExLGUuWmNhcm9uPTYxMSxlLmdyZWF0ZXJlcXVhbD01NDksZS5FdGg9NzIyLGUuQ2NlZGlsbGE9NjY3LGUubGNvbW1hYWNjZW50PTI3OCxlLnRjYXJvbj0zNjYsZS5lb2dvbmVrPTQ0NCxlLlVvZ29uZWs9NzIyLGUuQWFjdXRlPTY2NyxlLkFkaWVyZXNpcz02NjcsZS5lZ3JhdmU9NDQ0LGUuemFjdXRlPTM4OSxlLmlvZ29uZWs9Mjc4LGUuT2FjdXRlPTcyMixlLm9hY3V0ZT01MDAsZS5hbWFjcm9uPTUwMCxlLnNhY3V0ZT0zODksZS5pZGllcmVzaXM9Mjc4LGUuT2NpcmN1bWZsZXg9NzIyLGUuVWdyYXZlPTcyMixlLkRlbHRhPTYxMixlLnRob3JuPTUwMCxlLnR3b3N1cGVyaW9yPTMwMCxlLk9kaWVyZXNpcz03MjIsZS5tdT01NzYsZS5pZ3JhdmU9Mjc4LGUub2h1bmdhcnVtbGF1dD01MDAsZS5Fb2dvbmVrPTY2NyxlLmRjcm9hdD01MDAsZS50aHJlZXF1YXJ0ZXJzPTc1MCxlLlNjZWRpbGxhPTU1NixlLmxjYXJvbj0zODIsZS5LY29tbWFhY2NlbnQ9NjY3LGUuTGFjdXRlPTYxMSxlLnRyYWRlbWFyaz0xZTMsZS5lZG90YWNjZW50PTQ0NCxlLklncmF2ZT0zODksZS5JbWFjcm9uPTM4OSxlLkxjYXJvbj02MTEsZS5vbmVoYWxmPTc1MCxlLmxlc3NlcXVhbD01NDksZS5vY2lyY3VtZmxleD01MDAsZS5udGlsZGU9NTU2LGUuVWh1bmdhcnVtbGF1dD03MjIsZS5FYWN1dGU9NjY3LGUuZW1hY3Jvbj00NDQsZS5nYnJldmU9NTAwLGUub25lcXVhcnRlcj03NTAsZS5TY2Fyb249NTU2LGUuU2NvbW1hYWNjZW50PTU1NixlLk9odW5nYXJ1bWxhdXQ9NzIyLGUuZGVncmVlPTQwMCxlLm9ncmF2ZT01MDAsZS5DY2Fyb249NjY3LGUudWdyYXZlPTU1NixlLnJhZGljYWw9NTQ5LGUuRGNhcm9uPTcyMixlLnJjb21tYWFjY2VudD0zODksZS5OdGlsZGU9NzIyLGUub3RpbGRlPTUwMCxlLlJjb21tYWFjY2VudD02NjcsZS5MY29tbWFhY2NlbnQ9NjExLGUuQXRpbGRlPTY2NyxlLkFvZ29uZWs9NjY3LGUuQXJpbmc9NjY3LGUuT3RpbGRlPTcyMixlLnpkb3RhY2NlbnQ9Mzg5LGUuRWNhcm9uPTY2NyxlLklvZ29uZWs9Mzg5LGUua2NvbW1hYWNjZW50PTUwMCxlLm1pbnVzPTYwNixlLkljaXJjdW1mbGV4PTM4OSxlLm5jYXJvbj01NTYsZS50Y29tbWFhY2NlbnQ9Mjc4LGUubG9naWNhbG5vdD02MDYsZS5vZGllcmVzaXM9NTAwLGUudWRpZXJlc2lzPTU1NixlLm5vdGVxdWFsPTU0OSxlLmdjb21tYWFjY2VudD01MDAsZS5ldGg9NTAwLGUuemNhcm9uPTM4OSxlLm5jb21tYWFjY2VudD01NTYsZS5vbmVzdXBlcmlvcj0zMDAsZS5pbWFjcm9uPTI3OCxlLkV1cm89NTAwfSkpLGVbIlRpbWVzLUl0YWxpYyJdPSgwLG4uZ2V0TG9va3VwVGFibGVGYWN0b3J5KSgoZnVuY3Rpb24oZSl7ZS5zcGFjZT0yNTAsZS5leGNsYW09MzMzLGUucXVvdGVkYmw9NDIwLGUubnVtYmVyc2lnbj01MDAsZS5kb2xsYXI9NTAwLGUucGVyY2VudD04MzMsZS5hbXBlcnNhbmQ9Nzc4LGUucXVvdGVyaWdodD0zMzMsZS5wYXJlbmxlZnQ9MzMzLGUucGFyZW5yaWdodD0zMzMsZS5hc3Rlcmlzaz01MDAsZS5wbHVzPTY3NSxlLmNvbW1hPTI1MCxlLmh5cGhlbj0zMzMsZS5wZXJpb2Q9MjUwLGUuc2xhc2g9Mjc4LGUuemVybz01MDAsZS5vbmU9NTAwLGUudHdvPTUwMCxlLnRocmVlPTUwMCxlLmZvdXI9NTAwLGUuZml2ZT01MDAsZS5zaXg9NTAwLGUuc2V2ZW49NTAwLGUuZWlnaHQ9NTAwLGUubmluZT01MDAsZS5jb2xvbj0zMzMsZS5zZW1pY29sb249MzMzLGUubGVzcz02NzUsZS5lcXVhbD02NzUsZS5ncmVhdGVyPTY3NSxlLnF1ZXN0aW9uPTUwMCxlLmF0PTkyMCxlLkE9NjExLGUuQj02MTEsZS5DPTY2NyxlLkQ9NzIyLGUuRT02MTEsZS5GPTYxMSxlLkc9NzIyLGUuSD03MjIsZS5JPTMzMyxlLko9NDQ0LGUuSz02NjcsZS5MPTU1NixlLk09ODMzLGUuTj02NjcsZS5PPTcyMixlLlA9NjExLGUuUT03MjIsZS5SPTYxMSxlLlM9NTAwLGUuVD01NTYsZS5VPTcyMixlLlY9NjExLGUuVz04MzMsZS5YPTYxMSxlLlk9NTU2LGUuWj01NTYsZS5icmFja2V0bGVmdD0zODksZS5iYWNrc2xhc2g9Mjc4LGUuYnJhY2tldHJpZ2h0PTM4OSxlLmFzY2lpY2lyY3VtPTQyMixlLnVuZGVyc2NvcmU9NTAwLGUucXVvdGVsZWZ0PTMzMyxlLmE9NTAwLGUuYj01MDAsZS5jPTQ0NCxlLmQ9NTAwLGUuZT00NDQsZS5mPTI3OCxlLmc9NTAwLGUuaD01MDAsZS5pPTI3OCxlLmo9Mjc4LGUuaz00NDQsZS5sPTI3OCxlLm09NzIyLGUubj01MDAsZS5vPTUwMCxlLnA9NTAwLGUucT01MDAsZS5yPTM4OSxlLnM9Mzg5LGUudD0yNzgsZS51PTUwMCxlLnY9NDQ0LGUudz02NjcsZS54PTQ0NCxlLnk9NDQ0LGUuej0zODksZS5icmFjZWxlZnQ9NDAwLGUuYmFyPTI3NSxlLmJyYWNlcmlnaHQ9NDAwLGUuYXNjaWl0aWxkZT01NDEsZS5leGNsYW1kb3duPTM4OSxlLmNlbnQ9NTAwLGUuc3Rlcmxpbmc9NTAwLGUuZnJhY3Rpb249MTY3LGUueWVuPTUwMCxlLmZsb3Jpbj01MDAsZS5zZWN0aW9uPTUwMCxlLmN1cnJlbmN5PTUwMCxlLnF1b3Rlc2luZ2xlPTIxNCxlLnF1b3RlZGJsbGVmdD01NTYsZS5ndWlsbGVtb3RsZWZ0PTUwMCxlLmd1aWxzaW5nbGxlZnQ9MzMzLGUuZ3VpbHNpbmdscmlnaHQ9MzMzLGUuZmk9NTAwLGUuZmw9NTAwLGUuZW5kYXNoPTUwMCxlLmRhZ2dlcj01MDAsZS5kYWdnZXJkYmw9NTAwLGUucGVyaW9kY2VudGVyZWQ9MjUwLGUucGFyYWdyYXBoPTUyMyxlLmJ1bGxldD0zNTAsZS5xdW90ZXNpbmdsYmFzZT0zMzMsZS5xdW90ZWRibGJhc2U9NTU2LGUucXVvdGVkYmxyaWdodD01NTYsZS5ndWlsbGVtb3RyaWdodD01MDAsZS5lbGxpcHNpcz04ODksZS5wZXJ0aG91c2FuZD0xZTMsZS5xdWVzdGlvbmRvd249NTAwLGUuZ3JhdmU9MzMzLGUuYWN1dGU9MzMzLGUuY2lyY3VtZmxleD0zMzMsZS50aWxkZT0zMzMsZS5tYWNyb249MzMzLGUuYnJldmU9MzMzLGUuZG90YWNjZW50PTMzMyxlLmRpZXJlc2lzPTMzMyxlLnJpbmc9MzMzLGUuY2VkaWxsYT0zMzMsZS5odW5nYXJ1bWxhdXQ9MzMzLGUub2dvbmVrPTMzMyxlLmNhcm9uPTMzMyxlLmVtZGFzaD04ODksZS5BRT04ODksZS5vcmRmZW1pbmluZT0yNzYsZS5Mc2xhc2g9NTU2LGUuT3NsYXNoPTcyMixlLk9FPTk0NCxlLm9yZG1hc2N1bGluZT0zMTAsZS5hZT02NjcsZS5kb3RsZXNzaT0yNzgsZS5sc2xhc2g9Mjc4LGUub3NsYXNoPTUwMCxlLm9lPTY2NyxlLmdlcm1hbmRibHM9NTAwLGUuSWRpZXJlc2lzPTMzMyxlLmVhY3V0ZT00NDQsZS5hYnJldmU9NTAwLGUudWh1bmdhcnVtbGF1dD01MDAsZS5lY2Fyb249NDQ0LGUuWWRpZXJlc2lzPTU1NixlLmRpdmlkZT02NzUsZS5ZYWN1dGU9NTU2LGUuQWNpcmN1bWZsZXg9NjExLGUuYWFjdXRlPTUwMCxlLlVjaXJjdW1mbGV4PTcyMixlLnlhY3V0ZT00NDQsZS5zY29tbWFhY2NlbnQ9Mzg5LGUuZWNpcmN1bWZsZXg9NDQ0LGUuVXJpbmc9NzIyLGUuVWRpZXJlc2lzPTcyMixlLmFvZ29uZWs9NTAwLGUuVWFjdXRlPTcyMixlLnVvZ29uZWs9NTAwLGUuRWRpZXJlc2lzPTYxMSxlLkRjcm9hdD03MjIsZS5jb21tYWFjY2VudD0yNTAsZS5jb3B5cmlnaHQ9NzYwLGUuRW1hY3Jvbj02MTEsZS5jY2Fyb249NDQ0LGUuYXJpbmc9NTAwLGUuTmNvbW1hYWNjZW50PTY2NyxlLmxhY3V0ZT0yNzgsZS5hZ3JhdmU9NTAwLGUuVGNvbW1hYWNjZW50PTU1NixlLkNhY3V0ZT02NjcsZS5hdGlsZGU9NTAwLGUuRWRvdGFjY2VudD02MTEsZS5zY2Fyb249Mzg5LGUuc2NlZGlsbGE9Mzg5LGUuaWFjdXRlPTI3OCxlLmxvemVuZ2U9NDcxLGUuUmNhcm9uPTYxMSxlLkdjb21tYWFjY2VudD03MjIsZS51Y2lyY3VtZmxleD01MDAsZS5hY2lyY3VtZmxleD01MDAsZS5BbWFjcm9uPTYxMSxlLnJjYXJvbj0zODksZS5jY2VkaWxsYT00NDQsZS5aZG90YWNjZW50PTU1NixlLlRob3JuPTYxMSxlLk9tYWNyb249NzIyLGUuUmFjdXRlPTYxMSxlLlNhY3V0ZT01MDAsZS5kY2Fyb249NTQ0LGUuVW1hY3Jvbj03MjIsZS51cmluZz01MDAsZS50aHJlZXN1cGVyaW9yPTMwMCxlLk9ncmF2ZT03MjIsZS5BZ3JhdmU9NjExLGUuQWJyZXZlPTYxMSxlLm11bHRpcGx5PTY3NSxlLnVhY3V0ZT01MDAsZS5UY2Fyb249NTU2LGUucGFydGlhbGRpZmY9NDc2LGUueWRpZXJlc2lzPTQ0NCxlLk5hY3V0ZT02NjcsZS5pY2lyY3VtZmxleD0yNzgsZS5FY2lyY3VtZmxleD02MTEsZS5hZGllcmVzaXM9NTAwLGUuZWRpZXJlc2lzPTQ0NCxlLmNhY3V0ZT00NDQsZS5uYWN1dGU9NTAwLGUudW1hY3Jvbj01MDAsZS5OY2Fyb249NjY3LGUuSWFjdXRlPTMzMyxlLnBsdXNtaW51cz02NzUsZS5icm9rZW5iYXI9Mjc1LGUucmVnaXN0ZXJlZD03NjAsZS5HYnJldmU9NzIyLGUuSWRvdGFjY2VudD0zMzMsZS5zdW1tYXRpb249NjAwLGUuRWdyYXZlPTYxMSxlLnJhY3V0ZT0zODksZS5vbWFjcm9uPTUwMCxlLlphY3V0ZT01NTYsZS5aY2Fyb249NTU2LGUuZ3JlYXRlcmVxdWFsPTU0OSxlLkV0aD03MjIsZS5DY2VkaWxsYT02NjcsZS5sY29tbWFhY2NlbnQ9Mjc4LGUudGNhcm9uPTMwMCxlLmVvZ29uZWs9NDQ0LGUuVW9nb25laz03MjIsZS5BYWN1dGU9NjExLGUuQWRpZXJlc2lzPTYxMSxlLmVncmF2ZT00NDQsZS56YWN1dGU9Mzg5LGUuaW9nb25laz0yNzgsZS5PYWN1dGU9NzIyLGUub2FjdXRlPTUwMCxlLmFtYWNyb249NTAwLGUuc2FjdXRlPTM4OSxlLmlkaWVyZXNpcz0yNzgsZS5PY2lyY3VtZmxleD03MjIsZS5VZ3JhdmU9NzIyLGUuRGVsdGE9NjEyLGUudGhvcm49NTAwLGUudHdvc3VwZXJpb3I9MzAwLGUuT2RpZXJlc2lzPTcyMixlLm11PTUwMCxlLmlncmF2ZT0yNzgsZS5vaHVuZ2FydW1sYXV0PTUwMCxlLkVvZ29uZWs9NjExLGUuZGNyb2F0PTUwMCxlLnRocmVlcXVhcnRlcnM9NzUwLGUuU2NlZGlsbGE9NTAwLGUubGNhcm9uPTMwMCxlLktjb21tYWFjY2VudD02NjcsZS5MYWN1dGU9NTU2LGUudHJhZGVtYXJrPTk4MCxlLmVkb3RhY2NlbnQ9NDQ0LGUuSWdyYXZlPTMzMyxlLkltYWNyb249MzMzLGUuTGNhcm9uPTYxMSxlLm9uZWhhbGY9NzUwLGUubGVzc2VxdWFsPTU0OSxlLm9jaXJjdW1mbGV4PTUwMCxlLm50aWxkZT01MDAsZS5VaHVuZ2FydW1sYXV0PTcyMixlLkVhY3V0ZT02MTEsZS5lbWFjcm9uPTQ0NCxlLmdicmV2ZT01MDAsZS5vbmVxdWFydGVyPTc1MCxlLlNjYXJvbj01MDAsZS5TY29tbWFhY2NlbnQ9NTAwLGUuT2h1bmdhcnVtbGF1dD03MjIsZS5kZWdyZWU9NDAwLGUub2dyYXZlPTUwMCxlLkNjYXJvbj02NjcsZS51Z3JhdmU9NTAwLGUucmFkaWNhbD00NTMsZS5EY2Fyb249NzIyLGUucmNvbW1hYWNjZW50PTM4OSxlLk50aWxkZT02NjcsZS5vdGlsZGU9NTAwLGUuUmNvbW1hYWNjZW50PTYxMSxlLkxjb21tYWFjY2VudD01NTYsZS5BdGlsZGU9NjExLGUuQW9nb25laz02MTEsZS5BcmluZz02MTEsZS5PdGlsZGU9NzIyLGUuemRvdGFjY2VudD0zODksZS5FY2Fyb249NjExLGUuSW9nb25laz0zMzMsZS5rY29tbWFhY2NlbnQ9NDQ0LGUubWludXM9Njc1LGUuSWNpcmN1bWZsZXg9MzMzLGUubmNhcm9uPTUwMCxlLnRjb21tYWFjY2VudD0yNzgsZS5sb2dpY2Fsbm90PTY3NSxlLm9kaWVyZXNpcz01MDAsZS51ZGllcmVzaXM9NTAwLGUubm90ZXF1YWw9NTQ5LGUuZ2NvbW1hYWNjZW50PTUwMCxlLmV0aD01MDAsZS56Y2Fyb249Mzg5LGUubmNvbW1hYWNjZW50PTUwMCxlLm9uZXN1cGVyaW9yPTMwMCxlLmltYWNyb249Mjc4LGUuRXVybz01MDB9KSksZS5aYXBmRGluZ2JhdHM9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLnNwYWNlPTI3OCxlLmExPTk3NCxlLmEyPTk2MSxlLmEyMDI9OTc0LGUuYTM9OTgwLGUuYTQ9NzE5LGUuYTU9Nzg5LGUuYTExOT03OTAsZS5hMTE4PTc5MSxlLmExMTc9NjkwLGUuYTExPTk2MCxlLmExMj05MzksZS5hMTM9NTQ5LGUuYTE0PTg1NSxlLmExNT05MTEsZS5hMTY9OTMzLGUuYTEwNT05MTEsZS5hMTc9OTQ1LGUuYTE4PTk3NCxlLmExOT03NTUsZS5hMjA9ODQ2LGUuYTIxPTc2MixlLmEyMj03NjEsZS5hMjM9NTcxLGUuYTI0PTY3NyxlLmEyNT03NjMsZS5hMjY9NzYwLGUuYTI3PTc1OSxlLmEyOD03NTQsZS5hNj00OTQsZS5hNz01NTIsZS5hOD01MzcsZS5hOT01NzcsZS5hMTA9NjkyLGUuYTI5PTc4NixlLmEzMD03ODgsZS5hMzE9Nzg4LGUuYTMyPTc5MCxlLmEzMz03OTMsZS5hMzQ9Nzk0LGUuYTM1PTgxNixlLmEzNj04MjMsZS5hMzc9Nzg5LGUuYTM4PTg0MSxlLmEzOT04MjMsZS5hNDA9ODMzLGUuYTQxPTgxNixlLmE0Mj04MzEsZS5hNDM9OTIzLGUuYTQ0PTc0NCxlLmE0NT03MjMsZS5hNDY9NzQ5LGUuYTQ3PTc5MCxlLmE0OD03OTIsZS5hNDk9Njk1LGUuYTUwPTc3NixlLmE1MT03NjgsZS5hNTI9NzkyLGUuYTUzPTc1OSxlLmE1ND03MDcsZS5hNTU9NzA4LGUuYTU2PTY4MixlLmE1Nz03MDEsZS5hNTg9ODI2LGUuYTU5PTgxNSxlLmE2MD03ODksZS5hNjE9Nzg5LGUuYTYyPTcwNyxlLmE2Mz02ODcsZS5hNjQ9Njk2LGUuYTY1PTY4OSxlLmE2Nj03ODYsZS5hNjc9Nzg3LGUuYTY4PTcxMyxlLmE2OT03OTEsZS5hNzA9Nzg1LGUuYTcxPTc5MSxlLmE3Mj04NzMsZS5hNzM9NzYxLGUuYTc0PTc2MixlLmEyMDM9NzYyLGUuYTc1PTc1OSxlLmEyMDQ9NzU5LGUuYTc2PTg5MixlLmE3Nz04OTIsZS5hNzg9Nzg4LGUuYTc5PTc4NCxlLmE4MT00MzgsZS5hODI9MTM4LGUuYTgzPTI3NyxlLmE4ND00MTUsZS5hOTc9MzkyLGUuYTk4PTM5MixlLmE5OT02NjgsZS5hMTAwPTY2OCxlLmE4OT0zOTAsZS5hOTA9MzkwLGUuYTkzPTMxNyxlLmE5ND0zMTcsZS5hOTE9Mjc2LGUuYTkyPTI3NixlLmEyMDU9NTA5LGUuYTg1PTUwOSxlLmEyMDY9NDEwLGUuYTg2PTQxMCxlLmE4Nz0yMzQsZS5hODg9MjM0LGUuYTk1PTMzNCxlLmE5Nj0zMzQsZS5hMTAxPTczMixlLmExMDI9NTQ0LGUuYTEwMz01NDQsZS5hMTA0PTkxMCxlLmExMDY9NjY3LGUuYTEwNz03NjAsZS5hMTA4PTc2MCxlLmExMTI9Nzc2LGUuYTExMT01OTUsZS5hMTEwPTY5NCxlLmExMDk9NjI2LGUuYTEyMD03ODgsZS5hMTIxPTc4OCxlLmExMjI9Nzg4LGUuYTEyMz03ODgsZS5hMTI0PTc4OCxlLmExMjU9Nzg4LGUuYTEyNj03ODgsZS5hMTI3PTc4OCxlLmExMjg9Nzg4LGUuYTEyOT03ODgsZS5hMTMwPTc4OCxlLmExMzE9Nzg4LGUuYTEzMj03ODgsZS5hMTMzPTc4OCxlLmExMzQ9Nzg4LGUuYTEzNT03ODgsZS5hMTM2PTc4OCxlLmExMzc9Nzg4LGUuYTEzOD03ODgsZS5hMTM5PTc4OCxlLmExNDA9Nzg4LGUuYTE0MT03ODgsZS5hMTQyPTc4OCxlLmExNDM9Nzg4LGUuYTE0ND03ODgsZS5hMTQ1PTc4OCxlLmExNDY9Nzg4LGUuYTE0Nz03ODgsZS5hMTQ4PTc4OCxlLmExNDk9Nzg4LGUuYTE1MD03ODgsZS5hMTUxPTc4OCxlLmExNTI9Nzg4LGUuYTE1Mz03ODgsZS5hMTU0PTc4OCxlLmExNTU9Nzg4LGUuYTE1Nj03ODgsZS5hMTU3PTc4OCxlLmExNTg9Nzg4LGUuYTE1OT03ODgsZS5hMTYwPTg5NCxlLmExNjE9ODM4LGUuYTE2Mz0xMDE2LGUuYTE2ND00NTgsZS5hMTk2PTc0OCxlLmExNjU9OTI0LGUuYTE5Mj03NDgsZS5hMTY2PTkxOCxlLmExNjc9OTI3LGUuYTE2OD05MjgsZS5hMTY5PTkyOCxlLmExNzA9ODM0LGUuYTE3MT04NzMsZS5hMTcyPTgyOCxlLmExNzM9OTI0LGUuYTE2Mj05MjQsZS5hMTc0PTkxNyxlLmExNzU9OTMwLGUuYTE3Nj05MzEsZS5hMTc3PTQ2MyxlLmExNzg9ODgzLGUuYTE3OT04MzYsZS5hMTkzPTgzNixlLmExODA9ODY3LGUuYTE5OT04NjcsZS5hMTgxPTY5NixlLmEyMDA9Njk2LGUuYTE4Mj04NzQsZS5hMjAxPTg3NCxlLmExODM9NzYwLGUuYTE4ND05NDYsZS5hMTk3PTc3MSxlLmExODU9ODY1LGUuYTE5ND03NzEsZS5hMTk4PTg4OCxlLmExODY9OTY3LGUuYTE5NT04ODgsZS5hMTg3PTgzMSxlLmExODg9ODczLGUuYTE4OT05MjcsZS5hMTkwPTk3MCxlLmExOTE9OTE4fSkpfSkpO3QuZ2V0TWV0cmljcz1hO2NvbnN0IGk9KDAsbi5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlLkNvdXJpZXI9e2FzY2VudDo2MjksZGVzY2VudDotMTU3LGNhcEhlaWdodDo1NjIseEhlaWdodDotNDI2fSxlWyJDb3VyaWVyLUJvbGQiXT17YXNjZW50OjYyOSxkZXNjZW50Oi0xNTcsY2FwSGVpZ2h0OjU2Mix4SGVpZ2h0OjQzOX0sZVsiQ291cmllci1PYmxpcXVlIl09e2FzY2VudDo2MjksZGVzY2VudDotMTU3LGNhcEhlaWdodDo1NjIseEhlaWdodDo0MjZ9LGVbIkNvdXJpZXItQm9sZE9ibGlxdWUiXT17YXNjZW50OjYyOSxkZXNjZW50Oi0xNTcsY2FwSGVpZ2h0OjU2Mix4SGVpZ2h0OjQyNn0sZS5IZWx2ZXRpY2E9e2FzY2VudDo3MTgsZGVzY2VudDotMjA3LGNhcEhlaWdodDo3MTgseEhlaWdodDo1MjN9LGVbIkhlbHZldGljYS1Cb2xkIl09e2FzY2VudDo3MTgsZGVzY2VudDotMjA3LGNhcEhlaWdodDo3MTgseEhlaWdodDo1MzJ9LGVbIkhlbHZldGljYS1PYmxpcXVlIl09e2FzY2VudDo3MTgsZGVzY2VudDotMjA3LGNhcEhlaWdodDo3MTgseEhlaWdodDo1MjN9LGVbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdPXthc2NlbnQ6NzE4LGRlc2NlbnQ6LTIwNyxjYXBIZWlnaHQ6NzE4LHhIZWlnaHQ6NTMyfSxlWyJUaW1lcy1Sb21hbiJdPXthc2NlbnQ6NjgzLGRlc2NlbnQ6LTIxNyxjYXBIZWlnaHQ6NjYyLHhIZWlnaHQ6NDUwfSxlWyJUaW1lcy1Cb2xkIl09e2FzY2VudDo2ODMsZGVzY2VudDotMjE3LGNhcEhlaWdodDo2NzYseEhlaWdodDo0NjF9LGVbIlRpbWVzLUl0YWxpYyJdPXthc2NlbnQ6NjgzLGRlc2NlbnQ6LTIxNyxjYXBIZWlnaHQ6NjUzLHhIZWlnaHQ6NDQxfSxlWyJUaW1lcy1Cb2xkSXRhbGljIl09e2FzY2VudDo2ODMsZGVzY2VudDotMjE3LGNhcEhlaWdodDo2NjkseEhlaWdodDo0NjJ9LGUuU3ltYm9sPXthc2NlbnQ6TWF0aC5OYU4sZGVzY2VudDpNYXRoLk5hTixjYXBIZWlnaHQ6TWF0aC5OYU4seEhlaWdodDpNYXRoLk5hTn0sZS5aYXBmRGluZ2JhdHM9e2FzY2VudDpNYXRoLk5hTixkZXNjZW50Ok1hdGguTmFOLGNhcEhlaWdodDpNYXRoLk5hTix4SGVpZ2h0Ok1hdGguTmFOfX0pKTt0LmdldEZvbnRCYXNpY01ldHJpY3M9aX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkdseWZUYWJsZT12b2lkIDAscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDE1NyksdC5HbHlmVGFibGU9Y2xhc3N7Y29uc3RydWN0b3IoZSl7bGV0e2dseWZUYWJsZTp0LGlzR2x5cGhMb2NhdGlvbnNMb25nOnIsbG9jYVRhYmxlOmEsbnVtR2x5cGhzOml9PWU7dGhpcy5nbHlwaHM9W107Y29uc3Qgcz1uZXcgRGF0YVZpZXcoYS5idWZmZXIsYS5ieXRlT2Zmc2V0LGEuYnl0ZUxlbmd0aCksbz1uZXcgRGF0YVZpZXcodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCksYz1yPzQ6MjtsZXQgbD1yP3MuZ2V0VWludDMyKDApOjIqcy5nZXRVaW50MTYoMCksaD0wO2ZvcihsZXQgZT0wO2U8aTtlKyspe2grPWM7Y29uc3QgZT1yP3MuZ2V0VWludDMyKGgpOjIqcy5nZXRVaW50MTYoaCk7aWYoZT09PWwpe3RoaXMuZ2x5cGhzLnB1c2gobmV3IG4oe30pKTtjb250aW51ZX1jb25zdCB0PW4ucGFyc2UobCxvKTt0aGlzLmdseXBocy5wdXNoKHQpLGw9ZX19Z2V0U2l6ZSgpe3JldHVybiB0aGlzLmdseXBocy5yZWR1Y2UoKChlLHQpPT5lKyh0LmdldFNpemUoKSszJi00KSksMCl9d3JpdGUoKXtjb25zdCBlPXRoaXMuZ2V0U2l6ZSgpLHQ9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcihlKSkscj1lPjEzMTA3MCxuPXI/NDoyLGE9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigodGhpcy5nbHlwaHMubGVuZ3RoKzEpKm4pKTtyP2Euc2V0VWludDMyKDAsMCk6YS5zZXRVaW50MTYoMCwwKTtsZXQgaT0wLHM9MDtmb3IoY29uc3QgZSBvZiB0aGlzLmdseXBocylpKz1lLndyaXRlKGksdCksaT1pKzMmLTQscys9bixyP2Euc2V0VWludDMyKHMsaSk6YS5zZXRVaW50MTYocyxpPj4xKTtyZXR1cm57aXNMb2NhdGlvbkxvbmc6cixsb2NhOm5ldyBVaW50OEFycmF5KGEuYnVmZmVyKSxnbHlmOm5ldyBVaW50OEFycmF5KHQuYnVmZmVyKX19c2NhbGUoZSl7Zm9yKGxldCB0PTAscj10aGlzLmdseXBocy5sZW5ndGg7dDxyO3QrKyl0aGlzLmdseXBoc1t0XS5zY2FsZShlW3RdKX19O2NsYXNzIG57Y29uc3RydWN0b3IoZSl7bGV0e2hlYWRlcjp0PW51bGwsc2ltcGxlOnI9bnVsbCxjb21wb3NpdGVzOm49bnVsbH09ZTt0aGlzLmhlYWRlcj10LHRoaXMuc2ltcGxlPXIsdGhpcy5jb21wb3NpdGVzPW59c3RhdGljIHBhcnNlKGUsdCl7Y29uc3RbcixpXT1hLnBhcnNlKGUsdCk7aWYoZSs9cixpLm51bWJlck9mQ29udG91cnM8MCl7Y29uc3Qgcj1bXTtmb3IoOzspe2NvbnN0W24sYV09by5wYXJzZShlLHQpO2lmKGUrPW4sci5wdXNoKGEpLCEoMzImYS5mbGFncykpYnJlYWt9cmV0dXJuIG5ldyBuKHtoZWFkZXI6aSxjb21wb3NpdGVzOnJ9KX1jb25zdCBjPXMucGFyc2UoZSx0LGkubnVtYmVyT2ZDb250b3Vycyk7cmV0dXJuIG5ldyBuKHtoZWFkZXI6aSxzaW1wbGU6Y30pfWdldFNpemUoKXtpZighdGhpcy5oZWFkZXIpcmV0dXJuIDA7Y29uc3QgZT10aGlzLnNpbXBsZT90aGlzLnNpbXBsZS5nZXRTaXplKCk6dGhpcy5jb21wb3NpdGVzLnJlZHVjZSgoKGUsdCk9PmUrdC5nZXRTaXplKCkpLDApO3JldHVybiB0aGlzLmhlYWRlci5nZXRTaXplKCkrZX13cml0ZShlLHQpe2lmKCF0aGlzLmhlYWRlcilyZXR1cm4gMDtjb25zdCByPWU7aWYoZSs9dGhpcy5oZWFkZXIud3JpdGUoZSx0KSx0aGlzLnNpbXBsZSllKz10aGlzLnNpbXBsZS53cml0ZShlLHQpO2Vsc2UgZm9yKGNvbnN0IHIgb2YgdGhpcy5jb21wb3NpdGVzKWUrPXIud3JpdGUoZSx0KTtyZXR1cm4gZS1yfXNjYWxlKGUpe2lmKCF0aGlzLmhlYWRlcilyZXR1cm47Y29uc3QgdD0odGhpcy5oZWFkZXIueE1pbit0aGlzLmhlYWRlci54TWF4KS8yO2lmKHRoaXMuaGVhZGVyLnNjYWxlKHQsZSksdGhpcy5zaW1wbGUpdGhpcy5zaW1wbGUuc2NhbGUodCxlKTtlbHNlIGZvcihjb25zdCByIG9mIHRoaXMuY29tcG9zaXRlcylyLnNjYWxlKHQsZSl9fWNsYXNzIGF7Y29uc3RydWN0b3IoZSl7bGV0e251bWJlck9mQ29udG91cnM6dCx4TWluOnIseU1pbjpuLHhNYXg6YSx5TWF4Oml9PWU7dGhpcy5udW1iZXJPZkNvbnRvdXJzPXQsdGhpcy54TWluPXIsdGhpcy55TWluPW4sdGhpcy54TWF4PWEsdGhpcy55TWF4PWl9c3RhdGljIHBhcnNlKGUsdCl7cmV0dXJuWzEwLG5ldyBhKHtudW1iZXJPZkNvbnRvdXJzOnQuZ2V0SW50MTYoZSkseE1pbjp0LmdldEludDE2KGUrMikseU1pbjp0LmdldEludDE2KGUrNCkseE1heDp0LmdldEludDE2KGUrNikseU1heDp0LmdldEludDE2KGUrOCl9KV19Z2V0U2l6ZSgpe3JldHVybiAxMH13cml0ZShlLHQpe3JldHVybiB0LnNldEludDE2KGUsdGhpcy5udW1iZXJPZkNvbnRvdXJzKSx0LnNldEludDE2KGUrMix0aGlzLnhNaW4pLHQuc2V0SW50MTYoZSs0LHRoaXMueU1pbiksdC5zZXRJbnQxNihlKzYsdGhpcy54TWF4KSx0LnNldEludDE2KGUrOCx0aGlzLnlNYXgpLDEwfXNjYWxlKGUsdCl7dGhpcy54TWluPU1hdGgucm91bmQoZSsodGhpcy54TWluLWUpKnQpLHRoaXMueE1heD1NYXRoLnJvdW5kKGUrKHRoaXMueE1heC1lKSp0KX19Y2xhc3MgaXtjb25zdHJ1Y3RvcihlKXtsZXR7ZmxhZ3M6dCx4Q29vcmRpbmF0ZXM6cix5Q29vcmRpbmF0ZXM6bn09ZTt0aGlzLnhDb29yZGluYXRlcz1yLHRoaXMueUNvb3JkaW5hdGVzPW4sdGhpcy5mbGFncz10fX1jbGFzcyBze2NvbnN0cnVjdG9yKGUpe2xldHtjb250b3Vyczp0LGluc3RydWN0aW9uczpyfT1lO3RoaXMuY29udG91cnM9dCx0aGlzLmluc3RydWN0aW9ucz1yfXN0YXRpYyBwYXJzZShlLHQscil7Y29uc3Qgbj1bXTtmb3IobGV0IGE9MDthPHI7YSsrKXtjb25zdCByPXQuZ2V0VWludDE2KGUpO2UrPTIsbi5wdXNoKHIpfWNvbnN0IGE9bltyLTFdKzEsbz10LmdldFVpbnQxNihlKTtlKz0yO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkodCkuc2xpY2UoZSxlK28pO2UrPW87Y29uc3QgbD1bXTtmb3IobGV0IHI9MDtyPGE7ZSsrLHIrKyl7bGV0IG49dC5nZXRVaW50OChlKTtpZihsLnB1c2gobiksOCZuKXtjb25zdCBhPXQuZ2V0VWludDgoKytlKTtuXj04O2ZvcihsZXQgZT0wO2U8YTtlKyspbC5wdXNoKG4pO3IrPWF9fWNvbnN0IGg9W107bGV0IHU9W10sZD1bXSxmPVtdO2NvbnN0IGc9W107bGV0IHA9MCxtPTA7Zm9yKGxldCByPTA7cjxhO3IrKyl7Y29uc3QgYT1sW3JdO2lmKDImYSl7Y29uc3Qgcj10LmdldFVpbnQ4KGUrKyk7bSs9MTYmYT9yOi1yLHUucHVzaChtKX1lbHNlIDE2JmF8fChtKz10LmdldEludDE2KGUpLGUrPTIpLHUucHVzaChtKTtuW3BdPT09ciYmKHArKyxoLnB1c2godSksdT1bXSl9bT0wLHA9MDtmb3IobGV0IHI9MDtyPGE7cisrKXtjb25zdCBhPWxbcl07aWYoNCZhKXtjb25zdCByPXQuZ2V0VWludDgoZSsrKTttKz0zMiZhP3I6LXIsZC5wdXNoKG0pfWVsc2UgMzImYXx8KG0rPXQuZ2V0SW50MTYoZSksZSs9MiksZC5wdXNoKG0pO2YucHVzaCgxJmF8NjQmYSksbltwXT09PXImJih1PWhbcF0scCsrLGcucHVzaChuZXcgaSh7ZmxhZ3M6Zix4Q29vcmRpbmF0ZXM6dSx5Q29vcmRpbmF0ZXM6ZH0pKSxkPVtdLGY9W10pfXJldHVybiBuZXcgcyh7Y29udG91cnM6ZyxpbnN0cnVjdGlvbnM6Y30pfWdldFNpemUoKXtsZXQgZT0yKnRoaXMuY29udG91cnMubGVuZ3RoKzIrdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoLHQ9MCxyPTA7Zm9yKGNvbnN0IG4gb2YgdGhpcy5jb250b3Vycyl7ZSs9bi5mbGFncy5sZW5ndGg7Zm9yKGxldCBhPTAsaT1uLnhDb29yZGluYXRlcy5sZW5ndGg7YTxpO2ErKyl7Y29uc3QgaT1uLnhDb29yZGluYXRlc1thXSxzPW4ueUNvb3JkaW5hdGVzW2FdO2xldCBvPU1hdGguYWJzKGktdCk7bz4yNTU/ZSs9MjpvPjAmJihlKz0xKSx0PWksbz1NYXRoLmFicyhzLXIpLG8+MjU1P2UrPTI6bz4wJiYoZSs9MSkscj1zfX1yZXR1cm4gZX13cml0ZShlLHQpe2NvbnN0IHI9ZSxuPVtdLGE9W10saT1bXTtsZXQgcz0wLG89MDtmb3IoY29uc3QgciBvZiB0aGlzLmNvbnRvdXJzKXtmb3IobGV0IGU9MCx0PXIueENvb3JkaW5hdGVzLmxlbmd0aDtlPHQ7ZSsrKXtsZXQgdD1yLmZsYWdzW2VdO2NvbnN0IGM9ci54Q29vcmRpbmF0ZXNbZV07bGV0IGw9Yy1zO2lmKDA9PT1sKXR8PTE2LG4ucHVzaCgwKTtlbHNle2NvbnN0IGU9TWF0aC5hYnMobCk7ZTw9MjU1Pyh0fD1sPj0wPzE4OjIsbi5wdXNoKGUpKTpuLnB1c2gobCl9cz1jO2NvbnN0IGg9ci55Q29vcmRpbmF0ZXNbZV07aWYobD1oLW8sMD09PWwpdHw9MzIsYS5wdXNoKDApO2Vsc2V7Y29uc3QgZT1NYXRoLmFicyhsKTtlPD0yNTU/KHR8PWw+PTA/MzY6NCxhLnB1c2goZSkpOmEucHVzaChsKX1vPWgsaS5wdXNoKHQpfXQuc2V0VWludDE2KGUsbi5sZW5ndGgtMSksZSs9Mn10LnNldFVpbnQxNihlLHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCksZSs9Mix0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgmJihuZXcgVWludDhBcnJheSh0LmJ1ZmZlciwwLHQuYnVmZmVyLmJ5dGVMZW5ndGgpLnNldCh0aGlzLmluc3RydWN0aW9ucyxlKSxlKz10aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpO2Zvcihjb25zdCByIG9mIGkpdC5zZXRVaW50OChlKysscik7Zm9yKGxldCByPTAsYT1uLmxlbmd0aDtyPGE7cisrKXtjb25zdCBhPW5bcl0scz1pW3JdOzImcz90LnNldFVpbnQ4KGUrKyxhKToxNiZzfHwodC5zZXRJbnQxNihlLGEpLGUrPTIpfWZvcihsZXQgcj0wLG49YS5sZW5ndGg7cjxuO3IrKyl7Y29uc3Qgbj1hW3JdLHM9aVtyXTs0JnM/dC5zZXRVaW50OChlKyssbik6MzImc3x8KHQuc2V0SW50MTYoZSxuKSxlKz0yKX1yZXR1cm4gZS1yfXNjYWxlKGUsdCl7Zm9yKGNvbnN0IHIgb2YgdGhpcy5jb250b3VycylpZigwIT09ci54Q29vcmRpbmF0ZXMubGVuZ3RoKWZvcihsZXQgbj0wLGE9ci54Q29vcmRpbmF0ZXMubGVuZ3RoO248YTtuKyspci54Q29vcmRpbmF0ZXNbbl09TWF0aC5yb3VuZChlKyhyLnhDb29yZGluYXRlc1tuXS1lKSp0KX19Y2xhc3Mgb3tjb25zdHJ1Y3RvcihlKXtsZXR7ZmxhZ3M6dCxnbHlwaEluZGV4OnIsYXJndW1lbnQxOm4sYXJndW1lbnQyOmEsdHJhbnNmOmksaW5zdHJ1Y3Rpb25zOnN9PWU7dGhpcy5mbGFncz10LHRoaXMuZ2x5cGhJbmRleD1yLHRoaXMuYXJndW1lbnQxPW4sdGhpcy5hcmd1bWVudDI9YSx0aGlzLnRyYW5zZj1pLHRoaXMuaW5zdHJ1Y3Rpb25zPXN9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3Qgcj1lLG49W107bGV0IGE9dC5nZXRVaW50MTYoZSk7Y29uc3QgaT10LmdldFVpbnQxNihlKzIpO2xldCBzLGM7ZSs9NCwxJmE/KDImYT8ocz10LmdldEludDE2KGUpLGM9dC5nZXRJbnQxNihlKzIpKToocz10LmdldFVpbnQxNihlKSxjPXQuZ2V0VWludDE2KGUrMikpLGUrPTQsYV49MSk6KDImYT8ocz10LmdldEludDgoZSksYz10LmdldEludDgoZSsxKSk6KHM9dC5nZXRVaW50OChlKSxjPXQuZ2V0VWludDgoZSsxKSksZSs9MiksOCZhPyhuLnB1c2godC5nZXRVaW50MTYoZSkpLGUrPTIpOjY0JmE/KG4ucHVzaCh0LmdldFVpbnQxNihlKSx0LmdldFVpbnQxNihlKzIpKSxlKz00KToxMjgmYSYmKG4ucHVzaCh0LmdldFVpbnQxNihlKSx0LmdldFVpbnQxNihlKzIpLHQuZ2V0VWludDE2KGUrNCksdC5nZXRVaW50MTYoZSs2KSksZSs9OCk7bGV0IGw9bnVsbDtpZigyNTYmYSl7Y29uc3Qgcj10LmdldFVpbnQxNihlKTtlKz0yLGw9bmV3IFVpbnQ4QXJyYXkodCkuc2xpY2UoZSxlK3IpLGUrPXJ9cmV0dXJuW2UtcixuZXcgbyh7ZmxhZ3M6YSxnbHlwaEluZGV4OmksYXJndW1lbnQxOnMsYXJndW1lbnQyOmMsdHJhbnNmOm4saW5zdHJ1Y3Rpb25zOmx9KV19Z2V0U2l6ZSgpe2xldCBlPTQrMip0aGlzLnRyYW5zZi5sZW5ndGg7cmV0dXJuIDI1NiZ0aGlzLmZsYWdzJiYoZSs9Mit0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpLGUrPTIsMiZ0aGlzLmZsYWdzP3RoaXMuYXJndW1lbnQxPj0tMTI4JiZ0aGlzLmFyZ3VtZW50MTw9MTI3JiZ0aGlzLmFyZ3VtZW50Mj49LTEyOCYmdGhpcy5hcmd1bWVudDI8PTEyN3x8KGUrPTIpOnRoaXMuYXJndW1lbnQxPj0wJiZ0aGlzLmFyZ3VtZW50MTw9MjU1JiZ0aGlzLmFyZ3VtZW50Mj49MCYmdGhpcy5hcmd1bWVudDI8PTI1NXx8KGUrPTIpLGV9d3JpdGUoZSx0KXtjb25zdCByPWU7cmV0dXJuIDImdGhpcy5mbGFncz90aGlzLmFyZ3VtZW50MT49LTEyOCYmdGhpcy5hcmd1bWVudDE8PTEyNyYmdGhpcy5hcmd1bWVudDI+PS0xMjgmJnRoaXMuYXJndW1lbnQyPD0xMjd8fCh0aGlzLmZsYWdzfD0xKTp0aGlzLmFyZ3VtZW50MT49MCYmdGhpcy5hcmd1bWVudDE8PTI1NSYmdGhpcy5hcmd1bWVudDI+PTAmJnRoaXMuYXJndW1lbnQyPD0yNTV8fCh0aGlzLmZsYWdzfD0xKSx0LnNldFVpbnQxNihlLHRoaXMuZmxhZ3MpLHQuc2V0VWludDE2KGUrMix0aGlzLmdseXBoSW5kZXgpLGUrPTQsMSZ0aGlzLmZsYWdzPygyJnRoaXMuZmxhZ3M/KHQuc2V0SW50MTYoZSx0aGlzLmFyZ3VtZW50MSksdC5zZXRJbnQxNihlKzIsdGhpcy5hcmd1bWVudDIpKToodC5zZXRVaW50MTYoZSx0aGlzLmFyZ3VtZW50MSksdC5zZXRVaW50MTYoZSsyLHRoaXMuYXJndW1lbnQyKSksZSs9NCk6KHQuc2V0VWludDgoZSx0aGlzLmFyZ3VtZW50MSksdC5zZXRVaW50OChlKzEsdGhpcy5hcmd1bWVudDIpLGUrPTIpLDI1NiZ0aGlzLmZsYWdzJiYodC5zZXRVaW50MTYoZSx0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpLGUrPTIsdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoJiYobmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsMCx0LmJ1ZmZlci5ieXRlTGVuZ3RoKS5zZXQodGhpcy5pbnN0cnVjdGlvbnMsZSksZSs9dGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKSksZS1yfXNjYWxlKGUsdCl7fX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5PcGVuVHlwZUZpbGVCdWlsZGVyPXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigxMzkpLHIoMik7dmFyIG49cigxNDkpLGE9cigxNDQpO2Z1bmN0aW9uIGkoZSx0LHIpe2VbdF09cj4+OCYyNTUsZVt0KzFdPTI1NSZyfWZ1bmN0aW9uIHMoZSx0LHIpe2VbdF09cj4+MjQmMjU1LGVbdCsxXT1yPj4xNiYyNTUsZVt0KzJdPXI+PjgmMjU1LGVbdCszXT0yNTUmcn1mdW5jdGlvbiBvKGUsdCxyKXtpZihyIGluc3RhbmNlb2YgVWludDhBcnJheSllLnNldChyLHQpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiByKWZvcihsZXQgbj0wLGE9ci5sZW5ndGg7bjxhO24rKyllW3QrK109MjU1JnIuY2hhckNvZGVBdChuKTtlbHNlIGZvcihjb25zdCBuIG9mIHIpZVt0KytdPTI1NSZufWNsYXNzIGN7Y29uc3RydWN0b3IoZSl7dGhpcy5zZm50PWUsdGhpcy50YWJsZXM9T2JqZWN0LmNyZWF0ZShudWxsKX1zdGF0aWMgZ2V0U2VhcmNoUGFyYW1zKGUsdCl7bGV0IHI9MSxuPTA7Zm9yKDsocl5lKT5yOylyPDw9MSxuKys7Y29uc3QgYT1yKnQ7cmV0dXJue3JhbmdlOmEsZW50cnk6bixyYW5nZVNoaWZ0OnQqZS1hfX10b0FycmF5KCl7bGV0IGU9dGhpcy5zZm50O2NvbnN0IHQ9dGhpcy50YWJsZXMscj1PYmplY3Qua2V5cyh0KTtyLnNvcnQoKTtjb25zdCBsPXIubGVuZ3RoO2xldCBoLHUsZCxmLGcscD0xMisxNipsO2NvbnN0IG09W3BdO2ZvcihoPTA7aDxsO2grKylmPXRbcltoXV0scCs9KGYubGVuZ3RoKzMmLTQpPj4+MCxtLnB1c2gocCk7Y29uc3QgYj1uZXcgVWludDhBcnJheShwKTtmb3IoaD0wO2g8bDtoKyspZj10W3JbaF1dLG8oYixtW2hdLGYpOyJ0cnVlIj09PWUmJihlPSgwLGEuc3RyaW5nMzIpKDY1NTM2KSksYlswXT0yNTUmZS5jaGFyQ29kZUF0KDApLGJbMV09MjU1JmUuY2hhckNvZGVBdCgxKSxiWzJdPTI1NSZlLmNoYXJDb2RlQXQoMiksYlszXT0yNTUmZS5jaGFyQ29kZUF0KDMpLGkoYiw0LGwpO2NvbnN0IHk9Yy5nZXRTZWFyY2hQYXJhbXMobCwxNik7Zm9yKGkoYiw2LHkucmFuZ2UpLGkoYiw4LHkuZW50cnkpLGkoYiwxMCx5LnJhbmdlU2hpZnQpLHA9MTIsaD0wO2g8bDtoKyspe2c9cltoXSxiW3BdPTI1NSZnLmNoYXJDb2RlQXQoMCksYltwKzFdPTI1NSZnLmNoYXJDb2RlQXQoMSksYltwKzJdPTI1NSZnLmNoYXJDb2RlQXQoMiksYltwKzNdPTI1NSZnLmNoYXJDb2RlQXQoMyk7bGV0IGU9MDtmb3IodT1tW2hdLGQ9bVtoKzFdO3U8ZDt1Kz00KWU9ZSsoMCxuLnJlYWRVaW50MzIpKGIsdSk+Pj4wO3MoYixwKzQsZSkscyhiLHArOCxtW2hdKSxzKGIscCsxMix0W2ddLmxlbmd0aCkscCs9MTZ9cmV0dXJuIGJ9YWRkVGFibGUoZSx0KXtpZihlIGluIHRoaXMudGFibGVzKXRocm93IG5ldyBFcnJvcigiVGFibGUgIitlKyIgYWxyZWFkeSBleGlzdHMiKTt0aGlzLnRhYmxlc1tlXT10fX10Lk9wZW5UeXBlRmlsZUJ1aWxkZXI9Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlR5cGUxRm9udD12b2lkIDAscigxMzkpO3ZhciBuPXIoMTg1KSxhPXIoMTQ0KSxpPXIoMTg4KSxzPXIoMTQ5KSxvPXIoMTU0KSxjPXIoMTk5KTtmdW5jdGlvbiBsKGUsdCxyKXtjb25zdCBuPWUubGVuZ3RoLGE9dC5sZW5ndGgsaT1uLWE7bGV0IG89cixjPSExO2Zvcig7bzxpOyl7bGV0IHI9MDtmb3IoO3I8YSYmZVtvK3JdPT09dFtyXTspcisrO2lmKHI+PWEpe2ZvcihvKz1yO288biYmKDAscy5pc1doaXRlU3BhY2UpKGVbb10pOylvKys7Yz0hMDticmVha31vKyt9cmV0dXJue2ZvdW5kOmMsbGVuZ3RoOm99fXQuVHlwZTFGb250PWNsYXNze2NvbnN0cnVjdG9yKGUsdCxyKXtsZXQgbj1yLmxlbmd0aDEscz1yLmxlbmd0aDIsaD10LnBlZWtCeXRlcyg2KTtjb25zdCB1PTEyOD09PWhbMF0mJjE9PT1oWzFdO3UmJih0LnNraXAoNiksbj1oWzVdPDwyNHxoWzRdPDwxNnxoWzNdPDw4fGhbMl0pO2NvbnN0IGQ9ZnVuY3Rpb24oZSx0KXtjb25zdCByPVsxMDEsMTAxLDEyMCwxMDEsOTldLG49ZS5wb3M7bGV0IGkscyxjLGg7dHJ5e2k9ZS5nZXRCeXRlcyh0KSxzPWkubGVuZ3RofWNhdGNoKGUpe31pZihzPT09dCYmKGM9bChpLHIsdC0yKnIubGVuZ3RoKSxjLmZvdW5kJiZjLmxlbmd0aD09PXQpKXJldHVybntzdHJlYW06bmV3IG8uU3RyZWFtKGkpLGxlbmd0aDp0fTtmb3IoKDAsYS53YXJuKSgnSW52YWxpZCAiTGVuZ3RoMSIgcHJvcGVydHkgaW4gVHlwZTEgZm9udCAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKSxlLnBvcz1uO2M9bChlLnBlZWtCeXRlcygyMDQ4KSxyLDApLDAhPT1jLmxlbmd0aDspaWYoZS5wb3MrPWMubGVuZ3RoLGMuZm91bmQpe2g9ZS5wb3MtbjticmVha31yZXR1cm4gZS5wb3M9bixoP3tzdHJlYW06bmV3IG8uU3RyZWFtKGUuZ2V0Qnl0ZXMoaCkpLGxlbmd0aDpofTooKDAsYS53YXJuKSgnVW5hYmxlIHRvIHJlY292ZXIgIkxlbmd0aDEiIHByb3BlcnR5IGluIFR5cGUxIGZvbnQgLS0gdXNpbmcgYXMgaXMuJykse3N0cmVhbTpuZXcgby5TdHJlYW0oZS5nZXRCeXRlcyh0KSksbGVuZ3RoOnR9KX0odCxuKTtuZXcgYy5UeXBlMVBhcnNlcihkLnN0cmVhbSwhMSxpLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCkuZXh0cmFjdEZvbnRIZWFkZXIociksdSYmKGg9dC5nZXRCeXRlcyg2KSxzPWhbNV08PDI0fGhbNF08PDE2fGhbM108PDh8aFsyXSk7Y29uc3QgZj1mdW5jdGlvbihlLHQpe2NvbnN0IHI9ZS5nZXRCeXRlcygpO2lmKDA9PT1yLmxlbmd0aCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiZ2V0RWV4ZWNCbG9jayAtIG5vIGZvbnQgcHJvZ3JhbSBmb3VuZC4iKTtyZXR1cm57c3RyZWFtOm5ldyBvLlN0cmVhbShyKSxsZW5ndGg6ci5sZW5ndGh9fSh0KSxnPW5ldyBjLlR5cGUxUGFyc2VyKGYuc3RyZWFtLCEwLGkuU0VBQ19BTkFMWVNJU19FTkFCTEVEKS5leHRyYWN0Rm9udFByb2dyYW0ocik7Zm9yKGNvbnN0IGUgaW4gZy5wcm9wZXJ0aWVzKXJbZV09Zy5wcm9wZXJ0aWVzW2VdO2NvbnN0IHA9Zy5jaGFyc3RyaW5ncyxtPXRoaXMuZ2V0VHlwZTJDaGFyc3RyaW5ncyhwKSxiPXRoaXMuZ2V0VHlwZTJTdWJycyhnLnN1YnJzKTt0aGlzLmNoYXJzdHJpbmdzPXAsdGhpcy5kYXRhPXRoaXMud3JhcChlLG0sdGhpcy5jaGFyc3RyaW5ncyxiLHIpLHRoaXMuc2VhY3M9dGhpcy5nZXRTZWFjcyhnLmNoYXJzdHJpbmdzKX1nZXQgbnVtR2x5cGhzKCl7cmV0dXJuIHRoaXMuY2hhcnN0cmluZ3MubGVuZ3RoKzF9Z2V0Q2hhcnNldCgpe2NvbnN0IGU9WyIubm90ZGVmIl07Zm9yKGNvbnN0e2dseXBoTmFtZTp0fW9mIHRoaXMuY2hhcnN0cmluZ3MpZS5wdXNoKHQpO3JldHVybiBlfWdldEdseXBoTWFwcGluZyhlKXtjb25zdCB0PXRoaXMuY2hhcnN0cmluZ3M7aWYoZS5jb21wb3NpdGUpe2NvbnN0IHI9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IG49MCxhPXQubGVuZ3RoO248YTtuKyspcltlLmNNYXAuY2hhckNvZGVPZihuKV09bisxO3JldHVybiByfWNvbnN0IHI9WyIubm90ZGVmIl07bGV0IG4sYTtmb3IoYT0wO2E8dC5sZW5ndGg7YSsrKXIucHVzaCh0W2FdLmdseXBoTmFtZSk7Y29uc3Qgcz1lLmJ1aWx0SW5FbmNvZGluZztpZihzKXtuPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0IGUgaW4gcylhPXIuaW5kZXhPZihzW2VdKSxhPj0wJiYobltlXT1hKX1yZXR1cm4oMCxpLnR5cGUxRm9udEdseXBoTWFwcGluZykoZSxuLHIpfWhhc0dseXBoSWQoZSl7cmV0dXJuIShlPDB8fGU+PXRoaXMubnVtR2x5cGhzKSYmKDA9PT1lfHx0aGlzLmNoYXJzdHJpbmdzW2UtMV0uY2hhcnN0cmluZy5sZW5ndGg+MCl9Z2V0U2VhY3MoZSl7Y29uc3QgdD1bXTtmb3IobGV0IHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspe2NvbnN0IG49ZVtyXTtuLnNlYWMmJih0W3IrMV09bi5zZWFjKX1yZXR1cm4gdH1nZXRUeXBlMkNoYXJzdHJpbmdzKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IHIgb2YgZSl0LnB1c2goci5jaGFyc3RyaW5nKTtyZXR1cm4gdH1nZXRUeXBlMlN1YnJzKGUpe2xldCB0PTA7Y29uc3Qgcj1lLmxlbmd0aDt0PXI8MTEzMz8xMDc6cjwzMzc2OT8xMTMxOjMyNzY4O2NvbnN0IG49W107bGV0IGE7Zm9yKGE9MDthPHQ7YSsrKW4ucHVzaChbMTFdKTtmb3IoYT0wO2E8cjthKyspbi5wdXNoKGVbYV0pO3JldHVybiBufXdyYXAoZSx0LHIsYSxpKXtjb25zdCBzPW5ldyBuLkNGRjtzLmhlYWRlcj1uZXcgbi5DRkZIZWFkZXIoMSwwLDQsNCkscy5uYW1lcz1bZV07Y29uc3Qgbz1uZXcgbi5DRkZUb3BEaWN0O28uc2V0QnlOYW1lKCJ2ZXJzaW9uIiwzOTEpLG8uc2V0QnlOYW1lKCJOb3RpY2UiLDM5Miksby5zZXRCeU5hbWUoIkZ1bGxOYW1lIiwzOTMpLG8uc2V0QnlOYW1lKCJGYW1pbHlOYW1lIiwzOTQpLG8uc2V0QnlOYW1lKCJXZWlnaHQiLDM5NSksby5zZXRCeU5hbWUoIkVuY29kaW5nIixudWxsKSxvLnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsaS5mb250TWF0cml4KSxvLnNldEJ5TmFtZSgiRm9udEJCb3giLGkuYmJveCksby5zZXRCeU5hbWUoImNoYXJzZXQiLG51bGwpLG8uc2V0QnlOYW1lKCJDaGFyU3RyaW5ncyIsbnVsbCksby5zZXRCeU5hbWUoIlByaXZhdGUiLG51bGwpLHMudG9wRGljdD1vO2NvbnN0IGM9bmV3IG4uQ0ZGU3RyaW5ncztjLmFkZCgiVmVyc2lvbiAwLjExIiksYy5hZGQoIlNlZSBvcmlnaW5hbCBub3RpY2UiKSxjLmFkZChlKSxjLmFkZChlKSxjLmFkZCgiTWVkaXVtIikscy5zdHJpbmdzPWMscy5nbG9iYWxTdWJySW5kZXg9bmV3IG4uQ0ZGSW5kZXg7Y29uc3QgbD10Lmxlbmd0aCxoPVsiLm5vdGRlZiJdO2xldCB1LGQ7Zm9yKHU9MDt1PGw7dSsrKXtjb25zdCBlPXJbdV0uZ2x5cGhOYW1lOy0xPT09bi5DRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihlKSYmYy5hZGQoZSksaC5wdXNoKGUpfXMuY2hhcnNldD1uZXcgbi5DRkZDaGFyc2V0KCExLDAsaCk7Y29uc3QgZj1uZXcgbi5DRkZJbmRleDtmb3IoZi5hZGQoWzEzOSwxNF0pLHU9MDt1PGw7dSsrKWYuYWRkKHRbdV0pO3MuY2hhclN0cmluZ3M9Zjtjb25zdCBnPW5ldyBuLkNGRlByaXZhdGVEaWN0O2cuc2V0QnlOYW1lKCJTdWJycyIsbnVsbCk7Y29uc3QgcD1bIkJsdWVWYWx1ZXMiLCJPdGhlckJsdWVzIiwiRmFtaWx5Qmx1ZXMiLCJGYW1pbHlPdGhlckJsdWVzIiwiU3RlbVNuYXBIIiwiU3RlbVNuYXBWIiwiQmx1ZVNoaWZ0IiwiQmx1ZUZ1enoiLCJCbHVlU2NhbGUiLCJMYW5ndWFnZUdyb3VwIiwiRXhwYW5zaW9uRmFjdG9yIiwiRm9yY2VCb2xkIiwiU3RkSFciLCJTdGRWVyJdO2Zvcih1PTAsZD1wLmxlbmd0aDt1PGQ7dSsrKXtjb25zdCBlPXBbdV07aWYoIShlIGluIGkucHJpdmF0ZURhdGEpKWNvbnRpbnVlO2NvbnN0IHQ9aS5wcml2YXRlRGF0YVtlXTtpZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgZT10Lmxlbmd0aC0xO2U+MDtlLS0pdFtlXS09dFtlLTFdO2cuc2V0QnlOYW1lKGUsdCl9cy50b3BEaWN0LnByaXZhdGVEaWN0PWc7Y29uc3QgbT1uZXcgbi5DRkZJbmRleDtmb3IodT0wLGQ9YS5sZW5ndGg7dTxkO3UrKyltLmFkZChhW3VdKTtyZXR1cm4gZy5zdWJyc0luZGV4PW0sbmV3IG4uQ0ZGQ29tcGlsZXIocykuY29tcGlsZSgpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UeXBlMVBhcnNlcj12b2lkIDAscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDE1OSk7dmFyIG49cigxODcpLGE9cigxNDkpLGk9cigxNTQpLHM9cigxNDQpO2NvbnN0IG89WzRdLGM9WzVdLGw9WzZdLGg9WzddLHU9WzhdLGQ9WzEyLDM1XSxmPVsxNF0sZz1bMjFdLHA9WzIyXSxtPVszMF0sYj1bMzFdO2NsYXNzIHl7Y29uc3RydWN0b3IoKXt0aGlzLndpZHRoPTAsdGhpcy5sc2I9MCx0aGlzLmZsZXhpbmc9ITEsdGhpcy5vdXRwdXQ9W10sdGhpcy5zdGFjaz1bXX1jb252ZXJ0KGUsdCxyKXtjb25zdCBuPWUubGVuZ3RoO2xldCBhLGkseSx3PSExO2ZvcihsZXQgdj0wO3Y8bjt2Kyspe2xldCBuPWVbdl07aWYobjwzMil7c3dpdGNoKDEyPT09biYmKG49KG48PDgpK2VbKyt2XSksbil7Y2FzZSAxOmNhc2UgMzpjYXNlIDk6Y2FzZSAzMDcyOmNhc2UgMzA3MzpjYXNlIDMwNzQ6Y2FzZSAzMTA1OnRoaXMuc3RhY2s9W107YnJlYWs7Y2FzZSA0OmlmKHRoaXMuZmxleGluZyl7aWYodGhpcy5zdGFjay5sZW5ndGg8MSl7dz0hMDticmVha31jb25zdCBlPXRoaXMuc3RhY2sucG9wKCk7dGhpcy5zdGFjay5wdXNoKDAsZSk7YnJlYWt9dz10aGlzLmV4ZWN1dGVDb21tYW5kKDEsbyk7YnJlYWs7Y2FzZSA1Onc9dGhpcy5leGVjdXRlQ29tbWFuZCgyLGMpO2JyZWFrO2Nhc2UgNjp3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoMSxsKTticmVhaztjYXNlIDc6dz10aGlzLmV4ZWN1dGVDb21tYW5kKDEsaCk7YnJlYWs7Y2FzZSA4Onc9dGhpcy5leGVjdXRlQ29tbWFuZCg2LHUpO2JyZWFrO2Nhc2UgMTA6aWYodGhpcy5zdGFjay5sZW5ndGg8MSl7dz0hMDticmVha31pZih5PXRoaXMuc3RhY2sucG9wKCksIXRbeV0pe3c9ITA7YnJlYWt9dz10aGlzLmNvbnZlcnQodFt5XSx0LHIpO2JyZWFrO2Nhc2UgMTE6cmV0dXJuIHc7Y2FzZSAxMzppZih0aGlzLnN0YWNrLmxlbmd0aDwyKXt3PSEwO2JyZWFrfWE9dGhpcy5zdGFjay5wb3AoKSxpPXRoaXMuc3RhY2sucG9wKCksdGhpcy5sc2I9aSx0aGlzLndpZHRoPWEsdGhpcy5zdGFjay5wdXNoKGEsaSksdz10aGlzLmV4ZWN1dGVDb21tYW5kKDIscCk7YnJlYWs7Y2FzZSAxNDp0aGlzLm91dHB1dC5wdXNoKGZbMF0pO2JyZWFrO2Nhc2UgMjE6aWYodGhpcy5mbGV4aW5nKWJyZWFrO3c9dGhpcy5leGVjdXRlQ29tbWFuZCgyLGcpO2JyZWFrO2Nhc2UgMjI6aWYodGhpcy5mbGV4aW5nKXt0aGlzLnN0YWNrLnB1c2goMCk7YnJlYWt9dz10aGlzLmV4ZWN1dGVDb21tYW5kKDEscCk7YnJlYWs7Y2FzZSAzMDp3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoNCxtKTticmVhaztjYXNlIDMxOnc9dGhpcy5leGVjdXRlQ29tbWFuZCg0LGIpO2JyZWFrO2Nhc2UgMzA3ODppZihyKXtjb25zdCBlPXRoaXMuc3RhY2suYXQoLTUpO3RoaXMuc2VhYz10aGlzLnN0YWNrLnNwbGljZSgtNCw0KSx0aGlzLnNlYWNbMF0rPXRoaXMubHNiLWUsdz10aGlzLmV4ZWN1dGVDb21tYW5kKDAsZil9ZWxzZSB3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoNCxmKTticmVhaztjYXNlIDMwNzk6aWYodGhpcy5zdGFjay5sZW5ndGg8NCl7dz0hMDticmVha310aGlzLnN0YWNrLnBvcCgpLGE9dGhpcy5zdGFjay5wb3AoKTtjb25zdCBlPXRoaXMuc3RhY2sucG9wKCk7aT10aGlzLnN0YWNrLnBvcCgpLHRoaXMubHNiPWksdGhpcy53aWR0aD1hLHRoaXMuc3RhY2sucHVzaChhLGksZSksdz10aGlzLmV4ZWN1dGVDb21tYW5kKDMsZyk7YnJlYWs7Y2FzZSAzMDg0OmlmKHRoaXMuc3RhY2subGVuZ3RoPDIpe3c9ITA7YnJlYWt9Y29uc3Qgdj10aGlzLnN0YWNrLnBvcCgpLHg9dGhpcy5zdGFjay5wb3AoKTt0aGlzLnN0YWNrLnB1c2goeC92KTticmVhaztjYXNlIDMwODg6aWYodGhpcy5zdGFjay5sZW5ndGg8Mil7dz0hMDticmVha315PXRoaXMuc3RhY2sucG9wKCk7Y29uc3QgUz10aGlzLnN0YWNrLnBvcCgpO2lmKDA9PT15JiYzPT09Uyl7Y29uc3QgZT10aGlzLnN0YWNrLnNwbGljZSgtMTcsMTcpO3RoaXMuc3RhY2sucHVzaChlWzJdK2VbMF0sZVszXStlWzFdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XSxlWzldLGVbMTBdLGVbMTFdLGVbMTJdLGVbMTNdLGVbMTRdKSx3PXRoaXMuZXhlY3V0ZUNvbW1hbmQoMTMsZCwhMCksdGhpcy5mbGV4aW5nPSExLHRoaXMuc3RhY2sucHVzaChlWzE1XSxlWzE2XSl9ZWxzZSAxPT09eSYmMD09PVMmJih0aGlzLmZsZXhpbmc9ITApO2JyZWFrO2Nhc2UgMzA4OTpicmVhaztkZWZhdWx0OigwLHMud2FybikoJ1Vua25vd24gdHlwZSAxIGNoYXJzdHJpbmcgY29tbWFuZCBvZiAiJytuKyciJyl9aWYodylicmVha31lbHNlIG48PTI0Nj9uLT0xMzk6bj1uPD0yNTA/MjU2KihuLTI0NykrZVsrK3ZdKzEwODpuPD0yNTQ/LTI1Nioobi0yNTEpLWVbKyt2XS0xMDg6KDI1NSZlWysrdl0pPDwyNHwoMjU1JmVbKyt2XSk8PDE2fCgyNTUmZVsrK3ZdKTw8OHwoMjU1JmVbKyt2XSk8PDAsdGhpcy5zdGFjay5wdXNoKG4pfXJldHVybiB3fWV4ZWN1dGVDb21tYW5kKGUsdCxyKXtjb25zdCBuPXRoaXMuc3RhY2subGVuZ3RoO2lmKGU+bilyZXR1cm4hMDtjb25zdCBhPW4tZTtmb3IobGV0IGU9YTtlPG47ZSsrKXtsZXQgdD10aGlzLnN0YWNrW2VdO051bWJlci5pc0ludGVnZXIodCk/dGhpcy5vdXRwdXQucHVzaCgyOCx0Pj44JjI1NSwyNTUmdCk6KHQ9NjU1MzYqdHwwLHRoaXMub3V0cHV0LnB1c2goMjU1LHQ+PjI0JjI1NSx0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQpKX1yZXR1cm4gdGhpcy5vdXRwdXQucHVzaCguLi50KSxyP3RoaXMuc3RhY2suc3BsaWNlKGEsZSk6dGhpcy5zdGFjay5sZW5ndGg9MCwhMX19ZnVuY3Rpb24gdyhlKXtyZXR1cm4gZT49NDgmJmU8PTU3fHxlPj02NSYmZTw9NzB8fGU+PTk3JiZlPD0xMDJ9ZnVuY3Rpb24gdihlLHQscil7aWYocj49ZS5sZW5ndGgpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2xldCBuLGEsaT0wfHQ7Zm9yKG49MDtuPHI7bisrKWk9NTI4NDUqKGVbbl0raSkrMjI3MTkmNjU1MzU7Y29uc3Qgcz1lLmxlbmd0aC1yLG89bmV3IFVpbnQ4QXJyYXkocyk7Zm9yKG49cixhPTA7YTxzO24rKyxhKyspe2NvbnN0IHQ9ZVtuXTtvW2FdPXReaT4+OCxpPTUyODQ1Kih0K2kpKzIyNzE5JjY1NTM1fXJldHVybiBvfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIDQ3PT09ZXx8OTE9PT1lfHw5Mz09PWV8fDEyMz09PWV8fDEyNT09PWV8fDQwPT09ZXx8NDE9PT1lfXQuVHlwZTFQYXJzZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LHIpe2lmKHQpe2NvbnN0IHQ9ZS5nZXRCeXRlcygpLHI9ISgodyh0WzBdKXx8KDAsYS5pc1doaXRlU3BhY2UpKHRbMF0pKSYmdyh0WzFdKSYmdyh0WzJdKSYmdyh0WzNdKSYmdyh0WzRdKSYmdyh0WzVdKSYmdyh0WzZdKSYmdyh0WzddKSk7ZT1uZXcgaS5TdHJlYW0ocj92KHQsNTU2NjUsNCk6ZnVuY3Rpb24oZSx0LHIpe2xldCBuPTU1NjY1O2NvbnN0IGE9ZS5sZW5ndGgsaT1uZXcgVWludDhBcnJheShhPj4+MSk7bGV0IHMsbztmb3Iocz0wLG89MDtzPGE7cysrKXtjb25zdCB0PWVbc107aWYoIXcodCkpY29udGludWU7bGV0IHI7Zm9yKHMrKztzPGEmJiF3KHI9ZVtzXSk7KXMrKztpZihzPGEpe2NvbnN0IGU9cGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZSh0LHIpLDE2KTtpW28rK109ZV5uPj44LG49NTI4NDUqKGUrbikrMjI3MTkmNjU1MzV9fXJldHVybiBpLnNsaWNlKDQsbyl9KHQpKX10aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQ9ISFyLHRoaXMuc3RyZWFtPWUsdGhpcy5uZXh0Q2hhcigpfXJlYWROdW1iZXJBcnJheSgpe3RoaXMuZ2V0VG9rZW4oKTtjb25zdCBlPVtdO2Zvcig7Oyl7Y29uc3QgdD10aGlzLmdldFRva2VuKCk7aWYobnVsbD09PXR8fCJdIj09PXR8fCJ9Ij09PXQpYnJlYWs7ZS5wdXNoKHBhcnNlRmxvYXQodHx8MCkpfXJldHVybiBlfXJlYWROdW1iZXIoKXtjb25zdCBlPXRoaXMuZ2V0VG9rZW4oKTtyZXR1cm4gcGFyc2VGbG9hdChlfHwwKX1yZWFkSW50KCl7Y29uc3QgZT10aGlzLmdldFRva2VuKCk7cmV0dXJuIDB8cGFyc2VJbnQoZXx8MCwxMCl9cmVhZEJvb2xlYW4oKXtyZXR1cm4idHJ1ZSI9PT10aGlzLmdldFRva2VuKCk/MTowfW5leHRDaGFyKCl7cmV0dXJuIHRoaXMuY3VycmVudENoYXI9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpfXByZXZDaGFyKCl7cmV0dXJuIHRoaXMuc3RyZWFtLnNraXAoLTIpLHRoaXMuY3VycmVudENoYXI9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpfWdldFRva2VuKCl7bGV0IGU9ITEsdD10aGlzLmN1cnJlbnRDaGFyO2Zvcig7Oyl7aWYoLTE9PT10KXJldHVybiBudWxsO2lmKGUpMTAhPT10JiYxMyE9PXR8fChlPSExKTtlbHNlIGlmKDM3PT09dCllPSEwO2Vsc2UgaWYoISgwLGEuaXNXaGl0ZVNwYWNlKSh0KSlicmVhazt0PXRoaXMubmV4dENoYXIoKX1pZih4KHQpKXJldHVybiB0aGlzLm5leHRDaGFyKCksU3RyaW5nLmZyb21DaGFyQ29kZSh0KTtsZXQgcj0iIjtkb3tyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpLHQ9dGhpcy5uZXh0Q2hhcigpfXdoaWxlKHQ+PTAmJiEoMCxhLmlzV2hpdGVTcGFjZSkodCkmJiF4KHQpKTtyZXR1cm4gcn1yZWFkQ2hhclN0cmluZ3MoZSx0KXtyZXR1cm4tMT09PXQ/ZTp2KGUsNDMzMCx0KX1leHRyYWN0Rm9udFByb2dyYW0oZSl7Y29uc3QgdD10aGlzLnN0cmVhbSxyPVtdLG49W10sYT1PYmplY3QuY3JlYXRlKG51bGwpO2EubGVuSVY9NDtjb25zdCBpPXtzdWJyczpbXSxjaGFyc3RyaW5nczpbXSxwcm9wZXJ0aWVzOntwcml2YXRlRGF0YTphfX07bGV0IHMsbyxjLGw7Zm9yKDtudWxsIT09KHM9dGhpcy5nZXRUb2tlbigpKTspaWYoIi8iPT09cylzd2l0Y2gocz10aGlzLmdldFRva2VuKCkscyl7Y2FzZSJDaGFyU3RyaW5ncyI6Zm9yKHRoaXMuZ2V0VG9rZW4oKSx0aGlzLmdldFRva2VuKCksdGhpcy5nZXRUb2tlbigpLHRoaXMuZ2V0VG9rZW4oKTtzPXRoaXMuZ2V0VG9rZW4oKSxudWxsIT09cyYmImVuZCIhPT1zOyl7aWYoIi8iIT09cyljb250aW51ZTtjb25zdCBlPXRoaXMuZ2V0VG9rZW4oKTtvPXRoaXMucmVhZEludCgpLHRoaXMuZ2V0VG9rZW4oKSxjPW8+MD90LmdldEJ5dGVzKG8pOm5ldyBVaW50OEFycmF5KDApLGw9aS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhLmxlbklWO2NvbnN0IHI9dGhpcy5yZWFkQ2hhclN0cmluZ3MoYyxsKTt0aGlzLm5leHRDaGFyKCkscz10aGlzLmdldFRva2VuKCksIm5vYWNjZXNzIj09PXM/dGhpcy5nZXRUb2tlbigpOiIvIj09PXMmJnRoaXMucHJldkNoYXIoKSxuLnB1c2goe2dseXBoOmUsZW5jb2RlZDpyfSl9YnJlYWs7Y2FzZSJTdWJycyI6Zm9yKHRoaXMucmVhZEludCgpLHRoaXMuZ2V0VG9rZW4oKTsiZHVwIj09PXRoaXMuZ2V0VG9rZW4oKTspe2NvbnN0IGU9dGhpcy5yZWFkSW50KCk7bz10aGlzLnJlYWRJbnQoKSx0aGlzLmdldFRva2VuKCksYz1vPjA/dC5nZXRCeXRlcyhvKTpuZXcgVWludDhBcnJheSgwKSxsPWkucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjtjb25zdCBuPXRoaXMucmVhZENoYXJTdHJpbmdzKGMsbCk7dGhpcy5uZXh0Q2hhcigpLHM9dGhpcy5nZXRUb2tlbigpLCJub2FjY2VzcyI9PT1zJiZ0aGlzLmdldFRva2VuKCkscltlXT1ufWJyZWFrO2Nhc2UiQmx1ZVZhbHVlcyI6Y2FzZSJPdGhlckJsdWVzIjpjYXNlIkZhbWlseUJsdWVzIjpjYXNlIkZhbWlseU90aGVyQmx1ZXMiOmNvbnN0IGU9dGhpcy5yZWFkTnVtYmVyQXJyYXkoKTtlLmxlbmd0aD4wJiZlLmxlbmd0aDticmVhaztjYXNlIlN0ZW1TbmFwSCI6Y2FzZSJTdGVtU25hcFYiOmkucHJvcGVydGllcy5wcml2YXRlRGF0YVtzXT10aGlzLnJlYWROdW1iZXJBcnJheSgpO2JyZWFrO2Nhc2UiU3RkSFciOmNhc2UiU3RkVlciOmkucHJvcGVydGllcy5wcml2YXRlRGF0YVtzXT10aGlzLnJlYWROdW1iZXJBcnJheSgpWzBdO2JyZWFrO2Nhc2UiQmx1ZVNoaWZ0IjpjYXNlImxlbklWIjpjYXNlIkJsdWVGdXp6IjpjYXNlIkJsdWVTY2FsZSI6Y2FzZSJMYW5ndWFnZUdyb3VwIjppLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbc109dGhpcy5yZWFkTnVtYmVyKCk7YnJlYWs7Y2FzZSJFeHBhbnNpb25GYWN0b3IiOmkucHJvcGVydGllcy5wcml2YXRlRGF0YVtzXT10aGlzLnJlYWROdW1iZXIoKXx8LjA2O2JyZWFrO2Nhc2UiRm9yY2VCb2xkIjppLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbc109dGhpcy5yZWFkQm9vbGVhbigpfWZvcihjb25zdHtlbmNvZGVkOnQsZ2x5cGg6YX1vZiBuKXtjb25zdCBuPW5ldyB5LHM9bi5jb252ZXJ0KHQscix0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQpO2xldCBvPW4ub3V0cHV0O3MmJihvPVsxNF0pO2NvbnN0IGM9e2dseXBoTmFtZTphLGNoYXJzdHJpbmc6byx3aWR0aDpuLndpZHRoLGxzYjpuLmxzYixzZWFjOm4uc2VhY307aWYoIi5ub3RkZWYiPT09YT9pLmNoYXJzdHJpbmdzLnVuc2hpZnQoYyk6aS5jaGFyc3RyaW5ncy5wdXNoKGMpLGUuYnVpbHRJbkVuY29kaW5nKXtjb25zdCB0PWUuYnVpbHRJbkVuY29kaW5nLmluZGV4T2YoYSk7dD4tMSYmdm9pZCAwPT09ZS53aWR0aHNbdF0mJnQ+PWUuZmlyc3RDaGFyJiZ0PD1lLmxhc3RDaGFyJiYoZS53aWR0aHNbdF09bi53aWR0aCl9fXJldHVybiBpfWV4dHJhY3RGb250SGVhZGVyKGUpe2xldCB0O2Zvcig7bnVsbCE9PSh0PXRoaXMuZ2V0VG9rZW4oKSk7KWlmKCIvIj09PXQpc3dpdGNoKHQ9dGhpcy5nZXRUb2tlbigpLHQpe2Nhc2UiRm9udE1hdHJpeCI6Y29uc3Qgcj10aGlzLnJlYWROdW1iZXJBcnJheSgpO2UuZm9udE1hdHJpeD1yO2JyZWFrO2Nhc2UiRW5jb2RpbmciOmNvbnN0IGE9dGhpcy5nZXRUb2tlbigpO2xldCBpO2lmKC9eXGQrJC8udGVzdChhKSl7aT1bXTtjb25zdCBlPTB8cGFyc2VJbnQoYSwxMCk7dGhpcy5nZXRUb2tlbigpO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2Zvcih0PXRoaXMuZ2V0VG9rZW4oKTsiZHVwIiE9PXQmJiJkZWYiIT09dDspaWYodD10aGlzLmdldFRva2VuKCksbnVsbD09PXQpcmV0dXJuO2lmKCJkZWYiPT09dClicmVhaztjb25zdCBlPXRoaXMucmVhZEludCgpO3RoaXMuZ2V0VG9rZW4oKTtjb25zdCByPXRoaXMuZ2V0VG9rZW4oKTtpW2VdPXIsdGhpcy5nZXRUb2tlbigpfX1lbHNlIGk9KDAsbi5nZXRFbmNvZGluZykoYSk7ZS5idWlsdEluRW5jb2Rpbmc9aTticmVhaztjYXNlIkZvbnRCQm94Ijpjb25zdCBzPXRoaXMucmVhZE51bWJlckFycmF5KCk7ZS5hc2NlbnQ9TWF0aC5tYXgoc1szXSxzWzFdKSxlLmRlc2NlbnQ9TWF0aC5taW4oc1sxXSxzWzNdKSxlLmFzY2VudFNjYWxlZD0hMH19fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlBhdHRlcm49dm9pZCAwLHQuZ2V0VGlsaW5nUGF0dGVybklSPWZ1bmN0aW9uKGUsdCxyKXtjb25zdCBhPXQuZ2V0QXJyYXkoIk1hdHJpeCIpLGk9bi5VdGlsLm5vcm1hbGl6ZVJlY3QodC5nZXRBcnJheSgiQkJveCIpKSxzPXQuZ2V0KCJYU3RlcCIpLG89dC5nZXQoIllTdGVwIiksYz10LmdldCgiUGFpbnRUeXBlIiksbD10LmdldCgiVGlsaW5nVHlwZSIpO2lmKGlbMl0taVswXT09MHx8aVszXS1pWzFdPT0wKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvQkJveCBhcnJheTogWyIuY29uY2F0KGksIl0uIikpO3JldHVyblsiVGlsaW5nUGF0dGVybiIscixlLGEsaSxzLG8sYyxsXX0scig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTM5KSxyKDE1OSk7dmFyIG49cigxNDQpLGE9cigxNTEpLHM9cigxNjIpLG89cigxNDkpO3QuUGF0dGVybj1jbGFzc3tjb25zdHJ1Y3RvcigpeygwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBQYXR0ZXJuLiIpfXN0YXRpYyBwYXJzZVNoYWRpbmcoZSx0LHIsaSxzKXtjb25zdCBjPWUgaW5zdGFuY2VvZiBhLkJhc2VTdHJlYW0/ZS5kaWN0OmUsaD1jLmdldCgiU2hhZGluZ1R5cGUiKTt0cnl7c3dpdGNoKGgpe2Nhc2UgMjpjYXNlIDM6cmV0dXJuIG5ldyBsKGMsdCxyLGkscyk7Y2FzZSA0OmNhc2UgNTpjYXNlIDY6Y2FzZSA3OnJldHVybiBuZXcgZChlLHQscixpLHMpO2RlZmF1bHQ6dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVuc3VwcG9ydGVkIFNoYWRpbmdUeXBlOiAiK2gpfX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygby5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlO3JldHVybigwLG4ud2FybikoZSksbmV3IGZ9fX07Y2xhc3MgY3tjb25zdHJ1Y3Rvcigpe3RoaXMuY29uc3RydWN0b3I9PT1jJiYoMCxuLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmcuIil9Z2V0SVIoKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRJUmAgY2FsbGVkLiIpfX1pKGMsIlNNQUxMX05VTUJFUiIsMWUtNik7Y2xhc3MgbCBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSx0LHIsYSxpKXtzdXBlcigpLHRoaXMuY29vcmRzQXJyPWUuZ2V0QXJyYXkoIkNvb3JkcyIpLHRoaXMuc2hhZGluZ1R5cGU9ZS5nZXQoIlNoYWRpbmdUeXBlIik7Y29uc3Qgbz1zLkNvbG9yU3BhY2UucGFyc2Uoe2NzOmUuZ2V0UmF3KCJDUyIpfHxlLmdldFJhdygiQ29sb3JTcGFjZSIpLHhyZWY6dCxyZXNvdXJjZXM6cixwZGZGdW5jdGlvbkZhY3Rvcnk6YSxsb2NhbENvbG9yU3BhY2VDYWNoZTppfSksbD1lLmdldEFycmF5KCJCQm94Iik7dGhpcy5iYm94PUFycmF5LmlzQXJyYXkobCkmJjQ9PT1sLmxlbmd0aD9uLlV0aWwubm9ybWFsaXplUmVjdChsKTpudWxsO2xldCBoPTAsdT0xO2lmKGUuaGFzKCJEb21haW4iKSl7Y29uc3QgdD1lLmdldEFycmF5KCJEb21haW4iKTtoPXRbMF0sdT10WzFdfWxldCBkPSExLGY9ITE7aWYoZS5oYXMoIkV4dGVuZCIpKXtjb25zdCB0PWUuZ2V0QXJyYXkoIkV4dGVuZCIpO2Q9dFswXSxmPXRbMV19aWYoISgzIT09dGhpcy5zaGFkaW5nVHlwZXx8ZCYmZikpe2NvbnN0W2UsdCxyLGEsaSxzXT10aGlzLmNvb3Jkc0FycixvPU1hdGguaHlwb3QoZS1hLHQtaSk7cjw9cytvJiZzPD1yK28mJigwLG4ud2FybikoIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC4iKX10aGlzLmV4dGVuZFN0YXJ0PWQsdGhpcy5leHRlbmRFbmQ9Zjtjb25zdCBnPWUuZ2V0UmF3KCJGdW5jdGlvbiIpLHA9YS5jcmVhdGVGcm9tQXJyYXkoZyksbT0odS1oKS84NDAsYj10aGlzLmNvbG9yU3RvcHM9W107aWYoaD49dXx8bTw9MClyZXR1cm4gdm9pZCgwLG4uaW5mbykoIkJhZCBzaGFkaW5nIGRvbWFpbi4iKTtjb25zdCB5PW5ldyBGbG9hdDMyQXJyYXkoby5udW1Db21wcyksdz1uZXcgRmxvYXQzMkFycmF5KDEpO2xldCB2LHg9MDt3WzBdPWgscCh3LDAseSwwKTtsZXQgUz1vLmdldFJnYih5LDApO2NvbnN0IEE9bi5VdGlsLm1ha2VIZXhDb2xvcihTWzBdLFNbMV0sU1syXSk7Yi5wdXNoKFswLEFdKTtsZXQgaz0xO3dbMF09aCttLHAodywwLHksMCk7bGV0IEM9by5nZXRSZ2IoeSwwKSxPPUNbMF0tU1swXSsxLEY9Q1sxXS1TWzFdKzEsST1DWzJdLVNbMl0rMSxUPUNbMF0tU1swXS0xLE09Q1sxXS1TWzFdLTEsRT1DWzJdLVNbMl0tMTtmb3IobGV0IGU9MjtlPDg0MDtlKyspe3dbMF09aCtlKm0scCh3LDAseSwwKSx2PW8uZ2V0UmdiKHksMCk7Y29uc3QgdD1lLXg7aWYoTz1NYXRoLm1pbihPLCh2WzBdLVNbMF0rMSkvdCksRj1NYXRoLm1pbihGLCh2WzFdLVNbMV0rMSkvdCksST1NYXRoLm1pbihJLCh2WzJdLVNbMl0rMSkvdCksVD1NYXRoLm1heChULCh2WzBdLVNbMF0tMSkvdCksTT1NYXRoLm1heChNLCh2WzFdLVNbMV0tMSkvdCksRT1NYXRoLm1heChFLCh2WzJdLVNbMl0tMSkvdCksIShUPD1PJiZNPD1GJiZFPD1JKSl7Y29uc3QgZT1uLlV0aWwubWFrZUhleENvbG9yKENbMF0sQ1sxXSxDWzJdKTtiLnB1c2goW2svODQwLGVdKSxPPXZbMF0tQ1swXSsxLEY9dlsxXS1DWzFdKzEsST12WzJdLUNbMl0rMSxUPXZbMF0tQ1swXS0xLE09dlsxXS1DWzFdLTEsRT12WzJdLUNbMl0tMSx4PWssUz1DfWs9ZSxDPXZ9Y29uc3QgUD1uLlV0aWwubWFrZUhleENvbG9yKENbMF0sQ1sxXSxDWzJdKTtiLnB1c2goWzEsUF0pO2xldCBSPSJ0cmFuc3BhcmVudCI7ZS5oYXMoIkJhY2tncm91bmQiKSYmKHY9by5nZXRSZ2IoZS5nZXQoIkJhY2tncm91bmQiKSwwKSxSPW4uVXRpbC5tYWtlSGV4Q29sb3IodlswXSx2WzFdLHZbMl0pKSxkfHwoYi51bnNoaWZ0KFswLFJdKSxiWzFdWzBdKz1jLlNNQUxMX05VTUJFUiksZnx8KGIuYXQoLTEpWzBdLT1jLlNNQUxMX05VTUJFUixiLnB1c2goWzEsUl0pKSx0aGlzLmNvbG9yU3RvcHM9Yn1nZXRJUigpe2NvbnN0IGU9dGhpcy5jb29yZHNBcnIsdD10aGlzLnNoYWRpbmdUeXBlO2xldCByLGEsaSxzLG87cmV0dXJuIDI9PT10PyhhPVtlWzBdLGVbMV1dLGk9W2VbMl0sZVszXV0scz1udWxsLG89bnVsbCxyPSJheGlhbCIpOjM9PT10PyhhPVtlWzBdLGVbMV1dLGk9W2VbM10sZVs0XV0scz1lWzJdLG89ZVs1XSxyPSJyYWRpYWwiKTooMCxuLnVucmVhY2hhYmxlKSgiZ2V0UGF0dGVybiB0eXBlIHVua25vd246ICIuY29uY2F0KHQpKSxbIlJhZGlhbEF4aWFsIixyLHRoaXMuYmJveCx0aGlzLmNvbG9yU3RvcHMsYSxpLHMsb119fWNsYXNzIGh7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnN0cmVhbT1lLHRoaXMuY29udGV4dD10LHRoaXMuYnVmZmVyPTAsdGhpcy5idWZmZXJMZW5ndGg9MDtjb25zdCByPXQubnVtQ29tcHM7dGhpcy50bXBDb21wc0J1Zj1uZXcgRmxvYXQzMkFycmF5KHIpO2NvbnN0IG49dC5jb2xvclNwYWNlLm51bUNvbXBzO3RoaXMudG1wQ3NDb21wc0J1Zj10LmNvbG9yRm4/bmV3IEZsb2F0MzJBcnJheShuKTp0aGlzLnRtcENvbXBzQnVmfWdldCBoYXNEYXRhKCl7aWYodGhpcy5zdHJlYW0uZW5kKXJldHVybiB0aGlzLnN0cmVhbS5wb3M8dGhpcy5zdHJlYW0uZW5kO2lmKHRoaXMuYnVmZmVyTGVuZ3RoPjApcmV0dXJuITA7Y29uc3QgZT10aGlzLnN0cmVhbS5nZXRCeXRlKCk7cmV0dXJuIShlPDB8fCh0aGlzLmJ1ZmZlcj1lLHRoaXMuYnVmZmVyTGVuZ3RoPTgsMCkpfXJlYWRCaXRzKGUpe2xldCB0PXRoaXMuYnVmZmVyLHI9dGhpcy5idWZmZXJMZW5ndGg7aWYoMzI9PT1lKXtpZigwPT09cilyZXR1cm4odGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpPDwyNHx0aGlzLnN0cmVhbS5nZXRCeXRlKCk8PDE2fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTw8OHx0aGlzLnN0cmVhbS5nZXRCeXRlKCkpPj4+MDt0PXQ8PDI0fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTw8MTZ8dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpPDw4fHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtjb25zdCBlPXRoaXMuc3RyZWFtLmdldEJ5dGUoKTtyZXR1cm4gdGhpcy5idWZmZXI9ZSYoMTw8ciktMSwodDw8OC1yfCgyNTUmZSk+PnIpPj4+MH1pZig4PT09ZSYmMD09PXIpcmV0dXJuIHRoaXMuc3RyZWFtLmdldEJ5dGUoKTtmb3IoO3I8ZTspdD10PDw4fHRoaXMuc3RyZWFtLmdldEJ5dGUoKSxyKz04O3JldHVybiByLT1lLHRoaXMuYnVmZmVyTGVuZ3RoPXIsdGhpcy5idWZmZXI9dCYoMTw8ciktMSx0Pj5yfWFsaWduKCl7dGhpcy5idWZmZXI9MCx0aGlzLmJ1ZmZlckxlbmd0aD0wfXJlYWRGbGFnKCl7cmV0dXJuIHRoaXMucmVhZEJpdHModGhpcy5jb250ZXh0LmJpdHNQZXJGbGFnKX1yZWFkQ29vcmRpbmF0ZSgpe2NvbnN0IGU9dGhpcy5jb250ZXh0LmJpdHNQZXJDb29yZGluYXRlLHQ9dGhpcy5yZWFkQml0cyhlKSxyPXRoaXMucmVhZEJpdHMoZSksbj10aGlzLmNvbnRleHQuZGVjb2RlLGE9ZTwzMj8xLygoMTw8ZSktMSk6Mi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDtyZXR1cm5bdCphKihuWzFdLW5bMF0pK25bMF0sciphKihuWzNdLW5bMl0pK25bMl1dfXJlYWRDb21wb25lbnRzKCl7Y29uc3QgZT10aGlzLmNvbnRleHQubnVtQ29tcHMsdD10aGlzLmNvbnRleHQuYml0c1BlckNvbXBvbmVudCxyPXQ8MzI/MS8oKDE8PHQpLTEpOjIuMzI4MzA2NDM2NTM4Njk2M2UtMTAsbj10aGlzLmNvbnRleHQuZGVjb2RlLGE9dGhpcy50bXBDb21wc0J1Zjtmb3IobGV0IGk9MCxzPTQ7aTxlO2krKyxzKz0yKXtjb25zdCBlPXRoaXMucmVhZEJpdHModCk7YVtpXT1lKnIqKG5bcysxXS1uW3NdKStuW3NdfWNvbnN0IGk9dGhpcy50bXBDc0NvbXBzQnVmO3JldHVybiB0aGlzLmNvbnRleHQuY29sb3JGbiYmdGhpcy5jb250ZXh0LmNvbG9yRm4oYSwwLGksMCksdGhpcy5jb250ZXh0LmNvbG9yU3BhY2UuZ2V0UmdiKGksMCl9fWNvbnN0IHU9ZnVuY3Rpb24oKXtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfHwoZVt0XT1mdW5jdGlvbihlKXtjb25zdCB0PVtdO2ZvcihsZXQgcj0wO3I8PWU7cisrKXtjb25zdCBuPXIvZSxhPTEtbjt0LnB1c2gobmV3IEZsb2F0MzJBcnJheShbYSphKmEsMypuKmEqYSwzKm4qbiphLG4qbipuXSkpfXJldHVybiB0fSh0KSl9fSgpO2NsYXNzIGQgZXh0ZW5kcyBje2NvbnN0cnVjdG9yKGUsdCxyLGksbyl7aWYoc3VwZXIoKSwhKGUgaW5zdGFuY2VvZiBhLkJhc2VTdHJlYW0pKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJNZXNoIGRhdGEgaXMgbm90IGEgc3RyZWFtIik7Y29uc3QgYz1lLmRpY3Q7dGhpcy5zaGFkaW5nVHlwZT1jLmdldCgiU2hhZGluZ1R5cGUiKTtjb25zdCBsPWMuZ2V0QXJyYXkoIkJCb3giKTt0aGlzLmJib3g9QXJyYXkuaXNBcnJheShsKSYmND09PWwubGVuZ3RoP24uVXRpbC5ub3JtYWxpemVSZWN0KGwpOm51bGw7Y29uc3QgdT1zLkNvbG9yU3BhY2UucGFyc2Uoe2NzOmMuZ2V0UmF3KCJDUyIpfHxjLmdldFJhdygiQ29sb3JTcGFjZSIpLHhyZWY6dCxyZXNvdXJjZXM6cixwZGZGdW5jdGlvbkZhY3Rvcnk6aSxsb2NhbENvbG9yU3BhY2VDYWNoZTpvfSk7dGhpcy5iYWNrZ3JvdW5kPWMuaGFzKCJCYWNrZ3JvdW5kIik/dS5nZXRSZ2IoYy5nZXQoIkJhY2tncm91bmQiKSwwKTpudWxsO2NvbnN0IGQ9Yy5nZXRSYXcoIkZ1bmN0aW9uIiksZj1kP2kuY3JlYXRlRnJvbUFycmF5KGQpOm51bGw7dGhpcy5jb29yZHM9W10sdGhpcy5jb2xvcnM9W10sdGhpcy5maWd1cmVzPVtdO2NvbnN0IGc9e2JpdHNQZXJDb29yZGluYXRlOmMuZ2V0KCJCaXRzUGVyQ29vcmRpbmF0ZSIpLGJpdHNQZXJDb21wb25lbnQ6Yy5nZXQoIkJpdHNQZXJDb21wb25lbnQiKSxiaXRzUGVyRmxhZzpjLmdldCgiQml0c1BlckZsYWciKSxkZWNvZGU6Yy5nZXRBcnJheSgiRGVjb2RlIiksY29sb3JGbjpmLGNvbG9yU3BhY2U6dSxudW1Db21wczpmPzE6dS5udW1Db21wc30scD1uZXcgaChlLGcpO2xldCBtPSExO3N3aXRjaCh0aGlzLnNoYWRpbmdUeXBlKXtjYXNlIDQ6dGhpcy5fZGVjb2RlVHlwZTRTaGFkaW5nKHApO2JyZWFrO2Nhc2UgNTpjb25zdCBlPTB8Yy5nZXQoIlZlcnRpY2VzUGVyUm93Iik7aWYoZTwyKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIFZlcnRpY2VzUGVyUm93Iik7dGhpcy5fZGVjb2RlVHlwZTVTaGFkaW5nKHAsZSk7YnJlYWs7Y2FzZSA2OnRoaXMuX2RlY29kZVR5cGU2U2hhZGluZyhwKSxtPSEwO2JyZWFrO2Nhc2UgNzp0aGlzLl9kZWNvZGVUeXBlN1NoYWRpbmcocCksbT0hMDticmVhaztkZWZhdWx0OigwLG4udW5yZWFjaGFibGUpKCJVbnN1cHBvcnRlZCBtZXNoIHR5cGUuIil9aWYobSl7dGhpcy5fdXBkYXRlQm91bmRzKCk7Zm9yKGxldCBlPTAsdD10aGlzLmZpZ3VyZXMubGVuZ3RoO2U8dDtlKyspdGhpcy5fYnVpbGRGaWd1cmVGcm9tUGF0Y2goZSl9dGhpcy5fdXBkYXRlQm91bmRzKCksdGhpcy5fcGFja0RhdGEoKX1fZGVjb2RlVHlwZTRTaGFkaW5nKGUpe2NvbnN0IHQ9dGhpcy5jb29yZHMscj10aGlzLmNvbG9ycyxhPVtdLGk9W107bGV0IHM9MDtmb3IoO2UuaGFzRGF0YTspe2NvbnN0IG89ZS5yZWFkRmxhZygpLGM9ZS5yZWFkQ29vcmRpbmF0ZSgpLGw9ZS5yZWFkQ29tcG9uZW50cygpO2lmKDA9PT1zKXtpZighKDA8PW8mJm88PTIpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU0IGZsYWciKTtzd2l0Y2gobyl7Y2FzZSAwOnM9MzticmVhaztjYXNlIDE6aS5wdXNoKGkuYXQoLTIpLGkuYXQoLTEpKSxzPTE7YnJlYWs7Y2FzZSAyOmkucHVzaChpLmF0KC0zKSxpLmF0KC0xKSkscz0xfWEucHVzaChvKX1pLnB1c2godC5sZW5ndGgpLHQucHVzaChjKSxyLnB1c2gobCkscy0tLGUuYWxpZ24oKX10aGlzLmZpZ3VyZXMucHVzaCh7dHlwZToidHJpYW5nbGVzIixjb29yZHM6bmV3IEludDMyQXJyYXkoaSksY29sb3JzOm5ldyBJbnQzMkFycmF5KGkpfSl9X2RlY29kZVR5cGU1U2hhZGluZyhlLHQpe2NvbnN0IHI9dGhpcy5jb29yZHMsbj10aGlzLmNvbG9ycyxhPVtdO2Zvcig7ZS5oYXNEYXRhOyl7Y29uc3QgdD1lLnJlYWRDb29yZGluYXRlKCksaT1lLnJlYWRDb21wb25lbnRzKCk7YS5wdXNoKHIubGVuZ3RoKSxyLnB1c2godCksbi5wdXNoKGkpfXRoaXMuZmlndXJlcy5wdXNoKHt0eXBlOiJsYXR0aWNlIixjb29yZHM6bmV3IEludDMyQXJyYXkoYSksY29sb3JzOm5ldyBJbnQzMkFycmF5KGEpLHZlcnRpY2VzUGVyUm93OnR9KX1fZGVjb2RlVHlwZTZTaGFkaW5nKGUpe2NvbnN0IHQ9dGhpcy5jb29yZHMscj10aGlzLmNvbG9ycyxhPW5ldyBJbnQzMkFycmF5KDE2KSxpPW5ldyBJbnQzMkFycmF5KDQpO2Zvcig7ZS5oYXNEYXRhOyl7Y29uc3Qgcz1lLnJlYWRGbGFnKCk7aWYoISgwPD1zJiZzPD0zKSl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNiBmbGFnIik7Y29uc3Qgbz10Lmxlbmd0aDtmb3IobGV0IHI9MCxuPTAhPT1zPzg6MTI7cjxuO3IrKyl0LnB1c2goZS5yZWFkQ29vcmRpbmF0ZSgpKTtjb25zdCBjPXIubGVuZ3RoO2ZvcihsZXQgdD0wLG49MCE9PXM/Mjo0O3Q8bjt0Kyspci5wdXNoKGUucmVhZENvbXBvbmVudHMoKSk7bGV0IGwsaCx1LGQ7c3dpdGNoKHMpe2Nhc2UgMDphWzEyXT1vKzMsYVsxM109bys0LGFbMTRdPW8rNSxhWzE1XT1vKzYsYVs4XT1vKzIsYVsxMV09bys3LGFbNF09bysxLGFbN109bys4LGFbMF09byxhWzFdPW8rMTEsYVsyXT1vKzEwLGFbM109bys5LGlbMl09YysxLGlbM109YysyLGlbMF09YyxpWzFdPWMrMzticmVhaztjYXNlIDE6bD1hWzEyXSxoPWFbMTNdLHU9YVsxNF0sZD1hWzE1XSxhWzEyXT1kLGFbMTNdPW8rMCxhWzE0XT1vKzEsYVsxNV09bysyLGFbOF09dSxhWzExXT1vKzMsYVs0XT1oLGFbN109bys0LGFbMF09bCxhWzFdPW8rNyxhWzJdPW8rNixhWzNdPW8rNSxsPWlbMl0saD1pWzNdLGlbMl09aCxpWzNdPWMsaVswXT1sLGlbMV09YysxO2JyZWFrO2Nhc2UgMjpsPWFbMTVdLGg9YVsxMV0sYVsxMl09YVszXSxhWzEzXT1vKzAsYVsxNF09bysxLGFbMTVdPW8rMixhWzhdPWFbN10sYVsxMV09byszLGFbNF09aCxhWzddPW8rNCxhWzBdPWwsYVsxXT1vKzcsYVsyXT1vKzYsYVszXT1vKzUsbD1pWzNdLGlbMl09aVsxXSxpWzNdPWMsaVswXT1sLGlbMV09YysxO2JyZWFrO2Nhc2UgMzphWzEyXT1hWzBdLGFbMTNdPW8rMCxhWzE0XT1vKzEsYVsxNV09bysyLGFbOF09YVsxXSxhWzExXT1vKzMsYVs0XT1hWzJdLGFbN109bys0LGFbMF09YVszXSxhWzFdPW8rNyxhWzJdPW8rNixhWzNdPW8rNSxpWzJdPWlbMF0saVszXT1jLGlbMF09aVsxXSxpWzFdPWMrMX1hWzVdPXQubGVuZ3RoLHQucHVzaChbKC00KnRbYVswXV1bMF0tdFthWzE1XV1bMF0rNioodFthWzRdXVswXSt0W2FbMV1dWzBdKS0yKih0W2FbMTJdXVswXSt0W2FbM11dWzBdKSszKih0W2FbMTNdXVswXSt0W2FbN11dWzBdKSkvOSwoLTQqdFthWzBdXVsxXS10W2FbMTVdXVsxXSs2Kih0W2FbNF1dWzFdK3RbYVsxXV1bMV0pLTIqKHRbYVsxMl1dWzFdK3RbYVszXV1bMV0pKzMqKHRbYVsxM11dWzFdK3RbYVs3XV1bMV0pKS85XSksYVs2XT10Lmxlbmd0aCx0LnB1c2goWygtNCp0W2FbM11dWzBdLXRbYVsxMl1dWzBdKzYqKHRbYVsyXV1bMF0rdFthWzddXVswXSktMioodFthWzBdXVswXSt0W2FbMTVdXVswXSkrMyoodFthWzRdXVswXSt0W2FbMTRdXVswXSkpLzksKC00KnRbYVszXV1bMV0tdFthWzEyXV1bMV0rNioodFthWzJdXVsxXSt0W2FbN11dWzFdKS0yKih0W2FbMF1dWzFdK3RbYVsxNV1dWzFdKSszKih0W2FbNF1dWzFdK3RbYVsxNF1dWzFdKSkvOV0pLGFbOV09dC5sZW5ndGgsdC5wdXNoKFsoLTQqdFthWzEyXV1bMF0tdFthWzNdXVswXSs2Kih0W2FbOF1dWzBdK3RbYVsxM11dWzBdKS0yKih0W2FbMF1dWzBdK3RbYVsxNV1dWzBdKSszKih0W2FbMTFdXVswXSt0W2FbMV1dWzBdKSkvOSwoLTQqdFthWzEyXV1bMV0tdFthWzNdXVsxXSs2Kih0W2FbOF1dWzFdK3RbYVsxM11dWzFdKS0yKih0W2FbMF1dWzFdK3RbYVsxNV1dWzFdKSszKih0W2FbMTFdXVsxXSt0W2FbMV1dWzFdKSkvOV0pLGFbMTBdPXQubGVuZ3RoLHQucHVzaChbKC00KnRbYVsxNV1dWzBdLXRbYVswXV1bMF0rNioodFthWzExXV1bMF0rdFthWzE0XV1bMF0pLTIqKHRbYVsxMl1dWzBdK3RbYVszXV1bMF0pKzMqKHRbYVsyXV1bMF0rdFthWzhdXVswXSkpLzksKC00KnRbYVsxNV1dWzFdLXRbYVswXV1bMV0rNioodFthWzExXV1bMV0rdFthWzE0XV1bMV0pLTIqKHRbYVsxMl1dWzFdK3RbYVszXV1bMV0pKzMqKHRbYVsyXV1bMV0rdFthWzhdXVsxXSkpLzldKSx0aGlzLmZpZ3VyZXMucHVzaCh7dHlwZToicGF0Y2giLGNvb3JkczpuZXcgSW50MzJBcnJheShhKSxjb2xvcnM6bmV3IEludDMyQXJyYXkoaSl9KX19X2RlY29kZVR5cGU3U2hhZGluZyhlKXtjb25zdCB0PXRoaXMuY29vcmRzLHI9dGhpcy5jb2xvcnMsYT1uZXcgSW50MzJBcnJheSgxNiksaT1uZXcgSW50MzJBcnJheSg0KTtmb3IoO2UuaGFzRGF0YTspe2NvbnN0IHM9ZS5yZWFkRmxhZygpO2lmKCEoMDw9cyYmczw9MykpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZTcgZmxhZyIpO2NvbnN0IG89dC5sZW5ndGg7Zm9yKGxldCByPTAsbj0wIT09cz8xMjoxNjtyPG47cisrKXQucHVzaChlLnJlYWRDb29yZGluYXRlKCkpO2NvbnN0IGM9ci5sZW5ndGg7Zm9yKGxldCB0PTAsbj0wIT09cz8yOjQ7dDxuO3QrKylyLnB1c2goZS5yZWFkQ29tcG9uZW50cygpKTtsZXQgbCxoLHUsZDtzd2l0Y2gocyl7Y2FzZSAwOmFbMTJdPW8rMyxhWzEzXT1vKzQsYVsxNF09bys1LGFbMTVdPW8rNixhWzhdPW8rMixhWzldPW8rMTMsYVsxMF09bysxNCxhWzExXT1vKzcsYVs0XT1vKzEsYVs1XT1vKzEyLGFbNl09bysxNSxhWzddPW8rOCxhWzBdPW8sYVsxXT1vKzExLGFbMl09bysxMCxhWzNdPW8rOSxpWzJdPWMrMSxpWzNdPWMrMixpWzBdPWMsaVsxXT1jKzM7YnJlYWs7Y2FzZSAxOmw9YVsxMl0saD1hWzEzXSx1PWFbMTRdLGQ9YVsxNV0sYVsxMl09ZCxhWzEzXT1vKzAsYVsxNF09bysxLGFbMTVdPW8rMixhWzhdPXUsYVs5XT1vKzksYVsxMF09bysxMCxhWzExXT1vKzMsYVs0XT1oLGFbNV09bys4LGFbNl09bysxMSxhWzddPW8rNCxhWzBdPWwsYVsxXT1vKzcsYVsyXT1vKzYsYVszXT1vKzUsbD1pWzJdLGg9aVszXSxpWzJdPWgsaVszXT1jLGlbMF09bCxpWzFdPWMrMTticmVhaztjYXNlIDI6bD1hWzE1XSxoPWFbMTFdLGFbMTJdPWFbM10sYVsxM109byswLGFbMTRdPW8rMSxhWzE1XT1vKzIsYVs4XT1hWzddLGFbOV09bys5LGFbMTBdPW8rMTAsYVsxMV09byszLGFbNF09aCxhWzVdPW8rOCxhWzZdPW8rMTEsYVs3XT1vKzQsYVswXT1sLGFbMV09bys3LGFbMl09bys2LGFbM109bys1LGw9aVszXSxpWzJdPWlbMV0saVszXT1jLGlbMF09bCxpWzFdPWMrMTticmVhaztjYXNlIDM6YVsxMl09YVswXSxhWzEzXT1vKzAsYVsxNF09bysxLGFbMTVdPW8rMixhWzhdPWFbMV0sYVs5XT1vKzksYVsxMF09bysxMCxhWzExXT1vKzMsYVs0XT1hWzJdLGFbNV09bys4LGFbNl09bysxMSxhWzddPW8rNCxhWzBdPWFbM10sYVsxXT1vKzcsYVsyXT1vKzYsYVszXT1vKzUsaVsyXT1pWzBdLGlbM109YyxpWzBdPWlbMV0saVsxXT1jKzF9dGhpcy5maWd1cmVzLnB1c2goe3R5cGU6InBhdGNoIixjb29yZHM6bmV3IEludDMyQXJyYXkoYSksY29sb3JzOm5ldyBJbnQzMkFycmF5KGkpfSl9fV9idWlsZEZpZ3VyZUZyb21QYXRjaChlKXtjb25zdCB0PXRoaXMuZmlndXJlc1tlXTsoMCxuLmFzc2VydCkoInBhdGNoIj09PXQudHlwZSwiVW5leHBlY3RlZCBwYXRjaCBtZXNoIGZpZ3VyZSIpO2NvbnN0IHI9dGhpcy5jb29yZHMsYT10aGlzLmNvbG9ycyxpPXQuY29vcmRzLHM9dC5jb2xvcnMsbz1NYXRoLm1pbihyW2lbMF1dWzBdLHJbaVszXV1bMF0scltpWzEyXV1bMF0scltpWzE1XV1bMF0pLGM9TWF0aC5taW4ocltpWzBdXVsxXSxyW2lbM11dWzFdLHJbaVsxMl1dWzFdLHJbaVsxNV1dWzFdKSxsPU1hdGgubWF4KHJbaVswXV1bMF0scltpWzNdXVswXSxyW2lbMTJdXVswXSxyW2lbMTVdXVswXSksaD1NYXRoLm1heChyW2lbMF1dWzFdLHJbaVszXV1bMV0scltpWzEyXV1bMV0scltpWzE1XV1bMV0pO2xldCBmPU1hdGguY2VpbCgobC1vKSpkLlRSSUFOR0xFX0RFTlNJVFkvKHRoaXMuYm91bmRzWzJdLXRoaXMuYm91bmRzWzBdKSk7Zj1NYXRoLm1heChkLk1JTl9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULE1hdGgubWluKGQuTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsZikpO2xldCBnPU1hdGguY2VpbCgoaC1jKSpkLlRSSUFOR0xFX0RFTlNJVFkvKHRoaXMuYm91bmRzWzNdLXRoaXMuYm91bmRzWzFdKSk7Zz1NYXRoLm1heChkLk1JTl9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULE1hdGgubWluKGQuTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsZykpO2NvbnN0IHA9ZisxLG09bmV3IEludDMyQXJyYXkoKGcrMSkqcCksYj1uZXcgSW50MzJBcnJheSgoZysxKSpwKTtsZXQgeT0wO2NvbnN0IHc9bmV3IFVpbnQ4QXJyYXkoMyksdj1uZXcgVWludDhBcnJheSgzKSx4PWFbc1swXV0sUz1hW3NbMV1dLEE9YVtzWzJdXSxrPWFbc1szXV0sQz11KGcpLE89dShmKTtmb3IobGV0IGU9MDtlPD1nO2UrKyl7d1swXT0oeFswXSooZy1lKStBWzBdKmUpL2d8MCx3WzFdPSh4WzFdKihnLWUpK0FbMV0qZSkvZ3wwLHdbMl09KHhbMl0qKGctZSkrQVsyXSplKS9nfDAsdlswXT0oU1swXSooZy1lKStrWzBdKmUpL2d8MCx2WzFdPShTWzFdKihnLWUpK2tbMV0qZSkvZ3wwLHZbMl09KFNbMl0qKGctZSkra1syXSplKS9nfDA7Zm9yKGxldCB0PTA7dDw9Zjt0KysseSsrKXtpZighKDAhPT1lJiZlIT09Z3x8MCE9PXQmJnQhPT1mKSljb250aW51ZTtsZXQgbj0wLHM9MCxvPTA7Zm9yKGxldCBhPTA7YTw9MzthKyspZm9yKGxldCBjPTA7Yzw9MztjKyssbysrKXtjb25zdCBsPUNbZV1bYV0qT1t0XVtjXTtuKz1yW2lbb11dWzBdKmwscys9cltpW29dXVsxXSpsfW1beV09ci5sZW5ndGgsci5wdXNoKFtuLHNdKSxiW3ldPWEubGVuZ3RoO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoMyk7Y1swXT0od1swXSooZi10KSt2WzBdKnQpL2Z8MCxjWzFdPSh3WzFdKihmLXQpK3ZbMV0qdCkvZnwwLGNbMl09KHdbMl0qKGYtdCkrdlsyXSp0KS9mfDAsYS5wdXNoKGMpfX1tWzBdPWlbMF0sYlswXT1zWzBdLG1bZl09aVszXSxiW2ZdPXNbMV0sbVtwKmddPWlbMTJdLGJbcCpnXT1zWzJdLG1bcCpnK2ZdPWlbMTVdLGJbcCpnK2ZdPXNbM10sdGhpcy5maWd1cmVzW2VdPXt0eXBlOiJsYXR0aWNlIixjb29yZHM6bSxjb2xvcnM6Yix2ZXJ0aWNlc1BlclJvdzpwfX1fdXBkYXRlQm91bmRzKCl7bGV0IGU9dGhpcy5jb29yZHNbMF1bMF0sdD10aGlzLmNvb3Jkc1swXVsxXSxyPWUsbj10O2ZvcihsZXQgYT0xLGk9dGhpcy5jb29yZHMubGVuZ3RoO2E8aTthKyspe2NvbnN0IGk9dGhpcy5jb29yZHNbYV1bMF0scz10aGlzLmNvb3Jkc1thXVsxXTtlPWU+aT9pOmUsdD10PnM/czp0LHI9cjxpP2k6cixuPW48cz9zOm59dGhpcy5ib3VuZHM9W2UsdCxyLG5dfV9wYWNrRGF0YSgpe2xldCBlLHQscixuO2NvbnN0IGE9dGhpcy5jb29yZHMsaT1uZXcgRmxvYXQzMkFycmF5KDIqYS5sZW5ndGgpO2ZvcihlPTAscj0wLHQ9YS5sZW5ndGg7ZTx0O2UrKyl7Y29uc3QgdD1hW2VdO2lbcisrXT10WzBdLGlbcisrXT10WzFdfXRoaXMuY29vcmRzPWk7Y29uc3Qgcz10aGlzLmNvbG9ycyxvPW5ldyBVaW50OEFycmF5KDMqcy5sZW5ndGgpO2ZvcihlPTAscj0wLHQ9cy5sZW5ndGg7ZTx0O2UrKyl7Y29uc3QgdD1zW2VdO29bcisrXT10WzBdLG9bcisrXT10WzFdLG9bcisrXT10WzJdfXRoaXMuY29sb3JzPW87Y29uc3QgYz10aGlzLmZpZ3VyZXM7Zm9yKGU9MCx0PWMubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHQ9Y1tlXSxhPXQuY29vcmRzLGk9dC5jb2xvcnM7Zm9yKHI9MCxuPWEubGVuZ3RoO3I8bjtyKyspYVtyXSo9MixpW3JdKj0zfX1nZXRJUigpe3JldHVyblsiTWVzaCIsdGhpcy5zaGFkaW5nVHlwZSx0aGlzLmNvb3Jkcyx0aGlzLmNvbG9ycyx0aGlzLmZpZ3VyZXMsdGhpcy5ib3VuZHMsdGhpcy5iYm94LHRoaXMuYmFja2dyb3VuZF19fWkoZCwiTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQiLDMpLGkoZCwiTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQiLDIwKSxpKGQsIlRSSUFOR0xFX0RFTlNJVFkiLDIwKTtjbGFzcyBmIGV4dGVuZHMgY3tnZXRJUigpe3JldHVyblsiRHVtbXkiXX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZ2V0WGZhRm9udERpY3Q9ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PWQoZSk7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3R7YmFzZVdpZHRoczpyLGJhc2VNYXBwaW5nOm4sZmFjdG9yczphfT10LGk9YT9yLm1hcCgoKGUsdCk9PmUqYVt0XSkpOnI7bGV0IHMsbz0tMjtjb25zdCBjPVtdO2Zvcihjb25zdFtlLHRdb2Ygbi5tYXAoKChlLHQpPT5bZSx0XSkpLnNvcnQoKChlLHQpPT57bGV0W3JdPWUsW25dPXQ7cmV0dXJuIHItbn0pKSktMSE9PWUmJihlPT09bysxPyhzLnB1c2goaVt0XSksbys9MSk6KG89ZSxzPVtpW3RdXSxjLnB1c2goZSxzKSkpO3JldHVybiBjfShlKSxyPW5ldyBhLkRpY3QobnVsbCk7ci5zZXQoIkJhc2VGb250IixhLk5hbWUuZ2V0KGUpKSxyLnNldCgiVHlwZSIsYS5OYW1lLmdldCgiRm9udCIpKSxyLnNldCgiU3VidHlwZSIsYS5OYW1lLmdldCgiQ0lERm9udFR5cGUyIikpLHIuc2V0KCJFbmNvZGluZyIsYS5OYW1lLmdldCgiSWRlbnRpdHktSCIpKSxyLnNldCgiQ0lEVG9HSURNYXAiLGEuTmFtZS5nZXQoIklkZW50aXR5IikpLHIuc2V0KCJXIix0KSxyLnNldCgiRmlyc3RDaGFyIix0WzBdKSxyLnNldCgiTGFzdENoYXIiLHQuYXQoLTIpK3QuYXQoLTEpLmxlbmd0aC0xKTtjb25zdCBuPW5ldyBhLkRpY3QobnVsbCk7ci5zZXQoIkZvbnREZXNjcmlwdG9yIixuKTtjb25zdCBpPW5ldyBhLkRpY3QobnVsbCk7cmV0dXJuIGkuc2V0KCJPcmRlcmluZyIsIklkZW50aXR5IiksaS5zZXQoIlJlZ2lzdHJ5IiwiQWRvYmUiKSxpLnNldCgiU3VwcGxlbWVudCIsMCksci5zZXQoIkNJRFN5c3RlbUluZm8iLGkpLHJ9LHQuZ2V0WGZhRm9udE5hbWU9ZCxyKDEzOSk7dmFyIG49cigyMDIpLGE9cigxNTApLGk9cigyMDMpLHM9cigyMDQpLG89cigyMDUpLGM9cigyMDYpLGw9cigxNDkpLGg9cigxODgpO2NvbnN0IHU9KDAsbC5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKChmdW5jdGlvbihlKXtlWyJNeXJpYWRQcm8tUmVndWxhciJdPWVbIlBkZkpTLUZhbGxiYWNrLVJlZ3VsYXIiXT17bmFtZToiTGliZXJhdGlvblNhbnMtUmVndWxhciIsZmFjdG9yczpvLk15cmlhZFByb1JlZ3VsYXJGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nLG1ldHJpY3M6by5NeXJpYWRQcm9SZWd1bGFyTWV0cmljc30sZVsiTXlyaWFkUHJvLUJvbGQiXT1lWyJQZGZKUy1GYWxsYmFjay1Cb2xkIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUJvbGQiLGZhY3RvcnM6by5NeXJpYWRQcm9Cb2xkRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZyxtZXRyaWNzOm8uTXlyaWFkUHJvQm9sZE1ldHJpY3N9LGVbIk15cmlhZFByby1JdCJdPWVbIk15cmlhZFByby1JdGFsaWMiXT1lWyJQZGZKUy1GYWxsYmFjay1JdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtSXRhbGljIixmYWN0b3JzOm8uTXlyaWFkUHJvSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsbWV0cmljczpvLk15cmlhZFByb0l0YWxpY01ldHJpY3N9LGVbIk15cmlhZFByby1Cb2xkSXQiXT1lWyJNeXJpYWRQcm8tQm9sZEl0YWxpYyJdPWVbIlBkZkpTLUZhbGxiYWNrLUJvbGRJdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsZmFjdG9yczpvLk15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nLG1ldHJpY3M6by5NeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljc30sZS5BcmlhbE1UPWUuQXJpYWw9ZVsiQXJpYWwtUmVndWxhciJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIixiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZ30sZVsiQXJpYWwtQm9sZE1UIl09ZVsiQXJpYWwtQm9sZCJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkIixiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZ30sZVsiQXJpYWwtSXRhbGljTVQiXT1lWyJBcmlhbC1JdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtSXRhbGljIixiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmd9LGVbIkFyaWFsLUJvbGRJdGFsaWNNVCJdPWVbIkFyaWFsLUJvbGRJdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsYmFzZVdpZHRoczpzLkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY1dpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmd9LGVbIkNhbGlicmktUmVndWxhciJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIixmYWN0b3JzOm4uQ2FsaWJyaVJlZ3VsYXJGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nLG1ldHJpY3M6bi5DYWxpYnJpUmVndWxhck1ldHJpY3N9LGVbIkNhbGlicmktQm9sZCJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkIixmYWN0b3JzOm4uQ2FsaWJyaUJvbGRGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nLG1ldHJpY3M6bi5DYWxpYnJpQm9sZE1ldHJpY3N9LGVbIkNhbGlicmktSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsZmFjdG9yczpuLkNhbGlicmlJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZyxtZXRyaWNzOm4uQ2FsaWJyaUl0YWxpY01ldHJpY3N9LGVbIkNhbGlicmktQm9sZEl0YWxpYyJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIixmYWN0b3JzOm4uQ2FsaWJyaUJvbGRJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nLG1ldHJpY3M6bi5DYWxpYnJpQm9sZEl0YWxpY01ldHJpY3N9LGVbIlNlZ29ldWktUmVndWxhciJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIixmYWN0b3JzOmMuU2Vnb2V1aVJlZ3VsYXJGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nLG1ldHJpY3M6Yy5TZWdvZXVpUmVndWxhck1ldHJpY3N9LGVbIlNlZ29ldWktQm9sZCJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkIixmYWN0b3JzOmMuU2Vnb2V1aUJvbGRGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nLG1ldHJpY3M6Yy5TZWdvZXVpQm9sZE1ldHJpY3N9LGVbIlNlZ29ldWktSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsZmFjdG9yczpjLlNlZ29ldWlJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocyxiYXNlTWFwcGluZzpzLkxpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZyxtZXRyaWNzOmMuU2Vnb2V1aUl0YWxpY01ldHJpY3N9LGVbIlNlZ29ldWktQm9sZEl0YWxpYyJdPXtuYW1lOiJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIixmYWN0b3JzOmMuU2Vnb2V1aUJvbGRJdGFsaWNGYWN0b3JzLGJhc2VXaWR0aHM6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nLG1ldHJpY3M6Yy5TZWdvZXVpQm9sZEl0YWxpY01ldHJpY3N9LGVbIkhlbHZldGljYS1SZWd1bGFyIl09ZS5IZWx2ZXRpY2E9e25hbWU6IkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLGZhY3RvcnM6aS5IZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZyxtZXRyaWNzOmkuSGVsdmV0aWNhUmVndWxhck1ldHJpY3N9LGVbIkhlbHZldGljYS1Cb2xkIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUJvbGQiLGZhY3RvcnM6aS5IZWx2ZXRpY2FCb2xkRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZyxtZXRyaWNzOmkuSGVsdmV0aWNhQm9sZE1ldHJpY3N9LGVbIkhlbHZldGljYS1JdGFsaWMiXT17bmFtZToiTGliZXJhdGlvblNhbnMtSXRhbGljIixmYWN0b3JzOmkuSGVsdmV0aWNhSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsYmFzZU1hcHBpbmc6cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsbWV0cmljczppLkhlbHZldGljYUl0YWxpY01ldHJpY3N9LGVbIkhlbHZldGljYS1Cb2xkSXRhbGljIl09e25hbWU6IkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiLGZhY3RvcnM6aS5IZWx2ZXRpY2FCb2xkSXRhbGljRmFjdG9ycyxiYXNlV2lkdGhzOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLGJhc2VNYXBwaW5nOnMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyxtZXRyaWNzOmkuSGVsdmV0aWNhQm9sZEl0YWxpY01ldHJpY3N9fSkpO2Z1bmN0aW9uIGQoZSl7Y29uc3QgdD0oMCxoLm5vcm1hbGl6ZUZvbnROYW1lKShlKTtyZXR1cm4gdSgpW3RdfX0sKGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5DYWxpYnJpUmVndWxhck1ldHJpY3M9dC5DYWxpYnJpUmVndWxhckZhY3RvcnM9dC5DYWxpYnJpSXRhbGljTWV0cmljcz10LkNhbGlicmlJdGFsaWNGYWN0b3JzPXQuQ2FsaWJyaUJvbGRNZXRyaWNzPXQuQ2FsaWJyaUJvbGRJdGFsaWNNZXRyaWNzPXQuQ2FsaWJyaUJvbGRJdGFsaWNGYWN0b3JzPXQuQ2FsaWJyaUJvbGRGYWN0b3JzPXZvaWQgMCx0LkNhbGlicmlCb2xkRmFjdG9ycz1bMS4zODc3LDEsMSwxLC45NzgwMSwuOTI0ODIsLjg5NTUyLC45MTEzMywuODE5ODgsLjk3NTY2LC45ODE1MiwuOTM1NDgsLjkzNTQ4LDEuMjc5OCwuODUyODQsLjkyNzk0LDEsLjk2MTM0LDEuNTQ2NTcsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC44Mjg0NSwuODI4NDUsLjg1Mjg0LC44NTI4NCwuODUyODQsLjc1ODU5LC45MjEzOCwuODM5MDgsLjc3NjIsLjczMjkzLC44NzI4OSwuNzMxMzMsLjc1MTQsLjgxOTIxLC44NzM1NiwuOTU5NTgsLjU5NTI2LC43NTcyNywuNjkyMjUsMS4wNDkyNCwuOTEyMSwuODY5NDMsLjc5Nzk1LC44ODE5OCwuNzc5NTgsLjcwODY0LC44MTA1NSwuOTAzOTksLjg4NjUzLC45NjAxNywuODI1NzcsLjc3ODkyLC43ODI1NywuOTc1MDcsMS41NDY1NywuOTc1MDcsLjg1Mjg0LC44OTU1MiwuOTAxNzYsLjg4NzYyLC44Nzg1LC43NTI0MSwuODc4NSwuOTA1MTgsLjk1MDE1LC43NzYxOCwuODc4NSwuODg0MDEsLjkxOTE2LC44NjMwNCwuODg0MDEsLjkxNDg4LC44Nzg1LC44ODAxLC44Nzg1LC44Nzg1LC45MTM0MywuNzE3MywxLjA0MTA2LC44Nzg1LC44NTA3NSwuOTU3OTQsLjgyNjE2LC44NTE2MiwuNzk0OTIsLjg4MzMxLDEuNjk4MDgsLjg4MzMxLC44NTI4NCwuOTc4MDEsLjg5NTUyLC45MTEzMywuODk1NTIsLjkxMTMzLDEuNzgwMSwuODk1NTIsMS4yNDQ4NywxLjEzMjU0LDEuMTI0MDEsLjk2ODM5LC44NTI4NCwuNjg3ODcsLjcwNjQ1LC44NTU5MiwuOTA3NDcsMS4wMTQ2NiwxLjAwODgsLjkwMzIzLDEsMS4wNzQ2MywxLC45MTA1NiwuNzU4MDYsMS4xOTExOCwuOTY4MzksLjc4ODY0LC44Mjg0NSwuODQxMzMsLjc1ODU5LC44MzkwOCwuODM5MDgsLjgzOTA4LC44MzkwOCwuODM5MDgsLjgzOTA4LC43NzUzOSwuNzMyOTMsLjczMTMzLC43MzEzMywuNzMxMzMsLjczMTMzLC45NTk1OCwuOTU5NTgsLjk1OTU4LC45NTk1OCwuODg1MDYsLjkxMjEsLjg2OTQzLC44Njk0MywuODY5NDMsLjg2OTQzLC44Njk0MywuODUyODQsLjg3NTA4LC45MDM5OSwuOTAzOTksLjkwMzk5LC45MDM5OSwuNzc4OTIsLjc5Nzk1LC45MDgwNywuODg3NjIsLjg4NzYyLC44ODc2MiwuODg3NjIsLjg4NzYyLC44ODc2MiwuODcxNSwuNzUyNDEsLjkwNTE4LC45MDUxOCwuOTA1MTgsLjkwNTE4LC44ODQwMSwuODg0MDEsLjg4NDAxLC44ODQwMSwuODc4NSwuODc4NSwuODgwMSwuODgwMSwuODgwMSwuODgwMSwuODgwMSwuOTA3NDcsLjg5MDQ5LC44Nzg1LC44Nzg1LC44Nzg1LC44Nzg1LC44NTE2MiwuODc4NSwuODUxNjIsLjgzOTA4LC44ODc2MiwuODM5MDgsLjg4NzYyLC44MzkwOCwuODg3NjIsLjczMjkzLC43NTI0MSwuNzMyOTMsLjc1MjQxLC43MzI5MywuNzUyNDEsLjczMjkzLC43NTI0MSwuODcyODksLjgzMDE2LC44ODUwNiwuOTMxMjUsLjczMTMzLC45MDUxOCwuNzMxMzMsLjkwNTE4LC43MzEzMywuOTA1MTgsLjczMTMzLC45MDUxOCwuNzMxMzMsLjkwNTE4LC44MTkyMSwuNzc2MTgsLjgxOTIxLC43NzYxOCwuODE5MjEsLjc3NjE4LDEsMSwuODczNTYsLjg3ODUsLjkxMDc1LC44OTYwOCwuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjk1OTU4LC44ODQwMSwuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjc2MjI5LC45MDE2NywuNTk1MjYsLjkxOTE2LDEsMSwuODYzMDQsLjY5MjI1LC44ODQwMSwxLDEsLjcwNDI0LC43OTQ2OCwuOTE5MjYsLjg4MTc1LC43MDgyMywuOTQ5MDMsLjkxMjEsLjg3ODUsMSwxLC45MTIxLC44Nzg1LC44NzgwMiwuODg2NTYsLjg3ODUsLjg2OTQzLC44ODAxLC44Njk0MywuODgwMSwuODY5NDMsLjg4MDEsLjg3NDAyLC44OTI5MSwuNzc5NTgsLjkxMzQzLDEsMSwuNzc5NTgsLjkxMzQzLC43MDg2NCwuNzE3MywuNzA4NjQsLjcxNzMsLjcwODY0LC43MTczLC43MDg2NCwuNzE3MywxLDEsLjgxMDU1LC43NTg0MSwuODEwNTUsMS4wNjQ1MiwuOTAzOTksLjg3ODUsLjkwMzk5LC44Nzg1LC45MDM5OSwuODc4NSwuOTAzOTksLjg3ODUsLjkwMzk5LC44Nzg1LC45MDM5OSwuODc4NSwuOTYwMTcsLjk1Nzk0LC43Nzg5MiwuODUxNjIsLjc3ODkyLC43ODI1NywuNzk0OTIsLjc4MjU3LC43OTQ5MiwuNzgyNTcsLjc5NDkyLC45Mjk3LC41Njg5MiwuODM5MDgsLjg4NzYyLC43NzUzOSwuODcxNSwuODc1MDgsLjg5MDQ5LDEsMSwuODEwNTUsMS4wNDEwNiwxLjIwNTI4LDEuMjA1MjgsMSwxLjE1NTQzLC43MDY3NCwuOTgzODcsLjk0NzIxLDEuMzM0MzEsMS40NTg5NCwuOTUxNjEsMS4wNjMwMywuODM5MDgsLjgwMzUyLC41NzE4NCwuNjk2NSwuNTYyODksLjgyMDAxLC41NjAyOSwuODEyMzUsMS4wMjk4OCwuODM5MDgsLjc3NjIsLjY4MTU2LC44MDM2NywuNzMxMzMsLjc4MjU3LC44NzM1NiwuODY5NDMsLjk1OTU4LC43NTcyNywuODkwMTksMS4wNDkyNCwuOTEyMSwuNzY0OCwuODY5NDMsLjg3MzU2LC43OTc5NSwuNzgyNzUsLjgxMDU1LC43Nzg5MiwuOTc2MiwuODI1NzcsLjk5ODE5LC44NDg5NiwuOTU5NTgsLjc3ODkyLC45NjEwOCwxLjAxNDA3LC44OTA0OSwxLjAyOTg4LC45NDIxMSwuOTYxMDgsLjg5MzYsLjg0MDIxLC44Nzg0MiwuOTYzOTksLjc5MTA5LC44OTA0OSwxLjAwODEzLDEuMDI5ODgsLjg2MDc3LC44NzQ0NSwuOTIwOTksLjg0NzIzLC44NjUxMywuODgwMSwuNzU2MzgsLjg1NzE0LC43ODIxNiwuNzk1ODYsLjg3OTY1LC45NDIxMSwuOTc3NDcsLjc4Mjg3LC45NzkyNiwuODQ5NzEsMS4wMjk4OCwuOTQyMTEsLjg4MDEsLjk0MjExLC44NDk3MSwuNzMxMzMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjkwMjY0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45MDUxOCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA1NDgsMSwxLDEsMSwxLDEsLjk2MDE3LC45NTc5NCwuOTYwMTcsLjk1Nzk0LC45NjAxNywuOTU3OTQsLjc3ODkyLC44NTE2MiwxLDEsLjg5NTUyLC45MDUyNywxLC45MDM2MywuOTI3OTQsLjkyNzk0LC45Mjc5NCwuOTI3OTQsLjg3MDEyLC44NzAxMiwuODcwMTIsLjg5NTUyLC44OTU1MiwxLjQyMjU5LC43MTE0MywxLjA2MTUyLDEsMSwxLjAzMzcyLDEuMDMzNzIsLjk3MTcxLDEuNDk1NiwyLjI4MDcsLjkzODM1LC44MzQwNiwuOTExMzMsLjg0MTA3LC45MTEzMywxLDEsMSwuNzIwMjEsMSwxLjIzMTA4LC44MzQ4OSwuODg1MjUsLjg4NTI1LC44MTQ5OSwuOTA1MjcsMS44MTA1NSwuOTA1MjcsMS44MTA1NSwxLjMxMDA2LDEuNTM3MTEsLjk0NDM0LDEuMDg2OTYsMSwuOTUwMTgsLjc3MTkyLC44NTI4NCwuOTA3NDcsMS4xNzUzNCwuNjk4MjUsLjk3MTYsMS4zNzA3NywuOTA3NDcsLjkwNzQ3LC44NTM1NiwuOTA3NDcsLjkwNzQ3LDEuNDQ5NDcsLjg1Mjg0LC44OTQxLC44OTQxLC43MDU3MiwuOCwuNzA1NzIsLjcwNTcyLC43MDU3MiwuNzA1NzIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45OTg2MiwuOTk4NjIsMSwxLDEsMSwxLDEuMDgwMDQsLjkxMDI3LDEsMSwxLC45OTg2MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA3MjcsLjkwNzI3LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LkNhbGlicmlCb2xkTWV0cmljcz17bGluZUhlaWdodDoxLjIyMDcsbGluZUdhcDouMjIwN30sdC5DYWxpYnJpQm9sZEl0YWxpY0ZhY3RvcnM9WzEuMzg3NywxLDEsMSwuOTc4MDEsLjkyNDgyLC44OTU1MiwuOTExMzMsLjgxOTg4LC45NzU2NiwuOTgxNTIsLjkzNTQ4LC45MzU0OCwxLjI3OTgsLjg1Mjg0LC45Mjc5NCwxLC45NjEzNCwxLjU2MjM5LC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuODI4NDUsLjgyODQ1LC44NTI4NCwuODUyODQsLjg1Mjg0LC43NTg1OSwuOTIxMzgsLjgzOTA4LC43NzYyLC43MTgwNSwuODcyODksLjczMTMzLC43NTE0LC44MTkyMSwuODczNTYsLjk1OTU4LC41OTUyNiwuNzU3MjcsLjY5MjI1LDEuMDQ5MjQsLjkwODcyLC44NTkzOCwuNzk3OTUsLjg3MDY4LC43Nzk1OCwuNjk3NjYsLjgxMDU1LC45MDM5OSwuODg2NTMsLjk2MDY4LC44MjU3NywuNzc4OTIsLjc4MjU3LC45NzUwNywxLjUyOSwuOTc1MDcsLjg1Mjg0LC44OTU1MiwuOTAxNzYsLjk0OTA4LC44NjQxMSwuNzQwMTIsLjg2NDExLC44ODMyMywuOTUwMTUsLjg2NDExLC44NjMzMSwuODg0MDEsLjkxOTE2LC44NjMwNCwuODg0MDEsLjkwMzksLjg2MzMxLC44NjMzMSwuODY0MTEsLjg2NDExLC45MDQ2NCwuNzA4NTIsMS4wNDEwNiwuODYzMzEsLjg0MzcyLC45NTc5NCwuODI2MTYsLjg0NTQ4LC43OTQ5MiwuODgzMzEsMS42OTgwOCwuODgzMzEsLjg1Mjg0LC45NzgwMSwuODk1NTIsLjkxMTMzLC44OTU1MiwuOTExMzMsMS43ODAxLC44OTU1MiwxLjI0NDg3LDEuMTMyNTQsMS4xOTEyOSwuOTY4MzksLjg1Mjg0LC42ODc4NywuNzA2NDUsLjg1NTkyLC45MDc0NywxLjAxNDY2LDEuMDA4OCwuOTAzMjMsMSwxLjA3NDYzLDEsLjkxMDU2LC43NTgwNiwxLjE5MTE4LC45NjgzOSwuNzg4NjQsLjgyODQ1LC44NDEzMywuNzU4NTksLjgzOTA4LC44MzkwOCwuODM5MDgsLjgzOTA4LC44MzkwOCwuODM5MDgsLjc3NTM5LC43MTgwNSwuNzMxMzMsLjczMTMzLC43MzEzMywuNzMxMzMsLjk1OTU4LC45NTk1OCwuOTU5NTgsLjk1OTU4LC44ODUwNiwuOTA4NzIsLjg1OTM4LC44NTkzOCwuODU5MzgsLjg1OTM4LC44NTkzOCwuODUyODQsLjg3MDY4LC45MDM5OSwuOTAzOTksLjkwMzk5LC45MDM5OSwuNzc4OTIsLjc5Nzk1LC45MDgwNywuOTQ5MDgsLjk0OTA4LC45NDkwOCwuOTQ5MDgsLjk0OTA4LC45NDkwOCwuODU4ODcsLjc0MDEyLC44ODMyMywuODgzMjMsLjg4MzIzLC44ODMyMywuODg0MDEsLjg4NDAxLC44ODQwMSwuODg0MDEsLjg3ODUsLjg2MzMxLC44NjMzMSwuODYzMzEsLjg2MzMxLC44NjMzMSwuODYzMzEsLjkwNzQ3LC44OTA0OSwuODYzMzEsLjg2MzMxLC44NjMzMSwuODYzMzEsLjg0NTQ4LC44NjQxMSwuODQ1NDgsLjgzOTA4LC45NDkwOCwuODM5MDgsLjk0OTA4LC44MzkwOCwuOTQ5MDgsLjcxODA1LC43NDAxMiwuNzE4MDUsLjc0MDEyLC43MTgwNSwuNzQwMTIsLjcxODA1LC43NDAxMiwuODcyODksLjc5NTM4LC44ODUwNiwuOTI3MjYsLjczMTMzLC44ODMyMywuNzMxMzMsLjg4MzIzLC43MzEzMywuODgzMjMsLjczMTMzLC44ODMyMywuNzMxMzMsLjg4MzIzLC44MTkyMSwuODY0MTEsLjgxOTIxLC44NjQxMSwuODE5MjEsLjg2NDExLDEsMSwuODczNTYsLjg2MzMxLC45MTA3NSwuODc3NywuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjk1OTU4LC44ODQwMSwuOTU5NTgsLjg4NDAxLC45NTk1OCwuODg0MDEsLjc2NDY3LC45MDE2NywuNTk1MjYsLjkxOTE2LDEsMSwuODYzMDQsLjY5MjI1LC44ODQwMSwxLDEsLjcwNDI0LC43NzMxMiwuOTE5MjYsLjg4MTc1LC43MDgyMywuOTQ5MDMsLjkwODcyLC44NjMzMSwxLDEsLjkwODcyLC44NjMzMSwuODY5MDYsLjg4MTE2LC44NjMzMSwuODU5MzgsLjg2MzMxLC44NTkzOCwuODYzMzEsLjg1OTM4LC44NjMzMSwuODc0MDIsLjg2NTQ5LC43Nzk1OCwuOTA0NjQsMSwxLC43Nzk1OCwuOTA0NjQsLjY5NzY2LC43MDg1MiwuNjk3NjYsLjcwODUyLC42OTc2NiwuNzA4NTIsLjY5NzY2LC43MDg1MiwxLDEsLjgxMDU1LC43NTg0MSwuODEwNTUsMS4wNjQ1MiwuOTAzOTksLjg2MzMxLC45MDM5OSwuODYzMzEsLjkwMzk5LC44NjMzMSwuOTAzOTksLjg2MzMxLC45MDM5OSwuODYzMzEsLjkwMzk5LC44NjMzMSwuOTYwNjgsLjk1Nzk0LC43Nzg5MiwuODQ1NDgsLjc3ODkyLC43ODI1NywuNzk0OTIsLjc4MjU3LC43OTQ5MiwuNzgyNTcsLjc5NDkyLC45Mjk3LC41Njg5MiwuODM5MDgsLjk0OTA4LC43NzUzOSwuODU4ODcsLjg3MDY4LC44OTA0OSwxLDEsLjgxMDU1LDEuMDQxMDYsMS4yMDUyOCwxLjIwNTI4LDEsMS4xNTU0MywuNzAwODgsLjk4Mzg3LC45NDcyMSwxLjMzNDMxLDEuNDU4OTQsLjk1MTYxLDEuNDgzODcsLjgzOTA4LC44MDM1MiwuNTcxMTgsLjY5NjUsLjU2MzQ3LC43OTE3OSwuNTU4NTMsLjgwMzQ2LDEuMDI5ODgsLjgzOTA4LC43NzYyLC42NzE3NCwuODYwMzYsLjczMTMzLC43ODI1NywuODczNTYsLjg2NDQxLC45NTk1OCwuNzU3MjcsLjg5MDE5LDEuMDQ5MjQsLjkwODcyLC43NDg4OSwuODU5MzgsLjg3ODkxLC43OTc5NSwuNzk1NywuODEwNTUsLjc3ODkyLC45NzQ0NywuODI1NzcsLjk3NDY2LC44NzE3OSwuOTU5NTgsLjc3ODkyLC45NDI1MiwuOTU2MTIsLjg3NTMsMS4wMjk4OCwuOTI3MzMsLjk0MjUyLC44NzQxMSwuODQwMjEsLjg3MjgsLjk1NjEyLC43NDA4MSwuODc1MywxLjAyMTg5LDEuMDI5ODgsLjg0ODE0LC44NzQ0NSwuOTE4MjIsLjg0NzIzLC44NTY2OCwuODYzMzEsLjgxMzQ0LC44NzU4MSwuNzY0MjIsLjgyMDQ2LC45NjA1NywuOTI3MzMsLjk5Mzc1LC43ODAyMiwuOTU0NTIsLjg2MDE1LDEuMDI5ODgsLjkyNzMzLC44NjMzMSwuOTI3MzMsLjg2MDE1LC43MzEzMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA2MzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjg4MzIzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44NTE3NCwxLDEsMSwxLDEsMSwuOTYwNjgsLjk1Nzk0LC45NjA2OCwuOTU3OTQsLjk2MDY4LC45NTc5NCwuNzc4OTIsLjg0NTQ4LDEsMSwuODk1NTIsLjkwNTI3LDEsLjkwMzYzLC45Mjc5NCwuOTI3OTQsLjkyNzk0LC44OTgwNywuODcwMTIsLjg3MDEyLC44NzAxMiwuODk1NTIsLjg5NTUyLDEuNDIyNTksLjcxMDk0LDEuMDYxNTIsMSwxLDEuMDMzNzIsMS4wMzM3MiwuOTcxNzEsMS40OTU2LDIuMjgwNywuOTI5NzIsLjgzNDA2LC45MTEzMywuODMzMjYsLjkxMTMzLDEsMSwxLC43MjAyMSwxLDEuMjMxMDgsLjgzNDg5LC44ODUyNSwuODg1MjUsLjgxNDk5LC45MDYxNiwxLjgxMDU1LC45MDUyNywxLjgxMDU1LDEuMzEwNywxLjUzNzExLC45NDQzNCwxLjA4Njk2LDEsLjk1MDE4LC43NzE5MiwuODUyODQsLjkwNzQ3LDEuMTc1MzQsLjY5ODI1LC45NzE2LDEuMzcwNzcsLjkwNzQ3LC45MDc0NywuODUzNTYsLjkwNzQ3LC45MDc0NywxLjQ0OTQ3LC44NTI4NCwuODk0MSwuODk0MSwuNzA1NzIsLjgsLjcwNTcyLC43MDU3MiwuNzA1NzIsLjcwNTcyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTk4NjIsLjk5ODYyLDEsMSwxLDEsMSwxLjA4MDA0LC45MTAyNywxLDEsMSwuOTk4NjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjkwNzI3LC45MDcyNywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV0sdC5DYWxpYnJpQm9sZEl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yMjA3LGxpbmVHYXA6LjIyMDd9LHQuQ2FsaWJyaUl0YWxpY0ZhY3RvcnM9WzEuMzg3NywxLDEsMSwxLjE3MjIzLDEuMTI5MywuODk1NTIsLjkxMTMzLC44MDM5NSwxLjAyMjY5LDEuMTU2MDEsLjkxMDU2LC45MTA1NiwxLjI3OTgsLjg1Mjg0LC44OTgwNywxLC45MDg2MSwxLjM5NTQzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTYzMDksLjk2MzA5LC44NTI4NCwuODUyODQsLjg1Mjg0LC44MzMxOSwuODgwNzEsLjg2NzUsLjgxNTUyLC43MjM0NiwuODUxOTMsLjczMjA2LC43NTIyLC44MTEwNSwuODYyNzUsLjkwNjg1LC42Mzc3LC43Nzg5MiwuNzU1OTMsMS4wMjYzOCwuODkyNDksLjg0MTE4LC43NzQ1MiwuODUzNzQsLjc1MTg2LC42Nzc4OSwuNzk3NzYsLjg4ODQ0LC44NTA2NiwuOTQzMDksLjc3ODE4LC43MzA2LC43NjY1OSwxLjEwMzY5LDEuMzgzMTMsMS4xMDM2OSwxLjA2MTM5LC44OTU1MiwuODczOSwuOTI0NSwuOTI0NSwuODMyMDMsLjkyNDUsLjg1ODY1LDEuMDk4NDIsLjkyNDUsLjkyNDUsMS4wMzI5NywxLjA3NjkyLC45MDkxOCwxLjAzMjk3LC45NDk1OSwuOTI0NSwuOTIyNzQsLjkyNDUsLjkyNDUsMS4wMjkzMywuNzc4MzIsMS4yMDU2MiwuOTI0NSwuODkxNiwuOTg5ODYsLjg2NjIxLC44OTQ1MywuNzkwMDQsLjk0MTUyLDEuNzcyNTYsLjk0MTUyLC44NTI4NCwuOTc4MDEsLjg5NTUyLC45MTEzMywuODk1NTIsLjkxMTMzLDEuOTE3MjksLjg5NTUyLDEuMTc4ODksMS4xMzI1NCwxLjE2MzU5LC45MjA5OCwuODUyODQsLjY4Nzg3LC43MTM1MywuODQ3MzcsLjkwNzQ3LDEuMDA4OCwxLjAwNDQsLjg3NjgzLDEsMS4wOTA5MSwxLC45MjIyOSwuNzM5LDEuMTU2NDIsLjkyMDk4LC43NjI4OCwuODA1MDQsLjgwOTcyLC43NTg1OSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuNzYzMTgsLjcyMzQ2LC43MzIwNiwuNzMyMDYsLjczMjA2LC43MzIwNiwuOTA2ODUsLjkwNjg1LC45MDY4NSwuOTA2ODUsLjg2NDc3LC44OTI0OSwuODQxMTgsLjg0MTE4LC44NDExOCwuODQxMTgsLjg0MTE4LC44NTI4NCwuODQ1NTcsLjg4ODQ0LC44ODg0NCwuODg4NDQsLjg4ODQ0LC43MzA2LC43NzQ1MiwuODYzMzEsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjg0ODQzLC44MzIwMywuODU4NjUsLjg1ODY1LC44NTg2NSwuODU4NjUsLjgyNjAxLC44MjYwMSwuODI2MDEsLjgyNjAxLC45NDQ2OSwuOTI0NSwuOTIyNzQsLjkyMjc0LC45MjI3NCwuOTIyNzQsLjkyMjc0LC45MDc0NywuODY2NTEsLjkyNDUsLjkyNDUsLjkyNDUsLjkyNDUsLjg5NDUzLC45MjQ1LC44OTQ1MywuODY3NSwuOTI0NSwuODY3NSwuOTI0NSwuODY3NSwuOTI0NSwuNzIzNDYsLjgzMjAzLC43MjM0NiwuODMyMDMsLjcyMzQ2LC44MzIwMywuNzIzNDYsLjgzMjAzLC44NTE5MywuODg3NSwuODY0NzcsLjk5MDM0LC43MzIwNiwuODU4NjUsLjczMjA2LC44NTg2NSwuNzMyMDYsLjg1ODY1LC43MzIwNiwuODU4NjUsLjczMjA2LC44NTg2NSwuODExMDUsLjkyNDUsLjgxMTA1LC45MjQ1LC44MTEwNSwuOTI0NSwxLDEsLjg2Mjc1LC45MjQ1LC45MDg3MiwuOTM1OTEsLjkwNjg1LC44MjYwMSwuOTA2ODUsLjgyNjAxLC45MDY4NSwuODI2MDEsLjkwNjg1LDEuMDMyOTcsLjkwNjg1LC44MjYwMSwuNzc4OTYsMS4wNTYxMSwuNjM3NywxLjA3NjkyLDEsMSwuOTA5MTgsLjc1NTkzLDEuMDMyOTcsMSwxLC43NjAzMiwuOTM3NSwuOTgxNTYsLjkzNDA3LC43NzI2MSwxLjExNDI5LC44OTI0OSwuOTI0NSwxLDEsLjg5MjQ5LC45MjQ1LC45MjUzNCwuODY2OTgsLjkyNDUsLjg0MTE4LC45MjI3NCwuODQxMTgsLjkyMjc0LC44NDExOCwuOTIyNzQsLjg2NjcsLjg2MjkxLC43NTE4NiwxLjAyOTMzLDEsMSwuNzUxODYsMS4wMjkzMywuNjc3ODksLjc3ODMyLC42Nzc4OSwuNzc4MzIsLjY3Nzg5LC43NzgzMiwuNjc3ODksLjc3ODMyLDEsMSwuNzk3NzYsLjk3NjU1LC43OTc3NiwxLjIzMDIzLC44ODg0NCwuOTI0NSwuODg4NDQsLjkyNDUsLjg4ODQ0LC45MjQ1LC44ODg0NCwuOTI0NSwuODg4NDQsLjkyNDUsLjg4ODQ0LC45MjQ1LC45NDMwOSwuOTg5ODYsLjczMDYsLjg5NDUzLC43MzA2LC43NjY1OSwuNzkwMDQsLjc2NjU5LC43OTAwNCwuNzY2NTksLjc5MDA0LDEuMDkyMzEsLjU0ODczLC44Njc1LC45MjQ1LC43NjMxOCwuODQ4NDMsLjg0NTU3LC44NjY1MSwxLDEsLjc5Nzc2LDEuMjA1NjIsMS4xODYyMiwxLjE4NjIyLDEsMS4xNDM3LC42NzAwOSwuOTYzMzQsLjkzNjk1LDEuMzUxOTEsMS40MDkwOSwuOTUxNjEsMS40ODM4NywuODY3NSwuOTA4NjEsLjYxOTIsLjczNjMsLjY0ODI0LC44MjQxMSwuNTYzMjEsLjg1Njk2LDEuMjM1MTYsLjg2NzUsLjgxNTUyLC43Mjg2LC44NDEzNCwuNzMyMDYsLjc2NjU5LC44NjI3NSwuODQzNjksLjkwNjg1LC43Nzg5MiwuODU4NzEsMS4wMjYzOCwuODkyNDksLjc1ODI4LC44NDExOCwuODU5ODQsLjc3NDUyLC43NjQ2NiwuNzk3NzYsLjczMDYsLjkwNzgyLC43NzgxOCwuOTAzLC44NzI5MSwuOTA2ODUsLjczMDYsLjk5MDU4LDEuMDM2NjcsLjk0NjM1LDEuMjM1MTYsLjk4NDksLjk5MDU4LC45MjM5MywuODkxNiwuOTQyLDEuMDM2NjcsLjc1MDI2LC45NDYzNSwxLjAyOTcsMS4yMzUxNiwuOTA5MTgsLjk0MDQ4LC45ODIxNywuODk3NDYsLjg0MTUzLC45MjI3NCwuODI1MDcsLjg4ODMyLC44NDQzOCwuODgxNzgsMS4wMzUyNSwuOTg0OSwxLjAwMjI1LC43ODA4NiwuOTcyNDgsLjg5NDA0LDEuMjM1MTYsLjk4NDksLjkyMjc0LC45ODQ5LC44OTQwNCwuNzMyMDYsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjg5NjkzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44NTg2NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTA5MzMsMSwxLDEsMSwxLDEsLjk0MzA5LC45ODk4NiwuOTQzMDksLjk4OTg2LC45NDMwOSwuOTg5ODYsLjczMDYsLjg5NDUzLDEsMSwuODk1NTIsLjkwNTI3LDEsLjkwMTg2LDEuMTIzMDgsMS4xMjMwOCwxLjEyMzA4LDEuMTIzMDgsMS4yNTY2LDEuMjU2NiwxLjI1NjYsLjg5NTUyLC44OTU1MiwxLjQyMjU5LC42ODk5NCwxLjAzODA5LDEsMSwxLjAxNzYsMS4wMTc2LDEuMTE1MjMsMS40OTU2LDIuMDE0NjIsLjk3ODU4LC44MjYxNiwuOTExMzMsLjgzNDM3LC45MTEzMywxLDEsMSwuNzA1MDgsMSwxLjIzMTA4LC43OTgwMSwuODQ0MjYsLjg0NDI2LC43NzQsLjkwNTcyLDEuODEwNTUsLjkwNzQ5LDEuODEwNTUsMS4yODgwOSwxLjU1NDY5LC45NDQzNCwxLjA3ODA2LDEsLjk3MDk0LC43NTg5LC44NTI4NCwuOTA3NDcsMS4xOTY1OCwuNjk4MjUsLjk3NjIyLDEuMzM1MTIsLjkwNzQ3LC45MDc0NywuODUyODQsLjkwNzQ3LC45MDc0NywxLjQ0OTQ3LC44NTI4NCwuODk0MSwuODk0MSwuNzA1NzIsLjgsLjcwNTcyLC43MDU3MiwuNzA1NzIsLjcwNTcyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTk4NjIsLjk5ODYyLDEsMSwxLDEsMSwxLjAzMzYsLjkxMDI3LDEsMSwxLC45OTg2MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA1ODU5LDEuMDU4NTksMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuQ2FsaWJyaUl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yMjA3LGxpbmVHYXA6LjIyMDd9LHQuQ2FsaWJyaVJlZ3VsYXJGYWN0b3JzPVsxLjM4NzcsMSwxLDEsMS4xNzIyMywxLjEyOTMsLjg5NTUyLC45MTEzMywuODAzOTUsMS4wMjI2OSwxLjE1NjAxLC45MTA1NiwuOTEwNTYsMS4yNzk4LC44NTI4NCwuODk4MDcsMSwuOTA4NjEsMS4zOTAxNiwuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjkxMTMzLC45MTEzMywuOTExMzMsLjk2MzA5LC45NjMwOSwuODUyODQsLjg1Mjg0LC44NTI4NCwuODMzMTksLjg4MDcxLC44Njc1LC44MTU1MiwuNzM4MzQsLjg1MTkzLC43MzIwNiwuNzUyMiwuODExMDUsLjg2Mjc1LC45MDY4NSwuNjM3NywuNzc4OTIsLjc1NTkzLDEuMDI2MzgsLjg5Mzg1LC44NTEyMiwuNzc0NTIsLjg2NTAzLC43NTE4NiwuNjg4ODcsLjc5Nzc2LC44ODg0NCwuODUwNjYsLjk0MjU4LC43NzgxOCwuNzMwNiwuNzY2NTksMS4xMDM2OSwxLjM5MDE2LDEuMTAzNjksMS4wNjEzOSwuODk1NTIsLjg3MzksLjg2MTI4LC45NDQ2OSwuODQ1NywuOTQ0NjksLjg5NDY0LDEuMDk4NDIsLjg0NjM2LC45NDQ2OSwxLjAzMjk3LDEuMDc2OTIsLjkwOTE4LDEuMDMyOTcsLjk1ODk3LC45NDQ2OSwuOTQ4MiwuOTQ0NjksLjk0NDY5LDEuMDQ2OTIsLjc4MjIzLDEuMjA1NjIsLjk0NDY5LC45MDMzMiwuOTg5ODYsLjg2NjIxLC45MDUyNywuNzkwMDQsLjk0MTUyLDEuNzcyNTYsLjk0MTUyLC44NTI4NCwuOTc4MDEsLjg5NTUyLC45MTEzMywuODk1NTIsLjkxMTMzLDEuOTE3MjksLjg5NTUyLDEuMTc4ODksMS4xMzI1NCwxLjA4NzA3LC45MjA5OCwuODUyODQsLjY4Nzg3LC43MTM1MywuODQ3MzcsLjkwNzQ3LDEuMDA4OCwxLjAwNDQsLjg3NjgzLDEsMS4wOTA5MSwxLC45MjIyOSwuNzM5LDEuMTU2NDIsLjkyMDk4LC43NjI4OCwuODA1MDQsLjgwOTcyLC43NTg1OSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuODY3NSwuNzYzMTgsLjczODM0LC43MzIwNiwuNzMyMDYsLjczMjA2LC43MzIwNiwuOTA2ODUsLjkwNjg1LC45MDY4NSwuOTA2ODUsLjg2NDc3LC44OTM4NSwuODUxMjIsLjg1MTIyLC44NTEyMiwuODUxMjIsLjg1MTIyLC44NTI4NCwuODUzMTEsLjg4ODQ0LC44ODg0NCwuODg4NDQsLjg4ODQ0LC43MzA2LC43NzQ1MiwuODYzMzEsLjg2MTI4LC44NjEyOCwuODYxMjgsLjg2MTI4LC44NjEyOCwuODYxMjgsLjg2OTMsLjg0NTcsLjg5NDY0LC44OTQ2NCwuODk0NjQsLjg5NDY0LC44MjYwMSwuODI2MDEsLjgyNjAxLC44MjYwMSwuOTQ0NjksLjk0NDY5LC45NDgyLC45NDgyLC45NDgyLC45NDgyLC45NDgyLC45MDc0NywuODY2NTEsLjk0NDY5LC45NDQ2OSwuOTQ0NjksLjk0NDY5LC45MDUyNywuOTQ0NjksLjkwNTI3LC44Njc1LC44NjEyOCwuODY3NSwuODYxMjgsLjg2NzUsLjg2MTI4LC43MzgzNCwuODQ1NywuNzM4MzQsLjg0NTcsLjczODM0LC44NDU3LC43MzgzNCwuODQ1NywuODUxOTMsLjkyNDU0LC44NjQ3NywuOTkyMSwuNzMyMDYsLjg5NDY0LC43MzIwNiwuODk0NjQsLjczMjA2LC44OTQ2NCwuNzMyMDYsLjg5NDY0LC43MzIwNiwuODk0NjQsLjgxMTA1LC44NDYzNiwuODExMDUsLjg0NjM2LC44MTEwNSwuODQ2MzYsMSwxLC44NjI3NSwuOTQ0NjksLjkwODcyLC45NTc4NiwuOTA2ODUsLjgyNjAxLC45MDY4NSwuODI2MDEsLjkwNjg1LC44MjYwMSwuOTA2ODUsMS4wMzI5NywuOTA2ODUsLjgyNjAxLC43Nzc0MSwxLjA1NjExLC42Mzc3LDEuMDc2OTIsMSwxLC45MDkxOCwuNzU1OTMsMS4wMzI5NywxLDEsLjc2MDMyLC45MDQ1MiwuOTgxNTYsMS4xMTg0MiwuNzcyNjEsMS4xMTQyOSwuODkzODUsLjk0NDY5LDEsMSwuODkzODUsLjk0NDY5LC45NTg3NywuODY5MDEsLjk0NDY5LC44NTEyMiwuOTQ4MiwuODUxMjIsLjk0ODIsLjg1MTIyLC45NDgyLC44NjY3LC45MDAxNiwuNzUxODYsMS4wNDY5MiwxLDEsLjc1MTg2LDEuMDQ2OTIsLjY4ODg3LC43ODIyMywuNjg4ODcsLjc4MjIzLC42ODg4NywuNzgyMjMsLjY4ODg3LC43ODIyMywxLDEsLjc5Nzc2LC45MjE4OCwuNzk3NzYsMS4yMzAyMywuODg4NDQsLjk0NDY5LC44ODg0NCwuOTQ0NjksLjg4ODQ0LC45NDQ2OSwuODg4NDQsLjk0NDY5LC44ODg0NCwuOTQ0NjksLjg4ODQ0LC45NDQ2OSwuOTQyNTgsLjk4OTg2LC43MzA2LC45MDUyNywuNzMwNiwuNzY2NTksLjc5MDA0LC43NjY1OSwuNzkwMDQsLjc2NjU5LC43OTAwNCwxLjA5MjMxLC41NDg3MywuODY3NSwuODYxMjgsLjc2MzE4LC44NjkzLC44NTMxMSwuODY2NTEsMSwxLC43OTc3NiwxLjIwNTYyLDEuMTg2MjIsMS4xODYyMiwxLDEuMTQzNywuNjc3NDIsLjk2MzM0LC45MzY5NSwxLjM1MTkxLDEuNDA5MDksLjk1MTYxLDEuNDgzODcsLjg2Njg2LC45MDg2MSwuNjIyNjcsLjc0MzU5LC42NTY0OSwuODU0OTgsLjU2OTYzLC44ODI1NCwxLjIzNTE2LC44Njc1LC44MTU1MiwuNzU0NDMsLjg0NTAzLC43MzIwNiwuNzY2NTksLjg2Mjc1LC44NTEyMiwuOTA2ODUsLjc3ODkyLC44NTc0NiwxLjAyNjM4LC44OTM4NSwuNzU2NTcsLjg1MTIyLC44NjI3NSwuNzc0NTIsLjc0MTcxLC43OTc3NiwuNzMwNiwuOTUxNjUsLjc3ODE4LC44OTc3MiwuODg4MzEsLjkwNjg1LC43MzA2LC45ODE0MiwxLjAyMTkxLC45NjU3NiwxLjIzNTE2LC45OTAxOCwuOTgxNDIsLjkyMzYsLjg5MjU4LC45NDAzNSwxLjAyMTkxLC43ODg0OCwuOTY1NzYsLjk1NjEsMS4yMzUxNiwuOTA5MTgsLjkyNTc4LC45NTQyNCwuODk3NDYsLjgzOTY5LC45NDgyLC44MDExMywuODk0NDIsLjg1MjA4LC44NjE1NSwuOTgwMjIsLjk5MDE4LDEuMDA0NTIsLjgxMjA5LC45OTI0NywuODkxODEsMS4yMzUxNiwuOTkwMTgsLjk0ODIsLjk5MDE4LC44OTE4MSwuNzMyMDYsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjg4ODQ0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44OTQ2NCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTY3NjYsMSwxLDEsMSwxLDEsLjk0MjU4LC45ODk4NiwuOTQyNTgsLjk4OTg2LC45NDI1OCwuOTg5ODYsLjczMDYsLjkwNTI3LDEsMSwuODk1NTIsLjkwNTI3LDEsLjkwMTg2LDEuMTIzMDgsMS4xMjMwOCwxLjEyMzA4LDEuMTIzMDgsMS4yNTY2LDEuMjU2NiwxLjI1NjYsLjg5NTUyLC44OTU1MiwxLjQyMjU5LC42OTA0MywxLjAzODA5LDEsMSwxLjAxNzYsMS4wMTc2LDEuMTE1MjMsMS40OTU2LDIuMDE0NjIsLjk5MzMxLC44MjYxNiwuOTExMzMsLjg0Mjg2LC45MTEzMywxLDEsMSwuNzA1MDgsMSwxLjIzMTA4LC43OTgwMSwuODQ0MjYsLjg0NDI2LC43NzQsLjkwNTI3LDEuODEwNTUsLjkwNTI3LDEuODEwNTUsMS4yODgwOSwxLjU1NDY5LC45NDQzNCwxLjA3ODA2LDEsLjk3MDk0LC43NTg5LC44NTI4NCwuOTA3NDcsMS4xOTY1OCwuNjk4MjUsLjk3NjIyLDEuMzM1MTIsLjkwNzQ3LC45MDc0NywuODUzNTYsLjkwNzQ3LC45MDc0NywxLjQ0OTQ3LC44NTI4NCwuODk0MSwuODk0MSwuNzA1NzIsLjgsLjcwNTcyLC43MDU3MiwuNzA1NzIsLjcwNTcyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTk4NjIsLjk5ODYyLDEsMSwxLDEsMSwxLjAzMzYsLjkxMDI3LDEsMSwxLC45OTg2MiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA1ODU5LDEuMDU4NTksMSwxLDEsMS4wNzE4NSwuOTk0MTMsLjk2MzM0LDEuMDgwNjUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LkNhbGlicmlSZWd1bGFyTWV0cmljcz17bGluZUhlaWdodDoxLjIyMDcsbGluZUdhcDouMjIwN319LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuSGVsdmV0aWNhUmVndWxhck1ldHJpY3M9dC5IZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycz10LkhlbHZldGljYUl0YWxpY01ldHJpY3M9dC5IZWx2ZXRpY2FJdGFsaWNGYWN0b3JzPXQuSGVsdmV0aWNhQm9sZE1ldHJpY3M9dC5IZWx2ZXRpY2FCb2xkSXRhbGljTWV0cmljcz10LkhlbHZldGljYUJvbGRJdGFsaWNGYWN0b3JzPXQuSGVsdmV0aWNhQm9sZEZhY3RvcnM9dm9pZCAwLHQuSGVsdmV0aWNhQm9sZEZhY3RvcnM9Wy43NjExNiwxLDEsMS4wMDA2LC45OTk5OCwuOTk5NzQsLjk5OTczLC45OTk3MywuOTk5ODIsLjk5OTc3LDEuMDAwODcsLjk5OTk4LC45OTk5OCwuOTk5NTksMS4wMDAwMywxLjAwMDYsLjk5OTk4LDEuMDAwNiwxLjAwMDYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk5OCwxLDEuMDAwMDMsMS4wMDAwMywxLjAwMDAzLDEuMDAwMjYsLjk5OTksLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LDEuMDAwMDEsMS4wMDAyNiwxLjAwMDIyLC45OTk3NywxLjAwMDYsLjk5OTczLC45OTk3NywxLjAwMDI2LC45OTk5OSwuOTk5NzcsMS4wMDAyMiwxLjAwMDAxLDEuMDAwMjIsLjk5OTc3LDEuMDAwMDEsMS4wMDAyNiwuOTk5NzcsMS4wMDAwMSwxLjAwMDE2LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDI2LC45OTk5OCwxLjAwMDYsLjk5OTk4LDEuMDAwMDMsLjk5OTczLC45OTk5OCwuOTk5NzMsMS4wMDAyNiwuOTk5NzMsMS4wMDAyNiwuOTk5NzMsLjk5OTk4LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDYsMS4wMDA2LC45OTk3MywxLjAwMDYsLjk5OTgyLDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsLjk5OTU5LC45OTk3MywuOTk5OTgsMS4wMDAyNiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsLjk5OTczLDEsLjk5OTU5LDEuMDAwNzcsLjk5OTU5LDEuMDAwMDMsLjk5OTk4LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDc3LC45OTk3MywuOTk5OTgsMS4wMDAyNSwuOTk5NjgsLjk5OTczLDEuMDAwMDMsMS4wMDAyNSwuNjAyOTksMS4wMDAyNCwxLjA2NDA5LDEsMSwuOTk5OTgsMSwuOTk5NzMsMS4wMDA2LC45OTk5OCwxLC45OTkzNiwuOTk5NzMsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDAyNiwuOTk5NzcsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwuOTk5NzcsLjk5OTc3LDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDAzLDEuMDAwMjIsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDI2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk4MiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDY0MDksMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LC45OTk3MywxLjAwMDI2LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywxLjAzMzc0LC45OTk3NywxLjAwMDI2LDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMjIsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA0MiwuOTk5NzMsLjk5OTczLDEuMDAwNiwuOTk5NzcsLjk5OTczLC45OTk3MywxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LDEuMDM4MjgsMS4wMDAyNiwuOTk5OTksMS4wMDAyNiwxLjAwMDYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTc3LDEuMDAwMjYsLjk5OTMsLjk5OTgsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwxLDEuMDAwMTYsLjk5OTc3LC45OTk1OSwuOTk5NzcsLjk5OTU5LC45OTk3NywuOTk5NTksMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAyNiwuOTk5OTgsMS4wMDAyNiwuODEyMSwxLjAwMDI2LC45OTk5OCwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwxLjAwMDE2LDEuMDAwMjIsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwxLjAwMDI2LDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwxLjAwMDYsLjk5OTczLC45OTk3NywuOTk5NzMsMSwuOTk5ODIsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMDEsLjk5OTczLDEuMDAwMjYsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwxLjAwMDM0LC45OTk3NywxLC45OTk5NywxLjAwMDI2LDEuMDAwNzgsMS4wMDAzNiwuOTk5NzMsMS4wMDAxMywxLjAwMDYsLjk5OTc3LC45OTk3NywuOTk5ODgsLjg1MTQ4LDEuMDAwMDEsMS4wMDAyNiwuOTk5NzcsMS4wMDAyMiwxLjAwMDYsLjk5OTc3LDEuMDAwMDEsLjk5OTk5LC45OTk3NywxLjAwMDY5LDEuMDAwMjIsLjk5OTc3LDEuMDAwMDEsLjk5OTg0LDEuMDAwMjYsMS4wMDAwMSwxLjAwMDI0LDEuMDAwMDEsLjk5OTksMSwxLjAwMDYsMS4wMDAwMSwxLjAwMDQxLC45OTk2MiwxLjAwMDI2LDEuMDAwNiwuOTk5OTUsMS4wMDA0MSwuOTk5NDIsLjk5OTczLC45OTkyNywxLjAwMDgyLC45OTkwMiwxLjAwMDI2LDEuMDAwODcsMS4wMDA2LDEuMDAwNjksLjk5OTczLC45OTg2NywuOTk5NzMsLjk5OTMsMS4wMDAyNiwxLjAwMDQ5LDEuMDAwNTYsMSwuOTk5ODgsLjk5OTM1LC45OTk5NSwuOTk5NTQsMS4wMDA1NSwuOTk5NDUsMS4wMDAzMiwxLjAwMDYsLjk5OTk1LDEuMDAwMjYsLjk5OTk1LDEuMDAwMzIsMS4wMDAwMSwxLjAwMDA4LC45OTk3MSwxLjAwMDE5LC45OTk0LDEuMDAwMDEsMS4wMDA2LDEuMDAwNDQsLjk5OTczLDEuMDAwMjMsMS4wMDA0NywxLC45OTk0MiwuOTk1NjEsLjk5OTg5LDEuMDAwMzUsLjk5OTc3LDEuMDAwMzUsLjk5OTc3LDEuMDAwMTksLjk5OTQ0LDEuMDAwMDEsMS4wMDAyMSwuOTk5MjYsMS4wMDAzNSwxLjAwMDM1LC45OTk0MiwxLjAwMDQ4LC45OTk5OSwuOTk5NzcsMS4wMDAyMiwxLjAwMDM1LDEuMDAwMDEsLjk5OTc3LDEuMDAwMjYsLjk5OTg5LDEuMDAwNTcsMS4wMDAwMSwuOTk5MzYsMS4wMDA1MiwxLjAwMDEyLC45OTk5NiwxLjAwMDQzLDEsMS4wMDAzNSwuOTk5NCwuOTk5NzYsMS4wMDAzNSwuOTk5NzMsMS4wMDA1MiwxLjAwMDQxLDEuMDAxMTksMS4wMDAzNywuOTk5NzMsMS4wMDAwMiwuOTk5ODYsMS4wMDA0MSwxLjAwMDQxLC45OTkwMiwuOTk5NiwxLjAwMDM0LC45OTk5OSwxLjAwMDI2LC45OTk5OSwxLjAwMDI2LC45OTk3MywxLjAwMDUyLC45OTk3MywxLC45OTk3MywxLjAwMDQxLDEuMDAwNzUsLjk5OTQsMS4wMDAzLC45OTk5OSwxLDEuMDAwNDEsLjk5OTU1LDEsLjk5OTE1LC45OTk3MywuOTk5NzMsMS4wMDAyNiwxLjAwMTE5LC45OTk1NSwuOTk5NzMsMS4wMDA2LC45OTkxMSwxLjAwMDYsMS4wMDAyNiwuOTk5NzIsMS4wMDAyNiwuOTk5MDIsMS4wMDA0MSwuOTk5NzMsLjk5OTk5LDEsMSwxLjAwMDM4LDEuMDAwNSwxLjAwMDE2LDEuMDAwMjIsMS4wMDAxNiwxLjAwMDIyLDEuMDAwMTYsMS4wMDAyMiwxLjAwMDAxLC45OTk3MywxLDEsLjk5OTczLDEsMSwuOTk5NTUsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEsMSwxLC45OTk3MywuOTk5NzMsLjk5OTcyLDEsMSwxLjAwMTA2LC45OTk5OSwuOTk5OTgsLjk5OTk4LC45OTk5OSwuOTk5OTgsMS42NjQ3NSwxLC45OTk3MywuOTk5NzMsMS4wMDAyMywuOTk5NzMsLjk5OTcxLDEuMDAwNDcsMS4wMDAyMywxLC45OTk5MSwuOTk5ODQsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLDEsMSwxLDEsMSwxLC45OTk3MiwxLDEuMjA5ODUsMS4zOTcxMywxLjAwMDAzLDEuMDAwMzEsMS4wMDAxNSwxLC45OTU2MSwxLjAwMDI3LDEuMDAwMzEsMS4wMDAzMSwuOTk5MTUsMS4wMDAzMSwxLjAwMDMxLC45OTk5OSwxLjAwMDAzLC45OTk5OSwuOTk5OTksMS40MTE0NCwxLjYsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQwNTc5LDEuNDA1NzksMS4zNjYyNSwuOTk5OTksMSwuOTk4NjEsLjk5ODYxLDEsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwuOTk5NzIsLjk5OTk5LC45OTk5OSwuOTk5OTksLjk5OTk5LDEuNDA0ODMsMSwuOTk5NzcsMS4wMDA1NCwxLDEsLjk5OTUzLC45OTk2MiwxLjAwMDQyLC45OTk1LDEsMSwxLDEsMSwxLDEsMSwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LkhlbHZldGljYUJvbGRNZXRyaWNzPXtsaW5lSGVpZ2h0OjEuMixsaW5lR2FwOi4yfSx0LkhlbHZldGljYUJvbGRJdGFsaWNGYWN0b3JzPVsuNzYxMTYsMSwxLDEuMDAwNiwuOTk5OTgsLjk5OTc0LC45OTk3MywuOTk5NzMsLjk5OTgyLC45OTk3NywxLjAwMDg3LC45OTk5OCwuOTk5OTgsLjk5OTU5LDEuMDAwMDMsMS4wMDA2LC45OTk5OCwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5OTgsMSwxLjAwMDAzLDEuMDAwMDMsMS4wMDAwMywxLjAwMDI2LC45OTk5LC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMjYsMS4wMDAyMiwuOTk5NzcsMS4wMDA2LC45OTk3MywuOTk5NzcsMS4wMDAyNiwuOTk5OTksLjk5OTc3LDEuMDAwMjIsMS4wMDAwMSwxLjAwMDIyLC45OTk3NywxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMDEsMS4wMDAxNiwxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwuOTk5OTgsMS4wMDA2LC45OTk5OCwxLjAwMDAzLC45OTk3MywuOTk5OTgsLjk5OTczLDEuMDAwMjYsLjk5OTczLDEuMDAwMjYsLjk5OTczLC45OTk5OCwxLjAwMDI2LDEuMDAwMjYsMS4wMDA2LDEuMDAwNiwuOTk5NzMsMS4wMDA2LC45OTk4MiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LC45OTk1OSwuOTk5NzMsLjk5OTk4LDEuMDAwMjYsLjk5OTczLDEuMDAwMjIsLjk5OTczLC45OTk3MywxLC45OTk1OSwxLjAwMDc3LC45OTk1OSwxLjAwMDAzLC45OTk5OCwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA3NywuOTk5NzMsLjk5OTk4LDEuMDAwMjUsLjk5OTY4LC45OTk3MywxLjAwMDAzLDEuMDAwMjUsLjYwMjk5LDEuMDAwMjQsMS4wNjQwOSwxLDEsLjk5OTk4LDEsLjk5OTczLDEuMDAwNiwuOTk5OTgsMSwuOTk5MzYsLjk5OTczLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMjYsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywuOTk5NzcsMSwuOTk5NzcsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTc3LC45OTk3NywxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAwMywxLjAwMDIyLC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5ODIsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwxLjA2NDA5LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwuOTk5NzMsMS4wMDAyNiwuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsMS4wMDQ0LC45OTk3NywxLjAwMDI2LDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMjIsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTcxLC45OTk3MywuOTk5NzMsMS4wMDA2LC45OTk3NywuOTk5NzMsLjk5OTczLDEuMDAwMjYsMS4wMDA2LDEuMDAwMjYsMS4wMDA2LDEuMDAwMjYsMS4wMTAxMSwxLjAwMDI2LC45OTk5OSwxLjAwMDI2LDEuMDAwNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5NzcsMS4wMDAyNiwuOTk5MywuOTk5OCwxLjAwMDI2LDEuMDAwMjIsMS4wMDAyNiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAyMiwxLjAwMDI2LDEsMS4wMDAxNiwuOTk5NzcsLjk5OTU5LC45OTk3NywuOTk5NTksLjk5OTc3LC45OTk1OSwxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDI2LC45OTk5OCwxLjAwMDI2LC44MTIxLDEuMDAwMjYsLjk5OTk4LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LC45OTk3NywxLjAwMDI2LDEuMDAwMTYsMS4wMDAyMiwxLjAwMDAxLC45OTk3MywxLjAwMDAxLDEuMDAwMjYsMSwxLjAwMDI2LDEsMS4wMDAyNiwxLDEuMDAwNiwuOTk5NzMsLjk5OTc3LC45OTk3MywxLC45OTk4MiwxLjAwMDIyLDEuMDAwMjYsMS4wMDAwMSwuOTk5NzMsMS4wMDAyNiwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5NzcsMSwxLDEuMDAwMjYsLjk5OTY5LC45OTk3MiwuOTk5ODEsLjk5OTgsMS4wMDA2LC45OTk3NywuOTk5NzcsMS4wMDAyMiwuOTExNTUsMS4wMDAwMSwxLjAwMDI2LC45OTk3NywxLjAwMDIyLDEuMDAwNiwuOTk5NzcsMS4wMDAwMSwuOTk5OTksLjk5OTc3LC45OTk2NiwxLjAwMDIyLDEuMDAwMzIsMS4wMDAwMSwuOTk5NDQsMS4wMDAyNiwxLjAwMDAxLC45OTk2OCwxLjAwMDAxLDEuMDAwNDcsMSwxLjAwMDYsMS4wMDAwMSwuOTk5ODEsMS4wMDEwMSwxLjAwMDI2LDEuMDAwNiwuOTk5NDgsLjk5OTgxLDEuMDAwNjQsLjk5OTczLC45OTk0MiwxLjAwMTAxLDEuMDAwNjEsMS4wMDAyNiwxLjAwMDY5LDEuMDAwNiwxLjAwMDE0LC45OTk3MywxLjAxMzIyLC45OTk3MywxLjAwMDY1LDEuMDAwMjYsMS4wMDAxMiwuOTk5MjMsMSwxLjAwMDY0LDEuMDAwNzYsLjk5OTQ4LDEuMDAwNTUsMS4wMDA2MywxLjAwMDA3LC45OTk0MywxLjAwMDYsLjk5OTQ4LDEuMDAwMjYsLjk5OTQ4LC45OTk0MywxLjAwMDAxLDEuMDAwMDEsMS4wMDAyOSwxLjAwMDM4LDEuMDAwMzUsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzgsMS4wMDAwMSwxLjAwMDU3LC45OTk4OSwuOTk5NjcsLjk5OTY0LC45OTk2NywuOTk5NzcsLjk5OTk5LC45OTk3NywxLjAwMDM4LC45OTk3NywxLjAwMDAxLC45OTk3MywxLjAwMDY2LC45OTk2NywuOTk5NjcsMS4wMDA0MSwuOTk5OTgsLjk5OTk5LC45OTk3NywxLjAwMDIyLC45OTk2NywxLjAwMDAxLC45OTk3NywxLjAwMDI2LC45OTk2NCwxLjAwMDMxLDEuMDAwMDEsLjk5OTk5LC45OTk5OSwxLDEuMDAwMjMsMSwxLC45OTk5OSwxLjAwMDM1LDEuMDAwMDEsLjk5OTk5LC45OTk3MywuOTk5NzcsLjk5OTk5LDEuMDAwNTgsLjk5OTczLC45OTk3MywuOTk5NTUsLjk5OTUsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMzIsLjk5OTg5LDEuMDAwMzQsLjk5OTk5LDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LC45OTk3MywuNDU5OTgsLjk5OTczLDEuMDAwMjYsLjk5OTczLDEuMDAwMDEsLjk5OTk5LC45OTk4MiwuOTk5OTQsLjk5OTk2LDEsMS4wMDA0MiwxLjAwMDQ0LDEuMDAwMjksMS4wMDAyMywuOTk5NzMsLjk5OTczLDEuMDAwMjYsLjk5OTQ5LDEuMDAwMDIsLjk5OTczLDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk3NSwxLjAwMDI2LDEuMDAwMjYsMS4wMDAzMiwuOTg2ODUsLjk5OTczLDEuMDAwMjYsMSwxLC45OTk2NiwxLjAwMDQ0LDEuMDAwMTYsMS4wMDAyMiwxLjAwMDE2LDEuMDAwMjIsMS4wMDAxNiwxLjAwMDIyLDEuMDAwMDEsLjk5OTczLDEsMSwuOTk5NzMsMSwxLC45OTk1NSwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMSwxLDEsLjk5OTczLC45OTk3MywuOTk5NzIsMSwxLDEuMDAxMDYsLjk5OTk5LC45OTk5OCwuOTk5OTgsLjk5OTk5LC45OTk5OCwxLjY2NDc1LDEsLjk5OTczLC45OTk3MywxLC45OTk3MywuOTk5NzEsLjk5OTc4LDEsMSwuOTk5OTEsLjk5OTg0LDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDA5OCwxLDEsMSwxLjAwMDQ5LDEsMSwuOTk5NzIsMSwxLjIwOTg1LDEuMzk3MTMsMS4wMDAwMywxLjAwMDMxLDEuMDAwMTUsMSwuOTk1NjEsMS4wMDAyNywxLjAwMDMxLDEuMDAwMzEsLjk5OTE1LDEuMDAwMzEsMS4wMDAzMSwuOTk5OTksMS4wMDAwMywuOTk5OTksLjk5OTk5LDEuNDExNDQsMS42LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MDU3OSwxLjQwNTc5LDEuMzY2MjUsLjk5OTk5LDEsLjk5ODYxLC45OTg2MSwxLDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsLjk5OTcyLC45OTk5OSwuOTk5OTksLjk5OTk5LC45OTk5OSwxLjQwNDgzLDEsLjk5OTc3LDEuMDAwNTQsMSwxLC45OTk1MywuOTk5NjIsMS4wMDA0MiwuOTk5NSwxLDEsMSwxLDEsMSwxLDEsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LDEsMSwxLDEsMSwxLDEsMSwxLDEsMV0sdC5IZWx2ZXRpY2FCb2xkSXRhbGljTWV0cmljcz17bGluZUhlaWdodDoxLjM1LGxpbmVHYXA6LjJ9LHQuSGVsdmV0aWNhSXRhbGljRmFjdG9ycz1bLjc2MTE2LDEsMSwxLjAwMDYsMS4wMDA2LDEuMDAwMDYsLjk5OTczLC45OTk3MywuOTk5ODIsMS4wMDAwMSwxLjAwMDQzLC45OTk5OCwuOTk5OTgsLjk5OTU5LDEuMDAwMDMsMS4wMDA2LC45OTk5OCwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDYsMSwxLjAwMDAzLDEuMDAwMDMsMS4wMDAwMywuOTk5NzMsLjk5OTg3LDEuMDAwMDEsMS4wMDAwMSwuOTk5NzcsLjk5OTc3LDEuMDAwMDEsMS4wMDAyNiwxLjAwMDIyLC45OTk3NywxLjAwMDYsMSwxLjAwMDAxLC45OTk3MywuOTk5OTksLjk5OTc3LDEuMDAwMjIsMS4wMDAwMSwxLjAwMDIyLC45OTk3NywxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMDEsMS4wMDAxNiwxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwuOTk5NDksLjk5OTczLC45OTk5OCwuOTk5NzMsLjk5OTczLDEsLjk5OTczLC45OTk3MywxLjAwMDYsLjk5OTczLC45OTk3MywuOTk5MjQsLjk5OTI0LDEsLjk5OTI0LC45OTk5OSwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTk4LDEsMS4wMDA2LC45OTk3MywxLC45OTk3NywxLDEsMSwxLjAwMDA1LDEuMDAwOSwxLjAwMDA1LDEuMDAwMDMsLjk5OTk4LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDksLjk5OTczLC45OTk5OCwxLjAwMDI1LC45OTk2OCwuOTk5NzMsMS4wMDAwMywxLjAwMDI1LC42MDI5OSwxLjAwMDI0LDEuMDY0MDksMSwxLC45OTk5OCwxLC45OTk4LDEuMDAwNiwuOTk5OTgsMSwuOTk5MzYsLjk5OTczLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMjYsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMSwuOTk5NzcsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTc3LC45OTk3NywxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAwMywxLjAwMDIyLC45OTk3NywuOTk5NzcsLjk5OTc3LC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5ODIsMSwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjA2NDA5LDEuMDAwMjYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEsLjk5OTczLDEsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsMS4wMDAwMSwuOTk5NzMsLjk5OTc3LDEsLjk5OTc3LDEsLjk5OTc3LDEsLjk5OTc3LDEsLjk5OTc3LDEuMDI4OCwuOTk5NzcsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTI0LDEuMDAwNiwxLjAwMDYsLjk5OTQ2LDEuMDAwMzQsMSwuOTk5MjQsMS4wMDAwMSwxLDEsLjk5OTczLC45OTkyNCwuOTk5NzMsLjk5OTI0LC45OTk3MywxLjA2MzExLC45OTk3MywxLjAwMDI0LC45OTk3MywuOTk5MjQsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsMS4wMDA0MSwuOTk5OCwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMSwxLjAwMDE2LC45OTk3NywuOTk5OTgsLjk5OTc3LC45OTk5OCwuOTk5NzcsLjk5OTk4LDEuMDAwMDEsMSwxLjAwMDAxLDEsMS4wMDAwMSwxLDEuMDAwMDEsMSwxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LC44OTU0NywxLjAwMDI2LDEuMDAwNiwuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywxLjAwMDE2LC45OTk3NywxLjAwMDAxLDEsMS4wMDAwMSwxLjAwMDI2LDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwuOTk5MjQsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEsLjk5OTgyLDEuMDAwMjIsMS4wMDAyNiwxLjAwMDAxLDEsMS4wMDAyNiwxLjAwMDYsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwxLjAwMDAxLDEsMS4wMDA1NCwuOTk5NzcsMS4wMDA4NCwxLjAwMDA3LC45OTk3MywxLjAwMDEzLC45OTkyNCwxLjAwMDAxLDEuMDAwMDEsLjk5OTQ1LC45MTIyMSwxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMjIsMS4wMDA2LDEuMDAwMDEsMS4wMDAwMSwuOTk5OTksLjk5OTc3LC45OTkzMywxLjAwMDIyLDEuMDAwNTQsMS4wMDAwMSwxLjAwMDY1LDEuMDAwMjYsMS4wMDAwMSwxLjAwMDEsMS4wMDAwMSwxLjAwMDUyLDEsMS4wMDA2LDEuMDAwMDEsLjk5OTQ1LC45OTg5NywuOTk5NjgsLjk5OTI0LDEuMDAwMzYsLjk5OTQ1LC45OTk0OSwxLDEuMDAwNiwuOTk4OTcsLjk5OTE4LC45OTk2OCwuOTk5MTEsLjk5OTI0LDEsLjk5OTYyLDEuMDE0ODcsMSwxLjAwMDUsLjk5OTczLDEuMDAwMTIsMS4wMDA0MywxLC45OTk5NSwuOTk5OTQsMS4wMDAzNiwuOTk5NDcsMS4wMDAxOSwxLjAwMDYzLDEuMDAwMjUsLjk5OTI0LDEuMDAwMzYsLjk5OTczLDEuMDAwMzYsMS4wMDAyNSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAyNywxLjAwMDEsMS4wMDA2OCwxLjAwMDAxLDEuMDAwNiwxLjAwMDYsMSwxLjAwMDA4LC45OTk1NywuOTk5NzIsLjk5OTQsLjk5OTU0LC45OTk3NSwxLjAwMDUxLDEuMDAwMDEsMS4wMDAxOSwxLjAwMDAxLDEuMDAwMSwuOTk5ODYsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMzgsLjk5OTU0LC45OTk1NCwuOTk5NCwxLjAwMDY2LC45OTk5OSwuOTk5NzcsMS4wMDAyMiwxLjAwMDU0LDEuMDAwMDEsLjk5OTc3LDEuMDAwMjYsLjk5OTc1LDEuMDAwMSwxLjAwMDAxLC45OTk5MywuOTk5NSwuOTk5NTUsMS4wMDAxNiwuOTk5NzgsLjk5OTc0LDEuMDAwMTksMS4wMDAyMiwuOTk5NTUsMS4wMDA1MywuOTk5NzMsMS4wMDA4OSwxLjAwMDA1LC45OTk2NywxLjAwMDQ4LC45OTk3MywxLjAwMDAyLDEuMDAwMzQsLjk5OTczLC45OTk3MywuOTk5NjQsMS4wMDAwNiwxLjAwMDY2LC45OTk0NywuOTk5NzMsLjk4ODk0LC45OTk3MywxLC40NDg5OCwxLC45OTk0NiwxLDEuMDAwMzksMS4wMDA4MiwuOTk5OTEsLjk5OTkxLC45OTk4NSwxLjAwMDIyLDEuMDAwMjMsMS4wMDA2MSwxLjAwMDA2LC45OTk2NiwuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDE5LDEuMDAwOCwxLC45OTkyNCwuOTk5MjQsLjk5OTI0LC45OTk4MywxLjAwMDQ0LC45OTk3MywuOTk5NjQsLjk4MzMyLDEsLjk5OTczLDEsMSwuOTk5NjIsLjk5ODk1LDEuMDAwMTYsLjk5OTc3LDEuMDAwMTYsLjk5OTc3LDEuMDAwMTYsLjk5OTc3LDEuMDAwMDEsMSwxLDEsLjk5OTczLDEsMSwuOTk5NTUsLjk5OTI0LC45OTkyNCwuOTk5MjQsLjk5OTI0LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk3MywuOTk5NzMsLjk5OTcyLDEsMSwxLjAwMjY3LC45OTk5OSwuOTk5OTgsLjk5OTk4LDEsLjk5OTk4LDEuNjY0NzUsMSwuOTk5NzMsLjk5OTczLDEuMDAwMjMsLjk5OTczLDEuMDA0MjMsLjk5OTI1LC45OTk5OSwxLC45OTk5MSwuOTk5ODQsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDQ5LDEsMS4wMDI0NSwxLDEsMSwxLC45NjMyOSwxLDEuMjA5ODUsMS4zOTcxMywxLjAwMDAzLC44MjU0LDEuMDAwMTUsMSwxLjAwMDM1LDEuMDAwMjcsMS4wMDAzMSwxLjAwMDMxLDEuMDAwMDMsMS4wMDAzMSwxLjAwMDMxLC45OTk5OSwxLjAwMDAzLC45OTk5OSwuOTk5OTksMS40MTE0NCwxLjYsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQwNTc5LDEuNDA1NzksMS4zNjYyNSwuOTk5OTksMSwuOTk4NjEsLjk5ODYxLDEsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsMS4wMDAyNiwuOTUzMTcsLjk5OTk5LC45OTk5OSwuOTk5OTksLjk5OTk5LDEuNDA0ODMsMSwuOTk5NzcsMS4wMDA1NCwxLDEsLjk5OTUzLC45OTk2MiwxLjAwMDQyLC45OTk1LDEsMSwxLDEsMSwxLDEsMSwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LkhlbHZldGljYUl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4zNSxsaW5lR2FwOi4yfSx0LkhlbHZldGljYVJlZ3VsYXJGYWN0b3JzPVsuNzYxMTYsMSwxLDEuMDAwNiwxLjAwMDYsMS4wMDAwNiwuOTk5NzMsLjk5OTczLC45OTk4MiwxLjAwMDAxLDEuMDAwNDMsLjk5OTk4LC45OTk5OCwuOTk5NTksMS4wMDAwMywxLjAwMDYsLjk5OTk4LDEuMDAwNiwxLjAwMDYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDAwNiwxLDEuMDAwMDMsMS4wMDAwMywxLjAwMDAzLC45OTk3MywuOTk5ODcsMS4wMDAwMSwxLjAwMDAxLC45OTk3NywuOTk5NzcsMS4wMDAwMSwxLjAwMDI2LDEuMDAwMjIsLjk5OTc3LDEuMDAwNiwxLDEuMDAwMDEsLjk5OTczLC45OTk5OSwuOTk5NzcsMS4wMDAyMiwxLjAwMDAxLDEuMDAwMjIsLjk5OTc3LDEuMDAwMDEsMS4wMDAyNiwuOTk5NzcsMS4wMDAwMSwxLjAwMDE2LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDI2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LC45OTk0OSwuOTk5NzMsLjk5OTk4LC45OTk3MywuOTk5NzMsMSwuOTk5NzMsLjk5OTczLDEuMDAwNiwuOTk5NzMsLjk5OTczLC45OTkyNCwuOTk5MjQsMSwuOTk5MjQsLjk5OTk5LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5OTgsMSwxLjAwMDYsLjk5OTczLDEsLjk5OTc3LDEsMSwxLDEuMDAwMDUsMS4wMDA5LDEuMDAwMDUsMS4wMDAwMywuOTk5OTgsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDAwOSwuOTk5NzMsLjk5OTk4LDEuMDAwMjUsLjk5OTY4LC45OTk3MywxLjAwMDAzLDEuMDAwMjUsLjYwMjk5LDEuMDAwMjQsMS4wNjQwOSwxLDEsLjk5OTk4LDEsLjk5OTgsMS4wMDA2LC45OTk5OCwxLC45OTkzNiwuOTk5NzMsMS4wMDAwMiwxLjAwMDAyLDEuMDAwMDIsMS4wMDAyNiwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLC45OTk3NywxLjAwMDAxLDEuMDAwMDEsMS4wMDAwMSwxLjAwMDAxLDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwuOTk5NzcsLjk5OTc3LDEuMDAwMjIsMS4wMDAyMiwxLjAwMDIyLDEuMDAwMjIsMS4wMDAyMiwxLjAwMDAzLDEuMDAwMjIsLjk5OTc3LC45OTk3NywuOTk5NzcsLjk5OTc3LDEuMDAwMDEsMS4wMDAwMSwxLjAwMDI2LC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk4MiwxLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsLjk5OTczLDEuMDY0MDksMS4wMDAyNiwuOTk5NzMsLjk5OTczLC45OTk3MywuOTk5NzMsMSwuOTk5NzMsMSwxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywxLjAwMDAxLC45OTk3MywuOTk5NzcsMSwuOTk5NzcsMSwuOTk5NzcsMSwuOTk5NzcsMSwuOTk5NzcsMS4wNDU5NiwuOTk5NzcsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLDEuMDAwMjIsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsMS4wMDA2LDEuMDAwNiwxLjAwMDYsLjk5OTI0LDEuMDAwNiwxLjAwMDYsMS4wMDAxOSwxLjAwMDM0LDEsLjk5OTI0LDEuMDAwMDEsMSwxLC45OTk3MywuOTk5MjQsLjk5OTczLC45OTkyNCwuOTk5NzMsMS4wMjU3MiwuOTk5NzMsMS4wMDAwNSwuOTk5NzMsLjk5OTI0LC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk5OSwuOTk5OCwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMS4wMDAyMiwuOTk5NzMsMSwxLjAwMDE2LC45OTk3NywuOTk5OTgsLjk5OTc3LC45OTk5OCwuOTk5NzcsLjk5OTk4LDEuMDAwMDEsMSwxLjAwMDAxLDEsMS4wMDAwMSwxLDEuMDAwMDEsMSwxLjAwMDI2LDEuMDAwNiwxLjAwMDI2LC44NDUzMywxLjAwMDI2LDEuMDAwNiwuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywuOTk5NzcsLjk5OTczLC45OTk3NywuOTk5NzMsLjk5OTc3LC45OTk3MywxLjAwMDE2LC45OTk3NywxLjAwMDAxLDEsMS4wMDAwMSwxLjAwMDI2LDEsMS4wMDAyNiwxLDEuMDAwMjYsMSwuOTk5MjQsLjk5OTczLDEuMDAwMDEsLjk5OTczLDEsLjk5OTgyLDEuMDAwMjIsMS4wMDAyNiwxLjAwMDAxLDEsMS4wMDAyNiwxLjAwMDYsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTk4LC45OTk5OCwuOTk5MjgsMSwuOTk5NzcsMS4wMDAxMywxLjAwMDU1LC45OTk0NywuOTk5NDUsLjk5OTQxLC45OTkyNCwxLjAwMDAxLDEuMDAwMDEsMS4wMDA0LC45MTYyMSwxLjAwMDAxLDEuMDAwMjYsLjk5OTc3LDEuMDAwMjIsMS4wMDA2LDEuMDAwMDEsMS4wMDAwNSwuOTk5OTksLjk5OTc3LDEuMDAwMTUsMS4wMDAyMiwuOTk5NzcsMS4wMDAwMSwuOTk5NzMsMS4wMDAyNiwxLjAwMDAxLDEuMDAwMTksMS4wMDAwMSwuOTk5NDYsMSwxLjAwMDYsMS4wMDAwMSwuOTk5NzgsMS4wMDA0NSwuOTk5NzMsLjk5OTI0LDEuMDAwMjMsLjk5OTc4LC45OTk2NiwxLDEuMDAwNjUsMS4wMDA0NSwxLjAwMDE5LC45OTk3MywuOTk5NzMsLjk5OTI0LDEsMSwuOTY0OTksMSwxLjAwMDU1LC45OTk3MywxLjAwMDA4LDEuMDAwMjcsMSwuOTk5NywuOTk5OTUsMS4wMDAyMywuOTk5MzMsMS4wMDAxOSwxLjAwMDE1LDEuMDAwMzEsLjk5OTI0LDEuMDAwMjMsLjk5OTczLDEuMDAwMjMsMS4wMDAzMSwxLjAwMDAxLC45OTkyOCwxLjAwMDI5LDEuMDAwOTIsMS4wMDAzNSwxLjAwMDAxLDEuMDAwNiwxLjAwMDYsMSwuOTk5ODgsLjk5OTc1LDEsMS4wMDA4MiwuOTk1NjEsLjk5OTYsMS4wMDAzNSwxLjAwMDAxLC45OTk2MiwxLjAwMDAxLDEuMDAwOTIsLjk5OTY0LDEuMDAwMDEsLjk5OTYzLC45OTk5OSwxLjAwMDM1LDEuMDAwMzUsMS4wMDA4MiwuOTk5NjIsLjk5OTk5LC45OTk3NywxLjAwMDIyLDEuMDAwMzUsMS4wMDAwMSwuOTk5NzcsMS4wMDAyNiwuOTk5NiwuOTk5NjcsMS4wMDAwMSwxLjAwMDM0LDEuMDAwNzQsMS4wMDA1NCwxLjAwMDUzLDEuMDAwNjMsLjk5OTcxLC45OTk2MiwxLjAwMDM1LC45OTk3NSwuOTk5NzcsLjk5OTczLDEuMDAwNDMsLjk5OTUzLDEuMDAwNywuOTk5MTUsLjk5OTczLDEuMDAwMDgsLjk5ODkyLDEuMDAwNzMsMS4wMDA3MywxLjAwMTE0LC45OTkxNSwxLjAwMDczLC45OTk1NSwuOTk5NzMsMS4wMDA5MiwuOTk5NzMsMSwuOTk5OTgsMSwxLjAwMDMsMSwxLjAwMDQzLDEuMDAwMDEsLjk5OTY5LDEuMDAwMywxLDEuMDAwMzUsMS4wMDAwMSwuOTk5NSwxLDEuMDAwOTIsLjk5OTczLC45OTk3MywuOTk5NzMsMS4wMDA3LC45OTk1LDEsLjk5OTI0LDEuMDAwNiwuOTk5MjQsLjk5OTcyLDEuMDAwNjIsLjk5OTczLDEuMDAxMTQsMS4wMDA3MywxLC45OTk1NSwxLDEsMS4wMDA0NywuOTk5NjgsMS4wMDAxNiwuOTk5NzcsMS4wMDAxNiwuOTk5NzcsMS4wMDAxNiwuOTk5NzcsMS4wMDAwMSwxLDEsMSwuOTk5NzMsMSwxLC45OTk1NSwuOTk5MjQsLjk5OTI0LC45OTkyNCwuOTk5MjQsLjk5OTk4LC45OTk5OCwuOTk5OTgsLjk5OTczLC45OTk3MywuOTk5NzIsMSwxLDEuMDAyNjcsLjk5OTk5LC45OTk5OCwuOTk5OTgsMSwuOTk5OTgsMS42NjQ3NSwxLC45OTk3MywuOTk5NzMsMS4wMDAyMywuOTk5NzMsLjk5OTcxLC45OTkyNSwxLjAwMDIzLDEsLjk5OTkxLC45OTk4NCwxLjAwMDAyLDEuMDAwMDIsMS4wMDAwMiwxLjAwMDAyLDEsMSwxLDEsMSwxLDEsLjk2MzI5LDEsMS4yMDk4NSwxLjM5NzEzLDEuMDAwMDMsLjgyNTQsMS4wMDAxNSwxLDEuMDAwMzUsMS4wMDAyNywxLjAwMDMxLDEuMDAwMzEsLjk5OTE1LDEuMDAwMzEsMS4wMDAzMSwuOTk5OTksMS4wMDAwMywuOTk5OTksLjk5OTk5LDEuNDExNDQsMS42LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MTE0NCwxLjQxMTQ0LDEuNDExNDQsMS40MDU3OSwxLjQwNTc5LDEuMzY2MjUsLjk5OTk5LDEsLjk5ODYxLC45OTg2MSwxLDEuMDAwMjYsMS4wMDAyNiwxLjAwMDI2LDEuMDAwMjYsLjk1MzE3LC45OTk5OSwuOTk5OTksLjk5OTk5LC45OTk5OSwxLjQwNDgzLDEsLjk5OTc3LDEuMDAwNTQsMSwxLC45OTk1MywuOTk5NjIsMS4wMDA0MiwuOTk5NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuSGVsdmV0aWNhUmVndWxhck1ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yLGxpbmVHYXA6LjJ9fSwoZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkxpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocz10LkxpYmVyYXRpb25TYW5zUmVndWxhck1hcHBpbmc9dC5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocz10LkxpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZz10LkxpYmVyYXRpb25TYW5zQm9sZFdpZHRocz10LkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmc9dC5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHM9dC5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nPXZvaWQgMCx0LkxpYmVyYXRpb25TYW5zQm9sZFdpZHRocz1bMzY1LDAsMzMzLDI3OCwzMzMsNDc0LDU1Niw1NTYsODg5LDcyMiwyMzgsMzMzLDMzMywzODksNTg0LDI3OCwzMzMsMjc4LDI3OCw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsMzMzLDMzMyw1ODQsNTg0LDU4NCw2MTEsOTc1LDcyMiw3MjIsNzIyLDcyMiw2NjcsNjExLDc3OCw3MjIsMjc4LDU1Niw3MjIsNjExLDgzMyw3MjIsNzc4LDY2Nyw3NzgsNzIyLDY2Nyw2MTEsNzIyLDY2Nyw5NDQsNjY3LDY2Nyw2MTEsMzMzLDI3OCwzMzMsNTg0LDU1NiwzMzMsNTU2LDYxMSw1NTYsNjExLDU1NiwzMzMsNjExLDYxMSwyNzgsMjc4LDU1NiwyNzgsODg5LDYxMSw2MTEsNjExLDYxMSwzODksNTU2LDMzMyw2MTEsNTU2LDc3OCw1NTYsNTU2LDUwMCwzODksMjgwLDM4OSw1ODQsMzMzLDU1Niw1NTYsNTU2LDU1NiwyODAsNTU2LDMzMyw3MzcsMzcwLDU1Niw1ODQsNzM3LDU1Miw0MDAsNTQ5LDMzMywzMzMsMzMzLDU3Niw1NTYsMjc4LDMzMywzMzMsMzY1LDU1Niw4MzQsODM0LDgzNCw2MTEsNzIyLDcyMiw3MjIsNzIyLDcyMiw3MjIsMWUzLDcyMiw2NjcsNjY3LDY2Nyw2NjcsMjc4LDI3OCwyNzgsMjc4LDcyMiw3MjIsNzc4LDc3OCw3NzgsNzc4LDc3OCw1ODQsNzc4LDcyMiw3MjIsNzIyLDcyMiw2NjcsNjY3LDYxMSw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw4ODksNTU2LDU1Niw1NTYsNTU2LDU1NiwyNzgsMjc4LDI3OCwyNzgsNjExLDYxMSw2MTEsNjExLDYxMSw2MTEsNjExLDU0OSw2MTEsNjExLDYxMSw2MTEsNjExLDU1Niw2MTEsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDcxOSw3MjIsNjExLDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw3NzgsNjExLDc3OCw2MTEsNzc4LDYxMSw3NzgsNjExLDcyMiw2MTEsNzIyLDYxMSwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsNzg1LDU1Niw1NTYsMjc4LDcyMiw1NTYsNTU2LDYxMSwyNzgsNjExLDI3OCw2MTEsMzg1LDYxMSw0NzksNjExLDI3OCw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw3MDgsNzIzLDYxMSw3NzgsNjExLDc3OCw2MTEsNzc4LDYxMSwxZTMsOTQ0LDcyMiwzODksNzIyLDM4OSw3MjIsMzg5LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjExLDMzMyw2MTEsNDc5LDYxMSwzMzMsNzIyLDYxMSw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDcyMiw2MTEsOTQ0LDc3OCw2NjcsNTU2LDY2Nyw2MTEsNTAwLDYxMSw1MDAsNjExLDUwMCwyNzgsNTU2LDcyMiw1NTYsMWUzLDg4OSw3NzgsNjExLDY2Nyw1NTYsNjExLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsNDY1LDcyMiwzMzMsODUzLDkwNiw0NzQsODI1LDkyNyw4MzgsMjc4LDcyMiw3MjIsNjAxLDcxOSw2NjcsNjExLDcyMiw3NzgsMjc4LDcyMiw2NjcsODMzLDcyMiw2NDQsNzc4LDcyMiw2NjcsNjAwLDYxMSw2NjcsODIxLDY2Nyw4MDksODAyLDI3OCw2NjcsNjE1LDQ1MSw2MTEsMjc4LDU4Miw2MTUsNjEwLDU1Niw2MDYsNDc1LDQ2MCw2MTEsNTQxLDI3OCw1NTgsNTU2LDYxMiw1NTYsNDQ1LDYxMSw3NjYsNjE5LDUyMCw2ODQsNDQ2LDU4Miw3MTUsNTc2LDc1Myw4NDUsMjc4LDU4Miw2MTEsNTgyLDg0NSw2NjcsNjY5LDg4NSw1NjcsNzExLDY2NywyNzgsMjc2LDU1NiwxMDk0LDEwNjIsODc1LDYxMCw3MjIsNjIyLDcxOSw3MjIsNzE5LDcyMiw1NjcsNzEyLDY2Nyw5MDQsNjI2LDcxOSw3MTksNjEwLDcwMiw4MzMsNzIyLDc3OCw3MTksNjY3LDcyMiw2MTEsNjIyLDg1NCw2NjcsNzMwLDcwMywxMDA1LDEwMTksODcwLDk3OSw3MTksNzExLDEwMzEsNzE5LDU1Niw2MTgsNjE1LDQxNyw2MzUsNTU2LDcwOSw0OTcsNjE1LDYxNSw1MDAsNjM1LDc0MCw2MDQsNjExLDYwNCw2MTEsNTU2LDQ5MCw1NTYsODc1LDU1Niw2MTUsNTgxLDgzMyw4NDQsNzI5LDg1NCw2MTUsNTUyLDg1NCw1ODMsNTU2LDU1Niw2MTEsNDE3LDU1Miw1NTYsMjc4LDI4MSwyNzgsOTY5LDkwNiw2MTEsNTAwLDYxNSw1NTYsNjA0LDc3OCw2MTEsNDg3LDQ0Nyw5NDQsNzc4LDk0NCw3NzgsOTQ0LDc3OCw2NjcsNTU2LDMzMywzMzMsNTU2LDFlMywxZTMsNTUyLDI3OCwyNzgsMjc4LDI3OCw1MDAsNTAwLDUwMCw1NTYsNTU2LDM1MCwxZTMsMWUzLDI0MCw0NzksMzMzLDMzMyw2MDQsMzMzLDE2NywzOTYsNTU2LDU1NiwxMDk0LDU1Niw4ODUsNDg5LDExMTUsMWUzLDc2OCw2MDAsODM0LDgzNCw4MzQsODM0LDFlMyw1MDAsMWUzLDUwMCwxZTMsNTAwLDUwMCw0OTQsNjEyLDgyMyw3MTMsNTg0LDU0OSw3MTMsOTc5LDcyMiwyNzQsNTQ5LDU0OSw1ODMsNTQ5LDU0OSw2MDQsNTg0LDYwNCw2MDQsNzA4LDYyNSw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MjksNjA0LDYwNCwzNTQsMzU0LDFlMyw5OTAsOTkwLDk5MCw5OTAsNDk0LDYwNCw2MDQsNjA0LDYwNCwzNTQsMTAyMSwxMDUyLDkxNyw3NTAsNzUwLDUzMSw2NTYsNTk0LDUxMCw1MDAsNzUwLDc1MCw2MTEsNjExLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMjIyLDIyMiwzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzXSx0LkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmc9Wy0xLC0xLC0xLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NSwyNTYsMjU3LDI1OCwyNTksMjYwLDI2MSwyNjIsMjYzLDI2NCwyNjUsMjY2LDI2NywyNjgsMjY5LDI3MCwyNzEsMjcyLDI3MywyNzQsMjc1LDI3NiwyNzcsMjc4LDI3OSwyODAsMjgxLDI4MiwyODMsMjg0LDI4NSwyODYsMjg3LDI4OCwyODksMjkwLDI5MSwyOTIsMjkzLDI5NCwyOTUsMjk2LDI5NywyOTgsMjk5LDMwMCwzMDEsMzAyLDMwMywzMDQsMzA1LDMwNiwzMDcsMzA4LDMwOSwzMTAsMzExLDMxMiwzMTMsMzE0LDMxNSwzMTYsMzE3LDMxOCwzMTksMzIwLDMyMSwzMjIsMzIzLDMyNCwzMjUsMzI2LDMyNywzMjgsMzI5LDMzMCwzMzEsMzMyLDMzMywzMzQsMzM1LDMzNiwzMzcsMzM4LDMzOSwzNDAsMzQxLDM0MiwzNDMsMzQ0LDM0NSwzNDYsMzQ3LDM0OCwzNDksMzUwLDM1MSwzNTIsMzUzLDM1NCwzNTUsMzU2LDM1NywzNTgsMzU5LDM2MCwzNjEsMzYyLDM2MywzNjQsMzY1LDM2NiwzNjcsMzY4LDM2OSwzNzAsMzcxLDM3MiwzNzMsMzc0LDM3NSwzNzYsMzc3LDM3OCwzNzksMzgwLDM4MSwzODIsMzgzLDQwMiw1MDYsNTA3LDUwOCw1MDksNTEwLDUxMSw1MzYsNTM3LDUzOCw1MzksNzEwLDcxMSw3MTMsNzI4LDcyOSw3MzAsNzMxLDczMiw3MzMsOTAwLDkwMSw5MDIsOTAzLDkwNCw5MDUsOTA2LDkwOCw5MTAsOTExLDkxMiw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw5MzgsOTM5LDk0MCw5NDEsOTQyLDk0Myw5NDQsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjIsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LDk3MCw5NzEsOTcyLDk3Myw5NzQsMTAyNCwxMDI1LDEwMjYsMTAyNywxMDI4LDEwMjksMTAzMCwxMDMxLDEwMzIsMTAzMywxMDM0LDEwMzUsMTAzNiwxMDM3LDEwMzgsMTAzOSwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTA3OCwxMDc5LDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMDg4LDEwODksMTA5MCwxMDkxLDEwOTIsMTA5MywxMDk0LDEwOTUsMTA5NiwxMDk3LDEwOTgsMTA5OSwxMTAwLDExMDEsMTEwMiwxMTAzLDExMDQsMTEwNSwxMTA2LDExMDcsMTEwOCwxMTA5LDExMTAsMTExMSwxMTEyLDExMTMsMTExNCwxMTE1LDExMTYsMTExNywxMTE4LDExMTksMTEzOCwxMTM5LDExNjgsMTE2OSw3ODA4LDc4MDksNzgxMCw3ODExLDc4MTIsNzgxMyw3OTIyLDc5MjMsODIwOCw4MjA5LDgyMTEsODIxMiw4MjEzLDgyMTUsODIxNiw4MjE3LDgyMTgsODIxOSw4MjIwLDgyMjEsODIyMiw4MjI0LDgyMjUsODIyNiw4MjMwLDgyNDAsODI0Miw4MjQzLDgyNDksODI1MCw4MjUyLDgyNTQsODI2MCw4MzE5LDgzNTUsODM1Niw4MzU5LDgzNjQsODQ1Myw4NDY3LDg0NzAsODQ4Miw4NDg2LDg0OTQsODUzOSw4NTQwLDg1NDEsODU0Miw4NTkyLDg1OTMsODU5NCw4NTk1LDg1OTYsODU5Nyw4NjE2LDg3MDYsODcxMCw4NzE5LDg3MjEsODcyMiw4NzMwLDg3MzQsODczNSw4NzQ1LDg3NDcsODc3Niw4ODAwLDg4MDEsODgwNCw4ODA1LDg5NjIsODk3Niw4OTkyLDg5OTMsOTQ3Miw5NDc0LDk0ODQsOTQ4OCw5NDkyLDk0OTYsOTUwMCw5NTA4LDk1MTYsOTUyNCw5NTMyLDk1NTIsOTU1Myw5NTU0LDk1NTUsOTU1Niw5NTU3LDk1NTgsOTU1OSw5NTYwLDk1NjEsOTU2Miw5NTYzLDk1NjQsOTU2NSw5NTY2LDk1NjcsOTU2OCw5NTY5LDk1NzAsOTU3MSw5NTcyLDk1NzMsOTU3NCw5NTc1LDk1NzYsOTU3Nyw5NTc4LDk1NzksOTU4MCw5NjAwLDk2MDQsOTYwOCw5NjEyLDk2MTYsOTYxNyw5NjE4LDk2MTksOTYzMiw5NjMzLDk2NDIsOTY0Myw5NjQ0LDk2NTAsOTY1OCw5NjYwLDk2NjgsOTY3NCw5Njc1LDk2NzksOTY4OCw5Njg5LDk3MDIsOTc4Niw5Nzg3LDk3ODgsOTc5Miw5Nzk0LDk4MjQsOTgyNyw5ODI5LDk4MzAsOTgzNCw5ODM1LDk4MzYsNjE0NDEsNjE0NDIsNjE0NDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTFdLHQuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzPVszNjUsMCwzMzMsMjc4LDMzMyw0NzQsNTU2LDU1Niw4ODksNzIyLDIzOCwzMzMsMzMzLDM4OSw1ODQsMjc4LDMzMywyNzgsMjc4LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1NiwzMzMsMzMzLDU4NCw1ODQsNTg0LDYxMSw5NzUsNzIyLDcyMiw3MjIsNzIyLDY2Nyw2MTEsNzc4LDcyMiwyNzgsNTU2LDcyMiw2MTEsODMzLDcyMiw3NzgsNjY3LDc3OCw3MjIsNjY3LDYxMSw3MjIsNjY3LDk0NCw2NjcsNjY3LDYxMSwzMzMsMjc4LDMzMyw1ODQsNTU2LDMzMyw1NTYsNjExLDU1Niw2MTEsNTU2LDMzMyw2MTEsNjExLDI3OCwyNzgsNTU2LDI3OCw4ODksNjExLDYxMSw2MTEsNjExLDM4OSw1NTYsMzMzLDYxMSw1NTYsNzc4LDU1Niw1NTYsNTAwLDM4OSwyODAsMzg5LDU4NCwzMzMsNTU2LDU1Niw1NTYsNTU2LDI4MCw1NTYsMzMzLDczNywzNzAsNTU2LDU4NCw3MzcsNTUyLDQwMCw1NDksMzMzLDMzMywzMzMsNTc2LDU1NiwyNzgsMzMzLDMzMywzNjUsNTU2LDgzNCw4MzQsODM0LDYxMSw3MjIsNzIyLDcyMiw3MjIsNzIyLDcyMiwxZTMsNzIyLDY2Nyw2NjcsNjY3LDY2NywyNzgsMjc4LDI3OCwyNzgsNzIyLDcyMiw3NzgsNzc4LDc3OCw3NzgsNzc4LDU4NCw3NzgsNzIyLDcyMiw3MjIsNzIyLDY2Nyw2NjcsNjExLDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDg4OSw1NTYsNTU2LDU1Niw1NTYsNTU2LDI3OCwyNzgsMjc4LDI3OCw2MTEsNjExLDYxMSw2MTEsNjExLDYxMSw2MTEsNTQ5LDYxMSw2MTEsNjExLDYxMSw2MTEsNTU2LDYxMSw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNzQwLDcyMiw2MTEsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDc3OCw2MTEsNzc4LDYxMSw3NzgsNjExLDc3OCw2MTEsNzIyLDYxMSw3MjIsNjExLDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCw3ODIsNTU2LDU1NiwyNzgsNzIyLDU1Niw1NTYsNjExLDI3OCw2MTEsMjc4LDYxMSwzOTYsNjExLDQ3OSw2MTEsMjc4LDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDcwOCw3MjMsNjExLDc3OCw2MTEsNzc4LDYxMSw3NzgsNjExLDFlMyw5NDQsNzIyLDM4OSw3MjIsMzg5LDcyMiwzODksNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2MTEsMzMzLDYxMSw0NzksNjExLDMzMyw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw3MjIsNjExLDcyMiw2MTEsNzIyLDYxMSw5NDQsNzc4LDY2Nyw1NTYsNjY3LDYxMSw1MDAsNjExLDUwMCw2MTEsNTAwLDI3OCw1NTYsNzIyLDU1NiwxZTMsODg5LDc3OCw2MTEsNjY3LDU1Niw2MTEsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsNzIyLDMzMyw4NTQsOTA2LDQ3Myw4NDQsOTMwLDg0NywyNzgsNzIyLDcyMiw2MTAsNjcxLDY2Nyw2MTEsNzIyLDc3OCwyNzgsNzIyLDY2Nyw4MzMsNzIyLDY1Nyw3NzgsNzE4LDY2Nyw1OTAsNjExLDY2Nyw4MjIsNjY3LDgyOSw3ODEsMjc4LDY2Nyw2MjAsNDc5LDYxMSwyNzgsNTkxLDYyMCw2MjEsNTU2LDYxMCw0NzksNDkyLDYxMSw1NTgsMjc4LDU2Niw1NTYsNjAzLDU1Niw0NTAsNjExLDcxMiw2MDUsNTMyLDY2NCw0MDksNTkxLDcwNCw1NzgsNzczLDgzNCwyNzgsNTkxLDYxMSw1OTEsODM0LDY2Nyw2NjcsODg2LDYxNCw3MTksNjY3LDI3OCwyNzgsNTU2LDEwOTQsMTA0Miw4NTQsNjIyLDcxOSw2NzcsNzE5LDcyMiw3MDgsNzIyLDYxNCw3MjIsNjY3LDkyNyw2NDMsNzE5LDcxOSw2MTUsNjg3LDgzMyw3MjIsNzc4LDcxOSw2NjcsNzIyLDYxMSw2NzcsNzgxLDY2Nyw3MjksNzA4LDk3OSw5ODksODU0LDFlMyw3MDgsNzE5LDEwNDIsNzI5LDU1Niw2MTksNjA0LDUzNCw2MTgsNTU2LDczNiw1MTAsNjExLDYxMSw1MDcsNjIyLDc0MCw2MDQsNjExLDYxMSw2MTEsNTU2LDg4OSw1NTYsODg1LDU1Niw2NDYsNTgzLDg4OSw5MzUsNzA3LDg1NCw1OTQsNTUyLDg2NSw1ODksNTU2LDU1Niw2MTEsNDY5LDU2Myw1NTYsMjc4LDI3OCwyNzgsOTY5LDkwNiw2MTEsNTA3LDYxOSw1NTYsNjExLDc3OCw2MTEsNTc1LDQ2Nyw5NDQsNzc4LDk0NCw3NzgsOTQ0LDc3OCw2NjcsNTU2LDMzMywzMzMsNTU2LDFlMywxZTMsNTUyLDI3OCwyNzgsMjc4LDI3OCw1MDAsNTAwLDUwMCw1NTYsNTU2LDM1MCwxZTMsMWUzLDI0MCw0NzksMzMzLDMzMyw2MDQsMzMzLDE2NywzOTYsNTU2LDU1NiwxMTA0LDU1Niw4ODUsNTE2LDExNDYsMWUzLDc2OCw2MDAsODM0LDgzNCw4MzQsODM0LDk5OSw1MDAsMWUzLDUwMCwxZTMsNTAwLDUwMCw0OTQsNjEyLDgyMyw3MTMsNTg0LDU0OSw3MTMsOTc5LDcyMiwyNzQsNTQ5LDU0OSw1ODMsNTQ5LDU0OSw2MDQsNTg0LDYwNCw2MDQsNzA4LDYyNSw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MjksNjA0LDYwNCwzNTQsMzU0LDFlMyw5OTAsOTkwLDk5MCw5OTAsNDk0LDYwNCw2MDQsNjA0LDYwNCwzNTQsMTAyMSwxMDUyLDkxNyw3NTAsNzUwLDUzMSw2NTYsNTk0LDUxMCw1MDAsNzUwLDc1MCw2MTEsNjExLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMjIyLDIyMiwzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzXSx0LkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmc9Wy0xLC0xLC0xLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwMywxMDQsMTA1LDEwNiwxMDcsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDExOCwxMTksMTIwLDEyMSwxMjIsMTIzLDEyNCwxMjUsMTI2LDE2MSwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzEsMTcyLDE3NCwxNzUsMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NSwyNTYsMjU3LDI1OCwyNTksMjYwLDI2MSwyNjIsMjYzLDI2NCwyNjUsMjY2LDI2NywyNjgsMjY5LDI3MCwyNzEsMjcyLDI3MywyNzQsMjc1LDI3NiwyNzcsMjc4LDI3OSwyODAsMjgxLDI4MiwyODMsMjg0LDI4NSwyODYsMjg3LDI4OCwyODksMjkwLDI5MSwyOTIsMjkzLDI5NCwyOTUsMjk2LDI5NywyOTgsMjk5LDMwMCwzMDEsMzAyLDMwMywzMDQsMzA1LDMwNiwzMDcsMzA4LDMwOSwzMTAsMzExLDMxMiwzMTMsMzE0LDMxNSwzMTYsMzE3LDMxOCwzMTksMzIwLDMyMSwzMjIsMzIzLDMyNCwzMjUsMzI2LDMyNywzMjgsMzI5LDMzMCwzMzEsMzMyLDMzMywzMzQsMzM1LDMzNiwzMzcsMzM4LDMzOSwzNDAsMzQxLDM0MiwzNDMsMzQ0LDM0NSwzNDYsMzQ3LDM0OCwzNDksMzUwLDM1MSwzNTIsMzUzLDM1NCwzNTUsMzU2LDM1NywzNTgsMzU5LDM2MCwzNjEsMzYyLDM2MywzNjQsMzY1LDM2NiwzNjcsMzY4LDM2OSwzNzAsMzcxLDM3MiwzNzMsMzc0LDM3NSwzNzYsMzc3LDM3OCwzNzksMzgwLDM4MSwzODIsMzgzLDQwMiw1MDYsNTA3LDUwOCw1MDksNTEwLDUxMSw1MzYsNTM3LDUzOCw1MzksNzEwLDcxMSw3MTMsNzI4LDcyOSw3MzAsNzMxLDczMiw3MzMsOTAwLDkwMSw5MDIsOTAzLDkwNCw5MDUsOTA2LDkwOCw5MTAsOTExLDkxMiw5MTMsOTE0LDkxNSw5MTYsOTE3LDkxOCw5MTksOTIwLDkyMSw5MjIsOTIzLDkyNCw5MjUsOTI2LDkyNyw5MjgsOTI5LDkzMSw5MzIsOTMzLDkzNCw5MzUsOTM2LDkzNyw5MzgsOTM5LDk0MCw5NDEsOTQyLDk0Myw5NDQsOTQ1LDk0Niw5NDcsOTQ4LDk0OSw5NTAsOTUxLDk1Miw5NTMsOTU0LDk1NSw5NTYsOTU3LDk1OCw5NTksOTYwLDk2MSw5NjIsOTYzLDk2NCw5NjUsOTY2LDk2Nyw5NjgsOTY5LDk3MCw5NzEsOTcyLDk3Myw5NzQsMTAyNCwxMDI1LDEwMjYsMTAyNywxMDI4LDEwMjksMTAzMCwxMDMxLDEwMzIsMTAzMywxMDM0LDEwMzUsMTAzNiwxMDM3LDEwMzgsMTAzOSwxMDQwLDEwNDEsMTA0MiwxMDQzLDEwNDQsMTA0NSwxMDQ2LDEwNDcsMTA0OCwxMDQ5LDEwNTAsMTA1MSwxMDUyLDEwNTMsMTA1NCwxMDU1LDEwNTYsMTA1NywxMDU4LDEwNTksMTA2MCwxMDYxLDEwNjIsMTA2MywxMDY0LDEwNjUsMTA2NiwxMDY3LDEwNjgsMTA2OSwxMDcwLDEwNzEsMTA3MiwxMDczLDEwNzQsMTA3NSwxMDc2LDEwNzcsMTA3OCwxMDc5LDEwODAsMTA4MSwxMDgyLDEwODMsMTA4NCwxMDg1LDEwODYsMTA4NywxMDg4LDEwODksMTA5MCwxMDkxLDEwOTIsMTA5MywxMDk0LDEwOTUsMTA5NiwxMDk3LDEwOTgsMTA5OSwxMTAwLDExMDEsMTEwMiwxMTAzLDExMDQsMTEwNSwxMTA2LDExMDcsMTEwOCwxMTA5LDExMTAsMTExMSwxMTEyLDExMTMsMTExNCwxMTE1LDExMTYsMTExNywxMTE4LDExMTksMTEzOCwxMTM5LDExNjgsMTE2OSw3ODA4LDc4MDksNzgxMCw3ODExLDc4MTIsNzgxMyw3OTIyLDc5MjMsODIwOCw4MjA5LDgyMTEsODIxMiw4MjEzLDgyMTUsODIxNiw4MjE3LDgyMTgsODIxOSw4MjIwLDgyMjEsODIyMiw4MjI0LDgyMjUsODIyNiw4MjMwLDgyNDAsODI0Miw4MjQzLDgyNDksODI1MCw4MjUyLDgyNTQsODI2MCw4MzE5LDgzNTUsODM1Niw4MzU5LDgzNjQsODQ1Myw4NDY3LDg0NzAsODQ4Miw4NDg2LDg0OTQsODUzOSw4NTQwLDg1NDEsODU0Miw4NTkyLDg1OTMsODU5NCw4NTk1LDg1OTYsODU5Nyw4NjE2LDg3MDYsODcxMCw4NzE5LDg3MjEsODcyMiw4NzMwLDg3MzQsODczNSw4NzQ1LDg3NDcsODc3Niw4ODAwLDg4MDEsODgwNCw4ODA1LDg5NjIsODk3Niw4OTkyLDg5OTMsOTQ3Miw5NDc0LDk0ODQsOTQ4OCw5NDkyLDk0OTYsOTUwMCw5NTA4LDk1MTYsOTUyNCw5NTMyLDk1NTIsOTU1Myw5NTU0LDk1NTUsOTU1Niw5NTU3LDk1NTgsOTU1OSw5NTYwLDk1NjEsOTU2Miw5NTYzLDk1NjQsOTU2NSw5NTY2LDk1NjcsOTU2OCw5NTY5LDk1NzAsOTU3MSw5NTcyLDk1NzMsOTU3NCw5NTc1LDk1NzYsOTU3Nyw5NTc4LDk1NzksOTU4MCw5NjAwLDk2MDQsOTYwOCw5NjEyLDk2MTYsOTYxNyw5NjE4LDk2MTksOTYzMiw5NjMzLDk2NDIsOTY0Myw5NjQ0LDk2NTAsOTY1OCw5NjYwLDk2NjgsOTY3NCw5Njc1LDk2NzksOTY4OCw5Njg5LDk3MDIsOTc4Niw5Nzg3LDk3ODgsOTc5Miw5Nzk0LDk4MjQsOTgyNyw5ODI5LDk4MzAsOTgzNCw5ODM1LDk4MzYsNjE0NDEsNjE0NDIsNjE0NDUsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTFdLHQuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHM9WzM2NSwwLDMzMywyNzgsMjc4LDM1NSw1NTYsNTU2LDg4OSw2NjcsMTkxLDMzMywzMzMsMzg5LDU4NCwyNzgsMzMzLDI3OCwyNzgsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDI3OCwyNzgsNTg0LDU4NCw1ODQsNTU2LDEwMTUsNjY3LDY2Nyw3MjIsNzIyLDY2Nyw2MTEsNzc4LDcyMiwyNzgsNTAwLDY2Nyw1NTYsODMzLDcyMiw3NzgsNjY3LDc3OCw3MjIsNjY3LDYxMSw3MjIsNjY3LDk0NCw2NjcsNjY3LDYxMSwyNzgsMjc4LDI3OCw0NjksNTU2LDMzMyw1NTYsNTU2LDUwMCw1NTYsNTU2LDI3OCw1NTYsNTU2LDIyMiwyMjIsNTAwLDIyMiw4MzMsNTU2LDU1Niw1NTYsNTU2LDMzMyw1MDAsMjc4LDU1Niw1MDAsNzIyLDUwMCw1MDAsNTAwLDMzNCwyNjAsMzM0LDU4NCwzMzMsNTU2LDU1Niw1NTYsNTU2LDI2MCw1NTYsMzMzLDczNywzNzAsNTU2LDU4NCw3MzcsNTUyLDQwMCw1NDksMzMzLDMzMywzMzMsNTc2LDUzNywyNzgsMzMzLDMzMywzNjUsNTU2LDgzNCw4MzQsODM0LDYxMSw2NjcsNjY3LDY2Nyw2NjcsNjY3LDY2NywxZTMsNzIyLDY2Nyw2NjcsNjY3LDY2NywyNzgsMjc4LDI3OCwyNzgsNzIyLDcyMiw3NzgsNzc4LDc3OCw3NzgsNzc4LDU4NCw3NzgsNzIyLDcyMiw3MjIsNzIyLDY2Nyw2NjcsNjExLDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDg4OSw1MDAsNTU2LDU1Niw1NTYsNTU2LDI3OCwyNzgsMjc4LDI3OCw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTQ5LDYxMSw1NTYsNTU2LDU1Niw1NTYsNTAwLDU1Niw1MDAsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNzIyLDUwMCw3MjIsNTAwLDcyMiw1MDAsNzIyLDUwMCw3MjIsNjI1LDcyMiw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDc3OCw1NTYsNzc4LDU1Niw3NzgsNTU2LDc3OCw1NTYsNzIyLDU1Niw3MjIsNTU2LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDI3OCwyMjIsMjc4LDI3OCw3MzMsNDQ0LDUwMCwyMjIsNjY3LDUwMCw1MDAsNTU2LDIyMiw1NTYsMjIyLDU1NiwyODEsNTU2LDQwMCw1NTYsMjIyLDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDYxNSw3MjMsNTU2LDc3OCw1NTYsNzc4LDU1Niw3NzgsNTU2LDFlMyw5NDQsNzIyLDMzMyw3MjIsMzMzLDcyMiwzMzMsNjY3LDUwMCw2NjcsNTAwLDY2Nyw1MDAsNjY3LDUwMCw2MTEsMjc4LDYxMSwzNTQsNjExLDI3OCw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw5NDQsNzIyLDY2Nyw1MDAsNjY3LDYxMSw1MDAsNjExLDUwMCw2MTEsNTAwLDIyMiw1NTYsNjY3LDU1NiwxZTMsODg5LDc3OCw2MTEsNjY3LDUwMCw2MTEsMjc4LDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsNjY3LDI3OCw3ODksODQ2LDM4OSw3OTQsODY1LDc3NSwyMjIsNjY3LDY2Nyw1NzAsNjcxLDY2Nyw2MTEsNzIyLDc3OCwyNzgsNjY3LDY2Nyw4MzMsNzIyLDY0OCw3NzgsNzI1LDY2Nyw2MDAsNjExLDY2Nyw4MzcsNjY3LDgzMSw3NjEsMjc4LDY2Nyw1NzAsNDM5LDU1NSwyMjIsNTUwLDU3MCw1NzEsNTAwLDU1Niw0MzksNDYzLDU1NSw1NDIsMjIyLDUwMCw0OTIsNTQ4LDUwMCw0NDcsNTU2LDY3MCw1NzMsNDg2LDYwMywzNzQsNTUwLDY1Miw1NDYsNzI4LDc3OSwyMjIsNTUwLDU1Niw1NTAsNzc5LDY2Nyw2NjcsODQzLDU0NCw3MDgsNjY3LDI3OCwyNzgsNTAwLDEwNjYsOTgyLDg0NCw1ODksNzE1LDYzOSw3MjQsNjY3LDY1MSw2NjcsNTQ0LDcwNCw2NjcsOTE3LDYxNCw3MTUsNzE1LDU4OSw2ODYsODMzLDcyMiw3NzgsNzI1LDY2Nyw3MjIsNjExLDYzOSw3OTUsNjY3LDcyNyw2NzMsOTIwLDkyMyw4MDUsODg2LDY1MSw2OTQsMTAyMiw2ODIsNTU2LDU2Miw1MjIsNDkzLDU1Myw1NTYsNjg4LDQ2NSw1NTYsNTU2LDQ3Miw1NjQsNjg2LDU1MCw1NTYsNTU2LDU1Niw1MDAsODMzLDUwMCw4MzUsNTAwLDU3Miw1MTgsODMwLDg1MSw2MjEsNzM2LDUyNiw0OTIsNzUyLDUzNCw1NTYsNTU2LDU1NiwzNzgsNDk2LDUwMCwyMjIsMjIyLDIyMiw5MTAsODI4LDU1Niw0NzIsNTY1LDUwMCw1NTYsNzc4LDU1Niw0OTIsMzM5LDk0NCw3MjIsOTQ0LDcyMiw5NDQsNzIyLDY2Nyw1MDAsMzMzLDMzMyw1NTYsMWUzLDFlMyw1NTIsMjIyLDIyMiwyMjIsMjIyLDMzMywzMzMsMzMzLDU1Niw1NTYsMzUwLDFlMywxZTMsMTg4LDM1NCwzMzMsMzMzLDUwMCwzMzMsMTY3LDM2NSw1NTYsNTU2LDEwOTQsNTU2LDg4NSwzMjMsMTA4MywxZTMsNzY4LDYwMCw4MzQsODM0LDgzNCw4MzQsMWUzLDUwMCw5OTgsNTAwLDFlMyw1MDAsNTAwLDQ5NCw2MTIsODIzLDcxMyw1ODQsNTQ5LDcxMyw5NzksNzE5LDI3NCw1NDksNTQ5LDU4NCw1NDksNTQ5LDYwNCw1ODQsNjA0LDYwNCw3MDgsNjI1LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcyOSw2MDQsNjA0LDM1NCwzNTQsMWUzLDk5MCw5OTAsOTkwLDk5MCw0OTQsNjA0LDYwNCw2MDQsNjA0LDM1NCwxMDIxLDEwNTIsOTE3LDc1MCw3NTAsNTMxLDY1Niw1OTQsNTEwLDUwMCw3NTAsNzUwLDUwMCw1MDAsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywyMjIsMjIyLDI5NCwyOTQsMzI0LDMyNCwzMTYsMzI4LDM5OCwyODVdLHQuTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nPVstMSwtMSwtMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwLDExMSwxMTIsMTEzLDExNCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEyMywxMjQsMTI1LDEyNiwxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzQsMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLDE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LDIzOSwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLDI1NCwyNTUsMjU2LDI1NywyNTgsMjU5LDI2MCwyNjEsMjYyLDI2MywyNjQsMjY1LDI2NiwyNjcsMjY4LDI2OSwyNzAsMjcxLDI3MiwyNzMsMjc0LDI3NSwyNzYsMjc3LDI3OCwyNzksMjgwLDI4MSwyODIsMjgzLDI4NCwyODUsMjg2LDI4NywyODgsMjg5LDI5MCwyOTEsMjkyLDI5MywyOTQsMjk1LDI5NiwyOTcsMjk4LDI5OSwzMDAsMzAxLDMwMiwzMDMsMzA0LDMwNSwzMDYsMzA3LDMwOCwzMDksMzEwLDMxMSwzMTIsMzEzLDMxNCwzMTUsMzE2LDMxNywzMTgsMzE5LDMyMCwzMjEsMzIyLDMyMywzMjQsMzI1LDMyNiwzMjcsMzI4LDMyOSwzMzAsMzMxLDMzMiwzMzMsMzM0LDMzNSwzMzYsMzM3LDMzOCwzMzksMzQwLDM0MSwzNDIsMzQzLDM0NCwzNDUsMzQ2LDM0NywzNDgsMzQ5LDM1MCwzNTEsMzUyLDM1MywzNTQsMzU1LDM1NiwzNTcsMzU4LDM1OSwzNjAsMzYxLDM2MiwzNjMsMzY0LDM2NSwzNjYsMzY3LDM2OCwzNjksMzcwLDM3MSwzNzIsMzczLDM3NCwzNzUsMzc2LDM3NywzNzgsMzc5LDM4MCwzODEsMzgyLDM4Myw0MDIsNTA2LDUwNyw1MDgsNTA5LDUxMCw1MTEsNTM2LDUzNyw1MzgsNTM5LDcxMCw3MTEsNzEzLDcyOCw3MjksNzMwLDczMSw3MzIsNzMzLDkwMCw5MDEsOTAyLDkwMyw5MDQsOTA1LDkwNiw5MDgsOTEwLDkxMSw5MTIsOTEzLDkxNCw5MTUsOTE2LDkxNyw5MTgsOTE5LDkyMCw5MjEsOTIyLDkyMyw5MjQsOTI1LDkyNiw5MjcsOTI4LDkyOSw5MzEsOTMyLDkzMyw5MzQsOTM1LDkzNiw5MzcsOTM4LDkzOSw5NDAsOTQxLDk0Miw5NDMsOTQ0LDk0NSw5NDYsOTQ3LDk0OCw5NDksOTUwLDk1MSw5NTIsOTUzLDk1NCw5NTUsOTU2LDk1Nyw5NTgsOTU5LDk2MCw5NjEsOTYyLDk2Myw5NjQsOTY1LDk2Niw5NjcsOTY4LDk2OSw5NzAsOTcxLDk3Miw5NzMsOTc0LDEwMjQsMTAyNSwxMDI2LDEwMjcsMTAyOCwxMDI5LDEwMzAsMTAzMSwxMDMyLDEwMzMsMTAzNCwxMDM1LDEwMzYsMTAzNywxMDM4LDEwMzksMTA0MCwxMDQxLDEwNDIsMTA0MywxMDQ0LDEwNDUsMTA0NiwxMDQ3LDEwNDgsMTA0OSwxMDUwLDEwNTEsMTA1MiwxMDUzLDEwNTQsMTA1NSwxMDU2LDEwNTcsMTA1OCwxMDU5LDEwNjAsMTA2MSwxMDYyLDEwNjMsMTA2NCwxMDY1LDEwNjYsMTA2NywxMDY4LDEwNjksMTA3MCwxMDcxLDEwNzIsMTA3MywxMDc0LDEwNzUsMTA3NiwxMDc3LDEwNzgsMTA3OSwxMDgwLDEwODEsMTA4MiwxMDgzLDEwODQsMTA4NSwxMDg2LDEwODcsMTA4OCwxMDg5LDEwOTAsMTA5MSwxMDkyLDEwOTMsMTA5NCwxMDk1LDEwOTYsMTA5NywxMDk4LDEwOTksMTEwMCwxMTAxLDExMDIsMTEwMywxMTA0LDExMDUsMTEwNiwxMTA3LDExMDgsMTEwOSwxMTEwLDExMTEsMTExMiwxMTEzLDExMTQsMTExNSwxMTE2LDExMTcsMTExOCwxMTE5LDExMzgsMTEzOSwxMTY4LDExNjksNzgwOCw3ODA5LDc4MTAsNzgxMSw3ODEyLDc4MTMsNzkyMiw3OTIzLDgyMDgsODIwOSw4MjExLDgyMTIsODIxMyw4MjE1LDgyMTYsODIxNyw4MjE4LDgyMTksODIyMCw4MjIxLDgyMjIsODIyNCw4MjI1LDgyMjYsODIzMCw4MjQwLDgyNDIsODI0Myw4MjQ5LDgyNTAsODI1Miw4MjU0LDgyNjAsODMxOSw4MzU1LDgzNTYsODM1OSw4MzY0LDg0NTMsODQ2Nyw4NDcwLDg0ODIsODQ4Niw4NDk0LDg1MzksODU0MCw4NTQxLDg1NDIsODU5Miw4NTkzLDg1OTQsODU5NSw4NTk2LDg1OTcsODYxNiw4NzA2LDg3MTAsODcxOSw4NzIxLDg3MjIsODczMCw4NzM0LDg3MzUsODc0NSw4NzQ3LDg3NzYsODgwMCw4ODAxLDg4MDQsODgwNSw4OTYyLDg5NzYsODk5Miw4OTkzLDk0NzIsOTQ3NCw5NDg0LDk0ODgsOTQ5Miw5NDk2LDk1MDAsOTUwOCw5NTE2LDk1MjQsOTUzMiw5NTUyLDk1NTMsOTU1NCw5NTU1LDk1NTYsOTU1Nyw5NTU4LDk1NTksOTU2MCw5NTYxLDk1NjIsOTU2Myw5NTY0LDk1NjUsOTU2Niw5NTY3LDk1NjgsOTU2OSw5NTcwLDk1NzEsOTU3Miw5NTczLDk1NzQsOTU3NSw5NTc2LDk1NzcsOTU3OCw5NTc5LDk1ODAsOTYwMCw5NjA0LDk2MDgsOTYxMiw5NjE2LDk2MTcsOTYxOCw5NjE5LDk2MzIsOTYzMyw5NjQyLDk2NDMsOTY0NCw5NjUwLDk2NTgsOTY2MCw5NjY4LDk2NzQsOTY3NSw5Njc5LDk2ODgsOTY4OSw5NzAyLDk3ODYsOTc4Nyw5Nzg4LDk3OTIsOTc5NCw5ODI0LDk4MjcsOTgyOSw5ODMwLDk4MzQsOTgzNSw5ODM2LDYxNDQxLDYxNDQyLDYxNDQ1LC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xXSx0LkxpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocz1bMzY1LDAsMzMzLDI3OCwyNzgsMzU1LDU1Niw1NTYsODg5LDY2NywxOTEsMzMzLDMzMywzODksNTg0LDI3OCwzMzMsMjc4LDI3OCw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsMjc4LDI3OCw1ODQsNTg0LDU4NCw1NTYsMTAxNSw2NjcsNjY3LDcyMiw3MjIsNjY3LDYxMSw3NzgsNzIyLDI3OCw1MDAsNjY3LDU1Niw4MzMsNzIyLDc3OCw2NjcsNzc4LDcyMiw2NjcsNjExLDcyMiw2NjcsOTQ0LDY2Nyw2NjcsNjExLDI3OCwyNzgsMjc4LDQ2OSw1NTYsMzMzLDU1Niw1NTYsNTAwLDU1Niw1NTYsMjc4LDU1Niw1NTYsMjIyLDIyMiw1MDAsMjIyLDgzMyw1NTYsNTU2LDU1Niw1NTYsMzMzLDUwMCwyNzgsNTU2LDUwMCw3MjIsNTAwLDUwMCw1MDAsMzM0LDI2MCwzMzQsNTg0LDMzMyw1NTYsNTU2LDU1Niw1NTYsMjYwLDU1NiwzMzMsNzM3LDM3MCw1NTYsNTg0LDczNyw1NTIsNDAwLDU0OSwzMzMsMzMzLDMzMyw1NzYsNTM3LDI3OCwzMzMsMzMzLDM2NSw1NTYsODM0LDgzNCw4MzQsNjExLDY2Nyw2NjcsNjY3LDY2Nyw2NjcsNjY3LDFlMyw3MjIsNjY3LDY2Nyw2NjcsNjY3LDI3OCwyNzgsMjc4LDI3OCw3MjIsNzIyLDc3OCw3NzgsNzc4LDc3OCw3NzgsNTg0LDc3OCw3MjIsNzIyLDcyMiw3MjIsNjY3LDY2Nyw2MTEsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NTYsODg5LDUwMCw1NTYsNTU2LDU1Niw1NTYsMjc4LDI3OCwyNzgsMjc4LDU1Niw1NTYsNTU2LDU1Niw1NTYsNTU2LDU1Niw1NDksNjExLDU1Niw1NTYsNTU2LDU1Niw1MDAsNTU2LDUwMCw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw3MjIsNTAwLDcyMiw1MDAsNzIyLDUwMCw3MjIsNTAwLDcyMiw2MTUsNzIyLDU1Niw2NjcsNTU2LDY2Nyw1NTYsNjY3LDU1Niw2NjcsNTU2LDY2Nyw1NTYsNzc4LDU1Niw3NzgsNTU2LDc3OCw1NTYsNzc4LDU1Niw3MjIsNTU2LDcyMiw1NTYsMjc4LDI3OCwyNzgsMjc4LDI3OCwyNzgsMjc4LDIyMiwyNzgsMjc4LDczNSw0NDQsNTAwLDIyMiw2NjcsNTAwLDUwMCw1NTYsMjIyLDU1NiwyMjIsNTU2LDI5Miw1NTYsMzM0LDU1NiwyMjIsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNjA0LDcyMyw1NTYsNzc4LDU1Niw3NzgsNTU2LDc3OCw1NTYsMWUzLDk0NCw3MjIsMzMzLDcyMiwzMzMsNzIyLDMzMyw2NjcsNTAwLDY2Nyw1MDAsNjY3LDUwMCw2NjcsNTAwLDYxMSwyNzgsNjExLDM3NSw2MTEsMjc4LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDcyMiw1NTYsNzIyLDU1Niw3MjIsNTU2LDk0NCw3MjIsNjY3LDUwMCw2NjcsNjExLDUwMCw2MTEsNTAwLDYxMSw1MDAsMjIyLDU1Niw2NjcsNTU2LDFlMyw4ODksNzc4LDYxMSw2NjcsNTAwLDYxMSwyNzgsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMyw2NjcsMjc4LDc4NCw4MzgsMzg0LDc3NCw4NTUsNzUyLDIyMiw2NjcsNjY3LDU1MSw2NjgsNjY3LDYxMSw3MjIsNzc4LDI3OCw2NjcsNjY4LDgzMyw3MjIsNjUwLDc3OCw3MjIsNjY3LDYxOCw2MTEsNjY3LDc5OCw2NjcsODM1LDc0OCwyNzgsNjY3LDU3OCw0NDYsNTU2LDIyMiw1NDcsNTc4LDU3NSw1MDAsNTU3LDQ0Niw0NDEsNTU2LDU1NiwyMjIsNTAwLDUwMCw1NzYsNTAwLDQ0OCw1NTYsNjkwLDU2OSw0ODIsNjE3LDM5NSw1NDcsNjQ4LDUyNSw3MTMsNzgxLDIyMiw1NDcsNTU2LDU0Nyw3ODEsNjY3LDY2Nyw4NjUsNTQyLDcxOSw2NjcsMjc4LDI3OCw1MDAsMTA1NywxMDEwLDg1NCw1ODMsNzIyLDYzNSw3MTksNjY3LDY1Niw2NjcsNTQyLDY3Nyw2NjcsOTIzLDYwNCw3MTksNzE5LDU4Myw2NTYsODMzLDcyMiw3NzgsNzE5LDY2Nyw3MjIsNjExLDYzNSw3NjAsNjY3LDc0MCw2NjcsOTE3LDkzOCw3OTIsODg1LDY1Niw3MTksMTAxMCw3MjIsNTU2LDU3Myw1MzEsMzY1LDU4Myw1NTYsNjY5LDQ1OCw1NTksNTU5LDQzOCw1ODMsNjg4LDU1Miw1NTYsNTQyLDU1Niw1MDAsNDU4LDUwMCw4MjMsNTAwLDU3Myw1MjEsODAyLDgyMyw2MjUsNzE5LDUyMSw1MTAsNzUwLDU0Miw1NTYsNTU2LDU1NiwzNjUsNTEwLDUwMCwyMjIsMjc4LDIyMiw5MDYsODEyLDU1Niw0MzgsNTU5LDUwMCw1NTIsNzc4LDU1Niw0ODksNDExLDk0NCw3MjIsOTQ0LDcyMiw5NDQsNzIyLDY2Nyw1MDAsMzMzLDMzMyw1NTYsMWUzLDFlMyw1NTIsMjIyLDIyMiwyMjIsMjIyLDMzMywzMzMsMzMzLDU1Niw1NTYsMzUwLDFlMywxZTMsMTg4LDM1NCwzMzMsMzMzLDUwMCwzMzMsMTY3LDM2NSw1NTYsNTU2LDEwOTQsNTU2LDg4NSwzMjMsMTA3MywxZTMsNzY4LDYwMCw4MzQsODM0LDgzNCw4MzQsMWUzLDUwMCwxZTMsNTAwLDFlMyw1MDAsNTAwLDQ5NCw2MTIsODIzLDcxMyw1ODQsNTQ5LDcxMyw5NzksNzE5LDI3NCw1NDksNTQ5LDU4Myw1NDksNTQ5LDYwNCw1ODQsNjA0LDYwNCw3MDgsNjI1LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcwOCw3MDgsNzA4LDcyOSw2MDQsNjA0LDM1NCwzNTQsMWUzLDk5MCw5OTAsOTkwLDk5MCw0OTQsNjA0LDYwNCw2MDQsNjA0LDM1NCwxMDIxLDEwNTIsOTE3LDc1MCw3NTAsNTMxLDY1Niw1OTQsNTEwLDUwMCw3NTAsNzUwLDUwMCw1MDAsMzMzLDMzMywzMzMsMzMzLDMzMywzMzMsMzMzLDMzMywyMjIsMjIyLDI5NCwyOTQsMzI0LDMyNCwzMTYsMzI4LDM5OCwyODVdLHQuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZz1bLTEsLTEsLTEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMjMsMTI0LDEyNSwxMjYsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTc0LDE3NSwxNzYsMTc3LDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywyNTQsMjU1LDI1NiwyNTcsMjU4LDI1OSwyNjAsMjYxLDI2MiwyNjMsMjY0LDI2NSwyNjYsMjY3LDI2OCwyNjksMjcwLDI3MSwyNzIsMjczLDI3NCwyNzUsMjc2LDI3NywyNzgsMjc5LDI4MCwyODEsMjgyLDI4MywyODQsMjg1LDI4NiwyODcsMjg4LDI4OSwyOTAsMjkxLDI5MiwyOTMsMjk0LDI5NSwyOTYsMjk3LDI5OCwyOTksMzAwLDMwMSwzMDIsMzAzLDMwNCwzMDUsMzA2LDMwNywzMDgsMzA5LDMxMCwzMTEsMzEyLDMxMywzMTQsMzE1LDMxNiwzMTcsMzE4LDMxOSwzMjAsMzIxLDMyMiwzMjMsMzI0LDMyNSwzMjYsMzI3LDMyOCwzMjksMzMwLDMzMSwzMzIsMzMzLDMzNCwzMzUsMzM2LDMzNywzMzgsMzM5LDM0MCwzNDEsMzQyLDM0MywzNDQsMzQ1LDM0NiwzNDcsMzQ4LDM0OSwzNTAsMzUxLDM1MiwzNTMsMzU0LDM1NSwzNTYsMzU3LDM1OCwzNTksMzYwLDM2MSwzNjIsMzYzLDM2NCwzNjUsMzY2LDM2NywzNjgsMzY5LDM3MCwzNzEsMzcyLDM3MywzNzQsMzc1LDM3NiwzNzcsMzc4LDM3OSwzODAsMzgxLDM4MiwzODMsNDAyLDUwNiw1MDcsNTA4LDUwOSw1MTAsNTExLDUzNiw1MzcsNTM4LDUzOSw3MTAsNzExLDcxMyw3MjgsNzI5LDczMCw3MzEsNzMyLDczMyw5MDAsOTAxLDkwMiw5MDMsOTA0LDkwNSw5MDYsOTA4LDkxMCw5MTEsOTEyLDkxMyw5MTQsOTE1LDkxNiw5MTcsOTE4LDkxOSw5MjAsOTIxLDkyMiw5MjMsOTI0LDkyNSw5MjYsOTI3LDkyOCw5MjksOTMxLDkzMiw5MzMsOTM0LDkzNSw5MzYsOTM3LDkzOCw5MzksOTQwLDk0MSw5NDIsOTQzLDk0NCw5NDUsOTQ2LDk0Nyw5NDgsOTQ5LDk1MCw5NTEsOTUyLDk1Myw5NTQsOTU1LDk1Niw5NTcsOTU4LDk1OSw5NjAsOTYxLDk2Miw5NjMsOTY0LDk2NSw5NjYsOTY3LDk2OCw5NjksOTcwLDk3MSw5NzIsOTczLDk3NCwxMDI0LDEwMjUsMTAyNiwxMDI3LDEwMjgsMTAyOSwxMDMwLDEwMzEsMTAzMiwxMDMzLDEwMzQsMTAzNSwxMDM2LDEwMzcsMTAzOCwxMDM5LDEwNDAsMTA0MSwxMDQyLDEwNDMsMTA0NCwxMDQ1LDEwNDYsMTA0NywxMDQ4LDEwNDksMTA1MCwxMDUxLDEwNTIsMTA1MywxMDU0LDEwNTUsMTA1NiwxMDU3LDEwNTgsMTA1OSwxMDYwLDEwNjEsMTA2MiwxMDYzLDEwNjQsMTA2NSwxMDY2LDEwNjcsMTA2OCwxMDY5LDEwNzAsMTA3MSwxMDcyLDEwNzMsMTA3NCwxMDc1LDEwNzYsMTA3NywxMDc4LDEwNzksMTA4MCwxMDgxLDEwODIsMTA4MywxMDg0LDEwODUsMTA4NiwxMDg3LDEwODgsMTA4OSwxMDkwLDEwOTEsMTA5MiwxMDkzLDEwOTQsMTA5NSwxMDk2LDEwOTcsMTA5OCwxMDk5LDExMDAsMTEwMSwxMTAyLDExMDMsMTEwNCwxMTA1LDExMDYsMTEwNywxMTA4LDExMDksMTExMCwxMTExLDExMTIsMTExMywxMTE0LDExMTUsMTExNiwxMTE3LDExMTgsMTExOSwxMTM4LDExMzksMTE2OCwxMTY5LDc4MDgsNzgwOSw3ODEwLDc4MTEsNzgxMiw3ODEzLDc5MjIsNzkyMyw4MjA4LDgyMDksODIxMSw4MjEyLDgyMTMsODIxNSw4MjE2LDgyMTcsODIxOCw4MjE5LDgyMjAsODIyMSw4MjIyLDgyMjQsODIyNSw4MjI2LDgyMzAsODI0MCw4MjQyLDgyNDMsODI0OSw4MjUwLDgyNTIsODI1NCw4MjYwLDgzMTksODM1NSw4MzU2LDgzNTksODM2NCw4NDUzLDg0NjcsODQ3MCw4NDgyLDg0ODYsODQ5NCw4NTM5LDg1NDAsODU0MSw4NTQyLDg1OTIsODU5Myw4NTk0LDg1OTUsODU5Niw4NTk3LDg2MTYsODcwNiw4NzEwLDg3MTksODcyMSw4NzIyLDg3MzAsODczNCw4NzM1LDg3NDUsODc0Nyw4Nzc2LDg4MDAsODgwMSw4ODA0LDg4MDUsODk2Miw4OTc2LDg5OTIsODk5Myw5NDcyLDk0NzQsOTQ4NCw5NDg4LDk0OTIsOTQ5Niw5NTAwLDk1MDgsOTUxNiw5NTI0LDk1MzIsOTU1Miw5NTUzLDk1NTQsOTU1NSw5NTU2LDk1NTcsOTU1OCw5NTU5LDk1NjAsOTU2MSw5NTYyLDk1NjMsOTU2NCw5NTY1LDk1NjYsOTU2Nyw5NTY4LDk1NjksOTU3MCw5NTcxLDk1NzIsOTU3Myw5NTc0LDk1NzUsOTU3Niw5NTc3LDk1NzgsOTU3OSw5NTgwLDk2MDAsOTYwNCw5NjA4LDk2MTIsOTYxNiw5NjE3LDk2MTgsOTYxOSw5NjMyLDk2MzMsOTY0Miw5NjQzLDk2NDQsOTY1MCw5NjU4LDk2NjAsOTY2OCw5Njc0LDk2NzUsOTY3OSw5Njg4LDk2ODksOTcwMiw5Nzg2LDk3ODcsOTc4OCw5NzkyLDk3OTQsOTgyNCw5ODI3LDk4MjksOTgzMCw5ODM0LDk4MzUsOTgzNiw2MTQ0MSw2MTQ0Miw2MTQ0NSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMV19LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuTXlyaWFkUHJvUmVndWxhck1ldHJpY3M9dC5NeXJpYWRQcm9SZWd1bGFyRmFjdG9ycz10Lk15cmlhZFByb0l0YWxpY01ldHJpY3M9dC5NeXJpYWRQcm9JdGFsaWNGYWN0b3JzPXQuTXlyaWFkUHJvQm9sZE1ldHJpY3M9dC5NeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcz10Lk15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzPXQuTXlyaWFkUHJvQm9sZEZhY3RvcnM9dm9pZCAwLHQuTXlyaWFkUHJvQm9sZEZhY3RvcnM9WzEuMzY4OTgsMSwxLC43MjcwNiwuODA0NzksLjgzNzM0LC45ODg5NCwuOTk3OTMsLjk4OTcsLjkzODg0LC44NjIwOSwuOTQyOTIsLjk0MjkyLDEuMTY2NjEsMS4wMjA1OCwuOTM1ODIsLjk2Njk0LC45MzU4MiwxLjE5MTM3LC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywuNzgwNzYsLjc4MDc2LDEuMDIwNTgsMS4wMjA1OCwxLjAyMDU4LC43Mjg1MSwuNzg5NjYsLjkwODM4LC44MzYzNywuODIzOTEsLjk2Mzc2LC44MDA2MSwuODYyNzUsLjg3NjgsLjk1NDA3LDEuMDI1OCwuNzM5MDEsLjg1MDIyLC44MzY1NSwxLjAxNTYsLjk1NTQ2LC45MjE3OSwuODcxMDcsLjkyMTc5LC44MjExNCwuODA5NiwuODk3MTMsLjk0NDM4LC45NTM1MywuOTQwODMsLjkxOTA1LC45MDQwNiwuOTQ0NiwuOTQyOTIsMS4xODc3NywuOTQyOTIsMS4wMjA1OCwuODk5MDMsLjkwMDg4LC45NDkzOCwuOTc4OTgsLjgxMDkzLC45NzU3MSwuOTQ5MzgsMS4wMjQsLjk1NzcsLjk1OTMzLC45ODYyMSwxLjA0NzQsLjk3NDU1LC45ODk4MSwuOTY3MiwuOTU5MzMsLjk0NDYsLjk3ODk4LC45NzQwNywuOTc2NDYsLjc4MDM2LDEuMTAyMDgsLjk1NDQyLC45NTI5OCwuOTc1NzksLjkzMzIsLjk0MDM5LC45MzgsLjgwNjg3LDEuMDExNDksLjgwNjg3LDEuMDIwNTgsLjgwNDc5LC45OTc5MywuOTk3OTMsLjk5NzkzLC45OTc5MywxLjAxMTQ5LDEuMDA4NzIsLjkwMDg4LC45MTg4MiwxLjAyMTMsLjgzNjEsMS4wMjA1OCwuNjIyOTUsLjU0MzI0LC44OTAyMiwxLjA4NTk1LDEsMSwuOTAwODgsMSwuOTc0NTUsLjkzNTgyLC45MDA4OCwxLDEuMDU2ODYsLjgzNjEsLjk5NjQyLC45OTY0MiwuOTk2NDIsLjcyODUxLC45MDgzOCwuOTA4MzgsLjkwODM4LC45MDgzOCwuOTA4MzgsLjkwODM4LC44NjgsLjgyMzkxLC44MDA2MSwuODAwNjEsLjgwMDYxLC44MDA2MSwxLjAyNTgsMS4wMjU4LDEuMDI1OCwxLjAyNTgsLjk3NDg0LC45NTU0NiwuOTIxNzksLjkyMTc5LC45MjE3OSwuOTIxNzksLjkyMTc5LDEuMDIwNTgsLjkyMTc5LC45NDQzOCwuOTQ0MzgsLjk0NDM4LC45NDQzOCwuOTA0MDYsLjg2OTU4LC45ODIyNSwuOTQ5MzgsLjk0OTM4LC45NDkzOCwuOTQ5MzgsLjk0OTM4LC45NDkzOCwuOTAzMSwuODEwOTMsLjk0OTM4LC45NDkzOCwuOTQ5MzgsLjk0OTM4LC45ODYyMSwuOTg2MjEsLjk4NjIxLC45ODYyMSwuOTM5NjksLjk1OTMzLC45NDQ2LC45NDQ2LC45NDQ2LC45NDQ2LC45NDQ2LDEuMDg1OTUsLjk0NDYsLjk1NDQyLC45NTQ0MiwuOTU0NDIsLjk1NDQyLC45NDAzOSwuOTc4OTgsLjk0MDM5LC45MDgzOCwuOTQ5MzgsLjkwODM4LC45NDkzOCwuOTA4MzgsLjk0OTM4LC44MjM5MSwuODEwOTMsLjgyMzkxLC44MTA5MywuODIzOTEsLjgxMDkzLC44MjM5MSwuODEwOTMsLjk2Mzc2LC44NDMxMywuOTc0ODQsLjk3NTcxLC44MDA2MSwuOTQ5MzgsLjgwMDYxLC45NDkzOCwuODAwNjEsLjk0OTM4LC44MDA2MSwuOTQ5MzgsLjgwMDYxLC45NDkzOCwuODc2OCwuOTU3NywuODc2OCwuOTU3NywuODc2OCwuOTU3NywxLDEsLjk1NDA3LC45NTkzMywuOTcwNjksLjk1OTMzLDEuMDI1OCwuOTg2MjEsMS4wMjU4LC45ODYyMSwxLjAyNTgsLjk4NjIxLDEuMDI1OCwuOTg2MjEsMS4wMjU4LC45ODYyMSwuODg3LDEuMDE1OTEsLjczOTAxLDEuMDQ3NCwxLDEsLjk3NDU1LC44MzY1NSwuOTg5ODEsMSwxLC44MzY1NSwuNzM5NzcsLjgzNjU1LC43MzkwMywuODQ2MzgsMS4wMzMsLjk1NTQ2LC45NTkzMywxLDEsLjk1NTQ2LC45NTkzMywuODI3MSwuOTU0MTcsLjk1OTMzLC45MjE3OSwuOTQ0NiwuOTIxNzksLjk0NDYsLjkyMTc5LC45NDQ2LC45MzYsLjkxOTY0LC44MjExNCwuOTc2NDYsMSwxLC44MjExNCwuOTc2NDYsLjgwOTYsLjc4MDM2LC44MDk2LC43ODAzNiwxLDEsLjgwOTYsLjc4MDM2LDEsMSwuODk3MTMsLjc3NDUyLC44OTcxMywxLjEwMjA4LC45NDQzOCwuOTU0NDIsLjk0NDM4LC45NTQ0MiwuOTQ0MzgsLjk1NDQyLC45NDQzOCwuOTU0NDIsLjk0NDM4LC45NTQ0MiwuOTQ0MzgsLjk1NDQyLC45NDA4MywuOTc1NzksLjkwNDA2LC45NDAzOSwuOTA0MDYsLjk0NDYsLjkzOCwuOTQ0NiwuOTM4LC45NDQ2LC45MzgsMSwuOTk3OTMsLjkwODM4LC45NDkzOCwuODY4LC45MDMxLC45MjE3OSwuOTQ0NiwxLDEsLjg5NzEzLDEuMTAyMDgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwOTg5LC45MzU4LC45MTk0NSwuODMxODEsLjc1MjYxLC44Nzk5MiwuODI5NzYsLjk2MDM0LC44MzY4OSwuOTcyNjgsMS4wMDc4LC45MDgzOCwuODM2MzcsLjgwMTksLjkwMTU3LC44MDA2MSwuOTQ0NiwuOTU0MDcsLjkyNDM2LDEuMDI1OCwuODUwMjIsLjk3MTUzLDEuMDE1NiwuOTU1NDYsLjg5MTkyLC45MjE3OSwuOTIzNjEsLjg3MTA3LC45NjMxOCwuODk3MTMsLjkzNzA0LC45NTYzOCwuOTE5MDUsLjkxNzA5LC45Mjc5NiwxLjAyNTgsLjkzNzA0LC45NDgzNiwxLjAzNzMsLjk1OTMzLDEuMDA3OCwuOTU4NzEsLjk0ODM2LC45NjE3NCwuOTI2MDEsLjk0OTgsLjk4NjA3LC45NTc3NiwuOTU5MzMsMS4wNTQ1MywxLjAwNzgsLjk4Mjc1LC45MzE0LC45NTYxNywuOTE3MDEsMS4wNTk5MywuOTQ0NiwuNzgzNjcsLjk1NTMsMSwuODY4MzIsMS4wMTI4LC45NTg3MSwuOTkzOTQsLjg3NTQ4LC45NjM2MSwuODY3NzQsMS4wMDc4LC45NTg3MSwuOTQ0NiwuOTU4NzEsLjg2Nzc0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjk0MDgzLC45NzU3OSwuOTQwODMsLjk3NTc5LC45NDA4MywuOTc1NzksLjkwNDA2LC45NDAzOSwuOTY2OTQsMSwuODk5MDMsMSwxLDEsLjkzNTgyLC45MzU4MiwuOTM1ODIsMSwuOTA4LC45MDgsLjkxOCwuOTQyMTksLjk0MjE5LC45NjU0NCwxLDEuMjg1LDEsMSwuODEwNzksLjgxMDc5LDEsMSwuNzQ4NTQsMSwxLDEsMSwuOTk3OTMsMSwxLDEsLjY1LDEsMS4zNjE0NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4xNzE3MywxLC44MDUzNSwuNzYxNjksMS4wMjA1OCwxLjA3MzIsMS4wNTQ4NiwxLDEsMS4zMDY5MiwxLjA4NTk1LDEuMDg1OTUsMSwxLjA4NTk1LDEuMDg1OTUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjE2MTYxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuTXlyaWFkUHJvQm9sZE1ldHJpY3M9e2xpbmVIZWlnaHQ6MS4yLGxpbmVHYXA6LjJ9LHQuTXlyaWFkUHJvQm9sZEl0YWxpY0ZhY3RvcnM9WzEuMzY4OTgsMSwxLC42NjIyNywuODA3NzksLjgxNjI1LC45NzI3NiwuOTcyNzYsLjk3NzMzLC45MjIyMiwuODMyNjYsLjk0MjkyLC45NDI5MiwxLjE2MTQ4LDEuMDIwNTgsLjkzNTgyLC45NjY5NCwuOTM1ODIsMS4xNzMzNywuOTcyNzYsLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjc4MDc2LC43ODA3NiwxLjAyMDU4LDEuMDIwNTgsMS4wMjA1OCwuNzE1NDEsLjc2ODEzLC44NTU3NiwuODA1OTEsLjgwNzI5LC45NDI5OSwuNzc1MTIsLjgzNjU1LC44NjUyMywuOTIyMjIsLjk4NjIxLC43MTc0MywuODE2OTgsLjc5NzI2LC45ODU1OCwuOTIyMjIsLjkwNjM3LC44MzgwOSwuOTA2MzcsLjgwNzI5LC43NjQ2MywuODYyNzUsLjkwNjk5LC45MTYwNSwuOTE1NCwuODUzMDgsLjg1NDU4LC45MDUzMSwuOTQyOTIsMS4yMTI5NiwuOTQyOTIsMS4wMjA1OCwuODk5MDMsMS4xODYxNiwuOTk2MTMsLjkxNjc3LC43ODIxNiwuOTE2NzcsLjkwMDgzLC45ODc5NiwuOTEzNSwuOTIxNjgsLjk1MzgxLC45ODk4MSwuOTUyOTgsLjk1MzgxLC45MzQ1OSwuOTIxNjgsLjkxNTEzLC45MjAwNCwuOTE2NzcsLjk1MDc3LC43NDgsMS4wNDUwMiwuOTE2NzcsLjkyMDYxLC45NDIzNiwuODk1NDQsLjg5MzY0LC45LC44MDY4NywuODU3OCwuODA2ODcsMS4wMjA1OCwuODA3NzksLjk3Mjc2LC45NzI3NiwuOTcyNzYsLjk3Mjc2LC44NTc4LC45OTk3MywxLjE4NjE2LC45MTMzOSwxLjA4MDc0LC44Mjg5MSwxLjAyMDU4LC41NTUwOSwuNzE1MjYsLjg5MDIyLDEuMDg1OTUsMSwxLDEuMTg2MTYsMSwuOTY3MzYsLjkzNTgyLDEuMTg2MTYsMSwxLjA0ODY0LC44MjcxMSwuOTkwNDMsLjk5MDQzLC45OTA0MywuNzE1NDEsLjg1NTc2LC44NTU3NiwuODU1NzYsLjg1NTc2LC44NTU3NiwuODU1NzYsLjg0NSwuODA3MjksLjc3NTEyLC43NzUxMiwuNzc1MTIsLjc3NTEyLC45ODYyMSwuOTg2MjEsLjk4NjIxLC45ODYyMSwuOTU5NjEsLjkyMjIyLC45MDYzNywuOTA2MzcsLjkwNjM3LC45MDYzNywuOTA2MzcsMS4wMjA1OCwuOTAyNTEsLjkwNjk5LC45MDY5OSwuOTA2OTksLjkwNjk5LC44NTQ1OCwuODM2NTksLjk0OTUxLC45OTYxMywuOTk2MTMsLjk5NjEzLC45OTYxMywuOTk2MTMsLjk5NjEzLC44NTgxMSwuNzgyMTYsLjkwMDgzLC45MDA4MywuOTAwODMsLjkwMDgzLC45NTM4MSwuOTUzODEsLjk1MzgxLC45NTM4MSwuOTEzNSwuOTIxNjgsLjkxNTEzLC45MTUxMywuOTE1MTMsLjkxNTEzLC45MTUxMywxLjA4NTk1LC45MTY3NywuOTE2NzcsLjkxNjc3LC45MTY3NywuOTE2NzcsLjg5MzY0LC45MjMzMiwuODkzNjQsLjg1NTc2LC45OTYxMywuODU1NzYsLjk5NjEzLC44NTU3NiwuOTk2MTMsLjgwNzI5LC43ODIxNiwuODA3MjksLjc4MjE2LC44MDcyOSwuNzgyMTYsLjgwNzI5LC43ODIxNiwuOTQyOTksLjc2NzgzLC45NTk2MSwuOTE2NzcsLjc3NTEyLC45MDA4MywuNzc1MTIsLjkwMDgzLC43NzUxMiwuOTAwODMsLjc3NTEyLC45MDA4MywuNzc1MTIsLjkwMDgzLC44NjUyMywuOTEzNSwuODY1MjMsLjkxMzUsLjg2NTIzLC45MTM1LDEsMSwuOTIyMjIsLjkyMTY4LC45MjIyMiwuOTIxNjgsLjk4NjIxLC45NTM4MSwuOTg2MjEsLjk1MzgxLC45ODYyMSwuOTUzODEsLjk4NjIxLC45NTM4MSwuOTg2MjEsLjk1MzgxLC44NjAzNiwuOTcwOTYsLjcxNzQzLC45ODk4MSwxLDEsLjk1Mjk4LC43OTcyNiwuOTUzODEsMSwxLC43OTcyNiwuNjg5NCwuNzk3MjYsLjc0MzIxLC44MTY5MSwxLjAwMDYsLjkyMjIyLC45MjE2OCwxLDEsLjkyMjIyLC45MjE2OCwuNzk0NjQsLjkyMDk4LC45MjE2OCwuOTA2MzcsLjkxNTEzLC45MDYzNywuOTE1MTMsLjkwNjM3LC45MTUxMywuOTA5LC44NzUxNCwuODA3MjksLjk1MDc3LDEsMSwuODA3MjksLjk1MDc3LC43NjQ2MywuNzQ4LC43NjQ2MywuNzQ4LDEsMSwuNzY0NjMsLjc0OCwxLDEsLjg2Mjc1LC43MjY1MSwuODYyNzUsMS4wNDUwMiwuOTA2OTksLjkxNjc3LC45MDY5OSwuOTE2NzcsLjkwNjk5LC45MTY3NywuOTA2OTksLjkxNjc3LC45MDY5OSwuOTE2NzcsLjkwNjk5LC45MTY3NywuOTE1NCwuOTQyMzYsLjg1NDU4LC44OTM2NCwuODU0NTgsLjkwNTMxLC45LC45MDUzMSwuOSwuOTA1MzEsLjksMSwuOTcyNzYsLjg1NTc2LC45OTYxMywuODQ1LC44NTgxMSwuOTAyNTEsLjkxNjc3LDEsMSwuODYyNzUsMS4wNDUwMiwxLjE4NjE2LDEuMTg2MTYsMS4xODYxNiwxLjE4NjE2LDEuMTg2MTYsMS4xODYxNiwxLjE4NjE2LDEuMTg2MTYsMS4xODYxNiwxLjAwODk5LDEuMzA2MjgsLjg1NTc2LC44MDE3OCwuNjY4NjIsLjc5MjcsLjY5MzIzLC44ODEyNywuNzI0NTksLjg5NzExLC45NTM4MSwuODU1NzYsLjgwNTkxLC43ODA1LC45NDcyOSwuNzc1MTIsLjkwNTMxLC45MjIyMiwuOTA2MzcsLjk4NjIxLC44MTY5OCwuOTI2NTUsLjk4NTU4LC45MjIyMiwuODUzNTksLjkwNjM3LC45MDk3NiwuODM4MDksLjk0NTIzLC44NjI3NSwuODM1MDksLjkzMTU3LC44NTMwOCwuODMzOTIsLjkyMzQ2LC45ODYyMSwuODM1MDksLjkyODg2LC45MTMyNCwuOTIxNjgsLjk1MzgxLC45MDY0NiwuOTI4ODYsLjkwNTU3LC44Njg0NywuOTAyNzYsLjkxMzI0LC44Njg0MiwuOTIxNjgsLjk5NTMxLC45NTM4MSwuOTIyNCwuODU0MDgsLjkyNjk5LC44Njg0NywxLjAwNTEsLjkxNTEzLC44MDQ4NywuOTM0ODEsMSwuODgxNTksMS4wNTIxNCwuOTA2NDYsLjk3MzU1LC44MTUzOSwuODkzOTgsLjg1OTIzLC45NTM4MSwuOTA2NDYsLjkxNTEzLC45MDY0NiwuODU5MjMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTE1NCwuOTQyMzYsLjkxNTQsLjk0MjM2LC45MTU0LC45NDIzNiwuODU0NTgsLjg5MzY0LC45NjY5NCwxLC44OTkwMywxLDEsMSwuOTE3ODIsLjkxNzgyLC45MTc4MiwxLC44OTYsLjg5NiwuODk2LC45MzMyLC45MzMyLC45NTk3MywxLDEuMjYsMSwxLC44MDQ3OSwuODAxNzgsMSwxLC44NTYzMywxLDEsMSwxLC45NzI3NiwxLDEsMSwuNjk4LDEsMS4zNjE0NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4xNDU0MiwxLC43OTE5OSwuNzg2OTQsMS4wMjA1OCwxLjAzNDkzLDEuMDU0ODYsMSwxLDEuMjMwMjYsMS4wODU5NSwxLjA4NTk1LDEsMS4wODU5NSwxLjA4NTk1LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4yMDAwNiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0Lk15cmlhZFByb0JvbGRJdGFsaWNNZXRyaWNzPXtsaW5lSGVpZ2h0OjEuMixsaW5lR2FwOi4yfSx0Lk15cmlhZFByb0l0YWxpY0ZhY3RvcnM9WzEuMzY4OTgsMSwxLC42NTUwNywuODQ5NDMsLjg1NjM5LC44ODQ2NSwuODg0NjUsLjg2OTM2LC44ODMwNywuODY5NDgsLjg1MjgzLC44NTI4MywxLjA2MzgzLDEuMDIwNTgsLjc1OTQ1LC45MjE5LC43NTk0NSwxLjE3MzM3LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44ODQ2NSwuNzU5NDUsLjc1OTQ1LDEuMDIwNTgsMS4wMjA1OCwxLjAyMDU4LC42OTA0NiwuNzA5MjYsLjg1MTU4LC43NzgxMiwuNzY4NTIsLjg5NTkxLC43MDQ2NiwuNzYxMjUsLjgwMDk0LC44NjgyMiwuODM4NjQsLjcyOCwuNzcyMTIsLjc5NDc1LC45MzYzNywuODc1MTQsLjg1ODgsLjc2MDEzLC44NTg4LC43MjQyMSwuNjk4NjYsLjc3NTk4LC44NTk5MSwuODA4MTEsLjg3ODMyLC43ODExMiwuNzc1MTIsLjg1NjIsMS4wMjIyLDEuMTg0MTcsMS4wMjIyLDEuMjcwMTQsLjg5OTAzLDEuMTUwMTIsLjkzODU5LC45NDM5OSwuODQ2LC45NDM5OSwuODE0NTMsMS4wMTg2LC45NDIxOSwuOTYwMTcsMS4wMzA3NSwxLjAyMTc1LC45MTIsMS4wMzA3NSwuOTY5OTgsLjk2MDE3LC45Mzg1OSwuOTQzOTksLjk0Mzk5LC45NTQ5MywuNzQ2LDEuMTI2NTgsLjk0NTc4LC45MSwuOTc5LC44ODIsLjg4MiwuODMsLjg1MDM0LC44MzUzNywuODUwMzQsMS4wMjA1OCwuNzA4NjksLjg4NDY1LC44ODQ2NSwuODg0NjUsLjg4NDY1LC44MzUzNywuOTAwODMsMS4xNTAxMiwuOTE2MSwuOTQ1NjUsLjczNTQxLDEuMDIwNTgsLjUzNjA5LC42OTM1MywuNzk1MTksMS4wODU5NSwxLDEsMS4xNTAxMiwxLC45MTk3NCwuNzU5NDUsMS4xNTAxMiwxLC45NDQ2LC43MzM2MSwuOTAwNSwuOTAwNSwuOTAwNSwuNjI4NjQsLjg1MTU4LC44NTE1OCwuODUxNTgsLjg1MTU4LC44NTE1OCwuODUxNTgsLjc3MywuNzY4NTIsLjcwNDY2LC43MDQ2NiwuNzA0NjYsLjcwNDY2LC44Mzg2NCwuODM4NjQsLjgzODY0LC44Mzg2NCwuOTA1NjEsLjg3NTE0LC44NTg4LC44NTg4LC44NTg4LC44NTg4LC44NTg4LDEuMDIwNTgsLjg1NzUxLC44NTk5MSwuODU5OTEsLjg1OTkxLC44NTk5MSwuNzc1MTIsLjc2MDEzLC44ODA3NSwuOTM4NTksLjkzODU5LC45Mzg1OSwuOTM4NTksLjkzODU5LC45Mzg1OSwuODA3NSwuODQ2LC44MTQ1MywuODE0NTMsLjgxNDUzLC44MTQ1MywuODI0MjQsLjgyNDI0LC44MjQyNCwuODI0MjQsLjkyNzgsLjk2MDE3LC45Mzg1OSwuOTM4NTksLjkzODU5LC45Mzg1OSwuOTM4NTksMS4wODU5NSwuODU2MiwuOTQ1NzgsLjk0NTc4LC45NDU3OCwuOTQ1NzgsLjg4MiwuOTQ1NzgsLjg4MiwuODUxNTgsLjkzODU5LC44NTE1OCwuOTM4NTksLjg1MTU4LC45Mzg1OSwuNzY4NTIsLjg0NiwuNzY4NTIsLjg0NiwuNzY4NTIsLjg0NiwuNzY4NTIsLjg0NiwuODk1OTEsLjg1NDQsLjkwNTYxLC45NDM5OSwuNzA0NjYsLjgxNDUzLC43MDQ2NiwuODE0NTMsLjcwNDY2LC44MTQ1MywuNzA0NjYsLjgxNDUzLC43MDQ2NiwuODE0NTMsLjgwMDk0LC45NDIxOSwuODAwOTQsLjk0MjE5LC44MDA5NCwuOTQyMTksMSwxLC44NjgyMiwuOTYwMTcsLjg2ODIyLC45NjAxNywuODM4NjQsLjgyNDI0LC44Mzg2NCwuODI0MjQsLjgzODY0LC44MjQyNCwuODM4NjQsMS4wMzA3NSwuODM4NjQsLjgyNDI0LC44MTQwMiwxLjAyNzM4LC43MjgsMS4wMjE3NSwxLDEsLjkxMiwuNzk0NzUsMS4wMzA3NSwxLDEsLjc5NDc1LC44MzkxMSwuNzk0NzUsLjY2MjY2LC44MDU1MywxLjA2Njc2LC44NzUxNCwuOTYwMTcsMSwxLC44NzUxNCwuOTYwMTcsLjg2ODY1LC44NzM5NiwuOTYwMTcsLjg1ODgsLjkzODU5LC44NTg4LC45Mzg1OSwuODU4OCwuOTM4NTksLjg2NywuODQ3NTksLjcyNDIxLC45NTQ5MywxLDEsLjcyNDIxLC45NTQ5MywuNjk4NjYsLjc0NiwuNjk4NjYsLjc0NiwxLDEsLjY5ODY2LC43NDYsMSwxLC43NzU5OCwuODg0MTcsLjc3NTk4LDEuMTI2NTgsLjg1OTkxLC45NDU3OCwuODU5OTEsLjk0NTc4LC44NTk5MSwuOTQ1NzgsLjg1OTkxLC45NDU3OCwuODU5OTEsLjk0NTc4LC44NTk5MSwuOTQ1NzgsLjg3ODMyLC45NzksLjc3NTEyLC44ODIsLjc3NTEyLC44NTYyLC44MywuODU2MiwuODMsLjg1NjIsLjgzLDEsLjg4NDY1LC44NTE1OCwuOTM4NTksLjc3MywuODA3NSwuODU3NTEsLjg1NjIsMSwxLC43NzU5OCwxLjEyNjU4LDEuMTUwMTIsMS4xNTAxMiwxLjE1MDEyLDEuMTUwMTIsMS4xNTAxMiwxLjE1MzEzLDEuMTUwMTIsMS4xNTAxMiwxLjE1MDEyLDEuMDgxMDYsMS4wMzkwMSwuODUxNTgsLjc3MDI1LC42MjI2NCwuNzY0NiwuNjUzNTEsLjg2MDI2LC42OTQ2MSwuODk5NDcsMS4wMzA3NSwuODUxNTgsLjc3ODEyLC43NjQ0OSwuODg4MzYsLjcwNDY2LC44NTYyLC44NjgyMiwuODU4OCwuODM4NjQsLjc3MjEyLC44NTMwOCwuOTM2MzcsLjg3NTE0LC44MjM1MiwuODU4OCwuODU3MDEsLjc2MDEzLC44OTA1OCwuNzc1OTgsLjgxNTYsLjgyNTY1LC43ODExMiwuNzc4OTksLjg5Mzg2LC44Mzg2NCwuODE1NiwuOTQ4NiwuOTIzODgsLjk2MTg2LDEuMDMwNzUsLjkxMTIzLC45NDg2LC45MzI5OCwuODc4LC45Mzk0MiwuOTIzODgsLjg0NTk2LC45NjE4NiwuOTUxMTksMS4wMzA3NSwuOTIyLC44ODc4NywuOTU4MjksLjg4LC45MzU1OSwuOTM4NTksLjc4ODE1LC45Mzc1OCwxLC44OTIxNywxLjAzNzM3LC45MTEyMywuOTM5NjksLjc3NDg3LC44NTc2OSwuODY3OTksMS4wMzA3NSwuOTExMjMsLjkzODU5LC45MTEyMywuODY3OTksMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuODc4MzIsLjk3OSwuODc4MzIsLjk3OSwuODc4MzIsLjk3OSwuNzc1MTIsLjg4MiwuOTIxOSwxLC44OTkwMywxLDEsMSwuODczMjEsLjg3MzIxLC44NzMyMSwxLDEuMDI3LDEuMDI3LDEuMDI3LC44Njg0NywuODY4NDcsLjc5MTIxLDEsMS4xMjQsMSwxLC43MzU3MiwuNzM1NzIsMSwxLC44NTAzNCwxLDEsMSwxLC44ODQ2NSwxLDEsMSwuNjY5LDEsMS4zNjE0NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4wNDgyOCwxLC43NDk0OCwuNzUxODcsMS4wMjA1OCwuOTgzOTEsMS4wMjExOSwxLDEsMS4wNjIzMywxLjA4NTk1LDEuMDg1OTUsMSwxLjA4NTk1LDEuMDg1OTUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA1MjMzLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuTXlyaWFkUHJvSXRhbGljTWV0cmljcz17bGluZUhlaWdodDoxLjIsbGluZUdhcDouMn0sdC5NeXJpYWRQcm9SZWd1bGFyRmFjdG9ycz1bMS4zNjg5OCwxLDEsLjc2MzA1LC44Mjc4NCwuOTQ5MzUsLjg5MzY0LC45MjI0MSwuODkwNzMsLjkwNzA2LC45ODQ3MiwuODUyODMsLjg1MjgzLDEuMDY2NCwxLjAyMDU4LC43NDUwNSwuOTIxOSwuNzQ1MDUsMS4yMzQ1NiwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIyNDEsLjc0NTA1LC43NDUwNSwxLjAyMDU4LDEuMDIwNTgsMS4wMjA1OCwuNzMwMDIsLjcyNjAxLC45MTc1NSwuODEyNiwuODAzMTQsLjkyMjIyLC43Mzc2NCwuNzk3MjYsLjgzMDUxLC45MDI4NCwuODYwMjMsLjc0LC44MTI2LC44NDg2OSwuOTY1MTgsLjkxMTE1LC44ODU4LC43OTc2MSwuODg1OCwuNzQ0OTgsLjczOTE0LC44MTM2MywuODk1OTEsLjgzNjU5LC44OTYzMywuODU2MDgsLjgxMTEsLjkwNTMxLDEuMDIyMiwxLjIyNzM2LDEuMDIyMiwxLjI3MDE0LC44OTkwMywuOTAwODgsLjg2NjY3LDEuMDIzMSwuODk2LDEuMDE0MTEsLjkwMDgzLDEuMDUwOTksMS4wMDUxMiwuOTk3OTMsMS4wNTMyNiwxLjA5Mzc3LC45MzgsMS4wNjIyNiwxLjAwMTE5LC45OTc5MywuOTg3MTQsMS4wMjMxLDEuMDEyMzEsLjk4MTk2LC43OTIsMS4xOTEzNywuOTkwNzQsLjk2MiwxLjAxOTE1LC45MjYsLjk0MiwuODU2LC44NTAzNCwuOTIwMDYsLjg1MDM0LDEuMDIwNTgsLjY5MDY3LC45MjI0MSwuOTIyNDEsLjkyMjQxLC45MjI0MSwuOTIwMDYsLjkzMzIsLjkwMDg4LC45MTg4MiwuOTM0ODQsLjc1MzM5LDEuMDIwNTgsLjU2ODY2LC41NDMyNCwuNzk1MTksMS4wODU5NSwxLDEsLjkwMDg4LDEsLjk1MzI1LC43NDUwNSwuOTAwODgsMSwuOTcxOTgsLjc1MzM5LC45MTAwOSwuOTEwMDksLjkxMDA5LC42NjQ2NiwuOTE3NTUsLjkxNzU1LC45MTc1NSwuOTE3NTUsLjkxNzU1LC45MTc1NSwuNzg4LC44MDMxNCwuNzM3NjQsLjczNzY0LC43Mzc2NCwuNzM3NjQsLjg2MDIzLC44NjAyMywuODYwMjMsLjg2MDIzLC45MjkxNSwuOTExMTUsLjg4NTgsLjg4NTgsLjg4NTgsLjg4NTgsLjg4NTgsMS4wMjA1OCwuODg1OCwuODk1OTEsLjg5NTkxLC44OTU5MSwuODk1OTEsLjgxMTEsLjc5NjExLC44OTcxMywuODY2NjcsLjg2NjY3LC44NjY2NywuODY2NjcsLjg2NjY3LC44NjY2NywuODY5MzYsLjg5NiwuOTAwODMsLjkwMDgzLC45MDA4MywuOTAwODMsLjg0MjI0LC44NDIyNCwuODQyMjQsLjg0MjI0LC45NzI3NiwuOTk3OTMsLjk4NzE0LC45ODcxNCwuOTg3MTQsLjk4NzE0LC45ODcxNCwxLjA4NTk1LC44OTg3NiwuOTkwNzQsLjk5MDc0LC45OTA3NCwuOTkwNzQsLjk0MiwxLjAyMzEsLjk0MiwuOTE3NTUsLjg2NjY3LC45MTc1NSwuODY2NjcsLjkxNzU1LC44NjY2NywuODAzMTQsLjg5NiwuODAzMTQsLjg5NiwuODAzMTQsLjg5NiwuODAzMTQsLjg5NiwuOTIyMjIsLjkzMzcyLC45MjkxNSwxLjAxNDExLC43Mzc2NCwuOTAwODMsLjczNzY0LC45MDA4MywuNzM3NjQsLjkwMDgzLC43Mzc2NCwuOTAwODMsLjczNzY0LC45MDA4MywuODMwNTEsMS4wMDUxMiwuODMwNTEsMS4wMDUxMiwuODMwNTEsMS4wMDUxMiwxLDEsLjkwMjg0LC45OTc5MywuOTA5NzYsLjk5NzkzLC44NjAyMywuODQyMjQsLjg2MDIzLC44NDIyNCwuODYwMjMsLjg0MjI0LC44NjAyMywxLjA1MzI2LC44NjAyMywuODQyMjQsLjgyODczLDEuMDc0NjksLjc0LDEuMDkzNzcsMSwxLC45MzgsLjg0ODY5LDEuMDYyMjYsMSwxLC44NDg2OSwuODM3MDQsLjg0ODY5LC44MTQ0MSwuODU1ODgsMS4wODkyNywuOTExMTUsLjk5NzkzLDEsMSwuOTExMTUsLjk5NzkzLC45MTg4NywuOTA5OTEsLjk5NzkzLC44ODU4LC45ODcxNCwuODg1OCwuOTg3MTQsLjg4NTgsLjk4NzE0LC44OTQsLjkxNDM0LC43NDQ5OCwuOTgxOTYsMSwxLC43NDQ5OCwuOTgxOTYsLjczOTE0LC43OTIsLjczOTE0LC43OTIsMSwxLC43MzkxNCwuNzkyLDEsMSwuODEzNjMsLjkwNCwuODEzNjMsMS4xOTEzNywuODk1OTEsLjk5MDc0LC44OTU5MSwuOTkwNzQsLjg5NTkxLC45OTA3NCwuODk1OTEsLjk5MDc0LC44OTU5MSwuOTkwNzQsLjg5NTkxLC45OTA3NCwuODk2MzMsMS4wMTkxNSwuODExMSwuOTQyLC44MTExLC45MDUzMSwuODU2LC45MDUzMSwuODU2LC45MDUzMSwuODU2LDEsLjkyMjQxLC45MTc1NSwuODY2NjcsLjc4OCwuODY5MzYsLjg4NTgsLjg5ODc2LDEsMSwuODEzNjMsMS4xOTEzNywuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAwODgsLjkwMDg4LC45MDA4OCwuOTAzODgsMS4wMzkwMSwuOTIxMzgsLjc4MTA1LC43MTU0LC44NjE2OSwuODA1MTMsLjk0MDA3LC44MjUyOCwuOTg2MTIsMS4wNjIyNiwuOTE3NTUsLjgxMjYsLjgxODg0LC45MjgxOSwuNzM3NjQsLjkwNTMxLC45MDI4NCwuODg1OCwuODYwMjMsLjgxMjYsLjkxMTcyLC45NjUxOCwuOTExMTUsLjgzMDg5LC44ODU4LC44Nzc5MSwuNzk3NjEsLjg5Mjk3LC44MTM2MywuODgxNTcsLjg5OTkyLC44NTYwOCwuODE5OTIsLjk0MzA3LC44NjAyMywuODgxNTcsLjk1MzA4LC45ODY5OSwuOTk3OTMsMS4wNjIyNiwuOTU4MTcsLjk1MzA4LC45NzM1OCwuOTI4LC45ODA4OCwuOTg2OTksLjkyNzYxLC45OTc5MywuOTYwMTcsMS4wNjIyNiwuOTg2LC45NDQsLjk1OTc4LC45MzgsLjk2NzA1LC45ODcxNCwuODA0NDIsLjk4OTcyLDEsLjg5NzYyLDEuMDQ1NTIsLjk1ODE3LC45OTAwNywuODcwNjQsLjkxODc5LC44ODg4OCwxLjA2MjI2LC45NTgxNywuOTg3MTQsLjk1ODE3LC44ODg4OCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44OTYzMywxLjAxOTE1LC44OTYzMywxLjAxOTE1LC44OTYzMywxLjAxOTE1LC44MTExLC45NDIsLjkyMTksMSwuODk5MDMsMSwxLDEsLjkzMTczLC45MzE3MywuOTMxNzMsMSwxLjA2MzA0LDEuMDYzMDQsMS4wNjkwNCwuODk5MDMsLjg5OTAzLC44MDU0OSwxLDEuMTU2LDEsMSwuNzY1NzUsLjc2NTc1LDEsMSwuNzI0NTgsMSwxLDEsMSwuOTIyNDEsMSwxLDEsLjYxOSwxLDEuMzYxNDUsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDcyNTcsMSwuNzQ3MDUsLjcxMTE5LDEuMDIwNTgsMS4wMjQsMS4wMjExOSwxLDEsMS4xNTM2LDEuMDg1OTUsMS4wODU5NSwxLDEuMDg1OTUsMS4wODU5NSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDU2MzgsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV0sdC5NeXJpYWRQcm9SZWd1bGFyTWV0cmljcz17bGluZUhlaWdodDoxLjIsbGluZUdhcDouMn19LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU2Vnb2V1aVJlZ3VsYXJNZXRyaWNzPXQuU2Vnb2V1aVJlZ3VsYXJGYWN0b3JzPXQuU2Vnb2V1aUl0YWxpY01ldHJpY3M9dC5TZWdvZXVpSXRhbGljRmFjdG9ycz10LlNlZ29ldWlCb2xkTWV0cmljcz10LlNlZ29ldWlCb2xkSXRhbGljTWV0cmljcz10LlNlZ29ldWlCb2xkSXRhbGljRmFjdG9ycz10LlNlZ29ldWlCb2xkRmFjdG9ycz12b2lkIDAsdC5TZWdvZXVpQm9sZEZhY3RvcnM9WzEuNzY3MzgsMSwxLC45OTI5NywuOTgyNCwxLjA0MDE2LDEuMDY0OTcsMS4wMzQyNCwuOTc1MjksMS4xNzY0NywxLjIzMjAzLDEuMTA4NSwxLjEwODUsMS4xNjkzOSwxLjIxMDcsLjk3NTQsMS4yMTQwOCwuOTc1NCwxLjU5NTc4LDEuMDM0MjQsMS4wMzQyNCwxLjAzNDI0LDEuMDM0MjQsMS4wMzQyNCwxLjAzNDI0LDEuMDM0MjQsMS4wMzQyNCwxLjAzNDI0LDEuMDM0MjQsLjgxMzc4LC44MTM3OCwxLjIxMDcsMS4yMTA3LDEuMjEwNywuNzE3MDMsLjk3ODQ3LC45NzM2MywuODg3NzYsLjg2NDEsMS4wMjA5NiwuNzk3OTUsLjg1MTMyLC45MTQsMS4wNjA4NSwxLjE0MDYsLjgwMDcsLjg5ODU4LC44MzY5MywxLjE0ODg5LDEuMDkzOTgsLjk3NDg5LC45MjA5NCwuOTc0ODksLjkwMzk5LC44NDA0MSwuOTU5MjMsMS4wMDEzNSwxLDEuMDY0NjcsLjk4MjQzLC45MDk5NiwuOTkzNjEsMS4xMDg1LDEuNTY5NDIsMS4xMDg1LDEuMjEwNywuNzQ2MjcsLjk0MjgyLC45Njc1MiwxLjAxNTE5LC44NjMwNCwxLjAxMzU5LC45NzI3OCwxLjE1MTAzLDEuMDEzNTksLjk4NTYxLDEuMDIyODUsMS4wMjI4NSwxLjAwNTI3LDEuMDIyODUsMS4wMzAyLC45OTA0MSwxLjAwMDgsMS4wMTUxOSwxLjAxMzU5LDEuMDIyNTgsLjc5MTA0LDEuMTY4NjIsLjk5MDQxLC45NzQ1NCwxLjAyNTExLC45OTI5OCwuOTY3NTIsLjk1ODAxLC45NDg1NiwxLjE2NTc5LC45NDg1NiwxLjIxMDcsLjk4MjQsMS4wMzQyNCwxLjAzNDI0LDEsMS4wMzQyNCwxLjE2NTc5LC44NzI3LDEuMzg3MSwxLjE4NjIyLDEuMTA4MTgsMS4wNDQ3OCwxLjIxMDcsMS4xODYyMiwuNzUxNTUsLjk0OTk0LDEuMjg4MjYsMS4yMTQwOCwxLjIxNDA4LC45MTA1NiwxLC45MTU3MiwuOTc1NCwuNjQ2NjMsMS4xODMyOCwxLjI0ODY2LDEuMDQ0NzgsMS4xNDE2OSwxLjE1NzQ5LDEuMTczODksLjcxNzAzLC45NzM2MywuOTczNjMsLjk3MzYzLC45NzM2MywuOTczNjMsLjk3MzYzLC45MzUwNiwuODY0MSwuNzk3OTUsLjc5Nzk1LC43OTc5NSwuNzk3OTUsMS4xNDA2LDEuMTQwNiwxLjE0MDYsMS4xNDA2LDEuMDIwOTYsMS4wOTM5OCwuOTc0MjYsLjk3NDI2LC45NzQyNiwuOTc0MjYsLjk3NDI2LDEuMjEwNywuOTc0ODksMS4wMDEzNSwxLjAwMTM1LDEuMDAxMzUsMS4wMDEzNSwuOTA5OTYsLjkyMDk0LDEuMDI3OTgsLjk2NzUyLC45Njc1MiwuOTY3NTIsLjk2NzUyLC45Njc1MiwuOTY3NTIsLjkzMTM2LC44NjMwNCwuOTcyNzgsLjk3Mjc4LC45NzI3OCwuOTcyNzgsMS4wMjI4NSwxLjAyMjg1LDEuMDIyODUsMS4wMjI4NSwuOTcxMjIsLjk5MDQxLDEsMSwxLDEsMSwxLjI4ODI2LDEuMDAwOCwuOTkwNDEsLjk5MDQxLC45OTA0MSwuOTkwNDEsLjk2NzUyLDEuMDE1MTksLjk2NzUyLC45NzM2MywuOTY3NTIsLjk3MzYzLC45Njc1MiwuOTczNjMsLjk2NzUyLC44NjQxLC44NjMwNCwuODY0MSwuODYzMDQsLjg2NDEsLjg2MzA0LC44NjQxLC44NjMwNCwxLjAyMDk2LDEuMDMwNTcsMS4wMjA5NiwxLjAzNTE3LC43OTc5NSwuOTcyNzgsLjc5Nzk1LC45NzI3OCwuNzk3OTUsLjk3Mjc4LC43OTc5NSwuOTcyNzgsLjc5Nzk1LC45NzI3OCwuOTE0LDEuMDEzNTksLjkxNCwxLjAxMzU5LC45MTQsMS4wMTM1OSwxLDEsMS4wNjA4NSwuOTg1NjEsMS4wNjA4NSwxLjAwODc5LDEuMTQwNiwxLjAyMjg1LDEuMTQwNiwxLjAyMjg1LDEuMTQwNiwxLjAyMjg1LDEuMTQwNiwxLjAyMjg1LDEuMTQwNiwxLjAyMjg1LC45NzEzOCwxLjA4NjkyLC44MDA3LDEuMDIyODUsMSwxLDEuMDA1MjcsLjgzNjkzLDEuMDIyODUsMSwxLC44MzY5MywuOTQ1NSwuODM2OTMsLjkwNDE4LC44MzY5MywxLjEzMDA1LDEuMDkzOTgsLjk5MDQxLDEsMSwxLjA5Mzk4LC45OTA0MSwuOTY2OTIsMS4wOTI1MSwuOTkwNDEsLjk3NDg5LDEuMDAwOCwuOTc0ODksMS4wMDA4LC45NzQ4OSwxLjAwMDgsLjkzOTk0LC45NzkzMSwuOTAzOTksMS4wMjI1OCwxLDEsLjkwMzk5LDEuMDIyNTgsLjg0MDQxLC43OTEwNCwuODQwNDEsLjc5MTA0LC44NDA0MSwuNzkxMDQsLjg0MDQxLC43OTEwNCwxLDEsLjk1OTIzLDEuMDcwMzQsLjk1OTIzLDEuMTY4NjIsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wMDEzNSwuOTkwNDEsMS4wNjQ2NywxLjAyNTExLC45MDk5NiwuOTY3NTIsLjkwOTk2LC45OTM2MSwuOTU4MDEsLjk5MzYxLC45NTgwMSwuOTkzNjEsLjk1ODAxLDEuMDc3MzMsMS4wMzQyNCwuOTczNjMsLjk2NzUyLC45MzUwNiwuOTMxMzYsLjk3NDg5LDEuMDAwOCwxLDEsLjk1OTIzLDEuMTY4NjIsMS4xNTEwMywxLjE1MTAzLDEuMDExNzMsMS4wMzk1OSwuNzU5NTMsLjgxMzc4LC43OTkxMiwxLjE1MTAzLDEuMjE5OTQsLjk1MTYxLC44NzgxNSwxLjAxMTQ5LC44MTUyNSwuNzY3NiwuOTgxNjcsMS4wMTEzNCwxLjAyNTQ2LC44NDA5NywxLjAzMDg5LDEuMTgxMDIsLjk3MzYzLC44ODc3NiwuODUxMzQsLjk3ODI2LC43OTc5NSwuOTkzNjEsMS4wNjA4NSwuOTc0ODksMS4xNDA2LC44OTg1OCwxLjAzODgsMS4xNDg4OSwxLjA5Mzk4LC44NjAzOSwuOTc0ODksMS4wNTk1LC45MjA5NCwuOTQ3OTMsLjk1OTIzLC45MDk5NiwuOTkzNDYsLjk4MjQzLDEuMDIxMTIsLjk1NDkzLDEuMTQwNiwuOTA5OTYsMS4wMzU3NCwxLjAyNTk3LDEuMDAwOCwxLjE4MTAyLDEuMDY2MjgsMS4wMzU3NCwxLjAxOTIsMS4wMTkzMiwxLjAwODg2LC45NzUzMSwxLjAxMDYsMS4wMDA4LDEuMTMxODksMS4xODEwMiwxLjAyMjc3LC45ODY4MywxLjAwMTYsLjk5NTYxLDEuMDcyMzcsMS4wMDA4LC45MDQzNCwuOTk5MjEsLjkzODAzLC44OTY1LDEuMjMwODUsMS4wNjYyOCwxLjA0OTgzLC45NjI2OCwxLjA0OTksLjk4NDM5LDEuMTgxMDIsMS4wNjYyOCwxLjAwMDgsMS4wNjYyOCwuOTg0MzksLjc5Nzk1LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDk0NjYsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjk3Mjc4LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDIwNjUsMSwxLDEsMSwxLDEsMS4wNjQ2NywxLjAyNTExLDEuMDY0NjcsMS4wMjUxMSwxLjA2NDY3LDEuMDI1MTEsLjkwOTk2LC45Njc1MiwxLDEuMjE0MDgsLjg5OTAzLDEsMSwuNzUxNTUsMS4wNDM5NCwxLjA0Mzk0LDEuMDQzOTQsMS4wNDM5NCwuOTg2MzMsLjk4NjMzLC45ODYzMywuNzMwNDcsLjczMDQ3LDEuMjA2NDIsLjkxMjExLDEuMjU2MzUsMS4yMjIsMS4wMjk1NiwxLjAzMzcyLDEuMDMzNzIsLjk2MDM5LDEuMjQ2MzMsMSwxLjEyNDU0LC45MzUwMywxLjAzNDI0LDEuMTk2ODcsMS4wMzQyNCwxLDEsMSwuNzcxLDEsMSwxLjE1NzQ5LDEuMTU3NDksMS4xNTc0OSwxLjEwOTQ4LC44NjI3OSwuOTQ0MzQsLjg2Mjc5LC45NDQzNCwuODYxODIsMSwxLDEuMTY4OTcsMSwuOTYwODUsLjkwMTM3LDEuMjEwNywxLjE4NDE2LDEuMTM5NzMsLjY5ODI1LC45NzE2LDIuMTAzMzksMS4yOTAwNCwxLjI5MDA0LDEuMjExNzIsMS4yOTAwNCwxLjI5MDA0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS40MjYwMywxLC45OTg2MiwuOTk4NjIsMSwuODcwMjUsLjg3MDI1LC44NzAyNSwuODcwMjUsMS4xODg3NCwxLjQyNjAzLDEsMS40MjYwMywxLjQyNjAzLC45OTg2MiwxLDEsMSwxLDEsMS4yODg2LDEuMDQzMTUsMS4xNTI5NiwxLjM0MTYzLDEsMSwxLDEuMDkxOTMsMS4wOTE5MywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMV0sdC5TZWdvZXVpQm9sZE1ldHJpY3M9e2xpbmVIZWlnaHQ6MS4zMzAwOCxsaW5lR2FwOjB9LHQuU2Vnb2V1aUJvbGRJdGFsaWNGYWN0b3JzPVsxLjc2NzM4LDEsMSwuOTg5NDYsMS4wMzk1OSwxLjA0MDE2LDEuMDI4MDksMS4wMzYsLjk3NjM5LDEuMTA5NTMsMS4yMzIwMywxLjExMTQ0LDEuMTExNDQsMS4xNjkzOSwxLjIxMjM3LC45NzU0LDEuMjEyNjEsLjk3NTQsMS41OTc1NCwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwxLjAzNiwuODEzNzgsLjgxMzc4LDEuMjEyMzcsMS4yMTIzNywxLjIxMjM3LC43MzU0MSwuOTc4NDcsLjk3MzYzLC44OTcyMywuODc4OTcsMS4wNDI2LC43OTQyOSwuODUyOTIsLjkxMTQ5LDEuMDU4MTUsMS4xNDA2LC43OTYzMSwuOTAxMjgsLjgzODUzLDEuMDQzOTYsMS4xMDYxNSwuOTc1NTIsLjk0NDM2LC45NzU1MiwuODg2NDEsLjgwNTI3LC45NjA4MywxLjAwMTM1LDEsMS4wNjc3NywuOTgxNywuOTExNDIsLjk5MzYxLDEuMTExNDQsMS41NzI5MywxLjExMTQ0LDEuMjEyMzcsLjc0NjI3LDEuMzE4MTgsMS4wNjU4NSwuOTcwNDIsLjgzMDU1LC45NzA0MiwuOTM1MDMsMS4xMjYxLC45NzA0MiwuOTc5MjIsMS4xNDIzNiwuOTQ1NTIsMS4wMTA1NCwxLjE0MjM2LDEuMDI0NzEsLjk3OTIyLC45NDE2NSwuOTcwNDIsLjk3MDQyLDEuMDI3NiwuNzg5MjksMS4xMjYxLC45NzkyMiwuOTU4NzQsMS4wMjE5NywuOTg1MDcsLjk2NzUyLC45NzE2OCwuOTUxMDcsMS4xNjU3OSwuOTUxMDcsMS4yMTIzNywxLjAzOTU5LDEuMDM2LDEuMDM2LDEsMS4wMzYsMS4xNjU3OSwuODczNTcsMS4zMTgxOCwxLjE4NzU0LDEuMjY3ODEsMS4wNTM1NiwxLjIxMjM3LDEuMTg2MjIsLjc5NDg3LC45NDk5NCwxLjI5MDA0LDEuMjQwNDcsMS4yNDA0NywxLjMxODE4LDEsLjkxNDg0LC45NzU0LDEuMzE4MTgsMS4xMzQ5LDEuMjQ4NjYsMS4wNTM1NiwxLjEzOTM0LDEuMTU1NzQsMS4xNzM4OSwuNzM1NDEsLjk3MzYzLC45NzM2MywuOTczNjMsLjk3MzYzLC45NzM2MywuOTczNjMsLjk0Mzg1LC44Nzg5NywuNzk0MjksLjc5NDI5LC43OTQyOSwuNzk0MjksMS4xNDA2LDEuMTQwNiwxLjE0MDYsMS4xNDA2LDEuMDQyNiwxLjEwNjE1LC45NzU1MiwuOTc1NTIsLjk3NTUyLC45NzU1MiwuOTc1NTIsMS4yMTIzNywuOTc1NTIsMS4wMDEzNSwxLjAwMTM1LDEuMDAxMzUsMS4wMDEzNSwuOTExNDIsLjk0NDM2LC45ODcyMSwxLjA2NTg1LDEuMDY1ODUsMS4wNjU4NSwxLjA2NTg1LDEuMDY1ODUsMS4wNjU4NSwuOTY3MDUsLjgzMDU1LC45MzUwMywuOTM1MDMsLjkzNTAzLC45MzUwMywxLjE0MjM2LDEuMTQyMzYsMS4xNDIzNiwxLjE0MjM2LC45MzEyNSwuOTc5MjIsLjk0MTY1LC45NDE2NSwuOTQxNjUsLjk0MTY1LC45NDE2NSwxLjI5MDA0LC45NDE2NSwuOTc5MjIsLjk3OTIyLC45NzkyMiwuOTc5MjIsLjk2NzUyLC45NzA0MiwuOTY3NTIsLjk3MzYzLDEuMDY1ODUsLjk3MzYzLDEuMDY1ODUsLjk3MzYzLDEuMDY1ODUsLjg3ODk3LC44MzA1NSwuODc4OTcsLjgzMDU1LC44Nzg5NywuODMwNTUsLjg3ODk3LC44MzA1NSwxLjA0MjYsMS4wMDMzLDEuMDQyNiwuOTcwNDIsLjc5NDI5LC45MzUwMywuNzk0MjksLjkzNTAzLC43OTQyOSwuOTM1MDMsLjc5NDI5LC45MzUwMywuNzk0MjksLjkzNTAzLC45MTE0OSwuOTcwNDIsLjkxMTQ5LC45NzA0MiwuOTExNDksLjk3MDQyLDEsMSwxLjA1ODE1LC45NzkyMiwxLjA1ODE1LC45NzkyMiwxLjE0MDYsMS4xNDIzNiwxLjE0MDYsMS4xNDIzNiwxLjE0MDYsMS4xNDIzNiwxLjE0MDYsMS4xNDIzNiwxLjE0MDYsMS4xNDIzNiwuOTc0NDEsMS4wNDMwMiwuNzk2MzEsMS4wMTU4MiwxLDEsMS4wMTA1NCwuODM4NTMsMS4xNDIzNiwxLDEsLjgzODUzLDEuMDkxMjUsLjgzODUzLC45MDQxOCwuODM4NTMsMS4xOTUwOCwxLjEwNjE1LC45NzkyMiwxLDEsMS4xMDYxNSwuOTc5MjIsMS4wMTAzNCwxLjEwNDY2LC45NzkyMiwuOTc1NTIsLjk0MTY1LC45NzU1MiwuOTQxNjUsLjk3NTUyLC45NDE2NSwuOTE2MDIsLjkxOTgxLC44ODY0MSwxLjAyNzYsMSwxLC44ODY0MSwxLjAyNzYsLjgwNTI3LC43ODkyOSwuODA1MjcsLjc4OTI5LC44MDUyNywuNzg5MjksLjgwNTI3LC43ODkyOSwxLDEsLjk2MDgzLDEuMDU0MDMsLjk1OTIzLDEuMTY4NjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wMDEzNSwuOTc5MjIsMS4wNjc3NywxLjAyMTk3LC45MTE0MiwuOTY3NTIsLjkxMTQyLC45OTM2MSwuOTcxNjgsLjk5MzYxLC45NzE2OCwuOTkzNjEsLjk3MTY4LDEuMjMxOTksMS4wMzYsLjk3MzYzLDEuMDY1ODUsLjk0Mzg1LC45NjcwNSwuOTc1NTIsLjk0MTY1LDEsMSwuOTYwODMsMS4xMjYxLDEuMzE4MTgsMS4zMTgxOCwxLjMxODE4LDEuMzE4MTgsMS4zMTgxOCwxLjMxODE4LDEuMzE4MTgsMS4zMTgxOCwxLjMxODE4LC45NTE2MSwxLjI3MTI2LDEuMDA4MTEsLjgzMjg0LC43NzcwMiwuOTkxMzcsLjk1MjUzLDEuMDM0NywuODYxNDIsMS4wNzIwNSwxLjE0MjM2LC45NzM2MywuODk3MjMsLjg2ODY5LDEuMDk4MTgsLjc5NDI5LC45OTM2MSwxLjA1ODE1LC45NzU1MiwxLjE0MDYsLjkwMTI4LDEuMDY2NjIsMS4wNDM5NiwxLjEwNjE1LC44NDkxOCwuOTc1NTIsMS4wNDY5NCwuOTQ0MzYsLjk4MDE1LC45NjA4MywuOTExNDIsMS4wMDM1NiwuOTgxNywxLjAxOTQ1LC45ODk5OSwxLjE0MDYsLjkxMTQyLDEuMDQ5NjEsLjk4OTgsMS4wMDYzOSwxLjE0MjM2LDEuMDc1MTQsMS4wNDk2MSwuOTk2MDcsMS4wMjg5NywxLjAwOCwuOTg5OCwuOTUxMzQsMS4wMDYzOSwxLjExMTIxLDEuMTQyMzYsMS4wMDUxOCwuOTc5ODEsMS4wMjE4NiwxLDEuMDg1NzgsLjk0MTY1LC45OTMxNCwuOTgzODcsLjkzMDI4LC45MzM3NywxLjM1MTI1LDEuMDc1MTQsMS4xMDY4NywuOTM0OTEsMS4wNDIzMiwxLjAwMzUxLDEuMTQyMzYsMS4wNzUxNCwuOTQxNjUsMS4wNzUxNCwxLjAwMzUxLC43OTQyOSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjA5MDk3LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC45MzUwMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTY2MDksMSwxLDEsMSwxLDEsMS4wNjc3NywxLjAyMTk3LDEuMDY3NzcsMS4wMjE5NywxLjA2Nzc3LDEuMDIxOTcsLjkxMTQyLC45Njc1MiwxLDEuMjEyNjEsLjg5OTAzLDEsMSwuNzUxNTUsMS4wNDc0NSwxLjA0NzQ1LDEuMDQ3NDUsMS4wNDM5NCwuOTg2MzMsLjk4NjMzLC45ODYzMywuNzI5NTksLjcyOTU5LDEuMjA1MDIsLjkxNDA2LDEuMjY1MTQsMS4yMjIsMS4wMjk1NiwxLjAzMzcyLDEuMDMzNzIsLjk2MDM5LDEuMjQ2MzMsMSwxLjA5MTI1LC45MzMyNywxLjAzMzM2LDEuMTY1NDEsMS4wMzYsMSwxLDEsLjc3MSwxLDEsMS4xNTU3NCwxLjE1NTc0LDEuMTU1NzQsMS4xNTU3NCwuODYzNjQsLjk0NDM0LC44NjI3OSwuOTQ0MzQsLjg2MjI0LDEsMSwxLjE2Nzk4LDEsLjk2MDg1LC45MDA2OCwxLjIxMjM3LDEuMTg0MTYsMS4xMzkwNCwuNjk4MjUsLjk3MTYsMi4xMDMzOSwxLjI5MDA0LDEuMjkwMDQsMS4yMTMzOSwxLjI5MDA0LDEuMjkwMDQsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjQyNjAzLDEsLjk5ODYyLC45OTg2MiwxLC44NzAyNSwuODcwMjUsLjg3MDI1LC44NzAyNSwxLjE4Nzc1LDEuNDI2MDMsMSwxLjQyNjAzLDEuNDI2MDMsLjk5ODYyLDEsMSwxLDEsMSwxLjI4ODYsMS4wNDMxNSwxLjE1Mjk2LDEuMzQxNjMsMSwxLDEsMS4xMzI2OSwxLjEzMjY5LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LlNlZ29ldWlCb2xkSXRhbGljTWV0cmljcz17bGluZUhlaWdodDoxLjMzMDA4LGxpbmVHYXA6MH0sdC5TZWdvZXVpSXRhbGljRmFjdG9ycz1bMS43NjczOCwxLDEsLjk4OTQ2LDEuMTQ3NjMsMS4wNTM2NSwxLjA2MjM0LC45NjkyNywuOTI1ODYsMS4xNTM3MywxLjE4NDE0LC45MTM0OSwuOTEzNDksMS4wNzQwMywxLjE3MzA4LC43ODM4MywxLjIwMDg4LC43ODM4MywxLjQyNTMxLC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuNzgzODMsLjc4MzgzLDEuMTczMDgsMS4xNzMwOCwxLjE3MzA4LC43NzM0OSwuOTQ1NjUsLjk0NzI5LC44NTk0NCwuODg1MDYsLjk4NTgsLjc0ODE3LC44MDAxNiwuODg0NDksLjk4MDM5LC45NTc4MiwuNjkyMzgsLjg5ODk4LC44MzIzMSwuOTgxODMsMS4wMzk4OSwuOTY5MjQsLjg2MjM3LC45NjkyNCwuODA1OTUsLjc0NTI0LC44NjA5MSwuOTU0MDIsLjk0MTQzLC45ODQ0OCwuODg1OCwuODMwODksLjkzMjg1LDEuMDk0OSwxLjM5MDE2LDEuMDk0OSwxLjQ1OTk0LC43NDYyNywxLjA0ODM5LC45NzQ1NCwuOTc0NTQsLjg3MjA3LC45NzQ1NCwuODc1MzMsMS4wNjE1MSwuOTc0NTQsMS4wMDE3NiwxLjE2NDg0LDEuMDgxMzIsLjk4MDQ3LDEuMTY0ODQsMS4wMjk4OSwxLjAxMDU0LC45NjIyNSwuOTc0NTQsLjk3NDU0LDEuMDY1OTgsLjc5MDA0LDEuMTYzNDQsMS4wMDM1MSwuOTQ2MjksLjk5NzMsLjkxMDE2LC45Njc3NywuOTA0MywuOTEwODIsLjkyNDgxLC45MTA4MiwxLjE3MzA4LC45NTc0OCwuOTY5MjcsLjk2OTI3LDEsLjk2OTI3LC45MjQ4MSwuODA1OTcsMS4wNDgzOSwxLjIzMzkzLDEuMTc4MSwuOTI0NSwxLjE3MzA4LDEuMjA4MDgsLjYzMjE4LC45NDI2MSwxLjI0ODIyLDEuMDk5NzEsMS4wOTk3MSwxLjA0ODM5LDEsLjg1MjczLC43ODAzMiwxLjA0ODM5LDEuMDk5NzEsMS4yMjMyNiwuOTI0NSwxLjA5ODM2LDEuMTM1MjUsMS4xNTIyMiwuNzA0MjQsLjk0NzI5LC45NDcyOSwuOTQ3MjksLjk0NzI5LC45NDcyOSwuOTQ3MjksLjg1NDk4LC44ODUwNiwuNzQ4MTcsLjc0ODE3LC43NDgxNywuNzQ4MTcsLjk1NzgyLC45NTc4MiwuOTU3ODIsLjk1NzgyLC45ODU4LDEuMDM5ODksLjk2OTI0LC45NjkyNCwuOTY5MjQsLjk2OTI0LC45NjkyNCwxLjE3MzA4LC45NjkyNCwuOTU0MDIsLjk1NDAyLC45NTQwMiwuOTU0MDIsLjgzMDg5LC44NjIzNywuODg0MDksLjk3NDU0LC45NzQ1NCwuOTc0NTQsLjk3NDU0LC45NzQ1NCwuOTc0NTQsLjkyOTE2LC44NzIwNywuODc1MzMsLjg3NTMzLC44NzUzMywuODc1MzMsLjkzMTQ2LC45MzE0NiwuOTMxNDYsLjkzMTQ2LC45Mzg1NCwxLjAxMDU0LC45NjIyNSwuOTYyMjUsLjk2MjI1LC45NjIyNSwuOTYyMjUsMS4yNDgyMiwuODc2MSwxLjAwMzUxLDEuMDAzNTEsMS4wMDM1MSwxLjAwMzUxLC45Njc3NywuOTc0NTQsLjk2Nzc3LC45NDcyOSwuOTc0NTQsLjk0NzI5LC45NzQ1NCwuOTQ3MjksLjk3NDU0LC44ODUwNiwuODcyMDcsLjg4NTA2LC44NzIwNywuODg1MDYsLjg3MjA3LC44ODUwNiwuODcyMDcsLjk4NTgsLjk1MzkxLC45ODU4LC45NzQ1NCwuNzQ4MTcsLjg3NTMzLC43NDgxNywuODc1MzMsLjc0ODE3LC44NzUzMywuNzQ4MTcsLjg3NTMzLC43NDgxNywuODc1MzMsLjg4NDQ5LC45NzQ1NCwuODg0NDksLjk3NDU0LC44ODQ0OSwuOTc0NTQsMSwxLC45ODAzOSwxLjAwMTc2LC45ODAzOSwxLjAwMTc2LC45NTc4MiwuOTMxNDYsLjk1NzgyLC45MzE0NiwuOTU3ODIsLjkzMTQ2LC45NTc4MiwxLjE2NDg0LC45NTc4MiwuOTMxNDYsLjg0NDIxLDEuMTI3NjEsLjY5MjM4LDEuMDgxMzIsMSwxLC45ODA0NywuODMyMzEsMS4xNjQ4NCwxLDEsLjg0NzIzLDEuMDQ4NjEsLjg0NzIzLC43ODc1NSwuODMyMzEsMS4yMzczNiwxLjAzOTg5LDEuMDEwNTQsMSwxLDEuMDM5ODksMS4wMTA1NCwuOTg1NywxLjAzODQ5LDEuMDEwNTQsLjk2OTI0LC45NjIyNSwuOTY5MjQsLjk2MjI1LC45NjkyNCwuOTYyMjUsLjkyMzgzLC45MDE3MSwuODA1OTUsMS4wNjU5OCwxLDEsLjgwNTk1LDEuMDY1OTgsLjc0NTI0LC43OTAwNCwuNzQ1MjQsLjc5MDA0LC43NDUyNCwuNzkwMDQsLjc0NTI0LC43OTAwNCwxLDEsLjg2MDkxLDEuMDI3NTksLjg1NzcxLDEuMTYzNDQsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk1NDAyLDEuMDAzNTEsLjk4NDQ4LC45OTczLC44MzA4OSwuOTY3NzcsLjgzMDg5LC45MzI4NSwuOTA0MywuOTMyODUsLjkwNDMsLjkzMjg1LC45MDQzLDEuMzE4NjgsLjk2OTI3LC45NDcyOSwuOTc0NTQsLjg1NDk4LC45MjkxNiwuOTY5MjQsLjg3NjEsMSwxLC44NjA5MSwxLjE2MzQ0LDEuMDQ4MzksMS4wNDgzOSwxLjA0ODM5LDEuMDQ4MzksMS4wNDgzOSwxLjA0ODM5LDEuMDQ4MzksMS4wNDgzOSwxLjA0ODM5LC44MTk2NSwuODE5NjUsLjk0NzI5LC43ODAzMiwuNzEwMjIsLjkwODgzLC44NDE3MSwuOTk4NzcsLjc3NTk2LDEuMDU3MzQsMS4yLC45NDcyOSwuODU5NDQsLjgyNzkxLC45NjA3LC43NDgxNywuOTMyODUsLjk4MDM5LC45NjkyNCwuOTU3ODIsLjg5ODk4LC45ODMxNiwuOTgxODMsMS4wMzk4OSwuNzg2MTQsLjk2OTI0LC45NzY0MiwuODYyMzcsLjg2MDc1LC44NjA5MSwuODMwODksLjkwMDgyLC44ODU4LC45NzI5NiwxLjAxMjg0LC45NTc4MiwuODMwODksMS4wOTc2LDEuMDQsMS4wMzM0MiwxLjIsMS4wNjc1LDEuMDk3NiwuOTgyMDUsMS4wMzgwOSwxLjA1MDk3LDEuMDQsLjk1MzY0LDEuMDMzNDIsMS4wNTQwMSwxLjIsMS4wMjE0OCwxLjAxMTksMS4wNDcyNCwxLjAxMjcsMS4wMjczMiwuOTYyMjUsLjg5NjUsLjk3NzgzLC45MzU3NCwuOTQ4MTgsMS4zMDY3OSwxLjA2NzUsMS4xMTgyNiwuOTk4MjEsMS4wNTU3LDEuMDMyNiwxLjIsMS4wNjc1LC45NjIyNSwxLjA2NzUsMS4wMzI2LC43NDgxNywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjAzNzU0LDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLC44NzUzMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwuOTg3MDUsMSwxLDEsMSwxLDEsLjk4NDQ4LC45OTczLC45ODQ0OCwuOTk3MywuOTg0NDgsLjk5NzMsLjgzMDg5LC45Njc3NywxLDEuMjAwODgsLjg5OTAzLDEsMSwuNzUxNTUsLjk0OTQ1LC45NDk0NSwuOTQ5NDUsLjk0OTQ1LDEuMTIzMTcsMS4xMjMxNywxLjEyMzE3LC42NzYwMywuNjc2MDMsMS4xNTYyMSwuNzM1ODQsMS4yMTE5MSwxLjIyMTM1LDEuMDY0ODMsLjk0ODY4LC45NDg2OCwuOTU5OTYsMS4yNDYzMywxLDEuMDc0OTcsLjg3NzA5LC45NjkyNywxLjAxNDczLC45NjkyNywxLDEsMSwuNzcyOTUsMSwxLDEuMDk4MzYsMS4wOTgzNiwxLjA5ODM2LDEuMDE1MjIsLjg2MzIxLC45NDQzNCwuODY0OSwuOTQ0MzQsLjg2MTgyLDEsMSwxLjA4MywxLC45MTU3OCwuODY0MzgsMS4xNzMwOCwxLjE4NDE2LDEuMTQ1ODksLjY5ODI1LC45NzYyMiwxLjk2NzkxLDEuMjQ4MjIsMS4yNDgyMiwxLjE3MzA4LDEuMjQ4MjIsMS4yNDgyMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuNDI2MDMsMSwuOTk4NjIsLjk5ODYyLDEsLjg3MDI1LC44NzAyNSwuODcwMjUsLjg3MDI1LDEuMTc5ODQsMS40MjYwMywxLDEuNDI2MDMsMS40MjYwMywuOTk4NjIsMSwxLDEsMSwxLDEuMjg4NiwxLjA0MzE1LDEuMTUyOTYsMS4zNDE2MywxLDEsMSwxLjEwNzQyLDEuMTA3NDIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDFdLHQuU2Vnb2V1aUl0YWxpY01ldHJpY3M9e2xpbmVIZWlnaHQ6MS4zMzAwOCxsaW5lR2FwOjB9LHQuU2Vnb2V1aVJlZ3VsYXJGYWN0b3JzPVsxLjc2NzM4LDEsMSwuOTg1OTQsMS4wMjI4NSwxLjEwNDU0LDEuMDYyMzQsLjk2OTI3LC45MjAzNywxLjE5OTg1LDEuMjA0NiwuOTA2MTYsLjkwNjE2LDEuMDcxNTIsMS4xNzE0LC43ODAzMiwxLjIwMDg4LC43ODAzMiwxLjQwMjQ2LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuOTY5MjcsLjk2OTI3LC45NjkyNywuNzgwMzIsLjc4MDMyLDEuMTcxNCwxLjE3MTQsMS4xNzE0LC44MDU5NywuOTQwODQsLjk2NzA2LC44NTk0NCwuODU3MzQsLjk3MDkzLC43NTg0MiwuNzk5MzYsLjg4MTk4LC45ODMxLC45NTc4MiwuNzEzODcsLjg2OTY5LC44NDYzNiwxLjA3Nzk2LDEuMDM1ODQsLjk2OTI0LC44Mzk2OCwuOTY5MjQsLjgyODI2LC43OTY0OSwuODU3NzEsLjk1MTMyLC45MzExOSwuOTg5NjUsLjg4NDMzLC44Mjg3LC45MzM2NSwxLjA4NjEyLDEuMzYzOCwxLjA4NjEyLDEuNDU3ODYsLjc0NjI3LC44MDQ5OSwuOTE0ODQsMS4wNTcwNywuOTIzODMsMS4wNTg4MiwuOTQwMywxLjEyNjU0LDEuMDU4ODIsMS4wMTc1NiwxLjA5MDExLDEuMDkwMTEsLjk5NDE0LDEuMDkwMTEsMS4wMzQsMS4wMTc1NiwxLjA1MzU2LDEuMDU3MDcsMS4wNTg4MiwxLjA0Mzk5LC44NDg2MywxLjIxOTY4LDEuMDE3NTYsLjk1ODAxLDEuMDAwNjgsLjkxNzk3LC45Njc3NywuOTA0MywuOTAzNTEsLjkyMTA1LC45MDM1MSwxLjE3MTQsLjg1MzM3LC45NjkyNywuOTY5MjcsLjk5OTEyLC45NjkyNywuOTIxMDUsLjgwNTk3LDEuMjQzNCwxLjIwODA4LDEuMDU5MzcsLjkwOTU3LDEuMTcxNCwxLjIwODA4LC43NTE1NSwuOTQyNjEsMS4yNDY0NCwxLjA5OTcxLDEuMDk5NzEsLjg0NzUxLDEsLjg1MjczLC43ODAzMiwuNjE1ODQsMS4wNTQyNSwxLjE3OTE0LC45MDk1NywxLjA4NjY1LDEuMTE1OTMsMS4xNDE2OSwuNzMzODEsLjk2NzA2LC45NjcwNiwuOTY3MDYsLjk2NzA2LC45NjcwNiwuOTY3MDYsLjg2MDM1LC44NTczNCwuNzU4NDIsLjc1ODQyLC43NTg0MiwuNzU4NDIsLjk1NzgyLC45NTc4MiwuOTU3ODIsLjk1NzgyLC45NzA5MywxLjAzNTg0LC45NjkyNCwuOTY5MjQsLjk2OTI0LC45NjkyNCwuOTY5MjQsMS4xNzE0LC45NjkyNCwuOTUxMzIsLjk1MTMyLC45NTEzMiwuOTUxMzIsLjgyODcsLjgzOTY4LC44OTA0OSwuOTE0ODQsLjkxNDg0LC45MTQ4NCwuOTE0ODQsLjkxNDg0LC45MTQ4NCwuOTM1NzUsLjkyMzgzLC45NDAzLC45NDAzLC45NDAzLC45NDAzLC44NzE3LC44NzE3LC44NzE3LC44NzE3LDEuMDA1MjcsMS4wMTc1NiwxLjA1MzU2LDEuMDUzNTYsMS4wNTM1NiwxLjA1MzU2LDEuMDUzNTYsMS4yNDY0NCwuOTU5MjMsMS4wMTc1NiwxLjAxNzU2LDEuMDE3NTYsMS4wMTc1NiwuOTY3NzcsMS4wNTcwNywuOTY3NzcsLjk2NzA2LC45MTQ4NCwuOTY3MDYsLjkxNDg0LC45NjcwNiwuOTE0ODQsLjg1NzM0LC45MjM4MywuODU3MzQsLjkyMzgzLC44NTczNCwuOTIzODMsLjg1NzM0LC45MjM4MywuOTcwOTMsMS4wOTY5LC45NzA5MywxLjA1ODgyLC43NTg0MiwuOTQwMywuNzU4NDIsLjk0MDMsLjc1ODQyLC45NDAzLC43NTg0MiwuOTQwMywuNzU4NDIsLjk0MDMsLjg4MTk4LDEuMDU4ODIsLjg4MTk4LDEuMDU4ODIsLjg4MTk4LDEuMDU4ODIsMSwxLC45ODMxLDEuMDE3NTYsLjk4MzEsMS4wMTc1NiwuOTU3ODIsLjg3MTcsLjk1NzgyLC44NzE3LC45NTc4MiwuODcxNywuOTU3ODIsMS4wOTAxMSwuOTU3ODIsLjg3MTcsLjg0Nzg0LDEuMTE1NTEsLjcxMzg3LDEuMDkwMTEsMSwxLC45OTQxNCwuODQ2MzYsMS4wOTAxMSwxLDEsLjg0NjM2LDEuMDUzNiwuODQ2MzYsLjk0Mjk4LC44NDYzNiwxLjIzMjk3LDEuMDM1ODQsMS4wMTc1NiwxLDEsMS4wMzU4NCwxLjAxNzU2LDEuMDAzMjMsMS4wMzQ0NCwxLjAxNzU2LC45NjkyNCwxLjA1MzU2LC45NjkyNCwxLjA1MzU2LC45NjkyNCwxLjA1MzU2LC45MzA2NiwuOTgyOTMsLjgyODI2LDEuMDQzOTksMSwxLC44MjgyNiwxLjA0Mzk5LC43OTY0OSwuODQ4NjMsLjc5NjQ5LC44NDg2MywuNzk2NDksLjg0ODYzLC43OTY0OSwuODQ4NjMsMSwxLC44NTc3MSwxLjE3MzE4LC44NTc3MSwxLjIxOTY4LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45NTEzMiwxLjAxNzU2LC45ODk2NSwxLjAwMDY4LC44Mjg3LC45Njc3NywuODI4NywuOTMzNjUsLjkwNDMsLjkzMzY1LC45MDQzLC45MzM2NSwuOTA0MywxLjA4NTcxLC45NjkyNywuOTY3MDYsLjkxNDg0LC44NjAzNSwuOTM1NzUsLjk2OTI0LC45NTkyMywxLDEsLjg1NzcxLDEuMjE5NjgsMS4xMTQzNywxLjExNDM3LC45MzEwOSwuOTEyMDIsLjYwNDExLC44NDE2NCwuNTU1NzIsMS4wMTE3MywuOTczNjEsLjgxODE4LC44MTgxOCwuOTY2MzUsLjc4MDMyLC43MjcyNywuOTIzNjYsLjk4NjAxLDEuMDM0MDUsLjc3OTY4LDEuMDk3OTksMS4yLC45NjcwNiwuODU5NDQsLjg1NjM4LC45NjQ5MSwuNzU4NDIsLjkzMzY1LC45ODMxLC45NjkyNCwuOTU3ODIsLjg2OTY5LC45NDE1MiwxLjA3Nzk2LDEuMDM1ODQsLjc4NDM3LC45NjkyNCwuOTg3MTUsLjgzOTY4LC44MzQ5MSwuODU3NzEsLjgyODcsLjk0NDkyLC44ODQzMywuOTI4NywxLjAwOTgsLjk1NzgyLC44Mjg3LDEuMDYyNSwuOTgyNDgsMS4wMzQyNCwxLjIsMS4wMTA3MSwxLjA2MjUsLjk1MjQ2LDEuMDM4MDksMS4wNDkxMiwuOTgyNDgsMS4wMDIyMSwxLjAzNDI0LDEuMDU0NDMsMS4yLDEuMDQ3ODUsLjk5NjA5LDEuMDAxNjksMS4wNTE3NiwuOTkzNDYsMS4wNTM1NiwuOTA4NywxLjAzMDA0LC45NTU0MiwuOTMxMTcsMS4yMzM2MiwxLjAxMDcxLDEuMDc4MzEsMS4wMjUxMiwxLjA1MjA1LDEuMDM1MDIsMS4yLDEuMDEwNzEsMS4wNTM1NiwxLjAxMDcxLDEuMDM1MDIsLjc1ODQyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEuMDM3MTksMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsLjk0MDMsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMS4wNDAyMSwxLDEsMSwxLDEsMSwuOTg5NjUsMS4wMDA2OCwuOTg5NjUsMS4wMDA2OCwuOTg5NjUsMS4wMDA2OCwuODI4NywuOTY3NzcsMSwxLjIwMDg4LC44OTkwMywxLDEsLjc1MTU1LDEuMDMwNzcsMS4wMzA3NywxLjAzMDc3LDEuMDMwNzcsMS4xMzE5NiwxLjEzMTk2LDEuMTMxOTYsLjY3NDI4LC42NzQyOCwxLjE2MDM5LC43MzI5MSwxLjIwOTk2LDEuMjIxMzUsMS4wNjQ4MywuOTQ4NjgsLjk0ODY4LC45NTk5NiwxLjI0NjMzLDEsMS4wNzQ5NywuODc3OTYsLjk2OTI3LDEuMDE1MTgsLjk2OTI3LDEsMSwxLC43NzI5NSwxLDEsMS4xMDUzOSwxLjEwNTM5LDEuMTEzNTgsMS4wNjk2NywuODYyNzksLjk0NDM0LC44NjI3OSwuOTQ0MzQsLjg2MTgyLDEsMSwxLjA4MywxLC45MTU3OCwuODY1MDcsMS4xNzE0LDEuMTg0MTYsMS4xNDU4OSwuNjk4MjUsLjk3NjIyLDEuOTY5NywxLjI0ODIyLDEuMjQ4MjIsMS4xNzIzOCwxLjI0ODIyLDEuMjQ4MjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLjQyNjAzLDEsLjk5ODYyLC45OTg2MiwxLC44NzAyNSwuODcwMjUsLjg3MDI1LC44NzAyNSwxLjE4MDgzLDEuNDI2MDMsMSwxLjQyNjAzLDEuNDI2MDMsLjk5ODYyLDEsMSwxLDEsMSwxLjI4ODYsMS4wNDMxNSwxLjE1Mjk2LDEuMzQxNjMsMSwxLDEsMS4xMDkzOCwxLjEwOTM4LDEsMSwxLDEuMDU0MjUsMS4wOTk3MSwxLjA5OTcxLDEuMDk5NzEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxXSx0LlNlZ29ldWlSZWd1bGFyTWV0cmljcz17bGluZUhlaWdodDoxLjMzMDA4LGxpbmVHYXA6MH19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Qb3N0U2NyaXB0RXZhbHVhdG9yPXQuUG9zdFNjcmlwdENvbXBpbGVyPXQuUERGRnVuY3Rpb25GYWN0b3J5PXZvaWQgMCx0LmlzUERGRnVuY3Rpb249ZnVuY3Rpb24oZSl7bGV0IHQ7aWYoZSBpbnN0YW5jZW9mIG4uRGljdCl0PWU7ZWxzZXtpZighKGUgaW5zdGFuY2VvZiBvLkJhc2VTdHJlYW0pKXJldHVybiExO3Q9ZS5kaWN0fXJldHVybiB0LmhhcygiRnVuY3Rpb25UeXBlIil9LHIoMikscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDE1OSk7dmFyIG49cigxNTApLGE9cigxNDQpLHM9cigyMDgpLG89cigxNTEpLGM9cigyMDkpO2Z1bmN0aW9uIGwoZSl7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG51bGw7Y29uc3QgdD1lLmxlbmd0aDtmb3IobGV0IHI9MDtyPHQ7cisrKWlmKCJudW1iZXIiIT10eXBlb2YgZVtyXSl7Y29uc3Qgcj1uZXcgQXJyYXkodCk7Zm9yKGxldCBuPTA7bjx0O24rKylyW25dPStlW25dO3JldHVybiByfXJldHVybiBlfXQuUERGRnVuY3Rpb25GYWN0b3J5PWNsYXNze2NvbnN0cnVjdG9yKGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnI9ITB9PWU7dGhpcy54cmVmPXQsdGhpcy5pc0V2YWxTdXBwb3J0ZWQ9ITEhPT1yfWNyZWF0ZShlKXtjb25zdCB0PXRoaXMuZ2V0Q2FjaGVkKGUpO2lmKHQpcmV0dXJuIHQ7Y29uc3Qgcj1oLnBhcnNlKHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5pc0V2YWxTdXBwb3J0ZWQsZm46ZSBpbnN0YW5jZW9mIG4uUmVmP3RoaXMueHJlZi5mZXRjaChlKTplfSk7cmV0dXJuIHRoaXMuX2NhY2hlKGUscikscn1jcmVhdGVGcm9tQXJyYXkoZSl7Y29uc3QgdD10aGlzLmdldENhY2hlZChlKTtpZih0KXJldHVybiB0O2NvbnN0IHI9aC5wYXJzZUFycmF5KHt4cmVmOnRoaXMueHJlZixpc0V2YWxTdXBwb3J0ZWQ6dGhpcy5pc0V2YWxTdXBwb3J0ZWQsZm5PYmo6ZSBpbnN0YW5jZW9mIG4uUmVmP3RoaXMueHJlZi5mZXRjaChlKTplfSk7cmV0dXJuIHRoaXMuX2NhY2hlKGUscikscn1nZXRDYWNoZWQoZSl7dmFyIHQ7bGV0IHI7aWYoZSBpbnN0YW5jZW9mIG4uUmVmP3I9ZTplIGluc3RhbmNlb2Ygbi5EaWN0P3I9ZS5vYmpJZDplIGluc3RhbmNlb2Ygby5CYXNlU3RyZWFtJiYocj1udWxsPT09KHQ9ZS5kaWN0KXx8dm9pZCAwPT09dD92b2lkIDA6dC5vYmpJZCkscil7Y29uc3QgZT10aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuZ2V0QnlSZWYocik7aWYoZSlyZXR1cm4gZX1yZXR1cm4gbnVsbH1fY2FjaGUoZSx0KXt2YXIgcjtpZighdCl0aHJvdyBuZXcgRXJyb3IoJ1BERkZ1bmN0aW9uRmFjdG9yeS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkRnVuY3Rpb24iIGFyZ3VtZW50LicpO2xldCBhO2UgaW5zdGFuY2VvZiBuLlJlZj9hPWU6ZSBpbnN0YW5jZW9mIG4uRGljdD9hPWUub2JqSWQ6ZSBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbSYmKGE9bnVsbD09PShyPWUuZGljdCl8fHZvaWQgMD09PXI/dm9pZCAwOnIub2JqSWQpLGEmJnRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5zZXQobnVsbCxhLHQpfWdldCBfbG9jYWxGdW5jdGlvbkNhY2hlKCl7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIl9sb2NhbEZ1bmN0aW9uQ2FjaGUiLG5ldyBjLkxvY2FsRnVuY3Rpb25DYWNoZSl9fTtjbGFzcyBoe3N0YXRpYyBnZXRTYW1wbGVBcnJheShlLHQscixuKXtsZXQgYSxpLHM9MTtmb3IoYT0wLGk9ZS5sZW5ndGg7YTxpO2ErKylzKj1lW2FdO3MqPXQ7Y29uc3Qgbz1uZXcgQXJyYXkocyk7bGV0IGM9MCxsPTA7Y29uc3QgaD0xLygyKipyLTEpLHU9bi5nZXRCeXRlcygocypyKzcpLzgpO2xldCBkPTA7Zm9yKGE9MDthPHM7YSsrKXtmb3IoO2M8cjspbDw8PTgsbHw9dVtkKytdLGMrPTg7Yy09cixvW2FdPShsPj5jKSpoLGwmPSgxPDxjKS0xfXJldHVybiBvfXN0YXRpYyBwYXJzZShlKXtsZXR7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGZuOm59PWU7Y29uc3QgaT1uLmRpY3R8fG47c3dpdGNoKGkuZ2V0KCJGdW5jdGlvblR5cGUiKSl7Y2FzZSAwOnJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWQoe3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6cixmbjpuLGRpY3Q6aX0pO2Nhc2UgMTpicmVhaztjYXNlIDI6cmV0dXJuIHRoaXMuY29uc3RydWN0SW50ZXJwb2xhdGVkKHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnIsZGljdDppfSk7Y2FzZSAzOnJldHVybiB0aGlzLmNvbnN0cnVjdFN0aWNoZWQoe3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6cixkaWN0Oml9KTtjYXNlIDQ6cmV0dXJuIHRoaXMuY29uc3RydWN0UG9zdFNjcmlwdCh7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGZuOm4sZGljdDppfSl9dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZSBvZiBmdW5jdGlvbiIpfXN0YXRpYyBwYXJzZUFycmF5KGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnIsZm5PYmo6bn09ZTtpZighQXJyYXkuaXNBcnJheShuKSlyZXR1cm4gdGhpcy5wYXJzZSh7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGZuOm59KTtjb25zdCBhPVtdO2Zvcihjb25zdCBlIG9mIG4pYS5wdXNoKHRoaXMucGFyc2Uoe3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6cixmbjp0LmZldGNoSWZSZWYoZSl9KSk7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyLG4pe2ZvcihsZXQgaT0wLHM9YS5sZW5ndGg7aTxzO2krKylhW2ldKGUsdCxyLG4raSl9fXN0YXRpYyBjb25zdHJ1Y3RTYW1wbGVkKGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnIsZm46bixkaWN0Oml9PWU7ZnVuY3Rpb24gcyhlKXtjb25zdCB0PWUubGVuZ3RoLHI9W107bGV0IG49MDtmb3IobGV0IGE9MDthPHQ7YSs9MilyW24rK109W2VbYV0sZVthKzFdXTtyZXR1cm4gcn1mdW5jdGlvbiBvKGUsdCxyLG4sYSl7cmV0dXJuIG4rKGEtbikvKHItdCkqKGUtdCl9bGV0IGM9bChpLmdldEFycmF5KCJEb21haW4iKSksaD1sKGkuZ2V0QXJyYXkoIlJhbmdlIikpO2lmKCFjfHwhaCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTm8gZG9tYWluIG9yIHJhbmdlIik7Y29uc3QgdT1jLmxlbmd0aC8yLGQ9aC5sZW5ndGgvMjtjPXMoYyksaD1zKGgpO2NvbnN0IGY9bChpLmdldEFycmF5KCJTaXplIikpLGc9aS5nZXQoIkJpdHNQZXJTYW1wbGUiKSxwPWkuZ2V0KCJPcmRlciIpfHwxOzEhPT1wJiYoMCxhLmluZm8pKCJObyBzdXBwb3J0IGZvciBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhdGlvbjogIitwKTtsZXQgbT1sKGkuZ2V0QXJyYXkoIkVuY29kZSIpKTtpZihtKW09cyhtKTtlbHNle209W107Zm9yKGxldCBlPTA7ZTx1OysrZSltLnB1c2goWzAsZltlXS0xXSl9bGV0IGI9bChpLmdldEFycmF5KCJEZWNvZGUiKSk7Yj1iP3MoYik6aDtjb25zdCB5PXRoaXMuZ2V0U2FtcGxlQXJyYXkoZixkLGcsbik7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyLG4pe2NvbnN0IGE9MTw8dSxpPW5ldyBGbG9hdDY0QXJyYXkoYSkscz1uZXcgVWludDMyQXJyYXkoYSk7bGV0IGwsZztmb3IoZz0wO2c8YTtnKyspaVtnXT0xO2xldCBwPWQsdz0xO2ZvcihsPTA7bDx1OysrbCl7Y29uc3Qgcj1jW2xdWzBdLG49Y1tsXVsxXTtsZXQgaD1vKE1hdGgubWluKE1hdGgubWF4KGVbdCtsXSxyKSxuKSxyLG4sbVtsXVswXSxtW2xdWzFdKTtjb25zdCB1PWZbbF07aD1NYXRoLm1pbihNYXRoLm1heChoLDApLHUtMSk7Y29uc3QgZD1oPHUtMT9NYXRoLmZsb29yKGgpOmgtMSxiPWQrMS1oLHk9aC1kLHY9ZCpwLHg9ditwO2ZvcihnPTA7ZzxhO2crKylnJnc/KGlbZ10qPXksc1tnXSs9eCk6KGlbZ10qPWIsc1tnXSs9dik7cCo9dSx3PDw9MX1mb3IoZz0wO2c8ZDsrK2cpe2xldCBlPTA7Zm9yKGw9MDtsPGE7bCsrKWUrPXlbc1tsXStnXSppW2xdO2U9byhlLDAsMSxiW2ddWzBdLGJbZ11bMV0pLHJbbitnXT1NYXRoLm1pbihNYXRoLm1heChlLGhbZ11bMF0pLGhbZ11bMV0pfX19c3RhdGljIGNvbnN0cnVjdEludGVycG9sYXRlZChlKXtsZXR7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGRpY3Q6bn09ZTtjb25zdCBhPWwobi5nZXRBcnJheSgiQzAiKSl8fFswXSxpPWwobi5nZXRBcnJheSgiQzEiKSl8fFsxXSxzPW4uZ2V0KCJOIiksbz1bXTtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDsrK2Upby5wdXNoKGlbZV0tYVtlXSk7Y29uc3QgYz1vLmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSx0LHIsbil7Y29uc3QgaT0xPT09cz9lW3RdOmVbdF0qKnM7Zm9yKGxldCBlPTA7ZTxjOysrZSlyW24rZV09YVtlXStpKm9bZV19fXN0YXRpYyBjb25zdHJ1Y3RTdGljaGVkKGUpe2xldHt4cmVmOnQsaXNFdmFsU3VwcG9ydGVkOnIsZGljdDpufT1lO2NvbnN0IGk9bChuLmdldEFycmF5KCJEb21haW4iKSk7aWYoIWkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiIpO2lmKDEhPWkubGVuZ3RoLzIpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkJhZCBkb21haW4gZm9yIHN0aWNoZWQgZnVuY3Rpb24iKTtjb25zdCBzPVtdO2Zvcihjb25zdCBlIG9mIG4uZ2V0KCJGdW5jdGlvbnMiKSlzLnB1c2godGhpcy5wYXJzZSh7eHJlZjp0LGlzRXZhbFN1cHBvcnRlZDpyLGZuOnQuZmV0Y2hJZlJlZihlKX0pKTtjb25zdCBvPWwobi5nZXRBcnJheSgiQm91bmRzIikpLGM9bChuLmdldEFycmF5KCJFbmNvZGUiKSksaD1uZXcgRmxvYXQzMkFycmF5KDEpO3JldHVybiBmdW5jdGlvbihlLHQscixuKXtjb25zdCBhPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT5yP2U9cjplPHQmJihlPXQpLGV9KGVbdF0saVswXSxpWzFdKSxsPW8ubGVuZ3RoO2xldCB1O2Zvcih1PTA7dTxsJiYhKGE8b1t1XSk7Kyt1KTtsZXQgZD1pWzBdO3U+MCYmKGQ9b1t1LTFdKTtsZXQgZj1pWzFdO3U8by5sZW5ndGgmJihmPW9bdV0pO2NvbnN0IGc9Y1syKnVdLHA9Y1syKnUrMV07aFswXT1kPT09Zj9nOmcrKGEtZCkqKHAtZykvKGYtZCksc1t1XShoLDAscixuKX19c3RhdGljIGNvbnN0cnVjdFBvc3RTY3JpcHQoZSl7bGV0e3hyZWY6dCxpc0V2YWxTdXBwb3J0ZWQ6cixmbjpuLGRpY3Q6aX09ZTtjb25zdCBvPWwoaS5nZXRBcnJheSgiRG9tYWluIikpLGM9bChpLmdldEFycmF5KCJSYW5nZSIpKTtpZighbyl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTm8gZG9tYWluLiIpO2lmKCFjKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJObyByYW5nZS4iKTtjb25zdCBoPW5ldyBzLlBvc3RTY3JpcHRMZXhlcihuKSx1PW5ldyBzLlBvc3RTY3JpcHRQYXJzZXIoaCkucGFyc2UoKTtpZihyJiZhLkZlYXR1cmVUZXN0LmlzRXZhbFN1cHBvcnRlZCl7Y29uc3QgZT0obmV3IEMpLmNvbXBpbGUodSxvLGMpO2lmKGUpcmV0dXJuIG5ldyBGdW5jdGlvbigic3JjIiwic3JjT2Zmc2V0IiwiZGVzdCIsImRlc3RPZmZzZXQiLGUpfSgwLGEuaW5mbykoIlVuYWJsZSB0byBjb21waWxlIFBTIGZ1bmN0aW9uIik7Y29uc3QgZj1jLmxlbmd0aD4+MSxnPW8ubGVuZ3RoPj4xLHA9bmV3IGQodSksbT1PYmplY3QuY3JlYXRlKG51bGwpO2xldCBiPTgxOTI7Y29uc3QgeT1uZXcgRmxvYXQzMkFycmF5KGcpO3JldHVybiBmdW5jdGlvbihlLHQscixuKXtsZXQgYSxpLHM9IiI7Y29uc3Qgbz15O2ZvcihhPTA7YTxnO2ErKylpPWVbdCthXSxvW2FdPWkscys9aSsiXyI7Y29uc3QgbD1tW3NdO2lmKHZvaWQgMCE9PWwpcmV0dXJuIHZvaWQgci5zZXQobCxuKTtjb25zdCBoPW5ldyBGbG9hdDMyQXJyYXkoZiksdT1wLmV4ZWN1dGUobyksZD11Lmxlbmd0aC1mO2ZvcihhPTA7YTxmO2ErKyl7aT11W2QrYV07bGV0IGU9Y1syKmFdO2k8ZT9pPWU6KGU9Y1syKmErMV0saT5lJiYoaT1lKSksaFthXT1pfWI+MCYmKGItLSxtW3NdPWgpLHIuc2V0KGgsbil9fX1jbGFzcyB1e2NvbnN0cnVjdG9yKGUpe3RoaXMuc3RhY2s9ZT9BcnJheS5mcm9tKGUpOltdfXB1c2goZSl7aWYodGhpcy5zdGFjay5sZW5ndGg+PXUuTUFYX1NUQUNLX1NJWkUpdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpO3RoaXMuc3RhY2sucHVzaChlKX1wb3AoKXtpZih0aGlzLnN0YWNrLmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgdW5kZXJmbG93LiIpO3JldHVybiB0aGlzLnN0YWNrLnBvcCgpfWNvcHkoZSl7aWYodGhpcy5zdGFjay5sZW5ndGgrZT49dS5NQVhfU1RBQ0tfU0laRSl0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuIik7Y29uc3QgdD10aGlzLnN0YWNrO2ZvcihsZXQgcj10Lmxlbmd0aC1lLG49ZS0xO24+PTA7bi0tLHIrKyl0LnB1c2godFtyXSl9aW5kZXgoZSl7dGhpcy5wdXNoKHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtZS0xXSl9cm9sbChlLHQpe2NvbnN0IHI9dGhpcy5zdGFjayxuPXIubGVuZ3RoLWUsYT1yLmxlbmd0aC0xLGk9bisodC1NYXRoLmZsb29yKHQvZSkqZSk7Zm9yKGxldCBlPW4sdD1hO2U8dDtlKyssdC0tKXtjb25zdCBuPXJbZV07cltlXT1yW3RdLHJbdF09bn1mb3IobGV0IGU9bix0PWktMTtlPHQ7ZSsrLHQtLSl7Y29uc3Qgbj1yW2VdO3JbZV09clt0XSxyW3RdPW59Zm9yKGxldCBlPWksdD1hO2U8dDtlKyssdC0tKXtjb25zdCBuPXJbZV07cltlXT1yW3RdLHJbdF09bn19fWkodSwiTUFYX1NUQUNLX1NJWkUiLDEwMCk7Y2xhc3MgZHtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wZXJhdG9ycz1lfWV4ZWN1dGUoZSl7Y29uc3QgdD1uZXcgdShlKTtsZXQgcj0wO2NvbnN0IG49dGhpcy5vcGVyYXRvcnMsaT1uLmxlbmd0aDtsZXQgcyxvLGM7Zm9yKDtyPGk7KWlmKHM9bltyKytdLCJudW1iZXIiIT10eXBlb2Ygcylzd2l0Y2gocyl7Y2FzZSJqeiI6Yz10LnBvcCgpLG89dC5wb3AoKSxvfHwocj1jKTticmVhaztjYXNlImoiOm89dC5wb3AoKSxyPW87YnJlYWs7Y2FzZSJhYnMiOm89dC5wb3AoKSx0LnB1c2goTWF0aC5hYnMobykpO2JyZWFrO2Nhc2UiYWRkIjpjPXQucG9wKCksbz10LnBvcCgpLHQucHVzaChvK2MpO2JyZWFrO2Nhc2UiYW5kIjpjPXQucG9wKCksbz10LnBvcCgpLCJib29sZWFuIj09dHlwZW9mIG8mJiJib29sZWFuIj09dHlwZW9mIGM/dC5wdXNoKG8mJmMpOnQucHVzaChvJmMpO2JyZWFrO2Nhc2UiYXRhbiI6Yz10LnBvcCgpLG89dC5wb3AoKSxvPU1hdGguYXRhbjIobyxjKS9NYXRoLlBJKjE4MCxvPDAmJihvKz0zNjApLHQucHVzaChvKTticmVhaztjYXNlImJpdHNoaWZ0IjpjPXQucG9wKCksbz10LnBvcCgpLG8+MD90LnB1c2gobzw8Yyk6dC5wdXNoKG8+PmMpO2JyZWFrO2Nhc2UiY2VpbGluZyI6bz10LnBvcCgpLHQucHVzaChNYXRoLmNlaWwobykpO2JyZWFrO2Nhc2UiY29weSI6bz10LnBvcCgpLHQuY29weShvKTticmVhaztjYXNlImNvcyI6bz10LnBvcCgpLHQucHVzaChNYXRoLmNvcyhvJTM2MC8xODAqTWF0aC5QSSkpO2JyZWFrO2Nhc2UiY3ZpIjpvPTB8dC5wb3AoKSx0LnB1c2gobyk7YnJlYWs7Y2FzZSJjdnIiOmJyZWFrO2Nhc2UiZGl2IjpjPXQucG9wKCksbz10LnBvcCgpLHQucHVzaChvL2MpO2JyZWFrO2Nhc2UiZHVwIjp0LmNvcHkoMSk7YnJlYWs7Y2FzZSJlcSI6Yz10LnBvcCgpLG89dC5wb3AoKSx0LnB1c2gobz09PWMpO2JyZWFrO2Nhc2UiZXhjaCI6dC5yb2xsKDIsMSk7YnJlYWs7Y2FzZSJleHAiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG8qKmMpO2JyZWFrO2Nhc2UiZmFsc2UiOnQucHVzaCghMSk7YnJlYWs7Y2FzZSJmbG9vciI6bz10LnBvcCgpLHQucHVzaChNYXRoLmZsb29yKG8pKTticmVhaztjYXNlImdlIjpjPXQucG9wKCksbz10LnBvcCgpLHQucHVzaChvPj1jKTticmVhaztjYXNlImd0IjpjPXQucG9wKCksbz10LnBvcCgpLHQucHVzaChvPmMpO2JyZWFrO2Nhc2UiaWRpdiI6Yz10LnBvcCgpLG89dC5wb3AoKSx0LnB1c2goby9jfDApO2JyZWFrO2Nhc2UiaW5kZXgiOm89dC5wb3AoKSx0LmluZGV4KG8pO2JyZWFrO2Nhc2UibGUiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG88PWMpO2JyZWFrO2Nhc2UibG4iOm89dC5wb3AoKSx0LnB1c2goTWF0aC5sb2cobykpO2JyZWFrO2Nhc2UibG9nIjpvPXQucG9wKCksdC5wdXNoKE1hdGgubG9nMTAobykpO2JyZWFrO2Nhc2UibHQiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG88Yyk7YnJlYWs7Y2FzZSJtb2QiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG8lYyk7YnJlYWs7Y2FzZSJtdWwiOmM9dC5wb3AoKSxvPXQucG9wKCksdC5wdXNoKG8qYyk7YnJlYWs7Y2FzZSJuZSI6Yz10LnBvcCgpLG89dC5wb3AoKSx0LnB1c2gobyE9PWMpO2JyZWFrO2Nhc2UibmVnIjpvPXQucG9wKCksdC5wdXNoKC1vKTticmVhaztjYXNlIm5vdCI6bz10LnBvcCgpLCJib29sZWFuIj09dHlwZW9mIG8/dC5wdXNoKCFvKTp0LnB1c2gofm8pO2JyZWFrO2Nhc2Uib3IiOmM9dC5wb3AoKSxvPXQucG9wKCksImJvb2xlYW4iPT10eXBlb2YgbyYmImJvb2xlYW4iPT10eXBlb2YgYz90LnB1c2gob3x8Yyk6dC5wdXNoKG98Yyk7YnJlYWs7Y2FzZSJwb3AiOnQucG9wKCk7YnJlYWs7Y2FzZSJyb2xsIjpjPXQucG9wKCksbz10LnBvcCgpLHQucm9sbChvLGMpO2JyZWFrO2Nhc2Uicm91bmQiOm89dC5wb3AoKSx0LnB1c2goTWF0aC5yb3VuZChvKSk7YnJlYWs7Y2FzZSJzaW4iOm89dC5wb3AoKSx0LnB1c2goTWF0aC5zaW4obyUzNjAvMTgwKk1hdGguUEkpKTticmVhaztjYXNlInNxcnQiOm89dC5wb3AoKSx0LnB1c2goTWF0aC5zcXJ0KG8pKTticmVhaztjYXNlInN1YiI6Yz10LnBvcCgpLG89dC5wb3AoKSx0LnB1c2goby1jKTticmVhaztjYXNlInRydWUiOnQucHVzaCghMCk7YnJlYWs7Y2FzZSJ0cnVuY2F0ZSI6bz10LnBvcCgpLG89bzwwP01hdGguY2VpbChvKTpNYXRoLmZsb29yKG8pLHQucHVzaChvKTticmVhaztjYXNlInhvciI6Yz10LnBvcCgpLG89dC5wb3AoKSwiYm9vbGVhbiI9PXR5cGVvZiBvJiYiYm9vbGVhbiI9PXR5cGVvZiBjP3QucHVzaChvIT09Yyk6dC5wdXNoKG9eYyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVW5rbm93biBvcGVyYXRvciAiLmNvbmNhdChzKSl9ZWxzZSB0LnB1c2gocyk7cmV0dXJuIHQuc3RhY2t9fXQuUG9zdFNjcmlwdEV2YWx1YXRvcj1kO2NsYXNzIGZ7Y29uc3RydWN0b3IoZSl7dGhpcy50eXBlPWV9dmlzaXQoZSl7KDAsYS51bnJlYWNoYWJsZSkoImFic3RyYWN0IG1ldGhvZCIpfX1jbGFzcyBnIGV4dGVuZHMgZntjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoImFyZ3MiKSx0aGlzLmluZGV4PWUsdGhpcy5taW49dCx0aGlzLm1heD1yfXZpc2l0KGUpe2UudmlzaXRBcmd1bWVudCh0aGlzKX19Y2xhc3MgcCBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSl7c3VwZXIoImxpdGVyYWwiKSx0aGlzLm51bWJlcj1lLHRoaXMubWluPWUsdGhpcy5tYXg9ZX12aXNpdChlKXtlLnZpc2l0TGl0ZXJhbCh0aGlzKX19Y2xhc3MgbSBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSx0LHIsbixhKXtzdXBlcigiYmluYXJ5IiksdGhpcy5vcD1lLHRoaXMuYXJnMT10LHRoaXMuYXJnMj1yLHRoaXMubWluPW4sdGhpcy5tYXg9YX12aXNpdChlKXtlLnZpc2l0QmluYXJ5T3BlcmF0aW9uKHRoaXMpfX1jbGFzcyBiIGV4dGVuZHMgZntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCJtYXgiKSx0aGlzLmFyZz1lLHRoaXMubWluPWUubWluLHRoaXMubWF4PXR9dmlzaXQoZSl7ZS52aXNpdE1pbih0aGlzKX19Y2xhc3MgeSBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSx0LHIpe3N1cGVyKCJ2YXIiKSx0aGlzLmluZGV4PWUsdGhpcy5taW49dCx0aGlzLm1heD1yfXZpc2l0KGUpe2UudmlzaXRWYXJpYWJsZSh0aGlzKX19Y2xhc3MgdyBleHRlbmRzIGZ7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigiZGVmaW5pdGlvbiIpLHRoaXMudmFyaWFibGU9ZSx0aGlzLmFyZz10fXZpc2l0KGUpe2UudmlzaXRWYXJpYWJsZURlZmluaXRpb24odGhpcyl9fWNsYXNzIHZ7Y29uc3RydWN0b3IoKXt0aGlzLnBhcnRzPVtdfXZpc2l0QXJndW1lbnQoZSl7dGhpcy5wYXJ0cy5wdXNoKCJNYXRoLm1heCgiLGUubWluLCIsIE1hdGgubWluKCIsZS5tYXgsIiwgc3JjW3NyY09mZnNldCArICIsZS5pbmRleCwiXSkpIil9dmlzaXRWYXJpYWJsZShlKXt0aGlzLnBhcnRzLnB1c2goInYiLGUuaW5kZXgpfXZpc2l0TGl0ZXJhbChlKXt0aGlzLnBhcnRzLnB1c2goZS5udW1iZXIpfXZpc2l0QmluYXJ5T3BlcmF0aW9uKGUpe3RoaXMucGFydHMucHVzaCgiKCIpLGUuYXJnMS52aXNpdCh0aGlzKSx0aGlzLnBhcnRzLnB1c2goIiAiLGUub3AsIiAiKSxlLmFyZzIudmlzaXQodGhpcyksdGhpcy5wYXJ0cy5wdXNoKCIpIil9dmlzaXRWYXJpYWJsZURlZmluaXRpb24oZSl7dGhpcy5wYXJ0cy5wdXNoKCJ2YXIgIiksZS52YXJpYWJsZS52aXNpdCh0aGlzKSx0aGlzLnBhcnRzLnB1c2goIiA9ICIpLGUuYXJnLnZpc2l0KHRoaXMpLHRoaXMucGFydHMucHVzaCgiOyIpfXZpc2l0TWluKGUpe3RoaXMucGFydHMucHVzaCgiTWF0aC5taW4oIiksZS5hcmcudmlzaXQodGhpcyksdGhpcy5wYXJ0cy5wdXNoKCIsICIsZS5tYXgsIikiKX10b1N0cmluZygpe3JldHVybiB0aGlzLnBhcnRzLmpvaW4oIiIpfX1mdW5jdGlvbiB4KGUsdCl7cmV0dXJuImxpdGVyYWwiPT09dC50eXBlJiYwPT09dC5udW1iZXI/ZToibGl0ZXJhbCI9PT1lLnR5cGUmJjA9PT1lLm51bWJlcj90OiJsaXRlcmFsIj09PXQudHlwZSYmImxpdGVyYWwiPT09ZS50eXBlP25ldyBwKGUubnVtYmVyK3QubnVtYmVyKTpuZXcgbSgiKyIsZSx0LGUubWluK3QubWluLGUubWF4K3QubWF4KX1mdW5jdGlvbiBTKGUsdCl7aWYoImxpdGVyYWwiPT09dC50eXBlKXtpZigwPT09dC5udW1iZXIpcmV0dXJuIG5ldyBwKDApO2lmKDE9PT10Lm51bWJlcilyZXR1cm4gZTtpZigibGl0ZXJhbCI9PT1lLnR5cGUpcmV0dXJuIG5ldyBwKGUubnVtYmVyKnQubnVtYmVyKX1pZigibGl0ZXJhbCI9PT1lLnR5cGUpe2lmKDA9PT1lLm51bWJlcilyZXR1cm4gbmV3IHAoMCk7aWYoMT09PWUubnVtYmVyKXJldHVybiB0fWNvbnN0IHI9TWF0aC5taW4oZS5taW4qdC5taW4sZS5taW4qdC5tYXgsZS5tYXgqdC5taW4sZS5tYXgqdC5tYXgpLG49TWF0aC5tYXgoZS5taW4qdC5taW4sZS5taW4qdC5tYXgsZS5tYXgqdC5taW4sZS5tYXgqdC5tYXgpO3JldHVybiBuZXcgbSgiKiIsZSx0LHIsbil9ZnVuY3Rpb24gQShlLHQpe2lmKCJsaXRlcmFsIj09PXQudHlwZSl7aWYoMD09PXQubnVtYmVyKXJldHVybiBlO2lmKCJsaXRlcmFsIj09PWUudHlwZSlyZXR1cm4gbmV3IHAoZS5udW1iZXItdC5udW1iZXIpfXJldHVybiJiaW5hcnkiPT09dC50eXBlJiYiLSI9PT10Lm9wJiYibGl0ZXJhbCI9PT1lLnR5cGUmJjE9PT1lLm51bWJlciYmImxpdGVyYWwiPT09dC5hcmcxLnR5cGUmJjE9PT10LmFyZzEubnVtYmVyP3QuYXJnMjpuZXcgbSgiLSIsZSx0LGUubWluLXQubWF4LGUubWF4LXQubWluKX1mdW5jdGlvbiBrKGUsdCl7cmV0dXJuIGUubWluPj10P25ldyBwKHQpOmUubWF4PD10P2U6bmV3IGIoZSx0KX1jbGFzcyBDe2NvbXBpbGUoZSx0LHIpe2NvbnN0IG49W10sYT1bXSxpPXQubGVuZ3RoPj4xLHM9ci5sZW5ndGg+PjE7bGV0IG8sYyxsLGgsdSxkLGYsbSxiPTA7Zm9yKGxldCBlPTA7ZTxpO2UrKyluLnB1c2gobmV3IGcoZSx0WzIqZV0sdFsyKmUrMV0pKTtmb3IobGV0IHQ9MCxyPWUubGVuZ3RoO3Q8cjt0KyspaWYobT1lW3RdLCJudW1iZXIiIT10eXBlb2YgbSlzd2l0Y2gobSl7Y2FzZSJhZGQiOmlmKG4ubGVuZ3RoPDIpcmV0dXJuIG51bGw7aD1uLnBvcCgpLGw9bi5wb3AoKSxuLnB1c2goeChsLGgpKTticmVhaztjYXNlImN2ciI6aWYobi5sZW5ndGg8MSlyZXR1cm4gbnVsbDticmVhaztjYXNlIm11bCI6aWYobi5sZW5ndGg8MilyZXR1cm4gbnVsbDtoPW4ucG9wKCksbD1uLnBvcCgpLG4ucHVzaChTKGwsaCkpO2JyZWFrO2Nhc2Uic3ViIjppZihuLmxlbmd0aDwyKXJldHVybiBudWxsO2g9bi5wb3AoKSxsPW4ucG9wKCksbi5wdXNoKEEobCxoKSk7YnJlYWs7Y2FzZSJleGNoIjppZihuLmxlbmd0aDwyKXJldHVybiBudWxsO3U9bi5wb3AoKSxkPW4ucG9wKCksbi5wdXNoKHUsZCk7YnJlYWs7Y2FzZSJwb3AiOmlmKG4ubGVuZ3RoPDEpcmV0dXJuIG51bGw7bi5wb3AoKTticmVhaztjYXNlImluZGV4IjppZihuLmxlbmd0aDwxKXJldHVybiBudWxsO2lmKGw9bi5wb3AoKSwibGl0ZXJhbCIhPT1sLnR5cGUpcmV0dXJuIG51bGw7aWYobz1sLm51bWJlcixvPDB8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pfHxuLmxlbmd0aDxvKXJldHVybiBudWxsO2lmKHU9bltuLmxlbmd0aC1vLTFdLCJsaXRlcmFsIj09PXUudHlwZXx8InZhciI9PT11LnR5cGUpe24ucHVzaCh1KTticmVha31mPW5ldyB5KGIrKyx1Lm1pbix1Lm1heCksbltuLmxlbmd0aC1vLTFdPWYsbi5wdXNoKGYpLGEucHVzaChuZXcgdyhmLHUpKTticmVhaztjYXNlImR1cCI6aWYobi5sZW5ndGg8MSlyZXR1cm4gbnVsbDtpZigibnVtYmVyIj09dHlwZW9mIGVbdCsxXSYmImd0Ij09PWVbdCsyXSYmZVt0KzNdPT09dCs3JiYianoiPT09ZVt0KzRdJiYicG9wIj09PWVbdCs1XSYmZVt0KzZdPT09ZVt0KzFdKXtsPW4ucG9wKCksbi5wdXNoKGsobCxlW3QrMV0pKSx0Kz02O2JyZWFrfWlmKHU9bi5hdCgtMSksImxpdGVyYWwiPT09dS50eXBlfHwidmFyIj09PXUudHlwZSl7bi5wdXNoKHUpO2JyZWFrfWY9bmV3IHkoYisrLHUubWluLHUubWF4KSxuW24ubGVuZ3RoLTFdPWYsbi5wdXNoKGYpLGEucHVzaChuZXcgdyhmLHUpKTticmVhaztjYXNlInJvbGwiOmlmKG4ubGVuZ3RoPDIpcmV0dXJuIG51bGw7aWYoaD1uLnBvcCgpLGw9bi5wb3AoKSwibGl0ZXJhbCIhPT1oLnR5cGV8fCJsaXRlcmFsIiE9PWwudHlwZSlyZXR1cm4gbnVsbDtpZihjPWgubnVtYmVyLG89bC5udW1iZXIsbzw9MHx8IU51bWJlci5pc0ludGVnZXIobyl8fCFOdW1iZXIuaXNJbnRlZ2VyKGMpfHxuLmxlbmd0aDxvKXJldHVybiBudWxsO2lmKGM9KGMlbytvKSVvLDA9PT1jKWJyZWFrO24ucHVzaCguLi5uLnNwbGljZShuLmxlbmd0aC1vLG8tYykpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIG51bGx9ZWxzZSBuLnB1c2gobmV3IHAobSkpO2lmKG4ubGVuZ3RoIT09cylyZXR1cm4gbnVsbDtjb25zdCBDPVtdO2Zvcihjb25zdCBlIG9mIGEpe2NvbnN0IHQ9bmV3IHY7ZS52aXNpdCh0KSxDLnB1c2godC50b1N0cmluZygpKX1mb3IobGV0IGU9MCx0PW4ubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHQ9bltlXSxhPW5ldyB2O3QudmlzaXQoYSk7Y29uc3QgaT1yWzIqZV0scz1yWzIqZSsxXSxvPVthLnRvU3RyaW5nKCldO2k+dC5taW4mJihvLnVuc2hpZnQoIk1hdGgubWF4KCIsaSwiLCAiKSxvLnB1c2goIikiKSksczx0Lm1heCYmKG8udW5zaGlmdCgiTWF0aC5taW4oIixzLCIsICIpLG8ucHVzaCgiKSIpKSxvLnVuc2hpZnQoImRlc3RbZGVzdE9mZnNldCArICIsZSwiXSA9ICIpLG8ucHVzaCgiOyIpLEMucHVzaChvLmpvaW4oIiIpKX1yZXR1cm4gQy5qb2luKCJcbiIpfX10LlBvc3RTY3JpcHRDb21waWxlcj1DfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuUG9zdFNjcmlwdFBhcnNlcj10LlBvc3RTY3JpcHRMZXhlcj12b2lkIDAscigxMzkpO3ZhciBuPXIoMTQ0KSxhPXIoMTUwKSxpPXIoMTQ5KTt0LlBvc3RTY3JpcHRQYXJzZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5sZXhlcj1lLHRoaXMub3BlcmF0b3JzPVtdLHRoaXMudG9rZW49bnVsbCx0aGlzLnByZXY9bnVsbH1uZXh0VG9rZW4oKXt0aGlzLnByZXY9dGhpcy50b2tlbix0aGlzLnRva2VuPXRoaXMubGV4ZXIuZ2V0VG9rZW4oKX1hY2NlcHQoZSl7cmV0dXJuIHRoaXMudG9rZW4udHlwZT09PWUmJih0aGlzLm5leHRUb2tlbigpLCEwKX1leHBlY3QoZSl7aWYodGhpcy5hY2NlcHQoZSkpcmV0dXJuITA7dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVuZXhwZWN0ZWQgc3ltYm9sOiBmb3VuZCAiLmNvbmNhdCh0aGlzLnRva2VuLnR5cGUsIiBleHBlY3RlZCAiKS5jb25jYXQoZSwiLiIpKX1wYXJzZSgpe3JldHVybiB0aGlzLm5leHRUb2tlbigpLHRoaXMuZXhwZWN0KHMuTEJSQUNFKSx0aGlzLnBhcnNlQmxvY2soKSx0aGlzLmV4cGVjdChzLlJCUkFDRSksdGhpcy5vcGVyYXRvcnN9cGFyc2VCbG9jaygpe2Zvcig7OylpZih0aGlzLmFjY2VwdChzLk5VTUJFUikpdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpO2Vsc2UgaWYodGhpcy5hY2NlcHQocy5PUEVSQVRPUikpdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpO2Vsc2V7aWYoIXRoaXMuYWNjZXB0KHMuTEJSQUNFKSlyZXR1cm47dGhpcy5wYXJzZUNvbmRpdGlvbigpfX1wYXJzZUNvbmRpdGlvbigpe2NvbnN0IGU9dGhpcy5vcGVyYXRvcnMubGVuZ3RoO2lmKHRoaXMub3BlcmF0b3JzLnB1c2gobnVsbCxudWxsKSx0aGlzLnBhcnNlQmxvY2soKSx0aGlzLmV4cGVjdChzLlJCUkFDRSksdGhpcy5hY2NlcHQocy5JRikpdGhpcy5vcGVyYXRvcnNbZV09dGhpcy5vcGVyYXRvcnMubGVuZ3RoLHRoaXMub3BlcmF0b3JzW2UrMV09Imp6IjtlbHNle2lmKCF0aGlzLmFjY2VwdChzLkxCUkFDRSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlBTIEZ1bmN0aW9uOiBlcnJvciBwYXJzaW5nIGNvbmRpdGlvbmFsLiIpO3tjb25zdCB0PXRoaXMub3BlcmF0b3JzLmxlbmd0aDt0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsbnVsbCk7Y29uc3Qgcj10aGlzLm9wZXJhdG9ycy5sZW5ndGg7dGhpcy5wYXJzZUJsb2NrKCksdGhpcy5leHBlY3Qocy5SQlJBQ0UpLHRoaXMuZXhwZWN0KHMuSUZFTFNFKSx0aGlzLm9wZXJhdG9yc1t0XT10aGlzLm9wZXJhdG9ycy5sZW5ndGgsdGhpcy5vcGVyYXRvcnNbdCsxXT0iaiIsdGhpcy5vcGVyYXRvcnNbZV09cix0aGlzLm9wZXJhdG9yc1tlKzFdPSJqeiJ9fX19O2NvbnN0IHM9e0xCUkFDRTowLFJCUkFDRToxLE5VTUJFUjoyLE9QRVJBVE9SOjMsSUY6NCxJRkVMU0U6NX07Y2xhc3Mgb3tzdGF0aWMgZ2V0IG9wQ2FjaGUoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywib3BDYWNoZSIsT2JqZWN0LmNyZWF0ZShudWxsKSl9Y29uc3RydWN0b3IoZSx0KXt0aGlzLnR5cGU9ZSx0aGlzLnZhbHVlPXR9c3RhdGljIGdldE9wZXJhdG9yKGUpe3ZhciB0O3JldHVybih0PW8ub3BDYWNoZSlbZV18fCh0W2VdPW5ldyBvKHMuT1BFUkFUT1IsZSkpfXN0YXRpYyBnZXQgTEJSQUNFKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIkxCUkFDRSIsbmV3IG8ocy5MQlJBQ0UsInsiKSl9c3RhdGljIGdldCBSQlJBQ0UoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiUkJSQUNFIixuZXcgbyhzLlJCUkFDRSwifSIpKX1zdGF0aWMgZ2V0IElGKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIklGIixuZXcgbyhzLklGLCJJRiIpKX1zdGF0aWMgZ2V0IElGRUxTRSgpe3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJJRkVMU0UiLG5ldyBvKHMuSUZFTFNFLCJJRkVMU0UiKSl9fXQuUG9zdFNjcmlwdExleGVyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuc3RyZWFtPWUsdGhpcy5uZXh0Q2hhcigpLHRoaXMuc3RyQnVmPVtdfW5leHRDaGFyKCl7cmV0dXJuIHRoaXMuY3VycmVudENoYXI9dGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpfWdldFRva2VuKCl7bGV0IGU9ITEsdD10aGlzLmN1cnJlbnRDaGFyO2Zvcig7Oyl7aWYodDwwKXJldHVybiBhLkVPRjtpZihlKTEwIT09dCYmMTMhPT10fHwoZT0hMSk7ZWxzZSBpZigzNz09PXQpZT0hMDtlbHNlIGlmKCEoMCxpLmlzV2hpdGVTcGFjZSkodCkpYnJlYWs7dD10aGlzLm5leHRDaGFyKCl9c3dpdGNoKDB8dCl7Y2FzZSA0ODpjYXNlIDQ5OmNhc2UgNTA6Y2FzZSA1MTpjYXNlIDUyOmNhc2UgNTM6Y2FzZSA1NDpjYXNlIDU1OmNhc2UgNTY6Y2FzZSA1NzpjYXNlIDQzOmNhc2UgNDU6Y2FzZSA0NjpyZXR1cm4gbmV3IG8ocy5OVU1CRVIsdGhpcy5nZXROdW1iZXIoKSk7Y2FzZSAxMjM6cmV0dXJuIHRoaXMubmV4dENoYXIoKSxvLkxCUkFDRTtjYXNlIDEyNTpyZXR1cm4gdGhpcy5uZXh0Q2hhcigpLG8uUkJSQUNFfWNvbnN0IHI9dGhpcy5zdHJCdWY7Zm9yKHIubGVuZ3RoPTAsclswXT1TdHJpbmcuZnJvbUNoYXJDb2RlKHQpOyh0PXRoaXMubmV4dENoYXIoKSk+PTAmJih0Pj02NSYmdDw9OTB8fHQ+PTk3JiZ0PD0xMjIpOylyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh0KSk7Y29uc3Qgbj1yLmpvaW4oIiIpO3N3aXRjaChuLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaWYiOnJldHVybiBvLklGO2Nhc2UiaWZlbHNlIjpyZXR1cm4gby5JRkVMU0U7ZGVmYXVsdDpyZXR1cm4gby5nZXRPcGVyYXRvcihuKX19Z2V0TnVtYmVyKCl7bGV0IGU9dGhpcy5jdXJyZW50Q2hhcjtjb25zdCB0PXRoaXMuc3RyQnVmO2Zvcih0Lmxlbmd0aD0wLHRbMF09U3RyaW5nLmZyb21DaGFyQ29kZShlKTsoZT10aGlzLm5leHRDaGFyKCkpPj0wJiYoZT49NDgmJmU8PTU3fHw0NT09PWV8fDQ2PT09ZSk7KXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTtjb25zdCByPXBhcnNlRmxvYXQodC5qb2luKCIiKSk7aWYoaXNOYU4ocikpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyOiAiLmNvbmNhdChyKSk7cmV0dXJuIHJ9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlJlZ2lvbmFsSW1hZ2VDYWNoZT10LkxvY2FsVGlsaW5nUGF0dGVybkNhY2hlPXQuTG9jYWxJbWFnZUNhY2hlPXQuTG9jYWxHU3RhdGVDYWNoZT10LkxvY2FsRnVuY3Rpb25DYWNoZT10LkxvY2FsQ29sb3JTcGFjZUNhY2hlPXQuR2xvYmFsSW1hZ2VDYWNoZT12b2lkIDAscigyKSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIG49cigxNDQpLGE9cigxNTApO2NsYXNzIHN7Y29uc3RydWN0b3IoZSl7dGhpcy5jb25zdHJ1Y3Rvcj09PXMmJigwLG4udW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlTG9jYWxDYWNoZS4iKSx0aGlzLl9vbmx5UmVmcz0hMD09PShudWxsPT1lP3ZvaWQgMDplLm9ubHlSZWZzKSx0aGlzLl9vbmx5UmVmc3x8KHRoaXMuX25hbWVSZWZNYXA9bmV3IE1hcCx0aGlzLl9pbWFnZU1hcD1uZXcgTWFwKSx0aGlzLl9pbWFnZUNhY2hlPW5ldyBhLlJlZlNldENhY2hlfWdldEJ5TmFtZShlKXt0aGlzLl9vbmx5UmVmcyYmKDAsbi51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBgZ2V0QnlOYW1lYCBtZXRob2QuIik7Y29uc3QgdD10aGlzLl9uYW1lUmVmTWFwLmdldChlKTtyZXR1cm4gdD90aGlzLmdldEJ5UmVmKHQpOnRoaXMuX2ltYWdlTWFwLmdldChlKXx8bnVsbH1nZXRCeVJlZihlKXtyZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQoZSl8fG51bGx9c2V0KGUsdCxyKXsoMCxuLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBzZXRgIGNhbGxlZC4iKX19dC5Mb2NhbEltYWdlQ2FjaGU9Y2xhc3MgZXh0ZW5kcyBze3NldChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbCxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsSW1hZ2VDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7aWYodCl7aWYodGhpcy5faW1hZ2VDYWNoZS5oYXModCkpcmV0dXJuO3RoaXMuX25hbWVSZWZNYXAuc2V0KGUsdCksdGhpcy5faW1hZ2VDYWNoZS5wdXQodCxyKX1lbHNlIHRoaXMuX2ltYWdlTWFwLmhhcyhlKXx8dGhpcy5faW1hZ2VNYXAuc2V0KGUscil9fSx0LkxvY2FsQ29sb3JTcGFjZUNhY2hlPWNsYXNzIGV4dGVuZHMgc3tzZXQoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbCx0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLHI9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoInN0cmluZyIhPXR5cGVvZiBlJiYhdCl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhbmQvb3IgInJlZiIgYXJndW1lbnQuJyk7aWYodCl7aWYodGhpcy5faW1hZ2VDYWNoZS5oYXModCkpcmV0dXJuO251bGwhPT1lJiZ0aGlzLl9uYW1lUmVmTWFwLnNldChlLHQpLHRoaXMuX2ltYWdlQ2FjaGUucHV0KHQscil9ZWxzZSB0aGlzLl9pbWFnZU1hcC5oYXMoZSl8fHRoaXMuX2ltYWdlTWFwLnNldChlLHIpfX0sdC5Mb2NhbEZ1bmN0aW9uQ2FjaGU9Y2xhc3MgZXh0ZW5kcyBze2NvbnN0cnVjdG9yKGUpe3N1cGVyKHtvbmx5UmVmczohMH0pfXNldCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHQ9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCdMb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7dGhpcy5faW1hZ2VDYWNoZS5oYXMoZSl8fHRoaXMuX2ltYWdlQ2FjaGUucHV0KGUsdCl9fSx0LkxvY2FsR1N0YXRlQ2FjaGU9Y2xhc3MgZXh0ZW5kcyBze3NldChlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbCxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwO2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsR1N0YXRlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFyZ3VtZW50LicpO2lmKHQpe2lmKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHQpKXJldHVybjt0aGlzLl9uYW1lUmVmTWFwLnNldChlLHQpLHRoaXMuX2ltYWdlQ2FjaGUucHV0KHQscil9ZWxzZSB0aGlzLl9pbWFnZU1hcC5oYXMoZSl8fHRoaXMuX2ltYWdlTWFwLnNldChlLHIpfX0sdC5Mb2NhbFRpbGluZ1BhdHRlcm5DYWNoZT1jbGFzcyBleHRlbmRzIHN7Y29uc3RydWN0b3IoZSl7c3VwZXIoe29ubHlSZWZzOiEwfSl9c2V0KCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsdD1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZighZSl0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsVGlsaW5nUGF0dGVybkNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpO3RoaXMuX2ltYWdlQ2FjaGUuaGFzKGUpfHx0aGlzLl9pbWFnZUNhY2hlLnB1dChlLHQpfX0sdC5SZWdpb25hbEltYWdlQ2FjaGU9Y2xhc3MgZXh0ZW5kcyBze2NvbnN0cnVjdG9yKGUpe3N1cGVyKHtvbmx5UmVmczohMH0pfXNldCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHQ9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCdSZWdpb25hbEltYWdlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7dGhpcy5faW1hZ2VDYWNoZS5oYXMoZSl8fHRoaXMuX2ltYWdlQ2FjaGUucHV0KGUsdCl9fTtjbGFzcyBve2NvbnN0cnVjdG9yKCl7dGhpcy5fcmVmQ2FjaGU9bmV3IGEuUmVmU2V0Q2FjaGUsdGhpcy5faW1hZ2VDYWNoZT1uZXcgYS5SZWZTZXRDYWNoZX1nZXQgX2J5dGVTaXplKCl7bGV0IGU9MDtmb3IoY29uc3QgdCBvZiB0aGlzLl9pbWFnZUNhY2hlKWUrPXQuYnl0ZVNpemU7cmV0dXJuIGV9Z2V0IF9jYWNoZUxpbWl0UmVhY2hlZCgpe3JldHVybiEodGhpcy5faW1hZ2VDYWNoZS5zaXplPG8uTUlOX0lNQUdFU19UT19DQUNIRXx8dGhpcy5fYnl0ZVNpemU8by5NQVhfQllURV9TSVpFKX1zaG91bGRDYWNoZShlLHQpe2xldCByPXRoaXMuX3JlZkNhY2hlLmdldChlKTtyZXR1cm4gcnx8KHI9bmV3IFNldCx0aGlzLl9yZWZDYWNoZS5wdXQoZSxyKSksci5hZGQodCksIShyLnNpemU8by5OVU1fUEFHRVNfVEhSRVNIT0xEfHwhdGhpcy5faW1hZ2VDYWNoZS5oYXMoZSkmJnRoaXMuX2NhY2hlTGltaXRSZWFjaGVkKX1hZGRCeXRlU2l6ZShlLHQpe2NvbnN0IHI9dGhpcy5faW1hZ2VDYWNoZS5nZXQoZSk7ciYmKHIuYnl0ZVNpemV8fChyLmJ5dGVTaXplPXQpKX1nZXREYXRhKGUsdCl7Y29uc3Qgcj10aGlzLl9yZWZDYWNoZS5nZXQoZSk7aWYoIXIpcmV0dXJuIG51bGw7aWYoci5zaXplPG8uTlVNX1BBR0VTX1RIUkVTSE9MRClyZXR1cm4gbnVsbDtjb25zdCBuPXRoaXMuX2ltYWdlQ2FjaGUuZ2V0KGUpO3JldHVybiBuPyhyLmFkZCh0KSxuKTpudWxsfXNldERhdGEoZSx0KXtpZighdGhpcy5fcmVmQ2FjaGUuaGFzKGUpKXRocm93IG5ldyBFcnJvcignR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gZXhwZWN0ZWQgInNob3VsZENhY2hlIiB0byBoYXZlIGJlZW4gY2FsbGVkLicpO3RoaXMuX2ltYWdlQ2FjaGUuaGFzKGUpfHwodGhpcy5fY2FjaGVMaW1pdFJlYWNoZWQ/KDAsbi53YXJuKSgiR2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhIC0gY2FjaGUgbGltaXQgcmVhY2hlZC4iKTp0aGlzLl9pbWFnZUNhY2hlLnB1dChlLHQpKX1jbGVhcigpe2FyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF18fHRoaXMuX3JlZkNhY2hlLmNsZWFyKCksdGhpcy5faW1hZ2VDYWNoZS5jbGVhcigpfX1pKG8sIk5VTV9QQUdFU19USFJFU0hPTEQiLDIpLGkobywiTUlOX0lNQUdFU19UT19DQUNIRSIsMTApLGkobywiTUFYX0JZVEVfU0laRSIsNSpuLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFKSx0Lkdsb2JhbEltYWdlQ2FjaGU9b30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmJpZGk9ZnVuY3Rpb24oZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOi0xLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxnPSEwO2NvbnN0IHA9ZS5sZW5ndGg7aWYoMD09PXB8fHIpcmV0dXJuIHUoZSxnLHIpO2QubGVuZ3RoPXAsZi5sZW5ndGg9cDtsZXQgbSxiLHk9MDtmb3IobT0wO208cDsrK20pe2RbbV09ZS5jaGFyQXQobSk7Y29uc3QgdD1lLmNoYXJDb2RlQXQobSk7bGV0IHI9IkwiO3Q8PTI1NT9yPWFbdF06MTQyNDw9dCYmdDw9MTUyND9yPSJSIjoxNTM2PD10JiZ0PD0xNzkxPyhyPWlbMjU1JnRdLHJ8fCgwLG4ud2FybikoIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgIit0LnRvU3RyaW5nKDE2KSkpOigxNzkyPD10JiZ0PD0yMjIwfHw2NDMzNjw9dCYmdDw9NjUwMjN8fDY1MTM2PD10JiZ0PD02NTI3OSkmJihyPSJBTCIpLCJSIiE9PXImJiJBTCIhPT1yJiYiQU4iIT09cnx8eSsrLGZbbV09cn1pZigwPT09eSlyZXR1cm4gZz0hMCx1KGUsZyk7LTE9PT10JiYoeS9wPC4zJiZwPjQ/KGc9ITAsdD0wKTooZz0hMSx0PTEpKTtjb25zdCB3PVtdO2ZvcihtPTA7bTxwOysrbSl3W21dPXQ7Y29uc3Qgdj1zKHQpPyJSIjoiTCIseD12LFM9eDtsZXQgQSxrPXg7Zm9yKG09MDttPHA7KyttKSJOU00iPT09ZlttXT9mW21dPWs6az1mW21dO2ZvcihrPXgsbT0wO208cDsrK20pQT1mW21dLCJFTiI9PT1BP2ZbbV09IkFMIj09PWs/IkFOIjoiRU4iOiJSIiE9PUEmJiJMIiE9PUEmJiJBTCIhPT1BfHwoaz1BKTtmb3IobT0wO208cDsrK20pQT1mW21dLCJBTCI9PT1BJiYoZlttXT0iUiIpO2ZvcihtPTE7bTxwLTE7KyttKSJFUyI9PT1mW21dJiYiRU4iPT09ZlttLTFdJiYiRU4iPT09ZlttKzFdJiYoZlttXT0iRU4iKSwiQ1MiIT09ZlttXXx8IkVOIiE9PWZbbS0xXSYmIkFOIiE9PWZbbS0xXXx8ZlttKzFdIT09ZlttLTFdfHwoZlttXT1mW20tMV0pO2ZvcihtPTA7bTxwOysrbSlpZigiRU4iPT09ZlttXSl7Zm9yKGxldCBlPW0tMTtlPj0wJiYiRVQiPT09ZltlXTstLWUpZltlXT0iRU4iO2ZvcihsZXQgZT1tKzE7ZTxwJiYiRVQiPT09ZltlXTsrK2UpZltlXT0iRU4ifWZvcihtPTA7bTxwOysrbSlBPWZbbV0sIldTIiE9PUEmJiJFUyIhPT1BJiYiRVQiIT09QSYmIkNTIiE9PUF8fChmW21dPSJPTiIpO2ZvcihrPXgsbT0wO208cDsrK20pQT1mW21dLCJFTiI9PT1BP2ZbbV09IkwiPT09az8iTCI6IkVOIjoiUiIhPT1BJiYiTCIhPT1BfHwoaz1BKTtmb3IobT0wO208cDsrK20paWYoIk9OIj09PWZbbV0pe2NvbnN0IGU9YyhmLG0rMSwiT04iKTtsZXQgdD14O20+MCYmKHQ9ZlttLTFdKTtsZXQgcj1TO2UrMTxwJiYocj1mW2UrMV0pLCJMIiE9PXQmJih0PSJSIiksIkwiIT09ciYmKHI9IlIiKSx0PT09ciYmbChmLG0sZSx0KSxtPWUtMX1mb3IobT0wO208cDsrK20pIk9OIj09PWZbbV0mJihmW21dPXYpO2ZvcihtPTA7bTxwOysrbSlBPWZbbV0sbyh3W21dKT8iUiI9PT1BP3dbbV0rPTE6IkFOIiE9PUEmJiJFTiIhPT1BfHwod1ttXSs9Mik6IkwiIT09QSYmIkFOIiE9PUEmJiJFTiIhPT1BfHwod1ttXSs9MSk7bGV0IEMsTz0tMSxGPTk5O2ZvcihtPTAsYj13Lmxlbmd0aDttPGI7KyttKUM9d1ttXSxPPEMmJihPPUMpLEY+QyYmcyhDKSYmKEY9Qyk7Zm9yKEM9TztDPj1GOy0tQyl7bGV0IGU9LTE7Zm9yKG09MCxiPXcubGVuZ3RoO208YjsrK20pd1ttXTxDP2U+PTAmJihoKGQsZSxtKSxlPS0xKTplPDAmJihlPW0pO2U+PTAmJmgoZCxlLHcubGVuZ3RoKX1mb3IobT0wLGI9ZC5sZW5ndGg7bTxiOysrbSl7Y29uc3QgZT1kW21dOyI8IiE9PWUmJiI+IiE9PWV8fChkW21dPSIiKX1yZXR1cm4gdShkLmpvaW4oIiIpLGcpfTt2YXIgbj1yKDE0NCk7Y29uc3QgYT1bIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIlMiLCJCIiwiUyIsIldTIiwiQiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCIiwiQiIsIkIiLCJTIiwiV1MiLCJPTiIsIk9OIiwiRVQiLCJFVCIsIkVUIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIkVTIiwiQ1MiLCJFUyIsIkNTIiwiQ1MiLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkNTIiwiT04iLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiT04iLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIk9OIiwiT04iLCJPTiIsIk9OIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJCTiIsIkJOIiwiQk4iLCJDUyIsIk9OIiwiRVQiLCJFVCIsIkVUIiwiRVQiLCJPTiIsIk9OIiwiT04iLCJPTiIsIkwiLCJPTiIsIk9OIiwiQk4iLCJPTiIsIk9OIiwiRVQiLCJFVCIsIkVOIiwiRU4iLCJPTiIsIkwiLCJPTiIsIk9OIiwiT04iLCJFTiIsIkwiLCJPTiIsIk9OIiwiT04iLCJPTiIsIk9OIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJPTiIsIkwiLCJMIiwiTCIsIkwiLCJMIiwiTCIsIkwiLCJMIl0saT1bIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIk9OIiwiT04iLCJBTCIsIkVUIiwiRVQiLCJBTCIsIkNTIiwiQUwiLCJPTiIsIk9OIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiTlNNIiwiQUwiLCJBTCIsIiIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiQU4iLCJBTiIsIkFOIiwiRVQiLCJBTiIsIkFOIiwiQUwiLCJBTCIsIkFMIiwiTlNNIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiLCJBTCIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIk5TTSIsIkFOIiwiT04iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIkFMIiwiTlNNIiwiTlNNIiwiT04iLCJOU00iLCJOU00iLCJOU00iLCJOU00iLCJBTCIsIkFMIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJFTiIsIkVOIiwiRU4iLCJBTCIsIkFMIiwiQUwiLCJBTCIsIkFMIiwiQUwiXTtmdW5jdGlvbiBzKGUpe3JldHVybiAwIT0oMSZlKX1mdW5jdGlvbiBvKGUpe3JldHVybiAwPT0oMSZlKX1mdW5jdGlvbiBjKGUsdCxyKXtsZXQgbixhO2ZvcihuPXQsYT1lLmxlbmd0aDtuPGE7KytuKWlmKGVbbl0hPT1yKXJldHVybiBuO3JldHVybiBufWZ1bmN0aW9uIGwoZSx0LHIsbil7Zm9yKGxldCBhPXQ7YTxyOysrYSllW2FdPW59ZnVuY3Rpb24gaChlLHQscil7Zm9yKGxldCBuPXQsYT1yLTE7bjxhOysrbiwtLWEpe2NvbnN0IHQ9ZVtuXTtlW25dPWVbYV0sZVthXT10fX1mdW5jdGlvbiB1KGUsdCl7bGV0IHI9Imx0ciI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0/cj0idHRiIjp0fHwocj0icnRsIikse3N0cjplLGRpcjpyfX1jb25zdCBkPVtdLGY9W119LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5nZXRGb250U3Vic3RpdHV0aW9uPWZ1bmN0aW9uKGUsdCxyLGQsZil7Y29uc3QgZz1kPSgwLG4ubm9ybWFsaXplRm9udE5hbWUpKGQpO2xldCBwPWUuZ2V0KGcpO2lmKHApcmV0dXJuIHA7bGV0IG09bC5nZXQoZCk7aWYoIW0pZm9yKGNvbnN0W2UsdF1vZiBoKWlmKGQuc3RhcnRzV2l0aChlKSl7ZD0iIi5jb25jYXQodCkuY29uY2F0KGQuc3Vic3RyaW5nKGUubGVuZ3RoKSksbT1sLmdldChkKTticmVha31sZXQgYj0hMTttfHwobT1sLmdldChmKSxiPSEwKTtjb25zdCB5PSIiLmNvbmNhdCh0LmdldERvY0lkKCksIl9zIikuY29uY2F0KHQuY3JlYXRlRm9udElkKCkpO2lmKCFtKXtpZighKDAsYS52YWxpZGF0ZUZvbnROYW1lKShkKSlyZXR1cm4gZS5zZXQoZyxudWxsKSxudWxsO2NvbnN0IHQ9L2JvbGQvZ2kudGVzdChkKSxyPS9vYmxpcXVlfGl0YWxpYy9naS50ZXN0KGQpO3JldHVybiBwPXtjc3M6eSxndWVzc0ZhbGxiYWNrOiEwLGxvYWRlZE5hbWU6eSxiYXNlRm9udE5hbWU6ZCxzcmM6ImxvY2FsKCIuY29uY2F0KGQsIikiKSxzdHlsZTp0JiZyJiZjfHx0JiZzfHxyJiZvfHxpfSxlLnNldChnLHApLHB9Y29uc3Qgdz1bXTtiJiYoMCxhLnZhbGlkYXRlRm9udE5hbWUpKGQpJiZ3LnB1c2goImxvY2FsKCIuY29uY2F0KGQsIikiKSk7Y29uc3R7c3R5bGU6dix1bHRpbWF0ZTp4fT11KG0sdyxyKSxTPW51bGw9PT14O3JldHVybiBwPXtjc3M6IiIuY29uY2F0KHkpLmNvbmNhdChTPyIiOiIsIi5jb25jYXQoeCkpLGd1ZXNzRmFsbGJhY2s6Uyxsb2FkZWROYW1lOnksYmFzZUZvbnROYW1lOmQsc3JjOncuam9pbigiLCIpLHN0eWxlOnZ9LGUuc2V0KGcscCkscH0scigxMzkpO3ZhciBuPXIoMTg4KSxhPXIoMTQ5KTtjb25zdCBpPXtzdHlsZToibm9ybWFsIix3ZWlnaHQ6Im5vcm1hbCJ9LHM9e3N0eWxlOiJub3JtYWwiLHdlaWdodDoiYm9sZCJ9LG89e3N0eWxlOiJpdGFsaWMiLHdlaWdodDoibm9ybWFsIn0sYz17c3R5bGU6Iml0YWxpYyIsd2VpZ2h0OiJib2xkIn0sbD1uZXcgTWFwKFtbIlRpbWVzLVJvbWFuIix7bG9jYWw6WyJUaW1lcyBOZXcgUm9tYW4iLCJUaW1lcy1Sb21hbiIsIlRpbWVzIiwiTGliZXJhdGlvbiBTZXJpZiIsIk5pbWJ1cyBSb21hbiIsIk5pbWJ1cyBSb21hbiBMIiwiVGlub3MiLCJUaG9ybmRhbGUiLCJUZVggR3lyZSBUZXJtZXMiLCJGcmVlU2VyaWYiLCJEZWphVnUgU2VyaWYiLCJCaXRzdHJlYW0gVmVyYSBTZXJpZiIsIlVidW50dSJdLHN0eWxlOmksdWx0aW1hdGU6InNlcmlmIn1dLFsiVGltZXMtQm9sZCIse2FsaWFzOiJUaW1lcy1Sb21hbiIsc3R5bGU6cyx1bHRpbWF0ZToic2VyaWYifV0sWyJUaW1lcy1JdGFsaWMiLHthbGlhczoiVGltZXMtUm9tYW4iLHN0eWxlOm8sdWx0aW1hdGU6InNlcmlmIn1dLFsiVGltZXMtQm9sZEl0YWxpYyIse2FsaWFzOiJUaW1lcy1Sb21hbiIsc3R5bGU6Yyx1bHRpbWF0ZToic2VyaWYifV0sWyJIZWx2ZXRpY2EiLHtsb2NhbDpbIkhlbHZldGljYSIsIkhlbHZldGljYSBOZXVlIiwiQXJpYWwiLCJBcmlhbCBOb3ZhIiwiTGliZXJhdGlvbiBTYW5zIiwiQXJpbW8iLCJOaW1idXMgU2FucyIsIk5pbWJ1cyBTYW5zIEwiLCJBMDMwIiwiVGVYIEd5cmUgSGVyb3MiLCJGcmVlU2FucyIsIkRlamFWdSBTYW5zIiwiQWxiYW55IiwiQml0c3RyZWFtIFZlcmEgU2FucyIsIkFyaWFsIFVuaWNvZGUgTVMiLCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIkFwcGxlIFN5bWJvbHMiLCJDYW50YXJlbGwiXSxwYXRoOiJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiIsc3R5bGU6aSx1bHRpbWF0ZToic2Fucy1zZXJpZiJ9XSxbIkhlbHZldGljYS1Cb2xkIix7YWxpYXM6IkhlbHZldGljYSIscGF0aDoiTGliZXJhdGlvblNhbnMtQm9sZC50dGYiLHN0eWxlOnMsdWx0aW1hdGU6InNhbnMtc2VyaWYifV0sWyJIZWx2ZXRpY2EtT2JsaXF1ZSIse2FsaWFzOiJIZWx2ZXRpY2EiLHBhdGg6IkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiLHN0eWxlOm8sdWx0aW1hdGU6InNhbnMtc2VyaWYifV0sWyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLHthbGlhczoiSGVsdmV0aWNhIixwYXRoOiJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljLnR0ZiIsc3R5bGU6Yyx1bHRpbWF0ZToic2Fucy1zZXJpZiJ9XSxbIkNvdXJpZXIiLHtsb2NhbDpbIkNvdXJpZXIiLCJDb3VyaWVyIE5ldyIsIkxpYmVyYXRpb24gTW9ubyIsIk5pbWJ1cyBNb25vIiwiTmltYnVzIE1vbm8gTCIsIkNvdXNpbmUiLCJDdW1iZXJsYW5kIiwiVGVYIEd5cmUgQ3Vyc29yIiwiRnJlZU1vbm8iXSxzdHlsZTppLHVsdGltYXRlOiJtb25vc3BhY2UifV0sWyJDb3VyaWVyLUJvbGQiLHthbGlhczoiQ291cmllciIsc3R5bGU6cyx1bHRpbWF0ZToibW9ub3NwYWNlIn1dLFsiQ291cmllci1PYmxpcXVlIix7YWxpYXM6IkNvdXJpZXIiLHN0eWxlOm8sdWx0aW1hdGU6Im1vbm9zcGFjZSJ9XSxbIkNvdXJpZXItQm9sZE9ibGlxdWUiLHthbGlhczoiQ291cmllciIsc3R5bGU6Yyx1bHRpbWF0ZToibW9ub3NwYWNlIn1dLFsiQXJpYWxCbGFjayIse2xvY2FsOlsiQXJpYWwgQmxhY2siXSxzdHlsZTp7c3R5bGU6Im5vcm1hbCIsd2VpZ2h0OiI5MDAifSxmYWxsYmFjazoiSGVsdmV0aWNhLUJvbGQifV0sWyJBcmlhbEJsYWNrLUJvbGQiLHthbGlhczoiQXJpYWxCbGFjayJ9XSxbIkFyaWFsQmxhY2stSXRhbGljIix7YWxpYXM6IkFyaWFsQmxhY2siLHN0eWxlOntzdHlsZToiaXRhbGljIix3ZWlnaHQ6IjkwMCJ9LGZhbGxiYWNrOiJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUifV0sWyJBcmlhbEJsYWNrLUJvbGRJdGFsaWMiLHthbGlhczoiQXJpYWxCbGFjay1JdGFsaWMifV0sWyJBcmlhbE5hcnJvdyIse2xvY2FsOlsiQXJpYWwgTmFycm93IiwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyIsIkhlbHZldGljYSBDb25kZW5zZWQiLCJOaW1idXMgU2FucyBOYXJyb3ciLCJUZVggR3lyZSBIZXJvcyBDbiJdLHN0eWxlOmksZmFsbGJhY2s6IkhlbHZldGljYSJ9XSxbIkFyaWFsTmFycm93LUJvbGQiLHthbGlhczoiQXJpYWxOYXJyb3ciLHN0eWxlOnMsZmFsbGJhY2s6IkhlbHZldGljYS1Cb2xkIn1dLFsiQXJpYWxOYXJyb3ctSXRhbGljIix7YWxpYXM6IkFyaWFsTmFycm93IixzdHlsZTpvLGZhbGxiYWNrOiJIZWx2ZXRpY2EtT2JsaXF1ZSJ9XSxbIkFyaWFsTmFycm93LUJvbGRJdGFsaWMiLHthbGlhczoiQXJpYWxOYXJyb3ciLHN0eWxlOmMsZmFsbGJhY2s6IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJ9XSxbIkNhbGlicmkiLHtsb2NhbDpbIkNhbGlicmkiLCJDYXJsaXRvIl0sc3R5bGU6aSxmYWxsYmFjazoiSGVsdmV0aWNhIn1dLFsiQ2FsaWJyaS1Cb2xkIix7YWxpYXM6IkNhbGlicmkiLHN0eWxlOnMsZmFsbGJhY2s6IkhlbHZldGljYS1Cb2xkIn1dLFsiQ2FsaWJyaS1JdGFsaWMiLHthbGlhczoiQ2FsaWJyaSIsc3R5bGU6byxmYWxsYmFjazoiSGVsdmV0aWNhLU9ibGlxdWUifV0sWyJDYWxpYnJpLUJvbGRJdGFsaWMiLHthbGlhczoiQ2FsaWJyaSIsc3R5bGU6YyxmYWxsYmFjazoiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIn1dLFsiV2luZ2RpbmdzIix7bG9jYWw6WyJXaW5nZGluZ3MiLCJVUlcgRGluZ2JhdHMiXSxzdHlsZTppfV0sWyJXaW5nZGluZ3MtUmVndWxhciIse2FsaWFzOiJXaW5nZGluZ3MifV0sWyJXaW5nZGluZ3MtQm9sZCIse2FsaWFzOiJXaW5nZGluZ3MifV1dKSxoPW5ldyBNYXAoW1siQXJpYWwtQmxhY2siLCJBcmlhbEJsYWNrIl1dKTtmdW5jdGlvbiB1KGUsdCxyKXtsZXR7YWxpYXM6bixsb2NhbDphLHBhdGg6aSxmYWxsYmFjazpoLHN0eWxlOmQsdWx0aW1hdGU6Zn09ZSxnPSEoYXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10pfHxhcmd1bWVudHNbM10scD0hKGFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdKXx8YXJndW1lbnRzWzRdLG09YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOiIiO2NvbnN0IGI9e3N0eWxlOm51bGwsdWx0aW1hdGU6bnVsbH07aWYoYSl7Y29uc3QgZT1tPyIgIi5jb25jYXQobSk6IiI7Zm9yKGNvbnN0IHIgb2YgYSl0LnB1c2goImxvY2FsKCIuY29uY2F0KHIpLmNvbmNhdChlLCIpIikpfWlmKG4pe2NvbnN0IGU9bC5nZXQobiksYT1tfHxmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSBzOnJldHVybiJCb2xkIjtjYXNlIG86cmV0dXJuIkl0YWxpYyI7Y2FzZSBjOnJldHVybiJCb2xkIEl0YWxpYyI7ZGVmYXVsdDppZigiYm9sZCI9PT0obnVsbD09ZT92b2lkIDA6ZS53ZWlnaHQpKXJldHVybiJCb2xkIjtpZigiaXRhbGljIj09PShudWxsPT1lP3ZvaWQgMDplLnN0eWxlKSlyZXR1cm4iSXRhbGljIn1yZXR1cm4iIn0oZCk7T2JqZWN0LmFzc2lnbihiLHUoZSx0LHIsZyYmIWgscCYmIWksYSkpfWlmKGQmJihiLnN0eWxlPWQpLGYmJihiLnVsdGltYXRlPWYpLGcmJmgpe2NvbnN0IGU9bC5nZXQoaCkse3VsdGltYXRlOm59PXUoZSx0LHIsZyxwJiYhaSxtKTtiLnVsdGltYXRlfHwoYi51bHRpbWF0ZT1uKX1yZXR1cm4gcCYmaSYmciYmdC5wdXNoKCJ1cmwoIi5jb25jYXQocikuY29uY2F0KGksIikiKSksYn19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5JbWFnZVJlc2l6ZXI9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDIpO3ZhciBuPXIoMTQ0KTtjbGFzcyBhe2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faW1nRGF0YT1lLHRoaXMuX2lzTWFzaz10fXN0YXRpYyBuZWVkc1RvQmVSZXNpemVkKGUsdCl7aWYoZTw9dGhpcy5fZ29vZFNxdWFyZUxlbmd0aCYmdDw9dGhpcy5fZ29vZFNxdWFyZUxlbmd0aClyZXR1cm4hMTtjb25zdHtNQVhfRElNOnJ9PXRoaXM7aWYoZT5yfHx0PnIpcmV0dXJuITA7Y29uc3Qgbj1lKnQ7cmV0dXJuIHRoaXMuX2hhc01heEFyZWE/bj50aGlzLk1BWF9BUkVBOiEobjx0aGlzLl9nb29kU3F1YXJlTGVuZ3RoKioyKSYmKHRoaXMuX2FyZUdvb2REaW1zKGUsdCk/KHRoaXMuX2dvb2RTcXVhcmVMZW5ndGg9TWF0aC5tYXgodGhpcy5fZ29vZFNxdWFyZUxlbmd0aCxNYXRoLmZsb29yKE1hdGguc3FydChlKnQpKSksITEpOih0aGlzLl9nb29kU3F1YXJlTGVuZ3RoPXRoaXMuX2d1ZXNzTWF4KHRoaXMuX2dvb2RTcXVhcmVMZW5ndGgsciwxMjgsMCksbj4odGhpcy5NQVhfQVJFQT10aGlzLl9nb29kU3F1YXJlTGVuZ3RoKioyKSkpfXN0YXRpYyBnZXQgTUFYX0RJTSgpe3JldHVybigwLG4uc2hhZG93KSh0aGlzLCJNQVhfRElNIix0aGlzLl9ndWVzc01heCgyMDQ4LDY1NTM3LDAsMSkpfXN0YXRpYyBnZXQgTUFYX0FSRUEoKXtyZXR1cm4gdGhpcy5faGFzTWF4QXJlYT0hMCwoMCxuLnNoYWRvdykodGhpcywiTUFYX0FSRUEiLHRoaXMuX2d1ZXNzTWF4KGEuX2dvb2RTcXVhcmVMZW5ndGgsdGhpcy5NQVhfRElNLDEyOCwwKSoqMil9c3RhdGljIHNldCBNQVhfQVJFQShlKXtlPj0wJiYodGhpcy5faGFzTWF4QXJlYT0hMCwoMCxuLnNoYWRvdykodGhpcywiTUFYX0FSRUEiLGUpKX1zdGF0aWMgc2V0TWF4QXJlYShlKXt0aGlzLl9oYXNNYXhBcmVhfHwodGhpcy5NQVhfQVJFQT1lPj4yKX1zdGF0aWMgX2FyZUdvb2REaW1zKGUsdCl7dHJ5e2NvbnN0IHI9bmV3IE9mZnNjcmVlbkNhbnZhcyhlLHQpLG49ci5nZXRDb250ZXh0KCIyZCIpO24uZmlsbFJlY3QoMCwwLDEsMSk7Y29uc3QgYT1uLmdldEltYWdlRGF0YSgwLDAsMSwxKS5kYXRhWzNdO3JldHVybiByLndpZHRoPXIuaGVpZ2h0PTEsMCE9PWF9Y2F0Y2goZSl7cmV0dXJuITF9fXN0YXRpYyBfZ3Vlc3NNYXgoZSx0LHIsbil7Zm9yKDtlK3IrMTx0Oyl7Y29uc3Qgcj1NYXRoLmZsb29yKChlK3QpLzIpLGE9bnx8cjt0aGlzLl9hcmVHb29kRGltcyhyLGEpP2U9cjp0PXJ9cmV0dXJuIGV9c3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlKGUpe3JldHVybiBuZXcgYShlLGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0pLl9jcmVhdGVJbWFnZSgpfWFzeW5jIF9jcmVhdGVJbWFnZSgpe2NvbnN0IGU9dGhpcy5fZW5jb2RlQk1QKCksdD1uZXcgQmxvYihbZS5idWZmZXJdLHt0eXBlOiJpbWFnZS9ibXAifSkscj1jcmVhdGVJbWFnZUJpdG1hcCh0KSx7TUFYX0FSRUE6bixNQVhfRElNOml9PWEse19pbWdEYXRhOnN9PXRoaXMse3dpZHRoOm8saGVpZ2h0OmN9PXMsbD1NYXRoLm1heChvL2ksYy9pLE1hdGguc3FydChvKmMvbikpLGg9TWF0aC5tYXgobCwyKSx1PU1hdGgucm91bmQoMTAqKGwrMS4yNSkpLzEwL2gsZD1NYXRoLmZsb29yKE1hdGgubG9nMih1KSksZj1uZXcgQXJyYXkoZCsyKS5maWxsKDIpO2ZbMF09aCxmLnNwbGljZSgtMSwxLHUvKDE8PGQpKTtsZXQgZz1vLHA9YyxtPWF3YWl0IHI7Zm9yKGNvbnN0IGUgb2YgZil7Y29uc3QgdD1nLHI9cDtnPU1hdGguZmxvb3IoZy9lKS0xLHA9TWF0aC5mbG9vcihwL2UpLTE7Y29uc3Qgbj1uZXcgT2Zmc2NyZWVuQ2FudmFzKGcscCk7bi5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZShtLDAsMCx0LHIsMCwwLGcscCksbT1uLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpfXJldHVybiBzLmRhdGE9bnVsbCxzLmJpdG1hcD1tLHMud2lkdGg9ZyxzLmhlaWdodD1wLHN9X2VuY29kZUJNUCgpe2NvbnN0e3dpZHRoOmUsaGVpZ2h0OnQsa2luZDpyfT10aGlzLl9pbWdEYXRhO2xldCBhLGk9dGhpcy5faW1nRGF0YS5kYXRhLHM9bmV3IFVpbnQ4QXJyYXkoMCksbz1zLGM9MDtzd2l0Y2gocil7Y2FzZSBuLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDp7YT0xLHM9bmV3IFVpbnQ4QXJyYXkodGhpcy5faXNNYXNrP1syNTUsMjU1LDI1NSwyNTUsMCwwLDAsMF06WzAsMCwwLDAsMjU1LDI1NSwyNTUsMjU1XSk7Y29uc3Qgcj1lKzc+PjMsbj1yKzMmLTQ7aWYociE9PW4pe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkobip0KTtsZXQgYT0wO2ZvcihsZXQgcz0wLG89dCpyO3M8bztzKz1yLGErPW4pZS5zZXQoaS5zdWJhcnJheShzLHMrciksYSk7aT1lfWJyZWFrfWNhc2Ugbi5JbWFnZUtpbmQuUkdCXzI0QlBQOmlmKGE9MjQsMyZlKXtjb25zdCByPTMqZSxuPXIrMyYtNCxhPW4tcixzPW5ldyBVaW50OEFycmF5KG4qdCk7bGV0IG89MDtmb3IobGV0IGU9MCxuPXQqcjtlPG47ZSs9cil7Y29uc3QgdD1pLnN1YmFycmF5KGUsZStyKTtmb3IobGV0IGU9MDtlPHI7ZSs9MylzW28rK109dFtlKzJdLHNbbysrXT10W2UrMV0sc1tvKytdPXRbZV07bys9YX1pPXN9ZWxzZSBmb3IobGV0IGU9MCx0PWkubGVuZ3RoO2U8dDtlKz0zKXtjb25zdCB0PWlbZV07aVtlXT1pW2UrMl0saVtlKzJdPXR9YnJlYWs7Y2FzZSBuLkltYWdlS2luZC5SR0JBXzMyQlBQOmE9MzIsYz0zLG89bmV3IFVpbnQ4QXJyYXkoNjgpO2NvbnN0IHI9bmV3IERhdGFWaWV3KG8uYnVmZmVyKTtuLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuPyhyLnNldFVpbnQzMigwLDI1NSwhMCksci5zZXRVaW50MzIoNCw2NTI4MCwhMCksci5zZXRVaW50MzIoOCwxNjcxMTY4MCwhMCksci5zZXRVaW50MzIoMTIsNDI3ODE5MDA4MCwhMCkpOihyLnNldFVpbnQzMigwLDQyNzgxOTAwODAsITApLHIuc2V0VWludDMyKDQsMTY3MTE2ODAsITApLHIuc2V0VWludDMyKDgsNjUyODAsITApLHIuc2V0VWludDMyKDEyLDI1NSwhMCkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpfWxldCBsPTA7Y29uc3QgaD00MCtvLmxlbmd0aCx1PTE0K2grcy5sZW5ndGgraS5sZW5ndGgsZD1uZXcgVWludDhBcnJheSh1KSxmPW5ldyBEYXRhVmlldyhkLmJ1ZmZlcik7cmV0dXJuIGYuc2V0VWludDE2KGwsMTk3NzgsITApLGwrPTIsZi5zZXRVaW50MzIobCx1LCEwKSxsKz00LGYuc2V0VWludDMyKGwsMCwhMCksbCs9NCxmLnNldFVpbnQzMihsLDE0K2grcy5sZW5ndGgsITApLGwrPTQsZi5zZXRVaW50MzIobCxoLCEwKSxsKz00LGYuc2V0SW50MzIobCxlLCEwKSxsKz00LGYuc2V0SW50MzIobCwtdCwhMCksbCs9NCxmLnNldFVpbnQxNihsLDEsITApLGwrPTIsZi5zZXRVaW50MTYobCxhLCEwKSxsKz0yLGYuc2V0VWludDMyKGwsYywhMCksbCs9NCxmLnNldFVpbnQzMihsLDAsITApLGwrPTQsZi5zZXRJbnQzMihsLDAsITApLGwrPTQsZi5zZXRJbnQzMihsLDAsITApLGwrPTQsZi5zZXRVaW50MzIobCxzLmxlbmd0aC80LCEwKSxsKz00LGYuc2V0VWludDMyKGwsMCwhMCksbCs9NCxkLnNldChvLGwpLGwrPW8ubGVuZ3RoLGQuc2V0KHMsbCksbCs9cy5sZW5ndGgsZC5zZXQoaSxsKSxkfX10LkltYWdlUmVzaXplcj1hLGEuX2dvb2RTcXVhcmVMZW5ndGg9MjA0OH0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk11cm11ckhhc2gzXzY0PXZvaWQgMCxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSkscigyKTt2YXIgbj1yKDE0NCk7Y29uc3QgYT0zMjg1Mzc3NTIwLGk9NDI5NDkwMTc2MCxzPTY1NTM1O3QuTXVybXVySGFzaDNfNjQ9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5oMT1lPzQyOTQ5NjcyOTUmZTphLHRoaXMuaDI9ZT80Mjk0OTY3Mjk1JmU6YX11cGRhdGUoZSl7bGV0IHQscjtpZigic3RyaW5nIj09dHlwZW9mIGUpe3Q9bmV3IFVpbnQ4QXJyYXkoMiplLmxlbmd0aCkscj0wO2ZvcihsZXQgbj0wLGE9ZS5sZW5ndGg7bjxhO24rKyl7Y29uc3QgYT1lLmNoYXJDb2RlQXQobik7YTw9MjU1P3RbcisrXT1hOih0W3IrK109YT4+PjgsdFtyKytdPTI1NSZhKX19ZWxzZXtpZighKDAsbi5pc0FycmF5QnVmZmVyKShlKSl0aHJvdyBuZXcgRXJyb3IoIldyb25nIGRhdGEgZm9ybWF0IGluIE11cm11ckhhc2gzXzY0X3VwZGF0ZS4gSW5wdXQgbXVzdCBiZSBhIHN0cmluZyBvciBhcnJheS4iKTt0PWUuc2xpY2UoKSxyPXQuYnl0ZUxlbmd0aH1jb25zdCBhPXI+PjIsbz1yLTQqYSxjPW5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlciwwLGEpO2xldCBsPTAsaD0wLHU9dGhpcy5oMSxkPXRoaXMuaDI7Y29uc3QgZj0zNDMyOTE4MzUzLGc9NDYxODQ1OTA3LHA9MTE2MDEsbT0xMzcxNTtmb3IobGV0IGU9MDtlPGE7ZSsrKTEmZT8obD1jW2VdLGw9bCpmJml8bCpwJnMsbD1sPDwxNXxsPj4+MTcsbD1sKmcmaXxsKm0mcyx1Xj1sLHU9dTw8MTN8dT4+PjE5LHU9NSp1KzM4NjQyOTIxOTYpOihoPWNbZV0saD1oKmYmaXxoKnAmcyxoPWg8PDE1fGg+Pj4xNyxoPWgqZyZpfGgqbSZzLGRePWgsZD1kPDwxM3xkPj4+MTksZD01KmQrMzg2NDI5MjE5Nik7c3dpdGNoKGw9MCxvKXtjYXNlIDM6bF49dFs0KmErMl08PDE2O2Nhc2UgMjpsXj10WzQqYSsxXTw8ODtjYXNlIDE6bF49dFs0KmFdLGw9bCpmJml8bCpwJnMsbD1sPDwxNXxsPj4+MTcsbD1sKmcmaXxsKm0mcywxJmE/dV49bDpkXj1sfXRoaXMuaDE9dSx0aGlzLmgyPWR9aGV4ZGlnZXN0KCl7bGV0IGU9dGhpcy5oMSx0PXRoaXMuaDI7cmV0dXJuIGVePXQ+Pj4xLGU9Mzk4MTgwNjc5NyplJml8MzYwNDUqZSZzLHQ9NDI4MzU0MzUxMSp0Jml8KDI5NTAxNjM3OTcqKHQ8PDE2fGU+Pj4xNikmaSk+Pj4xNixlXj10Pj4+MSxlPTQ0NDk4NDQwMyplJml8NjA0OTkqZSZzLHQ9MzMwMTg4MjM2Nip0Jml8KDMxMjA0Mzc4OTMqKHQ8PDE2fGU+Pj4xNikmaSk+Pj4xNixlXj10Pj4+MSwoZT4+PjApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCIwIikrKHQ+Pj4wKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwiMCIpfX19LChlLHQscik9Pnt2YXIgbjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5PcGVyYXRvckxpc3Q9dm9pZCAwLHIoMikscigxMzkpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIGE9cigxNDQpO2Z1bmN0aW9uIHMoZSx0LHIsbixhKXtsZXQgaT1lO2ZvcihsZXQgZT0wLHI9dC5sZW5ndGgtMTtlPHI7ZSsrKXt2YXIgcztjb25zdCByPXRbZV07aT0ocz1pKVtyXXx8KHNbcl09W10pfWlbdC5hdCgtMSldPXtjaGVja0ZuOnIsaXRlcmF0ZUZuOm4scHJvY2Vzc0ZuOmF9fWNvbnN0IG89W107cyhvLFthLk9QUy5zYXZlLGEuT1BTLnRyYW5zZm9ybSxhLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdCxhLk9QUy5yZXN0b3JlXSxudWxsLChmdW5jdGlvbihlLHQpe2NvbnN0IHI9ZS5mbkFycmF5LG49KHQtKGUuaUN1cnItMykpJTQ7c3dpdGNoKG4pe2Nhc2UgMDpyZXR1cm4gclt0XT09PWEuT1BTLnNhdmU7Y2FzZSAxOnJldHVybiByW3RdPT09YS5PUFMudHJhbnNmb3JtO2Nhc2UgMjpyZXR1cm4gclt0XT09PWEuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0O2Nhc2UgMzpyZXR1cm4gclt0XT09PWEuT1BTLnJlc3RvcmV9dGhyb3cgbmV3IEVycm9yKCJpdGVyYXRlSW5saW5lSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAiLmNvbmNhdChuKSl9KSwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9ZS5pQ3VycixzPWktMyxvPWktMixjPWktMSxsPU1hdGgubWluKE1hdGguZmxvb3IoKHQtcykvNCksMjAwKTtpZihsPDEwKXJldHVybiB0LSh0LXMpJTQ7bGV0IGg9MDtjb25zdCB1PVtdO2xldCBkPTAsZj0xLGc9MTtmb3IobGV0IGU9MDtlPGw7ZSsrKXtjb25zdCB0PW5bbysoZTw8MildLHI9bltjKyhlPDwyKV1bMF07ZityLndpZHRoPjFlMyYmKGg9TWF0aC5tYXgoaCxmKSxnKz1kKzIsZj0wLGQ9MCksdS5wdXNoKHt0cmFuc2Zvcm06dCx4OmYseTpnLHc6ci53aWR0aCxoOnIuaGVpZ2h0fSksZis9ci53aWR0aCsyLGQ9TWF0aC5tYXgoZCxyLmhlaWdodCl9Y29uc3QgcD1NYXRoLm1heChoLGYpKzEsbT1nK2QrMSxiPW5ldyBVaW50OEFycmF5KHAqbSo0KSx5PXA8PDI7Zm9yKGxldCBlPTA7ZTxsO2UrKyl7Y29uc3QgdD1uW2MrKGU8PDIpXVswXS5kYXRhLHI9dVtlXS53PDwyO2xldCBhPTAsaT11W2VdLngrdVtlXS55KnA8PDI7Yi5zZXQodC5zdWJhcnJheSgwLHIpLGkteSk7Zm9yKGxldCBuPTAscz11W2VdLmg7bjxzO24rKyliLnNldCh0LnN1YmFycmF5KGEsYStyKSxpKSxhKz1yLGkrPXk7Zm9yKGIuc2V0KHQuc3ViYXJyYXkoYS1yLGEpLGkpO2k+PTA7KXRbaS00XT10W2ldLHRbaS0zXT10W2krMV0sdFtpLTJdPXRbaSsyXSx0W2ktMV09dFtpKzNdLHRbaStyXT10W2krci00XSx0W2krcisxXT10W2krci0zXSx0W2krcisyXT10W2krci0yXSx0W2krciszXT10W2krci0xXSxpLT15fWNvbnN0IHc9e3dpZHRoOnAsaGVpZ2h0Om19O2lmKGUuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpe2NvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcyhwLG0pO2UuZ2V0Q29udGV4dCgiMmQiKS5wdXRJbWFnZURhdGEobmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkoYi5idWZmZXIpLHAsbSksMCwwKSx3LmJpdG1hcD1lLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpLHcuZGF0YT1udWxsfWVsc2Ugdy5raW5kPWEuSW1hZ2VLaW5kLlJHQkFfMzJCUFAsdy5kYXRhPWI7cmV0dXJuIHIuc3BsaWNlKHMsNCpsLGEuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXApLG4uc3BsaWNlKHMsNCpsLFt3LHVdKSxzKzF9KSkscyhvLFthLk9QUy5zYXZlLGEuT1BTLnRyYW5zZm9ybSxhLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsYS5PUFMucmVzdG9yZV0sbnVsbCwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPSh0LShlLmlDdXJyLTMpKSU0O3N3aXRjaChuKXtjYXNlIDA6cmV0dXJuIHJbdF09PT1hLk9QUy5zYXZlO2Nhc2UgMTpyZXR1cm4gclt0XT09PWEuT1BTLnRyYW5zZm9ybTtjYXNlIDI6cmV0dXJuIHJbdF09PT1hLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q7Y2FzZSAzOnJldHVybiByW3RdPT09YS5PUFMucmVzdG9yZX10aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVJbWFnZU1hc2tHcm91cCAtIGludmFsaWQgcG9zOiAiLmNvbmNhdChuKSl9KSwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9ZS5pQ3VycixzPWktMyxvPWktMixjPWktMTtsZXQgbD1NYXRoLmZsb29yKCh0LXMpLzQpO2lmKGw8MTApcmV0dXJuIHQtKHQtcyklNDtsZXQgaCx1LGQ9ITE7Y29uc3QgZj1uW2NdWzBdLGc9bltvXVswXSxwPW5bb11bMV0sbT1uW29dWzJdLGI9bltvXVszXTtpZihwPT09bSl7ZD0hMCxoPW8rNDtsZXQgZT1jKzQ7Zm9yKGxldCB0PTE7dDxsO3QrKyxoKz00LGUrPTQpaWYodT1uW2hdLG5bZV1bMF0hPT1mfHx1WzBdIT09Z3x8dVsxXSE9PXB8fHVbMl0hPT1tfHx1WzNdIT09Yil7dDwxMD9kPSExOmw9dDticmVha319aWYoZCl7bD1NYXRoLm1pbihsLDFlMyk7Y29uc3QgZT1uZXcgRmxvYXQzMkFycmF5KDIqbCk7aD1vO2ZvcihsZXQgdD0wO3Q8bDt0KyssaCs9NCl1PW5baF0sZVt0PDwxXT11WzRdLGVbMSsodDw8MSldPXVbNV07ci5zcGxpY2Uocyw0KmwsYS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0KSxuLnNwbGljZShzLDQqbCxbZixnLHAsbSxiLGVdKX1lbHNle2w9TWF0aC5taW4obCwxMDApO2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDxsO3QrKyl7dT1uW28rKHQ8PDIpXTtjb25zdCByPW5bYysodDw8MildWzBdO2UucHVzaCh7ZGF0YTpyLmRhdGEsd2lkdGg6ci53aWR0aCxoZWlnaHQ6ci5oZWlnaHQsaW50ZXJwb2xhdGU6ci5pbnRlcnBvbGF0ZSxjb3VudDpyLmNvdW50LHRyYW5zZm9ybTp1fSl9ci5zcGxpY2Uocyw0KmwsYS5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXApLG4uc3BsaWNlKHMsNCpsLFtlXSl9cmV0dXJuIHMrMX0pKSxzKG8sW2EuT1BTLnNhdmUsYS5PUFMudHJhbnNmb3JtLGEuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LGEuT1BTLnJlc3RvcmVdLChmdW5jdGlvbihlKXtjb25zdCB0PWUuYXJnc0FycmF5LHI9ZS5pQ3Vyci0yO3JldHVybiAwPT09dFtyXVsxXSYmMD09PXRbcl1bMl19KSwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9KHQtKGUuaUN1cnItMykpJTQ7c3dpdGNoKGkpe2Nhc2UgMDpyZXR1cm4gclt0XT09PWEuT1BTLnNhdmU7Y2FzZSAxOmlmKHJbdF0hPT1hLk9QUy50cmFuc2Zvcm0pcmV0dXJuITE7Y29uc3QgaT1lLmlDdXJyLTIscz1uW2ldWzBdLG89bltpXVszXTtyZXR1cm4gblt0XVswXT09PXMmJjA9PT1uW3RdWzFdJiYwPT09blt0XVsyXSYmblt0XVszXT09PW87Y2FzZSAyOmlmKHJbdF0hPT1hLk9QUy5wYWludEltYWdlWE9iamVjdClyZXR1cm4hMTtjb25zdCBjPW5bZS5pQ3Vyci0xXVswXTtyZXR1cm4gblt0XVswXT09PWM7Y2FzZSAzOnJldHVybiByW3RdPT09YS5PUFMucmVzdG9yZX10aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVJbWFnZUdyb3VwIC0gaW52YWxpZCBwb3M6ICIuY29uY2F0KGkpKX0pLChmdW5jdGlvbihlLHQpe2NvbnN0IHI9ZS5mbkFycmF5LG49ZS5hcmdzQXJyYXksaT1lLmlDdXJyLHM9aS0zLG89aS0yLGM9bltpLTFdWzBdLGw9bltvXVswXSxoPW5bb11bM10sdT1NYXRoLm1pbihNYXRoLmZsb29yKCh0LXMpLzQpLDFlMyk7aWYodTwzKXJldHVybiB0LSh0LXMpJTQ7Y29uc3QgZD1uZXcgRmxvYXQzMkFycmF5KDIqdSk7bGV0IGY9bztmb3IobGV0IGU9MDtlPHU7ZSsrLGYrPTQpe2NvbnN0IHQ9bltmXTtkW2U8PDFdPXRbNF0sZFsxKyhlPDwxKV09dFs1XX1jb25zdCBnPVtjLGwsaCxkXTtyZXR1cm4gci5zcGxpY2Uocyw0KnUsYS5PUFMucGFpbnRJbWFnZVhPYmplY3RSZXBlYXQpLG4uc3BsaWNlKHMsNCp1LGcpLHMrMX0pKSxzKG8sW2EuT1BTLmJlZ2luVGV4dCxhLk9QUy5zZXRGb250LGEuT1BTLnNldFRleHRNYXRyaXgsYS5PUFMuc2hvd1RleHQsYS5PUFMuZW5kVGV4dF0sbnVsbCwoZnVuY3Rpb24oZSx0KXtjb25zdCByPWUuZm5BcnJheSxuPWUuYXJnc0FycmF5LGk9KHQtKGUuaUN1cnItNCkpJTU7c3dpdGNoKGkpe2Nhc2UgMDpyZXR1cm4gclt0XT09PWEuT1BTLmJlZ2luVGV4dDtjYXNlIDE6cmV0dXJuIHJbdF09PT1hLk9QUy5zZXRGb250O2Nhc2UgMjpyZXR1cm4gclt0XT09PWEuT1BTLnNldFRleHRNYXRyaXg7Y2FzZSAzOmlmKHJbdF0hPT1hLk9QUy5zaG93VGV4dClyZXR1cm4hMTtjb25zdCBpPWUuaUN1cnItMyxzPW5baV1bMF0sbz1uW2ldWzFdO3JldHVybiBuW3RdWzBdPT09cyYmblt0XVsxXT09PW87Y2FzZSA0OnJldHVybiByW3RdPT09YS5PUFMuZW5kVGV4dH10aHJvdyBuZXcgRXJyb3IoIml0ZXJhdGVTaG93VGV4dEdyb3VwIC0gaW52YWxpZCBwb3M6ICIuY29uY2F0KGkpKX0pLChmdW5jdGlvbihlLHQpe2NvbnN0IHI9ZS5mbkFycmF5LG49ZS5hcmdzQXJyYXksYT1lLmlDdXJyLGk9YS00LHM9YS0zLG89YS0yLGM9YS0xLGw9YSxoPW5bc11bMF0sdT1uW3NdWzFdO2xldCBkPU1hdGgubWluKE1hdGguZmxvb3IoKHQtaSkvNSksMWUzKTtpZihkPDMpcmV0dXJuIHQtKHQtaSklNTtsZXQgZj1pO2k+PTQmJnJbaS00XT09PXJbc10mJnJbaS0zXT09PXJbb10mJnJbaS0yXT09PXJbY10mJnJbaS0xXT09PXJbbF0mJm5baS00XVswXT09PWgmJm5baS00XVsxXT09PXUmJihkKyssZi09NSk7bGV0IGc9Zis0O2ZvcihsZXQgZT0xO2U8ZDtlKyspci5zcGxpY2UoZywzKSxuLnNwbGljZShnLDMpLGcrPTI7cmV0dXJuIGcrMX0pKTtjbGFzcyBje2NvbnN0cnVjdG9yKGUpe3RoaXMucXVldWU9ZX1fb3B0aW1pemUoKXt9cHVzaChlLHQpe3RoaXMucXVldWUuZm5BcnJheS5wdXNoKGUpLHRoaXMucXVldWUuYXJnc0FycmF5LnB1c2godCksdGhpcy5fb3B0aW1pemUoKX1mbHVzaCgpe31yZXNldCgpe319Y2xhc3MgbCBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5zdGF0ZT1udWxsLHRoaXMuY29udGV4dD17aUN1cnI6MCxmbkFycmF5OmUuZm5BcnJheSxhcmdzQXJyYXk6ZS5hcmdzQXJyYXksaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6ITF9LHRoaXMubWF0Y2g9bnVsbCx0aGlzLmxhc3RQcm9jZXNzZWQ9MH1zZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoZSl7dGhpcy5jb250ZXh0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPWV9X29wdGltaXplKCl7Y29uc3QgZT10aGlzLnF1ZXVlLmZuQXJyYXk7bGV0IHQ9dGhpcy5sYXN0UHJvY2Vzc2VkLHI9ZS5sZW5ndGgsbj10aGlzLnN0YXRlLGE9dGhpcy5tYXRjaDtpZighbiYmIWEmJnQrMT09PXImJiFvW2VbdF1dKXJldHVybiB2b2lkKHRoaXMubGFzdFByb2Nlc3NlZD1yKTtjb25zdCBpPXRoaXMuY29udGV4dDtmb3IoO3Q8cjspe2lmKGEpe2lmKCgwLGEuaXRlcmF0ZUZuKShpLHQpKXt0Kys7Y29udGludWV9aWYodD0oMCxhLnByb2Nlc3NGbikoaSx0KzEpLHI9ZS5sZW5ndGgsYT1udWxsLG49bnVsbCx0Pj1yKWJyZWFrfW49KG58fG8pW2VbdF1dLG4mJiFBcnJheS5pc0FycmF5KG4pPyhpLmlDdXJyPXQsdCsrLCFuLmNoZWNrRm58fCgwLG4uY2hlY2tGbikoaSk/KGE9bixuPW51bGwpOm49bnVsbCk6dCsrfXRoaXMuc3RhdGU9bix0aGlzLm1hdGNoPWEsdGhpcy5sYXN0UHJvY2Vzc2VkPXR9Zmx1c2goKXtmb3IoO3RoaXMubWF0Y2g7KXtjb25zdCBlPXRoaXMucXVldWUuZm5BcnJheS5sZW5ndGg7dGhpcy5sYXN0UHJvY2Vzc2VkPSgwLHRoaXMubWF0Y2gucHJvY2Vzc0ZuKSh0aGlzLmNvbnRleHQsZSksdGhpcy5tYXRjaD1udWxsLHRoaXMuc3RhdGU9bnVsbCx0aGlzLl9vcHRpbWl6ZSgpfX1yZXNldCgpe3RoaXMuc3RhdGU9bnVsbCx0aGlzLm1hdGNoPW51bGwsdGhpcy5sYXN0UHJvY2Vzc2VkPTB9fWNsYXNzIGh7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MCx0PWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3RoaXMuX3N0cmVhbVNpbms9dCx0aGlzLmZuQXJyYXk9W10sdGhpcy5hcmdzQXJyYXk9W10sdGhpcy5vcHRpbWl6ZXI9IXR8fGUmYS5SZW5kZXJpbmdJbnRlbnRGbGFnLk9QTElTVD9uZXcgYyh0aGlzKTpuZXcgbCh0aGlzKSx0aGlzLmRlcGVuZGVuY2llcz1uZXcgU2V0LHRoaXMuX3RvdGFsTGVuZ3RoPTAsdGhpcy53ZWlnaHQ9MCx0aGlzLl9yZXNvbHZlZD10P251bGw6UHJvbWlzZS5yZXNvbHZlKCl9c2V0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKGUpe3RoaXMub3B0aW1pemVyLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkPWV9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmFyZ3NBcnJheS5sZW5ndGh9Z2V0IHJlYWR5KCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVkfHx0aGlzLl9zdHJlYW1TaW5rLnJlYWR5fWdldCB0b3RhbExlbmd0aCgpe3JldHVybiB0aGlzLl90b3RhbExlbmd0aCt0aGlzLmxlbmd0aH1hZGRPcChlLHQpe3RoaXMub3B0aW1pemVyLnB1c2goZSx0KSx0aGlzLndlaWdodCsrLHRoaXMuX3N0cmVhbVNpbmsmJih0aGlzLndlaWdodD49aC5DSFVOS19TSVpFfHx0aGlzLndlaWdodD49aC5DSFVOS19TSVpFX0FCT1VUJiYoZT09PWEuT1BTLnJlc3RvcmV8fGU9PT1hLk9QUy5lbmRUZXh0KSkmJnRoaXMuZmx1c2goKX1hZGRJbWFnZU9wcyhlLHQscil7dm9pZCAwIT09ciYmdGhpcy5hZGRPcChhLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcyxbIk9DIixyXSksdGhpcy5hZGRPcChlLHQpLHZvaWQgMCE9PXImJnRoaXMuYWRkT3AoYS5PUFMuZW5kTWFya2VkQ29udGVudCxbXSl9YWRkRGVwZW5kZW5jeShlKXt0aGlzLmRlcGVuZGVuY2llcy5oYXMoZSl8fCh0aGlzLmRlcGVuZGVuY2llcy5hZGQoZSksdGhpcy5hZGRPcChhLk9QUy5kZXBlbmRlbmN5LFtlXSkpfWFkZERlcGVuZGVuY2llcyhlKXtmb3IoY29uc3QgdCBvZiBlKXRoaXMuYWRkRGVwZW5kZW5jeSh0KX1hZGRPcExpc3QoZSl7aWYoZSBpbnN0YW5jZW9mIGgpe2Zvcihjb25zdCB0IG9mIGUuZGVwZW5kZW5jaWVzKXRoaXMuZGVwZW5kZW5jaWVzLmFkZCh0KTtmb3IobGV0IHQ9MCxyPWUubGVuZ3RoO3Q8cjt0KyspdGhpcy5hZGRPcChlLmZuQXJyYXlbdF0sZS5hcmdzQXJyYXlbdF0pfWVsc2UoMCxhLndhcm4pKCdhZGRPcExpc3QgLSBpZ25vcmluZyBpbnZhbGlkICJvcExpc3QiIHBhcmFtZXRlci4nKX1nZXRJUigpe3JldHVybntmbkFycmF5OnRoaXMuZm5BcnJheSxhcmdzQXJyYXk6dGhpcy5hcmdzQXJyYXksbGVuZ3RoOnRoaXMubGVuZ3RofX1nZXQgX3RyYW5zZmVycygpe3ZhciBlO2NvbnN0IHQ9W10se2ZuQXJyYXk6cixhcmdzQXJyYXk6bixsZW5ndGg6aX09dGhpcztmb3IobGV0IHM9MDtzPGk7cysrKXN3aXRjaChyW3NdKXtjYXNlIGEuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OmNhc2UgYS5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDpjYXNlIGEuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDpjb25zdCByPW5bc11bMF07IXIuY2FjaGVkJiYobnVsbD09PShlPXIuZGF0YSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuYnVmZmVyKWluc3RhbmNlb2YgQXJyYXlCdWZmZXImJnQucHVzaChyLmRhdGEuYnVmZmVyKX1yZXR1cm4gdH1mbHVzaCgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF0sdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbDt0aGlzLm9wdGltaXplci5mbHVzaCgpO2NvbnN0IHI9dGhpcy5sZW5ndGg7dGhpcy5fdG90YWxMZW5ndGgrPXIsdGhpcy5fc3RyZWFtU2luay5lbnF1ZXVlKHtmbkFycmF5OnRoaXMuZm5BcnJheSxhcmdzQXJyYXk6dGhpcy5hcmdzQXJyYXksbGFzdENodW5rOmUsc2VwYXJhdGVBbm5vdHM6dCxsZW5ndGg6cn0sMSx0aGlzLl90cmFuc2ZlcnMpLHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCksdGhpcy5mbkFycmF5Lmxlbmd0aD0wLHRoaXMuYXJnc0FycmF5Lmxlbmd0aD0wLHRoaXMud2VpZ2h0PTAsdGhpcy5vcHRpbWl6ZXIucmVzZXQoKX19bj1oLGkoaCwiQ0hVTktfU0laRSIsMWUzKSxpKGgsIkNIVU5LX1NJWkVfQUJPVVQiLG4uQ0hVTktfU0laRS01KSx0Lk9wZXJhdG9yTGlzdD1ofSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuUERGSW1hZ2U9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDIpO3ZhciBuPXIoMTQ0KSxhPXIoMTc4KSxpPXIoMTUxKSxzPXIoMTYyKSxvPXIoMTY4KSxjPXIoMjEyKSxsPXIoMTc2KSxoPXIoMTgwKSx1PXIoMTUwKTtmdW5jdGlvbiBkKGUsdCxyLG4pe3JldHVybihlPXQrZSpyKTwwP2U9MDplPm4mJihlPW4pLGV9ZnVuY3Rpb24gZihlLHQscixuLGEsaSl7Y29uc3Qgcz1hKmk7bGV0IG87bz10PD04P25ldyBVaW50OEFycmF5KHMpOnQ8PTE2P25ldyBVaW50MTZBcnJheShzKTpuZXcgVWludDMyQXJyYXkocyk7Y29uc3QgYz1yL2EsbD1uL2k7bGV0IGgsdSxkLGYsZz0wO2NvbnN0IHA9bmV3IFVpbnQxNkFycmF5KGEpLG09cjtmb3IoaD0wO2g8YTtoKyspcFtoXT1NYXRoLmZsb29yKGgqYyk7Zm9yKGg9MDtoPGk7aCsrKWZvcihkPU1hdGguZmxvb3IoaCpsKSptLHU9MDt1PGE7dSsrKWY9ZCtwW3VdLG9bZysrXT1lW2ZdO3JldHVybiBvfWNsYXNzIGd7Y29uc3RydWN0b3IoZSl7bGV0e3hyZWY6dCxyZXM6cixpbWFnZTphLGlzSW5saW5lOm89ITEsc21hc2s6Yz1udWxsLG1hc2s6bD1udWxsLGlzTWFzazpkPSExLHBkZkZ1bmN0aW9uRmFjdG9yeTpmLGxvY2FsQ29sb3JTcGFjZUNhY2hlOnB9PWU7dGhpcy5pbWFnZT1hO2NvbnN0IG09YS5kaWN0LGI9bS5nZXQoIkYiLCJGaWx0ZXIiKTtsZXQgeTtpZihiIGluc3RhbmNlb2YgdS5OYW1lKXk9Yi5uYW1lO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShiKSl7Y29uc3QgZT10LmZldGNoSWZSZWYoYlswXSk7ZSBpbnN0YW5jZW9mIHUuTmFtZSYmKHk9ZS5uYW1lKX1zd2l0Y2goeSl7Y2FzZSJKUFhEZWNvZGUiOmNvbnN0IGU9bmV3IGguSnB4SW1hZ2U7ZS5wYXJzZUltYWdlUHJvcGVydGllcyhhLnN0cmVhbSksYS5zdHJlYW0ucmVzZXQoKSxhLndpZHRoPWUud2lkdGgsYS5oZWlnaHQ9ZS5oZWlnaHQsYS5iaXRzUGVyQ29tcG9uZW50PWUuYml0c1BlckNvbXBvbmVudCxhLm51bUNvbXBzPWUuY29tcG9uZW50c0NvdW50O2JyZWFrO2Nhc2UiSkJJRzJEZWNvZGUiOmEuYml0c1BlckNvbXBvbmVudD0xLGEubnVtQ29tcHM9MX1sZXQgdz1tLmdldCgiVyIsIldpZHRoIiksdj1tLmdldCgiSCIsIkhlaWdodCIpO2lmKE51bWJlci5pc0ludGVnZXIoYS53aWR0aCkmJmEud2lkdGg+MCYmTnVtYmVyLmlzSW50ZWdlcihhLmhlaWdodCkmJmEuaGVpZ2h0PjAmJihhLndpZHRoIT09d3x8YS5oZWlnaHQhPT12KSYmKCgwLG4ud2FybikoIlBERkltYWdlIC0gdXNpbmcgdGhlIFdpZHRoL0hlaWdodCBvZiB0aGUgaW1hZ2UgZGF0YSwgcmF0aGVyIHRoYW4gdGhlIGltYWdlIGRpY3Rpb25hcnkuIiksdz1hLndpZHRoLHY9YS5oZWlnaHQpLHc8MXx8djwxKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJJbnZhbGlkIGltYWdlIHdpZHRoOiAiLmNvbmNhdCh3LCIgb3IgaGVpZ2h0OiAiKS5jb25jYXQodikpO3RoaXMud2lkdGg9dyx0aGlzLmhlaWdodD12LHRoaXMuaW50ZXJwb2xhdGU9bS5nZXQoIkkiLCJJbnRlcnBvbGF0ZSIpLHRoaXMuaW1hZ2VNYXNrPW0uZ2V0KCJJTSIsIkltYWdlTWFzayIpfHwhMSx0aGlzLm1hdHRlPW0uZ2V0KCJNYXR0ZSIpfHwhMTtsZXQgeD1hLmJpdHNQZXJDb21wb25lbnQ7aWYoIXgmJih4PW0uZ2V0KCJCUEMiLCJCaXRzUGVyQ29tcG9uZW50IiksIXgpKXtpZighdGhpcy5pbWFnZU1hc2spdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkJpdHMgcGVyIGNvbXBvbmVudCBtaXNzaW5nIGluIGltYWdlOiAiLmNvbmNhdCh0aGlzLmltYWdlTWFzaykpO3g9MX1pZih0aGlzLmJwYz14LCF0aGlzLmltYWdlTWFzayl7bGV0IGU9bS5nZXRSYXcoIkNTIil8fG0uZ2V0UmF3KCJDb2xvclNwYWNlIik7aWYoIWUpc3dpdGNoKCgwLG4uaW5mbykoIkpQWCBpbWFnZXMgKHdoaWNoIGRvIG5vdCByZXF1aXJlIGNvbG9yIHNwYWNlcykiKSxhLm51bUNvbXBzKXtjYXNlIDE6ZT11Lk5hbWUuZ2V0KCJEZXZpY2VHcmF5Iik7YnJlYWs7Y2FzZSAzOmU9dS5OYW1lLmdldCgiRGV2aWNlUkdCIik7YnJlYWs7Y2FzZSA0OmU9dS5OYW1lLmdldCgiRGV2aWNlQ01ZSyIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJKUFggaW1hZ2VzIHdpdGggIi5jb25jYXQoYS5udW1Db21wcywiIGNvbG9yIGNvbXBvbmVudHMgbm90IHN1cHBvcnRlZC4iKSl9dGhpcy5jb2xvclNwYWNlPXMuQ29sb3JTcGFjZS5wYXJzZSh7Y3M6ZSx4cmVmOnQscmVzb3VyY2VzOm8/cjpudWxsLHBkZkZ1bmN0aW9uRmFjdG9yeTpmLGxvY2FsQ29sb3JTcGFjZUNhY2hlOnB9KSx0aGlzLm51bUNvbXBzPXRoaXMuY29sb3JTcGFjZS5udW1Db21wc31pZih0aGlzLmRlY29kZT1tLmdldEFycmF5KCJEIiwiRGVjb2RlIiksdGhpcy5uZWVkc0RlY29kZT0hMSx0aGlzLmRlY29kZSYmKHRoaXMuY29sb3JTcGFjZSYmIXRoaXMuY29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUodGhpcy5kZWNvZGUseCl8fGQmJiFzLkNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLDEpKSl7dmFyIFM7dGhpcy5uZWVkc0RlY29kZT0hMDtjb25zdCBlPSgxPDx4KS0xO3RoaXMuZGVjb2RlQ29lZmZpY2llbnRzPVtdLHRoaXMuZGVjb2RlQWRkZW5kcz1bXTtjb25zdCB0PSJJbmRleGVkIj09PShudWxsPT09KFM9dGhpcy5jb2xvclNwYWNlKXx8dm9pZCAwPT09Uz92b2lkIDA6Uy5uYW1lKTtmb3IobGV0IHI9MCxuPTA7cjx0aGlzLmRlY29kZS5sZW5ndGg7cis9MiwrK24pe2NvbnN0IGE9dGhpcy5kZWNvZGVbcl0saT10aGlzLmRlY29kZVtyKzFdO3RoaXMuZGVjb2RlQ29lZmZpY2llbnRzW25dPXQ/KGktYSkvZTppLWEsdGhpcy5kZWNvZGVBZGRlbmRzW25dPXQ/YTplKmF9fWM/dGhpcy5zbWFzaz1uZXcgZyh7eHJlZjp0LHJlczpyLGltYWdlOmMsaXNJbmxpbmU6byxwZGZGdW5jdGlvbkZhY3Rvcnk6Zixsb2NhbENvbG9yU3BhY2VDYWNoZTpwfSk6bCYmKGwgaW5zdGFuY2VvZiBpLkJhc2VTdHJlYW0/bC5kaWN0LmdldCgiSU0iLCJJbWFnZU1hc2siKT90aGlzLm1hc2s9bmV3IGcoe3hyZWY6dCxyZXM6cixpbWFnZTpsLGlzSW5saW5lOm8saXNNYXNrOiEwLHBkZkZ1bmN0aW9uRmFjdG9yeTpmLGxvY2FsQ29sb3JTcGFjZUNhY2hlOnB9KTooMCxuLndhcm4pKCJJZ25vcmluZyAvTWFzayBpbiBpbWFnZSB3aXRob3V0IC9JbWFnZU1hc2suIik6dGhpcy5tYXNrPWwpfXN0YXRpYyBhc3luYyBidWlsZEltYWdlKGUpe2xldHt4cmVmOnQscmVzOnIsaW1hZ2U6YSxpc0lubGluZTpzPSExLHBkZkZ1bmN0aW9uRmFjdG9yeTpvLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9PWU7Y29uc3QgbD1hO2xldCBoPW51bGwsdT1udWxsO2NvbnN0IGQ9YS5kaWN0LmdldCgiU01hc2siKSxmPWEuZGljdC5nZXQoIk1hc2siKTtyZXR1cm4gZD9kIGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtP2g9ZDooMCxuLndhcm4pKCJVbnN1cHBvcnRlZCAvU01hc2sgZm9ybWF0LiIpOmYmJihmIGluc3RhbmNlb2YgaS5CYXNlU3RyZWFtfHxBcnJheS5pc0FycmF5KGYpP3U9ZjooMCxuLndhcm4pKCJVbnN1cHBvcnRlZCAvTWFzayBmb3JtYXQuIikpLG5ldyBnKHt4cmVmOnQscmVzOnIsaW1hZ2U6bCxpc0lubGluZTpzLHNtYXNrOmgsbWFzazp1LHBkZkZ1bmN0aW9uRmFjdG9yeTpvLGxvY2FsQ29sb3JTcGFjZUNhY2hlOmN9KX1zdGF0aWMgY3JlYXRlUmF3TWFzayhlKXtsZXR7aW1nQXJyYXk6dCx3aWR0aDpyLGhlaWdodDpuLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOmEsaW52ZXJzZURlY29kZTppLGludGVycG9sYXRlOnN9PWU7Y29uc3Qgbz0ocis3Pj4zKSpuLGM9dC5ieXRlTGVuZ3RoO2xldCBsLGg7aWYoIWF8fGkmJm8hPT1jP2k/KGw9bmV3IFVpbnQ4QXJyYXkobyksbC5zZXQodCksbC5maWxsKDI1NSxjKSk6bD1uZXcgVWludDhBcnJheSh0KTpsPXQsaSlmb3IoaD0wO2g8YztoKyspbFtoXV49MjU1O3JldHVybntkYXRhOmwsd2lkdGg6cixoZWlnaHQ6bixpbnRlcnBvbGF0ZTpzfX1zdGF0aWMgYXN5bmMgY3JlYXRlTWFzayhlKXtsZXR7aW1nQXJyYXk6dCx3aWR0aDpyLGhlaWdodDppLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOnMsaW52ZXJzZURlY29kZTpvLGludGVycG9sYXRlOmwsaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6aD0hMX09ZTtjb25zdCB1PTE9PT1yJiYxPT09aSYmbz09PSgwPT09dC5sZW5ndGh8fCEhKDEyOCZ0WzBdKSk7aWYodSlyZXR1cm57aXNTaW5nbGVPcGFxdWVQaXhlbDp1fTtpZihoKXtpZihjLkltYWdlUmVzaXplci5uZWVkc1RvQmVSZXNpemVkKHIsaSkpe2NvbnN0IGU9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHIqaSo0KTtyZXR1cm4oMCxhLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7c3JjOnQsZGVzdDplLHdpZHRoOnIsaGVpZ2h0Omksbm9uQmxhY2tDb2xvcjowLGludmVyc2VEZWNvZGU6b30pLGMuSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKHtraW5kOm4uSW1hZ2VLaW5kLlJHQkFfMzJCUFAsZGF0YTplLHdpZHRoOnIsaGVpZ2h0OmksaW50ZXJwb2xhdGU6bH0pfWNvbnN0IGU9bmV3IE9mZnNjcmVlbkNhbnZhcyhyLGkpLHM9ZS5nZXRDb250ZXh0KCIyZCIpLGg9cy5jcmVhdGVJbWFnZURhdGEocixpKTtyZXR1cm4oMCxhLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7c3JjOnQsZGVzdDpoLmRhdGEsd2lkdGg6cixoZWlnaHQ6aSxub25CbGFja0NvbG9yOjAsaW52ZXJzZURlY29kZTpvfSkscy5wdXRJbWFnZURhdGEoaCwwLDApLHtkYXRhOm51bGwsd2lkdGg6cixoZWlnaHQ6aSxpbnRlcnBvbGF0ZTpsLGJpdG1hcDplLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpfX1yZXR1cm4gdGhpcy5jcmVhdGVSYXdNYXNrKHtpbWdBcnJheTp0LHdpZHRoOnIsaGVpZ2h0OmksaW52ZXJzZURlY29kZTpvLGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOnMsaW50ZXJwb2xhdGU6bH0pfWdldCBkcmF3V2lkdGgoKXt2YXIgZSx0O3JldHVybiBNYXRoLm1heCh0aGlzLndpZHRoLChudWxsPT09KGU9dGhpcy5zbWFzayl8fHZvaWQgMD09PWU/dm9pZCAwOmUud2lkdGgpfHwwLChudWxsPT09KHQ9dGhpcy5tYXNrKXx8dm9pZCAwPT09dD92b2lkIDA6dC53aWR0aCl8fDApfWdldCBkcmF3SGVpZ2h0KCl7dmFyIGUsdDtyZXR1cm4gTWF0aC5tYXgodGhpcy5oZWlnaHQsKG51bGw9PT0oZT10aGlzLnNtYXNrKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5oZWlnaHQpfHwwLChudWxsPT09KHQ9dGhpcy5tYXNrKXx8dm9pZCAwPT09dD92b2lkIDA6dC5oZWlnaHQpfHwwKX1kZWNvZGVCdWZmZXIoZSl7Y29uc3QgdD10aGlzLmJwYyxyPXRoaXMubnVtQ29tcHMsbj10aGlzLmRlY29kZUFkZGVuZHMsYT10aGlzLmRlY29kZUNvZWZmaWNpZW50cyxpPSgxPDx0KS0xO2xldCBzLG87aWYoMT09PXQpe2ZvcihzPTAsbz1lLmxlbmd0aDtzPG87cysrKWVbc109KyFlW3NdO3JldHVybn1sZXQgYz0wO2ZvcihzPTAsbz10aGlzLndpZHRoKnRoaXMuaGVpZ2h0O3M8bztzKyspZm9yKGxldCB0PTA7dDxyO3QrKyllW2NdPWQoZVtjXSxuW3RdLGFbdF0saSksYysrfWdldENvbXBvbmVudHMoZSl7Y29uc3QgdD10aGlzLmJwYztpZig4PT09dClyZXR1cm4gZTtjb25zdCByPXRoaXMud2lkdGgsbj10aGlzLmhlaWdodCxhPXRoaXMubnVtQ29tcHMsaT1yKm4qYTtsZXQgcyxvPTA7cz10PD04P25ldyBVaW50OEFycmF5KGkpOnQ8PTE2P25ldyBVaW50MTZBcnJheShpKTpuZXcgVWludDMyQXJyYXkoaSk7Y29uc3QgYz1yKmEsbD0oMTw8dCktMTtsZXQgaCx1LGQ9MDtpZigxPT09dCl7bGV0IHQscixhO2ZvcihsZXQgaT0wO2k8bjtpKyspe2ZvcihyPWQrKC04JmMpLGE9ZCtjO2Q8cjspdT1lW28rK10sc1tkXT11Pj43JjEsc1tkKzFdPXU+PjYmMSxzW2QrMl09dT4+NSYxLHNbZCszXT11Pj40JjEsc1tkKzRdPXU+PjMmMSxzW2QrNV09dT4+MiYxLHNbZCs2XT11Pj4xJjEsc1tkKzddPTEmdSxkKz04O2lmKGQ8YSlmb3IodT1lW28rK10sdD0xMjg7ZDxhOylzW2QrK109KyEhKHUmdCksdD4+PTF9fWVsc2V7bGV0IHI9MDtmb3IodT0wLGQ9MCxoPWk7ZDxoOysrZCl7Zm9yKGQlYz09MCYmKHU9MCxyPTApO3I8dDspdT11PDw4fGVbbysrXSxyKz04O2NvbnN0IG49ci10O2xldCBhPXU+Pm47YTwwP2E9MDphPmwmJihhPWwpLHNbZF09YSx1Jj0oMTw8biktMSxyPW59fXJldHVybiBzfWZpbGxPcGFjaXR5KGUsdCxyLGEsaSl7Y29uc3Qgcz10aGlzLnNtYXNrLG89dGhpcy5tYXNrO2xldCBjLGwsaCx1LGQscDtpZihzKWw9cy53aWR0aCxoPXMuaGVpZ2h0LGM9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGwqaCkscy5maWxsR3JheUJ1ZmZlcihjKSxsPT09dCYmaD09PXJ8fChjPWYoYyxzLmJwYyxsLGgsdCxyKSk7ZWxzZSBpZihvKWlmKG8gaW5zdGFuY2VvZiBnKXtmb3IobD1vLndpZHRoLGg9by5oZWlnaHQsYz1uZXcgVWludDhDbGFtcGVkQXJyYXkobCpoKSxvLm51bUNvbXBzPTEsby5maWxsR3JheUJ1ZmZlcihjKSx1PTAsZD1sKmg7dTxkOysrdSljW3VdPTI1NS1jW3VdO2w9PT10JiZoPT09cnx8KGM9ZihjLG8uYnBjLGwsaCx0LHIpKX1lbHNle2lmKCFBcnJheS5pc0FycmF5KG8pKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJVbmtub3duIG1hc2sgZm9ybWF0LiIpO3tjPW5ldyBVaW50OENsYW1wZWRBcnJheSh0KnIpO2NvbnN0IGU9dGhpcy5udW1Db21wcztmb3IodT0wLGQ9dCpyO3U8ZDsrK3Upe2xldCB0PTA7Y29uc3Qgcj11KmU7Zm9yKHA9MDtwPGU7KytwKXtjb25zdCBlPWlbcitwXSxuPTIqcDtpZihlPG9bbl18fGU+b1tuKzFdKXt0PTI1NTticmVha319Y1t1XT10fX19aWYoYylmb3IodT0wLHA9MyxkPXQqYTt1PGQ7Kyt1LHArPTQpZVtwXT1jW3VdO2Vsc2UgZm9yKHU9MCxwPTMsZD10KmE7dTxkOysrdSxwKz00KWVbcF09MjU1fXVuZG9QcmVibGVuZChlLHQscil7dmFyIG47Y29uc3QgYT1udWxsPT09KG49dGhpcy5zbWFzayl8fHZvaWQgMD09PW4/dm9pZCAwOm4ubWF0dGU7aWYoIWEpcmV0dXJuO2NvbnN0IGk9dGhpcy5jb2xvclNwYWNlLmdldFJnYihhLDApLHM9aVswXSxvPWlbMV0sYz1pWzJdLGw9dCpyKjQ7Zm9yKGxldCB0PTA7dDxsO3QrPTQpe2NvbnN0IHI9ZVt0KzNdO2lmKDA9PT1yKXtlW3RdPTI1NSxlW3QrMV09MjU1LGVbdCsyXT0yNTU7Y29udGludWV9Y29uc3Qgbj0yNTUvcjtlW3RdPShlW3RdLXMpKm4rcyxlW3QrMV09KGVbdCsxXS1vKSpuK28sZVt0KzJdPShlW3QrMl0tYykqbitjfX1hc3luYyBjcmVhdGVJbWFnZURhdGEoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtjb25zdCByPXRoaXMuZHJhd1dpZHRoLGE9dGhpcy5kcmF3SGVpZ2h0LGk9e3dpZHRoOnIsaGVpZ2h0OmEsaW50ZXJwb2xhdGU6dGhpcy5pbnRlcnBvbGF0ZSxraW5kOjAsZGF0YTpudWxsfSxzPXRoaXMubnVtQ29tcHMsbz10aGlzLndpZHRoLGg9dGhpcy5oZWlnaHQsdT10aGlzLmJwYyxkPW8qcyp1Kzc+PjMsZj10JiZjLkltYWdlUmVzaXplci5uZWVkc1RvQmVSZXNpemVkKHIsYSk7aWYoIWUpe2xldCBlO2lmKCJEZXZpY2VHcmF5Ij09PXRoaXMuY29sb3JTcGFjZS5uYW1lJiYxPT09dT9lPW4uSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOiJEZXZpY2VSR0IiIT09dGhpcy5jb2xvclNwYWNlLm5hbWV8fDghPT11fHx0aGlzLm5lZWRzRGVjb2RlfHwoZT1uLkltYWdlS2luZC5SR0JfMjRCUFApLGUmJiF0aGlzLnNtYXNrJiYhdGhpcy5tYXNrJiZyPT09byYmYT09PWgpe2NvbnN0IHM9dGhpcy5nZXRJbWFnZUJ5dGVzKGgqZCx7fSk7aWYodClyZXR1cm4gZj9jLkltYWdlUmVzaXplci5jcmVhdGVJbWFnZSh7ZGF0YTpzLGtpbmQ6ZSx3aWR0aDpyLGhlaWdodDphLGludGVycG9sYXRlOnRoaXMuaW50ZXJwb2xhdGV9LHRoaXMubmVlZHNEZWNvZGUpOnRoaXMuY3JlYXRlQml0bWFwKGUsbyxoLHMpO2lmKGkua2luZD1lLGkuZGF0YT1zLHRoaXMubmVlZHNEZWNvZGUpeygwLG4uYXNzZXJ0KShlPT09bi5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAsIlBERkltYWdlLmNyZWF0ZUltYWdlRGF0YTogVGhlIGltYWdlIG11c3QgYmUgZ3JheXNjYWxlLiIpO2NvbnN0IHQ9aS5kYXRhO2ZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKyl0W2VdXj0yNTV9cmV0dXJuIGl9aWYodGhpcy5pbWFnZSBpbnN0YW5jZW9mIGwuSnBlZ1N0cmVhbSYmIXRoaXMuc21hc2smJiF0aGlzLm1hc2smJiF0aGlzLm5lZWRzRGVjb2RlKXtsZXQgZT1oKmQ7aWYodCYmIWYpe2xldCB0PSExO3N3aXRjaCh0aGlzLmNvbG9yU3BhY2UubmFtZSl7Y2FzZSJEZXZpY2VHcmF5IjplKj00LHQ9ITA7YnJlYWs7Y2FzZSJEZXZpY2VSR0IiOmU9ZS8zKjQsdD0hMDticmVhaztjYXNlIkRldmljZUNNWUsiOnQ9ITB9aWYodCl7Y29uc3QgdD10aGlzLmdldEltYWdlQnl0ZXMoZSx7ZHJhd1dpZHRoOnIsZHJhd0hlaWdodDphLGZvcmNlUkdCQTohMH0pO3JldHVybiB0aGlzLmNyZWF0ZUJpdG1hcChuLkltYWdlS2luZC5SR0JBXzMyQlBQLHIsYSx0KX19ZWxzZSBzd2l0Y2godGhpcy5jb2xvclNwYWNlLm5hbWUpe2Nhc2UiRGV2aWNlR3JheSI6ZSo9MztjYXNlIkRldmljZVJHQiI6Y2FzZSJEZXZpY2VDTVlLIjpyZXR1cm4gaS5raW5kPW4uSW1hZ2VLaW5kLlJHQl8yNEJQUCxpLmRhdGE9dGhpcy5nZXRJbWFnZUJ5dGVzKGUse2RyYXdXaWR0aDpyLGRyYXdIZWlnaHQ6YSxmb3JjZVJHQjohMH0pLGY/Yy5JbWFnZVJlc2l6ZXIuY3JlYXRlSW1hZ2UoaSk6aX19fWNvbnN0IGc9dGhpcy5nZXRJbWFnZUJ5dGVzKGgqZCx7aW50ZXJuYWw6ITB9KSxwPTB8Zy5sZW5ndGgvZCphL2gsbT10aGlzLmdldENvbXBvbmVudHMoZyk7bGV0IGIseSx3LHYseCxTO3JldHVybiB0JiYhZiYmKHc9bmV3IE9mZnNjcmVlbkNhbnZhcyhyLGEpLHY9dy5nZXRDb250ZXh0KCIyZCIpLHg9di5jcmVhdGVJbWFnZURhdGEocixhKSxTPXguZGF0YSksaS5raW5kPW4uSW1hZ2VLaW5kLlJHQkFfMzJCUFAsZXx8dGhpcy5zbWFza3x8dGhpcy5tYXNrPyh0JiYhZnx8KFM9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHIqYSo0KSksYj0xLHk9ITAsdGhpcy5maWxsT3BhY2l0eShTLHIsYSxwLG0pKTooIXR8fGY/KGkua2luZD1uLkltYWdlS2luZC5SR0JfMjRCUFAsUz1uZXcgVWludDhDbGFtcGVkQXJyYXkociphKjMpLGI9MCk6KG5ldyBVaW50MzJBcnJheShTLmJ1ZmZlcikuZmlsbChuLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuPzQyNzgxOTAwODA6MjU1KSxiPTEpLHk9ITEpLHRoaXMubmVlZHNEZWNvZGUmJnRoaXMuZGVjb2RlQnVmZmVyKG0pLHRoaXMuY29sb3JTcGFjZS5maWxsUmdiKFMsbyxoLHIsYSxwLHUsbSxiKSx5JiZ0aGlzLnVuZG9QcmVibGVuZChTLHIscCksdCYmIWY/KHYucHV0SW1hZ2VEYXRhKHgsMCwwKSx7ZGF0YTpudWxsLHdpZHRoOnIsaGVpZ2h0OmEsYml0bWFwOncudHJhbnNmZXJUb0ltYWdlQml0bWFwKCksaW50ZXJwb2xhdGU6dGhpcy5pbnRlcnBvbGF0ZX0pOihpLmRhdGE9UyxmP2MuSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKGkpOmkpfWZpbGxHcmF5QnVmZmVyKGUpe2NvbnN0IHQ9dGhpcy5udW1Db21wcztpZigxIT09dCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiUmVhZGluZyBncmF5IHNjYWxlIGZyb20gYSBjb2xvciBpbWFnZTogIi5jb25jYXQodCkpO2NvbnN0IHI9dGhpcy53aWR0aCxhPXRoaXMuaGVpZ2h0LGk9dGhpcy5icGMscz1yKnQqaSs3Pj4zLG89dGhpcy5nZXRJbWFnZUJ5dGVzKGEqcyx7aW50ZXJuYWw6ITB9KSxjPXRoaXMuZ2V0Q29tcG9uZW50cyhvKTtsZXQgbCxoO2lmKDE9PT1pKXtpZihoPXIqYSx0aGlzLm5lZWRzRGVjb2RlKWZvcihsPTA7bDxoOysrbCllW2xdPWNbbF0tMSYyNTU7ZWxzZSBmb3IobD0wO2w8aDsrK2wpZVtsXT0yNTUmLWNbbF07cmV0dXJufXRoaXMubmVlZHNEZWNvZGUmJnRoaXMuZGVjb2RlQnVmZmVyKGMpLGg9ciphO2NvbnN0IHU9MjU1LygoMTw8aSktMSk7Zm9yKGw9MDtsPGg7KytsKWVbbF09dSpjW2xdfWNyZWF0ZUJpdG1hcChlLHQscixpKXtjb25zdCBzPW5ldyBPZmZzY3JlZW5DYW52YXModCxyKSxvPXMuZ2V0Q29udGV4dCgiMmQiKTtsZXQgYztyZXR1cm4gZT09PW4uSW1hZ2VLaW5kLlJHQkFfMzJCUFA/Yz1uZXcgSW1hZ2VEYXRhKGksdCxyKTooYz1vLmNyZWF0ZUltYWdlRGF0YSh0LHIpLCgwLGEuY29udmVydFRvUkdCQSkoe2tpbmQ6ZSxzcmM6aSxkZXN0Om5ldyBVaW50MzJBcnJheShjLmRhdGEuYnVmZmVyKSx3aWR0aDp0LGhlaWdodDpyLGludmVyc2VEZWNvZGU6dGhpcy5uZWVkc0RlY29kZX0pKSxvLnB1dEltYWdlRGF0YShjLDAsMCkse2RhdGE6bnVsbCx3aWR0aDp0LGhlaWdodDpyLGJpdG1hcDpzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpLGludGVycG9sYXRlOnRoaXMuaW50ZXJwb2xhdGV9fWdldEltYWdlQnl0ZXMoZSx0KXtsZXR7ZHJhd1dpZHRoOnIsZHJhd0hlaWdodDphLGZvcmNlUkdCQTppPSExLGZvcmNlUkdCOnM9ITEsaW50ZXJuYWw6Yz0hMX09dDt0aGlzLmltYWdlLnJlc2V0KCksdGhpcy5pbWFnZS5kcmF3V2lkdGg9cnx8dGhpcy53aWR0aCx0aGlzLmltYWdlLmRyYXdIZWlnaHQ9YXx8dGhpcy5oZWlnaHQsdGhpcy5pbWFnZS5mb3JjZVJHQkE9ISFpLHRoaXMuaW1hZ2UuZm9yY2VSR0I9ISFzO2NvbnN0IGw9dGhpcy5pbWFnZS5nZXRCeXRlcyhlKTtyZXR1cm4gY3x8dGhpcy5pbWFnZSBpbnN0YW5jZW9mIG8uRGVjb2RlU3RyZWFtP2w6KCgwLG4uYXNzZXJ0KShsIGluc3RhbmNlb2YgVWludDhBcnJheSwnUERGSW1hZ2UuZ2V0SW1hZ2VCeXRlczogVW5zdXBwb3J0ZWQgImltYWdlQnl0ZXMiIHR5cGUuJyksbmV3IFVpbnQ4QXJyYXkobCkpfX10LlBERkltYWdlPWd9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5pbmNyZW1lbnRhbFVwZGF0ZT1hc3luYyBmdW5jdGlvbihlKXtsZXR7b3JpZ2luYWxEYXRhOnQseHJlZkluZm86cixuZXdSZWZzOm8seHJlZjp1PW51bGwsaGFzWGZhOmQ9ITEseGZhRGF0YXNldHNSZWY6cD1udWxsLGhhc1hmYURhdGFzZXRzRW50cnk6bT0hMSxuZWVkQXBwZWFyYW5jZXM6YixhY3JvRm9ybVJlZjp5PW51bGwsYWNyb0Zvcm06dz1udWxsLHhmYURhdGE6dj1udWxsfT1lO2F3YWl0IGFzeW5jIGZ1bmN0aW9uKGUpe2xldHt4cmVmOnQsYWNyb0Zvcm06cixhY3JvRm9ybVJlZjppLGhhc1hmYTpzLGhhc1hmYURhdGFzZXRzRW50cnk6byx4ZmFEYXRhc2V0c1JlZjpjLG5lZWRBcHBlYXJhbmNlczpoLG5ld1JlZnM6dX09ZTtpZighc3x8b3x8Y3x8KDAsbi53YXJuKSgiWEZBIC0gQ2Fubm90IHNhdmUgaXQiKSwhaCYmKCFzfHwhY3x8bykpcmV0dXJuO2NvbnN0IGQ9bmV3IGEuRGljdCh0KTtmb3IoY29uc3QgZSBvZiByLmdldEtleXMoKSlkLnNldChlLHIuZ2V0UmF3KGUpKTtpZihzJiYhbyl7Y29uc3QgZT1yLmdldCgiWEZBIikuc2xpY2UoKTtlLnNwbGljZSgyLDAsImRhdGFzZXRzIiksZS5zcGxpY2UoMywwLGMpLGQuc2V0KCJYRkEiLGUpfWgmJmQuc2V0KCJOZWVkQXBwZWFyYW5jZXMiLCEwKTtjb25zdCBmPXQuZW5jcnlwdDtsZXQgZz1udWxsO2YmJihnPWYuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKGkubnVtLGkuZ2VuKSk7Y29uc3QgcD1bXTthd2FpdCBsKGksZCxwLGcpLHUucHVzaCh7cmVmOmksZGF0YTpwLmpvaW4oIiIpfSl9KHt4cmVmOnUsYWNyb0Zvcm06dyxhY3JvRm9ybVJlZjp5LGhhc1hmYTpkLGhhc1hmYURhdGFzZXRzRW50cnk6bSx4ZmFEYXRhc2V0c1JlZjpwLG5lZWRBcHBlYXJhbmNlczpiLG5ld1JlZnM6b30pLGQmJmZ1bmN0aW9uKGUpe2xldHt4ZmFEYXRhOnQseGZhRGF0YXNldHNSZWY6cixuZXdSZWZzOmEseHJlZjpvfT1lO251bGw9PT10JiYodD1mdW5jdGlvbihlLHQpe2NvbnN0IHI9bmV3IHMuU2ltcGxlWE1MUGFyc2VyKHtoYXNBdHRyaWJ1dGVzOiEwfSkucGFyc2VGcm9tU3RyaW5nKGUpO2Zvcihjb25zdHt4ZmE6ZX1vZiB0KXtpZighZSljb250aW51ZTtjb25zdHtwYXRoOnQsdmFsdWU6YX09ZTtpZighdCljb250aW51ZTtjb25zdCBvPSgwLGkucGFyc2VYRkFQYXRoKSh0KTtsZXQgYz1yLmRvY3VtZW50RWxlbWVudC5zZWFyY2hOb2RlKG8sMCk7IWMmJm8ubGVuZ3RoPjEmJihjPXIuZG9jdW1lbnRFbGVtZW50LnNlYXJjaE5vZGUoW28uYXQoLTEpXSwwKSksYz9jLmNoaWxkTm9kZXM9QXJyYXkuaXNBcnJheShhKT9hLm1hcCgoZT0+bmV3IHMuU2ltcGxlRE9NTm9kZSgidmFsdWUiLGUpKSk6W25ldyBzLlNpbXBsZURPTU5vZGUoIiN0ZXh0IixhKV06KDAsbi53YXJuKSgiTm9kZSBub3QgZm91bmQgZm9yIHBhdGg6ICIuY29uY2F0KHQpKX1jb25zdCBhPVtdO3JldHVybiByLmRvY3VtZW50RWxlbWVudC5kdW1wKGEpLGEuam9pbigiIil9KG8uZmV0Y2hJZlJlZihyKS5nZXRTdHJpbmcoKSxhKSk7Y29uc3QgYz1vLmVuY3J5cHQ7YyYmKHQ9Yy5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0oci5udW0sci5nZW4pLmVuY3J5cHRTdHJpbmcodCkpO2NvbnN0IGw9IiIuY29uY2F0KHIubnVtLCIgIikuY29uY2F0KHIuZ2VuLCIgb2JqXG48PCAvVHlwZSAvRW1iZWRkZWRGaWxlIC9MZW5ndGggIikuY29uY2F0KHQubGVuZ3RoLCI+Plxuc3RyZWFtXG4iKSt0KyJcbmVuZHN0cmVhbVxuZW5kb2JqXG4iO2EucHVzaCh7cmVmOnIsZGF0YTpsfSl9KHt4ZmFEYXRhOnYseGZhRGF0YXNldHNSZWY6cCxuZXdSZWZzOm8seHJlZjp1fSk7Y29uc3QgeD1uZXcgYS5EaWN0KG51bGwpLFM9ci5uZXdSZWY7bGV0IEEsaztjb25zdCBDPXQuYXQoLTEpOzEwPT09Q3x8MTM9PT1DPyhBPVtdLGs9dC5sZW5ndGgpOihBPVsiXG4iXSxrPXQubGVuZ3RoKzEpLHguc2V0KCJTaXplIixTLm51bSsxKSx4LnNldCgiUHJldiIsci5zdGFydFhSZWYpLHguc2V0KCJUeXBlIixhLk5hbWUuZ2V0KCJYUmVmIikpLG51bGwhPT1yLnJvb3RSZWYmJnguc2V0KCJSb290IixyLnJvb3RSZWYpLG51bGwhPT1yLmluZm9SZWYmJnguc2V0KCJJbmZvIixyLmluZm9SZWYpLG51bGwhPT1yLmVuY3J5cHRSZWYmJnguc2V0KCJFbmNyeXB0IixyLmVuY3J5cHRSZWYpLG8ucHVzaCh7cmVmOlMsZGF0YToiIn0pLG89by5zb3J0KCgoZSx0KT0+ZS5yZWYubnVtLXQucmVmLm51bSkpO2NvbnN0IE89W1swLDEsNjU1MzVdXSxGPVswLDFdO2xldCBJPTA7Zm9yKGNvbnN0e3JlZjplLGRhdGE6dH1vZiBvKUk9TWF0aC5tYXgoSSxrKSxPLnB1c2goWzEsayxNYXRoLm1pbihlLmdlbiw2NTUzNSldKSxrKz10Lmxlbmd0aCxGLnB1c2goZS5udW0sMSksQS5wdXNoKHQpO2lmKHguc2V0KCJJbmRleCIsRiksQXJyYXkuaXNBcnJheShyLmZpbGVJZHMpJiZyLmZpbGVJZHMubGVuZ3RoPjApe2NvbnN0IGU9ZnVuY3Rpb24oZSx0KXtjb25zdCByPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpLGE9dC5maWxlbmFtZXx8IiIsaT1bci50b1N0cmluZygpLGEsZS50b1N0cmluZygpXTtsZXQgcz1pLnJlZHVjZSgoKGUsdCk9PmUrdC5sZW5ndGgpLDApO2Zvcihjb25zdCBlIG9mIE9iamVjdC52YWx1ZXModC5pbmZvKSlpLnB1c2goZSkscys9ZS5sZW5ndGg7Y29uc3Qgbz1uZXcgVWludDhBcnJheShzKTtsZXQgbD0wO2Zvcihjb25zdCBlIG9mIGkpZyhlLGwsbyksbCs9ZS5sZW5ndGg7cmV0dXJuKDAsbi5ieXRlc1RvU3RyaW5nKSgoMCxjLmNhbGN1bGF0ZU1ENSkobykpfShrLHIpO3guc2V0KCJJRCIsW3IuZmlsZUlkc1swXSxlXSl9Y29uc3QgVD1bMSxNYXRoLmNlaWwoTWF0aC5sb2cyKEkpLzgpLDJdLE09KFRbMF0rVFsxXStUWzJdKSpPLmxlbmd0aDt4LnNldCgiVyIsVCkseC5zZXQoIkxlbmd0aCIsTSksQS5wdXNoKCIiLmNvbmNhdChTLm51bSwiICIpLmNvbmNhdChTLmdlbiwiIG9ialxuIikpLGF3YWl0IGgoeCxBLG51bGwpLEEucHVzaCgiIHN0cmVhbVxuIik7Y29uc3QgRT1BLnJlZHVjZSgoKGUsdCk9PmUrdC5sZW5ndGgpLDApLFA9IlxuZW5kc3RyZWFtXG5lbmRvYmpcbnN0YXJ0eHJlZlxuIi5jb25jYXQoaywiXG4lJUVPRlxuIiksUj1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCtFK00rUC5sZW5ndGgpO1Iuc2V0KHQpO2xldCBOPXQubGVuZ3RoO2Zvcihjb25zdCBlIG9mIEEpZyhlLE4sUiksTis9ZS5sZW5ndGg7Zm9yKGNvbnN0W2UsdCxyXW9mIE8pTj1mKGUsVFswXSxOLFIpLE49Zih0LFRbMV0sTixSKSxOPWYocixUWzJdLE4sUik7cmV0dXJuIGcoUCxOLFIpLFJ9LHQud3JpdGVEaWN0PWgsdC53cml0ZU9iamVjdD1sLHIoMTM5KSxyKDg0KSxyKDkzKSxyKDk0KSxyKDk3KSxyKDk5KSxyKDEwMSkscigxMDUpLHIoMTA4KSxyKDExNSk7dmFyIG49cigxNDQpLGE9cigxNTApLGk9cigxNDkpLHM9cigyMTcpLG89cigxNTEpLGM9cigyMTgpO2FzeW5jIGZ1bmN0aW9uIGwoZSx0LHIsbil7ci5wdXNoKCIiLmNvbmNhdChlLm51bSwiICIpLmNvbmNhdChlLmdlbiwiIG9ialxuIikpLHQgaW5zdGFuY2VvZiBhLkRpY3Q/YXdhaXQgaCh0LHIsbik6dCBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbSYmYXdhaXQgdSh0LHIsbiksci5wdXNoKCJcbmVuZG9ialxuIil9YXN5bmMgZnVuY3Rpb24gaChlLHQscil7dC5wdXNoKCI8PCIpO2Zvcihjb25zdCBuIG9mIGUuZ2V0S2V5cygpKXQucHVzaCgiIC8iLmNvbmNhdCgoMCxpLmVzY2FwZVBERk5hbWUpKG4pLCIgIikpLGF3YWl0IGQoZS5nZXRSYXcobiksdCxyKTt0LnB1c2goIj4+Iil9YXN5bmMgZnVuY3Rpb24gdShlLHQscil7bGV0IGk9ZS5nZXRTdHJpbmcoKTtudWxsIT09ciYmKGk9ci5lbmNyeXB0U3RyaW5nKGkpKTtjb25zdHtkaWN0OnN9PWUsW28sY109YXdhaXQgUHJvbWlzZS5hbGwoW3MuZ2V0QXN5bmMoIkZpbHRlciIpLHMuZ2V0QXN5bmMoIkRlY29kZVBhcm1zIildKSxsPUFycmF5LmlzQXJyYXkobyk/YXdhaXQgcy54cmVmLmZldGNoSWZSZWZBc3luYyhvWzBdKTpvLHU9KDAsYS5pc05hbWUpKGwsIkZsYXRlRGVjb2RlIik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBDb21wcmVzc2lvblN0cmVhbSYmKGkubGVuZ3RoPj0yNTZ8fHUpKXRyeXtjb25zdCBlPSgwLG4uc3RyaW5nVG9CeXRlcykoaSksdD1uZXcgQ29tcHJlc3Npb25TdHJlYW0oImRlZmxhdGUiKSxyPXQud3JpdGFibGUuZ2V0V3JpdGVyKCk7ci53cml0ZShlKSxyLmNsb3NlKCk7Y29uc3QgbD1hd2FpdCBuZXcgUmVzcG9uc2UodC5yZWFkYWJsZSkuYXJyYXlCdWZmZXIoKTtsZXQgaCxkO2k9KDAsbi5ieXRlc1RvU3RyaW5nKShuZXcgVWludDhBcnJheShsKSksbz91fHwoaD1BcnJheS5pc0FycmF5KG8pP1thLk5hbWUuZ2V0KCJGbGF0ZURlY29kZSIpLC4uLm9dOlthLk5hbWUuZ2V0KCJGbGF0ZURlY29kZSIpLG9dLGMmJihkPUFycmF5LmlzQXJyYXkoYyk/W251bGwsLi4uY106W251bGwsY10pKTpoPWEuTmFtZS5nZXQoIkZsYXRlRGVjb2RlIiksaCYmcy5zZXQoIkZpbHRlciIsaCksZCYmcy5zZXQoIkRlY29kZVBhcm1zIixkKX1jYXRjaChlKXsoMCxuLmluZm8pKCd3cml0ZVN0cmVhbSAtIGNhbm5vdCBjb21wcmVzcyBkYXRhOiAiJy5jb25jYXQoZSwnIi4nKSl9cy5zZXQoIkxlbmd0aCIsaS5sZW5ndGgpLGF3YWl0IGgocyx0LHIpLHQucHVzaCgiIHN0cmVhbVxuIixpLCJcbmVuZHN0cmVhbSIpfWFzeW5jIGZ1bmN0aW9uIGQoZSx0LHIpe2UgaW5zdGFuY2VvZiBhLk5hbWU/dC5wdXNoKCIvIi5jb25jYXQoKDAsaS5lc2NhcGVQREZOYW1lKShlLm5hbWUpKSk6ZSBpbnN0YW5jZW9mIGEuUmVmP3QucHVzaCgiIi5jb25jYXQoZS5udW0sIiAiKS5jb25jYXQoZS5nZW4sIiBSIikpOkFycmF5LmlzQXJyYXkoZSk/YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LHIpe3QucHVzaCgiWyIpO2xldCBuPSEwO2Zvcihjb25zdCBhIG9mIGUpbj9uPSExOnQucHVzaCgiICIpLGF3YWl0IGQoYSx0LHIpO3QucHVzaCgiXSIpfShlLHQscik6InN0cmluZyI9PXR5cGVvZiBlPyhudWxsIT09ciYmKGU9ci5lbmNyeXB0U3RyaW5nKGUpKSx0LnB1c2goIigiLmNvbmNhdCgoMCxpLmVzY2FwZVN0cmluZykoZSksIikiKSkpOiJudW1iZXIiPT10eXBlb2YgZT90LnB1c2goKDAsaS5udW1iZXJUb1N0cmluZykoZSkpOiJib29sZWFuIj09dHlwZW9mIGU/dC5wdXNoKGUudG9TdHJpbmcoKSk6ZSBpbnN0YW5jZW9mIGEuRGljdD9hd2FpdCBoKGUsdCxyKTplIGluc3RhbmNlb2Ygby5CYXNlU3RyZWFtP2F3YWl0IHUoZSx0LHIpOm51bGw9PT1lP3QucHVzaCgibnVsbCIpOigwLG4ud2FybikoIlVuaGFuZGxlZCB2YWx1ZSBpbiB3cml0ZXI6ICIuY29uY2F0KHR5cGVvZiBlLCIsIHBsZWFzZSBmaWxlIGEgYnVnLiIpKX1mdW5jdGlvbiBmKGUsdCxyLG4pe2ZvcihsZXQgYT10K3ItMTthPnItMTthLS0pblthXT0yNTUmZSxlPj49ODtyZXR1cm4gcit0fWZ1bmN0aW9uIGcoZSx0LHIpe2ZvcihsZXQgbj0wLGE9ZS5sZW5ndGg7bjxhO24rKylyW3Qrbl09MjU1JmUuY2hhckNvZGVBdChuKX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5YTUxQYXJzZXJFcnJvckNvZGU9dC5YTUxQYXJzZXJCYXNlPXQuU2ltcGxlWE1MUGFyc2VyPXQuU2ltcGxlRE9NTm9kZT12b2lkIDAscigxMzkpO3ZhciBuPXIoMTQ5KTtjb25zdCBhPXtOb0Vycm9yOjAsRW5kT2ZEb2N1bWVudDotMSxVbnRlcm1pbmF0ZWRDZGF0Oi0yLFVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uOi0zLFVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbjotNCxVbnRlcm1pbmF0ZWRDb21tZW50Oi01LE1hbGZvcm1lZEVsZW1lbnQ6LTYsT3V0T2ZNZW1vcnk6LTcsVW50ZXJtaW5hdGVkQXR0cmlidXRlVmFsdWU6LTgsVW50ZXJtaW5hdGVkRWxlbWVudDotOSxFbGVtZW50TmV2ZXJCZWd1bjotMTB9O2Z1bmN0aW9uIGkoZSx0KXtjb25zdCByPWVbdF07cmV0dXJuIiAiPT09cnx8IlxuIj09PXJ8fCJcciI9PT1yfHwiXHQiPT09cn10LlhNTFBhcnNlckVycm9yQ29kZT1hO2NsYXNzIHN7X3Jlc29sdmVFbnRpdGllcyhlKXtyZXR1cm4gZS5yZXBsYWNlQWxsKC8mKFteO10rKTsvZywoKGUsdCk9PntpZigiI3giPT09dC5zdWJzdHJpbmcoMCwyKSlyZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQodC5zdWJzdHJpbmcoMiksMTYpKTtpZigiIyI9PT10LnN1YnN0cmluZygwLDEpKXJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludCh0LnN1YnN0cmluZygxKSwxMCkpO3N3aXRjaCh0KXtjYXNlImx0IjpyZXR1cm4iPCI7Y2FzZSJndCI6cmV0dXJuIj4iO2Nhc2UiYW1wIjpyZXR1cm4iJiI7Y2FzZSJxdW90IjpyZXR1cm4nIic7Y2FzZSJhcG9zIjpyZXR1cm4iJyJ9cmV0dXJuIHRoaXMub25SZXNvbHZlRW50aXR5KHQpfSkpfV9wYXJzZUNvbnRlbnQoZSx0KXtjb25zdCByPVtdO2xldCBuPXQ7ZnVuY3Rpb24gYSgpe2Zvcig7bjxlLmxlbmd0aCYmaShlLG4pOykrK259Zm9yKDtuPGUubGVuZ3RoJiYhaShlLG4pJiYiPiIhPT1lW25dJiYiLyIhPT1lW25dOykrK247Y29uc3Qgcz1lLnN1YnN0cmluZyh0LG4pO2ZvcihhKCk7bjxlLmxlbmd0aCYmIj4iIT09ZVtuXSYmIi8iIT09ZVtuXSYmIj8iIT09ZVtuXTspe2EoKTtsZXQgdD0iIixzPSIiO2Zvcig7bjxlLmxlbmd0aCYmIWkoZSxuKSYmIj0iIT09ZVtuXTspdCs9ZVtuXSwrK247aWYoYSgpLCI9IiE9PWVbbl0pcmV0dXJuIG51bGw7KytuLGEoKTtjb25zdCBvPWVbbl07aWYoJyInIT09byYmIiciIT09bylyZXR1cm4gbnVsbDtjb25zdCBjPWUuaW5kZXhPZihvLCsrbik7aWYoYzwwKXJldHVybiBudWxsO3M9ZS5zdWJzdHJpbmcobixjKSxyLnB1c2goe25hbWU6dCx2YWx1ZTp0aGlzLl9yZXNvbHZlRW50aXRpZXMocyl9KSxuPWMrMSxhKCl9cmV0dXJue25hbWU6cyxhdHRyaWJ1dGVzOnIscGFyc2VkOm4tdH19X3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGUsdCl7bGV0IHI9dDtmb3IoO3I8ZS5sZW5ndGgmJiFpKGUscikmJiI+IiE9PWVbcl0mJiI/IiE9PWVbcl0mJiIvIiE9PWVbcl07KSsrcjtjb25zdCBuPWUuc3Vic3RyaW5nKHQscik7IWZ1bmN0aW9uKCl7Zm9yKDtyPGUubGVuZ3RoJiZpKGUscik7KSsrcn0oKTtjb25zdCBhPXI7Zm9yKDtyPGUubGVuZ3RoJiYoIj8iIT09ZVtyXXx8Ij4iIT09ZVtyKzFdKTspKytyO3JldHVybntuYW1lOm4sdmFsdWU6ZS5zdWJzdHJpbmcoYSxyKSxwYXJzZWQ6ci10fX1wYXJzZVhtbChlKXtsZXQgdD0wO2Zvcig7dDxlLmxlbmd0aDspe2xldCByPXQ7aWYoIjwiPT09ZVt0XSl7bGV0IHQ7c3dpdGNoKCsrcixlW3JdKXtjYXNlIi8iOmlmKCsrcix0PWUuaW5kZXhPZigiPiIsciksdDwwKXJldHVybiB2b2lkIHRoaXMub25FcnJvcihhLlVudGVybWluYXRlZEVsZW1lbnQpO3RoaXMub25FbmRFbGVtZW50KGUuc3Vic3RyaW5nKHIsdCkpLHI9dCsxO2JyZWFrO2Nhc2UiPyI6KytyO2NvbnN0IG49dGhpcy5fcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oZSxyKTtpZigiPz4iIT09ZS5zdWJzdHJpbmcocituLnBhcnNlZCxyK24ucGFyc2VkKzIpKXJldHVybiB2b2lkIHRoaXMub25FcnJvcihhLlVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uKTt0aGlzLm9uUGkobi5uYW1lLG4udmFsdWUpLHIrPW4ucGFyc2VkKzI7YnJlYWs7Y2FzZSIhIjppZigiLS0iPT09ZS5zdWJzdHJpbmcocisxLHIrMykpe2lmKHQ9ZS5pbmRleE9mKCItLVx4M2UiLHIrMyksdDwwKXJldHVybiB2b2lkIHRoaXMub25FcnJvcihhLlVudGVybWluYXRlZENvbW1lbnQpO3RoaXMub25Db21tZW50KGUuc3Vic3RyaW5nKHIrMyx0KSkscj10KzN9ZWxzZSBpZigiW0NEQVRBWyI9PT1lLnN1YnN0cmluZyhyKzEscis4KSl7aWYodD1lLmluZGV4T2YoIl1dPiIscis4KSx0PDApcmV0dXJuIHZvaWQgdGhpcy5vbkVycm9yKGEuVW50ZXJtaW5hdGVkQ2RhdCk7dGhpcy5vbkNkYXRhKGUuc3Vic3RyaW5nKHIrOCx0KSkscj10KzN9ZWxzZXtpZigiRE9DVFlQRSIhPT1lLnN1YnN0cmluZyhyKzEscis4KSlyZXR1cm4gdm9pZCB0aGlzLm9uRXJyb3IoYS5NYWxmb3JtZWRFbGVtZW50KTt7Y29uc3Qgbj1lLmluZGV4T2YoIlsiLHIrOCk7bGV0IGk9ITE7aWYodD1lLmluZGV4T2YoIj4iLHIrOCksdDwwKXJldHVybiB2b2lkIHRoaXMub25FcnJvcihhLlVudGVybWluYXRlZERvY3R5cGVEZWNsYXJhdGlvbik7aWYobj4wJiZ0Pm4pe2lmKHQ9ZS5pbmRleE9mKCJdPiIscis4KSx0PDApcmV0dXJuIHZvaWQgdGhpcy5vbkVycm9yKGEuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTtpPSEwfWNvbnN0IHM9ZS5zdWJzdHJpbmcocis4LHQrKGk/MTowKSk7dGhpcy5vbkRvY3R5cGUocykscj10KyhpPzI6MSl9fWJyZWFrO2RlZmF1bHQ6Y29uc3QgaT10aGlzLl9wYXJzZUNvbnRlbnQoZSxyKTtpZihudWxsPT09aSlyZXR1cm4gdm9pZCB0aGlzLm9uRXJyb3IoYS5NYWxmb3JtZWRFbGVtZW50KTtsZXQgcz0hMTtpZigiLz4iPT09ZS5zdWJzdHJpbmcocitpLnBhcnNlZCxyK2kucGFyc2VkKzIpKXM9ITA7ZWxzZSBpZigiPiIhPT1lLnN1YnN0cmluZyhyK2kucGFyc2VkLHIraS5wYXJzZWQrMSkpcmV0dXJuIHZvaWQgdGhpcy5vbkVycm9yKGEuVW50ZXJtaW5hdGVkRWxlbWVudCk7dGhpcy5vbkJlZ2luRWxlbWVudChpLm5hbWUsaS5hdHRyaWJ1dGVzLHMpLHIrPWkucGFyc2VkKyhzPzI6MSl9fWVsc2V7Zm9yKDtyPGUubGVuZ3RoJiYiPCIhPT1lW3JdOylyKys7Y29uc3Qgbj1lLnN1YnN0cmluZyh0LHIpO3RoaXMub25UZXh0KHRoaXMuX3Jlc29sdmVFbnRpdGllcyhuKSl9dD1yfX1vblJlc29sdmVFbnRpdHkoZSl7cmV0dXJuIiYiLmNvbmNhdChlLCI7Iil9b25QaShlLHQpe31vbkNvbW1lbnQoZSl7fW9uQ2RhdGEoZSl7fW9uRG9jdHlwZShlKXt9b25UZXh0KGUpe31vbkJlZ2luRWxlbWVudChlLHQscil7fW9uRW5kRWxlbWVudChlKXt9b25FcnJvcihlKXt9fXQuWE1MUGFyc2VyQmFzZT1zO2NsYXNzIG97Y29uc3RydWN0b3IoZSx0KXt0aGlzLm5vZGVOYW1lPWUsdGhpcy5ub2RlVmFsdWU9dCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGFyZW50Tm9kZSIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX1nZXQgZmlyc3RDaGlsZCgpe3ZhciBlO3JldHVybiBudWxsPT09KGU9dGhpcy5jaGlsZE5vZGVzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZVswXX1nZXQgbmV4dFNpYmxpbmcoKXtjb25zdCBlPXRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzO2lmKCFlKXJldHVybjtjb25zdCB0PWUuaW5kZXhPZih0aGlzKTtyZXR1cm4tMSE9PXQ/ZVt0KzFdOnZvaWQgMH1nZXQgdGV4dENvbnRlbnQoKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzP3RoaXMuY2hpbGROb2Rlcy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRleHRDb250ZW50fSkpLmpvaW4oIiIpOnRoaXMubm9kZVZhbHVlfHwiIn1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfHxbXX1oYXNDaGlsZE5vZGVzKCl7dmFyIGU7cmV0dXJuKG51bGw9PT0oZT10aGlzLmNoaWxkTm9kZXMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmxlbmd0aCk+MH1zZWFyY2hOb2RlKGUsdCl7aWYodD49ZS5sZW5ndGgpcmV0dXJuIHRoaXM7Y29uc3Qgcj1lW3RdLG49W107bGV0IGE9dGhpcztmb3IoOzspe3ZhciBpO2lmKHIubmFtZT09PWEubm9kZU5hbWUpe2lmKDAhPT1yLnBvcyl7aWYoMD09PW4ubGVuZ3RoKXJldHVybiBudWxsO3tjb25zdFtpXT1uLnBvcCgpO2xldCBzPTA7Zm9yKGNvbnN0IG4gb2YgaS5jaGlsZE5vZGVzKWlmKHIubmFtZT09PW4ubm9kZU5hbWUpe2lmKHM9PT1yLnBvcylyZXR1cm4gbi5zZWFyY2hOb2RlKGUsdCsxKTtzKyt9cmV0dXJuIGEuc2VhcmNoTm9kZShlLHQrMSl9fXtjb25zdCByPWEuc2VhcmNoTm9kZShlLHQrMSk7aWYobnVsbCE9PXIpcmV0dXJuIHJ9fWlmKChudWxsPT09KGk9YS5jaGlsZE5vZGVzKXx8dm9pZCAwPT09aT92b2lkIDA6aS5sZW5ndGgpPjApbi5wdXNoKFthLDBdKSxhPWEuY2hpbGROb2Rlc1swXTtlbHNle2lmKDA9PT1uLmxlbmd0aClyZXR1cm4gbnVsbDtmb3IoOzAhPT1uLmxlbmd0aDspe2NvbnN0W2UsdF09bi5wb3AoKSxyPXQrMTtpZihyPGUuY2hpbGROb2Rlcy5sZW5ndGgpe24ucHVzaChbZSxyXSksYT1lLmNoaWxkTm9kZXNbcl07YnJlYWt9fWlmKDA9PT1uLmxlbmd0aClyZXR1cm4gbnVsbH19fWR1bXAoZSl7aWYoIiN0ZXh0IiE9PXRoaXMubm9kZU5hbWUpe2lmKGUucHVzaCgiPCIuY29uY2F0KHRoaXMubm9kZU5hbWUpKSx0aGlzLmF0dHJpYnV0ZXMpZm9yKGNvbnN0IHQgb2YgdGhpcy5hdHRyaWJ1dGVzKWUucHVzaCgiICIuY29uY2F0KHQubmFtZSwnPSInKS5jb25jYXQoKDAsbi5lbmNvZGVUb1htbFN0cmluZykodC52YWx1ZSksJyInKSk7aWYodGhpcy5oYXNDaGlsZE5vZGVzKCkpe2UucHVzaCgiPiIpO2Zvcihjb25zdCB0IG9mIHRoaXMuY2hpbGROb2Rlcyl0LmR1bXAoZSk7ZS5wdXNoKCI8LyIuY29uY2F0KHRoaXMubm9kZU5hbWUsIj4iKSl9ZWxzZSB0aGlzLm5vZGVWYWx1ZT9lLnB1c2goIj4iLmNvbmNhdCgoMCxuLmVuY29kZVRvWG1sU3RyaW5nKSh0aGlzLm5vZGVWYWx1ZSksIjwvIikuY29uY2F0KHRoaXMubm9kZU5hbWUsIj4iKSk6ZS5wdXNoKCIvPiIpfWVsc2UgZS5wdXNoKCgwLG4uZW5jb2RlVG9YbWxTdHJpbmcpKHRoaXMubm9kZVZhbHVlKSl9fXQuU2ltcGxlRE9NTm9kZT1vLHQuU2ltcGxlWE1MUGFyc2VyPWNsYXNzIGV4dGVuZHMgc3tjb25zdHJ1Y3RvcihlKXtsZXR7aGFzQXR0cmlidXRlczp0PSExLGxvd2VyQ2FzZU5hbWU6cj0hMX09ZTtzdXBlcigpLHRoaXMuX2N1cnJlbnRGcmFnbWVudD1udWxsLHRoaXMuX3N0YWNrPW51bGwsdGhpcy5fZXJyb3JDb2RlPWEuTm9FcnJvcix0aGlzLl9oYXNBdHRyaWJ1dGVzPXQsdGhpcy5fbG93ZXJDYXNlTmFtZT1yfXBhcnNlRnJvbVN0cmluZyhlKXtpZih0aGlzLl9jdXJyZW50RnJhZ21lbnQ9W10sdGhpcy5fc3RhY2s9W10sdGhpcy5fZXJyb3JDb2RlPWEuTm9FcnJvcix0aGlzLnBhcnNlWG1sKGUpLHRoaXMuX2Vycm9yQ29kZSE9PWEuTm9FcnJvcilyZXR1cm47Y29uc3RbdF09dGhpcy5fY3VycmVudEZyYWdtZW50O3JldHVybiB0P3tkb2N1bWVudEVsZW1lbnQ6dH06dm9pZCAwfW9uVGV4dChlKXtpZihmdW5jdGlvbihlKXtmb3IobGV0IHQ9MCxyPWUubGVuZ3RoO3Q8cjt0KyspaWYoIWkoZSx0KSlyZXR1cm4hMTtyZXR1cm4hMH0oZSkpcmV0dXJuO2NvbnN0IHQ9bmV3IG8oIiN0ZXh0IixlKTt0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaCh0KX1vbkNkYXRhKGUpe2NvbnN0IHQ9bmV3IG8oIiN0ZXh0IixlKTt0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaCh0KX1vbkJlZ2luRWxlbWVudChlLHQscil7dGhpcy5fbG93ZXJDYXNlTmFtZSYmKGU9ZS50b0xvd2VyQ2FzZSgpKTtjb25zdCBuPW5ldyBvKGUpO24uY2hpbGROb2Rlcz1bXSx0aGlzLl9oYXNBdHRyaWJ1dGVzJiYobi5hdHRyaWJ1dGVzPXQpLHRoaXMuX2N1cnJlbnRGcmFnbWVudC5wdXNoKG4pLHJ8fCh0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnRGcmFnbWVudCksdGhpcy5fY3VycmVudEZyYWdtZW50PW4uY2hpbGROb2Rlcyl9b25FbmRFbGVtZW50KGUpe3RoaXMuX2N1cnJlbnRGcmFnbWVudD10aGlzLl9zdGFjay5wb3AoKXx8W107Y29uc3QgdD10aGlzLl9jdXJyZW50RnJhZ21lbnQuYXQoLTEpO2lmKCF0KXJldHVybiBudWxsO2Zvcihjb25zdCBlIG9mIHQuY2hpbGROb2RlcyllLnBhcmVudE5vZGU9dDtyZXR1cm4gdH1vbkVycm9yKGUpe3RoaXMuX2Vycm9yQ29kZT1lfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jYWxjdWxhdGVTSEEyNTY9dC5jYWxjdWxhdGVNRDU9dC5QREYyMD10LlBERjE3PXQuQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeT10LkFSQ0ZvdXJDaXBoZXI9dC5BRVMyNTZDaXBoZXI9dC5BRVMxMjhDaXBoZXI9dm9pZCAwLHQuY2FsY3VsYXRlU0hBMzg0PXUsdC5jYWxjdWxhdGVTSEE1MTI9dm9pZCAwLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDEzOSk7dmFyIG49cigxNDQpLGE9cigxNTApLGk9cigyMTkpO2NsYXNzIHN7Y29uc3RydWN0b3IoZSl7dGhpcy5hPTAsdGhpcy5iPTA7Y29uc3QgdD1uZXcgVWludDhBcnJheSgyNTYpLHI9ZS5sZW5ndGg7Zm9yKGxldCBlPTA7ZTwyNTY7KytlKXRbZV09ZTtmb3IobGV0IG49MCxhPTA7bjwyNTY7KytuKXtjb25zdCBpPXRbbl07YT1hK2krZVtuJXJdJjI1NSx0W25dPXRbYV0sdFthXT1pfXRoaXMucz10fWVuY3J5cHRCbG9jayhlKXtsZXQgdD10aGlzLmEscj10aGlzLmI7Y29uc3Qgbj10aGlzLnMsYT1lLmxlbmd0aCxpPW5ldyBVaW50OEFycmF5KGEpO2ZvcihsZXQgcz0wO3M8YTsrK3Mpe3Q9dCsxJjI1NTtjb25zdCBhPW5bdF07cj1yK2EmMjU1O2NvbnN0IG89bltyXTtuW3RdPW8sbltyXT1hLGlbc109ZVtzXV5uW2ErbyYyNTVdfXJldHVybiB0aGlzLmE9dCx0aGlzLmI9cixpfWRlY3J5cHRCbG9jayhlKXtyZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZSl9ZW5jcnlwdChlKXtyZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZSl9fXQuQVJDRm91ckNpcGhlcj1zO2NvbnN0IG89ZnVuY3Rpb24oKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KFs3LDEyLDE3LDIyLDcsMTIsMTcsMjIsNywxMiwxNywyMiw3LDEyLDE3LDIyLDUsOSwxNCwyMCw1LDksMTQsMjAsNSw5LDE0LDIwLDUsOSwxNCwyMCw0LDExLDE2LDIzLDQsMTEsMTYsMjMsNCwxMSwxNiwyMyw0LDExLDE2LDIzLDYsMTAsMTUsMjEsNiwxMCwxNSwyMSw2LDEwLDE1LDIxLDYsMTAsMTUsMjFdKSx0PW5ldyBJbnQzMkFycmF5KFstNjgwODc2OTM2LC0zODk1NjQ1ODYsNjA2MTA1ODE5LC0xMDQ0NTI1MzMwLC0xNzY0MTg4OTcsMTIwMDA4MDQyNiwtMTQ3MzIzMTM0MSwtNDU3MDU5ODMsMTc3MDAzNTQxNiwtMTk1ODQxNDQxNywtNDIwNjMsLTE5OTA0MDQxNjIsMTgwNDYwMzY4MiwtNDAzNDExMDEsLTE1MDIwMDIyOTAsMTIzNjUzNTMyOSwtMTY1Nzk2NTEwLC0xMDY5NTAxNjMyLDY0MzcxNzcxMywtMzczODk3MzAyLC03MDE1NTg2OTEsMzgwMTYwODMsLTY2MDQ3ODMzNSwtNDA1NTM3ODQ4LDU2ODQ0NjQzOCwtMTAxOTgwMzY5MCwtMTg3MzYzOTYxLDExNjM1MzE1MDEsLTE0NDQ2ODE0NjcsLTUxNDAzNzg0LDE3MzUzMjg0NzMsLTE5MjY2MDc3MzQsLTM3ODU1OCwtMjAyMjU3NDQ2MywxODM5MDMwNTYyLC0zNTMwOTU1NiwtMTUzMDk5MjA2MCwxMjcyODkzMzUzLC0xNTU0OTc2MzIsLTEwOTQ3MzA2NDAsNjgxMjc5MTc0LC0zNTg1MzcyMjIsLTcyMjUyMTk3OSw3NjAyOTE4OSwtNjQwMzY0NDg3LC00MjE4MTU4MzUsNTMwNzQyNTIwLC05OTUzMzg2NTEsLTE5ODYzMDg0NCwxMTI2ODkxNDE1LC0xNDE2MzU0OTA1LC01NzQzNDA1NSwxNzAwNDg1NTcxLC0xODk0OTg2NjA2LC0xMDUxNTIzLC0yMDU0OTIyNzk5LDE4NzMzMTMzNTksLTMwNjExNzQ0LC0xNTYwMTk4MzgwLDEzMDkxNTE2NDksLTE0NTUyMzA3MCwtMTEyMDIxMDM3OSw3MTg3ODcyNTksLTM0MzQ4NTU1MV0pO3JldHVybiBmdW5jdGlvbihyLG4sYSl7bGV0IGk9MTczMjU4NDE5MyxzPS0yNzE3MzM4Nzksbz0tMTczMjU4NDE5NCxjPTI3MTczMzg3ODtjb25zdCBsPWErNzImLTY0LGg9bmV3IFVpbnQ4QXJyYXkobCk7bGV0IHUsZDtmb3IodT0wO3U8YTsrK3UpaFt1XT1yW24rK107aFt1KytdPTEyODtjb25zdCBmPWwtODtmb3IoO3U8ZjspaFt1KytdPTA7aFt1KytdPWE8PDMmMjU1LGhbdSsrXT1hPj41JjI1NSxoW3UrK109YT4+MTMmMjU1LGhbdSsrXT1hPj4yMSYyNTUsaFt1KytdPWE+Pj4yOSYyNTUsaFt1KytdPTAsaFt1KytdPTAsaFt1KytdPTA7Y29uc3QgZz1uZXcgSW50MzJBcnJheSgxNik7Zm9yKHU9MDt1PGw7KXtmb3IoZD0wO2Q8MTY7KytkLHUrPTQpZ1tkXT1oW3VdfGhbdSsxXTw8OHxoW3UrMl08PDE2fGhbdSszXTw8MjQ7bGV0IHIsbixhPWksbD1zLGY9byxwPWM7Zm9yKGQ9MDtkPDY0OysrZCl7ZDwxNj8ocj1sJmZ8fmwmcCxuPWQpOmQ8MzI/KHI9cCZsfH5wJmYsbj01KmQrMSYxNSk6ZDw0OD8ocj1sXmZecCxuPTMqZCs1JjE1KToocj1mXihsfH5wKSxuPTcqZCYxNSk7Y29uc3QgaT1wLHM9YStyK3RbZF0rZ1tuXXwwLG89ZVtkXTtwPWYsZj1sLGw9bCsoczw8b3xzPj4+MzItbyl8MCxhPWl9aT1pK2F8MCxzPXMrbHwwLG89bytmfDAsYz1jK3B8MH1yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzI1NSZpLGk+PjgmMjU1LGk+PjE2JjI1NSxpPj4+MjQmMjU1LDI1NSZzLHM+PjgmMjU1LHM+PjE2JjI1NSxzPj4+MjQmMjU1LDI1NSZvLG8+PjgmMjU1LG8+PjE2JjI1NSxvPj4+MjQmMjU1LDI1NSZjLGM+PjgmMjU1LGM+PjE2JjI1NSxjPj4+MjQmMjU1XSl9fSgpO3QuY2FsY3VsYXRlTUQ1PW87Y2xhc3MgY3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuaGlnaD0wfGUsdGhpcy5sb3c9MHx0fWFuZChlKXt0aGlzLmhpZ2gmPWUuaGlnaCx0aGlzLmxvdyY9ZS5sb3d9eG9yKGUpe3RoaXMuaGlnaF49ZS5oaWdoLHRoaXMubG93Xj1lLmxvd31vcihlKXt0aGlzLmhpZ2h8PWUuaGlnaCx0aGlzLmxvd3w9ZS5sb3d9c2hpZnRSaWdodChlKXtlPj0zMj8odGhpcy5sb3c9dGhpcy5oaWdoPj4+ZS0zMnwwLHRoaXMuaGlnaD0wKToodGhpcy5sb3c9dGhpcy5sb3c+Pj5lfHRoaXMuaGlnaDw8MzItZSx0aGlzLmhpZ2g9dGhpcy5oaWdoPj4+ZXwwKX1zaGlmdExlZnQoZSl7ZT49MzI/KHRoaXMuaGlnaD10aGlzLmxvdzw8ZS0zMix0aGlzLmxvdz0wKToodGhpcy5oaWdoPXRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PjMyLWUsdGhpcy5sb3c8PD1lKX1yb3RhdGVSaWdodChlKXtsZXQgdCxyOzMyJmU/KHI9dGhpcy5sb3csdD10aGlzLmhpZ2gpOih0PXRoaXMubG93LHI9dGhpcy5oaWdoKSxlJj0zMSx0aGlzLmxvdz10Pj4+ZXxyPDwzMi1lLHRoaXMuaGlnaD1yPj4+ZXx0PDwzMi1lfW5vdCgpe3RoaXMuaGlnaD1+dGhpcy5oaWdoLHRoaXMubG93PX50aGlzLmxvd31hZGQoZSl7Y29uc3QgdD0odGhpcy5sb3c+Pj4wKSsoZS5sb3c+Pj4wKTtsZXQgcj0odGhpcy5oaWdoPj4+MCkrKGUuaGlnaD4+PjApO3Q+NDI5NDk2NzI5NSYmKHIrPTEpLHRoaXMubG93PTB8dCx0aGlzLmhpZ2g9MHxyfWNvcHlUbyhlLHQpe2VbdF09dGhpcy5oaWdoPj4+MjQmMjU1LGVbdCsxXT10aGlzLmhpZ2g+PjE2JjI1NSxlW3QrMl09dGhpcy5oaWdoPj44JjI1NSxlW3QrM109MjU1JnRoaXMuaGlnaCxlW3QrNF09dGhpcy5sb3c+Pj4yNCYyNTUsZVt0KzVdPXRoaXMubG93Pj4xNiYyNTUsZVt0KzZdPXRoaXMubG93Pj44JjI1NSxlW3QrN109MjU1JnRoaXMubG93fWFzc2lnbihlKXt0aGlzLmhpZ2g9ZS5oaWdoLHRoaXMubG93PWUubG93fX1jb25zdCBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3JldHVybiBlPj4+dHxlPDwzMi10fWZ1bmN0aW9uIHQoZSx0LHIpe3JldHVybiBlJnRefmUmcn1mdW5jdGlvbiByKGUsdCxyKXtyZXR1cm4gZSZ0XmUmcl50JnJ9ZnVuY3Rpb24gbih0KXtyZXR1cm4gZSh0LDIpXmUodCwxMyleZSh0LDIyKX1mdW5jdGlvbiBhKHQpe3JldHVybiBlKHQsNileZSh0LDExKV5lKHQsMjUpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIGUodCw3KV5lKHQsMTgpXnQ+Pj4zfWNvbnN0IHM9WzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF07cmV0dXJuIGZ1bmN0aW9uKG8sYyxsKXtsZXQgaD0xNzc5MDMzNzAzLHU9MzE0NDEzNDI3NyxkPTEwMTM5MDQyNDIsZj0yNzczNDgwNzYyLGc9MTM1OTg5MzExOSxwPTI2MDA4MjI5MjQsbT01Mjg3MzQ2MzUsYj0xNTQxNDU5MjI1O2NvbnN0IHk9NjQqTWF0aC5jZWlsKChsKzkpLzY0KSx3PW5ldyBVaW50OEFycmF5KHkpO2xldCB2LHg7Zm9yKHY9MDt2PGw7Kyt2KXdbdl09b1tjKytdO3dbdisrXT0xMjg7Y29uc3QgUz15LTg7Zm9yKDt2PFM7KXdbdisrXT0wO3dbdisrXT0wLHdbdisrXT0wLHdbdisrXT0wLHdbdisrXT1sPj4+MjkmMjU1LHdbdisrXT1sPj4yMSYyNTUsd1t2KytdPWw+PjEzJjI1NSx3W3YrK109bD4+NSYyNTUsd1t2KytdPWw8PDMmMjU1O2NvbnN0IEE9bmV3IFVpbnQzMkFycmF5KDY0KTtmb3Iodj0wO3Y8eTspe2Zvcih4PTA7eDwxNjsrK3gpQVt4XT13W3ZdPDwyNHx3W3YrMV08PDE2fHdbdisyXTw8OHx3W3YrM10sdis9NDtmb3IoeD0xNjt4PDY0OysreClBW3hdPShlKGs9QVt4LTJdLDE3KV5lKGssMTkpXms+Pj4xMCkrQVt4LTddK2koQVt4LTE1XSkrQVt4LTE2XXwwO2xldCBvLGMsbD1oLHk9dSxTPWQsQz1mLE89ZyxGPXAsST1tLFQ9Yjtmb3IoeD0wO3g8NjQ7Kyt4KW89VCthKE8pK3QoTyxGLEkpK3NbeF0rQVt4XSxjPW4obCkrcihsLHksUyksVD1JLEk9RixGPU8sTz1DK298MCxDPVMsUz15LHk9bCxsPW8rY3wwO2g9aCtsfDAsdT11K3l8MCxkPWQrU3wwLGY9ZitDfDAsZz1nK098MCxwPXArRnwwLG09bStJfDAsYj1iK1R8MH12YXIgaztyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2g+PjI0JjI1NSxoPj4xNiYyNTUsaD4+OCYyNTUsMjU1JmgsdT4+MjQmMjU1LHU+PjE2JjI1NSx1Pj44JjI1NSwyNTUmdSxkPj4yNCYyNTUsZD4+MTYmMjU1LGQ+PjgmMjU1LDI1NSZkLGY+PjI0JjI1NSxmPj4xNiYyNTUsZj4+OCYyNTUsMjU1JmYsZz4+MjQmMjU1LGc+PjE2JjI1NSxnPj44JjI1NSwyNTUmZyxwPj4yNCYyNTUscD4+MTYmMjU1LHA+PjgmMjU1LDI1NSZwLG0+PjI0JjI1NSxtPj4xNiYyNTUsbT4+OCYyNTUsMjU1Jm0sYj4+MjQmMjU1LGI+PjE2JjI1NSxiPj44JjI1NSwyNTUmYl0pfX0oKTt0LmNhbGN1bGF0ZVNIQTI1Nj1sO2NvbnN0IGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxyLG4sYSl7ZS5hc3NpZ24odCksZS5hbmQociksYS5hc3NpZ24odCksYS5ub3QoKSxhLmFuZChuKSxlLnhvcihhKX1mdW5jdGlvbiB0KGUsdCxyLG4sYSl7ZS5hc3NpZ24odCksZS5hbmQociksYS5hc3NpZ24odCksYS5hbmQobiksZS54b3IoYSksYS5hc3NpZ24ociksYS5hbmQobiksZS54b3IoYSl9ZnVuY3Rpb24gcihlLHQscil7ZS5hc3NpZ24odCksZS5yb3RhdGVSaWdodCgyOCksci5hc3NpZ24odCksci5yb3RhdGVSaWdodCgzNCksZS54b3Iociksci5hc3NpZ24odCksci5yb3RhdGVSaWdodCgzOSksZS54b3Iocil9ZnVuY3Rpb24gbihlLHQscil7ZS5hc3NpZ24odCksZS5yb3RhdGVSaWdodCgxNCksci5hc3NpZ24odCksci5yb3RhdGVSaWdodCgxOCksZS54b3Iociksci5hc3NpZ24odCksci5yb3RhdGVSaWdodCg0MSksZS54b3Iocil9ZnVuY3Rpb24gYShlLHQscil7ZS5hc3NpZ24odCksZS5yb3RhdGVSaWdodCgxKSxyLmFzc2lnbih0KSxyLnJvdGF0ZVJpZ2h0KDgpLGUueG9yKHIpLHIuYXNzaWduKHQpLHIuc2hpZnRSaWdodCg3KSxlLnhvcihyKX1mdW5jdGlvbiBpKGUsdCxyKXtlLmFzc2lnbih0KSxlLnJvdGF0ZVJpZ2h0KDE5KSxyLmFzc2lnbih0KSxyLnJvdGF0ZVJpZ2h0KDYxKSxlLnhvcihyKSxyLmFzc2lnbih0KSxyLnNoaWZ0UmlnaHQoNiksZS54b3Iocil9Y29uc3Qgcz1bbmV3IGMoMTExNjM1MjQwOCwzNjA5NzY3NDU4KSxuZXcgYygxODk5NDQ3NDQxLDYwMjg5MTcyNSksbmV3IGMoMzA0OTMyMzQ3MSwzOTY0NDg0Mzk5KSxuZXcgYygzOTIxMDA5NTczLDIxNzMyOTU1NDgpLG5ldyBjKDk2MTk4NzE2Myw0MDgxNjI4NDcyKSxuZXcgYygxNTA4OTcwOTkzLDMwNTM4MzQyNjUpLG5ldyBjKDI0NTM2MzU3NDgsMjkzNzY3MTU3OSksbmV3IGMoMjg3MDc2MzIyMSwzNjY0NjA5NTYwKSxuZXcgYygzNjI0MzgxMDgwLDI3MzQ4ODMzOTQpLG5ldyBjKDMxMDU5ODQwMSwxMTY0OTk2NTQyKSxuZXcgYyg2MDcyMjUyNzgsMTMyMzYxMDc2NCksbmV3IGMoMTQyNjg4MTk4NywzNTkwMzA0OTk0KSxuZXcgYygxOTI1MDc4Mzg4LDQwNjgxODIzODMpLG5ldyBjKDIxNjIwNzgyMDYsOTkxMzM2MTEzKSxuZXcgYygyNjE0ODg4MTAzLDYzMzgwMzMxNyksbmV3IGMoMzI0ODIyMjU4MCwzNDc5Nzc0ODY4KSxuZXcgYygzODM1MzkwNDAxLDI2NjY2MTM0NTgpLG5ldyBjKDQwMjIyMjQ3NzQsOTQ0NzExMTM5KSxuZXcgYygyNjQzNDcwNzgsMjM0MTI2Mjc3MyksbmV3IGMoNjA0ODA3NjI4LDIwMDc4MDA5MzMpLG5ldyBjKDc3MDI1NTk4MywxNDk1OTkwOTAxKSxuZXcgYygxMjQ5MTUwMTIyLDE4NTY0MzEyMzUpLG5ldyBjKDE1NTUwODE2OTIsMzE3NTIxODEzMiksbmV3IGMoMTk5NjA2NDk4NiwyMTk4OTUwODM3KSxuZXcgYygyNTU0MjIwODgyLDM5OTk3MTkzMzkpLG5ldyBjKDI4MjE4MzQzNDksNzY2Nzg0MDE2KSxuZXcgYygyOTUyOTk2ODA4LDI1NjY1OTQ4NzkpLG5ldyBjKDMyMTAzMTM2NzEsMzIwMzMzNzk1NiksbmV3IGMoMzMzNjU3MTg5MSwxMDM0NDU3MDI2KSxuZXcgYygzNTg0NTI4NzExLDI0NjY5NDg5MDEpLG5ldyBjKDExMzkyNjk5MywzNzU4MzI2MzgzKSxuZXcgYygzMzgyNDE4OTUsMTY4NzE3OTM2KSxuZXcgYyg2NjYzMDcyMDUsMTE4ODE3OTk2NCksbmV3IGMoNzczNTI5OTEyLDE1NDYwNDU3MzQpLG5ldyBjKDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSksbmV3IGMoMTM5NjE4MjI5MSwyNjQzODMzODIzKSxuZXcgYygxNjk1MTgzNzAwLDIzNDM1MjczOTApLG5ldyBjKDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCksbmV3IGMoMjE3NzAyNjM1MCwxMjA2NzU5MTQyKSxuZXcgYygyNDU2OTU2MDM3LDM0NDA3NzYyNyksbmV3IGMoMjczMDQ4NTkyMSwxMjkwODYzNDYwKSxuZXcgYygyODIwMzAyNDExLDMxNTg0NTQyNzMpLG5ldyBjKDMyNTk3MzA4MDAsMzUwNTk1MjY1NyksbmV3IGMoMzM0NTc2NDc3MSwxMDYyMTcwMDgpLG5ldyBjKDM1MTYwNjU4MTcsMzYwNjAwODM0NCksbmV3IGMoMzYwMDM1MjgwNCwxNDMyNzI1Nzc2KSxuZXcgYyg0MDk0NTcxOTA5LDE0NjcwMzE1OTQpLG5ldyBjKDI3NTQyMzM0NCw4NTExNjk3MjApLG5ldyBjKDQzMDIyNzczNCwzMTAwODIzNzUyKSxuZXcgYyg1MDY5NDg2MTYsMTM2MzI1ODE5NSksbmV3IGMoNjU5MDYwNTU2LDM3NTA2ODU1OTMpLG5ldyBjKDg4Mzk5Nzg3NywzNzg1MDUwMjgwKSxuZXcgYyg5NTgxMzk1NzEsMzMxODMwNzQyNyksbmV3IGMoMTMyMjgyMjIxOCwzODEyNzIzNDAzKSxuZXcgYygxNTM3MDAyMDYzLDIwMDMwMzQ5OTUpLG5ldyBjKDE3NDc4NzM3NzksMzYwMjAzNjg5OSksbmV3IGMoMTk1NTU2MjIyMiwxNTc1OTkwMDEyKSxuZXcgYygyMDI0MTA0ODE1LDExMjU1OTI5MjgpLG5ldyBjKDIyMjc3MzA0NTIsMjcxNjkwNDMwNiksbmV3IGMoMjM2MTg1MjQyNCw0NDI3NzYwNDQpLG5ldyBjKDI0Mjg0MzY0NzQsNTkzNjk4MzQ0KSxuZXcgYygyNzU2NzM0MTg3LDM3MzMxMTAyNDkpLG5ldyBjKDMyMDQwMzE0NzksMjk5OTM1MTU3MyksbmV3IGMoMzMyOTMyNTI5OCwzODE1OTIwNDI3KSxuZXcgYygzMzkxNTY5NjE0LDM5MjgzODM5MDApLG5ldyBjKDM1MTUyNjcyNzEsNTY2MjgwNzExKSxuZXcgYygzOTQwMTg3NjA2LDM0NTQwNjk1MzQpLG5ldyBjKDQxMTg2MzAyNzEsNDAwMDIzOTk5MiksbmV3IGMoMTE2NDE4NDc0LDE5MTQxMzg1NTQpLG5ldyBjKDE3NDI5MjQyMSwyNzMxMDU1MjcwKSxuZXcgYygyODkzODAzNTYsMzIwMzk5MzAwNiksbmV3IGMoNDYwMzkzMjY5LDMyMDYyMDMxNSksbmV3IGMoNjg1NDcxNzMzLDU4NzQ5NjgzNiksbmV3IGMoODUyMTQyOTcxLDEwODY3OTI4NTEpLG5ldyBjKDEwMTcwMzYyOTgsMzY1NTQzMTAwKSxuZXcgYygxMTI2MDAwNTgwLDI2MTgyOTc2NzYpLG5ldyBjKDEyODgwMzM0NzAsMzQwOTg1NTE1OCksbmV3IGMoMTUwMTUwNTk0OCw0MjM0NTA5ODY2KSxuZXcgYygxNjA3MTY3OTE1LDk4NzE2NzQ2OCksbmV3IGMoMTgxNjQwMjMxNiwxMjQ2MTg5NTkxKV07cmV0dXJuIGZ1bmN0aW9uKG8sbCxoKXtsZXQgdSxkLGYsZyxwLG0sYix5LHc9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10mJmFyZ3VtZW50c1szXTt3Pyh1PW5ldyBjKDM0MTgwNzAzNjUsMzIzODM3MTAzMiksZD1uZXcgYygxNjU0MjcwMjUwLDkxNDE1MDY2MyksZj1uZXcgYygyNDM4NTI5MzcwLDgxMjcwMjk5OSksZz1uZXcgYygzNTU0NjIzNjAsNDE0NDkxMjY5NykscD1uZXcgYygxNzMxNDA1NDE1LDQyOTA3NzU4NTcpLG09bmV3IGMoMjM5NDE4MDIzMSwxNzUwNjAzMDI1KSxiPW5ldyBjKDM2NzUwMDg1MjUsMTY5NDA3NjgzOSkseT1uZXcgYygxMjAzMDYyODEzLDMyMDQwNzU0MjgpKToodT1uZXcgYygxNzc5MDMzNzAzLDQwODkyMzU3MjApLGQ9bmV3IGMoMzE0NDEzNDI3NywyMjI3ODczNTk1KSxmPW5ldyBjKDEwMTM5MDQyNDIsNDI3MTE3NTcyMyksZz1uZXcgYygyNzczNDgwNzYyLDE1OTU3NTAxMjkpLHA9bmV3IGMoMTM1OTg5MzExOSwyOTE3NTY1MTM3KSxtPW5ldyBjKDI2MDA4MjI5MjQsNzI1NTExMTk5KSxiPW5ldyBjKDUyODczNDYzNSw0MjE1Mzg5NTQ3KSx5PW5ldyBjKDE1NDE0NTkyMjUsMzI3MDMzMjA5KSk7Y29uc3Qgdj0xMjgqTWF0aC5jZWlsKChoKzE3KS8xMjgpLHg9bmV3IFVpbnQ4QXJyYXkodik7bGV0IFMsQTtmb3IoUz0wO1M8aDsrK1MpeFtTXT1vW2wrK107eFtTKytdPTEyODtjb25zdCBrPXYtMTY7Zm9yKDtTPGs7KXhbUysrXT0wO3hbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT0wLHhbUysrXT1oPj4+MjkmMjU1LHhbUysrXT1oPj4yMSYyNTUseFtTKytdPWg+PjEzJjI1NSx4W1MrK109aD4+NSYyNTUseFtTKytdPWg8PDMmMjU1O2NvbnN0IEM9bmV3IEFycmF5KDgwKTtmb3IoUz0wO1M8ODA7UysrKUNbU109bmV3IGMoMCwwKTtsZXQgTz1uZXcgYygwLDApLEY9bmV3IGMoMCwwKSxJPW5ldyBjKDAsMCksVD1uZXcgYygwLDApLE09bmV3IGMoMCwwKSxFPW5ldyBjKDAsMCksUD1uZXcgYygwLDApLFI9bmV3IGMoMCwwKTtjb25zdCBOPW5ldyBjKDAsMCksRD1uZXcgYygwLDApLEI9bmV3IGMoMCwwKSxMPW5ldyBjKDAsMCk7bGV0IF8sajtmb3IoUz0wO1M8djspe2ZvcihBPTA7QTwxNjsrK0EpQ1tBXS5oaWdoPXhbU108PDI0fHhbUysxXTw8MTZ8eFtTKzJdPDw4fHhbUyszXSxDW0FdLmxvdz14W1MrNF08PDI0fHhbUys1XTw8MTZ8eFtTKzZdPDw4fHhbUys3XSxTKz04O2ZvcihBPTE2O0E8ODA7KytBKV89Q1tBXSxpKF8sQ1tBLTJdLEwpLF8uYWRkKENbQS03XSksYShCLENbQS0xNV0sTCksXy5hZGQoQiksXy5hZGQoQ1tBLTE2XSk7Zm9yKE8uYXNzaWduKHUpLEYuYXNzaWduKGQpLEkuYXNzaWduKGYpLFQuYXNzaWduKGcpLE0uYXNzaWduKHApLEUuYXNzaWduKG0pLFAuYXNzaWduKGIpLFIuYXNzaWduKHkpLEE9MDtBPDgwOysrQSlOLmFzc2lnbihSKSxuKEIsTSxMKSxOLmFkZChCKSxlKEIsTSxFLFAsTCksTi5hZGQoQiksTi5hZGQoc1tBXSksTi5hZGQoQ1tBXSkscihELE8sTCksdChCLE8sRixJLEwpLEQuYWRkKEIpLF89UixSPVAsUD1FLEU9TSxULmFkZChOKSxNPVQsVD1JLEk9RixGPU8sXy5hc3NpZ24oTiksXy5hZGQoRCksTz1fO3UuYWRkKE8pLGQuYWRkKEYpLGYuYWRkKEkpLGcuYWRkKFQpLHAuYWRkKE0pLG0uYWRkKEUpLGIuYWRkKFApLHkuYWRkKFIpfXJldHVybiB3PyhqPW5ldyBVaW50OEFycmF5KDQ4KSx1LmNvcHlUbyhqLDApLGQuY29weVRvKGosOCksZi5jb3B5VG8oaiwxNiksZy5jb3B5VG8oaiwyNCkscC5jb3B5VG8oaiwzMiksbS5jb3B5VG8oaiw0MCkpOihqPW5ldyBVaW50OEFycmF5KDY0KSx1LmNvcHlUbyhqLDApLGQuY29weVRvKGosOCksZi5jb3B5VG8oaiwxNiksZy5jb3B5VG8oaiwyNCkscC5jb3B5VG8oaiwzMiksbS5jb3B5VG8oaiw0MCksYi5jb3B5VG8oaiw0OCkseS5jb3B5VG8oaiw1NikpLGp9fSgpO2Z1bmN0aW9uIHUoZSx0LHIpe3JldHVybiBoKGUsdCxyLCEwKX10LmNhbGN1bGF0ZVNIQTUxMj1oO2NsYXNzIGR7ZGVjcnlwdEJsb2NrKGUpe3JldHVybiBlfWVuY3J5cHQoZSl7cmV0dXJuIGV9fWNsYXNzIGZ7Y29uc3RydWN0b3IoKXt0aGlzLmNvbnN0cnVjdG9yPT09ZiYmKDAsbi51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEFFU0Jhc2VDaXBoZXIuIiksdGhpcy5fcz1uZXcgVWludDhBcnJheShbOTksMTI0LDExOSwxMjMsMjQyLDEwNywxMTEsMTk3LDQ4LDEsMTAzLDQzLDI1NCwyMTUsMTcxLDExOCwyMDIsMTMwLDIwMSwxMjUsMjUwLDg5LDcxLDI0MCwxNzMsMjEyLDE2MiwxNzUsMTU2LDE2NCwxMTQsMTkyLDE4MywyNTMsMTQ3LDM4LDU0LDYzLDI0NywyMDQsNTIsMTY1LDIyOSwyNDEsMTEzLDIxNiw0OSwyMSw0LDE5OSwzNSwxOTUsMjQsMTUwLDUsMTU0LDcsMTgsMTI4LDIyNiwyMzUsMzksMTc4LDExNyw5LDEzMSw0NCwyNiwyNywxMTAsOTAsMTYwLDgyLDU5LDIxNCwxNzksNDEsMjI3LDQ3LDEzMiw4MywyMDksMCwyMzcsMzIsMjUyLDE3Nyw5MSwxMDYsMjAzLDE5MCw1Nyw3NCw3Niw4OCwyMDcsMjA4LDIzOSwxNzAsMjUxLDY3LDc3LDUxLDEzMyw2OSwyNDksMiwxMjcsODAsNjAsMTU5LDE2OCw4MSwxNjMsNjQsMTQzLDE0NiwxNTcsNTYsMjQ1LDE4OCwxODIsMjE4LDMzLDE2LDI1NSwyNDMsMjEwLDIwNSwxMiwxOSwyMzYsOTUsMTUxLDY4LDIzLDE5NiwxNjcsMTI2LDYxLDEwMCw5MywyNSwxMTUsOTYsMTI5LDc5LDIyMCwzNCw0MiwxNDQsMTM2LDcwLDIzOCwxODQsMjAsMjIyLDk0LDExLDIxOSwyMjQsNTAsNTgsMTAsNzMsNiwzNiw5MiwxOTQsMjExLDE3Miw5OCwxNDUsMTQ5LDIyOCwxMjEsMjMxLDIwMCw1NSwxMDksMTQxLDIxMyw3OCwxNjksMTA4LDg2LDI0NCwyMzQsMTAxLDEyMiwxNzQsOCwxODYsMTIwLDM3LDQ2LDI4LDE2NiwxODAsMTk4LDIzMiwyMjEsMTE2LDMxLDc1LDE4OSwxMzksMTM4LDExMiw2MiwxODEsMTAyLDcyLDMsMjQ2LDE0LDk3LDUzLDg3LDE4NSwxMzQsMTkzLDI5LDE1OCwyMjUsMjQ4LDE1MiwxNywxMDUsMjE3LDE0MiwxNDgsMTU1LDMwLDEzNSwyMzMsMjA2LDg1LDQwLDIyMywxNDAsMTYxLDEzNywxMywxOTEsMjMwLDY2LDEwNCw2NSwxNTMsNDUsMTUsMTc2LDg0LDE4NywyMl0pLHRoaXMuX2ludl9zPW5ldyBVaW50OEFycmF5KFs4Miw5LDEwNiwyMTMsNDgsNTQsMTY1LDU2LDE5MSw2NCwxNjMsMTU4LDEyOSwyNDMsMjE1LDI1MSwxMjQsMjI3LDU3LDEzMCwxNTUsNDcsMjU1LDEzNSw1MiwxNDIsNjcsNjgsMTk2LDIyMiwyMzMsMjAzLDg0LDEyMywxNDgsNTAsMTY2LDE5NCwzNSw2MSwyMzgsNzYsMTQ5LDExLDY2LDI1MCwxOTUsNzgsOCw0NiwxNjEsMTAyLDQwLDIxNywzNiwxNzgsMTE4LDkxLDE2Miw3MywxMDksMTM5LDIwOSwzNywxMTQsMjQ4LDI0NiwxMDAsMTM0LDEwNCwxNTIsMjIsMjEyLDE2NCw5MiwyMDQsOTMsMTAxLDE4MiwxNDYsMTA4LDExMiw3Miw4MCwyNTMsMjM3LDE4NSwyMTgsOTQsMjEsNzAsODcsMTY3LDE0MSwxNTcsMTMyLDE0NCwyMTYsMTcxLDAsMTQwLDE4OCwyMTEsMTAsMjQ3LDIyOCw4OCw1LDE4NCwxNzksNjksNiwyMDgsNDQsMzAsMTQzLDIwMiw2MywxNSwyLDE5MywxNzUsMTg5LDMsMSwxOSwxMzgsMTA3LDU4LDE0NSwxNyw2NSw3OSwxMDMsMjIwLDIzNCwxNTEsMjQyLDIwNywyMDYsMjQwLDE4MCwyMzAsMTE1LDE1MCwxNzIsMTE2LDM0LDIzMSwxNzMsNTMsMTMzLDIyNiwyNDksNTUsMjMyLDI4LDExNywyMjMsMTEwLDcxLDI0MSwyNiwxMTMsMjksNDEsMTk3LDEzNywxMTEsMTgzLDk4LDE0LDE3MCwyNCwxOTAsMjcsMjUyLDg2LDYyLDc1LDE5OCwyMTAsMTIxLDMyLDE1NCwyMTksMTkyLDI1NCwxMjAsMjA1LDkwLDI0NCwzMSwyMjEsMTY4LDUxLDEzNiw3LDE5OSw0OSwxNzcsMTgsMTYsODksMzksMTI4LDIzNiw5NSw5Niw4MSwxMjcsMTY5LDI1LDE4MSw3NCwxMyw0NSwyMjksMTIyLDE1OSwxNDcsMjAxLDE1NiwyMzksMTYwLDIyNCw1OSw3NywxNzQsNDIsMjQ1LDE3NiwyMDAsMjM1LDE4Nyw2MCwxMzEsODMsMTUzLDk3LDIzLDQzLDQsMTI2LDE4NiwxMTksMjE0LDM4LDIyNSwxMDUsMjAsOTksODUsMzMsMTIsMTI1XSksdGhpcy5fbWl4PW5ldyBVaW50MzJBcnJheShbMCwyMzU0NzQxODcsNDcwOTQ4Mzc0LDMwMzc2NTI3Nyw5NDE4OTY3NDgsOTA4OTMzNDE1LDYwNzUzMDU1NCw3MDg3ODA4NDksMTg4Mzc5MzQ5NiwyMTE4MjE0OTk1LDE4MTc4NjY4MzAsMTY0OTYzOTIzNywxMjE1MDYxMTA4LDExODEwNDUxMTksMTQxNzU2MTY5OCwxNTE3NzY3NTI5LDM3Njc1ODY5OTIsNDAwMzA2MTE3OSw0MjM2NDI5OTkwLDQwNjkyNDY4OTMsMzYzNTczMzY2MCwzNjAyNzcwMzI3LDMyOTkyNzg0NzQsMzQwMDUyODc2OSwyNDMwMTIyMjE2LDI2NjQ1NDM3MTUsMjM2MjA5MDIzOCwyMTkzODYyNjQ1LDI4MzUxMjMzOTYsMjgwMTEwNzQwNywzMDM1NTM1MDU4LDMxMzU3NDA4ODksMzY3ODEyNDkyMywzNTc2ODcwNTEyLDMzNDEzOTQyODUsMzM3NDM2MTcwMiwzODEwNDk2MzQzLDM5Nzc2NzUzNTYsNDI3OTA4MDI1Nyw0MDQzNjEwMTg2LDI4NzY0OTQ2MjcsMjc3NjI5MjkwNCwzMDc2NjM5MDI5LDMxMTA2NTA5NDIsMjQ3MjAxMTUzNSwyNjQwMjQzMjA0LDI0MDM3Mjg2NjUsMjE2OTMwMzA1OCwxMDAxMDg5OTk1LDg5OTgzNTU4NCw2NjY0NjQ3MzMsNjk5NDMyMTUwLDU5NzI3ODQ3LDIyNjkwNjg2MCw1MzA0MDA3NTMsMjk0OTMwNjgyLDEyNzMxNjg3ODcsMTE3Mjk2NzA2NCwxNDc1NDE4NTAxLDE1MDk0MzA0MTQsMTk0MjQzNTc3NSwyMTEwNjY3NDQ0LDE4NzYyNDE4MzMsMTY0MTgxNjIyNiwyOTEwMjE5NzY2LDI3NDMwMzQxMDksMjk3NjE1MTUyMCwzMjExNjIzMTQ3LDI1MDUyMDIxMzgsMjYwNjQ1Mzk2OSwyMzAyNjkwMjUyLDIyNjk3Mjg0NTUsMzcxMTgyOTQyMiwzNTQzNTk5MjY5LDMyNDA4OTQzOTIsMzQ3NTMxMzMzMSwzODQzNjk5MDc0LDM5NDM5MDY0NDEsNDE3ODA2MjIyOCw0MTQ0MDQ3Nzc1LDEzMDY5NjczNjYsMTEzOTc4MTcwOSwxMzc0OTg4MTEyLDE2MTA0NTk3MzksMTk3NTY4MzQzNCwyMDc2OTM1MjY1LDE3NzUyNzY5MjQsMTc0MjMxNTEyNywxMDM0ODY3OTk4LDg2NjYzNzg0NSw1NjYwMjE4OTYsODAwNDQwODM1LDkyOTg3Njk4LDE5MzE5NTA2NSw0Mjk0NTYxNjQsMzk1NDQxNzExLDE5ODQ4MTI2ODUsMjAxNzc3ODU2NiwxNzg0NjYzMTk1LDE2ODM0MDcyNDgsMTMxNTU2MjE0NSwxMDgwMDk0NjM0LDEzODM4NTYzMTEsMTU1MTAzNzg4NCwxMDEwMzk4MjksMTM1MDUwMjA2LDQzNzc1NzEyMywzMzc1NTM4NjQsMTA0MjM4NTY1Nyw4MDc5NjI2MTAsNTczODA0NzgzLDc0MjAzOTAxMiwyNTMxMDY3NDUzLDI1NjQwMzMzMzQsMjMyODgyODk3MSwyMjI3NTczMDI0LDI5MzU1NjY4NjUsMjcwMDA5OTM1NCwzMDAxNzU1NjU1LDMxNjg5MzcyMjgsMzg2ODU1MjgwNSwzOTAyNTYzMTgyLDQyMDMxODExNzEsNDEwMjk3NzkxMiwzNzM2MTY0OTM3LDM1MDE3NDE4OTAsMzI2NTQ3ODc1MSwzNDMzNzEyOTgwLDExMDYwNDE1OTEsMTM0MDQ2MzEwMCwxNTc2OTc2NjA5LDE0MDg3NDkwMzQsMjA0MzIxMTQ4MywyMDA5MTk1NDcyLDE3MDg4NDgzMzMsMTgwOTA1NDE1MCw4MzI4NzcyMzEsMTA2ODM1MTM5Niw3NjY5NDU0NjUsNTk5NzYyMzU0LDE1OTQxNzk4NywxMjY0NTQ2NjQsMzYxOTI5ODc3LDQ2MzE4MDE5MCwyNzA5MjYwODcxLDI5NDM2ODIzODAsMzE3ODEwNjk2MSwzMDA5ODc5Mzg2LDI1NzI2OTcxOTUsMjUzODY4MTE4NCwyMjM2MjI4NzMzLDIzMzY0MzQ1NTAsMzUwOTg3MTEzNSwzNzQ1MzQ1MzAwLDM0NDE4NTAzNzcsMzI3NDY2NzI2NiwzOTEwMTYxOTcxLDM4NzcxOTg2NDgsNDExMDU2ODQ4NSw0MjExODE4Nzk4LDI1OTc4MDY0NzYsMjQ5NzYwNDc0MywyMjYxMDg5MTc4LDIyOTUxMDEwNzMsMjczMzg1NjE2MCwyOTAyMDg3ODUxLDMyMDI0MzcwNDYsMjk2ODAxMTQ1MywzOTM2MjkxMjg0LDM4MzUwMzY4OTUsNDEzNjQ0MDc3MCw0MTY5NDA4MjAxLDM1MzU0ODY0NTYsMzcwMjY2NTQ1OSwzNDY3MTkyMzAyLDMyMzE3MjIyMTMsMjA1MTUxODc4MCwxOTUxMzE3MDQ3LDE3MTY4OTA0MTAsMTc1MDkwMjMwNSwxMTEzODE4Mzg0LDEyODIwNTAwNzUsMTU4NDUwNDU4MiwxMzUwMDc4OTg5LDE2ODgxMDg1Miw2NzU1NjQ2MywzNzEwNDkzMzAsNDA0MDE2NzYxLDg0MTczOTU5MiwxMDA4OTE4NTk1LDc3NTU1MDgxNCw1NDAwODA3MjUsMzk2OTU2MjM2OSwzODAxMzMyMjM0LDQwMzU0ODkwNDcsNDI2OTkwNzk5NiwzNTY5MjU1MjEzLDM2Njk0NjI1NjYsMzM2Njc1NDYxOSwzMzMyNzQwMTQ0LDI2MzEwNjU0MzMsMjQ2Mzg3OTc2MiwyMTYwMTE3MDcxLDIzOTU1ODg2NzYsMjc2NzY0NTU1NywyODY4ODk3NDA2LDMxMDIwMTE3NDcsMzA2OTA0OTk2MCwyMDIwMDg0OTcsMzM3NzgzNjIsMjcwMDQwNDg3LDUwNDQ1OTQzNiw4NzU0NTEyOTMsOTc1NjU4NjQ2LDY3NTAzOTYyNyw2NDEwMjUxNTIsMjA4NDcwNDIzMywxOTE3NTE4NTYyLDE2MTU4NjEyNDcsMTg1MTMzMjg1MiwxMTQ3NTUwNjYxLDEyNDg4MDI1MTAsMTQ4NDAwNTg0MywxNDUxMDQ0MDU2LDkzMzMwMTM3MCw5NjczMTE3MjksNzMzMTU2OTcyLDYzMjk1MzcwMywyNjAzODg5NTAsMjU5NjU5MTcsMzI4NjcxODA4LDQ5NjkwNjA1OSwxMjA2NDc3ODU4LDEyMzk0NDM3NTMsMTU0MzIwODUwMCwxNDQxOTUyNTc1LDIxNDQxNjE4MDYsMTkwODY5NDI3NywxNjc1NTc3ODgwLDE4NDI3NTk0NDMsMzYxMDM2OTIyNiwzNjQ0Mzc5NTg1LDM0MDgxMTk1MTYsMzMwNzkxNjI0Nyw0MDExMTkwNTAyLDM3NzY3Njc0NjksNDA3NzM4NDQzMiw0MjQ1NjE4NjgzLDI4MDk3NzExNTQsMjg0MjczNzA0OSwzMTQ0Mzk2NDIwLDMwNDMxNDA0OTUsMjY3MzcwNTE1MCwyNDM4MjM3NjIxLDIyMDMwMzIyMzIsMjM3MDIxMzc5NV0pLHRoaXMuX21peENvbD1uZXcgVWludDhBcnJheSgyNTYpO2ZvcihsZXQgZT0wO2U8MjU2O2UrKyl0aGlzLl9taXhDb2xbZV09ZTwxMjg/ZTw8MTplPDwxXjI3O3RoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDE2KSx0aGlzLmJ1ZmZlclBvc2l0aW9uPTB9X2V4cGFuZEtleShlKXsoMCxuLnVucmVhY2hhYmxlKSgiQ2Fubm90IGNhbGwgYF9leHBhbmRLZXlgIG9uIHRoZSBiYXNlIGNsYXNzIil9X2RlY3J5cHQoZSx0KXtsZXQgcixuLGE7Y29uc3QgaT1uZXcgVWludDhBcnJheSgxNik7aS5zZXQoZSk7Zm9yKGxldCBlPTAscj10aGlzLl9rZXlTaXplO2U8MTY7KytlLCsrcilpW2VdXj10W3JdO2ZvcihsZXQgZT10aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24tMTtlPj0xOy0tZSl7cj1pWzEzXSxpWzEzXT1pWzldLGlbOV09aVs1XSxpWzVdPWlbMV0saVsxXT1yLHI9aVsxNF0sbj1pWzEwXSxpWzE0XT1pWzZdLGlbMTBdPWlbMl0saVs2XT1yLGlbMl09bixyPWlbMTVdLG49aVsxMV0sYT1pWzddLGlbMTVdPWlbM10saVsxMV09cixpWzddPW4saVszXT1hO2ZvcihsZXQgZT0wO2U8MTY7KytlKWlbZV09dGhpcy5faW52X3NbaVtlXV07Zm9yKGxldCByPTAsbj0xNiplO3I8MTY7KytyLCsrbilpW3JdXj10W25dO2ZvcihsZXQgZT0wO2U8MTY7ZSs9NCl7Y29uc3QgdD10aGlzLl9taXhbaVtlXV0sbj10aGlzLl9taXhbaVtlKzFdXSxhPXRoaXMuX21peFtpW2UrMl1dLHM9dGhpcy5fbWl4W2lbZSszXV07cj10Xm4+Pj44Xm48PDI0XmE+Pj4xNl5hPDwxNl5zPj4+MjReczw8OCxpW2VdPXI+Pj4yNCYyNTUsaVtlKzFdPXI+PjE2JjI1NSxpW2UrMl09cj4+OCYyNTUsaVtlKzNdPTI1NSZyfX1yPWlbMTNdLGlbMTNdPWlbOV0saVs5XT1pWzVdLGlbNV09aVsxXSxpWzFdPXIscj1pWzE0XSxuPWlbMTBdLGlbMTRdPWlbNl0saVsxMF09aVsyXSxpWzZdPXIsaVsyXT1uLHI9aVsxNV0sbj1pWzExXSxhPWlbN10saVsxNV09aVszXSxpWzExXT1yLGlbN109bixpWzNdPWE7Zm9yKGxldCBlPTA7ZTwxNjsrK2UpaVtlXT10aGlzLl9pbnZfc1tpW2VdXSxpW2VdXj10W2VdO3JldHVybiBpfV9lbmNyeXB0KGUsdCl7Y29uc3Qgcj10aGlzLl9zO2xldCBuLGEsaTtjb25zdCBzPW5ldyBVaW50OEFycmF5KDE2KTtzLnNldChlKTtmb3IobGV0IGU9MDtlPDE2OysrZSlzW2VdXj10W2VdO2ZvcihsZXQgZT0xO2U8dGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uO2UrKyl7Zm9yKGxldCBlPTA7ZTwxNjsrK2Upc1tlXT1yW3NbZV1dO2k9c1sxXSxzWzFdPXNbNV0sc1s1XT1zWzldLHNbOV09c1sxM10sc1sxM109aSxpPXNbMl0sYT1zWzZdLHNbMl09c1sxMF0sc1s2XT1zWzE0XSxzWzEwXT1pLHNbMTRdPWEsaT1zWzNdLGE9c1s3XSxuPXNbMTFdLHNbM109c1sxNV0sc1s3XT1pLHNbMTFdPWEsc1sxNV09bjtmb3IobGV0IGU9MDtlPDE2O2UrPTQpe2NvbnN0IHQ9c1tlKzBdLHI9c1tlKzFdLGE9c1tlKzJdLGk9c1tlKzNdO249dF5yXmFeaSxzW2UrMF1ePW5edGhpcy5fbWl4Q29sW3Recl0sc1tlKzFdXj1uXnRoaXMuX21peENvbFtyXmFdLHNbZSsyXV49bl50aGlzLl9taXhDb2xbYV5pXSxzW2UrM11ePW5edGhpcy5fbWl4Q29sW2ledF19Zm9yKGxldCByPTAsbj0xNiplO3I8MTY7KytyLCsrbilzW3JdXj10W25dfWZvcihsZXQgZT0wO2U8MTY7KytlKXNbZV09cltzW2VdXTtpPXNbMV0sc1sxXT1zWzVdLHNbNV09c1s5XSxzWzldPXNbMTNdLHNbMTNdPWksaT1zWzJdLGE9c1s2XSxzWzJdPXNbMTBdLHNbNl09c1sxNF0sc1sxMF09aSxzWzE0XT1hLGk9c1szXSxhPXNbN10sbj1zWzExXSxzWzNdPXNbMTVdLHNbN109aSxzWzExXT1hLHNbMTVdPW47Zm9yKGxldCBlPTAscj10aGlzLl9rZXlTaXplO2U8MTY7KytlLCsrcilzW2VdXj10W3JdO3JldHVybiBzfV9kZWNyeXB0QmxvY2syKGUsdCl7Y29uc3Qgcj1lLmxlbmd0aDtsZXQgbj10aGlzLmJ1ZmZlcixhPXRoaXMuYnVmZmVyUG9zaXRpb247Y29uc3QgaT1bXTtsZXQgcz10aGlzLml2O2ZvcihsZXQgdD0wO3Q8cjsrK3Qpe2lmKG5bYV09ZVt0XSwrK2EsYTwxNiljb250aW51ZTtjb25zdCByPXRoaXMuX2RlY3J5cHQobix0aGlzLl9rZXkpO2ZvcihsZXQgZT0wO2U8MTY7KytlKXJbZV1ePXNbZV07cz1uLGkucHVzaChyKSxuPW5ldyBVaW50OEFycmF5KDE2KSxhPTB9aWYodGhpcy5idWZmZXI9bix0aGlzLmJ1ZmZlckxlbmd0aD1hLHRoaXMuaXY9cywwPT09aS5sZW5ndGgpcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO2xldCBvPTE2KmkubGVuZ3RoO2lmKHQpe2NvbnN0IGU9aS5hdCgtMSk7bGV0IHQ9ZVsxNV07aWYodDw9MTYpe2ZvcihsZXQgcj0xNSxuPTE2LXQ7cj49bjstLXIpaWYoZVtyXSE9PXQpe3Q9MDticmVha31vLT10LGlbaS5sZW5ndGgtMV09ZS5zdWJhcnJheSgwLDE2LXQpfX1jb25zdCBjPW5ldyBVaW50OEFycmF5KG8pO2ZvcihsZXQgZT0wLHQ9MCxyPWkubGVuZ3RoO2U8cjsrK2UsdCs9MTYpYy5zZXQoaVtlXSx0KTtyZXR1cm4gY31kZWNyeXB0QmxvY2soZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtjb25zdCBuPWUubGVuZ3RoLGE9dGhpcy5idWZmZXI7bGV0IGk9dGhpcy5idWZmZXJQb3NpdGlvbjtpZihyKXRoaXMuaXY9cjtlbHNle2ZvcihsZXQgdD0wO2k8MTYmJnQ8bjsrK3QsKytpKWFbaV09ZVt0XTtpZihpPDE2KXJldHVybiB0aGlzLmJ1ZmZlckxlbmd0aD1pLG5ldyBVaW50OEFycmF5KDApO3RoaXMuaXY9YSxlPWUuc3ViYXJyYXkoMTYpfXJldHVybiB0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxNiksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmRlY3J5cHRCbG9jaz10aGlzLl9kZWNyeXB0QmxvY2syLHRoaXMuZGVjcnlwdEJsb2NrKGUsdCl9ZW5jcnlwdChlLHQpe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IG49dGhpcy5idWZmZXIsYT10aGlzLmJ1ZmZlclBvc2l0aW9uO2NvbnN0IGk9W107dHx8KHQ9bmV3IFVpbnQ4QXJyYXkoMTYpKTtmb3IobGV0IHM9MDtzPHI7KytzKXtpZihuW2FdPWVbc10sKythLGE8MTYpY29udGludWU7Zm9yKGxldCBlPTA7ZTwxNjsrK2UpbltlXV49dFtlXTtjb25zdCByPXRoaXMuX2VuY3J5cHQobix0aGlzLl9rZXkpO3Q9cixpLnB1c2gociksbj1uZXcgVWludDhBcnJheSgxNiksYT0wfWlmKHRoaXMuYnVmZmVyPW4sdGhpcy5idWZmZXJMZW5ndGg9YSx0aGlzLml2PXQsMD09PWkubGVuZ3RoKXJldHVybiBuZXcgVWludDhBcnJheSgwKTtjb25zdCBzPTE2KmkubGVuZ3RoLG89bmV3IFVpbnQ4QXJyYXkocyk7Zm9yKGxldCBlPTAsdD0wLHI9aS5sZW5ndGg7ZTxyOysrZSx0Kz0xNilvLnNldChpW2VdLHQpO3JldHVybiBvfX1jbGFzcyBnIGV4dGVuZHMgZntjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbj0xMCx0aGlzLl9rZXlTaXplPTE2MCx0aGlzLl9yY29uPW5ldyBVaW50OEFycmF5KFsxNDEsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTQsMTA4LDIxNiwxNzEsNzcsMTU0LDQ3LDk0LDE4OCw5OSwxOTgsMTUxLDUzLDEwNiwyMTIsMTc5LDEyNSwyNTAsMjM5LDE5NywxNDUsNTcsMTE0LDIyOCwyMTEsMTg5LDk3LDE5NCwxNTksMzcsNzQsMTQ4LDUxLDEwMiwyMDQsMTMxLDI5LDU4LDExNiwyMzIsMjAzLDE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0LDEwOCwyMTYsMTcxLDc3LDE1NCw0Nyw5NCwxODgsOTksMTk4LDE1MSw1MywxMDYsMjEyLDE3OSwxMjUsMjUwLDIzOSwxOTcsMTQ1LDU3LDExNCwyMjgsMjExLDE4OSw5NywxOTQsMTU5LDM3LDc0LDE0OCw1MSwxMDIsMjA0LDEzMSwyOSw1OCwxMTYsMjMyLDIwMywxNDEsMSwyLDQsOCwxNiwzMiw2NCwxMjgsMjcsNTQsMTA4LDIxNiwxNzEsNzcsMTU0LDQ3LDk0LDE4OCw5OSwxOTgsMTUxLDUzLDEwNiwyMTIsMTc5LDEyNSwyNTAsMjM5LDE5NywxNDUsNTcsMTE0LDIyOCwyMTEsMTg5LDk3LDE5NCwxNTksMzcsNzQsMTQ4LDUxLDEwMiwyMDQsMTMxLDI5LDU4LDExNiwyMzIsMjAzLDE0MSwxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNyw1NCwxMDgsMjE2LDE3MSw3NywxNTQsNDcsOTQsMTg4LDk5LDE5OCwxNTEsNTMsMTA2LDIxMiwxNzksMTI1LDI1MCwyMzksMTk3LDE0NSw1NywxMTQsMjI4LDIxMSwxODksOTcsMTk0LDE1OSwzNyw3NCwxNDgsNTEsMTAyLDIwNCwxMzEsMjksNTgsMTE2LDIzMiwyMDMsMTQxXSksdGhpcy5fa2V5PXRoaXMuX2V4cGFuZEtleShlKX1fZXhwYW5kS2V5KGUpe2NvbnN0IHQ9dGhpcy5fcyxyPXRoaXMuX3Jjb24sbj1uZXcgVWludDhBcnJheSgxNzYpO24uc2V0KGUpO2ZvcihsZXQgZT0xNixhPTE7ZTwxNzY7KythKXtsZXQgaT1uW2UtM10scz1uW2UtMl0sbz1uW2UtMV0sYz1uW2UtNF07aT10W2ldLHM9dFtzXSxvPXRbb10sYz10W2NdLGlePXJbYV07Zm9yKGxldCB0PTA7dDw0OysrdCluW2VdPWlePW5bZS0xNl0sZSsrLG5bZV09c149bltlLTE2XSxlKyssbltlXT1vXj1uW2UtMTZdLGUrKyxuW2VdPWNePW5bZS0xNl0sZSsrfXJldHVybiBufX10LkFFUzEyOENpcGhlcj1nO2NsYXNzIHAgZXh0ZW5kcyBme2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uPTE0LHRoaXMuX2tleVNpemU9MjI0LHRoaXMuX2tleT10aGlzLl9leHBhbmRLZXkoZSl9X2V4cGFuZEtleShlKXtjb25zdCB0PXRoaXMuX3Mscj1uZXcgVWludDhBcnJheSgyNDApO3Iuc2V0KGUpO2xldCBuLGEsaSxzLG89MTtmb3IobGV0IGU9MzIsYz0xO2U8MjQwOysrYyl7ZSUzMj09MTY/KG49dFtuXSxhPXRbYV0saT10W2ldLHM9dFtzXSk6ZSUzMj09MCYmKG49cltlLTNdLGE9cltlLTJdLGk9cltlLTFdLHM9cltlLTRdLG49dFtuXSxhPXRbYV0saT10W2ldLHM9dFtzXSxuXj1vLChvPDw9MSk+PTI1NiYmKG89MjU1JigyN15vKSkpO2ZvcihsZXQgdD0wO3Q8NDsrK3QpcltlXT1uXj1yW2UtMzJdLGUrKyxyW2VdPWFePXJbZS0zMl0sZSsrLHJbZV09aV49cltlLTMyXSxlKysscltlXT1zXj1yW2UtMzJdLGUrK31yZXR1cm4gcn19dC5BRVMyNTZDaXBoZXI9cDtjbGFzcyBte2NoZWNrT3duZXJQYXNzd29yZChlLHQscixhKXtjb25zdCBpPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzU2KTtpLnNldChlLDApLGkuc2V0KHQsZS5sZW5ndGgpLGkuc2V0KHIsZS5sZW5ndGgrdC5sZW5ndGgpO2NvbnN0IHM9bChpLDAsaS5sZW5ndGgpO3JldHVybigwLG4uaXNBcnJheUVxdWFsKShzLGEpfWNoZWNrVXNlclBhc3N3b3JkKGUsdCxyKXtjb25zdCBhPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzgpO2Euc2V0KGUsMCksYS5zZXQodCxlLmxlbmd0aCk7Y29uc3QgaT1sKGEsMCxhLmxlbmd0aCk7cmV0dXJuKDAsbi5pc0FycmF5RXF1YWwpKGkscil9Z2V0T3duZXJLZXkoZSx0LHIsbil7Y29uc3QgYT1uZXcgVWludDhBcnJheShlLmxlbmd0aCs1Nik7YS5zZXQoZSwwKSxhLnNldCh0LGUubGVuZ3RoKSxhLnNldChyLGUubGVuZ3RoK3QubGVuZ3RoKTtjb25zdCBpPWwoYSwwLGEubGVuZ3RoKTtyZXR1cm4gbmV3IHAoaSkuZGVjcnlwdEJsb2NrKG4sITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX1nZXRVc2VyS2V5KGUsdCxyKXtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzgpO24uc2V0KGUsMCksbi5zZXQodCxlLmxlbmd0aCk7Y29uc3QgYT1sKG4sMCxuLmxlbmd0aCk7cmV0dXJuIG5ldyBwKGEpLmRlY3J5cHRCbG9jayhyLCExLG5ldyBVaW50OEFycmF5KDE2KSl9fXQuUERGMTc9bTtjbGFzcyBie19oYXNoKGUsdCxyKXtsZXQgbj1sKHQsMCx0Lmxlbmd0aCkuc3ViYXJyYXkoMCwzMiksYT1bMF0saT0wO2Zvcig7aTw2NHx8YS5hdCgtMSk+aS0zMjspe2NvbnN0IHQ9ZS5sZW5ndGgrbi5sZW5ndGgrci5sZW5ndGgscz1uZXcgVWludDhBcnJheSh0KTtsZXQgbz0wO3Muc2V0KGUsbyksbys9ZS5sZW5ndGgscy5zZXQobixvKSxvKz1uLmxlbmd0aCxzLnNldChyLG8pO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoNjQqdCk7Zm9yKGxldCBlPTAscj0wO2U8NjQ7ZSsrLHIrPXQpYy5zZXQocyxyKTthPW5ldyBnKG4uc3ViYXJyYXkoMCwxNikpLmVuY3J5cHQoYyxuLnN1YmFycmF5KDE2LDMyKSk7Y29uc3QgZD1hLnNsaWNlKDAsMTYpLnJlZHVjZSgoKGUsdCk9PmUrdCksMCklMzswPT09ZD9uPWwoYSwwLGEubGVuZ3RoKToxPT09ZD9uPXUoYSwwLGEubGVuZ3RoKToyPT09ZCYmKG49aChhLDAsYS5sZW5ndGgpKSxpKyt9cmV0dXJuIG4uc3ViYXJyYXkoMCwzMil9Y2hlY2tPd25lclBhc3N3b3JkKGUsdCxyLGEpe2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrNTYpO2kuc2V0KGUsMCksaS5zZXQodCxlLmxlbmd0aCksaS5zZXQocixlLmxlbmd0aCt0Lmxlbmd0aCk7Y29uc3Qgcz10aGlzLl9oYXNoKGUsaSxyKTtyZXR1cm4oMCxuLmlzQXJyYXlFcXVhbCkocyxhKX1jaGVja1VzZXJQYXNzd29yZChlLHQscil7Y29uc3QgYT1uZXcgVWludDhBcnJheShlLmxlbmd0aCs4KTthLnNldChlLDApLGEuc2V0KHQsZS5sZW5ndGgpO2NvbnN0IGk9dGhpcy5faGFzaChlLGEsW10pO3JldHVybigwLG4uaXNBcnJheUVxdWFsKShpLHIpfWdldE93bmVyS2V5KGUsdCxyLG4pe2NvbnN0IGE9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrNTYpO2Euc2V0KGUsMCksYS5zZXQodCxlLmxlbmd0aCksYS5zZXQocixlLmxlbmd0aCt0Lmxlbmd0aCk7Y29uc3QgaT10aGlzLl9oYXNoKGUsYSxyKTtyZXR1cm4gbmV3IHAoaSkuZGVjcnlwdEJsb2NrKG4sITEsbmV3IFVpbnQ4QXJyYXkoMTYpKX1nZXRVc2VyS2V5KGUsdCxyKXtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoKzgpO24uc2V0KGUsMCksbi5zZXQodCxlLmxlbmd0aCk7Y29uc3QgYT10aGlzLl9oYXNoKGUsbixbXSk7cmV0dXJuIG5ldyBwKGEpLmRlY3J5cHRCbG9jayhyLCExLG5ldyBVaW50OEFycmF5KDE2KSl9fXQuUERGMjA9YjtjbGFzcyB5e2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3Rvcj1lLHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I9dH1jcmVhdGVTdHJlYW0oZSx0KXtjb25zdCByPW5ldyB0aGlzLlN0cmVhbUNpcGhlckNvbnN0cnVjdG9yO3JldHVybiBuZXcgaS5EZWNyeXB0U3RyZWFtKGUsdCwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5kZWNyeXB0QmxvY2soZSx0KX0pKX1kZWNyeXB0U3RyaW5nKGUpe2NvbnN0IHQ9bmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3I7bGV0IHI9KDAsbi5zdHJpbmdUb0J5dGVzKShlKTtyZXR1cm4gcj10LmRlY3J5cHRCbG9jayhyLCEwKSwoMCxuLmJ5dGVzVG9TdHJpbmcpKHIpfWVuY3J5cHRTdHJpbmcoZSl7Y29uc3QgdD1uZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcjtpZih0IGluc3RhbmNlb2YgZil7Y29uc3Qgcj0xNi1lLmxlbmd0aCUxNjtlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHIpLnJlcGVhdChyKTtjb25zdCBhPW5ldyBVaW50OEFycmF5KDE2KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0byljcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGEpO2Vsc2UgZm9yKGxldCBlPTA7ZTwxNjtlKyspYVtlXT1NYXRoLmZsb29yKDI1NipNYXRoLnJhbmRvbSgpKTtsZXQgaT0oMCxuLnN0cmluZ1RvQnl0ZXMpKGUpO2k9dC5lbmNyeXB0KGksYSk7Y29uc3Qgcz1uZXcgVWludDhBcnJheSgxNitpLmxlbmd0aCk7cmV0dXJuIHMuc2V0KGEpLHMuc2V0KGksMTYpLCgwLG4uYnl0ZXNUb1N0cmluZykocyl9bGV0IHI9KDAsbi5zdHJpbmdUb0J5dGVzKShlKTtyZXR1cm4gcj10LmVuY3J5cHQociksKDAsbi5ieXRlc1RvU3RyaW5nKShyKX19Y29uc3Qgdz1mdW5jdGlvbigpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoWzQwLDE5MSw3OCw5NCw3OCwxMTcsMTM4LDY1LDEwMCwwLDc4LDg2LDI1NSwyNTAsMSw4LDQ2LDQ2LDAsMTgyLDIwOCwxMDQsNjIsMTI4LDQ3LDEyLDE2OSwyNTQsMTAwLDgzLDEwNSwxMjJdKTtmdW5jdGlvbiB0KHQscixuLGEsaSxjLGwsaCl7Y29uc3QgdT00MCtuLmxlbmd0aCt0Lmxlbmd0aCxkPW5ldyBVaW50OEFycmF5KHUpO2xldCBmLGcscD0wO2lmKHIpZm9yKGc9TWF0aC5taW4oMzIsci5sZW5ndGgpO3A8ZzsrK3ApZFtwXT1yW3BdO2ZvcihmPTA7cDwzMjspZFtwKytdPWVbZisrXTtmb3IoZj0wLGc9bi5sZW5ndGg7ZjxnOysrZilkW3ArK109bltmXTtmb3IoZFtwKytdPTI1NSZpLGRbcCsrXT1pPj44JjI1NSxkW3ArK109aT4+MTYmMjU1LGRbcCsrXT1pPj4+MjQmMjU1LGY9MCxnPXQubGVuZ3RoO2Y8ZzsrK2YpZFtwKytdPXRbZl07Yz49NCYmIWgmJihkW3ArK109MjU1LGRbcCsrXT0yNTUsZFtwKytdPTI1NSxkW3ArK109MjU1KTtsZXQgbT1vKGQsMCxwKTtjb25zdCBiPWw+PjM7aWYoYz49Mylmb3IoZj0wO2Y8NTA7KytmKW09byhtLDAsYik7Y29uc3QgeT1tLnN1YmFycmF5KDAsYik7bGV0IHcsdjtpZihjPj0zKXtmb3IocD0wO3A8MzI7KytwKWRbcF09ZVtwXTtmb3IoZj0wLGc9dC5sZW5ndGg7ZjxnOysrZilkW3ArK109dFtmXTt3PW5ldyBzKHkpLHY9dy5lbmNyeXB0QmxvY2sobyhkLDAscCkpLGc9eS5sZW5ndGg7Y29uc3Qgcj1uZXcgVWludDhBcnJheShnKTtmb3IoZj0xO2Y8PTE5OysrZil7Zm9yKGxldCBlPTA7ZTxnOysrZSlyW2VdPXlbZV1eZjt3PW5ldyBzKHIpLHY9dy5lbmNyeXB0QmxvY2sodil9Zm9yKGY9MCxnPXYubGVuZ3RoO2Y8ZzsrK2YpaWYoYVtmXSE9PXZbZl0pcmV0dXJuIG51bGx9ZWxzZSBmb3Iodz1uZXcgcyh5KSx2PXcuZW5jcnlwdEJsb2NrKGUpLGY9MCxnPXYubGVuZ3RoO2Y8ZzsrK2YpaWYoYVtmXSE9PXZbZl0pcmV0dXJuIG51bGw7cmV0dXJuIHl9Y29uc3Qgcj1hLk5hbWUuZ2V0KCJJZGVudGl0eSIpO2Z1bmN0aW9uIGkoZSx0LHIpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107Y29uc3QgYT1uZXcgVWludDhBcnJheShyLmxlbmd0aCs5KSxpPXIubGVuZ3RoO2xldCBzO2ZvcihzPTA7czxpOysrcylhW3NdPXJbc107cmV0dXJuIGFbcysrXT0yNTUmZSxhW3MrK109ZT4+OCYyNTUsYVtzKytdPWU+PjE2JjI1NSxhW3MrK109MjU1JnQsYVtzKytdPXQ+PjgmMjU1LG4mJihhW3MrK109MTE1LGFbcysrXT02NSxhW3MrK109MTA4LGFbcysrXT04NCksbyhhLDAscykuc3ViYXJyYXkoMCxNYXRoLm1pbihyLmxlbmd0aCs1LDE2KSl9ZnVuY3Rpb24gYyhlLHQscixvLGMpe2lmKCEodCBpbnN0YW5jZW9mIGEuTmFtZSkpdGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIkludmFsaWQgY3J5cHQgZmlsdGVyIG5hbWUuIik7Y29uc3QgbD1lLmdldCh0Lm5hbWUpO2xldCBoO2lmKG51bGwhPWwmJihoPWwuZ2V0KCJDRk0iKSksIWh8fCJOb25lIj09PWgubmFtZSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGR9O2lmKCJWMiI9PT1oLm5hbWUpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBzKGkocixvLGMsITEpKX07aWYoIkFFU1YyIj09PWgubmFtZSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGcoaShyLG8sYywhMCkpfTtpZigiQUVTVjMiPT09aC5uYW1lKXJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgcChjKX07dGhyb3cgbmV3IG4uRm9ybWF0RXJyb3IoIlVua25vd24gY3J5cHRvIG1ldGhvZCIpfXJldHVybiBjbGFzc3tjb25zdHJ1Y3RvcihpLGMsbCl7Y29uc3QgaD1pLmdldCgiRmlsdGVyIik7aWYoISgwLGEuaXNOYW1lKShoLCJTdGFuZGFyZCIpKXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJ1bmtub3duIGVuY3J5cHRpb24gbWV0aG9kIik7dGhpcy5maWx0ZXJOYW1lPWgubmFtZSx0aGlzLmRpY3Q9aTtjb25zdCB1PWkuZ2V0KCJWIik7aWYoIU51bWJlci5pc0ludGVnZXIodSl8fDEhPT11JiYyIT09dSYmNCE9PXUmJjUhPT11KXRocm93IG5ldyBuLkZvcm1hdEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSIpO3RoaXMuYWxnb3JpdGhtPXU7bGV0IGQ9aS5nZXQoIkxlbmd0aCIpO2lmKCFkKWlmKHU8PTMpZD00MDtlbHNle2NvbnN0IGU9aS5nZXQoIkNGIiksdD1pLmdldCgiU3RtRiIpO2lmKGUgaW5zdGFuY2VvZiBhLkRpY3QmJnQgaW5zdGFuY2VvZiBhLk5hbWUpe2Uuc3VwcHJlc3NFbmNyeXB0aW9uPSEwO2NvbnN0IHI9ZS5nZXQodC5uYW1lKTtkPShudWxsPT1yP3ZvaWQgMDpyLmdldCgiTGVuZ3RoIikpfHwxMjgsZDw0MCYmKGQ8PD0zKX19aWYoIU51bWJlci5pc0ludGVnZXIoZCl8fGQ8NDB8fGQlOCE9MCl0aHJvdyBuZXcgbi5Gb3JtYXRFcnJvcigiaW52YWxpZCBrZXkgbGVuZ3RoIik7Y29uc3QgZj0oMCxuLnN0cmluZ1RvQnl0ZXMpKGkuZ2V0KCJPIikpLGc9KDAsbi5zdHJpbmdUb0J5dGVzKShpLmdldCgiVSIpKSxwPWYuc3ViYXJyYXkoMCwzMikseT1nLnN1YmFycmF5KDAsMzIpLHc9aS5nZXQoIlAiKSx2PWkuZ2V0KCJSIikseD0oND09PXV8fDU9PT11KSYmITEhPT1pLmdldCgiRW5jcnlwdE1ldGFkYXRhIik7dGhpcy5lbmNyeXB0TWV0YWRhdGE9eDtjb25zdCBTPSgwLG4uc3RyaW5nVG9CeXRlcykoYyk7bGV0IEEsaztpZihsKXtpZig2PT09dil0cnl7bD0oMCxuLnV0ZjhTdHJpbmdUb1N0cmluZykobCl9Y2F0Y2goZSl7KDAsbi53YXJuKSgiQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeTogVW5hYmxlIHRvIGNvbnZlcnQgVVRGOCBlbmNvZGVkIHBhc3N3b3JkLiIpfUE9KDAsbi5zdHJpbmdUb0J5dGVzKShsKX1pZig1IT09dSlrPXQoUyxBLHAseSx3LHYsZCx4KTtlbHNle2NvbnN0IGU9Zi5zdWJhcnJheSgzMiw0MCksdD1mLnN1YmFycmF5KDQwLDQ4KSxyPWcuc3ViYXJyYXkoMCw0OCksYT1nLnN1YmFycmF5KDMyLDQwKSxzPWcuc3ViYXJyYXkoNDAsNDgpLG89KDAsbi5zdHJpbmdUb0J5dGVzKShpLmdldCgiT0UiKSksYz0oMCxuLnN0cmluZ1RvQnl0ZXMpKGkuZ2V0KCJVRSIpKTsoMCxuLnN0cmluZ1RvQnl0ZXMpKGkuZ2V0KCJQZXJtcyIpKSxrPWZ1bmN0aW9uKGUsdCxyLG4sYSxpLHMsbyxjLGwsaCx1KXtpZih0KXtjb25zdCBlPU1hdGgubWluKDEyNyx0Lmxlbmd0aCk7dD10LnN1YmFycmF5KDAsZSl9ZWxzZSB0PVtdO2NvbnN0IGQ9Nj09PWU/bmV3IGI6bmV3IG07cmV0dXJuIGQuY2hlY2tVc2VyUGFzc3dvcmQodCxvLHMpP2QuZ2V0VXNlcktleSh0LGMsaCk6dC5sZW5ndGgmJmQuY2hlY2tPd25lclBhc3N3b3JkKHQsbixpLHIpP2QuZ2V0T3duZXJLZXkodCxhLGksbCk6bnVsbH0odixBLHAsZSx0LHIseSxhLHMsbyxjKX1pZighayYmIWwpdGhyb3cgbmV3IG4uUGFzc3dvcmRFeGNlcHRpb24oIk5vIHBhc3N3b3JkIGdpdmVuIixuLlBhc3N3b3JkUmVzcG9uc2VzLk5FRURfUEFTU1dPUkQpO2lmKCFrJiZsKXtjb25zdCByPWZ1bmN0aW9uKHQscixuLGEpe2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkoMzIpO2xldCBjPTA7Y29uc3QgbD1NYXRoLm1pbigzMix0Lmxlbmd0aCk7Zm9yKDtjPGw7KytjKWlbY109dFtjXTtsZXQgaD0wO2Zvcig7YzwzMjspaVtjKytdPWVbaCsrXTtsZXQgdT1vKGksMCxjKTtjb25zdCBkPWE+PjM7aWYobj49Mylmb3IoaD0wO2g8NTA7KytoKXU9byh1LDAsdS5sZW5ndGgpO2xldCBmLGc7aWYobj49Myl7Zz1yO2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoZCk7Zm9yKGg9MTk7aD49MDtoLS0pe2ZvcihsZXQgdD0wO3Q8ZDsrK3QpZVt0XT11W3RdXmg7Zj1uZXcgcyhlKSxnPWYuZW5jcnlwdEJsb2NrKGcpfX1lbHNlIGY9bmV3IHModS5zdWJhcnJheSgwLGQpKSxnPWYuZW5jcnlwdEJsb2NrKHIpO3JldHVybiBnfShBLHAsdixkKTtrPXQoUyxyLHAseSx3LHYsZCx4KX1pZighayl0aHJvdyBuZXcgbi5QYXNzd29yZEV4Y2VwdGlvbigiSW5jb3JyZWN0IFBhc3N3b3JkIixuLlBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCk7aWYodGhpcy5lbmNyeXB0aW9uS2V5PWssdT49NCl7Y29uc3QgZT1pLmdldCgiQ0YiKTtlIGluc3RhbmNlb2YgYS5EaWN0JiYoZS5zdXBwcmVzc0VuY3J5cHRpb249ITApLHRoaXMuY2Y9ZSx0aGlzLnN0bWY9aS5nZXQoIlN0bUYiKXx8cix0aGlzLnN0cmY9aS5nZXQoIlN0ckYiKXx8cix0aGlzLmVmZj1pLmdldCgiRUZGIil8fHRoaXMuc3RtZn19Y3JlYXRlQ2lwaGVyVHJhbnNmb3JtKGUsdCl7aWYoND09PXRoaXMuYWxnb3JpdGhtfHw1PT09dGhpcy5hbGdvcml0aG0pcmV0dXJuIG5ldyB5KGModGhpcy5jZix0aGlzLnN0cmYsZSx0LHRoaXMuZW5jcnlwdGlvbktleSksYyh0aGlzLmNmLHRoaXMuc3RtZixlLHQsdGhpcy5lbmNyeXB0aW9uS2V5KSk7Y29uc3Qgcj1pKGUsdCx0aGlzLmVuY3J5cHRpb25LZXksITEpLG49ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHMocil9O3JldHVybiBuZXcgeShuLG4pfX19KCk7dC5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5PXd9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5EZWNyeXB0U3RyZWFtPXZvaWQgMDt2YXIgbj1yKDE2OCk7Y2xhc3MgYSBleHRlbmRzIG4uRGVjb2RlU3RyZWFte2NvbnN0cnVjdG9yKGUsdCxyKXtzdXBlcih0KSx0aGlzLnN0cj1lLHRoaXMuZGljdD1lLmRpY3QsdGhpcy5kZWNyeXB0PXIsdGhpcy5uZXh0Q2h1bms9bnVsbCx0aGlzLmluaXRpYWxpemVkPSExfXJlYWRCbG9jaygpe3ZhciBlO2xldCB0O2lmKHRoaXMuaW5pdGlhbGl6ZWQ/dD10aGlzLm5leHRDaHVuazoodD10aGlzLnN0ci5nZXRCeXRlcyg1MTIpLHRoaXMuaW5pdGlhbGl6ZWQ9ITApLCF0fHwwPT09dC5sZW5ndGgpcmV0dXJuIHZvaWQodGhpcy5lb2Y9ITApO3RoaXMubmV4dENodW5rPXRoaXMuc3RyLmdldEJ5dGVzKDUxMik7Y29uc3Qgcj0obnVsbD09PShlPXRoaXMubmV4dENodW5rKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5sZW5ndGgpPjA7dD0oMCx0aGlzLmRlY3J5cHQpKHQsIXIpO2NvbnN0IG49dGhpcy5idWZmZXJMZW5ndGgsYT1uK3QubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyKGEpLnNldCh0LG4pLHRoaXMuYnVmZmVyTGVuZ3RoPWF9fXQuRGVjcnlwdFN0cmVhbT1hfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ2F0YWxvZz12b2lkIDAscig4NCkscig5Mykscig5NCkscig5Nykscig5OSkscigxMDEpLHIoMTA1KSxyKDEwOCkscigxMTUpLHIoMTM5KSxyKDIpO3ZhciBuPXIoMTQ5KSxhPXIoMTQ0KSxpPXIoMTUwKSxzPXIoMjIxKSxvPXIoMTUxKSxjPXIoMjIyKSxsPXIoMTYyKSxoPXIoMjIzKSx1PXIoMjA5KSxkPXIoMjI0KSxmPXIoMjI1KTtmdW5jdGlvbiBnKGUpe3JldHVybiBlIGluc3RhbmNlb2YgaS5EaWN0JiYoZT1lLmdldCgiRCIpKSxBcnJheS5pc0FycmF5KGUpP2U6bnVsbH1jbGFzcyBwe2NvbnN0cnVjdG9yKGUsdCl7aWYodGhpcy5wZGZNYW5hZ2VyPWUsdGhpcy54cmVmPXQsdGhpcy5fY2F0RGljdD10LmdldENhdGFsb2dPYmooKSwhKHRoaXMuX2NhdERpY3QgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJDYXRhbG9nIG9iamVjdCBpcyBub3QgYSBkaWN0aW9uYXJ5LiIpO3RoaXMudG9wbGV2ZWxQYWdlc0RpY3QsdGhpcy5fYWN0dWFsTnVtUGFnZXM9bnVsbCx0aGlzLmZvbnRDYWNoZT1uZXcgaS5SZWZTZXRDYWNoZSx0aGlzLmJ1aWx0SW5DTWFwQ2FjaGU9bmV3IE1hcCx0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZT1uZXcgTWFwLHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZT1uZXcgdS5HbG9iYWxJbWFnZUNhY2hlLHRoaXMucGFnZUtpZHNDb3VudENhY2hlPW5ldyBpLlJlZlNldENhY2hlLHRoaXMucGFnZUluZGV4Q2FjaGU9bmV3IGkuUmVmU2V0Q2FjaGUsdGhpcy5ub25CbGVuZE1vZGVzU2V0PW5ldyBpLlJlZlNldCx0aGlzLnN5c3RlbUZvbnRDYWNoZT1uZXcgTWFwfWdldCB2ZXJzaW9uKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiVmVyc2lvbiIpO2lmKGUgaW5zdGFuY2VvZiBpLk5hbWUpe2lmKG4uUERGX1ZFUlNJT05fUkVHRVhQLnRlc3QoZS5uYW1lKSlyZXR1cm4oMCxhLnNoYWRvdykodGhpcywidmVyc2lvbiIsZS5uYW1lKTsoMCxhLndhcm4pKCJJbnZhbGlkIFBERiBjYXRhbG9nIHZlcnNpb246ICIuY29uY2F0KGUubmFtZSkpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJ2ZXJzaW9uIixudWxsKX1nZXQgbGFuZygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIkxhbmciKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywibGFuZyIsInN0cmluZyI9PXR5cGVvZiBlPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUpOm51bGwpfWdldCBuZWVkc1JlbmRlcmluZygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk5lZWRzUmVuZGVyaW5nIik7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm5lZWRzUmVuZGVyaW5nIiwiYm9vbGVhbiI9PXR5cGVvZiBlJiZlKX1nZXQgY29sbGVjdGlvbigpe2xldCBlPW51bGw7dHJ5e2NvbnN0IHQ9dGhpcy5fY2F0RGljdC5nZXQoIkNvbGxlY3Rpb24iKTt0IGluc3RhbmNlb2YgaS5EaWN0JiZ0LnNpemU+MCYmKGU9dCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG4uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLmluZm8pKCJDYW5ub3QgZmV0Y2ggQ29sbGVjdGlvbiBlbnRyeTsgYXNzdW1pbmcgbm8gY29sbGVjdGlvbiBpcyBwcmVzZW50LiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJjb2xsZWN0aW9uIixlKX1nZXQgYWNyb0Zvcm0oKXtsZXQgZT1udWxsO3RyeXtjb25zdCB0PXRoaXMuX2NhdERpY3QuZ2V0KCJBY3JvRm9ybSIpO3QgaW5zdGFuY2VvZiBpLkRpY3QmJnQuc2l6ZT4wJiYoZT10KX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEuaW5mbykoIkNhbm5vdCBmZXRjaCBBY3JvRm9ybSBlbnRyeTsgYXNzdW1pbmcgbm8gZm9ybXMgYXJlIHByZXNlbnQuIil9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImFjcm9Gb3JtIixlKX1nZXQgYWNyb0Zvcm1SZWYoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0UmF3KCJBY3JvRm9ybSIpO3JldHVybigwLGEuc2hhZG93KSh0aGlzLCJhY3JvRm9ybVJlZiIsZSBpbnN0YW5jZW9mIGkuUmVmP2U6bnVsbCl9Z2V0IG1ldGFkYXRhKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldFJhdygiTWV0YWRhdGEiKTtpZighKGUgaW5zdGFuY2VvZiBpLlJlZikpcmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm1ldGFkYXRhIixudWxsKTtsZXQgdD1udWxsO3RyeXt2YXIgcjtjb25zdCBuPXRoaXMueHJlZi5mZXRjaChlLCEobnVsbCE9PShyPXRoaXMueHJlZi5lbmNyeXB0KSYmdm9pZCAwIT09ciYmci5lbmNyeXB0TWV0YWRhdGEpKTtpZihuIGluc3RhbmNlb2Ygby5CYXNlU3RyZWFtJiZuLmRpY3QgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IGU9bi5kaWN0LmdldCgiVHlwZSIpLHI9bi5kaWN0LmdldCgiU3VidHlwZSIpO2lmKCgwLGkuaXNOYW1lKShlLCJNZXRhZGF0YSIpJiYoMCxpLmlzTmFtZSkociwiWE1MIikpe2NvbnN0IGU9KDAsYS5zdHJpbmdUb1VURjhTdHJpbmcpKG4uZ2V0U3RyaW5nKCkpO2UmJih0PW5ldyBkLk1ldGFkYXRhUGFyc2VyKGUpLnNlcmlhbGl6YWJsZSl9fX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEuaW5mbykoJ1NraXBwaW5nIGludmFsaWQgTWV0YWRhdGE6ICInLmNvbmNhdChlLCciLicpKX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywibWV0YWRhdGEiLHQpfWdldCBtYXJrSW5mbygpe2xldCBlPW51bGw7dHJ5e2U9dGhpcy5fcmVhZE1hcmtJbmZvKCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG4uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCJVbmFibGUgdG8gcmVhZCBtYXJrIGluZm8uIil9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm1hcmtJbmZvIixlKX1fcmVhZE1hcmtJbmZvKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTWFya0luZm8iKTtpZighKGUgaW5zdGFuY2VvZiBpLkRpY3QpKXJldHVybiBudWxsO2NvbnN0IHQ9e01hcmtlZDohMSxVc2VyUHJvcGVydGllczohMSxTdXNwZWN0czohMX07Zm9yKGNvbnN0IHIgaW4gdCl7Y29uc3Qgbj1lLmdldChyKTsiYm9vbGVhbiI9PXR5cGVvZiBuJiYodFtyXT1uKX1yZXR1cm4gdH1nZXQgc3RydWN0VHJlZVJvb3QoKXtsZXQgZT1udWxsO3RyeXtlPXRoaXMuX3JlYWRTdHJ1Y3RUcmVlUm9vdCgpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBuLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsYS53YXJuKSgiVW5hYmxlIHJlYWQgdG8gc3RydWN0VHJlZVJvb3QgaW5mby4iKX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywic3RydWN0VHJlZVJvb3QiLGUpfV9yZWFkU3RydWN0VHJlZVJvb3QoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJTdHJ1Y3RUcmVlUm9vdCIpO2lmKCEoZSBpbnN0YW5jZW9mIGkuRGljdCkpcmV0dXJuIG51bGw7Y29uc3QgdD1uZXcgZi5TdHJ1Y3RUcmVlUm9vdChlKTtyZXR1cm4gdC5pbml0KCksdH1nZXQgdG9wbGV2ZWxQYWdlc0RpY3QoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlcyIpO2lmKCEoZSBpbnN0YW5jZW9mIGkuRGljdCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgdG9wLWxldmVsIHBhZ2VzIGRpY3Rpb25hcnkuIik7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInRvcGxldmVsUGFnZXNEaWN0IixlKX1nZXQgZG9jdW1lbnRPdXRsaW5lKCl7bGV0IGU9bnVsbDt0cnl7ZT10aGlzLl9yZWFkRG9jdW1lbnRPdXRsaW5lKCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG4uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCJVbmFibGUgdG8gcmVhZCBkb2N1bWVudCBvdXRsaW5lLiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJkb2N1bWVudE91dGxpbmUiLGUpfV9yZWFkRG9jdW1lbnRPdXRsaW5lKCl7bGV0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk91dGxpbmVzIik7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4gbnVsbDtpZihlPWUuZ2V0UmF3KCJGaXJzdCIpLCEoZSBpbnN0YW5jZW9mIGkuUmVmKSlyZXR1cm4gbnVsbDtjb25zdCB0PXtpdGVtczpbXX0scj1be29iajplLHBhcmVudDp0fV0sbj1uZXcgaS5SZWZTZXQ7bi5wdXQoZSk7Y29uc3Qgcz10aGlzLnhyZWYsbz1uZXcgVWludDhDbGFtcGVkQXJyYXkoMyk7Zm9yKDtyLmxlbmd0aD4wOyl7Y29uc3QgdD1yLnNoaWZ0KCksYz1zLmZldGNoSWZSZWYodC5vYmopO2lmKG51bGw9PT1jKWNvbnRpbnVlO2lmKCFjLmhhcygiVGl0bGUiKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBvdXRsaW5lIGl0ZW0gZW5jb3VudGVyZWQuIik7Y29uc3QgaD17dXJsOm51bGwsZGVzdDpudWxsLGFjdGlvbjpudWxsfTtwLnBhcnNlRGVzdERpY3Rpb25hcnkoe2Rlc3REaWN0OmMscmVzdWx0T2JqOmgsZG9jQmFzZVVybDp0aGlzLnBkZk1hbmFnZXIuZG9jQmFzZVVybCxkb2NBdHRhY2htZW50czp0aGlzLmF0dGFjaG1lbnRzfSk7Y29uc3QgdT1jLmdldCgiVGl0bGUiKSxkPWMuZ2V0KCJGIil8fDAsZj1jLmdldEFycmF5KCJDIiksZz1jLmdldCgiQ291bnQiKTtsZXQgbT1vOyFBcnJheS5pc0FycmF5KGYpfHwzIT09Zi5sZW5ndGh8fDA9PT1mWzBdJiYwPT09ZlsxXSYmMD09PWZbMl18fChtPWwuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoZiwwKSk7Y29uc3QgYj17YWN0aW9uOmguYWN0aW9uLGF0dGFjaG1lbnQ6aC5hdHRhY2htZW50LGRlc3Q6aC5kZXN0LHVybDpoLnVybCx1bnNhZmVVcmw6aC51bnNhZmVVcmwsbmV3V2luZG93OmgubmV3V2luZG93LHNldE9DR1N0YXRlOmguc2V0T0NHU3RhdGUsdGl0bGU6KDAsYS5zdHJpbmdUb1BERlN0cmluZykodSksY29sb3I6bSxjb3VudDpOdW1iZXIuaXNJbnRlZ2VyKGcpP2c6dm9pZCAwLGJvbGQ6ISEoMiZkKSxpdGFsaWM6ISEoMSZkKSxpdGVtczpbXX07dC5wYXJlbnQuaXRlbXMucHVzaChiKSxlPWMuZ2V0UmF3KCJGaXJzdCIpLGUgaW5zdGFuY2VvZiBpLlJlZiYmIW4uaGFzKGUpJiYoci5wdXNoKHtvYmo6ZSxwYXJlbnQ6Yn0pLG4ucHV0KGUpKSxlPWMuZ2V0UmF3KCJOZXh0IiksZSBpbnN0YW5jZW9mIGkuUmVmJiYhbi5oYXMoZSkmJihyLnB1c2goe29iajplLHBhcmVudDp0LnBhcmVudH0pLG4ucHV0KGUpKX1yZXR1cm4gdC5pdGVtcy5sZW5ndGg+MD90Lml0ZW1zOm51bGx9Z2V0IHBlcm1pc3Npb25zKCl7bGV0IGU9bnVsbDt0cnl7ZT10aGlzLl9yZWFkUGVybWlzc2lvbnMoKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEud2FybikoIlVuYWJsZSB0byByZWFkIHBlcm1pc3Npb25zLiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJwZXJtaXNzaW9ucyIsZSl9X3JlYWRQZXJtaXNzaW9ucygpe2NvbnN0IGU9dGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJFbmNyeXB0Iik7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4gbnVsbDtsZXQgdD1lLmdldCgiUCIpO2lmKCJudW1iZXIiIT10eXBlb2YgdClyZXR1cm4gbnVsbDt0Kz0yKiozMjtjb25zdCByPVtdO2Zvcihjb25zdCBlIGluIGEuUGVybWlzc2lvbkZsYWcpe2NvbnN0IG49YS5QZXJtaXNzaW9uRmxhZ1tlXTt0Jm4mJnIucHVzaChuKX1yZXR1cm4gcn1nZXQgb3B0aW9uYWxDb250ZW50Q29uZmlnKCl7bGV0IGU9bnVsbDt0cnl7Y29uc3QgdD10aGlzLl9jYXREaWN0LmdldCgiT0NQcm9wZXJ0aWVzIik7aWYoIXQpcmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsIm9wdGlvbmFsQ29udGVudENvbmZpZyIsbnVsbCk7Y29uc3Qgcj10LmdldCgiRCIpO2lmKCFyKXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJvcHRpb25hbENvbnRlbnRDb25maWciLG51bGwpO2NvbnN0IG49dC5nZXQoIk9DR3MiKTtpZighQXJyYXkuaXNBcnJheShuKSlyZXR1cm4oMCxhLnNoYWRvdykodGhpcywib3B0aW9uYWxDb250ZW50Q29uZmlnIixudWxsKTtjb25zdCBzPVtdLG89W107Zm9yKGNvbnN0IGUgb2Ygbil7aWYoIShlIGluc3RhbmNlb2YgaS5SZWYpKWNvbnRpbnVlO28ucHVzaChlKTtjb25zdCB0PXRoaXMueHJlZi5mZXRjaElmUmVmKGUpO3MucHVzaCh7aWQ6ZS50b1N0cmluZygpLG5hbWU6InN0cmluZyI9PXR5cGVvZiB0LmdldCgiTmFtZSIpPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJOYW1lIikpOm51bGwsaW50ZW50OiJzdHJpbmciPT10eXBlb2YgdC5nZXQoIkludGVudCIpPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHQuZ2V0KCJJbnRlbnQiKSk6bnVsbH0pfWU9dGhpcy5fcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhyLG8pLGUuZ3JvdXBzPXN9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG4uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCJVbmFibGUgdG8gcmVhZCBvcHRpb25hbCBjb250ZW50IGNvbmZpZzogIi5jb25jYXQoZSkpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJvcHRpb25hbENvbnRlbnRDb25maWciLGUpfV9yZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnKGUsdCl7ZnVuY3Rpb24gcihlKXtjb25zdCByPVtdO2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKGNvbnN0IG4gb2YgZSluIGluc3RhbmNlb2YgaS5SZWYmJnQuaW5jbHVkZXMobikmJnIucHVzaChuLnRvU3RyaW5nKCkpO3JldHVybiByfWZ1bmN0aW9uIG4oZSl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjA7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG51bGw7Y29uc3Qgbj1bXTtmb3IoY29uc3QgYSBvZiBlKXtpZihhIGluc3RhbmNlb2YgaS5SZWYmJnQuaW5jbHVkZXMoYSkpe2MucHV0KGEpLG4ucHVzaChhLnRvU3RyaW5nKCkpO2NvbnRpbnVlfWNvbnN0IGU9cyhhLHIpO2UmJm4ucHVzaChlKX1pZihyPjApcmV0dXJuIG47Y29uc3QgYT1bXTtmb3IoY29uc3QgZSBvZiB0KWMuaGFzKGUpfHxhLnB1c2goZS50b1N0cmluZygpKTtyZXR1cm4gYS5sZW5ndGgmJm4ucHVzaCh7bmFtZTpudWxsLG9yZGVyOmF9KSxufWZ1bmN0aW9uIHMoZSx0KXtpZigrK3Q+bClyZXR1cm4oMCxhLndhcm4pKCJwYXJzZU5lc3RlZE9yZGVyIC0gcmVhY2hlZCBNQVhfTkVTVEVEX0xFVkVMUy4iKSxudWxsO2NvbnN0IHI9by5mZXRjaElmUmVmKGUpO2lmKCFBcnJheS5pc0FycmF5KHIpKXJldHVybiBudWxsO2NvbnN0IGk9by5mZXRjaElmUmVmKHJbMF0pO2lmKCJzdHJpbmciIT10eXBlb2YgaSlyZXR1cm4gbnVsbDtjb25zdCBzPW4oci5zbGljZSgxKSx0KTtyZXR1cm4gcyYmcy5sZW5ndGg/e25hbWU6KDAsYS5zdHJpbmdUb1BERlN0cmluZykoaSksb3JkZXI6c306bnVsbH1jb25zdCBvPXRoaXMueHJlZixjPW5ldyBpLlJlZlNldCxsPTEwO3JldHVybntuYW1lOiJzdHJpbmciPT10eXBlb2YgZS5nZXQoIk5hbWUiKT8oMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlLmdldCgiTmFtZSIpKTpudWxsLGNyZWF0b3I6InN0cmluZyI9PXR5cGVvZiBlLmdldCgiQ3JlYXRvciIpPygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUuZ2V0KCJDcmVhdG9yIikpOm51bGwsYmFzZVN0YXRlOmUuZ2V0KCJCYXNlU3RhdGUiKWluc3RhbmNlb2YgaS5OYW1lP2UuZ2V0KCJCYXNlU3RhdGUiKS5uYW1lOm51bGwsb246cihlLmdldCgiT04iKSksb2ZmOnIoZS5nZXQoIk9GRiIpKSxvcmRlcjpuKGUuZ2V0KCJPcmRlciIpKSxncm91cHM6bnVsbH19c2V0QWN0dWFsTnVtUGFnZXMoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbDt0aGlzLl9hY3R1YWxOdW1QYWdlcz1lfWdldCBoYXNBY3R1YWxOdW1QYWdlcygpe3JldHVybiBudWxsIT09dGhpcy5fYWN0dWFsTnVtUGFnZXN9Z2V0IF9wYWdlc0NvdW50KCl7Y29uc3QgZT10aGlzLnRvcGxldmVsUGFnZXNEaWN0LmdldCgiQ291bnQiKTtpZighTnVtYmVyLmlzSW50ZWdlcihlKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUGFnZSBjb3VudCBpbiB0b3AtbGV2ZWwgcGFnZXMgZGljdGlvbmFyeSBpcyBub3QgYW4gaW50ZWdlci4iKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiX3BhZ2VzQ291bnQiLGUpfWdldCBudW1QYWdlcygpe3JldHVybiB0aGlzLmhhc0FjdHVhbE51bVBhZ2VzP3RoaXMuX2FjdHVhbE51bVBhZ2VzOnRoaXMuX3BhZ2VzQ291bnR9Z2V0IGRlc3RpbmF0aW9ucygpe2NvbnN0IGU9dGhpcy5fcmVhZERlc3RzKCksdD1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGUgaW5zdGFuY2VvZiBzLk5hbWVUcmVlKWZvcihjb25zdFtyLG5db2YgZS5nZXRBbGwoKSl7Y29uc3QgZT1nKG4pO2UmJih0WygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHIpXT1lKX1lbHNlIGUgaW5zdGFuY2VvZiBpLkRpY3QmJmUuZm9yRWFjaCgoZnVuY3Rpb24oZSxyKXtjb25zdCBuPWcocik7biYmKHRbZV09bil9KSk7cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImRlc3RpbmF0aW9ucyIsdCl9Z2V0RGVzdGluYXRpb24oZSl7Y29uc3QgdD10aGlzLl9yZWFkRGVzdHMoKTtpZih0IGluc3RhbmNlb2Ygcy5OYW1lVHJlZSl7Y29uc3Qgcj1nKHQuZ2V0KGUpKTtpZihyKXJldHVybiByO2NvbnN0IG49dGhpcy5kZXN0aW5hdGlvbnNbZV07aWYobilyZXR1cm4oMCxhLndhcm4pKCdGb3VuZCAiJy5jb25jYXQoZSwnIiBhdCBhbiBpbmNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIE5hbWVUcmVlLicpKSxufWVsc2UgaWYodCBpbnN0YW5jZW9mIGkuRGljdCl7Y29uc3Qgcj1nKHQuZ2V0KGUpKTtpZihyKXJldHVybiByfXJldHVybiBudWxsfV9yZWFkRGVzdHMoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpO3JldHVybiBudWxsIT1lJiZlLmhhcygiRGVzdHMiKT9uZXcgcy5OYW1lVHJlZShlLmdldFJhdygiRGVzdHMiKSx0aGlzLnhyZWYpOnRoaXMuX2NhdERpY3QuaGFzKCJEZXN0cyIpP3RoaXMuX2NhdERpY3QuZ2V0KCJEZXN0cyIpOnZvaWQgMH1nZXQgcGFnZUxhYmVscygpe2xldCBlPW51bGw7dHJ5e2U9dGhpcy5fcmVhZFBhZ2VMYWJlbHMoKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygbi5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEud2FybikoIlVuYWJsZSB0byByZWFkIHBhZ2UgbGFiZWxzLiIpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJwYWdlTGFiZWxzIixlKX1fcmVhZFBhZ2VMYWJlbHMoKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlTGFiZWxzIik7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3QgdD1uZXcgQXJyYXkodGhpcy5udW1QYWdlcyk7bGV0IHI9bnVsbCxvPSIiO2NvbnN0IGM9bmV3IHMuTnVtYmVyVHJlZShlLHRoaXMueHJlZikuZ2V0QWxsKCk7bGV0IGw9IiIsaD0xO2ZvcihsZXQgZT0wLHM9dGhpcy5udW1QYWdlcztlPHM7ZSsrKXtjb25zdCBzPWMuZ2V0KGUpO2lmKHZvaWQgMCE9PXMpe2lmKCEocyBpbnN0YW5jZW9mIGkuRGljdCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIlBhZ2VMYWJlbCBpcyBub3QgYSBkaWN0aW9uYXJ5LiIpO2lmKHMuaGFzKCJUeXBlIikmJiEoMCxpLmlzTmFtZSkocy5nZXQoIlR5cGUiKSwiUGFnZUxhYmVsIikpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgdHlwZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtpZihzLmhhcygiUyIpKXtjb25zdCBlPXMuZ2V0KCJTIik7aWYoIShlIGluc3RhbmNlb2YgaS5OYW1lKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBzdHlsZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtyPWUubmFtZX1lbHNlIHI9bnVsbDtpZihzLmhhcygiUCIpKXtjb25zdCBlPXMuZ2V0KCJQIik7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIHByZWZpeCBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTtvPSgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUpfWVsc2Ugbz0iIjtpZihzLmhhcygiU3QiKSl7Y29uc3QgZT1zLmdldCgiU3QiKTtpZighKE51bWJlci5pc0ludGVnZXIoZSkmJmU+PTEpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIHN0YXJ0IGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpO2g9ZX1lbHNlIGg9MX1zd2l0Y2gocil7Y2FzZSJEIjpsPWg7YnJlYWs7Y2FzZSJSIjpjYXNlInIiOmw9KDAsbi50b1JvbWFuTnVtZXJhbHMpKGgsInIiPT09cik7YnJlYWs7Y2FzZSJBIjpjYXNlImEiOmNvbnN0IGU9MjYsdD0iYSI9PT1yPzk3OjY1LGk9aC0xO2w9U3RyaW5nLmZyb21DaGFyQ29kZSh0K2klZSkucmVwZWF0KE1hdGguZmxvb3IoaS9lKSsxKTticmVhaztkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoJ0ludmFsaWQgc3R5bGUgIicuY29uY2F0KHIsJyIgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuJykpO2w9IiJ9dFtlXT1vK2wsaCsrfXJldHVybiB0fWdldCBwYWdlTGF5b3V0KCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiUGFnZUxheW91dCIpO2xldCB0PSIiO2lmKGUgaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKGUubmFtZSl7Y2FzZSJTaW5nbGVQYWdlIjpjYXNlIk9uZUNvbHVtbiI6Y2FzZSJUd29Db2x1bW5MZWZ0IjpjYXNlIlR3b0NvbHVtblJpZ2h0IjpjYXNlIlR3b1BhZ2VMZWZ0IjpjYXNlIlR3b1BhZ2VSaWdodCI6dD1lLm5hbWV9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInBhZ2VMYXlvdXQiLHQpfWdldCBwYWdlTW9kZSgpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlBhZ2VNb2RlIik7bGV0IHQ9IlVzZU5vbmUiO2lmKGUgaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKGUubmFtZSl7Y2FzZSJVc2VOb25lIjpjYXNlIlVzZU91dGxpbmVzIjpjYXNlIlVzZVRodW1icyI6Y2FzZSJGdWxsU2NyZWVuIjpjYXNlIlVzZU9DIjpjYXNlIlVzZUF0dGFjaG1lbnRzIjp0PWUubmFtZX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywicGFnZU1vZGUiLHQpfWdldCB2aWV3ZXJQcmVmZXJlbmNlcygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlZpZXdlclByZWZlcmVuY2VzIik7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4oMCxhLnNoYWRvdykodGhpcywidmlld2VyUHJlZmVyZW5jZXMiLG51bGwpO2xldCB0PW51bGw7Zm9yKGNvbnN0IHIgb2YgZS5nZXRLZXlzKCkpe2NvbnN0IG49ZS5nZXQocik7bGV0IHM7c3dpdGNoKHIpe2Nhc2UiSGlkZVRvb2xiYXIiOmNhc2UiSGlkZU1lbnViYXIiOmNhc2UiSGlkZVdpbmRvd1VJIjpjYXNlIkZpdFdpbmRvdyI6Y2FzZSJDZW50ZXJXaW5kb3ciOmNhc2UiRGlzcGxheURvY1RpdGxlIjpjYXNlIlBpY2tUcmF5QnlQREZTaXplIjoiYm9vbGVhbiI9PXR5cGVvZiBuJiYocz1uKTticmVhaztjYXNlIk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSI6aWYobiBpbnN0YW5jZW9mIGkuTmFtZSlzd2l0Y2gobi5uYW1lKXtjYXNlIlVzZU5vbmUiOmNhc2UiVXNlT3V0bGluZXMiOmNhc2UiVXNlVGh1bWJzIjpjYXNlIlVzZU9DIjpzPW4ubmFtZTticmVhaztkZWZhdWx0OnM9IlVzZU5vbmUifWJyZWFrO2Nhc2UiRGlyZWN0aW9uIjppZihuIGluc3RhbmNlb2YgaS5OYW1lKXN3aXRjaChuLm5hbWUpe2Nhc2UiTDJSIjpjYXNlIlIyTCI6cz1uLm5hbWU7YnJlYWs7ZGVmYXVsdDpzPSJMMlIifWJyZWFrO2Nhc2UiVmlld0FyZWEiOmNhc2UiVmlld0NsaXAiOmNhc2UiUHJpbnRBcmVhIjpjYXNlIlByaW50Q2xpcCI6aWYobiBpbnN0YW5jZW9mIGkuTmFtZSlzd2l0Y2gobi5uYW1lKXtjYXNlIk1lZGlhQm94IjpjYXNlIkNyb3BCb3giOmNhc2UiQmxlZWRCb3giOmNhc2UiVHJpbUJveCI6Y2FzZSJBcnRCb3giOnM9bi5uYW1lO2JyZWFrO2RlZmF1bHQ6cz0iQ3JvcEJveCJ9YnJlYWs7Y2FzZSJQcmludFNjYWxpbmciOmlmKG4gaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKG4ubmFtZSl7Y2FzZSJOb25lIjpjYXNlIkFwcERlZmF1bHQiOnM9bi5uYW1lO2JyZWFrO2RlZmF1bHQ6cz0iQXBwRGVmYXVsdCJ9YnJlYWs7Y2FzZSJEdXBsZXgiOmlmKG4gaW5zdGFuY2VvZiBpLk5hbWUpc3dpdGNoKG4ubmFtZSl7Y2FzZSJTaW1wbGV4IjpjYXNlIkR1cGxleEZsaXBTaG9ydEVkZ2UiOmNhc2UiRHVwbGV4RmxpcExvbmdFZGdlIjpzPW4ubmFtZTticmVhaztkZWZhdWx0OnM9Ik5vbmUifWJyZWFrO2Nhc2UiUHJpbnRQYWdlUmFuZ2UiOkFycmF5LmlzQXJyYXkobikmJm4ubGVuZ3RoJTI9PTAmJm4uZXZlcnkoKChlLHQscik9Pk51bWJlci5pc0ludGVnZXIoZSkmJmU+MCYmKDA9PT10fHxlPj1yW3QtMV0pJiZlPD10aGlzLm51bVBhZ2VzKSkmJihzPW4pO2JyZWFrO2Nhc2UiTnVtQ29waWVzIjpOdW1iZXIuaXNJbnRlZ2VyKG4pJiZuPjAmJihzPW4pO2JyZWFrO2RlZmF1bHQ6KDAsYS53YXJuKSgiSWdub3Jpbmcgbm9uLXN0YW5kYXJkIGtleSBpbiBWaWV3ZXJQcmVmZXJlbmNlczogIi5jb25jYXQociwiLiIpKTtjb250aW51ZX12b2lkIDAhPT1zPyh0fHwodD1PYmplY3QuY3JlYXRlKG51bGwpKSx0W3JdPXMpOigwLGEud2FybikoJ0JhZCB2YWx1ZSwgZm9yIGtleSAiJy5jb25jYXQociwnIiwgaW4gVmlld2VyUHJlZmVyZW5jZXM6ICcpLmNvbmNhdChuLCIuIikpfXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJ2aWV3ZXJQcmVmZXJlbmNlcyIsdCl9Z2V0IG9wZW5BY3Rpb24oKXtjb25zdCBlPXRoaXMuX2NhdERpY3QuZ2V0KCJPcGVuQWN0aW9uIiksdD1PYmplY3QuY3JlYXRlKG51bGwpO2lmKGUgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IHI9bmV3IGkuRGljdCh0aGlzLnhyZWYpO3Iuc2V0KCJBIixlKTtjb25zdCBuPXt1cmw6bnVsbCxkZXN0Om51bGwsYWN0aW9uOm51bGx9O3AucGFyc2VEZXN0RGljdGlvbmFyeSh7ZGVzdERpY3Q6cixyZXN1bHRPYmo6bn0pLEFycmF5LmlzQXJyYXkobi5kZXN0KT90LmRlc3Q9bi5kZXN0Om4uYWN0aW9uJiYodC5hY3Rpb249bi5hY3Rpb24pfWVsc2UgQXJyYXkuaXNBcnJheShlKSYmKHQuZGVzdD1lKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywib3BlbkFjdGlvbiIsKDAsYS5vYmplY3RTaXplKSh0KT4wP3Q6bnVsbCl9Z2V0IGF0dGFjaG1lbnRzKCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTtsZXQgdD1udWxsO2lmKGUgaW5zdGFuY2VvZiBpLkRpY3QmJmUuaGFzKCJFbWJlZGRlZEZpbGVzIikpe2NvbnN0IHI9bmV3IHMuTmFtZVRyZWUoZS5nZXRSYXcoIkVtYmVkZGVkRmlsZXMiKSx0aGlzLnhyZWYpO2Zvcihjb25zdFtlLG5db2Ygci5nZXRBbGwoKSl7Y29uc3Qgcj1uZXcgaC5GaWxlU3BlYyhuLHRoaXMueHJlZik7dHx8KHQ9T2JqZWN0LmNyZWF0ZShudWxsKSksdFsoMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlKV09ci5zZXJpYWxpemFibGV9fXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJhdHRhY2htZW50cyIsdCl9Z2V0IHhmYUltYWdlcygpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7bGV0IHQ9bnVsbDtpZihlIGluc3RhbmNlb2YgaS5EaWN0JiZlLmhhcygiWEZBSW1hZ2VzIikpe2NvbnN0IHI9bmV3IHMuTmFtZVRyZWUoZS5nZXRSYXcoIlhGQUltYWdlcyIpLHRoaXMueHJlZik7Zm9yKGNvbnN0W2Usbl1vZiByLmdldEFsbCgpKXR8fCh0PW5ldyBpLkRpY3QodGhpcy54cmVmKSksdC5zZXQoKDAsYS5zdHJpbmdUb1BERlN0cmluZykoZSksbil9cmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsInhmYUltYWdlcyIsdCl9X2NvbGxlY3RKYXZhU2NyaXB0KCl7Y29uc3QgZT10aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTtsZXQgdD1udWxsO2Z1bmN0aW9uIHIoZSxyKXtpZighKHIgaW5zdGFuY2VvZiBpLkRpY3QpKXJldHVybjtpZighKDAsaS5pc05hbWUpKHIuZ2V0KCJTIiksIkphdmFTY3JpcHQiKSlyZXR1cm47bGV0IG49ci5nZXQoIkpTIik7aWYobiBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbSluPW4uZ2V0U3RyaW5nKCk7ZWxzZSBpZigic3RyaW5nIiE9dHlwZW9mIG4pcmV0dXJuO249KDAsYS5zdHJpbmdUb1BERlN0cmluZykobikucmVwbGFjZUFsbCgiXDAiLCIiKSwodHx8KHQ9bmV3IE1hcCkpLnNldChlLG4pfWlmKGUgaW5zdGFuY2VvZiBpLkRpY3QmJmUuaGFzKCJKYXZhU2NyaXB0Iikpe2NvbnN0IHQ9bmV3IHMuTmFtZVRyZWUoZS5nZXRSYXcoIkphdmFTY3JpcHQiKSx0aGlzLnhyZWYpO2Zvcihjb25zdFtlLG5db2YgdC5nZXRBbGwoKSlyKCgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGUpLG4pfWNvbnN0IG49dGhpcy5fY2F0RGljdC5nZXQoIk9wZW5BY3Rpb24iKTtyZXR1cm4gbiYmcigiT3BlbkFjdGlvbiIsbiksdH1nZXQgamF2YVNjcmlwdCgpe2NvbnN0IGU9dGhpcy5fY29sbGVjdEphdmFTY3JpcHQoKTtyZXR1cm4oMCxhLnNoYWRvdykodGhpcywiamF2YVNjcmlwdCIsZT9bLi4uZS52YWx1ZXMoKV06bnVsbCl9Z2V0IGpzQWN0aW9ucygpe2NvbnN0IGU9dGhpcy5fY29sbGVjdEphdmFTY3JpcHQoKTtsZXQgdD0oMCxuLmNvbGxlY3RBY3Rpb25zKSh0aGlzLnhyZWYsdGhpcy5fY2F0RGljdCxhLkRvY3VtZW50QWN0aW9uRXZlbnRUeXBlKTtpZihlKXt0fHwodD1PYmplY3QuY3JlYXRlKG51bGwpKTtmb3IoY29uc3RbcixuXW9mIGUpciBpbiB0P3Rbcl0ucHVzaChuKTp0W3JdPVtuXX1yZXR1cm4oMCxhLnNoYWRvdykodGhpcywianNBY3Rpb25zIix0KX1hc3luYyBmb250RmFsbGJhY2soZSx0KXtjb25zdCByPWF3YWl0IFByb21pc2UuYWxsKHRoaXMuZm9udENhY2hlKTtmb3IoY29uc3QgbiBvZiByKWlmKG4ubG9hZGVkTmFtZT09PWUpcmV0dXJuIHZvaWQgbi5mYWxsYmFjayh0KX1hc3luYyBjbGVhbnVwKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTsoMCxjLmNsZWFyR2xvYmFsQ2FjaGVzKSgpLHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5jbGVhcihlKSx0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZS5jbGVhcigpLHRoaXMucGFnZUluZGV4Q2FjaGUuY2xlYXIoKSx0aGlzLm5vbkJsZW5kTW9kZXNTZXQuY2xlYXIoKTtjb25zdCB0PWF3YWl0IFByb21pc2UuYWxsKHRoaXMuZm9udENhY2hlKTtmb3IoY29uc3R7ZGljdDplfW9mIHQpZGVsZXRlIGUuY2FjaGVLZXk7dGhpcy5mb250Q2FjaGUuY2xlYXIoKSx0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuY2xlYXIoKSx0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5jbGVhcigpLHRoaXMuc3lzdGVtRm9udENhY2hlLmNsZWFyKCl9YXN5bmMgZ2V0UGFnZURpY3QoZSl7Y29uc3QgdD1bdGhpcy50b3BsZXZlbFBhZ2VzRGljdF0scj1uZXcgaS5SZWZTZXQsbj10aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZXMiKTtuIGluc3RhbmNlb2YgaS5SZWYmJnIucHV0KG4pO2NvbnN0IHM9dGhpcy54cmVmLG89dGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUsYz10aGlzLnBhZ2VJbmRleENhY2hlO2xldCBsPTA7Zm9yKDt0Lmxlbmd0aDspe2NvbnN0IG49dC5wb3AoKTtpZihuIGluc3RhbmNlb2YgaS5SZWYpe2NvbnN0IGg9by5nZXQobik7aWYoaD49MCYmbCtoPD1lKXtsKz1oO2NvbnRpbnVlfWlmKHIuaGFzKG4pKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJQYWdlcyB0cmVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTtyLnB1dChuKTtjb25zdCB1PWF3YWl0IHMuZmV0Y2hBc3luYyhuKTtpZih1IGluc3RhbmNlb2YgaS5EaWN0KXtsZXQgdD11LmdldFJhdygiVHlwZSIpO2lmKHQgaW5zdGFuY2VvZiBpLlJlZiYmKHQ9YXdhaXQgcy5mZXRjaEFzeW5jKHQpKSwoMCxpLmlzTmFtZSkodCwiUGFnZSIpfHwhdS5oYXMoIktpZHMiKSl7aWYoby5oYXMobil8fG8ucHV0KG4sMSksYy5oYXMobil8fGMucHV0KG4sbCksbD09PWUpcmV0dXJuW3Usbl07bCsrO2NvbnRpbnVlfX10LnB1c2godSk7Y29udGludWV9aWYoIShuIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZCByZWZlcmVuY2UgcG9pbnRzIHRvIHdyb25nIHR5cGUgb2Ygb2JqZWN0LiIpO2NvbnN0e29iaklkOmh9PW47bGV0IHU9bi5nZXRSYXcoIkNvdW50Iik7aWYodSBpbnN0YW5jZW9mIGkuUmVmJiYodT1hd2FpdCBzLmZldGNoQXN5bmModSkpLE51bWJlci5pc0ludGVnZXIodSkmJnU+PTAmJihoJiYhby5oYXMoaCkmJm8ucHV0KGgsdSksbCt1PD1lKSl7bCs9dTtjb250aW51ZX1sZXQgZD1uLmdldFJhdygiS2lkcyIpO2lmKGQgaW5zdGFuY2VvZiBpLlJlZiYmKGQ9YXdhaXQgcy5mZXRjaEFzeW5jKGQpKSwhQXJyYXkuaXNBcnJheShkKSl7bGV0IHQ9bi5nZXRSYXcoIlR5cGUiKTtpZih0IGluc3RhbmNlb2YgaS5SZWYmJih0PWF3YWl0IHMuZmV0Y2hBc3luYyh0KSksKDAsaS5pc05hbWUpKHQsIlBhZ2UiKXx8IW4uaGFzKCJLaWRzIikpe2lmKGw9PT1lKXJldHVybltuLG51bGxdO2wrKztjb250aW51ZX10aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZHMgb2JqZWN0IGlzIG5vdCBhbiBhcnJheS4iKX1mb3IobGV0IGU9ZC5sZW5ndGgtMTtlPj0wO2UtLSl0LnB1c2goZFtlXSl9dGhyb3cgbmV3IEVycm9yKCJQYWdlIGluZGV4ICIuY29uY2F0KGUsIiBub3QgZm91bmQuIikpfWFzeW5jIGdldEFsbFBhZ2VEaWN0cygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07Y29uc3R7aWdub3JlRXJyb3JzOnR9PXRoaXMucGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zLHI9W3tjdXJyZW50Tm9kZTp0aGlzLnRvcGxldmVsUGFnZXNEaWN0LHBvc0luS2lkczowfV0scz1uZXcgaS5SZWZTZXQsbz10aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZXMiKTtvIGluc3RhbmNlb2YgaS5SZWYmJnMucHV0KG8pO2NvbnN0IGM9bmV3IE1hcCxsPXRoaXMueHJlZixoPXRoaXMucGFnZUluZGV4Q2FjaGU7bGV0IHU9MDtmdW5jdGlvbiBkKGUsdCl7dCYmIWguaGFzKHQpJiZoLnB1dCh0LHUpLGMuc2V0KHUrKyxbZSx0XSl9ZnVuY3Rpb24gZihyKXtpZihyIGluc3RhbmNlb2Ygbi5YUmVmRW50cnlFeGNlcHRpb24mJiFlKXRocm93IHI7ZSYmdCYmMD09PXUmJigoMCxhLndhcm4pKCdnZXRBbGxQYWdlRGljdHMgLSBTa2lwcGluZyBpbnZhbGlkIGZpcnN0IHBhZ2U6ICInLmNvbmNhdChyLCciLicpKSxyPWkuRGljdC5lbXB0eSksYy5zZXQodSsrLFtyLG51bGxdKX1mb3IoO3IubGVuZ3RoPjA7KXtjb25zdCB0PXIuYXQoLTEpLHtjdXJyZW50Tm9kZTpuLHBvc0luS2lkczpvfT10O2xldCBjPW4uZ2V0UmF3KCJLaWRzIik7aWYoYyBpbnN0YW5jZW9mIGkuUmVmKXRyeXtjPWF3YWl0IGwuZmV0Y2hBc3luYyhjKX1jYXRjaChlKXtmKGUpO2JyZWFrfWlmKCFBcnJheS5pc0FycmF5KGMpKXtmKG5ldyBhLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpKTticmVha31pZihvPj1jLmxlbmd0aCl7ci5wb3AoKTtjb250aW51ZX1jb25zdCBoPWNbb107bGV0IHU7aWYoaCBpbnN0YW5jZW9mIGkuUmVmKXtpZihzLmhhcyhoKSl7ZihuZXcgYS5Gb3JtYXRFcnJvcigiUGFnZXMgdHJlZSBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2UuIikpO2JyZWFrfXMucHV0KGgpO3RyeXt1PWF3YWl0IGwuZmV0Y2hBc3luYyhoKX1jYXRjaChlKXtmKGUpO2JyZWFrfX1lbHNlIHU9aDtpZighKHUgaW5zdGFuY2VvZiBpLkRpY3QpKXtmKG5ldyBhLkZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkIHJlZmVyZW5jZSBwb2ludHMgdG8gd3JvbmcgdHlwZSBvZiBvYmplY3QuIikpO2JyZWFrfWxldCBnPXUuZ2V0UmF3KCJUeXBlIik7aWYoZyBpbnN0YW5jZW9mIGkuUmVmKXRyeXtnPWF3YWl0IGwuZmV0Y2hBc3luYyhnKX1jYXRjaChlKXtmKGUpO2JyZWFrfSgwLGkuaXNOYW1lKShnLCJQYWdlIil8fCF1LmhhcygiS2lkcyIpP2QodSxoIGluc3RhbmNlb2YgaS5SZWY/aDpudWxsKTpyLnB1c2goe2N1cnJlbnROb2RlOnUscG9zSW5LaWRzOjB9KSx0LnBvc0luS2lkcysrfXJldHVybiBjfWdldFBhZ2VJbmRleChlKXtjb25zdCB0PXRoaXMucGFnZUluZGV4Q2FjaGUuZ2V0KGUpO2lmKHZvaWQgMCE9PXQpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KTtjb25zdCByPXRoaXMueHJlZjtsZXQgbj0wO2NvbnN0IHM9dD0+ZnVuY3Rpb24odCl7bGV0IG4scz0wO3JldHVybiByLmZldGNoQXN5bmModCkudGhlbigoZnVuY3Rpb24ocil7aWYoKDAsaS5pc1JlZnNFcXVhbCkodCxlKSYmISgwLGkuaXNEaWN0KShyLCJQYWdlIikmJiEociBpbnN0YW5jZW9mIGkuRGljdCYmIXIuaGFzKCJUeXBlIikmJnIuaGFzKCJDb250ZW50cyIpKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiVGhlIHJlZmVyZW5jZSBkb2VzIG5vdCBwb2ludCB0byBhIC9QYWdlIGRpY3Rpb25hcnkuIik7aWYoIXIpcmV0dXJuIG51bGw7aWYoIShyIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiTm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTtyZXR1cm4gbj1yLmdldFJhdygiUGFyZW50Iiksci5nZXRBc3luYygiUGFyZW50Iil9KSkudGhlbigoZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7aWYoIShlIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiUGFyZW50IG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpO3JldHVybiBlLmdldEFzeW5jKCJLaWRzIil9KSkudGhlbigoZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3Qgbz1bXTtsZXQgYz0hMTtmb3IoY29uc3QgbiBvZiBlKXtpZighKG4gaW5zdGFuY2VvZiBpLlJlZikpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIktpZCBtdXN0IGJlIGEgcmVmZXJlbmNlLiIpO2lmKCgwLGkuaXNSZWZzRXF1YWwpKG4sdCkpe2M9ITA7YnJlYWt9by5wdXNoKHIuZmV0Y2hBc3luYyhuKS50aGVuKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBpLkRpY3QpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJLaWQgbm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTtlLmhhcygiQ291bnQiKT9zKz1lLmdldCgiQ291bnQiKTpzKyt9KSkpfWlmKCFjKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJLaWQgcmVmZXJlbmNlIG5vdCBmb3VuZCBpbiBwYXJlbnQncyBraWRzLiIpO3JldHVybiBQcm9taXNlLmFsbChvKS50aGVuKChmdW5jdGlvbigpe3JldHVybltzLG5dfSkpfSkpfSh0KS50aGVuKCh0PT57aWYoIXQpcmV0dXJuIHRoaXMucGFnZUluZGV4Q2FjaGUucHV0KGUsbiksbjtjb25zdFtyLGFdPXQ7cmV0dXJuIG4rPXIscyhhKX0pKTtyZXR1cm4gcyhlKX1nZXQgYmFzZVVybCgpe2NvbnN0IGU9dGhpcy5fY2F0RGljdC5nZXQoIlVSSSIpO2lmKGUgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IHQ9ZS5nZXQoIkJhc2UiKTtpZigic3RyaW5nIj09dHlwZW9mIHQpe2NvbnN0IGU9KDAsYS5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSh0LG51bGwse3RyeUNvbnZlcnRFbmNvZGluZzohMH0pO2lmKGUpcmV0dXJuKDAsYS5zaGFkb3cpKHRoaXMsImJhc2VVcmwiLGUuaHJlZil9fXJldHVybigwLGEuc2hhZG93KSh0aGlzLCJiYXNlVXJsIixudWxsKX1zdGF0aWMgcGFyc2VEZXN0RGljdGlvbmFyeShlKXtjb25zdCB0PWUuZGVzdERpY3Q7aWYoISh0IGluc3RhbmNlb2YgaS5EaWN0KSlyZXR1cm4gdm9pZCgwLGEud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IGBkZXN0RGljdGAgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7Y29uc3Qgcj1lLnJlc3VsdE9iajtpZigib2JqZWN0IiE9dHlwZW9mIHIpcmV0dXJuIHZvaWQoMCxhLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBgcmVzdWx0T2JqYCBtdXN0IGJlIGFuIG9iamVjdC4iKTtjb25zdCBzPWUuZG9jQmFzZVVybHx8bnVsbCxjPWUuZG9jQXR0YWNobWVudHN8fG51bGw7bGV0IGwsaCx1PXQuZ2V0KCJBIik7aWYodSBpbnN0YW5jZW9mIGkuRGljdHx8KHQuaGFzKCJEZXN0Iik/dT10LmdldCgiRGVzdCIpOih1PXQuZ2V0KCJBQSIpLHUgaW5zdGFuY2VvZiBpLkRpY3QmJih1LmhhcygiRCIpP3U9dS5nZXQoIkQiKTp1LmhhcygiVSIpJiYodT11LmdldCgiVSIpKSkpKSx1IGluc3RhbmNlb2YgaS5EaWN0KXtjb25zdCBlPXUuZ2V0KCJTIik7aWYoIShlIGluc3RhbmNlb2YgaS5OYW1lKSlyZXR1cm4gdm9pZCgwLGEud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IEludmFsaWQgdHlwZSBpbiBBY3Rpb24gZGljdGlvbmFyeS4iKTtjb25zdCB0PWUubmFtZTtzd2l0Y2godCl7Y2FzZSJSZXNldEZvcm0iOmNvbnN0IGU9dS5nZXQoIkZsYWdzIikscz0wPT0oMSYoIm51bWJlciI9PXR5cGVvZiBlP2U6MCkpLGQ9W10sZj1bXTtmb3IoY29uc3QgZSBvZiB1LmdldCgiRmllbGRzIil8fFtdKWUgaW5zdGFuY2VvZiBpLlJlZj9mLnB1c2goZS50b1N0cmluZygpKToic3RyaW5nIj09dHlwZW9mIGUmJmQucHVzaCgoMCxhLnN0cmluZ1RvUERGU3RyaW5nKShlKSk7ci5yZXNldEZvcm09e2ZpZWxkczpkLHJlZnM6ZixpbmNsdWRlOnN9O2JyZWFrO2Nhc2UiVVJJIjpsPXUuZ2V0KCJVUkkiKSxsIGluc3RhbmNlb2YgaS5OYW1lJiYobD0iLyIrbC5uYW1lKTticmVhaztjYXNlIkdvVG8iOmg9dS5nZXQoIkQiKTticmVhaztjYXNlIkxhdW5jaCI6Y2FzZSJHb1RvUiI6Y29uc3QgZz11LmdldCgiRiIpO2cgaW5zdGFuY2VvZiBpLkRpY3Q/bD1nLmdldCgiRiIpfHxudWxsOiJzdHJpbmciPT10eXBlb2YgZyYmKGw9Zyk7bGV0IHA9dS5nZXQoIkQiKTtpZihwJiYocCBpbnN0YW5jZW9mIGkuTmFtZSYmKHA9cC5uYW1lKSwic3RyaW5nIj09dHlwZW9mIGwpKXtjb25zdCBlPWwuc3BsaXQoIiMiKVswXTsic3RyaW5nIj09dHlwZW9mIHA/bD1lKyIjIitwOkFycmF5LmlzQXJyYXkocCkmJihsPWUrIiMiK0pTT04uc3RyaW5naWZ5KHApKX1jb25zdCBtPXUuZ2V0KCJOZXdXaW5kb3ciKTsiYm9vbGVhbiI9PXR5cGVvZiBtJiYoci5uZXdXaW5kb3c9bSk7YnJlYWs7Y2FzZSJHb1RvRSI6Y29uc3QgYj11LmdldCgiVCIpO2xldCB5O2lmKGMmJmIgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IGU9Yi5nZXQoIlIiKSx0PWIuZ2V0KCJOIik7KDAsaS5pc05hbWUpKGUsIkMiKSYmInN0cmluZyI9PXR5cGVvZiB0JiYoeT1jWygwLGEuc3RyaW5nVG9QREZTdHJpbmcpKHQpXSl9eT9yLmF0dGFjaG1lbnQ9eTooMCxhLndhcm4pKCdwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5pbXBsZW1lbnRlZCAiR29Ub0UiIGFjdGlvbi4nKTticmVhaztjYXNlIk5hbWVkIjpjb25zdCB3PXUuZ2V0KCJOIik7dyBpbnN0YW5jZW9mIGkuTmFtZSYmKHIuYWN0aW9uPXcubmFtZSk7YnJlYWs7Y2FzZSJTZXRPQ0dTdGF0ZSI6Y29uc3Qgdj11LmdldCgiU3RhdGUiKSx4PXUuZ2V0KCJQcmVzZXJ2ZVJCIik7aWYoIUFycmF5LmlzQXJyYXkodil8fDA9PT12Lmxlbmd0aClicmVhaztjb25zdCBTPVtdO2Zvcihjb25zdCBlIG9mIHYpaWYoZSBpbnN0YW5jZW9mIGkuTmFtZSlzd2l0Y2goZS5uYW1lKXtjYXNlIk9OIjpjYXNlIk9GRiI6Y2FzZSJUb2dnbGUiOlMucHVzaChlLm5hbWUpfWVsc2UgZSBpbnN0YW5jZW9mIGkuUmVmJiZTLnB1c2goZS50b1N0cmluZygpKTtpZihTLmxlbmd0aCE9PXYubGVuZ3RoKWJyZWFrO3Iuc2V0T0NHU3RhdGU9e3N0YXRlOlMscHJlc2VydmVSQjoiYm9vbGVhbiIhPXR5cGVvZiB4fHx4fTticmVhaztjYXNlIkphdmFTY3JpcHQiOmNvbnN0IEE9dS5nZXQoIkpTIik7bGV0IGs7QSBpbnN0YW5jZW9mIG8uQmFzZVN0cmVhbT9rPUEuZ2V0U3RyaW5nKCk6InN0cmluZyI9PXR5cGVvZiBBJiYoaz1BKTtjb25zdCBDPWsmJigwLG4ucmVjb3ZlckpzVVJMKSgoMCxhLnN0cmluZ1RvUERGU3RyaW5nKShrKSk7aWYoQyl7bD1DLnVybCxyLm5ld1dpbmRvdz1DLm5ld1dpbmRvdzticmVha31kZWZhdWx0OmlmKCJKYXZhU2NyaXB0Ij09PXR8fCJTdWJtaXRGb3JtIj09PXQpYnJlYWs7KDAsYS53YXJuKSgncGFyc2VEZXN0RGljdGlvbmFyeSAtIHVuc3VwcG9ydGVkIGFjdGlvbjogIicuY29uY2F0KHQsJyIuJykpfX1lbHNlIHQuaGFzKCJEZXN0IikmJihoPXQuZ2V0KCJEZXN0IikpO2lmKCJzdHJpbmciPT10eXBlb2YgbCl7Y29uc3QgZT0oMCxhLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKGwscyx7YWRkRGVmYXVsdFByb3RvY29sOiEwLHRyeUNvbnZlcnRFbmNvZGluZzohMH0pO2UmJihyLnVybD1lLmhyZWYpLHIudW5zYWZlVXJsPWx9aCYmKGggaW5zdGFuY2VvZiBpLk5hbWUmJihoPWgubmFtZSksInN0cmluZyI9PXR5cGVvZiBoP3IuZGVzdD0oMCxhLnN0cmluZ1RvUERGU3RyaW5nKShoKTpBcnJheS5pc0FycmF5KGgpJiYoci5kZXN0PWgpKX19dC5DYXRhbG9nPXB9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5OdW1iZXJUcmVlPXQuTmFtZVRyZWU9dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDE1MCksYT1yKDE0NCk7Y2xhc3MgaXtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5jb25zdHJ1Y3Rvcj09PWkmJigwLGEudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBOYW1lT3JOdW1iZXJUcmVlLiIpLHRoaXMucm9vdD1lLHRoaXMueHJlZj10LHRoaXMuX3R5cGU9cn1nZXRBbGwoKXtjb25zdCBlPW5ldyBNYXA7aWYoIXRoaXMucm9vdClyZXR1cm4gZTtjb25zdCB0PXRoaXMueHJlZixyPW5ldyBuLlJlZlNldDtyLnB1dCh0aGlzLnJvb3QpO2NvbnN0IGk9W3RoaXMucm9vdF07Zm9yKDtpLmxlbmd0aD4wOyl7Y29uc3Qgcz10LmZldGNoSWZSZWYoaS5zaGlmdCgpKTtpZighKHMgaW5zdGFuY2VvZiBuLkRpY3QpKWNvbnRpbnVlO2lmKHMuaGFzKCJLaWRzIikpe2NvbnN0IGU9cy5nZXQoIktpZHMiKTtpZighQXJyYXkuaXNBcnJheShlKSljb250aW51ZTtmb3IoY29uc3QgdCBvZiBlKXtpZihyLmhhcyh0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcignRHVwbGljYXRlIGVudHJ5IGluICInLmNvbmNhdCh0aGlzLl90eXBlLCciIHRyZWUuJykpO2kucHVzaCh0KSxyLnB1dCh0KX1jb250aW51ZX1jb25zdCBvPXMuZ2V0KHRoaXMuX3R5cGUpO2lmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCByPTAsbj1vLmxlbmd0aDtyPG47cis9MillLnNldCh0LmZldGNoSWZSZWYob1tyXSksdC5mZXRjaElmUmVmKG9bcisxXSkpfXJldHVybiBlfWdldChlKXtpZighdGhpcy5yb290KXJldHVybiBudWxsO2NvbnN0IHQ9dGhpcy54cmVmO2xldCByPXQuZmV0Y2hJZlJlZih0aGlzLnJvb3QpLG49MDtmb3IoO3IuaGFzKCJLaWRzIik7KXtpZigrK24+MTApcmV0dXJuKDAsYS53YXJuKSgnU2VhcmNoIGRlcHRoIGxpbWl0IHJlYWNoZWQgZm9yICInLmNvbmNhdCh0aGlzLl90eXBlLCciIHRyZWUuJykpLG51bGw7Y29uc3QgaT1yLmdldCgiS2lkcyIpO2lmKCFBcnJheS5pc0FycmF5KGkpKXJldHVybiBudWxsO2xldCBzPTAsbz1pLmxlbmd0aC0xO2Zvcig7czw9bzspe2NvbnN0IG49cytvPj4xLGE9dC5mZXRjaElmUmVmKGlbbl0pLGM9YS5nZXQoIkxpbWl0cyIpO2lmKGU8dC5mZXRjaElmUmVmKGNbMF0pKW89bi0xO2Vsc2V7aWYoIShlPnQuZmV0Y2hJZlJlZihjWzFdKSkpe3I9YTticmVha31zPW4rMX19aWYocz5vKXJldHVybiBudWxsfWNvbnN0IGk9ci5nZXQodGhpcy5fdHlwZSk7aWYoQXJyYXkuaXNBcnJheShpKSl7bGV0IHI9MCxuPWkubGVuZ3RoLTI7Zm9yKDtyPD1uOyl7Y29uc3QgYT1yK24+PjEscz1hKygxJmEpLG89dC5mZXRjaElmUmVmKGlbc10pO2lmKGU8byluPXMtMjtlbHNle2lmKCEoZT5vKSlyZXR1cm4gdC5mZXRjaElmUmVmKGlbcysxXSk7cj1zKzJ9fX1yZXR1cm4gbnVsbH19dC5OYW1lVHJlZT1jbGFzcyBleHRlbmRzIGl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQsIk5hbWVzIil9fSx0Lk51bWJlclRyZWU9Y2xhc3MgZXh0ZW5kcyBpe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0LCJOdW1zIil9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNsZWFyR2xvYmFsQ2FjaGVzPWZ1bmN0aW9uKCl7KDAsbi5jbGVhclByaW1pdGl2ZUNhY2hlcykoKSwoMCxhLmNsZWFyVW5pY29kZUNhY2hlcykoKX07dmFyIG49cigxNTApLGE9cigxOTApfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRmlsZVNwZWM9dm9pZCAwO3ZhciBuPXIoMTQ0KSxhPXIoMTUxKSxpPXIoMTUwKTtmdW5jdGlvbiBzKGUpe3JldHVybiBlLmhhcygiVUYiKT9lLmdldCgiVUYiKTplLmhhcygiRiIpP2UuZ2V0KCJGIik6ZS5oYXMoIlVuaXgiKT9lLmdldCgiVW5peCIpOmUuaGFzKCJNYWMiKT9lLmdldCgiTWFjIik6ZS5oYXMoIkRPUyIpP2UuZ2V0KCJET1MiKTpudWxsfXQuRmlsZVNwZWM9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXtlIGluc3RhbmNlb2YgaS5EaWN0JiYodGhpcy54cmVmPXQsdGhpcy5yb290PWUsZS5oYXMoIkZTIikmJih0aGlzLmZzPWUuZ2V0KCJGUyIpKSx0aGlzLmRlc2NyaXB0aW9uPWUuaGFzKCJEZXNjIik/KDAsbi5zdHJpbmdUb1BERlN0cmluZykoZS5nZXQoIkRlc2MiKSk6IiIsZS5oYXMoIlJGIikmJigwLG4ud2FybikoIlJlbGF0ZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpLHRoaXMuY29udGVudEF2YWlsYWJsZT0hMCxlLmhhcygiRUYiKXx8KHRoaXMuY29udGVudEF2YWlsYWJsZT0hMSwoMCxuLndhcm4pKCJOb24tZW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpKSl9Z2V0IGZpbGVuYW1lKCl7aWYoIXRoaXMuX2ZpbGVuYW1lJiZ0aGlzLnJvb3Qpe2NvbnN0IGU9cyh0aGlzLnJvb3QpfHwidW5uYW1lZCI7dGhpcy5fZmlsZW5hbWU9KDAsbi5zdHJpbmdUb1BERlN0cmluZykoZSkucmVwbGFjZUFsbCgiXFxcXCIsIlxcIikucmVwbGFjZUFsbCgiXFwvIiwiLyIpLnJlcGxhY2VBbGwoIlxcIiwiLyIpfXJldHVybiB0aGlzLl9maWxlbmFtZX1nZXQgY29udGVudCgpe2lmKCF0aGlzLmNvbnRlbnRBdmFpbGFibGUpcmV0dXJuIG51bGw7IXRoaXMuY29udGVudFJlZiYmdGhpcy5yb290JiYodGhpcy5jb250ZW50UmVmPXModGhpcy5yb290LmdldCgiRUYiKSkpO2xldCBlPW51bGw7aWYodGhpcy5jb250ZW50UmVmKXtjb25zdCB0PXRoaXMueHJlZi5mZXRjaElmUmVmKHRoaXMuY29udGVudFJlZik7dCBpbnN0YW5jZW9mIGEuQmFzZVN0cmVhbT9lPXQuZ2V0Qnl0ZXMoKTooMCxuLndhcm4pKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gcG9pbnRzIHRvIG5vbi1leGlzdGluZy9pbnZhbGlkIGNvbnRlbnQiKX1lbHNlKDAsbi53YXJuKSgiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYSBjb250ZW50Iik7cmV0dXJuIGV9Z2V0IHNlcmlhbGl6YWJsZSgpe3JldHVybntmaWxlbmFtZTp0aGlzLmZpbGVuYW1lLGNvbnRlbnQ6dGhpcy5jb250ZW50fX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuTWV0YWRhdGFQYXJzZXI9dm9pZCAwLHIoMikscigxMzkpO3ZhciBuPXIoMjE3KTt0Lk1ldGFkYXRhUGFyc2VyPWNsYXNze2NvbnN0cnVjdG9yKGUpe2U9dGhpcy5fcmVwYWlyKGUpO2NvbnN0IHQ9bmV3IG4uU2ltcGxlWE1MUGFyc2VyKHtsb3dlckNhc2VOYW1lOiEwfSkucGFyc2VGcm9tU3RyaW5nKGUpO3RoaXMuX21ldGFkYXRhTWFwPW5ldyBNYXAsdGhpcy5fZGF0YT1lLHQmJnRoaXMuX3BhcnNlKHQpfV9yZXBhaXIoZSl7cmV0dXJuIGUucmVwbGFjZSgvXltePF0rLywiIikucmVwbGFjZUFsbCgvPlxcMzc2XFwzNzcoW148XSspL2csKGZ1bmN0aW9uKGUsdCl7Y29uc3Qgcj10LnJlcGxhY2VBbGwoL1xcKFswLTNdKShbMC03XSkoWzAtN10pL2csKGZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDY0KnQrOCpyKzEqbil9KSkucmVwbGFjZUFsbCgvJihhbXB8YXBvc3xndHxsdHxxdW90KTsvZywoZnVuY3Rpb24oZSx0KXtzd2l0Y2godCl7Y2FzZSJhbXAiOnJldHVybiImIjtjYXNlImFwb3MiOnJldHVybiInIjtjYXNlImd0IjpyZXR1cm4iPiI7Y2FzZSJsdCI6cmV0dXJuIjwiO2Nhc2UicXVvdCI6cmV0dXJuJyInfXRocm93IG5ldyBFcnJvcigiX3JlcGFpcjogIi5jb25jYXQodCwiIGlzbid0IGRlZmluZWQuIikpfSkpLG49WyI+Il07Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtlPHQ7ZSs9Mil7Y29uc3QgdD0yNTYqci5jaGFyQ29kZUF0KGUpK3IuY2hhckNvZGVBdChlKzEpO3Q+PTMyJiZ0PDEyNyYmNjAhPT10JiY2MiE9PXQmJjM4IT09dD9uLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh0KSk6bi5wdXNoKCImI3giKyg2NTUzNit0KS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpKyI7Iil9cmV0dXJuIG4uam9pbigiIil9KSl9X2dldFNlcXVlbmNlKGUpe2NvbnN0IHQ9ZS5ub2RlTmFtZTtyZXR1cm4icmRmOmJhZyIhPT10JiYicmRmOnNlcSIhPT10JiYicmRmOmFsdCIhPT10P251bGw6ZS5jaGlsZE5vZGVzLmZpbHRlcigoZT0+InJkZjpsaSI9PT1lLm5vZGVOYW1lKSl9X3BhcnNlQXJyYXkoZSl7aWYoIWUuaGFzQ2hpbGROb2RlcygpKXJldHVybjtjb25zdFt0XT1lLmNoaWxkTm9kZXMscj10aGlzLl9nZXRTZXF1ZW5jZSh0KXx8W107dGhpcy5fbWV0YWRhdGFNYXAuc2V0KGUubm9kZU5hbWUsci5tYXAoKGU9PmUudGV4dENvbnRlbnQudHJpbSgpKSkpfV9wYXJzZShlKXtsZXQgdD1lLmRvY3VtZW50RWxlbWVudDtpZigicmRmOnJkZiIhPT10Lm5vZGVOYW1lKWZvcih0PXQuZmlyc3RDaGlsZDt0JiYicmRmOnJkZiIhPT10Lm5vZGVOYW1lOyl0PXQubmV4dFNpYmxpbmc7aWYodCYmInJkZjpyZGYiPT09dC5ub2RlTmFtZSYmdC5oYXNDaGlsZE5vZGVzKCkpZm9yKGNvbnN0IGUgb2YgdC5jaGlsZE5vZGVzKWlmKCJyZGY6ZGVzY3JpcHRpb24iPT09ZS5ub2RlTmFtZSlmb3IoY29uc3QgdCBvZiBlLmNoaWxkTm9kZXMpe2NvbnN0IGU9dC5ub2RlTmFtZTtzd2l0Y2goZSl7Y2FzZSIjdGV4dCI6Y29udGludWU7Y2FzZSJkYzpjcmVhdG9yIjpjYXNlImRjOnN1YmplY3QiOnRoaXMuX3BhcnNlQXJyYXkodCk7Y29udGludWV9dGhpcy5fbWV0YWRhdGFNYXAuc2V0KGUsdC50ZXh0Q29udGVudC50cmltKCkpfX1nZXQgc2VyaWFsaXphYmxlKCl7cmV0dXJue3BhcnNlZERhdGE6dGhpcy5fbWV0YWRhdGFNYXAscmF3RGF0YTp0aGlzLl9kYXRhfX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuU3RydWN0VHJlZVJvb3Q9dC5TdHJ1Y3RUcmVlUGFnZT12b2lkIDAscigxMzkpO3ZhciBuPXIoMTUwKSxhPXIoMTQ0KSxpPXIoMjIxKTtjb25zdCBzPSJQQUdFX0NPTlRFTlQiLG89IlNUUkVBTV9DT05URU5UIixjPSJPQkpFQ1QiLGw9IkVMRU1FTlQiO3QuU3RydWN0VHJlZVJvb3Q9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5kaWN0PWUsdGhpcy5yb2xlTWFwPW5ldyBNYXB9aW5pdCgpe3RoaXMucmVhZFJvbGVNYXAoKX1yZWFkUm9sZU1hcCgpe2NvbnN0IGU9dGhpcy5kaWN0LmdldCgiUm9sZU1hcCIpO2UgaW5zdGFuY2VvZiBuLkRpY3QmJmUuZm9yRWFjaCgoKGUsdCk9Pnt0IGluc3RhbmNlb2Ygbi5OYW1lJiZ0aGlzLnJvbGVNYXAuc2V0KGUsdC5uYW1lKX0pKX19O2NsYXNzIGh7Y29uc3RydWN0b3IoZSx0KXt0aGlzLnRyZWU9ZSx0aGlzLmRpY3Q9dCx0aGlzLmtpZHM9W10sdGhpcy5wYXJzZUtpZHMoKX1nZXQgcm9sZSgpe2NvbnN0IGU9dGhpcy5kaWN0LmdldCgiUyIpLHQ9ZSBpbnN0YW5jZW9mIG4uTmFtZT9lLm5hbWU6IiIse3Jvb3Q6cn09dGhpcy50cmVlO3JldHVybiByLnJvbGVNYXAuaGFzKHQpP3Iucm9sZU1hcC5nZXQodCk6dH1wYXJzZUtpZHMoKXtsZXQgZT1udWxsO2NvbnN0IHQ9dGhpcy5kaWN0LmdldFJhdygiUGciKTt0IGluc3RhbmNlb2Ygbi5SZWYmJihlPXQudG9TdHJpbmcoKSk7Y29uc3Qgcj10aGlzLmRpY3QuZ2V0KCJLIik7aWYoQXJyYXkuaXNBcnJheShyKSlmb3IoY29uc3QgdCBvZiByKXtjb25zdCByPXRoaXMucGFyc2VLaWQoZSx0KTtyJiZ0aGlzLmtpZHMucHVzaChyKX1lbHNle2NvbnN0IHQ9dGhpcy5wYXJzZUtpZChlLHIpO3QmJnRoaXMua2lkcy5wdXNoKHQpfX1wYXJzZUtpZChlLHQpe2lmKE51bWJlci5pc0ludGVnZXIodCkpcmV0dXJuIHRoaXMudHJlZS5wYWdlRGljdC5vYmpJZCE9PWU/bnVsbDpuZXcgdSh7dHlwZTpzLG1jaWQ6dCxwYWdlT2JqSWQ6ZX0pO2xldCByPW51bGw7aWYodCBpbnN0YW5jZW9mIG4uUmVmP3I9dGhpcy5kaWN0LnhyZWYuZmV0Y2godCk6dCBpbnN0YW5jZW9mIG4uRGljdCYmKHI9dCksIXIpcmV0dXJuIG51bGw7Y29uc3QgYT1yLmdldFJhdygiUGciKTthIGluc3RhbmNlb2Ygbi5SZWYmJihlPWEudG9TdHJpbmcoKSk7Y29uc3QgaT1yLmdldCgiVHlwZSIpaW5zdGFuY2VvZiBuLk5hbWU/ci5nZXQoIlR5cGUiKS5uYW1lOm51bGw7cmV0dXJuIk1DUiI9PT1pP3RoaXMudHJlZS5wYWdlRGljdC5vYmpJZCE9PWU/bnVsbDpuZXcgdSh7dHlwZTpvLHJlZk9iaklkOnIuZ2V0UmF3KCJTdG0iKWluc3RhbmNlb2Ygbi5SZWY/ci5nZXRSYXcoIlN0bSIpLnRvU3RyaW5nKCk6bnVsbCxwYWdlT2JqSWQ6ZSxtY2lkOnIuZ2V0KCJNQ0lEIil9KToiT0JKUiI9PT1pP3RoaXMudHJlZS5wYWdlRGljdC5vYmpJZCE9PWU/bnVsbDpuZXcgdSh7dHlwZTpjLHJlZk9iaklkOnIuZ2V0UmF3KCJPYmoiKWluc3RhbmNlb2Ygbi5SZWY/ci5nZXRSYXcoIk9iaiIpLnRvU3RyaW5nKCk6bnVsbCxwYWdlT2JqSWQ6ZX0pOm5ldyB1KHt0eXBlOmwsZGljdDpyfSl9fWNsYXNzIHV7Y29uc3RydWN0b3IoZSl7bGV0e3R5cGU6dCxkaWN0OnI9bnVsbCxtY2lkOm49bnVsbCxwYWdlT2JqSWQ6YT1udWxsLHJlZk9iaklkOmk9bnVsbH09ZTt0aGlzLnR5cGU9dCx0aGlzLmRpY3Q9cix0aGlzLm1jaWQ9bix0aGlzLnBhZ2VPYmpJZD1hLHRoaXMucmVmT2JqSWQ9aSx0aGlzLnBhcmVudE5vZGU9bnVsbH19dC5TdHJ1Y3RUcmVlUGFnZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMucm9vdD1lLHRoaXMucm9vdERpY3Q9ZT9lLmRpY3Q6bnVsbCx0aGlzLnBhZ2VEaWN0PXQsdGhpcy5ub2Rlcz1bXX1wYXJzZSgpe2lmKCF0aGlzLnJvb3R8fCF0aGlzLnJvb3REaWN0KXJldHVybjtjb25zdCBlPXRoaXMucm9vdERpY3QuZ2V0KCJQYXJlbnRUcmVlIik7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9dGhpcy5wYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTtpZighTnVtYmVyLmlzSW50ZWdlcih0KSlyZXR1cm47Y29uc3Qgcj1uZXcgaS5OdW1iZXJUcmVlKGUsdGhpcy5yb290RGljdC54cmVmKS5nZXQodCk7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuO2NvbnN0IGE9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiByKWUgaW5zdGFuY2VvZiBuLlJlZiYmdGhpcy5hZGROb2RlKHRoaXMucm9vdERpY3QueHJlZi5mZXRjaChlKSxhKX1hZGROb2RlKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOjA7aWYocj40MClyZXR1cm4oMCxhLndhcm4pKCJTdHJ1Y3RUcmVlIE1BWF9ERVBUSCByZWFjaGVkLiIpLG51bGw7aWYodC5oYXMoZSkpcmV0dXJuIHQuZ2V0KGUpO2NvbnN0IGk9bmV3IGgodGhpcyxlKTt0LnNldChlLGkpO2NvbnN0IHM9ZS5nZXQoIlAiKTtpZighc3x8KDAsbi5pc05hbWUpKHMuZ2V0KCJUeXBlIiksIlN0cnVjdFRyZWVSb290IikpcmV0dXJuIHRoaXMuYWRkVG9wTGV2ZWxOb2RlKGUsaSl8fHQuZGVsZXRlKGUpLGk7Y29uc3Qgbz10aGlzLmFkZE5vZGUocyx0LHIrMSk7aWYoIW8pcmV0dXJuIGk7bGV0IGM9ITE7Zm9yKGNvbnN0IHQgb2Ygby5raWRzKXQudHlwZT09PWwmJnQuZGljdD09PWUmJih0LnBhcmVudE5vZGU9aSxjPSEwKTtyZXR1cm4gY3x8dC5kZWxldGUoZSksaX1hZGRUb3BMZXZlbE5vZGUoZSx0KXtjb25zdCByPXRoaXMucm9vdERpY3QuZ2V0KCJLIik7aWYoIXIpcmV0dXJuITE7aWYociBpbnN0YW5jZW9mIG4uRGljdClyZXR1cm4gci5vYmpJZD09PWUub2JqSWQmJih0aGlzLm5vZGVzWzBdPXQsITApO2lmKCFBcnJheS5pc0FycmF5KHIpKXJldHVybiEwO2xldCBhPSExO2ZvcihsZXQgbj0wO248ci5sZW5ndGg7bisrKXtjb25zdCBpPXJbbl07KG51bGw9PWk/dm9pZCAwOmkudG9TdHJpbmcoKSk9PT1lLm9iaklkJiYodGhpcy5ub2Rlc1tuXT10LGE9ITApfXJldHVybiBhfWdldCBzZXJpYWxpemFibGUoKXtmdW5jdGlvbiBlKHQscil7bGV0IG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOjA7aWYobj40MClyZXR1cm4gdm9pZCgwLGEud2FybikoIlN0cnVjdFRyZWUgdG9vIGRlZXAgdG8gYmUgZnVsbHkgc2VyaWFsaXplZC4iKTtjb25zdCBpPU9iamVjdC5jcmVhdGUobnVsbCk7aS5yb2xlPXQucm9sZSxpLmNoaWxkcmVuPVtdLHIuY2hpbGRyZW4ucHVzaChpKTtjb25zdCBoPXQuZGljdC5nZXQoIkFsdCIpOyJzdHJpbmciPT10eXBlb2YgaCYmKGkuYWx0PSgwLGEuc3RyaW5nVG9QREZTdHJpbmcpKGgpKTtjb25zdCB1PXQuZGljdC5nZXQoIkxhbmciKTsic3RyaW5nIj09dHlwZW9mIHUmJihpLmxhbmc9KDAsYS5zdHJpbmdUb1BERlN0cmluZykodSkpO2Zvcihjb25zdCByIG9mIHQua2lkcyl7Y29uc3QgdD1yLnR5cGU9PT1sP3IucGFyZW50Tm9kZTpudWxsO3Q/ZSh0LGksbisxKTpyLnR5cGU9PT1zfHxyLnR5cGU9PT1vP2kuY2hpbGRyZW4ucHVzaCh7dHlwZToiY29udGVudCIsaWQ6InAiLmNvbmNhdChyLnBhZ2VPYmpJZCwiX21jIikuY29uY2F0KHIubWNpZCl9KTpyLnR5cGU9PT1jJiZpLmNoaWxkcmVuLnB1c2goe3R5cGU6Im9iamVjdCIsaWQ6ci5yZWZPYmpJZH0pfX1jb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7dC5jaGlsZHJlbj1bXSx0LnJvbGU9IlJvb3QiO2Zvcihjb25zdCByIG9mIHRoaXMubm9kZXMpciYmZShyLHQpO3JldHVybiB0fX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5PYmplY3RMb2FkZXI9dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDE1MCksYT1yKDE1MSksaT1yKDE0OSkscz1yKDE0NCk7ZnVuY3Rpb24gbyhlLHQpe2lmKGUgaW5zdGFuY2VvZiBuLkRpY3QpZT1lLmdldFJhd1ZhbHVlcygpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGEuQmFzZVN0cmVhbSllPWUuZGljdC5nZXRSYXdWYWx1ZXMoKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybjtmb3IoY29uc3QgaSBvZiBlKSgocj1pKWluc3RhbmNlb2Ygbi5SZWZ8fHIgaW5zdGFuY2VvZiBuLkRpY3R8fHIgaW5zdGFuY2VvZiBhLkJhc2VTdHJlYW18fEFycmF5LmlzQXJyYXkocikpJiZ0LnB1c2goaSk7dmFyIHJ9dC5PYmplY3RMb2FkZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMuZGljdD1lLHRoaXMua2V5cz10LHRoaXMueHJlZj1yLHRoaXMucmVmU2V0PW51bGx9YXN5bmMgbG9hZCgpe2lmKHRoaXMueHJlZi5zdHJlYW0uaXNEYXRhTG9hZGVkKXJldHVybjtjb25zdHtrZXlzOmUsZGljdDp0fT10aGlzO3RoaXMucmVmU2V0PW5ldyBuLlJlZlNldDtjb25zdCByPVtdO2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IGU9dC5nZXRSYXcobik7dm9pZCAwIT09ZSYmci5wdXNoKGUpfXJldHVybiB0aGlzLl93YWxrKHIpfWFzeW5jIF93YWxrKGUpe2NvbnN0IHQ9W10scj1bXTtmb3IoO2UubGVuZ3RoOyl7bGV0IGM9ZS5wb3AoKTtpZihjIGluc3RhbmNlb2Ygbi5SZWYpe2lmKHRoaXMucmVmU2V0LmhhcyhjKSljb250aW51ZTt0cnl7dGhpcy5yZWZTZXQucHV0KGMpLGM9dGhpcy54cmVmLmZldGNoKGMpfWNhdGNoKGUpe2lmKCEoZSBpbnN0YW5jZW9mIGkuTWlzc2luZ0RhdGFFeGNlcHRpb24pKXsoMCxzLndhcm4pKCdPYmplY3RMb2FkZXIuX3dhbGsgLSByZXF1ZXN0aW5nIGFsbCBkYXRhOiAiJy5jb25jYXQoZSwnIi4nKSksdGhpcy5yZWZTZXQ9bnVsbDtjb25zdHttYW5hZ2VyOnR9PXRoaXMueHJlZi5zdHJlYW07cmV0dXJuIHQucmVxdWVzdEFsbENodW5rcygpfXQucHVzaChjKSxyLnB1c2goe2JlZ2luOmUuYmVnaW4sZW5kOmUuZW5kfSl9fWlmKGMgaW5zdGFuY2VvZiBhLkJhc2VTdHJlYW0pe2NvbnN0IGU9Yy5nZXRCYXNlU3RyZWFtcygpO2lmKGUpe2xldCBuPSExO2Zvcihjb25zdCB0IG9mIGUpdC5pc0RhdGFMb2FkZWR8fChuPSEwLHIucHVzaCh7YmVnaW46dC5zdGFydCxlbmQ6dC5lbmR9KSk7biYmdC5wdXNoKGMpfX1vKGMsZSl9aWYoci5sZW5ndGgpe2F3YWl0IHRoaXMueHJlZi5zdHJlYW0ubWFuYWdlci5yZXF1ZXN0UmFuZ2VzKHIpO2Zvcihjb25zdCBlIG9mIHQpZSBpbnN0YW5jZW9mIG4uUmVmJiZ0aGlzLnJlZlNldC5yZW1vdmUoZSk7cmV0dXJuIHRoaXMuX3dhbGsodCl9dGhpcy5yZWZTZXQ9bnVsbH19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWEZBRmFjdG9yeT12b2lkIDAscigxMzkpO3ZhciBuPXIoMjI4KSxhPXIoMjI5KSxpPXIoMjQyKSxzPXIoMjM4KSxvPXIoMjM3KSxjPXIoMTQ0KSxsPXIoMjQzKSxoPXIoMjUzKTtjbGFzcyB1e2NvbnN0cnVjdG9yKGUpe3RyeXt0aGlzLnJvb3Q9KG5ldyBsLlhGQVBhcnNlcikucGFyc2UodS5fY3JlYXRlRG9jdW1lbnQoZSkpO2NvbnN0IHQ9bmV3IGEuQmluZGVyKHRoaXMucm9vdCk7dGhpcy5mb3JtPXQuYmluZCgpLHRoaXMuZGF0YUhhbmRsZXI9bmV3IGkuRGF0YUhhbmRsZXIodGhpcy5yb290LHQuZ2V0RGF0YSgpKSx0aGlzLmZvcm1bbi4kZ2xvYmFsRGF0YV0udGVtcGxhdGU9dGhpcy5mb3JtfWNhdGNoKGUpeygwLGMud2FybikoIlhGQSAtIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBwYXJzaW5nIGFuZCBiaW5kaW5nOiAiLmNvbmNhdChlKSl9fWlzVmFsaWQoKXtyZXR1cm4gdGhpcy5yb290JiZ0aGlzLmZvcm19X2NyZWF0ZVBhZ2VzSGVscGVyKCl7Y29uc3QgZT10aGlzLmZvcm1bbi4kdG9QYWdlc10oKTtyZXR1cm4gbmV3IFByb21pc2UoKCh0LHIpPT57Y29uc3Qgbj0oKT0+e3RyeXtjb25zdCByPWUubmV4dCgpO3IuZG9uZT90KHIudmFsdWUpOnNldFRpbWVvdXQobiwwKX1jYXRjaChlKXtyKGUpfX07c2V0VGltZW91dChuLDApfSkpfWFzeW5jIF9jcmVhdGVQYWdlcygpe3RyeXt0aGlzLnBhZ2VzPWF3YWl0IHRoaXMuX2NyZWF0ZVBhZ2VzSGVscGVyKCksdGhpcy5kaW1zPXRoaXMucGFnZXMuY2hpbGRyZW4ubWFwKChlPT57Y29uc3R7d2lkdGg6dCxoZWlnaHQ6cn09ZS5hdHRyaWJ1dGVzLnN0eWxlO3JldHVyblswLDAscGFyc2VJbnQodCkscGFyc2VJbnQocildfSkpfWNhdGNoKGUpeygwLGMud2FybikoIlhGQSAtIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBsYXlvdXQ6ICIuY29uY2F0KGUpKX19Z2V0Qm91bmRpbmdCb3goZSl7cmV0dXJuIHRoaXMuZGltc1tlXX1hc3luYyBnZXROdW1QYWdlcygpe3JldHVybiB0aGlzLnBhZ2VzfHxhd2FpdCB0aGlzLl9jcmVhdGVQYWdlcygpLHRoaXMuZGltcy5sZW5ndGh9c2V0SW1hZ2VzKGUpe3RoaXMuZm9ybVtuLiRnbG9iYWxEYXRhXS5pbWFnZXM9ZX1zZXRGb250cyhlKXt0aGlzLmZvcm1bbi4kZ2xvYmFsRGF0YV0uZm9udEZpbmRlcj1uZXcgcy5Gb250RmluZGVyKGUpO2NvbnN0IHQ9W107Zm9yKGxldCBlIG9mIHRoaXMuZm9ybVtuLiRnbG9iYWxEYXRhXS51c2VkVHlwZWZhY2VzKWU9KDAsby5zdHJpcFF1b3RlcykoZSksdGhpcy5mb3JtW24uJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuZmluZChlKXx8dC5wdXNoKGUpO3JldHVybiB0Lmxlbmd0aD4wP3Q6bnVsbH1hcHBlbmRGb250cyhlLHQpe3RoaXMuZm9ybVtuLiRnbG9iYWxEYXRhXS5mb250RmluZGVyLmFkZChlLHQpfWFzeW5jIGdldFBhZ2VzKCl7dGhpcy5wYWdlc3x8YXdhaXQgdGhpcy5fY3JlYXRlUGFnZXMoKTtjb25zdCBlPXRoaXMucGFnZXM7cmV0dXJuIHRoaXMucGFnZXM9bnVsbCxlfXNlcmlhbGl6ZURhdGEoZSl7cmV0dXJuIHRoaXMuZGF0YUhhbmRsZXIuc2VyaWFsaXplKGUpfXN0YXRpYyBfY3JlYXRlRG9jdW1lbnQoZSl7cmV0dXJuIGVbIi94ZHA6eGRwIl0/T2JqZWN0LnZhbHVlcyhlKS5qb2luKCIiKTplWyJ4ZHA6eGRwIl19c3RhdGljIGdldFJpY2hUZXh0QXNIdG1sKGUpe2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e2xldCB0PW5ldyBsLlhGQVBhcnNlcihoLlhodG1sTmFtZXNwYWNlLCEwKS5wYXJzZShlKTtpZighWyJib2R5IiwieGh0bWwiXS5pbmNsdWRlcyh0W24uJG5vZGVOYW1lXSkpe2NvbnN0IGU9aC5YaHRtbE5hbWVzcGFjZS5ib2R5KHt9KTtlW24uJGFwcGVuZENoaWxkXSh0KSx0PWV9Y29uc3Qgcj10W24uJHRvSFRNTF0oKTtpZighci5zdWNjZXNzKXJldHVybiBudWxsO2NvbnN0e2h0bWw6YX09cix7YXR0cmlidXRlczppfT1hO3JldHVybiBpJiYoaS5jbGFzcyYmKGkuY2xhc3M9aS5jbGFzcy5maWx0ZXIoKGU9PiFlLnN0YXJ0c1dpdGgoInhmYSIpKSkpLGkuZGlyPSJhdXRvIikse2h0bWw6YSxzdHI6dFtuLiR0ZXh0XSgpfX1jYXRjaChlKXsoMCxjLndhcm4pKCJYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBvZiByaWNoIHRleHQ6ICIuY29uY2F0KGUpKX1yZXR1cm4gbnVsbH19dC5YRkFGYWN0b3J5PXV9LChlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuJHVpZD10LiR0b1N0eWxlPXQuJHRvU3RyaW5nPXQuJHRvUGFnZXM9dC4kdG9IVE1MPXQuJHRleHQ9dC4kdGFiSW5kZXg9dC4kc2V0VmFsdWU9dC4kc2V0U2V0QXR0cmlidXRlcz10LiRzZXRJZD10LiRzZWFyY2hOb2RlPXQuJHJvb3Q9dC4kcmVzb2x2ZVByb3RvdHlwZXM9dC4kcmVtb3ZlQ2hpbGQ9dC4kcHVzaFBhcmE9dC4kcHVzaEdseXBocz10LiRwb3BQYXJhPXQuJG9uVGV4dD10LiRvbkNoaWxkQ2hlY2s9dC4kb25DaGlsZD10LiRuc0F0dHJpYnV0ZXM9dC4kbm9kZU5hbWU9dC4kbmFtZXNwYWNlSWQ9dC4kbGFzdEF0dHJpYnV0ZT10LiRpc1VzYWJsZT10LiRpc1RyYW5zcGFyZW50PXQuJGlzVGhlcmVNb3JlV2lkdGg9dC4kaXNTcGxpdHRhYmxlPXQuJGlzTnNBZ25vc3RpYz10LiRpc0Rlc2NlbmRlbnQ9dC4kaXNEYXRhVmFsdWU9dC4kaXNDREFUQVhtbD10LiRpc0JpbmRhYmxlPXQuJGluc2VydEF0PXQuJGluZGV4T2Y9dC4kaWRzPXQuJGhhc1NldHRhYmxlVmFsdWU9dC4kZ2xvYmFsRGF0YT10LiRnZXRUZW1wbGF0ZVJvb3Q9dC4kZ2V0U3ViZm9ybVBhcmVudD10LiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdD10LiRnZXRQYXJlbnQ9dC4kZ2V0TmV4dFBhZ2U9dC4kZ2V0RXh0cmE9dC4kZ2V0RGF0YVZhbHVlPXQuJGdldENvbnRhaW5lZENoaWxkcmVuPXQuJGdldENoaWxkcmVuQnlOYW1lSXQ9dC4kZ2V0Q2hpbGRyZW5CeU5hbWU9dC4kZ2V0Q2hpbGRyZW5CeUNsYXNzPXQuJGdldENoaWxkcmVuPXQuJGdldEF2YWlsYWJsZVNwYWNlPXQuJGdldEF0dHJpYnV0ZXM9dC4kZ2V0QXR0cmlidXRlSXQ9dC4kZmx1c2hIVE1MPXQuJGZpbmFsaXplPXQuJGV4dHJhPXQuJGR1bXA9dC4kZGF0YT10LiRjb250ZW50PXQuJGNvbnN1bWVkPXQuJGNsb25lPXQuJGNsZWFudXA9dC4kY2xlYW5QYWdlPXQuJGNsZWFuPXQuJGNoaWxkcmVuVG9IVE1MPXQuJGFwcGVuZENoaWxkPXQuJGFkZEhUTUw9dC4kYWNjZXB0V2hpdGVzcGFjZT12b2lkIDA7Y29uc3Qgcj1TeW1ib2woKTt0LiRhY2NlcHRXaGl0ZXNwYWNlPXI7Y29uc3Qgbj1TeW1ib2woKTt0LiRhZGRIVE1MPW47Y29uc3QgYT1TeW1ib2woKTt0LiRhcHBlbmRDaGlsZD1hO2NvbnN0IGk9U3ltYm9sKCk7dC4kY2hpbGRyZW5Ub0hUTUw9aTtjb25zdCBzPVN5bWJvbCgpO3QuJGNsZWFuPXM7Y29uc3Qgbz1TeW1ib2woKTt0LiRjbGVhblBhZ2U9bztjb25zdCBjPVN5bWJvbCgpO3QuJGNsZWFudXA9Yztjb25zdCBsPVN5bWJvbCgpO3QuJGNsb25lPWw7Y29uc3QgaD1TeW1ib2woKTt0LiRjb25zdW1lZD1oO2NvbnN0IHU9U3ltYm9sKCJjb250ZW50Iik7dC4kY29udGVudD11O2NvbnN0IGQ9U3ltYm9sKCJkYXRhIik7dC4kZGF0YT1kO2NvbnN0IGY9U3ltYm9sKCk7dC4kZHVtcD1mO2NvbnN0IGc9U3ltYm9sKCJleHRyYSIpO3QuJGV4dHJhPWc7Y29uc3QgcD1TeW1ib2woKTt0LiRmaW5hbGl6ZT1wO2NvbnN0IG09U3ltYm9sKCk7dC4kZmx1c2hIVE1MPW07Y29uc3QgYj1TeW1ib2woKTt0LiRnZXRBdHRyaWJ1dGVJdD1iO2NvbnN0IHk9U3ltYm9sKCk7dC4kZ2V0QXR0cmlidXRlcz15O2NvbnN0IHc9U3ltYm9sKCk7dC4kZ2V0QXZhaWxhYmxlU3BhY2U9dztjb25zdCB2PVN5bWJvbCgpO3QuJGdldENoaWxkcmVuQnlDbGFzcz12O2NvbnN0IHg9U3ltYm9sKCk7dC4kZ2V0Q2hpbGRyZW5CeU5hbWU9eDtjb25zdCBTPVN5bWJvbCgpO3QuJGdldENoaWxkcmVuQnlOYW1lSXQ9Uztjb25zdCBBPVN5bWJvbCgpO3QuJGdldERhdGFWYWx1ZT1BO2NvbnN0IGs9U3ltYm9sKCk7dC4kZ2V0RXh0cmE9aztjb25zdCBDPVN5bWJvbCgpO3QuJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0PUM7Y29uc3QgTz1TeW1ib2woKTt0LiRnZXRDaGlsZHJlbj1PO2NvbnN0IEY9U3ltYm9sKCk7dC4kZ2V0Q29udGFpbmVkQ2hpbGRyZW49Rjtjb25zdCBJPVN5bWJvbCgpO3QuJGdldE5leHRQYWdlPUk7Y29uc3QgVD1TeW1ib2woKTt0LiRnZXRTdWJmb3JtUGFyZW50PVQ7Y29uc3QgTT1TeW1ib2woKTt0LiRnZXRQYXJlbnQ9TTtjb25zdCBFPVN5bWJvbCgpO3QuJGdldFRlbXBsYXRlUm9vdD1FO2NvbnN0IFA9U3ltYm9sKCk7dC4kZ2xvYmFsRGF0YT1QO2NvbnN0IFI9U3ltYm9sKCk7dC4kaGFzU2V0dGFibGVWYWx1ZT1SO2NvbnN0IE49U3ltYm9sKCk7dC4kaWRzPU47Y29uc3QgRD1TeW1ib2woKTt0LiRpbmRleE9mPUQ7Y29uc3QgQj1TeW1ib2woKTt0LiRpbnNlcnRBdD1CO2NvbnN0IEw9U3ltYm9sKCk7dC4kaXNDREFUQVhtbD1MO2NvbnN0IF89U3ltYm9sKCk7dC4kaXNCaW5kYWJsZT1fO2NvbnN0IGo9U3ltYm9sKCk7dC4kaXNEYXRhVmFsdWU9ajtjb25zdCBVPVN5bWJvbCgpO3QuJGlzRGVzY2VuZGVudD1VO2NvbnN0ICQ9U3ltYm9sKCk7dC4kaXNOc0Fnbm9zdGljPSQ7Y29uc3QgWD1TeW1ib2woKTt0LiRpc1NwbGl0dGFibGU9WDtjb25zdCBIPVN5bWJvbCgpO3QuJGlzVGhlcmVNb3JlV2lkdGg9SDtjb25zdCBxPVN5bWJvbCgpO3QuJGlzVHJhbnNwYXJlbnQ9cTtjb25zdCB6PVN5bWJvbCgpO3QuJGlzVXNhYmxlPXo7Y29uc3QgRz1TeW1ib2woKTt0LiRsYXN0QXR0cmlidXRlPUc7Y29uc3QgVz1TeW1ib2woIm5hbWVzcGFjZUlkIik7dC4kbmFtZXNwYWNlSWQ9Vztjb25zdCBWPVN5bWJvbCgibm9kZU5hbWUiKTt0LiRub2RlTmFtZT1WO2NvbnN0IEs9U3ltYm9sKCk7dC4kbnNBdHRyaWJ1dGVzPUs7Y29uc3QgWT1TeW1ib2woKTt0LiRvbkNoaWxkPVk7Y29uc3QgSj1TeW1ib2woKTt0LiRvbkNoaWxkQ2hlY2s9Sjtjb25zdCBaPVN5bWJvbCgpO3QuJG9uVGV4dD1aO2NvbnN0IFE9U3ltYm9sKCk7dC4kcHVzaEdseXBocz1RO2NvbnN0IGVlPVN5bWJvbCgpO3QuJHBvcFBhcmE9ZWU7Y29uc3QgdGU9U3ltYm9sKCk7dC4kcHVzaFBhcmE9dGU7Y29uc3QgcmU9U3ltYm9sKCk7dC4kcmVtb3ZlQ2hpbGQ9cmU7Y29uc3QgbmU9U3ltYm9sKCJyb290Iik7dC4kcm9vdD1uZTtjb25zdCBhZT1TeW1ib2woKTt0LiRyZXNvbHZlUHJvdG90eXBlcz1hZTtjb25zdCBpZT1TeW1ib2woKTt0LiRzZWFyY2hOb2RlPWllO2NvbnN0IHNlPVN5bWJvbCgpO3QuJHNldElkPXNlO2NvbnN0IG9lPVN5bWJvbCgpO3QuJHNldFNldEF0dHJpYnV0ZXM9b2U7Y29uc3QgY2U9U3ltYm9sKCk7dC4kc2V0VmFsdWU9Y2U7Y29uc3QgbGU9U3ltYm9sKCk7dC4kdGFiSW5kZXg9bGU7Y29uc3QgaGU9U3ltYm9sKCk7dC4kdGV4dD1oZTtjb25zdCB1ZT1TeW1ib2woKTt0LiR0b1BhZ2VzPXVlO2NvbnN0IGRlPVN5bWJvbCgpO3QuJHRvSFRNTD1kZTtjb25zdCBmZT1TeW1ib2woKTt0LiR0b1N0cmluZz1mZTtjb25zdCBnZT1TeW1ib2woKTt0LiR0b1N0eWxlPWdlO2NvbnN0IHBlPVN5bWJvbCgidWlkIik7dC4kdWlkPXBlfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQmluZGVyPXZvaWQgMCxyKDEzOSk7dmFyIG49cigyMjgpLGE9cigyMzApLGk9cigyNDEpLHM9cigyNDApLG89cigyMzQpLGM9cigxNDQpO2NvbnN0IGw9by5OYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQ7ZnVuY3Rpb24gaChlKXtjb25zdCB0PW5ldyBhLlRleHQoe30pO3JldHVybiB0W24uJGNvbnRlbnRdPWUsdH10LkJpbmRlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt2YXIgdDt0aGlzLnJvb3Q9ZSx0aGlzLmRhdGFzZXRzPWUuZGF0YXNldHMsdGhpcy5kYXRhPShudWxsPT09KHQ9ZS5kYXRhc2V0cyl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZGF0YSl8fG5ldyBzLlhtbE9iamVjdChvLk5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZCwiZGF0YSIpLHRoaXMuZW1wdHlNZXJnZT0wPT09dGhpcy5kYXRhW24uJGdldENoaWxkcmVuXSgpLmxlbmd0aCx0aGlzLnJvb3QuZm9ybT10aGlzLmZvcm09ZS50ZW1wbGF0ZVtuLiRjbG9uZV0oKX1faXNDb25zdW1lRGF0YSgpe3JldHVybiF0aGlzLmVtcHR5TWVyZ2UmJnRoaXMuX21lcmdlTW9kZX1faXNNYXRjaFRlbXBsYXRlKCl7cmV0dXJuIXRoaXMuX2lzQ29uc3VtZURhdGEoKX1iaW5kKCl7cmV0dXJuIHRoaXMuX2JpbmRFbGVtZW50KHRoaXMuZm9ybSx0aGlzLmRhdGEpLHRoaXMuZm9ybX1nZXREYXRhKCl7cmV0dXJuIHRoaXMuZGF0YX1fYmluZFZhbHVlKGUsdCxyKXt2YXIgaTtpZihlW24uJGRhdGFdPXQsZVtuLiRoYXNTZXR0YWJsZVZhbHVlXSgpKWlmKHRbbi4kaXNEYXRhVmFsdWVdKCkpe2NvbnN0IHI9dFtuLiRnZXREYXRhVmFsdWVdKCk7ZVtuLiRzZXRWYWx1ZV0oaChyKSl9ZWxzZSBpZihlIGluc3RhbmNlb2YgYS5GaWVsZCYmIm11bHRpU2VsZWN0Ij09PShudWxsPT09KGk9ZS51aSl8fHZvaWQgMD09PWl8fG51bGw9PT0oaT1pLmNob2ljZUxpc3QpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLm9wZW4pKXtjb25zdCByPXRbbi4kZ2V0Q2hpbGRyZW5dKCkubWFwKChlPT5lW24uJGNvbnRlbnRdLnRyaW0oKSkpLmpvaW4oIlxuIik7ZVtuLiRzZXRWYWx1ZV0oaChyKSl9ZWxzZSB0aGlzLl9pc0NvbnN1bWVEYXRhKCkmJigwLGMud2FybikoIlhGQSAtIE5vZGVzIGhhdmVuJ3QgdGhlIHNhbWUgdHlwZS4iKTtlbHNlIXRbbi4kaXNEYXRhVmFsdWVdKCl8fHRoaXMuX2lzTWF0Y2hUZW1wbGF0ZSgpP3RoaXMuX2JpbmRFbGVtZW50KGUsdCk6KDAsYy53YXJuKSgiWEZBIC0gTm9kZXMgaGF2ZW4ndCB0aGUgc2FtZSB0eXBlLiIpfV9maW5kRGF0YUJ5TmFtZVRvQ29uc3VtZShlLHQscixhKXt2YXIgaTtpZighZSlyZXR1cm4gbnVsbDtsZXQgcyxjO2ZvcihsZXQgYT0wO2E8MzthKyspe2ZvcihzPXJbbi4kZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGUsITEsITApO2M9cy5uZXh0KCkudmFsdWUsYzspaWYodD09PWNbbi4kaXNEYXRhVmFsdWVdKCkpcmV0dXJuIGM7aWYocltuLiRuYW1lc3BhY2VJZF09PT1vLk5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZCYmImRhdGEiPT09cltuLiRub2RlTmFtZV0pYnJlYWs7cj1yW24uJGdldFBhcmVudF0oKX1yZXR1cm4gYT8ocz10aGlzLmRhdGFbbi4kZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGUsITAsITEpLGM9cy5uZXh0KCkudmFsdWUsY3x8KHM9dGhpcy5kYXRhW24uJGdldEF0dHJpYnV0ZUl0XShlLCEwKSxjPXMubmV4dCgpLnZhbHVlLG51bGwhPT0oaT1jKSYmdm9pZCAwIT09aSYmaVtuLiRpc0RhdGFWYWx1ZV0oKT9jOm51bGwpKTpudWxsfV9zZXRQcm9wZXJ0aWVzKGUsdCl7aWYoZS5oYXNPd25Qcm9wZXJ0eSgic2V0UHJvcGVydHkiKSlmb3IoY29uc3R7cmVmOnIsdGFyZ2V0Om8sY29ubmVjdGlvbjpsfW9mIGUuc2V0UHJvcGVydHkuY2hpbGRyZW4pe2lmKGwpY29udGludWU7aWYoIXIpY29udGludWU7Y29uc3QgaD0oMCxpLnNlYXJjaE5vZGUpKHRoaXMucm9vdCx0LHIsITEsITEpO2lmKCFoKXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHJlZmVyZW5jZTogIi5jb25jYXQociwiLiIpKTtjb250aW51ZX1jb25zdFt1XT1oO2lmKCF1W24uJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhKSl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCBub2RlOiBtdXN0IGJlIGEgZGF0YSBub2RlLiIpO2NvbnRpbnVlfWNvbnN0IGQ9KDAsaS5zZWFyY2hOb2RlKSh0aGlzLnJvb3QsZSxvLCExLCExKTtpZighZCl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCB0YXJnZXQ6ICIuY29uY2F0KG8sIi4iKSk7Y29udGludWV9Y29uc3RbZl09ZDtpZighZltuLiRpc0Rlc2NlbmRlbnRdKGUpKXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHRhcmdldDogbXVzdCBiZSBhIHByb3BlcnR5IG9yIHN1YnByb3BlcnR5LiIpO2NvbnRpbnVlfWNvbnN0IGc9ZltuLiRnZXRQYXJlbnRdKCk7aWYoZiBpbnN0YW5jZW9mIGEuU2V0UHJvcGVydHl8fGcgaW5zdGFuY2VvZiBhLlNldFByb3BlcnR5KXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHRhcmdldDogY2Fubm90IGJlIGEgc2V0UHJvcGVydHkgb3Igb25lIG9mIGl0cyBwcm9wZXJ0aWVzLiIpO2NvbnRpbnVlfWlmKGYgaW5zdGFuY2VvZiBhLkJpbmRJdGVtc3x8ZyBpbnN0YW5jZW9mIGEuQmluZEl0ZW1zKXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHRhcmdldDogY2Fubm90IGJlIGEgYmluZEl0ZW1zIG9yIG9uZSBvZiBpdHMgcHJvcGVydGllcy4iKTtjb250aW51ZX1jb25zdCBwPXVbbi4kdGV4dF0oKSxtPWZbbi4kbm9kZU5hbWVdO2lmKGYgaW5zdGFuY2VvZiBzLlhGQUF0dHJpYnV0ZSl7Y29uc3QgZT1PYmplY3QuY3JlYXRlKG51bGwpO2VbbV09cDtjb25zdCB0PVJlZmxlY3QuY29uc3RydWN0KE9iamVjdC5nZXRQcm90b3R5cGVPZihnKS5jb25zdHJ1Y3RvcixbZV0pO2dbbV09dFttXX1lbHNlIGYuaGFzT3duUHJvcGVydHkobi4kY29udGVudCk/KGZbbi4kZGF0YV09dSxmW24uJGNvbnRlbnRdPXAsZltuLiRmaW5hbGl6ZV0oKSk6KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCBub2RlIHRvIHVzZSBpbiBzZXRQcm9wZXJ0eSIpfX1fYmluZEl0ZW1zKGUsdCl7aWYoIWUuaGFzT3duUHJvcGVydHkoIml0ZW1zIil8fCFlLmhhc093blByb3BlcnR5KCJiaW5kSXRlbXMiKXx8ZS5iaW5kSXRlbXMuaXNFbXB0eSgpKXJldHVybjtmb3IoY29uc3QgdCBvZiBlLml0ZW1zLmNoaWxkcmVuKWVbbi4kcmVtb3ZlQ2hpbGRdKHQpO2UuaXRlbXMuY2xlYXIoKTtjb25zdCByPW5ldyBhLkl0ZW1zKHt9KSxzPW5ldyBhLkl0ZW1zKHt9KTtlW24uJGFwcGVuZENoaWxkXShyKSxlLml0ZW1zLnB1c2gociksZVtuLiRhcHBlbmRDaGlsZF0ocyksZS5pdGVtcy5wdXNoKHMpO2Zvcihjb25zdHtyZWY6YSxsYWJlbFJlZjpvLHZhbHVlUmVmOmwsY29ubmVjdGlvbjp1fW9mIGUuYmluZEl0ZW1zLmNoaWxkcmVuKXtpZih1KWNvbnRpbnVlO2lmKCFhKWNvbnRpbnVlO2NvbnN0IGU9KDAsaS5zZWFyY2hOb2RlKSh0aGlzLnJvb3QsdCxhLCExLCExKTtpZihlKWZvcihjb25zdCB0IG9mIGUpe2lmKCF0W24uJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpeygwLGMud2FybikoIlhGQSAtIEludmFsaWQgcmVmICgiLmNvbmNhdChhLCIpOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuIikpO2NvbnRpbnVlfWNvbnN0IGU9KDAsaS5zZWFyY2hOb2RlKSh0aGlzLnJvb3QsdCxvLCEwLCExKTtpZighZSl7KDAsYy53YXJuKSgiWEZBIC0gSW52YWxpZCBsYWJlbDogIi5jb25jYXQobywiLiIpKTtjb250aW51ZX1jb25zdFt1XT1lO2lmKCF1W24uJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpeygwLGMud2FybikoIlhGQSAtIEludmFsaWQgbGFiZWw6IG11c3QgYmUgYSBkYXRhc2V0cyBjaGlsZC4iKTtjb250aW51ZX1jb25zdCBkPSgwLGkuc2VhcmNoTm9kZSkodGhpcy5yb290LHQsbCwhMCwhMSk7aWYoIWQpeygwLGMud2FybikoIlhGQSAtIEludmFsaWQgdmFsdWU6ICIuY29uY2F0KGwsIi4iKSk7Y29udGludWV9Y29uc3RbZl09ZDtpZighZltuLiRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKXsoMCxjLndhcm4pKCJYRkEgLSBJbnZhbGlkIHZhbHVlOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuIik7Y29udGludWV9Y29uc3QgZz1oKHVbbi4kdGV4dF0oKSkscD1oKGZbbi4kdGV4dF0oKSk7cltuLiRhcHBlbmRDaGlsZF0oZyksci50ZXh0LnB1c2goZyksc1tuLiRhcHBlbmRDaGlsZF0ocCkscy50ZXh0LnB1c2gocCl9ZWxzZSgwLGMud2FybikoIlhGQSAtIEludmFsaWQgcmVmZXJlbmNlOiAiLmNvbmNhdChhLCIuIikpfX1fYmluZE9jY3VycmVuY2VzKGUsdCxyKXtsZXQgYTtpZih0Lmxlbmd0aD4xJiYoYT1lW24uJGNsb25lXSgpLGFbbi4kcmVtb3ZlQ2hpbGRdKGEub2NjdXIpLGEub2NjdXI9bnVsbCksdGhpcy5fYmluZFZhbHVlKGUsdFswXSxyKSx0aGlzLl9zZXRQcm9wZXJ0aWVzKGUsdFswXSksdGhpcy5fYmluZEl0ZW1zKGUsdFswXSksMT09PXQubGVuZ3RoKXJldHVybjtjb25zdCBpPWVbbi4kZ2V0UGFyZW50XSgpLHM9ZVtuLiRub2RlTmFtZV0sbz1pW24uJGluZGV4T2ZdKGUpO2ZvcihsZXQgZT0xLGM9dC5sZW5ndGg7ZTxjO2UrKyl7Y29uc3QgYz10W2VdLGw9YVtuLiRjbG9uZV0oKTtpW3NdLnB1c2gobCksaVtuLiRpbnNlcnRBdF0obytlLGwpLHRoaXMuX2JpbmRWYWx1ZShsLGMsciksdGhpcy5fc2V0UHJvcGVydGllcyhsLGMpLHRoaXMuX2JpbmRJdGVtcyhsLGMpfX1fY3JlYXRlT2NjdXJyZW5jZXMoZSl7aWYoIXRoaXMuZW1wdHlNZXJnZSlyZXR1cm47Y29uc3R7b2NjdXI6dH09ZTtpZighdHx8dC5pbml0aWFsPD0xKXJldHVybjtjb25zdCByPWVbbi4kZ2V0UGFyZW50XSgpLGE9ZVtuLiRub2RlTmFtZV07aWYoIShyW2FdaW5zdGFuY2VvZiBzLlhGQU9iamVjdEFycmF5KSlyZXR1cm47bGV0IGk7aT1lLm5hbWU/clthXS5jaGlsZHJlbi5maWx0ZXIoKHQ9PnQubmFtZT09PWUubmFtZSkpLmxlbmd0aDpyW2FdLmNoaWxkcmVuLmxlbmd0aDtjb25zdCBvPXJbbi4kaW5kZXhPZl0oZSkrMSxjPXQuaW5pdGlhbC1pO2lmKGMpe2NvbnN0IHQ9ZVtuLiRjbG9uZV0oKTt0W24uJHJlbW92ZUNoaWxkXSh0Lm9jY3VyKSx0Lm9jY3VyPW51bGwsclthXS5wdXNoKHQpLHJbbi4kaW5zZXJ0QXRdKG8sdCk7Zm9yKGxldCBlPTE7ZTxjO2UrKyl7Y29uc3QgaT10W24uJGNsb25lXSgpO3JbYV0ucHVzaChpKSxyW24uJGluc2VydEF0XShvK2UsaSl9fX1fZ2V0T2NjdXJJbmZvKGUpe2NvbnN0e25hbWU6dCxvY2N1cjpyfT1lO2lmKCFyfHwhdClyZXR1cm5bMSwxXTtjb25zdCBuPS0xPT09ci5tYXg/MS8wOnIubWF4O3JldHVybltyLm1pbixuXX1fc2V0QW5kQmluZChlLHQpe3RoaXMuX3NldFByb3BlcnRpZXMoZSx0KSx0aGlzLl9iaW5kSXRlbXMoZSx0KSx0aGlzLl9iaW5kRWxlbWVudChlLHQpfV9iaW5kRWxlbWVudChlLHQpe2NvbnN0IHI9W107dGhpcy5fY3JlYXRlT2NjdXJyZW5jZXMoZSk7Zm9yKGNvbnN0IGEgb2YgZVtuLiRnZXRDaGlsZHJlbl0oKSl7aWYoYVtuLiRkYXRhXSljb250aW51ZTtpZih2b2lkIDA9PT10aGlzLl9tZXJnZU1vZGUmJiJzdWJmb3JtIj09PWFbbi4kbm9kZU5hbWVdKXt0aGlzLl9tZXJnZU1vZGU9ImNvbnN1bWVEYXRhIj09PWEubWVyZ2VNb2RlO2NvbnN0IGU9dFtuLiRnZXRDaGlsZHJlbl0oKTtpZihlLmxlbmd0aD4wKXRoaXMuX2JpbmRPY2N1cnJlbmNlcyhhLFtlWzBdXSxudWxsKTtlbHNlIGlmKHRoaXMuZW1wdHlNZXJnZSl7Y29uc3QgZT10W24uJG5hbWVzcGFjZUlkXT09PWw/LTE6dFtuLiRuYW1lc3BhY2VJZF0scj1hW24uJGRhdGFdPW5ldyBzLlhtbE9iamVjdChlLGEubmFtZXx8InJvb3QiKTt0W24uJGFwcGVuZENoaWxkXShyKSx0aGlzLl9iaW5kRWxlbWVudChhLHIpfWNvbnRpbnVlfWlmKCFhW24uJGlzQmluZGFibGVdKCkpY29udGludWU7bGV0IGU9ITEsbz1udWxsLGg9bnVsbCx1PW51bGw7aWYoYS5iaW5kKXtzd2l0Y2goYS5iaW5kLm1hdGNoKXtjYXNlIm5vbmUiOnRoaXMuX3NldEFuZEJpbmQoYSx0KTtjb250aW51ZTtjYXNlImdsb2JhbCI6ZT0hMDticmVhaztjYXNlImRhdGFSZWYiOmlmKCFhLmJpbmQucmVmKXsoMCxjLndhcm4pKCJYRkEgLSByZWYgaXMgZW1wdHkgaW4gbm9kZSAiLmNvbmNhdChhW24uJG5vZGVOYW1lXSwiLiIpKSx0aGlzLl9zZXRBbmRCaW5kKGEsdCk7Y29udGludWV9aD1hLmJpbmQucmVmfWEuYmluZC5waWN0dXJlJiYobz1hLmJpbmQucGljdHVyZVtuLiRjb250ZW50XSl9Y29uc3RbZCxmXT10aGlzLl9nZXRPY2N1ckluZm8oYSk7aWYoaCl7aWYodT0oMCxpLnNlYXJjaE5vZGUpKHRoaXMucm9vdCx0LGgsITAsITEpLG51bGw9PT11KXtpZih1PSgwLGkuY3JlYXRlRGF0YU5vZGUpKHRoaXMuZGF0YSx0LGgpLCF1KWNvbnRpbnVlO3RoaXMuX2lzQ29uc3VtZURhdGEoKSYmKHVbbi4kY29uc3VtZWRdPSEwKSx0aGlzLl9zZXRBbmRCaW5kKGEsdSk7Y29udGludWV9dGhpcy5faXNDb25zdW1lRGF0YSgpJiYodT11LmZpbHRlcigoZT0+IWVbbi4kY29uc3VtZWRdKSkpLHUubGVuZ3RoPmY/dT11LnNsaWNlKDAsZik6MD09PXUubGVuZ3RoJiYodT1udWxsKSx1JiZ0aGlzLl9pc0NvbnN1bWVEYXRhKCkmJnUuZm9yRWFjaCgoZT0+e2Vbbi4kY29uc3VtZWRdPSEwfSkpfWVsc2V7aWYoIWEubmFtZSl7dGhpcy5fc2V0QW5kQmluZChhLHQpO2NvbnRpbnVlfWlmKHRoaXMuX2lzQ29uc3VtZURhdGEoKSl7Y29uc3Qgcj1bXTtmb3IoO3IubGVuZ3RoPGY7KXtjb25zdCBpPXRoaXMuX2ZpbmREYXRhQnlOYW1lVG9Db25zdW1lKGEubmFtZSxhW24uJGhhc1NldHRhYmxlVmFsdWVdKCksdCxlKTtpZighaSlicmVhaztpW24uJGNvbnN1bWVkXT0hMCxyLnB1c2goaSl9dT1yLmxlbmd0aD4wP3I6bnVsbH1lbHNle2lmKHU9dFtuLiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0oYS5uYW1lLCExLHRoaXMuZW1wdHlNZXJnZSkubmV4dCgpLnZhbHVlLCF1KXtpZigwPT09ZCl7ci5wdXNoKGEpO2NvbnRpbnVlfWNvbnN0IGU9dFtuLiRuYW1lc3BhY2VJZF09PT1sPy0xOnRbbi4kbmFtZXNwYWNlSWRdO3U9YVtuLiRkYXRhXT1uZXcgcy5YbWxPYmplY3QoZSxhLm5hbWUpLHRoaXMuZW1wdHlNZXJnZSYmKHVbbi4kY29uc3VtZWRdPSEwKSx0W24uJGFwcGVuZENoaWxkXSh1KSx0aGlzLl9zZXRBbmRCaW5kKGEsdSk7Y29udGludWV9dGhpcy5lbXB0eU1lcmdlJiYodVtuLiRjb25zdW1lZF09ITApLHU9W3VdfX11P3RoaXMuX2JpbmRPY2N1cnJlbmNlcyhhLHUsbyk6ZD4wP3RoaXMuX3NldEFuZEJpbmQoYSx0KTpyLnB1c2goYSl9ci5mb3JFYWNoKChlPT5lW24uJGdldFBhcmVudF0oKVtuLiRyZW1vdmVDaGlsZF0oZSkpKX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuVmFsdWU9dC5UZXh0PXQuVGVtcGxhdGVOYW1lc3BhY2U9dC5UZW1wbGF0ZT10LlNldFByb3BlcnR5PXQuSXRlbXM9dC5GaWVsZD10LkJpbmRJdGVtcz12b2lkIDAscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoMTM5KSxyKDIzMSkscigxNDUpLHIoMTQ3KSxyKDE0OCk7dmFyIG49cigyMjgpLGE9cigyMzQpLGk9cigyMzUpLHM9cigyMzYpLG89cigyNDApLGM9cigyMzcpLGw9cigxNDQpLGg9cigyMzgpLHU9cigxNDkpLGQ9cigyNDEpO2NvbnN0IGY9YS5OYW1lc3BhY2VJZHMudGVtcGxhdGUuaWQsZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHA9L15IKFxkKykkLyxtPW5ldyBTZXQoWyJpbWFnZS9naWYiLCJpbWFnZS9qcGVnIiwiaW1hZ2UvanBnIiwiaW1hZ2UvcGpwZWciLCJpbWFnZS9wbmciLCJpbWFnZS9hcG5nIiwiaW1hZ2UveC1wbmciLCJpbWFnZS9ibXAiLCJpbWFnZS94LW1zLWJtcCIsImltYWdlL3RpZmYiLCJpbWFnZS90aWYiLCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iXSksYj1bW1s2Niw3N10sImltYWdlL2JtcCJdLFtbMjU1LDIxNiwyNTVdLCJpbWFnZS9qcGVnIl0sW1s3Myw3Myw0MiwwXSwiaW1hZ2UvdGlmZiJdLFtbNzcsNzcsMCw0Ml0sImltYWdlL3RpZmYiXSxbWzcxLDczLDcwLDU2LDU3LDk3XSwiaW1hZ2UvZ2lmIl0sW1sxMzcsODAsNzgsNzEsMTMsMTAsMjYsMTBdLCJpbWFnZS9wbmciXV07ZnVuY3Rpb24geShlKXtpZighZXx8IWUuYm9yZGVyKXJldHVybnt3OjAsaDowfTtjb25zdCB0PWUuYm9yZGVyW24uJGdldEV4dHJhXSgpO3JldHVybiB0P3t3OnQud2lkdGhzWzBdK3Qud2lkdGhzWzJdK3QuaW5zZXRzWzBdK3QuaW5zZXRzWzJdLGg6dC53aWR0aHNbMV0rdC53aWR0aHNbM10rdC5pbnNldHNbMV0rdC5pbnNldHNbM119Ont3OjAsaDowfX1mdW5jdGlvbiB3KGUpe3JldHVybiBlLm1hcmdpbiYmKGUubWFyZ2luLnRvcEluc2V0fHxlLm1hcmdpbi5yaWdodEluc2V0fHxlLm1hcmdpbi5ib3R0b21JbnNldHx8ZS5tYXJnaW4ubGVmdEluc2V0KX1mdW5jdGlvbiB2KGUsdCl7aWYoIWUudmFsdWUpe2NvbnN0IHQ9bmV3IE50KHt9KTtlW24uJGFwcGVuZENoaWxkXSh0KSxlLnZhbHVlPXR9ZS52YWx1ZVtuLiRzZXRWYWx1ZV0odCl9ZnVuY3Rpb24qeChlKXtmb3IoY29uc3QgdCBvZiBlW24uJGdldENoaWxkcmVuXSgpKXQgaW5zdGFuY2VvZiB2dD95aWVsZCp0W24uJGdldENvbnRhaW5lZENoaWxkcmVuXSgpOnlpZWxkIHR9ZnVuY3Rpb24gUyhlKXt2YXIgdDtyZXR1cm4iZXJyb3IiPT09KG51bGw9PT0odD1lLnZhbGlkYXRlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5udWxsVGVzdCl9ZnVuY3Rpb24gQShlKXtmb3IoO2U7KXtpZighZS50cmF2ZXJzYWwpcmV0dXJuIHZvaWQoZVtuLiR0YWJJbmRleF09ZVtuLiRnZXRQYXJlbnRdKClbbi4kdGFiSW5kZXhdKTtpZihlW24uJHRhYkluZGV4XSlyZXR1cm47bGV0IHQ9bnVsbDtmb3IoY29uc3QgciBvZiBlLnRyYXZlcnNhbFtuLiRnZXRDaGlsZHJlbl0oKSlpZigibmV4dCI9PT1yLm9wZXJhdGlvbil7dD1yO2JyZWFrfWlmKCF0fHwhdC5yZWYpcmV0dXJuIHZvaWQoZVtuLiR0YWJJbmRleF09ZVtuLiRnZXRQYXJlbnRdKClbbi4kdGFiSW5kZXhdKTtjb25zdCByPWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpO2Vbbi4kdGFiSW5kZXhdPSsrcltuLiR0YWJJbmRleF07Y29uc3QgYT1yW24uJHNlYXJjaE5vZGVdKHQucmVmLGUpO2lmKCFhKXJldHVybjtlPWFbMF19fWZ1bmN0aW9uIGsoZSx0KXtjb25zdCByPWUuYXNzaXN0O2lmKHIpe2NvbnN0IGU9cltuLiR0b0hUTUxdKCk7ZSYmKHQudGl0bGU9ZSk7Y29uc3QgYT1yLnJvbGUubWF0Y2gocCk7aWYoYSl7Y29uc3QgZT0iaGVhZGluZyIscj1hWzFdO3Qucm9sZT1lLHRbImFyaWEtbGV2ZWwiXT1yfX1pZigidGFibGUiPT09ZS5sYXlvdXQpdC5yb2xlPSJ0YWJsZSI7ZWxzZSBpZigicm93Ij09PWUubGF5b3V0KXQucm9sZT0icm93IjtlbHNle3ZhciBhO2NvbnN0IHI9ZVtuLiRnZXRQYXJlbnRdKCk7InJvdyI9PT1yLmxheW91dCYmKHQucm9sZT0iVEgiPT09KG51bGw9PT0oYT1yLmFzc2lzdCl8fHZvaWQgMD09PWE/dm9pZCAwOmEucm9sZSk/ImNvbHVtbmhlYWRlciI6ImNlbGwiKX19ZnVuY3Rpb24gQyhlKXtpZighZS5hc3Npc3QpcmV0dXJuIG51bGw7Y29uc3QgdD1lLmFzc2lzdDtyZXR1cm4gdC5zcGVhayYmIiIhPT10LnNwZWFrW24uJGNvbnRlbnRdP3Quc3BlYWtbbi4kY29udGVudF06dC50b29sVGlwP3QudG9vbFRpcFtuLiRjb250ZW50XTpudWxsfWZ1bmN0aW9uIE8oZSl7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhUmljaCJdLHN0eWxlOk9iamVjdC5jcmVhdGUobnVsbCl9LGNoaWxkcmVuOlt7bmFtZToic3BhbiIsYXR0cmlidXRlczp7c3R5bGU6T2JqZWN0LmNyZWF0ZShudWxsKX0sdmFsdWU6ZX1dfSl9ZnVuY3Rpb24gRihlKXtjb25zdCB0PWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpO251bGw9PT10W24uJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSYmKHRbbi4kZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlPWUsdFtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlPSEwKX1mdW5jdGlvbiBJKGUpe2NvbnN0IHQ9ZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKCk7dFtuLiRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGU9PT1lJiYodFtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlPSExKX1mdW5jdGlvbiBUKGUpe2lmKGVbbi4kZXh0cmFdKXJldHVybiExO2lmKGVbbi4kZXh0cmFdPU9iamVjdC5jcmVhdGUobnVsbCksImF1dG8iPT09ZS50YXJnZXRUeXBlKXJldHVybiExO2NvbnN0IHQ9ZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKCk7bGV0IHI9bnVsbDtpZihlLnRhcmdldCl7aWYocj10W24uJHNlYXJjaE5vZGVdKGUudGFyZ2V0LGVbbi4kZ2V0UGFyZW50XSgpKSwhcilyZXR1cm4hMTtyPXJbMF19Y29uc3R7Y3VycmVudFBhZ2VBcmVhOmEsY3VycmVudENvbnRlbnRBcmVhOml9PXRbbi4kZXh0cmFdO2lmKCJwYWdlQXJlYSI9PT1lLnRhcmdldFR5cGUpcmV0dXJuIHIgaW5zdGFuY2VvZiBRZXx8KHI9bnVsbCksZS5zdGFydE5ldz8oZVtuLiRleHRyYV0udGFyZ2V0PXJ8fGEsITApOiEoIXJ8fHI9PT1hfHwoZVtuLiRleHRyYV0udGFyZ2V0PXIsMCkpO3IgaW5zdGFuY2VvZiBlZXx8KHI9bnVsbCk7Y29uc3Qgcz1yJiZyW24uJGdldFBhcmVudF0oKTtsZXQgbyxjPXM7aWYoZS5zdGFydE5ldylpZihyKXtjb25zdCBlPXMuY29udGVudEFyZWEuY2hpbGRyZW4sdD1lLmluZGV4T2YoaSksbj1lLmluZGV4T2Yocik7LTEhPT10JiZ0PG4mJihjPW51bGwpLG89bi0xfWVsc2Ugbz1hLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YoaSk7ZWxzZXtpZighcnx8cj09PWkpcmV0dXJuITE7bz1zLmNvbnRlbnRBcmVhLmNoaWxkcmVuLmluZGV4T2YociktMSxjPXM9PT1hP251bGw6c31yZXR1cm4gZVtuLiRleHRyYV0udGFyZ2V0PWMsZVtuLiRleHRyYV0uaW5kZXg9bywhMH1mdW5jdGlvbiBNKGUsdCxyKXtjb25zdCBhPWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpLGk9YVtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlLHM9dFtuLiRnZXRTdWJmb3JtUGFyZW50XTt0W24uJGdldFN1YmZvcm1QYXJlbnRdPSgpPT5lLGFbbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT0hMDtjb25zdCBvPXRbbi4kdG9IVE1MXShyKTtlW24uJGFkZEhUTUxdKG8uaHRtbCxvLmJib3gpLGFbbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT1pLHRbbi4kZ2V0U3ViZm9ybVBhcmVudF09c31jbGFzcyBFIGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYXBwZWFyYW5jZUZpbHRlciIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgUCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImFyYyIsITApLHRoaXMuY2lyY3VsYXI9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmNpcmN1bGFyLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy5oYW5kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhhbmQsWyJldmVuIiwibGVmdCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5zdGFydEFuZ2xlPSgwLGMuZ2V0RmxvYXQpKHtkYXRhOmUuc3RhcnRBbmdsZSxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4hMH0pLHRoaXMuc3dlZXBBbmdsZT0oMCxjLmdldEZsb2F0KSh7ZGF0YTplLnN3ZWVwQW5nbGUsZGVmYXVsdFZhbHVlOjM2MCx2YWxpZGF0ZTplPT4hMH0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmVkZ2U9bnVsbCx0aGlzLmZpbGw9bnVsbH1bbi4kdG9IVE1MXSgpe3ZhciBlO2NvbnN0IHQ9dGhpcy5lZGdlfHxuZXcgdWUoe30pLHI9dFtuLiR0b1N0eWxlXSgpLGE9T2JqZWN0LmNyZWF0ZShudWxsKTtsZXQgaTsidmlzaWJsZSI9PT0obnVsbD09PShlPXRoaXMuZmlsbCl8fHZvaWQgMD09PWU/dm9pZCAwOmUucHJlc2VuY2UpP09iamVjdC5hc3NpZ24oYSx0aGlzLmZpbGxbbi4kdG9TdHlsZV0oKSk6YS5maWxsPSJ0cmFuc3BhcmVudCIsYS5zdHJva2VXaWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykoInZpc2libGUiPT09dC5wcmVzZW5jZT90LnRoaWNrbmVzczowKSxhLnN0cm9rZT1yLmNvbG9yO2NvbnN0IG89e3htbG5zOmcsc3R5bGU6e3dpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLG92ZXJmbG93OiJ2aXNpYmxlIn19O2lmKDM2MD09PXRoaXMuc3dlZXBBbmdsZSlpPXtuYW1lOiJlbGxpcHNlIixhdHRyaWJ1dGVzOnt4bWxuczpnLGN4OiI1MCUiLGN5OiI1MCUiLHJ4OiI1MCUiLHJ5OiI1MCUiLHN0eWxlOmF9fTtlbHNle2NvbnN0IGU9dGhpcy5zdGFydEFuZ2xlKk1hdGguUEkvMTgwLHQ9dGhpcy5zd2VlcEFuZ2xlKk1hdGguUEkvMTgwLHI9dGhpcy5zd2VlcEFuZ2xlPjE4MD8xOjAsW24scyxjLGxdPVs1MCooMStNYXRoLmNvcyhlKSksNTAqKDEtTWF0aC5zaW4oZSkpLDUwKigxK01hdGguY29zKGUrdCkpLDUwKigxLU1hdGguc2luKGUrdCkpXTtpPXtuYW1lOiJwYXRoIixhdHRyaWJ1dGVzOnt4bWxuczpnLGQ6Ik0gIi5jb25jYXQobiwiICIpLmNvbmNhdChzLCIgQSA1MCA1MCAwICIpLmNvbmNhdChyLCIgMCAiKS5jb25jYXQoYywiICIpLmNvbmNhdChsKSx2ZWN0b3JFZmZlY3Q6Im5vbi1zY2FsaW5nLXN0cm9rZSIsc3R5bGU6YX19LE9iamVjdC5hc3NpZ24obyx7dmlld0JveDoiMCAwIDEwMCAxMDAiLHByZXNlcnZlQXNwZWN0UmF0aW86Im5vbmUifSl9Y29uc3QgbD17bmFtZToic3ZnIixjaGlsZHJlbjpbaV0sYXR0cmlidXRlczpvfTtyZXR1cm4gdyh0aGlzW24uJGdldFBhcmVudF0oKVtuLiRnZXRQYXJlbnRdKCkpP2MuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e3N0eWxlOntkaXNwbGF5OiJpbmxpbmUiLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUifX0sY2hpbGRyZW46W2xdfSk6KGwuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuSFRNTFJlc3VsdC5zdWNjZXNzKGwpKX19Y2xhc3MgUiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImFyZWEiLCEwKSx0aGlzLmNvbFNwYW49KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmNvbFNwYW4sZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+ZT49MXx8LTE9PT1lfSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLng9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS54LCIwcHQiKSx0aGlzLnk9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS55LCIwcHQiKSx0aGlzLmRlc2M9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMuYXJlYT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRyYXc9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5leE9iamVjdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4Y2xHcm91cD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZpZWxkPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc3ViZm9ybT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmZvcm1TZXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXl9KltuLiRnZXRDb250YWluZWRDaGlsZHJlbl0oKXt5aWVsZCp4KHRoaXMpfVtuLiRpc1RyYW5zcGFyZW50XSgpe3JldHVybiEwfVtuLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfVtuLiRhZGRIVE1MXShlLHQpe2NvbnN0W3IsYSxpLHNdPXQ7dGhpc1tuLiRleHRyYV0ud2lkdGg9TWF0aC5tYXgodGhpc1tuLiRleHRyYV0ud2lkdGgscitpKSx0aGlzW24uJGV4dHJhXS5oZWlnaHQ9TWF0aC5tYXgodGhpc1tuLiRleHRyYV0uaGVpZ2h0LGErcyksdGhpc1tuLiRleHRyYV0uY2hpbGRyZW4ucHVzaChlKX1bbi4kZ2V0QXZhaWxhYmxlU3BhY2VdKCl7cmV0dXJuIHRoaXNbbi4kZXh0cmFdLmF2YWlsYWJsZVNwYWNlfVtuLiR0b0hUTUxdKGUpe2NvbnN0IHQ9KDAscy50b1N0eWxlKSh0aGlzLCJwb3NpdGlvbiIpLHI9e3N0eWxlOnQsaWQ6dGhpc1tuLiR1aWRdLGNsYXNzOlsieGZhQXJlYSJdfTsoMCxzLmlzUHJpbnRPbmx5KSh0aGlzKSYmci5jbGFzcy5wdXNoKCJ4ZmFQcmludE9ubHkiKSx0aGlzLm5hbWUmJihyLnhmYU5hbWU9dGhpcy5uYW1lKTtjb25zdCBhPVtdO3RoaXNbbi4kZXh0cmFdPXtjaGlsZHJlbjphLHdpZHRoOjAsaGVpZ2h0OjAsYXZhaWxhYmxlU3BhY2U6ZX07Y29uc3QgaT10aGlzW24uJGNoaWxkcmVuVG9IVE1MXSh7ZmlsdGVyOm5ldyBTZXQoWyJhcmVhIiwiZHJhdyIsImZpZWxkIiwiZXhjbEdyb3VwIiwic3ViZm9ybSIsInN1YmZvcm1TZXQiXSksaW5jbHVkZTohMH0pO2lmKCFpLnN1Y2Nlc3MpcmV0dXJuIGkuaXNCcmVhaygpP2k6KGRlbGV0ZSB0aGlzW24uJGV4dHJhXSxjLkhUTUxSZXN1bHQuRkFJTFVSRSk7dC53aWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpc1tuLiRleHRyYV0ud2lkdGgpLHQuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzW24uJGV4dHJhXS5oZWlnaHQpO2NvbnN0IG89e25hbWU6ImRpdiIsYXR0cmlidXRlczpyLGNoaWxkcmVuOmF9LGw9W3RoaXMueCx0aGlzLnksdGhpc1tuLiRleHRyYV0ud2lkdGgsdGhpc1tuLiRleHRyYV0uaGVpZ2h0XTtyZXR1cm4gZGVsZXRlIHRoaXNbbi4kZXh0cmFdLGMuSFRNTFJlc3VsdC5zdWNjZXNzKG8sbCl9fWNsYXNzIE4gZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJhc3Npc3QiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucm9sZT1lLnJvbGV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnNwZWFrPW51bGwsdGhpcy50b29sVGlwPW51bGx9W24uJHRvSFRNTF0oKXt2YXIgZTtyZXR1cm4obnVsbD09PShlPXRoaXMudG9vbFRpcCl8fHZvaWQgMD09PWU/dm9pZCAwOmVbbi4kY29udGVudF0pfHxudWxsfX1jbGFzcyBEIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYmFyY29kZSIsITApLHRoaXMuY2hhckVuY29kaW5nPSgwLGMuZ2V0S2V5d29yZCkoe2RhdGE6ZS5jaGFyRW5jb2Rpbmc/ZS5jaGFyRW5jb2RpbmcudG9Mb3dlckNhc2UoKToiIixkZWZhdWx0VmFsdWU6IiIsdmFsaWRhdGU6ZT0+WyJ1dGYtOCIsImJpZy1maXZlIiwiZm9udHNwZWNpZmljIiwiZ2JrIiwiZ2ItMTgwMzAiLCJnYi0yMzEyIiwia3NjLTU2MDEiLCJub25lIiwic2hpZnQtamlzIiwidWNzLTIiLCJ1dGYtMTYiXS5pbmNsdWRlcyhlKXx8ZS5tYXRjaCgvaXNvLTg4NTktXGR7Mn0vKX0pLHRoaXMuY2hlY2tzdW09KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY2hlY2tzdW0sWyJub25lIiwiMW1vZDEwIiwiMW1vZDEwXzFtb2QxMSIsIjJtb2QxMCIsImF1dG8iXSksdGhpcy5kYXRhQ29sdW1uQ291bnQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmRhdGFDb2x1bW5Db3VudCxkZWZhdWx0VmFsdWU6LTEsdmFsaWRhdGU6ZT0+ZT49MH0pLHRoaXMuZGF0YUxlbmd0aD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZGF0YUxlbmd0aCxkZWZhdWx0VmFsdWU6LTEsdmFsaWRhdGU6ZT0+ZT49MH0pLHRoaXMuZGF0YVByZXA9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuZGF0YVByZXAsWyJub25lIiwiZmxhdGVDb21wcmVzcyJdKSx0aGlzLmRhdGFSb3dDb3VudD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZGF0YVJvd0NvdW50LGRlZmF1bHRWYWx1ZTotMSx2YWxpZGF0ZTplPT5lPj0wfSksdGhpcy5lbmRDaGFyPWUuZW5kQ2hhcnx8IiIsdGhpcy5lcnJvckNvcnJlY3Rpb25MZXZlbD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZXJyb3JDb3JyZWN0aW9uTGV2ZWwsZGVmYXVsdFZhbHVlOi0xLHZhbGlkYXRlOmU9PmU+PTAmJmU8PTh9KSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubW9kdWxlSGVpZ2h0PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubW9kdWxlSGVpZ2h0LCI1bW0iKSx0aGlzLm1vZHVsZVdpZHRoPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubW9kdWxlV2lkdGgsIjAuMjVtbSIpLHRoaXMucHJpbnRDaGVja0RpZ2l0PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5wcmludENoZWNrRGlnaXQsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLnJvd0NvbHVtblJhdGlvPSgwLGMuZ2V0UmF0aW8pKGUucm93Q29sdW1uUmF0aW8pLHRoaXMuc3RhcnRDaGFyPWUuc3RhcnRDaGFyfHwiIix0aGlzLnRleHRMb2NhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50ZXh0TG9jYXRpb24sWyJiZWxvdyIsImFib3ZlIiwiYWJvdmVFbWJlZGRlZCIsImJlbG93RW1iZWRkZWQiLCJub25lIl0pLHRoaXMudHJ1bmNhdGU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnRydW5jYXRlLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGU/ZS50eXBlLnRvTG93ZXJDYXNlKCk6IiIsWyJhenRlYyIsImNvZGFiYXIiLCJjb2RlMm9mNWluZHVzdHJpYWwiLCJjb2RlMm9mNWludGVybGVhdmVkIiwiY29kZTJvZjVtYXRyaXgiLCJjb2RlMm9mNXN0YW5kYXJkIiwiY29kZTNvZjkiLCJjb2RlM29mOWV4dGVuZGVkIiwiY29kZTExIiwiY29kZTQ5IiwiY29kZTkzIiwiY29kZTEyOCIsImNvZGUxMjhhIiwiY29kZTEyOGIiLCJjb2RlMTI4YyIsImNvZGUxMjhzc2NjIiwiZGF0YW1hdHJpeCIsImVhbjgiLCJlYW44YWRkMiIsImVhbjhhZGQ1IiwiZWFuMTMiLCJlYW4xM2FkZDIiLCJlYW4xM2FkZDUiLCJlYW4xM3B3Y2QiLCJmaW0iLCJsb2dtYXJzIiwibWF4aWNvZGUiLCJtc2kiLCJwZGY0MTciLCJwZGY0MTdtYWNybyIsInBsZXNzZXkiLCJwb3N0YXVzY3VzdDIiLCJwb3N0YXVzY3VzdDMiLCJwb3N0YXVzcmVwbHlwYWlkIiwicG9zdGF1c3N0YW5kYXJkIiwicG9zdHVrcm00c2NjIiwicG9zdHVzZHBiYyIsInBvc3R1c2ltYiIsInBvc3R1c3N0YW5kYXJkIiwicG9zdHVzNXppcCIsInFyY29kZSIsInJmaWQiLCJyc3MxNCIsInJzczE0ZXhwYW5kZWQiLCJyc3MxNGxpbWl0ZWQiLCJyc3MxNHN0YWNrZWQiLCJyc3MxNHN0YWNrZWRvbW5pIiwicnNzMTR0cnVuY2F0ZWQiLCJ0ZWxlcGVuIiwidWNjMTI4IiwidWNjMTI4cmFuZG9tIiwidWNjMTI4c3NjYyIsInVwY2EiLCJ1cGNhYWRkMiIsInVwY2FhZGQ1IiwidXBjYXB3Y2QiLCJ1cGNlIiwidXBjZWFkZDIiLCJ1cGNlYWRkNSIsInVwY2VhbjIiLCJ1cGNlYW41IiwidXBzbWF4aWNvZGUiXSksdGhpcy51cHNNb2RlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnVwc01vZGUsWyJ1c0NhcnJpZXIiLCJpbnRlcm5hdGlvbmFsQ2FycmllciIsInNlY3VyZVN5bWJvbCIsInN0YW5kYXJkU3ltYm9sIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLndpZGVOYXJyb3dSYXRpbz0oMCxjLmdldFJhdGlvKShlLndpZGVOYXJyb3dSYXRpbyksdGhpcy5lbmNyeXB0PW51bGwsdGhpcy5leHRyYXM9bnVsbH19Y2xhc3MgQiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJpbmQiLCEwKSx0aGlzLm1hdGNoPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm1hdGNoLFsib25jZSIsImRhdGFSZWYiLCJnbG9iYWwiLCJub25lIl0pLHRoaXMucmVmPWUucmVmfHwiIix0aGlzLnBpY3R1cmU9bnVsbH19Y2xhc3MgTCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJpbmRJdGVtcyIpLHRoaXMuY29ubmVjdGlvbj1lLmNvbm5lY3Rpb258fCIiLHRoaXMubGFiZWxSZWY9ZS5sYWJlbFJlZnx8IiIsdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudmFsdWVSZWY9ZS52YWx1ZVJlZnx8IiJ9fXQuQmluZEl0ZW1zPUw7Y2xhc3MgXyBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJvb2tlbmQiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubGVhZGVyPWUubGVhZGVyfHwiIix0aGlzLnRyYWlsZXI9ZS50cmFpbGVyfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIGogZXh0ZW5kcyBvLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJvb2xlYW4iKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bbi4kdG9IVE1MXShlKXtyZXR1cm4gTygxPT09dGhpc1tuLiRjb250ZW50XT8iMSI6IjAiKX19Y2xhc3MgVSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImJvcmRlciIsITApLHRoaXMuYnJlYWs9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYnJlYWssWyJjbG9zZSIsIm9wZW4iXSksdGhpcy5oYW5kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhhbmQsWyJldmVuIiwibGVmdCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKSx0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNvcm5lcj1uZXcgby5YRkFPYmplY3RBcnJheSg0KSx0aGlzLmVkZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXkoNCksdGhpcy5leHRyYXM9bnVsbCx0aGlzLmZpbGw9bnVsbCx0aGlzLm1hcmdpbj1udWxsfVtuLiRnZXRFeHRyYV0oKXtpZighdGhpc1tuLiRleHRyYV0pe2NvbnN0IGU9dGhpcy5lZGdlLmNoaWxkcmVuLnNsaWNlKCk7aWYoZS5sZW5ndGg8NCl7Y29uc3QgdD1lLmF0KC0xKXx8bmV3IHVlKHt9KTtmb3IobGV0IHI9ZS5sZW5ndGg7cjw0O3IrKyllLnB1c2godCl9Y29uc3QgdD1lLm1hcCgoZT0+ZS50aGlja25lc3MpKSxyPVswLDAsMCwwXTt0aGlzLm1hcmdpbiYmKHJbMF09dGhpcy5tYXJnaW4udG9wSW5zZXQsclsxXT10aGlzLm1hcmdpbi5yaWdodEluc2V0LHJbMl09dGhpcy5tYXJnaW4uYm90dG9tSW5zZXQsclszXT10aGlzLm1hcmdpbi5sZWZ0SW5zZXQpLHRoaXNbbi4kZXh0cmFdPXt3aWR0aHM6dCxpbnNldHM6cixlZGdlczplfX1yZXR1cm4gdGhpc1tuLiRleHRyYV19W24uJHRvU3R5bGVdKCl7dmFyIGU7Y29uc3R7ZWRnZXM6dH09dGhpc1tuLiRnZXRFeHRyYV0oKSxyPXQubWFwKChlPT57Y29uc3QgdD1lW24uJHRvU3R5bGVdKCk7cmV0dXJuIHQuY29sb3J8fCh0LmNvbG9yPSIjMDAwMDAwIiksdH0pKSxhPU9iamVjdC5jcmVhdGUobnVsbCk7aWYodGhpcy5tYXJnaW4mJk9iamVjdC5hc3NpZ24oYSx0aGlzLm1hcmdpbltuLiR0b1N0eWxlXSgpKSwidmlzaWJsZSI9PT0obnVsbD09PShlPXRoaXMuZmlsbCl8fHZvaWQgMD09PWU/dm9pZCAwOmUucHJlc2VuY2UpJiZPYmplY3QuYXNzaWduKGEsdGhpcy5maWxsW24uJHRvU3R5bGVdKCkpLHRoaXMuY29ybmVyLmNoaWxkcmVuLnNvbWUoKGU9PjAhPT1lLnJhZGl1cykpKXtjb25zdCBlPXRoaXMuY29ybmVyLmNoaWxkcmVuLm1hcCgoZT0+ZVtuLiR0b1N0eWxlXSgpKSk7aWYoMj09PWUubGVuZ3RofHwzPT09ZS5sZW5ndGgpe2NvbnN0IHQ9ZS5hdCgtMSk7Zm9yKGxldCByPWUubGVuZ3RoO3I8NDtyKyspZS5wdXNoKHQpfWEuYm9yZGVyUmFkaXVzPWUubWFwKChlPT5lLnJhZGl1cykpLmpvaW4oIiAiKX1zd2l0Y2godGhpcy5wcmVzZW5jZSl7Y2FzZSJpbnZpc2libGUiOmNhc2UiaGlkZGVuIjphLmJvcmRlclN0eWxlPSIiO2JyZWFrO2Nhc2UiaW5hY3RpdmUiOmEuYm9yZGVyU3R5bGU9Im5vbmUiO2JyZWFrO2RlZmF1bHQ6YS5ib3JkZXJTdHlsZT1yLm1hcCgoZT0+ZS5zdHlsZSkpLmpvaW4oIiAiKX1yZXR1cm4gYS5ib3JkZXJXaWR0aD1yLm1hcCgoZT0+ZS53aWR0aCkpLmpvaW4oIiAiKSxhLmJvcmRlckNvbG9yPXIubWFwKChlPT5lLmNvbG9yKSkuam9pbigiICIpLGF9fWNsYXNzICQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJicmVhayIsITApLHRoaXMuYWZ0ZXI9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYWZ0ZXIsWyJhdXRvIiwiY29udGVudEFyZWEiLCJwYWdlQXJlYSIsInBhZ2VFdmVuIiwicGFnZU9kZCJdKSx0aGlzLmFmdGVyVGFyZ2V0PWUuYWZ0ZXJUYXJnZXR8fCIiLHRoaXMuYmVmb3JlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmJlZm9yZSxbImF1dG8iLCJjb250ZW50QXJlYSIsInBhZ2VBcmVhIiwicGFnZUV2ZW4iLCJwYWdlT2RkIl0pLHRoaXMuYmVmb3JlVGFyZ2V0PWUuYmVmb3JlVGFyZ2V0fHwiIix0aGlzLmJvb2tlbmRMZWFkZXI9ZS5ib29rZW5kTGVhZGVyfHwiIix0aGlzLmJvb2tlbmRUcmFpbGVyPWUuYm9va2VuZFRyYWlsZXJ8fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5vdmVyZmxvd0xlYWRlcj1lLm92ZXJmbG93TGVhZGVyfHwiIix0aGlzLm92ZXJmbG93VGFyZ2V0PWUub3ZlcmZsb3dUYXJnZXR8fCIiLHRoaXMub3ZlcmZsb3dUcmFpbGVyPWUub3ZlcmZsb3dUcmFpbGVyfHwiIix0aGlzLnN0YXJ0TmV3PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5zdGFydE5ldyxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsfX1jbGFzcyBYIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYnJlYWtBZnRlciIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5sZWFkZXI9ZS5sZWFkZXJ8fCIiLHRoaXMuc3RhcnROZXc9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnN0YXJ0TmV3LGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy50YXJnZXQ9ZS50YXJnZXR8fCIiLHRoaXMudGFyZ2V0VHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50YXJnZXRUeXBlLFsiYXV0byIsImNvbnRlbnRBcmVhIiwicGFnZUFyZWEiXSksdGhpcy50cmFpbGVyPWUudHJhaWxlcnx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuc2NyaXB0PW51bGx9fWNsYXNzIEggZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJicmVha0JlZm9yZSIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5sZWFkZXI9ZS5sZWFkZXJ8fCIiLHRoaXMuc3RhcnROZXc9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnN0YXJ0TmV3LGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy50YXJnZXQ9ZS50YXJnZXR8fCIiLHRoaXMudGFyZ2V0VHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50YXJnZXRUeXBlLFsiYXV0byIsImNvbnRlbnRBcmVhIiwicGFnZUFyZWEiXSksdGhpcy50cmFpbGVyPWUudHJhaWxlcnx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuc2NyaXB0PW51bGx9W24uJHRvSFRNTF0oZSl7cmV0dXJuIHRoaXNbbi4kZXh0cmFdPXt9LGMuSFRNTFJlc3VsdC5GQUlMVVJFfX1jbGFzcyBxIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiYnV0dG9uIiwhMCksdGhpcy5oaWdobGlnaHQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaGlnaGxpZ2h0LFsiaW52ZXJ0ZWQiLCJub25lIiwib3V0bGluZSIsInB1c2giXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9IVE1MXShlKXtjb25zdCB0PXRoaXNbbi4kZ2V0UGFyZW50XSgpW24uJGdldFBhcmVudF0oKSxyPXtuYW1lOiJidXR0b24iLGF0dHJpYnV0ZXM6e2lkOnRoaXNbbi4kdWlkXSxjbGFzczpbInhmYUJ1dHRvbiJdLHN0eWxlOnt9fSxjaGlsZHJlbjpbXX07Zm9yKGNvbnN0IGUgb2YgdC5ldmVudC5jaGlsZHJlbil7aWYoImNsaWNrIiE9PWUuYWN0aXZpdHl8fCFlLnNjcmlwdCljb250aW51ZTtjb25zdCB0PSgwLHUucmVjb3ZlckpzVVJMKShlLnNjcmlwdFtuLiRjb250ZW50XSk7aWYoIXQpY29udGludWU7Y29uc3QgYT0oMCxzLmZpeFVSTCkodC51cmwpO2EmJnIuY2hpbGRyZW4ucHVzaCh7bmFtZToiYSIsYXR0cmlidXRlczp7aWQ6ImxpbmsiK3RoaXNbbi4kdWlkXSxocmVmOmEsbmV3V2luZG93OnQubmV3V2luZG93LGNsYXNzOlsieGZhTGluayJdLHN0eWxlOnt9fSxjaGlsZHJlbjpbXX0pfXJldHVybiBjLkhUTUxSZXN1bHQuc3VjY2VzcyhyKX19Y2xhc3MgeiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNhbGN1bGF0ZSIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5vdmVycmlkZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vdmVycmlkZSxbImRpc2FibGVkIiwiZXJyb3IiLCJpZ25vcmUiLCJ3YXJuaW5nIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsLHRoaXMubWVzc2FnZT1udWxsLHRoaXMuc2NyaXB0PW51bGx9fWNsYXNzIEcgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjYXB0aW9uIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnBsYWNlbWVudD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wbGFjZW1lbnQsWyJsZWZ0IiwiYm90dG9tIiwiaW5saW5lIiwicmlnaHQiLCJ0b3AiXSksdGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKSx0aGlzLnJlc2VydmU9TWF0aC5jZWlsKCgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUucmVzZXJ2ZSkpLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsLHRoaXMuZm9udD1udWxsLHRoaXMubWFyZ2luPW51bGwsdGhpcy5wYXJhPW51bGwsdGhpcy52YWx1ZT1udWxsfVtuLiRzZXRWYWx1ZV0oZSl7dih0aGlzLGUpfVtuLiRnZXRFeHRyYV0oZSl7aWYoIXRoaXNbbi4kZXh0cmFdKXtsZXR7d2lkdGg6dCxoZWlnaHQ6cn09ZTtzd2l0Y2godGhpcy5wbGFjZW1lbnQpe2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6Y2FzZSJpbmxpbmUiOnQ9dGhpcy5yZXNlcnZlPD0wP3Q6dGhpcy5yZXNlcnZlO2JyZWFrO2Nhc2UidG9wIjpjYXNlImJvdHRvbSI6cj10aGlzLnJlc2VydmU8PTA/cjp0aGlzLnJlc2VydmV9dGhpc1tuLiRleHRyYV09KDAscy5sYXlvdXROb2RlKSh0aGlzLHt3aWR0aDp0LGhlaWdodDpyfSl9cmV0dXJuIHRoaXNbbi4kZXh0cmFdfVtuLiR0b0hUTUxdKGUpe2lmKCF0aGlzLnZhbHVlKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7dGhpc1tuLiRwdXNoUGFyYV0oKTtjb25zdCB0PXRoaXMudmFsdWVbbi4kdG9IVE1MXShlKS5odG1sO2lmKCF0KXJldHVybiB0aGlzW24uJHBvcFBhcmFdKCksYy5IVE1MUmVzdWx0LkVNUFRZO2NvbnN0IHI9dGhpcy5yZXNlcnZlO2lmKHRoaXMucmVzZXJ2ZTw9MCl7Y29uc3R7dzp0LGg6cn09dGhpc1tuLiRnZXRFeHRyYV0oZSk7c3dpdGNoKHRoaXMucGxhY2VtZW50KXtjYXNlImxlZnQiOmNhc2UicmlnaHQiOmNhc2UiaW5saW5lIjp0aGlzLnJlc2VydmU9dDticmVhaztjYXNlInRvcCI6Y2FzZSJib3R0b20iOnRoaXMucmVzZXJ2ZT1yfX1jb25zdCBhPVtdOyJzdHJpbmciPT10eXBlb2YgdD9hLnB1c2goe25hbWU6IiN0ZXh0Iix2YWx1ZTp0fSk6YS5wdXNoKHQpO2NvbnN0IGk9KDAscy50b1N0eWxlKSh0aGlzLCJmb250IiwibWFyZ2luIiwidmlzaWJpbGl0eSIpO3N3aXRjaCh0aGlzLnBsYWNlbWVudCl7Y2FzZSJsZWZ0IjpjYXNlInJpZ2h0Ijp0aGlzLnJlc2VydmU+MCYmKGkud2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMucmVzZXJ2ZSkpO2JyZWFrO2Nhc2UidG9wIjpjYXNlImJvdHRvbSI6dGhpcy5yZXNlcnZlPjAmJihpLmhlaWdodD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5yZXNlcnZlKSl9cmV0dXJuKDAscy5zZXRQYXJhKSh0aGlzLG51bGwsdCksdGhpc1tuLiRwb3BQYXJhXSgpLHRoaXMucmVzZXJ2ZT1yLGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e3N0eWxlOmksY2xhc3M6WyJ4ZmFDYXB0aW9uIl19LGNoaWxkcmVuOmF9KX19Y2xhc3MgVyBleHRlbmRzIG8uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNlcnRpZmljYXRlIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIFYgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjZXJ0aWZpY2F0ZXMiLCEwKSx0aGlzLmNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY3JlZGVudGlhbFNlcnZlclBvbGljeSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVybD1lLnVybHx8IiIsdGhpcy51cmxQb2xpY3k9ZS51cmxQb2xpY3l8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmVuY3J5cHRpb249bnVsbCx0aGlzLmlzc3VlcnM9bnVsbCx0aGlzLmtleVVzYWdlPW51bGwsdGhpcy5vaWRzPW51bGwsdGhpcy5zaWduaW5nPW51bGwsdGhpcy5zdWJqZWN0RE5zPW51bGx9fWNsYXNzIEsgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjaGVja0J1dHRvbiIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5tYXJrPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm1hcmssWyJkZWZhdWx0IiwiY2hlY2siLCJjaXJjbGUiLCJjcm9zcyIsImRpYW1vbmQiLCJzcXVhcmUiLCJzdGFyIl0pLHRoaXMuc2hhcGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc2hhcGUsWyJzcXVhcmUiLCJyb3VuZCJdKSx0aGlzLnNpemU9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5zaXplLCIxMHB0IiksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuYm9yZGVyPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm1hcmdpbj1udWxsfVtuLiR0b0hUTUxdKGUpe3ZhciB0O2NvbnN0IHI9KDAscy50b1N0eWxlKSgibWFyZ2luIiksYT0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5zaXplKTtsZXQgaSxvLGw7ci53aWR0aD1yLmhlaWdodD1hO2NvbnN0IGg9dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kZ2V0UGFyZW50XSgpLHU9aC5pdGVtcy5jaGlsZHJlbi5sZW5ndGgmJmguaXRlbXMuY2hpbGRyZW5bMF1bbi4kdG9IVE1MXSgpLmh0bWx8fFtdLGQ9e29uOih2b2lkIDAhPT11WzBdP3VbMF06Im9uIikudG9TdHJpbmcoKSxvZmY6KHZvaWQgMCE9PXVbMV0/dVsxXToib2ZmIikudG9TdHJpbmcoKX0sZj0oKG51bGw9PT0odD1oLnZhbHVlKXx8dm9pZCAwPT09dD92b2lkIDA6dFtuLiR0ZXh0XSgpKXx8Im9mZiIpPT09ZC5vbnx8dm9pZCAwLGc9aFtuLiRnZXRTdWJmb3JtUGFyZW50XSgpLHA9aFtuLiR1aWRdO2xldCBtO3ZhciBiLHk7ZyBpbnN0YW5jZW9mIFNlPyhsPWdbbi4kdWlkXSxpPSJyYWRpbyIsbz0ieGZhUmFkaW8iLG09KG51bGw9PT0oYj1nW24uJGRhdGFdKXx8dm9pZCAwPT09Yj92b2lkIDA6YltuLiR1aWRdKXx8Z1tuLiR1aWRdKTooaT0iY2hlY2tib3giLG89InhmYUNoZWNrYm94IixtPShudWxsPT09KHk9aFtuLiRkYXRhXSl8fHZvaWQgMD09PXk/dm9pZCAwOnlbbi4kdWlkXSl8fGhbbi4kdWlkXSk7Y29uc3Qgdz17bmFtZToiaW5wdXQiLGF0dHJpYnV0ZXM6e2NsYXNzOltvXSxzdHlsZTpyLGZpZWxkSWQ6cCxkYXRhSWQ6bSx0eXBlOmksY2hlY2tlZDpmLHhmYU9uOmQub24seGZhT2ZmOmQub2ZmLCJhcmlhLWxhYmVsIjpDKGgpLCJhcmlhLXJlcXVpcmVkIjohMX19O3JldHVybiBsJiYody5hdHRyaWJ1dGVzLm5hbWU9bCksUyhoKSYmKHcuYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdPSEwLHcuYXR0cmlidXRlcy5yZXF1aXJlZD0hMCksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOlt3XX0pfX1jbGFzcyBZIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY2hvaWNlTGlzdCIsITApLHRoaXMuY29tbWl0T249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY29tbWl0T24sWyJzZWxlY3QiLCJleGl0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5vcGVuPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm9wZW4sWyJ1c2VyQ29udHJvbCIsImFsd2F5cyIsIm11bHRpU2VsZWN0Iiwib25FbnRyeSJdKSx0aGlzLnRleHRFbnRyeT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUudGV4dEVudHJ5LGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuYm9yZGVyPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm1hcmdpbj1udWxsfVtuLiR0b0hUTUxdKGUpe3ZhciB0LHI7Y29uc3QgYT0oMCxzLnRvU3R5bGUpKHRoaXMsImJvcmRlciIsIm1hcmdpbiIpLGk9dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kZ2V0UGFyZW50XSgpLG89e2ZvbnRTaXplOiJjYWxjKCIuY29uY2F0KChudWxsPT09KHQ9aS5mb250KXx8dm9pZCAwPT09dD92b2lkIDA6dC5zaXplKXx8MTAsInB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSkiKX0sbD1bXTtpZihpLml0ZW1zLmNoaWxkcmVuLmxlbmd0aD4wKXt2YXIgaDtjb25zdCBlPWkuaXRlbXM7bGV0IHQ9MCxyPTA7Mj09PWUuY2hpbGRyZW4ubGVuZ3RoJiYodD1lLmNoaWxkcmVuWzBdLnNhdmUscj0xLXQpO2NvbnN0IGE9ZS5jaGlsZHJlblt0XVtuLiR0b0hUTUxdKCkuaHRtbCxzPWUuY2hpbGRyZW5bcl1bbi4kdG9IVE1MXSgpLmh0bWw7bGV0IGM9ITE7Y29uc3QgdT0obnVsbD09PShoPWkudmFsdWUpfHx2b2lkIDA9PT1oP3ZvaWQgMDpoW24uJHRleHRdKCkpfHwiIjtmb3IobGV0IGU9MCx0PWEubGVuZ3RoO2U8dDtlKyspe2NvbnN0IHQ9e25hbWU6Im9wdGlvbiIsYXR0cmlidXRlczp7dmFsdWU6c1tlXXx8YVtlXSxzdHlsZTpvfSx2YWx1ZTphW2VdfTtzW2VdPT09dSYmKHQuYXR0cmlidXRlcy5zZWxlY3RlZD1jPSEwKSxsLnB1c2godCl9Y3x8bC5zcGxpY2UoMCwwLHtuYW1lOiJvcHRpb24iLGF0dHJpYnV0ZXM6e2hpZGRlbjohMCxzZWxlY3RlZDohMH0sdmFsdWU6IiAifSl9Y29uc3QgdT17Y2xhc3M6WyJ4ZmFTZWxlY3QiXSxmaWVsZElkOmlbbi4kdWlkXSxkYXRhSWQ6KG51bGw9PT0ocj1pW24uJGRhdGFdKXx8dm9pZCAwPT09cj92b2lkIDA6cltuLiR1aWRdKXx8aVtuLiR1aWRdLHN0eWxlOmEsImFyaWEtbGFiZWwiOkMoaSksImFyaWEtcmVxdWlyZWQiOiExfTtyZXR1cm4gUyhpKSYmKHVbImFyaWEtcmVxdWlyZWQiXT0hMCx1LnJlcXVpcmVkPSEwKSwibXVsdGlTZWxlY3QiPT09dGhpcy5vcGVuJiYodS5tdWx0aXBsZT0hMCksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOlt7bmFtZToic2VsZWN0IixjaGlsZHJlbjpsLGF0dHJpYnV0ZXM6dX1dfSl9fWNsYXNzIEogZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJjb2xvciIsITApLHRoaXMuY1NwYWNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmNTcGFjZSxbIlNSR0IiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy52YWx1ZT1lLnZhbHVlPygwLGMuZ2V0Q29sb3IpKGUudmFsdWUpOiIiLHRoaXMuZXh0cmFzPW51bGx9W24uJGhhc1NldHRhYmxlVmFsdWVdKCl7cmV0dXJuITF9W24uJHRvU3R5bGVdKCl7cmV0dXJuIHRoaXMudmFsdWU/bC5VdGlsLm1ha2VIZXhDb2xvcih0aGlzLnZhbHVlLnIsdGhpcy52YWx1ZS5nLHRoaXMudmFsdWUuYik6bnVsbH19Y2xhc3MgWiBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNvbWIiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubnVtYmVyT2ZDZWxscz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubnVtYmVyT2ZDZWxscyxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT5lPj0wfSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBRIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY29ubmVjdCIsITApLHRoaXMuY29ubmVjdGlvbj1lLmNvbm5lY3Rpb258fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudXNhZ2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudXNhZ2UsWyJleHBvcnRBbmRJbXBvcnQiLCJleHBvcnRPbmx5IiwiaW1wb3J0T25seSJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5waWN0dXJlPW51bGx9fWNsYXNzIGVlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiY29udGVudEFyZWEiLCEwKSx0aGlzLmg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5oKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMudz0oMCxjLmdldE1lYXN1cmVtZW50KShlLncpLHRoaXMueD0oMCxjLmdldE1lYXN1cmVtZW50KShlLngsIjBwdCIpLHRoaXMueT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnksIjBwdCIpLHRoaXMuZGVzYz1udWxsLHRoaXMuZXh0cmFzPW51bGx9W24uJHRvSFRNTF0oZSl7Y29uc3QgdD17bGVmdDooMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy54KSx0b3A6KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMueSksd2lkdGg6KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMudyksaGVpZ2h0OigwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLmgpfSxyPVsieGZhQ29udGVudGFyZWEiXTtyZXR1cm4oMCxzLmlzUHJpbnRPbmx5KSh0aGlzKSYmci5wdXNoKCJ4ZmFQcmludE9ubHkiKSxjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixjaGlsZHJlbjpbXSxhdHRyaWJ1dGVzOntzdHlsZTp0LGNsYXNzOnIsaWQ6dGhpc1tuLiR1aWRdfX0pfX1jbGFzcyB0ZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImNvcm5lciIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5pbnZlcnRlZD0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuaW52ZXJ0ZWQsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmpvaW49KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuam9pbixbInNxdWFyZSIsInJvdW5kIl0pLHRoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSksdGhpcy5yYWRpdXM9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5yYWRpdXMpLHRoaXMuc3Ryb2tlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnN0cm9rZSxbInNvbGlkIiwiZGFzaERvdCIsImRhc2hEb3REb3QiLCJkYXNoZWQiLCJkb3R0ZWQiLCJlbWJvc3NlZCIsImV0Y2hlZCIsImxvd2VyZWQiLCJyYWlzZWQiXSksdGhpcy50aGlja25lc3M9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS50aGlja25lc3MsIjAuNXB0IiksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuY29sb3I9bnVsbCx0aGlzLmV4dHJhcz1udWxsfVtuLiR0b1N0eWxlXSgpe2NvbnN0IGU9KDAscy50b1N0eWxlKSh0aGlzLCJ2aXNpYmlsaXR5Iik7cmV0dXJuIGUucmFkaXVzPSgwLHMubWVhc3VyZVRvU3RyaW5nKSgic3F1YXJlIj09PXRoaXMuam9pbj8wOnRoaXMucmFkaXVzKSxlfX1jbGFzcyByZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkYXRlIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGZpbmFsaXplXSgpe2NvbnN0IGU9dGhpc1tuLiRjb250ZW50XS50cmltKCk7dGhpc1tuLiRjb250ZW50XT1lP25ldyBEYXRlKGUpOm51bGx9W24uJHRvSFRNTF0oZSl7cmV0dXJuIE8odGhpc1tuLiRjb250ZW50XT90aGlzW24uJGNvbnRlbnRdLnRvU3RyaW5nKCk6IiIpfX1jbGFzcyBuZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkYXRlVGltZSIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiRmaW5hbGl6ZV0oKXtjb25zdCBlPXRoaXNbbi4kY29udGVudF0udHJpbSgpO3RoaXNbbi4kY29udGVudF09ZT9uZXcgRGF0ZShlKTpudWxsfVtuLiR0b0hUTUxdKGUpe3JldHVybiBPKHRoaXNbbi4kY29udGVudF0/dGhpc1tuLiRjb250ZW50XS50b1N0cmluZygpOiIiKX19Y2xhc3MgYWUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkYXRlVGltZUVkaXQiLCEwKSx0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucGlja2VyPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnBpY2tlcixbImhvc3QiLCJub25lIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmJvcmRlcj1udWxsLHRoaXMuY29tYj1udWxsLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5tYXJnaW49bnVsbH1bbi4kdG9IVE1MXShlKXt2YXIgdDtjb25zdCByPSgwLHMudG9TdHlsZSkodGhpcywiYm9yZGVyIiwiZm9udCIsIm1hcmdpbiIpLGE9dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kZ2V0UGFyZW50XSgpLGk9e25hbWU6ImlucHV0IixhdHRyaWJ1dGVzOnt0eXBlOiJ0ZXh0IixmaWVsZElkOmFbbi4kdWlkXSxkYXRhSWQ6KG51bGw9PT0odD1hW24uJGRhdGFdKXx8dm9pZCAwPT09dD92b2lkIDA6dFtuLiR1aWRdKXx8YVtuLiR1aWRdLGNsYXNzOlsieGZhVGV4dGZpZWxkIl0sc3R5bGU6ciwiYXJpYS1sYWJlbCI6QyhhKSwiYXJpYS1yZXF1aXJlZCI6ITF9fTtyZXR1cm4gUyhhKSYmKGkuYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdPSEwLGkuYXR0cmlidXRlcy5yZXF1aXJlZD0hMCksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOltpXX0pfX1jbGFzcyBpZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkZWNpbWFsIiksdGhpcy5mcmFjRGlnaXRzPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5mcmFjRGlnaXRzLGRlZmF1bHRWYWx1ZToyLHZhbGlkYXRlOmU9PiEwfSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxlYWREaWdpdHM9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmxlYWREaWdpdHMsZGVmYXVsdFZhbHVlOi0xLHZhbGlkYXRlOmU9PiEwfSksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiRmaW5hbGl6ZV0oKXtjb25zdCBlPXBhcnNlRmxvYXQodGhpc1tuLiRjb250ZW50XS50cmltKCkpO3RoaXNbbi4kY29udGVudF09aXNOYU4oZSk/bnVsbDplfVtuLiR0b0hUTUxdKGUpe3JldHVybiBPKG51bGwhPT10aGlzW24uJGNvbnRlbnRdP3RoaXNbbi4kY29udGVudF0udG9TdHJpbmcoKToiIil9fWNsYXNzIHNlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGVmYXVsdFVpIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbH19Y2xhc3Mgb2UgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkZXNjIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW1hZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbnRlZ2VyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGV4dD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIGNlIGV4dGVuZHMgby5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGlnZXN0TWV0aG9kIixbIiIsIlNIQTEiLCJTSEEyNTYiLCJTSEE1MTIiLCJSSVBFTUQxNjAiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIGxlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZGlnZXN0TWV0aG9kcyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmRpZ2VzdE1ldGhvZD1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgaGUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJkcmF3IiwhMCksdGhpcy5hbmNob3JUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFuY2hvclR5cGUsWyJ0b3BMZWZ0IiwiYm90dG9tQ2VudGVyIiwiYm90dG9tTGVmdCIsImJvdHRvbVJpZ2h0IiwibWlkZGxlQ2VudGVyIiwibWlkZGxlTGVmdCIsIm1pZGRsZVJpZ2h0IiwidG9wQ2VudGVyIiwidG9wUmlnaHQiXSksdGhpcy5jb2xTcGFuPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5jb2xTcGFuLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PmU+PTF8fC0xPT09ZX0pLHRoaXMuaD1lLmg/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5oKToiIix0aGlzLmhBbGlnbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oQWxpZ24sWyJsZWZ0IiwiY2VudGVyIiwianVzdGlmeSIsImp1c3RpZnlBbGwiLCJyYWRpeCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5sb2NhbGU9ZS5sb2NhbGV8fCIiLHRoaXMubWF4SD0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1heEgsIjBwdCIpLHRoaXMubWF4Vz0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1heFcsIjBwdCIpLHRoaXMubWluSD0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1pbkgsIjBwdCIpLHRoaXMubWluVz0oMCxjLmdldE1lYXN1cmVtZW50KShlLm1pblcsIjBwdCIpLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSksdGhpcy5yZWxldmFudD0oMCxjLmdldFJlbGV2YW50KShlLnJlbGV2YW50KSx0aGlzLnJvdGF0ZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUucm90YXRlLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PmUlOTA9PTB9KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy53PWUudz8oMCxjLmdldE1lYXN1cmVtZW50KShlLncpOiIiLHRoaXMueD0oMCxjLmdldE1lYXN1cmVtZW50KShlLngsIjBwdCIpLHRoaXMueT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnksIjBwdCIpLHRoaXMuYXNzaXN0PW51bGwsdGhpcy5ib3JkZXI9bnVsbCx0aGlzLmNhcHRpb249bnVsbCx0aGlzLmRlc2M9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMuZm9udD1udWxsLHRoaXMua2VlcD1udWxsLHRoaXMubWFyZ2luPW51bGwsdGhpcy5wYXJhPW51bGwsdGhpcy50cmF2ZXJzYWw9bnVsbCx0aGlzLnVpPW51bGwsdGhpcy52YWx1ZT1udWxsLHRoaXMuc2V0UHJvcGVydHk9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJHNldFZhbHVlXShlKXt2KHRoaXMsZSl9W24uJHRvSFRNTF0oZSl7aWYoQSh0aGlzKSwiaGlkZGVuIj09PXRoaXMucHJlc2VuY2V8fCJpbmFjdGl2ZSI9PT10aGlzLnByZXNlbmNlKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7KDAscy5maXhEaW1lbnNpb25zKSh0aGlzKSx0aGlzW24uJHB1c2hQYXJhXSgpO2NvbnN0IHQ9dGhpcy53LHI9dGhpcy5oLHt3OmEsaDpvLGlzQnJva2VuOmx9PSgwLHMubGF5b3V0Tm9kZSkodGhpcyxlKTtpZihhJiYiIj09PXRoaXMudyl7aWYobCYmdGhpc1tuLiRnZXRTdWJmb3JtUGFyZW50XSgpW24uJGlzVGhlcmVNb3JlV2lkdGhdKCkpcmV0dXJuIHRoaXNbbi4kcG9wUGFyYV0oKSxjLkhUTUxSZXN1bHQuRkFJTFVSRTt0aGlzLnc9YX1pZihvJiYiIj09PXRoaXMuaCYmKHRoaXMuaD1vKSxGKHRoaXMpLCEoMCxpLmNoZWNrRGltZW5zaW9ucykodGhpcyxlKSlyZXR1cm4gdGhpcy53PXQsdGhpcy5oPXIsdGhpc1tuLiRwb3BQYXJhXSgpLGMuSFRNTFJlc3VsdC5GQUlMVVJFO0kodGhpcyk7Y29uc3QgaD0oMCxzLnRvU3R5bGUpKHRoaXMsImZvbnQiLCJoQWxpZ24iLCJkaW1lbnNpb25zIiwicG9zaXRpb24iLCJwcmVzZW5jZSIsInJvdGF0ZSIsImFuY2hvclR5cGUiLCJib3JkZXIiLCJtYXJnaW4iKTsoMCxzLnNldE1pbk1heERpbWVuc2lvbnMpKHRoaXMsaCksaC5tYXJnaW4mJihoLnBhZGRpbmc9aC5tYXJnaW4sZGVsZXRlIGgubWFyZ2luKTtjb25zdCB1PVsieGZhRHJhdyJdO3RoaXMuZm9udCYmdS5wdXNoKCJ4ZmFGb250IiksKDAscy5pc1ByaW50T25seSkodGhpcykmJnUucHVzaCgieGZhUHJpbnRPbmx5Iik7Y29uc3QgZD17c3R5bGU6aCxpZDp0aGlzW24uJHVpZF0sY2xhc3M6dX07dGhpcy5uYW1lJiYoZC54ZmFOYW1lPXRoaXMubmFtZSk7Y29uc3QgZj17bmFtZToiZGl2IixhdHRyaWJ1dGVzOmQsY2hpbGRyZW46W119O2sodGhpcyxkKTtjb25zdCBnPSgwLHMuY29tcHV0ZUJib3gpKHRoaXMsZixlKSxwPXRoaXMudmFsdWU/dGhpcy52YWx1ZVtuLiR0b0hUTUxdKGUpLmh0bWw6bnVsbDtyZXR1cm4gbnVsbD09PXA/KHRoaXMudz10LHRoaXMuaD1yLHRoaXNbbi4kcG9wUGFyYV0oKSxjLkhUTUxSZXN1bHQuc3VjY2VzcygoMCxzLmNyZWF0ZVdyYXBwZXIpKHRoaXMsZiksZykpOihmLmNoaWxkcmVuLnB1c2gocCksKDAscy5zZXRQYXJhKSh0aGlzLGgscCksdGhpcy53PXQsdGhpcy5oPXIsdGhpc1tuLiRwb3BQYXJhXSgpLGMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyxmKSxnKSl9fWNsYXNzIHVlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZWRnZSIsITApLHRoaXMuY2FwPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmNhcCxbInNxdWFyZSIsImJ1dHQiLCJyb3VuZCJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSksdGhpcy5zdHJva2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc3Ryb2tlLFsic29saWQiLCJkYXNoRG90IiwiZGFzaERvdERvdCIsImRhc2hlZCIsImRvdHRlZCIsImVtYm9zc2VkIiwiZXRjaGVkIiwibG93ZXJlZCIsInJhaXNlZCJdKSx0aGlzLnRoaWNrbmVzcz0oMCxjLmdldE1lYXN1cmVtZW50KShlLnRoaWNrbmVzcywiMC41cHQiKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5jb2xvcj1udWxsLHRoaXMuZXh0cmFzPW51bGx9W24uJHRvU3R5bGVdKCl7Y29uc3QgZT0oMCxzLnRvU3R5bGUpKHRoaXMsInZpc2liaWxpdHkiKTtpZihPYmplY3QuYXNzaWduKGUse2xpbmVjYXA6dGhpcy5jYXAsd2lkdGg6KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMudGhpY2tuZXNzKSxjb2xvcjp0aGlzLmNvbG9yP3RoaXMuY29sb3Jbbi4kdG9TdHlsZV0oKToiIzAwMDAwMCIsc3R5bGU6IiJ9KSwidmlzaWJsZSIhPT10aGlzLnByZXNlbmNlKWUuc3R5bGU9Im5vbmUiO2Vsc2Ugc3dpdGNoKHRoaXMuc3Ryb2tlKXtjYXNlInNvbGlkIjplLnN0eWxlPSJzb2xpZCI7YnJlYWs7Y2FzZSJkYXNoRG90IjpjYXNlImRhc2hEb3REb3QiOmNhc2UiZGFzaGVkIjplLnN0eWxlPSJkYXNoZWQiO2JyZWFrO2Nhc2UiZG90dGVkIjplLnN0eWxlPSJkb3R0ZWQiO2JyZWFrO2Nhc2UiZW1ib3NzZWQiOmUuc3R5bGU9InJpZGdlIjticmVhaztjYXNlImV0Y2hlZCI6ZS5zdHlsZT0iZ3Jvb3ZlIjticmVhaztjYXNlImxvd2VyZWQiOmUuc3R5bGU9Imluc2V0IjticmVhaztjYXNlInJhaXNlZCI6ZS5zdHlsZT0ib3V0c2V0In1yZXR1cm4gZX19Y2xhc3MgZGUgZXh0ZW5kcyBvLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJlbmNvZGluZyIsWyJhZGJlLng1MDkucnNhX3NoYTEiLCJhZGJlLnBrY3M3LmRldGFjaGVkIiwiYWRiZS5wa2NzNy5zaGExIl0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBmZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImVuY29kaW5ncyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmVuY29kaW5nPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBnZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImVuY3J5cHQiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNlcnRpZmljYXRlPW51bGx9fWNsYXNzIHBlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZW5jcnlwdERhdGEiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMub3BlcmF0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm9wZXJhdGlvbixbImVuY3J5cHQiLCJkZWNyeXB0Il0pLHRoaXMudGFyZ2V0PWUudGFyZ2V0fHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5maWx0ZXI9bnVsbCx0aGlzLm1hbmlmZXN0PW51bGx9fWNsYXNzIG1lIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZW5jcnlwdGlvbiIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNlcnRpZmljYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBiZSBleHRlbmRzIG8uT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImVuY3J5cHRpb25NZXRob2QiLFsiIiwiQUVTMjU2LUNCQyIsIlRSSVBMRURFUy1DQkMiLCJBRVMxMjgtQ0JDIiwiQUVTMTkyLUNCQyJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgeWUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJlbmNyeXB0aW9uTWV0aG9kcyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmVuY3J5cHRpb25NZXRob2Q9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIHdlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZXZlbnQiLCEwKSx0aGlzLmFjdGl2aXR5PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFjdGl2aXR5LFsiY2xpY2siLCJjaGFuZ2UiLCJkb2NDbG9zZSIsImRvY1JlYWR5IiwiZW50ZXIiLCJleGl0IiwiZnVsbCIsImluZGV4Q2hhbmdlIiwiaW5pdGlhbGl6ZSIsIm1vdXNlRG93biIsIm1vdXNlRW50ZXIiLCJtb3VzZUV4aXQiLCJtb3VzZVVwIiwicG9zdEV4ZWN1dGUiLCJwb3N0T3BlbiIsInBvc3RQcmludCIsInBvc3RTYXZlIiwicG9zdFNpZ24iLCJwb3N0U3VibWl0IiwicHJlRXhlY3V0ZSIsInByZU9wZW4iLCJwcmVQcmludCIsInByZVNhdmUiLCJwcmVTaWduIiwicHJlU3VibWl0IiwicmVhZHkiLCJ2YWxpZGF0aW9uU3RhdGUiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxpc3Rlbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5saXN0ZW4sWyJyZWZPbmx5IiwicmVmQW5kRGVzY2VuZGVudHMiXSksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsLHRoaXMuZW5jcnlwdERhdGE9bnVsbCx0aGlzLmV4ZWN1dGU9bnVsbCx0aGlzLnNjcmlwdD1udWxsLHRoaXMuc2lnbkRhdGE9bnVsbCx0aGlzLnN1Ym1pdD1udWxsfX1jbGFzcyB2ZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJleERhdGEiKSx0aGlzLmNvbnRlbnRUeXBlPWUuY29udGVudFR5cGV8fCIiLHRoaXMuaHJlZj1lLmhyZWZ8fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5tYXhMZW5ndGg9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLm1heExlbmd0aCxkZWZhdWx0VmFsdWU6LTEsdmFsaWRhdGU6ZT0+ZT49LTF9KSx0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnJpZD1lLnJpZHx8IiIsdGhpcy50cmFuc2ZlckVuY29kaW5nPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnRyYW5zZmVyRW5jb2RpbmcsWyJub25lIiwiYmFzZTY0IiwicGFja2FnZSJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGlzQ0RBVEFYbWxdKCl7cmV0dXJuInRleHQvaHRtbCI9PT10aGlzLmNvbnRlbnRUeXBlfVtuLiRvbkNoaWxkXShlKXtyZXR1cm4oInRleHQvaHRtbCI9PT10aGlzLmNvbnRlbnRUeXBlJiZlW24uJG5hbWVzcGFjZUlkXT09PWEuTmFtZXNwYWNlSWRzLnhodG1sLmlkfHwidGV4dC94bWwiPT09dGhpcy5jb250ZW50VHlwZSkmJih0aGlzW24uJGNvbnRlbnRdPWUsITApfVtuLiR0b0hUTUxdKGUpe3JldHVybiJ0ZXh0L2h0bWwiPT09dGhpcy5jb250ZW50VHlwZSYmdGhpc1tuLiRjb250ZW50XT90aGlzW24uJGNvbnRlbnRdW24uJHRvSFRNTF0oZSk6Yy5IVE1MUmVzdWx0LkVNUFRZfX1jbGFzcyB4ZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImV4T2JqZWN0IiwhMCksdGhpcy5hcmNoaXZlPWUuYXJjaGl2ZXx8IiIsdGhpcy5jbGFzc0lkPWUuY2xhc3NJZHx8IiIsdGhpcy5jb2RlQmFzZT1lLmNvZGVCYXNlfHwiIix0aGlzLmNvZGVUeXBlPWUuY29kZVR5cGV8fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4T2JqZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZmxvYXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbWFnZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmludGVnZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50ZXh0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGltZT1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgU2UgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJleGNsR3JvdXAiLCEwKSx0aGlzLmFjY2Vzcz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hY2Nlc3MsWyJvcGVuIiwibm9uSW50ZXJhY3RpdmUiLCJwcm90ZWN0ZWQiLCJyZWFkT25seSJdKSx0aGlzLmFjY2Vzc0tleT1lLmFjY2Vzc0tleXx8IiIsdGhpcy5hbmNob3JUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFuY2hvclR5cGUsWyJ0b3BMZWZ0IiwiYm90dG9tQ2VudGVyIiwiYm90dG9tTGVmdCIsImJvdHRvbVJpZ2h0IiwibWlkZGxlQ2VudGVyIiwibWlkZGxlTGVmdCIsIm1pZGRsZVJpZ2h0IiwidG9wQ2VudGVyIiwidG9wUmlnaHQiXSksdGhpcy5jb2xTcGFuPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5jb2xTcGFuLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PmU+PTF8fC0xPT09ZX0pLHRoaXMuaD1lLmg/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5oKToiIix0aGlzLmhBbGlnbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oQWxpZ24sWyJsZWZ0IiwiY2VudGVyIiwianVzdGlmeSIsImp1c3RpZnlBbGwiLCJyYWRpeCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5sYXlvdXQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubGF5b3V0LFsicG9zaXRpb24iLCJsci10YiIsInJsLXJvdyIsInJsLXRiIiwicm93IiwidGFibGUiLCJ0YiJdKSx0aGlzLm1heEg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhILCIwcHQiKSx0aGlzLm1heFc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhXLCIwcHQiKSx0aGlzLm1pbkg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5ILCIwcHQiKSx0aGlzLm1pblc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5taW5XLCIwcHQiKSx0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pLHRoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMudz1lLnc/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS53KToiIix0aGlzLng9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS54LCIwcHQiKSx0aGlzLnk9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS55LCIwcHQiKSx0aGlzLmFzc2lzdD1udWxsLHRoaXMuYmluZD1udWxsLHRoaXMuYm9yZGVyPW51bGwsdGhpcy5jYWxjdWxhdGU9bnVsbCx0aGlzLmNhcHRpb249bnVsbCx0aGlzLmRlc2M9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMubWFyZ2luPW51bGwsdGhpcy5wYXJhPW51bGwsdGhpcy50cmF2ZXJzYWw9bnVsbCx0aGlzLnZhbGlkYXRlPW51bGwsdGhpcy5jb25uZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXZlbnQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5maWVsZD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnNldFByb3BlcnR5PW5ldyBvLlhGQU9iamVjdEFycmF5fVtuLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfVtuLiRoYXNTZXR0YWJsZVZhbHVlXSgpe3JldHVybiEwfVtuLiRzZXRWYWx1ZV0oZSl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5maWVsZC5jaGlsZHJlbil7aWYoIXQudmFsdWUpe2NvbnN0IGU9bmV3IE50KHt9KTt0W24uJGFwcGVuZENoaWxkXShlKSx0LnZhbHVlPWV9dC52YWx1ZVtuLiRzZXRWYWx1ZV0oZSl9fVtuLiRpc1RoZXJlTW9yZVdpZHRoXSgpe3JldHVybiB0aGlzLmxheW91dC5lbmRzV2l0aCgiLXRiIikmJjA9PT10aGlzW24uJGV4dHJhXS5hdHRlbXB0JiZ0aGlzW24uJGV4dHJhXS5udW1iZXJJbkxpbmU+MHx8dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kaXNUaGVyZU1vcmVXaWR0aF0oKX1bbi4kaXNTcGxpdHRhYmxlXSgpe3ZhciBlO2NvbnN0IHQ9dGhpc1tuLiRnZXRTdWJmb3JtUGFyZW50XSgpO3JldHVybiEhdFtuLiRpc1NwbGl0dGFibGVdKCkmJih2b2lkIDAhPT10aGlzW24uJGV4dHJhXS5faXNTcGxpdHRhYmxlP3RoaXNbbi4kZXh0cmFdLl9pc1NwbGl0dGFibGU6InBvc2l0aW9uIj09PXRoaXMubGF5b3V0fHx0aGlzLmxheW91dC5pbmNsdWRlcygicm93Iik/KHRoaXNbbi4kZXh0cmFdLl9pc1NwbGl0dGFibGU9ITEsITEpOiEobnVsbCE9PShlPXQubGF5b3V0KSYmdm9pZCAwIT09ZSYmZS5lbmRzV2l0aCgiLXRiIikmJjAhPT10W24uJGV4dHJhXS5udW1iZXJJbkxpbmV8fCh0aGlzW24uJGV4dHJhXS5faXNTcGxpdHRhYmxlPSEwLDApKSl9W24uJGZsdXNoSFRNTF0oKXtyZXR1cm4oMCxpLmZsdXNoSFRNTCkodGhpcyl9W24uJGFkZEhUTUxdKGUsdCl7KDAsaS5hZGRIVE1MKSh0aGlzLGUsdCl9W24uJGdldEF2YWlsYWJsZVNwYWNlXSgpe3JldHVybigwLGkuZ2V0QXZhaWxhYmxlU3BhY2UpKHRoaXMpfVtuLiR0b0hUTUxdKGUpe2lmKEEodGhpcyksImhpZGRlbiI9PT10aGlzLnByZXNlbmNlfHwiaW5hY3RpdmUiPT09dGhpcy5wcmVzZW5jZXx8MD09PXRoaXMuaHx8MD09PXRoaXMudylyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZOygwLHMuZml4RGltZW5zaW9ucykodGhpcyk7Y29uc3QgdD1bXSxyPXtpZDp0aGlzW24uJHVpZF0sY2xhc3M6W119OygwLHMuc2V0QWNjZXNzKSh0aGlzLHIuY2xhc3MpLHRoaXNbbi4kZXh0cmFdfHwodGhpc1tuLiRleHRyYV09T2JqZWN0LmNyZWF0ZShudWxsKSksT2JqZWN0LmFzc2lnbih0aGlzW24uJGV4dHJhXSx7Y2hpbGRyZW46dCxhdHRyaWJ1dGVzOnIsYXR0ZW1wdDowLGxpbmU6bnVsbCxudW1iZXJJbkxpbmU6MCxhdmFpbGFibGVTcGFjZTp7d2lkdGg6TWF0aC5taW4odGhpcy53fHwxLzAsZS53aWR0aCksaGVpZ2h0Ok1hdGgubWluKHRoaXMuaHx8MS8wLGUuaGVpZ2h0KX0sd2lkdGg6MCxoZWlnaHQ6MCxwcmV2SGVpZ2h0OjAsY3VycmVudFdpZHRoOjB9KTtjb25zdCBhPXRoaXNbbi4kaXNTcGxpdHRhYmxlXSgpO2lmKGF8fEYodGhpcyksISgwLGkuY2hlY2tEaW1lbnNpb25zKSh0aGlzLGUpKXJldHVybiBjLkhUTUxSZXN1bHQuRkFJTFVSRTtjb25zdCBvPW5ldyBTZXQoWyJmaWVsZCJdKTtpZih0aGlzLmxheW91dC5pbmNsdWRlcygicm93Iikpe2NvbnN0IGU9dGhpc1tuLiRnZXRTdWJmb3JtUGFyZW50XSgpLmNvbHVtbldpZHRocztBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD4wJiYodGhpc1tuLiRleHRyYV0uY29sdW1uV2lkdGhzPWUsdGhpc1tuLiRleHRyYV0uY3VycmVudENvbHVtbj0wKX1jb25zdCBsPSgwLHMudG9TdHlsZSkodGhpcywiYW5jaG9yVHlwZSIsImRpbWVuc2lvbnMiLCJwb3NpdGlvbiIsInByZXNlbmNlIiwiYm9yZGVyIiwibWFyZ2luIiwiaEFsaWduIiksaD1bInhmYUV4Y2xncm91cCJdLHU9KDAscy5sYXlvdXRDbGFzcykodGhpcyk7dSYmaC5wdXNoKHUpLCgwLHMuaXNQcmludE9ubHkpKHRoaXMpJiZoLnB1c2goInhmYVByaW50T25seSIpLHIuc3R5bGU9bCxyLmNsYXNzPWgsdGhpcy5uYW1lJiYoci54ZmFOYW1lPXRoaXMubmFtZSksdGhpc1tuLiRwdXNoUGFyYV0oKTtjb25zdCBkPSJsci10YiI9PT10aGlzLmxheW91dHx8InJsLXRiIj09PXRoaXMubGF5b3V0LGY9ZD8yOjE7Zm9yKDt0aGlzW24uJGV4dHJhXS5hdHRlbXB0PGY7dGhpc1tuLiRleHRyYV0uYXR0ZW1wdCsrKXtkJiYxPT09dGhpc1tuLiRleHRyYV0uYXR0ZW1wdCYmKHRoaXNbbi4kZXh0cmFdLm51bWJlckluTGluZT0wKTtjb25zdCBlPXRoaXNbbi4kY2hpbGRyZW5Ub0hUTUxdKHtmaWx0ZXI6byxpbmNsdWRlOiEwfSk7aWYoZS5zdWNjZXNzKWJyZWFrO2lmKGUuaXNCcmVhaygpKXJldHVybiB0aGlzW24uJHBvcFBhcmFdKCksZTtpZihkJiYwPT09dGhpc1tuLiRleHRyYV0uYXR0ZW1wdCYmMD09PXRoaXNbbi4kZXh0cmFdLm51bWJlckluTGluZSYmIXRoaXNbbi4kZ2V0VGVtcGxhdGVSb290XSgpW24uJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpe3RoaXNbbi4kZXh0cmFdLmF0dGVtcHQ9ZjticmVha319aWYodGhpc1tuLiRwb3BQYXJhXSgpLGF8fEkodGhpcyksdGhpc1tuLiRleHRyYV0uYXR0ZW1wdD09PWYpcmV0dXJuIGF8fGRlbGV0ZSB0aGlzW24uJGV4dHJhXSxjLkhUTUxSZXN1bHQuRkFJTFVSRTtsZXQgZz0wLHA9MDt0aGlzLm1hcmdpbiYmKGc9dGhpcy5tYXJnaW4ubGVmdEluc2V0K3RoaXMubWFyZ2luLnJpZ2h0SW5zZXQscD10aGlzLm1hcmdpbi50b3BJbnNldCt0aGlzLm1hcmdpbi5ib3R0b21JbnNldCk7Y29uc3QgbT1NYXRoLm1heCh0aGlzW24uJGV4dHJhXS53aWR0aCtnLHRoaXMud3x8MCksYj1NYXRoLm1heCh0aGlzW24uJGV4dHJhXS5oZWlnaHQrcCx0aGlzLmh8fDApLHk9W3RoaXMueCx0aGlzLnksbSxiXTsiIj09PXRoaXMudyYmKGwud2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKG0pKSwiIj09PXRoaXMuaCYmKGwuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKShiKSk7Y29uc3Qgdz17bmFtZToiZGl2IixhdHRyaWJ1dGVzOnIsY2hpbGRyZW46dH07cmV0dXJuIGsodGhpcyxyKSxkZWxldGUgdGhpc1tuLiRleHRyYV0sYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoKDAscy5jcmVhdGVXcmFwcGVyKSh0aGlzLHcpLHkpfX1jbGFzcyBBZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImV4ZWN1dGUiKSx0aGlzLmNvbm5lY3Rpb249ZS5jb25uZWN0aW9ufHwiIix0aGlzLmV4ZWN1dGVUeXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmV4ZWN1dGVUeXBlLFsiaW1wb3J0IiwicmVtZXJnZSJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucnVuQXQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucnVuQXQsWyJjbGllbnQiLCJib3RoIiwic2VydmVyIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3Mga2UgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJleHRyYXMiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmJvb2xlYW49bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5kYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZVRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5kZWNpbWFsPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXhEYXRhPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXh0cmFzPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZmxvYXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbWFnZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmludGVnZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50ZXh0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGltZT1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3MgQ2UgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJmaWVsZCIsITApLHRoaXMuYWNjZXNzPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFjY2VzcyxbIm9wZW4iLCJub25JbnRlcmFjdGl2ZSIsInByb3RlY3RlZCIsInJlYWRPbmx5Il0pLHRoaXMuYWNjZXNzS2V5PWUuYWNjZXNzS2V5fHwiIix0aGlzLmFuY2hvclR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYW5jaG9yVHlwZSxbInRvcExlZnQiLCJib3R0b21DZW50ZXIiLCJib3R0b21MZWZ0IiwiYm90dG9tUmlnaHQiLCJtaWRkbGVDZW50ZXIiLCJtaWRkbGVMZWZ0IiwibWlkZGxlUmlnaHQiLCJ0b3BDZW50ZXIiLCJ0b3BSaWdodCJdKSx0aGlzLmNvbFNwYW49KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmNvbFNwYW4sZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+ZT49MXx8LTE9PT1lfSksdGhpcy5oPWUuaD8oMCxjLmdldE1lYXN1cmVtZW50KShlLmgpOiIiLHRoaXMuaEFsaWduPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhBbGlnbixbImxlZnQiLCJjZW50ZXIiLCJqdXN0aWZ5IiwianVzdGlmeUFsbCIsInJhZGl4IiwicmlnaHQiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxvY2FsZT1lLmxvY2FsZXx8IiIsdGhpcy5tYXhIPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWF4SCwiMHB0IiksdGhpcy5tYXhXPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWF4VywiMHB0IiksdGhpcy5taW5IPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWluSCwiMHB0IiksdGhpcy5taW5XPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWluVywiMHB0IiksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKSx0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMucm90YXRlPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5yb3RhdGUsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+ZSU5MD09MH0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnc9ZS53PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudyk6IiIsdGhpcy54PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueCwiMHB0IiksdGhpcy55PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueSwiMHB0IiksdGhpcy5hc3Npc3Q9bnVsbCx0aGlzLmJpbmQ9bnVsbCx0aGlzLmJvcmRlcj1udWxsLHRoaXMuY2FsY3VsYXRlPW51bGwsdGhpcy5jYXB0aW9uPW51bGwsdGhpcy5kZXNjPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLmZvbnQ9bnVsbCx0aGlzLmZvcm1hdD1udWxsLHRoaXMuaXRlbXM9bmV3IG8uWEZBT2JqZWN0QXJyYXkoMiksdGhpcy5rZWVwPW51bGwsdGhpcy5tYXJnaW49bnVsbCx0aGlzLnBhcmE9bnVsbCx0aGlzLnRyYXZlcnNhbD1udWxsLHRoaXMudWk9bnVsbCx0aGlzLnZhbGlkYXRlPW51bGwsdGhpcy52YWx1ZT1udWxsLHRoaXMuYmluZEl0ZW1zPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29ubmVjdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV2ZW50PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc2V0UHJvcGVydHk9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJGlzQmluZGFibGVdKCl7cmV0dXJuITB9W24uJHNldFZhbHVlXShlKXt2KHRoaXMsZSl9W24uJHRvSFRNTF0oZSl7dmFyIHQscjtpZihBKHRoaXMpLCF0aGlzLnVpKXtsZXQgZTtzd2l0Y2godGhpcy51aT1uZXcgUHQoe30pLHRoaXMudWlbbi4kZ2xvYmFsRGF0YV09dGhpc1tuLiRnbG9iYWxEYXRhXSx0aGlzW24uJGFwcGVuZENoaWxkXSh0aGlzLnVpKSx0aGlzLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCl7Y2FzZSAwOmU9bmV3IE90KHt9KSx0aGlzLnVpLnRleHRFZGl0PWU7YnJlYWs7Y2FzZSAxOmU9bmV3IEsoe30pLHRoaXMudWkuY2hlY2tCdXR0b249ZTticmVhaztjYXNlIDI6ZT1uZXcgWSh7fSksdGhpcy51aS5jaG9pY2VMaXN0PWV9dGhpcy51aVtuLiRhcHBlbmRDaGlsZF0oZSl9aWYoIXRoaXMudWl8fCJoaWRkZW4iPT09dGhpcy5wcmVzZW5jZXx8ImluYWN0aXZlIj09PXRoaXMucHJlc2VuY2V8fDA9PT10aGlzLmh8fDA9PT10aGlzLncpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTt0aGlzLmNhcHRpb24mJmRlbGV0ZSB0aGlzLmNhcHRpb25bbi4kZXh0cmFdLHRoaXNbbi4kcHVzaFBhcmFdKCk7Y29uc3QgYT10aGlzLmNhcHRpb24/dGhpcy5jYXB0aW9uW24uJHRvSFRNTF0oZSkuaHRtbDpudWxsLG89dGhpcy53LGw9dGhpcy5oO2xldCB1PTAsZD0wO3RoaXMubWFyZ2luJiYodT10aGlzLm1hcmdpbi5sZWZ0SW5zZXQrdGhpcy5tYXJnaW4ucmlnaHRJbnNldCxkPXRoaXMubWFyZ2luLnRvcEluc2V0K3RoaXMubWFyZ2luLmJvdHRvbUluc2V0KTtsZXQgZj1udWxsO2lmKCIiPT09dGhpcy53fHwiIj09PXRoaXMuaCl7bGV0IHQ9bnVsbCxyPW51bGwsYT0wLGk9MDtpZih0aGlzLnVpLmNoZWNrQnV0dG9uKWE9aT10aGlzLnVpLmNoZWNrQnV0dG9uLnNpemU7ZWxzZXtjb25zdHt3OnQsaDpyfT0oMCxzLmxheW91dE5vZGUpKHRoaXMsZSk7bnVsbCE9PXQ/KGE9dCxpPXIpOmk9KDAsaC5nZXRNZXRyaWNzKSh0aGlzLmZvbnQsITApLmxpbmVOb0dhcH1pZihmPXkodGhpcy51aVtuLiRnZXRFeHRyYV0oKSksYSs9Zi53LGkrPWYuaCx0aGlzLmNhcHRpb24pe2NvbnN0e3c6cyxoOm8saXNCcm9rZW46bH09dGhpcy5jYXB0aW9uW24uJGdldEV4dHJhXShlKTtpZihsJiZ0aGlzW24uJGdldFN1YmZvcm1QYXJlbnRdKClbbi4kaXNUaGVyZU1vcmVXaWR0aF0oKSlyZXR1cm4gdGhpc1tuLiRwb3BQYXJhXSgpLGMuSFRNTFJlc3VsdC5GQUlMVVJFO3N3aXRjaCh0PXMscj1vLHRoaXMuY2FwdGlvbi5wbGFjZW1lbnQpe2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6Y2FzZSJpbmxpbmUiOnQrPWE7YnJlYWs7Y2FzZSJ0b3AiOmNhc2UiYm90dG9tIjpyKz1pfX1lbHNlIHQ9YSxyPWk7dCYmIiI9PT10aGlzLncmJih0Kz11LHRoaXMudz1NYXRoLm1pbih0aGlzLm1heFc8PTA/MS8wOnRoaXMubWF4Vyx0aGlzLm1pblcrMTx0P3Q6dGhpcy5taW5XKSksciYmIiI9PT10aGlzLmgmJihyKz1kLHRoaXMuaD1NYXRoLm1pbih0aGlzLm1heEg8PTA/MS8wOnRoaXMubWF4SCx0aGlzLm1pbkgrMTxyP3I6dGhpcy5taW5IKSl9aWYodGhpc1tuLiRwb3BQYXJhXSgpLCgwLHMuZml4RGltZW5zaW9ucykodGhpcyksRih0aGlzKSwhKDAsaS5jaGVja0RpbWVuc2lvbnMpKHRoaXMsZSkpcmV0dXJuIHRoaXMudz1vLHRoaXMuaD1sLHRoaXNbbi4kcG9wUGFyYV0oKSxjLkhUTUxSZXN1bHQuRkFJTFVSRTtJKHRoaXMpO2NvbnN0IGc9KDAscy50b1N0eWxlKSh0aGlzLCJmb250IiwiZGltZW5zaW9ucyIsInBvc2l0aW9uIiwicm90YXRlIiwiYW5jaG9yVHlwZSIsInByZXNlbmNlIiwibWFyZ2luIiwiaEFsaWduIik7KDAscy5zZXRNaW5NYXhEaW1lbnNpb25zKSh0aGlzLGcpO2NvbnN0IHA9WyJ4ZmFGaWVsZCJdO3RoaXMuZm9udCYmcC5wdXNoKCJ4ZmFGb250IiksKDAscy5pc1ByaW50T25seSkodGhpcykmJnAucHVzaCgieGZhUHJpbnRPbmx5Iik7Y29uc3QgbT17c3R5bGU6ZyxpZDp0aGlzW24uJHVpZF0sY2xhc3M6cH07Zy5tYXJnaW4mJihnLnBhZGRpbmc9Zy5tYXJnaW4sZGVsZXRlIGcubWFyZ2luKSwoMCxzLnNldEFjY2VzcykodGhpcyxwKSx0aGlzLm5hbWUmJihtLnhmYU5hbWU9dGhpcy5uYW1lKTtjb25zdCBiPVtdLHc9e25hbWU6ImRpdiIsYXR0cmlidXRlczptLGNoaWxkcmVuOmJ9O2sodGhpcyxtKTtjb25zdCB2PXRoaXMuYm9yZGVyP3RoaXMuYm9yZGVyW24uJHRvU3R5bGVdKCk6bnVsbCx4PSgwLHMuY29tcHV0ZUJib3gpKHRoaXMsdyxlKSxTPXRoaXMudWlbbi4kdG9IVE1MXSgpLmh0bWw7aWYoIVMpcmV0dXJuIE9iamVjdC5hc3NpZ24oZyx2KSxjLkhUTUxSZXN1bHQuc3VjY2VzcygoMCxzLmNyZWF0ZVdyYXBwZXIpKHRoaXMsdykseCk7dGhpc1tuLiR0YWJJbmRleF0mJihudWxsIT09KHQ9Uy5jaGlsZHJlbikmJnZvaWQgMCE9PXQmJnRbMF0/Uy5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLnRhYmluZGV4PXRoaXNbbi4kdGFiSW5kZXhdOlMuYXR0cmlidXRlcy50YWJpbmRleD10aGlzW24uJHRhYkluZGV4XSksUy5hdHRyaWJ1dGVzLnN0eWxlfHwoUy5hdHRyaWJ1dGVzLnN0eWxlPU9iamVjdC5jcmVhdGUobnVsbCkpO2xldCBDPW51bGw7aWYodGhpcy51aS5idXR0b24/KDE9PT1TLmNoaWxkcmVuLmxlbmd0aCYmKFtDXT1TLmNoaWxkcmVuLnNwbGljZSgwLDEpKSxPYmplY3QuYXNzaWduKFMuYXR0cmlidXRlcy5zdHlsZSx2KSk6T2JqZWN0LmFzc2lnbihnLHYpLGIucHVzaChTKSx0aGlzLnZhbHVlKWlmKHRoaXMudWkuaW1hZ2VFZGl0KVMuY2hpbGRyZW4ucHVzaCh0aGlzLnZhbHVlW24uJHRvSFRNTF0oKS5odG1sKTtlbHNlIGlmKCF0aGlzLnVpLmJ1dHRvbil7dmFyIE87bGV0IGU9IiI7aWYodGhpcy52YWx1ZS5leERhdGEpZT10aGlzLnZhbHVlLmV4RGF0YVtuLiR0ZXh0XSgpO2Vsc2UgaWYodGhpcy52YWx1ZS50ZXh0KWU9dGhpcy52YWx1ZS50ZXh0W24uJGdldEV4dHJhXSgpO2Vsc2V7Y29uc3QgdD10aGlzLnZhbHVlW24uJHRvSFRNTF0oKS5odG1sO251bGwhPT10JiYoZT10LmNoaWxkcmVuWzBdLnZhbHVlKX10aGlzLnVpLnRleHRFZGl0JiYobnVsbD09PShPPXRoaXMudmFsdWUudGV4dCl8fHZvaWQgMD09PU8/dm9pZCAwOk8ubWF4Q2hhcnMpJiYoUy5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLm1heExlbmd0aD10aGlzLnZhbHVlLnRleHQubWF4Q2hhcnMpLGUmJih0aGlzLnVpLm51bWVyaWNFZGl0JiYoZT1wYXJzZUZsb2F0KGUpLGU9aXNOYU4oZSk/IiI6ZS50b1N0cmluZygpKSwidGV4dGFyZWEiPT09Uy5jaGlsZHJlblswXS5uYW1lP1MuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy50ZXh0Q29udGVudD1lOlMuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy52YWx1ZT1lKX1pZighdGhpcy51aS5pbWFnZUVkaXQmJm51bGwhPT0ocj1TLmNoaWxkcmVuKSYmdm9pZCAwIT09ciYmclswXSYmdGhpcy5oKXtmPWZ8fHkodGhpcy51aVtuLiRnZXRFeHRyYV0oKSk7bGV0IHQ9MDtpZih0aGlzLmNhcHRpb24mJlsidG9wIiwiYm90dG9tIl0uaW5jbHVkZXModGhpcy5jYXB0aW9uLnBsYWNlbWVudCkpe3Q9dGhpcy5jYXB0aW9uLnJlc2VydmUsdDw9MCYmKHQ9dGhpcy5jYXB0aW9uW24uJGdldEV4dHJhXShlKS5oKTtjb25zdCByPXRoaXMuaC10LWQtZi5oO1MuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQ9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHIpfWVsc2UgUy5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLnN0eWxlLmhlaWdodD0iMTAwJSJ9aWYoQyYmUy5jaGlsZHJlbi5wdXNoKEMpLCFhKXJldHVybiBTLmF0dHJpYnV0ZXMuY2xhc3MmJlMuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFMZWZ0IiksdGhpcy53PW8sdGhpcy5oPWwsYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoKDAscy5jcmVhdGVXcmFwcGVyKSh0aGlzLHcpLHgpO2lmKHRoaXMudWkuYnV0dG9uKXJldHVybiBnLnBhZGRpbmcmJmRlbGV0ZSBnLnBhZGRpbmcsImRpdiI9PT1hLm5hbWUmJihhLm5hbWU9InNwYW4iKSxTLmNoaWxkcmVuLnB1c2goYSksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Modyx4KTtzd2l0Y2godGhpcy51aS5jaGVja0J1dHRvbiYmKGEuYXR0cmlidXRlcy5jbGFzc1swXT0ieGZhQ2FwdGlvbkZvckNoZWNrQnV0dG9uIiksUy5hdHRyaWJ1dGVzLmNsYXNzfHwoUy5hdHRyaWJ1dGVzLmNsYXNzPVtdKSxTLmNoaWxkcmVuLnNwbGljZSgwLDAsYSksdGhpcy5jYXB0aW9uLnBsYWNlbWVudCl7Y2FzZSJsZWZ0IjpjYXNlImlubGluZSI6Uy5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTticmVhaztjYXNlInJpZ2h0IjpTLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhUmlnaHQiKTticmVhaztjYXNlInRvcCI6Uy5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYVRvcCIpO2JyZWFrO2Nhc2UiYm90dG9tIjpTLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhQm90dG9tIil9cmV0dXJuIHRoaXMudz1vLHRoaXMuaD1sLGMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyx3KSx4KX19dC5GaWVsZD1DZTtjbGFzcyBPZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImZpbGwiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucHJlc2VuY2U9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJlc2VuY2UsWyJ2aXNpYmxlIiwiaGlkZGVuIiwiaW5hY3RpdmUiLCJpbnZpc2libGUiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuY29sb3I9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMubGluZWFyPW51bGwsdGhpcy5wYXR0ZXJuPW51bGwsdGhpcy5yYWRpYWw9bnVsbCx0aGlzLnNvbGlkPW51bGwsdGhpcy5zdGlwcGxlPW51bGx9W24uJHRvU3R5bGVdKCl7dmFyIGU7Y29uc3QgdD10aGlzW24uJGdldFBhcmVudF0oKSxyPXRbbi4kZ2V0UGFyZW50XSgpW24uJGdldFBhcmVudF0oKSxhPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IGk9ImNvbG9yIixzPWk7dCBpbnN0YW5jZW9mIFUmJihpPSJiYWNrZ3JvdW5kLWNvbG9yIixzPSJiYWNrZ3JvdW5kIixyIGluc3RhbmNlb2YgUHQmJihhLmJhY2tncm91bmRDb2xvcj0id2hpdGUiKSksKHQgaW5zdGFuY2VvZiBsdHx8dCBpbnN0YW5jZW9mIFApJiYoaT1zPSJmaWxsIixhLmZpbGw9IndoaXRlIik7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2lmKCJleHRyYXMiPT09ZXx8ImNvbG9yIj09PWUpY29udGludWU7Y29uc3QgdD10aGlzW2VdO2lmKCEodCBpbnN0YW5jZW9mIG8uWEZBT2JqZWN0KSljb250aW51ZTtjb25zdCByPXRbbi4kdG9TdHlsZV0odGhpcy5jb2xvcik7cmV0dXJuIHImJihhW3Iuc3RhcnRzV2l0aCgiIyIpP2k6c109ciksYX1pZihudWxsIT09KGU9dGhpcy5jb2xvcikmJnZvaWQgMCE9PWUmJmUudmFsdWUpe2NvbnN0IGU9dGhpcy5jb2xvcltuLiR0b1N0eWxlXSgpO2FbZS5zdGFydHNXaXRoKCIjIik/aTpzXT1lfXJldHVybiBhfX1jbGFzcyBGZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImZpbHRlciIsITApLHRoaXMuYWRkUmV2b2NhdGlvbkluZm89KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYWRkUmV2b2NhdGlvbkluZm8sWyIiLCJyZXF1aXJlZCIsIm9wdGlvbmFsIiwibm9uZSJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnZlcnNpb249KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTp0aGlzLnZlcnNpb24sZGVmYXVsdFZhbHVlOjUsdmFsaWRhdGU6ZT0+ZT49MSYmZTw9NX0pLHRoaXMuYXBwZWFyYW5jZUZpbHRlcj1udWxsLHRoaXMuY2VydGlmaWNhdGVzPW51bGwsdGhpcy5kaWdlc3RNZXRob2RzPW51bGwsdGhpcy5lbmNvZGluZ3M9bnVsbCx0aGlzLmVuY3J5cHRpb25NZXRob2RzPW51bGwsdGhpcy5oYW5kbGVyPW51bGwsdGhpcy5sb2NrRG9jdW1lbnQ9bnVsbCx0aGlzLm1kcD1udWxsLHRoaXMucmVhc29ucz1udWxsLHRoaXMudGltZVN0YW1wPW51bGx9fWNsYXNzIEllIGV4dGVuZHMgby5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImZsb2F0IiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGZpbmFsaXplXSgpe2NvbnN0IGU9cGFyc2VGbG9hdCh0aGlzW24uJGNvbnRlbnRdLnRyaW0oKSk7dGhpc1tuLiRjb250ZW50XT1pc05hTihlKT9udWxsOmV9W24uJHRvSFRNTF0oZSl7cmV0dXJuIE8obnVsbCE9PXRoaXNbbi4kY29udGVudF0/dGhpc1tuLiRjb250ZW50XS50b1N0cmluZygpOiIiKX19Y2xhc3MgVGUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJmb250IiwhMCksdGhpcy5iYXNlbGluZVNoaWZ0PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUuYmFzZWxpbmVTaGlmdCksdGhpcy5mb250SG9yaXpvbnRhbFNjYWxlPSgwLGMuZ2V0RmxvYXQpKHtkYXRhOmUuZm9udEhvcml6b250YWxTY2FsZSxkZWZhdWx0VmFsdWU6MTAwLHZhbGlkYXRlOmU9PmU+PTB9KSx0aGlzLmZvbnRWZXJ0aWNhbFNjYWxlPSgwLGMuZ2V0RmxvYXQpKHtkYXRhOmUuZm9udFZlcnRpY2FsU2NhbGUsZGVmYXVsdFZhbHVlOjEwMCx2YWxpZGF0ZTplPT5lPj0wfSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmtlcm5pbmdNb2RlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmtlcm5pbmdNb2RlLFsibm9uZSIsInBhaXIiXSksdGhpcy5sZXR0ZXJTcGFjaW5nPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubGV0dGVyU3BhY2luZywiMCIpLHRoaXMubGluZVRocm91Z2g9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmxpbmVUaHJvdWdoLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfHwyPT09ZX0pLHRoaXMubGluZVRocm91Z2hQZXJpb2Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubGluZVRocm91Z2hQZXJpb2QsWyJhbGwiLCJ3b3JkIl0pLHRoaXMub3ZlcmxpbmU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLm92ZXJsaW5lLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfHwyPT09ZX0pLHRoaXMub3ZlcmxpbmVQZXJpb2Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUub3ZlcmxpbmVQZXJpb2QsWyJhbGwiLCJ3b3JkIl0pLHRoaXMucG9zdHVyZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wb3N0dXJlLFsibm9ybWFsIiwiaXRhbGljIl0pLHRoaXMuc2l6ZT0oMCxjLmdldE1lYXN1cmVtZW50KShlLnNpemUsIjEwcHQiKSx0aGlzLnR5cGVmYWNlPWUudHlwZWZhY2V8fCJDb3VyaWVyIix0aGlzLnVuZGVybGluZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUudW5kZXJsaW5lLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfHwyPT09ZX0pLHRoaXMudW5kZXJsaW5lUGVyaW9kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnVuZGVybGluZVBlcmlvZCxbImFsbCIsIndvcmQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMud2VpZ2h0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLndlaWdodCxbIm5vcm1hbCIsImJvbGQiXSksdGhpcy5leHRyYXM9bnVsbCx0aGlzLmZpbGw9bnVsbH1bbi4kY2xlYW5dKGUpe3N1cGVyW24uJGNsZWFuXShlKSx0aGlzW24uJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMuYWRkKHRoaXMudHlwZWZhY2UpfVtuLiR0b1N0eWxlXSgpe2NvbnN0IGU9KDAscy50b1N0eWxlKSh0aGlzLCJmaWxsIiksdD1lLmNvbG9yO3JldHVybiB0JiYoIiMwMDAwMDAiPT09dD9kZWxldGUgZS5jb2xvcjp0LnN0YXJ0c1dpdGgoIiMiKXx8KGUuYmFja2dyb3VuZD10LGUuYmFja2dyb3VuZENsaXA9InRleHQiLGUuY29sb3I9InRyYW5zcGFyZW50IikpLHRoaXMuYmFzZWxpbmVTaGlmdCYmKGUudmVydGljYWxBbGlnbj0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5iYXNlbGluZVNoaWZ0KSksZS5mb250S2VybmluZz0ibm9uZSI9PT10aGlzLmtlcm5pbmdNb2RlPyJub25lIjoibm9ybWFsIixlLmxldHRlclNwYWNpbmc9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubGV0dGVyU3BhY2luZyksMCE9PXRoaXMubGluZVRocm91Z2gmJihlLnRleHREZWNvcmF0aW9uPSJsaW5lLXRocm91Z2giLDI9PT10aGlzLmxpbmVUaHJvdWdoJiYoZS50ZXh0RGVjb3JhdGlvblN0eWxlPSJkb3VibGUiKSksMCE9PXRoaXMub3ZlcmxpbmUmJihlLnRleHREZWNvcmF0aW9uPSJvdmVybGluZSIsMj09PXRoaXMub3ZlcmxpbmUmJihlLnRleHREZWNvcmF0aW9uU3R5bGU9ImRvdWJsZSIpKSxlLmZvbnRTdHlsZT10aGlzLnBvc3R1cmUsZS5mb250U2l6ZT0oMCxzLm1lYXN1cmVUb1N0cmluZykoLjk5KnRoaXMuc2l6ZSksKDAscy5zZXRGb250RmFtaWx5KSh0aGlzLHRoaXMsdGhpc1tuLiRnbG9iYWxEYXRhXS5mb250RmluZGVyLGUpLDAhPT10aGlzLnVuZGVybGluZSYmKGUudGV4dERlY29yYXRpb249InVuZGVybGluZSIsMj09PXRoaXMudW5kZXJsaW5lJiYoZS50ZXh0RGVjb3JhdGlvblN0eWxlPSJkb3VibGUiKSksZS5mb250V2VpZ2h0PXRoaXMud2VpZ2h0LGV9fWNsYXNzIE1lIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiZm9ybWF0IiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbCx0aGlzLnBpY3R1cmU9bnVsbH19Y2xhc3MgRWUgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJoYW5kbGVyIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBQZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImh5cGhlbmF0aW9uIiksdGhpcy5leGNsdWRlQWxsQ2Fwcz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZXhjbHVkZUFsbENhcHMsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmV4Y2x1ZGVJbml0aWFsQ2FwPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5leGNsdWRlSW5pdGlhbENhcCxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pLHRoaXMuaHlwaGVuYXRlPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5oeXBoZW5hdGUsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucHVzaENoYXJhY3RlckNvdW50PSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5wdXNoQ2hhcmFjdGVyQ291bnQsZGVmYXVsdFZhbHVlOjMsdmFsaWRhdGU6ZT0+ZT49MH0pLHRoaXMucmVtYWluQ2hhcmFjdGVyQ291bnQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnJlbWFpbkNoYXJhY3RlckNvdW50LGRlZmF1bHRWYWx1ZTozLHZhbGlkYXRlOmU9PmU+PTB9KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy53b3JkQ2hhcmFjdGVyQ291bnQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLndvcmRDaGFyYWN0ZXJDb3VudCxkZWZhdWx0VmFsdWU6Nyx2YWxpZGF0ZTplPT5lPj0wfSl9fWNsYXNzIFJlIGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiaW1hZ2UiKSx0aGlzLmFzcGVjdD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hc3BlY3QsWyJmaXQiLCJhY3R1YWwiLCJoZWlnaHQiLCJub25lIiwid2lkdGgiXSksdGhpcy5jb250ZW50VHlwZT1lLmNvbnRlbnRUeXBlfHwiIix0aGlzLmhyZWY9ZS5ocmVmfHwiIix0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudHJhbnNmZXJFbmNvZGluZz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50cmFuc2ZlckVuY29kaW5nLFsiYmFzZTY0Iiwibm9uZSIsInBhY2thZ2UiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiR0b0hUTUxdKCl7aWYodGhpcy5jb250ZW50VHlwZSYmIW0uaGFzKHRoaXMuY29udGVudFR5cGUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWTtsZXQgZT10aGlzW24uJGdsb2JhbERhdGFdLmltYWdlcyYmdGhpc1tuLiRnbG9iYWxEYXRhXS5pbWFnZXMuZ2V0KHRoaXMuaHJlZik7aWYoIWUmJih0aGlzLmhyZWZ8fCF0aGlzW24uJGNvbnRlbnRdKSlyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZO2lmKGV8fCJiYXNlNjQiIT09dGhpcy50cmFuc2ZlckVuY29kaW5nfHwoZT0oMCxsLnN0cmluZ1RvQnl0ZXMpKGF0b2IodGhpc1tuLiRjb250ZW50XSkpKSwhZSlyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZO2lmKCF0aGlzLmNvbnRlbnRUeXBlKXtmb3IoY29uc3RbdCxyXW9mIGIpaWYoZS5sZW5ndGg+dC5sZW5ndGgmJnQuZXZlcnkoKCh0LHIpPT50PT09ZVtyXSkpKXt0aGlzLmNvbnRlbnRUeXBlPXI7YnJlYWt9aWYoIXRoaXMuY29udGVudFR5cGUpcmV0dXJuIGMuSFRNTFJlc3VsdC5FTVBUWX1jb25zdCB0PW5ldyBCbG9iKFtlXSx7dHlwZTp0aGlzLmNvbnRlbnRUeXBlfSk7bGV0IHI7c3dpdGNoKHRoaXMuYXNwZWN0KXtjYXNlImZpdCI6Y2FzZSJhY3R1YWwiOmJyZWFrO2Nhc2UiaGVpZ2h0IjpyPXtoZWlnaHQ6IjEwMCUiLG9iamVjdEZpdDoiZmlsbCJ9O2JyZWFrO2Nhc2Uibm9uZSI6cj17d2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIsb2JqZWN0Rml0OiJmaWxsIn07YnJlYWs7Y2FzZSJ3aWR0aCI6cj17d2lkdGg6IjEwMCUiLG9iamVjdEZpdDoiZmlsbCJ9fWNvbnN0IGE9dGhpc1tuLiRnZXRQYXJlbnRdKCk7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJpbWciLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhSW1hZ2UiXSxzdHlsZTpyLHNyYzpVUkwuY3JlYXRlT2JqZWN0VVJMKHQpLGFsdDphP0MoYVtuLiRnZXRQYXJlbnRdKCkpOm51bGx9fSl9fWNsYXNzIE5lIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiaW1hZ2VFZGl0IiwhMCksdGhpcy5kYXRhPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmRhdGEsWyJsaW5rIiwiZW1iZWQiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib3JkZXI9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMubWFyZ2luPW51bGx9W24uJHRvSFRNTF0oZSl7cmV0dXJuImVtYmVkIj09PXRoaXMuZGF0YT9jLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixjaGlsZHJlbjpbXSxhdHRyaWJ1dGVzOnt9fSk6Yy5IVE1MUmVzdWx0LkVNUFRZfX1jbGFzcyBEZSBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJpbnRlZ2VyIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGZpbmFsaXplXSgpe2NvbnN0IGU9cGFyc2VJbnQodGhpc1tuLiRjb250ZW50XS50cmltKCksMTApO3RoaXNbbi4kY29udGVudF09aXNOYU4oZSk/bnVsbDplfVtuLiR0b0hUTUxdKGUpe3JldHVybiBPKG51bGwhPT10aGlzW24uJGNvbnRlbnRdP3RoaXNbbi4kY29udGVudF0udG9TdHJpbmcoKToiIil9fWNsYXNzIEJlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwiaXNzdWVycyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNlcnRpZmljYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBMZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIml0ZW1zIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnByZXNlbmNlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnByZXNlbmNlLFsidmlzaWJsZSIsImhpZGRlbiIsImluYWN0aXZlIiwiaW52aXNpYmxlIl0pLHRoaXMucmVmPWUucmVmfHwiIix0aGlzLnNhdmU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLnNhdmUsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW1hZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbnRlZ2VyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGV4dD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnRpbWU9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJHRvSFRNTF0oKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IG9mIHRoaXNbbi4kZ2V0Q2hpbGRyZW5dKCkpZS5wdXNoKHRbbi4kdGV4dF0oKSk7cmV0dXJuIGMuSFRNTFJlc3VsdC5zdWNjZXNzKGUpfX10Lkl0ZW1zPUxlO2NsYXNzIF9lIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwia2VlcCIsITApLHRoaXMuaWQ9ZS5pZHx8IiI7Y29uc3QgdD1bIm5vbmUiLCJjb250ZW50QXJlYSIsInBhZ2VBcmVhIl07dGhpcy5pbnRhY3Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaW50YWN0LHQpLHRoaXMubmV4dD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5uZXh0LHQpLHRoaXMucHJldmlvdXM9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucHJldmlvdXMsdCksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGx9fWNsYXNzIGplIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwia2V5VXNhZ2UiKTtjb25zdCB0PVsiIiwieWVzIiwibm8iXTt0aGlzLmNybFNpZ249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuY3JsU2lnbix0KSx0aGlzLmRhdGFFbmNpcGhlcm1lbnQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuZGF0YUVuY2lwaGVybWVudCx0KSx0aGlzLmRlY2lwaGVyT25seT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5kZWNpcGhlck9ubHksdCksdGhpcy5kaWdpdGFsU2lnbmF0dXJlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmRpZ2l0YWxTaWduYXR1cmUsdCksdGhpcy5lbmNpcGhlck9ubHk9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuZW5jaXBoZXJPbmx5LHQpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5rZXlBZ3JlZW1lbnQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUua2V5QWdyZWVtZW50LHQpLHRoaXMua2V5Q2VydFNpZ249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUua2V5Q2VydFNpZ24sdCksdGhpcy5rZXlFbmNpcGhlcm1lbnQ9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUua2V5RW5jaXBoZXJtZW50LHQpLHRoaXMubm9uUmVwdWRpYXRpb249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubm9uUmVwdWRpYXRpb24sdCksdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgVWUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJsaW5lIiwhMCksdGhpcy5oYW5kPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhhbmQsWyJldmVuIiwibGVmdCIsInJpZ2h0Il0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5zbG9wZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5zbG9wZSxbIlxcIiwiLyJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5lZGdlPW51bGx9W24uJHRvSFRNTF0oKXtjb25zdCBlPXRoaXNbbi4kZ2V0UGFyZW50XSgpW24uJGdldFBhcmVudF0oKSx0PXRoaXMuZWRnZXx8bmV3IHVlKHt9KSxyPXRbbi4kdG9TdHlsZV0oKSxhPU9iamVjdC5jcmVhdGUobnVsbCksaT0idmlzaWJsZSI9PT10LnByZXNlbmNlP3QudGhpY2tuZXNzOjA7YS5zdHJva2VXaWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykoaSksYS5zdHJva2U9ci5jb2xvcjtsZXQgbyxsLGgsdSxkPSIxMDAlIixmPSIxMDAlIjtlLnc8PWk/KFtvLGwsaCx1XT1bIjUwJSIsMCwiNTAlIiwiMTAwJSJdLGQ9YS5zdHJva2VXaWR0aCk6ZS5oPD1pPyhbbyxsLGgsdV09WzAsIjUwJSIsIjEwMCUiLCI1MCUiXSxmPWEuc3Ryb2tlV2lkdGgpOiJcXCI9PT10aGlzLnNsb3BlP1tvLGwsaCx1XT1bMCwwLCIxMDAlIiwiMTAwJSJdOltvLGwsaCx1XT1bMCwiMTAwJSIsIjEwMCUiLDBdO2NvbnN0IHA9e25hbWU6InN2ZyIsY2hpbGRyZW46W3tuYW1lOiJsaW5lIixhdHRyaWJ1dGVzOnt4bWxuczpnLHgxOm8seTE6bCx4MjpoLHkyOnUsc3R5bGU6YX19XSxhdHRyaWJ1dGVzOnt4bWxuczpnLHdpZHRoOmQsaGVpZ2h0OmYsc3R5bGU6e292ZXJmbG93OiJ2aXNpYmxlIn19fTtyZXR1cm4gdyhlKT9jLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixhdHRyaWJ1dGVzOntzdHlsZTp7ZGlzcGxheToiaW5saW5lIix3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn19LGNoaWxkcmVuOltwXX0pOihwLmF0dHJpYnV0ZXMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixjLkhUTUxSZXN1bHQuc3VjY2VzcyhwKSl9fWNsYXNzICRlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibGluZWFyIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbInRvUmlnaHQiLCJ0b0JvdHRvbSIsInRvTGVmdCIsInRvVG9wIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNvbG9yPW51bGwsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9TdHlsZV0oZSl7cmV0dXJuIGU9ZT9lW24uJHRvU3R5bGVdKCk6IiNGRkZGRkYiLCJsaW5lYXItZ3JhZGllbnQoIi5jb25jYXQodGhpcy50eXBlLnJlcGxhY2UoLyhbUkJMVF0pLywiICQxIikudG9Mb3dlckNhc2UoKSwiLCAiKS5jb25jYXQoZSwiLCAiKS5jb25jYXQodGhpcy5jb2xvcj90aGlzLmNvbG9yW24uJHRvU3R5bGVdKCk6IiMwMDAwMDAiLCIpIil9fWNsYXNzIFhlIGV4dGVuZHMgby5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsImxvY2tEb2N1bWVudCIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bbi4kZmluYWxpemVdKCl7dGhpc1tuLiRjb250ZW50XT0oMCxjLmdldFN0cmluZ09wdGlvbikodGhpc1tuLiRjb250ZW50XSxbImF1dG8iLCIwIiwiMSJdKX19Y2xhc3MgSGUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJtYW5pZmVzdCIsITApLHRoaXMuYWN0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmFjdGlvbixbImluY2x1ZGUiLCJhbGwiLCJleGNsdWRlIl0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5yZWY9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIHFlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibWFyZ2luIiwhMCksdGhpcy5ib3R0b21JbnNldD0oMCxjLmdldE1lYXN1cmVtZW50KShlLmJvdHRvbUluc2V0LCIwIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxlZnRJbnNldD0oMCxjLmdldE1lYXN1cmVtZW50KShlLmxlZnRJbnNldCwiMCIpLHRoaXMucmlnaHRJbnNldD0oMCxjLmdldE1lYXN1cmVtZW50KShlLnJpZ2h0SW5zZXQsIjAiKSx0aGlzLnRvcEluc2V0PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudG9wSW5zZXQsIjAiKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9TdHlsZV0oKXtyZXR1cm57bWFyZ2luOigwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnRvcEluc2V0KSsiICIrKDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMucmlnaHRJbnNldCkrIiAiKygwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLmJvdHRvbUluc2V0KSsiICIrKDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubGVmdEluc2V0KX19fWNsYXNzIHplIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibWRwIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnBlcm1pc3Npb25zPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5wZXJtaXNzaW9ucyxkZWZhdWx0VmFsdWU6Mix2YWxpZGF0ZTplPT4xPT09ZXx8Mz09PWV9KSx0aGlzLnNpZ25hdHVyZVR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc2lnbmF0dXJlVHlwZSxbImZpbGxlciIsImF1dGhvciJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIEdlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibWVkaXVtIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmltYWdpbmdCQm94PSgwLGMuZ2V0QkJveCkoZS5pbWFnaW5nQkJveCksdGhpcy5sb25nPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubG9uZyksdGhpcy5vcmllbnRhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vcmllbnRhdGlvbixbInBvcnRyYWl0IiwibGFuZHNjYXBlIl0pLHRoaXMuc2hvcnQ9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5zaG9ydCksdGhpcy5zdG9jaz1lLnN0b2NrfHwiIix0aGlzLnRyYXlJbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50cmF5SW4sWyJhdXRvIiwiZGVsZWdhdGUiLCJwYWdlRnJvbnQiXSksdGhpcy50cmF5T3V0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnRyYXlPdXQsWyJhdXRvIiwiZGVsZWdhdGUiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBXZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIm1lc3NhZ2UiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnRleHQ9bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIFZlIGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwibnVtZXJpY0VkaXQiLCEwKSx0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmJvcmRlcj1udWxsLHRoaXMuY29tYj1udWxsLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5tYXJnaW49bnVsbH1bbi4kdG9IVE1MXShlKXt2YXIgdDtjb25zdCByPSgwLHMudG9TdHlsZSkodGhpcywiYm9yZGVyIiwiZm9udCIsIm1hcmdpbiIpLGE9dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kZ2V0UGFyZW50XSgpLGk9e25hbWU6ImlucHV0IixhdHRyaWJ1dGVzOnt0eXBlOiJ0ZXh0IixmaWVsZElkOmFbbi4kdWlkXSxkYXRhSWQ6KG51bGw9PT0odD1hW24uJGRhdGFdKXx8dm9pZCAwPT09dD92b2lkIDA6dFtuLiR1aWRdKXx8YVtuLiR1aWRdLGNsYXNzOlsieGZhVGV4dGZpZWxkIl0sc3R5bGU6ciwiYXJpYS1sYWJlbCI6QyhhKSwiYXJpYS1yZXF1aXJlZCI6ITF9fTtyZXR1cm4gUyhhKSYmKGkuYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdPSEwLGkuYXR0cmlidXRlcy5yZXF1aXJlZD0hMCksYy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImxhYmVsIixhdHRyaWJ1dGVzOntjbGFzczpbInhmYUxhYmVsIl19LGNoaWxkcmVuOltpXX0pfX1jbGFzcyBLZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIm9jY3VyIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmluaXRpYWw9IiIhPT1lLmluaXRpYWw/KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmluaXRpYWwsZGVmYXVsdFZhbHVlOiIiLHZhbGlkYXRlOmU9PiEwfSk6IiIsdGhpcy5tYXg9IiIhPT1lLm1heD8oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWF4LGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PiEwfSk6IiIsdGhpcy5taW49IiIhPT1lLm1pbj8oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWluLGRlZmF1bHRWYWx1ZToxLHZhbGlkYXRlOmU9PiEwfSk6IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGx9W24uJGNsZWFuXSgpe2NvbnN0IGU9dGhpc1tuLiRnZXRQYXJlbnRdKCksdD10aGlzLm1pbjsiIj09PXRoaXMubWluJiYodGhpcy5taW49ZSBpbnN0YW5jZW9mIFFlfHxlIGluc3RhbmNlb2YgZXQ/MDoxKSwiIj09PXRoaXMubWF4JiYodGhpcy5tYXg9IiI9PT10P2UgaW5zdGFuY2VvZiBRZXx8ZSBpbnN0YW5jZW9mIGV0Py0xOjE6dGhpcy5taW4pLC0xIT09dGhpcy5tYXgmJnRoaXMubWF4PHRoaXMubWluJiYodGhpcy5tYXg9dGhpcy5taW4pLCIiPT09dGhpcy5pbml0aWFsJiYodGhpcy5pbml0aWFsPWUgaW5zdGFuY2VvZiBrdD8xOnRoaXMubWluKX19Y2xhc3MgWWUgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJvaWQiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgSmUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJvaWRzIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMub2lkPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBaZSBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsIm92ZXJmbG93IiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxlYWRlcj1lLmxlYWRlcnx8IiIsdGhpcy50YXJnZXQ9ZS50YXJnZXR8fCIiLHRoaXMudHJhaWxlcj1lLnRyYWlsZXJ8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn1bbi4kZ2V0RXh0cmFdKCl7aWYoIXRoaXNbbi4kZXh0cmFdKXtjb25zdCBlPXRoaXNbbi4kZ2V0UGFyZW50XSgpLHQ9dGhpc1tuLiRnZXRUZW1wbGF0ZVJvb3RdKCkscj10W24uJHNlYXJjaE5vZGVdKHRoaXMudGFyZ2V0LGUpLGE9dFtuLiRzZWFyY2hOb2RlXSh0aGlzLmxlYWRlcixlKSxpPXRbbi4kc2VhcmNoTm9kZV0odGhpcy50cmFpbGVyLGUpO3RoaXNbbi4kZXh0cmFdPXt0YXJnZXQ6KG51bGw9PXI/dm9pZCAwOnJbMF0pfHxudWxsLGxlYWRlcjoobnVsbD09YT92b2lkIDA6YVswXSl8fG51bGwsdHJhaWxlcjoobnVsbD09aT92b2lkIDA6aVswXSl8fG51bGwsYWRkTGVhZGVyOiExLGFkZFRyYWlsZXI6ITF9fXJldHVybiB0aGlzW24uJGV4dHJhXX19Y2xhc3MgUWUgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJwYWdlQXJlYSIsITApLHRoaXMuYmxhbmtPck5vdEJsYW5rPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmJsYW5rT3JOb3RCbGFuayxbImFueSIsImJsYW5rIiwibm90QmxhbmsiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmluaXRpYWxOdW1iZXI9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmluaXRpYWxOdW1iZXIsZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+ITB9KSx0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLm51bWJlcmVkPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5udW1iZXJlZCxkZWZhdWx0VmFsdWU6MSx2YWxpZGF0ZTplPT4hMH0pLHRoaXMub2RkT3JFdmVuPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLm9kZE9yRXZlbixbImFueSIsImV2ZW4iLCJvZGQiXSksdGhpcy5wYWdlUG9zaXRpb249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUucGFnZVBvc2l0aW9uLFsiYW55IiwiZmlyc3QiLCJsYXN0Iiwib25seSIsInJlc3QiXSksdGhpcy5yZWxldmFudD0oMCxjLmdldFJlbGV2YW50KShlLnJlbGV2YW50KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5kZXNjPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm1lZGl1bT1udWxsLHRoaXMub2NjdXI9bnVsbCx0aGlzLmFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5jb250ZW50QXJlYT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRyYXc9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5leGNsR3JvdXA9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5maWVsZD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmZvcm09bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJGlzVXNhYmxlXSgpe3JldHVybiB0aGlzW24uJGV4dHJhXT8hdGhpcy5vY2N1cnx8LTE9PT10aGlzLm9jY3VyLm1heHx8dGhpc1tuLiRleHRyYV0ubnVtYmVyT2ZVc2U8dGhpcy5vY2N1ci5tYXg6KHRoaXNbbi4kZXh0cmFdPXtudW1iZXJPZlVzZTowfSwhMCl9W24uJGNsZWFuUGFnZV0oKXtkZWxldGUgdGhpc1tuLiRleHRyYV19W24uJGdldE5leHRQYWdlXSgpe3RoaXNbbi4kZXh0cmFdfHwodGhpc1tuLiRleHRyYV09e251bWJlck9mVXNlOjB9KTtjb25zdCBlPXRoaXNbbi4kZ2V0UGFyZW50XSgpO3JldHVybiJvcmRlcmVkT2NjdXJyZW5jZSI9PT1lLnJlbGF0aW9uJiZ0aGlzW24uJGlzVXNhYmxlXSgpPyh0aGlzW24uJGV4dHJhXS5udW1iZXJPZlVzZSs9MSx0aGlzKTplW24uJGdldE5leHRQYWdlXSgpfVtuLiRnZXRBdmFpbGFibGVTcGFjZV0oKXtyZXR1cm4gdGhpc1tuLiRleHRyYV0uc3BhY2V8fHt3aWR0aDowLGhlaWdodDowfX1bbi4kdG9IVE1MXSgpe3RoaXNbbi4kZXh0cmFdfHwodGhpc1tuLiRleHRyYV09e251bWJlck9mVXNlOjF9KTtjb25zdCBlPVtdO3RoaXNbbi4kZXh0cmFdLmNoaWxkcmVuPWU7Y29uc3QgdD1PYmplY3QuY3JlYXRlKG51bGwpO2lmKHRoaXMubWVkaXVtJiZ0aGlzLm1lZGl1bS5zaG9ydCYmdGhpcy5tZWRpdW0ubG9uZyl7aWYodC53aWR0aD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tZWRpdW0uc2hvcnQpLHQuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLm1lZGl1bS5sb25nKSx0aGlzW24uJGV4dHJhXS5zcGFjZT17d2lkdGg6dGhpcy5tZWRpdW0uc2hvcnQsaGVpZ2h0OnRoaXMubWVkaXVtLmxvbmd9LCJsYW5kc2NhcGUiPT09dGhpcy5tZWRpdW0ub3JpZW50YXRpb24pe2NvbnN0IGU9dC53aWR0aDt0LndpZHRoPXQuaGVpZ2h0LHQuaGVpZ2h0PWUsdGhpc1tuLiRleHRyYV0uc3BhY2U9e3dpZHRoOnRoaXMubWVkaXVtLmxvbmcsaGVpZ2h0OnRoaXMubWVkaXVtLnNob3J0fX19ZWxzZSgwLGwud2FybikoIlhGQSAtIE5vIG1lZGl1bSBzcGVjaWZpZWQgaW4gcGFnZUFyZWE6IHBsZWFzZSBmaWxlIGEgYnVnLiIpO3JldHVybiB0aGlzW24uJGNoaWxkcmVuVG9IVE1MXSh7ZmlsdGVyOm5ldyBTZXQoWyJhcmVhIiwiZHJhdyIsImZpZWxkIiwic3ViZm9ybSJdKSxpbmNsdWRlOiEwfSksdGhpc1tuLiRjaGlsZHJlblRvSFRNTF0oe2ZpbHRlcjpuZXcgU2V0KFsiY29udGVudEFyZWEiXSksaW5jbHVkZTohMH0pLGMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGNoaWxkcmVuOmUsYXR0cmlidXRlczp7Y2xhc3M6WyJ4ZmFQYWdlIl0saWQ6dGhpc1tuLiR1aWRdLHN0eWxlOnQseGZhTmFtZTp0aGlzLm5hbWV9fSl9fWNsYXNzIGV0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwicGFnZVNldCIsITApLHRoaXMuZHVwbGV4SW1wb3NpdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5kdXBsZXhJbXBvc2l0aW9uLFsibG9uZ0VkZ2UiLCJzaG9ydEVkZ2UiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnJlbGF0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnJlbGF0aW9uLFsib3JkZXJlZE9jY3VycmVuY2UiLCJkdXBsZXhQYWdpbmF0ZWQiLCJzaW1wbGV4UGFnaW5hdGVkIl0pLHRoaXMucmVsZXZhbnQ9KDAsYy5nZXRSZWxldmFudCkoZS5yZWxldmFudCksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5vY2N1cj1udWxsLHRoaXMucGFnZUFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5wYWdlU2V0PW5ldyBvLlhGQU9iamVjdEFycmF5fVtuLiRjbGVhblBhZ2VdKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5wYWdlQXJlYS5jaGlsZHJlbillW24uJGNsZWFuUGFnZV0oKTtmb3IoY29uc3QgZSBvZiB0aGlzLnBhZ2VTZXQuY2hpbGRyZW4pZVtuLiRjbGVhblBhZ2VdKCl9W24uJGlzVXNhYmxlXSgpe3JldHVybiF0aGlzLm9jY3VyfHwtMT09PXRoaXMub2NjdXIubWF4fHx0aGlzW24uJGV4dHJhXS5udW1iZXJPZlVzZTx0aGlzLm9jY3VyLm1heH1bbi4kZ2V0TmV4dFBhZ2VdKCl7aWYodGhpc1tuLiRleHRyYV18fCh0aGlzW24uJGV4dHJhXT17bnVtYmVyT2ZVc2U6MSxwYWdlSW5kZXg6LTEscGFnZVNldEluZGV4Oi0xfSksIm9yZGVyZWRPY2N1cnJlbmNlIj09PXRoaXMucmVsYXRpb24pe2lmKHRoaXNbbi4kZXh0cmFdLnBhZ2VJbmRleCsxPHRoaXMucGFnZUFyZWEuY2hpbGRyZW4ubGVuZ3RoKXJldHVybiB0aGlzW24uJGV4dHJhXS5wYWdlSW5kZXgrPTEsdGhpcy5wYWdlQXJlYS5jaGlsZHJlblt0aGlzW24uJGV4dHJhXS5wYWdlSW5kZXhdW24uJGdldE5leHRQYWdlXSgpO2lmKHRoaXNbbi4kZXh0cmFdLnBhZ2VTZXRJbmRleCsxPHRoaXMucGFnZVNldC5jaGlsZHJlbi5sZW5ndGgpcmV0dXJuIHRoaXNbbi4kZXh0cmFdLnBhZ2VTZXRJbmRleCs9MSx0aGlzLnBhZ2VTZXQuY2hpbGRyZW5bdGhpc1tuLiRleHRyYV0ucGFnZVNldEluZGV4XVtuLiRnZXROZXh0UGFnZV0oKTtpZih0aGlzW24uJGlzVXNhYmxlXSgpKXJldHVybiB0aGlzW24uJGV4dHJhXS5udW1iZXJPZlVzZSs9MSx0aGlzW24uJGV4dHJhXS5wYWdlSW5kZXg9LTEsdGhpc1tuLiRleHRyYV0ucGFnZVNldEluZGV4PS0xLHRoaXNbbi4kZ2V0TmV4dFBhZ2VdKCk7Y29uc3QgZT10aGlzW24uJGdldFBhcmVudF0oKTtyZXR1cm4gZSBpbnN0YW5jZW9mIGV0P2Vbbi4kZ2V0TmV4dFBhZ2VdKCk6KHRoaXNbbi4kY2xlYW5QYWdlXSgpLHRoaXNbbi4kZ2V0TmV4dFBhZ2VdKCkpfWNvbnN0IGU9dGhpc1tuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLnBhZ2VOdW1iZXIsdD1lJTI9PTA/ImV2ZW4iOiJvZGQiLHI9MD09PWU/ImZpcnN0IjoicmVzdCI7bGV0IGE9dGhpcy5wYWdlQXJlYS5jaGlsZHJlbi5maW5kKChlPT5lLm9kZE9yRXZlbj09PXQmJmUucGFnZVBvc2l0aW9uPT09cikpO3JldHVybiBhfHwoYT10aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmZpbmQoKGU9PiJhbnkiPT09ZS5vZGRPckV2ZW4mJmUucGFnZVBvc2l0aW9uPT09cikpLGF8fChhPXRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZCgoZT0+ImFueSI9PT1lLm9kZE9yRXZlbiYmImFueSI9PT1lLnBhZ2VQb3NpdGlvbikpLGF8fHRoaXMucGFnZUFyZWEuY2hpbGRyZW5bMF0pKX19Y2xhc3MgdHQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJwYXJhIiwhMCksdGhpcy5oQWxpZ249KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaEFsaWduLFsibGVmdCIsImNlbnRlciIsImp1c3RpZnkiLCJqdXN0aWZ5QWxsIiwicmFkaXgiLCJyaWdodCJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubGluZUhlaWdodD1lLmxpbmVIZWlnaHQ/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5saW5lSGVpZ2h0LCIwcHQiKToiIix0aGlzLm1hcmdpbkxlZnQ9ZS5tYXJnaW5MZWZ0PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWFyZ2luTGVmdCwiMHB0Iik6IiIsdGhpcy5tYXJnaW5SaWdodD1lLm1hcmdpblJpZ2h0PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWFyZ2luUmlnaHQsIjBwdCIpOiIiLHRoaXMub3JwaGFucz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUub3JwaGFucyxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT5lPj0wfSksdGhpcy5wcmVzZXJ2ZT1lLnByZXNlcnZlfHwiIix0aGlzLnJhZGl4T2Zmc2V0PWUucmFkaXhPZmZzZXQ/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5yYWRpeE9mZnNldCwiMHB0Iik6IiIsdGhpcy5zcGFjZUFib3ZlPWUuc3BhY2VBYm92ZT8oMCxjLmdldE1lYXN1cmVtZW50KShlLnNwYWNlQWJvdmUsIjBwdCIpOiIiLHRoaXMuc3BhY2VCZWxvdz1lLnNwYWNlQmVsb3c/KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5zcGFjZUJlbG93LCIwcHQiKToiIix0aGlzLnRhYkRlZmF1bHQ9ZS50YWJEZWZhdWx0PygwLGMuZ2V0TWVhc3VyZW1lbnQpKHRoaXMudGFiRGVmYXVsdCk6IiIsdGhpcy50YWJTdG9wcz0oZS50YWJTdG9wc3x8IiIpLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKCgoZSx0KT0+dCUyPT0xPygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUpOmUpKSx0aGlzLnRleHRJbmRlbnQ9ZS50ZXh0SW5kZW50PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudGV4dEluZGVudCwiMHB0Iik6IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMudkFsaWduPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnZBbGlnbixbInRvcCIsImJvdHRvbSIsIm1pZGRsZSJdKSx0aGlzLndpZG93cz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUud2lkb3dzLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PmU+PTB9KSx0aGlzLmh5cGhlbmF0aW9uPW51bGx9W24uJHRvU3R5bGVdKCl7Y29uc3QgZT0oMCxzLnRvU3R5bGUpKHRoaXMsImhBbGlnbiIpO3JldHVybiIiIT09dGhpcy5tYXJnaW5MZWZ0JiYoZS5wYWRkaW5nTGVmdD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tYXJnaW5MZWZ0KSksIiIhPT10aGlzLm1hcmdpblJpZ2h0JiYoZS5wYWRkaW5naWdodD0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tYXJnaW5SaWdodCkpLCIiIT09dGhpcy5zcGFjZUFib3ZlJiYoZS5wYWRkaW5nVG9wPSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnNwYWNlQWJvdmUpKSwiIiE9PXRoaXMuc3BhY2VCZWxvdyYmKGUucGFkZGluZ0JvdHRvbT0oMCxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5zcGFjZUJlbG93KSksIiIhPT10aGlzLnRleHRJbmRlbnQmJihlLnRleHRJbmRlbnQ9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMudGV4dEluZGVudCksKDAscy5maXhUZXh0SW5kZW50KShlKSksdGhpcy5saW5lSGVpZ2h0PjAmJihlLmxpbmVIZWlnaHQ9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubGluZUhlaWdodCkpLCIiIT09dGhpcy50YWJEZWZhdWx0JiYoZS50YWJTaXplPSgwLHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnRhYkRlZmF1bHQpKSx0aGlzLnRhYlN0b3BzLmxlbmd0aCx0aGlzLmh5cGhlbmF0YXRpb24mJk9iamVjdC5hc3NpZ24oZSx0aGlzLmh5cGhlbmF0YXRpb25bbi4kdG9TdHlsZV0oKSksZX19Y2xhc3MgcnQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJwYXNzd29yZEVkaXQiLCEwKSx0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucGFzc3dvcmRDaGFyPWUucGFzc3dvcmRDaGFyfHwiKiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuYm9yZGVyPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm1hcmdpbj1udWxsfX1jbGFzcyBudCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInBhdHRlcm4iLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsiY3Jvc3NIYXRjaCIsImNyb3NzRGlhZ29uYWwiLCJkaWFnb25hbExlZnQiLCJkaWFnb25hbFJpZ2h0IiwiaG9yaXpvbnRhbCIsInZlcnRpY2FsIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNvbG9yPW51bGwsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9TdHlsZV0oZSl7ZT1lP2Vbbi4kdG9TdHlsZV0oKToiI0ZGRkZGRiI7Y29uc3QgdD10aGlzLmNvbG9yP3RoaXMuY29sb3Jbbi4kdG9TdHlsZV0oKToiIzAwMDAwMCIscj0icmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCIsYT0iIi5jb25jYXQoZSwiLCIpLmNvbmNhdChlLCIgNXB4LCIpLmNvbmNhdCh0LCIgNXB4LCIpLmNvbmNhdCh0LCIgMTBweCIpO3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UiY3Jvc3NIYXRjaCI6cmV0dXJuIiIuY29uY2F0KHIsIih0byB0b3AsIikuY29uY2F0KGEsIikgIikuY29uY2F0KHIsIih0byByaWdodCwiKS5jb25jYXQoYSwiKSIpO2Nhc2UiY3Jvc3NEaWFnb25hbCI6cmV0dXJuIiIuY29uY2F0KHIsIig0NWRlZywiKS5jb25jYXQoYSwiKSAiKS5jb25jYXQociwiKC00NWRlZywiKS5jb25jYXQoYSwiKSIpO2Nhc2UiZGlhZ29uYWxMZWZ0IjpyZXR1cm4iIi5jb25jYXQociwiKDQ1ZGVnLCIpLmNvbmNhdChhLCIpIik7Y2FzZSJkaWFnb25hbFJpZ2h0IjpyZXR1cm4iIi5jb25jYXQociwiKC00NWRlZywiKS5jb25jYXQoYSwiKSIpO2Nhc2UiaG9yaXpvbnRhbCI6cmV0dXJuIiIuY29uY2F0KHIsIih0byB0b3AsIikuY29uY2F0KGEsIikiKTtjYXNlInZlcnRpY2FsIjpyZXR1cm4iIi5jb25jYXQociwiKHRvIHJpZ2h0LCIpLmNvbmNhdChhLCIpIil9cmV0dXJuIiJ9fWNsYXNzIGF0IGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwicGljdHVyZSIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBpdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInByb3RvIiwhMCksdGhpcy5hcHBlYXJhbmNlRmlsdGVyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYXJjPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYXJlYT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmFzc2lzdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJhcmNvZGU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5iaW5kSXRlbXM9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5ib29rZW5kPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYm9vbGVhbj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJvcmRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJyZWFrPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYnJlYWtBZnRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJyZWFrQmVmb3JlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYnV0dG9uPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY2FsY3VsYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY2FwdGlvbj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmNlcnRpZmljYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY2VydGlmaWNhdGVzPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY2hlY2tCdXR0b249bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5jaG9pY2VMaXN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29sb3I9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5jb21iPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29ubmVjdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmNvbnRlbnRBcmVhPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29ybmVyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZVRpbWVFZGl0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRlZmF1bHRVaT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRlc2M9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5kaWdlc3RNZXRob2Q9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5kaWdlc3RNZXRob2RzPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZHJhdz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmVkZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5lbmNvZGluZz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmVuY29kaW5ncz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmVuY3J5cHQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5lbmNyeXB0RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmVuY3J5cHRpb249bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5lbmNyeXB0aW9uTWV0aG9kPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZW5jcnlwdGlvbk1ldGhvZHM9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5ldmVudD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4T2JqZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXhjbEdyb3VwPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXhlY3V0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4dHJhcz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZpZWxkPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZmlsbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZpbHRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZm9udD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZvcm1hdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmhhbmRsZXI9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5oeXBoZW5hdGlvbj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmltYWdlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW1hZ2VFZGl0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW50ZWdlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmlzc3VlcnM9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pdGVtcz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmtlZXA9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5rZXlVc2FnZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmxpbmU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5saW5lYXI9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5sb2NrRG9jdW1lbnQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5tYW5pZmVzdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm1hcmdpbj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm1kcD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm1lZGl1bT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm1lc3NhZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5udW1lcmljRWRpdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm9jY3VyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMub2lkPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMub2lkcz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLm92ZXJmbG93PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucGFnZUFyZWE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5wYWdlU2V0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucGFyYT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnBhc3N3b3JkRWRpdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnBhdHRlcm49bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5waWN0dXJlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucmFkaWFsPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucmVhc29uPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMucmVhc29ucz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnJlY3RhbmdsZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnJlZj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnNjcmlwdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnNldFByb3BlcnR5PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc2lnbkRhdGE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zaWduYXR1cmU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zaWduaW5nPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc29saWQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zcGVhaz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN0aXBwbGU9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zdWJmb3JtPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc3ViZm9ybVNldD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmplY3RETj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmplY3RETnM9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zdWJtaXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50ZXh0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGV4dEVkaXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50aW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGltZVN0YW1wPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudG9vbFRpcD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnRyYXZlcnNhbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnRyYXZlcnNlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudWk9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy52YWxpZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnZhbHVlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudmFyaWFibGVzPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBzdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInJhZGlhbCIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJ0b0VkZ2UiLCJ0b0NlbnRlciJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5jb2xvcj1udWxsLHRoaXMuZXh0cmFzPW51bGx9W24uJHRvU3R5bGVdKGUpe2U9ZT9lW24uJHRvU3R5bGVdKCk6IiNGRkZGRkYiO2NvbnN0IHQ9dGhpcy5jb2xvcj90aGlzLmNvbG9yW24uJHRvU3R5bGVdKCk6IiMwMDAwMDAiO3JldHVybiJyYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IGNlbnRlciwgIi5jb25jYXQoInRvRWRnZSI9PT10aGlzLnR5cGU/IiIuY29uY2F0KGUsIiwiKS5jb25jYXQodCk6IiIuY29uY2F0KHQsIiwiKS5jb25jYXQoZSksIikiKX19Y2xhc3Mgb3QgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJyZWFzb24iKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgY3QgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJyZWFzb25zIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMucmVhc29uPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBsdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInJlY3RhbmdsZSIsITApLHRoaXMuaGFuZD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5oYW5kLFsiZXZlbiIsImxlZnQiLCJyaWdodCJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNvcm5lcj1uZXcgby5YRkFPYmplY3RBcnJheSg0KSx0aGlzLmVkZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXkoNCksdGhpcy5maWxsPW51bGx9W24uJHRvSFRNTF0oKXt2YXIgZTtjb25zdCB0PXRoaXMuZWRnZS5jaGlsZHJlbi5sZW5ndGg/dGhpcy5lZGdlLmNoaWxkcmVuWzBdOm5ldyB1ZSh7fSkscj10W24uJHRvU3R5bGVdKCksYT1PYmplY3QuY3JlYXRlKG51bGwpOyJ2aXNpYmxlIj09PShudWxsPT09KGU9dGhpcy5maWxsKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5wcmVzZW5jZSk/T2JqZWN0LmFzc2lnbihhLHRoaXMuZmlsbFtuLiR0b1N0eWxlXSgpKTphLmZpbGw9InRyYW5zcGFyZW50IixhLnN0cm9rZVdpZHRoPSgwLHMubWVhc3VyZVRvU3RyaW5nKSgidmlzaWJsZSI9PT10LnByZXNlbmNlP3QudGhpY2tuZXNzOjApLGEuc3Ryb2tlPXIuY29sb3I7Y29uc3QgaT0odGhpcy5jb3JuZXIuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY29ybmVyLmNoaWxkcmVuWzBdOm5ldyB0ZSh7fSkpW24uJHRvU3R5bGVdKCksbz17bmFtZToic3ZnIixjaGlsZHJlbjpbe25hbWU6InJlY3QiLGF0dHJpYnV0ZXM6e3htbG5zOmcsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSIseDowLHk6MCxyeDppLnJhZGl1cyxyeTppLnJhZGl1cyxzdHlsZTphfX1dLGF0dHJpYnV0ZXM6e3htbG5zOmcsc3R5bGU6e292ZXJmbG93OiJ2aXNpYmxlIn0sd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSJ9fTtyZXR1cm4gdyh0aGlzW24uJGdldFBhcmVudF0oKVtuLiRnZXRQYXJlbnRdKCkpP2MuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e3N0eWxlOntkaXNwbGF5OiJpbmxpbmUiLHdpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUifX0sY2hpbGRyZW46W29dfSk6KG8uYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuSFRNTFJlc3VsdC5zdWNjZXNzKG8pKX19Y2xhc3MgaHQgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJyZWYiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgdXQgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzY3JpcHQiKSx0aGlzLmJpbmRpbmc9ZS5iaW5kaW5nfHwiIix0aGlzLmNvbnRlbnRUeXBlPWUuY29udGVudFR5cGV8fCIiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5ydW5BdD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5ydW5BdCxbImNsaWVudCIsImJvdGgiLCJzZXJ2ZXIiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBkdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInNldFByb3BlcnR5IiksdGhpcy5jb25uZWN0aW9uPWUuY29ubmVjdGlvbnx8IiIsdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudGFyZ2V0PWUudGFyZ2V0fHwiIn19dC5TZXRQcm9wZXJ0eT1kdDtjbGFzcyBmdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInNpZ25EYXRhIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm9wZXJhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vcGVyYXRpb24sWyJzaWduIiwiY2xlYXIiLCJ2ZXJpZnkiXSksdGhpcy5yZWY9ZS5yZWZ8fCIiLHRoaXMudGFyZ2V0PWUudGFyZ2V0fHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5maWx0ZXI9bnVsbCx0aGlzLm1hbmlmZXN0PW51bGx9fWNsYXNzIGd0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwic2lnbmF0dXJlIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIlBERjEuMyIsIlBERjEuNiJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib3JkZXI9bnVsbCx0aGlzLmV4dHJhcz1udWxsLHRoaXMuZmlsdGVyPW51bGwsdGhpcy5tYW5pZmVzdD1udWxsLHRoaXMubWFyZ2luPW51bGx9fWNsYXNzIHB0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwic2lnbmluZyIsITApLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy50eXBlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnR5cGUsWyJvcHRpb25hbCIsInJlcXVpcmVkIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmNlcnRpZmljYXRlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBtdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInNvbGlkIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbH1bbi4kdG9TdHlsZV0oZSl7cmV0dXJuIGU/ZVtuLiR0b1N0eWxlXSgpOiIjRkZGRkZGIn19Y2xhc3MgYnQgZXh0ZW5kcyBvLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzcGVhayIpLHRoaXMuZGlzYWJsZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZGlzYWJsZSxkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5wcmlvcml0eT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmlvcml0eSxbImN1c3RvbSIsImNhcHRpb24iLCJuYW1lIiwidG9vbFRpcCJdKSx0aGlzLnJpZD1lLnJpZHx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyB5dCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN0aXBwbGUiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucmF0ZT0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUucmF0ZSxkZWZhdWx0VmFsdWU6NTAsdmFsaWRhdGU6ZT0+ZT49MCYmZTw9MTAwfSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMuY29sb3I9bnVsbCx0aGlzLmV4dHJhcz1udWxsfVtuLiR0b1N0eWxlXShlKXtjb25zdCB0PXRoaXMucmF0ZS8xMDA7cmV0dXJuIGwuVXRpbC5tYWtlSGV4Q29sb3IoTWF0aC5yb3VuZChlLnZhbHVlLnIqKDEtdCkrdGhpcy52YWx1ZS5yKnQpLE1hdGgucm91bmQoZS52YWx1ZS5nKigxLXQpK3RoaXMudmFsdWUuZyp0KSxNYXRoLnJvdW5kKGUudmFsdWUuYiooMS10KSt0aGlzLnZhbHVlLmIqdCkpfX1jbGFzcyB3dCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN1YmZvcm0iLCEwKSx0aGlzLmFjY2Vzcz0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5hY2Nlc3MsWyJvcGVuIiwibm9uSW50ZXJhY3RpdmUiLCJwcm90ZWN0ZWQiLCJyZWFkT25seSJdKSx0aGlzLmFsbG93TWFjcm89KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmFsbG93TWFjcm8sZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmFuY2hvclR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYW5jaG9yVHlwZSxbInRvcExlZnQiLCJib3R0b21DZW50ZXIiLCJib3R0b21MZWZ0IiwiYm90dG9tUmlnaHQiLCJtaWRkbGVDZW50ZXIiLCJtaWRkbGVMZWZ0IiwibWlkZGxlUmlnaHQiLCJ0b3BDZW50ZXIiLCJ0b3BSaWdodCJdKSx0aGlzLmNvbFNwYW49KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmNvbFNwYW4sZGVmYXVsdFZhbHVlOjEsdmFsaWRhdGU6ZT0+ZT49MXx8LTE9PT1lfSksdGhpcy5jb2x1bW5XaWR0aHM9KGUuY29sdW1uV2lkdGhzfHwiIikudHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoKGU9PiItMSI9PT1lPy0xOigwLGMuZ2V0TWVhc3VyZW1lbnQpKGUpKSksdGhpcy5oPWUuaD8oMCxjLmdldE1lYXN1cmVtZW50KShlLmgpOiIiLHRoaXMuaEFsaWduPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmhBbGlnbixbImxlZnQiLCJjZW50ZXIiLCJqdXN0aWZ5IiwianVzdGlmeUFsbCIsInJhZGl4IiwicmlnaHQiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLmxheW91dD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5sYXlvdXQsWyJwb3NpdGlvbiIsImxyLXRiIiwicmwtcm93IiwicmwtdGIiLCJyb3ciLCJ0YWJsZSIsInRiIl0pLHRoaXMubG9jYWxlPWUubG9jYWxlfHwiIix0aGlzLm1heEg9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhILCIwcHQiKSx0aGlzLm1heFc9KDAsYy5nZXRNZWFzdXJlbWVudCkoZS5tYXhXLCIwcHQiKSx0aGlzLm1lcmdlTW9kZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5tZXJnZU1vZGUsWyJjb25zdW1lRGF0YSIsIm1hdGNoVGVtcGxhdGUiXSksdGhpcy5taW5IPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWluSCwiMHB0IiksdGhpcy5taW5XPSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUubWluVywiMHB0IiksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5wcmVzZW5jZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5wcmVzZW5jZSxbInZpc2libGUiLCJoaWRkZW4iLCJpbmFjdGl2ZSIsImludmlzaWJsZSJdKSx0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMucmVzdG9yZVN0YXRlPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnJlc3RvcmVTdGF0ZSxbIm1hbnVhbCIsImF1dG8iXSksdGhpcy5zY29wZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5zY29wZSxbIm5hbWUiLCJub25lIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnc9ZS53PygwLGMuZ2V0TWVhc3VyZW1lbnQpKGUudyk6IiIsdGhpcy54PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueCwiMHB0IiksdGhpcy55PSgwLGMuZ2V0TWVhc3VyZW1lbnQpKGUueSwiMHB0IiksdGhpcy5hc3Npc3Q9bnVsbCx0aGlzLmJpbmQ9bnVsbCx0aGlzLmJvb2tlbmQ9bnVsbCx0aGlzLmJvcmRlcj1udWxsLHRoaXMuYnJlYWs9bnVsbCx0aGlzLmNhbGN1bGF0ZT1udWxsLHRoaXMuZGVzYz1udWxsLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5rZWVwPW51bGwsdGhpcy5tYXJnaW49bnVsbCx0aGlzLm9jY3VyPW51bGwsdGhpcy5vdmVyZmxvdz1udWxsLHRoaXMucGFnZVNldD1udWxsLHRoaXMucGFyYT1udWxsLHRoaXMudHJhdmVyc2FsPW51bGwsdGhpcy52YWxpZGF0ZT1udWxsLHRoaXMudmFyaWFibGVzPW51bGwsdGhpcy5hcmVhPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuYnJlYWtBZnRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJyZWFrQmVmb3JlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuY29ubmVjdD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRyYXc9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5ldmVudD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4T2JqZWN0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZXhjbEdyb3VwPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZmllbGQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5wcm90bz1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnNldFByb3BlcnR5PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc3ViZm9ybT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmZvcm1TZXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXl9W24uJGdldFN1YmZvcm1QYXJlbnRdKCl7Y29uc3QgZT10aGlzW24uJGdldFBhcmVudF0oKTtyZXR1cm4gZSBpbnN0YW5jZW9mIHZ0P2Vbbi4kZ2V0U3ViZm9ybVBhcmVudF0oKTplfVtuLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfVtuLiRpc1RoZXJlTW9yZVdpZHRoXSgpe3JldHVybiB0aGlzLmxheW91dC5lbmRzV2l0aCgiLXRiIikmJjA9PT10aGlzW24uJGV4dHJhXS5hdHRlbXB0JiZ0aGlzW24uJGV4dHJhXS5udW1iZXJJbkxpbmU+MHx8dGhpc1tuLiRnZXRQYXJlbnRdKClbbi4kaXNUaGVyZU1vcmVXaWR0aF0oKX0qW24uJGdldENvbnRhaW5lZENoaWxkcmVuXSgpe3lpZWxkKngodGhpcyl9W24uJGZsdXNoSFRNTF0oKXtyZXR1cm4oMCxpLmZsdXNoSFRNTCkodGhpcyl9W24uJGFkZEhUTUxdKGUsdCl7KDAsaS5hZGRIVE1MKSh0aGlzLGUsdCl9W24uJGdldEF2YWlsYWJsZVNwYWNlXSgpe3JldHVybigwLGkuZ2V0QXZhaWxhYmxlU3BhY2UpKHRoaXMpfVtuLiRpc1NwbGl0dGFibGVdKCl7dmFyIGU7Y29uc3QgdD10aGlzW24uJGdldFN1YmZvcm1QYXJlbnRdKCk7cmV0dXJuISF0W24uJGlzU3BsaXR0YWJsZV0oKSYmKHZvaWQgMCE9PXRoaXNbbi4kZXh0cmFdLl9pc1NwbGl0dGFibGU/dGhpc1tuLiRleHRyYV0uX2lzU3BsaXR0YWJsZToicG9zaXRpb24iPT09dGhpcy5sYXlvdXR8fHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKXx8dGhpcy5rZWVwJiYibm9uZSIhPT10aGlzLmtlZXAuaW50YWN0Pyh0aGlzW24uJGV4dHJhXS5faXNTcGxpdHRhYmxlPSExLCExKTohKG51bGwhPT0oZT10LmxheW91dCkmJnZvaWQgMCE9PWUmJmUuZW5kc1dpdGgoIi10YiIpJiYwIT09dFtuLiRleHRyYV0ubnVtYmVySW5MaW5lfHwodGhpc1tuLiRleHRyYV0uX2lzU3BsaXR0YWJsZT0hMCwwKSkpfVtuLiR0b0hUTUxdKGUpe3ZhciB0O2lmKEEodGhpcyksdGhpcy5icmVhayl7aWYoImF1dG8iIT09dGhpcy5icmVhay5hZnRlcnx8IiIhPT10aGlzLmJyZWFrLmFmdGVyVGFyZ2V0KXtjb25zdCBlPW5ldyBYKHt0YXJnZXRUeXBlOnRoaXMuYnJlYWsuYWZ0ZXIsdGFyZ2V0OnRoaXMuYnJlYWsuYWZ0ZXJUYXJnZXQsc3RhcnROZXc6dGhpcy5icmVhay5zdGFydE5ldy50b1N0cmluZygpfSk7ZVtuLiRnbG9iYWxEYXRhXT10aGlzW24uJGdsb2JhbERhdGFdLHRoaXNbbi4kYXBwZW5kQ2hpbGRdKGUpLHRoaXMuYnJlYWtBZnRlci5wdXNoKGUpfWlmKCJhdXRvIiE9PXRoaXMuYnJlYWsuYmVmb3JlfHwiIiE9PXRoaXMuYnJlYWsuYmVmb3JlVGFyZ2V0KXtjb25zdCBlPW5ldyBIKHt0YXJnZXRUeXBlOnRoaXMuYnJlYWsuYmVmb3JlLHRhcmdldDp0aGlzLmJyZWFrLmJlZm9yZVRhcmdldCxzdGFydE5ldzp0aGlzLmJyZWFrLnN0YXJ0TmV3LnRvU3RyaW5nKCl9KTtlW24uJGdsb2JhbERhdGFdPXRoaXNbbi4kZ2xvYmFsRGF0YV0sdGhpc1tuLiRhcHBlbmRDaGlsZF0oZSksdGhpcy5icmVha0JlZm9yZS5wdXNoKGUpfWlmKCIiIT09dGhpcy5icmVhay5vdmVyZmxvd1RhcmdldCl7Y29uc3QgZT1uZXcgWmUoe3RhcmdldDp0aGlzLmJyZWFrLm92ZXJmbG93VGFyZ2V0LGxlYWRlcjp0aGlzLmJyZWFrLm92ZXJmbG93TGVhZGVyLHRyYWlsZXI6dGhpcy5icmVhay5vdmVyZmxvd1RyYWlsZXJ9KTtlW24uJGdsb2JhbERhdGFdPXRoaXNbbi4kZ2xvYmFsRGF0YV0sdGhpc1tuLiRhcHBlbmRDaGlsZF0oZSksdGhpcy5vdmVyZmxvdy5wdXNoKGUpfXRoaXNbbi4kcmVtb3ZlQ2hpbGRdKHRoaXMuYnJlYWspLHRoaXMuYnJlYWs9bnVsbH1pZigiaGlkZGVuIj09PXRoaXMucHJlc2VuY2V8fCJpbmFjdGl2ZSI9PT10aGlzLnByZXNlbmNlKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7aWYoKHRoaXMuYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoPjF8fHRoaXMuYnJlYWtBZnRlci5jaGlsZHJlbi5sZW5ndGg+MSkmJigwLGwud2FybikoIlhGQSAtIFNldmVyYWwgYnJlYWtCZWZvcmUgb3IgYnJlYWtBZnRlciBpbiBzdWJmb3JtczogcGxlYXNlIGZpbGUgYSBidWcuIiksdGhpcy5icmVha0JlZm9yZS5jaGlsZHJlbi5sZW5ndGg+PTEpe2NvbnN0IGU9dGhpcy5icmVha0JlZm9yZS5jaGlsZHJlblswXTtpZihUKGUpKXJldHVybiBjLkhUTUxSZXN1bHQuYnJlYWtOb2RlKGUpfWlmKG51bGwhPT0odD10aGlzW24uJGV4dHJhXSkmJnZvaWQgMCE9PXQmJnQuYWZ0ZXJCcmVha0FmdGVyKXJldHVybiBjLkhUTUxSZXN1bHQuRU1QVFk7KDAscy5maXhEaW1lbnNpb25zKSh0aGlzKTtjb25zdCByPVtdLGE9e2lkOnRoaXNbbi4kdWlkXSxjbGFzczpbXX07KDAscy5zZXRBY2Nlc3MpKHRoaXMsYS5jbGFzcyksdGhpc1tuLiRleHRyYV18fCh0aGlzW24uJGV4dHJhXT1PYmplY3QuY3JlYXRlKG51bGwpKSxPYmplY3QuYXNzaWduKHRoaXNbbi4kZXh0cmFdLHtjaGlsZHJlbjpyLGxpbmU6bnVsbCxhdHRyaWJ1dGVzOmEsYXR0ZW1wdDowLG51bWJlckluTGluZTowLGF2YWlsYWJsZVNwYWNlOnt3aWR0aDpNYXRoLm1pbih0aGlzLnd8fDEvMCxlLndpZHRoKSxoZWlnaHQ6TWF0aC5taW4odGhpcy5ofHwxLzAsZS5oZWlnaHQpfSx3aWR0aDowLGhlaWdodDowLHByZXZIZWlnaHQ6MCxjdXJyZW50V2lkdGg6MH0pO2NvbnN0IG89dGhpc1tuLiRnZXRUZW1wbGF0ZVJvb3RdKCksaD1vW24uJGV4dHJhXS5ub0xheW91dEZhaWx1cmUsdT10aGlzW24uJGlzU3BsaXR0YWJsZV0oKTtpZih1fHxGKHRoaXMpLCEoMCxpLmNoZWNrRGltZW5zaW9ucykodGhpcyxlKSlyZXR1cm4gYy5IVE1MUmVzdWx0LkZBSUxVUkU7Y29uc3QgZD1uZXcgU2V0KFsiYXJlYSIsImRyYXciLCJleGNsR3JvdXAiLCJmaWVsZCIsInN1YmZvcm0iLCJzdWJmb3JtU2V0Il0pO2lmKHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKSl7Y29uc3QgZT10aGlzW24uJGdldFN1YmZvcm1QYXJlbnRdKCkuY29sdW1uV2lkdGhzO0FycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPjAmJih0aGlzW24uJGV4dHJhXS5jb2x1bW5XaWR0aHM9ZSx0aGlzW24uJGV4dHJhXS5jdXJyZW50Q29sdW1uPTApfWNvbnN0IGY9KDAscy50b1N0eWxlKSh0aGlzLCJhbmNob3JUeXBlIiwiZGltZW5zaW9ucyIsInBvc2l0aW9uIiwicHJlc2VuY2UiLCJib3JkZXIiLCJtYXJnaW4iLCJoQWxpZ24iKSxnPVsieGZhU3ViZm9ybSJdLHA9KDAscy5sYXlvdXRDbGFzcykodGhpcyk7aWYocCYmZy5wdXNoKHApLGEuc3R5bGU9ZixhLmNsYXNzPWcsdGhpcy5uYW1lJiYoYS54ZmFOYW1lPXRoaXMubmFtZSksdGhpcy5vdmVyZmxvdyl7Y29uc3QgdD10aGlzLm92ZXJmbG93W24uJGdldEV4dHJhXSgpO3QuYWRkTGVhZGVyJiYodC5hZGRMZWFkZXI9ITEsTSh0aGlzLHQubGVhZGVyLGUpKX10aGlzW24uJHB1c2hQYXJhXSgpO2NvbnN0IG09ImxyLXRiIj09PXRoaXMubGF5b3V0fHwicmwtdGIiPT09dGhpcy5sYXlvdXQsYj1tPzI6MTtmb3IoO3RoaXNbbi4kZXh0cmFdLmF0dGVtcHQ8Yjt0aGlzW24uJGV4dHJhXS5hdHRlbXB0Kyspe20mJjE9PT10aGlzW24uJGV4dHJhXS5hdHRlbXB0JiYodGhpc1tuLiRleHRyYV0ubnVtYmVySW5MaW5lPTApO2NvbnN0IGU9dGhpc1tuLiRjaGlsZHJlblRvSFRNTF0oe2ZpbHRlcjpkLGluY2x1ZGU6ITB9KTtpZihlLnN1Y2Nlc3MpYnJlYWs7aWYoZS5pc0JyZWFrKCkpcmV0dXJuIHRoaXNbbi4kcG9wUGFyYV0oKSxlO2lmKG0mJjA9PT10aGlzW24uJGV4dHJhXS5hdHRlbXB0JiYwPT09dGhpc1tuLiRleHRyYV0ubnVtYmVySW5MaW5lJiYhb1tuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKXt0aGlzW24uJGV4dHJhXS5hdHRlbXB0PWI7YnJlYWt9fWlmKHRoaXNbbi4kcG9wUGFyYV0oKSx1fHxJKHRoaXMpLG9bbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZT1oLHRoaXNbbi4kZXh0cmFdLmF0dGVtcHQ9PT1iKXJldHVybiB0aGlzLm92ZXJmbG93JiYodGhpc1tuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLm92ZXJmbG93Tm9kZT10aGlzLm92ZXJmbG93KSx1fHxkZWxldGUgdGhpc1tuLiRleHRyYV0sYy5IVE1MUmVzdWx0LkZBSUxVUkU7aWYodGhpcy5vdmVyZmxvdyl7Y29uc3QgdD10aGlzLm92ZXJmbG93W24uJGdldEV4dHJhXSgpO3QuYWRkVHJhaWxlciYmKHQuYWRkVHJhaWxlcj0hMSxNKHRoaXMsdC50cmFpbGVyLGUpKX1sZXQgeT0wLHc9MDt0aGlzLm1hcmdpbiYmKHk9dGhpcy5tYXJnaW4ubGVmdEluc2V0K3RoaXMubWFyZ2luLnJpZ2h0SW5zZXQsdz10aGlzLm1hcmdpbi50b3BJbnNldCt0aGlzLm1hcmdpbi5ib3R0b21JbnNldCk7Y29uc3Qgdj1NYXRoLm1heCh0aGlzW24uJGV4dHJhXS53aWR0aCt5LHRoaXMud3x8MCkseD1NYXRoLm1heCh0aGlzW24uJGV4dHJhXS5oZWlnaHQrdyx0aGlzLmh8fDApLFM9W3RoaXMueCx0aGlzLnksdix4XTtpZigiIj09PXRoaXMudyYmKGYud2lkdGg9KDAscy5tZWFzdXJlVG9TdHJpbmcpKHYpKSwiIj09PXRoaXMuaCYmKGYuaGVpZ2h0PSgwLHMubWVhc3VyZVRvU3RyaW5nKSh4KSksKCIwcHgiPT09Zi53aWR0aHx8IjBweCI9PT1mLmhlaWdodCkmJjA9PT1yLmxlbmd0aClyZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZO2NvbnN0IEM9e25hbWU6ImRpdiIsYXR0cmlidXRlczphLGNoaWxkcmVuOnJ9O2sodGhpcyxhKTtjb25zdCBPPWMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLHMuY3JlYXRlV3JhcHBlcikodGhpcyxDKSxTKTtpZih0aGlzLmJyZWFrQWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoPj0xKXtjb25zdCBlPXRoaXMuYnJlYWtBZnRlci5jaGlsZHJlblswXTtpZihUKGUpKXJldHVybiB0aGlzW24uJGV4dHJhXS5hZnRlckJyZWFrQWZ0ZXI9TyxjLkhUTUxSZXN1bHQuYnJlYWtOb2RlKGUpfXJldHVybiBkZWxldGUgdGhpc1tuLiRleHRyYV0sT319Y2xhc3MgdnQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzdWJmb3JtU2V0IiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnJlbGF0aW9uPSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLnJlbGF0aW9uLFsib3JkZXJlZCIsImNob2ljZSIsInVub3JkZXJlZCJdKSx0aGlzLnJlbGV2YW50PSgwLGMuZ2V0UmVsZXZhbnQpKGUucmVsZXZhbnQpLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmJvb2tlbmQ9bnVsbCx0aGlzLmJyZWFrPW51bGwsdGhpcy5kZXNjPW51bGwsdGhpcy5leHRyYXM9bnVsbCx0aGlzLm9jY3VyPW51bGwsdGhpcy5vdmVyZmxvdz1udWxsLHRoaXMuYnJlYWtBZnRlcj1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmJyZWFrQmVmb3JlPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuc3ViZm9ybT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLnN1YmZvcm1TZXQ9bmV3IG8uWEZBT2JqZWN0QXJyYXl9KltuLiRnZXRDb250YWluZWRDaGlsZHJlbl0oKXt5aWVsZCp4KHRoaXMpfVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpe2xldCBlPXRoaXNbbi4kZ2V0UGFyZW50XSgpO2Zvcig7IShlIGluc3RhbmNlb2Ygd3QpOyllPWVbbi4kZ2V0UGFyZW50XSgpO3JldHVybiBlfVtuLiRpc0JpbmRhYmxlXSgpe3JldHVybiEwfX1jbGFzcyB4dCBleHRlbmRzIG8uQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJzdWJqZWN0RE4iKSx0aGlzLmRlbGltaXRlcj1lLmRlbGltaXRlcnx8IiwiLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiRmaW5hbGl6ZV0oKXt0aGlzW24uJGNvbnRlbnRdPW5ldyBNYXAodGhpc1tuLiRjb250ZW50XS5zcGxpdCh0aGlzLmRlbGltaXRlcikubWFwKChlPT4oKGU9ZS5zcGxpdCgiPSIsMikpWzBdPWVbMF0udHJpbSgpLGUpKSkpfX1jbGFzcyBTdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInN1YmplY3RETnMiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMudHlwZT0oMCxjLmdldFN0cmluZ09wdGlvbikoZS50eXBlLFsib3B0aW9uYWwiLCJyZXF1aXJlZCJdKSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5zdWJqZWN0RE49bmV3IG8uWEZBT2JqZWN0QXJyYXl9fWNsYXNzIEF0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwic3VibWl0IiwhMCksdGhpcy5lbWJlZFBERj0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUuZW1iZWRQREYsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmZvcm1hdD0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5mb3JtYXQsWyJ4ZHAiLCJmb3JtZGF0YSIsInBkZiIsInVybGVuY29kZWQiLCJ4ZmQiLCJ4bWwiXSksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnRhcmdldD1lLnRhcmdldHx8IiIsdGhpcy50ZXh0RW5jb2Rpbmc9KDAsYy5nZXRLZXl3b3JkKSh7ZGF0YTplLnRleHRFbmNvZGluZz9lLnRleHRFbmNvZGluZy50b0xvd2VyQ2FzZSgpOiIiLGRlZmF1bHRWYWx1ZToiIix2YWxpZGF0ZTplPT5bInV0Zi04IiwiYmlnLWZpdmUiLCJmb250c3BlY2lmaWMiLCJnYmsiLCJnYi0xODAzMCIsImdiLTIzMTIiLCJrc2MtNTYwMSIsIm5vbmUiLCJzaGlmdC1qaXMiLCJ1Y3MtMiIsInV0Zi0xNiJdLmluY2x1ZGVzKGUpfHxlLm1hdGNoKC9pc28tODg1OS1cZHsyfS8pfSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIiLHRoaXMueGRwQ29udGVudD1lLnhkcENvbnRlbnR8fCIiLHRoaXMuZW5jcnlwdD1udWxsLHRoaXMuZW5jcnlwdERhdGE9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zaWduRGF0YT1uZXcgby5YRkFPYmplY3RBcnJheX19Y2xhc3Mga3QgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJ0ZW1wbGF0ZSIsITApLHRoaXMuYmFzZVByb2ZpbGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuYmFzZVByb2ZpbGUsWyJmdWxsIiwiaW50ZXJhY3RpdmVGb3JtcyJdKSx0aGlzLmV4dHJhcz1udWxsLHRoaXMuc3ViZm9ybT1uZXcgby5YRkFPYmplY3RBcnJheX1bbi4kZmluYWxpemVdKCl7MD09PXRoaXMuc3ViZm9ybS5jaGlsZHJlbi5sZW5ndGgmJigwLGwud2FybikoIlhGQSAtIE5vIHN1YmZvcm1zIGluIHRlbXBsYXRlIG5vZGUuIiksdGhpcy5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aD49MiYmKDAsbC53YXJuKSgiWEZBIC0gU2V2ZXJhbCBzdWJmb3JtcyBpbiB0ZW1wbGF0ZSBub2RlOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKSx0aGlzW24uJHRhYkluZGV4XT01ZTN9W24uJGlzU3BsaXR0YWJsZV0oKXtyZXR1cm4hMH1bbi4kc2VhcmNoTm9kZV0oZSx0KXtyZXR1cm4gZS5zdGFydHNXaXRoKCIjIik/W3RoaXNbbi4kaWRzXS5nZXQoZS5zbGljZSgxKSldOigwLGQuc2VhcmNoTm9kZSkodGhpcyx0LGUsITAsITApfSpbbi4kdG9QYWdlc10oKXt2YXIgZSx0O2lmKCF0aGlzLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoKXJldHVybiBjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixjaGlsZHJlbjpbXX0pO3RoaXNbbi4kZXh0cmFdPXtvdmVyZmxvd05vZGU6bnVsbCxmaXJzdFVuc3BsaXR0YWJsZTpudWxsLGN1cnJlbnRDb250ZW50QXJlYTpudWxsLGN1cnJlbnRQYWdlQXJlYTpudWxsLG5vTGF5b3V0RmFpbHVyZTohMSxwYWdlTnVtYmVyOjEscGFnZVBvc2l0aW9uOiJmaXJzdCIsb2RkT3JFdmVuOiJvZGQiLGJsYW5rT3JOb3RCbGFuazoibm9uQmxhbmsiLHBhcmFTdGFjazpbXX07Y29uc3Qgcj10aGlzLnN1YmZvcm0uY2hpbGRyZW5bMF07ci5wYWdlU2V0W24uJGNsZWFuUGFnZV0oKTtjb25zdCBhPXIucGFnZVNldC5wYWdlQXJlYS5jaGlsZHJlbixpPXtuYW1lOiJkaXYiLGNoaWxkcmVuOltdfTtsZXQgcz1udWxsLG89bnVsbCxoPW51bGw7aWYoci5icmVha0JlZm9yZS5jaGlsZHJlbi5sZW5ndGg+PTE/KG89ci5icmVha0JlZm9yZS5jaGlsZHJlblswXSxoPW8udGFyZ2V0KTpyLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoPj0xJiZyLnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoPj0xPyhvPXIuc3ViZm9ybS5jaGlsZHJlblswXS5icmVha0JlZm9yZS5jaGlsZHJlblswXSxoPW8udGFyZ2V0KTpudWxsIT09KGU9ci5icmVhaykmJnZvaWQgMCE9PWUmJmUuYmVmb3JlVGFyZ2V0PyhvPXIuYnJlYWssaD1vLmJlZm9yZVRhcmdldCk6ci5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aD49MSYmbnVsbCE9PSh0PXIuc3ViZm9ybS5jaGlsZHJlblswXS5icmVhaykmJnZvaWQgMCE9PXQmJnQuYmVmb3JlVGFyZ2V0JiYobz1yLnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWssaD1vLmJlZm9yZVRhcmdldCksbyl7Y29uc3QgZT10aGlzW24uJHNlYXJjaE5vZGVdKGgsb1tuLiRnZXRQYXJlbnRdKCkpO2UgaW5zdGFuY2VvZiBRZSYmKHM9ZSxvW24uJGV4dHJhXT17fSl9c3x8KHM9YVswXSksc1tuLiRleHRyYV09e251bWJlck9mVXNlOjF9O2NvbnN0IHU9c1tuLiRnZXRQYXJlbnRdKCk7dVtuLiRleHRyYV09e251bWJlck9mVXNlOjEscGFnZUluZGV4OnUucGFnZUFyZWEuY2hpbGRyZW4uaW5kZXhPZihzKSxwYWdlU2V0SW5kZXg6MH07bGV0IGQsZj1udWxsLGc9bnVsbCxwPSEwLG09MCxiPTA7Zm9yKDs7KXtpZihwKW09MDtlbHNlIGlmKGkuY2hpbGRyZW4ucG9wKCksMz09KyttKXJldHVybigwLGwud2FybikoIlhGQSAtIFNvbWV0aGluZyBnb2VzIHdyb25nOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKSxpO2Q9bnVsbCx0aGlzW24uJGV4dHJhXS5jdXJyZW50UGFnZUFyZWE9cztjb25zdCBlPXNbbi4kdG9IVE1MXSgpLmh0bWw7aS5jaGlsZHJlbi5wdXNoKGUpLGYmJih0aGlzW24uJGV4dHJhXS5ub0xheW91dEZhaWx1cmU9ITAsZS5jaGlsZHJlbi5wdXNoKGZbbi4kdG9IVE1MXShzW24uJGV4dHJhXS5zcGFjZSkuaHRtbCksZj1udWxsKSxnJiYodGhpc1tuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlPSEwLGUuY2hpbGRyZW4ucHVzaChnW24uJHRvSFRNTF0oc1tuLiRleHRyYV0uc3BhY2UpLmh0bWwpLGc9bnVsbCk7Y29uc3QgdD1zLmNvbnRlbnRBcmVhLmNoaWxkcmVuLGE9ZS5jaGlsZHJlbi5maWx0ZXIoKGU9PmUuYXR0cmlidXRlcy5jbGFzcy5pbmNsdWRlcygieGZhQ29udGVudGFyZWEiKSkpO3A9ITEsdGhpc1tuLiRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGU9bnVsbCx0aGlzW24uJGV4dHJhXS5ub0xheW91dEZhaWx1cmU9ITE7Y29uc3Qgbz1lPT57Y29uc3QgdD1yW24uJGZsdXNoSFRNTF0oKTt2YXIgaTt0JiYocHx8KHA9KG51bGw9PT0oaT10LmNoaWxkcmVuKXx8dm9pZCAwPT09aT92b2lkIDA6aS5sZW5ndGgpPjApLGFbZV0uY2hpbGRyZW4ucHVzaCh0KSl9O2ZvcihsZXQgZT1iLHM9dC5sZW5ndGg7ZTxzO2UrKyl7Y29uc3Qgcz10aGlzW24uJGV4dHJhXS5jdXJyZW50Q29udGVudEFyZWE9dFtlXSxjPXt3aWR0aDpzLncsaGVpZ2h0OnMuaH07Yj0wLGYmJihhW2VdLmNoaWxkcmVuLnB1c2goZltuLiR0b0hUTUxdKGMpLmh0bWwpLGY9bnVsbCksZyYmKGFbZV0uY2hpbGRyZW4ucHVzaChnW24uJHRvSFRNTF0oYykuaHRtbCksZz1udWxsKTtjb25zdCBsPXJbbi4kdG9IVE1MXShjKTt2YXIgeTtpZihsLnN1Y2Nlc3MpcmV0dXJuIGwuaHRtbD8ocHx8KHA9KG51bGw9PT0oeT1sLmh0bWwuY2hpbGRyZW4pfHx2b2lkIDA9PT15P3ZvaWQgMDp5Lmxlbmd0aCk+MCksYVtlXS5jaGlsZHJlbi5wdXNoKGwuaHRtbCkpOiFwJiZpLmNoaWxkcmVuLmxlbmd0aD4xJiZpLmNoaWxkcmVuLnBvcCgpLGk7aWYobC5pc0JyZWFrKCkpe2NvbnN0IHQ9bC5icmVha05vZGU7aWYobyhlKSwiYXV0byI9PT10LnRhcmdldFR5cGUpY29udGludWU7dC5sZWFkZXImJihmPXRoaXNbbi4kc2VhcmNoTm9kZV0odC5sZWFkZXIsdFtuLiRnZXRQYXJlbnRdKCkpLGY9Zj9mWzBdOm51bGwpLHQudHJhaWxlciYmKGc9dGhpc1tuLiRzZWFyY2hOb2RlXSh0LnRyYWlsZXIsdFtuLiRnZXRQYXJlbnRdKCkpLGc9Zz9nWzBdOm51bGwpLCJwYWdlQXJlYSI9PT10LnRhcmdldFR5cGU/KGQ9dFtuLiRleHRyYV0udGFyZ2V0LGU9MS8wKTp0W24uJGV4dHJhXS50YXJnZXQ/KGQ9dFtuLiRleHRyYV0udGFyZ2V0LGI9dFtuLiRleHRyYV0uaW5kZXgrMSxlPTEvMCk6ZT10W24uJGV4dHJhXS5pbmRleH1lbHNlIGlmKHRoaXNbbi4kZXh0cmFdLm92ZXJmbG93Tm9kZSl7Y29uc3Qgcj10aGlzW24uJGV4dHJhXS5vdmVyZmxvd05vZGU7dGhpc1tuLiRleHRyYV0ub3ZlcmZsb3dOb2RlPW51bGw7Y29uc3QgYT1yW24uJGdldEV4dHJhXSgpLGk9YS50YXJnZXQ7YS5hZGRMZWFkZXI9bnVsbCE9PWEubGVhZGVyLGEuYWRkVHJhaWxlcj1udWxsIT09YS50cmFpbGVyLG8oZSk7Y29uc3Qgcz1lO2lmKGU9MS8wLGkgaW5zdGFuY2VvZiBRZSlkPWk7ZWxzZSBpZihpIGluc3RhbmNlb2YgZWUpe2NvbnN0IHI9dC5pbmRleE9mKGkpOy0xIT09cj9yPnM/ZT1yLTE6Yj1yOihkPWlbbi4kZ2V0UGFyZW50XSgpLGI9ZC5jb250ZW50QXJlYS5jaGlsZHJlbi5pbmRleE9mKGkpKX19ZWxzZSBvKGUpfXRoaXNbbi4kZXh0cmFdLnBhZ2VOdW1iZXIrPTEsZCYmKGRbbi4kaXNVc2FibGVdKCk/ZFtuLiRleHRyYV0ubnVtYmVyT2ZVc2UrPTE6ZD1udWxsKSxzPWR8fHNbbi4kZ2V0TmV4dFBhZ2VdKCkseWllbGQgbnVsbH19fXQuVGVtcGxhdGU9a3Q7Y2xhc3MgQ3QgZXh0ZW5kcyBvLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidGV4dCIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5tYXhDaGFycz0oMCxjLmdldEludGVnZXIpKHtkYXRhOmUubWF4Q2hhcnMsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+ZT49MH0pLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMucmlkPWUucmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9W24uJGFjY2VwdFdoaXRlc3BhY2VdKCl7cmV0dXJuITB9W24uJG9uQ2hpbGRdKGUpe3JldHVybiBlW24uJG5hbWVzcGFjZUlkXT09PWEuTmFtZXNwYWNlSWRzLnhodG1sLmlkPyh0aGlzW24uJGNvbnRlbnRdPWUsITApOigoMCxsLndhcm4pKCJYRkEgLSBJbnZhbGlkIGNvbnRlbnQgaW4gVGV4dDogIi5jb25jYXQoZVtuLiRub2RlTmFtZV0sIi4iKSksITEpfVtuLiRvblRleHRdKGUpe3RoaXNbbi4kY29udGVudF1pbnN0YW5jZW9mIG8uWEZBT2JqZWN0fHxzdXBlcltuLiRvblRleHRdKGUpfVtuLiRmaW5hbGl6ZV0oKXsic3RyaW5nIj09dHlwZW9mIHRoaXNbbi4kY29udGVudF0mJih0aGlzW24uJGNvbnRlbnRdPXRoaXNbbi4kY29udGVudF0ucmVwbGFjZUFsbCgiXHJcbiIsIlxuIikpfVtuLiRnZXRFeHRyYV0oKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHRoaXNbbi4kY29udGVudF0/dGhpc1tuLiRjb250ZW50XS5zcGxpdCgvW1x1MjAyOVx1MjAyOFxuXS8pLnJlZHVjZSgoKGUsdCk9Pih0JiZlLnB1c2godCksZSkpLFtdKS5qb2luKCJcbiIpOnRoaXNbbi4kY29udGVudF1bbi4kdGV4dF0oKX1bbi4kdG9IVE1MXShlKXtpZigic3RyaW5nIj09dHlwZW9mIHRoaXNbbi4kY29udGVudF0pe2NvbnN0IGU9Tyh0aGlzW24uJGNvbnRlbnRdKS5odG1sO3JldHVybiB0aGlzW24uJGNvbnRlbnRdLmluY2x1ZGVzKCJcdTIwMjkiKT8oZS5uYW1lPSJkaXYiLGUuY2hpbGRyZW49W10sdGhpc1tuLiRjb250ZW50XS5zcGxpdCgiXHUyMDI5IikubWFwKChlPT5lLnNwbGl0KC9bXHUyMDI4XG5dLykucmVkdWNlKCgoZSx0KT0+KGUucHVzaCh7bmFtZToic3BhbiIsdmFsdWU6dH0se25hbWU6ImJyIn0pLGUpKSxbXSkpKS5mb3JFYWNoKCh0PT57ZS5jaGlsZHJlbi5wdXNoKHtuYW1lOiJwIixjaGlsZHJlbjp0fSl9KSkpOi9bXHUyMDI4XG5dLy50ZXN0KHRoaXNbbi4kY29udGVudF0pJiYoZS5uYW1lPSJkaXYiLGUuY2hpbGRyZW49W10sdGhpc1tuLiRjb250ZW50XS5zcGxpdCgvW1x1MjAyOFxuXS8pLmZvckVhY2goKHQ9PntlLmNoaWxkcmVuLnB1c2goe25hbWU6InNwYW4iLHZhbHVlOnR9LHtuYW1lOiJiciJ9KX0pKSksYy5IVE1MUmVzdWx0LnN1Y2Nlc3MoZSl9cmV0dXJuIHRoaXNbbi4kY29udGVudF1bbi4kdG9IVE1MXShlKX19dC5UZXh0PUN0O2NsYXNzIE90IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidGV4dEVkaXQiLCEwKSx0aGlzLmFsbG93UmljaFRleHQ9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmFsbG93UmljaFRleHQsZGVmYXVsdFZhbHVlOjAsdmFsaWRhdGU6ZT0+MT09PWV9KSx0aGlzLmhTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuaFNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubXVsdGlMaW5lPSgwLGMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5tdWx0aUxpbmUsZGVmYXVsdFZhbHVlOiIiLHZhbGlkYXRlOmU9PjA9PT1lfHwxPT09ZX0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLnZTY3JvbGxQb2xpY3k9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudlNjcm9sbFBvbGljeSxbImF1dG8iLCJvZmYiLCJvbiJdKSx0aGlzLmJvcmRlcj1udWxsLHRoaXMuY29tYj1udWxsLHRoaXMuZXh0cmFzPW51bGwsdGhpcy5tYXJnaW49bnVsbH1bbi4kdG9IVE1MXShlKXt2YXIgdCxyO2NvbnN0IGE9KDAscy50b1N0eWxlKSh0aGlzLCJib3JkZXIiLCJmb250IiwibWFyZ2luIik7bGV0IGk7Y29uc3Qgbz10aGlzW24uJGdldFBhcmVudF0oKVtuLiRnZXRQYXJlbnRdKCk7cmV0dXJuIiI9PT10aGlzLm11bHRpTGluZSYmKHRoaXMubXVsdGlMaW5lPW8gaW5zdGFuY2VvZiBoZT8xOjApLGk9MT09PXRoaXMubXVsdGlMaW5lP3tuYW1lOiJ0ZXh0YXJlYSIsYXR0cmlidXRlczp7ZGF0YUlkOihudWxsPT09KHQ9b1tuLiRkYXRhXSl8fHZvaWQgMD09PXQ/dm9pZCAwOnRbbi4kdWlkXSl8fG9bbi4kdWlkXSxmaWVsZElkOm9bbi4kdWlkXSxjbGFzczpbInhmYVRleHRmaWVsZCJdLHN0eWxlOmEsImFyaWEtbGFiZWwiOkMobyksImFyaWEtcmVxdWlyZWQiOiExfX06e25hbWU6ImlucHV0IixhdHRyaWJ1dGVzOnt0eXBlOiJ0ZXh0IixkYXRhSWQ6KG51bGw9PT0ocj1vW24uJGRhdGFdKXx8dm9pZCAwPT09cj92b2lkIDA6cltuLiR1aWRdKXx8b1tuLiR1aWRdLGZpZWxkSWQ6b1tuLiR1aWRdLGNsYXNzOlsieGZhVGV4dGZpZWxkIl0sc3R5bGU6YSwiYXJpYS1sYWJlbCI6QyhvKSwiYXJpYS1yZXF1aXJlZCI6ITF9fSxTKG8pJiYoaS5hdHRyaWJ1dGVzWyJhcmlhLXJlcXVpcmVkIl09ITAsaS5hdHRyaWJ1dGVzLnJlcXVpcmVkPSEwKSxjLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToibGFiZWwiLGF0dHJpYnV0ZXM6e2NsYXNzOlsieGZhTGFiZWwiXX0sY2hpbGRyZW46W2ldfSl9fWNsYXNzIEZ0IGV4dGVuZHMgby5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidGltZSIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifVtuLiRmaW5hbGl6ZV0oKXtjb25zdCBlPXRoaXNbbi4kY29udGVudF0udHJpbSgpO3RoaXNbbi4kY29udGVudF09ZT9uZXcgRGF0ZShlKTpudWxsfVtuLiR0b0hUTUxdKGUpe3JldHVybiBPKHRoaXNbbi4kY29udGVudF0/dGhpc1tuLiRjb250ZW50XS50b1N0cmluZygpOiIiKX19Y2xhc3MgSXQgZXh0ZW5kcyBvLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihmLCJ0aW1lU3RhbXAiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMuc2VydmVyPWUuc2VydmVyfHwiIix0aGlzLnR5cGU9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUudHlwZSxbIm9wdGlvbmFsIiwicmVxdWlyZWQiXSksdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBUdCBleHRlbmRzIG8uU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInRvb2xUaXAiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMucmlkPWUucmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIE10IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidHJhdmVyc2FsIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbCx0aGlzLnRyYXZlcnNlPW5ldyBvLlhGQU9iamVjdEFycmF5fX1jbGFzcyBFdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInRyYXZlcnNlIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm9wZXJhdGlvbj0oMCxjLmdldFN0cmluZ09wdGlvbikoZS5vcGVyYXRpb24sWyJuZXh0IiwiYmFjayIsImRvd24iLCJmaXJzdCIsImxlZnQiLCJyaWdodCIsInVwIl0pLHRoaXMucmVmPWUucmVmfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbCx0aGlzLnNjcmlwdD1udWxsfWdldCBuYW1lKCl7cmV0dXJuIHRoaXMub3BlcmF0aW9ufVtuLiRpc1RyYW5zcGFyZW50XSgpe3JldHVybiExfX1jbGFzcyBQdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInVpIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5leHRyYXM9bnVsbCx0aGlzLnBpY3R1cmU9bnVsbCx0aGlzLmJhcmNvZGU9bnVsbCx0aGlzLmJ1dHRvbj1udWxsLHRoaXMuY2hlY2tCdXR0b249bnVsbCx0aGlzLmNob2ljZUxpc3Q9bnVsbCx0aGlzLmRhdGVUaW1lRWRpdD1udWxsLHRoaXMuZGVmYXVsdFVpPW51bGwsdGhpcy5pbWFnZUVkaXQ9bnVsbCx0aGlzLm51bWVyaWNFZGl0PW51bGwsdGhpcy5wYXNzd29yZEVkaXQ9bnVsbCx0aGlzLnNpZ25hdHVyZT1udWxsLHRoaXMudGV4dEVkaXQ9bnVsbH1bbi4kZ2V0RXh0cmFdKCl7aWYodm9pZCAwPT09dGhpc1tuLiRleHRyYV0pe2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtpZigiZXh0cmFzIj09PWV8fCJwaWN0dXJlIj09PWUpY29udGludWU7Y29uc3QgdD10aGlzW2VdO2lmKHQgaW5zdGFuY2VvZiBvLlhGQU9iamVjdClyZXR1cm4gdGhpc1tuLiRleHRyYV09dCx0fXRoaXNbbi4kZXh0cmFdPW51bGx9cmV0dXJuIHRoaXNbbi4kZXh0cmFdfVtuLiR0b0hUTUxdKGUpe2NvbnN0IHQ9dGhpc1tuLiRnZXRFeHRyYV0oKTtyZXR1cm4gdD90W24uJHRvSFRNTF0oZSk6Yy5IVE1MUmVzdWx0LkVNUFRZfX1jbGFzcyBSdCBleHRlbmRzIG8uWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGYsInZhbGlkYXRlIiwhMCksdGhpcy5mb3JtYXRUZXN0PSgwLGMuZ2V0U3RyaW5nT3B0aW9uKShlLmZvcm1hdFRlc3QsWyJ3YXJuaW5nIiwiZGlzYWJsZWQiLCJlcnJvciJdKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubnVsbFRlc3Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUubnVsbFRlc3QsWyJkaXNhYmxlZCIsImVycm9yIiwid2FybmluZyJdKSx0aGlzLnNjcmlwdFRlc3Q9KDAsYy5nZXRTdHJpbmdPcHRpb24pKGUuc2NyaXB0VGVzdCxbImVycm9yIiwiZGlzYWJsZWQiLCJ3YXJuaW5nIl0pLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIix0aGlzLmV4dHJhcz1udWxsLHRoaXMubWVzc2FnZT1udWxsLHRoaXMucGljdHVyZT1udWxsLHRoaXMuc2NyaXB0PW51bGx9fWNsYXNzIE50IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidmFsdWUiLCEwKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMub3ZlcnJpZGU9KDAsYy5nZXRJbnRlZ2VyKSh7ZGF0YTplLm92ZXJyaWRlLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy5yZWxldmFudD0oMCxjLmdldFJlbGV2YW50KShlLnJlbGV2YW50KSx0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5hcmM9bnVsbCx0aGlzLmJvb2xlYW49bnVsbCx0aGlzLmRhdGU9bnVsbCx0aGlzLmRhdGVUaW1lPW51bGwsdGhpcy5kZWNpbWFsPW51bGwsdGhpcy5leERhdGE9bnVsbCx0aGlzLmZsb2F0PW51bGwsdGhpcy5pbWFnZT1udWxsLHRoaXMuaW50ZWdlcj1udWxsLHRoaXMubGluZT1udWxsLHRoaXMucmVjdGFuZ2xlPW51bGwsdGhpcy50ZXh0PW51bGwsdGhpcy50aW1lPW51bGx9W24uJHNldFZhbHVlXShlKXt2YXIgdDtjb25zdCByPXRoaXNbbi4kZ2V0UGFyZW50XSgpO2lmKHIgaW5zdGFuY2VvZiBDZSYmbnVsbCE9PSh0PXIudWkpJiZ2b2lkIDAhPT10JiZ0LmltYWdlRWRpdClyZXR1cm4gdGhpcy5pbWFnZXx8KHRoaXMuaW1hZ2U9bmV3IFJlKHt9KSx0aGlzW24uJGFwcGVuZENoaWxkXSh0aGlzLmltYWdlKSksdm9pZCh0aGlzLmltYWdlW24uJGNvbnRlbnRdPWVbbi4kY29udGVudF0pO2NvbnN0IGE9ZVtuLiRub2RlTmFtZV07aWYobnVsbD09PXRoaXNbYV0pe2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtjb25zdCB0PXRoaXNbZV07dCBpbnN0YW5jZW9mIG8uWEZBT2JqZWN0JiYodGhpc1tlXT1udWxsLHRoaXNbbi4kcmVtb3ZlQ2hpbGRdKHQpKX10aGlzW2Vbbi4kbm9kZU5hbWVdXT1lLHRoaXNbbi4kYXBwZW5kQ2hpbGRdKGUpfWVsc2UgdGhpc1thXVtuLiRjb250ZW50XT1lW24uJGNvbnRlbnRdfVtuLiR0ZXh0XSgpe2lmKHRoaXMuZXhEYXRhKXJldHVybiJzdHJpbmciPT10eXBlb2YgdGhpcy5leERhdGFbbi4kY29udGVudF0/dGhpcy5leERhdGFbbi4kY29udGVudF0udHJpbSgpOnRoaXMuZXhEYXRhW24uJGNvbnRlbnRdW24uJHRleHRdKCkudHJpbSgpO2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtpZigiaW1hZ2UiPT09ZSljb250aW51ZTtjb25zdCB0PXRoaXNbZV07aWYodCBpbnN0YW5jZW9mIG8uWEZBT2JqZWN0KXJldHVybih0W24uJGNvbnRlbnRdfHwiIikudG9TdHJpbmcoKS50cmltKCl9cmV0dXJuIG51bGx9W24uJHRvSFRNTF0oZSl7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2NvbnN0IHI9dGhpc1t0XTtpZihyIGluc3RhbmNlb2Ygby5YRkFPYmplY3QpcmV0dXJuIHJbbi4kdG9IVE1MXShlKX1yZXR1cm4gYy5IVE1MUmVzdWx0LkVNUFRZfX10LlZhbHVlPU50O2NsYXNzIER0IGV4dGVuZHMgby5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoZiwidmFyaWFibGVzIiwhMCksdGhpcy5pZD1lLmlkfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiIsdGhpcy5ib29sZWFuPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGF0ZT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmRhdGVUaW1lPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuZGVjaW1hbD1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmV4RGF0YT1uZXcgby5YRkFPYmplY3RBcnJheSx0aGlzLmZsb2F0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMuaW1hZ2U9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5pbnRlZ2VyPW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMubWFuaWZlc3Q9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy5zY3JpcHQ9bmV3IG8uWEZBT2JqZWN0QXJyYXksdGhpcy50ZXh0PW5ldyBvLlhGQU9iamVjdEFycmF5LHRoaXMudGltZT1uZXcgby5YRkFPYmplY3RBcnJheX1bbi4kaXNUcmFuc3BhcmVudF0oKXtyZXR1cm4hMH19Y2xhc3MgQnR7c3RhdGljW2EuJGJ1aWxkWEZBT2JqZWN0XShlLHQpe2lmKEJ0Lmhhc093blByb3BlcnR5KGUpKXtjb25zdCByPUJ0W2VdKHQpO3JldHVybiByW24uJHNldFNldEF0dHJpYnV0ZXNdKHQpLHJ9fXN0YXRpYyBhcHBlYXJhbmNlRmlsdGVyKGUpe3JldHVybiBuZXcgRShlKX1zdGF0aWMgYXJjKGUpe3JldHVybiBuZXcgUChlKX1zdGF0aWMgYXJlYShlKXtyZXR1cm4gbmV3IFIoZSl9c3RhdGljIGFzc2lzdChlKXtyZXR1cm4gbmV3IE4oZSl9c3RhdGljIGJhcmNvZGUoZSl7cmV0dXJuIG5ldyBEKGUpfXN0YXRpYyBiaW5kKGUpe3JldHVybiBuZXcgQihlKX1zdGF0aWMgYmluZEl0ZW1zKGUpe3JldHVybiBuZXcgTChlKX1zdGF0aWMgYm9va2VuZChlKXtyZXR1cm4gbmV3IF8oZSl9c3RhdGljIGJvb2xlYW4oZSl7cmV0dXJuIG5ldyBqKGUpfXN0YXRpYyBib3JkZXIoZSl7cmV0dXJuIG5ldyBVKGUpfXN0YXRpYyBicmVhayhlKXtyZXR1cm4gbmV3ICQoZSl9c3RhdGljIGJyZWFrQWZ0ZXIoZSl7cmV0dXJuIG5ldyBYKGUpfXN0YXRpYyBicmVha0JlZm9yZShlKXtyZXR1cm4gbmV3IEgoZSl9c3RhdGljIGJ1dHRvbihlKXtyZXR1cm4gbmV3IHEoZSl9c3RhdGljIGNhbGN1bGF0ZShlKXtyZXR1cm4gbmV3IHooZSl9c3RhdGljIGNhcHRpb24oZSl7cmV0dXJuIG5ldyBHKGUpfXN0YXRpYyBjZXJ0aWZpY2F0ZShlKXtyZXR1cm4gbmV3IFcoZSl9c3RhdGljIGNlcnRpZmljYXRlcyhlKXtyZXR1cm4gbmV3IFYoZSl9c3RhdGljIGNoZWNrQnV0dG9uKGUpe3JldHVybiBuZXcgSyhlKX1zdGF0aWMgY2hvaWNlTGlzdChlKXtyZXR1cm4gbmV3IFkoZSl9c3RhdGljIGNvbG9yKGUpe3JldHVybiBuZXcgSihlKX1zdGF0aWMgY29tYihlKXtyZXR1cm4gbmV3IFooZSl9c3RhdGljIGNvbm5lY3QoZSl7cmV0dXJuIG5ldyBRKGUpfXN0YXRpYyBjb250ZW50QXJlYShlKXtyZXR1cm4gbmV3IGVlKGUpfXN0YXRpYyBjb3JuZXIoZSl7cmV0dXJuIG5ldyB0ZShlKX1zdGF0aWMgZGF0ZShlKXtyZXR1cm4gbmV3IHJlKGUpfXN0YXRpYyBkYXRlVGltZShlKXtyZXR1cm4gbmV3IG5lKGUpfXN0YXRpYyBkYXRlVGltZUVkaXQoZSl7cmV0dXJuIG5ldyBhZShlKX1zdGF0aWMgZGVjaW1hbChlKXtyZXR1cm4gbmV3IGllKGUpfXN0YXRpYyBkZWZhdWx0VWkoZSl7cmV0dXJuIG5ldyBzZShlKX1zdGF0aWMgZGVzYyhlKXtyZXR1cm4gbmV3IG9lKGUpfXN0YXRpYyBkaWdlc3RNZXRob2QoZSl7cmV0dXJuIG5ldyBjZShlKX1zdGF0aWMgZGlnZXN0TWV0aG9kcyhlKXtyZXR1cm4gbmV3IGxlKGUpfXN0YXRpYyBkcmF3KGUpe3JldHVybiBuZXcgaGUoZSl9c3RhdGljIGVkZ2UoZSl7cmV0dXJuIG5ldyB1ZShlKX1zdGF0aWMgZW5jb2RpbmcoZSl7cmV0dXJuIG5ldyBkZShlKX1zdGF0aWMgZW5jb2RpbmdzKGUpe3JldHVybiBuZXcgZmUoZSl9c3RhdGljIGVuY3J5cHQoZSl7cmV0dXJuIG5ldyBnZShlKX1zdGF0aWMgZW5jcnlwdERhdGEoZSl7cmV0dXJuIG5ldyBwZShlKX1zdGF0aWMgZW5jcnlwdGlvbihlKXtyZXR1cm4gbmV3IG1lKGUpfXN0YXRpYyBlbmNyeXB0aW9uTWV0aG9kKGUpe3JldHVybiBuZXcgYmUoZSl9c3RhdGljIGVuY3J5cHRpb25NZXRob2RzKGUpe3JldHVybiBuZXcgeWUoZSl9c3RhdGljIGV2ZW50KGUpe3JldHVybiBuZXcgd2UoZSl9c3RhdGljIGV4RGF0YShlKXtyZXR1cm4gbmV3IHZlKGUpfXN0YXRpYyBleE9iamVjdChlKXtyZXR1cm4gbmV3IHhlKGUpfXN0YXRpYyBleGNsR3JvdXAoZSl7cmV0dXJuIG5ldyBTZShlKX1zdGF0aWMgZXhlY3V0ZShlKXtyZXR1cm4gbmV3IEFlKGUpfXN0YXRpYyBleHRyYXMoZSl7cmV0dXJuIG5ldyBrZShlKX1zdGF0aWMgZmllbGQoZSl7cmV0dXJuIG5ldyBDZShlKX1zdGF0aWMgZmlsbChlKXtyZXR1cm4gbmV3IE9lKGUpfXN0YXRpYyBmaWx0ZXIoZSl7cmV0dXJuIG5ldyBGZShlKX1zdGF0aWMgZmxvYXQoZSl7cmV0dXJuIG5ldyBJZShlKX1zdGF0aWMgZm9udChlKXtyZXR1cm4gbmV3IFRlKGUpfXN0YXRpYyBmb3JtYXQoZSl7cmV0dXJuIG5ldyBNZShlKX1zdGF0aWMgaGFuZGxlcihlKXtyZXR1cm4gbmV3IEVlKGUpfXN0YXRpYyBoeXBoZW5hdGlvbihlKXtyZXR1cm4gbmV3IFBlKGUpfXN0YXRpYyBpbWFnZShlKXtyZXR1cm4gbmV3IFJlKGUpfXN0YXRpYyBpbWFnZUVkaXQoZSl7cmV0dXJuIG5ldyBOZShlKX1zdGF0aWMgaW50ZWdlcihlKXtyZXR1cm4gbmV3IERlKGUpfXN0YXRpYyBpc3N1ZXJzKGUpe3JldHVybiBuZXcgQmUoZSl9c3RhdGljIGl0ZW1zKGUpe3JldHVybiBuZXcgTGUoZSl9c3RhdGljIGtlZXAoZSl7cmV0dXJuIG5ldyBfZShlKX1zdGF0aWMga2V5VXNhZ2UoZSl7cmV0dXJuIG5ldyBqZShlKX1zdGF0aWMgbGluZShlKXtyZXR1cm4gbmV3IFVlKGUpfXN0YXRpYyBsaW5lYXIoZSl7cmV0dXJuIG5ldyAkZShlKX1zdGF0aWMgbG9ja0RvY3VtZW50KGUpe3JldHVybiBuZXcgWGUoZSl9c3RhdGljIG1hbmlmZXN0KGUpe3JldHVybiBuZXcgSGUoZSl9c3RhdGljIG1hcmdpbihlKXtyZXR1cm4gbmV3IHFlKGUpfXN0YXRpYyBtZHAoZSl7cmV0dXJuIG5ldyB6ZShlKX1zdGF0aWMgbWVkaXVtKGUpe3JldHVybiBuZXcgR2UoZSl9c3RhdGljIG1lc3NhZ2UoZSl7cmV0dXJuIG5ldyBXZShlKX1zdGF0aWMgbnVtZXJpY0VkaXQoZSl7cmV0dXJuIG5ldyBWZShlKX1zdGF0aWMgb2NjdXIoZSl7cmV0dXJuIG5ldyBLZShlKX1zdGF0aWMgb2lkKGUpe3JldHVybiBuZXcgWWUoZSl9c3RhdGljIG9pZHMoZSl7cmV0dXJuIG5ldyBKZShlKX1zdGF0aWMgb3ZlcmZsb3coZSl7cmV0dXJuIG5ldyBaZShlKX1zdGF0aWMgcGFnZUFyZWEoZSl7cmV0dXJuIG5ldyBRZShlKX1zdGF0aWMgcGFnZVNldChlKXtyZXR1cm4gbmV3IGV0KGUpfXN0YXRpYyBwYXJhKGUpe3JldHVybiBuZXcgdHQoZSl9c3RhdGljIHBhc3N3b3JkRWRpdChlKXtyZXR1cm4gbmV3IHJ0KGUpfXN0YXRpYyBwYXR0ZXJuKGUpe3JldHVybiBuZXcgbnQoZSl9c3RhdGljIHBpY3R1cmUoZSl7cmV0dXJuIG5ldyBhdChlKX1zdGF0aWMgcHJvdG8oZSl7cmV0dXJuIG5ldyBpdChlKX1zdGF0aWMgcmFkaWFsKGUpe3JldHVybiBuZXcgc3QoZSl9c3RhdGljIHJlYXNvbihlKXtyZXR1cm4gbmV3IG90KGUpfXN0YXRpYyByZWFzb25zKGUpe3JldHVybiBuZXcgY3QoZSl9c3RhdGljIHJlY3RhbmdsZShlKXtyZXR1cm4gbmV3IGx0KGUpfXN0YXRpYyByZWYoZSl7cmV0dXJuIG5ldyBodChlKX1zdGF0aWMgc2NyaXB0KGUpe3JldHVybiBuZXcgdXQoZSl9c3RhdGljIHNldFByb3BlcnR5KGUpe3JldHVybiBuZXcgZHQoZSl9c3RhdGljIHNpZ25EYXRhKGUpe3JldHVybiBuZXcgZnQoZSl9c3RhdGljIHNpZ25hdHVyZShlKXtyZXR1cm4gbmV3IGd0KGUpfXN0YXRpYyBzaWduaW5nKGUpe3JldHVybiBuZXcgcHQoZSl9c3RhdGljIHNvbGlkKGUpe3JldHVybiBuZXcgbXQoZSl9c3RhdGljIHNwZWFrKGUpe3JldHVybiBuZXcgYnQoZSl9c3RhdGljIHN0aXBwbGUoZSl7cmV0dXJuIG5ldyB5dChlKX1zdGF0aWMgc3ViZm9ybShlKXtyZXR1cm4gbmV3IHd0KGUpfXN0YXRpYyBzdWJmb3JtU2V0KGUpe3JldHVybiBuZXcgdnQoZSl9c3RhdGljIHN1YmplY3RETihlKXtyZXR1cm4gbmV3IHh0KGUpfXN0YXRpYyBzdWJqZWN0RE5zKGUpe3JldHVybiBuZXcgU3QoZSl9c3RhdGljIHN1Ym1pdChlKXtyZXR1cm4gbmV3IEF0KGUpfXN0YXRpYyB0ZW1wbGF0ZShlKXtyZXR1cm4gbmV3IGt0KGUpfXN0YXRpYyB0ZXh0KGUpe3JldHVybiBuZXcgQ3QoZSl9c3RhdGljIHRleHRFZGl0KGUpe3JldHVybiBuZXcgT3QoZSl9c3RhdGljIHRpbWUoZSl7cmV0dXJuIG5ldyBGdChlKX1zdGF0aWMgdGltZVN0YW1wKGUpe3JldHVybiBuZXcgSXQoZSl9c3RhdGljIHRvb2xUaXAoZSl7cmV0dXJuIG5ldyBUdChlKX1zdGF0aWMgdHJhdmVyc2FsKGUpe3JldHVybiBuZXcgTXQoZSl9c3RhdGljIHRyYXZlcnNlKGUpe3JldHVybiBuZXcgRXQoZSl9c3RhdGljIHVpKGUpe3JldHVybiBuZXcgUHQoZSl9c3RhdGljIHZhbGlkYXRlKGUpe3JldHVybiBuZXcgUnQoZSl9c3RhdGljIHZhbHVlKGUpe3JldHVybiBuZXcgTnQoZSl9c3RhdGljIHZhcmlhYmxlcyhlKXtyZXR1cm4gbmV3IER0KGUpfX10LlRlbXBsYXRlTmFtZXNwYWNlPUJ0fSwoZSx0LHIpPT57dmFyIG49cigzKSxhPXIoNCksaT1yKDI0KSxzPXIoMTEpLG89cig0NSkuZixjPXIoMzkpLGw9cigyMzIpLGg9cig3NSksdT1yKDc2KSxkPXIoMjMzKSxmPXIoODIpLGc9cig2KSxwPXIoMzYpLG09IkRPTUV4Y2VwdGlvbiIsYj1pKCJFcnJvciIpLHk9aShtKSx3PWZ1bmN0aW9uKCl7bCh0aGlzLHYpO3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD11KGU8MT92b2lkIDA6YXJndW1lbnRzWzBdKSxyPXUoZTwyP3ZvaWQgMDphcmd1bWVudHNbMV0sIkVycm9yIiksbj1uZXcgeSh0LHIpLGE9Yih0KTtyZXR1cm4gYS5uYW1lPW0sbyhuLCJzdGFjayIscygxLGYoYS5zdGFjaywxKSkpLGgobix0aGlzLHcpLG59LHY9dy5wcm90b3R5cGU9eS5wcm90b3R5cGUseD0ic3RhY2siaW4gYihtKSxTPSJzdGFjayJpbiBuZXcgeSgxLDIpLEE9eSYmZyYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLG0pLGs9ISghQXx8QS53cml0YWJsZSYmQS5jb25maWd1cmFibGUpLEM9eCYmIWsmJiFTO24oe2dsb2JhbDohMCxjb25zdHJ1Y3RvcjohMCxmb3JjZWQ6cHx8Q30se0RPTUV4Y2VwdGlvbjpDP3c6eX0pO3ZhciBPPWkobSksRj1PLnByb3RvdHlwZTtpZihGLmNvbnN0cnVjdG9yIT09Tylmb3IodmFyIEkgaW4gcHx8byhGLCJjb25zdHJ1Y3RvciIscygxLE8pKSxkKWlmKGMoZCxJKSl7dmFyIFQ9ZFtJXSxNPVQucztjKE8sTSl8fG8oTyxNLHMoNixULmMpKX19LChlLHQscik9Pnt2YXIgbj1yKDI1KSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihuKHQsZSkpcmV0dXJuIGU7dGhyb3cgYSgiSW5jb3JyZWN0IGludm9jYXRpb24iKX19LGU9PntlLmV4cG9ydHM9e0luZGV4U2l6ZUVycm9yOntzOiJJTkRFWF9TSVpFX0VSUiIsYzoxLG06MX0sRE9NU3RyaW5nU2l6ZUVycm9yOntzOiJET01TVFJJTkdfU0laRV9FUlIiLGM6MixtOjB9LEhpZXJhcmNoeVJlcXVlc3RFcnJvcjp7czoiSElFUkFSQ0hZX1JFUVVFU1RfRVJSIixjOjMsbToxfSxXcm9uZ0RvY3VtZW50RXJyb3I6e3M6IldST05HX0RPQ1VNRU5UX0VSUiIsYzo0LG06MX0sSW52YWxpZENoYXJhY3RlckVycm9yOntzOiJJTlZBTElEX0NIQVJBQ1RFUl9FUlIiLGM6NSxtOjF9LE5vRGF0YUFsbG93ZWRFcnJvcjp7czoiTk9fREFUQV9BTExPV0VEX0VSUiIsYzo2LG06MH0sTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyb3I6e3M6Ik5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiIsYzo3LG06MX0sTm90Rm91bmRFcnJvcjp7czoiTk9UX0ZPVU5EX0VSUiIsYzo4LG06MX0sTm90U3VwcG9ydGVkRXJyb3I6e3M6Ik5PVF9TVVBQT1JURURfRVJSIixjOjksbToxfSxJblVzZUF0dHJpYnV0ZUVycm9yOntzOiJJTlVTRV9BVFRSSUJVVEVfRVJSIixjOjEwLG06MX0sSW52YWxpZFN0YXRlRXJyb3I6e3M6IklOVkFMSURfU1RBVEVfRVJSIixjOjExLG06MX0sU3ludGF4RXJyb3I6e3M6IlNZTlRBWF9FUlIiLGM6MTIsbToxfSxJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3I6e3M6IklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiIsYzoxMyxtOjF9LE5hbWVzcGFjZUVycm9yOntzOiJOQU1FU1BBQ0VfRVJSIixjOjE0LG06MX0sSW52YWxpZEFjY2Vzc0Vycm9yOntzOiJJTlZBTElEX0FDQ0VTU19FUlIiLGM6MTUsbToxfSxWYWxpZGF0aW9uRXJyb3I6e3M6IlZBTElEQVRJT05fRVJSIixjOjE2LG06MH0sVHlwZU1pc21hdGNoRXJyb3I6e3M6IlRZUEVfTUlTTUFUQ0hfRVJSIixjOjE3LG06MX0sU2VjdXJpdHlFcnJvcjp7czoiU0VDVVJJVFlfRVJSIixjOjE4LG06MX0sTmV0d29ya0Vycm9yOntzOiJORVRXT1JLX0VSUiIsYzoxOSxtOjF9LEFib3J0RXJyb3I6e3M6IkFCT1JUX0VSUiIsYzoyMCxtOjF9LFVSTE1pc21hdGNoRXJyb3I6e3M6IlVSTF9NSVNNQVRDSF9FUlIiLGM6MjEsbToxfSxRdW90YUV4Y2VlZGVkRXJyb3I6e3M6IlFVT1RBX0VYQ0VFREVEX0VSUiIsYzoyMixtOjF9LFRpbWVvdXRFcnJvcjp7czoiVElNRU9VVF9FUlIiLGM6MjMsbToxfSxJbnZhbGlkTm9kZVR5cGVFcnJvcjp7czoiSU5WQUxJRF9OT0RFX1RZUEVfRVJSIixjOjI0LG06MX0sRGF0YUNsb25lRXJyb3I6e3M6IkRBVEFfQ0xPTkVfRVJSIixjOjI1LG06MX19fSwoZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk5hbWVzcGFjZUlkcz10LiRidWlsZFhGQU9iamVjdD12b2lkIDA7Y29uc3Qgcj1TeW1ib2woKTt0LiRidWlsZFhGQU9iamVjdD1yLHQuTmFtZXNwYWNlSWRzPXtjb25maWc6e2lkOjAsY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hjaS8iKX0sY29ubmVjdGlvblNldDp7aWQ6MSxjaGVjazplPT5lLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWNvbm5lY3Rpb24tc2V0LyIpfSxkYXRhc2V0czp7aWQ6MixjaGVjazplPT5lLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvIil9LGZvcm06e2lkOjMsY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1mb3JtLyIpfSxsb2NhbGVTZXQ6e2lkOjQsY2hlY2s6ZT0+ZS5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1sb2NhbGUtc2V0LyIpfSxwZGY6e2lkOjUsY2hlY2s6ZT0+Imh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL3BkZi8iPT09ZX0sc2lnbmF0dXJlOntpZDo2LGNoZWNrOmU9PiJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj09PWV9LHNvdXJjZVNldDp7aWQ6NyxjaGVjazplPT5lLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXNvdXJjZS1zZXQvIil9LHN0eWxlc2hlZXQ6e2lkOjgsY2hlY2s6ZT0+Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI9PT1lfSx0ZW1wbGF0ZTp7aWQ6OSxjaGVjazplPT5lLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXRlbXBsYXRlLyIpfSx4ZGM6e2lkOjEwLGNoZWNrOmU9PmUuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZGMvIil9LHhkcDp7aWQ6MTEsY2hlY2s6ZT0+Imh0dHA6Ly9ucy5hZG9iZS5jb20veGRwLyI9PT1lfSx4ZmRmOntpZDoxMixjaGVjazplPT4iaHR0cDovL25zLmFkb2JlLmNvbS94ZmRmLyI9PT1lfSx4aHRtbDp7aWQ6MTMsY2hlY2s6ZT0+Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPT09ZX0seG1wbWV0YTp7aWQ6MTQsY2hlY2s6ZT0+Imh0dHA6Ly9ucy5hZG9iZS5jb20veG1wbWV0YS8iPT09ZX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuYWRkSFRNTD1mdW5jdGlvbihlLHQscil7Y29uc3Qgcz1lW24uJGV4dHJhXSxvPXMuYXZhaWxhYmxlU3BhY2UsW2MsbCxoLHVdPXI7c3dpdGNoKGUubGF5b3V0KXtjYXNlInBvc2l0aW9uIjpzLndpZHRoPU1hdGgubWF4KHMud2lkdGgsYytoKSxzLmhlaWdodD1NYXRoLm1heChzLmhlaWdodCxsK3UpLHMuY2hpbGRyZW4ucHVzaCh0KTticmVhaztjYXNlImxyLXRiIjpjYXNlInJsLXRiIjpzLmxpbmUmJjEhPT1zLmF0dGVtcHR8fChzLmxpbmU9aShlLFtdKSxzLmNoaWxkcmVuLnB1c2gocy5saW5lKSxzLm51bWJlckluTGluZT0wKSxzLm51bWJlckluTGluZSs9MSxzLmxpbmUuY2hpbGRyZW4ucHVzaCh0KSwwPT09cy5hdHRlbXB0PyhzLmN1cnJlbnRXaWR0aCs9aCxzLmhlaWdodD1NYXRoLm1heChzLmhlaWdodCxzLnByZXZIZWlnaHQrdSkpOihzLmN1cnJlbnRXaWR0aD1oLHMucHJldkhlaWdodD1zLmhlaWdodCxzLmhlaWdodCs9dSxzLmF0dGVtcHQ9MCkscy53aWR0aD1NYXRoLm1heChzLndpZHRoLHMuY3VycmVudFdpZHRoKTticmVhaztjYXNlInJsLXJvdyI6Y2FzZSJyb3ciOntzLmNoaWxkcmVuLnB1c2godCkscy53aWR0aCs9aCxzLmhlaWdodD1NYXRoLm1heChzLmhlaWdodCx1KTtjb25zdCBlPSgwLGEubWVhc3VyZVRvU3RyaW5nKShzLmhlaWdodCk7Zm9yKGNvbnN0IHQgb2Ygcy5jaGlsZHJlbil0LmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0PWU7YnJlYWt9Y2FzZSJ0YWJsZSI6Y2FzZSJ0YiI6cy53aWR0aD1NYXRoLm1pbihvLndpZHRoLE1hdGgubWF4KHMud2lkdGgsaCkpLHMuaGVpZ2h0Kz11LHMuY2hpbGRyZW4ucHVzaCh0KX19LHQuY2hlY2tEaW1lbnNpb25zPWZ1bmN0aW9uKGUsdCl7dmFyIHI7aWYobnVsbD09PWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpW24uJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSlyZXR1cm4hMDtpZigwPT09ZS53fHwwPT09ZS5oKXJldHVybiEwO2NvbnN0IGE9ZVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpLGk9KG51bGw9PT0ocj1hW24uJGV4dHJhXSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuYXR0ZW1wdCl8fDAsWyxzLG8sY109ZnVuY3Rpb24oZSl7bGV0IHQscixuPSIiPT09ZS53P05hTjplLncsYT0iIj09PWUuaD9OYU46ZS5oLFtpLHNdPVswLDBdO3N3aXRjaChlLmFuY2hvclR5cGV8fCIiKXtjYXNlImJvdHRvbUNlbnRlciI6W2ksc109W24vMixhXTticmVhaztjYXNlImJvdHRvbUxlZnQiOltpLHNdPVswLGFdO2JyZWFrO2Nhc2UiYm90dG9tUmlnaHQiOltpLHNdPVtuLGFdO2JyZWFrO2Nhc2UibWlkZGxlQ2VudGVyIjpbaSxzXT1bbi8yLGEvMl07YnJlYWs7Y2FzZSJtaWRkbGVMZWZ0IjpbaSxzXT1bMCxhLzJdO2JyZWFrO2Nhc2UibWlkZGxlUmlnaHQiOltpLHNdPVtuLGEvMl07YnJlYWs7Y2FzZSJ0b3BDZW50ZXIiOltpLHNdPVtuLzIsMF07YnJlYWs7Y2FzZSJ0b3BSaWdodCI6W2ksc109W24sMF19c3dpdGNoKGUucm90YXRlfHwwKXtjYXNlIDA6W3Qscl09Wy1pLC1zXTticmVhaztjYXNlIDkwOlt0LHJdPVstcyxpXSxbbixhXT1bYSwtbl07YnJlYWs7Y2FzZSAxODA6W3Qscl09W2ksc10sW24sYV09Wy1uLC1hXTticmVhaztjYXNlIDI3MDpbdCxyXT1bcywtaV0sW24sYV09Wy1hLG5dfXJldHVybltlLngrdCtNYXRoLm1pbigwLG4pLGUueStyK01hdGgubWluKDAsYSksTWF0aC5hYnMobiksTWF0aC5hYnMoYSldfShlKTtzd2l0Y2goYS5sYXlvdXQpe2Nhc2UibHItdGIiOmNhc2UicmwtdGIiOnJldHVybiAwPT09aT9lW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlPyIiIT09ZS53P01hdGgucm91bmQoby10LndpZHRoKTw9Mjp0LndpZHRoPjI6ISgiIiE9PWUuaCYmTWF0aC5yb3VuZChjLXQuaGVpZ2h0KT4yKSYmKCIiIT09ZS53P01hdGgucm91bmQoby10LndpZHRoKTw9Mnx8MD09PWFbbi4kZXh0cmFdLm51bWJlckluTGluZSYmdC5oZWlnaHQ+Mjp0LndpZHRoPjIpOiEhZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZXx8ISgiIiE9PWUuaCYmTWF0aC5yb3VuZChjLXQuaGVpZ2h0KT4yKSYmKCIiPT09ZS53fHxNYXRoLnJvdW5kKG8tdC53aWR0aCk8PTJ8fCFhW24uJGlzVGhlcmVNb3JlV2lkdGhdKCkpJiZ0LmhlaWdodD4yO2Nhc2UidGFibGUiOmNhc2UidGIiOnJldHVybiEhZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZXx8KCIiPT09ZS5ofHxlW24uJGlzU3BsaXR0YWJsZV0oKT8oIiI9PT1lLnd8fE1hdGgucm91bmQoby10LndpZHRoKTw9Mnx8IWFbbi4kaXNUaGVyZU1vcmVXaWR0aF0oKSkmJnQuaGVpZ2h0PjI6TWF0aC5yb3VuZChjLXQuaGVpZ2h0KTw9Mik7Y2FzZSJwb3NpdGlvbiI6cmV0dXJuISFlW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlfHwiIj09PWUuaHx8TWF0aC5yb3VuZChjK3MtdC5oZWlnaHQpPD0yfHxjK3M+ZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKClbbi4kZXh0cmFdLmN1cnJlbnRDb250ZW50QXJlYS5oO2Nhc2Uicmwtcm93IjpjYXNlInJvdyI6cmV0dXJuISFlW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlfHwiIj09PWUuaHx8TWF0aC5yb3VuZChjLXQuaGVpZ2h0KTw9MjtkZWZhdWx0OnJldHVybiEwfX0sdC5mbHVzaEhUTUw9ZnVuY3Rpb24oZSl7aWYoIWVbbi4kZXh0cmFdKXJldHVybiBudWxsO2NvbnN0IHQ9e25hbWU6ImRpdiIsYXR0cmlidXRlczplW24uJGV4dHJhXS5hdHRyaWJ1dGVzLGNoaWxkcmVuOmVbbi4kZXh0cmFdLmNoaWxkcmVufTtpZihlW24uJGV4dHJhXS5mYWlsaW5nTm9kZSl7Y29uc3Qgcj1lW24uJGV4dHJhXS5mYWlsaW5nTm9kZVtuLiRmbHVzaEhUTUxdKCk7ciYmKGUubGF5b3V0LmVuZHNXaXRoKCItdGIiKT90LmNoaWxkcmVuLnB1c2goaShlLFtyXSkpOnQuY2hpbGRyZW4ucHVzaChyKSl9cmV0dXJuIDA9PT10LmNoaWxkcmVuLmxlbmd0aD9udWxsOnR9LHQuZ2V0QXZhaWxhYmxlU3BhY2U9ZnVuY3Rpb24oZSl7Y29uc3QgdD1lW24uJGV4dHJhXS5hdmFpbGFibGVTcGFjZSxyPWUubWFyZ2luP2UubWFyZ2luLnRvcEluc2V0K2UubWFyZ2luLmJvdHRvbUluc2V0OjAsYT1lLm1hcmdpbj9lLm1hcmdpbi5sZWZ0SW5zZXQrZS5tYXJnaW4ucmlnaHRJbnNldDowO3N3aXRjaChlLmxheW91dCl7Y2FzZSJsci10YiI6Y2FzZSJybC10YiI6cmV0dXJuIDA9PT1lW24uJGV4dHJhXS5hdHRlbXB0P3t3aWR0aDp0LndpZHRoLWEtZVtuLiRleHRyYV0uY3VycmVudFdpZHRoLGhlaWdodDp0LmhlaWdodC1yLWVbbi4kZXh0cmFdLnByZXZIZWlnaHR9Ont3aWR0aDp0LndpZHRoLWEsaGVpZ2h0OnQuaGVpZ2h0LXItZVtuLiRleHRyYV0uaGVpZ2h0fTtjYXNlInJsLXJvdyI6Y2FzZSJyb3ciOnJldHVybnt3aWR0aDplW24uJGV4dHJhXS5jb2x1bW5XaWR0aHMuc2xpY2UoZVtuLiRleHRyYV0uY3VycmVudENvbHVtbikucmVkdWNlKCgoZSx0KT0+ZSt0KSksaGVpZ2h0OnQuaGVpZ2h0LWF9O2Nhc2UidGFibGUiOmNhc2UidGIiOnJldHVybnt3aWR0aDp0LndpZHRoLWEsaGVpZ2h0OnQuaGVpZ2h0LXItZVtuLiRleHRyYV0uaGVpZ2h0fTtkZWZhdWx0OnJldHVybiB0fX0scigxMzkpO3ZhciBuPXIoMjI4KSxhPXIoMjM2KTtmdW5jdGlvbiBpKGUsdCl7cmV0dXJue25hbWU6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJsci10YiI9PT1lLmxheW91dD8ieGZhTHIiOiJ4ZmFSbCJdfSxjaGlsZHJlbjp0fX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5jb21wdXRlQmJveD1mdW5jdGlvbihlLHQscil7bGV0IGE7aWYoIiIhPT1lLncmJiIiIT09ZS5oKWE9W2UueCxlLnksZS53LGUuaF07ZWxzZXtpZighcilyZXR1cm4gbnVsbDtsZXQgaT1lLnc7aWYoIiI9PT1pKXtpZigwPT09ZS5tYXhXKXtjb25zdCB0PWVbbi4kZ2V0U3ViZm9ybVBhcmVudF0oKTtpPSJwb3NpdGlvbiI9PT10LmxheW91dCYmIiIhPT10Lnc/MDplLm1pbld9ZWxzZSBpPU1hdGgubWluKGUubWF4VyxyLndpZHRoKTt0LmF0dHJpYnV0ZXMuc3R5bGUud2lkdGg9bChpKX1sZXQgcz1lLmg7aWYoIiI9PT1zKXtpZigwPT09ZS5tYXhIKXtjb25zdCB0PWVbbi4kZ2V0U3ViZm9ybVBhcmVudF0oKTtzPSJwb3NpdGlvbiI9PT10LmxheW91dCYmIiIhPT10Lmg/MDplLm1pbkh9ZWxzZSBzPU1hdGgubWluKGUubWF4SCxyLmhlaWdodCk7dC5hdHRyaWJ1dGVzLnN0eWxlLmhlaWdodD1sKHMpfWE9W2UueCxlLnksaSxzXX1yZXR1cm4gYX0sdC5jcmVhdGVXcmFwcGVyPWZ1bmN0aW9uKGUsdCl7Y29uc3R7YXR0cmlidXRlczpyfT10LHtzdHlsZTphfT1yLGk9e25hbWU6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJ4ZmFXcmFwcGVyIl0sc3R5bGU6T2JqZWN0LmNyZWF0ZShudWxsKX0sY2hpbGRyZW46W119O2lmKHIuY2xhc3MucHVzaCgieGZhV3JhcHBlZCIpLGUuYm9yZGVyKXtjb25zdHt3aWR0aHM6cixpbnNldHM6c309ZS5ib3JkZXJbbi4kZXh0cmFdO2xldCBvLGMsbD1zWzBdLGg9c1szXTtjb25zdCB1PXNbMF0rc1syXSxmPXNbMV0rc1szXTtzd2l0Y2goZS5ib3JkZXIuaGFuZCl7Y2FzZSJldmVuIjpsLT1yWzBdLzIsaC09clszXS8yLG89ImNhbGMoMTAwJSArICIuY29uY2F0KChyWzFdK3JbM10pLzItZiwicHgpIiksYz0iY2FsYygxMDAlICsgIi5jb25jYXQoKHJbMF0rclsyXSkvMi11LCJweCkiKTticmVhaztjYXNlImxlZnQiOmwtPXJbMF0saC09clszXSxvPSJjYWxjKDEwMCUgKyAiLmNvbmNhdChyWzFdK3JbM10tZiwicHgpIiksYz0iY2FsYygxMDAlICsgIi5jb25jYXQoclswXStyWzJdLXUsInB4KSIpO2JyZWFrO2Nhc2UicmlnaHQiOm89Zj8iY2FsYygxMDAlIC0gIi5jb25jYXQoZiwicHgpIik6IjEwMCUiLGM9dT8iY2FsYygxMDAlIC0gIi5jb25jYXQodSwicHgpIik6IjEwMCUifWNvbnN0IGc9WyJ4ZmFCb3JkZXIiXTtkKGUuYm9yZGVyKSYmZy5wdXNoKCJ4ZmFQcmludE9ubHkiKTtjb25zdCBwPXtuYW1lOiJkaXYiLGF0dHJpYnV0ZXM6e2NsYXNzOmcsc3R5bGU6e3RvcDoiIi5jb25jYXQobCwicHgiKSxsZWZ0OiIiLmNvbmNhdChoLCJweCIpLHdpZHRoOm8saGVpZ2h0OmN9fSxjaGlsZHJlbjpbXX07Zm9yKGNvbnN0IGUgb2ZbImJvcmRlciIsImJvcmRlcldpZHRoIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJSYWRpdXMiLCJib3JkZXJTdHlsZSJdKXZvaWQgMCE9PWFbZV0mJihwLmF0dHJpYnV0ZXMuc3R5bGVbZV09YVtlXSxkZWxldGUgYVtlXSk7aS5jaGlsZHJlbi5wdXNoKHAsdCl9ZWxzZSBpLmNoaWxkcmVuLnB1c2godCk7Zm9yKGNvbnN0IGUgb2ZbImJhY2tncm91bmQiLCJiYWNrZ3JvdW5kQ2xpcCIsInRvcCIsImxlZnQiLCJ3aWR0aCIsImhlaWdodCIsIm1pbldpZHRoIiwibWluSGVpZ2h0IiwibWF4V2lkdGgiLCJtYXhIZWlnaHQiLCJ0cmFuc2Zvcm0iLCJ0cmFuc2Zvcm1PcmlnaW4iLCJ2aXNpYmlsaXR5Il0pdm9pZCAwIT09YVtlXSYmKGkuYXR0cmlidXRlcy5zdHlsZVtlXT1hW2VdLGRlbGV0ZSBhW2VdKTtyZXR1cm4gaS5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI9PT1hLnBvc2l0aW9uPyJhYnNvbHV0ZSI6InJlbGF0aXZlIixkZWxldGUgYS5wb3NpdGlvbixhLmFsaWduU2VsZiYmKGkuYXR0cmlidXRlcy5zdHlsZS5hbGlnblNlbGY9YS5hbGlnblNlbGYsZGVsZXRlIGEuYWxpZ25TZWxmKSxpfSx0LmZpeERpbWVuc2lvbnM9ZnVuY3Rpb24oZSl7dmFyIHQ7Y29uc3Qgcj1lW24uJGdldFN1YmZvcm1QYXJlbnRdKCk7aWYobnVsbCE9PSh0PXIubGF5b3V0KSYmdm9pZCAwIT09dCYmdC5pbmNsdWRlcygicm93Iikpe2NvbnN0IHQ9cltuLiRleHRyYV0sYT1lLmNvbFNwYW47bGV0IGk7aT0tMT09PWE/dC5jb2x1bW5XaWR0aHMuc2xpY2UodC5jdXJyZW50Q29sdW1uKS5yZWR1Y2UoKChlLHQpPT5lK3QpLDApOnQuY29sdW1uV2lkdGhzLnNsaWNlKHQuY3VycmVudENvbHVtbix0LmN1cnJlbnRDb2x1bW4rYSkucmVkdWNlKCgoZSx0KT0+ZSt0KSwwKSxpc05hTihpKXx8KGUudz1pKX1yLmxheW91dCYmInBvc2l0aW9uIiE9PXIubGF5b3V0JiYoZS54PWUueT0wKSwidGFibGUiPT09ZS5sYXlvdXQmJiIiPT09ZS53JiZBcnJheS5pc0FycmF5KGUuY29sdW1uV2lkdGhzKSYmKGUudz1lLmNvbHVtbldpZHRocy5yZWR1Y2UoKChlLHQpPT5lK3QpLDApKX0sdC5maXhUZXh0SW5kZW50PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9KDAsaS5nZXRNZWFzdXJlbWVudCkoZS50ZXh0SW5kZW50LCIwcHgiKTtpZih0Pj0wKXJldHVybjtjb25zdCByPSJwYWRkaW5nIisoImxlZnQiPT0oInJpZ2h0Ij09PWUudGV4dEFsaWduPyJyaWdodCI6ImxlZnQiKT8iTGVmdCI6IlJpZ2h0Iiksbj0oMCxpLmdldE1lYXN1cmVtZW50KShlW3JdLCIwcHgiKTtlW3JdPW4tdCsicHgifSx0LmZpeFVSTD1mdW5jdGlvbihlKXtjb25zdCB0PSgwLGEuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkoZSxudWxsLHthZGREZWZhdWx0UHJvdG9jb2w6ITAsdHJ5Q29udmVydEVuY29kaW5nOiEwfSk7cmV0dXJuIHQ/dC5ocmVmOm51bGx9LHQuaXNQcmludE9ubHk9ZCx0LmxheW91dENsYXNzPWZ1bmN0aW9uKGUpe3N3aXRjaChlLmxheW91dCl7Y2FzZSJwb3NpdGlvbiI6ZGVmYXVsdDpyZXR1cm4ieGZhUG9zaXRpb24iO2Nhc2UibHItdGIiOnJldHVybiJ4ZmFMclRiIjtjYXNlInJsLXJvdyI6cmV0dXJuInhmYVJsUm93IjtjYXNlInJsLXRiIjpyZXR1cm4ieGZhUmxUYiI7Y2FzZSJyb3ciOnJldHVybiJ4ZmFSb3ciO2Nhc2UidGFibGUiOnJldHVybiJ4ZmFUYWJsZSI7Y2FzZSJ0YiI6cmV0dXJuInhmYVRiIn19LHQubGF5b3V0Tm9kZT1mdW5jdGlvbihlLHQpe2xldCByPW51bGwsYT1udWxsLGk9ITE7aWYoKCFlLnd8fCFlLmgpJiZlLnZhbHVlKXtsZXQgcz0wLG89MDtlLm1hcmdpbiYmKHM9ZS5tYXJnaW4ubGVmdEluc2V0K2UubWFyZ2luLnJpZ2h0SW5zZXQsbz1lLm1hcmdpbi50b3BJbnNldCtlLm1hcmdpbi5ib3R0b21JbnNldCk7bGV0IGM9bnVsbCxsPW51bGw7ZS5wYXJhJiYobD1PYmplY3QuY3JlYXRlKG51bGwpLGM9IiI9PT1lLnBhcmEubGluZUhlaWdodD9udWxsOmUucGFyYS5saW5lSGVpZ2h0LGwudG9wPSIiPT09ZS5wYXJhLnNwYWNlQWJvdmU/MDplLnBhcmEuc3BhY2VBYm92ZSxsLmJvdHRvbT0iIj09PWUucGFyYS5zcGFjZUJlbG93PzA6ZS5wYXJhLnNwYWNlQmVsb3csbC5sZWZ0PSIiPT09ZS5wYXJhLm1hcmdpbkxlZnQ/MDplLnBhcmEubWFyZ2luTGVmdCxsLnJpZ2h0PSIiPT09ZS5wYXJhLm1hcmdpblJpZ2h0PzA6ZS5wYXJhLm1hcmdpblJpZ2h0KTtsZXQgaD1lLmZvbnQ7aWYoIWgpe2NvbnN0IHQ9ZVtuLiRnZXRUZW1wbGF0ZVJvb3RdKCk7bGV0IHI9ZVtuLiRnZXRQYXJlbnRdKCk7Zm9yKDtyJiZyIT09dDspe2lmKHIuZm9udCl7aD1yLmZvbnQ7YnJlYWt9cj1yW24uJGdldFBhcmVudF0oKX19Y29uc3QgZD0oZS53fHx0LndpZHRoKS1zLGY9ZVtuLiRnbG9iYWxEYXRhXS5mb250RmluZGVyO2lmKGUudmFsdWUuZXhEYXRhJiZlLnZhbHVlLmV4RGF0YVtuLiRjb250ZW50XSYmInRleHQvaHRtbCI9PT1lLnZhbHVlLmV4RGF0YS5jb250ZW50VHlwZSl7Y29uc3QgdD11KGUudmFsdWUuZXhEYXRhW24uJGNvbnRlbnRdLGgsbCxjLGYsZCk7YT10LndpZHRoLHI9dC5oZWlnaHQsaT10LmlzQnJva2VufWVsc2V7Y29uc3QgdD1lLnZhbHVlW24uJHRleHRdKCk7aWYodCl7Y29uc3QgZT11KHQsaCxsLGMsZixkKTthPWUud2lkdGgscj1lLmhlaWdodCxpPWUuaXNCcm9rZW59fW51bGw9PT1hfHxlLnd8fChhKz1zKSxudWxsPT09cnx8ZS5ofHwocis9byl9cmV0dXJue3c6YSxoOnIsaXNCcm9rZW46aX19LHQubWVhc3VyZVRvU3RyaW5nPWwsdC5zZXRBY2Nlc3M9ZnVuY3Rpb24oZSx0KXtzd2l0Y2goZS5hY2Nlc3Mpe2Nhc2Uibm9uSW50ZXJhY3RpdmUiOnQucHVzaCgieGZhTm9uSW50ZXJhY3RpdmUiKTticmVhaztjYXNlInJlYWRPbmx5Ijp0LnB1c2goInhmYVJlYWRPbmx5Iik7YnJlYWs7Y2FzZSJwcm90ZWN0ZWQiOnQucHVzaCgieGZhRGlzYWJsZWQiKX19LHQuc2V0Rm9udEZhbWlseT1mdW5jdGlvbihlLHQscixuKXtpZighcilyZXR1cm4gdm9pZCBkZWxldGUgbi5mb250RmFtaWx5O2NvbnN0IGE9KDAsaS5zdHJpcFF1b3RlcykoZS50eXBlZmFjZSk7bi5mb250RmFtaWx5PSciJy5jb25jYXQoYSwnIicpO2NvbnN0IG89ci5maW5kKGEpO2lmKG8pe2NvbnN0e2ZvbnRGYW1pbHk6cn09by5yZWd1bGFyLmNzc0ZvbnRJbmZvO3IhPT1hJiYobi5mb250RmFtaWx5PSciJy5jb25jYXQociwnIicpKTtjb25zdCBpPWYodCk7aWYoaSYmIiIhPT1pLmxpbmVIZWlnaHQpcmV0dXJuO2lmKG4ubGluZUhlaWdodClyZXR1cm47Y29uc3QgYz0oMCxzLnNlbGVjdEZvbnQpKGUsbyk7YyYmKG4ubGluZUhlaWdodD1NYXRoLm1heCgxLjIsYy5saW5lSGVpZ2h0KSl9fSx0LnNldE1pbk1heERpbWVuc2lvbnM9ZnVuY3Rpb24oZSx0KXsicG9zaXRpb24iPT09ZVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpLmxheW91dCYmKGUubWluVz4wJiYodC5taW5XaWR0aD1sKGUubWluVykpLGUubWF4Vz4wJiYodC5tYXhXaWR0aD1sKGUubWF4VykpLGUubWluSD4wJiYodC5taW5IZWlnaHQ9bChlLm1pbkgpKSxlLm1heEg+MCYmKHQubWF4SGVpZ2h0PWwoZS5tYXhIKSkpfSx0LnNldFBhcmE9ZnVuY3Rpb24oZSx0LHIpe3ZhciBhO2lmKG51bGwhPT0oYT1yLmF0dHJpYnV0ZXMuY2xhc3MpJiZ2b2lkIDAhPT1hJiZhLmluY2x1ZGVzKCJ4ZmFSaWNoIikpe3QmJigiIj09PWUuaCYmKHQuaGVpZ2h0PSJhdXRvIiksIiI9PT1lLncmJih0LndpZHRoPSJhdXRvIikpO2NvbnN0IGE9ZihlKTtpZihhKXtjb25zdCBlPXIuYXR0cmlidXRlcy5zdHlsZTtzd2l0Y2goZS5kaXNwbGF5PSJmbGV4IixlLmZsZXhEaXJlY3Rpb249ImNvbHVtbiIsYS52QWxpZ24pe2Nhc2UidG9wIjplLmp1c3RpZnlDb250ZW50PSJzdGFydCI7YnJlYWs7Y2FzZSJib3R0b20iOmUuanVzdGlmeUNvbnRlbnQ9ImVuZCI7YnJlYWs7Y2FzZSJtaWRkbGUiOmUuanVzdGlmeUNvbnRlbnQ9ImNlbnRlciJ9Y29uc3QgdD1hW24uJHRvU3R5bGVdKCk7Zm9yKGNvbnN0W3Isbl1vZiBPYmplY3QuZW50cmllcyh0KSlyIGluIGV8fChlW3JdPW4pfX19LHQudG9TdHlsZT1mdW5jdGlvbihlKXtjb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGgsaT1uZXcgQXJyYXkocj4xP3ItMTowKSxzPTE7czxyO3MrKylpW3MtMV09YXJndW1lbnRzW3NdO2Zvcihjb25zdCByIG9mIGkpe2NvbnN0IGk9ZVtyXTtpZihudWxsIT09aSlpZihoLmhhc093blByb3BlcnR5KHIpKWhbcl0oZSx0KTtlbHNlIGlmKGkgaW5zdGFuY2VvZiBjLlhGQU9iamVjdCl7Y29uc3QgZT1pW24uJHRvU3R5bGVdKCk7ZT9PYmplY3QuYXNzaWduKHQsZSk6KDAsYS53YXJuKSgiKERFQlVHKSAtIFhGQSAtIHN0eWxlIGZvciAiLmNvbmNhdChyLCIgbm90IGltcGxlbWVudGVkIHlldCIpKX19cmV0dXJuIHR9LHIoMTM5KTt2YXIgbj1yKDIyOCksYT1yKDE0NCksaT1yKDIzNykscz1yKDIzOCksbz1yKDIzOSksYz1yKDI0MCk7ZnVuY3Rpb24gbChlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/IjBweCI6TnVtYmVyLmlzSW50ZWdlcihlKT8iIi5jb25jYXQoZSwicHgiKToiIi5jb25jYXQoZS50b0ZpeGVkKDIpLCJweCIpfWNvbnN0IGg9e2FuY2hvclR5cGUoZSx0KXtjb25zdCByPWVbbi4kZ2V0U3ViZm9ybVBhcmVudF0oKTtpZihyJiYoIXIubGF5b3V0fHwicG9zaXRpb24iPT09ci5sYXlvdXQpKXN3aXRjaCgidHJhbnNmb3JtImluIHR8fCh0LnRyYW5zZm9ybT0iIiksZS5hbmNob3JUeXBlKXtjYXNlImJvdHRvbUNlbnRlciI6dC50cmFuc2Zvcm0rPSJ0cmFuc2xhdGUoLTUwJSwgLTEwMCUpIjticmVhaztjYXNlImJvdHRvbUxlZnQiOnQudHJhbnNmb3JtKz0idHJhbnNsYXRlKDAsLTEwMCUpIjticmVhaztjYXNlImJvdHRvbVJpZ2h0Ijp0LnRyYW5zZm9ybSs9InRyYW5zbGF0ZSgtMTAwJSwtMTAwJSkiO2JyZWFrO2Nhc2UibWlkZGxlQ2VudGVyIjp0LnRyYW5zZm9ybSs9InRyYW5zbGF0ZSgtNTAlLC01MCUpIjticmVhaztjYXNlIm1pZGRsZUxlZnQiOnQudHJhbnNmb3JtKz0idHJhbnNsYXRlKDAsLTUwJSkiO2JyZWFrO2Nhc2UibWlkZGxlUmlnaHQiOnQudHJhbnNmb3JtKz0idHJhbnNsYXRlKC0xMDAlLC01MCUpIjticmVhaztjYXNlInRvcENlbnRlciI6dC50cmFuc2Zvcm0rPSJ0cmFuc2xhdGUoLTUwJSwwKSI7YnJlYWs7Y2FzZSJ0b3BSaWdodCI6dC50cmFuc2Zvcm0rPSJ0cmFuc2xhdGUoLTEwMCUsMCkifX0sZGltZW5zaW9ucyhlLHQpe3ZhciByO2NvbnN0IGE9ZVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpO2xldCBpPWUudztjb25zdCBzPWUuaDtpZihudWxsIT09KHI9YS5sYXlvdXQpJiZ2b2lkIDAhPT1yJiZyLmluY2x1ZGVzKCJyb3ciKSl7Y29uc3QgdD1hW24uJGV4dHJhXSxyPWUuY29sU3BhbjtsZXQgczstMT09PXI/KHM9dC5jb2x1bW5XaWR0aHMuc2xpY2UodC5jdXJyZW50Q29sdW1uKS5yZWR1Y2UoKChlLHQpPT5lK3QpLDApLHQuY3VycmVudENvbHVtbj0wKToocz10LmNvbHVtbldpZHRocy5zbGljZSh0LmN1cnJlbnRDb2x1bW4sdC5jdXJyZW50Q29sdW1uK3IpLnJlZHVjZSgoKGUsdCk9PmUrdCksMCksdC5jdXJyZW50Q29sdW1uPSh0LmN1cnJlbnRDb2x1bW4rZS5jb2xTcGFuKSV0LmNvbHVtbldpZHRocy5sZW5ndGgpLGlzTmFOKHMpfHwoaT1lLnc9cyl9dC53aWR0aD0iIiE9PWk/bChpKToiYXV0byIsdC5oZWlnaHQ9IiIhPT1zP2wocyk6ImF1dG8ifSxwb3NpdGlvbihlLHQpe2NvbnN0IHI9ZVtuLiRnZXRTdWJmb3JtUGFyZW50XSgpO251bGwhPXImJnIubGF5b3V0JiYicG9zaXRpb24iIT09ci5sYXlvdXR8fCh0LnBvc2l0aW9uPSJhYnNvbHV0ZSIsdC5sZWZ0PWwoZS54KSx0LnRvcD1sKGUueSkpfSxyb3RhdGUoZSx0KXtlLnJvdGF0ZSYmKCJ0cmFuc2Zvcm0iaW4gdHx8KHQudHJhbnNmb3JtPSIiKSx0LnRyYW5zZm9ybSs9InJvdGF0ZSgtIi5jb25jYXQoZS5yb3RhdGUsImRlZykiKSx0LnRyYW5zZm9ybU9yaWdpbj0idG9wIGxlZnQiKX0scHJlc2VuY2UoZSx0KXtzd2l0Y2goZS5wcmVzZW5jZSl7Y2FzZSJpbnZpc2libGUiOnQudmlzaWJpbGl0eT0iaGlkZGVuIjticmVhaztjYXNlImhpZGRlbiI6Y2FzZSJpbmFjdGl2ZSI6dC5kaXNwbGF5PSJub25lIn19LGhBbGlnbihlLHQpe2lmKCJwYXJhIj09PWVbbi4kbm9kZU5hbWVdKXN3aXRjaChlLmhBbGlnbil7Y2FzZSJqdXN0aWZ5QWxsIjp0LnRleHRBbGlnbj0ianVzdGlmeS1hbGwiO2JyZWFrO2Nhc2UicmFkaXgiOnQudGV4dEFsaWduPSJsZWZ0IjticmVhaztkZWZhdWx0OnQudGV4dEFsaWduPWUuaEFsaWdufWVsc2Ugc3dpdGNoKGUuaEFsaWduKXtjYXNlImxlZnQiOnQuYWxpZ25TZWxmPSJzdGFydCI7YnJlYWs7Y2FzZSJjZW50ZXIiOnQuYWxpZ25TZWxmPSJjZW50ZXIiO2JyZWFrO2Nhc2UicmlnaHQiOnQuYWxpZ25TZWxmPSJlbmQifX0sbWFyZ2luKGUsdCl7ZS5tYXJnaW4mJih0Lm1hcmdpbj1lLm1hcmdpbltuLiR0b1N0eWxlXSgpLm1hcmdpbil9fTtmdW5jdGlvbiB1KGUsdCxyLGEsaSxzKXtjb25zdCBjPW5ldyBvLlRleHRNZWFzdXJlKHQscixhLGkpO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9jLmFkZFN0cmluZyhlKTplW24uJHB1c2hHbHlwaHNdKGMpLGMuY29tcHV0ZShzKX1mdW5jdGlvbiBkKGUpe3JldHVybiBlLnJlbGV2YW50Lmxlbmd0aD4wJiYhZS5yZWxldmFudFswXS5leGNsdWRlZCYmInByaW50Ij09PWUucmVsZXZhbnRbMF0udmlld25hbWV9ZnVuY3Rpb24gZihlKXtjb25zdCB0PWVbbi4kZ2V0VGVtcGxhdGVSb290XSgpW24uJGV4dHJhXS5wYXJhU3RhY2s7cmV0dXJuIHQubGVuZ3RoP3QuYXQoLTEpOm51bGx9fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuSFRNTFJlc3VsdD12b2lkIDAsdC5nZXRCQm94PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9LTE7aWYoIWUpcmV0dXJue3g6dCx5OnQsd2lkdGg6dCxoZWlnaHQ6dH07Y29uc3Qgcj1lLnRyaW0oKS5zcGxpdCgvXHMqLFxzKi8pLm1hcCgoZT0+byhlLCItMSIpKSk7aWYoci5sZW5ndGg8NHx8clsyXTwwfHxyWzNdPDApcmV0dXJue3g6dCx5OnQsd2lkdGg6dCxoZWlnaHQ6dH07Y29uc3RbbixhLGksc109cjtyZXR1cm57eDpuLHk6YSx3aWR0aDppLGhlaWdodDpzfX0sdC5nZXRDb2xvcj1mdW5jdGlvbihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06WzAsMCwwXSxbcixuLGFdPXQ7aWYoIWUpcmV0dXJue3IsZzpuLGI6YX07Y29uc3QgaT1lLnRyaW0oKS5zcGxpdCgvXHMqLFxzKi8pLm1hcCgoZT0+TWF0aC5taW4oTWF0aC5tYXgoMCxwYXJzZUludChlLnRyaW0oKSwxMCkpLDI1NSkpKS5tYXAoKGU9PmlzTmFOKGUpPzA6ZSkpO3JldHVybiBpLmxlbmd0aDwzfHwoW3IsbixhXT1pKSx7cixnOm4sYjphfX0sdC5nZXRGbG9hdD1mdW5jdGlvbihlKXtsZXR7ZGF0YTp0LGRlZmF1bHRWYWx1ZTpyLHZhbGlkYXRlOm59PWU7aWYoIXQpcmV0dXJuIHI7dD10LnRyaW0oKTtjb25zdCBhPXBhcnNlRmxvYXQodCk7cmV0dXJuIWlzTmFOKGEpJiZuKGEpP2E6cn0sdC5nZXRJbnRlZ2VyPWZ1bmN0aW9uKGUpe2xldHtkYXRhOnQsZGVmYXVsdFZhbHVlOnIsdmFsaWRhdGU6bn09ZTtpZighdClyZXR1cm4gcjt0PXQudHJpbSgpO2NvbnN0IGE9cGFyc2VJbnQodCwxMCk7cmV0dXJuIWlzTmFOKGEpJiZuKGEpP2E6cn0sdC5nZXRLZXl3b3JkPXMsdC5nZXRNZWFzdXJlbWVudD1vLHQuZ2V0UmF0aW89ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJue251bToxLGRlbjoxfTtjb25zdCB0PWUudHJpbSgpLnNwbGl0KC9ccyo6XHMqLykubWFwKChlPT5wYXJzZUZsb2F0KGUpKSkuZmlsdGVyKChlPT4haXNOYU4oZSkpKTtpZigxPT09dC5sZW5ndGgmJnQucHVzaCgxKSwwPT09dC5sZW5ndGgpcmV0dXJue251bToxLGRlbjoxfTtjb25zdFtyLG5dPXQ7cmV0dXJue251bTpyLGRlbjpufX0sdC5nZXRSZWxldmFudD1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKChlPT4oe2V4Y2x1ZGVkOiItIj09PWVbMF0sdmlld25hbWU6ZS5zdWJzdHJpbmcoMSl9KSkpOltdfSx0LmdldFN0cmluZ09wdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiBzKHtkYXRhOmUsZGVmYXVsdFZhbHVlOnRbMF0sdmFsaWRhdGU6ZT0+dC5pbmNsdWRlcyhlKX0pfSx0LnN0cmlwUXVvdGVzPWZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXJ0c1dpdGgoIiciKXx8ZS5zdGFydHNXaXRoKCciJyk/ZS5zbGljZSgxLC0xKTplfSxyKDEzOSk7dmFyIG49cigxNDQpO2NvbnN0IGE9e3B0OmU9PmUsY206ZT0+ZS8yLjU0KjcyLG1tOmU9PmUvMjUuNCo3MixpbjplPT43MiplLHB4OmU9PmV9LGk9LyhbKy1dP1xkK1wuP1xkKikoLiopLztmdW5jdGlvbiBzKGUpe2xldHtkYXRhOnQsZGVmYXVsdFZhbHVlOnIsdmFsaWRhdGU6bn09ZTtyZXR1cm4gdD8odD10LnRyaW0oKSxuKHQpP3Q6cik6cn1mdW5jdGlvbiBvKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiMCI7aWYodHx8KHQ9IjAiKSwhZSlyZXR1cm4gbyh0KTtjb25zdCByPWUudHJpbSgpLm1hdGNoKGkpO2lmKCFyKXJldHVybiBvKHQpO2NvbnN0WyxuLHNdPXIsYz1wYXJzZUZsb2F0KG4pO2lmKGlzTmFOKGMpKXJldHVybiBvKHQpO2lmKDA9PT1jKXJldHVybiAwO2NvbnN0IGw9YVtzXTtyZXR1cm4gbD9sKGMpOmN9Y2xhc3MgY3tzdGF0aWMgZ2V0IEZBSUxVUkUoKXtyZXR1cm4oMCxuLnNoYWRvdykodGhpcywiRkFJTFVSRSIsbmV3IGMoITEsbnVsbCxudWxsLG51bGwpKX1zdGF0aWMgZ2V0IEVNUFRZKCl7cmV0dXJuKDAsbi5zaGFkb3cpKHRoaXMsIkVNUFRZIixuZXcgYyghMCxudWxsLG51bGwsbnVsbCkpfWNvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuc3VjY2Vzcz1lLHRoaXMuaHRtbD10LHRoaXMuYmJveD1yLHRoaXMuYnJlYWtOb2RlPW59aXNCcmVhaygpe3JldHVybiEhdGhpcy5icmVha05vZGV9c3RhdGljIGJyZWFrTm9kZShlKXtyZXR1cm4gbmV3IGMoITEsbnVsbCxudWxsLGUpfXN0YXRpYyBzdWNjZXNzKGUpe3JldHVybiBuZXcgYyghMCxlLGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLG51bGwpfX10LkhUTUxSZXN1bHQ9Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZvbnRGaW5kZXI9dm9pZCAwLHQuZ2V0TWV0cmljcz1mdW5jdGlvbihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLHI9bnVsbDtpZihlKXtjb25zdCB0PSgwLGEuc3RyaXBRdW90ZXMpKGUudHlwZWZhY2UpLGk9ZVtuLiRnbG9iYWxEYXRhXS5mb250RmluZGVyLmZpbmQodCk7cj1zKGUsaSl9aWYoIXIpcmV0dXJue2xpbmVIZWlnaHQ6MTIsbGluZUdhcDoyLGxpbmVOb0dhcDoxMH07Y29uc3QgaT1lLnNpemV8fDEwLG89ci5saW5lSGVpZ2h0P01hdGgubWF4KHQ/MDoxLjIsci5saW5lSGVpZ2h0KToxLjIsYz12b2lkIDA9PT1yLmxpbmVHYXA/LjI6ci5saW5lR2FwO3JldHVybntsaW5lSGVpZ2h0Om8qaSxsaW5lR2FwOmMqaSxsaW5lTm9HYXA6TWF0aC5tYXgoMSxvLWMpKml9fSx0LnNlbGVjdEZvbnQ9cyxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNykscigxMzkpO3ZhciBuPXIoMjI4KSxhPXIoMjM3KSxpPXIoMTQ0KTtmdW5jdGlvbiBzKGUsdCl7cmV0dXJuIml0YWxpYyI9PT1lLnBvc3R1cmU/ImJvbGQiPT09ZS53ZWlnaHQ/dC5ib2xkaXRhbGljOnQuaXRhbGljOiJib2xkIj09PWUud2VpZ2h0P3QuYm9sZDp0LnJlZ3VsYXJ9dC5Gb250RmluZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuZm9udHM9bmV3IE1hcCx0aGlzLmNhY2hlPW5ldyBNYXAsdGhpcy53YXJuZWQ9bmV3IFNldCx0aGlzLmRlZmF1bHRGb250PW51bGwsdGhpcy5hZGQoZSl9YWRkKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsO2Zvcihjb25zdCB0IG9mIGUpdGhpcy5hZGRQZGZGb250KHQpO2Zvcihjb25zdCBlIG9mIHRoaXMuZm9udHMudmFsdWVzKCkpZS5yZWd1bGFyfHwoZS5yZWd1bGFyPWUuaXRhbGljfHxlLmJvbGR8fGUuYm9sZGl0YWxpYyk7aWYoIXR8fDA9PT10LnNpemUpcmV0dXJuO2NvbnN0IHI9dGhpcy5mb250cy5nZXQoIlBkZkpTLUZhbGxiYWNrLVBkZkpTLVhGQSIpO2Zvcihjb25zdCBlIG9mIHQpdGhpcy5mb250cy5zZXQoZSxyKX1hZGRQZGZGb250KGUpe2NvbnN0IHQ9ZS5jc3NGb250SW5mbyxyPXQuZm9udEZhbWlseTtsZXQgbj10aGlzLmZvbnRzLmdldChyKTtufHwobj1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuZm9udHMuc2V0KHIsbiksdGhpcy5kZWZhdWx0Rm9udHx8KHRoaXMuZGVmYXVsdEZvbnQ9bikpO2xldCBhPSIiO2NvbnN0IGk9cGFyc2VGbG9hdCh0LmZvbnRXZWlnaHQpO3ZhciBzLG8sYzswIT09cGFyc2VGbG9hdCh0Lml0YWxpY0FuZ2xlKT9hPWk+PTcwMD8iYm9sZGl0YWxpYyI6Iml0YWxpYyI6aT49NzAwJiYoYT0iYm9sZCIpLGF8fCgoZS5uYW1lLmluY2x1ZGVzKCJCb2xkIil8fChudWxsPT09KHM9ZS5wc05hbWUpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmluY2x1ZGVzKCJCb2xkIikpKSYmKGE9ImJvbGQiKSwoZS5uYW1lLmluY2x1ZGVzKCJJdGFsaWMiKXx8ZS5uYW1lLmVuZHNXaXRoKCJJdCIpfHwobnVsbD09PShvPWUucHNOYW1lKXx8dm9pZCAwPT09bz92b2lkIDA6by5pbmNsdWRlcygiSXRhbGljIikpfHwobnVsbD09PShjPWUucHNOYW1lKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5lbmRzV2l0aCgiSXQiKSkpJiYoYSs9Iml0YWxpYyIpKSxhfHwoYT0icmVndWxhciIpLG5bYV09ZX1nZXREZWZhdWx0KCl7cmV0dXJuIHRoaXMuZGVmYXVsdEZvbnR9ZmluZChlKXtsZXQgdD0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdLHI9dGhpcy5mb250cy5nZXQoZSl8fHRoaXMuY2FjaGUuZ2V0KGUpO2lmKHIpcmV0dXJuIHI7Y29uc3Qgbj0vLHwtfF98IHxib2xkaXRhbGljfGJvbGR8aXRhbGljfHJlZ3VsYXJ8aXQvZ2k7bGV0IGE9ZS5yZXBsYWNlQWxsKG4sIiIpO2lmKHI9dGhpcy5mb250cy5nZXQoYSkscilyZXR1cm4gdGhpcy5jYWNoZS5zZXQoZSxyKSxyO2E9YS50b0xvd2VyQ2FzZSgpO2NvbnN0IHM9W107Zm9yKGNvbnN0W2UsdF1vZiB0aGlzLmZvbnRzLmVudHJpZXMoKSllLnJlcGxhY2VBbGwobiwiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGEpJiZzLnB1c2godCk7aWYoMD09PXMubGVuZ3RoKWZvcihjb25zdFssZV1vZiB0aGlzLmZvbnRzLmVudHJpZXMoKSl7dmFyIG87KG51bGw9PT0obz1lLnJlZ3VsYXIubmFtZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8ucmVwbGFjZUFsbChuLCIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoYSkpJiZzLnB1c2goZSl9aWYoMD09PXMubGVuZ3RoKXthPWEucmVwbGFjZUFsbCgvcHNtdHxtdC9naSwiIik7Zm9yKGNvbnN0W2UsdF1vZiB0aGlzLmZvbnRzLmVudHJpZXMoKSllLnJlcGxhY2VBbGwobiwiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGEpJiZzLnB1c2godCl9aWYoMD09PXMubGVuZ3RoKWZvcihjb25zdCBlIG9mIHRoaXMuZm9udHMudmFsdWVzKCkpe3ZhciBjOyhudWxsPT09KGM9ZS5yZWd1bGFyLm5hbWUpfHx2b2lkIDA9PT1jP3ZvaWQgMDpjLnJlcGxhY2VBbGwobiwiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGEpKSYmcy5wdXNoKGUpfXJldHVybiBzLmxlbmd0aD49MT8oMSE9PXMubGVuZ3RoJiZ0JiYoMCxpLndhcm4pKCJYRkEgLSBUb28gbWFueSBjaG9pY2VzIHRvIGd1ZXNzIHRoZSBjb3JyZWN0IGZvbnQ6ICIuY29uY2F0KGUpKSx0aGlzLmNhY2hlLnNldChlLHNbMF0pLHNbMF0pOih0JiYhdGhpcy53YXJuZWQuaGFzKGUpJiYodGhpcy53YXJuZWQuYWRkKGUpLCgwLGkud2FybikoIlhGQSAtIENhbm5vdCBmaW5kIHRoZSBmb250OiAiLmNvbmNhdChlKSkpLG51bGwpfX19LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5UZXh0TWVhc3VyZT12b2lkIDAscigxMzkpO3ZhciBuPXIoMjM4KTtjbGFzcyBhe2NvbnN0cnVjdG9yKGUsdCxyLGEpe2lmKHRoaXMubGluZUhlaWdodD1yLHRoaXMucGFyYU1hcmdpbj10fHx7dG9wOjAsYm90dG9tOjAsbGVmdDowLHJpZ2h0OjB9LCFlKXJldHVybiB2b2lkKFt0aGlzLnBkZkZvbnQsdGhpcy54ZmFGb250XT10aGlzLmRlZmF1bHRGb250KGEpKTt0aGlzLnhmYUZvbnQ9e3R5cGVmYWNlOmUudHlwZWZhY2UscG9zdHVyZTplLnBvc3R1cmUsd2VpZ2h0OmUud2VpZ2h0LHNpemU6ZS5zaXplLGxldHRlclNwYWNpbmc6ZS5sZXR0ZXJTcGFjaW5nfTtjb25zdCBpPWEuZmluZChlLnR5cGVmYWNlKTtpPyh0aGlzLnBkZkZvbnQ9KDAsbi5zZWxlY3RGb250KShlLGkpLHRoaXMucGRmRm9udHx8KFt0aGlzLnBkZkZvbnQsdGhpcy54ZmFGb250XT10aGlzLmRlZmF1bHRGb250KGEpKSk6W3RoaXMucGRmRm9udCx0aGlzLnhmYUZvbnRdPXRoaXMuZGVmYXVsdEZvbnQoYSl9ZGVmYXVsdEZvbnQoZSl7Y29uc3QgdD1lLmZpbmQoIkhlbHZldGljYSIsITEpfHxlLmZpbmQoIk15cmlhZCBQcm8iLCExKXx8ZS5maW5kKCJBcmlhbCIsITEpfHxlLmdldERlZmF1bHQoKTtpZihudWxsIT10JiZ0LnJlZ3VsYXIpe2NvbnN0IGU9dC5yZWd1bGFyO3JldHVybltlLHt0eXBlZmFjZTplLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHkscG9zdHVyZToibm9ybWFsIix3ZWlnaHQ6Im5vcm1hbCIsc2l6ZToxMCxsZXR0ZXJTcGFjaW5nOjB9XX1yZXR1cm5bbnVsbCx7dHlwZWZhY2U6IkNvdXJpZXIiLHBvc3R1cmU6Im5vcm1hbCIsd2VpZ2h0OiJub3JtYWwiLHNpemU6MTAsbGV0dGVyU3BhY2luZzowfV19fWNsYXNzIGl7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy5mb250RmluZGVyPW4sdGhpcy5zdGFjaz1bbmV3IGEoZSx0LHIsbildfXB1c2hEYXRhKGUsdCxyKXtjb25zdCBuPXRoaXMuc3RhY2suYXQoLTEpO2Zvcihjb25zdCB0IG9mWyJ0eXBlZmFjZSIsInBvc3R1cmUiLCJ3ZWlnaHQiLCJzaXplIiwibGV0dGVyU3BhY2luZyJdKWVbdF18fChlW3RdPW4ueGZhRm9udFt0XSk7Zm9yKGNvbnN0IGUgb2ZbInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdKWlzTmFOKHRbZV0pJiYodFtlXT1uLnBhcmFNYXJnaW5bZV0pO2NvbnN0IGk9bmV3IGEoZSx0LHJ8fG4ubGluZUhlaWdodCx0aGlzLmZvbnRGaW5kZXIpO2kucGRmRm9udHx8KGkucGRmRm9udD1uLnBkZkZvbnQpLHRoaXMuc3RhY2sucHVzaChpKX1wb3BGb250KCl7dGhpcy5zdGFjay5wb3AoKX10b3BGb250KCl7cmV0dXJuIHRoaXMuc3RhY2suYXQoLTEpfX10LlRleHRNZWFzdXJlPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuZ2x5cGhzPVtdLHRoaXMuZm9udFNlbGVjdG9yPW5ldyBpKGUsdCxyLG4pLHRoaXMuZXh0cmFIZWlnaHQ9MH1wdXNoRGF0YShlLHQscil7dGhpcy5mb250U2VsZWN0b3IucHVzaERhdGEoZSx0LHIpfXBvcEZvbnQoZSl7cmV0dXJuIHRoaXMuZm9udFNlbGVjdG9yLnBvcEZvbnQoKX1hZGRQYXJhKCl7Y29uc3QgZT10aGlzLmZvbnRTZWxlY3Rvci50b3BGb250KCk7dGhpcy5leHRyYUhlaWdodCs9ZS5wYXJhTWFyZ2luLnRvcCtlLnBhcmFNYXJnaW4uYm90dG9tfWFkZFN0cmluZyhlKXtpZighZSlyZXR1cm47Y29uc3QgdD10aGlzLmZvbnRTZWxlY3Rvci50b3BGb250KCkscj10LnhmYUZvbnQuc2l6ZTtpZih0LnBkZkZvbnQpe2NvbnN0IG49dC54ZmFGb250LmxldHRlclNwYWNpbmcsYT10LnBkZkZvbnQsaT1hLmxpbmVIZWlnaHR8fDEuMixzPXQubGluZUhlaWdodHx8TWF0aC5tYXgoMS4yLGkpKnIsbz1pLSh2b2lkIDA9PT1hLmxpbmVHYXA/LjI6YS5saW5lR2FwKSxjPU1hdGgubWF4KDEsbykqcixsPXIvMWUzLGg9YS5kZWZhdWx0V2lkdGh8fGEuY2hhcnNUb0dseXBocygiICIpWzBdLndpZHRoO2Zvcihjb25zdCB0IG9mIGUuc3BsaXQoL1tcdTIwMjlcbl0vKSl7Y29uc3QgZT1hLmVuY29kZVN0cmluZyh0KS5qb2luKCIiKSxyPWEuY2hhcnNUb0dseXBocyhlKTtmb3IoY29uc3QgZSBvZiByKXtjb25zdCB0PWUud2lkdGh8fGg7dGhpcy5nbHlwaHMucHVzaChbdCpsK24scyxjLGUudW5pY29kZSwhMV0pfXRoaXMuZ2x5cGhzLnB1c2goWzAsMCwwLCJcbiIsITBdKX10aGlzLmdseXBocy5wb3AoKX1lbHNle2Zvcihjb25zdCB0IG9mIGUuc3BsaXQoL1tcdTIwMjlcbl0vKSl7Zm9yKGNvbnN0IGUgb2YgdC5zcGxpdCgiIikpdGhpcy5nbHlwaHMucHVzaChbciwxLjIqcixyLGUsITFdKTt0aGlzLmdseXBocy5wdXNoKFswLDAsMCwiXG4iLCEwXSl9dGhpcy5nbHlwaHMucG9wKCl9fWNvbXB1dGUoZSl7bGV0IHQ9LTEscj0wLG49MCxhPTAsaT0wLHM9MCxvPSExLGM9ITA7Zm9yKGxldCBsPTAsaD10aGlzLmdseXBocy5sZW5ndGg7bDxoO2wrKyl7Y29uc3RbaCx1LGQsZixnXT10aGlzLmdseXBoc1tsXSxwPSIgIj09PWYsbT1jP2Q6dTtnPyhuPU1hdGgubWF4KG4saSksaT0wLGErPXMscz1tLHQ9LTEscj0wLGM9ITEpOnA/aStoPmU/KG49TWF0aC5tYXgobixpKSxpPTAsYSs9cyxzPW0sdD0tMSxyPTAsbz0hMCxjPSExKToocz1NYXRoLm1heChtLHMpLHI9aSxpKz1oLHQ9bCk6aStoPmU/KGErPXMscz1tLC0xIT09dD8obD10LG49TWF0aC5tYXgobixyKSxpPTAsdD0tMSxyPTApOihuPU1hdGgubWF4KG4saSksaT1oKSxvPSEwLGM9ITEpOihpKz1oLHM9TWF0aC5tYXgobSxzKSl9cmV0dXJuIG49TWF0aC5tYXgobixpKSxhKz1zK3RoaXMuZXh0cmFIZWlnaHQse3dpZHRoOjEuMDIqbixoZWlnaHQ6YSxpc0Jyb2tlbjpvfX19fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWG1sT2JqZWN0PXQuWEZBT2JqZWN0QXJyYXk9dC5YRkFPYmplY3Q9dC5YRkFBdHRyaWJ1dGU9dC5TdHJpbmdPYmplY3Q9dC5PcHRpb25PYmplY3Q9dC5PcHRpb24xMD10Lk9wdGlvbjAxPXQuSW50ZWdlck9iamVjdD10LkNvbnRlbnRPYmplY3Q9dm9pZCAwLHIoMTM5KSxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIG49cigyMjgpLGE9cigyMzcpLGk9cigxNDQpLHM9cigxNDkpLG89cigyMzQpLGM9cigyNDEpO2NvbnN0IGw9U3ltYm9sKCksaD1TeW1ib2woKSx1PVN5bWJvbCgpLGQ9U3ltYm9sKCJfY2hpbGRyZW4iKSxmPVN5bWJvbCgpLGc9U3ltYm9sKCkscD1TeW1ib2woKSxtPVN5bWJvbCgpLGI9U3ltYm9sKCkseT1TeW1ib2woKSx3PVN5bWJvbCgpLHY9U3ltYm9sKCkseD1TeW1ib2woKSxTPVN5bWJvbCgicGFyZW50IiksQT1TeW1ib2woKSxrPVN5bWJvbCgpLEM9U3ltYm9sKCk7bGV0IE89MDtjb25zdCBGPW8uTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkO2NsYXNzIEl7Y29uc3RydWN0b3IoZSx0KXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdO3RoaXNbbi4kbmFtZXNwYWNlSWRdPWUsdGhpc1tuLiRub2RlTmFtZV09dCx0aGlzW3ddPXIsdGhpc1tTXT1udWxsLHRoaXNbZF09W10sdGhpc1tuLiR1aWRdPSIiLmNvbmNhdCh0KS5jb25jYXQoTysrKSx0aGlzW24uJGdsb2JhbERhdGFdPW51bGx9Z2V0IGlzWEZBT2JqZWN0KCl7cmV0dXJuITB9Z2V0IGlzWEZBT2JqZWN0QXJyYXkoKXtyZXR1cm4hMX1jcmVhdGVOb2RlcyhlKXtsZXQgdD10aGlzLHI9bnVsbDtmb3IoY29uc3R7bmFtZTphLGluZGV4Oml9b2YgZSl7Zm9yKGxldCBlPTAscz1pc0Zpbml0ZShpKT9pOjA7ZTw9cztlKyspe2NvbnN0IGU9dFtuLiRuYW1lc3BhY2VJZF09PT1GPy0xOnRbbi4kbmFtZXNwYWNlSWRdO3I9bmV3IEUoZSxhKSx0W24uJGFwcGVuZENoaWxkXShyKX10PXJ9cmV0dXJuIHJ9W24uJG9uQ2hpbGRdKGUpe2lmKCF0aGlzW3ddfHwhdGhpc1tuLiRvbkNoaWxkQ2hlY2tdKGUpKXJldHVybiExO2NvbnN0IHQ9ZVtuLiRub2RlTmFtZV0scj10aGlzW3RdO2lmKCEociBpbnN0YW5jZW9mIFQpKXJldHVybiBudWxsIT09ciYmdGhpc1tuLiRyZW1vdmVDaGlsZF0ociksdGhpc1t0XT1lLHRoaXNbbi4kYXBwZW5kQ2hpbGRdKGUpLCEwO2lmKHIucHVzaChlKSlyZXR1cm4gdGhpc1tuLiRhcHBlbmRDaGlsZF0oZSksITA7bGV0IGE9IiI7cmV0dXJuIHRoaXMuaWQ/YT0iIChpZDogIi5jb25jYXQodGhpcy5pZCwiKSIpOnRoaXMubmFtZSYmKGE9IiAobmFtZTogIi5jb25jYXQodGhpcy5uYW1lLCIgIikuY29uY2F0KHRoaXMuaC52YWx1ZSwiKSIpKSwoMCxpLndhcm4pKCdYRkEgLSBub2RlICInLmNvbmNhdCh0aGlzW24uJG5vZGVOYW1lXSwnIicpLmNvbmNhdChhLCcgaGFzIGFscmVhZHkgZW5vdWdoICInKS5jb25jYXQodCwnIiEnKSksITF9W24uJG9uQ2hpbGRDaGVja10oZSl7cmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkoZVtuLiRub2RlTmFtZV0pJiZlW24uJG5hbWVzcGFjZUlkXT09PXRoaXNbbi4kbmFtZXNwYWNlSWRdfVtuLiRpc05zQWdub3N0aWNdKCl7cmV0dXJuITF9W24uJGFjY2VwdFdoaXRlc3BhY2VdKCl7cmV0dXJuITF9W24uJGlzQ0RBVEFYbWxdKCl7cmV0dXJuITF9W24uJGlzQmluZGFibGVdKCl7cmV0dXJuITF9W24uJHBvcFBhcmFdKCl7dGhpcy5wYXJhJiZ0aGlzW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ucGFyYVN0YWNrLnBvcCgpfVtuLiRwdXNoUGFyYV0oKXt0aGlzW24uJGdldFRlbXBsYXRlUm9vdF0oKVtuLiRleHRyYV0ucGFyYVN0YWNrLnB1c2godGhpcy5wYXJhKX1bbi4kc2V0SWRdKGUpe3RoaXMuaWQmJnRoaXNbbi4kbmFtZXNwYWNlSWRdPT09by5OYW1lc3BhY2VJZHMudGVtcGxhdGUuaWQmJmUuc2V0KHRoaXMuaWQsdGhpcyl9W24uJGdldFRlbXBsYXRlUm9vdF0oKXtyZXR1cm4gdGhpc1tuLiRnbG9iYWxEYXRhXS50ZW1wbGF0ZX1bbi4kaXNTcGxpdHRhYmxlXSgpe3JldHVybiExfVtuLiRpc1RoZXJlTW9yZVdpZHRoXSgpe3JldHVybiExfVtuLiRhcHBlbmRDaGlsZF0oZSl7ZVtTXT10aGlzLHRoaXNbZF0ucHVzaChlKSwhZVtuLiRnbG9iYWxEYXRhXSYmdGhpc1tuLiRnbG9iYWxEYXRhXSYmKGVbbi4kZ2xvYmFsRGF0YV09dGhpc1tuLiRnbG9iYWxEYXRhXSl9W24uJHJlbW92ZUNoaWxkXShlKXtjb25zdCB0PXRoaXNbZF0uaW5kZXhPZihlKTt0aGlzW2RdLnNwbGljZSh0LDEpfVtuLiRoYXNTZXR0YWJsZVZhbHVlXSgpe3JldHVybiB0aGlzLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpfVtuLiRzZXRWYWx1ZV0oZSl7fVtuLiRvblRleHRdKGUpe31bbi4kZmluYWxpemVdKCl7fVtuLiRjbGVhbl0oZSl7ZGVsZXRlIHRoaXNbd10sdGhpc1tuLiRjbGVhbnVwXSYmKGUuY2xlYW4odGhpc1tuLiRjbGVhbnVwXSksZGVsZXRlIHRoaXNbbi4kY2xlYW51cF0pfVtuLiRpbmRleE9mXShlKXtyZXR1cm4gdGhpc1tkXS5pbmRleE9mKGUpfVtuLiRpbnNlcnRBdF0oZSx0KXt0W1NdPXRoaXMsdGhpc1tkXS5zcGxpY2UoZSwwLHQpLCF0W24uJGdsb2JhbERhdGFdJiZ0aGlzW24uJGdsb2JhbERhdGFdJiYodFtuLiRnbG9iYWxEYXRhXT10aGlzW24uJGdsb2JhbERhdGFdKX1bbi4kaXNUcmFuc3BhcmVudF0oKXtyZXR1cm4hdGhpcy5uYW1lfVtuLiRsYXN0QXR0cmlidXRlXSgpe3JldHVybiIifVtuLiR0ZXh0XSgpe3JldHVybiAwPT09dGhpc1tkXS5sZW5ndGg/dGhpc1tuLiRjb250ZW50XTp0aGlzW2RdLm1hcCgoZT0+ZVtuLiR0ZXh0XSgpKSkuam9pbigiIil9Z2V0W3VdKCl7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7aWYoIWUuX2F0dHJpYnV0ZXMpe2NvbnN0IHQ9ZS5fYXR0cmlidXRlcz1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKXtpZihudWxsPT09dGhpc1tlXXx8dGhpc1tlXWluc3RhbmNlb2YgSXx8dGhpc1tlXWluc3RhbmNlb2YgVClicmVhazt0LmFkZChlKX19cmV0dXJuKDAsaS5zaGFkb3cpKHRoaXMsdSxlLl9hdHRyaWJ1dGVzKX1bbi4kaXNEZXNjZW5kZW50XShlKXtsZXQgdD10aGlzO2Zvcig7dDspe2lmKHQ9PT1lKXJldHVybiEwO3Q9dFtuLiRnZXRQYXJlbnRdKCl9cmV0dXJuITF9W24uJGdldFBhcmVudF0oKXtyZXR1cm4gdGhpc1tTXX1bbi4kZ2V0U3ViZm9ybVBhcmVudF0oKXtyZXR1cm4gdGhpc1tuLiRnZXRQYXJlbnRdKCl9W24uJGdldENoaWxkcmVuXSgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3JldHVybiBlP3RoaXNbZV06dGhpc1tkXX1bbi4kZHVtcF0oKXtjb25zdCBlPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpc1tuLiRjb250ZW50XSYmKGUuJGNvbnRlbnQ9dGhpc1tuLiRjb250ZW50XSk7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2NvbnN0IHI9dGhpc1t0XTtudWxsIT09ciYmKHIgaW5zdGFuY2VvZiBJP2VbdF09cltuLiRkdW1wXSgpOnIgaW5zdGFuY2VvZiBUP3IuaXNFbXB0eSgpfHwoZVt0XT1yLmR1bXAoKSk6ZVt0XT1yKX1yZXR1cm4gZX1bbi4kdG9TdHlsZV0oKXtyZXR1cm4gbnVsbH1bbi4kdG9IVE1MXSgpe3JldHVybiBhLkhUTUxSZXN1bHQuRU1QVFl9KltuLiRnZXRDb250YWluZWRDaGlsZHJlbl0oKXtmb3IoY29uc3QgZSBvZiB0aGlzW24uJGdldENoaWxkcmVuXSgpKXlpZWxkIGV9KlttXShlLHQpe2Zvcihjb25zdCByIG9mIHRoaXNbbi4kZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkpaWYoIWV8fHQ9PT1lLmhhcyhyW24uJG5vZGVOYW1lXSkpe2NvbnN0IGU9dGhpc1tuLiRnZXRBdmFpbGFibGVTcGFjZV0oKSx0PXJbbi4kdG9IVE1MXShlKTt0LnN1Y2Nlc3N8fCh0aGlzW24uJGV4dHJhXS5mYWlsaW5nTm9kZT1yKSx5aWVsZCB0fX1bbi4kZmx1c2hIVE1MXSgpe3JldHVybiBudWxsfVtuLiRhZGRIVE1MXShlLHQpe3RoaXNbbi4kZXh0cmFdLmNoaWxkcmVuLnB1c2goZSl9W24uJGdldEF2YWlsYWJsZVNwYWNlXSgpe31bbi4kY2hpbGRyZW5Ub0hUTUxdKGUpe2xldHtmaWx0ZXI6dD1udWxsLGluY2x1ZGU6cj0hMH09ZTtpZih0aGlzW24uJGV4dHJhXS5nZW5lcmF0b3Ipe2NvbnN0IGU9dGhpc1tuLiRnZXRBdmFpbGFibGVTcGFjZV0oKSx0PXRoaXNbbi4kZXh0cmFdLmZhaWxpbmdOb2RlW24uJHRvSFRNTF0oZSk7aWYoIXQuc3VjY2VzcylyZXR1cm4gdDt0Lmh0bWwmJnRoaXNbbi4kYWRkSFRNTF0odC5odG1sLHQuYmJveCksZGVsZXRlIHRoaXNbbi4kZXh0cmFdLmZhaWxpbmdOb2RlfWVsc2UgdGhpc1tuLiRleHRyYV0uZ2VuZXJhdG9yPXRoaXNbbV0odCxyKTtmb3IoOzspe2NvbnN0IGU9dGhpc1tuLiRleHRyYV0uZ2VuZXJhdG9yLm5leHQoKTtpZihlLmRvbmUpYnJlYWs7Y29uc3QgdD1lLnZhbHVlO2lmKCF0LnN1Y2Nlc3MpcmV0dXJuIHQ7dC5odG1sJiZ0aGlzW24uJGFkZEhUTUxdKHQuaHRtbCx0LmJib3gpfXJldHVybiB0aGlzW24uJGV4dHJhXS5nZW5lcmF0b3I9bnVsbCxhLkhUTUxSZXN1bHQuRU1QVFl9W24uJHNldFNldEF0dHJpYnV0ZXNdKGUpe3RoaXNba109bmV3IFNldChPYmplY3Qua2V5cyhlKSl9W3ldKGUpe2NvbnN0IHQ9dGhpc1t1XSxyPXRoaXNba107cmV0dXJuWy4uLmVdLmZpbHRlcigoZT0+dC5oYXMoZSkmJiFyLmhhcyhlKSkpfVtuLiRyZXNvbHZlUHJvdG90eXBlc10oZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOm5ldyBTZXQ7Zm9yKGNvbnN0IHIgb2YgdGhpc1tkXSlyW0FdKGUsdCl9W0FdKGUsdCl7Y29uc3Qgcj10aGlzW2JdKGUsdCk7cj90aGlzW2xdKHIsZSx0KTp0aGlzW24uJHJlc29sdmVQcm90b3R5cGVzXShlLHQpfVtiXShlLHQpe2NvbnN0e3VzZTpyLHVzZWhyZWY6YX09dGhpcztpZighciYmIWEpcmV0dXJuIG51bGw7bGV0IHM9bnVsbCxvPW51bGwsaD1udWxsLHU9cjtpZihhPyh1PWEsYS5zdGFydHNXaXRoKCIjc29tKCIpJiZhLmVuZHNXaXRoKCIpIik/bz1hLnNsaWNlKDUsLTEpOmEuc3RhcnRzV2l0aCgiLiNzb20oIikmJmEuZW5kc1dpdGgoIikiKT9vPWEuc2xpY2UoNiwtMSk6YS5zdGFydHNXaXRoKCIjIik/aD1hLnNsaWNlKDEpOmEuc3RhcnRzV2l0aCgiLiMiKSYmKGg9YS5zbGljZSgyKSkpOnIuc3RhcnRzV2l0aCgiIyIpP2g9ci5zbGljZSgxKTpvPXIsdGhpcy51c2U9dGhpcy51c2VocmVmPSIiLGg/cz1lLmdldChoKToocz0oMCxjLnNlYXJjaE5vZGUpKGUuZ2V0KG4uJHJvb3QpLHRoaXMsbywhMCwhMSkscyYmKHM9c1swXSkpLCFzKXJldHVybigwLGkud2FybikoIlhGQSAtIEludmFsaWQgcHJvdG90eXBlIHJlZmVyZW5jZTogIi5jb25jYXQodSwiLiIpKSxudWxsO2lmKHNbbi4kbm9kZU5hbWVdIT09dGhpc1tuLiRub2RlTmFtZV0pcmV0dXJuKDAsaS53YXJuKSgiWEZBIC0gSW5jb21wYXRpYmxlIHByb3RvdHlwZTogIi5jb25jYXQoc1tuLiRub2RlTmFtZV0sIiAhPT0gIikuY29uY2F0KHRoaXNbbi4kbm9kZU5hbWVdLCIuIikpLG51bGw7aWYodC5oYXMocykpcmV0dXJuKDAsaS53YXJuKSgiWEZBIC0gQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvdG90eXBlcyB1c2UuIiksbnVsbDt0LmFkZChzKTtjb25zdCBkPXNbYl0oZSx0KTtyZXR1cm4gZCYmc1tsXShkLGUsdCksc1tuLiRyZXNvbHZlUHJvdG90eXBlc10oZSx0KSx0LmRlbGV0ZShzKSxzfVtsXShlLHQscil7aWYoci5oYXMoZSkpKDAsaS53YXJuKSgiWEZBIC0gQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvdG90eXBlcyB1c2UuIik7ZWxzZXshdGhpc1tuLiRjb250ZW50XSYmZVtuLiRjb250ZW50XSYmKHRoaXNbbi4kY29udGVudF09ZVtuLiRjb250ZW50XSksbmV3IFNldChyKS5hZGQoZSk7Zm9yKGNvbnN0IHQgb2YgdGhpc1t5XShlW2tdKSl0aGlzW3RdPWVbdF0sdGhpc1trXSYmdGhpc1trXS5hZGQodCk7Zm9yKGNvbnN0IGEgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2lmKHRoaXNbdV0uaGFzKGEpKWNvbnRpbnVlO2NvbnN0IGk9dGhpc1thXSxzPWVbYV07aWYoaSBpbnN0YW5jZW9mIFQpe2Zvcihjb25zdCBlIG9mIGlbZF0pZVtBXSh0LHIpO2ZvcihsZXQgYT1pW2RdLmxlbmd0aCxvPXNbZF0ubGVuZ3RoO2E8bzthKyspe2NvbnN0IHM9ZVtkXVthXVtuLiRjbG9uZV0oKTtpZighaS5wdXNoKHMpKWJyZWFrO3NbU109dGhpcyx0aGlzW2RdLnB1c2gocyksc1tBXSh0LHIpfX1lbHNlIGlmKG51bGw9PT1pKXtpZihudWxsIT09cyl7Y29uc3QgZT1zW24uJGNsb25lXSgpO2VbU109dGhpcyx0aGlzW2FdPWUsdGhpc1tkXS5wdXNoKGUpLGVbQV0odCxyKX19ZWxzZSBpW24uJHJlc29sdmVQcm90b3R5cGVzXSh0LHIpLHMmJmlbbF0ocyx0LHIpfX19c3RhdGljW2ZdKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UubWFwKChlPT5JW2ZdKGUpKSk6Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZT9PYmplY3QuYXNzaWduKHt9LGUpOmV9W24uJGNsb25lXSgpe2NvbnN0IGU9T2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpO2Zvcihjb25zdCB0IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGhpcykpdHJ5e2VbdF09dGhpc1t0XX1jYXRjaChyKXsoMCxpLnNoYWRvdykoZSx0LHRoaXNbdF0pfWVbbi4kdWlkXT0iIi5jb25jYXQoZVtuLiRub2RlTmFtZV0pLmNvbmNhdChPKyspLGVbZF09W107Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpe2lmKHRoaXNbdV0uaGFzKHQpKXtlW3RdPUlbZl0odGhpc1t0XSk7Y29udGludWV9Y29uc3Qgcj10aGlzW3RdO2VbdF09ciBpbnN0YW5jZW9mIFQ/bmV3IFQoclt2XSk6bnVsbH1mb3IoY29uc3QgdCBvZiB0aGlzW2RdKXtjb25zdCByPXRbbi4kbm9kZU5hbWVdLGE9dFtuLiRjbG9uZV0oKTtlW2RdLnB1c2goYSksYVtTXT1lLG51bGw9PT1lW3JdP2Vbcl09YTplW3JdW2RdLnB1c2goYSl9cmV0dXJuIGV9W24uJGdldENoaWxkcmVuXSgpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3JldHVybiBlP3RoaXNbZF0uZmlsdGVyKCh0PT50W24uJG5vZGVOYW1lXT09PWUpKTp0aGlzW2RdfVtuLiRnZXRDaGlsZHJlbkJ5Q2xhc3NdKGUpe3JldHVybiB0aGlzW2VdfVtuLiRnZXRDaGlsZHJlbkJ5TmFtZV0oZSx0KXtsZXQgcj0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO3JldHVybiBBcnJheS5mcm9tKHRoaXNbbi4kZ2V0Q2hpbGRyZW5CeU5hbWVJdF0oZSx0LHIpKX1bbi4kZ2V0Q2hpbGRyZW5CeU5hbWVJdF0oZSx0KXt2YXIgcj10aGlzO2xldCBhPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl07cmV0dXJuIGZ1bmN0aW9uKigpe2lmKCJwYXJlbnQiIT09ZSl7Zm9yKGNvbnN0IGEgb2YgcltkXSlhW24uJG5vZGVOYW1lXT09PWUmJih5aWVsZCBhKSxhLm5hbWU9PT1lJiYoeWllbGQgYSksKHR8fGFbbi4kaXNUcmFuc3BhcmVudF0oKSkmJih5aWVsZCphW24uJGdldENoaWxkcmVuQnlOYW1lSXRdKGUsdCwhMSkpO2EmJnJbdV0uaGFzKGUpJiYoeWllbGQgbmV3IE0ocixlLHJbZV0pKX1lbHNlIHlpZWxkIHJbU119KCl9fXQuWEZBT2JqZWN0PUk7Y2xhc3MgVHtjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToxLzA7dGhpc1t2XT1lLHRoaXNbZF09W119Z2V0IGlzWEZBT2JqZWN0KCl7cmV0dXJuITF9Z2V0IGlzWEZBT2JqZWN0QXJyYXkoKXtyZXR1cm4hMH1wdXNoKGUpe3JldHVybiB0aGlzW2RdLmxlbmd0aDw9dGhpc1t2XT8odGhpc1tkXS5wdXNoKGUpLCEwKTooKDAsaS53YXJuKSgnWEZBIC0gbm9kZSAiJy5jb25jYXQoZVtuLiRub2RlTmFtZV0sJyIgYWNjZXB0cyBubyBtb3JlIHRoYW4gJykuY29uY2F0KHRoaXNbdl0sIiBjaGlsZHJlbiIpKSwhMSl9aXNFbXB0eSgpe3JldHVybiAwPT09dGhpc1tkXS5sZW5ndGh9ZHVtcCgpe3JldHVybiAxPT09dGhpc1tkXS5sZW5ndGg/dGhpc1tkXVswXVtuLiRkdW1wXSgpOnRoaXNbZF0ubWFwKChlPT5lW24uJGR1bXBdKCkpKX1bbi4kY2xvbmVdKCl7Y29uc3QgZT1uZXcgVCh0aGlzW3ZdKTtyZXR1cm4gZVtkXT10aGlzW2RdLm1hcCgoZT0+ZVtuLiRjbG9uZV0oKSkpLGV9Z2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXNbZF19Y2xlYXIoKXt0aGlzW2RdLmxlbmd0aD0wfX10LlhGQU9iamVjdEFycmF5PVQ7Y2xhc3MgTXtjb25zdHJ1Y3RvcihlLHQscil7dGhpc1tTXT1lLHRoaXNbbi4kbm9kZU5hbWVdPXQsdGhpc1tuLiRjb250ZW50XT1yLHRoaXNbbi4kY29uc3VtZWRdPSExLHRoaXNbbi4kdWlkXT0iYXR0cmlidXRlIitPKyt9W24uJGdldFBhcmVudF0oKXtyZXR1cm4gdGhpc1tTXX1bbi4kaXNEYXRhVmFsdWVdKCl7cmV0dXJuITB9W24uJGdldERhdGFWYWx1ZV0oKXtyZXR1cm4gdGhpc1tuLiRjb250ZW50XS50cmltKCl9W24uJHNldFZhbHVlXShlKXtlPWUudmFsdWV8fCIiLHRoaXNbbi4kY29udGVudF09ZS50b1N0cmluZygpfVtuLiR0ZXh0XSgpe3JldHVybiB0aGlzW24uJGNvbnRlbnRdfVtuLiRpc0Rlc2NlbmRlbnRdKGUpe3JldHVybiB0aGlzW1NdPT09ZXx8dGhpc1tTXVtuLiRpc0Rlc2NlbmRlbnRdKGUpfX10LlhGQUF0dHJpYnV0ZT1NO2NsYXNzIEUgZXh0ZW5kcyBJe2NvbnN0cnVjdG9yKGUsdCl7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2lmKHN1cGVyKGUsdCksdGhpc1tuLiRjb250ZW50XT0iIix0aGlzW2ddPW51bGwsIiN0ZXh0IiE9PXQpe2NvbnN0IGU9bmV3IE1hcDt0aGlzW2hdPWU7Zm9yKGNvbnN0W3Qsbl1vZiBPYmplY3QuZW50cmllcyhyKSllLnNldCh0LG5ldyBNKHRoaXMsdCxuKSk7aWYoci5oYXNPd25Qcm9wZXJ0eShuLiRuc0F0dHJpYnV0ZXMpKXtjb25zdCBlPXJbbi4kbnNBdHRyaWJ1dGVzXS54ZmEuZGF0YU5vZGU7dm9pZCAwIT09ZSYmKCJkYXRhR3JvdXAiPT09ZT90aGlzW2ddPSExOiJkYXRhVmFsdWUiPT09ZSYmKHRoaXNbZ109ITApKX19dGhpc1tuLiRjb25zdW1lZF09ITF9W24uJHRvU3RyaW5nXShlKXtjb25zdCB0PXRoaXNbbi4kbm9kZU5hbWVdO2lmKCIjdGV4dCI9PT10KXJldHVybiB2b2lkIGUucHVzaCgoMCxzLmVuY29kZVRvWG1sU3RyaW5nKSh0aGlzW24uJGNvbnRlbnRdKSk7Y29uc3Qgcj0oMCxpLnV0ZjhTdHJpbmdUb1N0cmluZykodCksYT10aGlzW24uJG5hbWVzcGFjZUlkXT09PUY/InhmYToiOiIiO2UucHVzaCgiPCIuY29uY2F0KGEpLmNvbmNhdChyKSk7Zm9yKGNvbnN0W3Qscl1vZiB0aGlzW2hdLmVudHJpZXMoKSl7Y29uc3QgYT0oMCxpLnV0ZjhTdHJpbmdUb1N0cmluZykodCk7ZS5wdXNoKCIgIi5jb25jYXQoYSwnPSInKS5jb25jYXQoKDAscy5lbmNvZGVUb1htbFN0cmluZykocltuLiRjb250ZW50XSksJyInKSl9aWYobnVsbCE9PXRoaXNbZ10mJih0aGlzW2ddP2UucHVzaCgnIHhmYTpkYXRhTm9kZT0iZGF0YVZhbHVlIicpOmUucHVzaCgnIHhmYTpkYXRhTm9kZT0iZGF0YUdyb3VwIicpKSx0aGlzW24uJGNvbnRlbnRdfHwwIT09dGhpc1tkXS5sZW5ndGgpe2lmKGUucHVzaCgiPiIpLHRoaXNbbi4kY29udGVudF0pInN0cmluZyI9PXR5cGVvZiB0aGlzW24uJGNvbnRlbnRdP2UucHVzaCgoMCxzLmVuY29kZVRvWG1sU3RyaW5nKSh0aGlzW24uJGNvbnRlbnRdKSk6dGhpc1tuLiRjb250ZW50XVtuLiR0b1N0cmluZ10oZSk7ZWxzZSBmb3IoY29uc3QgdCBvZiB0aGlzW2RdKXRbbi4kdG9TdHJpbmddKGUpO2UucHVzaCgiPC8iLmNvbmNhdChhKS5jb25jYXQociwiPiIpKX1lbHNlIGUucHVzaCgiLz4iKX1bbi4kb25DaGlsZF0oZSl7aWYodGhpc1tuLiRjb250ZW50XSl7Y29uc3QgZT1uZXcgRSh0aGlzW24uJG5hbWVzcGFjZUlkXSwiI3RleHQiKTt0aGlzW24uJGFwcGVuZENoaWxkXShlKSxlW24uJGNvbnRlbnRdPXRoaXNbbi4kY29udGVudF0sdGhpc1tuLiRjb250ZW50XT0iIn1yZXR1cm4gdGhpc1tuLiRhcHBlbmRDaGlsZF0oZSksITB9W24uJG9uVGV4dF0oZSl7dGhpc1tuLiRjb250ZW50XSs9ZX1bbi4kZmluYWxpemVdKCl7aWYodGhpc1tuLiRjb250ZW50XSYmdGhpc1tkXS5sZW5ndGg+MCl7Y29uc3QgZT1uZXcgRSh0aGlzW24uJG5hbWVzcGFjZUlkXSwiI3RleHQiKTt0aGlzW24uJGFwcGVuZENoaWxkXShlKSxlW24uJGNvbnRlbnRdPXRoaXNbbi4kY29udGVudF0sZGVsZXRlIHRoaXNbbi4kY29udGVudF19fVtuLiR0b0hUTUxdKCl7cmV0dXJuIiN0ZXh0Ij09PXRoaXNbbi4kbm9kZU5hbWVdP2EuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOiIjdGV4dCIsdmFsdWU6dGhpc1tuLiRjb250ZW50XX0pOmEuSFRNTFJlc3VsdC5FTVBUWX1bbi4kZ2V0Q2hpbGRyZW5dKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7cmV0dXJuIGU/dGhpc1tkXS5maWx0ZXIoKHQ9PnRbbi4kbm9kZU5hbWVdPT09ZSkpOnRoaXNbZF19W24uJGdldEF0dHJpYnV0ZXNdKCl7cmV0dXJuIHRoaXNbaF19W24uJGdldENoaWxkcmVuQnlDbGFzc10oZSl7Y29uc3QgdD10aGlzW2hdLmdldChlKTtyZXR1cm4gdm9pZCAwIT09dD90OnRoaXNbbi4kZ2V0Q2hpbGRyZW5dKGUpfSpbbi4kZ2V0Q2hpbGRyZW5CeU5hbWVJdF0oZSx0KXtjb25zdCByPXRoaXNbaF0uZ2V0KGUpO3ImJih5aWVsZCByKTtmb3IoY29uc3QgciBvZiB0aGlzW2RdKXJbbi4kbm9kZU5hbWVdPT09ZSYmKHlpZWxkIHIpLHQmJih5aWVsZCpyW24uJGdldENoaWxkcmVuQnlOYW1lSXRdKGUsdCkpfSpbbi4kZ2V0QXR0cmlidXRlSXRdKGUsdCl7Y29uc3Qgcj10aGlzW2hdLmdldChlKTshcnx8dCYmcltuLiRjb25zdW1lZF18fCh5aWVsZCByKTtmb3IoY29uc3QgciBvZiB0aGlzW2RdKXlpZWxkKnJbbi4kZ2V0QXR0cmlidXRlSXRdKGUsdCl9KltuLiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0oZSx0LHIpe2Zvcihjb25zdCBhIG9mIHRoaXNbZF0pYVtuLiRub2RlTmFtZV0hPT1lfHxyJiZhW24uJGNvbnN1bWVkXXx8KHlpZWxkIGEpLHQmJih5aWVsZCphW24uJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShlLHQscikpfVtuLiRpc0RhdGFWYWx1ZV0oKXtyZXR1cm4gbnVsbD09PXRoaXNbZ10/MD09PXRoaXNbZF0ubGVuZ3RofHx0aGlzW2RdWzBdW24uJG5hbWVzcGFjZUlkXT09PW8uTmFtZXNwYWNlSWRzLnhodG1sLmlkOnRoaXNbZ119W24uJGdldERhdGFWYWx1ZV0oKXtyZXR1cm4gbnVsbD09PXRoaXNbZ10/MD09PXRoaXNbZF0ubGVuZ3RoP3RoaXNbbi4kY29udGVudF0udHJpbSgpOnRoaXNbZF1bMF1bbi4kbmFtZXNwYWNlSWRdPT09by5OYW1lc3BhY2VJZHMueGh0bWwuaWQ/dGhpc1tkXVswXVtuLiR0ZXh0XSgpLnRyaW0oKTpudWxsOnRoaXNbbi4kY29udGVudF0udHJpbSgpfVtuLiRzZXRWYWx1ZV0oZSl7ZT1lLnZhbHVlfHwiIix0aGlzW24uJGNvbnRlbnRdPWUudG9TdHJpbmcoKX1bbi4kZHVtcF0oKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtlJiYodC4kbnM9dGhpc1tuLiRuYW1lc3BhY2VJZF0pLHRoaXNbbi4kY29udGVudF0mJih0LiRjb250ZW50PXRoaXNbbi4kY29udGVudF0pLHQuJG5hbWU9dGhpc1tuLiRub2RlTmFtZV0sdC5jaGlsZHJlbj1bXTtmb3IoY29uc3QgciBvZiB0aGlzW2RdKXQuY2hpbGRyZW4ucHVzaChyW24uJGR1bXBdKGUpKTt0LmF0dHJpYnV0ZXM9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3RbZSxyXW9mIHRoaXNbaF0pdC5hdHRyaWJ1dGVzW2VdPXJbbi4kY29udGVudF07cmV0dXJuIHR9fXQuWG1sT2JqZWN0PUU7Y2xhc3MgUCBleHRlbmRzIEl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXNbbi4kY29udGVudF09IiJ9W24uJG9uVGV4dF0oZSl7dGhpc1tuLiRjb250ZW50XSs9ZX1bbi4kZmluYWxpemVdKCl7fX10LkNvbnRlbnRPYmplY3Q9UDtjbGFzcyBSIGV4dGVuZHMgUHtjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoZSx0KSx0aGlzW3hdPXJ9W24uJGZpbmFsaXplXSgpe3RoaXNbbi4kY29udGVudF09KDAsYS5nZXRLZXl3b3JkKSh7ZGF0YTp0aGlzW24uJGNvbnRlbnRdLGRlZmF1bHRWYWx1ZTp0aGlzW3hdWzBdLHZhbGlkYXRlOmU9PnRoaXNbeF0uaW5jbHVkZXMoZSl9KX1bbi4kY2xlYW5dKGUpe3N1cGVyW24uJGNsZWFuXShlKSxkZWxldGUgdGhpc1t4XX19dC5PcHRpb25PYmplY3Q9UjtjbGFzcyBOIGV4dGVuZHMgUHtbbi4kZmluYWxpemVdKCl7dGhpc1tuLiRjb250ZW50XT10aGlzW24uJGNvbnRlbnRdLnRyaW0oKX19dC5TdHJpbmdPYmplY3Q9TjtjbGFzcyBEIGV4dGVuZHMgUHtjb25zdHJ1Y3RvcihlLHQscixuKXtzdXBlcihlLHQpLHRoaXNbcF09cix0aGlzW0NdPW59W24uJGZpbmFsaXplXSgpe3RoaXNbbi4kY29udGVudF09KDAsYS5nZXRJbnRlZ2VyKSh7ZGF0YTp0aGlzW24uJGNvbnRlbnRdLGRlZmF1bHRWYWx1ZTp0aGlzW3BdLHZhbGlkYXRlOnRoaXNbQ119KX1bbi4kY2xlYW5dKGUpe3N1cGVyW24uJGNsZWFuXShlKSxkZWxldGUgdGhpc1twXSxkZWxldGUgdGhpc1tDXX19dC5JbnRlZ2VyT2JqZWN0PUQsdC5PcHRpb24wMT1jbGFzcyBleHRlbmRzIER7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQsMCwoZT0+MT09PWUpKX19LHQuT3B0aW9uMTA9Y2xhc3MgZXh0ZW5kcyBEe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0LDEsKGU9PjA9PT1lKSl9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNyZWF0ZURhdGFOb2RlPWZ1bmN0aW9uKGUsdCxyKXtjb25zdCBpPWgocik7aWYoIWkpcmV0dXJuIG51bGw7aWYoaS5zb21lKChlPT5lLm9wZXJhdG9yPT09by5kb3REb3QpKSlyZXR1cm4gbnVsbDtjb25zdCBzPWMuZ2V0KGlbMF0ubmFtZSk7bGV0IGw9MDtzPyhlPXMoZSx0KSxsPTEpOmU9dHx8ZTtmb3IobGV0IHQ9aS5sZW5ndGg7bDx0O2wrKyl7Y29uc3R7bmFtZTp0LG9wZXJhdG9yOnIsaW5kZXg6c309aVtsXTtpZighaXNGaW5pdGUocykpcmV0dXJuIGlbbF0uaW5kZXg9MCxlLmNyZWF0ZU5vZGVzKGkuc2xpY2UobCkpO2xldCBjO3N3aXRjaChyKXtjYXNlIG8uZG90OmM9ZVtuLiRnZXRDaGlsZHJlbkJ5TmFtZV0odCwhMSk7YnJlYWs7Y2FzZSBvLmRvdERvdDpjPWVbbi4kZ2V0Q2hpbGRyZW5CeU5hbWVdKHQsITApO2JyZWFrO2Nhc2Ugby5kb3RIYXNoOmM9ZVtuLiRnZXRDaGlsZHJlbkJ5Q2xhc3NdKHQpLGM9Yy5pc1hGQU9iamVjdEFycmF5P2MuY2hpbGRyZW46W2NdfWlmKDA9PT1jLmxlbmd0aClyZXR1cm4gZS5jcmVhdGVOb2RlcyhpLnNsaWNlKGwpKTtpZighKHM8Yy5sZW5ndGgpKXJldHVybiBpW2xdLmluZGV4PXMtYy5sZW5ndGgsZS5jcmVhdGVOb2RlcyhpLnNsaWNlKGwpKTt7Y29uc3QgdD1jW3NdO2lmKCF0LmlzWEZBT2JqZWN0KXJldHVybigwLGEud2FybikoIlhGQSAtIENhbm5vdCBjcmVhdGUgYSBub2RlLiIpLG51bGw7ZT10fX1yZXR1cm4gbnVsbH0sdC5zZWFyY2hOb2RlPWZ1bmN0aW9uKGUsdCxyKXtsZXQgYT0hKGFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdKXx8YXJndW1lbnRzWzRdO2NvbnN0IGk9aChyLCEoYXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10pfHxhcmd1bWVudHNbM10pO2lmKCFpKXJldHVybiBudWxsO2NvbnN0IHM9Yy5nZXQoaVswXS5uYW1lKTtsZXQgdSxkPTA7cz8odT0hMCxlPVtzKGUsdCldLGQ9MSk6KHU9bnVsbD09PXQsZT1bdHx8ZV0pO2ZvcihsZXQgcj1pLmxlbmd0aDtkPHI7ZCsrKXtjb25zdHtuYW1lOnIsY2FjaGVOYW1lOnMsb3BlcmF0b3I6YyxpbmRleDpofT1pW2RdLGY9W107Zm9yKGNvbnN0IHQgb2YgZSl7aWYoIXQuaXNYRkFPYmplY3QpY29udGludWU7bGV0IGUsaTtpZihhJiYoaT1sLmdldCh0KSxpfHwoaT1uZXcgTWFwLGwuc2V0KHQsaSkpLGU9aS5nZXQocykpLCFlKXtzd2l0Y2goYyl7Y2FzZSBvLmRvdDplPXRbbi4kZ2V0Q2hpbGRyZW5CeU5hbWVdKHIsITEpO2JyZWFrO2Nhc2Ugby5kb3REb3Q6ZT10W24uJGdldENoaWxkcmVuQnlOYW1lXShyLCEwKTticmVhaztjYXNlIG8uZG90SGFzaDplPXRbbi4kZ2V0Q2hpbGRyZW5CeUNsYXNzXShyKSxlPWUuaXNYRkFPYmplY3RBcnJheT9lLmNoaWxkcmVuOltlXX1hJiZpLnNldChzLGUpfWUubGVuZ3RoPjAmJmYucHVzaChlKX1pZigwIT09Zi5sZW5ndGh8fHV8fDAhPT1kKWU9aXNGaW5pdGUoaCk/Zi5maWx0ZXIoKGU9Pmg8ZS5sZW5ndGgpKS5tYXAoKGU9PmVbaF0pKTpmLmZsYXQoKTtlbHNle2NvbnN0IHI9dFtuLiRnZXRQYXJlbnRdKCk7aWYoISh0PXIpKXJldHVybiBudWxsO2Q9LTEsZT1bdF19fXJldHVybiAwPT09ZS5sZW5ndGg/bnVsbDplfSxyKDEzOSk7dmFyIG49cigyMjgpLGE9cigxNDQpO2NvbnN0IGk9L15bXi5bXSsvLHM9L15bXlxdXSsvLG89e2RvdDowLGRvdERvdDoxLGRvdEhhc2g6Mixkb3RCcmFja2V0OjMsZG90UGFyZW46NH0sYz1uZXcgTWFwKFtbIiRkYXRhIiwoZSx0KT0+ZS5kYXRhc2V0cz9lLmRhdGFzZXRzLmRhdGE6ZV0sWyIkcmVjb3JkIiwoZSx0KT0+KGUuZGF0YXNldHM/ZS5kYXRhc2V0cy5kYXRhOmUpW24uJGdldENoaWxkcmVuXSgpWzBdXSxbIiR0ZW1wbGF0ZSIsKGUsdCk9PmUudGVtcGxhdGVdLFsiJGNvbm5lY3Rpb25TZXQiLChlLHQpPT5lLmNvbm5lY3Rpb25TZXRdLFsiJGZvcm0iLChlLHQpPT5lLmZvcm1dLFsiJGxheW91dCIsKGUsdCk9PmUubGF5b3V0XSxbIiRob3N0IiwoZSx0KT0+ZS5ob3N0XSxbIiRkYXRhV2luZG93IiwoZSx0KT0+ZS5kYXRhV2luZG93XSxbIiRldmVudCIsKGUsdCk9PmUuZXZlbnRdLFsiISIsKGUsdCk9PmUuZGF0YXNldHNdLFsiJHhmYSIsKGUsdCk9PmVdLFsieGZhIiwoZSx0KT0+ZV0sWyIkIiwoZSx0KT0+dF1dKSxsPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGgoZSx0KXtsZXQgcj0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdLG49ZS5tYXRjaChpKTtpZighbilyZXR1cm4gbnVsbDtsZXRbY109bjtjb25zdCBsPVt7bmFtZTpjLGNhY2hlTmFtZToiLiIrYyxpbmRleDowLGpzOm51bGwsZm9ybUNhbGM6bnVsbCxvcGVyYXRvcjpvLmRvdH1dO2xldCBoPWMubGVuZ3RoO2Zvcig7aDxlLmxlbmd0aDspe2NvbnN0IGQ9aDtpZigiWyI9PT1lLmNoYXJBdChoKyspKXtpZihuPWUuc2xpY2UoaCkubWF0Y2gocyksIW4pcmV0dXJuKDAsYS53YXJuKSgiWEZBIC0gSW52YWxpZCBpbmRleCBpbiBTT00gZXhwcmVzc2lvbiIpLG51bGw7bC5hdCgtMSkuaW5kZXg9IioiPT09KHU9KHU9blswXSkudHJpbSgpKT8xLzA6cGFyc2VJbnQodSwxMCl8fDAsaCs9blswXS5sZW5ndGgrMTtjb250aW51ZX1sZXQgZjtzd2l0Y2goZS5jaGFyQXQoaCkpe2Nhc2UiLiI6aWYoIXQpcmV0dXJuIG51bGw7aCsrLGY9by5kb3REb3Q7YnJlYWs7Y2FzZSIjIjpoKyssZj1vLmRvdEhhc2g7YnJlYWs7Y2FzZSJbIjppZihyKXJldHVybigwLGEud2FybikoIlhGQSAtIFNPTSBleHByZXNzaW9uIGNvbnRhaW5zIGEgRm9ybUNhbGMgc3ViZXhwcmVzc2lvbiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub3cuIiksbnVsbDtmPW8uZG90QnJhY2tldDticmVhaztjYXNlIigiOmlmKHIpcmV0dXJuKDAsYS53YXJuKSgiWEZBIC0gU09NIGV4cHJlc3Npb24gY29udGFpbnMgYSBKYXZhU2NyaXB0IHN1YmV4cHJlc3Npb24gd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93LiIpLG51bGw7Zj1vLmRvdFBhcmVuO2JyZWFrO2RlZmF1bHQ6Zj1vLmRvdH1pZihuPWUuc2xpY2UoaCkubWF0Y2goaSksIW4pYnJlYWs7W2NdPW4saCs9Yy5sZW5ndGgsbC5wdXNoKHtuYW1lOmMsY2FjaGVOYW1lOmUuc2xpY2UoZCxoKSxvcGVyYXRvcjpmLGluZGV4OjAsanM6bnVsbCxmb3JtQ2FsYzpudWxsfSl9dmFyIHU7cmV0dXJuIGx9fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRGF0YUhhbmRsZXI9dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDIyOCk7dC5EYXRhSGFuZGxlcj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGF0YT10LHRoaXMuZGF0YXNldD1lLmRhdGFzZXRzfHxudWxsfXNlcmlhbGl6ZShlKXtjb25zdCB0PVtbLTEsdGhpcy5kYXRhW24uJGdldENoaWxkcmVuXSgpXV07Zm9yKDt0Lmxlbmd0aD4wOyl7Y29uc3Qgcj10LmF0KC0xKSxbYSxpXT1yO2lmKGErMT09PWkubGVuZ3RoKXt0LnBvcCgpO2NvbnRpbnVlfWNvbnN0IHM9aVsrK3JbMF1dLG89ZS5nZXQoc1tuLiR1aWRdKTtpZihvKXNbbi4kc2V0VmFsdWVdKG8pO2Vsc2V7Y29uc3QgdD1zW24uJGdldEF0dHJpYnV0ZXNdKCk7Zm9yKGNvbnN0IHIgb2YgdC52YWx1ZXMoKSl7Y29uc3QgdD1lLmdldChyW24uJHVpZF0pO2lmKHQpe3Jbbi4kc2V0VmFsdWVdKHQpO2JyZWFrfX19Y29uc3QgYz1zW24uJGdldENoaWxkcmVuXSgpO2MubGVuZ3RoPjAmJnQucHVzaChbLTEsY10pfWNvbnN0IHI9Wyc8eGZhOmRhdGFzZXRzIHhtbG5zOnhmYT0iaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZGF0YS8xLjAvIj4nXTtpZih0aGlzLmRhdGFzZXQpZm9yKGNvbnN0IGUgb2YgdGhpcy5kYXRhc2V0W24uJGdldENoaWxkcmVuXSgpKSJkYXRhIiE9PWVbbi4kbm9kZU5hbWVdJiZlW24uJHRvU3RyaW5nXShyKTtyZXR1cm4gdGhpcy5kYXRhW24uJHRvU3RyaW5nXShyKSxyLnB1c2goIjwveGZhOmRhdGFzZXRzPiIpLHIuam9pbigiIil9fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlhGQVBhcnNlcj12b2lkIDAscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoMTM5KTt2YXIgbj1yKDIyOCksYT1yKDIxNyksaT1yKDI0NCkscz1yKDE0NCk7Y2xhc3MgbyBleHRlbmRzIGEuWE1MUGFyc2VyQmFzZXtjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtzdXBlcigpLHRoaXMuX2J1aWxkZXI9bmV3IGkuQnVpbGRlcihlKSx0aGlzLl9zdGFjaz1bXSx0aGlzLl9nbG9iYWxEYXRhPXt1c2VkVHlwZWZhY2VzOm5ldyBTZXR9LHRoaXMuX2lkcz1uZXcgTWFwLHRoaXMuX2N1cnJlbnQ9dGhpcy5fYnVpbGRlci5idWlsZFJvb3QodGhpcy5faWRzKSx0aGlzLl9lcnJvckNvZGU9YS5YTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcix0aGlzLl93aGl0ZVJlZ2V4PS9eXHMrJC8sdGhpcy5fbmJzcHM9L1x4YTArL2csdGhpcy5fcmljaFRleHQ9dH1wYXJzZShlKXtpZih0aGlzLnBhcnNlWG1sKGUpLHRoaXMuX2Vycm9yQ29kZT09PWEuWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3IpcmV0dXJuIHRoaXMuX2N1cnJlbnRbbi4kZmluYWxpemVdKCksdGhpcy5fY3VycmVudC5lbGVtZW50fW9uVGV4dChlKXtlPWUucmVwbGFjZSh0aGlzLl9uYnNwcywoZT0+ZS5zbGljZSgxKSsiICIpKSx0aGlzLl9yaWNoVGV4dHx8dGhpcy5fY3VycmVudFtuLiRhY2NlcHRXaGl0ZXNwYWNlXSgpP3RoaXMuX2N1cnJlbnRbbi4kb25UZXh0XShlLHRoaXMuX3JpY2hUZXh0KTp0aGlzLl93aGl0ZVJlZ2V4LnRlc3QoZSl8fHRoaXMuX2N1cnJlbnRbbi4kb25UZXh0XShlLnRyaW0oKSl9b25DZGF0YShlKXt0aGlzLl9jdXJyZW50W24uJG9uVGV4dF0oZSl9X21rQXR0cmlidXRlcyhlLHQpe2xldCByPW51bGwsYT1udWxsO2NvbnN0IGk9T2JqZWN0LmNyZWF0ZSh7fSk7Zm9yKGNvbnN0e25hbWU6Yyx2YWx1ZTpsfW9mIGUpaWYoInhtbG5zIj09PWMpcj8oMCxzLndhcm4pKCJYRkEgLSBtdWx0aXBsZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBpbiA8Ii5jb25jYXQodCwiPiIpKTpyPWw7ZWxzZSBpZihjLnN0YXJ0c1dpdGgoInhtbG5zOiIpKXtjb25zdCBlPWMuc3Vic3RyaW5nKDYpO2F8fChhPVtdKSxhLnB1c2goe3ByZWZpeDplLHZhbHVlOmx9KX1lbHNle2NvbnN0IGU9Yy5pbmRleE9mKCI6Iik7aWYoLTE9PT1lKWlbY109bDtlbHNle3ZhciBvO2xldCB0PWlbbi4kbnNBdHRyaWJ1dGVzXTt0fHwodD1pW24uJG5zQXR0cmlidXRlc109T2JqZWN0LmNyZWF0ZShudWxsKSk7Y29uc3RbcixhXT1bYy5zbGljZSgwLGUpLGMuc2xpY2UoZSsxKV07KChvPXQpW3JdfHwob1tyXT1PYmplY3QuY3JlYXRlKG51bGwpKSlbYV09bH19cmV0dXJuW3IsYSxpXX1fZ2V0TmFtZUFuZFByZWZpeChlLHQpe2NvbnN0IHI9ZS5pbmRleE9mKCI6Iik7cmV0dXJuLTE9PT1yP1tlLG51bGxdOltlLnN1YnN0cmluZyhyKzEpLHQ/IiI6ZS5zdWJzdHJpbmcoMCxyKV19b25CZWdpbkVsZW1lbnQoZSx0LHIpe2NvbnN0W2EsaSxzXT10aGlzLl9ta0F0dHJpYnV0ZXModCxlKSxbbyxjXT10aGlzLl9nZXROYW1lQW5kUHJlZml4KGUsdGhpcy5fYnVpbGRlci5pc05zQWdub3N0aWMoKSksbD10aGlzLl9idWlsZGVyLmJ1aWxkKHtuc1ByZWZpeDpjLG5hbWU6byxhdHRyaWJ1dGVzOnMsbmFtZXNwYWNlOmEscHJlZml4ZXM6aX0pO2xbbi4kZ2xvYmFsRGF0YV09dGhpcy5fZ2xvYmFsRGF0YSxyPyhsW24uJGZpbmFsaXplXSgpLHRoaXMuX2N1cnJlbnRbbi4kb25DaGlsZF0obCkmJmxbbi4kc2V0SWRdKHRoaXMuX2lkcyksbFtuLiRjbGVhbl0odGhpcy5fYnVpbGRlcikpOih0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnQpLHRoaXMuX2N1cnJlbnQ9bCl9b25FbmRFbGVtZW50KGUpe2NvbnN0IHQ9dGhpcy5fY3VycmVudDtpZih0W24uJGlzQ0RBVEFYbWxdKCkmJiJzdHJpbmciPT10eXBlb2YgdFtuLiRjb250ZW50XSl7Y29uc3QgZT1uZXcgbztlLl9nbG9iYWxEYXRhPXRoaXMuX2dsb2JhbERhdGE7Y29uc3Qgcj1lLnBhcnNlKHRbbi4kY29udGVudF0pO3Rbbi4kY29udGVudF09bnVsbCx0W24uJG9uQ2hpbGRdKHIpfXRbbi4kZmluYWxpemVdKCksdGhpcy5fY3VycmVudD10aGlzLl9zdGFjay5wb3AoKSx0aGlzLl9jdXJyZW50W24uJG9uQ2hpbGRdKHQpJiZ0W24uJHNldElkXSh0aGlzLl9pZHMpLHRbbi4kY2xlYW5dKHRoaXMuX2J1aWxkZXIpfW9uRXJyb3IoZSl7dGhpcy5fZXJyb3JDb2RlPWV9fXQuWEZBUGFyc2VyPW99LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5CdWlsZGVyPXZvaWQgMCxyKDEzOSk7dmFyIG49cigyMzQpLGE9cigyMjgpLGk9cigyNDUpLHM9cigyMzApLG89cigyNTQpLGM9cigxNDQpLGw9cigyNDApO2NsYXNzIGggZXh0ZW5kcyBsLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigtMSwicm9vdCIsT2JqZWN0LmNyZWF0ZShudWxsKSksdGhpcy5lbGVtZW50PW51bGwsdGhpc1thLiRpZHNdPWV9W2EuJG9uQ2hpbGRdKGUpe3JldHVybiB0aGlzLmVsZW1lbnQ9ZSwhMH1bYS4kZmluYWxpemVdKCl7c3VwZXJbYS4kZmluYWxpemVdKCksdGhpcy5lbGVtZW50LnRlbXBsYXRlIGluc3RhbmNlb2Ygcy5UZW1wbGF0ZSYmKHRoaXNbYS4kaWRzXS5zZXQoYS4kcm9vdCx0aGlzLmVsZW1lbnQpLHRoaXMuZWxlbWVudC50ZW1wbGF0ZVthLiRyZXNvbHZlUHJvdG90eXBlc10odGhpc1thLiRpZHNdKSx0aGlzLmVsZW1lbnQudGVtcGxhdGVbYS4kaWRzXT10aGlzW2EuJGlkc10pfX1jbGFzcyB1IGV4dGVuZHMgbC5YRkFPYmplY3R7Y29uc3RydWN0b3IoKXtzdXBlcigtMSwiIixPYmplY3QuY3JlYXRlKG51bGwpKX1bYS4kb25DaGlsZF0oZSl7cmV0dXJuITF9fXQuQnVpbGRlcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3RoaXMuX25hbWVzcGFjZVN0YWNrPVtdLHRoaXMuX25zQWdub3N0aWNMZXZlbD0wLHRoaXMuX25hbWVzcGFjZVByZWZpeGVzPW5ldyBNYXAsdGhpcy5fbmFtZXNwYWNlcz1uZXcgTWFwLHRoaXMuX25leHROc0lkPU1hdGgubWF4KC4uLk9iamVjdC52YWx1ZXMobi5OYW1lc3BhY2VJZHMpLm1hcCgoZT0+e2xldHtpZDp0fT1lO3JldHVybiB0fSkpKSx0aGlzLl9jdXJyZW50TmFtZXNwYWNlPWV8fG5ldyBvLlVua25vd25OYW1lc3BhY2UoKyt0aGlzLl9uZXh0TnNJZCl9YnVpbGRSb290KGUpe3JldHVybiBuZXcgaChlKX1idWlsZChlKXtsZXR7bnNQcmVmaXg6dCxuYW1lOnIsYXR0cmlidXRlczpzLG5hbWVzcGFjZTpvLHByZWZpeGVzOmN9PWU7Y29uc3QgbD1udWxsIT09bztpZihsJiYodGhpcy5fbmFtZXNwYWNlU3RhY2sucHVzaCh0aGlzLl9jdXJyZW50TmFtZXNwYWNlKSx0aGlzLl9jdXJyZW50TmFtZXNwYWNlPXRoaXMuX3NlYXJjaE5hbWVzcGFjZShvKSksYyYmdGhpcy5fYWRkTmFtZXNwYWNlUHJlZml4KGMpLHMuaGFzT3duUHJvcGVydHkoYS4kbnNBdHRyaWJ1dGVzKSl7Y29uc3QgZT1pLk5hbWVzcGFjZVNldFVwLmRhdGFzZXRzLHQ9c1thLiRuc0F0dHJpYnV0ZXNdO2xldCByPW51bGw7Zm9yKGNvbnN0W24sYV1vZiBPYmplY3QuZW50cmllcyh0KSlpZih0aGlzLl9nZXROYW1lc3BhY2VUb1VzZShuKT09PWUpe3I9e3hmYTphfTticmVha31yP3NbYS4kbnNBdHRyaWJ1dGVzXT1yOmRlbGV0ZSBzW2EuJG5zQXR0cmlidXRlc119Y29uc3QgaD10aGlzLl9nZXROYW1lc3BhY2VUb1VzZSh0KSxkPShudWxsPT1oP3ZvaWQgMDpoW24uJGJ1aWxkWEZBT2JqZWN0XShyLHMpKXx8bmV3IHU7cmV0dXJuIGRbYS4kaXNOc0Fnbm9zdGljXSgpJiZ0aGlzLl9uc0Fnbm9zdGljTGV2ZWwrKywobHx8Y3x8ZFthLiRpc05zQWdub3N0aWNdKCkpJiYoZFthLiRjbGVhbnVwXT17aGFzTmFtZXNwYWNlOmwscHJlZml4ZXM6Yyxuc0Fnbm9zdGljOmRbYS4kaXNOc0Fnbm9zdGljXSgpfSksZH1pc05zQWdub3N0aWMoKXtyZXR1cm4gdGhpcy5fbnNBZ25vc3RpY0xldmVsPjB9X3NlYXJjaE5hbWVzcGFjZShlKXtsZXQgdD10aGlzLl9uYW1lc3BhY2VzLmdldChlKTtpZih0KXJldHVybiB0O2Zvcihjb25zdFtyLHtjaGVjazphfV1vZiBPYmplY3QuZW50cmllcyhuLk5hbWVzcGFjZUlkcykpaWYoYShlKSl7aWYodD1pLk5hbWVzcGFjZVNldFVwW3JdLHQpcmV0dXJuIHRoaXMuX25hbWVzcGFjZXMuc2V0KGUsdCksdDticmVha31yZXR1cm4gdD1uZXcgby5Vbmtub3duTmFtZXNwYWNlKCsrdGhpcy5fbmV4dE5zSWQpLHRoaXMuX25hbWVzcGFjZXMuc2V0KGUsdCksdH1fYWRkTmFtZXNwYWNlUHJlZml4KGUpe2Zvcihjb25zdHtwcmVmaXg6dCx2YWx1ZTpyfW9mIGUpe2NvbnN0IGU9dGhpcy5fc2VhcmNoTmFtZXNwYWNlKHIpO2xldCBuPXRoaXMuX25hbWVzcGFjZVByZWZpeGVzLmdldCh0KTtufHwobj1bXSx0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5zZXQodCxuKSksbi5wdXNoKGUpfX1fZ2V0TmFtZXNwYWNlVG9Vc2UoZSl7aWYoIWUpcmV0dXJuIHRoaXMuX2N1cnJlbnROYW1lc3BhY2U7Y29uc3QgdD10aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQoZSk7cmV0dXJuKG51bGw9PXQ/dm9pZCAwOnQubGVuZ3RoKT4wP3QuYXQoLTEpOigoMCxjLndhcm4pKCJVbmtub3duIG5hbWVzcGFjZSBwcmVmaXg6ICIuY29uY2F0KGUsIi4iKSksbnVsbCl9Y2xlYW4oZSl7Y29uc3R7aGFzTmFtZXNwYWNlOnQscHJlZml4ZXM6cixuc0Fnbm9zdGljOm59PWU7dCYmKHRoaXMuX2N1cnJlbnROYW1lc3BhY2U9dGhpcy5fbmFtZXNwYWNlU3RhY2sucG9wKCkpLHImJnIuZm9yRWFjaCgoZT0+e2xldHtwcmVmaXg6dH09ZTt0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQodCkucG9wKCl9KSksbiYmdGhpcy5fbnNBZ25vc3RpY0xldmVsLS19fX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk5hbWVzcGFjZVNldFVwPXZvaWQgMDt2YXIgbj1yKDI0NiksYT1yKDI0NyksaT1yKDI0OCkscz1yKDI0OSksbz1yKDI1MCksYz1yKDI1MSksbD1yKDIzMCksaD1yKDI1MiksdT1yKDI1Myk7Y29uc3QgZD17Y29uZmlnOm4uQ29uZmlnTmFtZXNwYWNlLGNvbm5lY3Rpb246YS5Db25uZWN0aW9uU2V0TmFtZXNwYWNlLGRhdGFzZXRzOmkuRGF0YXNldHNOYW1lc3BhY2UsbG9jYWxlU2V0OnMuTG9jYWxlU2V0TmFtZXNwYWNlLHNpZ25hdHVyZTpvLlNpZ25hdHVyZU5hbWVzcGFjZSxzdHlsZXNoZWV0OmMuU3R5bGVzaGVldE5hbWVzcGFjZSx0ZW1wbGF0ZTpsLlRlbXBsYXRlTmFtZXNwYWNlLHhkcDpoLlhkcE5hbWVzcGFjZSx4aHRtbDp1LlhodG1sTmFtZXNwYWNlfTt0Lk5hbWVzcGFjZVNldFVwPWR9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Db25maWdOYW1lc3BhY2U9dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDIzNCksYT1yKDIyOCksaT1yKDI0MCkscz1yKDIzNyksbz1yKDE0NCk7Y29uc3QgYz1uLk5hbWVzcGFjZUlkcy5jb25maWcuaWQ7Y2xhc3MgbCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImFjcm9iYXQiLCEwKSx0aGlzLmFjcm9iYXQ3PW51bGwsdGhpcy5hdXRvU2F2ZT1udWxsLHRoaXMuY29tbW9uPW51bGwsdGhpcy52YWxpZGF0ZT1udWxsLHRoaXMudmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXM9bnVsbCx0aGlzLnN1Ym1pdFVybD1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgaCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImFjcm9iYXQ3IiwhMCksdGhpcy5keW5hbWljUmVuZGVyPW51bGx9fWNsYXNzIHUgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJBREJFX0pTQ29uc29sZSIsWyJkZWxlZ2F0ZSIsIkVuYWJsZSIsIkRpc2FibGUiXSl9fWNsYXNzIGQgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJBREJFX0pTRGVidWdnZXIiLFsiZGVsZWdhdGUiLCJFbmFibGUiLCJEaXNhYmxlIl0pfX1jbGFzcyBmIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhZGRTaWxlbnRQcmludCIpfX1jbGFzcyBnIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhZGRWaWV3ZXJQcmVmZXJlbmNlcyIpfX1jbGFzcyBwIGV4dGVuZHMgaS5PcHRpb24xMHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJhZGp1c3REYXRhIil9fWNsYXNzIG0gZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWRvYmVFeHRlbnNpb25MZXZlbCIsMCwoZT0+ZT49MSYmZTw9OCkpfX1jbGFzcyBiIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWdlbnQiLCEwKSx0aGlzLm5hbWU9ZS5uYW1lP2UubmFtZS50cmltKCk6IiIsdGhpcy5jb21tb249bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIHkgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYWx3YXlzRW1iZWQiKX19Y2xhc3MgdyBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImFtZCIpfX1jbGFzcyB2IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYXJlYSIpLHRoaXMubGV2ZWw9KDAscy5nZXRJbnRlZ2VyKSh7ZGF0YTplLmxldmVsLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PmU+PTEmJmU8PTN9KSx0aGlzLm5hbWU9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUubmFtZSxbIiIsImJhcmNvZGUiLCJjb3JlaW5pdCIsImRldmljZURyaXZlciIsImZvbnQiLCJnZW5lcmFsIiwibGF5b3V0IiwibWVyZ2UiLCJzY3JpcHQiLCJzaWduYXR1cmUiLCJzb3VyY2VTZXQiLCJ0ZW1wbGF0ZUNhY2hlIl0pfX1jbGFzcyB4IGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYXR0cmlidXRlcyIsWyJwcmVzZXJ2ZSIsImRlbGVnYXRlIiwiaWdub3JlIl0pfX1jbGFzcyBTIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYXV0b1NhdmUiLFsiZGlzYWJsZWQiLCJlbmFibGVkIl0pfX1jbGFzcyBBIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYmFzZSIpfX1jbGFzcyBrIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYmF0Y2hPdXRwdXQiKSx0aGlzLmZvcm1hdD0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5mb3JtYXQsWyJub25lIiwiY29uY2F0IiwiemlwIiwiemlwQ29tcHJlc3MiXSl9fWNsYXNzIEMgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiYmVoYXZpb3JPdmVycmlkZSIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPW5ldyBNYXAodGhpc1thLiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcigoZT0+ZS5pbmNsdWRlcygiOiIpKSkubWFwKChlPT5lLnNwbGl0KCI6IiwyKSkpKX19Y2xhc3MgTyBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNhY2hlIiwhMCksdGhpcy50ZW1wbGF0ZUNhY2hlPW51bGx9fWNsYXNzIEYgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNoYW5nZSIpfX1jbGFzcyBJIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29tbW9uIiwhMCksdGhpcy5kYXRhPW51bGwsdGhpcy5sb2NhbGU9bnVsbCx0aGlzLmxvY2FsZVNldD1udWxsLHRoaXMubWVzc2FnaW5nPW51bGwsdGhpcy5zdXBwcmVzc0Jhbm5lcj1udWxsLHRoaXMudGVtcGxhdGU9bnVsbCx0aGlzLnZhbGlkYXRpb25NZXNzYWdpbmc9bnVsbCx0aGlzLnZlcnNpb25Db250cm9sPW51bGwsdGhpcy5sb2c9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIFQgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjb21wcmVzcyIpLHRoaXMuc2NvcGU9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUuc2NvcGUsWyJpbWFnZU9ubHkiLCJkb2N1bWVudCJdKX19Y2xhc3MgTSBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlIil9fWNsYXNzIEUgZXh0ZW5kcyBpLk9wdGlvbjEwe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNvbXByZXNzT2JqZWN0U3RyZWFtIil9fWNsYXNzIFAgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjb21wcmVzc2lvbiIsITApLHRoaXMuY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlPW51bGwsdGhpcy5jb21wcmVzc09iamVjdFN0cmVhbT1udWxsLHRoaXMubGV2ZWw9bnVsbCx0aGlzLnR5cGU9bnVsbH19Y2xhc3MgUiBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNvbmZpZyIsITApLHRoaXMuYWNyb2JhdD1udWxsLHRoaXMucHJlc2VudD1udWxsLHRoaXMudHJhY2U9bnVsbCx0aGlzLmFnZW50PW5ldyBpLlhGQU9iamVjdEFycmF5fX1jbGFzcyBOIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29uZm9ybWFuY2UiLFsiQSIsIkIiXSl9fWNsYXNzIEQgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImNvbnRlbnRDb3B5Iil9fWNsYXNzIEIgZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY29waWVzIiwxLChlPT5lPj0xKSl9fWNsYXNzIEwgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJjcmVhdG9yIil9fWNsYXNzIF8gZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiY3VycmVudFBhZ2UiLDAsKGU9PmU+PTApKX19Y2xhc3MgaiBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImRhdGEiLCEwKSx0aGlzLmFkanVzdERhdGE9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9bnVsbCx0aGlzLmluY3JlbWVudGFsTG9hZD1udWxsLHRoaXMub3V0cHV0WFNMPW51bGwsdGhpcy5yYW5nZT1udWxsLHRoaXMucmVjb3JkPW51bGwsdGhpcy5zdGFydE5vZGU9bnVsbCx0aGlzLnVyaT1udWxsLHRoaXMud2luZG93PW51bGwsdGhpcy54c2w9bnVsbCx0aGlzLmV4Y2x1ZGVOUz1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLnRyYW5zZm9ybT1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgVSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImRlYnVnIiwhMCksdGhpcy51cmk9bnVsbH19Y2xhc3MgJCBleHRlbmRzIGkuQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkZWZhdWx0VHlwZWZhY2UiKSx0aGlzLndyaXRpbmdTY3JpcHQ9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUud3JpdGluZ1NjcmlwdCxbIioiLCJBcmFiaWMiLCJDeXJpbGxpYyIsIkVhc3RFdXJvcGVhblJvbWFuIiwiR3JlZWsiLCJIZWJyZXciLCJKYXBhbmVzZSIsIktvcmVhbiIsIlJvbWFuIiwiU2ltcGxpZmllZENoaW5lc2UiLCJUaGFpIiwiVHJhZGl0aW9uYWxDaGluZXNlIiwiVmlldG5hbWVzZSJdKX19Y2xhc3MgWCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImRlc3RpbmF0aW9uIixbInBkZiIsInBjbCIsInBzIiwid2ViQ2xpZW50IiwienBsIl0pfX1jbGFzcyBIIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkb2N1bWVudEFzc2VtYmx5Iil9fWNsYXNzIHEgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkcml2ZXIiLCEwKSx0aGlzLm5hbWU9ZS5uYW1lP2UubmFtZS50cmltKCk6IiIsdGhpcy5mb250SW5mbz1udWxsLHRoaXMueGRjPW51bGx9fWNsYXNzIHogZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkdXBsZXhPcHRpb24iLFsic2ltcGxleCIsImR1cGxleEZsaXBMb25nRWRnZSIsImR1cGxleEZsaXBTaG9ydEVkZ2UiXSl9fWNsYXNzIEcgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJkeW5hbWljUmVuZGVyIixbImZvcmJpZGRlbiIsInJlcXVpcmVkIl0pfX1jbGFzcyBXIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbWJlZCIpfX1jbGFzcyBWIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmNyeXB0Iil9fWNsYXNzIEsgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmNyeXB0aW9uIiwhMCksdGhpcy5lbmNyeXB0PW51bGwsdGhpcy5lbmNyeXB0aW9uTGV2ZWw9bnVsbCx0aGlzLnBlcm1pc3Npb25zPW51bGx9fWNsYXNzIFkgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmNyeXB0aW9uTGV2ZWwiLFsiNDBiaXQiLCIxMjhiaXQiXSl9fWNsYXNzIEogZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlbmZvcmNlIil9fWNsYXNzIFogZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlcXVhdGUiKSx0aGlzLmZvcmNlPSgwLHMuZ2V0SW50ZWdlcikoe2RhdGE6ZS5mb3JjZSxkZWZhdWx0VmFsdWU6MSx2YWxpZGF0ZTplPT4wPT09ZX0pLHRoaXMuZnJvbT1lLmZyb218fCIiLHRoaXMudG89ZS50b3x8IiJ9fWNsYXNzIFEgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJlcXVhdGVSYW5nZSIpLHRoaXMuZnJvbT1lLmZyb218fCIiLHRoaXMudG89ZS50b3x8IiIsdGhpcy5fdW5pY29kZVJhbmdlPWUudW5pY29kZVJhbmdlfHwiIn1nZXQgdW5pY29kZVJhbmdlKCl7Y29uc3QgZT1bXSx0PS9VXCsoWzAtOWEtZkEtRl0rKS8scj10aGlzLl91bmljb2RlUmFuZ2U7Zm9yKGxldCBuIG9mIHIuc3BsaXQoIiwiKS5tYXAoKGU9PmUudHJpbSgpKSkuZmlsdGVyKChlPT4hIWUpKSluPW4uc3BsaXQoIi0iLDIpLm1hcCgoZT0+e2NvbnN0IHI9ZS5tYXRjaCh0KTtyZXR1cm4gcj9wYXJzZUludChyWzFdLDE2KTowfSkpLDE9PT1uLmxlbmd0aCYmbi5wdXNoKG5bMF0pLGUucHVzaChuKTtyZXR1cm4oMCxvLnNoYWRvdykodGhpcywidW5pY29kZVJhbmdlIixlKX19Y2xhc3MgZWUgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZXhjbHVkZSIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoKGU9PmUmJlsiY2FsY3VsYXRlIiwiY2xvc2UiLCJlbnRlciIsImV4aXQiLCJpbml0aWFsaXplIiwicmVhZHkiLCJ2YWxpZGF0ZSJdLmluY2x1ZGVzKGUpKSl9fWNsYXNzIHRlIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZXhjbHVkZU5TIil9fWNsYXNzIHJlIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZmxpcExhYmVsIixbInVzZVByaW50ZXJTZXR0aW5nIiwib24iLCJvZmYiXSl9fWNsYXNzIG5lIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZm9udEluZm8iLCEwKSx0aGlzLmVtYmVkPW51bGwsdGhpcy5tYXA9bnVsbCx0aGlzLnN1YnNldEJlbG93PW51bGwsdGhpcy5hbHdheXNFbWJlZD1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLmRlZmF1bHRUeXBlZmFjZT1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLm5ldmVyRW1iZWQ9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIGFlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJmb3JtRmllbGRGaWxsaW5nIil9fWNsYXNzIGllIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywiZ3JvdXBQYXJlbnQiKX19Y2xhc3Mgc2UgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJpZkVtcHR5IixbImRhdGFWYWx1ZSIsImRhdGFHcm91cCIsImlnbm9yZSIsInJlbW92ZSJdKX19Y2xhc3Mgb2UgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJpbmNsdWRlWERQQ29udGVudCIpfX1jbGFzcyBjZSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImluY3JlbWVudGFsTG9hZCIsWyJub25lIiwiZm9yd2FyZE9ubHkiXSl9fWNsYXNzIGxlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJpbmNyZW1lbnRhbE1lcmdlIil9fWNsYXNzIGhlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJpbnRlcmFjdGl2ZSIpfX1jbGFzcyB1ZSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImpvZyIsWyJ1c2VQcmludGVyU2V0dGluZyIsIm5vbmUiLCJwYWdlU2V0Il0pfX1jbGFzcyBkZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxhYmVsUHJpbnRlciIsITApLHRoaXMubmFtZT0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5uYW1lLFsienBsIiwiZHBsIiwiaXBsIiwidGNwbCJdKSx0aGlzLmJhdGNoT3V0cHV0PW51bGwsdGhpcy5mbGlwTGFiZWw9bnVsbCx0aGlzLmZvbnRJbmZvPW51bGwsdGhpcy54ZGM9bnVsbH19Y2xhc3MgZmUgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJsYXlvdXQiLFsicGFnaW5hdGUiLCJwYW5lbCJdKX19Y2xhc3MgZ2UgZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibGV2ZWwiLDAsKGU9PmU+MCkpfX1jbGFzcyBwZSBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibGluZWFyaXplZCIpfX1jbGFzcyBtZSBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxvY2FsZSIpfX1jbGFzcyBiZSBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxvY2FsZVNldCIpfX1jbGFzcyB5ZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsImxvZyIsITApLHRoaXMubW9kZT1udWxsLHRoaXMudGhyZXNob2xkPW51bGwsdGhpcy50bz1udWxsLHRoaXMudXJpPW51bGx9fWNsYXNzIHdlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibWFwIiwhMCksdGhpcy5lcXVhdGU9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5lcXVhdGVSYW5nZT1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgdmUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJtZWRpdW1JbmZvIiwhMCksdGhpcy5tYXA9bnVsbH19Y2xhc3MgeGUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJtZXNzYWdlIiwhMCksdGhpcy5tc2dJZD1udWxsLHRoaXMuc2V2ZXJpdHk9bnVsbH19Y2xhc3MgU2UgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJtZXNzYWdpbmciLCEwKSx0aGlzLm1lc3NhZ2U9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIEFlIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibW9kZSIsWyJhcHBlbmQiLCJvdmVyd3JpdGUiXSl9fWNsYXNzIGtlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJtb2RpZnlBbm5vdHMiKX19Y2xhc3MgQ2UgZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywibXNnSWQiLDEsKGU9PmU+PTEpKX19Y2xhc3MgT2UgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJuYW1lQXR0ciIpfX1jbGFzcyBGZSBleHRlbmRzIGkuQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJuZXZlckVtYmVkIil9fWNsYXNzIEllIGV4dGVuZHMgaS5JbnRlZ2VyT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm51bWJlck9mQ29waWVzIixudWxsLChlPT5lPj0yJiZlPD01KSl9fWNsYXNzIFRlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywib3BlbkFjdGlvbiIsITApLHRoaXMuZGVzdGluYXRpb249bnVsbH19Y2xhc3MgTWUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJvdXRwdXQiLCEwKSx0aGlzLnRvPW51bGwsdGhpcy50eXBlPW51bGwsdGhpcy51cmk9bnVsbH19Y2xhc3MgRWUgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJvdXRwdXRCaW4iKX19Y2xhc3MgUGUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJvdXRwdXRYU0wiLCEwKSx0aGlzLnVyaT1udWxsfX1jbGFzcyBSZSBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIm92ZXJwcmludCIsWyJub25lIiwiYm90aCIsImRyYXciLCJmaWVsZCJdKX19Y2xhc3MgTmUgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWNrZXRzIil9W2EuJGZpbmFsaXplXSgpeyIqIiE9PXRoaXNbYS4kY29udGVudF0mJih0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoKGU9PlsiY29uZmlnIiwiZGF0YXNldHMiLCJ0ZW1wbGF0ZSIsInhmZGYiLCJ4c2x0Il0uaW5jbHVkZXMoZSkpKSl9fWNsYXNzIERlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicGFnZU9mZnNldCIpLHRoaXMueD0oMCxzLmdldEludGVnZXIpKHtkYXRhOmUueCxkZWZhdWx0VmFsdWU6InVzZVhEQ1NldHRpbmciLHZhbGlkYXRlOmU9PiEwfSksdGhpcy55PSgwLHMuZ2V0SW50ZWdlcikoe2RhdGE6ZS55LGRlZmF1bHRWYWx1ZToidXNlWERDU2V0dGluZyIsdmFsaWRhdGU6ZT0+ITB9KX19Y2xhc3MgQmUgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWdlUmFuZ2UiKX1bYS4kZmluYWxpemVdKCl7Y29uc3QgZT10aGlzW2EuJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKChlPT5wYXJzZUludChlLDEwKSkpLHQ9W107Zm9yKGxldCByPTAsbj1lLmxlbmd0aDtyPG47cis9Mil0LnB1c2goZS5zbGljZShyLHIrMikpO3RoaXNbYS4kY29udGVudF09dH19Y2xhc3MgTGUgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWdpbmF0aW9uIixbInNpbXBsZXgiLCJkdXBsZXhTaG9ydEVkZ2UiLCJkdXBsZXhMb25nRWRnZSJdKX19Y2xhc3MgX2UgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYWdpbmF0aW9uT3ZlcnJpZGUiLFsibm9uZSIsImZvcmNlRHVwbGV4IiwiZm9yY2VEdXBsZXhMb25nRWRnZSIsImZvcmNlRHVwbGV4U2hvcnRFZGdlIiwiZm9yY2VTaW1wbGV4Il0pfX1jbGFzcyBqZSBleHRlbmRzIGkuSW50ZWdlck9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwYXJ0IiwxLChlPT4hMSkpfX1jbGFzcyBVZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBjbCIsITApLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMuYmF0Y2hPdXRwdXQ9bnVsbCx0aGlzLmZvbnRJbmZvPW51bGwsdGhpcy5qb2c9bnVsbCx0aGlzLm1lZGl1bUluZm89bnVsbCx0aGlzLm91dHB1dEJpbj1udWxsLHRoaXMucGFnZU9mZnNldD1udWxsLHRoaXMuc3RhcGxlPW51bGwsdGhpcy54ZGM9bnVsbH19Y2xhc3MgJGUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwZGYiLCEwKSx0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLmFkb2JlRXh0ZW5zaW9uTGV2ZWw9bnVsbCx0aGlzLmJhdGNoT3V0cHV0PW51bGwsdGhpcy5jb21wcmVzc2lvbj1udWxsLHRoaXMuY3JlYXRvcj1udWxsLHRoaXMuZW5jcnlwdGlvbj1udWxsLHRoaXMuZm9udEluZm89bnVsbCx0aGlzLmludGVyYWN0aXZlPW51bGwsdGhpcy5saW5lYXJpemVkPW51bGwsdGhpcy5vcGVuQWN0aW9uPW51bGwsdGhpcy5wZGZhPW51bGwsdGhpcy5wcm9kdWNlcj1udWxsLHRoaXMucmVuZGVyUG9saWN5PW51bGwsdGhpcy5zY3JpcHRNb2RlbD1udWxsLHRoaXMuc2lsZW50UHJpbnQ9bnVsbCx0aGlzLnN1Ym1pdEZvcm1hdD1udWxsLHRoaXMudGFnZ2VkPW51bGwsdGhpcy52ZXJzaW9uPW51bGwsdGhpcy52aWV3ZXJQcmVmZXJlbmNlcz1udWxsLHRoaXMueGRjPW51bGx9fWNsYXNzIFhlIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicGRmYSIsITApLHRoaXMuYW1kPW51bGwsdGhpcy5jb25mb3JtYW5jZT1udWxsLHRoaXMuaW5jbHVkZVhEUENvbnRlbnQ9bnVsbCx0aGlzLnBhcnQ9bnVsbH19Y2xhc3MgSGUgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwZXJtaXNzaW9ucyIsITApLHRoaXMuYWNjZXNzaWJsZUNvbnRlbnQ9bnVsbCx0aGlzLmNoYW5nZT1udWxsLHRoaXMuY29udGVudENvcHk9bnVsbCx0aGlzLmRvY3VtZW50QXNzZW1ibHk9bnVsbCx0aGlzLmZvcm1GaWVsZEZpbGxpbmc9bnVsbCx0aGlzLm1vZGlmeUFubm90cz1udWxsLHRoaXMucGxhaW50ZXh0TWV0YWRhdGE9bnVsbCx0aGlzLnByaW50PW51bGwsdGhpcy5wcmludEhpZ2hRdWFsaXR5PW51bGx9fWNsYXNzIHFlIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwaWNrVHJheUJ5UERGU2l6ZSIpfX1jbGFzcyB6ZSBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBpY3R1cmUiKX19Y2xhc3MgR2UgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBsYWludGV4dE1ldGFkYXRhIil9fWNsYXNzIFdlIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicHJlc2VuY2UiLFsicHJlc2VydmUiLCJkaXNzb2x2ZSIsImRpc3NvbHZlU3RydWN0dXJlIiwiaWdub3JlIiwicmVtb3ZlIl0pfX1jbGFzcyBWZSBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInByZXNlbnQiLCEwKSx0aGlzLmJlaGF2aW9yT3ZlcnJpZGU9bnVsbCx0aGlzLmNhY2hlPW51bGwsdGhpcy5jb21tb249bnVsbCx0aGlzLmNvcGllcz1udWxsLHRoaXMuZGVzdGluYXRpb249bnVsbCx0aGlzLmluY3JlbWVudGFsTWVyZ2U9bnVsbCx0aGlzLmxheW91dD1udWxsLHRoaXMub3V0cHV0PW51bGwsdGhpcy5vdmVycHJpbnQ9bnVsbCx0aGlzLnBhZ2luYXRpb249bnVsbCx0aGlzLnBhZ2luYXRpb25PdmVycmlkZT1udWxsLHRoaXMuc2NyaXB0PW51bGwsdGhpcy52YWxpZGF0ZT1udWxsLHRoaXMueGRwPW51bGwsdGhpcy5kcml2ZXI9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5sYWJlbFByaW50ZXI9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5wY2w9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5wZGY9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy5wcz1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLnN1Ym1pdFVybD1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLndlYkNsaWVudD1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLnpwbD1uZXcgaS5YRkFPYmplY3RBcnJheX19Y2xhc3MgS2UgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInByaW50Iil9fWNsYXNzIFllIGV4dGVuZHMgaS5PcHRpb24wMXtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwcmludEhpZ2hRdWFsaXR5Iil9fWNsYXNzIEplIGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicHJpbnRTY2FsaW5nIixbImFwcGRlZmF1bHQiLCJub1NjYWxpbmciXSl9fWNsYXNzIFplIGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicHJpbnRlck5hbWUiKX19Y2xhc3MgUWUgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJwcm9kdWNlciIpfX1jbGFzcyBldCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInBzIiwhMCksdGhpcy5uYW1lPWUubmFtZXx8IiIsdGhpcy5iYXRjaE91dHB1dD1udWxsLHRoaXMuZm9udEluZm89bnVsbCx0aGlzLmpvZz1udWxsLHRoaXMubWVkaXVtSW5mbz1udWxsLHRoaXMub3V0cHV0QmluPW51bGwsdGhpcy5zdGFwbGU9bnVsbCx0aGlzLnhkYz1udWxsfX1jbGFzcyB0dCBleHRlbmRzIGkuQ29udGVudE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJyYW5nZSIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccyosXHMqLywyKS5tYXAoKGU9PmUuc3BsaXQoIi0iKS5tYXAoKGU9PnBhcnNlSW50KGUudHJpbSgpLDEwKSkpKSkuZmlsdGVyKChlPT5lLmV2ZXJ5KChlPT4haXNOYU4oZSkpKSkpLm1hcCgoZT0+KDE9PT1lLmxlbmd0aCYmZS5wdXNoKGVbMF0pLGUpKSl9fWNsYXNzIHJ0IGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInJlY29yZCIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpO2NvbnN0IGU9cGFyc2VJbnQodGhpc1thLiRjb250ZW50XSwxMCk7IWlzTmFOKGUpJiZlPj0wJiYodGhpc1thLiRjb250ZW50XT1lKX19Y2xhc3MgbnQgZXh0ZW5kcyBpLkNvbnRlbnRPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicmVsZXZhbnQiKX1bYS4kZmluYWxpemVdKCl7dGhpc1thLiRjb250ZW50XT10aGlzW2EuJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLyl9fWNsYXNzIGF0IGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInJlbmFtZSIpfVthLiRmaW5hbGl6ZV0oKXt0aGlzW2EuJGNvbnRlbnRdPXRoaXNbYS4kY29udGVudF0udHJpbSgpLCh0aGlzW2EuJGNvbnRlbnRdLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgieG1sIil8fG5ldyBSZWdFeHAoIltcXHB7TH1fXVtcXHB7TH1cXGQuX1xccHtNfS1dKiIsInUiKS50ZXN0KHRoaXNbYS4kY29udGVudF0pKSYmKDAsby53YXJuKSgiWEZBIC0gUmVuYW1lOiBpbnZhbGlkIFhGQSBuYW1lIil9fWNsYXNzIGl0IGV4dGVuZHMgaS5PcHRpb25PYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywicmVuZGVyUG9saWN5IixbInNlcnZlciIsImNsaWVudCJdKX19Y2xhc3Mgc3QgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJydW5TY3JpcHRzIixbImJvdGgiLCJjbGllbnQiLCJub25lIiwic2VydmVyIl0pfX1jbGFzcyBvdCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInNjcmlwdCIsITApLHRoaXMuY3VycmVudFBhZ2U9bnVsbCx0aGlzLmV4Y2x1ZGU9bnVsbCx0aGlzLnJ1blNjcmlwdHM9bnVsbH19Y2xhc3MgY3QgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJzY3JpcHRNb2RlbCIsWyJYRkEiLCJub25lIl0pfX1jbGFzcyBsdCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInNldmVyaXR5IixbImlnbm9yZSIsImVycm9yIiwiaW5mb3JtYXRpb24iLCJ0cmFjZSIsIndhcm5pbmciXSl9fWNsYXNzIGh0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic2lsZW50UHJpbnQiLCEwKSx0aGlzLmFkZFNpbGVudFByaW50PW51bGwsdGhpcy5wcmludGVyTmFtZT1udWxsfX1jbGFzcyB1dCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN0YXBsZSIpLHRoaXMubW9kZT0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5tb2RlLFsidXNlUHJpbnRlclNldHRpbmciLCJvbiIsIm9mZiJdKX19Y2xhc3MgZHQgZXh0ZW5kcyBpLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJzdGFydE5vZGUiKX19Y2xhc3MgZnQgZXh0ZW5kcyBpLkludGVnZXJPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic3RhcnRQYWdlIiwwLChlPT4hMCkpfX1jbGFzcyBndCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN1Ym1pdEZvcm1hdCIsWyJodG1sIiwiZGVsZWdhdGUiLCJmZGYiLCJ4bWwiLCJwZGYiXSl9fWNsYXNzIHB0IGV4dGVuZHMgaS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic3VibWl0VXJsIil9fWNsYXNzIG10IGV4dGVuZHMgaS5JbnRlZ2VyT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInN1YnNldEJlbG93IiwxMDAsKGU9PmU+PTAmJmU8PTEwMCkpfX1jbGFzcyBidCBleHRlbmRzIGkuT3B0aW9uMDF7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywic3VwcHJlc3NCYW5uZXIiKX19Y2xhc3MgeXQgZXh0ZW5kcyBpLk9wdGlvbjAxe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRhZ2dlZCIpfX1jbGFzcyB3dCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRlbXBsYXRlIiwhMCksdGhpcy5iYXNlPW51bGwsdGhpcy5yZWxldmFudD1udWxsLHRoaXMuc3RhcnRQYWdlPW51bGwsdGhpcy51cmk9bnVsbCx0aGlzLnhzbD1udWxsfX1jbGFzcyB2dCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRocmVzaG9sZCIsWyJ0cmFjZSIsImVycm9yIiwiaW5mb3JtYXRpb24iLCJ3YXJuaW5nIl0pfX1jbGFzcyB4dCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInRvIixbIm51bGwiLCJtZW1vcnkiLCJzdGRlcnIiLCJzdGRvdXQiLCJzeXN0ZW0iLCJ1cmkiXSl9fWNsYXNzIFN0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidGVtcGxhdGVDYWNoZSIpLHRoaXMubWF4RW50cmllcz0oMCxzLmdldEludGVnZXIpKHtkYXRhOmUubWF4RW50cmllcyxkZWZhdWx0VmFsdWU6NSx2YWxpZGF0ZTplPT5lPj0wfSl9fWNsYXNzIEF0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidHJhY2UiLCEwKSx0aGlzLmFyZWE9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIGt0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywidHJhbnNmb3JtIiwhMCksdGhpcy5ncm91cFBhcmVudD1udWxsLHRoaXMuaWZFbXB0eT1udWxsLHRoaXMubmFtZUF0dHI9bnVsbCx0aGlzLnBpY3R1cmU9bnVsbCx0aGlzLnByZXNlbmNlPW51bGwsdGhpcy5yZW5hbWU9bnVsbCx0aGlzLndoaXRlc3BhY2U9bnVsbH19Y2xhc3MgQ3QgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ0eXBlIixbIm5vbmUiLCJhc2NpaTg1IiwiYXNjaWlIZXgiLCJjY2l0dGZheCIsImZsYXRlIiwibHp3IiwicnVuTGVuZ3RoIiwibmF0aXZlIiwieGRwIiwibWVyZ2VkWERQIl0pfX1jbGFzcyBPdCBleHRlbmRzIGkuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInVyaSIpfX1jbGFzcyBGdCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInZhbGlkYXRlIixbInByZVN1Ym1pdCIsInByZVByaW50IiwicHJlRXhlY3V0ZSIsInByZVNhdmUiXSl9fWNsYXNzIEl0IGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIil9W2EuJGZpbmFsaXplXSgpe3RoaXNbYS4kY29udGVudF09dGhpc1thLiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcigoZT0+WyJkb2NSZWFkeSIsInBvc3RTaWduIl0uaW5jbHVkZXMoZSkpKX19Y2xhc3MgVHQgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ2YWxpZGF0aW9uTWVzc2FnaW5nIixbImFsbE1lc3NhZ2VzSW5kaXZpZHVhbGx5IiwiYWxsTWVzc2FnZXNUb2dldGhlciIsImZpcnN0TWVzc2FnZU9ubHkiLCJub01lc3NhZ2VzIl0pfX1jbGFzcyBNdCBleHRlbmRzIGkuT3B0aW9uT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsInZlcnNpb24iLFsiMS43IiwiMS42IiwiMS41IiwiMS40IiwiMS4zIiwiMS4yIl0pfX1jbGFzcyBFdCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIlZlcnNpb25Db250cm9sIiksdGhpcy5vdXRwdXRCZWxvdz0oMCxzLmdldFN0cmluZ09wdGlvbikoZS5vdXRwdXRCZWxvdyxbIndhcm4iLCJlcnJvciIsInVwZGF0ZSJdKSx0aGlzLnNvdXJjZUFib3ZlPSgwLHMuZ2V0U3RyaW5nT3B0aW9uKShlLnNvdXJjZUFib3ZlLFsid2FybiIsImVycm9yIl0pLHRoaXMuc291cmNlQmVsb3c9KDAscy5nZXRTdHJpbmdPcHRpb24pKGUuc291cmNlQmVsb3csWyJ1cGRhdGUiLCJtYWludGFpbiJdKX19Y2xhc3MgUHQgZXh0ZW5kcyBpLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ2aWV3ZXJQcmVmZXJlbmNlcyIsITApLHRoaXMuQURCRV9KU0NvbnNvbGU9bnVsbCx0aGlzLkFEQkVfSlNEZWJ1Z2dlcj1udWxsLHRoaXMuYWRkVmlld2VyUHJlZmVyZW5jZXM9bnVsbCx0aGlzLmR1cGxleE9wdGlvbj1udWxsLHRoaXMuZW5mb3JjZT1udWxsLHRoaXMubnVtYmVyT2ZDb3BpZXM9bnVsbCx0aGlzLnBhZ2VSYW5nZT1udWxsLHRoaXMucGlja1RyYXlCeVBERlNpemU9bnVsbCx0aGlzLnByaW50U2NhbGluZz1udWxsfX1jbGFzcyBSdCBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIndlYkNsaWVudCIsITApLHRoaXMubmFtZT1lLm5hbWU/ZS5uYW1lLnRyaW0oKToiIix0aGlzLmZvbnRJbmZvPW51bGwsdGhpcy54ZGM9bnVsbH19Y2xhc3MgTnQgZXh0ZW5kcyBpLk9wdGlvbk9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihjLCJ3aGl0ZXNwYWNlIixbInByZXNlcnZlIiwibHRyaW0iLCJub3JtYWxpemUiLCJydHJpbSIsInRyaW0iXSl9fWNsYXNzIER0IGV4dGVuZHMgaS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGMsIndpbmRvdyIpfVthLiRmaW5hbGl6ZV0oKXtjb25zdCBlPXRoaXNbYS4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccyosXHMqLywyKS5tYXAoKGU9PnBhcnNlSW50KGUsMTApKSk7ZS5zb21lKChlPT5pc05hTihlKSkpP3RoaXNbYS4kY29udGVudF09WzAsMF06KDE9PT1lLmxlbmd0aCYmZS5wdXNoKGVbMF0pLHRoaXNbYS4kY29udGVudF09ZSl9fWNsYXNzIEJ0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywieGRjIiwhMCksdGhpcy51cmk9bmV3IGkuWEZBT2JqZWN0QXJyYXksdGhpcy54c2w9bmV3IGkuWEZBT2JqZWN0QXJyYXl9fWNsYXNzIEx0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywieGRwIiwhMCksdGhpcy5wYWNrZXRzPW51bGx9fWNsYXNzIF90IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywieHNsIiwhMCksdGhpcy5kZWJ1Zz1udWxsLHRoaXMudXJpPW51bGx9fWNsYXNzIGp0IGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoYywienBsIiwhMCksdGhpcy5uYW1lPWUubmFtZT9lLm5hbWUudHJpbSgpOiIiLHRoaXMuYmF0Y2hPdXRwdXQ9bnVsbCx0aGlzLmZsaXBMYWJlbD1udWxsLHRoaXMuZm9udEluZm89bnVsbCx0aGlzLnhkYz1udWxsfX1jbGFzcyBVdHtzdGF0aWNbbi4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoVXQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuIFV0W2VdKHQpfXN0YXRpYyBhY3JvYmF0KGUpe3JldHVybiBuZXcgbChlKX1zdGF0aWMgYWNyb2JhdDcoZSl7cmV0dXJuIG5ldyBoKGUpfXN0YXRpYyBBREJFX0pTQ29uc29sZShlKXtyZXR1cm4gbmV3IHUoZSl9c3RhdGljIEFEQkVfSlNEZWJ1Z2dlcihlKXtyZXR1cm4gbmV3IGQoZSl9c3RhdGljIGFkZFNpbGVudFByaW50KGUpe3JldHVybiBuZXcgZihlKX1zdGF0aWMgYWRkVmlld2VyUHJlZmVyZW5jZXMoZSl7cmV0dXJuIG5ldyBnKGUpfXN0YXRpYyBhZGp1c3REYXRhKGUpe3JldHVybiBuZXcgcChlKX1zdGF0aWMgYWRvYmVFeHRlbnNpb25MZXZlbChlKXtyZXR1cm4gbmV3IG0oZSl9c3RhdGljIGFnZW50KGUpe3JldHVybiBuZXcgYihlKX1zdGF0aWMgYWx3YXlzRW1iZWQoZSl7cmV0dXJuIG5ldyB5KGUpfXN0YXRpYyBhbWQoZSl7cmV0dXJuIG5ldyB3KGUpfXN0YXRpYyBhcmVhKGUpe3JldHVybiBuZXcgdihlKX1zdGF0aWMgYXR0cmlidXRlcyhlKXtyZXR1cm4gbmV3IHgoZSl9c3RhdGljIGF1dG9TYXZlKGUpe3JldHVybiBuZXcgUyhlKX1zdGF0aWMgYmFzZShlKXtyZXR1cm4gbmV3IEEoZSl9c3RhdGljIGJhdGNoT3V0cHV0KGUpe3JldHVybiBuZXcgayhlKX1zdGF0aWMgYmVoYXZpb3JPdmVycmlkZShlKXtyZXR1cm4gbmV3IEMoZSl9c3RhdGljIGNhY2hlKGUpe3JldHVybiBuZXcgTyhlKX1zdGF0aWMgY2hhbmdlKGUpe3JldHVybiBuZXcgRihlKX1zdGF0aWMgY29tbW9uKGUpe3JldHVybiBuZXcgSShlKX1zdGF0aWMgY29tcHJlc3MoZSl7cmV0dXJuIG5ldyBUKGUpfXN0YXRpYyBjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUoZSl7cmV0dXJuIG5ldyBNKGUpfXN0YXRpYyBjb21wcmVzc09iamVjdFN0cmVhbShlKXtyZXR1cm4gbmV3IEUoZSl9c3RhdGljIGNvbXByZXNzaW9uKGUpe3JldHVybiBuZXcgUChlKX1zdGF0aWMgY29uZmlnKGUpe3JldHVybiBuZXcgUihlKX1zdGF0aWMgY29uZm9ybWFuY2UoZSl7cmV0dXJuIG5ldyBOKGUpfXN0YXRpYyBjb250ZW50Q29weShlKXtyZXR1cm4gbmV3IEQoZSl9c3RhdGljIGNvcGllcyhlKXtyZXR1cm4gbmV3IEIoZSl9c3RhdGljIGNyZWF0b3IoZSl7cmV0dXJuIG5ldyBMKGUpfXN0YXRpYyBjdXJyZW50UGFnZShlKXtyZXR1cm4gbmV3IF8oZSl9c3RhdGljIGRhdGEoZSl7cmV0dXJuIG5ldyBqKGUpfXN0YXRpYyBkZWJ1ZyhlKXtyZXR1cm4gbmV3IFUoZSl9c3RhdGljIGRlZmF1bHRUeXBlZmFjZShlKXtyZXR1cm4gbmV3ICQoZSl9c3RhdGljIGRlc3RpbmF0aW9uKGUpe3JldHVybiBuZXcgWChlKX1zdGF0aWMgZG9jdW1lbnRBc3NlbWJseShlKXtyZXR1cm4gbmV3IEgoZSl9c3RhdGljIGRyaXZlcihlKXtyZXR1cm4gbmV3IHEoZSl9c3RhdGljIGR1cGxleE9wdGlvbihlKXtyZXR1cm4gbmV3IHooZSl9c3RhdGljIGR5bmFtaWNSZW5kZXIoZSl7cmV0dXJuIG5ldyBHKGUpfXN0YXRpYyBlbWJlZChlKXtyZXR1cm4gbmV3IFcoZSl9c3RhdGljIGVuY3J5cHQoZSl7cmV0dXJuIG5ldyBWKGUpfXN0YXRpYyBlbmNyeXB0aW9uKGUpe3JldHVybiBuZXcgSyhlKX1zdGF0aWMgZW5jcnlwdGlvbkxldmVsKGUpe3JldHVybiBuZXcgWShlKX1zdGF0aWMgZW5mb3JjZShlKXtyZXR1cm4gbmV3IEooZSl9c3RhdGljIGVxdWF0ZShlKXtyZXR1cm4gbmV3IFooZSl9c3RhdGljIGVxdWF0ZVJhbmdlKGUpe3JldHVybiBuZXcgUShlKX1zdGF0aWMgZXhjbHVkZShlKXtyZXR1cm4gbmV3IGVlKGUpfXN0YXRpYyBleGNsdWRlTlMoZSl7cmV0dXJuIG5ldyB0ZShlKX1zdGF0aWMgZmxpcExhYmVsKGUpe3JldHVybiBuZXcgcmUoZSl9c3RhdGljIGZvbnRJbmZvKGUpe3JldHVybiBuZXcgbmUoZSl9c3RhdGljIGZvcm1GaWVsZEZpbGxpbmcoZSl7cmV0dXJuIG5ldyBhZShlKX1zdGF0aWMgZ3JvdXBQYXJlbnQoZSl7cmV0dXJuIG5ldyBpZShlKX1zdGF0aWMgaWZFbXB0eShlKXtyZXR1cm4gbmV3IHNlKGUpfXN0YXRpYyBpbmNsdWRlWERQQ29udGVudChlKXtyZXR1cm4gbmV3IG9lKGUpfXN0YXRpYyBpbmNyZW1lbnRhbExvYWQoZSl7cmV0dXJuIG5ldyBjZShlKX1zdGF0aWMgaW5jcmVtZW50YWxNZXJnZShlKXtyZXR1cm4gbmV3IGxlKGUpfXN0YXRpYyBpbnRlcmFjdGl2ZShlKXtyZXR1cm4gbmV3IGhlKGUpfXN0YXRpYyBqb2coZSl7cmV0dXJuIG5ldyB1ZShlKX1zdGF0aWMgbGFiZWxQcmludGVyKGUpe3JldHVybiBuZXcgZGUoZSl9c3RhdGljIGxheW91dChlKXtyZXR1cm4gbmV3IGZlKGUpfXN0YXRpYyBsZXZlbChlKXtyZXR1cm4gbmV3IGdlKGUpfXN0YXRpYyBsaW5lYXJpemVkKGUpe3JldHVybiBuZXcgcGUoZSl9c3RhdGljIGxvY2FsZShlKXtyZXR1cm4gbmV3IG1lKGUpfXN0YXRpYyBsb2NhbGVTZXQoZSl7cmV0dXJuIG5ldyBiZShlKX1zdGF0aWMgbG9nKGUpe3JldHVybiBuZXcgeWUoZSl9c3RhdGljIG1hcChlKXtyZXR1cm4gbmV3IHdlKGUpfXN0YXRpYyBtZWRpdW1JbmZvKGUpe3JldHVybiBuZXcgdmUoZSl9c3RhdGljIG1lc3NhZ2UoZSl7cmV0dXJuIG5ldyB4ZShlKX1zdGF0aWMgbWVzc2FnaW5nKGUpe3JldHVybiBuZXcgU2UoZSl9c3RhdGljIG1vZGUoZSl7cmV0dXJuIG5ldyBBZShlKX1zdGF0aWMgbW9kaWZ5QW5ub3RzKGUpe3JldHVybiBuZXcga2UoZSl9c3RhdGljIG1zZ0lkKGUpe3JldHVybiBuZXcgQ2UoZSl9c3RhdGljIG5hbWVBdHRyKGUpe3JldHVybiBuZXcgT2UoZSl9c3RhdGljIG5ldmVyRW1iZWQoZSl7cmV0dXJuIG5ldyBGZShlKX1zdGF0aWMgbnVtYmVyT2ZDb3BpZXMoZSl7cmV0dXJuIG5ldyBJZShlKX1zdGF0aWMgb3BlbkFjdGlvbihlKXtyZXR1cm4gbmV3IFRlKGUpfXN0YXRpYyBvdXRwdXQoZSl7cmV0dXJuIG5ldyBNZShlKX1zdGF0aWMgb3V0cHV0QmluKGUpe3JldHVybiBuZXcgRWUoZSl9c3RhdGljIG91dHB1dFhTTChlKXtyZXR1cm4gbmV3IFBlKGUpfXN0YXRpYyBvdmVycHJpbnQoZSl7cmV0dXJuIG5ldyBSZShlKX1zdGF0aWMgcGFja2V0cyhlKXtyZXR1cm4gbmV3IE5lKGUpfXN0YXRpYyBwYWdlT2Zmc2V0KGUpe3JldHVybiBuZXcgRGUoZSl9c3RhdGljIHBhZ2VSYW5nZShlKXtyZXR1cm4gbmV3IEJlKGUpfXN0YXRpYyBwYWdpbmF0aW9uKGUpe3JldHVybiBuZXcgTGUoZSl9c3RhdGljIHBhZ2luYXRpb25PdmVycmlkZShlKXtyZXR1cm4gbmV3IF9lKGUpfXN0YXRpYyBwYXJ0KGUpe3JldHVybiBuZXcgamUoZSl9c3RhdGljIHBjbChlKXtyZXR1cm4gbmV3IFVlKGUpfXN0YXRpYyBwZGYoZSl7cmV0dXJuIG5ldyAkZShlKX1zdGF0aWMgcGRmYShlKXtyZXR1cm4gbmV3IFhlKGUpfXN0YXRpYyBwZXJtaXNzaW9ucyhlKXtyZXR1cm4gbmV3IEhlKGUpfXN0YXRpYyBwaWNrVHJheUJ5UERGU2l6ZShlKXtyZXR1cm4gbmV3IHFlKGUpfXN0YXRpYyBwaWN0dXJlKGUpe3JldHVybiBuZXcgemUoZSl9c3RhdGljIHBsYWludGV4dE1ldGFkYXRhKGUpe3JldHVybiBuZXcgR2UoZSl9c3RhdGljIHByZXNlbmNlKGUpe3JldHVybiBuZXcgV2UoZSl9c3RhdGljIHByZXNlbnQoZSl7cmV0dXJuIG5ldyBWZShlKX1zdGF0aWMgcHJpbnQoZSl7cmV0dXJuIG5ldyBLZShlKX1zdGF0aWMgcHJpbnRIaWdoUXVhbGl0eShlKXtyZXR1cm4gbmV3IFllKGUpfXN0YXRpYyBwcmludFNjYWxpbmcoZSl7cmV0dXJuIG5ldyBKZShlKX1zdGF0aWMgcHJpbnRlck5hbWUoZSl7cmV0dXJuIG5ldyBaZShlKX1zdGF0aWMgcHJvZHVjZXIoZSl7cmV0dXJuIG5ldyBRZShlKX1zdGF0aWMgcHMoZSl7cmV0dXJuIG5ldyBldChlKX1zdGF0aWMgcmFuZ2UoZSl7cmV0dXJuIG5ldyB0dChlKX1zdGF0aWMgcmVjb3JkKGUpe3JldHVybiBuZXcgcnQoZSl9c3RhdGljIHJlbGV2YW50KGUpe3JldHVybiBuZXcgbnQoZSl9c3RhdGljIHJlbmFtZShlKXtyZXR1cm4gbmV3IGF0KGUpfXN0YXRpYyByZW5kZXJQb2xpY3koZSl7cmV0dXJuIG5ldyBpdChlKX1zdGF0aWMgcnVuU2NyaXB0cyhlKXtyZXR1cm4gbmV3IHN0KGUpfXN0YXRpYyBzY3JpcHQoZSl7cmV0dXJuIG5ldyBvdChlKX1zdGF0aWMgc2NyaXB0TW9kZWwoZSl7cmV0dXJuIG5ldyBjdChlKX1zdGF0aWMgc2V2ZXJpdHkoZSl7cmV0dXJuIG5ldyBsdChlKX1zdGF0aWMgc2lsZW50UHJpbnQoZSl7cmV0dXJuIG5ldyBodChlKX1zdGF0aWMgc3RhcGxlKGUpe3JldHVybiBuZXcgdXQoZSl9c3RhdGljIHN0YXJ0Tm9kZShlKXtyZXR1cm4gbmV3IGR0KGUpfXN0YXRpYyBzdGFydFBhZ2UoZSl7cmV0dXJuIG5ldyBmdChlKX1zdGF0aWMgc3VibWl0Rm9ybWF0KGUpe3JldHVybiBuZXcgZ3QoZSl9c3RhdGljIHN1Ym1pdFVybChlKXtyZXR1cm4gbmV3IHB0KGUpfXN0YXRpYyBzdWJzZXRCZWxvdyhlKXtyZXR1cm4gbmV3IG10KGUpfXN0YXRpYyBzdXBwcmVzc0Jhbm5lcihlKXtyZXR1cm4gbmV3IGJ0KGUpfXN0YXRpYyB0YWdnZWQoZSl7cmV0dXJuIG5ldyB5dChlKX1zdGF0aWMgdGVtcGxhdGUoZSl7cmV0dXJuIG5ldyB3dChlKX1zdGF0aWMgdGVtcGxhdGVDYWNoZShlKXtyZXR1cm4gbmV3IFN0KGUpfXN0YXRpYyB0aHJlc2hvbGQoZSl7cmV0dXJuIG5ldyB2dChlKX1zdGF0aWMgdG8oZSl7cmV0dXJuIG5ldyB4dChlKX1zdGF0aWMgdHJhY2UoZSl7cmV0dXJuIG5ldyBBdChlKX1zdGF0aWMgdHJhbnNmb3JtKGUpe3JldHVybiBuZXcga3QoZSl9c3RhdGljIHR5cGUoZSl7cmV0dXJuIG5ldyBDdChlKX1zdGF0aWMgdXJpKGUpe3JldHVybiBuZXcgT3QoZSl9c3RhdGljIHZhbGlkYXRlKGUpe3JldHVybiBuZXcgRnQoZSl9c3RhdGljIHZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzKGUpe3JldHVybiBuZXcgSXQoZSl9c3RhdGljIHZhbGlkYXRpb25NZXNzYWdpbmcoZSl7cmV0dXJuIG5ldyBUdChlKX1zdGF0aWMgdmVyc2lvbihlKXtyZXR1cm4gbmV3IE10KGUpfXN0YXRpYyB2ZXJzaW9uQ29udHJvbChlKXtyZXR1cm4gbmV3IEV0KGUpfXN0YXRpYyB2aWV3ZXJQcmVmZXJlbmNlcyhlKXtyZXR1cm4gbmV3IFB0KGUpfXN0YXRpYyB3ZWJDbGllbnQoZSl7cmV0dXJuIG5ldyBSdChlKX1zdGF0aWMgd2hpdGVzcGFjZShlKXtyZXR1cm4gbmV3IE50KGUpfXN0YXRpYyB3aW5kb3coZSl7cmV0dXJuIG5ldyBEdChlKX1zdGF0aWMgeGRjKGUpe3JldHVybiBuZXcgQnQoZSl9c3RhdGljIHhkcChlKXtyZXR1cm4gbmV3IEx0KGUpfXN0YXRpYyB4c2woZSl7cmV0dXJuIG5ldyBfdChlKX1zdGF0aWMgenBsKGUpe3JldHVybiBuZXcganQoZSl9fXQuQ29uZmlnTmFtZXNwYWNlPVV0fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuQ29ubmVjdGlvblNldE5hbWVzcGFjZT12b2lkIDA7dmFyIG49cigyMzQpLGE9cigyNDApO2NvbnN0IGk9bi5OYW1lc3BhY2VJZHMuY29ubmVjdGlvblNldC5pZDtjbGFzcyBzIGV4dGVuZHMgYS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoaSwiY29ubmVjdGlvblNldCIsITApLHRoaXMud3NkbENvbm5lY3Rpb249bmV3IGEuWEZBT2JqZWN0QXJyYXksdGhpcy54bWxDb25uZWN0aW9uPW5ldyBhLlhGQU9iamVjdEFycmF5LHRoaXMueHNkQ29ubmVjdGlvbj1uZXcgYS5YRkFPYmplY3RBcnJheX19Y2xhc3MgbyBleHRlbmRzIGEuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksImVmZmVjdGl2ZUlucHV0UG9saWN5IiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIGMgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJlZmZlY3RpdmVPdXRwdXRQb2xpY3kiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgbCBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksIm9wZXJhdGlvbiIpLHRoaXMuaWQ9ZS5pZHx8IiIsdGhpcy5pbnB1dD1lLmlucHV0fHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLm91dHB1dD1lLm91dHB1dHx8IiIsdGhpcy51c2U9ZS51c2V8fCIiLHRoaXMudXNlaHJlZj1lLnVzZWhyZWZ8fCIifX1jbGFzcyBoIGV4dGVuZHMgYS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoaSwicm9vdEVsZW1lbnQiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgdSBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInNvYXBBY3Rpb24iKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgZCBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInNvYXBBZGRyZXNzIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIGYgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ1cmkiKSx0aGlzLmlkPWUuaWR8fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXNlPWUudXNlfHwiIix0aGlzLnVzZWhyZWY9ZS51c2VocmVmfHwiIn19Y2xhc3MgZyBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksIndzZGxBZGRyZXNzIiksdGhpcy5pZD1lLmlkfHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLnVzZT1lLnVzZXx8IiIsdGhpcy51c2VocmVmPWUudXNlaHJlZnx8IiJ9fWNsYXNzIHAgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ3c2RsQ29ubmVjdGlvbiIsITApLHRoaXMuZGF0YURlc2NyaXB0aW9uPWUuZGF0YURlc2NyaXB0aW9ufHwiIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLmVmZmVjdGl2ZUlucHV0UG9saWN5PW51bGwsdGhpcy5lZmZlY3RpdmVPdXRwdXRQb2xpY3k9bnVsbCx0aGlzLm9wZXJhdGlvbj1udWxsLHRoaXMuc29hcEFjdGlvbj1udWxsLHRoaXMuc29hcEFkZHJlc3M9bnVsbCx0aGlzLndzZGxBZGRyZXNzPW51bGx9fWNsYXNzIG0gZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ4bWxDb25uZWN0aW9uIiwhMCksdGhpcy5kYXRhRGVzY3JpcHRpb249ZS5kYXRhRGVzY3JpcHRpb258fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMudXJpPW51bGx9fWNsYXNzIGIgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJ4c2RDb25uZWN0aW9uIiwhMCksdGhpcy5kYXRhRGVzY3JpcHRpb249ZS5kYXRhRGVzY3JpcHRpb258fCIiLHRoaXMubmFtZT1lLm5hbWV8fCIiLHRoaXMucm9vdEVsZW1lbnQ9bnVsbCx0aGlzLnVyaT1udWxsfX1jbGFzcyB5e3N0YXRpY1tuLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZih5Lmhhc093blByb3BlcnR5KGUpKXJldHVybiB5W2VdKHQpfXN0YXRpYyBjb25uZWN0aW9uU2V0KGUpe3JldHVybiBuZXcgcyhlKX1zdGF0aWMgZWZmZWN0aXZlSW5wdXRQb2xpY3koZSl7cmV0dXJuIG5ldyBvKGUpfXN0YXRpYyBlZmZlY3RpdmVPdXRwdXRQb2xpY3koZSl7cmV0dXJuIG5ldyBjKGUpfXN0YXRpYyBvcGVyYXRpb24oZSl7cmV0dXJuIG5ldyBsKGUpfXN0YXRpYyByb290RWxlbWVudChlKXtyZXR1cm4gbmV3IGgoZSl9c3RhdGljIHNvYXBBY3Rpb24oZSl7cmV0dXJuIG5ldyB1KGUpfXN0YXRpYyBzb2FwQWRkcmVzcyhlKXtyZXR1cm4gbmV3IGQoZSl9c3RhdGljIHVyaShlKXtyZXR1cm4gbmV3IGYoZSl9c3RhdGljIHdzZGxBZGRyZXNzKGUpe3JldHVybiBuZXcgZyhlKX1zdGF0aWMgd3NkbENvbm5lY3Rpb24oZSl7cmV0dXJuIG5ldyBwKGUpfXN0YXRpYyB4bWxDb25uZWN0aW9uKGUpe3JldHVybiBuZXcgbShlKX1zdGF0aWMgeHNkQ29ubmVjdGlvbihlKXtyZXR1cm4gbmV3IGIoZSl9fXQuQ29ubmVjdGlvblNldE5hbWVzcGFjZT15fSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRGF0YXNldHNOYW1lc3BhY2U9dm9pZCAwO3ZhciBuPXIoMjI4KSxhPXIoMjM0KSxpPXIoMjQwKTtjb25zdCBzPWEuTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkO2NsYXNzIG8gZXh0ZW5kcyBpLlhtbE9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJkYXRhIixlKX1bbi4kaXNOc0Fnbm9zdGljXSgpe3JldHVybiEwfX1jbGFzcyBjIGV4dGVuZHMgaS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF0YXNldHMiLCEwKSx0aGlzLmRhdGE9bnVsbCx0aGlzLlNpZ25hdHVyZT1udWxsfVtuLiRvbkNoaWxkXShlKXtjb25zdCB0PWVbbi4kbm9kZU5hbWVdOygiZGF0YSI9PT10JiZlW24uJG5hbWVzcGFjZUlkXT09PXN8fCJTaWduYXR1cmUiPT09dCYmZVtuLiRuYW1lc3BhY2VJZF09PT1hLk5hbWVzcGFjZUlkcy5zaWduYXR1cmUuaWQpJiYodGhpc1t0XT1lKSx0aGlzW24uJGFwcGVuZENoaWxkXShlKX19Y2xhc3MgbHtzdGF0aWNbYS4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYobC5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gbFtlXSh0KX1zdGF0aWMgZGF0YXNldHMoZSl7cmV0dXJuIG5ldyBjKGUpfXN0YXRpYyBkYXRhKGUpe3JldHVybiBuZXcgbyhlKX19dC5EYXRhc2V0c05hbWVzcGFjZT1sfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuTG9jYWxlU2V0TmFtZXNwYWNlPXZvaWQgMDt2YXIgbj1yKDIzNCksYT1yKDI0MCksaT1yKDIzNyk7Y29uc3Qgcz1uLk5hbWVzcGFjZUlkcy5sb2NhbGVTZXQuaWQ7Y2xhc3MgbyBleHRlbmRzIGEuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsImNhbGVuZGFyU3ltYm9scyIsITApLHRoaXMubmFtZT0iZ3JlZ29yaWFuIix0aGlzLmRheU5hbWVzPW5ldyBhLlhGQU9iamVjdEFycmF5KDIpLHRoaXMuZXJhTmFtZXM9bnVsbCx0aGlzLm1lcmlkaWVtTmFtZXM9bnVsbCx0aGlzLm1vbnRoTmFtZXM9bmV3IGEuWEZBT2JqZWN0QXJyYXkoMil9fWNsYXNzIGMgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJjdXJyZW5jeVN5bWJvbCIpLHRoaXMubmFtZT0oMCxpLmdldFN0cmluZ09wdGlvbikoZS5uYW1lLFsic3ltYm9sIiwiaXNvbmFtZSIsImRlY2ltYWwiXSl9fWNsYXNzIGwgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJjdXJyZW5jeVN5bWJvbHMiLCEwKSx0aGlzLmN1cnJlbmN5U3ltYm9sPW5ldyBhLlhGQU9iamVjdEFycmF5KDMpfX1jbGFzcyBoIGV4dGVuZHMgYS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF0ZVBhdHRlcm4iKSx0aGlzLm5hbWU9KDAsaS5nZXRTdHJpbmdPcHRpb24pKGUubmFtZSxbImZ1bGwiLCJsb25nIiwibWVkIiwic2hvcnQiXSl9fWNsYXNzIHUgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJkYXRlUGF0dGVybnMiLCEwKSx0aGlzLmRhdGVQYXR0ZXJuPW5ldyBhLlhGQU9iamVjdEFycmF5KDQpfX1jbGFzcyBkIGV4dGVuZHMgYS5Db250ZW50T2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsImRhdGVUaW1lU3ltYm9scyIpfX1jbGFzcyBmIGV4dGVuZHMgYS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZGF5Iil9fWNsYXNzIGcgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJkYXlOYW1lcyIsITApLHRoaXMuYWJicj0oMCxpLmdldEludGVnZXIpKHtkYXRhOmUuYWJicixkZWZhdWx0VmFsdWU6MCx2YWxpZGF0ZTplPT4xPT09ZX0pLHRoaXMuZGF5PW5ldyBhLlhGQU9iamVjdEFycmF5KDcpfX1jbGFzcyBwIGV4dGVuZHMgYS5TdHJpbmdPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywiZXJhIil9fWNsYXNzIG0gZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJlcmFOYW1lcyIsITApLHRoaXMuZXJhPW5ldyBhLlhGQU9iamVjdEFycmF5KDIpfX1jbGFzcyBiIGV4dGVuZHMgYS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywibG9jYWxlIiwhMCksdGhpcy5kZXNjPWUuZGVzY3x8IiIsdGhpcy5uYW1lPSJpc29uYW1lIix0aGlzLmNhbGVuZGFyU3ltYm9scz1udWxsLHRoaXMuY3VycmVuY3lTeW1ib2xzPW51bGwsdGhpcy5kYXRlUGF0dGVybnM9bnVsbCx0aGlzLmRhdGVUaW1lU3ltYm9scz1udWxsLHRoaXMubnVtYmVyUGF0dGVybnM9bnVsbCx0aGlzLm51bWJlclN5bWJvbHM9bnVsbCx0aGlzLnRpbWVQYXR0ZXJucz1udWxsLHRoaXMudHlwZUZhY2VzPW51bGx9fWNsYXNzIHkgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJsb2NhbGVTZXQiLCEwKSx0aGlzLmxvY2FsZT1uZXcgYS5YRkFPYmplY3RBcnJheX19Y2xhc3MgdyBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsIm1lcmlkaWVtIil9fWNsYXNzIHYgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJtZXJpZGllbU5hbWVzIiwhMCksdGhpcy5tZXJpZGllbT1uZXcgYS5YRkFPYmplY3RBcnJheSgyKX19Y2xhc3MgeCBleHRlbmRzIGEuU3RyaW5nT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsIm1vbnRoIil9fWNsYXNzIFMgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJtb250aE5hbWVzIiwhMCksdGhpcy5hYmJyPSgwLGkuZ2V0SW50ZWdlcikoe2RhdGE6ZS5hYmJyLGRlZmF1bHRWYWx1ZTowLHZhbGlkYXRlOmU9PjE9PT1lfSksdGhpcy5tb250aD1uZXcgYS5YRkFPYmplY3RBcnJheSgxMil9fWNsYXNzIEEgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJudW1iZXJQYXR0ZXJuIiksdGhpcy5uYW1lPSgwLGkuZ2V0U3RyaW5nT3B0aW9uKShlLm5hbWUsWyJmdWxsIiwibG9uZyIsIm1lZCIsInNob3J0Il0pfX1jbGFzcyBrIGV4dGVuZHMgYS5YRkFPYmplY3R7Y29uc3RydWN0b3IoZSl7c3VwZXIocywibnVtYmVyUGF0dGVybnMiLCEwKSx0aGlzLm51bWJlclBhdHRlcm49bmV3IGEuWEZBT2JqZWN0QXJyYXkoNCl9fWNsYXNzIEMgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJudW1iZXJTeW1ib2wiKSx0aGlzLm5hbWU9KDAsaS5nZXRTdHJpbmdPcHRpb24pKGUubmFtZSxbImRlY2ltYWwiLCJncm91cGluZyIsInBlcmNlbnQiLCJtaW51cyIsInplcm8iXSl9fWNsYXNzIE8gZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJudW1iZXJTeW1ib2xzIiwhMCksdGhpcy5udW1iZXJTeW1ib2w9bmV3IGEuWEZBT2JqZWN0QXJyYXkoNSl9fWNsYXNzIEYgZXh0ZW5kcyBhLlN0cmluZ09iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJ0aW1lUGF0dGVybiIpLHRoaXMubmFtZT0oMCxpLmdldFN0cmluZ09wdGlvbikoZS5uYW1lLFsiZnVsbCIsImxvbmciLCJtZWQiLCJzaG9ydCJdKX19Y2xhc3MgSSBleHRlbmRzIGEuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsInRpbWVQYXR0ZXJucyIsITApLHRoaXMudGltZVBhdHRlcm49bmV3IGEuWEZBT2JqZWN0QXJyYXkoNCl9fWNsYXNzIFQgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJ0eXBlRmFjZSIsITApLHRoaXMubmFtZT0iInxlLm5hbWV9fWNsYXNzIE0gZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihzLCJ0eXBlRmFjZXMiLCEwKSx0aGlzLnR5cGVGYWNlPW5ldyBhLlhGQU9iamVjdEFycmF5fX1jbGFzcyBFe3N0YXRpY1tuLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZihFLmhhc093blByb3BlcnR5KGUpKXJldHVybiBFW2VdKHQpfXN0YXRpYyBjYWxlbmRhclN5bWJvbHMoZSl7cmV0dXJuIG5ldyBvKGUpfXN0YXRpYyBjdXJyZW5jeVN5bWJvbChlKXtyZXR1cm4gbmV3IGMoZSl9c3RhdGljIGN1cnJlbmN5U3ltYm9scyhlKXtyZXR1cm4gbmV3IGwoZSl9c3RhdGljIGRhdGVQYXR0ZXJuKGUpe3JldHVybiBuZXcgaChlKX1zdGF0aWMgZGF0ZVBhdHRlcm5zKGUpe3JldHVybiBuZXcgdShlKX1zdGF0aWMgZGF0ZVRpbWVTeW1ib2xzKGUpe3JldHVybiBuZXcgZChlKX1zdGF0aWMgZGF5KGUpe3JldHVybiBuZXcgZihlKX1zdGF0aWMgZGF5TmFtZXMoZSl7cmV0dXJuIG5ldyBnKGUpfXN0YXRpYyBlcmEoZSl7cmV0dXJuIG5ldyBwKGUpfXN0YXRpYyBlcmFOYW1lcyhlKXtyZXR1cm4gbmV3IG0oZSl9c3RhdGljIGxvY2FsZShlKXtyZXR1cm4gbmV3IGIoZSl9c3RhdGljIGxvY2FsZVNldChlKXtyZXR1cm4gbmV3IHkoZSl9c3RhdGljIG1lcmlkaWVtKGUpe3JldHVybiBuZXcgdyhlKX1zdGF0aWMgbWVyaWRpZW1OYW1lcyhlKXtyZXR1cm4gbmV3IHYoZSl9c3RhdGljIG1vbnRoKGUpe3JldHVybiBuZXcgeChlKX1zdGF0aWMgbW9udGhOYW1lcyhlKXtyZXR1cm4gbmV3IFMoZSl9c3RhdGljIG51bWJlclBhdHRlcm4oZSl7cmV0dXJuIG5ldyBBKGUpfXN0YXRpYyBudW1iZXJQYXR0ZXJucyhlKXtyZXR1cm4gbmV3IGsoZSl9c3RhdGljIG51bWJlclN5bWJvbChlKXtyZXR1cm4gbmV3IEMoZSl9c3RhdGljIG51bWJlclN5bWJvbHMoZSl7cmV0dXJuIG5ldyBPKGUpfXN0YXRpYyB0aW1lUGF0dGVybihlKXtyZXR1cm4gbmV3IEYoZSl9c3RhdGljIHRpbWVQYXR0ZXJucyhlKXtyZXR1cm4gbmV3IEkoZSl9c3RhdGljIHR5cGVGYWNlKGUpe3JldHVybiBuZXcgVChlKX1zdGF0aWMgdHlwZUZhY2VzKGUpe3JldHVybiBuZXcgTShlKX19dC5Mb2NhbGVTZXROYW1lc3BhY2U9RX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlNpZ25hdHVyZU5hbWVzcGFjZT12b2lkIDA7dmFyIG49cigyMzQpLGE9cigyNDApO2NvbnN0IGk9bi5OYW1lc3BhY2VJZHMuc2lnbmF0dXJlLmlkO2NsYXNzIHMgZXh0ZW5kcyBhLlhGQU9iamVjdHtjb25zdHJ1Y3RvcihlKXtzdXBlcihpLCJzaWduYXR1cmUiLCEwKX19Y2xhc3Mgb3tzdGF0aWNbbi4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoby5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gb1tlXSh0KX1zdGF0aWMgc2lnbmF0dXJlKGUpe3JldHVybiBuZXcgcyhlKX19dC5TaWduYXR1cmVOYW1lc3BhY2U9b30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlN0eWxlc2hlZXROYW1lc3BhY2U9dm9pZCAwO3ZhciBuPXIoMjM0KSxhPXIoMjQwKTtjb25zdCBpPW4uTmFtZXNwYWNlSWRzLnN0eWxlc2hlZXQuaWQ7Y2xhc3MgcyBleHRlbmRzIGEuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKGksInN0eWxlc2hlZXQiLCEwKX19Y2xhc3Mgb3tzdGF0aWNbbi4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoby5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gb1tlXSh0KX1zdGF0aWMgc3R5bGVzaGVldChlKXtyZXR1cm4gbmV3IHMoZSl9fXQuU3R5bGVzaGVldE5hbWVzcGFjZT1vfSwoZSx0LHIpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWGRwTmFtZXNwYWNlPXZvaWQgMDt2YXIgbj1yKDIzNCksYT1yKDIyOCksaT1yKDI0MCk7Y29uc3Qgcz1uLk5hbWVzcGFjZUlkcy54ZHAuaWQ7Y2xhc3MgbyBleHRlbmRzIGkuWEZBT2JqZWN0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKHMsInhkcCIsITApLHRoaXMudXVpZD1lLnV1aWR8fCIiLHRoaXMudGltZVN0YW1wPWUudGltZVN0YW1wfHwiIix0aGlzLmNvbmZpZz1udWxsLHRoaXMuY29ubmVjdGlvblNldD1udWxsLHRoaXMuZGF0YXNldHM9bnVsbCx0aGlzLmxvY2FsZVNldD1udWxsLHRoaXMuc3R5bGVzaGVldD1uZXcgaS5YRkFPYmplY3RBcnJheSx0aGlzLnRlbXBsYXRlPW51bGx9W2EuJG9uQ2hpbGRDaGVja10oZSl7Y29uc3QgdD1uLk5hbWVzcGFjZUlkc1tlW2EuJG5vZGVOYW1lXV07cmV0dXJuIHQmJmVbYS4kbmFtZXNwYWNlSWRdPT09dC5pZH19Y2xhc3MgY3tzdGF0aWNbbi4kYnVpbGRYRkFPYmplY3RdKGUsdCl7aWYoYy5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gY1tlXSh0KX1zdGF0aWMgeGRwKGUpe3JldHVybiBuZXcgbyhlKX19dC5YZHBOYW1lc3BhY2U9Y30sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LlhodG1sTmFtZXNwYWNlPXZvaWQgMCxyKDExNikscigxMjYpLHIoMTI4KSxyKDEzMSkscigxMzMpLHIoMTM1KSxyKDEzNyk7dmFyIG49cigyMjgpLGE9cigyMzQpLGk9cigyMzYpLHM9cigyMzcpLG89cigyNDApO2NvbnN0IGM9YS5OYW1lc3BhY2VJZHMueGh0bWwuaWQsbD1TeW1ib2woKSxoPW5ldyBTZXQoWyJjb2xvciIsImZvbnQiLCJmb250LWZhbWlseSIsImZvbnQtc2l6ZSIsImZvbnQtc3RyZXRjaCIsImZvbnQtc3R5bGUiLCJmb250LXdlaWdodCIsIm1hcmdpbiIsIm1hcmdpbi1ib3R0b20iLCJtYXJnaW4tbGVmdCIsIm1hcmdpbi1yaWdodCIsIm1hcmdpbi10b3AiLCJsZXR0ZXItc3BhY2luZyIsImxpbmUtaGVpZ2h0Iiwib3JwaGFucyIsInBhZ2UtYnJlYWstYWZ0ZXIiLCJwYWdlLWJyZWFrLWJlZm9yZSIsInBhZ2UtYnJlYWstaW5zaWRlIiwidGFiLWludGVydmFsIiwidGFiLXN0b3AiLCJ0ZXh0LWFsaWduIiwidGV4dC1kZWNvcmF0aW9uIiwidGV4dC1pbmRlbnQiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndpZG93cyIsImtlcm5pbmctbW9kZSIsInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiLCJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIsInhmYS1zcGFjZXJ1biIsInhmYS10YWItc3RvcHMiXSksdT1uZXcgTWFwKFtbInBhZ2UtYnJlYWstYWZ0ZXIiLCJicmVha0FmdGVyIl0sWyJwYWdlLWJyZWFrLWJlZm9yZSIsImJyZWFrQmVmb3JlIl0sWyJwYWdlLWJyZWFrLWluc2lkZSIsImJyZWFrSW5zaWRlIl0sWyJrZXJuaW5nLW1vZGUiLGU9PiJub25lIj09PWU/Im5vbmUiOiJub3JtYWwiXSxbInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiLGU9PiJzY2FsZVgoIi5jb25jYXQoTWF0aC5tYXgoMCxNYXRoLm1pbihwYXJzZUludChlKS8xMDApKS50b0ZpeGVkKDIpLCIpIildLFsieGZhLWZvbnQtdmVydGljYWwtc2NhbGUiLGU9PiJzY2FsZVkoIi5jb25jYXQoTWF0aC5tYXgoMCxNYXRoLm1pbihwYXJzZUludChlKS8xMDApKS50b0ZpeGVkKDIpLCIpIildLFsieGZhLXNwYWNlcnVuIiwiIl0sWyJ4ZmEtdGFiLXN0b3BzIiwiIl0sWyJmb250LXNpemUiLChlLHQpPT4oZT10LmZvbnRTaXplPSgwLHMuZ2V0TWVhc3VyZW1lbnQpKGUpLCgwLGkubWVhc3VyZVRvU3RyaW5nKSguOTkqZSkpXSxbImxldHRlci1zcGFjaW5nIixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbImxpbmUtaGVpZ2h0IixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbIm1hcmdpbiIsZT0+KDAsaS5tZWFzdXJlVG9TdHJpbmcpKCgwLHMuZ2V0TWVhc3VyZW1lbnQpKGUpKV0sWyJtYXJnaW4tYm90dG9tIixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbIm1hcmdpbi1sZWZ0IixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbIm1hcmdpbi1yaWdodCIsZT0+KDAsaS5tZWFzdXJlVG9TdHJpbmcpKCgwLHMuZ2V0TWVhc3VyZW1lbnQpKGUpKV0sWyJtYXJnaW4tdG9wIixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbInRleHQtaW5kZW50IixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXSxbImZvbnQtZmFtaWx5IixlPT5lXSxbInZlcnRpY2FsLWFsaWduIixlPT4oMCxpLm1lYXN1cmVUb1N0cmluZykoKDAscy5nZXRNZWFzdXJlbWVudCkoZSkpXV0pLGQ9L1xzKy9nLGY9L1tcclxuXSsvZyxnPS9cclxuPy9nO2Z1bmN0aW9uIHAoZSx0LHIpe2NvbnN0IGE9T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gYTtjb25zdCBvPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0W3Qscl1vZiBlLnNwbGl0KCI7IikubWFwKChlPT5lLnNwbGl0KCI6IiwyKSkpKXtjb25zdCBlPXUuZ2V0KHQpO2lmKCIiPT09ZSljb250aW51ZTtsZXQgbj1yO2UmJihuPSJzdHJpbmciPT10eXBlb2YgZT9lOmUocixvKSksdC5lbmRzV2l0aCgic2NhbGUiKT9hLnRyYW5zZm9ybT1hLnRyYW5zZm9ybT8iIi5jb25jYXQoYVt0XSwiICIpLmNvbmNhdChuKTpuOmFbdC5yZXBsYWNlQWxsKC8tKFthLXpBLVpdKS9nLCgoZSx0KT0+dC50b1VwcGVyQ2FzZSgpKSldPW59aWYoYS5mb250RmFtaWx5JiYoMCxpLnNldEZvbnRGYW1pbHkpKHt0eXBlZmFjZTphLmZvbnRGYW1pbHksd2VpZ2h0OmEuZm9udFdlaWdodHx8Im5vcm1hbCIscG9zdHVyZTphLmZvbnRTdHlsZXx8Im5vcm1hbCIsc2l6ZTpvLmZvbnRTaXplfHwwfSx0LHRbbi4kZ2xvYmFsRGF0YV0uZm9udEZpbmRlcixhKSxyJiZhLnZlcnRpY2FsQWxpZ24mJiIwcHgiIT09YS52ZXJ0aWNhbEFsaWduJiZhLmZvbnRTaXplKXtjb25zdCBlPS41ODMsdD0uMzMzLHI9KDAscy5nZXRNZWFzdXJlbWVudCkoYS5mb250U2l6ZSk7YS5mb250U2l6ZT0oMCxpLm1lYXN1cmVUb1N0cmluZykociplKSxhLnZlcnRpY2FsQWxpZ249KDAsaS5tZWFzdXJlVG9TdHJpbmcpKE1hdGguc2lnbigoMCxzLmdldE1lYXN1cmVtZW50KShhLnZlcnRpY2FsQWxpZ24pKSpyKnQpfXJldHVybiByJiZhLmZvbnRTaXplJiYoYS5mb250U2l6ZT0iY2FsYygiLmNvbmNhdChhLmZvbnRTaXplLCIgKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSIpKSwoMCxpLmZpeFRleHRJbmRlbnQpKGEpLGF9Y29uc3QgbT1uZXcgU2V0KFsiYm9keSIsImh0bWwiXSk7Y2xhc3MgYiBleHRlbmRzIG8uWG1sT2JqZWN0e2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoYyx0KSx0aGlzW2xdPSExLHRoaXMuc3R5bGU9ZS5zdHlsZXx8IiJ9W24uJGNsZWFuXShlKXtzdXBlcltuLiRjbGVhbl0oZSksdGhpcy5zdHlsZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5zdHlsZT9lLnN0eWxlLnRyaW0oKS5zcGxpdCgvXHMqO1xzKi8pLmZpbHRlcigoZT0+ISFlKSkubWFwKChlPT5lLnNwbGl0KC9ccyo6XHMqLywyKSkpLmZpbHRlcigodD0+e2xldFtyLGFdPXQ7cmV0dXJuImZvbnQtZmFtaWx5Ij09PXImJmVbbi4kZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcy5hZGQoYSksaC5oYXMocil9KSkubWFwKChlPT5lLmpvaW4oIjoiKSkpLmpvaW4oIjsiKToiIn0odGhpcyl9W24uJGFjY2VwdFdoaXRlc3BhY2VdKCl7cmV0dXJuIW0uaGFzKHRoaXNbbi4kbm9kZU5hbWVdKX1bbi4kb25UZXh0XShlKXthcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdP3RoaXNbbF09ITA6KGU9ZS5yZXBsYWNlQWxsKGYsIiIpLHRoaXMuc3R5bGUuaW5jbHVkZXMoInhmYS1zcGFjZXJ1bjp5ZXMiKXx8KGU9ZS5yZXBsYWNlQWxsKGQsIiAiKSkpLGUmJih0aGlzW24uJGNvbnRlbnRdKz1lKX1bbi4kcHVzaEdseXBoc10oZSl7bGV0IHQ9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTtjb25zdCByPU9iamVjdC5jcmVhdGUobnVsbCksYT17dG9wOk5hTixib3R0b206TmFOLGxlZnQ6TmFOLHJpZ2h0Ok5hTn07bGV0IGk9bnVsbDtmb3IoY29uc3RbZSx0XW9mIHRoaXMuc3R5bGUuc3BsaXQoIjsiKS5tYXAoKGU9PmUuc3BsaXQoIjoiLDIpKSkpc3dpdGNoKGUpe2Nhc2UiZm9udC1mYW1pbHkiOnIudHlwZWZhY2U9KDAscy5zdHJpcFF1b3RlcykodCk7YnJlYWs7Y2FzZSJmb250LXNpemUiOnIuc2l6ZT0oMCxzLmdldE1lYXN1cmVtZW50KSh0KTticmVhaztjYXNlImZvbnQtd2VpZ2h0IjpyLndlaWdodD10O2JyZWFrO2Nhc2UiZm9udC1zdHlsZSI6ci5wb3N0dXJlPXQ7YnJlYWs7Y2FzZSJsZXR0ZXItc3BhY2luZyI6ci5sZXR0ZXJTcGFjaW5nPSgwLHMuZ2V0TWVhc3VyZW1lbnQpKHQpO2JyZWFrO2Nhc2UibWFyZ2luIjpjb25zdCBlPXQuc3BsaXQoLyBcdC8pLm1hcCgoZT0+KDAscy5nZXRNZWFzdXJlbWVudCkoZSkpKTtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMTphLnRvcD1hLmJvdHRvbT1hLmxlZnQ9YS5yaWdodD1lWzBdO2JyZWFrO2Nhc2UgMjphLnRvcD1hLmJvdHRvbT1lWzBdLGEubGVmdD1hLnJpZ2h0PWVbMV07YnJlYWs7Y2FzZSAzOmEudG9wPWVbMF0sYS5ib3R0b209ZVsyXSxhLmxlZnQ9YS5yaWdodD1lWzFdO2JyZWFrO2Nhc2UgNDphLnRvcD1lWzBdLGEubGVmdD1lWzFdLGEuYm90dG9tPWVbMl0sYS5yaWdodD1lWzNdfWJyZWFrO2Nhc2UibWFyZ2luLXRvcCI6YS50b3A9KDAscy5nZXRNZWFzdXJlbWVudCkodCk7YnJlYWs7Y2FzZSJtYXJnaW4tYm90dG9tIjphLmJvdHRvbT0oMCxzLmdldE1lYXN1cmVtZW50KSh0KTticmVhaztjYXNlIm1hcmdpbi1sZWZ0IjphLmxlZnQ9KDAscy5nZXRNZWFzdXJlbWVudCkodCk7YnJlYWs7Y2FzZSJtYXJnaW4tcmlnaHQiOmEucmlnaHQ9KDAscy5nZXRNZWFzdXJlbWVudCkodCk7YnJlYWs7Y2FzZSJsaW5lLWhlaWdodCI6aT0oMCxzLmdldE1lYXN1cmVtZW50KSh0KX1pZihlLnB1c2hEYXRhKHIsYSxpKSx0aGlzW24uJGNvbnRlbnRdKWUuYWRkU3RyaW5nKHRoaXNbbi4kY29udGVudF0pO2Vsc2UgZm9yKGNvbnN0IHQgb2YgdGhpc1tuLiRnZXRDaGlsZHJlbl0oKSkiI3RleHQiIT09dFtuLiRub2RlTmFtZV0/dFtuLiRwdXNoR2x5cGhzXShlKTplLmFkZFN0cmluZyh0W24uJGNvbnRlbnRdKTt0JiZlLnBvcEZvbnQoKX1bbi4kdG9IVE1MXShlKXtjb25zdCB0PVtdO2lmKHRoaXNbbi4kZXh0cmFdPXtjaGlsZHJlbjp0fSx0aGlzW24uJGNoaWxkcmVuVG9IVE1MXSh7fSksMD09PXQubGVuZ3RoJiYhdGhpc1tuLiRjb250ZW50XSlyZXR1cm4gcy5IVE1MUmVzdWx0LkVNUFRZO2xldCByO3JldHVybiByPXRoaXNbbF0/dGhpc1tuLiRjb250ZW50XT90aGlzW24uJGNvbnRlbnRdLnJlcGxhY2VBbGwoZywiXG4iKTp2b2lkIDA6dGhpc1tuLiRjb250ZW50XXx8dm9pZCAwLHMuSFRNTFJlc3VsdC5zdWNjZXNzKHtuYW1lOnRoaXNbbi4kbm9kZU5hbWVdLGF0dHJpYnV0ZXM6e2hyZWY6dGhpcy5ocmVmLHN0eWxlOnAodGhpcy5zdHlsZSx0aGlzLHRoaXNbbF0pfSxjaGlsZHJlbjp0LHZhbHVlOnJ9KX19Y2xhc3MgeSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiYSIpLHRoaXMuaHJlZj0oMCxpLmZpeFVSTCkoZS5ocmVmKXx8IiJ9fWNsYXNzIHcgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsImIiKX1bbi4kcHVzaEdseXBoc10oZSl7ZS5wdXNoRm9udCh7d2VpZ2h0OiJib2xkIn0pLHN1cGVyW24uJHB1c2hHbHlwaHNdKGUpLGUucG9wRm9udCgpfX1jbGFzcyB2IGV4dGVuZHMgYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJib2R5Iil9W24uJHRvSFRNTF0oZSl7Y29uc3QgdD1zdXBlcltuLiR0b0hUTUxdKGUpLHtodG1sOnJ9PXQ7cmV0dXJuIHI/KHIubmFtZT0iZGl2IixyLmF0dHJpYnV0ZXMuY2xhc3M9WyJ4ZmFSaWNoIl0sdCk6cy5IVE1MUmVzdWx0LkVNUFRZfX1jbGFzcyB4IGV4dGVuZHMgYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJiciIpfVtuLiR0ZXh0XSgpe3JldHVybiJcbiJ9W24uJHB1c2hHbHlwaHNdKGUpe2UuYWRkU3RyaW5nKCJcbiIpfVtuLiR0b0hUTUxdKGUpe3JldHVybiBzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiYnIifSl9fWNsYXNzIFMgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsImh0bWwiKX1bbi4kdG9IVE1MXShlKXtjb25zdCB0PVtdO2lmKHRoaXNbbi4kZXh0cmFdPXtjaGlsZHJlbjp0fSx0aGlzW24uJGNoaWxkcmVuVG9IVE1MXSh7fSksMD09PXQubGVuZ3RoKXJldHVybiBzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7bmFtZToiZGl2IixhdHRyaWJ1dGVzOntjbGFzczpbInhmYVJpY2giXSxzdHlsZTp7fX0sdmFsdWU6dGhpc1tuLiRjb250ZW50XXx8IiJ9KTtpZigxPT09dC5sZW5ndGgpe3ZhciByO2NvbnN0IGU9dFswXTtpZihudWxsIT09KHI9ZS5hdHRyaWJ1dGVzKSYmdm9pZCAwIT09ciYmci5jbGFzcy5pbmNsdWRlcygieGZhUmljaCIpKXJldHVybiBzLkhUTUxSZXN1bHQuc3VjY2VzcyhlKX1yZXR1cm4gcy5IVE1MUmVzdWx0LnN1Y2Nlc3Moe25hbWU6ImRpdiIsYXR0cmlidXRlczp7Y2xhc3M6WyJ4ZmFSaWNoIl0sc3R5bGU6e319LGNoaWxkcmVuOnR9KX19Y2xhc3MgQSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiaSIpfVtuLiRwdXNoR2x5cGhzXShlKXtlLnB1c2hGb250KHtwb3N0dXJlOiJpdGFsaWMifSksc3VwZXJbbi4kcHVzaEdseXBoc10oZSksZS5wb3BGb250KCl9fWNsYXNzIGsgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsImxpIil9fWNsYXNzIEMgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIm9sIil9fWNsYXNzIE8gZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsInAiKX1bbi4kcHVzaEdseXBoc10oZSl7c3VwZXJbbi4kcHVzaEdseXBoc10oZSwhMSksZS5hZGRTdHJpbmcoIlxuIiksZS5hZGRQYXJhKCksZS5wb3BGb250KCl9W24uJHRleHRdKCl7cmV0dXJuIHRoaXNbbi4kZ2V0UGFyZW50XSgpW24uJGdldENoaWxkcmVuXSgpLmF0KC0xKT09PXRoaXM/c3VwZXJbbi4kdGV4dF0oKTpzdXBlcltuLiR0ZXh0XSgpKyJcbiJ9fWNsYXNzIEYgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsInNwYW4iKX19Y2xhc3MgSSBleHRlbmRzIGJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwic3ViIil9fWNsYXNzIFQgZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsInN1cCIpfX1jbGFzcyBNIGV4dGVuZHMgYntjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJ1bCIpfX1jbGFzcyBFe3N0YXRpY1thLiRidWlsZFhGQU9iamVjdF0oZSx0KXtpZihFLmhhc093blByb3BlcnR5KGUpKXJldHVybiBFW2VdKHQpfXN0YXRpYyBhKGUpe3JldHVybiBuZXcgeShlKX1zdGF0aWMgYihlKXtyZXR1cm4gbmV3IHcoZSl9c3RhdGljIGJvZHkoZSl7cmV0dXJuIG5ldyB2KGUpfXN0YXRpYyBicihlKXtyZXR1cm4gbmV3IHgoZSl9c3RhdGljIGh0bWwoZSl7cmV0dXJuIG5ldyBTKGUpfXN0YXRpYyBpKGUpe3JldHVybiBuZXcgQShlKX1zdGF0aWMgbGkoZSl7cmV0dXJuIG5ldyBrKGUpfXN0YXRpYyBvbChlKXtyZXR1cm4gbmV3IEMoZSl9c3RhdGljIHAoZSl7cmV0dXJuIG5ldyBPKGUpfXN0YXRpYyBzcGFuKGUpe3JldHVybiBuZXcgRihlKX1zdGF0aWMgc3ViKGUpe3JldHVybiBuZXcgSShlKX1zdGF0aWMgc3VwKGUpe3JldHVybiBuZXcgVChlKX1zdGF0aWMgdWwoZSl7cmV0dXJuIG5ldyBNKGUpfX10LlhodG1sTmFtZXNwYWNlPUV9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Vbmtub3duTmFtZXNwYWNlPXZvaWQgMDt2YXIgbj1yKDIzNCksYT1yKDI0MCk7Y2xhc3MgaXtjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWVzcGFjZUlkPWV9W24uJGJ1aWxkWEZBT2JqZWN0XShlLHQpe3JldHVybiBuZXcgYS5YbWxPYmplY3QodGhpcy5uYW1lc3BhY2VJZCxlLHQpfX10LlVua25vd25OYW1lc3BhY2U9aX0sKGUsdCxyKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkRhdGFzZXRSZWFkZXI9dm9pZCAwLHIoMik7dmFyIG49cigxNDQpLGE9cigxNDkpLGk9cigyMTcpO2Z1bmN0aW9uIHMoZSl7dHJ5e3JldHVybigwLG4uc3RyaW5nVG9VVEY4U3RyaW5nKShlKX1jYXRjaCh0KXtyZXR1cm4oMCxuLndhcm4pKCdVVEYtOCBkZWNvZGluZyBmYWlsZWQ6ICInLmNvbmNhdCh0LCciLicpKSxlfX1jbGFzcyBvIGV4dGVuZHMgaS5TaW1wbGVYTUxQYXJzZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5ub2RlPW51bGx9b25FbmRFbGVtZW50KGUpe2NvbnN0IHQ9c3VwZXIub25FbmRFbGVtZW50KGUpO2lmKHQmJiJ4ZmE6ZGF0YXNldHMiPT09ZSl0aHJvdyB0aGlzLm5vZGU9dCxuZXcgRXJyb3IoIkFib3J0aW5nIERhdGFzZXRYTUxQYXJzZXIuIil9fXQuRGF0YXNldFJlYWRlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXtpZihlLmRhdGFzZXRzKXRoaXMubm9kZT1uZXcgaS5TaW1wbGVYTUxQYXJzZXIoe2hhc0F0dHJpYnV0ZXM6ITB9KS5wYXJzZUZyb21TdHJpbmcoZS5kYXRhc2V0cykuZG9jdW1lbnRFbGVtZW50O2Vsc2V7Y29uc3QgdD1uZXcgbyh7aGFzQXR0cmlidXRlczohMH0pO3RyeXt0LnBhcnNlRnJvbVN0cmluZyhlWyJ4ZHA6eGRwIl0pfWNhdGNoKGUpe310aGlzLm5vZGU9dC5ub2RlfX1nZXRWYWx1ZShlKXtpZighdGhpcy5ub2RlfHwhZSlyZXR1cm4iIjtjb25zdCB0PXRoaXMubm9kZS5zZWFyY2hOb2RlKCgwLGEucGFyc2VYRkFQYXRoKShlKSwwKTtpZighdClyZXR1cm4iIjtjb25zdCByPXQuZmlyc3RDaGlsZDtyZXR1cm4idmFsdWUiPT09KG51bGw9PXI/dm9pZCAwOnIubm9kZU5hbWUpP3QuY2hpbGRyZW4ubWFwKChlPT5zKGUudGV4dENvbnRlbnQpKSk6cyh0LnRleHRDb250ZW50KX19fSwoZSx0LHIpPT57dmFyIG47T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuWFJlZj12b2lkIDAscigxMTYpLHIoMTI2KSxyKDEyOCkscigxMzEpLHIoMTMzKSxyKDEzNSkscigxMzcpLHIoODQpLHIoOTMpLHIoOTQpLHIoOTcpLHIoOTkpLHIoMTAxKSxyKDEwNSkscigxMDgpLHIoMTE1KSxyKDEzOSkscigyKTt2YXIgYT1yKDE0NCksaT1yKDE1MCkscz1yKDE2Niksbz1yKDE0OSksbD1yKDE1MSksZD1yKDIxOCk7dC5YUmVmPShuPW5ldyBXZWFrTWFwLGNsYXNze2NvbnN0cnVjdG9yKGUsdCl7Yyh0aGlzLG4se3dyaXRhYmxlOiEwLHZhbHVlOm51bGx9KSx0aGlzLnN0cmVhbT1lLHRoaXMucGRmTWFuYWdlcj10LHRoaXMuZW50cmllcz1bXSx0aGlzLl94cmVmU3Rtcz1uZXcgU2V0LHRoaXMuX2NhY2hlTWFwPW5ldyBNYXAsdGhpcy5fcGVuZGluZ1JlZnM9bmV3IGkuUmVmU2V0LHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW09bnVsbCx0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW09bnVsbH1nZXROZXdQZXJzaXN0ZW50UmVmKGUpe251bGw9PT10aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtJiYodGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bT10aGlzLmVudHJpZXMubGVuZ3RofHwxKTtjb25zdCB0PXRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW0rKztyZXR1cm4gdGhpcy5fY2FjaGVNYXAuc2V0KHQsZSksaS5SZWYuZ2V0KHQsMCl9Z2V0TmV3VGVtcG9yYXJ5UmVmKCl7cmV0dXJuIG51bGw9PT10aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0mJih0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW09dGhpcy5lbnRyaWVzLmxlbmd0aHx8MSksaS5SZWYuZ2V0KHRoaXMuX25ld1RlbXBvcmFyeVJlZk51bSsrLDApfXJlc2V0TmV3VGVtcG9yYXJ5UmVmKCl7dGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtPW51bGx9c2V0U3RhcnRYUmVmKGUpe3RoaXMuc3RhcnRYUmVmUXVldWU9W2VdfXBhcnNlKCl7bGV0IGUsdCxyLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTtuPygoMCxhLndhcm4pKCJJbmRleGluZyBhbGwgUERGIG9iamVjdHMiKSxlPXRoaXMuaW5kZXhPYmplY3RzKCkpOmU9dGhpcy5yZWFkWFJlZigpLGUuYXNzaWduWHJlZih0aGlzKSx0aGlzLnRyYWlsZXI9ZTt0cnl7dD1lLmdldCgiRW5jcnlwdCIpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBvLk1pc3NpbmdEYXRhRXhjZXB0aW9uKXRocm93IGU7KDAsYS53YXJuKSgnWFJlZi5wYXJzZSAtIEludmFsaWQgIkVuY3J5cHQiIHJlZmVyZW5jZTogIicuY29uY2F0KGUsJyIuJykpfWlmKHQgaW5zdGFuY2VvZiBpLkRpY3Qpe2NvbnN0IHI9ZS5nZXQoIklEIiksbj1udWxsIT1yJiZyLmxlbmd0aD9yWzBdOiIiO3Quc3VwcHJlc3NFbmNyeXB0aW9uPSEwLHRoaXMuZW5jcnlwdD1uZXcgZC5DaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KHQsbix0aGlzLnBkZk1hbmFnZXIucGFzc3dvcmQpfXRyeXtyPWUuZ2V0KCJSb290Iil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG8uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCdYUmVmLnBhcnNlIC0gSW52YWxpZCAiUm9vdCIgcmVmZXJlbmNlOiAiJy5jb25jYXQoZSwnIi4nKSl9aWYociBpbnN0YW5jZW9mIGkuRGljdCl0cnl7aWYoci5nZXQoIlBhZ2VzIilpbnN0YW5jZW9mIGkuRGljdClyZXR1cm4gdm9pZCh0aGlzLnJvb3Q9cil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIG8uTWlzc2luZ0RhdGFFeGNlcHRpb24pdGhyb3cgZTsoMCxhLndhcm4pKCdYUmVmLnBhcnNlIC0gSW52YWxpZCAiUGFnZXMiIHJlZmVyZW5jZTogIicuY29uY2F0KGUsJyIuJykpfWlmKCFuKXRocm93IG5ldyBvLlhSZWZQYXJzZUV4Y2VwdGlvbjt0aHJvdyBuZXcgYS5JbnZhbGlkUERGRXhjZXB0aW9uKCJJbnZhbGlkIFJvb3QgcmVmZXJlbmNlLiIpfXByb2Nlc3NYUmVmVGFibGUoZSl7InRhYmxlU3RhdGUiaW4gdGhpc3x8KHRoaXMudGFibGVTdGF0ZT17ZW50cnlOdW06MCxzdHJlYW1Qb3M6ZS5sZXhlci5zdHJlYW0ucG9zLHBhcnNlckJ1ZjE6ZS5idWYxLHBhcnNlckJ1ZjI6ZS5idWYyfSk7Y29uc3QgdD10aGlzLnJlYWRYUmVmVGFibGUoZSk7aWYoISgwLGkuaXNDbWQpKHQsInRyYWlsZXIiKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgZmluZCB0cmFpbGVyIGRpY3Rpb25hcnkiKTtsZXQgcj1lLmdldE9iaigpO2lmKHIgaW5zdGFuY2VvZiBpLkRpY3R8fCFyLmRpY3R8fChyPXIuZGljdCksIShyIGluc3RhbmNlb2YgaS5EaWN0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHRhYmxlOiBjb3VsZCBub3QgcGFyc2UgdHJhaWxlciBkaWN0aW9uYXJ5Iik7cmV0dXJuIGRlbGV0ZSB0aGlzLnRhYmxlU3RhdGUscn1yZWFkWFJlZlRhYmxlKGUpe2NvbnN0IHQ9ZS5sZXhlci5zdHJlYW0scj10aGlzLnRhYmxlU3RhdGU7bGV0IG47Zm9yKHQucG9zPXIuc3RyZWFtUG9zLGUuYnVmMT1yLnBhcnNlckJ1ZjEsZS5idWYyPXIucGFyc2VyQnVmMjs7KXtpZighKCJmaXJzdEVudHJ5TnVtImluIHIpfHwhKCJlbnRyeUNvdW50ImluIHIpKXtpZigoMCxpLmlzQ21kKShuPWUuZ2V0T2JqKCksInRyYWlsZXIiKSlicmVhaztyLmZpcnN0RW50cnlOdW09bixyLmVudHJ5Q291bnQ9ZS5nZXRPYmooKX1sZXQgcz1yLmZpcnN0RW50cnlOdW07Y29uc3Qgbz1yLmVudHJ5Q291bnQ7aWYoIU51bWJlci5pc0ludGVnZXIocyl8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHdyb25nIHR5cGVzIGluIHN1YnNlY3Rpb24gaGVhZGVyIik7Zm9yKGxldCBuPXIuZW50cnlOdW07bjxvO24rKyl7ci5zdHJlYW1Qb3M9dC5wb3Msci5lbnRyeU51bT1uLHIucGFyc2VyQnVmMT1lLmJ1ZjEsci5wYXJzZXJCdWYyPWUuYnVmMjtjb25zdCBjPXt9O2Mub2Zmc2V0PWUuZ2V0T2JqKCksYy5nZW49ZS5nZXRPYmooKTtjb25zdCBsPWUuZ2V0T2JqKCk7aWYobCBpbnN0YW5jZW9mIGkuQ21kKXN3aXRjaChsLmNtZCl7Y2FzZSJmIjpjLmZyZWU9ITA7YnJlYWs7Y2FzZSJuIjpjLnVuY29tcHJlc3NlZD0hMH1pZighTnVtYmVyLmlzSW50ZWdlcihjLm9mZnNldCl8fCFOdW1iZXIuaXNJbnRlZ2VyKGMuZ2VuKXx8IWMuZnJlZSYmIWMudW5jb21wcmVzc2VkKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIGVudHJ5IGluIFhSZWYgc3Vic2VjdGlvbjogIi5jb25jYXQocywiLCAiKS5jb25jYXQobykpOzA9PT1uJiZjLmZyZWUmJjE9PT1zJiYocz0wKSx0aGlzLmVudHJpZXNbbitzXXx8KHRoaXMuZW50cmllc1tuK3NdPWMpfXIuZW50cnlOdW09MCxyLnN0cmVhbVBvcz10LnBvcyxyLnBhcnNlckJ1ZjE9ZS5idWYxLHIucGFyc2VyQnVmMj1lLmJ1ZjIsZGVsZXRlIHIuZmlyc3RFbnRyeU51bSxkZWxldGUgci5lbnRyeUNvdW50fWlmKHRoaXMuZW50cmllc1swXSYmIXRoaXMuZW50cmllc1swXS5mcmVlKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHVuZXhwZWN0ZWQgZmlyc3Qgb2JqZWN0Iik7cmV0dXJuIG59cHJvY2Vzc1hSZWZTdHJlYW0oZSl7aWYoISgic3RyZWFtU3RhdGUiaW4gdGhpcykpe2NvbnN0IHQ9ZS5kaWN0LHI9dC5nZXQoIlciKTtsZXQgbj10LmdldCgiSW5kZXgiKTtufHwobj1bMCx0LmdldCgiU2l6ZSIpXSksdGhpcy5zdHJlYW1TdGF0ZT17ZW50cnlSYW5nZXM6bixieXRlV2lkdGhzOnIsZW50cnlOdW06MCxzdHJlYW1Qb3M6ZS5wb3N9fXJldHVybiB0aGlzLnJlYWRYUmVmU3RyZWFtKGUpLGRlbGV0ZSB0aGlzLnN0cmVhbVN0YXRlLGUuZGljdH1yZWFkWFJlZlN0cmVhbShlKXtjb25zdCB0PXRoaXMuc3RyZWFtU3RhdGU7ZS5wb3M9dC5zdHJlYW1Qb3M7Y29uc3RbcixuLGldPXQuYnl0ZVdpZHRocyxzPXQuZW50cnlSYW5nZXM7Zm9yKDtzLmxlbmd0aD4wOyl7Y29uc3RbbyxjXT1zO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG8pfHwhTnVtYmVyLmlzSW50ZWdlcihjKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHJhbmdlIGZpZWxkczogIi5jb25jYXQobywiLCAiKS5jb25jYXQoYykpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHwhTnVtYmVyLmlzSW50ZWdlcihuKXx8IU51bWJlci5pc0ludGVnZXIoaSkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBlbnRyeSBmaWVsZHMgbGVuZ3RoOiAiLmNvbmNhdChvLCIsICIpLmNvbmNhdChjKSk7Zm9yKGxldCBzPXQuZW50cnlOdW07czxjOysrcyl7dC5lbnRyeU51bT1zLHQuc3RyZWFtUG9zPWUucG9zO2xldCBjPTAsbD0wLGg9MDtmb3IobGV0IHQ9MDt0PHI7Kyt0KXtjb25zdCB0PWUuZ2V0Qnl0ZSgpO2lmKC0xPT09dCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIGJ5dGVXaWR0aHMgJ3R5cGUnLiIpO2M9Yzw8OHx0fTA9PT1yJiYoYz0xKTtmb3IobGV0IHQ9MDt0PG47Kyt0KXtjb25zdCB0PWUuZ2V0Qnl0ZSgpO2lmKC0xPT09dCl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIGJ5dGVXaWR0aHMgJ29mZnNldCcuIik7bD1sPDw4fHR9Zm9yKGxldCB0PTA7dDxpOysrdCl7Y29uc3QgdD1lLmdldEJ5dGUoKTtpZigtMT09PXQpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICdnZW5lcmF0aW9uJy4iKTtoPWg8PDh8dH1jb25zdCB1PXt9O3N3aXRjaCh1Lm9mZnNldD1sLHUuZ2VuPWgsYyl7Y2FzZSAwOnUuZnJlZT0hMDticmVhaztjYXNlIDE6dS51bmNvbXByZXNzZWQ9ITA7YnJlYWs7Y2FzZSAyOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBlbnRyeSB0eXBlOiAiLmNvbmNhdChjKSl9dGhpcy5lbnRyaWVzW28rc118fCh0aGlzLmVudHJpZXNbbytzXT11KX10LmVudHJ5TnVtPTAsdC5zdHJlYW1Qb3M9ZS5wb3Mscy5zcGxpY2UoMCwyKX19aW5kZXhPYmplY3RzKCl7ZnVuY3Rpb24gZShlLHQpe2xldCByPSIiLG49ZVt0XTtmb3IoOzEwIT09biYmMTMhPT1uJiY2MCE9PW4mJiEoKyt0Pj1lLmxlbmd0aCk7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUobiksbj1lW3RdO3JldHVybiByfWZ1bmN0aW9uIHQoZSx0LHIpe2NvbnN0IG49ci5sZW5ndGgsYT1lLmxlbmd0aDtsZXQgaT0wO2Zvcig7dDxhOyl7bGV0IGE9MDtmb3IoO2E8biYmZVt0K2FdPT09clthXTspKythO2lmKGE+PW4pYnJlYWs7dCsrLGkrK31yZXR1cm4gaX1jb25zdCByPS9cYihlbmRvYmp8XGQrXHMrXGQrXHMrb2JqfHhyZWZ8dHJhaWxlclxzKjw8KVxiL2csbj0vXGIoc3RhcnR4cmVmfFxkK1xzK1xkK1xzK29iailcYi9nLGM9L14oXGQrKVxzKyhcZCspXHMrb2JqXGIvLGw9bmV3IFVpbnQ4QXJyYXkoWzExNiwxMTQsOTcsMTA1LDEwOCwxMDEsMTE0XSksaD1uZXcgVWludDhBcnJheShbMTE1LDExNiw5NywxMTQsMTE2LDEyMCwxMTQsMTAxLDEwMl0pLHU9bmV3IFVpbnQ4QXJyYXkoWzQ3LDg4LDgyLDEwMSwxMDJdKTt0aGlzLmVudHJpZXMubGVuZ3RoPTAsdGhpcy5fY2FjaGVNYXAuY2xlYXIoKTtjb25zdCBkPXRoaXMuc3RyZWFtO2QucG9zPTA7Y29uc3QgZj1kLmdldEJ5dGVzKCksZz0oMCxhLmJ5dGVzVG9TdHJpbmcpKGYpLHA9Zi5sZW5ndGg7bGV0IG09ZC5zdGFydDtjb25zdCBiPVtdLHk9W107Zm9yKDttPHA7KXtsZXQgaT1mW21dO2lmKDk9PT1pfHwxMD09PWl8fDEzPT09aXx8MzI9PT1pKXsrK207Y29udGludWV9aWYoMzc9PT1pKXtkb3tpZigrK20sbT49cClicmVhaztpPWZbbV19d2hpbGUoMTAhPT1pJiYxMyE9PWkpO2NvbnRpbnVlfWNvbnN0IHc9ZShmLG0pO2xldCB2O2lmKHcuc3RhcnRzV2l0aCgieHJlZiIpJiYoND09PXcubGVuZ3RofHwvXHMvLnRlc3Qod1s0XSkpKW0rPXQoZixtLGwpLGIucHVzaChtKSxtKz10KGYsbSxoKTtlbHNlIGlmKHY9Yy5leGVjKHcpKXtjb25zdCBlPTB8dlsxXSxuPTB8dlsyXSxpPW0rdy5sZW5ndGg7bGV0IGMsbD0hMTtpZih0aGlzLmVudHJpZXNbZV0pe2lmKHRoaXMuZW50cmllc1tlXS5nZW49PT1uKXRyeXtuZXcgcy5QYXJzZXIoe2xleGVyOm5ldyBzLkxleGVyKGQubWFrZVN1YlN0cmVhbShpKSl9KS5nZXRPYmooKSxsPSEwfWNhdGNoKHIpe3IgaW5zdGFuY2VvZiBvLlBhcnNlckVPRkV4Y2VwdGlvbj8oMCxhLndhcm4pKCJpbmRleE9iamVjdHMgLS0gY2hlY2tpbmcgb2JqZWN0ICgiLmNvbmNhdCh3LCcpOiAiJykuY29uY2F0KHIsJyIuJykpOmw9ITB9fWVsc2UgbD0hMDtsJiYodGhpcy5lbnRyaWVzW2VdPXtvZmZzZXQ6bS1kLnN0YXJ0LGdlbjpuLHVuY29tcHJlc3NlZDohMH0pLHIubGFzdEluZGV4PWk7Y29uc3QgaD1yLmV4ZWMoZyk7aD8oYz1yLmxhc3RJbmRleCsxLW0sImVuZG9iaiIhPT1oWzFdJiYoKDAsYS53YXJuKSgnaW5kZXhPYmplY3RzOiBGb3VuZCAiJy5jb25jYXQoaFsxXSwnIiBpbnNpZGUgb2YgYW5vdGhlciAib2JqIiwgY2F1c2VkIGJ5IG1pc3NpbmcgImVuZG9iaiIgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJykpLGMtPWhbMV0ubGVuZ3RoKzEpKTpjPXAtbTtjb25zdCBiPWYuc3ViYXJyYXkobSxtK2MpLHg9dChiLDAsdSk7eDxjJiZiW3grNV08NjQmJih5LnB1c2gobS1kLnN0YXJ0KSx0aGlzLl94cmVmU3Rtcy5hZGQobS1kLnN0YXJ0KSksbSs9Y31lbHNlIGlmKHcuc3RhcnRzV2l0aCgidHJhaWxlciIpJiYoNz09PXcubGVuZ3RofHwvXHMvLnRlc3Qod1s3XSkpKXtiLnB1c2gobSk7Y29uc3QgZT1tK3cubGVuZ3RoO2xldCB0O24ubGFzdEluZGV4PWU7Y29uc3Qgcj1uLmV4ZWMoZyk7cj8odD1uLmxhc3RJbmRleCsxLW0sInN0YXJ0eHJlZiIhPT1yWzFdJiYoKDAsYS53YXJuKSgnaW5kZXhPYmplY3RzOiBGb3VuZCAiJy5jb25jYXQoclsxXSwnIiBhZnRlciAidHJhaWxlciIsIGNhdXNlZCBieSBtaXNzaW5nICJzdGFydHhyZWYiIC0tIHRyeWluZyB0byByZWNvdmVyLicpKSx0LT1yWzFdLmxlbmd0aCsxKSk6dD1wLW0sbSs9dH1lbHNlIG0rPXcubGVuZ3RoKzF9Zm9yKGNvbnN0IGUgb2YgeSl0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2goZSksdGhpcy5yZWFkWFJlZighMCk7Y29uc3Qgdz1bXTtsZXQgdix4LFM9ITE7Zm9yKGNvbnN0IGUgb2YgYil7ZC5wb3M9ZTtjb25zdCB0PW5ldyBzLlBhcnNlcih7bGV4ZXI6bmV3IHMuTGV4ZXIoZCkseHJlZjp0aGlzLGFsbG93U3RyZWFtczohMCxyZWNvdmVyeU1vZGU6ITB9KSxyPXQuZ2V0T2JqKCk7aWYoISgwLGkuaXNDbWQpKHIsInRyYWlsZXIiKSljb250aW51ZTtjb25zdCBuPXQuZ2V0T2JqKCk7biBpbnN0YW5jZW9mIGkuRGljdCYmKHcucHVzaChuKSxuLmhhcygiRW5jcnlwdCIpJiYoUz0hMCkpfWZvcihjb25zdCBlIG9mWy4uLncsImdlbkZhbGxiYWNrIiwuLi53XSl7aWYoImdlbkZhbGxiYWNrIj09PWUpe2lmKCF4KWJyZWFrO3RoaXMuX2dlbmVyYXRpb25GYWxsYmFjaz0hMDtjb250aW51ZX1sZXQgdD0hMTt0cnl7Y29uc3Qgcj1lLmdldCgiUm9vdCIpO2lmKCEociBpbnN0YW5jZW9mIGkuRGljdCkpY29udGludWU7Y29uc3Qgbj1yLmdldCgiUGFnZXMiKTtpZighKG4gaW5zdGFuY2VvZiBpLkRpY3QpKWNvbnRpbnVlO2NvbnN0IGE9bi5nZXQoIkNvdW50Iik7TnVtYmVyLmlzSW50ZWdlcihhKSYmKHQ9ITApfWNhdGNoKHIpe3g9cjtjb250aW51ZX1pZih0JiYoIVN8fGUuaGFzKCJFbmNyeXB0IikpJiZlLmhhcygiSUQiKSlyZXR1cm4gZTt2PWV9aWYodilyZXR1cm4gdjtpZih0aGlzLnRvcERpY3QpcmV0dXJuIHRoaXMudG9wRGljdDt0aHJvdyBuZXcgYS5JbnZhbGlkUERGRXhjZXB0aW9uKCJJbnZhbGlkIFBERiBzdHJ1Y3R1cmUuIil9cmVhZFhSZWYoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2NvbnN0IHQ9dGhpcy5zdHJlYW0scj1uZXcgU2V0O2Zvcig7dGhpcy5zdGFydFhSZWZRdWV1ZS5sZW5ndGg7KXt0cnl7Y29uc3QgZT10aGlzLnN0YXJ0WFJlZlF1ZXVlWzBdO2lmKHIuaGFzKGUpKXsoMCxhLndhcm4pKCJyZWFkWFJlZiAtIHNraXBwaW5nIFhSZWYgdGFibGUgc2luY2UgaXQgd2FzIGFscmVhZHkgcGFyc2VkLiIpLHRoaXMuc3RhcnRYUmVmUXVldWUuc2hpZnQoKTtjb250aW51ZX1yLmFkZChlKSx0LnBvcz1lK3Quc3RhcnQ7Y29uc3Qgbz1uZXcgcy5QYXJzZXIoe2xleGVyOm5ldyBzLkxleGVyKHQpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITB9KTtsZXQgZCxmPW8uZ2V0T2JqKCk7aWYoKDAsaS5pc0NtZCkoZiwieHJlZiIpKXt2YXIgYztkPXRoaXMucHJvY2Vzc1hSZWZUYWJsZShvKSx0aGlzLnRvcERpY3R8fCh0aGlzLnRvcERpY3Q9ZCksZj1kLmdldCgiWFJlZlN0bSIpLE51bWJlci5pc0ludGVnZXIoZikmJiF0aGlzLl94cmVmU3Rtcy5oYXMoZikmJih0aGlzLl94cmVmU3Rtcy5hZGQoZiksdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKGYpLG51bGwhPT0oYz1oKHRoaXMsbikpJiZ2b2lkIDAhPT1jfHx1KHRoaXMsbixmKSl9ZWxzZXtpZighTnVtYmVyLmlzSW50ZWdlcihmKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSBoZWFkZXIiKTtpZighKE51bWJlci5pc0ludGVnZXIoby5nZXRPYmooKSkmJigwLGkuaXNDbWQpKG8uZ2V0T2JqKCksIm9iaiIpJiYoZj1vLmdldE9iaigpKWluc3RhbmNlb2YgbC5CYXNlU3RyZWFtKSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSIpO2lmKGQ9dGhpcy5wcm9jZXNzWFJlZlN0cmVhbShmKSx0aGlzLnRvcERpY3R8fCh0aGlzLnRvcERpY3Q9ZCksIWQpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoIkZhaWxlZCB0byByZWFkIFhSZWYgc3RyZWFtIil9Zj1kLmdldCgiUHJldiIpLE51bWJlci5pc0ludGVnZXIoZik/dGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKGYpOmYgaW5zdGFuY2VvZiBpLlJlZiYmdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKGYubnVtKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygby5NaXNzaW5nRGF0YUV4Y2VwdGlvbil0aHJvdyBlOygwLGEuaW5mbykoIih3aGlsZSByZWFkaW5nIFhSZWYpOiAiK2UpfXRoaXMuc3RhcnRYUmVmUXVldWUuc2hpZnQoKX1pZih0aGlzLnRvcERpY3QpcmV0dXJuIHRoaXMudG9wRGljdDtpZighZSl0aHJvdyBuZXcgby5YUmVmUGFyc2VFeGNlcHRpb259Z2V0IGxhc3RYUmVmU3RyZWFtUG9zKCl7dmFyIGU7cmV0dXJuIG51bGwhPT0oZT1oKHRoaXMsbikpJiZ2b2lkIDAhPT1lP2U6dGhpcy5feHJlZlN0bXMuc2l6ZT4wP01hdGgubWF4KC4uLnRoaXMuX3hyZWZTdG1zKTpudWxsfWdldEVudHJ5KGUpe2NvbnN0IHQ9dGhpcy5lbnRyaWVzW2VdO3JldHVybiB0JiYhdC5mcmVlJiZ0Lm9mZnNldD90Om51bGx9ZmV0Y2hJZlJlZihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO3JldHVybiBlIGluc3RhbmNlb2YgaS5SZWY/dGhpcy5mZXRjaChlLHQpOmV9ZmV0Y2goZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtpZighKGUgaW5zdGFuY2VvZiBpLlJlZikpdGhyb3cgbmV3IEVycm9yKCJyZWYgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZSIpO2NvbnN0IHI9ZS5udW0sbj10aGlzLl9jYWNoZU1hcC5nZXQocik7aWYodm9pZCAwIT09bilyZXR1cm4gbiBpbnN0YW5jZW9mIGkuRGljdCYmIW4ub2JqSWQmJihuLm9iaklkPWUudG9TdHJpbmcoKSksbjtsZXQgcz10aGlzLmdldEVudHJ5KHIpO2lmKG51bGw9PT1zKXJldHVybiB0aGlzLl9jYWNoZU1hcC5zZXQocixzKSxzO2lmKHRoaXMuX3BlbmRpbmdSZWZzLmhhcyhlKSlyZXR1cm4gdGhpcy5fcGVuZGluZ1JlZnMucmVtb3ZlKGUpLCgwLGEud2FybikoIklnbm9yaW5nIGNpcmN1bGFyIHJlZmVyZW5jZTogIi5jb25jYXQoZSwiLiIpKSxpLkNJUkNVTEFSX1JFRjt0aGlzLl9wZW5kaW5nUmVmcy5wdXQoZSk7dHJ5e3M9cy51bmNvbXByZXNzZWQ/dGhpcy5mZXRjaFVuY29tcHJlc3NlZChlLHMsdCk6dGhpcy5mZXRjaENvbXByZXNzZWQoZSxzLHQpLHRoaXMuX3BlbmRpbmdSZWZzLnJlbW92ZShlKX1jYXRjaCh0KXt0aHJvdyB0aGlzLl9wZW5kaW5nUmVmcy5yZW1vdmUoZSksdH1yZXR1cm4gcyBpbnN0YW5jZW9mIGkuRGljdD9zLm9iaklkPWUudG9TdHJpbmcoKTpzIGluc3RhbmNlb2YgbC5CYXNlU3RyZWFtJiYocy5kaWN0Lm9iaklkPWUudG9TdHJpbmcoKSksc31mZXRjaFVuY29tcHJlc3NlZChlLHQpe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07Y29uc3Qgbj1lLmdlbjtsZXQgYz1lLm51bTtpZih0LmdlbiE9PW4pe2NvbnN0IHM9IkluY29uc2lzdGVudCBnZW5lcmF0aW9uIGluIFhSZWY6ICIuY29uY2F0KGUpO2lmKHRoaXMuX2dlbmVyYXRpb25GYWxsYmFjayYmdC5nZW48bilyZXR1cm4oMCxhLndhcm4pKHMpLHRoaXMuZmV0Y2hVbmNvbXByZXNzZWQoaS5SZWYuZ2V0KGMsdC5nZW4pLHQscik7dGhyb3cgbmV3IG8uWFJlZkVudHJ5RXhjZXB0aW9uKHMpfWNvbnN0IGg9dGhpcy5zdHJlYW0ubWFrZVN1YlN0cmVhbSh0Lm9mZnNldCt0aGlzLnN0cmVhbS5zdGFydCksdT1uZXcgcy5QYXJzZXIoe2xleGVyOm5ldyBzLkxleGVyKGgpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITB9KSxkPXUuZ2V0T2JqKCksZj11LmdldE9iaigpLGc9dS5nZXRPYmooKTtpZihkIT09Y3x8ZiE9PW58fCEoZyBpbnN0YW5jZW9mIGkuQ21kKSl0aHJvdyBuZXcgby5YUmVmRW50cnlFeGNlcHRpb24oIkJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAiLmNvbmNhdChlKSk7aWYoIm9iaiIhPT1nLmNtZCl7aWYoZy5jbWQuc3RhcnRzV2l0aCgib2JqIikmJihjPXBhcnNlSW50KGcuY21kLnN1YnN0cmluZygzKSwxMCksIU51bWJlci5pc05hTihjKSkpcmV0dXJuIGM7dGhyb3cgbmV3IG8uWFJlZkVudHJ5RXhjZXB0aW9uKCJCYWQgKHVuY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogIi5jb25jYXQoZSkpfXJldHVybih0PXRoaXMuZW5jcnlwdCYmIXI/dS5nZXRPYmoodGhpcy5lbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShjLG4pKTp1LmdldE9iaigpKWluc3RhbmNlb2YgbC5CYXNlU3RyZWFtfHx0aGlzLl9jYWNoZU1hcC5zZXQoYyx0KSx0fWZldGNoQ29tcHJlc3NlZChlLHQpe2NvbnN0IHI9dC5vZmZzZXQsbj10aGlzLmZldGNoKGkuUmVmLmdldChyLDApKTtpZighKG4gaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0pKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJiYWQgT2JqU3RtIHN0cmVhbSIpO2NvbnN0IGM9bi5kaWN0LmdldCgiRmlyc3QiKSxoPW4uZGljdC5nZXQoIk4iKTtpZighTnVtYmVyLmlzSW50ZWdlcihjKXx8IU51bWJlci5pc0ludGVnZXIoaCkpdGhyb3cgbmV3IGEuRm9ybWF0RXJyb3IoImludmFsaWQgZmlyc3QgYW5kIG4gcGFyYW1ldGVycyBmb3IgT2JqU3RtIHN0cmVhbSIpO2xldCB1PW5ldyBzLlBhcnNlcih7bGV4ZXI6bmV3IHMuTGV4ZXIobikseHJlZjp0aGlzLGFsbG93U3RyZWFtczohMH0pO2NvbnN0IGQ9bmV3IEFycmF5KGgpLGY9bmV3IEFycmF5KGgpO2ZvcihsZXQgZT0wO2U8aDsrK2Upe2NvbnN0IHQ9dS5nZXRPYmooKTtpZighTnVtYmVyLmlzSW50ZWdlcih0KSl0aHJvdyBuZXcgYS5Gb3JtYXRFcnJvcigiaW52YWxpZCBvYmplY3QgbnVtYmVyIGluIHRoZSBPYmpTdG0gc3RyZWFtOiAiLmNvbmNhdCh0KSk7Y29uc3Qgcj11LmdldE9iaigpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHIpKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJpbnZhbGlkIG9iamVjdCBvZmZzZXQgaW4gdGhlIE9ialN0bSBzdHJlYW06ICIuY29uY2F0KHIpKTtkW2VdPXQsZltlXT1yfWNvbnN0IGc9KG4uc3RhcnR8fDApK2MscD1uZXcgQXJyYXkoaCk7Zm9yKGxldCBlPTA7ZTxoOysrZSl7Y29uc3QgdD1lPGgtMT9mW2UrMV0tZltlXTp2b2lkIDA7aWYodDwwKXRocm93IG5ldyBhLkZvcm1hdEVycm9yKCJJbnZhbGlkIG9mZnNldCBpbiB0aGUgT2JqU3RtIHN0cmVhbS4iKTt1PW5ldyBzLlBhcnNlcih7bGV4ZXI6bmV3IHMuTGV4ZXIobi5tYWtlU3ViU3RyZWFtKGcrZltlXSx0LG4uZGljdCkpLHhyZWY6dGhpcyxhbGxvd1N0cmVhbXM6ITB9KTtjb25zdCBpPXUuZ2V0T2JqKCk7aWYocFtlXT1pLGkgaW5zdGFuY2VvZiBsLkJhc2VTdHJlYW0pY29udGludWU7Y29uc3Qgbz1kW2VdLGM9dGhpcy5lbnRyaWVzW29dO2MmJmMub2Zmc2V0PT09ciYmYy5nZW49PT1lJiZ0aGlzLl9jYWNoZU1hcC5zZXQobyxpKX1pZih2b2lkIDA9PT0odD1wW3QuZ2VuXSkpdGhyb3cgbmV3IG8uWFJlZkVudHJ5RXhjZXB0aW9uKCJCYWQgKGNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICIuY29uY2F0KGUpKTtyZXR1cm4gdH1hc3luYyBmZXRjaElmUmVmQXN5bmMoZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIGkuUmVmP3RoaXMuZmV0Y2hBc3luYyhlLHQpOmV9YXN5bmMgZmV0Y2hBc3luYyhlLHQpe3RyeXtyZXR1cm4gdGhpcy5mZXRjaChlLHQpfWNhdGNoKHIpe2lmKCEociBpbnN0YW5jZW9mIG8uTWlzc2luZ0RhdGFFeGNlcHRpb24pKXRocm93IHI7cmV0dXJuIGF3YWl0IHRoaXMucGRmTWFuYWdlci5yZXF1ZXN0UmFuZ2Uoci5iZWdpbixyLmVuZCksdGhpcy5mZXRjaEFzeW5jKGUsdCl9fWdldENhdGFsb2dPYmooKXtyZXR1cm4gdGhpcy5yb290fX0pfSwoZSx0LHIpPT57dmFyIG4sYSxpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0Lk1lc3NhZ2VIYW5kbGVyPXZvaWQgMCxyKDIpO3ZhciBjPXIoMTQ0KTtmdW5jdGlvbiBsKGUpe3N3aXRjaChlIGluc3RhbmNlb2YgRXJyb3J8fCJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV8fCgwLGMudW5yZWFjaGFibGUpKCd3cmFwUmVhc29uOiBFeHBlY3RlZCAicmVhc29uIiB0byBiZSBhIChwb3NzaWJseSBjbG9uZWQpIEVycm9yLicpLGUubmFtZSl7Y2FzZSJBYm9ydEV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBjLkFib3J0RXhjZXB0aW9uKGUubWVzc2FnZSk7Y2FzZSJNaXNzaW5nUERGRXhjZXB0aW9uIjpyZXR1cm4gbmV3IGMuTWlzc2luZ1BERkV4Y2VwdGlvbihlLm1lc3NhZ2UpO2Nhc2UiUGFzc3dvcmRFeGNlcHRpb24iOnJldHVybiBuZXcgYy5QYXNzd29yZEV4Y2VwdGlvbihlLm1lc3NhZ2UsZS5jb2RlKTtjYXNlIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiI6cmV0dXJuIG5ldyBjLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihlLm1lc3NhZ2UsZS5zdGF0dXMpO2Nhc2UiVW5rbm93bkVycm9yRXhjZXB0aW9uIjpyZXR1cm4gbmV3IGMuVW5rbm93bkVycm9yRXhjZXB0aW9uKGUubWVzc2FnZSxlLmRldGFpbHMpO2RlZmF1bHQ6cmV0dXJuIG5ldyBjLlVua25vd25FcnJvckV4Y2VwdGlvbihlLm1lc3NhZ2UsZS50b1N0cmluZygpKX19ZnVuY3Rpb24gaChlKXtjb25zdCB0PWUuc3RyZWFtSWQscj10aGlzLnNvdXJjZU5hbWUsbj1lLnNvdXJjZU5hbWUsYT10aGlzLmNvbU9iaixpPXRoaXMscz10aGlzLmFjdGlvbkhhbmRsZXJbZS5hY3Rpb25dLG89e2VucXVldWUoZSl7bGV0IGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjEscz1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZih0aGlzLmlzQ2FuY2VsbGVkKXJldHVybjtjb25zdCBvPXRoaXMuZGVzaXJlZFNpemU7dGhpcy5kZXNpcmVkU2l6ZS09aSxvPjAmJnRoaXMuZGVzaXJlZFNpemU8PTAmJih0aGlzLnNpbmtDYXBhYmlsaXR5PW5ldyBjLlByb21pc2VDYXBhYmlsaXR5LHRoaXMucmVhZHk9dGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlKSxhLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbTo0LHN0cmVhbUlkOnQsY2h1bms6ZX0scyl9LGNsb3NlKCl7dGhpcy5pc0NhbmNlbGxlZHx8KHRoaXMuaXNDYW5jZWxsZWQ9ITAsYS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6bixzdHJlYW06MyxzdHJlYW1JZDp0fSksZGVsZXRlIGkuc3RyZWFtU2lua3NbdF0pfSxlcnJvcihlKXsoMCxjLmFzc2VydCkoZSBpbnN0YW5jZW9mIEVycm9yLCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKSx0aGlzLmlzQ2FuY2VsbGVkfHwodGhpcy5pc0NhbmNlbGxlZD0hMCxhLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbTo1LHN0cmVhbUlkOnQscmVhc29uOmwoZSl9KSl9LHNpbmtDYXBhYmlsaXR5Om5ldyBjLlByb21pc2VDYXBhYmlsaXR5LG9uUHVsbDpudWxsLG9uQ2FuY2VsOm51bGwsaXNDYW5jZWxsZWQ6ITEsZGVzaXJlZFNpemU6ZS5kZXNpcmVkU2l6ZSxyZWFkeTpudWxsfTtvLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKSxvLnJlYWR5PW8uc2lua0NhcGFiaWxpdHkucHJvbWlzZSx0aGlzLnN0cmVhbVNpbmtzW3RdPW8sbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3QocyhlLmRhdGEsbykpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6bixzdHJlYW06OCxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbTo4LHN0cmVhbUlkOnQscmVhc29uOmwoZSl9KX0pKX1mdW5jdGlvbiB1KGUpe2NvbnN0IHQ9ZS5zdHJlYW1JZCxyPXRoaXMuc291cmNlTmFtZSxuPWUuc291cmNlTmFtZSxhPXRoaXMuY29tT2JqLHM9dGhpcy5zdHJlYW1Db250cm9sbGVyc1t0XSxoPXRoaXMuc3RyZWFtU2lua3NbdF07c3dpdGNoKGUuc3RyZWFtKXtjYXNlIDg6ZS5zdWNjZXNzP3Muc3RhcnRDYWxsLnJlc29sdmUoKTpzLnN0YXJ0Q2FsbC5yZWplY3QobChlLnJlYXNvbikpO2JyZWFrO2Nhc2UgNzplLnN1Y2Nlc3M/cy5wdWxsQ2FsbC5yZXNvbHZlKCk6cy5wdWxsQ2FsbC5yZWplY3QobChlLnJlYXNvbikpO2JyZWFrO2Nhc2UgNjppZighaCl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6bixzdHJlYW06NyxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KTticmVha31oLmRlc2lyZWRTaXplPD0wJiZlLmRlc2lyZWRTaXplPjAmJmguc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpLGguZGVzaXJlZFNpemU9ZS5kZXNpcmVkU2l6ZSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dmFyIHQ7ZShudWxsPT09KHQ9aC5vblB1bGwpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmNhbGwoaCkpfSkpLnRoZW4oKGZ1bmN0aW9uKCl7YS5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTpyLHRhcmdldE5hbWU6bixzdHJlYW06NyxzdHJlYW1JZDp0LHN1Y2Nlc3M6ITB9KX0pLChmdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbTo3LHN0cmVhbUlkOnQscmVhc29uOmwoZSl9KX0pKTticmVhaztjYXNlIDQ6aWYoKDAsYy5hc3NlcnQpKHMsImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKSxzLmlzQ2xvc2VkKWJyZWFrO3MuY29udHJvbGxlci5lbnF1ZXVlKGUuY2h1bmspO2JyZWFrO2Nhc2UgMzppZigoMCxjLmFzc2VydCkocywiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKSxzLmlzQ2xvc2VkKWJyZWFrO3MuaXNDbG9zZWQ9ITAscy5jb250cm9sbGVyLmNsb3NlKCksbyh0aGlzLGksZCkuY2FsbCh0aGlzLHMsdCk7YnJlYWs7Y2FzZSA1OigwLGMuYXNzZXJ0KShzLCJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpLHMuY29udHJvbGxlci5lcnJvcihsKGUucmVhc29uKSksbyh0aGlzLGksZCkuY2FsbCh0aGlzLHMsdCk7YnJlYWs7Y2FzZSAyOmUuc3VjY2Vzcz9zLmNhbmNlbENhbGwucmVzb2x2ZSgpOnMuY2FuY2VsQ2FsbC5yZWplY3QobChlLnJlYXNvbikpLG8odGhpcyxpLGQpLmNhbGwodGhpcyxzLHQpO2JyZWFrO2Nhc2UgMTppZighaClicmVhaztuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCl7dmFyIHI7dChudWxsPT09KHI9aC5vbkNhbmNlbCl8fHZvaWQgMD09PXI/dm9pZCAwOnIuY2FsbChoLGwoZS5yZWFzb24pKSl9KSkudGhlbigoZnVuY3Rpb24oKXthLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnIsdGFyZ2V0TmFtZTpuLHN0cmVhbToyLHN0cmVhbUlkOnQsc3VjY2VzczohMH0pfSksKGZ1bmN0aW9uKGUpe2EucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6cix0YXJnZXROYW1lOm4sc3RyZWFtOjIsc3RyZWFtSWQ6dCxyZWFzb246bChlKX0pfSkpLGguc2lua0NhcGFiaWxpdHkucmVqZWN0KGwoZS5yZWFzb24pKSxoLmlzQ2FuY2VsbGVkPSEwLGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3RdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHN0cmVhbSBjYXNlIil9fWFzeW5jIGZ1bmN0aW9uIGQoZSx0KXt2YXIgcixuLGE7YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtudWxsPT09KHI9ZS5zdGFydENhbGwpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnByb21pc2UsbnVsbD09PShuPWUucHVsbENhbGwpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnByb21pc2UsbnVsbD09PShhPWUuY2FuY2VsQ2FsbCl8fHZvaWQgMD09PWE/dm9pZCAwOmEucHJvbWlzZV0pLGRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3RdfXQuTWVzc2FnZUhhbmRsZXI9KG49bmV3IFdlYWtTZXQsYT1uZXcgV2Vha1NldCxpPW5ldyBXZWFrU2V0LGNsYXNze2NvbnN0cnVjdG9yKGUsdCxyKXtzKHRoaXMsaSkscyh0aGlzLGEpLHModGhpcyxuKSx0aGlzLnNvdXJjZU5hbWU9ZSx0aGlzLnRhcmdldE5hbWU9dCx0aGlzLmNvbU9iaj1yLHRoaXMuY2FsbGJhY2tJZD0xLHRoaXMuc3RyZWFtSWQ9MSx0aGlzLnN0cmVhbVNpbmtzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5zdHJlYW1Db250cm9sbGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmFjdGlvbkhhbmRsZXI9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9vbkNvbU9iak9uTWVzc2FnZT1lPT57Y29uc3QgdD1lLmRhdGE7aWYodC50YXJnZXROYW1lIT09dGhpcy5zb3VyY2VOYW1lKXJldHVybjtpZih0LnN0cmVhbSlyZXR1cm4gdm9pZCBvKHRoaXMsYSx1KS5jYWxsKHRoaXMsdCk7aWYodC5jYWxsYmFjayl7Y29uc3QgZT10LmNhbGxiYWNrSWQscj10aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2VdO2lmKCFyKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgIi5jb25jYXQoZSkpO2lmKGRlbGV0ZSB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2VdLDE9PT10LmNhbGxiYWNrKXIucmVzb2x2ZSh0LmRhdGEpO2Vsc2V7aWYoMiE9PXQuY2FsbGJhY2spdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2UiKTtyLnJlamVjdChsKHQucmVhc29uKSl9cmV0dXJufWNvbnN0IGk9dGhpcy5hY3Rpb25IYW5kbGVyW3QuYWN0aW9uXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAiLmNvbmNhdCh0LmFjdGlvbikpO2lmKHQuY2FsbGJhY2tJZCl7Y29uc3QgZT10aGlzLnNvdXJjZU5hbWUsbj10LnNvdXJjZU5hbWU7bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe2UoaSh0LmRhdGEpKX0pKS50aGVuKChmdW5jdGlvbihhKXtyLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmUsdGFyZ2V0TmFtZTpuLGNhbGxiYWNrOjEsY2FsbGJhY2tJZDp0LmNhbGxiYWNrSWQsZGF0YTphfSl9KSwoZnVuY3Rpb24oYSl7ci5wb3N0TWVzc2FnZSh7c291cmNlTmFtZTplLHRhcmdldE5hbWU6bixjYWxsYmFjazoyLGNhbGxiYWNrSWQ6dC5jYWxsYmFja0lkLHJlYXNvbjpsKGEpfSl9KSl9ZWxzZSB0LnN0cmVhbUlkP28odGhpcyxuLGgpLmNhbGwodGhpcyx0KTppKHQuZGF0YSl9LHIuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpfW9uKGUsdCl7Y29uc3Qgcj10aGlzLmFjdGlvbkhhbmRsZXI7aWYocltlXSl0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgIicuY29uY2F0KGUsJyInKSk7cltlXT10fXNlbmQoZSx0LHIpe3RoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOnRoaXMuc291cmNlTmFtZSx0YXJnZXROYW1lOnRoaXMudGFyZ2V0TmFtZSxhY3Rpb246ZSxkYXRhOnR9LHIpfXNlbmRXaXRoUHJvbWlzZShlLHQscil7Y29uc3Qgbj10aGlzLmNhbGxiYWNrSWQrKyxhPW5ldyBjLlByb21pc2VDYXBhYmlsaXR5O3RoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbbl09YTt0cnl7dGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6dGhpcy5zb3VyY2VOYW1lLHRhcmdldE5hbWU6dGhpcy50YXJnZXROYW1lLGFjdGlvbjplLGNhbGxiYWNrSWQ6bixkYXRhOnR9LHIpfWNhdGNoKGUpe2EucmVqZWN0KGUpfXJldHVybiBhLnByb21pc2V9c2VuZFdpdGhTdHJlYW0oZSx0LHIsbil7Y29uc3QgYT10aGlzLnN0cmVhbUlkKyssaT10aGlzLnNvdXJjZU5hbWUscz10aGlzLnRhcmdldE5hbWUsbz10aGlzLmNvbU9iajtyZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtzdGFydDpyPT57Y29uc3QgbD1uZXcgYy5Qcm9taXNlQ2FwYWJpbGl0eTtyZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyc1thXT17Y29udHJvbGxlcjpyLHN0YXJ0Q2FsbDpsLHB1bGxDYWxsOm51bGwsY2FuY2VsQ2FsbDpudWxsLGlzQ2xvc2VkOiExfSxvLnBvc3RNZXNzYWdlKHtzb3VyY2VOYW1lOmksdGFyZ2V0TmFtZTpzLGFjdGlvbjplLHN0cmVhbUlkOmEsZGF0YTp0LGRlc2lyZWRTaXplOnIuZGVzaXJlZFNpemV9LG4pLGwucHJvbWlzZX0scHVsbDplPT57Y29uc3QgdD1uZXcgYy5Qcm9taXNlQ2FwYWJpbGl0eTtyZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyc1thXS5wdWxsQ2FsbD10LG8ucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6aSx0YXJnZXROYW1lOnMsc3RyZWFtOjYsc3RyZWFtSWQ6YSxkZXNpcmVkU2l6ZTplLmRlc2lyZWRTaXplfSksdC5wcm9taXNlfSxjYW5jZWw6ZT0+eygwLGMuYXNzZXJ0KShlIGluc3RhbmNlb2YgRXJyb3IsImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTtjb25zdCB0PW5ldyBjLlByb21pc2VDYXBhYmlsaXR5O3JldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2FdLmNhbmNlbENhbGw9dCx0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW2FdLmlzQ2xvc2VkPSEwLG8ucG9zdE1lc3NhZ2Uoe3NvdXJjZU5hbWU6aSx0YXJnZXROYW1lOnMsc3RyZWFtOjEsc3RyZWFtSWQ6YSxyZWFzb246bChlKX0pLHQucHJvbWlzZX19LHIpfWRlc3Ryb3koKXt0aGlzLmNvbU9iai5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSl9fSl9LChlLHQscik9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5QREZXb3JrZXJTdHJlYW09dm9pZCAwLHIoMTM5KTt2YXIgbj1yKDE0NCk7dC5QREZXb3JrZXJTdHJlYW09Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fbXNnSGFuZGxlcj1lLHRoaXMuX2NvbnRlbnRMZW5ndGg9bnVsbCx0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj1udWxsLHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnM9W119Z2V0RnVsbFJlYWRlcigpe3JldHVybigwLG4uYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIlBERldvcmtlclN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpLHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPW5ldyBhKHRoaXMuX21zZ0hhbmRsZXIpLHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyfWdldFJhbmdlUmVhZGVyKGUsdCl7Y29uc3Qgcj1uZXcgaShlLHQsdGhpcy5fbXNnSGFuZGxlcik7cmV0dXJuIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyKSxyfWNhbmNlbEFsbFJlcXVlc3RzKGUpe3RoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyJiZ0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5jYW5jZWwoZSk7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSl0LmNhbmNlbChlKX19O2NsYXNzIGF7Y29uc3RydWN0b3IoZSl7dGhpcy5fbXNnSGFuZGxlcj1lLHRoaXMub25Qcm9ncmVzcz1udWxsLHRoaXMuX2NvbnRlbnRMZW5ndGg9bnVsbCx0aGlzLl9pc1JhbmdlU3VwcG9ydGVkPSExLHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkPSExO2NvbnN0IHQ9dGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmVhZGVyIik7dGhpcy5fcmVhZGVyPXQuZ2V0UmVhZGVyKCksdGhpcy5faGVhZGVyc1JlYWR5PXRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJSZWFkZXJIZWFkZXJzUmVhZHkiKS50aGVuKChlPT57dGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ9ZS5pc1N0cmVhbWluZ1N1cHBvcnRlZCx0aGlzLl9pc1JhbmdlU3VwcG9ydGVkPWUuaXNSYW5nZVN1cHBvcnRlZCx0aGlzLl9jb250ZW50TGVuZ3RoPWUuY29udGVudExlbmd0aH0pKX1nZXQgaGVhZGVyc1JlYWR5KCl7cmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeX1nZXQgY29udGVudExlbmd0aCgpe3JldHVybiB0aGlzLl9jb250ZW50TGVuZ3RofWdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpe3JldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZH1nZXQgaXNSYW5nZVN1cHBvcnRlZCgpe3JldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkfWFzeW5jIHJlYWQoKXtjb25zdHt2YWx1ZTplLGRvbmU6dH09YXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtyZXR1cm4gdD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Ont2YWx1ZTplLmJ1ZmZlcixkb25lOiExfX1jYW5jZWwoZSl7dGhpcy5fcmVhZGVyLmNhbmNlbChlKX19Y2xhc3MgaXtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5fbXNnSGFuZGxlcj1yLHRoaXMub25Qcm9ncmVzcz1udWxsO2NvbnN0IG49dGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmFuZ2VSZWFkZXIiLHtiZWdpbjplLGVuZDp0fSk7dGhpcy5fcmVhZGVyPW4uZ2V0UmVhZGVyKCl9Z2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCl7cmV0dXJuITF9YXN5bmMgcmVhZCgpe2NvbnN0e3ZhbHVlOmUsZG9uZTp0fT1hd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO3JldHVybiB0P3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06e3ZhbHVlOmUuYnVmZmVyLGRvbmU6ITF9fWNhbmNlbChlKXt0aGlzLl9yZWFkZXIuY2FuY2VsKGUpfX19XSx0PXt9O2Z1bmN0aW9uIG4ocil7dmFyIGE9dFtyXTtpZih2b2lkIDAhPT1hKXJldHVybiBhLmV4cG9ydHM7dmFyIGk9dFtyXT17ZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5leHBvcnRzfW4uZD0oZSx0KT0+e2Zvcih2YXIgciBpbiB0KW4ubyh0LHIpJiYhbi5vKGUscikmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIse2VudW1lcmFibGU6ITAsZ2V0OnRbcl19KX0sbi5vPShlLHQpPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSxuLnI9ZT0+eyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9O3ZhciBhPXt9O3JldHVybigoKT0+e3ZhciBlPWE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJXb3JrZXJNZXNzYWdlSGFuZGxlciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuV29ya2VyTWVzc2FnZUhhbmRsZXJ9fSk7dmFyIHQ9bigxKX0pKCksYX0pKCksIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2UuZXhwb3J0cz1hKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmci5hbWRPP2RlZmluZSgicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyIixbXSxhKToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1sicGRmanMtZGlzdC9idWlsZC9wZGYud29ya2VyIl09YSgpOm5bInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciJdPW4ucGRmanNXb3JrZXI9YSgpfSw5NjYyOihlLHQscik9Pnt2YXIgbj1yKDYxNCksYT1yKDYzMzApLGk9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihuKGUpKXJldHVybiBlO3Rocm93IGkoYShlKSsiIGlzIG5vdCBhIGZ1bmN0aW9uIil9fSw5NDgzOihlLHQscik9Pnt2YXIgbj1yKDQ0MTEpLGE9cig2MzMwKSxpPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobihlKSlyZXR1cm4gZTt0aHJvdyBpKGEoZSkrIiBpcyBub3QgYSBjb25zdHJ1Y3RvciIpfX0sNjA3NzooZSx0LHIpPT57dmFyIG49cig2MTQpLGE9U3RyaW5nLGk9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGV8fG4oZSkpcmV0dXJuIGU7dGhyb3cgaSgiQ2FuJ3Qgc2V0ICIrYShlKSsiIGFzIGEgcHJvdG90eXBlIil9fSwxMjIzOihlLHQscik9Pnt2YXIgbj1yKDUxMTIpLGE9cigzMCksaT1yKDMwNzApLmYscz1uKCJ1bnNjb3BhYmxlcyIpLG89QXJyYXkucHJvdG90eXBlO251bGw9PW9bc10mJmkobyxzLHtjb25maWd1cmFibGU6ITAsdmFsdWU6YShudWxsKX0pLGUuZXhwb3J0cz1mdW5jdGlvbihlKXtvW3NdW2VdPSEwfX0sMTUzMDooZSx0LHIpPT57dmFyIG49cig4NzEwKS5jaGFyQXQ7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdCsocj9uKGUsdCkubGVuZ3RoOjEpfX0sNTc4NzooZSx0LHIpPT57dmFyIG49cig3OTc2KSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihuKHQsZSkpcmV0dXJuIGU7dGhyb3cgYSgiSW5jb3JyZWN0IGludm9jYXRpb24iKX19LDk2NzA6KGUsdCxyKT0+e3ZhciBuPXIoMTExKSxhPVN0cmluZyxpPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobihlKSlyZXR1cm4gZTt0aHJvdyBpKGEoZSkrIiBpcyBub3QgYW4gb2JqZWN0Iil9fSwzMDEzOmU9PntlLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBEYXRhVmlld30sNzU1NjooZSx0LHIpPT57dmFyIG49cig3MjkzKTtlLmV4cG9ydHM9bigoZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIpe3ZhciBlPW5ldyBBcnJheUJ1ZmZlcig4KTtPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiYSIse3ZhbHVlOjh9KX19KSl9LDI2MDooZSx0LHIpPT57dmFyIG4sYSxpLHM9cigzMDEzKSxvPXIoOTc4MSksYz1yKDc4NTQpLGw9cig2MTQpLGg9cigxMTEpLHU9cigyNTk3KSxkPXIoNjQ4KSxmPXIoNjMzMCksZz1yKDg4ODApLHA9cig4MDUyKSxtPXIoNzA0NSksYj1yKDc5NzYpLHk9cig5NTE4KSx3PXIoNzY3NCksdj1yKDUxMTIpLHg9cig5NzExKSxTPXIoOTkwOSksQT1TLmVuZm9yY2Usaz1TLmdldCxDPWMuSW50OEFycmF5LE89QyYmQy5wcm90b3R5cGUsRj1jLlVpbnQ4Q2xhbXBlZEFycmF5LEk9RiYmRi5wcm90b3R5cGUsVD1DJiZ5KEMpLE09TyYmeShPKSxFPU9iamVjdC5wcm90b3R5cGUsUD1jLlR5cGVFcnJvcixSPXYoInRvU3RyaW5nVGFnIiksTj14KCJUWVBFRF9BUlJBWV9UQUciKSxEPSJUeXBlZEFycmF5Q29uc3RydWN0b3IiLEI9cyYmISF3JiYiT3BlcmEiIT09ZChjLm9wZXJhKSxMPSExLF89e0ludDhBcnJheToxLFVpbnQ4QXJyYXk6MSxVaW50OENsYW1wZWRBcnJheToxLEludDE2QXJyYXk6MixVaW50MTZBcnJheToyLEludDMyQXJyYXk6NCxVaW50MzJBcnJheTo0LEZsb2F0MzJBcnJheTo0LEZsb2F0NjRBcnJheTo4fSxqPXtCaWdJbnQ2NEFycmF5OjgsQmlnVWludDY0QXJyYXk6OH0sVT1mdW5jdGlvbihlKXt2YXIgdD15KGUpO2lmKGgodCkpe3ZhciByPWsodCk7cmV0dXJuIHImJnUocixEKT9yW0RdOlUodCl9fSwkPWZ1bmN0aW9uKGUpe2lmKCFoKGUpKXJldHVybiExO3ZhciB0PWQoZSk7cmV0dXJuIHUoXyx0KXx8dShqLHQpfTtmb3IobiBpbiBfKShpPShhPWNbbl0pJiZhLnByb3RvdHlwZSk/QShpKVtEXT1hOkI9ITE7Zm9yKG4gaW4gaikoaT0oYT1jW25dKSYmYS5wcm90b3R5cGUpJiYoQShpKVtEXT1hKTtpZigoIUJ8fCFsKFQpfHxUPT09RnVuY3Rpb24ucHJvdG90eXBlKSYmKFQ9ZnVuY3Rpb24oKXt0aHJvdyBQKCJJbmNvcnJlY3QgaW52b2NhdGlvbiIpfSxCKSlmb3IobiBpbiBfKWNbbl0mJncoY1tuXSxUKTtpZigoIUJ8fCFNfHxNPT09RSkmJihNPVQucHJvdG90eXBlLEIpKWZvcihuIGluIF8pY1tuXSYmdyhjW25dLnByb3RvdHlwZSxNKTtpZihCJiZ5KEkpIT09TSYmdyhJLE0pLG8mJiF1KE0sUikpZm9yKG4gaW4gTD0hMCxtKE0sUix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMpP3RoaXNbTl06dm9pZCAwfX0pLF8pY1tuXSYmZyhjW25dLE4sbik7ZS5leHBvcnRzPXtOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOkIsVFlQRURfQVJSQVlfVEFHOkwmJk4sYVR5cGVkQXJyYXk6ZnVuY3Rpb24oZSl7aWYoJChlKSlyZXR1cm4gZTt0aHJvdyBQKCJUYXJnZXQgaXMgbm90IGEgdHlwZWQgYXJyYXkiKX0sYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtpZihsKGUpJiYoIXd8fGIoVCxlKSkpcmV0dXJuIGU7dGhyb3cgUChmKGUpKyIgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IiKX0sZXhwb3J0VHlwZWRBcnJheU1ldGhvZDpmdW5jdGlvbihlLHQscixuKXtpZihvKXtpZihyKWZvcih2YXIgYSBpbiBfKXt2YXIgaT1jW2FdO2lmKGkmJnUoaS5wcm90b3R5cGUsZSkpdHJ5e2RlbGV0ZSBpLnByb3RvdHlwZVtlXX1jYXRjaChyKXt0cnl7aS5wcm90b3R5cGVbZV09dH1jYXRjaChlKXt9fX1NW2VdJiYhcnx8cChNLGUscj90OkImJk9bZV18fHQsbil9fSxleHBvcnRUeXBlZEFycmF5U3RhdGljTWV0aG9kOmZ1bmN0aW9uKGUsdCxyKXt2YXIgbixhO2lmKG8pe2lmKHcpe2lmKHIpZm9yKG4gaW4gXylpZigoYT1jW25dKSYmdShhLGUpKXRyeXtkZWxldGUgYVtlXX1jYXRjaChlKXt9aWYoVFtlXSYmIXIpcmV0dXJuO3RyeXtyZXR1cm4gcChULGUscj90OkImJlRbZV18fHQpfWNhdGNoKGUpe319Zm9yKG4gaW4gXykhKGE9Y1tuXSl8fGFbZV0mJiFyfHxwKGEsZSx0KX19LGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjpVLGlzVmlldzpmdW5jdGlvbihlKXtpZighaChlKSlyZXR1cm4hMTt2YXIgdD1kKGUpO3JldHVybiJEYXRhVmlldyI9PT10fHx1KF8sdCl8fHUoaix0KX0saXNUeXBlZEFycmF5OiQsVHlwZWRBcnJheTpULFR5cGVkQXJyYXlQcm90b3R5cGU6TX19LDMzMzE6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDE3MDIpLGk9cig5NzgxKSxzPXIoMzAxMyksbz1yKDY1MzApLGM9cig4ODgwKSxsPXIoNzA0NSksaD1yKDkxOTApLHU9cig3MjkzKSxkPXIoNTc4NyksZj1yKDkzMDMpLGc9cig3NDY2KSxwPXIoNzA2NyksbT1yKDExNzkpLGI9cig5NTE4KSx5PXIoNzY3NCksdz1yKDgwMDYpLmYsdj1yKDEyODUpLHg9cigxNTg5KSxTPXIoODAwMyksQT1yKDk5MDkpLGs9by5QUk9QRVIsQz1vLkNPTkZJR1VSQUJMRSxPPSJBcnJheUJ1ZmZlciIsRj0iRGF0YVZpZXciLEk9InByb3RvdHlwZSIsVD0iV3JvbmcgaW5kZXgiLE09QS5nZXR0ZXJGb3IoTyksRT1BLmdldHRlckZvcihGKSxQPUEuc2V0LFI9bltPXSxOPVIsRD1OJiZOW0ldLEI9bltGXSxMPUImJkJbSV0sXz1PYmplY3QucHJvdG90eXBlLGo9bi5BcnJheSxVPW4uUmFuZ2VFcnJvciwkPWEodiksWD1hKFtdLnJldmVyc2UpLEg9bS5wYWNrLHE9bS51bnBhY2ssej1mdW5jdGlvbihlKXtyZXR1cm5bMjU1JmVdfSxHPWZ1bmN0aW9uKGUpe3JldHVyblsyNTUmZSxlPj44JjI1NV19LFc9ZnVuY3Rpb24oZSl7cmV0dXJuWzI1NSZlLGU+PjgmMjU1LGU+PjE2JjI1NSxlPj4yNCYyNTVdfSxWPWZ1bmN0aW9uKGUpe3JldHVybiBlWzNdPDwyNHxlWzJdPDwxNnxlWzFdPDw4fGVbMF19LEs9ZnVuY3Rpb24oZSl7cmV0dXJuIEgoZSwyMyw0KX0sWT1mdW5jdGlvbihlKXtyZXR1cm4gSChlLDUyLDgpfSxKPWZ1bmN0aW9uKGUsdCxyKXtsKGVbSV0sdCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByKHRoaXMpW3RdfX0pfSxaPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhPUUoZSksaT1wKHIpLHM9ISFuO2lmKGkrdD5hLmJ5dGVMZW5ndGgpdGhyb3cgVShUKTt2YXIgbz1hLmJ5dGVzLGM9aSthLmJ5dGVPZmZzZXQsbD14KG8sYyxjK3QpO3JldHVybiBzP2w6WChsKX0sUT1mdW5jdGlvbihlLHQscixuLGEsaSl7dmFyIHM9RShlKSxvPXAociksYz1uKCthKSxsPSEhaTtpZihvK3Q+cy5ieXRlTGVuZ3RoKXRocm93IFUoVCk7Zm9yKHZhciBoPXMuYnl0ZXMsdT1vK3MuYnl0ZU9mZnNldCxkPTA7ZDx0O2QrKyloW3UrZF09Y1tsP2Q6dC1kLTFdfTtpZihzKXt2YXIgZWU9ayYmUi5uYW1lIT09TztpZih1KChmdW5jdGlvbigpe1IoMSl9KSkmJnUoKGZ1bmN0aW9uKCl7bmV3IFIoLTEpfSkpJiYhdSgoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFIsbmV3IFIoMS41KSxuZXcgUihOYU4pLDEhPVIubGVuZ3RofHxlZSYmIUN9KSkpZWUmJkMmJmMoUiwibmFtZSIsTyk7ZWxzZXsoTj1mdW5jdGlvbihlKXtyZXR1cm4gZCh0aGlzLEQpLG5ldyBSKHAoZSkpfSlbSV09RDtmb3IodmFyIHRlLHJlPXcoUiksbmU9MDtyZS5sZW5ndGg+bmU7KSh0ZT1yZVtuZSsrXSlpbiBOfHxjKE4sdGUsUlt0ZV0pO0QuY29uc3RydWN0b3I9Tn15JiZiKEwpIT09XyYmeShMLF8pO3ZhciBhZT1uZXcgQihuZXcgTigyKSksaWU9YShMLnNldEludDgpO2FlLnNldEludDgoMCwyMTQ3NDgzNjQ4KSxhZS5zZXRJbnQ4KDEsMjE0NzQ4MzY0OSksIWFlLmdldEludDgoMCkmJmFlLmdldEludDgoMSl8fGgoTCx7c2V0SW50ODpmdW5jdGlvbihlLHQpe2llKHRoaXMsZSx0PDwyND4+MjQpfSxzZXRVaW50ODpmdW5jdGlvbihlLHQpe2llKHRoaXMsZSx0PDwyND4+MjQpfX0se3Vuc2FmZTohMH0pfWVsc2UgRD0oTj1mdW5jdGlvbihlKXtkKHRoaXMsRCk7dmFyIHQ9cChlKTtQKHRoaXMse3R5cGU6TyxieXRlczokKGoodCksMCksYnl0ZUxlbmd0aDp0fSksaXx8KHRoaXMuYnl0ZUxlbmd0aD10LHRoaXMuZGV0YWNoZWQ9ITEpfSlbSV0sTD0oQj1mdW5jdGlvbihlLHQscil7ZCh0aGlzLEwpLGQoZSxEKTt2YXIgbj1NKGUpLGE9bi5ieXRlTGVuZ3RoLHM9Zih0KTtpZihzPDB8fHM+YSl0aHJvdyBVKCJXcm9uZyBvZmZzZXQiKTtpZihzKyhyPXZvaWQgMD09PXI/YS1zOmcocikpPmEpdGhyb3cgVSgiV3JvbmcgbGVuZ3RoIik7UCh0aGlzLHt0eXBlOkYsYnVmZmVyOmUsYnl0ZUxlbmd0aDpyLGJ5dGVPZmZzZXQ6cyxieXRlczpuLmJ5dGVzfSksaXx8KHRoaXMuYnVmZmVyPWUsdGhpcy5ieXRlTGVuZ3RoPXIsdGhpcy5ieXRlT2Zmc2V0PXMpfSlbSV0saSYmKEooTiwiYnl0ZUxlbmd0aCIsTSksSihCLCJidWZmZXIiLEUpLEooQiwiYnl0ZUxlbmd0aCIsRSksSihCLCJieXRlT2Zmc2V0IixFKSksaChMLHtnZXRJbnQ4OmZ1bmN0aW9uKGUpe3JldHVybiBaKHRoaXMsMSxlKVswXTw8MjQ+PjI0fSxnZXRVaW50ODpmdW5jdGlvbihlKXtyZXR1cm4gWih0aGlzLDEsZSlbMF19LGdldEludDE2OmZ1bmN0aW9uKGUpe3ZhciB0PVoodGhpcywyLGUsYXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0pO3JldHVybih0WzFdPDw4fHRbMF0pPDwxNj4+MTZ9LGdldFVpbnQxNjpmdW5jdGlvbihlKXt2YXIgdD1aKHRoaXMsMixlLGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdKTtyZXR1cm4gdFsxXTw8OHx0WzBdfSxnZXRJbnQzMjpmdW5jdGlvbihlKXtyZXR1cm4gVihaKHRoaXMsNCxlLGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdKSl9LGdldFVpbnQzMjpmdW5jdGlvbihlKXtyZXR1cm4gVihaKHRoaXMsNCxlLGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdKSk+Pj4wfSxnZXRGbG9hdDMyOmZ1bmN0aW9uKGUpe3JldHVybiBxKFoodGhpcyw0LGUsYXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0pLDIzKX0sZ2V0RmxvYXQ2NDpmdW5jdGlvbihlKXtyZXR1cm4gcShaKHRoaXMsOCxlLGFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdKSw1Mil9LHNldEludDg6ZnVuY3Rpb24oZSx0KXtRKHRoaXMsMSxlLHosdCl9LHNldFVpbnQ4OmZ1bmN0aW9uKGUsdCl7USh0aGlzLDEsZSx6LHQpfSxzZXRJbnQxNjpmdW5jdGlvbihlLHQpe1EodGhpcywyLGUsRyx0LGFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdKX0sc2V0VWludDE2OmZ1bmN0aW9uKGUsdCl7USh0aGlzLDIsZSxHLHQsYXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0pfSxzZXRJbnQzMjpmdW5jdGlvbihlLHQpe1EodGhpcyw0LGUsVyx0LGFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdKX0sc2V0VWludDMyOmZ1bmN0aW9uKGUsdCl7USh0aGlzLDQsZSxXLHQsYXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0pfSxzZXRGbG9hdDMyOmZ1bmN0aW9uKGUsdCl7USh0aGlzLDQsZSxLLHQsYXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0pfSxzZXRGbG9hdDY0OmZ1bmN0aW9uKGUsdCl7USh0aGlzLDgsZSxZLHQsYXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0pfX0pO1MoTixPKSxTKEIsRiksZS5leHBvcnRzPXtBcnJheUJ1ZmZlcjpOLERhdGFWaWV3OkJ9fSwxMjg1OihlLHQscik9Pnt2YXIgbj1yKDc5MDgpLGE9cigxNDAwKSxpPXIoNjI0NCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1uKHRoaXMpLHI9aSh0KSxzPWFyZ3VtZW50cy5sZW5ndGgsbz1hKHM+MT9hcmd1bWVudHNbMV06dm9pZCAwLHIpLGM9cz4yP2FyZ3VtZW50c1syXTp2b2lkIDAsbD12b2lkIDA9PT1jP3I6YShjLHIpO2w+bzspdFtvKytdPWU7cmV0dXJuIHR9fSw3NzQ1OihlLHQscik9Pnt2YXIgbj1yKDYyNDQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj0wLGE9bih0KSxpPW5ldyBlKGEpO2E+cjspaVtyXT10W3IrK107cmV0dXJuIGl9fSw4NDU3OihlLHQscik9Pnt2YXIgbj1yKDk5NzQpLGE9cig2OTE2KSxpPXIoNzkwOCkscz1yKDM0MTEpLG89cig3NjU5KSxjPXIoNDQxMSksbD1yKDYyNDQpLGg9cig2MTM1KSx1PXIoNDEyMSksZD1yKDEyNDYpLGY9QXJyYXk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWkoZSkscj1jKHRoaXMpLGc9YXJndW1lbnRzLmxlbmd0aCxwPWc+MT9hcmd1bWVudHNbMV06dm9pZCAwLG09dm9pZCAwIT09cDttJiYocD1uKHAsZz4yP2FyZ3VtZW50c1syXTp2b2lkIDApKTt2YXIgYix5LHcsdix4LFMsQT1kKHQpLGs9MDtpZighQXx8dGhpcz09PWYmJm8oQSkpZm9yKGI9bCh0KSx5PXI/bmV3IHRoaXMoYik6ZihiKTtiPms7aysrKVM9bT9wKHRba10sayk6dFtrXSxoKHksayxTKTtlbHNlIGZvcih4PSh2PXUodCxBKSkubmV4dCx5PXI/bmV3IHRoaXM6W107ISh3PWEoeCx2KSkuZG9uZTtrKyspUz1tP3ModixwLFt3LnZhbHVlLGtdLCEwKTp3LnZhbHVlLGgoeSxrLFMpO3JldHVybiB5Lmxlbmd0aD1rLHl9fSwxMzE4OihlLHQscik9Pnt2YXIgbj1yKDU2NTYpLGE9cigxNDAwKSxpPXIoNjI0NCkscz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyLHMpe3ZhciBvLGM9bih0KSxsPWkoYyksaD1hKHMsbCk7aWYoZSYmciE9cil7Zm9yKDtsPmg7KWlmKChvPWNbaCsrXSkhPW8pcmV0dXJuITB9ZWxzZSBmb3IoO2w+aDtoKyspaWYoKGV8fGggaW4gYykmJmNbaF09PT1yKXJldHVybiBlfHxofHwwO3JldHVybiFlJiYtMX19O2UuZXhwb3J0cz17aW5jbHVkZXM6cyghMCksaW5kZXhPZjpzKCExKX19LDk2NzE6KGUsdCxyKT0+e3ZhciBuPXIoOTk3NCksYT1yKDgzNjEpLGk9cig3OTA4KSxzPXIoNjI0NCksbz1mdW5jdGlvbihlKXt2YXIgdD0xPT1lO3JldHVybiBmdW5jdGlvbihyLG8sYyl7Zm9yKHZhciBsLGg9aShyKSx1PWEoaCksZD1uKG8sYyksZj1zKHUpO2YtLSA+MDspaWYoZChsPXVbZl0sZixoKSlzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiBsO2Nhc2UgMTpyZXR1cm4gZn1yZXR1cm4gdD8tMTp2b2lkIDB9fTtlLmV4cG9ydHM9e2ZpbmRMYXN0Om8oMCksZmluZExhc3RJbmRleDpvKDEpfX0sMjA5MjooZSx0LHIpPT57dmFyIG49cig5OTc0KSxhPXIoMTcwMiksaT1yKDgzNjEpLHM9cig3OTA4KSxvPXIoNjI0NCksYz1yKDU0MTcpLGw9YShbXS5wdXNoKSxoPWZ1bmN0aW9uKGUpe3ZhciB0PTE9PWUscj0yPT1lLGE9Mz09ZSxoPTQ9PWUsdT02PT1lLGQ9Nz09ZSxmPTU9PWV8fHU7cmV0dXJuIGZ1bmN0aW9uKGcscCxtLGIpe2Zvcih2YXIgeSx3LHY9cyhnKSx4PWkodiksUz1uKHAsbSksQT1vKHgpLGs9MCxDPWJ8fGMsTz10P0MoZyxBKTpyfHxkP0MoZywwKTp2b2lkIDA7QT5rO2srKylpZigoZnx8ayBpbiB4KSYmKHc9Uyh5PXhba10sayx2KSxlKSlpZih0KU9ba109dztlbHNlIGlmKHcpc3dpdGNoKGUpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBrO2Nhc2UgMjpsKE8seSl9ZWxzZSBzd2l0Y2goZSl7Y2FzZSA0OnJldHVybiExO2Nhc2UgNzpsKE8seSl9cmV0dXJuIHU/LTE6YXx8aD9oOk99fTtlLmV4cG9ydHM9e2ZvckVhY2g6aCgwKSxtYXA6aCgxKSxmaWx0ZXI6aCgyKSxzb21lOmgoMyksZXZlcnk6aCg0KSxmaW5kOmgoNSksZmluZEluZGV4OmgoNiksZmlsdGVyUmVqZWN0OmgoNyl9fSw5MzQxOihlLHQscik9Pnt2YXIgbj1yKDcyOTMpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPVtdW2VdO3JldHVybiEhciYmbigoZnVuY3Rpb24oKXtyLmNhbGwobnVsbCx0fHxmdW5jdGlvbigpe3JldHVybiAxfSwxKX0pKX19LDM2NzE6KGUsdCxyKT0+e3ZhciBuPXIoOTY2MiksYT1yKDc5MDgpLGk9cig4MzYxKSxzPXIoNjI0NCksbz1UeXBlRXJyb3IsYz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyLGMsbCl7bihyKTt2YXIgaD1hKHQpLHU9aShoKSxkPXMoaCksZj1lP2QtMTowLGc9ZT8tMToxO2lmKGM8Milmb3IoOzspe2lmKGYgaW4gdSl7bD11W2ZdLGYrPWc7YnJlYWt9aWYoZis9ZyxlP2Y8MDpkPD1mKXRocm93IG8oIlJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKX1mb3IoO2U/Zj49MDpkPmY7Zis9ZylmIGluIHUmJihsPXIobCx1W2ZdLGYsaCkpO3JldHVybiBsfX07ZS5leHBvcnRzPXtsZWZ0OmMoITEpLHJpZ2h0OmMoITApfX0sMzY1ODooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoMzE1NyksaT1UeXBlRXJyb3Iscz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLG89biYmIWZ1bmN0aW9uKCl7aWYodm9pZCAwIT09dGhpcylyZXR1cm4hMDt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFtdLCJsZW5ndGgiLHt3cml0YWJsZTohMX0pLmxlbmd0aD0xfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKTtlLmV4cG9ydHM9bz9mdW5jdGlvbihlLHQpe2lmKGEoZSkmJiFzKGUsImxlbmd0aCIpLndyaXRhYmxlKXRocm93IGkoIkNhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgiKTtyZXR1cm4gZS5sZW5ndGg9dH06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5sZW5ndGg9dH19LDE1ODk6KGUsdCxyKT0+e3ZhciBuPXIoMTQwMCksYT1yKDYyNDQpLGk9cig2MTM1KSxzPUFycmF5LG89TWF0aC5tYXg7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIGM9YShlKSxsPW4odCxjKSxoPW4odm9pZCAwPT09cj9jOnIsYyksdT1zKG8oaC1sLDApKSxkPTA7bDxoO2wrKyxkKyspaSh1LGQsZVtsXSk7cmV0dXJuIHUubGVuZ3RoPWQsdX19LDIwNjooZSx0LHIpPT57dmFyIG49cigxNzAyKTtlLmV4cG9ydHM9bihbXS5zbGljZSl9LDQzNjI6KGUsdCxyKT0+e3ZhciBuPXIoMTU4OSksYT1NYXRoLmZsb29yLGk9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLmxlbmd0aCxjPWEoci8yKTtyZXR1cm4gcjw4P3MoZSx0KTpvKGUsaShuKGUsMCxjKSx0KSxpKG4oZSxjKSx0KSx0KX0scz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGE9ZS5sZW5ndGgsaT0xO2k8YTspe2ZvcihuPWkscj1lW2ldO24mJnQoZVtuLTFdLHIpPjA7KWVbbl09ZVstLW5dO24hPT1pKysmJihlW25dPXIpfXJldHVybiBlfSxvPWZ1bmN0aW9uKGUsdCxyLG4pe2Zvcih2YXIgYT10Lmxlbmd0aCxpPXIubGVuZ3RoLHM9MCxvPTA7czxhfHxvPGk7KWVbcytvXT1zPGEmJm88aT9uKHRbc10scltvXSk8PTA/dFtzKytdOnJbbysrXTpzPGE/dFtzKytdOnJbbysrXTtyZXR1cm4gZX07ZS5leHBvcnRzPWl9LDc0NzU6KGUsdCxyKT0+e3ZhciBuPXIoMzE1NyksYT1yKDQ0MTEpLGk9cigxMTEpLHM9cig1MTEyKSgic3BlY2llcyIpLG89QXJyYXk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBuKGUpJiYodD1lLmNvbnN0cnVjdG9yLChhKHQpJiYodD09PW98fG4odC5wcm90b3R5cGUpKXx8aSh0KSYmbnVsbD09PSh0PXRbc10pKSYmKHQ9dm9pZCAwKSksdm9pZCAwPT09dD9vOnR9fSw1NDE3OihlLHQscik9Pnt2YXIgbj1yKDc0NzUpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcobihlKSkoMD09PXQ/MDp0KX19LDE4NDM6KGUsdCxyKT0+e3ZhciBuPXIoNjI0NCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPW4oZSksYT1uZXcgdChyKSxpPTA7aTxyO2krKylhW2ldPWVbci1pLTFdO3JldHVybiBhfX0sMTU3MjooZSx0LHIpPT57dmFyIG49cig2MjQ0KSxhPXIoOTMwMyksaT1SYW5nZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscixzKXt2YXIgbz1uKGUpLGM9YShyKSxsPWM8MD9vK2M6YztpZihsPj1vfHxsPDApdGhyb3cgaSgiSW5jb3JyZWN0IGluZGV4Iik7Zm9yKHZhciBoPW5ldyB0KG8pLHU9MDt1PG87dSsrKWhbdV09dT09PWw/czplW3VdO3JldHVybiBofX0sMzQxMTooZSx0LHIpPT57dmFyIG49cig5NjcwKSxhPXIoOTIxMik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLGkpe3RyeXtyZXR1cm4gaT90KG4ocilbMF0sclsxXSk6dChyKX1jYXRjaCh0KXthKGUsInRocm93Iix0KX19fSw3MDcyOihlLHQscik9Pnt2YXIgbj1yKDUxMTIpKCJpdGVyYXRvciIpLGE9ITE7dHJ5e3ZhciBpPTAscz17bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOiEhaSsrfX0scmV0dXJuOmZ1bmN0aW9uKCl7YT0hMH19O3Nbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sQXJyYXkuZnJvbShzLChmdW5jdGlvbigpe3Rocm93IDJ9KSl9Y2F0Y2goZSl7fWUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCF0JiYhYSlyZXR1cm4hMTt2YXIgcj0hMTt0cnl7dmFyIGk9e307aVtuXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6cj0hMH19fX0sZShpKX1jYXRjaChlKXt9cmV0dXJuIHJ9fSw0MzI2OihlLHQscik9Pnt2YXIgbj1yKDE3MDIpLGE9bih7fS50b1N0cmluZyksaT1uKCIiLnNsaWNlKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGkoYShlKSw4LC0xKX19LDY0ODooZSx0LHIpPT57dmFyIG49cigxNjk0KSxhPXIoNjE0KSxpPXIoNDMyNikscz1yKDUxMTIpKCJ0b1N0cmluZ1RhZyIpLG89T2JqZWN0LGM9IkFyZ3VtZW50cyI9PWkoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKTtlLmV4cG9ydHM9bj9pOmZ1bmN0aW9uKGUpe3ZhciB0LHIsbjtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihyPWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBlW3RdfWNhdGNoKGUpe319KHQ9byhlKSxzKSk/cjpjP2kodCk6Ik9iamVjdCI9PShuPWkodCkpJiZhKHQuY2FsbGVlKT8iQXJndW1lbnRzIjpufX0sOTMyMDooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoOTE5MCksaT1yKDI0MjMpLmdldFdlYWtEYXRhLHM9cig1Nzg3KSxvPXIoOTY3MCksYz1yKDg1NTQpLGw9cigxMTEpLGg9cig0MDgpLHU9cigyMDkyKSxkPXIoMjU5NyksZj1yKDk5MDkpLGc9Zi5zZXQscD1mLmdldHRlckZvcixtPXUuZmluZCxiPXUuZmluZEluZGV4LHk9bihbXS5zcGxpY2UpLHc9MCx2PWZ1bmN0aW9uKGUpe3JldHVybiBlLmZyb3plbnx8KGUuZnJvemVuPW5ldyB4KX0seD1mdW5jdGlvbigpe3RoaXMuZW50cmllcz1bXX0sUz1mdW5jdGlvbihlLHQpe3JldHVybiBtKGUuZW50cmllcywoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09PT10fSkpfTt4LnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVModGhpcyxlKTtpZih0KXJldHVybiB0WzFdfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFTKHRoaXMsZSl9LHNldDpmdW5jdGlvbihlLHQpe3ZhciByPVModGhpcyxlKTtyP3JbMV09dDp0aGlzLmVudHJpZXMucHVzaChbZSx0XSl9LGRlbGV0ZTpmdW5jdGlvbihlKXt2YXIgdD1iKHRoaXMuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT1lfSkpO3JldHVybn50JiZ5KHRoaXMuZW50cmllcyx0LDEpLCEhfnR9fSxlLmV4cG9ydHM9e2dldENvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxyLG4pe3ZhciB1PWUoKGZ1bmN0aW9uKGUsYSl7cyhlLGYpLGcoZSx7dHlwZTp0LGlkOncrKyxmcm96ZW46dm9pZCAwfSksYyhhKXx8aChhLGVbbl0se3RoYXQ6ZSxBU19FTlRSSUVTOnJ9KX0pKSxmPXUucHJvdG90eXBlLG09cCh0KSxiPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1tKGUpLGE9aShvKHQpLCEwKTtyZXR1cm4hMD09PWE/dihuKS5zZXQodCxyKTphW24uaWRdPXIsZX07cmV0dXJuIGEoZix7ZGVsZXRlOmZ1bmN0aW9uKGUpe3ZhciB0PW0odGhpcyk7aWYoIWwoZSkpcmV0dXJuITE7dmFyIHI9aShlKTtyZXR1cm4hMD09PXI/dih0KS5kZWxldGUoZSk6ciYmZChyLHQuaWQpJiZkZWxldGUgclt0LmlkXX0saGFzOmZ1bmN0aW9uKGUpe3ZhciB0PW0odGhpcyk7aWYoIWwoZSkpcmV0dXJuITE7dmFyIHI9aShlKTtyZXR1cm4hMD09PXI/dih0KS5oYXMoZSk6ciYmZChyLHQuaWQpfX0pLGEoZixyP3tnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bSh0aGlzKTtpZihsKGUpKXt2YXIgcj1pKGUpO3JldHVybiEwPT09cj92KHQpLmdldChlKTpyP3JbdC5pZF06dm9pZCAwfX0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGIodGhpcyxlLHQpfX06e2FkZDpmdW5jdGlvbihlKXtyZXR1cm4gYih0aGlzLGUsITApfX0pLHV9fX0sNzcxMDooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNzg1NCksaT1yKDE3MDIpLHM9cig0NzA1KSxvPXIoODA1MiksYz1yKDI0MjMpLGw9cig0MDgpLGg9cig1Nzg3KSx1PXIoNjE0KSxkPXIoODU1NCksZj1yKDExMSksZz1yKDcyOTMpLHA9cig3MDcyKSxtPXIoODAwMyksYj1yKDk1ODcpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dmFyIHk9LTEhPT1lLmluZGV4T2YoIk1hcCIpLHc9LTEhPT1lLmluZGV4T2YoIldlYWsiKSx2PXk/InNldCI6ImFkZCIseD1hW2VdLFM9eCYmeC5wcm90b3R5cGUsQT14LGs9e30sQz1mdW5jdGlvbihlKXt2YXIgdD1pKFNbZV0pO28oUyxlLCJhZGQiPT1lP2Z1bmN0aW9uKGUpe3JldHVybiB0KHRoaXMsMD09PWU/MDplKSx0aGlzfToiZGVsZXRlIj09ZT9mdW5jdGlvbihlKXtyZXR1cm4hKHcmJiFmKGUpKSYmdCh0aGlzLDA9PT1lPzA6ZSl9OiJnZXQiPT1lP2Z1bmN0aW9uKGUpe3JldHVybiB3JiYhZihlKT92b2lkIDA6dCh0aGlzLDA9PT1lPzA6ZSl9OiJoYXMiPT1lP2Z1bmN0aW9uKGUpe3JldHVybiEodyYmIWYoZSkpJiZ0KHRoaXMsMD09PWU/MDplKX06ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdCh0aGlzLDA9PT1lPzA6ZSxyKSx0aGlzfSl9O2lmKHMoZSwhdSh4KXx8ISh3fHxTLmZvckVhY2gmJiFnKChmdW5jdGlvbigpeyhuZXcgeCkuZW50cmllcygpLm5leHQoKX0pKSkpKUE9ci5nZXRDb25zdHJ1Y3Rvcih0LGUseSx2KSxjLmVuYWJsZSgpO2Vsc2UgaWYocyhlLCEwKSl7dmFyIE89bmV3IEEsRj1PW3ZdKHc/e306LTAsMSkhPU8sST1nKChmdW5jdGlvbigpe08uaGFzKDEpfSkpLFQ9cCgoZnVuY3Rpb24oZSl7bmV3IHgoZSl9KSksTT0hdyYmZygoZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IHgsdD01O3QtLTspZVt2XSh0LHQpO3JldHVybiFlLmhhcygtMCl9KSk7VHx8KChBPXQoKGZ1bmN0aW9uKGUsdCl7aChlLFMpO3ZhciByPWIobmV3IHgsZSxBKTtyZXR1cm4gZCh0KXx8bCh0LHJbdl0se3RoYXQ6cixBU19FTlRSSUVTOnl9KSxyfSkpKS5wcm90b3R5cGU9UyxTLmNvbnN0cnVjdG9yPUEpLChJfHxNKSYmKEMoImRlbGV0ZSIpLEMoImhhcyIpLHkmJkMoImdldCIpKSwoTXx8RikmJkModiksdyYmUy5jbGVhciYmZGVsZXRlIFMuY2xlYXJ9cmV0dXJuIGtbZV09QSxuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZm9yY2VkOkEhPXh9LGspLG0oQSxlKSx3fHxyLnNldFN0cm9uZyhBLGUseSksQX19LDk5MjA6KGUsdCxyKT0+e3ZhciBuPXIoMjU5NyksYT1yKDM4ODcpLGk9cigxMjM2KSxzPXIoMzA3MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIG89YSh0KSxjPXMuZixsPWkuZixoPTA7aDxvLmxlbmd0aDtoKyspe3ZhciB1PW9baF07bihlLHUpfHxyJiZuKHIsdSl8fGMoZSx1LGwodCx1KSl9fX0sNDk2NDooZSx0LHIpPT57dmFyIG49cig1MTEyKSgibWF0Y2giKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9Ly4vO3RyeXsiLy4vIltlXSh0KX1jYXRjaChyKXt0cnl7cmV0dXJuIHRbbl09ITEsIi8uLyJbZV0odCl9Y2F0Y2goZSl7fX1yZXR1cm4hMX19LDg1NDQ6KGUsdCxyKT0+e3ZhciBuPXIoNzI5Myk7ZS5leHBvcnRzPSFuKChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBlKSE9PWUucHJvdG90eXBlfSkpfSw2MTc4OmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dmFsdWU6ZSxkb25lOnR9fX0sODg4MDooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoMzA3MCksaT1yKDkxMTQpO2UuZXhwb3J0cz1uP2Z1bmN0aW9uKGUsdCxyKXtyZXR1cm4gYS5mKGUsdCxpKDEscikpfTpmdW5jdGlvbihlLHQscil7cmV0dXJuIGVbdF09cixlfX0sOTExNDplPT57ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJue2VudW1lcmFibGU6ISgxJmUpLGNvbmZpZ3VyYWJsZTohKDImZSksd3JpdGFibGU6ISg0JmUpLHZhbHVlOnR9fX0sNjEzNTooZSx0LHIpPT57dmFyIG49cig0OTQ4KSxhPXIoMzA3MCksaT1yKDkxMTQpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dmFyIHM9bih0KTtzIGluIGU/YS5mKGUscyxpKDAscikpOmVbc109cn19LDcwNDU6KGUsdCxyKT0+e3ZhciBuPXIoNjMzOSksYT1yKDMwNzApO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7cmV0dXJuIHIuZ2V0JiZuKHIuZ2V0LHQse2dldHRlcjohMH0pLHIuc2V0JiZuKHIuc2V0LHQse3NldHRlcjohMH0pLGEuZihlLHQscil9fSw4MDUyOihlLHQscik9Pnt2YXIgbj1yKDYxNCksYT1yKDMwNzApLGk9cig2MzM5KSxzPXIoMzA3Mik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLG8pe298fChvPXt9KTt2YXIgYz1vLmVudW1lcmFibGUsbD12b2lkIDAhPT1vLm5hbWU/by5uYW1lOnQ7aWYobihyKSYmaShyLGwsbyksby5nbG9iYWwpYz9lW3RdPXI6cyh0LHIpO2Vsc2V7dHJ5e28udW5zYWZlP2VbdF0mJihjPSEwKTpkZWxldGUgZVt0XX1jYXRjaChlKXt9Yz9lW3RdPXI6YS5mKGUsdCx7dmFsdWU6cixlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohby5ub25Db25maWd1cmFibGUsd3JpdGFibGU6IW8ubm9uV3JpdGFibGV9KX1yZXR1cm4gZX19LDkxOTA6KGUsdCxyKT0+e3ZhciBuPXIoODA1Mik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIGEgaW4gdCluKGUsYSx0W2FdLHIpO3JldHVybiBlfX0sMzA3MjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt0cnl7YShuLGUse3ZhbHVlOnQsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSl9Y2F0Y2gocil7bltlXT10fXJldHVybiB0fX0sNTExNzooZSx0LHIpPT57dmFyIG49cig2MzMwKSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighZGVsZXRlIGVbdF0pdGhyb3cgYSgiQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAiK24odCkrIiBvZiAiK24oZSkpfX0sOTc4MTooZSx0LHIpPT57dmFyIG49cig3MjkzKTtlLmV4cG9ydHM9IW4oKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwxLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KVsxXX0pKX0sNDE1NDplPT57dmFyIHQ9Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuYWxsLHI9dm9pZCAwPT09dCYmdm9pZCAwIT09dDtlLmV4cG9ydHM9e2FsbDp0LElTX0hUTUxEREE6cn19LDMxNzooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoMTExKSxpPW4uZG9jdW1lbnQscz1hKGkpJiZhKGkuY3JlYXRlRWxlbWVudCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBzP2kuY3JlYXRlRWxlbWVudChlKTp7fX19LDcyMDc6ZT0+e3ZhciB0PVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoZT45MDA3MTk5MjU0NzQwOTkxKXRocm93IHQoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO3JldHVybiBlfX0sMzY3ODplPT57ZS5leHBvcnRzPXtJbmRleFNpemVFcnJvcjp7czoiSU5ERVhfU0laRV9FUlIiLGM6MSxtOjF9LERPTVN0cmluZ1NpemVFcnJvcjp7czoiRE9NU1RSSU5HX1NJWkVfRVJSIixjOjIsbTowfSxIaWVyYXJjaHlSZXF1ZXN0RXJyb3I6e3M6IkhJRVJBUkNIWV9SRVFVRVNUX0VSUiIsYzozLG06MX0sV3JvbmdEb2N1bWVudEVycm9yOntzOiJXUk9OR19ET0NVTUVOVF9FUlIiLGM6NCxtOjF9LEludmFsaWRDaGFyYWN0ZXJFcnJvcjp7czoiSU5WQUxJRF9DSEFSQUNURVJfRVJSIixjOjUsbToxfSxOb0RhdGFBbGxvd2VkRXJyb3I6e3M6Ik5PX0RBVEFfQUxMT1dFRF9FUlIiLGM6NixtOjB9LE5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycm9yOntzOiJOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIiLGM6NyxtOjF9LE5vdEZvdW5kRXJyb3I6e3M6Ik5PVF9GT1VORF9FUlIiLGM6OCxtOjF9LE5vdFN1cHBvcnRlZEVycm9yOntzOiJOT1RfU1VQUE9SVEVEX0VSUiIsYzo5LG06MX0sSW5Vc2VBdHRyaWJ1dGVFcnJvcjp7czoiSU5VU0VfQVRUUklCVVRFX0VSUiIsYzoxMCxtOjF9LEludmFsaWRTdGF0ZUVycm9yOntzOiJJTlZBTElEX1NUQVRFX0VSUiIsYzoxMSxtOjF9LFN5bnRheEVycm9yOntzOiJTWU5UQVhfRVJSIixjOjEyLG06MX0sSW52YWxpZE1vZGlmaWNhdGlvbkVycm9yOntzOiJJTlZBTElEX01PRElGSUNBVElPTl9FUlIiLGM6MTMsbToxfSxOYW1lc3BhY2VFcnJvcjp7czoiTkFNRVNQQUNFX0VSUiIsYzoxNCxtOjF9LEludmFsaWRBY2Nlc3NFcnJvcjp7czoiSU5WQUxJRF9BQ0NFU1NfRVJSIixjOjE1LG06MX0sVmFsaWRhdGlvbkVycm9yOntzOiJWQUxJREFUSU9OX0VSUiIsYzoxNixtOjB9LFR5cGVNaXNtYXRjaEVycm9yOntzOiJUWVBFX01JU01BVENIX0VSUiIsYzoxNyxtOjF9LFNlY3VyaXR5RXJyb3I6e3M6IlNFQ1VSSVRZX0VSUiIsYzoxOCxtOjF9LE5ldHdvcmtFcnJvcjp7czoiTkVUV09SS19FUlIiLGM6MTksbToxfSxBYm9ydEVycm9yOntzOiJBQk9SVF9FUlIiLGM6MjAsbToxfSxVUkxNaXNtYXRjaEVycm9yOntzOiJVUkxfTUlTTUFUQ0hfRVJSIixjOjIxLG06MX0sUXVvdGFFeGNlZWRlZEVycm9yOntzOiJRVU9UQV9FWENFRURFRF9FUlIiLGM6MjIsbToxfSxUaW1lb3V0RXJyb3I6e3M6IlRJTUVPVVRfRVJSIixjOjIzLG06MX0sSW52YWxpZE5vZGVUeXBlRXJyb3I6e3M6IklOVkFMSURfTk9ERV9UWVBFX0VSUiIsYzoyNCxtOjF9LERhdGFDbG9uZUVycm9yOntzOiJEQVRBX0NMT05FX0VSUiIsYzoyNSxtOjF9fX0sODMyNDplPT57ZS5leHBvcnRzPXtDU1NSdWxlTGlzdDowLENTU1N0eWxlRGVjbGFyYXRpb246MCxDU1NWYWx1ZUxpc3Q6MCxDbGllbnRSZWN0TGlzdDowLERPTVJlY3RMaXN0OjAsRE9NU3RyaW5nTGlzdDowLERPTVRva2VuTGlzdDoxLERhdGFUcmFuc2Zlckl0ZW1MaXN0OjAsRmlsZUxpc3Q6MCxIVE1MQWxsQ29sbGVjdGlvbjowLEhUTUxDb2xsZWN0aW9uOjAsSFRNTEZvcm1FbGVtZW50OjAsSFRNTFNlbGVjdEVsZW1lbnQ6MCxNZWRpYUxpc3Q6MCxNaW1lVHlwZUFycmF5OjAsTmFtZWROb2RlTWFwOjAsTm9kZUxpc3Q6MSxQYWludFJlcXVlc3RMaXN0OjAsUGx1Z2luOjAsUGx1Z2luQXJyYXk6MCxTVkdMZW5ndGhMaXN0OjAsU1ZHTnVtYmVyTGlzdDowLFNWR1BhdGhTZWdMaXN0OjAsU1ZHUG9pbnRMaXN0OjAsU1ZHU3RyaW5nTGlzdDowLFNWR1RyYW5zZm9ybUxpc3Q6MCxTb3VyY2VCdWZmZXJMaXN0OjAsU3R5bGVTaGVldExpc3Q6MCxUZXh0VHJhY2tDdWVMaXN0OjAsVGV4dFRyYWNrTGlzdDowLFRvdWNoTGlzdDowfX0sODUwOTooZSx0LHIpPT57dmFyIG49cigzMTcpKCJzcGFuIikuY2xhc3NMaXN0LGE9biYmbi5jb25zdHJ1Y3RvciYmbi5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7ZS5leHBvcnRzPWE9PT1PYmplY3QucHJvdG90eXBlP3ZvaWQgMDphfSw4ODg2OihlLHQscik9Pnt2YXIgbj1yKDgxMTMpLm1hdGNoKC9maXJlZm94XC8oXGQrKS9pKTtlLmV4cG9ydHM9ISFuJiYrblsxXX0sNzg3MTooZSx0LHIpPT57dmFyIG49cigzODIzKSxhPXIoNTI2OCk7ZS5leHBvcnRzPSFuJiYhYSYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnR9LDM4MjM6ZT0+e2UuZXhwb3J0cz0ib2JqZWN0Ij09dHlwZW9mIERlbm8mJkRlbm8mJiJvYmplY3QiPT10eXBlb2YgRGVuby52ZXJzaW9ufSwyNTY6KGUsdCxyKT0+e3ZhciBuPXIoODExMyk7ZS5leHBvcnRzPS9NU0lFfFRyaWRlbnQvLnRlc3Qobil9LDE1Mjg6KGUsdCxyKT0+e3ZhciBuPXIoODExMyk7ZS5leHBvcnRzPS9pcGFkfGlwaG9uZXxpcG9kL2kudGVzdChuKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQZWJibGV9LDY4MzM6KGUsdCxyKT0+e3ZhciBuPXIoODExMyk7ZS5leHBvcnRzPS8oPzppcGFkfGlwaG9uZXxpcG9kKS4qYXBwbGV3ZWJraXQvaS50ZXN0KG4pfSw1MjY4OihlLHQscik9Pnt2YXIgbj1yKDQzMjYpO2UuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJiJwcm9jZXNzIj09bihwcm9jZXNzKX0sMTAzNjooZSx0LHIpPT57dmFyIG49cig4MTEzKTtlLmV4cG9ydHM9L3dlYjBzKD8hLipjaHJvbWUpL2kudGVzdChuKX0sODExMzplPT57ZS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiZTdHJpbmcobmF2aWdhdG9yLnVzZXJBZ2VudCl8fCIifSw3MzkyOihlLHQscik9Pnt2YXIgbixhLGk9cig3ODU0KSxzPXIoODExMyksbz1pLnByb2Nlc3MsYz1pLkRlbm8sbD1vJiZvLnZlcnNpb25zfHxjJiZjLnZlcnNpb24saD1sJiZsLnY4O2gmJihhPShuPWguc3BsaXQoIi4iKSlbMF0+MCYmblswXTw0PzE6KyhuWzBdK25bMV0pKSwhYSYmcyYmKCEobj1zLm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8blsxXT49NzQpJiYobj1zLm1hdGNoKC9DaHJvbWVcLyhcZCspLykpJiYoYT0rblsxXSksZS5leHBvcnRzPWF9LDgwMDg6KGUsdCxyKT0+e3ZhciBuPXIoODExMykubWF0Y2goL0FwcGxlV2ViS2l0XC8oXGQrKVwuLyk7ZS5leHBvcnRzPSEhbiYmK25bMV19LDc0ODplPT57ZS5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LDEwNjA6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1FcnJvcixpPW4oIiIucmVwbGFjZSkscz1TdHJpbmcoYSgienhjYXNkIikuc3RhY2spLG89L1xuXHMqYXQgW146XSo6W15cbl0qLyxjPW8udGVzdChzKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihjJiYic3RyaW5nIj09dHlwZW9mIGUmJiFhLnByZXBhcmVTdGFja1RyYWNlKWZvcig7dC0tOyllPWkoZSxvLCIiKTtyZXR1cm4gZX19LDUzOTI6KGUsdCxyKT0+e3ZhciBuPXIoODg4MCksYT1yKDEwNjApLGk9cigyOTE0KSxzPUVycm9yLmNhcHR1cmVTdGFja1RyYWNlO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscixvKXtpJiYocz9zKGUsdCk6bihlLCJzdGFjayIsYShyLG8pKSl9fSwyOTE0OihlLHQscik9Pnt2YXIgbj1yKDcyOTMpLGE9cig5MTE0KTtlLmV4cG9ydHM9IW4oKGZ1bmN0aW9uKCl7dmFyIGU9RXJyb3IoImEiKTtyZXR1cm4hKCJzdGFjayJpbiBlKXx8KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdGFjayIsYSgxLDcpKSw3IT09ZS5zdGFjayl9KSl9LDc3NjI6KGUsdCxyKT0+e3ZhciBuPXIoOTc4MSksYT1yKDcyOTMpLGk9cig5NjcwKSxzPXIoMzApLG89cig2Mjc3KSxjPUVycm9yLnByb3RvdHlwZS50b1N0cmluZyxsPWEoKGZ1bmN0aW9uKCl7aWYobil7dmFyIGU9cyhPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIm5hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PWV9fSkpO2lmKCJ0cnVlIiE9PWMuY2FsbChlKSlyZXR1cm4hMH1yZXR1cm4iMjogMSIhPT1jLmNhbGwoe21lc3NhZ2U6MSxuYW1lOjJ9KXx8IkVycm9yIiE9PWMuY2FsbCh7fSl9KSk7ZS5leHBvcnRzPWw/ZnVuY3Rpb24oKXt2YXIgZT1pKHRoaXMpLHQ9byhlLm5hbWUsIkVycm9yIikscj1vKGUubWVzc2FnZSk7cmV0dXJuIHQ/cj90KyI6ICIrcjp0OnJ9OmN9LDIxMDk6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDEyMzYpLmYsaT1yKDg4ODApLHM9cig4MDUyKSxvPXIoMzA3MiksYz1yKDk5MjApLGw9cig0NzA1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcixoLHUsZCxmLGc9ZS50YXJnZXQscD1lLmdsb2JhbCxtPWUuc3RhdDtpZihyPXA/bjptP25bZ118fG8oZyx7fSk6KG5bZ118fHt9KS5wcm90b3R5cGUpZm9yKGggaW4gdCl7aWYoZD10W2hdLHU9ZS5kb250Q2FsbEdldFNldD8oZj1hKHIsaCkpJiZmLnZhbHVlOnJbaF0sIWwocD9oOmcrKG0/Ii4iOiIjIikraCxlLmZvcmNlZCkmJnZvaWQgMCE9PXUpe2lmKHR5cGVvZiBkPT10eXBlb2YgdSljb250aW51ZTtjKGQsdSl9KGUuc2hhbXx8dSYmdS5zaGFtKSYmaShkLCJzaGFtIiwhMCkscyhyLGgsZCxlKX19fSw3MjkzOmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiEhZSgpfWNhdGNoKGUpe3JldHVybiEwfX19LDcwMDc6KGUsdCxyKT0+e3IoNDkxNik7dmFyIG49cigxNDcwKSxhPXIoODA1MiksaT1yKDIyNjEpLHM9cig3MjkzKSxvPXIoNTExMiksYz1yKDg4ODApLGw9bygic3BlY2llcyIpLGg9UmVnRXhwLnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIsdSl7dmFyIGQ9byhlKSxmPSFzKChmdW5jdGlvbigpe3ZhciB0PXt9O3JldHVybiB0W2RdPWZ1bmN0aW9uKCl7cmV0dXJuIDd9LDchPSIiW2VdKHQpfSkpLGc9ZiYmIXMoKGZ1bmN0aW9uKCl7dmFyIHQ9ITEscj0vYS87cmV0dXJuInNwbGl0Ij09PWUmJigocj17fSkuY29uc3RydWN0b3I9e30sci5jb25zdHJ1Y3RvcltsXT1mdW5jdGlvbigpe3JldHVybiByfSxyLmZsYWdzPSIiLHJbZF09Ly4vW2RdKSxyLmV4ZWM9ZnVuY3Rpb24oKXtyZXR1cm4gdD0hMCxudWxsfSxyW2RdKCIiKSwhdH0pKTtpZighZnx8IWd8fHIpe3ZhciBwPW4oLy4vW2RdKSxtPXQoZCwiIltlXSwoZnVuY3Rpb24oZSx0LHIsYSxzKXt2YXIgbz1uKGUpLGM9dC5leGVjO3JldHVybiBjPT09aXx8Yz09PWguZXhlYz9mJiYhcz97ZG9uZTohMCx2YWx1ZTpwKHQscixhKX06e2RvbmU6ITAsdmFsdWU6byhyLHQsYSl9Ontkb25lOiExfX0pKTthKFN0cmluZy5wcm90b3R5cGUsZSxtWzBdKSxhKGgsZCxtWzFdKX11JiZjKGhbZF0sInNoYW0iLCEwKX19LDY3OTA6KGUsdCxyKT0+e3ZhciBuPXIoMzE1NyksYT1yKDYyNDQpLGk9cig3MjA3KSxzPXIoOTk3NCksbz1mdW5jdGlvbihlLHQscixjLGwsaCx1LGQpe2Zvcih2YXIgZixnLHA9bCxtPTAsYj0hIXUmJnModSxkKTttPGM7KW0gaW4gciYmKGY9Yj9iKHJbbV0sbSx0KTpyW21dLGg+MCYmbihmKT8oZz1hKGYpLHA9byhlLHQsZixnLHAsaC0xKS0xKTooaShwKzEpLGVbcF09ZikscCsrKSxtKys7cmV0dXJuIHB9O2UuZXhwb3J0cz1vfSw2Njc3OihlLHQscik9Pnt2YXIgbj1yKDcyOTMpO2UuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pKX0sMjEwNDooZSx0LHIpPT57dmFyIG49cig0Mzc0KSxhPUZ1bmN0aW9uLnByb3RvdHlwZSxpPWEuYXBwbHkscz1hLmNhbGw7ZS5leHBvcnRzPSJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5hcHBseXx8KG4/cy5iaW5kKGkpOmZ1bmN0aW9uKCl7cmV0dXJuIHMuYXBwbHkoaSxhcmd1bWVudHMpfSl9LDk5NzQ6KGUsdCxyKT0+e3ZhciBuPXIoMTQ3MCksYT1yKDk2NjIpLGk9cig0Mzc0KSxzPW4obi5iaW5kKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYShlKSx2b2lkIDA9PT10P2U6aT9zKGUsdCk6ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0LGFyZ3VtZW50cyl9fX0sNDM3NDooZSx0LHIpPT57dmFyIG49cig3MjkzKTtlLmV4cG9ydHM9IW4oKGZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oKXt9LmJpbmQoKTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgZXx8ZS5oYXNPd25Qcm9wZXJ0eSgicHJvdG90eXBlIil9KSl9LDY5MTY6KGUsdCxyKT0+e3ZhciBuPXIoNDM3NCksYT1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtlLmV4cG9ydHM9bj9hLmJpbmQoYSk6ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShhLGFyZ3VtZW50cyl9fSw2NTMwOihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cigyNTk3KSxpPUZ1bmN0aW9uLnByb3RvdHlwZSxzPW4mJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isbz1hKGksIm5hbWUiKSxjPW8mJiJzb21ldGhpbmciPT09ZnVuY3Rpb24oKXt9Lm5hbWUsbD1vJiYoIW58fG4mJnMoaSwibmFtZSIpLmNvbmZpZ3VyYWJsZSk7ZS5leHBvcnRzPXtFWElTVFM6byxQUk9QRVI6YyxDT05GSUdVUkFCTEU6bH19LDU2Njg6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1yKDk2NjIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dHJ5e3JldHVybiBuKGEoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpW3JdKSl9Y2F0Y2goZSl7fX19LDE0NzA6KGUsdCxyKT0+e3ZhciBuPXIoNDMyNiksYT1yKDE3MDIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiRnVuY3Rpb24iPT09bihlKSlyZXR1cm4gYShlKX19LDE3MDI6KGUsdCxyKT0+e3ZhciBuPXIoNDM3NCksYT1GdW5jdGlvbi5wcm90b3R5cGUsaT1hLmNhbGwscz1uJiZhLmJpbmQuYmluZChpLGkpO2UuZXhwb3J0cz1uP3M6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGkuYXBwbHkoZSxhcmd1bWVudHMpfX19LDUwMDU6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDYxNCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj8ocj1uW2VdLGEocik/cjp2b2lkIDApOm5bZV0mJm5bZV1bdF07dmFyIHJ9fSwxMjQ2OihlLHQscik9Pnt2YXIgbj1yKDY0OCksYT1yKDgxNzMpLGk9cig4NTU0KSxzPXIoNzQ5Nyksbz1yKDUxMTIpKCJpdGVyYXRvciIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighaShlKSlyZXR1cm4gYShlLG8pfHxhKGUsIkBAaXRlcmF0b3IiKXx8c1tuKGUpXX19LDQxMjE6KGUsdCxyKT0+e3ZhciBuPXIoNjkxNiksYT1yKDk2NjIpLGk9cig5NjcwKSxzPXIoNjMzMCksbz1yKDEyNDYpLGM9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg8Mj9vKGUpOnQ7aWYoYShyKSlyZXR1cm4gaShuKHIsZSkpO3Rocm93IGMocyhlKSsiIGlzIG5vdCBpdGVyYWJsZSIpfX0sODA0NDooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoMzE1NyksaT1yKDYxNCkscz1yKDQzMjYpLG89cigxMzQwKSxjPW4oW10ucHVzaCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKGkoZSkpcmV0dXJuIGU7aWYoYShlKSl7Zm9yKHZhciB0PWUubGVuZ3RoLHI9W10sbj0wO248dDtuKyspe3ZhciBsPWVbbl07InN0cmluZyI9PXR5cGVvZiBsP2MocixsKToibnVtYmVyIiE9dHlwZW9mIGwmJiJOdW1iZXIiIT1zKGwpJiYiU3RyaW5nIiE9cyhsKXx8YyhyLG8obCkpfXZhciBoPXIubGVuZ3RoLHU9ITA7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYodSlyZXR1cm4gdT0hMSx0O2lmKGEodGhpcykpcmV0dXJuIHQ7Zm9yKHZhciBuPTA7bjxoO24rKylpZihyW25dPT09ZSlyZXR1cm4gdH19fX0sODE3MzooZSx0LHIpPT57dmFyIG49cig5NjYyKSxhPXIoODU1NCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9ZVt0XTtyZXR1cm4gYShyKT92b2lkIDA6bihyKX19LDY0NzooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoNzkwOCksaT1NYXRoLmZsb29yLHM9bigiIi5jaGFyQXQpLG89bigiIi5yZXBsYWNlKSxjPW4oIiIuc2xpY2UpLGw9L1wkKFskJidgXXxcZHsxLDJ9fDxbXj5dKj4pL2csaD0vXCQoWyQmJ2BdfFxkezEsMn0pL2c7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLG4sdSxkKXt2YXIgZj1yK2UubGVuZ3RoLGc9bi5sZW5ndGgscD1oO3JldHVybiB2b2lkIDAhPT11JiYodT1hKHUpLHA9bCksbyhkLHAsKGZ1bmN0aW9uKGEsbyl7dmFyIGw7c3dpdGNoKHMobywwKSl7Y2FzZSIkIjpyZXR1cm4iJCI7Y2FzZSImIjpyZXR1cm4gZTtjYXNlImAiOnJldHVybiBjKHQsMCxyKTtjYXNlIiciOnJldHVybiBjKHQsZik7Y2FzZSI8IjpsPXVbYyhvLDEsLTEpXTticmVhaztkZWZhdWx0OnZhciBoPStvO2lmKDA9PT1oKXJldHVybiBhO2lmKGg+Zyl7dmFyIGQ9aShoLzEwKTtyZXR1cm4gMD09PWQ/YTpkPD1nP3ZvaWQgMD09PW5bZC0xXT9zKG8sMSk6bltkLTFdK3MobywxKTphfWw9bltoLTFdfXJldHVybiB2b2lkIDA9PT1sPyIiOmx9KSl9fSw3ODU0OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5NYXRoPT1NYXRoJiZlfTtlLmV4cG9ydHM9bigib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMpfHxuKCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cpfHxuKCJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZil8fG4oIm9iamVjdCI9PXR5cGVvZiByLmcmJnIuZyl8fGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCl8fHRoaXN8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9LDI1OTc6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1yKDc5MDgpLGk9bih7fS5oYXNPd25Qcm9wZXJ0eSk7ZS5leHBvcnRzPU9iamVjdC5oYXNPd258fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoYShlKSx0KX19LDM1MDE6ZT0+e2UuZXhwb3J0cz17fX0sODQyOmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt0cnl7MT09YXJndW1lbnRzLmxlbmd0aD9jb25zb2xlLmVycm9yKGUpOmNvbnNvbGUuZXJyb3IoZSx0KX1jYXRjaChlKXt9fX0sNDkwOihlLHQscik9Pnt2YXIgbj1yKDUwMDUpO2UuZXhwb3J0cz1uKCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIpfSw0NjY0OihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cig3MjkzKSxpPXIoMzE3KTtlLmV4cG9ydHM9IW4mJiFhKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoaSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpfSwxMTc5OmU9Pnt2YXIgdD1BcnJheSxyPU1hdGguYWJzLG49TWF0aC5wb3csYT1NYXRoLmZsb29yLGk9TWF0aC5sb2cscz1NYXRoLkxOMjtlLmV4cG9ydHM9e3BhY2s6ZnVuY3Rpb24oZSxvLGMpe3ZhciBsLGgsdSxkPXQoYyksZj04KmMtby0xLGc9KDE8PGYpLTEscD1nPj4xLG09MjM9PT1vP24oMiwtMjQpLW4oMiwtNzcpOjAsYj1lPDB8fDA9PT1lJiYxL2U8MD8xOjAseT0wO2ZvcigoZT1yKGUpKSE9ZXx8ZT09PTEvMD8oaD1lIT1lPzE6MCxsPWcpOihsPWEoaShlKS9zKSxlKih1PW4oMiwtbCkpPDEmJihsLS0sdSo9MiksKGUrPWwrcD49MT9tL3U6bSpuKDIsMS1wKSkqdT49MiYmKGwrKyx1Lz0yKSxsK3A+PWc/KGg9MCxsPWcpOmwrcD49MT8oaD0oZSp1LTEpKm4oMixvKSxsKz1wKTooaD1lKm4oMixwLTEpKm4oMixvKSxsPTApKTtvPj04OylkW3krK109MjU1JmgsaC89MjU2LG8tPTg7Zm9yKGw9bDw8b3xoLGYrPW87Zj4wOylkW3krK109MjU1JmwsbC89MjU2LGYtPTg7cmV0dXJuIGRbLS15XXw9MTI4KmIsZH0sdW5wYWNrOmZ1bmN0aW9uKGUsdCl7dmFyIHIsYT1lLmxlbmd0aCxpPTgqYS10LTEscz0oMTw8aSktMSxvPXM+PjEsYz1pLTcsbD1hLTEsaD1lW2wtLV0sdT0xMjcmaDtmb3IoaD4+PTc7Yz4wOyl1PTI1Nip1K2VbbC0tXSxjLT04O2ZvcihyPXUmKDE8PC1jKS0xLHU+Pj0tYyxjKz10O2M+MDspcj0yNTYqcitlW2wtLV0sYy09ODtpZigwPT09dSl1PTEtbztlbHNle2lmKHU9PT1zKXJldHVybiByP05hTjpoPy0xLzA6MS8wO3IrPW4oMix0KSx1LT1vfXJldHVybihoPy0xOjEpKnIqbigyLHUtdCl9fX0sODM2MTooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoNzI5MyksaT1yKDQzMjYpLHM9T2JqZWN0LG89bigiIi5zcGxpdCk7ZS5leHBvcnRzPWEoKGZ1bmN0aW9uKCl7cmV0dXJuIXMoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKX0pKT9mdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09aShlKT9vKGUsIiIpOnMoZSl9OnN9LDk1ODc6KGUsdCxyKT0+e3ZhciBuPXIoNjE0KSxhPXIoMTExKSxpPXIoNzY3NCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXt2YXIgcyxvO3JldHVybiBpJiZuKHM9dC5jb25zdHJ1Y3RvcikmJnMhPT1yJiZhKG89cy5wcm90b3R5cGUpJiZvIT09ci5wcm90b3R5cGUmJmkoZSxvKSxlfX0sMjc4ODooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoNjE0KSxpPXIoNTQ2NSkscz1uKEZ1bmN0aW9uLnRvU3RyaW5nKTthKGkuaW5zcGVjdFNvdXJjZSl8fChpLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHMoZSl9KSxlLmV4cG9ydHM9aS5pbnNwZWN0U291cmNlfSw4MzQwOihlLHQscik9Pnt2YXIgbj1yKDExMSksYT1yKDg4ODApO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe24odCkmJiJjYXVzZSJpbiB0JiZhKGUsImNhdXNlIix0LmNhdXNlKX19LDI0MjM6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDE3MDIpLGk9cigzNTAxKSxzPXIoMTExKSxvPXIoMjU5NyksYz1yKDMwNzApLmYsbD1yKDgwMDYpLGg9cigxMTU2KSx1PXIoMjA1MCksZD1yKDk3MTEpLGY9cig2Njc3KSxnPSExLHA9ZCgibWV0YSIpLG09MCxiPWZ1bmN0aW9uKGUpe2MoZSxwLHt2YWx1ZTp7b2JqZWN0SUQ6Ik8iK20rKyx3ZWFrRGF0YTp7fX19KX0seT1lLmV4cG9ydHM9e2VuYWJsZTpmdW5jdGlvbigpe3kuZW5hYmxlPWZ1bmN0aW9uKCl7fSxnPSEwO3ZhciBlPWwuZix0PWEoW10uc3BsaWNlKSxyPXt9O3JbcF09MSxlKHIpLmxlbmd0aCYmKGwuZj1mdW5jdGlvbihyKXtmb3IodmFyIG49ZShyKSxhPTAsaT1uLmxlbmd0aDthPGk7YSsrKWlmKG5bYV09PT1wKXt0KG4sYSwxKTticmVha31yZXR1cm4gbn0sbih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiEwfSx7Z2V0T3duUHJvcGVydHlOYW1lczpoLmZ9KSl9LGZhc3RLZXk6ZnVuY3Rpb24oZSx0KXtpZighcyhlKSlyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGU/ZTooInN0cmluZyI9PXR5cGVvZiBlPyJTIjoiUCIpK2U7aWYoIW8oZSxwKSl7aWYoIXUoZSkpcmV0dXJuIkYiO2lmKCF0KXJldHVybiJFIjtiKGUpfXJldHVybiBlW3BdLm9iamVjdElEfSxnZXRXZWFrRGF0YTpmdW5jdGlvbihlLHQpe2lmKCFvKGUscCkpe2lmKCF1KGUpKXJldHVybiEwO2lmKCF0KXJldHVybiExO2IoZSl9cmV0dXJuIGVbcF0ud2Vha0RhdGF9LG9uRnJlZXplOmZ1bmN0aW9uKGUpe3JldHVybiBmJiZnJiZ1KGUpJiYhbyhlLHApJiZiKGUpLGV9fTtpW3BdPSEwfSw5OTA5OihlLHQscik9Pnt2YXIgbixhLGkscz1yKDQ4MTEpLG89cig3ODU0KSxjPXIoMTExKSxsPXIoODg4MCksaD1yKDI1OTcpLHU9cig1NDY1KSxkPXIoNjIwMCksZj1yKDM1MDEpLGc9Ik9iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkIixwPW8uVHlwZUVycm9yLG09by5XZWFrTWFwO2lmKHN8fHUuc3RhdGUpe3ZhciBiPXUuc3RhdGV8fCh1LnN0YXRlPW5ldyBtKTtiLmdldD1iLmdldCxiLmhhcz1iLmhhcyxiLnNldD1iLnNldCxuPWZ1bmN0aW9uKGUsdCl7aWYoYi5oYXMoZSkpdGhyb3cgcChnKTtyZXR1cm4gdC5mYWNhZGU9ZSxiLnNldChlLHQpLHR9LGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGIuZ2V0KGUpfHx7fX0saT1mdW5jdGlvbihlKXtyZXR1cm4gYi5oYXMoZSl9fWVsc2V7dmFyIHk9ZCgic3RhdGUiKTtmW3ldPSEwLG49ZnVuY3Rpb24oZSx0KXtpZihoKGUseSkpdGhyb3cgcChnKTtyZXR1cm4gdC5mYWNhZGU9ZSxsKGUseSx0KSx0fSxhPWZ1bmN0aW9uKGUpe3JldHVybiBoKGUseSk/ZVt5XTp7fX0saT1mdW5jdGlvbihlKXtyZXR1cm4gaChlLHkpfX1lLmV4cG9ydHM9e3NldDpuLGdldDphLGhhczppLGVuZm9yY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSk/YShlKTpuKGUse30pfSxnZXR0ZXJGb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByO2lmKCFjKHQpfHwocj1hKHQpKS50eXBlIT09ZSl0aHJvdyBwKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICIrZSsiIHJlcXVpcmVkIik7cmV0dXJuIHJ9fX19LDc2NTk6KGUsdCxyKT0+e3ZhciBuPXIoNTExMiksYT1yKDc0OTcpLGk9bigiaXRlcmF0b3IiKSxzPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJihhLkFycmF5PT09ZXx8c1tpXT09PWUpfX0sMzE1NzooZSx0LHIpPT57dmFyIG49cig0MzI2KTtlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIkFycmF5Ij09bihlKX19LDQwNjc6KGUsdCxyKT0+e3ZhciBuPXIoNjQ4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKTtyZXR1cm4iQmlnSW50NjRBcnJheSI9PXR8fCJCaWdVaW50NjRBcnJheSI9PXR9fSw2MTQ6KGUsdCxyKT0+e3ZhciBuPXIoNDE1NCksYT1uLmFsbDtlLmV4cG9ydHM9bi5JU19IVE1MRERBP2Z1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfHxlPT09YX06ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9fSw0NDExOihlLHQscik9Pnt2YXIgbj1yKDE3MDIpLGE9cig3MjkzKSxpPXIoNjE0KSxzPXIoNjQ4KSxvPXIoNTAwNSksYz1yKDI3ODgpLGw9ZnVuY3Rpb24oKXt9LGg9W10sdT1vKCJSZWZsZWN0IiwiY29uc3RydWN0IiksZD0vXlxzKig/OmNsYXNzfGZ1bmN0aW9uKVxiLyxmPW4oZC5leGVjKSxnPSFkLmV4ZWMobCkscD1mdW5jdGlvbihlKXtpZighaShlKSlyZXR1cm4hMTt0cnl7cmV0dXJuIHUobCxoLGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX0sbT1mdW5jdGlvbihlKXtpZighaShlKSlyZXR1cm4hMTtzd2l0Y2gocyhlKSl7Y2FzZSJBc3luY0Z1bmN0aW9uIjpjYXNlIkdlbmVyYXRvckZ1bmN0aW9uIjpjYXNlIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb24iOnJldHVybiExfXRyeXtyZXR1cm4gZ3x8ISFmKGQsYyhlKSl9Y2F0Y2goZSl7cmV0dXJuITB9fTttLnNoYW09ITAsZS5leHBvcnRzPSF1fHxhKChmdW5jdGlvbigpe3ZhciBlO3JldHVybiBwKHAuY2FsbCl8fCFwKE9iamVjdCl8fCFwKChmdW5jdGlvbigpe2U9ITB9KSl8fGV9KSk/bTpwfSw0NzA1OihlLHQscik9Pnt2YXIgbj1yKDcyOTMpLGE9cig2MTQpLGk9LyN8XC5wcm90b3R5cGVcLi8scz1mdW5jdGlvbihlLHQpe3ZhciByPWNbbyhlKV07cmV0dXJuIHI9PWh8fHIhPWwmJihhKHQpP24odCk6ISF0KX0sbz1zLm5vcm1hbGl6ZT1mdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nKGUpLnJlcGxhY2UoaSwiLiIpLnRvTG93ZXJDYXNlKCl9LGM9cy5kYXRhPXt9LGw9cy5OQVRJVkU9Ik4iLGg9cy5QT0xZRklMTD0iUCI7ZS5leHBvcnRzPXN9LDU5ODg6KGUsdCxyKT0+e3ZhciBuPXIoMTExKSxhPU1hdGguZmxvb3I7ZS5leHBvcnRzPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKGUpe3JldHVybiFuKGUpJiZpc0Zpbml0ZShlKSYmYShlKT09PWV9fSw4NTU0OmU9PntlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9fSwxMTE6KGUsdCxyKT0+e3ZhciBuPXIoNjE0KSxhPXIoNDE1NCksaT1hLmFsbDtlLmV4cG9ydHM9YS5JU19IVE1MRERBP2Z1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZT9udWxsIT09ZTpuKGUpfHxlPT09aX06ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP251bGwhPT1lOm4oZSl9fSwxOTEzOmU9PntlLmV4cG9ydHM9ITF9LDc4NTA6KGUsdCxyKT0+e3ZhciBuPXIoMTExKSxhPXIoNDMyNiksaT1yKDUxMTIpKCJtYXRjaCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbihlKSYmKHZvaWQgMCE9PSh0PWVbaV0pPyEhdDoiUmVnRXhwIj09YShlKSl9fSwyMTkwOihlLHQscik9Pnt2YXIgbj1yKDUwMDUpLGE9cig2MTQpLGk9cig3OTc2KSxzPXIoMzMwNyksbz1PYmplY3Q7ZS5leHBvcnRzPXM/ZnVuY3Rpb24oZSl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiBlfTpmdW5jdGlvbihlKXt2YXIgdD1uKCJTeW1ib2wiKTtyZXR1cm4gYSh0KSYmaSh0LnByb3RvdHlwZSxvKGUpKX19LDQwODooZSx0LHIpPT57dmFyIG49cig5OTc0KSxhPXIoNjkxNiksaT1yKDk2NzApLHM9cig2MzMwKSxvPXIoNzY1OSksYz1yKDYyNDQpLGw9cig3OTc2KSxoPXIoNDEyMSksdT1yKDEyNDYpLGQ9cig5MjEyKSxmPVR5cGVFcnJvcixnPWZ1bmN0aW9uKGUsdCl7dGhpcy5zdG9wcGVkPWUsdGhpcy5yZXN1bHQ9dH0scD1nLnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3ZhciBtLGIseSx3LHYseCxTLEE9ciYmci50aGF0LGs9ISghcnx8IXIuQVNfRU5UUklFUyksQz0hKCFyfHwhci5JU19SRUNPUkQpLE89ISghcnx8IXIuSVNfSVRFUkFUT1IpLEY9ISghcnx8IXIuSU5URVJSVVBURUQpLEk9bih0LEEpLFQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG0mJmQobSwibm9ybWFsIixlKSxuZXcgZyghMCxlKX0sTT1mdW5jdGlvbihlKXtyZXR1cm4gaz8oaShlKSxGP0koZVswXSxlWzFdLFQpOkkoZVswXSxlWzFdKSk6Rj9JKGUsVCk6SShlKX07aWYoQyltPWUuaXRlcmF0b3I7ZWxzZSBpZihPKW09ZTtlbHNle2lmKCEoYj11KGUpKSl0aHJvdyBmKHMoZSkrIiBpcyBub3QgaXRlcmFibGUiKTtpZihvKGIpKXtmb3IoeT0wLHc9YyhlKTt3Pnk7eSsrKWlmKCh2PU0oZVt5XSkpJiZsKHAsdikpcmV0dXJuIHY7cmV0dXJuIG5ldyBnKCExKX1tPWgoZSxiKX1mb3IoeD1DP2UubmV4dDptLm5leHQ7IShTPWEoeCxtKSkuZG9uZTspe3RyeXt2PU0oUy52YWx1ZSl9Y2F0Y2goZSl7ZChtLCJ0aHJvdyIsZSl9aWYoIm9iamVjdCI9PXR5cGVvZiB2JiZ2JiZsKHAsdikpcmV0dXJuIHZ9cmV0dXJuIG5ldyBnKCExKX19LDkyMTI6KGUsdCxyKT0+e3ZhciBuPXIoNjkxNiksYT1yKDk2NzApLGk9cig4MTczKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3ZhciBzLG87YShlKTt0cnl7aWYoIShzPWkoZSwicmV0dXJuIikpKXtpZigidGhyb3ciPT09dCl0aHJvdyByO3JldHVybiByfXM9bihzLGUpfWNhdGNoKGUpe289ITAscz1lfWlmKCJ0aHJvdyI9PT10KXRocm93IHI7aWYobyl0aHJvdyBzO3JldHVybiBhKHMpLHJ9fSwzMDYxOihlLHQscik9Pnt2YXIgbj1yKDMzODMpLkl0ZXJhdG9yUHJvdG90eXBlLGE9cigzMCksaT1yKDkxMTQpLHM9cig4MDAzKSxvPXIoNzQ5NyksYz1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIsbCl7dmFyIGg9dCsiIEl0ZXJhdG9yIjtyZXR1cm4gZS5wcm90b3R5cGU9YShuLHtuZXh0OmkoKyFsLHIpfSkscyhlLGgsITEsITApLG9baF09YyxlfX0sMTY1NjooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNjkxNiksaT1yKDE5MTMpLHM9cig2NTMwKSxvPXIoNjE0KSxjPXIoMzA2MSksbD1yKDk1MTgpLGg9cig3Njc0KSx1PXIoODAwMyksZD1yKDg4ODApLGY9cig4MDUyKSxnPXIoNTExMikscD1yKDc0OTcpLG09cigzMzgzKSxiPXMuUFJPUEVSLHk9cy5DT05GSUdVUkFCTEUsdz1tLkl0ZXJhdG9yUHJvdG90eXBlLHY9bS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHg9ZygiaXRlcmF0b3IiKSxTPSJrZXlzIixBPSJ2YWx1ZXMiLGs9ImVudHJpZXMiLEM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLHMsZyxtLE8pe2Mocix0LHMpO3ZhciBGLEksVCxNPWZ1bmN0aW9uKGUpe2lmKGU9PT1nJiZEKXJldHVybiBEO2lmKCF2JiZlIGluIFIpcmV0dXJuIFJbZV07c3dpdGNoKGUpe2Nhc2UgUzpjYXNlIEE6Y2FzZSBrOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgcih0aGlzLGUpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIodGhpcyl9fSxFPXQrIiBJdGVyYXRvciIsUD0hMSxSPWUucHJvdG90eXBlLE49Ult4XXx8UlsiQEBpdGVyYXRvciJdfHxnJiZSW2ddLEQ9IXYmJk58fE0oZyksQj0iQXJyYXkiPT10JiZSLmVudHJpZXN8fE47aWYoQiYmKEY9bChCLmNhbGwobmV3IGUpKSkhPT1PYmplY3QucHJvdG90eXBlJiZGLm5leHQmJihpfHxsKEYpPT09d3x8KGg/aChGLHcpOm8oRlt4XSl8fGYoRix4LEMpKSx1KEYsRSwhMCwhMCksaSYmKHBbRV09QykpLGImJmc9PUEmJk4mJk4ubmFtZSE9PUEmJighaSYmeT9kKFIsIm5hbWUiLEEpOihQPSEwLEQ9ZnVuY3Rpb24oKXtyZXR1cm4gYShOLHRoaXMpfSkpLGcpaWYoST17dmFsdWVzOk0oQSksa2V5czptP0Q6TShTKSxlbnRyaWVzOk0oayl9LE8pZm9yKFQgaW4gSSkodnx8UHx8IShUIGluIFIpKSYmZihSLFQsSVtUXSk7ZWxzZSBuKHt0YXJnZXQ6dCxwcm90bzohMCxmb3JjZWQ6dnx8UH0sSSk7cmV0dXJuIGkmJiFPfHxSW3hdPT09RHx8ZihSLHgsRCx7bmFtZTpnfSkscFt0XT1ELEl9fSwzMzgzOihlLHQscik9Pnt2YXIgbixhLGkscz1yKDcyOTMpLG89cig2MTQpLGM9cigxMTEpLGw9cigzMCksaD1yKDk1MTgpLHU9cig4MDUyKSxkPXIoNTExMiksZj1yKDE5MTMpLGc9ZCgiaXRlcmF0b3IiKSxwPSExO1tdLmtleXMmJigibmV4dCJpbihpPVtdLmtleXMoKSk/KGE9aChoKGkpKSkhPT1PYmplY3QucHJvdG90eXBlJiYobj1hKTpwPSEwKSwhYyhuKXx8cygoZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gbltnXS5jYWxsKGUpIT09ZX0pKT9uPXt9OmYmJihuPWwobikpLG8obltnXSl8fHUobixnLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpLGUuZXhwb3J0cz17SXRlcmF0b3JQcm90b3R5cGU6bixCVUdHWV9TQUZBUklfSVRFUkFUT1JTOnB9fSw3NDk3OmU9PntlLmV4cG9ydHM9e319LDYyNDQ6KGUsdCxyKT0+e3ZhciBuPXIoNzQ2Nik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuKGUubGVuZ3RoKX19LDYzMzk6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1yKDcyOTMpLGk9cig2MTQpLHM9cigyNTk3KSxvPXIoOTc4MSksYz1yKDY1MzApLkNPTkZJR1VSQUJMRSxsPXIoMjc4OCksaD1yKDk5MDkpLHU9aC5lbmZvcmNlLGQ9aC5nZXQsZj1TdHJpbmcsZz1PYmplY3QuZGVmaW5lUHJvcGVydHkscD1uKCIiLnNsaWNlKSxtPW4oIiIucmVwbGFjZSksYj1uKFtdLmpvaW4pLHk9byYmIWEoKGZ1bmN0aW9uKCl7cmV0dXJuIDghPT1nKChmdW5jdGlvbigpe30pLCJsZW5ndGgiLHt2YWx1ZTo4fSkubGVuZ3RofSkpLHc9U3RyaW5nKFN0cmluZykuc3BsaXQoIlN0cmluZyIpLHY9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXsiU3ltYm9sKCI9PT1wKGYodCksMCw3KSYmKHQ9IlsiK20oZih0KSwvXlN5bWJvbFwoKFteKV0qKVwpLywiJDEiKSsiXSIpLHImJnIuZ2V0dGVyJiYodD0iZ2V0ICIrdCksciYmci5zZXR0ZXImJih0PSJzZXQgIit0KSwoIXMoZSwibmFtZSIpfHxjJiZlLm5hbWUhPT10KSYmKG8/ZyhlLCJuYW1lIix7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KTplLm5hbWU9dCkseSYmciYmcyhyLCJhcml0eSIpJiZlLmxlbmd0aCE9PXIuYXJpdHkmJmcoZSwibGVuZ3RoIix7dmFsdWU6ci5hcml0eX0pO3RyeXtyJiZzKHIsImNvbnN0cnVjdG9yIikmJnIuY29uc3RydWN0b3I/byYmZyhlLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pOmUucHJvdG90eXBlJiYoZS5wcm90b3R5cGU9dm9pZCAwKX1jYXRjaChlKXt9dmFyIG49dShlKTtyZXR1cm4gcyhuLCJzb3VyY2UiKXx8KG4uc291cmNlPWIodywic3RyaW5nIj09dHlwZW9mIHQ/dDoiIikpLGV9O0Z1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz12KChmdW5jdGlvbigpe3JldHVybiBpKHRoaXMpJiZkKHRoaXMpLnNvdXJjZXx8bCh0aGlzKX0pLCJ0b1N0cmluZyIpfSw0NzU4OmU9Pnt2YXIgdD1NYXRoLmNlaWwscj1NYXRoLmZsb29yO2UuZXhwb3J0cz1NYXRoLnRydW5jfHxmdW5jdGlvbihlKXt2YXIgbj0rZTtyZXR1cm4obj4wP3I6dCkobil9fSw1OTQ4OihlLHQscik9Pnt2YXIgbixhLGkscyxvLGM9cig3ODU0KSxsPXIoOTk3NCksaD1yKDEyMzYpLmYsdT1yKDI2MSkuc2V0LGQ9cig4NTcyKSxmPXIoNjgzMyksZz1yKDE1MjgpLHA9cigxMDM2KSxtPXIoNTI2OCksYj1jLk11dGF0aW9uT2JzZXJ2ZXJ8fGMuV2ViS2l0TXV0YXRpb25PYnNlcnZlcix5PWMuZG9jdW1lbnQsdz1jLnByb2Nlc3Msdj1jLlByb21pc2UseD1oKGMsInF1ZXVlTWljcm90YXNrIiksUz14JiZ4LnZhbHVlO2lmKCFTKXt2YXIgQT1uZXcgZCxrPWZ1bmN0aW9uKCl7dmFyIGUsdDtmb3IobSYmKGU9dy5kb21haW4pJiZlLmV4aXQoKTt0PUEuZ2V0KCk7KXRyeXt0KCl9Y2F0Y2goZSl7dGhyb3cgQS5oZWFkJiZuKCksZX1lJiZlLmVudGVyKCl9O2Z8fG18fHB8fCFifHwheT8hZyYmdiYmdi5yZXNvbHZlPygocz12LnJlc29sdmUodm9pZCAwKSkuY29uc3RydWN0b3I9dixvPWwocy50aGVuLHMpLG49ZnVuY3Rpb24oKXtvKGspfSk6bT9uPWZ1bmN0aW9uKCl7dy5uZXh0VGljayhrKX06KHU9bCh1LGMpLG49ZnVuY3Rpb24oKXt1KGspfSk6KGE9ITAsaT15LmNyZWF0ZVRleHROb2RlKCIiKSxuZXcgYihrKS5vYnNlcnZlKGkse2NoYXJhY3RlckRhdGE6ITB9KSxuPWZ1bmN0aW9uKCl7aS5kYXRhPWE9IWF9KSxTPWZ1bmN0aW9uKGUpe0EuaGVhZHx8bigpLEEuYWRkKGUpfX1lLmV4cG9ydHM9U30sODUyMzooZSx0LHIpPT57dmFyIG49cig5NjYyKSxhPVR5cGVFcnJvcixpPWZ1bmN0aW9uKGUpe3ZhciB0LHI7dGhpcy5wcm9taXNlPW5ldyBlKChmdW5jdGlvbihlLG4pe2lmKHZvaWQgMCE9PXR8fHZvaWQgMCE9PXIpdGhyb3cgYSgiQmFkIFByb21pc2UgY29uc3RydWN0b3IiKTt0PWUscj1ufSkpLHRoaXMucmVzb2x2ZT1uKHQpLHRoaXMucmVqZWN0PW4ocil9O2UuZXhwb3J0cy5mPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgaShlKX19LDYyNzc6KGUsdCxyKT0+e3ZhciBuPXIoMTM0MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PWU/YXJndW1lbnRzLmxlbmd0aDwyPyIiOnQ6bihlKX19LDM5Mjk6KGUsdCxyKT0+e3ZhciBuPXIoNzg1MCksYT1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKG4oZSkpdGhyb3cgYSgiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zIik7cmV0dXJuIGV9fSwyODE0OihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cig3MjkzKSxpPXIoMTcwMikscz1yKDEzNDApLG89cigzMTExKS50cmltLGM9cigxMzYxKSxsPWkoIiIuY2hhckF0KSxoPW4ucGFyc2VGbG9hdCx1PW4uU3ltYm9sLGQ9dSYmdS5pdGVyYXRvcixmPTEvaChjKyItMCIpIT0tMS8wfHxkJiYhYSgoZnVuY3Rpb24oKXtoKE9iamVjdChkKSl9KSk7ZS5leHBvcnRzPWY/ZnVuY3Rpb24oZSl7dmFyIHQ9byhzKGUpKSxyPWgodCk7cmV0dXJuIDA9PT1yJiYiLSI9PWwodCwwKT8tMDpyfTpofSwzMDA5OihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cig3MjkzKSxpPXIoMTcwMikscz1yKDEzNDApLG89cigzMTExKS50cmltLGM9cigxMzYxKSxsPW4ucGFyc2VJbnQsaD1uLlN5bWJvbCx1PWgmJmguaXRlcmF0b3IsZD0vXlsrLV0/MHgvaSxmPWkoZC5leGVjKSxnPTghPT1sKGMrIjA4Iil8fDIyIT09bChjKyIweDE2Iil8fHUmJiFhKChmdW5jdGlvbigpe2woT2JqZWN0KHUpKX0pKTtlLmV4cG9ydHM9Zz9mdW5jdGlvbihlLHQpe3ZhciByPW8ocyhlKSk7cmV0dXJuIGwocix0Pj4+MHx8KGYoZCxyKT8xNjoxMCkpfTpsfSwxNTc0OihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cigxNzAyKSxpPXIoNjkxNikscz1yKDcyOTMpLG89cigxOTU2KSxjPXIoNTE4MSksbD1yKDUyOTYpLGg9cig3OTA4KSx1PXIoODM2MSksZD1PYmplY3QuYXNzaWduLGY9T2JqZWN0LmRlZmluZVByb3BlcnR5LGc9YShbXS5jb25jYXQpO2UuZXhwb3J0cz0hZHx8cygoZnVuY3Rpb24oKXtpZihuJiYxIT09ZCh7YjoxfSxkKGYoe30sImEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2YodGhpcywiYiIse3ZhbHVlOjMsZW51bWVyYWJsZTohMX0pfX0pLHtiOjJ9KSkuYilyZXR1cm4hMDt2YXIgZT17fSx0PXt9LHI9U3ltYm9sKCksYT0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiO3JldHVybiBlW3JdPTcsYS5zcGxpdCgiIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlXT1lfSkpLDchPWQoe30sZSlbcl18fG8oZCh7fSx0KSkuam9pbigiIikhPWF9KSk/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9aChlKSxhPWFyZ3VtZW50cy5sZW5ndGgscz0xLGQ9Yy5mLGY9bC5mO2E+czspZm9yKHZhciBwLG09dShhcmd1bWVudHNbcysrXSksYj1kP2cobyhtKSxkKG0pKTpvKG0pLHk9Yi5sZW5ndGgsdz0wO3k+dzspcD1iW3crK10sbiYmIWkoZixtLHApfHwocltwXT1tW3BdKTtyZXR1cm4gcn06ZH0sMzA6KGUsdCxyKT0+e3ZhciBuLGE9cig5NjcwKSxpPXIoNjA0OCkscz1yKDc0OCksbz1yKDM1MDEpLGM9cig0OTApLGw9cigzMTcpLGg9cig2MjAwKSx1PSJwcm90b3R5cGUiLGQ9InNjcmlwdCIsZj1oKCJJRV9QUk9UTyIpLGc9ZnVuY3Rpb24oKXt9LHA9ZnVuY3Rpb24oZSl7cmV0dXJuIjwiK2QrIj4iK2UrIjwvIitkKyI+In0sbT1mdW5jdGlvbihlKXtlLndyaXRlKHAoIiIpKSxlLmNsb3NlKCk7dmFyIHQ9ZS5wYXJlbnRXaW5kb3cuT2JqZWN0O3JldHVybiBlPW51bGwsdH0sYj1mdW5jdGlvbigpe3RyeXtuPW5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpfWNhdGNoKGUpe312YXIgZSx0LHI7Yj0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmRvbWFpbiYmbj9tKG4pOih0PWwoImlmcmFtZSIpLHI9ImphdmEiK2QrIjoiLHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsYy5hcHBlbmRDaGlsZCh0KSx0LnNyYz1TdHJpbmcociksKGU9dC5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksZS53cml0ZShwKCJkb2N1bWVudC5GPU9iamVjdCIpKSxlLmNsb3NlKCksZS5GKTptKG4pO2Zvcih2YXIgYT1zLmxlbmd0aDthLS07KWRlbGV0ZSBiW3VdW3NbYV1dO3JldHVybiBiKCl9O29bZl09ITAsZS5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKGUsdCl7dmFyIHI7cmV0dXJuIG51bGwhPT1lPyhnW3VdPWEoZSkscj1uZXcgZyxnW3VdPW51bGwscltmXT1lKTpyPWIoKSx2b2lkIDA9PT10P3I6aS5mKHIsdCl9fSw2MDQ4OihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cigzMzUzKSxpPXIoMzA3MCkscz1yKDk2NzApLG89cig1NjU2KSxjPXIoMTk1Nik7dC5mPW4mJiFhP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCl7cyhlKTtmb3IodmFyIHIsbj1vKHQpLGE9Yyh0KSxsPWEubGVuZ3RoLGg9MDtsPmg7KWkuZihlLHI9YVtoKytdLG5bcl0pO3JldHVybiBlfX0sMzA3MDooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoNDY2NCksaT1yKDMzNTMpLHM9cig5NjcwKSxvPXIoNDk0OCksYz1UeXBlRXJyb3IsbD1PYmplY3QuZGVmaW5lUHJvcGVydHksaD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHU9ImVudW1lcmFibGUiLGQ9ImNvbmZpZ3VyYWJsZSIsZj0id3JpdGFibGUiO3QuZj1uP2k/ZnVuY3Rpb24oZSx0LHIpe2lmKHMoZSksdD1vKHQpLHMociksImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJwcm90b3R5cGUiPT09dCYmInZhbHVlImluIHImJmYgaW4gciYmIXJbZl0pe3ZhciBuPWgoZSx0KTtuJiZuW2ZdJiYoZVt0XT1yLnZhbHVlLHI9e2NvbmZpZ3VyYWJsZTpkIGluIHI/cltkXTpuW2RdLGVudW1lcmFibGU6dSBpbiByP3JbdV06blt1XSx3cml0YWJsZTohMX0pfXJldHVybiBsKGUsdCxyKX06bDpmdW5jdGlvbihlLHQscil7aWYocyhlKSx0PW8odCkscyhyKSxhKXRyeXtyZXR1cm4gbChlLHQscil9Y2F0Y2goZSl7fWlmKCJnZXQiaW4gcnx8InNldCJpbiByKXRocm93IGMoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIHImJihlW3RdPXIudmFsdWUpLGV9fSwxMjM2OihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cig2OTE2KSxpPXIoNTI5Nikscz1yKDkxMTQpLG89cig1NjU2KSxjPXIoNDk0OCksbD1yKDI1OTcpLGg9cig0NjY0KSx1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7dC5mPW4/dTpmdW5jdGlvbihlLHQpe2lmKGU9byhlKSx0PWModCksaCl0cnl7cmV0dXJuIHUoZSx0KX1jYXRjaChlKXt9aWYobChlLHQpKXJldHVybiBzKCFhKGkuZixlLHQpLGVbdF0pfX0sMTE1NjooZSx0LHIpPT57dmFyIG49cig0MzI2KSxhPXIoNTY1NiksaT1yKDgwMDYpLmYscz1yKDE1ODkpLG89Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTtlLmV4cG9ydHMuZj1mdW5jdGlvbihlKXtyZXR1cm4gbyYmIldpbmRvdyI9PW4oZSk/ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBpKGUpfWNhdGNoKGUpe3JldHVybiBzKG8pfX0oZSk6aShhKGUpKX19LDgwMDY6KGUsdCxyKT0+e3ZhciBuPXIoNjMyNCksYT1yKDc0OCkuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTt0LmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKGUpe3JldHVybiBuKGUsYSl9fSw1MTgxOihlLHQpPT57dC5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LDk1MTg6KGUsdCxyKT0+e3ZhciBuPXIoMjU5NyksYT1yKDYxNCksaT1yKDc5MDgpLHM9cig2MjAwKSxvPXIoODU0NCksYz1zKCJJRV9QUk9UTyIpLGw9T2JqZWN0LGg9bC5wcm90b3R5cGU7ZS5leHBvcnRzPW8/bC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihlKXt2YXIgdD1pKGUpO2lmKG4odCxjKSlyZXR1cm4gdFtjXTt2YXIgcj10LmNvbnN0cnVjdG9yO3JldHVybiBhKHIpJiZ0IGluc3RhbmNlb2Ygcj9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgbD9oOm51bGx9fSwyMDUwOihlLHQscik9Pnt2YXIgbj1yKDcyOTMpLGE9cigxMTEpLGk9cig0MzI2KSxzPXIoNzU1Niksbz1PYmplY3QuaXNFeHRlbnNpYmxlLGM9bigoZnVuY3Rpb24oKXtvKDEpfSkpO2UuZXhwb3J0cz1jfHxzP2Z1bmN0aW9uKGUpe3JldHVybiEhYShlKSYmKCFzfHwiQXJyYXlCdWZmZXIiIT1pKGUpKSYmKCFvfHxvKGUpKX06b30sNzk3NjooZSx0LHIpPT57dmFyIG49cigxNzAyKTtlLmV4cG9ydHM9bih7fS5pc1Byb3RvdHlwZU9mKX0sNjMyNDooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoMjU5NyksaT1yKDU2NTYpLHM9cigxMzE4KS5pbmRleE9mLG89cigzNTAxKSxjPW4oW10ucHVzaCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbj1pKGUpLGw9MCxoPVtdO2ZvcihyIGluIG4pIWEobyxyKSYmYShuLHIpJiZjKGgscik7Zm9yKDt0Lmxlbmd0aD5sOylhKG4scj10W2wrK10pJiYofnMoaCxyKXx8YyhoLHIpKTtyZXR1cm4gaH19LDE5NTY6KGUsdCxyKT0+e3ZhciBuPXIoNjMyNCksYT1yKDc0OCk7ZS5leHBvcnRzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihlKXtyZXR1cm4gbihlLGEpfX0sNTI5NjooZSx0KT0+e3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixhPW4mJiFyLmNhbGwoezE6Mn0sMSk7dC5mPWE/ZnVuY3Rpb24oZSl7dmFyIHQ9bih0aGlzLGUpO3JldHVybiEhdCYmdC5lbnVtZXJhYmxlfTpyfSw3Njc0OihlLHQscik9Pnt2YXIgbj1yKDU2NjgpLGE9cig5NjcwKSxpPXIoNjA3Nyk7ZS5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciBlLHQ9ITEscj17fTt0cnl7KGU9bihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iLCJzZXQiKSkocixbXSksdD1yIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2goZSl7fXJldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiBhKHIpLGkobiksdD9lKHIsbik6ci5fX3Byb3RvX189bixyfX0oKTp2b2lkIDApfSwyMTQwOihlLHQscik9Pnt2YXIgbj1yKDY5MTYpLGE9cig2MTQpLGk9cigxMTEpLHM9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByLG87aWYoInN0cmluZyI9PT10JiZhKHI9ZS50b1N0cmluZykmJiFpKG89bihyLGUpKSlyZXR1cm4gbztpZihhKHI9ZS52YWx1ZU9mKSYmIWkobz1uKHIsZSkpKXJldHVybiBvO2lmKCJzdHJpbmciIT09dCYmYShyPWUudG9TdHJpbmcpJiYhaShvPW4ocixlKSkpcmV0dXJuIG87dGhyb3cgcygiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSwzODg3OihlLHQscik9Pnt2YXIgbj1yKDUwMDUpLGE9cigxNzAyKSxpPXIoODAwNikscz1yKDUxODEpLG89cig5NjcwKSxjPWEoW10uY29uY2F0KTtlLmV4cG9ydHM9bigiUmVmbGVjdCIsIm93bktleXMiKXx8ZnVuY3Rpb24oZSl7dmFyIHQ9aS5mKG8oZSkpLHI9cy5mO3JldHVybiByP2ModCxyKGUpKTp0fX0sMjUzNDplPT57ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm57ZXJyb3I6ITEsdmFsdWU6ZSgpfX1jYXRjaChlKXtyZXR1cm57ZXJyb3I6ITAsdmFsdWU6ZX19fX0sMzcwMjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoMjQ5MiksaT1yKDYxNCkscz1yKDQ3MDUpLG89cigyNzg4KSxjPXIoNTExMiksbD1yKDc4NzEpLGg9cigzODIzKSx1PXIoMTkxMyksZD1yKDczOTIpLGY9YSYmYS5wcm90b3R5cGUsZz1jKCJzcGVjaWVzIikscD0hMSxtPWkobi5Qcm9taXNlUmVqZWN0aW9uRXZlbnQpLGI9cygiUHJvbWlzZSIsKGZ1bmN0aW9uKCl7dmFyIGU9byhhKSx0PWUhPT1TdHJpbmcoYSk7aWYoIXQmJjY2PT09ZClyZXR1cm4hMDtpZih1JiYoIWYuY2F0Y2h8fCFmLmZpbmFsbHkpKXJldHVybiEwO2lmKCFkfHxkPDUxfHwhL25hdGl2ZSBjb2RlLy50ZXN0KGUpKXt2YXIgcj1uZXcgYSgoZnVuY3Rpb24oZSl7ZSgxKX0pKSxuPWZ1bmN0aW9uKGUpe2UoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKCl7fSkpfTtpZigoci5jb25zdHJ1Y3Rvcj17fSlbZ109biwhKHA9ci50aGVuKChmdW5jdGlvbigpe30pKWluc3RhbmNlb2YgbikpcmV0dXJuITB9cmV0dXJuIXQmJihsfHxoKSYmIW19KSk7ZS5leHBvcnRzPXtDT05TVFJVQ1RPUjpiLFJFSkVDVElPTl9FVkVOVDptLFNVQkNMQVNTSU5HOnB9fSwyNDkyOihlLHQscik9Pnt2YXIgbj1yKDc4NTQpO2UuZXhwb3J0cz1uLlByb21pc2V9LDk0Nzg6KGUsdCxyKT0+e3ZhciBuPXIoOTY3MCksYT1yKDExMSksaT1yKDg1MjMpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKG4oZSksYSh0KSYmdC5jb25zdHJ1Y3Rvcj09PWUpcmV0dXJuIHQ7dmFyIHI9aS5mKGUpO3JldHVybigwLHIucmVzb2x2ZSkodCksci5wcm9taXNlfX0sNjEyOihlLHQscik9Pnt2YXIgbj1yKDI0OTIpLGE9cig3MDcyKSxpPXIoMzcwMikuQ09OU1RSVUNUT1I7ZS5leHBvcnRzPWl8fCFhKChmdW5jdGlvbihlKXtuLmFsbChlKS50aGVuKHZvaWQgMCwoZnVuY3Rpb24oKXt9KSl9KSl9LDI2MjY6KGUsdCxyKT0+e3ZhciBuPXIoMzA3MCkuZjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LHIpe3IgaW4gZXx8bihlLHIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtyXX0sc2V0OmZ1bmN0aW9uKGUpe3Rbcl09ZX19KX19LDg1NzI6ZT0+e3ZhciB0PWZ1bmN0aW9uKCl7dGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGx9O3QucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24oZSl7dmFyIHQ9e2l0ZW06ZSxuZXh0Om51bGx9LHI9dGhpcy50YWlsO3I/ci5uZXh0PXQ6dGhpcy5oZWFkPXQsdGhpcy50YWlsPXR9LGdldDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZDtpZihlKXJldHVybiBudWxsPT09KHRoaXMuaGVhZD1lLm5leHQpJiYodGhpcy50YWlsPW51bGwpLGUuaXRlbX19LGUuZXhwb3J0cz10fSw3NjUxOihlLHQscik9Pnt2YXIgbj1yKDY5MTYpLGE9cig5NjcwKSxpPXIoNjE0KSxzPXIoNDMyNiksbz1yKDIyNjEpLGM9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPWUuZXhlYztpZihpKHIpKXt2YXIgbD1uKHIsZSx0KTtyZXR1cm4gbnVsbCE9PWwmJmEobCksbH1pZigiUmVnRXhwIj09PXMoZSkpcmV0dXJuIG4obyxlLHQpO3Rocm93IGMoIlJlZ0V4cCNleGVjIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXIiKX19LDIyNjE6KGUsdCxyKT0+e3ZhciBuLGEsaT1yKDY5MTYpLHM9cigxNzAyKSxvPXIoMTM0MCksYz1yKDcwNjYpLGw9cigyOTk5KSxoPXIoMjMwOSksdT1yKDMwKSxkPXIoOTkwOSkuZ2V0LGY9cig5NDQxKSxnPXIoNzE2OCkscD1oKCJuYXRpdmUtc3RyaW5nLXJlcGxhY2UiLFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSksbT1SZWdFeHAucHJvdG90eXBlLmV4ZWMsYj1tLHk9cygiIi5jaGFyQXQpLHc9cygiIi5pbmRleE9mKSx2PXMoIiIucmVwbGFjZSkseD1zKCIiLnNsaWNlKSxTPShhPS9iKi9nLGkobSxuPS9hLywiYSIpLGkobSxhLCJhIiksMCE9PW4ubGFzdEluZGV4fHwwIT09YS5sYXN0SW5kZXgpLEE9bC5CUk9LRU5fQ0FSRVQsaz12b2lkIDAhPT0vKCk/Py8uZXhlYygiIilbMV07KFN8fGt8fEF8fGZ8fGcpJiYoYj1mdW5jdGlvbihlKXt2YXIgdCxyLG4sYSxzLGwsaCxmPXRoaXMsZz1kKGYpLEM9byhlKSxPPWcucmF3O2lmKE8pcmV0dXJuIE8ubGFzdEluZGV4PWYubGFzdEluZGV4LHQ9aShiLE8sQyksZi5sYXN0SW5kZXg9Ty5sYXN0SW5kZXgsdDt2YXIgRj1nLmdyb3VwcyxJPUEmJmYuc3RpY2t5LFQ9aShjLGYpLE09Zi5zb3VyY2UsRT0wLFA9QztpZihJJiYoVD12KFQsInkiLCIiKSwtMT09PXcoVCwiZyIpJiYoVCs9ImciKSxQPXgoQyxmLmxhc3RJbmRleCksZi5sYXN0SW5kZXg+MCYmKCFmLm11bHRpbGluZXx8Zi5tdWx0aWxpbmUmJiJcbiIhPT15KEMsZi5sYXN0SW5kZXgtMSkpJiYoTT0iKD86ICIrTSsiKSIsUD0iICIrUCxFKyspLHI9bmV3IFJlZ0V4cCgiXig/OiIrTSsiKSIsVCkpLGsmJihyPW5ldyBSZWdFeHAoIl4iK00rIiQoPyFcXHMpIixUKSksUyYmKG49Zi5sYXN0SW5kZXgpLGE9aShtLEk/cjpmLFApLEk/YT8oYS5pbnB1dD14KGEuaW5wdXQsRSksYVswXT14KGFbMF0sRSksYS5pbmRleD1mLmxhc3RJbmRleCxmLmxhc3RJbmRleCs9YVswXS5sZW5ndGgpOmYubGFzdEluZGV4PTA6UyYmYSYmKGYubGFzdEluZGV4PWYuZ2xvYmFsP2EuaW5kZXgrYVswXS5sZW5ndGg6biksayYmYSYmYS5sZW5ndGg+MSYmaShwLGFbMF0sciwoZnVuY3Rpb24oKXtmb3Iocz0xO3M8YXJndW1lbnRzLmxlbmd0aC0yO3MrKyl2b2lkIDA9PT1hcmd1bWVudHNbc10mJihhW3NdPXZvaWQgMCl9KSksYSYmRilmb3IoYS5ncm91cHM9bD11KG51bGwpLHM9MDtzPEYubGVuZ3RoO3MrKylsWyhoPUZbc10pWzBdXT1hW2hbMV1dO3JldHVybiBhfSksZS5leHBvcnRzPWJ9LDcwNjY6KGUsdCxyKT0+e3ZhciBuPXIoOTY3MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGU9bih0aGlzKSx0PSIiO3JldHVybiBlLmhhc0luZGljZXMmJih0Kz0iZCIpLGUuZ2xvYmFsJiYodCs9ImciKSxlLmlnbm9yZUNhc2UmJih0Kz0iaSIpLGUubXVsdGlsaW5lJiYodCs9Im0iKSxlLmRvdEFsbCYmKHQrPSJzIiksZS51bmljb2RlJiYodCs9InUiKSxlLnVuaWNvZGVTZXRzJiYodCs9InYiKSxlLnN0aWNreSYmKHQrPSJ5IiksdH19LDQ3MDY6KGUsdCxyKT0+e3ZhciBuPXIoNjkxNiksYT1yKDI1OTcpLGk9cig3OTc2KSxzPXIoNzA2Niksbz1SZWdFeHAucHJvdG90eXBlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLmZsYWdzO3JldHVybiB2b2lkIDAhPT10fHwiZmxhZ3MiaW4gb3x8YShlLCJmbGFncyIpfHwhaShvLGUpP3Q6bihzLGUpfX0sMjk5OTooZSx0LHIpPT57dmFyIG49cig3MjkzKSxhPXIoNzg1NCkuUmVnRXhwLGk9bigoZnVuY3Rpb24oKXt2YXIgZT1hKCJhIiwieSIpO3JldHVybiBlLmxhc3RJbmRleD0yLG51bGwhPWUuZXhlYygiYWJjZCIpfSkpLHM9aXx8bigoZnVuY3Rpb24oKXtyZXR1cm4hYSgiYSIsInkiKS5zdGlja3l9KSksbz1pfHxuKChmdW5jdGlvbigpe3ZhciBlPWEoIl5yIiwiZ3kiKTtyZXR1cm4gZS5sYXN0SW5kZXg9MixudWxsIT1lLmV4ZWMoInN0ciIpfSkpO2UuZXhwb3J0cz17QlJPS0VOX0NBUkVUOm8sTUlTU0VEX1NUSUNLWTpzLFVOU1VQUE9SVEVEX1k6aX19LDk0NDE6KGUsdCxyKT0+e3ZhciBuPXIoNzI5MyksYT1yKDc4NTQpLlJlZ0V4cDtlLmV4cG9ydHM9bigoZnVuY3Rpb24oKXt2YXIgZT1hKCIuIiwicyIpO3JldHVybiEoZS5kb3RBbGwmJmUuZXhlYygiXG4iKSYmInMiPT09ZS5mbGFncyl9KSl9LDcxNjg6KGUsdCxyKT0+e3ZhciBuPXIoNzI5MyksYT1yKDc4NTQpLlJlZ0V4cDtlLmV4cG9ydHM9bigoZnVuY3Rpb24oKXt2YXIgZT1hKCIoPzxhPmIpIiwiZyIpO3JldHVybiJiIiE9PWUuZXhlYygiYiIpLmdyb3Vwcy5hfHwiYmMiIT09ImIiLnJlcGxhY2UoZSwiJDxhPmMiKX0pKX0sNDQ4ODooZSx0LHIpPT57dmFyIG49cig4NTU0KSxhPVR5cGVFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobihlKSl0aHJvdyBhKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK2UpO3JldHVybiBlfX0sNjM0MDooZSx0LHIpPT57dmFyIG49cig1MDA1KSxhPXIoNzA0NSksaT1yKDUxMTIpLHM9cig5NzgxKSxvPWkoInNwZWNpZXMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKTtzJiZ0JiYhdFtvXSYmYSh0LG8se2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LDgwMDM6KGUsdCxyKT0+e3ZhciBuPXIoMzA3MCkuZixhPXIoMjU5NyksaT1yKDUxMTIpKCJ0b1N0cmluZ1RhZyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7ZSYmIXImJihlPWUucHJvdG90eXBlKSxlJiYhYShlLGkpJiZuKGUsaSx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnR9KX19LDYyMDA6KGUsdCxyKT0+e3ZhciBuPXIoMjMwOSksYT1yKDk3MTEpLGk9bigia2V5cyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaVtlXXx8KGlbZV09YShlKSl9fSw1NDY1OihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cigzMDcyKSxpPSJfX2NvcmUtanNfc2hhcmVkX18iLHM9bltpXXx8YShpLHt9KTtlLmV4cG9ydHM9c30sMjMwOTooZSx0LHIpPT57dmFyIG49cigxOTEzKSxhPXIoNTQ2NSk7KGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBhW2VdfHwoYVtlXT12b2lkIDAhPT10P3Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4zMi4wIixtb2RlOm4/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAxNC0yMDIzIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIixsaWNlbnNlOiJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9ibG9iL3YzLjMyLjAvTElDRU5TRSIsc291cmNlOiJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcyJ9KX0sNjcwNzooZSx0LHIpPT57dmFyIG49cig5NjcwKSxhPXIoOTQ4MyksaT1yKDg1NTQpLHM9cig1MTEyKSgic3BlY2llcyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByLG89bihlKS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09b3x8aShyPW4obylbc10pP3Q6YShyKX19LDg3MTA6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMiksYT1yKDkzMDMpLGk9cigxMzQwKSxzPXIoNDQ4OCksbz1uKCIiLmNoYXJBdCksYz1uKCIiLmNoYXJDb2RlQXQpLGw9bigiIi5zbGljZSksaD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyKXt2YXIgbixoLHU9aShzKHQpKSxkPWEociksZj11Lmxlbmd0aDtyZXR1cm4gZDwwfHxkPj1mP2U/IiI6dm9pZCAwOihuPWModSxkKSk8NTUyOTZ8fG4+NTYzMTl8fGQrMT09PWZ8fChoPWModSxkKzEpKTw1NjMyMHx8aD41NzM0Mz9lP28odSxkKTpuOmU/bCh1LGQsZCsyKTpoLTU2MzIwKyhuLTU1Mjk2PDwxMCkrNjU1MzZ9fTtlLmV4cG9ydHM9e2NvZGVBdDpoKCExKSxjaGFyQXQ6aCghMCl9fSwzMTk3OihlLHQscik9Pnt2YXIgbj1yKDE3MDIpLGE9MjE0NzQ4MzY0NyxpPS9bXlwwLVx1MDA3RV0vLHM9L1suXHUzMDAyXHVGRjBFXHVGRjYxXS9nLG89Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIixjPVJhbmdlRXJyb3IsbD1uKHMuZXhlYyksaD1NYXRoLmZsb29yLHU9U3RyaW5nLmZyb21DaGFyQ29kZSxkPW4oIiIuY2hhckNvZGVBdCksZj1uKFtdLmpvaW4pLGc9bihbXS5wdXNoKSxwPW4oIiIucmVwbGFjZSksbT1uKCIiLnNwbGl0KSxiPW4oIiIudG9Mb3dlckNhc2UpLHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGUrMjIrNzUqKGU8MjYpfSx3PWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj0wO2ZvcihlPXI/aChlLzcwMCk6ZT4+MSxlKz1oKGUvdCk7ZT40NTU7KWU9aChlLzM1KSxuKz0zNjtyZXR1cm4gaChuKzM2KmUvKGUrMzgpKX0sdj1mdW5jdGlvbihlKXt2YXIgdD1bXTtlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxyPTAsbj1lLmxlbmd0aDtyPG47KXt2YXIgYT1kKGUscisrKTtpZihhPj01NTI5NiYmYTw9NTYzMTkmJnI8bil7dmFyIGk9ZChlLHIrKyk7NTYzMjA9PSg2NDUxMiZpKT9nKHQsKCgxMDIzJmEpPDwxMCkrKDEwMjMmaSkrNjU1MzYpOihnKHQsYSksci0tKX1lbHNlIGcodCxhKX1yZXR1cm4gdH0oZSk7dmFyIHIsbixpPWUubGVuZ3RoLHM9MTI4LGw9MCxwPTcyO2ZvcihyPTA7cjxlLmxlbmd0aDtyKyspKG49ZVtyXSk8MTI4JiZnKHQsdShuKSk7dmFyIG09dC5sZW5ndGgsYj1tO2ZvcihtJiZnKHQsIi0iKTtiPGk7KXt2YXIgdj1hO2ZvcihyPTA7cjxlLmxlbmd0aDtyKyspKG49ZVtyXSk+PXMmJm48diYmKHY9bik7dmFyIHg9YisxO2lmKHYtcz5oKChhLWwpL3gpKXRocm93IGMobyk7Zm9yKGwrPSh2LXMpKngscz12LHI9MDtyPGUubGVuZ3RoO3IrKyl7aWYoKG49ZVtyXSk8cyYmKytsPmEpdGhyb3cgYyhvKTtpZihuPT1zKXtmb3IodmFyIFM9bCxBPTM2Ozspe3ZhciBrPUE8PXA/MTpBPj1wKzI2PzI2OkEtcDtpZihTPGspYnJlYWs7dmFyIEM9Uy1rLE89MzYtaztnKHQsdSh5KGsrQyVPKSkpLFM9aChDL08pLEErPTM2fWcodCx1KHkoUykpKSxwPXcobCx4LGI9PW0pLGw9MCxiKyt9fWwrKyxzKyt9cmV0dXJuIGYodCwiIil9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdCxyLG49W10sYT1tKHAoYihlKSxzLCIuIiksIi4iKTtmb3IodD0wO3Q8YS5sZW5ndGg7dCsrKXI9YVt0XSxnKG4sbChpLHIpPyJ4bi0tIit2KHIpOnIpO3JldHVybiBmKG4sIi4iKX19LDg0MTU6KGUsdCxyKT0+e3ZhciBuPXIoOTMwMyksYT1yKDEzNDApLGk9cig0NDg4KSxzPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWEoaSh0aGlzKSkscj0iIixvPW4oZSk7aWYobzwwfHxvPT0xLzApdGhyb3cgcygiV3JvbmcgbnVtYmVyIG9mIHJlcGV0aXRpb25zIik7Zm9yKDtvPjA7KG8+Pj49MSkmJih0Kz10KSkxJm8mJihyKz10KTtyZXR1cm4gcn19LDYwOTE6KGUsdCxyKT0+e3ZhciBuPXIoNjUzMCkuUFJPUEVSLGE9cig3MjkzKSxpPXIoMTM2MSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhKChmdW5jdGlvbigpe3JldHVybiEhaVtlXSgpfHwi4oCLwoXhoI4iIT09IuKAi8KF4aCOIltlXSgpfHxuJiZpW2VdLm5hbWUhPT1lfSkpfX0sMzExMTooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPXIoNDQ4OCksaT1yKDEzNDApLHM9cigxMzYxKSxvPW4oIiIucmVwbGFjZSksYz1SZWdFeHAoIl5bIitzKyJdKyIpLGw9UmVnRXhwKCIoXnxbXiIrcysiXSlbIitzKyJdKyQiKSxoPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1pKGEodCkpO3JldHVybiAxJmUmJihyPW8ocixjLCIiKSksMiZlJiYocj1vKHIsbCwiJDEiKSkscn19O2UuZXhwb3J0cz17c3RhcnQ6aCgxKSxlbmQ6aCgyKSx0cmltOmgoMyl9fSw2MjkzOihlLHQscik9Pnt2YXIgbj1yKDczOTIpLGE9cig3MjkzKSxpPXIoNzg1NCkuU3RyaW5nO2UuZXhwb3J0cz0hIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJiFhKChmdW5jdGlvbigpe3ZhciBlPVN5bWJvbCgpO3JldHVybiFpKGUpfHwhKE9iamVjdChlKWluc3RhbmNlb2YgU3ltYm9sKXx8IVN5bWJvbC5zaGFtJiZuJiZuPDQxfSkpfSwyNjE6KGUsdCxyKT0+e3ZhciBuLGEsaSxzLG89cig3ODU0KSxjPXIoMjEwNCksbD1yKDk5NzQpLGg9cig2MTQpLHU9cigyNTk3KSxkPXIoNzI5MyksZj1yKDQ5MCksZz1yKDIwNikscD1yKDMxNyksbT1yKDgwNTMpLGI9cig2ODMzKSx5PXIoNTI2OCksdz1vLnNldEltbWVkaWF0ZSx2PW8uY2xlYXJJbW1lZGlhdGUseD1vLnByb2Nlc3MsUz1vLkRpc3BhdGNoLEE9by5GdW5jdGlvbixrPW8uTWVzc2FnZUNoYW5uZWwsQz1vLlN0cmluZyxPPTAsRj17fSxJPSJvbnJlYWR5c3RhdGVjaGFuZ2UiO2QoKGZ1bmN0aW9uKCl7bj1vLmxvY2F0aW9ufSkpO3ZhciBUPWZ1bmN0aW9uKGUpe2lmKHUoRixlKSl7dmFyIHQ9RltlXTtkZWxldGUgRltlXSx0KCl9fSxNPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe1QoZSl9fSxFPWZ1bmN0aW9uKGUpe1QoZS5kYXRhKX0sUD1mdW5jdGlvbihlKXtvLnBvc3RNZXNzYWdlKEMoZSksbi5wcm90b2NvbCsiLy8iK24uaG9zdCl9O3cmJnZ8fCh3PWZ1bmN0aW9uKGUpe20oYXJndW1lbnRzLmxlbmd0aCwxKTt2YXIgdD1oKGUpP2U6QShlKSxyPWcoYXJndW1lbnRzLDEpO3JldHVybiBGWysrT109ZnVuY3Rpb24oKXtjKHQsdm9pZCAwLHIpfSxhKE8pLE99LHY9ZnVuY3Rpb24oZSl7ZGVsZXRlIEZbZV19LHk/YT1mdW5jdGlvbihlKXt4Lm5leHRUaWNrKE0oZSkpfTpTJiZTLm5vdz9hPWZ1bmN0aW9uKGUpe1Mubm93KE0oZSkpfTprJiYhYj8ocz0oaT1uZXcgaykucG9ydDIsaS5wb3J0MS5vbm1lc3NhZ2U9RSxhPWwocy5wb3N0TWVzc2FnZSxzKSk6by5hZGRFdmVudExpc3RlbmVyJiZoKG8ucG9zdE1lc3NhZ2UpJiYhby5pbXBvcnRTY3JpcHRzJiZuJiYiZmlsZToiIT09bi5wcm90b2NvbCYmIWQoUCk/KGE9UCxvLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLEUsITEpKTphPUkgaW4gcCgic2NyaXB0Iik/ZnVuY3Rpb24oZSl7Zi5hcHBlbmRDaGlsZChwKCJzY3JpcHQiKSlbSV09ZnVuY3Rpb24oKXtmLnJlbW92ZUNoaWxkKHRoaXMpLFQoZSl9fTpmdW5jdGlvbihlKXtzZXRUaW1lb3V0KE0oZSksMCl9KSxlLmV4cG9ydHM9e3NldDp3LGNsZWFyOnZ9fSw4NjM6KGUsdCxyKT0+e3ZhciBuPXIoMTcwMik7ZS5leHBvcnRzPW4oMS4udmFsdWVPZil9LDE0MDA6KGUsdCxyKT0+e3ZhciBuPXIoOTMwMyksYT1NYXRoLm1heCxpPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPW4oZSk7cmV0dXJuIHI8MD9hKHIrdCwwKTppKHIsdCl9fSw0NTk5OihlLHQscik9Pnt2YXIgbj1yKDc1OTMpLGE9VHlwZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1uKGUsIm51bWJlciIpO2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBhKCJDYW4ndCBjb252ZXJ0IG51bWJlciB0byBiaWdpbnQiKTtyZXR1cm4gQmlnSW50KHQpfX0sNzA2NzooZSx0LHIpPT57dmFyIG49cig5MzAzKSxhPXIoNzQ2NiksaT1SYW5nZUVycm9yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lKXJldHVybiAwO3ZhciB0PW4oZSkscj1hKHQpO2lmKHQhPT1yKXRocm93IGkoIldyb25nIGxlbmd0aCBvciBpbmRleCIpO3JldHVybiByfX0sNTY1NjooZSx0LHIpPT57dmFyIG49cig4MzYxKSxhPXIoNDQ4OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBuKGEoZSkpfX0sOTMwMzooZSx0LHIpPT57dmFyIG49cig0NzU4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9K2U7cmV0dXJuIHQhPXR8fDA9PT10PzA6bih0KX19LDc0NjY6KGUsdCxyKT0+e3ZhciBuPXIoOTMwMyksYT1NYXRoLm1pbjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+MD9hKG4oZSksOTAwNzE5OTI1NDc0MDk5MSk6MH19LDc5MDg6KGUsdCxyKT0+e3ZhciBuPXIoNDQ4OCksYT1PYmplY3Q7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhKG4oZSkpfX0sNDU5MDooZSx0LHIpPT57dmFyIG49cigzMDAyKSxhPVJhbmdlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9bihlKTtpZihyJXQpdGhyb3cgYSgiV3Jvbmcgb2Zmc2V0Iik7cmV0dXJuIHJ9fSwzMDAyOihlLHQscik9Pnt2YXIgbj1yKDkzMDMpLGE9UmFuZ2VFcnJvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKTtpZih0PDApdGhyb3cgYSgiVGhlIGFyZ3VtZW50IGNhbid0IGJlIGxlc3MgdGhhbiAwIik7cmV0dXJuIHR9fSw3NTkzOihlLHQscik9Pnt2YXIgbj1yKDY5MTYpLGE9cigxMTEpLGk9cigyMTkwKSxzPXIoODE3Myksbz1yKDIxNDApLGM9cig1MTEyKSxsPVR5cGVFcnJvcixoPWMoInRvUHJpbWl0aXZlIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoIWEoZSl8fGkoZSkpcmV0dXJuIGU7dmFyIHIsYz1zKGUsaCk7aWYoYyl7aWYodm9pZCAwPT09dCYmKHQ9ImRlZmF1bHQiKSxyPW4oYyxlLHQpLCFhKHIpfHxpKHIpKXJldHVybiByO3Rocm93IGwoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfXJldHVybiB2b2lkIDA9PT10JiYodD0ibnVtYmVyIiksbyhlLHQpfX0sNDk0ODooZSx0LHIpPT57dmFyIG49cig3NTkzKSxhPXIoMjE5MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW4oZSwic3RyaW5nIik7cmV0dXJuIGEodCk/dDp0KyIifX0sMTY5NDooZSx0LHIpPT57dmFyIG49e307bltyKDUxMTIpKCJ0b1N0cmluZ1RhZyIpXT0ieiIsZS5leHBvcnRzPSJbb2JqZWN0IHpdIj09PVN0cmluZyhuKX0sMTM0MDooZSx0LHIpPT57dmFyIG49cig2NDgpLGE9U3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiU3ltYm9sIj09PW4oZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZyIpO3JldHVybiBhKGUpfX0sNzg5MjplPT57dmFyIHQ9TWF0aC5yb3VuZDtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHI9dChlKTtyZXR1cm4gcjwwPzA6cj4yNTU/MjU1OjI1NSZyfX0sNDAzODooZSx0LHIpPT57dmFyIG49cig1MjY4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e2lmKG4pcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gcmVxdWlyZSgiJytlKyciKScpKCl9Y2F0Y2goZSl7fX19LDYzMzA6ZT0+e3ZhciB0PVN0cmluZztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiB0KGUpfWNhdGNoKGUpe3JldHVybiJPYmplY3QifX19LDk4NDM6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cig2OTE2KSxzPXIoOTc4MSksbz1yKDM4MzIpLGM9cigyNjApLGw9cigzMzMxKSxoPXIoNTc4NyksdT1yKDkxMTQpLGQ9cig4ODgwKSxmPXIoNTk4OCksZz1yKDc0NjYpLHA9cig3MDY3KSxtPXIoNDU5MCksYj1yKDc4OTIpLHk9cig0OTQ4KSx3PXIoMjU5Nyksdj1yKDY0OCkseD1yKDExMSksUz1yKDIxOTApLEE9cigzMCksaz1yKDc5NzYpLEM9cig3Njc0KSxPPXIoODAwNikuZixGPXIoNzMyMSksST1yKDIwOTIpLmZvckVhY2gsVD1yKDYzNDApLE09cig3MDQ1KSxFPXIoMzA3MCksUD1yKDEyMzYpLFI9cig5OTA5KSxOPXIoOTU4NyksRD1SLmdldCxCPVIuc2V0LEw9Ui5lbmZvcmNlLF89RS5mLGo9UC5mLFU9YS5SYW5nZUVycm9yLCQ9bC5BcnJheUJ1ZmZlcixYPSQucHJvdG90eXBlLEg9bC5EYXRhVmlldyxxPWMuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyx6PWMuVFlQRURfQVJSQVlfVEFHLEc9Yy5UeXBlZEFycmF5LFc9Yy5UeXBlZEFycmF5UHJvdG90eXBlLFY9Yy5hVHlwZWRBcnJheUNvbnN0cnVjdG9yLEs9Yy5pc1R5cGVkQXJyYXksWT0iQllURVNfUEVSX0VMRU1FTlQiLEo9Ildyb25nIGxlbmd0aCIsWj1mdW5jdGlvbihlLHQpe1YoZSk7Zm9yKHZhciByPTAsbj10Lmxlbmd0aCxhPW5ldyBlKG4pO24+cjspYVtyXT10W3IrK107cmV0dXJuIGF9LFE9ZnVuY3Rpb24oZSx0KXtNKGUsdCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBEKHRoaXMpW3RdfX0pfSxlZT1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gayhYLGUpfHwiQXJyYXlCdWZmZXIiPT0odD12KGUpKXx8IlNoYXJlZEFycmF5QnVmZmVyIj09dH0sdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSyhlKSYmIVModCkmJnQgaW4gZSYmZigrdCkmJnQ+PTB9LHJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9eSh0KSx0ZShlLHQpP3UoMixlW3RdKTpqKGUsdCl9LG5lPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdD15KHQpLCEodGUoZSx0KSYmeChyKSYmdyhyLCJ2YWx1ZSIpKXx8dyhyLCJnZXQiKXx8dyhyLCJzZXQiKXx8ci5jb25maWd1cmFibGV8fHcociwid3JpdGFibGUiKSYmIXIud3JpdGFibGV8fHcociwiZW51bWVyYWJsZSIpJiYhci5lbnVtZXJhYmxlP18oZSx0LHIpOihlW3RdPXIudmFsdWUsZSl9O3M/KHF8fChQLmY9cmUsRS5mPW5lLFEoVywiYnVmZmVyIiksUShXLCJieXRlT2Zmc2V0IiksUShXLCJieXRlTGVuZ3RoIiksUShXLCJsZW5ndGgiKSksbih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFxfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOnJlLGRlZmluZVByb3BlcnR5Om5lfSksZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyKXt2YXIgcz1lLm1hdGNoKC9cZCsvKVswXS84LGM9ZSsocj8iQ2xhbXBlZCI6IiIpKyJBcnJheSIsbD0iZ2V0IitlLHU9InNldCIrZSxmPWFbY10seT1mLHc9eSYmeS5wcm90b3R5cGUsdj17fSxTPWZ1bmN0aW9uKGUsdCl7XyhlLHQse2dldDpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciByPUQoZSk7cmV0dXJuIHIudmlld1tsXSh0KnMrci5ieXRlT2Zmc2V0LCEwKX0odGhpcyx0KX0sc2V0OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIGE9RChlKTthLnZpZXdbdV0odCpzK2EuYnl0ZU9mZnNldCxyP2Iobik6biwhMCl9KHRoaXMsdCxlKX0sZW51bWVyYWJsZTohMH0pfTtxP28mJih5PXQoKGZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBoKGUsdyksTih4KHQpP2VlKHQpP3ZvaWQgMCE9PW4/bmV3IGYodCxtKHIscyksbik6dm9pZCAwIT09cj9uZXcgZih0LG0ocixzKSk6bmV3IGYodCk6Syh0KT9aKHksdCk6aShGLHksdCk6bmV3IGYocCh0KSksZSx5KX0pKSxDJiZDKHksRyksSShPKGYpLChmdW5jdGlvbihlKXtlIGluIHl8fGQoeSxlLGZbZV0pfSkpLHkucHJvdG90eXBlPXcpOih5PXQoKGZ1bmN0aW9uKGUsdCxyLG4pe2goZSx3KTt2YXIgYSxvLGMsbD0wLHU9MDtpZih4KHQpKXtpZighZWUodCkpcmV0dXJuIEsodCk/Wih5LHQpOmkoRix5LHQpO2E9dCx1PW0ocixzKTt2YXIgZD10LmJ5dGVMZW5ndGg7aWYodm9pZCAwPT09bil7aWYoZCVzKXRocm93IFUoSik7aWYoKG89ZC11KTwwKXRocm93IFUoSil9ZWxzZSBpZigobz1nKG4pKnMpK3U+ZCl0aHJvdyBVKEopO2M9by9zfWVsc2UgYz1wKHQpLGE9bmV3ICQobz1jKnMpO2ZvcihCKGUse2J1ZmZlcjphLGJ5dGVPZmZzZXQ6dSxieXRlTGVuZ3RoOm8sbGVuZ3RoOmMsdmlldzpuZXcgSChhKX0pO2w8YzspUyhlLGwrKyl9KSksQyYmQyh5LEcpLHc9eS5wcm90b3R5cGU9QShXKSksdy5jb25zdHJ1Y3RvciE9PXkmJmQodywiY29uc3RydWN0b3IiLHkpLEwodykuVHlwZWRBcnJheUNvbnN0cnVjdG9yPXkseiYmZCh3LHosYyk7dmFyIGs9eSE9Zjt2W2NdPXksbih7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGZvcmNlZDprLHNoYW06IXF9LHYpLFkgaW4geXx8ZCh5LFkscyksWSBpbiB3fHxkKHcsWSxzKSxUKGMpfSk6ZS5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sMzgzMjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoNzI5MyksaT1yKDcwNzIpLHM9cigyNjApLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1Msbz1uLkFycmF5QnVmZmVyLGM9bi5JbnQ4QXJyYXk7ZS5leHBvcnRzPSFzfHwhYSgoZnVuY3Rpb24oKXtjKDEpfSkpfHwhYSgoZnVuY3Rpb24oKXtuZXcgYygtMSl9KSl8fCFpKChmdW5jdGlvbihlKXtuZXcgYyxuZXcgYyhudWxsKSxuZXcgYygxLjUpLG5ldyBjKGUpfSksITApfHxhKChmdW5jdGlvbigpe3JldHVybiAxIT09bmV3IGMobmV3IG8oMiksMSx2b2lkIDApLmxlbmd0aH0pKX0sNzMyMTooZSx0LHIpPT57dmFyIG49cig5OTc0KSxhPXIoNjkxNiksaT1yKDk0ODMpLHM9cig3OTA4KSxvPXIoNjI0NCksYz1yKDQxMjEpLGw9cigxMjQ2KSxoPXIoNzY1OSksdT1yKDQwNjcpLGQ9cigyNjApLmFUeXBlZEFycmF5Q29uc3RydWN0b3IsZj1yKDQ1OTkpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdCxyLGcscCxtLGIseSx3LHY9aSh0aGlzKSx4PXMoZSksUz1hcmd1bWVudHMubGVuZ3RoLEE9Uz4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsaz12b2lkIDAhPT1BLEM9bCh4KTtpZihDJiYhaChDKSlmb3Iodz0oeT1jKHgsQykpLm5leHQseD1bXTshKGI9YSh3LHkpKS5kb25lOyl4LnB1c2goYi52YWx1ZSk7Zm9yKGsmJlM+MiYmKEE9bihBLGFyZ3VtZW50c1syXSkpLHI9byh4KSxnPW5ldyhkKHYpKShyKSxwPXUoZyksdD0wO3I+dDt0KyspbT1rP0EoeFt0XSx0KTp4W3RdLGdbdF09cD9mKG0pOittO3JldHVybiBnfX0sOTcxMTooZSx0LHIpPT57dmFyIG49cigxNzAyKSxhPTAsaT1NYXRoLnJhbmRvbSgpLHM9bigxLi50b1N0cmluZyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJTeW1ib2woIisodm9pZCAwPT09ZT8iIjplKSsiKV8iK3MoKythK2ksMzYpfX0sNTE0MzooZSx0LHIpPT57dmFyIG49cig3MjkzKSxhPXIoNTExMiksaT1yKDk3ODEpLHM9cigxOTEzKSxvPWEoIml0ZXJhdG9yIik7ZS5leHBvcnRzPSFuKChmdW5jdGlvbigpe3ZhciBlPW5ldyBVUkwoImI/YT0xJmI9MiZjPTMiLCJodHRwOi8vYSIpLHQ9ZS5zZWFyY2hQYXJhbXMscj1uZXcgVVJMU2VhcmNoUGFyYW1zKCJhPTEmYT0yJmI9MyIpLG49IiI7cmV0dXJuIGUucGF0aG5hbWU9ImMlMjBkIix0LmZvckVhY2goKGZ1bmN0aW9uKGUscil7dC5kZWxldGUoImIiKSxuKz1yK2V9KSksci5kZWxldGUoImEiLDIpLHIuZGVsZXRlKCJiIix2b2lkIDApLHMmJighZS50b0pTT058fCFyLmhhcygiYSIsMSl8fHIuaGFzKCJhIiwyKXx8IXIuaGFzKCJhIix2b2lkIDApfHxyLmhhcygiYiIpKXx8IXQuc2l6ZSYmKHN8fCFpKXx8IXQuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2E9MSZjPTMiIT09ZS5ocmVmfHwiMyIhPT10LmdldCgiYyIpfHwiYT0xIiE9PVN0cmluZyhuZXcgVVJMU2VhcmNoUGFyYW1zKCI/YT0xIikpfHwhdFtvXXx8ImEiIT09bmV3IFVSTCgiaHR0cHM6Ly9hQGIiKS51c2VybmFtZXx8ImIiIT09bmV3IFVSTFNlYXJjaFBhcmFtcyhuZXcgVVJMU2VhcmNoUGFyYW1zKCJhPWIiKSkuZ2V0KCJhIil8fCJ4bi0tZTFheWJjIiE9PW5ldyBVUkwoImh0dHA6Ly/RgtC10YHRgiIpLmhvc3R8fCIjJUQwJUIxIiE9PW5ldyBVUkwoImh0dHA6Ly9hI9CxIikuaGFzaHx8ImExYzMiIT09bnx8IngiIT09bmV3IFVSTCgiaHR0cDovL3giLHZvaWQgMCkuaG9zdH0pKX0sMzMwNzooZSx0LHIpPT57dmFyIG49cig2MjkzKTtlLmV4cG9ydHM9biYmIVN5bWJvbC5zaGFtJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcn0sMzM1MzooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoNzI5Myk7ZS5leHBvcnRzPW4mJmEoKGZ1bmN0aW9uKCl7cmV0dXJuIDQyIT1PYmplY3QuZGVmaW5lUHJvcGVydHkoKGZ1bmN0aW9uKCl7fSksInByb3RvdHlwZSIse3ZhbHVlOjQyLHdyaXRhYmxlOiExfSkucHJvdG90eXBlfSkpfSw4MDUzOmU9Pnt2YXIgdD1UeXBlRXJyb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUscil7aWYoZTxyKXRocm93IHQoIk5vdCBlbm91Z2ggYXJndW1lbnRzIik7cmV0dXJuIGV9fSw0ODExOihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cig2MTQpLGk9bi5XZWFrTWFwO2UuZXhwb3J0cz1hKGkpJiYvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKGkpKX0sNTExMjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoMjMwOSksaT1yKDI1OTcpLHM9cig5NzExKSxvPXIoNjI5MyksYz1yKDMzMDcpLGw9bi5TeW1ib2wsaD1hKCJ3a3MiKSx1PWM/bC5mb3J8fGw6bCYmbC53aXRob3V0U2V0dGVyfHxzO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaShoLGUpfHwoaFtlXT1vJiZpKGwsZSk/bFtlXTp1KCJTeW1ib2wuIitlKSksaFtlXX19LDEzNjE6ZT0+e2UuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LDkxOTE6KGUsdCxyKT0+e3ZhciBuPXIoNTAwNSksYT1yKDI1OTcpLGk9cig4ODgwKSxzPXIoNzk3Niksbz1yKDc2NzQpLGM9cig5OTIwKSxsPXIoMjYyNiksaD1yKDk1ODcpLHU9cig2Mjc3KSxkPXIoODM0MCksZj1yKDUzOTIpLGc9cig5NzgxKSxwPXIoMTkxMyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxyLG0pe3ZhciBiPSJzdGFja1RyYWNlTGltaXQiLHk9bT8yOjEsdz1lLnNwbGl0KCIuIiksdj13W3cubGVuZ3RoLTFdLHg9bi5hcHBseShudWxsLHcpO2lmKHgpe3ZhciBTPXgucHJvdG90eXBlO2lmKCFwJiZhKFMsImNhdXNlIikmJmRlbGV0ZSBTLmNhdXNlLCFyKXJldHVybiB4O3ZhciBBPW4oIkVycm9yIiksaz10KChmdW5jdGlvbihlLHQpe3ZhciByPXUobT90OmUsdm9pZCAwKSxuPW0/bmV3IHgoZSk6bmV3IHg7cmV0dXJuIHZvaWQgMCE9PXImJmkobiwibWVzc2FnZSIsciksZihuLGssbi5zdGFjaywyKSx0aGlzJiZzKFMsdGhpcykmJmgobix0aGlzLGspLGFyZ3VtZW50cy5sZW5ndGg+eSYmZChuLGFyZ3VtZW50c1t5XSksbn0pKTtpZihrLnByb3RvdHlwZT1TLCJFcnJvciIhPT12P28/byhrLEEpOmMoayxBLHtuYW1lOiEwfSk6ZyYmYiBpbiB4JiYobChrLHgsYiksbChrLHgsInByZXBhcmVTdGFja1RyYWNlIikpLGMoayx4KSwhcCl0cnl7Uy5uYW1lIT09diYmaShTLCJuYW1lIix2KSxTLmNvbnN0cnVjdG9yPWt9Y2F0Y2goZSl7fXJldHVybiBrfX19LDgyNjQ6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cigzMzMxKSxzPXIoNjM0MCksbz0iQXJyYXlCdWZmZXIiLGM9aVtvXTtuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZm9yY2VkOmFbb10hPT1jfSx7QXJyYXlCdWZmZXI6Y30pLHMobyl9LDk1NzU6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDE0NzApLGk9cig3MjkzKSxzPXIoMzMzMSksbz1yKDk2NzApLGM9cigxNDAwKSxsPXIoNzQ2NiksaD1yKDY3MDcpLHU9cy5BcnJheUJ1ZmZlcixkPXMuRGF0YVZpZXcsZj1kLnByb3RvdHlwZSxnPWEodS5wcm90b3R5cGUuc2xpY2UpLHA9YShmLmdldFVpbnQ4KSxtPWEoZi5zZXRVaW50OCk7bih7dGFyZ2V0OiJBcnJheUJ1ZmZlciIscHJvdG86ITAsdW5zYWZlOiEwLGZvcmNlZDppKChmdW5jdGlvbigpe3JldHVybiFuZXcgdSgyKS5zbGljZSgxLHZvaWQgMCkuYnl0ZUxlbmd0aH0pKX0se3NsaWNlOmZ1bmN0aW9uKGUsdCl7aWYoZyYmdm9pZCAwPT09dClyZXR1cm4gZyhvKHRoaXMpLGUpO2Zvcih2YXIgcj1vKHRoaXMpLmJ5dGVMZW5ndGgsbj1jKGUsciksYT1jKHZvaWQgMD09PXQ/cjp0LHIpLGk9bmV3KGgodGhpcyx1KSkobChhLW4pKSxzPW5ldyBkKHRoaXMpLGY9bmV3IGQoaSksYj0wO248YTspbShmLGIrKyxwKHMsbisrKSk7cmV0dXJuIGl9fSl9LDIyNjI6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc5MDgpLGk9cig2MjQ0KSxzPXIoOTMwMyksbz1yKDEyMjMpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7YXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9YSh0aGlzKSxyPWkodCksbj1zKGUpLG89bj49MD9uOnIrbjtyZXR1cm4gbzwwfHxvPj1yP3ZvaWQgMDp0W29dfX0pLG8oImF0Iil9LDcyODc6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDk2NzEpLmZpbmRMYXN0SW5kZXgsaT1yKDEyMjMpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7ZmluZExhc3RJbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gYSh0aGlzLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmRMYXN0SW5kZXgiKX0sNzYzNTooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoOTY3MSkuZmluZExhc3QsaT1yKDEyMjMpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwfSx7ZmluZExhc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGEodGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxpKCJmaW5kTGFzdCIpfSw0OTQ0OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cig2NzkwKSxpPXIoNzkwOCkscz1yKDYyNDQpLG89cig5MzAzKSxjPXIoNTQxNyk7bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHtmbGF0OmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwLHQ9aSh0aGlzKSxyPXModCksbj1jKHQsMCk7cmV0dXJuIG4ubGVuZ3RoPWEobix0LHQsciwwLHZvaWQgMD09PWU/MTpvKGUpKSxufX0pfSw2Njk5OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxMzE4KS5pbmNsdWRlcyxpPXIoNzI5Mykscz1yKDEyMjMpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDppKChmdW5jdGlvbigpe3JldHVybiFBcnJheSgxKS5pbmNsdWRlcygpfSkpfSx7aW5jbHVkZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGEodGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxzKCJpbmNsdWRlcyIpfSw2OTkyOihlLHQscik9Pnt2YXIgbj1yKDU2NTYpLGE9cigxMjIzKSxpPXIoNzQ5Nykscz1yKDk5MDkpLG89cigzMDcwKS5mLGM9cigxNjU2KSxsPXIoNjE3OCksaD1yKDE5MTMpLHU9cig5NzgxKSxkPSJBcnJheSBJdGVyYXRvciIsZj1zLnNldCxnPXMuZ2V0dGVyRm9yKGQpO2UuZXhwb3J0cz1jKEFycmF5LCJBcnJheSIsKGZ1bmN0aW9uKGUsdCl7Zih0aGlzLHt0eXBlOmQsdGFyZ2V0Om4oZSksaW5kZXg6MCxraW5kOnR9KX0pLChmdW5jdGlvbigpe3ZhciBlPWcodGhpcyksdD1lLnRhcmdldCxyPWUua2luZCxuPWUuaW5kZXgrKztyZXR1cm4hdHx8bj49dC5sZW5ndGg/KGUudGFyZ2V0PXZvaWQgMCxsKHZvaWQgMCwhMCkpOmwoImtleXMiPT1yP246InZhbHVlcyI9PXI/dFtuXTpbbix0W25dXSwhMSl9KSwidmFsdWVzIik7dmFyIHA9aS5Bcmd1bWVudHM9aS5BcnJheTtpZihhKCJrZXlzIiksYSgidmFsdWVzIiksYSgiZW50cmllcyIpLCFoJiZ1JiYidmFsdWVzIiE9PXAubmFtZSl0cnl7byhwLCJuYW1lIix7dmFsdWU6InZhbHVlcyJ9KX1jYXRjaChlKXt9fSw3NjU4OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cig3OTA4KSxpPXIoNjI0NCkscz1yKDM2NTgpLG89cig3MjA3KTtuKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxhcml0eToxLGZvcmNlZDpyKDcyOTMpKChmdW5jdGlvbigpe3JldHVybiA0Mjk0OTY3Mjk3IT09W10ucHVzaC5jYWxsKHtsZW5ndGg6NDI5NDk2NzI5Nn0sMSl9KSl8fCFmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sImxlbmd0aCIse3dyaXRhYmxlOiExfSkucHVzaCgpfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yfX0oKX0se3B1c2g6ZnVuY3Rpb24oZSl7dmFyIHQ9YSh0aGlzKSxyPWkodCksbj1hcmd1bWVudHMubGVuZ3RoO28ocituKTtmb3IodmFyIGM9MDtjPG47YysrKXRbcl09YXJndW1lbnRzW2NdLHIrKztyZXR1cm4gcyh0LHIpLHJ9fSl9LDU4Mjc6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDM2NzEpLmxlZnQsaT1yKDkzNDEpLHM9cig3MzkyKTtuKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IXIoNTI2OCkmJnM+NzkmJnM8ODN8fCFpKCJyZWR1Y2UiKX0se3JlZHVjZTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBhKHRoaXMsZSx0LHQ+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sMjcwNzooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMTcwMiksaT1yKDk2NjIpLHM9cig3OTA4KSxvPXIoNjI0NCksYz1yKDUxMTcpLGw9cigxMzQwKSxoPXIoNzI5MyksdT1yKDQzNjIpLGQ9cig5MzQxKSxmPXIoODg4NiksZz1yKDI1NikscD1yKDczOTIpLG09cig4MDA4KSxiPVtdLHk9YShiLnNvcnQpLHc9YShiLnB1c2gpLHY9aCgoZnVuY3Rpb24oKXtiLnNvcnQodm9pZCAwKX0pKSx4PWgoKGZ1bmN0aW9uKCl7Yi5zb3J0KG51bGwpfSkpLFM9ZCgic29ydCIpLEE9IWgoKGZ1bmN0aW9uKCl7aWYocClyZXR1cm4gcDw3MDtpZighKGYmJmY+Mykpe2lmKGcpcmV0dXJuITA7aWYobSlyZXR1cm4gbTw2MDM7dmFyIGUsdCxyLG4sYT0iIjtmb3IoZT02NTtlPDc2O2UrKyl7c3dpdGNoKHQ9U3RyaW5nLmZyb21DaGFyQ29kZShlKSxlKXtjYXNlIDY2OmNhc2UgNjk6Y2FzZSA3MDpjYXNlIDcyOnI9MzticmVhaztjYXNlIDY4OmNhc2UgNzE6cj00O2JyZWFrO2RlZmF1bHQ6cj0yfWZvcihuPTA7bjw0NztuKyspYi5wdXNoKHtrOnQrbix2OnJ9KX1mb3IoYi5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiB0LnYtZS52fSkpLG49MDtuPGIubGVuZ3RoO24rKyl0PWJbbl0uay5jaGFyQXQoMCksYS5jaGFyQXQoYS5sZW5ndGgtMSkhPT10JiYoYSs9dCk7cmV0dXJuIkRHQkVGSEFDSUpLIiE9PWF9fSkpO24oe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDp2fHwheHx8IVN8fCFBfSx7c29ydDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lJiZpKGUpO3ZhciB0PXModGhpcyk7aWYoQSlyZXR1cm4gdm9pZCAwPT09ZT95KHQpOnkodCxlKTt2YXIgcixuLGE9W10saD1vKHQpO2ZvcihuPTA7bjxoO24rKyluIGluIHQmJncoYSx0W25dKTtmb3IodShhLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LHIpe3JldHVybiB2b2lkIDA9PT1yPy0xOnZvaWQgMD09PXQ/MTp2b2lkIDAhPT1lPytlKHQscil8fDA6bCh0KT5sKHIpPzE6LTF9fShlKSkscj1vKGEpLG49MDtuPHI7KXRbbl09YVtuKytdO2Zvcig7bjxoOyljKHQsbisrKTtyZXR1cm4gdH19KX0sMzc5MjooZSx0LHIpPT57cigxMjIzKSgiZmxhdCIpfSw1NDE6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc5MDgpLGk9cig2MjQ0KSxzPXIoMzY1OCksbz1yKDUxMTcpLGM9cig3MjA3KTtuKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxhcml0eToxLGZvcmNlZDoxIT09W10udW5zaGlmdCgwKXx8IWZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwibGVuZ3RoIix7d3JpdGFibGU6ITF9KS51bnNoaWZ0KCl9Y2F0Y2goZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBUeXBlRXJyb3J9fSgpfSx7dW5zaGlmdDpmdW5jdGlvbihlKXt2YXIgdD1hKHRoaXMpLHI9aSh0KSxuPWFyZ3VtZW50cy5sZW5ndGg7aWYobil7YyhyK24pO2Zvcih2YXIgbD1yO2wtLTspe3ZhciBoPWwrbjtsIGluIHQ/dFtoXT10W2xdOm8odCxoKX1mb3IodmFyIHU9MDt1PG47dSsrKXRbdV09YXJndW1lbnRzW3VdfXJldHVybiBzKHQscituKX19KX0sNTU4MTooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMTU3MiksaT1yKDU2NTYpLHM9QXJyYXk7bih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITB9LHt3aXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEoaSh0aGlzKSxzLGUsdCl9fSl9LDE3MDM6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cigyMTA0KSxzPXIoOTE5MSksbz0iV2ViQXNzZW1ibHkiLGM9YVtvXSxsPTchPT1FcnJvcigiZSIse2NhdXNlOjd9KS5jYXVzZSxoPWZ1bmN0aW9uKGUsdCl7dmFyIHI9e307cltlXT1zKGUsdCxsKSxuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsYXJpdHk6MSxmb3JjZWQ6bH0scil9LHU9ZnVuY3Rpb24oZSx0KXtpZihjJiZjW2VdKXt2YXIgcj17fTtyW2VdPXMobysiLiIrZSx0LGwpLG4oe3RhcmdldDpvLHN0YXQ6ITAsY29uc3RydWN0b3I6ITAsYXJpdHk6MSxmb3JjZWQ6bH0scil9fTtoKCJFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiRXZhbEVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSxoKCJSYW5nZUVycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSxoKCJSZWZlcmVuY2VFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiU3ludGF4RXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpLGgoIlR5cGVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksaCgiVVJJRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpLHUoIkNvbXBpbGVFcnJvciIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaShlLHRoaXMsYXJndW1lbnRzKX19KSksdSgiTGlua0Vycm9yIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdGhpcyxhcmd1bWVudHMpfX0pKSx1KCJSdW50aW1lRXJyb3IiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkoZSx0aGlzLGFyZ3VtZW50cyl9fSkpfSw1ODM3OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cig3ODU0KTtuKHtnbG9iYWw6ITAsZm9yY2VkOmEuZ2xvYmFsVGhpcyE9PWF9LHtnbG9iYWxUaGlzOmF9KX0sODg2MjooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNTAwNSksaT1yKDIxMDQpLHM9cig2OTE2KSxvPXIoMTcwMiksYz1yKDcyOTMpLGw9cig2MTQpLGg9cigyMTkwKSx1PXIoMjA2KSxkPXIoODA0NCksZj1yKDYyOTMpLGc9U3RyaW5nLHA9YSgiSlNPTiIsInN0cmluZ2lmeSIpLG09bygvLi8uZXhlYyksYj1vKCIiLmNoYXJBdCkseT1vKCIiLmNoYXJDb2RlQXQpLHc9bygiIi5yZXBsYWNlKSx2PW8oMS4udG9TdHJpbmcpLHg9L1tcdUQ4MDAtXHVERkZGXS9nLFM9L15bXHVEODAwLVx1REJGRl0kLyxBPS9eW1x1REMwMC1cdURGRkZdJC8saz0hZnx8YygoZnVuY3Rpb24oKXt2YXIgZT1hKCJTeW1ib2wiKSgpO3JldHVybiJbbnVsbF0iIT1wKFtlXSl8fCJ7fSIhPXAoe2E6ZX0pfHwie30iIT1wKE9iamVjdChlKSl9KSksQz1jKChmdW5jdGlvbigpe3JldHVybiciXFx1ZGYwNlxcdWQ4MzQiJyE9PXAoIlx1ZGYwNlx1ZDgzNCIpfHwnIlxcdWRlYWQiJyE9PXAoIlx1ZGVhZCIpfSkpLE89ZnVuY3Rpb24oZSx0KXt2YXIgcj11KGFyZ3VtZW50cyksbj1kKHQpO2lmKGwobil8fHZvaWQgMCE9PWUmJiFoKGUpKXJldHVybiByWzFdPWZ1bmN0aW9uKGUsdCl7aWYobChuKSYmKHQ9cyhuLHRoaXMsZyhlKSx0KSksIWgodCkpcmV0dXJuIHR9LGkocCxudWxsLHIpfSxGPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1iKHIsdC0xKSxhPWIocix0KzEpO3JldHVybiBtKFMsZSkmJiFtKEEsYSl8fG0oQSxlKSYmIW0oUyxuKT8iXFx1Iit2KHkoZSwwKSwxNik6ZX07cCYmbih7dGFyZ2V0OiJKU09OIixzdGF0OiEwLGFyaXR5OjMsZm9yY2VkOmt8fEN9LHtzdHJpbmdpZnk6ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXUoYXJndW1lbnRzKSxhPWkoaz9POnAsbnVsbCxuKTtyZXR1cm4gQyYmInN0cmluZyI9PXR5cGVvZiBhP3coYSx4LEYpOmF9fSl9LDU0Mzg6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1NYXRoLmh5cG90LGk9TWF0aC5hYnMscz1NYXRoLnNxcnQ7bih7dGFyZ2V0OiJNYXRoIixzdGF0OiEwLGFyaXR5OjIsZm9yY2VkOiEhYSYmYSgxLzAsTmFOKSE9PTEvMH0se2h5cG90OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByLG4sYT0wLG89MCxjPWFyZ3VtZW50cy5sZW5ndGgsbD0wO288YzspbDwocj1pKGFyZ3VtZW50c1tvKytdKSk/KGE9YSoobj1sL3IpKm4rMSxsPXIpOmErPXI+MD8obj1yL2wpKm46cjtyZXR1cm4gbD09PTEvMD8xLzA6bCpzKGEpfX0pfSw2OTc3OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxNzAyKSxpPXIoOTMwMykscz1yKDg2Myksbz1yKDg0MTUpLGM9cig3MjkzKSxsPVJhbmdlRXJyb3IsaD1TdHJpbmcsdT1NYXRoLmZsb29yLGQ9YShvKSxmPWEoIiIuc2xpY2UpLGc9YSgxLi50b0ZpeGVkKSxwPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gMD09PXQ/cjp0JTI9PTE/cChlLHQtMSxyKmUpOnAoZSplLHQvMixyKX0sbT1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBuPS0xLGE9cjsrK248NjspYSs9dCplW25dLGVbbl09YSUxZTcsYT11KGEvMWU3KX0sYj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj02LG49MDstLXI+PTA7KW4rPWVbcl0sZVtyXT11KG4vdCksbj1uJXQqMWU3fSx5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD02LHI9IiI7LS10Pj0wOylpZigiIiE9PXJ8fDA9PT10fHwwIT09ZVt0XSl7dmFyIG49aChlW3RdKTtyPSIiPT09cj9uOnIrZCgiMCIsNy1uLmxlbmd0aCkrbn1yZXR1cm4gcn07bih7dGFyZ2V0OiJOdW1iZXIiLHByb3RvOiEwLGZvcmNlZDpjKChmdW5jdGlvbigpe3JldHVybiIwLjAwMCIhPT1nKDhlLTUsMyl8fCIxIiE9PWcoLjksMCl8fCIxLjI1IiE9PWcoMS4yNTUsMil8fCIxMDAwMDAwMDAwMDAwMDAwMTI4IiE9PWcoMHhkZTBiNmIzYTc2NDAwODAsMCl9KSl8fCFjKChmdW5jdGlvbigpe2coe30pfSkpfSx7dG9GaXhlZDpmdW5jdGlvbihlKXt2YXIgdCxyLG4sYSxvPXModGhpcyksYz1pKGUpLHU9WzAsMCwwLDAsMCwwXSxnPSIiLHc9IjAiO2lmKGM8MHx8Yz4yMCl0aHJvdyBsKCJJbmNvcnJlY3QgZnJhY3Rpb24gZGlnaXRzIik7aWYobyE9bylyZXR1cm4iTmFOIjtpZihvPD0tMWUyMXx8bz49MWUyMSlyZXR1cm4gaChvKTtpZihvPDAmJihnPSItIixvPS1vKSxvPjFlLTIxKWlmKHI9KHQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAscj1lO3I+PTQwOTY7KXQrPTEyLHIvPTQwOTY7Zm9yKDtyPj0yOyl0Kz0xLHIvPTI7cmV0dXJuIHR9KG8qcCgyLDY5LDEpKS02OSk8MD9vKnAoMiwtdCwxKTpvL3AoMix0LDEpLHIqPTQ1MDM1OTk2MjczNzA0OTYsKHQ9NTItdCk+MCl7Zm9yKG0odSwwLHIpLG49YztuPj03OyltKHUsMWU3LDApLG4tPTc7Zm9yKG0odSxwKDEwLG4sMSksMCksbj10LTE7bj49MjM7KWIodSwxPDwyMyksbi09MjM7Yih1LDE8PG4pLG0odSwxLDEpLGIodSwyKSx3PXkodSl9ZWxzZSBtKHUsMCxyKSxtKHUsMTw8LXQsMCksdz15KHUpK2QoIjAiLGMpO3JldHVybiBjPjA/ZysoKGE9dy5sZW5ndGgpPD1jPyIwLiIrZCgiMCIsYy1hKSt3OmYodywwLGEtYykrIi4iK2YodyxhLWMpKTpnK3d9fSl9LDk2MDE6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDE1NzQpO24oe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGFyaXR5OjIsZm9yY2VkOk9iamVjdC5hc3NpZ24hPT1hfSx7YXNzaWduOmF9KX0sNjMxNDooZSx0LHIpPT57cigyMTA5KSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtoYXNPd246cigyNTk3KX0pfSw0Njc4OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigyODE0KTtuKHtnbG9iYWw6ITAsZm9yY2VkOnBhcnNlRmxvYXQhPWF9LHtwYXJzZUZsb2F0OmF9KX0sMTA1ODooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMzAwOSk7bih7Z2xvYmFsOiEwLGZvcmNlZDpwYXJzZUludCE9YX0se3BhcnNlSW50OmF9KX0sNzkyMjooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNjkxNiksaT1yKDk2NjIpLHM9cig4NTIzKSxvPXIoMjUzNCksYz1yKDQwOCk7bih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwLGZvcmNlZDpyKDYxMil9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMscj1zLmYodCksbj1yLnJlc29sdmUsbD1yLnJlamVjdCxoPW8oKGZ1bmN0aW9uKCl7dmFyIHI9aSh0LnJlc29sdmUpLHM9W10sbz0wLGw9MTtjKGUsKGZ1bmN0aW9uKGUpe3ZhciBpPW8rKyxjPSExO2wrKyxhKHIsdCxlKS50aGVuKChmdW5jdGlvbihlKXtjfHwoYz0hMCxzW2ldPXtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6ZX0sLS1sfHxuKHMpKX0pLChmdW5jdGlvbihlKXtjfHwoYz0hMCxzW2ldPXtzdGF0dXM6InJlamVjdGVkIixyZWFzb246ZX0sLS1sfHxuKHMpKX0pKX0pKSwtLWx8fG4ocyl9KSk7cmV0dXJuIGguZXJyb3ImJmwoaC52YWx1ZSksci5wcm9taXNlfX0pfSw4MjE6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDY5MTYpLGk9cig5NjYyKSxzPXIoODUyMyksbz1yKDI1MzQpLGM9cig0MDgpO24oe3RhcmdldDoiUHJvbWlzZSIsc3RhdDohMCxmb3JjZWQ6cig2MTIpfSx7YWxsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMscj1zLmYodCksbj1yLnJlc29sdmUsbD1yLnJlamVjdCxoPW8oKGZ1bmN0aW9uKCl7dmFyIHI9aSh0LnJlc29sdmUpLHM9W10sbz0wLGg9MTtjKGUsKGZ1bmN0aW9uKGUpe3ZhciBpPW8rKyxjPSExO2grKyxhKHIsdCxlKS50aGVuKChmdW5jdGlvbihlKXtjfHwoYz0hMCxzW2ldPWUsLS1ofHxuKHMpKX0pLGwpfSkpLC0taHx8bihzKX0pKTtyZXR1cm4gaC5lcnJvciYmbChoLnZhbHVlKSxyLnByb21pc2V9fSl9LDQxNjQ6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDE5MTMpLGk9cigzNzAyKS5DT05TVFJVQ1RPUixzPXIoMjQ5Miksbz1yKDUwMDUpLGM9cig2MTQpLGw9cig4MDUyKSxoPXMmJnMucHJvdG90eXBlO2lmKG4oe3RhcmdldDoiUHJvbWlzZSIscHJvdG86ITAsZm9yY2VkOmkscmVhbDohMH0se2NhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLCFhJiZjKHMpKXt2YXIgdT1vKCJQcm9taXNlIikucHJvdG90eXBlLmNhdGNoO2guY2F0Y2ghPT11JiZsKGgsImNhdGNoIix1LHt1bnNhZmU6ITB9KX19LDM0MDE6KGUsdCxyKT0+e3ZhciBuLGEsaSxzPXIoMjEwOSksbz1yKDE5MTMpLGM9cig1MjY4KSxsPXIoNzg1NCksaD1yKDY5MTYpLHU9cig4MDUyKSxkPXIoNzY3NCksZj1yKDgwMDMpLGc9cig2MzQwKSxwPXIoOTY2MiksbT1yKDYxNCksYj1yKDExMSkseT1yKDU3ODcpLHc9cig2NzA3KSx2PXIoMjYxKS5zZXQseD1yKDU5NDgpLFM9cig4NDIpLEE9cigyNTM0KSxrPXIoODU3MiksQz1yKDk5MDkpLE89cigyNDkyKSxGPXIoMzcwMiksST1yKDg1MjMpLFQ9IlByb21pc2UiLE09Ri5DT05TVFJVQ1RPUixFPUYuUkVKRUNUSU9OX0VWRU5ULFA9Ri5TVUJDTEFTU0lORyxSPUMuZ2V0dGVyRm9yKFQpLE49Qy5zZXQsRD1PJiZPLnByb3RvdHlwZSxCPU8sTD1ELF89bC5UeXBlRXJyb3Isaj1sLmRvY3VtZW50LFU9bC5wcm9jZXNzLCQ9SS5mLFg9JCxIPSEhKGomJmouY3JlYXRlRXZlbnQmJmwuZGlzcGF0Y2hFdmVudCkscT0idW5oYW5kbGVkcmVqZWN0aW9uIix6PWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiEoIWIoZSl8fCFtKHQ9ZS50aGVuKSkmJnR9LEc9ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGEsaT10LnZhbHVlLHM9MT09dC5zdGF0ZSxvPXM/ZS5vazplLmZhaWwsYz1lLnJlc29sdmUsbD1lLnJlamVjdCx1PWUuZG9tYWluO3RyeXtvPyhzfHwoMj09PXQucmVqZWN0aW9uJiZKKHQpLHQucmVqZWN0aW9uPTEpLCEwPT09bz9yPWk6KHUmJnUuZW50ZXIoKSxyPW8oaSksdSYmKHUuZXhpdCgpLGE9ITApKSxyPT09ZS5wcm9taXNlP2woXygiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToobj16KHIpKT9oKG4scixjLGwpOmMocikpOmwoaSl9Y2F0Y2goZSl7dSYmIWEmJnUuZXhpdCgpLGwoZSl9fSxXPWZ1bmN0aW9uKGUsdCl7ZS5ub3RpZmllZHx8KGUubm90aWZpZWQ9ITAseCgoZnVuY3Rpb24oKXtmb3IodmFyIHIsbj1lLnJlYWN0aW9ucztyPW4uZ2V0KCk7KUcocixlKTtlLm5vdGlmaWVkPSExLHQmJiFlLnJlamVjdGlvbiYmSyhlKX0pKSl9LFY9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGE7SD8oKG49ai5jcmVhdGVFdmVudCgiRXZlbnQiKSkucHJvbWlzZT10LG4ucmVhc29uPXIsbi5pbml0RXZlbnQoZSwhMSwhMCksbC5kaXNwYXRjaEV2ZW50KG4pKTpuPXtwcm9taXNlOnQscmVhc29uOnJ9LCFFJiYoYT1sWyJvbiIrZV0pP2Eobik6ZT09PXEmJlMoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIscil9LEs9ZnVuY3Rpb24oZSl7aCh2LGwsKGZ1bmN0aW9uKCl7dmFyIHQscj1lLmZhY2FkZSxuPWUudmFsdWU7aWYoWShlKSYmKHQ9QSgoZnVuY3Rpb24oKXtjP1UuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixuLHIpOlYocSxyLG4pfSkpLGUucmVqZWN0aW9uPWN8fFkoZSk/MjoxLHQuZXJyb3IpKXRocm93IHQudmFsdWV9KSl9LFk9ZnVuY3Rpb24oZSl7cmV0dXJuIDEhPT1lLnJlamVjdGlvbiYmIWUucGFyZW50fSxKPWZ1bmN0aW9uKGUpe2godixsLChmdW5jdGlvbigpe3ZhciB0PWUuZmFjYWRlO2M/VS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTpWKCJyZWplY3Rpb25oYW5kbGVkIix0LGUudmFsdWUpfSkpfSxaPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24obil7ZSh0LG4scil9fSxRPWZ1bmN0aW9uKGUsdCxyKXtlLmRvbmV8fChlLmRvbmU9ITAsciYmKGU9ciksZS52YWx1ZT10LGUuc3RhdGU9MixXKGUsITApKX0sZWU9ZnVuY3Rpb24oZSx0LHIpe2lmKCFlLmRvbmUpe2UuZG9uZT0hMCxyJiYoZT1yKTt0cnl7aWYoZS5mYWNhZGU9PT10KXRocm93IF8oIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7dmFyIG49eih0KTtuP3goKGZ1bmN0aW9uKCl7dmFyIHI9e2RvbmU6ITF9O3RyeXtoKG4sdCxaKGVlLHIsZSksWihRLHIsZSkpfWNhdGNoKHQpe1Eocix0LGUpfX0pKTooZS52YWx1ZT10LGUuc3RhdGU9MSxXKGUsITEpKX1jYXRjaCh0KXtRKHtkb25lOiExfSx0LGUpfX19O2lmKE0mJihMPShCPWZ1bmN0aW9uKGUpe3kodGhpcyxMKSxwKGUpLGgobix0aGlzKTt2YXIgdD1SKHRoaXMpO3RyeXtlKFooZWUsdCksWihRLHQpKX1jYXRjaChlKXtRKHQsZSl9fSkucHJvdG90eXBlLChuPWZ1bmN0aW9uKGUpe04odGhpcyx7dHlwZTpULGRvbmU6ITEsbm90aWZpZWQ6ITEscGFyZW50OiExLHJlYWN0aW9uczpuZXcgayxyZWplY3Rpb246ITEsc3RhdGU6MCx2YWx1ZTp2b2lkIDB9KX0pLnByb3RvdHlwZT11KEwsInRoZW4iLChmdW5jdGlvbihlLHQpe3ZhciByPVIodGhpcyksbj0kKHcodGhpcyxCKSk7cmV0dXJuIHIucGFyZW50PSEwLG4ub2s9IW0oZSl8fGUsbi5mYWlsPW0odCkmJnQsbi5kb21haW49Yz9VLmRvbWFpbjp2b2lkIDAsMD09ci5zdGF0ZT9yLnJlYWN0aW9ucy5hZGQobik6eCgoZnVuY3Rpb24oKXtHKG4scil9KSksbi5wcm9taXNlfSkpLGE9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgbix0PVIoZSk7dGhpcy5wcm9taXNlPWUsdGhpcy5yZXNvbHZlPVooZWUsdCksdGhpcy5yZWplY3Q9WihRLHQpfSxJLmY9JD1mdW5jdGlvbihlKXtyZXR1cm4gZT09PUJ8fHZvaWQgMD09PWU/bmV3IGEoZSk6WChlKX0sIW8mJm0oTykmJkQhPT1PYmplY3QucHJvdG90eXBlKSl7aT1ELnRoZW4sUHx8dShELCJ0aGVuIiwoZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzO3JldHVybiBuZXcgQigoZnVuY3Rpb24oZSx0KXtoKGkscixlLHQpfSkpLnRoZW4oZSx0KX0pLHt1bnNhZmU6ITB9KTt0cnl7ZGVsZXRlIEQuY29uc3RydWN0b3J9Y2F0Y2goZSl7fWQmJmQoRCxMKX1zKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsd3JhcDohMCxmb3JjZWQ6TX0se1Byb21pc2U6Qn0pLGYoQixULCExLCEwKSxnKFQpfSw3NzI3OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxOTEzKSxpPXIoMjQ5Mikscz1yKDcyOTMpLG89cig1MDA1KSxjPXIoNjE0KSxsPXIoNjcwNyksaD1yKDk0NzgpLHU9cig4MDUyKSxkPWkmJmkucHJvdG90eXBlO2lmKG4oe3RhcmdldDoiUHJvbWlzZSIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6ISFpJiZzKChmdW5jdGlvbigpe2QuZmluYWxseS5jYWxsKHt0aGVuOmZ1bmN0aW9uKCl7fX0sKGZ1bmN0aW9uKCl7fSkpfSkpfSx7ZmluYWxseTpmdW5jdGlvbihlKXt2YXIgdD1sKHRoaXMsbygiUHJvbWlzZSIpKSxyPWMoZSk7cmV0dXJuIHRoaXMudGhlbihyP2Z1bmN0aW9uKHIpe3JldHVybiBoKHQsZSgpKS50aGVuKChmdW5jdGlvbigpe3JldHVybiByfSkpfTplLHI/ZnVuY3Rpb24ocil7cmV0dXJuIGgodCxlKCkpLnRoZW4oKGZ1bmN0aW9uKCl7dGhyb3cgcn0pKX06ZSl9fSksIWEmJmMoaSkpe3ZhciBmPW8oIlByb21pc2UiKS5wcm90b3R5cGUuZmluYWxseTtkLmZpbmFsbHkhPT1mJiZ1KGQsImZpbmFsbHkiLGYse3Vuc2FmZTohMH0pfX0sODY3NDooZSx0LHIpPT57cigzNDAxKSxyKDgyMSkscig0MTY0KSxyKDYwMjcpLHIoNjgzKSxyKDYyOTQpfSw2MDI3OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cig2OTE2KSxpPXIoOTY2Mikscz1yKDg1MjMpLG89cigyNTM0KSxjPXIoNDA4KTtuKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITAsZm9yY2VkOnIoNjEyKX0se3JhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxyPXMuZih0KSxuPXIucmVqZWN0LGw9bygoZnVuY3Rpb24oKXt2YXIgcz1pKHQucmVzb2x2ZSk7YyhlLChmdW5jdGlvbihlKXthKHMsdCxlKS50aGVuKHIucmVzb2x2ZSxuKX0pKX0pKTtyZXR1cm4gbC5lcnJvciYmbihsLnZhbHVlKSxyLnByb21pc2V9fSl9LDY4MzooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNjkxNiksaT1yKDg1MjMpO24oe3RhcmdldDoiUHJvbWlzZSIsc3RhdDohMCxmb3JjZWQ6cigzNzAyKS5DT05TVFJVQ1RPUn0se3JlamVjdDpmdW5jdGlvbihlKXt2YXIgdD1pLmYodGhpcyk7cmV0dXJuIGEodC5yZWplY3Qsdm9pZCAwLGUpLHQucHJvbWlzZX19KX0sNjI5NDooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNTAwNSksaT1yKDE5MTMpLHM9cigyNDkyKSxvPXIoMzcwMikuQ09OU1RSVUNUT1IsYz1yKDk0NzgpLGw9YSgiUHJvbWlzZSIpLGg9aSYmIW87bih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwLGZvcmNlZDppfHxvfSx7cmVzb2x2ZTpmdW5jdGlvbihlKXtyZXR1cm4gYyhoJiZ0aGlzPT09bD9zOnRoaXMsZSl9fSl9LDEyOTk6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cig4MDAzKTtuKHtnbG9iYWw6ITB9LHtSZWZsZWN0Ont9fSksaShhLlJlZmxlY3QsIlJlZmxlY3QiLCEwKX0sNDYwMzooZSx0LHIpPT57dmFyIG49cig5NzgxKSxhPXIoNzg1NCksaT1yKDE3MDIpLHM9cig0NzA1KSxvPXIoOTU4NyksYz1yKDg4ODApLGw9cig4MDA2KS5mLGg9cig3OTc2KSx1PXIoNzg1MCksZD1yKDEzNDApLGY9cig0NzA2KSxnPXIoMjk5OSkscD1yKDI2MjYpLG09cig4MDUyKSxiPXIoNzI5MykseT1yKDI1OTcpLHc9cig5OTA5KS5lbmZvcmNlLHY9cig2MzQwKSx4PXIoNTExMiksUz1yKDk0NDEpLEE9cig3MTY4KSxrPXgoIm1hdGNoIiksQz1hLlJlZ0V4cCxPPUMucHJvdG90eXBlLEY9YS5TeW50YXhFcnJvcixJPWkoTy5leGVjKSxUPWkoIiIuY2hhckF0KSxNPWkoIiIucmVwbGFjZSksRT1pKCIiLmluZGV4T2YpLFA9aSgiIi5zbGljZSksUj0vXlw/PFteXHNcZCEjJSYqKzw9PkBeXVteXHMhIyUmKis8PT5AXl0qPi8sTj0vYS9nLEQ9L2EvZyxCPW5ldyBDKE4pIT09TixMPWcuTUlTU0VEX1NUSUNLWSxfPWcuVU5TVVBQT1JURURfWTtpZihzKCJSZWdFeHAiLG4mJighQnx8THx8U3x8QXx8YigoZnVuY3Rpb24oKXtyZXR1cm4gRFtrXT0hMSxDKE4pIT1OfHxDKEQpPT1EfHwiL2EvaSIhPUMoTiwiaSIpfSkpKSkpe2Zvcih2YXIgaj1mdW5jdGlvbihlLHQpe3ZhciByLG4sYSxpLHMsbCxnPWgoTyx0aGlzKSxwPXUoZSksbT12b2lkIDA9PT10LGI9W10sdj1lO2lmKCFnJiZwJiZtJiZlLmNvbnN0cnVjdG9yPT09ailyZXR1cm4gZTtpZigocHx8aChPLGUpKSYmKGU9ZS5zb3VyY2UsbSYmKHQ9Zih2KSkpLGU9dm9pZCAwPT09ZT8iIjpkKGUpLHQ9dm9pZCAwPT09dD8iIjpkKHQpLHY9ZSxTJiYiZG90QWxsImluIE4mJihuPSEhdCYmRSh0LCJzIik+LTEpJiYodD1NKHQsL3MvZywiIikpLHI9dCxMJiYic3RpY2t5ImluIE4mJihhPSEhdCYmRSh0LCJ5Iik+LTEpJiZfJiYodD1NKHQsL3kvZywiIikpLEEmJihpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPWUubGVuZ3RoLG49MCxhPSIiLGk9W10scz17fSxvPSExLGM9ITEsbD0wLGg9IiI7bjw9cjtuKyspe2lmKCJcXCI9PT0odD1UKGUsbikpKXQrPVQoZSwrK24pO2Vsc2UgaWYoIl0iPT09dClvPSExO2Vsc2UgaWYoIW8pc3dpdGNoKCEwKXtjYXNlIlsiPT09dDpvPSEwO2JyZWFrO2Nhc2UiKCI9PT10OkkoUixQKGUsbisxKSkmJihuKz0yLGM9ITApLGErPXQsbCsrO2NvbnRpbnVlO2Nhc2UiPiI9PT10JiZjOmlmKCIiPT09aHx8eShzLGgpKXRocm93IG5ldyBGKCJJbnZhbGlkIGNhcHR1cmUgZ3JvdXAgbmFtZSIpO3NbaF09ITAsaVtpLmxlbmd0aF09W2gsbF0sYz0hMSxoPSIiO2NvbnRpbnVlfWM/aCs9dDphKz10fXJldHVyblthLGldfShlKSxlPWlbMF0sYj1pWzFdKSxzPW8oQyhlLHQpLGc/dGhpczpPLGopLChufHxhfHxiLmxlbmd0aCkmJihsPXcocyksbiYmKGwuZG90QWxsPSEwLGwucmF3PWooZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9ZS5sZW5ndGgsbj0wLGE9IiIsaT0hMTtuPD1yO24rKykiXFwiIT09KHQ9VChlLG4pKT9pfHwiLiIhPT10PygiWyI9PT10P2k9ITA6Il0iPT09dCYmKGk9ITEpLGErPXQpOmErPSJbXFxzXFxTXSI6YSs9dCtUKGUsKytuKTtyZXR1cm4gYX0oZSkscikpLGEmJihsLnN0aWNreT0hMCksYi5sZW5ndGgmJihsLmdyb3Vwcz1iKSksZSE9PXYpdHJ5e2Mocywic291cmNlIiwiIj09PXY/Iig/OikiOnYpfWNhdGNoKGUpe31yZXR1cm4gc30sVT1sKEMpLCQ9MDtVLmxlbmd0aD4kOylwKGosQyxVWyQrK10pO08uY29uc3RydWN0b3I9aixqLnByb3RvdHlwZT1PLG0oYSwiUmVnRXhwIixqLHtjb25zdHJ1Y3RvcjohMH0pfXYoIlJlZ0V4cCIpfSw4NDUwOihlLHQscik9Pnt2YXIgbj1yKDk3ODEpLGE9cig5NDQxKSxpPXIoNDMyNikscz1yKDcwNDUpLG89cig5OTA5KS5nZXQsYz1SZWdFeHAucHJvdG90eXBlLGw9VHlwZUVycm9yO24mJmEmJnMoYywiZG90QWxsIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHRoaXMhPT1jKXtpZigiUmVnRXhwIj09PWkodGhpcykpcmV0dXJuISFvKHRoaXMpLmRvdEFsbDt0aHJvdyBsKCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsIFJlZ0V4cCByZXF1aXJlZCIpfX19KX0sNDkxNjooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMjI2MSk7bih7dGFyZ2V0OiJSZWdFeHAiLHByb3RvOiEwLGZvcmNlZDovLi8uZXhlYyE9PWF9LHtleGVjOmF9KX0sMjA4NzooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoOTc4MSksaT1yKDcwNDUpLHM9cig3MDY2KSxvPXIoNzI5MyksYz1uLlJlZ0V4cCxsPWMucHJvdG90eXBlO2EmJm8oKGZ1bmN0aW9uKCl7dmFyIGU9ITA7dHJ5e2MoIi4iLCJkIil9Y2F0Y2godCl7ZT0hMX12YXIgdD17fSxyPSIiLG49ZT8iZGdpbXN5IjoiZ2ltc3kiLGE9ZnVuY3Rpb24oZSxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcis9biwhMH19KX0saT17ZG90QWxsOiJzIixnbG9iYWw6ImciLGlnbm9yZUNhc2U6ImkiLG11bHRpbGluZToibSIsc3RpY2t5OiJ5In07Zm9yKHZhciBzIGluIGUmJihpLmhhc0luZGljZXM9ImQiKSxpKWEocyxpW3NdKTtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihsLCJmbGFncyIpLmdldC5jYWxsKHQpIT09bnx8ciE9PW59KSkmJmkobCwiZmxhZ3MiLHtjb25maWd1cmFibGU6ITAsZ2V0OnN9KX0sNzYwMTooZSx0LHIpPT57cig0OTE2KTt2YXIgbixhLGk9cigyMTA5KSxzPXIoNjkxNiksbz1yKDYxNCksYz1yKDk2NzApLGw9cigxMzQwKSxoPShuPSExLChhPS9bYWNdLykuZXhlYz1mdW5jdGlvbigpe3JldHVybiBuPSEwLC8uLy5leGVjLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sITA9PT1hLnRlc3QoImFiYyIpJiZuKSx1PS8uLy50ZXN0O2koe3RhcmdldDoiUmVnRXhwIixwcm90bzohMCxmb3JjZWQ6IWh9LHt0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PWModGhpcykscj1sKGUpLG49dC5leGVjO2lmKCFvKG4pKXJldHVybiBzKHUsdCxyKTt2YXIgYT1zKG4sdCxyKTtyZXR1cm4gbnVsbCE9PWEmJihjKGEpLCEwKX19KX0sOTcxNDooZSx0LHIpPT57dmFyIG49cig2NTMwKS5QUk9QRVIsYT1yKDgwNTIpLGk9cig5NjcwKSxzPXIoMTM0MCksbz1yKDcyOTMpLGM9cig0NzA2KSxsPSJ0b1N0cmluZyIsaD1SZWdFeHAucHJvdG90eXBlW2xdLHU9bygoZnVuY3Rpb24oKXtyZXR1cm4iL2EvYiIhPWguY2FsbCh7c291cmNlOiJhIixmbGFnczoiYiJ9KX0pKSxkPW4mJmgubmFtZSE9bDsodXx8ZCkmJmEoUmVnRXhwLnByb3RvdHlwZSxsLChmdW5jdGlvbigpe3ZhciBlPWkodGhpcyk7cmV0dXJuIi8iK3MoZS5zb3VyY2UpKyIvIitzKGMoZSkpfSkse3Vuc2FmZTohMH0pfSw0NTA2OihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxNzAyKSxpPXIoNDQ4OCkscz1yKDkzMDMpLG89cigxMzQwKSxjPXIoNzI5MyksbD1hKCIiLmNoYXJBdCk7bih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpjKChmdW5jdGlvbigpe3JldHVybiJcdWQ4NDIiIT09Iu2hgu2+tyIuYXQoLTIpfSkpfSx7YXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9byhpKHRoaXMpKSxyPXQubGVuZ3RoLG49cyhlKSxhPW4+PTA/bjpyK247cmV0dXJuIGE8MHx8YT49cj92b2lkIDA6bCh0LGEpfX0pfSw3ODUyOihlLHQscik9Pnt2YXIgbixhPXIoMjEwOSksaT1yKDE0NzApLHM9cigxMjM2KS5mLG89cig3NDY2KSxjPXIoMTM0MCksbD1yKDM5MjkpLGg9cig0NDg4KSx1PXIoNDk2NCksZD1yKDE5MTMpLGY9aSgiIi5lbmRzV2l0aCksZz1pKCIiLnNsaWNlKSxwPU1hdGgubWluLG09dSgiZW5kc1dpdGgiKTthKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOiEoIWQmJiFtJiYobj1zKFN0cmluZy5wcm90b3R5cGUsImVuZHNXaXRoIiksbiYmIW4ud3JpdGFibGUpfHxtKX0se2VuZHNXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PWMoaCh0aGlzKSk7bChlKTt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCxuPXQubGVuZ3RoLGE9dm9pZCAwPT09cj9uOnAobyhyKSxuKSxpPWMoZSk7cmV0dXJuIGY/Zih0LGksYSk6Zyh0LGEtaS5sZW5ndGgsYSk9PT1pfX0pfSwyMDIzOihlLHQscik9Pnt2YXIgbj1yKDIxMDkpLGE9cigxNzAyKSxpPXIoMzkyOSkscz1yKDQ0ODgpLG89cigxMzQwKSxjPXIoNDk2NCksbD1hKCIiLmluZGV4T2YpO24oe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6IWMoImluY2x1ZGVzIil9LHtpbmNsdWRlczpmdW5jdGlvbihlKXtyZXR1cm4hIX5sKG8ocyh0aGlzKSksbyhpKGUpKSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LDg3ODM6KGUsdCxyKT0+e3ZhciBuPXIoODcxMCkuY2hhckF0LGE9cigxMzQwKSxpPXIoOTkwOSkscz1yKDE2NTYpLG89cig2MTc4KSxjPSJTdHJpbmcgSXRlcmF0b3IiLGw9aS5zZXQsaD1pLmdldHRlckZvcihjKTtzKFN0cmluZywiU3RyaW5nIiwoZnVuY3Rpb24oZSl7bCh0aGlzLHt0eXBlOmMsc3RyaW5nOmEoZSksaW5kZXg6MH0pfSksKGZ1bmN0aW9uKCl7dmFyIGUsdD1oKHRoaXMpLHI9dC5zdHJpbmcsYT10LmluZGV4O3JldHVybiBhPj1yLmxlbmd0aD9vKHZvaWQgMCwhMCk6KGU9bihyLGEpLHQuaW5kZXgrPWUubGVuZ3RoLG8oZSwhMSkpfSkpfSw0NzIzOihlLHQscik9Pnt2YXIgbj1yKDY5MTYpLGE9cig3MDA3KSxpPXIoOTY3MCkscz1yKDg1NTQpLG89cig3NDY2KSxjPXIoMTM0MCksbD1yKDQ0ODgpLGg9cig4MTczKSx1PXIoMTUzMCksZD1yKDc2NTEpO2EoIm1hdGNoIiwoZnVuY3Rpb24oZSx0LHIpe3JldHVybltmdW5jdGlvbih0KXt2YXIgcj1sKHRoaXMpLGE9cyh0KT92b2lkIDA6aCh0LGUpO3JldHVybiBhP24oYSx0LHIpOm5ldyBSZWdFeHAodClbZV0oYyhyKSl9LGZ1bmN0aW9uKGUpe3ZhciBuPWkodGhpcyksYT1jKGUpLHM9cih0LG4sYSk7aWYocy5kb25lKXJldHVybiBzLnZhbHVlO2lmKCFuLmdsb2JhbClyZXR1cm4gZChuLGEpO3ZhciBsPW4udW5pY29kZTtuLmxhc3RJbmRleD0wO2Zvcih2YXIgaCxmPVtdLGc9MDtudWxsIT09KGg9ZChuLGEpKTspe3ZhciBwPWMoaFswXSk7ZltnXT1wLCIiPT09cCYmKG4ubGFzdEluZGV4PXUoYSxvKG4ubGFzdEluZGV4KSxsKSksZysrfXJldHVybiAwPT09Zz9udWxsOmZ9XX0pKX0sODc1NzooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNjkxNiksaT1yKDE3MDIpLHM9cig0NDg4KSxvPXIoNjE0KSxjPXIoODU1NCksbD1yKDc4NTApLGg9cigxMzQwKSx1PXIoODE3MyksZD1yKDQ3MDYpLGY9cig2NDcpLGc9cig1MTEyKSxwPXIoMTkxMyksbT1nKCJyZXBsYWNlIiksYj1UeXBlRXJyb3IseT1pKCIiLmluZGV4T2YpLHc9aSgiIi5yZXBsYWNlKSx2PWkoIiIuc2xpY2UpLHg9TWF0aC5tYXgsUz1mdW5jdGlvbihlLHQscil7cmV0dXJuIHI+ZS5sZW5ndGg/LTE6IiI9PT10P3I6eShlLHQscil9O24oe3RhcmdldDoiU3RyaW5nIixwcm90bzohMH0se3JlcGxhY2VBbGw6ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGksZyxBLGssQyxPLEYsST1zKHRoaXMpLFQ9MCxNPTAsRT0iIjtpZighYyhlKSl7aWYoKHI9bChlKSkmJihuPWgocyhkKGUpKSksIX55KG4sImciKSkpdGhyb3cgYigiYC5yZXBsYWNlQWxsYCBkb2VzIG5vdCBhbGxvdyBub24tZ2xvYmFsIHJlZ2V4ZXMiKTtpZihpPXUoZSxtKSlyZXR1cm4gYShpLGUsSSx0KTtpZihwJiZyKXJldHVybiB3KGgoSSksZSx0KX1mb3IoZz1oKEkpLEE9aChlKSwoaz1vKHQpKXx8KHQ9aCh0KSksQz1BLmxlbmd0aCxPPXgoMSxDKSxUPVMoZyxBLDApOy0xIT09VDspRj1rP2godChBLFQsZykpOmYoQSxnLFQsW10sdm9pZCAwLHQpLEUrPXYoZyxNLFQpK0YsTT1UK0MsVD1TKGcsQSxUK08pO3JldHVybiBNPGcubGVuZ3RoJiYoRSs9dihnLE0pKSxFfX0pfSw1MzA2OihlLHQscik9Pnt2YXIgbj1yKDIxMDQpLGE9cig2OTE2KSxpPXIoMTcwMikscz1yKDcwMDcpLG89cig3MjkzKSxjPXIoOTY3MCksbD1yKDYxNCksaD1yKDg1NTQpLHU9cig5MzAzKSxkPXIoNzQ2NiksZj1yKDEzNDApLGc9cig0NDg4KSxwPXIoMTUzMCksbT1yKDgxNzMpLGI9cig2NDcpLHk9cig3NjUxKSx3PXIoNTExMikoInJlcGxhY2UiKSx2PU1hdGgubWF4LHg9TWF0aC5taW4sUz1pKFtdLmNvbmNhdCksQT1pKFtdLnB1c2gpLGs9aSgiIi5pbmRleE9mKSxDPWkoIiIuc2xpY2UpLE89IiQwIj09PSJhIi5yZXBsYWNlKC8uLywiJDAiKSxGPSEhLy4vW3ddJiYiIj09PS8uL1t3XSgiYSIsIiQwIik7cygicmVwbGFjZSIsKGZ1bmN0aW9uKGUsdCxyKXt2YXIgaT1GPyIkIjoiJDAiO3JldHVybltmdW5jdGlvbihlLHIpe3ZhciBuPWcodGhpcyksaT1oKGUpP3ZvaWQgMDptKGUsdyk7cmV0dXJuIGk/YShpLGUsbixyKTphKHQsZihuKSxlLHIpfSxmdW5jdGlvbihlLGEpe3ZhciBzPWModGhpcyksbz1mKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmLTE9PT1rKGEsaSkmJi0xPT09ayhhLCIkPCIpKXt2YXIgaD1yKHQscyxvLGEpO2lmKGguZG9uZSlyZXR1cm4gaC52YWx1ZX12YXIgZz1sKGEpO2d8fChhPWYoYSkpO3ZhciBtPXMuZ2xvYmFsO2lmKG0pe3ZhciB3PXMudW5pY29kZTtzLmxhc3RJbmRleD0wfWZvcih2YXIgTz1bXTs7KXt2YXIgRj15KHMsbyk7aWYobnVsbD09PUYpYnJlYWs7aWYoQShPLEYpLCFtKWJyZWFrOyIiPT09ZihGWzBdKSYmKHMubGFzdEluZGV4PXAobyxkKHMubGFzdEluZGV4KSx3KSl9Zm9yKHZhciBJLFQ9IiIsTT0wLEU9MDtFPE8ubGVuZ3RoO0UrKyl7Zm9yKHZhciBQPWYoKEY9T1tFXSlbMF0pLFI9dih4KHUoRi5pbmRleCksby5sZW5ndGgpLDApLE49W10sRD0xO0Q8Ri5sZW5ndGg7RCsrKUEoTix2b2lkIDA9PT0oST1GW0RdKT9JOlN0cmluZyhJKSk7dmFyIEI9Ri5ncm91cHM7aWYoZyl7dmFyIEw9UyhbUF0sTixSLG8pO3ZvaWQgMCE9PUImJkEoTCxCKTt2YXIgXz1mKG4oYSx2b2lkIDAsTCkpfWVsc2UgXz1iKFAsbyxSLE4sQixhKTtSPj1NJiYoVCs9QyhvLE0sUikrXyxNPVIrUC5sZW5ndGgpfXJldHVybiBUK0MobyxNKX1dfSksISFvKChmdW5jdGlvbigpe3ZhciBlPS8uLztyZXR1cm4gZS5leGVjPWZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIGUuZ3JvdXBzPXthOiI3In0sZX0sIjciIT09IiIucmVwbGFjZShlLCIkPGE+Iil9KSl8fCFPfHxGKX0sMzEyMzooZSx0LHIpPT57dmFyIG49cigyMTA0KSxhPXIoNjkxNiksaT1yKDE3MDIpLHM9cig3MDA3KSxvPXIoOTY3MCksYz1yKDg1NTQpLGw9cig3ODUwKSxoPXIoNDQ4OCksdT1yKDY3MDcpLGQ9cigxNTMwKSxmPXIoNzQ2NiksZz1yKDEzNDApLHA9cig4MTczKSxtPXIoMTU4OSksYj1yKDc2NTEpLHk9cigyMjYxKSx3PXIoMjk5OSksdj1yKDcyOTMpLHg9dy5VTlNVUFBPUlRFRF9ZLFM9NDI5NDk2NzI5NSxBPU1hdGgubWluLGs9W10ucHVzaCxDPWkoLy4vLmV4ZWMpLE89aShrKSxGPWkoIiIuc2xpY2UpO3MoInNwbGl0IiwoZnVuY3Rpb24oZSx0LHIpe3ZhciBpO3JldHVybiBpPSJjIj09ImFiYmMiLnNwbGl0KC8oYikqLylbMV18fDQhPSJ0ZXN0Ii5zcGxpdCgvKD86KS8sLTEpLmxlbmd0aHx8MiE9ImFiIi5zcGxpdCgvKD86YWIpKi8pLmxlbmd0aHx8NCE9Ii4iLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aHx8Ii4iLnNwbGl0KC8oKSgpLykubGVuZ3RoPjF8fCIiLnNwbGl0KC8uPy8pLmxlbmd0aD9mdW5jdGlvbihlLHIpe3ZhciBpPWcoaCh0aGlzKSkscz12b2lkIDA9PT1yP1M6cj4+PjA7aWYoMD09PXMpcmV0dXJuW107aWYodm9pZCAwPT09ZSlyZXR1cm5baV07aWYoIWwoZSkpcmV0dXJuIGEodCxpLGUscyk7Zm9yKHZhciBvLGMsdSxkPVtdLGY9KGUuaWdub3JlQ2FzZT8iaSI6IiIpKyhlLm11bHRpbGluZT8ibSI6IiIpKyhlLnVuaWNvZGU/InUiOiIiKSsoZS5zdGlja3k/InkiOiIiKSxwPTAsYj1uZXcgUmVnRXhwKGUuc291cmNlLGYrImciKTsobz1hKHksYixpKSkmJiEoKGM9Yi5sYXN0SW5kZXgpPnAmJihPKGQsRihpLHAsby5pbmRleCkpLG8ubGVuZ3RoPjEmJm8uaW5kZXg8aS5sZW5ndGgmJm4oayxkLG0obywxKSksdT1vWzBdLmxlbmd0aCxwPWMsZC5sZW5ndGg+PXMpKTspYi5sYXN0SW5kZXg9PT1vLmluZGV4JiZiLmxhc3RJbmRleCsrO3JldHVybiBwPT09aS5sZW5ndGg/IXUmJkMoYiwiIil8fE8oZCwiIik6TyhkLEYoaSxwKSksZC5sZW5ndGg+cz9tKGQsMCxzKTpkfToiMCIuc3BsaXQodm9pZCAwLDApLmxlbmd0aD9mdW5jdGlvbihlLHIpe3JldHVybiB2b2lkIDA9PT1lJiYwPT09cj9bXTphKHQsdGhpcyxlLHIpfTp0LFtmdW5jdGlvbih0LHIpe3ZhciBuPWgodGhpcykscz1jKHQpP3ZvaWQgMDpwKHQsZSk7cmV0dXJuIHM/YShzLHQsbixyKTphKGksZyhuKSx0LHIpfSxmdW5jdGlvbihlLG4pe3ZhciBhPW8odGhpcykscz1nKGUpLGM9cihpLGEscyxuLGkhPT10KTtpZihjLmRvbmUpcmV0dXJuIGMudmFsdWU7dmFyIGw9dShhLFJlZ0V4cCksaD1hLnVuaWNvZGUscD0oYS5pZ25vcmVDYXNlPyJpIjoiIikrKGEubXVsdGlsaW5lPyJtIjoiIikrKGEudW5pY29kZT8idSI6IiIpKyh4PyJnIjoieSIpLG09bmV3IGwoeD8iXig/OiIrYS5zb3VyY2UrIikiOmEscCkseT12b2lkIDA9PT1uP1M6bj4+PjA7aWYoMD09PXkpcmV0dXJuW107aWYoMD09PXMubGVuZ3RoKXJldHVybiBudWxsPT09YihtLHMpP1tzXTpbXTtmb3IodmFyIHc9MCx2PTAsaz1bXTt2PHMubGVuZ3RoOyl7bS5sYXN0SW5kZXg9eD8wOnY7dmFyIEMsST1iKG0seD9GKHMsdik6cyk7aWYobnVsbD09PUl8fChDPUEoZihtLmxhc3RJbmRleCsoeD92OjApKSxzLmxlbmd0aCkpPT09dyl2PWQocyx2LGgpO2Vsc2V7aWYoTyhrLEYocyx3LHYpKSxrLmxlbmd0aD09PXkpcmV0dXJuIGs7Zm9yKHZhciBUPTE7VDw9SS5sZW5ndGgtMTtUKyspaWYoTyhrLElbVF0pLGsubGVuZ3RoPT09eSlyZXR1cm4gazt2PXc9Q319cmV0dXJuIE8oayxGKHMsdykpLGt9XX0pLCEhdigoZnVuY3Rpb24oKXt2YXIgZT0vKD86KS8sdD1lLmV4ZWM7ZS5leGVjPWZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt2YXIgcj0iYWIiLnNwbGl0KGUpO3JldHVybiAyIT09ci5sZW5ndGh8fCJhIiE9PXJbMF18fCJiIiE9PXJbMV19KSkseCl9LDY3NTU6KGUsdCxyKT0+e3ZhciBuLGE9cigyMTA5KSxpPXIoMTQ3MCkscz1yKDEyMzYpLmYsbz1yKDc0NjYpLGM9cigxMzQwKSxsPXIoMzkyOSksaD1yKDQ0ODgpLHU9cig0OTY0KSxkPXIoMTkxMyksZj1pKCIiLnN0YXJ0c1dpdGgpLGc9aSgiIi5zbGljZSkscD1NYXRoLm1pbixtPXUoInN0YXJ0c1dpdGgiKTthKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOiEoIWQmJiFtJiYobj1zKFN0cmluZy5wcm90b3R5cGUsInN0YXJ0c1dpdGgiKSxuJiYhbi53cml0YWJsZSl8fG0pfSx7c3RhcnRzV2l0aDpmdW5jdGlvbihlKXt2YXIgdD1jKGgodGhpcykpO2woZSk7dmFyIHI9byhwKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHQubGVuZ3RoKSksbj1jKGUpO3JldHVybiBmP2YodCxuLHIpOmcodCxyLHIrbi5sZW5ndGgpPT09bn19KX0sMzIxMDooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoMzExMSkudHJpbTtuKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOnIoNjA5MSkoInRyaW0iKX0se3RyaW06ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzKX19KX0sMTgxNzooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoOTc4MSksaT1yKDc4NTQpLHM9cigxNzAyKSxvPXIoMjU5NyksYz1yKDYxNCksbD1yKDc5NzYpLGg9cigxMzQwKSx1PXIoNzA0NSksZD1yKDk5MjApLGY9aS5TeW1ib2wsZz1mJiZmLnByb3RvdHlwZTtpZihhJiZjKGYpJiYoISgiZGVzY3JpcHRpb24iaW4gZyl8fHZvaWQgMCE9PWYoKS5kZXNjcmlwdGlvbikpe3ZhciBwPXt9LG09ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPDF8fHZvaWQgMD09PWFyZ3VtZW50c1swXT92b2lkIDA6aChhcmd1bWVudHNbMF0pLHQ9bChnLHRoaXMpP25ldyBmKGUpOnZvaWQgMD09PWU/ZigpOmYoZSk7cmV0dXJuIiI9PT1lJiYocFt0XT0hMCksdH07ZChtLGYpLG0ucHJvdG90eXBlPWcsZy5jb25zdHJ1Y3Rvcj1tO3ZhciBiPSJTeW1ib2wodGVzdCkiPT1TdHJpbmcoZigidGVzdCIpKSx5PXMoZy52YWx1ZU9mKSx3PXMoZy50b1N0cmluZyksdj0vXlN5bWJvbFwoKC4qKVwpW14pXSskLyx4PXMoIiIucmVwbGFjZSksUz1zKCIiLnNsaWNlKTt1KGcsImRlc2NyaXB0aW9uIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciBlPXkodGhpcyk7aWYobyhwLGUpKXJldHVybiIiO3ZhciB0PXcoZSkscj1iP1ModCw3LC0xKTp4KHQsdiwiJDEiKTtyZXR1cm4iIj09PXI/dm9pZCAwOnJ9fSksbih7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGZvcmNlZDohMH0se1N5bWJvbDptfSl9fSw4Njc1OihlLHQscik9Pnt2YXIgbj1yKDI2MCksYT1yKDYyNDQpLGk9cig5MzAzKSxzPW4uYVR5cGVkQXJyYXk7KDAsbi5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiYXQiLChmdW5jdGlvbihlKXt2YXIgdD1zKHRoaXMpLHI9YSh0KSxuPWkoZSksbz1uPj0wP246cituO3JldHVybiBvPDB8fG8+PXI/dm9pZCAwOnRbb119KSl9LDMxMDU6KGUsdCxyKT0+e3ZhciBuPXIoMjYwKSxhPXIoMTI4NSksaT1yKDQ1OTkpLHM9cig2NDgpLG89cig2OTE2KSxjPXIoMTcwMiksbD1yKDcyOTMpLGg9bi5hVHlwZWRBcnJheSx1PW4uZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxkPWMoIiIuc2xpY2UpO3UoImZpbGwiLChmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO2godGhpcyk7dmFyIHI9IkJpZyI9PT1kKHModGhpcyksMCwzKT9pKGUpOitlO3JldHVybiBvKGEsdGhpcyxyLHQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHQ+Mj9hcmd1bWVudHNbMl06dm9pZCAwKX0pLGwoKGZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gbmV3IEludDhBcnJheSgyKS5maWxsKHt2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIGUrK319KSwxIT09ZX0pKSl9LDI5NTg6KGUsdCxyKT0+e3ZhciBuPXIoMjYwKSxhPXIoOTY3MSkuZmluZExhc3RJbmRleCxpPW4uYVR5cGVkQXJyYXk7KDAsbi5leHBvcnRUeXBlZEFycmF5TWV0aG9kKSgiZmluZExhc3RJbmRleCIsKGZ1bmN0aW9uKGUpe3JldHVybiBhKGkodGhpcyksZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSl9LDM0MDg6KGUsdCxyKT0+e3ZhciBuPXIoMjYwKSxhPXIoOTY3MSkuZmluZExhc3QsaT1uLmFUeXBlZEFycmF5OygwLG4uZXhwb3J0VHlwZWRBcnJheU1ldGhvZCkoImZpbmRMYXN0IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGEoaSh0aGlzKSxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0pKX0sNDE5NzooZSx0LHIpPT57cig5ODQzKSgiRmxvYXQzMiIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LHIsbil7cmV0dXJuIGUodGhpcyx0LHIsbil9fSkpfSw2NDk1OihlLHQscik9PntyKDk4NDMpKCJGbG9hdDY0IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDUxMDk6KGUsdCxyKT0+e3IoOTg0MykoIkludDE2IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDUxMjU6KGUsdCxyKT0+e3IoOTg0MykoIkludDMyIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDcxNDU6KGUsdCxyKT0+e3IoOTg0MykoIkludDgiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyLG4pe3JldHVybiBlKHRoaXMsdCxyLG4pfX0pKX0sMzQ2MjooZSx0LHIpPT57dmFyIG49cig3ODU0KSxhPXIoNjkxNiksaT1yKDI2MCkscz1yKDYyNDQpLG89cig0NTkwKSxjPXIoNzkwOCksbD1yKDcyOTMpLGg9bi5SYW5nZUVycm9yLHU9bi5JbnQ4QXJyYXksZD11JiZ1LnByb3RvdHlwZSxmPWQmJmQuc2V0LGc9aS5hVHlwZWRBcnJheSxwPWkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxtPSFsKChmdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OENsYW1wZWRBcnJheSgyKTtyZXR1cm4gYShmLGUse2xlbmd0aDoxLDA6M30sMSksMyE9PWVbMV19KSksYj1tJiZpLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MmJmwoKGZ1bmN0aW9uKCl7dmFyIGU9bmV3IHUoMik7cmV0dXJuIGUuc2V0KDEpLGUuc2V0KCIyIiwxKSwwIT09ZVswXXx8MiE9PWVbMV19KSk7cCgic2V0IiwoZnVuY3Rpb24oZSl7Zyh0aGlzKTt2YXIgdD1vKGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDEpLHI9YyhlKTtpZihtKXJldHVybiBhKGYsdGhpcyxyLHQpO3ZhciBuPXRoaXMubGVuZ3RoLGk9cyhyKSxsPTA7aWYoaSt0Pm4pdGhyb3cgaCgiV3JvbmcgbGVuZ3RoIik7Zm9yKDtsPGk7KXRoaXNbdCtsXT1yW2wrK119KSwhbXx8Yil9LDM4MjQ6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDE0NzApLGk9cig3MjkzKSxzPXIoOTY2Miksbz1yKDQzNjIpLGM9cigyNjApLGw9cig4ODg2KSxoPXIoMjU2KSx1PXIoNzM5MiksZD1yKDgwMDgpLGY9Yy5hVHlwZWRBcnJheSxnPWMuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCxwPW4uVWludDE2QXJyYXksbT1wJiZhKHAucHJvdG90eXBlLnNvcnQpLGI9ISghbXx8aSgoZnVuY3Rpb24oKXttKG5ldyBwKDIpLG51bGwpfSkpJiZpKChmdW5jdGlvbigpe20obmV3IHAoMikse30pfSkpKSx5PSEhbSYmIWkoKGZ1bmN0aW9uKCl7aWYodSlyZXR1cm4gdTw3NDtpZihsKXJldHVybiBsPDY3O2lmKGgpcmV0dXJuITA7aWYoZClyZXR1cm4gZDw2MDI7dmFyIGUsdCxyPW5ldyBwKDUxNiksbj1BcnJheSg1MTYpO2ZvcihlPTA7ZTw1MTY7ZSsrKXQ9ZSU0LHJbZV09NTE1LWUsbltlXT1lLTIqdCszO2ZvcihtKHIsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUvNHwwKS0odC80fDApfSkpLGU9MDtlPDUxNjtlKyspaWYocltlXSE9PW5bZV0pcmV0dXJuITB9KSk7Zygic29ydCIsKGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lJiZzKGUpLHk/bSh0aGlzLGUpOm8oZih0aGlzKSxmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyKXtyZXR1cm4gdm9pZCAwIT09ZT8rZSh0LHIpfHwwOnIhPXI/LTE6dCE9dD8xOjA9PT10JiYwPT09cj8xL3Q+MCYmMS9yPDA/MTotMTp0PnJ9fShlKSl9KSwheXx8Yil9LDI5NzQ6KGUsdCxyKT0+e3ZhciBuPXIoNzg1NCksYT1yKDIxMDQpLGk9cigyNjApLHM9cig3MjkzKSxvPXIoMjA2KSxjPW4uSW50OEFycmF5LGw9aS5hVHlwZWRBcnJheSxoPWkuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCx1PVtdLnRvTG9jYWxlU3RyaW5nLGQ9ISFjJiZzKChmdW5jdGlvbigpe3UuY2FsbChuZXcgYygxKSl9KSk7aCgidG9Mb2NhbGVTdHJpbmciLChmdW5jdGlvbigpe3JldHVybiBhKHUsZD9vKGwodGhpcykpOmwodGhpcyksbyhhcmd1bWVudHMpKX0pLHMoKGZ1bmN0aW9uKCl7cmV0dXJuWzEsMl0udG9Mb2NhbGVTdHJpbmcoKSE9bmV3IGMoWzEsMl0pLnRvTG9jYWxlU3RyaW5nKCl9KSl8fCFzKChmdW5jdGlvbigpe2MucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nLmNhbGwoWzEsMl0pfSkpKX0sMTQzOTooZSx0LHIpPT57dmFyIG49cigxODQzKSxhPXIoMjYwKSxpPWEuYVR5cGVkQXJyYXkscz1hLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Qsbz1hLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjtzKCJ0b1JldmVyc2VkIiwoZnVuY3Rpb24oKXtyZXR1cm4gbihpKHRoaXMpLG8odGhpcykpfSkpfSw3NTg1OihlLHQscik9Pnt2YXIgbj1yKDI2MCksYT1yKDE3MDIpLGk9cig5NjYyKSxzPXIoNzc0NSksbz1uLmFUeXBlZEFycmF5LGM9bi5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsbD1uLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsaD1hKG4uVHlwZWRBcnJheVByb3RvdHlwZS5zb3J0KTtsKCJ0b1NvcnRlZCIsKGZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJmkoZSk7dmFyIHQ9byh0aGlzKSxyPXMoYyh0KSx0KTtyZXR1cm4gaChyLGUpfSkpfSw4MjU1OihlLHQscik9PntyKDk4NDMpKCJVaW50MTYiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxyLG4pe3JldHVybiBlKHRoaXMsdCxyLG4pfX0pKX0sOTEzNTooZSx0LHIpPT57cig5ODQzKSgiVWludDMyIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDI0NzI6KGUsdCxyKT0+e3IoOTg0MykoIlVpbnQ4IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSl9LDk3NDM6KGUsdCxyKT0+e3IoOTg0MykoIlVpbnQ4IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscixuKXtyZXR1cm4gZSh0aGlzLHQscixuKX19KSwhMCl9LDUzMTU6KGUsdCxyKT0+e3ZhciBuPXIoMTU3MiksYT1yKDI2MCksaT1yKDQwNjcpLHM9cig5MzAzKSxvPXIoNDU5OSksYz1hLmFUeXBlZEFycmF5LGw9YS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsaD1hLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsdT0hIWZ1bmN0aW9uKCl7dHJ5e25ldyBJbnQ4QXJyYXkoMSkud2l0aCgyLHt2YWx1ZU9mOmZ1bmN0aW9uKCl7dGhyb3cgOH19KX1jYXRjaChlKXtyZXR1cm4gOD09PWV9fSgpO2goIndpdGgiLHt3aXRoOmZ1bmN0aW9uKGUsdCl7dmFyIHI9Yyh0aGlzKSxhPXMoZSksaD1pKHIpP28odCk6K3Q7cmV0dXJuIG4ocixsKHIpLGEsaCl9fS53aXRoLCF1KX0sMTIwMjooZSx0LHIpPT57dmFyIG4sYT1yKDY2NzcpLGk9cig3ODU0KSxzPXIoMTcwMiksbz1yKDkxOTApLGM9cigyNDIzKSxsPXIoNzcxMCksaD1yKDkzMjApLHU9cigxMTEpLGQ9cig5OTA5KS5lbmZvcmNlLGY9cig3MjkzKSxnPXIoNDgxMSkscD1PYmplY3QsbT1BcnJheS5pc0FycmF5LGI9cC5pc0V4dGVuc2libGUseT1wLmlzRnJvemVuLHc9cC5pc1NlYWxlZCx2PXAuZnJlZXplLHg9cC5zZWFsLFM9e30sQT17fSxrPSFpLkFjdGl2ZVhPYmplY3QmJiJBY3RpdmVYT2JqZWN0ImluIGksQz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSxPPWwoIldlYWtNYXAiLEMsaCksRj1PLnByb3RvdHlwZSxJPXMoRi5zZXQpO2lmKGcpaWYoayl7bj1oLmdldENvbnN0cnVjdG9yKEMsIldlYWtNYXAiLCEwKSxjLmVuYWJsZSgpO3ZhciBUPXMoRi5kZWxldGUpLE09cyhGLmhhcyksRT1zKEYuZ2V0KTtvKEYse2RlbGV0ZTpmdW5jdGlvbihlKXtpZih1KGUpJiYhYihlKSl7dmFyIHQ9ZCh0aGlzKTtyZXR1cm4gdC5mcm96ZW58fCh0LmZyb3plbj1uZXcgbiksVCh0aGlzLGUpfHx0LmZyb3plbi5kZWxldGUoZSl9cmV0dXJuIFQodGhpcyxlKX0saGFzOmZ1bmN0aW9uKGUpe2lmKHUoZSkmJiFiKGUpKXt2YXIgdD1kKHRoaXMpO3JldHVybiB0LmZyb3plbnx8KHQuZnJvemVuPW5ldyBuKSxNKHRoaXMsZSl8fHQuZnJvemVuLmhhcyhlKX1yZXR1cm4gTSh0aGlzLGUpfSxnZXQ6ZnVuY3Rpb24oZSl7aWYodShlKSYmIWIoZSkpe3ZhciB0PWQodGhpcyk7cmV0dXJuIHQuZnJvemVufHwodC5mcm96ZW49bmV3IG4pLE0odGhpcyxlKT9FKHRoaXMsZSk6dC5mcm96ZW4uZ2V0KGUpfXJldHVybiBFKHRoaXMsZSl9LHNldDpmdW5jdGlvbihlLHQpe2lmKHUoZSkmJiFiKGUpKXt2YXIgcj1kKHRoaXMpO3IuZnJvemVufHwoci5mcm96ZW49bmV3IG4pLE0odGhpcyxlKT9JKHRoaXMsZSx0KTpyLmZyb3plbi5zZXQoZSx0KX1lbHNlIEkodGhpcyxlLHQpO3JldHVybiB0aGlzfX0pfWVsc2UgYSYmZigoZnVuY3Rpb24oKXt2YXIgZT12KFtdKTtyZXR1cm4gSShuZXcgTyxlLDEpLCF5KGUpfSkpJiZvKEYse3NldDpmdW5jdGlvbihlLHQpe3ZhciByO3JldHVybiBtKGUpJiYoeShlKT9yPVM6dyhlKSYmKHI9QSkpLEkodGhpcyxlLHQpLHI9PVMmJnYoZSkscj09QSYmeChlKSx0aGlzfX0pfSw0MTI5OihlLHQscik9PntyKDEyMDIpfSwzOTQ4OihlLHQscik9Pnt2YXIgbj1yKDc4NTQpLGE9cig4MzI0KSxpPXIoODUwOSkscz1yKDY5OTIpLG89cig4ODgwKSxjPXIoNTExMiksbD1jKCJpdGVyYXRvciIpLGg9YygidG9TdHJpbmdUYWciKSx1PXMudmFsdWVzLGQ9ZnVuY3Rpb24oZSx0KXtpZihlKXtpZihlW2xdIT09dSl0cnl7byhlLGwsdSl9Y2F0Y2godCl7ZVtsXT11fWlmKGVbaF18fG8oZSxoLHQpLGFbdF0pZm9yKHZhciByIGluIHMpaWYoZVtyXSE9PXNbcl0pdHJ5e28oZSxyLHNbcl0pfWNhdGNoKHQpe2Vbcl09c1tyXX19fTtmb3IodmFyIGYgaW4gYSlkKG5bZl0mJm5bZl0ucHJvdG90eXBlLGYpO2QoaSwiRE9NVG9rZW5MaXN0Iil9LDc3MTQ6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDQwMzgpLGk9cig1MDA1KSxzPXIoNzI5Myksbz1yKDMwKSxjPXIoOTExNCksbD1yKDMwNzApLmYsaD1yKDgwNTIpLHU9cig3MDQ1KSxkPXIoMjU5NyksZj1yKDU3ODcpLGc9cig5NjcwKSxwPXIoNzc2MiksbT1yKDYyNzcpLGI9cigzNjc4KSx5PXIoMTA2MCksdz1yKDk5MDkpLHY9cig5NzgxKSx4PXIoMTkxMyksUz0iRE9NRXhjZXB0aW9uIixBPSJEQVRBX0NMT05FX0VSUiIsaz1pKCJFcnJvciIpLEM9aShTKXx8ZnVuY3Rpb24oKXt0cnl7KG5ldyhpKCJNZXNzYWdlQ2hhbm5lbCIpfHxhKCJ3b3JrZXJfdGhyZWFkcyIpLk1lc3NhZ2VDaGFubmVsKSkucG9ydDEucG9zdE1lc3NhZ2UobmV3IFdlYWtNYXApfWNhdGNoKGUpe2lmKGUubmFtZT09QSYmMjU9PWUuY29kZSlyZXR1cm4gZS5jb25zdHJ1Y3Rvcn19KCksTz1DJiZDLnByb3RvdHlwZSxGPWsucHJvdG90eXBlLEk9dy5zZXQsVD13LmdldHRlckZvcihTKSxNPSJzdGFjayJpbiBrKFMpLEU9ZnVuY3Rpb24oZSl7cmV0dXJuIGQoYixlKSYmYltlXS5tP2JbZV0uYzowfSxQPWZ1bmN0aW9uKCl7Zih0aGlzLFIpO3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1tKGU8MT92b2lkIDA6YXJndW1lbnRzWzBdKSxyPW0oZTwyP3ZvaWQgMDphcmd1bWVudHNbMV0sIkVycm9yIiksbj1FKHIpO2lmKEkodGhpcyx7dHlwZTpTLG5hbWU6cixtZXNzYWdlOnQsY29kZTpufSksdnx8KHRoaXMubmFtZT1yLHRoaXMubWVzc2FnZT10LHRoaXMuY29kZT1uKSxNKXt2YXIgYT1rKHQpO2EubmFtZT1TLGwodGhpcywic3RhY2siLGMoMSx5KGEuc3RhY2ssMSkpKX19LFI9UC5wcm90b3R5cGU9byhGKSxOPWZ1bmN0aW9uKGUpe3JldHVybntlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZX19LEQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE4oKGZ1bmN0aW9uKCl7cmV0dXJuIFQodGhpcylbZV19KSl9O3YmJih1KFIsImNvZGUiLEQoImNvZGUiKSksdShSLCJtZXNzYWdlIixEKCJtZXNzYWdlIikpLHUoUiwibmFtZSIsRCgibmFtZSIpKSksbChSLCJjb25zdHJ1Y3RvciIsYygxLFApKTt2YXIgQj1zKChmdW5jdGlvbigpe3JldHVybiEobmV3IEMgaW5zdGFuY2VvZiBrKX0pKSxMPUJ8fHMoKGZ1bmN0aW9uKCl7cmV0dXJuIEYudG9TdHJpbmchPT1wfHwiMjogMSIhPT1TdHJpbmcobmV3IEMoMSwyKSl9KSksXz1CfHxzKChmdW5jdGlvbigpe3JldHVybiAyNSE9PW5ldyBDKDEsIkRhdGFDbG9uZUVycm9yIikuY29kZX0pKSxqPUJ8fDI1IT09Q1tBXXx8MjUhPT1PW0FdLFU9eD9MfHxffHxqOkI7bih7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGZvcmNlZDpVfSx7RE9NRXhjZXB0aW9uOlU/UDpDfSk7dmFyICQ9aShTKSxYPSQucHJvdG90eXBlO2Zvcih2YXIgSCBpbiBMJiYoeHx8Qz09PSQpJiZoKFgsInRvU3RyaW5nIixwKSxfJiZ2JiZDPT09JCYmdShYLCJjb2RlIixOKChmdW5jdGlvbigpe3JldHVybiBFKGcodGhpcykubmFtZSl9KSkpLGIpaWYoZChiLEgpKXt2YXIgcT1iW0hdLHo9cS5zLEc9Yyg2LHEuYyk7ZCgkLHopfHxsKCQseixHKSxkKFgseil8fGwoWCx6LEcpfX0sMjgwMTooZSx0LHIpPT57dmFyIG49cigyMTA5KSxhPXIoNzg1NCksaT1yKDUwMDUpLHM9cig5MTE0KSxvPXIoMzA3MCkuZixjPXIoMjU5NyksbD1yKDU3ODcpLGg9cig5NTg3KSx1PXIoNjI3NyksZD1yKDM2NzgpLGY9cigxMDYwKSxnPXIoOTc4MSkscD1yKDE5MTMpLG09IkRPTUV4Y2VwdGlvbiIsYj1pKCJFcnJvciIpLHk9aShtKSx3PWZ1bmN0aW9uKCl7bCh0aGlzLHYpO3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD11KGU8MT92b2lkIDA6YXJndW1lbnRzWzBdKSxyPXUoZTwyP3ZvaWQgMDphcmd1bWVudHNbMV0sIkVycm9yIiksbj1uZXcgeSh0LHIpLGE9Yih0KTtyZXR1cm4gYS5uYW1lPW0sbyhuLCJzdGFjayIscygxLGYoYS5zdGFjaywxKSkpLGgobix0aGlzLHcpLG59LHY9dy5wcm90b3R5cGU9eS5wcm90b3R5cGUseD0ic3RhY2siaW4gYihtKSxTPSJzdGFjayJpbiBuZXcgeSgxLDIpLEE9eSYmZyYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLG0pLGs9ISghQXx8QS53cml0YWJsZSYmQS5jb25maWd1cmFibGUpLEM9eCYmIWsmJiFTO24oe2dsb2JhbDohMCxjb25zdHJ1Y3RvcjohMCxmb3JjZWQ6cHx8Q30se0RPTUV4Y2VwdGlvbjpDP3c6eX0pO3ZhciBPPWkobSksRj1PLnByb3RvdHlwZTtpZihGLmNvbnN0cnVjdG9yIT09Tylmb3IodmFyIEkgaW4gcHx8byhGLCJjb25zdHJ1Y3RvciIscygxLE8pKSxkKWlmKGMoZCxJKSl7dmFyIFQ9ZFtJXSxNPVQucztjKE8sTSl8fG8oTyxNLHMoNixULmMpKX19LDExNzQ6KGUsdCxyKT0+e3ZhciBuPXIoNTAwNSksYT0iRE9NRXhjZXB0aW9uIjtyKDgwMDMpKG4oYSksYSl9LDE1NTA6KGUsdCxyKT0+e3ZhciBuPXIoMjEwOSksYT1yKDc4NTQpLGk9cig3MDQ1KSxzPXIoOTc4MSksbz1UeXBlRXJyb3IsYz1PYmplY3QuZGVmaW5lUHJvcGVydHksbD1hLnNlbGYhPT1hO3RyeXtpZihzKXt2YXIgaD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsInNlbGYiKTshbCYmaCYmaC5nZXQmJmguZW51bWVyYWJsZXx8aShhLCJzZWxmIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldDpmdW5jdGlvbihlKXtpZih0aGlzIT09YSl0aHJvdyBvKCJJbGxlZ2FsIGludm9jYXRpb24iKTtjKGEsInNlbGYiLHt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9ZWxzZSBuKHtnbG9iYWw6ITAsc2ltcGxlOiEwLGZvcmNlZDpsfSx7c2VsZjphfSl9Y2F0Y2goZSl7fX0sNTU1NjooZSx0LHIpPT57cig2OTkyKTt2YXIgbj1yKDIxMDkpLGE9cig3ODU0KSxpPXIoNjkxNikscz1yKDE3MDIpLG89cig5NzgxKSxjPXIoNTE0MyksbD1yKDgwNTIpLGg9cig3MDQ1KSx1PXIoOTE5MCksZD1yKDgwMDMpLGY9cigzMDYxKSxnPXIoOTkwOSkscD1yKDU3ODcpLG09cig2MTQpLGI9cigyNTk3KSx5PXIoOTk3NCksdz1yKDY0OCksdj1yKDk2NzApLHg9cigxMTEpLFM9cigxMzQwKSxBPXIoMzApLGs9cig5MTE0KSxDPXIoNDEyMSksTz1yKDEyNDYpLEY9cig4MDUzKSxJPXIoNTExMiksVD1yKDQzNjIpLE09SSgiaXRlcmF0b3IiKSxFPSJVUkxTZWFyY2hQYXJhbXMiLFA9RSsiSXRlcmF0b3IiLFI9Zy5zZXQsTj1nLmdldHRlckZvcihFKSxEPWcuZ2V0dGVyRm9yKFApLEI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixMPWZ1bmN0aW9uKGUpe2lmKCFvKXJldHVybiBhW2VdO3ZhciB0PUIoYSxlKTtyZXR1cm4gdCYmdC52YWx1ZX0sXz1MKCJmZXRjaCIpLGo9TCgiUmVxdWVzdCIpLFU9TCgiSGVhZGVycyIpLCQ9aiYmai5wcm90b3R5cGUsWD1VJiZVLnByb3RvdHlwZSxIPWEuUmVnRXhwLHE9YS5UeXBlRXJyb3Isej1hLmRlY29kZVVSSUNvbXBvbmVudCxHPWEuZW5jb2RlVVJJQ29tcG9uZW50LFc9cygiIi5jaGFyQXQpLFY9cyhbXS5qb2luKSxLPXMoW10ucHVzaCksWT1zKCIiLnJlcGxhY2UpLEo9cyhbXS5zaGlmdCksWj1zKFtdLnNwbGljZSksUT1zKCIiLnNwbGl0KSxlZT1zKCIiLnNsaWNlKSx0ZT0vXCsvZyxyZT1BcnJheSg0KSxuZT1mdW5jdGlvbihlKXtyZXR1cm4gcmVbZS0xXXx8KHJlW2UtMV09SCgiKCg/OiVbXFxkYS1mXXsyfSl7IitlKyJ9KSIsImdpIikpfSxhZT1mdW5jdGlvbihlKXt0cnl7cmV0dXJuIHooZSl9Y2F0Y2godCl7cmV0dXJuIGV9fSxpZT1mdW5jdGlvbihlKXt2YXIgdD1ZKGUsdGUsIiAiKSxyPTQ7dHJ5e3JldHVybiB6KHQpfWNhdGNoKGUpe2Zvcig7cjspdD1ZKHQsbmUoci0tKSxhZSk7cmV0dXJuIHR9fSxzZT0vWyEnKCl+XXwlMjAvZyxvZT17IiEiOiIlMjEiLCInIjoiJTI3IiwiKCI6IiUyOCIsIikiOiIlMjkiLCJ+IjoiJTdFIiwiJTIwIjoiKyJ9LGNlPWZ1bmN0aW9uKGUpe3JldHVybiBvZVtlXX0sbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIFkoRyhlKSxzZSxjZSl9LGhlPWYoKGZ1bmN0aW9uKGUsdCl7Uih0aGlzLHt0eXBlOlAsaXRlcmF0b3I6QyhOKGUpLmVudHJpZXMpLGtpbmQ6dH0pfSksIkl0ZXJhdG9yIiwoZnVuY3Rpb24oKXt2YXIgZT1EKHRoaXMpLHQ9ZS5raW5kLHI9ZS5pdGVyYXRvci5uZXh0KCksbj1yLnZhbHVlO3JldHVybiByLmRvbmV8fChyLnZhbHVlPSJrZXlzIj09PXQ/bi5rZXk6InZhbHVlcyI9PT10P24udmFsdWU6W24ua2V5LG4udmFsdWVdKSxyfSksITApLHVlPWZ1bmN0aW9uKGUpe3RoaXMuZW50cmllcz1bXSx0aGlzLnVybD1udWxsLHZvaWQgMCE9PWUmJih4KGUpP3RoaXMucGFyc2VPYmplY3QoZSk6dGhpcy5wYXJzZVF1ZXJ5KCJzdHJpbmciPT10eXBlb2YgZT8iPyI9PT1XKGUsMCk/ZWUoZSwxKTplOlMoZSkpKX07dWUucHJvdG90eXBlPXt0eXBlOkUsYmluZFVSTDpmdW5jdGlvbihlKXt0aGlzLnVybD1lLHRoaXMudXBkYXRlKCl9LHBhcnNlT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLHMsbyxjLGw9TyhlKTtpZihsKWZvcihyPSh0PUMoZSxsKSkubmV4dDshKG49aShyLHQpKS5kb25lOyl7aWYocz0oYT1DKHYobi52YWx1ZSkpKS5uZXh0LChvPWkocyxhKSkuZG9uZXx8KGM9aShzLGEpKS5kb25lfHwhaShzLGEpLmRvbmUpdGhyb3cgcSgiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO0sodGhpcy5lbnRyaWVzLHtrZXk6UyhvLnZhbHVlKSx2YWx1ZTpTKGMudmFsdWUpfSl9ZWxzZSBmb3IodmFyIGggaW4gZSliKGUsaCkmJksodGhpcy5lbnRyaWVzLHtrZXk6aCx2YWx1ZTpTKGVbaF0pfSl9LHBhcnNlUXVlcnk6ZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIHQscixuPVEoZSwiJiIpLGE9MDthPG4ubGVuZ3RoOykodD1uW2ErK10pLmxlbmd0aCYmKHI9USh0LCI9IiksSyh0aGlzLmVudHJpZXMse2tleTppZShKKHIpKSx2YWx1ZTppZShWKHIsIj0iKSl9KSl9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PXRoaXMuZW50cmllcyxyPVtdLG49MDtuPHQubGVuZ3RoOyllPXRbbisrXSxLKHIsbGUoZS5rZXkpKyI9IitsZShlLnZhbHVlKSk7cmV0dXJuIFYociwiJiIpfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLmVudHJpZXMubGVuZ3RoPTAsdGhpcy5wYXJzZVF1ZXJ5KHRoaXMudXJsLnF1ZXJ5KX0sdXBkYXRlVVJMOmZ1bmN0aW9uKCl7dGhpcy51cmwmJnRoaXMudXJsLnVwZGF0ZSgpfX07dmFyIGRlPWZ1bmN0aW9uKCl7cCh0aGlzLGZlKTt2YXIgZT1SKHRoaXMsbmV3IHVlKGFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwKSk7b3x8KHRoaXMuc2l6ZT1lLmVudHJpZXMubGVuZ3RoKX0sZmU9ZGUucHJvdG90eXBlO2lmKHUoZmUse2FwcGVuZDpmdW5jdGlvbihlLHQpe3ZhciByPU4odGhpcyk7Rihhcmd1bWVudHMubGVuZ3RoLDIpLEsoci5lbnRyaWVzLHtrZXk6UyhlKSx2YWx1ZTpTKHQpfSksb3x8dGhpcy5sZW5ndGgrKyxyLnVwZGF0ZVVSTCgpfSxkZWxldGU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU4odGhpcykscj1GKGFyZ3VtZW50cy5sZW5ndGgsMSksbj10LmVudHJpZXMsYT1TKGUpLGk9cjwyP3ZvaWQgMDphcmd1bWVudHNbMV0scz12b2lkIDA9PT1pP2k6UyhpKSxjPTA7YzxuLmxlbmd0aDspe3ZhciBsPW5bY107aWYobC5rZXkhPT1hfHx2b2lkIDAhPT1zJiZsLnZhbHVlIT09cyljKys7ZWxzZSBpZihaKG4sYywxKSx2b2lkIDAhPT1zKWJyZWFrfW98fCh0aGlzLnNpemU9bi5sZW5ndGgpLHQudXBkYXRlVVJMKCl9LGdldDpmdW5jdGlvbihlKXt2YXIgdD1OKHRoaXMpLmVudHJpZXM7Rihhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1TKGUpLG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dLmtleT09PXIpcmV0dXJuIHRbbl0udmFsdWU7cmV0dXJuIG51bGx9LGdldEFsbDpmdW5jdGlvbihlKXt2YXIgdD1OKHRoaXMpLmVudHJpZXM7Rihhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1TKGUpLG49W10sYT0wO2E8dC5sZW5ndGg7YSsrKXRbYV0ua2V5PT09ciYmSyhuLHRbYV0udmFsdWUpO3JldHVybiBufSxoYXM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU4odGhpcykuZW50cmllcyxyPUYoYXJndW1lbnRzLmxlbmd0aCwxKSxuPVMoZSksYT1yPDI/dm9pZCAwOmFyZ3VtZW50c1sxXSxpPXZvaWQgMD09PWE/YTpTKGEpLHM9MDtzPHQubGVuZ3RoOyl7dmFyIG89dFtzKytdO2lmKG8ua2V5PT09biYmKHZvaWQgMD09PWl8fG8udmFsdWU9PT1pKSlyZXR1cm4hMH1yZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIHI9Tih0aGlzKTtGKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBuLGE9ci5lbnRyaWVzLGk9ITEscz1TKGUpLGM9Uyh0KSxsPTA7bDxhLmxlbmd0aDtsKyspKG49YVtsXSkua2V5PT09cyYmKGk/WihhLGwtLSwxKTooaT0hMCxuLnZhbHVlPWMpKTtpfHxLKGEse2tleTpzLHZhbHVlOmN9KSxvfHwodGhpcy5zaXplPWEubGVuZ3RoKSxyLnVwZGF0ZVVSTCgpfSxzb3J0OmZ1bmN0aW9uKCl7dmFyIGU9Tih0aGlzKTtUKGUuZW50cmllcywoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5rZXk+dC5rZXk/MTotMX0pKSxlLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPU4odGhpcykuZW50cmllcyxuPXkoZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCksYT0wO2E8ci5sZW5ndGg7KW4oKHQ9clthKytdKS52YWx1ZSx0LmtleSx0aGlzKX0sa2V5czpmdW5jdGlvbigpe3JldHVybiBuZXcgaGUodGhpcywia2V5cyIpfSx2YWx1ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGhlKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBoZSh0aGlzLCJlbnRyaWVzIil9fSx7ZW51bWVyYWJsZTohMH0pLGwoZmUsTSxmZS5lbnRyaWVzLHtuYW1lOiJlbnRyaWVzIn0pLGwoZmUsInRvU3RyaW5nIiwoZnVuY3Rpb24oKXtyZXR1cm4gTih0aGlzKS5zZXJpYWxpemUoKX0pLHtlbnVtZXJhYmxlOiEwfSksbyYmaChmZSwic2l6ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBOKHRoaXMpLmVudHJpZXMubGVuZ3RofSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pLGQoZGUsRSksbih7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGZvcmNlZDohY30se1VSTFNlYXJjaFBhcmFtczpkZX0pLCFjJiZtKFUpKXt2YXIgZ2U9cyhYLmhhcykscGU9cyhYLnNldCksbWU9ZnVuY3Rpb24oZSl7aWYoeChlKSl7dmFyIHQscj1lLmJvZHk7aWYodyhyKT09PUUpcmV0dXJuIHQ9ZS5oZWFkZXJzP25ldyBVKGUuaGVhZGVycyk6bmV3IFUsZ2UodCwiY29udGVudC10eXBlIil8fHBlKHQsImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IiksQShlLHtib2R5OmsoMCxTKHIpKSxoZWFkZXJzOmsoMCx0KX0pfXJldHVybiBlfTtpZihtKF8pJiZuKHtnbG9iYWw6ITAsZW51bWVyYWJsZTohMCxkb250Q2FsbEdldFNldDohMCxmb3JjZWQ6ITB9LHtmZXRjaDpmdW5jdGlvbihlKXtyZXR1cm4gXyhlLGFyZ3VtZW50cy5sZW5ndGg+MT9tZShhcmd1bWVudHNbMV0pOnt9KX19KSxtKGopKXt2YXIgYmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHAodGhpcywkKSxuZXcgaihlLGFyZ3VtZW50cy5sZW5ndGg+MT9tZShhcmd1bWVudHNbMV0pOnt9KX07JC5jb25zdHJ1Y3Rvcj1iZSxiZS5wcm90b3R5cGU9JCxuKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZG9udENhbGxHZXRTZXQ6ITAsZm9yY2VkOiEwfSx7UmVxdWVzdDpiZX0pfX1lLmV4cG9ydHM9e1VSTFNlYXJjaFBhcmFtczpkZSxnZXRTdGF0ZTpOfX0sNjIyOTooZSx0LHIpPT57dmFyIG49cig4MDUyKSxhPXIoMTcwMiksaT1yKDEzNDApLHM9cig4MDUzKSxvPVVSTFNlYXJjaFBhcmFtcyxjPW8ucHJvdG90eXBlLGw9YShjLmFwcGVuZCksaD1hKGMuZGVsZXRlKSx1PWEoYy5mb3JFYWNoKSxkPWEoW10ucHVzaCksZj1uZXcgbygiYT0xJmE9MiZiPTMiKTtmLmRlbGV0ZSgiYSIsMSksZi5kZWxldGUoImIiLHZvaWQgMCksZisiIiE9ImE9MiImJm4oYywiZGVsZXRlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPXQ8Mj92b2lkIDA6YXJndW1lbnRzWzFdO2lmKHQmJnZvaWQgMD09PXIpcmV0dXJuIGgodGhpcyxlKTt2YXIgbj1bXTt1KHRoaXMsKGZ1bmN0aW9uKGUsdCl7ZChuLHtrZXk6dCx2YWx1ZTplfSl9KSkscyh0LDEpO2Zvcih2YXIgYSxvPWkoZSksYz1pKHIpLGY9MCxnPTAscD0hMSxtPW4ubGVuZ3RoO2Y8bTspYT1uW2YrK10scHx8YS5rZXk9PT1vPyhwPSEwLGgodGhpcyxhLmtleSkpOmcrKztmb3IoO2c8bTspKGE9bltnKytdKS5rZXk9PT1vJiZhLnZhbHVlPT09Y3x8bCh0aGlzLGEua2V5LGEudmFsdWUpfSkse2VudW1lcmFibGU6ITAsdW5zYWZlOiEwfSl9LDczMzA6KGUsdCxyKT0+e3ZhciBuPXIoODA1MiksYT1yKDE3MDIpLGk9cigxMzQwKSxzPXIoODA1Myksbz1VUkxTZWFyY2hQYXJhbXMsYz1vLnByb3RvdHlwZSxsPWEoYy5nZXRBbGwpLGg9YShjLmhhcyksdT1uZXcgbygiYT0xIik7IXUuaGFzKCJhIiwyKSYmdS5oYXMoImEiLHZvaWQgMCl8fG4oYywiaGFzIiwoZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPXQ8Mj92b2lkIDA6YXJndW1lbnRzWzFdO2lmKHQmJnZvaWQgMD09PXIpcmV0dXJuIGgodGhpcyxlKTt2YXIgbj1sKHRoaXMsZSk7cyh0LDEpO2Zvcih2YXIgYT1pKHIpLG89MDtvPG4ubGVuZ3RoOylpZihuW28rK109PT1hKXJldHVybiEwO3JldHVybiExfSkse2VudW1lcmFibGU6ITAsdW5zYWZlOiEwfSl9LDE2Mzc6KGUsdCxyKT0+e3IoNTU1Nil9LDIwNjI6KGUsdCxyKT0+e3ZhciBuPXIoOTc4MSksYT1yKDE3MDIpLGk9cig3MDQ1KSxzPVVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUsbz1hKHMuZm9yRWFjaCk7biYmISgic2l6ZSJpbiBzKSYmaShzLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gbyh0aGlzLChmdW5jdGlvbigpe2UrK30pKSxlfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pfSw4Nzg5OihlLHQscik9PntyKDg3ODMpO3ZhciBuLGE9cigyMTA5KSxpPXIoOTc4MSkscz1yKDUxNDMpLG89cig3ODU0KSxjPXIoOTk3NCksbD1yKDE3MDIpLGg9cig4MDUyKSx1PXIoNzA0NSksZD1yKDU3ODcpLGY9cigyNTk3KSxnPXIoMTU3NCkscD1yKDg0NTcpLG09cigxNTg5KSxiPXIoODcxMCkuY29kZUF0LHk9cigzMTk3KSx3PXIoMTM0MCksdj1yKDgwMDMpLHg9cig4MDUzKSxTPXIoNTU1NiksQT1yKDk5MDkpLGs9QS5zZXQsQz1BLmdldHRlckZvcigiVVJMIiksTz1TLlVSTFNlYXJjaFBhcmFtcyxGPVMuZ2V0U3RhdGUsST1vLlVSTCxUPW8uVHlwZUVycm9yLE09by5wYXJzZUludCxFPU1hdGguZmxvb3IsUD1NYXRoLnBvdyxSPWwoIiIuY2hhckF0KSxOPWwoLy4vLmV4ZWMpLEQ9bChbXS5qb2luKSxCPWwoMS4udG9TdHJpbmcpLEw9bChbXS5wb3ApLF89bChbXS5wdXNoKSxqPWwoIiIucmVwbGFjZSksVT1sKFtdLnNoaWZ0KSwkPWwoIiIuc3BsaXQpLFg9bCgiIi5zbGljZSksSD1sKCIiLnRvTG93ZXJDYXNlKSxxPWwoW10udW5zaGlmdCksej0iSW52YWxpZCBzY2hlbWUiLEc9IkludmFsaWQgaG9zdCIsVz0iSW52YWxpZCBwb3J0IixWPS9bYS16XS9pLEs9L1tcZCstLmEtel0vaSxZPS9cZC8sSj0vXjB4L2ksWj0vXlswLTddKyQvLFE9L15cZCskLyxlZT0vXltcZGEtZl0rJC9pLHRlPS9bXDBcdFxuXHIgIyUvOjw+P0BbXFxcXV58XS8scmU9L1tcMFx0XG5cciAjLzo8Pj9AW1xcXF1efF0vLG5lPS9eW1x1MDAwMC1cdTAwMjBdKy8sYWU9LyhefFteXHUwMDAwLVx1MDAyMF0pW1x1MDAwMC1cdTAwMjBdKyQvLGllPS9bXHRcblxyXS9nLHNlPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7Zm9yKHQ9W10scj0wO3I8NDtyKyspcSh0LGUlMjU2KSxlPUUoZS8yNTYpO3JldHVybiBEKHQsIi4iKX1pZigib2JqZWN0Ij09dHlwZW9mIGUpe2Zvcih0PSIiLG49ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW51bGwscj0xLG49bnVsbCxhPTAsaT0wO2k8ODtpKyspMCE9PWVbaV0/KGE+ciYmKHQ9bixyPWEpLG49bnVsbCxhPTApOihudWxsPT09biYmKG49aSksKythKTtyZXR1cm4gYT5yJiYodD1uLHI9YSksdH0oZSkscj0wO3I8ODtyKyspYSYmMD09PWVbcl18fChhJiYoYT0hMSksbj09PXI/KHQrPXI/IjoiOiI6OiIsYT0hMCk6KHQrPUIoZVtyXSwxNikscjw3JiYodCs9IjoiKSkpO3JldHVybiJbIit0KyJdIn1yZXR1cm4gZX0sb2U9e30sY2U9Zyh7fSxvZSx7IiAiOjEsJyInOjEsIjwiOjEsIj4iOjEsImAiOjF9KSxsZT1nKHt9LGNlLHsiIyI6MSwiPyI6MSwieyI6MSwifSI6MX0pLGhlPWcoe30sbGUseyIvIjoxLCI6IjoxLCI7IjoxLCI9IjoxLCJAIjoxLCJbIjoxLCJcXCI6MSwiXSI6MSwiXiI6MSwifCI6MX0pLHVlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9YihlLDApO3JldHVybiByPjMyJiZyPDEyNyYmIWYodCxlKT9lOmVuY29kZVVSSUNvbXBvbmVudChlKX0sZGU9e2Z0cDoyMSxmaWxlOm51bGwsaHR0cDo4MCxodHRwczo0NDMsd3M6ODAsd3NzOjQ0M30sZmU9ZnVuY3Rpb24oZSx0KXt2YXIgcjtyZXR1cm4gMj09ZS5sZW5ndGgmJk4oVixSKGUsMCkpJiYoIjoiPT0ocj1SKGUsMSkpfHwhdCYmInwiPT1yKX0sZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUubGVuZ3RoPjEmJmZlKFgoZSwwLDIpKSYmKDI9PWUubGVuZ3RofHwiLyI9PT0odD1SKGUsMikpfHwiXFwiPT09dHx8Ij8iPT09dHx8IiMiPT09dCl9LHBlPWZ1bmN0aW9uKGUpe3JldHVybiIuIj09PWV8fCIlMmUiPT09SChlKX0sbWU9e30sYmU9e30seWU9e30sd2U9e30sdmU9e30seGU9e30sU2U9e30sQWU9e30sa2U9e30sQ2U9e30sT2U9e30sRmU9e30sSWU9e30sVGU9e30sTWU9e30sRWU9e30sUGU9e30sUmU9e30sTmU9e30sRGU9e30sQmU9e30sTGU9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGEsaSxzPXcoZSk7aWYodCl7aWYoYT10aGlzLnBhcnNlKHMpKXRocm93IFQoYSk7dGhpcy5zZWFyY2hQYXJhbXM9bnVsbH1lbHNle2lmKHZvaWQgMCE9PXImJihuPW5ldyBMZShyLCEwKSksYT10aGlzLnBhcnNlKHMsbnVsbCxuKSl0aHJvdyBUKGEpOyhpPUYobmV3IE8pKS5iaW5kVVJMKHRoaXMpLHRoaXMuc2VhcmNoUGFyYW1zPWl9fTtMZS5wcm90b3R5cGU9e3R5cGU6IlVSTCIscGFyc2U6ZnVuY3Rpb24oZSx0LHIpe3ZhciBhLGkscyxvLGMsbD10aGlzLGg9dHx8bWUsdT0wLGQ9IiIsZz0hMSxiPSExLHk9ITE7Zm9yKGU9dyhlKSx0fHwobC5zY2hlbWU9IiIsbC51c2VybmFtZT0iIixsLnBhc3N3b3JkPSIiLGwuaG9zdD1udWxsLGwucG9ydD1udWxsLGwucGF0aD1bXSxsLnF1ZXJ5PW51bGwsbC5mcmFnbWVudD1udWxsLGwuY2Fubm90QmVBQmFzZVVSTD0hMSxlPWooZSxuZSwiIiksZT1qKGUsYWUsIiQxIikpLGU9aihlLGllLCIiKSxhPXAoZSk7dTw9YS5sZW5ndGg7KXtzd2l0Y2goaT1hW3VdLGgpe2Nhc2UgbWU6aWYoIWl8fCFOKFYsaSkpe2lmKHQpcmV0dXJuIHo7aD15ZTtjb250aW51ZX1kKz1IKGkpLGg9YmU7YnJlYWs7Y2FzZSBiZTppZihpJiYoTihLLGkpfHwiKyI9PWl8fCItIj09aXx8Ii4iPT1pKSlkKz1IKGkpO2Vsc2V7aWYoIjoiIT1pKXtpZih0KXJldHVybiB6O2Q9IiIsaD15ZSx1PTA7Y29udGludWV9aWYodCYmKGwuaXNTcGVjaWFsKCkhPWYoZGUsZCl8fCJmaWxlIj09ZCYmKGwuaW5jbHVkZXNDcmVkZW50aWFscygpfHxudWxsIT09bC5wb3J0KXx8ImZpbGUiPT1sLnNjaGVtZSYmIWwuaG9zdCkpcmV0dXJuO2lmKGwuc2NoZW1lPWQsdClyZXR1cm4gdm9pZChsLmlzU3BlY2lhbCgpJiZkZVtsLnNjaGVtZV09PWwucG9ydCYmKGwucG9ydD1udWxsKSk7ZD0iIiwiZmlsZSI9PWwuc2NoZW1lP2g9VGU6bC5pc1NwZWNpYWwoKSYmciYmci5zY2hlbWU9PWwuc2NoZW1lP2g9d2U6bC5pc1NwZWNpYWwoKT9oPUFlOiIvIj09YVt1KzFdPyhoPXZlLHUrKyk6KGwuY2Fubm90QmVBQmFzZVVSTD0hMCxfKGwucGF0aCwiIiksaD1OZSl9YnJlYWs7Y2FzZSB5ZTppZighcnx8ci5jYW5ub3RCZUFCYXNlVVJMJiYiIyIhPWkpcmV0dXJuIHo7aWYoci5jYW5ub3RCZUFCYXNlVVJMJiYiIyI9PWkpe2wuc2NoZW1lPXIuc2NoZW1lLGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT1yLnF1ZXJ5LGwuZnJhZ21lbnQ9IiIsbC5jYW5ub3RCZUFCYXNlVVJMPSEwLGg9QmU7YnJlYWt9aD0iZmlsZSI9PXIuc2NoZW1lP1RlOnhlO2NvbnRpbnVlO2Nhc2Ugd2U6aWYoIi8iIT1pfHwiLyIhPWFbdSsxXSl7aD14ZTtjb250aW51ZX1oPWtlLHUrKzticmVhaztjYXNlIHZlOmlmKCIvIj09aSl7aD1DZTticmVha31oPVJlO2NvbnRpbnVlO2Nhc2UgeGU6aWYobC5zY2hlbWU9ci5zY2hlbWUsaT09bilsLnVzZXJuYW1lPXIudXNlcm5hbWUsbC5wYXNzd29yZD1yLnBhc3N3b3JkLGwuaG9zdD1yLmhvc3QsbC5wb3J0PXIucG9ydCxsLnBhdGg9bShyLnBhdGgpLGwucXVlcnk9ci5xdWVyeTtlbHNlIGlmKCIvIj09aXx8IlxcIj09aSYmbC5pc1NwZWNpYWwoKSloPVNlO2Vsc2UgaWYoIj8iPT1pKWwudXNlcm5hbWU9ci51c2VybmFtZSxsLnBhc3N3b3JkPXIucGFzc3dvcmQsbC5ob3N0PXIuaG9zdCxsLnBvcnQ9ci5wb3J0LGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT0iIixoPURlO2Vsc2V7aWYoIiMiIT1pKXtsLnVzZXJuYW1lPXIudXNlcm5hbWUsbC5wYXNzd29yZD1yLnBhc3N3b3JkLGwuaG9zdD1yLmhvc3QsbC5wb3J0PXIucG9ydCxsLnBhdGg9bShyLnBhdGgpLGwucGF0aC5sZW5ndGgtLSxoPVJlO2NvbnRpbnVlfWwudXNlcm5hbWU9ci51c2VybmFtZSxsLnBhc3N3b3JkPXIucGFzc3dvcmQsbC5ob3N0PXIuaG9zdCxsLnBvcnQ9ci5wb3J0LGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT1yLnF1ZXJ5LGwuZnJhZ21lbnQ9IiIsaD1CZX1icmVhaztjYXNlIFNlOmlmKCFsLmlzU3BlY2lhbCgpfHwiLyIhPWkmJiJcXCIhPWkpe2lmKCIvIiE9aSl7bC51c2VybmFtZT1yLnVzZXJuYW1lLGwucGFzc3dvcmQ9ci5wYXNzd29yZCxsLmhvc3Q9ci5ob3N0LGwucG9ydD1yLnBvcnQsaD1SZTtjb250aW51ZX1oPUNlfWVsc2UgaD1rZTticmVhaztjYXNlIEFlOmlmKGg9a2UsIi8iIT1pfHwiLyIhPVIoZCx1KzEpKWNvbnRpbnVlO3UrKzticmVhaztjYXNlIGtlOmlmKCIvIiE9aSYmIlxcIiE9aSl7aD1DZTtjb250aW51ZX1icmVhaztjYXNlIENlOmlmKCJAIj09aSl7ZyYmKGQ9IiU0MCIrZCksZz0hMCxzPXAoZCk7Zm9yKHZhciB2PTA7djxzLmxlbmd0aDt2Kyspe3ZhciB4PXNbdl07aWYoIjoiIT14fHx5KXt2YXIgUz11ZSh4LGhlKTt5P2wucGFzc3dvcmQrPVM6bC51c2VybmFtZSs9U31lbHNlIHk9ITB9ZD0iIn1lbHNlIGlmKGk9PW58fCIvIj09aXx8Ij8iPT1pfHwiIyI9PWl8fCJcXCI9PWkmJmwuaXNTcGVjaWFsKCkpe2lmKGcmJiIiPT1kKXJldHVybiJJbnZhbGlkIGF1dGhvcml0eSI7dS09cChkKS5sZW5ndGgrMSxkPSIiLGg9T2V9ZWxzZSBkKz1pO2JyZWFrO2Nhc2UgT2U6Y2FzZSBGZTppZih0JiYiZmlsZSI9PWwuc2NoZW1lKXtoPUVlO2NvbnRpbnVlfWlmKCI6IiE9aXx8Yil7aWYoaT09bnx8Ii8iPT1pfHwiPyI9PWl8fCIjIj09aXx8IlxcIj09aSYmbC5pc1NwZWNpYWwoKSl7aWYobC5pc1NwZWNpYWwoKSYmIiI9PWQpcmV0dXJuIEc7aWYodCYmIiI9PWQmJihsLmluY2x1ZGVzQ3JlZGVudGlhbHMoKXx8bnVsbCE9PWwucG9ydCkpcmV0dXJuO2lmKG89bC5wYXJzZUhvc3QoZCkpcmV0dXJuIG87aWYoZD0iIixoPVBlLHQpcmV0dXJuO2NvbnRpbnVlfSJbIj09aT9iPSEwOiJdIj09aSYmKGI9ITEpLGQrPWl9ZWxzZXtpZigiIj09ZClyZXR1cm4gRztpZihvPWwucGFyc2VIb3N0KGQpKXJldHVybiBvO2lmKGQ9IiIsaD1JZSx0PT1GZSlyZXR1cm59YnJlYWs7Y2FzZSBJZTppZighTihZLGkpKXtpZihpPT1ufHwiLyI9PWl8fCI/Ij09aXx8IiMiPT1pfHwiXFwiPT1pJiZsLmlzU3BlY2lhbCgpfHx0KXtpZigiIiE9ZCl7dmFyIEE9TShkLDEwKTtpZihBPjY1NTM1KXJldHVybiBXO2wucG9ydD1sLmlzU3BlY2lhbCgpJiZBPT09ZGVbbC5zY2hlbWVdP251bGw6QSxkPSIifWlmKHQpcmV0dXJuO2g9UGU7Y29udGludWV9cmV0dXJuIFd9ZCs9aTticmVhaztjYXNlIFRlOmlmKGwuc2NoZW1lPSJmaWxlIiwiLyI9PWl8fCJcXCI9PWkpaD1NZTtlbHNle2lmKCFyfHwiZmlsZSIhPXIuc2NoZW1lKXtoPVJlO2NvbnRpbnVlfWlmKGk9PW4pbC5ob3N0PXIuaG9zdCxsLnBhdGg9bShyLnBhdGgpLGwucXVlcnk9ci5xdWVyeTtlbHNlIGlmKCI/Ij09aSlsLmhvc3Q9ci5ob3N0LGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT0iIixoPURlO2Vsc2V7aWYoIiMiIT1pKXtnZShEKG0oYSx1KSwiIikpfHwobC5ob3N0PXIuaG9zdCxsLnBhdGg9bShyLnBhdGgpLGwuc2hvcnRlblBhdGgoKSksaD1SZTtjb250aW51ZX1sLmhvc3Q9ci5ob3N0LGwucGF0aD1tKHIucGF0aCksbC5xdWVyeT1yLnF1ZXJ5LGwuZnJhZ21lbnQ9IiIsaD1CZX19YnJlYWs7Y2FzZSBNZTppZigiLyI9PWl8fCJcXCI9PWkpe2g9RWU7YnJlYWt9ciYmImZpbGUiPT1yLnNjaGVtZSYmIWdlKEQobShhLHUpLCIiKSkmJihmZShyLnBhdGhbMF0sITApP18obC5wYXRoLHIucGF0aFswXSk6bC5ob3N0PXIuaG9zdCksaD1SZTtjb250aW51ZTtjYXNlIEVlOmlmKGk9PW58fCIvIj09aXx8IlxcIj09aXx8Ij8iPT1pfHwiIyI9PWkpe2lmKCF0JiZmZShkKSloPVJlO2Vsc2UgaWYoIiI9PWQpe2lmKGwuaG9zdD0iIix0KXJldHVybjtoPVBlfWVsc2V7aWYobz1sLnBhcnNlSG9zdChkKSlyZXR1cm4gbztpZigibG9jYWxob3N0Ij09bC5ob3N0JiYobC5ob3N0PSIiKSx0KXJldHVybjtkPSIiLGg9UGV9Y29udGludWV9ZCs9aTticmVhaztjYXNlIFBlOmlmKGwuaXNTcGVjaWFsKCkpe2lmKGg9UmUsIi8iIT1pJiYiXFwiIT1pKWNvbnRpbnVlfWVsc2UgaWYodHx8Ij8iIT1pKWlmKHR8fCIjIiE9aSl7aWYoaSE9biYmKGg9UmUsIi8iIT1pKSljb250aW51ZX1lbHNlIGwuZnJhZ21lbnQ9IiIsaD1CZTtlbHNlIGwucXVlcnk9IiIsaD1EZTticmVhaztjYXNlIFJlOmlmKGk9PW58fCIvIj09aXx8IlxcIj09aSYmbC5pc1NwZWNpYWwoKXx8IXQmJigiPyI9PWl8fCIjIj09aSkpe2lmKCIuLiI9PT0oYz1IKGM9ZCkpfHwiJTJlLiI9PT1jfHwiLiUyZSI9PT1jfHwiJTJlJTJlIj09PWM/KGwuc2hvcnRlblBhdGgoKSwiLyI9PWl8fCJcXCI9PWkmJmwuaXNTcGVjaWFsKCl8fF8obC5wYXRoLCIiKSk6cGUoZCk/Ii8iPT1pfHwiXFwiPT1pJiZsLmlzU3BlY2lhbCgpfHxfKGwucGF0aCwiIik6KCJmaWxlIj09bC5zY2hlbWUmJiFsLnBhdGgubGVuZ3RoJiZmZShkKSYmKGwuaG9zdCYmKGwuaG9zdD0iIiksZD1SKGQsMCkrIjoiKSxfKGwucGF0aCxkKSksZD0iIiwiZmlsZSI9PWwuc2NoZW1lJiYoaT09bnx8Ij8iPT1pfHwiIyI9PWkpKWZvcig7bC5wYXRoLmxlbmd0aD4xJiYiIj09PWwucGF0aFswXTspVShsLnBhdGgpOyI/Ij09aT8obC5xdWVyeT0iIixoPURlKToiIyI9PWkmJihsLmZyYWdtZW50PSIiLGg9QmUpfWVsc2UgZCs9dWUoaSxsZSk7YnJlYWs7Y2FzZSBOZToiPyI9PWk/KGwucXVlcnk9IiIsaD1EZSk6IiMiPT1pPyhsLmZyYWdtZW50PSIiLGg9QmUpOmkhPW4mJihsLnBhdGhbMF0rPXVlKGksb2UpKTticmVhaztjYXNlIERlOnR8fCIjIiE9aT9pIT1uJiYoIiciPT1pJiZsLmlzU3BlY2lhbCgpP2wucXVlcnkrPSIlMjciOmwucXVlcnkrPSIjIj09aT8iJTIzIjp1ZShpLG9lKSk6KGwuZnJhZ21lbnQ9IiIsaD1CZSk7YnJlYWs7Y2FzZSBCZTppIT1uJiYobC5mcmFnbWVudCs9dWUoaSxjZSkpfXUrK319LHBhcnNlSG9zdDpmdW5jdGlvbihlKXt2YXIgdCxyLG47aWYoIlsiPT1SKGUsMCkpe2lmKCJdIiE9UihlLGUubGVuZ3RoLTEpKXJldHVybiBHO2lmKHQ9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGEsaSxzLG8sYz1bMCwwLDAsMCwwLDAsMCwwXSxsPTAsaD1udWxsLHU9MCxkPWZ1bmN0aW9uKCl7cmV0dXJuIFIoZSx1KX07aWYoIjoiPT1kKCkpe2lmKCI6IiE9UihlLDEpKXJldHVybjt1Kz0yLGg9KytsfWZvcig7ZCgpOyl7aWYoOD09bClyZXR1cm47aWYoIjoiIT1kKCkpe2Zvcih0PXI9MDtyPDQmJk4oZWUsZCgpKTspdD0xNip0K00oZCgpLDE2KSx1KysscisrO2lmKCIuIj09ZCgpKXtpZigwPT1yKXJldHVybjtpZih1LT1yLGw+NilyZXR1cm47Zm9yKG49MDtkKCk7KXtpZihhPW51bGwsbj4wKXtpZighKCIuIj09ZCgpJiZuPDQpKXJldHVybjt1Kyt9aWYoIU4oWSxkKCkpKXJldHVybjtmb3IoO04oWSxkKCkpOyl7aWYoaT1NKGQoKSwxMCksbnVsbD09PWEpYT1pO2Vsc2V7aWYoMD09YSlyZXR1cm47YT0xMCphK2l9aWYoYT4yNTUpcmV0dXJuO3UrK31jW2xdPTI1NipjW2xdK2EsMiE9KytuJiY0IT1ufHxsKyt9aWYoNCE9bilyZXR1cm47YnJlYWt9aWYoIjoiPT1kKCkpe2lmKHUrKywhZCgpKXJldHVybn1lbHNlIGlmKGQoKSlyZXR1cm47Y1tsKytdPXR9ZWxzZXtpZihudWxsIT09aClyZXR1cm47dSsrLGg9KytsfX1pZihudWxsIT09aClmb3Iocz1sLWgsbD03OzAhPWwmJnM+MDspbz1jW2xdLGNbbC0tXT1jW2grcy0xXSxjW2grLS1zXT1vO2Vsc2UgaWYoOCE9bClyZXR1cm47cmV0dXJuIGN9KFgoZSwxLC0xKSksIXQpcmV0dXJuIEc7dGhpcy5ob3N0PXR9ZWxzZSBpZih0aGlzLmlzU3BlY2lhbCgpKXtpZihlPXkoZSksTih0ZSxlKSlyZXR1cm4gRztpZih0PWZ1bmN0aW9uKGUpe3ZhciB0LHIsbixhLGkscyxvLGM9JChlLCIuIik7aWYoYy5sZW5ndGgmJiIiPT1jW2MubGVuZ3RoLTFdJiZjLmxlbmd0aC0tLCh0PWMubGVuZ3RoKT40KXJldHVybiBlO2ZvcihyPVtdLG49MDtuPHQ7bisrKXtpZigiIj09KGE9Y1tuXSkpcmV0dXJuIGU7aWYoaT0xMCxhLmxlbmd0aD4xJiYiMCI9PVIoYSwwKSYmKGk9TihKLGEpPzE2OjgsYT1YKGEsOD09aT8xOjIpKSwiIj09PWEpcz0wO2Vsc2V7aWYoIU4oMTA9PWk/UTo4PT1pP1o6ZWUsYSkpcmV0dXJuIGU7cz1NKGEsaSl9XyhyLHMpfWZvcihuPTA7bjx0O24rKylpZihzPXJbbl0sbj09dC0xKXtpZihzPj1QKDI1Niw1LXQpKXJldHVybiBudWxsfWVsc2UgaWYocz4yNTUpcmV0dXJuIG51bGw7Zm9yKG89TChyKSxuPTA7bjxyLmxlbmd0aDtuKyspbys9cltuXSpQKDI1NiwzLW4pO3JldHVybiBvfShlKSxudWxsPT09dClyZXR1cm4gRzt0aGlzLmhvc3Q9dH1lbHNle2lmKE4ocmUsZSkpcmV0dXJuIEc7Zm9yKHQ9IiIscj1wKGUpLG49MDtuPHIubGVuZ3RoO24rKyl0Kz11ZShyW25dLG9lKTt0aGlzLmhvc3Q9dH19LGNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydDpmdW5jdGlvbigpe3JldHVybiF0aGlzLmhvc3R8fHRoaXMuY2Fubm90QmVBQmFzZVVSTHx8ImZpbGUiPT10aGlzLnNjaGVtZX0saW5jbHVkZXNDcmVkZW50aWFsczpmdW5jdGlvbigpe3JldHVybiIiIT10aGlzLnVzZXJuYW1lfHwiIiE9dGhpcy5wYXNzd29yZH0saXNTcGVjaWFsOmZ1bmN0aW9uKCl7cmV0dXJuIGYoZGUsdGhpcy5zY2hlbWUpfSxzaG9ydGVuUGF0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucGF0aCx0PWUubGVuZ3RoOyF0fHwiZmlsZSI9PXRoaXMuc2NoZW1lJiYxPT10JiZmZShlWzBdLCEwKXx8ZS5sZW5ndGgtLX0sc2VyaWFsaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuc2NoZW1lLHI9ZS51c2VybmFtZSxuPWUucGFzc3dvcmQsYT1lLmhvc3QsaT1lLnBvcnQscz1lLnBhdGgsbz1lLnF1ZXJ5LGM9ZS5mcmFnbWVudCxsPXQrIjoiO3JldHVybiBudWxsIT09YT8obCs9Ii8vIixlLmluY2x1ZGVzQ3JlZGVudGlhbHMoKSYmKGwrPXIrKG4/IjoiK246IiIpKyJAIiksbCs9c2UoYSksbnVsbCE9PWkmJihsKz0iOiIraSkpOiJmaWxlIj09dCYmKGwrPSIvLyIpLGwrPWUuY2Fubm90QmVBQmFzZVVSTD9zWzBdOnMubGVuZ3RoPyIvIitEKHMsIi8iKToiIixudWxsIT09byYmKGwrPSI/IitvKSxudWxsIT09YyYmKGwrPSIjIitjKSxsfSxzZXRIcmVmOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyc2UoZSk7aWYodCl0aHJvdyBUKHQpO3RoaXMuc2VhcmNoUGFyYW1zLnVwZGF0ZSgpfSxnZXRPcmlnaW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNjaGVtZSx0PXRoaXMucG9ydDtpZigiYmxvYiI9PWUpdHJ5e3JldHVybiBuZXcgX2UoZS5wYXRoWzBdKS5vcmlnaW59Y2F0Y2goZSl7cmV0dXJuIm51bGwifXJldHVybiJmaWxlIiE9ZSYmdGhpcy5pc1NwZWNpYWwoKT9lKyI6Ly8iK3NlKHRoaXMuaG9zdCkrKG51bGwhPT10PyI6Iit0OiIiKToibnVsbCJ9LGdldFByb3RvY29sOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2NoZW1lKyI6In0sc2V0UHJvdG9jb2w6ZnVuY3Rpb24oZSl7dGhpcy5wYXJzZSh3KGUpKyI6IixtZSl9LGdldFVzZXJuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXNlcm5hbWV9LHNldFVzZXJuYW1lOmZ1bmN0aW9uKGUpe3ZhciB0PXAodyhlKSk7aWYoIXRoaXMuY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KCkpe3RoaXMudXNlcm5hbWU9IiI7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdGhpcy51c2VybmFtZSs9dWUodFtyXSxoZSl9fSxnZXRQYXNzd29yZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhc3N3b3JkfSxzZXRQYXNzd29yZDpmdW5jdGlvbihlKXt2YXIgdD1wKHcoZSkpO2lmKCF0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpKXt0aGlzLnBhc3N3b3JkPSIiO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRoaXMucGFzc3dvcmQrPXVlKHRbcl0saGUpfX0sZ2V0SG9zdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG9zdCx0PXRoaXMucG9ydDtyZXR1cm4gbnVsbD09PWU/IiI6bnVsbD09PXQ/c2UoZSk6c2UoZSkrIjoiK3R9LHNldEhvc3Q6ZnVuY3Rpb24oZSl7dGhpcy5jYW5ub3RCZUFCYXNlVVJMfHx0aGlzLnBhcnNlKGUsT2UpfSxnZXRIb3N0bmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaG9zdDtyZXR1cm4gbnVsbD09PWU/IiI6c2UoZSl9LHNldEhvc3RuYW1lOmZ1bmN0aW9uKGUpe3RoaXMuY2Fubm90QmVBQmFzZVVSTHx8dGhpcy5wYXJzZShlLEZlKX0sZ2V0UG9ydDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucG9ydDtyZXR1cm4gbnVsbD09PWU/IiI6dyhlKX0sc2V0UG9ydDpmdW5jdGlvbihlKXt0aGlzLmNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydCgpfHwoIiI9PShlPXcoZSkpP3RoaXMucG9ydD1udWxsOnRoaXMucGFyc2UoZSxJZSkpfSxnZXRQYXRobmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucGF0aDtyZXR1cm4gdGhpcy5jYW5ub3RCZUFCYXNlVVJMP2VbMF06ZS5sZW5ndGg/Ii8iK0QoZSwiLyIpOiIifSxzZXRQYXRobmFtZTpmdW5jdGlvbihlKXt0aGlzLmNhbm5vdEJlQUJhc2VVUkx8fCh0aGlzLnBhdGg9W10sdGhpcy5wYXJzZShlLFBlKSl9LGdldFNlYXJjaDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucXVlcnk7cmV0dXJuIGU/Ij8iK2U6IiJ9LHNldFNlYXJjaDpmdW5jdGlvbihlKXsiIj09KGU9dyhlKSk/dGhpcy5xdWVyeT1udWxsOigiPyI9PVIoZSwwKSYmKGU9WChlLDEpKSx0aGlzLnF1ZXJ5PSIiLHRoaXMucGFyc2UoZSxEZSkpLHRoaXMuc2VhcmNoUGFyYW1zLnVwZGF0ZSgpfSxnZXRTZWFyY2hQYXJhbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWFyY2hQYXJhbXMuZmFjYWRlfSxnZXRIYXNoOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5mcmFnbWVudDtyZXR1cm4gZT8iIyIrZToiIn0sc2V0SGFzaDpmdW5jdGlvbihlKXsiIiE9KGU9dyhlKSk/KCIjIj09UihlLDApJiYoZT1YKGUsMSkpLHRoaXMuZnJhZ21lbnQ9IiIsdGhpcy5wYXJzZShlLEJlKSk6dGhpcy5mcmFnbWVudD1udWxsfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLnF1ZXJ5PXRoaXMuc2VhcmNoUGFyYW1zLnNlcmlhbGl6ZSgpfHxudWxsfX07dmFyIF9lPWZ1bmN0aW9uKGUpe3ZhciB0PWQodGhpcyxqZSkscj14KGFyZ3VtZW50cy5sZW5ndGgsMSk+MT9hcmd1bWVudHNbMV06dm9pZCAwLG49ayh0LG5ldyBMZShlLCExLHIpKTtpfHwodC5ocmVmPW4uc2VyaWFsaXplKCksdC5vcmlnaW49bi5nZXRPcmlnaW4oKSx0LnByb3RvY29sPW4uZ2V0UHJvdG9jb2woKSx0LnVzZXJuYW1lPW4uZ2V0VXNlcm5hbWUoKSx0LnBhc3N3b3JkPW4uZ2V0UGFzc3dvcmQoKSx0Lmhvc3Q9bi5nZXRIb3N0KCksdC5ob3N0bmFtZT1uLmdldEhvc3RuYW1lKCksdC5wb3J0PW4uZ2V0UG9ydCgpLHQucGF0aG5hbWU9bi5nZXRQYXRobmFtZSgpLHQuc2VhcmNoPW4uZ2V0U2VhcmNoKCksdC5zZWFyY2hQYXJhbXM9bi5nZXRTZWFyY2hQYXJhbXMoKSx0Lmhhc2g9bi5nZXRIYXNoKCkpfSxqZT1fZS5wcm90b3R5cGUsVWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEModGhpcylbZV0oKX0sc2V0OnQmJmZ1bmN0aW9uKGUpe3JldHVybiBDKHRoaXMpW3RdKGUpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH19O2lmKGkmJih1KGplLCJocmVmIixVZSgic2VyaWFsaXplIiwic2V0SHJlZiIpKSx1KGplLCJvcmlnaW4iLFVlKCJnZXRPcmlnaW4iKSksdShqZSwicHJvdG9jb2wiLFVlKCJnZXRQcm90b2NvbCIsInNldFByb3RvY29sIikpLHUoamUsInVzZXJuYW1lIixVZSgiZ2V0VXNlcm5hbWUiLCJzZXRVc2VybmFtZSIpKSx1KGplLCJwYXNzd29yZCIsVWUoImdldFBhc3N3b3JkIiwic2V0UGFzc3dvcmQiKSksdShqZSwiaG9zdCIsVWUoImdldEhvc3QiLCJzZXRIb3N0IikpLHUoamUsImhvc3RuYW1lIixVZSgiZ2V0SG9zdG5hbWUiLCJzZXRIb3N0bmFtZSIpKSx1KGplLCJwb3J0IixVZSgiZ2V0UG9ydCIsInNldFBvcnQiKSksdShqZSwicGF0aG5hbWUiLFVlKCJnZXRQYXRobmFtZSIsInNldFBhdGhuYW1lIikpLHUoamUsInNlYXJjaCIsVWUoImdldFNlYXJjaCIsInNldFNlYXJjaCIpKSx1KGplLCJzZWFyY2hQYXJhbXMiLFVlKCJnZXRTZWFyY2hQYXJhbXMiKSksdShqZSwiaGFzaCIsVWUoImdldEhhc2giLCJzZXRIYXNoIikpKSxoKGplLCJ0b0pTT04iLChmdW5jdGlvbigpe3JldHVybiBDKHRoaXMpLnNlcmlhbGl6ZSgpfSkse2VudW1lcmFibGU6ITB9KSxoKGplLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIEModGhpcykuc2VyaWFsaXplKCl9KSx7ZW51bWVyYWJsZTohMH0pLEkpe3ZhciAkZT1JLmNyZWF0ZU9iamVjdFVSTCxYZT1JLnJldm9rZU9iamVjdFVSTDskZSYmaChfZSwiY3JlYXRlT2JqZWN0VVJMIixjKCRlLEkpKSxYZSYmaChfZSwicmV2b2tlT2JqZWN0VVJMIixjKFhlLEkpKX12KF9lLCJVUkwiKSxhKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsZm9yY2VkOiFzLHNoYW06IWl9LHtVUkw6X2V9KX0sMjg1OihlLHQscik9PntyKDg3ODkpfX0sdD17fTtmdW5jdGlvbiByKG4pe3ZhciBhPXRbbl07aWYodm9pZCAwIT09YSlyZXR1cm4gYS5leHBvcnRzO3ZhciBpPXRbbl09e2lkOm4sbG9hZGVkOiExLGV4cG9ydHM6e319O3JldHVybiBlW25dLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLHIpLGkubG9hZGVkPSEwLGkuZXhwb3J0c31yLmFtZE89e30sci5uPWU9Pnt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/KCk9PmUuZGVmYXVsdDooKT0+ZTtyZXR1cm4gci5kKHQse2E6dH0pLHR9LHIuZD0oZSx0KT0+e2Zvcih2YXIgbiBpbiB0KXIubyh0LG4pJiYhci5vKGUsbikmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITAsZ2V0OnRbbl19KX0sci5nPWZ1bmN0aW9uKCl7aWYoIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzKXJldHVybiBnbG9iYWxUaGlzO3RyeXtyZXR1cm4gdGhpc3x8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2goZSl7aWYoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cpcmV0dXJuIHdpbmRvd319KCksci5obWQ9ZT0+KChlPU9iamVjdC5jcmVhdGUoZSkpLmNoaWxkcmVufHwoZS5jaGlsZHJlbj1bXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImV4cG9ydHMiLHtlbnVtZXJhYmxlOiEwLHNldDooKT0+e3Rocm93IG5ldyBFcnJvcigiRVMgTW9kdWxlcyBtYXkgbm90IGFzc2lnbiBtb2R1bGUuZXhwb3J0cyBvciBleHBvcnRzLiosIFVzZSBFU00gZXhwb3J0IHN5bnRheCwgaW5zdGVhZDogIitlLmlkKX19KSxlKSxyLm89KGUsdCk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpLHIoNzc1Nyl9KSgpOw=='; \ No newline at end of file