# Name: esq_sectionsort v2.02 # Type: Admin side plugin # Custom sorting of sections and categories # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjE1OiJlc3Ffc2VjdGlvbnNvcnQiO3M6NzoidmVyc2lvbiI7 ZDoyLjAyMDAwMDAwMDAwMDAwMDAxNzc2MzU2ODM5NDAwMjUwNDY0Njc3ODEwNjY4OTQ1MzEy NTtzOjExOiJkZXNjcmlwdGlvbiI7czo0MToiQ3VzdG9tIHNvcnRpbmcgb2Ygc2VjdGlvbnMg YW5kIGNhdGVnb3JpZXMiO3M6NDoidHlwZSI7aTozO3M6NToib3JkZXIiO2k6NTtzOjU6ImZs YWdzIjtpOjM7czo0OiJoZWxwIjtzOjE2MDoiRm9yIGhlbHAgb3IgbW9yZSBpbmZvcm1hdGlv biBvbiA8c3Ryb25nPmVzcV9zZWN0aW9uc29ydDwvc3Ryb25nPiwgcGxlYXNlIHNlZSB0aGUg PGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lk PTM0NjM3Ij5mb3J1bSB0aHJlYWQ8L2E+LiI7czo0OiJjb2RlIjtzOjUxODY4OiIvLzw/cGhw CmlmKEB0eHBpbnRlcmZhY2UgPT0gJ2FkbWluJykgewpyZWdpc3Rlcl9jYWxsYmFjaygnZXNx X3NlY3Rpb25zb3J0X3NlY3Rpb25fanMnLCAnc2VjdGlvbl91aScsICdtdWx0aV9lZGl0X29w dGlvbnMnKTsKcmVnaXN0ZXJfY2FsbGJhY2soJ2VzcV9zZWN0aW9uc29ydF9jYXRlZ29yeV9q cycsICdjYXRlZ29yeV91aScsICdtdWx0aV9lZGl0X29wdGlvbnMnKTsKcmVnaXN0ZXJfY2Fs bGJhY2soJ2VzcV9zZWN0aW9uc29ydF9wcmVmcycsICdwbHVnaW5fcHJlZnMuZXNxX3NlY3Rp b25zb3J0Jyk7CnJlZ2lzdGVyX2NhbGxiYWNrKCdlc3Ffc2VjdGlvbnNvcnRfc2V0dXAnLCAn cGx1Z2luX2xpZmVjeWNsZS5lc3Ffc2VjdGlvbnNvcnQnKTsKYWRkX3ByaXZzKCdwbHVnaW5f cHJlZnMuZXNxX3NlY3Rpb25zb3J0JywnMSwyLDMsNCw1LDYnKTsKfQpmdW5jdGlvbiBlc3Ff c2VjdGlvbnNvcnRfc2VjdGlvbl9qcygpIHsKZWNobyA8PDxFT0IKPHNjcmlwdCBzcmM9Imlu ZGV4LnBocD9ldmVudD1wbHVnaW5fcHJlZnMuZXNxX3NlY3Rpb25zb3J0JnN0ZXA9Z2V0X2pz JmpzPXNvcnRfZWxlbWVudHMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaW5kZXgucGhwP2V2 ZW50PXBsdWdpbl9wcmVmcy5lc3Ffc2VjdGlvbnNvcnQmc3RlcD1nZXRfanMmanM9c29ydGFi bGUiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaW5kZXgucGhwP2V2ZW50PXBsdWdpbl9wcmVm cy5lc3Ffc2VjdGlvbnNvcnQmc3RlcD1nZXRfanMmanM9c2VjdGlvbiI+PC9zY3JpcHQ+Cjxz dHlsZT4KI3NlY3Rpb25fZm9ybSB0Ym9keSB0ciB0ZDpmaXJzdC1jaGlsZCB7CmN1cnNvcjog bW92ZTsKfQo8L3N0eWxlPgpFT0I7Cn0KZnVuY3Rpb24gZXNxX3NlY3Rpb25zb3J0X2NhdGVn b3J5X2pzKCkgewppZiAoZGVmaW5lZCgnZXNxX3NlY3Rpb25zb3J0X3NlY3Rpb25fanNfcnVu JykpIHsKcmV0dXJuOwp9CmRlZmluZSgnZXNxX3NlY3Rpb25zb3J0X3NlY3Rpb25fanNfcnVu JywgMSk7CmVjaG8gPDw8RU9CCjxzY3JpcHQgc3JjPSJpbmRleC5waHA/ZXZlbnQ9cGx1Z2lu X3ByZWZzLmVzcV9zZWN0aW9uc29ydCZzdGVwPWdldF9qcyZqcz1zb3J0X2VsZW1lbnRzIj48 L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImluZGV4LnBocD9ldmVudD1wbHVnaW5fcHJlZnMuZXNx X3NlY3Rpb25zb3J0JnN0ZXA9Z2V0X2pzJmpzPXNvcnRhYmxlIj48L3NjcmlwdD4KPHNjcmlw dCBzcmM9ImluZGV4LnBocD9ldmVudD1wbHVnaW5fcHJlZnMuZXNxX3NlY3Rpb25zb3J0JnN0 ZXA9Z2V0X2pzJmpzPWNhdGVnb3J5Ij48L3NjcmlwdD4KPHN0eWxlPgp0ZC5jYXRlZ29yaWVz IHA6Zmlyc3QtY2hpbGQgewpib3JkZXItdG9wOiAwOwp9CiNjYXRlZ29yeV9jb250YWluZXIg LmNhdGVnb3J5LXRyZWUgPiAuY2F0ZWdvcnlzb3J0OmZpcnN0LWNoaWxkIHsKYm9yZGVyLXRv cDogMXB4IHNvbGlkICNkZGQ7Cn0KI2NhdGVnb3J5X2NvbnRhaW5lciAuY2F0ZWdvcnktdHJl ZSBwIC5oYW5kbGUgewpjdXJzb3I6IG1vdmU7Cn0KPC9zdHlsZT4KRU9COwp9CmZ1bmN0aW9u IGVzcV9zZWN0aW9uc29ydF9wcmVmcygkZXZlbnQ9JycsICRzdGVwPScnLCAkbWVzc2FnZT0n JykgewppZiAoJHN0ZXAgPT0gJ3JldmVydERCJykgewpnbG9iYWwgJHR4cF91c2VyOwppZiAo c2FmZV9maWVsZCgncHJpdnMnLCAndHhwX3VzZXJzJywgJ25hbWU9XCcnLmRvU2xhc2goJHR4 cF91c2VyKS4nXCcnKSAhPSAnMScpIHsKZXhpdChwYWdlVG9wKCdSZXN0cmljdGVkJykuJzxw IHN0eWxlPSJtYXJnaW4tdG9wOjNlbTt0ZXh0LWFsaWduOmNlbnRlciI+Jy5nVHh0KCdyZXN0 cmljdGVkX2FyZWEnKS4nPC9wPicpOwp9Cn0Kc3dpdGNoKCRzdGVwKSB7CmNhc2UgJ2dldF9q cyc6CmVzcV9zZWN0aW9uc29ydF9qcyhncHMoJ2pzJykpOwpicmVhazsKY2FzZSAncHV0JzoK ZXNxX3NlY3Rpb25zb3J0X2pzKGdwcygndHlwZScpKTsKYnJlYWs7CmRlZmF1bHQ6CiRzdGVw ID0gJ2RlZmF1bHQnOwpjYXNlICdyZXZlcnREQic6CiRzdGVwID0gJ2VzcV9zZWN0aW9uc29y dF8nLiRzdGVwOwokc3RlcF9yZXN1bHQgPSAkc3RlcCgpOwpwYWdldG9wKCdlc3Ffc2VjdGlv bnNvcnQgT3B0aW9ucycsICRzdGVwX3Jlc3VsdCk7CmJyZWFrOwp9CmVjaG8gJzxkaXYgc3R5 bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7 IG1hcmdpbjogMCBhdXRvOyB3aWR0aDogOTAwcHg7Ij4nOwppZiAoZXNxX3NlY3Rpb25zb3J0 X2NoZWNrREIoKSA9PSB0cnVlKSB7CmVjaG8gZm9ybSgKJzxpbnB1dCB0eXBlPSJoaWRkZW4i IG5hbWU9ImV2ZW50IiB2YWx1ZT0icGx1Z2luX3ByZWZzLmVzcV9zZWN0aW9uc29ydCIgLz4n LgonPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3RlcCIgdmFsdWU9InJldmVydERCIiAv PicKLmZJbnB1dCgnc3VibWl0JywgJ3N1Ym1pdCcsICdSZXZlcnQgREIgJiBEaXNhYmxlJywg J3B1Ymxpc2gnKS4KJzxwPlRoaXMgd2lsbCB1bmRvIGNoYW5nZXMgbWFkZSBieSA8c3Ryb25n PmVzcV9zZWN0aW9uc29ydDwvc3Ryb25nPiB0byB5b3VyIFRleHRwYXR0ZXJuIGRhdGFiYXNl LCBhbmQgZGlzYWJsZSB0aGUgcGx1Z2luLjwvcD4nCik7CmVjaG8gJzxwPlRoaXMgc2hvdWxk IG9ubHkgYmUgZG9uZSBiZWZvcmUgdW5pbnN0YWxsaW5nIDxzdHJvbmc+ZXNxX3NlY3Rpb25z b3J0PC9zdHJvbmc+LCBhcyBpdCByZW1vdmVzIGFsbCBzb3J0IHByZWZlcmVuY2VzLiBUaGlz IHdpbGwgY2F1c2UgZXJyb3JzIGluIHlvdXIgUGFnZXMgYW5kIEZvcm1zIHdoZXJlIHlvdSBo YXZlIHVzZWQgPGNvZGU+c29ydD0ic2VjdGlvbnNvcnQiPC9jb2RlPiBvciA8Y29kZT5zb3J0 PSJjYXRlZ29yeXNvcnQiPC9jb2RlPi48L3A+JzsKZWNobyAnPHA+UmV2ZXJ0aW5nIHRoZSBk YXRhYmFzZSBpcyBub3QgbmVjZXNzYXJ5IGJlZm9yZSB1bmluc3RhbGxpbmcgdGhlIHBsdWdp biAtIGl0IGhhcyBqdXN0IGJlZW4gaW5jbHVkZWQgZm9yIHRob3NlIHdobyBhcmUgbWV0aWN1 bG91cyBhYm91dCB0aGVpciBEQiBzdHJ1Y3R1cmUsIGFuZCBkb25cJ3Qgd2FudCBzdXBlcmZs dW91cyBjb2x1bW5zIGx5aW5nIGFyb3VuZC48L3A+JzsKZWNobyAnPHA+SWYgeW91IGFjY2lk ZW50YWxseSByZXZlcnQgdGhlIGRhdGFiYXNlLCB5b3UgY2FuIHJlLWVuYWJsZSB0aGUgcGx1 Z2luIHRvIHNldCB0aGUgZGF0YWJhc2UgdXAgYWdhaW4gZm9yIHVzZSB3aXRoIDxzdHJvbmc+ ZXNxX3NlY3Rpb25zb3J0PC9zdHJvbmc+LCBidXQgeW91ciBzb3J0IHByZWZlcmVuY2VzIHdp bGwgaGF2ZSBiZWVuIGxvc3QuPC9wPic7CmVjaG8gJzxwPk5vdGU6IFJldmVydGluZyB0aGUg ZGF0YWJhc2UgZWZmZWN0aXZlbHkgcnVucyB0aGUgTXlTUUwgY29tbWFuZDxicj48Y29kZT5B TFRFUiBUQUJMRSBgdHhwX3NlY3Rpb25gIERST1AgYHNlY3Rpb25zb3J0YDsgQUxURVIgVEFC TEUgYHR4cF9jYXRlZ29yeWAgRFJPUCBgY2F0ZWdvcnlzb3J0YDs8L2NvZGU+LCB3aGljaCBy ZW1vdmVzIHRoZSBjb2x1bW5zIFwnc2VjdGlvbnNvcnRcJyBhbmQgXCdjYXRlZ29yeXNvcnRc JyBmcm9tIHRoZSB0YWJsZXMgXCd0eHBfc2VjdGlvblwnIGFuZCBcJ3R4cF9jYXRlZ29yeVwn IChyZXNwZWN0aXZlbHkpIGluIHlvdXIgVGV4dHBhdHRlcm4gZGF0YWJhc2UuJzsKZWNobyAn VGhpcyBwbHVnaW4gd2FzIGRlc2lnbmVkIGZvciBUZXh0cGF0dGVybiA0LjUuMCBhbmQgdGVz dGVkIHVwIHRvIDQuNS40OyBhbHRob3VnaCB1bmxpa2VseSwgZnV0dXJlIHZlcnNpb25zIG1h eSBhY3R1YWxseSBtYWtlIHVzZSBvZiBjb2x1bW5zIHdpdGggdGhpcyBuYW1lLiBBcyBzdWNo LCBpZiB5b3UgYXJlIHVuaW5zdGFsbGluZyB0aGlzIHBsdWdpbiBiZWNhdXNlIGl0IGhhcyBi ZWVuIG1hZGUgcmVkdW5kYW50IGJ5IGEgZmVhdHVyZSBpbiBhIG5ldyBUZXh0cGF0dGVybiBy ZWxlYXNlLCBwbGVhc2UgYmUgY2FyZWZ1bC48L3A+JzsKfSBlbHNlIHsKaWYgKCgkc3RlcCA9 PSAnZXNxX3NlY3Rpb25zb3J0X3JldmVydERCJykgJiYgKCFpc19hcnJheSgkc3RlcF9yZXN1 bHQpKSkgewplY2hvICc8cD5Zb3VyIFRleHRwYXR0ZXJuIGRhdGFiYXNlIGhhcyBiZWVuIHJl dmVydGVkLCBhbmQgPHN0cm9uZz5lc3Ffc2VjdGlvbnNvcnQ8L3N0cm9uZz4gaGFzIChob3Bl ZnVsbHkpIGJlZW4gZGlzYWJsZWQuIFlvdSBtYXkgbm93IGRlbGV0ZSB0aGUgcGx1Z2luLjwv cD4nOwplY2hvICc8cD5JZiB5b3UgaGF2ZSBkb25lIHRoaXMgYnkgYWNjaWRlbnQsIGVuYWJs aW5nIDxzdHJvbmc+ZXNxX3NlY3Rpb25zb3J0PC9zdHJvbmc+IHdpbGwgcmVzdG9yZSB0aGUg cmVxdWlyZWQgY29sdW1uIGluIHlvdXIgVGV4dHBhdHRlcm4gZGF0YWJhc2UuIFlvdXIgc29y dCBwcmVmZXJlbmNlcyBoYXZlIGJlZW4gbG9zdCBob3dldmVyLjwvcD4nOwp9IGVsc2Ugewpl Y2hvICc8cD5Mb29rcyBsaWtlIHNvbWV0aGluZyB3ZW50IHdyb25nLiBUaGlzIGlzIHByb2Jh Ymx5IGJlY2F1c2UgeW91IGhpdCB0aGUgcmVmcmVzaCBidXR0b24gaW4geW91ciBicm93c2Vy IC0gcGxlYXNlIGF2b2lkIGRvaW5nIHNvLjwvcD4nOwplY2hvICc8cD5BbHRlcm5hdGl2ZWx5 IHlvdXIgVGV4dHBhdHRlcm4gZGF0YWJhc2UgbWF5IG5vdCBoYXZlIGJlZW4gc2V0IHVwIHBy b3Blcmx5IGR1cmluZyB0aGUgPHN0cm9uZz5lc3Ffc2VjdGlvbnNvcnQ8L3N0cm9uZz4gaW5z dGFsbGF0aW9uIHByb2Nlc3MuIFRyeSBjaGVja2luZyBNeVNRTCB1c2VyIHBlcm1pc3Npb25z LCB0aGVuIGRpc2FibGUgYW5kIHJlLWVuYWJsZSB0aGUgcGx1Z2luLjwvcD4nOwp9Cn0KZWNo byAnPC9kaXY+PC9kaXY+JzsKfQpmdW5jdGlvbiBlc3Ffc2VjdGlvbnNvcnRfc2V0dXAoJGV2 ZW50LCAkc3RlcCkgewpzd2l0Y2ggKCRzdGVwKSB7CmNhc2UgJ2luc3RhbGxlZCc6CmNhc2Ug J2VuYWJsZWQnOgppZiAoZXNxX3NlY3Rpb25zb3J0X2NoZWNrREIoKSkgewppZiAoIWVzcV9z ZWN0aW9uc29ydF9jaGVja0RCX3VwZGF0ZSgpKSB7CnJldHVybiBlc3Ffc2VjdGlvbnNvcnRf c2V0dXBEQl91cGRhdGUoKTsKfQp9IGVsc2UgewpyZXR1cm4gZXNxX3NlY3Rpb25zb3J0X3Nl dHVwREIodWN3b3Jkcygkc3RlcCkpOwp9CmJyZWFrOwp9CnJldHVybiAnJzsKfQpmdW5jdGlv biBlc3Ffc2VjdGlvbnNvcnRfZGVmYXVsdCgpIHsKcmV0dXJuICcnOwp9CmZ1bmN0aW9uIGVz cV9zZWN0aW9uc29ydF9jaGVja0RCKCkgewokY29sdW1ucyA9IGdldFJvd3MoJ1NIT1cgQ09M VU1OUyBGUk9NICcuc2FmZV9wZngoJ3R4cF9zZWN0aW9uJykpOwpmb3JlYWNoKCRjb2x1bW5z IGFzICRjb2x1bW4gPT4gJGNvbHVtbkRhdGEpIHsKJGNvbHVtbnNbJGNvbHVtbkRhdGFbJ0Zp ZWxkJ11dID0gJyc7CnVuc2V0KCRjb2x1bW5zWyRjb2x1bW5dKTsKfQpyZXR1cm4gaXNzZXQo JGNvbHVtbnNbJ3NlY3Rpb25zb3J0J10pOwp9CmZ1bmN0aW9uIGVzcV9zZWN0aW9uc29ydF9j aGVja0RCX3VwZGF0ZSgpIHsKJGNvbHVtbnMgPSBnZXRSb3dzKCdTSE9XIENPTFVNTlMgRlJP TSAnLnNhZmVfcGZ4KCd0eHBfY2F0ZWdvcnknKSk7CmZvcmVhY2goJGNvbHVtbnMgYXMgJGNv bHVtbiA9PiAkY29sdW1uRGF0YSkgewokY29sdW1uc1skY29sdW1uRGF0YVsnRmllbGQnXV0g PSAkY29sdW1uRGF0YVsnVHlwZSddOwp1bnNldCgkY29sdW1uc1skY29sdW1uXSk7Cn0KcmV0 dXJuIGlzc2V0KCRjb2x1bW5zWydjYXRlZ29yeXNvcnQnXSkgJiYgcHJlZ19tYXRjaCgnL150 aW55aW50LycsICRjb2x1bW5zWydjYXRlZ29yeXNvcnQnXSk7Cn0KZnVuY3Rpb24gZXNxX3Nl Y3Rpb25zb3J0X3NldHVwREIoJGxpZmVjeWNsZSkgewppZiAoCnNhZmVfYWx0ZXIoJ3R4cF9z ZWN0aW9uJywgJ0FERCBgc2VjdGlvbnNvcnRgIFRJTllJTlQgTlVMTCcpICYmCnNhZmVfYWx0 ZXIoJ3R4cF9jYXRlZ29yeScsICdBREQgYGNhdGVnb3J5c29ydGAgVElOWUlOVCBOVUxMJykK KSB7CnJldHVybiAkbGlmZWN5Y2xlLicgPHN0cm9uZz5lc3Ffc2VjdGlvbnNvcnQ8L3N0cm9u Zz4gYW5kIERCIHNldHVwIE9LLic7Cn0gZWxzZSB7CnJldHVybiBhcnJheSgKJGxpZmVjeWNs ZS4nIDxzdHJvbmc+ZXNxX3NlY3Rpb25zb3J0PC9zdHJvbmc+LiBEQiBzZXR1cCBmYWlsZWQu JywKRV9FUlJPUgopOwp9Cn0KZnVuY3Rpb24gc2VjdGlvbnNvcnRfY29udmVydCgkYSwgJGIp IHsKJGEgPSAkYVsnc2VjdGlvbnNvcnQnXTsKJGIgPSAkYlsnc2VjdGlvbnNvcnQnXTsKaWYg KCRhID09PSAkYikgewpyZXR1cm4gMDsKfQpyZXR1cm4gJGEgPCAkYiA/IC0xIDogMTsKfQpm dW5jdGlvbiBlc3Ffc2VjdGlvbnNvcnRfc2V0dXBEQl91cGRhdGUoKSB7CiRjdXJyZW50X3Nl Y3Rpb25zb3J0ID0gc2FmZV9yb3dzKCduYW1lLCBzZWN0aW9uc29ydCcsICd0eHBfc2VjdGlv bicsICcxPTEnKTsKdXNvcnQoJGN1cnJlbnRfc2VjdGlvbnNvcnQsICdzZWN0aW9uc29ydF9j b252ZXJ0Jyk7CmZvcmVhY2ggKCRjdXJyZW50X3NlY3Rpb25zb3J0IGFzICRzb3J0ID0+ICRz ZWN0aW9uX2RhdGEpIHsKc2FmZV91cGRhdGUoJ3R4cF9zZWN0aW9uJywgJ3NlY3Rpb25zb3J0 ID0gXCcnIC4gJHNvcnQgLiAnXCcnLCAnbmFtZSA9IFwnJyAuICRzZWN0aW9uX2RhdGFbJ25h bWUnXSAuICdcJycpOwp9CmlmICgKc2FmZV9hbHRlcigndHhwX3NlY3Rpb24nLCAnTU9ESUZZ IGBzZWN0aW9uc29ydGAgVElOWUlOVCBOVUxMJykgJiYKc2FmZV9hbHRlcigndHhwX2NhdGVn b3J5JywgJ0FERCBgY2F0ZWdvcnlzb3J0YCBUSU5ZSU5UIE5VTEwnKQopIHsKcmV0dXJuICc8 c3Ryb25nPmVzcV9zZWN0aW9uc29ydDwvc3Ryb25nPiBhbmQgREIgdXBkYXRlZCBPSy4nOwp9 IGVsc2UgewpyZXR1cm4gYXJyYXkoCic8c3Ryb25nPmVzcV9zZWN0aW9uc29ydDwvc3Ryb25n PiB1cGRhdGVkLCBidXQgREIgdXBkYXRlIGZhaWxlZC4gVHJ5IGFkanVzdGluZyBhIHNlY3Rp b25cJ3Mgb3JkZXIsIHRoZW4gZGlzYWJsZSBhbmQgZW5hYmxlIHRoZSBwbHVnaW4gYWdhaW4u JywKRV9FUlJPUgopOwp9Cn0KZnVuY3Rpb24gZXNxX3NlY3Rpb25zb3J0X3JldmVydERCKCkg ewppZiAoCnNhZmVfYWx0ZXIoJ3R4cF9zZWN0aW9uJywgJ0RST1AgYHNlY3Rpb25zb3J0YCcp ICYmCnNhZmVfYWx0ZXIoJ3R4cF9jYXRlZ29yeScsICdEUk9QIGBjYXRlZ29yeXNvcnRgJykK KSB7CmlmIChzYWZlX3VwZGF0ZSgndHhwX3BsdWdpbicsICdzdGF0dXMgPSAwJywgJ25hbWUg PSBcJ2VzcV9zZWN0aW9uc29ydFwnJykpIHsKcmV0dXJuICdEQiByZXZlcnRlZCBhbmQgPHN0 cm9uZz5lc3Ffc2VjdGlvbnNvcnQ8L3N0cm9uZz4gZGlzYWJsZWQgT0suJzsKfSBlbHNlIHsK cmV0dXJuIGFycmF5KAonREIgcmV2ZXJ0ZWQgT0suIEZhaWxlZCB0byBkaXNhYmxlZCA8c3Ry b25nPmVzcV9zZWN0aW9uc29ydDwvc3Ryb25nPi4nLApFX0VSUk9SCik7Cn0KfSBlbHNlIHsK cmV0dXJuIGFycmF5KAonREIgcmV2ZXJ0IGZhaWxlZC4gTm8gc3RhdHVzIGNoYW5nZS4nLApF X0VSUk9SCik7Cn0KfQpmdW5jdGlvbiBlc3Ffc2VjdGlvbnNvcnRfanMoJGpzKSB7CmhlYWRl cignQ29udGVudC1UeXBlOiB0ZXh0L2phdmFzY3JpcHQnKTsKc3dpdGNoICgkanMpIHsKY2Fz ZSAnc2VjdGlvbic6CmlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PSAnUE9TVCcp IHsKaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsKJHN1Y2Nlc3Mg PSB0cnVlOwpmb3JlYWNoICgkX1BPU1QgYXMgJHNlY3Rpb24gPT4gJHNvcnQpIHsKaWYgKCFz YWZlX3VwZGF0ZSgndHhwX3NlY3Rpb24nLCAnc2VjdGlvbnNvcnQ9XCcnLmRvU2xhc2goJHNv cnQpLidcJycsICduYW1lPVwnJy5kb1NsYXNoKCRzZWN0aW9uKS4nXCcnKSkgewokc3VjY2Vz cyA9IGZhbHNlOwp9Cn0KZWNobyBqc29uX2VuY29kZShhcnJheSgnc3VjY2VzcycgPT4gJHN1 Y2Nlc3MpKTsKfSBlbHNlIHsKJHNlY3Rpb25zb3J0ID0gYXJyYXkoKTsKZm9yZWFjaChzYWZl X3Jvd3MoJ25hbWUsIHNlY3Rpb25zb3J0JywgJ3R4cF9zZWN0aW9uJywgJzE9MScpIGFzICRy b3cpIHsKJHNlY3Rpb24gPSAkcm93WyduYW1lJ107CiRzb3J0ID0gJHJvd1snc2VjdGlvbnNv cnQnXTsKaWYgKCFzdHJsZW4oJHNvcnQpKSB7CiRzb3J0ID0gMDsKfQokc2VjdGlvbnNvcnRb J3R4cF9zZWN0aW9uXycgLiAkc2VjdGlvbl0gPSBjdHlwZV9kaWdpdCgkc29ydCkgPyAoaW50 KSRzb3J0IDogJHNvcnQ7Cn0KZWNobyAndmFyIHNlY3Rpb25zb3J0ID0gJywganNvbl9lbmNv ZGUoJHNlY3Rpb25zb3J0KSwgJzsnLiJcbiI7CmVjaG8gPDw8RU9CCiQoZnVuY3Rpb24oKSB7 CiQoJyNzZWN0aW9uX2NvbnRhaW5lciB0aGVhZCB0cicpLnByZXBlbmQoJzx0aCBzdHlsZT0i d2lkdGg6IDMwcHg7Ij5Tb3J0PC90aD4nKS5maW5kKCd0aCcpLmVhY2goZnVuY3Rpb24oKSB7 CnZhciB0aCA9ICQodGhpcyk7CnRoLmh0bWwodGgudGV4dCgpKTsKfSk7CiQoJyNzZWN0aW9u X2NvbnRhaW5lciB0YWJsZScpLmNzcygndGFibGUtbGF5b3V0JywgJ2ZpeGVkJykuZmluZCgn dGJvZHkgdHInKS5wcmVwZW5kKCc8dGQ+PC90ZD4nKS5ub3QoJyN0eHBfc2VjdGlvbl9kZWZh dWx0JykuYXBwZW5kVG8oJyNzZWN0aW9uX2NvbnRhaW5lciB0Ym9keScpLnNvcnRFbGVtZW50 cyhmdW5jdGlvbihhLCBiKSB7CnZhciBhX3NvcnQgPSBzZWN0aW9uc29ydFskKGEpLmF0dHIo J2lkJyldOwp2YXIgYl9zb3J0ID0gc2VjdGlvbnNvcnRbJChiKS5hdHRyKCdpZCcpXTsKaWYg KGFfc29ydCA9PSBiX3NvcnQpIHsKcmV0dXJuIDA7Cn0KcmV0dXJuIGFfc29ydCA+IGJfc29y dCA/IDEgOiAtMTsKfSkucGFyZW50KCkuc29ydGFibGUoewppdGVtczogJ3RyOm5vdCg6Zmly c3QtY2hpbGQpJywKaGFuZGxlOiAndGQ6Zmlyc3QtY2hpbGQnLApzdGFydDogZnVuY3Rpb24o ZXZlbnQsIHVpKSB7CmlmICghJCgnI2NiX3RvZ2dsZV9zZWN0aW9uX2RldGFpbCcpLmlzKCc6 Y2hlY2tlZCcpKSB7CnVpLnBsYWNlaG9sZGVyLmZpbmQoJzpudGgtY2hpbGQobis3KScpLmhp ZGUoKTsKfQp9LApzdG9wOiBmdW5jdGlvbigpIHsKdmFyIHNlY3Rpb25zb3J0ID0ge307CiQo dGhpcykuZmluZCgndHInKS5lYWNoKGZ1bmN0aW9uKCkgewp2YXIgdHIgPSAkKHRoaXMpOwpz ZWN0aW9uc29ydFt0ci5hdHRyKCdpZCcpLnJlcGxhY2UoJ3R4cF9zZWN0aW9uXycsICcnKV0g PSB0ci5pbmRleCgpOwp9KTsKdmFyIHNldF9tZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSwg dHlwZSkgewokKCcjbWVzc2FnZXBhbmUnKS5odG1sKCc8c3BhbiBpZD0ibWVzc2FnZSIgY2xh c3M9IicgKyB0eXBlICsgJyI+JyArIG1lc3NhZ2UgKyAnIDxhIGhyZWY9IiNjbG9zZSIgY2xh c3M9ImNsb3NlIj4mdGltZXM7PC9hPjwvc3Bhbj4nKTsKJCgnI21lc3NhZ2UnKS5mYWRlT3V0 KCdmYXN0JykuZmFkZUluKCdmYXN0Jyk7Cn0KJC5hamF4KAonaW5kZXgucGhwP2V2ZW50PXBs dWdpbl9wcmVmcy5lc3Ffc2VjdGlvbnNvcnQmc3RlcD1wdXQmdHlwZT1zZWN0aW9uJywKewp0 eXBlOiAnUE9TVCcsCmRhdGE6IHNlY3Rpb25zb3J0LApkYXRhVHlwZTogJ2pzb24nLApzdWNj ZXNzOiBmdW5jdGlvbihyZXNwb25zZSkgewppZiAocmVzcG9uc2Uuc3VjY2VzcykgewpzZXRf bWVzc2FnZSgnU2VjdGlvbiBvcmRlciBzYXZlZCBPSycsICdzdWNjZXNzJykKfSBlbHNlIHsK dGhpcy5lcnJvcigpOwp9Cn0sCmVycm9yOiBmdW5jdGlvbigpIHsKc2V0X21lc3NhZ2UoJ1Nl Y3Rpb24gb3JkZXIgc2F2ZSBmYWlsZWQnLCAnZXJyb3InKTsKfQp9Cik7Cn0KfSkuZmluZCgn dHInKS5ub3QoJzpmaXJzdC1jaGlsZCcpLmZpbmQoJ3RkOmZpcnN0LWNoaWxkJykuaHRtbCgn JnVhcnI7JmRhcnI7Jyk7Cn0pOwpFT0I7Cn0KYnJlYWs7CmNhc2UgJ2NhdGVnb3J5JzoKaWYg KCRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddID09ICdQT1NUJykgewpoZWFkZXIoJ0NvbnRl bnQtVHlwZTogYXBwbGljYXRpb24vanNvbicpOwokc3VjY2VzcyA9IHRydWU7CmZvcmVhY2gg KCRfUE9TVCBhcyAkY2F0ZWdvcnlfaWQgPT4gJHNvcnQpIHsKaWYgKCFzYWZlX3VwZGF0ZSgn dHhwX2NhdGVnb3J5JywgJ2NhdGVnb3J5c29ydD1cJycuZG9TbGFzaCgkc29ydCkuJ1wnJywg J2lkPVwnJy5kb1NsYXNoKCRjYXRlZ29yeV9pZCkuJ1wnJykpIHsKJHN1Y2Nlc3MgPSBmYWxz ZTsKfQp9CmVjaG8ganNvbl9lbmNvZGUoYXJyYXkoJ3N1Y2Nlc3MnID0+ICRzdWNjZXNzKSk7 Cn0gZWxzZSB7CiRjYXRlZ29yeXNvcnQgPSBhcnJheSgpOwpmb3JlYWNoKHNhZmVfcm93cygn aWQsIGNhdGVnb3J5c29ydCcsICd0eHBfY2F0ZWdvcnknLCAnMT0xJykgYXMgJHJvdykgewok Y2F0ZWdvcnlfaWQgPSAkcm93WydpZCddOwokc29ydCA9ICRyb3dbJ2NhdGVnb3J5c29ydCdd OwppZiAoIXN0cmxlbigkc29ydCkpIHsKJHNvcnQgPSAwOwp9CiRjYXRlZ29yeXNvcnRbJGNh dGVnb3J5X2lkXSA9IGN0eXBlX2RpZ2l0KCRzb3J0KSA/IChpbnQpJHNvcnQgOiAkc29ydDsK fQplY2hvICd2YXIgY2F0ZWdvcnlzb3J0ID0gJywganNvbl9lbmNvZGUoJGNhdGVnb3J5c29y dCksICc7Jy4iXG4iOwplY2hvIDw8PEVPQgokKGZ1bmN0aW9uKCkgewp2YXIgc29ydF9ncm91 cHMgPSBbXTsKJCgnI2NhdGVnb3J5X2NvbnRhaW5lciAuY2F0ZWdvcnktdHJlZScpLmVhY2go ZnVuY3Rpb24oKSB7CiQodGhpcykuZmluZCgncCcpLndyYXBBbGwoJzxkaXYgY2xhc3M9ImNh dGVnb3J5c29ydCIvPicpLmVhY2goZnVuY3Rpb24oKSB7CnZhciBjdXJyZW50ID0gJCh0aGlz KTsKdmFyIG5leHQgPSBjdXJyZW50Lm5leHQoJ3AnKTsKdmFyIGdyb3VwID0gY3VycmVudDsK dmFyIGxldmVsID0gTnVtYmVyKGN1cnJlbnQuYXR0cignY2xhc3MnKS5yZXBsYWNlKCdsZXZl bC0nLCAnJykpOwp2YXIgY2F0ZWdvcnlfaWQgPSBOdW1iZXIoY3VycmVudC5maW5kKCdpbnB1 dCcpLnZhbCgpKTsKY3VycmVudC5kYXRhKHsKY2F0ZWdvcnlfaWQ6IGNhdGVnb3J5X2lkLApj YXRlZ29yeXNvcnQ6IGNhdGVnb3J5c29ydFtjYXRlZ29yeV9pZF0KfSk7CmN1cnJlbnQucHJl cGVuZCgnPHNwYW4gY2xhc3M9ImhhbmRsZSI+JnVhcnI7JmRhcnI7PC9zcGFuPicpOwppZiAo Y3VycmVudC5kYXRhKCdncm91cGVkJykpIHsKcmV0dXJuOwp9CndoaWxlIChuZXh0Lmxlbmd0 aCkgewp2YXIgbmV4dF9sZXZlbCA9IE51bWJlcihuZXh0LmF0dHIoJ2NsYXNzJykucmVwbGFj ZSgnbGV2ZWwtJywgJycpKTsKaWYgKG5leHRfbGV2ZWwgPD0gbGV2ZWwpIHsKYnJlYWs7Cn0K Z3JvdXAgPSBncm91cC5hZGQobmV4dCk7CmlmIChuZXh0X2xldmVsID09IGxldmVsKSB7Cm5l eHQuZGF0YSgnZ3JvdXBlZCcsIHRydWUpOwp9Cm5leHQgPSBuZXh0Lm5leHQoJ3AnKTsKfQpz b3J0X2dyb3Vwcy5wdXNoKGdyb3VwKTsKfSk7Cn0pOwokLmVhY2goc29ydF9ncm91cHMsIGZ1 bmN0aW9uKCkgewp2YXIgZ3JvdXAgPSAkKHRoaXMpOwp2YXIgZ3JvdXBfdG9wID0gZ3JvdXAu ZXEoMCk7Cmdyb3VwLndyYXBBbGwoJzxkaXYgY2xhc3M9ImNhdGVnb3J5c29ydCIgZGF0YS1j YXRlZ29yeV9pZD0iJyArIGdyb3VwX3RvcC5kYXRhKCdjYXRlZ29yeV9pZCcpICsgJyIgZGF0 YS1jYXRlZ29yeXNvcnQ9IicgKyBncm91cF90b3AuZGF0YSgnY2F0ZWdvcnlzb3J0JykgKyAn IiAvPicpOwp9KTsKJCgnLmNhdGVnb3J5c29ydCA+IC5jYXRlZ29yeXNvcnQnKS5wYXJlbnQo KS5lYWNoKGZ1bmN0aW9uKCkgewokKHRoaXMpLnNvcnRhYmxlKHsKaXRlbXM6ICc+IC5jYXRl Z29yeXNvcnQnLApoYW5kbGU6ICcuaGFuZGxlJywKc3RvcDogZnVuY3Rpb24oKSB7CnZhciBj YXRlZ29yeXNvcnQgPSB7fTsKdmFyIGdyb3VwID0gJCh0aGlzKS5maW5kKCc+IC5jYXRlZ29y eXNvcnQnKTsKZ3JvdXAuZWFjaChmdW5jdGlvbigpIHsKdmFyIGVsID0gJCh0aGlzKTsKY2F0 ZWdvcnlzb3J0W2VsLmRhdGEoJ2NhdGVnb3J5X2lkJyldID0gZWwuY2xvc2VzdCgnLmNhdGVn b3J5LXRyZWUnKS5maW5kKCcuY2F0ZWdvcnlzb3J0JykuaW5kZXgoZWwpOwp9KTsKdmFyIHNl dF9tZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSwgdHlwZSkgewokKCcjbWVzc2FnZXBhbmUn KS5odG1sKCc8c3BhbiBpZD0ibWVzc2FnZSIgY2xhc3M9IicgKyB0eXBlICsgJyI+JyArIG1l c3NhZ2UgKyAnIDxhIGhyZWY9IiNjbG9zZSIgY2xhc3M9ImNsb3NlIj4mdGltZXM7PC9hPjwv c3Bhbj4nKTsKJCgnI21lc3NhZ2UnKS5mYWRlT3V0KCdmYXN0JykuZmFkZUluKCdmYXN0Jyk7 Cn0KJC5hamF4KAonaW5kZXgucGhwP2V2ZW50PXBsdWdpbl9wcmVmcy5lc3Ffc2VjdGlvbnNv cnQmc3RlcD1wdXQmdHlwZT1jYXRlZ29yeScsCnsKdHlwZTogJ1BPU1QnLApkYXRhOiBjYXRl Z29yeXNvcnQsCmRhdGFUeXBlOiAnanNvbicsCnN1Y2Nlc3M6IGZ1bmN0aW9uKHJlc3BvbnNl KSB7CmlmIChyZXNwb25zZS5zdWNjZXNzKSB7CnNldF9tZXNzYWdlKCdTZWN0aW9uIG9yZGVy IHNhdmVkIE9LJywgJ3N1Y2Nlc3MnKQp9IGVsc2Ugewp0aGlzLmVycm9yKCk7Cn0KfSwKZXJy b3I6IGZ1bmN0aW9uKCkgewpzZXRfbWVzc2FnZSgnU2VjdGlvbiBvcmRlciBzYXZlIGZhaWxl ZCcsICdlcnJvcicpOwp9Cn0KKTsKfQp9KS5maW5kKCc+IC5jYXRlZ29yeXNvcnQnKS5zb3J0 RWxlbWVudHMoZnVuY3Rpb24oYSwgYikgewp2YXIgYV9zb3J0ID0gJChhKS5kYXRhKCdjYXRl Z29yeXNvcnQnKTsKdmFyIGJfc29ydCA9ICQoYikuZGF0YSgnY2F0ZWdvcnlzb3J0Jyk7Cmlm IChhX3NvcnQgPT0gYl9zb3J0KSB7CnJldHVybiAwOwp9CnJldHVybiBhX3NvcnQgPiBiX3Nv cnQgPyAxIDogLTE7Cn0pOwp9KTsKfSk7CkVPQjsKfQpicmVhazsKY2FzZSAnc29ydF9lbGVt ZW50cyc6CmVjaG8gPDw8RU9CCi8qKgoqIGpRdWVyeS5mbi5zb3J0RWxlbWVudHMKKiAtLS0t LS0tLS0tLS0tLQoqIEBhdXRob3IgSmFtZXMgUGFkb2xzZXkgKGh0dHA6Ly9qYW1lcy5wYWRv bHNleS5jb20pCiogQHZlcnNpb24gMC4xMQoqIEB1cGRhdGVkIDE4LU1BUi0yMDEwCiogLS0t LS0tLS0tLS0tLS0KKiBAcGFyYW0gRnVuY3Rpb24gY29tcGFyYXRvcjoKKiAgIEV4YWN0bHkg dGhlIHNhbWUgYmVoYXZpb3VyIGFzIFsxLDIsM10uc29ydChjb21wYXJhdG9yKQoqICAgCiog QHBhcmFtIEZ1bmN0aW9uIGdldFNvcnRhYmxlCiogICBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxk IHJldHVybiB0aGUgZWxlbWVudCB0aGF0IGlzCiogICB0byBiZSBzb3J0ZWQuIFRoZSBjb21w YXJhdG9yIHdpbGwgcnVuIG9uIHRoZQoqICAgY3VycmVudCBjb2xsZWN0aW9uLCBidXQgeW91 IG1heSB3YW50IHRoZSBhY3R1YWwKKiAgIHJlc3VsdGluZyBzb3J0IHRvIG9jY3VyIG9uIGEg cGFyZW50IG9yIGFub3RoZXIKKiAgIGFzc29jaWF0ZWQgZWxlbWVudC4KKiAgIAoqICAgRS5n LiAkKCd0ZCcpLnNvcnRFbGVtZW50cyhjb21wYXJhdG9yLCBmdW5jdGlvbigpewoqICAgICAg cmV0dXJuIHRoaXMucGFyZW50Tm9kZTsgCiogICB9KQoqICAgCiogICBUaGUgPHRkPidzIHBh cmVudCAoPHRyPikgd2lsbCBiZSBzb3J0ZWQgaW5zdGVhZAoqICAgb2YgdGhlIDx0ZD4gaXRz ZWxmLgoqLwpqUXVlcnkuZm4uc29ydEVsZW1lbnRzID0gKGZ1bmN0aW9uKCl7CnZhciBzb3J0 ID0gW10uc29ydDsKcmV0dXJuIGZ1bmN0aW9uKGNvbXBhcmF0b3IsIGdldFNvcnRhYmxlKSB7 CmdldFNvcnRhYmxlID0gZ2V0U29ydGFibGUgfHwgZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9 Owp2YXIgcGxhY2VtZW50cyA9IHRoaXMubWFwKGZ1bmN0aW9uKCl7CnZhciBzb3J0RWxlbWVu dCA9IGdldFNvcnRhYmxlLmNhbGwodGhpcyksCnBhcmVudE5vZGUgPSBzb3J0RWxlbWVudC5w YXJlbnROb2RlLAovLyBTaW5jZSB0aGUgZWxlbWVudCBpdHNlbGYgd2lsbCBjaGFuZ2UgcG9z aXRpb24sIHdlIGhhdmUKLy8gdG8gaGF2ZSBzb21lIHdheSBvZiBzdG9yaW5nIGl0J3Mgb3Jp Z2luYWwgcG9zaXRpb24gaW4KLy8gdGhlIERPTS4gVGhlIGVhc2llc3Qgd2F5IGlzIHRvIGhh dmUgYSAnZmxhZycgbm9kZToKbmV4dFNpYmxpbmcgPSBwYXJlbnROb2RlLmluc2VydEJlZm9y ZSgKZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpLApzb3J0RWxlbWVudC5uZXh0U2libGlu ZwopOwpyZXR1cm4gZnVuY3Rpb24oKSB7CmlmIChwYXJlbnROb2RlID09PSB0aGlzKSB7CnRo cm93IG5ldyBFcnJvcigKIllvdSBjYW4ndCBzb3J0IGVsZW1lbnRzIGlmIGFueSBvbmUgaXMg YSBkZXNjZW5kYW50IG9mIGFub3RoZXIuIgopOwp9Ci8vIEluc2VydCBiZWZvcmUgZmxhZzoK cGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgbmV4dFNpYmxpbmcpOwovLyBSZW1vdmUg ZmxhZzoKcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXh0U2libGluZyk7Cn07Cn0pOwpyZXR1 cm4gc29ydC5jYWxsKHRoaXMsIGNvbXBhcmF0b3IpLmVhY2goZnVuY3Rpb24oaSl7CnBsYWNl bWVudHNbaV0uY2FsbChnZXRTb3J0YWJsZS5jYWxsKHRoaXMpKTsKfSk7Cn07Cn0pKCk7CkVP QjsKYnJlYWs7CmNhc2UgJ3NvcnRhYmxlJzoKZWNobyA8PDxFT0IKLyohIGpRdWVyeSBVSSAt IHYxLjEwLjMgLSAyMDEzLTA5LTI0CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVz OiBqcXVlcnkudWkuY29yZS5qcywganF1ZXJ5LnVpLndpZGdldC5qcywganF1ZXJ5LnVpLm1v dXNlLmpzLCBqcXVlcnkudWkuc29ydGFibGUuanMKKiBDb3B5cmlnaHQgMjAxMyBqUXVlcnkg Rm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KKGZ1 bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaSh0LGkpe3ZhciBzLGEsbyxyPXQubm9kZU5hbWUudG9M b3dlckNhc2UoKTtyZXR1cm4iYXJlYSI9PT1yPyhzPXQucGFyZW50Tm9kZSxhPXMubmFtZSx0 LmhyZWYmJmEmJiJtYXAiPT09cy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPyhvPWUoImltZ1t1 c2VtYXA9IyIrYSsiXSIpWzBdLCEhbyYmbihvKSk6ITEpOigvaW5wdXR8c2VsZWN0fHRleHRh cmVhfGJ1dHRvbnxvYmplY3QvLnRlc3Qocik/IXQuZGlzYWJsZWQ6ImEiPT09cj90LmhyZWZ8 fGk6aSkmJm4odCl9ZnVuY3Rpb24gbih0KXtyZXR1cm4gZS5leHByLmZpbHRlcnMudmlzaWJs ZSh0KSYmIWUodCkucGFyZW50cygpLmFkZEJhY2soKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1 cm4iaGlkZGVuIj09PWUuY3NzKHRoaXMsInZpc2liaWxpdHkiKX0pLmxlbmd0aH12YXIgcz0w LGE9L151aS1pZC1cZCskLztlLnVpPWUudWl8fHt9LGUuZXh0ZW5kKGUudWkse3ZlcnNpb246 IjEuMTAuMyIsa2V5Q29kZTp7QkFDS1NQQUNFOjgsQ09NTUE6MTg4LERFTEVURTo0NixET1dO OjQwLEVORDozNSxFTlRFUjoxMyxFU0NBUEU6MjcsSE9NRTozNixMRUZUOjM3LE5VTVBBRF9B REQ6MTA3LE5VTVBBRF9ERUNJTUFMOjExMCxOVU1QQURfRElWSURFOjExMSxOVU1QQURfRU5U RVI6MTA4LE5VTVBBRF9NVUxUSVBMWToxMDYsTlVNUEFEX1NVQlRSQUNUOjEwOSxQQUdFX0RP V046MzQsUEFHRV9VUDozMyxQRVJJT0Q6MTkwLFJJR0hUOjM5LFNQQUNFOjMyLFRBQjo5LFVQ OjM4fX0pLGUuZm4uZXh0ZW5kKHtmb2N1czpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24o aSxuKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGk/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFy IHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSh0KS5mb2N1cygpLG4mJm4uY2FsbCh0 KX0saSl9KTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KGUuZm4uZm9jdXMpLHNjcm9sbFBh cmVudDpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0PWUudWkuaWUmJi8oc3RhdGljfHJlbGF0 aXZlKS8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSl8fC9hYnNvbHV0ZS8udGVzdCh0aGlz LmNzcygicG9zaXRpb24iKSk/dGhpcy5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0 dXJuLyhyZWxhdGl2ZXxhYnNvbHV0ZXxmaXhlZCkvLnRlc3QoZS5jc3ModGhpcywicG9zaXRp b24iKSkmJi8oYXV0b3xzY3JvbGwpLy50ZXN0KGUuY3NzKHRoaXMsIm92ZXJmbG93IikrZS5j c3ModGhpcywib3ZlcmZsb3cteSIpK2UuY3NzKHRoaXMsIm92ZXJmbG93LXgiKSl9KS5lcSgw KTp0aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKGF1dG98c2Nyb2xs KS8udGVzdChlLmNzcyh0aGlzLCJvdmVyZmxvdyIpK2UuY3NzKHRoaXMsIm92ZXJmbG93LXki KStlLmNzcyh0aGlzLCJvdmVyZmxvdy14IikpfSkuZXEoMCksL2ZpeGVkLy50ZXN0KHRoaXMu Y3NzKCJwb3NpdGlvbiIpKXx8IXQubGVuZ3RoP2UoZG9jdW1lbnQpOnR9LHpJbmRleDpmdW5j dGlvbihpKXtpZihpIT09dClyZXR1cm4gdGhpcy5jc3MoInpJbmRleCIsaSk7aWYodGhpcy5s ZW5ndGgpZm9yKHZhciBuLHMsYT1lKHRoaXNbMF0pO2EubGVuZ3RoJiZhWzBdIT09ZG9jdW1l bnQ7KXtpZihuPWEuY3NzKCJwb3NpdGlvbiIpLCgiYWJzb2x1dGUiPT09bnx8InJlbGF0aXZl Ij09PW58fCJmaXhlZCI9PT1uKSYmKHM9cGFyc2VJbnQoYS5jc3MoInpJbmRleCIpLDEwKSwh aXNOYU4ocykmJjAhPT1zKSlyZXR1cm4gczthPWEucGFyZW50KCl9cmV0dXJuIDB9LHVuaXF1 ZUlkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RoaXMuaWR8fCh0 aGlzLmlkPSJ1aS1pZC0iKyArK3MpfSl9LHJlbW92ZVVuaXF1ZUlkOmZ1bmN0aW9uKCl7cmV0 dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2EudGVzdCh0aGlzLmlkKSYmZSh0aGlzKS5yZW1v dmVBdHRyKCJpZCIpfSl9fSksZS5leHRlbmQoZS5leHByWyI6Il0se2RhdGE6ZS5leHByLmNy ZWF0ZVBzZXVkbz9lLmV4cHIuY3JlYXRlUHNldWRvKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5j dGlvbihpKXtyZXR1cm4hIWUuZGF0YShpLHQpfX0pOmZ1bmN0aW9uKHQsaSxuKXtyZXR1cm4h IWUuZGF0YSh0LG5bM10pfSxmb2N1c2FibGU6ZnVuY3Rpb24odCl7cmV0dXJuIGkodCwhaXNO YU4oZS5hdHRyKHQsInRhYmluZGV4IikpKX0sdGFiYmFibGU6ZnVuY3Rpb24odCl7dmFyIG49 ZS5hdHRyKHQsInRhYmluZGV4Iikscz1pc05hTihuKTtyZXR1cm4oc3x8bj49MCkmJmkodCwh cyl9fSksZSgiPGE+Iikub3V0ZXJXaWR0aCgxKS5qcXVlcnl8fGUuZWFjaChbIldpZHRoIiwi SGVpZ2h0Il0sZnVuY3Rpb24oaSxuKXtmdW5jdGlvbiBzKHQsaSxuLHMpe3JldHVybiBlLmVh Y2goYSxmdW5jdGlvbigpe2ktPXBhcnNlRmxvYXQoZS5jc3ModCwicGFkZGluZyIrdGhpcykp fHwwLG4mJihpLT1wYXJzZUZsb2F0KGUuY3NzKHQsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8 fDApLHMmJihpLT1wYXJzZUZsb2F0KGUuY3NzKHQsIm1hcmdpbiIrdGhpcykpfHwwKX0pLGl9 dmFyIGE9IldpZHRoIj09PW4/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLG89 bi50b0xvd2VyQ2FzZSgpLHI9e2lubmVyV2lkdGg6ZS5mbi5pbm5lcldpZHRoLGlubmVySGVp Z2h0OmUuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDplLmZuLm91dGVyV2lkdGgsb3V0ZXJI ZWlnaHQ6ZS5mbi5vdXRlckhlaWdodH07ZS5mblsiaW5uZXIiK25dPWZ1bmN0aW9uKGkpe3Jl dHVybiBpPT09dD9yWyJpbm5lciIrbl0uY2FsbCh0aGlzKTp0aGlzLmVhY2goZnVuY3Rpb24o KXtlKHRoaXMpLmNzcyhvLHModGhpcyxpKSsicHgiKX0pfSxlLmZuWyJvdXRlciIrbl09ZnVu Y3Rpb24odCxpKXtyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQ/clsib3V0ZXIiK25dLmNhbGwo dGhpcyx0KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmNzcyhvLHModGhpcyx0LCEw LGkpKyJweCIpfSl9fSksZS5mbi5hZGRCYWNrfHwoZS5mbi5hZGRCYWNrPWZ1bmN0aW9uKGUp e3JldHVybiB0aGlzLmFkZChudWxsPT1lP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmpl Y3QuZmlsdGVyKGUpKX0pLGUoIjxhPiIpLmRhdGEoImEtYiIsImEiKS5yZW1vdmVEYXRhKCJh LWIiKS5kYXRhKCJhLWIiKSYmKGUuZm4ucmVtb3ZlRGF0YT1mdW5jdGlvbih0KXtyZXR1cm4g ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jYWxsKHRoaXMsZS5jYW1l bENhc2UoaSkpOnQuY2FsbCh0aGlzKX19KGUuZm4ucmVtb3ZlRGF0YSkpLGUudWkuaWU9ISEv bXNpZSBbXHcuXSsvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKSxl LnN1cHBvcnQuc2VsZWN0c3RhcnQ9Im9uc2VsZWN0c3RhcnQiaW4gZG9jdW1lbnQuY3JlYXRl RWxlbWVudCgiZGl2IiksZS5mbi5leHRlbmQoe2Rpc2FibGVTZWxlY3Rpb246ZnVuY3Rpb24o KXtyZXR1cm4gdGhpcy5iaW5kKChlLnN1cHBvcnQuc2VsZWN0c3RhcnQ/InNlbGVjdHN0YXJ0 IjoibW91c2Vkb3duIikrIi51aS1kaXNhYmxlU2VsZWN0aW9uIixmdW5jdGlvbihlKXtlLnBy ZXZlbnREZWZhdWx0KCl9KX0sZW5hYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMudW5iaW5kKCIudWktZGlzYWJsZVNlbGVjdGlvbiIpfX0pLGUuZXh0ZW5kKGUudWkse3Bs dWdpbjp7YWRkOmZ1bmN0aW9uKHQsaSxuKXt2YXIgcyxhPWUudWlbdF0ucHJvdG90eXBlO2Zv cihzIGluIG4pYS5wbHVnaW5zW3NdPWEucGx1Z2luc1tzXXx8W10sYS5wbHVnaW5zW3NdLnB1 c2goW2ksbltzXV0pfSxjYWxsOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbixzPWUucGx1Z2luc1t0 XTtpZihzJiZlLmVsZW1lbnRbMF0ucGFyZW50Tm9kZSYmMTEhPT1lLmVsZW1lbnRbMF0ucGFy ZW50Tm9kZS5ub2RlVHlwZSlmb3Iobj0wO3MubGVuZ3RoPm47bisrKWUub3B0aW9uc1tzW25d WzBdXSYmc1tuXVsxXS5hcHBseShlLmVsZW1lbnQsaSl9fSxoYXNTY3JvbGw6ZnVuY3Rpb24o dCxpKXtpZigiaGlkZGVuIj09PWUodCkuY3NzKCJvdmVyZmxvdyIpKXJldHVybiExO3ZhciBu PWkmJiJsZWZ0Ij09PWk/InNjcm9sbExlZnQiOiJzY3JvbGxUb3AiLHM9ITE7cmV0dXJuIHRb bl0+MD8hMDoodFtuXT0xLHM9dFtuXT4wLHRbbl09MCxzKX19KX0pKGpRdWVyeSk7KGZ1bmN0 aW9uKHQsZSl7dmFyIGk9MCxzPUFycmF5LnByb3RvdHlwZS5zbGljZSxuPXQuY2xlYW5EYXRh O3QuY2xlYW5EYXRhPWZ1bmN0aW9uKGUpe2Zvcih2YXIgaSxzPTA7bnVsbCE9KGk9ZVtzXSk7 cysrKXRyeXt0KGkpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX1jYXRjaChvKXt9bihlKX0s dC53aWRnZXQ9ZnVuY3Rpb24oaSxzLG4pe3ZhciBvLGEscixoLGw9e30sYz1pLnNwbGl0KCIu IilbMF07aT1pLnNwbGl0KCIuIilbMV0sbz1jKyItIitpLG58fChuPXMscz10LldpZGdldCks dC5leHByWyI6Il1bby50b0xvd2VyQ2FzZSgpXT1mdW5jdGlvbihlKXtyZXR1cm4hIXQuZGF0 YShlLG8pfSx0W2NdPXRbY118fHt9LGE9dFtjXVtpXSxyPXRbY11baV09ZnVuY3Rpb24odCxp KXtyZXR1cm4gdGhpcy5fY3JlYXRlV2lkZ2V0Pyhhcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9j cmVhdGVXaWRnZXQodCxpKSxlKTpuZXcgcih0LGkpfSx0LmV4dGVuZChyLGEse3ZlcnNpb246 bi52ZXJzaW9uLF9wcm90bzp0LmV4dGVuZCh7fSxuKSxfY2hpbGRDb25zdHJ1Y3RvcnM6W119 KSxoPW5ldyBzLGgub3B0aW9ucz10LndpZGdldC5leHRlbmQoe30saC5vcHRpb25zKSx0LmVh Y2gobixmdW5jdGlvbihpLG4pe3JldHVybiB0LmlzRnVuY3Rpb24obik/KGxbaV09ZnVuY3Rp b24oKXt2YXIgdD1mdW5jdGlvbigpe3JldHVybiBzLnByb3RvdHlwZVtpXS5hcHBseSh0aGlz LGFyZ3VtZW50cyl9LGU9ZnVuY3Rpb24odCl7cmV0dXJuIHMucHJvdG90eXBlW2ldLmFwcGx5 KHRoaXMsdCl9O3JldHVybiBmdW5jdGlvbigpe3ZhciBpLHM9dGhpcy5fc3VwZXIsbz10aGlz Ll9zdXBlckFwcGx5O3JldHVybiB0aGlzLl9zdXBlcj10LHRoaXMuX3N1cGVyQXBwbHk9ZSxp PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3N1cGVyPXMsdGhpcy5fc3VwZXJBcHBs eT1vLGl9fSgpLGUpOihsW2ldPW4sZSl9KSxyLnByb3RvdHlwZT10LndpZGdldC5leHRlbmQo aCx7d2lkZ2V0RXZlbnRQcmVmaXg6YT9oLndpZGdldEV2ZW50UHJlZml4Oml9LGwse2NvbnN0 cnVjdG9yOnIsbmFtZXNwYWNlOmMsd2lkZ2V0TmFtZTppLHdpZGdldEZ1bGxOYW1lOm99KSxh Pyh0LmVhY2goYS5fY2hpbGRDb25zdHJ1Y3RvcnMsZnVuY3Rpb24oZSxpKXt2YXIgcz1pLnBy b3RvdHlwZTt0LndpZGdldChzLm5hbWVzcGFjZSsiLiIrcy53aWRnZXROYW1lLHIsaS5fcHJv dG8pfSksZGVsZXRlIGEuX2NoaWxkQ29uc3RydWN0b3JzKTpzLl9jaGlsZENvbnN0cnVjdG9y cy5wdXNoKHIpLHQud2lkZ2V0LmJyaWRnZShpLHIpfSx0LndpZGdldC5leHRlbmQ9ZnVuY3Rp b24oaSl7Zm9yKHZhciBuLG8sYT1zLmNhbGwoYXJndW1lbnRzLDEpLHI9MCxoPWEubGVuZ3Ro O2g+cjtyKyspZm9yKG4gaW4gYVtyXSlvPWFbcl1bbl0sYVtyXS5oYXNPd25Qcm9wZXJ0eShu KSYmbyE9PWUmJihpW25dPXQuaXNQbGFpbk9iamVjdChvKT90LmlzUGxhaW5PYmplY3QoaVtu XSk/dC53aWRnZXQuZXh0ZW5kKHt9LGlbbl0sbyk6dC53aWRnZXQuZXh0ZW5kKHt9LG8pOm8p O3JldHVybiBpfSx0LndpZGdldC5icmlkZ2U9ZnVuY3Rpb24oaSxuKXt2YXIgbz1uLnByb3Rv dHlwZS53aWRnZXRGdWxsTmFtZXx8aTt0LmZuW2ldPWZ1bmN0aW9uKGEpe3ZhciByPSJzdHJp bmciPT10eXBlb2YgYSxoPXMuY2FsbChhcmd1bWVudHMsMSksbD10aGlzO3JldHVybiBhPSFy JiZoLmxlbmd0aD90LndpZGdldC5leHRlbmQuYXBwbHkobnVsbCxbYV0uY29uY2F0KGgpKTph LHI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHMsbj10LmRhdGEodGhpcyxvKTtyZXR1cm4g bj90LmlzRnVuY3Rpb24oblthXSkmJiJfIiE9PWEuY2hhckF0KDApPyhzPW5bYV0uYXBwbHko bixoKSxzIT09biYmcyE9PWU/KGw9cyYmcy5qcXVlcnk/bC5wdXNoU3RhY2socy5nZXQoKSk6 cywhMSk6ZSk6dC5lcnJvcigibm8gc3VjaCBtZXRob2QgJyIrYSsiJyBmb3IgIitpKyIgd2lk Z2V0IGluc3RhbmNlIik6dC5lcnJvcigiY2Fubm90IGNhbGwgbWV0aG9kcyBvbiAiK2krIiBw cmlvciB0byBpbml0aWFsaXphdGlvbjsgIisiYXR0ZW1wdGVkIHRvIGNhbGwgbWV0aG9kICci K2ErIiciKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPXQuZGF0YSh0aGlzLG8pO2U/ ZS5vcHRpb24oYXx8e30pLl9pbml0KCk6dC5kYXRhKHRoaXMsbyxuZXcgbihhLHRoaXMpKX0p LGx9fSx0LldpZGdldD1mdW5jdGlvbigpe30sdC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3Jz PVtdLHQuV2lkZ2V0LnByb3RvdHlwZT17d2lkZ2V0TmFtZToid2lkZ2V0Iix3aWRnZXRFdmVu dFByZWZpeDoiIixkZWZhdWx0RWxlbWVudDoiPGRpdj4iLG9wdGlvbnM6e2Rpc2FibGVkOiEx LGNyZWF0ZTpudWxsfSxfY3JlYXRlV2lkZ2V0OmZ1bmN0aW9uKGUscyl7cz10KHN8fHRoaXMu ZGVmYXVsdEVsZW1lbnR8fHRoaXMpWzBdLHRoaXMuZWxlbWVudD10KHMpLHRoaXMudXVpZD1p KyssdGhpcy5ldmVudE5hbWVzcGFjZT0iLiIrdGhpcy53aWRnZXROYW1lK3RoaXMudXVpZCx0 aGlzLm9wdGlvbnM9dC53aWRnZXQuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyx0aGlzLl9nZXRD cmVhdGVPcHRpb25zKCksZSksdGhpcy5iaW5kaW5ncz10KCksdGhpcy5ob3ZlcmFibGU9dCgp LHRoaXMuZm9jdXNhYmxlPXQoKSxzIT09dGhpcyYmKHQuZGF0YShzLHRoaXMud2lkZ2V0RnVs bE5hbWUsdGhpcyksdGhpcy5fb24oITAsdGhpcy5lbGVtZW50LHtyZW1vdmU6ZnVuY3Rpb24o dCl7dC50YXJnZXQ9PT1zJiZ0aGlzLmRlc3Ryb3koKX19KSx0aGlzLmRvY3VtZW50PXQocy5z dHlsZT9zLm93bmVyRG9jdW1lbnQ6cy5kb2N1bWVudHx8cyksdGhpcy53aW5kb3c9dCh0aGlz LmRvY3VtZW50WzBdLmRlZmF1bHRWaWV3fHx0aGlzLmRvY3VtZW50WzBdLnBhcmVudFdpbmRv dykpLHRoaXMuX2NyZWF0ZSgpLHRoaXMuX3RyaWdnZXIoImNyZWF0ZSIsbnVsbCx0aGlzLl9n ZXRDcmVhdGVFdmVudERhdGEoKSksdGhpcy5faW5pdCgpfSxfZ2V0Q3JlYXRlT3B0aW9uczp0 Lm5vb3AsX2dldENyZWF0ZUV2ZW50RGF0YTp0Lm5vb3AsX2NyZWF0ZTp0Lm5vb3AsX2luaXQ6 dC5ub29wLGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95KCksdGhpcy5lbGVtZW50 LnVuYmluZCh0aGlzLmV2ZW50TmFtZXNwYWNlKS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFt ZSkucmVtb3ZlRGF0YSh0aGlzLndpZGdldEZ1bGxOYW1lKS5yZW1vdmVEYXRhKHQuY2FtZWxD YXNlKHRoaXMud2lkZ2V0RnVsbE5hbWUpKSx0aGlzLndpZGdldCgpLnVuYmluZCh0aGlzLmV2 ZW50TmFtZXNwYWNlKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIikucmVtb3ZlQ2xhc3Mo dGhpcy53aWRnZXRGdWxsTmFtZSsiLWRpc2FibGVkICIrInVpLXN0YXRlLWRpc2FibGVkIiks dGhpcy5iaW5kaW5ncy51bmJpbmQodGhpcy5ldmVudE5hbWVzcGFjZSksdGhpcy5ob3ZlcmFi bGUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5mb2N1c2FibGUucmVtb3Zl Q2xhc3MoInVpLXN0YXRlLWZvY3VzIil9LF9kZXN0cm95OnQubm9vcCx3aWRnZXQ6ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5lbGVtZW50fSxvcHRpb246ZnVuY3Rpb24oaSxzKXt2YXIgbixv LGEscj1pO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LndpZGdldC5leHRlbmQo e30sdGhpcy5vcHRpb25zKTtpZigic3RyaW5nIj09dHlwZW9mIGkpaWYocj17fSxuPWkuc3Bs aXQoIi4iKSxpPW4uc2hpZnQoKSxuLmxlbmd0aCl7Zm9yKG89cltpXT10LndpZGdldC5leHRl bmQoe30sdGhpcy5vcHRpb25zW2ldKSxhPTA7bi5sZW5ndGgtMT5hO2ErKylvW25bYV1dPW9b blthXV18fHt9LG89b1tuW2FdXTtpZihpPW4ucG9wKCkscz09PWUpcmV0dXJuIG9baV09PT1l P251bGw6b1tpXTtvW2ldPXN9ZWxzZXtpZihzPT09ZSlyZXR1cm4gdGhpcy5vcHRpb25zW2ld PT09ZT9udWxsOnRoaXMub3B0aW9uc1tpXTtyW2ldPXN9cmV0dXJuIHRoaXMuX3NldE9wdGlv bnMociksdGhpc30sX3NldE9wdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGUgaW4gdCl0 aGlzLl9zZXRPcHRpb24oZSx0W2VdKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlv bih0LGUpe3JldHVybiB0aGlzLm9wdGlvbnNbdF09ZSwiZGlzYWJsZWQiPT09dCYmKHRoaXMu d2lkZ2V0KCkudG9nZ2xlQ2xhc3ModGhpcy53aWRnZXRGdWxsTmFtZSsiLWRpc2FibGVkIHVp LXN0YXRlLWRpc2FibGVkIiwhIWUpLmF0dHIoImFyaWEtZGlzYWJsZWQiLGUpLHRoaXMuaG92 ZXJhYmxlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXMuZm9jdXNhYmxlLnJl bW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXty ZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsITEpfSxkaXNhYmxlOmZ1bmN0aW9u KCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLCEwKX0sX29uOmZ1bmN0aW9u KGkscyxuKXt2YXIgbyxhPXRoaXM7ImJvb2xlYW4iIT10eXBlb2YgaSYmKG49cyxzPWksaT0h MSksbj8ocz1vPXQocyksdGhpcy5iaW5kaW5ncz10aGlzLmJpbmRpbmdzLmFkZChzKSk6KG49 cyxzPXRoaXMuZWxlbWVudCxvPXRoaXMud2lkZ2V0KCkpLHQuZWFjaChuLGZ1bmN0aW9uKG4s cil7ZnVuY3Rpb24gaCgpe3JldHVybiBpfHxhLm9wdGlvbnMuZGlzYWJsZWQhPT0hMCYmIXQo dGhpcykuaGFzQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIik/KCJzdHJpbmciPT10eXBlb2Yg cj9hW3JdOnIpLmFwcGx5KGEsYXJndW1lbnRzKTplfSJzdHJpbmciIT10eXBlb2YgciYmKGgu Z3VpZD1yLmd1aWQ9ci5ndWlkfHxoLmd1aWR8fHQuZ3VpZCsrKTt2YXIgbD1uLm1hdGNoKC9e KFx3KylccyooLiopJC8pLGM9bFsxXSthLmV2ZW50TmFtZXNwYWNlLHU9bFsyXTt1P28uZGVs ZWdhdGUodSxjLGgpOnMuYmluZChjLGgpfSl9LF9vZmY6ZnVuY3Rpb24odCxlKXtlPShlfHwi Iikuc3BsaXQoIiAiKS5qb2luKHRoaXMuZXZlbnROYW1lc3BhY2UrIiAiKSt0aGlzLmV2ZW50 TmFtZXNwYWNlLHQudW5iaW5kKGUpLnVuZGVsZWdhdGUoZSl9LF9kZWxheTpmdW5jdGlvbih0 LGUpe2Z1bmN0aW9uIGkoKXtyZXR1cm4oInN0cmluZyI9PXR5cGVvZiB0P3NbdF06dCkuYXBw bHkocyxhcmd1bWVudHMpfXZhciBzPXRoaXM7cmV0dXJuIHNldFRpbWVvdXQoaSxlfHwwKX0s X2hvdmVyYWJsZTpmdW5jdGlvbihlKXt0aGlzLmhvdmVyYWJsZT10aGlzLmhvdmVyYWJsZS5h ZGQoZSksdGhpcy5fb24oZSx7bW91c2VlbnRlcjpmdW5jdGlvbihlKXt0KGUuY3VycmVudFRh cmdldCkuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LG1vdXNlbGVhdmU6ZnVuY3Rpb24o ZSl7dChlLmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfX0p fSxfZm9jdXNhYmxlOmZ1bmN0aW9uKGUpe3RoaXMuZm9jdXNhYmxlPXRoaXMuZm9jdXNhYmxl LmFkZChlKSx0aGlzLl9vbihlLHtmb2N1c2luOmZ1bmN0aW9uKGUpe3QoZS5jdXJyZW50VGFy Z2V0KS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0sZm9jdXNvdXQ6ZnVuY3Rpb24oZSl7 dChlLmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfX0pfSxf dHJpZ2dlcjpmdW5jdGlvbihlLGkscyl7dmFyIG4sbyxhPXRoaXMub3B0aW9uc1tlXTtpZihz PXN8fHt9LGk9dC5FdmVudChpKSxpLnR5cGU9KGU9PT10aGlzLndpZGdldEV2ZW50UHJlZml4 P2U6dGhpcy53aWRnZXRFdmVudFByZWZpeCtlKS50b0xvd2VyQ2FzZSgpLGkudGFyZ2V0PXRo aXMuZWxlbWVudFswXSxvPWkub3JpZ2luYWxFdmVudClmb3IobiBpbiBvKW4gaW4gaXx8KGlb bl09b1tuXSk7cmV0dXJuIHRoaXMuZWxlbWVudC50cmlnZ2VyKGkscyksISh0LmlzRnVuY3Rp b24oYSkmJmEuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtpXS5jb25jYXQocykpPT09ITF8fGku aXNEZWZhdWx0UHJldmVudGVkKCkpfX0sdC5lYWNoKHtzaG93OiJmYWRlSW4iLGhpZGU6ImZh ZGVPdXQifSxmdW5jdGlvbihlLGkpe3QuV2lkZ2V0LnByb3RvdHlwZVsiXyIrZV09ZnVuY3Rp b24ocyxuLG8peyJzdHJpbmciPT10eXBlb2YgbiYmKG49e2VmZmVjdDpufSk7dmFyIGEscj1u P249PT0hMHx8Im51bWJlciI9PXR5cGVvZiBuP2k6bi5lZmZlY3R8fGk6ZTtuPW58fHt9LCJu dW1iZXIiPT10eXBlb2YgbiYmKG49e2R1cmF0aW9uOm59KSxhPSF0LmlzRW1wdHlPYmplY3Qo biksbi5jb21wbGV0ZT1vLG4uZGVsYXkmJnMuZGVsYXkobi5kZWxheSksYSYmdC5lZmZlY3Rz JiZ0LmVmZmVjdHMuZWZmZWN0W3JdP3NbZV0obik6ciE9PWUmJnNbcl0/c1tyXShuLmR1cmF0 aW9uLG4uZWFzaW5nLG8pOnMucXVldWUoZnVuY3Rpb24oaSl7dCh0aGlzKVtlXSgpLG8mJm8u Y2FsbChzWzBdKSxpKCl9KX19KX0pKGpRdWVyeSk7KGZ1bmN0aW9uKHQpe3ZhciBlPSExO3Qo ZG9jdW1lbnQpLm1vdXNldXAoZnVuY3Rpb24oKXtlPSExfSksdC53aWRnZXQoInVpLm1vdXNl Iix7dmVyc2lvbjoiMS4xMC4zIixvcHRpb25zOntjYW5jZWw6ImlucHV0LHRleHRhcmVhLGJ1 dHRvbixzZWxlY3Qsb3B0aW9uIixkaXN0YW5jZToxLGRlbGF5OjB9LF9tb3VzZUluaXQ6ZnVu Y3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZWxlbWVudC5iaW5kKCJtb3VzZWRvd24uIit0aGlz LndpZGdldE5hbWUsZnVuY3Rpb24odCl7cmV0dXJuIGUuX21vdXNlRG93bih0KX0pLmJpbmQo ImNsaWNrLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGkpe3JldHVybiEwPT09dC5kYXRh KGkudGFyZ2V0LGUud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50Iik/KHQucmVtb3Zl RGF0YShpLnRhcmdldCxlLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLGkuc3Rv cEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksITEpOnVuZGVmaW5lZH0pLHRoaXMuc3RhcnRlZD0h MX0sX21vdXNlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC51bmJpbmQoIi4iK3Ro aXMud2lkZ2V0TmFtZSksdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUmJnQoZG9jdW1lbnQpLnVu YmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVn YXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERl bGVnYXRlKX0sX21vdXNlRG93bjpmdW5jdGlvbihpKXtpZighZSl7dGhpcy5fbW91c2VTdGFy dGVkJiZ0aGlzLl9tb3VzZVVwKGkpLHRoaXMuX21vdXNlRG93bkV2ZW50PWk7dmFyIHM9dGhp cyxuPTE9PT1pLndoaWNoLGE9InN0cmluZyI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuY2FuY2Vs JiZpLnRhcmdldC5ub2RlTmFtZT90KGkudGFyZ2V0KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5j YW5jZWwpLmxlbmd0aDohMTtyZXR1cm4gbiYmIWEmJnRoaXMuX21vdXNlQ2FwdHVyZShpKT8o dGhpcy5tb3VzZURlbGF5TWV0PSF0aGlzLm9wdGlvbnMuZGVsYXksdGhpcy5tb3VzZURlbGF5 TWV0fHwodGhpcy5fbW91c2VEZWxheVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLm1v dXNlRGVsYXlNZXQ9ITB9LHRoaXMub3B0aW9ucy5kZWxheSkpLHRoaXMuX21vdXNlRGlzdGFu Y2VNZXQoaSkmJnRoaXMuX21vdXNlRGVsYXlNZXQoaSkmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9 dGhpcy5fbW91c2VTdGFydChpKSE9PSExLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpPyhpLnByZXZl bnREZWZhdWx0KCksITApOighMD09PXQuZGF0YShpLnRhcmdldCx0aGlzLndpZGdldE5hbWUr Ii5wcmV2ZW50Q2xpY2tFdmVudCIpJiZ0LnJlbW92ZURhdGEoaS50YXJnZXQsdGhpcy53aWRn ZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZT1m dW5jdGlvbih0KXtyZXR1cm4gcy5fbW91c2VNb3ZlKHQpfSx0aGlzLl9tb3VzZVVwRGVsZWdh dGU9ZnVuY3Rpb24odCl7cmV0dXJuIHMuX21vdXNlVXAodCl9LHQoZG9jdW1lbnQpLmJpbmQo Im1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSku YmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUp LGkucHJldmVudERlZmF1bHQoKSxlPSEwLCEwKSk6ITB9fSxfbW91c2VNb3ZlOmZ1bmN0aW9u KGUpe3JldHVybiB0LnVpLmllJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OT5kb2N1bWVu dC5kb2N1bWVudE1vZGUpJiYhZS5idXR0b24/dGhpcy5fbW91c2VVcChlKTp0aGlzLl9tb3Vz ZVN0YXJ0ZWQ/KHRoaXMuX21vdXNlRHJhZyhlKSxlLnByZXZlbnREZWZhdWx0KCkpOih0aGlz Ll9tb3VzZURpc3RhbmNlTWV0KGUpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KGUpJiYodGhpcy5f bW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsZSkh PT0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQ/dGhpcy5fbW91c2VEcmFnKGUpOnRoaXMuX21vdXNl VXAoZSkpLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpfSxfbW91c2VVcDpmdW5jdGlvbihlKXtyZXR1 cm4gdChkb2N1bWVudCkudW5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhp cy5fbW91c2VNb3ZlRGVsZWdhdGUpLnVuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFt ZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpLHRoaXMuX21vdXNlU3RhcnRlZCYmKHRoaXMuX21v dXNlU3RhcnRlZD0hMSxlLnRhcmdldD09PXRoaXMuX21vdXNlRG93bkV2ZW50LnRhcmdldCYm dC5kYXRhKGUudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50Iiwh MCksdGhpcy5fbW91c2VTdG9wKGUpKSwhMX0sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24o dCl7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VY LXQucGFnZVgpLE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZLXQucGFnZVkp KT49dGhpcy5vcHRpb25zLmRpc3RhbmNlfSxfbW91c2VEZWxheU1ldDpmdW5jdGlvbigpe3Jl dHVybiB0aGlzLm1vdXNlRGVsYXlNZXR9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKCl7fSxfbW91 c2VEcmFnOmZ1bmN0aW9uKCl7fSxfbW91c2VTdG9wOmZ1bmN0aW9uKCl7fSxfbW91c2VDYXB0 dXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShqUXVlcnkpOyhmdW5jdGlvbih0KXtmdW5j dGlvbiBlKHQsZSxpKXtyZXR1cm4gdD5lJiZlK2k+dH1mdW5jdGlvbiBpKHQpe3JldHVybi9s ZWZ0fHJpZ2h0Ly50ZXN0KHQuY3NzKCJmbG9hdCIpKXx8L2lubGluZXx0YWJsZS1jZWxsLy50 ZXN0KHQuY3NzKCJkaXNwbGF5IikpfXQud2lkZ2V0KCJ1aS5zb3J0YWJsZSIsdC51aS5tb3Vz ZSx7dmVyc2lvbjoiMS4xMC4zIix3aWRnZXRFdmVudFByZWZpeDoic29ydCIscmVhZHk6ITEs b3B0aW9uczp7YXBwZW5kVG86InBhcmVudCIsYXhpczohMSxjb25uZWN0V2l0aDohMSxjb250 YWlubWVudDohMSxjdXJzb3I6ImF1dG8iLGN1cnNvckF0OiExLGRyb3BPbkVtcHR5OiEwLGZv cmNlUGxhY2Vob2xkZXJTaXplOiExLGZvcmNlSGVscGVyU2l6ZTohMSxncmlkOiExLGhhbmRs ZTohMSxoZWxwZXI6Im9yaWdpbmFsIixpdGVtczoiPiAqIixvcGFjaXR5OiExLHBsYWNlaG9s ZGVyOiExLHJldmVydDohMSxzY3JvbGw6ITAsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xs U3BlZWQ6MjAsc2NvcGU6ImRlZmF1bHQiLHRvbGVyYW5jZToiaW50ZXJzZWN0Iix6SW5kZXg6 MWUzLGFjdGl2YXRlOm51bGwsYmVmb3JlU3RvcDpudWxsLGNoYW5nZTpudWxsLGRlYWN0aXZh dGU6bnVsbCxvdXQ6bnVsbCxvdmVyOm51bGwscmVjZWl2ZTpudWxsLHJlbW92ZTpudWxsLHNv cnQ6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbCx1cGRhdGU6bnVsbH0sX2NyZWF0ZTpmdW5j dGlvbigpe3ZhciB0PXRoaXMub3B0aW9uczt0aGlzLmNvbnRhaW5lckNhY2hlPXt9LHRoaXMu ZWxlbWVudC5hZGRDbGFzcygidWktc29ydGFibGUiKSx0aGlzLnJlZnJlc2goKSx0aGlzLmZs b2F0aW5nPXRoaXMuaXRlbXMubGVuZ3RoPyJ4Ij09PXQuYXhpc3x8aSh0aGlzLml0ZW1zWzBd Lml0ZW0pOiExLHRoaXMub2Zmc2V0PXRoaXMuZWxlbWVudC5vZmZzZXQoKSx0aGlzLl9tb3Vz ZUluaXQoKSx0aGlzLnJlYWR5PSEwfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVu dC5yZW1vdmVDbGFzcygidWktc29ydGFibGUgdWktc29ydGFibGUtZGlzYWJsZWQiKSx0aGlz Ll9tb3VzZURlc3Ryb3koKTtmb3IodmFyIHQ9dGhpcy5pdGVtcy5sZW5ndGgtMTt0Pj0wO3Qt LSl0aGlzLml0ZW1zW3RdLml0ZW0ucmVtb3ZlRGF0YSh0aGlzLndpZGdldE5hbWUrIi1pdGVt Iik7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSxpKXsiZGlzYWJsZWQiPT09 ZT8odGhpcy5vcHRpb25zW2VdPWksdGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcygidWktc29y dGFibGUtZGlzYWJsZWQiLCEhaSkpOnQuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFw cGx5KHRoaXMsYXJndW1lbnRzKX0sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihlLGkpe3ZhciBz PW51bGwsbj0hMSxvPXRoaXM7cmV0dXJuIHRoaXMucmV2ZXJ0aW5nPyExOnRoaXMub3B0aW9u cy5kaXNhYmxlZHx8InN0YXRpYyI9PT10aGlzLm9wdGlvbnMudHlwZT8hMToodGhpcy5fcmVm cmVzaEl0ZW1zKGUpLHQoZS50YXJnZXQpLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7cmV0 dXJuIHQuZGF0YSh0aGlzLG8ud2lkZ2V0TmFtZSsiLWl0ZW0iKT09PW8/KHM9dCh0aGlzKSwh MSk6dW5kZWZpbmVkfSksdC5kYXRhKGUudGFyZ2V0LG8ud2lkZ2V0TmFtZSsiLWl0ZW0iKT09 PW8mJihzPXQoZS50YXJnZXQpKSxzPyF0aGlzLm9wdGlvbnMuaGFuZGxlfHxpfHwodCh0aGlz Lm9wdGlvbnMuaGFuZGxlLHMpLmZpbmQoIioiKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigp e3RoaXM9PT1lLnRhcmdldCYmKG49ITApfSksbik/KHRoaXMuY3VycmVudEl0ZW09cyx0aGlz Ll9yZW1vdmVDdXJyZW50c0Zyb21JdGVtcygpLCEwKTohMTohMSl9LF9tb3VzZVN0YXJ0OmZ1 bmN0aW9uKGUsaSxzKXt2YXIgbixvLGE9dGhpcy5vcHRpb25zO2lmKHRoaXMuY3VycmVudENv bnRhaW5lcj10aGlzLHRoaXMucmVmcmVzaFBvc2l0aW9ucygpLHRoaXMuaGVscGVyPXRoaXMu X2NyZWF0ZUhlbHBlcihlKSx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksdGhpcy5f Y2FjaGVNYXJnaW5zKCksdGhpcy5zY3JvbGxQYXJlbnQ9dGhpcy5oZWxwZXIuc2Nyb2xsUGFy ZW50KCksdGhpcy5vZmZzZXQ9dGhpcy5jdXJyZW50SXRlbS5vZmZzZXQoKSx0aGlzLm9mZnNl dD17dG9wOnRoaXMub2Zmc2V0LnRvcC10aGlzLm1hcmdpbnMudG9wLGxlZnQ6dGhpcy5vZmZz ZXQubGVmdC10aGlzLm1hcmdpbnMubGVmdH0sdC5leHRlbmQodGhpcy5vZmZzZXQse2NsaWNr OntsZWZ0OmUucGFnZVgtdGhpcy5vZmZzZXQubGVmdCx0b3A6ZS5wYWdlWS10aGlzLm9mZnNl dC50b3B9LHBhcmVudDp0aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSxyZWxhdGl2ZTp0aGlzLl9n ZXRSZWxhdGl2ZU9mZnNldCgpfSksdGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIsImFic29s dXRlIiksdGhpcy5jc3NQb3NpdGlvbj10aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiksdGhp cy5vcmlnaW5hbFBvc2l0aW9uPXRoaXMuX2dlbmVyYXRlUG9zaXRpb24oZSksdGhpcy5vcmln aW5hbFBhZ2VYPWUucGFnZVgsdGhpcy5vcmlnaW5hbFBhZ2VZPWUucGFnZVksYS5jdXJzb3JB dCYmdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihhLmN1cnNvckF0KSx0aGlzLmRvbVBv c2l0aW9uPXtwcmV2OnRoaXMuY3VycmVudEl0ZW0ucHJldigpWzBdLHBhcmVudDp0aGlzLmN1 cnJlbnRJdGVtLnBhcmVudCgpWzBdfSx0aGlzLmhlbHBlclswXSE9PXRoaXMuY3VycmVudEl0 ZW1bMF0mJnRoaXMuY3VycmVudEl0ZW0uaGlkZSgpLHRoaXMuX2NyZWF0ZVBsYWNlaG9sZGVy KCksYS5jb250YWlubWVudCYmdGhpcy5fc2V0Q29udGFpbm1lbnQoKSxhLmN1cnNvciYmImF1 dG8iIT09YS5jdXJzb3ImJihvPXRoaXMuZG9jdW1lbnQuZmluZCgiYm9keSIpLHRoaXMuc3Rv cmVkQ3Vyc29yPW8uY3NzKCJjdXJzb3IiKSxvLmNzcygiY3Vyc29yIixhLmN1cnNvciksdGhp cy5zdG9yZWRTdHlsZXNoZWV0PXQoIjxzdHlsZT4qeyBjdXJzb3I6ICIrYS5jdXJzb3IrIiAh aW1wb3J0YW50OyB9PC9zdHlsZT4iKS5hcHBlbmRUbyhvKSksYS5vcGFjaXR5JiYodGhpcy5o ZWxwZXIuY3NzKCJvcGFjaXR5IikmJih0aGlzLl9zdG9yZWRPcGFjaXR5PXRoaXMuaGVscGVy LmNzcygib3BhY2l0eSIpKSx0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiLGEub3BhY2l0eSkp LGEuekluZGV4JiYodGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSYmKHRoaXMuX3N0b3JlZFpJ bmRleD10aGlzLmhlbHBlci5jc3MoInpJbmRleCIpKSx0aGlzLmhlbHBlci5jc3MoInpJbmRl eCIsYS56SW5kZXgpKSx0aGlzLnNjcm9sbFBhcmVudFswXSE9PWRvY3VtZW50JiYiSFRNTCIh PT10aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lJiYodGhpcy5vdmVyZmxvd09mZnNldD10 aGlzLnNjcm9sbFBhcmVudC5vZmZzZXQoKSksdGhpcy5fdHJpZ2dlcigic3RhcnQiLGUsdGhp cy5fdWlIYXNoKCkpLHRoaXMuX3ByZXNlcnZlSGVscGVyUHJvcG9ydGlvbnN8fHRoaXMuX2Nh Y2hlSGVscGVyUHJvcG9ydGlvbnMoKSwhcylmb3Iobj10aGlzLmNvbnRhaW5lcnMubGVuZ3Ro LTE7bj49MDtuLS0pdGhpcy5jb250YWluZXJzW25dLl90cmlnZ2VyKCJhY3RpdmF0ZSIsZSx0 aGlzLl91aUhhc2godGhpcykpO3JldHVybiB0LnVpLmRkbWFuYWdlciYmKHQudWkuZGRtYW5h Z2VyLmN1cnJlbnQ9dGhpcyksdC51aS5kZG1hbmFnZXImJiFhLmRyb3BCZWhhdmlvdXImJnQu dWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsZSksdGhpcy5kcmFnZ2luZz0hMCx0 aGlzLmhlbHBlci5hZGRDbGFzcygidWktc29ydGFibGUtaGVscGVyIiksdGhpcy5fbW91c2VE cmFnKGUpLCEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGUpe3ZhciBpLHMsbixvLGE9dGhpcy5v cHRpb25zLHI9ITE7Zm9yKHRoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihl KSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIp LHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3Np dGlvbkFicyksdGhpcy5vcHRpb25zLnNjcm9sbCYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09 ZG9jdW1lbnQmJiJIVE1MIiE9PXRoaXMuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWU/KHRoaXMu b3ZlcmZsb3dPZmZzZXQudG9wK3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodC1l LnBhZ2VZPGEuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xs VG9wPXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK2Euc2Nyb2xsU3BlZWQ6ZS5w YWdlWS10aGlzLm92ZXJmbG93T2Zmc2V0LnRvcDxhLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhp cy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPXI9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Ny b2xsVG9wLWEuc2Nyb2xsU3BlZWQpLHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCt0aGlzLnNj cm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC1lLnBhZ2VYPGEuc2Nyb2xsU2Vuc2l0aXZpdHk/ dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBd LnNjcm9sbExlZnQrYS5zY3JvbGxTcGVlZDplLnBhZ2VYLXRoaXMub3ZlcmZsb3dPZmZzZXQu bGVmdDxhLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xs TGVmdD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtYS5zY3JvbGxTcGVlZCkp OihlLnBhZ2VZLXQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGEuc2Nyb2xsU2Vuc2l0aXZpdHk/ cj10KGRvY3VtZW50KS5zY3JvbGxUb3AodChkb2N1bWVudCkuc2Nyb2xsVG9wKCktYS5zY3Jv bGxTcGVlZCk6dCh3aW5kb3cpLmhlaWdodCgpLShlLnBhZ2VZLXQoZG9jdW1lbnQpLnNjcm9s bFRvcCgpKTxhLnNjcm9sbFNlbnNpdGl2aXR5JiYocj10KGRvY3VtZW50KS5zY3JvbGxUb3Ao dChkb2N1bWVudCkuc2Nyb2xsVG9wKCkrYS5zY3JvbGxTcGVlZCkpLGUucGFnZVgtdChkb2N1 bWVudCkuc2Nyb2xsTGVmdCgpPGEuc2Nyb2xsU2Vuc2l0aXZpdHk/cj10KGRvY3VtZW50KS5z Y3JvbGxMZWZ0KHQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKS1hLnNjcm9sbFNwZWVkKTp0KHdp bmRvdykud2lkdGgoKS0oZS5wYWdlWC10KGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpPGEuc2Ny b2xsU2Vuc2l0aXZpdHkmJihyPXQoZG9jdW1lbnQpLnNjcm9sbExlZnQodChkb2N1bWVudCku c2Nyb2xsTGVmdCgpK2Euc2Nyb2xsU3BlZWQpKSksciE9PSExJiZ0LnVpLmRkbWFuYWdlciYm IWEuZHJvcEJlaGF2aW91ciYmdC51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxl KSksdGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUi KSx0aGlzLm9wdGlvbnMuYXhpcyYmInkiPT09dGhpcy5vcHRpb25zLmF4aXN8fCh0aGlzLmhl bHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiKSx0aGlzLm9wdGlv bnMuYXhpcyYmIngiPT09dGhpcy5vcHRpb25zLmF4aXN8fCh0aGlzLmhlbHBlclswXS5zdHls ZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4IiksaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+ PTA7aS0tKWlmKHM9dGhpcy5pdGVtc1tpXSxuPXMuaXRlbVswXSxvPXRoaXMuX2ludGVyc2Vj dHNXaXRoUG9pbnRlcihzKSxvJiZzLmluc3RhbmNlPT09dGhpcy5jdXJyZW50Q29udGFpbmVy JiZuIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5wbGFjZWhvbGRlclsxPT09bz8ibmV4 dCI6InByZXYiXSgpWzBdIT09biYmIXQuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSxu KSYmKCJzZW1pLWR5bmFtaWMiPT09dGhpcy5vcHRpb25zLnR5cGU/IXQuY29udGFpbnModGhp cy5lbGVtZW50WzBdLG4pOiEwKSl7aWYodGhpcy5kaXJlY3Rpb249MT09PW8/ImRvd24iOiJ1 cCIsInBvaW50ZXIiIT09dGhpcy5vcHRpb25zLnRvbGVyYW5jZSYmIXRoaXMuX2ludGVyc2Vj dHNXaXRoU2lkZXMocykpYnJlYWs7dGhpcy5fcmVhcnJhbmdlKGUscyksdGhpcy5fdHJpZ2dl cigiY2hhbmdlIixlLHRoaXMuX3VpSGFzaCgpKTticmVha31yZXR1cm4gdGhpcy5fY29udGFj dENvbnRhaW5lcnMoZSksdC51aS5kZG1hbmFnZXImJnQudWkuZGRtYW5hZ2VyLmRyYWcodGhp cyxlKSx0aGlzLl90cmlnZ2VyKCJzb3J0IixlLHRoaXMuX3VpSGFzaCgpKSx0aGlzLmxhc3RQ b3NpdGlvbkFicz10aGlzLnBvc2l0aW9uQWJzLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKGUs aSl7aWYoZSl7aWYodC51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91 ciYmdC51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLGUpLHRoaXMub3B0aW9ucy5yZXZlcnQpe3Zh ciBzPXRoaXMsbj10aGlzLnBsYWNlaG9sZGVyLm9mZnNldCgpLG89dGhpcy5vcHRpb25zLmF4 aXMsYT17fTtvJiYieCIhPT1vfHwoYS5sZWZ0PW4ubGVmdC10aGlzLm9mZnNldC5wYXJlbnQu bGVmdC10aGlzLm1hcmdpbnMubGVmdCsodGhpcy5vZmZzZXRQYXJlbnRbMF09PT1kb2N1bWVu dC5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsTGVmdCkpLG8mJiJ5IiE9PW98 fChhLnRvcD1uLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLXRoaXMubWFyZ2lucy50b3Ar KHRoaXMub2Zmc2V0UGFyZW50WzBdPT09ZG9jdW1lbnQuYm9keT8wOnRoaXMub2Zmc2V0UGFy ZW50WzBdLnNjcm9sbFRvcCkpLHRoaXMucmV2ZXJ0aW5nPSEwLHQodGhpcy5oZWxwZXIpLmFu aW1hdGUoYSxwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LDEwKXx8NTAwLGZ1bmN0aW9u KCl7cy5fY2xlYXIoZSl9KX1lbHNlIHRoaXMuX2NsZWFyKGUsaSk7cmV0dXJuITF9fSxjYW5j ZWw6ZnVuY3Rpb24oKXtpZih0aGlzLmRyYWdnaW5nKXt0aGlzLl9tb3VzZVVwKHt0YXJnZXQ6 bnVsbH0pLCJvcmlnaW5hbCI9PT10aGlzLm9wdGlvbnMuaGVscGVyP3RoaXMuY3VycmVudEl0 ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBl ciIpOnRoaXMuY3VycmVudEl0ZW0uc2hvdygpO2Zvcih2YXIgZT10aGlzLmNvbnRhaW5lcnMu bGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5jb250YWluZXJzW2VdLl90cmlnZ2VyKCJkZWFjdGl2 YXRlIixudWxsLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2VdLmNvbnRh aW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbZV0uX3RyaWdnZXIoIm91dCIsbnVs bCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tlXS5jb250YWluZXJDYWNo ZS5vdmVyPTApfXJldHVybiB0aGlzLnBsYWNlaG9sZGVyJiYodGhpcy5wbGFjZWhvbGRlclsw XS5wYXJlbnROb2RlJiZ0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hp bGQodGhpcy5wbGFjZWhvbGRlclswXSksIm9yaWdpbmFsIiE9PXRoaXMub3B0aW9ucy5oZWxw ZXImJnRoaXMuaGVscGVyJiZ0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlJiZ0aGlzLmhlbHBl ci5yZW1vdmUoKSx0LmV4dGVuZCh0aGlzLHtoZWxwZXI6bnVsbCxkcmFnZ2luZzohMSxyZXZl cnRpbmc6ITEsX25vRmluYWxTb3J0Om51bGx9KSx0aGlzLmRvbVBvc2l0aW9uLnByZXY/dCh0 aGlzLmRvbVBvc2l0aW9uLnByZXYpLmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOnQodGhpcy5k b21Qb3NpdGlvbi5wYXJlbnQpLnByZXBlbmQodGhpcy5jdXJyZW50SXRlbSkpLHRoaXN9LHNl cmlhbGl6ZTpmdW5jdGlvbihlKXt2YXIgaT10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KGUmJmUu Y29ubmVjdGVkKSxzPVtdO3JldHVybiBlPWV8fHt9LHQoaSkuZWFjaChmdW5jdGlvbigpe3Zh ciBpPSh0KGUuaXRlbXx8dGhpcykuYXR0cihlLmF0dHJpYnV0ZXx8ImlkIil8fCIiKS5tYXRj aChlLmV4cHJlc3Npb258fC8oLispW1wtPV9dKC4rKS8pO2kmJnMucHVzaCgoZS5rZXl8fGlb MV0rIltdIikrIj0iKyhlLmtleSYmZS5leHByZXNzaW9uP2lbMV06aVsyXSkpfSksIXMubGVu Z3RoJiZlLmtleSYmcy5wdXNoKGUua2V5KyI9Iikscy5qb2luKCImIil9LHRvQXJyYXk6ZnVu Y3Rpb24oZSl7dmFyIGk9dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShlJiZlLmNvbm5lY3RlZCks cz1bXTtyZXR1cm4gZT1lfHx7fSxpLmVhY2goZnVuY3Rpb24oKXtzLnB1c2godChlLml0ZW18 fHRoaXMpLmF0dHIoZS5hdHRyaWJ1dGV8fCJpZCIpfHwiIil9KSxzfSxfaW50ZXJzZWN0c1dp dGg6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGk9ZSt0aGlzLmhl bHBlclByb3BvcnRpb25zLndpZHRoLHM9dGhpcy5wb3NpdGlvbkFicy50b3Asbj1zK3RoaXMu aGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LG89dC5sZWZ0LGE9byt0LndpZHRoLHI9dC50b3As aD1yK3QuaGVpZ2h0LGw9dGhpcy5vZmZzZXQuY2xpY2sudG9wLGM9dGhpcy5vZmZzZXQuY2xp Y2subGVmdCx1PSJ4Ij09PXRoaXMub3B0aW9ucy5heGlzfHxzK2w+ciYmaD5zK2wsZD0ieSI9 PT10aGlzLm9wdGlvbnMuYXhpc3x8ZStjPm8mJmE+ZStjLHA9dSYmZDtyZXR1cm4icG9pbnRl ciI9PT10aGlzLm9wdGlvbnMudG9sZXJhbmNlfHx0aGlzLm9wdGlvbnMuZm9yY2VQb2ludGVy Rm9yQ29udGFpbmVyc3x8InBvaW50ZXIiIT09dGhpcy5vcHRpb25zLnRvbGVyYW5jZSYmdGhp cy5oZWxwZXJQcm9wb3J0aW9uc1t0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdPnRb dGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT9wOmUrdGhpcy5oZWxwZXJQcm9wb3J0 aW9ucy53aWR0aC8yPm8mJmE+aS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzImJnMr dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMj5yJiZoPm4tdGhpcy5oZWxwZXJQcm9w b3J0aW9ucy5oZWlnaHQvMn0sX2ludGVyc2VjdHNXaXRoUG9pbnRlcjpmdW5jdGlvbih0KXt2 YXIgaT0ieCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8ZSh0aGlzLnBvc2l0aW9uQWJzLnRvcCt0 aGlzLm9mZnNldC5jbGljay50b3AsdC50b3AsdC5oZWlnaHQpLHM9InkiPT09dGhpcy5vcHRp b25zLmF4aXN8fGUodGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxl ZnQsdC5sZWZ0LHQud2lkdGgpLG49aSYmcyxvPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVj dGlvbigpLGE9dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtyZXR1cm4gbj90 aGlzLmZsb2F0aW5nP2EmJiJyaWdodCI9PT1hfHwiZG93biI9PT1vPzI6MTpvJiYoImRvd24i PT09bz8yOjEpOiExfSxfaW50ZXJzZWN0c1dpdGhTaWRlczpmdW5jdGlvbih0KXt2YXIgaT1l KHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCx0LnRvcCt0Lmhl aWdodC8yLHQuaGVpZ2h0KSxzPWUodGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0 LmNsaWNrLmxlZnQsdC5sZWZ0K3Qud2lkdGgvMix0LndpZHRoKSxuPXRoaXMuX2dldERyYWdW ZXJ0aWNhbERpcmVjdGlvbigpLG89dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24o KTtyZXR1cm4gdGhpcy5mbG9hdGluZyYmbz8icmlnaHQiPT09byYmc3x8ImxlZnQiPT09byYm IXM6biYmKCJkb3duIj09PW4mJml8fCJ1cCI9PT1uJiYhaSl9LF9nZXREcmFnVmVydGljYWxE aXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLmxh c3RQb3NpdGlvbkFicy50b3A7cmV0dXJuIDAhPT10JiYodD4wPyJkb3duIjoidXAiKX0sX2dl dERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wb3NpdGlv bkFicy5sZWZ0LXRoaXMubGFzdFBvc2l0aW9uQWJzLmxlZnQ7cmV0dXJuIDAhPT10JiYodD4w PyJyaWdodCI6ImxlZnQiKX0scmVmcmVzaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVm cmVzaEl0ZW1zKHQpLHRoaXMucmVmcmVzaFBvc2l0aW9ucygpLHRoaXN9LF9jb25uZWN0V2l0 aDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucztyZXR1cm4gdC5jb25uZWN0V2l0aC5j b25zdHJ1Y3Rvcj09PVN0cmluZz9bdC5jb25uZWN0V2l0aF06dC5jb25uZWN0V2l0aH0sX2dl dEl0ZW1zQXNqUXVlcnk6ZnVuY3Rpb24oZSl7dmFyIGkscyxuLG8sYT1bXSxyPVtdLGg9dGhp cy5fY29ubmVjdFdpdGgoKTtpZihoJiZlKWZvcihpPWgubGVuZ3RoLTE7aT49MDtpLS0pZm9y KG49dChoW2ldKSxzPW4ubGVuZ3RoLTE7cz49MDtzLS0pbz10LmRhdGEobltzXSx0aGlzLndp ZGdldEZ1bGxOYW1lKSxvJiZvIT09dGhpcyYmIW8ub3B0aW9ucy5kaXNhYmxlZCYmci5wdXNo KFt0LmlzRnVuY3Rpb24oby5vcHRpb25zLml0ZW1zKT9vLm9wdGlvbnMuaXRlbXMuY2FsbChv LmVsZW1lbnQpOnQoby5vcHRpb25zLml0ZW1zLG8uZWxlbWVudCkubm90KCIudWktc29ydGFi bGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSxvXSk7Zm9yKHIu cHVzaChbdC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcyk/dGhpcy5vcHRpb25zLml0 ZW1zLmNhbGwodGhpcy5lbGVtZW50LG51bGwse29wdGlvbnM6dGhpcy5vcHRpb25zLGl0ZW06 dGhpcy5jdXJyZW50SXRlbX0pOnQodGhpcy5vcHRpb25zLml0ZW1zLHRoaXMuZWxlbWVudCku bm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xk ZXIiKSx0aGlzXSksaT1yLmxlbmd0aC0xO2k+PTA7aS0tKXJbaV1bMF0uZWFjaChmdW5jdGlv bigpe2EucHVzaCh0aGlzKX0pO3JldHVybiB0KGEpfSxfcmVtb3ZlQ3VycmVudHNGcm9tSXRl bXM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmN1cnJlbnRJdGVtLmZpbmQoIjpkYXRhKCIrdGhp cy53aWRnZXROYW1lKyItaXRlbSkiKTt0aGlzLml0ZW1zPXQuZ3JlcCh0aGlzLml0ZW1zLGZ1 bmN0aW9uKHQpe2Zvcih2YXIgaT0wO2UubGVuZ3RoPmk7aSsrKWlmKGVbaV09PT10Lml0ZW1b MF0pcmV0dXJuITE7cmV0dXJuITB9KX0sX3JlZnJlc2hJdGVtczpmdW5jdGlvbihlKXt0aGlz Lml0ZW1zPVtdLHRoaXMuY29udGFpbmVycz1bdGhpc107dmFyIGkscyxuLG8sYSxyLGgsbCxj PXRoaXMuaXRlbXMsdT1bW3QuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMu b3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudFswXSxlLHtpdGVtOnRoaXMuY3VycmVu dEl0ZW19KTp0KHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLHRoaXNdXSxkPXRo aXMuX2Nvbm5lY3RXaXRoKCk7aWYoZCYmdGhpcy5yZWFkeSlmb3IoaT1kLmxlbmd0aC0xO2k+ PTA7aS0tKWZvcihuPXQoZFtpXSkscz1uLmxlbmd0aC0xO3M+PTA7cy0tKW89dC5kYXRhKG5b c10sdGhpcy53aWRnZXRGdWxsTmFtZSksbyYmbyE9PXRoaXMmJiFvLm9wdGlvbnMuZGlzYWJs ZWQmJih1LnB1c2goW3QuaXNGdW5jdGlvbihvLm9wdGlvbnMuaXRlbXMpP28ub3B0aW9ucy5p dGVtcy5jYWxsKG8uZWxlbWVudFswXSxlLHtpdGVtOnRoaXMuY3VycmVudEl0ZW19KTp0KG8u b3B0aW9ucy5pdGVtcyxvLmVsZW1lbnQpLG9dKSx0aGlzLmNvbnRhaW5lcnMucHVzaChvKSk7 Zm9yKGk9dS5sZW5ndGgtMTtpPj0wO2ktLSlmb3IoYT11W2ldWzFdLHI9dVtpXVswXSxzPTAs bD1yLmxlbmd0aDtsPnM7cysrKWg9dChyW3NdKSxoLmRhdGEodGhpcy53aWRnZXROYW1lKyIt aXRlbSIsYSksYy5wdXNoKHtpdGVtOmgsaW5zdGFuY2U6YSx3aWR0aDowLGhlaWdodDowLGxl ZnQ6MCx0b3A6MH0pfSxyZWZyZXNoUG9zaXRpb25zOmZ1bmN0aW9uKGUpe3RoaXMub2Zmc2V0 UGFyZW50JiZ0aGlzLmhlbHBlciYmKHRoaXMub2Zmc2V0LnBhcmVudD10aGlzLl9nZXRQYXJl bnRPZmZzZXQoKSk7dmFyIGkscyxuLG87Zm9yKGk9dGhpcy5pdGVtcy5sZW5ndGgtMTtpPj0w O2ktLSlzPXRoaXMuaXRlbXNbaV0scy5pbnN0YW5jZSE9PXRoaXMuY3VycmVudENvbnRhaW5l ciYmdGhpcy5jdXJyZW50Q29udGFpbmVyJiZzLml0ZW1bMF0hPT10aGlzLmN1cnJlbnRJdGVt WzBdfHwobj10aGlzLm9wdGlvbnMudG9sZXJhbmNlRWxlbWVudD90KHRoaXMub3B0aW9ucy50 b2xlcmFuY2VFbGVtZW50LHMuaXRlbSk6cy5pdGVtLGV8fChzLndpZHRoPW4ub3V0ZXJXaWR0 aCgpLHMuaGVpZ2h0PW4ub3V0ZXJIZWlnaHQoKSksbz1uLm9mZnNldCgpLHMubGVmdD1vLmxl ZnQscy50b3A9by50b3ApO2lmKHRoaXMub3B0aW9ucy5jdXN0b20mJnRoaXMub3B0aW9ucy5j dXN0b20ucmVmcmVzaENvbnRhaW5lcnMpdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29u dGFpbmVycy5jYWxsKHRoaXMpO2Vsc2UgZm9yKGk9dGhpcy5jb250YWluZXJzLmxlbmd0aC0x O2k+PTA7aS0tKW89dGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5j b250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLmxlZnQ9by5sZWZ0LHRoaXMuY29udGFpbmVy c1tpXS5jb250YWluZXJDYWNoZS50b3A9by50b3AsdGhpcy5jb250YWluZXJzW2ldLmNvbnRh aW5lckNhY2hlLndpZHRoPXRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVyV2lkdGgo KSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUuaGVpZ2h0PXRoaXMuY29udGFp bmVyc1tpXS5lbGVtZW50Lm91dGVySGVpZ2h0KCk7cmV0dXJuIHRoaXN9LF9jcmVhdGVQbGFj ZWhvbGRlcjpmdW5jdGlvbihlKXtlPWV8fHRoaXM7dmFyIGkscz1lLm9wdGlvbnM7cy5wbGFj ZWhvbGRlciYmcy5wbGFjZWhvbGRlci5jb25zdHJ1Y3RvciE9PVN0cmluZ3x8KGk9cy5wbGFj ZWhvbGRlcixzLnBsYWNlaG9sZGVyPXtlbGVtZW50OmZ1bmN0aW9uKCl7dmFyIHM9ZS5jdXJy ZW50SXRlbVswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49dCgiPCIrcysiPiIsZS5kb2N1 bWVudFswXSkuYWRkQ2xhc3MoaXx8ZS5jdXJyZW50SXRlbVswXS5jbGFzc05hbWUrIiB1aS1z b3J0YWJsZS1wbGFjZWhvbGRlciIpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIi KTtyZXR1cm4idHIiPT09cz9lLmN1cnJlbnRJdGVtLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlv bigpe3QoIjx0ZD4mIzE2MDs8L3RkPiIsZS5kb2N1bWVudFswXSkuYXR0cigiY29sc3BhbiIs dCh0aGlzKS5hdHRyKCJjb2xzcGFuIil8fDEpLmFwcGVuZFRvKG4pfSk6ImltZyI9PT1zJiZu LmF0dHIoInNyYyIsZS5jdXJyZW50SXRlbS5hdHRyKCJzcmMiKSksaXx8bi5jc3MoInZpc2li aWxpdHkiLCJoaWRkZW4iKSxufSx1cGRhdGU6ZnVuY3Rpb24odCxuKXsoIWl8fHMuZm9yY2VQ bGFjZWhvbGRlclNpemUpJiYobi5oZWlnaHQoKXx8bi5oZWlnaHQoZS5jdXJyZW50SXRlbS5p bm5lckhlaWdodCgpLXBhcnNlSW50KGUuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nVG9wIil8 fDAsMTApLXBhcnNlSW50KGUuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nQm90dG9tIil8fDAs MTApKSxuLndpZHRoKCl8fG4ud2lkdGgoZS5jdXJyZW50SXRlbS5pbm5lcldpZHRoKCktcGFy c2VJbnQoZS5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdMZWZ0Iil8fDAsMTApLXBhcnNlSW50 KGUuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nUmlnaHQiKXx8MCwxMCkpKX19KSxlLnBsYWNl aG9sZGVyPXQocy5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwoZS5lbGVtZW50LGUuY3VycmVu dEl0ZW0pKSxlLmN1cnJlbnRJdGVtLmFmdGVyKGUucGxhY2Vob2xkZXIpLHMucGxhY2Vob2xk ZXIudXBkYXRlKGUsZS5wbGFjZWhvbGRlcil9LF9jb250YWN0Q29udGFpbmVyczpmdW5jdGlv bihzKXt2YXIgbixvLGEscixoLGwsYyx1LGQscCxmPW51bGwsZz1udWxsO2ZvcihuPXRoaXMu Y29udGFpbmVycy5sZW5ndGgtMTtuPj0wO24tLSlpZighdC5jb250YWlucyh0aGlzLmN1cnJl bnRJdGVtWzBdLHRoaXMuY29udGFpbmVyc1tuXS5lbGVtZW50WzBdKSlpZih0aGlzLl9pbnRl cnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lcnNbbl0uY29udGFpbmVyQ2FjaGUpKXtpZihmJiZ0 LmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tuXS5lbGVtZW50WzBdLGYuZWxlbWVudFswXSkp Y29udGludWU7Zj10aGlzLmNvbnRhaW5lcnNbbl0sZz1ufWVsc2UgdGhpcy5jb250YWluZXJz W25dLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbbl0uX3RyaWdnZXIo Im91dCIscyx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tuXS5jb250YWlu ZXJDYWNoZS5vdmVyPTApO2lmKGYpaWYoMT09PXRoaXMuY29udGFpbmVycy5sZW5ndGgpdGhp cy5jb250YWluZXJzW2ddLmNvbnRhaW5lckNhY2hlLm92ZXJ8fCh0aGlzLmNvbnRhaW5lcnNb Z10uX3RyaWdnZXIoIm92ZXIiLHMsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5l cnNbZ10uY29udGFpbmVyQ2FjaGUub3Zlcj0xKTtlbHNle2ZvcihhPTFlNCxyPW51bGwscD1m LmZsb2F0aW5nfHxpKHRoaXMuY3VycmVudEl0ZW0pLGg9cD8ibGVmdCI6InRvcCIsbD1wPyJ3 aWR0aCI6ImhlaWdodCIsYz10aGlzLnBvc2l0aW9uQWJzW2hdK3RoaXMub2Zmc2V0LmNsaWNr W2hdLG89dGhpcy5pdGVtcy5sZW5ndGgtMTtvPj0wO28tLSl0LmNvbnRhaW5zKHRoaXMuY29u dGFpbmVyc1tnXS5lbGVtZW50WzBdLHRoaXMuaXRlbXNbb10uaXRlbVswXSkmJnRoaXMuaXRl bXNbb10uaXRlbVswXSE9PXRoaXMuY3VycmVudEl0ZW1bMF0mJighcHx8ZSh0aGlzLnBvc2l0 aW9uQWJzLnRvcCt0aGlzLm9mZnNldC5jbGljay50b3AsdGhpcy5pdGVtc1tvXS50b3AsdGhp cy5pdGVtc1tvXS5oZWlnaHQpKSYmKHU9dGhpcy5pdGVtc1tvXS5pdGVtLm9mZnNldCgpW2hd LGQ9ITEsTWF0aC5hYnModS1jKT5NYXRoLmFicyh1K3RoaXMuaXRlbXNbb11bbF0tYykmJihk PSEwLHUrPXRoaXMuaXRlbXNbb11bbF0pLGE+TWF0aC5hYnModS1jKSYmKGE9TWF0aC5hYnMo dS1jKSxyPXRoaXMuaXRlbXNbb10sdGhpcy5kaXJlY3Rpb249ZD8idXAiOiJkb3duIikpO2lm KCFyJiYhdGhpcy5vcHRpb25zLmRyb3BPbkVtcHR5KXJldHVybjtpZih0aGlzLmN1cnJlbnRD b250YWluZXI9PT10aGlzLmNvbnRhaW5lcnNbZ10pcmV0dXJuO3I/dGhpcy5fcmVhcnJhbmdl KHMscixudWxsLCEwKTp0aGlzLl9yZWFycmFuZ2UocyxudWxsLHRoaXMuY29udGFpbmVyc1tn XS5lbGVtZW50LCEwKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHMsdGhpcy5fdWlIYXNoKCkp LHRoaXMuY29udGFpbmVyc1tnXS5fdHJpZ2dlcigiY2hhbmdlIixzLHRoaXMuX3VpSGFzaCh0 aGlzKSksdGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMuY29udGFpbmVyc1tnXSx0aGlzLm9w dGlvbnMucGxhY2Vob2xkZXIudXBkYXRlKHRoaXMuY3VycmVudENvbnRhaW5lcix0aGlzLnBs YWNlaG9sZGVyKSx0aGlzLmNvbnRhaW5lcnNbZ10uX3RyaWdnZXIoIm92ZXIiLHMsdGhpcy5f dWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbZ10uY29udGFpbmVyQ2FjaGUub3Zlcj0x fX0sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihlKXt2YXIgaT10aGlzLm9wdGlvbnMscz10Lmlz RnVuY3Rpb24oaS5oZWxwZXIpP3QoaS5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtl LHRoaXMuY3VycmVudEl0ZW1dKSk6ImNsb25lIj09PWkuaGVscGVyP3RoaXMuY3VycmVudEl0 ZW0uY2xvbmUoKTp0aGlzLmN1cnJlbnRJdGVtO3JldHVybiBzLnBhcmVudHMoImJvZHkiKS5s ZW5ndGh8fHQoInBhcmVudCIhPT1pLmFwcGVuZFRvP2kuYXBwZW5kVG86dGhpcy5jdXJyZW50 SXRlbVswXS5wYXJlbnROb2RlKVswXS5hcHBlbmRDaGlsZChzWzBdKSxzWzBdPT09dGhpcy5j dXJyZW50SXRlbVswXSYmKHRoaXMuX3N0b3JlZENTUz17d2lkdGg6dGhpcy5jdXJyZW50SXRl bVswXS5zdHlsZS53aWR0aCxoZWlnaHQ6dGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS5oZWln aHQscG9zaXRpb246dGhpcy5jdXJyZW50SXRlbS5jc3MoInBvc2l0aW9uIiksdG9wOnRoaXMu Y3VycmVudEl0ZW0uY3NzKCJ0b3AiKSxsZWZ0OnRoaXMuY3VycmVudEl0ZW0uY3NzKCJsZWZ0 Iil9KSwoIXNbMF0uc3R5bGUud2lkdGh8fGkuZm9yY2VIZWxwZXJTaXplKSYmcy53aWR0aCh0 aGlzLmN1cnJlbnRJdGVtLndpZHRoKCkpLCghc1swXS5zdHlsZS5oZWlnaHR8fGkuZm9yY2VI ZWxwZXJTaXplKSYmcy5oZWlnaHQodGhpcy5jdXJyZW50SXRlbS5oZWlnaHQoKSksc30sX2Fk anVzdE9mZnNldEZyb21IZWxwZXI6ZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlJiYo ZT1lLnNwbGl0KCIgIikpLHQuaXNBcnJheShlKSYmKGU9e2xlZnQ6K2VbMF0sdG9wOitlWzFd fHwwfSksImxlZnQiaW4gZSYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9ZS5sZWZ0K3RoaXMu bWFyZ2lucy5sZWZ0KSwicmlnaHQiaW4gZSYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dGhp cy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC1lLnJpZ2h0K3RoaXMubWFyZ2lucy5sZWZ0KSwi dG9wImluIGUmJih0aGlzLm9mZnNldC5jbGljay50b3A9ZS50b3ArdGhpcy5tYXJnaW5zLnRv cCksImJvdHRvbSJpbiBlJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJv cG9ydGlvbnMuaGVpZ2h0LWUuYm90dG9tK3RoaXMubWFyZ2lucy50b3ApfSxfZ2V0UGFyZW50 T2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0 UGFyZW50KCk7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7cmV0dXJuImFic29s dXRlIj09PXRoaXMuY3NzUG9zaXRpb24mJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT09ZG9jdW1l bnQmJnQuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRb MF0pJiYoZS5sZWZ0Kz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCksZS50b3ArPXRo aXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKSwodGhpcy5vZmZzZXRQYXJlbnRbMF09PT1k b2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiYiaHRtbCI9PT10 aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJnQudWkuaWUpJiYo ZT17dG9wOjAsbGVmdDowfSkse3RvcDplLnRvcCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJl bnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCksbGVmdDplLmxlZnQrKHBhcnNlSW50 KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKX19LF9n ZXRSZWxhdGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKCJyZWxhdGl2ZSI9PT10aGlzLmNzc1Bv c2l0aW9uKXt2YXIgdD10aGlzLmN1cnJlbnRJdGVtLnBvc2l0aW9uKCk7cmV0dXJue3RvcDp0 LnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Ny b2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6dC5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBl ci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19 cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1h cmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpbkxlZnQi KSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5Ub3Ai KSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVs cGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6 dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigp e3ZhciBlLGkscyxuPXRoaXMub3B0aW9uczsicGFyZW50Ij09PW4uY29udGFpbm1lbnQmJihu LmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpLCgiZG9jdW1lbnQiPT09 bi5jb250YWlubWVudHx8IndpbmRvdyI9PT1uLmNvbnRhaW5tZW50KSYmKHRoaXMuY29udGFp bm1lbnQ9WzAtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQu bGVmdCwwLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9w LHQoImRvY3VtZW50Ij09PW4uY29udGFpbm1lbnQ/ZG9jdW1lbnQ6d2luZG93KS53aWR0aCgp LXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsKHQoImRv Y3VtZW50Ij09PW4uY29udGFpbm1lbnQ/ZG9jdW1lbnQ6d2luZG93KS5oZWlnaHQoKXx8ZG9j dW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodCktdGhpcy5oZWxwZXJQcm9wb3J0 aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF0pLC9eKGRvY3VtZW50fHdpbmRvd3xwYXJl bnQpJC8udGVzdChuLmNvbnRhaW5tZW50KXx8KGU9dChuLmNvbnRhaW5tZW50KVswXSxpPXQo bi5jb250YWlubWVudCkub2Zmc2V0KCkscz0iaGlkZGVuIiE9PXQoZSkuY3NzKCJvdmVyZmxv dyIpLHRoaXMuY29udGFpbm1lbnQ9W2kubGVmdCsocGFyc2VJbnQodChlKS5jc3MoImJvcmRl ckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KHQoZSkuY3NzKCJwYWRkaW5nTGVmdCIp LDEwKXx8MCktdGhpcy5tYXJnaW5zLmxlZnQsaS50b3ArKHBhcnNlSW50KHQoZSkuY3NzKCJi b3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KHQoZSkuY3NzKCJwYWRkaW5nVG9w IiksMTApfHwwKS10aGlzLm1hcmdpbnMudG9wLGkubGVmdCsocz9NYXRoLm1heChlLnNjcm9s bFdpZHRoLGUub2Zmc2V0V2lkdGgpOmUub2Zmc2V0V2lkdGgpLShwYXJzZUludCh0KGUpLmNz cygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQodChlKS5jc3MoInBhZGRp bmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1h cmdpbnMubGVmdCxpLnRvcCsocz9NYXRoLm1heChlLnNjcm9sbEhlaWdodCxlLm9mZnNldEhl aWdodCk6ZS5vZmZzZXRIZWlnaHQpLShwYXJzZUludCh0KGUpLmNzcygiYm9yZGVyVG9wV2lk dGgiKSwxMCl8fDApLShwYXJzZUludCh0KGUpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8 MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF0pfSxf Y29udmVydFBvc2l0aW9uVG86ZnVuY3Rpb24oZSxpKXtpfHwoaT10aGlzLnBvc2l0aW9uKTt2 YXIgcz0iYWJzb2x1dGUiPT09ZT8xOi0xLG49ImFic29sdXRlIiE9PXRoaXMuY3NzUG9zaXRp b258fHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09ZG9jdW1lbnQmJnQuY29udGFpbnModGhpcy5z Y3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pP3RoaXMuc2Nyb2xsUGFyZW50 OnRoaXMub2Zmc2V0UGFyZW50LG89LyhodG1sfGJvZHkpL2kudGVzdChuWzBdLnRhZ05hbWUp O3JldHVybnt0b3A6aS50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKnMrdGhpcy5vZmZz ZXQucGFyZW50LnRvcCpzLSgiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5zY3Jv bGxQYXJlbnQuc2Nyb2xsVG9wKCk6bz8wOm4uc2Nyb2xsVG9wKCkpKnMsbGVmdDppLmxlZnQr dGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCpzK3RoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KnMt KCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxM ZWZ0KCk6bz8wOm4uc2Nyb2xsTGVmdCgpKSpzfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rp b24oZSl7dmFyIGkscyxuPXRoaXMub3B0aW9ucyxvPWUucGFnZVgsYT1lLnBhZ2VZLHI9ImFi c29sdXRlIiE9PXRoaXMuY3NzUG9zaXRpb258fHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09ZG9j dW1lbnQmJnQuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJl bnRbMF0pP3RoaXMuc2Nyb2xsUGFyZW50OnRoaXMub2Zmc2V0UGFyZW50LGg9LyhodG1sfGJv ZHkpL2kudGVzdChyWzBdLnRhZ05hbWUpO3JldHVybiJyZWxhdGl2ZSIhPT10aGlzLmNzc1Bv c2l0aW9ufHx0aGlzLnNjcm9sbFBhcmVudFswXSE9PWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBh cmVudFswXSE9PXRoaXMub2Zmc2V0UGFyZW50WzBdfHwodGhpcy5vZmZzZXQucmVsYXRpdmU9 dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKSksdGhpcy5vcmlnaW5hbFBvc2l0aW9uJiYodGhp cy5jb250YWlubWVudCYmKGUucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNv bnRhaW5tZW50WzBdJiYobz10aGlzLmNvbnRhaW5tZW50WzBdK3RoaXMub2Zmc2V0LmNsaWNr LmxlZnQpLGUucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRb MV0mJihhPXRoaXMuY29udGFpbm1lbnRbMV0rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSxlLnBh Z2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSYmKG89dGhp cy5jb250YWlubWVudFsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxlLnBhZ2VZLXRoaXMu b2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdJiYoYT10aGlzLmNvbnRhaW5t ZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCkpLG4uZ3JpZCYmKGk9dGhpcy5vcmlnaW5h bFBhZ2VZK01hdGgucm91bmQoKGEtdGhpcy5vcmlnaW5hbFBhZ2VZKS9uLmdyaWRbMV0pKm4u Z3JpZFsxXSxhPXRoaXMuY29udGFpbm1lbnQ/aS10aGlzLm9mZnNldC5jbGljay50b3A+PXRo aXMuY29udGFpbm1lbnRbMV0mJmktdGhpcy5vZmZzZXQuY2xpY2sudG9wPD10aGlzLmNvbnRh aW5tZW50WzNdP2k6aS10aGlzLm9mZnNldC5jbGljay50b3A+PXRoaXMuY29udGFpbm1lbnRb MV0/aS1uLmdyaWRbMV06aStuLmdyaWRbMV06aSxzPXRoaXMub3JpZ2luYWxQYWdlWCtNYXRo LnJvdW5kKChvLXRoaXMub3JpZ2luYWxQYWdlWCkvbi5ncmlkWzBdKSpuLmdyaWRbMF0sbz10 aGlzLmNvbnRhaW5tZW50P3MtdGhpcy5vZmZzZXQuY2xpY2subGVmdD49dGhpcy5jb250YWlu bWVudFswXSYmcy10aGlzLm9mZnNldC5jbGljay5sZWZ0PD10aGlzLmNvbnRhaW5tZW50WzJd P3M6cy10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj10aGlzLmNvbnRhaW5tZW50WzBdP3Mtbi5n cmlkWzBdOnMrbi5ncmlkWzBdOnMpKSx7dG9wOmEtdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRo aXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKygiZml4ZWQi PT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6aD8w OnIuc2Nyb2xsVG9wKCkpLGxlZnQ6by10aGlzLm9mZnNldC5jbGljay5sZWZ0LXRoaXMub2Zm c2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQrKCJmaXhlZCI9PT10 aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6aD8wOnIu c2Nyb2xsTGVmdCgpKX19LF9yZWFycmFuZ2U6ZnVuY3Rpb24odCxlLGkscyl7aT9pWzBdLmFw cGVuZENoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pOmUuaXRlbVswXS5wYXJlbnROb2RlLmlu c2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyWzBdLCJkb3duIj09PXRoaXMuZGlyZWN0aW9u P2UuaXRlbVswXTplLml0ZW1bMF0ubmV4dFNpYmxpbmcpLHRoaXMuY291bnRlcj10aGlzLmNv dW50ZXI/Kyt0aGlzLmNvdW50ZXI6MTt2YXIgbj10aGlzLmNvdW50ZXI7dGhpcy5fZGVsYXko ZnVuY3Rpb24oKXtuPT09dGhpcy5jb3VudGVyJiZ0aGlzLnJlZnJlc2hQb3NpdGlvbnMoIXMp fSl9LF9jbGVhcjpmdW5jdGlvbih0LGUpe3RoaXMucmV2ZXJ0aW5nPSExO3ZhciBpLHM9W107 aWYoIXRoaXMuX25vRmluYWxTb3J0JiZ0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0 aCYmdGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSksdGhpcy5fbm9G aW5hbFNvcnQ9bnVsbCx0aGlzLmhlbHBlclswXT09PXRoaXMuY3VycmVudEl0ZW1bMF0pe2Zv cihpIGluIHRoaXMuX3N0b3JlZENTUykoImF1dG8iPT09dGhpcy5fc3RvcmVkQ1NTW2ldfHwi c3RhdGljIj09PXRoaXMuX3N0b3JlZENTU1tpXSkmJih0aGlzLl9zdG9yZWRDU1NbaV09IiIp O3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVp LXNvcnRhYmxlLWhlbHBlciIpfWVsc2UgdGhpcy5jdXJyZW50SXRlbS5zaG93KCk7Zm9yKHRo aXMuZnJvbU91dHNpZGUmJiFlJiZzLnB1c2goZnVuY3Rpb24odCl7dGhpcy5fdHJpZ2dlcigi cmVjZWl2ZSIsdCx0aGlzLl91aUhhc2godGhpcy5mcm9tT3V0c2lkZSkpfSksIXRoaXMuZnJv bU91dHNpZGUmJnRoaXMuZG9tUG9zaXRpb24ucHJldj09PXRoaXMuY3VycmVudEl0ZW0ucHJl digpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpWzBdJiZ0aGlzLmRvbVBvc2l0aW9uLnBh cmVudD09PXRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF18fGV8fHMucHVzaChmdW5jdGlv bih0KXt0aGlzLl90cmlnZ2VyKCJ1cGRhdGUiLHQsdGhpcy5fdWlIYXNoKCkpfSksdGhpcyE9 PXRoaXMuY3VycmVudENvbnRhaW5lciYmKGV8fChzLnB1c2goZnVuY3Rpb24odCl7dGhpcy5f dHJpZ2dlcigicmVtb3ZlIix0LHRoaXMuX3VpSGFzaCgpKX0pLHMucHVzaChmdW5jdGlvbih0 KXtyZXR1cm4gZnVuY3Rpb24oZSl7dC5fdHJpZ2dlcigicmVjZWl2ZSIsZSx0aGlzLl91aUhh c2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpLHMucHVzaChm dW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dC5fdHJpZ2dlcigidXBkYXRlIixlLHRo aXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jdXJyZW50Q29udGFpbmVyKSkp KSxpPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtpPj0wO2ktLSllfHxzLnB1c2goZnVuY3Rp b24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3QuX3RyaWdnZXIoImRlYWN0aXZhdGUiLGUsdGhp cy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbaV0pKSx0aGlz LmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlciYmKHMucHVzaChmdW5jdGlvbih0 KXtyZXR1cm4gZnVuY3Rpb24oZSl7dC5fdHJpZ2dlcigib3V0IixlLHRoaXMuX3VpSGFzaCh0 aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2ldKSksdGhpcy5jb250YWluZXJz W2ldLmNvbnRhaW5lckNhY2hlLm92ZXI9MCk7aWYodGhpcy5zdG9yZWRDdXJzb3ImJih0aGlz LmRvY3VtZW50LmZpbmQoImJvZHkiKS5jc3MoImN1cnNvciIsdGhpcy5zdG9yZWRDdXJzb3Ip LHRoaXMuc3RvcmVkU3R5bGVzaGVldC5yZW1vdmUoKSksdGhpcy5fc3RvcmVkT3BhY2l0eSYm dGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iix0aGlzLl9zdG9yZWRPcGFjaXR5KSx0aGlzLl9z dG9yZWRaSW5kZXgmJnRoaXMuaGVscGVyLmNzcygiekluZGV4IiwiYXV0byI9PT10aGlzLl9z dG9yZWRaSW5kZXg/IiI6dGhpcy5fc3RvcmVkWkluZGV4KSx0aGlzLmRyYWdnaW5nPSExLHRo aXMuY2FuY2VsSGVscGVyUmVtb3ZhbCl7aWYoIWUpe2Zvcih0aGlzLl90cmlnZ2VyKCJiZWZv cmVTdG9wIix0LHRoaXMuX3VpSGFzaCgpKSxpPTA7cy5sZW5ndGg+aTtpKyspc1tpXS5jYWxs KHRoaXMsdCk7dGhpcy5fdHJpZ2dlcigic3RvcCIsdCx0aGlzLl91aUhhc2goKSl9cmV0dXJu IHRoaXMuZnJvbU91dHNpZGU9ITEsITF9aWYoZXx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3Rv cCIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJl bW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMuaGVscGVyWzBdIT09dGhpcy5j dXJyZW50SXRlbVswXSYmdGhpcy5oZWxwZXIucmVtb3ZlKCksdGhpcy5oZWxwZXI9bnVsbCwh ZSl7Zm9yKGk9MDtzLmxlbmd0aD5pO2krKylzW2ldLmNhbGwodGhpcyx0KTt0aGlzLl90cmln Z2VyKCJzdG9wIix0LHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0h MSwhMH0sX3RyaWdnZXI6ZnVuY3Rpb24oKXt0LldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIu YXBwbHkodGhpcyxhcmd1bWVudHMpPT09ITEmJnRoaXMuY2FuY2VsKCl9LF91aUhhc2g6ZnVu Y3Rpb24oZSl7dmFyIGk9ZXx8dGhpcztyZXR1cm57aGVscGVyOmkuaGVscGVyLHBsYWNlaG9s ZGVyOmkucGxhY2Vob2xkZXJ8fHQoW10pLHBvc2l0aW9uOmkucG9zaXRpb24sb3JpZ2luYWxQ b3NpdGlvbjppLm9yaWdpbmFsUG9zaXRpb24sb2Zmc2V0OmkucG9zaXRpb25BYnMsaXRlbTpp LmN1cnJlbnRJdGVtLHNlbmRlcjplP2UuZWxlbWVudDpudWxsfX19KX0pKGpRdWVyeSk7CkVP QjsKYnJlYWs7Cn0KZXhpdCgpOwp9IjtzOjY6ImF1dGhvciI7czowOiIiO3M6MTA6ImF1dGhv cl91cmkiO3M6MjI6Imh0dHA6Ly90ZXh0cGF0dGVybi5vcmciO3M6MzoibWQ1IjtzOjMyOiI5 MjIwYmJiZWZmNTc3YTExMzE1NTU4NDY0NmJhN2RkOSI7fQ==