ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGExNDU1ZDQuLjUwNTNlN2QgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMSw4ICsxIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgV2UncmUgcmVsb2NhdGluZyB0aGUgYnVpbGQgcHJvamVjdCB0byBhIHN1YmRpcmVjdG9yeSwgdGhlbiB1c2luZyBzeW1saW5rcwotIyB0byBleHBvc2UgdGhlIHN1YmRpcmVjdG9yaWVzIHdoZXJlIHRoZXkgdXNlZCB0byBiZS4gSWYgdGhlIG1hbmlmZXN0IGhhc24ndAotIyBiZWVuIHVwZGF0ZWQsIHdlIG5lZWQgdG8gaW5jbHVkZSBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzLgotaWZlcSAoJChMT0NBTF9QQVRIKSxidWlsZCkKLWluY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotZW5kaWYKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvQ2hhbmdlcy5tZCBiL0NoYW5nZXMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiYmFkMAotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZXMubWQKQEAgLTAsMCArMSwxMTYgQEAKKyMgQnVpbGQgU3lzdGVtIENoYW5nZXMgZm9yIEFuZHJvaWQubWsgV3JpdGVycworCisjIyBEZXByZWNhdGluZyAvIG9ic29sZXRpbmcgZW52c2V0dXAuc2ggdmFyaWFibGVzIGluIE1ha2VmaWxlcworCitJdCBpcyBub3QgcmVxdWlyZWQgdG8gc291cmNlIGVudnNldHVwLnNoIGJlZm9yZSBydW5uaW5nIGEgYnVpbGQuIE1hbnkgc2NyaXB0cywKK2luY2x1ZGluZyBhIG1ham9yaXR5IG9mIG91ciBhdXRvbWF0ZWQgYnVpbGQgc3lzdGVtcywgZG8gbm90IGRvIHNvLiBNYWtlIHdpbGwKK3RyYW5zcGFyZW50bHkgbWFrZSBldmVyeSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhdmFpbGFibGUgYXMgYSBtYWtlIHZhcmlhYmxlLgorVGhpcyBtZWFucyB0aGF0IHJlbHlpbmcgb24gZW52aXJvbm1lbnQgdmFyaWFibGVzIG9ubHkgc2V0IHVwIGluIGVudnNldHVwLnNoIHdpbGwKK3Byb2R1Y2UgZGlmZmVyZW50IG91dHB1dCBmb3IgbG9jYWwgdXNlcnMgYW5kIHNjcmlwdGVkIHVzZXJzLgorCitNYW55IG9mIHRoZXNlIHZhcmlhYmxlcyBhbHNvIGluY2x1ZGUgYWJzb2x1dGUgcGF0aCBuYW1lcywgd2hpY2ggd2UnZCBsaWtlIHRvCitrZWVwIG91dCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzLCBzbyB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIGRvIGEgZnVsbCByZWJ1aWxkIGlmCit5b3UgbW92ZSB0aGUgc291cmNlIHRyZWUuCisKK1RvIGZpeCB0aGlzLCB3ZSdyZSBtYXJraW5nIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0IGluIGVudnNldHVwLnNoIGFzCitkZXByZWNhdGVkIGluIHRoZSBtYWtlZmlsZXMuIFRoaXMgd2lsbCB0cmlnZ2VyIGEgd2FybmluZyBldmVyeSB0aW1lIG9uZSBpcyByZWFkCisob3Igd3JpdHRlbikgaW5zaWRlIEthdGkuIE9uY2UgYWxsIHRoZSB3YXJuaW5ncyBoYXZlIGJlZW4gcmVtb3ZlZCBmb3IgYQorcGFydGljdWxhciB2YXJpYWJsZSwgd2UnbGwgc3dpdGNoIGl0IHRvIG9ic29sZXRlLCBhbmQgYW55IHJlZmVyZW5jZXMgd2lsbCBiZWNvbWUKK2Vycm9ycy4KKworIyMjIGVudnNldHVwLnNoIHZhcmlhYmxlcyB3aXRoIG1ha2UgZXF1aXZhbGVudHMKKworfCBpbnN0ZWFkIG9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2UgICAgICAgICAgICAgICAgICB8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgT1VUIHsjT1VUfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT1VUX0RJUiAgICAgICAgICAgICAgfAorfCBBTkRST0lEX0hPU1RfT1VUIHsjQU5EUk9JRF9IT1NUX09VVH0gICAgICAgICAgICAgICAgICAgICAgICAgfCBIT1NUX09VVCAgICAgICAgICAgICB8Cit8IEFORFJPSURfUFJPRFVDVF9PVVQgeyNBTkRST0lEX1BST0RVQ1RfT1VUfSAgICAgICAgICAgICAgICAgICB8IFBST0RVQ1RfT1VUICAgICAgICAgIHwKK3wgQU5EUk9JRF9IT1NUX09VVF9URVNUQ0FTRVMgeyNBTkRST0lEX0hPU1RfT1VUX1RFU1RDQVNFU30gICAgIHwgSE9TVF9PVVRfVEVTVENBU0VTICAgfAorfCBBTkRST0lEX1RBUkdFVF9PVVRfVEVTVENBU0VTIHsjQU5EUk9JRF9UQVJHRVRfT1VUX1RFU1RDQVNFU30gfCBUQVJHRVRfT1VUX1RFU1RDQVNFUyB8CisKK0FsbCBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgbWF5IGJlIHJlbGF0aXZlIHBhdGhzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBvcgorYWJzb2x1dGUgcGF0aHMgaWYgdGhlIG91dHB1dCBkaXJlY3Rvcnkgd2FzIHNwZWNpZmllZCBhcyBhbiBhYnNvbHV0ZSBwYXRoLiBJZiB5b3UKK25lZWQgYW4gYWJzb2x1dGUgdmFyaWFibGUsIGNvbnZlcnQgaXQgdG8gYWJzb2x1dGUgZHVyaW5nIGEgcnVsZSwgc28gdGhhdCBpdCdzCitub3QgZXhwYW5kZWQgaW50byB0aGUgZ2VuZXJhdGVkIG5pbmphIGZpbGU6CisKK2BgYCBtYWtlCiskKFBST0RVQ1RfT1VUKS9nZW4uaW1nOiBteS9zcmMvcGF0aC9nZW4uc2gKKwlleHBvcnQgUFJPRFVDVF9PVVQ9JCQoY2QgJChQUk9EVUNUX09VVCk7IHB3ZCk7IGNkIG15L3NyYy9wYXRoOyAuL2dlbi5zaCAtbyAkJHtQUk9EVUNUX09VVH0vZ2VuLmltZworYGBgCisKKyMjIyBBTkRST0lEX0JVSUxEX1RPUCAgeyNBTkRST0lEX0JVSUxEX1RPUH0KKworSW4gQW5kcm9pZC5tayBmaWxlcywgeW91IGNhbiBhbHdheXMgYXNzdW1lIHRoYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHRoZQorcm9vdCBvZiB0aGUgc291cmNlIHRyZWUsIHNvIHRoaXMgY2FuIGp1c3QgYmUgcmVwbGFjZWQgd2l0aCAnLicgKHdoaWNoIGlzIHdoYXQKKyRUT1AgaXMgaGFyZGNvZGVkIHRvKSwgb3IgcmVtb3ZlZCBlbnRpcmVseS4gSWYgeW91IG5lZWQgYW4gYWJzb2x1dGUgcGF0aCwgc2VlCit0aGUgaW5zdHJ1Y3Rpb25zIGFib3ZlLgorCisjIyMgU3RvcCB1c2luZyBQQVRIIGRpcmVjdGx5ICB7I1BBVEh9CisKK1RoaXMgaXNuJ3Qgb25seSBzZXQgYnkgZW52c2V0dXAuc2gsIGJ1dCBpdCBpcyBtb2RpZmllZCBieSBpdC4gRHVlIHRvIHRoYXQgaXQncworcmF0aGVyIGVhc3kgZm9yIHRoaXMgdG8gY2hhbmdlIGJldHdlZW4gZGlmZmVyZW50IHNoZWxscywgYW5kIGl0J3Mgbm90IGlkZWFsIHRvCityZXJlYWQgdGhlIG1ha2VmaWxlcyBldmVyeSB0aW1lIHRoaXMgY2hhbmdlcy4KKworSW4gbW9zdCBjYXNlcywgeW91IHNob3VsZG4ndCBuZWVkIHRvIHRvdWNoIFBBVEggYXQgYWxsLiBXaGVuIHlvdSBuZWVkIHRvIGhhdmUgYQorcnVsZSByZWZlcmVuY2UgYSBwYXJ0aWN1bGFyIGJpbmFyeSB0aGF0J3MgcGFydCBvZiB0aGUgc291cmNlIHRyZWUgb3Igb3V0cHV0cywKK2l0J3MgcHJlZmVycmFibGUgdG8ganVzdCB1c2UgdGhlIHBhdGggdG8gdGhlIGZpbGUgaXRzZWxmIChzaW5jZSB5b3Ugc2hvdWxkCithbHJlYWR5IGJlIGFkZGluZyB0aGF0IGFzIGEgZGVwZW5kZW5jeSkuCisKK0RlcGVuZGluZyBvbiB0aGUgcnVsZSwgcGFzc2luZyB0aGUgZmlsZSBwYXRoIGl0c2VsZiBtYXkgbm90IGJlIGZlYXNpYmxlIGR1ZSB0bworbGF5ZXJzIG9mIHVuY2hhbmdhYmxlIHNjcmlwdHMvYmluYXJpZXMuIEluIHRoYXQgY2FzZSwgYmUgc3VyZSB0byBhZGQgdGhlCitkZXBlbmRlbmN5LCBidXQgbW9kaWZ5IHRoZSBQQVRIIHdpdGhpbiB0aGUgcnVsZSBpdHNlbGY6CisKK2BgYCBtYWtlCiskKFRBUkdFVCk6IG15c2NyaXB0IG15L3BhdGgvYmluYXJ5CisJUEFUSD1teS9wYXRoOiQkUEFUSCBteXNjcmlwdCAtbyAkQAorYGBgCisKKyMjIyBTdG9wIHVzaW5nIFBZVEhPTlBBVEggZGlyZWN0bHkgIHsjUFlUSE9OUEFUSH0KKworTGlrZSBQQVRILCB0aGlzIGlzbid0IG9ubHkgc2V0IGJ5IGVudnNldHVwLnNoLCBidXQgaXQgaXMgbW9kaWZpZWQgYnkgaXQuIER1ZSB0bwordGhhdCBpdCdzIHJhdGhlciBlYXN5IGZvciB0aGlzIHRvIGNoYW5nZSBiZXR3ZWVuIGRpZmZlcmVudCBzaGVsbHMsIGFuZCBpdCdzIG5vdAoraWRlYWwgdG8gcmVyZWFkIHRoZSBtYWtlZmlsZXMgZXZlcnkgdGltZS4KKworVGhlIGJlc3Qgc29sdXRpb24gaGVyZSBpcyB0byBzdGFydCBzd2l0Y2hpbmcgdG8gU29vbmcncyBweXRob24gYnVpbGRpbmcgc3VwcG9ydCwKK3doaWNoIHBhY2thZ2VzIHRoZSBweXRob24gaW50ZXJwcmV0ZXIsIGxpYnJhcmllcywgYW5kIHNjcmlwdCBhbGwgaW50byBvbmUgZmlsZQordGhhdCBubyBsb25nZXIgbmVlZHMgUFlUSE9OUEFUSC4gU2VlIGZvbnRjaGFpbl9saW50IGZvciBleGFtcGxlcyBvZiB0aGlzOgorCisqIFtleHRlcm5hbC9mb250dG9vbHMvTGliL2ZvbnRUb29scy9BbmRyb2lkLmJwXSBmb3IgcHl0aG9uX2xpYnJhcnlfaG9zdAorKiBbZnJhbWV3b3Jrcy9iYXNlL0FuZHJvaWQuYnBdIGZvciBweXRob25fYmluYXJ5X2hvc3QKKyogW2ZyYW1ld29ya3MvYmFzZS9kYXRhL2ZvbnRzL0FuZHJvaWQubWtdIHRvIGV4ZWN1dGUgdGhlIHB5dGhvbiBiaW5hcnkKKworSWYgeW91IHN0aWxsIG5lZWQgdG8gdXNlIFBZVEhPTlBBVEgsIGRvIHNvIHdpdGhpbiB0aGUgcnVsZSBpdHNlbGYsIGp1c3QgbGlrZQorcGF0aDoKKworYGBgIG1ha2UKKyQoVEFSR0VUKTogbXlzY3JpcHQucHkgJChzb3J0ICQoc2hlbGwgZmluZCBteS9weXRob24vbGliIC1uYW1lICcqLnB5JykpCisJUFlUSE9OUEFUSD1teS9weXRob24vbGliOiQkUFlUSE9OUEFUSCBteXNjcmlwdC5weSAtbyAkQAorYGBgCisjIyMgU3RvcCB1c2luZyBQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMX09WRVJSSURFIGRpcmVjdGx5IHsjUFJPRFVDVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTF9PVkVSUklERX0KKworU3BlY2lmeSBGcmFtZXdvcmsgQ29tcGF0aWJpbGl0eSBNYXRyaXggVmVyc2lvbiBpbiBkZXZpY2UgbWFuaWZlc3QgYnkgYWRkaW5nIGEgYHRhcmdldC1sZXZlbGAKK2F0dHJpYnV0ZSB0byB0aGUgcm9vdCBlbGVtZW50IGA8bWFuaWZlc3Q+YC4gSWYgYFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUxfT1ZFUlJJREVgCitpcyAyNiBvciAyNywgeW91IGNhbiBhZGQgYCJ0YXJnZXQtbGV2ZWwiPSIxImAgdG8geW91ciBkZXZpY2UgbWFuaWZlc3QgaW5zdGVhZC4KKworIyMjIFN0b3AgdXNpbmcgVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEIHsjVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEfQorCitDbGFuZyBpcyB0aGUgZGVmYXVsdCBhbmQgb25seSBzdXBwb3J0ZWQgQW5kcm9pZCBjb21waWxlciwgc28gdGhlcmUgaXMgbm8gcmVhc29uCitmb3IgdGhpcyBvcHRpb24gdG8gZXhpc3QuCisKKyMjIyBPdGhlciBlbnZzZXR1cC5zaCB2YXJpYWJsZXMgIHsjb3RoZXJfZW52c2V0dXBfdmFyaWFibGVzfQorCisqIEFORFJPSURfVE9PTENIQUlOCisqIEFORFJPSURfVE9PTENIQUlOXzJORF9BUkNICisqIEFORFJPSURfREVWX1NDUklQVFMKKyogQU5EUk9JRF9FTVVMQVRPUl9QUkVCVUlMVFMKKyogQU5EUk9JRF9QUkVfQlVJTERfUEFUSFMKKworVGhlc2UgYXJlIGFsbCBleHBvcnRlZCBmcm9tIGVudnNldHVwLnNoLCBidXQgZG9uJ3QgaGF2ZSBjbGVhciBlcXVpdmFsZW50cyB3aXRoaW4KK3RoZSBtYWtlZmlsZSBzeXN0ZW0uIElmIHlvdSBuZWVkIG9uZSBvZiB0aGVtLCB5b3UnbGwgaGF2ZSB0byBzZXQgdXAgeW91ciBvd24KK3ZlcnNpb24uCisKKworW2J1aWxkL3Nvb25nL0NoYW5nZXMubWRdOiBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9idWlsZC9zb29uZy8rL21hc3Rlci9DaGFuZ2VzLm1kCitbZXh0ZXJuYWwvZm9udHRvb2xzL0xpYi9mb250VG9vbHMvQW5kcm9pZC5icF06IGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2V4dGVybmFsL2ZvbnR0b29scy8rL21hc3Rlci9MaWIvZm9udFRvb2xzL0FuZHJvaWQuYnAKK1tmcmFtZXdvcmtzL2Jhc2UvQW5kcm9pZC5icF06IGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9BbmRyb2lkLmJwCitbZnJhbWV3b3Jrcy9iYXNlL2RhdGEvZm9udHMvQW5kcm9pZC5ta106IGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL21hc3Rlci9kYXRhL2ZvbnRzL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBmZmY2MjJmLi5kMmI5Y2FmIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00MjQsMTAgKzQyNCw0OCBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL3ZlbmRvci9uYXRpdmV0ZXN0KikKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3ZlbmRvci9uYXRpdmV0ZXN0KikKIAorIyBKYWNrIGlzIG5vIGxvbmdlciB0aGUgZGVmYXVsdCBjb21waWxlciwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGVzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqLyovKi9jbGFzc2VzKi5qYWNrKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai8qLyovamFjayopCisKICMgTW92ZSBhZGJkIGZyb20gJChQUk9EVUNUX09VVCkvcm9vdC9zYmluIHRvICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9iaW4KICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3Jvb3Qvc2Jpbi9hZGJkKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3ltYm9scy9zYmluL2FkYmQpCiAKKyMgU29vbmcgbGludXggLT4gbGludXhfZ2xpYmMgcmVuYW1lCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChTT09OR19PVVRfRElSKS8uaW50ZXJtZWRpYXRlcyAtbmFtZSAnbGludXhfeDg2KicgfCB4YXJncyBybSAtcmYpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChTT09OR19PVVRfRElSKS8uaW50ZXJtZWRpYXRlcyAtbmFtZSAnbGludXhfY29tbW9uKicgfCB4YXJncyBybSAtcmYpCisKKyMgUmVtb3ZlIG9sZCBhaWRsL2xvZ3RhZ3MgZmlsZXMgdGhhdCBtYXkgYmUgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UgZGlyZWN0b3J5CiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqLyovKl9pbnRlcm1lZGlhdGVzL3NyYykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLWYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai8qLypfaW50ZXJtZWRpYXRlcy9qYXZhLXNvdXJjZS1saXN0KQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS9ob3N0L2NvbW1vbi9vYmovKi8qX2ludGVybWVkaWF0ZXMvc3JjKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtZiAkKE9VVF9ESVIpL2hvc3QvY29tbW9uL29iai8qLypfaW50ZXJtZWRpYXRlcy9qYXZhLXNvdXJjZS1saXN0KQorCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovQVBQUy8qL2ZsYXQtcmVzKQorCisjIFJlbW92ZSBvbGQgVk5ESyBkaXJlY3RvcmllcyB3aXRob3V0IHZlcnNpb24KKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvdm5kaykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvdm5kay1zcCkKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWI2NC92bmRrKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYjY0L3ZuZGstc3ApCisKKyMgUmVtb3ZlIG9sZCBkZXggb3V0cHV0IGRpcmVjdG9yaWVzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpLyovKl9pbnRlcm1lZGlhdGVzL3dpdGgtbG9jYWwvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS8qLypfaW50ZXJtZWRpYXRlcy9uby1sb2NhbC8pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKEhPU1RfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS8qLypfaW50ZXJtZWRpYXRlcy93aXRoLWxvY2FsLykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoSE9TVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpLyovKl9pbnRlcm1lZGlhdGVzL25vLWxvY2FsLykKKworIyBSZW1vdmUgbGVnYWN5IFZJTlRGIG1ldGFkYXRhIGZpbGVzCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbWFuaWZlc3QueG1sKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL3ZlbmRvci9tYW5pZmVzdC54bWwpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS92ZW5kb3IvbWFuaWZlc3QueG1sKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL3ZlbmRvci9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS92ZW5kb3IvY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sKQorCisjIFJlbW92ZSBEaXNwbGF5Q3V0b3V0RW11bGF0aW9uV2lkZSBvdmVybGF5CiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS92ZW5kb3Ivb3ZlcmxheS9EaXNwbGF5Q3V0b3V0RW11bGF0aW9uV2lkZSkKKwogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvT1dORVJTIGIvT1dORVJTCmluZGV4IDg5YjQ0NmEuLjdhNTlmNzAgMTAwNjQ0Ci0tLSBhL09XTkVSUworKysgYi9PV05FUlMKQEAgLTEsMiArMSwzIEBACiBjY3Jvc3NAYW5kcm9pZC5jb20KIGR3aWxsZW1zZW5AZ29vZ2xlLmNvbQorbmFuemhhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ODA5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUubWQKQEAgLTAsMCArMSwyMyBAQAorIyBBbmRyb2lkIE1ha2UgQnVpbGQgU3lzdGVtCisKK1RoaXMgaXMgdGhlIE1ha2VmaWxlLWJhc2VkIHBvcnRpb24gb2YgdGhlIEFuZHJvaWQgQnVpbGQgU3lzdGVtLgorCitGb3IgZG9jdW1lbnRhdGlvbiBvbiBob3cgdG8gcnVuIGEgYnVpbGQsIHNlZSBbVXNhZ2UudHh0XShVc2FnZS50eHQpCisKK0ZvciBhIGxpc3Qgb2YgYmVoYXZpb3JhbCBjaGFuZ2VzIHVzZWZ1bCBmb3IgQW5kcm9pZC5tayB3cml0ZXJzIHNlZQorW0NoYW5nZXMubWRdKENoYW5nZXMubWQpCisKK0ZvciBhbiBvdXRkYXRlZCByZWZlcmVuY2Ugb24gQW5kcm9pZC5tayBmaWxlcywgc2VlCitbYnVpbGQtc3lzdGVtLmh0bWxdKC9jb3JlL2J1aWxkLXN5c3RlbS5odG1sKS4gT3VyIEFuZHJvaWQubWsgZmlsZXMgbG9vayBzaW1pbGFyLAorYnV0IGFyZSBlbnRpcmVseSBkaWZmZXJlbnQgZnJvbSB0aGUgQW5kcm9pZC5tayBmaWxlcyB1c2VkIGJ5IHRoZSBOREsgYnVpbGQKK3N5c3RlbS4gV2hlbiBzZWFyY2hpbmcgZm9yIGRvY3VtZW50YXRpb24gZWxzZXdoZXJlLCBlbnN1cmUgdGhhdCBpdCBpcyBmb3IgdGhlCitwbGF0Zm9ybSBidWlsZCBzeXN0ZW0gLS0gbW9zdCBhcmUgbm90LgorCitUaGlzIE1ha2VmaWxlLWJhc2VkIHN5c3RlbSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyByZXBsYWNlZCB3aXRoIFtTb29uZ10sIGEKK25ldyBidWlsZCBzeXN0ZW0gd3JpdHRlbiBpbiBHby4gRHVyaW5nIHRoZSB0cmFuc2l0aW9uLCBhbGwgb2YgdGhlc2UgbWFrZWZpbGVzCithcmUgcmVhZCBieSBbS2F0aV0sIGFuZCBnZW5lcmF0ZSBhIG5pbmphIGZpbGUgaW5zdGVhZCBvZiBiZWluZyBleGVjdXRlZAorZGlyZWN0bHkuIFRoYXQncyBjb21iaW5lZCB3aXRoIGEgbmluamEgZmlsZSByZWFkIGJ5IFNvb25nIHNvIHRoYXQgdGhlIGJ1aWxkCitncmFwaCBvZiB0aGUgdHdvIHN5c3RlbXMgY2FuIGJlIGNvbWJpbmVkIGFuZCBydW4gYXMgb25lLgorCitbS2F0aV06IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUva2F0aQorW1Nvb25nXTogaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vYnVpbGQvc29vbmcvKy9tYXN0ZXIKZGlmZiAtLWdpdCBhL1VzYWdlLnR4dCBiL1VzYWdlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQyMTBiCi0tLSAvZGV2L251bGwKKysrIGIvVXNhZ2UudHh0CkBAIC0wLDAgKzEsODUgQEAKK0FuZHJvaWQgYnVpbGQgc3lzdGVtIHVzYWdlOgorCittIFstal0gWzx0YXJnZXRzPl0gWzx2YXJpYWJsZT49PHZhbHVlPi4uLl0KKworCitXYXlzIHRvIHNwZWNpZnkgd2hhdCB0byBidWlsZDoKKyAgVGhlIGNvbW1vbiB3YXkgdG8gc3BlY2lmeSB3aGF0IHRvIGJ1aWxkIGlzIHRvIHNldCB0aGF0IGluZm9ybWF0aW9uIGluIHRoZQorICBlbnZpcm9ubWVudCB2aWE6CisKKyAgICAjIFNldCB1cCB0aGUgc2hlbGwgZW52aXJvbm1lbnQuCisgICAgc291cmNlIGJ1aWxkL2VudnNldHVwLnNoICMgUnVuICJobW0iIGFmdGVyIHNvdXJjaW5nIGZvciBtb3JlIGluZm8KKyAgICAjIFNlbGVjdCB0aGUgZGV2aWNlIGFuZCB2YXJpYW50IHRvIHRhcmdldC4gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIGl0CisgICAgIyB3aWxsIGxpc3QgY2hvaWNlcyBhbmQgcHJvbXB0LgorICAgIGx1bmNoIFs8cHJvZHVjdD4tPHZhcmlhbnQ+XSAjIFNlbGVjdHMgdGhlIGRldmljZSBhbmQgdmFyaWFudCB0byB0YXJnZXQuCisgICAgIyBJbnZva2UgdGhlIGNvbmZpZ3VyZWQgYnVpbGQuCisgICAgbSBbPG9wdGlvbnM+XSBbPHRhcmdldHM+XSBbPHZhcmlhYmxlPj08dmFsdWU+Li4uXQorCisgICAgICA8cHJvZHVjdD4gaXMgdGhlIGRldmljZSB0aGF0IHRoZSBjcmVhdGVkIGltYWdlIGlzIGludGVuZGVkIHRvIGJlIHJ1biBvbi4KKyAgICAgICAgVGhpcyBpcyBzYXZlZCBpbiB0aGUgc2hlbGwgZW52aXJvbm1lbnQgYXMgJFRBUkdFVF9QUk9EVUNUIGJ5IGBsdW5jaGAuCisgICAgICA8dmFyaWFudD4gaXMgb25lIG9mICJ1c2VyIiwgInVzZXJkZWJ1ZyIsIG9yICJlbmciLCBhbmQgY29udHJvbHMgdGhlCisgICAgICAgIGFtb3VudCBvZiBkZWJ1Z2dpbmcgdG8gYmUgYWRkZWQgaW50byB0aGUgZ2VuZXJhdGVkIGltYWdlLgorICAgICAgICBUaGlzIGdldHMgc2F2ZWQgaW4gdGhlIHNoZWxsIGVudmlyb25tZW50IGFzICRUQVJHRVRfQlVJTERfVkFSSUFOVCBieQorICAgICAgICAgIGBsdW5jaGAuCisKKyAgICBFYWNoIG9mIDxvcHRpb25zPiwgPHRhcmdldHM+LCBhbmQgPHZhcmlhYmxlPj08dmFsdWU+IGlzIG9wdGlvbmFsLgorICAgICAgSWYgbm8gdGFyZ2V0cyBhcmUgc3BlY2lmaWVkLCB0aGUgYnVpbGQgc3lzdGVtIHdpbGwgYnVpbGQgdGhlIGltYWdlcworICAgICAgZm9yIHRoZSBjb25maWd1cmVkIHByb2R1Y3QgYW5kIHZhcmlhbnQuCisKKyAgQW4gYWx0ZXJuYXRpdmUgdG8gc2V0dGluZyAkVEFSR0VUX1BST0RVQ1QgYW5kICRUQVJHRVRfQlVJTERfVkFSSUFOVCwKKyAgd2hpY2ggeW91IG1heSBzZWUgaW4gYnVpbGQgc2VydmVycywgaXMgdG8gZXhlY3V0ZToKKworICAgIG1ha2UgUFJPRFVDVC08cHJvZHVjdD4tPHZhcmlhbnQ+CisKKworICBBIHRhcmdldCBtYXkgYmUgYSBmaWxlIHBhdGguIEZvciBleGFtcGxlLCBvdXQvaG9zdC9saW51eC14ODYvYmluL2FkYiAuCisgICAgTm90ZSB0aGF0IHdoZW4gZ2l2aW5nIGEgcmVsYXRpdmUgZmlsZSBwYXRoIGFzIGEgdGFyZ2V0LCB0aGF0IHBhdGggaXMKKyAgICBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUgKHJhdGhlciB0aGFuIHJlbGF0aXZlCisgICAgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkpLgorCisgIEEgdGFyZ2V0IG1heSBhbHNvIGJlIGFueSBvdGhlciB0YXJnZXQgZGVmaW5lZCB3aXRoaW4gYSBNYWtlZmlsZS4gUnVuCisgICAgYG0gaGVscGAgdG8gdmlldyB0aGUgbmFtZXMgb2Ygc29tZSBjb21tb24gdGFyZ2V0cy4KKworICBUbyB2aWV3IHRoZSBtb2R1bGVzIGFuZCB0YXJnZXRzIGRlZmluZWQgaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSwgbG9vayBmb3I6CisgICAgZmlsZXMgbmFtZWQgKi5tayAobW9zdCBjb21tb25seSBBbmRyb2lkLm1rKQorICAgICAgdGhlc2UgZmlsZXMgYXJlIGRlZmluZWQgaW4gTWFrZSBzeW50YXgKKyAgICBmaWxlcyBuYW1lZCBBbmRyb2lkLmJwCisgICAgICB0aGVzZSBmaWxlcyBhcmUgZGVmaW5lZCBpbiBCbHVlcHJpbnQgc3ludGF4CisKKyAgRm9yIG5vdywgdGhlIGZ1bGwgKGV4dHJlbWVseSBsYXJnZSkgY29tcGlsZWQgbGlzdCBvZiB0YXJnZXRzIGNhbiBiZSBmb3VuZAorICAgIChhZnRlciBydW5uaW5nIHRoZSBidWlsZCBvbmNlKSwgc3BsaXQgYW1vbmcgdGhlc2UgdHdvIGZpbGVzOgorCisgICAgJHtPVVR9L2J1aWxkLTxwcm9kdWN0PioubmluamEKKyAgICAke09VVH0vc29vbmcvYnVpbGQubmluamEKKworICAgIElmIHlvdSBmaW5kIHlvdXJzZWxmIGludGVyYWN0aW5nIHdpdGggdGhlc2UgZmlsZXMsIHlvdSBhcmUgZW5jb3VyYWdlZCB0bworICAgIHByb3ZpZGUgYSBtb3JlIGNvbnZlbmllbnQgdG9vbCBmb3IgYnJvd3NpbmcgdGFyZ2V0cywgYW5kIHRvIG1lbnRpb24gdGhlCisgICAgdG9vbCBoZXJlLgorCitUYXJnZXRzIHRoYXQgYWRqdXN0IGFuIGV4aXN0aW5nIGJ1aWxkOgorICBzaG93Y29tbWFuZHMgICAgICAgICAgICAgIERpc3BsYXkgdGhlIGluZGl2aWR1YWwgY29tbWFuZHMgcnVuIHRvIGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidWlsZAorICBkaXN0ICAgICAgICAgICAgICAgICAgICAgIENvcHkgaW50byAke0RJU1RfRElSfSB0aGUgcG9ydGlvbiBvZiB0aGUgYnVpbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IG11c3QgYmUgZGlzdHJpYnV0ZWQKKworRmxhZ3MKKyAgLWogPE4+ICAgICAgICAgICAgICAgICAgICBSdW4gPE4+IHByb2Nlc3NlcyBhdCBvbmNlCisgIC1qICAgICAgICAgICAgICAgICAgICAgICAgQXV0b2RldGVjdCB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyB0byBydW4gYXQgb25jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcnVuIHRoYXQgbWFueQorCitWYXJpYWJsZXMKKyAgVmFyaWFibGVzIGNhbiBlaXRoZXIgYmUgc2V0IGluIHRoZSBzdXJyb3VuZGluZyBzaGVsbCBlbnZpcm9ubWVudCBvciBjYW4gYmUKKyAgICBwYXNzZWQgYXMgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gRm9yIGV4YW1wbGU6CisgICAgICBleHBvcnQgSV9BTV9BX1NIRUxMX1ZBUj0xCisgICAgICBJX0FNX0FOT1RIRVJfU0hFTExfVkFSPTIgbWFrZSBkcm9pZCBJX0FNX0FfTUFLRV9WQVI9MworICBIZXJlIGFyZSBzb21lIGNvbW1vbiB2YXJpYWJsZXMgYW5kIHRoZWlyIG1lYW5pbmdzOgorICAgIFRBUkdFVF9QUk9EVUNUICAgICAgICAgIFRoZSA8cHJvZHVjdD4gdG8gYnVpbGQgIyBhcyBkZXNjcmliZWQgYWJvdmUKKyAgICBUQVJHRVRfQlVJTERfVkFSSUFOVCAgICBUaGUgPHZhcmlhbnQ+IHRvIGJ1aWxkICMgYXMgZGVzY3JpYmVkIGFib3ZlCisgICAgRElTVF9ESVIgICAgICAgICAgICAgICAgVGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBwbGFjZSB0aGUgZGlzdHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzLgorICAgIE9VVF9ESVIgICAgICAgICAgICAgICAgIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gcGxhY2Ugbm9uLWRpc3RyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0cy4KKworICBUaGVyZSBpcyBub3QgeWV0IGtub3duIGEgY29udmVuaWVudCBtZXRob2QgYnkgd2hpY2ggdG8gZGlzY292ZXIgdGhlIGZ1bGwKKyAgbGlzdCBvZiBzdXBwb3J0ZWQgdmFyaWFibGVzLiBQbGVhc2UgbWVudGlvbiBpdCBoZXJlIHdoZW4gdGhlcmUgaXMuCisKZGlmZiAtLWdpdCBhL2NvcmUvTWFrZWZpbGUgYi9jb3JlL01ha2VmaWxlCmluZGV4IDYxOGU5ODMuLmMwM2YyMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvTWFrZWZpbGUKKysrIGIvY29yZS9NYWtlZmlsZQpAQCAtNCwxNSArNCw2IEBACiAjIGludGVybWVkaXRlcy1kaXItZm9yCiBMT0NBTF9QQVRIIDo9ICQoQlVJTERfU1lTVEVNKQogCi0jIFBpY2sgYSByZWFzb25hYmxlIHN0cmluZyB0byB1c2UgdG8gaWRlbnRpZnkgZmlsZXMuCi1pZm5lcSAoLCQoZmlsdGVyIGVuZy4lLCQoQlVJTERfTlVNQkVSKSkpCi0gICMgQlVJTERfTlVNQkVSIGhhcyBhIHRpbWVzdGFtcCBpbiBpdCwgd2hpY2ggbWVhbnMgdGhhdAotICAjIGl0IHdpbGwgY2hhbmdlIGV2ZXJ5IHRpbWUuICBQaWNrIGEgc3RhYmxlIHZhbHVlLgotICBGSUxFX05BTUVfVEFHIDo9IGVuZy4kKFVTRVIpCi1lbHNlCi0gIEZJTEVfTkFNRV9UQUcgOj0gJChCVUlMRF9OVU1CRVIpCi1lbmRpZgotCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIERlZmluZSBydWxlcyB0byBjb3B5IFBST0RVQ1RfQ09QWV9GSUxFUyBkZWZpbmVkIGJ5IHRoZSBwcm9kdWN0LgogIyBQUk9EVUNUX0NPUFlfRklMRVMgY29udGFpbnMgd29yZHMgbGlrZSA8c291cmNlIGZpbGU+OjxkZXN0IGZpbGU+Wzo8b3duZXI+XS4KQEAgLTMxLDIyICsyMiw0NiBAQAogICAgICQoaWYgJChmaWx0ZXIgJCh1bmlxdWVfcHJvZHVjdF9jb3B5X2ZpbGVzX3BhaXJzKSwkKGNmKSksLFwKICAgICAgICAgJChldmFsIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfcGFpcnMgKz0gJChjZikpKSkKIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfZGVzdGluYXRpb25zIDo9Citwcm9kdWN0X2NvcHlfZmlsZXNfaWdub3JlZCA6PQogJChmb3JlYWNoIGNmLCQodW5pcXVlX3Byb2R1Y3RfY29weV9maWxlc19wYWlycyksIFwKICAgICAkKGV2YWwgX3NyYyA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCQoY2YpKSkgXAogICAgICQoZXZhbCBfZGVzdCA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCQoY2YpKSkgXAogICAgICQoY2FsbCBjaGVjay1wcm9kdWN0LWNvcHktZmlsZXMsJChjZikpIFwKICAgICAkKGlmICQoZmlsdGVyICQodW5pcXVlX3Byb2R1Y3RfY29weV9maWxlc19kZXN0aW5hdGlvbnMpLCQoX2Rlc3QpKSwgXAotICAgICAgICAkKGluZm8gUFJPRFVDVF9DT1BZX0ZJTEVTICQoY2YpIGlnbm9yZWQuKSwgXAorICAgICAgICAkKGV2YWwgcHJvZHVjdF9jb3B5X2ZpbGVzX2lnbm9yZWQgKz0gJChjZikpLCBcCiAgICAgICAgICQoZXZhbCBfZnVsbGRlc3QgOj0gJChjYWxsIGFwcGVuZC1wYXRoLCQoUFJPRFVDVF9PVVQpLCQoX2Rlc3QpKSkgXAogICAgICAgICAkKGlmICQoZmlsdGVyICUueG1sLCQoX2Rlc3QpKSxcCiAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIGNvcHkteG1sLWZpbGUtY2hlY2tlZCwkKF9zcmMpLCQoX2Z1bGxkZXN0KSkpLFwKLSAgICAgICAgICAgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKF9zcmMpLCQoX2Z1bGxkZXN0KSkpKSBcCisgICAgICAgICAgICAkKGlmICQoYW5kICQoZmlsdGVyICUuamFyLCQoX2Rlc3QpKSwkKGZpbHRlciAkKGJhc2VuYW1lICQobm90ZGlyICQoX2Rlc3QpKSksJChQUk9EVUNUX0xPQURFRF9CWV9QUklWSUxFR0VEX01PRFVMRVMpKSksXAorICAgICAgICAgICAgICAgICQoZXZhbCAkKGNhbGwgY29weS1hbmQtdW5jb21wcmVzcy1kZXhzLCQoX3NyYyksJChfZnVsbGRlc3QpKSksIFwKKyAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChfc3JjKSwkKF9mdWxsZGVzdCkpKSkpIFwKICAgICAgICAgJChldmFsIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoX2Z1bGxkZXN0KSkgXAogICAgICAgICAkKGV2YWwgdW5pcXVlX3Byb2R1Y3RfY29weV9maWxlc19kZXN0aW5hdGlvbnMgKz0gJChfZGVzdCkpKSkKKworIyBEdW1wIGEgbGlzdCBvZiBvdmVycmlkZW4gKGFuZCBpZ25vcmVkIFBST0RVQ1RfQ09QWV9GSUxFUyBlbnRyaWVzKQorJChmaWxlID4kKFBST0RVQ1RfT1VUKS9wcm9kdWN0X2NvcHlfZmlsZXNfaWdub3JlZC50eHQsJChzdWJzdCAkKHNwYWNlKSwkKG5ld2xpbmUpLCQoc3RyaXAgJChwcm9kdWN0X2NvcHlfZmlsZXNfaWdub3JlZCkpKSkKK2lmZGVmIGRpc3RfZ29hbAorJChmaWxlID4kKERJU1RfRElSKS9sb2dzL3Byb2R1Y3RfY29weV9maWxlc19pZ25vcmVkLnR4dCwkKHN1YnN0ICQoc3BhY2UpLCQobmV3bGluZSksJChzdHJpcCAkKHByb2R1Y3RfY29weV9maWxlc19pZ25vcmVkKSkpKQorZW5kaWYKKworcHJvZHVjdF9jb3B5X2ZpbGVzX2lnbm9yZWQgOj0KIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfcGFpcnMgOj0KIHVuaXF1ZV9wcm9kdWN0X2NvcHlfZmlsZXNfZGVzdGluYXRpb25zIDo9CiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmV0dXJucyB0aGUgbWF4IGFsbG93ZWQgc2l6ZSBmb3IgYW4gaW1hZ2Ugc3VpdGFibGUgZm9yIGhhc2ggdmVyaWZpY2F0aW9uCisjIChlLmcuLCBib290LmltZywgcmVjb3ZlcnkuaW1nLCBldGMpLgorIyBUaGUgdmFsdWUgNjk2MzIgZGVyaXZlcyBmcm9tIE1BWF9WQk1FVEFfU0laRSArIE1BWF9GT09URVJfU0laRSBpbiAkKEFWQlRPT0wpLgorIyAkKDEpOiBwYXJ0aXRpb24gc2l6ZSB0byBmbGFzaCB0aGUgaW1hZ2UKK2RlZmluZSBnZXQtaGFzaC1pbWFnZS1tYXgtc2l6ZQorJChpZiAkKDEpLCBcCisgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX0FWQl9FTkFCTEUpKSwgXAorICAgICQoZXZhbCBfaGFzaF9tZXRhX3NpemUgOj0gNjk2MzIpLCBcCisgICAgJChldmFsIF9oYXNoX21ldGFfc2l6ZSA6PSAwKSkgXAorICAkKDEpLSQoX2hhc2hfbWV0YV9zaXplKSkKK2VuZGVmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgRGVmaW5lIHJ1bGVzIHRvIGNvcHkgaGVhZGVycyBkZWZpbmVkIGluIGNvcHlfaGVhZGVycy5tawogIyBJZiBtb3JlIHRoYW4gb25lIG1ha2VmaWxlIGRlY2xhcmVkIGEgaGVhZGVyLCBwcmludCBhIHdhcm5pbmcsCiAjIHRoZW4gY29weSB0aGUgbGFzdCBvbmUgZGVmaW5lZC4gVGhpcyBtYXRjaGVzIHRoZSBwcmV2aW91cyBtYWtlCkBAIC03MCw2ICs4NSwyNyBAQAogCUBjcCAtZiAkPCAkQAogZW5kaWYKIAorbmRrX2RveHlnZW5fb3V0IDo9ICQoT1VUX05ES19ET0NTKQorbmRrX2hlYWRlcnMgOj0gJChTT09OR19PVVRfRElSKS9uZGsvc3lzcm9vdC91c3IvaW5jbHVkZQorbmRrX2RvY3Nfc3JjX2RpciA6PSBmcmFtZXdvcmtzL25hdGl2ZS9kb2NzCituZGtfZG94eWZpbGUgOj0gJChuZGtfZG9jc19zcmNfZGlyKS9Eb3h5ZmlsZQoraWZuZXEgKCQod2lsZGNhcmQgJChuZGtfZG9jc19zcmNfZGlyKSksKQorbmRrX2RvY3Nfc3JjcyA6PSAkKGFkZHByZWZpeCAkKG5ka19kb2NzX3NyY19kaXIpLyxcCisgICAgJChjYWxsIGZpbmQtZmlsZXMtaW4tc3ViZGlycywkKG5ka19kb2NzX3NyY19kaXIpLCIqIiwuKSkKKyQobmRrX2RveHlnZW5fb3V0KS9pbmRleC5odG1sOiAkKG5ka19kb2NzX3NyY3MpICQoU09PTkdfT1VUX0RJUikvbmRrLnRpbWVzdGFtcAorCUBta2RpciAtcCAkKG5ka19kb3h5Z2VuX291dCkKKwlAZWNobyAiR2VuZXJhdGluZyBOREsgZG9jcyB0byAkKG5ka19kb3h5Z2VuX291dCkiCisJQCggY2F0ICQobmRrX2RveHlmaWxlKTsgXAorCSAgICBlY2hvICJJTlBVVD0kKG5ka19oZWFkZXJzKSI7IFwKKwkgICAgZWNobyAiSFRNTF9PVVRQVVQ9JChuZGtfZG94eWdlbl9vdXQpIiBcCisJKSB8IGRveHlnZW4gLQorCisjIE5vdGU6IE5vdCBhIHBhcnQgb2YgdGhlIGRvY3MgdGFyZ2V0IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBkb3h5Z2VuIGF2YWlsYWJsZS4KKyMgWW91IGNhbiBydW4gdGhpcyB0YXJnZXQgbG9jYWxseSBpZiB5b3UgaGF2ZSBkb3h5Z2VuIGluc3RhbGxlZC4KK25kay1kb2NzOiAkKG5ka19kb3h5Z2VuX291dCkvaW5kZXguaHRtbAorLlBIT05ZOiBuZGstZG9jcworZW5kaWYKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZAogcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQgOj0KQEAgLTc4LDYgKzExNCwyNCBAQAogZW5kaWYKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTIHdpbGwgYmUgaW5zdGFsbGVkIGluIHZlbmRvci9kZWZhdWx0LnByb3AgaWYKKyMgcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQgaXMgdHJ1ZS4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgaW5zdGFsbGVkIGluCisjIFJPT1QvZGVmYXVsdC5wcm9wLgoraWZkZWYgQk9BUkRfVk5ES19WRVJTSU9OCisgIGlmZXEgKCQoQk9BUkRfVk5ES19WRVJTSU9OKSxjdXJyZW50KQorICAgIEZJTkFMX1ZFTkRPUl9ERUZBVUxUX1BST1BFUlRJRVMgOj0gcm8udm5kay52ZXJzaW9uPSQoUExBVEZPUk1fVk5ES19WRVJTSU9OKQorICBlbHNlCisgICAgRklOQUxfVkVORE9SX0RFRkFVTFRfUFJPUEVSVElFUyA6PSByby52bmRrLnZlcnNpb249JChCT0FSRF9WTkRLX1ZFUlNJT04pCisgIGVuZGlmCitlbHNlCisgIEZJTkFMX1ZFTkRPUl9ERUZBVUxUX1BST1BFUlRJRVMgOj0KK2VuZGlmCitGSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTICs9IFwKKyAgICAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUykpCitGSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTIDo9ICQoY2FsbCB1bmlxLXBhaXJzLWJ5LWZpcnN0LWNvbXBvbmVudCwgXAorICAgICQoRklOQUxfVkVORE9SX0RFRkFVTFRfUFJPUEVSVElFUyksPSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBwcm9wLmRlZmF1bHQKIGlmZGVmIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkCiBJTlNUQUxMRURfREVGQVVMVF9QUk9QX1RBUkdFVCA6PSAkKFRBUkdFVF9PVVQpL2V0Yy9wcm9wLmRlZmF1bHQKQEAgLTkwLDEwICsxNDQsMTEgQEAKIGVuZGlmCiBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKElOU1RBTExFRF9ERUZBVUxUX1BST1BfVEFSR0VUKQogRklOQUxfREVGQVVMVF9QUk9QRVJUSUVTIDo9IFwKLSAgICAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoQURESVRJT05BTF9ERUZBVUxUX1BST1BFUlRJRVMpKQorICAgICQoY2FsbCBjb2xsYXBzZS1wYWlycywgJChBRERJVElPTkFMX0RFRkFVTFRfUFJPUEVSVElFUykpIFwKKyAgICAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTKSkKIGlmbmRlZiBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZAogICBGSU5BTF9ERUZBVUxUX1BST1BFUlRJRVMgKz0gXAotICAgICAgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKFBST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMpKQorICAgICAgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKEZJTkFMX1ZFTkRPUl9ERUZBVUxUX1BST1BFUlRJRVMpKQogZW5kaWYKIEZJTkFMX0RFRkFVTFRfUFJPUEVSVElFUyA6PSAkKGNhbGwgdW5pcS1wYWlycy1ieS1maXJzdC1jb21wb25lbnQsIFwKICAgICAkKEZJTkFMX0RFRkFVTFRfUFJPUEVSVElFUyksPSkKQEAgLTExNSw3ICsxNzAsNyBAQAogCSQoaGlkZSkgZWNobyByby5ib290aW1hZ2UuYnVpbGQuZGF0ZT1gJChEQVRFX0ZST01fRklMRSlgPj4kQAogCSQoaGlkZSkgZWNobyByby5ib290aW1hZ2UuYnVpbGQuZGF0ZS51dGM9YCQoREFURV9GUk9NX0ZJTEUpICslc2A+PiRACiAJJChoaWRlKSBlY2hvIHJvLmJvb3RpbWFnZS5idWlsZC5maW5nZXJwcmludD0iJChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIj4+JEAKLQkkKGhpZGUpIGJ1aWxkL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSAkQAorCSQoaGlkZSkgYnVpbGQvbWFrZS90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkgJEAKIGlmZGVmIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkCiAJJChoaWRlKSBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkKIAkkKGhpZGUpIGxuIC1zZiBzeXN0ZW0vZXRjL3Byb3AuZGVmYXVsdCAkKElOU1RBTExFRF9ERUZBVUxUX1BST1BfT0xEX1RBUkdFVCkKQEAgLTEyOCwxMSArMTgzLDYgQEAKIElOU1RBTExFRF9WRU5ET1JfREVGQVVMVF9QUk9QX1RBUkdFVCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9kZWZhdWx0LnByb3AKIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoSU5TVEFMTEVEX1ZFTkRPUl9ERUZBVUxUX1BST1BfVEFSR0VUKQogCi1GSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTICs9IFwKLSAgICAkKGNhbGwgY29sbGFwc2UtcGFpcnMsICQoUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUykpCi1GSU5BTF9WRU5ET1JfREVGQVVMVF9QUk9QRVJUSUVTIDo9ICQoY2FsbCB1bmlxLXBhaXJzLWJ5LWZpcnN0LWNvbXBvbmVudCwgXAotICAgICQoRklOQUxfVkVORE9SX0RFRkFVTFRfUFJPUEVSVElFUyksPSkKLQogJChJTlNUQUxMRURfVkVORE9SX0RFRkFVTFRfUFJPUF9UQVJHRVQpOiAkKElOU1RBTExFRF9ERUZBVUxUX1BST1BfVEFSR0VUKQogCUBlY2hvIFRhcmdldCBidWlsZGluZm86ICRACiAJQG1rZGlyIC1wICQoZGlyICRAKQpAQCAtMTQxLDcgKzE5MSw3IEBACiAJICAgICAgICBlY2hvICIjIiA+PiAkQDsKIAkkKGhpZGUpICQoZm9yZWFjaCBsaW5lLCQoRklOQUxfVkVORE9SX0RFRkFVTFRfUFJPUEVSVElFUyksIFwKIAkJZWNobyAiJChsaW5lKSIgPj4gJEA7KQotCSQoaGlkZSkgYnVpbGQvdG9vbHMvcG9zdF9wcm9jZXNzX3Byb3BzLnB5ICRACisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSAkQAogCiBlbmRpZiAgIyBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZAogCkBAIC0xNzksMzAgKzIyOSwzNyBAQAogCiAjIFRoZSBzdHJpbmcgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29tYmluZWQgYnVpbGQgYW5kIHByb2R1Y3Q7IHVzZWQgYnkgdGhlIE9UQSBzZXJ2ZXIuCiBpZmVxICgsJChzdHJpcCAkKEJVSUxEX0ZJTkdFUlBSSU5UKSkpCi0gIGlmbmVxICgkKGZpbHRlciBlbmcuJSwkKEJVSUxEX05VTUJFUikpLCkKLSAgICAjIFRyaW0gZG93biBCVUlMRF9GSU5HRVJQUklOVDogdGhlIGRlZmF1bHQgQlVJTERfTlVNQkVSIG1ha2VzIGl0IGVhc2lseSBleGNlZWQKLSAgICAjIHRoZSBBbmRyb2lkIHN5c3RlbSBwcm9wZXJ0eSBsZW5ndGggbGltaXQgKFBST1BFUlRZX1ZBTFVFX01BWD05MikuCi0gICAgQkZfQlVJTERfTlVNQkVSIDo9ICQoc2hlbGwgZWNobyAkJHtVU0VSOjA6Nn0pJChzaGVsbCAkKERBVEUpICslbSVkJUglTSkKKyAgaWZlcSAoJChzdHJpcCAkKEhBU19CVUlMRF9OVU1CRVIpKSxmYWxzZSkKKyAgICBCRl9CVUlMRF9OVU1CRVIgOj0gJChVU0VSKSQkKCQoREFURV9GUk9NX0ZJTEUpICslbSVkJUglTSkKICAgZWxzZQotICAgIEJGX0JVSUxEX05VTUJFUiA6PSAkKEJVSUxEX05VTUJFUikKKyAgICBCRl9CVUlMRF9OVU1CRVIgOj0gJChmaWxlIDwkKEJVSUxEX05VTUJFUl9GSUxFKSkKICAgZW5kaWYKICAgQlVJTERfRklOR0VSUFJJTlQgOj0gJChQUk9EVUNUX0JSQU5EKS8kKFRBUkdFVF9QUk9EVUNUKS8kKFRBUkdFVF9ERVZJQ0UpOiQoUExBVEZPUk1fVkVSU0lPTikvJChCVUlMRF9JRCkvJChCRl9CVUlMRF9OVU1CRVIpOiQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLyQoQlVJTERfVkVSU0lPTl9UQUdTKQogZW5kaWYKLWlmbmVxICgkKHdvcmRzICQoQlVJTERfRklOR0VSUFJJTlQpKSwxKQotICAkKGVycm9yIEJVSUxEX0ZJTkdFUlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoQlVJTERfRklOR0VSUFJJTlQpIikKLWVuZGlmCisjIHVuc2V0IGl0IGZvciBzYWZldHkuCitCRl9CVUlMRF9OVU1CRVIgOj0KIAotJChzaGVsbCBta2RpciAtcCAkKFBST0RVQ1RfT1VUKSAmJiBlY2hvICQoQlVJTERfRklOR0VSUFJJTlQpID4gJChQUk9EVUNUX09VVCkvYnVpbGRfZmluZ2VycHJpbnQudHh0KQotQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKFBST0RVQ1RfT1VUKS9idWlsZF9maW5nZXJwcmludC50eHQpCitCVUlMRF9GSU5HRVJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX2ZpbmdlcnByaW50LnR4dAoraWZuZXEgKCwkKHNoZWxsIG1rZGlyIC1wICQoUFJPRFVDVF9PVVQpICYmIGVjaG8gJChCVUlMRF9GSU5HRVJQUklOVCkgPiQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKSkpCisgICQoZXJyb3IgQlVJTERfRklOR0VSUFJJTlQgY2Fubm90IGNvbnRhaW4gc3BhY2VzOiAiJChmaWxlIDwkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKSIpCitlbmRpZgorQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKQorIyB1bnNldCBpdCBmb3Igc2FmZXR5LgorQlVJTERfRklOR0VSUFJJTlQgOj0KIAogIyBUaGUgc3RyaW5nIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHN5c3RlbSBidWlsZDsgdXNlZCBieSB0aGUgT1RBIHNlcnZlci4KICMgVGhpcyBwdXJwb3NlZnVsbHkgZXhjbHVkZXMgYW55IHByb2R1Y3Qtc3BlY2lmaWMgdmFyaWFibGVzLgogaWZlcSAoLCQoc3RyaXAgJChCVUlMRF9USFVNQlBSSU5UKSkpCi0gIEJVSUxEX1RIVU1CUFJJTlQgOj0gJChQTEFURk9STV9WRVJTSU9OKS8kKEJVSUxEX0lEKS8kKEJVSUxEX05VTUJFUik6JChUQVJHRVRfQlVJTERfVkFSSUFOVCkvJChCVUlMRF9WRVJTSU9OX1RBR1MpCisgIEJVSUxEX1RIVU1CUFJJTlQgOj0gJChQTEFURk9STV9WRVJTSU9OKS8kKEJVSUxEX0lEKS8kKEJVSUxEX05VTUJFUl9GUk9NX0ZJTEUpOiQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLyQoQlVJTERfVkVSU0lPTl9UQUdTKQogZW5kaWYKLWlmbmVxICgkKHdvcmRzICQoQlVJTERfVEhVTUJQUklOVCkpLDEpCi0gICQoZXJyb3IgQlVJTERfVEhVTUJQUklOVCBjYW5ub3QgY29udGFpbiBzcGFjZXM6ICIkKEJVSUxEX1RIVU1CUFJJTlQpIikKKworQlVJTERfVEhVTUJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX3RodW1icHJpbnQudHh0CitpZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX1RIVU1CUFJJTlQpID4kKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSkKKyAgJChlcnJvciBCVUlMRF9USFVNQlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoZmlsZSA8JChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSIpCiBlbmRpZgorQlVJTERfVEhVTUJQUklOVF9GUk9NX0ZJTEUgOj0gJCQoY2F0ICQoQlVJTERfVEhVTUJQUklOVF9GSUxFKSkKKyMgdW5zZXQgaXQgZm9yIHNhZmV0eS4KK0JVSUxEX1RIVU1CUFJJTlQgOj0KIAogS05PV05fT0VNX1RIVU1CUFJJTlRfUFJPUEVSVElFUyA6PSBcCiAgICAgcm8ucHJvZHVjdC5icmFuZCBcCkBAIC0yMzUsMTUgKzI5MiwxNSBAQAogJChzdHJpcCAkKHN1YnN0IF8sLSwgJChmaXJzdHdvcmQgJCgxKSkpKQogZW5kZWYKIAotQlVJTERJTkZPX1NIIDo9IGJ1aWxkL3Rvb2xzL2J1aWxkaW5mby5zaAotVkVORE9SX0JVSUxESU5GT19TSCA6PSBidWlsZC90b29scy92ZW5kb3JfYnVpbGRpbmZvLnNoCitCVUlMRElORk9fU0ggOj0gYnVpbGQvbWFrZS90b29scy9idWlsZGluZm8uc2gKK1ZFTkRPUl9CVUlMRElORk9fU0ggOj0gYnVpbGQvbWFrZS90b29scy92ZW5kb3JfYnVpbGRpbmZvLnNoCiAKICMgVEFSR0VUX0JVSUxEX0ZMQVZPUiBhbmQgcm8uYnVpbGQuZmxhdm9yIGFyZSB1c2VkIG9ubHkgYnkgdGhlIHRlc3QKICMgaGFybmVzcyB0byBkaXN0aW5ndWlzaCBidWlsZHMuIE9ubHkgYWRkIF9hc2FuIGZvciBhIHNhbml0aXplZCBidWlsZAogIyBpZiBpdCBpc24ndCBhbHJlYWR5IGEgcGFydCBvZiB0aGUgZmxhdm9yICh2aWEgYSBkZWRpY2F0ZWQgbHVuY2gKICMgY29uZmlnIGZvciBleGFtcGxlKS4KIFRBUkdFVF9CVUlMRF9GTEFWT1IgOj0gJChUQVJHRVRfUFJPRFVDVCktJChUQVJHRVRfQlVJTERfVkFSSUFOVCkKLWlmZGVmIFNBTklUSVpFX1RBUkdFVAoraWZuZXEgKCwgJChmaWx0ZXIgYWRkcmVzcywgJChTQU5JVElaRV9UQVJHRVQpKSkKIGlmZXEgKCwkKGZpbmRzdHJpbmcgX2FzYW4sJChUQVJHRVRfQlVJTERfRkxBVk9SKSkpCiBUQVJHRVRfQlVJTERfRkxBVk9SIDo9ICQoVEFSR0VUX0JVSUxEX0ZMQVZPUilfYXNhbgogZW5kaWYKQEAgLTI1NCw3ICszMTEsNyBAQAogZWxzZQogc3lzdGVtX3Byb3BfZmlsZSA6PSAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL3N5c3RlbS5wcm9wKQogZW5kaWYKLSQoaW50ZXJtZWRpYXRlX3N5c3RlbV9idWlsZF9wcm9wKTogJChWRU5ET1JfQlVJTERJTkZPX1NIKSAkKEJVSUxESU5GT19TSCkgJChJTlRFUk5BTF9CVUlMRF9JRF9NQUtFRklMRSkgJChCVUlMRF9TWVNURU0pL3ZlcnNpb25fZGVmYXVsdHMubWsgJChzeXN0ZW1fcHJvcF9maWxlKSAkKElOU1RBTExFRF9BTkRST0lEX0lORk9fVFhUX1RBUkdFVCkKKyQoaW50ZXJtZWRpYXRlX3N5c3RlbV9idWlsZF9wcm9wKTogJChCVUlMRElORk9fU0gpICQoSU5URVJOQUxfQlVJTERfSURfTUFLRUZJTEUpICQoQlVJTERfU1lTVEVNKS92ZXJzaW9uX2RlZmF1bHRzLm1rICQoc3lzdGVtX3Byb3BfZmlsZSkgJChJTlNUQUxMRURfQU5EUk9JRF9JTkZPX1RYVF9UQVJHRVQpCiAJQGVjaG8gVGFyZ2V0IGJ1aWxkaW5mbzogJEAKIAlAbWtkaXIgLXAgJChkaXIgJEApCiAJJChoaWRlKSBlY2hvID4gJEAKQEAgLTI4OCw5ICszNDUsMTAgQEAKIAkJCVBMQVRGT1JNX1BSRVZJRVdfU0RLX1ZFUlNJT049IiQoUExBVEZPUk1fUFJFVklFV19TREtfVkVSU0lPTikiIFwKIAkJCVBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUU9IiQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkiIFwKIAkJCVBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUz0iJChQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMpIiBcCisJCQlQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTj0iJChQTEFURk9STV9NSU5fU1VQUE9SVEVEX1RBUkdFVF9TREtfVkVSU0lPTikiIFwKIAkJCUJVSUxEX1ZFUlNJT05fVEFHUz0iJChCVUlMRF9WRVJTSU9OX1RBR1MpIiBcCiAJCQlCVUlMRF9GSU5HRVJQUklOVD0iJChCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUpIiBcCi0JCQkkKGlmICQoT0VNX1RIVU1CUFJJTlRfUFJPUEVSVElFUyksQlVJTERfVEhVTUJQUklOVD0iJChCVUlMRF9USFVNQlBSSU5UKSIpIFwKKwkJCSQoaWYgJChPRU1fVEhVTUJQUklOVF9QUk9QRVJUSUVTKSxCVUlMRF9USFVNQlBSSU5UPSIkKEJVSUxEX1RIVU1CUFJJTlRfRlJPTV9GSUxFKSIpIFwKIAkJCVRBUkdFVF9DUFVfQUJJX0xJU1Q9IiQoVEFSR0VUX0NQVV9BQklfTElTVCkiIFwKIAkJCVRBUkdFVF9DUFVfQUJJX0xJU1RfMzJfQklUPSIkKFRBUkdFVF9DUFVfQUJJX0xJU1RfMzJfQklUKSIgXAogCQkJVEFSR0VUX0NQVV9BQklfTElTVF82NF9CSVQ9IiQoVEFSR0VUX0NQVV9BQklfTElTVF82NF9CSVQpIiBcCkBAIC0yOTgsMTYgKzM1Niw2IEBACiAJCQlUQVJHRVRfQ1BVX0FCSTI9IiQoVEFSR0VUX0NQVV9BQkkyKSIgXAogCQkJVEFSR0VUX0FBUFRfQ0hBUkFDVEVSSVNUSUNTPSIkKFRBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUykiIFwKIAkgICAgICAgIGJhc2ggJChCVUlMRElORk9fU0gpID4+ICRACi1pZm5kZWYgcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQKLQkkKGhpZGUpIFRBUkdFVF9ERVZJQ0U9IiQoVEFSR0VUX0RFVklDRSkiIFwKLQkJCVBST0RVQ1RfTkFNRT0iJChUQVJHRVRfUFJPRFVDVCkiIFwKLQkJCVBST0RVQ1RfQlJBTkQ9IiQoUFJPRFVDVF9CUkFORCkiIFwKLQkJCVBST0RVQ1RfTU9ERUw9IiQoUFJPRFVDVF9NT0RFTCkiIFwKLQkJCVBST0RVQ1RfTUFOVUZBQ1RVUkVSPSIkKFBST0RVQ1RfTUFOVUZBQ1RVUkVSKSIgXAotCQkJVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRT0iJChUQVJHRVRfQk9PVExPQURFUl9CT0FSRF9OQU1FKSIgXAotCQkJVEFSR0VUX0JPQVJEX1BMQVRGT1JNPSIkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkiIFwKLQkgICAgICAgIGJhc2ggJChWRU5ET1JfQlVJTERJTkZPX1NIKSA+PiAkQAotZW5kaWYKIAkkKGhpZGUpICQoZm9yZWFjaCBmaWxlLCQoc3lzdGVtX3Byb3BfZmlsZSksIFwKIAkJaWYgWyAtZiAiJChmaWxlKSIgXTsgdGhlbiBcCiAJCQllY2hvICIjIiA+PiAkQDsgXApAQCAtMzI0LDcgKzM3Miw3IEBACiAJJChoaWRlKSAkKGZvcmVhY2ggbGluZSwkKEZJTkFMX0JVSUxEX1BST1BFUlRJRVMpLCBcCiAJCWVjaG8gIiQobGluZSkiID4+ICRAOykKIAkkKGhpZGUpIGNhdCAkKElOU1RBTExFRF9BTkRST0lEX0lORk9fVFhUX1RBUkdFVCkgfCBncmVwICdyZXF1aXJlIHZlcnNpb24tJyB8IHNlZCAtZSAncy9yZXF1aXJlIHZlcnNpb24tL3JvLmJ1aWxkLmV4cGVjdC4vZycgPj4gJEAKLQkkKGhpZGUpIGJ1aWxkL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSAkQCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TWVNURU1fUFJPUEVSVFlfQkxBQ0tMSVNUKQorCSQoaGlkZSkgYnVpbGQvbWFrZS90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkgJEAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1lTVEVNX1BST1BFUlRZX0JMQUNLTElTVCkKIAogYnVpbGRfZGVzYyA6PQogCkBAIC0zMzYsMTEgKzM4NCw3IEBACiAKICQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKTogJChpbnRlcm1lZGlhdGVfc3lzdGVtX2J1aWxkX3Byb3ApICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKQogCUBlY2hvICJUYXJnZXQgYnVpbGQgaW5mbzogJEAiCi1pZmRlZiBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFCiAJJChoaWRlKSBncmVwIC12ICdyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCcgJChpbnRlcm1lZGlhdGVfc3lzdGVtX2J1aWxkX3Byb3ApID4gJEAKLWVsc2UKLQkkKGhpZGUpIGNhdCAkKGludGVybWVkaWF0ZV9zeXN0ZW1fYnVpbGRfcHJvcCkgPiAkQAotZW5kaWYKIGlmZGVmIElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVAogCSQoaGlkZSkgZWNobyByby5leHBlY3QucmVjb3ZlcnlfaWQ9YGNhdCAkKFJFQ09WRVJZSU1BR0VfSURfRklMRSlgID4+ICRACiBlbmRpZgpAQCAtMzQ5LDcgKzM5Myw2IEBACiAjIHZlbmRvciBidWlsZC5wcm9wCiAjCiAjIEZvciB2ZXJpZnlpbmcgdGhhdCB0aGUgdmVuZG9yIGJ1aWxkIGlzIHdoYXQgd2UgdGhpbmsgaXQgaXMKLWlmZGVmIEJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUKIElOU1RBTExFRF9WRU5ET1JfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikvYnVpbGQucHJvcAogQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChJTlNUQUxMRURfVkVORE9SX0JVSUxEX1BST1BfVEFSR0VUKQogCkBAIC0zNjgsNyArNDExLDkgQEAKIAkkKGhpZGUpIGVjaG8gcm8udmVuZG9yLmJ1aWxkLmRhdGU9YCQoREFURV9GUk9NX0ZJTEUpYD4+JEAKIAkkKGhpZGUpIGVjaG8gcm8udmVuZG9yLmJ1aWxkLmRhdGUudXRjPWAkKERBVEVfRlJPTV9GSUxFKSArJXNgPj4kQAogCSQoaGlkZSkgZWNobyByby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQ9IiQoQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFKSI+PiRACi1pZmRlZiBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZAorCSQoaGlkZSkgZWNobyByby52ZW5kb3IucHJvZHVjdC5jcHUuYWJpbGlzdD0iJChUQVJHRVRfQ1BVX0FCSV9MSVNUKSI+PiRACisJJChoaWRlKSBlY2hvIHJvLnZlbmRvci5wcm9kdWN0LmNwdS5hYmlsaXN0MzI9IiQoVEFSR0VUX0NQVV9BQklfTElTVF8zMl9CSVQpIj4+JEAKKwkkKGhpZGUpIGVjaG8gcm8udmVuZG9yLnByb2R1Y3QuY3B1LmFiaWxpc3Q2ND0iJChUQVJHRVRfQ1BVX0FCSV9MSVNUXzY0X0JJVCkiPj4kQAogCSQoaGlkZSkgVEFSR0VUX0RFVklDRT0iJChUQVJHRVRfREVWSUNFKSIgXAogCQkJUFJPRFVDVF9OQU1FPSIkKFRBUkdFVF9QUk9EVUNUKSIgXAogCQkJUFJPRFVDVF9CUkFORD0iJChQUk9EVUNUX0JSQU5EKSIgXApAQCAtMzc3LDE0ICs0MjIsNDAgQEAKIAkJCVRBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUU9IiQoVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSkiIFwKIAkJCVRBUkdFVF9CT0FSRF9QTEFURk9STT0iJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pIiBcCiAJICAgICAgICBiYXNoICQoVkVORE9SX0JVSUxESU5GT19TSCkgPj4gJEAKK2lmZGVmIHByb3BlcnR5X292ZXJyaWRlc19zcGxpdF9lbmFibGVkCiAJJChoaWRlKSBlY2hvICIjIiA+PiAkQDsgXAogCSAgICAgICAgZWNobyAiIyBBRERJVElPTkFMIFZFTkRPUiBCVUlMRCBQUk9QRVJUSUVTIiA+PiAkQDsgXAogCSAgICAgICAgZWNobyAiIyIgPj4gJEA7CiAJJChoaWRlKSAkKGZvcmVhY2ggbGluZSwkKEZJTkFMX1ZFTkRPUl9CVUlMRF9QUk9QRVJUSUVTKSwgXAogCQllY2hvICIkKGxpbmUpIiA+PiAkQDspCi0JJChoaWRlKSBidWlsZC90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkgJEAKKwkkKGhpZGUpIGJ1aWxkL21ha2UvdG9vbHMvcG9zdF9wcm9jZXNzX3Byb3BzLnB5ICRACiBlbmRpZiAgIyBwcm9wZXJ0eV9vdmVycmlkZXNfc3BsaXRfZW5hYmxlZAotZW5kaWYgICMgQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHByb2R1Y3QgYnVpbGQucHJvcAorSU5TVEFMTEVEX1BST0RVQ1RfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2J1aWxkLnByb3AKK0FMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoSU5TVEFMTEVEX1BST0RVQ1RfQlVJTERfUFJPUF9UQVJHRVQpCisKK0ZJTkFMX1BST0RVQ1RfUFJPUEVSVElFUyArPSBcCisgICAgJChjYWxsIGNvbGxhcHNlLXBhaXJzLCAkKFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTKSkKK0ZJTkFMX1BST0RVQ1RfUFJPUEVSVElFUyA6PSAkKGNhbGwgdW5pcS1wYWlycy1ieS1maXJzdC1jb21wb25lbnQsIFwKKyAgICAkKEZJTkFMX1BST0RVQ1RfUFJPUEVSVElFUyksPSkKKworJChJTlNUQUxMRURfUFJPRFVDVF9CVUlMRF9QUk9QX1RBUkdFVCk6CisJQGVjaG8gVGFyZ2V0IHByb2R1Y3QgYnVpbGRpbmZvOiAkQAorCUBta2RpciAtcCAkKGRpciAkQCkKKwkkKGhpZGUpIGVjaG8gPiAkQAoraWZkZWYgQk9BUkRfVVNFU19QUk9EVUNUSU1BR0UKKwkkKGhpZGUpIGVjaG8gcm8ucHJvZHVjdC5idWlsZC5kYXRlPWAkKERBVEVfRlJPTV9GSUxFKWA+PiRACisJJChoaWRlKSBlY2hvIHJvLnByb2R1Y3QuYnVpbGQuZGF0ZS51dGM9YCQoREFURV9GUk9NX0ZJTEUpICslc2A+PiRACisJJChoaWRlKSBlY2hvIHJvLnByb2R1Y3QuYnVpbGQuZmluZ2VycHJpbnQ9IiQoQlVJTERfRklOR0VSUFJJTlRfRlJPTV9GSUxFKSI+PiRACitlbmRpZiAgIyBCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRQorCSQoaGlkZSkgZWNobyAiIyIgPj4gJEA7IFwKKwkgICAgICAgIGVjaG8gIiMgQURESVRJT05BTCBQUk9EVUNUIFBST1BFUlRJRVMiID4+ICRAOyBcCisJICAgICAgICBlY2hvICIjIiA+PiAkQDsKKwkkKGhpZGUpICQoZm9yZWFjaCBsaW5lLCQoRklOQUxfUFJPRFVDVF9QUk9QRVJUSUVTKSwgXAorCQllY2hvICIkKGxpbmUpIiA+PiAkQDspCisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weSAkQAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNDI4LDcgKzQ5OSw3IEBACiAjIENyZWF0ZSBlbXB0eSBwYWNrYWdlIHN0YXRzIGZpbGUgaWYgdGFyZ2V0IGJ1aWxkcyBubyBqYXIocykgb3IgYXBrKHMpLgogCSQoaGlkZSkgdG91Y2ggJEAKIGVsc2UKLQkkKGhpZGUpIGJ1aWxkL3Rvb2xzL2R1bXAtcGFja2FnZS1zdGF0cyAkXiA+ICRACisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL2R1bXAtcGFja2FnZS1zdGF0cyAkXiA+ICRACiBlbmRpZgogCiAuUEhPTlk6IHBhY2thZ2Utc3RhdHMKQEAgLTQ4OCw5ICs1NTksOSBAQAogU09PTkdfQ09OVl9EQVRBIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHNvb25nX2NvbnZlcnNpb24pL3Nvb25nX2NvbnZfZGF0YQogJChTT09OR19DT05WX0RBVEEpOgogCUBybSAtZiAkQAotCUAkKGZvcmVhY2ggcywkKFNPT05HX0NPTlYpLGVjaG8gIiQocyksJChzb3J0ICQoU09PTkdfQ09OVi4kKHMpLlBST0JMRU1TKSksJChzb3J0ICQoZmlsdGVyLW91dCAkKFNPT05HX0FMUkVBRFlfQ09OViksJChTT09OR19DT05WLiQocykuREVQUykpKSIgPj4kQDspCisJQCQoZm9yZWFjaCBzLCQoU09PTkdfQ09OViksZWNobyAiJChzKSwkKFNPT05HX0NPTlYuJChzKS5UWVBFKSwkKHNvcnQgJChTT09OR19DT05WLiQocykuUFJPQkxFTVMpKSwkKHNvcnQgJChmaWx0ZXItb3V0ICQoU09PTkdfQUxSRUFEWV9DT05WKSwkKFNPT05HX0NPTlYuJChzKS5ERVBTKSkpIiA+PiRAOykKIAotU09PTkdfVE9fQ09OVkVSVF9TQ1JJUFQgOj0gYnVpbGQvdG9vbHMvc29vbmdfdG9fY29udmVydC5weQorU09PTkdfVE9fQ09OVkVSVF9TQ1JJUFQgOj0gYnVpbGQvbWFrZS90b29scy9zb29uZ190b19jb252ZXJ0LnB5CiBTT09OR19UT19DT05WRVJUIDo9ICQoUFJPRFVDVF9PVVQpL3Nvb25nX3RvX2NvbnZlcnQudHh0CiAkKFNPT05HX1RPX0NPTlZFUlQpOiAkKFNPT05HX0NPTlZfREFUQSkgJChTT09OR19UT19DT05WRVJUX1NDUklQVCkKIAlAcm0gLWYgJEAKQEAgLTQ5OCw2ICs1NjksMjggQEAKICQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUsJChTT09OR19UT19DT05WRVJUKSkKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNb2R1bGVzIHVzZSAtV25vLWVycm9yLCBvciBhZGRlZCBkZWZhdWx0IC1XYWxsIC1XZXJyb3IKK1dBTExfV0VSUk9SIDo9ICQoUFJPRFVDVF9PVVQpL3dhbGxfd2Vycm9yLnR4dAorJChXQUxMX1dFUlJPUik6CisJQHJtIC1mICRACisJZWNobyAiIyBNb2R1bGVzIHVzaW5nIC1Xbm8tZXJyb3IiID4+ICRACisJZm9yIG0gaW4gJChzb3J0ICQoU09PTkdfTU9EVUxFU19VU0lOR19XTk9fRVJST1IpICQoTU9EVUxFU19VU0lOR19XTk9fRVJST1IpKTsgZG8gZWNobyAkJG0gPj4gJEA7IGRvbmUKKwllY2hvICIjIE1vZHVsZXMgYWRkZWQgZGVmYXVsdCAtV2FsbCIgPj4gJEAKKwlmb3IgbSBpbiAkKHNvcnQgJChTT09OR19NT0RVTEVTX0FEREVEX1dBTEwpICQoTU9EVUxFU19BRERFRF9XQUxMKSk7IGRvIGVjaG8gJCRtID4+ICRAOyBkb25lCisKKyQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUsJChXQUxMX1dFUlJPUikpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTW9kdWxlcyBtaXNzaW5nIHByb2ZpbGUgZmlsZXMKK1BHT19QUk9GSUxFX01JU1NJTkcgOj0gJChQUk9EVUNUX09VVCkvcGdvX3Byb2ZpbGVfZmlsZV9taXNzaW5nLnR4dAorJChQR09fUFJPRklMRV9NSVNTSU5HKToKKwlAcm0gLWYgJEAKKwllY2hvICIjIE1vZHVsZXMgbWlzc2luZyBQR08gcHJvZmlsZSBmaWxlcyIgPj4gJEAKKwlmb3IgbSBpbiAkKFNPT05HX01PRFVMRVNfTUlTU0lOR19QR09fUFJPRklMRV9GSUxFKTsgZG8gZWNobyAkJG0gPj4gJEA7IGRvbmUKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRyb2lkY29yZSwkKFBHT19QUk9GSUxFX01JU1NJTkcpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRoZSBkZXYga2V5IGlzIHVzZWQgdG8gc2lnbiB0aGlzIHBhY2thZ2UsIGFuZCBhcyB0aGUga2V5IHJlcXVpcmVkCiAjIGZvciBmdXR1cmUgT1RBIHBhY2thZ2VzIGluc3RhbGxlZCBieSB0aGlzIHN5c3RlbS4gIEFjdHVhbCBwcm9kdWN0CiAjIGRlbGl2ZXJhYmxlcyB3aWxsIGJlIHJlLXNpZ25lZCBieSBoYW5kLiAgV2UgZXhwZWN0IHRoaXMgZmlsZSB0bwpAQCAtNTMxLDcgKzYyNCw3IEBACiBwZGtfZnVzaW9uX2xvZ190YWdzX2ZpbGUgOj0gJChwYXRzdWJzdCAkKFBST0RVQ1RfT1VUKS8lLCQoX3Bka19mdXNpb25faW50ZXJtZWRpYXRlcykvJSwkKGZpbHRlciAkKGV2ZW50X2xvZ190YWdzX2ZpbGUpLCQoQUxMX1BES19GVVNJT05fRklMRVMpKSkKIAogJChhbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSk6IFBSSVZBVEVfU1JDX0ZJTEVTIDo9ICQoYWxsX2V2ZW50X2xvZ190YWdzX3NyYykgJChwZGtfZnVzaW9uX2xvZ190YWdzX2ZpbGUpCi0kKGFsbF9ldmVudF9sb2dfdGFnc19maWxlKTogJChhbGxfZXZlbnRfbG9nX3RhZ3Nfc3JjKSAkKHBka19mdXNpb25fbG9nX3RhZ3NfZmlsZSkgJChNRVJHRVRBR1MpIGJ1aWxkL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5CiskKGFsbF9ldmVudF9sb2dfdGFnc19maWxlKTogJChhbGxfZXZlbnRfbG9nX3RhZ3Nfc3JjKSAkKHBka19mdXNpb25fbG9nX3RhZ3NfZmlsZSkgJChNRVJHRVRBR1MpIGJ1aWxkL21ha2UvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogCSQoaGlkZSkgJChNRVJHRVRBR1MpIC1vICRAICQoUFJJVkFURV9TUkNfRklMRVMpCiAKQEAgLTU0Nyw3ICs2NDAsNyBAQAogCiAkKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiBQUklWQVRFX1NSQ19GSUxFUyA6PSAkKGV2ZW50X2xvZ190YWdzX3NyYykgJChwZGtfZnVzaW9uX2xvZ190YWdzX2ZpbGUpCiAkKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiBQUklWQVRFX01FUkdFRF9GSUxFIDo9ICQoYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUpCi0kKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiAkKGV2ZW50X2xvZ190YWdzX3NyYykgJChhbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSkgJChwZGtfZnVzaW9uX2xvZ190YWdzX2ZpbGUpICQoTUVSR0VUQUdTKSBidWlsZC90b29scy9ldmVudF9sb2dfdGFncy5weQorJChldmVudF9sb2dfdGFnc19maWxlKTogJChldmVudF9sb2dfdGFnc19zcmMpICQoYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUpICQocGRrX2Z1c2lvbl9sb2dfdGFnc19maWxlKSAkKE1FUkdFVEFHUykgYnVpbGQvbWFrZS90b29scy9ldmVudF9sb2dfdGFncy5weQogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCiAJJChoaWRlKSAkKE1FUkdFVEFHUykgLW8gJEAgLW0gJChQUklWQVRFX01FUkdFRF9GSUxFKSAkKFBSSVZBVEVfU1JDX0ZJTEVTKQogCkBAIC01OTUsNiArNjg4LDggQEAKIAlAZWNobyAibWFrZSAkQDogaWdub3JpbmcgZGVwZW5kZW5jaWVzIgogCSQoaGlkZSkgJChNS0JPT1RGUykgLWQgJChUQVJHRVRfT1VUKSAkKFRBUkdFVF9ST09UX09VVCkgfCAkKE1JTklHWklQKSA+ICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKQogCitJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9ib290LmltZworCiBpZm5lcSAoJChzdHJpcCAkKFRBUkdFVF9OT19LRVJORUwpKSx0cnVlKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MzMsOCArNzI4LDYgQEAKICAgICAtLW9zX3ZlcnNpb24gJChQTEFURk9STV9WRVJTSU9OKSBcCiAgICAgLS1vc19wYXRjaF9sZXZlbCAkKFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIKQogCi1JTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9ib290LmltZwotCiAjIEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCA9IHRydWUgbXVzdCBoYXZlIEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFID0gdHJ1ZS4KIGlmZXEgKCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSx0cnVlKQogaWZuZXEgKCQoQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UpLHRydWUpCkBAIC02NTIsNyArNzQ1LDcgQEAKICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpOiAkKE1LQk9PVElNRykgJChBVkJUT09MKSAkKElOVEVSTkFMX0JPT1RJTUFHRV9GSUxFUykgJChCT0FSRF9BVkJfQk9PVF9LRVlfUEFUSCkKIAkkKGNhbGwgcHJldHR5LCJUYXJnZXQgYm9vdCBpbWFnZTogJEAiKQogCSQoaGlkZSkgJChNS0JPT1RJTUcpICQoSU5URVJOQUxfQk9PVElNQUdFX0FSR1MpICQoSU5URVJOQUxfTUtCT09USU1HX1ZFUlNJT05fQVJHUykgJChCT0FSRF9NS0JPT1RJTUdfQVJHUykgLS1vdXRwdXQgJEAKLQkkKGhpZGUpICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJEAsJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKQorCSQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkQCwkKGNhbGwgZ2V0LWhhc2gtaW1hZ2UtbWF4LXNpemUsJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKSkKIAkkKGhpZGUpICQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKIAkgIC0taW1hZ2UgJEAgXAogCSAgLS1wYXJ0aXRpb25fc2l6ZSAkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkgXApAQCAtNjYzLDkgKzc1Niw5IEBACiBib290aW1hZ2Utbm9kZXBzOiAkKE1LQk9PVElNRykgJChBVkJUT09MKSAkKEJPQVJEX0FWQl9CT09UX0tFWV9QQVRIKQogCUBlY2hvICJtYWtlICRAOiBpZ25vcmluZyBkZXBlbmRlbmNpZXMiCiAJJChoaWRlKSAkKE1LQk9PVElNRykgJChJTlRFUk5BTF9CT09USU1BR0VfQVJHUykgJChJTlRFUk5BTF9NS0JPT1RJTUdfVkVSU0lPTl9BUkdTKSAkKEJPQVJEX01LQk9PVElNR19BUkdTKSAtLW91dHB1dCAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKQotCSQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSwkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkpCisJJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpLCQoY2FsbCBnZXQtaGFzaC1pbWFnZS1tYXgtc2l6ZSwkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkpKQogCSQoaGlkZSkgJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAotCSAgLS1pbWFnZSAkQCBcCisJICAtLWltYWdlICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpIFwKIAkgIC0tcGFydGl0aW9uX3NpemUgJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpIFwKIAkgIC0tcGFydGl0aW9uX25hbWUgYm9vdCAkKElOVEVSTkFMX0FWQl9CT09UX1NJR05JTkdfQVJHUykgXAogCSAgJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykKQEAgLTcxNyw2ICs4MTAsMTMgQEAKIGVuZGlmICMgQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UCiAKIGVsc2UJIyBUQVJHRVRfTk9fS0VSTkVMCitpZmRlZiBCT0FSRF9QUkVCVUlMVF9CT09USU1BR0UKK2lmbmVxICgkKEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFKSx0cnVlKQorIyBSZW1vdmUgd2hlbiBiLzYzNjc2Mjk2IGlzIHJlc29sdmVkLgorJChlcnJvciBQcmVidWlsdCBib290aW1hZ2UgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEFCIHRhcmdldHMpCitlbmRpZgorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoQk9BUkRfUFJFQlVJTFRfQk9PVElNQUdFKSwkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSkpCitlbHNlCiBJTlRFUk5BTF9LRVJORUxfQ01ETElORSA6PSAkKHN0cmlwICQoQk9BUkRfS0VSTkVMX0NNRExJTkUpKQogIyBIQUNLOiBUaGUgdG9wLWxldmVsIHRhcmdldHMgZGVwZW5kIG9uIHRoZSBib290aW1hZ2UuICBOb3QgYWxsIHRhcmdldHMKICMgY2FuIHByb2R1Y2UgYSBib290aW1hZ2UsIHRob3VnaCwgYW5kIGVtdWxhdG9yIHRhcmdldHMgbmVlZCB0aGUgcmFtZGlzawpAQCAtNzI1LDYgKzgyNSw3IEBACiAjICAgICAgIGtlcm5lbC1sZXNzIGlucHV0cy4KIElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUIDo9ICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKQogZW5kaWYKK2VuZGlmCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgTk9USUNFIGZpbGVzCkBAIC03NjQsOCArODY1LDggQEAKICQoMikgJCgzKTogUFJJVkFURV9NRVNTQUdFIDo9ICQoNCkKICQoMikgJCgzKTogUFJJVkFURV9ESVIgOj0gJCg1KQogJCgyKSA6ICQoMykKLSQoMykgOiAkKDYpICQoQlVJTERfU1lTVEVNKS9NYWtlZmlsZSBidWlsZC90b29scy9nZW5lcmF0ZS1ub3RpY2UtZmlsZXMucHkKLQlidWlsZC90b29scy9nZW5lcmF0ZS1ub3RpY2UtZmlsZXMucHkgLS10ZXh0LW91dHB1dCAkKDIpIFwKKyQoMykgOiAkKDYpICQoQlVJTERfU1lTVEVNKS9NYWtlZmlsZSBidWlsZC9tYWtlL3Rvb2xzL2dlbmVyYXRlLW5vdGljZS1maWxlcy5weQorCWJ1aWxkL21ha2UvdG9vbHMvZ2VuZXJhdGUtbm90aWNlLWZpbGVzLnB5IC0tdGV4dC1vdXRwdXQgJCgyKSBcCiAJCSQoaWYgJChmaWx0ZXIgJCgxKSx4bWxfZXhjbHVkZWRfdmVuZG9yKSwtZSB2ZW5kb3IgLS14bWwtb3V0cHV0LCBcCiAJCSAgJChpZiAkKGZpbHRlciAkKDEpLHhtbF92ZW5kb3IpLC1pIHZlbmRvciAtLXhtbC1vdXRwdXQsIFwKIAkJICAgIC0taHRtbC1vdXRwdXQpKSAkKDMpIFwKQEAgLTc4NCw3ICs4ODUsOCBAQAogdG9vbHNfbm90aWNlX2ZpbGVfdHh0IDo9ICQoSE9TVF9PVVRfSU5URVJNRURJQVRFUykvTk9USUNFLnR4dAogdG9vbHNfbm90aWNlX2ZpbGVfaHRtbCA6PSAkKEhPU1RfT1VUX0lOVEVSTUVESUFURVMpL05PVElDRS5odG1sCiAKLWlmZXEgKCQoUFJPRFVDVF9GVUxMX1RSRUJMRSksdHJ1ZSkKKyMgVE9ETyhiLzY5ODY1MDMyKTogTWFrZSBQUk9EVUNUX05PVElDRV9TUExJVCB0aGUgZGVmYXVsdCBiZWhhdmlvci4KK2lmZXEgKCQoUFJPRFVDVF9OT1RJQ0VfU1BMSVQpLHRydWUpCiB0YXJnZXRfbm90aWNlX2ZpbGVfaHRtbF9vcl94bWwgOj0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL05PVElDRS54bWwKIHRhcmdldF9ub3RpY2VfZmlsZV9odG1sX29yX3htbF9neiA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvTk9USUNFLnhtbC5negogaW5zdGFsbGVkX25vdGljZV9odG1sX29yX3htbF9neiA6PSAkKFRBUkdFVF9PVVQpL2V0Yy9OT1RJQ0UueG1sLmd6CkBAIC05NTUsNyArMTA1Nyw3IEBACiBpZm5lcSAodHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9TUVVBU0hGU19ESVNBQkxFRCkpCiAgIElOVEVSTkFMX1VTRVJJTUFHRVNfU1BBUlNFX1NRVUFTSEZTX0ZMQUcgOj0gLXMKIGVuZGlmCi1pZm5lcSAoJChmaWx0ZXIgJChCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSAkKEJPQVJEX1NZU1RFTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHNxdWFzaGZzKSwpCitpZm5lcSAoJChmaWx0ZXIgJChCT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRSkgJChCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSAkKEJPQVJEX1NZU1RFTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHNxdWFzaGZzKSwpCiBJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMgKz0gJChNQUtFX1NRVUFTSEZTKSAkKE1LU1FVQVNIRlNVU0VSSU1HKSAkKElNRzJTSU1HKQogZW5kaWYKIApAQCAtOTg2LDcgKzEwODgsNyBAQAogJChpZiAkKEJPQVJEX1NZU1RFTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLCQoaGlkZSkgZWNobyAic3lzdGVtX2ZzX3R5cGU9JChCT0FSRF9TWVNURU1JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSIgPj4gJCgxKSkKICQoaWYgJChCT0FSRF9TWVNURU1JTUFHRV9FWFRGU19JTk9ERV9DT1VOVCksJChoaWRlKSBlY2hvICJzeXN0ZW1fZXh0ZnNfaW5vZGVfY291bnQ9JChCT0FSRF9TWVNURU1JTUFHRV9FWFRGU19JTk9ERV9DT1VOVCkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfU1lTVEVNSU1BR0VfSk9VUk5BTF9TSVpFKSwkKGhpZGUpIGVjaG8gInN5c3RlbV9qb3VybmFsX3NpemU9JChCT0FSRF9TWVNURU1JTUFHRV9KT1VSTkFMX1NJWkUpIiA+PiAkKDEpKQotJChpZiAkKEJPQVJEX0hBU19FWFQ0X1JFU0VSVkVEX0JMT0NLUyksJChoaWRlKSBlY2hvICJoYXNfZXh0NF9yZXNlcnZlZF9ibG9ja3M9JChCT0FSRF9IQVNfRVhUNF9SRVNFUlZFRF9CTE9DS1MpIiA+PiAkKDEpKQorJChpZiAkKEJPQVJEX0VYVDRfU0hBUkVfRFVQX0JMT0NLUyksJChoaWRlKSBlY2hvICJleHQ0X3NoYXJlX2R1cF9ibG9ja3M9JChCT0FSRF9FWFQ0X1NIQVJFX0RVUF9CTE9DS1MpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX1NZU1RFTUlNQUdFX1NRVUFTSEZTX0NPTVBSRVNTT1IpLCQoaGlkZSkgZWNobyAic3lzdGVtX3NxdWFzaGZzX2NvbXByZXNzb3I9JChCT0FSRF9TWVNURU1JTUFHRV9TUVVBU0hGU19DT01QUkVTU09SKSIgPj4gJCgxKSkKICQoaWYgJChCT0FSRF9TWVNURU1JTUFHRV9TUVVBU0hGU19DT01QUkVTU09SX09QVCksJChoaWRlKSBlY2hvICJzeXN0ZW1fc3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQ9JChCT0FSRF9TWVNURU1JTUFHRV9TUVVBU0hGU19DT01QUkVTU09SX09QVCkiID4+ICQoMSkpCiAkKGlmICQoQk9BUkRfU1lTVEVNSU1BR0VfU1FVQVNIRlNfQkxPQ0tfU0laRSksJChoaWRlKSBlY2hvICJzeXN0ZW1fc3F1YXNoZnNfYmxvY2tfc2l6ZT0kKEJPQVJEX1NZU1RFTUlNQUdFX1NRVUFTSEZTX0JMT0NLX1NJWkUpIiA+PiAkKDEpKQpAQCAtMTAwOCw2ICsxMTEwLDE1IEBACiAkKGlmICQoQk9BUkRfVkVORE9SSU1BR0VfU1FVQVNIRlNfQkxPQ0tfU0laRSksJChoaWRlKSBlY2hvICJ2ZW5kb3Jfc3F1YXNoZnNfYmxvY2tfc2l6ZT0kKEJPQVJEX1ZFTkRPUklNQUdFX1NRVUFTSEZTX0JMT0NLX1NJWkUpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX1ZFTkRPUklNQUdFX1NRVUFTSEZTX0RJU0FCTEVfNEtfQUxJR04pLCQoaGlkZSkgZWNobyAidmVuZG9yX3NxdWFzaGZzX2Rpc2FibGVfNGtfYWxpZ249JChCT0FSRF9WRU5ET1JJTUFHRV9TUVVBU0hGU19ESVNBQkxFXzRLX0FMSUdOKSIgPj4gJCgxKSkKICQoaWYgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfVkVORE9SX0JBU0VfRlNfUEFUSCksJChoaWRlKSBlY2hvICJ2ZW5kb3JfYmFzZV9mc19maWxlPSQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1ZFTkRPUl9CQVNFX0ZTX1BBVEgpIiA+PiAkKDEpKQorJChpZiAkKEJPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSwkKGhpZGUpIGVjaG8gInByb2R1Y3RfZnNfdHlwZT0kKEJPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9QUk9EVUNUSU1BR0VfRVhURlNfSU5PREVfQ09VTlQpLCQoaGlkZSkgZWNobyAicHJvZHVjdF9leHRmc19pbm9kZV9jb3VudD0kKEJPQVJEX1BST0RVQ1RJTUFHRV9FWFRGU19JTk9ERV9DT1VOVCkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfUFJPRFVDVElNQUdFX1BBUlRJVElPTl9TSVpFKSwkKGhpZGUpIGVjaG8gInByb2R1Y3Rfc2l6ZT0kKEJPQVJEX1BST0RVQ1RJTUFHRV9QQVJUSVRJT05fU0laRSkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfUFJPRFVDVElNQUdFX0pPVVJOQUxfU0laRSksJChoaWRlKSBlY2hvICJwcm9kdWN0X2pvdXJuYWxfc2l6ZT0kKEJPQVJEX1BST0RVQ1RJTUFHRV9KT1VSTkFMX1NJWkUpIiA+PiAkKDEpKQorJChpZiAkKEJPQVJEX1BST0RVQ1RJTUFHRV9TUVVBU0hGU19DT01QUkVTU09SKSwkKGhpZGUpIGVjaG8gInByb2R1Y3Rfc3F1YXNoZnNfY29tcHJlc3Nvcj0kKEJPQVJEX1BST0RVQ1RJTUFHRV9TUVVBU0hGU19DT01QUkVTU09SKSIgPj4gJCgxKSkKKyQoaWYgJChCT0FSRF9QUk9EVUNUSU1BR0VfU1FVQVNIRlNfQ09NUFJFU1NPUl9PUFQpLCQoaGlkZSkgZWNobyAicHJvZHVjdF9zcXVhc2hmc19jb21wcmVzc29yX29wdD0kKEJPQVJEX1BST0RVQ1RJTUFHRV9TUVVBU0hGU19DT01QUkVTU09SX09QVCkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfUFJPRFVDVElNQUdFX1NRVUFTSEZTX0JMT0NLX1NJWkUpLCQoaGlkZSkgZWNobyAicHJvZHVjdF9zcXVhc2hmc19ibG9ja19zaXplPSQoQk9BUkRfUFJPRFVDVElNQUdFX1NRVUFTSEZTX0JMT0NLX1NJWkUpIiA+PiAkKDEpKQorJChpZiAkKEJPQVJEX1BST0RVQ1RJTUFHRV9TUVVBU0hGU19ESVNBQkxFXzRLX0FMSUdOKSwkKGhpZGUpIGVjaG8gInByb2R1Y3Rfc3F1YXNoZnNfZGlzYWJsZV80a19hbGlnbj0kKEJPQVJEX1BST0RVQ1RJTUFHRV9TUVVBU0hGU19ESVNBQkxFXzRLX0FMSUdOKSIgPj4gJCgxKSkKKyQoaWYgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfUFJPRFVDVF9CQVNFX0ZTX1BBVEgpLCQoaGlkZSkgZWNobyAicHJvZHVjdF9iYXNlX2ZzX2ZpbGU9JChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfUFJPRFVDVF9CQVNFX0ZTX1BBVEgpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX09FTUlNQUdFX1BBUlRJVElPTl9TSVpFKSwkKGhpZGUpIGVjaG8gIm9lbV9zaXplPSQoQk9BUkRfT0VNSU1BR0VfUEFSVElUSU9OX1NJWkUpIiA+PiAkKDEpKQogJChpZiAkKEJPQVJEX09FTUlNQUdFX0pPVVJOQUxfU0laRSksJChoaWRlKSBlY2hvICJvZW1fam91cm5hbF9zaXplPSQoQk9BUkRfT0VNSU1BR0VfSk9VUk5BTF9TSVpFKSIgPj4gJCgxKSkKICQoaWYgJChCT0FSRF9PRU1JTUFHRV9FWFRGU19JTk9ERV9DT1VOVCksJChoaWRlKSBlY2hvICJvZW1fZXh0ZnNfaW5vZGVfY291bnQ9JChCT0FSRF9PRU1JTUFHRV9FWFRGU19JTk9ERV9DT1VOVCkiID4+ICQoMSkpCkBAIC0xMDE5LDggKzExMzAsMTAgQEAKICQoaWYgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1VQUE9SVFNfVkVSSVRZKSwkKGhpZGUpIGVjaG8gInZlcml0eV9rZXk9JChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfVkVSSVRZX1NJR05JTkdfS0VZKSIgPj4gJCgxKSkKICQoaWYgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1VQUE9SVFNfVkVSSVRZKSwkKGhpZGUpIGVjaG8gInZlcml0eV9zaWduZXJfY21kPSQobm90ZGlyICQoVkVSSVRZX1NJR05FUikpIiA+PiAkKDEpKQogJChpZiAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WRVJJVFlfRkVDKSwkKGhpZGUpIGVjaG8gInZlcml0eV9mZWM9JChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1VQUE9SVFNfVkVSSVRZX0ZFQykiID4+ICQoMSkpCiskKGlmICQoZmlsdGVyIGVuZywgJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpLCQoaGlkZSkgZWNobyAidmVyaXR5X2Rpc2FibGU9dHJ1ZSIgPj4gJCgxKSkKICQoaWYgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1lTVEVNX1ZFUklUWV9QQVJUSVRJT04pLCQoaGlkZSkgZWNobyAic3lzdGVtX3Zlcml0eV9ibG9ja19kZXZpY2U9JChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1lTVEVNX1ZFUklUWV9QQVJUSVRJT04pIiA+PiAkKDEpKQogJChpZiAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WRU5ET1JfVkVSSVRZX1BBUlRJVElPTiksJChoaWRlKSBlY2hvICJ2ZW5kb3JfdmVyaXR5X2Jsb2NrX2RldmljZT0kKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WRU5ET1JfVkVSSVRZX1BBUlRJVElPTikiID4+ICQoMSkpCiskKGlmICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1BST0RVQ1RfVkVSSVRZX1BBUlRJVElPTiksJChoaWRlKSBlY2hvICJwcm9kdWN0X3Zlcml0eV9ibG9ja19kZXZpY2U9JChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfUFJPRFVDVF9WRVJJVFlfUEFSVElUSU9OKSIgPj4gJCgxKSkKICQoaWYgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpLCQoaGlkZSkgZWNobyAidmJvb3Q9JChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpIiA+PiAkKDEpKQogJChpZiAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WQk9PVCksJChoaWRlKSBlY2hvICJ2Ym9vdF9rZXk9JChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfVkJPT1RfU0lHTklOR19LRVkpIiA+PiAkKDEpKQogJChpZiAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WQk9PVCksJChoaWRlKSBlY2hvICJ2Ym9vdF9zdWJrZXk9JChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfVkJPT1RfU0lHTklOR19TVUJLRVkpIiA+PiAkKDEpKQpAQCAtMTA0MSw2ICsxMTU0LDEzIEBACiAgICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9rZXlfcGF0aD0kKEJPQVJEX0FWQl9WRU5ET1JfS0VZX1BBVEgpIiA+PiAkKDEpCiAgICAgICAgICQoaGlkZSkgZWNobyAiYXZiX3ZlbmRvcl9hbGdvcml0aG09JChCT0FSRF9BVkJfVkVORE9SX0FMR09SSVRITSkiID4+ICQoMSkKICAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfdmVuZG9yX3JvbGxiYWNrX2luZGV4X2xvY2F0aW9uPSQoQk9BUkRfQVZCX1ZFTkRPUl9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICQoMSkpKQorJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLCQoaGlkZSkgZWNobyAiYXZiX3Byb2R1Y3RfaGFzaHRyZWVfZW5hYmxlPSQoQk9BUkRfQVZCX0VOQUJMRSkiID4+ICQoMSkpCiskKGlmICQoQk9BUkRfQVZCX0VOQUJMRSksJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3M9JChCT0FSRF9BVkJfUFJPRFVDVF9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MpIiA+PiAkKDEpKQorJChpZiAkKEJPQVJEX0FWQl9FTkFCTEUpLFwKKyAgICAkKGlmICQoQk9BUkRfQVZCX1BST0RVQ1RfS0VZX1BBVEgpLFwKKyAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9rZXlfcGF0aD0kKEJPQVJEX0FWQl9QUk9EVUNUX0tFWV9QQVRIKSIgPj4gJCgxKQorICAgICAgICAkKGhpZGUpIGVjaG8gImF2Yl9wcm9kdWN0X2FsZ29yaXRobT0kKEJPQVJEX0FWQl9QUk9EVUNUX0FMR09SSVRITSkiID4+ICQoMSkKKyAgICAgICAgJChoaWRlKSBlY2hvICJhdmJfcHJvZHVjdF9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9QUk9EVUNUX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSIgPj4gJCgxKSkpCiAkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKSxcCiAgICAgJChoaWRlKSBlY2hvICJyZWNvdmVyeV9hc19ib290PXRydWUiID4+ICQoMSkpCiAkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9CVUlMRF9TWVNURU1fUk9PVF9JTUFHRSkpLFwKQEAgLTEwNDksNiArMTE2OSwyMyBAQAogJChpZiAkKDIpLCQoaGlkZSkgJChmb3JlYWNoIGt2LCQoMiksZWNobyAiJChrdikiID4+ICQoMSk7KSkKIGVuZGVmCiAKKyMgJCgxKTogbW9kdWxlcyBsaXN0CisjICQoMik6IG91dHB1dCBkaXIKKyMgJCgzKTogbW91bnQgcG9pbnQKKyMgJCg0KTogc3RhZ2luZyBkaXIKKyMgRGVwbW9kIHJlcXVpcmVzIGEgd2VsbC1mb3JtZWQga2VybmVsIHZlcnNpb24gc28gMC4wIGlzIHVzZWQgYXMgYSBwbGFjZWhvbGRlci4KK2RlZmluZSBidWlsZC1pbWFnZS1rZXJuZWwtbW9kdWxlcworICAgICQoaGlkZSkgcm0gLXJmICQoMikvbGliL21vZHVsZXMKKyAgICAkKGhpZGUpIG1rZGlyIC1wICQoMikvbGliL21vZHVsZXMKKyAgICAkKGhpZGUpIGNwICQoMSkgJCgyKS9saWIvbW9kdWxlcy8KKyAgICAkKGhpZGUpIHJtIC1yZiAkKDQpCisgICAgJChoaWRlKSBta2RpciAtcCAkKDQpL2xpYi9tb2R1bGVzLzAuMC8kKDMpbGliL21vZHVsZXMKKyAgICAkKGhpZGUpIGNwICQoMSkgJCg0KS9saWIvbW9kdWxlcy8wLjAvJCgzKWxpYi9tb2R1bGVzCisgICAgJChoaWRlKSAkKERFUE1PRCkgLWIgJCg0KSAwLjAKKyAgICAkKGhpZGUpIHNlZCAtZSAncy9cKC4qbW9kdWxlcy4qXCk6L1wvXDE6L2cnIC1lICdzLyBcKFteIF0qbW9kdWxlc1teIF0qXCkvIFwvXDEvZycgJCg0KS9saWIvbW9kdWxlcy8wLjAvbW9kdWxlcy5kZXAgPiAkKDIpL2xpYi9tb2R1bGVzL21vZHVsZXMuZGVwCisgICAgJChoaWRlKSBjcCAkKDQpL2xpYi9tb2R1bGVzLzAuMC9tb2R1bGVzLmFsaWFzICQoMikvbGliL21vZHVsZXMKK2VuZGVmCisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgUmVjb3ZlcnkgaW1hZ2UKIApAQCAtMTA2Miw5ICsxMTk5LDEwIEBACiByZWNvdmVyeV9zZXBvbGljeSA6PSBcCiAgICAgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL3NlcG9saWN5IFwKICAgICAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvcGxhdF9maWxlX2NvbnRleHRzIFwKLSAgICAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvbm9ucGxhdF9maWxlX2NvbnRleHRzIFwKKyAgICAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvdmVuZG9yX2ZpbGVfY29udGV4dHMgXAogICAgICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9wbGF0X3Byb3BlcnR5X2NvbnRleHRzIFwKLSAgICAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvbm9ucGxhdF9wcm9wZXJ0eV9jb250ZXh0cworICAgICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS92ZW5kb3JfcHJvcGVydHlfY29udGV4dHMKKwogIyBQYXNzZWQgaW50byByc3luYyBmcm9tIG5vbi1yZWNvdmVyeSByb290IHRvIHJlY292ZXJ5IHJvb3QsIHRvIGF2b2lkIG92ZXJ3cml0aW5nIHJlY292ZXJ5LXNwZWNpZmljCiAjIFNFTGludXggZmlsZXMKIElHTk9SRV9SRUNPVkVSWV9TRVBPTElDWSA6PSAkKHBhdHN1YnN0ICQoVEFSR0VUX1JFQ09WRVJZX09VVCkvJSwtLWV4Y2x1ZGU9LyUsJChyZWNvdmVyeV9zZXBvbGljeSkpCkBAIC0xMDc1LDYgKzEyMTMsOSBAQAogaWZkZWYgcHJvcGVydHlfb3ZlcnJpZGVzX3NwbGl0X2VuYWJsZWQKIHJlY292ZXJ5X2J1aWxkX3Byb3BzICs9ICQoSU5TVEFMTEVEX1ZFTkRPUl9CVUlMRF9QUk9QX1RBUkdFVCkKIGVuZGlmCitpZmRlZiBCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRQorcmVjb3ZlcnlfYnVpbGRfcHJvcHMgKz0gJChJTlNUQUxMRURfUFJPRFVDVF9CVUlMRF9QUk9QX1RBUkdFVCkKK2VuZGlmCiByZWNvdmVyeV9yZXNvdXJjZXNfY29tbW9uIDo9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCByZWNvdmVyeSkvcmVzCiAKICMgU2V0IHJlY292ZXJ5X2RlbnNpdHkgdG8gdGhlIGRlbnNpdHkgYnVja2V0IG9mIHRoZSBkZXZpY2UuCkBAIC0xMTM5LDE0ICsxMjgwLDYgQEAKIFJFQ09WRVJZX1JFU09VUkNFX1pJUCA6PQogZW5kaWYKIAotaWZlcSAoJChUQVJHRVRfUFJJVkFURV9SRVNfRElSUyksKQotICAkKGluZm8gTm8gcHJpdmF0ZSByZWNvdmVyeSByZXNvdXJjZXMgZm9yIFRBUkdFVF9ERVZJQ0UgJChUQVJHRVRfREVWSUNFKSkKLWVuZGlmCi0KLWlmZXEgKCQocmVjb3ZlcnlfZnN0YWIpLCkKLSAgJChpbmZvIE5vIHJlY292ZXJ5LmZzdGFiIGZvciBUQVJHRVRfREVWSUNFICQoVEFSR0VUX0RFVklDRSkpCi1lbmRpZgotCiBJTlRFUk5BTF9SRUNPVkVSWUlNQUdFX0FSR1MgOj0gXAogCSQoYWRkcHJlZml4IC0tc2Vjb25kICwkKElOU1RBTExFRF8yTkRCT09UTE9BREVSX1RBUkdFVCkpIFwKIAktLWtlcm5lbCAkKHJlY292ZXJ5X2tlcm5lbCkgXApAQCAtMTE4MywzNyArMTMxNiwyMSBAQAogCiBSRUNPVkVSWUlNQUdFX0lEX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvcmVjb3ZlcnkuaWQKIAotIyAkKDEpOiBtb2R1bGVzIGxpc3QKLSMgJCgyKTogb3V0cHV0IGRpcgotIyAkKDMpOiBtb3VudCBwb2ludAotIyAkKDQpOiBzdGFnaW5nIGRpcgotIyBEZXBtb2QgcmVxdWlyZXMgYSB3ZWxsLWZvcm1lZCBrZXJuZWwgdmVyc2lvbiBzbyAwLjAgaXMgdXNlZCBhcyBhIHBsYWNlaG9sZGVyLgotZGVmaW5lIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzCi0gICAgJChoaWRlKSBybSAtcmYgJCgyKS9saWIvbW9kdWxlcwotICAgICQoaGlkZSkgbWtkaXIgLXAgJCgyKS9saWIvbW9kdWxlcwotICAgICQoaGlkZSkgY3AgJCgxKSAkKDIpL2xpYi9tb2R1bGVzLwotICAgICQoaGlkZSkgcm0gLXJmICQoNCkKLSAgICAkKGhpZGUpIG1rZGlyIC1wICQoNCkvbGliL21vZHVsZXMvMC4wLyQoMylsaWIvbW9kdWxlcwotICAgICQoaGlkZSkgY3AgJCgxKSAkKDQpL2xpYi9tb2R1bGVzLzAuMC8kKDMpbGliL21vZHVsZXMKLSAgICAkKGhpZGUpICQoREVQTU9EKSAtYiAkKDQpIDAuMAotICAgICQoaGlkZSkgc2VkIC1lICdzL1woLiptb2R1bGVzLipcKTovXC9cMTovZycgLWUgJ3MvIFwoW14gXSptb2R1bGVzW14gXSpcKS8gXC9cMS9nJyAkKDQpL2xpYi9tb2R1bGVzLzAuMC9tb2R1bGVzLmRlcCA+ICQoMikvbGliL21vZHVsZXMvbW9kdWxlcy5kZXAKLSAgICAkKGhpZGUpIGNwICQoNCkvbGliL21vZHVsZXMvMC4wL21vZHVsZXMuYWxpYXMgJCgyKS9saWIvbW9kdWxlcwotZW5kZWYKLQogIyAkKDEpOiBvdXRwdXQgZmlsZQogZGVmaW5lIGJ1aWxkLXJlY292ZXJ5aW1hZ2UtdGFyZ2V0Ci0gIEBlY2hvIC0tLS0tIE1ha2luZyByZWNvdmVyeSBpbWFnZSAtLS0tLS0KKyAgIyBNYWtpbmcgcmVjb3ZlcnkgaW1hZ2UKICAgJChoaWRlKSBta2RpciAtcCAkKFRBUkdFVF9SRUNPVkVSWV9PVVQpCiAgICQoaGlkZSkgbWtkaXIgLXAgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL2V0YyAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvc2RjYXJkICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS90bXAKLSAgQGVjaG8gQ29weWluZyBiYXNlbGluZSByYW1kaXNrLi4uCisgICMgQ29weWluZyBiYXNlbGluZSByYW1kaXNrLi4uCiAgICMgVXNlIHJzeW5jIGJlY2F1c2UgImNwIC1SZiIgZmFpbHMgdG8gb3ZlcndyaXRlIGJyb2tlbiBzeW1saW5rcyBvbiBNYWMuCiAgICQoaGlkZSkgcnN5bmMgLWEgLS1leGNsdWRlPWV0YyAtLWV4Y2x1ZGU9c2RjYXJkICQoSUdOT1JFX1JFQ09WRVJZX1NFUE9MSUNZKSAkKElHTk9SRV9DQUNIRV9MSU5LKSAkKFRBUkdFVF9ST09UX09VVCkgJChUQVJHRVRfUkVDT1ZFUllfT1VUKQogICAjIENvcHkgYWRiZCBmcm9tIHN5c3RlbS9iaW4gdG8gcmVjb3Zlcnkvcm9vdC9zYmluCiAgICQoaGlkZSkgY3AgLWYgJChUQVJHRVRfT1VUX0VYRUNVVEFCTEVTKS9hZGJkICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9zYmluL2FkYmQKLSAgQGVjaG8gTW9kaWZ5aW5nIHJhbWRpc2sgY29udGVudHMuLi4KKyAgIyBNb2RpZnlpbmcgcmFtZGlzayBjb250ZW50cy4uLgogICAkKGlmICQoQk9BUkRfUkVDT1ZFUllfS0VSTkVMX01PRFVMRVMpLCBcCiAgICAgJChjYWxsIGJ1aWxkLWltYWdlLWtlcm5lbC1tb2R1bGVzLCQoQk9BUkRfUkVDT1ZFUllfS0VSTkVMX01PRFVMRVMpLCQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKSwsJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZGVwbW9kX3JlY292ZXJ5KSkpCi0gICQoaGlkZSkgcm0gLWYgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL2luaXQqLnJjCisgICMgUmVtb3ZlcyAkKFRBUkdFVF9SRUNPVkVSWV9ST09UX09VVCkvaW5pdCoucmMgRVhDRVBUIGluaXQucmVjb3ZlcnkqLnJjLgorICAkKGhpZGUpIGZpbmQgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpIC1tYXhkZXB0aCAxIC1uYW1lICdpbml0Ki5yYycgLXR5cGUgZiAtbm90IC1uYW1lICJpbml0LnJlY292ZXJ5LioucmMiIHwgeGFyZ3Mgcm0gLWYKICAgJChoaWRlKSBjcCAtZiAkKHJlY292ZXJ5X2luaXRyYykgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpLwogICAkKGhpZGUpIGNwICQoVEFSR0VUX1JPT1RfT1VUKS9pbml0LnJlY292ZXJ5LioucmMgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpLyB8fCB0cnVlICMgSWdub3JlIGVycm9yIHdoZW4gdGhlIHNyYyBmaWxlIGRvZXNuJ3QgZXhpc3QuCiAgICQoaGlkZSkgbWtkaXIgLXAgJChUQVJHRVRfUkVDT1ZFUllfUk9PVF9PVVQpL3JlcwpAQCAtMTI1MiwxNiArMTM2OSwxMyBAQAogICApCiAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TVVBQT1JUU19WQk9PVCkpLCBcCiAgICAgJChWQk9PVF9TSUdORVIpICQoRlVUSUxJVFkpICQoMSkudW5zaWduZWQgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfVkJPT1RfU0lHTklOR19LRVkpLnZicHViayAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSkudmJwcml2ayAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WQk9PVF9TSUdOSU5HX1NVQktFWSkudmJwcml2ayAkKDEpLmtleWJsb2NrICQoMSkpCi0gICQoaWYgJChhbmQgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpLCQoZmlsdGVyIHRydWUsJChCT0FSRF9BVkJfRU5BQkxFKSkpLCBcCi0gICAgICAkKGhpZGUpICQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKLSAgICAgICAgLS1pbWFnZSAkKDEpIFwKLSAgICAgICAgLS1wYXJ0aXRpb25fc2l6ZSAkKEJPQVJEX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkgXAotICAgICAgICAtLXBhcnRpdGlvbl9uYW1lIGJvb3QgJChJTlRFUk5BTF9BVkJfQk9PVF9TSUdOSU5HX0FSR1MpIFwKLSAgICAgICAgJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykpCiAgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpLCBcCi0gICAgJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoMSksJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKSwgXAotICAgICQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkKDEpLCQoQk9BUkRfUkVDT1ZFUllJTUFHRV9QQVJUSVRJT05fU0laRSkpKQotICBAZWNobyAtLS0tLSBNYWRlIHJlY292ZXJ5IGltYWdlOiAkKDEpIC0tLS0tLS0tCisgICAgJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoMSksJChjYWxsIGdldC1oYXNoLWltYWdlLW1heC1zaXplLCQoQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKSkpLCBcCisgICAgJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoMSksJChjYWxsIGdldC1oYXNoLWltYWdlLW1heC1zaXplLCQoQk9BUkRfUkVDT1ZFUllJTUFHRV9QQVJUSVRJT05fU0laRSkpKSkKKyAgJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfQVZCX0VOQUJMRSkpLCBcCisgICAgJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSksIFwKKyAgICAgICQoaGlkZSkgJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgLS1pbWFnZSAkKDEpIC0tcGFydGl0aW9uX3NpemUgJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpIC0tcGFydGl0aW9uX25hbWUgYm9vdCAkKElOVEVSTkFMX0FWQl9CT09UX1NJR05JTkdfQVJHUykgJChCT0FSRF9BVkJfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUyksXAorICAgICAgJChoaWRlKSAkKEFWQlRPT0wpIGFkZF9oYXNoX2Zvb3RlciAtLWltYWdlICQoMSkgLS1wYXJ0aXRpb25fc2l6ZSAkKEJPQVJEX1JFQ09WRVJZSU1BR0VfUEFSVElUSU9OX1NJWkUpIC0tcGFydGl0aW9uX25hbWUgcmVjb3ZlcnkgJChJTlRFUk5BTF9BVkJfUkVDT1ZFUllfU0lHTklOR19BUkdTKSAkKEJPQVJEX0FWQl9SRUNPVkVSWV9BRERfSEFTSF9GT09URVJfQVJHUykpKQogZW5kZWYKIAogQURCRCA6PSAkKFRBUkdFVF9PVVRfRVhFQ1VUQUJMRVMpL2FkYmQKQEAgLTEzMjQsMTIgKzE0MzgsMTIgQEAKIC5QSE9OWTogcmVjb3ZlcnlpbWFnZQogcmVjb3ZlcnlpbWFnZTogJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpICQoUkVDT1ZFUllfUkVTT1VSQ0VfWklQKQogCi1pZmVxICgkKEJPQVJEX05BTkRfUEFHRV9TSVpFKSwpCi1CT0FSRF9OQU5EX1BBR0VfU0laRSA6PSAyMDQ4CitpZm5lcSAoJChCT0FSRF9OQU5EX1BBR0VfU0laRSksKQorJChlcnJvciBNVEQgZGV2aWNlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYW5kIHRodXMgQk9BUkRfTkFORF9QQUdFX1NJWkUgaXMgZGVwcmVjYXRlZC4pCiBlbmRpZgogCi1pZmVxICgkKEJPQVJEX05BTkRfU1BBUkVfU0laRSksKQotQk9BUkRfTkFORF9TUEFSRV9TSVpFIDo9IDY0CitpZm5lcSAoJChCT0FSRF9OQU5EX1NQQVJFX1NJWkUpLCkKKyQoZXJyb3IgTVREIGRldmljZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGFuZCB0aHVzIEJPQVJEX05BTkRfU1BBUkVfU0laRSBpcyBkZXByZWNhdGVkLikKIGVuZGlmCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEzNDQsNyArMTQ1OCw4IEBACiAgICAgJChBTExfR0VORVJBVEVEX1NPVVJDRVMpIFwKICAgICAkKEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTKSBcCiAgICAgJChQREtfRlVTSU9OX1NZU0lNR19GSUxFUykgXAotICAgICQoUkVDT1ZFUllfUkVTT1VSQ0VfWklQKSkKKyAgICAkKFJFQ09WRVJZX1JFU09VUkNFX1pJUCkpIFwKKyAgICAkKFBES19GVVNJT05fU1lNTElOS19TVEFNUCkKIAogRlVMTF9TWVNURU1JTUFHRV9ERVBTIDo9ICQoSU5URVJOQUxfU1lTVEVNSU1BR0VfRklMRVMpICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQogCkBAIC0xMzY4LDcgKzE0ODMsNyBAQAogCUBta2RpciAtcCAkKGRpciAkQCkKIAlAcm0gLWYgJEAKIAkkKGhpZGUpICQoRklMRVNMSVNUKSAkKFRBUkdFVF9PVVQpID4gJChAOi50eHQ9Lmpzb24pCi0JJChoaWRlKSBidWlsZC90b29scy9maWxlc2xpc3RfdXRpbC5weSAtYyAkKEA6LnR4dD0uanNvbikgPiAkQAorCSQoaGlkZSkgYnVpbGQvbWFrZS90b29scy9maWxlc2xpc3RfdXRpbC5weSAtYyAkKEA6LnR4dD0uanNvbikgPiAkQAogCiAuUEhPTlk6IGluc3RhbGxlZC1maWxlLWxpc3QKIGluc3RhbGxlZC1maWxlLWxpc3Q6ICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpCkBAIC0xMzk0LDIzICsxNTA5LDM2IEBACiBlbmRlZgogZW5kaWYKIAorIyBDcmVhdGUgc3ltbGluayAvc3lzdGVtL3Byb2R1Y3QgdG8gL3Byb2R1Y3QgaWYgbmVjZXNzYXJ5LgoraWZkZWYgQk9BUkRfVVNFU19QUk9EVUNUSU1BR0UKK2RlZmluZSBjcmVhdGUtc3lzdGVtLXByb2R1Y3Qtc3ltbGluaworJChoaWRlKSBpZiBbIC1kICQoVEFSR0VUX09VVCkvcHJvZHVjdCBdICYmIFsgISAtaCAkKFRBUkdFVF9PVVQpL3Byb2R1Y3QgXTsgdGhlbiBcCisgIGVjaG8gJ05vbi1zeW1saW5rICQoVEFSR0VUX09VVCkvcHJvZHVjdCBkZXRlY3RlZCEnIDE+JjI7IFwKKyAgZWNobyAnWW91IGNhbm5vdCBpbnN0YWxsIGZpbGVzIHRvICQoVEFSR0VUX09VVCkvcHJvZHVjdCB3aGlsZSBidWlsZGluZyBhIHNlcGFyYXRlIHByb2R1Y3QuaW1nIScgMT4mMjsgXAorICBleGl0IDE7IFwKK2ZpCiskKGhpZGUpIGxuIC1zZiAvcHJvZHVjdCAkKFRBUkdFVF9PVVQpL3Byb2R1Y3QKK2VuZGVmCitlbHNlCitkZWZpbmUgY3JlYXRlLXN5c3RlbS1wcm9kdWN0LXN5bWxpbmsKK2VuZGVmCitlbmRpZgorCiAjICQoMSk6IG91dHB1dCBmaWxlCiBkZWZpbmUgYnVpbGQtc3lzdGVtaW1hZ2UtdGFyZ2V0CiAgIEBlY2hvICJUYXJnZXQgc3lzdGVtIGZzIGltYWdlOiAkKDEpIgogICAkKGNhbGwgY3JlYXRlLXN5c3RlbS12ZW5kb3Itc3ltbGluaykKKyAgJChjYWxsIGNyZWF0ZS1zeXN0ZW0tcHJvZHVjdC1zeW1saW5rKQogICBAbWtkaXIgLXAgJChkaXIgJCgxKSkgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKSAmJiBybSAtcmYgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW1faW1hZ2VfaW5mby50eHQKICAgJChjYWxsIGdlbmVyYXRlLXVzZXJpbWFnZS1wcm9wLWRpY3Rpb25hcnksICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2ltYWdlX2luZm8udHh0LCBcCiAgICAgICBza2lwX2ZzY2s9dHJ1ZSkKICAgJChoaWRlKSBQQVRIPSQoZm9yZWFjaCBwLCQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpLCQocCk6KSQkUEFUSCBcCi0gICAgICAuL2J1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCisgICAgICBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCiAgICAgICAkKFRBUkdFVF9PVVQpICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvc3lzdGVtX2ltYWdlX2luZm8udHh0ICQoMSkgJChUQVJHRVRfT1VUKSBcCiAgICAgICB8fCAoIGVjaG8gIk91dCBvZiBzcGFjZT8gdGhlIHRyZWUgc2l6ZSBvZiAkKFRBUkdFVF9PVVQpIGlzIChNQik6ICIgMT4mMiA7XAogICAgICAgICAgICBkdSAtc20gJChUQVJHRVRfT1VUKSAxPiYyO1wKICAgICAgICAgICAgaWYgWyAiJChJTlRFUk5BTF9VU0VSSU1BR0VTX0VYVF9WQVJJQU5UKSIgPT0gImV4dDQiIF07IHRoZW4gXAogICAgICAgICAgICAgICAgbWF4c2l6ZT0kKEJPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFKTsgXAotICAgICAgICAgICAgICAgaWYgWyAiJChCT0FSRF9IQVNfRVhUNF9SRVNFUlZFRF9CTE9DS1MpIiA9PSAidHJ1ZSIgXTsgdGhlbiBcCi0gICAgICAgICAgICAgICAgICAgbWF4c2l6ZT0kJCgobWF4c2l6ZSAtIDQwOTYgKiA0MDk2KSk7IFwKLSAgICAgICAgICAgICAgIGZpOyBcCiAgICAgICAgICAgICAgICBlY2hvICJUaGUgbWF4IGlzICQkKCggbWF4c2l6ZSAvIDEwNDg1NzYgKSkgTUIuIiAxPiYyIDtcCiAgICAgICAgICAgIGVsc2UgXAogICAgICAgICAgICAgICAgZWNobyAiVGhlIG1heCBpcyAkJCgoICQoQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUpIC8gMTA0ODU3NiApKSBNQi4iIDE+JjIgO1wKQEAgLTE0NzUsNiArMTYwMyw3IEBACiBkZWZpbmUgYnVpbGQtc3lzdGVtdGFyYmFsbC10YXJnZXQKICAgJChjYWxsIHByZXR0eSwiVGFyZ2V0IHN5c3RlbSBmcyB0YXJiYWxsOiAkKElOU1RBTExFRF9TWVNURU1UQVJCQUxMX1RBUkdFVCkiKQogICAkKGNhbGwgY3JlYXRlLXN5c3RlbS12ZW5kb3Itc3ltbGluaykKKyAgJChjYWxsIGNyZWF0ZS1zeXN0ZW0tcHJvZHVjdC1zeW1saW5rKQogICAkKE1LVEFSQkFMTCkgJChGU19HRVRfU1RBVFMpIFwKICAgICAkKFBST0RVQ1RfT1VUKSBzeXN0ZW0gJChQUklWQVRFX1NZU1RFTV9UQVIpIFwKICAgICAkKElOU1RBTExFRF9TWVNURU1UQVJCQUxMX1RBUkdFVCkgJChUQVJHRVRfT1VUKQpAQCAtMTU1NSw2ICsxNjg0LDEwIEBACiAJJChoaWRlKSBjZCAkKGRpciAkQCkgJiYgemlwIC1xcnlYICQobm90ZGlyICRAKSBcCiAJCSQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikKIGVuZGlmCitpZmRlZiBCT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRQorCSQoaGlkZSkgY2QgJChkaXIgJEApICYmIHppcCAtcXJ5WCAkKG5vdGRpciAkQCkgXAorCQkkKFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUKQorZW5kaWYKIGlmbmVxICgkKFBES19QTEFURk9STV9KQVZBX1pJUF9DT05URU5UUyksKQogCSQoaGlkZSkgY2QgJChPVVRfRElSKSAmJiB6aXAgLXFyeVggJChwYXRzdWJzdCAkKE9VVF9ESVIpLyUsJSwkQCkgJChQREtfUExBVEZPUk1fSkFWQV9aSVBfQ09OVEVOVFMpCiBlbmRpZgpAQCAtMTU2Myw3ICsxNjk2LDggQEAKIGVuZGlmCiAJQCMgQWRkIGRleC1wcmVvcHQgZmlsZXMgYW5kIGNvbmZpZy4KIAkkKGlmICQoUFJJVkFURV9ERVhfRklMRVMpLCQoaGlkZSkgY2QgJChPVVRfRElSKSAmJiB6aXAgLXFyeVggJChwYXRzdWJzdCAkKE9VVF9ESVIpLyUsJSwkQCAkKFBSSVZBVEVfREVYX0ZJTEVTKSkpCi0JJChoaWRlKSB6aXAgLXFyeVhqICRAICQoUFJJVkFURV9PREVYX0NPTkZJRykKKwkkKGhpZGUpIHRvdWNoICQoUFJPRFVDVF9PVVQpL3Bkay5taworCSQoaGlkZSkgemlwIC1xcnlYaiAkQCAkKFBSSVZBVEVfT0RFWF9DT05GSUcpICQoUFJPRFVDVF9PVVQpL3Bkay5tawogCiAuUEhPTlk6IHBsYXRmb3JtCiBwbGF0Zm9ybTogJChJTlNUQUxMRURfUExBVEZPUk1fWklQKQpAQCAtMTYyOCw3ICsxNzYyLDcgQEAKICAgQG1rZGlyIC1wICQodXNlcmRhdGFpbWFnZV9pbnRlcm1lZGlhdGVzKSAmJiBybSAtcmYgJCh1c2VyZGF0YWltYWdlX2ludGVybWVkaWF0ZXMpL3VzZXJkYXRhX2ltYWdlX2luZm8udHh0CiAgICQoY2FsbCBnZW5lcmF0ZS11c2VyaW1hZ2UtcHJvcC1kaWN0aW9uYXJ5LCAkKHVzZXJkYXRhaW1hZ2VfaW50ZXJtZWRpYXRlcykvdXNlcmRhdGFfaW1hZ2VfaW5mby50eHQsIHNraXBfZnNjaz10cnVlKQogICAkKGhpZGUpIFBBVEg9JChmb3JlYWNoIHAsJChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyksJChwKTopJCRQQVRIIFwKLSAgICAgIC4vYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKKyAgICAgIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKICAgICAgICQoVEFSR0VUX09VVF9EQVRBKSAkKHVzZXJkYXRhaW1hZ2VfaW50ZXJtZWRpYXRlcykvdXNlcmRhdGFfaW1hZ2VfaW5mby50eHQgJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1VTRVJEQVRBSU1BR0VfUEFSVElUSU9OX1NJWkUpKQogZW5kZWYKQEAgLTE3MzUsNyArMTg2OSw3IEBACiAgIEBta2RpciAtcCAkKGNhY2hlaW1hZ2VfaW50ZXJtZWRpYXRlcykgJiYgcm0gLXJmICQoY2FjaGVpbWFnZV9pbnRlcm1lZGlhdGVzKS9jYWNoZV9pbWFnZV9pbmZvLnR4dAogICAkKGNhbGwgZ2VuZXJhdGUtdXNlcmltYWdlLXByb3AtZGljdGlvbmFyeSwgJChjYWNoZWltYWdlX2ludGVybWVkaWF0ZXMpL2NhY2hlX2ltYWdlX2luZm8udHh0LCBza2lwX2ZzY2s9dHJ1ZSkKICAgJChoaWRlKSBQQVRIPSQoZm9yZWFjaCBwLCQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpLCQocCk6KSQkUEFUSCBcCi0gICAgICAuL2J1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCisgICAgICBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCiAgICAgICAkKFRBUkdFVF9PVVRfQ0FDSEUpICQoY2FjaGVpbWFnZV9pbnRlcm1lZGlhdGVzKS9jYWNoZV9pbWFnZV9pbmZvLnR4dCAkKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGhpZGUpICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfQ0FDSEVJTUFHRV9UQVJHRVQpLCQoQk9BUkRfQ0FDSEVJTUFHRV9QQVJUSVRJT05fU0laRSkpCiBlbmRlZgpAQCAtMTc3MCw3ICsxOTA0LDggQEAKIElOVEVSTkFMX1NZU1RFTU9USEVSSU1BR0VfRklMRVMgOj0gXAogICAgICQoZmlsdGVyICQoVEFSR0VUX09VVF9TWVNURU1fT1RIRVIpLyUsXAogICAgICAgJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUylcCi0gICAgICAkKEFMTF9QREtfRlVTSU9OX0ZJTEVTKSkKKyAgICAgICQoQUxMX1BES19GVVNJT05fRklMRVMpKSBcCisgICAgJChQREtfRlVTSU9OX1NZTUxJTktfU1RBTVApCiAKIElOU1RBTExFRF9GSUxFU19GSUxFX1NZU1RFTU9USEVSIDo9ICQoUFJPRFVDVF9PVVQpL2luc3RhbGxlZC1maWxlcy1zeXN0ZW0tb3RoZXIudHh0CiAkKElOU1RBTExFRF9GSUxFU19GSUxFX1NZU1RFTU9USEVSKSA6ICQoSU5URVJOQUxfU1lTVEVNT1RIRVJJTUFHRV9GSUxFUykgJChGSUxFU0xJU1QpCkBAIC0xNzc4LDcgKzE5MTMsNyBAQAogCUBta2RpciAtcCAkKGRpciAkQCkKIAlAcm0gLWYgJEAKIAkkKGhpZGUpICQoRklMRVNMSVNUKSAkKFRBUkdFVF9PVVRfU1lTVEVNX09USEVSKSA+ICQoQDoudHh0PS5qc29uKQotCSQoaGlkZSkgYnVpbGQvdG9vbHMvZmlsZXNsaXN0X3V0aWwucHkgLWMgJChAOi50eHQ9Lmpzb24pID4gJEAKKwkkKGhpZGUpIGJ1aWxkL21ha2UvdG9vbHMvZmlsZXNsaXN0X3V0aWwucHkgLWMgJChAOi50eHQ9Lmpzb24pID4gJEAKIAogc3lzdGVtb3RoZXJpbWFnZV9pbnRlcm1lZGlhdGVzIDo9IFwKICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxzeXN0ZW1fb3RoZXIpCkBAIC0xNzkxLDE1ICsxOTI2LDE4IEBACiAgIEBta2RpciAtcCAkKHN5c3RlbW90aGVyaW1hZ2VfaW50ZXJtZWRpYXRlcykgJiYgcm0gLXJmICQoc3lzdGVtb3RoZXJpbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW1fb3RoZXJfaW1hZ2VfaW5mby50eHQKICAgJChjYWxsIGdlbmVyYXRlLXVzZXJpbWFnZS1wcm9wLWRpY3Rpb25hcnksICQoc3lzdGVtb3RoZXJpbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW1fb3RoZXJfaW1hZ2VfaW5mby50eHQsIHNraXBfZnNjaz10cnVlKQogICAkKGhpZGUpIFBBVEg9JChmb3JlYWNoIHAsJChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyksJChwKTopJCRQQVRIIFwKLSAgICAgIC4vYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKKyAgICAgIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKICAgICAgICQoVEFSR0VUX09VVF9TWVNURU1fT1RIRVIpICQoc3lzdGVtb3RoZXJpbWFnZV9pbnRlcm1lZGlhdGVzKS9zeXN0ZW1fb3RoZXJfaW1hZ2VfaW5mby50eHQgJChJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQpICQoVEFSR0VUX09VVCkKICAgJChoaWRlKSAkKGNhbGwgYXNzZXJ0LW1heC1pbWFnZS1zaXplLCQoSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCiAKICMgV2UganVzdCBidWlsZCB0aGlzIGRpcmVjdGx5IHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uLgogSU5TVEFMTEVEX1NZU1RFTU9USEVSSU1BR0VfVEFSR0VUIDo9ICQoQlVJTFRfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQpCitpZm5lcSAodHJ1ZSwkKFNBTklUSVpFX0xJVEUpKQorIyBPbmx5IGNyZWF0ZSBzeXN0ZW1fb3RoZXIgd2hlbiBub3QgYnVpbGRpbmcgdGhlIHNlY29uZCBzdGFnZSBvZiBhIFNBTklUSVpFX0xJVEUgYnVpbGQuCiAkKElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCk6ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKSAkKElOVEVSTkFMX1NZU1RFTU9USEVSSU1BR0VfRklMRVMpICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfU1lTVEVNT1RIRVIpCiAJJChidWlsZC1zeXN0ZW1vdGhlcmltYWdlLXRhcmdldCkKK2VuZGlmCiAKIC5QSE9OWTogc3lzdGVtb3RoZXJpbWFnZS1ub2RlcHMKIHN5c3RlbW90aGVyaW1hZ2Utbm9kZXBzOiB8ICQoSU5URVJOQUxfVVNFUklNQUdFU19ERVBTKQpAQCAtMTgxNCw3ICsxOTUyLDggQEAKIElOVEVSTkFMX1ZFTkRPUklNQUdFX0ZJTEVTIDo9IFwKICAgICAkKGZpbHRlciAkKFRBUkdFVF9PVVRfVkVORE9SKS8lLFwKICAgICAgICQoQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMpXAotICAgICAgJChBTExfUERLX0ZVU0lPTl9GSUxFUykpCisgICAgICAkKEFMTF9QREtfRlVTSU9OX0ZJTEVTKSkgXAorICAgICQoUERLX0ZVU0lPTl9TWU1MSU5LX1NUQU1QKQogCiAjIHBsYXRmb3JtLnppcCBkZXBlbmRzIG9uICQoSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMpLgogJChJTlNUQUxMRURfUExBVEZPUk1fWklQKSA6ICQoSU5URVJOQUxfVkVORE9SSU1BR0VfRklMRVMpCkBAIC0xODI1LDcgKzE5NjQsNyBAQAogCUBta2RpciAtcCAkKGRpciAkQCkKIAlAcm0gLWYgJEAKIAkkKGhpZGUpICQoRklMRVNMSVNUKSAkKFRBUkdFVF9PVVRfVkVORE9SKSA+ICQoQDoudHh0PS5qc29uKQotCSQoaGlkZSkgYnVpbGQvdG9vbHMvZmlsZXNsaXN0X3V0aWwucHkgLWMgJChAOi50eHQ9Lmpzb24pID4gJEAKKwkkKGhpZGUpIGJ1aWxkL21ha2UvdG9vbHMvZmlsZXNsaXN0X3V0aWwucHkgLWMgJChAOi50eHQ9Lmpzb24pID4gJEAKIAogdmVuZG9yaW1hZ2VfaW50ZXJtZWRpYXRlcyA6PSBcCiAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsdmVuZG9yKQpAQCAtMTgzOCw3ICsxOTc3LDcgQEAKICAgJChpZiAkKEJPQVJEX1ZFTkRPUl9LRVJORUxfTU9EVUxFUyksIFwKICAgICAkKGNhbGwgYnVpbGQtaW1hZ2Uta2VybmVsLW1vZHVsZXMsJChCT0FSRF9WRU5ET1JfS0VSTkVMX01PRFVMRVMpLCQoVEFSR0VUX09VVF9WRU5ET1IpLHZlbmRvci8sJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZGVwbW9kX3ZlbmRvcikpKQogICAkKGhpZGUpIFBBVEg9JChmb3JlYWNoIHAsJChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyksJChwKTopJCRQQVRIIFwKLSAgICAgIC4vYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKKyAgICAgIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5IFwKICAgICAgICQoVEFSR0VUX09VVF9WRU5ET1IpICQodmVuZG9yaW1hZ2VfaW50ZXJtZWRpYXRlcykvdmVuZG9yX2ltYWdlX2luZm8udHh0ICQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQogICAkKGhpZGUpICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSwkKEJPQVJEX1ZFTkRPUklNQUdFX1BBUlRJVElPTl9TSVpFKSkKIGVuZGVmCkBAIC0xODYwLDYgKzE5OTksNTYgQEAKIGVuZGlmCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcHJvZHVjdCBwYXJ0aXRpb24gaW1hZ2UKK2lmZGVmIEJPQVJEX1BST0RVQ1RJTUFHRV9GSUxFX1NZU1RFTV9UWVBFCitJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMgOj0gXAorICAgICQoZmlsdGVyICQoVEFSR0VUX09VVF9QUk9EVUNUKS8lLFwKKyAgICAgICQoQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMpXAorICAgICAgJChBTExfUERLX0ZVU0lPTl9GSUxFUykpIFwKKyAgICAkKFBES19GVVNJT05fU1lNTElOS19TVEFNUCkKKworIyBwbGF0Zm9ybS56aXAgZGVwZW5kcyBvbiAkKElOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUykuCiskKElOU1RBTExFRF9QTEFURk9STV9aSVApIDogJChJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMpCisKK0lOU1RBTExFRF9GSUxFU19GSUxFX1BST0RVQ1QgOj0gJChQUk9EVUNUX09VVCkvaW5zdGFsbGVkLWZpbGVzLXByb2R1Y3QudHh0CiskKElOU1RBTExFRF9GSUxFU19GSUxFX1BST0RVQ1QpIDogJChJTlRFUk5BTF9QUk9EVUNUSU1BR0VfRklMRVMpICQoRklMRVNMSVNUKQorCUBlY2hvIEluc3RhbGxlZCBmaWxlIGxpc3Q6ICRACisJQG1rZGlyIC1wICQoZGlyICRAKQorCUBybSAtZiAkQAorCSQoaGlkZSkgJChGSUxFU0xJU1QpICQoVEFSR0VUX09VVF9QUk9EVUNUKSA+ICQoQDoudHh0PS5qc29uKQorCSQoaGlkZSkgYnVpbGQvdG9vbHMvZmlsZXNsaXN0X3V0aWwucHkgLWMgJChAOi50eHQ9Lmpzb24pID4gJEAKKworcHJvZHVjdGltYWdlX2ludGVybWVkaWF0ZXMgOj0gXAorICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHByb2R1Y3QpCitCVUlMVF9QUk9EVUNUSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3Byb2R1Y3QuaW1nCitkZWZpbmUgYnVpbGQtcHJvZHVjdGltYWdlLXRhcmdldAorICAkKGNhbGwgcHJldHR5LCJUYXJnZXQgcHJvZHVjdCBmcyBpbWFnZTogJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkiKQorICBAbWtkaXIgLXAgJChUQVJHRVRfT1VUX1BST0RVQ1QpCisgIEBta2RpciAtcCAkKHByb2R1Y3RpbWFnZV9pbnRlcm1lZGlhdGVzKSAmJiBybSAtcmYgJChwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcykvcHJvZHVjdF9pbWFnZV9pbmZvLnR4dAorICAkKGNhbGwgZ2VuZXJhdGUtdXNlcmltYWdlLXByb3AtZGljdGlvbmFyeSwgJChwcm9kdWN0aW1hZ2VfaW50ZXJtZWRpYXRlcykvcHJvZHVjdF9pbWFnZV9pbmZvLnR4dCwgc2tpcF9mc2NrPXRydWUpCisgICQoaGlkZSkgUEFUSD0kKGZvcmVhY2ggcCwkKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKSwkKHApOikkJFBBVEggXAorICAgICAgLi9idWlsZC90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgXAorICAgICAgJChUQVJHRVRfT1VUX1BST0RVQ1QpICQocHJvZHVjdGltYWdlX2ludGVybWVkaWF0ZXMpL3Byb2R1Y3RfaW1hZ2VfaW5mby50eHQgJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkgJChUQVJHRVRfT1VUKQorICAkKGhpZGUpICQoY2FsbCBhc3NlcnQtbWF4LWltYWdlLXNpemUsJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCksJChCT0FSRF9QUk9EVUNUSU1BR0VfUEFSVElUSU9OX1NJWkUpKQorZW5kZWYKKworIyBXZSBqdXN0IGJ1aWxkIHRoaXMgZGlyZWN0bHkgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24uCitJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCA6PSAkKEJVSUxUX1BST0RVQ1RJTUFHRV9UQVJHRVQpCiskKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKTogJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX1BST0RVQ1QpICQoQlVJTERfSU1BR0VfU1JDUykKKwkkKGJ1aWxkLXByb2R1Y3RpbWFnZS10YXJnZXQpCisKKy5QSE9OWTogcHJvZHVjdGltYWdlLW5vZGVwcyBwbm9kCitwcm9kdWN0aW1hZ2Utbm9kZXBzIHBub2Q6IHwgJChJTlRFUk5BTF9VU0VSSU1BR0VTX0RFUFMpCisJJChidWlsZC1wcm9kdWN0aW1hZ2UtdGFyZ2V0KQorCitzeW5jOiAkKElOVEVSTkFMX1BST0RVQ1RJTUFHRV9GSUxFUykKKworZWxzZSBpZmRlZiBCT0FSRF9QUkVCVUlMVF9QUk9EVUNUSU1BR0UKK0lOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL3Byb2R1Y3QuaW1nCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCT0FSRF9QUkVCVUlMVF9QUk9EVUNUSU1BR0UpLCQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpKSkKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgZHRibyBpbWFnZQogaWZkZWYgQk9BUkRfUFJFQlVJTFRfRFRCT0lNQUdFCiBJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9kdGJvLmltZwpAQCAtMTg3OSwxNyArMjA2OCw2IEBACiAKIGVuZGlmCiAKLSMgQ29udmVydCB0byBsb3dlciBjYXNlIHdpdGhvdXQgcmVxdWlyaW5nIGEgc2hlbGwsIHdoaWNoIGlzbid0IGNhY2hlYWJsZS4KLXRvLWxvd2VyID0gJChzdWJzdCBBLGEsJChzdWJzdCBCLGIsJChzdWJzdCBDLGMsJChzdWJzdCBELGQsJChzdWJzdCBFLGUsJChzdWJzdCBGLGYsJChzdWJzdCBHLGcsXAotJChzdWJzdCBILGgsJChzdWJzdCBJLGksJChzdWJzdCBKLGosJChzdWJzdCBLLGssJChzdWJzdCBMLGwsJChzdWJzdCBNLG0sJChzdWJzdCBOLG4sJChzdWJzdCBPLG8sXAotJChzdWJzdCBQLHAsJChzdWJzdCBRLHEsJChzdWJzdCBSLHIsJChzdWJzdCBTLHMsJChzdWJzdCBULHQsJChzdWJzdCBVLHUsJChzdWJzdCBWLHYsJChzdWJzdCBXLHcsXAotJChzdWJzdCBYLHgsJChzdWJzdCBZLHksJChzdWJzdCBaLHosJDEpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKQotIyBDb252ZXJ0IHRvIHVwcGVyIGNhc2Ugd2l0aG91dCByZXF1aXJpbmcgYSBzaGVsbCwgd2hpY2ggaXNuJ3QgY2FjaGVhYmxlLgotdG8tdXBwZXI9JChzdWJzdCBhLEEsJChzdWJzdCBiLEIsJChzdWJzdCBjLEMsJChzdWJzdCBkLEQsJChzdWJzdCBlLEUsJChzdWJzdCBmLEYsJChzdWJzdCBnLEcsXAotJChzdWJzdCBoLEgsJChzdWJzdCBpLEksJChzdWJzdCBqLEosJChzdWJzdCBrLEssJChzdWJzdCBsLEwsJChzdWJzdCBtLE0sJChzdWJzdCBuLE4sJChzdWJzdCBvLE8sXAotJChzdWJzdCBwLFAsJChzdWJzdCBxLFEsJChzdWJzdCByLFIsJChzdWJzdCBzLFMsJChzdWJzdCB0LFQsJChzdWJzdCB1LFUsJChzdWJzdCB2LFYsJChzdWJzdCB3LFcsXAotJChzdWJzdCB4LFgsJChzdWJzdCB5LFksJChzdWJzdCB6LFosJDEpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKQotCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHZibWV0YSBpbWFnZQogaWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQpAQCAtMTkxMiw2ICsyMDkwLDggQEAKIERUQk9fRk9PVEVSX0FSR1MgOj0gQk9BUkRfQVZCX0RUQk9fQUREX0hBU0hfRk9PVEVSX0FSR1MKIFNZU1RFTV9GT09URVJfQVJHUyA6PSBCT0FSRF9BVkJfU1lTVEVNX0FERF9IQVNIVFJFRV9GT09URVJfQVJHUwogVkVORE9SX0ZPT1RFUl9BUkdTIDo9IEJPQVJEX0FWQl9WRU5ET1JfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTCitSRUNPVkVSWV9GT09URVJfQVJHUyA6PSBCT0FSRF9BVkJfUkVDT1ZFUllfQUREX0hBU0hfRk9PVEVSX0FSR1MKK1BST0RVQ1RfRk9PVEVSX0FSR1MgOj0gQk9BUkRfQVZCX1BST0RVQ1RfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTCiAKICMgQ2hlY2sgYW5kIHNldCByZXF1aXJlZCBidWlsZCB2YXJpYWJsZXMgZm9yIGEgY2hhaW4gcGFydGl0aW9uLgogIyAkKDEpOiB0aGUgcGFydGl0aW9uIHRvIGVuYWJsZSBBVkIgY2hhaW4sIGUuZy4sIEJPT1Qgb3IgU1lTVEVNLgpAQCAtMTk2NCw2ICsyMTQ0LDE1IEBACiBlbmRpZgogZW5kaWYKIAoraWZkZWYgSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQKK2lmZGVmIEJPQVJEX0FWQl9QUk9EVUNUX0tFWV9QQVRICiskKGV2YWwgJChjYWxsIGNoZWNrLWFuZC1zZXQtYXZiLWNoYWluLWFyZ3MsUFJPRFVDVCkpCitlbHNlCitJTlRFUk5BTF9BVkJfTUFLRV9WQk1FVEFfSU1BR0VfQVJHUyArPSBcCisgICAgLS1pbmNsdWRlX2Rlc2NyaXB0b3JzX2Zyb21faW1hZ2UgJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkKK2VuZGlmCitlbmRpZgorCiBpZmRlZiBJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVAogaWZkZWYgQk9BUkRfQVZCX0RUQk9fS0VZX1BBVEgKICQoZXZhbCAkKGNhbGwgY2hlY2stYW5kLXNldC1hdmItY2hhaW4tYXJncyxEVEJPKSkKQEAgLTE5NzMsNiArMjE2MiwxNSBAQAogZW5kaWYKIGVuZGlmCiAKK2lmZGVmIElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVAoraWZkZWYgQk9BUkRfQVZCX1JFQ09WRVJZX0tFWV9QQVRICiskKGV2YWwgJChjYWxsIGNoZWNrLWFuZC1zZXQtYXZiLWNoYWluLWFyZ3MsUkVDT1ZFUlkpKQorZWxzZQorSU5URVJOQUxfQVZCX01BS0VfVkJNRVRBX0lNQUdFX0FSR1MgKz0gXAorICAgIC0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlICQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKQorZW5kaWYKK2VuZGlmCisKIEJPQVJEX0FWQl9NQUtFX1ZCTUVUQV9JTUFHRV9BUkdTICs9IC0tcGFkZGluZ19zaXplIDQwOTYKIAogIyBBZGQga2VybmVsIGNtZGxpbmUgZGVzY3JpcHRvciBmb3Iga2VybmVsIHRvIG1vdW50IHN5c3RlbS5pbWcgYXMgcm9vdCB3aXRoCkBAIC0yMDA4LDkgKzIyMDYsMTUgQEAKICAgJChpZiAkKEJPQVJEX0FWQl9WRU5ET1JfS0VZX1BBVEgpLFwKICAgICAkKGhpZGUpICQoQVZCVE9PTCkgZXh0cmFjdF9wdWJsaWNfa2V5IC0ta2V5ICQoQk9BUkRfQVZCX1ZFTkRPUl9LRVlfUEFUSCkgXAogICAgICAgLS1vdXRwdXQgJCgxKS92ZW5kb3IuYXZicHVia2V5KQorICAkKGlmICQoQk9BUkRfQVZCX1BST0RVQ1RfS0VZX1BBVEgpLFwKKyAgICAkKGhpZGUpICQoQVZCVE9PTCkgZXh0cmFjdF9wdWJsaWNfa2V5IC0ta2V5ICQoQk9BUkRfQVZCX1BST0RVQ1RfS0VZX1BBVEgpIFwKKyAgICAgIC0tb3V0cHV0ICQoMSkvcHJvZHVjdC5hdmJwdWJrZXkpCiAgICQoaWYgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCksXAogICAgICQoaGlkZSkgJChBVkJUT09MKSBleHRyYWN0X3B1YmxpY19rZXkgLS1rZXkgJChCT0FSRF9BVkJfRFRCT19LRVlfUEFUSCkgXAogICAgICAgLS1vdXRwdXQgJCgxKS9kdGJvLmF2YnB1YmtleSkKKyAgJChpZiAkKEJPQVJEX0FWQl9SRUNPVkVSWV9LRVlfUEFUSCksXAorICAgICQoaGlkZSkgJChBVkJUT09MKSBleHRyYWN0X3B1YmxpY19rZXkgLS1rZXkgJChCT0FSRF9BVkJfUkVDT1ZFUllfS0VZX1BBVEgpIFwKKyAgICAgIC0tb3V0cHV0ICQoMSkvcmVjb3ZlcnkuYXZicHVia2V5KQogZW5kZWYKIAogZGVmaW5lIGJ1aWxkLXZibWV0YWltYWdlLXRhcmdldApAQCAtMjAyNiw3ICsyMjMwLDE1IEBACiBlbmRlZgogCiBJTlNUQUxMRURfVkJNRVRBSU1BR0VfVEFSR0VUIDo9ICQoQlVJTFRfVkJNRVRBSU1BR0VfVEFSR0VUKQotJChJTlNUQUxMRURfVkJNRVRBSU1BR0VfVEFSR0VUKTogJChBVkJUT09MKSAkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSAkKElOU1RBTExFRF9TWVNURU1JTUFHRSkgJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSAkKEJPQVJEX0FWQl9LRVlfUEFUSCkKKyQoSU5TVEFMTEVEX1ZCTUVUQUlNQUdFX1RBUkdFVCk6IFwKKwkJJChBVkJUT09MKSBcCisJCSQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpIFwKKwkJJChJTlNUQUxMRURfU1lTVEVNSU1BR0UpIFwKKwkJJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSBcCisJCSQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpIFwKKwkJJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkgXAorCQkkKElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVCkgXAorCQkkKEJPQVJEX0FWQl9LRVlfUEFUSCkKIAkkKGJ1aWxkLXZibWV0YWltYWdlLXRhcmdldCkKIAogLlBIT05ZOiB2Ym1ldGFpbWFnZS1ub2RlcHMKQEAgLTIwODEsNiArMjI5Myw3IEBACiBpZmVxICgkKGJ1aWxkX290YV9wYWNrYWdlKSx0cnVlKQogT1RBVE9PTFMgOj0gICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21pbmlnemlwIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYWFwdCBcCisgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NoZWNrdmludGYgXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta2Jvb3RmcyBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21rYm9vdGltZyBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ZzX2NvbmZpZyBcCkBAIC0yMDkxLDggKzIzMDQsNiBAQAogICAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9zaWduYXBrLmphciBcCiAgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL0Jvb3RTaWduYXR1cmUuamFyIFwKICAgJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvVmVyaXR5U2lnbmVyLmphciBcCi0gICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21ha2VfZXh0NGZzIFwKLSAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWt1c2VyaW1nLnNoIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtlMmZzIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWt1c2VyaW1nX21rZTJmcy5zaCBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2UyZnNkcm9pZCBcCkBAIC0yMTAwLDkgKzIzMTEsMTEgQEAKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtzcXVhc2hmcyBcCiAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21rZjJmc3VzZXJpbWcuc2ggXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9tYWtlX2YyZnMgXAorICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9zbG9hZF9mMmZzIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvc2ltZzJpbWcgXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9lMmZzY2sgXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idWlsZF92ZXJpdHlfdHJlZSBcCisgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2dlbmVyYXRlX3Zlcml0eV9rZXkgXAogICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS92ZXJpdHlfc2lnbmVyIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvdmVyaXR5X3ZlcmlmaWVyIFwKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXBwZW5kMnNpbWcgXApAQCAtMjExNCw3ICsyMzI3LDcgQEAKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGVsdGFfZ2VuZXJhdG9yIFwKICAgJChBVkJUT09MKSBcCiAgICQoQkxLX0FMTE9DX1RPX0JBU0VfRlMpIFwKLSAgJChCUk8pCisgICQoQlJPVExJKQogCiBpZmVxICh0cnVlLCQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NVUFBPUlRTX1ZCT09UKSkKIE9UQVRPT0xTICs9IFwKQEAgLTIxMjgsNiArMjM0MSw3IEBACiAgICQoSE9TVF9MSUJSQVJZX1BBVEgpL2xpYmxvZyQoSE9TVF9TSExJQl9TVUZGSVgpIFwKICAgJChIT1NUX0xJQlJBUllfUEFUSCkvbGliY3V0aWxzJChIT1NUX1NITElCX1NVRkZJWCkgXAogICAkKEhPU1RfTElCUkFSWV9QQVRIKS9saWJzZWxpbnV4JChIT1NUX1NITElCX1NVRkZJWCkgXAorICAkKEhPU1RfTElCUkFSWV9QQVRIKS9saWJjcnlwdG9fdXRpbHMkKEhPU1RfU0hMSUJfU1VGRklYKSBcCiAgICQoSE9TVF9MSUJSQVJZX1BBVEgpL2xpYmNyeXB0by1ob3N0JChIT1NUX1NITElCX1NVRkZJWCkgXAogICAkKEhPU1RfTElCUkFSWV9QQVRIKS9saWJleHQyZnMtaG9zdCQoSE9TVF9TSExJQl9TVUZGSVgpIFwKICAgJChIT1NUX0xJQlJBUllfUEFUSCkvbGliZXh0Ml9ibGtpZC1ob3N0JChIT1NUX1NITElCX1NVRkZJWCkgXApAQCAtMjE2MiwxNyArMjM3NiwxOCBAQAogICBzeXN0ZW0vZXh0cmFzL3Zlcml0eS9idWlsZF92ZXJpdHlfbWV0YWRhdGEucHkgXAogICBzeXN0ZW0vZXh0cmFzL2V4dDRfdXRpbHMvbWtlMmZzLmNvbmYgXAogICBleHRlcm5hbC9hdmIvdGVzdC9kYXRhL3Rlc3RrZXlfcnNhNDA5Ni5wZW0gXAotICAkKHNoZWxsIGZpbmQgYnVpbGQvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkgLXR5cGUgZiAtbmFtZSBcKi54NTA5LnBlbSAtbyAtbmFtZSBcKi5wazggLW8gXAotICAgICAgLW5hbWUgdmVyaXR5X2tleSB8IHNvcnQpIFwKLSAgJChzaGVsbCBmaW5kIGRldmljZSB2ZW5kb3IgLXR5cGUgZiAtbmFtZSBcKi5wazggLW8gLW5hbWUgdmVyaWZpZWRib290XCogLW8gXAotICAgICAgLW5hbWUgXCoueDUwOS5wZW0gLW8gLW5hbWUgb2VtXCoucHJvcCB8IHNvcnQpCisgICQoc29ydCAkKHNoZWxsIGZpbmQgc3lzdGVtL3VwZGF0ZV9lbmdpbmUvc2NyaXB0cyAtbmFtZSBcKi5weWMgLXBydW5lIC1vIC10eXBlIGYgLXByaW50KSkgXAorICAkKHNvcnQgJChzaGVsbCBmaW5kIGJ1aWxkL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5IC10eXBlIGYgLW5hbWUgXCoueDUwOS5wZW0gLW8gLW5hbWUgXCoucGs4IC1vIFwKKyAgICAgIC1uYW1lIHZlcml0eV9rZXkpKSBcCisgICQoc29ydCAkKHNoZWxsIGZpbmQgZGV2aWNlICQod2lsZGNhcmQgdmVuZG9yKSAtdHlwZSBmIC1uYW1lIFwqLnBrOCAtbyAtbmFtZSB2ZXJpZmllZGJvb3RcKiAtbyBcCisgICAgICAtbmFtZSBcKi54NTA5LnBlbSAtbyAtbmFtZSBvZW1cKi5wcm9wKSkKIAogT1RBVE9PTFNfUkVMRUFTRVRPT0xTIDo9IFwKLSAgJChzaGVsbCBmaW5kIGJ1aWxkL3Rvb2xzL3JlbGVhc2V0b29scyAtbmFtZSBcKi5weWMgLXBydW5lIC1vIC10eXBlIGYgfCBzb3J0KQorICAkKHNvcnQgJChzaGVsbCBmaW5kIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzIC1uYW1lIFwqLnB5YyAtcHJ1bmUgLW8gLXR5cGUgZikpCiAKIGlmZXEgKHRydWUsJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfU1VQUE9SVFNfVkJPT1QpKQogT1RBVE9PTFNfREVQUyArPSBcCi0gICQoc2hlbGwgZmluZCBleHRlcm5hbC92Ym9vdF9yZWZlcmVuY2UvdGVzdHMvZGV2a2V5cyAtdHlwZSBmIHwgc29ydCkKKyAgJChzb3J0ICQoc2hlbGwgZmluZCBleHRlcm5hbC92Ym9vdF9yZWZlcmVuY2UvdGVzdHMvZGV2a2V5cyAtdHlwZSBmKSkKIGVuZGlmCiAKICQoQlVJTFRfT1RBVE9PTFNfUEFDS0FHRSk6ICQoT1RBVE9PTFMpICQoT1RBVE9PTFNfREVQUykgJChPVEFUT09MU19SRUxFQVNFVE9PTFMpIHwgJChBQ1ApCkBAIC0yMTgwLDcgKzIzOTUsNyBAQAogCSQoaGlkZSkgcm0gLXJmICRAICQoemlwX3Jvb3QpCiAJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkgJCh6aXBfcm9vdCkvYmluICQoemlwX3Jvb3QpL2ZyYW1ld29yayAkKHppcF9yb290KS9yZWxlYXNldG9vbHMKIAkkKGNhbGwgY29weS1maWxlcy13aXRoLXN0cnVjdHVyZSwkKE9UQVRPT0xTKSwkKEhPU1RfT1VUKS8sJCh6aXBfcm9vdCkpCi0JJChoaWRlKSAkKEFDUCkgLXIgLWQgLXAgYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzLyogJCh6aXBfcm9vdCkvcmVsZWFzZXRvb2xzCisJJChoaWRlKSAkKEFDUCkgLXIgLWQgLXAgYnVpbGQvbWFrZS90b29scy9yZWxlYXNldG9vbHMvKiAkKHppcF9yb290KS9yZWxlYXNldG9vbHMKIAkkKGhpZGUpIHJtIC1yZiAkQCAkKHppcF9yb290KS9yZWxlYXNldG9vbHMvKi5weWMKIAkkKGhpZGUpIChjZCAkKHppcF9yb290KSAmJiB6aXAgLXFyeVggJChhYnNwYXRoICRAKSAqKQogCSQoaGlkZSkgZWNobyAkKE9UQVRPT0xTX0RFUFMpIHwgeGFyZ3MgemlwIC1xcnlYICQoYWJzcGF0aCAkQCk+L2Rldi9udWxsIHx8IHRydWUKQEAgLTIyNDEsOSArMjQ1Niw3IEBACiAkKEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFKTogUFJJVkFURV9UT09MX0VYVEVOU0lPTiA6PSAkKHRvb2xfZXh0ZW5zaW9uKQogCiBpZmVxICgkKEFCX09UQV9VUERBVEVSKSx0cnVlKQotIyBCdWlsZCB6bGliIGZpbmdlcnByaW50IGlmIHVzaW5nIHRoZSBBQiBVcGRhdGVyLgotdXBkYXRlcl9kZXAgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9HRU4pL3psaWJfZmluZ2VycHJpbnQKLXVwZGF0ZXJfZGVwICs9IHN5c3RlbS91cGRhdGVfZW5naW5lL3VwZGF0ZV9lbmdpbmUuY29uZgordXBkYXRlcl9kZXAgOj0gc3lzdGVtL3VwZGF0ZV9lbmdpbmUvdXBkYXRlX2VuZ2luZS5jb25mCiBlbHNlCiAjIEJ1aWxkIE9UQSB0b29scyBpZiBub3QgdXNpbmcgdGhlIEFCIFVwZGF0ZXIuCiB1cGRhdGVyX2RlcCA6PSAkKGJ1aWx0X290YV90b29scykKQEAgLTIyNzMsNyArMjQ4Niw3IEBACiAjICQxOiByb290IGRpcmVjdG9yeQogIyAkMjogYWRkIHByZWZpeAogZGVmaW5lIGZzX2NvbmZpZwotKGNkICQoMSk7IGZpbmQgLiAtdHlwZSBkIHwgc2VkICdzLCQkLC8sJzsgZmluZCAuIFwhIC10eXBlIGQpIHwgY3V0IC1jIDMtIHwgc29ydCB8IHNlZCAncyxeLCQoMiksJyB8ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ZzX2NvbmZpZyAtQyAtRCAkKFRBUkdFVF9PVVQpIC1TICQoU0VMSU5VWF9GQykKKyhjZCAkKDEpOyBmaW5kIC4gLXR5cGUgZCB8IHNlZCAncywkJCwvLCc7IGZpbmQgLiBcISAtdHlwZSBkKSB8IGN1dCAtYyAzLSB8IHNvcnQgfCBzZWQgJ3MsXiwkKDIpLCcgfCAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9mc19jb25maWcgLUMgLUQgJChUQVJHRVRfT1VUKSAtUyAkKFNFTElOVVhfRkMpIC1SICIkKDIpIgogZW5kZWYKIAogIyBEZXBlbmRpbmcgb24gdGhlIHZhcmlvdXMgaW1hZ2VzIGd1YXJhbnRlZXMgdGhhdCB0aGUgdW5kZXJseWluZwpAQCAtMjI4Niw2ICsyNDk5LDcgQEAKIAkJJChJTlNUQUxMRURfVVNFUkRBVEFJTUFHRV9UQVJHRVQpIFwKIAkJJChJTlNUQUxMRURfQ0FDSEVJTUFHRV9UQVJHRVQpIFwKIAkJJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSBcCisJCSQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpIFwKIAkJJChJTlNUQUxMRURfVkJNRVRBSU1BR0VfVEFSR0VUKSBcCiAJCSQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpIFwKIAkJJChJTlRFUk5BTF9TWVNURU1PVEhFUklNQUdFX0ZJTEVTKSBcCkBAIC0yMjk0LDYgKzI1MDgsNyBAQAogCQkkKElOU1RBTExFRF8yTkRCT09UTE9BREVSX1RBUkdFVCkgXAogCQkkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TWVNURU1fQkFTRV9GU19QQVRIKSBcCiAJCSQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1ZFTkRPUl9CQVNFX0ZTX1BBVEgpIFwKKwkJJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfUFJPRFVDVF9CQVNFX0ZTX1BBVEgpIFwKIAkJJChTRUxJTlVYX0ZDKSBcCiAJCSQoQVBLQ0VSVFNfRklMRSkgXAogCQkkKFNPT05HX1pJUCkgXApAQCAtMjMwMSwxMSArMjUxNiwxMiBAQAogCQkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9pbWdkaWZmIFwKIAkJJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYnNkaWZmIFwKIAkJJChCVUlMRF9JTUFHRV9TUkNTKSBcCi0JCSQoSU5TVEFMTEVEX1ZFTkRPUl9NQU5JRkVTVCkgXAotCQkkKElOU1RBTExFRF9WRU5ET1JfTUFUUklYKSBcCisJCSQoQlVJTFRfVkVORE9SX01BTklGRVNUKSBcCisJCSQoQlVJTFRfVkVORE9SX01BVFJJWCkgXAogCQl8ICQoQUNQKQogCUBlY2hvICJQYWNrYWdlIHRhcmdldCBmaWxlczogJEAiCiAJJChjYWxsIGNyZWF0ZS1zeXN0ZW0tdmVuZG9yLXN5bWxpbmspCisJJChjYWxsIGNyZWF0ZS1zeXN0ZW0tcHJvZHVjdC1zeW1saW5rKQogCSQoaGlkZSkgcm0gLXJmICRAICRALmxpc3QgJCh6aXBfcm9vdCkKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKSAkKHppcF9yb290KQogaWZuZXEgKCwkKElOU1RBTExFRF9SRUNPVkVSWUlNQUdFX1RBUkdFVCkkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSkpCkBAIC0yMzcxLDYgKzI1ODcsMTEgQEAKIAkkKGhpZGUpICQoY2FsbCBwYWNrYWdlX2ZpbGVzLWNvcHktcm9vdCwgXAogCQkkKFRBUkdFVF9PVVRfVkVORE9SKSwkKHppcF9yb290KS9WRU5ET1IpCiBlbmRpZgoraWZkZWYgQk9BUkRfUFJPRFVDVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUKKwlAIyBDb250ZW50cyBvZiB0aGUgcHJvZHVjdCBpbWFnZQorCSQoaGlkZSkgJChjYWxsIHBhY2thZ2VfZmlsZXMtY29weS1yb290LCBcCisJCSQoVEFSR0VUX09VVF9QUk9EVUNUKSwkKHppcF9yb290KS9QUk9EVUNUKQorZW5kaWYKIGlmZGVmIElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVAogCUAjIENvbnRlbnRzIG9mIHRoZSBzeXN0ZW1fb3RoZXIgaW1hZ2UKIAkkKGhpZGUpICQoY2FsbCBwYWNrYWdlX2ZpbGVzLWNvcHktcm9vdCwgXApAQCAtMjQwMiwxOCArMjYyMywxMiBAQAogaWZkZWYgQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFCiAJJChoaWRlKSBlY2hvICJib290X3NpemU9JChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKIGVuZGlmCi1pZmVxICgkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCksKQotCSQoaGlkZSkgZWNobyAicmVjb3ZlcnlfYXNfYm9vdD0kKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dAotZW5kaWYKIGlmZXEgKCQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSwpCiAJJChoaWRlKSBlY2hvICJub19yZWNvdmVyeT10cnVlIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKIGVuZGlmCiBpZmRlZiBCT0FSRF9SRUNPVkVSWUlNQUdFX1BBUlRJVElPTl9TSVpFCiAJJChoaWRlKSBlY2hvICJyZWNvdmVyeV9zaXplPSQoQk9BUkRfUkVDT1ZFUllJTUFHRV9QQVJUSVRJT05fU0laRSkiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dAogZW5kaWYKLWlmZGVmIEJPQVJEX0hBU19FWFQ0X1JFU0VSVkVEX0JMT0NLUwotCSQoaGlkZSkgZWNobyAiaGFzX2V4dDRfcmVzZXJ2ZWRfYmxvY2tzPSQoQk9BUkRfSEFTX0VYVDRfUkVTRVJWRURfQkxPQ0tTKSIgPj4gJCh6aXBfcm9vdCkvTUVUQS9taXNjX2luZm8udHh0Ci1lbmRpZgogaWZkZWYgVEFSR0VUX1JFQ09WRVJZX0ZTVFlQRV9NT1VOVF9PUFRJT05TCiAJQCMgVEFSR0VUX1JFQ09WRVJZX0ZTVFlQRV9NT1VOVF9PUFRJT05TIGNhbiBiZSBlbXB0eSB0byBpbmRpY2F0ZSB0aGF0IG5vdGhpbmcgYnV0IGRlZmF1bHRzIHNob3VsZCBiZSB1c2VkLgogCSQoaGlkZSkgZWNobyAicmVjb3ZlcnlfbW91bnRfb3B0aW9ucz0kKFRBUkdFVF9SRUNPVkVSWV9GU1RZUEVfTU9VTlRfT1BUSU9OUykiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dApAQCAtMjQ0MSw2ICsyNjU2LDEwIEBACiAJJChoaWRlKSBjcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9WRU5ET1JfQkFTRV9GU19QQVRIKSBcCiAJICAkKHppcF9yb290KS9NRVRBLyQobm90ZGlyICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1ZFTkRPUl9CQVNFX0ZTX1BBVEgpKQogZW5kaWYKK2lmbmVxICgkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9QUk9EVUNUX0JBU0VfRlNfUEFUSCksKQorCSQoaGlkZSkgY3AgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfUFJPRFVDVF9CQVNFX0ZTX1BBVEgpIFwKKwkgICQoemlwX3Jvb3QpL01FVEEvJChub3RkaXIgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfUFJPRFVDVF9CQVNFX0ZTX1BBVEgpKQorZW5kaWYKIGlmbmVxICgkKHN0cmlwICQoU0FOSVRJWkVfVEFSR0VUKSksKQogCSMgV2UgbmVlZCB0byBjcmVhdGUgdXNlcmRhdGEuaW1nIHdpdGggcmVhbCBkYXRhIGJlY2F1c2UgdGhlIGluc3RydW1lbnRlZCBsaWJyYXJpZXMgYXJlIGluIHVzZXJkYXRhLmltZy4KIAkkKGhpZGUpIGVjaG8gInVzZXJkYXRhX2ltZ193aXRoX2RhdGE9dHJ1ZSIgPj4gJCh6aXBfcm9vdCkvTUVUQS9taXNjX2luZm8udHh0CkBAIC0yNDU5LDYgKzI2NzgsMTIgQEAKIAkkKGhpZGUpIGVjaG8gImF2Yl9ib290X2FsZ29yaXRobT0kKEJPQVJEX0FWQl9CT09UX0FMR09SSVRITSkiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dAogCSQoaGlkZSkgZWNobyAiYXZiX2Jvb3Rfcm9sbGJhY2tfaW5kZXhfbG9jYXRpb249JChCT0FSRF9BVkJfQk9PVF9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dAogZW5kaWYgIyBCT0FSRF9BVkJfQk9PVF9LRVlfUEFUSAorCSQoaGlkZSkgZWNobyAiYXZiX3JlY292ZXJ5X2FkZF9oYXNoX2Zvb3Rlcl9hcmdzPSQoQk9BUkRfQVZCX1JFQ09WRVJZX0FERF9IQVNIX0ZPT1RFUl9BUkdTKSIgPj4gJCh6aXBfcm9vdCkvTUVUQS9taXNjX2luZm8udHh0CitpZmRlZiBCT0FSRF9BVkJfUkVDT1ZFUllfS0VZX1BBVEgKKwkkKGhpZGUpIGVjaG8gImF2Yl9yZWNvdmVyeV9rZXlfcGF0aD0kKEJPQVJEX0FWQl9SRUNPVkVSWV9LRVlfUEFUSCkiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dAorCSQoaGlkZSkgZWNobyAiYXZiX3JlY292ZXJ5X2FsZ29yaXRobT0kKEJPQVJEX0FWQl9SRUNPVkVSWV9BTEdPUklUSE0pIiA+PiAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQKKwkkKGhpZGUpIGVjaG8gImF2Yl9yZWNvdmVyeV9yb2xsYmFja19pbmRleF9sb2NhdGlvbj0kKEJPQVJEX0FWQl9SRUNPVkVSWV9ST0xMQkFDS19JTkRFWF9MT0NBVElPTikiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dAorZW5kaWYgIyBCT0FSRF9BVkJfUkVDT1ZFUllfS0VZX1BBVEgKIGVuZGlmICMgQk9BUkRfQVZCX0VOQUJMRQogaWZkZWYgQk9BUkRfQlBUX0lOUFVUX0ZJTEVTCiAJJChoaWRlKSBlY2hvICJib2FyZF9icHRfZW5hYmxlPXRydWUiID4+ICQoemlwX3Jvb3QpL01FVEEvbWlzY19pbmZvLnR4dApAQCAtMjQ3MSwxMiArMjY5NiwxMSBAQAogCSQoY2FsbCBnZW5lcmF0ZS11c2VyaW1hZ2UtcHJvcC1kaWN0aW9uYXJ5LCAkKHppcF9yb290KS9NRVRBL21pc2NfaW5mby50eHQpCiBpZm5lcSAoJChJTlNUQUxMRURfUkVDT1ZFUllJTUFHRV9UQVJHRVQpLCkKIAkkKGhpZGUpIFBBVEg9JChmb3JlYWNoIHAsJChJTlRFUk5BTF9VU0VSSU1BR0VTX0JJTkFSWV9QQVRIUyksJChwKTopJCRQQVRIIE1LQk9PVElNRz0kKE1LQk9PVElNRykgXAotCSAgICAuL2J1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy9tYWtlX3JlY292ZXJ5X3BhdGNoICQoemlwX3Jvb3QpICQoemlwX3Jvb3QpCisJICAgIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzL21ha2VfcmVjb3ZlcnlfcGF0Y2ggJCh6aXBfcm9vdCkgJCh6aXBfcm9vdCkKIGVuZGlmCiBpZmVxICgkKEFCX09UQV9VUERBVEVSKSx0cnVlKQogCUAjIFdoZW4gdXNpbmcgdGhlIEEvQiB1cGRhdGVyLCBpbmNsdWRlIHRoZSB1cGRhdGVyIGNvbmZpZyBmaWxlcyBpbiB0aGUgemlwLgogCSQoaGlkZSkgY3AgJChUT1BESVIpc3lzdGVtL3VwZGF0ZV9lbmdpbmUvdXBkYXRlX2VuZ2luZS5jb25mICQoemlwX3Jvb3QpL01FVEEvdXBkYXRlX2VuZ2luZV9jb25maWcudHh0Ci0JJChoaWRlKSBjcCAkKFRBUkdFVF9PVVRfQ09NTU9OX0dFTikvemxpYl9maW5nZXJwcmludCAkKHppcF9yb290KS9NRVRBL3psaWJfZmluZ2VycHJpbnQudHh0CiAJJChoaWRlKSBmb3IgcGFydCBpbiAkKEFCX09UQV9QQVJUSVRJT05TKTsgZG8gXAogCSAgZWNobyAiJCR7cGFydH0iID4+ICQoemlwX3Jvb3QpL01FVEEvYWJfcGFydGl0aW9ucy50eHQ7IFwKIAlkb25lCkBAIC0yNTE5LDYgKzI3NDMsMTQgQEAKIAkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL0lNQUdFUwogCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSAkKHppcF9yb290KS9JTUFHRVMvCiBlbmRpZgoraWZkZWYgQk9BUkRfUFJFQlVJTFRfUFJPRFVDVElNQUdFCisJJChoaWRlKSBta2RpciAtcCAkKHppcF9yb290KS9JTUFHRVMKKwkkKGhpZGUpIGNwICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpICQoemlwX3Jvb3QpL0lNQUdFUy8KK2VuZGlmCitpZmRlZiBCT0FSRF9QUkVCVUlMVF9CT09USU1BR0UKKwkkKGhpZGUpIG1rZGlyIC1wICQoemlwX3Jvb3QpL0lNQUdFUworCSQoaGlkZSkgY3AgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgJCh6aXBfcm9vdCkvSU1BR0VTLworZW5kaWYKIGlmZGVmIEJPQVJEX1BSRUJVSUxUX0RUQk9JTUFHRQogCSQoaGlkZSkgbWtkaXIgLXAgJCh6aXBfcm9vdCkvUFJFQlVJTFRfSU1BR0VTCiAJJChoaWRlKSBjcCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSAkKHppcF9yb290KS9QUkVCVUlMVF9JTUFHRVMvCkBAIC0yNTQ1LDYgKzI3NzcsOSBAQAogaWZkZWYgQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRQogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9WRU5ET1IsdmVuZG9yLykgPiAkKHppcF9yb290KS9NRVRBL3ZlbmRvcl9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCitpZmRlZiBCT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRQorCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9QUk9EVUNULHByb2R1Y3QvKSA+ICQoemlwX3Jvb3QpL01FVEEvcHJvZHVjdF9maWxlc3lzdGVtX2NvbmZpZy50eHQKK2VuZGlmCiBpZmVxICgkKEJPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFKSx0cnVlKQogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9ST09ULCkgPiAkKHppcF9yb290KS9NRVRBL3Jvb3RfZmlsZXN5c3RlbV9jb25maWcudHh0CiBlbmRpZgpAQCAtMjU1NSw4ICsyNzkwLDYgQEAKIGlmZGVmIElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVAogCSQoaGlkZSkgJChjYWxsIGZzX2NvbmZpZywkKHppcF9yb290KS9TWVNURU1fT1RIRVIsc3lzdGVtLykgPiAkKHppcF9yb290KS9NRVRBL3N5c3RlbV9vdGhlcl9maWxlc3lzdGVtX2NvbmZpZy50eHQKIGVuZGlmCi0KLWlmZXEgKCQoUFJPRFVDVF9GVUxMX1RSRUJMRSksdHJ1ZSkKIAlAIyBNZXRhZGF0YSBmb3IgY29tcGF0aWJpbGl0eSB2ZXJpZmljYXRpb24uCiAJJChoaWRlKSBjcCAkKEJVSUxUX1NZU1RFTV9NQU5JRkVTVCkgJCh6aXBfcm9vdCkvTUVUQS9zeXN0ZW1fbWFuaWZlc3QueG1sCiAJJChoaWRlKSBjcCAkKEJVSUxUX1NZU1RFTV9DT01QQVRJQklMSVRZX01BVFJJWCkgJCh6aXBfcm9vdCkvTUVUQS9zeXN0ZW1fbWF0cml4LnhtbApAQCAtMjU2NiwxMCArMjc5OSw5IEBACiBpZmRlZiBCVUlMVF9WRU5ET1JfTUFUUklYCiAJJChoaWRlKSBjcCAkKEJVSUxUX1ZFTkRPUl9NQVRSSVgpICQoemlwX3Jvb3QpL01FVEEvdmVuZG9yX21hdHJpeC54bWwKIGVuZGlmCi1lbmRpZgogCiAJJChoaWRlKSBQQVRIPSQoZm9yZWFjaCBwLCQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpLCQocCk6KSQkUEFUSCBNS0JPT1RJTUc9JChNS0JPT1RJTUcpIFwKLQkgICAgLi9idWlsZC90b29scy9yZWxlYXNldG9vbHMvYWRkX2ltZ190b190YXJnZXRfZmlsZXMgLWEgLXYgLXAgJChIT1NUX09VVCkgJCh6aXBfcm9vdCkKKwkgICAgYnVpbGQvbWFrZS90b29scy9yZWxlYXNldG9vbHMvYWRkX2ltZ190b190YXJnZXRfZmlsZXMgLWEgLXYgLXAgJChIT1NUX09VVCkgJCh6aXBfcm9vdCkKIAlAIyBaaXAgZXZlcnl0aGluZyB1cCwgcHJlc2VydmluZyBzeW1saW5rcyBhbmQgcGxhY2luZyBNRVRBLyBmaWxlcyBmaXJzdCB0bwogCUAjIGhlbHAgZWFybHkgdmFsaWRhdGlvbiBvZiB0aGUgLnppcCBmaWxlIHdoaWxlIHVwbG9hZGluZyBpdC4KIAkkKGhpZGUpIGZpbmQgJCh6aXBfcm9vdCkvTUVUQSB8IHNvcnQgPiRALmxpc3QKQEAgLTI2MDksMTQgKzI4NDEsMTQgQEAKIGlmZXEgKCQoQUJfT1RBX1VQREFURVIpLHRydWUpCiAkKElOVEVSTkFMX09UQV9QQUNLQUdFX1RBUkdFVCk6ICQoQlJJTExPX1VQREFURV9QQVlMT0FEKQogZWxzZQotJChJTlRFUk5BTF9PVEFfUEFDS0FHRV9UQVJHRVQpOiAkKEJSTykKKyQoSU5URVJOQUxfT1RBX1BBQ0tBR0VfVEFSR0VUKTogJChCUk9UTEkpCiBlbmRpZgogCiAkKElOVEVSTkFMX09UQV9QQUNLQUdFX1RBUkdFVCk6ICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpIFwKLQkJYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3RhcmdldF9maWxlcworCQlidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMKIAlAZWNobyAiUGFja2FnZSBPVEE6ICRAIgogCSQoaGlkZSkgUEFUSD0kKGZvcmVhY2ggcCwkKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKSwkKHApOikkJFBBVEggTUtCT09USU1HPSQoTUtCT09USU1HKSBcCi0JICAgLi9idWlsZC90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzIC12IFwKKwkgICBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMgLXYgXAogCSAgIC0tYmxvY2sgXAogCSAgIC0tZXh0cmFjdGVkX2lucHV0X3RhcmdldF9maWxlcyAkKHBhdHN1YnN0ICUuemlwLCUsJChCVUlMVF9UQVJHRVRfRklMRVNfUEFDS0FHRSkpIFwKIAkgICAtcCAkKEhPU1RfT1VUKSBcCkBAIC0yNjU5LDEyICsyODkxLDEzIEBACiBuYW1lIDo9ICQobmFtZSktc3ltYm9scy0kKEZJTEVfTkFNRV9UQUcpCiAKIFNZTUJPTFNfWklQIDo9ICQoUFJPRFVDVF9PVVQpLyQobmFtZSkuemlwCi0jIEZvciBhcHBzX29ubHkgYnVpbGQgd2UnbGwgZXN0YWJsaXNoIHRoZSBkZXBlbmRlbmN5IGxhdGVyIGluIGJ1aWxkL2NvcmUvbWFpbi5tay4KKyMgRm9yIGFwcHNfb25seSBidWlsZCB3ZSdsbCBlc3RhYmxpc2ggdGhlIGRlcGVuZGVuY3kgbGF0ZXIgaW4gYnVpbGQvbWFrZS9jb3JlL21haW4ubWsuCiBpZm5kZWYgVEFSR0VUX0JVSUxEX0FQUFMKICQoU1lNQk9MU19aSVApOiAkKElOU1RBTExFRF9TWVNURU1JTUFHRSkgXAogCQkkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSBcCiAJCSQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKSBcCiAJCSQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkgXAorCQkkKElOU1RBTExFRF9QUk9EVUNUSU1BR0VfVEFSR0VUKSBcCiAJCSQodXBkYXRlcl9kZXApCiBlbmRpZgogJChTWU1CT0xTX1pJUCk6IFBSSVZBVEVfTElTVF9GSUxFIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHN5bWJvbHMpL2ZpbGVsaXN0CkBAIC0yNjg3LDcgKzI5MjAsOCBAQAogJChDT1ZFUkFHRV9aSVApOiAkKElOU1RBTExFRF9TWVNURU1JTUFHRSkgXAogCQkkKElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUKSBcCiAJCSQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKSBcCi0JCSQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkKKwkJJChJTlNUQUxMRURfVkVORE9SSU1BR0VfVEFSR0VUKSBcCisJCSQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpCiBlbmRpZgogJChDT1ZFUkFHRV9aSVApOiBQUklWQVRFX0xJU1RfRklMRSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxjb3ZlcmFnZSkvZmlsZWxpc3QKICQoQ09WRVJBR0VfWklQKTogJChTT09OR19aSVApCkBAIC0yNzIxLDE0ICsyOTU1LDEzIEBACiAJZmkKIAogaWZlcSAodHJ1ZSwkKEVNTUFfSU5TVFJVTUVOVCkpCi0gICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIyBBbiBhcmNoaXZlIG9mIGNsYXNzZXMgZm9yIHVzZSBpbiBnZW5lcmF0aW5nIGNvZGUtY292ZXJhZ2UgcmVwb3J0cwotICAjIFRoZXNlIGFyZSB0aGUgdW5pbnN0cnVtZW50ZWQgdmVyc2lvbnMgb2YgYW55IGNsYXNzZXMgdGhhdCB3ZXJlCi0gICMgdG8gYmUgaW5zdHJ1bWVudGVkLgotICAjIEFueSBkZXBlbmRlbmNpZXMgYXJlIHNldCB1cCBsYXRlciBpbiBidWlsZC9jb3JlL21haW4ubWsuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFuIGFyY2hpdmUgb2YgY2xhc3NlcyBmb3IgdXNlIGluIGdlbmVyYXRpbmcgY29kZS1jb3ZlcmFnZSByZXBvcnRzCisjIFRoZXNlIGFyZSB0aGUgdW5pbnN0cnVtZW50ZWQgdmVyc2lvbnMgb2YgYW55IGNsYXNzZXMgdGhhdCB3ZXJlCisjIHRvIGJlIGluc3RydW1lbnRlZC4KKyMgQW55IGRlcGVuZGVuY2llcyBhcmUgc2V0IHVwIGxhdGVyIGluIGJ1aWxkL21ha2UvY29yZS9tYWluLm1rLgogCi0gIGlmZXEgKCQoQU5EUk9JRF9DT01QSUxFX1dJVEhfSkFDSyksZmFsc2UpCi0gICAgSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0FMTCA6PSAkKFBST0RVQ1RfT1VUKS9qYWNvY28tcmVwb3J0LWNsYXNzZXMtYWxsLmphcgorSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0FMTCA6PSAkKFBST0RVQ1RfT1VUKS9qYWNvY28tcmVwb3J0LWNsYXNzZXMtYWxsLmphcgogJChKQUNPQ09fUkVQT1JUX0NMQVNTRVNfQUxMKSA6CiAJQGVjaG8gIkNvbGxlY3RpbmcgdW5pbnN0cnVtZW50ZWQgY2xhc3NlcyIKIAkkKGhpZGUpIGZpbmQgJChUQVJHRVRfQ09NTU9OX09VVF9ST09UKSAkKEhPU1RfQ09NTU9OX09VVF9ST09UKSAtbmFtZSAiamFjb2NvLXJlcG9ydC1jbGFzc2VzLmphciIgfCBcCkBAIC0yNzM5LDE0ICsyOTcyLDYgQEAKICMgLXEgc3VwcmVzcyBtb3N0IG91dHB1dAogIyAtWCBza2lwIHN0b3JpbmcgZXh0ZW5kZWQgZmlsZSBhdHRyaWJ1dGVzCiAKLSAgZWxzZQotICAgIEVNTUFfTUVUQV9aSVAgOj0gJChQUk9EVUNUX09VVCkvZW1tYV9tZXRhLnppcAotJChFTU1BX01FVEFfWklQKSA6Ci0JQGVjaG8gIkNvbGxlY3RpbmcgRW1tYSBjb3ZlcmFnZSBtZXRhIGZpbGVzLiIKLQkkKGhpZGUpIGZpbmQgJChUQVJHRVRfQ09NTU9OX09VVF9ST09UKSAkKEhPU1RfQ09NTU9OX09VVF9ST09UKSAtbmFtZSAiY292ZXJhZ2UuZW0iIHwgXAotCQl6aXAgLUAgLXFYICRACi1lbmRpZgotCiBlbmRpZiAjIEVNTUFfSU5TVFJVTUVOVD10cnVlCiAKIApAQCAtMjc1NiwxMCArMjk4MSwxMCBAQAogIwogaWZkZWYgVEFSR0VUX0JVSUxEX0FQUFMKIFBST0dVQVJEX0RJQ1RfWklQIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX1BST0RVQ1QpLXByb2d1YXJkLWRpY3QtJChGSUxFX05BTUVfVEFHKS56aXAKLSMgdGhlIGRlcGVuZGVuY3kgd2lsbCBiZSBzZXQgdXAgbGF0ZXIgaW4gYnVpbGQvY29yZS9tYWluLm1rLgorIyB0aGUgZGVwZW5kZW5jeSB3aWxsIGJlIHNldCB1cCBsYXRlciBpbiBidWlsZC9tYWtlL2NvcmUvbWFpbi5tay4KICQoUFJPR1VBUkRfRElDVF9aSVApIDoKIAlAZWNobyAiUGFja2FnaW5nIFByb2d1YXJkIG9iZnVzY2F0aW9uIGRpY3Rpb25hcnkgZmlsZXMuIgotCSQoaGlkZSkgZGljdF9maWxlcz1gZmluZCAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL0FQUFMgLW5hbWUgcHJvZ3VhcmRfZGljdGlvbmFyeSAtbyAtbmFtZSBqYWNrX2RpY3Rpb25hcnlgOyBcCisJJChoaWRlKSBkaWN0X2ZpbGVzPWBmaW5kICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvQVBQUyAtbmFtZSBwcm9ndWFyZF9kaWN0aW9uYXJ5YDsgXAogCQlpZiBbIC1uICIkJGRpY3RfZmlsZXMiIF07IHRoZW4gXAogCQkgIHVub2JmdXNjYXRlZF9qYXJzPSQke2RpY3RfZmlsZXMvL3Byb2d1YXJkX2RpY3Rpb25hcnkvY2xhc3Nlcy5qYXJ9OyBcCiAJCSAgemlwIC1xWCAkQCAkJGRpY3RfZmlsZXMgJCR1bm9iZnVzY2F0ZWRfamFyczsgXApAQCAtMjc5Niw2ICszMDIxLDE1IEBACiB2ZW5kb3JpbWFnZTogJChJTlNUQUxMRURfUUVNVV9WRU5ET1JJTUFHRSkKIGRyb2lkY29yZTogJChJTlNUQUxMRURfUUVNVV9WRU5ET1JJTUFHRSkKIGVuZGlmCitpZmVxICgkKEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFKSx0cnVlKQorSU5TVEFMTEVEX1FFTVVfUFJPRFVDVElNQUdFIDo9ICQoUFJPRFVDVF9PVVQpL3Byb2R1Y3QtcWVtdS5pbWcKKyQoSU5TVEFMTEVEX1FFTVVfUFJPRFVDVElNQUdFKTogJChJTlNUQUxMRURfUFJPRFVDVElNQUdFX1RBUkdFVCkgJChNS19RRU1VX0lNQUdFX1NIKSAkKFNHRElTS19IT1NUKQorCUBlY2hvIENyZWF0ZSBwcm9kdWN0LXFlbXUuaW1nCisJKGV4cG9ydCBTR0RJU0s9JChTR0RJU0tfSE9TVCk7ICQoTUtfUUVNVV9JTUFHRV9TSCkgJHtQUk9EVUNUX09VVH0vcHJvZHVjdC5pbWcpCisKK3Byb2R1Y3RpbWFnZTogJChJTlNUQUxMRURfUUVNVV9QUk9EVUNUSU1BR0UpCitkcm9pZGNvcmU6ICQoSU5TVEFMTEVEX1FFTVVfUFJPRFVDVElNQUdFKQorZW5kaWYKIGVuZGlmCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRoZSBlbXVsYXRvciBwYWNrYWdlCkBAIC0yOTQyLDcgKzMxNzYsNiBAQAogCQkJLXYgIlRBUkdFVF9DUFVfQUJJPSQoVEFSR0VUX0NQVV9BQkkpIiBcCiAJCQktdiAiRExMX0VYVEVOU0lPTj0kKEhPU1RfU0hMSUJfU1VGRklYKSIgXAogCQkJLXYgIkZPTlRfT1VUPSQoU0RLX0ZPTlRfVEVNUCkiIFwKLQkJCS12ICJKQUNLX1NES1RPT0xfVkVSU0lPTj0kKEpBQ0tfU0RLVE9PTF9WRVJTSU9OKSIgXAogCQkJLW8gJChQUklWQVRFX0RJUikgJiYgXAogCQljcCAtZiAkKHRhcmdldF9ub3RpY2VfZmlsZV90eHQpIFwKIAkJCQkkKFBSSVZBVEVfRElSKS9zeXN0ZW0taW1hZ2VzL2FuZHJvaWQtJChQTEFURk9STV9WRVJTSU9OKS8kKFRBUkdFVF9DUFVfQUJJKS9OT1RJQ0UudHh0ICYmIFwKQEAgLTMwMDMsMyArMzIzNiw5IEBACiBpZm5lcSAoJChzZGtfcmVwb19nb2FsKSwpCiBpbmNsdWRlICQoVE9QRElSKWRldmVsb3BtZW50L2J1aWxkL3Rvb2xzL3Nka19yZXBvLm1rCiBlbmRpZgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgbHNkdW1wIHBhdGhzCitGSU5EX0xTRFVNUFNfRklMRSA6PSAkKFBST0RVQ1RfT1VUKS9sc2R1bXBfcGF0aHMudHh0CiskKEZJTkRfTFNEVU1QU19GSUxFKSA6ICQoTFNEVU1QX1BBVEhTKQorCSQoaGlkZSkgcm0gLXJmICRAICYmIGVjaG8gIiReIiA+ICRACmRpZmYgLS1naXQgYS9jb3JlL2FhcHQyLm1rIGIvY29yZS9hYXB0Mi5tawppbmRleCAyODdmOTMzLi5jNTgyZTMwIDEwMDY0NAotLS0gYS9jb3JlL2FhcHQyLm1rCisrKyBiL2NvcmUvYWFwdDIubWsKQEAgLTQ3LDggKzQ3LDEwIEBACiBteV9nZW5lcmF0ZWRfcmVzb3VyY2VzX2ZsYXRhICs9ICQobXlfZ2VuZXJhdGVkX3Jlc291cmNlc19mbGF0YSkKIGVuZGlmCiAKKyMgQWx3YXlzIHNldCAtLXBzZXVkby1sb2NhbGl6ZSwgaXQgd2lsbCBiZSBzdHJpcHBlZCBvdXQgbGF0ZXIgZm9yIHJlbGVhc2UKKyMgYnVpbGRzIHRoYXQgZG9uJ3Qgd2FudCBpdC4KICQobXlfcmVzX3Jlc291cmNlc19mbGF0KSAkKG15X292ZXJsYXlfcmVzb3VyY2VzX2ZsYXQpICQobXlfZ2VuZXJhdGVkX3Jlc291cmNlc19mbGF0YSk6IFwKLSAgUFJJVkFURV9BQVBUMl9DRkxBR1MgOj0gJChQUk9EVUNUX0FBUFQyX0NGTEFHUykKKyAgUFJJVkFURV9BQVBUMl9DRkxBR1MgOj0gLS1wc2V1ZG8tbG9jYWxpemUKIAogbXlfc3RhdGljX2xpYnJhcnlfcmVzb3VyY2VzIDo9ICQoZm9yZWFjaCBsLCAkKGNhbGwgcmV2ZXJzZS1saXN0LCQoTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTKSksXAogICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQobCksLENPTU1PTikvcGFja2FnZS1yZXMuYXBrKQpAQCAtNjksMjMgKzcxLDExIEBACiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9TSEFSRURfQU5EUk9JRF9MSUJSQVJJRVMgOj0gJChteV9zaGFyZWRfbGlicmFyeV9yZXNvdXJjZXMpCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9QUk9HVUFSRF9PUFRJT05TX0ZJTEUgOj0gJChwcm9ndWFyZF9vcHRpb25zX2ZpbGUpCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BU1NFVF9ESVJTIDo9ICQobXlfYXNzZXRfZGlycykKLSQobXlfcmVzX3BhY2thZ2UpOiAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCkgJChteV9zdGF0aWNfbGlicmFyeV9yZXNvdXJjZXMpICQobXlfc2hhcmVkX2xpYnJhcnlfcmVzb3VyY2VzKQotJChteV9yZXNfcGFja2FnZSk6ICQobXlfZnVsbF9hc3NldF9wYXRocykKLSQobXlfcmVzX3BhY2thZ2UpOiAkKG15X3Jlc19yZXNvdXJjZXNfZmxhdCkgJChteV9vdmVybGF5X3Jlc291cmNlc19mbGF0KSBcCi0gICQobXlfZ2VuZXJhdGVkX3Jlc291cmNlc19mbGF0YSkgJChteV9zdGF0aWNfbGlicmFyeV9yZXNvdXJjZXMpIFwKLSAgJChBQVBUMikKLQlAZWNobyAiQUFQVDIgbGluayAkQCIKLQkkKGNhbGwgYWFwdDItbGluaykKKyQobXlfcmVzX3BhY2thZ2UpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9CiAKIGlmZGVmIFJfZmlsZV9zdGFtcAotJChSX2ZpbGVfc3RhbXApIDogJChteV9yZXNfcGFja2FnZSkgfCAkKEFDUCkKLQlAZWNobyAidGFyZ2V0IFIuamF2YS9NYW5pZmVzdC5qYXZhOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgotCUBybSAtcmYgJEAgJiYgbWtkaXIgLXAgJChkaXIgJEApCi0JJChjYWxsIGZpbmQtZ2VuZXJhdGVkLVIuamF2YSkKLWVuZGlmCi0KLWlmZGVmIHByb2d1YXJkX29wdGlvbnNfZmlsZQotJChwcm9ndWFyZF9vcHRpb25zX2ZpbGUpIDogJChteV9yZXNfcGFja2FnZSkKKyQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX1JfRklMRV9TVEFNUCA6PSAkKFJfZmlsZV9zdGFtcCkKKyQobXlfcmVzX3BhY2thZ2UpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTICs9ICQoUl9maWxlX3N0YW1wKQogZW5kaWYKIAogcmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UgOj0KQEAgLTk0LDEwICs4NCwzNyBAQAogIyBvdGhlciBwYWNrYWdlcyBjYW4gdXNlIHRvIGJ1aWxkIHRoZWlyIG93biBQUk9EVUNULWFnbm9zdGljIFIuamF2YSAoZXRjLikKICMgZmlsZXMuCiByZXNvdXJjZV9leHBvcnRfcGFja2FnZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wYWNrYWdlLWV4cG9ydC5hcGsKLSQoUl9maWxlX3N0YW1wKSA6ICQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpCi0KLSQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpIDogJChteV9yZXNfcGFja2FnZSkgfCAkKEFDUCkKLQlAZWNobyAidGFyZ2V0IEV4cG9ydCBSZXNvdXJjZXM6ICQoUFJJVkFURV9NT0RVTEUpICQoQCkiCi0JJChjb3B5LWZpbGUtdG8tbmV3LXRhcmdldCkKLQorJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfUkVTT1VSQ0VfRVhQT1JUX1BBQ0tBR0UgOj0gJChyZXNvdXJjZV9leHBvcnRfcGFja2FnZSkKKyQobXlfcmVzX3BhY2thZ2UpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTICs9ICQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpCiBlbmRpZgorCitpZmRlZiBwcm9ndWFyZF9vcHRpb25zX2ZpbGUKKyQobXlfcmVzX3BhY2thZ2UpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTICs9ICQocHJvZ3VhcmRfb3B0aW9uc19maWxlKQorZW5kaWYKKworJChteV9yZXNfcGFja2FnZSk6ICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSAkKG15X3N0YXRpY19saWJyYXJ5X3Jlc291cmNlcykgJChteV9zaGFyZWRfbGlicmFyeV9yZXNvdXJjZXMpCiskKG15X3Jlc19wYWNrYWdlKTogJChteV9mdWxsX2Fzc2V0X3BhdGhzKQorJChteV9yZXNfcGFja2FnZSk6ICQobXlfcmVzX3Jlc291cmNlc19mbGF0KSAkKG15X292ZXJsYXlfcmVzb3VyY2VzX2ZsYXQpIFwKKyAgJChteV9nZW5lcmF0ZWRfcmVzb3VyY2VzX2ZsYXRhKSAkKG15X3N0YXRpY19saWJyYXJ5X3Jlc291cmNlcykgXAorICAkKEFBUFQyKQorCUBlY2hvICJBQVBUMiBsaW5rICRAIgorCSQoY2FsbCBhYXB0Mi1saW5rKQoraWZkZWYgUl9maWxlX3N0YW1wCisJQHJtIC1mICQoUFJJVkFURV9SX0ZJTEVfU1RBTVApCisJJChjYWxsIGZpbmQtZ2VuZXJhdGVkLVIuamF2YSwkKFBSSVZBVEVfUl9GSUxFX1NUQU1QKSkKK2VuZGlmCitpZmRlZiBMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVMKKwlAcm0gLWYgJChQUklWQVRFX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFKQorCisJY3AgJEAgJChQUklWQVRFX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFKQorZW5kaWYKKworIyBDbGVhciBpbnB1dHMgb25seSB1c2VkIGluIHRoaXMgZmlsZSwgc28gdGhhdCB0aGV5J3JlIG5vdCByZS11c2VkIGR1cmluZyB0aGUgbmV4dCBidWlsZAorbXlfcmVzX3Jlc291cmNlcyA6PQorbXlfb3ZlcmxheV9yZXNvdXJjZXMgOj0KK215X2NvbXBpbGVkX3Jlc19iYXNlX2RpciA6PQorbXlfYXNzZXRfZGlycyA6PQorbXlfZnVsbF9hc3NldF9wYXRocyA6PQorbXlfYXBrX3NwbGl0X2NvbmZpZ3MgOj0KK215X2dlbmVyYXRlZF9yZXNfZGlycyA6PQorbXlfZ2VuZXJhdGVkX3Jlc19kaXJzX2RlcHMgOj0KZGlmZiAtLWdpdCBhL2NvcmUvYWxsb3dlZF9uZGtfdHlwZXMubWsgYi9jb3JlL2FsbG93ZWRfbmRrX3R5cGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OGI5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2FsbG93ZWRfbmRrX3R5cGVzLm1rCkBAIC0wLDAgKzEsODQgQEAKKyMgRGV0ZXJtaW5lcyB0aGUgdHlwZXMgb2YgTkRLIG1vZHVsZXMgdGhlIGN1cnJlbnQgbW9kdWxlIGlzIGFsbG93ZWQgdG8gbGluayB0by4KKyMgSW5wdXQgdmFyaWFibGVzOgorIyAgIExPQ0FMX01PRFVMRQorIyAgIExPQ0FMX01PRFVMRV9DTEFTUworIyAgIExPQ0FMX05ES19TVExfVkFSSUFOVAorIyAgIExPQ0FMX1NES19WRVJTSU9OCisjIE91dHB1dCB2YXJpYWJsZXM6CisjICAgbXlfbmRrX3N0bF9mYW1pbHk6IEZhbWlseSBvZiB0aGUgTkRLIFNUTC4KKyMgICBteV9uZGtfc3RsX2xpbmtfdHlwZTogU1RMIGxpbmsgdHlwZSwgc3RhdGljIG9yIHNoYXJlZC4KKyMgICBteV9hbGxvd2VkX25ka190eXBlczogVHlwZXMgb2YgTkRLIG1vZHVsZXMgdGhhdCBtYXkgYmUgbGlua2VkLgorIyAgIG15X3dhcm5fbmRrX3R5cGVzOiBUeXBlcyBvZiBOREsgbW9kdWxlcyB0aGF0IHNob3VsZG4ndCBiZSBsaW5rZWQsIGJ1dCBhcmUuCisKK215X2FsbG93ZWRfbmRrX3R5cGVzIDo9CitteV93YXJuX25ka190eXBlcyA6PQorbXlfbmRrX3N0bF9mYW1pbHkgOj0KK215X25ka19zdGxfbGlua190eXBlIDo9CisKK2lmZGVmIExPQ0FMX1NES19WRVJTSU9OCisgICAgaWZlcSAoJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpLCkKKyAgICAgICAgbXlfbmRrX3N0bF9mYW1pbHkgOj0gc3lzdGVtCisgICAgICAgIG15X25ka19zdGxfbGlua190eXBlIDo9IHNoYXJlZAorICAgIGVsc2UgaWZlcSAoJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpLHN5c3RlbSkKKyAgICAgICAgbXlfbmRrX3N0bF9mYW1pbHkgOj0gc3lzdGVtCisgICAgICAgIG15X25ka19zdGxfbGlua190eXBlIDo9IHNoYXJlZAorICAgIGVsc2UgaWZlcSAoJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpLGMrK19zaGFyZWQpCisgICAgICAgIG15X25ka19zdGxfZmFtaWx5IDo9IGxpYmMrKworICAgICAgICBteV9uZGtfc3RsX2xpbmtfdHlwZSA6PSBzaGFyZWQKKyAgICBlbHNlIGlmZXEgKCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSxjKytfc3RhdGljKQorICAgICAgICBteV9uZGtfc3RsX2ZhbWlseSA6PSBsaWJjKysKKyAgICAgICAgbXlfbmRrX3N0bF9saW5rX3R5cGUgOj0gc3RhdGljCisgICAgZWxzZSBpZmVxICgkKExPQ0FMX05ES19TVExfVkFSSUFOVCksbm9uZSkKKyAgICAgICAgbXlfbmRrX3N0bF9mYW1pbHkgOj0gbm9uZQorICAgICAgICBteV9uZGtfc3RsX2xpbmtfdHlwZSA6PSBub25lCisgICAgZWxzZQorICAgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLGludmFsaWQgTE9DQUxfTkRLX1NUTF9WQVJJQU5UOiAkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpCisgICAgZW5kaWYKKworICAgIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSxTVEFUSUNfTElCUkFSSUVTKQorICAgICAgICAjIFRoZSAibm9uZSIgbGluayB0eXBlIGluZGljYXRlcyB0aGF0IG5vdGhpbmcgaXMgYWN0dWFsbHkgbGlua2VkLiBTaW5jZQorICAgICAgICAjIHRoaXMgaXMgYSBzdGF0aWMgbGlicmFyeSwgaXQncyBzdGlsbCB1cCB0byB0aGUgZmluYWwgdXNlIG9mIHRoZQorICAgICAgICAjIGxpYnJhcnkgd2hldGhlciBhIHN0YXRpYyBvciBzaGFyZWQgU1RMIHNob3VsZCBiZSB1c2VkLgorICAgICAgICBteV9uZGtfc3RsX2xpbmtfdHlwZSA6PSBub25lCisgICAgZW5kaWYKKworICAgICMgVGhlIHN5c3RlbSBTVEwgaXMgb25seSB0aGUgQysrIEFCSSBsYXllciwgc28gaXQncyBjb21wYXRpYmxlIHdpdGggYW55IFNUTC4KKyAgICBteV9hbGxvd2VkX25ka190eXBlcyArPSBuYXRpdmU6bmRrOnN5c3RlbTpzaGFyZWQKKyAgICBteV9hbGxvd2VkX25ka190eXBlcyArPSBuYXRpdmU6bmRrOnN5c3RlbTpub25lCisKKyAgICAjIExpYmFyaWVzIHRoYXQgZG9uJ3QgdXNlIHRoZSBTVEwgY2FuIGJlIGxpbmtlZCB0byBhbnl0aGluZy4KKyAgICBteV9hbGxvd2VkX25ka190eXBlcyArPSBuYXRpdmU6bmRrOm5vbmU6bm9uZQorCisgICAgIyBBbmQgaXQncyBhbHdheXMgb2theSB0byBsaW5rIGEgc3RhdGljIGxpYnJhcnkgdGhhdCB1c2VzIHlvdXIgb3duIFNUTCB0eXBlLgorICAgICMgU2luY2Ugbm90aGluZyB3YXMgYWN0dWFsbHkgbGlua2VkIGZvciB0aGUgc3RhdGljIGxpYnJhcnksIGl0IGlzIHVwIHRvIHRoZQorICAgICMgZmlyc3QgbGlua2VkIGxpYnJhcnkgaW4gdGhlIGRlcGVuZGVuY3kgY2hhaW4gd2hpY2ggZ2V0cyB1c2VkLgorICAgIG15X2FsbG93ZWRfbmRrX3R5cGVzICs9IG5hdGl2ZTpuZGs6JChteV9uZGtfc3RsX2ZhbWlseSk6bm9uZQorCisgICAgaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLEFQUFMpCisgICAgICAgICMgRm9yIGFuIGFwcCBwYWNrYWdlLCBpdCdzIGFjdHVhbGx5IG9rYXkgdG8gZGVwZW5kIG9uIGFueSBzZXQgb2YgU1RMcy4KKyAgICAgICAgIyBJZiBhbnkgb2YgdGhlIGluZGl2aWR1YWwgbGlicmFyaWVzIGRlcGVuZCBvbiBlYWNoIG90aGVyIHRoZXkndmUKKyAgICAgICAgIyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBmb3IgY29uc2lzdGVuY3ksIGFuZCBpZiB0aGV5IGRvbid0IHRoZXknbGwgYmUKKyAgICAgICAgIyBrZXB0IGlzb2xhdGVkIGJ5IFJUTERfTE9DQUwgYW55d2F5LgorICAgICAgICBteV9hbGxvd2VkX25ka190eXBlcyArPSBcCisgICAgICAgICAgICBuYXRpdmU6bmRrOmxpYmMrKzpzaGFyZWQgbmF0aXZlOm5kazpsaWJjKys6c3RhdGljCisKKyAgICAgICAgIyBUaGUgIm5vbmUiIGxpbmsgdHlwZSB0aGF0IHVzZWQgYnkgc3RhdGljIGxpYnJhcmllcyBpcyBpbnRlbnRpb25hbGx5CisgICAgICAgICMgb21pdHRlZCBoZXJlLiBXZSBzaG91bGQgb25seSBiZSBkZWFsaW5nIHdpdGggc2hhcmVkIGxpYnJhcmllcyBpbgorICAgICAgICAjIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTLgorICAgIGVsc2UgaWZlcSAoJChteV9uZGtfc3RsX2xpbmtfdHlwZSksc2hhcmVkKQorICAgICAgICAjIE1vZHVsZXMgbGlua2VkIHRvIGEgc2hhcmVkIFNUTCBjYW4gb25seSB1c2UgYW5vdGhlciBzaGFyZWQgU1RMLgorICAgICAgICBteV9hbGxvd2VkX25ka190eXBlcyArPSBuYXRpdmU6bmRrOiQobXlfbmRrX3N0bF9mYW1pbHkpOnNoYXJlZAorICAgIGVuZGlmCisgICAgIyBFbHNlIHdlIGFyZSBhIG5vbi1zdGF0aWMgbGlicmFyeSB0aGF0IHVzZXMgYSBzdGF0aWMgU1RMLCBhbmQgYXJlCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgc2hhcmVkIGxpYnJhcmllcyB0aGF0IHVzZSBhbiBTVEwuCitlbHNlCisgICAgbXlfYWxsb3dlZF9uZGtfdHlwZXMgOj0gXAorICAgICAgICBuYXRpdmU6bmRrOm5vbmU6bm9uZSBcCisgICAgICAgIG5hdGl2ZTpuZGs6c3lzdGVtOm5vbmUgXAorICAgICAgICBuYXRpdmU6bmRrOnN5c3RlbTpzaGFyZWQgXAorCisgICAgaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLEFQUFMpCisgICAgICAgICMgQ1RTIGlzIGJhZCBhbmQgaXQgc2hvdWxkIGZlZWwgYmFkOiBodHRwOi8vYi8xMzI0OTczNworICAgICAgICBteV93YXJuX25ka190eXBlcyArPSBuYXRpdmU6bmRrOmxpYmMrKzpzdGF0aWMKKyAgICBlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvYW5kcm9pZF9tYW5pZmVzdC5tayBiL2NvcmUvYW5kcm9pZF9tYW5pZmVzdC5tawppbmRleCAwMDkzZTAyLi43ZDU3M2QzIDEwMDY0NAotLS0gYS9jb3JlL2FuZHJvaWRfbWFuaWZlc3QubWsKKysrIGIvY29yZS9hbmRyb2lkX21hbmlmZXN0Lm1rCkBAIC0zNCwxMCArMzQsMTIgQEAKIG1haW5fYW5kcm9pZF9tYW5pZmVzdCA6PSAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCkKIGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9BbmRyb2lkTWFuaWZlc3QueG1sCiAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCk6IFBSSVZBVEVfTElCU19NQU5JRkVTVFMgOj0gJChteV9mdWxsX2xpYnNfbWFuaWZlc3RfZmlsZXMpCiskKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCk6ICQoQU5EUk9JRF9NQU5JRkVTVF9NRVJHRVJfQ0xBU1NQQVRIKQogJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpIDogJChtYWluX2FuZHJvaWRfbWFuaWZlc3QpICQobXlfZnVsbF9saWJzX21hbmlmZXN0X2RlcHMpCiAJQGVjaG8gIk1lcmdlIGFuZHJvaWQgbWFuaWZlc3QgZmlsZXM6ICRAIDwtLSAkPCAkKFBSSVZBVEVfTElCU19NQU5JRkVTVFMpIgogCUBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpICQoQU5EUk9JRF9NQU5JRkVTVF9NRVJHRVIpIC0tbWFpbiAkPCAtLWxpYnMgJChQUklWQVRFX0xJQlNfTUFOSUZFU1RTKSBcCisJJChoaWRlKSAkKEFORFJPSURfTUFOSUZFU1RfTUVSR0VSKSAtLW1haW4gJDwgXAorCSAgICAtLWxpYnMgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX0xJQlNfTUFOSUZFU1RTKSkgXAogCSAgICAtLW91dCAkQAogCiBlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9hcGlkaWZmLm1rIGIvY29yZS9hcGlkaWZmLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDc1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2FwaWRpZmYubWsKQEAgLTAsMCArMSwxODEgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMjCisjIworIyMgQ29tbW9uIHRvIGJvdGggamRpZmYgYW5kIGphdmFkb2MKKyMjCisjIworCitMT0NBTF9JU19IT1NUX01PRFVMRSA6PSAkKGNhbGwgdHJ1ZS1vci1lbXB0eSwkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSkKK2lmZXEgKCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpLHRydWUpCitteV9wcmVmaXggOj0gSE9TVF8KK0xPQ0FMX0hPU1RfUFJFRklYIDo9CitlbHNlCitteV9wcmVmaXggOj0gVEFSR0VUXworZW5kaWYKKworTE9DQUxfTU9EVUxFX0NMQVNTIDo9ICQoc3RyaXAgJChMT0NBTF9NT0RVTEVfQ0xBU1MpKQoraWZuZGVmIExPQ0FMX01PRFVMRV9DTEFTUworJChlcnJvciAkKExPQ0FMX1BBVEgpOiBMT0NBTF9NT0RVTEVfQ0xBU1Mgbm90IGRlZmluZWQpCitlbmRpZgorCitmdWxsX3NyY19maWxlcyA6PSAkKHBhdHN1YnN0ICUsJChMT0NBTF9QQVRIKS8lLCQoTE9DQUxfU1JDX0ZJTEVTKSkKK291dF9kaXIgOj0gJChPVVRfRE9DUykvJChMT0NBTF9NT0RVTEUpL2FwaV9kaWZmL2N1cnJlbnQKK2Z1bGxfdGFyZ2V0IDo9ICQoY2FsbCBkb2MtdGltZXN0YW1wLWZvciwkKExPQ0FMX01PRFVMRSktZGlmZikKKworaWZlcSAoJChMT0NBTF9JU19IT1NUX01PRFVMRSksdHJ1ZSkKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0KK2Z1bGxfamF2YV9saWJzIDo9ICQoYWRkcHJlZml4ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpLyxcCisgICQoYWRkc3VmZml4ICQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKSkKK2Z1bGxfamF2YV9saWJfZGVwcyA6PSAkKGZ1bGxfamF2YV9saWJzKQorCitlbHNlCisKK2lmbmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSwpCisgIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUyksY3VycmVudCkKKyAgICAjIFVzZSBhbmRyb2lkX3N0dWJzX2N1cnJlbnQgaWYgTE9DQUxfU0RLX1ZFUlNJT04gaXMgY3VycmVudCBhbmQgbm8gVEFSR0VUX0JVSUxEX0FQUFMuCisgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZF9zdHVic19jdXJyZW50ICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCisgICAgJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsIGFuZHJvaWRfc3R1YnNfY3VycmVudCkKKyAgZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLHN5c3RlbV9jdXJyZW50KQorICAgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWRfc3lzdGVtX3N0dWJzX2N1cnJlbnQgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKKyAgICAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9CT09UQ0xBU1NQQVRIIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywgYW5kcm9pZF9zeXN0ZW1fc3R1YnNfY3VycmVudCkKKyAgZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLHRlc3RfY3VycmVudCkKKyAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkX3Rlc3Rfc3R1YnNfY3VycmVudCAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQorICAgICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCBhbmRyb2lkX3Rlc3Rfc3R1YnNfY3VycmVudCkKKyAgZWxzZQorICAgICMgY29yZV88dmVyPiBpcyBzdWJzZXQgb2YgPHZlcj4uIEluc3RlYWQgb2YgZGVmaW5pbmcgYSBwcmVidWlsdCBsaWIgZm9yIGNvcmVfPHZlcj4sCisgICAgIyB1c2UgdGhlIHN0dWIgZm9yIDx2ZXI+IHdoZW4gYnVpbGRpbmcgZm9yIGFwcHMuCisgICAgX3ZlcnNpb24gOj0gJChwYXRzdWJzdCBjb3JlXyUsJSwkKExPQ0FMX1NES19WRVJTSU9OKSkKKyAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBzZGtfdiQoX3ZlcnNpb24pICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCisgICAgJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsIHNka192JChfdmVyc2lvbikpCisgICAgX3ZlcnNpb24gOj0KKyAgZW5kaWYKK2Vsc2UKKyAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZS1vaiBjb3JlLWxpYmFydCBleHQgZnJhbWV3b3JrICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCisgICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCBjb3JlLW9qKTokKGNhbGwgamF2YS1saWItZmlsZXMsIGNvcmUtbGliYXJ0KQorZW5kaWYgICMgTE9DQUxfU0RLX1ZFUlNJT04KK0xPQ0FMX0pBVkFfTElCUkFSSUVTIDo9ICQoc29ydCAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSkKKworZnVsbF9qYXZhX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKSAkKExPQ0FMX0NMQVNTUEFUSCkKK2Z1bGxfamF2YV9saWJfZGVwcyA6PSAkKGNhbGwgamF2YS1saWItZGVwcywkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSkgJChMT0NBTF9DTEFTU1BBVEgpCitlbmRpZiAjICFMT0NBTF9JU19IT1NUX01PRFVMRQorCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9DTEFTU1BBVEggOj0gJChzdWJzdCAkKHNwYWNlKSw6LCQoZnVsbF9qYXZhX2xpYnMpKQorJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfRE9DTEFWQV9DTEFTU1BBVEggOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvanNpbHZlciQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpOiQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2RvY2xhdmEkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKQorCitpbnRlcm1lZGlhdGVzLkNPTU1PTiA6PSAkKGNhbGwgbG9jYWwtaW50ZXJtZWRpYXRlcy1kaXIsQ09NTU9OKQorCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9TT1VSQ0VfUEFUSCA6PSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKExPQ0FMX0RST0lERE9DX1NPVVJDRV9QQVRIKSkKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0pBVkFfRklMRVMgOj0gJChmaWx0ZXIgJS5qYXZhLCQoZnVsbF9zcmNfZmlsZXMpKQorJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfSkFWQV9GSUxFUyArPSAkKGFkZHByZWZpeCAkKCQobXlfcHJlZml4KU9VVF9DT01NT05fSU5URVJNRURJQVRFUykvLCAkKGZpbHRlciAlLmphdmEsJChMT0NBTF9JTlRFUk1FRElBVEVfU09VUkNFUykpKQorJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyYworJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU1JDX0xJU1RfRklMRSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9kcm9pZGRvYy1zcmMtbGlzdAorCitpZm5lcSAoJChzdHJpcCAkKExPQ0FMX0FERElUSU9OQUxfSkFWQV9ESVIpKSwpCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9BRERJVElPTkFMX0pBVkFfRElSIDo9ICQoTE9DQUxfQURESVRJT05BTF9KQVZBX0RJUikKK2VuZGlmCisKKyMgTGlzdHMgdGhlIGlucHV0IGZpbGVzIGZvciB0aGUgZG9jIGJ1aWxkIGludG8gYSB0ZXh0IGZpbGUKKyMgc3VpdGFibGUgZm9yIHRoZSBAIHN5bnRheCBvZiBqYXZhZG9jLgorIyAkKDEpOiB0aGUgZmlsZSB0byBjcmVhdGUKKyMgJCgyKTogZmlsZXMgdG8gaW5jbHVkZQorIyAkKDMpOiBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgamF2YSBmaWxlcyBpbgorZGVmaW5lIHByZXBhcmUtZG9jLXNvdXJjZS1saXN0CiskKGhpZGUpIG1rZGlyIC1wICQoZGlyICQoMSkpCiskKGNhbGwgZHVtcC13b3Jkcy10by1maWxlLCAkKDIpLCAkKDEpKQorJChoaWRlKSBmb3IgZCBpbiAkKDMpIDsgZG8gZmluZCAkJGQgLW5hbWUgJyouamF2YScgLWFuZCAtbm90IC1uYW1lICcuKicgPj4gJCgxKSAyPiAvZGV2L251bGwgOyBkb25lIDsgdHJ1ZQorZW5kZWYKKworIyMKKyMjCisjIyBqZGlmZiBvbmx5CisjIworIyMKKworamRpZmYgOj0gXAorCSQoSE9TVF9KREtfVE9PTFNfSkFSKSBcCisJJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvamRpZmYkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKQorCitkb2NsYXZhIDo9IFwKKwkkKEhPU1RfSkRLX1RPT0xTX0pBUikgXAorCSQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2RvY2xhdmEkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKQorCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9ORVdBUEkgOj0gJChMT0NBTF9BUElESUZGX05FV0FQSSkKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX09MREFQSSA6PSAkKExPQ0FMX0FQSURJRkZfT0xEQVBJKQorJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfT1VUX0RJUiA6PSAkKG91dF9kaXIpCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9PVVRfTkVXQVBJIDo9ICQob3V0X2RpcikvY3VycmVudC54bWwKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX09VVF9PTERBUEkgOj0gJChvdXRfZGlyKS8kKG5vdGRpciAkKGJhc2VuYW1lICQoTE9DQUxfQVBJRElGRl9PTERBUEkpKSkueG1sCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9ET0NMRVRQQVRIIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2pkaWZmJChDT01NT05fSkFWQV9QQUNLQUdFX1NVRkZJWCkKKyQoZnVsbF90YXJnZXQpOiBcCisJCSQoZnVsbF9zcmNfZmlsZXMpIFwKKwkJJChmdWxsX2phdmFfbGliX2RlcHMpIFwKKwkJJChqZGlmZikgXAorCQkkKGRvY2xhdmEpIFwKKwkJJChMT0NBTF9NT0RVTEUpLWRvY3MgXAorCQkkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQorCUBlY2hvIEdlbmVyYXRpbmcgQVBJIGRpZmY6ICQoUFJJVkFURV9PVVRfRElSKQorCUBlY2hvICAgT2xkIEFQSTogJChQUklWQVRFX09MREFQSSkKKwlAZWNobyAgIE5ldyBBUEk6ICQoUFJJVkFURV9ORVdBUEkpCisJQGVjaG8gICBPbGQgWE1MOiAkKFBSSVZBVEVfT1VUX09MREFQSSkKKwlAZWNobyAgIE5ldyBYTUw6ICQoUFJJVkFURV9PVVRfTkVXQVBJKQorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJQGVjaG8gQ29udmVydGluZyBBUEkgZmlsZXMgdG8gWE1MLi4uCisJJChoaWRlKSBta2RpciAtcCAkKFBSSVZBVEVfT1VUX0RJUikKKwkkKGhpZGUpICggXAorCQkkKEpBVkEpIFwKKwkJCQkkKGFkZHByZWZpeCAtY2xhc3NwYXRoICwkKFBSSVZBVEVfQ0xBU1NQQVRIKTokKFBSSVZBVEVfRE9DTEFWQV9DTEFTU1BBVEgpOiQoUFJJVkFURV9CT09UQ0xBU1NQQVRIKTokKEhPU1RfSkRLX1RPT0xTX0pBUikpIFwKKwkJCQljb20uZ29vZ2xlLmRvY2xhdmEuYXBpY2hlY2suQXBpQ2hlY2sgXAorCQkJCS1jb252ZXJ0MnhtbCBcCisJCQkJCSQoYmFzZW5hbWUgJChQUklWQVRFX05FV0FQSSkpLnR4dCBcCisJCQkJCSQoYmFzZW5hbWUgJChQUklWQVRFX09VVF9ORVdBUEkpKS54bWwgXAorCSkgfHwgKHJtIC1yZiAkKFBSSVZBVEVfT1VUX0RJUikgJChQUklWQVRFX1NSQ19MSVNUX0ZJTEUpOyBleGl0IDQ1KQorCSQoaGlkZSkgKCBcCisJCSQoSkFWQSkgXAorCQkJCSQoYWRkcHJlZml4IC1jbGFzc3BhdGggLCQoUFJJVkFURV9DTEFTU1BBVEgpOiQoUFJJVkFURV9ET0NMQVZBX0NMQVNTUEFUSCk6JChQUklWQVRFX0JPT1RDTEFTU1BBVEgpOiQoSE9TVF9KREtfVE9PTFNfSkFSKSkgXAorCQkJCWNvbS5nb29nbGUuZG9jbGF2YS5hcGljaGVjay5BcGlDaGVjayBcCisJCQkJLWNvbnZlcnQyeG1sIFwKKwkJCQkJJChiYXNlbmFtZSAkKFBSSVZBVEVfT0xEQVBJKSkudHh0IFwKKwkJCQkJJChiYXNlbmFtZSAkKFBSSVZBVEVfT1VUX09MREFQSSkpLnhtbCBcCisJKSB8fCAocm0gLXJmICQoUFJJVkFURV9PVVRfRElSKSAkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSk7IGV4aXQgNDUpCisJQGVjaG8gUnVubmluZyBKRGlmZi4uLgorCSQoY2FsbCBwcmVwYXJlLWRvYy1zb3VyY2UtbGlzdCwkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSksJChQUklWQVRFX0pBVkFfRklMRVMpLCBcCisJCQkkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAkKFBSSVZBVEVfQURESVRJT05BTF9KQVZBX0RJUikpCisJJChoaWRlKSAoIFwKKwkJJChKQVZBRE9DKSBcCisJCQkJLWVuY29kaW5nIFVURi04IFwKKwkJCQlcQCQoUFJJVkFURV9TUkNfTElTVF9GSUxFKSBcCisJCQkJLUotWG14MTYwMG0gXAorCQkJCS1YRGlnbm9yZS5zeW1ib2wuZmlsZSBcCisJCQkJLXF1aWV0IFwKKwkJCQktZG9jbGV0IGpkaWZmLkpEaWZmIFwKKwkJCQktZG9jbGV0cGF0aCAkKFBSSVZBVEVfRE9DTEVUUEFUSCkgXAorCQkJCSQoYWRkcHJlZml4IC1ib290Y2xhc3NwYXRoICwkKFBSSVZBVEVfQk9PVENMQVNTUEFUSCkpIFwKKwkJCQkkKGFkZHByZWZpeCAtY2xhc3NwYXRoICwkKFBSSVZBVEVfQ0xBU1NQQVRIKSkgXAorCQkJCS1zb3VyY2VwYXRoICQoUFJJVkFURV9TT1VSQ0VfUEFUSCkkKGFkZHByZWZpeCA6LCQoUFJJVkFURV9DTEFTU1BBVEgpKSBcCisJCQkJLWQgJChQUklWQVRFX09VVF9ESVIpIFwKKwkJCQktbmV3YXBpICQobm90ZGlyICQoYmFzZW5hbWUgJChQUklWQVRFX09VVF9ORVdBUEkpKSkgXAorCQkJCS1uZXdhcGlkaXIgJChkaXIgJChQUklWQVRFX09VVF9ORVdBUEkpKSBcCisJCQkJLW9sZGFwaSAkKG5vdGRpciAkKGJhc2VuYW1lICQoUFJJVkFURV9PVVRfT0xEQVBJKSkpIFwKKwkJCQktb2xkYXBpZGlyICQoZGlyICQoUFJJVkFURV9PVVRfT0xEQVBJKSkgXAorCQkJCS1qYXZhZG9jbmV3IC4uLy4uLy4uL3JlZmVyZW5jZS8gXAorCQkmJiB0b3VjaCAtZiAkQCBcCisJKSB8fCAocm0gLXJmICQoUFJJVkFURV9PVVRfRElSKSAkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSk7IGV4aXQgNDUpCisKK0FMTF9ET0NTICs9ICQoZnVsbF90YXJnZXQpCisKKy5QSE9OWTogJChMT0NBTF9NT0RVTEUpLWRpZmYKKyQoTE9DQUxfTU9EVUxFKS1kaWZmIDogJChmdWxsX3RhcmdldCkKZGlmZiAtLWdpdCBhL2NvcmUvYXV0b2dlbl90ZXN0X2NvbmZpZy5tayBiL2NvcmUvYXV0b2dlbl90ZXN0X2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU5YmFjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9hdXRvZ2VuX3Rlc3RfY29uZmlnLm1rCkBAIC0wLDAgKzEsNjQgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVGhpcyBidWlsZCBydWxlIGFsbG93cyBUcmFkZUZlZCB0ZXN0IGNvbmZpZyBmaWxlIHRvIGJlIGNyZWF0ZWQgYmFzZWQgb24KKyMgZm9sbG93aW5nIGlucHV0czoKKyMgICBpc19uYXRpdmU6IElmIHRoZSB0ZXN0IGlzIGEgbmF0aXZlIHRlc3QuCisjICAgTE9DQUxfTUFOSUZFU1RfRklMRTogTmFtZSBvZiB0aGUgQW5kcm9pZE1hbmlmZXN0IGZpbGUgZm9yIHRoZSB0ZXN0LiBJZiBpdCdzCisjICAgICAgIG5vdCBzZXQsIGRlZmF1bHQgdmFsdWUgYEFuZHJvaWRNYW5pZmVzdC54bWxgIHdpbGwgYmUgdXNlZC4KKyMgT3V0cHV0OgorIyAgIGF1dG9nZW5fdGVzdF9jb25maWdfZmlsZTogUGF0aCB0byB0aGUgdGVzdCBjb25maWcgZmlsZSBnZW5lcmF0ZWQuCisKK2F1dG9nZW5fdGVzdF9jb25maWdfZmlsZSA6PSAkKGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpJChMT0NBTF9NT0RVTEUpLmNvbmZpZworaWZlcSAodHJ1ZSwkKGlzX25hdGl2ZSkpCisjIEF1dG8gZ2VuZXJhdGluZyB0ZXN0IGNvbmZpZyBmaWxlIGZvciBuYXRpdmUgdGVzdAorJChhdXRvZ2VuX3Rlc3RfY29uZmlnX2ZpbGUpIDogJChOQVRJVkVfVEVTVF9DT05GSUdfVEVNUExBVEUpCisJQGVjaG8gIkF1dG8gZ2VuZXJhdGluZyB0ZXN0IGNvbmZpZyAkKG5vdGRpciAkQCkiCisJJChoaWRlKSBzZWQgJ3Mme01PRFVMRX0mJChQUklWQVRFX01PRFVMRSkmZycgJF4gPiAkQAorbXlfYXV0b19nZW5lcmF0ZV9jb25maWcgOj0gdHJ1ZQorZWxzZQorIyBBdXRvIGdlbmVyYXRpbmcgdGVzdCBjb25maWcgZmlsZSBmb3IgaW5zdHJ1bWVudGF0aW9uIHRlc3QKK2lmZXEgKCQoc3RyaXAgJChMT0NBTF9NQU5JRkVTVF9GSUxFKSksKQorICBMT0NBTF9NQU5JRkVTVF9GSUxFIDo9IEFuZHJvaWRNYW5pZmVzdC54bWwKK2VuZGlmCitpZmRlZiBMT0NBTF9GVUxMX01BTklGRVNUX0ZJTEUKKyAgbXlfYW5kcm9pZF9tYW5pZmVzdCA6PSAkKExPQ0FMX0ZVTExfTUFOSUZFU1RfRklMRSkKK2Vsc2UKKyAgbXlfYW5kcm9pZF9tYW5pZmVzdCA6PSAkKExPQ0FMX1BBVEgpLyQoTE9DQUxfTUFOSUZFU1RfRklMRSkKK2VuZGlmCitpZm5lcSAoLCQod2lsZGNhcmQgJChteV9hbmRyb2lkX21hbmlmZXN0KSkpCiskKGF1dG9nZW5fdGVzdF9jb25maWdfZmlsZSk6IFBSSVZBVEVfQVVUT0dFTl9URVNUX0NPTkZJR19TQ1JJUFQgOj0gJChBVVRPR0VOX1RFU1RfQ09ORklHX1NDUklQVCkKKyQoYXV0b2dlbl90ZXN0X2NvbmZpZ19maWxlKTogUFJJVkFURV9URVNUX0NPTkZJR19BTkRST0lEX01BTklGRVNUIDo9ICQobXlfYW5kcm9pZF9tYW5pZmVzdCkKKyQoYXV0b2dlbl90ZXN0X2NvbmZpZ19maWxlKTogUFJJVkFURV9FTVBUWV9URVNUX0NPTkZJRyA6PSAkKEVNUFRZX1RFU1RfQ09ORklHKQorJChhdXRvZ2VuX3Rlc3RfY29uZmlnX2ZpbGUpOiBQUklWQVRFX1RFTVBMQVRFIDo9ICQoSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHX1RFTVBMQVRFKQorJChhdXRvZ2VuX3Rlc3RfY29uZmlnX2ZpbGUpIDogJChteV9hbmRyb2lkX21hbmlmZXN0KSAkKEVNUFRZX1RFU1RfQ09ORklHKSAkKElOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURSkgJChBVVRPR0VOX1RFU1RfQ09ORklHX1NDUklQVCkKKwlAZWNobyAiQXV0byBnZW5lcmF0aW5nIHRlc3QgY29uZmlnICQobm90ZGlyICRAKSIKKwlAcm0gLWYgJEAKKwkkKGhpZGUpICQoUFJJVkFURV9BVVRPR0VOX1RFU1RfQ09ORklHX1NDUklQVCkgJEAgJChQUklWQVRFX1RFU1RfQ09ORklHX0FORFJPSURfTUFOSUZFU1QpICQoUFJJVkFURV9FTVBUWV9URVNUX0NPTkZJRykgJChQUklWQVRFX1RFTVBMQVRFKQorbXlfYXV0b19nZW5lcmF0ZV9jb25maWcgOj0gdHJ1ZQorZW5kaWYgIyBpZmVxICgsJCh3aWxkY2FyZCAkKG15X2FuZHJvaWRfbWFuaWZlc3QpKSkKK2VuZGlmICMgaWZuZXEgKHRydWUsJChpc19uYXRpdmUpKQorCitpZmVxICh0cnVlLCQobXlfYXV0b19nZW5lcmF0ZV9jb25maWcpKQorICBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSAkKGF1dG9nZW5fdGVzdF9jb25maWdfZmlsZSkKKyAgJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGF1dG9nZW5fdGVzdF9jb25maWdfZmlsZSkKKyAgQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5hdXRvX3Rlc3RfY29uZmlnIDo9IHRydWUKK2Vsc2UKKyAgYXV0b2dlbl90ZXN0X2NvbmZpZ19maWxlIDo9CitlbmRpZgorCitteV9hbmRyb2lkX21hbmlmZXN0IDo9CitteV9hdXRvX2dlbmVyYXRlX2NvbmZpZyA6PQpkaWZmIC0tZ2l0IGEvY29yZS9hdXhfY29uZmlnLm1rIGIvY29yZS9hdXhfY29uZmlnLm1rCmluZGV4IGM0MGI4Y2MuLjZhNWNkNjMgMTAwNjQ0Ci0tLSBhL2NvcmUvYXV4X2NvbmZpZy5taworKysgYi9jb3JlL2F1eF9jb25maWcubWsKQEAgLTMyLDcgKzMyLDcgQEAKIAogIyBzZXR1cCBBVVggZ2xvYmFscwogQVVYX1NITElCX1NVRkZJWCA6PSAuc28KLUFVWF9HTE9CQUxfQVJGTEFHUyA6PSBjcnNQRAorQVVYX0dMT0JBTF9BUkZMQUdTIDo9IGNxc0QKIEFVWF9TVEFUSUNfTElCX1NVRkZJWCA6PSAuYQogCiAjIExvYWQgZXZlci1sYXN0aW5nICJpbmRleGVkIiB2ZXJzaW9uIG9mIEFVWCB2YXJpYW50IGVudmlyb25tZW50OyBpdCBpcyB0cmVhdGVkIGFzIFJFQUQtT05MWSBmcm9tIHRoaXMKQEAgLTEwMiwxMCArMTAyLDEwIEBACiAkKGV2YWwgQVVYX09TX1ZBUklBTlRfTElTVF8kKEFVWF9PU18kKDEpKTo9KSBcCiAkKGNhbGwgYXV4LXZhcmlhbnQtc2V0dXAtcGF0aHMsJChfbmFtZSkpIFwKICQoZXZhbCBBVVhfQUxMX1ZBUklBTlRTICs9ICQoX25hbWUpKSBcCi0kKGV2YWwgQVVYX0FMTF9PU0VTIDo9ICQoZmlsdGVyb3V0ICQoQVVYX09TXyQoX25hbWUpKSwkKEFVWF9BTExfT1NFUykpICQoQVVYX09TXyQoX25hbWUpKSkgXAotJChldmFsIEFVWF9BTExfQ1BVUyA6PSAkKGZpbHRlcm91dCAkKEFVWF9DUFVfJChfbmFtZSkpLCQoQVVYX0FMTF9DUFVTKSkgJChBVVhfQ1BVXyQoX25hbWUpKSkgXAotJChldmFsIEFVWF9BTExfQVJDSFMgOj0gJChmaWx0ZXJvdXQgJChBVVhfQVJDSF8kKF9uYW1lKSksJChBVVhfQUxMX0FSQ0hTKSkgJChBVVhfQVJDSF8kKF9uYW1lKSkpIFwKLSQoZXZhbCBBVVhfQUxMX1NVQkFSQ0hTIDo9ICQoZmlsdGVyb3V0ICQoQVVYX1NVQkFSQ0hfJChfbmFtZSkpLCQoQVVYX0FMTF9TVUJBUkNIUykpICQoQVVYX1NVQkFSQ0hfJChfbmFtZSkpKQorJChldmFsIEFVWF9BTExfT1NFUyA6PSAkKGZpbHRlci1vdXQgJChBVVhfT1NfJChfbmFtZSkpLCQoQVVYX0FMTF9PU0VTKSkgJChBVVhfT1NfJChfbmFtZSkpKSBcCiskKGV2YWwgQVVYX0FMTF9DUFVTIDo9ICQoZmlsdGVyLW91dCAkKEFVWF9DUFVfJChfbmFtZSkpLCQoQVVYX0FMTF9DUFVTKSkgJChBVVhfQ1BVXyQoX25hbWUpKSkgXAorJChldmFsIEFVWF9BTExfQVJDSFMgOj0gJChmaWx0ZXItb3V0ICQoQVVYX0FSQ0hfJChfbmFtZSkpLCQoQVVYX0FMTF9BUkNIUykpICQoQVVYX0FSQ0hfJChfbmFtZSkpKSBcCiskKGV2YWwgQVVYX0FMTF9TVUJBUkNIUyA6PSAkKGZpbHRlci1vdXQgJChBVVhfU1VCQVJDSF8kKF9uYW1lKSksJChBVVhfQUxMX1NVQkFSQ0hTKSkgJChBVVhfU1VCQVJDSF8kKF9uYW1lKSkpCiBlbmRlZgogCiAjIExvYWQgc3lzdGVtIGNvbmZpZ3VyYXRpb24gcmVmZXJlbmNlZCBieSBBVVggdmFyaWFudCBjb25maWc7CkBAIC0xMzgsNyArMTM4LDcgQEAKICQoZXZhbCBfYWxsOj0pIFwKICQoZXZhbCBfcmVxOj0kKGFkZHN1ZmZpeCBfJCgxKSwkKGF1eF9lbnYpKSkgXAogJChmb3JlYWNoIHZhciwkKF9yZXEpLCQoZXZhbCBfYWxsICs9ICQodmFyKSkpIFwKLSQoZXZhbCBfbWlzc2luZyA6PSAkKGZpbHRlcm91dCAkKF9hbGwpLCQoX3JlcSkpKSBcCiskKGV2YWwgX21pc3NpbmcgOj0gJChmaWx0ZXItb3V0ICQoX2FsbCksJChfcmVxKSkpIFwKICQoaWYgJChfbWlzc2luZyksJChlcnJvciBBVVggdmFyaWFudCAkKDEpIG11c3QgZGVmaW5lIHZhcnM6ICQoX21pc3NpbmcpKSkKIGVuZGVmCiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogY29uZmlnX3Jvb3RzIDo9ICQod2lsZGNhcmQgZGV2aWNlIHZlbmRvcikKIGFsbF9jb25maWdzIDo9CiBpZmRlZiBjb25maWdfcm9vdHMKLWFsbF9jb25maWdzIDo9ICQoc2hlbGwgZmluZCAkKGNvbmZpZ19yb290cykgLW1heGRlcHRoIDQgLW5hbWUgJyokKHZhcmlhbnRfc2Z4KScgLW8gLW5hbWUgJyokKG9zX3NmeCknIHwgc29ydCkKK2FsbF9jb25maWdzIDo9ICQoc29ydCAkKHNoZWxsIGZpbmQgJChjb25maWdfcm9vdHMpIC1tYXhkZXB0aCA0IC1uYW1lICcqJCh2YXJpYW50X3NmeCknIC1vIC1uYW1lICcqJChvc19zZngpJykpCiBlbmRpZgogYWxsX29zX2NvbmZpZ3MgOj0gJChmaWx0ZXIgJSQob3Nfc2Z4KSwkKGFsbF9jb25maWdzKSkKIGFsbF92YXJpYW50X2NvbmZpZ3MgOj0gJChmaWx0ZXIgJSQodmFyaWFudF9zZngpLCQoYWxsX2NvbmZpZ3MpKQpkaWZmIC0tZ2l0IGEvY29yZS9iYXNlX3J1bGVzLm1rIGIvY29yZS9iYXNlX3J1bGVzLm1rCmluZGV4IDA3ZDFjZDkuLmZmNDg5MzAgMTAwNjQ0Ci0tLSBhL2NvcmUvYmFzZV9ydWxlcy5taworKysgYi9jb3JlL2Jhc2VfcnVsZXMubWsKQEAgLTY1LDYgKzY1LDE4IEBACiAgIG15X2hvc3RfY3Jvc3MgOj0KIGVuZGlmCiAKK19wYXRoIDo9ICQoTE9DQUxfTU9EVUxFX1BBVEgpICQoTE9DQUxfTU9EVUxFX1BBVEhfMzIpICQoTE9DQUxfTU9EVUxFX1BBVEhfNjQpCitpZm5lcSAoJChmaWx0ZXIgJChUQVJHRVRfT1VUX1ZFTkRPUiklLCQoX3BhdGgpKSwpCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK2Vsc2UgaWZuZXEgKCQoZmlsdGVyICQoVEFSR0VUX09VVF9PRU0pLyUsJChfcGF0aCkpLCkKK0xPQ0FMX09FTV9NT0RVTEUgOj0gdHJ1ZQorZWxzZSBpZm5lcSAoJChmaWx0ZXIgJChUQVJHRVRfT1VUX09ETSkvJSwkKF9wYXRoKSksKQorTE9DQUxfT0RNX01PRFVMRSA6PSB0cnVlCitlbHNlIGlmbmVxICgkKGZpbHRlciAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvJSwkKF9wYXRoKSksKQorTE9DQUxfUFJPRFVDVF9NT0RVTEUgOj0gdHJ1ZQorZW5kaWYKK19wYXRoIDo9CisKIGlmbmRlZiBMT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUKICAgTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9ICQoTE9DQUxfVkVORE9SX01PRFVMRSkKIGVuZGlmCkBAIC03Niw2ICs4OCw3IEBACiBlbmRpZgogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9sb2NhbF92bmRrLm1rCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9sb2NhbF9zeXN0ZW1zZGsubWsKIAogbXlfbW9kdWxlX3RhZ3MgOj0gJChMT0NBTF9NT0RVTEVfVEFHUykKIGlmZXEgKCQobXlfaG9zdF9jcm9zcyksdHJ1ZSkKQEAgLTk2LDYgKzEwOSwxMyBAQAogIyBiYXNlX3J1bGVzLm1rLCBidXQgaXQgd2lsbCBmaXggdGhlIG1vc3QgY29tbW9uIG9uZXMuCiBMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKGZpbHRlci1vdXQgJS5taywkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSkKIAorbXlfYmFkX2RlcHMgOj0gJChzdHJpcCAkKGZvcmVhY2ggZGVwLCQoZmlsdGVyLW91dCB8IHx8LCQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpKSxcCisgICAgICAgICAgICAgICAgICQoaWYgJChmaW5kc3RyaW5nIC8sJChkZXApKSwsJChkZXApKSkpCitpZm5lcSAoJChteV9iYWRfZGVwcyksKQorJChjYWxsIHByZXR0eS13YXJuaW5nLCJCYWQgTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVM6ICQobXlfYmFkX2RlcHMpIikKKyQoY2FsbCBwcmV0dHktZXJyb3IsIkxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIG11c3Qgb25seSBjb250YWluIHBhdGhzIChub3QgbW9kdWxlIG5hbWVzKSIpCitlbmRpZgorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgVmFsaWRhdGUgYW5kIGRlZmluZSBmYWxsYmFja3MgZm9yIGlucHV0IExPQ0FMXyogdmFyaWFibGVzLgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTEzMSw3ICsxNTEsNyBAQAogIyBtYWtlZmlsZXMuIEFueXRoaW5nIGVsc2UgaXMgZWl0aGVyIGEgdHlwbyBvciBhIHNvdXJjZSBvZiB1bmV4cGVjdGVkCiAjIGJlaGF2aW9ycy4KIGlmbmVxICgkKGZpbHRlci1vdXQgZGVidWcgZW5nIHRlc3RzIG9wdGlvbmFsIHNhbXBsZXMsJChteV9tb2R1bGVfdGFncykpLCkKLSQoY2FsbCBwcmV0dHktd2FybmluZyx1bnVzdWFsIHRhZ3MgJChteV9tb2R1bGVfdGFncykpCiskKGNhbGwgcHJldHR5LWVycm9yLHVudXN1YWwgdGFnczogJChmaWx0ZXItb3V0IGRlYnVnIGVuZyB0ZXN0cyBvcHRpb25hbCBzYW1wbGVzLCQobXlfbW9kdWxlX3RhZ3MpKSkKIGVuZGlmCiAKICMgQWRkIGltcGxpY2l0IHRhZ3MuCkBAIC0xODIsNiArMjAyLDggQEAKICAgcGFydGl0aW9uX3RhZyA6PSBfT0VNCiBlbHNlIGlmZXEgKHRydWUsJChMT0NBTF9PRE1fTU9EVUxFKSkKICAgcGFydGl0aW9uX3RhZyA6PSBfT0RNCitlbHNlIGlmZXEgKHRydWUsJChMT0NBTF9QUk9EVUNUX01PRFVMRSkpCisgIHBhcnRpdGlvbl90YWcgOj0gX1BST0RVQ1QKIGVsc2UgaWZlcSAoTkFUSVZFX1RFU1RTLCQoTE9DQUxfTU9EVUxFX0NMQVNTKSkKICAgcGFydGl0aW9uX3RhZyA6PSBfREFUQQogZWxzZQpAQCAtNDQzLDYgKzQ2NSw0NyBAQAogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIFRlc3QgRGF0YQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK215X3Rlc3RfZGF0YV9wYWlycyA6PQorbXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSA6PQorIyBTb3VyY2UgdG8gcmVsYXRpdmUgZHN0IGZpbGUgcGF0aHMgZm9yIHJldXNlIGluIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUuCitteV90ZXN0X2RhdGFfZmlsZV9wYWlycyA6PQorCitpZm5lcSAoJChmaWx0ZXIgTkFUSVZFX1RFU1RTLCQoTE9DQUxfTU9EVUxFX0NMQVNTKSksKQoraWZuZXEgKCQoc3RyaXAgJChMT0NBTF9URVNUX0RBVEEpKSwpCitpZm5lcSAodHJ1ZSwkKExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFKSkKKworbXlfdGVzdF9kYXRhX3BhaXJzIDo9ICQoc3RyaXAgJChmb3JlYWNoIHRkLCQoTE9DQUxfVEVTVF9EQVRBKSwgXAorICAgICQoZXZhbCBfZmlsZSA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCQodGQpKSkgXAorICAgICQoaWYgJChfZmlsZSksIFwKKyAgICAgICQoZXZhbCBfc3JjX2Jhc2UgOj0gJChjYWxsIHdvcmQtY29sb24sMSwkKHRkKSkpLCBcCisgICAgICAkKGV2YWwgX3NyY19iYXNlIDo9ICQoTE9DQUxfUEFUSCkpIFwKKyAgICAgICAgJChldmFsIF9maWxlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDEsJCh0ZCkpKSkgXAorICAgICQoaWYgJChmaW5kc3RyaW5nIC4uLCQoX2ZpbGUpKSwkKGVycm9yICQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKTogTE9DQUxfVEVTVF9EQVRBIG1heSBub3QgaW5jbHVkZSAnLi4nOiAkKF9maWxlKSkpIFwKKyAgICAkKGlmICQoZmlsdGVyIC8lLCQoX3NyY19iYXNlKSAkKF9maWxlKSksJChlcnJvciAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6IExPQ0FMX1RFU1RfREFUQSBtYXkgbm90IGluY2x1ZGUgYWJzb2x1dGUgcGF0aHM6ICQoX3NyY19iYXNlKSAkKF9maWxlKSkpIFwKKyAgICAkKGV2YWwgbXlfdGVzdF9kYXRhX2ZpbGVfcGFpcnMgOj0gJChteV90ZXN0X2RhdGFfZmlsZV9wYWlycykgJChjYWxsIGFwcGVuZC1wYXRoLCQoX3NyY19iYXNlKSwkKF9maWxlKSk6JChfZmlsZSkpIFwKKyAgICAkKGNhbGwgYXBwZW5kLXBhdGgsJChfc3JjX2Jhc2UpLCQoX2ZpbGUpKTokKGNhbGwgYXBwZW5kLXBhdGgsJChteV9tb2R1bGVfcGF0aCksJChfZmlsZSkpKSkKKworbXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobXlfdGVzdF9kYXRhX3BhaXJzKSkKKyQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6ICQobXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSkKKworZW5kaWYKK2VuZGlmCitlbmRpZgorCisjIEZvciBtb2R1bGVzIHRhZ2dlZCBhcyB0ZXN0cyBidXQgbGFja2luZyBhIHN1aXRlIHRhZywgc2V0IG51bGwtc3VpdGUgYXMgdGhlIGRlZmF1bHQuCisjIFdlIG9ubHkgc3VwcG9ydCBhZGRpbmcgYSBkZWZhdWx0IHN1aXRlIHRvIG5hdGl2ZSB0ZXN0cywgbmF0aXZlIGJlbmNobWFya3MsIGFuZCBpbnN0cnVtZW50YXRpb24gdGVzdHMuCisjIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGFyZSB0aGUgb25seSB0ZXN0cyB3ZSBjdXJyZW50bHkgYXV0by1nZW5lcmF0ZSB0ZXN0IGNvbmZpZ3MgZm9yLgoraWZuZXEgKCQoZmlsdGVyICQobXlfbW9kdWxlX3RhZ3MpLHRlc3RzKSwpCitpZm5kZWYgTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURQoraWZuZXEgKCQoZmlsdGVyIE5BVElWRV9URVNUUyBOQVRJVkVfQkVOQ0hNQVJLIEFQUFMsICQoTE9DQUxfTU9EVUxFX0NMQVNTKSksKQorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBudWxsLXN1aXRlCitlbmRpZgorZW5kaWYKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBDb21wYXRpYmlsaXR5IHN1aXRlIGZpbGVzLgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGlmZGVmIExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUKQEAgLTQ1MSwxOSArNTE0LDIyIEBACiAjIHNlcGFyYXRlIHRoZSBtdWx0aXBsZSBhcmNoaXRlY3R1cmVzIGludG8gc3ViZGlyZWN0b3JpZXMgb2YgdGhlIHRlc3RjYXNlIGZvbGRlci4KIGFyY2hfZGlyIDo9CiBpc19uYXRpdmUgOj0KK211bHRpX2FyY2ggOj0KIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSxOQVRJVkVfVEVTVFMpCiAgIGlzX25hdGl2ZSA6PSB0cnVlCisgIG11bHRpX2FyY2ggOj0gdHJ1ZQogZW5kaWYKIGlmZXEgKCQoTE9DQUxfTU9EVUxFX0NMQVNTKSxOQVRJVkVfQkVOQ0hNQVJLKQogICBpc19uYXRpdmUgOj0gdHJ1ZQorICBtdWx0aV9hcmNoIDo9IHRydWUKIGVuZGlmCiBpZmRlZiBMT0NBTF9NVUxUSUxJQgotICBpc19uYXRpdmUgOj0gdHJ1ZQorICBtdWx0aV9hcmNoIDo9IHRydWUKIGVuZGlmCi1pZmRlZiBpc19uYXRpdmUKK2lmZGVmIG11bHRpX2FyY2gKICAgYXJjaF9kaXIgOj0gLyQoJChteV9wcmVmaXgpJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpCi0gIGlzX25hdGl2ZSA6PQogZW5kaWYKK211bHRpX2FyY2ggOj0KIAogIyBUaGUgbW9kdWxlIGl0c2VsZi4KICQoZm9yZWFjaCBzdWl0ZSwgJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSwgXApAQCAtNDgzLDEzICs1NDksNDQgQEAKICAgICAkKGZvcmVhY2ggZGlyLCAkKGNhbGwgY29tcGF0aWJpbGl0eV9zdWl0ZV9kaXJzLCQoc3VpdGUpKSwgXAogICAgICAgJChzKTokKGRpcikvJChuKSkpKSkKIAordGVzdF9jb25maWcgOj0gJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL0FuZHJvaWRUZXN0LnhtbCkKK2lmZXEgKCwkKHRlc3RfY29uZmlnKSkKKyAgaWZuZXEgKHRydWUsJChpc19uYXRpdmUpKQorICAgIGlzX2luc3RydW1lbnRhdGlvbl90ZXN0IDo9IHRydWUKKyAgICBpZmVxICh0cnVlLCAkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSkKKyAgICAgIGlzX2luc3RydW1lbnRhdGlvbl90ZXN0IDo9IGZhbHNlCisgICAgZW5kaWYKKyAgICAjIElmIExPQ0FMX01PRFVMRV9DTEFTUyBpcyBub3QgQVBQUywgaXQncyBjZXJ0YWlubHkgbm90IGFuIGluc3RydW1lbnRhdGlvbgorICAgICMgdGVzdC4gSG93ZXZlciwgc29tZSBwYWNrYWdlcyBmb3IgdGVzdCBkYXRhIGFsc28gaGF2ZSBMT0NBTF9NT0RVTEVfQ0xBU1MKKyAgICAjIHNldCB0byBBUFBTLiBUaGVzZSB3aWxsIHJlcXVpcmUgZmxhZyBMT0NBTF9ESVNBQkxFX0FVVE9fR0VORVJBVEVfVEVTVF9DT05GSUcKKyAgICAjIHRvIGRpc2FibGUgYXV0by1nZW5lcmF0aW5nIHRlc3QgY29uZmlnIGZpbGUuCisgICAgaWZuZXEgKEFQUFMsICQoTE9DQUxfTU9EVUxFX0NMQVNTKSkKKyAgICAgIGlzX2luc3RydW1lbnRhdGlvbl90ZXN0IDo9IGZhbHNlCisgICAgZW5kaWYKKyAgZW5kaWYKKyAgIyBDVFMgbW9kdWxlcyBjYW4gYmUgdXNlZCBmb3IgdGVzdCBkYXRhLCBzbyB0ZXN0IGNvbmZpZyBmaWxlcyBtdXN0IGJlCisgICMgZXhwbGljaXRseSBjcmVhdGVkIHVzaW5nIEFuZHJvaWRUZXN0LnhtbAorICBpZmVxICgsJChmaWx0ZXIgY3RzLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpKSkKKyAgICBpZm5lcSAodHJ1ZSwgJChMT0NBTF9ESVNBQkxFX0FVVE9fR0VORVJBVEVfVEVTVF9DT05GSUcpKQorICAgICAgaWZlcSAodHJ1ZSwgJChmaWx0ZXIgdHJ1ZSwkKGlzX25hdGl2ZSkgJChpc19pbnN0cnVtZW50YXRpb25fdGVzdCkpKQorICAgICAgICBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9hdXRvZ2VuX3Rlc3RfY29uZmlnLm1rCisgICAgICAgIHRlc3RfY29uZmlnIDo9ICQoYXV0b2dlbl90ZXN0X2NvbmZpZ19maWxlKQorICAgICAgICBhdXRvZ2VuX3Rlc3RfY29uZmlnX2ZpbGUgOj0KKyAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGlmCiAKLWlmbmVxICgsJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL0FuZHJvaWRUZXN0LnhtbCkpCitpc19pbnN0cnVtZW50YXRpb25fdGVzdCA6PQorCitpZm5lcSAoLCQodGVzdF9jb25maWcpKQogJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCiAgICQoZXZhbCBteV9jb21wYXRfZGlzdF8kKHN1aXRlKSArPSAkKGZvcmVhY2ggZGlyLCAkKGNhbGwgY29tcGF0aWJpbGl0eV9zdWl0ZV9kaXJzLCQoc3VpdGUpKSwgXAotICAgICQoTE9DQUxfUEFUSCkvQW5kcm9pZFRlc3QueG1sOiQoZGlyKS8kKExPQ0FMX01PRFVMRSkuY29uZmlnKSkpCisgICAgJCh0ZXN0X2NvbmZpZyk6JChkaXIpLyQoTE9DQUxfTU9EVUxFKS5jb25maWcpKSkKIGVuZGlmCiAKK3Rlc3RfY29uZmlnIDo9CisKIGlmbmVxICgsJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpL0R5bmFtaWNDb25maWcueG1sKSkKICQoZm9yZWFjaCBzdWl0ZSwgJChMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFKSwgXAogICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfJChzdWl0ZSkgKz0gJChmb3JlYWNoIGRpciwgJChjYWxsIGNvbXBhdGliaWxpdHlfc3VpdGVfZGlycywkKHN1aXRlKSksIFwKQEAgLTUwNCwzOCArNjAxLDI0IEBACiBlbmRpZgogZW5kaWYgIyAkKG15X3ByZWZpeCkkKExPQ0FMX01PRFVMRV9DTEFTUylfJChMT0NBTF9NT0RVTEUpX2NvbXBhdF9maWxlcwogCitpZm5lcSAoJChteV90ZXN0X2RhdGFfZmlsZV9wYWlycyksKQorJChmb3JlYWNoIHBhaXIsICQobXlfdGVzdF9kYXRhX2ZpbGVfcGFpcnMpLCBcCisgICQoZXZhbCBwYXJ0cyA6PSAkKHN1YnN0IDosJChzcGFjZSksJChwYWlyKSkpIFwKKyAgJChldmFsIHNyY19wYXRoIDo9ICQod29yZCAxLCQocGFydHMpKSkgXAorICAkKGV2YWwgZmlsZSA6PSAkKHdvcmQgMiwkKHBhcnRzKSkpIFwKKyAgJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCisgICAgJChldmFsIG15X2NvbXBhdF9kaXN0XyQoc3VpdGUpICs9ICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSksJChhcmNoX2RpcikpLCBcCisgICAgICAkKHNyY19wYXRoKTokKGNhbGwgYXBwZW5kLXBhdGgsJChkaXIpLCQoZmlsZSkpKSkpKQorZW5kaWYKKworYXJjaF9kaXIgOj0KK2lzX25hdGl2ZSA6PQorCiAkKGNhbGwgY3JlYXRlLXN1aXRlLWRlcGVuZGVuY2llcykKIAogZW5kaWYgICMgTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgVGVzdCBEYXRhCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotbXlfdGVzdF9kYXRhX3BhaXJzIDo9Ci1teV9pbnN0YWxsZWRfdGVzdF9kYXRhIDo9Ci0KLWlmbmVxICgkKGZpbHRlciBOQVRJVkVfVEVTVFMsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSwpCi1pZm5lcSAoJChzdHJpcCAkKExPQ0FMX1RFU1RfREFUQSkpLCkKLWlmbmVxICh0cnVlLCQoTE9DQUxfVU5JTlNUQUxMQUJMRV9NT0RVTEUpKQotCi1teV90ZXN0X2RhdGFfcGFpcnMgOj0gJChzdHJpcCAkKGZvcmVhY2ggdGQsJChMT0NBTF9URVNUX0RBVEEpLCBcCi0gICAgJChldmFsIF9maWxlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDIsJCh0ZCkpKSBcCi0gICAgJChpZiAkKF9maWxlKSwgXAotICAgICAgJChldmFsIF9iYXNlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDEsJCh0ZCkpKSwgXAotICAgICAgJChldmFsIF9iYXNlIDo9ICQoTE9DQUxfUEFUSCkpIFwKLSAgICAgICAgJChldmFsIF9maWxlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDEsJCh0ZCkpKSkgXAotICAgICQoaWYgJChmaW5kc3RyaW5nIC4uLCQoX2ZpbGUpKSwkKGVycm9yICQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKTogTE9DQUxfVEVTVF9EQVRBIG1heSBub3QgaW5jbHVkZSAnLi4nOiAkKF9maWxlKSkpIFwKLSAgICAkKGlmICQoZmlsdGVyIC8lLCQoX2Jhc2UpICQoX2ZpbGUpKSwkKGVycm9yICQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKTogTE9DQUxfVEVTVF9EQVRBIG1heSBub3QgaW5jbHVkZSBhYnNvbHV0ZSBwYXRoczogJChfYmFzZSkgJChfZmlsZSkpKSBcCi0gICAgJChjYWxsIGFwcGVuZC1wYXRoLCQoX2Jhc2UpLCQoX2ZpbGUpKTokKGNhbGwgYXBwZW5kLXBhdGgsJChteV9tb2R1bGVfcGF0aCksJChfZmlsZSkpKSkKLQotbXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobXlfdGVzdF9kYXRhX3BhaXJzKSkKLSQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSk6ICQobXlfaW5zdGFsbGVkX3Rlc3RfZGF0YSkKLQotZW5kaWYKLWVuZGlmCi1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgUmVnaXN0ZXIgd2l0aCBBTExfTU9EVUxFUwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtNTc5LDYgKzY2MiwxMiBAQAogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5FWFBMSUNJVExZX1JFUVVJUkVEIDo9IFwKICAgICAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5FWFBMSUNJVExZX1JFUVVJUkVEKVwKICAgICAgICAgJChteV9yZXF1aXJlZF9tb2R1bGVzKSkKK0FMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuVEFSR0VUX1JFUVVJUkVEIDo9IFwKKyAgICAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5UQVJHRVRfUkVRVUlSRUQpXAorICAgICAgICAkKExPQ0FMX1RBUkdFVF9SRVFVSVJFRF9NT0RVTEVTKSkKK0FMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSE9TVF9SRVFVSVJFRCA6PSBcCisgICAgJChzdHJpcCAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSE9TVF9SRVFVSVJFRClcCisgICAgICAgICQoTE9DQUxfSE9TVF9SRVFVSVJFRF9NT0RVTEVTKSkKIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuRVZFTlRfTE9HX1RBR1MgOj0gXAogICAgICQoQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5FVkVOVF9MT0dfVEFHUykgJChldmVudF9sb2dfdGFncykKIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuTUFLRUZJTEUgOj0gXApAQCAtNTkxLDYgKzY4MCw3IEBACiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkZPUl8yTkRfQVJDSCA6PSB0cnVlCiBlbmRpZgogQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5GT1JfSE9TVF9DUk9TUyA6PSAkKG15X2hvc3RfY3Jvc3MpCitBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkNPTVBBVElCSUxJVFlfU1VJVEVTIDo9ICQoTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSkKIAogSU5TVEFMTEFCTEVfRklMRVMuJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKS5NT0RVTEUgOj0gJChteV9yZWdpc3Rlcl9uYW1lKQogCkBAIC02MTksNyArNzA5LDcgQEAKIAogIyBBZGQgdGhpcyBtb2R1bGUgbmFtZSB0byB0aGUgdGFnIGxpc3Qgb2YgZWFjaCBzcGVjaWZpZWQgdGFnLgogJChmb3JlYWNoIHRhZywkKG15X21vZHVsZV90YWdzKSxcCi0gICAgJChldmFsIEFMTF9NT0RVTEVfTkFNRV9UQUdTLiQodGFnKSArPSAkKG15X3JlZ2lzdGVyX25hbWUpKSkKKyAgICAkKGV2YWwgQUxMX01PRFVMRV9OQU1FX1RBR1MuJCh0YWcpIDo9ICQkKEFMTF9NT0RVTEVfTkFNRV9UQUdTLiQodGFnKSkgJChteV9yZWdpc3Rlcl9uYW1lKSkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyB1bWJyZWxsYSB0YXJnZXRzIHVzZWQgdG8gdmVyaWZ5IGJ1aWxkcwpAQCAtNjQ2LDcgKzczNiw3IEBACiAKIAogaWZkZWYgal9vcl9uCi0kKGpfb3JfbikgJChoX29yX3QpICQoal9vcl9uKS0kKGhfb3JfdCkgOiAkKG15X2NoZWNrZWRfbW9kdWxlKQorJChqX29yX24pICQoaF9vcl90KSAkKGpfb3JfbiktJChoX29yX2hjX29yX3QpIDogJChteV9jaGVja2VkX21vZHVsZSkKIGlmbmVxICgsJChmaWx0ZXIgJChteV9tb2R1bGVfdGFncyksdGVzdHMpKQogJChqX29yX24pLSQoaF9vcl90KS10ZXN0cyAkKGpfb3JfbiktdGVzdHMgJChoX29yX3QpLXRlc3RzIDogJChteV9jaGVja2VkX21vZHVsZSkKIGVuZGlmCkBAIC02NTcsNiArNzQ3LDE1IEBACiBlbmRpZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBFbnN1cmUgcHJpdmlsZWdlZCBhcHBsaWNhdGlvbnMgYWx3YXlzIGhhdmUgTE9DQUxfUFJJVklMRUdFRF9NT0RVTEUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZm5kZWYgTE9DQUxfUFJJVklMRUdFRF9NT0RVTEUKKyAgaWZuZXEgKCwkKGZpbHRlciAkKFRBUkdFVF9PVVRfQVBQU19QUklWSUxFR0VEKS8lICQoVEFSR0VUX09VVF9WRU5ET1JfQVBQU19QUklWSUxFR0VEKS8lLCQobXlfbW9kdWxlX3BhdGgpKSkKKyAgICBMT0NBTF9QUklWSUxFR0VEX01PRFVMRSA6PSB0cnVlCisgIGVuZGlmCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgTk9USUNFIGZpbGVzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCmRpZmYgLS1naXQgYS9jb3JlL2JpbmFyeS5tayBiL2NvcmUvYmluYXJ5Lm1rCmluZGV4IDdkZDlhMTMuLmMyZmEyN2MgMTAwNjQ0Ci0tLSBhL2NvcmUvYmluYXJ5Lm1rCisrKyBiL2NvcmUvYmluYXJ5Lm1rCkBAIC02Miw4ICs2Miw4IEBACiBteV9leHBvcnRfY19pbmNsdWRlX2RlcHMgOj0gJChMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RFUFMpCiBteV9hcmZsYWdzIDo9CiAKLWlmbmVxICgsJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoc3Vic3QgJChjb21tYSksJChzcGFjZSksJChDT1ZFUkFHRV9QQVRIUykpLCQoZmlsdGVyICQoZGlyKSUsJChMT0NBTF9QQVRIKSkpKSkKLWlmZXEgKCwkKHN0cmlwICQoZm9yZWFjaCBkaXIsJChzdWJzdCAkKGNvbW1hKSwkKHNwYWNlKSwkKENPVkVSQUdFX0VYQ0xVREVfUEFUSFMpKSwkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSkpCitpZm5lcSAoLCQoc3RyaXAgJChmb3JlYWNoIGRpciwkKENPVkVSQUdFX1BBVEhTKSwkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSkpCitpZmVxICgsJChzdHJpcCAkKGZvcmVhY2ggZGlyLCQoQ09WRVJBR0VfRVhDTFVERV9QQVRIUyksJChmaWx0ZXIgJChkaXIpJSwkKExPQ0FMX1BBVEgpKSkpKQogICBteV9uYXRpdmVfY292ZXJhZ2UgOj0gdHJ1ZQogZWxzZQogICBteV9uYXRpdmVfY292ZXJhZ2UgOj0gZmFsc2UKQEAgLTg4LDcgKzg4LDcgQEAKICAgZW5kaWYKIAogICAjIE1ha2Ugc3VyZSB3ZSd2ZSBidWlsdCB0aGUgTkRLLgotICBteV9hZGRpdGlvbmFsX2RlcGVuZGVuY2llcyArPSAkKFNPT05HX09VVF9ESVIpL25kay50aW1lc3RhbXAKKyAgbXlfYWRkaXRpb25hbF9kZXBlbmRlbmNpZXMgKz0gJChTT09OR19PVVRfRElSKS9uZGtfYmFzZS50aW1lc3RhbXAKIAogICAjIG1pcHMzMnI2IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIE5ESy4gTm8gcmVsZWFzZWQgTkRLIGNvbnRhaW5zIHRoZXNlCiAgICMgbGlicmFyaWVzLCBidXQgdGhlIHIxMCBpbiBwcmVidWlsdHMvbmRrIGhhZCBhIGxvY2FsIGhhY2sgdG8gYWRkIHRoZW0gOigKQEAgLTEwNSw3ICsxMDUsNyBAQAogICBpZm5lcSAoLCQoZmlsdGVyIGFybTY0IG1pcHM2NCB4ODZfNjQsJChteV9hcmNoKSkpCiAgICAgbXlfbWluX3Nka192ZXJzaW9uIDo9IDIxCiAgIGVsc2UKLSAgICBteV9taW5fc2RrX3ZlcnNpb24gOj0gOQorICAgIG15X21pbl9zZGtfdmVyc2lvbiA6PSAkKE1JTl9TVVBQT1JURURfU0RLX1ZFUlNJT04pCiAgIGVuZGlmCiAKICAgIyBIaXN0b3JpY2FsbHkgd2UndmUganVzdCBzZXQgdXAgYSBidW5jaCBvZiBzeW1saW5rcyBpbiBwcmVidWlsdHMvbmRrIHRvIG1hcApAQCAtMTgwLDcgKzE4MCw2IEBACiAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9CiAgIG15X25ka19zdGxfc2hhcmVkX2xpYl9mdWxscGF0aCA6PQogICBteV9uZGtfc3RsX3N0YXRpY19saWIgOj0KLSAgbXlfbmRrX2NwcF9zdGRfdmVyc2lvbiA6PQogICBteV9jcHVfdmFyaWFudCA6PSAkKFRBUkdFVF8kKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQ1BVX0FCSSkKICAgaWZlcSAobWlwczMycjYsJChUQVJHRVRfJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0hfVkFSSUFOVCkpCiAgICAgbXlfY3B1X3ZhcmlhbnQgOj0gbWlwczMycjYKQEAgLTE4OSw4NSArMTg4LDQwIEBACiAgIGlmZXEgKCwkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpCiAgICAgTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IHN5c3RlbQogICBlbmRpZgotICBpZm5lcSAoMSwkKHdvcmRzICQoZmlsdGVyIG5vbmUgc3lzdGVtIHN0bHBvcnRfc3RhdGljIHN0bHBvcnRfc2hhcmVkIGMrK19zdGF0aWMgYysrX3NoYXJlZCBnbnVzdGxfc3RhdGljLCAkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpKSkKKyAgaWZuZXEgKDEsJCh3b3JkcyAkKGZpbHRlciBub25lIHN5c3RlbSBjKytfc3RhdGljIGMrK19zaGFyZWQsICQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkpKQogICAgICQoZXJyb3IgJChMT0NBTF9QQVRIKTogVW5rbm93biBMT0NBTF9OREtfU1RMX1ZBUklBTlQgJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQogICBlbmRpZgorCiAgIGlmZXEgKHN5c3RlbSwkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpCiAgICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggOj0gJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvc3lzdGVtL2luY2x1ZGUKICAgICBteV9zeXN0ZW1fc2hhcmVkX2xpYnJhcmllcyArPSBsaWJzdGRjKysKLSAgZWxzZSAjIExPQ0FMX05ES19TVExfVkFSSUFOVCBpcyBub3Qgc3lzdGVtCi0gIGlmbmVxICgsJChmaWx0ZXIgc3RscG9ydF8lLCAkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpKQotICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9ICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL3N0bHBvcnQvc3RscG9ydAotICAgIG15X3N5c3RlbV9zaGFyZWRfbGlicmFyaWVzICs9IGxpYnN0ZGMrKwotICAgIGlmZXEgKHN0bHBvcnRfc3RhdGljLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkKLSAgICAgIG15X25ka19zdGxfc3RhdGljX2xpYiA6PSAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9zdGxwb3J0L2xpYnMvJChteV9jcHVfdmFyaWFudCkvbGlic3RscG9ydF9zdGF0aWMuYQotICAgICAgbXlfbGRsaWJzICs9IC1sZGwKLSAgICBlbHNlCi0gICAgICBteV9uZGtfc3RsX3NoYXJlZF9saWJfZnVsbHBhdGggOj0gJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvc3RscG9ydC9saWJzLyQobXlfY3B1X3ZhcmlhbnQpL2xpYnN0bHBvcnRfc2hhcmVkLnNvCi0gICAgZW5kaWYKLSAgZWxzZSAjIExPQ0FMX05ES19TVExfVkFSSUFOVCBpcyBub3Qgc3RscG9ydF8qIGVpdGhlcgotICBpZm5lcSAoLCQoZmlsdGVyIGMrK18lLCAkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpKQotICAgICMgUHJlLXIxMSBOREtzIHVzZWQgbGliZ2FiaSsrIGZvciBsaWJjKysncyBDKysgQUJJLCBidXQgcjExIGFuZCBsYXRlciB1c2UKLSAgICAjIGxpYmMrK2FiaS4KLSAgICAjCi0gICAgIyByMTMgbm8gbG9uZ2VyIGhhcyB0aGUgaW5uZXIgZGlyZWN0b3J5IGFzIGEgc2lkZSBlZmZlY3Qgb2YganVzdCB1c2luZwotICAgICMgZXh0ZXJuYWwvbGliY3h4LgotICAgIGlmZXEgKHIxMCwkKExPQ0FMX05ES19WRVJTSU9OKSkKLSAgICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9IFwKLSAgICAgICAgJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvbGx2bS1saWJjKysvbGliY3h4L2luY2x1ZGUKLSAgICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9IFwKLSAgICAgICAgJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvbGx2bS1saWJjKysvZ2FiaSsrL2luY2x1ZGUKLSAgICBlbHNlIGlmZXEgKHIxMSwkKExPQ0FMX05ES19WRVJTSU9OKSkKLSAgICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoIDo9IFwKLSAgICAgICAgJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvbGx2bS1saWJjKysvbGliY3h4L2luY2x1ZGUKLSAgICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9IFwKLSAgICAgICAgJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvbGx2bS1saWJjKythYmkvbGliY3h4YWJpL2luY2x1ZGUKLSAgICBlbHNlCi0gICAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCA6PSBcCi0gICAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2xsdm0tbGliYysrL2luY2x1ZGUKLSAgICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9IFwKLSAgICAgICAgJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvbGx2bS1saWJjKythYmkvaW5jbHVkZQotICAgIGVuZGlmCisgIGVsc2UgaWZuZXEgKCwkKGZpbHRlciBjKytfJSwgJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKSkKKyAgICBteV9uZGtfc3RsX2luY2x1ZGVfcGF0aCA6PSBcCisgICAgICAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9sbHZtLWxpYmMrKy9pbmNsdWRlCisgICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggKz0gXAorICAgICAgJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvbGx2bS1saWJjKythYmkvaW5jbHVkZQogICAgIG15X25ka19zdGxfaW5jbHVkZV9wYXRoICs9ICQobXlfbmRrX3NvdXJjZV9yb290KS9hbmRyb2lkL3N1cHBvcnQvaW5jbHVkZQogCiAgICAgbXlfbGliY3h4X2xpYmRpciA6PSBcCiAgICAgICAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9sbHZtLWxpYmMrKy9saWJzLyQobXlfY3B1X3ZhcmlhbnQpCiAKLSAgICBpZm5lcSAoLCQoZmlsdGVyIHIxMCByMTEsJChMT0NBTF9OREtfVkVSU0lPTikpKQotICAgICAgaWZlcSAoYysrX3N0YXRpYywkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpCi0gICAgICAgIG15X25ka19zdGxfc3RhdGljX2xpYiA6PSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYmMrK19zdGF0aWMuYQotICAgICAgZWxzZQotICAgICAgICBteV9uZGtfc3RsX3NoYXJlZF9saWJfZnVsbHBhdGggOj0gJChteV9saWJjeHhfbGliZGlyKS9saWJjKytfc2hhcmVkLnNvCi0gICAgICBlbmRpZgorICAgIGlmZXEgKGMrK19zdGF0aWMsJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQorICAgICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliIDo9IFwKKyAgICAgICAgJChteV9saWJjeHhfbGliZGlyKS9saWJjKytfc3RhdGljLmEgXAorICAgICAgICAkKG15X2xpYmN4eF9saWJkaXIpL2xpYmMrK2FiaS5hCiAgICAgZWxzZQotICAgICAgaWZlcSAoYysrX3N0YXRpYywkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpCi0gICAgICAgIG15X25ka19zdGxfc3RhdGljX2xpYiA6PSBcCi0gICAgICAgICAgJChteV9saWJjeHhfbGliZGlyKS9saWJjKytfc3RhdGljLmEgXAotICAgICAgICAgICQobXlfbGliY3h4X2xpYmRpcikvbGliYysrYWJpLmEKLSAgICAgIGVsc2UKLSAgICAgICAgbXlfbmRrX3N0bF9zaGFyZWRfbGliX2Z1bGxwYXRoIDo9ICQobXlfbGliY3h4X2xpYmRpcikvbGliYysrX3NoYXJlZC5zbwotICAgICAgZW5kaWYKKyAgICAgIG15X25ka19zdGxfc2hhcmVkX2xpYl9mdWxscGF0aCA6PSAkKG15X2xpYmN4eF9saWJkaXIpL2xpYmMrK19zaGFyZWQuc28KKyAgICBlbmRpZgogCi0gICAgICBteV9uZGtfc3RsX3N0YXRpY19saWIgKz0gJChteV9saWJjeHhfbGliZGlyKS9saWJhbmRyb2lkX3N1cHBvcnQuYQotICAgICAgaWZuZXEgKCwkKGZpbHRlciBhcm1lYWJpIGFybWVhYmktdjdhLCQobXlfY3B1X3ZhcmlhbnQpKSkKLSAgICAgICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliICs9ICQobXlfbGliY3h4X2xpYmRpcikvbGlidW53aW5kLmEKLSAgICAgIGVuZGlmCisgICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliICs9ICQobXlfbGliY3h4X2xpYmRpcikvbGliYW5kcm9pZF9zdXBwb3J0LmEKKyAgICBpZm5lcSAoLCQoZmlsdGVyIGFybWVhYmkgYXJtZWFiaS12N2EsJChteV9jcHVfdmFyaWFudCkpKQorICAgICAgbXlfbmRrX3N0bF9zdGF0aWNfbGliICs9ICQobXlfbGliY3h4X2xpYmRpcikvbGlidW53aW5kLmEKICAgICBlbmRpZgogCiAgICAgbXlfbGRsaWJzICs9IC1sZGwKLQotICAgIG15X25ka19jcHBfc3RkX3ZlcnNpb24gOj0gYysrMTEKLSAgZWxzZSAjIExPQ0FMX05ES19TVExfVkFSSUFOVCBpcyBub3QgYysrXyogZWl0aGVyCi0gIGlmbmVxICgsJChmaWx0ZXIgZ251c3RsXyUsICQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkpCi0gICAgbXlfbmRrX3N0bF9pbmNsdWRlX3BhdGggOj0gJChteV9uZGtfc291cmNlX3Jvb3QpL2N4eC1zdGwvZ251LWxpYnN0ZGMrKy8kKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfTkRLX0dDQ19WRVJTSU9OKS9saWJzLyQobXlfY3B1X3ZhcmlhbnQpL2luY2x1ZGUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobXlfbmRrX3NvdXJjZV9yb290KS9jeHgtc3RsL2dudS1saWJzdGRjKysvJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX05ES19HQ0NfVkVSU0lPTikvaW5jbHVkZQotICAgIG15X25ka19zdGxfc3RhdGljX2xpYiA6PSAkKG15X25ka19zb3VyY2Vfcm9vdCkvY3h4LXN0bC9nbnUtbGlic3RkYysrLyQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9OREtfR0NDX1ZFUlNJT04pL2xpYnMvJChteV9jcHVfdmFyaWFudCkvbGliZ251c3RsX3N0YXRpYy5hCiAgIGVsc2UgIyBMT0NBTF9OREtfU1RMX1ZBUklBTlQgbXVzdCBiZSBub25lCiAgICAgIyBEbyBub3RoaW5nLgogICBlbmRpZgotICBlbmRpZgotICBlbmRpZgotICBlbmRpZgogZW5kaWYKIAogaWZuZXEgKCQoTE9DQUxfVVNFX1ZOREspLCkKQEAgLTI5MCw2ICsyNDQsMTUgQEAKICMgTW92ZSBvdGhlciBsZGxpYnMgYmFjayB0byBzaGFyZWQgbGlicmFyaWVzCiBteV9zaGFyZWRfbGlicmFyaWVzICs9ICQocGF0c3Vic3QgLWwlLGxpYiUsJChmaWx0ZXItb3V0ICQobXlfYWxsb3dlZF9sZGxpYnMpLCQobXlfbGRsaWJzKSkpCiBteV9sZGxpYnMgOj0gJChmaWx0ZXIgJChteV9hbGxvd2VkX2xkbGlicyksJChteV9sZGxpYnMpKQorZWxzZSAjIExPQ0FMX0lTX0hPU1RfTU9EVUxFCisgICMgQWRkIC1sZGwsIC1scHRocmVhZCwgLWxtIGFuZCAtbHJ0IHRvIGhvc3QgYnVpbGRzIHRvIG1hdGNoIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mCisgICMgZGV2aWNlIGJ1aWxkcworICBpZm5lcSAoJCgkKG15X3ByZWZpeClPUyksd2luZG93cykKKyAgICBteV9sZGxpYnMgKz0gLWxkbCAtbHB0aHJlYWQgLWxtCisgICAgaWZuZXEgKCQoSE9TVF9PUyksZGFyd2luKQorICAgICAgbXlfbGRsaWJzICs9IC1scnQKKyAgICBlbmRpZgorICBlbmRpZgogZW5kaWYKIAogaWZuZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKQEAgLTM3OCw5ICszNDEsOSBAQAogIyBjbGFuZyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgZm9yIGhvc3QgYnVpbGRzCiAjIGVuYWJsZSBpdCB1bmxlc3Mgd2UndmUgc3BlY2lmaWNhbGx5IGRpc2FibGVkIGNsYW5nIGFib3ZlCiBpZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotICAgIGlmZXEgKCQoJChteV9wcmVmaXgpT1MpLHdpbmRvd3MpCisgICAgaWZuZXEgKCQoJChteV9wcmVmaXgpQ0xBTkdfU1VQUE9SVEVEKSx0cnVlKQogICAgICAgICBpZmVxICgkKG15X2NsYW5nKSx0cnVlKQotICAgICAgICAgICAgJChlcnJvciAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6ICQoTE9DQUxfTU9EVUxFKTogQ2xhbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHdpbmRvd3MgYmluYXJpZXMpCisgICAgICAgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLENsYW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciAkKCQobXlfcHJlZml4KU9TKSBiaW5hcmllcykKICAgICAgICAgZW5kaWYKICAgICAgICAgbXlfY2xhbmcgOj0gZmFsc2UKICAgICBlbHNlCkBAIC0zODgsMTEgKzM1MSw2IEBACiAgICAgICAgICAgICBteV9jbGFuZyA6PSB0cnVlCiAgICAgICAgIGVuZGlmCiAgICAgZW5kaWYKLSMgQWRkIG9wdGlvbiB0byBtYWtlIGdjYyB0aGUgZGVmYXVsdCBmb3IgZGV2aWNlIGJ1aWxkCi1lbHNlIGlmZXEgKCQoVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEKSxmYWxzZSkKLSAgICBpZmVxICgkKG15X2NsYW5nKSwpCi0gICAgICAgIG15X2NsYW5nIDo9IGZhbHNlCi0gICAgZW5kaWYKIGVsc2UgaWZlcSAoJChteV9jbGFuZyksKQogICAgIG15X2NsYW5nIDo9IHRydWUKIGVuZGlmCkBAIC00MjAsMTEgKzM3OCw2IEBACiAgICAgbXlfY3BwX3N0ZF92ZXJzaW9uIDo9ICQoREVGQVVMVF9HQ0NfQ1BQX1NURF9WRVJTSU9OKQogZW5kaWYKIAotaWZkZWYgTE9DQUxfU0RLX1ZFUlNJT04KLSAgICAjIFRoZSBOREsgaGFuZGxlcyB0aGlzIGl0c2VsZi4KLSAgICBteV9jcHBfc3RkX3ZlcnNpb24gOj0gJChteV9uZGtfY3BwX3N0ZF92ZXJzaW9uKQotZW5kaWYKLQogaWZkZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKICAgICBpZm5lcSAoJChteV9jbGFuZyksdHJ1ZSkKICAgICAgICAgIyBUaGUgaG9zdCBHQ0MgZG9lc24ndCBzdXBwb3J0IEMrKzE0IChhbmQgaXMgZGVwcmVjYXRlZCwgc28gbGlrZWx5CkBAIC02NTYsNiArNjA5LDkgQEAKICAgbXlfY2MgOj0gJChteV9jY193cmFwcGVyKSAkKG15X2NjKQogZW5kaWYKIAorU1lOVEFYX1RPT0xTX1BSRUZJWCA6PSBcCisgICAgJChMTFZNX1BSRUJVSUxUU19CQVNFKS8kKEJVSUxEX09TKS14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS9saWJleGVjCisKIGlmbmVxICgkKExPQ0FMX05PX1NUQVRJQ19BTkFMWVpFUiksdHJ1ZSkKICAgbXlfY2MgOj0gQ0NDX0NDPSQoQ0xBTkcpIENMQU5HPSQoQ0xBTkcpIFwKICAgICAgICAgICAgJChTWU5UQVhfVE9PTFNfUFJFRklYKS9jY2MtYW5hbHl6ZXIKQEAgLTc5Nyw3ICs3NTMsNyBAQAogaWZuZXEgKCwkKExPQ0FMX1NES19WRVJTSU9OKSkKICMgU2V0IHRhcmdldC1hcGkgZm9yIExPQ0FMX1NES19WRVJTSU9OcyBvdGhlciB0aGFuIGN1cnJlbnQuCiBpZm5lcSAoLCQoZmlsdGVyLW91dCBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikpKQotcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgOj0gJChMT0NBTF9TREtfVkVSU0lPTikKK3JlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDo9ICQoY2FsbCBnZXQtbnVtZXJpYy1zZGstdmVyc2lvbiwkKExPQ0FMX1NES19WRVJTSU9OKSkKIGVuZGlmCiBlbmRpZiAgIyBMT0NBTF9TREtfVkVSU0lPTiBpcyBzZXQKIGVuZGlmICAjIExPQ0FMX1JFTkRFUlNDUklQVF9UQVJHRVRfQVBJIGlzIHNldApAQCAtODYxLDYgKzgxNyw5IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQ29tcGlsZSB0aGUgLnByb3RvIGZpbGVzIHRvIC5jYyAob3IgLmMpIGFuZCB0aGVuIHRvIC5vCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWZlcSAoJChzdHJpcCAkKExPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFKSksKQorICBMT0NBTF9QUk9UT0NfT1BUSU1JWkVfVFlQRSA6PSBsaXRlCitlbmRpZgogcHJvdG9fc291cmNlcyA6PSAkKGZpbHRlciAlLnByb3RvLCQobXlfc3JjX2ZpbGVzKSkKIGlmbmVxICgkKHByb3RvX3NvdXJjZXMpLCkKIHByb3RvX2dlbl9kaXIgOj0gJChnZW5lcmF0ZWRfc291cmNlc19kaXIpL3Byb3RvCkBAIC04ODIsNyArODQxLDcgQEAKIGVuZGlmCiBteV9wcm90b19jX2luY2x1ZGVzIDo9IGV4dGVybmFsL3Byb3RvYnVmL3NyYwogbXlfY2ZsYWdzICs9IC1ER09PR0xFX1BST1RPQlVGX05PX1JUVEkKLW15X3Byb3RvY19mbGFncyA6PSAtLWNwcF9vdXQ9JChwcm90b19nZW5fZGlyKQorbXlfcHJvdG9jX2ZsYWdzIDo9IC0tY3BwX291dD0kKGlmICQoZmlsdGVyIGxpdGUgbGl0ZS1zdGF0aWMsJChMT0NBTF9QUk9UT0NfT1BUSU1JWkVfVFlQRSkpLGxpdGU6LCkkKHByb3RvX2dlbl9kaXIpCiBteV9wcm90b2NfZGVwcyA6PQogZW5kaWYKIG15X3Byb3RvX2NfaW5jbHVkZXMgKz0gJChwcm90b19nZW5fZGlyKQpAQCAtMTMyMSw2ICsxMjgwLDIyIEBACiBhc21fb2JqZWN0cyArPSAkKGFzbV9vYmplY3RzX2FzbSkKIGVuZGlmCiAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIFdoZW4gY29tcGlsaW5nIGEgQ0ZJIGVuYWJsZWQgdGFyZ2V0LCB1c2UgdGhlIC5jZmkgdmFyaWFudCBvZiBhbnkKKyMjIHN0YXRpYyBkZXBlbmRlbmNpZXMgKHdoZXJlIHRoZXkgZXhpc3QpLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkZWZpbmUgdXNlX3Nvb25nX2NmaV9zdGF0aWNfbGlicmFyaWVzCisgICQoZm9yZWFjaCBsLCQoMSksJChpZiAkKGZpbHRlciAkKGwpLCQoU09PTkdfQ0ZJX1NUQVRJQ19MSUJSQVJJRVMpKSxcCisgICAgICAkKGwpLmNmaSwkKGwpKSkKK2VuZGVmCisKK2lmbmVxICgkKGZpbHRlciBjZmksJChteV9zYW5pdGl6ZSkpLCkKKyAgbXlfd2hvbGVfc3RhdGljX2xpYnJhcmllcyA6PSAkKGNhbGwgdXNlX3Nvb25nX2NmaV9zdGF0aWNfbGlicmFyaWVzLFwKKyAgICAkKG15X3dob2xlX3N0YXRpY19saWJyYXJpZXMpKQorICBteV9zdGF0aWNfbGlicmFyaWVzIDo9ICQoY2FsbCB1c2Vfc29vbmdfY2ZpX3N0YXRpY19saWJyYXJpZXMsXAorICAgICQobXlfc3RhdGljX2xpYnJhcmllcykpCitlbmRpZgorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgV2hlbiBjb21waWxpbmcgYWdhaW5zdCB0aGUgVk5ESywgdXNlIExMLU5ESyBsaWJyYXJpZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xNDAxLDE4ICsxMzc2LDMzIEBACiAjIyBvdGhlciBOREstYnVpbHQgbGlicmFyaWVzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FsbG93ZWRfbmRrX3R5cGVzLm1rCisKIGlmZGVmIExPQ0FMX1NES19WRVJTSU9OCi1teV9saW5rX3R5cGUgOj0gbmF0aXZlOm5kawotbXlfd2Fybl90eXBlcyA6PQotbXlfYWxsb3dlZF90eXBlcyA6PSBuYXRpdmU6bmRrCitteV9saW5rX3R5cGUgOj0gbmF0aXZlOm5kazokKG15X25ka19zdGxfZmFtaWx5KTokKG15X25ka19zdGxfbGlua190eXBlKQorbXlfd2Fybl90eXBlcyA6PSAkKG15X3dhcm5fbmRrX3R5cGVzKQorbXlfYWxsb3dlZF90eXBlcyA6PSAkKG15X2FsbG93ZWRfbmRrX3R5cGVzKQogZWxzZSBpZmRlZiBMT0NBTF9VU0VfVk5ESwotbXlfbGlua190eXBlIDo9IG5hdGl2ZTp2ZW5kb3IKLW15X3dhcm5fdHlwZXMgOj0KLW15X2FsbG93ZWRfdHlwZXMgOj0gbmF0aXZlOnZlbmRvcgorICAgIF9uYW1lIDo9ICQocGF0c3Vic3QgJS52ZW5kb3IsJSwkKExPQ0FMX01PRFVMRSkpCisgICAgaWZuZXEgKCQoZmlsdGVyICQoX25hbWUpLCQoVk5ES19DT1JFX0xJQlJBUklFUykgJChWTkRLX1NBTUVQUk9DRVNTX0xJQlJBUklFUykgJChMTE5ES19MSUJSQVJJRVMpKSwpCisgICAgICAgIGlmZXEgKCQoZmlsdGVyICQoX25hbWUpLCQoVk5ES19QUklWQVRFX0xJQlJBUklFUykpLCkKKyAgICAgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6dm5kaworICAgICAgICBlbHNlCisgICAgICAgICAgICBteV9saW5rX3R5cGUgOj0gbmF0aXZlOnZuZGtfcHJpdmF0ZQorICAgICAgICBlbmRpZgorICAgICAgICBteV93YXJuX3R5cGVzIDo9CisgICAgICAgIG15X2FsbG93ZWRfdHlwZXMgOj0gbmF0aXZlOnZuZGsgbmF0aXZlOnZuZGtfcHJpdmF0ZQorICAgIGVsc2UKKyAgICAgICAgIyBNb2R1bGVzIGluc3RhbGxlZCB0byAvdmVuZG9yIGNhbm5vdCBkaXJlY3RseSBkZXBlbmQgb24gbW9kdWxlcyBtYXJrZWQKKyAgICAgICAgIyB3aXRoIHZlbmRvcl9hdmFpbGFibGU6IGZhbHNlCisgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6dmVuZG9yCisgICAgICAgIG15X3dhcm5fdHlwZXMgOj0KKyAgICAgICAgbXlfYWxsb3dlZF90eXBlcyA6PSBuYXRpdmU6dmVuZG9yIG5hdGl2ZTp2bmRrCisgICAgZW5kaWYKIGVsc2UKIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6cGxhdGZvcm0KLW15X3dhcm5fdHlwZXMgOj0KLW15X2FsbG93ZWRfdHlwZXMgOj0gbmF0aXZlOm5kayBuYXRpdmU6cGxhdGZvcm0KK215X3dhcm5fdHlwZXMgOj0gJChteV93YXJuX25ka190eXBlcykKK215X2FsbG93ZWRfdHlwZXMgOj0gJChteV9hbGxvd2VkX25ka190eXBlcykgbmF0aXZlOnBsYXRmb3JtCiBlbmRpZgogCiBteV9saW5rX2RlcHMgOj0gJChhZGRwcmVmaXggU1RBVElDX0xJQlJBUklFUzosJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKSAkKG15X3N0YXRpY19saWJyYXJpZXMpKQpAQCAtMTY0MiwxMyArMTYzMiwzMCBAQAogICAgIG15X2NmbGFncyArPSAtREFORFJPSURfU1RSSUNUCiBlbmRpZgogCi0jIEFkZCAtV2Vycm9yIGlmIExPQ0FMX1BBVEggaXMgaW4gdGhlIFdBUk5JTkdfRElTQUxMT1dFRCBwcm9qZWN0IGxpc3QsCi0jIG9yIG5vdCBpbiB0aGUgV0FSTklOR19BTExPV0VEIHByb2plY3QgbGlzdC4KLWlmbmVxICgsJChzdHJpcCAkKGNhbGwgZmluZF93YXJuaW5nX2Rpc2FsbG93ZWRfcHJvamVjdHMsJChMT0NBTF9QQVRIKSkpKQotICBteV9jZmxhZ3Nfbm9fb3ZlcnJpZGUgKz0gLVdlcnJvcgotZWxzZQotICBpZmVxICgsJChzdHJpcCAkKGNhbGwgZmluZF93YXJuaW5nX2FsbG93ZWRfcHJvamVjdHMsJChMT0NBTF9QQVRIKSkpKQotICAgIG15X2NmbGFnc19ub19vdmVycmlkZSArPSAtV2Vycm9yCisjIENoZWNrIGlmIC1XZXJyb3Igb3IgLVduby1lcnJvciBpcyB1c2VkIGluIEMgY29tcGlsZXIgZmxhZ3MuCisjIE1vZHVsZXMgZGVmaW5lZCBpbiAkKFNPT05HX0FORFJPSURfTUspIGFyZSBjaGVja2VkIGluIHNvb25nJ3MgY2MuZ28uCitpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisgICMgSGVhZGVyIGxpYnJhcmllcyBkbyBub3QgbmVlZCBjZmxhZ3MuCisgIGlmbmVxIChIRUFERVJfTElCUkFSSUVTLCQoTE9DQUxfTU9EVUxFX0NMQVNTKSkKKyAgICAjIFByZWJ1aWx0IG1vZHVsZXMgZG8gbm90IG5lZWQgY2ZsYWdzLgorICAgIGlmZXEgKCwkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKSkKKyAgICAgIG15X2FsbF9jZmxhZ3MgOj0gJChteV9jZmxhZ3MpICQobXlfY3BwZmxhZ3MpICQobXlfY2ZsYWdzX25vX292ZXJyaWRlKQorICAgICAgIyBJc3N1ZSB3YXJuaW5nIGlmIC1Xbm8tZXJyb3IgaXMgdXNlZC4KKyAgICAgIGlmbmVxICgsJChmaWx0ZXIgLVduby1lcnJvciwkKG15X2FsbF9jZmxhZ3MpKSkKKyAgICAgICAgJChldmFsIE1PRFVMRVNfVVNJTkdfV05PX0VSUk9SIDo9ICQoTU9EVUxFU19VU0lOR19XTk9fRVJST1IpICQoTE9DQUxfTU9EVUxFX01BS0VGSUxFKTokKExPQ0FMX01PRFVMRSkpCisgICAgICBlbHNlCisgICAgICAgICMgSXNzdWUgd2FybmluZyBpZiAtV2Vycm9yIGlzIG5vdCB1c2VkLiBBZGQgaXQuCisgICAgICAgIGlmZXEgKCwkKGZpbHRlciAtV2Vycm9yLCQobXlfYWxsX2NmbGFncykpKQorICAgICAgICAgICMgQWRkIC1XYWxsIC1XZXJyb3IgdW5sZXNzIHRoZSBwcm9qZWN0IGlzIGluIHRoZSBXQVJOSU5HX0FMTE9XRUQgcHJvamVjdCBsaXN0LgorICAgICAgICAgIGlmZXEgKCwkKHN0cmlwICQoY2FsbCBmaW5kX3dhcm5pbmdfYWxsb3dlZF9wcm9qZWN0cywkKExPQ0FMX1BBVEgpKSkpCisgICAgICAgICAgICBteV9jZmxhZ3MgOj0gLVdhbGwgLVdlcnJvciAkKG15X2NmbGFncykKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAkKGV2YWwgTU9EVUxFU19BRERFRF9XQUxMIDo9ICQoTU9EVUxFU19BRERFRF9XQUxMKSAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6JChMT0NBTF9NT0RVTEUpKQorICAgICAgICAgICAgbXlfY2ZsYWdzIDo9IC1XYWxsICQobXlfY2ZsYWdzKQorICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgICBlbmRpZgorICAgIGVuZGlmCiAgIGVuZGlmCiBlbmRpZgogCkBAIC0xNjgxLDIxICsxNjg4LDIwIEBACiAgICAgaWZuZXEgKCQoTE9DQUxfVElEWV9DSEVDS1MpLCkKICAgICAgIG15X3RpZHlfY2hlY2tzIDo9ICQobXlfdGlkeV9jaGVja3MpLCQoTE9DQUxfVElEWV9DSEVDS1MpCiAgICAgZW5kaWYKLSAgICAjIFNldCB1cCBnbG9iYWwgZGVmYXVsdCBjbGFuZy10aWR5IGZsYWdzLCB3aGljaCBpcyBub25lLgotICAgIG15X3RpZHlfZmxhZ3MgOj0gJChXSVRIX1RJRFlfRkxBR1MpCi0gICAgIyBVc2UgbG9jYWwgY2xhbmctdGlkeSBmbGFncyBpZiBzcGVjaWZpZWQuCi0gICAgaWZuZXEgKCQoTE9DQUxfVElEWV9GTEFHUyksKQotICAgICAgbXlfdGlkeV9mbGFncyA6PSAkKExPQ0FMX1RJRFlfRkxBR1MpCi0gICAgZW5kaWYKKyAgICBteV90aWR5X2ZsYWdzICs9ICQoV0lUSF9USURZX0ZMQUdTKSAkKExPQ0FMX1RJRFlfRkxBR1MpCiAgICAgIyBJZiB0aWR5IGZsYWdzIGFyZSBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0IHRvIGNoZWNrIGFsbCBoZWFkZXIgZmlsZXMuCiAgICAgaWZlcSAoJChteV90aWR5X2ZsYWdzKSwpCiAgICAgICBteV90aWR5X2ZsYWdzIDo9ICQoY2FsbCBkZWZhdWx0X3RpZHlfaGVhZGVyX2ZpbHRlciwkKExPQ0FMX1BBVEgpKQogICAgIGVuZGlmCisgICAgIyBJZiBjbGFuZy10aWR5IGlzIG5vdCBlbmFibGVkIGdsb2JhbGx5LCBhZGQgdGhlIC1xdWlldCBmbGFnLgorICAgIGlmZXEgKCwkKGZpbHRlciAxIHRydWUsJChXSVRIX1RJRFkpKSkKKyAgICAgIG15X3RpZHlfZmxhZ3MgKz0gLXF1aWV0IC1leHRyYS1hcmctYmVmb3JlPS1mbm8tY2FyZXQtZGlhZ25vc3RpY3MKKyAgICBlbmRpZgogCiAgICAgIyBXZSBtaWdodCBiZSB1c2luZyB0aGUgc3RhdGljIGFuYWx5emVyIHRocm91Z2ggY2xhbmctdGlkeS4KICAgICAjIGh0dHBzOi8vYnVncy5sbHZtLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzI5MTQKICAgICBpZm5lcSAoJChteV90aWR5X2NoZWNrcyksKQotICAgICAgbXlfdGlkeV9mbGFncyArPSAiLWV4dHJhLWFyZy1iZWZvcmU9LURfX2NsYW5nX2FuYWx5emVyX18iCisgICAgICBteV90aWR5X2ZsYWdzICs9IC1leHRyYS1hcmctYmVmb3JlPS1EX19jbGFuZ19hbmFseXplcl9fCiAgICAgZW5kaWYKICAgZW5kaWYKIGVuZGlmCkBAIC0xNzA4LDE3ICsxNzE0LDE5IEBACiBteV9sZGZsYWdzIDo9ICQoZmlsdGVyLW91dCAtbCUsJChteV9sZGxpYl9mbGFncykpCiAKICMgT25lIGxhc3QgdmVyaWZpY2F0aW9uIGNoZWNrIGZvciBsZGxpYnMKLWlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQogbXlfYWxsb3dlZF9sZGxpYnMgOj0KLWlmbmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSwpCi0gIG15X2FsbG93ZWRfbGRsaWJzIDo9ICQoYWRkcHJlZml4IC1sLCQoTkRLX1BSRUJVSUxUX1NIQVJFRF9MSUJSQVJJRVMpKQoraWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCisgIGlmbmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSwpCisgICAgbXlfYWxsb3dlZF9sZGxpYnMgOj0gJChhZGRwcmVmaXggLWwsJChOREtfUFJFQlVJTFRfU0hBUkVEX0xJQlJBUklFUykpCisgIGVuZGlmCitlbHNlCisgIG15X2FsbG93ZWRfbGRsaWJzIDo9ICQoJChteV9wcmVmaXgpQVZBSUxBQkxFX0xJQlJBUklFUykKIGVuZGlmCiAKIG15X2JhZF9sZGxpYnMgOj0gJChmaWx0ZXItb3V0ICQobXlfYWxsb3dlZF9sZGxpYnMpLCQobXlfbGRsaWJzKSkKIGlmbmVxICgkKG15X2JhZF9sZGxpYnMpLCkKICAgJChlcnJvciAkKExPQ0FMX01PRFVMRV9NQUtFRklMRSk6ICQoTE9DQUxfTU9EVUxFKTogQmFkIExPQ0FMX0xETElCUyBlbnRyaWVzOiAkKG15X2JhZF9sZGxpYnMpKQogZW5kaWYKLWVuZGlmCiAKICMgbXlfY3h4X2xkbGlicyBtYXkgY29udGFpbiBsaW5rZXIgZmxhZ3MgbmVlZCB0byB3cmFwIGNlcnRhaW4gbGlicmFyaWVzCiAjIChzdGFydC1ncm91cC9lbmQtZ3JvdXApLCBzbyBhcHBlbmQgYWZ0ZXIgdGhlIGNoZWNrIGFib3ZlLgpAQCAtMTgzMiw2ICsxODQwLDcgQEAKICAgICAgICAgJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKSBcCiAgICAgICAgICQobXlfc2hhcmVkX2xpYnJhcmllcykgXAogICAgICAgICAkKG15X3N5c3RlbV9zaGFyZWRfbGlicmFyaWVzKSkKK1NPT05HX0NPTlYuJChMT0NBTF9NT0RVTEUpLlRZUEUgOj0gbmF0aXZlCiBTT09OR19DT05WIDo9ICQoU09PTkdfQ09OVikgJChMT0NBTF9NT0RVTEUpCiBlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL2J1aWxkLXN5c3RlbS5odG1sIGIvY29yZS9idWlsZC1zeXN0ZW0uaHRtbAppbmRleCBjNzkzOGNjLi4zZDg2ZTI0IDEwMDY0NAotLS0gYS9jb3JlL2J1aWxkLXN5c3RlbS5odG1sCisrKyBiL2NvcmUvYnVpbGQtc3lzdGVtLmh0bWwKQEAgLTc2Miw2ICs3NjIsMTkgQEAKIERpYWxlciwgQ29udGFjdHMsIGV0Yy4gIFRoaXMgd2lsbCBwcm9iYWJseSBjaGFuZ2Ugb3IgZ28gYXdheSB3aGVuIHdlIHN3aXRjaAogdG8gYW4gYW50LWJhc2VkIGJ1aWxkIHN5c3RlbSBmb3IgdGhlIGFwcHMuPC9wPgogCis8aDQ+TE9DQUxfUEFUQ0hfTU9EVUxFIChleHBlcmltZW50YWwgb3B0aW9uKTwvaDQ+Cis8cD5BcyBvZiBKYW51YXJ5IDIwMTgsIHlvdSBhbG1vc3QgY2VydGFpbmx5IGRvbid0IG5lZWQgdGhpcyBvcHRpb24sIHNvIHBsZWFzZQorYXNrIGFuZCBvbmx5IHVzZSBpdCBpZiB5b3UgdW5kZXJzdGFuZCB3aGF0IHlvdSdyZSBkb2luZy4gVGhpcyBmZWF0dXJlIGlzCitleHBlcmltZW50YWwgYW5kIG1heSBnbyBhd2F5IGluIGZ1dHVyZS48L3A+Cis8cD4KK1doZW4gY29tcGlsaW5nIGxhbmd1YWdlIGxldmVsIDkrIC5qYXZhIGNvZGUgaW4gcGFja2FnZXMgdGhhdCBhcmUgcGFydCBvZiBhCithIHN5c3RlbSBtb2R1bGUsIDxjb2RlPkxPQ0FMX1BBVENIX01PRFVMRTwvY29kZT4gbmFtZXMgdGhlIG1vZHVsZSB0aGF0IHlvdXIKK3NvdXJjZXMgYW5kIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcGF0Y2hlZCBpbnRvLiBUaGUgQW5kcm9pZCBydW50aW1lIGN1cnJlbnRseQorKEphbiAyMDE4KSBkb2Vzbid0IGltcGxlbWVudCB0aGUgSkVQIDI2MSBtb2R1bGUgc3lzdGVtIHNvIHRoaXMgb3B0aW9uIGlzIG9ubHkKK3N1cHBvcnRlZCBhdCBjb21waWxlIHRpbWUuIEl0IHNob3VsZCBvbmx5IGJlIG5lZWRlZCB0byBjb21waWxlIHRlc3RzIGluIHBhY2thZ2VzCit0aGF0IGV4aXN0IGluIGxpYmNvcmUgYW5kIHdoaWNoIGFyZSBpbmNvbnZlbmllbnQgdG8gbW92ZSBlbHNld2hlcmUuCis8L3A+CisKIDxoND5MT0NBTF9QQVRIPC9oND4KIDxwPlRoZSBkaXJlY3RvcnkgeW91ciBBbmRyb2lkLm1rIGZpbGUgaXMgaW4uIFlvdSBjYW4gc2V0IGl0IGJ5IHB1dHRpbmcgdGhlCiBmb2xsb3dpbmcgYXMgdGhlIGZpcnN0IGxpbmUgaW4geW91ciBBbmRyb2lkLm1rOjwvcD4KZGlmZiAtLWdpdCBhL2NvcmUvYnVpbGRfaWQubWsgYi9jb3JlL2J1aWxkX2lkLm1rCmluZGV4IGZmNGQwMTMuLjkzMmUyMTQgMTAwNjQ0Ci0tLSBhL2NvcmUvYnVpbGRfaWQubWsKKysrIGIvY29yZS9idWlsZF9pZC5tawpAQCAtMTgsNCArMTgsNCBAQAogIyAobGlrZSAiQ1JCMDEiKS4gIEl0IG11c3QgYmUgYSBzaW5nbGUgd29yZCwgYW5kIGlzCiAjIGNhcGl0YWxpemVkIGJ5IGNvbnZlbnRpb24uCiAKLWV4cG9ydCBCVUlMRF9JRD1PQy1NUjEKK2V4cG9ydCBCVUlMRF9JRD1QSQpkaWZmIC0tZ2l0IGEvY29yZS9jbGFuZy9IT1NUX0NST1NTX3g4Ni5tayBiL2NvcmUvY2xhbmcvSE9TVF9DUk9TU194ODYubWsKaW5kZXggYmY0OGY5NS4uZmZkNzgxMSAxMDA2NDQKLS0tIGEvY29yZS9jbGFuZy9IT1NUX0NST1NTX3g4Ni5taworKysgYi9jb3JlL2NsYW5nL0hPU1RfQ1JPU1NfeDg2Lm1rCkBAIC0xICsxIEBACi0kKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClIT1NUX0NST1NTX0xJQlBST0ZJTEVfUlQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LnByb2ZpbGUtaTY4Ni5hCiskKGNsYW5nXzJuZF9hcmNoX3ByZWZpeClIT1NUX0NST1NTX0xJQlBST0ZJTEVfUlQgOj0gJChMTFZNX1JUTElCX1BBVEgpL2xpYmNsYW5nX3J0LnByb2ZpbGUtaTM4Ni5hCmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL0hPU1RfeDg2Lm1rIGIvY29yZS9jbGFuZy9IT1NUX3g4Ni5tawppbmRleCAwNzIyYjJhLi4yODAzNTE3IDEwMDY0NAotLS0gYS9jb3JlL2NsYW5nL0hPU1RfeDg2Lm1rCisrKyBiL2NvcmUvY2xhbmcvSE9TVF94ODYubWsKQEAgLTEgKzEgQEAKLSQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KUhPU1RfTElCUFJPRklMRV9SVCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQucHJvZmlsZS1pNjg2LmEKKyQoY2xhbmdfMm5kX2FyY2hfcHJlZml4KUhPU1RfTElCUFJPRklMRV9SVCA6PSAkKExMVk1fUlRMSUJfUEFUSCkvbGliY2xhbmdfcnQucHJvZmlsZS1pMzg2LmEKZGlmZiAtLWdpdCBhL2NvcmUvY2xhbmcvY29uZmlnLm1rIGIvY29yZS9jbGFuZy9jb25maWcubWsKaW5kZXggMGU1OTkzMC4uNDA4ZjY4OCAxMDA2NDQKLS0tIGEvY29yZS9jbGFuZy9jb25maWcubWsKKysrIGIvY29yZS9jbGFuZy9jb25maWcubWsKQEAgLTcyLDYgKzcyLDcgQEAKICMgSU5URVJOQUxfTE9DQUxfQ0xBTkdfRVhDRVBUSU9OX1BST0pFQ1RTIGlzIGRlZmluZWQgbGF0ZXIgaW4gb3RoZXIgY29uZmlnLm1rLgogTE9DQUxfQ0xBTkdfRVhDRVBUSU9OX1BST0pFQ1RTID0gXAogICBiaW9uaWMvdGVzdHMvIFwKKyAgZGV2aWNlL2dvb2dsZS9jb250ZXh0aHViLyBcCiAgIGRldmljZS9odWF3ZWkvYW5nbGVyLyBcCiAgIGRldmljZS9sZ2UvYnVsbGhlYWQvIFwKICAgZXh0ZXJuYWwvZ2VudG9vL2ludGVncmF0aW9uLyBcCmRpZmYgLS1naXQgYS9jb3JlL2NsYW5nL3ZlcnNpb25zLm1rIGIvY29yZS9jbGFuZy92ZXJzaW9ucy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0NzNjZC4uMDAwMDAwMAotLS0gYS9jb3JlL2NsYW5nL3ZlcnNpb25zLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIyBDbGFuZy9MTFZNIHJlbGVhc2UgdmVyc2lvbnMuCi0KLUxMVk1fUFJFQlVJTFRTX1ZFUlNJT04gPz0gY2xhbmctNDA1MzU4NgotTExWTV9QUkVCVUlMVFNfQkFTRSA/PSBwcmVidWlsdHMvY2xhbmcvaG9zdApkaWZmIC0tZ2l0IGEvY29yZS9jbGVhbmJ1aWxkLm1rIGIvY29yZS9jbGVhbmJ1aWxkLm1rCmluZGV4IDBlMWM4OGQuLjU1NzY3ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xlYW5idWlsZC5taworKysgYi9jb3JlL2NsZWFuYnVpbGQubWsKQEAgLTEzLDggKzEzLDMyIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIERvbid0IGJvdGhlciB3aXRoIHRoZSBjbGVhbnNwZWNzIGlmIHlvdSBhcmUgcnVubmluZyBtbS9tbW0KLWlmZXEgKCQoT05FX1NIT1RfTUFLRUZJTEUpJChkb250X2JvdGhlcikkKE5PX0FORFJPSURfQ0xFQU5TUEVDKSwpCisjIEFic29sdXRlIHBhdGggb2YgdGhlIHByZXNlbnQgd29ya2luZyBkaXJlY290cnkuCisjIFRoaXMgb3ZlcnJpZGVzIHRoZSBzaGVsbCB2YXJpYWJsZSAkUFdELCB3aGljaCBkb2VzIG5vdCBuZWNlc3NhcmlseSBwb2ludHMgdG8KKyMgdGhlIHRvcCBvZiB0aGUgc291cmNlIHRyZWUsIGZvciBleGFtcGxlIHdoZW4gIm1ha2UgLUMiIGlzIHVzZWQgaW4gbS9tbS9tbW0uCitQV0QgOj0gJChzaGVsbCBwd2QpCisKK1RPUCA6PSAuCitUT1BESVIgOj0KKworQlVJTERfU1lTVEVNIDo9ICQoVE9QRElSKWJ1aWxkL21ha2UvY29yZQorCisjIFNldCB1cCB2YXJpb3VzIHN0YW5kYXJkIHZhcmlhYmxlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uCisjIGFuZCBob3N0IGluZm9ybWF0aW9uLgoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY29uZmlnLm1rCisKK2luY2x1ZGUgJChTT09OR19NQUtFVkFSU19NSykKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY2xhbmcvY29uZmlnLm1rCisKKyMgQ1RTLXNwZWNpZmljIGNvbmZpZy4KKy1pbmNsdWRlIGN0cy9idWlsZC9jb25maWcubWsKKyMgVlRTLXNwZWNpZmljIGNvbmZpZy4KKy1pbmNsdWRlIHRlc3QvdnRzL3Rvb2xzL3Z0cy10cmFkZWZlZC9idWlsZC9jb25maWcubWsKKyMgZGV2aWNlLXRlc3RzLXNwZWNpZmljLWNvbmZpZy4KKy1pbmNsdWRlIHRvb2xzL3RyYWRlZmVkZXJhdGlvbi9idWlsZC9zdWl0ZXMvZGV2aWNlLXRlc3RzL2NvbmZpZy5taworIyBnZW5lcmFsLXRlc3RzLXNwZWNpZmljLWNvbmZpZy4KKy1pbmNsdWRlIHRvb2xzL3RyYWRlZmVkZXJhdGlvbi9idWlsZC9zdWl0ZXMvZ2VuZXJhbC10ZXN0cy9jb25maWcubWsKIAogSU5URVJOQUxfQ0xFQU5fU1RFUFMgOj0KIApAQCAtMjQsNyArNDgsNyBAQAogIwogIyAkKDEpOiBzaGVsbCBjb21tYW5kIHRvIHJ1bgogIyAkKDIpOiBpbmRpY2F0ZSB0byBub3QgdXNlIG1ha2VmaWxlIHBhdGggYXMgcGFydCBvZiBzdGVwIGlkIGlmIG5vdCBlbXB0eS4KLSMgICAgICAgJCgyKSBzaG91bGQgb25seSBiZSB1c2VkIGluIGJ1aWxkL2NvcmUvY2xlYW5zcGVjLm1rOiBqdXN0IGZvciBjb21wYXRpYmlsaXR5LgorIyAgICAgICAkKDIpIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gYnVpbGQvbWFrZS9jb3JlL2NsZWFuc3BlYy5tazoganVzdCBmb3IgY29tcGF0aWJpbGl0eS4KIGRlZmluZSBfYWRkLWNsZWFuLXN0ZXAKICAgJChpZiAkKHN0cmlwICQoSU5URVJOQUxfQ0xFQU5fQlVJTERfVkVSU0lPTikpLCwgXAogICAgICAgJChlcnJvciBJTlRFUk5BTF9DTEVBTl9CVUlMRF9WRVJTSU9OIG5vdCBzZXQpKQpAQCAtNDMsNyArNjcsNyBAQAogICAkKGV2YWwgX2Fjc19tYWtlZmlsZV9wcmVmaXggOj0pCiBlbmRlZgogZGVmaW5lIGFkZC1jbGVhbi1zdGVwCi0kKGV2YWwgIyBmb3IgYnVpbGQvY29yZS9jbGVhbnNwZWMubWssIGRvbnQgdXNlIG1ha2VmaWxlIHBhdGggYXMgcGFydCBvZiBzdGVwIGlkKSBcCiskKGV2YWwgIyBmb3IgYnVpbGQvbWFrZS9jb3JlL2NsZWFuc3BlYy5taywgZG9udCB1c2UgbWFrZWZpbGUgcGF0aCBhcyBwYXJ0IG9mIHN0ZXAgaWQpIFwKICQoaWYgJChmaWx0ZXIgJS9jbGVhbnNwZWMubWssJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKSksXAogICAgICQoZXZhbCAkKGNhbGwgX2FkZC1jbGVhbi1zdGVwLCQoMSksdHJ1ZSkpLFwKICAgICAkKGV2YWwgJChjYWxsIF9hZGQtY2xlYW4tc3RlcCwkKDEpKSkpCkBAIC01OCw3ICs4Miw3IEBACiAKICMgSWYgdGhlIGNsZWFuX3N0ZXBzLm1rIGZpbGUgaXMgbWlzc2luZyAodXN1YWxseSBhZnRlciBhIGNsZWFuIGJ1aWxkKQogIyB0aGVuIHdlIHdvbid0IGRvIGFueXRoaW5nLgotQ1VSUkVOVF9DTEVBTl9CVUlMRF9WRVJTSU9OIDo9ICQoSU5URVJOQUxfQ0xFQU5fQlVJTERfVkVSU0lPTikKK0NVUlJFTlRfQ0xFQU5fQlVJTERfVkVSU0lPTiA6PSBNSVNTSU5HCiBDVVJSRU5UX0NMRUFOX1NURVBTIDo9ICQoSU5URVJOQUxfQ0xFQU5fU1RFUFMpCiAKICMgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBmcm9tIHRoZSBmaWxlLCBpZiBwcmVzZW50LgpAQCAtNjcsNyArOTEsOSBAQAogY2xlYW5fc3RlcHNfZmlsZSA6PSAkKFBST0RVQ1RfT1VUKS9jbGVhbl9zdGVwcy5tawogLWluY2x1ZGUgJChjbGVhbl9zdGVwc19maWxlKQogCi1pZm5lcSAoJChDVVJSRU5UX0NMRUFOX0JVSUxEX1ZFUlNJT04pLCQoSU5URVJOQUxfQ0xFQU5fQlVJTERfVkVSU0lPTikpCitpZmVxICgkKENVUlJFTlRfQ0xFQU5fQlVJTERfVkVSU0lPTiksTUlTU0lORykKKyAgIyBEbyBub3RoaW5nCitlbHNlIGlmbmVxICgkKENVUlJFTlRfQ0xFQU5fQlVJTERfVkVSU0lPTiksJChJTlRFUk5BTF9DTEVBTl9CVUlMRF9WRVJTSU9OKSkKICAgIyBUaGUgbWFqb3IgY2xlYW4gdmVyc2lvbiBpcyBvdXQtb2YtZGF0ZS4gIERvIGEgZnVsbCBjbGVhbiwgYW5kCiAgICMgZG9uJ3QgZXZlbiBib3RoZXIgd2l0aCB0aGUgY2xlYW4gc3RlcHMuCiAgICQoaW5mbyAqKiogQSBjbGVhbiBidWlsZCBpcyByZXF1aXJlZCBiZWNhdXNlIG9mIGEgcmVjZW50IGNoYW5nZS4pCkBAIC0xMDksNTcgKzEzNSwxOCBAQAogCiAjIFdyaXRlIHRoZSBuZXcgc3RhdGUgdG8gdGhlIGZpbGUuCiAjCi1yZXdyaXRlX2NsZWFuX3N0ZXBzX2ZpbGUgOj0KIGlmbmVxICgkKENVUlJFTlRfQ0xFQU5fQlVJTERfVkVSU0lPTiktJChDVVJSRU5UX0NMRUFOX1NURVBTKSwkKElOVEVSTkFMX0NMRUFOX0JVSUxEX1ZFUlNJT04pLSQoSU5URVJOQUxfQ0xFQU5fU1RFUFMpKQotcmV3cml0ZV9jbGVhbl9zdGVwc19maWxlIDo9IHRydWUKLWVuZGlmCi1pZmVxICgkKHdpbGRjYXJkICQoY2xlYW5fc3RlcHNfZmlsZSkpLCkKLSMgVGhpcyBpcyB0aGUgZmlyc3QgYnVpbGQuCi1yZXdyaXRlX2NsZWFuX3N0ZXBzX2ZpbGUgOj0gdHJ1ZQotZW5kaWYKLWlmZXEgKCQocmV3cml0ZV9jbGVhbl9zdGVwc19maWxlKSx0cnVlKQotJChzaGVsbCBcCi0gIG1rZGlyIC1wICQoZGlyICQoY2xlYW5fc3RlcHNfZmlsZSkpICYmIFwKLSAgZWNobyAiQ1VSUkVOVF9DTEVBTl9CVUlMRF9WRVJTSU9OIDo9ICQoSU5URVJOQUxfQ0xFQU5fQlVJTERfVkVSU0lPTikiID4gXAotICAgICAgJChjbGVhbl9zdGVwc19maWxlKSA7XAotICBlY2hvICJDVVJSRU5UX0NMRUFOX1NURVBTIDo9ICQod29yZGxpc3QgMSw1MDAsJChJTlRFUk5BTF9DTEVBTl9TVEVQUykpIiA+PiAkKGNsZWFuX3N0ZXBzX2ZpbGUpIFwKLSApCi1kZWZpbmUgLWNzLXdyaXRlLWNsZWFuLXN0ZXBzLWlmLWFyZzEtbm90LWVtcHR5Ci0kKGlmICQoMSksJChzaGVsbCBlY2hvICJDVVJSRU5UX0NMRUFOX1NURVBTICs9ICQoMSkiID4+ICQoY2xlYW5fc3RlcHNfZmlsZSkpKQotZW5kZWYKLSQoY2FsbCAtY3Mtd3JpdGUtY2xlYW4tc3RlcHMtaWYtYXJnMS1ub3QtZW1wdHksJCh3b3JkbGlzdCA1MDEsMTAwMCwkKElOVEVSTkFMX0NMRUFOX1NURVBTKSkpCi0kKGNhbGwgLWNzLXdyaXRlLWNsZWFuLXN0ZXBzLWlmLWFyZzEtbm90LWVtcHR5LCQod29yZGxpc3QgMTAwMSwxNTAwLCQoSU5URVJOQUxfQ0xFQU5fU1RFUFMpKSkKLSQoY2FsbCAtY3Mtd3JpdGUtY2xlYW4tc3RlcHMtaWYtYXJnMS1ub3QtZW1wdHksJCh3b3JkbGlzdCAxNTAxLDIwMDAsJChJTlRFUk5BTF9DTEVBTl9TVEVQUykpKQotJChjYWxsIC1jcy13cml0ZS1jbGVhbi1zdGVwcy1pZi1hcmcxLW5vdC1lbXB0eSwkKHdvcmRsaXN0IDIwMDEsMjUwMCwkKElOVEVSTkFMX0NMRUFOX1NURVBTKSkpCi0kKGNhbGwgLWNzLXdyaXRlLWNsZWFuLXN0ZXBzLWlmLWFyZzEtbm90LWVtcHR5LCQod29yZGxpc3QgMjUwMSwzMDAwLCQoSU5URVJOQUxfQ0xFQU5fU1RFUFMpKSkKLSQoY2FsbCAtY3Mtd3JpdGUtY2xlYW4tc3RlcHMtaWYtYXJnMS1ub3QtZW1wdHksJCh3b3JkbGlzdCAzMDAxLDk5OTk5LCQoSU5URVJOQUxfQ0xFQU5fU1RFUFMpKSkKKyQoc2hlbGwgbWtkaXIgLXAgJChkaXIgJChjbGVhbl9zdGVwc19maWxlKSkpCiskKGZpbGUgPiQoY2xlYW5fc3RlcHNfZmlsZSkudG1wLENVUlJFTlRfQ0xFQU5fQlVJTERfVkVSU0lPTiA6PSAkKElOVEVSTkFMX0NMRUFOX0JVSUxEX1ZFUlNJT04pJChuZXdsaW5lKUNVUlJFTlRfQ0xFQU5fU1RFUFMgOj0gJChJTlRFUk5BTF9DTEVBTl9TVEVQUykkKG5ld2xpbmUpKQorJChzaGVsbCBpZiAhIGNtcCAtcyAkKGNsZWFuX3N0ZXBzX2ZpbGUpLnRtcCAkKGNsZWFuX3N0ZXBzX2ZpbGUpOyB0aGVuIFwKKyAgICAgICAgICBtdiAkKGNsZWFuX3N0ZXBzX2ZpbGUpLnRtcCAkKGNsZWFuX3N0ZXBzX2ZpbGUpOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgIHJtICQoY2xlYW5fc3RlcHNfZmlsZSkudG1wOyBcCisgICAgICAgIGZpKQogZW5kaWYKIAogQ1VSUkVOVF9DTEVBTl9CVUlMRF9WRVJTSU9OIDo9CiBDVVJSRU5UX0NMRUFOX1NURVBTIDo9CiBjbGVhbl9zdGVwc19maWxlIDo9Ci1yZXdyaXRlX2NsZWFuX3N0ZXBzX2ZpbGUgOj0KIElOVEVSTkFMX0NMRUFOX1NURVBTIDo9CiBJTlRFUk5BTF9DTEVBTl9CVUlMRF9WRVJTSU9OIDo9Ci0KLWVuZGlmICAjIGlmIG5vdCBPTkVfU0hPVF9NQUtFRklMRSBkb250X2JvdGhlciBOT19BTkRST0lEX0NMRUFOU1BFQwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0uUEhPTlk6IGNsZWFuLWphY2stZmlsZXMKLWNsZWFuLWphY2stZmlsZXM6IGNsZWFuLWRleC1maWxlcwotCSQoaGlkZSkgZmluZCAkKE9VVF9ESVIpIC1uYW1lICIqLmphY2siIHwgeGFyZ3Mgcm0gLWYKLQkkKGhpZGUpIGZpbmQgJChPVVRfRElSKSAtdHlwZSBkIC1uYW1lICJqYWNrIiB8IHhhcmdzIHJtIC1yZgotCUBlY2hvICJBbGwgamFjayBmaWxlcyBoYXZlIGJlZW4gcmVtb3ZlZC4iCi0KLS5QSE9OWTogY2xlYW4tZGV4LWZpbGVzCi1jbGVhbi1kZXgtZmlsZXM6Ci0JJChoaWRlKSBmaW5kICQoT1VUX0RJUikgLW5hbWUgIiouZGV4IiAhIC1wYXRoICIqL2phY2staW5jcmVtZW50YWwvKiIgfCB4YXJncyBybSAtZgotCSQoaGlkZSkgZm9yIGkgaW4gYGZpbmQgJChPVVRfRElSKSAtbmFtZSAiKi5qYXIiIC1vIC1uYW1lICIqLmFwayJgIDsgZG8gKCh1bnppcCAtbCAkJGkgMj4gL2Rldi9udWxsIHwgXAotCQkJCWdyZXAgLXEgIlwuZGV4JCQiICYmIHJtIC1mICQkaSkgfHwgY29udGludWUgKSA7IGRvbmUKLQlAZWNobyAiQWxsIGRleCBmaWxlcyBhbmQgYXJjaGl2ZXMgY29udGFpbmluZyBkZXggZmlsZXMgaGF2ZSBiZWVuIHJlbW92ZWQuIgotCi0uUEhPTlk6IGNsZWFuLWphY2staW5jcmVtZW50YWwKLWNsZWFuLWphY2staW5jcmVtZW50YWw6Ci0JJChoaWRlKSBmaW5kICQoT1VUX0RJUikgLW5hbWUgImphY2staW5jcmVtZW50YWwiIC10eXBlIGQgfCB4YXJncyBybSAtcmYKLQlAZWNobyAiQWxsIGphY2sgaW5jcmVtZW50YWwgZGlycyBoYXZlIGJlZW4gcmVtb3ZlZC4iCmRpZmYgLS1naXQgYS9jb3JlL2NsZWFuc3BlYy5tayBiL2NvcmUvY2xlYW5zcGVjLm1rCmluZGV4IDQ0NDFlMmEuLmFmMjg5NTQgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xlYW5zcGVjLm1rCisrKyBiL2NvcmUvY2xlYW5zcGVjLm1rCkBAIC02NCw2ICs2NCw2IEBACiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiBzdWJkaXJfY2xlYW5zcGVjcyA6PSBcCi0gICAgJChzaGVsbCBidWlsZC90b29scy9maW5kbGVhdmVzLnB5ICQoRklORF9MRUFWRVNfRVhDTFVERVMpIC4gQ2xlYW5TcGVjLm1rKQorICAgICQoZmlsZSA8JChPVVRfRElSKS8ubW9kdWxlX3BhdGhzL0NsZWFuU3BlYy5tay5saXN0KQogaW5jbHVkZSAkKHN1YmRpcl9jbGVhbnNwZWNzKQogc3ViZGlyX2NsZWFuc3BlY3MgOj0KZGlmZiAtLWdpdCBhL2NvcmUvY2xlYXJfdmFycy5tayBiL2NvcmUvY2xlYXJfdmFycy5tawppbmRleCBhNjg3ODY2Li4yNzBhMTQwIDEwMDY0NAotLS0gYS9jb3JlL2NsZWFyX3ZhcnMubWsKKysrIGIvY29yZS9jbGVhcl92YXJzLm1rCkBAIC00LDggKzQsMTAgQEAKIAogIyAnJyx0cnVlCiBMT0NBTF8zMl9CSVRfT05MWTo9CitMT0NBTF9BQVBUMl9PTkxZOj0KIExPQ0FMX0FBUFRfRkxBR1M6PQogTE9DQUxfQUFQVF9JTkNMVURFX0FMTF9SRVNPVVJDRVM6PQorTE9DQUxfQUFQVF9OQU1FU1BBQ0VTOj0KIExPQ0FMX0FERElUSU9OQUxfQ0VSVElGSUNBVEVTOj0KIExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTOj0KIExPQ0FMX0FERElUSU9OQUxfSFRNTF9ESVI6PQpAQCAtMTQsNiArMTYsOCBAQAogTE9DQUxfQUxMT1dfVU5ERUZJTkVEX1NZTUJPTFM6PQogTE9DQUxfQU5OT1RBVElPTl9QUk9DRVNTT1JTOj0KIExPQ0FMX0FOTk9UQVRJT05fUFJPQ0VTU09SX0NMQVNTRVM6PQorTE9DQUxfQVBJRElGRl9ORVdBUEk6PQorTE9DQUxfQVBJRElGRl9PTERBUEk6PQogTE9DQUxfQVBLX0xJQlJBUklFUzo9CiBMT0NBTF9BUk1fTU9ERTo9CiBMT0NBTF9BU0ZMQUdTOj0KQEAgLTU0LDYgKzU4LDggQEAKIExPQ0FMX0RFWF9QUkVPUFRfSU1BR0VfTE9DQVRJT046PQogTE9DQUxfREVYX1BSRU9QVF9QUk9GSUxFX0NMQVNTX0xJU1RJTkc6PQogTE9DQUxfREVYX1BSRU9QVDo9ICMgJycsdHJ1ZSxmYWxzZSxub3N0cmlwcGluZworTE9DQUxfRElTQUJMRV9BVVRPX0dFTkVSQVRFX1RFU1RfQ09ORklHOj0KK0xPQ0FMX0RJU0FCTEVfUkVTT0xWRV9TVVBQT1JUX0xJQlJBUklFUzo9CiBMT0NBTF9ET05UX0NIRUNLX01PRFVMRTo9CiAjIERvbid0IGRlbGV0ZSB0aGUgTUVUQV9JTkYgZGlyIHdoZW4gbWVyZ2luZyBzdGF0aWMgSmF2YSBsaWJyYXJpZXMuCiBMT0NBTF9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkY6PQpAQCAtNzcsNiArODMsNyBAQAogTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTOj0KIExPQ0FMX0VYUE9SVF9IRUFERVJfTElCUkFSWV9IRUFERVJTOj0KIExPQ0FMX0VYUE9SVF9QQUNLQUdFX1JFU09VUkNFUzo9CitMT0NBTF9FWFBPUlRfUFJPR1VBUkRfRkxBR19GSUxFUzo9CiBMT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUzo9CiBMT0NBTF9FWFBPUlRfU1RBVElDX0xJQlJBUllfSEVBREVSUzo9CiBMT0NBTF9FWFRSQUNUX0FQSzo9CkBAIC04OCw2ICs5NSw3IEBACiBMT0NBTF9GVUxMX01BTklGRVNUX0ZJTEU6PQogTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVI6PQogTE9DQUxfRlVMTF9DTEFTU0VTX1BSRV9KQUNPQ09fSkFSOj0KK0xPQ0FMX0ZVWlpfRU5HSU5FOj0KIExPQ0FMX0dDTk9fRklMRVM6PQogTE9DQUxfR0VORVJBVEVEX1NPVVJDRVM6PQogIyBHcm91cCBzdGF0aWMgbGlicmFyaWVzIHdpdGggIi1XbCwtLXN0YXJ0LWdyb3VwIiBhbmQgIi1XbCwtLWVuZC1ncm91cCIgd2hlbiBsaW5raW5nLgpAQCAtOTUsNiArMTAzLDcgQEAKIExPQ0FMX0dURVNUOj10cnVlCiBMT0NBTF9IQUxfU1RBVElDX0xJQlJBUklFUzo9CiBMT0NBTF9IRUFERVJfTElCUkFSSUVTOj0KK0xPQ0FMX0hPU1RfUkVRVUlSRURfTU9EVUxFUzo9CiBMT0NBTF9JTklUX1JDOj0KIExPQ0FMX0lOU1RBTExFRF9NT0RVTEU6PQogTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNOj0KQEAgLTEyMSwxMSArMTMwLDEzIEBACiBMT0NBTF9KQVJfUFJPQ0VTU09SOj0KIExPQ0FMX0pBUl9QUk9DRVNTT1JfQVJHUzo9CiBMT0NBTF9KQVZBQ0ZMQUdTOj0KK0xPQ0FMX0pBVkFDX1NIQVJEX1NJWkU6PQogTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OOj0KIExPQ0FMX0pBVkFfTEFZRVJTX0ZJTEU6PQogTE9DQUxfSkFWQV9MSUJSQVJJRVM6PQogTE9DQUxfSkFWQV9SRVNPVVJDRV9ESVJTOj0KIExPQ0FMX0pBVkFfUkVTT1VSQ0VfRklMRVM6PQorTE9DQUxfSkVUSUZJRVJfRU5BQkxFRDo9CiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUzo9CiBMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFU19BQkk6PQogTE9DQUxfTERGTEFHUzo9CkBAIC0xNzgsNiArMTg5LDcgQEAKIExPQ0FMX1BBQ0tBR0VfTkFNRTo9CiBMT0NBTF9QQUNLQUdFX1NQTElUUzo9CiBMT0NBTF9QQUNLX01PRFVMRV9SRUxPQ0FUSU9OUzo9CitMT0NBTF9QQVRDSF9NT0RVTEU6PQogTE9DQUxfUElDS1VQX0ZJTEVTOj0KIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQ6PQogTE9DQUxfUE9TVF9MSU5LX0NNRDo9CkBAIC0xOTAsOCArMjAyLDEwIEBACiBMT0NBTF9QUkVCVUlMVF9PQkpfRklMRVM6PQogTE9DQUxfUFJFQlVJTFRfU1RBVElDX0pBVkFfTElCUkFSSUVTOj0KIExPQ0FMX1BSRUJVSUxUX1NUUklQX0NPTU1FTlRTOj0KK0xPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUzo9CiBMT0NBTF9QUklWSUxFR0VEX01PRFVMRTo9Ci0jICcnLGZ1bGwsY3VzdG9tLG5vc3lzdGVtLGRpc2FibGVkLG9iZnVzY2F0aW9uLG9wdGltaXphdGlvbgorIyAnJyxmdWxsLGN1c3RvbSxkaXNhYmxlZCxvYmZ1c2NhdGlvbixvcHRpbWl6YXRpb24KK0xPQ0FMX1BST0RVQ1RfTU9EVUxFOj0KIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQ6PQogTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUzo9CiBMT0NBTF9QUk9HVUFSRF9GTEFHUzo9CkBAIC0yMDAsNiArMjE0LDcgQEAKICMgbGl0ZShkZWZhdWx0KSxtaWNybyxuYW5vLHN0cmVhbSxmdWxsLG5hbm9wYi1jLG5hbm9wYi1jLWVuYWJsZV9tYWxsb2MKIExPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFOj0KIExPQ0FMX1BST1RPX0pBVkFfT1VUUFVUX1BBUkFNUzo9CitMT0NBTF9SOF9GTEFHX0ZJTEVTOj0KIExPQ0FMX1JFQ09SREVEX01PRFVMRV9UWVBFOj0KIExPQ0FMX1JFTkRFUlNDUklQVF9DQzo9CiBMT0NBTF9SRU5ERVJTQ1JJUFRfQ09NUEFUSUJJTElUWTo9CkBAIC0yMjQsMTYgKzIzOSwyOCBAQAogTE9DQUxfU0RLX1ZFUlNJT046PQogTE9DQUxfU0hBUkVEX0FORFJPSURfTElCUkFSSUVTOj0KIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PQorTE9DQUxfU09PTkdfQ0xBU1NFU19KQVIgOj0KK0xPQ0FMX1NPT05HX0RFWF9KQVIgOj0KK0xPQ0FMX1NPT05HX0hFQURFUl9KQVIgOj0KK0xPQ0FMX1NPT05HX0pBQ09DT19SRVBPUlRfQ0xBU1NFU19KQVIgOj0KK0xPQ0FMX1NPT05HX1BST0dVQVJEX0RJQ1QgOj0KK0xPQ0FMX1NPT05HX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFIDo9CitMT0NBTF9TT09OR19SUk9fRElSUyA6PQorTE9DQUxfRFJPSURET0NfU1RVQlNfSkFSIDo9CitMT0NBTF9EUk9JRERPQ19ET0NfWklQIDo9CiAjICcnLHRydWUKIExPQ0FMX1NPVVJDRV9GSUxFU19BTExfR0VORVJBVEVEOj0KIExPQ0FMX1NSQ19GSUxFUzo9CiBMT0NBTF9TUkNfRklMRVNfRVhDTFVERTo9CitMT0NBTF9TUkNKQVJTOj0KIExPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUzo9CiBMT0NBTF9TVEFUSUNfSkFWQV9BQVJfTElCUkFSSUVTOj0KIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUzo9CiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTOj0KIExPQ0FMX1NUUklQX01PRFVMRTo9CiBMT0NBTF9TWVNURU1fU0hBUkVEX0xJQlJBUklFUzo9bm9uZQorTE9DQUxfVEFSR0VUX1JFUVVJUkVEX01PRFVMRVM6PQorTE9DQUxfVEVTVF9DT05GSUdfT1BUSU9OUzo9CiBMT0NBTF9URVNUX0RBVEE6PQogTE9DQUxfVEVTVF9NT0RVTEVfVE9fUFJPR1VBUkRfV0lUSDo9CiBMT0NBTF9USURZOj0KQEAgLTQxOCw2ICs0NDUsMTMgQEAKIExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVNfMzI6PQogTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFU182NDo9CiAKKyMgUm9ib2xlY3RyaWMgdmFyaWFibGVzCitMT0NBTF9JTlNUUlVNRU5UX1NPVVJDRV9ESVJTIDo9CitMT0NBTF9ST0JPVEVTVF9GQUlMVVJFX0ZBVEFMIDo9CitMT0NBTF9ST0JPVEVTVF9GSUxFUyA6PQorTE9DQUxfUk9CT1RFU1RfVElNRU9VVCA6PQorTE9DQUxfVEVTVF9QQUNLQUdFIDo9CisKICMgQXV4IHNwZWNpZmljIHZhcmlhYmxlcwogTE9DQUxfQVVYX0FSQ0ggOj0KIExPQ0FMX0FVWF9DUFUgOj0KZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vVEFSR0VUX2xpbnV4LWFybS5tayBiL2NvcmUvY29tYm8vVEFSR0VUX2xpbnV4LWFybS5tawppbmRleCAyZTE3OWY2Li4wMWNmM2Y1IDEwMDY0NAotLS0gYS9jb3JlL2NvbWJvL1RBUkdFVF9saW51eC1hcm0ubWsKKysrIGIvY29yZS9jb21iby9UQVJHRVRfbGludXgtYXJtLm1rCkBAIC0yOSw4ICsyOSwyOCBAQAogIyBpbmNsdWRlIGRlZmluZXMsIGFuZCBjb21waWxlciBzZXR0aW5ncyBmb3IgdGhlIGdpdmVuIGFyY2hpdGVjdHVyZQogIyB2ZXJzaW9uLgogIworaWZlcSAoJChzdHJpcCAkKFRBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClDUFVfVkFSSUFOVCkpLCkKK1RBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClDUFVfVkFSSUFOVCA6PSBnZW5lcmljCitlbmRpZgorCitLTk9XTl9BUk12OF9DT1JFUyA6PSBjb3J0ZXgtYTUzIGNvcnRleC1hNTMuYTU3IGNvcnRleC1hNzMKK0tOT1dOX0FSTXY4X0NPUkVTICs9IGtyeW8gZGVudmVyNjQgZXh5bm9zLW0xIGV4eW5vcy1tMgorCisjIE1hbnkgZGV2aWNlcyAoaW5jb3JyZWN0bHkpIHVzZSBhcm12Ny1hLW5lb24gYXMgdGhlIDJuZCBhcmNoaXRlY3R1cmUgdmFyaWFudAorIyBmb3IgY29yZXMgdGhhdCBpbXBsZW1lbnQgYXJtdjgtYSBJU0FzLiBUaGUgZm9sbG93aW5nIHNldHMgaXQgdG8gYXJtdjgtYS4KK2lmbmVxICgsJChmaWx0ZXIgJChUQVJHRVRfJChjb21ib18ybmRfYXJjaF9wcmVmaXgpQ1BVX1ZBUklBTlQpLCAkKEtOT1dOX0FSTXY4X0NPUkVTKSkpCisgIGlmbmVxICgkKFRBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIX1ZBUklBTlQpLGFybXY4LWEpCisgICAgJCh3YXJuaW5nICQoVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUNQVV9WQVJJQU5UKSBpcyBhcm12OC1hLikKKyAgICBpZm5lcSAoLCQoVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUFSQ0hfVkFSSUFOVCkpCisgICAgICAkKHdhcm5pbmcgVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUFSQ0hfVkFSSUFOVCwgJChUQVJHRVRfJChjb21ib18ybmRfYXJjaF9wcmVmaXgpQVJDSF9WQVJJQU5UKSwgaWdub3JlZCEgVXNlIGFybXY4LWEgaW5zdGVhZC4pCisgICAgZW5kaWYKKyAgICAjIE92ZXJ3cml0ZSBUQVJHRVRfJChjb21ib18ybmRfYXJjaF9wcmVmaXgpQVJDSF9WQVJJQU5UCisgICAgVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUFSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCisgIGVuZGlmCitlbmRpZgorCiBpZmVxICgkKHN0cmlwICQoVEFSR0VUXyQoY29tYm9fMm5kX2FyY2hfcHJlZml4KUFSQ0hfVkFSSUFOVCkpLCkKLVRBUkdFVF8kKGNvbWJvXzJuZF9hcmNoX3ByZWZpeClBUkNIX1ZBUklBTlQgOj0gYXJtdjV0ZQorJChlcnJvciBUQVJHRVRfJChjb21ib18ybmRfYXJjaF9wcmVmaXgpQVJDSF9WQVJJQU5UIG11c3QgYmUgc2V0KQogZW5kaWYKIAogVEFSR0VUX0FSQ0hfU1BFQ0lGSUNfTUFLRUZJTEUgOj0gJChCVUlMRF9DT01CT1MpL2FyY2gvJChUQVJHRVRfJChjb21ib18ybmRfYXJjaF9wcmVmaXgpQVJDSCkvJChUQVJHRVRfJChjb21ib18ybmRfYXJjaF9wcmVmaXgpQVJDSF9WQVJJQU5UKS5tawpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9hcmNoL2FybS9hcm12NXRlLXZmcC5tayBiL2NvcmUvY29tYm8vYXJjaC9hcm0vYXJtdjV0ZS12ZnAubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Mjk5YWMuLjAwMDAwMDAKLS0tIGEvY29yZS9jb21iby9hcmNoL2FybS9hcm12NXRlLXZmcC5taworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBBdCB0aGUgbW9tZW50LCB1c2UgdGhlIHNhbWUgc2V0dGluZ3MgdGhhbiB0aGUgb25lCi0jIGZvciBhcm12NXRlLCBzaW5jZSBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IGFybXY1dGUtdmZwCi0jIHdpbGwgb25seSBiZSB1c2VkIHRvIHNlbGVjdCBhbiBvcHRpbWl6ZWQgVkZQLWNhcGFibGUgYXNzZW1ibHkKLSMgaW50ZXJwcmV0ZXIgbG9vcCBmb3IgRGFsdmlrLgotIwotaW5jbHVkZSAkKEJVSUxEX0NPTUJPUykvYXJjaC9hcm0vYXJtdjV0ZS5tawotCmRpZmYgLS1naXQgYS9jb3JlL2NvbWJvL2FyY2gvYXJtL2FybXY1dGUubWsgYi9jb3JlL2NvbWJvL2FyY2gvYXJtL2FybXY1dGUubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzU2OTUuLjAwMDAwMDAKLS0tIGEvY29yZS9jb21iby9hcmNoL2FybS9hcm12NXRlLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIENvbmZpZ3VyYXRpb24gZm9yIExpbnV4IG9uIEFSTS4KLSMgR2VuZXJhdGluZyBiaW5hcmllcyBmb3IgdGhlIEFSTXY1VEUgYXJjaGl0ZWN0dXJlIGFuZCBoaWdoZXIKLSMKLQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9hcmNoL2FybS9hcm12OC1hLm1rIGIvY29yZS9jb21iby9hcmNoL2FybS9hcm12OC1hLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjVjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2NvbWJvL2FyY2gvYXJtL2FybXY4LWEubWsKQEAgLTAsMCArMSw5IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIExpbnV4IG9uIEFSTS4KKyMgR2VuZXJhdGluZyBiaW5hcmllcyBmb3IgdGhlIEFSTXY4LWEgYXJjaGl0ZWN0dXJlCisjCisjIE1hbnkgbGlicmFyaWVzIGFyZSBub3QgYXdhcmUgb2YgYXJtdjgtYSwgYW5kIEFBcmNoMzIgaXMgKGFsbW9zdCkgYSBzdXBlcnNldAorIyBvZiBhcm12Ny1hLW5lb24uIFNvIGp1c3QgbGV0IHRoZW0gdGhpbmsgd2UgYXJlIGp1c3QgbGlrZSB2Ny4KK0FSQ0hfQVJNX0hBVkVfQVJNVjdBICAgICAgICAgICAgOj0gdHJ1ZQorQVJDSF9BUk1fSEFWRV9WRlAgICAgICAgICAgICAgICA6PSB0cnVlCitBUkNIX0FSTV9IQVZFX1ZGUF9EMzIgICAgICAgICAgIDo9IHRydWUKK0FSQ0hfQVJNX0hBVkVfTkVPTiAgICAgICAgICAgICAgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9hcmNoL3g4Ni9hdG9tLm1rIGIvY29yZS9jb21iby9hcmNoL3g4Ni9hdG9tLm1rCmluZGV4IGQzMTNhOWEuLjQzYTE3MGMgMTAwNjQ0Ci0tLSBhL2NvcmUvY29tYm8vYXJjaC94ODYvYXRvbS5taworKysgYi9jb3JlL2NvbWJvL2FyY2gveDg2L2F0b20ubWsKQEAgLTIsNyArMiw3IEBACiAjICd4ODYtYXRvbScgYXJjaCB2YXJpYW50LiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgJ3g4NicgYmFzZSB2YXJpYW50CiAjIHRoYXQgYWRkcyBBdG9tLXNwZWNpZmljIGZlYXR1cmVzLgogIwotIyBTZWUgYnVpbGQvY29yZS9jb21iby9hcmNoL3g4Ni94ODYubWsgZm9yIGRpZmZlcmVuY2VzLgorIyBTZWUgYnVpbGQvbWFrZS9jb3JlL2NvbWJvL2FyY2gveDg2L3g4Ni5tayBmb3IgZGlmZmVyZW5jZXMuCiAjCiBBUkNIX1g4Nl9IQVZFX1NTU0UzIDo9IHRydWUKIEFSQ0hfWDg2X0hBVkVfTU9WQkUgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9hcmNoL3g4Ni9zaWx2ZXJtb250Lm1rIGIvY29yZS9jb21iby9hcmNoL3g4Ni9zaWx2ZXJtb250Lm1rCmluZGV4IDcwYjcxOGMuLmNiYTEwNzkgMTAwNjQ0Ci0tLSBhL2NvcmUvY29tYm8vYXJjaC94ODYvc2lsdmVybW9udC5taworKysgYi9jb3JlL2NvbWJvL2FyY2gveDg2L3NpbHZlcm1vbnQubWsKQEAgLTEsNyArMSw3IEBACiAjIFRoaXMgZmlsZSBjb250YWlucyBmZWF0dXJlIG1hY3JvIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZQogIyBzaWx2ZXJtb250IGFyY2ggdmFyaWFudC4KICMKLSMgU2VlIGJ1aWxkL2NvcmUvY29tYm8vYXJjaC94ODYveDg2LWF0b20ubWsgZm9yIGRpZmZlcmVuY2VzLgorIyBTZWUgYnVpbGQvbWFrZS9jb3JlL2NvbWJvL2FyY2gveDg2L3g4Ni1hdG9tLm1rIGZvciBkaWZmZXJlbmNlcy4KICMKIAogQVJDSF9YODZfSEFWRV9TU1NFMyAgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9hcmNoL3g4Nl82NC9zaWx2ZXJtb250Lm1rIGIvY29yZS9jb21iby9hcmNoL3g4Nl82NC9zaWx2ZXJtb250Lm1rCmluZGV4IDcwYjcxOGMuLmNiYTEwNzkgMTAwNjQ0Ci0tLSBhL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvc2lsdmVybW9udC5taworKysgYi9jb3JlL2NvbWJvL2FyY2gveDg2XzY0L3NpbHZlcm1vbnQubWsKQEAgLTEsNyArMSw3IEBACiAjIFRoaXMgZmlsZSBjb250YWlucyBmZWF0dXJlIG1hY3JvIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZQogIyBzaWx2ZXJtb250IGFyY2ggdmFyaWFudC4KICMKLSMgU2VlIGJ1aWxkL2NvcmUvY29tYm8vYXJjaC94ODYveDg2LWF0b20ubWsgZm9yIGRpZmZlcmVuY2VzLgorIyBTZWUgYnVpbGQvbWFrZS9jb3JlL2NvbWJvL2FyY2gveDg2L3g4Ni1hdG9tLm1rIGZvciBkaWZmZXJlbmNlcy4KICMKIAogQVJDSF9YODZfSEFWRV9TU1NFMyAgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9qYXZhYy5tayBiL2NvcmUvY29tYm8vamF2YWMubWsKaW5kZXggNWMyNjY4Yy4uZGFjMjYyOCAxMDA2NDQKLS0tIGEvY29yZS9jb21iby9qYXZhYy5taworKysgYi9jb3JlL2NvbWJvL2phdmFjLm1rCkBAIC0xLDUzICsxLDE5IEBACiAjIFNlbGVjdHMgYSBKYXZhIGNvbXBpbGVyLgogIwotIyBJbnB1dHM6Ci0jCUNVU1RPTV9KQVZBX0NPTVBJTEVSIC0tICJlY2xpcHNlIiwgIm9wZW5qZGsiLiBvciBub3RoaW5nIGZvciB0aGUgc3lzdGVtCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdAotIwlBTFRFUk5BVEVfSkFWQUMgLS0gdGhlIGFsdGVybmF0ZSBqYXZhIGNvbXBpbGVyIHRvIHVzZQotIwogIyBPdXRwdXRzOgotIyAgIENPTU1PTl9KQVZBQyAtLSBKYXZhIGNvbXBpbGVyIGNvbW1hbmQgd2l0aCBjb21tb24gYXJndW1lbnRzCisjICAgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTiAtLSBEaXJlY3RvcnkgdGhhdCBjb250YWlucyBqYXZhYyBhbmQgb3RoZXIgamF2YSB0b29scwogIwogCi1pZm5kZWYgQU5EUk9JRF9DT01QSUxFX1dJVEhfSkFDSwotIyBEZWZpbmVzIGlmIGNvbXBpbGF0aW9uIHdpdGggamFjayBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi1BTkRST0lEX0NPTVBJTEVfV0lUSF9KQUNLIDo9IHRydWUKK0FORFJPSURfQ09NUElMRV9XSVRIX0pBQ0sgOj0gZmFsc2UKKworaWZkZWYgVEFSR0VUX0JVSUxEX0FQUFMKKyAgaWZuZGVmIFRVUkJJTkVfRU5BQkxFRAorICAgIFRVUkJJTkVfRU5BQkxFRCA6PSBmYWxzZQorICBlbmRpZgogZW5kaWYKIAotY29tbW9uX2pka19mbGFncyA6PSAtWG1heGVycnMgOTk5OTk5OQorQU5EUk9JRF9KQVZBX1RPT0xDSEFJTiA6PSAkKEFORFJPSURfSkFWQV9IT01FKS9iaW4KIAotIyBVc2UgdGhlIGluZGV4ZXIgd3JhcHBlciB0byBpbmRleCB0aGUgY29kZWJhc2UgaW5zdGVhZCBvZiB0aGUgamF2YWMgY29tcGlsZXIKLWlmZXEgKCQoQUxURVJOQVRFX0pBVkFDKSwpCi1KQVZBQ0MgOj0gamF2YWMKLWVsc2UKLUpBVkFDQyA6PSAkKEFMVEVSTkFURV9KQVZBQykKLWVuZGlmCi0KLUpBVkEgOj0gamF2YQotSkFWQURPQyA6PSBqYXZhZG9jCi1KQVIgOj0gamFyCi0KLSMgVGhlIGFjdHVhbCBjb21waWxlciBjYW4gYmUgd3JhcHBlZCBieSBzZXR0aW5nIHRoZSBKQVZBQ19XUkFQUEVSIHZhci4KLWlmZGVmIEpBVkFDX1dSQVBQRVIKLSAgICBpZm5lcSAoJChKQVZBQ19XUkFQUEVSKSwkKGZpcnN0d29yZCAkKEpBVkFDQykpKQotICAgICAgICBKQVZBQ0MgOj0gJChKQVZBQ19XUkFQUEVSKSAkKEpBVkFDQykKLSAgICBlbmRpZgotZW5kaWYKLQotIyBXaGF0ZXZlciBjb21waWxlciBpcyBvbiB0aGlzIHN5c3RlbS4KLUNPTU1PTl9KQVZBQyA6PSAkKEpBVkFDQykgLUotWG14MjA0OE0gJChjb21tb25famRrX2ZsYWdzKQotCi0jIEVjbGlwc2UuCi1pZmVxICgkKENVU1RPTV9KQVZBX0NPTVBJTEVSKSwgZWNsaXBzZSkKLSAgICBDT01NT05fSkFWQUMgOj0gamF2YSAtWG14MjU2bSAtamFyIHByZWJ1aWx0L2NvbW1vbi9lY2ovZWNqLmphciAtNSBcCi0gICAgICAgIC1tYXhQcm9ibGVtcyA5OTk5OTk5IC1ub3dhcm4KLSAgICAkKGluZm8gQ1VTVE9NX0pBVkFfQ09NUElMRVI9ZWNsaXBzZSkKLWVuZGlmCi0KLUdMT0JBTF9KQVZBQ19ERUJVR19GTEFHUyA6PSAtZwotCi1IT1NUX0pBVkFDID89ICQoQ09NTU9OX0pBVkFDKQotVEFSR0VUX0pBVkFDID89ICQoQ09NTU9OX0pBVkFDKQotCi0jJChpbmZvIEhPU1RfSkFWQUM9JChIT1NUX0pBVkFDKSkKLSMkKGluZm8gVEFSR0VUX0pBVkFDPSQoVEFSR0VUX0pBVkFDKSkKKyMgVE9ETyhjY3Jvc3MpOiByZW1vdmUgdGhpcywgaXQgaXMgbmVlZGVkIGZvciBub3cgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5CisjIGNvbmZpZy5tayBiZWZvcmUgbWFrZXZhcnMgZnJvbSBzb29uZyBhcmUgbG9hZGVkCitKQVZBIDo9ICQoQU5EUk9JRF9KQVZBX1RPT0xDSEFJTikvamF2YQpkaWZmIC0tZ2l0IGEvY29yZS9jb21iby9zZWxlY3QubWsgYi9jb3JlL2NvbWJvL3NlbGVjdC5tawppbmRleCA1ZTE4MWI5Li5lYWI0YzcyIDEwMDY0NAotLS0gYS9jb3JlL2NvbWJvL3NlbGVjdC5taworKysgYi9jb3JlL2NvbWJvL3NlbGVjdC5tawpAQCAtMjgsNyArMjgsNyBAQAogCiAjIFNldCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciB0aGUgdmFyaW91cyB2YXJpYWJsZXMKIAotJChjb21ib192YXJfcHJlZml4KUdMT0JBTF9BUkZMQUdTIDo9IGNyc1BECiskKGNvbWJvX3Zhcl9wcmVmaXgpR0xPQkFMX0FSRkxBR1MgOj0gY3FzRCAtZm9ybWF0PWdudQogCiAkKGNvbWJvX3Zhcl9wcmVmaXgpU1RBVElDX0xJQl9TVUZGSVggOj0gLmEKIApkaWZmIC0tZ2l0IGEvY29yZS9jb25maWcubWsgYi9jb3JlL2NvbmZpZy5tawppbmRleCBjYzJiMmFmLi45MTc3MjlhIDEwMDY0NAotLS0gYS9jb3JlL2NvbmZpZy5taworKysgYi9jb3JlL2NvbmZpZy5tawpAQCAtMyw2ICszLDIwIEBACiAjIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgcGxhdGZvcm0sIHdoaWNoCiAjIGFyZSBub3Qgc3BlY2lmaWMgdG8gd2hhdCBpcyBiZWluZyBidWlsdC4KIAoraWZuZGVmIEtBVEkKKyQod2FybmluZyBEaXJlY3RseSB1c2luZyBjb25maWcubWsgZnJvbSBtYWtlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuKQorJCh3YXJuaW5nICkKKyQod2FybmluZyBJZiB5b3UgYXJlIGp1c3QgYXR0ZW1wdGluZyB0byBidWlsZCwgeW91IHByb2JhYmx5IG5lZWQgdG8gcmUtc291cmNlIGVudnNldHVwLnNoOikKKyQod2FybmluZyApCiskKHdhcm5pbmcgJCQgc291cmNlIGJ1aWxkL2VudnNldHVwLnNoKQorJCh3YXJuaW5nICkKKyQod2FybmluZyBJZiB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gZW11bGF0ZSBnZXRfYnVpbGRfdmFyLCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmc6KQorJCh3YXJuaW5nICQkIGJ1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1kdW1wdmFyLW1vZGUpCiskKHdhcm5pbmcgJCQgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXJzLW1vZGUpCiskKHdhcm5pbmcgKQorJChlcnJvciBkb25lKQorZW5kaWYKKwogIyBPbmx5IHVzZSBBTkRST0lEX0JVSUxEX1NIRUxMIHRvIHdyYXAgYXJvdW5kIGJhc2guCiAjIERPIE5PVCB1c2Ugb3RoZXIgc2hlbGxzIHN1Y2ggYXMgenNoLgogaWZkZWYgQU5EUk9JRF9CVUlMRF9TSEVMTApAQCAtNDQsMTcgKzU4LDI3IEBACiAjIElmIGEgcnVsZSBmYWlscywgZGVsZXRlICRALgogLkRFTEVURV9PTl9FUlJPUjoKIAotIyBDaGVjayBmb3IgYnJva2VuIHZlcnNpb25zIG9mIG1ha2UuCi1pZm5kZWYgS0FUSQotaWZuZXEgKDEsJChzdHJpcCAkKHNoZWxsIGV4cHIgJChNQUtFX1ZFUlNJT04pIFw+PSAzLjgxKSkpCi0kKHdhcm5pbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopCi0kKHdhcm5pbmcgKiAgWW91IGFyZSB1c2luZyB2ZXJzaW9uICQoTUFLRV9WRVJTSU9OKSBvZiBtYWtlLikKLSQod2FybmluZyAqICBBbmRyb2lkIGNhbiBvbmx5IGJlIGJ1aWx0IGJ5IHZlcnNpb25zIDMuODEgYW5kIGhpZ2hlci4pCi0kKHdhcm5pbmcgKiAgc2VlIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL3NvdXJjZS9kb3dubG9hZC5odG1sKQotJCh3YXJuaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKQotJChlcnJvciBzdG9wcGluZykKLWVuZGlmCi1lbmRpZgorIyBNYXJrIHZhcmlhYmxlcyBkZXByZWNhdGVkL29ic29sZXRlCitDSEFOR0VTX1VSTCA6PSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9idWlsZC8rL21hc3Rlci9DaGFuZ2VzLm1kCiskKEtBVElfb2Jzb2xldGVfdmFyIFBBVEgsRG8gbm90IHVzZSBQQVRIIGRpcmVjdGx5LiBTZWUgJChDSEFOR0VTX1VSTCkjUEFUSCkKKyQoS0FUSV9vYnNvbGV0ZV92YXIgUFlUSE9OUEFUSCxEbyBub3QgdXNlIFBZVEhPTlBBVEggZGlyZWN0bHkuIFNlZSAkKENIQU5HRVNfVVJMKSNQWVRIT05QQVRIKQorJChLQVRJX29ic29sZXRlX3ZhciBPVVQsVXNlIE9VVF9ESVIgaW5zdGVhZC4gU2VlICQoQ0hBTkdFU19VUkwpI09VVCkKKyQoS0FUSV9vYnNvbGV0ZV92YXIgQU5EUk9JRF9IT1NUX09VVCxVc2UgSE9TVF9PVVQgaW5zdGVhZC4gU2VlICQoQ0hBTkdFU19VUkwpI0FORFJPSURfSE9TVF9PVVQpCiskKEtBVElfb2Jzb2xldGVfdmFyIEFORFJPSURfUFJPRFVDVF9PVVQsVXNlIFBST0RVQ1RfT1VUIGluc3RlYWQuIFNlZSAkKENIQU5HRVNfVVJMKSNBTkRST0lEX1BST0RVQ1RfT1VUKQorJChLQVRJX29ic29sZXRlX3ZhciBBTkRST0lEX0hPU1RfT1VUX1RFU1RDQVNFUyxVc2UgSE9TVF9PVVRfVEVTVENBU0VTIGluc3RlYWQuIFNlZSAkKENIQU5HRVNfVVJMKSNBTkRST0lEX0hPU1RfT1VUX1RFU1RDQVNFUykKKyQoS0FUSV9vYnNvbGV0ZV92YXIgQU5EUk9JRF9UQVJHRVRfT1VUX1RFU1RDQVNFUyxVc2UgVEFSR0VUX09VVF9URVNUQ0FTRVMgaW5zdGVhZC4gU2VlICQoQ0hBTkdFU19VUkwpI0FORFJPSURfVEFSR0VUX09VVF9URVNUQ0FTRVMpCiskKEtBVElfb2Jzb2xldGVfdmFyIEFORFJPSURfQlVJTERfVE9QLFVzZSAnLicgaW5zdGVhZC4gU2VlICQoQ0hBTkdFU19VUkwpI0FORFJPSURfQlVJTERfVE9QKQorJChLQVRJX29ic29sZXRlX3ZhciBcCisgIEFORFJPSURfVE9PTENIQUlOIFwKKyAgQU5EUk9JRF9UT09MQ0hBSU5fMk5EX0FSQ0ggXAorICBBTkRST0lEX0RFVl9TQ1JJUFRTIFwKKyAgQU5EUk9JRF9FTVVMQVRPUl9QUkVCVUlMVFMgXAorICBBTkRST0lEX1BSRV9CVUlMRF9QQVRIUyBcCisgICxTZWUgJChDSEFOR0VTX1VSTCkjb3RoZXJfZW52c2V0dXBfdmFyaWFibGVzKQorJChLQVRJX29ic29sZXRlX3ZhciBQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMX09WRVJSSURFLFNldCBGQ00gVmVyc2lvbiBpbiBkZXZpY2UgbWFuaWZlc3QgaW5zdGVhZC4gU2VlICQoQ0hBTkdFU19VUkwpI1BST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUxfT1ZFUlJJREUpCiskKEtBVElfb2Jzb2xldGVfdmFyIFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCxDbGFuZyBpcyB0aGUgb25seSBzdXBwb3J0ZWQgQW5kcm9pZCBjb21waWxlci4gU2VlICQoQ0hBTkdFU19VUkwpI1VTRV9DTEFOR19QTEFURk9STV9CVUlMRCkKKworQ0hBTkdFU19VUkwgOj0KIAogIyBVc2VkIHRvIGZvcmNlIGdvYWxzIHRvIGJ1aWxkLiAgT25seSB1c2UgZm9yIGNvbmRpdGlvbmFsbHkgZGVmaW5lZCBnb2Fscy4KIC5QSE9OWTogRk9SQ0UKQEAgLTYyLDE0ICs4NiwxMCBAQAogCiBPUklHSU5BTF9NQUtFQ01ER09BTFMgOj0gJChNQUtFQ01ER09BTFMpCiAKLSMgVGVsbCBweXRob24gbm90IHRvIHNwYW0gdGhlIHNvdXJjZSB0cmVlIHdpdGggLnB5YyBmaWxlcy4gIFRoaXMKLSMgb25seSBoYXMgYW4gZWZmZWN0IG9uIHB5dGhvbiAyLjYgYW5kIGFib3ZlLgotZXhwb3J0IFBZVEhPTkRPTlRXUklURUJZVEVDT0RFIDo9IDEKK2Rpc3RfZ29hbCA6PSAkKHN0cmlwICQoZmlsdGVyIGRpc3QsJChNQUtFQ01ER09BTFMpKSkKK01BS0VDTURHT0FMUyA6PSAkKHN0cmlwICQoZmlsdGVyLW91dCBkaXN0LCQoTUFLRUNNREdPQUxTKSkpCiAKLWlmbmVxICgkKGZpbHRlciAtLWNvbG9yPWFsd2F5cywgJChHUkVQX09QVElPTlMpKSwpCi0kKHdhcm5pbmcgVGhlIGJ1aWxkIHN5c3RlbSBuZWVkcyB1bm1vZGlmaWVkIG91dHB1dCBvZiBncmVwLikKLSQoZXJyb3IgUGxlYXNlIHJlbW92ZSAtLWNvbG9yPWFsd2F5cyBmcm9tIHlvdXIgICQkR1JFUF9PUFRJT05TKQotZW5kaWYKK1VOQU1FIDo9ICQoc2hlbGwgdW5hbWUgLXNtKQogCiBTUkNfVEFSR0VUX0RJUiA6PSAkKFRPUERJUilidWlsZC90YXJnZXQKIFNSQ19BUElfRElSIDo9ICQoVE9QRElSKXByZWJ1aWx0cy9zZGsvYXBpCkBAIC03Nyw3ICs5Nyw3IEBACiBTUkNfVEVTVF9BUElfRElSIDo9ICQoVE9QRElSKXByZWJ1aWx0cy9zZGsvdGVzdC1hcGkKIAogIyBTb21lIHNwZWNpZmljIHBhdGhzIHRvIHRvb2xzCi1TUkNfRFJPSURET0NfRElSIDo9ICQoVE9QRElSKWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jCitTUkNfRFJPSURET0NfRElSIDo9ICQoVE9QRElSKWJ1aWxkL21ha2UvdG9vbHMvZHJvaWRkb2MKIAogIyBTZXQgdXAgZWZmaWNpZW50IG1hdGggZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIGluIG1ha2UuCiAjIEhlcmUgc2luY2UgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IGVudnNldHVwIGFzIHdlbGwgYXMgZHVyaW5nIGJ1aWxkLgpAQCAtODYsNiArMTA2LDkgQEAKICMgVmFyaW91cyBtYXBwaW5ncyB0byBhdm9pZCBoYXJkLWNvZGluZyBwYXRocyBhbGwgb3ZlciB0aGUgcGxhY2UKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3BhdGhtYXAubWsKIAorIyBBbGxvdyBwcm9qZWN0cyB0byBkZWZpbmUgdGhlaXIgb3duIGdsb2JhbGx5LWF2YWlsYWJsZSB2YXJpYWJsZXMKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Byb2plY3RfZGVmaW5pdGlvbnMubWsKKwogIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgQnVpbGQgc3lzdGVtIGludGVybmFsIGZpbGVzCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTEyLDYgKzEzNSw3IEBACiBCVUlMRF9TVEFUSUNfSkFWQV9MSUJSQVJZOj0gJChCVUlMRF9TWVNURU0pL3N0YXRpY19qYXZhX2xpYnJhcnkubWsKIEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZOj0gJChCVUlMRF9TWVNURU0pL2hvc3RfamF2YV9saWJyYXJ5Lm1rCiBCVUlMRF9EUk9JRERPQzo9ICQoQlVJTERfU1lTVEVNKS9kcm9pZGRvYy5taworQlVJTERfQVBJRElGRjo9ICQoQlVJTERfU1lTVEVNKS9hcGlkaWZmLm1rCiBCVUlMRF9DT1BZX0hFQURFUlMgOj0gJChCVUlMRF9TWVNURU0pL2NvcHlfaGVhZGVycy5tawogQlVJTERfTkFUSVZFX1RFU1QgOj0gJChCVUlMRF9TWVNURU0pL25hdGl2ZV90ZXN0Lm1rCiBCVUlMRF9OQVRJVkVfQkVOQ0hNQVJLIDo9ICQoQlVJTERfU1lTVEVNKS9uYXRpdmVfYmVuY2htYXJrLm1rCkBAIC0xMjgsNiArMTUyLDE1IEBACiBCVUlMRF9IT1NUX0RBTFZJS19KQVZBX0xJQlJBUlkgOj0gJChCVUlMRF9TWVNURU0pL2hvc3RfZGFsdmlrX2phdmFfbGlicmFyeS5tawogQlVJTERfSE9TVF9EQUxWSUtfU1RBVElDX0pBVkFfTElCUkFSWSA6PSAkKEJVSUxEX1NZU1RFTSkvaG9zdF9kYWx2aWtfc3RhdGljX2phdmFfbGlicmFyeS5tawogCitCVUlMRF9IT1NUX1RFU1RfQ09ORklHIDo9ICQoQlVJTERfU1lTVEVNKS9ob3N0X3Rlc3RfY29uZmlnLm1rCitCVUlMRF9UQVJHRVRfVEVTVF9DT05GSUcgOj0gJChCVUlMRF9TWVNURU0pL3RhcmdldF90ZXN0X2NvbmZpZy5taworCitJTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUdfVEVNUExBVEUgOj0gJChCVUlMRF9TWVNURU0pL2luc3RydW1lbnRhdGlvbl90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKK05BVElWRV9URVNUX0NPTkZJR19URU1QTEFURSA6PSAkKEJVSUxEX1NZU1RFTSkvbmF0aXZlX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAorRU1QVFlfVEVTVF9DT05GSUcgOj0gJChCVUlMRF9TWVNURU0pL2VtcHR5X3Rlc3RfY29uZmlnLnhtbAorCisjIFRvb2wgdG8gZ2VuZXJhdGUgVHJhZGVGZWQgdGVzdCBjb25maWcgZmlsZSBhdXRvbWF0aWNhbGx5LgorQVVUT0dFTl9URVNUX0NPTkZJR19TQ1JJUFQgOj0gYnVpbGQvbWFrZS90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZy5weQogCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBQYXJzZSBvdXQgYW55IG1vZGlmaWVyIHRhcmdldHMuCkBAIC0xMzgsNyArMTcxLDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgVG9vbHMgbmVlZGVkIGluIHByb2R1Y3QgY29uZmlndXJhdGlvbiBtYWtlZmlsZXMuCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1OT1JNQUxJWkVfUEFUSCA6PSBidWlsZC90b29scy9ub3JtYWxpemVfcGF0aC5weQorTk9STUFMSVpFX1BBVEggOj0gYnVpbGQvbWFrZS90b29scy9ub3JtYWxpemVfcGF0aC5weQogCiAjICQoMSk6IHRoZSBwYXRocyB0byBiZSBub3JtYWxpemVkCiBkZWZpbmUgbm9ybWFsaXplLXBhdGhzCkBAIC0xNjAsNiArMTkzLDExIEBACiBKQVZBX1RNUERJUl9BUkcgOj0KIGVuZGlmCiAKKyMgRGVmYXVsdCB0byByZW1vdmUgdGhlIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kgZnJvbSBib290Y2xhc3NwYXRoCitpZmVxICgkKFJFTU9WRV9PQUhMX0ZST01fQkNQKSwpCitSRU1PVkVfT0FITF9GUk9NX0JDUCA6PSB0cnVlCitlbmRpZgorCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBJbmNsdWRlIHN1Yi1jb25maWd1cmF0aW9uIGZpbGVzCiAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMzAyLDcgKzM0MCw3IEBACiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jb21iby9zZWxlY3QubWsKIGVuZGlmCiAKLWlmbmRlZiBLQVRJCitpZmVxICgkKENBTExFRF9GUk9NX1NFVFVQKSx0cnVlKQogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY2NhY2hlLm1rCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9nb21hLm1rCiAKQEAgLTM3NSwzMyArNDEzLDExIEBACiAgIFdJVEhfU1RBVElDX0FOQUxZWkVSIDo9CiBlbmRpZgogCi0jIGRlZmluZSBjbGFuZy9sbHZtIHZlcnNpb25zIGFuZCBiYXNlIGRpcmVjdG9yeS4KLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2NsYW5nL3ZlcnNpb25zLm1rCi0KICMgVW5zZXQgV0lUSF9USURZX09OTFkgaWYgZ2xvYmFsIFdJVEhfVElEWV9PTkxZIGlzIG5vdCB0cnVlIG5vciAxLgogaWZlcSAoLCQoZmlsdGVyIDEgdHJ1ZSwkKFdJVEhfVElEWV9PTkxZKSkpCiAgIFdJVEhfVElEWV9PTkxZIDo9CiBlbmRpZgogCi1QQVRIX1RPX0NMQU5HX1RJRFkgOj0gXAotICAgICQoTExWTV9QUkVCVUlMVFNfQkFTRSkvJChCVUlMRF9PUykteDg2LyQoTExWTV9QUkVCVUlMVFNfVkVSU0lPTikvYmluL2NsYW5nLXRpZHkKLWlmZXEgKCQod2lsZGNhcmQgJChQQVRIX1RPX0NMQU5HX1RJRFkpKSwpCi0gIGlmbmVxICgsJChmaWx0ZXIgMSB0cnVlLCQoV0lUSF9USURZKSkpCi0gICAgJCh3YXJuaW5nICoqKiBEaXNhYmxlIFdJVEhfVElEWSBiZWNhdXNlICQoUEFUSF9UT19DTEFOR19USURZKSBkb2VzIG5vdCBleGlzdCkKLSAgZW5kaWYKLSAgUEFUSF9UT19DTEFOR19USURZIDo9Ci1lbmRpZgotCi0jIERpc2FibGUgV0lUSF9TVEFUSUNfQU5BTFlaRVIgaWYgdG9vbCBjYW4ndCBiZSBmb3VuZAotU1lOVEFYX1RPT0xTX1BSRUZJWCA6PSBcCi0gICAgJChMTFZNX1BSRUJVSUxUU19CQVNFKS8kKEJVSUxEX09TKS14ODYvJChMTFZNX1BSRUJVSUxUU19WRVJTSU9OKS90b29scy9zY2FuLWJ1aWxkL2xpYmV4ZWMKLWlmbmVxICgkKHN0cmlwICQoV0lUSF9TVEFUSUNfQU5BTFlaRVIpKSwpCi0gIGlmZXEgKCQod2lsZGNhcmQgJChTWU5UQVhfVE9PTFNfUFJFRklYKS9jY2MtYW5hbHl6ZXIpLCkKLSAgICAkKHdhcm5pbmcgKioqIERpc2FibGUgV0lUSF9TVEFUSUNfQU5BTFlaRVIgYmVjYXVzZSAkKFNZTlRBWF9UT09MU19QUkVGSVgpL2NjYy1hbmFseXplciBkb2VzIG5vdCBleGlzdCkKLSAgICBXSVRIX1NUQVRJQ19BTkFMWVpFUiA6PQotICBlbmRpZgotZW5kaWYKLQogIyBQaWNrIGEgSmF2YSBjb21waWxlci4KIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2NvbWJvL2phdmFjLm1rCiAKQEAgLTQzMiw5ICs0NDgsOSBAQAogCiAjIFdoYXQgdG8gYnVpbGQ6CiAjIHBkayBmdXNpb24gaWY6Ci0jIDEpIFBES19GVVNJT05fUExBVEZPUk1fWklQIGlzIHBhc3NlZCBpbiBmcm9tIHRoZSBlbnZpcm9ubWVudAorIyAxKSBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCAvIFBES19GVVNJT05fUExBVEZPUk1fRElSIGlzIHBhc3NlZCBpbiBmcm9tIHRoZSBlbnZpcm9ubWVudAogIyBvcgotIyAyKSB0aGUgcGxhdGZvcm0uemlwIGV4aXN0cyBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbgorIyAyKSB0aGUgcGxhdGZvcm0uemlwIC8gcGRrLm1rIGV4aXN0cyBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbgogIyBvcgogIyAzKSBmdXNpb24gaXMgYSBjb21tYW5kIGxpbmUgYnVpbGQgZ29hbCwKICMgICAgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAgaXMgbmVlZGVkIGFueXdheSwgdGhlbiBkbyB3ZSBuZWVkIHRoZSAnZnVzaW9uJyBnb2FsPwpAQCAtNDQzLDI3ICs0NTksNDQgQEAKICMgb3IKICMgMikgVEFSR0VUX0JVSUxEX1BESyBpcyBwYXNzZWQgaW4gZnJvbSB0aGUgZW52aXJvbm1lbnQKIAotIyBpZiBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCBpcyBzcGVjaWZpZWQsIGRvIG5vdCBvdmVycmlkZS4KLWlmbmRlZiBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUAotIyBNb3N0IFBESyBwcm9qZWN0IHBhdGhzIHNob3VsZCBiZSB1c2luZyB2ZW5kb3IvcGRrL1RBUkdFVF9ERVZJQ0UKLSMgYnV0IHNvbWUgbGVnYWN5IG9uZXMgKGUuZy4gbWluaV9hcm12N2FfbmVvbiBnZW5lcmljIFBESykgd2VyZSBzZXR1cAotIyB3aXRoIHZlbmRvci9wZGsvVEFSR0VUX1BST0RVQ1QuCi1fcGRrX2Z1c2lvbl9kZWZhdWx0X3BsYXRmb3JtX3ppcCA9ICQoc3RyaXAgXAotICAkKHdpbGRjYXJkIHZlbmRvci9wZGsvJChUQVJHRVRfREVWSUNFKS8kKFRBUkdFVF9QUk9EVUNUKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS9wbGF0Zm9ybS9wbGF0Zm9ybS56aXApIFwKLSAgJCh3aWxkY2FyZCB2ZW5kb3IvcGRrLyQoVEFSR0VUX0RFVklDRSkvJChwYXRzdWJzdCBhb3NwXyUsZnVsbF8lLCQoVEFSR0VUX1BST0RVQ1QpKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS9wbGF0Zm9ybS9wbGF0Zm9ybS56aXApIFwKLSAgJCh3aWxkY2FyZCB2ZW5kb3IvcGRrLyQoVEFSR0VUX1BST0RVQ1QpLyQoVEFSR0VUX1BST0RVQ1QpLSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpL3BsYXRmb3JtL3BsYXRmb3JtLnppcCkgXAotICAkKHdpbGRjYXJkIHZlbmRvci9wZGsvJChUQVJHRVRfUFJPRFVDVCkvJChwYXRzdWJzdCBhb3NwXyUsZnVsbF8lLCQoVEFSR0VUX1BST0RVQ1QpKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS9wbGF0Zm9ybS9wbGF0Zm9ybS56aXApKQotaWZuZXEgKCwkKF9wZGtfZnVzaW9uX2RlZmF1bHRfcGxhdGZvcm1femlwKSkKLVBES19GVVNJT05fUExBVEZPUk1fWklQIDo9ICQod29yZCAxLCAkKF9wZGtfZnVzaW9uX2RlZmF1bHRfcGxhdGZvcm1femlwKSkKLVRBUkdFVF9CVUlMRF9QREsgOj0gdHJ1ZQotZW5kaWYgIyBfcGRrX2Z1c2lvbl9kZWZhdWx0X3BsYXRmb3JtX3ppcAotZW5kaWYgIyAhUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKKyMgaWYgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAgb3IgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIgaXMgc3BlY2lmaWVkLCBkbyBub3Qgb3ZlcnJpZGUuCitpZmVxICgsJChzdHJpcCAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpKSkKKyAgIyBNb3N0IFBESyBwcm9qZWN0IHBhdGhzIHNob3VsZCBiZSB1c2luZyB2ZW5kb3IvcGRrL1RBUkdFVF9ERVZJQ0UKKyAgIyBidXQgc29tZSBsZWdhY3kgb25lcyAoZS5nLiBtaW5pX2FybXY3YV9uZW9uIGdlbmVyaWMgUERLKSB3ZXJlIHNldHVwCisgICMgd2l0aCB2ZW5kb3IvcGRrL1RBUkdFVF9QUk9EVUNULgorICAjIE90aGVycyBhcmUgc2V0IHVwIHdpdGggdmVuZG9yL3Bkay9UQVJHRVRfREVWSUNFL1RBUkdFVF9ERVZJQ0UtdXNlcmRlYnVnCisgIF9wZGtfZnVzaW9uX3NlYXJjaF9wYXRocyA6PSBcCisgICAgdmVuZG9yL3Bkay8kKFRBUkdFVF9ERVZJQ0UpLyQoVEFSR0VUX0RFVklDRSktJChUQVJHRVRfQlVJTERfVkFSSUFOVCkvcGxhdGZvcm0gXAorICAgIHZlbmRvci9wZGsvJChUQVJHRVRfREVWSUNFKS8kKFRBUkdFVF9QUk9EVUNUKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS9wbGF0Zm9ybSBcCisgICAgdmVuZG9yL3Bkay8kKFRBUkdFVF9ERVZJQ0UpLyQocGF0c3Vic3QgYW9zcF8lLGZ1bGxfJSwkKFRBUkdFVF9QUk9EVUNUKSktJChUQVJHRVRfQlVJTERfVkFSSUFOVCkvcGxhdGZvcm0gXAorICAgIHZlbmRvci9wZGsvJChUQVJHRVRfUFJPRFVDVCkvJChUQVJHRVRfUFJPRFVDVCktJChUQVJHRVRfQlVJTERfVkFSSUFOVCkvcGxhdGZvcm0gXAorICAgIHZlbmRvci9wZGsvJChUQVJHRVRfUFJPRFVDVCkvJChwYXRzdWJzdCBhb3NwXyUsZnVsbF8lLCQoVEFSR0VUX1BST0RVQ1QpKS0kKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS9wbGF0Zm9ybQorCisgIF9wZGtfZnVzaW9uX2RlZmF1bHRfcGxhdGZvcm1femlwIDo9ICQoc3RyaXAgJChmb3JlYWNoIHAsJChfcGRrX2Z1c2lvbl9zZWFyY2hfcGF0aHMpLCQod2lsZGNhcmQgJChwKS9wbGF0Zm9ybS56aXApKSkKKyAgaWZuZXEgKCwkKF9wZGtfZnVzaW9uX2RlZmF1bHRfcGxhdGZvcm1femlwKSkKKyAgICBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCA6PSAkKHdvcmQgMSwgJChfcGRrX2Z1c2lvbl9kZWZhdWx0X3BsYXRmb3JtX3ppcCkpCisgICAgX3Bka19mdXNpb25fZGVmYXVsdF9wbGF0Zm9ybV96aXAgOj0KKyAgZWxzZQorICAgIF9wZGtfZnVzaW9uX2RlZmF1bHRfcGxhdGZvcm1fbWsgOj0gJChzdHJpcCAkKGZvcmVhY2ggcCwkKF9wZGtfZnVzaW9uX3NlYXJjaF9wYXRocyksJCh3aWxkY2FyZCAkKHApL3Bkay5taykpKQorICAgIGlmbmVxICgsJChfcGRrX2Z1c2lvbl9kZWZhdWx0X3BsYXRmb3JtX21rKSkKKyAgICAgIFBES19GVVNJT05fUExBVEZPUk1fRElSIDo9ICQoZGlyICQod29yZCAxLCQoX3Bka19mdXNpb25fZGVmYXVsdF9wbGF0Zm9ybV9taykpKQorICAgICAgX3Bka19mdXNpb25fZGVmYXVsdF9wbGF0Zm9ybV9tayA6PQorICAgIGVuZGlmCisgIGVuZGlmICMgX3Bka19mdXNpb25fZGVmYXVsdF9wbGF0Zm9ybV96aXAKKyAgX3Bka19mdXNpb25fc2VhcmNoX3BhdGhzIDo9CitlbmRpZiAjICFQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCAmJiAhUERLX0ZVU0lPTl9QTEFURk9STV9ESVIKKworaWZuZXEgKCwkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSkKKyAgaWZuZXEgKCwkKFBES19GVVNJT05fUExBVEZPUk1fRElSKSkKKyAgICAkKGVycm9yIE9ubHkgb25lIG9mIFBES19GVVNJT05fUExBVEZPUk1fWklQIG9yIFBES19GVVNJT05fUExBVEZPUk1fRElSIG1heSBiZSBzcGVjaWZpZWQpCisgIGVuZGlmCitlbmRpZgogCiBpZm5lcSAoLCQoZmlsdGVyIHBkayBmdXNpb24sICQoTUFLRUNNREdPQUxTKSkpCiBUQVJHRVRfQlVJTERfUERLIDo9IHRydWUKIGlmbmVxICgsJChmaWx0ZXIgZnVzaW9uLCAkKE1BS0VDTURHT0FMUykpKQotaWZuZGVmIFBES19GVVNJT05fUExBVEZPUk1fWklQCi0gICQoZXJyb3IgU3BlY2lmeSBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCB0byBkbyBhIFBESyBmdXNpb24uKQoraWZlcSAoLCQoc3RyaXAgJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkkKFBES19GVVNJT05fUExBVEZPUk1fRElSKSkpCisgICQoZXJyb3IgU3BlY2lmeSBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCBvciBQREtfRlVTSU9OX1BMQVRGT1JNX0RJUiB0byBkbyBhIFBESyBmdXNpb24uKQogZW5kaWYKIGVuZGlmICAjIGZ1c2lvbgogZW5kaWYgICMgcGRrIG9yIGZ1c2lvbgpAQCAtNDcxLDcgKzUwNCwxOSBAQAogaWZkZWYgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKIFRBUkdFVF9CVUlMRF9QREsgOj0gdHJ1ZQogaWZlcSAoLCQod2lsZGNhcmQgJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkpKQotICAkKGVycm9yIENhbm5vdCBmaW5kIGZpbGUgJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkuKQorICBpZm5lcSAoLCQod2lsZGNhcmQgJChkaXIgJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkpL3Bkay5taykpCisgICAgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIgOj0gJChkaXIgJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkpCisgICAgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAgOj0KKyAgZWxzZQorICAgICQoZXJyb3IgQ2Fubm90IGZpbmQgZmlsZSAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKS4pCisgIGVuZGlmCitlbmRpZgorZW5kaWYKKworaWZkZWYgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIKK1RBUkdFVF9CVUlMRF9QREsgOj0gdHJ1ZQoraWZlcSAoLCQod2lsZGNhcmQgJChQREtfRlVTSU9OX1BMQVRGT1JNX0RJUikvcGRrLm1rKSkKKyAgJChlcnJvciBDYW5ub3QgZmluZCBmaWxlICQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpL3Bkay5tay4pCiBlbmRpZgogZW5kaWYKIApAQCAtNDk3LDggKzU0MiwyOSBAQAogcHJlYnVpbHRfc2RrX3Rvb2xzIDo9IHByZWJ1aWx0cy9zZGsvdG9vbHMKIHByZWJ1aWx0X3Nka190b29sc19iaW4gOj0gJChwcmVidWlsdF9zZGtfdG9vbHMpLyQoSE9TVF9PUykvYmluCiAKKyMgQWx3YXlzIHVzZSBwcmVidWlsdHMgZm9yIGNrYXRpIGFuZCBtYWtlcGFyYWxsZWwKK3ByZWJ1aWx0X2J1aWxkX3Rvb2xzIDo9IHByZWJ1aWx0cy9idWlsZC10b29scworcHJlYnVpbHRfYnVpbGRfdG9vbHNfd3JhcHBlcnMgOj0gcHJlYnVpbHRzL2J1aWxkLXRvb2xzL2NvbW1vbi9iaW4KK3ByZWJ1aWx0X2J1aWxkX3Rvb2xzX2phcnMgOj0gcHJlYnVpbHRzL2J1aWxkLXRvb2xzL2NvbW1vbi9mcmFtZXdvcmsKK2lmZXEgKCQoZmlsdGVyIGFkZHJlc3MsJChTQU5JVElaRV9IT1NUKSksKQorcHJlYnVpbHRfYnVpbGRfdG9vbHNfYmluIDo9ICQocHJlYnVpbHRfYnVpbGRfdG9vbHMpLyQoSE9TVF9QUkVCVUlMVF9UQUcpL2JpbgorZWxzZQorcHJlYnVpbHRfYnVpbGRfdG9vbHNfYmluIDo9ICQocHJlYnVpbHRfYnVpbGRfdG9vbHMpLyQoSE9TVF9QUkVCVUlMVF9UQUcpL2FzYW4vYmluCitlbmRpZgorCiBVU0VfUFJFQlVJTFRfU0RLX1RPT0xTX0lOX1BMQUNFIDo9IHRydWUKIAorIyBXb3JrIGFyb3VuZCBmb3IgYi82ODQwNjIyMAorIyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgc29vbmcgdmVyc2lvbi4KK2lmbmRlZiBVU0VfRDgKKyAgVVNFX0Q4IDo9IHRydWUKK2VuZGlmCisKKyMgRGVmYXVsdCBSOCBiZWhhdmlvciB3aGVuIFVTRV9SOCBpcyBub3Qgc3BlY2lmaWVkLgoraWZuZGVmIFVTRV9SOAorICBVU0VfUjggOj0gZmFsc2UKK2VuZGlmCisKICMKICMgVG9vbHMgdGhhdCBhcmUgcHJlYnVpbHRzIGZvciBUQVJHRVRfQlVJTERfQVBQUwogIwpAQCAtNTA2LDI4ICs1NzIsMjEgQEAKICAgQUlETCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9haWRsCiAgIEFBUFQgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYWFwdAogICBBQVBUMiA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hYXB0MgorICBERVNVR0FSIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2Rlc3VnYXIuamFyCiAgIE1BSU5ERVhDTEFTU0VTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21haW5EZXhDbGFzc2VzCiAgIFNJR05BUEtfSkFSIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL3NpZ25hcGskKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKQogICBTSUdOQVBLX0pOSV9MSUJSQVJZX1BBVEggOj0gJChIT1NUX09VVF9TSEFSRURfTElCUkFSSUVTKQogICBaSVBBTElHTiA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS96aXBhbGlnbgogCi0gIGlmbmRlZiBEWF9BTFRfSkFSCi0gICAgRFggOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZHgKLSAgICBEWF9DT01NQU5EIDo9ICQoRFgpIC1KWG1zMTZNIC1KWG14MjA0OE0KLSAgZWxzZQotICAgIERYIDo9ICQoRFhfQUxUX0pBUikKLSAgICBEWF9DT01NQU5EIDo9ICQoSkFWQSkgLVhtczE2TSAtWG14MjA0OE0gLWphciAkKERYKQotICBlbmRpZgogZWxzZSAjIFRBUkdFVF9CVUlMRF9BUFBTIHx8IFRBUkdFVF9CVUlMRF9QREsKLSAgQUlETCA6PSAkKHByZWJ1aWx0X3Nka190b29sc19iaW4pL2FpZGwKKyAgQUlETCA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzX2JpbikvYWlkbAogICBBQVBUIDo9ICQocHJlYnVpbHRfc2RrX3Rvb2xzX2JpbikvYWFwdAogICBBQVBUMiA6PSAkKHByZWJ1aWx0X3Nka190b29sc19iaW4pL2FhcHQyCi0gIERYIDo9ICQocHJlYnVpbHRfc2RrX3Rvb2xzKS9keAotICBEWF9DT01NQU5EIDo9ICQoRFgpIC1KWG1zMTZNIC1KWG14MjA0OE0KKyAgREVTVUdBUiA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzX2phcnMpL2Rlc3VnYXIuamFyCiAgIE1BSU5ERVhDTEFTU0VTIDo9ICQocHJlYnVpbHRfc2RrX3Rvb2xzKS9tYWluRGV4Q2xhc3NlcwotICBaSVBBTElHTiA6PSAkKHByZWJ1aWx0X3Nka190b29sc19iaW4pL3ppcGFsaWduCiAgIFNJR05BUEtfSkFSIDo9ICQocHJlYnVpbHRfc2RrX3Rvb2xzKS9saWIvc2lnbmFwayQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpCiAgIFNJR05BUEtfSk5JX0xJQlJBUllfUEFUSCA6PSAkKHByZWJ1aWx0X3Nka190b29scykvJChIT1NUX09TKS9saWI2NAorICBaSVBBTElHTiA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzX2JpbikvemlwYWxpZ24KIGVuZGlmICMgVEFSR0VUX0JVSUxEX0FQUFMgfHwgVEFSR0VUX0JVSUxEX1BESwogCiBpZmVxICgsJChUQVJHRVRfQlVJTERfQVBQUykpCkBAIC01NDIsMzggKzYwMSwzMCBAQAogcHJlYnVpbHRfc2RrX3Rvb2xzIDo9CiBwcmVidWlsdF9zZGtfdG9vbHNfYmluIDo9CiAKLSMgQWx3YXlzIHVzZSBwcmVidWlsdHMgZm9yIGNrYXRpIGFuZCBtYWtlcGFyYWxsZWwKLXByZWJ1aWx0X2J1aWxkX3Rvb2xzIDo9IHByZWJ1aWx0cy9idWlsZC10b29scwotaWZlcSAoJChmaWx0ZXIgYWRkcmVzcywkKFNBTklUSVpFX0hPU1QpKSwpCi1wcmVidWlsdF9idWlsZF90b29sc19iaW4gOj0gJChwcmVidWlsdF9idWlsZF90b29scykvJChIT1NUX1BSRUJVSUxUX1RBRykvYmluCi1lbHNlCi1wcmVidWlsdF9idWlsZF90b29sc19iaW4gOj0gJChwcmVidWlsdF9idWlsZF90b29scykvJChIT1NUX1BSRUJVSUxUX1RBRykvYXNhbi9iaW4KLWVuZGlmCi0KIEFDUCA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzX2JpbikvYWNwCiBDS0FUSSA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzX2JpbikvY2thdGkKIERFUE1PRCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZXBtb2QKIEZJTEVTTElTVCA6PSAkKFNPT05HX0hPU1RfT1VUX0VYRUNVVEFCTEVTKS9maWxlc2xpc3QKLUlKQVIgOj0gJChwcmVidWlsdF9idWlsZF90b29sc19iaW4pL2lqYXIKIE1BS0VQQVJBTExFTCA6PSAkKHByZWJ1aWx0X2J1aWxkX3Rvb2xzX2JpbikvbWFrZXBhcmFsbGVsCiBTT09OR19KQVZBQ19XUkFQUEVSIDo9ICQoU09PTkdfSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Nvb25nX2phdmFjX3dyYXBwZXIKIFNPT05HX1pJUCA6PSAkKFNPT05HX0hPU1RfT1VUX0VYRUNVVEFCTEVTKS9zb29uZ196aXAKK01FUkdFX1pJUFMgOj0gJChTT09OR19IT1NUX09VVF9FWEVDVVRBQkxFUykvbWVyZ2VfemlwcworWE1MTElOVCA6PSAkKFNPT05HX0hPU1RfT1VUX0VYRUNVVEFCTEVTKS94bWxsaW50CiBaSVAyWklQIDo9ICQoU09PTkdfSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3ppcDJ6aXAKIFpJUFRJTUUgOj0gJChwcmVidWlsdF9idWlsZF90b29sc19iaW4pL3ppcHRpbWUKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgR2VuZXJpYyB0b29scy4KLUpBQ0sgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvamFjawogCiBMRVggOj0gcHJlYnVpbHRzL21pc2MvJChCVUlMRF9PUyktJChIT1NUX1BSRUJVSUxUX0FSQ0gpL2ZsZXgvZmxleC0yLjUuMzkKICMgVGhlIGRlZmF1bHQgUEtHREFUQURJUiBidWlsdCBpbiB0aGUgcHJlYnVpbHQgYmlzb24gaXMgYSByZWxhdGl2ZSBwYXRoCi0jIGV4dGVybmFsL2Jpc29uL2RhdGEuCisjIHByZWJ1aWx0cy9idWlsZC10b29scy9jb21tb24vYmlzb24uCiAjIFRvIHJ1biBiaXNvbiBmcm9tIGVsc2V3aGVyZSB5b3UgbmVlZCB0byBzZXQgdXAgZW52aXJvbWVudGFsIHZhcmlhYmxlCiAjIEJJU09OX1BLR0RBVEFESVIuCi1CSVNPTl9QS0dEQVRBRElSIDo9ICQoUFdEKS9leHRlcm5hbC9iaXNvbi9kYXRhCi1CSVNPTiA6PSBwcmVidWlsdHMvbWlzYy8kKEJVSUxEX09TKS0kKEhPU1RfUFJFQlVJTFRfQVJDSCkvYmlzb24vYmlzb24KK0JJU09OX1BLR0RBVEFESVIgOj0gJChQV0QpL3ByZWJ1aWx0cy9idWlsZC10b29scy9jb21tb24vYmlzb24KK0JJU09OIDo9IHByZWJ1aWx0cy9idWlsZC10b29scy8kKEJVSUxEX09TKS0kKEhPU1RfUFJFQlVJTFRfQVJDSCkvYmluL2Jpc29uCiBZQUNDIDo9ICQoQklTT04pIC1kCi1CSVNPTl9EQVRBIDo9ICQod2lsZGNhcmQgZXh0ZXJuYWwvYmlzb24vZGF0YS8qIGV4dGVybmFsL2Jpc29uL2RhdGEvKi8qKQorQklTT05fREFUQSA6PSAkKHdpbGRjYXJkICQoQklTT05fUEtHREFUQURJUikvKiAkKEJJU09OX1BLR0RBVEFESVIpLyovKikKIAogWUFTTSA6PSBwcmVidWlsdHMvbWlzYy8kKEJVSUxEX09TKS0kKEhPU1RfUFJFQlVJTFRfQVJDSCkveWFzbS95YXNtCiAKQEAgLTU5Miw3ICs2NDMsNyBAQAogVlRTQyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS92dHNjJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogTUtCT09URlMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtib290ZnMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBNSU5JR1pJUCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9taW5pZ3ppcCQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKLUJSTyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9icm8kKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCitCUk9UTEkgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYnJvdGxpJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogaWZlcSAoLCQoc3RyaXAgJChCT0FSRF9DVVNUT01fTUtCT09USU1HKSkpCiBNS0JPT1RJTUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtib290aW1nJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogZWxzZQpAQCAtNjEwLDE1ICs2NjEsOSBAQAogZW5kaWYKIEFQSUNIRUNLIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FwaWNoZWNrJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogRlNfR0VUX1NUQVRTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2ZzX2dldF9zdGF0cyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKLWlmZXEgKCQoVEFSR0VUX1VTRVNfTUtFMkZTKSx0cnVlKQogTUFLRV9FWFQ0RlMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtlMmZzJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogTUtFWFRVU0VSSU1HIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21rdXNlcmltZ19ta2UyZnMuc2gKIE1LRTJGU19DT05GIDo9IHN5c3RlbS9leHRyYXMvZXh0NF91dGlscy9ta2UyZnMuY29uZgotZWxzZQotTUFLRV9FWFQ0RlMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWFrZV9leHQ0ZnMkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCi1NS0VYVFVTRVJJTUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWt1c2VyaW1nLnNoCi1NS0UyRlNfQ09ORiA6PQotZW5kaWYKIEJMS19BTExPQ19UT19CQVNFX0ZTIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Jsa19hbGxvY190b19iYXNlX2ZzJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogTUFLRV9TUVVBU0hGUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta3NxdWFzaGZzJChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogTUtTUVVBU0hGU1VTRVJJTUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWtzcXVhc2hmc2ltYWdlLnNoCkBAIC02MjcsMzEgKzY3MiwxNyBAQAogU0lNRzJJTUcgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvc2ltZzJpbWckKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBJTUcyU0lNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9pbWcyc2ltZyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIEUyRlNDSyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9lMmZzY2skKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCi1NS1RBUkJBTEwgOj0gYnVpbGQvdG9vbHMvbWt0YXJiYWxsLnNoCitNS1RBUkJBTEwgOj0gYnVpbGQvbWFrZS90b29scy9ta3RhcmJhbGwuc2gKIFRVTkUyRlMgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvdHVuZTJmcyQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIEpBUkpBUiA6PSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9qYXJqYXIuamFyCi1ERVNVR0FSIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2Rlc3VnYXIuamFyCiBEQVRBX0JJTkRJTkdfQ09NUElMRVIgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvZGF0YWJpbmRpbmctY29tcGlsZXIuamFyCi1GQVQxNkNPUFkgOj0gYnVpbGQvdG9vbHMvZmF0MTZjb3B5LnB5Ci1DSEVDS19MSU5LX1RZUEUgOj0gYnVpbGQvdG9vbHMvY2hlY2tfbGlua190eXBlLnB5Ci0KLWlmZXEgKCQoQU5EUk9JRF9DT01QSUxFX1dJVEhfSkFDSyksdHJ1ZSkKLURFRkFVTFRfSkFDS19FTkFCTEVEOj1mdWxsCi1lbHNlCi1ERUZBVUxUX0pBQ0tfRU5BQkxFRDo9Ci1lbmRpZgotaWZuZXEgKCQoQU5EUk9JRF9KQUNLX0VYVFJBX0FSR1MpLCkKLUpBQ0tfREVGQVVMVF9BUkdTIDo9Ci1ERUZBVUxUX0pBQ0tfRVhUUkFfQVJHUyA6PSAkKEFORFJPSURfSkFDS19FWFRSQV9BUkdTKQotZWxzZQotSkFDS19ERUZBVUxUX0FSR1MgOj0gJChCVUlMRF9TWVNURU0pL2phY2stZGVmYXVsdC5hcmdzCi1ERUZBVUxUX0pBQ0tfRVhUUkFfQVJHUyA6PSBAJChKQUNLX0RFRkFVTFRfQVJHUykKLWVuZGlmCitGQVQxNkNPUFkgOj0gYnVpbGQvbWFrZS90b29scy9mYXQxNmNvcHkucHkKK0NIRUNLX0xJTktfVFlQRSA6PSBidWlsZC9tYWtlL3Rvb2xzL2NoZWNrX2xpbmtfdHlwZS5weQogCiBQUk9HVUFSRCA6PSBleHRlcm5hbC9wcm9ndWFyZC9iaW4vcHJvZ3VhcmQuc2gKLUpBVkFUQUdTIDo9IGJ1aWxkL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKLU1FUkdFVEFHUyA6PSBidWlsZC90b29scy9tZXJnZS1ldmVudC1sb2ctdGFncy5weQotQlVJTERfSU1BR0VfU1JDUyA6PSAkKHdpbGRjYXJkIGJ1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy8qLnB5KQorSkFWQVRBR1MgOj0gYnVpbGQvbWFrZS90b29scy9qYXZhLWV2ZW50LWxvZy10YWdzLnB5CitNRVJHRVRBR1MgOj0gYnVpbGQvbWFrZS90b29scy9tZXJnZS1ldmVudC1sb2ctdGFncy5weQorQlVJTERfSU1BR0VfU1JDUyA6PSAkKHdpbGRjYXJkIGJ1aWxkL21ha2UvdG9vbHMvcmVsZWFzZXRvb2xzLyoucHkpCiBBUFBFTkQyU0lNRyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hcHBlbmQyc2ltZwogVkVSSVRZX1NJR05FUiA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS92ZXJpdHlfc2lnbmVyCiBCVUlMRF9WRVJJVFlfVFJFRSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idWlsZF92ZXJpdHlfdHJlZQpAQCAtNjYzLDQzICs2OTQsNDggQEAKIAogREVYRFVNUCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZXhkdW1wMiQoQlVJTERfRVhFQ1VUQUJMRV9TVUZGSVgpCiBQUk9GTUFOIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Byb2ZtYW4KK0hJRERFTkFQSSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9oaWRkZW5hcGkKIAogIyByZWxvY2F0aW9uIHBhY2tlcgogUkVMT0NBVElPTl9QQUNLRVIgOj0gcHJlYnVpbHRzL21pc2MvJChCVUlMRF9PUyktJChIT1NUX1BSRUJVSUxUX0FSQ0gpL3JlbG9jYXRpb25fcGFja2VyL3JlbG9jYXRpb25fcGFja2VyCiAKIEZJTkRCVUdTX0RJUiA6PSBleHRlcm5hbC9vd2FzcC9zYW5pdGl6ZXIvdG9vbHMvZmluZGJ1Z3MvYmluCiBGSU5EQlVHUyA6PSAkKEZJTkRCVUdTX0RJUikvZmluZGJ1Z3MKLUpBQ09DT19DTElfSkFSIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2phY29jby1jbGkkKENPTU1PTl9KQVZBX1BBQ0tBR0VfU1VGRklYKQorCitKRVRJRklFUiA6PSBwcmVidWlsdHMvc2RrL3Rvb2xzL2pldGlmaWVyL2pldGlmaWVyLXN0YW5kYWxvbmUvYmluL2pldGlmaWVyLXN0YW5kYWxvbmUKIAogIyBUb29sIHRvIG1lcmdlIEFuZHJvaWRNYW5pZmVzdC54bWxzCi1BTkRST0lEX01BTklGRVNUX01FUkdFUiA6PSAkKEpBVkEpIC1jbGFzc3BhdGggcHJlYnVpbHRzL2RldnRvb2xzL3Rvb2xzL2xpYi9tYW5pZmVzdC1tZXJnZXIuamFyIGNvbS5hbmRyb2lkLm1hbmlmbWVyZ2VyLk1haW4gbWVyZ2UKK0FORFJPSURfTUFOSUZFU1RfTUVSR0VSX0NMQVNTUEFUSCA6PSBcCisgICAgcHJlYnVpbHRzL2dyYWRsZS1wbHVnaW4vY29tL2FuZHJvaWQvdG9vbHMvYnVpbGQvbWFuaWZlc3QtbWVyZ2VyLzI2LjAuMC1iZXRhMi9tYW5pZmVzdC1tZXJnZXItMjYuMC4wLWJldGEyLmphciBcCisgICAgcHJlYnVpbHRzL2dyYWRsZS1wbHVnaW4vY29tL2FuZHJvaWQvdG9vbHMvc2RrLWNvbW1vbi8yNi4wLjAtYmV0YTIvc2RrLWNvbW1vbi0yNi4wLjAtYmV0YTIuamFyIFwKKyAgICBwcmVidWlsdHMvZ3JhZGxlLXBsdWdpbi9jb20vYW5kcm9pZC90b29scy9jb21tb24vMjYuMC4wLWJldGEyL2NvbW1vbi0yNi4wLjAtYmV0YTIuamFyIFwKKyAgICBwcmVidWlsdHMvbWlzYy9jb21tb24vZ3VhdmEvZ3VhdmEtMjEuMC5qYXIKK0FORFJPSURfTUFOSUZFU1RfTUVSR0VSIDo9ICQoSkFWQSkgXAorICAgIC1jbGFzc3BhdGggJChzdWJzdCAkKHNwYWNlKSw6LCQoc3RyaXAgJChBTkRST0lEX01BTklGRVNUX01FUkdFUl9DTEFTU1BBVEgpKSkgXAorICAgIGNvbS5hbmRyb2lkLm1hbmlmbWVyZ2VyLk1lcmdlcgogCiBDT0xVTU46PSBjb2x1bW4KIAotIyBXZSBtYXkgbm90IGhhdmUgdGhlIHJpZ2h0IEpBVkFfSE9NRS9QQVRIIHNldCB1cCB5ZXQgd2hlbiB0aGlzIGlzIHJ1biBmcm9tIGVudnNldHVwLnNoLgotaWZuZXEgKCQoQ0FMTEVEX0ZST01fU0VUVVApLHRydWUpCi0KLSMgUGF0aCB0byB0b29scy5qYXIsIG9yIGVtcHR5IGlmIEVYUEVSSU1FTlRBTF9VU0VfT1BFTkpESzkgaXMgc2V0Ci1IT1NUX0pES19UT09MU19KQVIgOj0KLSMgVE9ETzogUmVtb3ZlIEhPU1RfSkRLX1RPT0xTX0pBUiBhbmQgYWxsIHJlZmVyZW5jZXMgdG8gaXQgb25jZSBPcGVuSkRLIDgKLSMgdG9vbGNoYWlucyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCAoaS5lLiB3aGVuIHdoYXQgaXMgbm93Ci0jIEVYUEVSSU1FTlRBTF9VU0VfT1BFTkpESzkgYmVjb21lcyB0aGUgc3RhbmRhcmQpLiBodHRwOi8vYi8zODQxODIyMAogaWZlcSAoJChFWFBFUklNRU5UQUxfVVNFX09QRU5KREs5KSwpCi1IT1NUX0pES19UT09MU19KQVIgOj0gJChzaGVsbCAkKEJVSUxEX1NZU1RFTSkvZmluZC1qZGstdG9vbHMtamFyLnNoKQoraWZlcSAoJChSVU5fRVJST1JfUFJPTkUpLHRydWUpCitVU0VfT1BFTkpESzkgOj0KK2Vsc2UKK1VTRV9PUEVOSkRLOSA6PSB0cnVlCitlbmRpZgorVEFSR0VUX09QRU5KREs5IDo9CitlbHNlIGlmZXEgKCQoRVhQRVJJTUVOVEFMX1VTRV9PUEVOSkRLOSksZmFsc2UpCitVU0VfT1BFTkpESzkgOj0KK1RBUkdFVF9PUEVOSkRLOSA6PQorZWxzZSBpZmVxICgkKEVYUEVSSU1FTlRBTF9VU0VfT1BFTkpESzkpLDEuOCkKK1VTRV9PUEVOSkRLOSA6PSB0cnVlCitUQVJHRVRfT1BFTkpESzkgOj0KK2Vsc2UgaWZlcSAoJChFWFBFUklNRU5UQUxfVVNFX09QRU5KREs5KSx0cnVlKQorVVNFX09QRU5KREs5IDo9IHRydWUKK1RBUkdFVF9PUEVOSkRLOSA6PSB0cnVlCitlbmRpZgogCi1pZm5lcSAoJChIT1NUX0pES19UT09MU19KQVIpLCkKLWlmZXEgKCQod2lsZGNhcmQgJChIT1NUX0pES19UT09MU19KQVIpKSwpCi0kKGVycm9yIEVycm9yOiBjb3VsZCBub3QgZmluZCBqZGsgdG9vbHMuamFyIGF0ICQoSE9TVF9KREtfVE9PTFNfSkFSKSwgcGxlYXNlIGNoZWNrIGlmIHlvdXIgSkRLIHdhcyBpbnN0YWxsZWQgY29ycmVjdGx5KQotZW5kaWYKLWVuZGlmCi1lbmRpZiAjIGlmZXEgKCQoRVhQRVJJTUVOVEFMX1VTRV9PUEVOSkRLOSksKQotCi0jIElzIHRoZSBob3N0IEpESyA2NC1iaXQgdmVyc2lvbj8KLUhPU1RfSkRLX0lTXzY0QklUX1ZFUlNJT04gOj0KLWlmbmVxICgkKGZpbHRlciA2NC1CaXQsICQoc2hlbGwgJChKQVZBKSAtdmVyc2lvbiAyPiYxKSksKQotSE9TVF9KREtfSVNfNjRCSVRfVkVSU0lPTiA6PSB0cnVlCi1lbmRpZgotZW5kaWYgICMgQ0FMTEVEX0ZST01fU0VUVVAgbm90IHRydWUKKyMgUGF0aCB0byB0b29scy5qYXIKK0hPU1RfSkRLX1RPT0xTX0pBUiA6PSAkKEFORFJPSURfSkFWQThfSE9NRSkvbGliL3Rvb2xzLmphcgogCiAjIEl0J3MgY2FsbGVkIG1kNSBvbiBNYWMgT1MgYW5kIG1kNXN1bSBvbiBMaW51eAogaWZlcSAoJChIT1NUX09TKSxkYXJ3aW4pCkBAIC03MTcsNiArNzUzLDE5IEBACiAKIEFQSUNIRUNLX0NPTU1BTkQgOj0gJChBUElDSEVDSykgLUpYbXgxMDI0bSAtSiJjbGFzc3BhdGggJChBUElDSEVDS19DTEFTU1BBVEgpIgogCisjIEJvb2xlYW4gdmFyaWFibGUgZGV0ZXJtaW5pbmcgaWYgdGhlIHdoaXRlbGlzdCBmb3IgY29tcGF0aWJsZSBwcm9wZXJ0aWVzIGlzIGVuYWJsZWQKK1BST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWSA6PSBmYWxzZQoraWZuZXEgKCQoUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZX09WRVJSSURFKSwpCisgIFBST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWSA6PSAkKFBST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWV9PVkVSUklERSkKK2Vsc2UgaWZlcSAoJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksKQorICAjJCh3YXJuaW5nIG5vIHByb2R1Y3Qgc2hpcHBpbmcgbGV2ZWwgZGVmaW5lZCkKK2Vsc2UgaWZuZXEgKCQoY2FsbCBtYXRoX2x0LDI3LCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKSwpCisgIFBST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWSA6PSB0cnVlCitlbmRpZgorCisuS0FUSV9SRUFET05MWSA6PSBcCisgICAgUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZCisKICMgQm9vbGVhbiB2YXJpYWJsZSBkZXRlcm1pbmluZyBpZiBUcmVibGUgaXMgZnVsbHkgZW5hYmxlZAogUFJPRFVDVF9GVUxMX1RSRUJMRSA6PSBmYWxzZQogaWZuZXEgKCQoUFJPRFVDVF9GVUxMX1RSRUJMRV9PVkVSUklERSksKQpAQCAtNzI3LDEyICs3NzYsNzYgQEAKICAgUFJPRFVDVF9GVUxMX1RSRUJMRSA6PSB0cnVlCiBlbmRpZgogCisjIFRPRE8oYi82OTg2NTAzMik6IE1ha2UgUFJPRFVDVF9OT1RJQ0VfU1BMSVQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kIHJlbW92ZQorIyAgICByZWZlcmVuY2VzIHRvIGl0IGhlcmUgYW5kIGJlbG93LgoraWZkZWYgUFJPRFVDVF9OT1RJQ0VfU1BMSVRfT1ZFUlJJREUKKyAgICQoZXJyb3IgUFJPRFVDVF9OT1RJQ0VfU1BMSVRfT1ZFUlJJREUgY2Fubm90IGJlIHNldC4pCitlbmRpZgorCityZXF1aXJlbWVudHMgOj0gXAorICAgIFBST0RVQ1RfVFJFQkxFX0xJTktFUl9OQU1FU1BBQ0VTIFwKKyAgICBQUk9EVUNUX1NFUE9MSUNZX1NQTElUIFwKKyAgICBQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1QgXAorICAgIFBST0RVQ1RfTk9USUNFX1NQTElUCisKKyMgSWYgaXQgaXMgb3ZlcnJpZGVuLCB0aGVuIHRoZSByZXF1aXJlbWVudCBvdmVycmlkZSBpcyB0YWtlbiwgb3RoZXJ3aXNlIGl0J3MKKyMgUFJPRFVDVF9GVUxMX1RSRUJMRQorJChmb3JlYWNoIHJlcSwkKHJlcXVpcmVtZW50cyksJChldmFsIFwKKyAgICAkKHJlcSkgOj0gJChpZiAkKCQocmVxKV9PVkVSUklERSksJCgkKHJlcSlfT1ZFUlJJREUpLCQoUFJPRFVDVF9GVUxMX1RSRUJMRSkpKSkKKyMgSWYgdGhlIHJlcXVpcmVtZW50IGlzIGZhbHNlIGZvciBhbnkgcmVhc29uLCB0aGVuIGl0J3Mgbm90IFBST0RVQ1RfRlVMTF9UUkVCTEUKKyQoZm9yZWFjaCByZXEsJChyZXF1aXJlbWVudHMpLCQoZXZhbCBcCisgICAgUFJPRFVDVF9GVUxMX1RSRUJMRSA6PSAkKGlmICQoZmlsdGVyIGZhbHNlLCQoJChyZXEpKSksZmFsc2UsJChQUk9EVUNUX0ZVTExfVFJFQkxFKSkpKQorCitQUk9EVUNUX0ZVTExfVFJFQkxFX09WRVJSSURFID89CiskKGZvcmVhY2ggcmVxLCQocmVxdWlyZW1lbnRzKSwkKGV2YWwgJChyZXEpX09WRVJSSURFID89KSkKKworLktBVElfUkVBRE9OTFkgOj0gXAorICAgIFBST0RVQ1RfRlVMTF9UUkVCTEVfT1ZFUlJJREUgXAorICAgICQoZm9yZWFjaCByZXEsJChyZXF1aXJlbWVudHMpLCQocmVxKV9PVkVSUklERSkgXAorICAgICQocmVxdWlyZW1lbnRzKSBcCisgICAgUFJPRFVDVF9GVUxMX1RSRUJMRSBcCisKK3JlcXVpcmVtZW50cyA6PQorCisjIEJPQVJEX1BST1BFUlRZX09WRVJSSURFU19TUExJVF9FTkFCTEVEIGNhbiBiZSB0cnVlIG9ubHkgaWYgZWFybHktbW91bnQgb2YKKyMgcGFydGl0aW9ucyBpcyBzdXBwb3J0ZWQuIEJ1dCB0aGUgZWFybHktbW91bnQgbXVzdCBiZSBzdXBwb3J0ZWQgZm9yIGZ1bGwKKyMgdHJlYmxlIHByb2R1Y3RzLCBhbmQgc28gQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQgc2hvdWxkIGJlIHNldAorIyBieSBkZWZhdWx0IGZvciBmdWxsIHRyZWJsZSBwcm9kdWN0cy4KK2lmZXEgKCQoUFJPRFVDVF9GVUxMX1RSRUJMRSksdHJ1ZSkKKyAgQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQgPz0gdHJ1ZQorZW5kaWYKKworIyBJZiBQUk9EVUNUX1VTRV9WTkRLIGlzIHRydWUgYW5kIEJPQVJEX1ZOREtfVkVSU0lPTiBpcyBub3QgZGVmaW5lZCB5ZXQsCisjIEJPQVJEX1ZOREtfVkVSU0lPTiB3aWxsIGJlIHNldCB0byAiY3VycmVudCIgYXMgZGVmYXVsdC4KKyMgUFJPRFVDVF9VU0VfVk5ESyB3aWxsIGJlIHRydWUgaW4gQW5kcm9pZC1QIG9yIGxhdGVyIGxhdW5jaGluZyBkZXZpY2VzLgorUFJPRFVDVF9VU0VfVk5ESyA6PSBmYWxzZQoraWZuZXEgKCQoUFJPRFVDVF9VU0VfVk5ES19PVkVSUklERSksKQorICBQUk9EVUNUX1VTRV9WTkRLIDo9ICQoUFJPRFVDVF9VU0VfVk5ES19PVkVSUklERSkKK2Vsc2UgaWZlcSAoJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksKQorICAjIE5vIHNoaXBwaW5nIGxldmVsIGRlZmluZWQKK2Vsc2UgaWZlcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsMjcsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkpLCkKKyAgUFJPRFVDVF9VU0VfVk5ESyA6PSAkKFBST0RVQ1RfRlVMTF9UUkVCTEUpCitlbmRpZgorCitpZmVxICgkKFBST0RVQ1RfVVNFX1ZOREspLHRydWUpCisgIGlmbmRlZiBCT0FSRF9WTkRLX1ZFUlNJT04KKyAgICBCT0FSRF9WTkRLX1ZFUlNJT04gOj0gY3VycmVudAorICBlbmRpZgorZW5kaWYKKworJChLQVRJX29ic29sZXRlX3ZhciBQUk9EVUNUX1VTRV9WTkRLX09WRVJSSURFLFVzZSBQUk9EVUNUX1VTRV9WTkRLIGluc3RlYWQpCisuS0FUSV9SRUFET05MWSA6PSBcCisgICAgUFJPRFVDVF9VU0VfVk5ESworCiBpZmRlZiBQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTAogICBpZm5lcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksMjcpLCkKICAgICBpZm5lcSAoJChUQVJHRVRfVVNFU19NS0UyRlMpLHRydWUpCiAgICAgICAkKGVycm9yIFdoZW4gUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgPj0gMjcsIFRBUkdFVF9VU0VTX01LRTJGUyBtdXN0IGJlIHRydWUpCiAgICAgZW5kaWYKICAgZW5kaWYKKyAgaWZuZXEgKCQoY2FsbCBudW1iZXJzX2xlc3NfdGhhbiwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwkKEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUykpLCkKKyAgICAkKGVycm9yIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyAoJChCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMpKSBtdXN0IGFsbCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgKCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpKSkKKyAgZW5kaWYKIGVuZGlmCiAKICMgVGhlIGRlZmF1bHQga2V5IGlmIG5vdCBzZXQgYXMgTE9DQUxfQ0VSVElGSUNBVEUKQEAgLTc0Miw0NSArODU1LDM5IEBACiAgIERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSA6PSBidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5CiBlbmRpZgogCi1GUkFNRVdPUktfTUFOSUZFU1RfRklMRSA6PSBzeXN0ZW0vbGliaGlkbC9tYW5pZmVzdC54bWwKK0JVSUxEX05VTUJFUl9GUk9NX0ZJTEUgOj0gJCQoY2F0ICQoT1VUX0RJUikvYnVpbGRfbnVtYmVyLnR4dCkKK0JVSUxEX0RBVEVUSU1FX0ZST01fRklMRSA6PSAkJChjYXQgJChCVUlMRF9EQVRFVElNRV9GSUxFKSkKIAotIyBDb21wYXRpYmlsaXR5IG1hdHJpeCB2ZXJzaW9uaW5nOgotIyBNQVRSSVhfTEVWRUxfT1ZFUlJJREUgZGVmaW5lZDogTUFUUklYX0xFVkVMID0gTUFUUklYX0xFVkVMX09WRVJSSURFCi0jIE1BVFJJWF9MRVZFTF9PVkVSUklERSB1bmRlZmluZWQ6Ci0jICAgRlVMTF9UUkVCTEUgIT0gdHJ1ZTogTUFUUklYX0xFVkVMID0gbGVnYWN5Ci0jICAgRlVMTF9UUkVCTEUgPT0gdHJ1ZToKLSMgICAgIFNISVBQSU5HX0FQSV9MRVZFTCBkZWZpbmVkOiBNQVRSSVhfTEVWRUwgPSBTSElQUElOR19BUElfTEVWRUwKLSMgICAgIFNISVBQSU5HX0FQSV9MRVZFTCB1bmRlZmluZWQ6IE1BVFJJWF9MRVZFTCA9IFBMQVRGT1JNX1NES19WRVJTSU9OCi0jIE1BVFJJWF9MRVZFTCA9PSBsZWdhY3kgPT4gbGVnYWN5LnhtbAotIyBNQVRSSVhfTEVWRUwgPD0gMjYgPT4gMjYueG1sCi0jIE1BVFJJWF9MRVZFTCA9PSAyNyA9PiAyNy54bWwgIyBkZWZpbmUgd2hlbiAyNyByZWxlYXNlcwotIyBNQVRSSVhfTEVWRUwgPT0gMjggPT4gMjgueG1sICMgZGVmaW5lIHdoZW4gMjggcmVsZWFzZXMKLSMgLi4uCi0jIG90aGVyd2lzZSA9PiBjdXJyZW50LnhtbAorIyBTRVBvbGljeSB2ZXJzaW9ucwogCi1pZm5lcSAoJChQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMX09WRVJSSURFKSwpCi0gIFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwgOj0gJChQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMX09WRVJSSURFKQotZWxzZSBpZm5lcSAoJChQUk9EVUNUX0ZVTExfVFJFQkxFKSx0cnVlKQotICBQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMIDo9IGxlZ2FjeQotZWxzZSBpZm5lcSAoJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksKQotICBQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMIDo9ICQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpCi1lbHNlCi0gIFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwgOj0gJChQTEFURk9STV9TREtfVkVSU0lPTikKKyMgUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTiBpcyBhIG51bWJlciBvZiB0aGUgZm9ybSAiTk4ubSIgd2l0aCAiTk4iIG1hcHBpbmcgdG8KKyMgUExBVEZPUk1fU0RLX1ZFUlNJT04gYW5kICJtIiBhcyBhIG1pbm9yIG51bWJlciB3aGljaCBhbGxvd3MgZm9yIFNFTGludXgKKyMgY2hhbmdlcyBpbmRlcGVuZGVudCBvZiBQTEFURk9STV9TREtfVkVSU0lPTi4gIFRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8KKyMgMTAwMDAuMCB0byByZXByZXNlbnQgdGlwLW9mLXRyZWUgZGV2ZWxvcG1lbnQgdGhhdCBpcyBpbmhlcmVudGx5IHVuc3RhYmxlIGFuZAorIyB0aHVzIGRlc2lnbmVkIG5vdCB0byB3b3JrIHdpdGggYW55IHNoaXBwaW5nIHZlbmRvciBwb2xpY3kuICBUaGlzIGlzIHNpbWlsYXIgaW4KKyMgc3Bpcml0IHRvIGhvdyBERUZBVUxUX0FQUF9UQVJHRVRfU0RLIGlzIHNldC4KKyMgVGhlIG1pbm9yIHZlcnNpb24gKCdtJyBjb21wb25lbnQpIG11c3QgYmUgdXBkYXRlZCBldmVyeSB0aW1lIGEgcGxhdGZvcm0gcmVsZWFzZQorIyBpcyBtYWRlIHdoaWNoIGJyZWFrcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHByZXZpb3VzIHBsYXRmb3JtIHNlcG9saWN5IHZlcnNpb24sCisjIG5vdCBqdXN0IG9uIGV2ZXJ5IGluY3JlYXNlIGluIFBMQVRGT1JNX1NES19WRVJTSU9OLiAgVGhlIG1pbm9yIHZlcnNpb24gc2hvdWxkCisjIGJlIHJlc2V0IHRvIDAgb24gZXZlcnkgYnVtcCBvZiB0aGUgUExBVEZPUk1fU0RLX1ZFUlNJT04uCitzZXBvbGljeV9tYWpvcl92ZXJzIDo9IDI3CitzZXBvbGljeV9taW5vcl92ZXJzIDo9IDAKKworaWZuZXEgKCQoc2Vwb2xpY3lfbWFqb3JfdmVycyksICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pKQorJChlcnJvciBzZXBvbGljeV9tYWpvcl92ZXJzaW9uIGRvZXMgbm90IG1hdGNoIFBMQVRGT1JNX1NES19WRVJTSU9OLCBwbGVhc2UgdXBkYXRlLikKIGVuZGlmCi0KLWlmZXEgKCQoc3RyaXAgJChQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMKSksbGVnYWN5KQotICBGUkFNRVdPUktfQ09NUEFUSUJJTElUWV9NQVRSSVhfRklMRSA6PSBoYXJkd2FyZS9pbnRlcmZhY2VzL2NvbXBhdGliaWxpdHlfbWF0cml4LmxlZ2FjeS54bWwKLWVsc2UgaWZlcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJChQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMKSwyNiksKQotICAjIEFsbCBQUk9EVUNUX0ZVTExfVFJFQkxFIGRldmljZXMgd2l0aCBzaGlwcGluZyBBUEkgbGV2ZWxzIDwgMjYgZ2V0IHRoZSBsZXZlbCAyNiBtYW5pZmVzdAotICAjIGFzIHRoYXQgaXMgdGhlIGZpcnN0LgotICBGUkFNRVdPUktfQ09NUEFUSUJJTElUWV9NQVRSSVhfRklMRSA6PSBoYXJkd2FyZS9pbnRlcmZhY2VzL2NvbXBhdGliaWxpdHlfbWF0cml4LjI2LnhtbAotZWxzZSBpZmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwpLDI4KSwpCi0gICMgQWxsIHNoaXBwaW5nIEFQSSBsZXZlbHMgd2l0aCByZWxlYXNlZCBjb21wYXRpYmlsaXR5IG1hdHJpY2VzIGdldCB0aGUgY29ycmVzcG9uZGluZyBtYXRyaXguCi0gIEZSQU1FV09SS19DT01QQVRJQklMSVRZX01BVFJJWF9GSUxFIDo9IFwKLSAgICAgIGhhcmR3YXJlL2ludGVyZmFjZXMvY29tcGF0aWJpbGl0eV9tYXRyaXguJChQUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMKS54bWwKLWVsc2UKLSAgRlJBTUVXT1JLX0NPTVBBVElCSUxJVFlfTUFUUklYX0ZJTEUgOj0gaGFyZHdhcmUvaW50ZXJmYWNlcy9jb21wYXRpYmlsaXR5X21hdHJpeC5jdXJyZW50LnhtbAoraWZuZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQorICAgIHNlcG9saWN5X21ham9yX3ZlcnMgOj0gMTAwMDAKKyAgICBzZXBvbGljeV9taW5vcl92ZXJzIDo9IDAKIGVuZGlmCitQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OIDo9ICQoam9pbiAkKGFkZHN1ZmZpeCAuLCQoc2Vwb2xpY3lfbWFqb3JfdmVycykpLCAkKHNlcG9saWN5X21pbm9yX3ZlcnMpKQorc2Vwb2xpY3lfbWFqb3JfdmVycyA6PQorc2Vwb2xpY3lfbWlub3JfdmVycyA6PQorCisjIEEgbGlzdCBvZiBTRVBvbGljeSB2ZXJzaW9ucywgYmVzaWRlcyBQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OLCB0aGF0IHRoZSBmcmFtZXdvcmsgc3VwcG9ydHMuCitQTEFURk9STV9TRVBPTElDWV9DT01QQVRfVkVSU0lPTlMgOj0gXAorICAgIDI2LjAgXAorICAgIDI3LjAKIAogIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgU2V0IHVwIGZpbmFsIG9wdGlvbnMuCkBAIC04MTgsMTIgKzkyNSw2IEBACiAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKURFWDJPQVRfVEFSR0VUX0lOU1RSVUNUSU9OX1NFVF9GRUFUVVJFUyA6PSBkZWZhdWx0CiBlbmRpZgogCi0jIFRoZXNlIHdpbGwgY29tZSBmcm9tIFNvb25nLCBkcm9wIHRoZSBlbnZpcm9ubWVudCB2ZXJzaW9ucwotdW5leHBvcnQgQ0xBTkcKLXVuZXhwb3J0IENMQU5HX0NYWAotdW5leHBvcnQgQ0NDX0NDCi11bmV4cG9ydCBDQ0NfQ1hYCi0KICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIENvbGxlY3QgYSBsaXN0IG9mIHRoZSBTREsgdmVyc2lvbnMgdGhhdCB3ZSBjb3VsZCBjb21waWxlIGFnYWluc3QKICMgRm9yIHVzZSB3aXRoIHRoZSBMT0NBTF9TREtfVkVSU0lPTiB2YXJpYWJsZSBmb3IgaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCkBAIC04NTksMTggKzk2MCwzNCBAQAogICAgICQocGF0c3Vic3QgJChISVNUT1JJQ0FMX1NES19WRVJTSU9OU19ST09UKS8lL2FuZHJvaWQuamFyLCUsIFwKICAgICAkKHdpbGRjYXJkICQoSElTVE9SSUNBTF9TREtfVkVSU0lPTlNfUk9PVCkvKi9hbmRyb2lkLmphcikpKQogCi0jIFdlIGRvbid0IGhhdmUgcHJlYnVpbHQgdGVzdF9jdXJyZW50IFNESyB5ZXQuCi1UQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUyA6PSB0ZXN0X2N1cnJlbnQgJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykKK1RBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TIDo9ICQoYWRkcHJlZml4IHN5c3RlbV8sJChjYWxsIG51bWVyaWNhbGx5X3NvcnQsXAorICAgICQocGF0c3Vic3QgJChISVNUT1JJQ0FMX1NES19WRVJTSU9OU19ST09UKS8lL2FuZHJvaWRfc3lzdGVtLmphciwlLCBcCisgICAgJCh3aWxkY2FyZCAkKEhJU1RPUklDQUxfU0RLX1ZFUlNJT05TX1JPT1QpLyovYW5kcm9pZF9zeXN0ZW0uamFyKSkpKSBcCisgICAgJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykKKworIyBXZSBkb24ndCBoYXZlIHByZWJ1aWx0IHRlc3RfY3VycmVudCBhbmQgY29yZV9jdXJyZW50IFNESyB5ZXQuCitUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUyA6PSB0ZXN0X2N1cnJlbnQgY29yZV9jdXJyZW50ICQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpCisKK1RBUkdFVF9TREtfVkVSU0lPTlNfV0lUSE9VVF9KQVZBXzE4X1NVUFBPUlQgOj0gJChjYWxsIG51bWJlcnNfbGVzc190aGFuLDI0LCQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKQorVEFSR0VUX1NES19WRVJTSU9OU19XSVRIT1VUX0pBVkFfMTlfU1VQUE9SVCA6PSAkKGNhbGwgbnVtYmVyc19sZXNzX3RoYW4sMjcsJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpCiAKIElOVEVSTkFMX1BMQVRGT1JNX0FQSV9GSUxFIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvUEFDS0FHSU5HL3B1YmxpY19hcGkudHh0CitJTlRFUk5BTF9QTEFURk9STV9QUklWQVRFX0FQSV9GSUxFIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvUEFDS0FHSU5HL3ByaXZhdGUudHh0CitJTlRFUk5BTF9QTEFURk9STV9QUklWQVRFX0RFWF9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9wcml2YXRlLWRleC50eHQKIElOVEVSTkFMX1BMQVRGT1JNX1JFTU9WRURfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvcmVtb3ZlZC50eHQKIElOVEVSTkFMX1BMQVRGT1JNX1NZU1RFTV9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9zeXN0ZW0tYXBpLnR4dAorSU5URVJOQUxfUExBVEZPUk1fU1lTVEVNX1BSSVZBVEVfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvc3lzdGVtLXByaXZhdGUudHh0CitJTlRFUk5BTF9QTEFURk9STV9TWVNURU1fUFJJVkFURV9ERVhfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvc3lzdGVtLXByaXZhdGUtZGV4LnR4dAogSU5URVJOQUxfUExBVEZPUk1fU1lTVEVNX1JFTU9WRURfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvc3lzdGVtLXJlbW92ZWQudHh0CiBJTlRFUk5BTF9QTEFURk9STV9TWVNURU1fRVhBQ1RfQVBJX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvc3lzdGVtLWV4YWN0LnR4dAogSU5URVJOQUxfUExBVEZPUk1fVEVTVF9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy90ZXN0LWFwaS50eHQKIElOVEVSTkFMX1BMQVRGT1JNX1RFU1RfUkVNT1ZFRF9BUElfRklMRSA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy90ZXN0LXJlbW92ZWQudHh0CiBJTlRFUk5BTF9QTEFURk9STV9URVNUX0VYQUNUX0FQSV9GSUxFIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvUEFDS0FHSU5HL3Rlc3QtZXhhY3QudHh0CiAKK0lOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9MSUdIVF9HUkVZTElTVCA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9oaWRkZW5hcGktbGlnaHQtZ3JleWxpc3QudHh0CitJTlRFUk5BTF9QTEFURk9STV9ISURERU5BUElfREFSS19HUkVZTElTVCA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL1BBQ0tBR0lORy9oaWRkZW5hcGktZGFyay1ncmV5bGlzdC50eHQKK0lOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9CTEFDS0xJU1QgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9QQUNLQUdJTkcvaGlkZGVuYXBpLWJsYWNrbGlzdC50eHQKKwogIyBUaGlzIGlzIHRoZSBzdGFuZGFyZCB3YXkgdG8gbmFtZSBhIGRpcmVjdG9yeSBjb250YWluaW5nIHByZWJ1aWx0IHRhcmdldAogIyBvYmplY3RzLiBFLmcuLCBwcmVidWlsdC8kKFRBUkdFVF9QUkVCVUlMVF9UQUcpL2xpYmMuc28KIFRBUkdFVF9QUkVCVUlMVF9UQUcgOj0gYW5kcm9pZC0kKFRBUkdFVF9BUkNIKQpAQCAtODgyLDU3ICs5OTksMjMgQEAKIAogUlNfUFJFQlVJTFRfQ0xDT1JFIDo9IHByZWJ1aWx0cy9zZGsvcmVuZGVyc2NyaXB0L2xpYi8kKFRBUkdFVF9BUkNIKS9saWJyc3J0XyQoVEFSR0VUX0FSQ0gpLmJjCiBSU19QUkVCVUlMVF9DT01QSUxFUl9SVCA6PSBwcmVidWlsdHMvc2RrL3JlbmRlcnNjcmlwdC9saWIvJChUQVJHRVRfQVJDSCkvbGliY29tcGlsZXJfcnQuYQotaWZlcSAodHJ1ZSwkKFRBUkdFVF9JU182NF9CSVQpKQotUlNfUFJFQlVJTFRfTElCUEFUSCA6PSAtTCBwcmVidWlsdHMvbmRrL3IxMC9wbGF0Zm9ybXMvYW5kcm9pZC0yMS9hcmNoLSQoVEFSR0VUX0FSQ0gpL3Vzci9saWI2NCBcCi0gICAgICAgICAgICAgICAgICAgICAgIC1MIHByZWJ1aWx0cy9uZGsvcjEwL3BsYXRmb3Jtcy9hbmRyb2lkLTIxL2FyY2gtJChUQVJHRVRfQVJDSCkvdXNyL2xpYgotZWxzZQotUlNfUFJFQlVJTFRfTElCUEFUSCA6PSAtTCBwcmVidWlsdHMvbmRrL3IxMC9wbGF0Zm9ybXMvYW5kcm9pZC05L2FyY2gtJChUQVJHRVRfQVJDSCkvdXNyL2xpYgotZW5kaWYKIAogIyBBUEkgTGV2ZWwgbGlzdHMgZm9yIFJlbmRlcnNjcmlwdCBDb21wYXQgbGliLgogUlNDT01QQVRfMzJCSVRfT05MWV9BUElfTEVWRUxTIDo9IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMAogUlNDT01QQVRfTk9fVVNBR0VJT19BUElfTEVWRUxTIDo9IDggOSAxMCAxMSAxMiAxMwogCi1pZmVxICgkKEpBVkFfTk9UX1JFUVVJUkVEKSx0cnVlKQotIyBSZW1vdmUgamF2YSBhbmQgdG9vbHMgZnJvbSBvdXIgcGF0aCBzbyB0aGF0IHdlIG1ha2Ugc3VyZSBub2JvZHkgdXNlcyB0aGVtLgotdW5leHBvcnQgQU5EUk9JRF9KQVZBX0hPTUUKLXVuZXhwb3J0IEpBVkFfSE9NRQotZXhwb3J0IEFORFJPSURfQlVJTERfUEFUSFM6PSQoYWJzcGF0aCAkKEJVSUxEX1NZU1RFTSkvbm9famF2YV9wYXRoKTokKEFORFJPSURfQlVJTERfUEFUSFMpCi1leHBvcnQgUEFUSDo9JChhYnNwYXRoICQoQlVJTERfU1lTVEVNKS9ub19qYXZhX3BhdGgpOiQoUEFUSCkKKyMgQWRkIEJVSUxEX05VTUJFUiB0byBhcHBzIGRlZmF1bHQgdmVyc2lvbiBuYW1lIGlmIGl0J3MgdW5idW5kbGVkIGJ1aWxkLgoraWZkZWYgVEFSR0VUX0JVSUxEX0FQUFMKK1RBUkdFVF9CVUlMRF9XSVRIX0FQUFNfVkVSU0lPTl9OQU1FIDo9IHRydWUKIGVuZGlmCiAKLSMgUHJvamVjdHMgY2xlYW4gb2YgY29tcGlsZXIgd2FybmluZ3Mgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGggLVdlcnJvci4KLSMgSWYgbW9zdCBtb2R1bGVzIGluIGEgZGlyZWN0b3J5IHN1Y2ggYXMgZXh0ZXJuYWwvIGhhdmUgd2FybmluZ3MsCi0jIHRoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIGluIEFORFJPSURfV0FSTklOR19BTExPV0VEX1BST0pFQ1RTIGxpc3QuCi0jIFdoZW4gc29tZSBvZiBpdHMgc3ViZGlyZWN0b3JpZXMgYXJlIGNsZWFuZWQgdXAsIHRoZSBzdWJkaXJlY3RvcmllcwotIyBjYW4gYmUgYWRkZWQgaW50byBBTkRST0lEX1dBUk5JTkdfRElTQUxMT1dFRF9QUk9KRUNUUyBsaXN0LCBlLmcuCi0jIGV4dGVybmFsL2Zpby8uCi1BTkRST0lEX1dBUk5JTkdfRElTQUxMT1dFRF9QUk9KRUNUUyA6PSBcCi0gICAgYXJ0LyUgXAotICAgIGJpb25pYy8lIFwKLSAgICBleHRlcm5hbC9maW8vJSBcCi0gICAgaGFyZHdhcmUvaW50ZXJmYWNlcy8lIFwKK2lmZGVmIFRBUkdFVF9CVUlMRF9XSVRIX0FQUFNfVkVSU0lPTl9OQU1FCitBUFBTX0RFRkFVTFRfVkVSU0lPTl9OQU1FIDo9ICQoUExBVEZPUk1fVkVSU0lPTiktJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKQorZWxzZQorQVBQU19ERUZBVUxUX1ZFUlNJT05fTkFNRSA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pCitlbmRpZgogCi1kZWZpbmUgZmluZF93YXJuaW5nX2Rpc2FsbG93ZWRfcHJvamVjdHMKLSAgICAkKGZpbHRlciAkKEFORFJPSURfV0FSTklOR19ESVNBTExPV0VEX1BST0pFQ1RTKSwkKDEpLykKLWVuZGVmCi0KLSMgUHJvamVjdHMgd2l0aCBjb21waWxlciB3YXJuaW5ncyBhcmUgY29tcGlsZWQgd2l0aG91dCAtV2Vycm9yLgotQU5EUk9JRF9XQVJOSU5HX0FMTE9XRURfUFJPSkVDVFMgOj0gXAotICAgIGJvb3RhYmxlLyUgXAotICAgIGN0cy8lIFwKLSAgICBkYWx2aWsvJSBcCi0gICAgZGV2ZWxvcG1lbnQvJSBcCi0gICAgZGV2aWNlLyUgXAotICAgIGV4dGVybmFsLyUgXAotICAgIGZyYW1ld29ya3MvJSBcCi0gICAgaGFyZHdhcmUvJSBcCi0gICAgcGFja2FnZXMvJSBcCi0gICAgc3lzdGVtLyUgXAotICAgIHRlc3QvdnRzLyUgXAotICAgIHRvb2xzL2FkdC9pZGVhL2FuZHJvaWQvdWx0aW1hdGUvZ2V0X21vZGlmaWNhdGlvbl90aW1lL2puaS8lIFwKLSAgICB2ZW5kb3IvJSBcCi0KKyMgQU5EUk9JRF9XQVJOSU5HX0FMTE9XRURfUFJPSkVDVFMgaXMgZ2VuZXJhdGVkIGJ5IGJ1aWxkL3Nvb25nLgogZGVmaW5lIGZpbmRfd2FybmluZ19hbGxvd2VkX3Byb2plY3RzCiAgICAgJChmaWx0ZXIgJChBTkRST0lEX1dBUk5JTkdfQUxMT1dFRF9QUk9KRUNUUyksJCgxKS8pCiBlbmRlZgpAQCAtOTQ2LDYgKzEwMjksNyBAQAogICAgIGNhY2hlaW1hZ2Utbm9kZXBzIFwKICAgICBicHRpbWFnZS1ub2RlcHMgXAogICAgIHZub2QgdmVuZG9yaW1hZ2Utbm9kZXBzIFwKKyAgICBwbm9kIHByb2R1Y3RpbWFnZS1ub2RlcHMgXAogICAgIHN5c3RlbW90aGVyaW1hZ2Utbm9kZXBzIFwKICAgICByYW1kaXNrLW5vZGVwcyBcCiAgICAgYm9vdGltYWdlLW5vZGVwcyBcCkBAIC05NTMsNyArMTAzNyw3IEBACiAgICAgdmJtZXRhaW1hZ2Utbm9kZXBzIFwKICAgICBwcm9kdWN0LWdyYXBoIGR1bXAtcHJvZHVjdHMKIAotaWZuZGVmIEtBVEkKK2lmZXEgKCQoQ0FMTEVEX0ZST01fU0VUVVApLHRydWUpCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9uaW5qYV9jb25maWcubWsKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Nvb25nX2NvbmZpZy5tawogZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvY29uZmlnX3Nhbml0aXplcnMubWsgYi9jb3JlL2NvbmZpZ19zYW5pdGl6ZXJzLm1rCmluZGV4IDBkMTgyZTkuLjk0MTUxNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvY29uZmlnX3Nhbml0aXplcnMubWsKKysrIGIvY29yZS9jb25maWdfc2FuaXRpemVycy5tawpAQCAtMjIsNiArMjIsMzAgQEAKICAgZW5kaWYKIGVuZGlmCiAKKyMgRGlzYWJsZSBnbG9iYWwgaW50ZWdlcl9vdmVyZmxvdyBpbiBleGNsdWRlZCBwYXRocy4KK2lmbmVxICgkKGZpbHRlciBpbnRlZ2VyX292ZXJmbG93LCAkKG15X2dsb2JhbF9zYW5pdGl6ZSkpLCkKKyAgY29tYmluZWRfZXhjbHVkZV9wYXRocyA6PSAkKElOVEVHRVJfT1ZFUkZMT1dfRVhDTFVERV9QQVRIUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9JTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpCisKKyAgaWZuZXEgKCQoc3RyaXAgJChmb3JlYWNoIGRpciwkKHN1YnN0ICQoY29tbWEpLCQoc3BhY2UpLCQoY29tYmluZWRfZXhjbHVkZV9wYXRocykpLFwKKyAgICAgICAgICQoZmlsdGVyICQoZGlyKSUsJChMT0NBTF9QQVRIKSkpKSwpCisgICAgbXlfZ2xvYmFsX3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBpbnRlZ2VyX292ZXJmbG93LCQobXlfZ2xvYmFsX3Nhbml0aXplKSkKKyAgICBteV9nbG9iYWxfc2FuaXRpemVfZGlhZyA6PSAkKGZpbHRlci1vdXQgaW50ZWdlcl9vdmVyZmxvdywkKG15X2dsb2JhbF9zYW5pdGl6ZV9kaWFnKSkKKyAgZW5kaWYKK2VuZGlmCisKKyMgRGlzYWJsZSBnbG9iYWwgQ0ZJIGluIGV4Y2x1ZGVkIHBhdGhzCitpZm5lcSAoJChmaWx0ZXIgY2ZpLCAkKG15X2dsb2JhbF9zYW5pdGl6ZSkpLCkKKyAgY29tYmluZWRfZXhjbHVkZV9wYXRocyA6PSAkKENGSV9FWENMVURFX1BBVEhTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0NGSV9FWENMVURFX1BBVEhTKQorCisgIGlmbmVxICgkKHN0cmlwICQoZm9yZWFjaCBkaXIsJChzdWJzdCAkKGNvbW1hKSwkKHNwYWNlKSwkKGNvbWJpbmVkX2V4Y2x1ZGVfcGF0aHMpKSxcCisgICAgICAgICAkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSksKQorICAgIG15X2dsb2JhbF9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgY2ZpLCQobXlfZ2xvYmFsX3Nhbml0aXplKSkKKyAgICBteV9nbG9iYWxfc2FuaXRpemVfZGlhZyA6PSAkKGZpbHRlci1vdXQgY2ZpLCQobXlfZ2xvYmFsX3Nhbml0aXplX2RpYWcpKQorICBlbmRpZgorZW5kaWYKKwogaWZuZXEgKCQobXlfZ2xvYmFsX3Nhbml0aXplKSwpCiAgIG15X3Nhbml0aXplIDo9ICQobXlfZ2xvYmFsX3Nhbml0aXplKSAkKG15X3Nhbml0aXplKQogZW5kaWYKQEAgLTcyLDYgKzk2LDE4IEBACiAgIG15X3Nhbml0aXplX2RpYWcgOj0KIGVuZGlmCiAKKyMgRW5hYmxlIENGSSBpbiBpbmNsdWRlZCBwYXRocy4KK2lmZXEgKCQoZmlsdGVyIGNmaSwgJChteV9zYW5pdGl6ZSkpLCkKKyAgY29tYmluZWRfaW5jbHVkZV9wYXRocyA6PSAkKENGSV9JTkNMVURFX1BBVEhTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0NGSV9JTkNMVURFX1BBVEhTKQorCisgIGlmbmVxICgkKHN0cmlwICQoZm9yZWFjaCBkaXIsJChzdWJzdCAkKGNvbW1hKSwkKHNwYWNlKSwkKGNvbWJpbmVkX2luY2x1ZGVfcGF0aHMpKSxcCisgICAgICAgICAkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSksKQorICAgIG15X3Nhbml0aXplIDo9IGNmaSAkKG15X3Nhbml0aXplKQorICAgIG15X3Nhbml0aXplX2RpYWcgOj0gY2ZpICQobXlfc2FuaXRpemVfZGlhZykKKyAgZW5kaWYKK2VuZGlmCisKICMgSWYgQ0ZJIGlzIGRpc2FibGVkIGdsb2JhbGx5LCByZW1vdmUgaXQgZnJvbSBteV9zYW5pdGl6ZS4KIGlmZXEgKCQoc3RyaXAgJChFTkFCTEVfQ0ZJKSksZmFsc2UpCiAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBjZmksJChteV9zYW5pdGl6ZSkpCkBAIC05Niw2ICsxMzIsMTIgQEAKICAgbXlfc2FuaXRpemVfZGlhZyA6PSAkKGZpbHRlci1vdXQgY2ZpLCQobXlfc2FuaXRpemVfZGlhZykpCiBlbmRpZgogCisjIERpc2FibGUgQ0ZJIGZvciBob3N0IHRhcmdldHMKK2lmZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCisgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBjZmksJChteV9zYW5pdGl6ZSkpCisgIG15X3Nhbml0aXplX2RpYWcgOj0gJChmaWx0ZXItb3V0IGNmaSwkKG15X3Nhbml0aXplX2RpYWcpKQorZW5kaWYKKwogIyBTdXBwb3J0IGZvciBsb2NhbCBzYW5pdGl6ZSBibGFja2xpc3QgcGF0aHMuCiBpZm5lcSAoJChteV9zYW5pdGl6ZSkkKG15X2dsb2JhbF9zYW5pdGl6ZSksKQogICBpZm5lcSAoJChMT0NBTF9TQU5JVElaRV9CTEFDS0xJU1QpLCkKQEAgLTEwMywxNyArMTQ1LDggQEAKICAgZW5kaWYKIGVuZGlmCiAKKyMgRGlzYWJsZSBpbnRlZ2VyX292ZXJmbG93IGlmIExPQ0FMX05PU0FOSVRJWkU9aW50ZWdlci4KIGlmbmVxICgkKGZpbHRlciBpbnRlZ2VyX292ZXJmbG93LCAkKG15X2dsb2JhbF9zYW5pdGl6ZSkgJChteV9zYW5pdGl6ZSkpLCkKLSAgIyBEaXNhYmxlIGludGVnZXJfb3ZlcmZsb3cgaW4gZXhjbHVkZWQgcGF0aHMuCi0gIGNvbWJpbmVkX2V4Y2x1ZGVfcGF0aHMgOj0gJChJTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFBST0RVQ1RfSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTKQotCi0gIGlmbmVxICgkKHN0cmlwICQoZm9yZWFjaCBkaXIsJChzdWJzdCAkKGNvbW1hKSwkKHNwYWNlKSwkKGNvbWJpbmVkX2V4Y2x1ZGVfcGF0aHMpKSxcCi0gICAgICAgICAkKGZpbHRlciAkKGRpciklLCQoTE9DQUxfUEFUSCkpKSksKQotICAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBpbnRlZ2VyX292ZXJmbG93LCQobXlfc2FuaXRpemUpKQotICAgIG15X3Nhbml0aXplX2RpYWcgOj0gJChmaWx0ZXItb3V0IGludGVnZXJfb3ZlcmZsb3csJChteV9zYW5pdGl6ZV9kaWFnKSkKLSAgZW5kaWYKLSAgIyBEaXNhYmxlIGludGVnZXJfb3ZlcmZsb3cgaWYgTE9DQUxfTk9TQU5JVElaRT1pbnRlZ2VyLgogICBpZm5lcSAoJChmaWx0ZXIgaW50ZWdlciwgJChzdHJpcCAkKExPQ0FMX05PU0FOSVRJWkUpKSksKQogICAgIG15X3Nhbml0aXplIDo9ICQoZmlsdGVyLW91dCBpbnRlZ2VyX292ZXJmbG93LCQobXlfc2FuaXRpemUpKQogICAgIG15X3Nhbml0aXplX2RpYWcgOj0gJChmaWx0ZXItb3V0IGludGVnZXJfb3ZlcmZsb3csJChteV9zYW5pdGl6ZV9kaWFnKSkKQEAgLTEzNCw2ICsxNjcsOCBAQAogICAgIGVsc2UKICAgICAgICAgJChlcnJvciAkKExPQ0FMX1BBVEgpOiAkKExPQ0FMX01PRFVMRSk6IFRTQU4gY2Fubm90IGJlIHVzZWQgZm9yIDMyLWJpdCBtb2R1bGVzLikKICAgICBlbmRpZgorICBlbHNlCisgICAgbXlfc2hhcmVkX2xpYnJhcmllcyArPSAkKFRTQU5fUlVOVElNRV9MSUJSQVJZKQogICBlbmRpZgogZW5kaWYKIApAQCAtMTcyLDcgKzIwNyw3IEBACiAgIGlmZXEgKCQoZmlsdGVyIGFkZHJlc3MsJChteV9zYW5pdGl6ZSkpLCkKICAgICAkKGVycm9yICQoTE9DQUxfUEFUSCk6ICQoTE9DQUxfTU9EVUxFKTogVXNlIG9mICdjb3ZlcmFnZScgYWxzbyByZXF1aXJlcyAnYWRkcmVzcycpCiAgIGVuZGlmCi0gIG15X2NmbGFncyArPSAtZnNhbml0aXplLWNvdmVyYWdlPXRyYWNlLXBjLWd1YXJkCisgIG15X2NmbGFncyArPSAtZnNhbml0aXplLWNvdmVyYWdlPXRyYWNlLXBjLWd1YXJkLGluZGlyZWN0LWNhbGxzLHRyYWNlLWNtcAogICBteV9zYW5pdGl6ZSA6PSAkKGZpbHRlci1vdXQgY292ZXJhZ2UsJChteV9zYW5pdGl6ZSkpCiBlbmRpZgogCkBAIC0yMTQsNyArMjQ5LDYgQEAKICAgaWZkZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKICAgICBteV9jZmxhZ3MgKz0gLWZuby1zYW5pdGl6ZS1yZWNvdmVyPWFsbAogICAgIG15X2xkZmxhZ3MgKz0gLWZzYW5pdGl6ZT0kKGZzYW5pdGl6ZV9hcmcpCi0gICAgbXlfbGRsaWJzICs9IC1scnQgLWxkbAogICBlbHNlCiAgICAgbXlfY2ZsYWdzICs9IC1mc2FuaXRpemUtdHJhcD1hbGwKICAgICBteV9jZmxhZ3MgKz0gLWZ0cmFwLWZ1bmN0aW9uPWFib3J0CkBAIC0yMzEsMTIgKzI2NSwyMSBAQAogICAjIGVudGlyZSBtb2R1bGUuCiAgIExPQ0FMX0FSTV9NT0RFIDo9IHRodW1iCiAgIG15X2NmbGFncyArPSAkKENGSV9FWFRSQV9DRkxBR1MpCisgICMgT25seSBhcHBlbmQgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmbGFnIGlmIC1mdmlzaWJpbGl0eSBoYXMgbm90IGFscmVhZHkgYmVlbgorICAjIHNldCB0byBoaWRkZW4uCisgIGlmZXEgKCQoZmlsdGVyIC1mdmlzaWJpbGl0eT1oaWRkZW4sJChMT0NBTF9DRkxBR1MpKSwpCisgICAgbXlfY2ZsYWdzICs9IC1mdmlzaWJpbGl0eT1kZWZhdWx0CisgIGVuZGlmCiAgIG15X2xkZmxhZ3MgKz0gJChDRklfRVhUUkFfTERGTEFHUykKICAgbXlfYXJmbGFncyArPSAtLXBsdWdpbiAkKExMVk1fUFJFQlVJTFRTX1BBVEgpLy4uL2xpYjY0L0xMVk1nb2xkLnNvCi0gICMgV29ya2Fyb3VuZCBmb3IgYi8zMzY3ODE5Mi4gQ0ZJIGp1bXB0YWJsZXMgbmVlZCBUaHVtYjIgY29kZWdlbi4gIFJldmVydCB3aGVuCi0gICMgQ2xhbmcgaXMgdXBkYXRlZCBwYXN0IHIyOTAzODQuCi0gIGlmbmVxICgkKGZpbHRlciBhcm0sJChUQVJHRVRfJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpKSwpCi0gICAgbXlfbGRmbGFncyArPSAtbWFyY2g9YXJtdjctYQorCisgIGlmZXEgKCQoTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEUpLHRydWUpCisgICAgICAgIG15X2xkZmxhZ3MgOj0gJChmaWx0ZXItb3V0IC1mc2FuaXRpemUtY2ZpLWNyb3NzLWRzbywkKG15X2xkZmxhZ3MpKQorICAgICAgICBteV9jZmxhZ3MgOj0gJChmaWx0ZXItb3V0IC1mc2FuaXRpemUtY2ZpLWNyb3NzLWRzbywkKG15X2NmbGFncykpCisgIGVsc2UKKyAgICAgICAgIyBBcHBseSB0aGUgdmVyc2lvbiBzY3JpcHQgdG8gbm9uLXN0YXRpYyBleGVjdXRhYmxlcworICAgICAgICBteV9sZGZsYWdzICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0LGJ1aWxkL3Nvb25nL2NjL2NvbmZpZy9jZmlfZXhwb3J0cy5tYXAKKyAgICAgICAgTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgKz0gYnVpbGQvc29vbmcvY2MvY29uZmlnL2NmaV9leHBvcnRzLm1hcAogICBlbmRpZgogZW5kaWYKIApAQCAtMjQ2LDcgKzI4OSw2IEBACiAgIGlmZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAgICAgIyAtbm9kZWZhdWx0bGlicyAocHJvdmlkZWQgd2l0aCBsaWJjKyspIHByZXZlbnRzIHRoZSBkcml2ZXIgZnJvbSBsaW5raW5nCiAgICAgIyBsaWJyYXJpZXMgbmVlZGVkIHdpdGggLWZzYW5pdGl6ZT1hZGRyZXNzLiBodHRwOi8vYi8xODY1MDI3NSAoV0FJKQotICAgIG15X2xkbGlicyArPSAtbG0gLWxwdGhyZWFkCiAgICAgbXlfbGRmbGFncyArPSAtV2wsLS1uby1hcy1uZWVkZWQKICAgZWxzZQogICAgICMgQWRkIGFzYW4gbGlicmFyaWVzIHVubGVzcyBMT0NBTF9NT0RVTEUgaXMgdGhlIGFzYW4gbGlicmFyeS4KQEAgLTI4NCwyMyArMzI2LDIyIEBACiAgIGVuZGlmCiBlbmRpZgogCi1pZm5lcSAoJChmaWx0ZXIgdW5kZWZpbmVkLCQobXlfc2FuaXRpemUpKSwpCi0gIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotICAgICQoZXJyb3IgdWJzYW4gaXMgbm90IHlldCBzdXBwb3J0ZWQgb24gdGhlIHRhcmdldCkKLSAgZW5kaWYKLWVuZGlmCi0KIGlmbmVxICgkKHN0cmlwICQoTE9DQUxfU0FOSVRJWkVfUkVDT1ZFUikpLCkKICAgcmVjb3Zlcl9hcmcgOj0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKExPQ0FMX1NBTklUSVpFX1JFQ09WRVIpKSwKICAgbXlfY2ZsYWdzICs9IC1mc2FuaXRpemUtcmVjb3Zlcj0kKHJlY292ZXJfYXJnKQogZW5kaWYKIAogaWZuZXEgKCQobXlfc2FuaXRpemVfZGlhZyksKQotICBub3RyYXBfYXJnIDo9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChteV9zYW5pdGl6ZV9kaWFnKSksCi0gIG15X2NmbGFncyArPSAtZm5vLXNhbml0aXplLXRyYXA9JChub3RyYXBfYXJnKQotICAjIERpYWdub3N0aWMgcmVxdWlyZXMgYSBydW50aW1lIGxpYnJhcnksIHVubGVzcyBBU2FuIG9yIFRTYW4gYXJlIGFsc28gZW5hYmxlZC4KLSAgaWZlcSAoJChmaWx0ZXIgYWRkcmVzcyB0aHJlYWQsJChteV9zYW5pdGl6ZSkpLCkKLSAgICAjIERvZXMgbm90IGhhdmUgdG8gYmUgdGhlIGZpcnN0IERUX05FRURFRCB1bmxpa2UgQVNhbi4KLSAgICBteV9zaGFyZWRfbGlicmFyaWVzICs9ICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKVVCU0FOX1JVTlRJTUVfTElCUkFSWSkKKyAgIyBUT0RPKHZpc2h3YXRoKTogQWRkIGRpYWdub3N0aWMgc3VwcG9ydCBmb3Igc3RhdGljIGV4ZWN1dGFibGVzIG9uY2UKKyAgIyB3ZSBzd2l0Y2ggdG8gY2xhbmctNDM5MzEyMiAod2hpY2ggYWRkcyB0aGUgc3RhdGljIHVic2FuIHJ1bnRpbWUKKyAgIyB0aGF0IHRoaXMgZGVwZW5kcyBvbikKKyAgaWZuZXEgKCQoTE9DQUxfRk9SQ0VfU1RBVElDX0VYRUNVVEFCTEUpLHRydWUpCisgICAgbm90cmFwX2FyZyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQobXlfc2FuaXRpemVfZGlhZykpLAorICAgIG15X2NmbGFncyArPSAtZm5vLXNhbml0aXplLXRyYXA9JChub3RyYXBfYXJnKQorICAgICMgRGlhZ25vc3RpYyByZXF1aXJlcyBhIHJ1bnRpbWUgbGlicmFyeSwgdW5sZXNzIEFTYW4gb3IgVFNhbiBhcmUgYWxzbyBlbmFibGVkLgorICAgIGlmZXEgKCQoZmlsdGVyIGFkZHJlc3MgdGhyZWFkLCQobXlfc2FuaXRpemUpKSwpCisgICAgICAjIERvZXMgbm90IGhhdmUgdG8gYmUgdGhlIGZpcnN0IERUX05FRURFRCB1bmxpa2UgQVNhbi4KKyAgICAgIG15X3NoYXJlZF9saWJyYXJpZXMgKz0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpVUJTQU5fUlVOVElNRV9MSUJSQVJZKQorICAgIGVuZGlmCiAgIGVuZGlmCiBlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9jb25maWd1cmVfbG9jYWxfamFjay5tayBiL2NvcmUvY29uZmlndXJlX2xvY2FsX2phY2subWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MDQ5YTMuLjAwMDAwMDAKLS0tIGEvY29yZS9jb25maWd1cmVfbG9jYWxfamFjay5taworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWlmZGVmIEFORFJPSURfRk9SQ0VfSkFDS19FTkFCTEVECi1MT0NBTF9KQUNLX0VOQUJMRUQgOj0gJChBTkRST0lEX0ZPUkNFX0pBQ0tfRU5BQkxFRCkKLWVuZGlmCi0KLWlmbmVxICgkKEFORFJPSURfQ09NUElMRV9XSVRIX0pBQ0spLHRydWUpCi1MT0NBTF9KQUNLX0VOQUJMRUQgOj0KLWVuZGlmCi0KLUxPQ0FMX0pBQ0tfRU5BQkxFRCA6PSAkKHN0cmlwICQoTE9DQUxfSkFDS19FTkFCTEVEKSkKLUxPQ0FMX01PRFVMRSA6PSAkKHN0cmlwICQoTE9DQUxfTU9EVUxFKSkKLQotdmFsaWRfamFja19lbmFibGVkX3ZhbHVlcyA6PSBmdWxsIGluY3JlbWVudGFsIGphdmFjX2Zyb250ZW5kIGRpc2FibGVkCi0KLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotICBpZm5lcSAoJChMT0NBTF9KQUNLX0VOQUJMRUQpLCQoZmlsdGVyICQoZmlyc3R3b3JkICQoTE9DQUxfSkFDS19FTkFCTEVEKSksJCh2YWxpZF9qYWNrX2VuYWJsZWRfdmFsdWVzKSkpCi0gICAgJChlcnJvciAkKExPQ0FMX1BBVEgpOiBpbnZhbGlkIExPQ0FMX0pBQ0tfRU5BQkxFRCAiJChMT0NBTF9KQUNLX0VOQUJMRUQpIiBmb3IgJChMT0NBTF9NT0RVTEUpKQotICBlbmRpZgotCi0gIGlmZXEgKCQoTE9DQUxfSkFDS19FTkFCTEVEKSxkaXNhYmxlZCkKLSAgICBMT0NBTF9KQUNLX0VOQUJMRUQgOj0KLSAgZW5kaWYKLWVuZGlmCi0KLWlmZGVmICQoTE9DQUxfTU9EVUxFKS5KQUNLX1ZFUlNJT04KLUxPQ0FMX0pBQ0tfVkVSU0lPTiA6PSAkKCQoTE9DQUxfTU9EVUxFKS5KQUNLX1ZFUlNJT04pCi1lbHNlCi1MT0NBTF9KQUNLX1ZFUlNJT04gOj0gJChKQUNLX0RFRkFVTFRfVkVSU0lPTikKLWVuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2N4eF9zdGxfc2V0dXAubWsgYi9jb3JlL2N4eF9zdGxfc2V0dXAubWsKaW5kZXggMGJhZWMyNi4uNTE3MWI4YSAxMDA2NDQKLS0tIGEvY29yZS9jeHhfc3RsX3NldHVwLm1rCisrKyBiL2NvcmUvY3h4X3N0bF9zZXR1cC5tawpAQCAtNzQsNiArNzQsMTYgQEAKIGlmbmVxICgkKGZpbHRlciAkKG15X2N4eF9zdGwpLGxpYmMrKyBsaWJjKytfc3RhdGljKSwpCiAgICAgbXlfY2ZsYWdzICs9IC1EX1VTSU5HX0xJQkNYWAogCisgICAgaWZlcSAoJCgkKG15X3ByZWZpeClPUyksZGFyd2luKQorICAgICAgICAjIGxpYmMrKydzIGhlYWRlcnMgYXJlIGFubm90YXRlZCB3aXRoIGF2YWlsYWJpbGl0eSBtYWNyb3MgdGhhdCBpbmRpY2F0ZQorICAgICAgICAjIHdoaWNoIHZlcnNpb24gb2YgTWFjIE9TIHdhcyB0aGUgZmlyc3QgdG8gc2hpcCB3aXRoIGEgbGliYysrIGZlYXR1cmUKKyAgICAgICAgIyBhdmFpbGFibGUgaW4gaXRzICpzeXN0ZW0ncyogbGliYysrLmR5bGliLiBXZSBkbyBub3QgdXNlIHRoZSBzeXN0ZW0ncworICAgICAgICAjIGxpYnJhcnksIGJ1dCByYXRoZXIgc2hpcCBvdXIgb3duLiBBcyBzdWNoLCB0aGVzZSBhdmFpbGFiaWxpdHkKKyAgICAgICAgIyBhdHRyaWJ1dGVzIGFyZSBtZWFuaW5nbGVzcyBmb3IgdXMgYnV0IGNhdXNlIGJ1aWxkIGJyZWFrcyB3aGVuIHdlIHRyeQorICAgICAgICAjIHRvIHVzZSBjb2RlIHRoYXQgd291bGQgbm90IGJlIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtJ3MgZHlsaWIuCisgICAgICAgIG15X2NwcGZsYWdzICs9IC1EX0xJQkNQUF9ESVNBQkxFX0FWQUlMQUJJTElUWQorICAgIGVuZGlmCisKICAgICAjIE5vdGUgdGhhdCB0aGUgc3RydWN0dXJlIG9mIHRoaXMgbWVhbnMgdGhhdCBMT0NBTF9DWFhfU1RMIDo9IGxpYmMrKyB3aWxsCiAgICAgIyB1c2UgdGhlIHN0YXRpYyBsaWJjKysgZm9yIHN0YXRpYyBleGVjdXRhYmxlcy4KICAgICBpZmVxICgkKG15X2xpbmtfdHlwZSksZHluYW1pYykKQEAgLTg5LDcgKzk5LDYgQEAKICAgICBpZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQogICAgICAgICBteV9jcHBmbGFncyArPSAtbm9zdGRpbmMrKwogICAgICAgICBteV9sZGZsYWdzICs9IC1ub2RlZmF1bHRsaWJzCi0gICAgICAgIG15X2xkbGlicyArPSAtbHB0aHJlYWQgLWxtCiAgICAgICAgIG15X2N4eF9sZGxpYnMgKz0gJCgkKCQobXlfcHJlZml4KU9TKV8kKG15X2xpbmtfdHlwZSlfZ2NjbGlicykKICAgICBlbHNlCiAgICAgICAgIGlmZXEgKGFybSwkKCQobXlfcHJlZml4KSQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKSkKZGlmZiAtLWdpdCBhL2NvcmUvZGVmaW5pdGlvbnMubWsgYi9jb3JlL2RlZmluaXRpb25zLm1rCmluZGV4IDk1ZTlhMDIuLjFmYjAzZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvZGVmaW5pdGlvbnMubWsKKysrIGIvY29yZS9kZWZpbml0aW9ucy5tawpAQCAtMTY3LDcgKzE2Nyw3IEBACiAjICQoMSk6IGRpcmVjdG9yeSB0byBzZWFyY2ggdW5kZXIKICMgSWdub3JlcyAkKDEpL0FuZHJvaWQubWsKIGRlZmluZSBmaXJzdC1tYWtlZmlsZXMtdW5kZXIKLSQoc2hlbGwgYnVpbGQvdG9vbHMvZmluZGxlYXZlcy5weSAkKEZJTkRfTEVBVkVTX0VYQ0xVREVTKSBcCiskKHNoZWxsIGJ1aWxkL21ha2UvdG9vbHMvZmluZGxlYXZlcy5weSAkKEZJTkRfTEVBVkVTX0VYQ0xVREVTKSBcCiAgICAgICAgIC0tbWluZGVwdGg9MiAkKGFkZHByZWZpeCAtLWRpcj0sJCgxKSkgQW5kcm9pZC5taykKIGVuZGVmCiAKQEAgLTY3MSwyNyArNjcxLDI4IEBACiAjIyAkKDIpOiBOb24tZW1wdHkgaWYgSVNfSE9TVF9NT0RVTEUKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLSMgJCgxKTogbGlicmFyeSBuYW1lCi0jICQoMik6IE5vbi1lbXB0eSBpZiBJU19IT1NUX01PRFVMRQotZGVmaW5lIF9qYXZhLWxpYi1kaXIKLSQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsIFwKLQlKQVZBX0xJQlJBUklFUywkKDEpLCQoMiksQ09NTU9OKQotZW5kZWYKLQotIyAkKDEpOiBsaWJyYXJ5IG5hbWUKLSMgJCgyKTogTm9uLWVtcHR5IGlmIElTX0hPU1RfTU9EVUxFCi1kZWZpbmUgX2phdmEtbGliLWZ1bGwtY2xhc3Nlcy5qYXIKLSQoY2FsbCBfamF2YS1saWItZGlyLCQoMSksJCgyKSkvY2xhc3Nlcy5qYXIKLWVuZGVmCi0KICMgR2V0IHRoZSBqYXIgZmlsZXMgKHlvdSBjYW4gcGFzcyB0byAiamF2YWMgLWNsYXNzcGF0aCIpIG9mIHN0YXRpYyBvciBzaGFyZWQKICMgSmF2YSBsaWJyYXJpZXMgdGhhdCB5b3Ugd2FudCB0byBsaW5rIGFnYWluc3QuCiAjICQoMSk6IGxpYnJhcnkgbmFtZSBsaXN0CiAjICQoMik6IE5vbi1lbXB0eSBpZiBJU19IT1NUX01PRFVMRQogZGVmaW5lIGphdmEtbGliLWZpbGVzCi0kKGZvcmVhY2ggbGliLCQoMSksJChjYWxsIF9qYXZhLWxpYi1mdWxsLWNsYXNzZXMuamFyLCQobGliKSwkKDIpKSkKKyQoZm9yZWFjaCBsaWIsJCgxKSwkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQobGliKSwkKDIpLENPTU1PTikvY2xhc3Nlcy5qYXIpCiBlbmRlZgogCisjIEdldCB0aGUgaGVhZGVyIGphciBmaWxlcyAoeW91IGNhbiBwYXNzIHRvICJqYXZhYyAtY2xhc3NwYXRoIikgb2Ygc3RhdGljIG9yIHNoYXJlZAorIyBKYXZhIGxpYnJhcmllcyB0aGF0IHlvdSB3YW50IHRvIGxpbmsgYWdhaW5zdC4KKyMgJCgxKTogbGlicmFyeSBuYW1lIGxpc3QKKyMgJCgyKTogTm9uLWVtcHR5IGlmIElTX0hPU1RfTU9EVUxFCitpZm5lcSAoJChUVVJCSU5FX0VOQUJMRUQpLGZhbHNlKQorZGVmaW5lIGphdmEtbGliLWhlYWRlci1maWxlcworJChmb3JlYWNoIGxpYiwkKDEpLCQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsJChsaWIpLCQoMiksQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIpCitlbmRlZgorZWxzZQorZGVmaW5lIGphdmEtbGliLWhlYWRlci1maWxlcworJChjYWxsIGphdmEtbGliLWZpbGVzLCQoMSksJCgyKSkKK2VuZGVmCitlbmRpZgorCiAjIEdldCB0aGUgZGVwZW5kZW5jeSBmaWxlcyAoeW91IGNhbiBwdXQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgInwiIG9mIGEgYnVpbGQgcnVsZSkKICMgb2YgdGhlIEphdmEgbGlicmFyaWVzLgogIyAkKDEpOiBsaWJyYXJ5IG5hbWUgbGlzdApAQCAtNzA0LDI1ICs3MDUsMjYgQEAKICQoY2FsbCBqYXZhLWxpYi1maWxlcywkKDEpLCQoMikpCiBlbmRlZgogCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBDb252ZXJ0ICJjb3JlIGV4dCBmcmFtZXdvcmsiIHRvICJvdXQvLi4uL2NsYXNzZXMuamFjayAuLi4iCi0jIyAkKDEpOiBsaWJyYXJ5IGxpc3QKLSMjICQoMik6IE5vbi1lbXB0eSBpZiBJU19IT1NUX01PRFVMRQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAkKDEpOiBsaWJyYXJ5IG5hbWUKLSMgJCgyKTogTm9uLWVtcHR5IGlmIElTX0hPU1RfTU9EVUxFCi1kZWZpbmUgX2phY2stbGliLWZ1bGwtY2xhc3NlcwotJChjYWxsIF9qYXZhLWxpYi1kaXIsJCgxKSwkKDIpKS9jbGFzc2VzLmphY2sKLWVuZGVmCi0KKyMgR2V0IHRoZSBqYXIgZmlsZXMgKHlvdSBjYW4gcGFzcyB0byAiamF2YWMgLWNsYXNzcGF0aCIpIG9mIHN0YXRpYyBvciBzaGFyZWQKKyMgQVBLIGxpYnJhcmllcyB0aGF0IHlvdSB3YW50IHRvIGxpbmsgYWdhaW5zdC4KICMgJCgxKTogbGlicmFyeSBuYW1lIGxpc3QKLSMgJCgyKTogTm9uLWVtcHR5IGlmIElTX0hPU1RfTU9EVUxFCi1kZWZpbmUgamFjay1saWItZmlsZXMKLSQoZm9yZWFjaCBsaWIsJCgxKSwkKGNhbGwgX2phY2stbGliLWZ1bGwtY2xhc3NlcywkKGxpYiksJCgyKSkpCitkZWZpbmUgYXBwLWxpYi1maWxlcworJChmb3JlYWNoIGxpYiwkKDEpLCQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsQVBQUywkKGxpYiksLENPTU1PTikvY2xhc3Nlcy5qYXIpCiBlbmRlZgogCisjIEdldCB0aGUgaGVhZGVyIGphciBmaWxlcyAoeW91IGNhbiBwYXNzIHRvICJqYXZhYyAtY2xhc3NwYXRoIikgb2Ygc3RhdGljIG9yIHNoYXJlZAorIyBBUEsgbGlicmFyaWVzIHRoYXQgeW91IHdhbnQgdG8gbGluayBhZ2FpbnN0LgorIyAkKDEpOiBsaWJyYXJ5IG5hbWUgbGlzdAoraWZuZXEgKCQoVFVSQklORV9FTkFCTEVEKSxmYWxzZSkKK2RlZmluZSBhcHAtbGliLWhlYWRlci1maWxlcworJChmb3JlYWNoIGxpYiwkKDEpLCQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsQVBQUywkKGxpYiksLENPTU1PTikvY2xhc3Nlcy1oZWFkZXIuamFyKQorZW5kZWYKK2Vsc2UKK2RlZmluZSBhcHAtbGliLWhlYWRlci1maWxlcworJChjYWxsIGFwcC1saWItZmlsZXMsJCgxKSkKK2VuZGVmCitlbmRpZgorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgUmV0dXJucyB0cnVlIGlmICQoMSkgYW5kICQoMikgYXJlIGVxdWFsLiAgUmV0dXJucwogIyMgdGhlIGVtcHR5IHN0cmluZyBpZiB0aGV5IGFyZSBub3QgZXF1YWwuCkBAIC0xMDQ4LDggKzEwNTAsOSBAQAogCS1XbCwtcnBhdGgsXCQkT1JJR0lOLy4uL2xpYiBcCiAJJChkaXIgJEApLyQobm90ZGlyICQoPDouYmM9Lm8pKSBcCiAJJChSU19QUkVCVUlMVF9DT01QSUxFUl9SVCkgXAotCS1vICRAICQoVEFSR0VUX0dMT0JBTF9MREZMQUdTKSAtV2wsLS1oYXNoLXN0eWxlPXN5c3YgLUwgcHJlYnVpbHRzL2djYy8gXAotCSQoUlNfUFJFQlVJTFRfTElCUEFUSCkgXAorCS1vICRAICQoVEFSR0VUX0dMT0JBTF9MREZMQUdTKSAtV2wsLS1oYXNoLXN0eWxlPXN5c3YgXAorCS1MICQoU09PTkdfT1VUX0RJUikvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLSQoUFJJVkFURV9TREtfVkVSU0lPTikvYXJjaC0kKFRBUkdFVF9BUkNIKS91c3IvbGliNjQgXAorCS1MICQoU09PTkdfT1VUX0RJUikvbmRrL3BsYXRmb3Jtcy9hbmRyb2lkLSQoUFJJVkFURV9TREtfVkVSU0lPTikvYXJjaC0kKFRBUkdFVF9BUkNIKS91c3IvbGliIFwKIAkkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFNIQVJFRF9MSUJSQVJJRVMsbGliUlNTdXBwb3J0KS9saWJSU1N1cHBvcnQuc28gXAogCS1sbSAtbGMKIGVuZGVmCkBAIC0xNTUzLDcgKzE1NTYsNyBAQAogICAgICAgICBmaWxlbGlzdD0iJCRmaWxlbGlzdCAkJGxkaXIvJCRleHQkJGYiOyBcCiAgICAgZG9uZSA7IFwKICAgICAkKCQoUFJJVkFURV8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9BUikgJCgkKFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfR0xPQkFMX0FSRkxBR1MpIFwKLSAgICAgICAgJCgyKSAkJGZpbGVsaXN0CisgICAgICAgICQoUFJJVkFURV9BUkZMQUdTKSAkKDIpICQkZmlsZWxpc3QKIAogZW5kZWYKIApAQCAtMTcyMCw2ICsxNzIzLDEwIEBACiAkKGlmICQoUFJJVkFURV9BTExfT0JKRUNUUyksLCQoaGlkZSkgJCgkKFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWCkkKFBSSVZBVEVfUFJFRklYKUFSKSBkICQoMSkgJChkaXIgJCgxKSlkdW1teS5vIFwKICAgJiYgcm0gLWYgJChkaXIgJCgxKSlkdW1teS5vKQogZW5kZWYKK2Vsc2UKK2NyZWF0ZS1kdW1teS5vLWlmLW5vLW9ianMgPQorZ2V0LWR1bW15Lm8taWYtbm8tb2JqcyA9CitkZWxldGUtZHVtbXkuby1pZi1uby1vYmpzID0KIGVuZGlmICAjIEhPU1RfT1MgaXMgZGFyd2luCiAKICMgRXhwbGljaXRseSBkZWxldGUgdGhlIGFyY2hpdmUgZmlyc3Qgc28gdGhhdCBhciBkb2Vzbid0CkBAIC0xOTk5LDE3ICsyMDA2LDYgQEAKICMjIENvbW1hbmRzIGZvciBydW5uaW5nIGphdmFjIHRvIG1ha2UgLmNsYXNzIGZpbGVzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0jIEFkZCBCVUlMRF9OVU1CRVIgdG8gYXBwcyBkZWZhdWx0IHZlcnNpb24gbmFtZSBpZiBpdCdzIHVuYnVuZGxlZCBidWlsZC4KLWlmZGVmIFRBUkdFVF9CVUlMRF9BUFBTCi1UQVJHRVRfQlVJTERfV0lUSF9BUFBTX1ZFUlNJT05fTkFNRSA6PSB0cnVlCi1lbmRpZgotCi1pZmRlZiBUQVJHRVRfQlVJTERfV0lUSF9BUFBTX1ZFUlNJT05fTkFNRQotQVBQU19ERUZBVUxUX1ZFUlNJT05fTkFNRSA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pLSQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkKLWVsc2UKLUFQUFNfREVGQVVMVF9WRVJTSU9OX05BTUUgOj0gJChQTEFURk9STV9WRVJTSU9OKQotZW5kaWYKLQogIyBiLzM3NzUwMjI0CiBBQVBUX0FTQU5fT1BUSU9OUyA6PSBBU0FOX09QVElPTlM9ZGV0ZWN0X2xlYWtzPTAKIApAQCAtMjA0Myw5ICsyMDM5LDExIEBACiAgICAgJChhZGRwcmVmaXggLS1yZW5hbWUtbWFuaWZlc3QtcGFja2FnZSAsICQoUFJJVkFURV9NQU5JRkVTVF9QQUNLQUdFX05BTUUpKSBcCiAgICAgJChhZGRwcmVmaXggLS1yZW5hbWUtaW5zdHJ1bWVudGF0aW9uLXRhcmdldC1wYWNrYWdlICwgJChQUklWQVRFX01BTklGRVNUX0lOU1RSVU1FTlRBVElPTl9GT1IpKSBcCiAgICAgLS1za2lwLXN5bWJvbHMtd2l0aG91dC1kZWZhdWx0LWxvY2FsaXphdGlvbgorIyBTbyB0aGF0IHdlIHJlLXJ1biBhYXB0IHdoZW4gdGhlIGxpc3Qgb2YgaW5wdXQgZmlsZXMgY2hhbmdlCiskKGhpZGUpIGVjaG8gJChQUklWQVRFX1JFU09VUkNFX0xJU1QpID4vZGV2L251bGwKIGVuZGVmCiAKLSMgU2VhcmNoIGZvciBnZW5lcmF0ZWQgUi5qYXZhL01hbmlmZXN0LmphdmEsIGNvcHkgdGhlIGZvdW5kIFIuamF2YSBhcyAkQC4KKyMgU2VhcmNoIGZvciBnZW5lcmF0ZWQgUi5qYXZhL01hbmlmZXN0LmphdmEsIGNvcHkgdGhlIGZvdW5kIFIuamF2YSBhcyAkMS4KICMgQWxzbyBjb3B5IHRoZW0gdG8gYSBjZW50cmFsICdSJyBkaXJlY3RvcnkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYWRkIHRoZSBmaWxlcyB0byBhbiBJREUuCiBkZWZpbmUgZmluZC1nZW5lcmF0ZWQtUi5qYXZhCiAkKGhpZGUpIGZvciBHRU5FUkFURURfTUFOSUZFU1RfRklMRSBpbiBgZmluZCAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSBcCkBAIC0yMDYwLDExICsyMDU4LDExIEBACiAgICAgbWtkaXIgLXAgJChUQVJHRVRfQ09NTU9OX09VVF9ST09UKS9SLyQkZGlyOyBcCiAgICAgJChBQ1ApIC1mcCAkJEdFTkVSQVRFRF9SX0ZJTEUgJChUQVJHRVRfQ09NTU9OX09VVF9ST09UKS9SLyQkZGlyIFwKICAgICAgIHx8IGV4aXQgMzE7IFwKLSAgICAkKEFDUCkgLWZwICQkR0VORVJBVEVEX1JfRklMRSAkQCB8fCBleGl0IDMyOyBcCisgICAgJChBQ1ApIC1mcCAkJEdFTkVSQVRFRF9SX0ZJTEUgJDEgfHwgZXhpdCAzMjsgXAogICBkb25lOwogQCMgRW5zdXJlIHRoYXQgdGhlIHRhcmdldCBmaWxlIGlzIGFsd2F5cyBjcmVhdGVkLCBpLmUuIGFsc28gaW4gY2FzZSB3ZSBkaWQgbm90CiBAIyBlbnRlciB0aGUgR0VORVJBVEVEX1JfRklMRS1sb29wIGFib3ZlLiBUaGlzIGF2b2lkcyB1bm5lY2Vzc2FyeSByZWJ1aWxkaW5nLgotJChoaWRlKSB0b3VjaCAkQAorJChoaWRlKSB0b3VjaCAkMQogZW5kZWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTIxODQsNTggKzIxODIsODggQEAKICAgICAgIGV4aXQgMTsgXAogICAgIGZpOyBcCiAgICAgdW56aXAgLXFvICQkZiAtZCAkKDIpOyBcCisgICAgcm0gLWYgJCgyKS9tb2R1bGUtaW5mby5jbGFzczsgXAogICBkb25lCiAgICQoaWYgJChQUklWQVRFX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORiksLCQoaGlkZSkgcm0gLXJmICQoMikvTUVUQS1JTkYpCiBlbmRlZgogCi0jIENhbGwgamFjaworIyBSZXR1cm4gamFyIGFyZ3VtZW50cyB0byBjb21wcmVzcyBmaWxlcyBpbiBhIGdpdmVuIGRpcmVjdG9yeQorIyAkKDEpOiBkaXJlY3RvcnkKICMKLWRlZmluZSBjYWxsLWphY2sKLSBKQUNLX1ZFUlNJT049JChQUklWQVRFX0pBQ0tfVkVSU0lPTikgJChKQUNLKSAkKERFRkFVTFRfSkFDS19FWFRSQV9BUkdTKQorIyBSZXR1cm5zIGFuIEAtZmlsZSBhcmd1bWVudCB0aGF0IGNvbnRhaW5zIHRoZSBvdXRwdXQgb2YgYSBzdWJzaGVsbAorIyB0aGF0IGxvb2tzIGxpa2UgLUMgJCgxKSBwYXRoL3RvL2ZpbGUxIC1DICQoMSkgcGF0aC90by9maWxlMgorIyBBbHNvIGFkZHMgIi1DIG91dC9lbXB0eSAuIiB3aGljaCBhdm9pZHMgZXJyb3JzIGluIGphciB3aGVuCisjIHRoZXJlIGFyZSBubyBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5LgorZGVmaW5lIGphci1hcmdzLXNvcnRlZC1maWxlcy1pbi1kaXJlY3RvcnkKKyAgICBAPChmaW5kICQoMSkgLXR5cGUgZiB8IHNvcnQgfCAkKEpBUl9BUkdTKSAkKDEpOyBlY2hvICItQyAkKEVNUFRZX0RJUkVDVE9SWSkgLiIpCiBlbmRlZgogCi0jIENvbW1vbiBkZWZpbml0aW9uIHRvIGludm9rZSBqYXZhYyBvbiB0aGUgaG9zdCBhbmQgdGFyZ2V0LgotIworIyBhcHBlbmQgYWRkaXRpb25hbCBKYXZhIHNvdXJjZXMocmVzb3VyY2VzL1Byb3RvIHNvdXJjZXMsIGFuZCBldGMpIHRvICQoMSkuCitkZWZpbmUgZmV0Y2gtYWRkaXRpb25hbC1qYXZhLXNvdXJjZQorJChoaWRlKSBpZiBbIC1kICIkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSIgXTsgdGhlbiBcCisgICAgZmluZCAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyAtYW5kIC1ub3QgLW5hbWUgJy4qJyA+PiAkKDEpOyBcCitmaQorJChpZiAkKFBSSVZBVEVfSEFTX1BST1RPX1NPVVJDRVMpLCBcCisgICAgJChoaWRlKSBmaW5kICQoUFJJVkFURV9QUk9UT19TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIC1uYW1lICcqLmphdmEnIC1hbmQgLW5vdCAtbmFtZSAnLionID4+ICQoMSkpCiskKGlmICQoUFJJVkFURV9IQVNfUlNfU09VUkNFUyksIFwKKyAgICAkKGhpZGUpIGZpbmQgJChQUklWQVRFX1JTX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgLW5hbWUgJyouamF2YScgLWFuZCAtbm90IC1uYW1lICcuKicgPj4gJCgxKSkKK2VuZGVmCisKICMgU29tZSBoaXN0b3JpY2FsIG5vdGVzOgogIyAtIGJlbG93IHdlIHdyaXRlIHRoZSBsaXN0IG9mIGphdmEgZmlsZXMgdG8gamF2YS1zb3VyY2UtbGlzdCB0byBhdm9pZCBhcmd1bWVudAogIyAgIGxpc3QgbGVuZ3RoIHByb2JsZW1zIHdpdGggQ3lnd2luCiAjIC0gd2UgZmlsdGVyIG91dCBkdXBsaWNhdGUgamF2YSBmaWxlIG5hbWVzIGJlY2F1c2UgZWNsaXBzZSdzIGNvbXBpbGVyCiAjICAgZG9lc24ndCBsaWtlIHRoZW0uCitkZWZpbmUgd3JpdGUtamF2YS1zb3VyY2UtbGlzdAorQGVjaG8gIiQoJChQUklWQVRFX1BSRUZJWClESVNQTEFZKSBKYXZhIHNvdXJjZSBsaXN0OiAkKFBSSVZBVEVfTU9EVUxFKSIKKyQoaGlkZSkgcm0gLWYgJEAKKyQoY2FsbCBkdW1wLXdvcmRzLXRvLWZpbGUsJChzb3J0ICQoUFJJVkFURV9KQVZBX1NPVVJDRVMpKSwkQC50bXApCiskKGNhbGwgZmV0Y2gtYWRkaXRpb25hbC1qYXZhLXNvdXJjZSwkQC50bXApCiskKGhpZGUpIHRyICcgJyAnXG4nIDwgJEAudG1wIHwgJChOT1JNQUxJWkVfUEFUSCkgfCBzb3J0IC11ID4gJEAKK2VuZGVmCisKKyMgJCgxKTogc2hhcmRpbmcgbnVtYmVyLgorIyAkKDIpOiBKYXZhIHNvdXJjZSBmaWxlcyBwYXRocy4KK2RlZmluZSBzYXZlLXNoYXJkZWQtamF2YS1zb3VyY2UtbGlzdAorJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpLnNoYXJkLiQoMSk6ICQoMikgJCQoTk9STUFMSVpFX1BBVEgpCisJQGVjaG8gInNoYXJkIGphdmEgc291cmNlIGxpc3Q6ICQkQCIKKwlybSAtZiAkJEAKKwkkJChjYWxsIGR1bXAtd29yZHMtdG8tZmlsZSwkKDIpLCQkQC50bXApCisJJChoaWRlKSB0ciAnICcgJ1xuJyA8ICQkQC50bXAgfCAkJChOT1JNQUxJWkVfUEFUSCkgfCBzb3J0IC11ID4gJCRACitlbmRlZgorCisjIENvbW1vbiBkZWZpbml0aW9uIHRvIGludm9rZSBqYXZhYyBvbiB0aGUgaG9zdCBhbmQgdGFyZ2V0LgogIwogIyAkKDEpOiBqYXZhYwotIyAkKDIpOiBib290Y2xhc3NwYXRoCisjICQoMik6IGNsYXNzcGF0aF9saWJzCiBkZWZpbmUgY29tcGlsZS1qYXZhCiAkKGhpZGUpIHJtIC1mICRACiAkKGhpZGUpIHJtIC1yZiAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpICQoUFJJVkFURV9BTk5PX0lOVEVSTUVESUFURVNfRElSKQogJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKICQoaGlkZSkgbWtkaXIgLXAgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKSAkKFBSSVZBVEVfQU5OT19JTlRFUk1FRElBVEVTX0RJUikKLSQoY2FsbCB1bnppcC1qYXItZmlsZXMsJChQUklWQVRFX1NUQVRJQ19KQVZBX0xJQlJBUklFUyksJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKSkKLSQoY2FsbCBkdW1wLXdvcmRzLXRvLWZpbGUsJChQUklWQVRFX0pBVkFfU09VUkNFUyksJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0KQotJChoaWRlKSBpZiBbIC1kICIkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSIgXTsgdGhlbiBcCi0gICAgICAgICAgZmluZCAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyAtYW5kIC1ub3QgLW5hbWUgJy4qJyA+PiAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3Q7IFwKLWZpCi0kKGlmICQoUFJJVkFURV9IQVNfUFJPVE9fU09VUkNFUyksIFwKLSAgICAkKGhpZGUpIGZpbmQgJChQUklWQVRFX1BST1RPX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgLW5hbWUgJyouamF2YScgLWFuZCAtbm90IC1uYW1lICcuKicgPj4gJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0ICkKLSQoaWYgJChQUklWQVRFX0hBU19SU19TT1VSQ0VTKSwgXAotICAgICQoaGlkZSkgZmluZCAkKFBSSVZBVEVfUlNfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyAtYW5kIC1ub3QgLW5hbWUgJy4qJyA+PiAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QgKQotJChoaWRlKSB0ciAnICcgJ1xuJyA8ICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdCBcCi0gICAgfCAkKE5PUk1BTElaRV9QQVRIKSB8IHNvcnQgLXUgPiAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcQotJChoaWRlKSBpZiBbIC1zICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdC11bmlxIF0gOyB0aGVuIFwKLSAgICAkKFNPT05HX0pBVkFDX1dSQVBQRVIpICQoMSkgLWVuY29kaW5nIFVURi04IFwKKyQoaGlkZSkgaWYgWyAtcyAkKFBSSVZBVEVfSkFWQV9TT1VSQ0VfTElTVCkgXSA7IHRoZW4gXAorICAgICQoU09PTkdfSkFWQUNfV1JBUFBFUikgJChKQVZBQ19XUkFQUEVSKSAkKDEpIC1lbmNvZGluZyBVVEYtOCBcCiAgICAgJChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFBSSVZBVEVfV0FSTklOR1NfRU5BQkxFKSksJCh4bGludF91bmNoZWNrZWQpLCkgXAotICAgICQoMikgXAotICAgICQoYWRkcHJlZml4IC1jbGFzc3BhdGggLCQoc3RyaXAgXAotICAgICAgICAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfQUxMX0pBVkFfTElCUkFSSUVTKSkpKSBcCisgICAgJChpZiAkKFBSSVZBVEVfVVNFX1NZU1RFTV9NT0RVTEVTKSwgXAorICAgICAgJChhZGRwcmVmaXggLS1zeXN0ZW09LCQoUFJJVkFURV9TWVNURU1fTU9EVUxFU19ESVIpKSwgXAorICAgICAgJChhZGRwcmVmaXggLWJvb3RjbGFzc3BhdGggLCQoc3RyaXAgXAorICAgICAgICAgICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoUFJJVkFURV9CT09UQ0xBU1NQQVRIKSkgXAorICAgICAgICAgICQoUFJJVkFURV9FTVBUWV9CT09UQ0xBU1NQQVRIKSkpKSBcCisgICAgJChpZiAkKFBSSVZBVEVfVVNFX1NZU1RFTV9NT0RVTEVTKSwgXAorICAgICAgJChpZiAkKFBSSVZBVEVfUEFUQ0hfTU9EVUxFKSwgXAorICAgICAgICAtLXBhdGNoLW1vZHVsZT0kKFBSSVZBVEVfUEFUQ0hfTU9EVUxFKT0kKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwuICQoMikpKSkgXAorICAgICQoYWRkcHJlZml4IC1jbGFzc3BhdGggLCQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoc3RyaXAgXAorICAgICAgJChpZiAkKFBSSVZBVEVfVVNFX1NZU1RFTV9NT0RVTEVTKSwgXAorICAgICAgICAkKGZpbHRlci1vdXQgJChQUklWQVRFX1NZU1RFTV9NT0RVTEVTX0xJQlMpLCQoUFJJVkFURV9CT09UQ0xBU1NQQVRIKSkpIFwKKyAgICAgICQoMikpKSkgXAogICAgICQoaWYgJChmaW5kc3RyaW5nIHRydWUsJChQUklWQVRFX1dBUk5JTkdTX0VOQUJMRSkpLCQoeGxpbnRfdW5jaGVja2VkKSwpIFwKLSAgICAtZXh0ZGlycyAiIiAtZCAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpIC1zICQoUFJJVkFURV9BTk5PX0lOVEVSTUVESUFURVNfRElSKSBcCisgICAgLWQgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKSAtcyAkKFBSSVZBVEVfQU5OT19JTlRFUk1FRElBVEVTX0RJUikgXAogICAgICQoUFJJVkFURV9KQVZBQ0ZMQUdTKSBcCi0gICAgXEAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcSBcCisgICAgXEAkKFBSSVZBVEVfSkFWQV9TT1VSQ0VfTElTVCkgXAogICAgIHx8ICggcm0gLXJmICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikgOyBleGl0IDQxICkgXAogZmkKLSQoaWYgJChQUklWQVRFX0pBVkFfTEFZRVJTX0ZJTEUpLCAkKGhpZGUpIGJ1aWxkL3Rvb2xzL2phdmEtbGF5ZXJzLnB5IFwKLSAgICAkKFBSSVZBVEVfSkFWQV9MQVlFUlNfRklMRSkgXEAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcSwpCi0kKGhpZGUpIHJtIC1mICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdAotJChoaWRlKSBybSAtZiAkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcQorJChpZiAkKFBSSVZBVEVfSkFWQV9MQVlFUlNfRklMRSksICQoaGlkZSkgYnVpbGQvbWFrZS90b29scy9qYXZhLWxheWVycy5weSBcCisgICAgJChQUklWQVRFX0pBVkFfTEFZRVJTX0ZJTEUpIEAkKFBSSVZBVEVfSkFWQV9TT1VSQ0VfTElTVCksKQogJChpZiAkKFBSSVZBVEVfSkFSX0VYQ0xVREVfRklMRVMpLCAkKGhpZGUpIGZpbmQgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKSBcCiAgICAgLW5hbWUgJCh3b3JkIDEsICQoUFJJVkFURV9KQVJfRVhDTFVERV9GSUxFUykpIFwKICAgICAkKGFkZHByZWZpeCAtbyAtbmFtZSAsICQod29yZGxpc3QgMiwgOTk5LCAkKFBSSVZBVEVfSkFSX0VYQ0xVREVfRklMRVMpKSkgXApAQCAtMjI0OCwxNTMgKzIyNzYsNjIgQEAKICQoaWYgJChQUklWQVRFX0pBUl9FWENMVURFX1BBQ0tBR0VTKSwgJChoaWRlKSBybSAtcmYgXAogICAgICQoZm9yZWFjaCBwa2csICQoUFJJVkFURV9KQVJfRVhDTFVERV9QQUNLQUdFUyksIFwKICAgICAgICAgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKS8kKHN1YnN0IC4sLywkKHBrZykpKSkKLSQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksIFwKLSAgICAkKGhpZGUpIHNlZCAtZSAicy8lQlVJTERfTlVNQkVSJS8kKEJVSUxEX05VTUJFUl9GUk9NX0ZJTEUpLyIgXAotICAgICAgICAgICAgJChQUklWQVRFX0pBUl9NQU5JRkVTVCkgPiAkKGRpciAkQCkvbWFuaWZlc3QubWYgJiYgXAotICAgICAgICAkKEpBUikgLWNmbSAkQCAkKGRpciAkQCkvbWFuaWZlc3QubWYgXAotICAgICAgICAgICAgLUMgJChQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSKSAuLCBcCi0gICAgJChoaWRlKSAkKEpBUikgLWNmICRAIC1DICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikgLikKKyQoaGlkZSkgJChKQVIpIC1jZiAkQCAkKGNhbGwgamFyLWFyZ3Mtc29ydGVkLWZpbGVzLWluLWRpcmVjdG9yeSwkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpKQogJChpZiAkKFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MpLCQoY2FsbCBhZGQtamF2YS1yZXNvdXJjZXMtdG8sJEApKQogZW5kZWYKIAotZGVmaW5lIHRyYW5zZm9ybS1qYXZhLXRvLWNsYXNzZXMuamFyCi1AZWNobyAiJCgkKFBSSVZBVEVfUFJFRklYKURJU1BMQVkpIEphdmE6ICQoUFJJVkFURV9NT0RVTEUpICgkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpKSIKLSQoY2FsbCBjb21waWxlLWphdmEsJChUQVJHRVRfSkFWQUMpLCQoUFJJVkFURV9CT09UQ0xBU1NQQVRIKSkKKyMgJCgxKTogSmF2YWMgb3V0cHV0IGphciBuYW1lLgorIyAkKDIpOiBKYXZhIHNvdXJjZSBsaXN0IGZpbGUuCisjICQoMyk6IEphdmEgaGVhZGVyIGxpYnMuCisjICQoNCk6IEphdmFjIHNoYXJkaW5nIG51bWJlci4KKyMgJCg1KTogSmF2YWMgc291cmNlcyBkZXBzICh0aGUgYXJnIG1heSBuZWVlZCAkJCBpbiBjYXNlIG9mIGNvbnRhaW5pbmcgJyMnKQorZGVmaW5lIGNyZWF0ZS1jbGFzc2VzLWZ1bGwtZGVidWcuamFyCiskKDEpOiBQUklWQVRFX0pBVkFDRkxBR1MgOj0gJCQoTE9DQUxfSkFWQUNGTEFHUykgJCQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MpCiskKDEpOiBQUklWQVRFX0pBUl9FWENMVURFX0ZJTEVTIDo9ICQkKExPQ0FMX0pBUl9FWENMVURFX0ZJTEVTKQorJCgxKTogUFJJVkFURV9KQVJfUEFDS0FHRVMgOj0gJCQoTE9DQUxfSkFSX1BBQ0tBR0VTKQorJCgxKTogUFJJVkFURV9KQVJfRVhDTFVERV9QQUNLQUdFUyA6PSAkJChMT0NBTF9KQVJfRVhDTFVERV9QQUNLQUdFUykKKyQoMSk6IFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GIDo9ICQkKExPQ0FMX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORikKKyQoMSk6IFBSSVZBVEVfSkFWQV9TT1VSQ0VfTElTVCA6PSAkKDIpCiskKDEpOiBQUklWQVRFX0FMTF9KQVZBX0hFQURFUl9MSUJSQVJJRVMgOj0gJCgzKQorJCgxKTogUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzJCg0KQorJCgxKTogUFJJVkFURV9BTk5PX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2Fubm8kKDQpCiskKDEpOiBcCisgICAgJCgyKSBcCisgICAgJCgzKSBcCisgICAgJCg1KSBcCisgICAgJCQoZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicykgXAorICAgICQkKGZ1bGxfamF2YV9zeXN0ZW1fbW9kdWxlc19kZXBzKSBcCisgICAgJCQobGF5ZXJzX2ZpbGUpIFwKKyAgICAkJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9kZXBzKSBcCisgICAgJCQoTk9STUFMSVpFX1BBVEgpIFwKKyAgICAkJChKQVJfQVJHUykgXAorICAgIHwgJCQoU09PTkdfSkFWQUNfV1JBUFBFUikKKwlAZWNobyAiVGFyZ2V0IEphdmE6ICQkQCAoJCQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikpIgorCSQkKGNhbGwgY29tcGlsZS1qYXZhLCQkKFRBUkdFVF9KQVZBQyksJCQoUFJJVkFURV9BTExfSkFWQV9IRUFERVJfTElCUkFSSUVTKSkKIGVuZGVmCiAKLSMgSW52b2tlIEphY2sgdG8gY29tcGlsZSBqYXZhIGZyb20gc291cmNlIHRvIGRleCBhbmQgamFjayBmaWxlcy4KLSMKLSMgU29tZSBoaXN0b3JpY2FsIG5vdGVzOgotIyAtIGJlbG93IHdlIHdyaXRlIHRoZSBsaXN0IG9mIGphdmEgZmlsZXMgdG8gamF2YS1zb3VyY2UtbGlzdCB0byBhdm9pZCBhcmd1bWVudAotIyAgIGxpc3QgbGVuZ3RoIHByb2JsZW1zIHdpdGggQ3lnd2luCi0jIC0gd2UgZmlsdGVyIG91dCBkdXBsaWNhdGUgamF2YSBmaWxlIG5hbWVzIGJlY2F1c2UgSmFjayBkb2Vzbid0IGxpa2UgdGhlbS4KLWRlZmluZSBqYWNrLWphdmEtdG8tZGV4Ci0kKGhpZGUpIHJtIC1mICRACi0kKGhpZGUpIHJtIC1mICQoUFJJVkFURV9DTEFTU0VTX0pBQ0spCi0kKGhpZGUpIHJtIC1yZiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikKLSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0kKGhpZGUpIG1rZGlyIC1wICQoZGlyICQoUFJJVkFURV9DTEFTU0VTX0pBQ0spKQotJChoaWRlKSBta2RpciAtcCAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikKLSQoaWYgJChQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSKSwkKGhpZGUpIG1rZGlyIC1wICQoUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUikpCi0kKGNhbGwgZHVtcC13b3Jkcy10by1maWxlLCQoUFJJVkFURV9KQVZBX1NPVVJDRVMpLCQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0KQotJChpZiAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSwgXAotICAgICQoaGlkZSkgaWYgWyAtZCAiJChQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikiIF07IHRoZW4gXAotICAgICAgICAgICAgZmluZCAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyA+PiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdDsgXAotICAgIGZpKQotJChpZiAkKFBSSVZBVEVfSEFTX1BST1RPX1NPVVJDRVMpLCBcCi0gICAgJChoaWRlKSBmaW5kICQoUFJJVkFURV9QUk9UT19TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIpIC1uYW1lICcqLmphdmEnID4+ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0ICkKLSQoaWYgJChQUklWQVRFX0hBU19SU19TT1VSQ0VTKSwgXAotICAgICQoaGlkZSkgZmluZCAkKFBSSVZBVEVfUlNfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyA+PiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdCApCi0kKGhpZGUpIHRyICcgJyAnXG4nIDwgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QgXAotICAgIHwgJChOT1JNQUxJWkVfUEFUSCkgfCBzb3J0IC11ID4gJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcQotJChpZiAkKFBSSVZBVEVfSkFDS19QUk9HVUFSRF9GTEFHUyksIFwKLSAgICAkKGhpZGUpIGVjaG8gLWJhc2VkaXJlY3RvcnkgJChDVVJESVIpID4gJEAuZmxhZ3M7IFwKLSAgICBlY2hvICQoUFJJVkFURV9KQUNLX1BST0dVQVJEX0ZMQUdTKSA+PiAkQC5mbGFnczsgXAotKQotJChpZiAkKFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MpLAotICAgICQoaGlkZSkgbWtkaXIgLXAgJEAucmVzLnRtcAotICAgICQoaGlkZSkgJChjYWxsIGNyZWF0ZS1lbXB0eS1wYWNrYWdlLWF0LCRALnJlcy50bXAuemlwKQotICAgICQoaGlkZSkgJChjYWxsIGFkZC1qYXZhLXJlc291cmNlcy10bywkQC5yZXMudG1wLnppcCkKLSAgICAkKGhpZGUpIHVuemlwIC1xbyAkQC5yZXMudG1wLnppcCAtZCAkQC5yZXMudG1wCi0gICAgJChoaWRlKSBybSAkQC5yZXMudG1wLnppcCkKLSQoaWYgJChQUklWQVRFX0pBQ0tfSU1QT1JUX0pBUiksCi0gICAgJChoaWRlKSBta2RpciAtcCAkQC50bXBqaWxsLnJlcwotICAgICQoaGlkZSkgdW56aXAgLXFvICQoUFJJVkFURV9KQUNLX0lNUE9SVF9KQVIpIC1kICRALnRtcGppbGwucmVzCi0gICAgJChoaWRlKSBmaW5kICRALnRtcGppbGwucmVzIC1pbmFtZSAiKi5jbGFzcyIgLWRlbGV0ZSkKLSQoaGlkZSkgaWYgWyAtcyAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdC11bmlxIF0gOyB0aGVuIFwKLSAgICBleHBvcnQgdG1wRWNqQXJnPSJAJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcSI7IFwKLWVsc2UgXAotICAgIGV4cG9ydCB0bXBFY2pBcmc9IiI7IFwKLWZpOyBcCi0kKGNhbGwgY2FsbC1qYWNrKSBcCi0gICAgJChzdHJpcCAkKFBSSVZBVEVfSkFDS19GTEFHUykpIFwKLSAgICAkKHN0cmlwICQoUFJJVkFURV9KQUNLX0NPVkVSQUdFX09QVElPTlMpKSBcCi0gICAgJChpZiAkKE5PX09QVElNSVpFX0RYKSwgXAotICAgICAgICAtRCBqYWNrLmRleC5vcHRpbWl6ZT0iZmFsc2UiKSBcCi0gICAgJChpZiAkKFBSSVZBVEVfUk1UWVBFREVGUyksIFwKLSAgICAgICAgLUQgamFjay5hbmRyb2lkLnJlbW92ZS10eXBlZGVmPSJ0cnVlIikgXAotICAgICQoaWYgJChQUklWQVRFX0pBQ0tfSU1QT1JUX0pBUiksIFwKLSAgICAgICAgLS1pbXBvcnQgJChQUklWQVRFX0pBQ0tfSU1QT1JUX0pBUikgLS1pbXBvcnQtcmVzb3VyY2UgJEAudG1wamlsbC5yZXMpIFwKK2RlZmluZSB0cmFuc2Zvcm0tamF2YS10by1oZWFkZXIuamFyCitAZWNobyAiJCgkKFBSSVZBVEVfUFJFRklYKURJU1BMQVkpIFR1cmJpbmU6ICQoUFJJVkFURV9NT0RVTEUpIgorQG1rZGlyIC1wICQoZGlyICRAKQorQHJtIC1yZiAkKGRpciAkQCkvY2xhc3Nlcy10dXJiaW5lCitAbWtkaXIgJChkaXIgJEApL2NsYXNzZXMtdHVyYmluZQorJChoaWRlKSBpZiBbIC1zICQoUFJJVkFURV9KQVZBX1NPVVJDRV9MSVNUKSBdIDsgdGhlbiBcCisgICAgJChKQVZBKSAtamFyICQoVFVSQklORSkgXAorICAgIC0tb3V0cHV0ICRALnByZW1lcmdlZCAtLXRlbXBfZGlyICQoZGlyICRAKS9jbGFzc2VzLXR1cmJpbmUgXAorICAgIC0tc291cmNlcyBcQCQoUFJJVkFURV9KQVZBX1NPVVJDRV9MSVNUKSBcCisgICAgLS1qYXZhY29wdHMgJChQUklWQVRFX0pBVkFDRkxBR1MpICQoQ09NTU9OX0pES19GTEFHUykgXAorICAgICQoYWRkcHJlZml4IC0tYm9vdGNsYXNzcGF0aCAsJChzdHJpcCBcCisgICAgICAgICAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfQk9PVENMQVNTUEFUSCkpIFwKKyAgICAgICAgICQoUFJJVkFURV9FTVBUWV9CT09UQ0xBU1NQQVRIKSkpIFwKICAgICAkKGFkZHByZWZpeCAtLWNsYXNzcGF0aCAsJChzdHJpcCBcCi0gICAgICAgICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoUFJJVkFURV9KQUNLX1NIQVJFRF9MSUJSQVJJRVMpKSkpIFwKLSAgICAkKGFkZHByZWZpeCAtLWltcG9ydCAsJChjYWxsIHJldmVyc2UtbGlzdCwkKFBSSVZBVEVfU1RBVElDX0pBQ0tfTElCUkFSSUVTKSkpIFwKLSAgICAkKGFkZHByZWZpeCAtLXBsdWdpbnBhdGggLCQoc3RyaXAgXAotICAgICAgICAgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX0pBQ0tfUExVR0lOX1BBVEgpKSkpIFwKLSAgICAkKGlmICQoUFJJVkFURV9KQUNLX1BMVUdJTiksLS1wbHVnaW4gJChjYWxsIG5vcm1hbGl6ZS1jb21tYS1saXN0LCQoUFJJVkFURV9KQUNLX1BMVUdJTikpKSBcCi0gICAgJChpZiAkKFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MpLC0taW1wb3J0LXJlc291cmNlICRALnJlcy50bXApIFwKLSAgICAtRCBqYWNrLmFuZHJvaWQubWluLWFwaS1sZXZlbD0kKFBSSVZBVEVfSkFDS19NSU5fU0RLX1ZFUlNJT04pIFwKLSAgICAtRCBqYWNrLmltcG9ydC5yZXNvdXJjZS5wb2xpY3k9a2VlcC1maXJzdCBcCi0gICAgLUQgamFjay5pbXBvcnQudHlwZS5wb2xpY3k9a2VlcC1maXJzdCBcCi0gICAgLS1vdXRwdXQtamFjayAkKFBSSVZBVEVfQ0xBU1NFU19KQUNLKSBcCi0gICAgJChpZiAkKFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIpLC0taW5jcmVtZW50YWwtZm9sZGVyICQoUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUikpIFwKLSAgICAtLW91dHB1dC1kZXggJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpIFwKLSAgICAkKGFkZHByZWZpeCAtLWNvbmZpZy1qYXJqYXIgLCQoc3RyaXAgJChQUklWQVRFX0pBUkpBUl9SVUxFUykpKSBcCi0gICAgJChpZiAkKFBSSVZBVEVfSkFDS19QUk9HVUFSRF9GTEFHUyksLS1jb25maWctcHJvZ3VhcmQgJEAuZmxhZ3MpIFwKLSAgICAkJHRtcEVjakFyZyBcCi0gICAgfHwgKCBybSAtcmYgJChQUklWQVRFX0NMQVNTRVNfSkFDSyk7IGV4aXQgNDEgKQotJChoaWRlKSBtdiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvY2xhc3NlcyouZGV4ICQoZGlyICRAKQotJChoaWRlKSBybSAtZiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdAotJChpZiAkKFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MpLCQoaGlkZSkgcm0gLXJmICRALnJlcy50bXApCi0kKGhpZGUpIG12ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0LXVuaXEgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpLmphdmEtc291cmNlLWxpc3QKLSQoaWYgJChQUklWQVRFX0pBUl9QQUNLQUdFUyksICQoaGlkZSkgZWNobyB1bnN1cHBvcnRlZCBvcHRpb25zIFBSSVZBVEVfSkFSX1BBQ0tBR0VTIGluICRAOyBleGl0IDUzKQotJChpZiAkKFBSSVZBVEVfSkFSX0VYQ0xVREVfUEFDS0FHRVMpLCAkKGhpZGUpIGVjaG8gdW5zdXBwb3J0ZWQgb3B0aW9ucyBKQVJfRVhDTFVERV9QQUNLQUdFUyBpbiAkQDsgZXhpdCA1MykKLSQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksICQoaGlkZSkgZWNobyB1bnN1cHBvcnRlZCBvcHRpb25zIEpBUl9NQU5JRkVTVCBpbiAkQDsgZXhpdCA1MykKLWVuZGVmCi0KLSMgSW52b2tlIEphY2sgdG8gY29tcGlsZSBqYXZhIHNvdXJjZSBqdXN0IHRvIGNoZWNrIGl0IGNvbXBpbGVzIGNvcnJlY3RseS4KLSMKLSMgU29tZSBoaXN0b3JpY2FsIG5vdGVzOgotIyAtIGJlbG93IHdlIHdyaXRlIHRoZSBsaXN0IG9mIGphdmEgZmlsZXMgdG8gamF2YS1zb3VyY2UtbGlzdCB0byBhdm9pZCBhcmd1bWVudAotIyAgIGxpc3QgbGVuZ3RoIHByb2JsZW1zIHdpdGggQ3lnd2luCi0jIC0gd2UgZmlsdGVyIG91dCBkdXBsaWNhdGUgamF2YSBmaWxlIG5hbWVzIGJlY2F1c2UgSmFjayBkb2Vzbid0IGxpa2UgdGhlbS4KLWRlZmluZSBqYWNrLWNoZWNrLWphdmEKLSQoaGlkZSkgcm0gLWYgJEAKLSQoaGlkZSkgcm0gLWYgJEAuamF2YS1zb3VyY2UtbGlzdAotJChoaWRlKSBybSAtZiAkQC5qYXZhLXNvdXJjZS1saXN0LXVuaXEKLSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0kKGlmICQoUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUiksJChoaWRlKSBta2RpciAtcCAkKFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIpKQotJChjYWxsIGR1bXAtd29yZHMtdG8tZmlsZSwkKFBSSVZBVEVfSkFWQV9TT1VSQ0VTKSwkQC5qYXZhLXNvdXJjZS1saXN0KQotJChoaWRlKSBpZiBbIC1kICIkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSIgXTsgdGhlbiBcCi0gICAgICAgICAgZmluZCAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyA+PiAkQC5qYXZhLXNvdXJjZS1saXN0OyBcCisgICAgICAgICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoUFJJVkFURV9BTExfSkFWQV9IRUFERVJfTElCUkFSSUVTKSkpKSBcCisgICAgfHwgKCBybSAtcmYgJChkaXIgJEApL2NsYXNzZXMtdHVyYmluZSA7IGV4aXQgNDEgKSAmJiBcCisgICAgJChNRVJHRV9aSVBTKSAtaiAtc3RyaXBEaXIgTUVUQS1JTkYgJEAudG1wICRALnByZW1lcmdlZCAkKGNhbGwgcmV2ZXJzZS1saXN0LCQoUFJJVkFURV9TVEFUSUNfSkFWQV9IRUFERVJfTElCUkFSSUVTKSkgOyBcCitlbHNlIFwKKyAgICAkKE1FUkdFX1pJUFMpIC1qIC1zdHJpcERpciBNRVRBLUlORiAkQC50bXAgJChjYWxsIHJldmVyc2UtbGlzdCwkKFBSSVZBVEVfU1RBVElDX0pBVkFfSEVBREVSX0xJQlJBUklFUykpIDsgXAogZmkKLSQoaWYgJChQUklWQVRFX0hBU19QUk9UT19TT1VSQ0VTKSwgXAotICAgICQoaGlkZSkgZmluZCAkKFBSSVZBVEVfUFJPVE9fU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyA+PiAkQC5qYXZhLXNvdXJjZS1saXN0ICkKLSQoaWYgJChQUklWQVRFX0hBU19SU19TT1VSQ0VTKSwgXAotICAgICQoaGlkZSkgZmluZCAkKFBSSVZBVEVfUlNfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyA+PiAkQC5qYXZhLXNvdXJjZS1saXN0ICkKLSQoaGlkZSkgdHIgJyAnICdcbicgPCAkQC5qYXZhLXNvdXJjZS1saXN0IFwKLSAgICB8IHNvcnQgLXUgPiAkQC5qYXZhLXNvdXJjZS1saXN0LXVuaXEKLSQoaGlkZSkgaWYgWyAtcyAkQC5qYXZhLXNvdXJjZS1saXN0LXVuaXEgXSA7IHRoZW4gXAotCSQoY2FsbCBjYWxsLWphY2ssJChQUklWQVRFX0pBQ0tfRVhUUkFfQVJHUykpIFwKLQkgICAgJChzdHJpcCAkKFBSSVZBVEVfSkFDS19GTEFHUykpIFwKLQkgICAgJChzdHJpcCAkKFBSSVZBVEVfSkFDS19ERUJVR19GTEFHUykpIFwKLQkgICAgJChhZGRwcmVmaXggLS1jbGFzc3BhdGggLCQoc3RyaXAgXAotCSAgICAgICAgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChjYWxsIHJldmVyc2UtbGlzdCwkKFBSSVZBVEVfU1RBVElDX0pBQ0tfTElCUkFSSUVTKSkgJChQUklWQVRFX0pBQ0tfU0hBUkVEX0xJQlJBUklFUykpKSkgXAotCSAgICAtRCBqYWNrLmltcG9ydC5yZXNvdXJjZS5wb2xpY3k9a2VlcC1maXJzdCBcCi0JICAgIC1EIGphY2suYW5kcm9pZC5taW4tYXBpLWxldmVsPSQoUFJJVkFURV9KQUNLX01JTl9TREtfVkVSU0lPTikgXAotCSAgICAtRCBqYWNrLmltcG9ydC50eXBlLnBvbGljeT1rZWVwLWZpcnN0IFwKLQkgICAgJChpZiAkKFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIpLC0taW5jcmVtZW50YWwtZm9sZGVyICQoUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUikpIFwKLQkgICAgQCRALmphdmEtc291cmNlLWxpc3QtdW5pcTsgXAotZmkKLXRvdWNoICRACi1lbmRlZgotCi1kZWZpbmUgdHJhbnNmb3JtLWphci10by1qYWNrCi0JJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpIG1rZGlyIC1wICRALnRtcGppbGwucmVzCi0JJChoaWRlKSB1bnppcCAtcW8gJDwgLWQgJEAudG1wamlsbC5yZXMKLQkkKGhpZGUpIGZpbmQgJEAudG1wamlsbC5yZXMgLWluYW1lICIqLmNsYXNzIiAtZGVsZXRlCi0JJChoaWRlKSAkKGNhbGwgY2FsbC1qYWNrKSBcCi0JICAgICQoUFJJVkFURV9KQUNLX0ZMQUdTKSBcCi0JICAgICQoYWRkcHJlZml4IC0tcGx1Z2lucGF0aCAsJChzdHJpcCBcCi0gICAgICAgICAgICAgICAgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX0pBQ0tfUExVR0lOX1BBVEgpKSkpIFwKLQkgICAgJChpZiAkKFBSSVZBVEVfSkFDS19QTFVHSU4pLC0tcGx1Z2luICQoY2FsbCBub3JtYWxpemUtY29tbWEtbGlzdCwkKFBSSVZBVEVfSkFDS19QTFVHSU4pKSkgXAotICAgICAgICAtRCBqYWNrLmltcG9ydC5yZXNvdXJjZS5wb2xpY3k9a2VlcC1maXJzdCBcCi0gICAgICAgIC1EIGphY2suaW1wb3J0LnR5cGUucG9saWN5PWtlZXAtZmlyc3QgXAotICAgICAgICAtRCBqYWNrLmFuZHJvaWQubWluLWFwaS1sZXZlbD0kKFBSSVZBVEVfSkFDS19NSU5fU0RLX1ZFUlNJT04pIFwKLQkgICAgLS1pbXBvcnQgJDwgXAotCSAgICAtLWltcG9ydC1yZXNvdXJjZSAkQC50bXBqaWxsLnJlcyBcCi0JICAgIC0tb3V0cHV0LWphY2sgJEAKLQkkKGhpZGUpIHJtIC1yZiAkQC50bXBqaWxsLnJlcworJChoaWRlKSAkKFpJUFRJTUUpICRALnRtcAorJChoaWRlKSAkKGNhbGwgY29tbWl0LWNoYW5nZS1mb3ItdG9jLCRAKQogZW5kZWYKIAogIyBNb3ZlcyAkMS50bXAgdG8gJDEgaWYgbmVjZXNzYXJ5LiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aApAQCAtMjQwOSwyNiArMjM0Niw2IEBACiBmaQogZW5kZWYKIAotIyBiLzM3NzU2NDk1Ci1JSkFSX0FTQU5fT1BUSU9OUyA6PSBBU0FOX09QVElPTlM9ZGV0ZWN0X2xlYWtzPTAKLQotIyMgUnVsZSB0byBjcmVhdGUgYSB0YWJsZSBvZiBjb250ZW50cyBmcm9tIGEgLmphciBmaWxlLgotIyMgTXVzdCBiZSBjYWxsZWQgd2l0aCAkKGV2YWwpLgotIyAkKDEpOiBBIC5qYXIgZmlsZQotZGVmaW5lIF90cmFuc2Zvcm0tamFyLXRvLXRvYwotJDEudG9jOiAkMSB8ICQoSUpBUikKLQlAZWNobyBHZW5lcmF0aW5nIFRPQzogJCRACi0JJChoaWRlKSAkKElKQVJfQVNBTl9PUFRJT05TKSAkKElKQVIpICQkPCAkJEAudG1wCi0JJCQoY2FsbCBjb21taXQtY2hhbmdlLWZvci10b2MsJCRAKQotZW5kZWYKLQotIyMgRGVmaW5lIGEgcnVsZSB3aGljaCBnZW5lcmF0ZXMgLmphci50b2MgYW5kIG1hcmsgaXQgYXMgLktBVElfUkVTVEFULgotIyAkKDEpOiBBIC5qYXIgZmlsZQotZGVmaW5lIGRlZmluZS1qYXItdG8tdG9jLXJ1bGUKLSQoZXZhbCAkKGNhbGwgX3RyYW5zZm9ybS1qYXItdG8tdG9jLCQxKSlcCi0kKGV2YWwgLktBVElfUkVTVEFUOiAkMS50b2MpCi1lbmRlZgotCiBpZmVxICgsJChUQVJHRVRfQlVJTERfQVBQUykpCiAKICMjIFJ1bGUgdG8gY3JlYXRlIGEgdGFibGUgb2YgY29udGVudHMgZnJvbSBhIC5kZXggZmlsZS4KQEAgLTI0NTgsNzUgKzIzNzUsNiBAQAogZW5kaWYgICMgVEFSR0VUX0JVSUxEX0FQUFMKIAogCi0jIEludm9rZSBKYWNrIHRvIGNvbXBpbGUgamF2YSBmcm9tIHNvdXJjZSB0byBqYWNrIGZpbGVzIHdpdGhvdXQgc2hyaW5rIG9yIG9iZnVzY2F0aW9uLgotIwotIyBTb21lIGhpc3RvcmljYWwgbm90ZXM6Ci0jIC0gYmVsb3cgd2Ugd3JpdGUgdGhlIGxpc3Qgb2YgamF2YSBmaWxlcyB0byBqYXZhLXNvdXJjZS1saXN0IHRvIGF2b2lkIGFyZ3VtZW50Ci0jICAgbGlzdCBsZW5ndGggcHJvYmxlbXMgd2l0aCBDeWd3aW4KLSMgLSB3ZSBmaWx0ZXIgb3V0IGR1cGxpY2F0ZSBqYXZhIGZpbGUgbmFtZXMgYmVjYXVzZSBKYWNrIGRvZXNuJ3QgbGlrZSB0aGVtLgotZGVmaW5lIGphdmEtdG8tamFjawotJChoaWRlKSBybSAtZiAkQAotJChoaWRlKSBybSAtcmYgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpCi0kKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotJChoaWRlKSBta2RpciAtcCAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikKLSQoaWYgJChQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSKSwkKGhpZGUpIG1rZGlyIC1wICQoUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUikpCi0kKGNhbGwgZHVtcC13b3Jkcy10by1maWxlLCQoUFJJVkFURV9KQVZBX1NPVVJDRVMpLCQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0KQotJChoaWRlKSBpZiBbIC1kICIkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSIgXTsgdGhlbiBcCi0gICAgICAgICAgZmluZCAkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyA+PiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdDsgXAotZmkKLSQoaWYgJChQUklWQVRFX0hBU19QUk9UT19TT1VSQ0VTKSwgXAotICAgICQoaGlkZSkgZmluZCAkKFBSSVZBVEVfUFJPVE9fU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAtbmFtZSAnKi5qYXZhJyA+PiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdCApCi0kKGlmICQoUFJJVkFURV9IQVNfUlNfU09VUkNFUyksIFwKLSAgICAkKGhpZGUpIGZpbmQgJChQUklWQVRFX1JTX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikgLW5hbWUgJyouamF2YScgPj4gJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QgKQotJChoaWRlKSB0ciAnICcgJ1xuJyA8ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0IFwKLSAgICB8ICQoTk9STUFMSVpFX1BBVEgpIHwgc29ydCAtdSA+ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0LXVuaXEKLSQoaWYgJChQUklWQVRFX0pBQ0tfUFJPR1VBUkRfRkxBR1MpLCBcCi0gICAgJChoaWRlKSBlY2hvIC1iYXNlZGlyZWN0b3J5ICQoQ1VSRElSKSA+ICRALmZsYWdzOyBcCi0gICAgZWNobyAkKFBSSVZBVEVfSkFDS19QUk9HVUFSRF9GTEFHUykgPj4gJEAuZmxhZ3M7IFwKLSkKLSQoaWYgJChQUklWQVRFX0VYVFJBX0pBUl9BUkdTKSwKLQkkKGhpZGUpIG1rZGlyIC1wICRALnJlcy50bXAKLQkkKGhpZGUpICQoY2FsbCBjcmVhdGUtZW1wdHktcGFja2FnZS1hdCwkQC5yZXMudG1wLnppcCkKLQkkKGhpZGUpICQoY2FsbCBhZGQtamF2YS1yZXNvdXJjZXMtdG8sJEAucmVzLnRtcC56aXApCi0JJChoaWRlKSB1bnppcCAtcW8gJEAucmVzLnRtcC56aXAgLWQgJEAucmVzLnRtcAotCSQoaGlkZSkgcm0gJEAucmVzLnRtcC56aXApCi0kKGhpZGUpIGlmIFsgLXMgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpL2phdmEtc291cmNlLWxpc3QtdW5pcSBdIDsgdGhlbiBcCi0gICAgZXhwb3J0IHRtcEVjakFyZz0iQCQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0LXVuaXEiOyBcCi1lbHNlIFwKLSAgICBleHBvcnQgdG1wRWNqQXJnPSIiOyBcCi1maTsgXAotJChjYWxsIGNhbGwtamFjaykgXAotICAgICQoc3RyaXAgJChQUklWQVRFX0pBQ0tfRkxBR1MpKSBcCi0gICAgJChpZiAkKE5PX09QVElNSVpFX0RYKSwgXAotICAgICAgICAtRCBqYWNrLmRleC5vcHRpbWl6ZT0iZmFsc2UiKSBcCi0gICAgJChhZGRwcmVmaXggLS1jbGFzc3BhdGggLCQoc3RyaXAgXAotICAgICAgICAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfSkFDS19TSEFSRURfTElCUkFSSUVTKSkpKSBcCi0gICAgJChhZGRwcmVmaXggLS1pbXBvcnQgLCQoY2FsbCByZXZlcnNlLWxpc3QsJChQUklWQVRFX1NUQVRJQ19KQUNLX0xJQlJBUklFUykpKSBcCi0gICAgJChhZGRwcmVmaXggLS1wbHVnaW5wYXRoICwkKHN0cmlwIFwKLSAgICAgICAgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX0pBQ0tfUExVR0lOX1BBVEgpKSkpIFwKLSAgICAkKGlmICQoUFJJVkFURV9KQUNLX1BMVUdJTiksLS1wbHVnaW4gJChjYWxsIG5vcm1hbGl6ZS1jb21tYS1saXN0LCQoUFJJVkFURV9KQUNLX1BMVUdJTikpKSBcCi0gICAgJChpZiAkKFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MpLC0taW1wb3J0LXJlc291cmNlICRALnJlcy50bXApIFwKLSAgICAtRCBqYWNrLmltcG9ydC5yZXNvdXJjZS5wb2xpY3k9a2VlcC1maXJzdCBcCi0gICAgLUQgamFjay5pbXBvcnQudHlwZS5wb2xpY3k9a2VlcC1maXJzdCBcCi0gICAgLUQgamFjay5hbmRyb2lkLm1pbi1hcGktbGV2ZWw9JChQUklWQVRFX0pBQ0tfTUlOX1NES19WRVJTSU9OKSBcCi0gICAgJChpZiAkKFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIpLC0taW5jcmVtZW50YWwtZm9sZGVyICQoUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUikpIFwKLSAgICAtLW91dHB1dC1qYWNrICRAIFwKLSAgICAkKGFkZHByZWZpeCAtLWNvbmZpZy1qYXJqYXIgLCQoc3RyaXAgJChQUklWQVRFX0pBUkpBUl9SVUxFUykpKSBcCi0gICAgJChpZiAkKFBSSVZBVEVfSkFDS19QUk9HVUFSRF9GTEFHUyksLS1jb25maWctcHJvZ3VhcmQgJEAuZmxhZ3MpIFwKLSAgICAkJHRtcEVjakFyZyBcCi0gICAgfHwgKCBybSAtZiAkQCA7IGV4aXQgNDEgKQotJChoaWRlKSBybSAtZiAkKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvamF2YS1zb3VyY2UtbGlzdAotJChpZiAkKFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MpLCQoaGlkZSkgcm0gLXJmICRALnJlcy50bXApCi0kKGhpZGUpIG12ICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKS9qYXZhLXNvdXJjZS1saXN0LXVuaXEgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpLmphdmEtc291cmNlLWxpc3QKLSQoaWYgJChQUklWQVRFX0pBUl9QQUNLQUdFUyksICQoaGlkZSkgZWNobyB1bnN1cHBvcnRlZCBvcHRpb25zIFBSSVZBVEVfSkFSX1BBQ0tBR0VTIGluICRAOyBleGl0IDUzKQotJChpZiAkKFBSSVZBVEVfSkFSX0VYQ0xVREVfUEFDS0FHRVMpLCAkKGhpZGUpIGVjaG8gdW5zdXBwb3J0ZWQgb3B0aW9ucyBKQVJfRVhDTFVERV9QQUNLQUdFUyBpbiAkQDsgZXhpdCA1MykKLSQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksICQoaGlkZSkgZWNobyB1bnN1cHBvcnRlZCBvcHRpb25zIEpBUl9NQU5JRkVTVCBpbiAkQDsgZXhpdCA1MykKLWVuZGVmCi0KLWRlZmluZSBkZXN1Z2FyLWNsYXNzcGF0aAotJChmaWx0ZXItb3V0IC1jbGFzc3BhdGggLWJvb3RjbGFzc3BhdGggIiIsJChzdWJzdCA6LCQoc3BhY2UpLCQoMSkpKQotZW5kZWYKLQogIyBUYWtlcyBhbiBzZGsgdmVyc2lvbiB0aGF0IG1pZ2h0IGJlIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgKGZvciBleGFtcGxlIFApLAogIyByZXR1cm5zIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiB0aGUgaGlnaGVzdCBleGlzdGluZyBzZGsgdmVyc2lvbiBpZiBpdCBpcywgb3IKICMgdGhlIGlucHV0IGlmIGl0IGlzIG5vdC4KQEAgLTI1NDIsMTIgKzIzOTAsMTIgQEAKIEBybSAtcmYgJChkaXIgJEApL2Rlc3VnYXJfZHVtcGVkX2NsYXNzZXMKIEBta2RpciAkKGRpciAkQCkvZGVzdWdhcl9kdW1wZWRfY2xhc3NlcwogJChoaWRlKSAkKEpBVkEpIFwKLSAgICAkKGlmICQoRVhQRVJJTUVOVEFMX1VTRV9PUEVOSkRLOSksLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubGFuZy5pbnZva2U9QUxMLVVOTkFNRUQsKSBcCisgICAgJChpZiAkKFVTRV9PUEVOSkRLOSksLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubGFuZy5pbnZva2U9QUxMLVVOTkFNRUQsKSBcCiAgICAgLURqZGsuaW50ZXJuYWwubGFtYmRhLmR1bXBQcm94eUNsYXNzZXM9JChhYnNwYXRoICQoZGlyICRAKSkvZGVzdWdhcl9kdW1wZWRfY2xhc3NlcyBcCiAgICAgLWphciAkKERFU1VHQVIpIFwKLSAgICAkKGFkZHByZWZpeCAtLWJvb3RjbGFzc3BhdGhfZW50cnkgLCQoY2FsbCBkZXN1Z2FyLWJvb3RjbGFzc3BhdGgsJChQUklWQVRFX0JPT1RDTEFTU1BBVEgpKSkgXAotICAgICQoYWRkcHJlZml4IC0tY2xhc3NwYXRoX2VudHJ5ICwkKFBSSVZBVEVfQUxMX0pBVkFfTElCUkFSSUVTKSkgXAotICAgIC0tbWluX3Nka192ZXJzaW9uICQoY2FsbCBjb2RlbmFtZS1vci1zZGstdG8tc2RrLCQoUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLKSkgXAorICAgICQoYWRkcHJlZml4IC0tYm9vdGNsYXNzcGF0aF9lbnRyeSAsJChQUklWQVRFX0JPT1RDTEFTU1BBVEgpKSBcCisgICAgJChhZGRwcmVmaXggLS1jbGFzc3BhdGhfZW50cnkgLCQoUFJJVkFURV9TSEFSRURfSkFWQV9IRUFERVJfTElCUkFSSUVTKSkgXAorICAgIC0tbWluX3Nka192ZXJzaW9uICQoY2FsbCBjb2RlbmFtZS1vci1zZGstdG8tc2RrLCQoUFJJVkFURV9NSU5fU0RLX1ZFUlNJT04pKSBcCiAgICAgLS1hbGxvd19lbXB0eV9ib290Y2xhc3NwYXRoIFwKICAgICAkKGlmICQoZmlsdGVyIC0tY29yZS1saWJyYXJ5LCQoUFJJVkFURV9EWF9GTEFHUykpLC0tY29yZV9saWJyYXJ5KSBcCiAgICAgLWkgJDwgLW8gJEAudG1wCkBAIC0yNTYxLDcgKzI0MDksNyBAQAogJChoaWRlKSBybSAtZiAkKGRpciAkQCljbGFzc2VzKi5kZXgKICQoaGlkZSkgJChEWF9DT01NQU5EKSBcCiAgICAgLS1kZXggLS1vdXRwdXQ9JChkaXIgJEApIFwKLSAgICAtLW1pbi1zZGstdmVyc2lvbj0kKGNhbGwgY29kZW5hbWUtb3Itc2RrLXRvLXNkaywkKFBSSVZBVEVfREVGQVVMVF9BUFBfVEFSR0VUX1NESykpIFwKKyAgICAtLW1pbi1zZGstdmVyc2lvbj0kKFBSSVZBVEVfTUlOX1NES19WRVJTSU9OKSBcCiAgICAgJChpZiAkKE5PX09QVElNSVpFX0RYKSwgXAogICAgICAgICAtLW5vLW9wdGltaXplKSBcCiAgICAgJChpZiAkKEdFTkVSQVRFX0RFWF9ERUJVRyksIFwKQEAgLTI1NzIsNiArMjQyMCwyMSBAQAogICAgICQ8CiBlbmRlZgogCisKK2RlZmluZSB0cmFuc2Zvcm0tY2xhc3Nlcy1kOC5qYXItdG8tZGV4CitAZWNobyAidGFyZ2V0IERleDogJChQUklWQVRFX01PRFVMRSkiCitAbWtkaXIgLXAgJChkaXIgJEApCiskKGhpZGUpIHJtIC1mICQoZGlyICRAKWNsYXNzZXMqLmRleCAkKGRpciAkQClkOF9pbnB1dC5qYXIKKyQoaGlkZSkgJChaSVAyWklQKSAtaiAtaSAkPCAtbyAkKGRpciAkQClkOF9pbnB1dC5qYXIgIioqLyouY2xhc3MiCiskKGhpZGUpICQoRFhfQ09NTUFORCkgXAorICAgIC0tb3V0cHV0ICQoZGlyICRAKSBcCisgICAgLS1taW4tYXBpICQoUFJJVkFURV9NSU5fU0RLX1ZFUlNJT04pIFwKKyAgICAkKHN1YnN0IC0tbWFpbi1kZXgtbGlzdD0sIC0tbWFpbi1kZXgtbGlzdCAsIFwKKyAgICAgICAgJChmaWx0ZXItb3V0IC0tY29yZS1saWJyYXJ5IC0tbXVsdGktZGV4IC0tbWluaW1hbC1tYWluLWRleCwkKFBSSVZBVEVfRFhfRkxBR1MpKSkgXAorICAgICQoZGlyICRAKWQ4X2lucHV0LmphcgorJChoaWRlKSBybSAtZiAkKGRpciAkQClkOF9pbnB1dC5qYXIKK2VuZGVmCisKICMgQ3JlYXRlIGEgbW9zdGx5LWVtcHR5IC5qYXIgZmlsZSB0aGF0IHdlJ2xsIGFkZCB0byBsYXRlci4KICMgVGhlIE1hY09TIGphciB0b29sIGRvZXNuJ3QgbGlrZSBjcmVhdGluZyBlbXB0eSBqYXIgZmlsZXMsCiAjIHNvIHdlIG5lZWQgdG8gZ2l2ZSBpdCBzb21ldGhpbmcuCkBAIC0yNjI4LDYgKzI0OTEsOCBAQAogICAgICQoYWRkcHJlZml4IC0tcmVuYW1lLWluc3RydW1lbnRhdGlvbi10YXJnZXQtcGFja2FnZSAsICQoUFJJVkFURV9NQU5JRkVTVF9JTlNUUlVNRU5UQVRJT05fRk9SKSkgXAogICAgIC0tc2tpcC1zeW1ib2xzLXdpdGhvdXQtZGVmYXVsdC1sb2NhbGl6YXRpb24gXAogICAgIC1GICRACisjIFNvIHRoYXQgd2UgcmUtcnVuIGFhcHQgd2hlbiB0aGUgbGlzdCBvZiBpbnB1dCBmaWxlcyBjaGFuZ2UKKyQoaGlkZSkgZWNobyAkKFBSSVZBVEVfUkVTT1VSQ0VfTElTVCkgPi9kZXYvbnVsbAogZW5kZWYKIAogIyBXZSBuZWVkIHRoZSBleHRyYSBibGFuayBsaW5lLCBzbyB0aGF0IHRoZSBjb21tYW5kIHdpbGwgYmUgb24gYSBzZXBhcmF0ZSBsaW5lLgpAQCAtMjY3NywxNyArMjU0MiwxNSBAQAogQHJtIC1mICQoMSkuamFyLWFyZy1saXN0CiBlbmRlZgogCi0jIEFkZCByZXNvdXJjZXMgY2FycmllZCBieSBzdGF0aWMgSmFjayBsaWJyYXJpZXMuCi0jCi1kZWZpbmUgYWRkLWNhcnJpZWQtamFjay1yZXNvdXJjZXMKLSAkKGhpZGUpIGlmIFsgLWQgJChQUklWQVRFX0pBQ0tfSU5URVJNRURJQVRFU19ESVIpIF0gOyB0aGVuIFwKLSAgICBmaW5kICQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKSAtdHlwZSBmIHwgc29ydCBcCi0gICAgICAgIHwgc2VkIC1lICJzP14kKFBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUikvPyAtQyBcIiQoUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSKVwiIFwiPyIgLWUgInMvJCQvXCIvIiBcCi0gICAgICAgID4gJChkaXIgJEApamFja19yZXNfamFyX2ZsYWdzOyBcCi0gICAgaWYgWyAtcyAkKGRpciAkQClqYWNrX3Jlc19qYXJfZmxhZ3MgXSA7IHRoZW4gXAotICAgICAgICAkKEpBUikgdWYgJEAgQCQoZGlyICRAKWphY2tfcmVzX2phcl9mbGFnczsgXAotICAgIGZpOyBcCi1maQorIyBBZGQgcmVzb3VyY2VzIChub24gLmNsYXNzIGZpbGVzKSBmcm9tIGEgamFyIHRvIGEgcGFja2FnZQorIyAkKDEpOiB0aGUgcGFja2FnZSBmaWxlCisjICQoMik6IHRoZSBqYXIgZmlsZQorIyAkKDMpOiB0ZW1wb3JhcnkgZGlyZWN0b3J5CitkZWZpbmUgYWRkLWphci1yZXNvdXJjZXMtdG8tcGFja2FnZQorICBybSAtcmYgJCgzKQorICBta2RpciAtcCAkKDMpCisgIHVuemlwIC1xbyAkKDIpIC1kICQoMykgJCQoemlwaW5mbyAtMSAkKDIpIHwgZ3JlcCAtdiAtRSAiXC5jbGFzcyQkIikKKyAgJChKQVIpIHVmICQoMSkgJChjYWxsIGphci1hcmdzLXNvcnRlZC1maWxlcy1pbi1kaXJlY3RvcnksJCgzKSkKIGVuZGVmCiAKICMgU2lnbiBhIHBhY2thZ2UgdXNpbmcgdGhlIHNwZWNpZmllZCBrZXkvY2VydC4KQEAgLTI2OTYsMTQgKzI1NTksMTAgQEAKICQoY2FsbCBzaWduLXBhY2thZ2UtYXJnLCRAKQogZW5kZWYKIAotIyBzaWduYXBrIHVzZXMgaW50ZXJuYWwgQVBJcyBmcm9tIHN1bi5zZWN1cml0eS57cGtjcyx4NTA5fTsgc2VlIGh0dHA6Ly9iLzM3MTM3ODY5CiAjICQoMSk6IHRoZSBwYWNrYWdlIGZpbGUgd2UgYXJlIHNpZ25pbmcuCiBkZWZpbmUgc2lnbi1wYWNrYWdlLWFyZwogJChoaWRlKSBtdiAkKDEpICQoMSkudW5zaWduZWQKLSQoaGlkZSkgJChKQVZBKSAtRGphdmEubGlicmFyeS5wYXRoPSQoU0lHTkFQS19KTklfTElCUkFSWV9QQVRIKSBcCi0gICAgJChpZiAkKEVYUEVSSU1FTlRBTF9VU0VfT1BFTkpESzkpLC0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL3N1bi5zZWN1cml0eS5wa2NzPUFMTC1VTk5BTUVELCkgXAotICAgICQoaWYgJChFWFBFUklNRU5UQUxfVVNFX09QRU5KREs5KSwtLWFkZC1leHBvcnRzIGphdmEuYmFzZS9zdW4uc2VjdXJpdHkueDUwOT1BTEwtVU5OQU1FRCwpIFwKLSAgICAtamFyICQoU0lHTkFQS19KQVIpIFwKKyQoaGlkZSkgJChKQVZBKSAtRGphdmEubGlicmFyeS5wYXRoPSQoU0lHTkFQS19KTklfTElCUkFSWV9QQVRIKSAtamFyICQoU0lHTkFQS19KQVIpIFwKICAgICAkKFBSSVZBVEVfQ0VSVElGSUNBVEUpICQoUFJJVkFURV9QUklWQVRFX0tFWSkgXAogICAgICQoUFJJVkFURV9BRERJVElPTkFMX0NFUlRJRklDQVRFUykgJCgxKS51bnNpZ25lZCAkKDEpLnNpZ25lZAogJChoaWRlKSBtdiAkKDEpLnNpZ25lZCAkKDEpCkBAIC0yNzM4LDE0ICsyNTk3LDI3IEBACiAkKGhpZGUpICQoWklQVElNRSkgJEAKIGVuZGVmCiAKKyMgVW5jb21wcmVzcyBkZXggZmlsZXMgZW1iZWRkZWQgaW4gYW4gYXBrLgorIworZGVmaW5lIHVuY29tcHJlc3MtZGV4cworJChoaWRlKSBpZiAoemlwaW5mbyAkQCAnKi5kZXgnIDI+L2Rldi9udWxsIHwgZ3JlcCAtdiAnIHN0b3IgJyA+L2Rldi9udWxsKSA7IHRoZW4gXAorICB0bXBkaXI9JEAudG1wZGlyOyBcCisgIHJtIC1yZiAkJHRtcGRpciAmJiBta2RpciAkJHRtcGRpcjsgXAorICB1bnppcCAtcSAkQCAnKi5kZXgnIC1kICQkdG1wZGlyICYmIFwKKyAgemlwIC1xZCAkQCAnKi5kZXgnICYmIFwKKyAgKCBjZCAkJHRtcGRpciAmJiBmaW5kIC4gLXR5cGUgZiB8IHNvcnQgfCB6aXAgLXFEIC1YIC0wIC4uLyQobm90ZGlyICRAKSAtQCApICYmIFwKKyAgcm0gLXJmICQkdG1wZGlyOyBcCisgIGZpCitlbmRlZgorCiAjIFVuY29tcHJlc3Mgc2hhcmVkIGxpYnJhcmllcyBlbWJlZGRlZCBpbiBhbiBhcGsuCiAjCiBkZWZpbmUgdW5jb21wcmVzcy1zaGFyZWQtbGlicwogJChoaWRlKSBpZiAoemlwaW5mbyAkQCAkKFBSSVZBVEVfRU1CRURERURfSk5JX0xJQlMpIDI+L2Rldi9udWxsIHwgZ3JlcCAtdiAnIHN0b3IgJyA+L2Rldi9udWxsKSA7IHRoZW4gXAogICBybSAtcmYgJChkaXIgJEApdW5jb21wcmVzc2VkbGlicyAmJiBta2RpciAkKGRpciAkQCl1bmNvbXByZXNzZWRsaWJzOyBcCi0gIHVuemlwICRAICQoUFJJVkFURV9FTUJFRERFRF9KTklfTElCUykgLWQgJChkaXIgJEApdW5jb21wcmVzc2VkbGlicyAmJiBcCi0gIHppcCAtZCAkQCAnbGliLyouc28nICYmIFwKLSAgKCBjZCAkKGRpciAkQCl1bmNvbXByZXNzZWRsaWJzICYmIGZpbmQgbGliIC10eXBlIGYgfCBzb3J0IHwgemlwIC1EIC1YIC0wIC4uLyQobm90ZGlyICRAKSAtQCApICYmIFwKKyAgdW56aXAgLXEgJEAgJChQUklWQVRFX0VNQkVEREVEX0pOSV9MSUJTKSAtZCAkKGRpciAkQCl1bmNvbXByZXNzZWRsaWJzICYmIFwKKyAgemlwIC1xZCAkQCAnbGliLyouc28nICYmIFwKKyAgKCBjZCAkKGRpciAkQCl1bmNvbXByZXNzZWRsaWJzICYmIGZpbmQgbGliIC10eXBlIGYgfCBzb3J0IHwgemlwIC1xRCAtWCAtMCAuLi8kKG5vdGRpciAkQCkgLUAgKSAmJiBcCiAgIHJtIC1yZiAkKGRpciAkQCl1bmNvbXByZXNzZWRsaWJzOyBcCiAgIGZpCiBlbmRlZgpAQCAtMjc1Nyw4ICsyNjI5LDE1IEBACiAjIE5vdGU6IHdlIGludGVudGlvbmFsbHkgZG9uJ3QgY2xlYW4gUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUgogIyBpbiB0cmFuc2Zvcm0tamF2YS10by1jbGFzc2VzIGZvciB0aGUgc2FrZSBvZiB2bS10ZXN0cy4KIGRlZmluZSB0cmFuc2Zvcm0taG9zdC1qYXZhLXRvLXBhY2thZ2UKLUBlY2hvICIkKCQoUFJJVkFURV9QUkVGSVgpRElTUExBWSkgSmF2YTogJChQUklWQVRFX01PRFVMRSkgKCQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikpIgotJChjYWxsIGNvbXBpbGUtamF2YSwkKEhPU1RfSkFWQUMpLCQoUFJJVkFURV9CT09UQ0xBU1NQQVRIKSkKK0BlY2hvICJIb3N0IEphdmE6ICQoUFJJVkFURV9NT0RVTEUpICgkKFBSSVZBVEVfQ0xBU1NfSU5URVJNRURJQVRFU19ESVIpKSIKKyQoY2FsbCBjb21waWxlLWphdmEsJChIT1NUX0pBVkFDKSwkKFBSSVZBVEVfQUxMX0pBVkFfTElCUkFSSUVTKSkKK2VuZGVmCisKKyMgTm90ZTogd2UgaW50ZW50aW9uYWxseSBkb24ndCBjbGVhbiBQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSCisjIGluIHRyYW5zZm9ybS1qYXZhLXRvLWNsYXNzZXMgZm9yIHRoZSBzYWtlIG9mIHZtLXRlc3RzLgorZGVmaW5lIHRyYW5zZm9ybS1ob3N0LWphdmEtdG8tZGFsdmlrLXBhY2thZ2UKK0BlY2hvICJEYWx2aWsgSmF2YTogJChQUklWQVRFX01PRFVMRSkgKCQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikpIgorJChjYWxsIGNvbXBpbGUtamF2YSwkKEhPU1RfSkFWQUMpLCQoUFJJVkFURV9BTExfSkFWQV9IRUFERVJfTElCUkFSSUVTKSkKIGVuZGVmCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0yNzgzLDYgKzI2NjIsMTQgQEAKIAkkJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQogZW5kZWYKIAorZGVmaW5lIGNvcHktYW5kLXVuY29tcHJlc3MtZGV4cworJCgyKTogJCgxKSAkKFpJUEFMSUdOKQorCUBlY2hvICJVbmNvbXByZXNzIGRleHMgaW46ICQkQCIKKwkkJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQorCSQkKHVuY29tcHJlc3MtZGV4cykKKwkkJChhbGlnbi1wYWNrYWdlKQorZW5kZWYKKwogIyBDb3BpZXMgbWFueSBmaWxlcy4KICMgJCgxKTogVGhlIGZpbGVzIHRvIGNvcHkuICBFYWNoIGVudHJ5IGlzIGEgJzonIHNlcGFyYXRlZCBzcmM6ZHN0IHBhaXIKICMgRXZhbHVhdGVzIHRvIHRoZSBsaXN0IG9mIHRoZSBkc3QgZmlsZXMgKGllIHN1aXRhYmxlIGZvciBhIGRlcGVuZGVuY3kgbGlzdCkKQEAgLTI3OTksOSArMjY4Niw5IEBACiAjICQoMSk6IHNvdXJjZSBmaWxlCiAjICQoMik6IGRlc3RpbmF0aW9uIGZpbGUsIG11c3QgZW5kIHdpdGggLnhtbC4KIGRlZmluZSBjb3B5LXhtbC1maWxlLWNoZWNrZWQKLSQoMik6ICQoMSkKKyQoMik6ICQoMSkgJChYTUxMSU5UKQogCUBlY2hvICJDb3B5IHhtbDogJCRAIgotCSQoaGlkZSkgeG1sbGludCAkJDwgPi9kZXYvbnVsbCAgIyBEb24ndCBwcmludCB0aGUgeG1sIGZpbGUgdG8gc3Rkb3V0LgorCSQoaGlkZSkgJChYTUxMSU5UKSAkJDwgPi9kZXYvbnVsbCAgIyBEb24ndCBwcmludCB0aGUgeG1sIGZpbGUgdG8gc3Rkb3V0LgogCSQkKGNvcHktZmlsZS10by10YXJnZXQpCiBlbmRlZgogCkBAIC0yODIyLDcgKzI3MDksNyBAQAogZGVmaW5lIGNvcHktZmlsZS10by10YXJnZXQKIEBta2RpciAtcCAkKGRpciAkQCkKICQoaGlkZSkgcm0gLWYgJEAKLSQoaGlkZSkgY3AgJDwgJEAKKyQoaGlkZSkgY3AgIiQ8IiAiJEAiCiBlbmRlZgogCiAjIFRoZSBzYW1lIGFzIGNvcHktZmlsZS10by10YXJnZXQsIGJ1dCB1c2UgdGhlIGxvY2FsCkBAIC0yODMwLDcgKzI3MTcsNyBAQAogZGVmaW5lIGNvcHktZmlsZS10by10YXJnZXQtd2l0aC1jcAogQG1rZGlyIC1wICQoZGlyICRAKQogJChoaWRlKSBybSAtZiAkQAotJChoaWRlKSBjcCAtcCAkPCAkQAorJChoaWRlKSBjcCAtcCAiJDwiICIkQCIKIGVuZGVmCiAKICMgVGhlIHNhbWUgYXMgY29weS1maWxlLXRvLXRhcmdldCwgYnV0IHN0cmlwIG91dCAiIyBjb21tZW50Ii1zdHlsZQpAQCAtMjg5OCwxNSArMjc4NSw5MCBAQAogCSQoaGlkZSkgbG4gLXNmICQoMikgJCRACiBlbmRlZgogCisjIENvcHkgYW4gYXBrIHRvIGEgdGFyZ2V0IGxvY2F0aW9uIHdoaWxlIHJlbW92aW5nIGNsYXNzZXMqLmRleAorIyAkKDEpOiBzb3VyY2UgZmlsZQorIyAkKDIpOiBkZXN0aW5hdGlvbiBmaWxlCisjICQoMyk6IExPQ0FMX0RFWF9QUkVPUFQsIGlmIG5vc3RyaXBwaW5nIHRoZW4gbGVhdmUgY2xhc3NlcyouZGV4CitkZWZpbmUgZGV4cHJlb3B0LWNvcHktamFyCiskKDIpOiAkKDEpCisJQGVjaG8gIkNvcHk6ICQkQCIKKwkkJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQorCSQoaWYgJChmaWx0ZXIgbm9zdHJpcHBpbmcsJCgzKSksLCQkKGNhbGwgZGV4cHJlb3B0LXJlbW92ZS1jbGFzc2VzLmRleCwkJEApKQorZW5kZWYKKworIyAkKDEpOiB0aGUgLmphciBvciAuYXBrIHRvIHJlbW92ZSBjbGFzc2VzLmRleC4gTm90ZSB0aGF0IGlmIGFsbCBkZXggZmlsZXMKKyMgYXJlIHVuY29tcHJlc3NlZCBpbiB0aGUgYXJjaGl2ZSwgdGhlbiBkZXhvcHQgd2lsbCBub3QgZG8gYSBjb3B5IG9mIHRoZSBkZXgKKyMgZmlsZXMgYW5kIHdlIHNob3VsZCBub3Qgc3RyaXAuCitkZWZpbmUgZGV4cHJlb3B0LXJlbW92ZS1jbGFzc2VzLmRleAorJChoaWRlKSBpZiAoemlwaW5mbyAkMSAnKi5kZXgnIDI+L2Rldi9udWxsIHwgZ3JlcCAtdiAnIHN0b3IgJyA+L2Rldi9udWxsKSA7IHRoZW4gXAoremlwIC0tcXVpZXQgLS1kZWxldGUgJCgxKSBjbGFzc2VzLmRleDsgXAorZGV4X2luZGV4PTI7IFwKK3doaWxlIHppcCAtLXF1aWV0IC0tZGVsZXRlICQoMSkgY2xhc3NlcyQke2RleF9pbmRleH0uZGV4ID4gL2Rldi9udWxsOyBkbyBcCisgIGxldCBkZXhfaW5kZXg9ZGV4X2luZGV4KzE7IFwKK2RvbmUgXAorZmkKK2VuZGVmCisKK2RlZmluZSBoaWRkZW5hcGktY29weS1kZXgtZmlsZXMKKyQoMik6ICQoMSkgJChISURERU5BUEkpICQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0xJR0hUX0dSRVlMSVNUKSBcCisgICAgICAkKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9EQVJLX0dSRVlMSVNUKSAkKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9CTEFDS0xJU1QpCisJQHJtIC1yZiAkKGRpciAkKDIpKQorCUBta2RpciAtcCAkKGRpciAkKDIpKQorCWZpbmQgJChkaXIgJCgxKSkgLW1heGRlcHRoIDEgLW5hbWUgImNsYXNzZXMqLmRleCIgfCBzb3J0IHwgXAorCQl4YXJncyAtSXt9IGNwIC1mIHt9ICQoZGlyICQoMikpCisJZmluZCAkKGRpciAkKDIpKSAtbmFtZSAiY2xhc3NlcyouZGV4IiB8IHNvcnQgfCBzZWQgJ3MvXi8tLWRleD0vJyB8IFwKKwkJeGFyZ3MgJChISURERU5BUEkpIC0tbGlnaHQtZ3JleWxpc3Q9JChJTlRFUk5BTF9QTEFURk9STV9ISURERU5BUElfTElHSFRfR1JFWUxJU1QpIFwKKwkJICAgICAgICAgICAgICAgICAgIC0tZGFyay1ncmV5bGlzdD0kKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9EQVJLX0dSRVlMSVNUKSBcCisJCSAgICAgICAgICAgICAgICAgICAtLWJsYWNrbGlzdD0kKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9CTEFDS0xJU1QpCitlbmRlZgorCitkZWZpbmUgaGlkZGVuYXBpLWNvcHktc29vbmctamFyCiskKDIpOiBQUklWQVRFX0ZPTERFUiA6PSAkKGRpciAkKDIpKWRleC1oaWRkZW5hcGkKKyQoMik6ICQoMSkgJChISURERU5BUEkpICQoU09PTkdfWklQKSAkKE1FUkdFX1pJUFMpICQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0xJR0hUX0dSRVlMSVNUKSBcCisgICAgICAkKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9EQVJLX0dSRVlMSVNUKSAkKElOVEVSTkFMX1BMQVRGT1JNX0hJRERFTkFQSV9CTEFDS0xJU1QpCisJQGVjaG8gIkhpZGRlbiBBUEk6ICQkQCIKKwkkJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQorCUBybSAtcmYgJCR7UFJJVkFURV9GT0xERVJ9CisJQG1rZGlyIC1wICQke1BSSVZBVEVfRk9MREVSfQorCXVuemlwIC1xICQoMikgJ2NsYXNzZXMqLmRleCcgLWQgJCR7UFJJVkFURV9GT0xERVJ9CisJZmluZCAkJHtQUklWQVRFX0ZPTERFUn0gLW5hbWUgImNsYXNzZXMqLmRleCIgfCBzb3J0IHwgc2VkICdzL14vLS1kZXg9LycgfCBcCisJCXhhcmdzICQoSElEREVOQVBJKSAtLWxpZ2h0LWdyZXlsaXN0PSQoSU5URVJOQUxfUExBVEZPUk1fSElEREVOQVBJX0xJR0hUX0dSRVlMSVNUKSBcCisJCSAgICAgICAgICAgICAgICAgICAtLWRhcmstZ3JleWxpc3Q9JChJTlRFUk5BTF9QTEFURk9STV9ISURERU5BUElfREFSS19HUkVZTElTVCkgXAorCQkgICAgICAgICAgICAgICAgICAgLS1ibGFja2xpc3Q9JChJTlRFUk5BTF9QTEFURk9STV9ISURERU5BUElfQkxBQ0tMSVNUKQorCSQoU09PTkdfWklQKSAtbyAkJHtQUklWQVRFX0ZPTERFUn0vY2xhc3Nlcy5kZXguamFyIC1DICQke1BSSVZBVEVfRk9MREVSfSAtRCAkJHtQUklWQVRFX0ZPTERFUn0KKwkkKE1FUkdFX1pJUFMpIC1EIC16aXBUb05vdFN0cmlwICQke1BSSVZBVEVfRk9MREVSfS9jbGFzc2VzLmRleC5qYXIgLXN0cmlwRmlsZSAiY2xhc3NlcyouZGV4IiBcCisJCSQoMikgJCR7UFJJVkFURV9GT0xERVJ9L2NsYXNzZXMuZGV4LmphciAkKDEpCitlbmRlZgorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgQ29tbWFuZHMgdG8gY2FsbCBQcm9ndWFyZAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZGVmIFRBUkdFVF9PUEVOSkRLOQorZGVmaW5lIHRyYW5zZm9ybS1qYXItdG8tcHJvZ3VhcmQKK0BlY2hvIFNraXBwaW5nIFByb2d1YXJkOiAkPCAkQAorJChoaWRlKSBjcCAnJDwnICRACitlbmRlZgorZWxzZQogZGVmaW5lIHRyYW5zZm9ybS1qYXItdG8tcHJvZ3VhcmQKIEBlY2hvIFByb2d1YXJkOiAkQAotJChoaWRlKSAkKFBST0dVQVJEKSAtaW5qYXJzICckPCQoUFJJVkFURV9QUk9HVUFSRF9JTkpBUl9GSUxURVJTKScgXAotICAgIC1vdXRqYXJzICRAICQoUFJJVkFURV9QUk9HVUFSRF9GTEFHUykgXAorJChoaWRlKSAkKFBST0dVQVJEKSAtaW5qYXJzICQ8IC1vdXRqYXJzICRAICQoUFJJVkFURV9QUk9HVUFSRF9GTEFHUykgXAogICAgICQoYWRkcHJlZml4IC1pbmphcnMgLCAkKFBSSVZBVEVfRVhUUkFfSU5QVVRfSkFSKSkKIGVuZGVmCitlbmRpZgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBDb21tYW5kcyB0byBjYWxsIFI4CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZGVmaW5lIHRyYW5zZm9ybS1qYXItdG8tZGV4LXI4CitAZWNobyBSODogJEAKKyQoaGlkZSkgJChSOF9DT01QQVRfUFJPR1VBUkQpIC1pbmphcnMgJyQ8JyBcCisgICAgLS1taW4tYXBpICQoUFJJVkFURV9NSU5fU0RLX1ZFUlNJT04pIFwKKyAgICAtLWZvcmNlLXByb2d1YXJkLWNvbXBhdGliaWxpdHkgLS1vdXRwdXQgJChzdWJzdCBjbGFzc2VzLmRleCwsJEApIFwKKyAgICAkKFBSSVZBVEVfUFJPR1VBUkRfRkxBR1MpIFwKKyAgICAkKGFkZHByZWZpeCAtaW5qYXJzICwgJChQUklWQVRFX0VYVFJBX0lOUFVUX0pBUikpIFwKKyAgICAkKFBSSVZBVEVfRFhfRkxBR1MpCitlbmRlZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgU3R1ZmYgc291cmNlIGdlbmVyYXRlZCBmcm9tIG9uZS1vZmYgdG9vbHMKQEAgLTI5MjgsMzkgKzI4OTAsMTYgQEAKICQoZXJyb3IgSE9TVF9PUyBtdXN0IGRlZmluZSBnZXQtZmlsZS1zaXplKQogZW5kaWYKIAotIyBDb252ZXJ0IGEgcGFydGl0aW9uIGRhdGEgc2l6ZSAoZWcsIGFzIHJlcG9ydGVkIGluIC9wcm9jL210ZCkgdG8gdGhlCi0jIHNpemUgb2YgdGhlIGltYWdlIHVzZWQgdG8gZmxhc2ggdGhhdCBwYXJ0aXRpb24gKHdoaWNoIGluY2x1ZGVzIGEKLSMgc3BhcmUgYXJlYSBmb3IgZWFjaCBwYWdlKS4KLSMgJCgxKTogdGhlIHBhcnRpdGlvbiBkYXRhIHNpemUKLWRlZmluZSBpbWFnZS1zaXplLWZyb20tZGF0YS1zaXplCi0kKHN0cmlwICQoZXZhbCBfaXNmZHNfdmFsdWUgOj0gJCQoc2hlbGwgZWNobyAkJCQkKCgkKDEpIC8gJChCT0FSRF9OQU5EX1BBR0VfU0laRSkgKiBcCi0gICgkKEJPQVJEX05BTkRfUEFHRV9TSVpFKSskKEJPQVJEX05BTkRfU1BBUkVfU0laRSkpKSkpKVwKLSQoaWYgJChmaWx0ZXIgMCwgJChfaXNmZHNfdmFsdWUpKSwkKHNoZWxsIGVjaG8gJCQoKCQoQk9BUkRfTkFORF9QQUdFX1NJWkUpKyQoQk9BUkRfTkFORF9TUEFSRV9TSVpFKSkpKSwkKF9pc2Zkc192YWx1ZSkpXAotJChldmFsIF9pc2Zkc192YWx1ZSA6PSkpCi1lbmRlZgotCiAjICQoMSk6IFRoZSBmaWxlKHMpIHRvIGNoZWNrIChvZnRlbiAkQCkKLSMgJCgyKTogVGhlIG1heGltdW0gdG90YWwgaW1hZ2Ugc2l6ZSwgaW4gZGVjaW1hbCBieXRlcy4KLSMgICAgTWFrZSBzdXJlIHRvIHRha2UgaW50byBhY2NvdW50IGFueSByZXNlcnZlZCBzcGFjZSBuZWVkZWQgZm9yIHRoZSBGUy4KLSMKLSMgSWYgJCgyKSBpcyBlbXB0eSwgZXZhbHVhdGVzIHRvICJ0cnVlIgotIwotIyBSZXNlcnZlIGJhZCBibG9ja3MuICBNYWtlIHN1cmUgdGhhdCBNQVgoMSUgb2YgcGFydGl0aW9uIHNpemUsIDIgYmxvY2tzKQotIyBpcyBsZWZ0IG92ZXIgYWZ0ZXIgdGhlIGltYWdlIGhhcyBiZWVuIGZsYXNoZWQuICBSb3VuZCB0aGUgMSUgdXAgdG8gdGhlCi0jIG5leHQgd2hvbGUgZmxhc2ggYmxvY2sgc2l6ZS4KLWRlZmluZSBhc3NlcnQtbWF4LWZpbGUtc2l6ZQorIyAkKDIpOiBUaGUgcGFydGl0aW9uIHNpemUuCitkZWZpbmUgYXNzZXJ0LW1heC1pbWFnZS1zaXplCiAkKGlmICQoMiksIFwKICAgc2l6ZT0kJChmb3IgaSBpbiAkKDEpOyBkbyAkKGNhbGwgZ2V0LWZpbGUtc2l6ZSwkJGkpOyBlY2hvICs7IGRvbmU7IGVjaG8gMCk7IFwKICAgdG90YWw9JCQoKCAkJCggZWNobyAiJCRzaXplIiApICkpOyBcCiAgIHByaW50bmFtZT0kJChlY2hvIC1uICIkKDEpIiB8IHRyICIgIiArKTsgXAotICBpbWdfYmxvY2tzaXplPSQoY2FsbCBpbWFnZS1zaXplLWZyb20tZGF0YS1zaXplLCQoQk9BUkRfRkxBU0hfQkxPQ0tfU0laRSkpOyBcCi0gIHR3b2Jsb2Nrcz0kJCgoaW1nX2Jsb2Nrc2l6ZSAqIDIpKTsgXAotICBvbmVwY3Q9JCQoKCgoKCQoMikgLyAxMDApIC0gMSkgLyBpbWdfYmxvY2tzaXplICsgMSkgKiBpbWdfYmxvY2tzaXplKSk7IFwKLSAgcmVzZXJ2ZT0kJCgodHdvYmxvY2tzID4gb25lcGN0ID8gdHdvYmxvY2tzIDogb25lcGN0KSk7IFwKLSAgbWF4c2l6ZT0kJCgoJCgyKSAtIHJlc2VydmUpKTsgXAotICBlY2hvICIkJHByaW50bmFtZSBtYXhzaXplPSQkbWF4c2l6ZSBibG9ja3NpemU9JCRpbWdfYmxvY2tzaXplIHRvdGFsPSQkdG90YWwgcmVzZXJ2ZT0kJHJlc2VydmUiOyBcCisgIG1heHNpemU9JCQoKCQoMikpKTsgXAogICBpZiBbICIkJHRvdGFsIiAtZ3QgIiQkbWF4c2l6ZSIgXTsgdGhlbiBcCi0gICAgZWNobyAiZXJyb3I6ICQkcHJpbnRuYW1lIHRvbyBsYXJnZSAoJCR0b3RhbCA+IFskKDIpIC0gJCRyZXNlcnZlXSkiOyBcCisgICAgZWNobyAiZXJyb3I6ICQkcHJpbnRuYW1lIHRvbyBsYXJnZSAoJCR0b3RhbCA+ICQkbWF4c2l6ZSkiOyBcCiAgICAgZmFsc2U7IFwKICAgZWxpZiBbICIkJHRvdGFsIiAtZ3QgJCQoKG1heHNpemUgLSAzMjc2OCkpIF07IHRoZW4gXAogICAgIGVjaG8gIldBUk5JTkc6ICQkcHJpbnRuYW1lIGFwcHJvYWNoaW5nIHNpemUgbGltaXQgKCQkdG90YWwgbm93OyBsaW1pdCAkJG1heHNpemUpIjsgXApAQCAtMjk3MCwxNyArMjkwOSw2IEBACiAgKQogZW5kZWYKIAotIyBMaWtlIGFzc2VydC1tYXgtZmlsZS1zaXplLCBidXQgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBhIHBhcnRpdGlvbgotIyBzaXplLCB3aGljaCB3ZSdsbCBjb252ZXJ0IHRvIGEgbWF4IGltYWdlIHNpemUgYmVmb3JlIGNoZWNraW5nIGl0Ci0jIGFnYWluc3QgdGhlIGZpbGVzLgotIwotIyAkKDEpOiBUaGUgZmlsZShzKSB0byBjaGVjayAob2Z0ZW4gJEApCi0jICQoMik6IFRoZSBwYXJ0aXRpb24gc2l6ZS4KLWRlZmluZSBhc3NlcnQtbWF4LWltYWdlLXNpemUKLSQoaWYgJCgyKSwgXAotICAkKGNhbGwgYXNzZXJ0LW1heC1maWxlLXNpemUsJCgxKSwkKGNhbGwgaW1hZ2Utc2l6ZS1mcm9tLWRhdGEtc2l6ZSwkKDIpKSkpCi1lbmRlZgotCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyBEZWZpbmUgZGV2aWNlLXNwZWNpZmljIHJhZGlvIGZpbGVzCkBAIC0zMTU3LDkgKzMwODUsMTEgQEAKICAgSE9TVF9EQUxWSUtfSkFWQV9MSUJSQVJZIFwKICAgSE9TVF9EQUxWSUtfU1RBVElDX0pBVkFfTElCUkFSWSBcCiAgIGJhc2VfcnVsZXMgXAotICBIRUFERVJfTElCUkFSWQorICBIRUFERVJfTElCUkFSWSBcCisgIEhPU1RfVEVTVF9DT05GSUcgXAorICBUQVJHRVRfVEVTVF9DT05GSUcKIAotJChmb3JlYWNoICQocyksJChTVEFUUy5NT0RVTEVfVFlQRSksJChldmFsIFNUQVRTLk1PRFVMRV9UWVBFLiQocykgOj0pKQorJChmb3JlYWNoIHMsJChTVEFUUy5NT0RVTEVfVFlQRSksJChldmFsIFNUQVRTLk1PRFVMRV9UWVBFLiQocykgOj0pKQogZGVmaW5lIHJlY29yZC1tb2R1bGUtdHlwZQogJChzdHJpcCAkKGlmICQoTE9DQUxfUkVDT1JERURfTU9EVUxFX1RZUEUpLCwKICAgJChpZiAkKGZpbHRlci1vdXQgJChTT09OR19BTkRST0lEX01LKSwkKExPQ0FMX01PRFVMRV9NQUtFRklMRSkpLApAQCAtMzMzMCw2ICszMjYwLDEyMiBAQAogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIEdpdmVuIGEgZmlsZXBhdGgsIHJldHVybnMgbm9uZW1wdHkgaWYgdGhlIHBhdGggY2Fubm90IGJlCisjIyB2YWxpZGF0ZWQgdG8gYmUgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorIyMgVGhpcyBpcywgdGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yICcvJyBhbmQgJy4uJworIyMKKyMjICQoMSk6IHBhdGggdG8gdmFsaWRhdGUKK2RlZmluZSB0cnktdmFsaWRhdGUtcGF0aC1pcy1zdWJkaXIKKyQoc3RyaXAgCisgICAgJChpZiAkKGZpbHRlciAvJSwkKDEpKSwKKyAgICAgICAgJCgxKSBzdGFydHMgd2l0aCBhIHNsYXNoCisgICAgKQorICAgICQoaWYgJChmaWx0ZXIgLi4vJSwkKGNhbGwgY2xlYW4tcGF0aCwkKDEpKSksCisgICAgICAgICQoMSkgZXNjYXBlcyBpdHMgcGFyZW50IHVzaW5nICcuLicKKyAgICApCisgICAgJChpZiAkKHN0cmlwICQoMSkpLAorICAgICwKKyAgICAgICAgJyQoMSknIGlzIGVtcHR5CisgICAgKQorKQorZW5kZWYKKworZGVmaW5lIHZhbGlkYXRlLXBhdGgtaXMtc3ViZGlyCiskKGlmICQoY2FsbCB0cnktdmFsaWRhdGUtcGF0aC1pcy1zdWJkaXIsJCgxKSksCisgICQoY2FsbCBwcmV0dHktZXJyb3IsIElsbGVnYWwgcGF0aDogJChjYWxsIHRyeS12YWxpZGF0ZS1wYXRoLWlzLXN1YmRpciwkKDEpKSkKKykKK2VuZGVmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBHaXZlbiBhIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIGZpbGVwYXRocywgcmV0dXJucworIyMgbm9uZW1wdHkgaWYgYW55IGNhbm5vdCBiZSB2YWxpZGF0ZWQgdG8gYmUgY29udGFpbmVkIGluCisjIyB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyMjCisjIyAkKDEpOiBwYXRoIGxpc3QgdG8gdmFsaWRhdGUKK2RlZmluZSB0cnktdmFsaWRhdGUtcGF0aHMtYXJlLXN1YmRpcnMKKyQoc3RyaXAgXAorICAkKGZvcmVhY2ggbXlfcGF0aCwkKDEpLFwKKyAgICAkKGNhbGwgdHJ5LXZhbGlkYXRlLXBhdGgtaXMtc3ViZGlyLCQobXlfcGF0aCkpXAorICApCispCitlbmRlZgorCitkZWZpbmUgdmFsaWRhdGUtcGF0aHMtYXJlLXN1YmRpcnMKKyQoaWYgJChjYWxsIHRyeS12YWxpZGF0ZS1wYXRocy1hcmUtc3ViZGlycywkKDEpKSwKKyAgICAkKGNhbGwgcHJldHR5LWVycm9yLElsbGVnYWwgcGF0aHM6XCckKGNhbGwgdHJ5LXZhbGlkYXRlLXBhdGhzLWFyZS1zdWJkaXJzLCQoMSkpXCcpCispCitlbmRlZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgVGVzdHMgb2YgdHJ5LXZhbGlkYXRlLXBhdGgtaXMtc3ViZGlyCisjIyAgICAgYW5kICB0cnktdmFsaWRhdGUtcGF0aHMtYXJlLXN1YmRpcnMKK2RlZmluZSB0ZXN0LXZhbGlkYXRlLXBhdGhzLWFyZS1zdWJkaXJzCiskKGV2YWwgbXlfZXJyb3IgOj0gJChjYWxsIHRyeS12YWxpZGF0ZS1wYXRoLWlzLXN1YmRpciwvdG1wKSkgXAorJChpZiAkKGNhbGwgc3RyZXEsJChteV9lcnJvciksL3RtcCBzdGFydHMgd2l0aCBhIHNsYXNoKSwKKywKKyAgJChlcnJvciBpbmNvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgcGF0aCAvdG1wLiBHb3QgJyQobXlfZXJyb3IpJykKKykgXAorJChldmFsIG15X2Vycm9yIDo9ICQoY2FsbCB0cnktdmFsaWRhdGUtcGF0aC1pcy1zdWJkaXIsLi4vc2libGluZykpIFwKKyQoaWYgJChjYWxsIHN0cmVxLCQobXlfZXJyb3IpLC4uL3NpYmxpbmcgZXNjYXBlcyBpdHMgcGFyZW50IHVzaW5nICcuLicpLAorLAorICAkKGVycm9yIGluY29ycmVjdCBlcnJvciBtZXNzYWdlIGZvciBwYXRoIC4uL3NpYmxpbmcuIEdvdCAnJChteV9lcnJvciknKQorKSBcCiskKGV2YWwgbXlfZXJyb3IgOj0gJChjYWxsIHRyeS12YWxpZGF0ZS1wYXRoLWlzLXN1YmRpcixjaGlsZC8uLi8uLi9zaWJsaW5nKSkgXAorJChpZiAkKGNhbGwgc3RyZXEsJChteV9lcnJvciksY2hpbGQvLi4vLi4vc2libGluZyBlc2NhcGVzIGl0cyBwYXJlbnQgdXNpbmcgJy4uJyksCissCisgICQoZXJyb3IgaW5jb3JyZWN0IGVycm9yIG1lc3NhZ2UgZm9yIHBhdGggY2hpbGQvLi4vLi4vc2libGluZy4gR290ICckKG15X2Vycm9yKScpCispIFwKKyQoZXZhbCBteV9lcnJvciA6PSAkKGNhbGwgdHJ5LXZhbGlkYXRlLXBhdGgtaXMtc3ViZGlyLCkpIFwKKyQoaWYgJChjYWxsIHN0cmVxLCQobXlfZXJyb3IpLCcnIGlzIGVtcHR5KSwKKywKKyAgJChlcnJvciBpbmNvcnJlY3QgZXJyb3IgbWVzc2FnZSBmb3IgZW1wdHkgcGF0aCAnJy4gR290ICckKG15X2Vycm9yKScpCispIFwKKyQoZXZhbCBteV9lcnJvciA6PSAkKGNhbGwgdHJ5LXZhbGlkYXRlLXBhdGgtaXMtc3ViZGlyLHN1YmRpci9zdWJzdWJkaXIpKSBcCiskKGlmICQoY2FsbCBzdHJlcSwkKG15X2Vycm9yKSwpLAorLAorICAkKGVycm9yIHJlamVjdGVkIHZhbGlkIHBhdGggJ3N1YmRpci9zdWJzdWJkaXInLiBHb3QgJyQobXlfZXJyb3IpJykKKykKKworJChldmFsIG15X2Vycm9yIDo9ICQoY2FsbCB0cnktdmFsaWRhdGUtcGF0aHMtYXJlLXN1YmRpcnMsYS9iIC9jL2QgZS9mKSkKKyQoaWYgJChjYWxsIHN0cmVxLCQobXlfZXJyb3IpLC9jL2Qgc3RhcnRzIHdpdGggYSBzbGFzaCksCissCisgICQoZXJyb3IgaW5jb3JyZWN0IGVycm9yIG1lc3NhZ2UgZm9yIHBhdGggbGlzdCAnYS9iIC9jL2QgZS9mJy4gR290ICckKG15X2Vycm9yKScpCispCiskKGV2YWwgbXlfZXJyb3IgOj0gJChjYWxsIHRyeS12YWxpZGF0ZS1wYXRocy1hcmUtc3ViZGlycyxhL2IgYy9kKSkKKyQoaWYgJChjYWxsIHN0cmVxLCQobXlfZXJyb3IpLCksCissCisgICQoZXJyb3IgcmVqZWN0ZWQgdmFsaWQgcGF0aCBsaXN0ICdhL2IgYy9kJy4gR290ICckKG15X2Vycm9yKScpCispCitlbmRlZgorIyBydW4gdGVzdAorJChzdHJpcCAkKGNhbGwgdGVzdC12YWxpZGF0ZS1wYXRocy1hcmUtc3ViZGlycykpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBWYWxpZGF0ZSBqYWNvY28gY2xhc3MgZmlsdGVycyBhbmQgY29udmVydCB0aGVtIHRvCisjIyBmaWxlIGFyZ3VtZW50cworIyMgSmFjb2NvIGNsYXNzIGZpbHRlcnMgYXJlIGNvbW1hLXNlcGFyYXRlZCBsaXN0cyBvZiBjbGFzcworIyMgZmlsZXMgKGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uKSwgYW5kIG1heSBoYXZlICcqJyBhcyB0aGUKKyMjIGxhc3QgY2hhcmFjdGVyIHRvIG1hdGNoIGFsbCBjbGFzc2VzIGluIGEgcGFja2FnZQorIyMgaW5jbHVkaW5nIHN1YnBhY2thZ2VzLgorZGVmaW5lIGphY29jby1jbGFzcy1maWx0ZXItdG8tZmlsZS1hcmdzCiskKHN0cmlwICQoY2FsbCBqYWNvY28tdmFsaWRhdGUtZmlsZS1hcmdzLFwKKyAgJChzdWJzdCAkKGNvbW1hKSwkKHNwYWNlKSxcCisgICAgJChzdWJzdCAuLC8sXAorICAgICAgJChzdHJpcCAkKDEpKSkpKSkKK2VuZGVmCisKK2RlZmluZSBqYWNvY28tdmFsaWRhdGUtZmlsZS1hcmdzCiskKHN0cmlwICQoMSlcCisgICQoY2FsbCB2YWxpZGF0ZS1wYXRocy1hcmUtc3ViZGlycywkKDEpKQorICAkKGZvcmVhY2ggYXJnLCQoMSksXAorICAgICQoaWYgJChmaW5kc3RyaW5nID8sJChhcmcpKSwkKGNhbGwgcHJldHR5LWVycm9yLFwKKyAgICAgICc/JyBmaWx0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGluIExPQ0FMX0pBQ0tfQ09WRVJBR0VfSU5DTFVERV9GSUxURVIgb3IgTE9DQUxfSkFDS19DT1ZFUkFHRV9FWENMVURFX0ZJTFRFUikpXAorICAgICQoaWYgJChmaW5kc3RyaW5nICosJChwYXRzdWJzdCAlKiwlLCQoYXJnKSkpLCQoY2FsbCBwcmV0dHktZXJyb3IsXAorICAgICAgJyonIGlzIG9ubHkgc3VwcG9ydGVkIGF0IHRoZSBlbmQgb2YgYSBmaWx0ZXIgaW4gTE9DQUxfSkFDS19DT1ZFUkFHRV9JTkNMVURFX0ZJTFRFUiBvciBMT0NBTF9KQUNLX0NPVkVSQUdFX0VYQ0xVREVfRklMVEVSKSlcCisgICkpCitlbmRlZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgT3RoZXIgaW5jbHVkZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTM0MDksMyArMzQ1NSw0MyBAQAogICAkKGV2YWwgQUxMX01PRFVMRVMuJChlbmZvcmNlX3Jyb19zb3VyY2VfbW9kdWxlKS5SRVFVSVJFRCArPSAkKGVuZm9yY2VfcnJvX21vZHVsZSkpIFwKICkKIGVuZGVmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBGaW5kIHN5c3RlbV8kKFZFUikgaW4gTE9DQUxfU0RLX1ZFUlNJT04KKyMjCisjIyAkKDEpOiBMT0NBTF9TREtfVkVSU0lPTgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2RlZmluZSBoYXMtc3lzdGVtLXNkay12ZXJzaW9uCiskKGZpbHRlciBzeXN0ZW1fJSwkKDEpKQorZW5kZWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIEdldCBudW1lcmljYWwgdmVyc2lvbiBpbiBMT0NBTF9TREtfVkVSU0lPTgorIyMKKyMjICQoMSk6IExPQ0FMX1NES19WRVJTSU9OCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZGVmaW5lIGdldC1udW1lcmljLXNkay12ZXJzaW9uCiskKGZpbHRlci1vdXQgY3VycmVudCxcCisgICQoaWYgJChjYWxsIGhhcy1zeXN0ZW0tc2RrLXZlcnNpb24sJCgxKSksJChwYXRzdWJzdCBzeXN0ZW1fJSwlLCQoMSkpLCQoMSkpKQorZW5kZWYKKworIyBDb252ZXJ0IHRvIGxvd2VyIGNhc2Ugd2l0aG91dCByZXF1aXJpbmcgYSBzaGVsbCwgd2hpY2ggaXNuJ3QgY2FjaGVhYmxlLgordG8tbG93ZXI9JChzdWJzdCBBLGEsJChzdWJzdCBCLGIsJChzdWJzdCBDLGMsJChzdWJzdCBELGQsJChzdWJzdCBFLGUsJChzdWJzdCBGLGYsJChzdWJzdCBHLGcsJChzdWJzdCBILGgsJChzdWJzdCBJLGksJChzdWJzdCBKLGosJChzdWJzdCBLLGssJChzdWJzdCBMLGwsJChzdWJzdCBNLG0sJChzdWJzdCBOLG4sJChzdWJzdCBPLG8sJChzdWJzdCBQLHAsJChzdWJzdCBRLHEsJChzdWJzdCBSLHIsJChzdWJzdCBTLHMsJChzdWJzdCBULHQsJChzdWJzdCBVLHUsJChzdWJzdCBWLHYsJChzdWJzdCBXLHcsJChzdWJzdCBYLHgsJChzdWJzdCBZLHksJChzdWJzdCBaLHosJDEpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKQorCisjIENvbnZlcnQgdG8gdXBwZXIgY2FzZSB3aXRob3V0IHJlcXVpcmluZyBhIHNoZWxsLCB3aGljaCBpc24ndCBjYWNoZWFibGUuCit0by11cHBlcj0kKHN1YnN0IGEsQSwkKHN1YnN0IGIsQiwkKHN1YnN0IGMsQywkKHN1YnN0IGQsRCwkKHN1YnN0IGUsRSwkKHN1YnN0IGYsRiwkKHN1YnN0IGcsRywkKHN1YnN0IGgsSCwkKHN1YnN0IGksSSwkKHN1YnN0IGosSiwkKHN1YnN0IGssSywkKHN1YnN0IGwsTCwkKHN1YnN0IG0sTSwkKHN1YnN0IG4sTiwkKHN1YnN0IG8sTywkKHN1YnN0IHAsUCwkKHN1YnN0IHEsUSwkKHN1YnN0IHIsUiwkKHN1YnN0IHMsUywkKHN1YnN0IHQsVCwkKHN1YnN0IHUsVSwkKHN1YnN0IHYsViwkKHN1YnN0IHcsVywkKHN1YnN0IHgsWCwkKHN1YnN0IHksWSwkKHN1YnN0IHosWiwkMSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpCisKKyMgU2FuaXR5LWNoZWNrIHRvLWxvd2VyIGFuZCB0by11cHBlcgorbG93ZXIgOj0gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXotXwordXBwZXIgOj0gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotXworCitpZm5lcSAoJChsb3dlciksJChjYWxsIHRvLWxvd2VyLCQodXBwZXIpKSkKKyAgJChlcnJvciB0by1sb3dlciBzYW5pdHkgY2hlY2sgZmFpbHVyZSkKK2VuZGlmCisKK2lmbmVxICgkKHVwcGVyKSwkKGNhbGwgdG8tdXBwZXIsJChsb3dlcikpKQorICAkKGVycm9yIHRvLXVwcGVyIHNhbml0eSBjaGVjayBmYWlsdXJlKQorZW5kaWYKKworbG93ZXIgOj0KK3VwcGVyIDo9CmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHQubWsgYi9jb3JlL2RleF9wcmVvcHQubWsKaW5kZXggOGU0OTZhNy4uMjcwZTVmNCAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0Lm1rCisrKyBiL2NvcmUvZGV4X3ByZW9wdC5tawpAQCAtMjQsMzQgKzI0LDQyIEBACiBTWVNURU1fT1RIRVJfT0RFWF9GSUxURVIgPz0gYXBwLyUgcHJpdi1hcHAvJQogCiAjIE1ldGhvZCByZXR1cm5pbmcgd2hldGhlciB0aGUgaW5zdGFsbCBwYXRoICQoMSkgc2hvdWxkIGJlIGZvciBzeXN0ZW1fb3RoZXIuCisjIFVuZGVyIFNBTklUSVpFX0xJVEUsIHdlIGRvIG5vdCB3YW50IHN5c3RlbV9vdGhlci4gSnVzdCBwdXQgdGhpbmdzIHVuZGVyIC9kYXRhL2FzYW4uCitpZmVxICgkKFNBTklUSVpFX0xJVEUpLHRydWUpCitpbnN0YWxsLW9uLXN5c3RlbS1vdGhlciA9CitlbHNlCiBpbnN0YWxsLW9uLXN5c3RlbS1vdGhlciA9ICQoZmlsdGVyLW91dCAkKFBST0RVQ1RfREVYUFJFT1BUX1NQRUVEX0FQUFMpICQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMpLCQoYmFzZW5hbWUgJChub3RkaXIgJChmaWx0ZXIgJChmb3JlYWNoIGYsJChTWVNURU1fT1RIRVJfT0RFWF9GSUxURVIpLCQoVEFSR0VUX09VVCkvJChmKSksJCgxKSkpKSkKK2VuZGlmCiAKICMgVGhlIGRlZmF1bHQgdmFsdWVzIGZvciBwcmUtb3B0aW5nOiBhbHdheXMgcHJlb3B0IFBJQy4KICMgQ29uZGl0aW9uYWwgdG8gYnVpbGRpbmcgb24gbGludXgsIGFzIGRleDJvYXQgY3VycmVudGx5IGRvZXMgbm90IHdvcmsgb24gZGFyd2luLgogaWZlcSAoJChIT1NUX09TKSxsaW51eCkKICAgV0lUSF9ERVhQUkVPUFQgPz0gdHJ1ZQotIyBGb3IgYW4gZW5nIGJ1aWxkIG9ubHkgcHJlLW9wdCB0aGUgYm9vdCBpbWFnZSBhbmQgc3lzdGVtIHNlcnZlci4gVGhpcyBnaXZlcyByZWFzb25hYmxlIHBlcmZvcm1hbmNlCi0jIGFuZCBzdGlsbCBhbGxvd3MgYSBzaW1wbGUgd29ya2Zsb3c6IGJ1aWxkaW5nIGluIGZyYW1ld29ya3MvYmFzZSBhbmQgc3luY2luZy4KICAgaWZlcSAoZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKQorICAgICMgRG9uJ3Qgc3RyaXAgZm9yIHF1aWNrIGRldmVsb3BtZW50IHR1cm5hcm91bmRzLgorICAgIERFWF9QUkVPUFRfREVGQVVMVCA6PSBub3N0cmlwcGluZworICAgICMgRm9yIGFuIGVuZyBidWlsZCBvbmx5IHByZS1vcHQgdGhlIGJvb3QgaW1hZ2UgYW5kIHN5c3RlbSBzZXJ2ZXIuIFRoaXMgZ2l2ZXMgcmVhc29uYWJsZSBwZXJmb3JtYW5jZQorICAgICMgYW5kIHN0aWxsIGFsbG93cyBhIHNpbXBsZSB3b3JrZmxvdzogYnVpbGRpbmcgaW4gZnJhbWV3b3Jrcy9iYXNlIGFuZCBzeW5jaW5nLgogICAgIFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFkgPz0gdHJ1ZQogICBlbmRpZgotIyBBZGQgbWluaS1kZWJ1Zy1pbmZvIHRvIHRoZSBib290IGNsYXNzcGF0aCB1bmxlc3MgZXhwbGljaXRseSBhc2tlZCBub3QgdG8uCisgICMgQWRkIG1pbmktZGVidWctaW5mbyB0byB0aGUgYm9vdCBjbGFzc3BhdGggdW5sZXNzIGV4cGxpY2l0bHkgYXNrZWQgbm90IHRvLgogICBpZm5lcSAoZmFsc2UsJChXSVRIX0RFWFBSRU9QVF9ERUJVR19JTkZPKSkKICAgICBQUk9EVUNUX0RFWF9QUkVPUFRfQk9PVF9GTEFHUyArPSAtLWdlbmVyYXRlLW1pbmktZGVidWctaW5mbwogICBlbmRpZgorCisgICMgTm9uIGVuZyBsaW51eCBidWlsZHMgbXVzdCBoYXZlIHByZW9wdCBlbmFibGVkIHNvIHRoYXQgc3lzdGVtIHNlcnZlciBkb2Vzbid0IHJ1biBhcyBpbnRlcnByZXRlcgorICAjIG9ubHkuIGIvNzQyMDkzMjkKKyAgaWZlcSAoLCQoZmlsdGVyIGVuZywgJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorICAgIGlmbmVxICh0cnVlLCQoV0lUSF9ERVhQUkVPUFQpKQorICAgICAgaWZuZXEgKHRydWUsJChXSVRIX0RFWFBSRU9QVF9CT09UX0lNR19BTkRfU1lTVEVNX1NFUlZFUl9PTkxZKSkKKyAgICAgICAgJChjYWxsIHByZXR0eS1lcnJvciwgREVYUFJFT1BUIG11c3QgYmUgZW5hYmxlZCBmb3IgdXNlciBhbmQgdXNlcmRlYnVnIGJ1aWxkcykKKyAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgZW5kaWYKIGVuZGlmCiAKIEdMT0JBTF9ERVhQUkVPUFRfRkxBR1MgOj0KIAotIyAkKDEpOiB0aGUgLmphciBvciAuYXBrIHRvIHJlbW92ZSBjbGFzc2VzLmRleAotZGVmaW5lIGRleHByZW9wdC1yZW1vdmUtY2xhc3Nlcy5kZXgKLSQoaGlkZSkgemlwIC0tcXVpZXQgLS1kZWxldGUgJCgxKSBjbGFzc2VzLmRleDsgXAotZGV4X2luZGV4PTI7IFwKLXdoaWxlIHppcCAtLXF1aWV0IC0tZGVsZXRlICQoMSkgY2xhc3NlcyQke2RleF9pbmRleH0uZGV4ID4gL2Rldi9udWxsOyBkbyBcCi0gIGxldCBkZXhfaW5kZXg9ZGV4X2luZGV4KzE7IFwKLWRvbmUKLWVuZGVmCi0KICMgU3BlY2lhbCBydWxlcyBmb3IgYnVpbGRpbmcgc3RyaXBwZWQgYm9vdCBqYXJzIHRoYXQgb3ZlcnJpZGUgamF2YV9saWJyYXJ5Lm1rIHJ1bGVzCiAKICMgJCgxKTogYm9vdCBqYXIgbW9kdWxlIG5hbWUKQEAgLTU5LDExICs2Nyw3IEBACiBfZGJqX2phcl9ub19kZXggOj0gJChERVhQUkVPUFRfQk9PVF9KQVJfRElSX0ZVTExfUEFUSCkvJCgxKV9ub2RleC5qYXIKIF9kYmpfc3JjX2phciA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEpBVkFfTElCUkFSSUVTLCQoMSksLENPTU1PTikvamF2YWxpYi5qYXIKIAotJCQoX2Rial9qYXJfbm9fZGV4KSA6ICQkKF9kYmpfc3JjX2phcikKLQkkJChjYWxsIGNvcHktZmlsZS10by10YXJnZXQpCi1pZm5lcSAoJChERVhfUFJFT1BUX0RFRkFVTFQpLG5vc3RyaXBwaW5nKQotCSQkKGNhbGwgZGV4cHJlb3B0LXJlbW92ZS1jbGFzc2VzLmRleCwkJEApCi1lbmRpZgorJChjYWxsIGRleHByZW9wdC1jb3B5LWphciwkJChfZGJqX3NyY19qYXIpLCQkKF9kYmpfamFyX25vX2RleCksJChERVhfUFJFT1BUX0RFRkFVTFQpKQogCiBfZGJqX2phcl9ub19kZXggOj0KIF9kYmpfc3JjX2phciA6PQpkaWZmIC0tZ2l0IGEvY29yZS9kZXhfcHJlb3B0X2xpYmFydC5tayBiL2NvcmUvZGV4X3ByZW9wdF9saWJhcnQubWsKaW5kZXggOTYxNjAzNi4uZjI4OWMyMiAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0X2xpYmFydC5taworKysgYi9jb3JlL2RleF9wcmVvcHRfbGliYXJ0Lm1rCkBAIC03LDE1ICs3LDE0IEBACiAjIFNldCBVU0VfREVYMk9BVF9ERUJVRyB0byBmYWxzZSBmb3Igb25seSBidWlsZGluZyBub24tZGVidWcgdmVyc2lvbnMuCiBpZmVxICgkKFVTRV9ERVgyT0FUX0RFQlVHKSxmYWxzZSkKIERFWDJPQVQgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGV4Mm9hdCQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKK1BBVENIT0FUIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3BhdGNob2F0JChIT1NUX0VYRUNVVEFCTEVfU1VGRklYKQogZWxzZQogREVYMk9BVCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZXgyb2F0ZCQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKK1BBVENIT0FUIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3BhdGNob2F0ZCQoSE9TVF9FWEVDVVRBQkxFX1NVRkZJWCkKIGVuZGlmCiAKLSMgUGFzcyBzcGVjaWFsIGNsYXNzIGxvYWRlciBjb250ZXh0IHRvIHNraXAgdGhlIGNsYXNzcGF0aCBhbmQgY29sbGlzaW9uIGNoZWNrLgotIyBTaG91bGQgbW9kaWZ5IGJ1aWxkIHN5c3RlbSB0byBwYXNzIHVzZWQgbGlicmFyaWVzIHByb3Blcmx5IGxhdGVyLgotREVYMk9BVF9DTEFTU19MT0FERVJfQ09OVEVYVCA6PSAiJiIKLQogREVYMk9BVF9ERVBFTkRFTkNZICs9ICQoREVYMk9BVCkKK1BBVENIT0FUX0RFUEVOREVOQ1kgKz0gJChQQVRDSE9BVCkKIAogIyBVc2UgdGhlIGZpcnN0IHByZWxvYWRlZC1jbGFzc2VzIGZpbGUgaW4gUFJPRFVDVF9DT1BZX0ZJTEVTLgogUFJFTE9BREVEX0NMQVNTRVMgOj0gJChjYWxsIHdvcmQtY29sb24sMSwkKGZpcnN0d29yZCBcCkBAIC0zMCw3ICsyOSw5IEBACiAgICAgJChmaWx0ZXIgJXN5c3RlbS9ldGMvZGlydHktaW1hZ2Utb2JqZWN0cywkKFBST0RVQ1RfQ09QWV9GSUxFUykpKSkKIAogZGVmaW5lIGdldC1wcm9kdWN0LWRlZmF1bHQtcHJvcGVydHkKLSQoc3RyaXAgJChwYXRzdWJzdCAkKDEpPSUsJSwkKGZpbHRlciAkKDEpPSUsJChQUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTKSkpKQorJChzdHJpcCBcCisgICQoZXZhbCBfcHJvcCA6PSAkKHBhdHN1YnN0ICQoMSk9JSwlLCQoZmlsdGVyICQoMSk9JSwkKFBST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMpKSkpXAorICAkKGlmICQoX3Byb3ApLCQoX3Byb3ApLCQocGF0c3Vic3QgJCgxKT0lLCUsJChmaWx0ZXIgJCgxKT0lLCQoUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTKSkpKSkKIGVuZGVmCiAKIERFWDJPQVRfSU1BR0VfWE1TIDo9ICQoY2FsbCBnZXQtcHJvZHVjdC1kZWZhdWx0LXByb3BlcnR5LGRhbHZpay52bS5pbWFnZS1kZXgyb2F0LVhtcykKQEAgLTg5LDE0ICs5MCwxOSBAQAogIyBpcyBjb252ZXJ0ZWQgaW50byB0byBib290LmFydCAodG8gbWF0Y2ggdGhlIGxlZ2FjeSBhc3N1bXB0aW9uIHRoYXQgYm9vdC5hcnQKICMgZXhpc3RzKSwgYW5kIHRoZSByZXN0IGFyZSBjb252ZXJ0ZWQgdG8gYm9vdC08bmFtZT4uYXJ0LgogIyBJbiBhZGRpdGlvbiwgZWFjaCAuYXJ0IGZpbGUgaGFzIGFuIGFzc29jaWF0ZWQgLm9hdCBmaWxlLgotTElCQVJUX1RBUkdFVF9CT09UX0FSVF9FWFRSQV9GSUxFUyA6PSAkKGZvcmVhY2ggamFyLCQod29yZGxpc3QgMiw5OTksJChMSUJBUlRfVEFSR0VUX0JPT1RfSkFSUykpLGJvb3QtJChqYXIpLmFydCBib290LSQoamFyKS5vYXQgYm9vdC0kKGphcikudmRleCkKLUxJQkFSVF9UQVJHRVRfQk9PVF9BUlRfRVhUUkFfRklMRVMgKz0gYm9vdC5vYXQgYm9vdC52ZGV4CitMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX0VYVFJBX0ZJTEVTIDo9ICQoZm9yZWFjaCBqYXIsJCh3b3JkbGlzdCAyLDk5OSwkKExJQkFSVF9UQVJHRVRfQk9PVF9KQVJTKSksYm9vdC0kKGphcikuYXJ0IGJvb3QtJChqYXIpLmFydC5yZWwgYm9vdC0kKGphcikub2F0KQorTElCQVJUX1RBUkdFVF9CT09UX0FSVF9FWFRSQV9GSUxFUyArPSBib290LmFydC5yZWwgYm9vdC5vYXQKK0xJQkFSVF9UQVJHRVRfQk9PVF9BUlRfVkRFWF9GSUxFUyA6PSAkKGZvcmVhY2ggamFyLCQod29yZGxpc3QgMiw5OTksJChMSUJBUlRfVEFSR0VUX0JPT1RfSkFSUykpLGJvb3QtJChqYXIpLnZkZXgpCitMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX1ZERVhfRklMRVMgKz0gYm9vdC52ZGV4CiAKICMgSWYgd2UgdXNlIGEgYm9vdCBpbWFnZSBwcm9maWxlLgogbXlfdXNlX3Byb2ZpbGVfZm9yX2Jvb3RfaW1hZ2UgOj0gJChQUk9EVUNUX1VTRV9QUk9GSUxFX0ZPUl9CT09UX0lNQUdFKQogaWZlcSAoLCQobXlfdXNlX3Byb2ZpbGVfZm9yX2Jvb3RfaW1hZ2UpKQotIyBJZiBub3Qgc2V0LCB1c2UgdGhlIGRlZmF1bHQuCi1teV91c2VfcHJvZmlsZV9mb3JfYm9vdF9pbWFnZSA6PSBmYWxzZQorIyBJZiBub3Qgc2V0LCBzZXQgdGhlIGRlZmF1bHQgdG8gdHJ1ZSBpZiB3ZSBhcmUgbm90IGEgUERLIGJ1aWxkLiBQREsgYnVpbGRzCisjIGNhbid0IGJ1aWxkIHRoZSBwcm9maWxlIHNpbmNlIHRoZXkgZG9uJ3QgaGF2ZSBmcmFtZXdvcmtzL2Jhc2UuCitpZm5lcSAodHJ1ZSwkKFRBUkdFVF9CVUlMRF9QREspKQorbXlfdXNlX3Byb2ZpbGVfZm9yX2Jvb3RfaW1hZ2UgOj0gdHJ1ZQorZW5kaWYKIGVuZGlmCiAKIGlmZXEgKHRydWUsJChteV91c2VfcHJvZmlsZV9mb3JfYm9vdF9pbWFnZSkpCkBAIC0xMTYsNiArMTIyLDcgQEAKIAlAbWtkaXIgLXAgJChkaXIgJEApCiAJQU5EUk9JRF9MT0dfVEFHUz0iKjplIiAkKFBST0ZNQU4pIFwKIAkJLS1jcmVhdGUtcHJvZmlsZS1mcm9tPSQoUFJJVkFURV9QUk9GSUxFX0lOUFVUX0xPQ0FUSU9OKSBcCisJCS0tc2tpcC1hcGstdmVyaWZpY2F0aW9uIFwKIAkJJChhZGRwcmVmaXggLS1hcGs9LCQoTElCQVJUX1RBUkdFVF9CT09UX0RFWF9GSUxFUykpIFwKIAkJJChhZGRwcmVmaXggLS1kZXgtbG9jYXRpb249LCQoTElCQVJUX1RBUkdFVF9CT09UX0RFWF9MT0NBVElPTlMpKSBcCiAJCS0tcmVmZXJlbmNlLXByb2ZpbGUtZmlsZT0kQApAQCAtMTI4LDYgKzEzNSw4IEBACiAKIGVuZGlmCiAKK0xJQkFSVF9UQVJHRVRfQk9PVF9BUlRfVkRFWF9JTlNUQUxMRURfU0hBUkVEX0ZJTEVTIDo9ICQoYWRkcHJlZml4ICQoUFJPRFVDVF9PVVQpLyQoREVYUFJFT1BUX0JPT1RfSkFSX0RJUikvLCQoTElCQVJUX1RBUkdFVF9CT09UX0FSVF9WREVYX0ZJTEVTKSkKKwogbXlfMm5kX2FyY2hfcHJlZml4IDo9CiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kZXhfcHJlb3B0X2xpYmFydF9ib290Lm1rCiAKQEAgLTEzNSwxMCArMTQ0LDI0IEBACiBpZmRlZiBUQVJHRVRfMk5EX0FSQ0gKIG15XzJuZF9hcmNoX3ByZWZpeCA6PSAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKQogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9saWJhcnRfYm9vdC5tawotbXlfMm5kX2FyY2hfcHJlZml4IDo9CiBlbmRpZgogZW5kaWYKIAorIyBDb3B5IHNoYXJlZCB2ZGV4IHRvIHRoZSBkaXJlY3RvcnkgYW5kIGNyZWF0ZSBjb3JyZXNwb25kaW5nIHN5bWxpbmtzIGluIHByaW1hcnkgYW5kIHNlY29uZGFyeSBhcmNoLgorJChMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX1ZERVhfSU5TVEFMTEVEX1NIQVJFRF9GSUxFUykgOiBQUklNQVJZX0FSQ0hfRElSIDo9ICQoZGlyICQoREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRSkpCiskKExJQkFSVF9UQVJHRVRfQk9PVF9BUlRfVkRFWF9JTlNUQUxMRURfU0hBUkVEX0ZJTEVTKSA6IFNFQ09ORF9BUkNIX0RJUiA6PSAkKGRpciAkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0UpKQorJChMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX1ZERVhfSU5TVEFMTEVEX1NIQVJFRF9GSUxFUykgOiAkKERFRkFVTFRfREVYX1BSRU9QVF9CVUlMVF9JTUFHRV9GSUxFTkFNRSkKKwlAZWNobyAiSW5zdGFsbDogJEAiCisJQG1rZGlyIC1wICQoZGlyICRAKQorCUBybSAtZiAkQAorCSQoaGlkZSkgY3AgIiQoZGlyICQ8KSQobm90ZGlyICRAKSIgIiRAIgorCSMgTWFrZSBzeW1saW5rIGZvciBib3RoIHRoZSBhcmNocy4gSW4gdGhlIGNhc2UgaXRzIHNpbmdsZSBhcmNoIHRoZSBzeW1saW5rIHdpbGwganVzdCBnZXQgb3ZlcnJpZGRlbi4KKwlAbWtkaXIgLXAgJChQUklNQVJZX0FSQ0hfRElSKQorCSQoaGlkZSkgbG4gLXNmIC8kKERFWFBSRU9QVF9CT09UX0pBUl9ESVIpLyQobm90ZGlyICRAKSAkKFBSSU1BUllfQVJDSF9ESVIpJChub3RkaXIgJEApCisJQG1rZGlyIC1wICQoU0VDT05EX0FSQ0hfRElSKQorCSQoaGlkZSkgbG4gLXNmIC8kKERFWFBSRU9QVF9CT09UX0pBUl9ESVIpLyQobm90ZGlyICRAKSAkKFNFQ09ORF9BUkNIX0RJUikkKG5vdGRpciAkQCkKKworbXlfMm5kX2FyY2hfcHJlZml4IDo9CiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBGb3IgYSBzaW5nbGUgamFyIG9yIEFQSwpAQCAtMTUwLDcgKzE3Myw3IEBACiAkKGhpZGUpIG1rZGlyIC1wICQoZGlyICQoMikpCiAkKGhpZGUpIEFORFJPSURfTE9HX1RBR1M9Iio6ZSIgJChERVgyT0FUKSBcCiAJLS1ydW50aW1lLWFyZyAtWG1zJChERVgyT0FUX1hNUykgLS1ydW50aW1lLWFyZyAtWG14JChERVgyT0FUX1hNWCkgXAotCS0tY2xhc3MtbG9hZGVyLWNvbnRleHQ9JChERVgyT0FUX0NMQVNTX0xPQURFUl9DT05URVhUKSBcCisJLS1jbGFzcy1sb2FkZXItY29udGV4dD0kKFBSSVZBVEVfREVYMk9BVF9DTEFTU19MT0FERVJfQ09OVEVYVCkgXAogCS0tYm9vdC1pbWFnZT0kKFBSSVZBVEVfREVYX1BSRU9QVF9JTUFHRV9MT0NBVElPTikgXAogCS0tZGV4LWZpbGU9JCgxKSBcCiAJLS1kZXgtbG9jYXRpb249JChQUklWQVRFX0RFWF9MT0NBVElPTikgXApkaWZmIC0tZ2l0IGEvY29yZS9kZXhfcHJlb3B0X2xpYmFydF9ib290Lm1rIGIvY29yZS9kZXhfcHJlb3B0X2xpYmFydF9ib290Lm1rCmluZGV4IGUzZWI5ZWYuLmE1ZTdlODggMTAwNjQ0Ci0tLSBhL2NvcmUvZGV4X3ByZW9wdF9saWJhcnRfYm9vdC5taworKysgYi9jb3JlL2RleF9wcmVvcHRfbGliYXJ0X2Jvb3QubWsKQEAgLTMwLDYgKzMwLDggQEAKICQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0UgOj0gJChQUk9EVUNUX09VVCkkKCQobXlfMm5kX2FyY2hfcHJlZml4KUxJQkFSVF9CT09UX0lNQUdFX0ZJTEVOQU1FKQogJChteV8ybmRfYXJjaF9wcmVmaXgpTElCQVJUX1RBUkdFVF9CT09UX0FSVF9FWFRSQV9JTlNUQUxMRURfRklMRVMgOj0gJChhZGRwcmVmaXggJChkaXIgJCgkKG15XzJuZF9hcmNoX3ByZWZpeClERUZBVUxUX0RFWF9QUkVPUFRfSU5TVEFMTEVEX0lNQUdFKSksXAogICAgICQoTElCQVJUX1RBUkdFVF9CT09UX0FSVF9FWFRSQV9GSUxFUykpCiskKG15XzJuZF9hcmNoX3ByZWZpeClMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX1ZERVhfSU5TVEFMTEVEX0ZJTEVTIDo9ICQoYWRkcHJlZml4ICQoZGlyICQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRSkpLFwKKyAgICAkKExJQkFSVF9UQVJHRVRfQk9PVF9BUlRfVkRFWF9GSUxFUykpCiAKICMgSWYgd2UgaGF2ZSBhIGNvbXBpbGVkLWNsYXNzZXMgZmlsZSwgY3JlYXRlIGEgcGFyYW1ldGVyLgogQ09NUElMRURfQ0xBU1NFU19GTEFHUyA6PQpAQCAtNDUsNyArNDcsNyBAQAogCiAjIFRoZSBydWxlIHRvIGluc3RhbGwgYm9vdC5hcnQKICMgRGVwZW5kcyBvbiBpbnN0YWxsZWQgYm9vdC5vYXQsIGJvb3QtKi5hcnQsIGJvb3QtKi5vYXQKLSQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRSkgOiAkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9CVUlMVF9JTUFHRV9GSUxFTkFNRSkgfCAkKEFDUCkgJCgkKG15XzJuZF9hcmNoX3ByZWZpeClMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX0VYVFJBX0lOU1RBTExFRF9GSUxFUykKKyQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0lOU1RBTExFRF9JTUFHRSkgOiAkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9CVUlMVF9JTUFHRV9GSUxFTkFNRSkgfCAkKEFDUCkgJCgkKG15XzJuZF9hcmNoX3ByZWZpeClMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX0VYVFJBX0lOU1RBTExFRF9GSUxFUykgJCgkKG15XzJuZF9hcmNoX3ByZWZpeClMSUJBUlRfVEFSR0VUX0JPT1RfQVJUX1ZERVhfSU5TVEFMTEVEX1NIQVJFRF9GSUxFUykKIAlAZWNobyAiSW5zdGFsbDogJEAiCiAJJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQogCkBAIC02NSwxNyArNjcsNDIgQEAKIG15X2Jvb3RfaW1hZ2VfZmxhZ3MgKz0gLS1wcm9maWxlLWZpbGU9JChteV9vdXRfYm9vdF9pbWFnZV9wcm9maWxlX2xvY2F0aW9uKQogZW5kaWYKIAoraWZuZXEgKGFkZHJlc3N0cnVlLCQoU0FOSVRJWkVfVEFSR0VUKSQoU0FOSVRJWkVfTElURSkpCisjIFNraXAgcmVjb21waWxpbmcgdGhlIGJvb3QgaW1hZ2UgZm9yIHRoZSBzZWNvbmQgc2FuaXRpemF0aW9uIHBoYXNlLiBXZSdsbCBnZXQgc2VwYXJhdGUgcGF0aHMKKyMgYW5kIGludmFsaWRhdGUgZmlyc3Qtc3RhZ2UgYXJ0aWZhY3RzIHdoaWNoIGFyZSBjcnVjaWFsIHRvIFNBTklUSVpFX0xJVEUgYnVpbGRzLgorIyBOb3RlOiB0aGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdC4gQ29tcGlsZWQgY29kZSBjb250YWlucyBzdGFjayBjaGVja3Mgd2hpY2ggbWF5IGRlcGVuZAorIyAgICAgICBvbiBBU0FOIHNldHRpbmdzLgorCisjIFVzZSBBTkRST0lEX0xPR19UQUdTIHRvIHN1cHByZXNzIG1vc3QgbG9nZ2luZyBieSBkZWZhdWx0Li4uCitpZmVxICgsJChBUlRfQk9PVF9JTUFHRV9FWFRSQV9BUkdTKSkKK0RFWDJPQVRfQk9PVF9JTUFHRV9MT0dfVEFHUyA6PSBBTkRST0lEX0xPR19UQUdTPSIqOmUiCitlbHNlCisjIC4uLnVubGVzcyB0aGUgYm9vdCBpbWFnZSBpcyBnZW5lcmF0ZWQgc3BlY2lmaWNhbGx5IGZvciB0ZXN0aW5nLCB0aGVuIGFsbG93IGFsbCBsb2dnaW5nLgorREVYMk9BVF9CT09UX0lNQUdFX0xPR19UQUdTIDo9IEFORFJPSURfTE9HX1RBR1M9Iio6diIKK2VuZGlmCisKKyMgQW4gYWRkaXRpb25hbCBtZXNzYWdlIHRvIHByaW50IG9uIGRleDJvYXQgZmFpbHVyZS4KK0RFWDJPQVRfRkFJTFVSRV9NRVNTQUdFIDo9IEVSUk9SOiBEZXgyb2F0IGZhaWxlZCB0byBjb21waWxlIGEgYm9vdCBpbWFnZS4KK0RFWDJPQVRfRkFJTFVSRV9NRVNTQUdFICs9IEl0IGlzIGxpa2VseSB0aGF0IHRoZSBib290IGNsYXNzcGF0aCBpcyBpbmNvbnNpc3RlbnQuCitpZmVxICgkKE9ORV9TSE9UX01BS0VGSUxFKSwpCisgIERFWDJPQVRfRkFJTFVSRV9NRVNTQUdFICs9IFJlYnVpbGQgd2l0aCBBUlRfQk9PVF9JTUFHRV9FWFRSQV9BUkdTPSItLXJ1bnRpbWUtYXJnIC12ZXJib3NlOnZlcmlmaWVyIiB0byBzZWUgdmVyaWZpY2F0aW9uIGVycm9ycy4KK2Vsc2UKKyAgREVYMk9BVF9GQUlMVVJFX01FU1NBR0UgKz0gQnVpbGQgd2l0aCBtLCBtbWEsIG9yIG1tbWEgaW5zdGVhZCBvZiBtbSBvciBtbW0gdG8gcmVtZWR5IHRoZSBzaXR1YXRpb24uCitlbmRpZgorCiAkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9CVUlMVF9JTUFHRV9GSUxFTkFNRSk6IFBSSVZBVEVfQk9PVF9JTUFHRV9GTEFHUyA6PSAkKG15X2Jvb3RfaW1hZ2VfZmxhZ3MpCiAkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9CVUlMVF9JTUFHRV9GSUxFTkFNRSk6IFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWCA6PSAkKG15XzJuZF9hcmNoX3ByZWZpeCkKKyQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0JVSUxUX0lNQUdFX0ZJTEVOQU1FKTogUFJJVkFURV9JTUFHRV9MT0NBVElPTiA6PSAkKCQobXlfMm5kX2FyY2hfcHJlZml4KURFRkFVTFRfREVYX1BSRU9QVF9CVUlMVF9JTUFHRV9MT0NBVElPTikKICMgVXNlIGRleDJvYXQgZGVidWcgdmVyc2lvbiBmb3IgYmV0dGVyIGVycm9yIHJlcG9ydGluZwotJCgkKG15XzJuZF9hcmNoX3ByZWZpeClERUZBVUxUX0RFWF9QUkVPUFRfQlVJTFRfSU1BR0VfRklMRU5BTUUpIDogJChMSUJBUlRfVEFSR0VUX0JPT1RfREVYX0ZJTEVTKSAkKFBSRUxPQURFRF9DTEFTU0VTKSAkKENPTVBJTEVEX0NMQVNTRVMpICQoRElSVFlfSU1BR0VfT0JKRUNUUykgJChERVgyT0FUX0RFUEVOREVOQ1kpICQobXlfb3V0X2Jvb3RfaW1hZ2VfcHJvZmlsZV9sb2NhdGlvbikKKyQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVGQVVMVF9ERVhfUFJFT1BUX0JVSUxUX0lNQUdFX0ZJTEVOQU1FKSA6ICQoTElCQVJUX1RBUkdFVF9CT09UX0RFWF9GSUxFUykgJChQUkVMT0FERURfQ0xBU1NFUykgJChDT01QSUxFRF9DTEFTU0VTKSAkKERJUlRZX0lNQUdFX09CSkVDVFMpICQoREVYMk9BVF9ERVBFTkRFTkNZKSAkKFBBVENIT0FUX0RFUEVOREVOQ1kpICQobXlfb3V0X2Jvb3RfaW1hZ2VfcHJvZmlsZV9sb2NhdGlvbikKIAlAZWNobyAidGFyZ2V0IGRleDJvYXQ6ICRAIgogCUBta2RpciAtcCAkKGRpciAkQCkKIAlAbWtkaXIgLXAgJChkaXIgJCgkKFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWClMSUJBUlRfVEFSR0VUX0JPT1RfT0FUX1VOU1RSSVBQRUQpKQotCUBybSAtZiAkKGRpciAkQCkvKi5hcnQgJChkaXIgJEApLyoub2F0CisJQHJtIC1mICQoZGlyICRAKS8qLmFydCAkKGRpciAkQCkvKi5vYXQgJChkaXIgJEApLyouYXJ0LnJlbAogCUBybSAtZiAkKGRpciAkKCQoUFJJVkFURV8yTkRfQVJDSF9WQVJfUFJFRklYKUxJQkFSVF9UQVJHRVRfQk9PVF9PQVRfVU5TVFJJUFBFRCkpLyouYXJ0CiAJQHJtIC1mICQoZGlyICQoJChQUklWQVRFXzJORF9BUkNIX1ZBUl9QUkVGSVgpTElCQVJUX1RBUkdFVF9CT09UX09BVF9VTlNUUklQUEVEKSkvKi5vYXQKLQkkKERFWDJPQVQpIC0tcnVudGltZS1hcmcgLVhtcyQoREVYMk9BVF9JTUFHRV9YTVMpIFwKKwlAcm0gLWYgJChkaXIgJCgkKFBSSVZBVEVfMk5EX0FSQ0hfVkFSX1BSRUZJWClMSUJBUlRfVEFSR0VUX0JPT1RfT0FUX1VOU1RSSVBQRUQpKS8qLmFydC5yZWwKKwkkKGhpZGUpICQoREVYMk9BVF9CT09UX0lNQUdFX0xPR19UQUdTKSAkKERFWDJPQVQpIC0tcnVudGltZS1hcmcgLVhtcyQoREVYMk9BVF9JTUFHRV9YTVMpIFwKIAkJLS1ydW50aW1lLWFyZyAtWG14JChERVgyT0FUX0lNQUdFX1hNWCkgXAogCQkkKFBSSVZBVEVfQk9PVF9JTUFHRV9GTEFHUykgXAogCQkkKGFkZHByZWZpeCAtLWRleC1maWxlPSwkKExJQkFSVF9UQVJHRVRfQk9PVF9ERVhfRklMRVMpKSBcCkBAIC05MSw0ICsxMTgsMTQgQEAKIAkJLS1ydW50aW1lLWFyZyAtWG5vcmVsb2NhdGUgLS1jb21waWxlLXBpYyBcCiAJCS0tbm8tZ2VuZXJhdGUtZGVidWctaW5mbyAtLWdlbmVyYXRlLWJ1aWxkLWlkIFwKIAkJLS1tdWx0aS1pbWFnZSAtLW5vLWlubGluZS1mcm9tPWNvcmUtb2ouamFyIFwKLQkJJChQUk9EVUNUX0RFWF9QUkVPUFRfQk9PVF9GTEFHUykgJChHTE9CQUxfREVYUFJFT1BUX0ZMQUdTKSAkKEFSVF9CT09UX0lNQUdFX0VYVFJBX0FSR1MpCisJCS0tYWJvcnQtb24taGFyZC12ZXJpZmllci1lcnJvciBcCisJCS0tYWJvcnQtb24tc29mdC12ZXJpZmllci1lcnJvciBcCisJCSQoUFJPRFVDVF9ERVhfUFJFT1BUX0JPT1RfRkxBR1MpICQoR0xPQkFMX0RFWFBSRU9QVF9GTEFHUykgJChBUlRfQk9PVF9JTUFHRV9FWFRSQV9BUkdTKSBcCisJCXx8ICggZWNobyAiJChERVgyT0FUX0ZBSUxVUkVfTUVTU0FHRSkiIDsgZmFsc2UgKSAmJiBcCisJJChERVgyT0FUX0JPT1RfSU1BR0VfTE9HX1RBR1MpIEFORFJPSURfUk9PVD0kKFBST0RVQ1RfT1VUKS9zeXN0ZW0gQU5EUk9JRF9EQVRBPSQoZGlyICRAKSAkKFBBVENIT0FUKSBcCisJCS0taW5wdXQtaW1hZ2UtbG9jYXRpb249JChQUklWQVRFX0lNQUdFX0xPQ0FUSU9OKSBcCisJCS0tb3V0cHV0LWltYWdlLXJlbG9jYXRpb24tZGlyZWN0b3J5PSQoZGlyICRAKSBcCisJCS0taW5zdHJ1Y3Rpb24tc2V0PSQoJChQUklWQVRFXzJORF9BUkNIX1ZBUl9QUkVGSVgpREVYMk9BVF9UQVJHRVRfQVJDSCkgXAorCQktLWJhc2Utb2Zmc2V0LWRlbHRhPTB4MTAwMDAwMDAKKworZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZGV4X3ByZW9wdF9vZGV4X2luc3RhbGwubWsgYi9jb3JlL2RleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rCmluZGV4IDIzNWY0YmMuLjlmNjY0NTEgMTAwNjQ0Ci0tLSBhL2NvcmUvZGV4X3ByZW9wdF9vZGV4X2luc3RhbGwubWsKKysrIGIvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5tawpAQCAtMSw2ICsxLDIwIEBACiAjIGRleHByZW9wdF9vZGV4X2luc3RhbGwubWsgaXMgdXNlZCB0byBkZWZpbmUgb2RleCBjcmVhdGlvbiBydWxlcyBmb3IgSkFScyBhbmQgQVBLcwogIyBUaGlzIGZpbGUgZGVwZW5kcyBvbiB2YXJpYWJsZXMgc2V0IGluIGJhc2VfcnVsZXMubWsKLSMgT3V0cHV0IHZhcmlhYmxlczogTE9DQUxfREVYX1BSRU9QVCwgYnVpbHRfb2RleCwgZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZQorIyBPdXRwdXQgdmFyaWFibGVzOiBMT0NBTF9ERVhfUFJFT1BULCBMT0NBTF9VTkNPTVBSRVNTX0RFWCwgYnVpbHRfb2RleCwKKyMgICAgICAgICAgICAgICAgICAgZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZQorCisjIFdlIGV4cGxpY2l0bHkgdW5jb21wcmVzcyBBUEtzIG9mIHByaXZpbGVnZWQgYXBwcywgYW5kIHVzZWQgYnkKKyMgcHJpdmlsZWdlZCBhcHBzCitMT0NBTF9VTkNPTVBSRVNTX0RFWCA6PSBmYWxzZQoraWZuZXEgKHRydWUsJChET05UX1VOQ09NUFJFU1NfUFJJVl9BUFBTX0RFWFMpKQoraWZlcSAodHJ1ZSwkKExPQ0FMX1BSSVZJTEVHRURfTU9EVUxFKSkKKyAgTE9DQUxfVU5DT01QUkVTU19ERVggOj0gdHJ1ZQorZWxzZQorICBpZm5lcSAoLCQoZmlsdGVyICQoUFJPRFVDVF9MT0FERURfQllfUFJJVklMRUdFRF9NT0RVTEVTKSwgJChMT0NBTF9NT0RVTEUpKSkKKyAgICBMT0NBTF9VTkNPTVBSRVNTX0RFWCA6PSB0cnVlCisgIGVuZGlmICAjIFBST0RVQ1RfTE9BREVEX0JZX1BSSVZJTEVHRURfTU9EVUxFUworZW5kaWYgICMgTE9DQUxfUFJJVklMRUdFRF9NT0RVTEUKK2VuZGlmICAjIERPTlRfVU5DT01QUkVTU19QUklWX0FQUFNfREVYUwogCiAjIFNldHRpbmcgTE9DQUxfREVYX1BSRU9QVCBiYXNlZCBvbiBXSVRIX0RFWFBSRU9QVCwgTE9DQUxfREVYX1BSRU9QVCwgZXRjCiBMT0NBTF9ERVhfUFJFT1BUIDo9ICQoc3RyaXAgJChMT0NBTF9ERVhfUFJFT1BUKSkKQEAgLTMwLDcgKzQ0LDcgQEAKIGlmZGVmIExPQ0FMX1VOSU5TVEFMTEFCTEVfTU9EVUxFCiBMT0NBTF9ERVhfUFJFT1BUIDo9CiBlbmRpZgotaWZlcSAoLCQoc3RyaXAgJChidWlsdF9kZXgpJChteV9wcmVidWlsdF9zcmNfZmlsZSkpKSAjIGNvbnRhaW5zIG5vIGphdmEgY29kZQoraWZlcSAoLCQoc3RyaXAgJChidWlsdF9kZXgpJChteV9wcmVidWlsdF9zcmNfZmlsZSkkKExPQ0FMX1NPT05HX0RFWF9KQVIpKSkgIyBjb250YWlucyBubyBqYXZhIGNvZGUKIExPQ0FMX0RFWF9QUkVPUFQgOj0KIGVuZGlmCiAjIGlmIFdJVEhfREVYUFJFT1BUX0JPT1RfSU1HX0FORF9TWVNURU1fU0VSVkVSX09OTFk9dHJ1ZSBhbmQgbW9kdWxlIGlzIG5vdCBpbiBib290IGNsYXNzIHBhdGggc2tpcApAQCAtNDYsMTQgKzYwLDI3IEBACiBlbmRpZgogZW5kaWYKIAotIyBpZiBpbnN0YWxsaW5nIGludG8gc3lzdGVtLCBhbmQgb2RleCBhcmUgYmVpbmcgaW5zdGFsbGVkIGludG8gc3lzdGVtX290aGVyLCBkb24ndCBzdHJpcAotaWZlcSAoJChCT0FSRF9VU0VTX1NZU1RFTV9PVEhFUl9PREVYKSx0cnVlKQogaWZlcSAoJChMT0NBTF9ERVhfUFJFT1BUKSx0cnVlKQorCisjIERvbid0IHN0cmlwIHdpdGggZGV4ZXMgd2UgZXhwbGljaXRseSB1bmNvbXByZXNzIChkZXhvcHQgd2lsbCBub3Qgc3RvcmUgdGhlIGRleCBjb2RlKS4KK2lmZXEgKCQoTE9DQUxfVU5DT01QUkVTU19ERVgpLHRydWUpCitMT0NBTF9ERVhfUFJFT1BUIDo9IG5vc3RyaXBwaW5nCitlbmRpZiAgIyBMT0NBTF9VTkNPTVBSRVNTX0RFWAorCisjIHN5c3RlbV9vdGhlciBpc24ndCB0aGVyZSBmb3IgYW4gT1RBLCBzbyBkb24ndCBzdHJpcAorIyBpZiBtb2R1bGUgaXMgb24gc3lzdGVtLCBhbmQgb2RleCBpcyBvbiBzeXN0ZW1fb3RoZXIuCitpZmVxICgkKEJPQVJEX1VTRVNfU1lTVEVNX09USEVSX09ERVgpLHRydWUpCiBpZm5lcSAoJChjYWxsIGluc3RhbGwtb24tc3lzdGVtLW90aGVyLCAkKG15X21vZHVsZV9wYXRoKSksKQogTE9DQUxfREVYX1BSRU9QVCA6PSBub3N0cmlwcGluZwotZW5kaWYKLWVuZGlmCi1lbmRpZgorZW5kaWYgICMgaW5zdGFsbC1vbi1zeXN0ZW0tb3RoZXIKK2VuZGlmICAjIEJPQVJEX1VTRVNfU1lTVEVNX09USEVSX09ERVgKKworIyBXZSBhbHNvIGRvbid0IHN0cmlwIGlmIGFsbCBkZXhzIGFyZSB1bmNvbXByZXNzZWQgKGRleG9wdCB3aWxsIG5vdCBzdG9yZSB0aGUgZGV4IGNvZGUpLAorIyBidXQgdGhhdCByZXF1aXJlcyB0byBpbnNwZWN0IHRoZSBzb3VyY2UgZmlsZSwgd2hpY2ggaXMgdG9vIGVhcmx5IGF0IHRoaXMgcG9pbnQgKGFzIHdlCisjIGRvbid0IGtub3cgaWYgdGhlIHNvdXJjZSBmaWxlIHdpbGwgYWN0dWFsbHkgYmUgdXNlZCkuCisjIFNlZSBkZXhwcmVvcHQtcmVtb3ZlLWNsYXNzZXMuZGV4LgorCitlbmRpZiAgIyBMT0NBTF9ERVhfUFJFT1BUCiAKIGJ1aWx0X29kZXggOj0KIGJ1aWx0X3ZkZXggOj0KQEAgLTExMiw4ICsxMzksMTAgQEAKIAkJLS1kZXgtbG9jYXRpb249JChQUklWQVRFX0RFWF9MT0NBVElPTikgXAogCQktLXJlZmVyZW5jZS1wcm9maWxlLWZpbGU9JEAKIGRleF9wcmVvcHRfcHJvZmlsZV9zcmNfZmlsZTo9Ci0jIFJlbW92ZSBjb21wcmVzc2VkIEFQSyAgZXh0ZW5zaW9uLgorCisjIFJlbW92ZSBjb21wcmVzc2VkIEFQSyBleHRlbnNpb24uCiBteV9pbnN0YWxsZWRfcHJvZmlsZSA6PSAkKHBhdHN1YnN0ICUuZ3osJSwkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpKS5wcm9mCisKICMgbXlfaW5zdGFsbGVkX3Byb2ZpbGUgOj0gJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKS5wcm9mCiAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChteV9idWlsdF9wcm9maWxlKSwkKG15X2luc3RhbGxlZF9wcm9maWxlKSkpCiBidWlsZF9pbnN0YWxsZWRfcHJvZmlsZTo9JChteV9idWlsdF9wcm9maWxlKTokKG15X2luc3RhbGxlZF9wcm9maWxlKQpAQCAtMTI1LDYgKzE1NCwxMiBAQAogaWZkZWYgTE9DQUxfREVYX1BSRU9QVAogCiBkZXhwcmVvcHRfYm9vdF9qYXJfbW9kdWxlIDo9ICQoZmlsdGVyICQoREVYUFJFT1BUX0JPT1RfSkFSU19NT0RVTEVTKSwkKExPQ0FMX01PRFVMRSkpCisKKyMgRmlsdGVyIG9yZy5hcGFjaGUuaHR0cC5sZWdhY3kuYm9vdC4KK2lmZXEgKCQoZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZSksb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290KQorZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZSA6PQorZW5kaWYKKwogaWZkZWYgZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZQogIyBGb3IgbGliYXJ0LCB0aGUgYm9vdCBqYXJzJyBvZGV4IGZpbGVzIGFyZSByZXBsYWNlZCBieSAkKERFRkFVTFRfREVYX1BSRU9QVF9JTlNUQUxMRURfSU1BR0UpLgogIyBXZSB1c2UgdGhpcyBpbnN0YWxsZWRfb2RleCB0cmljayB0byBnZXQgYm9vdC5hcnQgaW5zdGFsbGVkLgpAQCAtMTk3LDYgKzIzMiwxMiBAQAogbXlfc3lzdGVtX3NlcnZlcl9jb21waWxlcl9maWx0ZXIgOj0gc3BlZWQKIGVuZGlmCiAKK215X2RlZmF1bHRfY29tcGlsZXJfZmlsdGVyIDo9ICQoUFJPRFVDVF9ERVhfUFJFT1BUX0RFRkFVTFRfQ09NUElMRVJfRklMVEVSKQoraWZlcSAoLCQobXlfZGVmYXVsdF9jb21waWxlcl9maWx0ZXIpKQorIyBJZiBubyBkZWZhdWx0IGNvbXBpbGVyIGZpbHRlciBpcyBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gJ3F1aWNrZW4nIHRvIHNhdmUgb24gc3RvcmFnZS4KK215X2RlZmF1bHRfY29tcGlsZXJfZmlsdGVyIDo9IHF1aWNrZW4KK2VuZGlmCisKIGlmZXEgKCwkKGZpbHRlciAtLWNvbXBpbGVyLWZpbHRlcj0lLCAkKExPQ0FMX0RFWF9QUkVPUFRfRkxBR1MpKSkKICAgaWZuZXEgKCwkKGZpbHRlciAkKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTKSwkKExPQ0FMX01PRFVMRSkpKQogICAgICMgSmFycyBvZiBzeXN0ZW0gc2VydmVyLCB1c2UgdGhlIHByb2R1Y3Qgb3B0aW9uIGlmIGl0IGlzIHNldCwgc3BlZWQgb3RoZXJ3aXNlLgpAQCAtMjExLDEzICsyNTIsMzkgQEAKICAgICAgICAgIyBGb3Igbm9uIHN5c3RlbSBzZXJ2ZXIgamFycywgdXNlIHNwZWVkLXByb2ZpbGUgd2hlbiB3ZSBoYXZlIGEgcHJvZmlsZS4KICAgICAgICAgTE9DQUxfREVYX1BSRU9QVF9GTEFHUyArPSAtLWNvbXBpbGVyLWZpbHRlcj1zcGVlZC1wcm9maWxlCiAgICAgICBlbHNlCi0gICAgICAgICMgSWYgbm8gY29tcGlsZXIgZmlsdGVyIGlzIHNwZWNpZmllZCwgZGVmYXVsdCB0byAncXVpY2tlbicgdG8gc2F2ZSBvbiBzdG9yYWdlLgotICAgICAgICBMT0NBTF9ERVhfUFJFT1BUX0ZMQUdTICs9IC0tY29tcGlsZXItZmlsdGVyPXF1aWNrZW4KKyAgICAgICAgTE9DQUxfREVYX1BSRU9QVF9GTEFHUyArPSAtLWNvbXBpbGVyLWZpbHRlcj0kKG15X2RlZmF1bHRfY29tcGlsZXJfZmlsdGVyKQogICAgICAgZW5kaWYKICAgICBlbmRpZgogICBlbmRpZgogZW5kaWYKIAorbXlfZ2VuZXJhdGVfZG0gOj0gJChQUk9EVUNUX0RFWF9QUkVPUFRfR0VORVJBVEVfRE1fRklMRVMpCitpZmVxICgsJChmaWx0ZXIgJChMT0NBTF9ERVhfUFJFT1BUX0ZMQUdTKSwtLWNvbXBpbGVyLWZpbHRlcj12ZXJpZnkpKQorIyBHZW5lcmF0aW5nIERNIGZpbGVzIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHZlcmlmeSwgYXZvaWQgZG9pbmcgZm9yIG5vbiB2ZXJpZnkgY29tcGlsZXIgZmlsdGVyIEFQS3MuCitteV9nZW5lcmF0ZV9kbSA6PSBmYWxzZQorZW5kaWYKKworIyBObyByZWFzb24gdG8gdXNlIGEgZG0gZmlsZSBpZiB0aGUgZGV4IGlzIGFscmVhZHkgdW5jb21wcmVzc2VkLgoraWZlcSAoJChMT0NBTF9VTkNPTVBSRVNTX0RFWCksdHJ1ZSkKK215X2dlbmVyYXRlX2RtIDo9IGZhbHNlCitlbmRpZgorCitpZmVxICh0cnVlLCQobXlfZ2VuZXJhdGVfZG0pKQorTE9DQUxfREVYX1BSRU9QVF9GTEFHUyArPSAtLWNvcHktZGV4LWZpbGVzPWZhbHNlCitMT0NBTF9ERVhfUFJFT1BUIDo9IG5vc3RyaXBwaW5nCitteV9idWlsdF9kbSA6PSAkKGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpZ2VuZXJhdGVkLmRtCitteV9pbnN0YWxsZWRfZG0gOj0gJChwYXRzdWJzdCAlLmFwaywlLCQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkpLmRtCitteV9jb3BpZWRfdmRleCA6PSAkKGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpcHJpbWFyeS52ZGV4CiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChidWlsdF92ZGV4KSwkKG15X2NvcGllZF92ZGV4KSkpCiskKG15X2J1aWx0X2RtKTogUFJJVkFURV9JTlBVVF9WREVYIDo9ICQobXlfY29waWVkX3ZkZXgpCiskKG15X2J1aWx0X2RtKTogJChteV9jb3BpZWRfdmRleCkgJChaSVBUSU1FKQorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBybSAtZiAkQAorCSQoaGlkZSkgemlwIC1xRCAtaiAtWCAtOSAkQCAkKFBSSVZBVEVfSU5QVVRfVkRFWCkKKwkkKFpJUFRJTUUpICRACiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChteV9idWlsdF9kbSksJChteV9pbnN0YWxsZWRfZG0pKSkKK2VuZGlmCisKICMgUFJPRFVDVF9TWVNURU1fU0VSVkVSX0RFQlVHX0lORk8gb3ZlcnJpZGVzIFdJVEhfREVYUFJFT1BUX0RFQlVHX0lORk8uCiBteV9zeXN0ZW1fc2VydmVyX2RlYnVnX2luZm8gOj0gJChQUk9EVUNUX1NZU1RFTV9TRVJWRVJfREVCVUdfSU5GTykKIGlmZXEgKCwkKGZpbHRlciBlbmcsICQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKQEAgLTIzMywxOSArMzAwLDM1IEBACiAgIGVuZGlmCiBlbmRpZgogCisjIFNldCB0aGUgY29tcGlsZXIgcmVhc29uIHRvICdwcmVidWlsdCcgdG8gaWRlbnRpZnkgdGhlIG9hdCBmaWxlcyBwcm9kdWNlZAorIyBkdXJpbmcgdGhlIGJ1aWxkLCBhcyBvcHBvc2VkIHRvIGNvbXBpbGVkIG9uIHRoZSBkZXZpY2UuCitMT0NBTF9ERVhfUFJFT1BUX0ZMQUdTICs9IC0tY29tcGlsYXRpb24tcmVhc29uPXByZWJ1aWx0CisKICQoYnVpbHRfb2RleCk6IFBSSVZBVEVfREVYX1BSRU9QVF9GTEFHUyA6PSAkKExPQ0FMX0RFWF9QUkVPUFRfRkxBR1MpCiAkKGJ1aWx0X3ZkZXgpOiAkKGJ1aWx0X29kZXgpCiAkKGJ1aWx0X2FydCk6ICQoYnVpbHRfb2RleCkKIGVuZGlmCiAKLSMgQWRkIHRoZSBpbnN0YWxsZWRfb2RleCB0byB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMgZm9yIHRoaXMgbW9kdWxlLgotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5JTlNUQUxMRUQgKz0gJChpbnN0YWxsZWRfb2RleCkKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoaW5zdGFsbGVkX3ZkZXgpCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOU1RBTExFRCArPSAkKGluc3RhbGxlZF9hcnQpCitpZm5lcSAodHJ1ZSwkKG15X2dlbmVyYXRlX2RtKSkKKyAgIyBBZGQgdGhlIGluc3RhbGxlZF9vZGV4IHRvIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyBmb3IgdGhpcyBtb2R1bGUgaWYgd2UgYXJlbid0IGdlbmVyYXRpbmcgYQorICAjIGRtIGZpbGUuCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoaW5zdGFsbGVkX29kZXgpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoaW5zdGFsbGVkX3ZkZXgpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQoaW5zdGFsbGVkX2FydCkKIAotQUxMX01PRFVMRVMuJChteV9yZWdpc3Rlcl9uYW1lKS5CVUlMVF9JTlNUQUxMRUQgKz0gJChidWlsdF9pbnN0YWxsZWRfb2RleCkKLUFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFRfSU5TVEFMTEVEICs9ICQoYnVpbHRfaW5zdGFsbGVkX3ZkZXgpCi1BTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkJVSUxUX0lOU1RBTExFRCArPSAkKGJ1aWx0X2luc3RhbGxlZF9hcnQpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFRfSU5TVEFMTEVEICs9ICQoYnVpbHRfaW5zdGFsbGVkX29kZXgpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFRfSU5TVEFMTEVEICs9ICQoYnVpbHRfaW5zdGFsbGVkX3ZkZXgpCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuQlVJTFRfSU5TVEFMTEVEICs9ICQoYnVpbHRfaW5zdGFsbGVkX2FydCkKKworICAjIE1ha2Ugc3VyZSB0byBpbnN0YWxsIHRoZSAub2RleCBhbmQgLnZkZXggd2hlbiB5b3UgcnVuICJtYWtlIDxtb2R1bGVfbmFtZT4iCisgICQobXlfYWxsX3RhcmdldHMpOiAkKGluc3RhbGxlZF9vZGV4KSAkKGluc3RhbGxlZF92ZGV4KSAkKGluc3RhbGxlZF9hcnQpCitlbHNlCisgIEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5TVEFMTEVEICs9ICQobXlfaW5zdGFsbGVkX2RtKQorICBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLkJVSUxUX0lOU1RBTExFRCArPSAkKG15X2J1aWx0X2RtKSAkKG15X2luc3RhbGxlZF9kbSkKKworICAjIE1ha2Ugc3VyZSB0byBpbnN0YWxsIHRoZSAuZG0gd2hlbiB5b3UgcnVuICJtYWtlIDxtb2R1bGVfbmFtZT4iCisgICQobXlfYWxsX3RhcmdldHMpOiAkKGluc3RhbGxlZF9kbSkKK2VuZGlmCiAKICMgUmVjb3JkIGRleC1wcmVvcHQgY29uZmlnLgogREVYUFJFT1BULiQoTE9DQUxfTU9EVUxFKS5ERVhfUFJFT1BUIDo9ICQoTE9DQUxfREVYX1BSRU9QVCkKQEAgLTI1OSwxMCArMzQyLDYgQEAKIERFWFBSRU9QVC5NT0RVTEVTLiQoTE9DQUxfTU9EVUxFX0NMQVNTKSA6PSAkKHNvcnQgXAogICAkKERFWFBSRU9QVC5NT0RVTEVTLiQoTE9DQUxfTU9EVUxFX0NMQVNTKSkgJChMT0NBTF9NT0RVTEUpKQogCi0KLSMgTWFrZSBzdXJlIHRvIGluc3RhbGwgdGhlIC5vZGV4IGFuZCAudmRleCB3aGVuIHlvdSBydW4gIm1ha2UgPG1vZHVsZV9uYW1lPiIKLSQobXlfYWxsX3RhcmdldHMpOiAkKGluc3RhbGxlZF9vZGV4KSAkKGluc3RhbGxlZF92ZGV4KSAkKGluc3RhbGxlZF9hcnQpCi0KIGVuZGlmICMgTE9DQUxfREVYX1BSRU9QVAogCiAjIFByb2ZpbGUgZG9lc24ndCBkZXBlbmQgb24gTE9DQUxfREVYX1BSRU9QVC4KZGlmZiAtLWdpdCBhL2NvcmUvZGlzdGRpci5tayBiL2NvcmUvZGlzdGRpci5tawppbmRleCA4OWM1OTY2Li5jMDc0MTg2IDEwMDY0NAotLS0gYS9jb3JlL2Rpc3RkaXIubWsKKysrIGIvY29yZS9kaXN0ZGlyLm1rCkBAIC0xNyw5ICsxNyw2IEBACiAjIFdoZW4gc3BlY2lmeWluZyAiZGlzdCIsIHRoZSB1c2VyIGhhcyBhc2tlZCB0aGF0IHdlIGNvcHkgdGhlIGltcG9ydGFudAogIyBmaWxlcyBmcm9tIHRoaXMgYnVpbGQgaW50byBESVNUX0RJUi4KIAotZGlzdF9nb2FsIDo9ICQoc3RyaXAgJChmaWx0ZXIgZGlzdCwkKE1BS0VDTURHT0FMUykpKQotTUFLRUNNREdPQUxTIDo9ICQoc3RyaXAgJChmaWx0ZXItb3V0IGRpc3QsJChNQUtFQ01ER09BTFMpKSkKLQogaWZkZWYgZGlzdF9nb2FsCiAKICMgJCgxKTogc291cmNlIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvZHBpX3NwZWNpZmljX2Fway5tayBiL2NvcmUvZHBpX3NwZWNpZmljX2Fway5tawppbmRleCAxYjBiZTA3Li5mMzJkYWY1IDEwMDY0NAotLS0gYS9jb3JlL2RwaV9zcGVjaWZpY19hcGsubWsKKysrIGIvY29yZS9kcGlfc3BlY2lmaWNfYXBrLm1rCkBAIC05LDcgKzksNyBAQAogCiAjIFNldCB1cCBhbGwgdGhlIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZXMuCiAkKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX01PRFVMRSA6PSAkKGRwaV9hcGtfbmFtZSkKLSQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAkKExPQ0FMX0FBUFRfRkxBR1MpICQoUFJPRFVDVF9BQVBUX0ZMQUdTKSAkKCQoTE9DQUxfUEFDS0FHRV9OQU1FKV9hYXB0X2ZsYWdzXyQobXlfZHBpKSkKKyQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAkKExPQ0FMX0FBUFRfRkxBR1MpIC0tcHNldWRvLWxvY2FsaXplICQoJChMT0NBTF9QQUNLQUdFX05BTUUpX2FhcHRfZmxhZ3NfJChteV9kcGkpKQogIyBDbGVhciBQUklWQVRFX1BST0RVQ1RfQUFQVF9DT05GSUcgdG8gaW5jbHVkZSBldmVyeXRoaW5nIGJ5IGRlZmF1bHQuCiAkKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX1BST0RVQ1RfQUFQVF9DT05GSUcgOj0KICQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfUFJPRFVDVF9BQVBUX1BSRUZfQ09ORklHIDo9ICQobXlfZHBpKQpAQCAtMTcsOCArMTcsOSBAQAogJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9SRVNPVVJDRV9ESVIpCiAkKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX0FTU0VUX0RJUiA6PSAkKExPQ0FMX0FTU0VUX0RJUikKICQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfQUFQVF9JTkNMVURFUyA6PSAkKGFsbF9saWJyYXJ5X3Jlc19wYWNrYWdlX2V4cG9ydHMpCi1pZm5lcSAoLCQoZmlsdGVyLW91dCBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikpKQotJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQoTE9DQUxfU0RLX1ZFUlNJT04pCiskKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX1JFU09VUkNFX0xJU1QgOj0gJChhbGxfcmVzX2Fzc2V0cykKK2lmbmVxICgsJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50IGNvcmVfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikpKQorJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQoY2FsbCBnZXQtbnVtZXJpYy1zZGstdmVyc2lvbiwkKExPQ0FMX1NES19WRVJTSU9OKSkKIGVsc2UKICQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfREVGQVVMVF9BUFBfVEFSR0VUX1NESyA6PSAkKERFRkFVTFRfQVBQX1RBUkdFVF9TREspCiBlbmRpZgpAQCAtMzQsMTIgKzM1LDggQEAKICQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfU09VUkNFX0FSQ0hJVkUgOj0KIGlmbmVxICgkKGZ1bGxfY2xhc3Nlc19qYXIpLCkKICQoYnVpbHRfZHBpX2Fwayk6IFBSSVZBVEVfREVYX0ZJTEUgOj0gJChidWlsdF9kZXgpCi1pZm5kZWYgTE9DQUxfSkFDS19FTkFCTEVECiAjIFVzZSB0aGUgamFyamFyIHByb2Nlc3NlZCBhcmhpdmUgYXMgdGhlIGluaXRpYWwgcGFja2FnZSBmaWxlLgogJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9TT1VSQ0VfQVJDSElWRSA6PSAkKGZ1bGxfY2xhc3Nlc19wcmVfcHJvZ3VhcmRfamFyKQotZWxzZQotJChidWlsdF9kcGlfYXBrKTogUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY2stcnNjCi1lbmRpZiAjIExPQ0FMX0pBQ0tfRU5BQkxFRAogJChidWlsdF9kcGlfYXBrKTogJChidWlsdF9kZXgpCiBlbHNlCiAkKGJ1aWx0X2RwaV9hcGspOiBQUklWQVRFX0RFWF9GSUxFIDo9CkBAIC02NCw5ICs2MSw2IEBACiAJJChpZiAkKFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MpLCQoY2FsbCBhZGQtamF2YS1yZXNvdXJjZXMtdG8sJEApKQogZWxzZQogCSQoYWRkLWRleC10by1wYWNrYWdlKQotaWZkZWYgTE9DQUxfSkFDS19FTkFCTEVECi0JJChhZGQtY2FycmllZC1qYWNrLXJlc291cmNlcykKLWVuZGlmCiBlbmRpZgogCSQoc2lnbi1wYWNrYWdlKQogCmRpZmYgLS1naXQgYS9jb3JlL2Ryb2lkZG9jLm1rIGIvY29yZS9kcm9pZGRvYy5tawppbmRleCA5NGUyODJkLi44MTE1NDgxIDEwMDY0NAotLS0gYS9jb3JlL2Ryb2lkZG9jLm1rCisrKyBiL2NvcmUvZHJvaWRkb2MubWsKQEAgLTU3LDcgKzU3LDYgQEAKICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0KIGZ1bGxfamF2YV9saWJzIDo9ICQoYWRkcHJlZml4ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpLyxcCiAgICQoYWRkc3VmZml4ICQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKSkKLWZ1bGxfamF2YV9saWJfZGVwcyA6PSAkKGZ1bGxfamF2YV9saWJzKQogCiBlbHNlCiAKQEAgLTcyLDMwICs3MSw0MyBAQAogICBlbHNlIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUyksdGVzdF9jdXJyZW50KQogICAgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWRfdGVzdF9zdHVic19jdXJyZW50ICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCiAgICAgJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsIGFuZHJvaWRfdGVzdF9zdHVic19jdXJyZW50KQorICBlbHNlIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUyksY29yZV9jdXJyZW50KQorICAgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUuY3VycmVudC5zdHVicyAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQorICAgICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCBjb3JlLmN1cnJlbnQuc3R1YnMpCiAgIGVsc2UKLSAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBzZGtfdiQoTE9DQUxfU0RLX1ZFUlNJT04pICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCi0gICAgJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsIHNka192JChMT0NBTF9TREtfVkVSU0lPTikpCisgICAgIyBjb3JlXzx2ZXI+IGlzIHN1YnNldCBvZiA8dmVyPi4gSW5zdGVhZCBvZiBkZWZpbmluZyBhIHByZWJ1aWx0IGxpYiBmb3IgY29yZV88dmVyPiwKKyAgICAjIHVzZSB0aGUgc3R1YiBmb3IgPHZlcj4gd2hlbiBidWlsZGluZyBmb3IgYXBwcy4KKyAgICBfdmVyc2lvbiA6PSAkKHBhdHN1YnN0IGNvcmVfJSwlLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQorICAgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IHNka192JChfdmVyc2lvbikgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKKyAgICAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9CT09UQ0xBU1NQQVRIIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywgc2RrX3YkKF92ZXJzaW9uKSkKKyAgICBfdmVyc2lvbiA6PQogICBlbmRpZgogZWxzZQotICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBjb3JlLW9qIGNvcmUtbGliYXJ0IGV4dCBmcmFtZXdvcmsgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKKyAgaWZlcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCisgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZS1vaiBjb3JlLWxpYmFydAorICBlbHNlCisgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gY29yZS1vaiBjb3JlLWxpYmFydCBleHQgZnJhbWV3b3JrICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCisgIGVuZGlmCiAgICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCBjb3JlLW9qKTokKGNhbGwgamF2YS1saWItZmlsZXMsIGNvcmUtbGliYXJ0KQogZW5kaWYgICMgTE9DQUxfU0RLX1ZFUlNJT04KIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9ICQoc29ydCAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSkKIAogZnVsbF9qYXZhX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKSAkKExPQ0FMX0NMQVNTUEFUSCkKLWZ1bGxfamF2YV9saWJfZGVwcyA6PSAkKGNhbGwgamF2YS1saWItZGVwcywkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSkgJChMT0NBTF9DTEFTU1BBVEgpCiBlbmRpZiAjICFMT0NBTF9JU19IT1NUX01PRFVMRQogCi0kKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9DTEFTU1BBVEggOj0gJChzdWJzdCAkKHNwYWNlKSw6LCQoZnVsbF9qYXZhX2xpYnMpKQotCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9DTEFTU1BBVEggOj0gJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChmdWxsX2phdmFfbGlicykpCiAKIGludGVybWVkaWF0ZXMuQ09NTU9OIDo9ICQoY2FsbCBsb2NhbC1pbnRlcm1lZGlhdGVzLWRpcixDT01NT04pCiAKICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX1NPVVJDRV9QQVRIIDo9ICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoTE9DQUxfRFJPSURET0NfU09VUkNFX1BBVEgpKQogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfSkFWQV9GSUxFUyA6PSAkKGZpbHRlciAlLmphdmEsJChmdWxsX3NyY19maWxlcykpCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9KQVZBX0ZJTEVTICs9ICQoYWRkcHJlZml4ICQoJChteV9wcmVmaXgpT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS8sICQoZmlsdGVyICUuamF2YSwkKExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VTKSkpCiskKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9KQVZBX0ZJTEVTICs9ICQoZmlsdGVyICUuamF2YSwkKExPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTKSkKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX1NSQ0pBUlMgOj0gJChMT0NBTF9TUkNKQVJTKQogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyYworJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU1JDSkFSX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyY2phcnMKICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX1NSQ19MSVNUX0ZJTEUgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZHJvaWRkb2Mtc3JjLWxpc3QKKyQoZnVsbF90YXJnZXQpOiBQUklWQVRFX1NSQ0pBUl9MSVNUX0ZJTEUgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZHJvaWRkb2Mtc3JjamFyLWxpc3QKIAogaWZuZXEgKCQoc3RyaXAgJChMT0NBTF9BRERJVElPTkFMX0pBVkFfRElSKSksKQogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQURESVRJT05BTF9KQVZBX0RJUiA6PSAkKExPQ0FMX0FERElUSU9OQUxfSkFWQV9ESVIpCkBAIC0xNzIsMjEgKzE4NCwyNiBAQAogIyBrZWVwIC1ib290Y2xhc3NwYXRoIGhlcmUgc2luY2UgaXQgd29ya3MgaW4gY29tYmluYXRpb24gd2l0aCAtc291cmNlIDEuOC4KICQoZnVsbF90YXJnZXQpOiBcCiAgICAgICAgICQoZnVsbF9zcmNfZmlsZXMpIFwKKyAgICAgICAgJChMT0NBTF9HRU5FUkFURURfU09VUkNFUykgXAogICAgICAgICAkKGRyb2lkZG9jX3RlbXBsYXRlcykgXAogICAgICAgICAkKGRyb2lkZG9jKSBcCiAgICAgICAgICQoaHRtbF9kaXJfZmlsZXMpIFwKLSAgICAgICAgJChmdWxsX2phdmFfbGliX2RlcHMpIFwKKyAgICAgICAgJChmdWxsX2phdmFfbGlicykgXAorICAgICAgICAkKEVYVFJBQ1RfU1JDSkFSUykgXAorICAgICAgICAkKExPQ0FMX1NSQ0pBUlMpIFwKICAgICAgICAgJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykKIAlAZWNobyBEb2NzIGRyb2lkZG9jOiAkKFBSSVZBVEVfT1VUX0RJUikKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotCSQoYWRkcHJlZml4ICQoaGlkZSkgcm0gLXJmICwkKFBSSVZBVEVfU1RVQl9PVVRfRElSKSkKKwkkKGhpZGUpIHJtIC1yZiAkKFBSSVZBVEVfU1RVQl9PVVRfRElSKSAkKFBSSVZBVEVfU1JDSkFSX0lOVEVSTUVESUFURVNfRElSKQogCSQoY2FsbCBwcmVwYXJlLWRvYy1zb3VyY2UtbGlzdCwkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSksJChQUklWQVRFX0pBVkFfRklMRVMpLCBcCiAJCQkkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAkKFBSSVZBVEVfQURESVRJT05BTF9KQVZBX0RJUikpCisJJChFWFRSQUNUX1NSQ0pBUlMpICQoUFJJVkFURV9TUkNKQVJfSU5URVJNRURJQVRFU19ESVIpICQoUFJJVkFURV9TUkNKQVJfTElTVF9GSUxFKSAkKFBSSVZBVEVfU1JDSkFSUykKIAkkKGhpZGUpICggXAogCQkkKEpBVkFET0MpIFwKICAgICAgICAgICAgICAgICAtZW5jb2RpbmcgVVRGLTggXAogICAgICAgICAgICAgICAgIC1zb3VyY2UgMS44IFwKICAgICAgICAgICAgICAgICBcQCQoUFJJVkFURV9TUkNfTElTVF9GSUxFKSBcCisgICAgICAgICAgICAgICAgXEAkKFBSSVZBVEVfU1JDSkFSX0xJU1RfRklMRSkgXAogICAgICAgICAgICAgICAgIC1KLVhteDE2MDBtIFwKICAgICAgICAgICAgICAgICAtSi1YWDotT21pdFN0YWNrVHJhY2VJbkZhc3RUaHJvdyBcCiAgICAgICAgICAgICAgICAgLVhEaWdub3JlLnN5bWJvbC5maWxlIFwKQEAgLTIxNiw3ICsyMzMsNyBAQAogIyMKICMjCiAKLWlmbmVxICgkKEVYUEVSSU1FTlRBTF9VU0VfT1BFTkpESzkpLCkKK2lmZGVmIFVTRV9PUEVOSkRLOQogIyBGb3IgT3BlbkpESyA5IHdlIHVzZSAtLXBhdGNoLW1vZHVsZSB0byBkZWZpbmUgdGhlIGNvcmUgbGlicmFyaWVzIGNvZGUuCiAjIFRPRE8odG9iaWFzdCk6IFJlb3JnYW5pemUgdGhpcyB3aGVuIGFkZGluZyBwcm9wZXIgc3VwcG9ydCBmb3IgT3BlbkpESyA5CiAjIG1vZHVsZXMuIEhlcmUgd2UgdHJlYXQgYWxsIGNvZGUgaW4gY29yZSBsaWJyYXJpZXMgYXMgYmVpbmcgaW4gamF2YS5iYXNlCkBAIC0yMjYsMTcgKzI0MywxOSBAQAogIyBGb3IgT3BlbkpESyA4IHdlIGNhbiB1c2UgLWJvb3RjbGFzc3BhdGggdG8gZGVmaW5lIHRoZSBjb3JlIGxpYnJhcmllcyBjb2RlLgogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfQk9PVENMQVNTUEFUSF9BUkcgOj0gJChhZGRwcmVmaXggLWJvb3RjbGFzc3BhdGggLCQoUFJJVkFURV9CT09UQ0xBU1NQQVRIKSkKIGVuZGlmCi0KLSQoZnVsbF90YXJnZXQpOiAkKGZ1bGxfc3JjX2ZpbGVzKSAkKGZ1bGxfamF2YV9saWJfZGVwcykKKyQoZnVsbF90YXJnZXQpOiAkKGZ1bGxfc3JjX2ZpbGVzKSAkKExPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTKSAkKGZ1bGxfamF2YV9saWJzKSAkKEVYVFJBQ1RfU1JDSkFSUykgJChMT0NBTF9TUkNKQVJTKSAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQogCUBlY2hvIERvY3MgamF2YWRvYzogJChQUklWQVRFX09VVF9ESVIpCiAJQG1rZGlyIC1wICQoZGlyICRAKQorCXJtIC1yZiAkKFBSSVZBVEVfU1JDSkFSX0lOVEVSTUVESUFURVNfRElSKQogCSQoY2FsbCBwcmVwYXJlLWRvYy1zb3VyY2UtbGlzdCwkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSksJChQUklWQVRFX0pBVkFfRklMRVMpLCBcCiAJCQkkKFBSSVZBVEVfU09VUkNFX0lOVEVSTUVESUFURVNfRElSKSAkKFBSSVZBVEVfQURESVRJT05BTF9KQVZBX0RJUikpCisJJChFWFRSQUNUX1NSQ0pBUlMpICQoUFJJVkFURV9TUkNKQVJfSU5URVJNRURJQVRFU19ESVIpICQoUFJJVkFURV9TUkNKQVJfTElTVF9GSUxFKSAkKFBSSVZBVEVfU1JDSkFSUykKIAkkKGhpZGUpICggXAogCQkkKEpBVkFET0MpIFwKICAgICAgICAgICAgICAgICAtZW5jb2RpbmcgVVRGLTggXAogICAgICAgICAgICAgICAgICQoUFJJVkFURV9EUk9JRERPQ19PUFRJT05TKSBcCiAgICAgICAgICAgICAgICAgXEAkKFBSSVZBVEVfU1JDX0xJU1RfRklMRSkgXAorICAgICAgICAgICAgICAgIFxAJChQUklWQVRFX1NSQ0pBUl9MSVNUX0ZJTEUpIFwKICAgICAgICAgICAgICAgICAtSi1YbXgxMDI0bSBcCiAgICAgICAgICAgICAgICAgLVhEaWdub3JlLnN5bWJvbC5maWxlIFwKICAgICAgICAgICAgICAgICAtWGRvY2xpbnQ6bm9uZSBcCmRpZmYgLS1naXQgYS9jb3JlL2R1bXB2YXIubWsgYi9jb3JlL2R1bXB2YXIubWsKaW5kZXggYWNhZTQ4ZS4uNTllZmIwNCAxMDA2NDQKLS0tIGEvY29yZS9kdW1wdmFyLm1rCisrKyBiL2NvcmUvZHVtcHZhci5tawpAQCAtMSwzNyArMSwzIEBACi0KLSMgTGlzdCBvZiB2YXJpYWJsZXMgd2Ugd2FudCB0byBwcmludCBpbiB0aGUgYnVpbGQgYmFubmVyLgotcHJpbnRfYnVpbGRfY29uZmlnX3ZhcnMgOj0gXAotICBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIFwKLSAgUExBVEZPUk1fVkVSU0lPTiBcCi0gIFRBUkdFVF9QUk9EVUNUIFwKLSAgVEFSR0VUX0JVSUxEX1ZBUklBTlQgXAotICBUQVJHRVRfQlVJTERfVFlQRSBcCi0gIFRBUkdFVF9QTEFURk9STV9WRVJTSU9OIFwKLSAgVEFSR0VUX0JVSUxEX0FQUFMgXAotICBUQVJHRVRfQVJDSCBcCi0gIFRBUkdFVF9BUkNIX1ZBUklBTlQgXAotICBUQVJHRVRfQ1BVX1ZBUklBTlQgXAotICBUQVJHRVRfMk5EX0FSQ0ggXAotICBUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCBcCi0gIFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgXAotICBIT1NUX0FSQ0ggXAotICBIT1NUXzJORF9BUkNIIFwKLSAgSE9TVF9PUyBcCi0gIEhPU1RfT1NfRVhUUkEgXAotICBIT1NUX0NST1NTX09TIFwKLSAgSE9TVF9DUk9TU19BUkNIIFwKLSAgSE9TVF9DUk9TU18yTkRfQVJDSCBcCi0gIEhPU1RfQlVJTERfVFlQRSBcCi0gIEJVSUxEX0lEIFwKLSAgT1VUX0RJUiBcCi0gIEFVWF9PU19WQVJJQU5UX0xJU1QKLQotaWZlcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKQotcHJpbnRfYnVpbGRfY29uZmlnX3ZhcnMgKz0gXAotICBUQVJHRVRfQlVJTERfUERLIFwKLSAgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKLWVuZGlmCi0KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHRoZSBzZXRwYXRoIHNoZWxsIGZ1bmN0aW9uIGluIGVudnNldHVwLnNoIHVzZXMgdGhpcyB0byBmaWd1cmUgb3V0CiAjIHdoYXQgdG8gYWRkIHRvIHRoZSBwYXRoIGdpdmVuIHRoZSBjb25maWcgd2UgaGF2ZSBjaG9zZW4uCkBAIC01Miw3OSArMTgsMTQgQEAKIEFORFJPSURfUFJFQlVJTFRTIDo9IHByZWJ1aWx0LyQoSE9TVF9QUkVCVUlMVF9UQUcpCiBBTkRST0lEX0dDQ19QUkVCVUlMVFMgOj0gcHJlYnVpbHRzL2djYy8kKEhPU1RfUFJFQlVJTFRfVEFHKQogCi0jIFRoZSAiZHVtcHZhciIgc3R1ZmYgbGV0cyB5b3Ugc2F5IHNvbWV0aGluZyBsaWtlCi0jCi0jICAgICBDQUxMRURfRlJPTV9TRVRVUD10cnVlIFwKLSMgICAgICAgbWFrZSAtZiBjb25maWcvZW52c2V0dXAubWFrZSBkdW1wdmFyLVRBUkdFVF9PVVQKLSMgb3IKLSMgICAgIENBTExFRF9GUk9NX1NFVFVQPXRydWUgXAotIyAgICAgICBtYWtlIC1mIGNvbmZpZy9lbnZzZXR1cC5tYWtlIGR1bXB2YXItYWJzLUhPU1RfT1VUX0VYRUNVVEFCTEVTCi0jCi0jIFRoZSBwbGFpbiAobm9uLWFicykgdmVyc2lvbiBqdXN0IGR1bXBzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgdmFyaWFibGUuCi0jIFRoZSAiYWJzIiB2ZXJzaW9uIHdpbGwgdHJlYXQgdGhlIHZhcmlhYmxlIGFzIGEgcGF0aCwgYW5kIGR1bXBzIGFuCi0jIGFic29sdXRlIHBhdGggdG8gaXQuCi0jCi1kdW1wdmFyX2dvYWxzIDo9IFwKLQkkKHN0cmlwICQocGF0c3Vic3QgZHVtcHZhci0lLCUsJChmaWx0ZXIgZHVtcHZhci0lLCQoTUFLRUNNREdPQUxTKSkpKQotaWZkZWYgZHVtcHZhcl9nb2FscwotCi0gIGlmbmVxICgkKHdvcmRzICQoZHVtcHZhcl9nb2FscykpLDEpCi0gICAgJChlcnJvciBPbmx5IG9uZSAiZHVtcHZhci0iIGdvYWwgYWxsb3dlZC4gU2F3ICIkKE1BS0VDTURHT0FMUykiKQotICBlbmRpZgotCi0gICMgSWYgdGhlIGdvYWwgaXMgb2YgdGhlIGZvcm0gImR1bXB2YXItYWJzLVZBUk5BTUUiLCB0aGVuCi0gICMgdHJlYXQgVkFSTkFNRSBhcyBhIHBhdGggYW5kIHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCB0byBpdC4KLSAgYWJzb2x1dGVfZHVtcHZhciA6PSAkKHN0cmlwICQoZmlsdGVyIGFicy0lLCQoZHVtcHZhcl9nb2FscykpKQotICBpZmRlZiBhYnNvbHV0ZV9kdW1wdmFyCi0gICAgZHVtcHZhcl9nb2FscyA6PSAkKHBhdHN1YnN0IGFicy0lLCUsJChkdW1wdmFyX2dvYWxzKSkKLSAgICBEVU1QVkFSX1ZBTFVFIDo9ICQoYWJzcGF0aCAkKCQoZHVtcHZhcl9nb2FscykpKQotICAgIGR1bXB2YXJfdGFyZ2V0IDo9IGR1bXB2YXItYWJzLSQoZHVtcHZhcl9nb2FscykKLSAgZWxzZQotICAgIERVTVBWQVJfVkFMVUUgOj0gJCgkKGR1bXB2YXJfZ29hbHMpKQotICAgIGR1bXB2YXJfdGFyZ2V0IDo9IGR1bXB2YXItJChkdW1wdmFyX2dvYWxzKQotICBlbmRpZgotCi0uUEhPTlk6ICQoZHVtcHZhcl90YXJnZXQpCi0kKGR1bXB2YXJfdGFyZ2V0KToKLQlAZWNobyAkKERVTVBWQVJfVkFMVUUpCi0KLWVuZGlmICMgZHVtcHZhcl9nb2FscwotCi1pZm5lcSAoJChkdW1wdmFyX2dvYWxzKSxyZXBvcnRfY29uZmlnKQotUFJJTlRfQlVJTERfQ09ORklHOj0KLWVuZGlmCi0KLWlmbmVxICgkKGZpbHRlciByZXBvcnRfY29uZmlnLCQoRFVNUF9NQU5ZX1ZBUlMpKSwpCi0jIENvbnN0cnVjdCB0aGUgc2hlbGwgY29tbWFuZHMgdGhhdCBwcmludCB0aGUgY29uZmlnIGJhbm5lci4KLXJlcG9ydF9jb25maWdfc2ggOj0gZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nOwotcmVwb3J0X2NvbmZpZ19zaCArPSAkKGZvcmVhY2ggdiwkKHByaW50X2J1aWxkX2NvbmZpZ192YXJzKSxlY2hvICckdj0kKCQodikpJzspCi1yZXBvcnRfY29uZmlnX3NoICs9IGVjaG8gJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09JzsKLWVuZGlmCi0KICMgRHVtcCBtdWxpdHBsZSB2YXJpYWJsZXMgdG8gIjx2YXI+PTx2YWx1ZT4iIHBhaXJzLCBvbmUgcGVyIGxpbmUuCiAjIFRoZSBvdXRwdXQgbWF5IGJlIGV4ZWN1dGVkIGFzIGJhc2ggc2NyaXB0LgogIyBJbnB1dCB2YXJpYWJsZXM6CiAjICAgRFVNUF9NQU5ZX1ZBUlM6IHRoZSBsaXN0IG9mIHZhcmlhYmxlIG5hbWVzLgogIyAgIERVTVBfVkFSX1BSRUZJWDogYW4gb3B0aW9uYWwgcHJlZml4IG9mIHRoZSB2YXJpYWJsZSBuYW1lIGFkZGVkIHRvIHRoZSBvdXRwdXQuCi0jICAgRFVNUF9NQU5ZX0FCU19WQVJTOiB0aGUgbGlzdCBvZiBhYnMgdmFyaWFibGUgbmFtZXMuCi0jICAgRFVNUF9BQlNfVkFSX1BSRUZJWDogYW4gb3B0aW9uYWwgcHJlZml4IG9mIHRoZSBhYnMgdmFyaWFibGUgbmFtZSBhZGRlZCB0byB0aGUgb3V0cHV0LgogLlBIT05ZOiBkdW1wLW1hbnktdmFycwogZHVtcC1tYW55LXZhcnMgOgotCUAkKGZvcmVhY2ggdiwgJChmaWx0ZXItb3V0IHJlcG9ydF9jb25maWcsICQoRFVNUF9NQU5ZX1ZBUlMpKSxcCisJQCQoZm9yZWFjaCB2LCAkKERVTVBfTUFOWV9WQVJTKSxcCiAJICBlY2hvICIkKERVTVBfVkFSX1BSRUZJWCkkKHYpPSckKCQodikpJyI7KQotaWZuZXEgKCQoZmlsdGVyIHJlcG9ydF9jb25maWcsICQoRFVNUF9NQU5ZX1ZBUlMpKSwpCi0JQCMgQ29uc3RydWN0IGEgc3BlY2lhbCB2YXJpYWJsZSBmb3IgcmVwb3J0X2NvbmZpZy4KLQlAIyBFc2NhcGUgXGAgdG8gZGVmZXIgdGhlIGV4ZWN1dGlvbiBvZiByZXBvcnRfY29uZmlnX3NoIHRvIHByZXNlcnZlIHRoZSBsaW5lIGJyZWFrcy4KLQlAZWNobyAiJChEVU1QX1ZBUl9QUkVGSVgpcmVwb3J0X2NvbmZpZz1cYCQocmVwb3J0X2NvbmZpZ19zaClcYCIKLWVuZGlmCi0JQCQoZm9yZWFjaCB2LCAkKHNvcnQgJChEVU1QX01BTllfQUJTX1ZBUlMpKSxcCi0JICBlY2hvICIkKERVTVBfQUJTX1ZBUl9QUkVGSVgpJCh2KT0nJChhYnNwYXRoICQoJCh2KSkpJyI7KQogCiBlbmRpZiAjIENBTExFRF9GUk9NX1NFVFVQCi0KLWlmbmVxICgkKFBSSU5UX0JVSUxEX0NPTkZJRyksKQotJChpbmZvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KQotJChmb3JlYWNoIHYsICQocHJpbnRfYnVpbGRfY29uZmlnX3ZhcnMpLFwKLSAgJChpbmZvICR2PSQoJCh2KSkpKQotJChpbmZvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KQotZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZHluYW1pY19iaW5hcnkubWsgYi9jb3JlL2R5bmFtaWNfYmluYXJ5Lm1rCmluZGV4IDk0OTc5M2IuLmY0NGI4YTggMTAwNjQ0Ci0tLSBhL2NvcmUvZHluYW1pY19iaW5hcnkubWsKKysrIGIvY29yZS9keW5hbWljX2JpbmFyeS5tawpAQCAtOTksMTAgKzk5LDE1IEBACiBteV9icmVha3BhZF9wYXRoIDo9ICQoVEFSR0VUX09VVF9CUkVBS1BBRCkvJChwYXRzdWJzdCAkKFBST0RVQ1RfT1VUKS8lLCUsJChteV9tb2R1bGVfcGF0aCkpCiBicmVha3BhZF9pbnB1dCA6PSAkKHJlbG9jYXRpb25fcGFja2VyX291dHB1dCkKIGJyZWFrcGFkX291dHB1dCA6PSAkKG15X2JyZWFrcGFkX3BhdGgpLyQobXlfaW5zdGFsbGVkX21vZHVsZV9zdGVtKS5zeW0KLSQoYnJlYWtwYWRfb3V0cHV0KSA6ICQoYnJlYWtwYWRfaW5wdXQpIHwgJChCUkVBS1BBRF9EVU1QX1NZTVMpCiskKGJyZWFrcGFkX291dHB1dCkgOiAkKGJyZWFrcGFkX2lucHV0KSB8ICQoQlJFQUtQQURfRFVNUF9TWU1TKSAkKFBSSVZBVEVfUkVBREVMRikKIAlAZWNobyAidGFyZ2V0IGJyZWFrcGFkOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgogCUBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpICQoQlJFQUtQQURfRFVNUF9TWU1TKSAtYyAkPCA+ICRACisJJChoaWRlKSBpZiAkKFBSSVZBVEVfUkVBREVMRikgLVMgJDwgPiAvZGV2L251bGwgMj4mMSA7IHRoZW4gXAorCSAgJChCUkVBS1BBRF9EVU1QX1NZTVMpIC1jICQ8ID4gJEAgOyBcCisJZWxzZSBcCisJICBlY2hvICJza2lwcGVkIGZvciBub24tZWxmIGZpbGUuIjsgXAorCSAgdG91Y2ggJEA7IFwKKwlmaQogJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChicmVha3BhZF9vdXRwdXQpCiBlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL2VtcHR5X3Rlc3RfY29uZmlnLnhtbCBiL2NvcmUvZW1wdHlfdGVzdF9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWRhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2VtcHR5X3Rlc3RfY29uZmlnLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBObyBBbmRyb2lkVGVzdC54bWwgd2FzIHByb3ZpZGVkIGFuZCB0aGUgbWFuaWZlc3QgZG9lcyBub3QgaW5jbHVkZQorICAgICBpbnN0cnVtZW50YXRpb24sIGhlbmNlIHRoaXMgYXBrIGlzIG5vdCBpbnN0cnVtZW50YWJsZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkVtcHR5IENvbmZpZ3VyYXRpb24iIC8+CmRpZmYgLS1naXQgYS9jb3JlL2VudnNldHVwLm1rIGIvY29yZS9lbnZzZXR1cC5tawppbmRleCA0NjA2NmUzLi42YTdmYmQxIDEwMDY0NAotLS0gYS9jb3JlL2VudnNldHVwLm1rCisrKyBiL2NvcmUvZW52c2V0dXAubWsKQEAgLTk3LDggKzk3LDYgQEAKICMgY29tcGlsZXMgZXhjZXB0IGZvciBhcm0vbWlwcywgc28gdGhlIEhPU1QgaXMgd2hhdGV2ZXIgd2UgYXJlCiAjIHJ1bm5pbmcgb24KIAotVU5BTUUgOj0gJChzaGVsbCB1bmFtZSAtc20pCi0KICMgSE9TVF9PUwogaWZuZXEgKCwkKGZpbmRzdHJpbmcgTGludXgsJChVTkFNRSkpKQogICBIT1NUX09TIDo9IGxpbnV4CkBAIC0xMTAsNyArMTA4LDE1IEBACiAgIEhPU1RfT1MgOj0gZGFyd2luCiBlbmRpZgogCi1IT1NUX09TX0VYVFJBOj0kKHNoZWxsIHB5dGhvbiAtYyAiaW1wb3J0IHBsYXRmb3JtOyBwcmludChwbGF0Zm9ybS5wbGF0Zm9ybSgpKSIpCitIT1NUX09TX0VYVFJBIDo9ICQoc2hlbGwgdW5hbWUgLXJzbSkKK2lmZXEgKCQoSE9TVF9PUyksbGludXgpCisgIGlmbmVxICgkKHdpbGRjYXJkIC9ldGMvb3MtcmVsZWFzZSksKQorICAgIEhPU1RfT1NfRVhUUkEgKz0gJChzaGVsbCBzb3VyY2UgL2V0Yy9vcy1yZWxlYXNlOyBlY2hvICQkUFJFVFRZX05BTUUpCisgIGVuZGlmCitlbHNlIGlmZXEgKCQoSE9TVF9PUyksZGFyd2luKQorICBIT1NUX09TX0VYVFJBICs9ICQoc2hlbGwgc3dfdmVycyAtcHJvZHVjdFZlcnNpb24pCitlbmRpZgorSE9TVF9PU19FWFRSQSA6PSAkKHN1YnN0ICQoc3BhY2UpLC0sJChIT1NUX09TX0VYVFJBKSkKIAogIyBCVUlMRF9PUyBpcyB0aGUgcmVhbCBob3N0IGRvaW5nIHRoZSBidWlsZC4KIEJVSUxEX09TIDo9ICQoSE9TVF9PUykKQEAgLTExOCwxMSArMTI0LDEzIEBACiBIT1NUX0NST1NTX09TIDo9CiAjIFdlIGNhbiBjcm9zcy1idWlsZCBXaW5kb3dzIGJpbmFyaWVzIG9uIExpbnV4CiBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQoraWZlcSAoJChCVUlMRF9IT1NUX3N0YXRpYyksKQogSE9TVF9DUk9TU19PUyA6PSB3aW5kb3dzCiBIT1NUX0NST1NTX0FSQ0ggOj0geDg2CiBIT1NUX0NST1NTXzJORF9BUkNIIDo9IHg4Nl82NAogMk5EX0hPU1RfQ1JPU1NfSVNfNjRfQklUIDo9IHRydWUKIGVuZGlmCitlbmRpZgogCiBpZmVxICgkKEhPU1RfT1MpLCkKICQoZXJyb3IgVW5hYmxlIHRvIGRldGVybWluZSBIT1NUX09TIGZyb20gdW5hbWUgLXNtOiAkKFVOQU1FKSEpCkBAIC0xNzEsNiArMTc5LDcgQEAKIFRBUkdFVF9DT1BZX09VVF9BU0FOIDo9ICQoVEFSR0VUX0NPUFlfT1VUX0RBVEEpL2FzYW4KIFRBUkdFVF9DT1BZX09VVF9PRU0gOj0gb2VtCiBUQVJHRVRfQ09QWV9PVVRfT0RNIDo9IG9kbQorVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QgOj0gcHJvZHVjdAogVEFSR0VUX0NPUFlfT1VUX1JPT1QgOj0gcm9vdAogVEFSR0VUX0NPUFlfT1VUX1JFQ09WRVJZIDo9IHJlY292ZXJ5CiAKQEAgLTE5MCwxMCArMTk5LDI5IEBACiBUQVJHRVRfQ09QWV9PVVRfVkVORE9SIDo9ICQoX3ZlbmRvcl9wYXRoX3BsYWNlaG9sZGVyKQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlZmluZSBUQVJHRVRfQ09QWV9PVVRfUFJPRFVDVCB0byBhIHBsYWNlaG9sZGVyLCBmb3IgYXQgdGhpcyBwb2ludAorIyB3ZSBkb24ndCBrbm93IGlmIHRoZSBkZXZpY2Ugd2FudHMgdG8gYnVpbGQgYSBzZXBhcmF0ZSBwcm9kdWN0LmltZworIyBvciBqdXN0IGJ1aWxkIHByb2R1Y3Qgc3R1ZmYgaW50byBzeXN0ZW0uaW1nLgorIyBBIGRldmljZSBjYW4gc2V0IHVwIFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUIHRvICJwcm9kdWN0IiBpbiBpdHMKKyMgQm9hcmRDb25maWcubWsuCisjIFdlJ2xsIHN1YnN0aXR1dGUgd2l0aCB0aGUgcmVhbCB2YWx1ZSBhZnRlciBsb2FkaW5nIEJvYXJkQ29uZmlnLm1rLgorX3Byb2R1Y3RfcGF0aF9wbGFjZWhvbGRlciA6PSB8fFBST0RVQ1QtUEFUSC1QSHx8CitUQVJHRVRfQ09QWV9PVVRfUFJPRFVDVCA6PSAkKF9wcm9kdWN0X3BhdGhfcGxhY2Vob2xkZXIpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIFNldCB1cCBtaW5pbWFsIEJPT1RDTEFTU1BBVEggbGlzdCBvZiBqYXJzIHRvIGJ1aWxkL2V4ZWN1dGUKICMgamF2YSBjb2RlIHdpdGggZGFsdmlrdm0vYXJ0LgogVEFSR0VUX0NPUkVfSkFSUyA6PSBjb3JlLW9qIGNvcmUtbGliYXJ0IGNvbnNjcnlwdCBva2h0dHAgYm91bmN5Y2FzdGxlIGFwYWNoZS14bWwKK2lmZXEgKCQoRU1NQV9JTlNUUlVNRU5UKSx0cnVlKQorICBpZm5lcSAoJChFTU1BX0lOU1RSVU1FTlRfU1RBVElDKSx0cnVlKQorICAgICMgRm9yIGluc3RydW1lbnRlZCBidWlsZCwgaWYgSmFjb2NvIGlzIG5vdCBiZWluZyBpbmNsdWRlZCBzdGF0aWNhbGx5CisgICAgIyBpbiBpbnN0cnVtZW50ZWQgcGFja2FnZXMgdGhlbiBpbmNsdWRlIEphY29jbyBjbGFzc2VzIGludG8gdGhlCisgICAgIyBib290Y2xhc3NwYXRoLgorICAgIFRBUkdFVF9DT1JFX0pBUlMgKz0gamFjb2NvYWdlbnQKKyAgZW5kaWYgIyBFTU1BX0lOU1RSVU1FTlRfU1RBVElDCitlbmRpZiAjIEVNTUFfSU5TVFJVTUVOVAogSE9TVF9DT1JFX0pBUlMgOj0gJChhZGRzdWZmaXggLWhvc3RkZXgsJChUQVJHRVRfQ09SRV9KQVJTKSkKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTI1Nyw2ICsyODUsMjkgQEAKIGVsc2UgaWZkZWYgQk9BUkRfVVNFU19WRU5ET1JJTUFHRQogJChlcnJvciBUQVJHRVRfQ09QWV9PVVRfVkVORE9SIG11c3QgYmUgc2V0IHRvICd2ZW5kb3InIHRvIHVzZSBhIHZlbmRvciBpbWFnZSkKIGVuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTm93IHdlIGNhbiBzdWJzdGl0dXRlIHdpdGggdGhlIHJlYWwgdmFsdWUgb2YgVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QKK2lmZXEgKCQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpLCQoX3Byb2R1Y3RfcGF0aF9wbGFjZWhvbGRlcikpCitUQVJHRVRfQ09QWV9PVVRfUFJPRFVDVCA6PSBzeXN0ZW0vcHJvZHVjdAorZWxzZSBpZmVxICgkKGZpbHRlciBwcm9kdWN0IHN5c3RlbS9wcm9kdWN0LCQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpKSwpCiskKGVycm9yIFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUIG11c3QgYmUgZWl0aGVyICdwcm9kdWN0JyBvciAnc3lzdGVtL3Byb2R1Y3QnLCBzZWVpbmcgJyQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpJy4pCitlbmRpZgorUFJPRFVDVF9DT1BZX0ZJTEVTIDo9ICQoc3Vic3QgJChfcHJvZHVjdF9wYXRoX3BsYWNlaG9sZGVyKSwkKFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUKSwkKFBST0RVQ1RfQ09QWV9GSUxFUykpCisKK0JPQVJEX1VTRVNfUFJPRFVDVElNQUdFIDo9CitpZmRlZiBCT0FSRF9QUkVCVUlMVF9QUk9EVUNUSU1BR0UKK0JPQVJEX1VTRVNfUFJPRFVDVElNQUdFIDo9IHRydWUKK2VuZGlmCitpZmRlZiBCT0FSRF9QUk9EVUNUSU1BR0VfRklMRV9TWVNURU1fVFlQRQorQk9BUkRfVVNFU19QUk9EVUNUSU1BR0UgOj0gdHJ1ZQorZW5kaWYKK2lmZXEgKCQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpLHByb2R1Y3QpCitCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRSA6PSB0cnVlCitlbHNlIGlmZGVmIEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFCiskKGVycm9yIFRBUkdFVF9DT1BZX09VVF9QUk9EVUNUIG11c3QgYmUgc2V0IHRvICdwcm9kdWN0JyB0byB1c2UgYSBwcm9kdWN0IGltYWdlKQorZW5kaWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBFbnN1cmUgdGhhdCBvbmx5IFRBUkdFVF9SRUNPVkVSWV9VUERBVEVSX0xJQlMgKm9yKiBBQl9PVEFfVVBEQVRFUiBpcyBzZXQuCiBUQVJHRVRfUkVDT1ZFUllfVVBEQVRFUl9MSUJTID89CkBAIC0yNjksNiArMzIwLDExIEBACiBlbmRpZgogCiAjIENoZWNrIEJPQVJEX1ZOREtfVkVSU0lPTgorZGVmaW5lIGNoZWNrX3ZuZGtfdmVyc2lvbgorICAkKGV2YWwgdm5ka19wYXRoIDo9IHByZWJ1aWx0cy92bmRrL3YkKDEpKSBcCisgICQoaWYgJCh3aWxkY2FyZCAkKHZuZGtfcGF0aCkvKi9BbmRyb2lkLmJwKSwsJChlcnJvciBWTkRLIHZlcnNpb24gJCgxKSBub3QgZm91bmQpKQorZW5kZWYKKwogaWZkZWYgQk9BUkRfVk5ES19WRVJTSU9OCiAgIGlmbmVxICgkKEJPQVJEX1ZOREtfVkVSU0lPTiksY3VycmVudCkKICAgICAkKGVycm9yIEJPQVJEX1ZOREtfVkVSU0lPTjogT25seSAiY3VycmVudCIgaXMgaW1wbGVtZW50ZWQpCkBAIC0yNzksNiArMzM1LDE3IEBACiAgIFRBUkdFVF9WRU5ET1JfVEVTVF9TVUZGSVggOj0KIGVuZGlmCiAKK2lmZGVmIFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUworICAkKGZvcmVhY2ggdiwkKFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUyksJChjYWxsIGNoZWNrX3ZuZGtfdmVyc2lvbiwkKHYpKSkKK2VuZGlmCisKKyMgRW5zdXJlIHRoYXQgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TIGFyZSBhbGwgd2l0aGluIFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUworX3Vuc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucyA6PSAkKGZpbHRlci1vdXQgJChQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMpLCQoQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TKSkKK2lmbmVxICgsJChfdW5zdXBwb3J0ZWRfc3lzdGVtc2RrX3ZlcnNpb25zKSkKKyAgJChlcnJvciBTeXN0ZW0gU0RLIHZlcnNpb25zICckKF91bnN1cHBvcnRlZF9zeXN0ZW1zZGtfdmVyc2lvbnMpJyBpbiBCT0FSRF9TWVNURU1TREtfVkVSU0lPTlMgYXJlIG5vdCBzdXBwb3J0ZWQuXAorICAgICAgICAgIFN1cHBvcnRlZCB2ZXJzaW9ucyBhcmUgJChQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMpKQorZW5kaWYKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgU2V0IHVwIGNvbmZpZ3VyYXRpb24gZm9yIHRhcmdldCBtYWNoaW5lLgogIyBUaGUgZm9sbG93aW5nIG11c3QgYmUgc2V0OgpAQCAtMzA5LDI5ICszNzYsMTcgQEAKIAogU09PTkdfT1VUX0RJUiA6PSAkKE9VVF9ESVIpL3Nvb25nCiAKLURFQlVHX09VVF9ESVIgOj0gJChPVVRfRElSKS9kZWJ1ZworVEFSR0VUX09VVF9ST09UIDo9ICQoT1VUX0RJUikvdGFyZ2V0CiAKLSMgTW92ZSB0aGUgaG9zdCBvciB0YXJnZXQgdW5kZXIgdGhlIGRlYnVnLyBkaXJlY3RvcnkKLSMgaWYgbmVjZXNzYXJ5LgotVEFSR0VUX09VVF9ST09UX3JlbGVhc2UgOj0gJChPVVRfRElSKS90YXJnZXQKLVRBUkdFVF9PVVRfUk9PVF9kZWJ1ZyA6PSAkKERFQlVHX09VVF9ESVIpL3RhcmdldAotVEFSR0VUX09VVF9ST09UIDo9ICQoVEFSR0VUX09VVF9ST09UXyQoVEFSR0VUX0JVSUxEX1RZUEUpKQotCi1IT1NUX09VVF9ST09UX3JlbGVhc2UgOj0gJChPVVRfRElSKS9ob3N0Ci1IT1NUX09VVF9ST09UX2RlYnVnIDo9ICQoREVCVUdfT1VUX0RJUikvaG9zdAotSE9TVF9PVVRfUk9PVCA6PSAkKEhPU1RfT1VUX1JPT1RfJChIT1NUX0JVSUxEX1RZUEUpKQorSE9TVF9PVVRfUk9PVCA6PSAkKE9VVF9ESVIpL2hvc3QKIAogIyBXZSB3YW50IHRvIGF2b2lkIHR3byBob3N0IGJpbiBkaXJlY3RvcmllcyBpbiBtdWx0aWxpYiBidWlsZC4KLUhPU1RfT1VUX3JlbGVhc2UgOj0gJChIT1NUX09VVF9ST09UX3JlbGVhc2UpLyQoSE9TVF9PUyktJChIT1NUX1BSRUJVSUxUX0FSQ0gpCi1IT1NUX09VVF9kZWJ1ZyA6PSAkKEhPU1RfT1VUX1JPT1RfZGVidWcpLyQoSE9TVF9PUyktJChIT1NUX1BSRUJVSUxUX0FSQ0gpCi1IT1NUX09VVCA6PSAkKEhPU1RfT1VUXyQoSE9TVF9CVUlMRF9UWVBFKSkKK0hPU1RfT1VUIDo9ICQoSE9TVF9PVVRfUk9PVCkvJChIT1NUX09TKS0kKEhPU1RfUFJFQlVJTFRfQVJDSCkKIFNPT05HX0hPU1RfT1VUIDo9ICQoU09PTkdfT1VUX0RJUikvaG9zdC8kKEhPU1RfT1MpLSQoSE9TVF9QUkVCVUlMVF9BUkNIKQogIyBUT0RPOiByZW1vdmUKIEJVSUxEX09VVCA6PSAkKEhPU1RfT1VUKQogCi1IT1NUX0NST1NTX09VVF9yZWxlYXNlIDo9ICQoSE9TVF9PVVRfUk9PVF9yZWxlYXNlKS93aW5kb3dzLSQoSE9TVF9QUkVCVUlMVF9BUkNIKQotSE9TVF9DUk9TU19PVVRfZGVidWcgOj0gJChIT1NUX09VVF9ST09UX2RlYnVnKS93aW5kb3dzLSQoSE9TVF9QUkVCVUlMVF9BUkNIKQotSE9TVF9DUk9TU19PVVQgOj0gJChIT1NUX0NST1NTX09VVF8kKEhPU1RfQlVJTERfVFlQRSkpCitIT1NUX0NST1NTX09VVCA6PSAkKEhPU1RfT1VUX1JPT1QpL3dpbmRvd3MtJChIT1NUX1BSRUJVSUxUX0FSQ0gpCiAKIFRBUkdFVF9QUk9EVUNUX09VVF9ST09UIDo9ICQoVEFSR0VUX09VVF9ST09UKS9wcm9kdWN0CiAKQEAgLTM0MSw2ICszOTYsNyBAQAogUFJPRFVDVF9PVVQgOj0gJChUQVJHRVRfUFJPRFVDVF9PVVRfUk9PVCkvJChUQVJHRVRfREVWSUNFKQogCiBPVVRfRE9DUyA6PSAkKFRBUkdFVF9DT01NT05fT1VUX1JPT1QpL2RvY3MKK09VVF9OREtfRE9DUyA6PSAkKFRBUkdFVF9DT01NT05fT1VUX1JPT1QpL25kay1kb2NzCiAKIEJVSUxEX09VVF9FWEVDVVRBQkxFUyA6PSAkKEJVSUxEX09VVCkvYmluCiBTT09OR19IT1NUX09VVF9FWEVDVVRBQkxFUyA6PSAkKFNPT05HX0hPU1RfT1VUKS9iaW4KQEAgLTM3Nyw2ICs0MzMsOCBAQAogCiBIT1NUX0NST1NTX09VVF9HRU4gOj0gJChIT1NUX0NST1NTX09VVCkvZ2VuCiAKK0hPU1RfT1VUX1RFU1RfQ09ORklHIDo9ICQoSE9TVF9PVVQpL3Rlc3RfY29uZmlnCisKICMgT3V0IGZvciBIT1NUXzJORF9BUkNICiBIT1NUXzJORF9BUkNIX1ZBUl9QUkVGSVggOj0gMk5EXwogSE9TVF8yTkRfQVJDSF9NT0RVTEVfU1VGRklYIDo9IF8zMgpAQCAtNDIxLDggKzQ3OSwxNiBAQAogVEFSR0VUX09VVCA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9DT1BZX09VVF9TWVNURU0pCiBpZm5lcSAoJChmaWx0ZXIgYWRkcmVzcywkKFNBTklUSVpFX1RBUkdFVCkpLCkKIHRhcmdldF9vdXRfc2hhcmVkX2xpYnJhcmllc19iYXNlIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX0FTQU4pL3N5c3RlbQoraWZlcSAoJChTQU5JVElaRV9MSVRFKSx0cnVlKQorIyBXaGVuIHVzaW5nIFNBTklUSVpFX0xJVEUsIEFQS3MgbXVzdCBub3QgYmUgcGFja2FnZWQgd2l0aCBzYW5pdGl6ZWQgbGlicmFyaWVzLCBhcyB0aGV5IHdpbGwgbm90CisjIHdvcmsgd2l0aCB1bnNhbml0aXplZCBhcHBfcHJvY2Vzcy4gRm9yIHNpbXBsaWNpdHksIGdlbmVyYXRlIEFQS3MgaW50byAvZGF0YS9hc2FuLy4KK3RhcmdldF9vdXRfYXBwX2Jhc2UgOj0gJChQUk9EVUNUX09VVCkvJChUQVJHRVRfQ09QWV9PVVRfQVNBTikvc3lzdGVtCitlbHNlCit0YXJnZXRfb3V0X2FwcF9iYXNlIDo9ICQoVEFSR0VUX09VVCkKK2VuZGlmCiBlbHNlCiB0YXJnZXRfb3V0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSA6PSAkKFRBUkdFVF9PVVQpCit0YXJnZXRfb3V0X2FwcF9iYXNlIDo9ICQoVEFSR0VUX09VVCkKIGVuZGlmCiAKIFRBUkdFVF9PVVRfRVhFQ1VUQUJMRVMgOj0gJChUQVJHRVRfT1VUKS9iaW4KQEAgLTQzNiwxNiArNTAyLDIzIEBACiBlbmRpZgogVEFSR0VUX09VVF9SRU5ERVJTQ1JJUFRfQklUQ09ERSA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykKIFRBUkdFVF9PVVRfSkFWQV9MSUJSQVJJRVMgOj0gJChUQVJHRVRfT1VUKS9mcmFtZXdvcmsKLVRBUkdFVF9PVVRfQVBQUyA6PSAkKFRBUkdFVF9PVVQpL2FwcAotVEFSR0VUX09VVF9BUFBTX1BSSVZJTEVHRUQgOj0gJChUQVJHRVRfT1VUKS9wcml2LWFwcAorVEFSR0VUX09VVF9BUFBTIDo9ICQodGFyZ2V0X291dF9hcHBfYmFzZSkvYXBwCitUQVJHRVRfT1VUX0FQUFNfUFJJVklMRUdFRCA6PSAkKHRhcmdldF9vdXRfYXBwX2Jhc2UpL3ByaXYtYXBwCiBUQVJHRVRfT1VUX0tFWUxBWU9VVCA6PSAkKFRBUkdFVF9PVVQpL3Vzci9rZXlsYXlvdXQKIFRBUkdFVF9PVVRfS0VZQ0hBUlMgOj0gJChUQVJHRVRfT1VUKS91c3Iva2V5Y2hhcnMKIFRBUkdFVF9PVVRfRVRDIDo9ICQoVEFSR0VUX09VVCkvZXRjCiBUQVJHRVRfT1VUX05PVElDRV9GSUxFUyA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvTk9USUNFX0ZJTEVTCiBUQVJHRVRfT1VUX0ZBS0UgOj0gJChQUk9EVUNUX09VVCkvZmFrZV9wYWNrYWdlcwogVEFSR0VUX09VVF9URVNUQ0FTRVMgOj0gJChQUk9EVUNUX09VVCkvdGVzdGNhc2VzCitUQVJHRVRfT1VUX1RFU1RfQ09ORklHIDo9ICQoUFJPRFVDVF9PVVQpL3Rlc3RfY29uZmlnCiAKK2lmZXEgKCQoU0FOSVRJWkVfTElURSksdHJ1ZSkKKyMgV2hlbiB1c2luZyBTQU5JVElaRV9MSVRFLCBBUEtzIG11c3Qgbm90IGJlIHBhY2thZ2VkIHdpdGggc2FuaXRpemVkIGxpYnJhcmllcywgYXMgdGhleSB3aWxsIG5vdAorIyB3b3JrIHdpdGggdW5zYW5pdGl6ZWQgYXBwX3Byb2Nlc3MuIEZvciBzaW1wbGljaXR5LCBnZW5lcmF0ZSBBUEtzIGludG8gL2RhdGEvYXNhbi8uCitUQVJHRVRfT1VUX1NZU1RFTV9PVEhFUiA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9DT1BZX09VVF9BU0FOKS8kKFRBUkdFVF9DT1BZX09VVF9TWVNURU1fT1RIRVIpCitlbHNlCiBUQVJHRVRfT1VUX1NZU1RFTV9PVEhFUiA6PSAkKFBST0RVQ1RfT1VUKS8kKFRBUkdFVF9DT1BZX09VVF9TWVNURU1fT1RIRVIpCitlbmRpZgogCiAjIE91dCBmb3IgVEFSR0VUXzJORF9BUkNICiBUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWCA6PSAkKEhPU1RfMk5EX0FSQ0hfVkFSX1BSRUZJWCkKQEAgLTUxNCw4ICs1ODcsMTYgQEAKIFRBUkdFVF9PVVRfVkVORE9SIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikKIGlmbmVxICgkKGZpbHRlciBhZGRyZXNzLCQoU0FOSVRJWkVfVEFSR0VUKSksKQogdGFyZ2V0X291dF92ZW5kb3Jfc2hhcmVkX2xpYnJhcmllc19iYXNlIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX0FTQU4pL3ZlbmRvcgoraWZlcSAoJChTQU5JVElaRV9MSVRFKSx0cnVlKQorIyBXaGVuIHVzaW5nIFNBTklUSVpFX0xJVEUsIEFQS3MgbXVzdCBub3QgYmUgcGFja2FnZWQgd2l0aCBzYW5pdGl6ZWQgbGlicmFyaWVzLCBhcyB0aGV5IHdpbGwgbm90CisjIHdvcmsgd2l0aCB1bnNhbml0aXplZCBhcHBfcHJvY2Vzcy4gRm9yIHNpbXBsaWNpdHksIGdlbmVyYXRlIEFQS3MgaW50byAvZGF0YS9hc2FuLy4KK3RhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX0FTQU4pL3ZlbmRvcgorZWxzZQordGFyZ2V0X291dF92ZW5kb3JfYXBwX2Jhc2UgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikKK2VuZGlmCiBlbHNlCiB0YXJnZXRfb3V0X3ZlbmRvcl9zaGFyZWRfbGlicmFyaWVzX2Jhc2UgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikKK3RhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpCiBlbmRpZgogCiBUQVJHRVRfT1VUX1ZFTkRPUl9FWEVDVVRBQkxFUyA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9iaW4KQEAgLTUyNyw4ICs2MDgsOCBAQAogZW5kaWYKIFRBUkdFVF9PVVRfVkVORE9SX1JFTkRFUlNDUklQVF9CSVRDT0RFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfU0hBUkVEX0xJQlJBUklFUykKIFRBUkdFVF9PVVRfVkVORE9SX0pBVkFfTElCUkFSSUVTIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2ZyYW1ld29yawotVEFSR0VUX09VVF9WRU5ET1JfQVBQUyA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9hcHAKLVRBUkdFVF9PVVRfVkVORE9SX0FQUFNfUFJJVklMRUdFRCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9wcml2LWFwcAorVEFSR0VUX09VVF9WRU5ET1JfQVBQUyA6PSAkKHRhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlKS9hcHAKK1RBUkdFVF9PVVRfVkVORE9SX0FQUFNfUFJJVklMRUdFRCA6PSAkKHRhcmdldF9vdXRfdmVuZG9yX2FwcF9iYXNlKS9wcml2LWFwcAogVEFSR0VUX09VVF9WRU5ET1JfRVRDIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0YwogCiAkKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PVVRfVkVORE9SX0VYRUNVVEFCTEVTIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVhFQ1VUQUJMRVMpCkBAIC01NzksNiArNjYwLDM5IEBACiBlbmRpZgogJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT1VUX09ETV9BUFBTIDo9ICQoVEFSR0VUX09VVF9PRE1fQVBQUykKIAorVEFSR0VUX09VVF9QUk9EVUNUIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpCitpZm5lcSAoJChmaWx0ZXIgYWRkcmVzcywkKFNBTklUSVpFX1RBUkdFVCkpLCkKK3RhcmdldF9vdXRfcHJvZHVjdF9zaGFyZWRfbGlicmFyaWVzX2Jhc2UgOj0gJChQUk9EVUNUX09VVCkvJChUQVJHRVRfQ09QWV9PVVRfQVNBTikvc3lzdGVtCitpZmVxICgkKFNBTklUSVpFX0xJVEUpLHRydWUpCisjIFdoZW4gdXNpbmcgU0FOSVRJWkVfTElURSwgQVBLcyBtdXN0IG5vdCBiZSBwYWNrYWdlZCB3aXRoIHNhbml0aXplZCBsaWJyYXJpZXMsIGFzIHRoZXkgd2lsbCBub3QKKyMgd29yayB3aXRoIHVuc2FuaXRpemVkIGFwcF9wcm9jZXNzLiBGb3Igc2ltcGxpY2l0eSwgZ2VuZXJhdGUgQVBLcyBpbnRvIC9kYXRhL2FzYW4vLgordGFyZ2V0X291dF9wcm9kdWN0X2FwcF9iYXNlIDo9ICQoUFJPRFVDVF9PVVQpLyQoVEFSR0VUX0NPUFlfT1VUX0FTQU4pL3Byb2R1Y3QKK2Vsc2UKK3RhcmdldF9vdXRfcHJvZHVjdF9hcHBfYmFzZSA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkKK2VuZGlmCitlbHNlCit0YXJnZXRfb3V0X3Byb2R1Y3Rfc2hhcmVkX2xpYnJhcmllc19iYXNlIDo9ICQoVEFSR0VUX09VVCkKK3RhcmdldF9vdXRfcHJvZHVjdF9hcHBfYmFzZSA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkKK2VuZGlmCisKK2lmZXEgKCQoVEFSR0VUX0lTXzY0X0JJVCksdHJ1ZSkKK1RBUkdFVF9PVVRfUFJPRFVDVF9TSEFSRURfTElCUkFSSUVTIDo9ICQodGFyZ2V0X291dF9wcm9kdWN0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSkvbGliNjQKK2Vsc2UKK1RBUkdFVF9PVVRfUFJPRFVDVF9TSEFSRURfTElCUkFSSUVTIDo9ICQodGFyZ2V0X291dF9wcm9kdWN0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSkvbGliCitlbmRpZgorVEFSR0VUX09VVF9QUk9EVUNUX0pBVkFfTElCUkFSSUVTOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2ZyYW1ld29yaworVEFSR0VUX09VVF9QUk9EVUNUX0FQUFMgOj0gJCh0YXJnZXRfb3V0X3Byb2R1Y3RfYXBwX2Jhc2UpL2FwcAorVEFSR0VUX09VVF9QUk9EVUNUX0FQUFNfUFJJVklMRUdFRCA6PSAkKHRhcmdldF9vdXRfcHJvZHVjdF9hcHBfYmFzZSkvcHJpdi1hcHAKK1RBUkdFVF9PVVRfUFJPRFVDVF9FVEMgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1QpL2V0YworCitpZmVxICgkKFRBUkdFVF9UUkFOU0xBVEVfMk5EX0FSQ0gpLHRydWUpCiskKFRBUkdFVF8yTkRfQVJDSF9WQVJfUFJFRklYKVRBUkdFVF9PVVRfUFJPRFVDVF9TSEFSRURfTElCUkFSSUVTIDo9ICQodGFyZ2V0X291dF9wcm9kdWN0X3NoYXJlZF9saWJyYXJpZXNfYmFzZSkvbGliLyQoVEFSR0VUXzJORF9BUkNIKQorZWxzZQorJChUQVJHRVRfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfT1VUX1BST0RVQ1RfU0hBUkVEX0xJQlJBUklFUyA6PSAkKHRhcmdldF9vdXRfcHJvZHVjdF9zaGFyZWRfbGlicmFyaWVzX2Jhc2UpL2xpYgorZW5kaWYKKyQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9QUk9EVUNUX0FQUFMgOj0gJChUQVJHRVRfT1VUX1BST0RVQ1RfQVBQUykKKyQoVEFSR0VUXzJORF9BUkNIX1ZBUl9QUkVGSVgpVEFSR0VUX09VVF9QUk9EVUNUX0FQUFNfUFJJVklMRUdFRCA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVF9BUFBTX1BSSVZJTEVHRUQpCisKIFRBUkdFVF9PVVRfQlJFQUtQQUQgOj0gJChQUk9EVUNUX09VVCkvYnJlYWtwYWQKIAogVEFSR0VUX09VVF9VTlNUUklQUEVEIDo9ICQoUFJPRFVDVF9PVVQpL3N5bWJvbHMKQEAgLTYxNSwxNiArNzI5LDYgQEAKICAgRElTVF9ESVIgOj0gJChPVVRfRElSKS9kaXN0CiBlbmRpZgogCi1pZm5kZWYgS0FUSQoraWZlcSAoJChDQUxMRURfRlJPTV9TRVRVUCksdHJ1ZSkKIFBSSU5UX0JVSUxEX0NPTkZJRyA/PSB0cnVlCiBlbmRpZgotCi1pZmVxICgkKFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCksKQotVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEIDo9IHRydWUKLWVuZGlmCi0KLWlmbmVxICgkKFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCksdHJ1ZSkKLWlmbmVxICgkKFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCksZmFsc2UpCi0kKGVycm9yIFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCBtdXN0IGJlIHRydWUgb3IgZmFsc2UpCi1lbmRpZgotZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZXhlY3V0YWJsZV9pbnRlcm5hbC5tayBiL2NvcmUvZXhlY3V0YWJsZV9pbnRlcm5hbC5tawppbmRleCAzNTA5YmQyLi40YTYyZmJmIDEwMDY0NAotLS0gYS9jb3JlL2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKKysrIGIvY29yZS9leGVjdXRhYmxlX2ludGVybmFsLm1rCkBAIC0xMiw3ICsxMiw5IEBACiBMT0NBTF9NT0RVTEVfU1VGRklYIDo9ICQoVEFSR0VUX0VYRUNVVEFCTEVfU1VGRklYKQogZW5kaWYKIAoraWZkZWYgdGFyZ2V0LWV4ZWN1dGFibGUtaG9vawogJChjYWxsIHRhcmdldC1leGVjdXRhYmxlLWhvb2spCitlbmRpZgogCiBza2lwX2J1aWxkX2Zyb21fc291cmNlIDo9CiBpZmRlZiBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRQpAQCAtNzYsNCArNzgsMzkgQEAKIAkkKFBSSVZBVEVfUE9TVF9MSU5LX0NNRCkKIGVuZGlmCiAKK2lmZXEgKCQobXlfbmF0aXZlX2NvdmVyYWdlKSx0cnVlKQorZ2Nub19zdWZmaXggOj0gLmdjbm9kaXIKKworYnVpbHRfd2hvbGVfZ2Nub19saWJyYXJpZXMgOj0gXAorICAgICQoZm9yZWFjaCBsaWIsJChteV93aG9sZV9zdGF0aWNfbGlicmFyaWVzKSwgXAorICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgXAorICAgICAgICBTVEFUSUNfTElCUkFSSUVTLCQobGliKSwkKG15X2tpbmQpLCwkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpLCBcCisgICAgICAgICQobXlfaG9zdF9jcm9zcykpLyQobGliKSQoZ2Nub19zdWZmaXgpKQorCitidWlsdF9zdGF0aWNfZ2Nub19saWJyYXJpZXMgOj0gXAorICAgICQoZm9yZWFjaCBsaWIsJChteV9zdGF0aWNfbGlicmFyaWVzKSwgXAorICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgXAorICAgICAgICBTVEFUSUNfTElCUkFSSUVTLCQobGliKSwkKG15X2tpbmQpLCwkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpLCBcCisgICAgICAgICQobXlfaG9zdF9jcm9zcykpLyQobGliKSQoZ2Nub19zdWZmaXgpKQorCitpZmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQorbXlfY292ZXJhZ2VfcGF0aCA6PSAkKCQobXlfcHJlZml4KU9VVF9DT1ZFUkFHRSkvJChwYXRzdWJzdCAkKCQobXlfcHJlZml4KU9VVCkvJSwlLCQobXlfbW9kdWxlX3BhdGgpKQorZWxzZQorbXlfY292ZXJhZ2VfcGF0aCA6PSAkKFRBUkdFVF9PVVRfQ09WRVJBR0UpLyQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwlLCQobXlfbW9kdWxlX3BhdGgpKQorZW5kaWYKKworR0NOT19BUkNISVZFIDo9ICQobXlfaW5zdGFsbGVkX21vZHVsZV9zdGVtKSQoZ2Nub19zdWZmaXgpCisKKyQoaW50ZXJtZWRpYXRlcykvJChHQ05PX0FSQ0hJVkUpIDogUFJJVkFURV9BTExfT0JKRUNUUyA6PSAkKHN0cmlwICQoTE9DQUxfR0NOT19GSUxFUykpCiskKGludGVybWVkaWF0ZXMpLyQoR0NOT19BUkNISVZFKSA6IFBSSVZBVEVfQUxMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gJChzdHJpcCAkKGJ1aWx0X3dob2xlX2djbm9fbGlicmFyaWVzKSkgJChzdHJpcCAkKGJ1aWx0X3N0YXRpY19nY25vX2xpYnJhcmllcykpCiskKGludGVybWVkaWF0ZXMpLyQoR0NOT19BUkNISVZFKSA6IFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzKQorJChpbnRlcm1lZGlhdGVzKS8kKEdDTk9fQVJDSElWRSkgOiAkKExPQ0FMX0dDTk9fRklMRVMpICQoYnVpbHRfd2hvbGVfZ2Nub19saWJyYXJpZXMpICQoYnVpbHRfc3RhdGljX2djbm9fbGlicmFyaWVzKQorCSQodHJhbnNmb3JtLW8tdG8tc3RhdGljLWxpYikKKworJChteV9jb3ZlcmFnZV9wYXRoKS8kKEdDTk9fQVJDSElWRSkgOiAkKGludGVybWVkaWF0ZXMpLyQoR0NOT19BUkNISVZFKQorCSQoY29weS1maWxlLXRvLXRhcmdldCkKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKG15X2NvdmVyYWdlX3BhdGgpLyQoR0NOT19BUkNISVZFKQorZW5kaWYKKwogZW5kaWYgICMgc2tpcF9idWlsZF9mcm9tX3NvdXJjZQpkaWZmIC0tZ2l0IGEvY29yZS9maW5kLWpkay10b29scy1qYXIuc2ggYi9jb3JlL2ZpbmQtamRrLXRvb2xzLWphci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWMwYjNiNi4uMDAwMDAwMAotLS0gYS9jb3JlL2ZpbmQtamRrLXRvb2xzLWphci5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMhL2Jpbi9zaAotaWYgWyAieCRBTkRST0lEX0pBVkFfSE9NRSIgIT0geCBdICYmIFsgLWUgIiRBTkRST0lEX0pBVkFfSE9NRS9saWIvdG9vbHMuamFyIiBdIDsgdGhlbgotICAgIGVjaG8gJEFORFJPSURfSkFWQV9IT01FL2xpYi90b29scy5qYXIKLWVsc2UKLSAgICBKQVZBQz0kKHJlYWxwYXRoICQod2hpY2ggamF2YWMpIDI+L2Rldi9udWxsKQotICAgIGlmIFsgLXogIiRKQVZBQyIgXTsgdGhlbgotICAgICAgICBKQVZBQz0kKHJlYWRsaW5rIC1mICQod2hpY2ggamF2YWMpIDI+L2Rldi9udWxsKQotICAgIGZpCi0gICAgaWYgWyAteiAiJEpBVkFDIiBdOyB0aGVuCi0gICAgICAgIEpBVkFDPSQod2hpY2ggamF2YWMpCi0gICAgZmkKLSAgICBpZiBbIC16ICIkSkFWQUMiIF0gOyB0aGVuCi0gICAgICAgIGV4aXQgMQotICAgIGZpCi0gICAgd2hpbGUgWyAtTCAiJEpBVkFDIiBdIDsgZG8KLSAgICAgICAgTFNMSU5FPSQobHMgLWwgIiRKQVZBQyIpCi0gICAgICAgIEpBVkFDPSQoZWNobyAtbiAiJExTTElORSIgfCBzZWQgLWUgInMvLiogLT4gLy8iKQotICAgIGRvbmUKLSAgICBlY2hvICRKQVZBQyB8IHNlZCAtZSAnczpcKC4qXCkvamF2YWMkOlwxLy4uL2xpYi90b29scy5qYXI6JwotZmkKZGlmZiAtLWdpdCBhL2NvcmUvZnV6el90ZXN0Lm1rIGIvY29yZS9mdXp6X3Rlc3QubWsKaW5kZXggNGQ0MTg3MS4uMmNjMmUyYyAxMDA2NDQKLS0tIGEvY29yZS9mdXp6X3Rlc3QubWsKKysrIGIvY29yZS9mdXp6X3Rlc3QubWsKQEAgLTgsOCArOCw1MCBAQAogICAgICQoZXJyb3IgJChMT0NBTF9QQVRIKTogJChMT0NBTF9NT0RVTEUpOiBOREsgZnV6eiB0ZXN0cyBhcmUgbm90IHN1cHBvcnRlZC4pCiBlbmRpZgogCi1MT0NBTF9DRkxBR1MgKz0gLWZzYW5pdGl6ZS1jb3ZlcmFnZT10cmFjZS1wYy1ndWFyZAorbXlfZnV6emVyOj1saWJGdXp6ZXIKK2lmZGVmIExPQ0FMX0ZVWlpfRU5HSU5FCisgICAgbXlfZnV6emVyOj0kKExPQ0FMX0ZVWlpfRU5HSU5FKQorZWxzZSBpZmRlZiBUQVJHRVRfRlVaWl9FTkdJTkUKKyAgICBteV9mdXp6ZXI6PSQoVEFSR0VUX0ZVWlpfRU5HSU5FKQorZW5kaWYKKworCitMT0NBTF9DRkxBR1MgKz0gLWZzYW5pdGl6ZS1jb3ZlcmFnZT10cmFjZS1wYy1ndWFyZCxpbmRpcmVjdC1jYWxscyx0cmFjZS1jbXAKKworaWZlcSAoJChteV9mdXp6ZXIpLGxpYkZ1enplcikKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliRnV6emVyCitlbHNlIGlmZXEgKCQobXlfZnV6emVyKSxob25nZ2Z1enopCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGhvbmdnZnV6el9saWJoZnV6egorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyArPSBob25nZ2Z1enoKK0xPQ0FMX0xERkxBR1MgKz0gXAorICAgICAgICAiLVdsLC0td3JhcD1zdHJjbXAiIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9c3RyY2FzZWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD1zdHJuY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXN0cm5jYXNlY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXN0cnN0ciIgXAorICAgICAgICAiLVdsLC0td3JhcD1zdHJjYXNlc3RyIiBcCisgICAgICAgICItV2wsLS13cmFwPW1lbWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD1iY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPW1lbW1lbSIgXAorICAgICAgICAiLVdsLC0td3JhcD1hcF9jc3RyX2Nhc2VjbXAiIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9YXBfY3N0cl9jYXNlY21wbiIgXAorICAgICAgICAiLVdsLC0td3JhcD1hcF9zdHJjYXNlc3RyIiBcCisgICAgICAgICItV2wsLS13cmFwPWFwcl9jc3RyX2Nhc2VjbXAiIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9YXByX2NzdHJfY2FzZWNtcG4iIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9Q1JZUFRPX21lbWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD1PUEVOU1NMX21lbWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD1PUEVOU1NMX3N0cmNhc2VjbXAiIFwKKyAgICAgICAgIi1XbCwtLXdyYXA9T1BFTlNTTF9zdHJuY2FzZWNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD14bWxTdHJuY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXhtbFN0cmNtcCIgXAorICAgICAgICAiLVdsLC0td3JhcD14bWxTdHJFcXVhbCIgXAorICAgICAgICAiLVdsLC0td3JhcD14bWxTdHJjYXNlY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXhtbFN0cm5jYXNlY21wIiBcCisgICAgICAgICItV2wsLS13cmFwPXhtbFN0cnN0ciIgXAorICAgICAgICAiLVdsLC0td3JhcD14bWxTdHJjYXNlc3RyIgorZWxzZQorJChjYWxsIHByZXR0eS1lcnJvciwgVW5rbm93biBmdXp6IGVuZ2luZSAkKG15X2Z1enplcikpCitlbmRpZgogCiBpZmRlZiBMT0NBTF9NT0RVTEVfUEFUSAogJChlcnJvciAkKExPQ0FMX1BBVEgpOiBEbyBub3Qgc2V0IExPQ0FMX01PRFVMRV9QQVRIIHdoZW4gYnVpbGRpbmcgdGVzdCAkKExPQ0FMX01PRFVMRSkpCkBAIC0zMiw0ICs3NCw4IEBACiBlbmRpZgogZW5kaWYKIAoraWZuZGVmIExPQ0FMX1NUUklQX01PRFVMRQorTE9DQUxfU1RSSVBfTU9EVUxFIDo9IGtlZXBfc3ltYm9scworZW5kaWYKKwogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jb3JlL2dlbmVyYXRlX2VuZm9yY2VfcnJvLm1rIGIvY29yZS9nZW5lcmF0ZV9lbmZvcmNlX3Jyby5tawppbmRleCA1NzkwODljLi42MmE4YzhkIDEwMDY0NAotLS0gYS9jb3JlL2dlbmVyYXRlX2VuZm9yY2VfcnJvLm1rCisrKyBiL2NvcmUvZ2VuZXJhdGVfZW5mb3JjZV9ycm8ubWsKQEAgLTcsMTIgKzcsMTIgQEAKIAogaWZlcSAodHJ1ZSwkKGVuZm9yY2VfcnJvX3NvdXJjZV9pc19tYW5pZmVzdF9wYWNrYWdlX25hbWUpKQogJChycm9fYW5kcm9pZF9tYW5pZmVzdF9maWxlKTogUFJJVkFURV9QQUNLQUdFX05BTUUgOj0gJChlbmZvcmNlX3Jyb19zb3VyY2VfbWFuaWZlc3RfcGFja2FnZV9pbmZvKQotJChycm9fYW5kcm9pZF9tYW5pZmVzdF9maWxlKTogYnVpbGQvdG9vbHMvZ2VuZXJhdGUtZW5mb3JjZS1ycm8tYW5kcm9pZC1tYW5pZmVzdC5weQotCSQoaGlkZSkgYnVpbGQvdG9vbHMvZ2VuZXJhdGUtZW5mb3JjZS1ycm8tYW5kcm9pZC1tYW5pZmVzdC5weSAtdSAtcCAkKFBSSVZBVEVfUEFDS0FHRV9OQU1FKSAtbyAkQAorJChycm9fYW5kcm9pZF9tYW5pZmVzdF9maWxlKTogYnVpbGQvbWFrZS90b29scy9nZW5lcmF0ZS1lbmZvcmNlLXJyby1hbmRyb2lkLW1hbmlmZXN0LnB5CisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL2dlbmVyYXRlLWVuZm9yY2UtcnJvLWFuZHJvaWQtbWFuaWZlc3QucHkgLXUgLXAgJChQUklWQVRFX1BBQ0tBR0VfTkFNRSkgLW8gJEAKIGVsc2UKICQocnJvX2FuZHJvaWRfbWFuaWZlc3RfZmlsZSk6IFBSSVZBVEVfU09VUkNFX01BTklGRVNUX0ZJTEUgOj0gJChlbmZvcmNlX3Jyb19zb3VyY2VfbWFuaWZlc3RfcGFja2FnZV9pbmZvKQotJChycm9fYW5kcm9pZF9tYW5pZmVzdF9maWxlKTogJChlbmZvcmNlX3Jyb19zb3VyY2VfbWFuaWZlc3RfcGFja2FnZV9pbmZvKSBidWlsZC90b29scy9nZW5lcmF0ZS1lbmZvcmNlLXJyby1hbmRyb2lkLW1hbmlmZXN0LnB5Ci0JJChoaWRlKSBidWlsZC90b29scy9nZW5lcmF0ZS1lbmZvcmNlLXJyby1hbmRyb2lkLW1hbmlmZXN0LnB5IC1wICQoUFJJVkFURV9TT1VSQ0VfTUFOSUZFU1RfRklMRSkgLW8gJEAKKyQocnJvX2FuZHJvaWRfbWFuaWZlc3RfZmlsZSk6ICQoZW5mb3JjZV9ycm9fc291cmNlX21hbmlmZXN0X3BhY2thZ2VfaW5mbykgYnVpbGQvbWFrZS90b29scy9nZW5lcmF0ZS1lbmZvcmNlLXJyby1hbmRyb2lkLW1hbmlmZXN0LnB5CisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL2dlbmVyYXRlLWVuZm9yY2UtcnJvLWFuZHJvaWQtbWFuaWZlc3QucHkgLXAgJChQUklWQVRFX1NPVVJDRV9NQU5JRkVTVF9GSUxFKSAtbyAkQAogZW5kaWYKIAogTE9DQUxfUEFUSDo9ICQoaW50ZXJtZWRpYXRlcykKZGlmZiAtLWdpdCBhL2NvcmUvaGVscC5tayBiL2NvcmUvaGVscC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzNGU3OS4uMDAwMDAwMAotLS0gYS9jb3JlL2hlbHAubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0uUEhPTlk6IGhlbHAKLWhlbHA6Ci0JQGVjaG8KLQlAZWNobyAiQ29tbW9uIG1ha2UgdGFyZ2V0czoiCi0JQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0JQGVjaG8gImRyb2lkICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdGFyZ2V0IgotCUBlY2hvICJjbGVhbiAgICAgICAgICAgICAgICAgICAoYWthIGNsb2JiZXIpIGVxdWl2YWxlbnQgdG8gcm0gLXJmIG91dC8iCi0JQGVjaG8gInNub2QgICAgICAgICAgICAgICAgICAgIFF1aWNrbHkgcmVidWlsZCB0aGUgc3lzdGVtIGltYWdlIGZyb20gYnVpbHQgcGFja2FnZXMiCi0JQGVjaG8gInZub2QgICAgICAgICAgICAgICAgICAgIFF1aWNrbHkgcmVidWlsZCB0aGUgdmVuZG9yIGltYWdlIGZyb20gYnVpbHQgcGFja2FnZXMiCi0JQGVjaG8gIm9mZmxpbmUtc2RrLWRvY3MgICAgICAgIEdlbmVyYXRlIHRoZSBIVE1MIGZvciB0aGUgZGV2ZWxvcGVyIFNESyBkb2NzIgotCUBlY2hvICJkb2MtY29tbWVudC1jaGVjay1kb2NzICBDaGVjayBIVE1MIGRvYyBsaW5rcyAmIHZhbGlkaXR5LCB3aXRob3V0IGdlbmVyYXRpbmcgSFRNTCIKLQlAZWNobyAibGliYW5kcm9pZF9ydW50aW1lICAgICAgQWxsIHRoZSBKTkkgZnJhbWV3b3JrIHN0dWZmIgotCUBlY2hvICJmcmFtZXdvcmsgICAgICAgICAgICAgICBBbGwgdGhlIGphdmEgZnJhbWV3b3JrIHN0dWZmIgotCUBlY2hvICJzZXJ2aWNlcyAgICAgICAgICAgICAgICBUaGUgc3lzdGVtIHNlcnZlciAoSmF2YSkgYW5kIGZyaWVuZHMiCi0JQGVjaG8gImhlbHAgICAgICAgICAgICAgICAgICAgIFlvdSdyZSByZWFkaW5nIGl0IHJpZ2h0IG5vdyIKLQotLlBIT05ZOiBvdXQKLW91dDoKLQlAZWNobyAiSSdtIHN1cmUgeW91J3JlIG5pY2UgYW5kIGFsbCwgYnV0IG5vIHRoYW5rcy4iCmRpZmYgLS1naXQgYS9jb3JlL2hvc3RfZGFsdmlrX2phdmFfbGlicmFyeS5tayBiL2NvcmUvaG9zdF9kYWx2aWtfamF2YV9saWJyYXJ5Lm1rCmluZGV4IDRmMzA2OWYuLjIwNjYzZDEgMTAwNjQ0Ci0tLSBhL2NvcmUvaG9zdF9kYWx2aWtfamF2YV9saWJyYXJ5Lm1rCisrKyBiL2NvcmUvaG9zdF9kYWx2aWtfamF2YV9saWJyYXJ5Lm1rCkBAIC0yNCw1MyArMjQsMzkgQEAKIGlmZXEgKCQoSE9TVF9PUyksbGludXgpCiBVU0VfQ09SRV9MSUJfQk9PVENMQVNTUEFUSCA6PSB0cnVlCiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY29uZmlndXJlX2xvY2FsX2phY2subWsKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2hvc3RfamF2YV9saWJyYXJ5X2NvbW1vbi5tawogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLWlmZXEgKCQoTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWSksdHJ1ZSkKLSAgIyBGb3Igc3RhdGljIGxpYnJhcnksICQoTE9DQUxfQlVJTFRfTU9EVUxFKSBpcyAkKGZ1bGxfY2xhc3Nlc19qYWNrKS4KLSAgTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gY2xhc3Nlcy5qYWNrCi1lbmRpZgotZW5kaWYKIAotaWZuZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQotICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSAgY29yZS1vai1ob3N0ZGV4IGNvcmUtbGliYXJ0LWhvc3RkZXggJChMT0NBTF9KQVZBX0xJQlJBUklFUykKLWVuZGlmCi0KK2Z1bGxfY2xhc3Nlc190dXJiaW5lX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLXR1cmJpbmUuamFyCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phcmphciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci1qYXJqYXIuamFyCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKIGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1mdWxsLWRlYnVnLmphcgorZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWNvbWJpbmVkLmphcgogZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2Rlc3VnYXIuY2xhc3Nlcy5qYXIKIGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtamFyamFyLmphcgogZnVsbF9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgotZnVsbF9jbGFzc2VzX2phY2sgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5qYWNrCi1qYWNrX2NoZWNrX3RpbWVzdGFtcCA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYWNrLmNoZWNrLnRpbWVzdGFtcAogYnVpbHRfZGV4IDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuZGV4CitqYXZhX3NvdXJjZV9saXN0X2ZpbGUgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamF2YS1zb3VyY2UtbGlzdAogCiBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSBcCisgICAgJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpIFwKICAgICAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpIFwKKyAgICAkKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpIFwKICAgICAkKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcikgXAogICAgICQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpIFwKLSAgICAkKGZ1bGxfY2xhc3Nlc19qYWNrKSBcCiAgICAgJChmdWxsX2NsYXNzZXNfamFyKSBcCi0gICAgJChqYWNrX2NoZWNrX3RpbWVzdGFtcCkgXAotICAgICQoYnVpbHRfZGV4KQorICAgICQoYnVpbHRfZGV4KSBcCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpCiAKICMgU2VlIGNvbW1lbnQgaW4gamF2YS5tawogaWZuZGVmIExPQ0FMX0NIRUNLRURfTU9EVUxFCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLUxPQ0FMX0NIRUNLRURfTU9EVUxFIDo9ICQoamFja19jaGVja190aW1lc3RhbXApCi1lbHNlCiBpZmVxICgkKExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkpLHRydWUpCiBMT0NBTF9DSEVDS0VEX01PRFVMRSA6PSAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCiBlbHNlCiBMT0NBTF9DSEVDS0VEX01PRFVMRSA6PSAkKGJ1aWx0X2RleCkKIGVuZGlmCiBlbmRpZgotZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCkBAIC04MSw1MSArNjcsMTA3IEBACiAKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2phdmFfY29tbW9uLm1rCiAKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Nka19jaGVjay5taworCiAkKGNsZWFudGFyZ2V0KTogUFJJVkFURV9DTEVBTl9GSUxFUyArPSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKQogCi1pZm5kZWYgTE9DQUxfSkFDS19FTkFCTEVECisjIExpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciBhbnl0aGluZyB0aGF0IG5lZWRzIGFsbCBqYXZhIHNvdXJjZXMgaW4gcGxhY2UKK2phdmFfc291cmNlc19kZXBzIDo9IFwKKyAgICAkKGphdmFfc291cmNlcykgXAorICAgICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKSBcCisgICAgJChwcm90b19qYXZhX3NvdXJjZXNfZmlsZV9zdGFtcCkgXAorICAgICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCisKKyQoamF2YV9zb3VyY2VfbGlzdF9maWxlKTogJChqYXZhX3NvdXJjZXNfZGVwcykKKwkkKHdyaXRlLWphdmEtc291cmNlLWxpc3QpCiAKICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFWQV9MQVlFUlNfRklMRSA6PSAkKGxheWVyc19maWxlKQotJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVZBQ0ZMQUdTIDo9ICQoR0xPQkFMX0pBVkFDX0RFQlVHX0ZMQUdTKSAkKExPQ0FMX0pBVkFDRkxBR1MpICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MpCiskKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBVkFDRkxBR1MgOj0gJChMT0NBTF9KQVZBQ0ZMQUdTKSAkKGFubm90YXRpb25fcHJvY2Vzc29yX2ZsYWdzKQogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVJfRVhDTFVERV9GSUxFUyA6PQogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVJfUEFDS0FHRVMgOj0KICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFSX0VYQ0xVREVfUEFDS0FHRVMgOj0KICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFwKLSAgICAgICAgJChqYXZhX3NvdXJjZXMpIFwKLSAgICAgICAgJChqYXZhX3Jlc291cmNlX3NvdXJjZXMpIFwKLSAgICAgICAgJChmdWxsX2phdmFfbGliX2RlcHMpIFwKLSAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgXAotICAgICAgICAkKHByb3RvX2phdmFfc291cmNlc19maWxlX3N0YW1wKSBcCi0gICAgICAgICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZGVwcykgXAotICAgICAgICAkKE5PUk1BTElaRV9QQVRIKSBcCi0gICAgICAgICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpIFwKLSAgICAgICAgfCAkKFNPT05HX0pBVkFDX1dSQVBQRVIpCi0JJCh0cmFuc2Zvcm0taG9zdC1qYXZhLXRvLXBhY2thZ2UpCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpIFwKKyAgICAkKGphdmFfc291cmNlc19kZXBzKSBcCisgICAgJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9zeXN0ZW1fbW9kdWxlc19kZXBzKSBcCisgICAgJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9kZXBzKSBcCisgICAgJChOT1JNQUxJWkVfUEFUSCkgXAorICAgICQoSkFSX0FSR1MpIFwKKyAgICB8ICQoU09PTkdfSkFWQUNfV1JBUFBFUikKKwkkKHRyYW5zZm9ybS1ob3N0LWphdmEtdG8tZGFsdmlrLXBhY2thZ2UpCiAKLW15X2Rlc3VnYXJpbmcgOj0KLWlmZXEgKCQoTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OKSwxLjgpCi1teV9kZXN1Z2FyaW5nIDo9IHRydWUKLSQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKTogUFJJVkFURV9EWF9GTEFHUyA6PSAkKExPQ0FMX0RYX0ZMQUdTKQotJChmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpICQoREVTVUdBUikKLQkkKGRlc3VnYXItY2xhc3Nlcy1qYXIpCitpZm5lcSAoJChUVVJCSU5FX0VOQUJMRUQpLGZhbHNlKQorCiskKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcik6IFBSSVZBVEVfSkFWQUNGTEFHUyA6PSAkKExPQ0FMX0pBVkFDRkxBR1MpICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MpCiskKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcik6IFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GIDo9ICQoTE9DQUxfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GKQorJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpOiBcCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpIFwKKyAgICAkKGphdmFfc291cmNlc19kZXBzKSBcCisgICAgJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMpIFwKKyAgICAkKE5PUk1BTElaRV9QQVRIKSBcCisgICAgJChKQVJfQVJHUykgXAorICAgICQoWklQVElNRSkgXAorICAgIHwgJChUVVJCSU5FKSBcCisgICAgJChNRVJHRV9aSVBTKQorCSQodHJhbnNmb3JtLWphdmEtdG8taGVhZGVyLmphcikKKworLktBVElfUkVTVEFUOiAkKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcikKKworIyBSdW4gamFyamFyIGJlZm9yZSBnZW5lcmF0ZSBjbGFzc2VzLWhlYWRlci5qYXIgaWYgbmVjZXNzYXJ5LgoraWZuZXEgKCQoc3RyaXAgJChMT0NBTF9KQVJKQVJfUlVMRVMpKSwpCiskKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyamFyKTogUFJJVkFURV9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9KQVJKQVJfUlVMRVMpCiskKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyamFyKTogJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSB8ICQoSkFSSkFSKQorCUBlY2hvIEhlYWRlciBKYXJKYXI6ICRACisJJChoaWRlKSAkKEpBVkEpIC1qYXIgJChKQVJKQVIpIHByb2Nlc3MgJChQUklWQVRFX0pBUkpBUl9SVUxFUykgJDwgJEAKK2Vsc2UKK2Z1bGxfY2xhc3Nlc19oZWFkZXJfamFyamFyIDo9ICQoZnVsbF9jbGFzc2VzX3R1cmJpbmVfamFyKQogZW5kaWYKIAotaWZuZGVmIG15X2Rlc3VnYXJpbmcKLWZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCi1lbmRpZgorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXJqYXIpLCQoZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIpKSkKKworZW5kaWYgIyBUVVJCSU5FX0VOQUJMRUQgIT0gZmFsc2UKKworJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKTogUFJJVkFURV9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYgOj0gJChMT0NBTF9ET05UX0RFTEVURV9KQVJfTUVUQV9JTkYpCiskKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoamFyX21hbmlmZXN0X2ZpbGUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZnVsbF9zdGF0aWNfamF2YV9saWJzKSAgfCAkKE1FUkdFX1pJUFMpCisJJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwgJChoaWRlKSBzZWQgLWUgInMvJUJVSUxEX05VTUJFUiUvJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKS8iIFwKKyAgICAgICAgICAgICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpID4gJChkaXIgJEApL21hbmlmZXN0Lm1mKQorCSQoTUVSR0VfWklQUykgLWogLS1pZ25vcmUtZHVwbGljYXRlcyAkKGlmICQoUFJJVkFURV9KQVJfTUFOSUZFU1QpLC1tICQoZGlyICRAKS9tYW5pZmVzdC5tZikgXAorICAgICAgICAgICAgJChpZiAkKFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GKSwsLXN0cmlwRGlyIE1FVEEtSU5GIC16aXBUb05vdFN0cmlwICQ8KSBcCisgICAgICAgICAgICAkQCAkPCAkKGNhbGwgcmV2ZXJzZS1saXN0LCQoUFJJVkFURV9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpKQogCiAjIFJ1biBqYXJqYXIgaWYgbmVjZXNzYXJ5LCBvdGhlcndpc2UganVzdCBjb3B5IHRoZSBmaWxlLgogaWZuZXEgKCQoc3RyaXAgJChMT0NBTF9KQVJKQVJfUlVMRVMpKSwpCiAkKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKTogUFJJVkFURV9KQVJKQVJfUlVMRVMgOj0gJChMT0NBTF9KQVJKQVJfUlVMRVMpCi0kKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKTogJChmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSB8ICQoSkFSSkFSKQorJChmdWxsX2NsYXNzZXNfamFyamFyX2phcik6ICQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcikgJChMT0NBTF9KQVJKQVJfUlVMRVMpIHwgJChKQVJKQVIpCiAJQGVjaG8gSmFySmFyOiAkQAogCSQoaGlkZSkgJChKQVZBKSAtamFyICQoSkFSSkFSKSBwcm9jZXNzICQoUFJJVkFURV9KQVJKQVJfUlVMRVMpICQ8ICRACiBlbHNlCi1mdWxsX2NsYXNzZXNfamFyamFyX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcikKK2Z1bGxfY2xhc3Nlc19qYXJqYXJfamFyIDo9ICQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcikKIGVuZGlmCiAKICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKSwkKGZ1bGxfY2xhc3Nlc19qYXIpKSkKIAoraWZuZXEgKCQoVVNFX0Q4X0RFU1VHQVIpLHRydWUpCitteV9kZXN1Z2FyaW5nIDo9CitpZmVxICgkKExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiksMS44KQorbXlfZGVzdWdhcmluZyA6PSB0cnVlCiskKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcik6IFBSSVZBVEVfRFhfRkxBR1MgOj0gJChMT0NBTF9EWF9GTEFHUykKKyQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKTogJChmdWxsX2NsYXNzZXNfamFyKSAkKGZ1bGxfamF2YV9oZWFkZXJfbGlicykgJChERVNVR0FSKQorCSQoZGVzdWdhci1jbGFzc2VzLWphcikKK2VuZGlmCitlbHNlCitteV9kZXN1Z2FyaW5nIDo9CitlbmRpZgorCitpZm5kZWYgbXlfZGVzdWdhcmluZworZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyIDo9ICQoZnVsbF9jbGFzc2VzX2phcikKK2VuZGlmCisKIGlmZXEgKCQoTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWSksdHJ1ZSkKICMgTm8gZGV4OyBhbGwgd2Ugd2FudCBhcmUgdGhlIC5jbGFzcyBmaWxlcyB3aXRoIHJlc291cmNlcy4KICQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKQpAQCAtMTM2LDggKzE3OCwxMiBAQAogZWxzZSAjICFMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCiAkKGJ1aWx0X2RleCk6IFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikKICQoYnVpbHRfZGV4KTogUFJJVkFURV9EWF9GTEFHUyA6PSAkKExPQ0FMX0RYX0ZMQUdTKQotJChidWlsdF9kZXgpOiAkKGZ1bGxfY2xhc3Nlc19qYXIpICQoRFgpCiskKGJ1aWx0X2RleCk6ICQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKSAkKERYKSAkKFpJUDJaSVApCitpZm5lcSAoJChVU0VfRDhfREVTVUdBUiksdHJ1ZSkKIAkkKHRyYW5zZm9ybS1jbGFzc2VzLmphci10by1kZXgpCitlbHNlCisJJCh0cmFuc2Zvcm0tY2xhc3Nlcy1kOC5qYXItdG8tZGV4KQorZW5kaWYKIAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0RFWF9GSUxFIDo9ICQoYnVpbHRfZGV4KQogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1NPVVJDRV9BUkNISVZFIDo9ICQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpCkBAIC0xNDksNjcgKzE5NSwyMyBAQAogCiBlbmRpZiAjICFMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCiAKLWlmbmVxICgsJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQoTE9DQUxfU0RLX1ZFUlNJT04pCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9TREtfVkVSU0lPTiA6PSAkKExPQ0FMX1NES19WRVJTSU9OKQoraWZuZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQgY29yZV9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCisgIG15X2RlZmF1bHRfYXBwX3RhcmdldF9zZGsgOj0gJChjYWxsIGdldC1udW1lcmljLXNkay12ZXJzaW9uLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQorICBteV9zZGtfdmVyc2lvbiA6PSAkKGNhbGwgZ2V0LW51bWVyaWMtc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpCiBlbHNlCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQoREVGQVVMVF9BUFBfVEFSR0VUX1NESykKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NES19WRVJTSU9OIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgIG15X2RlZmF1bHRfYXBwX3RhcmdldF9zZGsgOj0gJChERUZBVUxUX0FQUF9UQVJHRVRfU0RLKQorICBteV9zZGtfdmVyc2lvbiA6PSAkKFBMQVRGT1JNX1NES19WRVJTSU9OKQogZW5kaWYKIAotZWxzZSAjIExPQ0FMX0pBQ0tfRU5BQkxFRAotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFwKLSAgUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY2stcnNjCi0KLWlmZXEgKCQoTE9DQUxfSkFDS19FTkFCTEVEKSxpbmNyZW1lbnRhbCkKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBcCi0gIFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjay1pbmNyZW1lbnRhbAoraWZkZWYgTE9DQUxfTUlOX1NES19WRVJTSU9OCisgIG15X21pbl9zZGtfdmVyc2lvbiA6PSAkKExPQ0FMX01JTl9TREtfVkVSU0lPTikKIGVsc2UKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBcCi0gIFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIgOj0KKyAgbXlfbWluX3Nka192ZXJzaW9uIDo9ICQoY2FsbCBjb2RlbmFtZS1vci1zZGstdG8tc2RrLCQobXlfZGVmYXVsdF9hcHBfdGFyZ2V0X3NkaykpCiBlbmRpZgotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFDS19GTEFHUyA6PSAkKEdMT0JBTF9KQVZBQ19ERUJVR19GTEFHUykgJChMT0NBTF9KQUNLX0ZMQUdTKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFDS19WRVJTSU9OIDo9ICQoTE9DQUxfSkFDS19WRVJTSU9OKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFDS19NSU5fU0RLX1ZFUlNJT04gOj0gJChQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTikKIAotamFja19hbGxfZGVwcyA6PSAkKGphdmFfc291cmNlcykgJChqYXZhX3Jlc291cmNlX3NvdXJjZXMpICQoZnVsbF9qYWNrX2RlcHMpIFwKLSAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgJChwcm90b19qYXZhX3NvdXJjZXNfZmlsZV9zdGFtcCkgXAotICAgICAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSAkKE5PUk1BTElaRV9QQVRIKSAkKEpBQ0tfREVGQVVMVF9BUkdTKSAkKEpBQ0spCi0KLWlmbmVxICgkKExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkpLHRydWUpCi0kKGJ1aWx0X2RleCk6IFBSSVZBVEVfQ0xBU1NFU19KQUNLIDo9ICQoZnVsbF9jbGFzc2VzX2phY2spCi0kKGJ1aWx0X2RleCk6IFBSSVZBVEVfSkFDS19QTFVHSU5fUEFUSCA6PSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpCi0kKGJ1aWx0X2RleCk6IFBSSVZBVEVfSkFDS19QTFVHSU4gOj0gJChMT0NBTF9KQUNLX1BMVUdJTikKLSQoYnVpbHRfZGV4KTogJChqYWNrX2FsbF9kZXBzKSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpIHwgc2V0dXAtamFjay1zZXJ2ZXIKLQlAZWNobyBCdWlsZGluZyB3aXRoIEphY2s6ICRACi0JJChqYWNrLWphdmEtdG8tZGV4KQotCi0jICQoZnVsbF9jbGFzc2VzX2phY2spIGlzIGp1c3QgYnktcHJvZHVjdCBvZiAkKGJ1aWx0X2RleCkuCi0jIFRoZSBkdW1teSBjb21tYW5kIHdhcyBhZGRlZCBiZWNhdXNlLCB3aXRob3V0IGl0LCBtYWtlIG1pc3NlcyB0aGUgZmFjdCB0aGUgJChidWlsdF9kZXgpIGFsc28KLSMgY2hhbmdlICQoZnVsbF9jbGFzc2VzX2phY2spLgotJChmdWxsX2NsYXNzZXNfamFjayk6ICQoYnVpbHRfZGV4KQotCSQoaGlkZSkgdG91Y2ggJEAKLQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0RFWF9GSUxFIDo9ICQoYnVpbHRfZGV4KQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGJ1aWx0X2RleCkgJChqYXZhX3Jlc291cmNlX3NvdXJjZXMpCi0JQGVjaG8gIkhvc3QgSmFyOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgotCSQoY3JlYXRlLWVtcHR5LXBhY2thZ2UpCi0JJChhZGQtZGV4LXRvLXBhY2thZ2UpCi0JJChhZGQtY2FycmllZC1qYWNrLXJlc291cmNlcykKLQotZWxzZSAgIyBMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCi0kKGZ1bGxfY2xhc3Nlc19qYWNrKTogUFJJVkFURV9KQUNLX1BMVUdJTl9QQVRIIDo9ICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkKLSQoZnVsbF9jbGFzc2VzX2phY2spOiBQUklWQVRFX0pBQ0tfUExVR0lOIDo9ICQoTE9DQUxfSkFDS19QTFVHSU4pCi0kKGZ1bGxfY2xhc3Nlc19qYWNrKTogJChqYWNrX2FsbF9kZXBzKSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpIHwgc2V0dXAtamFjay1zZXJ2ZXIKLQlAZWNobyBCdWlsZGluZyB3aXRoIEphY2s6ICRACi0JJChqYXZhLXRvLWphY2spCi0KLWVuZGlmICAjIExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkKLQotJChqYWNrX2NoZWNrX3RpbWVzdGFtcCk6ICQoamFja19hbGxfZGVwcykgfCBzZXR1cC1qYWNrLXNlcnZlcgotCUBlY2hvIENoZWNraW5nIGJ1aWxkIHdpdGggSmFjazogJEAKLQkkKGphY2stY2hlY2stamF2YSkKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQobXlfZGVmYXVsdF9hcHBfdGFyZ2V0X3NkaykKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NES19WRVJTSU9OIDo9ICQobXlfc2RrX3ZlcnNpb24pCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9NSU5fU0RLX1ZFUlNJT04gOj0gJChteV9taW5fc2RrX3ZlcnNpb24pCiAKIFVTRV9DT1JFX0xJQl9CT09UQ0xBU1NQQVRIIDo9CiAKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9leGVjdXRhYmxlX2ludGVybmFsLm1rIGIvY29yZS9ob3N0X2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKaW5kZXggMTkyMDBmZC4uYzRmOWY2NiAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKKysrIGIvY29yZS9ob3N0X2V4ZWN1dGFibGVfaW50ZXJuYWwubWsKQEAgLTEyLDcgKzEyLDkgQEAKIExPQ0FMX01PRFVMRV9TVUZGSVggOj0gJCgkKG15X3ByZWZpeClFWEVDVVRBQkxFX1NVRkZJWCkKIGVuZGlmCiAKK2lmZGVmIGhvc3QtZXhlY3V0YWJsZS1ob29rCiAkKGNhbGwgaG9zdC1leGVjdXRhYmxlLWhvb2spCitlbmRpZgogCiBza2lwX2J1aWxkX2Zyb21fc291cmNlIDo9CiBpZmRlZiBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRQpkaWZmIC0tZ2l0IGEvY29yZS9ob3N0X2Z1enpfdGVzdC5tayBiL2NvcmUvaG9zdF9mdXp6X3Rlc3QubWsKaW5kZXggODYyMjkxMS4uNTU2ZTAyZiAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X2Z1enpfdGVzdC5taworKysgYi9jb3JlL2hvc3RfZnV6el90ZXN0Lm1rCkBAIC00LDcgKzQsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAkKGNhbGwgcmVjb3JkLW1vZHVsZS10eXBlLEhPU1RfRlVaWl9URVNUKQogCi1MT0NBTF9DRkxBR1MgKz0gLWZzYW5pdGl6ZS1jb3ZlcmFnZT10cmFjZS1wYy1ndWFyZAorTE9DQUxfQ0ZMQUdTICs9IC1mc2FuaXRpemUtY292ZXJhZ2U9dHJhY2UtcGMtZ3VhcmQsaW5kaXJlY3QtY2FsbHMsdHJhY2UtY21wCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYkxMVk1GdXp6ZXIKIAogaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnkubWsgYi9jb3JlL2hvc3RfamF2YV9saWJyYXJ5Lm1rCmluZGV4IGE2OGJlNmEuLjQ3NDA0YzggMTAwNjQ0Ci0tLSBhL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnkubWsKKysrIGIvY29yZS9ob3N0X2phdmFfbGlicmFyeS5tawpAQCAtMzQsMTAgKzM0LDE1IEBACiBmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtZnVsbC1kZWJ1Zy5qYXIKIGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtamFyamFyLmphcgogZnVsbF9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgoramF2YV9zb3VyY2VfbGlzdF9maWxlIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phdmEtc291cmNlLWxpc3QKK2Z1bGxfY2xhc3Nlc19oZWFkZXJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtaGVhZGVyLmphcgorZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWNvbWJpbmVkLmphcgogCiBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSBcCiAgICAgJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKSBcCiAgICAgJChmdWxsX2NsYXNzZXNfamFyamFyX2phcikgXAorICAgICQoamF2YV9zb3VyY2VfbGlzdF9maWxlKSBcCisgICAgJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKQEAgLTUwLDUzICs1NSw3NCBAQAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvamF2YV9jb21tb24ubWsKIAogIyBUaGUgbGF5ZXJzIGZpbGUgYWxsb3dzIHlvdSB0byBlbmZvcmNlIGEgbGF5ZXJpbmcgYmV0d2VlbiBqYXZhIHBhY2thZ2VzLgotIyBSdW4gYnVpbGQvdG9vbHMvamF2YS1sYXllcnMucHkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUnVuIGJ1aWxkL21ha2UvdG9vbHMvamF2YS1sYXllcnMucHkgZm9yIG1vcmUgZGV0YWlscy4KIGxheWVyc19maWxlIDo9ICQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCAkKExPQ0FMX0pBVkFfTEFZRVJTX0ZJTEUpKQogCi0jIElmIGVycm9yIHByb25lIGlzIGVuYWJsZWQgdGhlbiBhZGQgTE9DQUxfRVJST1JfUFJPTkVfRkxBR1MgdG8gTE9DQUxfSkFWQUNGTEFHUwotaWZlcSAoJChSVU5fRVJST1JfUFJPTkUpLHRydWUpCi1MT0NBTF9KQVZBQ0ZMQUdTICs9ICQoTE9DQUxfRVJST1JfUFJPTkVfRkxBR1MpCi1lbmRpZgorIyBMaXN0IG9mIGRlcGVuZGVuY2llcyBmb3IgYW55dGhpbmcgdGhhdCBuZWVkcyBhbGwgamF2YSBzb3VyY2VzIGluIHBsYWNlCitqYXZhX3NvdXJjZXNfZGVwcyA6PSBcCisgICAgJChqYXZhX3NvdXJjZXMpIFwKKyAgICAkKGphdmFfcmVzb3VyY2Vfc291cmNlcykgXAorICAgICQocHJvdG9famF2YV9zb3VyY2VzX2ZpbGVfc3RhbXApIFwKKyAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQorCiskKGphdmFfc291cmNlX2xpc3RfZmlsZSk6ICQoamF2YV9zb3VyY2VzX2RlcHMpCisJJCh3cml0ZS1qYXZhLXNvdXJjZS1saXN0KQogCiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBVkFfTEFZRVJTX0ZJTEUgOj0gJChsYXllcnNfZmlsZSkKLSQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFWQUNGTEFHUyA6PSAkKEdMT0JBTF9KQVZBQ19ERUJVR19GTEFHUykgJChMT0NBTF9KQVZBQ0ZMQUdTKSAkKGFubm90YXRpb25fcHJvY2Vzc29yX2ZsYWdzKQorJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVZBQ0ZMQUdTIDo9ICQoTE9DQUxfSkFWQUNGTEFHUykgJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9mbGFncykKICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFSX0VYQ0xVREVfRklMRVMgOj0KICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFSX1BBQ0tBR0VTIDo9CiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBUl9FWENMVURFX1BBQ0tBR0VTIDo9CiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBcCi0gICAgICAgICQoamF2YV9zb3VyY2VzKSBcCi0gICAgICAgICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKSBcCi0gICAgICAgICQoZnVsbF9qYXZhX2xpYl9kZXBzKSBcCi0gICAgICAgICQoamFyX21hbmlmZXN0X2ZpbGUpIFwKLSAgICAgICAgJChwcm90b19qYXZhX3NvdXJjZXNfZmlsZV9zdGFtcCkgXAotICAgICAgICAkKGFubm90YXRpb25fcHJvY2Vzc29yX2RlcHMpIFwKLSAgICAgICAgJChOT1JNQUxJWkVfUEFUSCkgXAotICAgICAgICAkKFpJUFRJTUUpIFwKLSAgICAgICAgJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykgXAotICAgICAgICB8ICQoU09PTkdfSkFWQUNfV1JBUFBFUikKKyAgICAkKGphdmFfc291cmNlX2xpc3RfZmlsZSkgXAorICAgICQoamF2YV9zb3VyY2VzX2RlcHMpIFwKKyAgICAkKGZ1bGxfamF2YV9saWJzKSBcCisgICAgJChmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzKSBcCisgICAgJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9kZXBzKSBcCisgICAgJChOT1JNQUxJWkVfUEFUSCkgXAorICAgICQoWklQVElNRSkgXAorICAgICQoSkFSX0FSR1MpIFwKKyAgICB8ICQoU09PTkdfSkFWQUNfV1JBUFBFUikKIAkkKHRyYW5zZm9ybS1ob3N0LWphdmEtdG8tcGFja2FnZSkKIAkkKHJlbW92ZS10aW1lc3RhbXBzLWZyb20tcGFja2FnZSkKIAogamF2YWMtY2hlY2sgOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCiBqYXZhYy1jaGVjay0kKExPQ0FMX01PRFVMRSkgOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCiAKKyQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcik6ICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmdWxsX3N0YXRpY19qYXZhX2xpYnMpIHwgJChNRVJHRV9aSVBTKQorCSQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksICQoaGlkZSkgc2VkIC1lICJzLyVCVUlMRF9OVU1CRVIlLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkvIiBcCisgICAgICAgICAgICAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSA+ICQoZGlyICRAKS9tYW5pZmVzdC5tZikKKwkkKE1FUkdFX1pJUFMpIC1qIC0taWdub3JlLWR1cGxpY2F0ZXMgJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwtbSAkKGRpciAkQCkvbWFuaWZlc3QubWYpIFwKKyAgICAgICAgICAgIC1zdHJpcERpciBNRVRBLUlORiAtemlwVG9Ob3RTdHJpcCAkPCAkQCAkPCAkKGNhbGwgcmV2ZXJzZS1saXN0LCQoUFJJVkFURV9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0xPQ0FMX0pFVElGSUVSX0lOUFVUX0ZJTEUgOj0gJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKQorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9qZXRpZmllci5taworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKICMgUnVuIGphcmphciBpZiBuZWNlc3NhcnksIG90aGVyd2lzZSBqdXN0IGNvcHkgdGhlIGZpbGUuCiBpZm5lcSAoJChzdHJpcCAkKExPQ0FMX0pBUkpBUl9SVUxFUykpLCkKICQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpOiBQUklWQVRFX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX0pBUkpBUl9SVUxFUykKLSQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSB8ICQoSkFSSkFSKQorJChmdWxsX2NsYXNzZXNfamFyamFyX2phcik6ICQoTE9DQUxfSkVUSUZJRVJfT1VUUFVUX0ZJTEUpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSB8ICQoSkFSSkFSKQogCUBlY2hvIEphckphcjogJEAKIAkkKGhpZGUpICQoSkFWQSkgLWphciAkKEpBUkpBUikgcHJvY2VzcyAkKFBSSVZBVEVfSkFSSkFSX1JVTEVTKSAkPCAkQAogZWxzZQotZnVsbF9jbGFzc2VzX2phcmphcl9qYXIgOj0gJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKQorZnVsbF9jbGFzc2VzX2phcmphcl9qYXIgOj0gJChmdWxsX2NsYXNzZXNfY29tYmluZWRfamFyKQogZW5kaWYKIAogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIExPQ0FMX0ZVTExfQ0xBU1NFU19QUkVfSkFDT0NPX0pBUiA6PSAkKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKQogCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2phY29jby5tawogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVIpLCQoZnVsbF9jbGFzc2VzX2phcikpKQogCitpZmVxICgkKFRVUkJJTkVfRU5BQkxFRCksZmFsc2UpCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUiksJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcikpKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvaG9zdF9qYXZhX2xpYnJhcnlfY29tbW9uLm1rIGIvY29yZS9ob3N0X2phdmFfbGlicmFyeV9jb21tb24ubWsKaW5kZXggOGRmNGIzNy4uNTFlMmQ5NCAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X2phdmFfbGlicmFyeV9jb21tb24ubWsKKysrIGIvY29yZS9ob3N0X2phdmFfbGlicmFyeV9jb21tb24ubWsKQEAgLTQ4LDMgKzQ4LDggQEAKIAogTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRV9ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjCiBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSAkKHNvcnQgJChMT0NBTF9KQVZBX0xJQlJBUklFUykpCisKKyMgSWYgZXJyb3IgcHJvbmUgaXMgZW5hYmxlZCB0aGVuIGFkZCBMT0NBTF9FUlJPUl9QUk9ORV9GTEFHUyB0byBMT0NBTF9KQVZBQ0ZMQUdTCitpZmVxICgkKFJVTl9FUlJPUl9QUk9ORSksdHJ1ZSkKK0xPQ0FMX0pBVkFDRkxBR1MgKz0gJChMT0NBTF9FUlJPUl9QUk9ORV9GTEFHUykKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2hvc3Rfc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL2hvc3Rfc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKaW5kZXggYmZiZGUyMS4uMGEzYjMxNyAxMDA2NDQKLS0tIGEvY29yZS9ob3N0X3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCisrKyBiL2NvcmUvaG9zdF9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtMjAsNyArMjAsOSBAQAogJChlcnJvciAkKExPQ0FMX1BBVEgpOiBDYW5ub3Qgc2V0IG1vZHVsZSBzdGVtIGZvciBhIGxpYnJhcnkpCiBlbmRpZgogCitpZmRlZiBob3N0LXNoYXJlZC1saWJyYXJ5LWhvb2sKICQoY2FsbCBob3N0LXNoYXJlZC1saWJyYXJ5LWhvb2spCitlbmRpZgogCiBza2lwX2J1aWxkX2Zyb21fc291cmNlIDo9CiBpZmRlZiBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRQpAQCAtMzksNyArNDEsNyBAQAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmluYXJ5Lm1rCiAKIG15X2hvc3RfbGlicHJvZmlsZV9ydCA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCkkKG15X3ByZWZpeClMSUJQUk9GSUxFX1JUKQotJChMT0NBTF9CVUlMRF9NT0RVTEUpOiBQUklWQVRFX0hPU1RfTElCUFJPRklMRV9SVCA6PSAkKG15X2hvc3RfbGlicHJvZmlsZV9ydCkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9IT1NUX0xJQlBST0ZJTEVfUlQgOj0gJChteV9ob3N0X2xpYnByb2ZpbGVfcnQpCiAKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogXAogICAgICAgICAkKGFsbF9vYmplY3RzKSBcCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9Cb2FyZENvbmZpZy5tayBiL2NvcmUvaG9zdF90ZXN0X2NvbmZpZy5tawpzaW1pbGFyaXR5IGluZGV4IDY4JQpjb3B5IGZyb20gdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsKY29weSB0byBjb3JlL2hvc3RfdGVzdF9jb25maWcubWsKaW5kZXggMDE2OTM3YS4uYjk5NzVlNSAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsKKysrIGIvY29yZS9ob3N0X3Rlc3RfY29uZmlnLm1rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTAgKzE0LDEyIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbmNsdWRlIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljL0JvYXJkQ29uZmlnLm1rCisjCisjIENvbW1vbiBydWxlcyBmb3IgYnVpbGRpbmcgYSBUcmFkZUZlZCB0ZXN0IFhNTCBmaWxlIGZvciBob3N0IHNpZGUgdGVzdHMuCisjCiAKLVRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjV0ZQotVEFSR0VUX0NQVV9BQkkgOj0gYXJtZWFiaQotVEFSR0VUX0NQVV9BQkkyIDo9CiskKGNhbGwgcmVjb3JkLW1vZHVsZS10eXBlLEhPU1RfVEVTVF9DT05GSUcpCiAKLVdJVEhfREVYUFJFT1BUIDo9IGZhbHNlCitMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rlc3RfY29uZmlnX2NvbW1vbi5tawpkaWZmIC0tZ2l0IGEvY29yZS9ob3N0X3Rlc3RfaW50ZXJuYWwubWsgYi9jb3JlL2hvc3RfdGVzdF9pbnRlcm5hbC5tawppbmRleCBmZmIyMmM3Li40MmUwMWUxIDEwMDY0NAotLS0gYS9jb3JlL2hvc3RfdGVzdF9pbnRlcm5hbC5taworKysgYi9jb3JlL2hvc3RfdGVzdF9pbnRlcm5hbC5tawpAQCAtNSw5ICs1LDcgQEAKIGlmZXEgKCQoTE9DQUxfR1RFU1QpLHRydWUpCiAgIExPQ0FMX0NGTEFHU193aW5kb3dzICs9IC1ER1RFU1RfT1NfV0lORE9XUwogICBMT0NBTF9DRkxBR1NfbGludXggKz0gLURHVEVTVF9PU19MSU5VWAotICBMT0NBTF9MRExJQlNfbGludXggKz0gLWxwdGhyZWFkCiAgIExPQ0FMX0NGTEFHU19kYXJ3aW4gKz0gLURHVEVTVF9PU19NQUMKLSAgTE9DQUxfTERMSUJTX2RhcndpbiArPSAtbHB0aHJlYWQKIAogICBMT0NBTF9DRkxBR1MgKz0gLURHVEVTVF9IQVNfU1REX1NUUklORyAtTzAgLWcKIApkaWZmIC0tZ2l0IGEvY29yZS9pbnN0YWxsX2puaV9saWJzLm1rIGIvY29yZS9pbnN0YWxsX2puaV9saWJzLm1rCmluZGV4IGU4OGRiNDAuLmI3ZDgzZGMgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5zdGFsbF9qbmlfbGlicy5taworKysgYi9jb3JlL2luc3RhbGxfam5pX2xpYnMubWsKQEAgLTE4LDE5ICsxOCw5IEBACiBpZm5lcSAoJChmaWx0ZXIgdGVzdHMgc2FtcGxlcywgJChMT0NBTF9NT0RVTEVfVEFHUykpLCkKIG15X2VtYmVkX2puaSA6PSB0cnVlCiBlbmRpZgotaWZlcSAoJChQUk9EVUNUX0ZVTExfVFJFQkxFKSx0cnVlKQotICBpZmVxICgkKGZpbHRlciAkKFRBUkdFVF9PVVQpLyUsICQobXlfbW9kdWxlX3BhdGgpKSwpCi0gICAgIyBJZiB0aGlzIGFwcCBpc24ndCB0byBiZSBpbnN0YWxsZWQgdG8gdGhlIHN5c3RlbSBwYXJ0aXRpb24sIGFuZCB0aGUgZGV2aWNlCi0gICAgIyBpcyBmdWxseSB0cmVibGUtaXplZCB0aGVuIGpuaSBsaWJzIGFyZSBlbWJlZGRlZCwgT3RoZXJ3aXNlLCBhY2Nlc3MgdG8gdGhlCi0gICAgIyBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpYiBpcyBpbnN0YWxsZWQgdG8gKHVzdWFsbHkgL3ZlbmRvci9saWIpIG5lZWRzIHRvIGJlCi0gICAgIyBhbGxvd2VkIGZvciBzeXN0ZW0gcHJvY2Vzc2VzLCB3aGljaCBpcyBhIFRyZWJsZSB2aW9sYXRpb24uCi0gICAgbXlfZW1iZWRfam5pIDo9IHRydWUKLSAgZW5kaWYKLWVsc2UKLSAgaWZlcSAoJChmaWx0ZXIgJChUQVJHRVRfT1VUKS8lICQoVEFSR0VUX09VVF9WRU5ET1IpLyUgJChUQVJHRVRfT1VUX09FTSkvJSwgJChteV9tb2R1bGVfcGF0aCkpLCkKLSAgICAjIElmIHRoaXMgYXBwIGlzbid0IHRvIGJlIGluc3RhbGxlZCB0byBzeXN0ZW0sIHZlbmRvciwgb3Igb2VtIHBhcnRpdGlvbnMuCi0gICAgbXlfZW1iZWRfam5pIDo9IHRydWUKLSAgZW5kaWYKK2lmZXEgKCQoZmlsdGVyICQoVEFSR0VUX09VVCkvJSAkKFRBUkdFVF9PVVRfVkVORE9SKS8lICQoVEFSR0VUX09VVF9PRU0pLyUsICQobXlfbW9kdWxlX3BhdGgpKSwpCisjIElmIHRoaXMgYXBwIGlzbid0IHRvIGJlIGluc3RhbGxlZCB0byBzeXN0ZW0gcGFydGl0aW9ucy4KK215X2VtYmVkX2puaSA6PSB0cnVlCiBlbmRpZgogIyBJZiB3ZSdyZSBpbnN0YWxsaW5nIHRoaXMgQVBQIGFzIGEgY29tcHJlc3NlZCBtb2R1bGUsIHdlIGluY2x1ZGUgYWxsIEpOSSBsaWJyYXJpZXMKICMgaW4gdGhlIGNvbXByZXNzZWQgYXJ0aWZhY3QsIHJhdGhlciB0aGFuIGFzIHNlcGFyYXRlIGZpbGVzIG9uIHRoZSBwYXJ0aXRpb24gaW4gcXVlc3Rpb24uCmRpZmYgLS1naXQgYS9jb3JlL2luc3RhbGxfam5pX2xpYnNfaW50ZXJuYWwubWsgYi9jb3JlL2luc3RhbGxfam5pX2xpYnNfaW50ZXJuYWwubWsKaW5kZXggYjVmMTBjZi4uYWI1ZmQyYyAxMDA2NDQKLS0tIGEvY29yZS9pbnN0YWxsX2puaV9saWJzX2ludGVybmFsLm1rCisrKyBiL2NvcmUvaW5zdGFsbF9qbmlfbGlic19pbnRlcm5hbC5tawpAQCAtMjQsMTYgKzI0LDExIEBACiBpZmRlZiBteV9lbWJlZF9qbmkKICMgQXBwIGV4cGxpY2l0bHkgcmVxdWlyZXMgdGhlIHByZWJ1aWx0IE5ESyBzdGwgc2hhcmVkIGxpYnJhaWVzLgogIyBUaGUgTkRLIHN0bCBzaGFyZWQgbGlicmFyaWVzIHNob3VsZCBuZXZlciBnbyB0byB0aGUgc3lzdGVtIGltYWdlLgotaWZuZXEgKCQoZmlsdGVyICQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSwgc3RscG9ydF9zaGFyZWQgYysrX3NoYXJlZCksKQoraWZlcSAoJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpLGMrK19zaGFyZWQpCiBpZm5kZWYgTE9DQUxfU0RLX1ZFUlNJT04KICQoZXJyb3IgTE9DQUxfU0RLX1ZFUlNJT04gbXVzdCBiZSBkZWZpbmVkIHdpdGggTE9DQUxfTkRLX1NUTF9WQVJJQU5ULCBcCiAgICAgTE9DQUxfUEFDS0FHRV9OQU1FPSQoTE9DQUxfUEFDS0FHRV9OQU1FKSkKIGVuZGlmCi1lbmRpZgotaWZlcSAoc3RscG9ydF9zaGFyZWQsJChMT0NBTF9OREtfU1RMX1ZBUklBTlQpKQotbXlfam5pX3NoYXJlZF9saWJyYXJpZXMgKz0gXAotICAgICQoSElTVE9SSUNBTF9OREtfVkVSU0lPTlNfUk9PVCkvJChMT0NBTF9OREtfVkVSU0lPTikvc291cmNlcy9jeHgtc3RsL3N0bHBvcnQvbGlicy8kKFRBUkdFVF8kKG15XzJuZF9hcmNoX3ByZWZpeClDUFVfQUJJKS9saWJzdGxwb3J0X3NoYXJlZC5zbwotZWxzZSBpZmVxIChjKytfc2hhcmVkLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkKIG15X2puaV9zaGFyZWRfbGlicmFyaWVzICs9IFwKICAgICAkKEhJU1RPUklDQUxfTkRLX1ZFUlNJT05TX1JPT1QpLyQoTE9DQUxfTkRLX1ZFUlNJT04pL3NvdXJjZXMvY3h4LXN0bC9sbHZtLWxpYmMrKy9saWJzLyQoVEFSR0VUXyQobXlfMm5kX2FyY2hfcHJlZml4KUNQVV9BQkkpL2xpYmMrK19zaGFyZWQuc28KIGVuZGlmCkBAIC0xMDgsMTUgKzEwMywxNiBAQAogZW5kaWYgICMgb3V0ZXIgbXlfcHJlYnVpbHRfam5pX2xpYnMKIAogIyBWZXJpZnkgdGhhdCBhbGwgaW5jbHVkZWQgbGlicmFyaWVzIGFyZSBidWlsdCBhZ2FpbnN0IHRoZSBOREsKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FsbG93ZWRfbmRrX3R5cGVzLm1rCiBpZm5lcSAoJChzdHJpcCAkKExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTKSksKQogaWZuZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKIG15X2xpbmtfdHlwZSA6PSBhcHA6c2RrCi1teV93YXJuX3R5cGVzIDo9IG5hdGl2ZTpwbGF0Zm9ybQotbXlfYWxsb3dlZF90eXBlcyA6PSBuYXRpdmU6bmRrCitteV93YXJuX3R5cGVzIDo9IG5hdGl2ZTpwbGF0Zm9ybSAkKG15X3dhcm5fbmRrX3R5cGVzKQorbXlfYWxsb3dlZF90eXBlcyA6PSAkKG15X2FsbG93ZWRfbmRrX3R5cGVzKQogZWxzZQogbXlfbGlua190eXBlIDo9IGFwcDpwbGF0Zm9ybQotbXlfd2Fybl90eXBlcyA6PQotbXlfYWxsb3dlZF90eXBlcyA6PSBuYXRpdmU6bmRrIG5hdGl2ZTpwbGF0Zm9ybSBuYXRpdmU6dmVuZG9yCitteV93YXJuX3R5cGVzIDo9ICQobXlfd2Fybl9uZGtfdHlwZXMpCitteV9hbGxvd2VkX3R5cGVzIDo9ICQobXlfYWxsb3dlZF9uZGtfdHlwZXMpIG5hdGl2ZTpwbGF0Zm9ybSBuYXRpdmU6dmVuZG9yIG5hdGl2ZTp2bmRrIG5hdGl2ZTp2bmRrX3ByaXZhdGUKIGVuZGlmCiAKIG15X2xpbmtfZGVwcyA6PSAkKGFkZHByZWZpeCBTSEFSRURfTElCUkFSSUVTOiwkKExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTKSkKZGlmZiAtLWdpdCBhL2NvcmUvaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbCBiL2NvcmUvaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGJhZGFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9pbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFRoaXMgdGVzdCBjb25maWcgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyB7TEFCRUx9LiI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJ7TU9EVUxFfS5hcGsiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUue1RFU1RfVFlQRX0iID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0ie1BBQ0tBR0V9IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9IntSVU5ORVJ9IiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvcmUvamFjay1kZWZhdWx0LmFyZ3MgYi9jb3JlL2phY2stZGVmYXVsdC5hcmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzNiYzUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvamFjay1kZWZhdWx0LmFyZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS1EIHNjaGVkLnJ1bm5lcj1tdWx0aS10aHJlYWRlZAotLUQgc2NoZWQucnVubmVyLnRocmVhZC5raW5kPWZpeGVkCi0tRCBzY2hlZC5ydW5uZXIudGhyZWFkLmZpeGVkLmNvdW50PTQKLS0tc2FuaXR5LWNoZWNrcyBvZmYKLS1EIGphY2sucmVwb3J0ZXIubGV2ZWwuZmlsZT1lcnJvcj0tLSx3YXJuaW5nPS0KLS0tdmVyYm9zZSBlcnJvcgotLUQgamFjay5qYXljZS5jYWNoZT1mYWxzZQotLUQgamFjay5sYW1iZGEuZ3JvdXBpbmctc2NvcGU9cGFja2FnZQotLUQgamFjay5sYW1iZGEuc2ltcGxpZnktc3RhdGVsZXNzPXRydWUKZGlmZiAtLWdpdCBhL2NvcmUvamFjb2NvLm1rIGIvY29yZS9qYWNvY28ubWsKaW5kZXggYTA0ZDI1ZS4uNjQwNmRmNCAxMDA2NDQKLS0tIGEvY29yZS9qYWNvY28ubWsKKysrIGIvY29yZS9qYWNvY28ubWsKQEAgLTE5LDQ0ICsxOSwyMCBAQAogIyAoYXQgdGhlIHRpbWUgb2YgYXV0aG9yc2hpcCwgaXQgaXMgaW5jbHVkZWQgYnkgamF2YS5tayBhbmQKICMgamF2YV9ob3N0X2xpYnJhcnkubWspCiAKLW15X2luY2x1ZGVfZmlsdGVyIDo9Ci1teV9leGNsdWRlX2ZpbHRlciA6PQorIyBkZXRlcm1pbmUgSmFjb2NvIGluY2x1ZGUvZXhjbHVkZSBmaWx0ZXJzIGV2ZW4gd2hlbiBjb3ZlcmFnZSBpcyBub3QgZW5hYmxlZAorIyB0byBnZXQgc3ludGF4IGNoZWNraW5nIG9uIExPQ0FMX0pBQ0tfQ09WRVJBR0VfKElOQ0xVREV8RVhDTFVERSlfRklMVEVSCisjIGNvcHkgZmlsdGVycyBmcm9tIEphY2sgYnV0IGFsc28gc2tpcCBzb21lIGtub3duIGphdmEgcGFja2FnZXMKK215X2luY2x1ZGVfZmlsdGVyIDo9ICQoc3RyaXAgJChMT0NBTF9KQUNLX0NPVkVSQUdFX0lOQ0xVREVfRklMVEVSKSkKK215X2V4Y2x1ZGVfZmlsdGVyIDo9ICQoc3RyaXAgJChERUZBVUxUX0pBQ09DT19FWENMVURFX0ZJTFRFUiksJChMT0NBTF9KQUNLX0NPVkVSQUdFX0VYQ0xVREVfRklMVEVSKSkKKworbXlfaW5jbHVkZV9hcmdzIDo9ICQoY2FsbCBqYWNvY28tY2xhc3MtZmlsdGVyLXRvLWZpbGUtYXJncywgJChteV9pbmNsdWRlX2ZpbHRlcikpCitteV9leGNsdWRlX2FyZ3MgOj0gJChjYWxsIGphY29jby1jbGFzcy1maWx0ZXItdG8tZmlsZS1hcmdzLCAkKG15X2V4Y2x1ZGVfZmlsdGVyKSkKKworIyBzaW5nbGUtcXVvdGUgZWFjaCBhcmcgb2YgdGhlIGluY2x1ZGUgYXJncyBzbyB0aGUgJyonIGdldHMgZXZhbHVhdGVkIGJ5IHppcAorIyBkb24ndCBxdW90ZSB0aGUgZXhjbHVkZSBhcmdzIHRoZXkgbmVlZCB0byBiZSBldmFsdWF0ZWQgYnkgYmFzaCBmb3Igcm0gLXJmCitteV9pbmNsdWRlX2FyZ3MgOj0gJChmb3JlYWNoIGFyZywkKG15X2luY2x1ZGVfYXJncyksJyQoYXJnKScpCiAKIGlmZXEgKCQoTE9DQUxfRU1NQV9JTlNUUlVNRU5UKSx0cnVlKQotICBpZmVxICgkKEFORFJPSURfQ09NUElMRV9XSVRIX0pBQ0spLGZhbHNlKQotICAgICMgZGV0ZXJtaW5lIEphY29jbyBpbmNsdWRlL2V4Y2x1ZGUgZmlsdGVycwotICAgIERFRkFVTFRfSkFDT0NPX0VYQ0xVREVfRklMVEVSIDo9IG9yZy9qdW5pdC8qLG9yZy9qYWNvY28vKixvcmcvbW9ja2l0by8qCi0gICAgIyBjb3B5IGZpbHRlcnMgZnJvbSBKYWNrIGJ1dCBhbHNvIHNraXAgc29tZSBrbm93biBqYXZhIHBhY2thZ2VzCi0gICAgbXlfaW5jbHVkZV9maWx0ZXIgOj0gJChzdHJpcCAkKExPQ0FMX0pBQ0tfQ09WRVJBR0VfSU5DTFVERV9GSUxURVIpKQotICAgIG15X2V4Y2x1ZGVfZmlsdGVyIDo9ICQoc3RyaXAgJChERUZBVUxUX0pBQ09DT19FWENMVURFX0ZJTFRFUiksJChMT0NBTF9KQUNLX0NPVkVSQUdFX0VYQ0xVREVfRklMVEVSKSkKLQotICAgICMgcmVwbGFjZSAnLicgd2l0aCAnLycgYW5kICcsJyB3aXRoICcgJywgYW5kIHF1b3RlIGVhY2ggYXJnCi0gICAgaWZuZXEgKCQoc3RyaXAgJChteV9pbmNsdWRlX2ZpbHRlcikpLCkKLSAgICAgIG15X2luY2x1ZGVfYXJncyA6PSAkKHN0cmlwICQobXlfaW5jbHVkZV9maWx0ZXIpKQotCi0gICAgICBteV9pbmNsdWRlX2FyZ3MgOj0gJChzdWJzdCAuLC8sJChteV9pbmNsdWRlX2FyZ3MpKQotICAgICAgbXlfaW5jbHVkZV9hcmdzIDo9ICckKHN1YnN0ICQoY29tbWEpLCcgJywkKG15X2luY2x1ZGVfYXJncykpJwotICAgIGVsc2UKLSAgICAgIG15X2luY2x1ZGVfYXJncyA6PQotICAgIGVuZGlmCi0KLSAgICAjIHJlcGxhY2UgJy4nIHdpdGggJy8nIGFuZCAnLCcgd2l0aCAnICcsIGFuZCBxdW90ZSBlYWNoIGFyZwotICAgIGlmbmVxICgkKHN0cmlwICQobXlfZXhjbHVkZV9maWx0ZXIpKSwpCi0gICAgICBteV9leGNsdWRlX2FyZ3MgOj0gJChteV9leGNsdWRlX2ZpbHRlcikKLQotICAgICAgbXlfZXhjbHVkZV9hcmdzIDo9ICQoc3Vic3QgLiwvLCQobXlfZXhjbHVkZV9hcmdzKSkKLSAgICAgIG15X2V4Y2x1ZGVfYXJncyA6PSAkKHN1YnN0ICQoY29tbWEpJChjb21tYSksJChjb21tYSksJChteV9leGNsdWRlX2FyZ3MpKQotICAgICAgbXlfZXhjbHVkZV9hcmdzIDo9ICckKHN1YnN0ICQoY29tbWEpLCcgJywgJChteV9leGNsdWRlX2FyZ3MpKScKLSAgICBlbHNlCi0gICAgICBteV9leGNsdWRlX2FyZ3MgOj0KLSAgICBlbmRpZgotICBlbmRpZiAjIEFORFJPSURfQ09NUElMRV9XSVRIX0pBQ0s9PWZhbHNlCi1lbmRpZiAjIExPQ0FMX0VNTUFfSU5TVFJVTUVOVCA9PSB0cnVlCi0KLSMgZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcnVuIHRoZSBpbnN0cnVtZW50ZXIgYmFzZWQgb24gd2hldGhlciB0aGVyZSBpcyBhbnkgd29yawotIyBmb3IgaXQgdG8gZG8KLWlmbmVxICgkKG15X2luY2x1ZGVfZmlsdGVyKSwpCi0KICAgbXlfZmlsZXMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjb2NvCiAKICAgIyBtYWtlIGEgdGFzayB0aGF0IHVuemlwcyB0aGUgY2xhc3NlcyB0aGF0IHdlIHdhbnQgdG8gaW5zdHJ1bWVudCBmcm9tIHRoZQpAQCAtNzQsNyArNTAsOCBAQAogCXVuemlwIC1xICQoUFJJVkFURV9GVUxMX0NMQVNTRVNfUFJFX0pBQ09DT19KQVIpIFwKIAkgIC1kICQoUFJJVkFURV9VTlpJUFBFRF9QQVRIKSBcCiAJICAkKFBSSVZBVEVfSU5DTFVERV9BUkdTKQotCXJtIC1yZiAkKFBSSVZBVEVfRVhDTFVERV9BUkdTKQorCShjZCAkKFBSSVZBVEVfVU5aSVBQRURfUEFUSCkgJiYgcm0gLXJmICQoUFJJVkFURV9FWENMVURFX0FSR1MpKQorCShjZCAkKFBSSVZBVEVfVU5aSVBQRURfUEFUSCkgJiYgZmluZCAtbm90IC1uYW1lICIqLmNsYXNzIiAtdHlwZSBmIHwgeGFyZ3MgLS1uby1ydW4taWYtZW1wdHkgcm0pCiAJdG91Y2ggJChQUklWQVRFX1VOWklQUEVEX1RJTUVTVEFNUF9QQVRIKQogIyBVbmZvcnR1bmF0ZWx5IGluIHRoZSBwcmV2aW91cyB0YXNrIGFib3ZlLAogIyAncm0gLXJmICQoUFJJVkFURV9FWENMVURFX0FSR1MpJyBuZWVkcyB0byBiZSBhIHNlcGFyYXRlCkBAIC0xMDcsOCArODQsOCBAQAogCW1rZGlyIC1wICQoUFJJVkFURV9JTlNUUlVNRU5URURfUEFUSCkKIAlqYXZhIC1qYXIgJChKQUNPQ09fQ0xJX0pBUikgXAogCSAgaW5zdHJ1bWVudCBcCi0JICAtcXVpZXQgXAotCSAgLWRlc3QgJyQoUFJJVkFURV9JTlNUUlVNRU5URURfUEFUSCknIFwKKwkgIC0tcXVpZXQgXAorCSAgLS1kZXN0ICckKFBSSVZBVEVfSU5TVFJVTUVOVEVEX1BBVEgpJyBcCiAJICAkKFBSSVZBVEVfVU5aSVBQRURfUEFUSCkKIAl0b3VjaCAkKFBSSVZBVEVfSU5TVFJVTUVOVEVEX1RJTUVTVEFNUF9QQVRIKQogCkBAIC0xMjAsMTIgKzk3LDEzIEBACiAkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKTogUFJJVkFURV9URU1QX0pBUl9QQVRIIDo9ICQobXlfdGVtcF9qYXJfcGF0aCkKICQoTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVIpOiBQUklWQVRFX0lOU1RSVU1FTlRFRF9QQVRIIDo9ICQobXlfaW5zdHJ1bWVudGVkX3BhdGgpCiAkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKTogUFJJVkFURV9GVUxMX0NMQVNTRVNfUFJFX0pBQ09DT19KQVIgOj0gJChMT0NBTF9GVUxMX0NMQVNTRVNfUFJFX0pBQ09DT19KQVIpCiskKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKTogJChKQVJfQVJHUykKICQoTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVIpOiAkKG15X2luc3RydW1lbnRlZF90aW1lc3RhbXBfcGF0aCkgJChMT0NBTF9GVUxMX0NMQVNTRVNfUFJFX0pBQ09DT19KQVIpCiAJcm0gLWYgJEAgJChQUklWQVRFX1RFTVBfSkFSX1BBVEgpCiAJIyBjb3B5IHRoZSBwcmUtamFjb2NvIGphciAoY29udGFpbmluZyBmaWxlcyBleGNsdWRlZCBmcm9tIGluc3RydW1lbnRhdGlvbikKIAljcCAkKFBSSVZBVEVfRlVMTF9DTEFTU0VTX1BSRV9KQUNPQ09fSkFSKSAkKFBSSVZBVEVfVEVNUF9KQVJfUEFUSCkKIAkjIGNvcHkgaW5zdHJ1bWVudGVkIGZpbGVzIGJhY2sgaW50byB0aGUgcmVzdWx0YW50IGphcgotCSQoSkFSKSAtdWYgJChQUklWQVRFX1RFTVBfSkFSX1BBVEgpIC1DICQoUFJJVkFURV9JTlNUUlVNRU5URURfUEFUSCkgLgorCSQoSkFSKSAtdWYgJChQUklWQVRFX1RFTVBfSkFSX1BBVEgpICQoY2FsbCBqYXItYXJncy1zb3J0ZWQtZmlsZXMtaW4tZGlyZWN0b3J5LCQoUFJJVkFURV9JTlNUUlVNRU5URURfUEFUSCkpCiAJbXYgJChQUklWQVRFX1RFTVBfSkFSX1BBVEgpICRACiAKICAgIyB0aGlzIGlzIHVzZWQgdG8gdHJpZ2dlciAkKG15X2NsYXNzZXNfdG9fcmVwb3J0X29uX3BhdGgpIHRvIGJ1aWxkCkBAIC0xMzMsOCArMTExLDggQEAKICAgIyBkZXBlbmRlbmN5LgogJChMT0NBTF9GVUxMX0NMQVNTRVNfSkFDT0NPX0pBUik6ICQobXlfY2xhc3Nlc190b19yZXBvcnRfb25fcGF0aCkKIAotZWxzZSAjIG15X2luY2x1ZGVfZmlsdGVyID09ICcnCitlbHNlICMgTE9DQUxfRU1NQV9JTlNUUlVNRU5UICE9IHRydWUKICAgTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVIgOj0gJChMT0NBTF9GVUxMX0NMQVNTRVNfUFJFX0pBQ09DT19KQVIpCi1lbmRpZiAjIG15X2luY2x1ZGVfZmlsdGVyICE9ICcnCitlbmRpZiAjIExPQ0FMX0VNTUFfSU5TVFJVTUVOVCA9PSB0cnVlCiAKIExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTICs9ICQoTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVIpCmRpZmYgLS1naXQgYS9jb3JlL2phdmEubWsgYi9jb3JlL2phdmEubWsKaW5kZXggMzYwMTI5Mi4uZWJiODZhZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhLm1rCisrKyBiL2NvcmUvamF2YS5tawpAQCAtMTgsNDcgKzE4LDYgQEAKIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUzo9JChzdHJpcCAkKExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUykpCiBMT0NBTF9TREtfVkVSU0lPTjo9JChzdHJpcCAkKExPQ0FMX1NES19WRVJTSU9OKSkKIAotaWZuZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKLSAgaWZlcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCi0gICAgJChlcnJvciAkKExPQ0FMX1BBVEgpOiBNdXN0IG5vdCBkZWZpbmUgYm90aCBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMgYW5kIExPQ0FMX1NES19WRVJTSU9OKQotICBlbHNlCi0gICAgaWZlcSAoJChzdHJpcCAkKGZpbHRlciAkKExPQ0FMX1NES19WRVJTSU9OKSwkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkpLCkKLSAgICAgICQoZXJyb3IgJChMT0NBTF9QQVRIKTogSW52YWxpZCBMT0NBTF9TREtfVkVSU0lPTiAnJChMT0NBTF9TREtfVkVSU0lPTiknIFwKLSAgICAgICAgICAgICBDaG9pY2VzIGFyZTogJChUQVJHRVRfQVZBSUxBQkxFX1NES19WRVJTSU9OUykpCi0gICAgZWxzZQotICAgICAgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSxjdXJyZW50KQotICAgICAgICAjIFVzZSBhbmRyb2lkX3N0dWJzX2N1cnJlbnQgaWYgTE9DQUxfU0RLX1ZFUlNJT04gaXMgY3VycmVudCBhbmQgbm8gVEFSR0VUX0JVSUxEX0FQUFMuCi0gICAgICAgIExPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWRfc3R1YnNfY3VycmVudCAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQotICAgICAgZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLHN5c3RlbV9jdXJyZW50KQotICAgICAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkX3N5c3RlbV9zdHVic19jdXJyZW50ICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCi0gICAgICBlbHNlIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUyksdGVzdF9jdXJyZW50KQotICAgICAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkX3Rlc3Rfc3R1YnNfY3VycmVudCAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKQotICAgICAgZWxzZQotICAgICAgICBMT0NBTF9KQVZBX0xJQlJBUklFUyA6PSBzZGtfdiQoTE9DQUxfU0RLX1ZFUlNJT04pICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpCi0gICAgICBlbmRpZgotCi0gICAgICBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSxjdXJyZW50KQotICAgICAgICBteV9qYWNrX21pbl9zZGtfdmVyc2lvbiA6PSAkKFBMQVRGT1JNX0pBQ0tfTUlOX1NES19WRVJTSU9OKQotICAgICAgZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSxzeXN0ZW1fY3VycmVudCkKLSAgICAgICAgbXlfamFja19taW5fc2RrX3ZlcnNpb24gOj0gJChQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTikKLSAgICAgIGVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksdGVzdF9jdXJyZW50KQotICAgICAgICBteV9qYWNrX21pbl9zZGtfdmVyc2lvbiA6PSAkKFBMQVRGT1JNX0pBQ0tfTUlOX1NES19WRVJTSU9OKQotICAgICAgZWxzZQotICAgICAgICBteV9qYWNrX21pbl9zZGtfdmVyc2lvbiA6PSAkKExPQ0FMX1NES19WRVJTSU9OKQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotICBlbmRpZgotZWxzZQotICBteV9qYWNrX21pbl9zZGtfdmVyc2lvbiA6PSAkKFBMQVRGT1JNX0pBQ0tfTUlOX1NES19WRVJTSU9OKQotICBpZm5lcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCi0gICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gJChUQVJHRVRfREVGQVVMVF9KQVZBX0xJQlJBUklFUykgJChMT0NBTF9KQVZBX0xJQlJBUklFUykKLSAgZW5kaWYKLWVuZGlmCi0KLWlmbmVxICgsJChzdHJpcCAkKExPQ0FMX01JTl9TREtfVkVSU0lPTikpKQotICBteV9qYWNrX21pbl9zZGtfdmVyc2lvbiA6PSAkKExPQ0FMX01JTl9TREtfVkVSU0lPTikKLWVuZGlmCi0KIHByb3RvX3NvdXJjZXMgOj0gJChmaWx0ZXIgJS5wcm90bywkKExPQ0FMX1NSQ19GSUxFUykpCiBpZm5lcSAoJChwcm90b19zb3VyY2VzKSwpCiBpZmVxICgkKExPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFKSxtaWNybykKQEAgLTEwMCwyNyArNTksMjQgQEAKIGludGVybWVkaWF0ZXMgOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyKQogaW50ZXJtZWRpYXRlcy5DT01NT04gOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyLENPTU1PTikKIAotIyBDaG9vc2UgbGVhZiBuYW1lIGZvciB0aGUgY29tcGlsZWQgamFyIGZpbGUuCi1pZmVxICgkKExPQ0FMX0VNTUFfSU5TVFJVTUVOVCksdHJ1ZSkKLWZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXJfbGVhZiA6PSBjbGFzc2VzLW5vLWRlYnVnLXZhci5qYXIKLWJ1aWx0X2RleF9pbnRlcm1lZGlhdGVfbGVhZiA6PSBuby1sb2NhbAotZWxzZQotZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcl9sZWFmIDo9IGNsYXNzZXMtZnVsbC1kZWJ1Zy5qYXIKLWJ1aWx0X2RleF9pbnRlcm1lZGlhdGVfbGVhZiA6PSB3aXRoLWxvY2FsCi1lbmRpZgotCiBpZmVxICgkKExPQ0FMX1BST0dVQVJEX0VOQUJMRUQpLGRpc2FibGVkKQogTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCA6PQogZW5kaWYKIAotZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS8kKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXJfbGVhZikKK2Z1bGxfY2xhc3Nlc190dXJiaW5lX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLXR1cmJpbmUuamFyCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phcmphciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci1qYXJqYXIuamFyCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKK2Z1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1mdWxsLWRlYnVnLmphcgogZnVsbF9jbGFzc2VzX3Byb2Nlc3NlZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1wcm9jZXNzZWQuamFyCiBmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1kZXN1Z2FyLmphcgotamFyamFyX2xlYWYgOj0gY2xhc3Nlcy1qYXJqYXIuamFyCi1mdWxsX2NsYXNzZXNfamFyamFyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS8kKGphcmphcl9sZWFmKQorZnVsbF9jbGFzc2VzX2phcmphcl9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1qYXJqYXIuamFyCiBmdWxsX2NsYXNzZXNfcHJvZ3VhcmRfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtcHJvZ3VhcmQuamFyCi1idWlsdF9kZXhfaW50ZXJtZWRpYXRlIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pLyQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZV9sZWFmKS9jbGFzc2VzLmRleAorZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWNvbWJpbmVkLmphcgorYnVpbHRfZGV4X2ludGVybWVkaWF0ZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9kZXgvY2xhc3Nlcy5kZXgKK2J1aWx0X2RleF9oaWRkZW5hcGkgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZGV4LWhpZGRlbmFwaS9jbGFzc2VzLmRleAogZnVsbF9jbGFzc2VzX3N0dWJzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9zdHVicy5qYXIKK2phdmFfc291cmNlX2xpc3RfZmlsZSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYXZhLXNvdXJjZS1saXN0CisKIAogaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpJChMT0NBTF9TUkNfRklMRVMpJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpJChMT0NBTF9TT1VSQ0VfRklMRVNfQUxMX0dFTkVSQVRFRCksQVBQUykKICMgSWYgdGhpcyBpcyBhbiBhcGsgd2l0aG91dCBhbnkgSmF2YSBjb2RlIChlLmcuIGZyYW1ld29yay1yZXMpLCB3ZSBzaG91bGQgc2tpcCBjb21waWxpbmcgSmF2YS4KQEAgLTEzMCwyNSArODYsMTkgQEAKIGZ1bGxfY2xhc3Nlc19qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5qYXIKIGJ1aWx0X2RleCA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmRleAogZW5kaWYKLSMgZmluYWwgSmFjayBsaWJyYXJ5LCBzaHJpbmtlZCBhbmQgb2JmdXNjYXRlZCBpZiBpdCBtdXN0IGJlCi1mdWxsX2NsYXNzZXNfamFjayA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphY2sKLSMgaW50ZXJtZWRpYXRlIEphY2sgbGlicmFyeSB3aXRob3V0IHNocmluayBhbmQgb2JmdXNjYXRpb24KLW5vc2hyb2JfY2xhc3Nlc19qYWNrIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMubm9zaHJvYi5qYWNrCi1qYWNrX2NoZWNrX3RpbWVzdGFtcCA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYWNrLmNoZWNrLnRpbWVzdGFtcAogCiBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSBcCisgICAgJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpIFwKICAgICAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpIFwKICAgICAkKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcikgXAogICAgICQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpIFwKICAgICAkKGZ1bGxfY2xhc3Nlc19qYXIpIFwKKyAgICAkKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpIFwKICAgICAkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpIFwKICAgICAkKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpIFwKLSAgICAkKGZ1bGxfY2xhc3Nlc19qYWNrKSBcCi0gICAgJChub3Nocm9iX2NsYXNzZXNfamFjaykgXAotICAgICQoamFja19jaGVja190aW1lc3RhbXApIFwKICAgICAkKGJ1aWx0X2RleCkgXAotICAgICQoZnVsbF9jbGFzc2VzX3N0dWJzX2phcikKLQorICAgICQoZnVsbF9jbGFzc2VzX3N0dWJzX2phcikgXAorICAgICQoamF2YV9zb3VyY2VfbGlzdF9maWxlKQogCiBMT0NBTF9JTlRFUk1FRElBVEVfU09VUkNFX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9zcmMKIApAQCAtMTc1LDggKzEyNSw4IEBACiBlbHNlCiAgIGlmbmVxICgsJChMT0NBTF9TREtfVkVSU0lPTikpCiAgICAgIyBTZXQgdGFyZ2V0LWFwaSBmb3IgTE9DQUxfU0RLX1ZFUlNJT05zIG90aGVyIHRoYW4gY3VycmVudC4KLSAgICBpZm5lcSAoLCQoZmlsdGVyLW91dCBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikpKQotICAgICAgcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgOj0gJChMT0NBTF9TREtfVkVSU0lPTikKKyAgICBpZm5lcSAoLCQoZmlsdGVyLW91dCBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCBjb3JlX2N1cnJlbnQsICQoTE9DQUxfU0RLX1ZFUlNJT04pKSkKKyAgICAgIHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDo9ICQoY2FsbCBnZXQtbnVtZXJpYy1zZGstdmVyc2lvbiwkKExPQ0FMX1NES19WRVJTSU9OKSkKICAgICBlbmRpZgogICBlbmRpZiAgIyBMT0NBTF9TREtfVkVSU0lPTiBpcyBzZXQKIGVuZGlmICAjIExPQ0FMX1JFTkRFUlNDUklQVF9UQVJHRVRfQVBJIGlzIHNldApAQCAtMjAwLDcgKzE1MCw3IEBACiByZW5kZXJzY3JpcHRfZmxhZ3MgKz0gJChMT0NBTF9SRU5ERVJTQ1JJUFRfRkxBR1MpCiAKICMgcHJlcGVuZCB0aGUgUmVuZGVyU2NyaXB0IHN5c3RlbSBpbmNsdWRlIHBhdGgKLWlmbmVxICgkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsJChMT0NBTF9TREtfVkVSU0lPTikpJChpZiAkKFRBUkdFVF9CVUlMRF9BUFBTKSwkKGZpbHRlciBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwkKExPQ0FMX1NES19WRVJTSU9OKSkpLCkKK2lmbmVxICgkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQgY29yZV9jdXJyZW50LCQoTE9DQUxfU0RLX1ZFUlNJT04pKSQoaWYgJChUQVJHRVRfQlVJTERfQVBQUyksJChmaWx0ZXIgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsJChMT0NBTF9TREtfVkVSU0lPTikpKSwpCiAjIGlmIGEgbnVtZXJpYyBMT0NBTF9TREtfVkVSU0lPTiwgb3IgY3VycmVudCBMT0NBTF9TREtfVkVSU0lPTiB3aXRoIFRBUkdFVF9CVUlMRF9BUFBTCiBMT0NBTF9SRU5ERVJTQ1JJUFRfSU5DTFVERVMgOj0gXAogICAgICQoSElTVE9SSUNBTF9TREtfVkVSU0lPTlNfUk9PVCkvcmVuZGVyc2NyaXB0L2NsYW5nLWluY2x1ZGUgXApAQCAtMjc4LDEzICsyMjgsMjEgQEAKIExPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTICs9IGxpYlJTU3VwcG9ydElPCiBlbmRpZgogCitteV9hcmNoIDo9ICQoVEFSR0VUXyQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKQoraWZuZXEgKCwkKGZpbHRlciBhcm02NCBtaXBzNjQgeDg2XzY0LCQobXlfYXJjaCkpKQorICBteV9taW5fc2RrX3ZlcnNpb24gOj0gMjEKK2Vsc2UKKyAgbXlfbWluX3Nka192ZXJzaW9uIDo9ICQoTUlOX1NVUFBPUlRFRF9TREtfVkVSU0lPTikKK2VuZGlmCiAKICQocnNfY29tcGF0aWJpbGl0eV9qbmlfbGlicyk6ICQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApICQoUlNfUFJFQlVJTFRfQ0xDT1JFKSBcCiAgICAgJChyc19zdXBwb3J0X2xpYikgJChyc19zdXBwb3J0X2lvX2xpYikgJChyc19qbmlfbGliKSAkKHJzX2NvbXBpbGVyX3J0KQogJChyc19jb21wYXRpYmlsaXR5X2puaV9saWJzKTogJChCQ0NfQ09NUEFUKQogJChyc19jb21wYXRpYmlsaXR5X2puaV9saWJzKTogUFJJVkFURV9DWFggOj0gJChDWFhfV1JBUFBFUikgJChUQVJHRVRfQ1hYKQorJChyc19jb21wYXRpYmlsaXR5X2puaV9saWJzKTogUFJJVkFURV9TREtfVkVSU0lPTiA6PSAkKG15X21pbl9zZGtfdmVyc2lvbikKICQocnNfY29tcGF0aWJpbGl0eV9qbmlfbGlicyk6ICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZSkvbGlicnMuJS5zbzogXAotICAgICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5iY19mb2xkZXIpJS5iYworICAgICQocmVuZGVyc2NyaXB0X2ludGVybWVkaWF0ZS5iY19mb2xkZXIpJS5iYyBcCisgICAgJChTT09OR19PVVRfRElSKS9uZGsudGltZXN0YW1wCiAJJCh0cmFuc2Zvcm0tYmMtdG8tc28pCiAKIGVuZGlmCkBAIC0zMDgsNyArMjY2LDcgQEAKIAogYWlkbF9wcmVwcm9jZXNzX2ltcG9ydCA6PQogaWZkZWYgTE9DQUxfU0RLX1ZFUlNJT04KLWlmbmVxICgkKGZpbHRlciBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSksKQoraWZuZXEgKCQoZmlsdGVyIGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50IGNvcmVfY3VycmVudCwgJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSksKQogICAjIExPQ0FMX1NES19WRVJTSU9OIGlzIGN1cnJlbnQgYW5kIG5vIFRBUkdFVF9CVUlMRF9BUFBTCiAgIGFpZGxfcHJlcHJvY2Vzc19pbXBvcnQgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9mcmFtZXdvcmsuYWlkbAogZWxzZQpAQCAtMzIwLDcgKzI3OCw3IEBACiBlbmRpZiAjIExPQ0FMX1NES19WRVJTSU9OCiAKICQoZm9yZWFjaCBzLCQoYWlkbF9zb3VyY2VzKSxcCi0gICAgJChldmFsICQoY2FsbCBkZWZpbmUtYWlkbC1qYXZhLXJ1bGUsJChzKSwkKGludGVybWVkaWF0ZXMuQ09NTU9OKSxhaWRsX2phdmFfc291cmNlcykpKQorICAgICQoZXZhbCAkKGNhbGwgZGVmaW5lLWFpZGwtamF2YS1ydWxlLCQocyksJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvYWlkbCxhaWRsX2phdmFfc291cmNlcykpKQogJChmb3JlYWNoIGphdmEsJChhaWRsX2phdmFfc291cmNlcyksIFwKICAgICAkKGNhbGwgaW5jbHVkZS1kZXBmaWxlLCQoamF2YTolLmphdmE9JS5QKSwkKGphdmEpKSkKIApAQCAtMzM5LDE1ICsyOTcsNyBAQAogIyBjb21tYW5kIGxpbmUuCiBpZm5kZWYgTE9DQUxfQ0hFQ0tFRF9NT0RVTEUKIGlmZGVmIGZ1bGxfY2xhc3Nlc19qYXIKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotaWZlcSAoJChMT0NBTF9KQUNLX0VOQUJMRUQpLGphdmFjX2Zyb250ZW5kKQogTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKQotZWxzZQotTE9DQUxfQ0hFQ0tFRF9NT0RVTEUgOj0gJChqYWNrX2NoZWNrX3RpbWVzdGFtcCkKLWVuZGlmCi1lbHNlCi1MT0NBTF9DSEVDS0VEX01PRFVMRSA6PSAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCi1lbmRpZgogZW5kaWYKIGVuZGlmCiAKQEAgLTM2MCwxMSArMzEwLDExIEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaWZuZXEgKCQoc3RyaXAgJChsb2d0YWdzX3NvdXJjZXMpKSwpCiAKLWxvZ3RhZ3NfamF2YV9zb3VyY2VzIDo9ICQocGF0c3Vic3QgJS5sb2d0YWdzLCUuamF2YSwkKGFkZHByZWZpeCAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9zcmMvLCAkKGxvZ3RhZ3Nfc291cmNlcykpKQorbG9ndGFnc19qYXZhX3NvdXJjZXMgOj0gJChwYXRzdWJzdCAlLmxvZ3RhZ3MsJS5qYXZhLCQoYWRkcHJlZml4ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2xvZ3RhZ3MvLCAkKGxvZ3RhZ3Nfc291cmNlcykpKQogbG9ndGFnc19zb3VyY2VzIDo9ICQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCAkKGxvZ3RhZ3Nfc291cmNlcykpCiAKICQobG9ndGFnc19qYXZhX3NvdXJjZXMpOiBQUklWQVRFX01FUkdFRF9UQUcgOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9hbGwtZXZlbnQtbG9nLXRhZ3MudHh0Ci0kKGxvZ3RhZ3NfamF2YV9zb3VyY2VzKTogJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjLyUuamF2YTogJChMT0NBTF9QQVRIKS8lLmxvZ3RhZ3MgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9hbGwtZXZlbnQtbG9nLXRhZ3MudHh0ICQoSkFWQVRBR1MpIGJ1aWxkL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5CiskKGxvZ3RhZ3NfamF2YV9zb3VyY2VzKTogJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvbG9ndGFncy8lLmphdmE6ICQoTE9DQUxfUEFUSCkvJS5sb2d0YWdzICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvYWxsLWV2ZW50LWxvZy10YWdzLnR4dCAkKEpBVkFUQUdTKSBidWlsZC9tYWtlL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5CiAJJCh0cmFuc2Zvcm0tbG9ndGFncy10by1qYXZhKQogCiBlbHNlCkBAIC0zNzQsMTAgKzMyNCw0MSBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBqYXZhX3NvdXJjZXMgOj0gJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sICQoZmlsdGVyICUuamF2YSwkKExPQ0FMX1NSQ19GSUxFUykpKSAkKGFpZGxfamF2YV9zb3VyY2VzKSAkKGxvZ3RhZ3NfamF2YV9zb3VyY2VzKSBcCiAgICAgICAgICAgICAgICAgJChmaWx0ZXIgJS5qYXZhLCQoTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMpKQotYWxsX2phdmFfc291cmNlcyA6PSAkKGphdmFfc291cmNlcykgJChhZGRwcmVmaXggJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS8sICQoZmlsdGVyICUuamF2YSwkKExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VTKSkpCitqYXZhX2ludGVybWVkaWF0ZV9zb3VyY2VzIDo9ICQoYWRkcHJlZml4ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvLCAkKGZpbHRlciAlLmphdmEsJChMT0NBTF9JTlRFUk1FRElBVEVfU09VUkNFUykpKQorYWxsX2phdmFfc291cmNlcyA6PSAkKGphdmFfc291cmNlcykgJChqYXZhX2ludGVybWVkaWF0ZV9zb3VyY2VzKQorCitlbmFibGVfc2hhcmRpbmcgOj0KK2lmbmVxICgkKFRVUkJJTkVfRU5BQkxFRCksZmFsc2UpCitpZm5lcSAoJChMT0NBTF9KQVZBQ19TSEFSRF9TSVpFKSwpCitpZm5lcSAoJChMT0NBTF9KQVJfUFJPQ0VTU09SKSwpCiskKGNhbGwgcHJldHR5LWVycm9yLENhbm5vdCBzZXQgYm90aCBMT0NBTF9KQVZBQ19TSEFSRF9TSVpFIGFuZCBMT0NBTF9KQVJfUFJPQ0VTU09SISkKK2VuZGlmICMgTE9DQUxfSkFSX1BST0NFU1NPUiBpcyBub3QgZW1wdHkKK2VuYWJsZV9zaGFyZGluZyA6PSB0cnVlCisKK251bV9zaGFyZHMgOj0gJChjYWxsIGludF9kaXZpZGUsJCh3b3JkcyAkKGphdmFfc291cmNlcykpLCQoTE9DQUxfSkFWQUNfU0hBUkRfU0laRSkpCitpZm5lcSAoJCh3b3JkcyAkKGphdmFfc291cmNlcykpLCQoY2FsbCBpbnRfbXVsdGlwbHksJChMT0NBTF9KQVZBQ19TSEFSRF9TSVpFKSwkKG51bV9zaGFyZHMpKSkKKyMgaW5jcmVtZW50IG51bWJlciBvZiBzaGFyZHMgYnkgMS4KK251bV9zaGFyZHMgOj0gJChjYWxsIGludF9wbHVzLCQobnVtX3NoYXJkcyksMSkKK2VuZGlmCisKK3NoYXJkX2lkeF9saXN0IDo9ICQoY2FsbCBpbnRfcmFuZ2VfbGlzdCwxLCQobnVtX3NoYXJkcykpCitzaGFyZGVkX2phdmFfc291cmNlX2xpc3RfZmlsZXMgKz0gJChmb3JlYWNoIHgsJChzaGFyZF9pZHhfbGlzdCksJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpLnNoYXJkLiQoeCkpCitzaGFyZGVkX2phcl9saXN0ICs9ICQoZm9yZWFjaCB4LCQoc2hhcmRfaWR4X2xpc3QpLCQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikuc2hhcmQuJCh4KSkKKworIyBhbHdheXMgcHV0IGR5bmFtaWNhbGx5LWxvY2F0ZWQgLmphdmEgZmlsZXMgKGdlbmVyYXRlZCBieSBQcm90by9yZXNvdXJjZSwgZXRjKSBpbiBhIG5ldyBmaW5hbCBzaGFyZC4KKyMgaW5jcmVtZW50IG51bWJlciBvZiBzaGFyZHMgYnkgMS4KK251bV9zaGFyZHMgOj0gJChjYWxsIGludF9wbHVzLCQobnVtX3NoYXJkcyksMSkKK3NoYXJkZWRfamF2YV9zb3VyY2VfbGlzdF9maWxlcyArPSAkKGphdmFfc291cmNlX2xpc3RfZmlsZSkuc2hhcmQuJChudW1fc2hhcmRzKQorc2hhcmRlZF9qYXJfbGlzdCArPSAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpLnNoYXJkLiQobnVtX3NoYXJkcykKK0xPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTICs9ICQoc2hhcmRlZF9qYXZhX3NvdXJjZV9saXN0X2ZpbGVzKQorTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMgKz0gJChzaGFyZGVkX2phcl9saXN0KQorZW5kaWYgIyBMT0NBTF9KQVZBQ19TSEFSRF9TSVpFIGlzIG5vdCBlbXB0eQorZW5kaWYgIyBUVVJCSU5FX0VOQUJMRUQgIT0gZmFsc2UKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvamF2YV9jb21tb24ubWsKIAoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvc2RrX2NoZWNrLm1rCisKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0hBU19SU19TT1VSQ0VTIDo9ICQoaWYgJChyZW5kZXJzY3JpcHRfc291cmNlcyksdHJ1ZSkKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1JTX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9yZW5kZXJzY3JpcHQKIApAQCAtNDAyLDEzICszODMsMTAgQEAKICMgTWFrZSBzdXJlIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIGJ1aWxkLgogaWZkZWYgZnVsbF9jbGFzc2VzX2phcgogaWZuZGVmIG5lZWRfY29tcGlsZV9qYXZhCi0kKGVycm9yICQoTE9DQUxfUEFUSCk6IFRhcmdldCBqYXZhIG1vZHVsZSBkb2VzIG5vdCBkZWZpbmUgYW55IHNvdXJjZSBvciByZXNvdXJjZSBmaWxlcykKKyQoY2FsbCBwcmV0dHktZXJyb3IsVGFyZ2V0IGphdmEgbW9kdWxlIGRvZXMgbm90IGRlZmluZSBhbnkgc291cmNlIG9yIHJlc291cmNlIGZpbGVzKQogZW5kaWYKIGVuZGlmCiAKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0pBQ0tfTUlOX1NES19WRVJTSU9OIDo9ICQobXlfamFja19taW5fc2RrX3ZlcnNpb24pCi1teV9qYWNrX21pbl9zZGtfdmVyc2lvbiA6PQotCiAjIFNpbmNlIHdlJ3JlIHVzaW5nIGludGVybWVkaWF0ZXMuQ09NTU9OLCBtYWtlIHN1cmUgdGhhdCBpdCBnZXRzIGNsZWFuZWQKICMgcHJvcGVybHkuCiAkKGNsZWFudGFyZ2V0KTogUFJJVkFURV9DTEVBTl9GSUxFUyArPSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKQpAQCAtNDIyLDcgKzQwMCw3IEBACiBBTExfTU9EVUxFUy4kKExPQ0FMX01PRFVMRSkuU1RVQlMgOj0gJChmdWxsX2NsYXNzZXNfc3R1YnNfamFyKQogCiAjIFRoZSBsYXllcnMgZmlsZSBhbGxvd3MgeW91IHRvIGVuZm9yY2UgYSBsYXllcmluZyBiZXR3ZWVuIGphdmEgcGFja2FnZXMuCi0jIFJ1biBidWlsZC90b29scy9qYXZhLWxheWVycy5weSBmb3IgbW9yZSBkZXRhaWxzLgorIyBSdW4gYnVpbGQvbWFrZS90b29scy9qYXZhLWxheWVycy5weSBmb3IgbW9yZSBkZXRhaWxzLgogbGF5ZXJzX2ZpbGUgOj0gJChhZGRwcmVmaXggJChMT0NBTF9QQVRIKS8sICQoTE9DQUxfSkFWQV9MQVlFUlNfRklMRSkpCiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBVkFfTEFZRVJTX0ZJTEUgOj0gJChsYXllcnNfZmlsZSkKICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfV0FSTklOR1NfRU5BQkxFIDo9ICQoTE9DQUxfV0FSTklOR1NfRU5BQkxFKQpAQCAtNDQzLDM4ICs0MjEsMTE0IEBACiBpZm5lcSAoLCQoUFJPRFVDVF9NSU5JTUlaRV9KQVZBX0RFQlVHX0lORk8pKQogaWZuZXEgKCwkKGZpbHRlciB1c2VyZGVidWcgdXNlciwkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCiBMT0NBTF9KQVZBQ0ZMQUdTKz0gLWc6c291cmNlLGxpbmVzCi1MT0NBTF9KQUNLX0ZMQUdTKz0gLUQgamFjay5kZXguZGVidWcudmFycz1mYWxzZSAtRCBqYWNrLmRleC5kZWJ1Zy52YXJzLnN5bnRoZXRpYz1mYWxzZQogZW5kaWYKIGVuZGlmCiAKLSQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFBSSVZBVEVfSkFWQUNGTEFHUyA6PSAkKEdMT0JBTF9KQVZBQ19ERUJVR19GTEFHUykgJChMT0NBTF9KQVZBQ0ZMQUdTKSAkKGFubm90YXRpb25fcHJvY2Vzc29yX2ZsYWdzKQotJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVJfRVhDTFVERV9GSUxFUyA6PSAkKExPQ0FMX0pBUl9FWENMVURFX0ZJTEVTKQotJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogUFJJVkFURV9KQVJfUEFDS0FHRVMgOj0gJChMT0NBTF9KQVJfUEFDS0FHRVMpCi0kKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0pBUl9FWENMVURFX1BBQ0tBR0VTIDo9ICQoTE9DQUxfSkFSX0VYQ0xVREVfUEFDS0FHRVMpCi0kKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORiA6PSAkKExPQ0FMX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORikKLSQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6IFwKLSAgICAgICAgJChqYXZhX3NvdXJjZXMpIFwKLSAgICAgICAgJChqYXZhX3Jlc291cmNlX3NvdXJjZXMpIFwKLSAgICAgICAgJChmdWxsX2phdmFfbGliX2RlcHMpIFwKLSAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgXAotICAgICAgICAkKGxheWVyc19maWxlKSBcCi0gICAgICAgICQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApIFwKLSAgICAgICAgJChwcm90b19qYXZhX3NvdXJjZXNfZmlsZV9zdGFtcCkgXAotICAgICAgICAkKGFubm90YXRpb25fcHJvY2Vzc29yX2RlcHMpIFwKLSAgICAgICAgJChOT1JNQUxJWkVfUEFUSCkgXAotICAgICAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSBcCi0gICAgICAgIHwgJChTT09OR19KQVZBQ19XUkFQUEVSKQotCSQodHJhbnNmb3JtLWphdmEtdG8tY2xhc3Nlcy5qYXIpCisjIExpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciBhbnl0aGluZyB0aGF0IG5lZWRzIGFsbCBqYXZhIHNvdXJjZXMgaW4gcGxhY2UKK2phdmFfc291cmNlc19kZXBzIDo9IFwKKyAgICAkKGphdmFfc291cmNlcykgXAorICAgICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKSBcCisgICAgJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCkgXAorICAgICQocHJvdG9famF2YV9zb3VyY2VzX2ZpbGVfc3RhbXApIFwKKyAgICAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQorCiskKGphdmFfc291cmNlX2xpc3RfZmlsZSk6ICQoamF2YV9zb3VyY2VzX2RlcHMpCisJJCh3cml0ZS1qYXZhLXNvdXJjZS1saXN0KQorCitpZmRlZiBlbmFibGVfc2hhcmRpbmcKKyQoZm9yZWFjaCB4LCQoc2hhcmRfaWR4X2xpc3QpLFwKKyAgJChldmFsICQoY2FsbCBzYXZlLXNoYXJkZWQtamF2YS1zb3VyY2UtbGlzdCwkKHgpLFwKKyAgICAkKHdvcmRsaXN0ICQoY2FsbCBpbnRfcGx1cywxLCQoY2FsbCBpbnRfbXVsdGlwbHksJChMT0NBTF9KQVZBQ19TSEFSRF9TSVpFKSwkKGNhbGwgaW50X3N1YnRyYWN0LCQoeCksMSkpKSxcCisgICAgICAkKGNhbGwgaW50X211bHRpcGx5LCQoTE9DQUxfSkFWQUNfU0hBUkRfU0laRSksJCh4KSksJChzb3J0ICQoamF2YV9zb3VyY2VzKSkpKSkpCisKKyMgYWx3YXlzIHB1dCBkeW5hbWljYWxseS1sb2NhdGVkIC5qYXZhIGZpbGVzIChnZW5lcmF0ZWQgYnkgUHJvdG8vcmVzb3VyY2UsIGV0YykgaW4gYSBuZXcgZmluYWwgc2hhcmQuCiskKGphdmFfc291cmNlX2xpc3RfZmlsZSkuc2hhcmQuJChudW1fc2hhcmRzKTogUFJJVkFURV9KQVZBX0lOVEVSTUVESUFURV9TT1VSQ0VTIDo9ICQoamF2YV9pbnRlcm1lZGlhdGVfc291cmNlcykKKyQoamF2YV9zb3VyY2VfbGlzdF9maWxlKS5zaGFyZC4kKG51bV9zaGFyZHMpOiAkKGphdmFfcmVzb3VyY2Vfc291cmNlcykgXAorICAgICQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApIFwKKyAgICAkKHByb3RvX2phdmFfc291cmNlc19maWxlX3N0YW1wKSBcCisgICAgJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykgXAorICAgICQoTk9STUFMSVpFX1BBVEgpCisJJChoaWRlKSBybSAtZiAkQAorCSQoY2FsbCBkdW1wLXdvcmRzLXRvLWZpbGUsJChQUklWQVRFX0pBVkFfSU5URVJNRURJQVRFX1NPVVJDRVMpLCRALnRtcCkKKwkkKGNhbGwgZmV0Y2gtYWRkaXRpb25hbC1qYXZhLXNvdXJjZSwkQC50bXApCisJJChoaWRlKSB0ciAnICcgJ1xuJyA8ICRALnRtcCB8ICQoTk9STUFMSVpFX1BBVEgpIHwgc29ydCAtdSA+ICRACisKKyMgSmF2YWMgc2hhcmRpbmcgd2l0aCBoZWFkZXIgbGlicyBpbmNsdWRpbmcgaXRzIG93biBoZWFkZXIgamFyIGFzIG9uZSBvZiBkZXBlbmRlbmN5LgorJChmb3JlYWNoIHgsJChzaGFyZF9pZHhfbGlzdCksXAorICAkKGV2YWwgJChjYWxsIGNyZWF0ZS1jbGFzc2VzLWZ1bGwtZGVidWcuamFyLCQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikuc2hhcmQuJCh4KSxcCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpLnNoYXJkLiQoeCksXAorICAgICAgJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpICQoZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIpLCQoeCksXAorICAgICAgICAkKHdvcmRsaXN0ICQoY2FsbCBpbnRfcGx1cywxLCQoY2FsbCBpbnRfbXVsdGlwbHksJChMT0NBTF9KQVZBQ19TSEFSRF9TSVpFKSwkKGNhbGwgaW50X3N1YnRyYWN0LCQoeCksMSkpKSxcCisgICAgICAgICAgJChjYWxsIGludF9tdWx0aXBseSwkKExPQ0FMX0pBVkFDX1NIQVJEX1NJWkUpLCQoeCkpLCQoc29ydCAkKGphdmFfc291cmNlcykpKSkpKQorCisjIEphdmFjIHNoYXJkaW5nIGZvciBsYXN0IHNoYXJkIHdpdGggYWRkaXRpb25hbCBKYXZhIGRlcGVuZGVuY2llcy4KKyQoZXZhbCAkKGNhbGwgY3JlYXRlLWNsYXNzZXMtZnVsbC1kZWJ1Zy5qYXIsJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKS5zaGFyZC4kKG51bV9zaGFyZHMpLFwKKyAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpLnNoYXJkLiQobnVtX3NoYXJkcyksJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpICQoZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIpLCQoc3RyaXAgXAorICAgICQobnVtX3NoYXJkcykpLCQkKGphdmFfcmVzb3VyY2Vfc291cmNlcykgJCQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApIFwKKyAgICAgICQkKHByb3RvX2phdmFfc291cmNlc19maWxlX3N0YW1wKSAkJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykpKQorCiskKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiBQUklWQVRFX1NIQVJERURfSkFSX0xJU1QgOj0gJChzaGFyZGVkX2phcl9saXN0KQorJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKTogJChzaGFyZGVkX2phcl9saXN0KSB8ICQoTUVSR0VfWklQUykKKwkkKE1FUkdFX1pJUFMpIC1qICRAICQoUFJJVkFURV9TSEFSREVEX0pBUl9MSVNUKQorZWxzZQorIyB3ZSBjYW4ndCB1c2Ugc2luZ2xlICQgZm9yIGphdmFfc291cmNlc19kZXBzIHNpbmNlIGl0IG1heSBjb250YWluIGhhc2ggJyMnIHNpZ24uCiskKGV2YWwgJChjYWxsIGNyZWF0ZS1jbGFzc2VzLWZ1bGwtZGVidWcuamFyLCQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phciksXAorICAkKGphdmFfc291cmNlX2xpc3RfZmlsZSksJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpLCwkJChqYXZhX3NvdXJjZXNfZGVwcykpKQorCitlbmRpZiAjIGlmZGVmIGVuYWJsZV9zaGFyZGluZworCitpZm5lcSAoJChUVVJCSU5FX0VOQUJMRUQpLGZhbHNlKQorCiskKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcik6IFBSSVZBVEVfSkFWQUNGTEFHUyA6PSAkKExPQ0FMX0pBVkFDRkxBR1MpICQoYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MpCiskKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcik6IFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GIDo9ICQoTE9DQUxfRE9OVF9ERUxFVEVfSkFSX01FVEFfSU5GKQorJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpOiBcCisgICAgJChqYXZhX3NvdXJjZV9saXN0X2ZpbGUpIFwKKyAgICAkKGphdmFfc291cmNlc19kZXBzKSBcCisgICAgJChmdWxsX2phdmFfaGVhZGVyX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMpIFwKKyAgICAkKGZ1bGxfamF2YV9zeXN0ZW1fbW9kdWxlc19kZXBzKSBcCisgICAgJChOT1JNQUxJWkVfUEFUSCkgXAorICAgICQoSkFSX0FSR1MpIFwKKyAgICAkKFpJUFRJTUUpIFwKKyAgICB8ICQoVFVSQklORSkgXAorICAgICQoTUVSR0VfWklQUykKKwkkKHRyYW5zZm9ybS1qYXZhLXRvLWhlYWRlci5qYXIpCisKKy5LQVRJX1JFU1RBVDogJChmdWxsX2NsYXNzZXNfdHVyYmluZV9qYXIpCisKKyMgUnVuIGphcmphciBiZWZvcmUgZ2VuZXJhdGUgY2xhc3Nlcy1oZWFkZXIuamFyIGlmIG5lY2Vzc2FyeS4KK2lmbmVxICgkKHN0cmlwICQoTE9DQUxfSkFSSkFSX1JVTEVTKSksKQorJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcmphcik6IFBSSVZBVEVfSkFSSkFSX1JVTEVTIDo9ICQoTE9DQUxfSkFSSkFSX1JVTEVTKQorJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcmphcik6ICQoZnVsbF9jbGFzc2VzX3R1cmJpbmVfamFyKSAkKExPQ0FMX0pBUkpBUl9SVUxFUykgfCAkKEpBUkpBUikKKwlAZWNobyBIZWFkZXIgSmFySmFyOiAkQAorCSQoaGlkZSkgJChKQVZBKSAtamFyICQoSkFSSkFSKSBwcm9jZXNzICQoUFJJVkFURV9KQVJKQVJfUlVMRVMpICQ8ICRACitlbHNlCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phcmphciA6PSAkKGZ1bGxfY2xhc3Nlc190dXJiaW5lX2phcikKK2VuZGlmCisKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyamFyKSwkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyKSkpCisKK2VuZGlmICMgVFVSQklORV9FTkFCTEVEICE9IGZhbHNlCiAKIGphdmFjLWNoZWNrIDogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKQogamF2YWMtY2hlY2stJChMT0NBTF9NT0RVTEUpIDogJChmdWxsX2NsYXNzZXNfY29tcGlsZWRfamFyKQogCiskKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpOiBQUklWQVRFX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORiA6PSAkKExPQ0FMX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORikKKyQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcik6ICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmdWxsX3N0YXRpY19qYXZhX2xpYnMpIHwgJChNRVJHRV9aSVBTKQorCSQoaWYgJChQUklWQVRFX0pBUl9NQU5JRkVTVCksICQoaGlkZSkgc2VkIC1lICJzLyVCVUlMRF9OVU1CRVIlLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkvIiBcCisgICAgICAgICAgICAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSA+ICQoZGlyICRAKS9tYW5pZmVzdC5tZikKKwkkKE1FUkdFX1pJUFMpIC1qIC0taWdub3JlLWR1cGxpY2F0ZXMgJChpZiAkKFBSSVZBVEVfSkFSX01BTklGRVNUKSwtbSAkKGRpciAkQCkvbWFuaWZlc3QubWYpIFwKKyAgICAgICAgICAgICQoaWYgJChQUklWQVRFX0RPTlRfREVMRVRFX0pBUl9NRVRBX0lORiksLC1zdHJpcERpciBNRVRBLUlORiAtemlwVG9Ob3RTdHJpcCAkPCkgXAorICAgICAgICAgICAgJEAgJDwgJChjYWxsIHJldmVyc2UtbGlzdCwkKFBSSVZBVEVfU1RBVElDX0pBVkFfTElCUkFSSUVTKSkKKwogaWZkZWYgTE9DQUxfSkFSX1BST0NFU1NPUgogIyBMT0NBTF9KQVJfUFJPQ0VTU09SX0FSR1MgbXVzdCBiZSBldmFsdWF0ZWQgaGVyZSB0byBzZXQgdXAgdGhlIHJ1bGUtbG9jYWwKICMgUFJJVkFURV9KQVJfUFJPQ0VTU09SX0FSR1MgdmFyaWFibGUsIGJ1dCAkPCBhbmQgJEAgYXJlIG5vdCBhdmFpbGFibGUgeWV0LgogIyBTZXQgJHtpbn0gYW5kICR7b3V0fSBzbyB0aGV5IGNhbiBiZSByZWZlcmVuY2VkIGJ5IExPQ0FMX0pBUl9QUk9DRVNTT1JfQVJHUwogIyB1c2luZyBkZWZlcnJlZCBldmFsdWF0aW9uIChMT0NBTF9KQVJfUFJPQ0VTU09SX0FSR1MgPSBpbnN0ZWFkIG9mIDo9KS4KLWluIDo9ICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikKK2luIDo9ICQoZnVsbF9jbGFzc2VzX2NvbWJpbmVkX2phcikKIG91dCA6PSAkKGZ1bGxfY2xhc3Nlc19wcm9jZXNzZWRfamFyKS50bXAKIG15X2phcl9wcm9jZXNzb3IgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvJChMT0NBTF9KQVJfUFJPQ0VTU09SKS5qYXIKIApAQCAtNDg0LDcgKzUzOCw3IEBACiBpbiA6PQogb3V0IDo9CiAKLSQoZnVsbF9jbGFzc2VzX3Byb2Nlc3NlZF9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpICQobXlfamFyX3Byb2Nlc3NvcikKKyQoZnVsbF9jbGFzc2VzX3Byb2Nlc3NlZF9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpICQobXlfamFyX3Byb2Nlc3NvcikKIAlAZWNobyBQcm9jZXNzaW5nICRAIHdpdGggJChQUklWQVRFX0pBUl9QUk9DRVNTT1IpCiAJJChoaWRlKSBybSAtZiAkQCAkKFBSSVZBVEVfVE1QX09VVCkKIAkkKGhpZGUpICQoSkFWQSkgLWphciAkKFBSSVZBVEVfSkFSX1BST0NFU1NPUikgJChQUklWQVRFX0pBUl9QUk9DRVNTT1JfQVJHUykKQEAgLTQ5Miw5OSArNTQ2LDExNSBAQAogCiBteV9qYXJfcHJvY2Vzc29yIDo9CiBlbHNlCi1mdWxsX2NsYXNzZXNfcHJvY2Vzc2VkX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCi1lbmRpZgotCi1teV9kZXN1Z2FyaW5nIDo9Ci1pZm5kZWYgTE9DQUxfSkFDS19FTkFCTEVECi1pZm5kZWYgTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWQotbXlfZGVzdWdhcmluZyA6PSB0cnVlCi0kKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcik6IFBSSVZBVEVfRFhfRkxBR1MgOj0gJChMT0NBTF9EWF9GTEFHUykKLSQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKTogJChmdWxsX2NsYXNzZXNfcHJvY2Vzc2VkX2phcikgJChERVNVR0FSKQotCSQoZGVzdWdhci1jbGFzc2VzLWphcikKLWVuZGlmCi1lbmRpZgotCi1pZm5kZWYgbXlfZGVzdWdhcmluZwotZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyIDo9ICQoZnVsbF9jbGFzc2VzX3Byb2Nlc3NlZF9qYXIpCitmdWxsX2NsYXNzZXNfcHJvY2Vzc2VkX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19jb21iaW5lZF9qYXIpCiBlbmRpZgogCiAjIFJ1biBqYXJqYXIgaWYgbmVjZXNzYXJ5CiBpZm5lcSAoJChzdHJpcCAkKExPQ0FMX0pBUkpBUl9SVUxFUykpLCkKICQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpOiBQUklWQVRFX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX0pBUkpBUl9SVUxFUykKLSQoZnVsbF9jbGFzc2VzX2phcmphcl9qYXIpOiAkKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcikgJChMT0NBTF9KQVJKQVJfUlVMRVMpIHwgJChKQVJKQVIpCiskKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKTogJChmdWxsX2NsYXNzZXNfcHJvY2Vzc2VkX2phcikgJChMT0NBTF9KQVJKQVJfUlVMRVMpIHwgJChKQVJKQVIpCiAJQGVjaG8gSmFySmFyOiAkQAogCSQoaGlkZSkgJChKQVZBKSAtamFyICQoSkFSSkFSKSBwcm9jZXNzICQoUFJJVkFURV9KQVJKQVJfUlVMRVMpICQ8ICRACiBlbHNlCi1mdWxsX2NsYXNzZXNfamFyamFyX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcikKK2Z1bGxfY2xhc3Nlc19qYXJqYXJfamFyIDo9ICQoZnVsbF9jbGFzc2VzX3Byb2Nlc3NlZF9qYXIpCiBlbmRpZgogCi1MT0NBTF9GVUxMX0NMQVNTRVNfUFJFX0pBQ09DT19KQVIgOj0gJChmdWxsX2NsYXNzZXNfamFyamFyX2phcikKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworTE9DQUxfSkVUSUZJRVJfSU5QVVRfRklMRSA6PSAkKGZ1bGxfY2xhc3Nlc19qYXJqYXJfamFyKQorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9qZXRpZmllci5taworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX0pFVElGSUVSX09VVFBVVF9GSUxFKSwkKGZ1bGxfY2xhc3Nlc19qYXIpKSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitMT0NBTF9GVUxMX0NMQVNTRVNfUFJFX0pBQ09DT19KQVIgOj0gJChmdWxsX2NsYXNzZXNfamFyKQorCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9qYWNvY28ubWsKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1mdWxsX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phciA6PSAkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKQorIyBUZW1wb3JhcmlseSBlbmFibGUgLS1tdWx0aS1kZXggdW50aWwgcHJvZ3VhcmQgc3VwcG9ydHMgdjUzIGNsYXNzIGZpbGVzCisjICggaHR0cDovL2IvNjc2NzM4NjAgKSBvciB3ZSBtb3ZlIGF3YXkgZnJvbSBwcm9ndWFyZCBhbHRvZ2V0aGVyLgoraWZkZWYgVEFSR0VUX09QRU5KREs5CitMT0NBTF9EWF9GTEFHUyA6PSAkKGZpbHRlci1vdXQgLS1tdWx0aS1kZXgsJChMT0NBTF9EWF9GTEFHUykpIC0tbXVsdGktZGV4CitlbmRpZgorCitpZm5lcSAoJChVU0VfRDhfREVTVUdBUiksdHJ1ZSkKK215X2Rlc3VnYXJpbmcgOj0KK2lmbmRlZiBMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZCitteV9kZXN1Z2FyaW5nIDo9IHRydWUKKyQoZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyKTogUFJJVkFURV9EWF9GTEFHUyA6PSAkKExPQ0FMX0RYX0ZMQUdTKQorJChmdWxsX2NsYXNzZXNfZGVzdWdhcl9qYXIpOiAkKExPQ0FMX0ZVTExfQ0xBU1NFU19KQUNPQ09fSkFSKSAkKGZ1bGxfamF2YV9oZWFkZXJfbGlicykgJChERVNVR0FSKQorCSQoZGVzdWdhci1jbGFzc2VzLWphcikKK2VuZGlmCitlbHNlCitteV9kZXN1Z2FyaW5nIDo9CitlbmRpZgorCitpZm5kZWYgbXlfZGVzdWdhcmluZworZnVsbF9jbGFzc2VzX2Rlc3VnYXJfamFyIDo9ICQoTE9DQUxfRlVMTF9DTEFTU0VTX0pBQ09DT19KQVIpCitlbmRpZgorCitmdWxsX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19kZXN1Z2FyX2phcikKIAogIyBLZWVwIGEgY29weSBvZiB0aGUgamFyIGp1c3QgYmVmb3JlIHByb2d1YXJkIHByb2Nlc3NpbmcuCiAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChmdWxsX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phciksJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1wcmUtcHJvZ3VhcmQuamFyKSkKIAogIyBSdW4gcHJvZ3VhcmQgaWYgbmVjZXNzYXJ5CiBpZmRlZiBMT0NBTF9QUk9HVUFSRF9FTkFCTEVECi1pZm5lcSAoJChmaWx0ZXItb3V0IGZ1bGwgY3VzdG9tIG5vc3lzdGVtIG9iZnVzY2F0aW9uIG9wdGltaXphdGlvbiBzaHJpbmt0ZXN0cywkKExPQ0FMX1BST0dVQVJEX0VOQUJMRUQpKSwpCitpZm5lcSAoJChmaWx0ZXItb3V0IGZ1bGwgY3VzdG9tIG9iZnVzY2F0aW9uIG9wdGltaXphdGlvbiwkKExPQ0FMX1BST0dVQVJEX0VOQUJMRUQpKSwpCiAgICAgJCh3YXJuaW5nIHdoaWxlIHByb2Nlc3Npbmc6ICQoTE9DQUxfTU9EVUxFKSkKICAgICAkKGVycm9yIGludmFsaWQgdmFsdWUgZm9yIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQ6ICQoTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCkpCiBlbmRpZgogcHJvZ3VhcmRfZGljdGlvbmFyeSA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5Ci1qYWNrX2RpY3Rpb25hcnkgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFja19kaWN0aW9uYXJ5CiAKLSMgSGFjazogc2VlIGIvMjA2NjczOTYKLSMgV2hlbiBhbiBhcHAncyBMT0NBTF9TREtfVkVSU0lPTiBpcyBsb3dlciB0aGFuIHRoZSBzdXBwb3J0IGxpYnJhcnkncyBMT0NBTF9TREtfVkVSU0lPTiwKLSMgd2UgYXJ0aWZpY2FsbHkgcmFpc2VzIHRoZSAiU0RLIHZlcnNpb24iICJsaW5rZWQiIGJ5IFByb0d1YXJkLCB0bworIyBXaGVuIGFuIGFwcCBjb250YWlucyByZWZlcmVuY2VzIHRvIEFQSXMgdGhhdCBhcmUgbm90IGluIHRoZSBTREsgc3BlY2lmaWVkIGJ5CisjIGl0cyBMT0NBTF9TREtfVkVSU0lPTiBmb3IgZXhhbXBsZSBhZGRlZCBieSBzdXBwb3J0IGxpYnJhcnkgb3IgYnkgcnVudGltZSAKKyMgY2xhc3NlcyBhZGRlZCBieSBkZXN1Z2FyLCB3ZSBhcnRpZmljYWxseSByYWlzZSB0aGUgIlNESyB2ZXJzaW9uIiAibGlua2VkIiBieQorIyBQcm9HdWFyZCwgdG8KICMgLSBzdXBwcmVzcyBQcm9HdWFyZCB3YXJuaW5ncyBvZiByZWZlcmVuY2luZyBzeW1ib2xzIHVua25vd24gdG8gdGhlIGxvd2VyIFNESyB2ZXJzaW9uLgogIyAtIHByZXZlbnQgUHJvR3VhcmQgc3RyaXBwaW5nIHN1YmNsYXNzIGluIHRoZSBzdXBwb3J0IGxpYnJhcnkgdGhhdCBleHRlbmRzIGNsYXNzIGFkZGVkIGluIHRoZSBoaWdoZXIgU0RLIHZlcnNpb24uCi1teV9zdXBwb3J0X2xpYnJhcnlfc2RrX3JhaXNlIDo9Ci1pZm5lcSAoLCQoZmlsdGVyIGFuZHJvaWQtc3VwcG9ydC0lLCQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSkpCisjIFNlZSBiLzIwNjY3Mzk2CitteV9wcm9ndWFyZF9zZGtfcmFpc2UgOj0KIGlmZGVmIExPQ0FMX1NES19WRVJTSU9OCiBpZmRlZiBUQVJHRVRfQlVJTERfQVBQUwotaWZlcSAoLCQoZmlsdGVyIGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCi0gIG15X3N1cHBvcnRfbGlicmFyeV9zZGtfcmFpc2UgOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCBzZGtfdmN1cnJlbnQpCitpZmVxICgsJChmaWx0ZXIgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQgY29yZV9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCisgIG15X3Byb2d1YXJkX3Nka19yYWlzZSA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLCBzZGtfdmN1cnJlbnQpCiBlbmRpZgogZWxzZQogICAjIEZvciBwbGF0Zm9ybSBidWlsZCwgd2UgY2FuJ3QganVzdCByYWlzZSB0byB0aGUgImN1cnJlbnQiIFNESywKICAgIyB0aGF0IHdvdWxkIGJyZWFrIGFwcHMgdGhhdCB1c2UgQVBJcyByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgU0RLLgotICBteV9zdXBwb3J0X2xpYnJhcnlfc2RrX3JhaXNlIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywkKFRBUkdFVF9ERUZBVUxUX0pBVkFfTElCUkFSSUVTKSkKLWVuZGlmCisgIG15X3Byb2d1YXJkX3Nka19yYWlzZSA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLCQoVEFSR0VUX0RFRkFVTFRfQk9PVENMQVNTUEFUSF9MSUJSQVJJRVMpICQoVEFSR0VUX0RFRkFVTFRfSkFWQV9MSUJSQVJJRVMpKQogZW5kaWYKIGVuZGlmCiAKLSMgamFjayBhbHJlYWR5IGhhcyB0aGUgbGlicmFyaWVzIGluIGl0cyBjbGFzc3BhdGggYW5kIGRvZXNuJ3Qgc3VwcG9ydCBqYXJzCi1sZWdhY3lfcHJvZ3VhcmRfZmxhZ3MgOj0gJChhZGRwcmVmaXggLWxpYnJhcnlqYXJzICwkKG15X3N1cHBvcnRfbGlicmFyeV9zZGtfcmFpc2UpIFwKLSAgJChmaWx0ZXItb3V0ICQobXlfc3VwcG9ydF9saWJyYXJ5X3Nka19yYWlzZSksJChmdWxsX3NoYXJlZF9qYXZhX2xpYnMpKSkKK2lmZXEgKCQoVVNFX1I4KSx0cnVlKQorcHJvZ3VhcmRfamFyc19wcmVmaXggOj0gLWxpYnJhcnlqYXJzCitlbHNlCitwcm9ndWFyZF9qYXJzX3ByZWZpeCA6PSAtc3lzdGVtamFycworZW5kaWYKK2xlZ2FjeV9wcm9ndWFyZF9mbGFncyA6PSAkKGFkZHByZWZpeCAkKHByb2d1YXJkX2phcnNfcHJlZml4KSAsJChteV9wcm9ndWFyZF9zZGtfcmFpc2UpIFwKKyAgJChmaWx0ZXItb3V0ICQobXlfcHJvZ3VhcmRfc2RrX3JhaXNlKSwgXAorICAgICQoZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicykgXAorICAgICQoZnVsbF9zaGFyZWRfamF2YV9oZWFkZXJfbGlicykpKQorCitsZWdhY3lfcHJvZ3VhcmRfbGliX2RlcHMgOj0gJChteV9wcm9ndWFyZF9zZGtfcmFpc2UpIFwKKyAgJChmaWx0ZXItb3V0ICQobXlfcHJvZ3VhcmRfc2RrX3JhaXNlKSwkKGZ1bGxfc2hhcmVkX2phdmFfaGVhZGVyX2xpYnMpKQogCiBsZWdhY3lfcHJvZ3VhcmRfZmxhZ3MgKz0gLXByaW50bWFwcGluZyAkKHByb2d1YXJkX2RpY3Rpb25hcnkpCi1qYWNrX3Byb2d1YXJkX2ZsYWdzIDo9IC1wcmludG1hcHBpbmcgJChqYWNrX2RpY3Rpb25hcnkpCiAKIGNvbW1vbl9wcm9ndWFyZF9mbGFncyA6PSAtZm9yY2Vwcm9jZXNzaW5nCiAKLWNvbW1vbl9wcm9ndWFyZF9mbGFnX2ZpbGVzIDo9Ci1pZmVxICgkKGZpbHRlciBub3N5c3RlbSwkKExPQ0FMX1BST0dVQVJEX0VOQUJMRUQpKSwpCi1jb21tb25fcHJvZ3VhcmRfZmxhZ19maWxlcyArPSAkKEJVSUxEX1NZU1RFTSkvcHJvZ3VhcmQuZmxhZ3MKLWlmZXEgKCQoTE9DQUxfRU1NQV9JTlNUUlVNRU5UKSx0cnVlKQotaWZkZWYgTE9DQUxfSkFDS19FTkFCTEVECi1jb21tb25fcHJvZ3VhcmRfZmxhZ19maWxlcyArPSAkKEJVSUxEX1NZU1RFTSkvcHJvZ3VhcmQuamFjb2NvLmZsYWdzCi1lbHNlCi1jb21tb25fcHJvZ3VhcmRfZmxhZ3MgKz0gLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Byb2d1YXJkLmVtbWEuZmxhZ3MKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECi1lbmRpZgotIyBJZiB0aGlzIGlzIGEgdGVzdCBwYWNrYWdlLCBhZGQgcHJvZ3VhcmQga2VlcCBmbGFncyBmb3IgdGVzdHMuCitjb21tb25fcHJvZ3VhcmRfZmxhZ19maWxlcyA6PSAkKEJVSUxEX1NZU1RFTSkvcHJvZ3VhcmQuZmxhZ3MKIGlmbmVxICgkKExPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IpJChmaWx0ZXIgdGVzdHMsJChMT0NBTF9NT0RVTEVfVEFHUykpLCkKLWNvbW1vbl9wcm9ndWFyZF9mbGFnX2ZpbGVzICs9ICQoQlVJTERfU1lTVEVNKS9wcm9ndWFyZF90ZXN0cy5mbGFncwotaWZlcSAoJChmaWx0ZXIgc2hyaW5rdGVzdHMsJChMT0NBTF9QUk9HVUFSRF9FTkFCTEVEKSksKQogY29tbW9uX3Byb2d1YXJkX2ZsYWdzICs9IC1kb250c2hyaW5rICMgZG9uJ3Qgc2hyaW5rIHRlc3RzIGJ5IGRlZmF1bHQKLWVuZGlmICMgc2hyaW5rdGVzdHMKIGVuZGlmICMgdGVzdCBwYWNrYWdlCitpZm5lcSAoJChMT0NBTF9QUk9HVUFSRF9FTkFCTEVEKSxjdXN0b20pCisgIGlmZGVmIExPQ0FMX1VTRV9BQVBUMgorICAgIGNvbW1vbl9wcm9ndWFyZF9mbGFnX2ZpbGVzICs9ICQoZm9yZWFjaCBsLCQoTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTKSxcCisgICAgICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsJChsKSwsQ09NTU9OKS9leHBvcnRfcHJvZ3VhcmRfZmxhZ3MpCisgIGVuZGlmCitlbmRpZgogaWZuZXEgKCQoY29tbW9uX3Byb2d1YXJkX2ZsYWdfZmlsZXMpLCkKIGNvbW1vbl9wcm9ndWFyZF9mbGFncyArPSAkKGFkZHByZWZpeCAtaW5jbHVkZSAsICQoY29tbW9uX3Byb2d1YXJkX2ZsYWdfZmlsZXMpKQogIyBUaGlzIGlzIGluY2x1ZGVkIGZyb20gJChCVUlMRF9TWVNURU0pL3Byb2d1YXJkLmZsYWdzCkBAIC02MDQsOCArNjc0LDggQEAKIGlmZXEgKCQoZmlsdGVyIG9iZnVzY2F0aW9uLCQoTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCkpLCkKICMgSWYgbm8gb2JmdXNjYXRpb24sIGxpbmsgaW4gdGhlIGluc3RybWVudGVkIHBhY2thZ2UncyBjbGFzc2VzLmphciBhcyBhIGxpYnJhcnkuCiAjIGxpbmtfaW5zdHJfY2xhc3Nlc19qYXIgaXMgZGVmaW5lZCBpbiBiYXNlX3J1bGUubWsKLSMgamFjayBhbHJlYWR5IGhhcyB0aGlzIGxpYnJhcnkgaW4gaXRzIGNsYXNzcGF0aCBhbmQgZG9lc24ndCBzdXBwb3J0IGphcnMKIGxlZ2FjeV9wcm9ndWFyZF9mbGFncyArPSAtbGlicmFyeWphcnMgJChsaW5rX2luc3RyX2NsYXNzZXNfamFyKQorbGVnYWN5X3Byb2d1YXJkX2xpYl9kZXBzICs9ICQobGlua19pbnN0cl9jbGFzc2VzX2phcikKIGVsc2UgIyBvYmZ1c2NhdGlvbgogIyBJZiBvYmZ1c2NhdGlvbiBpcyBlbmFibGVkLCB0aGUgbWFpbiBhcHAgbXVzdCBiZSBvYmZ1c2NhdGVkIHRvby4KICMgV2UgbmVlZCB0byBydW4gb2JmdXNjYXRpb24gdXNpbmcgdGhlIG1haW4gYXBwJ3MgZGljdGlvbmFyeSwKQEAgLTYxNiwxMCArNjg2LDYgQEAKICAgICAtYXBwbHltYXBwaW5nICQobGlua19pbnN0cl9pbnRlcm1lZGlhdGVzX2Rpci5DT01NT04pL3Byb2d1YXJkX2RpY3Rpb25hcnkgXAogICAgIC12ZXJib3NlIFwKICAgICAkKGxlZ2FjeV9wcm9ndWFyZF9mbGFncykKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotamFja19wcm9ndWFyZF9mbGFncyArPSAtYXBwbHltYXBwaW5nICQobGlua19pbnN0cl9pbnRlcm1lZGlhdGVzX2Rpci5DT01NT04pL2phY2tfZGljdGlvbmFyeQotZnVsbF9qYWNrX2RlcHMgKz0gJChsaW5rX2luc3RyX2ludGVybWVkaWF0ZXNfZGlyLkNPTU1PTikvamFja19kaWN0aW9uYXJ5Ci1lbmRpZgogCiAjIFNvbWV0aW1lcyAodGVzdCArIG1haW4gYXBwKSB1c2VzIGRpZmZlcmVudCBrZWVwIHJ1bGVzIGZyb20gdGhlIG1haW4gYXBwIC0KICMgYXBwbHkgdGhlIG1haW4gYXBwJ3MgZGljdGlvbmFyeSBhbnl3YXkuCkBAIC02MzAsOSArNjk2LDExIEBACiAKIGVuZGlmICMgbm8gb2JmdXNjYXRpb24KIGVuZGlmICMgTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUgotZW5kaWYgICMgTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCBpcyBub3Qgbm9zeXN0ZW0KIAogcHJvZ3VhcmRfZmxhZ19maWxlcyA6PSAkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywgJChMT0NBTF9QUk9HVUFSRF9GTEFHX0ZJTEVTKSkKK2lmZXEgKCQoVVNFX1I4KSx0cnVlKQorcHJvZ3VhcmRfZmxhZ19maWxlcyArPSAkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywgJChMT0NBTF9SOF9GTEFHX0ZJTEVTKSkKK2VuZGlmICMgVVNFX1I4CiBMT0NBTF9QUk9HVUFSRF9GTEFHUyArPSAkKGFkZHByZWZpeCAtaW5jbHVkZSAsICQocHJvZ3VhcmRfZmxhZ19maWxlcykpCiAKIGlmZGVmIExPQ0FMX1RFU1RfTU9EVUxFX1RPX1BST0dVQVJEX1dJVEgKQEAgLTY0MSw1MiArNzA5LDY2IEBACiBleHRyYV9pbnB1dF9qYXIgOj0KIGVuZGlmCiAKLSMgSWYgbm90IHVzaW5nIGphY2sgYW5kIGJ1aWxkaW5nIGFnYWluc3QgdGhlIGN1cnJlbnQgU0RLIHZlcnNpb24gdGhlbiBmaWx0ZXIKLSMgb3V0IHRoZSBqdW5pdCwgYW5kcm9pZC50ZXN0IGFuZCBjLmEuaS51LlByZWRpY2F0ZSBjbGFzc2VzIHRoYXQgYXJlIHRvIGJlCi0jIHJlbW92ZWQgZnJvbSB0aGUgQW5kcm9pZCBBUEkgYXMgcGFydCBvZiBiLzMwMTg4MDc2IGJ1dCB3aGljaCBhcmUgc3RpbGwKLSMgcHJlc2VudCBpbiB0aGUgQW5kcm9pZCBBUEkuIFRoaXMgaXMgdG8gYWxsb3cgY2hhbmdlcyB0byBiZSBtYWRlIHRvIHRoZQotIyBidWlsZCB0byBzdGF0aWNhbGx5IGluY2x1ZGUgdGhvc2UgY2xhc3NlcyBpbnRvIHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0Ci0jIHNpbXVsdGFuZW91c2x5IHJlbW92aW5nIHRob3NlIGNsYXNzZXMgZnJvbSB0aGUgQVBJLgotcHJvZ3VhcmRfaW5qYXJfZmlsdGVycyA6PQotaWZuZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotaWZkZWYgTE9DQUxfU0RLX1ZFUlNJT04KLWlmZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsICQoTE9DQUxfU0RLX1ZFUlNJT04pKSkKLXByb2d1YXJkX2luamFyX2ZpbHRlcnMgOj0gKCFqdW5pdC9mcmFtZXdvcmsvKiosIWp1bml0L3J1bm5lci8qKiwhanVuaXQvdGV4dHVpLyoqLCFhbmRyb2lkL3Rlc3QvKiosIWNvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvKikKLWVuZGlmCitpZm5lcSAoJChmaWx0ZXIgb2JmdXNjYXRpb24sJChMT0NBTF9QUk9HVUFSRF9FTkFCTEVEKSksKQoraWZuZXEgKCQoVVNFX1I4KSx0cnVlKQorICAkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQocHJvZ3VhcmRfZGljdGlvbmFyeSkKK2Vsc2UKKyAgJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKHByb2d1YXJkX2RpY3Rpb25hcnkpCiBlbmRpZgogZW5kaWYKIAotJChmdWxsX2NsYXNzZXNfcHJvZ3VhcmRfamFyKTogUFJJVkFURV9QUk9HVUFSRF9JTkpBUl9GSUxURVJTIDo9ICQocHJvZ3VhcmRfaW5qYXJfZmlsdGVycykKKyMgSWYgUjggaXMgbm90IGVuYWJsZWQgcnVuIFByb2d1YXJkLgoraWZuZXEgKCQoVVNFX1I4KSx0cnVlKQorIyBDaGFuZ2VzIHRvIHRoZXNlIGRlcGVuZGVuY2llcyBuZWVkIHRvIGJlIHJlcGxpY2F0ZWQgYmVsb3cgd2hlbiB1c2luZyBSOAorIyBpbnN0ZWFkIG9mIFByb2d1YXJkICsgZHguCiAkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpOiBQUklWQVRFX0VYVFJBX0lOUFVUX0pBUiA6PSAkKGV4dHJhX2lucHV0X2phcikKICQoZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phcik6IFBSSVZBVEVfUFJPR1VBUkRfRkxBR1MgOj0gJChsZWdhY3lfcHJvZ3VhcmRfZmxhZ3MpICQoY29tbW9uX3Byb2d1YXJkX2ZsYWdzKSAkKExPQ0FMX1BST0dVQVJEX0ZMQUdTKQotJChmdWxsX2NsYXNzZXNfcHJvZ3VhcmRfamFyKSA6ICQoZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIpICQoZXh0cmFfaW5wdXRfamFyKSAkKG15X3N1cHBvcnRfbGlicmFyeV9zZGtfcmFpc2UpICQoY29tbW9uX3Byb2d1YXJkX2ZsYWdfZmlsZXMpICQocHJvZ3VhcmRfZmxhZ19maWxlcykgfCAkKFBST0dVQVJEKQorJChmdWxsX2NsYXNzZXNfcHJvZ3VhcmRfamFyKSA6ICQoZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIpICQoZXh0cmFfaW5wdXRfamFyKSAkKG15X3Byb2d1YXJkX3Nka19yYWlzZSkgJChjb21tb25fcHJvZ3VhcmRfZmxhZ19maWxlcykgJChwcm9ndWFyZF9mbGFnX2ZpbGVzKSAkKGxlZ2FjeV9wcm9ndWFyZF9saWJfZGVwcykgfCAkKFBST0dVQVJEKQogCSQoY2FsbCB0cmFuc2Zvcm0tamFyLXRvLXByb2d1YXJkKQorZWxzZSAjICFVU0VfUjgKKyMgUnVubmluZyBSOCBpbnN0ZWFkIG9mIFByb2d1YXJkLCBwcm9ndWFyZGVkIGphciBpcyBhY3R1YWxseSB0aGUgcHJlLVByb2d1YXJkZWQgamFyLgorZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19wcmVfcHJvZ3VhcmRfamFyKQorZW5kaWYgIyAhVVNFX1I4CiAKIGVsc2UgICMgTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCBub3QgZGVmaW5lZAorcHJvZ3VhcmRfZmxhZ19maWxlcyA6PQogZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phciA6PSAkKGZ1bGxfY2xhc3Nlc19wcmVfcHJvZ3VhcmRfamFyKQogZW5kaWYgIyBMT0NBTF9QUk9HVUFSRF9FTkFCTEVEIGRlZmluZWQKIAotJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phciksJChmdWxsX2NsYXNzZXNfamFyKSkpCi0KLSQoY2FsbCBkZWZpbmUtamFyLXRvLXRvYy1ydWxlLCAkKGZ1bGxfY2xhc3Nlc19qYXIpKQotCiBpZm5lcSAoJChMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZKSx0cnVlKQotaWZuZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAogJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9EWF9GTEFHUyA6PSAkKExPQ0FMX0RYX0ZMQUdTKQotIyBJZiB5b3UgaW5zdHJ1bWVudCBjbGFzcyBmaWxlcyB0aGF0IGhhdmUgbG9jYWwgdmFyaWFibGUgZGVidWcgaW5mb3JtYXRpb24gaW4KLSMgdGhlbSBlbW1hIGRvZXMgbm90IGNvcnJlY3RseSBtYWludGFpbiB0aGUgbG9jYWwgdmFyaWFibGUgdGFibGUuCi0jIFRoaXMgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIHlvdSB0cnkgdG8gY29udmVydCB0aGUgY2xhc3MgZmlsZXMgZm9yIEFuZHJvaWQuCi0jIFRoZSB3b3JrYXJvdW5kIGhlcmUgaXMgdG8gYnVpbGQgZGlmZmVyZW50IGRleCBmaWxlIGhlcmUgYmFzZWQgb24gZW1tYSBzd2l0Y2gKLSMgdGhlbiBsYXRlciBjb3B5IGludG8gY2xhc3Nlcy5kZXguIFdoZW4gZW1tYSBpcyBvbiwgZHggaXMgcnVuIHdpdGggLS1uby1sb2NhbHMKLSMgb3B0aW9uIHRvIHJlbW92ZSBsb2NhbCB2YXJpYWJsZSBpbmZvcm1hdGlvbgotaWZlcSAoJChMT0NBTF9FTU1BX0lOU1RSVU1FTlQpLHRydWUpCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0RYX0ZMQUdTICs9IC0tbm8tbG9jYWxzCi1lbmRpZgotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogJChmdWxsX2NsYXNzZXNfamFyKSAkKERYKQotCSQodHJhbnNmb3JtLWNsYXNzZXMuamFyLXRvLWRleCkKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVEIGlzIGRpc2FibGVkCiAKLSQoYnVpbHRfZGV4KTogJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKQorbXlfcjggOj0KK2lmZGVmIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQKK2lmZXEgKCQoVVNFX1I4KSx0cnVlKQorIyBUaGVzZSBhcmUgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHByb2d1YXJkZWQgamFyIHdoZW4gcnVubmluZworIyBQcm9ndWFyZCArIGR4LiBUaGV5IGFyZSB1c2VkIGZvciB0aGUgZ2VuZXJhdGVkIGRleCB3aGVuIHVzaW5nIFI4LCBhcworIyBSOCBkb2VzIFByb2d1YXJkICsgZHgKK215X3I4IDo9IHRydWUKKyQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfRVhUUkFfSU5QVVRfSkFSIDo9ICQoZXh0cmFfaW5wdXRfamFyKQorJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9QUk9HVUFSRF9GTEFHUyA6PSAkKGxlZ2FjeV9wcm9ndWFyZF9mbGFncykgJChjb21tb25fcHJvZ3VhcmRfZmxhZ3MpICQoTE9DQUxfUFJPR1VBUkRfRkxBR1MpCiskKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpIDogJChmdWxsX2NsYXNzZXNfcHJvZ3VhcmRfamFyKSAkKGV4dHJhX2lucHV0X2phcikgJChteV9zdXBwb3J0X2xpYnJhcnlfc2RrX3JhaXNlKSAkKGNvbW1vbl9wcm9ndWFyZF9mbGFnX2ZpbGVzKSAkKHByb2d1YXJkX2ZsYWdfZmlsZXMpICQobGVnYWN5X3Byb2d1YXJkX2xpYl9kZXBzKSAkKFI4X0NPTVBBVF9QUk9HVUFSRCkKKwkkKHRyYW5zZm9ybS1qYXItdG8tZGV4LXI4KQorZW5kaWYgIyBVU0VfUjgKK2VuZGlmICMgTE9DQUxfUFJPR1VBUkRfRU5BQkxFRAorCitpZm5kZWYgbXlfcjgKKyQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6ICQoZnVsbF9jbGFzc2VzX3Byb2d1YXJkX2phcikgJChEWCkgJChaSVAyWklQKQoraWZuZXEgKCQoVVNFX0Q4X0RFU1VHQVIpLHRydWUpCisJJCh0cmFuc2Zvcm0tY2xhc3Nlcy5qYXItdG8tZGV4KQorZWxzZQorCSQodHJhbnNmb3JtLWNsYXNzZXMtZDguamFyLXRvLWRleCkKK2VuZGlmCitlbmRpZgorCitpZm5lcSAoJChmaWx0ZXIgJChMT0NBTF9NT0RVTEUpLCQoUFJPRFVDVF9CT09UX0pBUlMpKSwpICMgaXNfYm9vdF9qYXIKKyAgJChldmFsICQoY2FsbCBoaWRkZW5hcGktY29weS1kZXgtZmlsZXMsJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKSwkKGJ1aWx0X2RleF9oaWRkZW5hcGkpKSkKKyAgYnVpbHRfZGV4X2NvcHlfZnJvbSA6PSAkKGJ1aWx0X2RleF9oaWRkZW5hcGkpCitlbHNlICMgIWlzX2Jvb3RfamFyCisgIGJ1aWx0X2RleF9jb3B5X2Zyb20gOj0gJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKQorZW5kaWYgIyBpc19ib290X2phcgorCiskKGJ1aWx0X2RleCk6ICQoYnVpbHRfZGV4X2NvcHlfZnJvbSkKIAlAZWNobyBDb3B5aW5nOiAkQAogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCiAJJChoaWRlKSBybSAtZiAkKGRpciAkQCkvY2xhc3NlcyouZGV4CkBAIC03MjIsMTM1ICs4MDQsMjAgQEAKIAogZW5kaWYgICMgZnVsbF9jbGFzc2VzX2phciBpcyBkZWZpbmVkCiAKLWlmbmVxICgsJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQoTE9DQUxfU0RLX1ZFUlNJT04pCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9TREtfVkVSU0lPTiA6PSAkKExPQ0FMX1NES19WRVJTSU9OKQoraWZuZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQgY29yZV9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCisgIG15X2RlZmF1bHRfYXBwX3RhcmdldF9zZGsgOj0gJChjYWxsIGdldC1udW1lcmljLXNkay12ZXJzaW9uLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQorICBteV9zZGtfdmVyc2lvbiA6PSAkKGNhbGwgZ2V0LW51bWVyaWMtc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpCiBlbHNlCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9ERUZBVUxUX0FQUF9UQVJHRVRfU0RLIDo9ICQoREVGQVVMVF9BUFBfVEFSR0VUX1NESykKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NES19WRVJTSU9OIDo9ICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCisgIG15X2RlZmF1bHRfYXBwX3RhcmdldF9zZGsgOj0gJChERUZBVUxUX0FQUF9UQVJHRVRfU0RLKQorICBteV9zZGtfdmVyc2lvbiA6PSAkKFBMQVRGT1JNX1NES19WRVJTSU9OKQogZW5kaWYKIAotaWZkZWYgTE9DQUxfSkFDS19FTkFCTEVECi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogXAotCVBSSVZBVEVfSkFDS19JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYWNrLXJzYwotaWZlcSAoJChMT0NBTF9KQUNLX0VOQUJMRUQpLGluY3JlbWVudGFsKQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFwKLQlQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY2staW5jcmVtZW50YWwKLSQobm9zaHJvYl9jbGFzc2VzX2phY2spOiBQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY2stbm9zaHJvYi1pbmNyZW1lbnRhbAotJChqYWNrX2NoZWNrX3RpbWVzdGFtcCk6IFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjay1jaGVjay1pbmNyZW1lbnRhbAoraWZkZWYgTE9DQUxfTUlOX1NES19WRVJTSU9OCisgIG15X21pbl9zZGtfdmVyc2lvbiA6PSAkKExPQ0FMX01JTl9TREtfVkVSU0lPTikKIGVsc2UKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBcCi0JUFJJVkFURV9KQUNLX0lOQ1JFTUVOVEFMX0RJUiA6PQotJChub3Nocm9iX2NsYXNzZXNfamFjayk6IFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIgOj0KLSQoamFja19jaGVja190aW1lc3RhbXApOiBQUklWQVRFX0pBQ0tfSU5DUkVNRU5UQUxfRElSIDo9CisgIG15X21pbl9zZGtfdmVyc2lvbiA6PSAkKGNhbGwgY29kZW5hbWUtb3Itc2RrLXRvLXNkaywkKG15X2RlZmF1bHRfYXBwX3RhcmdldF9zZGspKQogZW5kaWYKIAotaWZkZWYgZnVsbF9jbGFzc2VzX2phcgotaWZkZWYgTE9DQUxfUFJPR1VBUkRfRU5BQkxFRAotCi1pZm5kZWYgTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUwotICAgIExPQ0FMX0pBQ0tfUFJPR1VBUkRfRkxBR1MgOj0gJChMT0NBTF9QUk9HVUFSRF9GTEFHUykKLWVuZGlmCi1MT0NBTF9KQUNLX1BST0dVQVJEX0ZMQUdTICs9ICQoYWRkcHJlZml4IC1pbmNsdWRlICwgJChwcm9ndWFyZF9mbGFnX2ZpbGVzKSkKLWlmZGVmIExPQ0FMX1RFU1RfTU9EVUxFX1RPX1BST0dVQVJEX1dJVEgKLSAgICAkKGVycm9yICQoTE9DQUxfTU9EVUxFKTogQnVpbGQgd2l0aCBqYWNrIHdoZW4gTE9DQUxfVEVTVF9NT0RVTEVfVE9fUFJPR1VBUkRfV0lUSCBpcyBkZWZpbmVkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQpCi1lbmRpZgotCi0jICQoamFja19kaWN0aW9uYXJ5KSBpcyBqdXN0IGJ5LXByb2R1Y3Qgb2YgJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKS4KLSMgVGhlIGR1bW15IGNvbW1hbmQgd2FzIGFkZGVkIGJlY2F1c2UsIHdpdGhvdXQgaXQsIG1ha2UgbWlzc2VzIHRoZSBmYWN0IHRoZSAkKGJ1aWx0X2RleCkgYWxzbwotIyBjaGFuZ2UgJChqYWNrX2RpY3Rpb25hcnkpLgotJChqYWNrX2RpY3Rpb25hcnkpOiAkKGZ1bGxfY2xhc3Nlc19qYWNrKQotCSQoaGlkZSkgdG91Y2ggJEAKLQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSkFDS19QUk9HVUFSRF9GTEFHUyA6PSAkKGNvbW1vbl9wcm9ndWFyZF9mbGFncykgJChqYWNrX3Byb2d1YXJkX2ZsYWdzKSAkKExPQ0FMX0pBQ0tfUFJPR1VBUkRfRkxBR1MpCi1lbHNlICAjIExPQ0FMX1BST0dVQVJEX0VOQUJMRUQgbm90IGRlZmluZWQKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0pBQ0tfUFJPR1VBUkRfRkxBR1MgOj0KLWVuZGlmICMgTE9DQUxfUFJPR1VBUkRfRU5BQkxFRCBkZWZpbmVkCi0KLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0pBQ0tfRkxBR1MgOj0gJChHTE9CQUxfSkFWQUNfREVCVUdfRkxBR1MpICQoTE9DQUxfSkFDS19GTEFHUykgJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9mbGFncykKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0pBQ0tfVkVSU0lPTiA6PSAkKExPQ0FMX0pBQ0tfVkVSU0lPTikKLQotamFja19hbGxfZGVwcyA6PSAkKGphdmFfc291cmNlcykgJChqYXZhX3Jlc291cmNlX3NvdXJjZXMpICQoZnVsbF9qYWNrX2RlcHMpIFwKLSAgICAgICAgJChqYXJfbWFuaWZlc3RfZmlsZSkgJChsYXllcnNfZmlsZSkgJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCkgXAotICAgICAgICAkKGNvbW1vbl9wcm9ndWFyZF9mbGFnX2ZpbGVzKSAkKHByb2d1YXJkX2ZsYWdfZmlsZXMpIFwKLSAgICAgICAgJChwcm90b19qYXZhX3NvdXJjZXNfZmlsZV9zdGFtcCkgJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9kZXBzKSBcCi0gICAgICAgICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpICQoTE9DQUxfSkFSSkFSX1JVTEVTKSBcCi0gICAgICAgICQoTk9STUFMSVpFX1BBVEgpICQoSkFDS19ERUZBVUxUX0FSR1MpICQoSkFDSykKLQotJChqYWNrX2NoZWNrX3RpbWVzdGFtcCk6ICQoamFja19hbGxfZGVwcykgfCBzZXR1cC1qYWNrLXNlcnZlcgotCUBlY2hvIENoZWNraW5nIGJ1aWxkIHdpdGggSmFjazogJEAKLQkkKGphY2stY2hlY2stamF2YSkKLQotaWZlcSAoJChMT0NBTF9JU19TVEFUSUNfSkFWQV9MSUJSQVJZKSx0cnVlKQotJChmdWxsX2NsYXNzZXNfamFjayk6IFBSSVZBVEVfSkFDS19QTFVHSU5fUEFUSCA6PSAkKExPQ0FMX0pBQ0tfUExVR0lOX1BBVEgpCi0kKGZ1bGxfY2xhc3Nlc19qYWNrKTogUFJJVkFURV9KQUNLX1BMVUdJTiA6PSAkKExPQ0FMX0pBQ0tfUExVR0lOKQotJChmdWxsX2NsYXNzZXNfamFjayk6ICQoamFja19hbGxfZGVwcykgJChMT0NBTF9KQUNLX1BMVUdJTl9QQVRIKSB8IHNldHVwLWphY2stc2VydmVyCi0JQGVjaG8gQnVpbGRpbmcgd2l0aCBKYWNrOiAkQAotCSQoamF2YS10by1qYWNrKQotCi0jIFVwZGF0ZSB0aW1lc3RhbXBzIG9mIC50b2MgZmlsZXMgZm9yIHN0YXRpYyBqYXZhIGxpYnJhcmllcyBzbwotIyBkZXBlbmRlbnRzIHdpbGwgYmUgYWx3YXlzIHJlYnVpbHQuCi0kKGJ1aWx0X2RleCkudG9jOiAkKGZ1bGxfY2xhc3Nlc19qYWNrKQotCXRvdWNoICRACi0KLWVsc2UgI0xPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkKLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfQ0xBU1NFU19KQUNLIDo9ICQoZnVsbF9jbGFzc2VzX2phY2spCi0KLWlmZXEgKCQoTE9DQUxfRU1NQV9JTlNUUlVNRU5UKSx0cnVlKQotTE9DQUxfSkFDS19QTFVHSU5fUEFUSCArPSAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS9qYWNrLWNvdmVyYWdlLXBsdWdpbi5qYXIKLUxPQ0FMX0pBQ0tfUExVR0lOICs9IGNvbS5hbmRyb2lkLmphY2suY292ZXJhZ2UuQ29kZUNvdmVyYWdlCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0pBQ0tfQ09WRVJBR0VfT1BUSU9OUyA6PSBcCi0gICAgLUQgamFjay5jb3ZlcmFnZT10cnVlIFwKLSAgICAtRCBqYWNrLmNvdmVyYWdlLm1ldGFkYXRhLmZpbGU9JChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY292ZXJhZ2UuZW0gXAotICAgIC1EIGphY2suY292ZXJhZ2UuamFjb2NvLnBhY2thZ2U9JChKQUNPQ09fUEFDS0FHRV9OQU1FKSBcCi0gICAgJChhZGRwcmVmaXggLUQgamFjay5jb3ZlcmFnZS5qYWNvY28uaW5jbHVkZT0sJChMT0NBTF9KQUNLX0NPVkVSQUdFX0lOQ0xVREVfRklMVEVSKSkgXAotICAgICQoYWRkcHJlZml4IC1EIGphY2suY292ZXJhZ2UuamFjb2NvLmV4Y2x1ZGU9LCQoTE9DQUxfSkFDS19DT1ZFUkFHRV9FWENMVURFX0ZJTFRFUikpCi1lbHNlCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0pBQ0tfQ09WRVJBR0VfT1BUSU9OUyA6PQotZW5kaWYKLQotIyBDb21waWxpbmcgd2l0aCBqYXZhYyB0byBqYXIsIHRoZW4gY29udmVydGluZyBqYXIgdG8gZGV4IHdpdGggamFjawotaWZlcSAoJChMT0NBTF9KQUNLX0VOQUJMRUQpLGphdmFjX2Zyb250ZW5kKQotCi0jIFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MgYW5kIHNvdXJjZSBmaWxlcyB3ZXJlIGFscmVhZHkgaGFuZGxlZCBkdXJpbmcgamF2YWMKLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfRVhUUkFfSkFSX0FSR1MgOj0KLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfSkFWQV9TT1VSQ0VTIDo9Ci0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUiA6PQotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9IQVNfUFJPVE9fU09VUkNFUyA6PQotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9IQVNfUlNfU09VUkNFUyA6PQotCi0jIEluY3JlbWVudGFsIGNvbXBpbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBtaXhpbmcgamF2YWMgYW5kIGphY2sKLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfSkFDS19JTkNSRU1FTlRBTF9ESVIgOj0KLQotIyBQYXNzIG91dHB1dCBvZiBqYXZhYyB0byBqYWNrCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0pBQ0tfSU1QT1JUX0pBUiA6PSAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpCi1lbHNlICMgTE9DQUxfSkFDS19FTkFCTEVEICE9IGphdmFjX2Zyb250ZW5kCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiBQUklWQVRFX0pBQ0tfSU1QT1JUX0pBUiA6PQotZW5kaWYgIyBMT0NBTF9KQUNLX0VOQUJMRUQgIT0gamF2YWNfZnJvbnRlbmQKLQotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKTogUFJJVkFURV9KQUNLX1BMVUdJTl9QQVRIIDo9ICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkKLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6IFBSSVZBVEVfSkFDS19QTFVHSU4gOj0gJChMT0NBTF9KQUNLX1BMVUdJTikKLSQoYnVpbHRfZGV4X2ludGVybWVkaWF0ZSk6ICQoamFja19hbGxfZGVwcykgJChMT0NBTF9KQUNLX1BMVUdJTl9QQVRIKSB8IHNldHVwLWphY2stc2VydmVyCi0JQGVjaG8gQnVpbGRpbmcgd2l0aCBKYWNrOiAkQAotCSQoamFjay1qYXZhLXRvLWRleCkKLQotIyAkKGZ1bGxfY2xhc3Nlc19qYWNrKSBpcyBqdXN0IGJ5LXByb2R1Y3Qgb2YgJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKS4KLSMgVGhlIGR1bW15IGNvbW1hbmQgd2FzIGFkZGVkIGJlY2F1c2UsIHdpdGhvdXQgaXQsIG1ha2UgbWlzc2VzIHRoZSBmYWN0IHRoZSAkKGJ1aWx0X2RleCkgYWxzbwotIyBjaGFuZ2UgJChmdWxsX2NsYXNzZXNfamFjaykuCi0kKGZ1bGxfY2xhc3Nlc19qYWNrKTogJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKQotCSQoaGlkZSkgdG91Y2ggJEAKLQotJChjYWxsIGRlZmluZS1kZXgtdG8tdG9jLXJ1bGUsICQoaW50ZXJtZWRpYXRlcy5DT01NT04pKQotCi1lbmRpZiAjTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWQotCi0kKG5vc2hyb2JfY2xhc3Nlc19qYWNrKTogUFJJVkFURV9KQUNLX1BMVUdJTl9QQVRIIDo9ICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkKLSQobm9zaHJvYl9jbGFzc2VzX2phY2spOiBQUklWQVRFX0pBQ0tfUExVR0lOIDo9ICQoTE9DQUxfSkFDS19QTFVHSU4pCi0kKG5vc2hyb2JfY2xhc3Nlc19qYWNrKTogUFJJVkFURV9KQUNLX0lOVEVSTUVESUFURVNfRElSIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY2stbm9zaHJvYi1yc2MKLSQobm9zaHJvYl9jbGFzc2VzX2phY2spOiBQUklWQVRFX0pBQ0tfUFJPR1VBUkRfRkxBR1MgOj0KLSQobm9zaHJvYl9jbGFzc2VzX2phY2spOiAkKGphY2tfYWxsX2RlcHMpICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkgfCBzZXR1cC1qYWNrLXNlcnZlcgotCUBlY2hvIEJ1aWxkaW5nIHdpdGggSmFjazogJEAKLQkkKGphdmEtdG8tamFjaykKLWVuZGlmICAjIGZ1bGxfY2xhc3Nlc19qYXIgaXMgZGVmaW5lZAotZW5kaWYgIyBMT0NBTF9KQUNLX0VOQUJMRUQKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0RFRkFVTFRfQVBQX1RBUkdFVF9TREsgOj0gJChteV9kZWZhdWx0X2FwcF90YXJnZXRfc2RrKQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfU0RLX1ZFUlNJT04gOj0gJChteV9zZGtfdmVyc2lvbikKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX01JTl9TREtfVkVSU0lPTiA6PSAkKG15X21pbl9zZGtfdmVyc2lvbikKZGlmZiAtLWdpdCBhL2NvcmUvamF2YV9jb21tb24ubWsgYi9jb3JlL2phdmFfY29tbW9uLm1rCmluZGV4IGJmN2YwMzkuLmM5NzY1M2IgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YV9jb21tb24ubWsKKysrIGIvY29yZS9qYXZhX2NvbW1vbi5tawpAQCAtMSw1ICsxLDExIEBACiAjIENvbW1vbiB0byBob3N0IGFuZCB0YXJnZXQgSmF2YSBtb2R1bGVzLgogCitteV9zb29uZ19wcm9ibGVtcyA6PQorCitpZm5lcSAoJChmaWx0ZXIgLi4vJSwkKExPQ0FMX1NSQ19GSUxFUykpLCkKK215X3Nvb25nX3Byb2JsZW1zICs9IGRvdGRvdF9zcmNzCitlbmRpZgorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgSmF2YSB2ZXJzaW9uCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTUsMTggKzIxLDQ3IEBACiAjIE1vZHVsZXMgY2FuIG92ZXJyaWRlIHRoaXMgbG9naWMgYnkgc3BlY2lmeWluZwogIyBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gZXhwbGljaXRseS4KIGlmZXEgKCwkKExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTikpCi0gIHByaXZhdGVfc2RrX3ZlcnNpb25zX3dpdGhvdXRfYW55X2phdmFfMThfc3VwcG9ydCA6PSAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMwotICBpZm5lcSAoLCQoZmlsdGVyICQoTE9DQUxfU0RLX1ZFUlNJT04pLCAkKHByaXZhdGVfc2RrX3ZlcnNpb25zX3dpdGhvdXRfYW55X2phdmFfMThfc3VwcG9ydCkpKQorICBpZm5lcSAoLCQoZmlsdGVyICQoTE9DQUxfU0RLX1ZFUlNJT04pLCAkKFRBUkdFVF9TREtfVkVSU0lPTlNfV0lUSE9VVF9KQVZBXzE4X1NVUFBPUlQpKSkKICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMS43Ci0gIGVsc2UKKyAgZWxzZSBpZm5lcSAoLCQoZmlsdGVyICQoTE9DQUxfU0RLX1ZFUlNJT04pLCAkKFRBUkdFVF9TREtfVkVSU0lPTlNfV0lUSE9VVF9KQVZBXzE5X1NVUFBPUlQpKSkKICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMS44CisgIGVsc2UgaWZuZXEgKCwkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpKQorICAgICMgVE9ETyhjY3Jvc3MpOiBhbGxvdyAxLjkgZm9yIGN1cnJlbnQgYW5kIHVuYnVuZGxlZCBvbmNlIHdlIGhhdmUgU0RLIHN5c3RlbSBtb2R1bGVzCisgICAgTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OIDo9IDEuOAorICBlbHNlCisgICAgIyBERUZBVUxUX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiBpcyAxLjgsIHVubGVzcyBUQVJHRVRfT1BFTkpESzkgaW4gd2hpY2ggY2FzZSBpdCBpcyAxLjkKKyAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gJChERUZBVUxUX0pBVkFfTEFOR1VBR0VfVkVSU0lPTikKICAgZW5kaWYKIGVuZGlmCiBMT0NBTF9KQVZBQ0ZMQUdTICs9IC1zb3VyY2UgJChMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04pIC10YXJnZXQgJChMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04pCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgT3BlbkpESyB2ZXJzaW9ucyB1cCB0byA4IHNoaXBwZWQgd2l0aCBib290c3RyYXAgYW5kIHRvb2xzIGphcnMKKyMgKHJ0LmphciwgamNlLmphciwgdG9vbHMuamFyIGV0Yy4pLiBUaGVzZSBhcmUgbm8gbG9uZ2VyIHBhcnQgb2YKKyMgT3BlbkpESyA5LCBidXQgd2Ugc3RpbGwgbWFrZSB0aGVtIGF2YWlsYWJsZSBmb3IgaG9zdCB0b29scyB0aGF0CisjIGFyZSB0YXJnZXRpbmcgb2xkZXIgdmVyc2lvbnMuCitVU0VfSE9TVF9CT09UU1RSQVBfSkFSUyA6PSB0cnVlCitpZmVxICgsJChmaWx0ZXIgJChMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04pLCAxLjYgMS43IDEuOCkpCitVU0VfSE9TVF9CT09UU1RSQVBfSkFSUyA6PSBmYWxzZQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBEcm9wIEhPU1RfSkRLX1RPT0xTX0pBUiBmcm9tIGNsYXNzcGF0aCB3aGVuIHRhcmdldGluZyB2ZXJzaW9ucyA+IDkgKHdoaWNoIGRvbid0IGhhdmUgaXQpLgorIyBUT0RPOiBSZW1vdmUgSE9TVF9KREtfVE9PTFNfSkFSIGFuZCBhbGwgcmVmZXJlbmNlcyB0byBpdCBvbmNlIGhvc3QKKyMgYm9vdHN0cmFwIGphcnMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgKGllLiB3aGVuIFVTRV9IT1NUX0JPT1RTVFJBUF9KQVJTCisjIGlzIGFsd2F5cyBmYWxzZSkuIGh0dHA6Ly9iLzM4NDE4MjIwCitpZm5lcSAoJChVU0VfSE9TVF9CT09UU1RSQVBfSkFSUyksdHJ1ZSkKK0xPQ0FMX0NMQVNTUEFUSCA6PSAkKGZpbHRlci1vdXQgJChIT1NUX0pES19UT09MU19KQVIpLCQoTE9DQUxfQ0xBU1NQQVRIKSkKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyAucHJvdG8gZmlsZXM6IENvbXBpbGUgcHJvdG8gZmlsZXMgdG8gLmphdmEKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZmVxICgkKHN0cmlwICQoTE9DQUxfUFJPVE9DX09QVElNSVpFX1RZUEUpKSwpCisgIExPQ0FMX1BST1RPQ19PUFRJTUlaRV9UWVBFIDo9IGxpdGUKK2VuZGlmCiBwcm90b19zb3VyY2VzIDo9ICQoZmlsdGVyICUucHJvdG8sJChMT0NBTF9TUkNfRklMRVMpKQogIyBCZWNhdXNlIG5hbWVzIG9mIHRoZSAuamF2YSBmaWxlcyBjb21waWxlZCBmcm9tIC5wcm90byBmaWxlcyBhcmUgdW5rbm93biB1bnRpbCB0aGUKICMgLnByb3RvIGZpbGVzIGFyZSBjb21waWxlZCwgd2UgdXNlIGEgdGltZXN0YW1wIGZpbGUgYXMgZGVwZWRlbmN5LgpAQCAtNTYsNyArOTEsNyBAQAogICBlbmRpZgogZW5kaWYKICQocHJvdG9famF2YV9zb3VyY2VzX2ZpbGVfc3RhbXApOiBQUklWQVRFX1BST1RPQ19GTEFHUyA6PSAkKExPQ0FMX1BST1RPQ19GTEFHUykKLSQocHJvdG9famF2YV9zb3VyY2VzX2ZpbGVfc3RhbXApOiBQUklWQVRFX1BST1RPX0pBVkFfT1VUUFVUX1BBUkFNUyA6PSAkKExPQ0FMX1BST1RPX0pBVkFfT1VUUFVUX1BBUkFNUykKKyQocHJvdG9famF2YV9zb3VyY2VzX2ZpbGVfc3RhbXApOiBQUklWQVRFX1BST1RPX0pBVkFfT1VUUFVUX1BBUkFNUyA6PSAkKGlmICQoZmlsdGVyIGxpdGUsJChMT0NBTF9QUk9UT0NfT1BUSU1JWkVfVFlQRSkpLGxpdGUkKGlmICQoTE9DQUxfUFJPVE9fSkFWQV9PVVRQVVRfUEFSQU1TKSw6LCksKSQoTE9DQUxfUFJPVE9fSkFWQV9PVVRQVVRfUEFSQU1TKQogJChwcm90b19qYXZhX3NvdXJjZXNfZmlsZV9zdGFtcCkgOiAkKHByb3RvX3NvdXJjZXNfZnVsbHBhdGgpICQoUFJPVE9DKQogCSQoY2FsbCB0cmFuc2Zvcm0tcHJvdG8tdG8tamF2YSkKIApAQCAtMTYwLDcgKzE5NSw3IEBACiBhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9kZXBzIDo9CiAKIGlmZGVmIExPQ0FMX0FOTk9UQVRJT05fUFJPQ0VTU09SUwotICBhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9qYXJzIDo9ICQoY2FsbCBqYXZhLWxpYi1kZXBzLCQoTE9DQUxfQU5OT1RBVElPTl9QUk9DRVNTT1JTKSx0cnVlKQorICBhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9qYXJzIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywkKExPQ0FMX0FOTk9UQVRJT05fUFJPQ0VTU09SUyksdHJ1ZSkKICAgYW5ub3RhdGlvbl9wcm9jZXNzb3JfZmxhZ3MgKz0gLXByb2Nlc3NvcnBhdGggJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChhbm5vdGF0aW9uX3Byb2Nlc3Nvcl9qYXJzKSkKICAgYW5ub3RhdGlvbl9wcm9jZXNzb3JfZGVwcyArPSAkKGFubm90YXRpb25fcHJvY2Vzc29yX2phcnMpCiAKQEAgLTE3MCwxMiArMjA1LDExIEBACiAgIGFubm90YXRpb25fcHJvY2Vzc29yX2phcnMgOj0KIGVuZGlmCiAKLWZ1bGxfc3RhdGljX2phdmFfbGlicyA6PSBcCi0gICAgJChmb3JlYWNoIGxpYiwkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyksIFwKLSAgICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsIFwKLSAgICAgICAgSkFWQV9MSUJSQVJJRVMsJChsaWIpLCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpLENPTU1PTikvY2xhc3Nlcy5qYXIpCitmdWxsX3N0YXRpY19qYXZhX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSwkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSkKK2Z1bGxfc3RhdGljX2phdmFfaGVhZGVyX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcywkKExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyksJChMT0NBTF9JU19IT1NUX01PRFVMRSkpCiAKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSAkKGZ1bGxfc3RhdGljX2phdmFfbGlicykKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NUQVRJQ19KQVZBX0hFQURFUl9MSUJSQVJJRVMgOj0gJChmdWxsX3N0YXRpY19qYXZhX2hlYWRlcl9saWJzKQogCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9SRVNPVVJDRV9ESVIgOj0gJChMT0NBTF9SRVNPVVJDRV9ESVIpCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9BU1NFVF9ESVIgOj0gJChMT0NBTF9BU1NFVF9ESVIpCkBAIC0xODcsOTAgKzIyMSwxNTcgQEAKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1BST1RPX1NPVVJDRV9JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm90bwogJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfSEFTX1JTX1NPVVJDRVMgOj0KICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0pBVkFfU09VUkNFUyA6PSAkKGFsbF9qYXZhX3NvdXJjZXMpCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9KQVZBX1NPVVJDRV9MSVNUIDo9ICQoamF2YV9zb3VyY2VfbGlzdF9maWxlKQogCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9STVRZUEVERUZTIDo9ICQoTE9DQUxfUk1UWVBFREVGUykKIAotIyBmdWxsX2phdmFfbGliczogVGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgY2xhc3NwYXRoLgotIyAgICAgICAgICAgICAgICAgVXNpbmcgdGhpcyBsaXN0IGFzIGEgZGVwZW5kZW5jeSBsaXN0IFdJTEwgTk9UIFdPUksuCi0jIGZ1bGxfamF2YV9saWJfZGVwczogU2hvdWxkIGJlIHNwZWNpZmllZCBhcyBhIHByZXJlcXVpc2l0ZSBvZiB0aGlzIG1vZHVsZQotIyAgICAgICAgICAgICAgICAgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGZpbGVzIGluIGZ1bGxfamF2YV9saWJzIHdpbGwKLSMgICAgICAgICAgICAgICAgIGJlIHVwLXRvLWRhdGUuCitmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzIDo9CitlbXB0eV9ib290Y2xhc3NwYXRoIDo9CitteV9zeXN0ZW1fbW9kdWxlcyA6PQorCiBpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKLWlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLCkKLWlmZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQotIyBObyBib290Y2xhc3NwYXRoLiBCdXQgd2Ugc3RpbGwgbmVlZCAiIiB0byBwcmV2ZW50IGphdmFjIGZyb20gdXNpbmcgZGVmYXVsdCBob3N0IGJvb3RjbGFzc3BhdGguCi1teV9ib290Y2xhc3NwYXRoIDo9ICIiCi1lbHNlICAjIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUwotbXlfYm9vdGNsYXNzcGF0aCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsY29yZS1vaik6JChjYWxsIGphdmEtbGliLWZpbGVzLGNvcmUtbGliYXJ0KQotZW5kaWYgICMgTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTCi1lbHNlCi1pZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLGN1cnJlbnQpCi0jIExPQ0FMX1NES19WRVJTSU9OIGlzIGN1cnJlbnQgYW5kIG5vIFRBUkdFVF9CVUlMRF9BUFBTLgotbXlfYm9vdGNsYXNzcGF0aCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsYW5kcm9pZF9zdHVic19jdXJyZW50KQotZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLHN5c3RlbV9jdXJyZW50KQotbXlfYm9vdGNsYXNzcGF0aCA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsYW5kcm9pZF9zeXN0ZW1fc3R1YnNfY3VycmVudCkKLWVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSx0ZXN0X2N1cnJlbnQpCi1teV9ib290Y2xhc3NwYXRoIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcyxhbmRyb2lkX3Rlc3Rfc3R1YnNfY3VycmVudCkKLWVsc2UKLW15X2Jvb3RjbGFzc3BhdGggOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLHNka192JChMT0NBTF9TREtfVkVSU0lPTikpCi1lbmRpZiAjIGN1cnJlbnQsIHN5c3RlbV9jdXJyZW50LCBvciB0ZXN0X2N1cnJlbnQKLWVuZGlmICMgTE9DQUxfU0RLX1ZFUlNJT04KLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gLWJvb3RjbGFzc3BhdGggJChteV9ib290Y2xhc3NwYXRoKQorICBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSwpCisgICAgaWZlcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCisgICAgICAjIE5vIGJvb3RjbGFzc3BhdGguIEJ1dCB3ZSBzdGlsbCBuZWVkICIiIHRvIHByZXZlbnQgamF2YWMgZnJvbSB1c2luZyBkZWZhdWx0IGhvc3QgYm9vdGNsYXNzcGF0aC4KKyAgICAgIGVtcHR5X2Jvb3RjbGFzc3BhdGggOj0gIiIKKyAgICAgICMgTW9zdCB1c2VycyBvZiBMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMgcmVhbGx5IG1lYW4gbm8gZnJhbWV3b3JrIGxpYnMsCisgICAgICAjIGFuZCBtYW51YWxseSBhZGQgYmFjayB0aGUgY29yZSBsaWJzLiAgVGhlIG9uZXMgdGhhdCBkb24ndCBhcmUgaW4gc29vbmcKKyAgICAgICMgbm93LCBzbyBqdXN0IGFsd2F5cyBhc3N1bWUgdGhhdCB0aGV5IHdhbnQgdGhlIGRlZmF1bHQgc3lzdGVtIG1vZHVsZXMKKyAgICAgIG15X3N5c3RlbV9tb2R1bGVzIDo9ICQoREVGQVVMVF9TWVNURU1fTU9EVUxFUykKKyAgICBlbHNlICAjIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUworICAgICAgZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicyA6PSAkKGNhbGwgamF2YS1saWItaGVhZGVyLWZpbGVzLCQoVEFSR0VUX0RFRkFVTFRfQk9PVENMQVNTUEFUSF9MSUJSQVJJRVMpICQoVEFSR0VUX0RFRkFVTFRfSkFWQV9MSUJSQVJJRVMpKQorICAgICAgTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gJChmaWx0ZXItb3V0ICQoVEFSR0VUX0RFRkFVTFRfQk9PVENMQVNTUEFUSF9MSUJSQVJJRVMpICQoVEFSR0VUX0RFRkFVTFRfSkFWQV9MSUJSQVJJRVMpLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKQorICAgICAgbXlfc3lzdGVtX21vZHVsZXMgOj0gJChERUZBVUxUX1NZU1RFTV9NT0RVTEVTKQorICAgIGVuZGlmICAjIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUworICBlbHNlCisgICAgaWZlcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCisgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLE11c3Qgbm90IGRlZmluZSBib3RoIExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyBhbmQgTE9DQUxfU0RLX1ZFUlNJT04pCisgICAgZW5kaWYKKyAgICBpZmVxICgkKHN0cmlwICQoZmlsdGVyICQoTE9DQUxfU0RLX1ZFUlNJT04pLCQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKSksKQorICAgICAgJChjYWxsIHByZXR0eS1lcnJvcixJbnZhbGlkIExPQ0FMX1NES19WRVJTSU9OICckKExPQ0FMX1NES19WRVJTSU9OKScgXAorICAgICAgICAgICAgIENob2ljZXMgYXJlOiAkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkKKyAgICBlbmRpZgorICAgIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfQVBQUyksY3VycmVudCkKKyAgICAgICMgTE9DQUxfU0RLX1ZFUlNJT04gaXMgY3VycmVudCBhbmQgbm8gVEFSR0VUX0JVSUxEX0FQUFMuCisgICAgICBmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzIDo9ICQoY2FsbCBqYXZhLWxpYi1oZWFkZXItZmlsZXMsYW5kcm9pZF9zdHVic19jdXJyZW50KQorICAgIGVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSxzeXN0ZW1fY3VycmVudCkKKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcyxhbmRyb2lkX3N5c3RlbV9zdHVic19jdXJyZW50KQorICAgIGVsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKFRBUkdFVF9CVUlMRF9BUFBTKSx0ZXN0X2N1cnJlbnQpCisgICAgICBmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzIDo9ICQoY2FsbCBqYXZhLWxpYi1oZWFkZXItZmlsZXMsYW5kcm9pZF90ZXN0X3N0dWJzX2N1cnJlbnQpCisgICAgZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSQoVEFSR0VUX0JVSUxEX0FQUFMpLGNvcmVfY3VycmVudCkKKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcyxjb3JlLmN1cnJlbnQuc3R1YnMpCisgICAgZWxzZQorICAgICAgIyBjb3JlXzx2ZXI+IGlzIHN1YnNldCBvZiA8dmVyPi4gSW5zdGVhZCBvZiBkZWZpbmluZyBhIHByZWJ1aWx0IGxpYiBmb3IgY29yZV88dmVyPiwKKyAgICAgICMgdXNlIHRoZSBzdHViIGZvciA8dmVyPiB3aGVuIGJ1aWxkaW5nIGZvciBhcHBzLgorICAgICAgX3ZlcnNpb24gOj0gJChwYXRzdWJzdCBjb3JlXyUsJSwkKExPQ0FMX1NES19WRVJTSU9OKSkKKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcyxzZGtfdiQoX3ZlcnNpb24pKQorICAgICAgX3ZlcnNpb24gOj0KKyAgICBlbmRpZiAjIGN1cnJlbnQsIHN5c3RlbV9jdXJyZW50LCBzeXN0ZW1fJHtWRVJ9LCB0ZXN0X2N1cnJlbnQgb3IgY29yZV9jdXJyZW50CisgIGVuZGlmICMgTE9DQUxfU0RLX1ZFUlNJT04KIAotIyBJbiBvcmRlciB0byBjb21waWxlIGxhbWJkYSBjb2RlIGphdmFjIHJlcXVpcmVzIHZhcmlvdXMgaW52b2tlZHluYW1pYy0KLSMgcmVsYXRlZCBjbGFzc2VzIHRvIGJlIHByZXNlbnQuIFRoaXMgY2hhbmdlIGFkZHMgc3R1YnMgbmVlZGVkIGZvcgotIyBqYXZhYyB0byBjb21waWxlIGxhbWJkYXMuCi1teV9hZGRpdGlvbmFsX2phdmFjX2xpYnMgOj0KLWlmbmRlZiBUQVJHRVRfQlVJTERfQVBQUwotIyBUT0RPOiBzdXBwb3J0IHRvIGJ1aWxkIGxhbWRiYXMgdXNpbmcgamF2YWMgaW4gdW5idW5kbGVkIGJ1aWxkLgotIyBXZSBtYXkgbmVlZCB0byBjaGVjayBpbiBhIHByZWJ1aWx0IGNvcmUtbGFtYmRhLXN0dWJzIHRvIHByZWJ1aWx0cy9zZGsuCi1pZm5lcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCi1teV9hZGRpdGlvbmFsX2phdmFjX2xpYnMgOj0gY29yZS1sYW1iZGEtc3R1YnMKLWVuZGlmCi1lbmRpZgorICBpZm5lcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCisgICAgaWZuZXEgKCQoTE9DQUxfTU9EVUxFKSxqYWNvY29hZ2VudCkKKyAgICAgIGlmZXEgKCQoRU1NQV9JTlNUUlVNRU5UKSx0cnVlKQorICAgICAgICBpZm5lcSAoJChFTU1BX0lOU1RSVU1FTlRfU1RBVElDKSx0cnVlKQorICAgICAgICAgICMgRm9yIGluc3RydW1lbnRlZCBidWlsZCwgaWYgSmFjb2NvIGlzIG5vdCBiZWluZyBpbmNsdWRlZCBzdGF0aWNhbGx5CisgICAgICAgICAgIyBpbiBpbnN0cnVtZW50ZWQgcGFja2FnZXMgdGhlbiBpbmNsdWRlIEphY29jbyBjbGFzc2VzIGludG8gdGhlCisgICAgICAgICAgIyBib290Y2xhc3NwYXRoLgorICAgICAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgKz0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcyxqYWNvY29hZ2VudCkKKyAgICAgICAgZW5kaWYgIyBFTU1BX0lOU1RSVU1FTlRfU1RBVElDCisgICAgICBlbmRpZiAjIEVNTUFfSU5TVFJVTUVOVAorICAgIGVuZGlmICMgTE9DQUxfTU9EVUxFID09IGphY29jb2FnZW50CisgIGVuZGlmICMgTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTCiAKLWZ1bGxfc2hhcmVkX2phdmFfbGlicyA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsJChMT0NBTF9KQVZBX0xJQlJBUklFUykgJChteV9hZGRpdGlvbmFsX2phdmFjX2xpYnMpLCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpKQotZnVsbF9qYXZhX2xpYl9kZXBzIDo9ICQoY2FsbCBqYXZhLWxpYi1kZXBzLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpICQobXlfYWRkaXRpb25hbF9qYXZhY19saWJzKSwkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSkKLWZ1bGxfamF2YV9saWJfZGVwcyA6PSAkKGFkZHN1ZmZpeCAudG9jLCAkKGZ1bGxfamF2YV9saWJfZGVwcykpCisgICMgSW4gb3JkZXIgdG8gY29tcGlsZSBsYW1iZGEgY29kZSBqYXZhYyByZXF1aXJlcyB2YXJpb3VzIGludm9rZWR5bmFtaWMtCisgICMgcmVsYXRlZCBjbGFzc2VzIHRvIGJlIHByZXNlbnQuIFRoaXMgY2hhbmdlIGFkZHMgc3R1YnMgbmVlZGVkIGZvcgorICAjIGphdmFjIHRvIGNvbXBpbGUgbGFtYmRhcy4KKyAgaWZuZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQorICAgIGlmZGVmIFRBUkdFVF9CVUlMRF9BUFBTCisgICAgICBmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzICs9ICQoY2FsbCBqYXZhLWxpYi1oZWFkZXItZmlsZXMsc2RrLWNvcmUtbGFtYmRhLXN0dWJzKQorICAgIGVsc2UKKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgKz0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcyxjb3JlLWxhbWJkYS1zdHVicykKKyAgICBlbmRpZgorICBlbmRpZgorCisgIGZ1bGxfc2hhcmVkX2phdmFfbGlicyA6PSAkKGNhbGwgamF2YS1saWItZmlsZXMsJChMT0NBTF9KQVZBX0xJQlJBUklFUyksJChMT0NBTF9JU19IT1NUX01PRFVMRSkpCisgIGZ1bGxfc2hhcmVkX2phdmFfaGVhZGVyX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcywkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSwkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSkKIAogZWxzZSAjIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKLWlmZXEgKCQoVVNFX0NPUkVfTElCX0JPT1RDTEFTU1BBVEgpLHRydWUpCi1pZmVxICgkKExPQ0FMX05PX1NUQU5EQVJEX0xJQlJBUklFUyksdHJ1ZSkKLW15X2Jvb3RjbGFzc3BhdGggOj0gIiIKLWVsc2UKLW15X2Jvb3RjbGFzc3BhdGggOj0gJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChjYWxsIGphdmEtbGliLWZpbGVzLGNvcmUtb2otaG9zdGRleCBjb3JlLWxpYmFydC1ob3N0ZGV4LHRydWUpKQotZW5kaWYKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0JPT1RDTEFTU1BBVEggOj0gLWJvb3RjbGFzc3BhdGggJChteV9ib290Y2xhc3NwYXRoKQorICBpZmVxICgkKFVTRV9DT1JFX0xJQl9CT09UQ0xBU1NQQVRIKSx0cnVlKQorICAgIGlmZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQorICAgICAgZW1wdHlfYm9vdGNsYXNzcGF0aCA6PSAiIgorICAgIGVsc2UKKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcywkKGFkZHN1ZmZpeCAtaG9zdGRleCwkKFRBUkdFVF9ERUZBVUxUX0JPT1RDTEFTU1BBVEhfTElCUkFSSUVTKSksdHJ1ZSkKKyAgICBlbmRpZgogCi1mdWxsX3NoYXJlZF9qYXZhX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpLHRydWUpCi1mdWxsX2phdmFfbGliX2RlcHMgOj0gJChmdWxsX3NoYXJlZF9qYXZhX2xpYnMpCi1lbHNlICMgIVVTRV9DT1JFX0xJQl9CT09UQ0xBU1NQQVRICi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9CT09UQ0xBU1NQQVRIIDo9Ci0KLWZ1bGxfc2hhcmVkX2phdmFfbGlicyA6PSAkKGFkZHByZWZpeCAkKEhPU1RfT1VUX0pBVkFfTElCUkFSSUVTKS8sXAotICAgICQoYWRkc3VmZml4ICQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKSkKLWZ1bGxfamF2YV9saWJfZGVwcyA6PSAkKGZ1bGxfc2hhcmVkX2phdmFfbGlicykKLWVuZGlmICMgVVNFX0NPUkVfTElCX0JPT1RDTEFTU1BBVEgKKyAgICBteV9zeXN0ZW1fbW9kdWxlcyA6PSAkKERFRkFVTFRfU1lTVEVNX01PRFVMRVMpCisgICAgZnVsbF9zaGFyZWRfamF2YV9saWJzIDo9ICQoY2FsbCBqYXZhLWxpYi1maWxlcywkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSx0cnVlKQorICAgIGZ1bGxfc2hhcmVkX2phdmFfaGVhZGVyX2xpYnMgOj0gJChjYWxsIGphdmEtbGliLWhlYWRlci1maWxlcywkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSx0cnVlKQorICBlbHNlICMgIVVTRV9DT1JFX0xJQl9CT09UQ0xBU1NQQVRICisgICAgIyBHaXZlIGhvc3Qtc2lkZSB0b29scyBhIHZlcnNpb24gb2YgT3BlbkpESydzIHN0YW5kYXJkIGxpYnJhcmllcworICAgICMgY2xvc2UgdG8gd2hhdCB0aGV5J3JlIHRhcmdldGluZy4gQXMgb2YgRGVjIDIwMTcsIEFPU1AgaXMgb25seQorICAgICMgYnVuZGxpbmcgT3BlbkpESyA4IGFuZCA5LCBzbyBub3RoaW5nIDwgOCBpcyBhdmFpbGFibGUuCisgICAgIworICAgICMgV2hlbiBidWlsZGluZyB3aXRoIE9wZW5KREsgOCwgdGhlIGZvbGxvd2luZyBzaG91bGQgaGF2ZSBubworICAgICMgZWZmZWN0IHNpbmNlIHRob3NlIGphcnMgd291bGQgYmUgYXZhaWxhYmxlIGJ5IGRlZmF1bHQuCisgICAgIworICAgICMgV2hlbiBidWlsZGluZyB3aXRoIE9wZW5KREsgOSBidXQgdGFyZ2V0aW5nIGEgdmVyc2lvbiA8IDEuOCwKKyAgICAjIHB1dHRpbmcgdGhlbSBvbiB0aGUgYm9vdGNsYXNzcGF0aCBtZWFucyB0aGF0OgorICAgICMgYSkgY29kZSBjYW4ndCAoYWNjaWRlbnRhbGx5KSByZWZlciB0byBPcGVuSkRLIDkgc3BlY2lmaWMgQVBJcworICAgICMgYikgcmVmZXJlbmNlcyB0byBleGlzdGluZyBBUElzIGFyZSBub3QgcmVpbnRlcnByZXRlZCBpbiBhbgorICAgICMgICAgT3BlbkpESyA5LXNwZWNpZmljIHdheSwgZWcuIGNhbGxzIHRvIHN1YmNsYXNzZXMgb2YKKyAgICAjICAgIGphdmEubmlvLkJ1ZmZlciBhcyBpbiBodHRwOi8vYi83MDg2MjU4MworICAgIGlmZXEgKCQoVVNFX0hPU1RfQk9PVFNUUkFQX0pBUlMpLHRydWUpCisgICAgICBmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzICs9ICQoQU5EUk9JRF9KQVZBOF9IT01FKS9qcmUvbGliL2pjZS5qYXIKKyAgICAgIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMgKz0gJChBTkRST0lEX0pBVkE4X0hPTUUpL2pyZS9saWIvcnQuamFyCisgICAgZW5kaWYKKyAgICBmdWxsX3NoYXJlZF9qYXZhX2xpYnMgOj0gJChhZGRwcmVmaXggJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvLFwKKyAgICAgICQoYWRkc3VmZml4ICQoQ09NTU9OX0pBVkFfUEFDS0FHRV9TVUZGSVgpLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKSkKKyAgICBmdWxsX3NoYXJlZF9qYXZhX2hlYWRlcl9saWJzIDo9ICQoZnVsbF9zaGFyZWRfamF2YV9saWJzKQorICBlbmRpZiAjIFVTRV9DT1JFX0xJQl9CT09UQ0xBU1NQQVRICiBlbmRpZiAjICFMT0NBTF9JU19IT1NUX01PRFVMRQogCi1mdWxsX2phdmFfbGlicyA6PSAkKGZ1bGxfc2hhcmVkX2phdmFfbGlicykgJChmdWxsX3N0YXRpY19qYXZhX2xpYnMpICQoTE9DQUxfQ0xBU1NQQVRIKQotZnVsbF9qYXZhX2xpYl9kZXBzIDo9ICQoZnVsbF9qYXZhX2xpYl9kZXBzKSAkKGZ1bGxfc3RhdGljX2phdmFfbGlicykgJChMT0NBTF9DTEFTU1BBVEgpCitpZmRlZiBlbXB0eV9ib290Y2xhc3NwYXRoCisgIGlmZGVmIGZ1bGxfamF2YV9ib290Y2xhc3NwYXRoX2xpYnMKKyAgICAkKGNhbGwgcHJldHR5LWVycm9yLGludGVybmFsIGVycm9yOiBlbXB0eV9ib290Y2xhc3NwYXRoIGFuZCBmdWxsX2phdmFfYm9vdGNsYXNzcGF0aF9saWJzIHNob3VsZCBub3QgYm90aCBiZSBzZXQpCisgIGVuZGlmCitlbmRpZgorCitmdWxsX2phdmFfc3lzdGVtX21vZHVsZXNfZGVwcyA6PQorbXlfc3lzdGVtX21vZHVsZXNfZGlyIDo9CiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9VU0VfU1lTVEVNX01PRFVMRVMgOj0KK2lmZXEgKCQoTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OKSwxLjkpCisgICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1VTRV9TWVNURU1fTU9EVUxFUyA6PSB0cnVlCisgIGlmZGVmIG15X3N5c3RlbV9tb2R1bGVzCisgICAgaWZuZXEgKCQobXlfc3lzdGVtX21vZHVsZXMpLG5vbmUpCisgICAgICBpZm5kZWYgU09PTkdfU1lTVEVNX01PRFVMRVNfJChteV9zeXN0ZW1fbW9kdWxlcykKKyAgICAgICAgJChjYWxsIHByZXR0eS1lcnJvciwgSW52YWxpZCBzeXN0ZW0gbW9kdWxlcyAkKG15X3N5c3RlbV9tb2R1bGVzKSkKKyAgICAgIGVuZGlmCisgICAgICBmdWxsX2phdmFfc3lzdGVtX21vZHVsZXNfZGVwcyA6PSAkKFNPT05HX1NZU1RFTV9NT0RVTEVTXyQobXlfc3lzdGVtX21vZHVsZXMpKQorICAgICAgbXlfc3lzdGVtX21vZHVsZXNfZGlyIDo9ICQocGF0c3Vic3QgJS9saWIvbW9kdWxlcywlLCQoU09PTkdfU1lTVEVNX01PRFVMRVNfJChteV9zeXN0ZW1fbW9kdWxlcykpKQorICAgIGVuZGlmCisgIGVuZGlmCitlbmRpZgorCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9CT09UQ0xBU1NQQVRIIDo9ICQoZnVsbF9qYXZhX2Jvb3RjbGFzc3BhdGhfbGlicykKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0VNUFRZX0JPT1RDTEFTU1BBVEggOj0gJChlbXB0eV9ib290Y2xhc3NwYXRoKQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfU1lTVEVNX01PRFVMRVMgOj0gJChteV9zeXN0ZW1fbW9kdWxlcykKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NZU1RFTV9NT0RVTEVTX0RJUiA6PSAkKG15X3N5c3RlbV9tb2R1bGVzX2RpcikKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NZU1RFTV9NT0RVTEVTX0xJQlMgOj0gJChjYWxsIGphdmEtbGliLWZpbGVzLCQoU09PTkdfU1lTVEVNX01PRFVMRVNfTElCU18kKG15X3N5c3RlbV9tb2R1bGVzKSkpCiskKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9QQVRDSF9NT0RVTEUgOj0gJChMT0NBTF9QQVRDSF9NT0RVTEUpCiAKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQogIyBUaGlzIGlzIHNldCBieSBwYWNrYWdlcyB0aGF0IGFyZSBsaW5raW5nIHRvIG90aGVyIHBhY2thZ2VzIHRoYXQgZXhwb3J0CiAjIHNoYXJlZCBsaWJyYXJpZXMsIGFsbG93aW5nIHRoZW0gdG8gbWFrZSB1c2Ugb2YgdGhlIGNvZGUgaW4gdGhlIGxpbmtlZCBhcGsuCiBhcGtfbGlicmFyaWVzIDo9ICQoc29ydCAkKExPQ0FMX0FQS19MSUJSQVJJRVMpICQoTE9DQUxfUkVTX0xJQlJBUklFUykpCiBpZm5lcSAoJChhcGtfbGlicmFyaWVzKSwpCi0gIGxpbmtfYXBrX2xpYnJhcmllcyA6PSBcCi0gICAgICAkKGZvcmVhY2ggbGliLCQoYXBrX2xpYnJhcmllcyksIFwKLSAgICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgXAotICAgICAgICAgICAgICBBUFBTLCQobGliKSwsQ09NTU9OKS9jbGFzc2VzLXByZS1wcm9ndWFyZC5qYXIpCisgIGxpbmtfYXBrX2xpYnJhcmllcyA6PSAkKGNhbGwgYXBwLWxpYi1maWxlcywkKGFwa19saWJyYXJpZXMpKQorICBsaW5rX2Fwa19oZWFkZXJfbGlicyA6PSAkKGNhbGwgYXBwLWxpYi1oZWFkZXItZmlsZXMsJChhcGtfbGlicmFyaWVzKSkKIAogICAjIGxpbmsgYWdhaW5zdCB0aGUgamFyIHdpdGggZnVsbCBvcmlnaW5hbCBuYW1lcyAoYmVmb3JlIHByb2d1YXJkIHByb2Nlc3NpbmcpLgogICBmdWxsX3NoYXJlZF9qYXZhX2xpYnMgKz0gJChsaW5rX2Fwa19saWJyYXJpZXMpCi0gIGZ1bGxfamF2YV9saWJzICs9ICQobGlua19hcGtfbGlicmFyaWVzKQotICBmdWxsX2phdmFfbGliX2RlcHMgKz0gJChsaW5rX2Fwa19saWJyYXJpZXMpCisgIGZ1bGxfc2hhcmVkX2phdmFfaGVhZGVyX2xpYnMgKz0gJChsaW5rX2Fwa19oZWFkZXJfbGlicykKIGVuZGlmCiAKICMgVGhpcyBpcyBzZXQgYnkgcGFja2FnZXMgdGhhdCBjb250YWluIGluc3RydW1lbnRhdGlvbiwgYWxsb3dpbmcgdGhlbSB0bwpAQCAtMjg3LDggKzM4OCwxMyBAQAogICAgICAgQVBQUywkKExPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IpLCxDT01NT04pCiAgICMgbGluayBhZ2FpbnN0IHRoZSBqYXIgd2l0aCBmdWxsIG9yaWdpbmFsIG5hbWVzIChiZWZvcmUgcHJvZ3VhcmQgcHJvY2Vzc2luZykuCiAgIGxpbmtfaW5zdHJfY2xhc3Nlc19qYXIgOj0gJChsaW5rX2luc3RyX2ludGVybWVkaWF0ZXNfZGlyLkNPTU1PTikvY2xhc3Nlcy1wcmUtcHJvZ3VhcmQuamFyCi0gIGZ1bGxfamF2YV9saWJzICs9ICQobGlua19pbnN0cl9jbGFzc2VzX2phcikKLSAgZnVsbF9qYXZhX2xpYl9kZXBzICs9ICQobGlua19pbnN0cl9jbGFzc2VzX2phcikKKyAgaWZuZXEgKCQoVFVSQklORV9FTkFCTEVEKSxmYWxzZSkKKyAgICBsaW5rX2luc3RyX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGxpbmtfaW5zdHJfaW50ZXJtZWRpYXRlc19kaXIuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKKyAgZWxzZQorICAgIGxpbmtfaW5zdHJfY2xhc3Nlc19oZWFkZXJfamFyIDo9ICQobGlua19pbnN0cl9pbnRlcm1lZGlhdGVzX2Rpci5DT01NT04pL2NsYXNzZXMuamFyCisgIGVuZGlmCisgIGZ1bGxfc2hhcmVkX2phdmFfbGlicyArPSAkKGxpbmtfaW5zdHJfY2xhc3Nlc19qYXIpCisgIGZ1bGxfc2hhcmVkX2phdmFfaGVhZGVyX2xpYnMgKz0gJChsaW5rX2luc3RyX2NsYXNzZXNfaGVhZGVyX2phcikKIGVuZGlmICAjIExPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IKIGVuZGlmICAjIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKQEAgLTMzNSw5MyArNDQxLDY3IEBACiBlbmRpZgogZW5kaWYgICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKK2Z1bGxfamF2YV9saWJzIDo9ICQoZnVsbF9zaGFyZWRfamF2YV9saWJzKSAkKGZ1bGxfc3RhdGljX2phdmFfbGlicykgJChMT0NBTF9DTEFTU1BBVEgpCitmdWxsX2phdmFfaGVhZGVyX2xpYnMgOj0gJChmdWxsX3NoYXJlZF9qYXZhX2hlYWRlcl9saWJzKSAkKGZ1bGxfc3RhdGljX2phdmFfaGVhZGVyX2xpYnMpCisKICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0FMTF9KQVZBX0xJQlJBUklFUyA6PSAkKGZ1bGxfamF2YV9saWJzKQorJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUxMX0pBVkFfSEVBREVSX0xJQlJBUklFUyA6PSAkKGZ1bGxfamF2YV9oZWFkZXJfbGlicykKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1NIQVJFRF9KQVZBX0hFQURFUl9MSUJSQVJJRVMgOj0gJChmdWxsX3NoYXJlZF9qYXZhX2hlYWRlcl9saWJzKQogCiBBTExfTU9EVUxFUy4kKG15X3JlZ2lzdGVyX25hbWUpLklOVEVSTUVESUFURV9TT1VSQ0VfRElSIDo9IFwKICAgICAkKEFMTF9NT0RVTEVTLiQobXlfcmVnaXN0ZXJfbmFtZSkuSU5URVJNRURJQVRFX1NPVVJDRV9ESVIpICQoTE9DQUxfSU5URVJNRURJQVRFX1NPVVJDRV9ESVIpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEpBQ0sKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLWlmZGVmIG5lZWRfY29tcGlsZV9qYXZhCi0KLUxPQ0FMX0pBQ0tfRkxBR1MgKz0gLUQgamFjay5qYXZhLnNvdXJjZS52ZXJzaW9uPSQoTE9DQUxfSkFWQV9MQU5HVUFHRV9WRVJTSU9OKQotCi1mdWxsX3N0YXRpY19qYWNrX2xpYnMgOj0gXAotICAgICQoZm9yZWFjaCBsaWIsJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpLCBcCi0gICAgICAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLCBcCi0gICAgICAgIEpBVkFfTElCUkFSSUVTLCQobGliKSwkKExPQ0FMX0lTX0hPU1RfTU9EVUxFKSxDT01NT04pL2NsYXNzZXMuamFjaykKLQotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfU1RBVElDX0pBQ0tfTElCUkFSSUVTIDo9ICQoZnVsbF9zdGF0aWNfamFja19saWJzKQotCi1mdWxsX3NoYXJlZF9qYWNrX2xpYnMgOj0gJChjYWxsIGphY2stbGliLWZpbGVzLCQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpLCQoTE9DQUxfSVNfSE9TVF9NT0RVTEUpKQotZnVsbF9qYWNrX2RlcHMgOj0gJChmdWxsX3NoYXJlZF9qYWNrX2xpYnMpCi0KLWlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQotIyBUdXJuIG9mZiAudG9jIG9wdGltaXphdGlvbiBmb3IgYXBwcyBidWlsZCBhcyB3ZSBjYW5ub3QgYnVpbGQgZGV4ZHVtcC4KLWlmZXEgKCwkKFRBUkdFVF9CVUlMRF9BUFBTKSkKLWZ1bGxfamFja19kZXBzIDo9ICQocGF0c3Vic3QgJS5qYWNrLCAlLmRleC50b2MsICQoZnVsbF9qYWNrX2RlcHMpKQotZW5kaWYKLWVuZGlmICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCi1mdWxsX3NoYXJlZF9qYWNrX2xpYnMgKz0gJChMT0NBTF9KQUNLX0NMQVNTUEFUSCkKLWZ1bGxfamFja19kZXBzICs9ICQoZnVsbF9zdGF0aWNfamFja19saWJzKSAkKExPQ0FMX0pBQ0tfQ0xBU1NQQVRIKQotCi1pZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKLSMgVGhpcyBpcyBzZXQgYnkgcGFja2FnZXMgdGhhdCBhcmUgbGlua2luZyB0byBvdGhlciBwYWNrYWdlcyB0aGF0IGV4cG9ydAotIyBzaGFyZWQgbGlicmFyaWVzLCBhbGxvd2luZyB0aGVtIHRvIG1ha2UgdXNlIG9mIHRoZSBjb2RlIGluIHRoZSBsaW5rZWQgYXBrLgotaWZuZXEgKCQoYXBrX2xpYnJhcmllcyksKQotICBsaW5rX2Fwa19qYWNrX2xpYnJhcmllcyA6PSBcCi0gICAgICAkKGZvcmVhY2ggbGliLCQoYXBrX2xpYnJhcmllcyksIFwKLSAgICAgICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwgXAotICAgICAgICAgICAgICBBUFBTLCQobGliKSwsQ09NTU9OKS9jbGFzc2VzLmphY2spCi0KLSAgIyBsaW5rIGFnYWluc3QgdGhlIGphciB3aXRoIGZ1bGwgb3JpZ2luYWwgbmFtZXMgKGJlZm9yZSBwcm9ndWFyZCBwcm9jZXNzaW5nKS4KLSAgZnVsbF9zaGFyZWRfamFja19saWJzICs9ICQobGlua19hcGtfamFja19saWJyYXJpZXMpCi0gIGZ1bGxfamFja19kZXBzICs9ICQobGlua19hcGtfamFja19saWJyYXJpZXMpCi1lbmRpZgotCi0jIFRoaXMgaXMgc2V0IGJ5IHBhY2thZ2VzIHRoYXQgY29udGFpbiBpbnN0cnVtZW50YXRpb24sIGFsbG93aW5nIHRoZW0gdG8KLSMgbGluayBhZ2FpbnN0IHRoZSBwYWNrYWdlIHRoZXkgYXJlIGluc3RydW1lbnRpbmcuICBDdXJyZW50bHkgb25seSBvbmUgc3VjaAotIyBwYWNrYWdlIGlzIGFsbG93ZWQuCi1pZmRlZiBMT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SCi0gICAjIGxpbmsgYWdhaW5zdCB0aGUgamFyIHdpdGggZnVsbCBvcmlnaW5hbCBuYW1lcyAoYmVmb3JlIHByb2d1YXJkIHByb2Nlc3NpbmcpLgotICAgbGlua19pbnN0cl9jbGFzc2VzX2phY2sgOj0gJChsaW5rX2luc3RyX2ludGVybWVkaWF0ZXNfZGlyLkNPTU1PTikvY2xhc3Nlcy5ub3Nocm9iLmphY2sKLSAgIGZ1bGxfc2hhcmVkX2phY2tfbGlicyArPSAkKGxpbmtfaW5zdHJfY2xhc3Nlc19qYWNrKQotICAgZnVsbF9qYWNrX2RlcHMgKz0gJChsaW5rX2luc3RyX2NsYXNzZXNfamFjaykKLWVuZGlmICAjIExPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IKLWVuZGlmICAjICFMT0NBTF9JU19IT1NUX01PRFVMRQotCi0jIFByb3BhZ2F0ZSBsb2NhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhpcyB0YXJnZXQuCi0kKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9KQUNLX1NIQVJFRF9MSUJSQVJJRVM6PSAkKGZ1bGxfc2hhcmVkX2phY2tfbGlicykKLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0pBUkpBUl9SVUxFUyA6PSAkKExPQ0FMX0pBUkpBUl9SVUxFUykKLQotZW5kaWYgICMgbmVlZF9jb21waWxlX2phdmEKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgVmVyaWZ5IHRoYXQgYWxsIGxpYnJhcmllcyBhcmUgc2FmZSB0byB1c2UKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKIGlmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLHN5c3RlbV9jdXJyZW50KQogbXlfbGlua190eXBlIDo9IGphdmE6c3lzdGVtCi1teV93YXJuX3R5cGVzIDo9IGphdmE6cGxhdGZvcm0KLW15X2FsbG93ZWRfdHlwZXMgOj0gamF2YTpzZGsgamF2YTpzeXN0ZW0KK215X3dhcm5fdHlwZXMgOj0KK215X2FsbG93ZWRfdHlwZXMgOj0gamF2YTpzZGsgamF2YTpzeXN0ZW0gamF2YTpjb3JlCitlbHNlIGlmbmVxICgsJChjYWxsIGhhcy1zeXN0ZW0tc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpKQorbXlfbGlua190eXBlIDo9IGphdmE6c3lzdGVtCitteV93YXJuX3R5cGVzIDo9CitteV9hbGxvd2VkX3R5cGVzIDo9IGphdmE6c2RrIGphdmE6c3lzdGVtIGphdmE6Y29yZQorZWxzZSBpZmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSxjb3JlX2N1cnJlbnQpCitteV9saW5rX3R5cGUgOj0gamF2YTpjb3JlCitteV93YXJuX3R5cGVzIDo9CitteV9hbGxvd2VkX3R5cGVzIDo9IGphdmE6Y29yZQogZWxzZSBpZm5lcSAoJChMT0NBTF9TREtfVkVSU0lPTiksKQogbXlfbGlua190eXBlIDo9IGphdmE6c2RrCi1teV93YXJuX3R5cGVzIDo9IGphdmE6c3lzdGVtIGphdmE6cGxhdGZvcm0KLW15X2FsbG93ZWRfdHlwZXMgOj0gamF2YTpzZGsKK215X3dhcm5fdHlwZXMgOj0KK215X2FsbG93ZWRfdHlwZXMgOj0gamF2YTpzZGsgamF2YTpjb3JlCiBlbHNlCiBteV9saW5rX3R5cGUgOj0gamF2YTpwbGF0Zm9ybQogbXlfd2Fybl90eXBlcyA6PQotbXlfYWxsb3dlZF90eXBlcyA6PSBqYXZhOnNkayBqYXZhOnN5c3RlbSBqYXZhOnBsYXRmb3JtCitteV9hbGxvd2VkX3R5cGVzIDo9IGphdmE6c2RrIGphdmE6c3lzdGVtIGphdmE6cGxhdGZvcm0gamF2YTpjb3JlCiBlbmRpZgogCi1teV9saW5rX2RlcHMgOj0gJChhZGRwcmVmaXggSkFWQV9MSUJSQVJJRVM6LCQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSkKK2lmZGVmIExPQ0FMX0FBUFQyX09OTFkKK215X2xpbmtfdHlwZSArPSBhYXB0Ml9vbmx5CitlbmRpZgoraWZkZWYgTE9DQUxfVVNFX0FBUFQyCitteV9hbGxvd2VkX3R5cGVzICs9IGFhcHQyX29ubHkKK2VuZGlmCisKK215X2xpbmtfZGVwcyA6PSAkKGFkZHByZWZpeCBKQVZBX0xJQlJBUklFUzosJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpICQoTE9DQUxfSkFWQV9MSUJSQVJJRVMpKQogbXlfbGlua19kZXBzICs9ICQoYWRkcHJlZml4IEFQUFM6LCQoYXBrX2xpYnJhcmllcykpCiAKIG15XzJuZF9hcmNoX3ByZWZpeCA6PSAkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpCiBteV9jb21tb24gOj0gQ09NTU9OCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9saW5rX3R5cGUubWsKIGVuZGlmICAjICFMT0NBTF9JU19IT1NUX01PRFVMRQorCitpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisKK1NPT05HX0NPTlYuJChMT0NBTF9NT0RVTEUpLlBST0JMRU1TIDo9IFwKKyAgICAkKFNPT05HX0NPTlYuJChMT0NBTF9NT0RVTEUpLlBST0JMRU1TKSAkKG15X3Nvb25nX3Byb2JsZW1zKQorU09PTkdfQ09OVi4kKExPQ0FMX01PRFVMRSkuREVQUyA6PSBcCisgICAgJChTT09OR19DT05WLiQoTE9DQUxfTU9EVUxFKS5ERVBTKSBcCisgICAgJChMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMpIFwKKyAgICAkKExPQ0FMX0pBVkFfTElCUkFSSUVTKSBcCisgICAgJChMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUykKK1NPT05HX0NPTlYuJChMT0NBTF9NT0RVTEUpLlRZUEUgOj0gamF2YQorU09PTkdfQ09OViA6PSAkKFNPT05HX0NPTlYpICQoTE9DQUxfTU9EVUxFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhX2xpYnJhcnkubWsgYi9jb3JlL2phdmFfbGlicmFyeS5tawppbmRleCA4NGY0NDE5Li4xYjkxNGY1IDEwMDY0NAotLS0gYS9jb3JlL2phdmFfbGlicmFyeS5taworKysgYi9jb3JlL2phdmFfbGlicmFyeS5tawpAQCAtMjUsMjEgKzI1LDggQEAKIAogTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gamF2YWxpYi5qYXIKIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jb25maWd1cmVfbG9jYWxfamFjay5tawotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotaWZkZWYgTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWQotTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gY2xhc3Nlcy5qYWNrCi1lbmRpZgotZW5kaWYKLQotIyBGb3Igbm9uLXN0YXRpYyBqYXZhIGxpYnJhcmllcywgb3RoZXIgbW9kdWxlcyBzaG91bGQgZGVwZW5kIG9uCi0jIG91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy8uLi4vamF2YWxpYi5qYXIgKGZvciBqYWNrKQotIyBvciBvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvLi4uL2NsYXNzZXMuamFyIChmb3IgamF2YWMpLgotIyBGb3Igc3RhdGljIGphdmEgbGlicmFyaWVzLCBvdGhlciBtb2R1bGVzIHNob3VsZCBkZXBlbmQgb24KLSMgb3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTLy4uLi9jbGFzc2VzLmphcgorIyBGb3IgamF2YSBsaWJyYXJpZXMsIG90aGVyIG1vZHVsZXMgc2hvdWxkIGRlcGVuZCBvbgorIyBvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvLi4uL2NsYXNzZXMuamFyLgogIyBUaGVyZSBhcmUgc29tZSBkZXBlbmRlbmNpZXMgb3V0c2lkZSB0aGUgYnVpbGQgc3lzdGVtIHRoYXQgYXNzdW1lIHN0YXRpYwogIyBqYXZhIGxpYnJhcmllcyBwcm9kdWNlIGphdmFsaWIuamFyLCBzbyB3ZSB3aWxsIGNvcHkgY2xhc3Nlcy5qYXIgdGhlcmUgdG9vLgogaW50ZXJtZWRpYXRlcy5DT01NT04gOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyLENPTU1PTikKQEAgLTU1LDYgKzQyLDggQEAKIGlmZXEgKHRydWUsJChMT0NBTF9FTU1BX0lOU1RSVU1FTlQpKQogaWZlcSAodHJ1ZSwkKEVNTUFfSU5TVFJVTUVOVF9TVEFUSUMpKQogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9IGphY29jb2FnZW50CisjIEV4Y2x1ZGUgamFjb2NvIGNsYXNzZXMgZnJvbSBwcm9ndWFyZAorTE9DQUxfUFJPR1VBUkRfRkxBR1MgKz0gLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Byb2d1YXJkLmphY29jby5mbGFncwogZW5kaWYgIyBMT0NBTF9FTU1BX0lOU1RSVU1FTlQKIGVuZGlmICMgRU1NQV9JTlNUUlVNRU5UX1NUQVRJQwogZWxzZQpAQCAtNjgsMzEgKzU3LDI3IEBACiBpZmVxICgkKExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkpLHRydWUpCiAjIFRoZXJlIGFyZSBzb21lIGRlcGVuZGVuY2llcyBvdXRzaWRlIHRoZSBidWlsZCBzeXN0ZW0gdGhhdCBhc3N1bWUgY2xhc3Nlcy5qYXIKICMgaXMgYXZhaWxhYmxlIGFzIGphdmFsaWIuamFyIHNvIGNvcHkgaXQgdGhlcmUgdG9vLgotJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX2phciksJChjb21tb25famF2YWxpYi5qYXIpKSkKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpLCQoY29tbW9uX2phdmFsaWIuamFyKSkpCiAKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX2phY2spLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpCi1lbHNlCi0kKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChmdWxsX2NsYXNzZXNfamFyKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQotZW5kaWYKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19wcm9ndWFyZF9qYXIpLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpCiAKIGVsc2UgIyAhTE9DQUxfSVNfU1RBVElDX0pBVkFfTElCUkFSWQogCiAkKGNvbW1vbl9qYXZhbGliLmphcik6IFBSSVZBVEVfREVYX0ZJTEUgOj0gJChidWlsdF9kZXgpCiAkKGNvbW1vbl9qYXZhbGliLmphcik6IFBSSVZBVEVfU09VUkNFX0FSQ0hJVkUgOj0gJChmdWxsX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phcikKICQoY29tbW9uX2phdmFsaWIuamFyKTogUFJJVkFURV9ET05UX0RFTEVURV9KQVJfRElSUyA6PSAkKExPQ0FMX0RPTlRfREVMRVRFX0pBUl9ESVJTKQotJChjb21tb25famF2YWxpYi5qYXIpIDogJChidWlsdF9kZXgpICQoamF2YV9yZXNvdXJjZV9zb3VyY2VzKSB8ICQoWklQVElNRSkKKyQoY29tbW9uX2phdmFsaWIuamFyKSA6ICQoYnVpbHRfZGV4KSAkKGphdmFfcmVzb3VyY2Vfc291cmNlcykgfCAkKFpJUFRJTUUpICQoWklQQUxJR04pCiAJQGVjaG8gInRhcmdldCBKYXI6ICQoUFJJVkFURV9NT0RVTEUpICgkQCkiCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLQkkKGNyZWF0ZS1lbXB0eS1wYWNrYWdlKQotZWxzZQotCSQoY2FsbCBpbml0aWFsaXplLXBhY2thZ2UtZmlsZSwkKFBSSVZBVEVfU09VUkNFX0FSQ0hJVkUpLCRAKQotZW5kaWYKLQkkKGFkZC1kZXgtdG8tcGFja2FnZSkKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotCSQoYWRkLWNhcnJpZWQtamFjay1yZXNvdXJjZXMpCi1lbmRpZgotCSQocmVtb3ZlLXRpbWVzdGFtcHMtZnJvbS1wYWNrYWdlKQorCSQoY2FsbCBpbml0aWFsaXplLXBhY2thZ2UtZmlsZSwkKFBSSVZBVEVfU09VUkNFX0FSQ0hJVkUpLCRALnRtcCkKKwkkKGNhbGwgYWRkLWRleC10by1wYWNrYWdlLWFyZywkQC50bXApCisJJChoaWRlKSAkKFpJUFRJTUUpICRALnRtcAorCSQoY2FsbCBjb21taXQtY2hhbmdlLWZvci10b2MsJEApCitpZmVxICh0cnVlLCAkKExPQ0FMX1VOQ09NUFJFU1NfREVYKSkKKwkkKHVuY29tcHJlc3MtZGV4cykKKwkkKGFsaWduLXBhY2thZ2UpCitlbmRpZiAgIyBMT0NBTF9VTkNPTVBSRVNTX0RFWAorCisuS0FUSV9SRVNUQVQ6ICQoY29tbW9uX2phdmFsaWIuamFyKQogCiBpZmRlZiBMT0NBTF9ERVhfUFJFT1BUCiBpZm5lcSAoJChkZXhwcmVvcHRfYm9vdF9qYXJfbW9kdWxlKSwpICMgYm9vdCBqYXIKQEAgLTEwOCwxMCArOTMsNyBAQAogCUBlY2hvICJEZXhwcmVvcHQgSmFyOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgogCSQoY2FsbCBkZXhwcmVvcHQtb25lLWZpbGUsJDwsJEApCiAKLSQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGNvbW1vbl9qYXZhbGliLmphciksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKLWlmbmVxIChub3N0cmlwcGluZywkKExPQ0FMX0RFWF9QUkVPUFQpKQotCSQoY2FsbCBkZXhwcmVvcHQtcmVtb3ZlLWNsYXNzZXMuZGV4LCRAKQotZW5kaWYKKyQoZXZhbCAkKGNhbGwgZGV4cHJlb3B0LWNvcHktamFyLCQoY29tbW9uX2phdmFsaWIuamFyKSwkKExPQ0FMX0JVSUxUX01PRFVMRSksJChMT0NBTF9ERVhfUFJFT1BUKSkpCiAKIGVuZGlmICMgISBib290IGphcgogCmRpZmYgLS1naXQgYS9jb3JlL2pldGlmaWVyLm1rIGIvY29yZS9qZXRpZmllci5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDVjOWRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qZXRpZmllci5tawpAQCAtMCwwICsxLDM0IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFRoaXMgZmlsZSBzZXRzIHVwIHRoZSBydW5uaW5nIG9mIEpldGlmaWVyCisKKyMgbm93IGFkZCB0aGUgcnVsZSB0byBydW4gamV0aWZpZXIKK2lmZXEgKCQoc3RyaXAgJChMT0NBTF9KRVRJRklFUl9FTkFCTEVEKSksdHJ1ZSkKKyAgbXlfamV0aWZpZXJfaW5wdXRfcGF0aCA6PSAkKExPQ0FMX0pFVElGSUVSX0lOUFVUX0ZJTEUpCisgIG15X2ZpbGVzIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2pldGlmaWVyCisgIG15X2pldGlmaWVyX291dHB1dF9wYXRoIDo9ICQobXlfZmlsZXMpL2NsYXNzZXMtamV0aWZpZXIuamFyCisKKyQobXlfamV0aWZpZXJfb3V0cHV0X3BhdGgpIDogJChteV9qZXRpZmllcl9pbnB1dF9wYXRoKSAkKEpFVElGSUVSKQorCXJtIC1yZiAkQAorCSQoSkVUSUZJRVIpIC1vdXRwdXRmaWxlICRAIC1pICQ8CisKKyAgTE9DQUxfSkVUSUZJRVJfT1VUUFVUX0ZJTEUgOj0gJChteV9qZXRpZmllcl9vdXRwdXRfcGF0aCkKKyAgTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMgKz0gJChMT0NBTF9KRVRJRklFUl9PVVRQVVRfRklMRSkKK2Vsc2UKKyAgTE9DQUxfSkVUSUZJRVJfT1VUUFVUX0ZJTEUgOj0gJChMT0NBTF9KRVRJRklFUl9JTlBVVF9GSUxFKQorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29yZS9sb2NhbF9zeXN0ZW1zZGsubWsgYi9jb3JlL2xvY2FsX3N5c3RlbXNkay5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFiMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9sb2NhbF9zeXN0ZW1zZGsubWsKQEAgLTAsMCArMSw1NiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZkZWYgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TCisgICMgQXBwcyBhbmQgamFycyBpbiB2ZW5kb3Igb3Igb2RtIHBhcnRpdGlvbiBhcmUgZm9yY2VkIHRvIGJ1aWxkIGFnYWluc3QgU3lzdGVtIFNESy4KKyAgX2lzX3ZlbmRvcl9hcHAgOj0KKyAgaWZuZXEgKCwkKGZpbHRlciB0cnVlLCQoTE9DQUxfVkVORE9SX01PRFVMRSkgJChMT0NBTF9PRE1fTU9EVUxFKSAkKExPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSkpKQorICAgICMgTm90ZTogbm8gbmVlZCB0byBjaGVjayBMT0NBTF9NT0RVTEVfUEFUSCogc2luY2UgTE9DQUxfW1ZFTkRPUnxPRE18T0VNXV9NT0RVTEUgaXMgYWxyZWFkeQorICAgICMgc2V0IGNvcnJlY3RseSBiZWZvcmUgdGhpcyBpcyBpbmNsdWRlZC4KKyAgICBfaXNfdmVuZG9yX2FwcCA6PSB0cnVlCisgIGVuZGlmCisgIGlmbmVxICgsJChmaWx0ZXIgSkFWQV9MSUJSQVJJRVMgQVBQUywkKExPQ0FMX01PRFVMRV9DTEFTUykpKQorICAgIGlmbmRlZiBMT0NBTF9TREtfVkVSU0lPTgorICAgICAgaWZlcSAoJChfaXNfdmVuZG9yX2FwcCksdHJ1ZSkKKyAgICAgICAgTE9DQUxfU0RLX1ZFUlNJT04gOj0gc3lzdGVtX2N1cnJlbnQKKyAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGlmCisKKyMgRW5zdXJlIHRoYXQgdGhlIHNlbGVjdGVkIFN5c3RlbSBTREsgdmVyc2lvbiBpcyBvbmUgb2YgdGhlIHN1cHBvcnRlZCB2ZXJzaW9ucy4KKyMgVGhlIHJhbmdlIG9mIHN1cHBvcnQgdmVyc2lvbnMgYmVjb21lcyBuYXJyb3dlciB3aGVuIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUworIyBpcyBzZXQsIHdoaWNoIGlzIGEgc3Vic2V0IG9mIFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUy4KK2lmbmVxICgsJChjYWxsIGhhcy1zeXN0ZW0tc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpKQorICBpZm5lcSAoJChfaXNfdmVuZG9yX2FwcCksdHJ1ZSkKKyAgICAjIGFwcHMgYnVuZGxlZCBpbiBzeXN0ZW0gcGFydGl0aW9uIGNhbiB1c2UgYWxsIHN5c3RlbSBzZGsgdmVyc2lvbnMgcHJvdmlkZWQgYnkgdGhlIHBsYXRmb3JtCisgICAgX3N1cHBvcnRlZF9zeXN0ZW1zZGtfdmVyc2lvbnMgOj0gJChQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMpCisgIGVsc2UgaWZkZWYgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TCisgICAgIyBXaGVuIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUyBpcyBzZXQsIHZlbmRvcnMgYXBwcyBhcmUgcmVzdHJpY3RlZCB0byB1c2UgdGhvc2UgdmVyc2lvbnMKKyAgICAjIHdoaWNoIGlzIGVxdWFsIHRvIG9yIHNtYWxsZXIgdGhhbiBQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMKKyAgICBfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucyA6PSAkKEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUykKKyAgZWxzZQorICAgICMgSWYgbm90LCB2ZW5kb3IgYXBrcyBhcmUgdHJlYXRlZCBlcXVhbGx5IHRvIHN5c3RlbSBhcHBzCisgICAgX3N1cHBvcnRlZF9zeXN0ZW1zZGtfdmVyc2lvbnMgOj0gJChQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMpCisgIGVuZGlmCisgIF9zeXN0ZW1fc2RrX3ZlcnNpb24gOj0gJChjYWxsIGdldC1udW1lcmljLXNkay12ZXJzaW9uLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQorICBpZm5lcSAoJChfc3lzdGVtX3Nka192ZXJzaW9uKSwkKGZpbHRlciAkKF9zeXN0ZW1fc2RrX3ZlcnNpb24pLCQoX3N1cHBvcnRlZF9zeXN0ZW1zZGtfdmVyc2lvbnMpKSkKKyAgICAkKGNhbGwgcHJldHR5LWVycm9yLEluY29tcGF0aWJsZSBMT0NBTF9TREtfVkVSU0lPTiAnJChMT0NBTF9TREtfVkVSU0lPTiknLiBcCisgICAgICAgICAgIFN5c3RlbSBTREsgdmVyc2lvbiAnJChfc3lzdGVtX3Nka192ZXJzaW9uKScgaXMgbm90IHN1cHBvcnRlZC4gU3VwcG9ydGVkIHZlcnNpb25zIGFyZTogJChfc3VwcG9ydGVkX3N5c3RlbXNka192ZXJzaW9ucykpCisgIGVuZGlmCisgIF9zeXN0ZW1fc2RrX3ZlcnNpb24gOj0KKyAgX3N1cHBvcnRlZF9zeXN0ZW1zZGtfdmVyc2lvbnMgOj0KK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2xvY2FsX3ZuZGsubWsgYi9jb3JlL2xvY2FsX3ZuZGsubWsKaW5kZXggNjQwYWFjNy4uMzY3N2Q0MCAxMDA2NDQKLS0tIGEvY29yZS9sb2NhbF92bmRrLm1rCisrKyBiL2NvcmUvbG9jYWxfdm5kay5tawpAQCAtNSwxMCArNSw4IEBACiBpZm5kZWYgTE9DQUxfU0RLX1ZFUlNJT04KICAgaWZuZXEgKCwkKGZpbHRlciB0cnVlLCQoTE9DQUxfVkVORE9SX01PRFVMRSkgJChMT0NBTF9PRE1fTU9EVUxFKSAkKExPQ0FMX09FTV9NT0RVTEUpICQoTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFKSkpCiAgICAgTE9DQUxfVVNFX1ZOREs6PXRydWUKLSAgZWxzZQotICAgIGlmbmVxICgsJChmaWx0ZXIgJChUQVJHRVRfT1VUX1ZFTkRPUiklLCQoTE9DQUxfTU9EVUxFX1BBVEgpICQoTE9DQUxfTU9EVUxFX1BBVEhfMzIpICQoTE9DQUxfTU9EVUxFX1BBVEhfNjQpKSkKLSAgICAgIExPQ0FMX1VTRV9WTkRLOj10cnVlCi0gICAgZW5kaWYKKyAgICAjIE5vdGU6IG5vIG5lZWQgdG8gY2hlY2sgTE9DQUxfTU9EVUxFX1BBVEgqIHNpbmNlIExPQ0FMX1tWRU5ET1J8T0RNfE9FTV1fTU9EVUxFIGlzIGFscmVhZHkKKyAgICAjIHNldCBjb3JyZWN0bHkgYmVmb3JlIHRoaXMgaXMgaW5jbHVkZWQuCiAgIGVuZGlmCiBlbmRpZgogZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvbWFpbi5tayBiL2NvcmUvbWFpbi5tawppbmRleCAxZWEyMTYwLi41Njc1ZjkwIDEwMDY0NAotLS0gYS9jb3JlL21haW4ubWsKKysrIGIvY29yZS9tYWluLm1rCkBAIC0zNCw3ICszNCw3IEBACiBUT1AgOj0gLgogVE9QRElSIDo9CiAKLUJVSUxEX1NZU1RFTSA6PSAkKFRPUERJUilidWlsZC9jb3JlCitCVUlMRF9TWVNURU0gOj0gJChUT1BESVIpYnVpbGQvbWFrZS9jb3JlCiAKICMgVGhpcyBpcyB0aGUgZGVmYXVsdCB0YXJnZXQuICBJdCBtdXN0IGJlIHRoZSBmaXJzdCBkZWNsYXJlZCB0YXJnZXQuCiAuUEhPTlk6IGRyb2lkCkBAIC02MCwxNiArNjAsMjggQEAKICMgd2l0aG91dCBjaGFuZ2luZyB0aGUgY29tbWFuZCBsaW5lIGV2ZXJ5IHRpbWUuICBBdm9pZHMgcmVidWlsZHMKICMgd2hlbiB1c2luZyBuaW5qYS4KICQoc2hlbGwgbWtkaXIgLXAgJChPVVRfRElSKSAmJiBcCi0gICAgZWNobyAtbiAkKEJVSUxEX05VTUJFUikgPiAkKE9VVF9ESVIpL2J1aWxkX251bWJlci50eHQgJiYgXAotICAgIGVjaG8gLW4gJChCVUlMRF9EQVRFVElNRSkgPiAkKE9VVF9ESVIpL2J1aWxkX2RhdGUudHh0KQotQlVJTERfTlVNQkVSX0ZST01fRklMRSA6PSAkJChjYXQgJChPVVRfRElSKS9idWlsZF9udW1iZXIudHh0KQotQlVJTERfREFURVRJTUVfRlJPTV9GSUxFIDo9ICQkKGNhdCAkKE9VVF9ESVIpL2J1aWxkX2RhdGUudHh0KQorICAgIGVjaG8gLW4gJChCVUlMRF9OVU1CRVIpID4gJChPVVRfRElSKS9idWlsZF9udW1iZXIudHh0KQorQlVJTERfTlVNQkVSX0ZJTEUgOj0gJChPVVRfRElSKS9idWlsZF9udW1iZXIudHh0CisKIGlmZXEgKCQoSE9TVF9PUyksZGFyd2luKQogREFURV9GUk9NX0ZJTEUgOj0gZGF0ZSAtciAkKEJVSUxEX0RBVEVUSU1FX0ZST01fRklMRSkKIGVsc2UKIERBVEVfRlJPTV9GSUxFIDo9IGRhdGUgLWQgQCQoQlVJTERfREFURVRJTUVfRlJPTV9GSUxFKQogZW5kaWYKIAorIyBQaWNrIGEgcmVhc29uYWJsZSBzdHJpbmcgdG8gdXNlIHRvIGlkZW50aWZ5IGZpbGVzLgoraWZlcSAoJChzdHJpcCAkKEhBU19CVUlMRF9OVU1CRVIpKSxmYWxzZSkKKyAgIyBCVUlMRF9OVU1CRVIgaGFzIGEgdGltZXN0YW1wIGluIGl0LCB3aGljaCBtZWFucyB0aGF0CisgICMgaXQgd2lsbCBjaGFuZ2UgZXZlcnkgdGltZS4gIFBpY2sgYSBzdGFibGUgdmFsdWUuCisgIEZJTEVfTkFNRV9UQUcgOj0gZW5nLiQoVVNFUikKK2Vsc2UKKyAgRklMRV9OQU1FX1RBRyA6PSAkKGZpbGUgPCQoQlVJTERfTlVNQkVSX0ZJTEUpKQorZW5kaWYKKworIyBNYWtlIGFuIGVtcHR5IGRpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFrZSBlbXB0eSBqYXJzCitFTVBUWV9ESVJFQ1RPUlkgOj0gJChPVVRfRElSKS9lbXB0eQorJChzaGVsbCBta2RpciAtcCAkKEVNUFRZX0RJUkVDVE9SWSkgJiYgcm0gLXJmICQoRU1QVFlfRElSRUNUT1JZKS8qKQorCiAjIENUUy1zcGVjaWZpYyBjb25maWcuCiAtaW5jbHVkZSBjdHMvYnVpbGQvY29uZmlnLm1rCiAjIFZUUy1zcGVjaWZpYyBjb25maWcuCkBAIC04MSwxMSArOTMsMTMgQEAKICMgU1RTLXNwZWNpZmljIGNvbmZpZy4KIC1pbmNsdWRlIHRlc3Qvc3RzL3Rvb2xzL3N0cy10cmFkZWZlZC9idWlsZC9jb25maWcubWsKIAotIyBUaGlzIGFsbG93cyB1cyB0byBmb3JjZSBhIGNsZWFuIGJ1aWxkIC0gaW5jbHVkZWQgYWZ0ZXIgdGhlIGNvbmZpZy5tawotIyBlbnZpcm9ubWVudCBzZXR1cCBpcyBkb25lLCBidXQgYmVmb3JlIHdlIGdlbmVyYXRlIGFueSBkZXBlbmRlbmNpZXMuICBUaGlzCi0jIGZpbGUgZG9lcyB0aGUgcm0gLXJmIGlubGluZSBzbyB0aGUgZGVwcyB3aGljaCBhcmUgYWxsIGRvbmUgYmVsb3cgd2lsbAotIyBiZSBnZW5lcmF0ZWQgY29ycmVjdGx5Ci1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9jbGVhbmJ1aWxkLm1rCisjIENsZWFuIHJ1bGVzCisuUEhPTlk6IGNsZWFuLWRleC1maWxlcworY2xlYW4tZGV4LWZpbGVzOgorCSQoaGlkZSkgZmluZCAkKE9VVF9ESVIpIC1uYW1lICIqLmRleCIgfCB4YXJncyBybSAtZgorCSQoaGlkZSkgZm9yIGkgaW4gYGZpbmQgJChPVVRfRElSKSAtbmFtZSAiKi5qYXIiIC1vIC1uYW1lICIqLmFwayJgIDsgZG8gKCh1bnppcCAtbCAkJGkgMj4gL2Rldi9udWxsIHwgXAorCQkJCWdyZXAgLXEgIlwuZGV4JCQiICYmIHJtIC1mICQkaSkgfHwgY29udGludWUgKSA7IGRvbmUKKwlAZWNobyAiQWxsIGRleCBmaWxlcyBhbmQgYXJjaGl2ZXMgY29udGFpbmluZyBkZXggZmlsZXMgaGF2ZSBiZWVuIHJlbW92ZWQuIgogCiAjIEluY2x1ZGUgdGhlIGdvb2dsZS1zcGVjaWZpYyBjb25maWcKIC1pbmNsdWRlIHZlbmRvci9nb29nbGUvYnVpbGQvY29uZmlnLm1rCkBAIC05NSwxMSArMTA5LDIxIEBACiAjIChtdXN0IGJlIGRlZmluZWQgYmVmb3JlIGluY2x1ZGluZyBkZWZpbml0aW9ucy5tYWtlKQogSU5URVJOQUxfTU9ESUZJRVJfVEFSR0VUUyA6PSBhbGwKIAotIyBFTU1BX0lOU1RSVU1FTlRfU1RBVElDIG1lcmdlcyB0aGUgc3RhdGljIGVtbWEgbGlicmFyeSB0byBlYWNoIGVtbWEtZW5hYmxlZCBtb2R1bGUuCisjIEVNTUFfSU5TVFJVTUVOVF9TVEFUSUMgbWVyZ2VzIHRoZSBzdGF0aWMgamFjb2NvIGxpYnJhcnkgdG8gZWFjaAorIyBqYWNvY28tZW5hYmxlZCBtb2R1bGUuCiBpZmVxICh0cnVlLCQoRU1NQV9JTlNUUlVNRU5UX1NUQVRJQykpCiBFTU1BX0lOU1RSVU1FTlQgOj0gdHJ1ZQogZW5kaWYKIAoraWZlcSAodHJ1ZSwkKEVNTUFfSU5TVFJVTUVOVCkpCisjIEFkZGluZyB0aGUgamFjb2NvIGxpYnJhcnkgY2FuIGNhdXNlIHRoZSBpbmNsdXNpb24gb2YKKyMgc29tZSB0eXBpY2FsbHkgYmFubmVkIGNsYXNzZXMKKyMgU28gaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgU0tJUF9CT09UX0pBUlNfQ0hFQ0ssIGVuYWJsZSBpdCBoZXJlCitpZm5kZWYgU0tJUF9CT09UX0pBUlNfQ0hFQ0sKK1NLSVBfQk9PVF9KQVJTX0NIRUNLIDo9IHRydWUKK2VuZGlmCitlbmRpZgorCiAjCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFZhbGlkYXRlIEFERElUSU9OQUxfREVGQVVMVF9QUk9QRVJUSUVTLgpAQCAtMTE0LDYgKzEzOCw4IEBACiAkKGVycm9yIEFERElUSU9OQUxfQlVJTERfUFJPUEVSVElFUyBtdXN0IG5vdCBiZSBzZXQgYmVmb3JlIGhlcmU6ICQoQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTKSkKIGVuZGlmCiAKK0FERElUSU9OQUxfQlVJTERfUFJPUEVSVElFUyA6PQorCiAjCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEFkZCB0aGUgcHJvZHVjdC1kZWZpbmVkIHByb3BlcnRpZXMgdG8gdGhlIGJ1aWxkIHByb3BlcnRpZXMuCkBAIC0xNjksMzkgKzE5NSwzOCBAQAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFRoZSBwZGsgKFBsYXRmb3JtIERldmVsb3BtZW50IEtpdCkgYnVpbGQKLWluY2x1ZGUgYnVpbGQvY29yZS9wZGtfY29uZmlnLm1rCitpbmNsdWRlIGJ1aWxkL21ha2UvY29yZS9wZGtfY29uZmlnLm1rCiAKICMKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSmFjayB2ZXJzaW9uIGNvbmZpZ3VyYXRpb24KLS1pbmNsdWRlICQoVE9QRElSKXByZWJ1aWx0cy9zZGsvdG9vbHMvamFja192ZXJzaW9ucy5tawotLWluY2x1ZGUgJChUT1BESVIpcHJlYnVpbHRzL3Nkay90b29scy9qYWNrX2Zvcl9tb2R1bGUubWsKLQotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBJbnN0YWxsIGFuZCBzdGFydCBKYWNrIHNlcnZlcgotLWluY2x1ZGUgJChUT1BESVIpcHJlYnVpbHRzL3Nkay90b29scy9qYWNrX3NlcnZlcl9zZXR1cC5tawotCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEphY29jbyBwYWNrYWdlIG5hbWUgZm9yIEphY2sKLS1pbmNsdWRlICQoVE9QRElSKWV4dGVybmFsL2phY29jby9jb25maWcubWsKLQotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBFbmFibGUgZHluYW1pYyBsaW5rZXIgZGV2ZWxvcGVyIHdhcm5pbmdzIGZvciB1c2VyZGVidWcsIGVuZwotIyBhbmQgbm9uLVJFTCBidWlsZHMKKyMgRW5hYmxlIGR5bmFtaWMgbGlua2VyIGFuZCBoaWRkZW4gQVBJIGRldmVsb3BlciB3YXJuaW5ncyBmb3IKKyMgdXNlcmRlYnVnLCBlbmcgYW5kIG5vbi1SRUwgYnVpbGRzCiBpZm5lcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcikKLSAgQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5sZC53YXJuaW5nPTEKKyAgQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5sZC53YXJuaW5nPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm8uYXJ0LmhpZGRlbmFwaS53YXJuaW5nPTEKIGVsc2UKICMgRW5hYmxlIGl0IGZvciB1c2VyIGJ1aWxkcyBhcyBsb25nIGFzIHRoZXkgYXJlIG5vdCBmaW5hbC4KIGlmbmVxICgkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpLFJFTCkKLSAgQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5sZC53YXJuaW5nPTEKKyAgQURESVRJT05BTF9CVUlMRF9QUk9QRVJUSUVTICs9IHJvLmJpb25pYy5sZC53YXJuaW5nPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm8uYXJ0LmhpZGRlbmFwaS53YXJuaW5nPTEKIGVuZGlmCiBlbmRpZgogCiBBRERJVElPTkFMX0JVSUxEX1BST1BFUlRJRVMgKz0gcm8udHJlYmxlLmVuYWJsZWQ9JHtQUk9EVUNUX0ZVTExfVFJFQkxFfQogCiskKEtBVElfb2Jzb2xldGVfdmFyIFBST0RVQ1RfRlVMTF9UUkVCTEUsXAorCUNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gd29yayByZWdhcmRsZXNzIG9mIGEgZGV2aWNlIGJlaW5nIFRyZWJsZSBvciBcCisJdmFyaWFibGVzIGxpa2UgUFJPRFVDVF9TRVBPTElDWV9TUExJVCBzaG91bGQgYmUgdXNlZCB1bnRpbCB0aGF0IGlzIFwKKwlwb3NzaWJsZS4pCisKKyMgU2V0cyByby5hY3Rpb25hYmxlX2NvbXBhdGlibGVfcHJvcGVydHkuZW5hYmxlZCB0byBrbm93IG9uIHJ1bnRpbWUgd2hldGhlciB0aGUgd2hpdGVsaXN0CisjIG9mIGFjdGlvbmFibGUgY29tcGF0aWJsZSBwcm9wZXJ0aWVzIGlzIGVuYWJsZWQgb3Igbm90LgoraWZlcSAoJChQUk9EVUNUX0FDVElPTkFCTEVfQ09NUEFUSUJMRV9QUk9QRVJUWV9ESVNBQkxFKSx0cnVlKQorQURESVRJT05BTF9ERUZBVUxUX1BST1BFUlRJRVMgKz0gcm8uYWN0aW9uYWJsZV9jb21wYXRpYmxlX3Byb3BlcnR5LmVuYWJsZWQ9ZmFsc2UKK2Vsc2UKK0FERElUSU9OQUxfREVGQVVMVF9QUk9QRVJUSUVTICs9IHJvLmFjdGlvbmFibGVfY29tcGF0aWJsZV9wcm9wZXJ0eS5lbmFibGVkPSR7UFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZfQorZW5kaWYKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyMjCiAjIyMgSW4gdGhpcyBzZWN0aW9uIHdlIHNldCB1cCB0aGUgdGhpbmdzIHRoYXQgYXJlIGRpZmZlcmVudApAQCAtNDE4LDE2ICs0NDMsMTYgQEAKICMgSW5jbHVkZSBhbGwgb2YgdGhlIG1ha2VmaWxlcyBpbiB0aGUgc3lzdGVtCiAjCiAKLXN1YmRpcl9tYWtlZmlsZXMgOj0gJChTT09OR19BTkRST0lEX01LKSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoVE9QKSkKK3N1YmRpcl9tYWtlZmlsZXMgOj0gJChTT09OR19BTkRST0lEX01LKSAkKGZpbGUgPCQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9BbmRyb2lkLm1rLmxpc3QpCiBzdWJkaXJfbWFrZWZpbGVzX3RvdGFsIDo9ICQod29yZHMgJChzdWJkaXJfbWFrZWZpbGVzKSkKIC5LQVRJX1JFQURPTkxZIDo9IHN1YmRpcl9tYWtlZmlsZXNfdG90YWwKIAogJChmb3JlYWNoIG1rLCQoc3ViZGlyX21ha2VmaWxlcyksJChpbmZvIFskKGNhbGwgaW5jX2FuZF9wcmludCxzdWJkaXJfbWFrZWZpbGVzX2luYykvJChzdWJkaXJfbWFrZWZpbGVzX3RvdGFsKV0gaW5jbHVkaW5nICQobWspIC4uLikkKGV2YWwgaW5jbHVkZSAkKG1rKSkpCiAKLWlmZGVmIFBES19GVVNJT05fUExBVEZPUk1fWklQCitpZm5lcSAoLCQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApJChQREtfRlVTSU9OX1BMQVRGT1JNX0RJUikpCiAjIEJyaW5nIGluIHRoZSBQREsgcGxhdGZvcm0uemlwIG1vZHVsZXMuCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9wZGtfZnVzaW9uX21vZHVsZXMubWsKLWVuZGlmICMgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAKK2VuZGlmICMgUERLX0ZVU0lPTl9QTEFURk9STV9aSVAgfHwgUERLX0ZVU0lPTl9QTEFURk9STV9ESVIKIAogZHJvaWRfdGFyZ2V0cyA6IGJsdWVwcmludF90b29scwogCkBAIC01MDAsOSArNTI1LDEwIEBACiAjIElmIGEgbW9kdWxlIGlzIGZvciBhIGNyb3NzIGhvc3Qgb3MsIHRoZSByZXF1aXJlZCBtb2R1bGVzIG11c3QgYmUgZm9yCiAjIHRoYXQgT1MgdG9vLgogIyBJZiBhIG1vZHVsZSBpcyBidWlsdCBmb3IgMzItYml0LCB0aGUgcmVxdWlyZWQgbW9kdWxlcyBtdXN0IGJlIDMyLWJpdCB0b287Ci0jIE90aGVyd2lzZSBpZiB0aGUgbW9kdWxlIGlzIGFuIGV4ZWN0dWFibGUgb3Igc2hhcmVkIGxpYnJhcnksCisjIE90aGVyd2lzZSBpZiB0aGUgbW9kdWxlIGlzIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnksCiAjICAgdGhlIHJlcXVpcmVkIG1vZHVsZXMgbXVzdCBiZSA2NC1iaXQ7CiAjICAgb3RoZXJ3aXNlIHdlIHJlcXVpcmUgYm90aCA2NC1iaXQgYW5kIDMyLWJpdCB2YXJpYW50LCBpZiBvbmUgZXhpc3RzLgorZGVmaW5lIHNlbGVjdC1iaXRuZXNzLW9mLXJlcXVpcmVkLW1vZHVsZXMKICQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRVMpLFwKICAgJChldmFsIHIgOj0gJChBTExfTU9EVUxFUy4kKG0pLlJFUVVJUkVEKSlcCiAgICQoaWYgJChyKSxcCkBAIC01MTgsNiArNTQ0LDggQEAKICAgICAgJChldmFsIEFMTF9NT0RVTEVTLiQobSkuUkVRVUlSRUQgOj0gJChzdHJpcCAkKHJfcikpKVwKICAgKVwKICkKK2VuZGVmCiskKGNhbGwgc2VsZWN0LWJpdG5lc3Mtb2YtcmVxdWlyZWQtbW9kdWxlcykKIHJfciA6PQogCiBkZWZpbmUgYWRkLXJlcXVpcmVkLWRlcHMKQEAgLTUzMiwyNCArNTYwLDkzIEBACiAkKDEpOiAkKDIpCiBlbmRlZgogCisjIFNldHMgdXAgZGVwZW5kZW5jaWVzIHN1Y2ggdGhhdCB3aGVuZXZlciBhIGhvc3QgbW9kdWxlIGlzIGluc3RhbGxlZCwKKyMgYW55IG90aGVyIGhvc3QgbW9kdWxlcyBsaXN0ZWQgaW4gJChBTExfTU9EVUxFUy4kKG0pLlJFUVVJUkVEKSB3aWxsIGFsc28gYmUgaW5zdGFsbGVkCitkZWZpbmUgYWRkLWFsbC1ob3N0LXRvLWhvc3QtcmVxdWlyZWQtbW9kdWxlcy1kZXBzCiskKGZvcmVhY2ggbSwkKEFMTF9NT0RVTEVTKSwgXAorICAkKGV2YWwgciA6PSAkKEFMTF9NT0RVTEVTLiQobSkuUkVRVUlSRUQpKSBcCisgICQoaWYgJChyKSwgXAorICAgICQoZXZhbCByIDo9ICQoY2FsbCBtb2R1bGUtaW5zdGFsbGVkLWZpbGVzLCQocikpKSBcCisgICAgJChldmFsIGhfbSA6PSAkKGZpbHRlciAkKEhPU1RfT1VUKS8lLCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSkpIFwKKyAgICAkKGV2YWwgaGNfbSA6PSAkKGZpbHRlciAkKEhPU1RfQ1JPU1NfT1VUKS8lLCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSkpIFwKKyAgICAkKGV2YWwgaF9yIDo9ICQoZmlsdGVyICQoSE9TVF9PVVQpLyUsICQocikpKSBcCisgICAgJChldmFsIGhjX3IgOj0gJChmaWx0ZXIgJChIT1NUX0NST1NTX09VVCkvJSwgJChyKSkpIFwKKyAgICAkKGV2YWwgaF9tIDo9ICQoZmlsdGVyLW91dCAkKGhfciksICQoaF9tKSkpIFwKKyAgICAkKGV2YWwgaGNfbSA6PSAkKGZpbHRlci1vdXQgJChoY19yKSwgJChoY19tKSkpIFwKKyAgICAkKGlmICQoaF9tKSwgJChldmFsICQoY2FsbCBhZGQtcmVxdWlyZWQtZGVwcywgJChoX20pLCQoaF9yKSkpKSBcCisgICAgJChpZiAkKGhjX20pLCAkKGV2YWwgJChjYWxsIGFkZC1yZXF1aXJlZC1kZXBzLCAkKGhjX20pLCQoaGNfcikpKSkgXAorICApIFwKKykKK2VuZGVmCiskKGNhbGwgYWRkLWFsbC1ob3N0LXRvLWhvc3QtcmVxdWlyZWQtbW9kdWxlcy1kZXBzKQorCisjIFNldHMgdXAgZGVwZW5kZW5jaWVzIHN1Y2ggdGhhdCB3aGVuZXZlciBhIHRhcmdldCBtb2R1bGUgaXMgaW5zdGFsbGVkLAorIyBhbnkgb3RoZXIgdGFyZ2V0IG1vZHVsZXMgbGlzdGVkIGluICQoQUxMX01PRFVMRVMuJChtKS5SRVFVSVJFRCkgd2lsbCBhbHNvIGJlIGluc3RhbGxlZAorZGVmaW5lIGFkZC1hbGwtdGFyZ2V0LXRvLXRhcmdldC1yZXF1aXJlZC1tb2R1bGVzLWRlcHMKICQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRVMpLCBcCiAgICQoZXZhbCByIDo9ICQoQUxMX01PRFVMRVMuJChtKS5SRVFVSVJFRCkpIFwKICAgJChpZiAkKHIpLCBcCiAgICAgJChldmFsIHIgOj0gJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJChyKSkpIFwKICAgICAkKGV2YWwgdF9tIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVF9ST09UKS8lLCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSkpIFwKLSAgICAkKGV2YWwgaF9tIDo9ICQoZmlsdGVyICQoSE9TVF9PVVQpLyUsICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSkgXAotICAgICQoZXZhbCBoY19tIDo9ICQoZmlsdGVyICQoSE9TVF9DUk9TU19PVVQpLyUsICQoQUxMX01PRFVMRVMuJChtKS5JTlNUQUxMRUQpKSkgXAogICAgICQoZXZhbCB0X3IgOj0gJChmaWx0ZXIgJChUQVJHRVRfT1VUX1JPT1QpLyUsICQocikpKSBcCi0gICAgJChldmFsIGhfciA6PSAkKGZpbHRlciAkKEhPU1RfT1VUKS8lLCAkKHIpKSkgXAotICAgICQoZXZhbCBoY19yIDo9ICQoZmlsdGVyICQoSE9TVF9DUk9TU19PVVQpLyUsICQocikpKSBcCiAgICAgJChldmFsIHRfbSA6PSAkKGZpbHRlci1vdXQgJCh0X3IpLCAkKHRfbSkpKSBcCi0gICAgJChldmFsIGhfbSA6PSAkKGZpbHRlci1vdXQgJChoX3IpLCAkKGhfbSkpKSBcCi0gICAgJChldmFsIGhjX20gOj0gJChmaWx0ZXItb3V0ICQoaGNfciksICQoaGNfbSkpKSBcCiAgICAgJChpZiAkKHRfbSksICQoZXZhbCAkKGNhbGwgYWRkLXJlcXVpcmVkLWRlcHMsICQodF9tKSwkKHRfcikpKSkgXAotICAgICQoaWYgJChoX20pLCAkKGV2YWwgJChjYWxsIGFkZC1yZXF1aXJlZC1kZXBzLCAkKGhfbSksJChoX3IpKSkpIFwKLSAgICAkKGlmICQoaGNfbSksICQoZXZhbCAkKGNhbGwgYWRkLXJlcXVpcmVkLWRlcHMsICQoaGNfbSksJChoY19yKSkpKSBcCi0gICApIFwKLSApCisgICkgXAorKQorZW5kZWYKKyQoY2FsbCBhZGQtYWxsLXRhcmdldC10by10YXJnZXQtcmVxdWlyZWQtbW9kdWxlcy1kZXBzKQorCisjIFNldHMgdXAgZGVwZW5kZW5jaWVzIHN1Y2ggdGhhdCB3aGVuZXZlciBhIGhvc3QgbW9kdWxlIGlzIGluc3RhbGxlZCwKKyMgYW55IHRhcmdldCBtb2R1bGVzIGxpc3RlZCBpbiAkKEFMTF9NT0RVTEVTLiQobSkuVEFSR0VUX1JFUVVJUkVEKSB3aWxsIGFsc28gYmUgaW5zdGFsbGVkCitkZWZpbmUgYWRkLWFsbC1ob3N0LXRvLXRhcmdldC1yZXF1aXJlZC1tb2R1bGVzLWRlcHMKKyQoZm9yZWFjaCBtLCQoQUxMX01PRFVMRVMpLCBcCisgICQoZXZhbCByZXFfbW9kcyA6PSAkKEFMTF9NT0RVTEVTLiQobSkuVEFSR0VUX1JFUVVJUkVEKSlcCisgICQoaWYgJChyZXFfbW9kcyksIFwKKyAgICAkKGV2YWwgcmVxX2ZpbGVzIDo9IClcCisgICAgJChmb3JlYWNoIHJlcV9tb2QsJChyZXFfbW9kcyksIFwKKyAgICAgICQoZXZhbCByZXFfZmlsZSA6PSAkKGZpbHRlciAkKFRBUkdFVF9PVVRfUk9PVCkvJSwgJChjYWxsIG1vZHVsZS1pbnN0YWxsZWQtZmlsZXMsJChyZXFfbW9kKSkpKSBcCisgICAgICAkKGlmICQoc3RyaXAgJChyZXFfZmlsZSkpLFwKKyAgICAgICAgLFwKKyAgICAgICAgJChlcnJvciAkKG0pLkxPQ0FMX1RBUkdFVF9SRVFVSVJFRF9NT0RVTEVTIDogaWxsZWdhbCB2YWx1ZSAkKHJlcV9tb2QpIDogbm90IGEgZGV2aWNlIG1vZHVsZS4gSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBob3N0IG1vZHVsZXMgdG8gYmUgcmVxdWlyZWQgdG8gYmUgaW5zdGFsbGVkIGFsb25nIHdpdGggeW91ciBob3N0IG1vZHVsZSwgYWRkIHRob3NlIG1vZHVsZSBuYW1lcyB0byBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIGluc3RlYWQpXAorICAgICAgKVwKKyAgICAgICQoZXZhbCByZXFfZmlsZXMgOj0gJChyZXFfZmlsZXMpJChzcGFjZSkkKHJlcV9maWxlKSlcCisgICAgKVwKKyAgICAkKGV2YWwgcmVxX2ZpbGVzIDo9ICQoc3RyaXAgJChyZXFfZmlsZXMpKSlcCisgICAgJChldmFsIG1vZF9maWxlcyA6PSAkKGZpbHRlciAkKEhPU1RfT1VUKS8lLCAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKG0pKSkpIFwKKyAgICAkKGV2YWwgbW9kX2ZpbGVzIDo9ICQoZmlsdGVyLW91dCAkKHJlcV9maWxlcyksJChtb2RfZmlsZXMpKSlcCisgICAgJChpZiAkKG1vZF9maWxlcyksXAorICAgICAgJChldmFsICQoY2FsbCBhZGQtcmVxdWlyZWQtZGVwcywgJChtb2RfZmlsZXMpLCQocmVxX2ZpbGVzKSkpIFwKKyAgICApXAorICApXAorKQorZW5kZWYKKyQoY2FsbCBhZGQtYWxsLWhvc3QtdG8tdGFyZ2V0LXJlcXVpcmVkLW1vZHVsZXMtZGVwcykKKworIyBTZXRzIHVwIGRlcGVuZGVuY2llcyBzdWNoIHRoYXQgd2hlbmV2ZXIgYSB0YXJnZXQgbW9kdWxlIGlzIGluc3RhbGxlZCwKKyMgYW55IGhvc3QgbW9kdWxlcyBsaXN0ZWQgaW4gJChBTExfTU9EVUxFUy4kKG0pLkhPU1RfUkVRVUlSRUQpIHdpbGwgYWxzbyBiZSBpbnN0YWxsZWQKK2RlZmluZSBhZGQtYWxsLXRhcmdldC10by1ob3N0LXJlcXVpcmVkLW1vZHVsZXMtZGVwcworJChmb3JlYWNoIG0sJChBTExfTU9EVUxFUyksIFwKKyAgJChldmFsIHJlcV9tb2RzIDo9ICQoQUxMX01PRFVMRVMuJChtKS5IT1NUX1JFUVVJUkVEKSlcCisgICQoaWYgJChyZXFfbW9kcyksIFwKKyAgICAkKGV2YWwgcmVxX2ZpbGVzIDo9IClcCisgICAgJChmb3JlYWNoIHJlcV9tb2QsJChyZXFfbW9kcyksIFwKKyAgICAgICQoZXZhbCByZXFfZmlsZSA6PSAkKGZpbHRlciAkKEhPU1RfT1VUKS8lLCAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKHJlcV9tb2QpKSkpIFwKKyAgICAgICQoaWYgJChzdHJpcCAkKHJlcV9maWxlKSksXAorICAgICAgICAsXAorICAgICAgICAkKGVycm9yICQobSkuTE9DQUxfSE9TVF9SRVFVSVJFRF9NT0RVTEVTIDogaWxsZWdhbCB2YWx1ZSAkKHJlcV9tb2QpIDogbm90IGEgaG9zdCBtb2R1bGUuIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGFyZ2V0IG1vZHVsZXMgdG8gYmUgcmVxdWlyZWQgdG8gYmUgaW5zdGFsbGVkIGFsb25nIHdpdGggeW91ciB0YXJnZXQgbW9kdWxlLCBhZGQgdGhvc2UgbW9kdWxlIG5hbWVzIHRvIExPQ0FMX1JFUVVJUkVEX01PRFVMRVMgaW5zdGVhZClcCisgICAgICApXAorICAgICAgJChldmFsIHJlcV9maWxlcyA6PSAkKHJlcV9maWxlcykkKHNwYWNlKSQocmVxX2ZpbGUpKVwKKyAgICApXAorICAgICQoZXZhbCByZXFfZmlsZXMgOj0gJChzdHJpcCAkKHJlcV9maWxlcykpKVwKKyAgICAkKGV2YWwgbW9kX2ZpbGVzIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVF9ST09UKS8lLCAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKG0pKSkpXAorICAgICQoZXZhbCBtb2RfZmlsZXMgOj0gJChmaWx0ZXItb3V0ICQocmVxX2ZpbGVzKSwkKG1vZF9maWxlcykpKVwKKyAgICAkKGlmICQobW9kX2ZpbGVzKSxcCisgICAgICAkKGV2YWwgJChjYWxsIGFkZC1yZXF1aXJlZC1kZXBzLCAkKG1vZF9maWxlcyksJChyZXFfZmlsZXMpKSkgXAorICAgIClcCisgIClcCispCitlbmRlZgorJChjYWxsIGFkZC1hbGwtdGFyZ2V0LXRvLWhvc3QtcmVxdWlyZWQtbW9kdWxlcy1kZXBzKQogCiB0X20gOj0KIGhfbSA6PQpAQCAtNTU4LDcgKzY1NSw3IEBACiBoX3IgOj0KIGhjX3IgOj0KIAotIyBFc3RhYmxpc2ggdGhlIGRlcGVuZGVjaWVzIG9uIHRoZSBzaGFyZWQgbGlicmFyaWVzLgorIyBFc3RhYmxpc2ggdGhlIGRlcGVuZGVuY2llcyBvbiB0aGUgc2hhcmVkIGxpYnJhcmllcy4KICMgSXQgYWxzbyBhZGRzIHRoZSBzaGFyZWQgbGlicmFyeSBtb2R1bGUgbmFtZXMgdG8gQUxMX01PRFVMRVMuJChtKS5SRVFVSVJFRCwKICMgc28gdGhleSBjYW4gYmUgZXhwYW5kZWQgdG8gcHJvZHVjdF9NT0RVTEVTIGxhdGVyLgogIyAkKDEpOiBUQVJHRVRfIG9yIEhPU1RfIG9yIEhPU1RfQ1JPU1NfLgpAQCAtOTA1LDcgKzEwMDIsNyBAQAogICAgICAgJCh3YXJuaW5nICQoQUxMX01PRFVMRVMuJChtKS5NQUtFRklMRSk6IE1vZHVsZSAnJChtKScgaW4gUFJPRFVDVF9QQUNLQUdFU19URVNUUyBoYXMgbm90aGluZyB0byBpbnN0YWxsISkpKQogZW5kaWYKIAotIyBidWlsZC9jb3JlL01ha2VmaWxlIGNvbnRhaW5zIGV4dHJhIHN0dWZmIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBwb2xsdXRlIHRoaXMKKyMgYnVpbGQvbWFrZS9jb3JlL01ha2VmaWxlIGNvbnRhaW5zIGV4dHJhIHN0dWZmIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBwb2xsdXRlIHRoaXMKICMgdG9wLWxldmVsIG1ha2VmaWxlIHdpdGguICBJdCBleHBlY3RzIHRoYXQgQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMKICMgY29udGFpbnMgZXZlcnl0aGluZyB0aGF0J3MgYnVpbHQgZHVyaW5nIHRoZSBjdXJyZW50IG1ha2UsIGJ1dCBpdCBhbHNvIGZ1cnRoZXIKICMgZXh0ZW5kcyBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUy4KQEAgLTk4Myw2ICsxMDgwLDkgQEAKIC5QSE9OWTogdmVuZG9yaW1hZ2UKIHZlbmRvcmltYWdlOiAkKElOU1RBTExFRF9WRU5ET1JJTUFHRV9UQVJHRVQpCiAKKy5QSE9OWTogcHJvZHVjdGltYWdlCitwcm9kdWN0aW1hZ2U6ICQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpCisKIC5QSE9OWTogc3lzdGVtb3RoZXJpbWFnZQogc3lzdGVtb3RoZXJpbWFnZTogJChJTlNUQUxMRURfU1lTVEVNT1RIRVJJTUFHRV9UQVJHRVQpCiAKQEAgLTEwMDYsMTAgKzExMDYsMTMgQEAKIAkkKElOU1RBTExFRF9DQUNIRUlNQUdFX1RBUkdFVCkgXAogCSQoSU5TVEFMTEVEX0JQVElNQUdFX1RBUkdFVCkgXAogCSQoSU5TVEFMTEVEX1ZFTkRPUklNQUdFX1RBUkdFVCkgXAorCSQoSU5TVEFMTEVEX1BST0RVQ1RJTUFHRV9UQVJHRVQpIFwKIAkkKElOU1RBTExFRF9TWVNURU1PVEhFUklNQUdFX1RBUkdFVCkgXAogCSQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpIFwKIAkkKElOU1RBTExFRF9GSUxFU19GSUxFX1ZFTkRPUikgXAotCSQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfU1lTVEVNT1RIRVIpCisJJChJTlNUQUxMRURfRklMRVNfRklMRV9QUk9EVUNUKSBcCisJJChJTlNUQUxMRURfRklMRVNfRklMRV9TWVNURU1PVEhFUikgXAorCXNvb25nX2RvY3MKIAogIyBkaXN0X2ZpbGVzIG9ubHkgZm9yIHB1dHRpbmcgeW91ciBsaWJyYXJ5IGludG8gdGhlIGRpc3QgZGlyZWN0b3J5IHdpdGggYSBmdWxsIGJ1aWxkLgogLlBIT05ZOiBkaXN0X2ZpbGVzCkBAIC0xMDM3LDEzICsxMTQwLDggQEAKICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLGFwcHNfb25seSwgJChhcHBzX29ubHlfZGlzdF9idWlsdF9maWxlcykpCiAKICAgaWZlcSAoJChFTU1BX0lOU1RSVU1FTlQpLHRydWUpCi0gICAgaWZlcSAoJChBTkRST0lEX0NPTVBJTEVfV0lUSF9KQUNLKSxmYWxzZSkKLSAgICAgICQoSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0FMTCkgOiAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpCi0gICAgICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsYXBwc19vbmx5LCAkKEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwpKQotICAgIGVsc2UKLSAgICAgICQoRU1NQV9NRVRBX1pJUCkgOiAkKGFwcHNfb25seV9pbnN0YWxsZWRfZmlsZXMpCi0gICAgICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsYXBwc19vbmx5LCAkKEVNTUFfTUVUQV9aSVApKQotICAgIGVuZGlmCisgICAgJChKQUNPQ09fUkVQT1JUX0NMQVNTRVNfQUxMKSA6ICQoYXBwc19vbmx5X2luc3RhbGxlZF9maWxlcykKKyAgICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsYXBwc19vbmx5LCAkKEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwpKQogICBlbmRpZgogCiAgICQoUFJPR1VBUkRfRElDVF9aSVApIDogJChhcHBzX29ubHlfaW5zdGFsbGVkX2ZpbGVzKQpAQCAtMTA3OCw2ICsxMTc2LDcgQEAKICAgICAkKENPVkVSQUdFX1pJUCkgXAogICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEUpIFwKICAgICAkKElOU1RBTExFRF9GSUxFU19GSUxFX1ZFTkRPUikgXAorICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUFJPRFVDVCkgXAogICAgICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfU1lTVEVNT1RIRVIpIFwKICAgICAkKElOU1RBTExFRF9CVUlMRF9QUk9QX1RBUkdFVCkgXAogICAgICQoQlVJTFRfVEFSR0VUX0ZJTEVTX1BBQ0tBR0UpIFwKQEAgLTExMDAsMTMgKzExOTksOCBAQAogICBlbmRpZgogCiAgIGlmZXEgKCQoRU1NQV9JTlNUUlVNRU5UKSx0cnVlKQotICAgIGlmZXEgKCQoQU5EUk9JRF9DT01QSUxFX1dJVEhfSkFDSyksZmFsc2UpCi0gICAgICAkKEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwpIDogJChJTlNUQUxMRURfU1lTVEVNSU1BR0UpCi0gICAgICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRpc3RfZmlsZXMsICQoSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0FMTCkpCi0gICAgZWxzZQotICAgICAgJChFTU1BX01FVEFfWklQKSA6ICQoSU5TVEFMTEVEX1NZU1RFTUlNQUdFKQotICAgICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkaXN0X2ZpbGVzLCAkKEVNTUFfTUVUQV9aSVApKQotICAgIGVuZGlmCisgICAgJChKQUNPQ09fUkVQT1JUX0NMQVNTRVNfQUxMKSA6ICQoSU5TVEFMTEVEX1NZU1RFTUlNQUdFKQorICAgICQoY2FsbCBkaXN0LWZvci1nb2FscywgZGlzdF9maWxlcywgJChKQUNPQ09fUkVQT1JUX0NMQVNTRVNfQUxMKSkKICAgZW5kaWYKIAogIyBCdWlsZGluZyBhIGZ1bGwgc3lzdGVtLS0gdGhlIGRlZmF1bHQgaXMgdG8gYnVpbGQgZHJvaWRjb3JlCkBAIC0xMTQyLDcgKzEyMzYsNyBAQAogdGFyZ2V0LW5hdGl2ZS10ZXN0cyA6IG5hdGl2ZS10YXJnZXQtdGVzdHMKIHRlc3RzIDogaG9zdC10ZXN0cyB0YXJnZXQtdGVzdHMKIAotIyBQaG9ueSB0YXJnZXQgdG8gcnVuIGFsbCBqYXZhIGNvbXBpbGF0aW9ucyB0aGF0IHVzZSBqYXZhYyBpbnN0ZWFkIG9mIGphY2suCisjIFBob255IHRhcmdldCB0byBydW4gYWxsIGphdmEgY29tcGlsYXRpb25zIHRoYXQgdXNlIGphdmFjCiAuUEhPTlk6IGphdmFjLWNoZWNrCiAKIGlmbmVxICgsJChmaWx0ZXIgc2FtcGxlY29kZSwgJChNQUtFQ01ER09BTFMpKSkKQEAgLTExNjQsNiArMTI1OCw5IEBACiAuUEhPTlk6IGZpbmRidWdzCiBmaW5kYnVnczogJChJTlRFUk5BTF9GSU5EQlVHU19IVE1MX1RBUkdFVCkgJChJTlRFUk5BTF9GSU5EQlVHU19YTUxfVEFSR0VUKQogCisuUEhPTlk6IGZpbmRsc2R1bXBzCitmaW5kbHNkdW1wczogJChGSU5EX0xTRFVNUFNfRklMRSkKKwogI3h4eCBzY3JhcGUgdGhpcyBmcm9tIEFMTF9NT0RVTEVfTkFNRV9UQUdTCiAuUEhPTlk6IG1vZHVsZXMKIG1vZHVsZXM6CmRpZmYgLS1naXQgYS9jb3JlL21hdGgubWsgYi9jb3JlL21hdGgubWsKaW5kZXggMDQ3ZDA0Ni4uNDRlMDNjZSAxMDA2NDQKLS0tIGEvY29yZS9tYXRoLm1rCisrKyBiL2NvcmUvbWF0aC5tawpAQCAtNDIsNiArNDIsMTEgQEAKICQoaWYgJChjYWxsIG1hdGhfaXNfbnVtYmVyLCQoMSkpLCwkKGVycm9yIE9ubHkgcG9zaXRpdmUgaW50ZWdlcnMgPD0gMTAwIGFyZSBzdXBwb3J0ZWQgKG5vdCAkKDEpKSkpCiBlbmRlZgogCisjIHJldHVybiBhIGxpc3QgY29udGFpbmluZyBpbnRlZ2VycyByYW5naW5nIGZyb20gWyQoMSksJCgyKV0KK2RlZmluZSBpbnRfcmFuZ2VfbGlzdAorJChjYWxsIF9tYXRoX2NoZWNrX3ZhbGlkLCQoMSkpJChjYWxsIF9tYXRoX2NoZWNrX3ZhbGlkLCQoMikpJCh3b3JkbGlzdCAkKDEpLCQoMiksJChfX01BVEhfTlVNQkVSUykpCitlbmRlZgorCiAjJChjYWxsIF9tYXRoX2NoZWNrX3ZhbGlkLDApCiAjJChjYWxsIF9tYXRoX2NoZWNrX3ZhbGlkLDEpCiAjJChjYWxsIF9tYXRoX2NoZWNrX3ZhbGlkLDEwMCkKQEAgLTY3LDYgKzcyLDEwIEBACiAkKGlmICQoZmlsdGVyICQoMSksJChjYWxsIG1hdGhfbWF4LCQoMSksJCgyKSkpLHRydWUpCiBlbmRlZgogCitkZWZpbmUgbWF0aF9sdAorJChpZiAkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKDEpLCQoMikpLCx0cnVlKQorZW5kZWYKKwogIyQod2FybmluZyAkKGNhbGwgbWF0aF9ndF9vcl9lcSwgMiwgMSkpCiAjJCh3YXJuaW5nICQoY2FsbCBtYXRoX2d0X29yX2VxLCAxLCAxKSkKICMkKHdhcm5pbmcgJChpZiAkKGNhbGwgbWF0aF9ndF9vcl9lcSwgMSwgMiksZmFsc2UsdHJ1ZSkpCkBAIC03NSwzICs4NCw2OSBAQAogZGVmaW5lIGluY19hbmRfcHJpbnQKICQoc3RyaXAgJChldmFsICQoMSkgOj0gJCgkKDEpKSAuKSQod29yZHMgJCgkKDEpKSkpCiBlbmRlZgorCisjIFJldHVybnMgdGhlIHdvcmRzIGluICQyIHRoYXQgYXJlIG51bWJlcnMgYW5kIGFyZSBsZXNzIHRoYW4gJDEKK2RlZmluZSBudW1iZXJzX2xlc3NfdGhhbgorJChzdHJpcCBcCisgICQoZm9yZWFjaCBuLCQyLCBcCisgICAgJChpZiAkKGNhbGwgbWF0aF9pc19udW1iZXIsJChuKSksIFwKKyAgICAgICQoaWYgJChjYWxsIG1hdGhfbHQsJChuKSwkKDEpKSwgXAorICAgICAgICAkKG4pKSkpKQorZW5kZWYKKworX0lOVF9MSU1JVF9XT1JEUyA6PSAkKGZvcmVhY2ggYSx4IHgsJChmb3JlYWNoIGIseCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCxcCisgICQoZm9yZWFjaCBjLHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHgseCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCkpKQorCitkZWZpbmUgX2ludF9lbmNvZGUKKyQoaWYgJChmaWx0ZXIgJCh3b3JkcyB4ICQoX0lOVF9MSU1JVF9XT1JEUykpLCQod29yZHMgJCh3b3JkbGlzdCAxLCQoMSkseCAkKF9JTlRfTElNSVRfV09SRFMpKSkpLFwKKyAgJChjYWxsIHByZXR0eS1lcnJvcixpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAkKHdvcmRzICQoX0lOVF9MSU1JVF9XT1JEUykpIGlzIG5vdCBzdXBwb3J0ZWQhKSxcCisgICAgJCh3b3JkbGlzdCAxLCQoMSksJChfSU5UX0xJTUlUX1dPUkRTKSkpCitlbmRlZgorCisjIF9pbnRfbWF4IHJldHVybnMgdGhlIG1heGltdW0gb2YgdGhlIHR3byBhcmd1bWVudHMKKyMgaW5wdXQ6IHR3byAoeCkgbGlzdHM7IG91dHB1dDogb25lICh4KSBsaXN0CisjIGludGVnZXIgY2Fubm90IGJlIHBhc3NlZCBpbiBkaXJlY3RseS4gSXQgaGFzIHRvIGJlIGNvbnZlcnRlZCB1c2luZyBfaW50X2VuY29kZS4KK2RlZmluZSBfaW50X21heAorJChzdWJzdCB4eCx4LCQoam9pbiAkKDEpLCQoMikpKQorZW5kZWYKKworIyBmaXJzdCBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gc2Vjb25kIGFyZ3VtZW50CisjIG91dHB1dDogbm9uLWVtcHR5IGlmIHRydWUKKyMgaW50ZWdlciBjYW5ub3QgYmUgcGFzc2VkIGluIGRpcmVjdGx5LiBJdCBoYXMgdG8gYmUgY29udmVydGVkIHVzaW5nIF9pbnRfZW5jb2RlLgorZGVmaW5lIF9pbnRfZ3JlYXRlci10aGFuCiskKGZpbHRlci1vdXQgJCh3b3JkcyAkKDIpKSwkKHdvcmRzICQoY2FsbCBfaW50X21heCwkKDEpLCQoMikpKSkKK2VuZGVmCisKKyMgZmlyc3QgYXJndW1lbnQgZXF1YWxzIHRvIHNlY29uZCBhcmd1bWVudAorIyBvdXRwdXQ6IG5vbi1lbXB0eSBpZiB0cnVlCisjIGludGVnZXIgY2Fubm90IGJlIHBhc3NlZCBpbiBkaXJlY3RseS4gSXQgaGFzIHRvIGJlIGNvbnZlcnRlZCB1c2luZyBfaW50X2VuY29kZS4KK2RlZmluZSBfaW50X2VxdWFsCiskKGZpbHRlciAkKHdvcmRzICQoMSkpLCQod29yZHMgJCgyKSkpCitlbmRlZgorCisjIGZpcnN0IGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBzZWNvbmQgYXJndW1lbnQKKyMgb3V0cHV0OiBub24tZW1wdHkgaWYgdHJ1ZQorIyBpbnRlZ2VyIGNhbm5vdCBiZSBwYXNzZWQgaW4gZGlyZWN0bHkuIEl0IGhhcyB0byBiZSBjb252ZXJ0ZWQgdXNpbmcgX2ludF9lbmNvZGUuCitkZWZpbmUgX2ludF9ncmVhdGVyLW9yLWVxdWFsCiskKGNhbGwgX2ludF9ncmVhdGVyLXRoYW4sJCgxKSwkKDIpKSQoY2FsbCBfaW50X2VxdWFsLCQoMSksJCgyKSkKK2VuZGVmCisKK2RlZmluZSBpbnRfcGx1cworJCh3b3JkcyAkKGNhbGwgX2ludF9lbmNvZGUsJCgxKSkgJChjYWxsIF9pbnRfZW5jb2RlLCQoMikpKQorZW5kZWYKKworZGVmaW5lIGludF9zdWJ0cmFjdAorJChpZiAkKGNhbGwgX2ludF9ncmVhdGVyLW9yLWVxdWFsLCQoY2FsbCBfaW50X2VuY29kZSwkKDEpKSwkKGNhbGwgX2ludF9lbmNvZGUsJCgyKSkpLFwKKyAgJCh3b3JkcyAkKGZpbHRlci1vdXQgeHgsJChqb2luICQoY2FsbCBfaW50X2VuY29kZSwkKDEpKSwkKGNhbGwgX2ludF9lbmNvZGUsJCgyKSkpKSksXAorICAgICQoY2FsbCBwcmV0dHktZXJyb3IsJCgxKSBzdWJ0cmFjdCB1bmRlcmZsb3cgJCgyKSkpCitlbmRlZgorCitkZWZpbmUgaW50X211bHRpcGx5CiskKHdvcmRzICQoZm9yZWFjaCBhLCQoY2FsbCBfaW50X2VuY29kZSwkKDEpKSwkKGNhbGwgX2ludF9lbmNvZGUsJCgyKSkpKQorZW5kZWYKKworZGVmaW5lIGludF9kaXZpZGUKKyQoaWYgJChmaWx0ZXIgMCwkKDIpKSwkKGNhbGwgcHJldHR5LWVycm9yLGRpdmlzaW9uIGJ5IHplcm8gaXMgbm90IGFsbG93ZWQhKSwkKHN0cmlwIFwKKyAgJChpZiAkKGNhbGwgX2ludF9ncmVhdGVyLW9yLWVxdWFsLCQoY2FsbCBfaW50X2VuY29kZSwkKDEpKSwkKGNhbGwgX2ludF9lbmNvZGUsJCgyKSkpLCBcCisgICAgJChjYWxsIGludF9wbHVzLCQoY2FsbCBpbnRfZGl2aWRlLCQoY2FsbCBpbnRfc3VidHJhY3QsJCgxKSwkKDIpKSwkKDIpKSwxKSwwKSkpCitlbmRlZgpkaWZmIC0tZ2l0IGEvY29yZS9uYXRpdmVfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sIGIvY29yZS9uYXRpdmVfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjA1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL25hdGl2ZV90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVGhpcyB0ZXN0IGNvbmZpZyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAtLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIHtNT0RVTEV9LiI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ie01PRFVMRX0tPi9kYXRhL2xvY2FsL3RtcC97TU9EVUxFfSIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0ie01PRFVMRX0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvY29yZS9ub19qYXZhX3BhdGgvamFyIGIvY29yZS9ub19qYXZhX3BhdGgvamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA4NTg2Mzk3Li4wMDAwMDAwCi0tLSBhL2NvcmUvbm9famF2YV9wYXRoL2phcgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWphdmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL25vX2phdmFfcGF0aC9qYXJzaWduZXIgYi9jb3JlL25vX2phdmFfcGF0aC9qYXJzaWduZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDg1ODYzOTcuLjAwMDAwMDAKLS0tIGEvY29yZS9ub19qYXZhX3BhdGgvamFyc2lnbmVyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamF2YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvbm9famF2YV9wYXRoL2phdmEgYi9jb3JlL25vX2phdmFfcGF0aC9qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzQyMmYzLi4wMDAwMDAwCi0tLSBhL2NvcmUvbm9famF2YV9wYXRoL2phdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLWVjaG8gIkVycm9yOiBKQVZBX05PVF9SRVFVSVJFRD10cnVlLCAkKGJhc2VuYW1lICQwKSBpcyB1bmF2YWlsYWJsZS4iIDE+JjIKLWV4aXQgMQpkaWZmIC0tZ2l0IGEvY29yZS9ub19qYXZhX3BhdGgvamF2YWMgYi9jb3JlL25vX2phdmFfcGF0aC9qYXZhYwpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggODU4NjM5Ny4uMDAwMDAwMAotLS0gYS9jb3JlL25vX2phdmFfcGF0aC9qYXZhYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWphdmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL25vX2phdmFfcGF0aC9rZXl0b29sIGIvY29yZS9ub19qYXZhX3BhdGgva2V5dG9vbApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggODU4NjM5Ny4uMDAwMDAwMAotLS0gYS9jb3JlL25vX2phdmFfcGF0aC9rZXl0b29sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamF2YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvbm90aWNlX2ZpbGVzLm1rIGIvY29yZS9ub3RpY2VfZmlsZXMubWsKaW5kZXggZjg1MGZmZi4uMzgzZDczYyAxMDA2NDQKLS0tIGEvY29yZS9ub3RpY2VfZmlsZXMubWsKKysrIGIvY29yZS9ub3RpY2VfZmlsZXMubWsKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICMgamF2YWxpYi5qYXIgaXMgdGhlIGRlZmF1bHQgbmFtZSBmb3IgdGhlIGJ1aWxkIG1vZHVsZSAoYW5kIGlzbid0IG1lYW5pbmdmdWwpCiAgICAgICAjIElmIHRoYXQncyB3aGF0IHdlIGhhdmUsIHN1YnN0aXR1dGUgdGhlIG1vZHVsZSBuYW1lIGluc3RlYWQuICBUaGVzZSBmaWxlcwogICAgICAgIyBhcmVuJ3QgaW5jbHVkZWQgb24gdGhlIGRldmljZSwgc28gdGhpcyBuYW1lIGlzIHN5bnRoZXRpYyBhbnl3YXkuCi0gICAgICBpZm5lcSAoJChmaWx0ZXIgamF2YWxpYi5qYXIgY2xhc3Nlcy5qYWNrLCQobW9kdWxlX2xlYWYpKSwpCisgICAgICBpZm5lcSAoJChmaWx0ZXIgamF2YWxpYi5qYXIsJChtb2R1bGVfbGVhZikpLCkKICAgICAgICAgbW9kdWxlX2xlYWYgOj0gJChMT0NBTF9NT0RVTEUpLmphcgogICAgICAgZW5kaWYKICAgICAgIG1vZHVsZV9pbnN0YWxsZWRfZmlsZW5hbWUgOj0gXApkaWZmIC0tZ2l0IGEvY29yZS9wYWNrYWdlX2ludGVybmFsLm1rIGIvY29yZS9wYWNrYWdlX2ludGVybmFsLm1rCmluZGV4IDVjNGFkMjguLmUyNWZkOTkgMTAwNjQ0Ci0tLSBhL2NvcmUvcGFja2FnZV9pbnRlcm5hbC5taworKysgYi9jb3JlL3BhY2thZ2VfaW50ZXJuYWwubWsKQEAgLTYwLDEwICs2MCw2IEBACiBpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBsb2NhbC1pbnRlcm1lZGlhdGVzLWRpcikKIGludGVybWVkaWF0ZXMuQ09NTU9OIDo9ICQoY2FsbCBsb2NhbC1pbnRlcm1lZGlhdGVzLWRpcixDT01NT04pCiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY29uZmlndXJlX2xvY2FsX2phY2subWsKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCiAjIFBhY2thZ2UgTE9DQUxfTU9EVUxFX1RBR1MgZGVmYXVsdCB0byBvcHRpb25hbAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gJChzdHJpcCAkKExPQ0FMX01PRFVMRV9UQUdTKSkKIGlmZXEgKCQoTE9DQUxfTU9EVUxFX1RBR1MpLCkKQEAgLTExNSw2ICsxMTEsOCBAQAogICAgICAgICBlbmZvcmNlX3Jyb19lbmFibGVkIDo9CiAgICAgICBlbHNlIGlmZXEgKHRydWUsJChMT0NBTF9PRE1fTU9EVUxFKSkKICAgICAgICAgZW5mb3JjZV9ycm9fZW5hYmxlZCA6PQorICAgICAgZWxzZSBpZmVxICh0cnVlLCQoTE9DQUxfUFJPRFVDVF9NT0RVTEUpKQorICAgICAgICBlbmZvcmNlX3Jyb19lbmFibGVkIDo9CiAgICAgICBlbmRpZgogICAgIGVsc2UgaWZlcSAoJChmaWx0ZXIgJChUQVJHRVRfT1VUKS8lLCQoTE9DQUxfTU9EVUxFX1BBVEgpKSwpCiAgICAgICBlbmZvcmNlX3Jyb19lbmFibGVkIDo9CkBAIC0xNTAsNiArMTQ4LDEwIEBACiBuZWVkX2NvbXBpbGVfYXNzZXQgOj0gdHJ1ZQogZW5kaWYKIAoraWZkZWYgTE9DQUxfQUFQVDJfT05MWQorTE9DQUxfVVNFX0FBUFQyIDo9IHRydWUKK2VuZGlmCisKIG15X3Jlc19wYWNrYWdlIDo9CiBpZmRlZiBMT0NBTF9VU0VfQUFQVDIKICMgSW4gYWFwdDIgdGhlIGxhc3QgdGFrZXMgcHJlY2VkZW5jZS4KQEAgLTI1OSwxMyArMjYxLDYgQEAKIGVuZGlmICMgIWN1c3RvbQogTE9DQUxfUFJPR1VBUkRfRkxBR1MgOj0gJChhZGRwcmVmaXggLWluY2x1ZGUgLCQocHJvZ3VhcmRfb3B0aW9uc19maWxlKSkgJChMT0NBTF9QUk9HVUFSRF9GTEFHUykKIAotaWZkZWYgTE9DQUxfSkFDS19FTkFCTEVECi1pZm5kZWYgTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUwotICAgIExPQ0FMX0pBQ0tfUFJPR1VBUkRfRkxBR1MgOj0gJChMT0NBTF9QUk9HVUFSRF9GTEFHUykKLWVuZGlmCi1MT0NBTF9KQUNLX1BST0dVQVJEX0ZMQUdTIDo9ICQoYWRkcHJlZml4IC1pbmNsdWRlICwkKHByb2d1YXJkX29wdGlvbnNfZmlsZSkpICQoTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUykKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECi0KIGlmZXEgKHRydWUsJChFTU1BX0lOU1RSVU1FTlQpKQogaWZuZGVmIExPQ0FMX0VNTUFfSU5TVFJVTUVOVAogIyBObyBqYWNvY28gZm9yIHRlc3QgYXBrcy4KQEAgLTI4Miw2ICsyNzcsOCBAQAogaWZuZXEgKCQoTE9DQUxfU1JDX0ZJTEVTKSQoTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTKSQoTE9DQUxfU09VUkNFX0ZJTEVTX0FMTF9HRU5FUkFURUQpLCkKICMgT25seSBhZGQgamFjb2NvYWdlbnQgaWYgdGhlIHBhY2thZ2UgY29udGFpbnMgc29tZSBqYXZhIGNvZGUKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyArPSBqYWNvY29hZ2VudAorIyBFeGNsdWRlIGphY29jbyBjbGFzc2VzIGZyb20gcHJvZ3VhcmQKK0xPQ0FMX1BST0dVQVJEX0ZMQUdTICs9IC1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9wcm9ndWFyZC5qYWNvY28uZmxhZ3MKIGVuZGlmICMgQ29udGFpbnMgamF2YSBjb2RlCiBlbHNlCiBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgpAQCAtMjkyLDIwICsyODksOCBAQAogTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9IGphY29jb2FnZW50CiAjIEV4Y2x1ZGUgamFjb2NvIGNsYXNzZXMgZnJvbSBwcm9ndWFyZAogTE9DQUxfUFJPR1VBUkRfRkxBR1MgKz0gLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Byb2d1YXJkLmphY29jby5mbGFncwotTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUyArPSAtaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvcHJvZ3VhcmQuamFjb2NvLmZsYWdzCiBlbmRpZiAjIENvbnRhaW5zIGphdmEgY29kZQotZWxzZSAgIyAhIFRBUkdFVF9CVUlMRF9BUFBTCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLSMgSWYgYnVpbGQgYWdhaW5zdCB0aGUgU0RLIGluIGZ1bGwgYnVpbGQsIGNvcmUuamFyIGlzIG5vdCB1c2VkCi0jIHNvIGNvdmVyYWdlIGNsYXNzZXMgYXJlIG5vdCBwcmVzZW50LgotIyBKYWNrIG5lZWRzIGphY29jbyBvbiB0aGUgY2xhc3NwYXRoIGJ1dCB3ZSBkbyBub3Qgd2FudCBpdCB0byBiZSBpbgotIyB0aGUgZmluYWwgYXBrLiBXaGlsZSBpdCBpcyBhIHN0YXRpYyBsaWJyYXJ5LCB3ZSBhZGQgaXQgdG8gdGhlCi0jIExPQ0FMX0pBVkFfTElCUkFSSUVTIHdoaWNoIGFyZSBvbmx5IHByZXNlbnQgb24gdGhlIGNsYXNzcGF0aC4KLSMgTm90ZTogd2UgaGF2ZSBub3RoaW5nIHRvIGRvIGZvciBwcm9ndWFyZCBzaW5jZSBqYWNvY28gd2lsbCBiZQotIyBvbiB0aGUgY2xhc3NwYXRoIG9ubHksIHRodXMgbm90IG1vZGlmaWVkIGR1cmluZyB0aGUgY29tcGlsYXRpb24uCi1MT0NBTF9KQVZBX0xJQlJBUklFUyArPSBqYWNvY29hZ2VudAotZW5kaWYgIyAhIExPQ0FMX0pBQ0tfRU5BQkxFRAotZW5kaWYgIyAhIFRBUkdFVF9CVUlMRF9BUFBTCitlbmRpZiAjIFRBUkdFVF9CVUlMRF9BUFBTCiBlbmRpZiAjIExPQ0FMX1NES19WRVJTSU9OCiBlbmRpZiAjIEVNTUFfSU5TVFJVTUVOVF9TVEFUSUMKIGVuZGlmICMgTE9DQUxfRU1NQV9JTlNUUlVNRU5UCkBAIC0zMTYsNyArMzAxLDYgQEAKIGRhdGFfYmluZGluZ19pbnRlcm1lZGlhdGVzIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2RhdGEtYmluZGluZwogCiBMT0NBTF9KQVZBQ0ZMQUdTICs9IC1wcm9jZXNzb3JwYXRoICQoREFUQV9CSU5ESU5HX0NPTVBJTEVSKSAtcyAkKGRhdGFfYmluZGluZ19pbnRlcm1lZGlhdGVzKS9hbm5vLXNyYwotTE9DQUxfSkFDS19GTEFHUyArPSAtLXByb2Nlc3NvcnBhdGggJChEQVRBX0JJTkRJTkdfQ09NUElMRVIpCiAKIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyArPSBkYXRhYmluZGluZy1iYXNlbGlicmFyeQogTE9DQUxfU1RBVElDX0pBVkFfQUFSX0xJQlJBUklFUyArPSBkYXRhYmluZGluZy1saWJyYXJ5IGRhdGFiaW5kaW5nLWFkYXB0ZXJzCkBAIC0zMzAsNiArMzE0LDkgQEAKIExPQ0FMX0FBUFRfRkxBR1MgKz0gLS1hdXRvLWFkZC1vdmVybGF5IC0tZXh0cmEtcGFja2FnZXMgY29tLmFuZHJvaWQuZGF0YWJpbmRpbmcubGlicmFyeQogZW5kaWYgICMgTE9DQUxfREFUQV9CSU5ESU5HCiAKKyMgUHJvY2VzcyBTdXBwb3J0IExpYnJhcnkgZGVwZW5kZW5jaWVzLgoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvc3VwcG9ydF9saWJyYXJpZXMubWsKKwogIyBJZiB0aGUgbW9kdWxlIGlzIGEgY29tcHJlc3NlZCBtb2R1bGUsIHdlIGRvbid0IHByZS1vcHQgaXQgYmVjYXVzZSBpdHMgZmluYWwKICMgaW5zdGFsbGF0aW9uIGxvY2F0aW9uIHdpbGwgYmUgdGhlIGRhdGEgcGFydGl0aW9uLgogaWZkZWYgTE9DQUxfQ09NUFJFU1NFRF9NT0RVTEUKQEAgLTM3NSwxMSArMzYyLDE0IEBACiAJJChoaWRlKSB0b3VjaCAkQAogCiAjIE1ha2Ugc3VyZSB0aGUgZGF0YS1iaW5kaW5nIHByb2Nlc3MgaGFwcGVucyBiZWZvcmUgamF2YWMgYW5kIGdlbmVyYXRpb24gb2YgUi5qYXZhLgotJChSX2ZpbGVfc3RhbXApICQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikgOiAkKGRhdGFfYmluZGluZ19zdGFtcCkKLSMgVGhlIGRlcGVuZGVuY3kgcGF0aCB3aGVuIGphY2sgaXMgZW5hYmxlZAotJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKSA6ICQoZGF0YV9iaW5kaW5nX3N0YW1wKQorJChSX2ZpbGVfc3RhbXApOiAkKGRhdGFfYmluZGluZ19zdGFtcCkKKyQoamF2YV9zb3VyY2VfbGlzdF9maWxlKTogJChkYXRhX2JpbmRpbmdfc3RhbXApCiskKGZvcmVhY2ggeCwkKHNoYXJkZWRfamF2YV9zb3VyY2VfbGlzdF9maWxlcyksJChldmFsICQoeCk6ICQoZGF0YV9iaW5kaW5nX3N0YW1wKSkpCiskKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiAkKGRhdGFfYmluZGluZ19zdGFtcCkKIGVuZGlmICAjIExPQ0FMX0RBVEFfQklORElORwogCityZXNvdXJjZV9leHBvcnRfcGFja2FnZSA6PQorCiBpZmVxICgkKG5lZWRfY29tcGlsZV9yZXMpLHRydWUpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTQwMCwxNSArMzkwLDE1IEBACiBlbmRpZgogCiBpZmRlZiBMT0NBTF9VU0VfQUFQVDIKLW15X2NvbXBpbGVkX3Jlc19iYXNlX2RpciA6PSAkKGludGVybWVkaWF0ZXMpL2ZsYXQtcmVzCitteV9jb21waWxlZF9yZXNfYmFzZV9kaXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZmxhdC1yZXMKIHJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDo9CiBpZm5lcSAoLCQoTE9DQUxfUkVOREVSU0NSSVBUX1RBUkdFVF9BUEkpKQogcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgOj0gJChMT0NBTF9SRU5ERVJTQ1JJUFRfVEFSR0VUX0FQSSkKIGVsc2UKIGlmbmVxICgsJChMT0NBTF9TREtfVkVSU0lPTikpCiAjIFNldCB0YXJnZXQtYXBpIGZvciBMT0NBTF9TREtfVkVSU0lPTnMgb3RoZXIgdGhhbiBjdXJyZW50LgotaWZuZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsICQoTE9DQUxfU0RLX1ZFUlNJT04pKSkKLXJlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDo9ICQoTE9DQUxfU0RLX1ZFUlNJT04pCitpZm5lcSAoLCQoZmlsdGVyLW91dCBjdXJyZW50IHN5c3RlbV9jdXJyZW50IHRlc3RfY3VycmVudCBjb3JlX2N1cnJlbnQsICQoTE9DQUxfU0RLX1ZFUlNJT04pKSkKK3JlbmRlcnNjcmlwdF90YXJnZXRfYXBpIDo9ICQoY2FsbCBnZXQtbnVtZXJpYy1zZGstdmVyc2lvbiwkKExPQ0FMX1NES19WRVJTSU9OKSkKIGVuZGlmCiBlbmRpZiAgIyBMT0NBTF9TREtfVkVSU0lPTiBpcyBzZXQKIGVuZGlmICAjIExPQ0FMX1JFTkRFUlNDUklQVF9UQVJHRVRfQVBJIGlzIHNldApAQCAtNDIwLDggKzQxMCwxMyBAQAogZW5kaWYgICMgcmVuZGVyc2NyaXB0X3RhcmdldF9hcGkgaXMgc2V0CiBteV9hc3NldF9kaXJzIDo9ICQoTE9DQUxfQVNTRVRfRElSKQogbXlfZnVsbF9hc3NldF9wYXRocyA6PSAkKGFsbF9hc3NldHMpCisKICMgQWRkIEFBUFQyIGxpbmsgc3BlY2lmaWMgZmxhZ3MuCi0kKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BQVBUX0ZMQUdTIDo9ICQoTE9DQUxfQUFQVF9GTEFHUykgLS1uby1zdGF0aWMtbGliLXBhY2thZ2VzCiskKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BQVBUX0ZMQUdTIDo9ICQoTE9DQUxfQUFQVF9GTEFHUykKK2lmbmRlZiBMT0NBTF9BQVBUX05BTUVTUEFDRVMKKyAgJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfQUFQVF9GTEFHUyArPSAtLW5vLXN0YXRpYy1saWItcGFja2FnZXMKK2VuZGlmCisKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2FhcHQyLm1rCiBlbHNlICAjIExPQ0FMX1VTRV9BQVBUMgogCkBAIC00MzcsMTUgKzQzMiwxNSBAQAogJChSX2ZpbGVfc3RhbXApOiBQUklWQVRFX1JFU09VUkNFX1BVQkxJQ1NfT1VUUFVUIDo9IFwKIAkJCSQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3B1YmxpY19yZXNvdXJjZXMueG1sCiAkKFJfZmlsZV9zdGFtcCk6IFBSSVZBVEVfUFJPR1VBUkRfT1BUSU9OU19GSUxFIDo9ICQocHJvZ3VhcmRfb3B0aW9uc19maWxlKQorJChSX2ZpbGVfc3RhbXApOiBQUklWQVRFX1JFU09VUkNFX0xJU1QgOj0gJChhbGxfcmVzX2Fzc2V0cykKICQoUl9maWxlX3N0YW1wKTogJChhbGxfcmVzX2Fzc2V0cykgJChmdWxsX2FuZHJvaWRfbWFuaWZlc3QpICQoUmVuZGVyU2NyaXB0X2ZpbGVfc3RhbXApICQoQUFQVCkgfCAkKEFDUCkKIAlAZWNobyAidGFyZ2V0IFIuamF2YS9NYW5pZmVzdC5qYXZhOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgogCUBybSAtcmYgJEAgJiYgbWtkaXIgLXAgJChkaXIgJEApCiAJJChjcmVhdGUtcmVzb3VyY2UtamF2YS1maWxlcykKLQkkKGNhbGwgZmluZC1nZW5lcmF0ZWQtUi5qYXZhKQorCSQoY2FsbCBmaW5kLWdlbmVyYXRlZC1SLmphdmEsJEApCiAKICQocHJvZ3VhcmRfb3B0aW9uc19maWxlKTogJChSX2ZpbGVfc3RhbXApCiAKLXJlc291cmNlX2V4cG9ydF9wYWNrYWdlIDo9CiBpZmRlZiBMT0NBTF9FWFBPUlRfUEFDS0FHRV9SRVNPVVJDRVMKICMgUHV0IHRoaXMgbW9kdWxlJ3MgcmVzb3VyY2VzIGludG8gYSBQUk9EVUNULWFnbm9zaXRjIHBhY2thZ2UgdGhhdAogIyBvdGhlciBwYWNrYWdlcyBjYW4gdXNlIHRvIGJ1aWxkIHRoZWlyIG93biBQUk9EVUNULWFnbm9zdGljIFIuamF2YSAoZXRjLikKQEAgLTQ1Nyw2ICs0NTIsNyBAQAogIyBjYW4ndCBrbm93IGFueXRoaW5nIGFib3V0IFBST0RVQ1QuICBDbGVhciBpdCBvdXQganVzdCBmb3IgdGhpcyB0YXJnZXQuCiAkKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfQ09ORklHIDo9CiAkKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfUFJFRl9DT05GSUcgOj0KKyQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpOiBQUklWQVRFX1JFU09VUkNFX0xJU1QgOj0gJChhbGxfcmVzX2Fzc2V0cykKICQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpOiAkKGFsbF9yZXNfYXNzZXRzKSAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCkgJChSZW5kZXJTY3JpcHRfZmlsZV9zdGFtcCkgJChBQVBUKQogCUBlY2hvICJ0YXJnZXQgRXhwb3J0IFJlc291cmNlczogJChQUklWQVRFX01PRFVMRSkgKCRAKSIKIAkkKGNyZWF0ZS1lbXB0eS1wYWNrYWdlKQpAQCAtNDY5LDM4ICs0NjUsMjMgQEAKICMgdGhleSB3YW50IHRvIHVzZSB0aGlzIG1vZHVsZSdzIFIuamF2YSBmaWxlLgogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKFJfZmlsZV9zdGFtcCkKIAotaWZkZWYgTE9DQUxfSkFDS19FTkFCTEVECi1pZm5lcSAoJChidWlsdF9kZXhfaW50ZXJtZWRpYXRlKSwpCi0kKGJ1aWx0X2RleF9pbnRlcm1lZGlhdGUpOiAkKFJfZmlsZV9zdGFtcCkKLWVuZGlmCi1pZm5lcSAoJChub3Nocm9iX2NsYXNzZXNfamFjayksKQotJChub3Nocm9iX2NsYXNzZXNfamFjayk6ICQoUl9maWxlX3N0YW1wKQotZW5kaWYKLWlmbmVxICgkKGZ1bGxfY2xhc3Nlc19qYWNrKSwpCi0kKGZ1bGxfY2xhc3Nlc19qYWNrKTogJChSX2ZpbGVfc3RhbXApCi0kKGphY2tfY2hlY2tfdGltZXN0YW1wKTogJChSX2ZpbGVfc3RhbXApCi1lbmRpZgotZW5kaWYgIyBMT0NBTF9KQUNLX0VOQUJMRUQKLQotaWZuZXEgKCQoZnVsbF9jbGFzc2VzX2phciksKQotIyBJZiBmdWxsX2NsYXNzZXNfamFyIGlzIG5vbi1lbXB0eSwgd2UncmUgYnVpbGRpbmcgc291cmNlcy4KLSMgSWYgd2UncmUgYnVpbGRpbmcgc291cmNlcywgdGhlIGluaXRpYWwgamF2YWMgc3RlcCAod2hpY2gKLSMgcHJvZHVjZXMgZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcikgbmVlZHMgdG8gZW5zdXJlIHRoZQotIyBSLmphdmEgYW5kIE1hbmlmZXN0LmphdmEgZmlsZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZCBmaXJzdC4KLSQoZnVsbF9jbGFzc2VzX2NvbXBpbGVkX2phcik6ICQoUl9maWxlX3N0YW1wKQotZW5kaWYKKyMgVGhlIFIuamF2YSBmaWxlIG11c3QgZXhpc3QgYnkgdGhlIHRpbWUgdGhlIGphdmEgc291cmNlCisjIGxpc3QgaXMgZ2VuZXJhdGVkCiskKGphdmFfc291cmNlX2xpc3RfZmlsZSk6ICQoUl9maWxlX3N0YW1wKQorJChmb3JlYWNoIHgsJChzaGFyZGVkX2phdmFfc291cmNlX2xpc3RfZmlsZXMpLCQoZXZhbCAkKHgpOiAkKFJfZmlsZV9zdGFtcCkpKQogCiBlbmRpZiAgIyBuZWVkX2NvbXBpbGVfcmVzCiAKLWlmZXEgKCQoTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTKSx0cnVlKQotIyBXZSBuZWVkIHRvIGV4cGxpY2l0bHkgY2xlYXIgdGhpcyB2YXIgc28gdGhhdCB3ZSBkb24ndAotIyBpbmhlcml0IHRoZSB2YWx1ZSBmcm9tIHdob21ldmVyIGNhdXNlZCB1cyB0byBiZSBidWlsdC4KLSQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0FBUFRfSU5DTFVERVMgOj0KLWVsc2UKK2ZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnQgOj0KK2ZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnRfZGVwcyA6PQorCitpZm5lcSAoJChMT0NBTF9OT19TVEFOREFSRF9MSUJSQVJJRVMpLHRydWUpCiAjIE1vc3QgcGFja2FnZXMgc2hvdWxkIGxpbmsgYWdhaW5zdCB0aGUgcmVzb3VyY2VzIGRlZmluZWQgYnkgZnJhbWV3b3JrLXJlcy4KICMgRXZlbiBpZiB0aGV5IGRvbid0IGhhdmUgdGhlaXIgb3duIHJlc291cmNlcywgdGhleSBtYXkgdXNlIGZyYW1ld29yawogIyByZXNvdXJjZXMuCi1pZm5lcSAoJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCQoTE9DQUxfU0RLX1JFU19WRVJTSU9OKSkkKGlmICQoVEFSR0VUX0JVSUxEX0FQUFMpLCQoZmlsdGVyIGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCQoTE9DQUxfU0RLX1JFU19WRVJTSU9OKSkpLCkKK2lmZXEgKCQoTE9DQUxfU0RLX1JFU19WRVJTSU9OKSxjb3JlX2N1cnJlbnQpCisjIGNvcmVfY3VycmVudCBkb2Vzbid0IGNvbnRhaW4gYW55IGZyYW1ld29yayByZXNvdXJjZXMuCitlbHNlIGlmbmVxICgkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pKSQoaWYgJChUQVJHRVRfQlVJTERfQVBQUyksJChmaWx0ZXIgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQsJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pKSksKQogIyBmb3IgcmVsZWFzZWQgc2RrIHZlcnNpb25zLCB0aGUgcGxhdGZvcm0gcmVzb3VyY2VzIHdlcmUgYnVpbHQgaW50byBhbmRyb2lkLmphci4KIGZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnQgOj0gXAogICAgICQoSElTVE9SSUNBTF9TREtfVkVSU0lPTlNfUk9PVCkvJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pL2FuZHJvaWQuamFyCkBAIC01MTQsNiArNDk1LDggQEAKIGZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnRfZGVwcyA6PSBcCiAgICAgJChkaXIgJChmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0KSlzcmMvUi5zdGFtcAogZW5kaWYgIyBMT0NBTF9TREtfUkVTX1ZFUlNJT04KK2VuZGlmICMgTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTCisKIGFsbF9saWJyYXJ5X3Jlc19wYWNrYWdlX2V4cG9ydHMgOj0gXAogICAgICQoZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydCkgXAogICAgICQoZm9yZWFjaCBsaWIsJChMT0NBTF9SRVNfTElCUkFSSUVTKSxcCkBAIC01MzAsNyArNTEzLDYgQEAKIGlmZGVmIExPQ0FMX1VTRV9BQVBUMgogJChteV9yZXNfcGFja2FnZSkgOiAkKGFsbF9saWJyYXJ5X3Jlc19wYWNrYWdlX2V4cG9ydF9kZXBzKQogZW5kaWYKLWVuZGlmICMgTE9DQUxfTk9fU1RBTkRBUkRfTElCUkFSSUVTCiAKIGlmbmVxICgkKGZ1bGxfY2xhc3Nlc19qYXIpLCkKICQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9ERVhfRklMRSA6PSAkKGJ1aWx0X2RleCkKQEAgLTU5OCwxNCArNTgwLDE5IEBACiAgICAgJChteV9yZXNfcGFja2FnZSkgJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1BST0RVQ1RfQUFQVF9QUkVGX0NPTkZJRyA6PSAkKFBST0RVQ1RfQUFQVF9QUkVGX0NPTkZJRykKIGVuZGlmCiBlbmRpZgorCiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfRE9OVF9ERUxFVEVfSkFSX0RJUlMgOj0gJChMT0NBTF9ET05UX0RFTEVURV9KQVJfRElSUykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9SRVNPVVJDRV9JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9yZXNvdXJjZXMKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9GVUxMX0NMQVNTRVNfSkFSIDo9ICQoZnVsbF9jbGFzc2VzX2phcikKICQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQoam5pX3NoYXJlZF9saWJyYXJpZXMpCiskKExPQ0FMX0JVSUxUX01PRFVMRSkgOiAkKEpBUl9BUkdTKQogaWZkZWYgTE9DQUxfVVNFX0FBUFQyCiAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfUkVTX1BBQ0tBR0UgOj0gJChteV9yZXNfcGFja2FnZSkKICQoTE9DQUxfQlVJTFRfTU9EVUxFKSA6ICQobXlfcmVzX3BhY2thZ2UpICQoQUFQVDIpIHwgJChBQ1ApCiBlbHNlCi0kKExPQ0FMX0JVSUxUX01PRFVMRSkgOiAkKGFsbF9yZXNfYXNzZXRzKSAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCkgJChBQVBUKQotZW5kaWYKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9SRVNPVVJDRV9MSVNUIDo9ICQoYWxsX3Jlc19hc3NldHMpCiskKExPQ0FMX0JVSUxUX01PRFVMRSkgOiAkKGFsbF9yZXNfYXNzZXRzKSAkKGZ1bGxfYW5kcm9pZF9tYW5pZmVzdCkgJChBQVBUKSAkKFpJUEFMSUdOKQorZW5kaWYgICMgTE9DQUxfVVNFX0FBUFQyCiBpZmRlZiBMT0NBTF9DT01QUkVTU0VEX01PRFVMRQogJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChNSU5JR1pJUCkKIGVuZGlmCkBAIC02MTMsMTMgKzYwMCw5IEBACiBpZmRlZiBMT0NBTF9VU0VfQUFQVDIKIAkkKGNhbGwgY29weS1maWxlLXRvLW5ldy10YXJnZXQpCiBlbHNlICAjICEgTE9DQUxfVVNFX0FBUFQyCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLQkkKGNyZWF0ZS1lbXB0eS1wYWNrYWdlKQotZWxzZQogCSQoaWYgJChQUklWQVRFX1NPVVJDRV9BUkNISVZFKSxcCiAJICAkKGNhbGwgaW5pdGlhbGl6ZS1wYWNrYWdlLWZpbGUsJChQUklWQVRFX1NPVVJDRV9BUkNISVZFKSwkQCksXAogCSAgJChjcmVhdGUtZW1wdHktcGFja2FnZSkpCi1lbmRpZgogCSQoYWRkLWFzc2V0cy10by1wYWNrYWdlKQogZW5kaWYgICMgTE9DQUxfVVNFX0FBUFQyCiBpZm5lcSAoJChqbmlfc2hhcmVkX2xpYnJhcmllcyksKQpAQCAtNjMwLDkgKzYxMywxMyBAQAogCSQoaWYgJChQUklWQVRFX0VYVFJBX0pBUl9BUkdTKSwkKGNhbGwgYWRkLWphdmEtcmVzb3VyY2VzLXRvLCRAKSkKIGVsc2UgICMgZnVsbF9jbGFzc2VzX2phcgogCSQoYWRkLWRleC10by1wYWNrYWdlKQoraWZkZWYgTE9DQUxfVVNFX0FBUFQyCisJJChjYWxsIGFkZC1qYXItcmVzb3VyY2VzLXRvLXBhY2thZ2UsJEAsJChQUklWQVRFX0ZVTExfQ0xBU1NFU19KQVIpLCQoUFJJVkFURV9SRVNPVVJDRV9JTlRFUk1FRElBVEVTX0RJUikpCitlbmRpZgogZW5kaWYgICMgZnVsbF9jbGFzc2VzX2phcgotaWZkZWYgTE9DQUxfSkFDS19FTkFCTEVECi0JJChhZGQtY2FycmllZC1qYWNrLXJlc291cmNlcykKK2lmZXEgKHRydWUsICQoTE9DQUxfVU5DT01QUkVTU19ERVgpKQorCUAjIE5vIG5lZWQgdG8gYWxpZ24sIHNpZ24tcGFja2FnZSBiZWxvdyB3aWxsIGRvIGl0LgorCSQodW5jb21wcmVzcy1kZXhzKQogZW5kaWYKIGlmZGVmIExPQ0FMX0RFWF9QUkVPUFQKIGlmbmVxICgkKEJVSUxEX1BMQVRGT1JNX1pJUCksKQpAQCAtNjQyLDcgKzYyOSw3IEBACiBpZm5lcSAobm9zdHJpcHBpbmcsJChMT0NBTF9ERVhfUFJFT1BUKSkKIAkkKGNhbGwgZGV4cHJlb3B0LXJlbW92ZS1jbGFzc2VzLmRleCwkQCkKIGVuZGlmCi1lbmRpZgorZW5kaWYgICMgTE9DQUxfREVYX1BSRU9QVAogCSQoc2lnbi1wYWNrYWdlKQogaWZkZWYgTE9DQUxfQ09NUFJFU1NFRF9NT0RVTEUKIAkkKGNvbXByZXNzLXBhY2thZ2UpCkBAIC02NjYsNiArNjUzLDEwIEBACiAkKGJ1aWx0X29kZXgpIDogJChkaXIgJChMT0NBTF9CVUlMVF9NT0RVTEUpKSUgOiAkKGJ1aWx0X2RleCkKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKSAmJiBybSAtZiAkQAogCSQoYWRkLWRleC10by1wYWNrYWdlKQoraWZlcSAodHJ1ZSwgJChMT0NBTF9VTkNPTVBSRVNTX0RFWCkpCisJJCh1bmNvbXByZXNzLWRleHMpCisJJChhbGlnbi1wYWNrYWdlKQorZW5kaWYKIAkkKGhpZGUpIG12ICRAICRALmlucHV0CiAJJChjYWxsIGRleHByZW9wdC1vbmUtZmlsZSwkQC5pbnB1dCwkQCkKIAkkKGhpZGUpIHJtICRALmlucHV0CmRpZmYgLS1naXQgYS9jb3JlL3Bka19jb25maWcubWsgYi9jb3JlL3Bka19jb25maWcubWsKaW5kZXggZTEyYmUyOS4uNTdhZmEzZiAxMDA2NDQKLS0tIGEvY29yZS9wZGtfY29uZmlnLm1rCisrKyBiL2NvcmUvcGRrX2NvbmZpZy5tawpAQCAtNywxMiArNywxNCBAQAogCWhvc3QvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9ob3N0dGVzdGxpYl9pbnRlcm1lZGlhdGVzCiBQREtfUExBVEZPUk1fSkFWQV9aSVBfQ09OVEVOVFMgOj0KIAotaWZuZXEgKCwkKGZpbHRlciBwbGF0Zm9ybS1qYXZhLCAkKE1BS0VDTURHT0FMUykpJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkpCitpZm5lcSAoLCQoZmlsdGVyIHBsYXRmb3JtLWphdmEsICQoTUFLRUNNREdPQUxTKSkkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpKQogIyBhZGRpdGlvbmFsIGl0ZW1zIHRvIGFkZCB0byBwbGF0Zm9ybS56aXAgZm9yIHBsYXRmb3JtLWphdmEgYnVpbGQKICMgRm9yIHRoZXNlIGRpcnMsIGFkZCBjbGFzc2VzLmphciBhbmQgamF2YWxpYi5qYXIgZnJvbSB0aGUgZGlyIHRvIHBsYXRmb3JtLnppcAogIyBhbGwgcGF0aHMgdW5kZXIgb3V0IGRpcgogUERLX1BMQVRGT1JNX0pBVkFfWklQX0pBVkFfVEFSR0VUX0xJQl9ESVIgKz0gXAogICB0YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9hbmRyb2lkLnRlc3QucnVubmVyX2ludGVybWVkaWF0ZXMgXAorICB0YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9hbmRyb2lkLmhpZGwuYmFzZS1WMS4wLWphdmFfaW50ZXJtZWRpYXRlcyBcCisgIHRhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2FuZHJvaWQuaGlkbC5tYW5hZ2VyLVYxLjAtamF2YV9pbnRlcm1lZGlhdGVzIFwKICAgdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvYW5kcm9pZC1jb21tb25faW50ZXJtZWRpYXRlcyBcCiAgIHRhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2FuZHJvaWQtZXgtY2FtZXJhMl9pbnRlcm1lZGlhdGVzIFwKICAgdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvYW5kcm9pZF9zdHVic19jdXJyZW50X2ludGVybWVkaWF0ZXMgXApAQCAtMjQsNiArMjYsNyBAQAogICB0YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9sZWdhY3ktYW5kcm9pZC10ZXN0X2ludGVybWVkaWF0ZXMgXAogICB0YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9leHRfaW50ZXJtZWRpYXRlcyBcCiAgIHRhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzIFwKKyAgdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvaHdiaW5kZXJfaW50ZXJtZWRpYXRlcyBcCiAgIHRhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ltcy1jb21tb25faW50ZXJtZWRpYXRlcyBcCiAgIHRhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL29raHR0cF9pbnRlcm1lZGlhdGVzIFwKICAgdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvdGVsZXBob255LWNvbW1vbl9pbnRlcm1lZGlhdGVzIFwKQEAgLTQwLDM5ICs0Myw2MCBAQAogCSQoUERLX1BMQVRGT1JNX0pBVkFfWklQX0pBVkFfSE9TVF9MSUJfRElSKQogCiBQREtfUExBVEZPUk1fSkFWQV9aSVBfQ09OVEVOVFMgKz0gJChmb3JlYWNoIGxpYl9kaXIsJChQREtfUExBVEZPUk1fSkFWQV9aSVBfSkFWQV9MSUJfRElSKSxcCi0gICAgJChsaWJfZGlyKS9jbGFzc2VzLmphY2sgJChsaWJfZGlyKS9jbGFzc2VzLmphciAkKGxpYl9kaXIpL2NsYXNzZXMuamFyLnRvYyBcCisgICAgJChsaWJfZGlyKS9jbGFzc2VzLmphciAkKGxpYl9kaXIpL2NsYXNzZXMtaGVhZGVyLmphciBcCiAgICAgJChsaWJfZGlyKS9qYXZhbGliLmphciAgJChsaWJfZGlyKS9jbGFzc2VzKi5kZXggXAogICAgICQobGliX2RpcikvY2xhc3Nlcy5kZXgudG9jICkKIAogIyBjaGVjayBhbmQgb3ZlcnJpZGUgamF2YSBzdXBwb3J0IGxldmVsCi1pZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApLCkKLWlmbmVxICgkKHdpbGRjYXJkIGV4dGVybmFsL3Byb2d1YXJkKSwpCi1UQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMIDo9IHNkawotZWxzZSAjIG5vIHByb2d1YXJkCi1UQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMIDo9Ci1lbmRpZgotIyBwbGF0Zm9ybSBzdXBwcm90IGlzIHNldCBhZnRlciBjaGVja2luZyBwbGF0Zm9ybS56aXAKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkkKFBES19GVVNJT05fUExBVEZPUk1fRElSKSwpCisgIGlmbmVxICgkKHdpbGRjYXJkIGV4dGVybmFsL3Byb2d1YXJkKSwpCisgICAgVEFSR0VUX0JVSUxEX0pBVkFfU1VQUE9SVF9MRVZFTCA6PSBzZGsKKyAgZWxzZSAjIG5vIHByb2d1YXJkCisgICAgVEFSR0VUX0JVSUxEX0pBVkFfU1VQUE9SVF9MRVZFTCA6PQorICBlbmRpZgorICAjIHBsYXRmb3JtIHN1cHBvcnQgaXMgc2V0IGFmdGVyIGNoZWNraW5nIHBsYXRmb3JtLnppcAogZW5kaWYgIyBQREsKIAoraWZuZXEgKCwkKFBES19GVVNJT05fUExBVEZPUk1fRElSKSQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApKQorCitfcGRrX2Z1c2lvbl9pbnRlcm1lZGlhdGVzIDo9CitfcGRrX2Z1c2lvbl9zdGFtcCA6PQorX3Bka19mdXNpb25fZmlsZV9saXN0IDo9CitfcGRrX2Z1c2lvbl9qYXZhX2ZpbGVfbGlzdCA6PQorUERLX0ZVU0lPTl9TWU1MSU5LX1NUQU1QIDo9CisKK2lmZGVmIFBES19GVVNJT05fUExBVEZPUk1fRElSCisgIF9wZGtfZnVzaW9uX2ludGVybWVkaWF0ZXMgOj0gJChQREtfRlVTSU9OX1BMQVRGT1JNX0RJUikKKyAgX3Bka19mdXNpb25fZmlsZV9saXN0IDo9ICQoc29ydCBcCisgICAgJChzaGVsbCBjZCAkKFBES19GVVNJT05fUExBVEZPUk1fRElSKTsgZmluZCAqIC10eXBlIGYpKQorICBfcGRrX2Z1c2lvbl9qYXZhX2ZpbGVfbGlzdCA6PSAkKGZpbHRlciB0YXJnZXQvY29tbW9uLyUsJChfcGRrX2Z1c2lvbl9maWxlX2xpc3QpKQorICBfcGRrX2Z1c2lvbl9maWxlX2xpc3QgOj0gJChmaWx0ZXItb3V0IHRhcmdldC9jb21tb24vJSwkKF9wZGtfZnVzaW9uX2ZpbGVfbGlzdCkpCisKKyAgUERLX0ZVU0lPTl9TWU1MSU5LX1NUQU1QIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsIFBBQ0tBR0lORywgcGRrX2Z1c2lvbikvcGRrX3N5bWxpbmtzLnN0YW1wCisKKyAgc3ltbGlua19saXN0IDo9ICQoc29ydCBcCisgICAgJChzaGVsbCBjZCAkKFBES19GVVNJT05fUExBVEZPUk1fRElSKTsgZmluZCAqIC10eXBlIGwpKQorJChQREtfRlVTSU9OX1NZTUxJTktfU1RBTVApOiBQUklWQVRFX1NZTUxJTktTIDo9ICQoZm9yZWFjaCBzLCQoc3ltbGlua19saXN0KSxcCisgICAgJChzKTokKHNoZWxsIHJlYWRsaW5rICQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpLyQocykpKQorJChQREtfRlVTSU9OX1NZTUxJTktfU1RBTVApOgorCSQoZm9yZWFjaCBzLCQoUFJJVkFURV9TWU1MSU5LUyksXAorCSAgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkvJChkaXIgJChjYWxsIHdvcmQtY29sb24sMSwkKHMpKSkgJiYgXAorCSAgbG4gLXNmICQoY2FsbCB3b3JkLWNvbG9uLDIsJChzKSkgJChQUk9EVUNUX09VVCkvJChjYWxsIHdvcmQtY29sb24sMSwkKHMpKSAmJikgdHJ1ZQorCXRvdWNoICRACisKKyAgc3ltbGlua19saXN0IDo9CitlbmRpZiAjIFBES19GVVNJT05fUExBVEZPUk1fRElSCisKIGlmZGVmIFBES19GVVNJT05fUExBVEZPUk1fWklQCi1fcGRrX2Z1c2lvbl9pbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsIFBBQ0tBR0lORywgcGRrX2Z1c2lvbikKLV9wZGtfZnVzaW9uX3N0YW1wIDo9ICQoX3Bka19mdXNpb25faW50ZXJtZWRpYXRlcykvcGRrX2Z1c2lvbi5zdGFtcAorICBfcGRrX2Z1c2lvbl9pbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsIFBBQ0tBR0lORywgcGRrX2Z1c2lvbikKKyAgX3Bka19mdXNpb25fc3RhbXAgOj0gJChfcGRrX2Z1c2lvbl9pbnRlcm1lZGlhdGVzKS9wZGtfZnVzaW9uLnN0YW1wCiAKLV9wZGtfZnVzaW9uX2ZpbGVfbGlzdCA6PSAkKHNoZWxsIHVuemlwIC1aIC0xICQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApIFwKLSAgICAnKlteL10nIC14ICd0YXJnZXQvY29tbW9uLyonIDI+L2Rldi9udWxsKQotX3Bka19mdXNpb25famF2YV9maWxlX2xpc3QgOj0gXAotCSQoc2hlbGwgdW56aXAgLVogLTEgJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkgJ3RhcmdldC9jb21tb24vKicgMj4vZGV2L251bGwpCi1fcGRrX2Z1c2lvbl9maWxlcyA6PSAkKGFkZHByZWZpeCAkKF9wZGtfZnVzaW9uX2ludGVybWVkaWF0ZXMpLyxcCi0gICAgJChfcGRrX2Z1c2lvbl9maWxlX2xpc3QpICQoX3Bka19mdXNpb25famF2YV9maWxlX2xpc3QpKQotCi1pZm5lcSAoJChfcGRrX2Z1c2lvbl9qYXZhX2ZpbGVfbGlzdCksKQotIyBUaGlzIHJlcHJlc2VudHMgd2hldGhlciBqYXZhIGJ1aWxkIGNhbiB1c2UgcGxhdGZvcm0gQVBJIG9yIG5vdAotIyBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBpbiBBbmRyb2lkLm1rCi1UQVJHRVRfQlVJTERfUERLX0pBVkFfUExBVEZPUk0gOj0gdHJ1ZQotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX0pBVkFfU1VQUE9SVF9MRVZFTCksKQotVEFSR0VUX0JVSUxEX0pBVkFfU1VQUE9SVF9MRVZFTCA6PSBwbGF0Zm9ybQotZW5kaWYKLWVuZGlmCisgIF9wZGtfZnVzaW9uX2ZpbGVfbGlzdCA6PSAkKHNoZWxsIHVuemlwIC1aIC0xICQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApIFwKKyAgICAgICcqW14vXScgLXggJ3RhcmdldC9jb21tb24vKicgMj4vZGV2L251bGwpCisgIF9wZGtfZnVzaW9uX2phdmFfZmlsZV9saXN0IDo9IFwKKyAgICAgICQoc2hlbGwgdW56aXAgLVogLTEgJChQREtfRlVTSU9OX1BMQVRGT1JNX1pJUCkgJ3RhcmdldC9jb21tb24vKicgMj4vZGV2L251bGwpCisgIF9wZGtfZnVzaW9uX2ZpbGVzIDo9ICQoYWRkcHJlZml4ICQoX3Bka19mdXNpb25faW50ZXJtZWRpYXRlcykvLFwKKyAgICAgICQoX3Bka19mdXNpb25fZmlsZV9saXN0KSAkKF9wZGtfZnVzaW9uX2phdmFfZmlsZV9saXN0KSkKIAogJChfcGRrX2Z1c2lvbl9zdGFtcCkgOiAkKFBES19GVVNJT05fUExBVEZPUk1fWklQKQogCUBlY2hvICJVbnppcCAkKGRpciAkQCkgPC0gJDwiCkBAIC04MSw5ICsxMDUsMTcgQEAKIAkkKGNhbGwgc3BsaXQtbG9uZy1hcmd1bWVudHMsLXRvdWNoLCQoX3Bka19mdXNpb25fZmlsZXMpKQogCSQoaGlkZSkgdG91Y2ggJEAKIAotCiAkKF9wZGtfZnVzaW9uX2ZpbGVzKSA6ICQoX3Bka19mdXNpb25fc3RhbXApCitlbmRpZiAjIFBES19GVVNJT05fUExBVEZPUk1fWklQCiAKK2lmbmVxICgkKF9wZGtfZnVzaW9uX2phdmFfZmlsZV9saXN0KSwpCisgICMgVGhpcyByZXByZXNlbnRzIHdoZXRoZXIgamF2YSBidWlsZCBjYW4gdXNlIHBsYXRmb3JtIEFQSSBvciBub3QKKyAgIyBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBpbiBBbmRyb2lkLm1rCisgIFRBUkdFVF9CVUlMRF9QREtfSkFWQV9QTEFURk9STSA6PSB0cnVlCisgIGlmbmVxICgkKFRBUkdFVF9CVUlMRF9KQVZBX1NVUFBPUlRfTEVWRUwpLCkKKyAgICBUQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMIDo9IHBsYXRmb3JtCisgIGVuZGlmCitlbmRpZgogCiAjIEltcGxpY2l0IHBhdHRlcm4gcnVsZXMgdG8gY29weSB0aGUgZnVzaW9uIGZpbGVzIHRvIHRoZSBzeXN0ZW0gaW1hZ2UgZGlyZWN0b3J5LgogIyBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgYWxyZWFkeSBleHBsaWNpdCBydWxlIGluIHRoZSBidWlsZCBzeXN0ZW0gdG8gZ2VuZXJhdGUgYSBmaWxlLApAQCAtMTAxLDc0ICsxMzMsNTcgQEAKIAkkKGhpZGUpIGNwIC1mcFBSICQ8ICRACiAKIGlmZXEgKHRydWUsJChUQVJHRVRfQlVJTERfUERLX0pBVkFfUExBVEZPUk0pKQorICBQREtfRlVTSU9OX09VVF9ESVIgOj0gJChPVVRfRElSKQogCi1QREtfRlVTSU9OX09VVF9ESVIgOj0gJChPVVRfRElSKQotaWZlcSAoZGVidWcsJChUQVJHRVRfQlVJTERfVFlQRSkpCi1QREtfRlVTSU9OX09VVF9ESVIgOj0gJChERUJVR19PVVRfRElSKQotZW5kaWYKKyAgZGVmaW5lIEpBVkFfZGVwZW5kZW5jeV90ZW1wbGF0ZQorICAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChQREtfRlVTSU9OX09VVF9ESVIpLyQoc3RyaXAgJCgxKSksXAorICAgICQoZm9yZWFjaCBkLCQoZmlsdGVyICQoMiksJChfcGRrX2Z1c2lvbl9qYXZhX2ZpbGVfbGlzdCkpLCQoUERLX0ZVU0lPTl9PVVRfRElSKS8kKGQpKSkKKyAgZW5kZWYKIAotZGVmaW5lIEpBVkFfZGVwZW5kZW5jeV90ZW1wbGF0ZQotJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoUERLX0ZVU0lPTl9PVVRfRElSKS8kKHN0cmlwICQoMSkpLFwKLSAgJChmb3JlYWNoIGQsJChmaWx0ZXIgJCgyKSwkKF9wZGtfZnVzaW9uX2phdmFfZmlsZV9saXN0KSksJChQREtfRlVTSU9OX09VVF9ESVIpLyQoZCkpKQotZW5kZWYKKyAgIyBuZWVkcyBleHBsaWNpdCBkZXBlbmRlbmN5IGFzIHBhY2thZ2UtZXhwb3J0LmFwayBpcyBub3QgZXhwbGljaXRseSBwdWxsZWQKKyAgJChldmFsICQoY2FsbCBKQVZBX2RlcGVuZGVuY3lfdGVtcGxhdGUsXAorICB0YXJnZXQvY29tbW9uL29iai9BUFBTL2ZyYW1ld29yay1yZXNfaW50ZXJtZWRpYXRlcy9zcmMvUi5zdGFtcCxcCisgIHRhcmdldC9jb21tb24vb2JqL0FQUFMvZnJhbWV3b3JrLXJlc19pbnRlcm1lZGlhdGVzL3BhY2thZ2UtZXhwb3J0LmFwaykpCiAKLSMgbmVlZHMgZXhwbGljaXQgZGVwZW5kZW5jeSBhcyBwYWNrYWdlLWV4cG9ydC5hcGsgaXMgbm90IGV4cGxpY2l0bHkgcHVsbGVkCi0kKGV2YWwgJChjYWxsIEpBVkFfZGVwZW5kZW5jeV90ZW1wbGF0ZSxcCi10YXJnZXQvY29tbW9uL29iai9BUFBTL2ZyYW1ld29yay1yZXNfaW50ZXJtZWRpYXRlcy9zcmMvUi5zdGFtcCxcCi10YXJnZXQvY29tbW9uL29iai9BUFBTL2ZyYW1ld29yay1yZXNfaW50ZXJtZWRpYXRlcy9wYWNrYWdlLWV4cG9ydC5hcGspKQotCi0jIGphdmFsaWIuamFyIHNob3VsZCBwdWxsIGNsYXNzZXMuamFyIGFzIGNsYXNzZXMuamFyIGlzIG5vdCBleHBsaWNpdGx5IHB1bGxlZC4KLSQoZm9yZWFjaCBsaWJfZGlyLCQoUERLX1BMQVRGT1JNX0pBVkFfWklQX0pBVkFfVEFSR0VUX0xJQl9ESVIpLFwKLSQoZXZhbCAkKGNhbGwgSkFWQV9kZXBlbmRlbmN5X3RlbXBsYXRlLCQobGliX2RpcikvamF2YWxpYi5qYXIsXAotJChsaWJfZGlyKS9jbGFzc2VzLmphcikpKQotCi0jIHB1bGwgLmphY2sgYW5kIC5kZXggZmlsZXMKLSQoZm9yZWFjaCBsaWJfZGlyLCQoUERLX1BMQVRGT1JNX0pBVkFfWklQX0pBVkFfVEFSR0VUX0xJQl9ESVIpLFwKLSAgJChldmFsICQoY2FsbCBKQVZBX2RlcGVuZGVuY3lfdGVtcGxhdGUsJChsaWJfZGlyKS9jbGFzc2VzLmphci50b2MsXAotICAgICQobGliX2RpcikvY2xhc3Nlcy5qYXIgJChsaWJfZGlyKS9jbGFzc2VzLmphY2spKSkKLSQoZm9yZWFjaCBsaWJfZGlyLCQoUERLX1BMQVRGT1JNX0pBVkFfWklQX0pBVkFfVEFSR0VUX0xJQl9ESVIpLFwKLSAgJChldmFsICQoY2FsbCBKQVZBX2RlcGVuZGVuY3lfdGVtcGxhdGUsJChsaWJfZGlyKS9jbGFzc2VzLmRleC50b2MsXAotICAgICQobGliX2RpcikvY2xhc3Nlcy5qYXIgJChsaWJfZGlyKS9jbGFzc2VzLmphY2sgJChsaWJfZGlyKS9jbGFzc2VzJS5kZXgpKSkKKyAgIyBqYXZhbGliLmphciBzaG91bGQgcHVsbCBjbGFzc2VzLmphciBhcyBjbGFzc2VzLmphciBpcyBub3QgZXhwbGljaXRseSBwdWxsZWQuCisgICQoZm9yZWFjaCBsaWJfZGlyLCQoUERLX1BMQVRGT1JNX0pBVkFfWklQX0pBVkFfVEFSR0VUX0xJQl9ESVIpLFwKKyAgJChldmFsICQoY2FsbCBKQVZBX2RlcGVuZGVuY3lfdGVtcGxhdGUsJChsaWJfZGlyKS9qYXZhbGliLmphcixcCisgICQobGliX2RpcikvY2xhc3Nlcy5qYXIpKSkKIAogIyBpbXBsaWNpdCBydWxlcyBmb3IgYWxsIG90aGVyIHRhcmdldCBmaWxlcwogJChUQVJHRVRfQ09NTU9OX09VVF9ST09UKS8lIDogJChfcGRrX2Z1c2lvbl9pbnRlcm1lZGlhdGVzKS90YXJnZXQvY29tbW9uLyUgJChfcGRrX2Z1c2lvbl9zdGFtcCkKIAlAbWtkaXIgLXAgJChkaXIgJEApCiAJJChoaWRlKSBjcCAtZnBQUiAkPCAkQAotZW5kaWYKK2VuZGlmICMgVEFSR0VUX0JVSUxEX1BES19KQVZBX1BMQVRGT1JNCiAKIEFMTF9QREtfRlVTSU9OX0ZJTEVTIDo9ICQoYWRkcHJlZml4ICQoUFJPRFVDVF9PVVQpLywgJChfcGRrX2Z1c2lvbl9maWxlX2xpc3QpKQogCi1lbmRpZiAjIFBES19GVVNJT05fUExBVEZPUk1fWklQCitlbmRpZiAjIFBES19GVVNJT05fUExBVEZPUk1fWklQIHx8IFBES19GVVNJT05fUExBVEZPUk1fRElSCiAKIGlmZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksdHJ1ZSkKLSQoaW5mbyBQREsgVEFSR0VUX0JVSUxEX0pBVkFfU1VQUE9SVF9MRVZFTCAkKFRBUkdFVF9CVUlMRF9KQVZBX1NVUFBPUlRfTEVWRUwpKQotaWZlcSAoJChUQVJHRVRfQlVJTERfUERLX0pBVkFfUExBVEZPUk0pLCkKLQotIyBTREsgdXNlZCBmb3IgSmF2YSBidWlsZCB1bmRlciBQREsKLVBES19CVUlMRF9TREtfVkVSU0lPTiA6PSAkKGxhc3R3b3JkICQoVEFSR0VUX0FWQUlMQUJMRV9TREtfVkVSU0lPTlMpKQotJChpbmZvIFBESyBCdWlsZCB1c2VzIFNESyAkKFBES19CVUlMRF9TREtfVkVSU0lPTikpCi0KLWVsc2UgIyBQREtfSkFWQQotCi0kKGluZm8gUERLIEJ1aWxkIHVzZXMgdGhlIGN1cnJlbnQgcGxhdGZvcm0gQVBJKQotCi1lbmRpZiAjIFBES19KQVZBCi0KKyAgJChpbmZvIFBESyBUQVJHRVRfQlVJTERfSkFWQV9TVVBQT1JUX0xFVkVMICQoVEFSR0VUX0JVSUxEX0pBVkFfU1VQUE9SVF9MRVZFTCkpCisgIGlmZXEgKCQoVEFSR0VUX0JVSUxEX1BES19KQVZBX1BMQVRGT1JNKSwpCisgICAgIyBTREsgdXNlZCBmb3IgSmF2YSBidWlsZCB1bmRlciBQREsKKyAgICBQREtfQlVJTERfU0RLX1ZFUlNJT04gOj0gJChsYXN0d29yZCAkKFRBUkdFVF9BVkFJTEFCTEVfU0RLX1ZFUlNJT05TKSkKKyAgICAkKGluZm8gUERLIEJ1aWxkIHVzZXMgU0RLICQoUERLX0JVSUxEX1NES19WRVJTSU9OKSkKKyAgZWxzZSAjIFBES19KQVZBCisgICAgJChpbmZvIFBESyBCdWlsZCB1c2VzIHRoZSBjdXJyZW50IHBsYXRmb3JtIEFQSSkKKyAgZW5kaWYgIyBQREtfSkFWQQogZW5kaWYgIyBCVUlMRF9QREsKIAogaWZuZXEgKCwkKGZpbHRlciBwbGF0Zm9ybSBwbGF0Zm9ybS1qYXZhLCAkKE1BS0VDTURHT0FMUykpJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9CVUlMRF9QREspKSkKLSMgZmlsZXMgdW5kZXIgJChQUk9EVUNUX09VVCkvc3ltYm9scyB0byBoZWxwIGRlYnVnZ2luZy4KLSMgU291cmNlIG5vdCBpbmNsdWRlZCB0byBQREsgZHVlIHRvIGRlcGVuZGVuY3kgaXNzdWUsIHNvIHByb3ZpZGUgc3ltYm9scyBpbnN0ZWFkLgorICAjIGZpbGVzIHVuZGVyICQoUFJPRFVDVF9PVVQpL3N5bWJvbHMgdG8gaGVscCBkZWJ1Z2dpbmcuCisgICMgU291cmNlIG5vdCBpbmNsdWRlZCB0byBQREsgZHVlIHRvIGRlcGVuZGVuY3kgaXNzdWUsIHNvIHByb3ZpZGUgc3ltYm9scyBpbnN0ZWFkLgogCi0jIFdlIG1heSBub3QgYmUgYnVpbGRpbmcgYWxsIG9mIHRoZW0uCi0jIFRoZSBwbGF0Zm9ybS56aXAganVzdCBzaWxlbnRseSBpZ25vcmVzIHRoZSBub25leGlzdGVudCBvbmVzLgotUERLX1NZTUJPTF9GSUxFU19MSVNUIDo9IFwKLSAgICBzeXN0ZW0vYmluL2FwcF9wcm9jZXNzMzIgXAotICAgIHN5c3RlbS9iaW4vYXBwX3Byb2Nlc3M2NAorICAjIFdlIG1heSBub3QgYmUgYnVpbGRpbmcgYWxsIG9mIHRoZW0uCisgICMgVGhlIHBsYXRmb3JtLnppcCBqdXN0IHNpbGVudGx5IGlnbm9yZXMgdGhlIG5vbmV4aXN0ZW50IG9uZXMuCisgIFBES19TWU1CT0xfRklMRVNfTElTVCA6PSBcCisgICAgICBzeXN0ZW0vYmluL2FwcF9wcm9jZXNzMzIgXAorICAgICAgc3lzdGVtL2Jpbi9hcHBfcHJvY2VzczY0CiAKLWlmZGVmIFBES19GVVNJT05fUExBVEZPUk1fWklQCi0jIHN5bWJvbHMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgcHVsbGVkIGZvciBmdXNpb24gYnVpbGQKLSQoZm9yZWFjaCBmLCQoZmlsdGVyICQoUERLX1NZTUJPTF9GSUxFU19MSVNUKSwgJChfcGRrX2Z1c2lvbl9maWxlX2xpc3QpKSxcCi0gICQoZXZhbCAkKGNhbGwgYWRkLWRlcGVuZGVuY3ksJChQUk9EVUNUX09VVCkvJChmKSwkKFBST0RVQ1RfT1VUKS9zeW1ib2xzLyQoZikpKSkKLWVuZGlmICMgUExBVEZPUk1fWklQCi1lbmRpZiAjIHBsYXRmb3JtLnppcCBidWlsZCBvciBQREsKKyAgaWZuZXEgKCwkKFBES19GVVNJT05fUExBVEZPUk1fWklQKSQoUERLX0ZVU0lPTl9QTEFURk9STV9ESVIpKQorICAgICMgc3ltYm9scyBzaG91bGQgYmUgZXhwbGljaXRseSBwdWxsZWQgZm9yIGZ1c2lvbiBidWlsZAorICAgICQoZm9yZWFjaCBmLCQoZmlsdGVyICQoUERLX1NZTUJPTF9GSUxFU19MSVNUKSwgJChfcGRrX2Z1c2lvbl9maWxlX2xpc3QpKSxcCisgICAgICAkKGV2YWwgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoUFJPRFVDVF9PVVQpLyQoZiksJChQUk9EVUNUX09VVCkvc3ltYm9scy8kKGYpKSkpCisgIGVuZGlmICMgUExBVEZPUk1fWklQIHx8IFBMQVRGT1JNX0RJUgorZW5kaWYgIyBwbGF0Zm9ybS56aXAvZGlyIGJ1aWxkIG9yIFBESwpkaWZmIC0tZ2l0IGEvY29yZS9wZGtfZnVzaW9uX21vZHVsZXMubWsgYi9jb3JlL3Bka19mdXNpb25fbW9kdWxlcy5tawppbmRleCAwYzAzZjM3Li45YWFiZDBmIDEwMDY0NAotLS0gYS9jb3JlL3Bka19mdXNpb25fbW9kdWxlcy5taworKysgYi9jb3JlL3Bka19mdXNpb25fbW9kdWxlcy5tawpAQCAtMiwxMCArMiwxNiBAQAogIyBXZSB1c2UgdGhlc2UgcnVsZXMgdG8gcmVidWlsZCAub2RleCBmaWxlcyBvZiB0aGUgLmphci8uYXBrIGluc2lkZSB0aGUgcGxhdGZvcm0uemlwLgogIwogCitpZmRlZiBQREtfRlVTSU9OX1BMQVRGT1JNX1pJUAogcGRrX2RleHByZW9wdF9jb25maWdfbWsgOj0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL3Bka19kZXhwcmVvcHRfY29uZmlnLm1rCiAKICQoc2hlbGwgcm0gLWYgJChwZGtfZGV4cHJlb3B0X2NvbmZpZ19taykgJiYgbWtkaXIgLXAgJChkaXIgJChwZGtfZGV4cHJlb3B0X2NvbmZpZ19taykpICYmIFwKICAgICAgICAgdW56aXAgLXFvICQoUERLX0ZVU0lPTl9QTEFURk9STV9aSVApIC1kICQoZGlyICQocGRrX2RleHByZW9wdF9jb25maWdfbWspKSBwZGtfZGV4cHJlb3B0X2NvbmZpZy5tayAyPi9kZXYvbnVsbCkKK2VuZGlmCisKK2lmZGVmIFBES19GVVNJT05fUExBVEZPUk1fRElSCitwZGtfZGV4cHJlb3B0X2NvbmZpZ19tayA6PSAkKFBES19GVVNJT05fUExBVEZPUk1fRElSKS9wZGtfZGV4cHJlb3B0X2NvbmZpZy5taworZW5kaWYKIAogLWluY2x1ZGUgJChwZGtfZGV4cHJlb3B0X2NvbmZpZ19taykKIApkaWZmIC0tZ2l0IGEvY29yZS9wcmVidWlsdF9pbnRlcm5hbC5tayBiL2NvcmUvcHJlYnVpbHRfaW50ZXJuYWwubWsKaW5kZXggNjIwYzIyYy4uZDRmNTUyMiAxMDA2NDQKLS0tIGEvY29yZS9wcmVidWlsdF9pbnRlcm5hbC5taworKysgYi9jb3JlL3ByZWJ1aWx0X2ludGVybmFsLm1rCkBAIC0yMCwxOSArMjAsMTkgQEAKIAogaWZkZWYgTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUKICAgbXlfcHJlYnVpbHRfc3JjX2ZpbGUgOj0gJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSkKK2Vsc2UgaWZkZWYgTE9DQUxfU1JDX0ZJTEVTXyQoJChteV9wcmVmaXgpJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpCisgIG15X3ByZWJ1aWx0X3NyY19maWxlIDo9ICQoTE9DQUxfUEFUSCkvJChMT0NBTF9TUkNfRklMRVNfJCgkKG15X3ByZWZpeCkkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQVJDSCkpCisgIExPQ0FMX1NSQ19GSUxFU18kKCQobXlfcHJlZml4KSQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKSA6PQorZWxzZSBpZmRlZiBMT0NBTF9TUkNfRklMRVNfJChteV8zMl82NF9iaXRfc3VmZml4KQorICBteV9wcmVidWlsdF9zcmNfZmlsZSA6PSAkKExPQ0FMX1BBVEgpLyQoTE9DQUxfU1JDX0ZJTEVTXyQobXlfMzJfNjRfYml0X3N1ZmZpeCkpCisgIExPQ0FMX1NSQ19GSUxFU18kKG15XzMyXzY0X2JpdF9zdWZmaXgpIDo9CitlbHNlIGlmZGVmIExPQ0FMX1NSQ19GSUxFUworICBteV9wcmVidWlsdF9zcmNfZmlsZSA6PSAkKExPQ0FMX1BBVEgpLyQoTE9DQUxfU1JDX0ZJTEVTKQorICBMT0NBTF9TUkNfRklMRVMgOj0KK2Vsc2UgaWZkZWYgTE9DQUxfUkVQTEFDRV9QUkVCVUlMVF9BUEtfSU5TVEFMTEVECisgICMgVGhpcyBpcyBoYW5kbGVkIHNwZWNpYWxseSBiZWxvdwogZWxzZQotICBpZmRlZiBMT0NBTF9TUkNfRklMRVNfJCgkKG15X3ByZWZpeCkkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQVJDSCkKLSAgICBteV9wcmVidWlsdF9zcmNfZmlsZSA6PSAkKExPQ0FMX1BBVEgpLyQoTE9DQUxfU1JDX0ZJTEVTXyQoJChteV9wcmVmaXgpJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKUFSQ0gpKQotICAgIExPQ0FMX1NSQ19GSUxFU18kKCQobXlfcHJlZml4KSQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClBUkNIKSA6PQotICBlbHNlCi0gICAgaWZkZWYgTE9DQUxfU1JDX0ZJTEVTXyQobXlfMzJfNjRfYml0X3N1ZmZpeCkKLSAgICAgIG15X3ByZWJ1aWx0X3NyY19maWxlIDo9ICQoTE9DQUxfUEFUSCkvJChMT0NBTF9TUkNfRklMRVNfJChteV8zMl82NF9iaXRfc3VmZml4KSkKLSAgICAgIExPQ0FMX1NSQ19GSUxFU18kKG15XzMyXzY0X2JpdF9zdWZmaXgpIDo9Ci0gICAgZWxzZQotICAgICAgbXlfcHJlYnVpbHRfc3JjX2ZpbGUgOj0gJChMT0NBTF9QQVRIKS8kKExPQ0FMX1NSQ19GSUxFUykKLSAgICAgIExPQ0FMX1NSQ19GSUxFUyA6PQotICAgIGVuZGlmCi0gIGVuZGlmCisgICQoY2FsbCBwcmV0dHktZXJyb3IsTm8gc291cmNlIGZpbGVzIHNwZWNpZmllZCkKIGVuZGlmCiAKIExPQ0FMX0NIRUNLRURfTU9EVUxFIDo9ICQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpCkBAIC0xNzMsMTAgKzE3MywyMSBAQAogZW5kaWYKIGV4cG9ydF9jZmxhZ3MgOj0KIAoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYWxsb3dlZF9uZGtfdHlwZXMubWsKKwogaWZkZWYgTE9DQUxfU0RLX1ZFUlNJT04KLW15X2xpbmtfdHlwZSA6PSBuYXRpdmU6bmRrCitteV9saW5rX3R5cGUgOj0gbmF0aXZlOm5kazokKG15X25ka19zdGxfZmFtaWx5KTokKG15X25ka19zdGxfbGlua190eXBlKQogZWxzZSBpZmRlZiBMT0NBTF9VU0VfVk5ESwotbXlfbGlua190eXBlIDo9IG5hdGl2ZTp2ZW5kb3IKKyAgICBfbmFtZSA6PSAkKHBhdHN1YnN0ICUudmVuZG9yLCUsJChMT0NBTF9NT0RVTEUpKQorICAgIGlmbmVxICgkKGZpbHRlciAkKF9uYW1lKSwkKFZOREtfQ09SRV9MSUJSQVJJRVMpICQoVk5ES19TQU1FUFJPQ0VTU19MSUJSQVJJRVMpICQoTExOREtfTElCUkFSSUVTKSksKQorICAgICAgICBpZmVxICgkKGZpbHRlciAkKF9uYW1lKSwkKFZOREtfUFJJVkFURV9MSUJSQVJJRVMpKSwpCisgICAgICAgICAgICBteV9saW5rX3R5cGUgOj0gbmF0aXZlOnZuZGsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbXlfbGlua190eXBlIDo9IG5hdGl2ZTp2bmRrX3ByaXZhdGUKKyAgICAgICAgZW5kaWYKKyAgICBlbHNlCisgICAgICAgIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6dmVuZG9yCisgICAgZW5kaWYKIGVsc2UKIG15X2xpbmtfdHlwZSA6PSBuYXRpdmU6cGxhdGZvcm0KIGVuZGlmCkBAIC0yMjgsNyArMjM5LDcgQEAKICAgICBlbHNlCiAgICAgICBteV9jb3ZlcmFnZV9wYXRoIDo9ICQoVEFSR0VUX09VVF9DT1ZFUkFHRSkvJChwYXRzdWJzdCAkKFBST0RVQ1RfT1VUKS8lLCUsJChteV9tb2R1bGVfcGF0aCkpCiAgICAgZW5kaWYKLSAgICBteV9jb3ZlcmFnZV9wYXRoIDo9ICQobXlfY292ZXJhZ2VfcGF0aCkvJChiYXNlbmFtZSAkKG15X2luc3RhbGxlZF9tb2R1bGVfc3RlbSkpLmdjbm9kaXIKKyAgICBteV9jb3ZlcmFnZV9wYXRoIDo9ICQobXlfY292ZXJhZ2VfcGF0aCkvJChwYXRzdWJzdCAlLnNvLCUsJChteV9pbnN0YWxsZWRfbW9kdWxlX3N0ZW0pKS5nY25vZGlyCiAgICAgJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfUFJFQlVJTFRfQ09WRVJBR0VfQVJDSElWRSksJChteV9jb3ZlcmFnZV9wYXRoKSkpCiAgICAgJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKG15X2NvdmVyYWdlX3BhdGgpCiAgIGVuZGlmCkBAIC0zNzksNiArMzkwLDkgQEAKICQoYnVpbHRfbW9kdWxlKSA6ICQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpIHwgJChaSVBBTElHTikgJChTSUdOQVBLX0pBUikKIAkkKHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQpCiAJJCh1bmNvbXByZXNzLXNoYXJlZC1saWJzKQoraWZlcSAodHJ1ZSwgJChMT0NBTF9VTkNPTVBSRVNTX0RFWCkpCisJJCh1bmNvbXByZXNzLWRleHMpCitlbmRpZiAgIyBMT0NBTF9VTkNPTVBSRVNTX0RFWAogaWZkZWYgTE9DQUxfREVYX1BSRU9QVAogaWZuZXEgKCQoQlVJTERfUExBVEZPUk1fWklQKSwpCiAJQCMgS2VlcCBhIGNvcHkgb2YgYXBrIHdpdGggY2xhc3Nlcy5kZXggdW5zdHJpcHBlZApAQCAtNDAzLDExICs0MTcsMTkgQEAKIGVuZGlmICAjICEgTE9DQUxfUkVQTEFDRV9QUkVCVUlMVF9BUEtfSU5TVEFMTEVECiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIFJ1bGUgdG8gYnVpbGQgdGhlIG9kZXggZmlsZQorIyMgUnVsZSB0byBidWlsZCB0aGUgb2RleCBmaWxlLgorIyBJbiBjYXNlIHdlIGRvbid0IHN0cmlwIHRoZSBidWlsdCBtb2R1bGUsIHVzZSBpdCwgYXMgZGV4cHJlb3B0CisjIGNhbiBkbyBvcHRpbWl6YXRpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGJ1aWx0IG1vZHVsZSBvbmx5CisjIGNvbnRhaW5zIHVuY29tcHJlc3NlZCBkZXggY29kZS4KIGlmZGVmIExPQ0FMX0RFWF9QUkVPUFQKK2lmZXEgKG5vc3RyaXBwaW5nLCQoTE9DQUxfREVYX1BSRU9QVCkpCiskKGJ1aWx0X29kZXgpIDogJChidWlsdF9tb2R1bGUpCisJJChjYWxsIGRleHByZW9wdC1vbmUtZmlsZSwkPCwkQCkKK2Vsc2UKICQoYnVpbHRfb2RleCkgOiAkKG15X3ByZWJ1aWx0X3NyY19maWxlKQogCSQoY2FsbCBkZXhwcmVvcHQtb25lLWZpbGUsJDwsJEApCiBlbmRpZgorZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgSW5zdGFsbCBzcGxpdCBhcGtzLgpAQCAtNDcwLDExICs0OTIsNyBAQAogCUBlY2hvICJEZXhwcmVvcHQgSmFyOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgogCSQoY2FsbCBkZXhwcmVvcHQtb25lLWZpbGUsJDwsJEApCiAKLSQoYnVpbHRfbW9kdWxlKSA6ICQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpCi0JJChjYWxsIGNvcHktZmlsZS10by10YXJnZXQpCi1pZm5lcSAobm9zdHJpcHBpbmcsJChMT0NBTF9ERVhfUFJFT1BUKSkKLQkkKGNhbGwgZGV4cHJlb3B0LXJlbW92ZS1jbGFzc2VzLmRleCwkQCkKLWVuZGlmCiskKGV2YWwgJChjYWxsIGRleHByZW9wdC1jb3B5LWphciwkKG15X3ByZWJ1aWx0X3NyY19maWxlKSwkKGJ1aWx0X21vZHVsZSksJChMT0NBTF9ERVhfUFJFT1BUKSkpCiBlbmRpZiAjIGJvb3QgamFyCiBlbHNlICMgISBMT0NBTF9ERVhfUFJFT1BUCiAkKGJ1aWx0X21vZHVsZSkgOiAkKG15X3ByZWJ1aWx0X3NyY19maWxlKQpAQCAtNTAwLDYgKzUxOCw3IEBACiAjIGZvciBob3N0IGphdmEgbGlicmFyaWVzIGRlcHMgc2hvdWxkIGJlIGluIHRoZSBjb21tb24gZGlyLCBzbyB3ZSBtYWtlIGEgY29weSBpbgogIyB0aGUgY29tbW9uIGRpci4KIGNvbW1vbl9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgorY29tbW9uX2hlYWRlcl9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1oZWFkZXIuamFyCiAKICQoY29tbW9uX2NsYXNzZXNfamFyKTogUFJJVkFURV9NT0RVTEUgOj0gJChMT0NBTF9NT0RVTEUpCiAkKGNvbW1vbl9jbGFzc2VzX2phcik6IFBSSVZBVEVfUFJFRklYIDo9ICQobXlfcHJlZml4KQpAQCAtNTA3LDEwICs1MjYsMTYgQEAKICQoY29tbW9uX2NsYXNzZXNfamFyKSA6ICQobXlfc3JjX2phcikKIAkkKHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQpCiAKK2lmbmVxICgkKFRVUkJJTkVfRU5BQkxFRCksZmFsc2UpCiskKGNvbW1vbl9oZWFkZXJfamFyKSA6ICQobXlfc3JjX2phcikKKwkkKHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQpCitlbmRpZgorCiBlbHNlICMgIUxPQ0FMX0lTX0hPU1RfTU9EVUxFCiAjIGZvciB0YXJnZXQgamF2YSBsaWJyYXJpZXMsIHRoZSBMT0NBTF9CVUlMVF9NT0RVTEUgaXMgaW4gYSBwcm9kdWN0LXNwZWNpZmljIGRpciwKICMgd2hpbGUgdGhlIGRlcHMgc2hvdWxkIGJlIGluIHRoZSBjb21tb24gZGlyLCBzbyB3ZSBtYWtlIGEgY29weSBpbiB0aGUgY29tbW9uIGRpci4KIGNvbW1vbl9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgorY29tbW9uX2hlYWRlcl9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1oZWFkZXIuamFyCiBjb21tb25fY2xhc3Nlc19wcmVfcHJvZ3VhcmRfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMtcHJlLXByb2d1YXJkLmphcgogY29tbW9uX2phdmFsaWJfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phdmFsaWIuamFyCiAKQEAgLTUxOSw2ICs1NDQsMTAgQEAKIAogaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksc3lzdGVtX2N1cnJlbnQpCiBteV9saW5rX3R5cGUgOj0gamF2YTpzeXN0ZW0KK2Vsc2UgaWZuZXEgKCwkKGNhbGwgaGFzLXN5c3RlbS1zZGstdmVyc2lvbiwkKExPQ0FMX1NES19WRVJTSU9OKSkpCitteV9saW5rX3R5cGUgOj0gamF2YTpzeXN0ZW0KK2Vsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksY29yZV9jdXJyZW50KQorbXlfbGlua190eXBlIDo9IGphdmE6Y29yZQogZWxzZSBpZm5lcSAoJChMT0NBTF9TREtfVkVSU0lPTiksKQogbXlfbGlua190eXBlIDo9IGphdmE6c2RrCiBlbHNlCkBAIC01NDMsMjggKzU3Miw0MyBAQAogaWZuZXEgKCQobXlfc3JjX2FhciksKQogIyBUaGlzIGlzIC5hYXIgZmlsZSwgYXJjaGl2ZSBvZiBjbGFzc2VzLmphciBhbmQgQW5kcm9pZCByZXNvdXJjZXMuCiBteV9zcmNfamFyIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2Fhci9jbGFzc2VzLmphcgorbXlfc3JjX3Byb2d1YXJkX29wdGlvbnMgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvYWFyL3Byb2d1YXJkLnR4dAogCiskKG15X3NyY19qYXIpIDogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKG15X3NyY19wcm9ndWFyZF9vcHRpb25zKQogJChteV9zcmNfamFyKSA6ICQobXlfc3JjX2FhcikKIAkkKGhpZGUpIHJtIC1yZiAkKGRpciAkQCkgJiYgbWtkaXIgLXAgJChkaXIgJEApICQoZGlyICRAKS9yZXMKIAkkKGhpZGUpIHVuemlwIC1xbyAtZCAkKGRpciAkQCkgJDwKIAkjIE1ha2Ugc3VyZSB0aGUgZXh0cmFjdGVkIGNsYXNzZXMuamFyIGhhcyBhIG5ldyB0aW1lc3RhbXAuCiAJJChoaWRlKSB0b3VjaCAkQAorCSMgTWFrZSBzdXJlIHRoZSBwcm9ndWFyZCBmaWxlIGV4aXN0cyBhbmQgaGFzIGEgbmV3IHRpbWVzdGFtcC4KKwkkKGhpZGUpIHRvdWNoICQoZGlyICRAKS9wcm9ndWFyZC50eHQKIAogZW5kaWYKIAogJChjb21tb25fY2xhc3Nlc19qYXIpIDogJChteV9zcmNfamFyKQogCSQodHJhbnNmb3JtLXByZWJ1aWx0LXRvLXRhcmdldCkKIAoraWZuZXEgKCQoVFVSQklORV9FTkFCTEVEKSxmYWxzZSkKKyQoY29tbW9uX2hlYWRlcl9qYXIpIDogJChteV9zcmNfamFyKQorCSQodHJhbnNmb3JtLXByZWJ1aWx0LXRvLXRhcmdldCkKK2VuZGlmCisKICQoY29tbW9uX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phcikgOiAkKG15X3NyY19qYXIpCiAJJCh0cmFuc2Zvcm0tcHJlYnVpbHQtdG8tdGFyZ2V0KQogCiAkKGNvbW1vbl9qYXZhbGliX2phcikgOiAkKGNvbW1vbl9jbGFzc2VzX2phcikKIAkkKHRyYW5zZm9ybS1wcmVidWlsdC10by10YXJnZXQpCiAKLSQoY2FsbCBkZWZpbmUtamFyLXRvLXRvYy1ydWxlLCAkKGNvbW1vbl9jbGFzc2VzX2phcikpCitpZmRlZiBMT0NBTF9BQVBUMl9PTkxZCitMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQorZW5kaWYKIAogaWZkZWYgTE9DQUxfVVNFX0FBUFQyCiBpZm5lcSAoJChteV9zcmNfYWFyKSwpCisKKyQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2V4cG9ydF9wcm9ndWFyZF9mbGFncyA6ICQobXlfc3JjX3Byb2d1YXJkX29wdGlvbnMpCisJJCh0cmFuc2Zvcm0tcHJlYnVpbHQtdG8tdGFyZ2V0KQorCiBMT0NBTF9TREtfUkVTX1ZFUlNJT046PSQoc3RyaXAgJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pKQogaWZlcSAoJChMT0NBTF9TREtfUkVTX1ZFUlNJT04pLCkKICAgTE9DQUxfU0RLX1JFU19WRVJTSU9OOj0kKExPQ0FMX1NES19WRVJTSU9OKQpAQCAtNTkwLDcgKzYzNCw3IEBACiAKICMgV2UgbmVlZGVkIG9ubHkgdmVyeSBmZXcgUFJJVkFURSB2YXJpYWJsZXMgYW5kIGFhcHQyLm1rIGlucHV0IHZhcmlhYmxlcy4gUmVzZXQgdGhlIHVubmVjZXNzYXJ5IG9uZXMuCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9BQVBUMl9DRkxBR1MgOj0KLSQobXlfcmVzX3BhY2thZ2UpOiBQUklWQVRFX0FBUFRfRkxBR1MgOj0gLS1zdGF0aWMtbGliIC0tbm8tc3RhdGljLWxpYi1wYWNrYWdlcworJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAtLXN0YXRpYy1saWIgLS1uby1zdGF0aWMtbGliLXBhY2thZ2VzIC0tYXV0by1hZGQtb3ZlcmxheQogJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfQU5EUk9JRF9NQU5JRkVTVCA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9hYXIvQW5kcm9pZE1hbmlmZXN0LnhtbAogJChteV9yZXNfcGFja2FnZSk6IFBSSVZBVEVfQUFQVF9JTkNMVURFUyA6PSAkKGZyYW1ld29ya19yZXNfcGFja2FnZV9leHBvcnQpCiAkKG15X3Jlc19wYWNrYWdlKTogUFJJVkFURV9TT1VSQ0VfSU5URVJNRURJQVRFU19ESVIgOj0KQEAgLTYyMiwyNSArNjY2LDYgQEAKIGVuZGlmICMgISBwcmVidWlsdF9tb2R1bGVfaXNfZGV4X2phdmFsaWIKIGVuZGlmICMgTE9DQUxfSVNfSE9TVF9NT0RVTEUgaXMgbm90IHNldAogCi1pZm5lcSAoJChwcmVidWlsdF9tb2R1bGVfaXNfZGV4X2phdmFsaWIpLHRydWUpCi0KLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotIyBXZSBtYXkgYmUgYnVpbGRpbmcgY2xhc3Nlcy5qYWNrIGZyb20gYSBob3N0IGphciBmb3IgaG9zdCBkYWx2aWsgSmF2YSBsaWJyYXJ5LgotJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5qYWNrIDogUFJJVkFURV9KQUNLX0ZMQUdTOj0kKExPQ0FMX0pBQ0tfRkxBR1MpCi0kKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphY2sgOiBQUklWQVRFX0pBQ0tfTUlOX1NES19WRVJTSU9OIDo9ICQoaWYgJChzdHJpcCAkKExPQ0FMX01JTl9TREtfVkVSU0lPTikpLCQoTE9DQUxfTUlOX1NES19WRVJTSU9OKSwxKQotJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5qYWNrIDogUFJJVkFURV9KQUNLX1BMVUdJTl9QQVRIIDo9ICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkKLSQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuamFjayA6IFBSSVZBVEVfSkFDS19QTFVHSU4gOj0gJChMT0NBTF9KQUNLX1BMVUdJTikKLSQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuamFjayA6ICQoTE9DQUxfSkFDS19QTFVHSU5fUEFUSCkgJChteV9zcmNfamFyKSBcCi0gICAgICAgICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpICQoSkFDS19ERUZBVUxUX0FSR1MpICQoSkFDSykgXAotICAgICAgICB8IHNldHVwLWphY2stc2VydmVyCi0JJCh0cmFuc2Zvcm0tamFyLXRvLWphY2spCi0KLSMgVXBkYXRlIHRpbWVzdGFtcHMgb2YgLnRvYyBmaWxlcyBmb3IgcHJlYnVpbHRzIHNvIGRlcGVuZGVudHMgd2lsbCBiZQotIyBhbHdheXMgcmVidWlsdC4KLSQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2NsYXNzZXMuZGV4LnRvYzogJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy5qYWNrCi0JdG91Y2ggJEAKLWVuZGlmICMgTE9DQUxfSkFDS19FTkFCTEVECi1lbmRpZiAjICEgcHJlYnVpbHRfbW9kdWxlX2lzX2RleF9qYXZhbGliCiBlbmRpZiAjIEpBVkFfTElCUkFSSUVTCiAKICQoYnVpbHRfbW9kdWxlKSA6ICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCmRpZmYgLS1naXQgYS9jb3JlL3Byb2R1Y3QtZ3JhcGgubWsgYi9jb3JlL3Byb2R1Y3QtZ3JhcGgubWsKaW5kZXggMzZlOTAzNy4uNTc2ZDE0ZCAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0LWdyYXBoLm1rCisrKyBiL2NvcmUvcHJvZHVjdC1ncmFwaC5tawpAQCAtMzQsNyArMzQsNyBAQAogZW5kZWYKIAogCi10aGlzX21ha2VmaWxlIDo9IGJ1aWxkL2NvcmUvcHJvZHVjdC1ncmFwaC5tawordGhpc19tYWtlZmlsZSA6PSBidWlsZC9tYWtlL2NvcmUvcHJvZHVjdC1ncmFwaC5tawogCiBwcm9kdWN0c19zdmcgOj0gJChPVVRfRElSKS9wcm9kdWN0cy5zdmcKIHByb2R1Y3RzX3BkZiA6PSAkKE9VVF9ESVIpL3Byb2R1Y3RzLnBkZgpAQCAtNzcsNyArNzcsNyBAQAogCSAgJChmb3JlYWNoIGQsJChQUk9EVUNUUy4kKHN0cmlwICQocCkpLklOSEVSSVRTX0ZST00pLCBlY2hvIFwiJChkKVwiIC1cPiBcIiQocClcIiA+PiAkQC5pbjspKQogCSQoZm9yZWFjaCBwLCQoUFJJVkFURV9QUk9EVUNUUyksJChjYWxsIGVtaXQtcHJvZHVjdC1ub2RlLXByb3BzLCQocCksJEAuaW4pKQogCSQoaGlkZSkgZWNobyAnfScgPj4gJEAuaW4KLQkkKGhpZGUpIC4vYnVpbGQvdG9vbHMvZmlsdGVyLXByb2R1Y3QtZ3JhcGgucHkgJChQUklWQVRFX1BST0RVQ1RTX0ZJTFRFUikgPCAkQC5pbiA+ICRACisJJChoaWRlKSBidWlsZC9tYWtlL3Rvb2xzL2ZpbHRlci1wcm9kdWN0LWdyYXBoLnB5ICQoUFJJVkFURV9QUk9EVUNUU19GSUxURVIpIDwgJEAuaW4gPiAkQAogCiAjIEV2YWx1YXRlcyB0byB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdCBmaWxlCiAjICQoMSkgcHJvZHVjdCBmaWxlCkBAIC0xMDMsNiArMTAzLDggQEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfTUFOVUZBQ1RVUkVSPSQkKFBST0RVQ1RTLiQoc3RyaXAgJCgxKSkuUFJPRFVDVF9NQU5VRkFDVFVSRVIpJyA+PiAkJEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTPSQkKFBST0RVQ1RTLiQoc3RyaXAgJCgxKSkuUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMpJyA+PiAkJEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVM9JCQoUFJPRFVDVFMuJChzdHJpcCAkKDEpKS5QUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTKScgPj4gJCRACisJJChoaWRlKSBlY2hvICdQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVM9JCQoUFJPRFVDVFMuJChzdHJpcCAkKDEpKS5QUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMpJyA+PiAkJEAKKwkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTPSQkKFBST0RVQ1RTLiQoc3RyaXAgJCgxKSkuUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMpJyA+PiAkJEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfQ0hBUkFDVEVSSVNUSUNTPSQkKFBST0RVQ1RTLiQoc3RyaXAgJCgxKSkuUFJPRFVDVF9DSEFSQUNURVJJU1RJQ1MpJyA+PiAkJEAKIAkkKGhpZGUpIGVjaG8gJ1BST0RVQ1RfQ09QWV9GSUxFUz0kJChQUk9EVUNUUy4kKHN0cmlwICQoMSkpLlBST0RVQ1RfQ09QWV9GSUxFUyknID4+ICQkQAogCSQoaGlkZSkgZWNobyAnUFJPRFVDVF9PVEFfUFVCTElDX0tFWVM9JCQoUFJPRFVDVFMuJChzdHJpcCAkKDEpKS5QUk9EVUNUX09UQV9QVUJMSUNfS0VZUyknID4+ICQkQApAQCAtMTIwLDExICsxMjIsMTEgQEAKIAogJChjYWxsIHByb2R1Y3QtZGVidWctZmlsZW5hbWUsICQocCkpOiBcCiAJCQkkKE9VVF9ESVIpL3Byb2R1Y3RzLyQoc3RyaXAgJCgxKSkudHh0IFwKLQkJCWJ1aWxkL3Rvb2xzL3Byb2R1Y3RfZGVidWcucHkgXAorCQkJYnVpbGQvbWFrZS90b29scy9wcm9kdWN0X2RlYnVnLnB5IFwKIAkJCSQodGhpc19tYWtlZmlsZSkKIAlAZWNobyBQcm9kdWN0IGRlYnVnIGh0bWwgZmlsZTogJCRACiAJJChoaWRlKSBta2RpciAtcCAkJChkaXIgJCRAKQotCSQoaGlkZSkgY2F0ICQkPCB8IGJ1aWxkL3Rvb2xzL3Byb2R1Y3RfZGVidWcucHkgPiAkJEAKKwkkKGhpZGUpIGNhdCAkJDwgfCBidWlsZC9tYWtlL3Rvb2xzL3Byb2R1Y3RfZGVidWcucHkgPiAkJEAKIGVuZGVmCiAKIHByb2R1Y3RfZGVidWdfZmlsZXM6PQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0Lm1rIGIvY29yZS9wcm9kdWN0Lm1rCmluZGV4IDQ2ODJkYWMuLjE5ZWRlODIgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJvZHVjdC5taworKysgYi9jb3JlL3Byb2R1Y3QubWsKQEAgLTg4LDYgKzg4LDcgQEAKICAgICBQUk9EVUNUX0JSQU5EIFwKICAgICBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyBcCiAgICAgUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUyBcCisgICAgUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMgXAogICAgIFBST0RVQ1RfQ0hBUkFDVEVSSVNUSUNTIFwKICAgICBQUk9EVUNUX0NPUFlfRklMRVMgXAogICAgIFBST0RVQ1RfT1RBX1BVQkxJQ19LRVlTIFwKQEAgLTEwMiw2ICsxMDMsNyBAQAogICAgIFBST0RVQ1RfU0RLX0FERE9OX0NPUFlfTU9EVUxFUyBcCiAgICAgUFJPRFVDVF9TREtfQURET05fRE9DX01PRFVMRVMgXAogICAgIFBST0RVQ1RfU0RLX0FERE9OX1NZU19JTUdfU09VUkNFX1BST1AgXAorICAgIFBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyBcCiAgICAgUFJPRFVDVF9ERUZBVUxUX1dJRklfQ0hBTk5FTFMgXAogICAgIFBST0RVQ1RfREVGQVVMVF9ERVZfQ0VSVElGSUNBVEUgXAogICAgIFBST0RVQ1RfUkVTVFJJQ1RfVkVORE9SX0ZJTEVTIFwKQEAgLTExMiwyNyArMTE0LDMzIEBACiAgICAgUFJPRFVDVF9TVVBQT1JUU19WRVJJVFkgXAogICAgIFBST0RVQ1RfU1VQUE9SVFNfVkVSSVRZX0ZFQyBcCiAgICAgUFJPRFVDVF9PRU1fUFJPUEVSVElFUyBcCisgICAgUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTIFwKICAgICBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUWV9CTEFDS0xJU1QgXAogICAgIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9BUFBTIFwKICAgICBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfSkFSUyBcCiAgICAgUFJPRFVDVF9BTFdBWVNfUFJFT1BUX0VYVFJBQ1RFRF9BUEsgXAogICAgIFBST0RVQ1RfREVYUFJFT1BUX1NQRUVEX0FQUFMgXAorICAgIFBST0RVQ1RfTE9BREVEX0JZX1BSSVZJTEVHRURfTU9EVUxFUyBcCiAgICAgUFJPRFVDVF9WQk9PVF9TSUdOSU5HX0tFWSBcCiAgICAgUFJPRFVDVF9WQk9PVF9TSUdOSU5HX1NVQktFWSBcCiAgICAgUFJPRFVDVF9WRVJJVFlfU0lHTklOR19LRVkgXAogICAgIFBST0RVQ1RfU1lTVEVNX1ZFUklUWV9QQVJUSVRJT04gXAogICAgIFBST0RVQ1RfVkVORE9SX1ZFUklUWV9QQVJUSVRJT04gXAorICAgIFBST0RVQ1RfUFJPRFVDVF9WRVJJVFlfUEFSVElUSU9OIFwKICAgICBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfREVCVUdfSU5GTyBcCiAgICAgUFJPRFVDVF9ERVhfUFJFT1BUX01PRFVMRV9DT05GSUdTIFwKKyAgICBQUk9EVUNUX0RFWF9QUkVPUFRfREVGQVVMVF9DT01QSUxFUl9GSUxURVIgXAogICAgIFBST0RVQ1RfREVYX1BSRU9QVF9ERUZBVUxUX0ZMQUdTIFwKICAgICBQUk9EVUNUX0RFWF9QUkVPUFRfQk9PVF9GTEFHUyBcCiAgICAgUFJPRFVDVF9ERVhfUFJFT1BUX1BST0ZJTEVfRElSIFwKICAgICBQUk9EVUNUX0RFWF9QUkVPUFRfQk9PVF9JTUFHRV9QUk9GSUxFX0xPQ0FUSU9OIFwKKyAgICBQUk9EVUNUX0RFWF9QUkVPUFRfR0VORVJBVEVfRE1fRklMRVMgXAogICAgIFBST0RVQ1RfVVNFX1BST0ZJTEVfRk9SX0JPT1RfSU1BR0UgXAogICAgIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9DT01QSUxFUl9GSUxURVIgXAogICAgIFBST0RVQ1RfU0FOSVRJWkVSX01PRFVMRV9DT05GSUdTIFwKICAgICBQUk9EVUNUX1NZU1RFTV9CQVNFX0ZTX1BBVEggXAogICAgIFBST0RVQ1RfVkVORE9SX0JBU0VfRlNfUEFUSCBcCisgICAgUFJPRFVDVF9QUk9EVUNUX0JBU0VfRlNfUEFUSCBcCiAgICAgUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgXAogICAgIFZFTkRPUl9QUk9EVUNUX1JFU1RSSUNUX1ZFTkRPUl9GSUxFUyBcCiAgICAgVkVORE9SX0VYQ0VQVElPTl9NT0RVTEVTIFwKQEAgLTE0Myw4ICsxNTEsMTEgQEAKICAgICBQUk9EVUNUX1NZU1RFTV9IRUFEUk9PTSBcCiAgICAgUFJPRFVDVF9NSU5JTUlaRV9KQVZBX0RFQlVHX0lORk8gXAogICAgIFBST0RVQ1RfSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTIFwKLQotCisgICAgUFJPRFVDVF9BREJfS0VZUyBcCisgICAgUFJPRFVDVF9DRklfSU5DTFVERV9QQVRIUyBcCisgICAgUFJPRFVDVF9DRklfRVhDTFVERV9QQVRIUyBcCisgICAgUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZX09WRVJSSURFIFwKKyAgICBQUk9EVUNUX0FDVElPTkFCTEVfQ09NUEFUSUJMRV9QUk9QRVJUWV9ESVNBQkxFIFwKIAogZGVmaW5lIGR1bXAtcHJvZHVjdAogJChpbmZvID09PT0gJCgxKSA9PT09KVwKQEAgLTI5OCwxNCArMzA5LDE1IEBACiAJQk9BUkRfRkxBU0hfQkxPQ0tfU0laRSBcCiAJQk9BUkRfVkVORE9SSU1BR0VfUEFSVElUSU9OX1NJWkUgXAogCUJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgXAorCUJPQVJEX1BST0RVQ1RJTUFHRV9QQVJUSVRJT05fU0laRSBcCisJQk9BUkRfUFJPRFVDVElNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgXAogCUJPQVJEX0lOU1RBTExFUl9DTURMSU5FIFwKIAogCiBfcHJvZHVjdF9zdGFzaF92YXJfbGlzdCArPSBcCiAJREVGQVVMVF9TWVNURU1fREVWX0NFUlRJRklDQVRFIFwKIAlXSVRIX0RFWFBSRU9QVCBcCi0JV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWSBcCi0JV0lUSF9ERVhQUkVPUFRfQVBQX0lNQUdFCisJV0lUSF9ERVhQUkVPUFRfQk9PVF9JTUdfQU5EX1NZU1RFTV9TRVJWRVJfT05MWQogCiAjCiAjIE1hcmsgdGhlIHZhcmlhYmxlcyBpbiBfcHJvZHVjdF9zdGFzaF92YXJfbGlzdCBhcyByZWFkb25seQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0X2NvbmZpZy5tayBiL2NvcmUvcHJvZHVjdF9jb25maWcubWsKaW5kZXggZjdhZTgzNC4uMjYyMGFkYiAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0X2NvbmZpZy5taworKysgYi9jb3JlL3Byb2R1Y3RfY29uZmlnLm1rCkBAIC04OCw3ICs4OCw3IEBACiAjIFByb3ZpZGUgIlBST0RVQ1QtPHByb2RuYW1lPi08Z29hbD4iIHRhcmdldHMsIHdoaWNoIGxldHMgeW91IGJ1aWxkCiAjIGEgcGFydGljdWxhciBjb25maWd1cmF0aW9uIHdpdGhvdXQgbmVlZGluZyB0byBzZXQgdXAgdGhlIGVudmlyb25tZW50LgogIwotaWZuZGVmIEtBVEkKK2lmZXEgKCQoQ0FMTEVEX0ZST01fU0VUVVApLHRydWUpCiBwcm9kdWN0X2dvYWxzIDo9ICQoc3RyaXAgJChmaWx0ZXIgUFJPRFVDVC0lLCQoTUFLRUNNREdPQUxTKSkpCiBpZmRlZiBwcm9kdWN0X2dvYWxzCiAgICMgU2NyYXBlIHRoZSBwcm9kdWN0IGFuZCBidWlsZCBuYW1lcyBvdXQgb2YgdGhlIGdvYWwsCkBAIC0xMjksMTQgKzEyOSwxNCBAQAogICAjIHBvc2l0aW9uLCBpbiBjYXNlIGl0IG1hdHRlcnMuCiAgIG92ZXJyaWRlIE1BS0VDTURHT0FMUyA6PSAkKHBhdHN1YnN0ICQoZ29hbF9uYW1lKSwkKGRlZmF1bHRfZ29hbF9zdWJzdGl0dXRpb24pLCQoTUFLRUNNREdPQUxTKSkKIGVuZGlmCi1lbmRpZiAjICFLQVRJCitlbmRpZiAjIENBTExFRF9GUk9NX1NFVFVQCiAjIGVsc2U6IFVzZSB0aGUgdmFsdWUgc2V0IGluIHRoZSBlbnZpcm9ubWVudCBvciBidWlsZHNwZWMubWsuCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFByb3ZpZGUgIkFQUC08YXBwbmFtZT4iIHRhcmdldHMsIHdoaWNoIGxldHMgeW91IGJ1aWxkCiAjIGFuIHVuYnVuZGxlZCBhcHAuCiAjCi1pZm5kZWYgS0FUSQoraWZlcSAoJChDQUxMRURfRlJPTV9TRVRVUCksdHJ1ZSkKIHVuYnVuZGxlZF9nb2FscyA6PSAkKHN0cmlwICQoZmlsdGVyIEFQUC0lLCQoTUFLRUNNREdPQUxTKSkpCiBpZmRlZiB1bmJ1bmRsZWRfZ29hbHMKICAgaWZuZXEgKCQod29yZHMgJCh1bmJ1bmRsZWRfZ29hbHMpKSwxKQpAQCAtMTUxLDYgKzE1MSwxMyBAQAogZW5kaWYgIyB1bmJ1bmRsZWRfZ29hbHMKIGVuZGlmCiAKKyMgTm93IHRoYXQgd2UndmUgcGFyc2VkIEFQUC0qIGFuZCBQUk9EVUNULSosIG1hcmsgdGhlc2UgYXMgcmVhZG9ubHkKK1RBUkdFVF9CVUlMRF9BUFBTID89CisuS0FUSV9SRUFET05MWSA6PSBcCisgIFRBUkdFVF9QUk9EVUNUIFwKKyAgVEFSR0VUX0JVSUxEX1ZBUklBTlQgXAorICBUQVJHRVRfQlVJTERfQVBQUworCiAjIERlZmF1bHQgdG8gYnVpbGRpbmcgZGFsdmlrdm0gb24gaG9zdHMgdGhhdCBzdXBwb3J0IGl0Li4uCiBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQogIyAuLi4gb3IgaWYgdGhlIGlmIHRoZSBvcHRpb24gaXMgYWxyZWFkeSBzZXQKQEAgLTI1OSw2ICsyNjYsNyBAQAogUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMgOj0gJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMpKQogUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMgOj0gJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMpKQogUFJPRFVDVF9ERVhQUkVPUFRfU1BFRURfQVBQUyA6PSAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0RFWFBSRU9QVF9TUEVFRF9BUFBTKSkKK1BST0RVQ1RfTE9BREVEX0JZX1BSSVZJTEVHRURfTU9EVUxFUyA6PSAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0xPQURFRF9CWV9QUklWSUxFR0VEX01PRFVMRVMpKQogCiAjIEFsbCBvZiB0aGUgYXBwcyB0aGF0IHdlIGZvcmNlIHByZW9wdCwgdGhpcyBvdmVycmlkZXMgV0lUSF9ERVhQUkVPUFQuCiBQUk9EVUNUX0FMV0FZU19QUkVPUFRfRVhUUkFDVEVEX0FQSyA6PSAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0FMV0FZU19QUkVPUFRfRVhUUkFDVEVEX0FQSykpCkBAIC0yOTUsMTUgKzMwMyw2IEBACiBQUk9EVUNUX0FBUFRfQ09ORklHIDo9IFwKICAgICAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoc3RyaXAgJChQUk9EVUNUX0FBUFRfQ09ORklHKSkpCiAKLSMgcHJvZHVjdC1zY29wZWQgYWFwdCBmbGFncwotUFJPRFVDVF9BQVBUX0ZMQUdTIDo9Ci1QUk9EVUNUX0FBUFQyX0NGTEFHUyA6PQotaWZuZXEgKCQoZmlsdGVyIGVuX1hBIGFyX1hCLCQoUFJPRFVDVF9MT0NBTEVTKSksKQotICAjIEZvcmNlIGdlbmVyYXRpbmcgcmVzb3VyY2VzIGZvciBwc2V1ZG8tbG9jYWxlcy4KLSAgUFJPRFVDVF9BQVBUMl9DRkxBR1MgKz0gLS1wc2V1ZG8tbG9jYWxpemUKLSAgUFJPRFVDVF9BQVBUX0ZMQUdTICs9IC0tcHNldWRvLWxvY2FsaXplCi1lbmRpZgotCiBQUk9EVUNUX0JSQU5EIDo9ICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfQlJBTkQpKQogCiBQUk9EVUNUX01PREVMIDo9ICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfTU9ERUwpKQpAQCAtMzM5LDcgKzMzOCw3IEBACiAjIFRoZSBmaWxlIGF0IHRoZSBzb3VyY2UgcGF0aCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBwYXRoCiAjIHdoZW4gYnVpbGRpbmcgIHRoaXMgcHJvZHVjdC4gIDxkZXN0aW5hdGlvbiBwYXRoPiBpcyByZWxhdGl2ZSB0bwogIyAkKFBST0RVQ1RfT1VUKSwgc28gaXQgc2hvdWxkIGxvb2sgbGlrZSwgZS5nLiwgInN5c3RlbS9ldGMvZmlsZS54bWwiLgotIyBUaGUgcnVsZXMgZm9yIHRoZXNlIGNvcHkgc3RlcHMgYXJlIGRlZmluZWQgaW4gYnVpbGQvY29yZS9NYWtlZmlsZS4KKyMgVGhlIHJ1bGVzIGZvciB0aGVzZSBjb3B5IHN0ZXBzIGFyZSBkZWZpbmVkIGluIGJ1aWxkL21ha2UvY29yZS9NYWtlZmlsZS4KICMgVGhlIG9wdGlvbmFsIDo8b3duZXI+IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIG93bmVyIG9mIGEgdmVuZG9yIGZpbGUuCiBQUk9EVUNUX0NPUFlfRklMRVMgOj0gXAogICAgICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfQ09QWV9GSUxFUykpCkBAIC0zNTksNiArMzU4LDIwIEBACiAgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUykpCiAuS0FUSV9SRUFET05MWSA6PSBQUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTCiAKKyMgQSBsaXN0IG9mIHByb3BlcnR5IGFzc2lnbm1lbnRzLCBsaWtlICJrZXkgPSB2YWx1ZSIsIHdpdGggemVybyBvciBtb3JlCisjIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgJz0nLgorIyB1c2VkIGZvciBhZGRpbmcgcHJvcGVydGllcyB0byBkZWZhdWx0LnByb3Agb2Ygc3lzdGVtIHBhcnRpdGlvbgorUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTIDo9IFwKKyAgICAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMpKQorLktBVElfUkVBRE9OTFkgOj0gUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTCisKKyMgQSBsaXN0IG9mIHByb3BlcnR5IGFzc2lnbm1lbnRzLCBsaWtlICJrZXkgPSB2YWx1ZSIsIHdpdGggemVybyBvciBtb3JlCisjIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgJz0nLgorIyB1c2VkIGZvciBhZGRpbmcgcHJvcGVydGllcyB0byBidWlsZC5wcm9wIG9mIHByb2R1Y3QgcGFydGl0aW9uCitQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUyA6PSBcCisgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMpKQorLktBVElfUkVBRE9OTFkgOj0gUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMKKwogIyBTaG91bGQgd2UgdXNlIHRoZSBkZWZhdWx0IHJlc291cmNlcyBvciBhZGQgYW55IHByb2R1Y3Qgc3BlY2lmaWMgb3ZlcmxheXMKIFBST0RVQ1RfUEFDS0FHRV9PVkVSTEFZUyA6PSBcCiAgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9QQUNLQUdFX09WRVJMQVlTKSkKQEAgLTM3OSw4ICszOTIsMTIgQEAKIFBST0RVQ1RfRVhUUkFfUkVDT1ZFUllfS0VZUyA6PSAkKHNvcnQgXAogICAgICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0VYVFJBX1JFQ09WRVJZX0tFWVMpKQogCitQUk9EVUNUX0RFWF9QUkVPUFRfREVGQVVMVF9DT01QSUxFUl9GSUxURVIgOj0gXAorICAgICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfREVYX1BSRU9QVF9ERUZBVUxUX0NPTVBJTEVSX0ZJTFRFUikpCiBQUk9EVUNUX0RFWF9QUkVPUFRfREVGQVVMVF9GTEFHUyA6PSBcCiAgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9ERVhfUFJFT1BUX0RFRkFVTFRfRkxBR1MpKQorUFJPRFVDVF9ERVhfUFJFT1BUX0dFTkVSQVRFX0RNX0ZJTEVTIDo9IFwKKyAgICAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0RFWF9QUkVPUFRfR0VORVJBVEVfRE1fRklMRVMpKQogUFJPRFVDVF9ERVhfUFJFT1BUX0JPT1RfRkxBR1MgOj0gXAogICAgICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfREVYX1BSRU9QVF9CT09UX0ZMQUdTKSkKIFBST0RVQ1RfREVYX1BSRU9QVF9QUk9GSUxFX0RJUiA6PSBcCkBAIC00NTYsMyArNDczLDMzIEBACiAjIFdoZXRoZXIgYW55IHBhdGhzIGFyZSBleGNsdWRlZCBmcm9tIHNhbml0aXphdGlvbiB3aGVuIFNBTklUSVpFX1RBUkdFVD1pbnRlZ2VyX292ZXJmbG93CiBQUk9EVUNUX0lOVEVHRVJfT1ZFUkZMT1dfRVhDTFVERV9QQVRIUyA6PSBcCiAgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9JTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpKQorCisjIEFEQiBrZXlzIGZvciBkZWJ1Z2dhYmxlIGJ1aWxkcworUFJPRFVDVF9BREJfS0VZUyA6PQoraWZuZXEgKCQoZmlsdGVyIGVuZyB1c2VyZGVidWcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpLCkKKyAgUFJPRFVDVF9BREJfS0VZUyA6PSAkKHN0cmlwICQoUFJPRFVDVFMuJChJTlRFUk5BTF9QUk9EVUNUKS5QUk9EVUNUX0FEQl9LRVlTKSkKK2VuZGlmCitpZm5lcSAoJChmaWx0ZXItb3V0IDAgMSwkKHdvcmRzICQoUFJPRFVDVF9BREJfS0VZUykpKSwpCisgICQoZXJyb3IgT25seSBvbmUgZmlsZSBtYXkgYmUgaW4gUFJPRFVDVF9BREJfS0VZUzogJChQUk9EVUNUX0FEQl9LRVlTKSkKK2VuZGlmCisuS0FUSV9SRUFET05MWSA6PSBQUk9EVUNUX0FEQl9LRVlTCisKKyMgV2hldGhlciBhbnkgcGF0aHMgYXJlIGV4Y2x1ZGVkIGZyb20gc2FuaXRpemF0aW9uIHdoZW4gU0FOSVRJWkVfVEFSR0VUPWNmaQorUFJPRFVDVF9DRklfRVhDTFVERV9QQVRIUyA6PSBcCisgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9DRklfRVhDTFVERV9QQVRIUykpCisKKyMgV2hldGhlciBhbnkgcGF0aHMgc2hvdWxkIGhhdmUgQ0ZJIGVuYWJsZWQgZm9yIGNvbXBvbmVudHMKK1BST0RVQ1RfQ0ZJX0lOQ0xVREVfUEFUSFMgOj0gXAorICAgICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfQ0ZJX0lOQ0xVREVfUEFUSFMpKQorCisjIHdoaWNoIFNvb25nIG5hbWVzcGFjZXMgdG8gZXhwb3J0IHRvIE1ha2UKK1BST0RVQ1RfU09PTkdfTkFNRVNQQUNFUyA6PSBcCisgICAgJChzdHJpcCAkKFBST0RVQ1RTLiQoSU5URVJOQUxfUFJPRFVDVCkuUFJPRFVDVF9TT09OR19OQU1FU1BBQ0VTKSkKKworIyBBIGZsYWcgdG8gb3ZlcnJpZGUgUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZCitQUk9EVUNUX0NPTVBBVElCTEVfUFJPUEVSVFlfT1ZFUlJJREUgOj0gXAorICAgICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfQ09NUEFUSUJMRV9QUk9QRVJUWV9PVkVSUklERSkpCisKKyMgV2hldGhlciB0aGUgd2hpdGVsaXN0IG9mIGFjdGlvbmFibGUgY29tcGF0aWJsZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkaXNhYmxlZCBvciBub3QKK1BST0RVQ1RfQUNUSU9OQUJMRV9DT01QQVRJQkxFX1BST1BFUlRZX0RJU0FCTEUgOj0gXAorICAgICQoc3RyaXAgJChQUk9EVUNUUy4kKElOVEVSTkFMX1BST0RVQ1QpLlBST0RVQ1RfQUNUSU9OQUJMRV9DT01QQVRJQkxFX1BST1BFUlRZX0RJU0FCTEUpKQpkaWZmIC0tZ2l0IGEvY29yZS9wcm9ndWFyZC5lbW1hLmZsYWdzIGIvY29yZS9wcm9ndWFyZC5lbW1hLmZsYWdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjk0MDg2Li4wMDAwMDAwCi0tLSBhL2NvcmUvcHJvZ3VhcmQuZW1tYS5mbGFncworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBLZWVwIGV2ZXJ5dGhpbmcgZm9yIHRoZSBlbW1hIGNsYXNzZXMKLS1rZWVwIGNsYXNzIGNvbS52bGFkaXVtLioqIHsKLSAgKjsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvcHJvZ3VhcmRfdGVzdHMuZmxhZ3MgYi9jb3JlL3Byb2d1YXJkX3Rlc3RzLmZsYWdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjg0MGJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvcHJvZ3VhcmRfdGVzdHMuZmxhZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIEtlZXAgZXZlcnl0aGluZyBmb3IgdGVzdHMKLSMgVGhpcyBmbGFnIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBtYWtlZmlsZXMgYW5kIGlzIHNldCBmb3IgdGVzdHMgYnkgZGVmYXVsdC4KLSMtZG9udHNocmluawotCi0jIEJ1dCB3ZSBtYXkgd2FudCB0byBvYmZ1c2NhdGUgaWYgdGhlIG1haW4gYXBwIGdldHMgb2JmdXNjYXRlZC4KLSMgVGhpcyBmbGFnIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBtYWtlZmlsZXMuCi0jLWRvbnRvYmZ1c2NhdGUKLQotIy1rZWVwIGNsYXNzICogZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewotIyAgcHVibGljIHZvaWQgdGVzdCooKTsKLSN9Ci0KLSMta2VlcGNsYXNzZXN3aXRobWVtYmVycyBjbGFzcyAqIHsKLSMgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW4oKTsKLSMgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKTsKLSN9Ci0KLSMgc29tZSBBbGxUZXN0cyBkb24ndCBpbmNsdWRlIHJ1bigpLgotIy1rZWVwY2xhc3Nlc3dpdGhtZW1iZXJzIGNsYXNzICogewotIyAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpOwotI30KLQotIy1rZWVwIGNsYXNzICogZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlCi0jLWtlZXAgY2xhc3MgKiBleHRlbmRzIGFuZHJvaWQuYXBwLkluc3RydW1lbnRhdGlvbgotIy1rZWVwIGNsYXNzICogZXh0ZW5kcyBhbmRyb2lkLnRlc3QuVGVzdFN1aXRlUHJvdmlkZXIKLQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsgYi9jb3JlL3Byb2plY3RfZGVmaW5pdGlvbnMubWsKc2ltaWxhcml0eSBpbmRleCA2OCUKY29weSBmcm9tIHRhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L0JvYXJkQ29uZmlnLm1rCmNvcHkgdG8gY29yZS9wcm9qZWN0X2RlZmluaXRpb25zLm1rCmluZGV4IDAxNjkzN2EuLjY4NTcyZWIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L0JvYXJkQ29uZmlnLm1rCisrKyBiL2NvcmUvcHJvamVjdF9kZWZpbml0aW9ucy5tawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEwICsxNCwxMSBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW5jbHVkZSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5taworIworIyBBbGxvdyBwcm9qZWN0cyB0byBkZWZpbmUgdGhlaXIgb3duIGdsb2JhbGx5LWF2YWlsYWJsZSB2YXJpYWJsZXMuCisjCiAKLVRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjV0ZQotVEFSR0VUX0NQVV9BQkkgOj0gYXJtZWFiaQotVEFSR0VUX0NQVV9BQkkyIDo9Ci0KLVdJVEhfREVYUFJFT1BUIDo9IGZhbHNlCisjCisjIEluY2x1ZGUgZGVmaW5pdGlvbnMgZm9yIFN1cHBvcnQgTGlicmFyeSBtb2R1bGVzLCBpZiBwcmVzZW50LgorIworLWluY2x1ZGUgcHJlYnVpbHRzL3Nkay9jdXJyZW50L3N1cHBvcnQvZGVmaW5pdGlvbnMubWsKZGlmZiAtLWdpdCBhL2NvcmUvcm9vdC5tayBiL2NvcmUvcm9vdC5tawppbmRleCA2YzhmNzk1Li4xZWY5YWNhIDEwMDY0NAotLS0gYS9jb3JlL3Jvb3QubWsKKysrIGIvY29yZS9yb290Lm1rCkBAIC0xLDMgKzEsMyBAQAogIyMjIERPIE5PVCBFRElUIFRISVMgRklMRSAjIyMKLWluY2x1ZGUgYnVpbGQvY29yZS9tYWluLm1rCitpbmNsdWRlIGJ1aWxkL21ha2UvY29yZS9tYWluLm1rCiAjIyMgRE8gTk9UIEVESVQgVEhJUyBGSUxFICMjIwpkaWZmIC0tZ2l0IGEvY29yZS9zZGtfY2hlY2subWsgYi9jb3JlL3Nka19jaGVjay5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDlmYzdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zZGtfY2hlY2subWsKQEAgLTAsMCArMSwzNyBAQAorCisjIEVuZm9yY2VtZW50IGNoZWNrcyB0aGF0IExPQ0FMX1NES19WRVJTSU9OIGFuZCBMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgYXJlCisjIHNldCBjb3JyZWN0bHkuCisjIFNob3VsZCBiZSBpbmNsdWRlZCBieSBqYXZhIHRhcmdldHMgdGhhdCBhbGxvdyBzcGVjaWZ5aW5nIExPQ0FMX1NES19WRVJTSU9OLgorIyBUaGUgSkFWQV9TREtfRU5GT1JDRU1FTlRfV0FSTklORyBhbmQgSkFWQV9TREtfRU5GT1JDRU1FTlRfRVJST1IgdmFyaWFibGVzIG1heQorIyBiZSBzZXQgdG8gYSBwYXJ0aWN1bGFyIG1vZHVsZSBjbGFzcyB0byBlbmFibGUgd2FybmluZ3MgYW5kIGVycm9ycyBmb3IgdGhhdAorIyBzdWJ0eXBlLgorCit3aGl0ZWxpc3RlZF9tb2R1bGVzIDo9IGZyYW1ld29yay1yZXNfX2F1dG9fZ2VuZXJhdGVkX3JybworCisKK2lmZXEgKCwkKEpBVkFfU0RLX0VORk9SQ0VNRU5UX0VSUk9SKSkKKyAgSkFWQV9TREtfRU5GT1JDRU1FTlRfRVJST1IgOj0gQVBQUworZW5kaWYKKworaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTikkKExPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyksKQorICBpZmVxICgsJChmaWx0ZXIgJChMT0NBTF9NT0RVTEUpLCQod2hpdGVsaXN0ZWRfbW9kdWxlcykpKQorICAgIGlmbmVxICgkKEpBVkFfU0RLX0VORk9SQ0VNRU5UX1dBUk5JTkcpJChKQVZBX1NES19FTkZPUkNFTUVOVF9FUlJPUiksKQorICAgICAgbXlfbWVzc2FnZSA6PSBNdXN0IHNwZWNpZnkgTE9DQUxfU0RLX1ZFUlNJT04gb3IgTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTLAorICAgICAgaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLCQoSkFWQV9TREtfRU5GT1JDRU1FTlRfRVJST1IpKQorICAgICAgICAkKGNhbGwgcHJldHR5LWVycm9yLCQobXlfbWVzc2FnZSkpCisgICAgICBlbmRpZgorICAgICAgaWZlcSAoJChMT0NBTF9NT0RVTEVfQ0xBU1MpLCQoSkFWQV9TREtfRU5GT1JDRU1FTlRfV0FSTklORykpCisgICAgICAgICQoY2FsbCBwcmV0dHktd2FybmluZywkKG15X21lc3NhZ2UpKQorICAgICAgZW5kaWYKKyAgICAgIG15X21lc3NhZ2UgOj0KKyAgICBlbmRpZgorICBlbmRpZgorZWxzZSBpZm5lcSAoJChMT0NBTF9TREtfVkVSU0lPTiksKQorICBpZm5lcSAoJChMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMpLCkKKyAgICBteV9tZXNzYWdlIDo9IFNwZWNpZmllcyBib3RoIExPQ0FMX1NES19WRVJTSU9OICgkKExPQ0FMX1NES19WRVJTSU9OKSkgYW5kCisgICAgbXlfbWVzc2FnZSArPSBMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgKCQoTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTKSkKKyAgICBteV9tZXNzYWdlICs9IGJ1dCBzaG91bGQgc3BlY2lmeSBvbmx5IG9uZQorICAgICQoY2FsbCBwcmV0dHktZXJyb3IsJChteV9tZXNzYWdlKSkKKyAgICBteV9tZXNzYWdlIDo9CisgIGVuZGlmCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zZXR1cF9vbmVfb2RleC5tayBiL2NvcmUvc2V0dXBfb25lX29kZXgubWsKaW5kZXggZjBmZmU4MS4uZTBkOTkyNiAxMDA2NDQKLS0tIGEvY29yZS9zZXR1cF9vbmVfb2RleC5taworKysgYi9jb3JlL3NldHVwX29uZV9vZGV4Lm1rCkBAIC0zMiw2ICszMiwxMCBAQAogICAgICQoREVYUFJFT1BUX09ORV9GSUxFX0RFUEVOREVOQ1lfVE9PTFMpIFwKICAgICAkKG15X2RleF9wcmVvcHRfaW1hZ2VfZmlsZW5hbWUpCiAKKyMgUGFzcyBzcGVjaWFsIGNsYXNzIGxvYWRlciBjb250ZXh0IHRvIHNraXAgdGhlIGNsYXNzcGF0aCBhbmQgY29sbGlzaW9uIGNoZWNrLgorIyBTaG91bGQgbW9kaWZ5IGJ1aWxkIHN5c3RlbSB0byBwYXNzIHVzZWQgbGlicmFyaWVzIHByb3Blcmx5IGxhdGVyLgorJChteV9idWlsdF9vZGV4KTogUFJJVkFURV9ERVgyT0FUX0NMQVNTX0xPQURFUl9DT05URVhUIDo9IFwmCisKIG15X2luc3RhbGxlZF9vZGV4IDo9ICQoY2FsbCBnZXQtb2RleC1pbnN0YWxsZWQtZmlsZS1wYXRoLCQoJChteV8ybmRfYXJjaF9wcmVmaXgpREVYMk9BVF9UQVJHRVRfQVJDSCksJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKSkKIAogbXlfYnVpbHRfdmRleCA6PSAkKHBhdHN1YnN0ICUub2RleCwlLnZkZXgsJChteV9idWlsdF9vZGV4KSkKZGlmZiAtLWdpdCBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsgYi9jb3JlL3NoYXJlZF9saWJyYXJ5X2ludGVybmFsLm1rCmluZGV4IDY4NzUzNmIuLmFiODg3ZTAgMTAwNjQ0Ci0tLSBhL2NvcmUvc2hhcmVkX2xpYnJhcnlfaW50ZXJuYWwubWsKKysrIGIvY29yZS9zaGFyZWRfbGlicmFyeV9pbnRlcm5hbC5tawpAQCAtMjAsNyArMjAsOSBAQAogJChlcnJvciAkKExPQ0FMX1BBVEgpOiBDYW5ub3Qgc2V0IG1vZHVsZSBzdGVtIGZvciBhIGxpYnJhcnkpCiBlbmRpZgogCitpZmRlZiB0YXJnZXQtc2hhcmVkLWxpYnJhcnktaG9vawogJChjYWxsIHRhcmdldC1zaGFyZWQtbGlicmFyeS1ob29rKQorZW5kaWYKIAogc2tpcF9idWlsZF9mcm9tX3NvdXJjZSA6PQogaWZkZWYgTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUKZGlmZiAtLWdpdCBhL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rIGIvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkMWVmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc29vbmdfYXBwX3ByZWJ1aWx0Lm1rCkBAIC0wLDAgKzEsMTAzIEBACisjIEFwcCBwcmVidWlsdCBjb21pbmcgZnJvbSBTb29uZy4KKyMgRXh0cmEgaW5wdXRzOgorIyBMT0NBTF9TT09OR19SRVNPVVJDRV9FWFBPUlRfUEFDS0FHRQorCitpZm5lcSAoJChMT0NBTF9NT0RVTEVfTUFLRUZJTEUpLCQoU09PTkdfQU5EUk9JRF9NSykpCisgICQoY2FsbCBwcmV0dHktZXJyb3Isc29vbmdfYXBwX3ByZWJ1aWx0Lm1rIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBTb29uZykKK2VuZGlmCisKK0xPQ0FMX01PRFVMRV9TVUZGSVggOj0gLmFwaworTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gcGFja2FnZS5hcGsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZnVsbF9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgorZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1wcmUtcHJvZ3VhcmQuamFyCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKKworJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfQ0xBU1NFU19KQVIpLCQoZnVsbF9jbGFzc2VzX2phcikpKQorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfQ0xBU1NFU19KQVIpLCQoZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIpKSkKKworaWZkZWYgTE9DQUxfU09PTkdfSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0pBUgorICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19KQUNPQ09fUkVQT1JUX0NMQVNTRVNfSkFSKSxcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjb2NvLXJlcG9ydC1jbGFzc2VzLmphcikpCisgICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKExPQ0FMX0JVSUxUX01PRFVMRSksXAorICAgICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY29jby1yZXBvcnQtY2xhc3Nlcy5qYXIpCitlbmRpZgorCitpZmRlZiBMT0NBTF9TT09OR19QUk9HVUFSRF9ESUNUCisgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX1BST0dVQVJEX0RJQ1QpLFwKKyAgICAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9wcm9ndWFyZF9kaWN0aW9uYXJ5KSkKKyAgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSxcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcHJvZ3VhcmRfZGljdGlvbmFyeSkKK2VuZGlmCisKK2lmbmVxICgkKFRVUkJJTkVfRElTQUJMRUQpLGZhbHNlKQoraWZkZWYgTE9DQUxfU09PTkdfSEVBREVSX0pBUgorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfSEVBREVSX0pBUiksJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcikpKQorZWxzZQorJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoZnVsbF9jbGFzc2VzX2phciksJChmdWxsX2NsYXNzZXNfaGVhZGVyX2phcikpKQorZW5kaWYKK2VuZGlmICMgVFVSQklORV9ESVNBQkxFRCAhPSBmYWxzZQorCisKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQorCitpZmRlZiBMT0NBTF9TT09OR19SRVNPVVJDRV9FWFBPUlRfUEFDS0FHRQorcmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvcGFja2FnZS1leHBvcnQuYXBrCityZXNvdXJjZV9leHBvcnRfc3RhbXAgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvc3JjL1Iuc3RhbXAKKworJChyZXNvdXJjZV9leHBvcnRfcGFja2FnZSk6IFBSSVZBVEVfU1RBTVAgOj0gJChyZXNvdXJjZV9leHBvcnRfc3RhbXApCiskKHJlc291cmNlX2V4cG9ydF9wYWNrYWdlKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKHJlc291cmNlX2V4cG9ydF9zdGFtcCkKKyQocmVzb3VyY2VfZXhwb3J0X3BhY2thZ2UpOiAkKExPQ0FMX1NPT05HX1JFU09VUkNFX0VYUE9SVF9QQUNLQUdFKQorCUBlY2hvICJDb3B5OiAkJEAiCisJJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQorCXRvdWNoICQoUFJJVkFURV9TVEFNUCkKKworZW5kaWYgIyBMT0NBTF9TT09OR19SRVNPVVJDRV9FWFBPUlRfUEFDS0FHRQorCitqYXZhLWRleDogJChMT0NBTF9TT09OR19ERVhfSkFSKQorCitpZmRlZiBMT0NBTF9ERVhfUFJFT1BUCisjIGRlZmluZXMgYnVpbHRfb2RleCBhbG9uZyB3aXRoIHJ1bGUgdG8gaW5zdGFsbCBvZGV4CitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5taworCiskKGJ1aWx0X29kZXgpOiAkKExPQ0FMX1NPT05HX0RFWF9KQVIpCisJJChjYWxsIGRleHByZW9wdC1vbmUtZmlsZSwkPCwkQCkKK2VuZGlmCisKK1BBQ0tBR0VTIDo9ICQoUEFDS0FHRVMpICQoTE9DQUxfTU9EVUxFKQoraWZkZWYgTE9DQUxfQ0VSVElGSUNBVEUKKyAgUEFDS0FHRVMuJChMT0NBTF9NT0RVTEUpLkNFUlRJRklDQVRFIDo9ICQoTE9DQUxfQ0VSVElGSUNBVEUpCisgIFBBQ0tBR0VTLiQoTE9DQUxfTU9EVUxFKS5QUklWQVRFX0tFWSA6PSAkKHBhdHN1YnN0ICUueDUwOS5wZW0sJS5wazgsJChMT0NBTF9DRVJUSUZJQ0FURSkpCitlbmRpZgorCitpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKK2lmZXEgKCQoTE9DQUxfU0RLX1ZFUlNJT04pLHN5c3RlbV9jdXJyZW50KQorbXlfbGlua190eXBlIDo9IGphdmE6c3lzdGVtCitlbHNlIGlmbmVxICgkKExPQ0FMX1NES19WRVJTSU9OKSwpCitteV9saW5rX3R5cGUgOj0gamF2YTpzZGsKK2Vsc2UKK215X2xpbmtfdHlwZSA6PSBqYXZhOnBsYXRmb3JtCitlbmRpZgorIyB3YXJuL2FsbG93ZWQgdHlwZXMgYXJlIGJvdGggZW1wdHkgYmVjYXVzZSBTb29uZyBtb2R1bGVzIGNhbid0IGRlcGVuZCBvbgorIyBtYWtlLWRlZmluZWQgbW9kdWxlcy4KK215X3dhcm5fdHlwZXMgOj0KK215X2FsbG93ZWRfdHlwZXMgOj0KKworbXlfbGlua19kZXBzIDo9CitteV8ybmRfYXJjaF9wcmVmaXggOj0gJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKQorbXlfY29tbW9uIDo9IENPTU1PTgoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbGlua190eXBlLm1rCitlbmRpZiAjICFMT0NBTF9JU19IT1NUX01PRFVMRQorCitpZmRlZiBMT0NBTF9TT09OR19SUk9fRElSUworICAkKGNhbGwgYXBwZW5kX2VuZm9yY2VfcnJvX3NvdXJjZXMsIFwKKyAgICAgICQobXlfcmVnaXN0ZXJfbmFtZSksIFwKKyAgICAgIGZhbHNlLCBcCisgICAgICAkKExPQ0FMX0ZVTExfTUFOSUZFU1RfRklMRSksIFwKKyAgICAgICQoTE9DQUxfRVhQT1JUX1BBQ0tBR0VfUkVTT1VSQ0VTKSwgXAorICAgICAgJChMT0NBTF9TT09OR19SUk9fRElSUykpCitlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19jb25maWcubWsgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawppbmRleCBjZGQyODk2Li5iZjUwMzRiIDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2NvbmZpZy5taworKysgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawpAQCAtMTMsNiArMTMsNyBAQAogZW5kaWYKIGVuZGlmCiAKK2lmZXEgKCQoV1JJVEVfU09PTkdfVkFSSUFCTEVTKSx0cnVlKQogIyBDb252ZXJ0cyBhIGxpc3QgdG8gYSBKU09OIGxpc3QuCiAjICQxOiBMaXN0IHNlcGFyYXRvci4KICMgJDI6IExpc3QuCkBAIC0yNCw3NSArMjUsMTM5IEBACiAjIENvbnZlcnRzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QgdG8gYSBKU09OIGxpc3QuCiBjc3ZfdG9fanNvbl9saXN0ID0gJChjYWxsIF9qc29uX2xpc3QsJChjb21tYSksJCgxKSkKIAorIyAxOiBLZXkgbmFtZQorIyAyOiBWYWx1ZQorYWRkX2pzb25fdmFsID0gJChldmFsIF9jb250ZW50cyA6PSAkJChfY29udGVudHMpICAgICIkJChzdHJpcCAkJCgxKSkiOiQkKHNwYWNlKSQkKHN0cmlwICQkKDIpKSQkKGNvbW1hKSQkKG5ld2xpbmUpKQorYWRkX2pzb25fc3RyID0gJChjYWxsIGFkZF9qc29uX3ZhbCwkKDEpLCIkKHN0cmlwICQoMikpIikKK2FkZF9qc29uX2xpc3QgPSAkKGNhbGwgYWRkX2pzb25fdmFsLCQoMSksJChjYWxsIGpzb25fbGlzdCwkKHBhdHN1YnN0ICUsJSwkKDIpKSkpCithZGRfanNvbl9jc3YgPSAkKGNhbGwgYWRkX2pzb25fdmFsLCQoMSksJChjYWxsIGNzdl90b19qc29uX2xpc3QsJChzdHJpcCAkKDIpKSkpCithZGRfanNvbl9ib29sID0gJChjYWxsIGFkZF9qc29uX3ZhbCwkKDEpLCQoaWYgJChzdHJpcCAkKDIpKSx0cnVlLGZhbHNlKSkKKworaW52ZXJ0X2Jvb2wgPSAkKGlmICQoc3RyaXAgJCgxKSksLHRydWUpCisKICMgQ3JlYXRlIHNvb25nLnZhcmlhYmxlcyB3aXRoIGNvcGllcyBvZiBtYWtlZmlsZSBzZXR0aW5ncy4gIFJ1bnMgZXZlcnkgYnVpbGQsCiAjIGJ1dCBvbmx5IHVwZGF0ZXMgc29vbmcudmFyaWFibGVzIGlmIGl0IGNoYW5nZXMKLVNPT05HX1ZBUklBQkxFU19UTVAgOj0gJChTT09OR19WQVJJQUJMRVMpLiQkJCQKLSQoU09PTkdfVkFSSUFCTEVTKTogRk9SQ0UKLQkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotCSQoaGlkZSkgKFwKLQllY2hvICd7JzsgXAotCWVjaG8gJyAgICAiTWFrZV9zdWZmaXgiOiAiLSQoVEFSR0VUX1BST0RVQ1QpIiwnOyBcCi0JZWNobyAnJzsgXAotCWVjaG8gJyAgICAiUGxhdGZvcm1fc2RrX3ZlcnNpb24iOiAkKFBMQVRGT1JNX1NES19WRVJTSU9OKSwnOyBcCi0JZWNobyAnICAgICJQbGF0Zm9ybV92ZXJzaW9uX2FsbF9jb2RlbmFtZXMiOiAkKGNhbGwgY3N2X3RvX2pzb25fbGlzdCwkKFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUykpLCc7IFwKLQllY2hvICcgICAgIlVuYnVuZGxlZF9idWlsZCI6ICQoaWYgJChUQVJHRVRfQlVJTERfQVBQUyksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiQnJpbGxvIjogJChpZiAkKEJSSUxMTyksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiTWFsbG9jX25vdF9zdmVsdGUiOiAkKGlmICQoZmlsdGVyIHRydWUsJChNQUxMT0NfU1ZFTFRFKSksZmFsc2UsdHJ1ZSksJzsgXAotCWVjaG8gJyAgICAiQWxsb3dfbWlzc2luZ19kZXBlbmRlbmNpZXMiOiAkKGlmICQoQUxMT1dfTUlTU0lOR19ERVBFTkRFTkNJRVMpLHRydWUsZmFsc2UpLCc7IFwKLQllY2hvICcgICAgIlNhbml0aXplSG9zdCI6ICQoY2FsbCBqc29uX2xpc3QsJChTQU5JVElaRV9IT1NUKSksJzsgXAotCWVjaG8gJyAgICAiU2FuaXRpemVEZXZpY2UiOiAkKGNhbGwganNvbl9saXN0LCQoU0FOSVRJWkVfVEFSR0VUKSksJzsgXAotCWVjaG8gJyAgICAiU2FuaXRpemVEZXZpY2VEaWFnIjogJChjYWxsIGpzb25fbGlzdCwkKFNBTklUSVpFX1RBUkdFVF9ESUFHKSksJzsgXAotCWVjaG8gJyAgICAiU2FuaXRpemVEZXZpY2VBcmNoIjogJChjYWxsIGpzb25fbGlzdCwkKFNBTklUSVpFX1RBUkdFVF9BUkNIKSksJzsgXAotCWVjaG8gJyAgICAiSG9zdFN0YXRpY0JpbmFyaWVzIjogJChpZiAkKHN0cmlwICQoQlVJTERfSE9TVF9zdGF0aWMpKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJCaW5kZXIzMmJpdCI6ICQoaWYgJChCSU5ERVIzMkJJVCksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiRGV2aWNlUHJlZmVyMzJCaXRFeGVjdXRhYmxlcyI6ICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9QUkVGRVJfMzJfQklUX0VYRUNVVEFCTEVTKSksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiVXNlR29tYSI6ICQoaWYgJChmaWx0ZXItb3V0IGZhbHNlLCQoVVNFX0dPTUEpKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJEZWJ1Z2dhYmxlIjogJChpZiAkKGZpbHRlciB1c2VyZGVidWcgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJFbmciOiAkKGlmICQoZmlsdGVyIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiVmVuZG9yUGF0aCI6ICIkKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpIiwnOyBcCi0JZWNobyAnJzsgXAotCWVjaG8gJyAgICAiQ2xhbmdUaWR5IjogJChpZiAkKGZpbHRlciAxIHRydWUsJChXSVRIX1RJRFkpKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJUaWR5Q2hlY2tzIjogIiQoV0lUSF9USURZX0NIRUNLUykiLCc7IFwKLQllY2hvICcnOyBcCi0JZWNobyAnICAgICJOYXRpdmVDb3ZlcmFnZSI6ICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKE5BVElWRV9DT1ZFUkFHRSkpLHRydWUsZmFsc2UpLCc7IFwKLQllY2hvICcgICAgIkNvdmVyYWdlUGF0aHMiOiAkKGNhbGwgY3N2X3RvX2pzb25fbGlzdCwkKENPVkVSQUdFX1BBVEhTKSksJzsgXAotCWVjaG8gJyAgICAiQ292ZXJhZ2VFeGNsdWRlUGF0aHMiOiAkKGNhbGwgY3N2X3RvX2pzb25fbGlzdCwkKENPVkVSQUdFX0VYQ0xVREVfUEFUSFMpKSwnOyBcCi0JZWNobyAnJzsgXAotCWVjaG8gJyAgICAiRGV2aWNlTmFtZSI6ICIkKFRBUkdFVF9ERVZJQ0UpIiwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VBcmNoIjogIiQoVEFSR0VUX0FSQ0gpIiwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VBcmNoVmFyaWFudCI6ICIkKFRBUkdFVF9BUkNIX1ZBUklBTlQpIiwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VDcHVWYXJpYW50IjogIiQoVEFSR0VUX0NQVV9WQVJJQU5UKSIsJzsgXAotCWVjaG8gJyAgICAiRGV2aWNlQWJpIjogWyIkKFRBUkdFVF9DUFVfQUJJKSIsICIkKFRBUkdFVF9DUFVfQUJJMikiXSwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VVc2VzQ2xhbmciOiAkKGlmICQoVVNFX0NMQU5HX1BMQVRGT1JNX0JVSUxEKSwkKFVTRV9DTEFOR19QTEFURk9STV9CVUlMRCksZmFsc2UpLCc7IFwKLQllY2hvICcgICAgIkRldmljZVZuZGtWZXJzaW9uIjogIiQoQk9BUkRfVk5ES19WRVJTSU9OKSIsJzsgXAotCWVjaG8gJyc7IFwKLQllY2hvICcgICAgIkRldmljZVNlY29uZGFyeUFyY2giOiAiJChUQVJHRVRfMk5EX0FSQ0gpIiwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VTZWNvbmRhcnlBcmNoVmFyaWFudCI6ICIkKFRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UKSIsJzsgXAotCWVjaG8gJyAgICAiRGV2aWNlU2Vjb25kYXJ5Q3B1VmFyaWFudCI6ICIkKFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQpIiwnOyBcCi0JZWNobyAnICAgICJEZXZpY2VTZWNvbmRhcnlBYmkiOiBbIiQoVEFSR0VUXzJORF9DUFVfQUJJKSIsICIkKFRBUkdFVF8yTkRfQ1BVX0FCSTIpIl0sJzsgXAotCWVjaG8gJyc7IFwKLQllY2hvICcgICAgIkhvc3RBcmNoIjogIiQoSE9TVF9BUkNIKSIsJzsgXAotCWVjaG8gJyAgICAiSG9zdFNlY29uZGFyeUFyY2giOiAiJChIT1NUXzJORF9BUkNIKSIsJzsgXAotCWVjaG8gJyc7IFwKLQllY2hvICcgICAgIkNyb3NzSG9zdCI6ICIkKEhPU1RfQ1JPU1NfT1MpIiwnOyBcCi0JZWNobyAnICAgICJDcm9zc0hvc3RBcmNoIjogIiQoSE9TVF9DUk9TU19BUkNIKSIsJzsgXAotCWVjaG8gJyAgICAiQ3Jvc3NIb3N0U2Vjb25kYXJ5QXJjaCI6ICIkKEhPU1RfQ1JPU1NfMk5EX0FSQ0gpIiwnOyBcCi0JZWNobyAnICAgICJTYWZlc3RhY2siOiAkKGlmICQoZmlsdGVyIHRydWUsJChVU0VfU0FGRVNUQUNLKSksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiRW5hYmxlQ0ZJIjogJChpZiAkKGZpbHRlciBmYWxzZSwkKEVOQUJMRV9DRkkpKSxmYWxzZSx0cnVlKSwnOyBcCi0JZWNobyAnICAgICJJbnRlZ2VyT3ZlcmZsb3dFeGNsdWRlUGF0aHMiOiAkKGNhbGwganNvbl9saXN0LCQoSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTKSAkKFBST0RVQ1RfSU5URUdFUl9PVkVSRkxPV19FWENMVURFX1BBVEhTKSksJzsgXAotCWVjaG8gJyAgICAiRGV2aWNlX3VzZXNfaHdjMiI6ICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VTX0hXQzIpKSx0cnVlLGZhbHNlKSwnOyBcCi0JZWNobyAnICAgICJPdmVycmlkZV9yc19kcml2ZXIiOiAiJChPVkVSUklERV9SU19EUklWRVIpIiwnOyBcCi0JZWNobyAnICAgICJUcmVibGUiOiAkKGlmICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0ZVTExfVFJFQkxFKSksdHJ1ZSxmYWxzZSksJzsgXAotCWVjaG8gJyAgICAiUGRrIjogJChpZiAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX0JVSUxEX1BESykpLHRydWUsZmFsc2UpLCc7IFwKLQllY2hvICcnOyBcCi0JZWNobyAnICAgICJBcnRVc2VSZWFkQmFycmllciI6ICQoaWYgJChmaWx0ZXIgZmFsc2UsJChQUk9EVUNUX0FSVF9VU0VfUkVBRF9CQVJSSUVSKSksZmFsc2UsdHJ1ZSksJzsgXAotCWVjaG8gJyc7IFwKLQllY2hvICcgICAgIkJ0Q29uZmlnSW5jbHVkZURpciI6ICIkKEJPQVJEX0JMVUVUT09USF9CRFJPSURfQlVJTERDRkdfSU5DTFVERV9ESVIpIiwnOyBcCi0JZWNobyAnJzsgXAotCWVjaG8gJyAgICAiRGV2aWNlS2VybmVsSGVhZGVycyI6ICQoY2FsbCBqc29uX2xpc3QsJChzdHJpcCAkKFRBUkdFVF9QUk9KRUNUX1NZU1RFTV9JTkNMVURFUykpKSc7IFwKLQllY2hvICd9JykgPiAkKFNPT05HX1ZBUklBQkxFU19UTVApOyBcCi0JaWYgISBjbXAgLXMgJChTT09OR19WQVJJQUJMRVNfVE1QKSAkKFNPT05HX1ZBUklBQkxFUyk7IHRoZW4gXAotCSAgbXYgJChTT09OR19WQVJJQUJMRVNfVE1QKSAkKFNPT05HX1ZBUklBQkxFUyk7IFwKKyQoc2hlbGwgbWtkaXIgLXAgJChkaXIgJChTT09OR19WQVJJQUJMRVMpKSkKK19jb250ZW50cyA6PSB7JChuZXdsaW5lKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgTWFrZV9zdWZmaXgsIC0kKFRBUkdFVF9QUk9EVUNUKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ1aWxkSWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCVUlMRF9JRCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgQnVpbGROdW1iZXJGcm9tRmlsZSwgICAgICAgICAgICAgICAkJCQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkpCisKKyQoY2FsbCBhZGRfanNvbl92YWwsICBQbGF0Zm9ybV9zZGtfdmVyc2lvbiwgICAgICAgICAgICAgICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pKQorJChjYWxsIGFkZF9qc29uX2NzdiwgIFBsYXRmb3JtX3ZlcnNpb25fYWN0aXZlX2NvZGVuYW1lcywgJChQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMpKQorJChjYWxsIGFkZF9qc29uX2NzdiwgIFBsYXRmb3JtX3ZlcnNpb25fZnV0dXJlX2NvZGVuYW1lcywgJChQTEFURk9STV9WRVJTSU9OX0ZVVFVSRV9DT0RFTkFNRVMpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQWxsb3dfbWlzc2luZ19kZXBlbmRlbmNpZXMsICAgICAgICAkKEFMTE9XX01JU1NJTkdfREVQRU5ERU5DSUVTKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBVbmJ1bmRsZWRfYnVpbGQsICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0JVSUxEX0FQUFMpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIFBkaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9CVUlMRF9QREspKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIERlYnVnZ2FibGUsICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgRW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlTmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9ERVZJQ0UpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIERldmljZUFyY2gsICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQVJDSCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlQXJjaFZhcmlhbnQsICAgICAgICAgICAgICAgICAkKFRBUkdFVF9BUkNIX1ZBUklBTlQpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIERldmljZUNwdVZhcmlhbnQsICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ1BVX1ZBUklBTlQpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZUFiaSwgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ1BVX0FCSSkgJChUQVJHRVRfQ1BVX0FCSTIpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlU2Vjb25kYXJ5QXJjaCwgICAgICAgICAgICAgICAkKFRBUkdFVF8yTkRfQVJDSCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgRGV2aWNlU2Vjb25kYXJ5QXJjaFZhcmlhbnQsICAgICAgICAkKFRBUkdFVF8yTkRfQVJDSF9WQVJJQU5UKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VTZWNvbmRhcnlDcHVWYXJpYW50LCAgICAgICAgICQoVEFSR0VUXzJORF9DUFVfVkFSSUFOVCkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlU2Vjb25kYXJ5QWJpLCAgICAgICAgICAgICAgICAkKFRBUkdFVF8yTkRfQ1BVX0FCSSkgJChUQVJHRVRfMk5EX0NQVV9BQkkyKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgIEhvc3RBcmNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgJChIT1NUX0FSQ0gpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIEhvc3RTZWNvbmRhcnlBcmNoLCAgICAgICAgICAgICAgICAgJChIT1NUXzJORF9BUkNIKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBIb3N0U3RhdGljQmluYXJpZXMsICAgICAgICAgICAgICAgICQoQlVJTERfSE9TVF9zdGF0aWMpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgQ3Jvc3NIb3N0LCAgICAgICAgICAgICAgICAgICAgICAgICAkKEhPU1RfQ1JPU1NfT1MpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIENyb3NzSG9zdEFyY2gsICAgICAgICAgICAgICAgICAgICAgJChIT1NUX0NST1NTX0FSQ0gpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIENyb3NzSG9zdFNlY29uZGFyeUFyY2gsICAgICAgICAgICAgJChIT1NUX0NST1NTXzJORF9BUkNIKSkKKworJChjYWxsIGFkZF9qc29uX2xpc3QsIFJlc291cmNlT3ZlcmxheXMsICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX1BBQ0tBR0VfT1ZFUkxBWVMpICQoREVWSUNFX1BBQ0tBR0VfT1ZFUkxBWVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEVuZm9yY2VSUk9UYXJnZXRzLCAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0VORk9SQ0VfUlJPX1RBUkdFVFMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEVuZm9yY2VSUk9FeGNsdWRlZE92ZXJsYXlzLCAgICAgICAgJChQUk9EVUNUX0VORk9SQ0VfUlJPX0VYQ0xVREVEX09WRVJMQVlTKSkKKworJChjYWxsIGFkZF9qc29uX3N0ciwgIEFBUFRDaGFyYWN0ZXJpc3RpY3MsICAgICAgICAgICAgICAgJChUQVJHRVRfQUFQVF9DSEFSQUNURVJJU1RJQ1MpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEFBUFRDb25maWcsICAgICAgICAgICAgICAgICAgICAgICAgJChQUk9EVUNUX0FBUFRfQ09ORklHKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBBQVBUUHJlZmVycmVkQ29uZmlnLCAgICAgICAgICAgICAgICQoUFJPRFVDVF9BQVBUX1BSRUZfQ09ORklHKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBBQVBUUHJlYnVpbHREUEksICAgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9BQVBUX1BSRUJVSUxUX0RQSSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBEZWZhdWx0QXBwQ2VydGlmaWNhdGUsICAgICAgICAgICAgICQoUFJPRFVDVF9ERUZBVUxUX0RFVl9DRVJUSUZJQ0FURSkpCisKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBBcHBzRGVmYXVsdFZlcnNpb25OYW1lLCAgICAgICAgICAgICQoQVBQU19ERUZBVUxUX1ZFUlNJT05fTkFNRSkpCisKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBTYW5pdGl6ZUhvc3QsICAgICAgICAgICAgICAgICAgICAgICQoU0FOSVRJWkVfSE9TVCkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgU2FuaXRpemVEZXZpY2UsICAgICAgICAgICAgICAgICAgICAkKFNBTklUSVpFX1RBUkdFVCkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgU2FuaXRpemVEZXZpY2VEaWFnLCAgICAgICAgICAgICAgICAkKFNBTklUSVpFX1RBUkdFVF9ESUFHKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBTYW5pdGl6ZURldmljZUFyY2gsICAgICAgICAgICAgICAgICQoU0FOSVRJWkVfVEFSR0VUX0FSQ0gpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgU2FmZXN0YWNrLCAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoVVNFX1NBRkVTVEFDSykpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEVuYWJsZUNGSSwgICAgICAgICAgICAgICAgICAgICAgICAgJChjYWxsIGludmVydF9ib29sLCQoZmlsdGVyIGZhbHNlLCQoRU5BQkxFX0NGSSkpKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBDRklFeGNsdWRlUGF0aHMsICAgICAgICAgICAgICAgICAgICQoQ0ZJX0VYQ0xVREVfUEFUSFMpICQoUFJPRFVDVF9DRklfRVhDTFVERV9QQVRIUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgQ0ZJSW5jbHVkZVBhdGhzLCAgICAgICAgICAgICAgICAgICAkKENGSV9JTkNMVURFX1BBVEhTKSAkKFBST0RVQ1RfQ0ZJX0lOQ0xVREVfUEFUSFMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIEludGVnZXJPdmVyZmxvd0V4Y2x1ZGVQYXRocywgICAgICAgJChJTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpICQoUFJPRFVDVF9JTlRFR0VSX09WRVJGTE9XX0VYQ0xVREVfUEFUSFMpKQorCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQ2xhbmdUaWR5LCAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciAxIHRydWUsJChXSVRIX1RJRFkpKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBUaWR5Q2hlY2tzLCAgICAgICAgICAgICAgICAgICAgICAgICQoV0lUSF9USURZX0NIRUNLUykpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBOYXRpdmVDb3ZlcmFnZSwgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChOQVRJVkVfQ09WRVJBR0UpKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBDb3ZlcmFnZVBhdGhzLCAgICAgICAgICAgICAgICAgICAgICQoQ09WRVJBR0VfUEFUSFMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIENvdmVyYWdlRXhjbHVkZVBhdGhzLCAgICAgICAgICAgICAgJChDT1ZFUkFHRV9FWENMVURFX1BBVEhTKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIEFydFVzZVJlYWRCYXJyaWVyLCAgICAgICAgICAgICAgICAgJChjYWxsIGludmVydF9ib29sLCQoZmlsdGVyIGZhbHNlLCQoUFJPRFVDVF9BUlRfVVNFX1JFQURfQkFSUklFUikpKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCaW5kZXIzMmJpdCwgICAgICAgICAgICAgICAgICAgICAgICQoQklOREVSMzJCSVQpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJyaWxsbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCUklMTE8pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIEJ0Q29uZmlnSW5jbHVkZURpciwgICAgICAgICAgICAgICAgJChCT0FSRF9CTFVFVE9PVEhfQkRST0lEX0JVSUxEQ0ZHX0lOQ0xVREVfRElSKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBEZXZpY2VfdXNlc19od2MyLCAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFU19IV0MyKSkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlS2VybmVsSGVhZGVycywgICAgICAgICAgICAgICAkKFRBUkdFVF9QUk9KRUNUX1NZU1RFTV9JTkNMVURFUykpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgRGV2aWNlUHJlZmVyMzJCaXRFeGVjdXRhYmxlcywgICAgICAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1BSRUZFUl8zMl9CSVRfRVhFQ1VUQUJMRVMpKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VWbmRrVmVyc2lvbiwgICAgICAgICAgICAgICAgICQoQk9BUkRfVk5ES19WRVJTSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBQbGF0Zm9ybV92bmRrX3ZlcnNpb24sICAgICAgICAgICAgICQoUExBVEZPUk1fVk5ES19WRVJTSU9OKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBFeHRyYVZuZGtWZXJzaW9ucywgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBEZXZpY2VTeXN0ZW1TZGtWZXJzaW9ucywgICAgICAgICAgICQoQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TKSkKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQbGF0Zm9ybV9zeXN0ZW1zZGtfdmVyc2lvbnMsICAgICAgICQoUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBNYWxsb2Nfbm90X3N2ZWx0ZSwgICAgICAgICAgICAgICAgICQoY2FsbCBpbnZlcnRfYm9vbCwkKGZpbHRlciB0cnVlLCQoTUFMTE9DX1NWRUxURSkpKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBPdmVycmlkZV9yc19kcml2ZXIsICAgICAgICAgICAgICAgICQoT1ZFUlJJREVfUlNfRFJJVkVSKSkKKworJChjYWxsIGFkZF9qc29uX2Jvb2wsIFRyZWJsZV9saW5rZXJfbmFtZXNwYWNlcywgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfVFJFQkxFX0xJTktFUl9OQU1FU1BBQ0VTKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgRW5mb3JjZV92aW50Zl9tYW5pZmVzdCwgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBVbWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFUl9NT0RFX0xJTlVYKSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgVmVuZG9yUGF0aCwgICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIE9kbVBhdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfT0RNKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBQcm9kdWN0UGF0aCwgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIE1pbmltaXplSmF2YURlYnVnSW5mbywgICAgICAgICAgICAgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfTUlOSU1JWkVfSkFWQV9ERUJVR19JTkZPKSkpCisKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBVc2VHb21hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyLW91dCBmYWxzZSwkKFVTRV9HT01BKSkpCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgQXJjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX0FSQykpKQorCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgRGlzdERpciwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoZGlzdF9nb2FsKSwgJChESVNUX0RJUikpKQorCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgTmFtZXNwYWNlc1RvRXhwb3J0LCAgICAgICAgICAgICAgICAkKFBST0RVQ1RfU09PTkdfTkFNRVNQQUNFUykpCisKKyQoY2FsbCBhZGRfanNvbl9saXN0LCBQZ29BZGRpdGlvbmFsUHJvZmlsZURpcnMsICAgICAgICAgICQoUEdPX0FERElUSU9OQUxfUFJPRklMRV9ESVJTKSkKKworX2NvbnRlbnRzIDo9ICQoc3Vic3QgJChjb21tYSkkKG5ld2xpbmUpX19TVl9FTkQsJChuZXdsaW5lKX0kKG5ld2xpbmUpLCQoX2NvbnRlbnRzKV9fU1ZfRU5EKQorCiskKGZpbGUgPiQoU09PTkdfVkFSSUFCTEVTKS50bXAsJChfY29udGVudHMpKQorCiskKHNoZWxsIGlmICEgY21wIC1zICQoU09PTkdfVkFSSUFCTEVTKS50bXAgJChTT09OR19WQVJJQUJMRVMpOyB0aGVuIFwKKwkgIG12ICQoU09PTkdfVkFSSUFCTEVTKS50bXAgJChTT09OR19WQVJJQUJMRVMpOyBcCiAJZWxzZSBcCi0JICBybSAkKFNPT05HX1ZBUklBQkxFU19UTVApOyBcCi0JZmkKKwkgIHJtICQoU09PTkdfVkFSSUFCTEVTKS50bXA7IFwKKwlmaSkKKworX2pzb25fbGlzdCA6PQoranNvbl9saXN0IDo9Citjc3ZfdG9fanNvbl9saXN0IDo9CithZGRfanNvbl92YWwgOj0KK2FkZF9qc29uX3N0ciA6PQorYWRkX2pzb25fbGlzdCA6PQorYWRkX2pzb25fY3N2IDo9CithZGRfanNvbl9ib29sIDo9CitpbnZlcnRfYm9vbCA6PQorX2NvbnRlbnRzIDo9CisKK2VuZGlmICMgQ09ORklHVVJFX1NPT05HCmRpZmYgLS1naXQgYS9jb3JlL3Nvb25nX2phdmFfcHJlYnVpbHQubWsgYi9jb3JlL3Nvb25nX2phdmFfcHJlYnVpbHQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkNDQxMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc29vbmdfamF2YV9wcmVidWlsdC5tawpAQCAtMCwwICsxLDExOSBAQAorIyBKYXZhIHByZWJ1aWx0IGNvbWluZyBmcm9tIFNvb25nLgorIyBFeHRyYSBpbnB1dHM6CisjIExPQ0FMX1NPT05HX0hFQURFUl9KQVIKKyMgTE9DQUxfU09PTkdfREVYX0pBUgorIyBMT0NBTF9TT09OR19KQUNPQ09fUkVQT1JUX0NMQVNTRVNfSkFSCisKK2lmbmVxICgkKExPQ0FMX01PRFVMRV9NQUtFRklMRSksJChTT09OR19BTkRST0lEX01LKSkKKyAgJChjYWxsIHByZXR0eS1lcnJvcixzb29uZ19qYXZhX3ByZWJ1aWx0Lm1rIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBTb29uZykKK2VuZGlmCisKK0xPQ0FMX01PRFVMRV9TVUZGSVggOj0gLmphcgorTE9DQUxfQlVJTFRfTU9EVUxFX1NURU0gOj0gamF2YWxpYi5qYXIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZnVsbF9jbGFzc2VzX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLmphcgorZnVsbF9jbGFzc2VzX3ByZV9wcm9ndWFyZF9qYXIgOj0gJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvY2xhc3Nlcy1wcmUtcHJvZ3VhcmQuamFyCitmdWxsX2NsYXNzZXNfaGVhZGVyX2phciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9jbGFzc2VzLWhlYWRlci5qYXIKK2NvbW1vbl9qYXZhbGliLmphciA6PSAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9qYXZhbGliLmphcgorCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSksJChmdWxsX2NsYXNzZXNfamFyKSkpCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSksJChmdWxsX2NsYXNzZXNfcHJlX3Byb2d1YXJkX2phcikpKQorCitpZmRlZiBMT0NBTF9EUk9JRERPQ19TVFVCU19KQVIKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX0RST0lERE9DX1NUVUJTX0pBUiksJChPVVRfRE9DUykvJChMT0NBTF9NT0RVTEUpLXN0dWJzLnNyY2phcikpCitBTExfRE9DUyArPSAkKE9VVF9ET0NTKS8kKExPQ0FMX01PRFVMRSktc3R1YnMuc3JjamFyCitlbmRpZgorCitpZmRlZiBMT0NBTF9EUk9JRERPQ19ET0NfWklQCiskKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9EUk9JRERPQ19ET0NfWklQKSwkKE9VVF9ET0NTKS8kKExPQ0FMX01PRFVMRSktZG9jcy56aXApKQorZW5kaWYKKworaWZkZWYgTE9DQUxfU09PTkdfSkFDT0NPX1JFUE9SVF9DTEFTU0VTX0pBUgorICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChMT0NBTF9TT09OR19KQUNPQ09fUkVQT1JUX0NMQVNTRVNfSkFSKSxcCisgICAgJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvamFjb2NvLXJlcG9ydC1jbGFzc2VzLmphcikpCisgICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKGNvbW1vbl9qYXZhbGliLmphciksXAorICAgICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2phY29jby1yZXBvcnQtY2xhc3Nlcy5qYXIpCitlbmRpZgorCitpZm5lcSAoJChUVVJCSU5FX0RJU0FCTEVEKSxmYWxzZSkKK2lmZGVmIExPQ0FMX1NPT05HX0hFQURFUl9KQVIKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKExPQ0FMX1NPT05HX0hFQURFUl9KQVIpLCQoZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIpKSkKK2Vsc2UKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGZ1bGxfY2xhc3Nlc19qYXIpLCQoZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIpKSkKK2VuZGlmCitlbmRpZiAjIFRVUkJJTkVfRElTQUJMRUQgIT0gZmFsc2UKKworaWZkZWYgTE9DQUxfU09PTkdfREVYX0pBUgorICBpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKKyAgICBpZm5lcSAoJChmaWx0ZXIgJChMT0NBTF9NT0RVTEUpLCQoUFJPRFVDVF9CT09UX0pBUlMpKSwpICAjIGlzX2Jvb3RfamFyCisgICAgICAkKGV2YWwgJChjYWxsIGhpZGRlbmFwaS1jb3B5LXNvb25nLWphciwkKExPQ0FMX1NPT05HX0RFWF9KQVIpLCQoY29tbW9uX2phdmFsaWIuamFyKSkpCisgICAgZWxzZSAjICFpc19ib290X2phcgorICAgICAgJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfREVYX0pBUiksJChjb21tb25famF2YWxpYi5qYXIpKSkKKyAgICBlbmRpZiAjIGlzX2Jvb3RfamFyCisgICAgJChldmFsICQoY2FsbCBhZGQtZGVwZW5kZW5jeSwkKGNvbW1vbl9qYXZhbGliLmphciksJChmdWxsX2NsYXNzZXNfamFyKSAkKGZ1bGxfY2xhc3Nlc19oZWFkZXJfamFyKSkpCisKKyAgICBkZXhfcHJlb3B0X3Byb2ZpbGVfc3JjX2ZpbGUgOj0gJChjb21tb25famF2YWxpYi5qYXIpCisKKyAgICAjIGRlZmluZXMgYnVpbHRfb2RleCBhbG9uZyB3aXRoIHJ1bGUgdG8gaW5zdGFsbCBvZGV4CisgICAgaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvZGV4X3ByZW9wdF9vZGV4X2luc3RhbGwubWsKKworICAgIGRleF9wcmVvcHRfcHJvZmlsZV9zcmNfZmlsZSA6PQorCisgICAgaWZkZWYgTE9DQUxfREVYX1BSRU9QVAorICAgICAgaWZuZXEgKCQoZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZSksKSAjIGJvb3QgamFyCisgICAgICAgICMgYm9vdCBqYXIncyBydWxlcyBhcmUgZGVmaW5lZCBpbiBkZXhfcHJlb3B0Lm1rCisgICAgICAgIGRleHByZW9wdGVkX2Jvb3RfamFyIDo9ICQoREVYUFJFT1BUX0JPT1RfSkFSX0RJUl9GVUxMX1BBVEgpLyQoZGV4cHJlb3B0X2Jvb3RfamFyX21vZHVsZSlfbm9kZXguamFyCisgICAgICAgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGRleHByZW9wdGVkX2Jvb3RfamFyKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQorCisgICAgICAgICMgRm9yIGxpYmFydCBib290IGphcnMsIHdlIGRvbid0IGhhdmUgLm9kZXggZmlsZXMuCisgICAgICBlbHNlICMgISBib290IGphcgorICAgICAgICAkKGJ1aWx0X29kZXgpOiBQUklWQVRFX01PRFVMRSA6PSAkKExPQ0FMX01PRFVMRSkKKyAgICAgICAgIyBVc2UgcGF0dGVybiBydWxlIC0gd2UgbWF5IGhhdmUgbXVsdGlwbGUgYnVpbHQgb2RleCBmaWxlcy4KKyQoYnVpbHRfb2RleCkgOiAkKGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpJSA6ICQoY29tbW9uX2phdmFsaWIuamFyKQorCUBlY2hvICJEZXhwcmVvcHQgSmFyOiAkKFBSSVZBVEVfTU9EVUxFKSAoJEApIgorCSQoY2FsbCBkZXhwcmVvcHQtb25lLWZpbGUsJDwsJEApCisKKyAgICAgICAkKGV2YWwgJChjYWxsIGRleHByZW9wdC1jb3B5LWphciwkKGNvbW1vbl9qYXZhbGliLmphciksJChMT0NBTF9CVUlMVF9NT0RVTEUpLCQoTE9DQUxfREVYX1BSRU9QVCkpKQorICAgICAgZW5kaWYgIyAhIGJvb3QgamFyCisgICAgZWxzZSAjIExPQ0FMX0RFWF9QUkVPUFQKKyAgICAgICQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKGNvbW1vbl9qYXZhbGliLmphciksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKKyAgICBlbmRpZiAjIExPQ0FMX0RFWF9QUkVPUFQKKyAgZWxzZSAjIExPQ0FMX0lTX0hPU1RfTU9EVUxFCisgICAgJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoTE9DQUxfU09PTkdfREVYX0pBUiksJChMT0NBTF9CVUlMVF9NT0RVTEUpKSkKKyAgICAkKGV2YWwgJChjYWxsIGFkZC1kZXBlbmRlbmN5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSwkKGZ1bGxfY2xhc3Nlc19qYXIpICQoZnVsbF9jbGFzc2VzX2hlYWRlcl9qYXIpKSkKKyAgZW5kaWYKKworICBqYXZhLWRleCA6ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQorZWxzZQorICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChmdWxsX2NsYXNzZXNfamFyKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQorZW5kaWYKKworamF2YWMtY2hlY2sgOiAkKGZ1bGxfY2xhc3Nlc19qYXIpCitqYXZhYy1jaGVjay0kKExPQ0FMX01PRFVMRSkgOiAkKGZ1bGxfY2xhc3Nlc19qYXIpCisKK2lmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQoraWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksc3lzdGVtX2N1cnJlbnQpCitteV9saW5rX3R5cGUgOj0gamF2YTpzeXN0ZW0KK2Vsc2UgaWZuZXEgKCwkKGNhbGwgaGFzLXN5c3RlbS1zZGstdmVyc2lvbiwkKExPQ0FMX1NES19WRVJTSU9OKSkpCitteV9saW5rX3R5cGUgOj0gamF2YTpzeXN0ZW0KK2Vsc2UgaWZlcSAoJChMT0NBTF9TREtfVkVSU0lPTiksY29yZV9jdXJyZW50KQorbXlfbGlua190eXBlIDo9IGphdmE6Y29yZQorZWxzZSBpZm5lcSAoJChMT0NBTF9TREtfVkVSU0lPTiksKQorbXlfbGlua190eXBlIDo9IGphdmE6c2RrCitlbHNlCitteV9saW5rX3R5cGUgOj0gamF2YTpwbGF0Zm9ybQorZW5kaWYKKyMgd2Fybi9hbGxvd2VkIHR5cGVzIGFyZSBib3RoIGVtcHR5IGJlY2F1c2UgU29vbmcgbW9kdWxlcyBjYW4ndCBkZXBlbmQgb24KKyMgbWFrZS1kZWZpbmVkIG1vZHVsZXMuCitteV93YXJuX3R5cGVzIDo9CitteV9hbGxvd2VkX3R5cGVzIDo9CisKK215X2xpbmtfZGVwcyA6PQorbXlfMm5kX2FyY2hfcHJlZml4IDo9ICQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCkKK215X2NvbW1vbiA6PSBDT01NT04KK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2xpbmtfdHlwZS5taworZW5kaWYgIyAhTE9DQUxfSVNfSE9TVF9NT0RVTEUKZGlmZiAtLWdpdCBhL2NvcmUvc3RhdGljX2phdmFfbGlicmFyeS5tayBiL2NvcmUvc3RhdGljX2phdmFfbGlicmFyeS5tawppbmRleCAxMzczMDExLi5iOGY1MDhiIDEwMDY0NAotLS0gYS9jb3JlL3N0YXRpY19qYXZhX2xpYnJhcnkubWsKKysrIGIvY29yZS9zdGF0aWNfamF2YV9saWJyYXJ5Lm1rCkBAIC0yNCwxNCArMjQsMTcgQEAKIExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEpBVkFfTElCUkFSSUVTCiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvY29uZmlndXJlX2xvY2FsX2phY2subWsKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCiBpbnRlcm1lZGlhdGVzLkNPTU1PTiA6PSAkKGNhbGwgbG9jYWwtaW50ZXJtZWRpYXRlcy1kaXIsQ09NTU9OKQogCiBteV9yZXNfcGFja2FnZSA6PQogCitpZmRlZiBMT0NBTF9BQVBUMl9PTkxZCitMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQorZW5kaWYKKworIyBQcm9jZXNzIFN1cHBvcnQgTGlicmFyeSBkZXBlbmRlbmNpZXMuCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9zdXBwb3J0X2xpYnJhcmllcy5taworCiAjIEhhY2sgdG8gYnVpbGQgc3RhdGljIEphdmEgbGlicmFyeSB3aXRoIEFuZHJvaWQgcmVzb3VyY2UKICMgU2VlIGJ1ZyA1NzE0NTE2CiBhbGxfcmVzb3VyY2VzIDo9CkBAIC03NiwxMyArNzksNiBAQAogCiBMT0NBTF9QUk9HVUFSRF9GTEFHUyA6PSAkKGFkZHByZWZpeCAtaW5jbHVkZSAsJChwcm9ndWFyZF9vcHRpb25zX2ZpbGUpKSAkKExPQ0FMX1BST0dVQVJEX0ZMQUdTKQogCi1pZmRlZiBMT0NBTF9KQUNLX0VOQUJMRUQKLWlmbmRlZiBMT0NBTF9KQUNLX1BST0dVQVJEX0ZMQUdTCi0gICAgTE9DQUxfSkFDS19QUk9HVUFSRF9GTEFHUyA6PSAkKExPQ0FMX1BST0dVQVJEX0ZMQUdTKQotZW5kaWYKLUxPQ0FMX0pBQ0tfUFJPR1VBUkRfRkxBR1MgOj0gJChhZGRwcmVmaXggLWluY2x1ZGUgLCQocHJvZ3VhcmRfb3B0aW9uc19maWxlKSkgJChMT0NBTF9KQUNLX1BST0dVQVJEX0ZMQUdTKQotZW5kaWYgIyBMT0NBTF9KQUNLX0VOQUJMRUQKLQogUl9maWxlX3N0YW1wIDo9ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL3NyYy9SLnN0YW1wCiBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSAkKFJfZmlsZV9zdGFtcCkKIApAQCAtOTUsNyArOTEsNyBAQAogCiBMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyArPSAkKG15X3Jlc19wYWNrYWdlKQogZW5kaWYgICMgTE9DQUxfVVNFX0FBUFQyCi1lbmRpZiAgIyBMT0NBTF9SRVNPVVJDRV9ESVIKK2VuZGlmICAjIG5lZWRfY29tcGlsZV9yZXMKIAogYWxsX3Jlc19hc3NldHMgOj0gJChhbGxfcmVzb3VyY2VzKQogCkBAIC0xMjUsMTAgKzEyMSwyNyBAQAogZW5kaWYKIGVuZGlmCiAKK2lmZGVmIExPQ0FMX1VTRV9BQVBUMgoraW1wb3J0X3Byb2d1YXJkX2ZsYWdfZmlsZXMgOj0gJChzdHJpcCAkKGZvcmVhY2ggbCwkKExPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyksXAorICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsSkFWQV9MSUJSQVJJRVMsJChsKSwsQ09NTU9OKS9leHBvcnRfcHJvZ3VhcmRfZmxhZ3MpKQorJChpbnRlcm1lZGlhdGVzLkNPTU1PTikvZXhwb3J0X3Byb2d1YXJkX2ZsYWdzOiAkKGltcG9ydF9wcm9ndWFyZF9mbGFnX2ZpbGVzKSAkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywkKExPQ0FMX0VYUE9SVF9QUk9HVUFSRF9GTEFHX0ZJTEVTKSkKKwlAZWNobyAiRXhwb3J0IHByb2d1YXJkIGZsYWdzOiAkQCIKKwlybSAtZiAkQAorCXRvdWNoICRACisJZm9yIGYgaW4gJCs7IGRvIFwKKwkJZWNobyAtZSAiXG4jIGluY2x1ZGluZyAkJGYiID4+JEA7IFwKKwkJY2F0ICQkZiA+PiRAOyBcCisJZG9uZQoraW1wb3J0X3Byb2d1YXJkX2ZsYWdfZmlsZXMgOj0KK2VuZGlmCisKICMgYWRkIC0tbm9uLWNvbnN0YW50LWlkIHRvIHByZXZlbnQgaW5saW5pbmcgY29uc3RhbnRzLgogIyBBQVIgbmVlZHMgdGV4dCBzeW1ib2wgZmlsZSBSLnR4dC4KIGlmZGVmIExPQ0FMX1VTRV9BQVBUMgotJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUFQVF9GTEFHUyA6PSAkKExPQ0FMX0FBUFRfRkxBR1MpIC0tc3RhdGljLWxpYiAtLW5vLXN0YXRpYy1saWItcGFja2FnZXMKKyQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX0FBUFRfRkxBR1MgOj0gJChMT0NBTF9BQVBUX0ZMQUdTKSAtLXN0YXRpYy1saWIKK2lmbmRlZiBMT0NBTF9BQVBUX05BTUVTUEFDRVMKKyAgJChMT0NBTF9JTlRFUk1FRElBVEVfVEFSR0VUUyk6IFBSSVZBVEVfQUFQVF9GTEFHUyArPSAtLW5vLXN0YXRpYy1saWItcGFja2FnZXMKK2VuZGlmCiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfQ09ORklHIDo9CiAkKExPQ0FMX0lOVEVSTUVESUFURV9UQVJHRVRTKTogUFJJVkFURV9QUk9EVUNUX0FBUFRfUFJFRl9DT05GSUcgOj0KICQoTE9DQUxfSU5URVJNRURJQVRFX1RBUkdFVFMpOiBQUklWQVRFX1RBUkdFVF9BQVBUX0NIQVJBQ1RFUklTVElDUyA6PQpAQCAtMTU2LDggKzE2OSw4IEBACiBlbHNlCiBpZm5lcSAoLCQoTE9DQUxfU0RLX1ZFUlNJT04pKQogIyBTZXQgdGFyZ2V0LWFwaSBmb3IgTE9DQUxfU0RLX1ZFUlNJT05zIG90aGVyIHRoYW4gY3VycmVudC4KLWlmbmVxICgsJChmaWx0ZXItb3V0IGN1cnJlbnQgc3lzdGVtX2N1cnJlbnQgdGVzdF9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCi1yZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA6PSAkKExPQ0FMX1NES19WRVJTSU9OKQoraWZuZXEgKCwkKGZpbHRlci1vdXQgY3VycmVudCBzeXN0ZW1fY3VycmVudCB0ZXN0X2N1cnJlbnQgY29yZV9jdXJyZW50LCAkKExPQ0FMX1NES19WRVJTSU9OKSkpCityZW5kZXJzY3JpcHRfdGFyZ2V0X2FwaSA6PSAkKGNhbGwgZ2V0LW51bWVyaWMtc2RrLXZlcnNpb24sJChMT0NBTF9TREtfVkVSU0lPTikpCiBlbmRpZgogZW5kaWYgICMgTE9DQUxfU0RLX1ZFUlNJT04gaXMgc2V0CiBlbmRpZiAgIyBMT0NBTF9SRU5ERVJTQ1JJUFRfVEFSR0VUX0FQSSBpcyBzZXQKQEAgLTE3MCw2ICsxODMsNyBAQAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYWFwdDIubWsKICQobXlfcmVzX3BhY2thZ2UpIDogJChmcmFtZXdvcmtfcmVzX3BhY2thZ2VfZXhwb3J0X2RlcHMpCiBlbHNlCiskKFJfZmlsZV9zdGFtcCk6IFBSSVZBVEVfUkVTT1VSQ0VfTElTVCA6PSAkKGFsbF9yZXNvdXJjZXMpCiAkKFJfZmlsZV9zdGFtcCkgOiAkKGFsbF9yZXNvdXJjZXMpICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KSAkKEFBUFQpICQoZnJhbWV3b3JrX3Jlc19wYWNrYWdlX2V4cG9ydF9kZXBzKQogCUBlY2hvICJ0YXJnZXQgUi5qYXZhL01hbmlmZXN0LmphdmE6ICQoUFJJVkFURV9NT0RVTEUpICgkQCkiCiAJJChjcmVhdGUtcmVzb3VyY2UtamF2YS1maWxlcykKQEAgLTE3NywxMiArMTkxLDEwIEBACiBlbmRpZiAgIyBMT0NBTF9VU0VfQUFQVDIKIAogJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKFJfZmlsZV9zdGFtcCkKLWlmZGVmIExPQ0FMX0pBQ0tfRU5BQkxFRAotJChub3Nocm9iX2NsYXNzZXNfamFjayk6ICQoUl9maWxlX3N0YW1wKQotJChmdWxsX2NsYXNzZXNfamFjayk6ICQoUl9maWxlX3N0YW1wKQotJChqYWNrX2NoZWNrX3RpbWVzdGFtcCk6ICQoUl9maWxlX3N0YW1wKQotZW5kaWYgIyBMT0NBTF9KQUNLX0VOQUJMRUQKKyQoamF2YV9zb3VyY2VfbGlzdF9maWxlKTogJChSX2ZpbGVfc3RhbXApCiskKGZvcmVhY2ggeCwkKHNoYXJkZWRfamF2YV9zb3VyY2VfbGlzdF9maWxlcyksJChldmFsICQoeCk6ICQoUl9maWxlX3N0YW1wKSkpCiAkKGZ1bGxfY2xhc3Nlc19jb21waWxlZF9qYXIpOiAkKFJfZmlsZV9zdGFtcCkKKyQoZnVsbF9jbGFzc2VzX3R1cmJpbmVfamFyKTogJChSX2ZpbGVfc3RhbXApCiAKIAogIyBpZiB3ZSBoYXZlIGN1c3RvbSBwcm9ndWFyZGluZyBkb25lIHVzZSB0aGUgcHJvZ3VhcmRlZCBjbGFzc2VzIGphciBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgY2xhc3NlcyBqYXIKQEAgLTE5OSw2ICsyMTEsNyBAQAogJChidWlsdF9hYXIpOiBQUklWQVRFX0NMQVNTRVNfSkFSIDo9ICQoYWFyX2NsYXNzZXNfamFyKQogJChidWlsdF9hYXIpOiBQUklWQVRFX1JFU09VUkNFX0RJUiA6PSAkKExPQ0FMX1JFU09VUkNFX0RJUikKICQoYnVpbHRfYWFyKTogUFJJVkFURV9SX1RYVCA6PSAkKExPQ0FMX0lOVEVSTUVESUFURV9TT1VSQ0VfRElSKS9SLnR4dAorJChidWlsdF9hYXIpOiAkKEpBUl9BUkdTKQogJChidWlsdF9hYXIpIDogJChhYXJfY2xhc3Nlc19qYXIpICQoZnVsbF9hbmRyb2lkX21hbmlmZXN0KQogCUBlY2hvICJ0YXJnZXQgQUFSOiAgJChQUklWQVRFX01PRFVMRSkgKCRAKSIKIAkkKGhpZGUpIHJtIC1yZiAkKGRpciAkQClhYXIgJiYgbWtkaXIgLXAgJChkaXIgJEApYWFyL3JlcwpAQCAtMjA4LDcgKzIyMSw3IEBACiAJJChoaWRlKSAkKGZvcmVhY2ggcmVzLCQoUFJJVkFURV9SRVNPVVJDRV9ESVIpLGNwIC1SZm4gJChyZXMpLyogJChkaXIgJEApYWFyL3JlczspCiAJJChoaWRlKSBjcCAkKFBSSVZBVEVfUl9UWFQpICQoZGlyICRAKWFhci9SLnR4dAogCSQoaGlkZSkgJChKQVIpIC1jTWYgJEAgXAotCSAgLUMgJChkaXIgJEApYWFyIC4KKwkgICQoY2FsbCBqYXItYXJncy1zb3J0ZWQtZmlsZXMtaW4tZGlyZWN0b3J5LCQoZGlyICRAKWFhcikKIAogIyBSZWdpc3RlciB0aGUgYWFyIGZpbGUuCiBBTExfTU9EVUxFUy4kKExPQ0FMX01PRFVMRSkuQUFSIDo9ICQoYnVpbHRfYWFyKQpkaWZmIC0tZ2l0IGEvY29yZS9zdXBwb3J0X2xpYnJhcmllcy5tayBiL2NvcmUvc3VwcG9ydF9saWJyYXJpZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwNGNjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3VwcG9ydF9saWJyYXJpZXMubWsKQEAgLTAsMCArMSw1NCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIFJ1bGVzIGZvciByZXNvbHZpbmcgU3VwcG9ydCBMaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMjCisjIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtYXkgYmUgbW9kaWZpZWQ6CisjIyAtIExPQ0FMX0pBVkFfTElCUkFSSUVTCisjIyAtIExPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUworIyMgLSBMT0NBTF9TSEFSRURfQU5EUk9JRF9MSUJSQVJJRVMKKyMjIC0gTE9DQUxfU1RBVElDX0FORFJPSURfTElCUkFSSUVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFNvbWUgcHJvamVjdHMgZG9uJ3Qgd29yayBjb3JyZWN0bHkgeWV0LiBBbGxvdyB0aGVtIHRvIHNraXAgcmVzb2x1dGlvbi4KK2lmbmRlZiBMT0NBTF9ESVNBQkxFX1JFU09MVkVfU1VQUE9SVF9MSUJSQVJJRVMKKworIyBDbGVhciB0aGVzZSBvdXQgc28gd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IGdldCBvbGQgdmFsdWVzLgorc3VwcG9ydF9hbmRyb2lkX2RlcHMgOj0KK3N1cHBvcnRfamF2YV9kZXBzIDo9CisKKyMgRGVsZWdhdGUgZGVwZW5kZW5jeSBleHBhbnNpb24gdG8gdGhlIFN1cHBvcnQgTGlicmFyeSdzIHJ1bGVzLiBUaGlzIHdpbGwgc3RvcmUKKyMgaXRzIG91dHB1dCBpbiB0aGUgdmFyaWFibGVzIHN1cHBvcnRfYW5kcm9pZF9kZXBzIGFuZCBzdXBwb3J0X2phdmFfZGVwcy4KK2luY2x1ZGUgJChSRVNPTFZFX1NVUFBPUlRfTElCUkFSSUVTKQorCisjIFN0b3JlIHRoZSBleHBhbmRlZCBkZXBlbmRlbmNpZXMgaW4gdGhlIGFwcHJvcHJpYXRlIHZhcmlhYmxlcy4gTGlicmFyaWVzCisjIHNob3VsZCBORVZFUiBzdGF0aWNhbGx5IGluY2x1ZGUgU3VwcG9ydCBMaWJyYXJ5IG1vZHVsZXMgd2l0aCByZXNvdXJjZXMuCitpZmRlZiBzdXBwb3J0X2FuZHJvaWRfZGVwcworICAgIGlmZGVmIExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkKKyAgICAgICAgTE9DQUxfU0hBUkVEX0FORFJPSURfTElCUkFSSUVTICs9ICQoc3VwcG9ydF9hbmRyb2lkX2RlcHMpCisgICAgZWxzZQorICAgICAgICBMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgKz0gJChzdXBwb3J0X2FuZHJvaWRfZGVwcykKKyAgICBlbmRpZiAjIExPQ0FMX0lTX1NUQVRJQ19KQVZBX0xJQlJBUlkKK2VuZGlmICNzdXBwb3J0X2FuZHJvaWRfZGVwcworTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTICs9ICQoc3VwcG9ydF9qYXZhX2RlcHMpCisKKyMgV2UgaGF2ZSBjb25zdW1lZCB0aGVzZSB2YWx1ZXMuIENsZWFuIHRoZW0gdXAuCitzdXBwb3J0X2FuZHJvaWRfZGVwcyA6PQorc3VwcG9ydF9qYXZhX2RlcHMgOj0KKworZW5kaWYgI0xPQ0FMX0RJU0FCTEVfUkVTT0xWRV9TVVBQT1JUX0xJQlJBUklFUworTE9DQUxfRElTQUJMRV9SRVNPTFZFX1NVUFBPUlRfTElCUkFSSUVTIDo9CmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9Cb2FyZENvbmZpZy5tayBiL2NvcmUvdGFyZ2V0X3Rlc3RfY29uZmlnLm1rCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIHRhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L0JvYXJkQ29uZmlnLm1rCnJlbmFtZSB0byBjb3JlL3RhcmdldF90ZXN0X2NvbmZpZy5tawppbmRleCAwMTY5MzdhLi42MWY1ZDJiIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9Cb2FyZENvbmZpZy5taworKysgYi9jb3JlL3RhcmdldF90ZXN0X2NvbmZpZy5tawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEwICsxNCwxMCBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW5jbHVkZSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5taworIworIyBDb21tb24gcnVsZXMgZm9yIGJ1aWxkaW5nIGEgVHJhZGVGZWQgdGVzdCBYTUwgZmlsZSBmb3IgdGFyZ2V0IHNpZGUgdGVzdHMuCisjCiAKLVRBUkdFVF9BUkNIX1ZBUklBTlQgOj0gYXJtdjV0ZQotVEFSR0VUX0NQVV9BQkkgOj0gYXJtZWFiaQotVEFSR0VUX0NQVV9BQkkyIDo9CiskKGNhbGwgcmVjb3JkLW1vZHVsZS10eXBlLFRBUkdFVF9URVNUX0NPTkZJRykKIAotV0lUSF9ERVhQUkVPUFQgOj0gZmFsc2UKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rlc3RfY29uZmlnX2NvbW1vbi5tawpkaWZmIC0tZ2l0IGEvY29yZS90YXJnZXRfdGVzdF9pbnRlcm5hbC5tayBiL2NvcmUvdGFyZ2V0X3Rlc3RfaW50ZXJuYWwubWsKaW5kZXggNTlhM2E5ZS4uYjVjM2E3YyAxMDA2NDQKLS0tIGEvY29yZS90YXJnZXRfdGVzdF9pbnRlcm5hbC5taworKysgYi9jb3JlL3RhcmdldF90ZXN0X2ludGVybmFsLm1rCkBAIC04LDE1ICs4LDkgQEAKICAgaWZuZGVmIExPQ0FMX1NES19WRVJTSU9OCiAgICAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJndGVzdF9tYWluIGxpYmd0ZXN0CiAgIGVsc2UKLSAgICBpZm5lcSAoLCQoZmlsdGVyIGMrK18lLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSkpCi0gICAgICAgIG15X25ka19ndGVzdF9zdWZmaXggOj0gX2MrKwotICAgIGVsc2UgaWZuZXEgKCQoZmlsdGVyIHN0bHBvcnRfLCQoTE9DQUxfTkRLX1NUTF9WQVJJQU5UKSksKQotICAgICAgICBteV9uZGtfZ3Rlc3Rfc3VmZml4IDo9IF9zdGxwb3J0Ci0gICAgZWxzZSBpZm5lcSAoJChmaWx0ZXIgZ251c3RsXywkKExPQ0FMX05ES19TVExfVkFSSUFOVCkpLCkKLSAgICAgICAgbXlfbmRrX2d0ZXN0X3N1ZmZpeCA6PSBfZ251c3RsCi0gICAgZWxzZSAjIHN5c3RlbSBTVEwsIHVzZSBzdGxwb3J0Ci0gICAgICAgIG15X25ka19ndGVzdF9zdWZmaXggOj0gX3N0bHBvcnQKLSAgICBlbmRpZgorICAgICMgVE9ETyhkYW5hbGJlcnQpOiBSZW1vdmUgdGhlIHN1ZmZpeCBmcm9tIHRoZSBtb2R1bGUgc2luY2Ugd2Ugb25seSBuZWVkIHRoZQorICAgICMgb25lIHZhcmlhbnQgbm93LgorICAgIG15X25ka19ndGVzdF9zdWZmaXggOj0gX2MrKwogICAgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gXAogICAgICAgICBsaWJndGVzdF9tYWluX25kayQobXlfbmRrX2d0ZXN0X3N1ZmZpeCkgXAogICAgICAgICBsaWJndGVzdF9uZGskKG15X25ka19ndGVzdF9zdWZmaXgpCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2FwaWNoZWNrLm1rIGIvY29yZS90YXNrcy9hcGljaGVjay5tawppbmRleCAzOTc1ZDIwLi5mNGFlZTNmIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2FwaWNoZWNrLm1rCisrKyBiL2NvcmUvdGFza3MvYXBpY2hlY2subWsKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAkKElOVEVSTkFMX1BMQVRGT1JNX1JFTU9WRURfQVBJX0ZJTEUpLCBcCiAgICAgLWhpZGUgMiAtaGlkZSAzIC1oaWRlIDQgLWhpZGUgNSAtaGlkZSA2IC1oaWRlIDI0IC1oaWRlIDI1IC1oaWRlIDI2IC1oaWRlIDI3IFwKICAgICAtZXJyb3IgNyAtZXJyb3IgOCAtZXJyb3IgOSAtZXJyb3IgMTAgLWVycm9yIDExIC1lcnJvciAxMiAtZXJyb3IgMTMgLWVycm9yIDE0IC1lcnJvciAxNSBcCi0gICAgLWVycm9yIDE2IC1lcnJvciAxNyAtZXJyb3IgMTggLCBcCisgICAgLWVycm9yIDE2IC1lcnJvciAxNyAtZXJyb3IgMTggLWVycm9yIDMxLCBcCiAgICAgY2F0ICQoQlVJTERfU1lTVEVNKS9hcGljaGVja19tc2dfbGFzdC50eHQsIFwKICAgICBjaGVjay1wdWJsaWMtYXBpLCBcCiAgICAgJChjYWxsIGRvYy10aW1lc3RhbXAtZm9yLGFwaS1zdHVicykgXApAQCAtOTcsNyArOTcsNyBAQAogICAgICQoSU5URVJOQUxfUExBVEZPUk1fU1lTVEVNX1JFTU9WRURfQVBJX0ZJTEUpLCBcCiAgICAgLWhpZGUgMiAtaGlkZSAzIC1oaWRlIDQgLWhpZGUgNSAtaGlkZSA2IC1oaWRlIDI0IC1oaWRlIDI1IC1oaWRlIDI2IC1oaWRlIDI3IFwKICAgICAtZXJyb3IgNyAtZXJyb3IgOCAtZXJyb3IgOSAtZXJyb3IgMTAgLWVycm9yIDExIC1lcnJvciAxMiAtZXJyb3IgMTMgLWVycm9yIDE0IC1lcnJvciAxNSBcCi0gICAgLWVycm9yIDE2IC1lcnJvciAxNyAtZXJyb3IgMTggLCBcCisgICAgLWVycm9yIDE2IC1lcnJvciAxNyAtZXJyb3IgMTggLWVycm9yIDMxLCBcCiAgICAgY2F0ICQoQlVJTERfU1lTVEVNKS9hcGljaGVja19tc2dfbGFzdC50eHQsIFwKICAgICBjaGVjay1zeXN0ZW0tYXBpLCBcCiAgICAgJChjYWxsIGRvYy10aW1lc3RhbXAtZm9yLHN5c3RlbS1hcGktc3R1YnMpIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L2RldmljZS5tayBiL2NvcmUvdGFza3MvYXBpZGlmZi5tawpzaW1pbGFyaXR5IGluZGV4IDc4JQpyZW5hbWUgZnJvbSB0YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9kZXZpY2UubWsKcmVuYW1lIHRvIGNvcmUvdGFza3MvYXBpZGlmZi5tawppbmRleCA3YzRhYWYyLi40ZWI1OWFmIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9kZXZpY2UubWsKKysrIGIvY29yZS90YXNrcy9hcGlkaWZmLm1rCkBAIC0xLDUgKzEsNCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsNiArMTEsMTEgQEAKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgUnVsZXMgZm9yIGJ1aWxkaW5nIEFQSSBkaWZmcy4KICMKIAotaW5jbHVkZSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9kZXZpY2UubWsKKy5QSE9OWTogYXBpLWRpZmYKKworYXBpLWRpZmY6IG9mZmxpbmUtc2RrLXJlZmVyZW5jZW9ubHktZGlmZgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9ib290X2phcnNfcGFja2FnZV9jaGVjay5tayBiL2NvcmUvdGFza3MvYm9vdF9qYXJzX3BhY2thZ2VfY2hlY2subWsKaW5kZXggMTg4YzI2Ny4uZGM3OWUyMyAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9ib290X2phcnNfcGFja2FnZV9jaGVjay5taworKysgYi9jb3JlL3Rhc2tzL2Jvb3RfamFyc19wYWNrYWdlX2NoZWNrLm1rCkBAIC0yNCw4ICsyNCw4IEBACiBzdGFtcCA6PSAkKGludGVybWVkaWF0ZXMpL3N0YW1wCiBidWlsdF9ib290X2phcnMgOj0gJChmb3JlYWNoIGosICQoUFJPRFVDVF9CT09UX0pBUlMpLCBcCiAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsIEpBVkFfTElCUkFSSUVTLCAkKGopLCxDT01NT04pL2NsYXNzZXMuamFyKQotc2NyaXB0IDo9IGJ1aWxkL2NvcmUvdGFza3MvY2hlY2tfYm9vdF9qYXJzL2NoZWNrX2Jvb3RfamFycy5weQotd2hpdGVsaXN0X2ZpbGUgOj0gYnVpbGQvY29yZS90YXNrcy9jaGVja19ib290X2phcnMvcGFja2FnZV93aGl0ZWxpc3QudHh0CitzY3JpcHQgOj0gYnVpbGQvbWFrZS9jb3JlL3Rhc2tzL2NoZWNrX2Jvb3RfamFycy9jaGVja19ib290X2phcnMucHkKK3doaXRlbGlzdF9maWxlIDo9IGJ1aWxkL21ha2UvY29yZS90YXNrcy9jaGVja19ib290X2phcnMvcGFja2FnZV93aGl0ZWxpc3QudHh0CiAKICQoc3RhbXApOiBQUklWQVRFX0JPT1RfSkFSUyA6PSAkKGJ1aWx0X2Jvb3RfamFycykKICQoc3RhbXApOiBQUklWQVRFX1NDUklQVCA6PSAkKHNjcmlwdCkKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvY2hlY2tfYm9vdF9qYXJzL3BhY2thZ2Vfd2hpdGVsaXN0LnR4dCBiL2NvcmUvdGFza3MvY2hlY2tfYm9vdF9qYXJzL3BhY2thZ2Vfd2hpdGVsaXN0LnR4dAppbmRleCAxNWI5OTkwLi5iMGJlY2JhIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2NoZWNrX2Jvb3RfamFycy9wYWNrYWdlX3doaXRlbGlzdC50eHQKKysrIGIvY29yZS90YXNrcy9jaGVja19ib290X2phcnMvcGFja2FnZV93aGl0ZWxpc3QudHh0CkBAIC0xMjEsNyArMTIxLDcgQEAKIAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgbGVnYWN5LXRlc3QuamFyCisjIGFuZHJvaWQudGVzdC5iYXNlLmphcgoganVuaXRcLmV4dGVuc2lvbnMKIGp1bml0XC5mcmFtZXdvcmsKIGFuZHJvaWRcLnRlc3QKQEAgLTIzNywzICsyMzcsNyBAQAogIyBQYWNrYWdlcyBpbiB0aGUgZ29vZ2xlIG5hbWVzcGFjZSBhY3Jvc3MgYWxsIGJvb3RjbGFzc3BhdGggamFycy4KIGNvbVwuZ29vZ2xlXC5hbmRyb2lkXC4uKgogY29tXC5nb29nbGVcLnZyXC5wbGF0Zm9ybS4qCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQYWNrYWdlcyB1c2VkIGZvciBBbmRyb2lkIGluIENocm9tZSBPUworb3JnXC5jaHJvbWl1bVwuYXJjCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2NoZWNrX2VtdV9ib290Lm1rIGIvY29yZS90YXNrcy9jaGVja19lbXVfYm9vdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODcwNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9jaGVja19lbXVfYm9vdC5tawpAQCAtMCwwICsxLDIzIEBACitjaGVja19lbXVfYm9vdDAgOj0gJChESVNUX0RJUikvJChUQVJHRVRfUFJPRFVDVCktJChUQVJHRVRfQlVJTERfVkFSSUFOVCktZW11bGF0b3ItYm9vdC10ZXN0LXJlc3VsdC50eHQKKyQoY2hlY2tfZW11X2Jvb3QwKSA6IFBSSVZBVEVfUFJFRklYIDo9ICQoVEFSR0VUX1BST0RVQ1QpLSQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpCiskKGNoZWNrX2VtdV9ib290MCkgOiBQUklWQVRFX0VNVUxBVE9SX0JPT1RfVEVTVF9TSCA6PSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC90b29scy9lbXVsYXRvcl9ib290X3Rlc3Quc2gKKyQoY2hlY2tfZW11X2Jvb3QwKSA6IFBSSVZBVEVfQk9PVF9DT01QTEVURV9TVFJJTkcgOj0gImVtdWxhdG9yOiBJTkZPOiBib290IGNvbXBsZXRlZCIKKyQoY2hlY2tfZW11X2Jvb3QwKSA6IFBSSVZBVEVfQk9PVF9GQUlMX1NUUklORyA6PSAiZW11bGF0b3I6IEVSUk9SOiBmYWlsIHRvIGJvb3QgYWZ0ZXIiCiskKGNoZWNrX2VtdV9ib290MCkgOiBQUklWQVRFX1NVQ0NFU1NfRklMRSA6PSAkKERJU1RfRElSKS8kKFBSSVZBVEVfUFJFRklYKS1CT09ULVNVQ0NFU1MudHh0CiskKGNoZWNrX2VtdV9ib290MCkgOiBQUklWQVRFX0ZBSUxfRklMRSA6PSAkKERJU1RfRElSKS8kKFBSSVZBVEVfUFJFRklYKS1CT09ULUZBSUwudHh0CiskKGNoZWNrX2VtdV9ib290MCkgOiAkKElOU1RBTExFRF9RRU1VX1NZU1RFTUlNQUdFKSAgJChJTlNUQUxMRURfUUVNVV9WRU5ET1JJTUFHRSkgXAorICAgICAgICAgICAgICAgICAkKGlmICQoQk9BUkRfVVNFUkRBVEFJTUFHRV9QQVJUSVRJT05fU0laRSksJChQUk9EVUNUX09VVCkvdXNlcmRhdGEuaW1nKSBcCisgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9PVVQpL3JhbWRpc2suaW1nIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3Rvb2xzL2VtdWxhdG9yX2Jvb3RfdGVzdC5zaAorCUBta2RpciAtcCAkKGRpciAkKGNoZWNrX2VtdV9ib290MCkpCisJJChoaWRlKSBybSAtZiAkKGNoZWNrX2VtdV9ib290MCkKKwkkKGhpZGUpIHJtIC1mICQoUFJJVkFURV9TVUNDRVNTX0ZJTEUpCisJJChoaWRlKSBybSAtZiAkKFBSSVZBVEVfRkFJTF9GSUxFKQorCShleHBvcnQgQU5EUk9JRF9QUk9EVUNUX09VVD0kJChjZCAkKFBST0RVQ1RfT1VUKTtwd2QpO1wKKwkJZXhwb3J0IEFORFJPSURfQlVJTERfVE9QPSQkKHB3ZCk7XAorCQkkKFBSSVZBVEVfRU1VTEFUT1JfQk9PVF9URVNUX1NIKSA+ICQoY2hlY2tfZW11X2Jvb3QwKSkKKwkoaWYgZ3JlcCAtcSAkKFBSSVZBVEVfQk9PVF9DT01QTEVURV9TVFJJTkcpICQoY2hlY2tfZW11X2Jvb3QwKTtcCisJdGhlbiBlY2hvIGJvb3Rfc3VjY2VlZGVkID4gJChQUklWQVRFX1NVQ0NFU1NfRklMRSk7IGZpKQorCShpZiBncmVwIC1xICQoUFJJVkFURV9CT09UX0ZBSUxfU1RSSU5HKSAkKGNoZWNrX2VtdV9ib290MCk7XAorCXRoZW4gZWNobyBib290X2ZhaWxlZCA+ICQoUFJJVkFURV9GQUlMX0ZJTEUpOyBmaSkKKy5QSE9OWTogY2hlY2tfZW11X2Jvb3QKK2NoZWNrX2VtdV9ib290OiAkKGNoZWNrX2VtdV9ib290MCkKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvY29sbGVjdF9ncGxfc291cmNlcy5tayBiL2NvcmUvdGFza3MvY29sbGVjdF9ncGxfc291cmNlcy5tawppbmRleCAzMGJhNjJiLi43MGYwYWZlIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2NvbGxlY3RfZ3BsX3NvdXJjZXMubWsKKysrIGIvY29yZS90YXNrcy9jb2xsZWN0X2dwbF9zb3VyY2VzLm1rCkBAIC0xMiwyMCArMTIsMjIgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotZ3BsX3NvdXJjZV90Z3ogOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZ3BsX3NvdXJjZSxIT1NULENPTU1PTikvZ3BsX3NvdXJjZS50Z3oKK2lmZGVmIGRpc3RfZ29hbAorCisjIFRoZSBydWxlIGJlbG93IGRvZXNuJ3QgaGF2ZSBkZXBlbmRlbmljZXMgb24gdGhlIGZpbGVzIHRoYXQgaXQgY29waWVzLAorIyBzbyBtYW51YWxseSBnZW5lcmF0ZSBkaXJlY3RseSBpbnRvIHRoZSBESVNUX0RJUiBkaXJlY3RvcnkgdGhhdCBpcyBhbHdheXMKKyMgd2lwZWQgYmV0d2VlbiBkaXN0IGJ1aWxkcy4KK2dwbF9zb3VyY2VfdGd6IDo9ICQoRElTVF9ESVIpL2dwbF9zb3VyY2UudGd6CiAKICMgRk9SQ0Ugc2luY2Ugd2UgY2FuJ3Qga25vdyB3aGV0aGVyIGFueSBvZiB0aGUgc291cmNlcyBjaGFuZ2VkCiAkKGdwbF9zb3VyY2VfdGd6KTogUFJJVkFURV9QQVRIUyA6PSAkKHNvcnQgJChwYXRzdWJzdCAlLywgJSwgJChkaXIgJChBTExfR1BMX01PRFVMRV9MSUNFTlNFX0ZJTEVTKSkpKQotJChncGxfc291cmNlX3RneikgOiAkKEFMTF9HUExfTU9EVUxFX0xJQ0VOU0VfRklMRVMpIEZPUkNFCiskKGdwbF9zb3VyY2VfdGd6KSA6ICQoQUxMX0dQTF9NT0RVTEVfTElDRU5TRV9GSUxFUykKIAlAZWNobyBQYWNrYWdlIGdwbCBzb3VyY2VzOiAkQAotCUBybSAtcmYgJChkaXIgJEApICYmIG1rZGlyIC1wICQoZGlyICRAKQogCSQoaGlkZSkgdGFyIGNmeiAkQCAtLWV4Y2x1ZGUgIi5naXQqIiAkKFBSSVZBVEVfUEFUSFMpCiAKLQotLlBIT05ZOiBncGxfc291cmNlX3RnegotZ3BsX3NvdXJjZV90Z3ogOiAkKGdwbF9zb3VyY2VfdGd6KQotCiAjIERpc3QgdGhlIHRneiBvbmx5IGlmIHdlIGFyZSBkb2luZyBhIGZ1bGwgYnVpbGQKIGlmZXEgKCwkKFRBUkdFVF9CVUlMRF9BUFBTKSkKLSQoY2FsbCBkaXN0LWZvci1nb2FscywgZHJvaWRjb3JlLCAkKGdwbF9zb3VyY2VfdGd6KSkKK2Ryb2lkY29yZTogJChncGxfc291cmNlX3RneikKIGVuZGlmCisKK2VuZGlmICMgZGlzdF9nb2FsCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2RldmljZS10ZXN0cy5tayBiL2NvcmUvdGFza3MvZGV2aWNlLXRlc3RzLm1rCmluZGV4IGIxYjkzNmEuLmEyYjYyNmUgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvZGV2aWNlLXRlc3RzLm1rCisrKyBiL2NvcmUvdGFza3MvZGV2aWNlLXRlc3RzLm1rCkBAIC02LDcgKzYsNyBAQAogIwogIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdybHMgZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKQEAgLTE2LDE0ICsxNiwyMyBAQAogLlBIT05ZOiBkZXZpY2UtdGVzdHMKIAogZGV2aWNlLXRlc3RzLXppcCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtdGVzdHMuemlwCi0kKGRldmljZS10ZXN0cy16aXApOiAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkZJTEVTKSAkKFNPT05HX1pJUCkKLQllY2hvICQoc29ydCAkKENPTVBBVElCSUxJVFkuZGV2aWNlLXRlc3RzLkZJTEVTKSkgPiAkQC5saXN0Ci0Jc2VkIC1pIC1lICdzL1xzXCsvXG4vZycgJEAubGlzdAorIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBhIGxpc3Qgb2YgdGVzdCBjb25maWcgZmlsZXMgaW4gZGV2aWNlLXRlc3RzLgorZGV2aWNlLXRlc3RzLWxpc3QtemlwIDo9ICQoUFJPRFVDVF9PVVQpL2RldmljZS10ZXN0c19saXN0LnppcAorJChkZXZpY2UtdGVzdHMtemlwKSA6IC5LQVRJX0lNUExJQ0lUX09VVFBVVFMgOj0gJChkZXZpY2UtdGVzdHMtbGlzdC16aXApCiskKGRldmljZS10ZXN0cy16aXApIDogUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtdGVzdHNfbGlzdAorCiskKGRldmljZS10ZXN0cy16aXApIDogJChDT01QQVRJQklMSVRZLmRldmljZS10ZXN0cy5GSUxFUykgJChTT09OR19aSVApCisJZWNobyAkKHNvcnQgJChDT01QQVRJQklMSVRZLmRldmljZS10ZXN0cy5GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkQC5saXN0CiAJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALWhvc3QubGlzdCB8fCB0cnVlCiAJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQogCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICRAIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJEAtaG9zdC5saXN0IC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQubGlzdAorCXJtIC1mICQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKKwkkKGhpZGUpIGdyZXAgLWUgLiouY29uZmlnJCQgJEAtaG9zdC5saXN0IHwgc2VkIHMlJChIT1NUX09VVCklaG9zdCVnID4gJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQorCSQoaGlkZSkgZ3JlcCAtZSAuKi5jb25maWckJCAkQC10YXJnZXQubGlzdCB8IHNlZCBzJSQoUFJPRFVDVF9PVVQpJXRhcmdldCVnID4+ICQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKGRldmljZS10ZXN0cy1saXN0LXppcCkgLUMgJChkaXIgJEApIC1mICQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKKwlybSAtZiAkQC5saXN0ICRALWhvc3QubGlzdCAkQC10YXJnZXQubGlzdCAkKFBSSVZBVEVfZGV2aWNlX3Rlc3RzX2xpc3QpCiAKIGRldmljZS10ZXN0czogJChkZXZpY2UtdGVzdHMtemlwKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkZXZpY2UtdGVzdHMsICQoZGV2aWNlLXRlc3RzLXppcCkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRldmljZS10ZXN0cywgJChkZXZpY2UtdGVzdHMtemlwKSAkKGRldmljZS10ZXN0cy1saXN0LXppcCkpCiAKIHRlc3RzOiBkZXZpY2UtdGVzdHMKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy5tayBiL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy5tawppbmRleCA3NjNkZDUxLi5jN2YxZGM5IDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMubWsKKysrIGIvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rCkBAIC02LDcgKzYsNyBAQAogIwogIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdybHMgZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKQEAgLTE1LDEyICsxNSwyMSBAQAogLlBIT05ZOiBnZW5lcmFsLXRlc3RzCiAKIGdlbmVyYWwtdGVzdHMtemlwIDo9ICQoUFJPRFVDVF9PVVQpL2dlbmVyYWwtdGVzdHMuemlwCi0kKGdlbmVyYWwtdGVzdHMtemlwKTogJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuRklMRVMpICQoU09PTkdfWklQKQotCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkZJTEVTKSkgPiAkQC5saXN0Ci0Jc2VkIC1pIC1lICdzL1xzXCsvXG4vZycgJEAubGlzdAorIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBhIGxpc3Qgb2YgdGVzdCBjb25maWcgZmlsZXMgaW4gZ2VuZXJhbC10ZXN0cy4KK2dlbmVyYWwtdGVzdHMtbGlzdC16aXAgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0c19saXN0LnppcAorJChnZW5lcmFsLXRlc3RzLXppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoZ2VuZXJhbC10ZXN0cy1saXN0LXppcCkKKyQoZ2VuZXJhbC10ZXN0cy16aXApIDogUFJJVkFURV9nZW5lcmFsX3Rlc3RzX2xpc3QgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0c19saXN0CisKKyQoZ2VuZXJhbC10ZXN0cy16aXApIDogJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuRklMRVMpICQoU09PTkdfWklQKQorCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkZJTEVTKSkgfCB0ciAiICIgIlxuIiA+ICRALmxpc3QKIAlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtaG9zdC5saXN0IHx8IHRydWUKIAlncmVwICQoVEFSR0VUX09VVF9URVNUQ0FTRVMpICRALmxpc3QgPiAkQC10YXJnZXQubGlzdCB8fCB0cnVlCiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJEAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0Lmxpc3QgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC5saXN0CisJcm0gLWYgJChQUklWQVRFX2dlbmVyYWxfdGVzdHNfbGlzdCkKKwkkKGhpZGUpIGdyZXAgLWUgLiouY29uZmlnJCQgJEAtaG9zdC5saXN0IHwgc2VkIHMlJChIT1NUX09VVCklaG9zdCVnID4gJChQUklWQVRFX2dlbmVyYWxfdGVzdHNfbGlzdCkKKwkkKGhpZGUpIGdyZXAgLWUgLiouY29uZmlnJCQgJEAtdGFyZ2V0Lmxpc3QgfCBzZWQgcyUkKFBST0RVQ1RfT1VUKSV0YXJnZXQlZyA+PiAkKFBSSVZBVEVfZ2VuZXJhbF90ZXN0c19saXN0KQorCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICQoZ2VuZXJhbC10ZXN0cy1saXN0LXppcCkgLUMgJChkaXIgJEApIC1mICQoUFJJVkFURV9nZW5lcmFsX3Rlc3RzX2xpc3QpCisJcm0gLWYgJEAubGlzdCAkQC1ob3N0Lmxpc3QgJEAtdGFyZ2V0Lmxpc3QgJChQUklWQVRFX2dlbmVyYWxfdGVzdHNfbGlzdCkKIAogZ2VuZXJhbC10ZXN0czogJChnZW5lcmFsLXRlc3RzLXppcCkKLSQoY2FsbCBkaXN0LWZvci1nb2FscywgZ2VuZXJhbC10ZXN0cywgJChnZW5lcmFsLXRlc3RzLXppcCkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGdlbmVyYWwtdGVzdHMsICQoZ2VuZXJhbC10ZXN0cy16aXApICQoZ2VuZXJhbC10ZXN0cy1saXN0LXppcCkpCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rIGIvY29yZS90YXNrcy9tb2R1bGUtaW5mby5tawppbmRleCBlOWIyYWM3Li5iNDU1MjZmIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rCisrKyBiL2NvcmUvdGFza3MvbW9kdWxlLWluZm8ubWsKQEAgLTExLDYgKzExLDggQEAKIAkJCScicGF0aCI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlBBVEgpKSwiJCh3KSIsICldLCAnIFwKIAkJCScidGFncyI6IFskKGZvcmVhY2ggdywkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlRBR1MpKSwiJCh3KSIsICldLCAnIFwKIAkJCSciaW5zdGFsbGVkIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuSU5TVEFMTEVEKSksIiQodykiLCApXSwgJyBcCisJCQknImNvbXBhdGliaWxpdHlfc3VpdGVzIjogWyQoZm9yZWFjaCB3LCQoc29ydCAkKEFMTF9NT0RVTEVTLiQobSkuQ09NUEFUSUJJTElUWV9TVUlURVMpKSwiJCh3KSIsICldLCAnIFwKKwkJCSciYXV0b190ZXN0X2NvbmZpZyI6IFskKEFMTF9NT0RVTEVTLiQobSkuYXV0b190ZXN0X2NvbmZpZyldLCAnIFwKIAkJCSd9LFxuJyBcCiAJICkgfCBzZWQgLWUgJ3MvLCAqXF0vXS9nJyAtZSAncy8sICpcfS8gfS9nJyAtZSAnJCRzLywkJC8vJyA+PiAkQAogCSQoaGlkZSkgZWNobyAnfScgPj4gJEAKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3Mvb2VtX2ltYWdlLm1rIGIvY29yZS90YXNrcy9vZW1faW1hZ2UubWsKaW5kZXggMzJkNTZhNy4uNjZlZWMyMiAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9vZW1faW1hZ2UubWsKKysrIGIvY29yZS90YXNrcy9vZW1faW1hZ2UubWsKQEAgLTM1LDcgKzM1LDcgQEAKIAlAbWtkaXIgLXAgJChvZW1pbWFnZV9pbnRlcm1lZGlhdGVzKSAmJiBybSAtcmYgJChvZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9vZW1faW1hZ2VfaW5mby50eHQKIAkkKGNhbGwgZ2VuZXJhdGUtdXNlcmltYWdlLXByb3AtZGljdGlvbmFyeSwgJChvZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9vZW1faW1hZ2VfaW5mby50eHQsIHNraXBfZnNjaz10cnVlKQogCSQoaGlkZSkgUEFUSD0kKGZvcmVhY2ggcCwkKElOVEVSTkFMX1VTRVJJTUFHRVNfQklOQVJZX1BBVEhTKSwkKHApOikkJFBBVEggXAotCSAgLi9idWlsZC90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgXAorCSAgYnVpbGQvbWFrZS90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgXAogCSAgJChUQVJHRVRfT1VUX09FTSkgJChvZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9vZW1faW1hZ2VfaW5mby50eHQgJEAgJChUQVJHRVRfT1VUKQogCSQoaGlkZSkgJChjYWxsIGFzc2VydC1tYXgtaW1hZ2Utc2l6ZSwkQCwkKEJPQVJEX09FTUlNQUdFX1BBUlRJVElPTl9TSVpFKSkKIApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9zZGstYWRkb24ubWsgYi9jb3JlL3Rhc2tzL3Nkay1hZGRvbi5tawppbmRleCBlMjY3NzNjLi4xOTdkNDFhIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Nkay1hZGRvbi5taworKysgYi9jb3JlL3Rhc2tzL3Nkay1hZGRvbi5tawpAQCAtMTA1LDIxICsxMDUsMjEgQEAKIAogJChmdWxsX3RhcmdldCk6IFBSSVZBVEVfU1RBR0lOR19ESVIgOj0gJChjYWxsIGFwcGVuZC1wYXRoLCQoc3RhZ2luZyksJChhZGRvbl9kaXJfbGVhZikpCiAKLSQoZnVsbF90YXJnZXQpOiAkKHNka19hZGRvbl9kZXBzKSB8ICQoQUNQKQorJChmdWxsX3RhcmdldCk6ICQoc2RrX2FkZG9uX2RlcHMpIHwgJChBQ1ApICQoU09PTkdfWklQKQogCUBlY2hvIFBhY2thZ2luZyBTREsgQWRkb246ICRACiAJJChoaWRlKSBta2RpciAtcCAkKFBSSVZBVEVfU1RBR0lOR19ESVIpL2RvY3MKIAkkKGhpZGUpIGZvciBkIGluICQoUFJJVkFURV9ET0NTX0RJUlMpOyBkbyBcCiAJICAgICQoQUNQKSAtciAkJGQgJChQUklWQVRFX1NUQUdJTkdfRElSKS9kb2NzIDtcCiAJICBkb25lCiAJJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpICggRj0kJChwd2QpLyRAIDsgY2QgJChQUklWQVRFX1NUQUdJTkdfRElSKS8uLiAmJiB6aXAgLXJxWCAkJEYgJChub3RkaXIgJChQUklWQVRFX1NUQUdJTkdfRElSKSkgKQorCSQoaGlkZSkgJChTT09OR19aSVApIC1vICRAIC1DICQoZGlyICQoUFJJVkFURV9TVEFHSU5HX0RJUikpIC1EICQoUFJJVkFURV9TVEFHSU5HX0RJUikKIAogJChmdWxsX3RhcmdldF9pbWcpOiBQUklWQVRFX1NUQUdJTkdfRElSIDo9ICQoY2FsbCBhcHBlbmQtcGF0aCwkKHN0YWdpbmcpLCQoYWRkb25fZGlyX2ltZykpL2ltYWdlcy8kKFRBUkdFVF9DUFVfQUJJKQotJChmdWxsX3RhcmdldF9pbWcpOiAkKGZ1bGxfdGFyZ2V0KSAkKGFkZG9uX2ltZ19zb3VyY2VfcHJvcCkgfCAkKEFDUCkKKyQoZnVsbF90YXJnZXRfaW1nKTogJChmdWxsX3RhcmdldCkgJChhZGRvbl9pbWdfc291cmNlX3Byb3ApIHwgJChBQ1ApICQoU09PTkdfWklQKQogCUBlY2hvIFBhY2thZ2luZyBTREsgQWRkb24gU3lzdGVtLUltYWdlOiAkQAogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCiAJJChBQ1ApIC1yICQoUFJPRFVDVF9PVVQpL2RhdGEgJChQUklWQVRFX1NUQUdJTkdfRElSKS9kYXRhCi0JJChoaWRlKSAoIEY9JCQocHdkKS8kQCA7IGNkICQoUFJJVkFURV9TVEFHSU5HX0RJUikvLi4gJiYgemlwIC1ycVggJCRGICQobm90ZGlyICQoUFJJVkFURV9TVEFHSU5HX0RJUikpICkKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtbyAkQCAtQyAkKGRpciAkKFBSSVZBVEVfU1RBR0lOR19ESVIpKSAtRCAkKFBSSVZBVEVfU1RBR0lOR19ESVIpCiAKIAogLlBIT05ZOiBzZGtfYWRkb24KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdGVzdF9tYXBwaW5nLm1rIGIvY29yZS90YXNrcy90ZXN0X21hcHBpbmcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyNzViMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvdGVzdF9tYXBwaW5nLm1rCkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgVEVTVF9NQVBQSU5HIGZpbGVzIGluIHNvdXJjZSB0cmVlLgorCisuUEhPTlk6IHRlc3RfbWFwcGluZworCitpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHRlc3RfbWFwcGluZykKK3Rlc3RfbWFwcGluZ3NfemlwIDo9ICQoaW50ZXJtZWRpYXRlcykvdGVzdF9tYXBwaW5ncy56aXAKK3Rlc3RfbWFwcGluZ19saXN0IDo9ICQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9URVNUX01BUFBJTkcubGlzdAordGVzdF9tYXBwaW5ncyA6PSAkKGZpbGUgPCQodGVzdF9tYXBwaW5nX2xpc3QpKQorJCh0ZXN0X21hcHBpbmdzX3ppcCkgOiBQUklWQVRFX3Rlc3RfbWFwcGluZ3MgOj0gJChzdWJzdCAkKG5ld2xpbmUpLFxuLCQodGVzdF9tYXBwaW5ncykpCisKKyQodGVzdF9tYXBwaW5nc196aXApIDogJCh0ZXN0X21hcHBpbmdzKSAkKFNPT05HX1pJUCkKKwlAZWNobyAiQnVpbGRpbmcgYXJ0aWZhY3QgdG8gaW5jbHVkZSBURVNUX01BUFBJTkcgZmlsZXMuIgorCXJtIC1yZiAkQAorCWVjaG8gLWUgIiQoUFJJVkFURV90ZXN0X21hcHBpbmdzKSIgPiAkQC5saXN0CisJJChTT09OR19aSVApIC1vICRAIC1DIC4gLWwgJEAubGlzdAorCXJtIC1mICRALmxpc3QKKwordGVzdF9tYXBwaW5nIDogJCh0ZXN0X21hcHBpbmdzX3ppcCkKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkaXN0X2ZpbGVzIHRlc3RfbWFwcGluZywkKHRlc3RfbWFwcGluZ3NfemlwKSkKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdG9vbHMvYnVpbGRfY3VzdG9tX2ltYWdlLm1rIGIvY29yZS90YXNrcy90b29scy9idWlsZF9jdXN0b21faW1hZ2UubWsKaW5kZXggNzE5Mjc5Yy4uYTExNTFlOSAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy90b29scy9idWlsZF9jdXN0b21faW1hZ2UubWsKKysrIGIvY29yZS90YXNrcy90b29scy9idWlsZF9jdXN0b21faW1hZ2UubWsKQEAgLTYyLDEyICs2MiwxNiBAQAogICAkKGV2YWwgbXlfaW1hZ2VfY29weV9maWxlcyArPSAkKHNyYykpXAogICAkKGV2YWwgbXlfY29weV9wYWlycyArPSAkKHNyYyk6JChteV9zdGFnaW5nX2RpcikvJCh3b3JkIDIsJChwYWlyKSkpKQogCi1pZm5kZWYgQ1VTVE9NX0lNQUdFX0FWQl9LRVlfUEFUSAotIyBJZiBrZXkgcGF0aCBpc24ndCBzcGVjaWZpZWQsIHVzZSB0aGUgZGVmYXVsdCBzaWduaW5nIGFyZ3MuCi1teV9hdmJfc2lnbmluZ19hcmdzIDo9ICQoSU5URVJOQUxfQVZCX1NJR05JTkdfQVJHUykKLWVsc2UKLW15X2F2Yl9zaWduaW5nX2FyZ3MgOj0gXAotICAtLWFsZ29yaXRobSAkKENVU1RPTV9JTUFHRV9BVkJfQUxHT1JJVEhNKSAtLWtleSAkKENVU1RPTV9JTUFHRV9BVkJfS0VZX1BBVEgpCitpZmRlZiBDVVNUT01fSU1BR0VfQVZCX0tFWV9QQVRICitpZm5kZWYgQ1VTVE9NX0lNQUdFX0FWQl9BTEdPUklUSE0KKyAgJChlcnJvciBDVVNUT01fSU1BR0VfQVZCX0FMR09SSVRITSBpcyBub3QgZGVmaW5lZCkKK2VuZGlmCitpZm5kZWYgQ1VTVE9NX0lNQUdFX0FWQl9ST0xMQkFDS19JTkRFWAorICAkKGVycm9yIENVU1RPTV9JTUFHRV9BVkJfUk9MTEJBQ0tfSU5ERVggaXMgbm90IGRlZmluZWQpCitlbmRpZgorIyBzZXQgcm9sbGJhY2tfaW5kZXggdmlhIGZvb3RlciBhcmdzCitDVVNUT01fSU1BR0VfQVZCX0FERF9IQVNIX0ZPT1RFUl9BUkdTICs9IC0tcm9sbGJhY2tfaW5kZXggJChDVVNUT01fSU1BR0VfQVZCX1JPTExCQUNLX0lOREVYKQorQ1VTVE9NX0lNQUdFX0FWQl9BRERfSEFTSFRSRUVfRk9PVEVSX0FSR1MgKz0gLS1yb2xsYmFja19pbmRleCAkKENVU1RPTV9JTUFHRV9BVkJfUk9MTEJBQ0tfSU5ERVgpCiBlbmRpZgogCiAkKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6IFBSSVZBVEVfSU5URVJNRURJQVRFUyA6PSAkKGludGVybWVkaWF0ZXMpCkBAIC04NCw3ICs4OCw4IEBACiAkKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6IFBSSVZBVEVfVkVSSVRZX0JMT0NLX0RFVklDRSA6PSAkKENVU1RPTV9JTUFHRV9WRVJJVFlfQkxPQ0tfREVWSUNFKQogJChteV9idWlsdF9jdXN0b21faW1hZ2UpOiBQUklWQVRFX0RJQ1RfRklMRSA6PSAkKENVU1RPTV9JTUFHRV9ESUNUX0ZJTEUpCiAkKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6IFBSSVZBVEVfQVZCX0FWQlRPT0wgOj0gJChBVkJUT09MKQotJChteV9idWlsdF9jdXN0b21faW1hZ2UpOiBQUklWQVRFX0FWQl9TSUdOSU5HX0FSR1MgOj0gJChteV9hdmJfc2lnbmluZ19hcmdzKQorJChteV9idWlsdF9jdXN0b21faW1hZ2UpOiBQUklWQVRFX0FWQl9LRVlfUEFUSCA6PSAkKENVU1RPTV9JTUFHRV9BVkJfS0VZX1BBVEgpCiskKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6IFBSSVZBVEVfQVZCX0FMR09SSVRITTo9ICQoQ1VTVE9NX0lNQUdFX0FWQl9BTEdPUklUSE0pCiAkKG15X2J1aWx0X2N1c3RvbV9pbWFnZSk6IFBSSVZBVEVfQVZCX0hBU0hfRU5BQkxFIDo9ICQoQ1VTVE9NX0lNQUdFX0FWQl9IQVNIX0VOQUJMRSkKICQobXlfYnVpbHRfY3VzdG9tX2ltYWdlKTogUFJJVkFURV9BVkJfQUREX0hBU0hfRk9PVEVSX0FSR1MgOj0gJChDVVNUT01fSU1BR0VfQVZCX0FERF9IQVNIX0ZPT1RFUl9BUkdTKQogJChteV9idWlsdF9jdXN0b21faW1hZ2UpOiBQUklWQVRFX0FWQl9IQVNIVFJFRV9FTkFCTEUgOj0gJChDVVNUT01fSU1BR0VfQVZCX0hBU0hUUkVFX0VOQUJMRSkKQEAgLTEzMCw4ICsxMzUsMTEgQEAKIAkgICAgZWNobyAidmVyaXR5X2Jsb2NrX2RldmljZT0kKFBSSVZBVEVfVkVSSVRZX0JMT0NLX0RFVklDRSkiID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTKS9pbWFnZV9pbmZvLnR4dCkKIAkkKGlmICQoUFJJVkFURV9TVVBQT1JUX1ZFUklUWV9GRUMpLFwKIAkgICQoaGlkZSkgZWNobyAidmVyaXR5X2ZlYz0kKFBSSVZBVEVfU1VQUE9SVF9WRVJJVFlfRkVDKSIgPj4gJChQUklWQVRFX0lOVEVSTUVESUFURVMpL2ltYWdlX2luZm8udHh0KQorCSQoaWYgJChmaWx0ZXIgZW5nLCAkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksJChoaWRlKSBlY2hvICJ2ZXJpdHlfZGlzYWJsZT10cnVlIiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykvaW1hZ2VfaW5mby50eHQpCiAJJChoaWRlKSBlY2hvICJhdmJfYXZidG9vbD0kKFBSSVZBVEVfQVZCX0FWQlRPT0wpIiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykvaW1hZ2VfaW5mby50eHQKLQkkKGhpZGUpIGVjaG8gImF2Yl9zaWduaW5nX2FyZ3M9JChQUklWQVRFX0FWQl9TSUdOSU5HX0FSR1MpIiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykvaW1hZ2VfaW5mby50eHQKKwkkKGlmICQoUFJJVkFURV9BVkJfS0VZX1BBVEgpLFwKKwkgICQoaGlkZSkgZWNobyAiYXZiX2tleV9wYXRoPSQoUFJJVkFURV9BVkJfS0VZX1BBVEgpIiA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykvaW1hZ2VfaW5mby50eHQ7XAorCSAgICBlY2hvICJhdmJfYWxnb3JpdGhtPSQoUFJJVkFURV9BVkJfQUxHT1JJVEhNKSIgPj4gJChQUklWQVRFX0lOVEVSTUVESUFURVMpL2ltYWdlX2luZm8udHh0KQogCSQoaWYgJChQUklWQVRFX0FWQl9IQVNIX0VOQUJMRSksXAogCSAgJChoaWRlKSBlY2hvICJhdmJfaGFzaF9lbmFibGU9JChQUklWQVRFX0FWQl9IQVNIX0VOQUJMRSkiID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTKS9pbWFnZV9pbmZvLnR4dDtcCiAJICAgIGVjaG8gImF2Yl9hZGRfaGFzaF9mb290ZXJfYXJncz0kKFBSSVZBVEVfQVZCX0FERF9IQVNIX0ZPT1RFUl9BUkdTKSIgPj4gJChQUklWQVRFX0lOVEVSTUVESUFURVMpL2ltYWdlX2luZm8udHh0KQpAQCAtMTQzLDkgKzE1MSw5IEBACiAJICAgIGNhdCAkKFBSSVZBVEVfRElDVF9GSUxFKSA+PiAkKFBSSVZBVEVfSU5URVJNRURJQVRFUykvaW1hZ2VfaW5mby50eHQpCiAJIyBHZW5lcmF0ZSB0aGUgaW1hZ2UuCiAJJChpZiAkKGZpbHRlciBvZW0sJChQUklWQVRFX01PVU5UX1BPSU5UKSksIFwKLQkgICQoaGlkZSkgZWNobyAib2VtLmJ1aWxkbnVtYmVyPSQoQlVJTERfTlVNQkVSKSIgPj4gJChQUklWQVRFX1NUQUdJTkdfRElSKS9vZW0ucHJvcCkKKwkgICQoaGlkZSkgZWNobyAib2VtLmJ1aWxkbnVtYmVyPSQoQlVJTERfTlVNQkVSX0ZST01fRklMRSkiID4+ICQoUFJJVkFURV9TVEFHSU5HX0RJUikvb2VtLnByb3ApCiAJJChoaWRlKSBQQVRIPSQoZm9yZWFjaCBwLCQoSU5URVJOQUxfVVNFUklNQUdFU19CSU5BUllfUEFUSFMpLCQocCk6KSQkUEFUSCBcCi0JICAuL2J1aWxkL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCisJICBidWlsZC9tYWtlL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weSBcCiAJICAkKFBSSVZBVEVfU1RBR0lOR19ESVIpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTKS9pbWFnZV9pbmZvLnR4dCAkQCAkKFRBUkdFVF9PVVQpCiAKIG15X2luc3RhbGxlZF9jdXN0b21faW1hZ2UgOj0gJChQUk9EVUNUX09VVCkvJChub3RkaXIgJChteV9idWlsdF9jdXN0b21faW1hZ2UpKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rIGIvY29yZS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCmluZGV4IDBmYzIwNDUuLjQxZWU3NmYgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5taworKysgYi9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKQEAgLTIxLDYgKzIxLDggQEAKICMgICB0ZXN0X3N1aXRlX3JlYWRtZTogdGhlIHBhdGggdG8gYSBSRUFETUUgZmlsZSBmb3IgdGhpcyB0ZXN0IHN1aXRlCiAjICAgdGVzdF9zdWl0ZV9wcmVidWlsdF90b29sczogdGhlIHNldCBvZiBwcmVidWlsdCB0b29scyB0byBiZSBpbmNsdWRlZCBkaXJlY3RseQogIyAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgJ3Rvb2xzJyBzdWJkaXJlY3Rvcnkgb2YgdGhlIHRlc3Qgc3VpdGUuCisjICAgdGVzdF9zdWl0ZV90b29sczogdGhlIHNldCBvZiB0b29scyBmb3IgdGhpcyB0ZXN0IHN1aXRlCisjCiAjIE91dHB1dCB2YXJpYWJsZXM6CiAjICAgY29tcGF0aWJpbGl0eV96aXA6IHRoZSBwYXRoIHRvIHRoZSBvdXRwdXQgemlwIGZpbGUuCiAKQEAgLTM4LDYgKzQwLDggQEAKICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvJCh0ZXN0X3N1aXRlX3RyYWRlZmVkKSBcCiAgICQodGVzdF9zdWl0ZV9yZWFkbWUpCiAKK3Rlc3RfdG9vbHMgKz0gJCh0ZXN0X3N1aXRlX3Rvb2xzKQorCiBjb21wYXRpYmlsaXR5X3ppcCA6PSAkKG91dF9kaXIpLnppcAogJChjb21wYXRpYmlsaXR5X3ppcCk6IFBSSVZBVEVfTkFNRSA6PSBhbmRyb2lkLSQodGVzdF9zdWl0ZV9uYW1lKQogJChjb21wYXRpYmlsaXR5X3ppcCk6IFBSSVZBVEVfT1VUX0RJUiA6PSAkKG91dF9kaXIpCkBAIC01OSwzICs2Myw0IEBACiB0ZXN0X3N1aXRlX2R5bmFtaWNfY29uZmlnIDo9CiB0ZXN0X3N1aXRlX3JlYWRtZSA6PQogdGVzdF9zdWl0ZV9wcmVidWlsdF90b29scyA6PQordGVzdF9zdWl0ZV90b29scyA6PQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90cmFkZWZlZC10ZXN0cy1saXN0Lm1rIGIvY29yZS90YXNrcy90cmFkZWZlZC10ZXN0cy1saXN0Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmRmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL3RyYWRlZmVkLXRlc3RzLWxpc3QubWsKQEAgLTAsMCArMSwzOCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBMaXN0IGFsbCBUcmFkZUZlZCB0ZXN0cyBmcm9tIENPTVBBVElCSUxJVFkudHJhZGVmZWRfdGVzdHNfZGlyCisuUEhPTlk6IHRyYWRlZmVkLXRlc3RzLWxpc3QKKwordHJhZGVmZWRfdGVzdHMgOj0KKyQoZm9yZWFjaCBkaXIsICQoQ09NUEFUSUJJTElUWS50cmFkZWZlZF90ZXN0c19kaXIpLCBcCisgICQoZXZhbCB0cmFkZWZlZF90ZXN0cyArPSAkKHNoZWxsIGZpbmQgJChkaXIpIC10eXBlIGYgLW5hbWUgIioueG1sIikpKQordHJhZGVmZWRfdGVzdHNfbGlzdF9pbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHRyYWRlZmVkX3Rlc3RzX2xpc3QsSE9TVCxDT01NT04pCit0cmFkZWZlZF90ZXN0c19saXN0X3ppcCA6PSAkKHRyYWRlZmVkX3Rlc3RzX2xpc3RfaW50ZXJtZWRpYXRlcykvdHJhZGVmZWQtdGVzdHNfbGlzdC56aXAKK2FsbF90ZXN0cyA6PQorJChmb3JlYWNoIHRlc3QsICQodHJhZGVmZWRfdGVzdHMpLCBcCisgICQoZXZhbCBhbGxfdGVzdHMgKz0gJCh3b3JkIDIsJChzdWJzdCAvcmVzL2NvbmZpZy8sJChzcGFjZSksJCh0ZXN0KSkpKSkKKyQodHJhZGVmZWRfdGVzdHNfbGlzdF96aXApIDogUFJJVkFURV90cmFkZWZlZF90ZXN0cyA6PSAkKHN1YnN0IC54bWwsLCQoc3Vic3QgJChzcGFjZSksXG4sJChzb3J0ICQoYWxsX3Rlc3RzKSkpKQorJCh0cmFkZWZlZF90ZXN0c19saXN0X3ppcCkgOiBQUklWQVRFX3RyYWRlZmVkX3Rlc3RzX2xpc3QgOj0gJCh0cmFkZWZlZF90ZXN0c19saXN0X2ludGVybWVkaWF0ZXMpL3RyYWRlZmVkLXRlc3RzX2xpc3QKKworJCh0cmFkZWZlZF90ZXN0c19saXN0X3ppcCkgOiAkKHRyYWRlZmVkX3Rlc3RzKSAkKFNPT05HX1pJUCkKKwlAZWNobyAiUGFja2FnZTogJEAiCisJJChoaWRlKSBybSAtcmYgJChkaXIgJEApICYmIG1rZGlyIC1wICQoZGlyICRAKQorCSQoaGlkZSkgZWNobyAtZSAiJChQUklWQVRFX3RyYWRlZmVkX3Rlc3RzKSIgPiAkKFBSSVZBVEVfdHJhZGVmZWRfdGVzdHNfbGlzdCkKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkQCAtQyAkKGRpciAkQCkgLWYgJChQUklWQVRFX3RyYWRlZmVkX3Rlc3RzX2xpc3QpCisKK3RyYWRlZmVkLXRlc3RzLWxpc3QgOiAkKHRyYWRlZmVkX3Rlc3RzX2xpc3RfemlwKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCB0cmFkZWZlZC10ZXN0cy1saXN0LCAkKHRyYWRlZmVkX3Rlc3RzX2xpc3RfemlwKSkKKwordGVzdHM6IHRyYWRlZmVkLXRlc3RzLWxpc3QKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3Mvdm5kay5tayBiL2NvcmUvdGFza3Mvdm5kay5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA0YWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy92bmRrLm1rCkBAIC0wLDAgKzEsMjU5IEBACisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjdXJyZW50X21ha2VmaWxlIDo9ICQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkKKworIyBCT0FSRF9WTkRLX1ZFUlNJT04gbXVzdCBiZSBzZXQgdG8gJ2N1cnJlbnQnIGluIG9yZGVyIHRvIGdlbmVyYXRlIGEgVk5ESyBzbmFwc2hvdC4KK2lmZXEgKCQoQk9BUkRfVk5ES19WRVJTSU9OKSxjdXJyZW50KQorCisjIFBMQVRGT1JNX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldC4KK2lmbmVxICgsJChQTEFURk9STV9WTkRLX1ZFUlNJT04pKQorCisjIEJPQVJEX1ZOREtfUlVOVElNRV9ESVNBQkxFIG11c3Qgbm90IGJlIHNldCB0byAndHJ1ZScuCitpZm5lcSAoJChCT0FSRF9WTkRLX1JVTlRJTUVfRElTQUJMRSksdHJ1ZSkKKworIyBSZXR1cm5zIGFyY2gtc3BlY2lmaWMgbGliY2xhbmdfcnQudWJzYW4qIGxpYnJhcnkgbmFtZS4KKyMgQmVjYXVzZSBWTkRLX0NPUkVfTElCUkFSSUVTIGluY2x1ZGVzIGFsbCBhcmNoIHZhcmlhbnRzIGZvciBsaWJjbGFuZ19ydC51YnNhbioKKyMgbGlicywgdGhlIGFyY2gtc3BlY2lmaWMgbGlicyBhcmUgc2VsZWN0ZWQgc2VwYXJhdGVseS4KKyMKKyMgQXJnczoKKyMgICAkKDEpOiBpZiBub3QgZW1wdHksIGV2YWx1YXRlcyBmb3IgVEFSR0VUXzJORF9BUkNICitkZWZpbmUgY2xhbmctdWJzYW4tdm5kay1jb3JlCiskKHN0cmlwIFwKKyAgJChldmFsIHByZWZpeCA6PSAkKGlmICQoMSksMk5EXywpKSBcCisgICQoYWRkc3VmZml4IC52ZW5kb3IsJCgkKGFkZHByZWZpeCAkKHByZWZpeCksVUJTQU5fUlVOVElNRV9MSUJSQVJZKSkpIFwKKykKK2VuZGVmCisKKyMgUmV0dXJucyBsaXN0IG9mIGZpbGUgcGF0aHMgb2YgdGhlIGludGVybWVkaWF0ZSBvYmpzCisjCisjIEFyZ3M6CisjICAgJCgxKTogbGlzdCBvZiBtb2R1bGUgYW5kIGZpbGVuYW1lIHBhaXJzIChlLmcuLCBsZC5jb25maWcudHh0OmxkLmNvbmZpZy4yNy50eHQgLi4uKQorIyAgICQoMik6IHRhcmdldCBjbGFzcyAoZS5nLiwgU0hBUkVEX0xJQlJBUklFUywgU1RBVElDX0xJQlJBUklFUywgRVRDKQorIyAgICQoMyk6IGlmIG5vdCBlbXB0eSwgZXZhbHVhdGVzIGZvciBUQVJHRVRfMk5EX0FSQ0gKK2RlZmluZSBwYXRocy1vZi1pbnRlcm1lZGlhdGVzCiskKHN0cmlwIFwKKyAgJChmb3JlYWNoIHBhaXIsJCgxKSwgXAorICAgICQoZXZhbCBzcGxpdF9wYWlyIDo9ICQoc3Vic3QgOiwkKHNwYWNlKSwkKHBhaXIpKSkgXAorICAgICQoZXZhbCBtb2R1bGUgOj0gJCh3b3JkIDEsJChzcGxpdF9wYWlyKSkpIFwKKyAgICAkKGV2YWwgZmlsZW5hbWUgOj0gJCh3b3JkIDIsJChzcGxpdF9wYWlyKSkpIFwKKyAgICAkKGV2YWwgZGlyIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsJCgyKSwkKG1vZHVsZSksLCwkKDMpKSkgXAorICAgICQoY2FsbCBhcHBlbmQtcGF0aCwkKGRpciksJChmaWxlbmFtZSkpIFwKKyAgKSBcCispCitlbmRlZgorCisjIFJldHVybnMgcGF0aHMgb2Ygbm90aWNlIGZpbGVzIHVuZGVyICQoVEFSR0VUX09VVF9OT1RJQ0VfRklMRVMpCisjCisjIEFyZ3M6CisjICAgJCgxKTogbGlzdCBvZiBsaWIgbmFtZXMgKGUuZy4sIGxpYmZvby52ZW5kb3IpCisjICAgJCgyKTogdm5kayBsaWIgdHlwZSwgb25lIG9mICd2bmRrJyBvciAndm5kay1zcCcKK2RlZmluZSBwYXRocy1vZi1ub3RpY2UtZmlsZXMKKyQoc3RyaXAgXAorICAkKGV2YWwgbGliX2RpciA6PSBsaWIkKGlmICQoVEFSR0VUX0lTXzY0QklUKSw2NCwpKSBcCisgICQoZXZhbCB2bmRrX2RpciA6PSAkKDIpLSQoUExBVEZPUk1fVk5ES19WRVJTSU9OKSkgXAorICAkKGZvcmVhY2ggbGliLCQoMSksIFwKKyAgICAkKGV2YWwgbm90aWNlX2ZpbGVfbmFtZSA6PSAkKHBhdHN1YnN0ICUudmVuZG9yLCUuc28udHh0LCQobGliKSkpIFwKKyAgICAkKFRBUkdFVF9PVVRfTk9USUNFX0ZJTEVTKS9zcmMvc3lzdGVtLyQobGliX2RpcikvJCh2bmRrX2RpcikvJChub3RpY2VfZmlsZV9uYW1lKSBcCisgICkgXAorKQorZW5kZWYKKworIyBJZiBpbiB0aGUgZnV0dXJlIGxpYmNsYW5nX3J0LnVic2FuKiBpcyByZW1vdmVkIGZyb20gdGhlIFZOREstY29yZSBsaXN0LAorIyBuZWVkIHRvIHVwZGF0ZSB0aGUgcmVsYXRlZCBsb2dpYyBpbiB0aGlzIGZpbGUuCitpZmVxICgsJChmaWx0ZXIgbGliY2xhbmdfcnQudWJzYW4lLCQoVk5ES19DT1JFX0xJQlJBUklFUykpKQorICAkKHdhcm5pbmcgbGliY2xhbmdfcnQudWJzYW4qIGlzIG5vIGxvbmdlciBhIFZOREstY29yZSBsaWJyYXJ5LiBQbGVhc2UgdXBkYXRlIHRoaXMgZmlsZS4pCisgIHZuZGtfY29yZV9saWJzIDo9ICQoYWRkc3VmZml4IC52ZW5kb3IsJChWTkRLX0NPUkVfTElCUkFSSUVTKSkKK2Vsc2UKKyAgdm5ka19jb3JlX2xpYnMgOj0gJChhZGRzdWZmaXggLnZlbmRvciwkKGZpbHRlci1vdXQgbGliY2xhbmdfcnQudWJzYW4lLCQoVk5ES19DT1JFX0xJQlJBUklFUykpKQorCisgIHZuZGtfY29yZV9saWJzICs9ICQoY2FsbCBjbGFuZy11YnNhbi12bmRrLWNvcmUpCisgIGlmZGVmIFRBUkdFVF8yTkRfQVJDSAorICAgIHZuZGtfY29yZV9saWJzICs9ICQoY2FsbCBjbGFuZy11YnNhbi12bmRrLWNvcmUsdHJ1ZSkKKyAgZW5kaWYKK2VuZGlmCisKK3ZuZGtfc3BfbGlicyA6PSAkKGFkZHN1ZmZpeCAudmVuZG9yLCQoVk5ES19TQU1FUFJPQ0VTU19MSUJSQVJJRVMpKQordm5ka19wcml2YXRlX2xpYnMgOj0gJChhZGRzdWZmaXggLnZlbmRvciwkKFZOREtfUFJJVkFURV9MSUJSQVJJRVMpKQorCit2bmRrX3NuYXBzaG90X2xpYnMgOj0gXAorICAkKHZuZGtfY29yZV9saWJzKSBcCisgICQodm5ka19zcF9saWJzKQorCit2bmRrX3ByZWJ1aWx0X3R4dHMgOj0gXAorICBsZC5jb25maWcudHh0IFwKKyAgdm5ka3NwLmxpYnJhcmllcy50eHQgXAorICBsbG5kay5saWJyYXJpZXMudHh0CisKK3ZuZGtfc25hcHNob3RfdG9wIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZuZGstc25hcHNob3QpCit2bmRrX3NuYXBzaG90X291dCA6PSAkKHZuZGtfc25hcHNob3RfdG9wKS92bmRrLXNuYXBzaG90Cit2bmRrX3NuYXBzaG90X2NvbmZpZ3Nfb3V0IDo9ICQodm5ka19zbmFwc2hvdF90b3ApL2NvbmZpZ3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZuZGtjb3JlLmxpYnJhcmllcy50eHQKK3ZuZGtjb3JlLmxpYnJhcmllcy50eHQgOj0gJCh2bmRrX3NuYXBzaG90X2NvbmZpZ3Nfb3V0KS92bmRrY29yZS5saWJyYXJpZXMudHh0CiskKHZuZGtjb3JlLmxpYnJhcmllcy50eHQpOiAkKHZuZGtfY29yZV9saWJzKQorCUBlY2hvICdHZW5lcmF0aW5nOiAkQCcKKwlAcm0gLWYgJEAKKwlAbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBlY2hvIC1uID4gJEAKKwkkKGhpZGUpICQoZm9yZWFjaCBsaWIsJF4sZWNobyAkKHBhdHN1YnN0ICUudmVuZG9yLCUsJChsaWIpKS5zbyA+PiAkQDspCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHZuZGtwcml2YXRlLmxpYnJhcmllcy50eHQKK3ZuZGtwcml2YXRlLmxpYnJhcmllcy50eHQgOj0gJCh2bmRrX3NuYXBzaG90X2NvbmZpZ3Nfb3V0KS92bmRrcHJpdmF0ZS5saWJyYXJpZXMudHh0CiskKHZuZGtwcml2YXRlLmxpYnJhcmllcy50eHQpOiAkKHZuZGtfcHJpdmF0ZV9saWJzKQorCUBlY2hvICdHZW5lcmF0aW5nOiAkQCcKKwlAcm0gLWYgJEAKKwlAbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBlY2hvIC1uID4gJEAKKwkkKGhpZGUpICQoZm9yZWFjaCBsaWIsJF4sZWNobyAkKHBhdHN1YnN0ICUudmVuZG9yLCUsJChsaWIpKS5zbyA+PiAkQDspCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIG1vZHVsZV9wYXRocy50eHQKK21vZHVsZV9wYXRocy50eHQgOj0gJCh2bmRrX3NuYXBzaG90X2NvbmZpZ3Nfb3V0KS9tb2R1bGVfcGF0aHMudHh0CiskKG1vZHVsZV9wYXRocy50eHQpOiAkKHZuZGtfc25hcHNob3RfbGlicykKKwlAZWNobyAnR2VuZXJhdGluZzogJEAnCisJQHJtIC1mICRACisJQG1rZGlyIC1wICQoZGlyICRAKQorCSQoaGlkZSkgZWNobyAtbiA+ICRACisJJChoaWRlKSAkKGZvcmVhY2ggbGliLCReLGVjaG8gJChwYXRzdWJzdCAlLnZlbmRvciwlLCQobGliKSkuc28gJChBTExfTU9EVUxFUy4kKGxpYikuUEFUSCkgPj4gJEA7KQorCisKK3ZuZGtfc25hcHNob3RfY29uZmlncyA6PSBcCisgICQodm5ka2NvcmUubGlicmFyaWVzLnR4dCkgXAorICAkKHZuZGtwcml2YXRlLmxpYnJhcmllcy50eHQpIFwKKyAgJChtb2R1bGVfcGF0aHMudHh0KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdm5ka19zbmFwc2hvdF96aXAKK3ZuZGtfc25hcHNob3RfdmFyaWFudCA6PSAkKHZuZGtfc25hcHNob3Rfb3V0KS8kKFRBUkdFVF9BUkNIKQordm5ka19saWJfZGlyIDo9ICQodm5ka19zbmFwc2hvdF92YXJpYW50KS9hcmNoLSQoVEFSR0VUX0FSQ0gpLSQoVEFSR0VUX0FSQ0hfVkFSSUFOVCkKK3ZuZGtfbGliX2Rpcl8ybmQgOj0gJCh2bmRrX3NuYXBzaG90X3ZhcmlhbnQpL2FyY2gtJChUQVJHRVRfMk5EX0FSQ0gpLSQoVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQpCit2bmRrX3NuYXBzaG90X3ppcCA6PSAkKFBST0RVQ1RfT1VUKS9hbmRyb2lkLXZuZGstJChUQVJHRVRfQVJDSCkuemlwCisKKyQodm5ka19zbmFwc2hvdF96aXApOiBQUklWQVRFX1ZOREtfU05BUFNIT1RfT1VUIDo9ICQodm5ka19zbmFwc2hvdF9vdXQpCisKKyQodm5ka19zbmFwc2hvdF96aXApOiBQUklWQVRFX1ZOREtfQ09SRV9PVVQgOj0gJCh2bmRrX2xpYl9kaXIpL3NoYXJlZC92bmRrLWNvcmUKKyQodm5ka19zbmFwc2hvdF96aXApOiBQUklWQVRFX1ZOREtfQ09SRV9JTlRFUk1FRElBVEVTIDo9IFwKKyAgJChjYWxsIHBhdGhzLW9mLWludGVybWVkaWF0ZXMsJChmb3JlYWNoIGxpYiwkKHZuZGtfY29yZV9saWJzKSwkKGxpYik6JChsaWIpLnNvKSxTSEFSRURfTElCUkFSSUVTKQorCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9WTkRLX1NQX09VVCA6PSAkKHZuZGtfbGliX2Rpcikvc2hhcmVkL3ZuZGstc3AKKyQodm5ka19zbmFwc2hvdF96aXApOiBQUklWQVRFX1ZOREtfU1BfSU5URVJNRURJQVRFUyA6PSBcCisgICQoY2FsbCBwYXRocy1vZi1pbnRlcm1lZGlhdGVzLCQoZm9yZWFjaCBsaWIsJCh2bmRrX3NwX2xpYnMpLCQobGliKTokKGxpYikuc28pLFNIQVJFRF9MSUJSQVJJRVMpCisKKyQodm5ka19zbmFwc2hvdF96aXApOiBQUklWQVRFX0NPTkZJR1NfT1VUIDo9ICQodm5ka19zbmFwc2hvdF92YXJpYW50KS9jb25maWdzCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9DT05GSUdTX0lOVEVSTUVESUFURVMgOj0gXAorICAkKGNhbGwgcGF0aHMtb2YtaW50ZXJtZWRpYXRlcywkKGZvcmVhY2ggdHh0LCQodm5ka19wcmVidWlsdF90eHRzKSwgXAorICAgICQodHh0KTokKHBhdHN1YnN0ICUudHh0LCUuJChQTEFURk9STV9WTkRLX1ZFUlNJT04pLnR4dCwkKHR4dCkpKSxFVEMpIFwKKyAgJCh2bmRrX3NuYXBzaG90X2NvbmZpZ3MpCisKKyQodm5ka19zbmFwc2hvdF96aXApOiBQUklWQVRFX05PVElDRV9GSUxFU19PVVQgOj0gJCh2bmRrX3NuYXBzaG90X3ZhcmlhbnQpL05PVElDRV9GSUxFUworJCh2bmRrX3NuYXBzaG90X3ppcCk6IFBSSVZBVEVfTk9USUNFX0ZJTEVTX0lOVEVSTUVESUFURVMgOj0gXAorICAkKGNhbGwgcGF0aHMtb2Ytbm90aWNlLWZpbGVzLCQodm5ka19jb3JlX2xpYnMpLHZuZGspIFwKKyAgJChjYWxsIHBhdGhzLW9mLW5vdGljZS1maWxlcywkKHZuZGtfc3BfbGlicyksdm5kay1zcCkKKworaWZkZWYgVEFSR0VUXzJORF9BUkNICiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9WTkRLX0NPUkVfT1VUXzJORCA6PSAkKHZuZGtfbGliX2Rpcl8ybmQpL3NoYXJlZC92bmRrLWNvcmUKKyQodm5ka19zbmFwc2hvdF96aXApOiBQUklWQVRFX1ZOREtfQ09SRV9JTlRFUk1FRElBVEVTXzJORCA6PSBcCisgICQoY2FsbCBwYXRocy1vZi1pbnRlcm1lZGlhdGVzLCQoZm9yZWFjaCBsaWIsJCh2bmRrX2NvcmVfbGlicyksJChsaWIpOiQobGliKS5zbyksU0hBUkVEX0xJQlJBUklFUyx0cnVlKQorCiskKHZuZGtfc25hcHNob3RfemlwKTogUFJJVkFURV9WTkRLX1NQX09VVF8yTkQgOj0gJCh2bmRrX2xpYl9kaXJfMm5kKS9zaGFyZWQvdm5kay1zcAorJCh2bmRrX3NuYXBzaG90X3ppcCk6IFBSSVZBVEVfVk5ES19TUF9JTlRFUk1FRElBVEVTXzJORCA6PSBcCisgICQoY2FsbCBwYXRocy1vZi1pbnRlcm1lZGlhdGVzLCQoZm9yZWFjaCBsaWIsJCh2bmRrX3NwX2xpYnMpLCQobGliKTokKGxpYikuc28pLFNIQVJFRF9MSUJSQVJJRVMsdHJ1ZSkKK2VuZGlmCisKKyMgQXJncworIyAgICQoMSk6IGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorIyAgICQoMik6IGxpc3Qgb2YgZmlsZXMgdG8gY29weQorJCh2bmRrX3NuYXBzaG90X3ppcCk6IHByaXZhdGUtY29weS12bmRrLWludGVybWVkaWF0ZXMgPSBcCisgICQoaWYgJCgyKSwkKHN0cmlwIFwKKyAgICBAbWtkaXIgLXAgJCgxKTsgXAorICAgICQoZm9yZWFjaCBmaWxlLCQoMiksIFwKKyAgICAgIGlmIFsgLWUgJChmaWxlKSBdOyB0aGVuIFwKKyAgICAgICAgY3AgLXAgJChmaWxlKSAkKGNhbGwgYXBwZW5kLXBhdGgsJCgxKSwkKHN1YnN0IC52ZW5kb3IsLCQobm90ZGlyICQoZmlsZSkpKSk7IFwKKyAgICAgIGZpOyBcCisgICAgKSBcCisgICkpCisKK3ZuZGtfc25hcHNob3RfZGVwZW5kZW5jaWVzIDo9IFwKKyAgJCh2bmRrX3NuYXBzaG90X2xpYnMpIFwKKyAgJCh2bmRrX3ByZWJ1aWx0X3R4dHMpIFwKKyAgJCh2bmRrX3NuYXBzaG90X2NvbmZpZ3MpCisKKyQodm5ka19zbmFwc2hvdF96aXApOiAkKHZuZGtfc25hcHNob3RfZGVwZW5kZW5jaWVzKSAkKFNPT05HX1pJUCkKKwlAZWNobyAnR2VuZXJhdGluZyBWTkRLIHNuYXBzaG90OiAkQCcKKwlAcm0gLWYgJEAKKwlAcm0gLXJmICQoUFJJVkFURV9WTkRLX1NOQVBTSE9UX09VVCkKKwlAbWtkaXIgLXAgJChQUklWQVRFX1ZOREtfU05BUFNIT1RfT1VUKQorCSQoY2FsbCBwcml2YXRlLWNvcHktdm5kay1pbnRlcm1lZGlhdGVzLCBcCisJCSQoUFJJVkFURV9WTkRLX0NPUkVfT1VUKSwkKFBSSVZBVEVfVk5ES19DT1JFX0lOVEVSTUVESUFURVMpKQorCSQoY2FsbCBwcml2YXRlLWNvcHktdm5kay1pbnRlcm1lZGlhdGVzLCBcCisJCSQoUFJJVkFURV9WTkRLX1NQX09VVCksJChQUklWQVRFX1ZOREtfU1BfSU5URVJNRURJQVRFUykpCisJJChjYWxsIHByaXZhdGUtY29weS12bmRrLWludGVybWVkaWF0ZXMsIFwKKwkJJChQUklWQVRFX0NPTkZJR1NfT1VUKSwkKFBSSVZBVEVfQ09ORklHU19JTlRFUk1FRElBVEVTKSkKKwkkKGNhbGwgcHJpdmF0ZS1jb3B5LXZuZGstaW50ZXJtZWRpYXRlcywgXAorCQkkKFBSSVZBVEVfTk9USUNFX0ZJTEVTX09VVCksJChQUklWQVRFX05PVElDRV9GSUxFU19JTlRFUk1FRElBVEVTKSkKK2lmZGVmIFRBUkdFVF8yTkRfQVJDSAorCSQoY2FsbCBwcml2YXRlLWNvcHktdm5kay1pbnRlcm1lZGlhdGVzLCBcCisJCSQoUFJJVkFURV9WTkRLX0NPUkVfT1VUXzJORCksJChQUklWQVRFX1ZOREtfQ09SRV9JTlRFUk1FRElBVEVTXzJORCkpCisJJChjYWxsIHByaXZhdGUtY29weS12bmRrLWludGVybWVkaWF0ZXMsIFwKKwkJJChQUklWQVRFX1ZOREtfU1BfT1VUXzJORCksJChQUklWQVRFX1ZOREtfU1BfSU5URVJNRURJQVRFU18yTkQpKQorZW5kaWYKKwkkKGhpZGUpICQoU09PTkdfWklQKSAtbyAkQCAtQyAkKFBSSVZBVEVfVk5ES19TTkFQU0hPVF9PVVQpIC1EICQoUFJJVkFURV9WTkRLX1NOQVBTSE9UX09VVCkKKworLlBIT05ZOiB2bmRrCit2bmRrOiAkKHZuZGtfc25hcHNob3RfemlwKQorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHZuZGssICQodm5ka19zbmFwc2hvdF96aXApKQorCisjIGNsZWFyIGdsb2JhbCB2YXJzCitjbGFuZy11YnNhbi12bmRrLWNvcmUgOj0KK3BhdGhzLW9mLWludGVybWVkaWF0ZXMgOj0KK3BhdGhzLW9mLW5vdGljZS1maWxlcyA6PQordm5ka19jb3JlX2xpYnMgOj0KK3ZuZGtfc3BfbGlicyA6PQordm5ka19zbmFwc2hvdF9saWJzIDo9Cit2bmRrX3ByZWJ1aWx0X3R4dHMgOj0KK3ZuZGtfc25hcHNob3RfY29uZmlncyA6PQordm5ka19zbmFwc2hvdF90b3AgOj0KK3ZuZGtfc25hcHNob3Rfb3V0IDo9Cit2bmRrX3NuYXBzaG90X2NvbmZpZ3Nfb3V0IDo9Cit2bmRrX3NuYXBzaG90X3ZhcmlhbnQgOj0KK3ZuZGtfbGliX2RpciA6PQordm5ka19saWJfZGlyXzJuZCA6PQordm5ka19zbmFwc2hvdF9kZXBlbmRlbmNpZXMgOj0KKworZWxzZSAjIEJPQVJEX1ZOREtfUlVOVElNRV9ESVNBQkxFIGlzIHNldCB0byAndHJ1ZScKK2Vycm9yX21zZyA6PSAiQ0FOTk9UIGdlbmVyYXRlIFZOREsgc25hcHNob3QuIEJPQVJEX1ZOREtfUlVOVElNRV9ESVNBQkxFIG11c3Qgbm90IGJlIHNldCB0byAndHJ1ZScuIgorZW5kaWYgIyBCT0FSRF9WTkRLX1JVTlRJTUVfRElTQUJMRQorCitlbHNlICMgUExBVEZPUk1fVk5ES19WRVJTSU9OIGlzIE5PVCBzZXQKK2Vycm9yX21zZyA6PSAiQ0FOTk9UIGdlbmVyYXRlIFZOREsgc25hcHNob3QuIFBMQVRGT1JNX1ZOREtfVkVSU0lPTiBtdXN0IGJlIHNldC4iCitlbmRpZiAjIFBMQVRGT1JNX1ZOREtfVkVSU0lPTgorCitlbHNlICMgQk9BUkRfVk5ES19WRVJTSU9OIGlzIE5PVCBzZXQgdG8gJ2N1cnJlbnQnCitlcnJvcl9tc2cgOj0gIkNBTk5PVCBnZW5lcmF0ZSBWTkRLIHNuYXBzaG90LiBCT0FSRF9WTkRLX1ZFUlNJT04gbXVzdCBiZSBzZXQgdG8gJ2N1cnJlbnQnLiIKK2VuZGlmICMgQk9BUkRfVk5ES19WRVJTSU9OCisKK2lmbmVxICgsJChlcnJvcl9tc2cpKQorCisuUEhPTlk6IHZuZGsKK3ZuZGs6CisJJChjYWxsIGVjaG8tZXJyb3IsJChjdXJyZW50X21ha2VmaWxlKSwkKGVycm9yX21zZykpCisJZXhpdCAxCisKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RfY29uZmlnX2NvbW1vbi5tayBiL2NvcmUvdGVzdF9jb25maWdfY29tbW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4N2Y5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RfY29uZmlnX2NvbW1vbi5tawpAQCAtMCwwICsxLDU2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gVEVTVF9DT05GSUcKKworIyBPdXRwdXQgdGVzdCBjb25maWcgZmlsZXMgdG8gdGVzdGNhc2VzIGRpcmVjdG9yeS4KK2lmZXEgKCwkKGZpbHRlciBnZW5lcmFsLXRlc3RzLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpKSkKKyAgTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSArPSBnZW5lcmFsLXRlc3RzCitlbmRpZgorCitMT0NBTF9NT0RVTEVfU1VGRklYIDo9IC5jb25maWcKKworbXlfdGVzdF9jb25maWdfZmlsZSA6PSAkKHdpbGRjYXJkICQoTE9DQUxfUEFUSCkvJChMT0NBTF9NT0RVTEUpLnhtbCkKK0xPQ0FMX1NSQ19GSUxFUyA6PQorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCisKKyMgVGhlIHRlc3QgY29uZmlnIGlzIG5vdCBpbiBhIHN0YW5kYWxvbmUgWE1MIGZpbGUuCitpZm5kZWYgbXlfdGVzdF9jb25maWdfZmlsZQorCitpZm5kZWYgTE9DQUxfVEVTVF9DT05GSUdfT1BUSU9OUworICAkKGNhbGwgcHJldHR5LWVycm9yLExPQ0FMX1RFU1RfQ09ORklHX09QVElPTlMgbXVzdCBiZSBzZXQgaWYgdGhlIHRlc3QgWE1MIGZpbGUgaXMgbm90IHByb3ZpZGVkLikKK2VuZGlmCisKK215X2Jhc2VfdGVzdF9jb25maWdfZmlsZSA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWRUZXN0LnhtbAorbXlfdGVzdF9jb25maWdfZmlsZSA6PSAkKGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpQW5kcm9pZFRlc3QueG1sCisKKyQobXlfdGVzdF9jb25maWdfZmlsZSkgOiBQUklWQVRFX3Rlc3RfY29uZmlnX29wdGlvbnMgOj0gJChMT0NBTF9URVNUX0NPTkZJR19PUFRJT05TKQorJChteV90ZXN0X2NvbmZpZ19maWxlKSA6ICQobXlfYmFzZV90ZXN0X2NvbmZpZ19maWxlKQorCUBlY2hvICJDcmVhdGUgJChub3RkaXIgJEApIHdpdGggb3B0aW9uczogJChQUklWQVRFX3Rlc3RfY29uZmlnX29wdGlvbnMpLiIKKwkkKGV2YWwgX29wdGlvbl94bWwgOj0gXAorCQkkKGZvcmVhY2ggb3B0aW9uLCQoUFJJVkFURV90ZXN0X2NvbmZpZ19vcHRpb25zKSwgXAorCQkJJChldmFsIHAgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQob3B0aW9uKSkpIFwKKwkJCTxvcHRpb24gbmFtZT0iJCh3b3JkIDEsJChwKSkiIHZhbHVlPSIkKHdvcmQgMiwkKHApKSIgXC8+XG4pKQorCSQoaGlkZSkgc2VkICdzJjwvY29uZmlndXJhdGlvbj4mJChfb3B0aW9uX3htbCk8L2NvbmZpZ3VyYXRpb24+JicgJDwgPiAkQAorCitlbmRpZiAjIG15X3Rlc3RfY29uZmlnX2ZpbGUKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpIDogJChteV90ZXN0X2NvbmZpZ19maWxlKQorCSQoY29weS1maWxlLXRvLXRhcmdldCkKKworbXlfYmFzZV90ZXN0X2NvbmZpZ19maWxlIDo9CitteV90ZXN0X2NvbmZpZ19maWxlIDo9CmRpZmYgLS1naXQgYS9jb3JlL3ZlcnNpb25fZGVmYXVsdHMubWsgYi9jb3JlL3ZlcnNpb25fZGVmYXVsdHMubWsKaW5kZXggYmE0OTRmZi4uZDZiYWQyMSAxMDA2NDQKLS0tIGEvY29yZS92ZXJzaW9uX2RlZmF1bHRzLm1rCisrKyBiL2NvcmUvdmVyc2lvbl9kZWZhdWx0cy5tawpAQCAtMjQsOCArMjQsOSBAQAogIyAgICAgREVGQVVMVF9BUFBfVEFSR0VUX1NESwogIyAgICAgQlVJTERfSUQKICMgICAgIEJVSUxEX05VTUJFUgotIyAgICAgQlVJTERfREFURVRJTUUKICMgICAgIFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENICisjICAgICBQTEFURk9STV9WTkRLX1ZFUlNJT04KKyMgICAgIFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUwogIwogCiAjIExvb2sgZm9yIGFuIG9wdGlvbmFsIGZpbGUgY29udGFpbmluZyBvdmVycmlkZXMgb2YgdGhlIGRlZmF1bHRzLApAQCAtMzgsOSArMzksOSBAQAogICBpbmNsdWRlICQoSU5URVJOQUxfQlVJTERfSURfTUFLRUZJTEUpCiBlbmRpZgogCi1ERUZBVUxUX1BMQVRGT1JNX1ZFUlNJT04gOj0gT1BNMQotTUlOX1BMQVRGT1JNX1ZFUlNJT04gOj0gT1BNMQotTUFYX1BMQVRGT1JNX1ZFUlNJT04gOj0gT1BNMQorREVGQVVMVF9QTEFURk9STV9WRVJTSU9OIDo9IFBQUjEKK01JTl9QTEFURk9STV9WRVJTSU9OIDo9IFBQUjEKK01BWF9QTEFURk9STV9WRVJTSU9OIDo9IFBQUjEKIAogQUxMT1dFRF9WRVJTSU9OUyA6PSAkKGNhbGwgYWxsb3dlZC1wbGF0Zm9ybS12ZXJzaW9ucyxcCiAgICQoTUlOX1BMQVRGT1JNX1ZFUlNJT04pLFwKQEAgLTc0LDExICs3NSwxMSBAQAogIyBwbGVhc2UgYWRkIHRoYXQgUExBVEZPUk1fVkVSU0lPTiBhcyB3ZWxsIGFzIGNsZWFuIHVwIG9ic29sZXRlIFBMQVRGT1JNX1ZFUlNJT04ncwogIyBpbiB0aGUgZm9sbG93aW5nIHRleHQgZmlsZToKICMgY3RzL3Rlc3RzL3Rlc3RzL29zL2Fzc2V0cy9wbGF0Zm9ybV92ZXJzaW9ucy50eHQKLVBMQVRGT1JNX1ZFUlNJT04uT1BNMSA6PSA4LjEuMAorUExBVEZPUk1fVkVSU0lPTi5QUFIxIDo9IFAKIAogIyBUaGVzZSBhcmUgdGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgY29kZW5hbWVzLCBpZiB0aGUgYnVpbGQgaXMgbm90IGEgZmluYWwKICMgcmVsZWFzZSBidWlsZC4gIElmIHRoaXMgaXMgYSBmaW5hbCByZWxlYXNlIGJ1aWxkLCBpdCBpcyBzaW1wbHkgIlJFTCIuCi1QTEFURk9STV9WRVJTSU9OX0NPREVOQU1FLk9QTTEgOj0gUkVMCitQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FLlBQUjEgOj0gUAogCiBpZm5kZWYgUExBVEZPUk1fVkVSU0lPTgogICBQTEFURk9STV9WRVJTSU9OIDo9ICQoUExBVEZPUk1fVkVSU0lPTi4kKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkKQEAgLTEwOCwxNSArMTA5LDYgQEAKICAgUExBVEZPUk1fU0RLX1ZFUlNJT04gOj0gMjcKIGVuZGlmCiAKLWlmbmRlZiBQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTgotICAjIFRoaXMgaXMgZGVmaW5pdGlvbiBvZiB0aGUgbWluIFNESyB2ZXJzaW9uIGdpdmVuIHRvIEphY2sgZm9yIHRoZSBjdXJyZW50Ci0gICMgcGxhdGZvcm0uIEZvciByZWxlYXNlZCB2ZXJzaW9uIGl0IHNob3VsZCBiZSB0aGUgc2FtZSBhcwotICAjIFBMQVRGT1JNX1NES19WRVJTSU9OLiBEdXJpbmcgZGV2ZWxvcG1lbnQsIHRoaXMgbnVtYmVyIG1heSBiZSBpbmNyZW1lbnRlZAotICAjIGJlZm9yZSBQTEFURk9STV9TREtfVkVSU0lPTiBpZiB0aGUgcGxhdGZvcm0gc3RhcnRzIHRvIGFkZCBuZXcgamF2YQotICAjIGxhbmd1YWdlIHN1cHBvcnRzLgotICBQTEFURk9STV9KQUNLX01JTl9TREtfVkVSU0lPTiA6PSBvLWIxCi1lbmRpZgotCiBpZm5kZWYgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRQogICBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIDo9ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRS4kKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkKICAgaWZuZGVmIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUKQEAgLTEyNCwxNCArMTE2LDE3IEBACiAgICAgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSA6PSAkKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKQogICBlbmRpZgogCi0gICMgVGhpcyBpcyBhbGwgb2YgdGhlIGRldmVsb3BtZW50IGNvZGVuYW1lcyB0aGF0IGFyZSBhY3RpdmUuICBTaG91bGQgYmUgZWl0aGVyCi0gICMgdGhlIHNhbWUgYXMgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFkZGl0aW9uYWwKLSAgIyBjb2RlbmFtZXMgYWZ0ZXIgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRS4KKyAgIyBUaGlzIGlzIGFsbCBvZiB0aGUgKmFjdGl2ZSogZGV2ZWxvcG1lbnQgY29kZW5hbWVzLiBUaGVyZSBhcmUgZnV0dXJlCisgICMgY29kZW5hbWVzIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuIFRoaXMgY29uZnVzaW5nIG5hbWUgaXMgbmVlZGVkIGJlY2F1c2UKKyAgIyBhbGxfY29kZW5hbWVzIGhhcyBiZWVuIGJha2VkIGludG8gYnVpbGQucHJvcCBmb3IgYWdlcy4KKyAgIworICAjIFNob3VsZCBiZSBlaXRoZXIgdGhlIHNhbWUgYXMgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSBvciBhIGNvbW1hLXNlcGFyYXRlZAorICAjIGxpc3Qgb2YgYWRkaXRpb25hbCBjb2RlbmFtZXMgYWZ0ZXIgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRS4KICAgUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTIDo9CiAKLSAgIyBCdWlsZCBhIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIGNvZGUgbmFtZXMuIEF2b2lkIGR1cGxpY2F0ZXMsIGFuZCBzdG9wIHdoZW4gd2UKKyAgIyBCdWlsZCBhIGxpc3Qgb2YgYWxsIGFjdGl2ZSBjb2RlIG5hbWVzLiBBdm9pZCBkdXBsaWNhdGVzLCBhbmQgc3RvcCB3aGVuIHdlCiAgICMgcmVhY2ggYSBjb2RlbmFtZSB0aGF0IG1hdGNoZXMgUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSAoYW55dGhpbmcgYmV5b25kCi0gICMgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gb3VyIGJ1aWxkLgorICAjIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIG91ciBidWlsZCkuCiAgIF92ZXJzaW9uc19pbl90YXJnZXQgOj0gXAogICAgICQoY2FsbCBmaW5kX2FuZF9lYXJsaWVyLCQoQUxMX1ZFUlNJT05TKSwkKFRBUkdFVF9QTEFURk9STV9WRVJTSU9OKSkKICAgJChmb3JlYWNoIHZlcnNpb24sJChfdmVyc2lvbnNfaW5fdGFyZ2V0KSxcCkBAIC0xMzksOSArMTM0LDIzIEBACiAgICAgJChpZiAkKGZpbHRlciAkKF9jb2RlbmFtZSksJChQTEFURk9STV9WRVJTSU9OX0FMTF9DT0RFTkFNRVMpKSwsXAogICAgICAgJChldmFsIFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUyArPSAkKF9jb2RlbmFtZSkpKSkKIAorICAjIFRoaXMgaXMgYWxsIG9mIHRoZSBpbmFjdGl2ZSBkZXZlbG9wbWVudCBjb2RlbmFtZXMuIEF2YWlsYWJsZSB0byBiZSB0YXJnZXRlZAorICAjIGluIHRoaXMgYnJhbmNoIGJ1dCBpbiB0aGUgZnV0dXJlIHJlbGF0aXZlIHRvIG91ciBjdXJyZW50IHRhcmdldC4KKyAgUExBVEZPUk1fVkVSU0lPTl9GVVRVUkVfQ09ERU5BTUVTIDo9CisKKyAgIyBCdWlsZCBhIGxpc3Qgb2YgYWxsIHVudGFyZ2V0ZWQgY29kZSBuYW1lcy4gQXZvaWQgZHVwbGljYXRlcy4KKyAgX3ZlcnNpb25zX25vdF9pbl90YXJnZXQgOj0gXAorICAgICQoZmlsdGVyLW91dCAkKFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUyksJChBTExfVkVSU0lPTlMpKQorICAkKGZvcmVhY2ggdmVyc2lvbiwkKF92ZXJzaW9uc19ub3RfaW5fdGFyZ2V0KSxcCisgICAgJChldmFsIF9jb2RlbmFtZSA6PSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUuJCh2ZXJzaW9uKSkpXAorICAgICQoaWYgJChmaWx0ZXIgJChfY29kZW5hbWUpLCQoUExBVEZPUk1fVkVSU0lPTl9GVVRVUkVfQ09ERU5BTUVTKSksLFwKKyAgICAgICQoZXZhbCBQTEFURk9STV9WRVJTSU9OX0ZVVFVSRV9DT0RFTkFNRVMgKz0gJChfY29kZW5hbWUpKSkpCisKICAgIyBBbmQgY29udmVydCBmcm9tIHNwYWNlIHNlcGFyYXRlZCB0byBjb21tYSBzZXBhcmF0ZWQuCiAgIFBMQVRGT1JNX1ZFUlNJT05fQUxMX0NPREVOQU1FUyA6PSBcCiAgICAgJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHN0cmlwICQoUExBVEZPUk1fVkVSU0lPTl9BTExfQ09ERU5BTUVTKSkpCisgIFBMQVRGT1JNX1ZFUlNJT05fRlVUVVJFX0NPREVOQU1FUyA6PSBcCisgICAgJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKHN0cmlwICQoUExBVEZPUk1fVkVSU0lPTl9GVVRVUkVfQ09ERU5BTUVTKSkpCiAKIGVuZGlmCiAKQEAgLTE1OCw3ICsxNjcsNyBAQAogICAgICMgYXNzdW1pbmcgdGhlIGRldmljZSBjYW4gb25seSBzdXBwb3J0IEFQSXMgYXMgb2YgdGhlIHByZXZpb3VzIG9mZmljaWFsCiAgICAgIyBwdWJsaWMgcmVsZWFzZS4KICAgICAjIFRoaXMgdmFsdWUgd2lsbCBhbHdheXMgYmUgMCBmb3IgcmVsZWFzZSBidWlsZHMuCi0gICAgUExBVEZPUk1fUFJFVklFV19TREtfVkVSU0lPTiA6PSAwCisgICAgUExBVEZPUk1fUFJFVklFV19TREtfVkVSU0lPTiA6PSAxCiAgIGVuZGlmCiBlbmRpZgogCkBAIC0xNzUsNiArMTg0LDUwIEBACiAgIGVuZGlmCiBlbmRpZgogCitpZm5kZWYgUExBVEZPUk1fVk5ES19WRVJTSU9OCisgICMgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgVk5ESyB2ZXJzaW9uIGZvciB0aGUgY3VycmVudCBWTkRLIGxpYnJhcmllcy4KKyAgIyBUaGUgdmVyc2lvbiBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUgPT0gUkVMLgorICAjIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBzZXQgdG8gYSBDT0RFTkFNRSB2ZXJzaW9uLiBUaGUgQUJJIGlzIGFsbG93ZWQgdG8gYmUKKyAgIyBjaGFuZ2VkIG9ubHkgYmVmb3JlIHRoZSBBbmRyb2lkIHZlcnNpb24gaXMgcmVsZWFzZWQuIE9uY2UKKyAgIyBQTEFURk9STV9WTkRLX1ZFUlNJT04gaXMgc2V0IHRvIGFjdHVhbCB2ZXJzaW9uLCB0aGUgQUJJIGZvciB0aGlzIHZlcnNpb24KKyAgIyB3aWxsIGJlIGZyb3pvbiBhbmQgZW1pdCBidWlsZCBlcnJvcnMgaWYgYW55IEFCSSBmb3IgdGhlIFZOREsgbGlicyBhcmUKKyAgIyBjaGFuZ2VkLgorICAjIEFmdGVyIHRoYXQgdGhlIHNuYXBzaG90IG9mIHRoZSBWTkRLIHdpdGggdGhpcyB2ZXJzaW9uIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAjCisgICMgVGhlIFZOREsgdmVyc2lvbiBmb2xsb3dzIFBMQVRGT1JNX1NES19WRVJTSU9OLgorICBpZmVxIChSRUwsJChQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FKSkKKyAgICBQTEFURk9STV9WTkRLX1ZFUlNJT04gOj0gJChQTEFURk9STV9TREtfVkVSU0lPTikKKyAgZWxzZQorICAgIFBMQVRGT1JNX1ZOREtfVkVSU0lPTiA6PSAkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpCisgIGVuZGlmCitlbmRpZgorCitpZm5kZWYgUExBVEZPUk1fU1lTVEVNU0RLX01JTl9WRVJTSU9OCisgICMgVGhpcyBpcyB0aGUgb2xkZXN0IHZlcnNpb24gb2Ygc3lzdGVtIFNESyB0aGF0IHRoZSBwbGF0Zm9ybSBzdXBwb3J0cy4gQ29udHJhcnkKKyAgIyB0byB0aGUgcHVibGljIFNESyB3aGVyZSBwbGF0Zm9ybSBlc3NlbnRpYWxseSBzdXBwb3J0cyBhbGwgcHJldmlvdXMgU0RLIHZlcnNpb25zLAorICAjIHBsYXRmb3JtIHN1cHBvcnRzIG9ubHkgYSBmZXcgbnVtYmVyIG9mIHJlY2VudCBzeXN0ZW0gU0RLIHZlcnNpb25zIGFzIHNvbWUgb2YKKyAgIyBvbGQgc3lzdGVtIEFQSXMgYXJlIGdyYWR1YWxseSBkZXByZWNhdGVkLCByZW1vdmVkIGFuZCB0aGVuIGRlbGV0ZWQuCisgICMgSG93ZXZlciwgY3VycmVudGx5IGluIFAsIHdlIG9ubHkgc3VwcG9ydCB0aGUgc2luZ2xlIGxhdGVzdCB2ZXJzaW9uIHNpbmNlIHRoZXJlCisgICMgaXMgbm8gb2xkIHN5c3RlbSBTREsgdmVyc2lvbnMuIFRoZXJlZm9yZSwgdGhpcyBpcyBzZXQgdG8gZW1wdHkgZm9yIG5vdy4gVGhpcworICAjIHNob3VsZCBsYXRlciAoaW4gcG9zdCBQKSBiZSBzZXQgdG8gYSBudW1iZXIsIGxpa2UgMjguCisgIFBMQVRGT1JNX1NZU1RFTVNES19NSU5fVkVSU0lPTiA6PQorZW5kaWYKKworIyBUaGlzIGlzIHRoZSBsaXN0IG9mIHN5c3RlbSBTREsgdmVyc2lvbnMgdGhhdCB0aGUgY3VycmVudCBwbGF0Zm9ybSBzdXBwb3J0cy4KK1BMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUyA6PQoraWZuZXEgKCwkKFBMQVRGT1JNX1NZU1RFTVNES19NSU5fVkVSU0lPTikpCisgICQoaWYgJChjYWxsIG1hdGhfaXNfbnVtYmVyLCQoUExBVEZPUk1fU1lTVEVNU0RLX01JTl9WRVJTSU9OKSksLFwKKyAgICAkKGVycm9yIFBMQVRGT1JNX1NZU1RFTVNES19NSU5fVkVSU0lPTiBtdXN0IGJlIGEgbnVtYmVyLCBidXQgd2FzICQoUExBVEZPUk1fU1lTVEVNU0RLX01JTl9WRVJTSU9OKSkpCisgIFBMQVRGT1JNX1NZU1RFTVNES19WRVJTSU9OUyA6PSAkKGNhbGwgaW50X3JhbmdlX2xpc3QsJChQTEFURk9STV9TWVNURU1TREtfTUlOX1ZFUlNJT04pLCQoUExBVEZPUk1fU0RLX1ZFUlNJT04pKQorZW5kaWYKKyMgUGxhdGZvcm0gYWx3YXlzIHN1cHBvcnRzIHRoZSBjdXJyZW50IHZlcnNpb24KK2lmZXEgKFJFTCwkKFBMQVRGT1JNX1ZFUlNJT05fQ09ERU5BTUUpKQorICBQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMgKz0gJChQTEFURk9STV9TREtfVkVSU0lPTikKK2Vsc2UKKyAgUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TICs9ICQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkKK2VuZGlmCitQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMgOj0gJChzdHJpcCAkKHNvcnQgJChQTEFURk9STV9TWVNURU1TREtfVkVSU0lPTlMpKSkKKwogaWZuZGVmIFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENICiAgICAgIyAgVXNlZCB0byBpbmRpY2F0ZSB0aGUgc2VjdXJpdHkgcGF0Y2ggdGhhdCBoYXMgYmVlbiBhcHBsaWVkIHRvIHRoZSBkZXZpY2UuCiAgICAgIyAgSXQgbXVzdCBzaWduaWZ5IHRoYXQgdGhlIGJ1aWxkIGluY2x1ZGVzIGFsbCBzZWN1cml0eSBwYXRjaGVzIGlzc3VlZCB1cCB0aHJvdWdoIHRoZSBkZXNpZ25hdGVkIEFuZHJvaWQgUHVibGljIFNlY3VyaXR5IEJ1bGxldGluLgpAQCAtMjA3LDEyICsyNjAsMTggQEAKICAgQlVJTERfREFURVRJTUUgOj0gJChzaGVsbCBkYXRlICslcykKIGVuZGlmCiAKLWlmbmVxICgsJChmaW5kc3RyaW5nIERhcndpbiwkKHNoZWxsIHVuYW1lIC1zbSkpKQoraWZuZXEgKCwkKGZpbmRzdHJpbmcgRGFyd2luLCQoVU5BTUUpKSkKIERBVEUgOj0gZGF0ZSAtciAkKEJVSUxEX0RBVEVUSU1FKQogZWxzZQogREFURSA6PSBkYXRlIC1kIEAkKEJVSUxEX0RBVEVUSU1FKQogZW5kaWYKIAorIyBFdmVyeXRoaW5nIHNob3VsZCBiZSB1c2luZyBCVUlMRF9EQVRFVElNRV9GUk9NX0ZJTEUgaW5zdGVhZC4KKyMgQlVJTERfREFURVRJTUUgYW5kIERBVEUgY2FuIGJlIHJlbW92ZWQgb25jZSBCVUlMRF9OVU1CRVIgbW92ZXMKKyMgdG8gc29vbmdfdWkuCitCVUlMRF9EQVRFVElNRSA6PQorCitIQVNfQlVJTERfTlVNQkVSIDo9IHRydWUKIGlmbmRlZiBCVUlMRF9OVU1CRVIKICAgIyBCVUlMRF9OVU1CRVIgc2hvdWxkIGJlIHNldCB0byB0aGUgc291cmNlIGNvbnRyb2wgdmFsdWUgdGhhdAogICAjIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNvdXJjZSBjb2RlLiAgRS5nLiwgYQpAQCAtMjI0LDQgKzI4MywxMiBAQAogICAjIGZyb20gdGhpcyBkYXRlL3RpbWUiIHZhbHVlLiAgTWFrZSBpdCBzdGFydCB3aXRoIGEgbm9uLWRpZ2l0IHNvIHRoYXQKICAgIyBhbnlvbmUgdHJ5aW5nIHRvIHBhcnNlIGl0IGFzIGFuIGludGVnZXIgd2lsbCBwcm9iYWJseSBnZXQgIjAiLgogICBCVUlMRF9OVU1CRVIgOj0gZW5nLiQoc2hlbGwgZWNobyAkJHtVU0VSOjA6Nn0pLiQoc2hlbGwgJChEQVRFKSArJVklbSVkLiVIJU0lUykKKyAgSEFTX0JVSUxEX05VTUJFUiA6PSBmYWxzZQorZW5kaWYKKworaWZuZGVmIFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OCisgICMgVXNlZCB0byBzZXQgbWluaW11bSBzdXBwb3J0ZWQgdGFyZ2V0IHNkayB2ZXJzaW9uLiBBcHBzIHRhcmdldGluZyBzZGsKKyAgIyB2ZXJzaW9uIGxvd2VyIHRoYW4gdGhlIHNldCB2YWx1ZSB3aWxsIGZhaWwgdG8gaW5zdGFsbCBhbmQgcnVuIG9uIGFuZHJvaWQKKyAgIyBkZXZpY2UuCisgIFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OIDo9IDE3CiBlbmRpZgpkaWZmIC0tZ2l0IGEvZW52c2V0dXAuc2ggYi9lbnZzZXR1cC5zaAppbmRleCA0Y2JlM2U3Li5jZjYxOTUwIDEwMDY0NAotLS0gYS9lbnZzZXR1cC5zaAorKysgYi9lbnZzZXR1cC5zaApAQCAtMSw4ICsxLDE0IEBACiBmdW5jdGlvbiBobW0oKSB7CiBjYXQgPDxFT0YKKworUnVuICJtIGhlbHAiIGZvciBoZWxwIHdpdGggdGhlIGJ1aWxkIHN5c3RlbSBpdHNlbGYuCisKIEludm9rZSAiLiBidWlsZC9lbnZzZXR1cC5zaCIgZnJvbSB5b3VyIHNoZWxsIHRvIGFkZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byB5b3VyIGVudmlyb25tZW50OgogLSBsdW5jaDogICAgIGx1bmNoIDxwcm9kdWN0X25hbWU+LTxidWlsZF92YXJpYW50PgotLSB0YXBhczogICAgIHRhcGFzIFs8QXBwMT4gPEFwcDI+IC4uLl0gW2FybXx4ODZ8bWlwc3xhcm12NXxhcm02NHx4ODZfNjR8bWlwczY0XSBbZW5nfHVzZXJkZWJ1Z3x1c2VyXQorICAgICAgICAgICAgIFNlbGVjdHMgPHByb2R1Y3RfbmFtZT4gYXMgdGhlIHByb2R1Y3QgdG8gYnVpbGQsIGFuZCA8YnVpbGRfdmFyaWFudD4gYXMgdGhlIHZhcmlhbnQgdG8KKyAgICAgICAgICAgICBidWlsZCwgYW5kIHN0b3JlcyB0aG9zZSBzZWxlY3Rpb25zIGluIHRoZSBlbnZpcm9ubWVudCB0byBiZSByZWFkIGJ5IHN1YnNlcXVlbnQKKyAgICAgICAgICAgICBpbnZvY2F0aW9ucyBvZiAnbScgZXRjLgorLSB0YXBhczogICAgIHRhcGFzIFs8QXBwMT4gPEFwcDI+IC4uLl0gW2FybXx4ODZ8bWlwc3xhcm02NHx4ODZfNjR8bWlwczY0XSBbZW5nfHVzZXJkZWJ1Z3x1c2VyXQogLSBjcm9vdDogICAgIENoYW5nZXMgZGlyZWN0b3J5IHRvIHRoZSB0b3Agb2YgdGhlIHRyZWUuCiAtIG06ICAgICAgICAgTWFrZXMgZnJvbSB0aGUgdG9wIG9mIHRoZSB0cmVlLgogLSBtbTogICAgICAgIEJ1aWxkcyBhbGwgb2YgdGhlIG1vZHVsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBidXQgbm90IHRoZWlyIGRlcGVuZGVuY2llcy4KQEAgLTQ1LDIwICs1MSwxOCBAQAogICAgIGNhY2hlZF92YXJzPWBjYXQgJFQvYnVpbGQvZW52c2V0dXAuc2ggfCB0ciAnKCknICcgICcgfCBhd2sgJ3tmb3IoaT0xO2k8PU5GO2krKykgaWYoJGl+L2dldF9idWlsZF92YXIvKSBwcmludCAkKGkrMSl9JyB8IHNvcnQgLXUgfCB0ciAnXG4nICcgJ2AKICAgICBjYWNoZWRfYWJzX3ZhcnM9YGNhdCAkVC9idWlsZC9lbnZzZXR1cC5zaCB8IHRyICcoKScgJyAgJyB8IGF3ayAne2ZvcihpPTE7aTw9TkY7aSsrKSBpZigkaX4vZ2V0X2Fic19idWlsZF92YXIvKSBwcmludCAkKGkrMSl9JyB8IHNvcnQgLXUgfCB0ciAnXG4nICcgJ2AKICAgICAjIENhbGwgdGhlIGJ1aWxkIHN5c3RlbSB0byBkdW1wIHRoZSAiPHZhbD49PHZhbHVlPiIgcGFpcnMgYXMgYSBzaGVsbCBzY3JpcHQuCi0gICAgYnVpbGRfZGljdHNfc2NyaXB0PWBcY2QgJFQ7IENBTExFRF9GUk9NX1NFVFVQPXRydWUgQlVJTERfU1lTVEVNPWJ1aWxkL2NvcmUgXAotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBtYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1mIGJ1aWxkL2NvcmUvY29uZmlnLm1rIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAtbWFueS12YXJzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIERVTVBfTUFOWV9WQVJTPSIkY2FjaGVkX3ZhcnMiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIERVTVBfTUFOWV9BQlNfVkFSUz0iJGNhY2hlZF9hYnNfdmFycyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgRFVNUF9WQVJfUFJFRklYPSJ2YXJfY2FjaGVfIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBEVU1QX0FCU19WQVJfUFJFRklYPSJhYnNfdmFyX2NhY2hlXyJgCisgICAgYnVpbGRfZGljdHNfc2NyaXB0PWBcYnVpbHRpbiBjZCAkVDsgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXJzLW1vZGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgLS12YXJzPSIkY2FjaGVkX3ZhcnMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tYWJzLXZhcnM9IiRjYWNoZWRfYWJzX3ZhcnMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tdmFyLXByZWZpeD12YXJfY2FjaGVfIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tYWJzLXZhci1wcmVmaXg9YWJzX3Zhcl9jYWNoZV9gCiAgICAgbG9jYWwgcmV0PSQ/CiAgICAgaWYgWyAkcmV0IC1uZSAwIF0KICAgICB0aGVuCiAgICAgICAgIHVuc2V0IGJ1aWxkX2RpY3RzX3NjcmlwdAogICAgICAgICByZXR1cm4gJHJldAogICAgIGZpCi0gICAgIyBFeGN1dGUgdGhlIHNjcmlwdCB0byBzdG9yZSB0aGUgIjx2YWw+PTx2YWx1ZT4iIHBhaXJzIGFzIHNoZWxsIHZhcmlhYmxlcy4KKyAgICAjIEV4ZWN1dGUgdGhlIHNjcmlwdCB0byBzdG9yZSB0aGUgIjx2YWw+PTx2YWx1ZT4iIHBhaXJzIGFzIHNoZWxsIHZhcmlhYmxlcy4KICAgICBldmFsICIkYnVpbGRfZGljdHNfc2NyaXB0IgogICAgIHJldD0kPwogICAgIHVuc2V0IGJ1aWxkX2RpY3RzX3NjcmlwdApAQCAtOTksOCArMTAzLDcgQEAKICAgICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIiA+JjIKICAgICAgICAgcmV0dXJuCiAgICAgZmkKLSAgICAoXGNkICRUOyBDQUxMRURfRlJPTV9TRVRVUD10cnVlIEJVSUxEX1NZU1RFTT1idWlsZC9jb3JlIFwKLSAgICAgIGNvbW1hbmQgbWFrZSAtLW5vLXByaW50LWRpcmVjdG9yeSAtZiBidWlsZC9jb3JlL2NvbmZpZy5tayBkdW1wdmFyLWFicy0kMSkKKyAgICAoXGNkICRUOyBidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tZHVtcHZhci1tb2RlIC0tYWJzICQxKQogfQogCiAjIEdldCB0aGUgZXhhY3QgdmFsdWUgb2YgYSBidWlsZCB2YXJpYWJsZS4KQEAgLTExNyw4ICsxMjAsNyBAQAogICAgICAgICBlY2hvICJDb3VsZG4ndCBsb2NhdGUgdGhlIHRvcCBvZiB0aGUgdHJlZS4gIFRyeSBzZXR0aW5nIFRPUC4iID4mMgogICAgICAgICByZXR1cm4KICAgICBmaQotICAgIChcY2QgJFQ7IENBTExFRF9GUk9NX1NFVFVQPXRydWUgQlVJTERfU1lTVEVNPWJ1aWxkL2NvcmUgXAotICAgICAgY29tbWFuZCBtYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5IC1mIGJ1aWxkL2NvcmUvY29uZmlnLm1rIGR1bXB2YXItJDEpCisgICAgKFxjZCAkVDsgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXItbW9kZSAkMSkKIH0KIAogIyBjaGVjayB0byBzZWUgaWYgdGhlIHN1cHBsaWVkIHByb2R1Y3QgaXMgb25lIHdlIGNhbiBidWlsZApAQCAtMjM1LDcgKzIzNywxMiBAQAogICAgICAgICAgICAgOzsKICAgICBlc2FjCiAKLSAgICBleHBvcnQgQU5EUk9JRF9CVUlMRF9QQVRIUz0kKGdldF9idWlsZF92YXIgQU5EUk9JRF9CVUlMRF9QQVRIUyk6JEFORFJPSURfVE9PTENIQUlOOiRBTkRST0lEX1RPT0xDSEFJTl8yTkRfQVJDSDokQU5EUk9JRF9ERVZfU0NSSVBUUzoKKyAgICBBTkRST0lEX0JVSUxEX1BBVEhTPSQoZ2V0X2J1aWxkX3ZhciBBTkRST0lEX0JVSUxEX1BBVEhTKTokQU5EUk9JRF9UT09MQ0hBSU4KKyAgICBpZiBbIC1uICIkQU5EUk9JRF9UT09MQ0hBSU5fMk5EX0FSQ0giIF07IHRoZW4KKyAgICAgICAgQU5EUk9JRF9CVUlMRF9QQVRIUz0kQU5EUk9JRF9CVUlMRF9QQVRIUzokQU5EUk9JRF9UT09MQ0hBSU5fMk5EX0FSQ0gKKyAgICBmaQorICAgIEFORFJPSURfQlVJTERfUEFUSFM9JEFORFJPSURfQlVJTERfUEFUSFM6JEFORFJPSURfREVWX1NDUklQVFM6CisgICAgZXhwb3J0IEFORFJPSURfQlVJTERfUEFUSFMKIAogICAgICMgSWYgcHJlYnVpbHRzL2FuZHJvaWQtZW11bGF0b3IvPHN5c3RlbT4vIGV4aXN0cywgcHJlcGVuZCBpdCB0byBvdXIgUEFUSAogICAgICMgdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgJ2VtdWxhdG9yJyBiaW5hcmllcyBhcmUgdXNlZC4KQEAgLTI1OCwxMyArMjY1LDExIEBACiAgICAgZXhwb3J0IFBBVEg9JEFORFJPSURfQlVJTERfUEFUSFMkUEFUSAogICAgIGV4cG9ydCBQWVRIT05QQVRIPSRUL2RldmVsb3BtZW50L3B5dGhvbi1wYWNrYWdlczokUFlUSE9OUEFUSAogCi0gICAgdW5zZXQgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTgotICAgIHVuc2V0IEFORFJPSURfUFJFX0JVSUxEX1BBVEhTCi0gICAgaWYgWyAtbiAiJEpBVkFfSE9NRSIgXTsgdGhlbgotICAgICAgICBleHBvcnQgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTj0kSkFWQV9IT01FL2JpbgotICAgICAgICBleHBvcnQgQU5EUk9JRF9QUkVfQlVJTERfUEFUSFM9JEFORFJPSURfSkFWQV9UT09MQ0hBSU46Ci0gICAgICAgIGV4cG9ydCBQQVRIPSRBTkRST0lEX1BSRV9CVUlMRF9QQVRIUyRQQVRICi0gICAgZmkKKyAgICBleHBvcnQgQU5EUk9JRF9KQVZBX0hPTUU9JChnZXRfYWJzX2J1aWxkX3ZhciBBTkRST0lEX0pBVkFfSE9NRSkKKyAgICBleHBvcnQgSkFWQV9IT01FPSRBTkRST0lEX0pBVkFfSE9NRQorICAgIGV4cG9ydCBBTkRST0lEX0pBVkFfVE9PTENIQUlOPSQoZ2V0X2Fic19idWlsZF92YXIgQU5EUk9JRF9KQVZBX1RPT0xDSEFJTikKKyAgICBleHBvcnQgQU5EUk9JRF9QUkVfQlVJTERfUEFUSFM9JEFORFJPSURfSkFWQV9UT09MQ0hBSU46CisgICAgZXhwb3J0IFBBVEg9JEFORFJPSURfUFJFX0JVSUxEX1BBVEhTJFBBVEgKIAogICAgIHVuc2V0IEFORFJPSURfUFJPRFVDVF9PVVQKICAgICBleHBvcnQgQU5EUk9JRF9QUk9EVUNUX09VVD0kKGdldF9hYnNfYnVpbGRfdmFyIFBST0RVQ1RfT1VUKQpAQCAtMjk3LDcgKzMwMiw2IEBACiBmdW5jdGlvbiBzZXRfc3R1ZmZfZm9yX2Vudmlyb25tZW50KCkKIHsKICAgICBzZXR0aXRsZQotICAgIHNldF9qYXZhX2hvbWUKICAgICBzZXRwYXRocwogICAgIHNldF9zZXF1ZW5jZV9udW1iZXIKIApAQCAtMzE0LDcgKzMxOCwxMiBAQAogCiBmdW5jdGlvbiBzZXR0aXRsZSgpCiB7Ci0gICAgaWYgWyAiJFNUQVlfT0ZGX01ZX0xBV04iID0gIiIgXTsgdGhlbgorICAgICMgVGhpcyB1c2VkIHRvIGJlIG9wdC1vdXQgd2l0aCBTVEFZX09GRl9NWV9MQVdOLCBidXQgdGhpcyBicmVha3MgZm9sa3MKKyAgICAjIGFjdHVhbGx5IHVzaW5nIFBST01QVF9DT01NQU5EIChodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tLzM4NDAyMjU2KSwKKyAgICAjIGFuZCB0aGUgYXR0ZW1wdCB0byBzZXQgdGhlIHRpdGxlIGRvZXNuJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSBkZWZhdWx0CisgICAgIyB3aW5kb3cgbWFuYWdlciBpbiBkZWJpYW4gcmlnaHQgbm93LCBzbyBzd2l0Y2ggaXQgdG8gb3B0LWluIGZvciBhbnlvbmUKKyAgICAjIHdobyBhY3R1YWxseSB3YW50cyB0aGlzLgorICAgIGlmIFsgIiRBTkRST0lEX0JVSUxEX1NFVF9XSU5ET1dfVElUTEUiID0gInRydWUiIF07IHRoZW4KICAgICAgICAgbG9jYWwgYXJjaD0kKGdldHRhcmdldGFyY2gpCiAgICAgICAgIGxvY2FsIHByb2R1Y3Q9JFRBUkdFVF9QUk9EVUNUCiAgICAgICAgIGxvY2FsIHZhcmlhbnQ9JFRBUkdFVF9CVUlMRF9WQVJJQU5UCkBAIC02NTEsMTAgKzY2MCwxNiBAQAogIyBSdW4gdGFwYXMgd2l0aCBvbmUgb3IgbW9yZSBhcHAgbmFtZXMgKGZyb20gTE9DQUxfUEFDS0FHRV9OQU1FKQogZnVuY3Rpb24gdGFwYXMoKQogewotICAgIGxvY2FsIGFyY2g9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKGFybXx4ODZ8bWlwc3xhcm12NXxhcm02NHx4ODZfNjR8bWlwczY0KSQnIHwgeGFyZ3MpIgorICAgIGxvY2FsIHNob3dIZWxwPSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXihoZWxwKSQnIHwgeGFyZ3MpIgorICAgIGxvY2FsIGFyY2g9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKGFybXx4ODZ8bWlwc3xhcm02NHx4ODZfNjR8bWlwczY0KSQnIHwgeGFyZ3MpIgogICAgIGxvY2FsIHZhcmlhbnQ9IiQoZWNobyAkKiB8IHhhcmdzIC1uIDEgZWNobyB8IFxncmVwIC1FICdeKHVzZXJ8dXNlcmRlYnVnfGVuZykkJyB8IHhhcmdzKSIKICAgICBsb2NhbCBkZW5zaXR5PSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAnXihsZHBpfG1kcGl8dHZkcGl8aGRwaXx4aGRwaXx4eGhkcGl8eHh4aGRwaXxhbGxkcGkpJCcgfCB4YXJncykiCi0gICAgbG9jYWwgYXBwcz0iJChlY2hvICQqIHwgeGFyZ3MgLW4gMSBlY2hvIHwgXGdyZXAgLUUgLXYgJ14odXNlcnx1c2VyZGVidWd8ZW5nfGFybXx4ODZ8bWlwc3xhcm12NXxhcm02NHx4ODZfNjR8bWlwczY0fGxkcGl8bWRwaXx0dmRwaXxoZHBpfHhoZHBpfHh4aGRwaXx4eHhoZHBpfGFsbGRwaSkkJyB8IHhhcmdzKSIKKyAgICBsb2NhbCBhcHBzPSIkKGVjaG8gJCogfCB4YXJncyAtbiAxIGVjaG8gfCBcZ3JlcCAtRSAtdiAnXih1c2VyfHVzZXJkZWJ1Z3xlbmd8YXJtfHg4NnxtaXBzfGFybTY0fHg4Nl82NHxtaXBzNjR8bGRwaXxtZHBpfHR2ZHBpfGhkcGl8eGhkcGl8eHhoZHBpfHh4eGhkcGl8YWxsZHBpKSQnIHwgeGFyZ3MpIgorCisgICAgaWYgWyAiJHNob3dIZWxwIiAhPSAiIiBdOyB0aGVuCisgICAgICAkKGdldHRvcCkvYnVpbGQvbWFrZS90YXBhc0hlbHAuc2gKKyAgICAgIHJldHVybgorICAgIGZpCiAKICAgICBpZiBbICQoZWNobyAkYXJjaCB8IHdjIC13KSAtZ3QgMSBdOyB0aGVuCiAgICAgICAgIGVjaG8gInRhcGFzOiBFcnJvcjogTXVsdGlwbGUgYnVpbGQgYXJjaHMgc3VwcGxpZWQ6ICRhcmNoIgpAQCAtNjczLDcgKzY4OCw2IEBACiAgICAgY2FzZSAkYXJjaCBpbgogICAgICAgeDg2KSAgICBwcm9kdWN0PWFvc3BfeDg2OzsKICAgICAgIG1pcHMpICAgcHJvZHVjdD1hb3NwX21pcHM7OwotICAgICAgYXJtdjUpICBwcm9kdWN0PWdlbmVyaWNfYXJtdjU7OwogICAgICAgYXJtNjQpICBwcm9kdWN0PWFvc3BfYXJtNjQ7OwogICAgICAgeDg2XzY0KSBwcm9kdWN0PWFvc3BfeDg2XzY0OzsKICAgICAgIG1pcHM2NCkgIHByb2R1Y3Q9YW9zcF9taXBzNjQ7OwpAQCAtNzAyLDcgKzcxNiw3IEBACiAKIGZ1bmN0aW9uIGdldHRvcAogewotICAgIGxvY2FsIFRPUEZJTEU9YnVpbGQvY29yZS9lbnZzZXR1cC5taworICAgIGxvY2FsIFRPUEZJTEU9YnVpbGQvbWFrZS9jb3JlL2VudnNldHVwLm1rCiAgICAgaWYgWyAtbiAiJFRPUCIgLWEgLWYgIiRUT1AvJFRPUEZJTEUiIF0gOyB0aGVuCiAgICAgICAgICMgVGhlIGZvbGxvd2luZyBjaXJjdW1sb2N1dGlvbiBlbnN1cmVzIHdlIHJlbW92ZSBzeW1saW5rcyBmcm9tIFRPUC4KICAgICAgICAgKGNkICRUT1A7IFBXRD0gL2Jpbi9wd2QpCkBAIC03MjcsMzMgKzc0MSwxMSBAQAogICAgIGZpCiB9CiAKLSMgUmV0dXJuIGRyaXZlciBmb3IgIm1ha2UiLCBpZiBhbnkgKGVnLiBzdGF0aWMgYW5hbHl6ZXIpCi1mdW5jdGlvbiBnZXRkcml2ZXIoKQotewotICAgIGxvY2FsIFQ9IiQxIgotICAgIHRlc3QgIiRXSVRIX1NUQVRJQ19BTkFMWVpFUiIgPSAiMCIgJiYgdW5zZXQgV0lUSF9TVEFUSUNfQU5BTFlaRVIKLSAgICBpZiBbIC1uICIkV0lUSF9TVEFUSUNfQU5BTFlaRVIiIF07IHRoZW4KLSAgICAgICAgIyBVc2Ugc2Nhbi1idWlsZCB0byBjb2xsZWN0IGFsbCBzdGF0aWMgYW5hbHl6ZXIgcmVwb3J0cyBpbnRvIGRpcmVjdG9yeQotICAgICAgICAjIC90bXAvc2Nhbi1idWlsZC15eXl5LW1tLWRkLWhobW1zcy0qCi0gICAgICAgICMgVGhlIGNsYW5nIGNvbXBpbGVyIHBhc3NlZCBieSAtLXVzZS1hbmFseXplciBoZXJlIGlzIG5vdCBpbXBvcnRhbnQuCi0gICAgICAgICMgYnVpbGQvY29yZS9iaW5hcnkubWsgd2lsbCBzZXQgQ0xBTkdfQ1hYIGFuZCBDTEFORyBiZWZvcmUgY2FsbGluZwotICAgICAgICAjIGMrKy1hbmFseXplciBhbmQgY2NjLWFuYWx5emVyLgotICAgICAgICBsb2NhbCBDTEFOR19WRVJTSU9OPSQoZ2V0X2J1aWxkX3ZhciBMTFZNX1BSRUJVSUxUU19WRVJTSU9OKQotICAgICAgICBsb2NhbCBCVUlMRF9PUz0kKGdldF9idWlsZF92YXIgQlVJTERfT1MpCi0gICAgICAgIGxvY2FsIENMQU5HX0RJUj0iJFQvcHJlYnVpbHRzL2NsYW5nL2hvc3QvJHtCVUlMRF9PU30teDg2LyR7Q0xBTkdfVkVSU0lPTn0iCi0gICAgICAgIGVjaG8gIlwKLSR7Q0xBTkdfRElSfS90b29scy9zY2FuLWJ1aWxkL2Jpbi9zY2FuLWJ1aWxkIFwKLS0tdXNlLWFuYWx5emVyICR7Q0xBTkdfRElSfS9iaW4vY2xhbmcgXAotLS1zdGF0dXMtYnVncyIKLSAgICBmaQotfQotCiBmdW5jdGlvbiBtKCkKIHsKICAgICBsb2NhbCBUPSQoZ2V0dG9wKQotICAgIGxvY2FsIERSVj0kKGdldGRyaXZlciAkVCkKICAgICBpZiBbICIkVCIgXTsgdGhlbgotICAgICAgICBfd3JhcF9idWlsZCAkRFJWICRUL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgJEAKKyAgICAgICAgX3dyYXBfYnVpbGQgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkQAogICAgIGVsc2UKICAgICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIgogICAgICAgICByZXR1cm4gMQpAQCAtNzYyLDcgKzc1NCw3IEBACiAKIGZ1bmN0aW9uIGZpbmRtYWtlZmlsZSgpCiB7Ci0gICAgbG9jYWwgVE9QRklMRT1idWlsZC9jb3JlL2VudnNldHVwLm1rCisgICAgbG9jYWwgVE9QRklMRT1idWlsZC9tYWtlL2NvcmUvZW52c2V0dXAubWsKICAgICBsb2NhbCBIRVJFPSRQV0QKICAgICBsb2NhbCBUPQogICAgIHdoaWxlIFsgXCggISBcKCAtZiAkVE9QRklMRSBcKSBcKSAtYSBcKCAkUFdEICE9ICIvIiBcKSBdOyBkbwpAQCAtNzgwLDExICs3NzIsMTAgQEAKIGZ1bmN0aW9uIG1tKCkKIHsKICAgICBsb2NhbCBUPSQoZ2V0dG9wKQotICAgIGxvY2FsIERSVj0kKGdldGRyaXZlciAkVCkKICAgICAjIElmIHdlJ3JlIHNpdHRpbmcgaW4gdGhlIHJvb3Qgb2YgdGhlIGJ1aWxkIHRyZWUsIGp1c3QgZG8gYQogICAgICMgbm9ybWFsIGJ1aWxkLgogICAgIGlmIFsgLWYgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCBdOyB0aGVuCi0gICAgICAgIF93cmFwX2J1aWxkICREUlYgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkQAorICAgICAgICBfd3JhcF9idWlsZCAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRACiAgICAgZWxzZQogICAgICAgICAjIEZpbmQgdGhlIGNsb3Nlc3QgQW5kcm9pZC5tayBmaWxlLgogICAgICAgICBsb2NhbCBNPSQoZmluZG1ha2VmaWxlKQpAQCAtODE5LDcgKzgxMCw3IEBACiAgICAgICAgICAgICBpZiBbICIxIiA9ICIke1dJVEhfVElEWV9PTkxZfSIgLW8gInRydWUiID0gIiR7V0lUSF9USURZX09OTFl9IiBdOyB0aGVuCiAgICAgICAgICAgICAgIE1PRFVMRVM9dGlkeV9vbmx5CiAgICAgICAgICAgICBmaQotICAgICAgICAgICAgT05FX1NIT1RfTUFLRUZJTEU9JE0gX3dyYXBfYnVpbGQgJERSViAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRNT0RVTEVTICRBUkdTCisgICAgICAgICAgICBPTkVfU0hPVF9NQUtFRklMRT0kTSBfd3JhcF9idWlsZCAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRNT0RVTEVTICRBUkdTCiAgICAgICAgIGZpCiAgICAgZmkKIH0KQEAgLTgyNyw3ICs4MTgsNiBAQAogZnVuY3Rpb24gbW1tKCkKIHsKICAgICBsb2NhbCBUPSQoZ2V0dG9wKQotICAgIGxvY2FsIERSVj0kKGdldGRyaXZlciAkVCkKICAgICBpZiBbICIkVCIgXTsgdGhlbgogICAgICAgICBsb2NhbCBNQUtFRklMRT0KICAgICAgICAgbG9jYWwgTU9EVUxFUz0KQEAgLTg4Nyw3ICs4NzcsNyBAQAogICAgICAgICBmaQogICAgICAgICAjIENvbnZlcnQgIi8iIHRvICItIi4KICAgICAgICAgTU9EVUxFU19JTl9QQVRIUz0ke01PRFVMRVNfSU5fUEFUSFMvL1wvLy19Ci0gICAgICAgIE9ORV9TSE9UX01BS0VGSUxFPSIkTUFLRUZJTEUiIF93cmFwX2J1aWxkICREUlYgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkREFTSF9BUkdTICRNT0RVTEVTICRNT0RVTEVTX0lOX1BBVEhTICRBUkdTCisgICAgICAgIE9ORV9TSE9UX01BS0VGSUxFPSIkTUFLRUZJTEUiIF93cmFwX2J1aWxkICRUL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgJERBU0hfQVJHUyAkTU9EVUxFUyAkTU9EVUxFU19JTl9QQVRIUyAkQVJHUwogICAgIGVsc2UKICAgICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIgogICAgICAgICByZXR1cm4gMQpAQCAtODk3LDkgKzg4Nyw4IEBACiBmdW5jdGlvbiBtbWEoKQogewogICBsb2NhbCBUPSQoZ2V0dG9wKQotICBsb2NhbCBEUlY9JChnZXRkcml2ZXIgJFQpCiAgIGlmIFsgLWYgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCBdOyB0aGVuCi0gICAgX3dyYXBfYnVpbGQgJERSViAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRACisgICAgX3dyYXBfYnVpbGQgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkQAogICBlbHNlCiAgICAgaWYgWyAhICIkVCIgXTsgdGhlbgogICAgICAgZWNobyAiQ291bGRuJ3QgbG9jYXRlIHRoZSB0b3Agb2YgdGhlIHRyZWUuICBUcnkgc2V0dGluZyBUT1AuIgpAQCAtOTExLDE0ICs5MDAsMTMgQEAKICAgICBsb2NhbCBNT0RVTEVTX0lOX1BBVEhTPU1PRFVMRVMtSU4tJChkaXJuYW1lICR7TX0pCiAgICAgIyBDb252ZXJ0ICIvIiB0byAiLSIuCiAgICAgTU9EVUxFU19JTl9QQVRIUz0ke01PRFVMRVNfSU5fUEFUSFMvL1wvLy19Ci0gICAgX3dyYXBfYnVpbGQgJERSViAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICRAICRNT0RVTEVTX0lOX1BBVEhTCisgICAgX3dyYXBfYnVpbGQgJFQvYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZSAkQCAkTU9EVUxFU19JTl9QQVRIUwogICBmaQogfQogCiBmdW5jdGlvbiBtbW1hKCkKIHsKICAgbG9jYWwgVD0kKGdldHRvcCkKLSAgbG9jYWwgRFJWPSQoZ2V0ZHJpdmVyICRUKQogICBpZiBbICIkVCIgXTsgdGhlbgogICAgIGxvY2FsIERBU0hfQVJHUz0kKGVjaG8gIiRAIiB8IGF3ayAtdiBSUz0iICIgLXYgT1JTPSIgIiAnL14tLiokLycpCiAgICAgbG9jYWwgRElSUz0kKGVjaG8gIiRAIiB8IGF3ayAtdiBSUz0iICIgLXYgT1JTPSIgIiAnL15bXi1dLiokLycpCkBAIC05NDksNyArOTM3LDcgQEAKICAgICBkb25lCiAgICAgIyBDb252ZXJ0ICIvIiB0byAiLSIuCiAgICAgTU9EVUxFU19JTl9QQVRIUz0ke01PRFVMRVNfSU5fUEFUSFMvL1wvLy19Ci0gICAgX3dyYXBfYnVpbGQgJERSViAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICREQVNIX0FSR1MgJEFSR1MgJE1PRFVMRVNfSU5fUEFUSFMKKyAgICBfd3JhcF9idWlsZCAkVC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlICREQVNIX0FSR1MgJEFSR1MgJE1PRFVMRVNfSU5fUEFUSFMKICAgZWxzZQogICAgIGVjaG8gIkNvdWxkbid0IGxvY2F0ZSB0aGUgdG9wIG9mIHRoZSB0cmVlLiAgVHJ5IHNldHRpbmcgVE9QLiIKICAgICByZXR1cm4gMQpAQCAtOTcyLDcgKzk2MCw3IEBACiAKIGZ1bmN0aW9uIGNwcm9qKCkKIHsKLSAgICBsb2NhbCBUT1BGSUxFPWJ1aWxkL2NvcmUvZW52c2V0dXAubWsKKyAgICBsb2NhbCBUT1BGSUxFPWJ1aWxkL21ha2UvY29yZS9lbnZzZXR1cC5tawogICAgIGxvY2FsIEhFUkU9JFBXRAogICAgIGxvY2FsIFQ9CiAgICAgd2hpbGUgWyBcKCAhIFwoIC1mICRUT1BGSUxFIFwpIFwpIC1hIFwoICRQV0QgIT0gIi8iIFwpIF07IGRvCkBAIC0xNTQwLDQ2ICsxNTI4LDYgQEAKICAgICBcY2QgJFQvJHBhdGhuYW1lCiB9CiAKLSMgRm9yY2UgSkFWQV9IT01FIHRvIHBvaW50IHRvIGphdmEgMS43LzEuOCBpZiBpdCBpc24ndCBhbHJlYWR5IHNldC4KLWZ1bmN0aW9uIHNldF9qYXZhX2hvbWUoKSB7Ci0gICAgIyBDbGVhciB0aGUgZXhpc3RpbmcgSkFWQV9IT01FIHZhbHVlIGlmIHdlIHNldCBpdCBvdXJzZWx2ZXMsIHNvIHRoYXQKLSAgICAjIHdlIGNhbiByZXNldCBpdCBsYXRlciwgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIGphdmEgdGhlIGJ1aWxkCi0gICAgIyBzeXN0ZW0gbmVlZHMuCi0gICAgIwotICAgICMgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlIEpBVkFfSE9NRSB2YWx1ZSBzZXQgYnkgdGhlIGZpcnN0IGNhbGwgdG8KLSAgICAjIGJ1aWxkL2VudnNldHVwLnNoIHdpbGwgcGVyc2lzdCBmb3JldmVyLgotICAgIGlmIFsgLW4gIiRBTkRST0lEX1NFVF9KQVZBX0hPTUUiIF07IHRoZW4KLSAgICAgIGV4cG9ydCBKQVZBX0hPTUU9IiIKLSAgICBmaQotCi0gICAgaWYgWyAhICIkSkFWQV9IT01FIiBdOyB0aGVuCi0gICAgICBpZiBbIC1uICIkTEVHQUNZX1VTRV9KQVZBNyIgXTsgdGhlbgotICAgICAgICBlY2hvIFdhcm5pbmc6IFN1cHBvcnQgZm9yIEpESyA3IHdpbGwgYmUgZHJvcHBlZC4gU3dpdGNoIHRvIEpESyA4LgotICAgICAgICBjYXNlIGB1bmFtZSAtc2AgaW4KLSAgICAgICAgICAgIERhcndpbikKLSAgICAgICAgICAgICAgICBleHBvcnQgSkFWQV9IT01FPSQoL3Vzci9saWJleGVjL2phdmFfaG9tZSAtdiAxLjcpCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgZXhwb3J0IEpBVkFfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS03LW9wZW5qZGstYW1kNjQKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgICBlbHNlCi0gICAgICAgIGNhc2UgYHVuYW1lIC1zYCBpbgotICAgICAgICAgICAgRGFyd2luKQotICAgICAgICAgICAgICAgIGV4cG9ydCBKQVZBX0hPTUU9JCgvdXNyL2xpYmV4ZWMvamF2YV9ob21lIC12IDEuOCkKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICBleHBvcnQgSkFWQV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAotICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgIGZpCi0KLSAgICAgICMgS2VlcCB0cmFjayBvZiB0aGUgZmFjdCB0aGF0IHdlIHNldCBKQVZBX0hPTUUgb3Vyc2VsdmVzLCBzbyB0aGF0Ci0gICAgICAjIHdlIGNhbiBjaGFuZ2UgaXQgb24gdGhlIG5leHQgZW52c2V0dXAuc2gsIGlmIHJlcXVpcmVkLgotICAgICAgZXhwb3J0IEFORFJPSURfU0VUX0pBVkFfSE9NRT10cnVlCi0gICAgZmkKLX0KLQogIyBQcmludCBjb2xvcmVkIGV4aXQgY29uZGl0aW9uCiBmdW5jdGlvbiBwZXogewogICAgICIkQCIKQEAgLTE1OTcsNiArMTU0NSwxMyBAQAogewogICAgICMgSWYgd2UncmUgaW4gdGhlIHRvcCBvZiBhbiBBbmRyb2lkIHRyZWUsIHVzZSBzb29uZ191aS5iYXNoIGluc3RlYWQgb2YgbWFrZQogICAgIGlmIFsgLWYgYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCBdOyB0aGVuCisgICAgICAgICMgQWx3YXlzIHVzZSB0aGUgcmVhbCBtYWtlIGlmIC1DIGlzIHBhc3NlZCBpbgorICAgICAgICBmb3IgYXJnIGluICIkQCI7IGRvCisgICAgICAgICAgICBpZiBbWyAkYXJnID09IC1DKiBdXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gY29tbWFuZCBtYWtlCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCiAgICAgICAgIGVjaG8gYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLW1ha2UtbW9kZQogICAgIGVsc2UKICAgICAgICAgZWNobyBjb21tYW5kIG1ha2UKQEAgLTE2NDMsNyArMTU5OCw3IEBACiAKIGZ1bmN0aW9uIG1ha2UoKQogewotICAgIF93cmFwX2J1aWxkICQoZ2V0X21ha2VfY29tbWFuZCkgIiRAIgorICAgIF93cmFwX2J1aWxkICQoZ2V0X21ha2VfY29tbWFuZCAiJEAiKSAiJEAiCiB9CiAKIGZ1bmN0aW9uIHByb3Zpc2lvbigpCkBAIC0xNjc1LDYgKzE2MzAsMTQgQEAKICAgICAiJEFORFJPSURfUFJPRFVDVF9PVVQvcHJvdmlzaW9uLWRldmljZSIgIiRAIgogfQogCitmdW5jdGlvbiBhdGVzdCgpCit7CisgICAgIyBUT0RPIChzYmFzaSk6IFJlcGxhY2UgdGhpcyB0byBiZSBhIGRlc3RpbmF0aW9uIGluIHRoZSBidWlsZCBvdXQgd2hlbiAmIGlmCisgICAgIyBhdGVzdCBpcyBidWlsdCBieSB0aGUgYnVpbGQgc3lzdGVtLiAoVGhpcyB3aWxsIGJlIG5lY2Vzc2FyeSBpZiBpdCBldmVyCisgICAgIyBkZXBlbmRzIG9uIGV4dGVybmFsIHBpcCBwcm9qZWN0cykuCisgICAgIiQoZ2V0dG9wKSIvdG9vbHMvdHJhZGVmZWRlcmF0aW9uL2NvcmUvYXRlc3QvYXRlc3QucHkgIiRAIgorfQorCiBpZiBbICJ4JFNIRUxMIiAhPSAieC9iaW4vYmFzaCIgXTsgdGhlbgogICAgIGNhc2UgYHBzIC1vIGNvbW1hbmQgLXAgJCRgIGluCiAgICAgICAgICpiYXNoKikKZGlmZiAtLWdpdCBhL2hlbHAuc2ggYi9oZWxwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxNDM1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9oZWxwLnNoCkBAIC0wLDAgKzEsNTUgQEAKKyMhL2Jpbi9iYXNoCisKKyMgbG9jYXRlIHNvbWUgZGlyZWN0b3JpZXMKK2NkICIkKGRpcm5hbWUgJDApIgorU0NSSVBUX0RJUj0iJHtQV0R9IgorY2QgLi4vLi4KK1RPUD0iJHtQV0R9IgorCittZXNzYWdlPSdUaGUgYmFzaWMgQW5kcm9pZCBidWlsZCBwcm9jZXNzIGlzOgorCitjZCAnIiR7VE9QfSInCitzb3VyY2UgYnVpbGQvZW52c2V0dXAuc2ggICAgIyBBZGQgImx1bmNoIiAoYW5kIG90aGVyIHV0aWxpdGllcyBhbmQgdmFyaWFibGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdG8gdGhlIHNoZWxsIGVudmlyb25tZW50LgorbHVuY2ggWzxwcm9kdWN0Pi08dmFyaWFudD5dICMgQ2hvb3NlIHRoZSBkZXZpY2UgdG8gdGFyZ2V0LgorbSAtaiBbPGdvYWxzPl0gICAgICAgICAgICAgICMgRXhlY3V0ZSB0aGUgY29uZmlndXJlZCBidWlsZC4KKworVXNhZ2Ugb2YgIm0iIGltaXRhdGVzIHVzYWdlIG9mIHRoZSBwcm9ncmFtICJtYWtlIi4KK1NlZSAnIiR7U0NSSVBUX0RJUn0iJy9Vc2FnZS50eHQgZm9yIG1vcmUgaW5mbyBhYm91dCBidWlsZCB1c2FnZSBhbmQgY29uY2VwdHMuCisKK0NvbW1vbiBnb2FscyBhcmU6CisKKyAgICBjbGVhbiAgICAgICAgICAgICAgICAgICAoYWthIGNsb2JiZXIpIGVxdWl2YWxlbnQgdG8gcm0gLXJmIG91dC8KKyAgICBjaGVja2J1aWxkICAgICAgICAgICAgICBCdWlsZCBldmVyeSBtb2R1bGUgZGVmaW5lZCBpbiB0aGUgc291cmNlIHRyZWUKKyAgICBkcm9pZCAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRhcmdldAorICAgIG5vdGhpbmcgICAgICAgICAgICAgICAgIERvIG5vdCBidWlsZCBhbnl0aGluZywganVzdCBwYXJzZSBhbmQgdmFsaWRhdGUgdGhlIGJ1aWxkIHN0cnVjdHVyZQorCisgICAgamF2YSAgICAgICAgICAgICAgICAgICAgQnVpbGQgYWxsIHRoZSBqYXZhIGNvZGUgaW4gdGhlIHNvdXJjZSB0cmVlCisgICAgbmF0aXZlICAgICAgICAgICAgICAgICAgQnVpbGQgYWxsIHRoZSBuYXRpdmUgY29kZSBpbiB0aGUgc291cmNlIHRyZWUKKworICAgIGhvc3QgICAgICAgICAgICAgICAgICAgIEJ1aWxkIGFsbCB0aGUgaG9zdCBjb2RlIChub3QgdG8gYmUgcnVuIG9uIGEgZGV2aWNlKSBpbiB0aGUgc291cmNlIHRyZWUKKyAgICB0YXJnZXQgICAgICAgICAgICAgICAgICBCdWlsZCBhbGwgdGhlIHRhcmdldCBjb2RlICh0byBiZSBydW4gb24gdGhlIGRldmljZSkgaW4gdGhlIHNvdXJjZSB0cmVlCisKKyAgICAoamF2YXxuYXRpdmUpLShob3N0fHRhcmdldCkKKyAgICAoaG9zdHx0YXJnZXQpLShqYXZhfG5hdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gZ2l2ZW4gYXJndW1lbnRzCisKKyAgICBzbm9kICAgICAgICAgICAgICAgICAgICBRdWlja2x5IHJlYnVpbGQgdGhlIHN5c3RlbSBpbWFnZSBmcm9tIGJ1aWx0IHBhY2thZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRzIGZvciAiU3lzdGVtLCBOTyBEZXBlbmRlbmNpZXMiCisgICAgdm5vZCAgICAgICAgICAgICAgICAgICAgUXVpY2tseSByZWJ1aWxkIHRoZSB2ZW5kb3IgaW1hZ2UgZnJvbSBidWlsdCBwYWNrYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kcyBmb3IgIlZlbmRvciwgTk8gRGVwZW5kZW5jaWVzIgorICAgIHBub2QgICAgICAgICAgICAgICAgICAgIFF1aWNrbHkgcmVidWlsZCB0aGUgcHJvZHVjdCBpbWFnZSBmcm9tIGJ1aWx0IHBhY2thZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRzIGZvciAiUHJvZHVjdCwgTk8gRGVwZW5kZW5jaWVzIgorCisKK1NvLCBmb3IgZXhhbXBsZSwgeW91IGNvdWxkIHJ1bjoKKworY2QgJyIke1RPUH0iJworc291cmNlIGJ1aWxkL2VudnNldHVwLnNoCitsdW5jaCBhb3NwX2FybS11c2VyZGVidWcKK20gLWogamF2YQorCit0byBidWlsZCBhbGwgb2YgdGhlIGphdmEgY29kZSBmb3IgdGhlIHVzZXJkZWJ1ZyB2YXJpYW50IG9mIHRoZSBhb3NwX2FybSBkZXZpY2UuCisnCisKK2VjaG8gIiRtZXNzYWdlIgpkaWZmIC0tZ2l0IGEvbmF2YmFyLm1kIGIvbmF2YmFyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMThhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9uYXZiYXIubWQKQEAgLTAsMCArMSw0IEBACisqIFtIb21lXSgvUkVBRE1FLm1kKQorKiBbVXNhZ2VdKC9Vc2FnZS50eHQpCisqIFtDaGFuZ2VzXSgvQ2hhbmdlcy5tZCkKKyogW091dGRhdGVkIFJlZmVyZW5jZV0oL2NvcmUvYnVpbGQtc3lzdGVtLmh0bWwpCmRpZmYgLS1naXQgYS90YXBhc0hlbHAuc2ggYi90YXBhc0hlbHAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhiM2UzNAotLS0gL2Rldi9udWxsCisrKyBiL3RhcGFzSGVscC5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vYmFzaAorCisjIGxvY2F0ZSBzb21lIGRpcmVjdG9yaWVzCitjZCAiJChkaXJuYW1lICQwKSIKK1NDUklQVF9ESVI9IiR7UFdEfSIKK2NkIC4uLy4uCitUT1A9IiR7UFdEfSIKKworbWVzc2FnZT0ndXNhZ2U6IHRhcGFzIFs8QXBwMT4gPEFwcDI+IC4uLl0gW2FybXx4ODZ8bWlwc3xhcm02NHx4ODZfNjR8bWlwczY0XSBbZW5nfHVzZXJkZWJ1Z3x1c2VyXQorCit0YXBhcyBzZWxlY3RzIGluZGl2aWR1YWwgYXBwcyB0byBiZSBidWlsdCBieSB0aGUgQW5kcm9pZCBidWlsZCBzeXN0ZW0uIFVubGlrZQorImx1bmNoIiwgInRhcGFzIiBkb2VzIG5vdCByZXF1ZXN0IHRoZSBidWlsZGluZyBvZiBpbWFnZXMgZm9yIGEgZGV2aWNlLgorQWRkaXRpb25hbGx5LCBhbiBhcHAgYnVpbHQgd2l0aCAidGFwYXMiIHdpbGwgaGF2ZSBpdHMgZGV4IGZpbGUgaW5zaWRlIGl0cyBhcGssCit3aGljaCBzaG91bGQgY2F1c2UgaXQgdG8gYmUgc3VpdGFibGUgZm9yIGluc3RhbGxpbmcgb24gYW55IGFwaS1jb21wYXRpYmxlCitkZXZpY2UuIEluIG90aGVyIHdvcmRzLCAidGFwYXMiIGNvbmZpZ3VyZXMgdGhlIGJ1aWxkIG9mIHVuYnVuZGxlZCBhcHBzLgorCitUaGUgbmFtZXMgPEFwcDE+IDxBcHAyPiAuLi4gc2hvdWxkIG1hdGNoIExPQ0FMX1BBQ0tBR0VfTkFNRSBhcyBkZWZpbmVkIGluIGFuCitBbmRyb2lkLm1rCisKK1RoZSB1c2FnZSBvZiB0aGUgb3RoZXIgYXJndW1lbnRzIG1hdGNoZXMgdGhhdCBvZiB0aGUgcmVzdCBvZiB0aGUgcGxhdGZvcm0KK2J1aWxkIHN5c3RlbSBhbmQgY2FuIGJlIGZvdW5kIGJ5IHJ1bm5pbmcgYG0gaGVscGAnCisKK2VjaG8gIiRtZXNzYWdlIgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsgYi90YXJnZXQvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDYzJQpjb3B5IGZyb20gdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvQm9hcmRDb25maWcubWsKY29weSB0byB0YXJnZXQvQW5kcm9pZC5tawppbmRleCAwMTY5MzdhLi45OTI5YjAwIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvQW5kcm9pZC5tawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEwICsxNCwxMCBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW5jbHVkZSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5taworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogCi1UQVJHRVRfQVJDSF9WQVJJQU5UIDo9IGFybXY1dGUKLVRBUkdFVF9DUFVfQUJJIDo9IGFybWVhYmkKLVRBUkdFVF9DUFVfQUJJMiA6PQotCi1XSVRIX0RFWFBSRU9QVCA6PSBmYWxzZQorIyBPbmx5IGlmIHRoaXMgQW5kcm9pZC5tayB3YXMgaW5jbHVkZWQgbm90IGJ5IGEgc3ltbGluayBzaG91bGQgaXQgYmUgdXNlZC4KKyMgVGhpcyBmYWNpbGl0YXRlcyB0aGUgdHJhbnNpdGlvbiBhd2F5IGZyb20gc3ltbGlua3M6IGIvNjQzOTc5NjAKK2lmZXEgKCQoTE9DQUxfUEFUSCksYnVpbGQvbWFrZS90YXJnZXQpCitpbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2VuZGlmCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvQW5kcm9pZC5tayBiL3RhcmdldC9ib2FyZC9BbmRyb2lkLm1rCmluZGV4IDU1MDRjNTIuLjdmZTQ1ZWIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9BbmRyb2lkLm1rCisrKyBiL3RhcmdldC9ib2FyZC9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw3IEBACiBib2FyZF9pbmZvX3R4dCA6PSAkKHdpbGRjYXJkICQoVEFSR0VUX0RFVklDRV9ESVIpL2JvYXJkLWluZm8udHh0KQogZW5kaWYKICQoSU5TVEFMTEVEX0FORFJPSURfSU5GT19UWFRfVEFSR0VUKTogJChib2FyZF9pbmZvX3R4dCkKLQkkKGhpZGUpIGJ1aWxkL3Rvb2xzL2NoZWNrX3JhZGlvX3ZlcnNpb25zLnB5ICQ8ICQoQk9BUkRfSU5GT19DSEVDSykKKwkkKGhpZGUpIGJ1aWxkL21ha2UvdG9vbHMvY2hlY2tfcmFkaW9fdmVyc2lvbnMucHkgJDwgJChCT0FSRF9JTkZPX0NIRUNLKQogCSQoY2FsbCBwcmV0dHksIkdlbmVyYXRlZDogKCRAKSIpCiBpZmRlZiBib2FyZF9pbmZvX3R4dAogCSQoaGlkZSkgZ3JlcCAtdiAnIycgJDwgPiAkQApAQCAtMzQsMTQgKzM0LDE3IEBACiBpZmRlZiBERVZJQ0VfTUFOSUZFU1RfRklMRQogIyAkKERFVklDRV9NQU5JRkVTVF9GSUxFKSBjYW4gYmUgYSBsaXN0IG9mIGZpbGVzCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSAgICAgICAgOj0gbWFuaWZlc3QueG1sCitMT0NBTF9NT0RVTEUgICAgICAgIDo9IGRldmljZV9tYW5pZmVzdC54bWwKK0xPQ0FMX01PRFVMRV9TVEVNICAgOj0gbWFuaWZlc3QueG1sCiBMT0NBTF9NT0RVTEVfQ0xBU1MgIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggICA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKQorTE9DQUxfTU9EVUxFX1BBVEggICA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvdmludGYKIAogR0VOIDo9ICQobG9jYWwtZ2VuZXJhdGVkLXNvdXJjZXMtZGlyKS9tYW5pZmVzdC54bWwKICQoR0VOKTogUFJJVkFURV9ERVZJQ0VfTUFOSUZFU1RfRklMRSA6PSAkKERFVklDRV9NQU5JRkVTVF9GSUxFKQogJChHRU4pOiAkKERFVklDRV9NQU5JRkVTVF9GSUxFKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgogCUJPQVJEX1NFUE9MSUNZX1ZFUlM9JChCT0FSRF9TRVBPTElDWV9WRVJTKSBcCisJUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUPSQoUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUKSBcCisJUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUw9JChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCkgXAogCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmIC1vICRAIFwKIAkJLWkgJChjYWxsIG5vcm1hbGl6ZS1wYXRoLWxpc3QsJChQUklWQVRFX0RFVklDRV9NQU5JRkVTVF9GSUxFKSkKIApAQCAtNDksMTA2ICs1MiwzIEBACiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiBCVUlMVF9WRU5ET1JfTUFOSUZFU1QgOj0gJChMT0NBTF9CVUlMVF9NT0RVTEUpCiBlbmRpZgotCi0jIERldmljZSBDb21wYXRpYmlsaXR5IE1hdHJpeAotaWZkZWYgREVWSUNFX01BVFJJWF9GSUxFCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSAgICAgICAgOj0gY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCi1MT0NBTF9NT0RVTEVfQ0xBU1MgIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggICA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKQotCi1HRU4gOj0gJChsb2NhbC1nZW5lcmF0ZWQtc291cmNlcy1kaXIpL2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbAotJChHRU4pOiAkKERFVklDRV9NQVRSSVhfRklMRSkgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYKLQkjIFRPRE8oYi8zNzM0MjYyNyk6IHB1dCBCT0FSRF9WTkRLX1ZFUlNJT04gJiBCT0FSRF9WTkRLX0xJQlJBUklFUyBpbnRvIGRldmljZSBtYXRyaXguCi0JJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYgLWkgJDwgLW8gJEAKLQotTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUgOj0gJChHRU4pCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1CVUlMVF9WRU5ET1JfTUFUUklYIDo9ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQotZW5kaWYKLQotIyBGcmFtZXdvcmsgTWFuaWZlc3QKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFICAgICAgICA6PSBzeXN0ZW1fbWFuaWZlc3QueG1sCi1MT0NBTF9NT0RVTEVfU1RFTSAgIDo9IG1hbmlmZXN0LnhtbAotTE9DQUxfTU9EVUxFX0NMQVNTICA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIICAgOj0gJChUQVJHRVRfT1VUKQotCi1HRU4gOj0gJChsb2NhbC1nZW5lcmF0ZWQtc291cmNlcy1kaXIpL21hbmlmZXN0LnhtbAotCi0kKEdFTik6IFBSSVZBVEVfRkxBR1MgOj0KLQotIyBUT0RPKGIvMzc5NTQ0NTgpLCAoYi8zNzMyMTMwOSkgcmVtb3ZlIGNoZWNrIG9mIFBST0RVQ1RfRlVMTF9UUkVCTEUgYWZ0ZXIKLSMgcHV0dGluZyBkZXZpY2UgY29tcGF0aWJpbGl0eSBtYXRyaWNlcyBmb3Igbm9uLXRyZWJsZSBkZXZpY2VzLgotaWZlcSAoJChQUk9EVUNUX0ZVTExfVFJFQkxFKSx0cnVlKQotaWZkZWYgQlVJTFRfVkVORE9SX01BVFJJWAotJChHRU4pOiAkKEJVSUxUX1ZFTkRPUl9NQVRSSVgpCi0kKEdFTik6IFBSSVZBVEVfRkxBR1MgKz0gLWMgIiQoQlVJTFRfVkVORE9SX01BVFJJWCkiCi1lbmRpZgotZW5kaWYKLQotJChHRU4pOiAkKEZSQU1FV09SS19NQU5JRkVTVF9GSUxFKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgotCUJPQVJEX1NFUE9MSUNZX1ZFUlM9JChCT0FSRF9TRVBPTElDWV9WRVJTKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZiAtaSAkPCAtbyAkQCAkKFBSSVZBVEVfRkxBR1MpCi0KLUxPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQoR0VOKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotQlVJTFRfU1lTVEVNX01BTklGRVNUIDo9ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQotCi0jIEZyYW1ld29yayBDb21wYXRpYmlsaXR5IE1hdHJpeAotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgICAgICAgIDo9IHN5c3RlbV9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwKLUxPQ0FMX01PRFVMRV9TVEVNICAgOj0gY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCi1MT0NBTF9NT0RVTEVfQ0xBU1MgIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggICA6PSAkKFRBUkdFVF9PVVQpCi0KLUdFTiA6PSAkKGxvY2FsLWdlbmVyYXRlZC1zb3VyY2VzLWRpcikvY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCi0KLSQoR0VOKTogUFJJVkFURV9GTEFHUyA6PQotCi0jIFRPRE8oYi8zNzk1NDQ1OCksIChiLzM3MzIxMzA5KSByZW1vdmUgY2hlY2sgb2YgUFJPRFVDVF9GVUxMX1RSRUJMRSBhZnRlcgotIyBwdXR0aW5nIGNvbXBsZXRlIEhBTCBtYW5pZmVzdHMgb24gbm9uLXRyZWJsZSBkZXZpY2VzLgotaWZlcSAoJChQUk9EVUNUX0ZVTExfVFJFQkxFKSx0cnVlKQotaWZkZWYgQlVJTFRfVkVORE9SX01BTklGRVNUCi0kKEdFTik6ICQoQlVJTFRfVkVORE9SX01BTklGRVNUKQotJChHRU4pOiBQUklWQVRFX0ZMQUdTICs9IC1jICIkKEJVSUxUX1ZFTkRPUl9NQU5JRkVTVCkiCi1lbmRpZgotZW5kaWYKLQotaWZlcSAodHJ1ZSwkKEJPQVJEX0FWQl9FTkFCTEUpKQotJChHRU4pOiAkKEFWQlRPT0wpCi0jIElOVEVSTkFMX0FWQl9TWVNURU1fU0lHTklOR19BUkdTIGNvbnNpc3RzIG9mIEJPQVJEX0FWQl9TWVNURU1fS0VZX1BBVEggYW5kCi0jIEJPQVJEX0FWQl9TWVNURU1fQUxHT1JJVEhNLiBXZSBzaG91bGQgYWRkIHRoZSBkZXBlbmRlbmN5IG9mIGtleSBwYXRoLCB3aGljaAotIyBpcyBhIGZpbGUsIGhlcmUuCi0kKEdFTik6ICQoQk9BUkRfQVZCX1NZU1RFTV9LRVlfUEFUSCkKLSMgVXNlIGRlZmVycmVkIGFzc2lnbm1lbnQgKD0pIGluc3RlYWQgb2YgaW1tZWRpYXRlIGFzc2lnbm1lbnQgKDo9KS4KLSMgT3RoZXJ3aXNlLCBjYW5ub3QgZ2V0IElOVEVSTkFMX0FWQl9TWVNURU1fU0lHTklOR19BUkdTLgotRlJBTUVXT1JLX1ZCTUVUQV9WRVJTSU9OID0gJCQoIiQoQVZCVE9PTCkiIGFkZF9oYXNodHJlZV9mb290ZXIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1wcmludF9yZXF1aXJlZF9saWJhdmJfdmVyc2lvbiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOVEVSTkFMX0FWQl9TWVNURU1fU0lHTklOR19BUkdTKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPQVJEX0FWQl9TWVNURU1fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSkKLWVsc2UKLUZSQU1FV09SS19WQk1FVEFfVkVSU0lPTiA6PSAwLjAKLWVuZGlmCi0KLSMgQWxsIGtlcm5lbCB2ZXJzaW9ucyB0aGF0IHRoZSBzeXN0ZW0gaW1hZ2Ugd29ya3Mgd2l0aC4KLUtFUk5FTF9WRVJTSU9OUyA6PSAzLjE4IDQuNCA0LjkKLUtFUk5FTF9DT05GSUdfREFUQSA6PSB0ZXN0L3Z0cy10ZXN0Y2FzZS9rZXJuZWwvY29uZmlnL2RhdGEKLQotJChHRU4pOiAkKGZvcmVhY2ggdmVyc2lvbiwkKEtFUk5FTF9WRVJTSU9OUyksXAotCSQod2lsZGNhcmQgJChLRVJORUxfQ09ORklHX0RBVEEpL2FuZHJvaWQtJCh2ZXJzaW9uKS9hbmRyb2lkLWJhc2UqLmNmZykpCi0kKEdFTik6IFBSSVZBVEVfRkxBR1MgKz0gJChmb3JlYWNoIHZlcnNpb24sJChLRVJORUxfVkVSU0lPTlMpLFwKLQktLWtlcm5lbD0kKHZlcnNpb24pOiQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LFwKLQkJJCh3aWxkY2FyZCAkKEtFUk5FTF9DT05GSUdfREFUQSkvYW5kcm9pZC0kKHZlcnNpb24pL2FuZHJvaWQtYmFzZSouY2ZnKSkpCi0KLUtFUk5FTF9WRVJTSU9OUyA6PQotS0VSTkVMX0NPTkZJR19EQVRBIDo9Ci0KLSQoR0VOKTogJChGUkFNRVdPUktfQ09NUEFUSUJJTElUWV9NQVRSSVhfRklMRSkgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYKLQkjIFRPRE8oYi8zNzQwNTg2OSkgKGIvMzc3MTUzNzUpIGluamVjdCBhdmIgdmVyc2lvbnMgYXMgd2VsbCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgYXZiIGVuYWJsZWQuCi0JUE9MSUNZVkVSUz0kKFBPTElDWVZFUlMpIFwKLQkJQk9BUkRfU0VQT0xJQ1lfVkVSUz0kKEJPQVJEX1NFUE9MSUNZX1ZFUlMpIFwKLQkJRlJBTUVXT1JLX1ZCTUVUQV9WRVJTSU9OPSQoRlJBTUVXT1JLX1ZCTUVUQV9WRVJTSU9OKSBcCi0JCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2Fzc2VtYmxlX3ZpbnRmIC1pICQ8IC1vICRAICQoUFJJVkFURV9GTEFHUykKLUxPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQoR0VOKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotQlVJTFRfU1lTVEVNX0NPTVBBVElCSUxJVFlfTUFUUklYIDo9ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5tawppbmRleCAzMzFmMDgyLi42N2QwMTlmIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9Cb2FyZENvbmZpZy5tawpAQCAtMjUsNiArMjUsNyBAQAogVEFSR0VUX0NQVV9BQkkyIDo9IGFybWVhYmkKIEhBVkVfSFRDX0FVRElPX0RSSVZFUiA6PSB0cnVlCiBCT0FSRF9VU0VTX0dFTkVSSUNfQVVESU8gOj0gdHJ1ZQorVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSA6PSBnb2xkZmlzaF8kKFRBUkdFVF9BUkNIKQogCiAjIG5vIGhhcmR3YXJlIGNhbWVyYQogVVNFX0NBTUVSQV9TVFVCIDo9IHRydWUKQEAgLTU3LDExICs1OCwxMyBAQAogIyB3aGVuIGZpbmFsaXppbmcgdGhlbS4KIEJPQVJEX1ZFTkRPUklNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDEwMDAwMDAwMAogQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0Ci1CT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDY5MjA2MDE2Ci1CT0FSRF9DQUNIRUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAogQk9BUkRfRkxBU0hfQkxPQ0tfU0laRSA6PSA1MTIKIFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9FWFRfRElTQUJMRUQgOj0gdHJ1ZQogREVWSUNFX01BVFJJWF9GSUxFICAgOj0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCiAKIEJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gYnVpbGQvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kKIEJPQVJEX1BST1BFUlRZX09WRVJSSURFU19TUExJVF9FTkFCTEVEIDo9IHRydWUKKworIyBFbmFibGUgQS9CIHVwZGF0ZQorVEFSR0VUX05PX1JFQ09WRVJZIDo9IHRydWUKK0JPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L09XTkVSUyBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODI4OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvT1dORVJTCkBAIC0wLDAgKzEsNCBAQAoramVmZnZAZ29vZ2xlLmNvbQorZGNhc2htYW5AZ29vZ2xlLmNvbQoramJpcmVzQGdvb2dsZS5jb20KK3NzcGF0aWxAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvYm9vdGFuaW0udGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9ib290YW5pbS50ZQppbmRleCA0YmUxYzhhLi5lNGY3YzczIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9ib290YW5pbS50ZQorKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9ib290YW5pbS50ZQpAQCAtMiw0ICsyLDcgQEAKIGFsbG93IGJvb3RhbmltIGFzaG1lbV9kZXZpY2U6Y2hyX2ZpbGUgZXhlY3V0ZTsKICNUT0RPOiBUaGlzIGNhbiBzYWZlbHkgYmUgaWdub3JlZCB1bnRpbCBiLzYyOTU0ODc3IGlzIGZpeGVkCiBkb250YXVkaXQgYm9vdGFuaW0gc3lzdGVtX2RhdGFfZmlsZTpkaXIgcmVhZDsKKworYWxsb3cgYm9vdGFuaW0gZ3JhcGhpY3NfZGV2aWNlOmNocl9maWxlIHsgcmVhZCBpb2N0bCBvcGVuIH07CisKIHNldF9wcm9wKGJvb3RhbmltLCBxZW11X3Byb3ApCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9kb21haW4udGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9kb21haW4udGUKaW5kZXggNWQ1ZTRhYy4uMzcwNmRiYSAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvZG9tYWluLnRlCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2RvbWFpbi50ZQpAQCAtMSw2ICsxLDMgQEAKLSMgRm9yIC9zeXMvcWVtdV90cmFjZSBmaWxlcyBpbiB0aGUgZW11bGF0b3IuCi1hbGxvdyBkb21haW4gc3lzZnNfd3JpdGFibGU6ZGlyIHNlYXJjaDsKLWFsbG93IGRvbWFpbiBzeXNmc193cml0YWJsZTpmaWxlIHJ3X2ZpbGVfcGVybXM7CiBhbGxvdyBkb21haW4gcWVtdV9kZXZpY2U6Y2hyX2ZpbGUgcndfZmlsZV9wZXJtczsKIAogZ2V0X3Byb3AoZG9tYWluLCBxZW11X3Byb3ApCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9maWxlLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvZmlsZS50ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhZTllNC4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9maWxlLnRlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdHlwZSBzeXNmc193cml0YWJsZSwgZnNfdHlwZSwgc3lzZnNfdHlwZSwgbWxzdHJ1c3RlZG9iamVjdDsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2ZpbGVfY29udGV4dHMgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9maWxlX2NvbnRleHRzCmluZGV4IGY1NTBmNGQuLjUyMWM2NWUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2ZpbGVfY29udGV4dHMKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvZmlsZV9jb250ZXh0cwpAQCAtMTUsNyArMTUsNiBAQAogL2Rldi9xZW11Xy4qICAgICAgICAgICAgICAgICB1Om9iamVjdF9yOnFlbXVfZGV2aWNlOnMwCiAvZGV2L3R0eUdGWzAtOV0qICAgICAgICAgICAgIHU6b2JqZWN0X3I6c2VyaWFsX2RldmljZTpzMAogL2Rldi90dHlTMiAgICAgICAgICAgICAgICAgICB1Om9iamVjdF9yOmNvbnNvbGVfZGV2aWNlOnMwCi0vc3lzL3FlbXVfdHJhY2UoLy4qKT8gICAgICAgIHU6b2JqZWN0X3I6c3lzZnNfd3JpdGFibGU6czAKIC92ZW5kb3IvYmluL2luaXRcLnJhbmNodS1jb3JlXC5zaCB1Om9iamVjdF9yOmdvbGRmaXNoX3NldHVwX2V4ZWM6czAKIC92ZW5kb3IvYmluL2luaXRcLnJhbmNodS1uZXRcLnNoIHU6b2JqZWN0X3I6Z29sZGZpc2hfc2V0dXBfZXhlYzpzMAogL3ZlbmRvci9iaW4vcWVtdS1wcm9wcyAgICAgICB1Om9iamVjdF9yOnFlbXVfcHJvcHNfZXhlYzpzMApAQCAtMjMsNiArMjIsNyBAQAogL3ZlbmRvci9iaW4vaHcvYW5kcm9pZFwuaGFyZHdhcmVcLmRybUAxXC4wLXNlcnZpY2VcLndpZGV2aW5lICAgICAgICAgIHU6b2JqZWN0X3I6aGFsX2RybV93aWRldmluZV9leGVjOnMwCiAKIC92ZW5kb3IvbGliKDY0KT8vaHcvZ3JhbGxvY1wucmFuY2h1XC5zbyAgIHU6b2JqZWN0X3I6c2FtZV9wcm9jZXNzX2hhbF9maWxlOnMwCisvdmVuZG9yL2xpYig2NCk/L2h3L2dyYWxsb2NcLmdvbGRmaXNoXC5kZWZhdWx0XC5zbyAgIHU6b2JqZWN0X3I6c2FtZV9wcm9jZXNzX2hhbF9maWxlOnMwCiAvdmVuZG9yL2xpYig2NCk/L2xpYkVHTF9lbXVsYXRpb25cLnNvICAgICAgICAgIHU6b2JqZWN0X3I6c2FtZV9wcm9jZXNzX2hhbF9maWxlOnMwCiAvdmVuZG9yL2xpYig2NCk/L2xpYkdMRVN2MV9DTV9lbXVsYXRpb25cLnNvICAgIHU6b2JqZWN0X3I6c2FtZV9wcm9jZXNzX2hhbF9maWxlOnMwCiAvdmVuZG9yL2xpYig2NCk/L2xpYkdMRVN2Ml9lbXVsYXRpb25cLnNvICAgICAgIHU6b2JqZWN0X3I6c2FtZV9wcm9jZXNzX2hhbF9maWxlOnMwCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9nZW5mc19jb250ZXh0cyBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2dlbmZzX2NvbnRleHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxY2VkZjEKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9nZW5mc19jb250ZXh0cwpAQCAtMCwwICsxLDE3IEBACisjIE9uIHRoZSBlbXVsYXRvciwgZGV2aWNlIHRyZWUgZGlyIGlzIGNvbmZpZ3VyZWQgdG8gYmUKKyMgL3N5cy9idXMvcGxhdGZvcm0vZGV2aWNlcy9BTkRSMDAwMTowMC9wcm9wZXJ0aWVzL2FuZHJvaWQvIHdoaWNoIGlzIGEgc3ltbGluayB0bworIyAvc3lzL2RldmljZXMvcGxhdGZvcm0vQU5EUjAwMDE6MDAvcHJvcGVydGllcy9hbmRyb2lkLworZ2VuZnNjb24gc3lzZnMgL2RldmljZXMvcGxhdGZvcm0vQU5EUjAwMDE6MDAvcHJvcGVydGllcy9hbmRyb2lkIHU6b2JqZWN0X3I6c3lzZnNfZHRfZmlybXdhcmVfYW5kcm9pZDpzMAorCisjIFdlIGV4cGVjdCAvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS8qIGFuZCBldmVyeXRoaW5nIGl0IGxpbmtzIHRvIHRvIGJlIGxhYmVsZWQKKyMgYXMgc3lzZnNfYmF0dGVyeWluZm8uCitnZW5mc2NvbiBzeXNmcyAvZGV2aWNlcy9wbGF0Zm9ybS9HRlNIMDAwMTowMC9wb3dlcl9zdXBwbHkgdTpvYmplY3RfcjpzeXNmc19iYXR0ZXJ5aW5mbzpzMAorCisjIC9zeXMvY2xhc3MvcnRjCitnZW5mc2NvbiBzeXNmcyAvZGV2aWNlcy9wbnAwLzAwOjAwL3J0YyB1Om9iamVjdF9yOnN5c2ZzX3J0YzpzMAorZ2VuZnNjb24gc3lzZnMgL2RldmljZXMvcGxhdGZvcm0vR0ZTSDAwMDc6MDAvcnRjIHU6b2JqZWN0X3I6c3lzZnNfcnRjOnMwCisKKyMgL3N5cy9jbGFzcy9uZXQKK2dlbmZzY29uIHN5c2ZzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowOC4wL3ZpcnRpbzUvbmV0IHU6b2JqZWN0X3I6c3lzZnNfbmV0OnMwCitnZW5mc2NvbiBzeXNmcyAvZGV2aWNlcy92aXJ0dWFsL21hYzgwMjExX2h3c2ltL2h3c2ltMC9uZXQgdTpvYmplY3RfcjpzeXNmc19uZXQ6czAKK2dlbmZzY29uIHN5c2ZzIC9kZXZpY2VzL3ZpcnR1YWwvbWFjODAyMTFfaHdzaW0vaHdzaW0xL25ldCB1Om9iamVjdF9yOnN5c2ZzX25ldDpzMApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvZ29sZGZpc2hfc2V0dXAudGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9nb2xkZmlzaF9zZXR1cC50ZQppbmRleCBiY2Q0OWJkLi5lYjkxM2U5IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9nb2xkZmlzaF9zZXR1cC50ZQorKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9nb2xkZmlzaF9zZXR1cC50ZQpAQCAtNCw2ICs0LDcgQEAKIAogaW5pdF9kYWVtb25fZG9tYWluKGdvbGRmaXNoX3NldHVwKQogCitzZXRfcHJvcChnb2xkZmlzaF9zZXR1cCwgZGVidWdfcHJvcCk7CiBhbGxvdyBnb2xkZmlzaF9zZXR1cCBzZWxmOmNhcGFiaWxpdHkgeyBuZXRfYWRtaW4gbmV0X3JhdyB9OwogYWxsb3cgZ29sZGZpc2hfc2V0dXAgc2VsZjp1ZHBfc29ja2V0IHsgY3JlYXRlIGlvY3RsIH07CiBhbGxvdyBnb2xkZmlzaF9zZXR1cCB2ZW5kb3JfdG9vbGJveF9leGVjOmZpbGUgZXhlY3V0ZV9ub190cmFuczsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9maW5nZXJwcmludF9kZWZhdWx0LnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGFsX2ZpbmdlcnByaW50X2RlZmF1bHQudGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViMDZmMQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L2hhbF9maW5nZXJwcmludF9kZWZhdWx0LnRlCkBAIC0wLDAgKzEsNSBAQAorIyBUT0RPKGIvMzY2NDQ0OTIpOiBSZW1vdmUgZGF0YV9iZXR3ZWVuX2NvcmVfYW5kX3ZlbmRvcl92aW9sYXRvcnMgb25jZQorIyBoYWxfZmluZ2VycHJpbnQgbm8gbG9uZ2VyIGRpcmVjdGx5IGFjY2Vzc2VzIGZpbmdlcnByaW50ZF9kYXRhX2ZpbGUuCit0eXBlYXR0cmlidXRlIGhhbF9maW5nZXJwcmludF9kZWZhdWx0IGRhdGFfYmV0d2Vlbl9jb3JlX2FuZF92ZW5kb3JfdmlvbGF0b3JzOworYWxsb3cgaGFsX2ZpbmdlcnByaW50X2RlZmF1bHQgZmluZ2VycHJpbnRkX2RhdGFfZmlsZTpmaWxlIGNyZWF0ZV9maWxlX3Blcm1zOworYWxsb3cgaGFsX2ZpbmdlcnByaW50X2RlZmF1bHQgZmluZ2VycHJpbnRkX2RhdGFfZmlsZTpkaXIgcndfZGlyX3Blcm1zOwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGFsX2dyYXBoaWNzX2FsbG9jYXRvcl9kZWZhdWx0LnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGFsX2dyYXBoaWNzX2FsbG9jYXRvcl9kZWZhdWx0LnRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOGUyN2QKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9oYWxfZ3JhcGhpY3NfYWxsb2NhdG9yX2RlZmF1bHQudGUKQEAgLTAsMCArMSwyIEBACithbGxvdyBoYWxfZ3JhcGhpY3NfYWxsb2NhdG9yX2RlZmF1bHQgZ3JhcGhpY3NfZGV2aWNlOmRpciBzZWFyY2g7CithbGxvdyBoYWxfZ3JhcGhpY3NfYWxsb2NhdG9yX2RlZmF1bHQgZ3JhcGhpY3NfZGV2aWNlOmNocl9maWxlIHsgaW9jdGwgb3BlbiByZWFkIHdyaXRlIH07CmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9oZWFsdGhkLnRlIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGVhbHRoZC50ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ2NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvaGVhbHRoZC50ZQpAQCAtMCwwICsxLDIgQEAKKyMgQWxsb3cgdG8gcmVhZCAvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseSBkaXJlY3RvcnkKK2FsbG93IGhlYWx0aGQgc3lzZnM6ZGlyIHJfZGlyX3Blcm1zOwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvcHJvcGVydHkudGUgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9wcm9wZXJ0eS50ZQppbmRleCBhNDg2NzAyLi41NmUwMmVmIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9wcm9wZXJ0eS50ZQorKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9wcm9wZXJ0eS50ZQpAQCAtMSw0ICsxLDMgQEAKIHR5cGUgcWVtdV9wcm9wLCBwcm9wZXJ0eV90eXBlOwogdHlwZSBxZW11X2NtZGxpbmUsIHByb3BlcnR5X3R5cGU7CiB0eXBlIHJhZGlvX25vcmlsX3Byb3AsIHByb3BlcnR5X3R5cGU7Ci10eXBlIG9wZW5nbGVzX3Byb3AsIHByb3BlcnR5X3R5cGU7CmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9wcm9wZXJ0eV9jb250ZXh0cyBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3Byb3BlcnR5X2NvbnRleHRzCmluZGV4IGM2NmE4NWYuLjNhNjFiNmIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3Byb3BlcnR5X2NvbnRleHRzCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3Byb3BlcnR5X2NvbnRleHRzCkBAIC0zLDQgKzMsMyBAQAogcm8uZW11LiAgICAgICAgICAgICAgICAgdTpvYmplY3RfcjpxZW11X3Byb3A6czAKIHJvLmVtdWxhdG9yLiAgICAgICAgICAgIHU6b2JqZWN0X3I6cWVtdV9wcm9wOnMwCiByby5yYWRpby5ub3JpbCAgICAgICAgICB1Om9iamVjdF9yOnJhZGlvX25vcmlsX3Byb3A6czAKLXJvLm9wZW5nbGVzLiAgICAgICAgICAgIHU6b2JqZWN0X3I6b3BlbmdsZXNfcHJvcDpzMApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvc3lzdGVtX3NlcnZlci50ZSBiL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5L3N5c3RlbV9zZXJ2ZXIudGUKaW5kZXggOTA2MzA5NS4uZGQ3MGIxMiAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kvc3lzdGVtX3NlcnZlci50ZQorKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeS9zeXN0ZW1fc2VydmVyLnRlCkBAIC0xLDIgKzEgQEAKLWdldF9wcm9wKHN5c3RlbV9zZXJ2ZXIsIG9wZW5nbGVzX3Byb3ApCiBnZXRfcHJvcChzeXN0ZW1fc2VydmVyLCByYWRpb19ub3JpbF9wcm9wKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjQvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NC9Cb2FyZENvbmZpZy5tawppbmRleCA0NmM4ODY1Li5lMDY2ZTNhIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NC9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NC9Cb2FyZENvbmZpZy5tawpAQCAtMjAsMTIgKzIwLDEzIEBACiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IGFybXY4LWEKIFRBUkdFVF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCiBUQVJHRVRfQ1BVX0FCSSA6PSBhcm02NC12OGEKK1RBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUUgOj0gZ29sZGZpc2hfJChUQVJHRVRfQVJDSCkKIAogVEFSR0VUXzJORF9BUkNIIDo9IGFybQogVEFSR0VUXzJORF9DUFVfQUJJIDo9IGFybWVhYmktdjdhCiBUQVJHRVRfMk5EX0NQVV9BQkkyIDo9IGFybWVhYmkKIAotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX0FQUFMpJChmaWx0ZXIgY3RzLCQoTUFLRUNNREdPQUxTKSksKQoraWZuZXEgKCQoVEFSR0VUX0JVSUxEX0FQUFMpJChmaWx0ZXIgY3RzIHNkaywkKE1BS0VDTURHT0FMUykpLCkKICMgRE8gTk9UIFVTRQogIyBETyBOT1QgVVNFCiAjCkBAIC0zNSwxMSArMzYsMTEgQEAKICMgcGxhdGZvcm1zLgogIwogIyBJZiB5b3UncmUgYnVpbGRpbmcgYSA2NCBiaXQgcGxhdGZvcm0gKGFuZCBub3QgYW4gYXBwbGljYXRpb24pIHRoZQotIyBBUk0tdjggc3BlY2lmaWNhdGlvbiBhbGxvd3MgeW91IHRvIGFzc3VtZSBORU9OIGFuZCBhbGwgdGhlIGZlYXR1cmVzCi0jIGF2YWlsYWJsZSBpbiBhIGNvcnRleC1BMTUgQ1BVLiBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IDoKKyMgQVJNLXY4IHNwZWNpZmljYXRpb24gYWxsb3dzIHlvdSB0byBhc3N1bWUgYWxsIHRoZSBmZWF0dXJlcyBhdmFpbGFibGUgaW4gYW4KKyMgYXJtdjctYS1uZW9uIENQVS4gWW91IHNob3VsZCBzZXQgdGhlIGZvbGxvd2luZyBhcyAybmQgYXJjaC9jcHUgdmFyaWFudDoKICMKLSMgVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQgOj0gYXJtdjctYS1uZW9uCi0jIFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgOj0gY29ydGV4LWExNQorIyBUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCisjIFRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgOj0gZ2VuZXJpYwogIwogIyBETyBOT1QgVVNFCiAjIERPIE5PVCBVU0UKQEAgLTUwLDggKzUxLDggQEAKICMgRE8gTk9UIFVTRQogIyBETyBOT1QgVVNFCiBlbHNlCi1UQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12Ny1hLW5lb24KLVRBUkdFVF8yTkRfQ1BVX1ZBUklBTlQgOj0gY29ydGV4LWExNQorVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQorVEFSR0VUXzJORF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCiBlbmRpZgogCiAKQEAgLTg4LDExICs4OSwxMyBAQAogIyB3aGVuIGZpbmFsaXppbmcgdGhlbS4KIEJPQVJEX1ZFTkRPUklNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDEwMDAwMDAwMAogQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0Ci1CT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDY5MjA2MDE2Ci1CT0FSRF9DQUNIRUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAogQk9BUkRfRkxBU0hfQkxPQ0tfU0laRSA6PSA1MTIKIFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9FWFRfRElTQUJMRUQgOj0gdHJ1ZQogREVWSUNFX01BVFJJWF9GSUxFICAgOj0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCiAKIEJPQVJEX1BST1BFUlRZX09WRVJSSURFU19TUExJVF9FTkFCTEVEIDo9IHRydWUKIEJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gYnVpbGQvdGFyZ2V0L2JvYXJkL2dlbmVyaWMvc2Vwb2xpY3kKKworIyBFbmFibGUgQS9CIHVwZGF0ZQorVEFSR0VUX05PX1JFQ09WRVJZIDo9IHRydWUKK0JPQVJEX0JVSUxEX1NZU1RFTV9ST09UX0lNQUdFIDo9IHRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X2EvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9hL0JvYXJkQ29uZmlnLm1rCmluZGV4IDhmNDA0M2YuLjM0YThhYzAgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X2EvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYS9Cb2FyZENvbmZpZy5tawpAQCAtMjMsNyArMjMsNyBAQAogVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKIAogVEFSR0VUXzJORF9BUkNIIDo9IGFybQotVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQgOj0gYXJtdjctYS1uZW9uCitUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCiBUQVJHRVRfMk5EX0NQVV9BQkkgOj0gYXJtZWFiaS12N2EKIFRBUkdFVF8yTkRfQ1BVX0FCSTIgOj0gYXJtZWFiaQotVEFSR0VUXzJORF9DUFVfVkFSSUFOVCA6PSBjb3J0ZXgtYTE1CitUQVJHRVRfMk5EX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X2FiL0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYWIvQm9hcmRDb25maWcubWsKaW5kZXggNjc0NDI4OS4uMDBhZmVlNiAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYWIvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYWIvQm9hcmRDb25maWcubWsKQEAgLTIzLDEwICsyMywxMCBAQAogVEFSR0VUX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKIAogVEFSR0VUXzJORF9BUkNIIDo9IGFybQotVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQgOj0gYXJtdjctYS1uZW9uCitUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12OC1hCiBUQVJHRVRfMk5EX0NQVV9BQkkgOj0gYXJtZWFiaS12N2EKIFRBUkdFVF8yTkRfQ1BVX0FCSTIgOj0gYXJtZWFiaQotVEFSR0VUXzJORF9DUFVfVkFSSUFOVCA6PSBjb3J0ZXgtYTE1CitUQVJHRVRfMk5EX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKIAogIyBFbmFibGUgQS9CIHVwZGF0ZQogVEFSR0VUX05PX1JFQ09WRVJZIDo9IHRydWUKQEAgLTM5LDMgKzM5LDUgQEAKICMgVE9ETyhiLzM2NzY0MjE1KTogcmVtb3ZlIHRoaXMgc2V0dGluZyB3aGVuIHRoZSBnZW5lcmljIHN5c3RlbSBpbWFnZQogIyBubyBsb25nZXIgaGFzIFFDT00tc3BlY2lmaWMgZGlyZWN0b3JpZXMgdW5kZXIgLy4KIEJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gYnVpbGQvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYWIvc2Vwb2xpY3kKKworQk9BUkRfVk5ES19WRVJTSU9OIDo9IGN1cnJlbnQKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X2FiL3NlcG9saWN5L09XTkVSUyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X2FiL3NlcG9saWN5L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODI4OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYWIvc2Vwb2xpY3kvT1dORVJTCkBAIC0wLDAgKzEsNCBAQAoramVmZnZAZ29vZ2xlLmNvbQorZGNhc2htYW5AZ29vZ2xlLmNvbQoramJpcmVzQGdvb2dsZS5jb20KK3NzcGF0aWxAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtX2EvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm1fYS9Cb2FyZENvbmZpZy5tawppbmRleCBkOTMwNzQ5Li5mMGUxYTM5IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm1fYS9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm1fYS9Cb2FyZENvbmZpZy5tawpAQCAtMTcsNyArMTcsNyBAQAogaW5jbHVkZSBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC90cmVibGVfY29tbW9uXzMyLm1rCiAKICMgT3ZlcndyaXRlIHRoZSBzZXR0aW5nIGluIHRyZWJsZV9jb21tb25fMzIubWsgZm9yIG5vbi1BL0IgYXJtIEdTSQotQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gODA1MzA2MzY4ICMgNzY4TUIKK0JPQVJEX1NZU1RFTUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDk0MzcxODQwMCAjIDkwME1CCiAKIFRBUkdFVF9BUkNIIDo9IGFybQogVEFSR0VUX0FSQ0hfVkFSSUFOVCA6PSBhcm12Ny1hLW5lb24KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybV9hYi9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybV9hYi9Cb2FyZENvbmZpZy5tawppbmRleCAwMTFiY2RmLi4wZDE2NzVkIDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm1fYWIvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtX2FiL0JvYXJkQ29uZmlnLm1rCkBAIC0xNyw3ICsxNyw3IEBACiBpbmNsdWRlIGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL3RyZWJsZV9jb21tb25fMzIubWsKIAogIyBPdmVyd3JpdGUgdGhlIHNldHRpbmcgaW4gdHJlYmxlX2NvbW1vbl8zMi5tayBmb3Igbm9uLUEvQiBhcm0gR1NJCi1CT0FSRF9TWVNURU1JTUFHRV9QQVJUSVRJT05fU0laRSA6PSA4MDUzMDYzNjggIyA3NjhNQgorQk9BUkRfU1lTVEVNSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gOTQzNzE4NDAwICMgOTAwTUIKIAogVEFSR0VUX0FSQ0ggOj0gYXJtCiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IGFybXY3LWEtbmVvbgpAQCAtMjgsMyArMjgsMTEgQEAKICMgRW5hYmxlIEEvQiB1cGRhdGUKIFRBUkdFVF9OT19SRUNPVkVSWSA6PSB0cnVlCiBCT0FSRF9CVUlMRF9TWVNURU1fUk9PVF9JTUFHRSA6PSB0cnVlCisKKyMgVE9ETyhqaXlvbmcpIFRoZXNlIG1pZ2h0IGJlIFNvQyBzcGVjaWZpYy4KK0JPQVJEX1JPT1RfRVhUUkFfRk9MREVSUyArPSBmaXJtd2FyZSBmaXJtd2FyZS9yYWRpbyBwZXJzaXN0CitCT0FSRF9ST09UX0VYVFJBX1NZTUxJTktTIDo9IC92ZW5kb3IvbGliL2RzcDovZHNwCisKKyMgVE9ETyhiLzM2NzY0MjE1KTogcmVtb3ZlIHRoaXMgc2V0dGluZyB3aGVuIHRoZSBnZW5lcmljIHN5c3RlbSBpbWFnZQorIyBubyBsb25nZXIgaGFzIFFDT00tc3BlY2lmaWMgZGlyZWN0b3JpZXMgdW5kZXIgLy4KK0JPQVJEX1NFUE9MSUNZX0RJUlMgKz0gYnVpbGQvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfYWIvc2Vwb2xpY3kKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L0FuZHJvaWRCb2FyZC5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L0FuZHJvaWRCb2FyZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhZmYyNy4uMDAwMDAwMAotLS0gYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9BbmRyb2lkQm9hcmQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0taW5jbHVkZSBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9BbmRyb2lkQm9hcmQubWsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L1JFQURNRS50eHQgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm12NS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQ1OTBhLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVRoZSAiZ2VuZXJpY19hcm12NSIgcHJvZHVjdCBkZWZpbmVzIGEgbm9uLWhhcmR3YXJlLXNwZWNpZmljIHRhcmdldAotd2l0aG91dCBhIGtlcm5lbCBvciBib290bG9hZGVyLgotCi1JdCBpcyBub3QgYSBwcm9kdWN0ICJiYXNlIGNsYXNzIjsgbm8gb3RoZXIgcHJvZHVjdHMgaW5oZXJpdAotZnJvbSBpdCBvciB1c2UgaXQgaW4gYW55IHdheS4KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybXY1L3N5c3RlbS5wcm9wIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvc3lzdGVtLnByb3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzN2EwZjkuLjAwMDAwMDAKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtdjUvc3lzdGVtLnByb3AKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMKLSMgc3lzdGVtLnByb3AgZm9yIGdlbmVyaWMgc2RrCi0jCi0KLXJpbGQubGlicGF0aD0vc3lzdGVtL2xpYi9saWJyZWZlcmVuY2UtcmlsLnNvCi1yaWxkLmxpYmFyZ3M9LWQgL2Rldi90dHlTMApkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfbWlwcy9Cb2FyZENvbmZpZy5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX21pcHMvQm9hcmRDb25maWcubWsKaW5kZXggZmI2NmQyMS4uNTIzNDA4YiAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfbWlwcy9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19taXBzL0JvYXJkQ29uZmlnLm1rCkBAIC02NSwxMCArNjUsMTIgQEAKICMgd2hlbiBmaW5hbGl6aW5nIHRoZW0uCiBCT0FSRF9WRU5ET1JJTUFHRV9QQVJUSVRJT05fU0laRSA6PSAxMDAwMDAwMDAKIEJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAotQk9BUkRfQ0FDSEVJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA2OTIwNjAxNgotQk9BUkRfQ0FDSEVJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKIEJPQVJEX0ZMQVNIX0JMT0NLX1NJWkUgOj0gNTEyCiBUQVJHRVRfVVNFUklNQUdFU19TUEFSU0VfRVhUX0RJU0FCTEVEIDo9IHRydWUKIERFVklDRV9NQVRSSVhfRklMRSAgIDo9IGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbAogCiBCT0FSRF9TRVBPTElDWV9ESVJTICs9IGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5CisKKyMgRW5hYmxlIEEvQiB1cGRhdGUKK1RBUkdFVF9OT19SRUNPVkVSWSA6PSB0cnVlCitCT0FSRF9CVUlMRF9TWVNURU1fUk9PVF9JTUFHRSA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY19taXBzNjQvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19taXBzNjQvQm9hcmRDb25maWcubWsKaW5kZXggNjdiYjUxZi4uMjA1MmQ3YiAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfbWlwczY0L0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX21pcHM2NC9Cb2FyZENvbmZpZy5tawpAQCAtODAsOCArODAsNiBAQAogIyB3aGVuIGZpbmFsaXppbmcgdGhlbS4KIEJPQVJEX1ZFTkRPUklNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDEwMDAwMDAwMAogQk9BUkRfVkVORE9SSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0Ci1CT0FSRF9DQUNIRUlNQUdFX1BBUlRJVElPTl9TSVpFIDo9IDY5MjA2MDE2Ci1CT0FSRF9DQUNIRUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAogQk9BUkRfRkxBU0hfQkxPQ0tfU0laRSA6PSA1MTIKIFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9FWFRfRElTQUJMRUQgOj0gdHJ1ZQogREVWSUNFX01BVFJJWF9GSUxFICAgOj0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sCkBAIC04OSwzICs4Nyw3IEBACiBCT0FSRF9TRVBPTElDWV9ESVJTICs9IGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljL3NlcG9saWN5CiAKIERFWF9QUkVPUFRfREVGQVVMVCA6PSBub3N0cmlwcGluZworCisjIEVuYWJsZSBBL0IgdXBkYXRlCitUQVJHRVRfTk9fUkVDT1ZFUlkgOj0gdHJ1ZQorQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L0JvYXJkQ29uZmlnLm1rCmluZGV4IDAwMGE5YTMuLmY3MWU3MmIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9Cb2FyZENvbmZpZy5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvQm9hcmRDb25maWcubWsKQEAgLTEwLDYgKzEwLDExIEBACiBUQVJHRVRfQVJDSCA6PSB4ODYKIFRBUkdFVF9BUkNIX1ZBUklBTlQgOj0geDg2CiBUQVJHRVRfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKK1RBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUUgOj0gZ29sZGZpc2hfJChUQVJHRVRfQVJDSCkKKworI2VtdWxhdG9yIG5vdyB1c2VzIDY0Yml0IGtlcm5lbCB0byBydW4gMzJiaXQgeDg2IGltYWdlCisjCitUQVJHRVRfVVNFU182NF9CSVRfQklOREVSIDo9IHRydWUKIAogIyBUaGUgSUEgZW11bGF0b3IgKHFlbXUpIHVzZXMgdGhlIEdvbGRmaXNoIGRldmljZXMKIEhBVkVfSFRDX0FVRElPX0RSSVZFUiA6PSB0cnVlCkBAIC00OCw4ICs1Myw2IEBACiAjIHdoZW4gZmluYWxpemluZyB0aGVtLgogQk9BUkRfVkVORE9SSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMTAwMDAwMDAwCiBCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKLUJPQVJEX0NBQ0hFSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gNjkyMDYwMTYKLUJPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRSA6PSBleHQ0CiBCT0FSRF9GTEFTSF9CTE9DS19TSVpFIDo9IDUxMgogVEFSR0VUX1VTRVJJTUFHRVNfU1BBUlNFX0VYVF9ESVNBQkxFRCA6PSB0cnVlCiBERVZJQ0VfTUFUUklYX0ZJTEUgICA6PSBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwKQEAgLTU3LDMgKzYwLDkgQEAKIEJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gXAogICAgICAgICBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeSBcCiAgICAgICAgIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeQorCitCT0FSRF9WTkRLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIEVuYWJsZSBBL0IgdXBkYXRlCitUQVJHRVRfTk9fUkVDT1ZFUlkgOj0gdHJ1ZQorQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L3NlcG9saWN5L09XTkVSUyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyODk4OAotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeS9PV05FUlMKQEAgLTAsMCArMSw0IEBACitqZWZmdkBnb29nbGUuY29tCitkY2FzaG1hbkBnb29nbGUuY29tCitqYmlyZXNAZ29vZ2xlLmNvbQorc3NwYXRpbEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjQvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODZfNjQvQm9hcmRDb25maWcubWsKaW5kZXggODgzZGQyZS4uYTljNTE0MiAxMDA3NTUKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2XzY0L0JvYXJkQ29uZmlnLm1rCisrKyBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Nl82NC9Cb2FyZENvbmZpZy5tawpAQCAtMTAsNiArMTAsNyBAQAogVEFSR0VUX0FSQ0ggOj0geDg2XzY0CiBUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IHg4Nl82NAogVEFSR0VUX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCitUQVJHRVRfQk9PVExPQURFUl9CT0FSRF9OQU1FIDo9IGdvbGRmaXNoXyQoVEFSR0VUX0FSQ0gpCiAKIFRBUkdFVF8yTkRfQ1BVX0FCSSA6PSB4ODYKIFRBUkdFVF8yTkRfQVJDSCA6PSB4ODYKQEAgLTUwLDggKzUxLDYgQEAKICMgd2hlbiBmaW5hbGl6aW5nIHRoZW0uCiBCT0FSRF9WRU5ET1JJTUFHRV9QQVJUSVRJT05fU0laRSA6PSAxMDAwMDAwMDAKIEJPQVJEX1ZFTkRPUklNQUdFX0ZJTEVfU1lTVEVNX1RZUEUgOj0gZXh0NAotQk9BUkRfQ0FDSEVJTUFHRV9QQVJUSVRJT05fU0laRSA6PSA2OTIwNjAxNgotQk9BUkRfQ0FDSEVJTUFHRV9GSUxFX1NZU1RFTV9UWVBFIDo9IGV4dDQKIEJPQVJEX0ZMQVNIX0JMT0NLX1NJWkUgOj0gNTEyCiBUQVJHRVRfVVNFUklNQUdFU19TUEFSU0VfRVhUX0RJU0FCTEVEIDo9IHRydWUKIEJPQVJEX1BST1BFUlRZX09WRVJSSURFU19TUExJVF9FTkFCTEVEIDo9IHRydWUKQEAgLTYwLDMgKzU5LDkgQEAKIEJPQVJEX1NFUE9MSUNZX0RJUlMgKz0gXAogICAgICAgICBidWlsZC90YXJnZXQvYm9hcmQvZ2VuZXJpYy9zZXBvbGljeSBcCiAgICAgICAgIGJ1aWxkL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9zZXBvbGljeQorCitCT0FSRF9WTkRLX1ZFUlNJT04gOj0gY3VycmVudAorCisjIEVuYWJsZSBBL0IgdXBkYXRlCitUQVJHRVRfTk9fUkVDT1ZFUlkgOj0gdHJ1ZQorQk9BUkRfQlVJTERfU1lTVEVNX1JPT1RfSU1BR0UgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL3RyZWJsZV9jb21tb24ubWsgYi90YXJnZXQvYm9hcmQvdHJlYmxlX2NvbW1vbi5tawppbmRleCBmZDMzNjNjLi4yNmEyNjU1IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvdHJlYmxlX2NvbW1vbi5taworKysgYi90YXJnZXQvYm9hcmQvdHJlYmxlX2NvbW1vbi5tawpAQCAtMTksNyArMTksNiBAQAogCiAjIFZOREsKIEJPQVJEX1ZOREtfVkVSU0lPTiA6PSBjdXJyZW50Ci1CT0FSRF9WTkRLX1JVTlRJTUVfRElTQUJMRSA6PSB0cnVlCiAKICMgUHJvcGVydGllcwogVEFSR0VUX1NZU1RFTV9QUk9QIDo9IGJ1aWxkL21ha2UvdGFyZ2V0L2JvYXJkL3RyZWJsZV9zeXN0ZW0ucHJvcApAQCAtNDAsMjggKzM5LDI1IEBACiAjIEdlbmVyaWMgQU9TUCBpbWFnZSBhbHdheXMgcmVxdWlyZXMgc2VwYXJhdGUgdmVuZG9yLmltZwogVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUiA6PSB2ZW5kb3IKIAotIyBFbmFibGUgZGV4IHByZS1vcHQgdG8gc3BlZWQgdXAgaW5pdGlhbCBib290Ci1pZmVxICgkKEhPU1RfT1MpLGxpbnV4KQotICBpZmVxICgkKFdJVEhfREVYUFJFT1BUKSwpCi0gICAgV0lUSF9ERVhQUkVPUFQgOj0gdHJ1ZQotICAgIFdJVEhfREVYUFJFT1BUX1BJQyA6PSB0cnVlCi0gICAgaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCi0gICAgICAjIFJldGFpbiBjbGFzc2VzLmRleCBpbiBBUEsncyBmb3Igbm9uLXVzZXIgYnVpbGRzCi0gICAgICBERVhfUFJFT1BUX0RFRkFVTFQgOj0gbm9zdHJpcHBpbmcKLSAgICBlbmRpZgotICBlbmRpZgotZW5kaWYKLQogIyBHZW5lcmljIEFPU1AgaW1hZ2UgZG9lcyBOT1Qgc3VwcG9ydCBIV0MxCiBUQVJHRVRfVVNFU19IV0MyIDo9IHRydWUKICMgU2V0IGVtdWxhdG9yIGZyYW1lYnVmZmVyIGRpc3BsYXkgZGV2aWNlIGJ1ZmZlciBjb3VudCB0byAzCiBOVU1fRlJBTUVCVUZGRVJfU1VSRkFDRV9CVUZGRVJTIDo9IDMKIAotIyBUT0RPKGIvMzU3OTAzOTkpOiByZW1vdmUgd2hlbiBiLzM1NzkwMzk5IGlzIGZpeGVkLgotQk9BUkRfTkFORF9TUEFSRV9TSVpFIDo9IDAKLUJPQVJEX0ZMQVNIX0JMT0NLX1NJWkUgOj0gNTEyCisjIEF1ZGlvCitVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GIDo9IDEKIAogIyBiLzY0NzAwMTk1OiBhZGQgbWluaW11bSBzdXBwb3J0IGZvciBvZG0uaW1nCiAjIEN1cnJlbnRseSBvZG0uaW1nIGNhbiBvbmx5IGJlIGJ1aWx0IGJ5IGBtYWtlIGN1c3RvbV9pbWFnZXNgLgogIyBBZGRpbmcgL29kbSBtb3VudCBwb2ludCB1bmRlciByb290IGRpcmVjdG9yeS4KIEJPQVJEX1JPT1RfRVhUUkFfRk9MREVSUyArPSBvZG0KKworIyBBbmRyb2lkIFZlcmlmaWVkIEJvb3QgKEFWQik6CisjICAgQnVpbGRzIGEgc3BlY2lhbCB2Ym1ldGEuaW1nIHRoYXQgZGlzYWJsZXMgQVZCIHZlcmlmaWNhdGlvbi4KKyMgICBPdGhlcndpc2UsIEFWQiB3aWxsIHByZXZlbnQgdGhlIGRldmljZSBmcm9tIGJvb3RpbmcgdGhlIGdlbmVyaWMgc3lzdGVtLmltZy4KKyMgICBBbHNvIGNoZWNrcyB0aGF0IEJPQVJEX0FWQl9FTkFCTEUgaXMgbm90IHNldCwgdG8gcHJldmVudCBhZGRpbmcgdmVyaXR5CisjICAgbWV0YWRhdGEgaW50byBzeXN0ZW0uaW1nLgoraWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQorJChlcnJvciBCT0FSRF9BVkJfRU5BQkxFIGNhbm5vdCBiZSBzZXQgZm9yIFRyZWJsZSBHU0kpCitlbmRpZgorQk9BUkRfQlVJTERfRElTQUJMRURfVkJNRVRBSU1BR0UgOj0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvQW5kcm9pZFByb2R1Y3RzLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvQW5kcm9pZFByb2R1Y3RzLm1rCmluZGV4IDllMmFkZWUuLjg1MzMwYjMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L0FuZHJvaWRQcm9kdWN0cy5taworKysgYi90YXJnZXQvcHJvZHVjdC9BbmRyb2lkUHJvZHVjdHMubWsKQEAgLTM2LDcgKzM2LDYgQEAKIFBST0RVQ1RfTUFLRUZJTEVTIDo9IFwKICAgICAkKExPQ0FMX0RJUikvYW9zcF9hcm0ubWsgXAogICAgICQoTE9DQUxfRElSKS9mdWxsLm1rIFwKLSAgICAkKExPQ0FMX0RJUikvZ2VuZXJpY19hcm12NS5tayBcCiAgICAgJChMT0NBTF9ESVIpL2Fvc3BfeDg2Lm1rIFwKICAgICAkKExPQ0FMX0RJUikvZnVsbF94ODYubWsgXAogICAgICQoTE9DQUxfRElSKS9hb3NwX21pcHMubWsgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9taXBzLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9taXBzLm1rCmluZGV4IGE3NmI5M2EuLjVlZTYxODUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfbWlwcy5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX21pcHMubWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4tU291cmNlIFByb2plY3QKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3Blbi1Tb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTMsNiArMTMsMTkgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKKworUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorCXJpbGQubGlicGF0aD0vdmVuZG9yL2xpYi9saWJyZWZlcmVuY2UtcmlsLnNvCisKKyMgTm90ZTogdGhlIGZvbGxvd2luZyBsaW5lcyBuZWVkIHRvIHN0YXkgYXQgdGhlIGJlZ2lubmluZyBzbyB0aGF0IGl0IGNhbgorIyB0YWtlIHByaW9yaXR5ICBhbmQgb3ZlcnJpZGUgdGhlIHJ1bGVzIGl0IGluaGVyaXQgZnJvbSBvdGhlciBtayBmaWxlcworIyBzZWUgY29weSBmaWxlIHJ1bGVzIGluIGNvcmUvTWFrZWZpbGUKK1BST0RVQ1RfQ09QWV9GSUxFUyArPSBcCisgICAgZGV2ZWxvcG1lbnQvc3lzLWltZy9hZHZhbmNlZEZlYXR1cmVzLmluaS5hcm06YWR2YW5jZWRGZWF0dXJlcy5pbmkgXAorICAgIHByZWJ1aWx0cy9xZW11LWtlcm5lbC9taXBzLzMuMTgva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUgXAorICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2ZzdGFiLnJhbmNodS5taXBzOnJvb3QvZnN0YWIucmFuY2h1IFwKKyAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9mc3RhYi5yYW5jaHUuZWFybHkuYXJtOnJvb3QvZnN0YWIucmFuY2h1LmVhcmx5CisKIGluY2x1ZGUgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9mdWxsX21pcHMubWsKIAogUFJPRFVDVF9OQU1FIDo9IGFvc3BfbWlwcwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9taXBzNjQubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX21pcHM2NC5tawppbmRleCBmNjA2ODU4Li43M2QzNzMxIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX21pcHM2NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX21pcHM2NC5tawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3Blbi1Tb3VyY2UgUHJvamVjdAorIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuLVNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxNCArMTQsMjIgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK1BST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKKwlyaWxkLmxpYnBhdGg9L3ZlbmRvci9saWI2NC9saWJyZWZlcmVuY2UtcmlsLnNvCisKICMgVGhpcyBpcyBhIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZm9yIGEgZnVsbC1mZWF0dXJlZCBidWlsZCBvZiB0aGUKICMgT3Blbi1Tb3VyY2UgcGFydCBvZiB0aGUgdHJlZS4gSXQncyBnZWFyZWQgdG93YXJkIGEgVVMtY2VudHJpYwotIyBtaXBzNjQgYnVpbGQgcXVpdGUgc3BlY2lmaWNhbGx5IGZvciB0aGUgZW11bGF0b3IsIGFuZCBtaWdodCBub3QgYmUKKyMgYnVpbGQgcXVpdGUgc3BlY2lmaWNhbGx5IGZvciB0aGUgZW11bGF0b3IsIGFuZCBtaWdodCBub3QgYmUKICMgZW50aXJlbHkgYXBwcm9wcmlhdGUgdG8gaW5oZXJpdCBmcm9tIGZvciBvbi1kZXZpY2UgY29uZmlndXJhdGlvbnMuCiAKLSMgVGhpcyBpcyBmb3IgZW5hYmxpbmcgZXRoZXJuZXQgc3VwcG9ydCBmb3IgcmFuY2h1LgotIyBDb25zaWRlciByZW1vdmluZyB0aGlzIGFmdGVyIFJJTCBzdXBwb3J0IGlzIHByb3ZpZGVkIGluIHJhbmNodS4KLVBST0RVQ1RfQ09QWV9GSUxFUyArPSBmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLmV0aGVybmV0LnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUuZXRoZXJuZXQueG1sCisjIE5vdGU6IHRoZSBmb2xsb3dpbmcgbGluZXMgbmVlZCB0byBzdGF5IGF0IHRoZSBiZWdpbm5pbmcgc28gdGhhdCBpdCBjYW4KKyMgdGFrZSBwcmlvcml0eSAgYW5kIG92ZXJyaWRlIHRoZSBydWxlcyBpdCBpbmhlcml0IGZyb20gb3RoZXIgbWsgZmlsZXMKKyMgc2VlIGNvcHkgZmlsZSBydWxlcyBpbiBjb3JlL01ha2VmaWxlCitQUk9EVUNUX0NPUFlfRklMRVMgKz0gXAorICAgIGRldmVsb3BtZW50L3N5cy1pbWcvYWR2YW5jZWRGZWF0dXJlcy5pbmkuYXJtOmFkdmFuY2VkRmVhdHVyZXMuaW5pIFwKKyAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwvbWlwczY0LzMuMTgva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUgXAorICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2ZzdGFiLnJhbmNodS5taXBzOnJvb3QvZnN0YWIucmFuY2h1IFwKKyAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9mc3RhYi5yYW5jaHUuZWFybHkuYXJtOnJvb3QvZnN0YWIucmFuY2h1LmVhcmx5CiAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY29yZV82NF9iaXQubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Fvc3BfYmFzZV90ZWxlcGhvbnkubWspCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Ni5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCmluZGV4IDAzMjAzY2UuLjk2YzllMzMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCkBAIC0yNCw3ICsyNCw3IEBACiBQUk9EVUNUX0NPUFlfRklMRVMgKz0gXAogICAgIGRldmVsb3BtZW50L3N5cy1pbWcvYWR2YW5jZWRGZWF0dXJlcy5pbmk6YWR2YW5jZWRGZWF0dXJlcy5pbmkgXAogICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2RhdGEvZXRjL2VuY3J5cHRpb25rZXkuaW1nOmVuY3J5cHRpb25rZXkuaW1nIFwKLSAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwveDg2LzMuMTgva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUKKyAgICBwcmVidWlsdHMvcWVtdS1rZXJuZWwveDg2XzY0LzQuNC9rZXJuZWwtcWVtdTI6a2VybmVsLXJhbmNodS02NAogCiBpbmNsdWRlICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZnVsbF94ODYubWsKIApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5tawppbmRleCA2OTNiZGFmLi4wODZhNzZmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5tawpAQCAtMjUsNyArMjUsNyBAQAogUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKICAgICBkZXZlbG9wbWVudC9zeXMtaW1nL2FkdmFuY2VkRmVhdHVyZXMuaW5pOmFkdmFuY2VkRmVhdHVyZXMuaW5pIFwKICAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9kYXRhL2V0Yy9lbmNyeXB0aW9ua2V5LmltZzplbmNyeXB0aW9ua2V5LmltZyBcCi0gICAgcHJlYnVpbHRzL3FlbXUta2VybmVsL3g4Nl82NC8zLjE4L2tlcm5lbC1xZW11MjprZXJuZWwtcmFuY2h1CisgICAgcHJlYnVpbHRzL3FlbXUta2VybmVsL3g4Nl82NC80LjQva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUKIAogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jb3JlXzY0X2JpdC5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW9zcF9iYXNlX3RlbGVwaG9ueS5taykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Jhc2UubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlLm1rCmluZGV4IDllMzg2MjMuLmE3ZjJkNWMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Jhc2UubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYmFzZS5tawpAQCAtMjMsNiArMjMsNyBAQAogICAgIGFwcG9wcyBcCiAgICAgYW0gXAogICAgIGFuZHJvaWQucG9saWN5IFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZSBcCiAgICAgYW5kcm9pZC50ZXN0Lm1vY2sgXAogICAgIGFuZHJvaWQudGVzdC5ydW5uZXIgXAogICAgIGFwcF9wcm9jZXNzIFwKQEAgLTMxLDYgKzMyLDcgQEAKICAgICBiaXQgXAogICAgIGJsa2lkIFwKICAgICBibWdyIFwKKyAgICBicGZsb2FkZXIgXAogICAgIGJ1Z3JlcG9ydCBcCiAgICAgYnVncmVwb3J0eiBcCiAgICAgY2FtZXJhc2VydmVyIFwKQEAgLTQ0LDYgKzQ2LDcgQEAKICAgICBpbWUgXAogICAgIGluY2lkZW50ZCBcCiAgICAgaW5jaWRlbnQgXAorICAgIGluY2lkZW50X2hlbHBlciBcCiAgICAgaW5jaWRlbnRfcmVwb3J0IFwKICAgICBpbnB1dCBcCiAgICAgamF2YXgub2JleCBcCkBAIC0xMTQsNiArMTE3LDcgQEAKICAgICBtdHBkIFwKICAgICBuZGMgXAogICAgIG5ldGQgXAorICAgIHBlcmZldHRvIFwKICAgICBwaW5nIFwKICAgICBwaW5nNiBcCiAgICAgcGxhdGZvcm0ueG1sIFwKQEAgLTEyOSwxMyArMTMzLDI4IEBACiAgICAgc2V0dGluZ3MgXAogICAgIHNnZGlzayBcCiAgICAgc20gXAorICAgIHN0YXRzZCBcCiAgICAgc3ZjIFwKICAgICB0YyBcCiAgICAgdGVsZWNvbSBcCisgICAgdHJhY2VkIFwKKyAgICB0cmFjZWRfcHJvYmVzIFwKICAgICB2ZGMgXAogICAgIHZvbGQgXAogICAgIHdtCiAKKyMgQWRkIHRoZSBjb21wYXRpYmlsaXR5IGxpYnJhcnkgdGhhdCBpcyBuZWVkZWQgd2hlbiBvcmcuYXBhY2hlLmh0dHAubGVnYWN5CisjIGlzIHJlbW92ZWQgZnJvbSB0aGUgYm9vdGNsYXNzcGF0aC4KK2lmZXEgKCQoUkVNT1ZFX09BSExfRlJPTV9CQ1ApLHRydWUpCitQUk9EVUNUX1BBQ0tBR0VTICs9IGZyYW1ld29yay1vYWhsLWJhY2t3YXJkLWNvbXBhdGliaWxpdHkKK2VuZGlmCisKKyMgQWRkIHRoZSBjb21wYXRpYmlsaXR5IGxpYnJhcnkgdGhhdCBpcyBuZWVkZWQgd2hlbiBhbmRyb2lkLnRlc3QuYmFzZQorIyBpcyByZW1vdmVkIGZyb20gdGhlIGJvb3RjbGFzc3BhdGguCitpZmVxICgkKFJFTU9WRV9BVEJfRlJPTV9CQ1ApLHRydWUpCitQUk9EVUNUX1BBQ0tBR0VTICs9IGZyYW1ld29yay1hdGItYmFja3dhcmQtY29tcGF0aWJpbGl0eQorZW5kaWYKKwogIyBFc3NlbnRpYWwgSEFMIG1vZHVsZXMKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMC1zZXJ2aWNlIFwKQEAgLTE0Nyw4ICsxNjYsMTAgQEAKIAogIyBQYWNrYWdlcyBpbmNsdWRlZCBvbmx5IGZvciBlbmcgb3IgdXNlcmRlYnVnIGJ1aWxkcywgcHJldmlvdXNseSBkZWJ1ZyB0YWdnZWQKIFBST0RVQ1RfUEFDS0FHRVNfREVCVUcgOj0gXAorICAgIGxvZ3BlcnNpc3Quc3RhcnQgXAogICAgIHBlcmZwcm9mZCBcCi0gICAgc3FsaXRlMworICAgIHNxbGl0ZTMgXAorICAgIHN0cmFjZQogCiBQUk9EVUNUX0NPUFlfRklMRVMgOj0gJChjYWxsIGFkZC10by1wcm9kdWN0LWNvcHktZmlsZXMtaWYtZXhpc3RzLFwKICAgICBmcmFtZXdvcmtzL2Jhc2UvY29uZmlnL3ByZWxvYWRlZC1jbGFzc2VzOnN5c3RlbS9ldGMvcHJlbG9hZGVkLWNsYXNzZXMpCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9jb3JlLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvY29yZS5tawppbmRleCBhMmIwZjFjLi4zNWUyMDJlIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9jb3JlLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2NvcmUubWsKQEAgLTQyLDEwICs0Miw5IEBACiAgICAgS2V5Q2hhaW4gXAogICAgIEtleWd1YXJkIFwKICAgICBMYXRpbklNRSBcCi0gICAgTGF1bmNoZXIyIFwKKyAgICBMYXVuY2hlcjMgXAogICAgIE1hbmFnZWRQcm92aXNpb25pbmcgXAogICAgIE10cERvY3VtZW50c1Byb3ZpZGVyIFwKLSAgICBQaWNvVHRzIFwKICAgICBQYWNQcm9jZXNzb3IgXAogICAgIGxpYnBhYyBcCiAgICAgUHJpbnRTcG9vbGVyIFwKQEAgLTUzLDEwICs1MiwxMyBAQAogICAgIFByb3h5SGFuZGxlciBcCiAgICAgUXVpY2tTZWFyY2hCb3ggXAogICAgIFNldHRpbmdzIFwKKyAgICBTZXR0aW5nc0ludGVsbGlnZW5jZSBcCiAgICAgU2hhcmVkU3RvcmFnZUJhY2t1cCBcCisgICAgU2ltQXBwRGlhbG9nIFwKICAgICBTdG9yYWdlTWFuYWdlciBcCiAgICAgVGVsZWNvbSBcCiAgICAgVGVsZVNlcnZpY2UgXAorICAgIFRyYWNldXIgXAogICAgIFZwbkRpYWxvZ3MgXAogICAgIHZyIFwKICAgICBNbXNTZXJ2aWNlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9jb3JlXzY0X2JpdF9vbmx5Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvY29yZV82NF9iaXRfb25seS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQzMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvY29yZV82NF9iaXRfb25seS5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIEluaGVyaXQgZnJvbSB0aGlzIHByb2R1Y3QgZm9yIGRldmljZXMgdGhhdCBzdXBwb3J0IG9ubHkgNjQtYml0IGFwcHMgdXNpbmc6CisjICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY29yZV82NF9iaXRfb25seS5taykKKyMgVGhlIGluaGVyaXRhbmNlIGZvciB0aGlzIG11c3QgY29tZSBiZWZvcmUgdGhlIGluaGVyaXRhbmNlIGNoYWluIHRoYXQgbGVhZHMKKyMgdG8gY29yZV9taW5pbWFsLm1rLgorCisjIENvcHkgdGhlIDY0LWJpdCB6eWdvdGUgc3RhcnR1cCBzY3JpcHQKK1BST0RVQ1RfQ09QWV9GSUxFUyArPSBzeXN0ZW0vY29yZS9yb290ZGlyL2luaXQuenlnb3RlNjQucmM6cm9vdC9pbml0Lnp5Z290ZTY0LnJjCisKKyMgU2V0IHRoZSB6eWdvdGUgcHJvcGVydHkgdG8gc2VsZWN0IHRoZSA2NC1iaXQgc2NyaXB0LgorIyBUaGlzIGxpbmUgbXVzdCBiZSBwYXJzZWQgYmVmb3JlIHRoZSBvbmUgaW4gY29yZV9taW5pbWFsLm1rCitQUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTICs9IHJvLnp5Z290ZT16eWdvdGU2NAorCitUQVJHRVRfU1VQUE9SVFNfMzJfQklUX0FQUFMgOj0gZmFsc2UKK1RBUkdFVF9TVVBQT1JUU182NF9CSVRfQVBQUyA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9jb3JlX2Jhc2UubWsgYi90YXJnZXQvcHJvZHVjdC9jb3JlX2Jhc2UubWsKaW5kZXggMTUxZThkZS4uN2RjMDAxMCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvY29yZV9iYXNlLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2NvcmVfYmFzZS5tawpAQCAtNjIsOSArNjIsNCBAQAogICAgIG1kbnNkIFwKICAgICByZXF1ZXN0c3luYyBcCiAKLSMgV2lmaSBtb2R1bGVzCi1QUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICB3aWZpLXNlcnZpY2UgXAotICAgIHdpZmljb25kIFwKLQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jb3JlX21pbmltYWwubWspCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9jb3JlX21pbmltYWwubWsgYi90YXJnZXQvcHJvZHVjdC9jb3JlX21pbmltYWwubWsKaW5kZXggYWI2NWY1Yi4uMTg0OTgxOCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvY29yZV9taW5pbWFsLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2NvcmVfbWluaW1hbC5tawpAQCAtNjAsNyArNjAsNiBAQAogICAgIGlwdGFibGVzIFwKICAgICBnYXRla2VlcGVyZCBcCiAgICAga2V5c3RvcmUgXAotICAgIGtleXN0b3JlLmRlZmF1bHQgXAogICAgIGxkLmNvbmZpZy50eHQgXAogICAgIGxkLm1jIFwKICAgICBsaWJhYXVkaW8gXApAQCAtNzcsNyArNzYsNyBAQAogICAgIGxpYndlYnZpZXdjaHJvbWl1bV9wbGF0X3N1cHBvcnQgXAogICAgIGxpYndpbGhlbG0gXAogICAgIGxvZ2QgXAotICAgIG1ha2VfZXh0NGZzIFwKKyAgICBta2UyZnMgXAogICAgIGUyZnNjayBcCiAgICAgcmVzaXplMmZzIFwKICAgICB0dW5lMmZzIFwKQEAgLTg2LDYgKzg1LDcgQEAKICAgICB0ZWxlcGhvbnktY29tbW9uIFwKICAgICB1aWF1dG9tYXRvciBcCiAgICAgdW5jcnlwdCBcCisgICAgdm5ka19zbmFwc2hvdF9wYWNrYWdlIFwKICAgICB2b2lwLWNvbW1vbiBcCiAgICAgd2VidmlldyBcCiAgICAgd2Vidmlld196eWdvdGUgXApAQCAtMTEwLDE2ICsxMTAsMjYgQEAKICMgVGhlIG9yZGVyIG9mIFBST0RVQ1RfQk9PVF9KQVJTIG1hdHRlcnMuCiBQUk9EVUNUX0JPT1RfSkFSUyA6PSBcCiAgICAgJChUQVJHRVRfQ09SRV9KQVJTKSBcCi0gICAgbGVnYWN5LXRlc3QgXAogICAgIGV4dCBcCiAgICAgZnJhbWV3b3JrIFwKICAgICB0ZWxlcGhvbnktY29tbW9uIFwKICAgICB2b2lwLWNvbW1vbiBcCiAgICAgaW1zLWNvbW1vbiBcCi0gICAgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290IFwKICAgICBhbmRyb2lkLmhpZGwuYmFzZS1WMS4wLWphdmEgXAogICAgIGFuZHJvaWQuaGlkbC5tYW5hZ2VyLVYxLjAtamF2YQogCitpZmVxICgkKFJFTU9WRV9PQUhMX0ZST01fQkNQKSx0cnVlKQorUFJPRFVDVF9CT09UX0pBUlMgKz0gZnJhbWV3b3JrLW9haGwtYmFja3dhcmQtY29tcGF0aWJpbGl0eQorZWxzZQorUFJPRFVDVF9CT09UX0pBUlMgKz0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290CitlbmRpZgorCitpZmVxICgkKFJFTU9WRV9BVEJfRlJPTV9CQ1ApLHRydWUpCitQUk9EVUNUX0JPT1RfSkFSUyArPSBmcmFtZXdvcmstYXRiLWJhY2t3YXJkLWNvbXBhdGliaWxpdHkKK2Vsc2UKK1BST0RVQ1RfQk9PVF9KQVJTICs9IGFuZHJvaWQudGVzdC5iYXNlCitlbmRpZgorCiAjIFRoZSBvcmRlciBvZiBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfSkFSUyBtYXR0ZXJzLgogUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMgOj0gXAogICAgIHNlcnZpY2VzIFwKQEAgLTEzNSw3ICsxNDUsNyBAQAogIyBBZG9wdGFibGUgZXh0ZXJuYWwgc3RvcmFnZSBzdXBwb3J0cyBib3RoIGV4dDQgYW5kIGYyZnMKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGUyZnNjayBcCi0gICAgbWFrZV9leHQ0ZnMgXAorICAgIG1rZTJmcyBcCiAgICAgZnNjay5mMmZzIFwKICAgICBtYWtlX2YyZnMgXAogCkBAIC0xNTcsOSArMTY3LDEzIEBACiAKICMgT24gdXNlcmRlYnVnIGJ1aWxkcywgY29sbGVjdCBtb3JlIHRvbWJzdG9uZXMgYnkgZGVmYXVsdC4KIGlmbmVxICgsJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCi1QUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKK1BST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCiAgICAgdG9tYnN0b25lZC5tYXhfdG9tYnN0b25lX2NvdW50PTUwCiBlbmRpZgogCitQUk9EVUNUX0RFRkFVTFRfUFJPUEVSVFlfT1ZFUlJJREVTICs9IFwKKyAgICByby5sb2dkLnNpemUuc3RhdHM9NjRLIFwKKyAgICBsb2cudGFnLnN0YXRzX2xvZz1JCisKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvcnVudGltZV9saWJhcnQubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Jhc2UubWspCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9jb3JlX3RpbnkubWsgYi90YXJnZXQvcHJvZHVjdC9jb3JlX3RpbnkubWsKaW5kZXggZTQ3MzQxMy4uY2U0NTI4NCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvY29yZV90aW55Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2NvcmVfdGlueS5tawpAQCAtNTksNyArNTksNyBAQAogICAgIGlwdGFibGVzIFwKICAgICBnYXRla2VlcGVyZCBcCiAgICAga2V5c3RvcmUgXAotICAgIGtleXN0b3JlLmRlZmF1bHQgXAorICAgIGxkLmNvbmZpZy50eHQgXAogICAgIGxkLm1jIFwKICAgICBsaWJhYXVkaW8gXAogICAgIGxpYk9wZW5NQVhBTCBcCkBAIC03MSwxMSArNzEsMTAgQEAKICAgICBsaWJ3aWxoZWxtIFwKICAgICBsaWJkcm1mcmFtZXdvcmtfam5pIFwKICAgICBsaWJkcm1mcmFtZXdvcmsgXAotICAgIG1ha2VfZXh0NGZzIFwKKyAgICBta2UyZnMgXAogICAgIGUyZnNjayBcCiAgICAgcmVzaXplMmZzIFwKICAgICB0dW5lMmZzIFwKLSAgICBudWxsd2VidmlldyBcCiAgICAgc2NyZWVuY2FwIFwKICAgICBzZW5zb3JzZXJ2aWNlIFwKICAgICB1aWF1dG9tYXRvciBcCkBAIC05NiwxNyArOTUsMjYgQEAKICMgVGhlIG9yZGVyIG1hdHRlcnMKIFBST0RVQ1RfQk9PVF9KQVJTIDo9IFwKICAgICAkKFRBUkdFVF9DT1JFX0pBUlMpIFwKLSAgICBsZWdhY3ktdGVzdCBcCiAgICAgZXh0IFwKICAgICBmcmFtZXdvcmsgXAogICAgIHRlbGVwaG9ueS1jb21tb24gXAogICAgIHZvaXAtY29tbW9uIFwKICAgICBpbXMtY29tbW9uIFwKLSAgICBudWxsd2VidmlldyBcCi0gICAgb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290IFwKICAgICBhbmRyb2lkLmhpZGwuYmFzZS1WMS4wLWphdmEgXAogICAgIGFuZHJvaWQuaGlkbC5tYW5hZ2VyLVYxLjAtamF2YQogCitpZmVxICgkKFJFTU9WRV9PQUhMX0ZST01fQkNQKSx0cnVlKQorUFJPRFVDVF9CT09UX0pBUlMgKz0gZnJhbWV3b3JrLW9haGwtYmFja3dhcmQtY29tcGF0aWJpbGl0eQorZWxzZQorUFJPRFVDVF9CT09UX0pBUlMgKz0gb3JnLmFwYWNoZS5odHRwLmxlZ2FjeS5ib290CitlbmRpZgorCitpZmVxICgkKFJFTU9WRV9PQUhMX0ZST01fQkNQKSx0cnVlKQorUFJPRFVDVF9CT09UX0pBUlMgKz0gZnJhbWV3b3JrLWF0Yi1iYWNrd2FyZC1jb21wYXRpYmlsaXR5CitlbHNlCitQUk9EVUNUX0JPT1RfSkFSUyArPSBhbmRyb2lkLnRlc3QuYmFzZQorZW5kaWYKKwogIyBUaGUgb3JkZXIgb2YgUFJPRFVDVF9TWVNURU1fU0VSVkVSX0pBUlMgbWF0dGVycy4KIFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTIDo9IFwKICAgICBzZXJ2aWNlcyBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9lbWJlZGRlZC5tayBiL3RhcmdldC9wcm9kdWN0L2VtYmVkZGVkLm1rCmluZGV4IDdlZmE2ODYuLjNmMWQ2ZGYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2VtYmVkZGVkLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2VtYmVkZGVkLm1rCkBAIC0yMCwxMCArMjAsMTMgQEAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGFkYiBcCiAgICAgYWRiZCBcCisgICAgdXNiZCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jb25maWdzdG9yZUAxLjAtc2VydmljZSBcCiAgICAgYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAtc2VydmljZSBcCiAgICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbCBcCisgICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbC52ZW5kb3IgXAogICAgIGF0cmFjZSBcCisgICAgYmxhbmtfc2NyZWVuIFwKICAgICBib290YW5pbWF0aW9uIFwKICAgICBib290c3RhdCBcCiAgICAgY2hhcmdlciBcCkBAIC00OCw2ICs1MSw3IEBACiAgICAgbGliYmluZGVyIFwKICAgICBsaWJjIFwKICAgICBsaWJjX21hbGxvY19kZWJ1ZyBcCisgICAgbGliY19tYWxsb2NfaG9va3MgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGliZGwgXAogICAgIGxpYmd1aSBcCkBAIC04MSwyNSArODUsMTggQEAKICAgICB0emRhdGFjaGVjayBcCiAgICAgdm5kc2VydmljZSBcCiAgICAgdm5kc2VydmljZW1hbmFnZXIgXAotICAgIGNvbXBhdGliaWxpdHlfbWF0cml4LnhtbCBcCi0gICAgbWFuaWZlc3QueG1sIFwKLSAgICBzeXN0ZW1fbWFuaWZlc3QueG1sIFwKLSAgICBzeXN0ZW1fY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIFwKIAotIyBTRUxpbnV4IHBhY2thZ2VzCisjIFZJTlRGIGRhdGEKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIG5vbnBsYXRfbWFjX3Blcm1pc3Npb25zLnhtbCBcCi0gICAgbm9ucGxhdF9wcm9wZXJ0eV9jb250ZXh0cyBcCi0gICAgbm9ucGxhdF9zZWFwcF9jb250ZXh0cyBcCi0gICAgbm9ucGxhdF9zZXJ2aWNlX2NvbnRleHRzIFwKLSAgICBub25wbGF0X2h3c2VydmljZV9jb250ZXh0cyBcCi0gICAgcGxhdF9tYWNfcGVybWlzc2lvbnMueG1sIFwKLSAgICBwbGF0X3Byb3BlcnR5X2NvbnRleHRzIFwKLSAgICBwbGF0X3NlYXBwX2NvbnRleHRzIFwKLSAgICBwbGF0X3NlcnZpY2VfY29udGV4dHMgXAotICAgIHBsYXRfaHdzZXJ2aWNlX2NvbnRleHRzIFwKKyAgICBkZXZpY2VfY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIFwKKyAgICBkZXZpY2VfbWFuaWZlc3QueG1sIFwKKyAgICBmcmFtZXdvcmtfbWFuaWZlc3QueG1sIFwKKyAgICBmcmFtZXdvcmtfY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIFwKKworIyBTRUxpbnV4IHBhY2thZ2VzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbmNpZXMgb2YgdGhlIHNlbGludXhfcG9saWN5CisjIHBob255IHBhY2thZ2UuCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKICAgICBzZWxpbnV4X3BvbGljeSBcCi0gICAgdm5kc2VydmljZV9jb250ZXh0cwogCiAjIEFJRCBHZW5lcmF0aW9uIGZvcgogIyA8cHdkLmg+IGFuZCA8Z3JwLmg+CkBAIC0xMDksOSArMTA2LDE0IEBACiAgICAgZnNfY29uZmlnX2ZpbGVzIFwKICAgICBmc19jb25maWdfZGlycwogCisjIElmIHRoZXJlIGFyZSBwcm9kdWN0LXNwZWNpZmljIGFkYiBrZXlzIGRlZmluZWQsIGluc3RhbGwgdGhlbSBvbiBkZWJ1Z2dhYmxlCisjIGJ1aWxkcy4KK1BST0RVQ1RfUEFDS0FHRVNfREVCVUcgKz0gXAorICAgIGFkYl9rZXlzCisKICMgRW5zdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyBhbHdheXMgZGVmaW5lZCBzbyB0aGF0IGJpb25pY19zeXN0cmFjZS5jcHAKICMgY2FuIHJlbHkgb24gaXQgYmVpbmcgaW5pdGlhbGx5IHNldCBieSBpbml0LgotUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCitQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMgKz0gXAogICAgIGRlYnVnLmF0cmFjZS50YWdzLmVuYWJsZWZsYWdzPTAKIAogUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2VtdWxhdG9yLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZW11bGF0b3IubWsKaW5kZXggMGUxZTU4MS4uNjdlYmUwNCAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZW11bGF0b3IubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZW11bGF0b3IubWsKQEAgLTI2LDYgKzI2LDcgQEAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGVnbC5jZmcgXAogICAgIGdyYWxsb2MuZ29sZGZpc2ggXAorICAgIGdyYWxsb2MuZ29sZGZpc2guZGVmYXVsdCBcCiAgICAgZ3JhbGxvYy5yYW5jaHUgXAogICAgIGxpYkdMRVN2MV9DTV9lbXVsYXRpb24gXAogICAgIGxpYl9yZW5kZXJDb250cm9sX2VuYyBcCkBAIC0zNSw2ICszNiw5IEBACiAgICAgbGliT3BlbmdsU3lzdGVtQ29tbW9uIFwKICAgICBsaWJHTEVTdjJfZW11bGF0aW9uIFwKICAgICBsaWJHTEVTdjFfZW5jIFwKKyAgICBsaWJFR0xfc3dpZnRzaGFkZXIgXAorICAgIGxpYkdMRVN2MV9DTV9zd2lmdHNoYWRlciBcCisgICAgbGliR0xFU3YyX3N3aWZ0c2hhZGVyIFwKICAgICBxZW11LXByb3BzIFwKICAgICBjYW1lcmEuZ29sZGZpc2ggXAogICAgIGNhbWVyYS5nb2xkZmlzaC5qcGVnIFwKQEAgLTgwLDYgKzg0LDkgQEAKICAgICBhbmRyb2lkLmhhcmR3YXJlLmtleW1hc3RlckAzLjAtc2VydmljZQogCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmtleW1hc3RlckA0LjAtc3Ryb25nYm94LXNlcnZpY2UKKworUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5nbnNzQDEuMC1zZXJ2aWNlIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmduc3NAMS4wLWltcGwKIApAQCAtMTA3LDQ3ICsxMTQsMzAgQEAKICMgbmVlZCB0aGlzIGZvciBnbGVzIGxpYnJhcmllcyB0byBsb2FkIHByb3Blcmx5CiAjIGFmdGVyIG1vdmluZyB0byAvdmVuZG9yL2xpYi8KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIGFuZHJvaWQuaGFyZHdhcmUucmVuZGVyc2NyaXB0QDEuMC52bmRrLXNwXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMC52bmRrLXNwXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMC52bmRrLXNwXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMC52bmRrLXNwXAotICAgIGxpYmh3YmluZGVyLnZuZGstc3BcCi0gICAgbGliYmFzZS52bmRrLXNwXAotICAgIGxpYmN1dGlscy52bmRrLXNwXAotICAgIGxpYmhhcmR3YXJlLnZuZGstc3BcCi0gICAgbGliaGlkbGJhc2Uudm5kay1zcFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0LnZuZGstc3BcCi0gICAgbGlidXRpbHMudm5kay1zcFwKLSAgICBsaWJjKysudm5kay1zcFwKLSAgICBsaWJSU19pbnRlcm5hbC52bmRrLXNwXAotICAgIGxpYlJTRHJpdmVyLnZuZGstc3BcCi0gICAgbGliUlNDcHVSZWYudm5kay1zcFwKLSAgICBsaWJiY2luZm8udm5kay1zcFwKLSAgICBsaWJibGFzLnZuZGstc3BcCi0gICAgbGliZnQyLnZuZGstc3BcCi0gICAgbGlicG5nLnZuZGstc3BcCi0gICAgbGliY29tcGlsZXJfcnQudm5kay1zcFwKLSAgICBsaWJiYWNrdHJhY2Uudm5kay1zcFwKLSAgICBsaWJ1bndpbmQudm5kay1zcFwKLSAgICBsaWJsem1hLnZuZGstc3BcCi0gICAgbGliei52bmRrLXNwXAotCisgICAgdm5kay1zcAogCiBQUk9EVUNUX0NPUFlfRklMRVMgKz0gXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2luaXQucmFuY2h1LWNvcmUuc2g6dmVuZG9yL2Jpbi9pbml0LnJhbmNodS1jb3JlLnNoIFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9pbml0LnJhbmNodS1uZXQuc2g6dmVuZG9yL2Jpbi9pbml0LnJhbmNodS1uZXQuc2ggXAorICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2luaXQucmFuY2h1LWNvcmUuc2g6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9iaW4vaW5pdC5yYW5jaHUtY29yZS5zaCBcCisgICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvaW5pdC5yYW5jaHUtbmV0LnNoOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvYmluL2luaXQucmFuY2h1LW5ldC5zaCBcCiAgICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvaW5pdC5yYW5jaHUucmM6cm9vdC9pbml0LnJhbmNodS5yYyBcCiAgICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZnN0YWIucmFuY2h1OnJvb3QvZnN0YWIucmFuY2h1IFwKICAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9mc3RhYi5yYW5jaHUuZWFybHk6cm9vdC9mc3RhYi5yYW5jaHUuZWFybHkgXAogICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL3VldmVudGQucmFuY2h1LnJjOnJvb3QvdWV2ZW50ZC5yYW5jaHUucmMgXAotICAgIGRldmljZS9nZW5lcmljL2dvbGRmaXNoL2lucHV0L2dvbGRmaXNoX3JvdGFyeS5pZGM6c3lzdGVtL3Vzci9pZGMvZ29sZGZpc2hfcm90YXJ5LmlkYyBcCisgICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvaW5wdXQvZ29sZGZpc2hfcm90YXJ5LmlkYzokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL3Vzci9pZGMvZ29sZGZpc2hfcm90YXJ5LmlkYyBcCiAgICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvbWFuaWZlc3QueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvbWFuaWZlc3QueG1sIFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9kYXRhL2V0Yy9wZXJtaXNzaW9ucy9wcml2YXBwLXBlcm1pc3Npb25zLWdvbGRmaXNoLnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL3ByaXZhcHAtcGVybWlzc2lvbnMtZ29sZGZpc2gueG1sIFwKKyAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9kYXRhL2V0Yy9wZXJtaXNzaW9ucy9wcml2YXBwLXBlcm1pc3Npb25zLWdvbGRmaXNoLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9wZXJtaXNzaW9ucy9wcml2YXBwLXBlcm1pc3Npb25zLWdvbGRmaXNoLnhtbCBcCiAgICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZGF0YS9ldGMvY29uZmlnLmluaTpjb25maWcuaW5pIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLnVzYi5hY2Nlc3NvcnkueG1sOnN5c3RlbS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5oYXJkd2FyZS51c2IuYWNjZXNzb3J5LnhtbAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUud2lmaS54bWw6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5oYXJkd2FyZS53aWZpLnhtbAogCiBQUk9EVUNUX1BBQ0tBR0VfT1ZFUkxBWVMgOj0gZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvb3ZlcmxheQogCiBQUk9EVUNUX0NIQVJBQ1RFUklTVElDUyA6PSBlbXVsYXRvcgogCiBQUk9EVUNUX0ZVTExfVFJFQkxFX09WRVJSSURFIDo9IHRydWUKKworI3dhdGNoZG9nIHRpZ2dlcnMgcmVib290IGJlY2F1c2UgbG9jYXRpb24gc2VydmljZSBpcyBub3QKKyNyZXNwb25kaW5nLCBkaXNibGUgaXQgZm9yIG5vdy4KKyNzdGlsbCBrZWVwIGl0IG9uIGludGVybmFsIG1hc3RlciBhcyBpdCBpcyBzdGlsbCB3b3JraW5nCisjb25jZSBpdCBpcyBmaXhlZCBpbiBhb3NwLCByZW1vdmUgdGhpcyBibG9jayBvZiBjb21tZW50LgorI1BST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorI2NvbmZpZy5kaXNhYmxlX2xvY2F0aW9uPXRydWUKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Z1bGxfYmFzZS5tayBiL3RhcmdldC9wcm9kdWN0L2Z1bGxfYmFzZS5tawppbmRleCA2NWJkZjBmLi41ZGMzYzNmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9mdWxsX2Jhc2UubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbF9iYXNlLm1rCkBAIC00OCwxMSArNDgsMTEgQEAKICMgR2V0IHNvbWUgc291bmRzCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvc291bmRzL0FsbEF1ZGlvLm1rKQogCi0jIEdldCB0aGUgVFRTIGxhbmd1YWdlIHBhY2tzCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgZXh0ZXJuYWwvc3ZveC9waWNvL2xhbmcvYWxsX3BpY29fbGFuZ3VhZ2VzLm1rKQotCiAjIEdldCBhIGxpc3Qgb2YgbGFuZ3VhZ2VzLgotJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9sb2NhbGVzX2Z1bGwubWspCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2xhbmd1YWdlc19mdWxsLm1rKQogCiAjIEdldCBldmVyeXRoaW5nIGVsc2UgZnJvbSB0aGUgcGFyZW50IHBhY2thZ2UKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZ2VuZXJpY19ub190ZWxlcGhvbnkubWspCisKKyMgQWRkIGFkYiBrZXlzIHRvIGRlYnVnZ2FibGUgQU9TUCBidWlsZHMgKGlmIHRoZXkgZXhpc3QpCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LWlmLWV4aXN0cywgdmVuZG9yL2dvb2dsZS9zZWN1cml0eS9hZGIvdmVuZG9yX2tleS5taykKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Z1bGxfYmFzZV90ZWxlcGhvbnkubWsgYi90YXJnZXQvcHJvZHVjdC9mdWxsX2Jhc2VfdGVsZXBob255Lm1rCmluZGV4IDlhMmM2M2EuLmFmNDA5N2QgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Z1bGxfYmFzZV90ZWxlcGhvbnkubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbF9iYXNlX3RlbGVwaG9ueS5tawpAQCAtMjQsOCArMjQsOCBAQAogICAgIHJvLmNvbS5hbmRyb2lkLmRhdGFyb2FtaW5nPXRydWUKIAogUFJPRFVDVF9DT1BZX0ZJTEVTIDo9IFwKLSAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9kYXRhL2V0Yy9hcG5zLWNvbmYueG1sOnN5c3RlbS9ldGMvYXBucy1jb25mLnhtbCBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWw6c3lzdGVtL2V0Yy9wZXJtaXNzaW9ucy9oYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbAorICAgIGRldmljZS9zYW1wbGUvZXRjL2FwbnMtZnVsbC1jb25mLnhtbDpzeXN0ZW0vZXRjL2FwbnMtY29uZi54bWwgXAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2RhdGEvZXRjL2hhbmRoZWxkX2NvcmVfaGFyZHdhcmUueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL3Blcm1pc3Npb25zL2hhbmRoZWxkX2NvcmVfaGFyZHdhcmUueG1sCiAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW9zcF9iYXNlLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC90ZWxlcGhvbnkubWspCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX2FybXY1Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpY19hcm12NS5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhMzIxYS4uMDAwMDAwMAotLS0gYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX2FybXY1Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUaGlzIGlzIGEgZ2VuZXJpYyBwcm9kdWN0IHRoYXQgaXNuJ3Qgc3BlY2lhbGl6ZWQgZm9yIGEgc3BlY2lmaWMgZGV2aWNlLgotIyBJdCBpbmNsdWRlcyB0aGUgYmFzZSBBbmRyb2lkIHBsYXRmb3JtLgotCi0kKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2dlbmVyaWMubWspCi0KLSMgT3ZlcnJpZGVzCi1QUk9EVUNUX0JSQU5EIDo9IGdlbmVyaWNfYXJtdjUKLVBST0RVQ1RfREVWSUNFIDo9IGdlbmVyaWNfYXJtdjUKLVBST0RVQ1RfTkFNRSA6PSBnZW5lcmljX2FybXY1CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX25vX3RlbGVwaG9ueS5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfbm9fdGVsZXBob255Lm1rCmluZGV4IDE5MGE4ODkuLjkwZTU1YjcgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfbm9fdGVsZXBob255Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfbm9fdGVsZXBob255Lm1rCkBAIC0yOSw2ICsyOSw5IEBACiAgICAgUHJvdmlzaW9uIFwKICAgICBTeXN0ZW1VSSBcCiAgICAgU3lzdWlEYXJrVGhlbWVPdmVybGF5IFwKKyAgICBEaXNwbGF5Q3V0b3V0RW11bGF0aW9uRG91YmxlT3ZlcmxheSBcCisgICAgRGlzcGxheUN1dG91dEVtdWxhdGlvbk5hcnJvd092ZXJsYXkgXAorICAgIERpc3BsYXlDdXRvdXRFbXVsYXRpb25UYWxsT3ZlcmxheSBcCiAgICAgRWFzdGVyRWdnIFwKICAgICBXYWxscGFwZXJDcm9wcGVyCiAKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tayBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tawppbmRleCBjYTU4YzFkLi5hZDVmZTk0IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rCkBAIC0yMCw3ICsyMCw5IEBACiBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCiAgICAgIHJvLmNvbmZpZy5sb3dfcmFtPXRydWUgXAogICAgICByby5sbWsuY3JpdGljYWxfdXBncmFkZT10cnVlIFwKLSAgICAgcm8ubG1rLnVwZ3JhZGVfcHJlc3N1cmU9NDAKKyAgICAgcm8ubG1rLnVwZ3JhZGVfcHJlc3N1cmU9NDAgXAorICAgICByby5sbWsuZG93bmdyYWRlX3ByZXNzdXJlPTYwIFwKKyAgICAgcm8ubG1rLmtpbGxfaGVhdmllc3RfdGFzaz1mYWxzZQogCiAjIHNldCB0aHJlc2hvbGQgdG8gZmlsdGVyIHVudXNlZCBhcHBzCiBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9sYW5ndWFnZXNfZnVsbC5tayBiL3RhcmdldC9wcm9kdWN0L2xhbmd1YWdlc19mdWxsLm1rCmluZGV4IDg0NmNkNzAuLjVmMzc5NWYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2xhbmd1YWdlc19mdWxsLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2xhbmd1YWdlc19mdWxsLm1rCkBAIC0yMyw2ICsyMyw3IEBACiAgICAgICAgIGFtX0VUIFwKICAgICAgICAgYXJfRUcgXAogICAgICAgICBhcl9YQiBcCisgICAgICAgIGFzX0lOIFwKICAgICAgICAgYXpfQVogXAogICAgICAgICBiZV9CWSBcCiAgICAgICAgIGJnX0JHIFwKQEAgLTc2LDYgKzc3LDcgQEAKICAgICAgICAgbmJfTk8gXAogICAgICAgICBuZV9OUCBcCiAgICAgICAgIG5sX05MIFwKKyAgICAgICAgb3JfSU4gXAogICAgICAgICBwYV9JTiBcCiAgICAgICAgIHBsX1BMIFwKICAgICAgICAgcHRfQlIgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbG9jYWxlc19mdWxsLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvbG9jYWxlc19mdWxsLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTkwZDJiLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L2xvY2FsZXNfZnVsbC5taworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotUFJPRFVDVF9MT0NBTEVTIDo9IGVuX1VTIGNzX0NaIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGRlX0xJIGVsX0dSIGVuX0FVIGVuX0NBIGVuX0dCIGVuX05aIGVuX1NHIGVvX0VVIGVzX0VTIGZyX0NBIGZyX0NIIGZyX0JFIGZyX0ZSIGl0X0NIIGl0X0lUIGphX0pQIGtvX0tSIG5iX05PIG5sX0JFIG5sX05MIHBsX1BMIHB0X1BUIHJ1X1JVIHN2X1NFIHRyX1RSIHpoX0NOIHpoX0hLIHpoX1RXIGFtX0VUIGhpX0lOCi0KLSQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGJ1aWxkL3RhcmdldC9wcm9kdWN0L2xhbmd1YWdlc19mdWxsLm1rKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvcnVudGltZV9saWJhcnQubWsgYi90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5tawppbmRleCA4YWVkZWU3Li42ZDdhYzRhIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5taworKysgYi90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5tawpAQCAtMjcsNyArMjcsNyBAQAogCiAjIEFkZGl0aW9uYWwgbWl4aW5zIHRvIHRoZSBib290IGNsYXNzcGF0aC4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgIGxlZ2FjeS10ZXN0IFwKKyAgICBhbmRyb2lkLnRlc3QuYmFzZSBcCiAKICMgV2h5IGFyZSB3ZSBwdWxsaW5nIGluIGV4dCwgd2hpY2ggaXMgZnJhbWV3b3Jrcy9iYXNlLCBkZXBlbmRpbmcgb24gdGFnc291cCBhbmQgbmlzdC1zaXA/CiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKQEAgLTU2LDMyICs1Niw0MSBAQAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgY2FjZXJ0cyBcCiAKLVBST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgaGlkZGVuYXBpLXBhY2thZ2Utd2hpdGVsaXN0LnhtbCBcCisKK1BST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCiAgICAgZGFsdmlrLnZtLmltYWdlLWRleDJvYXQtWG1zPTY0bSBcCiAgICAgZGFsdmlrLnZtLmltYWdlLWRleDJvYXQtWG14PTY0bSBcCiAgICAgZGFsdmlrLnZtLmRleDJvYXQtWG1zPTY0bSBcCiAgICAgZGFsdmlrLnZtLmRleDJvYXQtWG14PTUxMm0gXAotICAgIHJvLmRhbHZpay52bS5uYXRpdmUuYnJpZGdlPTAgXAogICAgIGRhbHZpay52bS51c2VqaXQ9dHJ1ZSBcCiAgICAgZGFsdmlrLnZtLnVzZWppdHByb2ZpbGVzPXRydWUgXAogICAgIGRhbHZpay52bS5kZXhvcHQuc2Vjb25kYXJ5PXRydWUgXAogICAgIGRhbHZpay52bS5hcHBpbWFnZWZvcm1hdD1sejQKIAorUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorICAgIHJvLmRhbHZpay52bS5uYXRpdmUuYnJpZGdlPTAKKwogIyBEaWZmZXJlbnQgZGV4b3B0IHR5cGVzIGZvciBkaWZmZXJlbnQgcGFja2FnZSB1cGRhdGUvaW5zdGFsbCB0aW1lcy4KICMgT24gZW5nIGJ1aWxkcywgbWFrZSAiYm9vdCIgcmVhc29ucyBvbmx5IGV4dHJhY3QgZm9yIGZhc3RlciB0dXJuYXJvdW5kLgogaWZlcSAoZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKQotICAgIFBST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAorICAgIFBST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCiAgICAgICAgIHBtLmRleG9wdC5maXJzdC1ib290PWV4dHJhY3QgXAogICAgICAgICBwbS5kZXhvcHQuYm9vdD1leHRyYWN0CiBlbHNlCi0gICAgUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCisgICAgUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTICs9IFwKICAgICAgICAgcG0uZGV4b3B0LmZpcnN0LWJvb3Q9cXVpY2tlbiBcCiAgICAgICAgIHBtLmRleG9wdC5ib290PXZlcmlmeQogZW5kaWYKIAotUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUyArPSBcCitQUk9EVUNUX1NZU1RFTV9ERUZBVUxUX1BST1BFUlRJRVMgKz0gXAogICAgIHBtLmRleG9wdC5pbnN0YWxsPXF1aWNrZW4gXAogICAgIHBtLmRleG9wdC5iZy1kZXhvcHQ9c3BlZWQtcHJvZmlsZSBcCiAgICAgcG0uZGV4b3B0LmFiLW90YT1zcGVlZC1wcm9maWxlIFwKICAgICBwbS5kZXhvcHQuaW5hY3RpdmU9dmVyaWZ5IFwKICAgICBwbS5kZXhvcHQuc2hhcmVkPXNwZWVkCisKKyMgRW5hYmxlIG1pbmlkZWJ1Z2luZm8gZ2VuZXJhdGlvbiB1bmxlc3Mgb3ZlcnJpZGRlbi4KK1BST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCisgICAgZGFsdmlrLnZtLmRleDJvYXQtbWluaWRlYnVnaW5mbz10cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfYmFzZS5tayBiL3RhcmdldC9wcm9kdWN0L3Nka19iYXNlLm1rCmluZGV4IDZkNGQ1OWYuLmRmNjhkMDIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka19iYXNlLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Nka19iYXNlLm1rCkBAIC0xNyw3ICsxNyw2IEBACiBQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUyA6PQogCiBQUk9EVUNUX1BBQ0tBR0VTIDo9IFwKLQlBcGlEZW1vcyBcCiAJQ2VsbEJyb2FkY2FzdFJlY2VpdmVyIFwKIAlDdWJlTGl2ZVdhbGxwYXBlcnMgXAogCUN1c3RvbUxvY2FsZSBcCkBAIC0yNSw3ICsyNCw2IEBACiAJRGlhbGVyIFwKIAlFbXVsYXRvclNtb2tlVGVzdHMgXAogCUdhbGxlcnkyIFwKLQlHZXN0dXJlQnVpbGRlciBcCiAJTGF1bmNoZXIzIFwKIAlDYW1lcmEyIFwKIAlsaWJyc19qbmkgXApAQCAtNDAsOCArMzgsNiBAQAogCXJpbGQgXAogCXNjcmVlbnJlY29yZCBcCiAJU2RrU2V0dXAgXAotCVNtb2tlVGVzdCBcCi0JU21va2VUZXN0QXBwIFwKIAlTb2Z0S2V5Ym9hcmQgXAogCXNxbGl0ZTMgXAogCVN5c3RlbVVJIFwKQEAgLTkxLDE5ICs4NywxOSBAQAogCWZyYW1ld29ya3MvYmFzZS9kYXRhL3NvdW5kcy9lZmZlY3RzL2NhbWVyYV9jbGljay5vZ2c6c3lzdGVtL21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2cgXAogCWZyYW1ld29ya3MvYmFzZS9kYXRhL3NvdW5kcy9lZmZlY3RzL1ZpZGVvUmVjb3JkLm9nZzpzeXN0ZW0vbWVkaWEvYXVkaW8vdWkvVmlkZW9SZWNvcmQub2dnIFwKIAlmcmFtZXdvcmtzL2Jhc2UvZGF0YS9zb3VuZHMvZWZmZWN0cy9WaWRlb1N0b3Aub2dnOnN5c3RlbS9tZWRpYS9hdWRpby91aS9WaWRlb1N0b3Aub2dnIFwKLQlkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9kYXRhL2V0Yy9oYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL2hhbmRoZWxkX2NvcmVfaGFyZHdhcmUueG1sIFwKLQlkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jYW1lcmEvbWVkaWFfcHJvZmlsZXMueG1sOnN5c3RlbS9ldGMvbWVkaWFfcHJvZmlsZXMueG1sIFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWw6c3lzdGVtL2V0Yy9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbCBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbDpzeXN0ZW0vZXRjL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbCBcCi0JZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY2FtZXJhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwgXAotCWRldmljZS9nZW5lcmljL2dvbGRmaXNoL2NhbWVyYS9tZWRpYV9jb2RlY3MueG1sOnN5c3RlbS9ldGMvbWVkaWFfY29kZWNzLnhtbCBcCi0JZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY2FtZXJhL21lZGlhX2NvZGVjc19wZXJmb3JtYW5jZS54bWw6c3lzdGVtL2V0Yy9tZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sIFwKLQlmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuLm11bHRpdG91Y2guamF6emhhbmQueG1sOnN5c3RlbS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbi5tdWx0aXRvdWNoLmphenpoYW5kLnhtbCBcCi0JZnJhbWV3b3Jrcy9uYXRpdmUvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEueG1sOnN5c3RlbS9ldGMvcGVybWlzc2lvbnMvYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEueG1sIFwKLQlmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLmZpbmdlcnByaW50LnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUuZmluZ2VycHJpbnQueG1sIFwKLQlmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLnNvZnR3YXJlLmF1dG9maWxsLnhtbDpzeXN0ZW0vZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuc29mdHdhcmUuYXV0b2ZpbGwueG1sIFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLmNvbmY6c3lzdGVtL2V0Yy9hdWRpb19lZmZlY3RzLmNvbmYgXAotCWRldmljZS9nZW5lcmljL2dvbGRmaXNoL2F1ZGlvX3BvbGljeS5jb25mOnN5c3RlbS9ldGMvYXVkaW9fcG9saWN5LmNvbmYKKwlkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9kYXRhL2V0Yy9oYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9wZXJtaXNzaW9ucy9oYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbCBcCisJZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY2FtZXJhL21lZGlhX3Byb2ZpbGVzLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9tZWRpYV9wcm9maWxlc19WMV8wLnhtbCBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sIFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV90ZWxlcGhvbnkueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL21lZGlhX2NvZGVjc19nb29nbGVfdGVsZXBob255LnhtbCBcCisJZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvY2FtZXJhL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL21lZGlhX2NvZGVjc19nb29nbGVfdmlkZW8ueG1sIFwKKwlkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jYW1lcmEvbWVkaWFfY29kZWNzLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9tZWRpYV9jb2RlY3MueG1sIFwKKwlkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9jYW1lcmEvbWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9tZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuLm11bHRpdG91Y2guamF6emhhbmQueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4ubXVsdGl0b3VjaC5qYXp6aGFuZC54bWwgXAorCWZyYW1ld29ya3MvbmF0aXZlL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS54bWwgXAorCWZyYW1ld29ya3MvbmF0aXZlL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuZmluZ2VycHJpbnQueG1sOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL3Blcm1pc3Npb25zL2FuZHJvaWQuaGFyZHdhcmUuZmluZ2VycHJpbnQueG1sIFwKKwlmcmFtZXdvcmtzL25hdGl2ZS9kYXRhL2V0Yy9hbmRyb2lkLnNvZnR3YXJlLmF1dG9maWxsLnhtbDokKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpL2V0Yy9wZXJtaXNzaW9ucy9hbmRyb2lkLnNvZnR3YXJlLmF1dG9maWxsLnhtbCBcCisJZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy5jb25mOiQoVEFSR0VUX0NPUFlfT1VUX1ZFTkRPUikvZXRjL2F1ZGlvX2VmZmVjdHMuY29uZiBcCisJZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvYXVkaW9fcG9saWN5LmNvbmY6JChUQVJHRVRfQ09QWV9PVVRfVkVORE9SKS9ldGMvYXVkaW9fcG9saWN5LmNvbmYKIAogaW5jbHVkZSAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2VtdWxhdG9yLm1rCiAKQEAgLTExOSwxNCArMTE1LDYgQEAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QtaWYtZXhpc3RzLCBmcmFtZXdvcmtzL3dlYnZpZXcvY2hyb21pdW0vY2hyb21pdW0ubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2NvcmUubWspCiAKLSMgaW5jbHVkZSBhdmFpbGFibGUgbGFuZ3VhZ2VzIGZvciBUVFMgaW4gdGhlIHN5c3RlbSBpbWFnZQotLWluY2x1ZGUgZXh0ZXJuYWwvc3ZveC9waWNvL2xhbmcvUGljb0xhbmdEZURlSW5TeXN0ZW0ubWsKLS1pbmNsdWRlIGV4dGVybmFsL3N2b3gvcGljby9sYW5nL1BpY29MYW5nRW5HQkluU3lzdGVtLm1rCi0taW5jbHVkZSBleHRlcm5hbC9zdm94L3BpY28vbGFuZy9QaWNvTGFuZ0VuVXNJblN5c3RlbS5tawotLWluY2x1ZGUgZXh0ZXJuYWwvc3ZveC9waWNvL2xhbmcvUGljb0xhbmdFc0VzSW5TeXN0ZW0ubWsKLS1pbmNsdWRlIGV4dGVybmFsL3N2b3gvcGljby9sYW5nL1BpY29MYW5nRnJGckluU3lzdGVtLm1rCi0taW5jbHVkZSBleHRlcm5hbC9zdm94L3BpY28vbGFuZy9QaWNvTGFuZ0l0SXRJblN5c3RlbS5tawotCiAjIGxvY2FsZS4gZW5fVVMgaXMgYm90aCBmaXJzdCBhbmQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIHRvCiAjIGVuc3VyZSB0aGlzIGlzIHRoZSBkZWZhdWx0IGxvY2FsZS4KIFBST0RVQ1RfTE9DQUxFUyA6PSBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2Lm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX3g4Ni5tawppbmRleCAxZTgyNzczLi4zMmQ3MWViIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODYubWsKQEAgLTI0LDcgKzI0LDcgQEAKIFBST0RVQ1RfQ09QWV9GSUxFUyArPSBcCiAgICAgZGV2ZWxvcG1lbnQvc3lzLWltZy9hZHZhbmNlZEZlYXR1cmVzLmluaTphZHZhbmNlZEZlYXR1cmVzLmluaSBcCiAgICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZGF0YS9ldGMvZW5jcnlwdGlvbmtleS5pbWc6ZW5jcnlwdGlvbmtleS5pbWcgXAotICAgIHByZWJ1aWx0cy9xZW11LWtlcm5lbC94ODYvMy4xOC9rZXJuZWwtcWVtdTI6a2VybmVsLXJhbmNodQorICAgIHByZWJ1aWx0cy9xZW11LWtlcm5lbC94ODZfNjQvNC40L2tlcm5lbC1xZW11MjprZXJuZWwtcmFuY2h1LTY0CiAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX2Jhc2UubWspCiAKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9zZGtfcGhvbmVfeDg2XzY0Lm1rCmluZGV4IGExOGM0ZjguLmU0MGViYjUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Nka19waG9uZV94ODZfNjQubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2RrX3Bob25lX3g4Nl82NC5tawpAQCAtMjUsNyArMjUsNyBAQAogUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKICAgICBkZXZlbG9wbWVudC9zeXMtaW1nL2FkdmFuY2VkRmVhdHVyZXMuaW5pOmFkdmFuY2VkRmVhdHVyZXMuaW5pIFwKICAgICBkZXZpY2UvZ2VuZXJpYy9nb2xkZmlzaC9kYXRhL2V0Yy9lbmNyeXB0aW9ua2V5LmltZzplbmNyeXB0aW9ua2V5LmltZyBcCi0gICAgcHJlYnVpbHRzL3FlbXUta2VybmVsL3g4Nl82NC8zLjE4L2tlcm5lbC1xZW11MjprZXJuZWwtcmFuY2h1CisgICAgcHJlYnVpbHRzL3FlbXUta2VybmVsL3g4Nl82NC80LjQva2VybmVsLXFlbXUyOmtlcm5lbC1yYW5jaHUKIAogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9jb3JlXzY0X2JpdC5taykKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3Qvc2RrX2Jhc2UubWspCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5tawppbmRleCA1YTQwMzk3Li40MTQyZWE5IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsKQEAgLTEwLDMgKzEwLDE2IEBACiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9ST09UX09VVCkKIAogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgYWRiIGtleSwgaWYgY29uZmlndXJlZCB2aWEgUFJPRFVDVF9BREJfS0VZUworaWZkZWYgUFJPRFVDVF9BREJfS0VZUworICBpZm5lcSAoJChmaWx0ZXIgZW5nIHVzZXJkZWJ1ZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSksKQorICAgIGluY2x1ZGUgJChDTEVBUl9WQVJTKQorICAgIExPQ0FMX01PRFVMRSA6PSBhZGJfa2V5cworICAgIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKKyAgICBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9ST09UX09VVCkKKyAgICBMT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSA6PSAkKFBST0RVQ1RfQURCX0tFWVMpCisgICAgaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorICBlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L1JFQURNRSBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L1JFQURNRQppbmRleCAxNWYyZTkzLi42YTZlNjJkIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9SRUFETUUKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvUkVBRE1FCkBAIC0zNCw1ICszNCw1IEBACiAgICAgJCBqYXZhIC1qYXIgb3V0L2hvc3QvbGludXgteDg2L2ZyYW1ld29yay9kdW1wa2V5LmphciBidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5Lng1MDkucGVtCiAgICAgezY0LDB4YzkyNmFkMjEsezE3OTUwOTA3MTksMjE0MTM5NjMxNSw5NTAwNTU0NDcsMjU4MTU2ODQzMCw0MjY4OTIzMTY1LDE5MjA4MDk5ODgsNTQ2NTg2NTIxLDM0OTg5OTc3OTgsMTc3Njc5Nzg1OCwzNzQwMDYwODE0LDE4MDUzMTc5OTksMTQyOTQxMDI0NCwxMjk2MjI1OTksMTQyMjQ0MTQxOCwxNzgzODkzMzc3LDEyMjIzNzQ3NTksMjU2MzMxOTkyNywzMjM5OTM1NjYsMjg1MTc3MzIsNjA5NzUzNDE2LDE4MjY0NzI4ODgsMjE1MjM3ODUwLDQyNjE2NDI3MDAsNDA0OTA4MjU5MSwzMjI4NDYyNDAyLDc3NDg1Nzc0NiwxNTQ4MjI0NTUsMjQ5NzE5ODg5NywyNzU4MTk5NDE4LDMwMTkwMTUzMjgsMjc5NDc3NzY0NCw4NzI1MTQzMCwyNTM0OTI3OTc4LDEyMDc3NDc4NCw1NzEyOTc4MDAsMzY5NTg5OTQ3MiwyNDc5OTI1MTg3LDM4MTE2MjU0NTAsMzQwMTgzMjk5MCwyMzk0ODY5NjQ3LDMyNjcyNDYyMDcsOTUwMDk1NDk3LDU1NTA1ODkyOCw0MTQ3Mjk5NzMsMTEzNjU0NDg4MiwzMDQ0NTkwMDg0LDQ2NTU0NzgyNCw0MDU4MTQ2NzI4LDI3MzE3OTYwNTQsMTY4OTgzODg0NiwzODkwNzU2OTM5LDEwNDgwMjk1MDcsODk1MDkwNjQ5LDI0NzE0MDI0OSwxNzg3NDQ1NTAsMzU0Nzg4NTIyMywzMTY1MTc5MjQzLDEwOTg4MTU3NiwzOTQ0NjA0NDE1LDEwNDQzMDMyMTIsMzc3MjM3MzAyOSwyOTg1MTUwMzA2LDM3Mzc1MjA5MzIsMzU5OTk2NDQyMH0sezM0MzcwMTc0ODEsMzc4NDQ3NTEyOSwyODAwMjI0OTcyLDMwODYyMjI2ODgsMjUxMzMzNTgwLDIxMzE5MzEzMjMsNTEyNzc0OTM4LDMyNTk0ODg4MCwyNjU3NDg2NDM3LDIxMDI2OTQyODcsMzgyMDU2ODIyNiw3OTI4MTI4MTYsMTAyNjQyMjUwMiwyMDUzMjc1MzQzLDI4MDA4ODkyMDAsMzExMzU4NjgxMCwxNjU1NDk3NDYsNDI3MzUxOTk2OSw0MDY1MjQ3ODkyLDE5MDI3ODkyNDcsNzcyOTMyNzE5LDM5NDE4NDg0MjYsMzY1Mjc0NDEwOSwyMTY4NzE5NDcsMzE2NDQwMDY0OSwxOTQyMzc4NzU1LDM5OTY3NjU4NTEsMTA1NTc3NzM3MCw5NjQwNDc3OTksNjI5MzkxNzE3LDIyMzI3NDQzMTcsMzkxMDU1ODk5MiwxOTE4Njg1NjksMjc1ODg4MzgzNywzNjgyODE2NzUyLDI5OTc3MTQ3MzIsMjcwMjUyOTI1MCwzNTcwNzAwNDU1LDM3NzY4NzM4MzIsMzkyNDA2NzU0NiwzNTU1Njg5NTQ1LDI3NTg4MjU0MzQsMTMyMzE0NDUzNSw2MTMxMTkwNSwxOTk3NDExMDg1LDM3Njg0NDIwNCwyMTM3Nzc2MDQsNDA3NzMyMzU4NCw5MTM1MzgxLDE2MjU4MDkzMzUsMjgwNDc0MjEzNywyOTUyMjkzOTQ1LDExMTcxOTA4MjksNDIzNzMxMjc4MiwxODI1MTA4ODU1LDMwMTMxNDc5NzEsMTExMTI1MTM1MSwyNTY4ODM3NTcyLDE2ODQzMjQyMTEsMjUyMDk3ODgwNSwzNjcyNTE5NzUsODEwNzU2NzMwLDIzNTM3ODQzNDQsMTE3NTA4MDMxMH19CiAKLVRoaXMgaXMgY2FsbGVkIGJ5IGJ1aWxkL2NvcmUvTWFrZWZpbGUgdG8gaW5jb3Jwb3JhdGUgdGhlIE9UQSBzaWduaW5nIGtleXMKK1RoaXMgaXMgY2FsbGVkIGJ5IGJ1aWxkL21ha2UvY29yZS9NYWtlZmlsZSB0byBpbmNvcnBvcmF0ZSB0aGUgT1RBIHNpZ25pbmcga2V5cwogaW50byB0aGUgcmVjb3ZlcnkgaW1hZ2UuCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC90cmVibGVfY29tbW9uLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdHJlYmxlX2NvbW1vbi5tawppbmRleCAxM2I3NzY5Li5jZDU0NDJmIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC90cmVibGVfY29tbW9uLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3RyZWJsZV9jb21tb24ubWsKQEAgLTM4LDggKzM4LDYgQEAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGxpYnZ1bGthbiBcCiAKLSMgQXVkaW86Ci1VU0VfWE1MX0FVRElPX1BPTElDWV9DT05GIDo9IDEKICMgVGhlIGZvbGxvd2luZyBwb2xpY3kgWE1MIGZpbGVzIGFyZSB1c2VkIGFzIGZhbGxiYWNrIGZvcgogIyB2ZW5kb3JzL2RldmljZXMgbm90IHVzaW5nIFhNTCB0byBjb25maWd1cmUgYXVkaW8gcG9saWN5LgogUFJPRFVDVF9DT1BZX0ZJTEVTICs9IFwKQEAgLTYzLDEyICs2MSwyMCBAQAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgbmV0dXRpbHMtd3JhcHBlci0xLjAKIAotIyBBbmRyb2lkIFZlcmlmaWVkIEJvb3QgKEFWQik6Ci0jICAgQnVpbGRzIGEgc3BlY2lhbCB2Ym1ldGEuaW1nIHRoYXQgZGlzYWJsZXMgQVZCIHZlcmlmaWNhdGlvbi4KLSMgICBPdGhlcndpc2UsIEFWQiB3aWxsIHByZXZlbnQgdGhlIGRldmljZSBmcm9tIGJvb3RpbmcgdGhlIGdlbmVyaWMgc3lzdGVtLmltZy4KLSMgICBBbHNvIGNoZWNrcyB0aGF0IEJPQVJEX0FWQl9FTkFCTEUgaXMgbm90IHNldCwgdG8gcHJldmVudCBhZGRpbmcgdmVyaXR5Ci0jICAgbWV0YWRhdGEgaW50byBzeXN0ZW0uaW1nLgotaWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQotJChlcnJvciBCT0FSRF9BVkJfRU5BQkxFIGNhbm5vdCBiZSBzZXQgZm9yIFRyZWJsZSBHU0kpCi1lbmRpZgotQk9BUkRfQlVJTERfRElTQUJMRURfVkJNRVRBSU1BR0UgOj0gdHJ1ZQorIyBUZWxlcGhvbnk6CisjICAgUHJvdmlkZSBhIGRlZmF1bHQgQVBOIGNvbmZpZ3VyYXRpb24KK1BST0RVQ1RfQ09QWV9GSUxFUyArPSBcCisgICAgZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvZGF0YS9ldGMvYXBucy1jb25mLnhtbDpzeXN0ZW0vZXRjL2FwbnMtY29uZi54bWwKKworIyBTdXBwb3J0IGZvciB0aGUgZGV2aWNlcyB3aXRoIG5vIFZOREsgZW5mb3JjaW5nCitQUk9EVUNUX0NPUFlfRklMRVMgKz0gXAorICAgIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3Qvdm5kay9pbml0LmdzaS5yYzpzeXN0ZW0vZXRjL2luaXQvaW5pdC5nc2kucmMgXAorICAgIGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3Qvdm5kay9pbml0Lm5vZW5mb3JjZS5yYzpzeXN0ZW0vZXRjL2luaXQvZ3NpL2luaXQubm9lbmZvcmNlLnJjCisKKyMgTmFtZSBzcGFjZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIG5vbi1lbmZvcmNpbmcgVk5ESworUFJPRFVDVF9QQUNLQUdFUyArPSBcCisgICAgbGQuY29uZmlnLm5vZW5mb3JjZS50eHQKKworIyBTZXQgY3VycmVudCBWTkRLIHZlcnNpb24gZm9yIEdTSQorUFJPRFVDVF9TWVNURU1fREVGQVVMVF9QUk9QRVJUSUVTICs9IFwKKyAgICByby5nc2kudm5kay52ZXJzaW9uPSQoUExBVEZPUk1fVk5ES19WRVJTSU9OKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmVyaXR5Lm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdmVyaXR5Lm1rCmluZGV4IDBiYWRiOWYuLmQ5NTQxNTkgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3Zlcml0eS5taworKysgYi90YXJnZXQvcHJvZHVjdC92ZXJpdHkubWsKQEAgLTE0LDIwICsxNCwxNiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBQcm92aWRlcyBkZXBlbmRlbmNpZXMgbmVjZXNzYXJ5IGZvciB2ZXJpZmllZCBib290IChvbmx5IGZvciB1c2VyIGFuZAotIyB1c2VyZGVidWcgYnVpbGRzKQorIyBQcm92aWRlcyBkZXBlbmRlbmNpZXMgbmVjZXNzYXJ5IGZvciB2ZXJpZmllZCBib290LgogCi11c2VyX3ZhcmlhbnQgOj0gJChmaWx0ZXIgdXNlciB1c2VyZGVidWcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpCi1pZm5lcSAoLCQodXNlcl92YXJpYW50KSkKLSAgICBQUk9EVUNUX1NVUFBPUlRTX0JPT1RfU0lHTkVSIDo9IHRydWUKLSAgICBQUk9EVUNUX1NVUFBPUlRTX1ZFUklUWSA6PSB0cnVlCi0gICAgUFJPRFVDVF9TVVBQT1JUU19WRVJJVFlfRkVDIDo9IHRydWUKK1BST0RVQ1RfU1VQUE9SVFNfQk9PVF9TSUdORVIgOj0gdHJ1ZQorUFJPRFVDVF9TVVBQT1JUU19WRVJJVFkgOj0gdHJ1ZQorUFJPRFVDVF9TVVBQT1JUU19WRVJJVFlfRkVDIDo9IHRydWUKIAotICAgICMgVGhlIGRldiBrZXkgaXMgdXNlZCB0byBzaWduIGJvb3QgYW5kIHJlY292ZXJ5IGltYWdlcywgYW5kIHRoZSB2ZXJpdHkKLSAgICAjIG1ldGFkYXRhIHRhYmxlLiBBY3R1YWwgcHJvZHVjdCBkZWxpdmVyYWJsZXMgd2lsbCBiZSByZS1zaWduZWQgYnkgaGFuZC4KLSAgICAjIFdlIGV4cGVjdCB0aGlzIGZpbGUgdG8gZXhpc3Qgd2l0aCB0aGUgc3VmZml4ZXMgIi54NTA5LnBlbSIgYW5kICIucGs4Ii4KLSAgICBQUk9EVUNUX1ZFUklUWV9TSUdOSU5HX0tFWSA6PSBidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS92ZXJpdHkKKyMgVGhlIGRldiBrZXkgaXMgdXNlZCB0byBzaWduIGJvb3QgYW5kIHJlY292ZXJ5IGltYWdlcywgYW5kIHRoZSB2ZXJpdHkKKyMgbWV0YWRhdGEgdGFibGUuIEFjdHVhbCBwcm9kdWN0IGRlbGl2ZXJhYmxlcyB3aWxsIGJlIHJlLXNpZ25lZCBieSBoYW5kLgorIyBXZSBleHBlY3QgdGhpcyBmaWxlIHRvIGV4aXN0IHdpdGggdGhlIHN1ZmZpeGVzICIueDUwOS5wZW0iIGFuZCAiLnBrOCIuCitQUk9EVUNUX1ZFUklUWV9TSUdOSU5HX0tFWSA6PSBidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS92ZXJpdHkKIAotICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAotICAgICAgICAgICAgdmVyaXR5X2tleQotZW5kaWYKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgICB2ZXJpdHlfa2V5CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC92bmRrL0FuZHJvaWQubWsgYi90YXJnZXQvcHJvZHVjdC92bmRrL0FuZHJvaWQubWsKaW5kZXggYzhlZDg3My4uOTNhYWYzNyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3Qvdm5kay9BbmRyb2lkLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3ZuZGsvQW5kcm9pZC5tawpAQCAtMSw3ICsxLDgyIEBACitpZm5lcSAoJChCT0FSRF9WTkRLX1ZFUlNJT04pLCkKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDcmVhdGUgdGhlIGxpc3Qgb2Ygdm5kayBsaWJyYXJpZXMgZnJvbSB0aGUgc291cmNlIGNvZGUuCitJTlRFUk5BTF9WTkRLX0xJQl9MSVNUIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZuZGspL2xpYnMudHh0CiskKElOVEVSTkFMX1ZOREtfTElCX0xJU1QpOgorCUBlY2hvICJHZW5lcmF0ZTogJEAiCisJQG1rZGlyIC1wICQoZGlyICRAKQorCSQoaGlkZSkgZWNobyAtbiA+ICRACisJJChoaWRlKSAkKGZvcmVhY2ggbGliLCAkKExMTkRLX0xJQlJBUklFUyksIFwKKwkgIGVjaG8gTExOREs6ICQobGliKS5zbyA+PiAkQDspCisJJChoaWRlKSAkKGZvcmVhY2ggbGliLCAkKFZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTKSwgXAorCSAgZWNobyBWTkRLLVNQOiAkKGxpYikuc28gPj4gJEA7KQorCSQoaGlkZSkgJChmb3JlYWNoIGxpYiwgJChWTkRLX0NPUkVfTElCUkFSSUVTKSwgXAorCSAgZWNobyBWTkRLLWNvcmU6ICQobGliKS5zbyA+PiAkQDspCisJJChoaWRlKSAkKGZvcmVhY2ggbGliLCAkKFZOREtfUFJJVkFURV9MSUJSQVJJRVMpLCBcCisJICBlY2hvIFZOREstcHJpdmF0ZTogJChsaWIpLnNvID4+ICRAOykKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgaXMgdGhlIHVwLXRvLWRhdGUgbGlzdCBvZiB2bmRrIGxpYnMuCisjIFRPRE8oYi82MjAxMjI4NSk6IHRoZSBsaWIgbGlzdCBzaG91bGQgYmUgc3RvcmVkIHNvbWV3aGVyZSB1bmRlcgorIyAvcHJlYnVpbHRzL3ZuZGsKK0xBVEVTVF9WTkRLX0xJQl9MSVNUIDo9ICQoTE9DQUxfUEFUSCkvJChQTEFURk9STV9WTkRLX1ZFUlNJT04pLnR4dAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2hlY2sgdGhlIGdlbmVyYXRlIGxpc3QgYWdhaW5zdCB0aGUgbGF0ZXN0IGxpc3Qgc3RvcmVkIGluIHRoZQorIyBzb3VyY2UgdHJlZQorLlBIT05ZOiBjaGVjay12bmRrLWxpc3QKKworaWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCisjIFRoZSBjaGVjayBpcyBlbmZvcmNlZCBpbiByZWxlYXNlIGJyYW5jaGVzCitkcm9pZGNvcmU6IGNoZWNrLXZuZGstbGlzdAorZW5kaWYKKworY2hlY2stdm5kay1saXN0LXRpbWVzdGFtcCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2bmRrKS9jaGVjay1saXN0LXRpbWVzdGFtcAorY2hlY2stdm5kay1saXN0OiAkKGNoZWNrLXZuZGstbGlzdC10aW1lc3RhbXApCisKK192bmRrX2NoZWNrX2ZhaWx1cmVfbWVzc2FnZSA6PSAiVk5ESyBsaWJyYXJ5IGxpc3QgaGFzIGNoYW5nZWQuIgoraWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkKK192bmRrX2NoZWNrX2ZhaWx1cmVfbWVzc2FnZSArPSAiVGhpcyBpc24ndCBhbGxvd2VkIGluIEFQSSBsb2NrZWQgYnJhbmNoZXMuIgorZWxzZQorX3ZuZGtfY2hlY2tfZmFpbHVyZV9tZXNzYWdlICs9ICJSdW4gdXBkYXRlLXZuZGstbGlzdC5zaCB0byB1cGRhdGUgdGhlIGxpc3QuIgorZW5kaWYKKworJChjaGVjay12bmRrLWxpc3QtdGltZXN0YW1wKTogJChJTlRFUk5BTF9WTkRLX0xJQl9MSVNUKSAkKExBVEVTVF9WTkRLX0xJQl9MSVNUKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS91cGRhdGUtdm5kay1saXN0LnNoCisJJChoaWRlKSAoIGRpZmYgLS1vbGQtbGluZS1mb3JtYXQ9IlJlbW92ZWQgJUwiIFwKKwkgIC0tbmV3LWxpbmUtZm9ybWF0PSJBZGRlZCAlTCIgXAorCSAgLS11bmNoYW5nZWQtbGluZS1mb3JtYXQ9IiIgXAorCSAgJChMQVRFU1RfVk5ES19MSUJfTElTVCkgJChJTlRFUk5BTF9WTkRLX0xJQl9MSVNUKSBcCisJICB8fCAoIGVjaG8gJChfdm5ka19jaGVja19mYWlsdXJlX21lc3NhZ2UpOyBleGl0IDEgKSkKKwkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQorCSQoaGlkZSkgdG91Y2ggJEAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNjcmlwdCB0byB1cGRhdGUgdGhlIGxhdGVzdCBWTkRLIGxpYiBsaXN0CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSB1cGRhdGUtdm5kay1saXN0LnNoCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVhFQ1VUQUJMRVMKK0xPQ0FMX01PRFVMRV9TVEVNIDo9ICQoTE9DQUxfTU9EVUxFKQorTE9DQUxfSVNfSE9TVF9NT0RVTEUgOj0gdHJ1ZQoraW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5taworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0lOVEVSTkFMX1ZOREtfTElCX0xJU1QgOj0gJChJTlRFUk5BTF9WTkRLX0xJQl9MSVNUKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0xBVEVTVF9WTkRLX0xJQl9MSVNUIDo9ICQoTEFURVNUX1ZOREtfTElCX0xJU1QpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6CisJQGVjaG8gIkdlbmVyYXRlOiAkQCIKKwlAbWtkaXIgLXAgJChkaXIgJEApCisJQHJtIC1mICRACisJJChoaWRlKSBlY2hvICIjIS9iaW4vYmFzaCIgPiAkQAoraWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCisJJChoaWRlKSBlY2hvICJlY2hvIFVwZGF0aW5nIFZOREsgbGlicmFyeSBsaXN0IGlzIE5PVCBhbGxvd2VkIGluIEFQSSBsb2NrZWQgYnJhbmNoZXMuIiA+PiAkQDsgXAorCSAgICAgICAgZWNobyAiZXhpdCAxIiA+PiAkQAorZWxzZQorCSQoaGlkZSkgZWNobyAiY3AgJChQUklWQVRFX0lOVEVSTkFMX1ZOREtfTElCX0xJU1QpICQoUFJJVkFURV9MQVRFU1RfVk5ES19MSUJfTElTVCkiID4+ICRAOyBcCisJICAgICAgICBlY2hvICJlY2hvICQoUFJJVkFURV9MQVRFU1RfVk5ES19MSUJfTElTVCkgdXBkYXRlZC4iID4+ICRACitlbmRpZgorCUBjaG1vZCBhK3ggJEAKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEUgOj0gdm5ka19wYWNrYWdlCiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKICAgICAkKGFkZHN1ZmZpeCAudmVuZG9yLCQoVk5ES19DT1JFX0xJQlJBUklFUykpIFwKQEAgLTksNSArODQsMTIgQEAKICAgICAkKExMTkRLX0xJQlJBUklFUykgXAogICAgIGxsbmRrLmxpYnJhcmllcy50eHQgXAogICAgIHZuZGtzcC5saWJyYXJpZXMudHh0Ci0KIGluY2x1ZGUgJChCVUlMRF9QSE9OWV9QQUNLQUdFKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSB2bmRrX3NuYXBzaG90X3BhY2thZ2UKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgICQoZm9yZWFjaCB2bmRrX3ZlciwkKFBST0RVQ1RfRVhUUkFfVk5ES19WRVJTSU9OUyksdm5ka192JCh2bmRrX3ZlcilfJChUQVJHRVRfQVJDSCkpCitpbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKKworZW5kaWYgIyBCT0FSRF9WTkRLX1ZFUlNJT04gaXMgc2V0CmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC92bmRrL2luaXQuZ3NpLnJjIGIvdGFyZ2V0L3Byb2R1Y3Qvdm5kay9pbml0LmdzaS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTZiMWZiCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvdm5kay9pbml0LmdzaS5yYwpAQCAtMCwwICsxLDIgQEAKKyMgSWYgcm8udm5kay52ZXJzaW9uIGlzIG5vdCBkZWZpbmVkLCBpbXBvcnQgaW5pdC5ub2VuZm9yY2UucmMKK2ltcG9ydCAvc3lzdGVtL2V0Yy9pbml0L2dzaS9pbml0LiR7cm8udm5kay52ZXJzaW9uOi1ub2VuZm9yY2V9LnJjCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC92bmRrL2luaXQubm9lbmZvcmNlLnJjIGIvdGFyZ2V0L3Byb2R1Y3Qvdm5kay9pbml0Lm5vZW5mb3JjZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2YxZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3Qvdm5kay9pbml0Lm5vZW5mb3JjZS5yYwpAQCAtMCwwICsxLDUgQEAKK29uIGVhcmx5LWluaXQKKyAgICAjIElmIHJvLnZuZGsudmVyc2lvbiBpcyBub3Qgc2V0LCB1c2UgbGQuY29uZmlnLm5vbmVuZm9yY2UudHh0CisgICAgZXhwb3J0IExEX0NPTkZJR19GSUxFIC9zeXN0ZW0vZXRjL2xkLmNvbmZpZy5ub2VuZm9yY2UudHh0CisgICAgIyBUbyB1c2UgY3VycmVudCBWTkRLIGxpYnMsIHNldCByby52bmRrLnZlcnNpb24gdG8gc3lzdGVtIHZuZGsgdmVyc2lvbgorICAgIHNldHByb3Agcm8udm5kay52ZXJzaW9uICR7cm8uZ3NpLnZuZGsudmVyc2lvbn0KZGlmZiAtLWdpdCBhL3Rvb2xzL0FuZHJvaWQubWsgYi90b29scy9BbmRyb2lkLm1rCmluZGV4IDkwNzNhYzMuLmMwNWQ2ODEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL0FuZHJvaWQubWsKKysrIGIvdG9vbHMvQW5kcm9pZC5tawpAQCAtMTYsNCArMTYsOCBAQAogCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKKyMgT25seSBpZiB0aGlzIEFuZHJvaWQubWsgd2FzIGluY2x1ZGVkIG5vdCBieSBhIHN5bWxpbmsgc2hvdWxkIGl0IGJlIHVzZWQuCisjIFRoaXMgZmFjaWxpdGF0ZXMgdGhlIHRyYW5zaXRpb24gYXdheSBmcm9tIHN5bWxpbmtzOiBiLzY0Mzk3OTYwCitpZmVxICgkKExPQ0FMX1BBVEgpLGJ1aWxkL21ha2UvdG9vbHMpCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCitlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNwL0FuZHJvaWQuYnAgYi90b29scy9hY3AvQW5kcm9pZC5icAppbmRleCBmYWYyMDM0Li42NGY1YTEwIDEwMDY0NAotLS0gYS90b29scy9hY3AvQW5kcm9pZC5icAorKysgYi90b29scy9hY3AvQW5kcm9pZC5icApAQCAtNSw2ICs1LDcgQEAKIGNjX2JpbmFyeV9ob3N0IHsKIAogICAgIHNyY3M6IFsiYWNwLmMiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliaG9zdCJdLAogICAgIG5hbWU6ICJhY3AiLApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNwL2FjcC5jIGIvdG9vbHMvYWNwL2FjcC5jCmluZGV4IGViMWRlMWYuLmQ0YTlmYmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FjcC9hY3AuYworKysgYi90b29scy9hY3AvYWNwLmMKQEAgLTQxLDEwICs0MSw5IEBACiBpbnQgcHJvY2VzcyhpbnQgYXJnYywgY2hhciogY29uc3QgYXJndltdLCB1bnNpZ25lZCBpbnQgb3B0aW9ucykKIHsKICAgICBpbnQgcmV0VmFsID0gMDsKLSAgICBpbnQgaSwgY2M7CisgICAgaW50IGk7CiAgICAgY2hhciogc3RyaXBEZXN0ID0gTlVMTDsKICAgICBpbnQgc3RyaXBEZXN0TGVuOwotICAgIHN0cnVjdCBzdGF0IGRlc3RTdGF0OwogICAgIGJvb2wgZGVzdE11c3RCZURpciA9IGZhbHNlOwogICAgIHN0cnVjdCBzdGF0IHNiOwogCmRpZmYgLS1naXQgYS90b29scy9hZGJzIGIvdG9vbHMvYWRicwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYThmMDZjMC4uMDAwMDAwMAotLS0gYS90b29scy9hZGJzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWltcG9ydCBvcwotaW1wb3J0IG9zLnBhdGgKLWltcG9ydCByZQotaW1wb3J0IHN0cmluZwotaW1wb3J0IHN5cwotCi1zeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSArICIvLi4vLi4vZGV2ZWxvcG1lbnQvc2NyaXB0cyIpCi1pbXBvcnQgc3RhY2tfY29yZQotaW1wb3J0IHN5bWJvbAotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAjIHBhc3MgdGhlIG9wdGlvbnMgdG8gYWRiCi0gIGFkYl9jbWQgID0gImFkYiAiICsgJyAnLmpvaW4oc3lzLmFyZ3ZbMTpdKQotCi0gICMgY3JlYXRlIHRyYWNlciBmb3IgbGluZSBwYXJzaW5nCi0gIHRyYWNlciA9IHN0YWNrX2NvcmUuVHJhY2VDb252ZXJ0ZXIoKQotCi0gICMgaW52b2tlIHRoZSBhZGIgY29tbWFuZCBhbmQgZmlsdGVyIGl0cyBvdXRwdXQKLSAgc3RyZWFtID0gb3MucG9wZW4oYWRiX2NtZCkKLSAgd2hpbGUgKFRydWUpOgotICAgIGxpbmUgPSBzdHJlYW0ucmVhZGxpbmUoKQotICAgIGlmIChsaW5lID09ICcnKToKLSAgICAgIGJyZWFrCi0gICAgaWYodHJhY2VyLlByb2Nlc3NMaW5lKGxpbmUpID09IEZhbHNlKToKLSAgICAgIHByaW50KGxpbmUuc3RyaXAoKSkKLSAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotCi0gICMgYWRiIGl0c2VsZiBhYm9ydHMKLSAgc3RyZWFtLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2FwaWNoZWNrL0FuZHJvaWQubWsgYi90b29scy9hcGljaGVjay9BbmRyb2lkLm1rCmluZGV4IGI1NDcwNTguLmFiMzQ5M2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FwaWNoZWNrL0FuZHJvaWQubWsKKysrIGIvdG9vbHMvYXBpY2hlY2svQW5kcm9pZC5tawpAQCAtMTIsNyArMTIsNiBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKQogTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQogCiAjIHRoZSBoYXQgc2NyaXB0CkBAIC0yNiw0ICsyNSwzIEBACiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAKICMgQXBpY2hlY2sgaXMgbm93IHBhcnQgb2YgRG9jbGF2YSAtLSBTZWUgZXh0ZXJuYWwvZG9jbGF2YS4KLWVuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcGljaGVjay9ldGMvYXBpY2hlY2sgYi90b29scy9hcGljaGVjay9ldGMvYXBpY2hlY2sKaW5kZXggYzcxMGM0Ni4uZTRmZmI3NyAxMDA2NDQKLS0tIGEvdG9vbHMvYXBpY2hlY2svZXRjL2FwaWNoZWNrCisrKyBiL3Rvb2xzL2FwaWNoZWNrL2V0Yy9hcGljaGVjawpAQCAtMTgsNyArMTgsNyBAQAogIyBhbmQgc2V0IHVwIHByb2dkaXIgdG8gYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBwYXRobmFtZSBvZiBpdHMgZGlyZWN0b3J5LgogIwogIyBUaGUgY2xhc3NwYXRoIGFuZCBvdGhlciBqYXZhIG9wdGlvbnMgdXNlZCBpbiBhcGljaGVjayBhcmUgc3BlY2lmaWVkIGluCi0jIGJ1aWxkL2NvcmUvdGFza3MvYXBpY2hlY2subWsuCisjIGJ1aWxkL21ha2UvY29yZS90YXNrcy9hcGljaGVjay5tay4KIAogcHJvZz0iJDAiCiB3aGlsZSBbIC1oICIke3Byb2d9IiBdOyBkbwpkaWZmIC0tZ2l0IGEvdG9vbHMvYXRyZWUvQW5kcm9pZC5icCBiL3Rvb2xzL2F0cmVlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiZTA0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2F0cmVlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNCBAQAorLy8gQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIENvcGllcyBmaWxlcyBpbnRvIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGRlc2NyaWJlZCBieSBhIG1hbmlmZXN0CisKK2NjX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiYXRyZWUiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImF0cmVlLmNwcCIsCisgICAgICAgICJmaWxlcy5jcHAiLAorICAgICAgICAiZnMuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGliaG9zdCJdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXRyZWUvQW5kcm9pZC5tayBiL3Rvb2xzL2F0cmVlL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OThkYjUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYXRyZWUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBDb3BpZXMgZmlsZXMgaW50byB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBkZXNjcmliZWQgYnkgYSBtYW5pZmVzdAotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCWF0cmVlLmNwcCBcCi0JZmlsZXMuY3BwIFwKLQlmcy5jcHAKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0JbGliaG9zdAotCi1MT0NBTF9NT0RVTEUgOj0gYXRyZWUKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXRyZWUvZmlsZXMuY3BwIGIvdG9vbHMvYXRyZWUvZmlsZXMuY3BwCmluZGV4IGQ5NDVmNTguLmQ1YzhhOTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2F0cmVlL2ZpbGVzLmNwcAorKysgYi90b29scy9hdHJlZS9maWxlcy5jcHAKQEAgLTQyNSw4ICs0MjUsNiBAQAogICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBleGNsdWRlcywKICAgICAgICAgICAgICAgICB2ZWN0b3I8RmlsZVJlY29yZD4qIG1vcmUpCiB7Ci0gICAgaW50IGVycjsKLQogICAgIHN0cmluZyBmdWxsID0gcGF0aF9hcHBlbmQocmVjLnNvdXJjZUJhc2UsIHJlYy5zb3VyY2VOYW1lKTsKICAgICBmdWxsID0gcGF0aF9hcHBlbmQoZnVsbCwgcGF0aCk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5IGIvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdjNWJkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnLnB5CkBAIC0wLDAgKzEsODkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiQSB0b29sIHRvIGdlbmVyYXRlIFRyYWRlRmVkIHRlc3QgY29uZmlnIGZpbGUuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitmcm9tIHhtbC5kb20ubWluaWRvbSBpbXBvcnQgcGFyc2UKKworQVRUUklCVVRFX0xBQkVMID0gJ2FuZHJvaWQ6bGFiZWwnCitBVFRSSUJVVEVfUlVOTkVSID0gJ2FuZHJvaWQ6bmFtZScKK0FUVFJJQlVURV9QQUNLQUdFID0gJ3BhY2thZ2UnCisKK1BMQUNFSE9MREVSX0xBQkVMID0gJ3tMQUJFTH0nCitQTEFDRUhPTERFUl9NT0RVTEUgPSAne01PRFVMRX0nCitQTEFDRUhPTERFUl9QQUNLQUdFID0gJ3tQQUNLQUdFfScKK1BMQUNFSE9MREVSX1JVTk5FUiA9ICd7UlVOTkVSfScKK1BMQUNFSE9MREVSX1RFU1RfVFlQRSA9ICd7VEVTVF9UWVBFfScKKworCitkZWYgbWFpbihhcmd2KToKKyAgIiIiRW50cnkgcG9pbnQgb2YgYXV0b19nZW5fdGVzdF9jb25maWcuCisKKyAgQXJnczoKKyAgICBhcmd2OiBBIGxpc3Qgb2YgYXJndW1lbnRzLgorICBSZXR1cm5zOgorICAgIDAgaWYgbm8gZXJyb3IsIG90aGVyd2lzZSAxLgorICAiIiIKKyAgaWYgbGVuKGFyZ3YpICE9IDQ6CisgICAgc3lzLnN0ZGVyci53cml0ZSgKKyAgICAgICAgJ0ludmFsaWQgYXJndWVtZW50cy4gVGhlIHNjcmlwdCByZXF1aXJlcyA0IGFyZ3VtZW50cyBmb3IgZmlsZSBwYXRoczogJworICAgICAgICAndGFyZ2V0X2NvbmZpZyBhbmRyb2lkX21hbmlmZXN0IGVtcHR5X2NvbmZpZyAnCisgICAgICAgICdpbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUuXG4nKQorICAgIHJldHVybiAxCisgIHRhcmdldF9jb25maWcgPSBhcmd2WzBdCisgIGFuZHJvaWRfbWFuaWZlc3QgPSBhcmd2WzFdCisgIGVtcHR5X2NvbmZpZyA9IGFyZ3ZbMl0KKyAgaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlID0gYXJndlszXQorCisgIG1hbmlmZXN0ID0gcGFyc2UoYW5kcm9pZF9tYW5pZmVzdCkKKyAgaW5zdHJ1bWVudGF0aW9uX2VsZW1lbnRzID0gbWFuaWZlc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2luc3RydW1lbnRhdGlvbicpCisgIG1hbmlmZXN0X2VsZW1lbnRzID0gbWFuaWZlc3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21hbmlmZXN0JykKKyAgaWYgbGVuKGluc3RydW1lbnRhdGlvbl9lbGVtZW50cykgIT0gMSBvciBsZW4obWFuaWZlc3RfZWxlbWVudHMpICE9IDE6CisgICAgIyBGYWlsZWQgdG8gbG9jYXRlIGluc3RydW1lbnRhdGlvbiBvciBtYW5pZmVzdCBlbGVtZW50IGluIEFuZHJvaWRNYW5pZmVzdC4KKyAgICAjIGZpbGUuIEVtcHR5IHRlc3QgY29uZmlnIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorICAgIHNodXRpbC5jb3B5ZmlsZShlbXB0eV9jb25maWcsIHRhcmdldF9jb25maWcpCisgICAgcmV0dXJuIDAKKworICBtb2R1bGUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2NvbmZpZykpWzBdCisgIGluc3RydW1lbnRhdGlvbiA9IGluc3RydW1lbnRhdGlvbl9lbGVtZW50c1swXQorICBtYW5pZmVzdCA9IG1hbmlmZXN0X2VsZW1lbnRzWzBdCisgIGlmIGluc3RydW1lbnRhdGlvbi5hdHRyaWJ1dGVzLmhhc19rZXkoQVRUUklCVVRFX0xBQkVMKToKKyAgICBsYWJlbCA9IGluc3RydW1lbnRhdGlvbi5hdHRyaWJ1dGVzW0FUVFJJQlVURV9MQUJFTF0udmFsdWUKKyAgZWxzZToKKyAgICBsYWJlbCA9IG1vZHVsZQorICBydW5uZXIgPSBpbnN0cnVtZW50YXRpb24uYXR0cmlidXRlc1tBVFRSSUJVVEVfUlVOTkVSXS52YWx1ZQorICBwYWNrYWdlID0gbWFuaWZlc3QuYXR0cmlidXRlc1tBVFRSSUJVVEVfUEFDS0FHRV0udmFsdWUKKyAgdGVzdF90eXBlID0gKCdJbnN0cnVtZW50YXRpb25UZXN0JworICAgICAgICAgICAgICAgaWYgcnVubmVyLmVuZHN3aXRoKCcuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcicpCisgICAgICAgICAgICAgICBlbHNlICdBbmRyb2lkSlVuaXRUZXN0JykKKworICB3aXRoIG9wZW4oaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlKSBhcyB0ZW1wbGF0ZToKKyAgICBjb25maWcgPSB0ZW1wbGF0ZS5yZWFkKCkKKyAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9MQUJFTCwgbGFiZWwpCisgICAgY29uZmlnID0gY29uZmlnLnJlcGxhY2UoUExBQ0VIT0xERVJfTU9EVUxFLCBtb2R1bGUpCisgICAgY29uZmlnID0gY29uZmlnLnJlcGxhY2UoUExBQ0VIT0xERVJfUEFDS0FHRSwgcGFja2FnZSkKKyAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9URVNUX1RZUEUsIHRlc3RfdHlwZSkKKyAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9SVU5ORVIsIHJ1bm5lcikKKyAgICB3aXRoIG9wZW4odGFyZ2V0X2NvbmZpZywgJ3cnKSBhcyBjb25maWdfZmlsZToKKyAgICAgIGNvbmZpZ19maWxlLndyaXRlKGNvbmZpZykKKyAgcmV0dXJuIDAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWdfdGVzdC5weSBiL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4YzI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2F1dG9fZ2VuX3Rlc3RfY29uZmlnX3Rlc3QucHkKQEAgLTAsMCArMSwxNzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJVbml0dGVzdHMgZm9yIGF1dG9fZ2VuX3Rlc3RfY29uZmlnLiIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBhdXRvX2dlbl90ZXN0X2NvbmZpZworCitURVNUX01PRFVMRSA9ICdUZXN0TW9kdWxlJworCitNQU5JRkVTVF9JTlZBTElEID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorPC9tYW5pZmVzdD4KKyIiIgorCitNQU5JRkVTVF9KVU5JVF9URVNUID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm15LnRlc3RzLngiPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLm15LnRlc3RzIiAvPgorPC9tYW5pZmVzdD4KKyIiIgorCitNQU5JRkVTVF9JTlNUUlVNRU5UQVRJT05fVEVTVCA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICBwYWNrYWdlPSJjb20uYW5kcm9pZC5teS50ZXN0cy54Ij4KKyAgICA8aW5zdHJ1bWVudGF0aW9uCisgICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubXkudGVzdHMiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik15IFRlc3RzIiAvPgorPC9tYW5pZmVzdD4KKyIiIgorCitFWFBFQ1RFRF9KVU5JVF9URVNUX0NPTkZJRyA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFRoaXMgdGVzdCBjb25maWcgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZC4gLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBUZXN0TW9kdWxlLiI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJUZXN0TW9kdWxlLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImNvbS5hbmRyb2lkLm15LnRlc3RzLngiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZC5zdXBwb3J0LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CisiIiIKKworRVhQRUNURURfSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVGhpcyB0ZXN0IGNvbmZpZyBmaWxlIGlzIGF1dG8tZ2VuZXJhdGVkLiAtLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIE15IFRlc3RzLiI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5zdWl0ZS5TdWl0ZUFwa0luc3RhbGxlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJUZXN0TW9kdWxlLmFwayIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5JbnN0cnVtZW50YXRpb25UZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImNvbS5hbmRyb2lkLm15LnRlc3RzLngiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgorIiIiCisKK1RPT0xTX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorRU1QVFlfVEVTVF9DT05GSUcgPSBvcy5wYXRoLmpvaW4oCisgICAgVE9PTFNfRElSLCAnLi4nLCAnY29yZScsICdlbXB0eV90ZXN0X2NvbmZpZy54bWwnKQorSU5TVFJVTUVOVEFUSU9OX1RFU1RfQ09ORklHX1RFTVBMQVRFID0gb3MucGF0aC5qb2luKAorICAgIFRPT0xTX0RJUiwgJy4uJywgJ2NvcmUnLCAnaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbCcpCisKKworY2xhc3MgQXV0b0dlblRlc3RDb25maWdVbml0dGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAiIiJVbml0dGVzdHMgZm9yIGF1dG9fZ2VuX3Rlc3RfY29uZmlnLiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICAiIiJTZXR1cCBkaXJlY3RvcnkgZm9yIHRlc3QuIiIiCisgICAgc2VsZi50ZXN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgIHNlbGYuY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0X2RpciwgVEVTVF9NT0RVTEUgKyAnLmNvbmZpZycpCisgICAgc2VsZi5tYW5pZmVzdF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdF9kaXIsICdBbmRyb2lkTWFuaWZlc3QueG1sJykKKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgIiIiQ2xlYW51cCB0aGUgdGVzdCBkaXJlY3RvcnkuIiIiCisgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRlc3RfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgZGVmIHRlc3RJbnZhbGlkTWFuaWZlc3Qoc2VsZik6CisgICAgIiIiQW4gZW1wdHkgdGVzdCBjb25maWcgc2hvdWxkIGJlIGdlbmVyYXRlZCBpZiBBbmRyb2lkTWFuaWZlc3QgaXMgaW52YWxpZC4KKyAgICAiIiIKKyAgICB3aXRoIG9wZW4oc2VsZi5tYW5pZmVzdF9maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKE1BTklGRVNUX0lOVkFMSUQpCisKKyAgICBhcmd2ID0gW3NlbGYuY29uZmlnX2ZpbGUsCisgICAgICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGUsCisgICAgICAgICAgICBFTVBUWV9URVNUX0NPTkZJRywKKyAgICAgICAgICAgIElOU1RSVU1FTlRBVElPTl9URVNUX0NPTkZJR19URU1QTEFURV0KKyAgICBhdXRvX2dlbl90ZXN0X2NvbmZpZy5tYWluKGFyZ3YpCisgICAgd2l0aCBvcGVuKHNlbGYuY29uZmlnX2ZpbGUpIGFzIGNvbmZpZ19maWxlOgorICAgICAgd2l0aCBvcGVuKEVNUFRZX1RFU1RfQ09ORklHKSBhcyBlbXB0eV9jb25maWc6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uZmlnX2ZpbGUucmVhZCgpLCBlbXB0eV9jb25maWcucmVhZCgpKQorCisgIGRlZiB0ZXN0Q3JlYXRlSlVuaXRUZXN0Q29uZmlnKHNlbGYpOgorICAgICIiIlRlc3QgY3JlYXRpbmcgdGVzdCBjb25maWcgZm9yIEFuZHJvaWRKVW5pdFRlc3QuCisgICAgIiIiCisgICAgd2l0aCBvcGVuKHNlbGYubWFuaWZlc3RfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgZi53cml0ZShNQU5JRkVTVF9KVU5JVF9URVNUKQorCisgICAgYXJndiA9IFtzZWxmLmNvbmZpZ19maWxlLAorICAgICAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlLAorICAgICAgICAgICAgRU1QVFlfVEVTVF9DT05GSUcsCisgICAgICAgICAgICBJTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUdfVEVNUExBVEVdCisgICAgYXV0b19nZW5fdGVzdF9jb25maWcubWFpbihhcmd2KQorICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlKSBhcyBjb25maWdfZmlsZToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uZmlnX2ZpbGUucmVhZCgpLCBFWFBFQ1RFRF9KVU5JVF9URVNUX0NPTkZJRykKKworICBkZWYgdGVzdENyZWF0ZUluc3RydW1lbnRhdGlvblRlc3RDb25maWcoc2VsZik6CisgICAgIiIiVGVzdCBjcmVhdGluZyB0ZXN0IGNvbmZpZyBmb3IgSW5zdHJ1bWVudGF0aW9uVGVzdC4KKyAgICAiIiIKKyAgICB3aXRoIG9wZW4oc2VsZi5tYW5pZmVzdF9maWxlLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKE1BTklGRVNUX0lOU1RSVU1FTlRBVElPTl9URVNUKQorCisgICAgYXJndiA9IFtzZWxmLmNvbmZpZ19maWxlLAorICAgICAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlLAorICAgICAgICAgICAgRU1QVFlfVEVTVF9DT05GSUcsCisgICAgICAgICAgICBJTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUdfVEVNUExBVEVdCisgICAgYXV0b19nZW5fdGVzdF9jb25maWcubWFpbihhcmd2KQorICAgIHdpdGggb3BlbihzZWxmLmNvbmZpZ19maWxlKSBhcyBjb25maWdfZmlsZToKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgY29uZmlnX2ZpbGUucmVhZCgpLCBFWFBFQ1RFRF9JTlNUUlVNRU5UQVRJT05fVEVTVF9DT05GSUcpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGRpbmZvLnNoIGIvdG9vbHMvYnVpbGRpbmZvLnNoCmluZGV4IGQyMTRhYWIuLjVhNTQ0NjIgMTAwNzU1Ci0tLSBhL3Rvb2xzL2J1aWxkaW5mby5zaAorKysgYi90b29scy9idWlsZGluZm8uc2gKQEAgLTEzLDYgKzEzLDcgQEAKIGVjaG8gInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZT0kUExBVEZPUk1fVkVSU0lPTiIKIGVjaG8gInJvLmJ1aWxkLnZlcnNpb24uc2VjdXJpdHlfcGF0Y2g9JFBMQVRGT1JNX1NFQ1VSSVRZX1BBVENIIgogZWNobyAicm8uYnVpbGQudmVyc2lvbi5iYXNlX29zPSRQTEFURk9STV9CQVNFX09TIgorZWNobyAicm8uYnVpbGQudmVyc2lvbi5taW5fc3VwcG9ydGVkX3RhcmdldF9zZGs9JFBMQVRGT1JNX01JTl9TVVBQT1JURURfVEFSR0VUX1NES19WRVJTSU9OIgogZWNobyAicm8uYnVpbGQuZGF0ZT1gJERBVEVgIgogZWNobyAicm8uYnVpbGQuZGF0ZS51dGM9YCREQVRFICslc2AiCiBlY2hvICJyby5idWlsZC50eXBlPSRUQVJHRVRfQlVJTERfVFlQRSIKZGlmZiAtLWdpdCBhL3Rvb2xzL2NoZWNrX2J1aWxkcy5zaCBiL3Rvb2xzL2NoZWNrX2J1aWxkcy5zaAppbmRleCBjMjU1YmYwLi43ZTRlYTdjIDEwMDY0NAotLS0gYS90b29scy9jaGVja19idWlsZHMuc2gKKysrIGIvdG9vbHMvY2hlY2tfYnVpbGRzLnNoCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICAgIGlucHV0cz0iJGlucHV0cyAkVEVTVF9CVUlMRF9ESVIvZGlzdC0kMS9pbnN0YWxsZWQtZmlsZXMudHh0IgogICAgICAgICBzaGlmdAogICAgIGRvbmUKLSAgICBidWlsZC90b29scy9jb21wYXJlX2ZpbGVzbGlzdC5weSAkaW5wdXRzID4gJFRFU1RfQlVJTERfRElSL3NpemVzLmh0bWwKKyAgICBidWlsZC9tYWtlL3Rvb2xzL2NvbXBhcmVfZmlsZXNsaXN0LnB5ICRpbnB1dHMgPiAkVEVTVF9CVUlMRF9ESVIvc2l6ZXMuaHRtbAogfQogCiBmdW5jdGlvbiBjaGVja19idWlsZHMKQEAgLTg3LDYgKzg3LDYgQEAKICAgICAgICAgZmkKICAgICAgICAgc2hpZnQKICAgICBkb25lCi0gICAgYnVpbGQvdG9vbHMvY29tcGFyZV9maWxlc2xpc3QucHkgJGlucHV0cyA+ICRURVNUX0JVSUxEX0RJUi9zaXplcy5odG1sCisgICAgYnVpbGQvbWFrZS90b29scy9jb21wYXJlX2ZpbGVzbGlzdC5weSAkaW5wdXRzID4gJFRFU1RfQlVJTERfRElSL3NpemVzLmh0bWwKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2tvd25lcnMucHkgYi90b29scy9jaGVja293bmVycy5weQppbmRleCBiODc0OTU1Li4xMTkwZDMwIDEwMDc1NQotLS0gYS90b29scy9jaGVja293bmVycy5weQorKysgYi90b29scy9jaGVja293bmVycy5weQpAQCAtMzQsOCArMzQsOCBAQAogICAgICAgICAgICAgICAgKyB1cmxsaWIucXVvdGUoYWRkcmVzcykpCiAgICAgZWNobygnQ2hlY2tpbmcgZW1haWwgYWRkcmVzczogJyArIGFkZHJlc3MpCiAgICAgcmVzdWx0ID0gdXJsbGliMi51cmxvcGVuKHJlcXVlc3QpLnJlYWQoKQotICAgIGV4cGVjdGVkID0gJyJlbWFpbCI6ICInICsgYWRkcmVzcyArICciJwotICAgIGNoZWNrZWRfYWRkcmVzc2VzW2FkZHJlc3NdID0gKHJlc3VsdC5maW5kKGV4cGVjdGVkKSA+PSAwKQorICAgIGNoZWNrZWRfYWRkcmVzc2VzW2FkZHJlc3NdID0gKAorICAgICAgICByZXN1bHQuZmluZCgnImVtYWlsIjonKSA+PSAwIGFuZCByZXN1bHQuZmluZCgnIl9hY2NvdW50X2lkIjonKSA+PSAwKQogICByZXR1cm4gY2hlY2tlZF9hZGRyZXNzZXNbYWRkcmVzc10KIAogCmRpZmYgLS1naXQgYS90b29scy9kb2NrZXIvLmdpdGlnbm9yZSBiL3Rvb2xzL2RvY2tlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMGIzNjcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kb2NrZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACitnaXRjb25maWcKZGlmZiAtLWdpdCBhL3Rvb2xzL2RvY2tlci9Eb2NrZXJmaWxlIGIvdG9vbHMvZG9ja2VyL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2NWFhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RvY2tlci9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjUgQEAKK0ZST00gdWJ1bnR1OjE0LjA0CitBUkcgdXNlcmlkCitBUkcgZ3JvdXBpZAorQVJHIHVzZXJuYW1lCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgZ2l0LWNvcmUgZ251cGcgZmxleCBiaXNvbiBncGVyZiBidWlsZC1lc3NlbnRpYWwgemlwIGN1cmwgemxpYjFnLWRldiBnY2MtbXVsdGlsaWIgZysrLW11bHRpbGliIGxpYmM2LWRldi1pMzg2IGxpYjMybmN1cnNlczUtZGV2IHgxMXByb3RvLWNvcmUtZGV2IGxpYngxMS1kZXYgbGliMzJ6LWRldiBjY2FjaGUgbGliZ2wxLW1lc2EtZGV2IGxpYnhtbDItdXRpbHMgeHNsdHByb2MgdW56aXAgcHl0aG9uIG9wZW5qZGstNy1qZGsKKworUlVOIGN1cmwgLW8gamRrOC50Z3ogaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vcHJlYnVpbHRzL2pkay9qZGs4LythcmNoaXZlL21hc3Rlci50YXIuZ3ogXAorICYmIHRhciAtenhmIGpkazgudGd6IGxpbnV4LXg4NiBcCisgJiYgbXYgbGludXgteDg2IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NCBcCisgJiYgcm0gLXJmIGpkazgudGd6CisKK1JVTiBjdXJsIC1vIC91c3IvbG9jYWwvYmluL3JlcG8gaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dpdC1yZXBvLWRvd25sb2Fkcy9yZXBvIFwKKyAmJiBlY2hvICJlMTQ3ZjAzOTI2ODZjNDBjZmQ3ZDVlNmYzMzJjNmVlNzRjNGVhYjRkMjRlMjY5NGIzYjBhMGMwMzdiZjUxZGM1ICAvdXNyL2xvY2FsL2Jpbi9yZXBvIiB8IHNoYTI1NnN1bSAtLXN0cmljdCAtYyAtIFwKKyAmJiBjaG1vZCBhK3ggL3Vzci9sb2NhbC9iaW4vcmVwbworCitSVU4gZ3JvdXBhZGQgLWcgJGdyb3VwaWQgJHVzZXJuYW1lIFwKKyAmJiB1c2VyYWRkIC1tIC11ICR1c2VyaWQgLWcgJGdyb3VwaWQgJHVzZXJuYW1lIFwKKyAmJiBlY2hvICR1c2VybmFtZSA+L3Jvb3QvdXNlcm5hbWUgXAorICYmIGVjaG8gImV4cG9ydCBVU0VSPSIkdXNlcm5hbWUgPj4vaG9tZS8kdXNlcm5hbWUvLmdpdGNvbmZpZworQ09QWSBnaXRjb25maWcgL2hvbWUvJHVzZXJuYW1lLy5naXRjb25maWcKK1JVTiBjaG93biAkdXNlcmlkOiRncm91cGlkIC9ob21lLyR1c2VybmFtZS8uZ2l0Y29uZmlnCitFTlYgSE9NRT0vaG9tZS8kdXNlcm5hbWUKKworRU5UUllQT0lOVCBjaHJvb3QgLS11c2Vyc3BlYz0kKGNhdCAvcm9vdC91c2VybmFtZSk6JChjYXQgL3Jvb3QvdXNlcm5hbWUpIC8gL2Jpbi9iYXNoIC1pCmRpZmYgLS1naXQgYS90b29scy9kb2NrZXIvUkVBRE1FLm1kIGIvdG9vbHMvZG9ja2VyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRmZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZG9ja2VyL1JFQURNRS5tZApAQCAtMCwwICsxLDE4IEBACitUaGUgRG9ja2VyZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBzZXRzIHVwIGFuIFVidW50dSBUcnVzdHkgaW1hZ2UgcmVhZHkgdG8gYnVpbGQKK2EgdmFyaWV0eSBvZiBBbmRyb2lkIGJyYW5jaGVzICg+PSBMb2xsaXBvcCkuIEl0J3MgcGFydGljdWxhcnkgdXNlZnVsIHRvIGJ1aWxkCitvbGRlciBicmFuY2hlcyB0aGF0IHJlcXVpcmVkIDE0LjA0IGlmIHlvdSd2ZSB1cGdyYWRlZCB0byBzb21ldGhpbmcgbmV3ZXIuCisKK0ZpcnN0LCBidWlsZCB0aGUgaW1hZ2U6CitgYGAKKyMgQ29weSB5b3VyIGhvc3QgZ2l0Y29uZmlnLCBvciBjcmVhdGUgYSBzdHJpcHBlZCBkb3duIHZlcnNpb24KKyQgY3Agfi8uZ2l0Y29uZmlnIGdpdGNvbmZpZworJCBkb2NrZXIgYnVpbGQgLS1idWlsZC1hcmcgdXNlcmlkPSQoaWQgLXUpIC0tYnVpbGQtYXJnIGdyb3VwaWQ9JChpZCAtZykgLS1idWlsZC1hcmcgdXNlcm5hbWU9JChpZCAtdW4pIC10IGFuZHJvaWQtYnVpbGQtdHJ1c3R5IC4KK2BgYAorCitUaGVuIHlvdSBjYW4gc3RhcnQgdXAgbmV3IGluc3RhbmNlcyB3aXRoOgorYGBgCiskIGRvY2tlciBydW4gLWl0IC0tcm0gLXYgJEFORFJPSURfQlVJTERfVE9QOi9zcmMgYW5kcm9pZC1idWlsZC10cnVzdHkKKz4gY2QgL3NyYzsgc291cmNlIGJ1aWxkL2VudnNldHVwLnNoCis+IGx1bmNoIGFvc3BfYXJtLWVuZworPiBtIC1qNTAKK2BgYApkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvR1BMLUxJQ0VOU0UudHh0IGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvR1BMLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmEwZjE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL0dQTC1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0gICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgICAgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KLQotICAgICAgICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwotdXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQotdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQotICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucwotYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKLXJlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgotbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKLXRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCi1laXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgotbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgotdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLUFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCi1pcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KLVdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgotCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncwotc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Ci1jb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCi1jb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCi1ub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7Ci1hbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgotCi1Zb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKLXlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCi0KLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgotICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQotICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCi0gICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQotICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKLSAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCi0gICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCi0gICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgotICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCi0gICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKLSAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCi0gICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KLWNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQotb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQotbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCi10aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCi1jb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKLXRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCi1vZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwotYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55Ci1sYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1laXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgotdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbi4KLQotICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCi10byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKLW9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKLW9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0gICAgICAgICAgTk8gV0FSUkFOVFkKLQotICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgotT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUwotUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCi1UTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKLVJFUEFJUiBPUiBDT1JSRUNUSU9OLgotCi0gIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKLVdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKLVJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKLU9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLVRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKLVBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL0xJQ0VOU0UudHh0IGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDMyOGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1Db3B5cmlnaHQgKGMpIDIwMTEgSm9obiBSZXNpZywgaHR0cDovL2pxdWVyeS5jb20vCi0KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCi0iU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi13aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi1kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLXBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi1UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQotaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi1XSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9hbmRyb2lkLWRldmVsb3Blci1kb2NzLmNzcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLWRvY3MuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDYxMGY3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2FuZHJvaWQtZGV2ZWxvcGVyLWRvY3MuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjc2OCArMCwwIEBACi0vKiBmaWxlOiBhbmRyb2lkLWRldmVsb3Blci1jb3JlLmNzcwotICAgYXV0aG9yOiBzbWFpbgotICAgZGF0ZTogc2VwdGVtYmVyIDIwMDgKLSAgIGluZm86IGNvcmUgZGV2ZWxvcGVyIHN0eWxlcyAoZGV2ZWxvcGVyLmFuZHJvaWQuY29tKQotICAgUmVxdWlyZWQgYnkgamRpZmYKLSovCi0KLQotLyogUkVTRVQgU1RZTEVTICovCi0KLWh0bWwsYm9keSxkaXYsaDEsaDIsaDMsaDQsaDUsaDYscCxpbWcsCi1kbCxkdCxkZCxvbCx1bCxsaSx0YWJsZSxjYXB0aW9uLHRib2R5LAotdGZvb3QsdGhlYWQsdHIsdGgsdGQsZm9ybSxmaWVsZHNldCwKLWVtYmVkLG9iamVjdCxhcHBsZXQgewotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6IDA7Ci0gIGJvcmRlcjogMDsKLX0KLQotLyogQkFTSUNTICovCi0KLWh0bWwsIGJvZHkgewotICBvdmVyZmxvdzpoaWRkZW47IC8qIGtlZXBzIHNjcm9sbGJhciBvZmYgSUUgKi8KLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotfQotCi1ib2R5IHsKLSAgZm9udC1mYW1pbHk6YXJpYWwsc2Fucy1zZXJpZjsKLSAgY29sb3I6IzAwMDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGNvbG9yOiMzMzM7Ci0gIGJhY2tncm91bmQtaW1hZ2U6dXJsKGltYWdlcy9iZ19mYWRlLmpwZyk7Ci0gIGJhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OwotfQotCi1hLCBhIGNvZGUgewotICBjb2xvcjojMDA2Njk5OwotfQotCi1hOmFjdGl2ZSwKLWE6YWN0aXZlIGNvZGUgewotICBjb2xvcjojZjAwOwotfSAKLQotYTp2aXNpdGVkLAotYTp2aXNpdGVkIGNvZGUgewotICBjb2xvcjojMDA2Njk5OwotfQotCi1pbnB1dCwgc2VsZWN0LAotdGV4dGFyZWEsIG9wdGlvbiwgbGFiZWwgewotICBmb250LWZhbWlseTppbmhlcml0OwotICBmb250LXNpemU6aW5oZXJpdDsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MDsKLSAgdmVydGljYWwtYWxpZ246bWlkZGxlOwotfQotCi1vcHRpb24gewotICBwYWRkaW5nOjAgNHB4OwotfQotCi1wLCBmb3JtIHsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MCAwIDFlbTsKLX0KLQotY29kZSwgcHJlIHsKLSAgY29sb3I6IzAwNzAwMDsKLSAgZm9udC1mYW1pbHk6bW9ub3NwYWNlOwotICBsaW5lLWhlaWdodDoxZW07Ci19Ci0KLXZhciB7Ci0gIGNvbG9yOiMwMDcwMDA7Ci0gIGZvbnQtc3R5bGU6aXRhbGljOwotfQotCi1wcmUgewotICBib3JkZXI6MXB4IHNvbGlkICNjY2M7Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZhZmFmYTsKLSAgcGFkZGluZzoxMHB4OwotICBtYXJnaW46MCAwIDFlbSAxZW07Ci0gIG92ZXJmbG93OmF1dG87Ci0gIGxpbmUtaGVpZ2h0OmluaGVyaXQ7IC8qIGZpeGVzIHZlcnRpY2FsIHNjcm9sbGluZyBpbiB3ZWJraXQgKi8KLX0KLQotaDEsaDIsaDMsaDQsaDUgewotICBtYXJnaW46MWVtIDA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotcCx1bCxvbCxkbCxkZCxkdCxsaSB7Ci0gIGxpbmUtaGVpZ2h0OjEuM2VtOwotfQotCi11bCxvbCB7Ci0gIG1hcmdpbjowIDAgLjhlbTsKLSAgcGFkZGluZzowIDAgMCAyZW07Ci19Ci0KLWxpIHsKLSAgcGFkZGluZzowIDAgLjVlbTsKLX0KLQotZGwgewotICBtYXJnaW46MCAwIDFlbSAwOwotICBwYWRkaW5nOjA7Ci19Ci0KLWR0IHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotZGQgewotICBtYXJnaW46MCAwIDFlbTsKLSAgcGFkZGluZzowIDAgMCAyZW07Ci19Ci0KLWxpIHAgewotICBtYXJnaW46LjVlbSAwIDA7Ci19Ci0KLWRkIHAgewotICBtYXJnaW46MWVtIDAgMDsKLX0KLQotbGkgcHJlLCBsaSB0YWJsZSwgbGkgaW1nIHsKLSAgbWFyZ2luOi41ZW0gMCAwIDFlbTsKLX0KLQotZGQgcHJlLAotI2pkLWNvbnRlbnQgZGQgdGFibGUsCi0jamQtY29udGVudCBkZCBpbWcgewotICBtYXJnaW46MWVtIDAgMCAxZW07Ci19Ci0KLWxpIHVsLAotbGkgb2wsCi1kZCB1bCwKLWRkIG9sIHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6IDAgMCAwIDJlbTsKLX0KLQotbGkgbGksCi1kZCBsaSB7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOi41ZW0gMCAwOwotfQotCi1kbCBkbCwKLW9sIGRsLAotdWwgZGwgewotICBtYXJnaW46MCAwIDFlbTsKLSAgcGFkZGluZzowOwotfQotCi10YWJsZSB7Ci0gIGZvbnQtc2l6ZToxZW07Ci0gIG1hcmdpbjowIDAgMWVtOwotICBwYWRkaW5nOjA7Ci0gIGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKLSAgYm9yZGVyLXdpZHRoOjA7Ci0gIGVtcHR5LWNlbGxzOnNob3c7Ci19Ci0KLXRkLHRoIHsKLSAgYm9yZGVyOjFweCBzb2xpZCAjY2NjOwotICBwYWRkaW5nOjZweCAxMnB4OwotICB0ZXh0LWFsaWduOmxlZnQ7Ci0gIHZlcnRpY2FsLWFsaWduOnRvcDsKLSAgYmFja2dyb3VuZC1jb2xvcjppbmhlcml0OwotfQotCi10aCB7Ci0gIGJhY2tncm91bmQtY29sb3I6I2RlZThmMTsKLX0KLQotdGQgPiBwOmxhc3QtY2hpbGQgewotICBtYXJnaW46MDsKLX0KLQotaHIuYmx1ZSB7Ci0gIGJhY2tncm91bmQtY29sb3I6I0RERjBGMjsKLSAgYm9yZGVyOm5vbmU7Ci0gIGhlaWdodDo1cHg7Ci0gIG1hcmdpbjoyMHB4IDAgMTBweDsKLX0KLQotYmxvY2txdW90ZSB7Ci0gIG1hcmdpbjogMCAwIDFlbSAxZW07Ci0gIHBhZGRpbmc6IDAgNGVtIDAgMWVtOwotICBib3JkZXItbGVmdDoycHggc29saWQgI2VlZTsKLX0KLS8qIExBWU9VVCAqLwotCi0jYm9keS1jb250ZW50IHsKLSAgLyogIlByZWxpbWluYXJ5IiB3YXRlcm1hcmsgZm9yIHByZXZpZXcgcmVsZWFzZXMgYW5kIGludGVyaW0gYnVpbGRzLgotICBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IHVybChpbWFnZXMvcHJlbGltaW5hcnkucG5nKSByZXBlYXQgc2Nyb2xsIDAgMDsgKi8KLSAgbWFyZ2luOjA7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICB3aWR0aDoxMDAlOwotfQotCi0jaGVhZGVyIHsKLSAgaGVpZ2h0OiAxMTRweDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci0gIHotaW5kZXg6MTAwOwotICBtaW4td2lkdGg6Njc1cHg7IC8qIG1pbiB3aWR0aCBmb3IgdGhlIHRhYnMsIGJlZm9yZSB0aGV5IHdyYXAgKi8KLSAgcGFkZGluZzowIDEwcHg7Ci0gIGJvcmRlci1ib3R0b206M3B4IHNvbGlkICM5NGI5MjI7Ci19Ci0KLSNoZWFkZXJMZWZ0ewotICBwYWRkaW5nOiAyNXB4IDAgMDsKLX0KLQotI2hlYWRlckxlZnQgaW1newotICBoZWlnaHQ6NTBweDsKLSAgd2lkdGg6MTgwcHg7Ci19Ci0KLSNoZWFkZXJSaWdodCB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICByaWdodDowOwotICB0b3A6MDsKLSAgdGV4dC1hbGlnbjpyaWdodDsKLX0KLQotLyogVGFicyBpbiB0aGUgaGVhZGVyICovCi0KLSNoZWFkZXIgdWwgewotICBsaXN0LXN0eWxlOiBub25lOwotICBtYXJnaW46IDdweCAwIDA7Ci0gIHBhZGRpbmc6IDA7Ci0gIGhlaWdodDogMjlweDsKLX0KLQotI2hlYWRlciBsaSB7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW46IDBweCAycHggMHB4IDBweDsKLSAgcGFkZGluZzowOwotfQotCi0jaGVhZGVyIGxpIGEgewotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2JnX2ltYWdlc19zcHJpdGUucG5nKTsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNThweDsKLSAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLSAgY29sb3I6ICM2NjY7Ci0gIGZvbnQtc2l6ZTogMTNweDsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIHdpZHRoOiA5NHB4OwotICBoZWlnaHQ6IDI5cHg7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgbWFyZ2luOiAwcHg7Ci19Ci0KLSNoZWFkZXIgbGkgYTpob3ZlciB7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYmdfaW1hZ2VzX3Nwcml0ZS5wbmcpOwotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yOXB4OwotICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwotfQotCi0jaGVhZGVyIGxpIGEgc3BhbiB7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICB0b3A6N3B4OwotfQotCi0jaGVhZGVyIGxpIGEgc3BhbitzcGFuIHsKLSAgZGlzcGxheTpub25lOwotfQotCi0vKiB0YWIgaGlnaGxpZ2h0aW5nICovCi0KLS5ob21lICNob21lLWxpbmsgYSwKLS5ndWlkZSAjZ3VpZGUtbGluayBhLAotLnJlZmVyZW5jZSAjcmVmZXJlbmNlLWxpbmsgYSwKLS5zZGsgI3Nkay1saW5rIGEsCi0ucmVzb3VyY2VzICNyZXNvdXJjZXMtbGluayBhLAotLnZpZGVvcyAjdmlkZW9zLWxpbmsgYSB7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYmdfaW1hZ2VzX3Nwcml0ZS5wbmcpOwotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7Ci0gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Ci0gIGNvbG9yOiAjZmZmOwotICBmb250LXdlaWdodDogYm9sZDsKLSAgY3Vyc29yOmRlZmF1bHQ7Ci19Ci0KLS5ob21lICNob21lLWxpbmsgYTpob3ZlciwKLS5ndWlkZSAjZ3VpZGUtbGluayBhOmhvdmVyLAotLnJlZmVyZW5jZSAjcmVmZXJlbmNlLWxpbmsgYTpob3ZlciwKLS5zZGsgI3Nkay1saW5rIGE6aG92ZXIsCi0ucmVzb3VyY2VzICNyZXNvdXJjZXMtbGluayBhOmhvdmVyLAotLnZpZGVvcyAjdmlkZW9zLWxpbmsgIGE6aG92ZXIgewotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2JnX2ltYWdlc19zcHJpdGUucG5nKTsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOwotfQotCi0jaGVhZGVyTGlua3MgewotICBtYXJnaW46MTBweCAxMHB4IDAgMDsKLSAgaGVpZ2h0OjEzcHg7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdmVydGljYWwtYWxpZ246IHRvcDsKLX0KLQotI2hlYWRlckxpbmtzIGEgewotICBjb2xvcjogIzdGQTlCNTsKLX0KLQotI2hlYWRlckxpbmtzIGltZyB7Ci0gIHZlcnRpY2FsLWFsaWduOm1pZGRsZTsKLX0KLQotI2xhbmd1YWdlIHsKLSAgbWFyZ2luOjAgMTBweCAwIDRweDsKLX0KLQotI3NlYXJjaCB7Ci0gIGhlaWdodDo0NXB4OwotICBtYXJnaW46MTVweCAxMHB4IDAgMDsKLX0KLQotLyogTUFJTiBCT0RZICovCi0KLSNtYWluQm9keUZsdWlkIHsKLSAgbWFyZ2luOiAyMHB4IDEwcHg7Ci0gIGNvbG9yOiMzMzM7Ci19Ci0KLSNtYWluQm9keUZpeGVkIHsKLSAgbWFyZ2luOiAyMHB4IDEwcHg7Ci0gIGNvbG9yOiAjMzMzOwotICB3aWR0aDo5MzBweDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0KLSNtYWluQm9keUZpeGVkIGgzLAotI21haW5Cb2R5Rmx1aWQgaDMgewotICBjb2xvcjojMzM2NjY2OwotICBmb250LXNpemU6MS4yNWVtOwotICBtYXJnaW46IDBlbSAwZW0gMGVtIDBlbTsKLSAgcGFkZGluZy1ib3R0b206LjVlbTsKLX0KLQotI21haW5Cb2R5Rml4ZWQgaDIsCi0jbWFpbkJvZHlGbHVpZCBoMiB7Ci0gIGNvbG9yOiMzMzY2NjY7Ci0gIGZvbnQtc2l6ZToxLjI1ZW07Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZy1ib3R0b206LjVlbTsKLX0KLQotI21haW5Cb2R5Rml4ZWQgaDEsCi0jbWFpbkJvZHlGbHVpZCBoMSB7Ci0gIGNvbG9yOiM0MzVBNkU7Ci0gIGZvbnQtc2l6ZToxLjdlbTsKLSAgbWFyZ2luOiAxZW0gMDsKLX0KLQotI21haW5Cb2R5Rml4ZWQgLmdyZWVuLAotI21haW5Cb2R5Rmx1aWQgLmdyZWVuLAotI2pkLWNvbnRlbnQgLmdyZWVuIHsKLSAgY29sb3I6IzdCQjAyNjsKLSAgYmFja2dyb3VuZC1jb2xvcjpub25lOwotfQotCi0jbWFpbkJvZHlMZWZ0IHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHdpZHRoOiA2MDBweDsKLSAgbWFyZ2luLXJpZ2h0OiAyMHB4OwotICBjb2xvcjogIzMzMzsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0KLWRpdi5pbmRlbnQgewotICBtYXJnaW4tbGVmdDogNDBweDsKLSAgbWFyZ2luLXJpZ2h0OiA3MHB4OwotfQotCi0jbWFpbkJvZHlMZWZ0IHAgewotICBjb2xvcjogIzMzMzsKLSAgZm9udC1zaXplOiAxM3B4OwotfQotCi0jbWFpbkJvZHlMZWZ0IHAuYmx1ZSB7Ci0gIGNvbG9yOiAjNjY5OTk5OwotfQotCi0jbWFpbkJvZHlMZWZ0ICNjb21tdW5pdHlEaXYgewotICBmbG9hdDogbGVmdDsKLSAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL2JnX2NvbW11bml0eV9sZWZ0RGl2LmpwZyk7Ci0gIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Ci0gIHdpZHRoOiA1ODFweDsKLSAgaGVpZ2h0OiAzNDdweDsKLSAgcGFkZGluZzogMjBweCAwcHggMHB4IDIwcHg7Ci19Ci0KLSNtYWluQm9keVJpZ2h0IHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHdpZHRoOiAzMDBweDsKLSAgY29sb3I6ICMzMzM7Ci19Ci0KLSNtYWluQm9keVJpZ2h0IHAgewotICBwYWRkaW5nLXJpZ2h0OiA1MHB4OwotICBjb2xvcjogIzMzMzsKLX0KLQotI21haW5Cb2R5UmlnaHQgdGFibGUgewotICB3aWR0aDogMTAwJTsKLX0KLQotI21haW5Cb2R5UmlnaHQgdGQgewotICBib3JkZXI6MHB4IHNvbGlkICM2NjY7Ci0gIHBhZGRpbmc6MHB4IDVweDsKLSAgdGV4dC1hbGlnbjpsZWZ0OwotfQotCi0jbWFpbkJvZHlSaWdodCB0ZCBwIHsKLSAgbWFyZ2luOjAgMCAxZW0gMDsKLX0KLQotI21haW5Cb2R5UmlnaHQgLmJsdWVCb3JkZXJCb3ggewotICBib3JkZXI6NXB4IHNvbGlkICNkZGYwZjI7Ci0gIHBhZGRpbmc6MThweCAxOHB4IDE4cHggMThweDsKLSAgdGV4dC1hbGlnbjpsZWZ0OwotfQotCi0jbWFpbkJvZHlGaXhlZCAuc2VwZXJhdG9yIHsKLSAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL2hyX2dyYXlfc2lkZS5qcGcpOwotICBiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7Ci0gIHdpZHRoOiAxMDAlOwotICBmbG9hdDogbGVmdDsKLSAgY2xlYXI6IGJvdGg7Ci19Ci0KLSNtYWluQm9keUJvdHRvbSB7Ci0gIGZsb2F0OiBsZWZ0OwotICB3aWR0aDogMTAwJTsKLSAgY2xlYXI6Ym90aDsKLSAgY29sb3I6ICMzMzM7Ci19Ci0KLSNtYWluQm9keUJvdHRvbSAuc2VwZXJhdG9yIHsKLSAgYmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL2hyX2dyYXlfbWFpbi5qcGcpOwotICBiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7Ci0gIHdpZHRoOiAxMDAlOwotICBmbG9hdDogbGVmdDsKLSAgY2xlYXI6IGJvdGg7Ci19Ci0KLS8qIEZPT1RFUiAqLwotCi0jZm9vdGVyIHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHdpZHRoOjkwJTsKLSAgbWFyZ2luOiAyMHB4OwotICBjb2xvcjogI2FhYTsKLSAgZm9udC1zaXplOiAxMXB4OwotfQotCi0jZm9vdGVyIGEgewotICBjb2xvcjogI2FhYTsKLSAgZm9udC1zaXplOiAxMXB4OwotfQotCi0jZm9vdGVyIGE6aG92ZXIgewotICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLSAgY29sb3I6I2FhYTsKLX0KLQotI2Zvb3RlcmxpbmtzIHsKLSAgbWFyZ2luLXRvcDoycHg7Ci19Ci0KLSNmb290ZXJsaW5rcyBhLAotI2Zvb3RlcmxpbmtzIGE6dmlzaXRlZCB7Ci0gIGNvbG9yOiMwMDY2OTk7Ci19Ci0KLS8qIFNFQVJDSCBGSUxURVIgKi8KLQotI3NlYXJjaF9hdXRvY29tcGxldGUgewotICBjb2xvcjojYWFhOwotfQotCi0jc2VhcmNoLWJ1dHRvbiB7Ci0gIGRpc3BsYXk6aW5saW5lOwotfQotCi0jc2VhcmNoX2ZpbHRlcmVkX2RpdiB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICBtYXJnaW4tdG9wOi0xcHg7Ci0gIHotaW5kZXg6MTAxOwotICBib3JkZXI6MXB4IHNvbGlkICNCQ0NERjA7Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKLX0KLQotI3NlYXJjaF9maWx0ZXJlZCB7Ci0gIG1pbi13aWR0aDoxMDAlOwotfQotI3NlYXJjaF9maWx0ZXJlZCB0ZHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzY2OTk5OTsKLSAgbGluZS1oZWlnaHQ6MS41ZW07Ci19Ci0KLSNzZWFyY2hfZmlsdGVyZWQgLmpkLXNlbGVjdGVkIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzk0YjkyMjsKLSAgY3Vyc29yOnBvaW50ZXI7Ci19Ci0jc2VhcmNoX2ZpbHRlcmVkIC5qZC1zZWxlY3RlZCwKLSNzZWFyY2hfZmlsdGVyZWQgLmpkLXNlbGVjdGVkIGEgewotICBjb2xvcjojZmZmOwotfQotCi0ubm8tZGlzcGxheSB7Ci0gIGRpc3BsYXk6IG5vbmU7Ci19Ci0KLS5qZC1hdXRvY29tcGxldGUgewotICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gIHBhZGRpbmctbGVmdDogNnB4OwotICBwYWRkaW5nLXJpZ2h0OiA2cHg7Ci0gIHBhZGRpbmctdG9wOiAxcHg7Ci0gIHBhZGRpbmctYm90dG9tOiAxcHg7Ci0gIGZvbnQtc2l6ZTogMC44MWVtOwotICBib3JkZXI6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgbGluZS1oZWlnaHQ6IDEuMDVlbTsKLX0KLQotLnNob3ctcm93IHsKLSAgZGlzcGxheTogdGFibGUtcm93OwotfQotLmhpZGUtcm93IHsKLSAgZGlzcGxheTogaGlkZGVuOwotfQotCi0vKiBTRUFSQ0ggKi8KLQotLyogcmVzdHJpY3QgZ2xvYmFsIHNlYXJjaCBmb3JtIHdpZHRoICovCi0jc2VhcmNoRm9ybSB7Ci0gIHdpZHRoOjM1MHB4OwotfQotCi0jc2VhcmNoVHh0IHsKLSAgd2lkdGg6MjAwcHg7Ci19Ci0KLS8qIGRpc2FibGUgdHdpZGRsZSBhbmQgc2l6ZSBzZWxlY3RvcnMgZm9yIGxlZnQgY29sdW1uICovCi0jbGVmdFNlYXJjaENvbnRyb2wgZGl2IHsKLSAgd2lkdGg6IDEwMCU7Ci19Ci0KLSNsZWZ0U2VhcmNoQ29udHJvbCAuZ3NjLXR3aWRkbGUgewotICBiYWNrZ3JvdW5kLWltYWdlIDogbm9uZTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIHRkLCAjc2VhcmNoRm9ybSB0ZCB7Ci0gIGJvcmRlcjogMHB4IHNvbGlkICMwMDA7Ci19Ci0KLSNsZWZ0U2VhcmNoQ29udHJvbCAuZ3NjLXJlc3VsdHNIZWFkZXIgLmdzYy10aXRsZSB7Ci0gIHBhZGRpbmctbGVmdCA6IDBweDsKLSAgZm9udC13ZWlnaHQgOiBib2xkOwotICBmb250LXNpemUgOiAxM3B4OwotICBjb2xvcjojMDA2Njk5OwotICBkaXNwbGF5IDogbm9uZTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIC5nc2MtcmVzdWx0c0hlYWRlciBkaXYuZ3NjLXJlc3VsdHMtc2VsZWN0b3IgewotICBkaXNwbGF5IDogbm9uZTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIC5nc2MtcmVzdWx0c1Jvb3QgewotICBwYWRkaW5nLXRvcCA6IDZweDsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIGRpdi5ncy12aXNpYmxlVXJsLWxvbmcgewotICBkaXNwbGF5IDogYmxvY2s7Ci0gIGNvbG9yOiMwMDY2OTk7Ci19Ci0KLS5nc2Mtd2ViUmVzdWx0IGRpdi5ncy12aXNpYmxlVXJsLXNob3J0LAotdGFibGUuZ3NjLWJyYW5kaW5nLAotLmdzYy1jbGVhci1idXR0b24gewotICBkaXNwbGF5IDogbm9uZTsKLX0KLQotLmdzYy1jdXJzb3ItYm94IC5nc2MtY3Vyc29yIGRpdi5nc2MtY3Vyc29yLXBhZ2UsCi0uZ3NjLWN1cnNvci1ib3ggLmdzYy10cmFpbGluZy1tb3JlLXJlc3VsdHMgYS5nc2MtdHJhaWxpbmctbW9yZS1yZXN1bHRzLAotI2xlZnRTZWFyY2hDb250cm9sIGEsCi0jbGVmdFNlYXJjaENvbnRyb2wgYSBiIHsKLSAgY29sb3I6IzAwNjY5OTsKLX0KLQotLmdzYy1yZXN1bHRzSGVhZGVyIHsKLSAgZGlzcGxheTogbm9uZTsKLX0KLQotLyogRGlzYWJsZSBidWlsdCBpbiBzZWFyY2ggZm9ybXMgKi8KLS5nc2MtY29udHJvbCBmb3JtLmdzYy1zZWFyY2gtYm94IHsKLSAgZGlzcGxheSA6IG5vbmU7Ci19Ci10YWJsZS5nc2Mtc2VhcmNoLWJveCB7Ci0gIG1hcmdpbjo2cHggMCAwIDA7Ci0gIGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKLX0KLQotdGQuZ3NjLWlucHV0IHsKLSAgcGFkZGluZzowIDJweDsKLSAgd2lkdGg6MTAwJTsKLSAgdmVydGljYWwtYWxpZ246bWlkZGxlOwotfQotCi1pbnB1dC5nc2MtaW5wdXQgewotICBib3JkZXI6MXB4IHNvbGlkICNCQ0NERjA7Ci0gIHdpZHRoOjk5JTsKLSAgcGFkZGluZy1sZWZ0OjJweDsKLSAgZm9udC1zaXplOi45NWVtOwotfQotCi10ZC5nc2Mtc2VhcmNoLWJ1dHRvbiB7Ci0gIHRleHQtYWxpZ246IHJpZ2h0OwotICBwYWRkaW5nOjA7Ci0gIHZlcnRpY2FsLWFsaWduOnRvcDsKLX0KLQotI3NlYXJjaC1idXR0b24gewotICBtYXJnaW46MCAwIDAgMnB4OwotICBmb250LXNpemU6MTFweDsKLX0KLQotLyogc2VhcmNoIHJlc3VsdCB0YWJzICovCi0KLSNkb2MtY29udGVudCAuZ3NjLWNvbnRyb2wgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLQotI2RvYy1jb250ZW50IC5nc2MtdGFic0FyZWEgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgd2hpdGUtc3BhY2U6bm93cmFwOwotfQotCi0jZG9jLWNvbnRlbnQgLmdzYy10YWJIZWFkZXIgewotICBwYWRkaW5nOiAzcHggNnB4OwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgd2lkdGg6YXV0bzsKLX0KLQotI2RvYy1jb250ZW50IC5nc2MtdGFiSGVhZGVyLmdzYy10YWJoQWN0aXZlIHsKLSAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICM5NEI5MjI7Ci19Ci0KLSNkb2MtY29udGVudCBoMiNzZWFyY2hUaXRsZSB7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI2RvYy1jb250ZW50IC5nc2MtcmVzdWx0c2JveC12aXNpYmxlIHsKLSAgcGFkZGluZzoxZW0gMCAwIDZweDsKLX0KLQotLyogQ0FST1VTRUwgKi8KLQotI2hvbWVNaWRkbGUgewotICBwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0gIGZsb2F0OiBsZWZ0OwotICB3aWR0aDogNTg0cHg7Ci0gIGhlaWdodDogNjI3cHg7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotfQotCi0jdG9wQW5ub3VuY2VtZW50IHsKLSAgYmFja2dyb3VuZDp1cmwoaW1hZ2VzL2hvbWUvYmdfaG9tZV9hbm5vdW5jZW1lbnQucG5nKSBuby1yZXBlYXQgMCAwOwotfQotICAKLSNob21lVGl0bGUgewotICBwYWRkaW5nOjE1cHggMTVweCAwOwotICBoZWlnaHQ6MzBweDsKLX0KLQotI2hvbWVUaXRsZSBoMiB7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI2Fubm91bmNlbWVudC1ibG9jayB7Ci0gIHBhZGRpbmc6MCAxNXB4IDA7Ci0gIG92ZXJmbG93OmhpZGRlbjsKLSAgYmFja2dyb3VuZDogdXJsKGltYWdlcy9ocl9ncmF5X3NpZGUuanBnKSBuby1yZXBlYXQgMTVweCAwOwotICB6b29tOjE7Ci19Ci0KLSNhbm5vdW5jZW1lbnQtYmxvY2s+KiB7Ci0gIHBhZGRpbmc6MTVweCAwIDA7Ci19Ci0KLSNhbm5vdW5jZW1lbnQtYmxvY2sgaW1nIHsKLSAgZmxvYXQ6bGVmdDsKLSAgbWFyZ2luOjAgMzBweCAwIDA7Ci19Ci0KLSNhbm5vdW5jZW1lbnQgewotICBmbG9hdDpsZWZ0OwotICBtYXJnaW46MDsKLX0KLQotI2Nhcm91c2VsIHsKLSAgYmFja2dyb3VuZDp1cmwoaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbC5wbmcpIG5vLXJlcGVhdCAwIDA7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICBoZWlnaHQ6NDAwcHg7Ci19Ci0KLSNjYXJvdXNlbE1haW4gewotICBiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbF9ib2FyZC5wbmcpIDAgMCBuby1yZXBlYXQ7Ci0gIGhlaWdodDphdXRvOwotICBwYWRkaW5nOiAyNXB4IDIxcHggMDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgem9vbToxOyAvKklFNiovCi19Ci0KLSNjYXJvdXNlbE1haW4gaW1nIHsKLSAgbWFyZ2luOjA7Ci19Ci0KLSNjYXJvdXNlbE1haW4gLmJ1bGxldGluRGVzYyBoMyB7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjA7Ci19Ci0KLSNjYXJvdXNlbE1haW4gLmJ1bGxldGluRGVzYyBwIHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MC43ZW0gMCAwOwotfQotCi0jY2Fyb3VzZWxXaGVlbCB7Ci0gIGJhY2tncm91bmQ6IHVybChpbWFnZXMvaG9tZS9iZ19ob21lX2Nhcm91c2VsX3doZWVsLnBuZykgMCAwIG5vLXJlcGVhdDsKLSAgcGFkZGluZy10b3A6NDBweDsKLSAgaGVpZ2h0OjE1MHB4OwotfQotCi0uY2xlYXJlciB7IGNsZWFyOmJvdGg7IH0KLQotYSNhcnJvdy1sZWZ0LCBhI2Fycm93LXJpZ2h0IHsKLSAgZmxvYXQ6bGVmdDsKLSAgd2lkdGg6NDJweDsKLSAgaGVpZ2h0OjQycHg7Ci0gIGJhY2tncm91bmQtaW1hZ2U6dXJsKGltYWdlcy9ob21lL2Nhcm91c2VsX2J1dHRvbnNfc3ByaXRlLnBuZyk7Ci0gIGJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsKLX0KLWEjYXJyb3ctbGVmdCB7Ci0gIG1hcmdpbjozNXB4IDNweCAwIDEwcHg7Ci19Ci1hI2Fycm93LXJpZ2h0IHsKLSAgbWFyZ2luOjM1cHggMTBweCAwIDA7Ci19Ci1hLmFycm93LWxlZnQtb2ZmLAotYSNhcnJvdy1sZWZ0LmFycm93LWxlZnQtb2ZmOmhvdmVyIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjowIDA7Ci19Ci1hLmFycm93LXJpZ2h0LW9mZiwKLWEjYXJyb3ctcmlnaHQuYXJyb3ctcmlnaHQtb2ZmOmhvdmVyIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjotNDJweCAwOwotfQotYSNhcnJvdy1sZWZ0OmhvdmVyIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjowIC00MnB4OwotfQotYSNhcnJvdy1yaWdodDpob3ZlciB7Ci0gIGJhY2tncm91bmQtcG9zaXRpb246LTQycHggLTQycHg7Ci19Ci1hLmFycm93LWxlZnQtb24gewotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMDsKLX0KLWEuYXJyb3ctcmlnaHQtb24gewotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOi00MnB4IDA7Ci19Ci1hLmFycm93LXJpZ2h0LW9mZiwKLWEuYXJyb3ctbGVmdC1vZmYgewotICBjdXJzb3I6ZGVmYXVsdDsKLX0KLQotLmFwcC1saXN0LWNvbnRhaW5lciB7Ci0gIG1hcmdpbjowIDIwcHg7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICB3aWR0aDoxMDAlOwotfQotCi1kaXYjbGlzdC1jbGlwIHsKLSAgaGVpZ2h0OjExMHB4OwotICB3aWR0aDo0MzhweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgZmxvYXQ6bGVmdDsKLX0KLQotZGl2I2FwcC1saXN0IHsKLSAgbGVmdDowOwotICB6LWluZGV4OjE7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICBtYXJnaW46MTFweCAwIDA7Ci0gIF9tYXJnaW4tdG9wOjEzcHg7Ci0gIHdpZHRoOjEwMDAlOwotfQotCi0jYXBwLWxpc3QgYSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OmxlZnQ7Ci0gIGhlaWdodDo5MHB4OwotICB3aWR0aDo5MHB4OwotICBtYXJnaW46MCAyNHB4IDA7Ci0gIHBhZGRpbmc6M3B4OwotICBiYWNrZ3JvdW5kOiM5OWNjY2M7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czo3cHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czo3cHg7Ci0gIGJvcmRlci1yYWRpdXM6N3B4OwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgdGV4dC1hbGlnbjpjZW50ZXI7Ci0gIGZvbnQtc2l6ZToxMXB4OwotICBsaW5lLWhlaWdodDoxMXB4OwotfQotCi0jYXBwLWxpc3QgYSBzcGFuIHsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci0gIHRvcDotNHB4OwotfQotCi0jYXBwLWxpc3QgaW1nIHsKLSAgd2lkdGg6OTBweDsKLSAgaGVpZ2h0OjcwcHg7Ci0gIG1hcmdpbjowOwotfQotCi0jYXBwLWxpc3QgYS5zZWxlY3RlZCwKLSNhcHAtbGlzdCBhOmFjdGl2ZS5zZWxlY3RlZCwKLSNhcHAtbGlzdCBhOmhvdmVyLnNlbGVjdGVkIHsKLSAgYmFja2dyb3VuZDojQTRDNjM5OwotICBjb2xvcjojZmZmOwotICBjdXJzb3I6ZGVmYXVsdDsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci19Ci0KLSNhcHAtbGlzdCBhOmhvdmVyLAotI2FwcC1saXN0IGE6YWN0aXZlIHsKLSAgYmFja2dyb3VuZDojZmY5OTAwOwotfQotCi0jYXBwLWxpc3QgYTpob3ZlciBzcGFuLAotI2FwcC1saXN0IGE6YWN0aXZlIHNwYW4gewotICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotfQotCi0jZHJvaWQtbmFtZSB7Ci0gIHBhZGRpbmctdG9wOi41ZW07Ci0gIGNvbG9yOiM2NjY7Ci0gIHBhZGRpbmctYm90dG9tOi4yNWVtOwotfQotCi0vKklFNiovCi0qIGh0bWwgI2FwcC1saXN0IGEgeyB6b29tOiAxOyBtYXJnaW46MCAyNHB4IDAgMTVweDt9Ci0KLSogaHRtbCAjbGlzdC1jbGlwIHsKLSAgd2lkdGg6NDMwcHggIWltcG9ydGFudDsKLX0KLQotLypjYXJvdXNlbCBidWxsZXRpbiBsYXlvdXRzKi8KLS8qNDYwcHggd2lkdGgqLwotLyoxODVweCBoZWlnaHQqLwotLmltZy1sZWZ0IHsKLSAgZmxvYXQ6bGVmdDsKLSAgd2lkdGg6MjMwcHg7Ci0gIG92ZXJmbG93OmhpZGRlbjsKLSAgcGFkZGluZzo4cHggMCA4cHggOHB4OwotfQotLmRlc2MtcmlnaHQgewotICBmbG9hdDpsZWZ0OwotICB3aWR0aDoyNzBweDsKLSAgcGFkZGluZzoxMHB4OwotfQotLmltZy1yaWdodCB7Ci0gIGZsb2F0OnJpZ2h0OwotICB3aWR0aDoyMjBweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBwYWRkaW5nOjhweCA4cHggOHB4IDA7Ci19Ci0uZGVzYy1sZWZ0IHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIHdpZHRoOjI4MHB4OwotICBwYWRkaW5nOjEwcHg7Ci0gIHRleHQtYWxpZ246cmlnaHQ7Ci19Ci0uaW1nLXRvcCB7Ci0gIHBhZGRpbmc6MjBweCAyMHB4IDA7Ci19Ci0uZGVzYy1ib3R0b20gewotICBwYWRkaW5nOjEwcHg7Ci19Ci0KLQotLyogVklERU8gUEFHRSAqLwotCi0jbWFpbkJvZHlMZWZ0LnZpZGVvUGxheWVyIHsKLSAgd2lkdGg6NTcwcHg7Ci19Ci0KLSNtYWluQm9keVJpZ2h0LnZpZGVvUGxheWVyIHsKLSAgd2lkdGg6MzMwcHg7Ci19Ci0KLS8qIHBsYXllciAqLwotCi0jdmlkZW9QbGF5ZXJCb3ggewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjREFGM0ZDOwotICBib3JkZXItcmFkaXVzOjdweDsKLSAgLW1vei1ib3JkZXItcmFkaXVzOjdweDsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOjdweDsKLSAgd2lkdGg6NTMwcHg7Ci0gIHBhZGRpbmc6MjBweDsKLSAgYm9yZGVyOjFweCBzb2xpZCAjZDNlY2Y1OwotICBib3gtc2hhZG93OjJweCAzcHggMXB4ICNlZWU7Ci0gIC1tb3otYm94LXNoYWRvdzoycHggM3B4IDFweCAjZWVlOwotICAtd2Via2l0LWJveC1zaGFkb3c6MnB4IDNweCAxcHggI2VlZTsKLX0KLQotI3ZpZGVvQm9yZGVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjsKLSAgbWluLWhlaWdodDozOTlweDsKLSAgaGVpZ2h0OmF1dG8gIWltcG9ydGFudDsKLSAgYm9yZGVyOjFweCBzb2xpZCAjY2NkYWRhOwotICBib3JkZXItcmFkaXVzOjdweCA3cHggMCAwOwotICAtbW96LWJvcmRlci1yYWRpdXM6N3B4IDdweCAwIDA7Ci0gIC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czo3cHg7Ci0gIC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6N3B4OwotfQotCi0jdmlkZW9QbGF5ZXJUaXRsZSB7Ci0gIHdpZHRoOjUwMHB4OwotICBwYWRkaW5nOjE1cHggMTVweCAwOwotfQotCi0jdmlkZW9QbGF5ZXJUaXRsZSBoMiB7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIGZvbnQtc2l6ZToxLjJlbTsKLSAgY29sb3I6IzMzNjY2NjsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI29iamVjdFdyYXBwZXIgewotICBwYWRkaW5nOjE1cHggMTVweDsKLSAgaGVpZ2h0OjMzNHB4OwotICB3aWR0aDo1MDBweDsKLX0KLQotLyogcGxheWxpc3QgdGFicyAqLwotCi11bCN2aWRlb1RhYnMgewotICBsaXN0LXN0eWxlLXR5cGU6bm9uZTsKLSAgcGFkZGluZzowOwotICBjbGVhcjpib3RoOwotICBtYXJnaW46MDsKLSAgcGFkZGluZzogMjBweCAwIDAgMTVweDsKLSAgem9vbToxOyAvKiBJRTcvOCwgb3RoZXJ3aXNlIHRvcC1wYWRkaW5nIGlzIGRvdWJsZSAqLwotfQotCi11bCN2aWRlb1RhYnMgbGkgewotICBkaXNwbGF5OmlubGluZTsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MCAzcHggMCAwOwotICBsaW5lLWhlaWdodDoyZW07Ci19Ci0KLXVsI3ZpZGVvVGFicyBsaSBhIHsKLSAgYm9yZGVyLXJhZGl1czo3cHggN3B4IDAgMDsKLSAgLW1vei1ib3JkZXItcmFkaXVzOjdweCA3cHggMCAwOwotICAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6N3B4OwotICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjdweDsKLSAgYmFja2dyb3VuZDojOTVjMGQwOwotICBjb2xvcjojZmZmOwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgcGFkZGluZzouNDVlbSAxLjVlbTsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLX0KLQotdWwjdmlkZW9UYWJzIGxpLnNlbGVjdGVkIGEgewotICBmb250LXdlaWdodDpib2xkOwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgY29sb3I6IzU1NTsKLSAgYmFja2dyb3VuZDojZGFmM2ZjOwotICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZGFmM2ZjOwotfQotCi11bCN2aWRlb1RhYnMgbGk6aG92ZXIgYSB7Ci0gIGJhY2tncm91bmQ6Izg1YWNiYTsKLX0KLQotdWwjdmlkZW9UYWJzIGxpLnNlbGVjdGVkOmhvdmVyIGEgewotICBiYWNrZ3JvdW5kOiNkYWYzZmM7Ci19Ci0KLS8qIHBsYXlsaXN0cyAqLwotCi0jdmlkZW9zIHsKLSAgYmFja2dyb3VuZDojZGFmM2ZjOwotICBtYXJnaW4tYm90dG9tOjEuNWVtOwotICBwYWRkaW5nOjE1cHg7Ci0gIGJvcmRlci1yYWRpdXM6NXB4OwotICAtbW96LWJvcmRlci1yYWRpdXM6NXB4OwotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6NXB4OwotICBib3gtc2hhZG93OjJweCAzcHggMXB4ICNlZWU7Ci0gIC1tb3otYm94LXNoYWRvdzoycHggM3B4IDFweCAjZWVlOwotICAtd2Via2l0LWJveC1zaGFkb3c6MnB4IDNweCAxcHggI2VlZTsKLX0KLQotI3ZpZGVvcyBkaXYgewotICBkaXNwbGF5Om5vbmU7Ci19Ci0KLSN2aWRlb3MgZGl2LnNlbGVjdGVkIHsKLSAgZGlzcGxheTpibG9jazsKLX0KLQotdWwudmlkZW9QcmV2aWV3cyB7Ci0gIGxpc3Qtc3R5bGU6bm9uZTsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MDsKLSAgem9vbToxOyAvKiBJRSwgb3RoZXJ3aXNlLCBsYXlvdXQgZG9lc24ndCB1cGRhdGUgd2hlbiBzaG93aW5nICdtb3JlJyAqLwotfQotCi11bC52aWRlb1ByZXZpZXdzIGxpIHsKLSAgbWFyZ2luOjAgMCA1cHg7Ci0gIHBhZGRpbmc6MDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLQotI21haW5Cb2R5Rml4ZWQgdWwudmlkZW9QcmV2aWV3cyBoMyB7Ci0gIGZvbnQtc2l6ZTogMTJweDsKLSAgbWFyZ2luOjAgMCAxZW0gMTMwcHg7Ci0gIHBhZGRpbmc6MDsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgY29sb3I6aW5oZXJpdDsKLX0KLQotdWwudmlkZW9QcmV2aWV3cyBhIHsKLSAgbWFyZ2luOjFweDsKLSAgcGFkZGluZzoxMHB4OwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgaGVpZ2h0OjkwcHg7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGJvcmRlci1yYWRpdXM6NXB4OwotICAtbW96LWJvcmRlci1yYWRpdXM6NXB4OwotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6NXB4OwotICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OwotfQotCi11bC52aWRlb1ByZXZpZXdzIGE6aG92ZXIgewotICBiYWNrZ3JvdW5kLWNvbG9yOiNGRkY7Ci0gIGJvcmRlcjpub25lOyAvKiBJRTgsIG90aGVyd2lzZSwgYmcgZG9lc24ndCB3b3JrICovCi19Ci0KLXVsLnZpZGVvUHJldmlld3MgYS5zZWxlY3RlZCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGRjk5MDA7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3MgaW1nIHsKLSAgZmxvYXQ6bGVmdDsKLSAgY2xlYXI6bGVmdDsKLSAgbWFyZ2luOjA7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3MgaDMgewotICBmb250LXNpemU6MTJweDsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci0gIG1hcmdpbjowIDAgMWVtIDEzMHB4OwotICBwYWRkaW5nOjA7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3MgcCB7Ci0gIGZvbnQtc2l6ZTogMTJweDsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci0gIG1hcmdpbjowIDAgMS4yZW0gMTMwcHg7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3MgcC5mdWxsIHsKLSAgZGlzcGxheTpub25lOwotfQotCi11bC52aWRlb1ByZXZpZXdzIHNwYW4ubW9yZSB7Ci0gIHBhZGRpbmc6MCAwIDAgMTJweDsKLSAgYmFja2dyb3VuZDp1cmwoaW1hZ2VzL2Fycm93X2JsdWVsaW5rX2Rvd24ucG5nKSAwIDJweCBuby1yZXBlYXQ7Ci19Ci0KLXVsLnZpZGVvUHJldmlld3Mgc3Bhbi5sZXNzIHsKLSAgcGFkZGluZzowIDAgMCAxMnB4OwotICBiYWNrZ3JvdW5kOnVybChpbWFnZXMvYXJyb3dfYmx1ZWxpbmtfdXAucG5nKSAwIDJweCBuby1yZXBlYXQ7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLQotdWwudmlkZW9QcmV2aWV3cyBwLnRvZ2dsZSB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICBtYXJnaW46MDsKLSAgbWFyZ2luLXRvcDotMjNweDsgLyogaW5zdGVhZCBvZiBib3R0b206MjNweCwgYmVjYXVzZSBJRSB3b24ndCBkbyBpdCBjb3JyZWN0bHkgKi8KLSAgbGVmdDoxNDBweDsKLX0KLQotdWwudmlkZW9QcmV2aWV3cyBwLnRvZ2dsZSBhIHsKLSAgaGVpZ2h0OmF1dG87Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjA7Ci0gIHpvb206MTsgLyogSUU2LCBvdGhlcndpc2UgdGhlIG1hcmdpbiBjb25zaWRlcnMgdGhlIGltZyBvbiByZWRyYXdzICovCi19Ci0KLXVsLnZpZGVvUHJldmlld3MgcC50b2dnbGUgYTpob3ZlciB7Ci0gIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Ci0gIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQ7IC8qIElFNiwgb3RoZXJ3aXNlIGl0IGluaGVyaXRzIHdoaXRlICovCi19Ci0KLS8qIGZlYXR1cmVkIHZpZGVvcyAqLwotCi0jbWFpbkJvZHlSaWdodCBoMiB7Ci0gIHBhZGRpbmc6MCAwIDVweDsKLX0KLQotI21haW5Cb2R5UmlnaHQgdWwudmlkZW9QcmV2aWV3cyB7Ci0gIG1hcmdpbjoxMHB4IDAgMDsKLX0KLQotI21haW5Cb2R5UmlnaHQgdWwudmlkZW9QcmV2aWV3cyBsaSB7Ci0gIGZvbnQtc2l6ZToxMXB4OwotICBsaW5lLWhlaWdodDoxM3B4OwotICBtYXJnaW46MCAwIDVweDsKLSAgcGFkZGluZzowOwotfQotCi0jbWFpbkJvZHlSaWdodCB1bC52aWRlb1ByZXZpZXdzIGgzIHsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MDsKLSAgZm9udC1zaXplOjEwMCU7Ci19Ci0KLSNtYWluQm9keVJpZ2h0IHVsLnZpZGVvUHJldmlld3MgYSB7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBoZWlnaHQ6MTA4cHg7Ci0gIGJvcmRlcjoxcHggc29saWQgI0ZGRjsKLX0KLQotI21haW5Cb2R5UmlnaHQgdWwudmlkZW9QcmV2aWV3cyBhOmhvdmVyIHsKLSAgYm9yZGVyOjFweCBzb2xpZCAjQ0NEQURBOwotfQotCi0jbWFpbkJvZHlSaWdodCB1bC52aWRlb1ByZXZpZXdzIGEuc2VsZWN0ZWQgewotICBib3JkZXI6MXB4IHNvbGlkICNGRkY7Ci19Ci0KLSNtYWluQm9keVJpZ2h0IHVsLnZpZGVvUHJldmlld3MgcCB7Ci0gIGxpbmUtaGVpZ2h0OjEuMmVtOwotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjo0cHggMCAwIDEzMHB4OwotfQotCi0jbWFpbkJvZHlSaWdodCB1bC52aWRlb1ByZXZpZXdzIGltZyB7Ci0gIG1hcmdpbi10b3A6NXB4OwotfQotCi0vKiBQcmV0dHkgcHJpbnRpbmcgc3R5bGVzLiBVc2VkIHdpdGggcHJldHRpZnkuanMuICovCi0KLS5zdHIgeyBjb2xvcjogIzA4MDsgfQotLmt3ZCB7IGNvbG9yOiAjMDA4OyB9Ci0uY29tIHsgY29sb3I6ICM4MDA7IH0KLS50eXAgeyBjb2xvcjogIzYwNjsgfQotLmxpdCB7IGNvbG9yOiAjMDY2OyB9Ci0ucHVuIHsgY29sb3I6ICM2NjA7IH0KLS5wbG4geyBjb2xvcjogIzAwMDsgfQotZGwudGFnLWxpc3QgZHQgY29kZSwKLS50YWcgeyBjb2xvcjogIzAwODsgfQotZGwuYXRuLWxpc3QgZHQgY29kZSwKLS5hdG4geyBjb2xvcjogIzgyODsgfQotLmF0diB7IGNvbG9yOiAjMDgwOyB9Ci0uZGVjIHsgY29sb3I6ICM2MDY7IH0KLQotQG1lZGlhIHByaW50IHsKLSAgLnN0ciB7IGNvbG9yOiAjMDYwOyB9Ci0gIC5rd2QgeyBjb2xvcjogIzAwNjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLSAgLmNvbSB7IGNvbG9yOiAjNjAwOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLSAgLnR5cCB7IGNvbG9yOiAjNDA0OyBmb250LXdlaWdodDogYm9sZDsgfQotICAubGl0IHsgY29sb3I6ICMwNDQ7IH0KLSAgLnB1biB7IGNvbG9yOiAjNDQwOyB9Ci0gIC5wbG4geyBjb2xvcjogIzAwMDsgfQotICAudGFnIHsgY29sb3I6ICMwMDY7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0gIC5hdG4geyBjb2xvcjogIzQwNDsgfQotICAuYXR2IHsgY29sb3I6ICMwNjA7IH0KLX0KLQotCi0jdGl0bGUgewotICBib3JkZXItYm90dG9tOiA0cHggc29saWQgI2NjYzsKLSAgZGlzcGxheTpub25lOwotfQotCi0jdGl0bGUgaDEgewotICBjb2xvcjojMzM2NjY2OwotICBtYXJnaW46MDsKLSAgcGFkZGluZzogNXB4IDEwcHg7Ci0gIGZvbnQtc2l6ZTogMWVtOwotICBsaW5lLWhlaWdodDogMTVweDsKLX0KLQotI3RpdGxlIGgxIC5zbWFsbHsKLSAgY29sb3I6IzAwMDsKLSAgbWFyZ2luOjA7Ci0gIGZvbnQtc2l6ZTogMTNweDsKLSAgcGFkZGluZzowIDAgMCAxNXB4OwotfQotCi0vKiBTSURFIE5BVklHQVRJT04gKi8KLQotI3NpZGUtbmF2IHsKLSAgcGFkZGluZzowIDZweCAwIDA7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Ci0gIGZvbnQtc2l6ZToxMnB4OwotfQotCi0jcmVzaXplLXBhY2thZ2VzLW5hdiB7Ci0vKiBrZWVwcyB0aGUgcmVzaXplIGhhbmRsZSBiZWxvdyB0aGUgaC1zY3JvbGwgaGFuZGxlICovCi0gIGhlaWdodDoyNzBweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICBtYXgtaGVpZ2h0OjEwMCU7Ci19Ci0KLSNwYWNrYWdlcy1uYXYgewotICBoZWlnaHQ6MjcwcHg7Ci0gIG1heC1oZWlnaHQ6aW5oZXJpdDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci0gIG92ZXJmbG93OmF1dG87Ci19Ci0KLSNjbGFzc2VzLW5hdiwKLSNkZXZkb2MtbmF2IHsKLSAgb3ZlcmZsb3c6YXV0bzsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0KLSNzaWRlLW5hdiB1bCB7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzo1cHggMDsKLX0KLQotI3NpZGUtbmF2IHVsIHVsIHsKLSAgbWFyZ2luOiAuNWVtIDAgMCAwOwotICBwYWRkaW5nOiAwOwotfQotCi0jc2lkZS1uYXYgbGkgewotICBwYWRkaW5nOjA7Ci0gIHBhZGRpbmc6MXB4IDAgMXB4IDA7Ci0gIHpvb206MTsKLX0KLQotI3NpZGUtbmF2IGxpIHNwYW4uaGVhZGluZywKLSNzaWRlLW5hdiBsaSBoMiB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZvbnQtc2l6ZToxMnB4OwotICBmb250LXdlaWdodDogYm9sZDsKLSAgbWFyZ2luOi41ZW0gMCAwIDA7Ci0gIHBhZGRpbmc6IDNweCAwIDFweCA5cHg7Ci19Ci0KLSNzaWRlLW5hdiBsaSBhIHsKLSAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAvKiBuZWVkZWQgdG8gYXBwbHkgcGFkZGluZyB0byBsaW5lLXdyYXBzICovCi0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBwYWRkaW5nOiAwIDAgMCAxOHB4OwotICB6b29tOjE7Ci19Ci0KLSNzaWRlLW5hdiBsaSBhIHNwYW4rc3BhbiB7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLQotI3NpZGUtbmF2IGxpIGE6aG92ZXIgewotICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotfQotCi0jc2lkZS1uYXYgbGkgYSthIHsKLSAgcGFkZGluZzogMDsKLX0KLS8qc2Vjb25kIGxldmVsIChuZXN0ZWQpIGxpc3QqLwotI3NpZGUtbmF2IGxpIGxpIGxpIGEgewotICBwYWRkaW5nOiAwIDAgMCAyOHB4OwotfQotLyp0aGlyZCBsZXZlbCAobmVzdGVkKSBsaXN0Ki8KLSNzaWRlLW5hdiBsaSBsaSBsaSBsaSBhIHsKLSAgcGFkZGluZzogMCAwIDAgMzhweDsKLX0KLQotI3NpZGUtbmF2IC5zZWxlY3RlZCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICM0MzVhNmU7Ci0gIGNvbG9yOiAjZmZmOwotICBmb250LXdlaWdodDpib2xkOwotfQotCi0jc2lkZS1uYXYgLnNlbGVjdGVkIGEgewotICBjb2xvcjogI2ZmZjsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci19Ci0KLSNzaWRlLW5hdiBzdHJvbmcgewotICBkaXNwbGF5OmJsb2NrOwotfQotCi0jc2lkZS1uYXYgLnRvZ2dsZS1saXN0IC50b2dnbGUtaW1nIHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MDsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHRvcDowOwotICBsZWZ0OjA7Ci0gIGhlaWdodDoxNnB4OwotICB3aWR0aDoxNXB4OwotICBvdXRsaW5lLXN0eWxlOm5vbmU7Ci19Ci0vKiBzZWNvbmQtbGV2ZWwgdG9nZ2xlICovCi0jc2lkZS1uYXYgLnRvZ2dsZS1saXN0IC50b2dnbGUtbGlzdCAudG9nZ2xlLWltZyB7Ci0gIGxlZnQ6MTBweDsKLX0KLQotI3NpZGUtbmF2IC5jbG9zZWQgLnRvZ2dsZS1pbWcsCi0jc2lkZS1uYXYgLm9wZW4gLmNsb3NlZCAudG9nZ2xlLWltZyB7Ci0gIGJhY2tncm91bmQ6dXJsKCdpbWFnZXMvdHJpYW5nbGUtY2xvc2VkLXNtYWxsLnBuZycpIDdweCA0cHggbm8tcmVwZWF0OwotfQotI3NpZGUtbmF2IC5vcGVuIC50b2dnbGUtaW1nIHsKLSAgYmFja2dyb3VuZDp1cmwoJ2ltYWdlcy90cmlhbmdsZS1vcGVuZWQtc21hbGwucG5nJykgN3B4IDRweCBuby1yZXBlYXQ7Ci19Ci0KLSNzaWRlLW5hdiAudG9nZ2xlLWxpc3QgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLQotI3NpZGUtbmF2IC50b2dnbGUtbGlzdCB1bCB7Ci0gIG1hcmdpbjowOwotICBkaXNwbGF5Om5vbmU7Ci19Ci0KLSNzaWRlLW5hdiAudG9nZ2xlLWxpc3QgZGl2IHsKLSAgZGlzcGxheTpibG9jazsKLX0KLQotI2luZGV4LWxpbmtzIC5zZWxlY3RlZCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Ci0gIGNvbG9yOiAjMDAwOwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotfQotCi0jaW5kZXgtbGlua3MgewotICBwYWRkaW5nOjdweCAwIDRweCAxMHB4OwotfQotCi0vKiBuYXYgdHJlZSAqLwotCi0jbmF2LXRyZWUgdWwgewotICBwYWRkaW5nOjVweCAwIDEuNWVtOwotfQotCi0jc2lkZS1uYXYgI25hdi10cmVlIHVsIGxpIGEsCi0jc2lkZS1uYXYgI25hdi10cmVlIHVsIGxpIHNwYW4ubm8tY2hpbGRyZW4gewotICBwYWRkaW5nOiAwIDAgMCAwOwotICBtYXJnaW46IDA7Ci19Ci0KLSNuYXYtdHJlZSAucGx1cyB7Ci0gIG1hcmdpbjogMCAzcHggMCAwOwotfQotCi0jbmF2LXRyZWUgdWwgdWwgewotICBsaXN0LXN0eWxlOiBub25lOwotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6IDAgMCAwIDA7Ci19Ci0KLSNuYXYtdHJlZSB1bCBsaSB7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMCAwIDAgMDsKLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKLX0KLQotI25hdi10cmVlIC5jaGlsZHJlbl91bCB7Ci0gIG1hcmdpbjowOwotfQotCi0jbmF2LXRyZWUgYS5ub2xpbmsgewotICBjb2xvcjogYmxhY2s7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotI25hdi10cmVlIHNwYW4ubGFiZWwgewotICB3aWR0aDogMTAwJTsKLX0KLQotI25hdi10cmVlIHsKLSAgb3ZlcmZsb3cteDogYXV0bzsKLSAgb3ZlcmZsb3cteTogc2Nyb2xsOwotfQotCi0jbmF2LXN3YXAgewotICBmb250LXNpemU6MTBweDsKLSAgbGluZS1oZWlnaHQ6MTBweDsKLSAgbWFyZ2luLWxlZnQ6MWVtOwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLSAgZGlzcGxheTpibG9jazsKLX0KLQotI3RyZWUtbGluayB7Ci0KLX0KLQotLyogRE9DVU1FTlQgQk9EWSAqLwotCi0jZG9jLWNvbnRlbnQgewotICBvdmVyZmxvdzphdXRvOwotfQotCi0jamQtaGVhZGVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLSAgcGFkZGluZzogN3B4IDE1cHg7Ci19Ci0KLSNqZC1oZWFkZXIgaDEgewotICBtYXJnaW46IDAgMCAxMHB4OwotICBmb250LXNpemU6MS43ZW07Ci19Ci0KLSNqZC1oZWFkZXIgLmNydW1iIHsKLSAgZm9udC1zaXplOi45ZW07Ci0gIGxpbmUtaGVpZ2h0OjFlbTsKLSAgY29sb3I6Izc3NzsKLX0KLQotI2pkLWhlYWRlciAuY3J1bWIgYSwKLSNqZC1oZWFkZXIgLmNydW1iIGE6dmlzaXRlZCB7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBjb2xvcjojNzc3OwotfQotCi0jamQtaGVhZGVyIC5jcnVtYiBhOmhvdmVyIHsKLSAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKLX0KLQotI2pkLWhlYWRlciB0YWJsZSB7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjA7Ci19Ci0KLSNqZC1oZWFkZXIgdGQgewotICBib3JkZXI6bm9uZTsKLSAgcGFkZGluZzowOwotICB2ZXJ0aWNhbC1hbGlnbjp0b3A7Ci19Ci0KLSNqZC1oZWFkZXIuZ3VpZGUtaGVhZGVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotICBjb2xvcjojNDM1YTZlOwotICBoZWlnaHQ6NTBweDsKLX0KLQotI2pkLWRlc2NyIHsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0KLS8qIHN1bW1hcnkgdGFibGVzIGZvciByZWZlcmVuY2UgcGFnZXMgKi8KLS5qZC1zdW10YWJsZSB7Ci0gIG1hcmdpbjogLjVlbSAxZW0gMWVtIDFlbTsKLSAgd2lkdGg6OTUlOyAvKiBjb25zaXN0ZW50IHRhYmxlIHdpZHRoczsgd2l0aGluIElFJ3MgcXVpcmtzICovCi0gIGZvbnQtc2l6ZTouOWVtOwotfQotCi0uamQtc3VtdGFibGUgYSB7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotfQotCi0uamQtc3VtdGFibGUgYTpob3ZlciB7Ci0gIHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Ci19Ci0KLS8qIHRoZSBsaW5rIGluc2lkZSBhIHN1bXRhYmxlIGZvciAiU2hvdyBBbGwvSGlkZSBBbGwiICovCi0udG9nZ2xlLWFsbCB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OnJpZ2h0OwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGZvbnQtc2l6ZTowLjllbTsKLX0KLQotLyogYWRqdXN0bWVudHMgZm9yIGluL2RpcmVjdCBzdWJjbGFzc2VzIHRhYmxlcyAqLwotLmpkLXN1bXRhYmxlLXN1YmNsYXNzZXMgewotICBtYXJnaW46IDFlbSAwIDAgMDsKLSAgbWF4LXdpZHRoOjk2OHB4OwotfQotCi0vKiBleHRyYSBzcGFjZSBiZXR3ZWVuIGVuZCBvZiBtZXRob2QgbmFtZSBhbmQgb3Blbi1wYXJlbiAqLwotLnN5bXBhZCB7Ci0gIG1hcmdpbi1yaWdodDogMnB4OwotfQotCi0vKiByaWdodCBhbGlnbm1lbnQgZm9yIHRoZSByZXR1cm4gdHlwZSBpbiBzdW10YWJsZSAqLwotLmpkLXN1bXRhYmxlIC5qZC10eXBlY29sIHsKLSAgdGV4dC1hbGlnbjpyaWdodDsKLX0KLQotLyogYWRqdXN0bWVudHMgZm9yIHRoZSBleHBhbmRvIHRhYmxlLWluLXRhYmxlICovCi0uamQtc3VtdGFibGUtZXhwYW5kbyB7Ci0gIG1hcmdpbjouNWVtIDA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotLyogYSBkaXYgdGhhdCBob2xkcyBhIHNob3J0IGRlc2NyaXB0aW9uICovCi0uamQtZGVzY3JkaXYgewotICBwYWRkaW5nOjNweCAxZW0gMCAxZW07Ci0gIG1hcmdpbjowOwotICBib3JkZXI6MDsKLX0KLQotLyogcGFnZS10b3AtcmlnaHQgY29udGFpbmVyIGZvciByZWZlcmVuY2UgcGFnZXMgKGhvbGRzCi1saW5rcyB0byBzdW1tYXJ5IHRhYmxlcykgKi8KLSNhcGktaW5mby1ibG9jayB7Ci0gIGZvbnQtc2l6ZTouOGVtOwotICBwYWRkaW5nOjZweCAxMHB4OwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGZsb2F0OnJpZ2h0OwotICB0ZXh0LWFsaWduOnJpZ2h0OwotICBjb2xvcjojOTk5OwotICBtYXgtd2lkdGg6NzAlOwotfQotCi0jYXBpLWxldmVsLXRvZ2dsZSB7Ci0gIHBhZGRpbmc6MCAxMHB4OwotICBmb250LXNpemU6MTFweDsKLSAgZmxvYXQ6cmlnaHQ7Ci19Ci0KLSNhcGktbGV2ZWwtdG9nZ2xlIGxhYmVsLmRpc2FibGVkIHsKLSAgY29sb3I6Izk5OTsKLX0KLQotZGl2LmFwaS1sZXZlbCB7Ci0gIGZvbnQtc2l6ZTouOGVtOwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGNvbG9yOiM5OTk7Ci0gIGZsb2F0OnJpZ2h0OwotICBwYWRkaW5nOjAgN3B4IDA7Ci0gIG1hcmdpbi10b3A6LTI1cHg7Ci19Ci0KLSNhcGktaW5mby1ibG9jayBkaXYuYXBpLWxldmVsIHsKLSAgZm9udC1zaXplOjEuM2VtOwotICBmb250LXdlaWdodDpib2xkOwotICBmbG9hdDpub25lOwotICBjb2xvcjojNDQ0OwotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjowOwotfQotCi0vKiBGb3JjZSBsaW5rIGNvbG9ycyBmb3IgSUU2ICovCi1kaXYuYXBpLWxldmVsIGEgewotICBjb2xvcjojOTk5OwotfQotI2FwaS1pbmZvLWJsb2NrIGRpdi5hcGktbGV2ZWwgYTpsaW5rIHsKLSAgY29sb3I6IzQ0NDsKLX0KLSNhcGktbGV2ZWwtdG9nZ2xlIGEgewotICBjb2xvcjojOTk5OwotfQotCi1kaXYjZGVwcmVjYXRlZFN0aWNrZXIgewotICBkaXNwbGF5Om5vbmU7Ci0gIHotaW5kZXg6OTk7Ci0gIHBvc2l0aW9uOmZpeGVkOwotICByaWdodDoxNXB4OwotICB0b3A6MTE0cHg7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjFlbTsKLSAgYmFja2dyb3VuZDojRkZGOwotICBib3JkZXI6MXB4IHNvbGlkICNkZGRkMDA7Ci0gIGJveC1zaGFkb3c6LTVweCA1cHggMTBweCAjY2NjOwotICAtbW96LWJveC1zaGFkb3c6LTVweCA1cHggMTBweCAjY2NjOwotICAtd2Via2l0LWJveC1zaGFkb3c6LTVweCA1cHggMTBweCAjY2NjOwotfQotCi1kaXYjbmFNZXNzYWdlIHsKLSAgZGlzcGxheTpub25lOwotICB3aWR0aDo1NTVweDsKLSAgaGVpZ2h0OjA7Ci0gIG1hcmdpbjowIGF1dG87Ci19Ci0KLWRpdiNuYU1lc3NhZ2UgZGl2IHsKLSAgei1pbmRleDo5OTsKLSAgd2lkdGg6NDUwcHg7Ci0gIHBvc2l0aW9uOmZpeGVkOwotICBtYXJnaW46NTBweCAwOwotICBwYWRkaW5nOjRlbSA0ZW0gM2VtOwotICBiYWNrZ3JvdW5kOiNGRkY7Ci0gIGJvcmRlcjoxcHggc29saWQgI2RkZGQwMDsKLSAgYm94LXNoYWRvdzotMTBweCAxMHB4IDQwcHggIzg4ODsKLSAgLW1vei1ib3gtc2hhZG93Oi0xMHB4IDEwcHggNDBweCAjODg4OwotICAtd2Via2l0LWJveC1zaGFkb3c6LTEwcHggMTBweCA0MHB4ICM4ODg7Ci19Ci0vKiBJRTYgY2FuJ3QgcG9zaXRpb24gZml4ZWQgKi8KLSogaHRtbCBkaXYjbmFNZXNzYWdlIGRpdiB7IHBvc2l0aW9uOmFic29sdXRlOyB9Ci0KLWRpdiNuYU1lc3NhZ2Ugc3Ryb25nIHsKLSAgZm9udC1zaXplOjEuMWVtOwotfQotCi0uYWJzZW50LAotLmFic2VudCBhOmxpbmssCi0uYWJzZW50IGE6dmlzaXRlZCwKLS5hYnNlbnQgYTpob3ZlciwKLS5hYnNlbnQgKiB7Ci0gIGNvbG9yOiNiYmIgIWltcG9ydGFudDsKLSAgY3Vyc29yOmRlZmF1bHQgIWltcG9ydGFudDsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmUgIWltcG9ydGFudDsKLX0KLQotI2FwaS1sZXZlbC10b2dnbGUgYSwKLS5hcGktbGV2ZWwgYSB7Ci0gIGNvbG9yOmluaGVyaXQ7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotfQotCi0jYXBpLWxldmVsLXRvZ2dsZSBhOmhvdmVyLAotLmFwaS1sZXZlbCBhOmhvdmVyIHsKLSAgY29sb3I6aW5oZXJpdDsKLSAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSAhaW1wb3J0YW50OwotICBjdXJzb3I6cG9pbnRlciAhaW1wb3J0YW50OwotfQotCi0jc2lkZS1uYXYgbGkuYWJzZW50LnNlbGVjdGVkLAotI3NpZGUtbmF2IGxpLmFic2VudC5zZWxlY3RlZCAqLAotI3NpZGUtbmF2IGRpdi5sYWJlbC5hYnNlbnQuc2VsZWN0ZWQsCi0jc2lkZS1uYXYgZGl2LmxhYmVsLmFic2VudC5zZWxlY3RlZCAqIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZWFlYWVhICFpbXBvcnRhbnQ7Ci19Ci0vKiBJRTYgcXVpcmsgKHdvbid0IGNoYWluIGNsYXNzZXMsIHNvIGp1c3Qga2VlcCBiYWNrZ3JvdW5kIGJsdWUpICovCi0qIGh0bWwgI3NpZGUtbmF2IGxpLnNlbGVjdGVkLAotKiBodG1sICNzaWRlLW5hdiBsaS5zZWxlY3RlZCAqLAotKiBodG1sICNzaWRlLW5hdiBkaXYubGFiZWwuc2VsZWN0ZWQsCi0qIGh0bWwgI3NpZGUtbmF2IGRpdi5sYWJlbC5zZWxlY3RlZCAqIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzQzNWE2ZSAhaW1wb3J0YW50OwotfQotCi0KLS5hYnNlbnQgaDQuamQtZGV0YWlscy10aXRsZSwKLS5hYnNlbnQgaDQuamQtZGV0YWlscy10aXRsZSAqIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZjZmNmY2ICFpbXBvcnRhbnQ7Ci19Ci0KLS5hYnNlbnQgaW1nIHsKLSAgb3BhY2l0eTogLjM7Ci0gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0zMCk7Ci0gIC1tcy1maWx0ZXI6InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PTMwKSI7Ci19Ci0KLQotLyogYXBwbGllcyB0byBhIGRpdiBjb250YWluaW5nIGxpbmtzIHRvIHN1bW1hcnkgdGFibGVzICovCi0uc3VtLWRldGFpbHMtbGlua3MgewotICBwYWRkaW5nOjA7Ci0gIGZvbnQtd2VpZ2h0Om5vcm1hbDsKLX0KLQotLnN1bS1kZXRhaWxzLWxpbmtzIGEgewotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLX0KLQotLnN1bS1kZXRhaWxzLWxpbmtzIGE6aG92ZXIgewotICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotfQotCi0KLS8qIGluaGVyaXRhbmNlIHRhYmxlICovCi0uamQtaW5oZXJpdGFuY2UtdGFibGUgewotICBib3JkZXItc3BhY2luZzowOwotICBtYXJnaW46MDsKLSAgcGFkZGluZzowOwotICBmb250LXNpemU6LjllbTsKLX0KLS5qZC1pbmhlcml0YW5jZS10YWJsZSB0ZCB7Ci0gIGJvcmRlcjogbm9uZTsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwOwotfQotLmpkLWluaGVyaXRhbmNlLXRhYmxlIC5qZC1pbmhlcml0YW5jZS1zcGFjZSB7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIHdpZHRoOjFlbTsKLX0KLS5qZC1pbmhlcml0YW5jZS10YWJsZSAuamQtaW5oZXJpdGFuY2UtaW50ZXJmYWNlLWNlbGwgewotICBwYWRkaW5nLWxlZnQ6IDE3cHg7Ci19Ci0KLSNqZC1jb250ZW50IHsKLSAgcGFkZGluZzogMThweCAxNXB4OwotfQotCi1ociB7Ci0gIGJhY2tncm91bmQtY29sb3I6I2NjYzsKLSAgYm9yZGVyLWNvbG9yOiNmZmY7Ci0gIG1hcmdpbjoyZW0gMCAxZW07Ci19Ci0KLS8qIERPQyBDTEFTU0VTICovCi0KLSNqZC1jb250ZW50IGgxIHsKLS8qc2RrIHBhZ2UqLwotICBmb250LXNpemU6MS42ZW07Ci0gIGNvbG9yOiMzMzY2NjY7Ci0gIG1hcmdpbjowIDAgLjVlbTsKLX0KLQotI2pkLWNvbnRlbnQgaDIgewotICBmb250LXNpemU6MS40NWVtOwotICBjb2xvcjojMTExOwotICBib3JkZXItdG9wOjJweCBzb2xpZCAjY2NjOwotICBwYWRkaW5nOiAuNWVtIDAgMDsKLSAgbWFyZ2luOiAyZW0gMCAxZW0gMDsKLX0KLQotI2pkLWNvbnRlbnQgaDMgewotICBmb250LXNpemU6MS4zZW07Ci0gIGNvbG9yOiMzYTNhM2E7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMS41ZW0gMCAuNjVlbSAwOwotfQotCi0jamQtY29udGVudCBoNCB7Ci0gIGZvbnQtc2l6ZToxLjFlbTsKLSAgY29sb3I6IzNhM2EzYTsKLSAgcGFkZGluZzogMDsKLSAgbWFyZ2luOiAxLjI1ZW0gMCAuNjVlbSAwOwotfQotCi0jamQtY29udGVudCBoNSB7Ci0gIGZvbnQtc2l6ZToxLjBlbTsKLSAgY29sb3I6IzNhM2EzYTsKLSAgcGFkZGluZzogMDsKLSAgbWFyZ2luOiAxZW0gMCAuNjVlbSAwOwotfQotCi0jamQtY29udGVudCAuc21hbGwtaGVhZGVyIHsKLSAgZm9udC1zaXplOjFlbTsKLSAgY29sb3I6IzAwMDsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgYm9yZGVyOm5vbmU7Ci0gIHBhZGRpbmc6MDsKLSAgbWFyZ2luOjFlbSAwIC41ZW07Ci0gIHBvc2l0aW9uOmluaGVyaXQ7Ci19Ci0KLSNqZC1jb250ZW50IHRhYmxlIHsKLSAgbWFyZ2luOiAwIDAgMWVtIDFlbTsKLX0KLQotI2pkLWNvbnRlbnQgaW1nIHsKLSAgbWFyZ2luOiAwIDAgMWVtIDFlbTsKLX0KLQotI2pkLWNvbnRlbnQgbGkgaW1nLAotI2pkLWNvbnRlbnQgZGQgaW1nIHsKLSAgbWFyZ2luOi41ZW0gMCAuNWVtIDFlbTsKLX0KLQotLm5vbGlzdCB7Ci0gIGxpc3Qtc3R5bGU6bm9uZTsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MCAwIDFlbSAxZW07Ci19Ci0KLS5ub2xpc3QgbGkgewotICBwYWRkaW5nOjAgMCAycHg7Ci0gIG1hcmdpbjowOwotfQotCi1oNCAubm9ybWFsIHsKLSAgZm9udC1zaXplOi45ZW07Ci0gIGZvbnQtd2VpZ2h0Om5vcm1hbDsKLX0KLQotLmNhcHMgewotICBmb250LXZhcmlhbnQ6c21hbGwtY2FwczsKLSAgZm9udC1zaXplOjEuMmVtOwotfQotCi1kbC50YWctbGlzdCBkbC5hdG4tbGlzdCB7Ci0gIHBhZGRpbmc6MCAwIDAgMmVtOwotfQotCi0uamQtZGV0YWlscyB7Ci0vKiAgYm9yZGVyOjFweCBzb2xpZCAjNjY5OTk5OwotICBwYWRkaW5nOjRweDsgKi8KLSAgbWFyZ2luOjAgMCAxZW07Ci19Ci0KLS8qIEFQSSByZWZlcmVuY2U6IGEgY29udGFpbmVyIGZvciB0aGUKLS50YWdkYXRhIGJsb2NrcyB0aGF0IG1ha2UgdXAgdGhlIGRldGFpbGVkCi1kZXNjcmlwdGlvbiAqLwotLmpkLWRldGFpbHMtZGVzY3IgewotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjouNWVtIC4yNWVtOwotfQotCi0vKiBBUEkgcmVmZXJlbmNlOiBhIGJsb2NrIGNvbnRhaW5pbmcKLWEgZGV0YWlsZWQgZGVzY3JpcHRpb24sIGEgcGFyYW1zIHRhYmxlLAotc2VlYWxzbyBsaXN0LCBldGMgKi8KLS5qZC10YWdkYXRhIHsKLSAgbWFyZ2luOi41ZW0gMWVtOwotfQotCi0uamQtdGFnZGF0YSBwIHsKLSAgbWFyZ2luOjAgMCAxZW0gMWVtOwotfQotCi0vKiBBUEkgcmVmZXJlbmNlOiBhZGp1c3RtZW50cyB0bwotdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIGJsb2NrICovCi0uamQtdGFnZGVzY3IgewotICBtYXJnaW46LjI1ZW0gMCAuNzVlbSAwOwotICBsaW5lLWhlaWdodDoxZW07Ci19Ci0KLS5qZC10YWdkZXNjciBwIHsKLSAgbWFyZ2luOi41ZW0gMDsKLSAgcGFkZGluZzowOwotCi19Ci0KLS5qZC10YWdkZXNjciBvbCwKLS5qZC10YWdkZXNjciB1bCB7Ci0gIG1hcmdpbjowIDIuNWVtOwotICBwYWRkaW5nOjA7Ci19Ci0KLS5qZC10YWdkZXNjciB0YWJsZSwKLS5qZC10YWdkZXNjciBpbWcgewotICBtYXJnaW46LjI1ZW0gMWVtOwotfQotCi0uamQtdGFnZGVzY3IgbGkgewotbWFyZ2luOjAgMCAuMjVlbSAwOwotcGFkZGluZzowOwotfQotCi0vKiBBUEkgcmVmZXJlbmNlOiBoZWFkaW5nIG1hcmtpbmcKLXRoZSBkZXRhaWxzIHNlY3Rpb24gZm9yIGNvbnN0YW50cywKLWF0dHJzLCBtZXRob2RzLCBldGMuICovCi1oNC5qZC1kZXRhaWxzLXRpdGxlIHsKLSAgZm9udC1zaXplOjEuMTVlbTsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLSAgbWFyZ2luOjEuNWVtIDAgLjZlbTsKLSAgcGFkZGluZzozcHggOTVweCAzcHggM3B4OyAvKiByb29tIGZvciBhcGktbGV2ZWwgKi8KLX0KLQotaDQuamQtdGFndGl0bGUgewotICBtYXJnaW46MDsKLX0KLQotLyogQVBJIHJlZmVyZW5jZTogaGVhZGluZyBmb3IgIlBhcmFtZXRlcnMiLCAiU2VlIEFsc28iLCBldGMuLAotaW4gZGV0YWlscyBzZWN0aW9ucyAqLwotaDUuamQtdGFndGl0bGUgewotICBtYXJnaW46MCAwIC4yNWVtIDA7Ci0gIGZvbnQtc2l6ZToxZW07Ci19Ci0KLS5qZC10YWd0YWJsZSB7Ci0gIG1hcmdpbjowOwotfQotCi0uamQtdGFndGFibGUgdGQsCi0uamQtdGFndGFibGUgdGggewotICBib3JkZXI6bm9uZTsKLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotICB2ZXJ0aWNhbC1hbGlnbjp0b3A7Ci0gIGZvbnQtd2VpZ2h0Om5vcm1hbDsKLSAgcGFkZGluZzoycHggMTBweDsKLX0KLQotLmpkLXRhZ3RhYmxlIHRoIHsKLSAgZm9udC1zdHlsZTppdGFsaWM7Ci19Ci0KLSNqZC1jb250ZW50IHRhYmxlIGgyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2Q2ZDZkNjsKLSAgZm9udC1zaXplOiAxLjFlbTsKLSAgbWFyZ2luOjAgMCAxMHB4OwotICBwYWRkaW5nOjVweDsKLSAgbGVmdDowOwotICB3aWR0aDphdXRvOwotfQotCi1kaXYuZGVzaWduLWFubm91bmNlIHsKLSAgYm9yZGVyLXRvcDoxcHggc29saWQgIzMzQjVFNTsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzMzQjVFNTsKLSAgcGFkZGluZzo1cHggMTBweCAxMHB4IDU1cHg7Ci0gIG1hcmdpbjoyZW0gMDsKLSAgYmFja2dyb3VuZDp1cmwoJ2ltYWdlcy9pY29uX2Rlc2lnbi5wbmcnKSA1cHggMTNweCBuby1yZXBlYXQ7Ci19Ci0KLWRpdi5kZXNpZ24tYW5ub3VuY2UgcCB7Ci0gIG1hcmdpbjogLjVlbSAwIDAgMDsKLX0KLQotZGl2LnNwZWNpYWwgewotICBwYWRkaW5nOiAuNWVtIDFlbSAxZW0gMWVtOwotICBtYXJnaW46IDAgMCAxZW07Ci0gIGJhY2tncm91bmQtY29sb3I6ICNEQUYzRkM7Ci0gIGJvcmRlcjoxcHggc29saWQgI2QzZWNmNTsKLSAgYm9yZGVyLXJhZGl1czo1cHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czo1cHg7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHg7Ci19Ci0KLWRpdi5zcGVjaWFsIHAgewotICBtYXJnaW46IC41ZW0gMCAwIDA7Ci19Ci0KLWRpdi5zcGVjaWFsIG9sIHsKLSAgbWFyZ2luOiAwOwotfQotCi1kaXYuc3BlY2lhbCBvbCBsaSB7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMDsKLX0KLQotI2pkLWNvbnRlbnQgZGl2LnNwZWNpYWwgaDIsCi0jamQtY29udGVudCBkaXYuc3BlY2lhbCBoMyB7Ci0gIGNvbG9yOiM2Njk5OTk7Ci0gIGZvbnQtc2l6ZToxLjJlbTsKLSAgYm9yZGVyOm5vbmU7Ci0gIG1hcmdpbjowIDAgLjVlbTsKLSAgcGFkZGluZzowOwotfQotCi0jamQtY29udGVudCBkaXYuc3BlY2lhbC5yZWZlcmVuY2UgaDIsCi0jamQtY29udGVudCBkaXYuc3BlY2lhbC5yZWZlcmVuY2UgaDMsCi0jamQtY29udGVudCBkaXYuc3BlY2lhbC5yZWZlcmVuY2UgaDQgewotICBjb2xvcjojMDAwOwotICBmb250LXNpemU6MWVtOwotICBib3JkZXI6bm9uZTsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgbWFyZ2luOi41ZW0gMDsKLSAgcGFkZGluZzowOwotfQotCi1wLm5vdGUsIGRpdi5ub3RlLAotcC5jYXV0aW9uLCBkaXYuY2F1dGlvbiwKLXAud2FybmluZywgZGl2Lndhcm5pbmcgewotICBtYXJnaW46IDFlbTsKLSAgcGFkZGluZzogMCAwIDAgLjVlbTsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZDsKLX0KLQotcC5zcGVjaWFsLW5vdGUsCi1kaXYuc3BlY2lhbC1ub3RlIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojRUJGM0RCOwotICBwYWRkaW5nOjEwcHggMjBweDsKLSAgbWFyZ2luOjAgMCAxZW07Ci19Ci0KLXAubm90ZSwKLWRpdi5ub3RlIHsKLSBib3JkZXItY29sb3I6ICM5OWFhY2M7Ci19Ci0KLXAud2FybmluZywKLWRpdi53YXJuaW5nIHsKLSAgYm9yZGVyLWNvbG9yOiAjYWEwMDMzOwotfQotCi1wLmNhdXRpb24sCi1kaXYuY2F1dGlvbiB7Ci0gIGJvcmRlci1jb2xvcjogI2ZmY2YwMDsKLX0KLQotbGkgLm5vdGUsCi1saSAuY2F1dGlvbiwKLWxpIC53YXJuaW5nIHsKLSAgbWFyZ2luOiAuNWVtIDAgMCAwOwotICBwYWRkaW5nOiAuMmVtIC41ZW0gLjJlbSAuOWVtOwotfQotCi0vKiBNYWtlcyBzdXJlIHRoZSBmaXJzdCBwYXJhZ3JhcGggZG9lcyBub3QgYWRkIHRvcC13aGl0ZXNwYWNlIHdpdGhpbiB0aGUgYm94Ki8KLWxpIC5ub3RlPnA6Zmlyc3QtY2hpbGQsCi1saSAuY2F1dGlvbj5wOmZpcnN0LWNoaWxkLAotbGkgLndhcm5pbmc+cDpmaXJzdC1jaGlsZCB7Ci0gIG1hcmdpbi10b3A6MDsKLSAgcGFkZGluZy10b3A6MDsKLX0KLQotZGwueG1sIGR0IHsKLSAgZm9udC12YXJpYW50OnNtYWxsLWNhcHM7Ci0gIGZvbnQtc2l6ZToxLjJlbTsKLX0KLQotZGwueG1sIGRsIHsKLSAgcGFkZGluZzowOwotfQotCi1kbC54bWwgZGwgZHQgewotICBmb250LXZhcmlhbnQ6bm9ybWFsOwotICBmb250LXNpemU6MWVtOwotfQotCi0ubGlzdGhlYWQgbGkgewotICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmxpc3RoZWFkIGxpICosIC8qaWUqLy5saXN0aGVhZCBsaSBsaSB7Ci0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7Ci19Ci0KLW9sLm5vLXN0eWxlLAotdWwubm8tc3R5bGUgewotICBsaXN0LXN0eWxlOm5vbmU7Ci0gIHBhZGRpbmctbGVmdDoxZW07Ci19Ci0KLS5uZXcsCi0ubmV3LWNoaWxkIHsKLSAgZm9udC1zaXplOiAuNzhlbTsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIGNvbG9yOiAjZmYzZDNkOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIHZlcnRpY2FsLWFsaWduOnRvcDsKLSAgbGluZS1oZWlnaHQ6LjllbTsKLSAgd2hpdGUtc3BhY2U6bm93cmFwOwotfQotCi0udG9nZ2xlLWxpc3Qub3BlbiAubmV3LWNoaWxkIHsKLSAgZGlzcGxheTpub25lOwotfQotCi1wcmUuY2xhc3NpYyB7Ci0gIGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ci0gIGJvcmRlcjpub25lOwotICBwYWRkaW5nOjA7Ci19Ci0KLXAuaW1nLWNhcHRpb24gewotICBtYXJnaW46IC0wLjVlbSAwIDFlbSAxZW07IC8qIG1hdGNoZXMgZGVmYXVsdCBpbWcgbGVmdC1tYXJnaW4gKi8KLX0KLQotZGl2LmZpZ3VyZSB7Ci0gIGZsb2F0OnJpZ2h0OwotICBjbGVhcjpyaWdodDsKLSAgbWFyZ2luOjFlbSAwIDAgMDsKLSAgcGFkZGluZzowIDAgMCAzZW07Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKLSAgLyogd2lkdGggbXVzdCBiZSBkZWZpbmVkIHcvIGFuIGlubGluZSBzdHlsZSBtYXRjaGluZyB0aGUgaW1hZ2Ugd2lkdGggKi8KLX0KLQotI2pkLWNvbnRlbnQKLWRpdi5maWd1cmUgaW1nIHsKLSAgbWFyZ2luOiAwIDAgMWVtOwotfQotCi1kaXYuZmlndXJlIHAuaW1nLWNhcHRpb24gewotICBtYXJnaW46IC0wLjVlbSAwIDFlbSAwOwotfQotCi1wLnRhYmxlLWNhcHRpb24gewotICBtYXJnaW46IDAgMCAwLjVlbSAxZW07IC8qIG1hdGNoZXMgZGVmYXVsdCB0YWJsZSBsZWZ0LW1hcmdpbiAqLwotfQotCi0KLS8qIHRvZ2dsZSBmb3IgbWlzYyBjb250ZW50IChzdWNoIGFzIGxvbmcgc2FtcGxlIGNvZGUpIAotICAgc2VlIHRvZ2dsZUNvbnRlbnQoKSBzY3JpcHQgaW4gYW5kcm9pZC1kZXZlbG9wZXItZG9jcy5qcyAqLwotLnRvZ2dsZS1jb250ZW50LmNsb3NlZCAudG9nZ2xlLWNvbnRlbnQtdG9nZ2xlbWUgewotICBkaXNwbGF5Om5vbmU7Ci19Ci0KLS50b2dnbGUtY29udGVudCBhW2hyZWY9IiMiXSB7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBjb2xvcjppbmhlcml0OwotfQotCi0udG9nZ2xlLWNvbnRlbnQtdG9nZ2xlbWUgewotICBwYWRkaW5nLWJvdHRvbToxcHg7IC8qIGZpeGVzIGFuaW1hdGlvbiBib3VuY2UgZHVlIHRvIG1hcmdpbnMgKi8KLX0KLQotI2pkLWNvbnRlbnQgLnRvZ2dsZS1jb250ZW50IGltZy50b2dnbGUtY29udGVudC1pbWcgewotICBtYXJnaW46MDsKLX0KLQotCi0vKiBCRUdJTiBxdWlja3ZpZXcgc2lkZWJhciBlbGVtZW50IHN0eWxlcyAqLwotCi0jcXYtd3JhcHBlciB7Ci0gIGZsb2F0OiByaWdodDsKLSAgd2lkdGg6MzEwcHg7IC8qICszNXB4IHBhZGRpbmcgKi8KLSAgYmFja2dyb3VuZC1jb2xvcjojZmZmOwotICBtYXJnaW46LTQ4cHggMCAycHggMDsKLSAgcGFkZGluZzowIDAgMjBweCAzNXB4OwotfQotCi0jcXYgewotICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ci0gIGJvcmRlcjo0cHggc29saWQgI2RlZThmMTsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MCA1cHggNXB4OwotICB3aWR0aDoyOTJweDsgLyogKzEwcHggcGFkZGluZzsgKzhweCBib3JkZXIgKi8KLSAgZm9udC1zaXplOi45ZW07Ci19Ci0KLSNxdiBvbCB7Ci0gIGxpc3Qtc3R5bGU6bm9uZTsKLSAgcGFkZGluZzogMDsKLX0KLQotI3F2IG9sIG9sewotICBsaXN0LXN0eWxlOm5vbmU7Ci0gIHBhZGRpbmc6IDAgMCAwIDEycHg7Ci0gIG1hcmdpbjowOwotfQotCi0jcXYgdWwgewotICBwYWRkaW5nOiAwIDEwcHggMCAyZW07Ci19Ci0KLSNxdiBsaSB7Ci0gIHBhZGRpbmc6IDAgMTBweCAzcHg7Ci0gIGxpbmUtaGVpZ2h0OiAxLjJlbTsKLX0KLQotI3F2IGxpIGxpIHsKLSAgcGFkZGluZzogM3B4IDEwcHggMDsKLX0KLQotI3F2IHVsIGxpIHsKLSAgcGFkZGluZzogMCAxMHB4IDAgMDsKLX0KLQotI3F2IGxpLnNlbGVjdGVkIGEgewotICBjb2xvcjojNTU1OwotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLX0KLQotI3F2IGEsCi0jcXYgYSBjb2RlIHsKLSAgY29sb3I6I2NjNjYwMDsKLX0KLQotI3F2IHAgewotICBtYXJnaW46OHB4IDAgMDsKLSAgcGFkZGluZzowIDEwcHg7Ci19Ci0KLSNqZC1jb250ZW50ICNxdiBoMiB7Ci0gIGZvbnQtc2l6ZToxLjA1ZW07Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIG1hcmdpbjoxMnB4IDAgLjI1ZW0gMDsKLSAgcGFkZGluZzowIDEwcHg7Ci0gIGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ci0gIGNvbG9yOiM3QkIwMjY7Ci0gIGJvcmRlcjpub25lOwotICBsZWZ0OjA7Ci0gIHotaW5kZXg6MTsKLX0KLQotI3F2LWV4dHJhICNydWxlIHsKLSAgcGFkZGluZzogMCAxMHB4OwotICBtYXJnaW46IDA7Ci19Ci0KLSNxdi1zdWItcnVsZSB7Ci0gIHBhZGRpbmc6IDVweCAxNXB4IDEwcHg7Ci0gIG1hcmdpbjogMDsKLX0KLQotI2pkLWNvbnRlbnQKLSNxdi1zdWItcnVsZSBoMiB7Ci0gIG1hcmdpbjogMCAwIC41ZW0gMDsKLX0KLQotLyogRU5EIHF1aWNrdmlldyBzaWRlYmFyIGVsZW1lbnQgc3R5bGVzICovCi0KLS8qIEJlZ2luIHNpZGVib3ggc2lkZWJhciBlbGVtZW50IHN0eWxlcyAqLwotCi0uc2lkZWJveC13cmFwcGVyIHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIGNsZWFyOnJpZ2h0OwotICB3aWR0aDozMTBweDsgLyogKzM1cHggcGFkZGluZyAqLwotICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjAgMCAyMHB4IDM1cHg7Ci19Ci0KLS5zaWRlYm94IHsKLSAgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZWU4ZjE7Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZmZmZlZTsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6OHB4IDEycHg7Ci0gIGZvbnQtc2l6ZTowLjllbTsKLSAgd2lkdGg6Mjg1cHg7IC8qICsyNHB4IHBhZGRpbmc7ICsxcHggYm9yZGVyICovCi19Ci0KLS5zaWRlYm94IHAgewotICBtYXJnaW4tYm90dG9tOiAuNzVlbTsKLX0KLQotLnNpZGVib3ggdWwgewotICBwYWRkaW5nOiAwIDAgMCAxLjVlbTsKLX0KLQotLnNpZGVib3ggbGkgdWwgewotICBtYXJnaW4tdG9wOjA7Ci0gIG1hcmdpbi1ib3R0b206LjFlbTsKLX0KLQotLnNpZGVib3ggbGkgewotcGFkZGluZzowIDAgMCAwZW07Ci19Ci0KLSNqZC1jb250ZW50IC5zaWRlYm94IGgyLAotI2pkLWNvbnRlbnQgLnNpZGVib3ggaDMsCi0jamQtY29udGVudCAuc2lkZWJveCBoNCwKLSNqZC1jb250ZW50IC5zaWRlYm94IGg1IHsKLSAgYm9yZGVyOm5vbmU7Ci0gIGZvbnQtc2l6ZToxZW07Ci0gIG1hcmdpbjowOwotICBwYWRkaW5nOjAgMCA4cHg7Ci0gIGxlZnQ6MDsKLSAgei1pbmRleDowOwotfQotCi0uc2lkZWJveCBociB7Ci0gIGJhY2tncm91bmQtY29sb3I6I2NjYzsKLSAgYm9yZGVyOm5vbmU7Ci19Ci0KLS8qIEVuZCBzaWRlYm94IHNpZGViYXIgZWxlbWVudCBzdHlsZXMgKi8KLQotLyogQkVHSU4gZGV2ZWxvcGVyIHRyYWluaW5nIGJhciBzdHlsZXMgKi8KLQotZGl2I3RiLXdyYXBwZXIgewotICBmbG9hdDogcmlnaHQ7Ci0gIGNsZWFyOnJpZ2h0OwotICB3aWR0aDozODBweDsgLyogKzI1cHggcGFkZGluZyA9IDQwNSAqLwotICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ci0gIG1hcmdpbjowIDAgMnB4IDA7Ci0gIHBhZGRpbmc6MCAwIDIwcHggMjVweDsKLX0KLQotZGl2I3RiIHsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MCAxNXB4OwotICB3aWR0aDozNTBweDsgLyogKzE1cHggcGFkZGluZyA9IDM4MCAqLwotICBmb250LXNpemU6LjllbTsKLSAgYmFja2dyb3VuZDojZTllOWU5OwotICBib3JkZXI6MXB4IHNvbGlkICNhYWE7Ci0gIGJvcmRlci1yYWRpdXM6NXB4OwotICAtbW96LWJvcmRlci1yYWRpdXM6NXB4OwotICAtd2Via2l0LWJvcmRlci1yYWRpdXM6NXB4OwotICBvdmVyZmxvdzphdXRvOwotfQotCi1kaXYjdGIgaDIgewotICBmb250LXNpemU6MS4zZW07Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIG1hcmdpbjoxZW0gMDsKLSAgcGFkZGluZzowOwotICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OwotICBib3JkZXI6bm9uZTsKLSAgY2xlYXI6Ym90aDsKLX0KLQotZGl2LmRvd25sb2FkLWJveCBhLmJ1dHRvbiB7Ci0gIGNvbG9yOiAjMDY5OwotICBmb250LXNpemU6MS4xZW07Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBoZWlnaHQ6MjdweDsKLSAgbGluZS1oZWlnaHQ6MjdweDsKLSAgdGV4dC1hbGlnbjpjZW50ZXI7Ci0gIHBhZGRpbmc6NXB4IDhweDsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKLSAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICBib3JkZXItcmFkaXVzOiAycHg7Ci19Ci0KLWRpdi5kb3dubG9hZC1ib3ggYS5idXR0b246aG92ZXIgewotICBib3JkZXItY29sb3I6ICMwOUM7Ci0gIGJhY2tncm91bmQtY29sb3I6ICM0Q0FEQ0I7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLGxlZnQgYm90dG9tLGZyb20oIzVkYmNkOSksdG8oIzRjYWRjYikpOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzVkYmNkOSwjNGNhZGNiKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCM1ZGJjZDksIzRjYWRjYik7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCM1ZGJjZDksIzRjYWRjYik7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsIzVkYmNkOSwjNGNhZGNiKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvcCwjNWRiY2Q5LCM0Y2FkY2IpOwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjNWRiY2Q5JyxFbmRDb2xvclN0cj0nIzRjYWRjYicpOwotICBjb2xvcjogI2ZmZjsKLX0KLQotZGl2LmRvd25sb2FkLWJveCBhLmJ1dHRvbjphY3RpdmUgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjMUU3OTlBOwotICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwotICBib3JkZXItY29sb3I6ICMzMEI3RTY7Ci19Ci0KLWRpdi5kb3dubG9hZC1ib3ggcC5maWxlbmFtZSB7Ci0gIGZvbnQtc2l6ZTowLjg1ZW07Ci0gIGNvbG9yOiM4ODg7Ci0gIG1hcmdpbjo0cHggMCAxZW0gMTBweDsKLX0KLQotLyogRW5kIGRldmVsb3BlciB0cmFpbmluZyBiYXIgKi8KLQotLyogVHJhaW5pbmcgbmF2IGJhciAocHJldmlvdXMvbmV4dCkgKi8KLQotZGl2LnRyYWluaW5nLW5hdi10b3AgewotICBmbG9hdDogcmlnaHQ7Ci0gIHdpZHRoOjM4MHB4OyAvKiArMjVweCBwYWRkaW5nID0gNDA1ICovCi0gIG1hcmdpbjotNThweCAwIDAgMDsKLSAgcGFkZGluZzowIDAgMjBweCAyNXB4OwotfQotCi1kaXYudHJhaW5pbmctbmF2LWJvdHRvbSB7Ci0gIHBhZGRpbmc6MXB4OyAvKiBmb3Igd2VpcmQgRkYgYnVnIChzY3JvbGxiYXIgYXBwZWFycykgKi8KLSAgbWFyZ2luOjNlbSAwOwotICBvdmVyZmxvdzphdXRvOwotfQotCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1uZXh0IGEsCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1wcmV2aW91cyBhIHsKLSAgZGlzcGxheTpibG9jazsKLSAgd2lkdGg6MTYwcHg7Ci0gIGhlaWdodDo1NXB4OwotICBwYWRkaW5nOjRweCA3cHg7Ci0gIGJvcmRlcjoxcHggc29saWQgI2FhYTsKLSAgYm9yZGVyLXJhZGl1czo1cHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czo1cHg7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHg7Ci0gIHRleHQtZGVjb3JhdGlvbjpub25lOwotICBmb250LXdlaWdodDpib2xkOwotfQotCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1uZXh0IGE6aG92ZXIsCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1wcmV2aW91cyBhOmhvdmVyIHsKLSAgYm9yZGVyOjFweCBzb2xpZCAjMDY5OyAvKiBtYXRjaCBsaW5rIGNvbG9yICovCi19Ci0KLWRpdi50cmFpbmluZy1uYXYtYnV0dG9uLW5leHQgYTphY3RpdmUsCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1wcmV2aW91cyBhOmFjdGl2ZSB7Ci0gIGJvcmRlcjoxcHggc29saWQgI2YwMDsgLyogbWF0Y2ggbGluayBjb2xvciAqLwotfQotICAKLWRpdi50cmFpbmluZy1uYXYtYnV0dG9uLXByZXZpb3VzIHsKLSAgZmxvYXQ6bGVmdDsKLSAgdGV4dC1hbGlnbjpsZWZ0OwotfQotCi1kaXYudHJhaW5pbmctbmF2LWJ1dHRvbi1uZXh0IHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIHRleHQtYWxpZ246cmlnaHQ7Ci19Ci0KLXNwYW4udHJhaW5pbmctbmF2LWJ1dHRvbi10aXRsZSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZvbnQtc2l6ZTouODVlbTsKLSAgZm9udC13ZWlnaHQ6bm9ybWFsOwotICBsaW5lLWhlaWdodDoxLjNlbTsKLSAgbWFyZ2luOi41ZW0gMCAwOwotfQotCi0vKiBFbmQgdHJhaW5pbmcgbmF2IGJhciAqLwotCi0vKiBCRUdJTiBpbWFnZSBhbmQgY2FwdGlvbiBzdHlsZXMgKG9yaWdpbmFsbHkgZm9yIFVJIEd1aWRlbGluZXMgZG9jcykgKi8KLQotdGFibGUuaW1hZ2UtY2FwdGlvbiB7Ci0gIHBhZGRpbmc6MDsKLSAgbWFyZ2luOi41ZW0gMDsKLSAgYm9yZGVyOjA7Ci19Ci0KLXRkLmltYWdlLWNhcHRpb24taSB7Ci0gIGZvbnQtc2l6ZTo5MiU7Ci0gIHBhZGRpbmc6MCA1cHg7Ci0gIG1hcmdpbjowOwotICBib3JkZXI6MDsKLX0KLQotdGQuaW1hZ2UtY2FwdGlvbi1pIGltZyB7Ci0gIHBhZGRpbmc6MCAxZW07Ci0gIG1hcmdpbjowOwotfQotCi0uaW1hZ2UtbGlzdCB7Ci0gIHdpZHRoOjI0cHg7Ci0gIHRleHQtYWxpZ246Y2VudGVyOwotfQotCi10ZC5pbWFnZS1jYXB0aW9uLWMgewotICBmb250LXNpemU6OTIlOwotICBwYWRkaW5nOjFlbSAycHggMnB4IDJweDsKLSAgbWFyZ2luOjA7Ci0gIGJvcmRlcjowOwotICB3aWR0aDozNTBweDsKLX0KLQotLmdyYWQtcnVsZS10b3AgewotYmFja2dyb3VuZC1pbWFnZTp1cmwoaW1hZ2VzL2dyYWQtcnVsZS1xdi5wbmcpOwotYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OwotcGFkZGluZy10b3A6MWVtOwotbWFyZ2luLXRvcDowOwotfQotCi0uaW1hZ2UtY2FwdGlvbi1uZXN0ZWQgewotICBtYXJnaW4tdG9wOjA7Ci0gIHBhZGRpbmc6MCAwIDAgMWVtOwotfQotCi0uaW1hZ2UtY2FwdGlvbi1uZXN0ZWQgdGQgewotICBwYWRkaW5nOjAgNHB4IDJweCAwOwotICBtYXJnaW46MDsKLSAgYm9yZGVyOjA7Ci19Ci0KLS8qIEVORCBpbWFnZSBhbmQgY2FwdGlvbiBzdHlsZXMgKi8KLQotLyogdGFibGUgb2YgY29udGVudHMgKi8KLQotb2wudG9jIHsKLSAgbWFyZ2luOiAwIDAgMWVtIDA7Ci0gIHBhZGRpbmc6IDA7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIGZvbnQtc2l6ZTo5NSU7Ci19Ci0KLW9sLnRvYyBsaSB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotICBtYXJnaW46IDAgMCAuNWVtIDFlbTsKLSAgcGFkZGluZzogMDsKLX0KLQotb2wudG9jIGxpIHAgewotICBmb250LXdlaWdodDogbm9ybWFsOwotfQotCi1vbC50b2MgbGkgb2wgewotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6IDA7Ci19Ci0KLW9sLnRvYyBsaSBsaSB7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMCAwIDAgMWVtOwotICBmb250LXdlaWdodDogbm9ybWFsOwotICBsaXN0LXN0eWxlOiBub25lOwotfQotCi10YWJsZSBvbC50b2MgewotICBtYXJnaW4tbGVmdDogMDsKLX0KLQotLmNvbHVtbnMgdGQgewotICBwYWRkaW5nOjAgNXB4OwotICBib3JkZXI6bm9uZTsKLX0KLQotLyogbGluayB0YWJsZSAqLwotLmpkLWxpbmt0YWJsZSB7Ci0gIG1hcmdpbjogMCAwIDFlbTsKLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4ODg7Ci19Ci0uamQtbGlua3RhYmxlIHRoLAotLmpkLWxpbmt0YWJsZSB0ZCB7Ci0gIHBhZGRpbmc6IDNweCA1cHg7Ci0gIHZlcnRpY2FsLWFsaWduOiB0b3A7Ci0gIHRleHQtYWxpZ246IGxlZnQ7Ci0gIGJvcmRlcjpub25lOwotfQotLmpkLWxpbmt0YWJsZSB0ciB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Ci19Ci0uamQtbGlua3RhYmxlIHRkIHsKLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM4ODg7Ci0gIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7Ci19Ci0uamQtbGlua3RhYmxlIHRkICBwIHsKLSAgcGFkZGluZzogMCAwIDVweDsKLX0KLS5qZC1saW5rdGFibGUgLmpkLWxpbmtjb2wgewotfQotLmpkLWxpbmt0YWJsZSAuamQtZGVzY3Jjb2wgewotfQotLmpkLWxpbmt0YWJsZSAuamQtdHlwZWNvbCB7Ci0gIHRleHQtYWxpZ246cmlnaHQ7Ci19Ci0uamQtbGlua3RhYmxlIC5qZC12YWxjb2wgewotfQotLmpkLWxpbmt0YWJsZSAuamQtY29tbWVudHJvdyB7Ci0gIGJvcmRlci10b3A6bm9uZTsKLSAgcGFkZGluZy1sZWZ0OjI1cHg7Ci19Ci0uamQtZGVwcmVjYXRlZC13YXJuaW5nIHsKLSAgbWFyZ2luLXRvcDogMDsKLSAgbWFyZ2luLWJvdHRvbTogMTBweDsKLX0KLQotdHIuYWx0LWNvbG9yIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjZmNjsKLX0KLQotLyogZXhwYW5kbyB0cmlnZ2VyICovCi0jamQtY29udGVudCAuamQtZXhwYW5kby10cmlnZ2VyLWltZyB7Ci0gIG1hcmdpbjowOwotfQotCi0vKiBqZC1leHBhbmRvICovCi0uamQtaW5oZXJpdGVkbGlua3MgewotICBwYWRkaW5nOjAgMCAwIDEzcHgKLX0KLQotLyogU0RLIFBBR0UgKi8KLXRhYmxlLmRvd25sb2FkIHRyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZDlkOWQ5OwotfQotCi10YWJsZS5kb3dubG9hZCB0ci5hbHQtY29sb3IgewotICBiYWNrZ3JvdW5kLWNvbG9yOiNlZGVkZWQ7Ci19Ci0KLXRhYmxlLmRvd25sb2FkIHRkLAotdGFibGUuZG93bmxvYWQgdGggewotICBib3JkZXI6MnB4IHNvbGlkICNmZmY7Ci0gIHBhZGRpbmc6MTBweCA1cHg7Ci19Ci0KLXRhYmxlLmRvd25sb2FkIHRoIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojNmQ4MjkzOwotICBjb2xvcjojZmZmOwotfQotCi0vKiBJTkxBWSAxODAgQ09QWSBhbmQgMjQwUFggRVhURU5TSU9OICovCi0vKiBtb2RpZmllZCB0byA0M3B4IHNvIHRoYXQgYWxsIGJyb3dzZXJzIGVsaW1pbmF0ZSB0aGUgcGFja2FnZSBwYW5lbCBoLXNjcm9sbCAqLwotLmctdHBsLTI0MCAuZy11bml0LAotLmctdW5pdCAuZy10cGwtMjQwIC5nLXVuaXQsCi0uZy11bml0IC5nLXVuaXQgLmctdHBsLTI0MCAuZy11bml0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMCAwIDAgMjQzcHg7Ci0gIHdpZHRoOiBhdXRvOwotICBmbG9hdDogbm9uZTsKLX0KLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMjQwIC5nLWZpcnN0LAotLmctdW5pdCAuZy10cGwtMjQwIC5nLWZpcnN0LAotLmctdHBsLTI0MCAuZy1maXJzdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDA7Ci0gIHdpZHRoOiAyNDNweDsKLSAgZmxvYXQ6IGxlZnQ7Ci19Ci0vKiAyNDBweCBhbHQgKi8KLS5nLXRwbC0yNDAtYWx0IC5nLXVuaXQsCi0uZy11bml0IC5nLXRwbC0yNDAtYWx0IC5nLXVuaXQsCi0uZy11bml0IC5nLXVuaXQgLmctdHBsLTI0MC1hbHQgLmctdW5pdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDAgMjQzcHggMCAwOwotICB3aWR0aDogYXV0bzsKLSAgZmxvYXQ6IG5vbmU7Ci19Ci0uZy11bml0IC5nLXVuaXQgLmctdHBsLTI0MC1hbHQgLmctZmlyc3QsCi0uZy11bml0IC5nLXRwbC0yNDAtYWx0IC5nLWZpcnN0LAotLmctdHBsLTI0MC1hbHQgLmctZmlyc3QgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwOwotICB3aWR0aDogMjQzcHg7Ci0gIGZsb2F0OiByaWdodDsKLX0KLQotLyogMjAwcHggKi8KLS5nLXRwbC0yMDAgLmctdW5pdCwKLS5nLXVuaXQgLmctdHBsLTIwMCAuZy11bml0LAotLmctdW5pdCAuZy11bml0IC5nLXRwbC0yMDAgLmctdW5pdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDAgMCAwIDIwMHB4OwotICB3aWR0aDogYXV0bzsKLSAgZmxvYXQ6IG5vbmU7Ci19Ci0uZy11bml0IC5nLXVuaXQgLmctdHBsLTIwMCAuZy1maXJzdCwKLS5nLXVuaXQgLmctdHBsLTIwMCAuZy1maXJzdCwKLS5nLXRwbC0yMDAgLmctZmlyc3QgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwOwotICB3aWR0aDogMjAwcHg7Ci0gIGZsb2F0OiBsZWZ0OwotfQotLyogMjAwcHggYWx0ICovCi0uZy10cGwtMjAwLWFsdCAuZy11bml0LAotLmctdW5pdCAuZy10cGwtMjAwLWFsdCAuZy11bml0LAotLmctdW5pdCAuZy11bml0IC5nLXRwbC0yMDAtYWx0IC5nLXVuaXQgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwIDIwMHB4IDAgMDsKLSAgd2lkdGg6IGF1dG87Ci0gIGZsb2F0OiBub25lOwotfQotLmctdW5pdCAuZy11bml0IC5nLXRwbC0yMDAtYWx0IC5nLWZpcnN0LAotLmctdW5pdCAuZy10cGwtMjAwLWFsdCAuZy1maXJzdCwKLS5nLXRwbC0yMDAtYWx0IC5nLWZpcnN0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMDsKLSAgd2lkdGg6IDIwMHB4OwotICBmbG9hdDogcmlnaHQ7Ci19Ci0KLS8qIDE5MHB4ICovCi0uZy10cGwtMTkwIC5nLXVuaXQsCi0uZy11bml0IC5nLXRwbC0xOTAgLmctdW5pdCwKLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMTkwIC5nLXVuaXQgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwIDAgMCAxOTBweDsKLSAgd2lkdGg6IGF1dG87Ci0gIGZsb2F0OiBub25lOwotfQotLmctdW5pdCAuZy11bml0IC5nLXRwbC0xOTAgLmctZmlyc3QsCi0uZy11bml0IC5nLXRwbC0xOTAgLmctZmlyc3QsCi0uZy10cGwtMTkwIC5nLWZpcnN0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMDsKLSAgd2lkdGg6IDE5MHB4OwotICBmbG9hdDogbGVmdDsKLX0KLS8qIDE5MHB4IGFsdCAqLwotLmctdHBsLTE5MC1hbHQgLmctdW5pdCwKLS5nLXVuaXQgLmctdHBsLTE5MC1hbHQgLmctdW5pdCwKLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMTkwLWFsdCAuZy11bml0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMCAxOTBweCAwIDA7Ci0gIHdpZHRoOiBhdXRvOwotICBmbG9hdDogbm9uZTsKLX0KLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMTkwLWFsdCAuZy1maXJzdCwKLS5nLXVuaXQgLmctdHBsLTE5MC1hbHQgLmctZmlyc3QsCi0uZy10cGwtMTkwLWFsdCAuZy1maXJzdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDA7Ci0gIHdpZHRoOiAxOTBweDsKLSAgZmxvYXQ6IHJpZ2h0OwotfQotCi0vKiAxODBweCAqLwotLmctdHBsLTE4MCAuZy11bml0LAotLmctdW5pdCAuZy10cGwtMTgwIC5nLXVuaXQsCi0uZy11bml0IC5nLXVuaXQgLmctdHBsLTE4MCAuZy11bml0IHsKLSAgZGlzcGxheTogYmxvY2s7Ci0gIG1hcmdpbjogMCAwIDAgMTgwcHg7Ci0gIHdpZHRoOiBhdXRvOwotICBmbG9hdDogbm9uZTsKLX0KLS5nLXVuaXQgLmctdW5pdCAuZy10cGwtMTgwIC5nLWZpcnN0LAotLmctdW5pdCAuZy10cGwtMTgwIC5nLWZpcnN0LAotLmctdHBsLTE4MCAuZy1maXJzdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDA7Ci0gIHdpZHRoOiAxODBweDsKLSAgZmxvYXQ6IGxlZnQ7Ci19Ci0vKiAxODBweCBhbHQgKi8KLS5nLXRwbC0xODAtYWx0IC5nLXVuaXQsCi0uZy11bml0IC5nLXRwbC0xODAtYWx0IC5nLXVuaXQsCi0uZy11bml0IC5nLXVuaXQgLmctdHBsLTE4MC1hbHQgLmctdW5pdCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW46IDAgMTgwcHggMCAwOwotICB3aWR0aDogYXV0bzsKLSAgZmxvYXQ6IG5vbmU7Ci19Ci0uZy11bml0IC5nLXVuaXQgLmctdHBsLTE4MC1hbHQgLmctZmlyc3QsCi0uZy11bml0IC5nLXRwbC0xODAtYWx0IC5nLWZpcnN0LAotLmctdHBsLTE4MC1hbHQgLmctZmlyc3QgewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luOiAwOwotICB3aWR0aDogMTgwcHg7Ci0gIGZsb2F0OiByaWdodDsKLX0KLQotCi0vKiBKUVVFUlkgUkVTSVpBQkxFIFNUWUxFUyAqLwotLnVpLXJlc2l6YWJsZSB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfQotLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGRpc3BsYXk6IG5vbmU7IGZvbnQtc2l6ZTogMC4xcHg7IHotaW5kZXg6MTsgfQotLnVpLXJlc2l6YWJsZSAudWktcmVzaXphYmxlLWhhbmRsZSB7IGRpc3BsYXk6IGJsb2NrOyB9Ci1ib2R5IC51aS1yZXNpemFibGUtZGlzYWJsZWQgLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBkaXNwbGF5OiBub25lOyB9Ci1ib2R5IC51aS1yZXNpemFibGUtYXV0b2hpZGUgLnVpLXJlc2l6YWJsZS1oYW5kbGUgeyBkaXNwbGF5OiBub25lOyB9Ci0udWktcmVzaXphYmxlLXMgeyBjdXJzb3I6IHMtcmVzaXplOyBoZWlnaHQ6IDZweDsgd2lkdGg6IDEwMCU7IGJvdHRvbTogMHB4OyBsZWZ0OiAwcHg7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgiaW1hZ2VzL3Jlc2l6YWJsZS1zMi5naWYiKSByZXBlYXQgc2Nyb2xsIGNlbnRlciB0b3A7IH0KLS51aS1yZXNpemFibGUtZSB7IGN1cnNvcjogZS1yZXNpemU7IHdpZHRoOiA2cHg7IHJpZ2h0OiAwcHg7IHRvcDogMHB4OyBoZWlnaHQ6IDEwMCU7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgiaW1hZ2VzL3Jlc2l6YWJsZS1lMi5naWYiKSByZXBlYXQgc2Nyb2xsIHJpZ2h0IGNlbnRlcjsgfQotCi1AbWVkaWEgcHJpbnQgewotCi0gIGJvZHkgewotICAgIG92ZXJmbG93OnZpc2libGU7Ci0gIH0KLQotICAjaGVhZGVyIHsKLSAgICBoZWlnaHQ6NjBweDsKLSAgfQotCi0gICNoZWFkZXJMZWZ0IHsKLSAgICBwYWRkaW5nOjA7Ci0gIH0KLQotICAjaGVhZGVyLXRhYnMsCi0gICNoZWFkZXJSaWdodCwKLSAgI3NpZGUtbmF2LAotICAjYXBpLWluZm8tYmxvY2sgewotICAgIGRpc3BsYXk6bm9uZTsKLSAgfQotCi0gICNib2R5LWNvbnRlbnQgewotICAgIHBvc2l0aW9uOmluaGVyaXQ7Ci0gIH0KLQotICAjZG9jLWNvbnRlbnQgewotICAgIG1hcmdpbi1sZWZ0OjAgIWltcG9ydGFudDsKLSAgICBoZWlnaHQ6YXV0byAhaW1wb3J0YW50OwotICAgIHdpZHRoOmF1dG8gIWltcG9ydGFudDsKLSAgICBvdmVyZmxvdzppbmhlcml0OwotICAgIGRpc3BsYXk6aW5saW5lOwotICB9Ci0KLSAgI2pkLWhlYWRlciB7Ci0gICAgcGFkZGluZzoxMHB4IDA7Ci0gIH0KLQotICAjamQtY29udGVudCB7Ci0gICAgcGFkZGluZzoxNXB4IDAgMDsKLSAgfQotCi0gICNmb290ZXIgewotICAgIGZsb2F0Om5vbmU7Ci0gICAgbWFyZ2luOjJlbSAwIDA7Ci0gIH0KLQotICBoNC5qZC1kZXRhaWxzLXRpdGxlIHsKLSAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNjY2OwotICB9Ci0KLSAgcHJlIHsKLSAgICAvKiB0aGVzZSBhbGxvdyBsaW5lcyB0byBicmVhayAoaWYgdGhlcmUncyBhIHdoaXRlIHNwYWNlKSAqLwotICAgIG92ZXJmbG93OiB2aXNpYmxlOwotICAgIHRleHQtd3JhcDogdW5yZXN0cmljdGVkOwotICAgIHdoaXRlLXNwYWNlOiAtbW96LXByZS13cmFwOyAvKiBNb3ogKi8KLSAgICB3aGl0ZS1zcGFjZTogLXByZS13cmFwOyAvKiBPcGVyYSA0LTYgKi8KLSAgICB3aGl0ZS1zcGFjZTogLW8tcHJlLXdyYXA7IC8qIE9wZXJhIDcgKi8KLSAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IC8qIENTUzMgICovCi0gICAgd29yZC13cmFwOiBicmVhay13b3JkOyAvKiBJRSA1LjUrICovCi0gIH0KLQotICBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKLSAgICBwYWdlLWJyZWFrLWFmdGVyOiBhdm9pZDsKLSAgfQotCi0gIHRhYmxlLCBpbWcgewotICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvY3NzL2RlZmF1bHQuY3NzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvY3NzL2RlZmF1bHQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFmYTI1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2Nzcy9kZWZhdWx0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDQ2NjIgKzAsMCBAQAotLyogY29sb3IgZGVmaW5pdGlvbnMgKi8KLS8qIDE2IGNvbHVtbiBsYXlvdXQgKi8KLS8qIGNsZWFyZml4IGlkaW9tICovCi0vKiBjb21tb24gbWl4aW5zICovCi0vKiBwYWdlIGxheW91dCArIHRvcC1sZXZlbCBzdHlsZXMgKi8KLTo6c2VsZWN0aW9uIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzAwOTljYzsKLSAgY29sb3I6ICNmZmY7IH0KLTo6LXdlYmtpdC1zZWxlY3Rpb24gewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA5OWNjOwotICBjb2xvcjogI2ZmZjsgfQotOjotbW96LXNlbGVjdGlvbiB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICMwMDk5Y2M7Ci0gIGNvbG9yOiAjZmZmOyB9Ci0KLWh0bWwsIGJvZHkgewotICBoZWlnaHQ6IDEwMCU7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMDsKLSAgYmFja2dyb3VuZC1jb2xvcjojRjlGOUY5OwotICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgLyogcHJldmVudCBzdWJwaXhlbCBhbnRpYWxpYXNpbmcsIHdoaWNoIHRoaWNrZW5zIHRoZSB0ZXh0ICovCi0gIC8qIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7ICovCi0gIC8qIHR1cm5lZCBvZmYgbGlnYXR1cmVzIGR1ZSB0byBidWcgNTk0NTQ1NSAqLyB9Ci0KLWJvZHkgewotICBjb2xvcjogIzIyMjsKLSAgZm9udDogMTRweC8xOXB4IFJvYm90bywgc2Fucy1zZXJpZjsKLSAgZm9udC13ZWlnaHQ6IDQwMDsKLSAgbGV0dGVyLXNwYWNpbmc6LjE7Ci0gIHBhZGRpbmc6MCAxMHB4OyB9Ci0KLSNwYWdlLWNvbnRhaW5lciB7Ci0gIHdpZHRoOiA5NDBweDsKLSAgbWFyZ2luOiAwIDQwcHg7IH0KLQotI3BhZ2UtaGVhZGVyIHsKLSAgaGVpZ2h0OiA4MHB4OwotICBtYXJnaW4tYm90dG9tOiAyMHB4OwotICBmb250LXNpemU6IDQ4cHg7Ci0gIGxpbmUtaGVpZ2h0OiA0OHB4OwotICBmb250LXdlaWdodDogMTAwOwotICBwYWRkaW5nLWxlZnQ6IDEwcHg7IH0KLSAgI3BhZ2UtaGVhZGVyIGEgewotICAgIGRpc3BsYXk6IGJsb2NrOwotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICB0b3A6IDIwcHg7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIGNvbG9yOiAjNTU1NTU1ICFpbXBvcnRhbnQ7IH0KLQotI21haW4tcm93IHsKLSAgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9Ci0gICNtYWluLXJvdzphZnRlciB7Ci0gICAgY29udGVudDogIi4iOwotICAgIGRpc3BsYXk6IGJsb2NrOwotICAgIGhlaWdodDogMDsKLSAgICBjbGVhcjogYm90aDsKLSAgICB2aXNpYmlsaXR5OiBoaWRkZW47IH0KLSAgKiBodG1sICNtYWluLXJvdyB7Ci0gICAgaGVpZ2h0OiAxcHg7IH0KLQotI3BhZ2UtZm9vdGVyIHsKLSAgbWFyZ2luLWxlZnQ6IDE5MHB4OwotICBtYXJnaW4tdG9wOiA4MHB4OwotICBjb2xvcjogIzk5OTk5OTsKLSAgcGFkZGluZy1ib3R0b206IDQwcHg7Ci0gIGZvbnQtc2l6ZTogMTJweDsKLSAgbGluZS1oZWlnaHQ6IDE1cHg7IH0KLSAgI3BhZ2UtZm9vdGVyIGEgewotICAgIGNvbG9yOiAjNzc3Nzc3OyB9Ci0gICNwYWdlLWZvb3RlciAjY29weXJpZ2h0IHsKLSAgICBtYXJnaW4tYm90dG9tOiAxMHB4OyB9Ci0KLSNuYXYtY29udGFpbmVyIHsKLSAgd2lkdGg6IDE2MHB4OwotICBtaW4taGVpZ2h0OiAxMHB4OwotICBtYXJnaW4tcmlnaHQ6IDIwcHg7Ci0gIGZsb2F0OiBsZWZ0OyB9Ci0KLSNuYXYgewotICBtYXJnaW46MDsKLSAgcGFkZGluZzowIDAgMzBweDsKLX0KLQotI3NpZGUtbmF2IHsKLSAgbWluLWhlaWdodDo1cHg7IC8qIHNpbGx5IHdheSB0byBhdm9pZCBkb2MgZmxvYXRpbmcgbGVmdCB3aGVuIG5hdiBnb2VzIGZpeGVkICovCi0gIG1hcmdpbi1ib3R0b206MXB4OwotfQotI2RldmRvYy1uYXYgewotICBvdXRsaW5lOm5vbmU7Ci0gIHdpZHRoOmF1dG87Ci0gIG1hcmdpbjogMjBweCAwIDA7IH0KLSAgCi0jZGV2ZG9jLW5hdiBoMiB7Ci0gIGJvcmRlcjowOwotfQotCi0jZGV2ZG9jLW5hdi5maXhlZCB7Ci0gIHBvc2l0aW9uOiBmaXhlZDsKLSAgbWFyZ2luOjA7Ci0gIHRvcDogMjBweDsgfQotICAKLSNkZXZkb2MtbmF2IHNwYW4uc21hbGwgewotICBmb250LXNpemU6MTJweDsKLSAgZm9udC13ZWlnaHQ6bm9ybWFsOwotfQotCi0jY29udGVudCB7Ci0gIHdpZHRoOiA3NjBweDsKLSAgZmxvYXQ6IGxlZnQ7IH0KLQotYTpob3ZlciwKLWFjcm9ueW06aG92ZXIgewotICBjb2xvcjogIzdhYTFiMCAhaW1wb3J0YW50OyB9Ci0KLWE6Zm9jdXMsCi1hOmFjdGl2ZSB7Ci0gIGNvbG9yOiAjMzNiNWU1ICFpbXBvcnRhbnQ7IH0KLSAgCi1hLmV4dGVybmFsLWxpbmsgewotICBiYWNrZ3JvdW5kOnVybCgnLi4vaW1hZ2VzL3N0eWxlcy9vcGVuX25ld19wYWdlLnBuZycpIG5vLXJlcGVhdCAxMDAlIDUwJTsKLSAgcGFkZGluZy1yaWdodDoxNnB4OwotfQotCi0ubm93cmFwIHsKLSAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKLX0KLQotaW1nIHsKLSAgYm9yZGVyOiBub25lOyB9Ci0jamQtY29udGVudCBpbWcgewotICBtYXJnaW4tYm90dG9tOjE1cHg7Ci19Ci0KLXVsIHsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwOyB9Ci0KLXN0cm9uZyB7Ci0gIGZvbnQtd2VpZ2h0OiA1MDA7IH0KLQotZW0gewotICBmb250LXN0eWxlOiBpdGFsaWM7IH0KLQotYWNyb255bSwKLS50b29sdGlwLWxpbmsgewotICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICM1NTU1NTU7Ci0gIGN1cnNvcjogaGVscDsgfQotCi1hY3JvbnltOmhvdmVyLAotLnRvb2x0aXAtbGluazpob3ZlciB7Ci0gIGNvbG9yOiAjN2FhMWIwOwotICBib3JkZXItYm90dG9tLWNvbG9yOiAjN2FhMWIwOyB9Ci0KLWltZy53aXRoLXNoYWRvdywKLXZpZGVvLndpdGgtc2hhZG93IHsKLSAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7IH0KLQotLyogZGlzY2xvc3VyZXMgbWl4aW4gKi8KLS8qIGNvbnRlbnQgbGF5b3V0ICovCi0ubGF5b3V0LWNvbnRlbnQtcm93IHsKLSAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICBtYXJnaW4tYm90dG9tOiAxMHB4OyB9Ci0gIC5sYXlvdXQtY29udGVudC1yb3c6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICIuIjsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICBoZWlnaHQ6IDA7Ci0gICAgY2xlYXI6IGJvdGg7Ci0gICAgdmlzaWJpbGl0eTogaGlkZGVuOyB9Ci0gICogaHRtbCAubGF5b3V0LWNvbnRlbnQtcm93IHsKLSAgICBoZWlnaHQ6IDFweDsgfQotCi0ubGF5b3V0LWNvbnRlbnQtY29sIHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIG1hcmdpbi1sZWZ0OiAyMHB4OyB9Ci0gIC5sYXlvdXQtY29udGVudC1jb2w6Zmlyc3QtY2hpbGQgewotICAgIG1hcmdpbi1sZWZ0OiAwOyB9Ci0gIC5sYXlvdXQtY29udGVudC1jb2wgaDMsCi0gIC5sYXlvdXQtY29udGVudC1jb2wgaDQgewotICAgIG1hcmdpbi10b3A6MDsgfQotCi0ubGF5b3V0LWNvbnRlbnQtY29sLnNwYW4tMSB7Ci0gIHdpZHRoOiA0MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0yIHsKLSAgd2lkdGg6IDEwMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0zIHsKLSAgd2lkdGg6IDE2MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi00IHsKLSAgd2lkdGg6IDIyMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi01IHsKLSAgd2lkdGg6IDI4MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi02IHsKLSAgd2lkdGg6IDM0MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi03IHsKLSAgd2lkdGg6IDQwMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi04IHsKLSAgd2lkdGg6IDQ2MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi05IHsKLSAgd2lkdGg6IDUyMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0xMCB7Ci0gIHdpZHRoOiA1ODBweDsgfQotCi0ubGF5b3V0LWNvbnRlbnQtY29sLnNwYW4tMTEgewotICB3aWR0aDogNjQwcHg7IH0KLQotLmxheW91dC1jb250ZW50LWNvbC5zcGFuLTEyIHsKLSAgd2lkdGg6IDcwMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0xMyB7Ci0gIHdpZHRoOiA3NjBweDsgfQotCi0udnNwYWNlLnNpemUtMSB7Ci0gIGhlaWdodDogMTBweDsgfQotCi0udnNwYWNlLnNpemUtMiB7Ci0gIGhlaWdodDogMjBweDsgfQotCi0udnNwYWNlLnNpemUtMyB7Ci0gIGhlaWdodDogMzBweDsgfQotCi0udnNwYWNlLnNpemUtNCB7Ci0gIGhlaWdodDogNDBweDsgfQotCi0udnNwYWNlLnNpemUtNSB7Ci0gIGhlaWdodDogNTBweDsgfQotCi0udnNwYWNlLnNpemUtNiB7Ci0gIGhlaWdodDogNjBweDsgfQotCi0udnNwYWNlLnNpemUtNyB7Ci0gIGhlaWdodDogNzBweDsgfQotCi0udnNwYWNlLnNpemUtOCB7Ci0gIGhlaWdodDogODBweDsgfQotCi0udnNwYWNlLnNpemUtOSB7Ci0gIGhlaWdodDogOTBweDsgfQotCi0udnNwYWNlLnNpemUtMTAgewotICBoZWlnaHQ6IDEwMHB4OyB9Ci0KLS52c3BhY2Uuc2l6ZS0xMSB7Ci0gIGhlaWdodDogMTEwcHg7IH0KLQotLnZzcGFjZS5zaXplLTEyIHsKLSAgaGVpZ2h0OiAxMjBweDsgfQotCi0udnNwYWNlLnNpemUtMTMgewotICBoZWlnaHQ6IDEzMHB4OyB9Ci0KLS52c3BhY2Uuc2l6ZS0xNCB7Ci0gIGhlaWdodDogMTQwcHg7IH0KLQotLnZzcGFjZS5zaXplLTE1IHsKLSAgaGVpZ2h0OiAxNTBweDsgfQotCi0udnNwYWNlLnNpemUtMTYgewotICBoZWlnaHQ6IDE2MHB4OyB9Ci0KLS8qIG5hdiAqLwotI25hdiB7Ci0gIC8qIHNlY3Rpb24gaGVhZGVyIGRpdnMgKi8KLSAgLyogZXhwYW5kZWQgc2VjdGlvbiBoZWFkZXIgZGl2cyAqLwotICAvKiBzdWJsaW5rcyAqLyB9Ci0gICNuYXYgbGkgewotICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLSAgICBmb250LXNpemU6IDE0cHg7Ci0gICAgbWFyZ2luOjA7Ci0gICAgcGFkZGluZzowOwotICAgIGxpbmUtaGVpZ2h0OiAxNXB4OyB9Ci0gICNuYXYgYSB7Ci0gICAgY29sb3I6ICM1NTU1NTU7Ci0gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgIHdvcmQtd3JhcDpicmVhay13b3JkOyB9Ci0gICNuYXYgLm5hdi1zZWN0aW9uLWhlYWRlciB7Ci0gICAgcG9zaXRpb246IHJlbGF0aXZlOwotICAgIG1hcmdpbi1ib3R0b206IDFweDsKLSAgICBwYWRkaW5nOiAwIDMwcHggMCAwOyB9Ci0gICNuYXYgbGkuc2VsZWN0ZWQgYSwgI25hdiBsaS5zZWxlY3RlZCA+IC5uYXYtc2VjdGlvbi1oZWFkZXIgPiBhIHsKLSAgICBjb2xvcjogIzA5QzsKLSAgfQotICAjbmF2IGxpLnNlbGVjdGVkIHVsIGxpIGEgewotICAvKiBkb24ndCBoaWdobGlnaHQgY2hpbGQgaXRlbXMgKi8KLSAgICBjb2xvcjogIzU1NTU1NTsgfQotICAjbmF2IC5uYXYtc2VjdGlvbiAubmF2LXNlY3Rpb24gLm5hdi1zZWN0aW9uLWhlYWRlciB7Ci0gICAgLyogbm8gd2hpdGUgbGluZSBiZXR3ZWVuIHNlY29uZCBsZXZlbCBzZWN0aW9ucyAqLwotICAgIG1hcmdpbi1ib3R0b206IDA7IH0KLSAgICAvKiBzZWN0aW9uIGhlYWRlciBsaW5rcyAqLwotICAgICNuYXYgPiBsaSA+IGRpdiA+IGEgewotICAgICAgZGlzcGxheTogYmxvY2s7Ci0gICAgICBjb2xvcjogIzMzMzMzMzsKLSAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gICAgICBwYWRkaW5nOiAxMHB4IDAgMTBweCAxMHB4OyB9Ci0gICAgI25hdiAubmF2LXNlY3Rpb24taGVhZGVyOmFmdGVyIHsKLSAgICAgIGNvbnRlbnQ6ICcnOwotICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9kb3duLnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgICAgd2lkdGg6IDM0cHg7Ci0gICAgICBoZWlnaHQ6IDM0cHg7Ci0gICAgICBkaXNwbGF5OiBibG9jazsKLSAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICAgIHRvcDogMDsKLSAgICAgIHJpZ2h0OiAwOyB9Ci0gICAgI25hdiAubmF2LXNlY3Rpb24taGVhZGVyLmVtcHR5OmFmdGVyIHsKLSAgICAgIGRpc3BsYXk6IG5vbmU7IH0KLSAgICAvKiBuZXN0ZWQgbmF2IGhlYWRlcnMgKi8KLSAgICAjbmF2IC5uYXYtc2VjdGlvbiAubmF2LXNlY3Rpb24gewotICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwotICAgICAgcGFkZGluZzogMDsKLSAgICAgIG1hcmdpbjogMDsgfQotICAgICNuYXYgLm5hdi1zZWN0aW9uIGxpIGEgewotICAgIC8qIGZpcnN0IGdlbiBjaGlsZCAoMm5kIGxldmVsIGxpKSAqLwotICAgICAgZGlzcGxheTpibG9jazsKLSAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0gICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLSAgICAgIHBhZGRpbmc6IDdweCA1cHggN3B4IDEwcHg7Ci0gICAgICAgfQotICAgICNuYXYgLm5hdi1zZWN0aW9uIGxpIGxpIGEgewotICAgIC8qIHNlY29uZCBnZW4gY2hpbGQgKDNyZCBsZXZlbCBsaSkgKi8KLSAgICAgIHBhZGRpbmc6IDVweCA1cHggNXB4IDEwcHg7Ci0gICAgICAgfQotICAjbmF2IGxpLmV4cGFuZGVkIC5uYXYtc2VjdGlvbi1oZWFkZXIgewotICAgIGJhY2tncm91bmQ6I2U5ZTllOTsKLSAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDUpOyB9Ci0gICNuYXYgbGkuZXhwYW5kZWQgbGkgLm5hdi1zZWN0aW9uLWhlYWRlciB7Ci0gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH0KLSAgI25hdiBsaS5leHBhbmRlZCBsaSB1bCB7Ci0gIC8qIDNyZCBsZXZlbCB1bCAqLwotICAgIHBhZGRpbmc6MCAwIDAgMTBweDsKLSAgfQotICAgICNuYXYgbGkuZXhwYW5kZWQgPiAubmF2LXNlY3Rpb24taGVhZGVyOmFmdGVyIHsKLSAgICAgIGNvbnRlbnQ6ICcnOwotICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV91cC5wbmcpIG5vLXJlcGVhdCBzY3JvbGwgNTAlIDUwJTsKLSAgICAgIHdpZHRoOiAzNHB4OwotICAgICAgaGVpZ2h0OiAzNHB4OyB9Ci0gICNuYXYgbGkuZXhwYW5kZWQgbGkgdWwudHJlZS1saXN0LWNoaWxkcmVuIHsKLSAgICBwYWRkaW5nOjA7ICAKLSAgfQotICAjbmF2IGxpLmV4cGFuZGVkIGxpIHVsLnRyZWUtbGlzdC1jaGlsZHJlbiAudHJlZS1saXN0LWNoaWxkcmVuIHsKLSAgICBwYWRkaW5nOjAgMCAwIDEwcHg7ICAKLSAgfQotICAjbmF2IGxpIHNwYW4udHJlZS1saXN0LXN1YnRpdGxlIHsKLSAgICBkaXNwbGF5OmlubGluZS1ibG9jazsKLSAgICBwYWRkaW5nOjVweCAwIDAgMTBweDsKLSAgICBjb2xvcjojNTU1OwotICAgIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKLSAgICBmb250LXNpemU6MTJweDsKLSAgfQotICAjbmF2IGxpIHNwYW4udHJlZS1saXN0LXN1YnRpdGxlOmJlZm9yZSB7Ci0gICAgY29udGVudDogJ+KAlCc7Ci0gIH0KLSAgI25hdiBsaSBzcGFuLnRyZWUtbGlzdC1zdWJ0aXRsZTphZnRlciB7Ci0gICAgY29udGVudDogJ+KAlCc7Ci0gIH0KLSAgI25hdiBsaSB1bCB7Ci0gICAgZGlzcGxheTpub25lOwotICAgIG92ZXJmbG93OiBoaWRkZW47Ci0gICAgbWFyZ2luOiAwOyB9Ci0gICAgI25hdiBsaSB1bC5hbmltYXRlLWhlaWdodC1pbiB7Ci0gICAgICAtd2Via2l0LXRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlLWluOwotICAgICAgLW1vei10cmFuc2l0aW9uOiBoZWlnaHQgMC4yNXMgZWFzZS1pbjsKLSAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlLWluOyB9Ci0gICAgI25hdiBsaSB1bC5hbmltYXRlLWhlaWdodC1vdXQgewotICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBoZWlnaHQgMC4yNXMgZWFzZS1vdXQ7Ci0gICAgICAtbW96LXRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlLW91dDsKLSAgICAgIHRyYW5zaXRpb246IGhlaWdodCAwLjI1cyBlYXNlLW91dDsgfQotICAgICNuYXYgbGkgdWwgbGkgewotICAgICAgcGFkZGluZzogMDsgfQotICAgICAgI25hdiBsaSBsaSBsaSB7Ci0gICAgICAgIHBhZGRpbmc6IDA7IH0KLSAgI25hdiBsaS5leHBhbmRlZCB1bCB7Ci0gICAgfQotICAgICNuYXYgbGkgdWwgPiBsaSB7Ci0gICAgICBwYWRkaW5nOjA7Ci0gICAgfQotICAgICNuYXYgbGkgdWwgPiBsaTpsYXN0LWNoaWxkIHsKLSAgICAgIHBhZGRpbmctYm90dG9tOjVweDsKLSAgICB9Ci0gICAgI25hdiBsaSB1bC50cmVlLWxpc3QtY2hpbGRyZW4gPiBsaTpsYXN0LWNoaWxkIHsKLSAgICAgIHBhZGRpbmctYm90dG9tOjA7Ci0gICAgfQotICAgICNuYXYgbGkuZXhwYW5kZWQgdWwgPiBsaSB7Ci0gICAgICBiYWNrZ3JvdW5kOiNlZmVmZWY7Ci0gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDMpOyB9Ci0gICAgI25hdiBsaS5leHBhbmRlZCB1bCA+IGxpIGxpIHsKLSAgICAgIGJhY2tncm91bmQ6aW5oZXJpdDsgfQotICAjbmF2IGxpIHVsLnRyZWUtbGlzdC1jaGlsZHJlbiB1bCB7Ci0gICAgZGlzcGxheTpibG9jazsgfQotCi0ubmV3LAotLm5ldy1jaGlsZCB7Ci0gIGZvbnQtc2l6ZTogLjc4ZW07Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotICBjb2xvcjogI2ZmM2QzZDsKLSAgdmVydGljYWwtYWxpZ246dG9wOwotICB3aGl0ZS1zcGFjZTpub3dyYXA7Ci19Ci0KLS8qIGNvbnRlbnQgaGVhZGVyICovCi0uY29udGVudC1oZWFkZXIgewotICBoZWlnaHQ6IDMwcHg7Ci0gIG1hcmdpbjoyMHB4IDAgMjVweDsKLSAgcGFkZGluZzowIDAgMTBweDt9Ci0uY29udGVudC1oZWFkZXIuanVzdC1saW5rcyB7Ci0gIG1hcmdpbi1ib3R0b206MDsKLSAgcGFkZGluZy1ib3R0b206MDt9Ci0gCi0uY29udGVudC1oZWFkZXIgaDEgewotICBjb2xvcjojMDAwOwotICBtYXJnaW46MDsKLSAgYm9yZGVyLWJvdHRvbTowOwotICBwYWRkaW5nOjA7Ci19Ci0KLS5jb250ZW50LWZvb3RlciB7Ci0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOwotICBtYXJnaW4tdG9wOiAxMHB4OwotICBwYWRkaW5nLXRvcDoxMHB4OwotICBoZWlnaHQ6IDMwcHg7Ci19Ci0KLS5jb250ZW50LWZvb3Rlci1zYWMgewotICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjYzsKLX0KLS5jb250ZW50LWZvb3RlciAuY29sLTkgewotICBtYXJnaW4tbGVmdDowOwotfQotLmNvbnRlbnQtZm9vdGVyIC5jb2wtNCB7Ci0gIG1hcmdpbi1yaWdodDowOwotfQotLmNvbnRlbnQtZm9vdGVyLndyYXAgewotICB3aWR0aDo5NDBweDsKLX0KLQotLnBhZ2luZy1saW5rcyB7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQotICAucGFnaW5nLWxpbmtzIGEgewotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgfQotICAucGFnaW5nLWxpbmtzIGEsCi0gIC50cmFpbmluZy1uYXYtdG9wIGEgewotICAgIGZvbnQtc2l6ZTogMTRweDsKLSAgICBsaW5lLWhlaWdodDogMzBweDsKLSAgICBjb2xvcjogIzU1NTU1NTsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfQotICAgIC5wYWdpbmctbGlua3MgLnByZXYtcGFnZS1saW5rOmJlZm9yZSwKLSAgICAudHJhaW5pbmctbmF2LXRvcCAucHJldi1wYWdlLWxpbms6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICcnOwotICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9sZWZ0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgICAgd2lkdGg6IDEwcHg7Ci0gICAgICBoZWlnaHQ6IDEwcHg7Ci0gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gICAgICBtYXJnaW4tcmlnaHQ6IDVweDsgfQotICAgIC50cmFpbmluZy1uYXYtdG9wIC5uZXh0LXBhZ2UtbGluaywKLSAgICAudHJhaW5pbmctbmF2LXRvcCAuc3RhcnQtY2xhc3MtbGluaywKLSAgICAudHJhaW5pbmctbmF2LXRvcCAuc3RhcnQtY291cnNlLWxpbmsgewotICAgIHJpZ2h0OiAxMHB4OyB9Ci0gICAgLnBhZ2luZy1saW5rcyAucHJldi1wYWdlLWxpbmsgewotICAgICAgbGVmdDogLTE1cHg7IH0KLSAgICAucGFnaW5nLWxpbmtzIC5uZXh0LXBhZ2UtbGluayB7Ci0gICAgICByaWdodDogMHB4OyB9Ci0gICAgLm5leHQtcGFnZS1saW5rOmFmdGVyLAotICAgIC5zdGFydC1jbGFzcy1saW5rOmFmdGVyLAotICAgIC5zdGFydC1jb3Vyc2UtbGluazphZnRlciwKLSAgICAubmV4dC1jbGFzcy1saW5rOmFmdGVyIHsKLSAgICAgIGNvbnRlbnQ6ICcnOwotICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9yaWdodC5wbmcpIG5vLXJlcGVhdCBzY3JvbGwgNTAlIDUwJTsKLSAgICAgIHdpZHRoOiAxMHB4OwotICAgICAgaGVpZ2h0OiAxMHB4OwotICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICAgICAgbWFyZ2luLWxlZnQ6IDVweDsgfQotICAgICAgCi0gICAgICAKLSAgLnRyYWluaW5nLW5hdi10b3AgYSB7Ci0gICAgZGlzcGxheTpibG9jazsKLSAgICBmbG9hdDpsZWZ0OwotICAgIHdpZHRoOjEyMnB4OwotICAgIGhlaWdodDoyOHB4OwotICAgIHBhZGRpbmc6IDhweDsKLSAgICBsaW5lLWhlaWdodDoyOHB4OwotICAgIHRleHQtYWxpZ246Y2VudGVyOwotICAgIGJvcmRlcjoxcHggc29saWQgI0RBREFEQTsKLSAgICBib3JkZXItYm90dG9tOjA7Ci0gIH0KLQotICAudHJhaW5pbmctbmF2LXRvcCBhLm5leHQtcGFnZS1saW5rIHsKLSAgICBib3JkZXItbGVmdDowOwotICAgIHdpZHRoOjEyM3B4OwotICB9Ci0gICAgICAKLSAgLnBhZ2luZy1saW5rcyBhLmRpc2FibGVkLAotICAudHJhaW5pbmctbmF2LXRvcCBhLmRpc2FibGVkLAotICAuY29udGVudC1mb290ZXIgYS5kaXNhYmxlZCB7Ci0gICAgY29sb3I6I2JiYjsKLSAgfQotICAgICAgCi0gIC5wYWdpbmctbGlua3MgYS5kaXNhYmxlZDpob3ZlciwKLSAgLnRyYWluaW5nLW5hdi10b3AgYS5kaXNhYmxlZDpob3ZlciwKLSAgLmNvbnRlbnQtZm9vdGVyIGEuZGlzYWJsZWQ6aG92ZXIgewotICAgIGN1cnNvcjpkZWZhdWx0OwotICAgIGNvbG9yOiNiYmIgIWltcG9ydGFudDsKLSAgfQotICAgICAgCi0gIC50cmFpbmluZy1uYXYtdG9wIGEuc3RhcnQtY2xhc3MtbGluaywKLSAgLnRyYWluaW5nLW5hdi10b3AgYS5zdGFydC1jb3Vyc2UtbGluayB7Ci0gICAgd2lkdGg6MjYycHg7Ci0gIH0KLSAgCi0gIC8qIGxpc3Qgb2YgY2xhc3NlcyBvbiBjb3Vyc2UgbGFuZGluZyBwYWdlICovCi0gIG9sLmNsYXNzLWxpc3QgewotICAgIGxpc3Qtc3R5bGU6bm9uZTsKLSAgICBtYXJnaW4tbGVmdDowOwotICB9Ci0gIG9sLmNsYXNzLWxpc3Q+bGkgewotICAgIG1hcmdpbjowIDAgMTVweDsKLSAgICBwYWRkaW5nOjVweCAwIDA7Ci0gICAgb3ZlcmZsb3c6aGlkZGVuOwotICAgIGJvcmRlci10b3A6MXB4IHNvbGlkICNjY2M7Ci0gIH0KLSAgb2wuY2xhc3MtbGlzdCBsaSBhLnRpdGxlIHsKLSAgICBmb250LXNpemU6MTZweDsKLSAgICBtYXJnaW46MDsKLSAgICBjbGVhcjpsZWZ0OwotICAgIGRpc3BsYXk6YmxvY2s7Ci0gICAgaGVpZ2h0OjMycHg7Ci0gICAgcGFkZGluZzowIDRweDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIGEudGl0bGUgaDIgewotICAgIGNvbG9yOmluaGVyaXQ7Ci0gICAgbWFyZ2luOjAgMCAxMHB4OwotICAgIGRpc3BsYXk6YmxvY2s7Ci0gICAgZmxvYXQ6bGVmdDsKLSAgICB3aWR0aDo2NzVweDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIGEudGl0bGUgc3BhbiB7Ci0gICAgZGlzcGxheTpub25lOwotICAgIGZsb2F0OmxlZnQ7Ci0gICAgZm9udC1zaXplOjE4cHg7Ci0gICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX3JpZ2h0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgIHdpZHRoOiAxMHB4OwotICAgIGhlaWdodDogMzJweDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIGEudGl0bGU6aG92ZXIgewotICAgIGJhY2tncm91bmQ6I2RkZDsKLSAgICBjb2xvcjojMjU4QUFGICFpbXBvcnRhbnQ7Ci0gIH0KLSAgb2wuY2xhc3MtbGlzdCBsaSBhLnRpdGxlOmhvdmVyIHNwYW4gewotICAgIGRpc3BsYXk6YmxvY2s7Ci0gIH0KLSAgCi0gICNqZC1jb250ZW50Ci0gIG9sLmNsYXNzLWxpc3QgbGkgaW1nIHsKLSAgICBmbG9hdDpsZWZ0OwotICAgIGNsZWFyOmxlZnQ7Ci0gICAgd2lkdGg6NjRweDsKLSAgICBtYXJnaW46MCAyMHB4IDAgMDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIHAuZGVzY3JpcHRpb24gewotICAgIGZsb2F0OmxlZnQ7Ci0gICAgZGlzcGxheTpibG9jazsKLSAgICB3aWR0aDoyNTBweDsKLSAgICBtYXJnaW46MDsKLSAgfQotICBvbC5jbGFzcy1saXN0IGxpIHAuZGVzY3JpcHRpb24uYXJ0aWNsZSB7Ci0gICAgd2lkdGg6IDU1MHB4OwotICB9Ci0gIG9sLmNsYXNzLWxpc3Qgb2wgewotICAgIGZsb2F0OmxlZnQ7Ci0gICAgd2lkdGg6MzIwcHg7Ci0gICAgbWFyZ2luOjAgMCAwIDMwcHg7Ci0gICAgbGlzdC1zdHlsZTpub25lOwotICAgIG1hcmdpbjowIDAgMCAyMHB4OwotICB9Ci0gIG9sLmNsYXNzLWxpc3QgZGl2Lmxlc3NvbnMgbGkgewotICAgIG1hcmdpbjowIDAgNnB4OwotICAgIGxpbmUtaGVpZ2h0OjE2cHg7Ci0gIH0KLSAgCi0gIAotICAuaGlkZSB7Ci0gICAgZGlzcGxheTpub25lICFpbXBvcnRhbnQ7Ci0gIH0KLSAgCi0gIC5jb250ZW50LWZvb3Rlci5uZXh0LWNsYXNzIHsKLSAgICBkaXNwbGF5OmJsb2NrOwotICAgIGJvcmRlcjowOwotICAgIG1hcmdpbi10b3A6MDsKLSAgICBwYWRkaW5nLXRvcDowOwotICB9Ci0gIAotICAuY29udGVudC1mb290ZXIubmV4dC1jbGFzcyBhLm5leHQtY2xhc3MtbGluayB7Ci0gICAgZGlzcGxheTpibG9jazsKLSAgICBmbG9hdDpyaWdodDsKLSAgICB0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ci0gIH0KLSAgCi0gIAotICAKLSAgLyogaW5uZXItZG9jIHRhYnMgdy8gdGl0bGUgKi8KLSAgCi1kaXYjdGl0bGUtdGFicy13cmFwcGVyIHsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzsKLSAgbWFyZ2luOjIwcHggMCAzMHB4OwotfQotaDEud2l0aC10aXRsZS10YWJzIHsKLSAgZGlzcGxheTppbmxpbmUtYmxvY2s7Ci0gIG1hcmdpbjowIDAgLTFweCAwOwotICBwYWRkaW5nOjAgNjBweCAwIDA7Ci0gIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNGOUY5Rjk7Ci19Ci11bCN0aXRsZS10YWJzIHsKLSAgbGlzdC1zdHlsZTpub25lOwotICBwYWRkaW5nOjA7Ci0gIGhlaWdodDoyOXB4OwotICBtYXJnaW46MDsKLSAgZm9udC1zaXplOjE2cHg7Ci0gIGxpbmUtaGVpZ2h0OjI2cHg7Ci0gIGRpc3BsYXk6aW5saW5lLWJsb2NrOwotICB2ZXJ0aWNhbC1hbGlnbjpib3R0b207Ci19Ci11bCN0aXRsZS10YWJzIGxpIHsKLSAgZGlzcGxheTpibG9jazsKLSAgZmxvYXQ6bGVmdDsKLSAgbWFyZ2luLXJpZ2h0OjQwcHg7Ci0gIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCB0cmFuc3BhcmVudDsKLX0KLXVsI3RpdGxlLXRhYnMgbGkuc2VsZWN0ZWQgewotICBib3JkZXItYm90dG9tOiAzcHggc29saWQgIzkzQzsKLX0KLXVsI3RpdGxlLXRhYnMgbGkgYSB7Ci0gIGNvbG9yOiMzMzM7Ci19Ci11bCN0aXRsZS10YWJzIGxpIGE6aG92ZXIsCi11bCN0aXRsZS10YWJzIGxpIGE6YWN0aXZlIHsKLSAgY29sb3I6IzkzQyAhaW1wb3J0YW50OwotfQotCi0KLQotLyogY29udGVudCBib2R5ICovCi1ALXdlYmtpdC1rZXlmcmFtZXMgZ2xvd2hlYWRlciB7Ci0gIGZyb20gewotICAgIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci0gICAgY29sb3I6ICMwMDA7Ci0gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzAwMDsgfQotCi0gIHRvIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLSAgICBjb2xvcjogIzMzYjVlNTsKLSAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMzNiNWU1OyB9IH0KLQotQC1tb3ota2V5ZnJhbWVzIGdsb3doZWFkZXIgewotICBmcm9tIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzNiNWU1OwotICAgIGNvbG9yOiAjMDAwOwotICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICMwMDA7IH0KLQotICB0byB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci0gICAgY29sb3I6ICMzM2I1ZTU7Ci0gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzMzYjVlNTsgfSB9Ci0KLUBrZXlmcmFtZXMgZ2xvd2hlYWRlciB7Ci0gIGZyb20gewotICAgIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci0gICAgY29sb3I6ICMwMDA7Ci0gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzAwMDsgfQotCi0gIHRvIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLSAgICBjb2xvcjogIzMzYjVlNTsKLSAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMzNiNWU1OyB9IH0KLQotaDI6dGFyZ2V0LAotaDM6dGFyZ2V0IHsKLSAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBnbG93aGVhZGVyOwotICAgIC1tb3otYW5pbWF0aW9uLW5hbWU6IGdsb3doZWFkZXI7Ci0gICAgYW5pbWF0aW9uLW5hbWU6IGdsb3doZWFkZXI7Ci0gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDAuN3M7Ci0gICAgLW1vei1hbmltYXRpb24tZHVyYXRpb246IDAuN3M7Ci0gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjdzOwotICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7Ci0gICAgLW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsKLSAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsgfQotCi0uZGVzaWduIG9sIGg0IHsKLSAgbWFyZ2luLWJvdHRvbTowOwotfQotLmRlc2lnbiBvbCB7Ci0gIGNvdW50ZXItcmVzZXQ6IGl0ZW07IH0KLSAgLmRlc2lnbiBvbD5saSB7Ci0gICAgZm9udC1zaXplOiAxNHB4OwotICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwotICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7IH0KLSAgICAuZGVzaWduIG9sPmxpOmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiBjb3VudGVyKGl0ZW0pICIuICI7Ci0gICAgICBjb3VudGVyLWluY3JlbWVudDogaXRlbTsKLSAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICAgIGxlZnQ6IC0yMHB4OwotICAgICAgdG9wOiAwOyB9Ci0gICAgLmRlc2lnbiBvbCBsaS52YWx1ZS0xOmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiAiMS4gIjsgfQotICAgIC5kZXNpZ24gb2wgbGkudmFsdWUtMjpiZWZvcmUgewotICAgICAgY29udGVudDogIjIuICI7IH0KLSAgICAuZGVzaWduIG9sIGxpLnZhbHVlLTM6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICIzLiAiOyB9Ci0gICAgLmRlc2lnbiBvbCBsaS52YWx1ZS00OmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiAiNC4gIjsgfQotICAgIC5kZXNpZ24gb2wgbGkudmFsdWUtNTpiZWZvcmUgewotICAgICAgY29udGVudDogIjUuICI7IH0KLSAgICAuZGVzaWduIG9sIGxpLnZhbHVlLTY6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICI2LiAiOyB9Ci0gICAgLmRlc2lnbiBvbCBsaS52YWx1ZS03OmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiAiNy4gIjsgfQotICAgIC5kZXNpZ24gb2wgbGkudmFsdWUtODpiZWZvcmUgewotICAgICAgY29udGVudDogIjguICI7IH0KLSAgICAuZGVzaWduIG9sIGxpLnZhbHVlLTk6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICI5LiAiOyB9Ci0gICAgLmRlc2lnbiBvbCBsaS52YWx1ZS0xMDpiZWZvcmUgewotICAgICAgY29udGVudDogIjEwLiAiOyB9Ci0uZGVzaWduIC53aXRoLWNhbGxvdXRzIG9sPmxpIHsKLSAgbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlOwotICBtYXJnaW4tbGVmdDogMDsgfQotICAuZGVzaWduIC53aXRoLWNhbGxvdXRzIG9sPmxpOmJlZm9yZSB7Ci0gICAgZGlzcGxheTogaW5saW5lOwotICAgIGxlZnQ6IC0yMHB4OwotICAgIGZsb2F0OiBsZWZ0OwotICAgIHdpZHRoOiAxN3B4OwotICAgIGNvbG9yOiAjMzNiNWU1OwotICAgIGZvbnQtd2VpZ2h0OiA1MDA7IH0KLS5kZXNpZ24gLndpdGgtY2FsbG91dHMgdWw+bGkgewotICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOyB9Ci0KLS8qIHNwZWNpYWwgbGlzdCBpdGVtcyAqLwotbGkubm8tYnVsbGV0IHsKLSAgbGlzdC1zdHlsZS10eXBlOiBub25lICFpbXBvcnRhbnQ7IH0KLWxpLm5vLWJ1bGxldCAqewotICBtYXJnaW46MDsgfQotCi0uZGVzaWduIGxpLndpdGgtaWNvbiB7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgbWFyZ2luLWxlZnQ6IDIwcHg7Ci0gIG1pbi1oZWlnaHQ6IDMwcHg7IH0KLSAgLmRlc2lnbiBsaS53aXRoLWljb24gcCB7Ci0gICAgbWFyZ2luLWxlZnQ6IDAgIWltcG9ydGFudDsgfQotICAuZGVzaWduIGxpLndpdGgtaWNvbjpiZWZvcmUgewotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICBsZWZ0OiAtNDBweDsKLSAgICB0b3A6IDA7Ci0gICAgY29udGVudDogJyc7Ci0gICAgd2lkdGg6IDMwcHg7Ci0gICAgaGVpZ2h0OiAzMHB4OyB9Ci0gIC5kZXNpZ24gbGkud2l0aC1pY29uLnRhYmxldDpiZWZvcmUgewotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb19waG9uZV90YWJsZXQucG5nKTsgfQotICAuZGVzaWduIGxpLndpdGgtaWNvbi53ZWI6YmVmb3JlIHsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9pY29fd2ViLnBuZyk7IH0KLSAgLmRlc2lnbiBsaS53aXRoLWljb24uYWN0aW9uOmJlZm9yZSB7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9zdHlsZXMvaWNvX2FjdGlvbi5wbmcpOyB9Ci0gIC5kZXNpZ24gbGkud2l0aC1pY29uLnVzZTpiZWZvcmUgewotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb191c2UucG5nKTsgfQotCi0vKiBmaWd1cmVzIGFuZCBjYWxsb3V0cyAqLwotLmZpZ3VyZSB7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsgfQotICAuZmlndXJlLnBhZC1iZWxvdyB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMjBweDsgfQotICAuZmlndXJlIC5maWd1cmUtY2FsbG91dCB7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIGNvbG9yOiAjZmZmOwotICAgIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gICAgZm9udC1zaXplOiAxNnB4OwotICAgIGxpbmUtaGVpZ2h0OiAyM3B4OwotICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9jYWxsb3V0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgIHBhZGRpbmctcmlnaHQ6IDJweDsKLSAgICB3aWR0aDogMzBweDsKLSAgICBoZWlnaHQ6IDI5cHg7Ci0gICAgei1pbmRleDogMTAwMDsgfQotICAgIC5maWd1cmUgLmZpZ3VyZS1jYWxsb3V0LnRvcCB7Ci0gICAgICB0b3A6IC05cHg7IH0KLSAgICAuZmlndXJlIC5maWd1cmUtY2FsbG91dC5yaWdodCB7Ci0gICAgICByaWdodDogLTVweDsgfQotCi0uZmlndXJlLWNhcHRpb24gewotICBtYXJnaW46IDAgMTBweCAyMHB4IDA7Ci0gIGZvbnQtc2l6ZTogMTRweDsKLSAgbGluZS1oZWlnaHQ6IDIwcHg7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotCi0vKiByb3dzIG9mIGZpZ3VyZXMgKi8KLS5maWd1cmUtcm93IHsKLSAgZm9udC1zaXplOiAwOwotICBsaW5lLWhlaWdodDogMDsKLSAgLyogdG8gcHJldmVudCBzcGFjZSBiZXR3ZWVuIGZpZ3VyZXMgKi8gfQotICAuZmlndXJlLXJvdyAuZmlndXJlIHsKLSAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gICAgdmVydGljYWwtYWxpZ246IHRvcDsgfQotICAuZmlndXJlLXJvdyAuZmlndXJlICsgLmZpZ3VyZSB7Ci0gICAgbWFyZ2luLWxlZnQ6IDEwcHg7Ci0gICAgLyogcmVpbnRyb2R1Y2Ugc3BhY2UgYmV0d2VlbiBmaWd1cmVzICovIH0KLQotLyogdmlkZW8gIGNvbnRhaW5lcnMgKi8KLS5mcmFtZWQtZ2FsYXh5bmV4dXMtbGFuZC1zcGFuLTEzIHsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjEzLnBuZykgbm8tcmVwZWF0Ci1zY3JvbGwgdG9wIGxlZnQ7Ci0gIHBhZGRpbmc6IDQycHggMTIycHggNjJweCAxMjZweDsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsgfQotICAuZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi0xMywgLmZyYW1lZC1nYWxheHluZXh1cy1sYW5kLXNwYW4tMTMgdmlkZW8sCi0uZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi0xMyBpbWcgewotICAgIHdpZHRoOiA1MTJweDsKLSAgICBoZWlnaHQ6IDI4NnB4OyB9Ci0KLQotLmZyYW1lZC1nYWxheHluZXh1cy1sYW5kLXNwYW4tOHsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjgucG5nKSBuby1yZXBlYXQKLXNjcm9sbCB0b3AgbGVmdDsKLSAgcGFkZGluZzogMjZweCA2OHB4IDM4cHggNzJweDsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsgfQotICAuZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi04LCAuZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi04IHZpZGVvLAotLmZyYW1lZC1nYWxheHluZXh1cy1sYW5kLXNwYW4tOCBpbWcgewotICAgIHdpZHRoOiAzMjBweDsKLSAgICBoZWlnaHQ6IDE4MHB4OyB9Ci0KLS5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTkgewotICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9kZXZpY2VfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuOS5wbmcpIG5vLXJlcGVhdAotc2Nyb2xsIHRvcCBsZWZ0OwotICBwYWRkaW5nOiA5NXB4IDEyMnB4IDEwN3B4IDEyNHB4OwotICBvdmVyZmxvdzogaGlkZGVuOyB9Ci0gIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTksIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTkgdmlkZW8sCi0uZnJhbWVkLWdhbGF4eW5leHVzLXBvcnQtc3Bhbi05IGltZyB7Ci0gICAgd2lkdGg6IDI3NHB4OwotICAgIGhlaWdodDogNDg4cHg7IH0KLQotLmZyYW1lZC1nYWxheHluZXh1cy1wb3J0LXNwYW4tNSB7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCguLi9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19wb3J0X3NwYW41LnBuZykgbm8tcmVwZWF0Ci1zY3JvbGwgdG9wIGxlZnQ7Ci0gIHBhZGRpbmc6IDc1cHggMzFweCA3NnB4IDMzcHg7Ci0gIG92ZXJmbG93OiBoaWRkZW47IH0KLSAgLmZyYW1lZC1nYWxheHluZXh1cy1wb3J0LXNwYW4tNSwgLmZyYW1lZC1nYWxheHluZXh1cy1wb3J0LXNwYW4tNSB2aWRlbywKLS5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTUgaW1nIHsKLSAgICB3aWR0aDogMjE2cHg7Ci0gICAgaGVpZ2h0OiAzODRweDsgfQotCi0vKiBsYW5kaW5nIHBhZ2UgZGlzY2xvc3VyZXMgKi8KLS5sYW5kaW5nLXBhZ2UtbGluayB7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgY29sb3I6ICMzMzMzMzM7IH0KLSAgLmxhbmRpbmctcGFnZS1saW5rOmFmdGVyIHsKLSAgICBjb250ZW50OiAnJzsKLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX3JpZ2h0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgIHdpZHRoOiAxMHB4OwotICAgIGhlaWdodDogMTBweDsKLSAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gICAgbWFyZ2luLWxlZnQ6IDVweDsgfQotCi0vKiB0b29sdGlwcyAqLwotLnRvb2x0aXAtYm94IHsKLSAgcG9zaXRpb246IGFic29sdXRlOwotICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOSk7Ci0gIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgZm9udC1zaXplOiAxNHB4OwotICBsaW5lLWhlaWdodDogMjBweDsKLSAgY29sb3I6ICNmZmY7Ci0gIHBhZGRpbmc6IDZweCAxMHB4OwotICBtYXgtd2lkdGg6IDI1MHB4OwotICB6LWluZGV4OiAxMDAwMDsgfQotICAudG9vbHRpcC1ib3guYmVsb3c6YWZ0ZXIgewotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICBjb250ZW50OiAnJzsKLSAgICBsaW5lLWhlaWdodDogMDsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICB0b3A6IC0xMHB4OwotICAgIGxlZnQ6IDVweDsKLSAgICBib3JkZXI6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKLSAgICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOSk7IH0KLQotLyogdmlkZW8gbm90ZSAqLwotLnZpZGVvLWluc3RydWN0aW9ucyB7Ci0gIG1hcmdpbi10b3A6IDEwcHg7Ci0gIG1hcmdpbi1ib3R0b206IDEwcHg7IH0KLSAgLnZpZGVvLWluc3RydWN0aW9uczpiZWZvcmUgewotICAgIGNvbnRlbnQ6ICcnOwotICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb19tb3ZpZV9pbmxpbmUucG5nKSBuby1yZXBlYXQgc2Nyb2xsIHRvcCBsZWZ0OwotICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgICB3aWR0aDogMTJweDsKLSAgICBoZWlnaHQ6IDEycHg7Ci0gICAgbWFyZ2luLXJpZ2h0OiA4cHg7IH0KLSAgLnZpZGVvLWluc3RydWN0aW9uczphZnRlciB7Ci0gICAgY29udGVudDogJ0NsaWNrIGRldmljZSBzY3JlZW4gdG8gcmVwbGF5IG1vdmllLic7IH0KLQotLyogZG93bmxvYWQgYnV0dG9ucyAqLwotLmRvd25sb2FkLWJ1dHRvbiB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBtYXJnaW4tYm90dG9tOiA1cHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzMzYjVlNTsKLSAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKLSAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgYm94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7Ci0gIHBhZGRpbmc6IDZweCAxMnB4OwotICBib3JkZXItcmFkaXVzOiAycHg7IH0KLSAgLmRvd25sb2FkLWJ1dHRvbjpob3ZlciwgLmRvd25sb2FkLWJ1dHRvbjpmb2N1cyB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwOTljYzsKLSAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OyB9Ci0gIC5kb3dubG9hZC1idXR0b246YWN0aXZlIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OyB9Ci0KLS8qIFVJIHRhYmxlcyBhbmQgb3RoZXIgdGhpbmdzIGZvdW5kIGluIFdyaXRpbmcgc3R5bGUgYW5kIFNldHRpbmdzIHBhdHRlcm4gKi8KLS51aS10YWJsZSB7Ci0gIHdpZHRoOiAxMDAlOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyODI4OwotICBjb2xvcjogI2ZmZjsKLSAgYm9yZGVyLXJhZGl1czogMnB4OwotICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjI1KTsKLSAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgfQotICAudWktdGFibGUgdGgsCi0gIC51aS10YWJsZSB0ZCB7Ci0gICAgcGFkZGluZzogNXB4IDEwcHg7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsgCi0gICAgYm9yZGVyOjA7fQotICAudWktdGFibGUgdGhlYWQgdGggewotICAgIGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0gIC51aS10YWJsZSB0Zm9vdCB0ZCB7Ci0gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM0OTQ5NDk7Ci0gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzQ5NDk0OTsKLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KLSAgICAudWktdGFibGUgdGZvb3QgdGQ6bGFzdC1jaGlsZCB7Ci0gICAgICBib3JkZXItcmlnaHQ6IDA7IH0KLQotLmxheW91dC13aXRoLWxpc3QtaXRlbS1tYXJnaW5zIHsKLSAgbWFyZ2luLWxlZnQ6IDMwcHggIWltcG9ydGFudDsgfQotCi0uZW11bGF0ZS1jb250ZW50LWxlZnQtcGFkZGluZyB7Ci0gIG1hcmdpbi1sZWZ0OiAxMHB4OyB9Ci0KLS5kby1kb250LWxhYmVsIHsKLSAgbWFyZ2luLWJvdHRvbTogMTBweDsKLSAgcGFkZGluZy1sZWZ0OiAyMHB4OwotICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBub25lIG5vLXJlcGVhdCBzY3JvbGwgMHB4IDNweDsgfQotICAuZG8tZG9udC1sYWJlbC5iYWQgewotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb193cm9uZy5wbmcpOyB9Ci0gIC5kby1kb250LWxhYmVsLmdvb2QgewotICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvc3R5bGVzL2ljb19nb29kLnBuZyk7IH0KLSAgICAKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLS8qKioqKiBQUkVWSU9VU0xZIHN0eWxlLmNzcyAqKioqKioqKioqKioqKioqKiovCi0KLQotCi0KLQotQG1lZGlhIHNjcmVlbiwgcHJvamVjdGlvbiwgcHJpbnQgewotW2Rpcj0ncnRsJ10gewotICAgIGRpcmVjdGlvbjogcnRsOwotfQotaHRtbCB7Ci0gICAgbGluZS1oZWlnaHQ6IDIwcHg7Ci19Ci1wcmUsIHRhYmxlLCBpbnB1dCwgdGV4dGFyZWEsIGNvZGUgewotICAgIGZvbnQtc2l6ZTogMWVtOwotfQotYWRkcmVzcywgYWJiciwgY2l0ZSB7Ci0gICAgZm9udC1zdHlsZTogbm9ybWFsOwotfQotW2Rpcj0ncnRsJ10gdGggewotICAgIHRleHQtYWxpZ246IHJpZ2h0OwotfQotaHRtbFtsYW5nXj1qYV0gYmxvY2txdW90ZSwgaHRtbFtsYW5nXj1qYV0gcSwgaHRtbFtsYW5nXj1rb10gYmxvY2txdW90ZSwgaHRtbFtsYW5nXj1rb10gcSwKLWh0bWxbbGFuZ149emhdIGJsb2NrcXVvdGUsIGh0bWxbbGFuZ149emhdIHEgewotICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLXEgewotICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLWZpZWxkc2V0LCBpZnJhbWUsIGltZyB7Ci0gICAgYm9yZGVyOiAwOwotfQotaW1nIHsgCi0gIC1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6IGJpY3ViaWM7Ci0gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ci0gIG1heC13aWR0aDogMTAwJTsKLX0KLXEgewotICAgIHF1b3Rlczogbm9uZTsKLX0KLXN1cCwgc3ViIHsKLSAgICBmb250LXNpemU6IDExcHg7Ci0gICAgbGluZS1oZWlnaHQ6IDA7Ci19Ci19Ci0KLUBtZWRpYSBzY3JlZW4sIHByb2plY3Rpb24gewotCi10YWJsZSwgZmllbGRzZXQgewotICAgIG1hcmdpbjogMDsKLX0KLWgxIHsKLSAgICBjb2xvcjojMzMzOwotICAgIGZvbnQtc2l6ZTogMzRweDsKLSAgICBtYXJnaW46IDM2cHggMCAyN3B4OwotICAgIHBhZGRpbmc6MCAwIDEwcHg7Ci0gICAgZm9udC13ZWlnaHQ6MzAwOwotfQotaDEsIGgyIHsKLSAgICBsaW5lLWhlaWdodDogMzBweDsKLX0KLWgxLnNob3J0IHsKLSAgbWFyZ2luLXJpZ2h0OjMyMHB4OwotfQotaDEuc2hvcnQgewotICBtYXJnaW4tcmlnaHQ6MzIwcHg7Ci19Ci1oMS5zdXBlciB7Ci0gICAgZm9udC1zaXplOiAzN3B4OwotfQotaDIgewotICAgIGNvbG9yOiMzMzM7Ci0gICAgZm9udC1zaXplOiAyNnB4OwotICAgIG1hcmdpbjogMzJweCAwIDIwcHg7Ci0gICAgcGFkZGluZzowOwotICAgIGZvbnQtd2VpZ2h0OjMwMDsKLX0KLWgzIHsKLSAgICBjb2xvcjojMzMzOwotICAgIGZvbnQtc2l6ZTogMjFweDsKLSAgICBmb250LXdlaWdodDo0MDA7Ci0gICAgbWFyZ2luOjIxcHggMCAxNHB4IDA7Ci19Ci1oMywgaDQgewotICAgIGxpbmUtaGVpZ2h0OiAyMXB4OwotfQotaDQgewotICBmb250LXNpemU6IDE4cHg7Ci0gIG1hcmdpbjogMTJweCAwOwotICBmb250LXdlaWdodDo1MDA7Ci19Ci1oNSB7Ci0gIGZvbnQtc2l6ZTogMTRweDsKLX0KLWg1LCBoNiB7Ci0gIG1hcmdpbjogNXB4IDA7Ci19Ci1oNiB7Ci0gIGZvbnQtc2l6ZTogMTJweDsKLX0KLQotCi0KLWhyIHsgLyogYXBwbGllZCB0byB0aGUgYm90dG9tIG9mIGgyIGVsZW1lbnRzICovCi0gIGhlaWdodDogMXB4OwotICBtYXJnaW46IDVweCAwIDIwcHg7Ci0gIGJvcmRlcjogMDsKLSAgYmFja2dyb3VuZDogI2NjYzsKLX0KLXAsIHByZSwgdGFibGUsIGZvcm0gewotICAgIG1hcmdpbjogMCAwIDE1cHg7Ci19Ci1zbWFsbCB7Ci0gIGZvbnQtc2l6ZTogMTEuNXB4OwotICBjb2xvcjogIzAwMDsKLX0KLXVsLCBvbCB7Ci0gICAgbWFyZ2luOiAwIDAgMTVweCAxOHB4OwotICAgIHBhZGRpbmc6IDA7Ci19Ci1bZGlyPSdydGwnXSB1bCwgW2Rpcj0ncnRsJ10gb2wgewotICAgIG1hcmdpbjogMTBweCAzMHB4IDEwcHggMTBweDsKLX0KLXVsIHVsLCB1bCBvbCwgb2wgdWwsIG9sIG9sIHsKLSAgICBtYXJnaW4tYm90dG9tOiAwOwotICAgIG1hcmdpbi10b3A6IDA7Ci19Ci1saSB7Ci0gIG1hcmdpbjowIDAgNXB4OwotfQotZHQgewotICBmb250LXdlaWdodDpib2xkOwotfQotZGQgewotICBtYXJnaW46MCAwIDEwcHggMzBweDsKLSAgcGFkZGluZzogNXB4OwotfQotZGQgcCwKLWRkIHByZSwKLWRkIHVsLAotZGQgb2wsCi1kZCBkbCB7Ci0gIG1hcmdpbjoxMHB4IDAgMDsKLX0KLWxpIHAsCi1saSBwcmUsCi1saSB1bCwKLWxpIG9sLAotbGkgZGwgewotICBtYXJnaW4tdG9wOjVweDsKLSAgbWFyZ2luLWJvdHRvbTo1cHg7Ci19Ci1wcmUgc3Ryb25nLCBwcmUgYiwgYSBzdHJvbmcsIGEgYiwgYSBjb2RlIHsKLSAgICBjb2xvcjogaW5oZXJpdDsKLX0KLXByZSwgY29kZSB7Ci0gICAgY29sb3I6ICMwNjA7Ci0gICAgZm9udDogMTNweC8xLjUgbW9ub3NwYWNlOwotfQotY29kZSB7Ci0gICAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgICBmb250OiAxM3B4LzE0cHggbW9ub3NwYWNlOwotfQotCi1sZWdlbmQgewotICAgIGRpc3BsYXk6IG5vbmU7Ci19Ci1hOmxpbmssIGE6dmlzaXRlZCB7Ci0gIGNvbG9yOiAjMjU4YWFmOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci1hOmZvY3VzLCBhOmhvdmVyLCBhOmFjdGl2ZSB7Ci0gIGNvbG9yOiAjMzNCNUU1OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci1zdHJvbmcsIGIgewotICBmb250LXdlaWdodDpib2xkOwotICBjb2xvcjogIzIyMjsKLX0KLXRhYmxlIHsKLSAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLSAgYm9yZGVyLXNwYWNpbmc6IDA7Ci0gIGJvcmRlcjowOwotICBtYXJnaW46IC41ZW0gMWVtIDFlbSAwOwotICB3aWR0aDoxMDAlOyAvKiBjb25zaXN0ZW50IHRhYmxlIHdpZHRoczsgd2l0aGluIElFJ3MgcXVpcmtzICovCi0gIGJhY2tncm91bmQtY29sb3I6I2Y3ZjdmNzsKLX0KLXRoLCB0ZCB7Ci0gIHBhZGRpbmc6IDRweCAxMnB4OwotICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICB0ZXh0LWFsaWduOiBsZWZ0OwotfQotdGQgewotICBiYWNrZ3JvdW5kLWNvbG9yOmluaGVyaXQ7Ci0gIGJvcmRlcjpzb2xpZCAxcHggI0RERDsKLX0KLXRkICo6bGFzdC1jaGlsZCB7Ci0gIG1hcmdpbi1ib3R0b206MDsKLX0KLXRoIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTsKLSAgY29sb3I6ICNmZmY7Ci0gIGJvcmRlcjpzb2xpZCAxcHggI0RERDsKLSAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKLX0KLXRyOmZpcnN0LW9mLXR5cGUgdGg6Zmlyc3Qtb2YtdHlwZTplbXB0eSB7Ci0gICAgdmlzaWJpbGl0eTogaGlkZGVuOwotfQotCi0vKiBvcGNvZGVzIHRhYmxlICovCi0KLXRhYmxlLmluc3RydWMgdGQ6Zmlyc3QtY2hpbGQgewotICAgIHdpZHRoOiAxMiU7Ci19Ci0KLXRhYmxlLmluc3RydWMgdGQ6Zmlyc3QtY2hpbGQgKyB0ZCB7Ci0gICAgd2lkdGg6IDIzJTsKLX0KLQotdGFibGUuaW5zdHJ1YyB0ZDpmaXJzdC1jaGlsZCArIHRkICsgdGQgewotICAgIHdpZHRoOiAyOCU7Ci19Ci0KLXRhYmxlLmluc3RydWMgdGQ6Zmlyc3QtY2hpbGQgKyB0ZCArIHRkICsgdGQgewotICAgIHdpZHRoOiAzNyU7Ci19Ci0KLS8qIHN1cHBsZW1lbnRhbCBvcGNvZGUgZm9ybWF0IHRhYmxlICovCi0KLXRhYmxlLnN1cHBsZW1lbnQgdGQ6Zmlyc3QtY2hpbGQgewotICAgIHdpZHRoOiAyMCU7Ci19Ci0KLXRhYmxlLnN1cHBsZW1lbnQgdGQ6Zmlyc3QtY2hpbGQgKyB0ZCB7Ci0gICAgd2lkdGg6IDIwJTsKLX0KLQotdGFibGUuc3VwcGxlbWVudCB0ZDpmaXJzdC1jaGlsZCArIHRkICsgdGQgewotICAgIHdpZHRoOiA2MCU7Ci19Ci0KLS8qIG1hdGggZGV0YWlscyB0YWJsZSAqLwotCi10YWJsZS5tYXRoIHRkOmZpcnN0LWNoaWxkIHsKLSAgICB3aWR0aDogMTAlOwotfQotCi10YWJsZS5tYXRoIHRkOmZpcnN0LWNoaWxkICsgdGQgewotICAgIHdpZHRoOiAzMCU7Ci19Ci0KLXRhYmxlLm1hdGggdGQ6Zmlyc3QtY2hpbGQgKyB0ZCArIHRkIHsKLSAgICB3aWR0aDogNjAlOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9vdGVyCi0qLwotLmxpbmUgewotICAgIGNsZWFyOiBib3RoOwotICAgIGJhY2tncm91bmQ6ICNhY2JjMDA7Ci0gICAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjYWNiYzAwIDAsICNhY2JjMDAgNTAlLCAjYmRkZTAwIDUwJSwgI2JkZGUwMCAxMDAlKTsKLSAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAsICNhY2JjMDApLAotY29sb3Itc3RvcCg1MCUsICNhY2JjMDApLCBjb2xvci1zdG9wKDUwJSwgI2JkZGUwMCksIGNvbG9yLXN0b3AoMTAwJSwgI2JkZGUwMCkpOwotICAgIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI2FjYmMwMCAwLCAjYWNiYzAwIDUwJSwgI2JkZGUwMCA1MCUsICNiZGRlMDAgMTAwJSk7Ci0gICAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI2FjYmMwMCAwLCAjYWNiYzAwIDUwJSwgI2JkZGUwMCA1MCUsICNiZGRlMDAgMTAwJSk7Ci0gICAgYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICNhY2JjMDAgMCwgI2FjYmMwMCA1MCUsICNiZGRlMDAgNTAlLCAjYmRkZTAwIDEwMCUpOwotICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsICNhY2JjMDAgMCwgI2FjYmMwMCA1MCUsICNiZGRlMDAgNTAlLCAjYmRkZTAwIDEwMCUpOwotICAgIGhlaWdodDogMnB4OwotICAgIG1hcmdpbi10b3A6IDE1MHB4OwotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICB6LWluZGV4OiAxMTsKLX0KLSNmb290ZXIgewotICAgIGZvbnQtc2l6ZToxMXB4OwotICAgIGNsZWFyOiBib3RoOwotICAgIGNvbG9yOiAjOTk5OwotICAgIHBhZGRpbmc6IDE1cHggMDsKLSAgICBtYXJnaW4tdG9wOjEwcHg7Ci0gICAgd2lkdGg6YXV0bzsKLX0KLSNmb290ZXItbG9jYWwgdWwgewotICBsaXN0LXN0eWxlOiBub25lOwotICBtYXJnaW46IDVweCAwIDMwcHggMDsKLX0KLSNmb290ZXItbG9jYWwgbGkgewotICAgIGRpc3BsYXk6IGlubGluZTsKLX0KLSNmb290ZXItbG9jYWwgbGkrbGk6YmVmb3JlIHsKLSAgICBjb250ZW50OiAnfCc7Ci0gICAgcGFkZGluZzogMCAzcHg7Ci0gIGNvbG9yOiAjZTVlNWU1OwotfQotI2Zvb3Rlci1nbG9iYWwgewotICAgIHBhZGRpbmc6IDEwcHggMTVweDsKLSAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKLX0KLSNmb290ZXItZ2xvYmFsIHsKLSAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2ViZWJlYjsKLSAgICBmb250LXNpemU6IDExLjVweDsKLSAgICBsaW5lLWhlaWdodDogMS44OwotICAgIGxpc3Qtc3R5bGU6IG5vbmU7Ci19Ci0jZm9vdGVyLWdsb2JhbCB1bCB7Ci0gICAgbWFyZ2luOiAwOwotfQotI2Zvb3Rlci1nbG9iYWwgbGkgewotICAgIGRpc3BsYXk6IGlubGluZTsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLX0KLSNmb290ZXItZ2xvYmFsIGxpK2xpOmJlZm9yZSB7Ci0gICAgY29udGVudDogJ8KsPyc7Ci0gICAgcGFkZGluZzogMCAzcHg7Ci19Ci0qIGh0bWwgI2Zvb3Rlci1nbG9iYWwgbGkgewotICAgIG1hcmdpbjogMCAxM3B4IDAgMDsKLX0KLSogW2Rpcj0ncnRsJ10gI2Zvb3Rlci1nbG9iYWwgbGkgewotICAgIG1hcmdpbjogMCAwIDAgMTNweDsKLX0KLSoraHRtbCAjZm9vdGVyLWdsb2JhbCBsaSB7Ci0gICAgbWFyZ2luOiAwIDEzcHggMCAwOwotfQotKitbZGlyPSdydGwnXSAjZm9vdGVyLWdsb2JhbCBsaSB7Ci0gICAgbWFyZ2luOiAwIDAgMCAxM3B4OwotfQotI2Zvb3Rlci1nbG9iYWwgbGkgYSB7Ci0gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKLX0KLS5sb2NhbGVzIHsKLSAgbWFyZ2luOiAxMHB4IDAgMCAwcHg7Ci19Ci1bZGlyPSdydGwnXSAubG9jYWxlcyB7Ci0gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgY2VudGVyOwotICAgIGZsb2F0OiBsZWZ0OwotICAgIHBhZGRpbmc6IDAgMjRweCAwIDA7Ci19Ci0ubG9jYWxlcyBmb3JtIHsKLSAgICBtYXJnaW46IDA7ICAKLX0KLS5sb2NhbGVzIHNlbGVjdCwgLnNpdGVzIHNlbGVjdCB7Ci0gIGxpbmUtaGVpZ2h0OiAzLjA4OwotICBtYXJnaW46IDBweCAwOwotICBib3JkZXI6IHNvbGlkIDFweCAjRUJFQkVCOwotICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7Ci0gIGJhY2tncm91bmQ6IHdoaXRlIHVybCgnLi4vaW1hZ2VzL2Fycm93cy11cC1kb3duLnBuZycpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7Ci0gIGhlaWdodDogMzBweDsKLSAgY29sb3I6ICMyMjI7Ci0gIGxpbmUtaGVpZ2h0OiBub3JtYWw7Ci0gIHBhZGRpbmc6IDVweDsKLSAgd2lkdGg6IDIzMHB4OwotfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgUHJpbnQgT25seQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUBtZWRpYSBwcmludCB7Ci0gIC8qIGNvbmZpZ3VyZSBwcmludGVkIHBhZ2UgKi8KLSAgQHBhZ2UgewotICAgICAgbWFyZ2luOiAwLjc1aW4gMWluOwotICAgICAgd2lkb3dzOiA0OwotICAgICAgb3JwaGFuczogNDsKLSAgfQotCi0gIC8qIHJlc2V0IHNwYWNpbmcgbWV0cmljcyAqLwotICBodG1sLCBib2R5LCAud3JhcCB7Ci0gICAgICBtYXJnaW46IDAgIWltcG9ydGFudDsKLSAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKLSAgICAgIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7Ci0gIH0KLQotICAvKiBsZWF2ZSBlbm91Z2ggc3BhY2Ugb24gdGhlIGxlZnQgZm9yIGJ1bGxldHMgKi8KLSAgYm9keSB7Ci0gICAgICBwYWRkaW5nLWxlZnQ6IDIwcHggIWltcG9ydGFudDsKLSAgfQotICAjZG9jLWNvbCB7Ci0gICAgICBtYXJnaW4tbGVmdDogMDsKLSAgfQotCi0gIC8qIGhpZGUgYSBidW5jaCBvZiBub24tY29udGVudCBlbGVtZW50cyAqLwotICAjaGVhZGVyLCAjZm9vdGVyLCAjbmF2LXgsICNzaWRlLW5hdiwKLSAgLnRyYWluaW5nLW5hdi10b3AsIC50cmFpbmluZy1uYXYtYm90dG9tLAotICAjZG9jLWNvbCAuY29udGVudC1mb290ZXIsCi0gIC5uYXYteCwgLm5hdi15LAotICAucGFnaW5nLWxpbmtzLAotICBhLnRvdG9wIHsKLSAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKLSAgfQotCi0gIC8qIHJlbW92ZSBleHRyYSBzcGFjZSBhYm92ZSBwYWdlIHRpdGxlcyAqLwotICAjZG9jLWNvbCAuY29udGVudC1oZWFkZXIgewotICAgICAgbWFyZ2luLXRvcDogMDsKLSAgfQotCi0gIC8qIGJ1bXAgdXAgc3BhY2luZyBhYm92ZSBzdWJoZWFkaW5ncyAqLwotICBoMiB7Ci0gICAgICBtYXJnaW4tdG9wOiA0MHB4ICFpbXBvcnRhbnQ7Ci0gIH0KLQotICAvKiBwcmludCBsaW5rIFVSTHMgd2hlcmUgcG9zc2libGUgYW5kIGdpdmUgbGlua3MgZGVmYXVsdCB0ZXh0IGNvbG9yICovCi0gIHAgYTphZnRlciB7Ci0gICAgICBjb250ZW50OiAiICgiIGF0dHIoaHJlZikgIikiOwotICAgICAgZm9udC1zaXplOiA4MCU7Ci0gIH0KLSAgcCBhIHsKLSAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKLSAgfQotICBhIHsKLSAgICAgIGNvbG9yOiBpbmhlcml0OwotICB9Ci0KLSAgLyogc3ludGF4IGhpZ2hsaWdodGluZyBydWxlcyAqLwotICAuc3RyIHsgY29sb3I6ICMwNjA7IH0KLSAgLmt3ZCB7IGNvbG9yOiAjMDA2OyBmb250LXdlaWdodDogYm9sZDsgfQotICAuY29tIHsgY29sb3I6ICM2MDA7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotICAudHlwIHsgY29sb3I6ICM0MDQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0gIC5saXQgeyBjb2xvcjogIzA0NDsgfQotICAucHVuIHsgY29sb3I6ICM0NDA7IH0KLSAgLnBsbiB7IGNvbG9yOiAjMDAwOyB9Ci0gIC50YWcgeyBjb2xvcjogIzAwNjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLSAgLmF0biB7IGNvbG9yOiAjNDA0OyB9Ci0gIC5hdHYgeyBjb2xvcjogIzA2MDsgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgQ29sdW1ucwotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotQG1lZGlhIHNjcmVlbiwgcHJvamVjdGlvbiwgcHJpbnQgewotLmZ1bGwgewotICBwYWRkaW5nOiAyLjVlbSAwOwotICBib3JkZXItdG9wOiBzb2xpZCAxcHggI2RkZDsKLSAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNkZGQ7Ci0gIGJhY2tncm91bmQ6ICNmN2Y3Zjc7ICAKLX0KLS53cmFwIHsKLSAgbWFyZ2luOiAwIGF1dG87Ci0gIHdpZHRoOiA5NDBweDsKLSAgY2xlYXI6IGJvdGg7Ci19Ci0uY29scyB7Ci0gICAgaGVpZ2h0OiAxJTsKLSAgICBtYXJnaW46IDAgLTEuNTMzNzQyMzMxMjg4MzQzNTU4MjgyJTsKLSAgICB3aWR0aDogMTAzLjA2NzQ4NDY2MjU3NjY5JX0KLSoraHRtbCAuY29scyB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMjBweDsKLX0KLS5jb2xzOmFmdGVyIHsKLSAgICBjbGVhcjogYm90aDsKLSAgICBjb250ZW50OiAnICc7Ci0gICAgZGlzcGxheTogYmxvY2s7Ci0gICAgaGVpZ2h0OiAwOwotICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKLX0KLS5jb2wtMSwgLmNvbC0yLCAuY29sLTMsIC5jb2wtNCwgLmNvbC01LCAuY29sLTYsIC5jb2wtNywgLmNvbC04LCAuY29sLTksIC5jb2wtMTAsIC5jb2wtMTEsIC5jb2wtMTIsCi0uY29sLTEzLCAuY29sLTE0LCAuY29sLTE1LCAuY29sLTE2IHsKLSAgICBkaXNwbGF5OiBpbmxpbmU7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW4tbGVmdDogMTBweDsKLSAgbWFyZ2luLXJpZ2h0OiAxMHB4OwotfQotLyoKLSogaHRtbCAuY29sLTEsICogaHRtbCAuY29sLTIsICogaHRtbCAuY29sLTMsICogaHRtbCAuY29sLTQsICogaHRtbCAuY29sLTUsICogaHRtbCAuY29sLTYsICogaHRtbAotLmNvbC03LCAqIGh0bWwgLmNvbC04LCAqIGh0bWwgLmNvbC05LCAqIGh0bWwgLmNvbC0xMCwgKiBodG1sIC5jb2wtMTEsICogaHRtbCAuY29sLTEyICB7Ci0gICAgbWFyZ2luOiAwOwotICAgIHBhZGRpbmc6IDAgMS40JSAyMHB4OwotfQotW2Rpcj0ncnRsJ10gLmNvbC0xLCBbZGlyPSdydGwnXSAuY29sLTIsIFtkaXI9J3J0bCddIC5jb2wtMywgW2Rpcj0ncnRsJ10gLmNvbC00LCBbZGlyPSdydGwnXSAuY29sLTUsCi1bZGlyPSdydGwnXSAuY29sLTYsIFtkaXI9J3J0bCddIC5jb2wtNywgW2Rpcj0ncnRsJ10gLmNvbC04LCBbZGlyPSdydGwnXSAuY29sLTksIFtkaXI9J3J0bCddIC5jb2wtMTAsCi1bZGlyPSdydGwnXSAuY29sLTExLCBbZGlyPSdydGwnXSAuY29sLTEyIHsKLSAgICBmbG9hdDogcmlnaHQ7Ci19Ci0qLwotLmNvbC0xIHsgd2lkdGg6IDQwcHggfQotLmNvbC0yIHsgd2lkdGg6IDEwMHB4IH0KLS5jb2wtMyB7IHdpZHRoOiAxNjBweCB9Ci0uY29sLTQgeyB3aWR0aDogMjIwcHggfQotLmNvbC01IHsgd2lkdGg6IDI4MHB4IH0KLS5jb2wtNiB7IHdpZHRoOiAzNDBweCB9Ci0uY29sLTcgeyB3aWR0aDogNDAwcHggfQotLmNvbC04IHsgd2lkdGg6IDQ2MHB4IH0KLS5jb2wtOSB7IHdpZHRoOiA1MjBweCB9Ci0uY29sLTEwIHsgd2lkdGg6IDU4MHB4IH0KLS5jb2wtMTEgeyB3aWR0aDogNjQwcHggfQotLmNvbC0xMiB7IHdpZHRoOiA3MDBweCB9Ci0uY29sLTEzIHsgd2lkdGg6IDc2MHB4IH0KLS5jb2wtMTQgeyB3aWR0aDogODIwcHggfQotLmNvbC0xNSB7IHdpZHRoOiA4ODBweCB9Ci0uY29sLTE2IHsgd2lkdGg6IDk0MHB4IH0KLX0KLQotLmNvbC1yaWdodCB7Ci0gIG1hcmdpbi1yaWdodDowcHg7Ci19Ci0KLUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzcycHgpIHsKLS5jb2wtNSwgLmNvbC02LCAuY29sLTcgewotICAgIGNsZWFyOiBib3RoOwotICAgIHdpZHRoOiA5Ny4wMjM4MDk2JX0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIExheW91dAotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUBtZWRpYSBzY3JlZW4sIHByb2plY3Rpb24sIHByaW50IHsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUhlYWRlciwgTG9naW4sIE5hdi1YLCBTZWFyY2gKLSovCi0jaGVhZGVyIHsKLSAgcGFkZGluZzogMi4yZW0gMCAwLjJlbSAwOwotfQotI2hlYWRlcjpiZWZvcmUsICNoZWFkZXI6YWZ0ZXIgewotICBjb250ZW50OiAiIjsKLSAgZGlzcGxheTogdGFibGU7Ci0gIGNsZWFyOiBib3RoCi19Ci0ubG9nbywgLm5hdi14IHsKLSAgICBmbG9hdDogbGVmdDsKLX0KLS5uYXYteCB7Ci0gICAgbWFyZ2luLXRvcDogLTJweDsKLSAgbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotLm5hdi14IGEgewotICAgIGNvbG9yOiAjMzMzOwotICAgIGZvbnQtc2l6ZTogMTZweDsKLX0KLS5kZXNpZ24gYS5zZWxlY3RlZCB7Ci0gICAgY29sb3I6ICMzM2I1ZTU7Ci19Ci0uZGV2ZWxvcCBhLnNlbGVjdGVkIHsKLSAgICBjb2xvcjogI0Y4MDsKLX0KLS5kaXN0cmlidXRlIGEuc2VsZWN0ZWQgewotICAgIGNvbG9yOiAjOUMwOwotfQotLnNvdXJjZSBhLnNlbGVjdGVkIHsKLSAgICBjb2xvcjogIzMzYjVlNTsKLX0KLS5kZXZpY2VzIGEuc2VsZWN0ZWQgewotICAgIGNvbG9yOiAjRjgwOwotfQotLnNlY3VyaXR5IGEuc2VsZWN0ZWQgewotICAgIGNvbG9yOiAjOUMwOwotfQotLmNvbXBhdGliaWxpdHkgYS5zZWxlY3RlZCB7Ci0gICAgY29sb3I6ICM5OTMzQ0M7Ci19Ci0KLQotLm5hdi14IGxpIHsKLSAgICBkaXNwbGF5OiBpbmxpbmU7Ci0gICAgbWFyZ2luLXJpZ2h0OiA0NXB4OwotfQotLnNlYXJjaCB7Ci0gIGZsb2F0OiByaWdodDsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotICB3aWR0aDogMjIwcHgKLX0KLS5zZWFyY2ggLmJvdHRvbSwgLnNlYXJjaCAubGVmdCwgLnNlYXJjaCAucmlnaHQgewotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNhM2EzYTM7Ci19Ci0uc2VhcmNoIC5ib3R0b20gewotICB3aWR0aDogMjIwcHg7Ci0gIGhlaWdodDogMXB4OwotICB0b3A6IDI0cHg7Ci0gIGxlZnQ6IDAKLX0KLS5zZWFyY2ggLmxlZnQsIC5zZWFyY2ggLnJpZ2h0IHsgCi0gIGhlaWdodDogNXB4OwotICB3aWR0aDogMXB4Ci19Ci0uc2VhcmNoIC5sZWZ0IHsgdG9wOiAxOXB4OyBsZWZ0OiAwIH0KLS5zZWFyY2ggLnJpZ2h0IHsgdG9wOiAxOXB4OyByaWdodDogMCB9Ci0uc2VhcmNoIGZvcm0gewotICBmbG9hdDogbGVmdDsKLSAgbWFyZ2luLXRvcDogMnB4OwotICB3aWR0aDogaW5oZXJpdDsKLX0KLS5zZWFyY2ggLmNsb3NlLAotI3BsYXllci1mcmFtZSAuY2xvc2UgewotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIHJpZ2h0OiA4cHg7Ci0gIGJvdHRvbTogNHB4OwotICB3aWR0aDogMTZweDsKLSAgaGVpZ2h0OiAxNnB4OwotICBtYXJnaW46IDA7Ci0gIHRleHQtaW5kZW50OiAtMTAwMGVtOwotICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL2Nsb3NlLnBuZykgbm8tcmVwZWF0IDAgMDsKLSAgei1pbmRleDo5OTk5OwotfQotLnNlYXJjaCAuY2xvc2U6aG92ZXIsIC5zZWFyY2ggLmNsb3NlOmZvY3VzLAotI3BsYXllci1mcmFtZSAuY2xvc2U6aG92ZXIsICNwbGF5ZXItZnJhbWUgLmNsb3NlOmZvY3VzIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggMDsKLSAgY3Vyc29yOnBvaW50ZXI7Ci19Ci0jcGxheWVyLWZyYW1lIC5jbG9zZSB7Ci0gIHRvcDogNnB4OwotfQotLnNlYXJjaCBmb3JtIGlucHV0IHsKLSAgY29sb3I6ICM5OTk7Ci0gIGZvbnQtc2l6ZTogMWVtOwotICB3aWR0aDogaW5oZXJpdDsKLSAgYm9yZGVyOiBub25lOwotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6MCAwIDAgNnB4OwotICB6LWluZGV4OiAxNTAwOwotICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudAotfQotLnNlYXJjaDpob3ZlciAuYm90dG9tLCAuc2VhcmNoOmhvdmVyIC5sZWZ0LCAuc2VhcmNoOmhvdmVyIC5yaWdodCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci19Ci0uc2VhcmNoOmhvdmVyIC5pY29uIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLThweCAwCi19Ci0uc2VhcmNoIGZvcm0gaW5wdXQ6Zm9jdXMgewotICBjb2xvcjogIzIyMjsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIG91dGxpbmU6MDsKLX0KLS8qIFNlYXJjaCBEcm9wZG93biAqLwotLnNlYXJjaC1kcm9wZG93biB7Ci0gIHBhZGRpbmc6IDE1cHg7Ci0gIHdpZHRoOiAxOTJweDsKLSAgYm9yZGVyOiBzb2xpZCAxcHggI2M1YzVjNTsKLSAgYmFja2dyb3VuZDogI2ZmZjsKLSAgcG9zaXRpb246IGFic29sdXRlOwotICB0b3A6IDM1cHg7Ci0gIGxlZnQ6IDA7Ci0gIC1tb3otYm94LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLDAsMCwwLjIpOwotICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwwLDAsMC4yKTsKLSAgYm94LXNoYWRvdzogMCAgMCAxMHB4IHJnYmEoMCwwLDAsMC4yKQotfQotLnNlYXJjaC1kcm9wZG93biB1bCwgLnNlYXJjaC1kcm9wZG93biB1bCBsaSB7Ci0gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwCi19Ci0uc2VhcmNoLWRyb3Bkb3duIHVsIGxpIHsKLSAgY2xlYXI6IGJvdGggCi19Ci0uc2VhcmNoLWRyb3Bkb3duIGltZyB7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW46IDAgMTBweCAxMHB4IDAKLX0KLS5zZWFyY2gtZHJvcGRvd24gaDYgewotICBjb2xvcjogIzIyMjsKLSAgbWFyZ2luOiAwOwotICBsaW5lLWhlaWdodDogbm9ybWFsCi19Ci0uc2VhcmNoLWRyb3Bkb3duIC5kZXNjIHsKLSAgY29sb3I6ICM5OTk7Ci0gIGZvbnQtc2l6ZTogMTEuNXB4OwotICBsaW5lLWhlaWdodDogbm9ybWFsOwotICBtYXJnaW46IDA7Ci19Ci0uc2VhcmNoLWRyb3Bkb3duIGxpIGE6aG92ZXIgaDYsIC5zZWFyY2gtZHJvcGRvd24gbGkgYTpob3ZlciAuZGVzYyB7Ci0gIGNvbG9yOiAjMzNiNWU1Ci19Ci0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQnV0dG9ucwotKi8KLS5idXR0b24sIGEuYnV0dG9uLCAuYnV0dG9uLXNlY29uZGFyeSwgYS5idXR0b24tc2Vjb25kYXJ5IHsKLSAgYm9yZGVyLWltYWdlOiBpbml0aWFsOwotICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OwotICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICAgIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgICBjdXJzb3I6IHBvaW50ZXI7Ci19Ci0uYnV0dG9uLCBhLmJ1dHRvbiB7Ci0gICAgZGlzcGxheTppbmxpbmUtYmxvY2s7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogIzA5YzsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCMyZmFkZGIpLCB0bygjMDljKSk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjMmZhZGRiLCAjMDljKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjMmZhZGRiLCAjMDljKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjMmZhZGRiLCAjMDljKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjMmZhZGRiLCAjMDljKTsKLSAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjMmZhZGRiJywgRW5kQ29sb3JTdHI9JyMwMDk5Y2MnLEdyYWRpZW50VHlwZT0wKTsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjMzk5MGFiOwotICAgIGNvbG9yOiAjZmZmOwotfQotLmJ1dHRvbi1zZWNvbmRhcnksIGEuYnV0dG9uLXNlY29uZGFyeSB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMzsKLSAgICBib3JkZXI6IDFweCBzb2xpZCAjZGNkY2RjOwotICAgIGNvbG9yOiAjNDQ0OwotfQotYS5idXR0b24sIGEuYnV0dG9uOnZpc2l0ZWQsIGEuYnV0dG9uLXNlY29uZGFyeSwgYS5idXR0b24tc2Vjb25kYXJ5OnZpc2l0ZWQgewotICAgIG1hcmdpbi1yaWdodDogMTZweDsKLSAgIGZvbnQtd2VpZ2h0OiA0MDA7Ci0gICAgbWluLXdpZHRoOiA1NHB4OwotICAgIG91dGxpbmU6IDA7Ci0gICAgcGFkZGluZzogOHB4IDE1cHg7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotfQotLmJ1dHRvbiwgLmJ1dHRvbi1zZWNvbmRhcnkgewotICAgIG1hcmdpbi1yaWdodDogMTZweDsKLSAgZm9udC13ZWlnaHQ6IDQwMDsKLSAgICBtaW4td2lkdGg6IDU0cHg7Ci0gICAgb3V0bGluZTogMDsKLSAgICBwYWRkaW5nOiAwIDE1cHg7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotfQotLmJ1dHRvbjpob3ZlciwgYS5idXR0b246aG92ZXIgewotICAgIGJvcmRlci1jb2xvcjogIzA5YzsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZGNiOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oIzVkYmNkOSksIHRvKCM0Y2FkY2IpKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICM1ZGJjZDksICM0Y2FkY2IpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgIzVkYmNkOSwgIzRjYWRjYik7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICM1ZGJjZDksICM0Y2FkY2IpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICM1ZGJjZDksICM0Y2FkY2IpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICM1ZGJjZDksICM0Y2FkY2IpOwotICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JTdHI9JyM1ZGJjZDknLAotRW5kQ29sb3JTdHI9JyM0Y2FkY2InLEdyYWRpZW50VHlwZT0wKTsKLSAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50OwotfQotLmJ1dHRvbjphY3RpdmUsIGEuYnV0dG9uOmFjdGl2ZSB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogIzFlNzk5YTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwotICAgIGJvcmRlci1jb2xvcjogIzMwYjdlNjsKLX0KLWEuYnV0dG9uLmJpZy5zdWJ0aXRsZSB7Ci0gIGxpbmUtaGVpZ2h0OjE4cHg7Ci19Ci0uYnV0dG9uLXNlY29uZGFyeTpob3ZlciwgYS5idXR0b24tc2Vjb25kYXJ5OmhvdmVyIHsKLSAgICBib3JkZXItY29sb3I6ICNkYmRiZGI7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2YzZjNmMzsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNmOWY5ZjkpLCB0bygjZWNlY2VjKSk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZjlmOWY5LCAjZWNlY2VjKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjZjlmOWY5LCAjZWNlY2VjKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZjlmOWY5LCAjZWNlY2VjKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZjlmOWY5LCAjZWNlY2VjKTsKLSAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjZjlmOWY5JywKLUVuZENvbG9yU3RyPScjZWNlY2VjJyk7Ci0gICAgY29sb3I6ICMzM0I1RTUgIWltcG9ydGFudDsKLX0KLS5idXR0b24tc2Vjb25kYXJ5OmFjdGl2ZSwgYS5idXR0b24tc2Vjb25kYXJ5OmFjdGl2ZSB7Ci0gICBib3JkZXItY29sb3I6ICNkYWRhZGE7Ci0gIGJhY2tncm91bmQ6ICNlYmViZWI7IC8qIE9sZCBicm93c2VycyAqLwotICAvKiBJRTkgU1ZHLCBuZWVkcyBjb25kaXRpb25hbCBvdmVycmlkZSBvZiAnZmlsdGVyJyB0byAnbm9uZScgKi8KLSAgYmFja2dyb3VuZDoKLXVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQS8KLVBnbzhjM1puSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZDJsa2RHZzlJakV3TUNVaUlHaGxhV2RvZEQwaU1UQXdKU0lnZG1sbGQwSnYKLWVEMGlNQ0F3SURFZ01TSWdjSEpsYzJWeWRtVkJjM0JsWTNSU1lYUnBiejBpYm05dVpTSSsKLUNpQWdQR3hwYm1WaGNrZHlZV1JwWlc1MElHbGtQU0puY21Ga0xYVmpaMmN0WjJWdVpYSmhkR1ZrSWlCbmNtRmthV1Z1ZEZWdWFYUnpQU0oxYzJWeVUzQmhZMlZQYmxWelpTSWcKLWVERTlJakFsSWlCNU1UMGlNQ1VpSUhneVBTSXdKU0lnZVRJOUlqRXdNQ1VpUGdvZ0lDQWdQSE4wYjNBZ2IyWm1jMlYwUFNJd0pTSWdjM1J2Y0MxamIyeHZjajBpSTJWaVpXSmwKLVlpSWdjM1J2Y0MxdmNHRmphWFI1UFNJeElpOCsKLUNpQWdJQ0E4YzNSdmNDQnZabVp6WlhROUlqRXdKU0lnYzNSdmNDMWpiMnh2Y2owaUkyWTVaamxtT1NJZ2MzUnZjQzF2Y0dGamFYUjVQU0l4SWk4KwotQ2lBZ0lDQThjM1J2Y0NCdlptWnpaWFE5SWpVd0pTSWdjM1J2Y0MxamIyeHZjajBpSTJaaFptRm1ZU0lnYzNSdmNDMXZjR0ZqYVhSNVBTSXhJaTgrCi1DaUFnSUNBOGMzUnZjQ0J2Wm1aelpYUTlJamt3SlNJZ2MzUnZjQzFqYjJ4dmNqMGlJMlk1WmpsbU9TSWdjM1J2Y0MxdmNHRmphWFI1UFNJeElpOCsKLUNpQWdJQ0E4YzNSdmNDQnZabVp6WlhROUlqRXdNQ1VpSUhOMGIzQXRZMjlzYjNJOUlpTm1ObVkyWmpZaUlITjBiM0F0YjNCaFkybDBlVDBpTVNJdlBnb2dJRHd2YkdsdVpXRnkKLVIzSmhaR2xsYm5RKwotQ2lBZ1BISmxZM1FnZUQwaU1DSWdlVDBpTUNJZ2QybGtkR2c5SWpFaUlHaGxhV2RvZEQwaU1TSWdabWxzYkQwaWRYSnNLQ05uY21Ga0xYVmpaMmN0WjJWdVpYSmhkR1ZrS1NJZwotTHo0S1BDOXpkbWMrKTsKLSAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ViZWJlYiAwJSwgI2Y5ZjlmOSA1JSwgI2ZhZmFmYSA1MCUsICNmOWY5ZjkgOTAlLAotI2ZmZmZmZiAxMDAlKTsgLyogRkYzLjYrICovCi0gIGJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoMCUsI2ViZWJlYiksCi1jb2xvci1zdG9wKDUlLCNmOWY5ZjkpLCBjb2xvci1zdG9wKDUwJSwjZmFmYWZhKSwgY29sb3Itc3RvcCg5MCUsI2Y5ZjlmOSksIGNvbG9yLXN0b3AoMTAwJSwjZmZmZmZmKSk7Ci0vKiBDaHJvbWUsU2FmYXJpNCsgKi8KLSAgYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ViZWJlYiAwJSwjZjlmOWY5IDUlLCNmYWZhZmEgNTAlLCNmOWY5ZjkKLTkwJSwjZmZmZmZmIDEwMCUpOyAvKiBDaHJvbWUxMCssU2FmYXJpNS4xKyAqLwotICBiYWNrZ3JvdW5kOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAgI2ViZWJlYiAwJSwjZjlmOWY5IDUlLCNmYWZhZmEgNTAlLCNmOWY5ZjkgOTAlLCNmZmZmZmYKLTEwMCUpOyAvKiBPcGVyYSAxMS4xMCsgKi8KLSAgYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICAjZWJlYmViIDAlLCNmOWY5ZjkgNSUsI2ZhZmFmYSA1MCUsI2Y5ZjlmOSA5MCUsI2ZmZmZmZgotMTAwJSk7IC8qIElFMTArICovCi0gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsICAjZWJlYmViIDAlLCNmOWY5ZjkgNSUsI2ZhZmFmYSA1MCUsI2Y5ZjlmOSA5MCUsI2ZmZmZmZgotMTAwJSk7IC8qIFczQyAqLwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCggc3RhcnRDb2xvcnN0cj0nI2ViZWJlYicsCi1lbmRDb2xvcnN0cj0nI2ZmZmZmZicsR3JhZGllbnRUeXBlPTAgKTsgLyogSUU2LTggKi8KLSAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDVweCAycHggcmdiYSgwLCAwLCAwLCAuMDUpOwotICAtbW96LWJveC1zaGFkb3c6IGluc2V0IDBweCAwcHggNXB4IDJweCByZ2JhKDAsIDAsIDAsIC4wNSk7Ci0gIGJveC1zaGFkb3c6IGluc2V0IDBweCAwcHggNXB4IDJweCByZ2JhKDAsIDAsIDAsIC4wNSk7IAotICBjb2xvcjogIzI1OEFBRiAhaW1wb3J0YW50OwotfQotLmJ1dHRvbi5iaWcgewotICBmb250LXNpemU6MjBweDsKLSAgZGlzcGxheTppbmxpbmUtYmxvY2s7Ci19Ci0uYnV0dG9uLmJpZyBzcGFuLnNtYWxsIHsKLSAgZm9udC1zaXplOjE0cHg7Ci19Ci0uYnV0dG9uLWNhcHRpb24gewotICBtYXJnaW4tdG9wOjEwcHg7Ci0gIGZvbnQtc2l6ZToxMnB4OwotICBmb250LXN0eWxlOml0YWxpYzsKLX0KLQotLmJ1dHRvbi5kaXNhYmxlZCwKLS5idXR0b24uZGlzYWJsZWQ6aG92ZXIsCi0uYnV0dG9uLmRpc2FibGVkOmFjdGl2ZSB7Ci0gIGJhY2tncm91bmQ6I2ViZWJlYjsKLSAgY29sb3I6Izk5OSAhaW1wb3J0YW50OwotICBib3JkZXItY29sb3I6Izk5OTsKLSAgY3Vyc29yOmRlZmF1bHQ7Ci19Ci0KLS50cmFpbmluZy1uYXYtdG9wIGEuYnV0dG9uLXNlY29uZGFyeSwKLS50cmFpbmluZy1uYXYtYm90dG9tIGEuYnV0dG9uLXNlY29uZGFyeSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OmxlZnQ7Ci0gIG1hcmdpbjowOwotICB3aWR0aDoxMzBweDsKLSAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwotICBmb250LXdlaWdodDpib2xkOwotICAKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oI2Y5ZjlmOSksIHRvKCNlY2VjZWMpKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2Y5ZjlmOSwgI2VjZWNlYyk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICNmOWY5ZjksICNlY2VjZWMpOwotICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JTdHI9JyNmOWY5ZjknLAotRW5kQ29sb3JTdHI9JyNlY2VjZWMnKTsKLSAgICBjb2xvcjogIzMzQjVFNTsKLX0KLQotLnRyYWluaW5nLW5hdi10b3AgYS5idXR0b24tc2Vjb25kYXJ5OmhvdmVyLAotLnRyYWluaW5nLW5hdi1ib3R0b20gYS5idXR0b24tc2Vjb25kYXJ5OmhvdmVyIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDljOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oIzJmYWRkYiksIHRvKCMwOWMpKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgIzJmYWRkYiwgIzA5Yyk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICMyZmFkZGIsICMwOWMpOwotICAgIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JTdHI9JyMyZmFkZGInLCBFbmRDb2xvclN0cj0nIzA5YycpOwotICAgIGJvcmRlcjogMXB4IHNvbGlkICMzOTkwYWI7Ci0gICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKLX0KLQotLnRyYWluaW5nLW5hdi10b3AgYS5idXR0b24tc2Vjb25kYXJ5Lmxhc3QsCi0udHJhaW5pbmctbmF2LWJvdHRvbSBhLmJ1dHRvbi1zZWNvbmRhcnkubGFzdCB7Ci0gIGJvcmRlci1sZWZ0OjA7Ci19Ci0KLS50cmFpbmluZy1uYXYtdG9wIGEuYnV0dG9uLXNlY29uZGFyeS5kb3VibGUtc2l6ZSwKLS50cmFpbmluZy1uYXYtYm90dG9tIGEuYnV0dG9uLXNlY29uZGFyeS5kb3VibGUtc2l6ZSB7Ci0gIHdpZHRoOjI5MXB4OwotfQotCi0udHJhaW5pbmctbmF2LXRvcCwKLS50cmFpbmluZy1uYXYtYm90dG9tIHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIG1hcmdpbjowIDAgMCAyMHB4OwotfQotCi0udHJhaW5pbmctbmF2LWJvdHRvbSB7Ci0gIHBhZGRpbmc6MCAwIDIwcHg7Ci19Ci0KLSN0Yi13cmFwcGVyLAotI3F2LXdyYXBwZXIgewotICBmbG9hdDpyaWdodDsKLSAgY2xlYXI6cmlnaHQ7Ci0gIG1hcmdpbjotMjdweCAwIDAgMjBweDsgLyogbmVnYXRpdmUgdG9wLW1hcmdpbiB0byBjb3VudGVyIHRoZSBjb250ZW50LWhlYWRlciBib3R0b20gbWFyZ2luICovCi0gIHBhZGRpbmc6MCAwIDIwcHg7Ci19Ci0KLSN0YiwKLSNxdiB7Ci0gIGZvbnQtc2l6ZToxM3B4OwotICBsaW5lLWhlaWdodDoxOHB4OwotICB3aWR0aDoyMzhweDsKLSAgYm9yZGVyOjFweCBzb2xpZCAjY2NjOwotICBmbG9hdDpyaWdodDsKLX0KLQotI3RiIHsKLSAgd2lkdGg6Mjc4cHg7Ci19Ci0KLSN0YiBoMiwKLSNxdiBoMiB7Ci0gIG1hcmdpbjoxMHB4IDE1cHg7Ci0gIHBhZGRpbmc6MDsKLSAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwotICBib3JkZXItYm90dG9tOjFweCBzb2xpZCBnYWluc2Jvcm87Ci19Ci0KLSN0YiAqLAotI3F2ICogewotICBmb250LXNpemU6aW5oZXJpdDsKLX0KLQotI3RiIC5kb3dubG9hZC1ib3ggewotICBwYWRkaW5nOjAgMCAwIDE1cHg7Ci19Ci0KLSN0YiAuZG93bmxvYWQtYm94IC5maWxlbmFtZSB7Ci0gIGZvbnQtc2l6ZToxMXB4OwotICBtYXJnaW46NHB4IDRweCAxMHB4OwotICBjb2xvcjojNjY2OwotfQotCi0KLS8qIERldiBndWlkZSBxdWlja25hdiAqLwotCi0uc2lkZWJveC13cmFwcGVyIHsKLSAgZmxvYXQ6cmlnaHQ7Ci0gIGNsZWFyOnJpZ2h0OwotICBtYXJnaW46MCAwIDAgMjBweDsKLSAgcGFkZGluZzowIDAgMjBweDsKLX0KLQotLnNpZGVib3ggewotICB3aWR0aDoyMjZweDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGxpbmUtaGVpZ2h0OjE4cHg7Ci0gIGJvcmRlci1sZWZ0OjRweCBzb2xpZCAjOTlDQzAwOwotICBmbG9hdDpyaWdodDsKLSAgcGFkZGluZzowIDAgMCAxMHB4OwotICBtYXJnaW46MCAwIDFlbSAyMHB4OwotfQotCi0uc2lkZWJveCBoMiwKLS5zaWRlYm94IGgzLAotLnNpZGVib3ggaDQsCi0uc2lkZWJveCBoNSB7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIG1hcmdpbjowIDAgMTBweDsKLX0KLQotLnNpZGVib3ggKiB7Ci0gIGZvbnQtc2l6ZTppbmhlcml0OwotfQotCi0jdGIgb2wsCi0jdGIgdWwsCi0jcXYgdWwgewotICBtYXJnaW46MCAxNXB4IDEwcHggMzVweDsKLX0KLQotI3F2IG9sIHsKLSAgbGlzdC1zdHlsZTpub25lOwotICBtYXJnaW46MCAxNXB4IDE1cHg7Ci0gIGZvbnQtc2l6ZTppbmhlcml0OwotICBsaW5lLWhlaWdodDppbmhlcml0OwotfQotCi0jdGIgb2wgb2wsCi0jdGIgdWwgdWwsCi0jcXYgb2wgb2wsCi0jcXYgdWwgdWwsCi0uc2lkZWJveCBvbCBvbCwKLS5zaWRlYm94IHVsIHVsIHsKLSAgbWFyZ2luLWJvdHRvbTowOwotfQotCi0jcXYgb2wgb2wgewotICBtYXJnaW46M3B4IDAgM3B4IDE1cHg7Ci19Ci0KLS5zaWRlYm94IHAsCi0jcXYgcCwKLSN0YiBwIHsKLSAgbWFyZ2luOiAwIDAgMTBweDsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9ybQotKi8KLS5hcnRpY2xlIGZvcm0gewotICAgIG1hcmdpbjogMCAwIDIwcHg7Ci19Ci0uYXJ0aWNsZSBmb3JtIC5mb3JtLXJlcXVpcmVkIHsKLSAgICBjb2xvcjogI2RkNGIzOTsKLX0KLS5hcnRpY2xlIGZvcm0gZmllbGRzZXQgewotICAgIG1hcmdpbjogMCAwIDIwcHg7Ci0gICAgcGFkZGluZzogMDsKLX0KLS5hcnRpY2xlIGZvcm0gbGVnZW5kIHsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICBsaW5lLWhlaWdodDogMS41OwotICAgIG1hcmdpbjogMDsKLSAgICBwYWRkaW5nOiAwOwotfQotLyoKLS5hcnRpY2xlIGZvcm0gb2wsIC5hcnRpY2xlIGZvcm0gdWwgewotICAgIG1hcmdpbjogMCAwIDAgMWVtOwotICAgIHBhZGRpbmc6IDAgMCAwIDFlbTsKLX0KLVtkaXI9J3J0bCddIC5hcnRpY2xlIGZvcm0gb2wsIFtkaXI9J3J0bCddIC5hcnRpY2xlIGZvcm0gdWwgewotICAgIG1hcmdpbjogMCAxZW0gMCAwOwotICAgIHBhZGRpbmc6IDAgMWVtIDAgMDsKLX0KLS5hcnRpY2xlIGZvcm0gb2wgdWwsIC5hcnRpY2xlIGZvcm0gdWwgdWwsIFtkaXI9J3J0bCddIC5hcnRpY2xlIGZvcm0gb2wgdWwsIFtkaXI9J3J0bCddIC5hcnRpY2xlIGZvcm0KLXVsIHVsIHsKLSAgICBsaXN0LXN0eWxlOiBub25lOwotICAgIG1hcmdpbjogMDsKLSAgICBwYWRkaW5nOiAwOwotfQotLmFydGljbGUgZm9ybSBsaSB7Ci0gICAgbWFyZ2luOiAwIDAgMjBweDsKLX0KLS5hcnRpY2xlIGZvcm0gbGkgbGkgewotICAgIG1hcmdpbjogMCAwIDVweDsKLX0KLSovCi0uYXJ0aWNsZSBmb3JtIGxhYmVsIHsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICBtYXJnaW46IDAgMCA1cHg7Ci0gICAgcGFkZGluZzogMDsKLX0KLS5hcnRpY2xlIGZvcm0gaW5wdXRbdHlwZT0ndGV4dCddLCAuYXJ0aWNsZSBmb3JtIHNlbGVjdCwgLmFydGljbGUgZm9ybSB0ZXh0YXJlYSwgLmFydGljbGUgZm9ybQotLmNoZWNrYm94LWdyb3VwLCAuYXJ0aWNsZSBmb3JtIC5yYWRpby1ncm91cCB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMTVweDsKLX0KLS5jaGVja2JveC1ncm91cCBpbnB1dCB7Ci0gIHdpZHRoOiAxM3B4OwotICBoZWlnaHQ6IDEzcHg7Ci0gIGJhY2tncm91bmQ6ICNmZmY7Ci0gIGJvcmRlcjogc29saWQgMXB4ICNjNmM2YzY7Ci0gIGZsb2F0OiBsZWZ0OwotfQotLmFydGljbGUgZm9ybSAuY2hlY2tib3gtZ3JvdXAsIC5hcnRpY2xlIGZvcm0gLnJhZGlvLWdyb3VwIHsKLSAgZGlzcGxheTogYmxvY2sKLX0KLS5hcnRpY2xlIGZvcm0gc2VsZWN0IHsKLSAgICBib3JkZXI6IHNvbGlkIDFweCAjZWJlYmViOwotICAgIGJvcmRlci10b3AtY29sb3I6ICNkZGQ7Ci0gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwotICAgIGJhY2tncm91bmQ6ICNmM2YzZjMgdXJsKC4uL2ltYWdlcy9hcnJvd3MtdXAtZG93bi5wbmcpIHJpZ2h0IGNlbnRlciBuby1yZXBlYXQ7Ci0gICAgaGVpZ2h0OiAzMHB4OwotICAgIGNvbG9yOiAjMjIyOwotICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7Ci0gICAgcGFkZGluZzogNXB4OwotICAgIHdpZHRoOiAxMzBweDsKLX0KLSAgICAKLS5hcnRpY2xlIGZvcm0gLmJyb3dzZSAuYnJvd3NlLW1zZyB7Ci0gIGZvbnQtc2l6ZTogMTEuNXB4OyAgCi19Ci0uYXJ0aWNsZSBmb3JtIC5icm93c2UgLmJ1dHRvbi1zZWNvbmRhcnkgewotICBoZWlnaHQ6IGF1dG87Ci0gIGxpbmUtaGVpZ2h0OiAyNXB4OwotICBmb250LXNpemU6IDExcHg7Ci0gIHBhZGRpbmc6IDAgOHB4OwotICBtYXJnaW46IDAgMTBweCAxNXB4IDA7Ci19Ci0uYXJ0aWNsZSBmb3JtIGlucHV0W3R5cGU9J3RleHQnXSwgLmFydGljbGUgZm9ybSB0ZXh0YXJlYSB7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgI2ViZWJlYjsKLSAgICBib3JkZXItdG9wLWNvbG9yOiAjZGNkY2RjOwotICAgIGNvbG9yOiAjMjIyOwotICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7Ci0gICAgcGFkZGluZzogNnB4IDEwcHg7Ci0gICAgd2lkdGg6IDMwMHB4OyAKLX0KLS5hcnRpY2xlIGZvcm0gdGV4dGFyZWEgewotICAgIGhlaWdodDogMTUwcHg7Ci19Ci0uYXJ0aWNsZSBmb3JtIGlucHV0W3R5cGU9J3RleHQnXTpmb2N1cywgLmFydGljbGUgZm9ybSB0ZXh0YXJlYTpmb2N1cyB7Ci0gICAgYm9yZGVyLWNvbG9yOiAjMzNCNUU1OwotICAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgLjIpOwotICAgIC1vLWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIC4yKTsKLSAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIC4yKTsKLSAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAuMik7Ci0gICAgb3V0bGluZTogMDsKLX0KLS5hcnRpY2xlIGZvcm0gaW5wdXRbZGlzYWJsZWRdLCAuYXJ0aWNsZSBmb3JtIHRleHRhcmVhW2Rpc2FibGVkXSwgLmFydGljbGUgZm9ybSBsYWJlbC5mb3JtLWRpc2FibGVkIHsKLSAgICBjb2xvcjogIzk5OTsKLX0KLS5hcnRpY2xlIGZvcm0gaW5wdXRbdHlwZT0ndGV4dCddW2Rpc2FibGVkXSwgLmFydGljbGUgZm9ybSB0ZXh0YXJlYVtkaXNhYmxlZF0gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNlYmViZWI7Ci19Ci1mb3JtIC5mb3JtLWVycm9yIGlucHV0W3R5cGU9J3RleHQnXSwgZm9ybSAuZm9ybS1lcnJvciB0ZXh0YXJlYSB7Ci0gICAgYm9yZGVyLWNvbG9yOiAjZGQ0YjM5OwotICBtYXJnaW4tcmlnaHQ6IDIwcHg7Ci19Ci0uYXNpZGUgewotICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OwotICAgIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgICBtYXJnaW46IDEwcHggMDsKLSAgICBwYWRkaW5nOiAyMHB4OwotICBjb2xvcjogIzY2NjsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIGJhY2tncm91bmQ6ICNmOWY5Zjk7Ci19Ci0vKgotLmFzaWRlLCAubm90aWZpY2F0aW9uLCAucHJvbW8gewotICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OwotICAgIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgICBtYXJnaW46IDEwcHggMDsKLSAgICBwYWRkaW5nOiAxMHB4OwotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLX0KLS5hc2lkZT46Zmlyc3QtY2hpbGQsIC5ub3RpZmljYXRpb24+OmZpcnN0LWNoaWxkLCAucHJvbW8+OmZpcnN0LWNoaWxkIHsKLSAgICBtYXJnaW4tdG9wOiAwOwotfQotLmFzaWRlPjpsYXN0LWNoaWxkLCAubm90aWZpY2F0aW9uPjpsYXN0LWNoaWxkLCAucHJvbW8+Omxhc3QtY2hpbGQgewotICAgIG1hcmdpbi1ib3R0b206IDA7Ci19Ci0uYXNpZGUgewotICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7Ci19Ci0ubm90aWZpY2F0aW9uIHsKLSAgICBiYWNrZ3JvdW5kOiAjZmZmYmU0OwotICAgIGJvcmRlci1jb2xvcjogI2Y4ZjZlNjsKLX0KLS5wcm9tbyB7Ci0gICAgYmFja2dyb3VuZDogI2Y2ZjlmZjsKLSAgICBib3JkZXItY29sb3I6ICNlZmYyZjk7Ci19Ci0qLwotCi0vKiBTREsgVE9TIHN0eWxlcyAqLwotCi1kaXYuc2RrLXRlcm1zIHsKLSAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwotICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Ci0gIGZvbnQtZmFtaWx5OiBpbmhlcml0OwotICBmb250LXNpemU6IGluaGVyaXQ7Ci0gIHBhZGRpbmc6IDEwcHg7Ci0gIGhlaWdodDogMzcwcHg7Ci0gIHdpZHRoOiA3MzhweDsKLSAgYm9yZGVyOiAxcHggc29saWQgIzQ0NDsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Ci0gIG92ZXJmbG93OmF1dG87Ci0gIG1hcmdpbjowIDAgMTBweDsKLX0KLQotZGl2LnNkay10ZXJtcy5mdWxsc2l6ZSB7Ci0gIHBhZGRpbmc6IDA7Ci0gIGhlaWdodDogYXV0bzsKLSAgd2lkdGg6IGF1dG87Ci0gIGJvcmRlcjpub25lOwotfQotCi1kaXYuc2RrLXRlcm1zIGgzLAotZGl2LnNkay10ZXJtcyBoMiB7Ci0gIG1hcmdpbjowOwotfQotCi1kaXYjc2RrLXRlcm1zLWZvcm0gewotICBwYWRkaW5nOjAgMCAwIDEwcHg7Ci19Ci0KLWRpdiNzZGstdGVybXMtZm9ybSBpbnB1dCB7Ci0gIGRpc3BsYXk6aW5saW5lOwotICBtYXJnaW46NHB4IDRweCA0cHggMDsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29kZSBTdHlsZQotKi8KLXByZSB7Ci0gIG1hcmdpbjowIDAgMWVtIDA7Ci0gIHBhZGRpbmc6IDFlbTsKLSAgb3ZlcmZsb3c6IGF1dG87Ci0gIGJvcmRlcjogc29saWQgMXB4ICNkZGQ7Ci0gIGJhY2tncm91bmQ6ICNmN2Y3Zjc7ICAKLX0KLS5zdHIgeyBjb2xvcjogIzA4MDsgfQotLmt3ZCB7IGNvbG9yOiAjMDA4OyB9Ci0uY29tIHsgY29sb3I6ICM4MDA7IH0KLS50eXAgeyBjb2xvcjogIzYwNjsgfQotLmxpdCB7IGNvbG9yOiAjMDY2OyB9Ci0ucHVuIHsgY29sb3I6ICM2NjA7IH0KLS5wbG4geyBjb2xvcjogIzAwMDsgfQotLnRhZyB7IGNvbG9yOiAjMDA4OyB9Ci0uYXRuIHsgY29sb3I6ICM4Mjg7IH0KLS5hdHYgeyBjb2xvcjogIzA4MDsgfQotLmRlYyB7IGNvbG9yOiAjNjA2OyB9Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaHJlZS1QYW5lCi0qLwotLyogUGFja2FnZSBOYXYgJiBDbGFzc2VzIE5hdiAqLwotLnRocmVlLXBhbmUgewotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIGJvcmRlci10b3A6IHNvbGlkIDFweCAjZWJlYmViOwotfQotI3BhY2thZ2VzLW5hdiAuanMtcGFuZSwKLSNjbGFzc2VzLW5hdiAuanMtcGFuZSB7Ci0gIG92ZXJmbG93OnZpc2libGU7Ci19Ci0jcGFja2FnZXMtbmF2IHsKLSAgICAgICAgaGVpZ2h0OjI3MHB4OwotICBtYXgtaGVpZ2h0OiBpbmhlcml0OwotICBvdmVyZmxvdzogaGlkZGVuOwotICBwb3NpdGlvbjogcmVsYXRpdmU7IAotfQotI2NsYXNzZXMtbmF2IHsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgcG9zaXRpb246IHJlbGF0aXZlOyAKLX0KLSNwYWNrYWdlcy1uYXYgdWwsICNjbGFzc2VzLW5hdiB1bCB7Ci0gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLSAgbWFyZ2luOiAxMHB4IDAgMjBweCAwOwotICBwYWRkaW5nOiAwOyAKLX0KLSNjbGFzc2VzLW5hdiBsaSB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotICBtYXJnaW46IDVweCAwOwotfQotI3BhY2thZ2VzLW5hdiBsaSwKLSNjbGFzc2VzLW5hdiBsaSBsaSB7Ci0gIG1hcmdpbjogMDsKLX0KLSNwYWNrYWdlcy1uYXYgbGkgYSwgI3BhY2thZ2VzLW5hdiBsaSBhOmFjdGl2ZSwgI3BhY2thZ2VzLW5hdiBsaSBhOnZpc2l0ZWQsCi0jY2xhc3Nlcy1uYXYgbGkgYSwgI2NsYXNzZXMtbmF2IGxpIGE6YWN0aXZlLCAjY2xhc3Nlcy1uYXYgbGkgYTp2aXNpdGVkIHsKLSAgcGFkZGluZzogMCAwIDAgNHB4OwotfQotI3BhY2thZ2VzLW5hdiBsaSBhLCAjcGFja2FnZXMtbmF2IGxpIGE6YWN0aXZlLCAjcGFja2FnZXMtbmF2IGxpIGE6dmlzaXRlZCwKLSNjbGFzc2VzLW5hdiBsaSBsaSBhLCAjY2xhc3Nlcy1uYXYgbGkgbGkgYTphY3RpdmUsICNjbGFzc2VzLW5hdiBsaSBsaSBhOnZpc2l0ZWQsCi0jbmF2LXRyZWUgbGkgYSwgI25hdi10cmVlIGxpIGE6YWN0aXZlLCAjbmF2LXRyZWUgbGkgYTp2aXNpdGVkIHsKLSAgY29sb3I6ICMyMjI7Ci0gIGZvbnQtd2VpZ2h0OiBub3JtYWw7ICAKLX0KLSNwYWNrYWdlcy1uYXYgbGkgYSwgI3BhY2thZ2VzLW5hdiBsaSBhOmFjdGl2ZSwgI3BhY2thZ2VzLW5hdiBsaSBhOnZpc2l0ZWQsCi0jY2xhc3Nlcy1uYXYgbGkgbGkgYSwgI2NsYXNzZXMtbmF2IGxpIGxpIGE6YWN0aXZlLCAjY2xhc3Nlcy1uYXYgbGkgbGkgYTp2aXNpdGVkIHsKLSAgZGlzcGxheTogYmxvY2s7Ci19Ci0jcGFja2FnZXMtbmF2IGxpLnNlbGVjdGVkIGEsICNwYWNrYWdlcy1uYXYgbGkuc2VsZWN0ZWQgYTphY3RpdmUsICNwYWNrYWdlcy1uYXYgbGkuc2VsZWN0ZWQKLWE6dmlzaXRlZCwKLSNjbGFzc2VzLW5hdiBsaSBsaS5zZWxlY3RlZCBhLCAjY2xhc3Nlcy1uYXYgbGkgbGkuc2VsZWN0ZWQgYTphY3RpdmUsICNjbGFzc2VzLW5hdiBsaSBsaS5zZWxlY3RlZAotYTp2aXNpdGVkLAotI25hdi10cmVlIGxpIGRpdi5zZWxlY3RlZCB7Ci0gICAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgICBjb2xvcjogIzAwOTljYzsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7IH0KLSAgI3BhY2thZ2VzLW5hdiBsaS5zZWxlY3RlZCB1bCBsaSBhLAotICAjY2xhc3Nlcy1uYXYgbGkuc2VsZWN0ZWQgdWwgbGkgYSB7Ci0gIC8qIGRvbid0IGhpZ2hsaWdodCBjaGlsZCBpdGVtcyAqLwotICAgIGNvbG9yOiAjNTU1NTU1OyB9Ci0jbmF2LXRyZWUgbGkgZGl2LnNlbGVjdGVkIGEgewotICAgIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gICAgY29sb3I6ICMwMDk5Y2M7Ci19Ci0jbmF2LXN3YXAgewotICBoZWlnaHQ6MzBweDsKLSAgYm9yZGVyLXRvcDoxcHggc29saWQgI2NjYzsKLSAgZGlzcGxheTogbm9uZTsKLX0KLSNuYXYtc3dhcCBhIHsKLSAgZGlzcGxheTppbmxpbmUtYmxvY2s7Ci0gIGhlaWdodDoxMDAlOwotICBjb2xvcjogIzIyMjsKLSAgZm9udC1zaXplOiAxMnB4OwotICBwYWRkaW5nOiA1cHggMCA1cHggNXB4OwotfQotCi0jbmF2LXN3YXAgLmZ1bGxzY3JlZW4gewotICBmbG9hdDogcmlnaHQ7Ci0gIHdpZHRoOiAyNHB4OwotICBoZWlnaHQ6IDI0cHg7Ci0gIHRleHQtaW5kZW50OiAtMTAwMGVtOwotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjozcHggNXB4IDA7Ci0gIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvZnVsbHNjcmVlbi5wbmcpIG5vLXJlcGVhdCAtMjRweCAwOwotfQotI25hdi1zd2FwIC5mdWxsc2NyZWVuLmRpc2FibGVkIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOwotfQotI25hdi1zd2FwIC5mdWxsc2NyZWVuOmhvdmVyLCAKLSNuYXYtc3dhcCAuZnVsbHNjcmVlbjpmb2N1cyB7Ci0gIGN1cnNvcjpwb2ludGVyOwotfQotCi0KLS8qIG5hdiB0cmVlICovCi0jc2lkZS1uYXYsICNkZXZkb2MtbmF2LCAjc3dhcHBlciwKLSNuYXYtdHJlZSwgI3RyZWUtbGlzdCB7Ci0gIG92ZXJmbG93OmhpZGRlbjsKLSAgbWFyZ2luLWxlZnQ6MDsKLX0KLQotI25hdi10cmVlLCAjc3dhcHBlciB7Ci0gIGRpc3BsYXk6IG5vbmU7Ci19Ci0KLSNuYXYtdHJlZSB1bCB7Ci0gIGxpc3Qtc3R5bGU6bm9uZTsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MTBweCAwOwotfQotCi0jbmF2LXRyZWUgdWwgbGkgZGl2IHsKLSAgcGFkZGluZzowIDAgMCA0cHg7Ci19Ci0KLSNzaWRlLW5hdiAjbmF2LXRyZWUgdWwgbGkgYSwKLSNzaWRlLW5hdiAjbmF2LXRyZWUgdWwgbGkgc3Bhbi5uby1jaGlsZHJlbiB7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMDsKLX0KLQotI25hdi10cmVlIC5wbHVzIHsKLSAgbWFyZ2luOiAwIDNweCAwIDA7Ci19Ci0KLSNuYXYtdHJlZSB1bCB1bCB7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMCAwIDAgMDsKLX0KLQotI25hdi10cmVlIHVsIGxpIHsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwIDAgMCAwOwotICB3aGl0ZS1zcGFjZTogbm93cmFwOwotfQotCi0jbmF2LXRyZWUgLmNoaWxkcmVuX3VsIHsKLSAgcGFkZGluZzowOwotICBtYXJnaW46MDsKLX0KLSNuYXYtdHJlZSAuY2hpbGRyZW5fdWwgbGkgZGl2IHsKLSAgcGFkZGluZzowIDAgMCAxMHB4OwotfQotI25hdi10cmVlIC5jaGlsZHJlbl91bCAuY2hpbGRyZW5fdWwgbGkgZGl2IHsKLSAgcGFkZGluZzowIDAgMCAyMHB4OwotfQotCi0jbmF2LXRyZWUgYS5ub2xpbmsgewotICBjb2xvcjogIzIyMjsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0jbmF2LXRyZWUgc3Bhbi5sYWJlbCB7Ci0gIHdpZHRoOiAxMDAlOwotfQotCi0jbmF2LXRyZWUgewotICBvdmVyZmxvdy14OiBhdXRvOwotICBvdmVyZmxvdy15OiBzY3JvbGw7Ci0gIG91dGxpbmU6MDsKLX0KLQotCi0vKiBDb250ZW50ICovCi0jZG9jLWNvbCB7Ci0gIG1hcmdpbi1yaWdodDowOwotfQotI2RvYy1jb250ZW50LWNvbnRhaW5lciB7Ci0gIG1hcmdpbi1sZWZ0OiAyOTFweCAgCi19Ci0jZG9jLWhlYWRlciwgI2RvYy1jb250ZW50IHsKLSAgcGFkZGluZzogMWVtIDJlbTsKLX0KLSNkb2MtaGVhZGVyIHsKLSAgYmFja2dyb3VuZDogI2Y3ZjdmNzsgIAotfQotI2RvYy1oZWFkZXIgaDEgewotICBsaW5lLWhlaWdodDogMDsKLSAgbWFyZ2luLWJvdHRvbTogMTVweDsKLX0KLSNhcGktaW5mby1ibG9jayB7Ci0gIGZsb2F0OiByaWdodDsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0jYXBpLWluZm8tYmxvY2sgYSwgI2FwaS1pbmZvLWJsb2NrIGE6YWN0aXZlLCAjYXBpLWluZm8tYmxvY2sgYTp2aXNpdGVkIHsKLSAgY29sb3I6ICMyMjI7Ci19Ci0jYXBpLWluZm8tYmxvY2sgYTpob3ZlciwgI2FwaS1pbmZvLWJsb2NrIGE6Zm9jdXMgewotICBjb2xvcjogIzMzQjVFNTsKLX0KLSNhcGktbmF2LWhlYWRlciB7Ci0gIGhlaWdodDoxOXB4OyAvKiBwbHVzIDE2cHggcGFkZGluZyA9IDM1OyBzYW1lIGFzICNuYXYgbGkgKi8KLSAgZm9udC1zaXplOjE0cHg7Ci0gIHBhZGRpbmc6IDhweCAwOwotICBtYXJnaW46IDA7Ci0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQ0NDOwotICBiYWNrZ3JvdW5kOiNlOWU5ZTk7Ci0gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNSk7IC8qIG1hdGNoZXMgI25hdiBsaS5leHBhbmRlZCAqLwotICBkaXNwbGF5OiBub25lOwotCi19Ci0jYXBpLW5hdi10aXRsZSB7Ci0gIHBhZGRpbmc6MCA1cHg7Ci0gIHdoaXRlLXNwYWNlOm5vd3JhcDsKLSAgZGlzcGxheTogbm9uZTsKLX0KLQotI2FwaS1sZXZlbC10b2dnbGUgewotICBmbG9hdDpyaWdodDsKLSAgcGFkZGluZzowIDVweDsKLX0KLQotI2FwaS1sZXZlbC10b2dnbGUgbGFiZWwgewotICBtYXJnaW46MDsKLSAgdmVydGljYWwtYWxpZ246dG9wOwotICBsaW5lLWhlaWdodDogMTlweDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGhlaWdodDogMTlweDsKLX0KLQotI2FwaS1sZXZlbC10b2dnbGUgLnNlbGVjdC13cmFwcGVyIHsKLSAgd2lkdGg6IDM1cHg7Ci0gIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLX0KLSNhcGktbGV2ZWwtdG9nZ2xlIHNlbGVjdCB7Ci0gIGJvcmRlcjogMDsKLSAgYXBwZWFyYW5jZTpub25lOwotICAtbW96LWFwcGVhcmFuY2U6bm9uZTsKLSAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwotICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoLi4vaW1hZ2VzL2Fycm93cy11cC1kb3duLnBuZykgMjNweCA1cHggbm8tcmVwZWF0OwotICBjb2xvcjogIzIyMjsKLSAgaGVpZ2h0OiAxOXB4OwotICBsaW5lLWhlaWdodDogMTlweDsKLSAgcGFkZGluZzogMDsKLSAgbWFyZ2luOjFweCAwIDAgMDsKLSAgd2lkdGg6MTUwJTsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIHZlcnRpY2FsLWFsaWduOnRvcDsKLSAgb3V0bGluZTowOwotfQotCi0KLS8qIFRvZ2dsZSBmb3IgcmV2aXNpb24gbm90ZXMgYW5kIHN0dWZmICovCi1kaXYudG9nZ2xlLWNvbnRlbnQuY2xvc2VkIC50b2dnbGUtY29udGVudC10b2dnbGVtZSB7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLQotI2pkLWNvbnRlbnQgaW1nLnRvZ2dsZS1jb250ZW50LWltZyB7Ci0gIG1hcmdpbjowIDVweCA1cHggMDsKLX0KLWRpdi50b2dnbGUtY29udGVudCBwIHsKLSAgbWFyZ2luOjEwcHggMCAwOwotfQotZGl2LnRvZ2dsZS1jb250ZW50LXRvZ2dsZW1lIHsKLSAgcGFkZGluZzowIDAgMCAxNXB4OwotfQotCi0KLS8qIEFQSSBMRVZFTCBGSUxURVJFRCBNRU1CRVJTICovCi0KLS5hYnNlbnQsCi0uYWJzZW50IGE6bGluaywKLS5hYnNlbnQgYTp2aXNpdGVkLAotLmFic2VudCBhOmhvdmVyLAotLmFic2VudCAqIHsKLSAgY29sb3I6I2JiYiAhaW1wb3J0YW50OwotICBjdXJzb3I6ZGVmYXVsdCAhaW1wb3J0YW50OwotICB0ZXh0LWRlY29yYXRpb246bm9uZSAhaW1wb3J0YW50OwotfQotI2RldmRvYy1uYXYgbGkuYWJzZW50LnNlbGVjdGVkLAotI2RldmRvYy1uYXYgbGkuYWJzZW50LnNlbGVjdGVkICosCi0jZGV2ZG9jLW5hdiBkaXYubGFiZWwuYWJzZW50LnNlbGVjdGVkLAotI2RldmRvYy1uYXYgZGl2LmxhYmVsLmFic2VudC5zZWxlY3RlZCAqIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZWFlYWVhICFpbXBvcnRhbnQ7Ci19Ci0uYWJzZW50IGg0LmpkLWRldGFpbHMtdGl0bGUsCi0uYWJzZW50IGg0LmpkLWRldGFpbHMtdGl0bGUgKiB7Ci0gIGJhY2tncm91bmQtY29sb3I6I2Y2ZjZmNiAhaW1wb3J0YW50OwotfQotLmFic2VudCBpbWcgewotICBvcGFjaXR5OiAuMzsKLSAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTMwKTsKLSAgLW1zLWZpbHRlcjoicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9MzApIjsKLX0KLQotCi0KLQotCi0KLQotCi0KLS8qIEpRVUVSWSBSRVNJWkFCTEUgU1RZTEVTICovCi0udWktcmVzaXphYmxlIHsgcG9zaXRpb246IHJlbGF0aXZlOyB9Ci0udWktcmVzaXphYmxlLWhhbmRsZSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgZGlzcGxheTogbm9uZTsgZm9udC1zaXplOiAwLjFweDsgei1pbmRleDoxOyB9Ci0udWktcmVzaXphYmxlIC51aS1yZXNpemFibGUtaGFuZGxlIHsgZGlzcGxheTogYmxvY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTRlNGU0OyB9Ci0vKmJvZHkgLnVpLXJlc2l6YWJsZS1kaXNhYmxlZCAudWktcmVzaXphYmxlLWhhbmRsZSB7IGRpc3BsYXk6IG5vbmU7IH0KLWJvZHkgLnVpLXJlc2l6YWJsZS1hdXRvaGlkZSAudWktcmVzaXphYmxlLWhhbmRsZSB7IGRpc3BsYXk6IG5vbmU7IH0qLwotLnVpLXJlc2l6YWJsZS1zIHsgY3Vyc29yOiBzLXJlc2l6ZTsgaGVpZ2h0OiAxMHB4OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBib3R0b206IC0xMXB4OyBsZWZ0OiAwOwotYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNlZGVkZWQ7Ci0gIGJhY2tncm91bmQ6ICNmN2Y3ZjcgdXJsKCIuLi9pbWFnZXMvcmVzaXphYmxlLXMyLnBuZyIpIG5vLXJlcGVhdCBzY3JvbGwgY2VudGVyIGNlbnRlcjsgfQotLyoKLS51aS1yZXNpemFibGUtZSB7IAotY3Vyc29yOiBlLXJlc2l6ZTsgd2lkdGg6IDEwcHg7IHJpZ2h0OiAwOyB0b3A6IDA7IGhlaWdodDogMTAwJTsgYm9yZGVyLXJpZ2h0OiBzb2xpZAotMXB4ICNlZGVkZWQ7YmFja2dyb3VuZDogI2Y3ZjdmNyB1cmwoIi4uL2ltYWdlcy9yZXNpemFibGUtZTIucG5nIikgbm8tcmVwZWF0IHNjcm9sbCBjZW50ZXIgY2VudGVyOyB9Ci0qLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTGlnaHRib3gKLSovCi0ubGlnaHRib3ggeyAKLSAgd2lkdGg6IDc2OXB4OwotICBwYWRkaW5nOiAxLjVlbTsKLSAgbWFyZ2luOiAwIGF1dG87Ci0gIGJvcmRlcjogc29saWQgMXB4ICNkY2RjZGM7Ci0gIGJhY2tncm91bmQ6ICNmZmY7Ci0gIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCA1cHggcmdiYSgwLDAsMCwwLjEpOwotICAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggNXB4IHJnYmEoMCwwLDAsMC4xKTsKLSAgYm94LXNoYWRvdzogMXB4IDFweCA1cHggcmdiYSgwLDAsMCwwLjEpCi19Ci0ubGlnaHRib3ggLmhlYWRlciB7Ci0gIGZsb2F0OiBsZWZ0OwotICB3aWR0aDogNzIwcHg7Ci0gIG1hcmdpbjogLTEwcHggMjBweCAxMHB4IDA7ICAKLX0KLS5saWdodGJveCAuY2xvc2UgewotICBmbG9hdDogcmlnaHQ7Ci0gIHdpZHRoOiAxMHB4OwotICBoZWlnaHQ6IDEwcHg7Ci0gIG1hcmdpbjogLTEwcHggLTEwcHggMTBweCAwOwotICB0ZXh0LWluZGVudDogLTEwMDBlbTsKLSAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9jbG9zZS5wbmcpIG5vLXJlcGVhdCAwIDA7Ci19Ci0ubGlnaHRib3ggLmNsb3NlOmhvdmVyLCAubGlnaHRib3ggLmNsb3NlOmZvY3VzIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwcHggMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUJ1dHRlcmJhcgotKi8KLSNidXR0ZXJiYXItd3JhcHBlciB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICB0b3A6MDsKLSAgbGVmdDowOwotICB3aWR0aDoxMDAlOwotfQotI2J1dHRlcmJhciB7Ci0gIHdpZHRoOjk0MHB4OwotICBtYXJnaW46MCBhdXRvOwotfQotI2J1dHRlcmJhci1tZXNzYWdlIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojZjgwOwotICBmbG9hdDpyaWdodDsKLSAgZm9udC1zaXplOjEycHg7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIHBhZGRpbmc6MCAxMHB4OwotICBib3JkZXItcmFkaXVzOiAwIDAgNXB4IDVweDsKLX0KLSNidXR0ZXJiYXItbWVzc2FnZSBhIHtjb2xvcjojZmZmICFpbXBvcnRhbnR9Ci0jYnV0dGVyYmFyLW1lc3NhZ2UgYTpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NaXNjCi0qLwotCi0KLS5jbGVhcmZpeDpiZWZvcmUsIC5jbGVhcmZpeDphZnRlciB7Ci0gIGNvbnRlbnQ6ICIiOwotICBkaXNwbGF5OiB0YWJsZQotfQotLmNsZWFyZml4OmFmdGVyIHsKLSAgY2xlYXI6IGJvdGgKLX0KLS5jbGVhcmZpeCB7Ci0gICp6b29tOiAxCi19Ci10YWJsZS5ibGFuayB0aCwgdGFibGUuYmxhbmsgdGQgewotICAgIGJvcmRlcjogMDsKLSAgYmFja2dyb3VuZDogbm9uZQotfQotLmNhcHRpb24gewotICBtYXJnaW46IDAuNWVtIDAgMmVtIDA7Ci0gIGNvbG9yOiAjMDAwOwotICBmb250LXNpemU6IDExLjVweDsgIAotfQotCi0ubm9saXN0IHsKLSAgbGlzdC1zdHlsZTpub25lOwotICBtYXJnaW4tbGVmdDowOwotfQotI3RiIC5ub2xpc3QgewotICBtYXJnaW4tbGVmdDoxNXB4OwotfQotCi0KLXByZS5jbGFzc2ljIHsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLSAgYm9yZGVyOm5vbmU7Ci0gIHBhZGRpbmc6MDsKLX0KLQotcC5pbWctY2FwdGlvbiB7Ci0gIG1hcmdpbjogLTEwcHggMCAyMHB4OwotICBmb250LXNpemU6MTNweDsKLSAgY29sb3I6IzY2NjsKLX0KLQotZGl2LmZpZ3VyZSwKLWRpdi5maWd1cmUtcmlnaHQgewotICBmbG9hdDpyaWdodDsKLSAgY2xlYXI6cmlnaHQ7Ci0gIG1hcmdpbjoxMHB4IDAgMCAwOwotICBwYWRkaW5nOjAgMCAwIDIwcHg7Ci0gIC8qIHdpZHRoIG11c3QgYmUgZGVmaW5lZCB3LyBhbiBpbmxpbmUgc3R5bGUgbWF0Y2hpbmcgdGhlIGltYWdlIHdpZHRoICovCi19Ci0KLWRpdi5maWd1cmUtbGVmdCB7Ci0gIGZsb2F0OmxlZnQ7Ci0gIGNsZWFyOmxlZnQ7Ci0gIG1hcmdpbjoxMHB4IDAgMCAwOwotICBwYWRkaW5nOjAgMjBweCAwIDA7Ci0gIC8qIHdpZHRoIG11c3QgYmUgZGVmaW5lZCB3LyBhbiBpbmxpbmUgc3R5bGUgbWF0Y2hpbmcgdGhlIGltYWdlIHdpZHRoICovCi19Ci0KLWltZy5mcmFtZSB7Ci0gIGJvcmRlcjoxcHggc29saWQgI0RERDsKLSAgcGFkZGluZzo0cHg7Ci19Ci0KLXAudGFibGUtY2FwdGlvbiB7Ci0gIG1hcmdpbjogMCAwIDRweCAwOwotICBmb250LXNpemU6MTNweDsKLSAgY29sb3I6IzY2NjsKLX0KLQotcC5jb2RlLWNhcHRpb24gewotICBtYXJnaW46IDAgMCA0cHggMDsKLSAgZm9udDogMTJweC8xLjUgbW9ub3NwYWNlOwotICBjb2xvcjojNjY2OwotfQotCi1kaXYubm90ZSwgCi1kaXYuY2F1dGlvbiwgCi1kaXYud2FybmluZyB7Ci0gIG1hcmdpbjogMCAwIDE1cHg7Ci19Ci0KLXAubm90ZSwgZGl2Lm5vdGUsIAotcC5jYXV0aW9uLCBkaXYuY2F1dGlvbiwgCi1wLndhcm5pbmcsIGRpdi53YXJuaW5nIHsKLSAgcGFkZGluZzogMCAwIDAgMTBweDsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZDsKLX0KLQotcC5ub3RlLCBkaXYubm90ZSB7Ci0gIGJvcmRlci1jb2xvcjogIzI1OEFBRjsKLX0KLQotcC5jYXV0aW9uLCBkaXYuY2F1dGlvbiB7Ci0gIGJvcmRlci1jb2xvcjogI0ZGODgwMDsKLX0KLQotcC53YXJuaW5nLCBkaXYud2FybmluZyB7Ci0gIGJvcmRlci1jb2xvcjogI2ZmNDQ0MzsKLX0KLQotZGl2Lm5vdGUuZGVzaWduIHsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjMzNCNUU1OwotfQotCi1kaXYubm90ZS5kZXZlbG9wIHsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjRjgwOwotfQotCi1kaXYubm90ZS5kaXN0cmlidXRlIHsKLSAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjOUMwOwotfQotCi0ubm90ZSBwLCAuY2F1dGlvbiBwLCAud2FybmluZyBwIHsKLSAgbWFyZ2luOjAgMCA1cHg7Ci19Ci0KLS5ub3RlIHA6bGFzdC1jaGlsZCwgLmNhdXRpb24gcDpsYXN0LWNoaWxkLCAud2FybmluZyBwOmxhc3QtY2hpbGQgewotICBtYXJnaW4tYm90dG9tOjA7Ci19Ci0KLWJvZHkuYWJvdXQgYmxvY2txdW90ZSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OnJpZ2h0OwotICB3aWR0aDoyODBweDsKLSAgZm9udC1zaXplOjIwcHg7Ci0gIGZvbnQtc3R5bGU6aXRhbGljOwotICBsaW5lLWhlaWdodDoyNHB4OwotICBjb2xvcjojMzNCNUU1OwotICBtYXJnaW46MCAwIDIwcHggMzBweDsKLX0KLQotZGl2LmRlc2lnbi1hbm5vdW5jZSBwIHsKLSAgbWFyZ2luOjAgMCAxMHB4OwotfQotCi0jZGV2ZG9jLW5hdiBhLnRvdG9wIHsKLSAgZGlzcGxheTpibG9jazsKLSAgdG9wOjA7Ci0gIHdpZHRoOmluaGVyaXQ7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCguLi9pbWFnZXMvc3R5bGVzL2dvdG90b3AucG5nKSBuby1yZXBlYXQgc2Nyb2xsIDUwJSA1MCU7Ci0gIHRleHQtaW5kZW50Oi05OTk5ZW07Ci19Ci0jZGV2ZG9jLW5hdiBhLnRvdG9wIHsKLSAgcG9zaXRpb246Zml4ZWQ7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLSNkZXZkb2MtbmF2IGEudG90b3A6aG92ZXIgewotICBiYWNrZ3JvdW5kLWNvbG9yOiMzM0I1RTU7Ci19Ci0KLS5jb250ZW50LWZvb3RlciBhLnRvdG9wIHsKLSAgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOwotICBsaW5lLWhlaWdodDozMHB4OwotfQotCi0uZXhwYW5kYWJsZSB7Ci0gIGhlaWdodDozNHB4OwotICBwYWRkaW5nLWxlZnQ6MjBweDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci19Ci0uZXhwYW5kYWJsZTpiZWZvcmUgewotICBjb250ZW50OiAnJzsKLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9kb3duLnBuZyk7Ci0gIGJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEycHggLTlweDsKLSAgd2lkdGg6IDIwcHg7Ci0gIGhlaWdodDogMjBweDsKLSAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIHRvcDogMDsKLSAgbGVmdDogMDsgfQotfQotLmV4cGFuZGFibGUuZXhwYW5kZWQ6YmVmb3JlIHsKLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV91cC5wbmcpOwotfQotCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLURpYWxvZyBib3ggZm9yIHBvcHVwIG1lc3NhZ2VzIAotKi8KLQotZGl2LmRpYWxvZyB7Ci0gIGhlaWdodDowOwotICBtYXJnaW46MCBhdXRvOwotfQotCi1kaXYuZGlhbG9nPmRpdiB7Ci0gIHotaW5kZXg6OTk7Ci0gIHBvc2l0aW9uOmZpeGVkOwotICBtYXJnaW46NzBweCAwOwotICB3aWR0aDogMzkxcHg7Ci0gIGhlaWdodDogMjAwcHg7Ci0gIGJhY2tncm91bmQ6ICNGN0Y3Rjc7Ci0tbW96LWJveC1zaGFkb3c6IDAgMCAxNXB4IHJnYmEoMCwwLDAsMC41KTsKLS13ZWJraXQtYm94LXNoYWRvdzogMCAwIDE1cHggcmdiYSgwLDAsMCwwLjUpOwotYm94LXNoYWRvdzogMCAwIDE1cHggcmdiYSgwLDAsMCwwLjUpOwotfQotLyogSUU2IGNhbid0IHBvc2l0aW9uIGZpeGVkICovCi0qIGh0bWwgZGl2LmRpYWxvZyBkaXYgeyBwb3NpdGlvbjphYnNvbHV0ZTsgfQotCi0KLWRpdiNkZXByZWNhdGVkU3RpY2tlciB7Ci0gIGRpc3BsYXk6bm9uZTsKLSAgei1pbmRleDo5OTsKLSAgcG9zaXRpb246Zml4ZWQ7Ci0gIHJpZ2h0OjE1cHg7Ci0gIHRvcDoxMTRweDsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MWVtOwotICBiYWNrZ3JvdW5kOiNGRkY7Ci0gIGJvcmRlcjoxcHggc29saWQgI2RkZGQwMDsKLSAgYm94LXNoYWRvdzotNXB4IDVweCAxMHB4ICNjY2M7Ci0gIC1tb3otYm94LXNoYWRvdzotNXB4IDVweCAxMHB4ICNjY2M7Ci0gIC13ZWJraXQtYm94LXNoYWRvdzotNXB4IDVweCAxMHB4ICNjY2M7Ci19Ci0KLWRpdiNuYU1lc3NhZ2UgewotICBkaXNwbGF5Om5vbmU7Ci0gIHdpZHRoOjU1NXB4OwotICBoZWlnaHQ6MDsKLSAgbWFyZ2luOjAgYXV0bzsKLX0KLQotZGl2I25hTWVzc2FnZSBkaXYgewotICB6LWluZGV4Ojk5OwotICB3aWR0aDo0NTBweDsKLSAgcG9zaXRpb246Zml4ZWQ7Ci0gIG1hcmdpbjo1MHB4IDA7Ci0gIHBhZGRpbmc6NGVtIDRlbSAzZW07Ci0gIGJhY2tncm91bmQ6I0ZGRjsKLSAgYm9yZGVyOjFweCBzb2xpZCAjOTk5OwotICBib3gtc2hhZG93Oi0xMHB4IDEwcHggNDBweCAjODg4OwotICAtbW96LWJveC1zaGFkb3c6LTEwcHggMTBweCA0MHB4ICM4ODg7Ci0gIC13ZWJraXQtYm94LXNoYWRvdzotMTBweCAxMHB4IDQwcHggIzg4ODsKLX0KLS8qIElFNiBjYW4ndCBwb3NpdGlvbiBmaXhlZCAqLwotKiBodG1sIGRpdiNuYU1lc3NhZ2UgZGl2IHsgcG9zaXRpb246YWJzb2x1dGU7IH0KLQotZGl2I25hTWVzc2FnZSBzdHJvbmcgewotICBmb250LXNpemU6MS4xZW07Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNsaWRlc2hvdyBDb250cm9scyAmIE5leHQvUHJldiAKLSovCi0uc2xpZGVzaG93LW5leHQsIC5zbGlkZXNob3ctcHJldiB7ICAKLSAgd2lkdGg6IDIwcHg7Ci0gIGhlaWdodDogMzZweDsKLSAgdGV4dC1pbmRlbnQ6IC0xMDAwZW07Ci19Ci0uc2xpZGVzaG93LWNvbnRhaW5lciB7Ci0gIG1hcmdpbjogMmVtIDA7Ci19Ci0uc2xpZGVzaG93LWNvbnRhaW5lcjpiZWZvcmUsIC5zbGlkZXNob3ctY29udGFpbmVyOmFmdGVyIHsKLSAgY29udGVudDogIiI7Ci0gIGRpc3BsYXk6IHRhYmxlOwotICBjbGVhcjogYm90aDsKLX0KLWEuc2xpZGVzaG93LW5leHQsIGEuc2xpZGVzaG93LW5leHQ6dmlzaXRlZCB7Ci0KLSAgZmxvYXQ6IHJpZ2h0OwotCi0gIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvYXJyb3ctcmlnaHQucG5nKSBuby1yZXBlYXQgMCAwCi0KLX0KLQotYS5zbGlkZXNob3ctcHJldiwgYS5zbGlkZXNob3ctcHJldjp2aXNpdGVkIHsKLQotICBmbG9hdDogbGVmdDsgIAotCi0gIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvYXJyb3ctbGVmdC5wbmcpIG5vLXJlcGVhdCAwIDAKLQotfQotCi0uc2xpZGVzaG93LW5leHQ6aG92ZXIsIC5zbGlkZXNob3ctcHJldjpob3ZlciwgLnNsaWRlc2hvdy1uZXh0OmZvY3VzLCAuc2xpZGVzaG93LXByZXY6Zm9jdXMgewotCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTM2cHggIAotCi19Ci0KLS5zbGlkZXNob3ctbmV4dDphY3RpdmUsIC5zbGlkZXNob3ctcHJldjphY3RpdmUgewotCi0gIGJhY2tncm91bmQtcG9zaXRpb246IDAgLTcycHggIAotCi19Ci0uc2xpZGVzaG93LW5hdiB7Ci0gIHdpZHRoOiA3NHB4OwotICBtYXJnaW46IDAgYXV0bzsgICAKLX0KLS5zbGlkZXNob3ctbmF2IGEsIC5zbGlkZXNob3ctbmF2IGE6dmlzaXRlZCB7Ci0gIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgd2lkdGg6IDEycHg7Ci0gIGhlaWdodDogMTJweDsKLSAgbWFyZ2luOiAwIDJweCAyMHB4IDJweDsKLSAgYmFja2dyb3VuZDogI2NjYzsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1MCU7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogNTAlOwotICBib3JkZXItcmFkaXVzOiA1MCU7Ci19Ci0uc2xpZGVzaG93LW5hdiBhOmhvdmVyLCAuc2xpZGVzaG93LW5hdiBhOmZvY3VzIHsKLQotICBiYWNrZ3JvdW5kOiAjMzNCNUU1Ci19Ci0KLS5zbGlkZXNob3ctbmF2IGE6YWN0aXZlIHsKLQotICBiYWNrZ3JvdW5kOiAjMWU3OTlhOwotICBiYWNrZ3JvdW5kOiAjZWJlYmViOyAgCi0gIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMHB4IDBweCA1cHggMnB4IHJnYmEoMCwgMCwgMCwgLjA1KTsKLSAgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDVweCAycHggcmdiYSgwLCAwLCAwLCAuMDUpOwotICBib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDVweCAycHggcmdiYSgwLCAwLCAwLCAuMDUpOwotfQotLnNsaWRlc2hvdy1uYXYgYS5hY3RpdmUsIC5zbGlkZXNob3ctbmF2IGEuYWN0aXZlOmFjdGl2ZSwgLnNsaWRlc2hvdy1uYXYgYS5hY3RpdmU6dmlzaXRlZCB7Ci0gIGJhY2tncm91bmQ6ICMzM0I1RTUKLX0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UYWJzCi0qLwotdWwudGFicyB7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMmVtIDAgMCAwOyAgCi19Ci11bC50YWJzOmJlZm9yZSwgdWwudGFiczphZnRlciB7Ci0gIGNvbnRlbnQ6ICIiOwotICBkaXNwbGF5OiB0YWJsZTsKLSAgY2xlYXI6IGJvdGg7Ci19Ci11bC50YWJzIGxpIHsKLSAgbGlzdC1zdHlsZS10eXBlOiBub25lOwotICBmbG9hdDogbGVmdDsgIAotfQotdWwudGFicyBsaSBhLCB1bC50YWJzIGxpIGE6YWN0aXZlLCB1bC50YWJzIGxpIGE6dmlzaXRlZCB7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBoZWlnaHQ6IDM2cHg7Ci0gIGxpbmUtaGVpZ2h0OiAzNnB4OwotICBwYWRkaW5nOiAwIDE1cHg7Ci0gIG1hcmdpbi1yaWdodDogMnB4OwotICBjb2xvcjogIzIyMjsKLSAgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDJweDsKLSAgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiAycHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogcHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiBweDsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHggMnB4IHB4IHB4OwotICBib3JkZXItcmFkaXVzOiAycHggMnB4IHB4IHB4OyAKLSAgYm9yZGVyLXRvcDogc29saWQgMXB4ICNlYmViZWI7Ci0gIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggI2ViZWJlYjsKLSAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggI2ViZWJlYjsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNmZmZmZmYpLCB0bygjZmFmYWZhKSk7Ci0gICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZmFmYWZhKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmZmZmYsICNmYWZhZmEpOwotICAgIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZmFmYWZhKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZmFmYWZhKTsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZmZmZmZmLCAjZmFmYWZhKTsKLSAgICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjZmZmZmZmJywKLUVuZENvbG9yU3RyPScjZmFmYWZhJyk7Ci19Ci11bC50YWJzIGxpIGE6aG92ZXIgewotICBjb2xvcjogIzMzQjVFNTsgCi19Ci11bC50YWJzIGxpIGEuc2VsZWN0ZWQgewotICBoZWlnaHQ6IDM3cHg7Ci0gIGNvbG9yOiAjMzNCNUU1OwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OwotICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwotICBib3JkZXItY29sb3I6ICNkZGQ7Ci19Ci0udGFiLWNvbnRlbnQgewotICBwYWRkaW5nOiAxLjJlbTsKLSAgbWFyZ2luOiAtMXB4IDAgMmVtIDA7Ci0gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OwotICAgIC1tb3otYm9yZGVyLXJhZGl1czogMnB4OwotICAgIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgYm9yZGVyOiBzb2xpZCAxcHggI2RkZDsKLSAgYmFja2dyb3VuZDogI2Y3ZjdmNzsKLX0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1GZWF0dXJlIEJveGVzCi0qLwotLmZlYXR1cmUtYm94IHsKLSAgd2lkdGg6IDI5MXB4OwotICBoZWlnaHQ6IDIwMHB4OwotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIGJhY2tncm91bmQ6ICNGN0Y3Rjc7Ci19Ci0uYm94LWJvcmRlciAudG9wLCAuYm94LWJvcmRlciAuYm90dG9tLCAuYm94LWJvcmRlciAubGVmdCwgLmJveC1ib3JkZXIgLnJpZ2h0IHsKLSAgei1pbmRleDogMTAwOwotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNhYWE7Ci19Ci0uYm94LWJvcmRlciAudG9wLCAuYm94LWJvcmRlciAuYm90dG9tIHsKLSAgd2lkdGg6IDI5MXB4OwotICBoZWlnaHQ6IDFweDsKLX0KLS5kaWFsb2cgLmJveC1ib3JkZXIgLnRvcCwKLS5kaWFsb2cgLmJveC1ib3JkZXIgLmJvdHRvbSB7IHdpZHRoOjM5MXB4OyB9Ci0KLS5ib3gtYm9yZGVyIC5sZWZ0LCAuYm94LWJvcmRlciAucmlnaHQgeyAKLSAgd2lkdGg6IDFweDsKLSAgaGVpZ2h0OiA4cHg7ICAgIAotfQotLmJveC1ib3JkZXIgLnRvcCB7IHRvcDogMDsgbGVmdDogMCB9Ci0uYm94LWJvcmRlciAudG9wIC5sZWZ0IHsgdG9wOiAxcHg7IGxlZnQ6IDAgfQotLmJveC1ib3JkZXIgLnRvcCAucmlnaHQgeyB0b3A6IDFweDsgcmlnaHQ6IDAgfQotLmJveC1ib3JkZXIgLmJvdHRvbSAubGVmdCB7IHRvcDogLThweDsgbGVmdDogMCB9Ci0uYm94LWJvcmRlciAuYm90dG9tIHsgdG9wOiAyMDBweDsgbGVmdDogMCB9Ci0uYm94LWJvcmRlciAuYm90dG9tIC5yaWdodCB7IHRvcDogLThweDsgcmlnaHQ6IDAgfQotCi0uZmVhdHVyZS1ib3ggaDQsCi0uZGlhbG9nIGg0IHsKLSAgICBtYXJnaW46IDE1cHggMThweCAxMHB4OwotICAgIHBhZGRpbmc6MDsKLX0KLQotLmZlYXR1cmUtYm94IHAsCi0uZGlhbG9nIHAgewotICAgIG1hcmdpbjogMTBweCAxOHB4OwotICAgIHBhZGRpbmc6MDsKLX0KLS5mZWF0dXJlLWJveCAubGluaywKLS5kaWFsb2cgLmxpbmsgewotICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGVkZWRlOwotICAgIGJvdHRvbTogMDsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgd2lkdGg6IGluaGVyaXQ7Ci19Ci0uZmVhdHVyZS1ib3ggYSwgLmZlYXR1cmUtYm94IGg0LAotLmRpYWxvZyBhLCAuZGlhbG9nIGg0IHsKLSAgICAtd2Via2l0LXRyYW5zaXRpb246IGNvbG9yIC40cyBlYXNlOwotICAgIC1tb3otdHJhbnNpdGlvbjogY29sb3IgLjRzIGVhc2U7Ci0gICAgLW8tdHJhbnNpdGlvbjogY29sb3IgLjRzIGVhc2U7Ci0gICAgdHJhbnNpdGlvbjogY29sb3IgLjRzIGVhc2U7Ci19Ci0uZmVhdHVyZS1ib3g6aG92ZXIgewotICBjdXJzb3I6IHBvaW50ZXI7ICAKLX0KLS5mZWF0dXJlLWJveDpob3ZlciAuYm94LWJvcmRlciAudG9wLCAuZmVhdHVyZS1ib3g6aG92ZXIgLmJveC1ib3JkZXIgLmJvdHRvbSwgLmZlYXR1cmUtYm94OmhvdmVyCi0ubGVmdCwgLmZlYXR1cmUtYm94OmhvdmVyIC5yaWdodCB7ICAKLSAgYmFja2dyb3VuZC1jb2xvcjogIzMzQjVFNTsKLX0KLS5mZWF0dXJlLWJveDpob3ZlciBoNCwgLmZlYXR1cmUtYm94OmhvdmVyIGEgewotICBjb2xvcjogIzMzQjVFNTsKLX0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QYWdlLVNwZWNpZmljIFN0eWxlcwotKi8KLS5jb2xvcnMgeyAKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotICBmbG9hdDogbGVmdDsKLSAgd2lkdGg6IDkycHg7Ci0gIG1hcmdpbjogNDBweCAwIDIwcHg7Ci19Ci0uY29sb3JzIGRpdiB7Ci0gIGNvbG9yOiAjZmZmOwotICBmb250LXNpemU6IDExLjVweDsKLSAgd2lkdGg6IDgycHg7Ci0gIGhlaWdodDogODJweDsKLSAgbWFyZ2luLXRvcDotMzBweDsKLSAgbGluZS1oZWlnaHQ6IDgycHg7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgYm9yZGVyOiBzb2xpZCA1cHggI2ZmZjsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1MCU7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogNTAlOwotICBib3JkZXItcmFkaXVzOiA1MCU7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyogIyMjIyMjIyMjIyMgUkVGRVJFTkNFIERPQ1MgIyMjIyMjIyMjIyMjIyMjIyMjICovCi0KLSNwYWNrYWdlcy1uYXYgaDIsCi0jY2xhc3Nlcy1uYXYgaDIgewotICBmb250LXNpemU6MThweDsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MCAwIDAgNHB4OwotfQotCi0jamQtaGVhZGVyIHsKLSAgcGFkZGluZzogMCAwIDVweDsKLSAgbWFyZ2luOiAyMHB4IDAgMTBweDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGJvcmRlci1ib3R0b206c29saWQgMXB4ICNjY2M7Ci19Ci0KLSNqZC1oZWFkZXIgaDEgewotICBtYXJnaW46MDsKLSAgcGFkZGluZzowOwotfQotCi0vKiBwYWdlLXRvcC1yaWdodCBjb250YWluZXIgZm9yIHJlZmVyZW5jZSBwYWdlcyAoaG9sZHMKLWxpbmtzIHRvIHN1bW1hcnkgdGFibGVzKSAqLwotI2FwaS1pbmZvLWJsb2NrIHsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIG1hcmdpbjoyMHB4IDAgMDsKLSAgcGFkZGluZzowIDEwcHggNnB4OwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGZsb2F0OnJpZ2h0OwotICB0ZXh0LWFsaWduOnJpZ2h0OwotICBjb2xvcjojOTk5OwotICBtYXgtd2lkdGg6NzAlOwotfQotCi0jYXBpLWluZm8tYmxvY2sgZGl2LmFwaS1sZXZlbCB7Ci0gIGZvbnQtd2VpZ2h0OmJvbGQ7Ci0gIGZvbnQtc2l6ZTppbmhlcml0OwotICBmbG9hdDpub25lOwotICBjb2xvcjojMjIyOwotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjowOwotfQotCi0vKiBpbmhlcml0YW5jZSB0YWJsZSAqLwotLmpkLWluaGVyaXRhbmNlLXRhYmxlIHsKLSAgYm9yZGVyLXNwYWNpbmc6MDsKLSAgbWFyZ2luOjA7Ci0gIHBhZGRpbmc6MDsKLSAgZm9udC1zaXplOjEzcHg7Ci0gIGJhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ci19Ci0uamQtaW5oZXJpdGFuY2UtdGFibGUgdHIgdGQgewotICBib3JkZXI6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMDsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLX0KLS5qZC1pbmhlcml0YW5jZS10YWJsZSAuamQtaW5oZXJpdGFuY2Utc3BhY2UgewotICBmb250LXdlaWdodDpib2xkOwotICB3aWR0aDoxZW07Ci19Ci0uamQtaW5oZXJpdGFuY2UtdGFibGUgLmpkLWluaGVyaXRhbmNlLWludGVyZmFjZS1jZWxsIHsKLSAgcGFkZGluZy1sZWZ0OiAxN3B4OwotfQotCi0KLQotLmpkLXN1bXRhYmxlIGEgewotICB0ZXh0LWRlY29yYXRpb246bm9uZTsKLX0KLQotLmpkLXN1bXRhYmxlIGE6aG92ZXIgewotICB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotfQotCi0vKiB0aGUgbGluayBpbnNpZGUgYSBzdW10YWJsZSBmb3IgIlNob3cgQWxsL0hpZGUgQWxsIiAqLwotLnRvZ2dsZS1hbGwgewotICBkaXNwbGF5OmJsb2NrOwotICBmbG9hdDpyaWdodDsKLSAgZm9udC13ZWlnaHQ6bm9ybWFsOwotICBmb250LXNpemU6MC45ZW07Ci19Ci0KLS8qIGFkanVzdG1lbnRzIGZvciBpbi9kaXJlY3Qgc3ViY2xhc3NlcyB0YWJsZXMgKi8KLS5qZC1zdW10YWJsZS5qZC1zdW10YWJsZS1zdWJjbGFzc2VzIHsKLSAgbWFyZ2luOiAxZW0gMCAwIDA7Ci0gIG1heC13aWR0aDo5NjhweDsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLSAgZm9udC1zaXplOjEzcHg7Ci19Ci0KLS8qIGV4dHJhIHNwYWNlIGJldHdlZW4gZW5kIG9mIG1ldGhvZCBuYW1lIGFuZCBvcGVuLXBhcmVuICovCi0uc3ltcGFkIHsKLSAgbWFyZ2luLXJpZ2h0OiAycHg7Ci19Ci0KLS8qIHJpZ2h0IGFsaWdubWVudCBmb3IgdGhlIHJldHVybiB0eXBlIGluIHN1bXRhYmxlICovCi0uamQtc3VtdGFibGUgLmpkLXR5cGVjb2wgewotICB0ZXh0LWFsaWduOnJpZ2h0OwotfQotCi0vKiBhZGp1c3RtZW50cyBmb3IgdGhlIGV4cGFuZG8gdGFibGUtaW4tdGFibGUgKi8KLS5qZC1zdW10YWJsZS1leHBhbmRvIHsKLSAgbWFyZ2luOi41ZW0gMDsKLSAgcGFkZGluZzowOwotfQotCi0vKiBhIGRpdiB0aGF0IGhvbGRzIGEgc2hvcnQgZGVzY3JpcHRpb24gKi8KLS5qZC1kZXNjcmRpdiB7Ci0gIHBhZGRpbmc6M3B4IDFlbSAwIDFlbTsKLSAgbWFyZ2luOjA7Ci0gIGJvcmRlcjowOwotfQotCi0jamQtY29udGVudCBpbWcuamQtZXhwYW5kby10cmlnZ2VyLWltZyB7Ci0gIHBhZGRpbmc6MCA0cHggNHB4IDA7Ci0gIG1hcmdpbjowOwotfQotCi0uamQtc3VtdGFibGUtc3ViY2xhc3NlcyBkaXYjc3ViY2xhc3Nlcy1kaXJlY3QsCi0uamQtc3VtdGFibGUtc3ViY2xhc3NlcyBkaXYjc3ViY2xhc3Nlcy1pbmRpcmVjdCB7Ci0gIG1hcmdpbjowIDAgMCAxM3B4OwotfQotCi0KLQotLyoqKioqKioqKiBNRU1CRVIgUkVGICoqKioqKioqKioqKiovCi0KLQotLmpkLWRldGFpbHMgewotLyogIGJvcmRlcjoxcHggc29saWQgIzY2OTk5OTsKLSAgcGFkZGluZzo0cHg7ICovCi0gIG1hcmdpbjowIDAgMWVtOwotfQotCi0vKiBBUEkgcmVmZXJlbmNlOiBhIGNvbnRhaW5lciBmb3IgdGhlCi0udGFnZGF0YSBibG9ja3MgdGhhdCBtYWtlIHVwIHRoZSBkZXRhaWxlZAotZGVzY3JpcHRpb24gKi8KLS5qZC1kZXRhaWxzLWRlc2NyIHsKLSAgcGFkZGluZzowOwotICBtYXJnaW46LjVlbSAuMjVlbTsKLX0KLQotLyogQVBJIHJlZmVyZW5jZTogYSBibG9jayBjb250YWluaW5nCi1hIGRldGFpbGVkIGRlc2NyaXB0aW9uLCBhIHBhcmFtcyB0YWJsZSwKLXNlZWFsc28gbGlzdCwgZXRjICovCi0uamQtdGFnZGF0YSB7Ci0gIG1hcmdpbjouNWVtIDFlbTsKLX0KLQotLmpkLXRhZ2RhdGEgcCB7Ci0gIG1hcmdpbjowIDAgMWVtIDFlbTsKLX0KLQotLyogQVBJIHJlZmVyZW5jZTogYWRqdXN0bWVudHMgdG8KLXRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBibG9jayAqLwotLmpkLXRhZ2Rlc2NyIHsKLSAgbWFyZ2luOi4yNWVtIDAgLjc1ZW0gMDsKLX0KLQotLmpkLXRhZ2Rlc2NyIG9sLAotLmpkLXRhZ2Rlc2NyIHVsIHsKLSAgbWFyZ2luOjAgMi41ZW07Ci0gIHBhZGRpbmc6MDsKLX0KLQotLmpkLXRhZ2Rlc2NyIHRhYmxlLAotLmpkLXRhZ2Rlc2NyIGltZyB7Ci0gIG1hcmdpbjouMjVlbSAxZW07Ci19Ci0KLS5qZC10YWdkZXNjciBsaSB7Ci1tYXJnaW46MCAwIC4yNWVtIDA7Ci1wYWRkaW5nOjA7Ci19Ci0KLS8qIEFQSSByZWZlcmVuY2U6IGhlYWRpbmcgbWFya2luZwotdGhlIGRldGFpbHMgc2VjdGlvbiBmb3IgY29uc3RhbnRzLAotYXR0cnMsIG1ldGhvZHMsIGV0Yy4gKi8KLWg0LmpkLWRldGFpbHMtdGl0bGUgewotICBmb250LXNpemU6MS4xNWVtOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTJFMkUyOwotICBtYXJnaW46MS41ZW0gMCAuNmVtOwotICBwYWRkaW5nOjNweCA5NXB4IDNweCAzcHg7IC8qIHJvb20gZm9yIGFwaS1sZXZlbCAqLwotfQotYm9keS5nb29nbGUgaDQuamQtZGV0YWlscy10aXRsZSB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGRkY7Ci0gIHBhZGRpbmctdG9wOjVweDsKLSAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7Ci19Ci1ib2R5Lmdvb2dsZSB0YWJsZS5qZC1zdW10YWJsZSB0aCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGRkY7Ci0gIGNvbG9yOiMwMDA7Ci19Ci0KLWg0LmpkLXRhZ3RpdGxlIHsKLSAgbWFyZ2luOjA7Ci19Ci0KLWg0IC5ub3JtYWwgewotICBmb250LXdlaWdodDpub3JtYWw7Ci19Ci0KLS8qIEFQSSByZWZlcmVuY2U6IGhlYWRpbmcgZm9yICJQYXJhbWV0ZXJzIiwgIlNlZSBBbHNvIiwgZXRjLiwKLWluIGRldGFpbHMgc2VjdGlvbnMgKi8KLWg1LmpkLXRhZ3RpdGxlIHsKLSAgbWFyZ2luOjAgMCAuMjVlbSAwOwotICBmb250LXNpemU6MWVtOwotfQotCi0uamQtdGFndGFibGUgewotICBtYXJnaW46MDsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLSAgd2lkdGg6YXV0bzsKLX0KLQotLmpkLXRhZ3RhYmxlIHRkLAotLmpkLXRhZ3RhYmxlIHRoIHsKLSAgYm9yZGVyOm5vbmU7Ci0gIGJhY2tncm91bmQtY29sb3I6I2ZmZjsKLSAgdmVydGljYWwtYWxpZ246dG9wOwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIHBhZGRpbmc6MnB4IDEwcHg7Ci19Ci0KLS5qZC10YWd0YWJsZSB0aCB7Ci0gIGZvbnQtc3R5bGU6aXRhbGljOwotfQotCi0vKiBJbmxpbmUgYXBpIGxldmVsIGluZGljYXRvciBmb3IgbWV0aG9kcyAqLwotZGl2LmFwaS1sZXZlbCB7Ci0gIGZvbnQtc2l6ZTouOGVtOwotICBmb250LXdlaWdodDpub3JtYWw7Ci0gIGNvbG9yOiM5OTk7Ci0gIGZsb2F0OnJpZ2h0OwotICBwYWRkaW5nOjAgOHB4IDA7Ci0gIG1hcmdpbi10b3A6LTMwcHg7Ci19Ci0KLXRhYmxlLmpkLXRhZ3RhYmxlIHRkLAotdGFibGUuamQtdGFndGFibGUgdGggewotICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OwotfQotCi10YWJsZS5qZC10YWd0YWJsZSB0aCB7Ci0gIGNvbG9yOmluaGVyaXQ7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyogU0VBUkNIIEZJTFRFUiAqLwotCi0jc2VhcmNoX2F1dG9jb21wbGV0ZSB7Ci0gIGZvbnQtd2VpZ2h0Om5vcm1hbDsKLX0KLQotI3NlYXJjaF9maWx0ZXJlZF93cmFwcGVyIHsKLSAgd2lkdGg6IDE5M3B4OwotICBmbG9hdDogcmlnaHQ7Ci19Ci0jc2VhcmNoX2ZpbHRlcmVkX2RpdiB7Ci0gIHBvc2l0aW9uOmFic29sdXRlOwotICB6LWluZGV4Ojk5OTk7Ci0gIG1pbi13aWR0aDoxNzFweDsgLyogK3BhZGRpbmcgYW5kIGJvcmRlciBtYWtlcyB0aGlzIG1hdGNoIGlucHV0IHdpZHRoICovCi0gIHBhZGRpbmc6NXB4OwotICBib3JkZXI6IHNvbGlkIDFweCAjQzVDNUM1OwotICBiYWNrZ3JvdW5kOiB3aGl0ZTsKLSAgdG9wOiAzNXB4OwotICAtbW96LWJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwwLDAsMC4yKTsKLSAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7Ci0gIGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKLX0KLQotdWwjc2VhcmNoX2ZpbHRlcmVkIHsKLSAgbWluLXdpZHRoOjEwMCU7Ci0gIG1hcmdpbjowOwotICBsaXN0LXN0eWxlOiBub25lOwotICBtYXJnaW46IDA7Ci0gIHBhZGRpbmc6IDA7Ci19Ci0KLSNzZWFyY2hfZmlsdGVyZWQgLmpkLXNlbGVjdGVkIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzMzQjVFNTsKLSAgY3Vyc29yOnBvaW50ZXI7Ci19Ci0jc2VhcmNoX2ZpbHRlcmVkIC5qZC1zZWxlY3RlZCwKLSNzZWFyY2hfZmlsdGVyZWQgLmpkLXNlbGVjdGVkIGEgewotICBjb2xvcjojZjdmN2Y3ICFpbXBvcnRhbnQ7Ci19Ci0KLS5uby1kaXNwbGF5IHsKLSAgZGlzcGxheTogbm9uZTsKLX0KLQotI3NlYXJjaF9maWx0ZXJlZCBsaS5qZC1hdXRvY29tcGxldGUgewotICBmb250LXNpemU6IDAuODFlbTsKLSAgYm9yZGVyOiBub25lOwotICBtYXJnaW46IDAgMCAycHg7Ci0gIHBhZGRpbmc6IDA7Ci0gIGxpbmUtaGVpZ2h0OjEuNWVtOwotfQotCi0jc2VhcmNoX2ZpbHRlcmVkIGxpIGEgewotICBwYWRkaW5nOjAgNXB4OwotICBjb2xvcjojMjIyICFpbXBvcnRhbnQ7Ci19Ci0KLSNzZWFyY2hfZmlsdGVyZWQgbGkuaGVhZGVyIHsKLSAgY29sb3I6I2FhYTsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLSAgZm9udC1zaXplOiAwLjgxZW07Ci0gIGJvcmRlcjogbm9uZTsKLSAgbWFyZ2luOiA4cHggMCAycHg7Ci0gIHBhZGRpbmc6MXB4IDVweDsKLSAgbGluZS1oZWlnaHQ6MS41ZW07Ci19Ci0KLSNzZWFyY2hfZmlsdGVyZWQgbGkuaGVhZGVyOmZpcnN0LWNoaWxkIHsKLSAgbWFyZ2luOiAwIDAgMnB4OwotfQotCi0uc2hvdy1pdGVtIHsKLSAgZGlzcGxheTogdGFibGUtcm93OwotfQotLmhpZGUtaXRlbSB7Ci0gIGRpc3BsYXk6IGhpZGRlbjsKLX0KLQotCi0KLQotCi0vKiBTRUFSQ0ggUkVTVUxUUyAqLwotCi0KLSNsZWZ0U2VhcmNoQ29udHJvbCAuZ3NjLXR3aWRkbGUgewotICBiYWNrZ3JvdW5kLWltYWdlIDogbm9uZTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIHRkLCAjc2VhcmNoRm9ybSB0ZCB7Ci0gIGJvcmRlcjogMHB4IHNvbGlkICMwMDA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIC5nc2MtcmVzdWx0c0hlYWRlciAuZ3NjLXRpdGxlIHsKLSAgcGFkZGluZy1sZWZ0IDogMHB4OwotICBmb250LXdlaWdodCA6IGJvbGQ7Ci0gIGZvbnQtc2l6ZSA6IDEzcHg7Ci0gIGNvbG9yOiMwMDY2OTk7Ci0gIGRpc3BsYXkgOiBub25lOwotfQotCi0jbGVmdFNlYXJjaENvbnRyb2wgLmdzYy1yZXN1bHRzSGVhZGVyIGRpdi5nc2MtcmVzdWx0cy1zZWxlY3RvciB7Ci0gIGRpc3BsYXkgOiBub25lOwotfQotCi0jbGVmdFNlYXJjaENvbnRyb2wgLmdzYy1yZXN1bHRzUm9vdCB7Ci0gIHBhZGRpbmctdG9wIDogNnB4OwotfQotCi0jbGVmdFNlYXJjaENvbnRyb2wgZGl2LmdzLXZpc2libGVVcmwtbG9uZyB7Ci0gIGRpc3BsYXkgOiBibG9jazsKLSAgY29sb3I6IzAwNjY5OTsKLX0KLQotI2xlZnRTZWFyY2hDb250cm9sIC5nc2Mtd2ViUmVzdWx0IHsKLSAgcGFkZGluZzowIDAgMjBweCAwOwotfQotCi0uZ3NjLXdlYlJlc3VsdCBkaXYuZ3MtdmlzaWJsZVVybC1zaG9ydCwKLXRhYmxlLmdzYy1icmFuZGluZywKLS5nc2MtY2xlYXItYnV0dG9uIHsKLSAgZGlzcGxheSA6IG5vbmU7Ci19Ci0KLS5nc2MtY3Vyc29yLWJveCAuZ3NjLWN1cnNvciBkaXYuZ3NjLWN1cnNvci1wYWdlLAotLmdzYy1jdXJzb3ItYm94IC5nc2MtdHJhaWxpbmctbW9yZS1yZXN1bHRzIGEuZ3NjLXRyYWlsaW5nLW1vcmUtcmVzdWx0cywKLSNsZWZ0U2VhcmNoQ29udHJvbCBhLAotI2xlZnRTZWFyY2hDb250cm9sIGEgYiB7Ci0gIGNvbG9yOiMwMDY2OTk7Ci19Ci0KLS5nc2MtcmVzdWx0c0hlYWRlciB7Ci0gIGRpc3BsYXk6IG5vbmU7Ci19Ci0KLS8qIERpc2FibGUgYnVpbHQgaW4gc2VhcmNoIGZvcm1zICovCi0uZ3NjLWNvbnRyb2wgZm9ybS5nc2Mtc2VhcmNoLWJveCB7Ci0gIGRpc3BsYXkgOiBub25lOwotfQotdGFibGUuZ3NjLXNlYXJjaC1ib3ggewotICBtYXJnaW46NnB4IDAgMCAwOwotICBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ci19Ci0KLXRkLmdzYy1pbnB1dCB7Ci0gIHBhZGRpbmc6MCAycHg7Ci0gIHdpZHRoOjEwMCU7Ci0gIHZlcnRpY2FsLWFsaWduOm1pZGRsZTsKLX0KLQotaW5wdXQuZ3NjLWlucHV0IHsKLSAgYm9yZGVyOjFweCBzb2xpZCAjQkNDREYwOwotICB3aWR0aDo5OSU7Ci0gIHBhZGRpbmctbGVmdDoycHg7Ci0gIGZvbnQtc2l6ZTouOTVlbTsKLX0KLQotdGQuZ3NjLXNlYXJjaC1idXR0b24gewotICB0ZXh0LWFsaWduOiByaWdodDsKLSAgcGFkZGluZzowOwotICB2ZXJ0aWNhbC1hbGlnbjp0b3A7Ci19Ci0KLQotI3NlYXJjaFJlc3VsdHMgewotICBvdmVyZmxvdzpoaWRkZW47IC8qIGJlY2F1c2UgdGhlIHJlcG9zaXRpb25lZCBwYWdlIGxpbmtzIG1ha2VzIHRoZSBzZWN0aW9uIHRoaW5rIGl0IG5lZWRzIHRvIHNjcm9sbAotKGl0IGRvZXNuJ3QpICovCi0gIGhlaWdodDphdXRvOwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWNvbnRyb2wgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgd2lkdGg6YXV0bzsKLSAgcGFkZGluZzowIDAgMTBweDsKLX0KLQotI3NlYXJjaFJlc3VsdHMgLmdzYy10YWJzQXJlYSB7Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotICB3aGl0ZS1zcGFjZTpub3dyYXA7Ci0gIGZsb2F0OmxlZnQ7Ci0gIHdpZHRoOjIwMHB4OwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWFib3ZlLXdyYXBwZXItYXJlYSB7Ci0gIGRpc3BsYXk6bm9uZTsKLX0KLQotI3NlYXJjaFJlc3VsdHMgLmdzYy1yZXN1bHRzYm94LXZpc2libGUgewotICBmbG9hdDpsZWZ0OwotICB3aWR0aDo3MjBweDsKLSAgbWFyZ2luLWxlZnQ6MjBweDsKLX0KLQotI3NlYXJjaFJlc3VsdHMgLmdzYy10YWJIZWFkZXIgewotICBwYWRkaW5nOiAzcHggNnB4OwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLSAgd2lkdGg6YXV0bzsKLSAgZGlzcGxheTpibG9jazsKLX0KLQotI3NlYXJjaFJlc3VsdHMgaDIjc2VhcmNoVGl0bGUgewotICBwYWRkaW5nOjA7Ci0gIG1hcmdpbjo1cHggMDsKLSAgYm9yZGVyOm5vbmU7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzIGgyI3NlYXJjaFRpdGxlIGVtIHsKLSAgZm9udC1zdHlsZTpub3JtYWw7Ci0gIGNvbG9yOiMzM0I1RTU7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFibGUtcmVzdWx0IHsKLSAgbWFyZ2luOjVweCAwIDEwcHggMDsKLSAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKLX0KLSNzZWFyY2hSZXN1bHRzIC5ncy13ZWItaW1hZ2UtYm94LCAuZ3MtcHJvbW90aW9uLWltYWdlLWJveCB7Ci0gIHdpZHRoOjEyMHB4OwotfQotI3NlYXJjaFJlc3VsdHMgLmdzLXdlYi1pbWFnZS1ib3ggaW1nLmdzLWltYWdlLCAuZ3MtcHJvbW90aW9uLWltYWdlLWJveCBpbWcuZ3MtcHJvbW90aW9uLWltYWdlIHsKLSAgbWF4LXdpZHRoOjEyMHB4OwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLXRhYmxlLXJlc3VsdCAuZ3NjLXRodW1ibmFpbCB7Ci0gIHBhZGRpbmc6MCAyMHB4IDAgMDsKLX0KLQotI3NlYXJjaFJlc3VsdHMgdGQgewotICBiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50OwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWV4cGFuc2lvbkFyZWEgewotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFic0FyZWEgLmdzYy1jdXJzb3ItYm94IHsKLSAgd2lkdGg6MjAwcHg7Ci0gIHBhZGRpbmc6MjBweCAwIDAgMXB4OwotfQotI3NlYXJjaFJlc3VsdHMgLmdzYy1jdXJzb3ItcGFnZSB7Ci0gIGRpc3BsYXk6aW5saW5lLWJsb2NrOwotICBmbG9hdDpsZWZ0OwotICBtYXJnaW46LTFweCAwIDAgLTFweDsKLSAgcGFkZGluZzowOwotICBoZWlnaHQ6MjdweDsKLSAgd2lkdGg6MjdweDsKLSAgdGV4dC1hbGlnbjpjZW50ZXI7Ci0gIGxpbmUtaGVpZ2h0OjI7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFiSGVhZGVyLmdzYy10YWJoSW5hY3RpdmUsCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWN1cnNvci1wYWdlIHsKLSAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7Ci0gIGNvbG9yOiMyNThBQUY7Ci0gIGJvcmRlcjogc29saWQgMXB4ICNEQURBREE7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFiSGVhZGVyLmdzYy10YWJoSW5hY3RpdmU6aG92ZXIsCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLWN1cnNvci1wYWdlOmhvdmVyIHsKLSAgYm9yZGVyLWNvbG9yOiAjREJEQkRCOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGM0YzOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNGOUY5RjkpLCB0bygjRUNFQ0VDKSk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgI0Y5RjlGOSwgI0VDRUNFQyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI0Y5RjlGOSwgI0VDRUNFQyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjRjlGOUY5LCAjRUNFQ0VDKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgI0Y5RjlGOSwgI0VDRUNFQyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICNGOUY5RjksICNFQ0VDRUMpOwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjZjlmOWY5JywKLUVuZENvbG9yU3RyPScjZWNlY2VjJyk7Ci0gIGNvbG9yOiAjMzNCNUU1OwotfQotCi0jc2VhcmNoUmVzdWx0cyAuZ3NjLXRhYkhlYWRlci5nc2MtdGFiaEFjdGl2ZSwKLSNzZWFyY2hSZXN1bHRzIC5nc2MtdGFiSGVhZGVyLmdzYy10YWJoQWN0aXZlOmhvdmVyLAotI3NlYXJjaFJlc3VsdHMgLmdzYy1jdXJzb3ItcGFnZS5nc2MtY3Vyc29yLWN1cnJlbnQtcGFnZSwKLSNzZWFyY2hSZXN1bHRzIC5nc2MtY3Vyc29yLXBhZ2UuZ3NjLWN1cnNvci1jdXJyZW50LXBhZ2U6aG92ZXIgewotICBjb2xvcjojZmZmOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDlDOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCMyRkFEREIpLCB0bygjMDlDKSk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzJGQUREQiwgIzA5Qyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgIzJGQUREQiwgIzA5Qyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjMkZBRERCLCAjMDlDKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgIzJGQUREQiwgIzA5Qyk7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICMyRkFEREIsICMwOUMpOwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjMmZhZGRiJywgRW5kQ29sb3JTdHI9JyMwOWMnKTsKLSAgYm9yZGVyOiAxcHggc29saWQgIzM5OTBBQjsKLSAgei1pbmRleDoxMDA7Ci19Ci0KLX0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyoqKioqKioqKioqIFBSRVZJT1VTTFkgZGFjLXN0eWxlcy5jc3MgKioqKioqKioqKioqKioqLwotCi0KLSNoZWFkZXIgewotICBib3JkZXItYm90dG9tOjA7Ci19Ci0KLSNoZWFkZXIgLndyYXAgewotICBtYXgtd2lkdGg6OTQwcHg7Ci0gIGhlaWdodDo0MXB4OwotICBib3JkZXItYm90dG9tOjFweCBzb2xpZDsKLSAgYm9yZGVyLWNvbG9yOiAjY2NjOwotICBwb3NpdGlvbjpyZWxhdGl2ZTsKLX0KLQotLmFib3V0ICNoZWFkZXIgLndyYXAgewotICBib3JkZXItY29sb3I6ICM5OTMzQ0M7Ci19Ci0KLS5kZXNpZ24gI2hlYWRlciAud3JhcCB7Ci0gIGJvcmRlci1jb2xvcjogIzMzYjVlNTsKLX0KLQotLy8gRnVkZ2luZyB0aGlzIHNvIFNBQyBsb29rcyBPSwotLmRldmVsb3AgI2hlYWRlciAud3JhcCB7Ci0gIGJvcmRlci1jb2xvcjogI0NDQzsKLX0KLQotLmRpc3RyaWJ1dGUgI2hlYWRlciAud3JhcCB7Ci0gIGJvcmRlci1jb2xvcjogIzlDMDsKLX0KLQotLmxvZ28gYSB7Ci0gIHdpZHRoOjEyM3B4OwotICBmbG9hdDpsZWZ0OwotfQotCi0jaGVhZGVyIC5sb2dvIHsKLSAgbWFyZ2luLXRvcDogLTZweDsKLSAgbWFyZ2luLWxlZnQ6IDBweDsKLSAgbWFyZ2luLWJvdHRvbTowcHg7Ci0gIHdpZHRoOiAxNjBweDsKLSAgcGFkZGluZy1yaWdodDoxMHB4OwotfQotCi0jaGVhZGVyIC5zYWNsb2dvIHsKLSAgbWFyZ2luLXRvcDogLTNweDsKLSAgbWFyZ2luLWxlZnQ6IDBweDsKLSAgbWFyZ2luLWJvdHRvbTogMHB4OwotICBtYXJnaW4tcmlnaHQ6IDMwcHg7Ci0gIHdpZHRoOiAxNDBweDsKLSAgcGFkZGluZy1yaWdodDowcHg7Ci0gIGJvcmRlci1yaWdodDoxcHggc29saWQgI0NDQzsKLX0KLQotLnNlYXJjaCB7Ci0gIGhlaWdodDoyNXB4OwotICBtYXJnaW4tdG9wOiAtM3B4OwotICBtYXJnaW4tYm90dG9tOiAwcHg7Ci19Ci0KLQotCi0vKiBRdWlja25hdiAqLwotLmJ0bi1xdWlja25hdiB7Ci0gIHdpZHRoOjIwcHg7Ci0gIGhlaWdodDoyOHB4OwotICBmbG9hdDpsZWZ0OwotICBtYXJnaW4tbGVmdDo2cHg7Ci0gIHBhZGRpbmctcmlnaHQ6MTBweDsKLSAgcG9zaXRpb246cmVsYXRpdmU7Ci0gIGN1cnNvcjpwb2ludGVyOwotICBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNDQ0M7Ci19Ci0KLS5idG4tcXVpY2tuYXYgYSB7Ci0gIHpvb206MTsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHRvcDoxM3B4OwotICBsZWZ0OjVweDsKLSAgZGlzcGxheTpibG9jazsKLSAgdGV4dC1pbmRlbnQ6LTk5OTllbTsKLSAgd2lkdGg6MTBweDsKLSAgaGVpZ2h0OjVweDsKLSAgYmFja2dyb3VuZDp1cmwoLi4vaW1hZ2VzL3F1aWNrbmF2X2Fycm93LnBuZykgbm8tcmVwZWF0OwotfQotCi0uYnRuLXF1aWNrbmF2IGEuYXJyb3ctYWN0aXZlIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNXB4OwotICBkaXNwbGF5Om5vbmU7Ci19Ci0KLSNoZWFkZXItd3JhcC5xdWlja25hdiBhLmFycm93LWluYWN0aXZlIHsKLSAgZGlzcGxheTpub25lOwotfQotCi0uYnRuLXF1aWNrbmF2LmFjdGl2ZSBhLmFycm93LWFjdGl2ZSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci19Ci0KLS5uYXYteCBsaSB7Ci0gIGRpc3BsYXk6YmxvY2s7Ci0gIGZsb2F0OmxlZnQ7Ci0gIG1hcmdpbi1yaWdodDo0NXB4OwotICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci0gICAgICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci0gICAgICAgLW1zLXRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci0gICAgICAgIC1vLXRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci0gICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjI1cyBsaW5lYXI7Ci19Ci0KLSNoZWFkZXItd3JhcC5xdWlja25hdiAubmF2LXggbGkgewotICBtaW4td2lkdGg6MTYwcHg7Ci0gIG1hcmdpbi1yaWdodDoyMHB4OwotfQotCi0jaGVhZGVyLXdyYXAucXVpY2tuYXYgbGkubGFzdCB7Ci0gIG1hcmdpbi1yaWdodDowcHg7Ci19Ci0KLSNxdWlja25hdiB7Ci0gZmxvYXQ6bm9uZTsgCi0gY2xlYXI6Ym90aDsKLSBtYXJnaW4tbGVmdDoxODBweDsKLSBtYXJnaW4tdG9wOi0zMHB4OwotIGRpc3BsYXk6bm9uZTsKLSBvdmVyZmxvdzpoaWRkZW47Ci19Ci0KLSNoZWFkZXItd3JhcC5xdWlja25hdiAjcXVpY2tuYXYgewotCi19Ci0KLSNxdWlja25hdiB1bCB7Ci0gIG1hcmdpbjoxMHB4IDA7Ci0gIHBhZGRpbmc6MDsKLX0KLQotI3F1aWNrbmF2IHVsIGxpLmRlc2lnbiB7Ci0gIGJvcmRlci10b3A6MXB4IHNvbGlkICMzM2I1ZTU7Ci19Ci0KLSNxdWlja25hdiB1bCBsaS5kZXZlbG9wIHsKLSAgYm9yZGVyLXRvcDoxcHggc29saWQgI0ZGODgwMDsKLX0KLQotI3F1aWNrbmF2IHVsIGxpLmRpc3RyaWJ1dGUgewotICBib3JkZXItdG9wOjFweCBzb2xpZCAjOTljYzAwOwotfQotCi0jcXVpY2tuYXYgdWwgbGkgewotICBkaXNwbGF5OmJsb2NrOwotICBmbG9hdDpsZWZ0OwotICBtYXJnaW46MCAyMHB4IDAgMDsKLSAgbWluLXdpZHRoOjE0MHB4OwotfQotCi0jcXVpY2tuYXYgdWwgbGkubGFzdCB7Ci0gIG1hcmdpbi1yaWdodDowcHg7Ci19Ci0KLSNxdWlja25hdiB1bCBsaSB1bCBsaSB7Ci0gIGZsb2F0Om5vbmU7Ci19Ci0KLSNxdWlja25hdiB1bCBsaSB1bCBsaSBhIHsKLSAgY29sb3I6IzIyMjsKLX0KLQotI3F1aWNrbmF2IHVsIGxpIGxpIHVsLAotI3F1aWNrbmF2IHVsIGxpIGxpIHVsIGxpIHsKLSAgbWFyZ2luOjA7Ci19Ci0KLSNxdWlja25hdiB1bCBsaSBsaSB1bCBsaTpiZWZvcmUgewotICBjb250ZW50OiJcMjFCMyI7Ci19Ci0KLSNoZWFkZXItd3JhcCB7Ci0gICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLW91dDsKLSAgICAgIC1tb3otdHJhbnNpdGlvbjogYWxsIDAuMjVzIGVhc2Utb3V0OwotICAgICAgIC1tcy10cmFuc2l0aW9uOiBhbGwgMC4yNXMgZWFzZS1vdXQ7Ci0gICAgICAgIC1vLXRyYW5zaXRpb246IGFsbCAwLjI1cyBlYXNlLW91dDsKLSAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMjVzIGVhc2Utb3V0OwotCi19Ci0KLSNoZWFkZXItd3JhcC5xdWlja25hdiB7Ci0gIGhlaWdodDoxOTZweDsKLSAgCi19Ci0KLS8qIFNFQVJDSCBBTkQgTU9SRSAqLwotLnNlYXJjaCB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgd2lkdGg6IDUwcHg7Ci0gIGhlaWdodDoyOHB4OwotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luLXRvcDotM3B4OwotICBtYXJnaW4tYm90dG9tOjdweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICB6LWluZGV4OjEwMDsKLSAgcmlnaHQ6NTRweDsKLSAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2U7Ci0gICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMC40cyBlYXNlOwotICAgICAgIC1vLXRyYW5zaXRpb246IHdpZHRoIDAuNHMgZWFzZTsKLSAgICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2U7Ci19Ci0KLS5zZWFyY2ggI3NlYXJjaC1idG4gewotICB3aWR0aDo1MHB4OwotICBoZWlnaHQ6MjhweDsKLSAgYmFja2dyb3VuZDp1cmwoLi4vaW1hZ2VzL2ljb25fc2VhcmNoLnBuZykgbm8tcmVwZWF0OwotICBmbG9hdDpsZWZ0OwotfQotCi0uc2VhcmNoLWlubmVyIHsKLSAgd2lkdGg6MjQ1cHg7Ci19Ci0KLS5zZWFyY2g6aG92ZXIsIC5zZWFyY2guYWN0aXZlIHsKLSAgd2lkdGg6MjQ1cHg7Ci19Ci0KLS5zZWFyY2ggLmJvdHRvbSwgLnNlYXJjaCAubGVmdCwgLnNlYXJjaCAucmlnaHQgewotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNhMmEyYTIKLX0KLQotLnNlYXJjaCAuYm90dG9tIHsKLSAgd2lkdGg6IDIxNHB4OwotICBoZWlnaHQ6IDFweDsKLSAgdG9wOiAyNHB4OwotICBsZWZ0OiAwCi19Ci0KLS5zZWFyY2ggLmxlZnQsIC5zZWFyY2ggLnJpZ2h0IHsgCi0gIGhlaWdodDogNXB4OwotICB3aWR0aDogMXB4Ci19Ci0KLS5zZWFyY2ggLmxlZnQgewotICB0b3A6IDIycHg7Ci0gIGxlZnQ6IDU2cHg7Ci0gIGJhY2tncm91bmQtY29sb3I6I0NDQzsKLX0KLQotLnNlYXJjaCAucmlnaHQgewotICB0b3A6IDIycHg7Ci0gIGxlZnQ6IDIzOHB4OwotICBiYWNrZ3JvdW5kLWNvbG9yOiNDQ0M7Ci19Ci0KLS5zZWFyY2ggZm9ybSB7Ci0gIG1hcmdpbi10b3A6IDJweDsKLSAgd2lkdGg6IDE2MnB4OwotICBmbG9hdDpsZWZ0OwotfQotCi0uc2VhcmNoIGZvcm0gaW5wdXQgewotICBjb2xvcjogIzJmMmYyZjsKLSAgZm9udC1zaXplOiAwLjk1ZW07Ci0gIHdpZHRoOiAxNzhweDsgIAotICBib3JkZXI6IG5vbmU7Ci0gIG1hcmdpbi1sZWZ0OiA2cHg7ICAKLSAgei1pbmRleDogMTUwMDsgIAotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwotICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjQ0NDOwotICBwYWRkaW5nOjAgMCAwIDRweDsKLSAgb3V0bGluZTpub25lOwotICBoZWlnaHQ6MjRweDsKLX0KLQotLnNlYXJjaDpob3ZlciBmb3JtIGlucHV0IHsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzMzQjVFNTsKLX0KLQotLnNlYXJjaDpob3ZlciAuYm90dG9tLCAuc2VhcmNoOmhvdmVyIC5sZWZ0LCAuc2VhcmNoOmhvdmVyIC5yaWdodCB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci19Ci0KLS5zZWFyY2g6aG92ZXIgI3NlYXJjaC1idG4gewotICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0yOHB4Ci19Ci0KLS5zZWFyY2ggZm9ybSBpbnB1dDpmb2N1cyB7Ci0gIGNvbG9yOiAjMjIyOwotICBmb250LXdlaWdodDogYm9sZAotfQotCi0ubW9yZW1lbnUgewotICBmbG9hdDogcmlnaHQ7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgd2lkdGg6IDUwcHg7Ci0gIGhlaWdodDoyOHB4OwotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luLXRvcDotM3B4OwotICBtYXJnaW4tYm90dG9tOjdweDsKLSAgb3ZlcmZsb3c6aGlkZGVuOwotICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDAuMjVzIGVhc2U7Ci0gICAgIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMC4yNXMgZWFzZTsKLSAgICAgICAtby10cmFuc2l0aW9uOiB3aWR0aCAwLjI1cyBlYXNlOwotICAgICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMjVzIGVhc2U7Ci19Ci0KLS5tb3JlbWVudSAjbW9yZS1idG4gewotICB3aWR0aDo0MHB4OwotICBoZWlnaHQ6MjhweDsKLSAgYmFja2dyb3VuZDp1cmwoLi4vaW1hZ2VzL2ljb25fbW9yZS5wbmcpIG5vLXJlcGVhdDsKLSAgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNDQ0M7Ci0gIGZsb2F0OmxlZnQ7Ci0gIGN1cnNvcjpwb2ludGVyOwotfQotCi0ubW9yZW1lbnU6aG92ZXIgI21vcmUtYnRuIHsKLSAgYmFja2dyb3VuZC1wb3NpdGlvbjowIC0yOHB4OwotfQotCi0ubW9yZWhvdmVyIHsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHJpZ2h0OjZweDsKLSAgdG9wOi05cHg7Ci0gIHdpZHRoOjQwcHg7Ci0gIGhlaWdodDozNXB4OwotICB6LWluZGV4Ojk5OwotICBvdmVyZmxvdzpoaWRkZW47Ci0KLSAgLXdlYmtpdC1vcGFjaXR5OjA7Ci0gICAgIC1tb3otb3BhY2l0eTowOwotICAgICAgIC1vLW9wYWNpdHk6MDsKLSAgICAgICAgICBvcGFjaXR5OjA7Ci0KLSAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMCU7Ci0gICAgIC1tb3otdHJhbnNmb3JtLW9yaWdpbjoxMDAlIDAlOyAKLSAgICAgICAtby10cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMCU7Ci0gICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjoxMDAlIDAlOwotICAKLSAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LW9wYWNpdHk7Ci0gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogLjI1czsKLSAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlOwotCi0gIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC1vcGFjaXR5OwotICAtbW96LXRyYW5zaXRpb24tZHVyYXRpb246IC4yNXM7Ci0gIC1tb3otdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZTsKLQotICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LW9wYWNpdHk7Ci0gIC1vLXRyYW5zaXRpb24tZHVyYXRpb246IC4yNXM7Ci0gIC1vLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2U7Ci0gIAotICAtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC1vcGFjaXR5OwotICAtdHJhbnNpdGlvbi1kdXJhdGlvbjogLjI1czsKLSAgLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2U7Ci19Ci0KLS5tb3JlaG92ZXI6aG92ZXIsCi0ubW9yZWhvdmVyLmhvdmVyIHsKLSAgb3BhY2l0eToxOwotICBoZWlnaHQ6Mzg1cHg7Ci0gIHdpZHRoOjI2OHB4OwotICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6aGVpZ2h0LCAgLXdlYmtpdC1vcGFjaXR5OwotfQotCi0ubW9yZWhvdmVyIC50b3AgewotICB3aWR0aDoyNjhweDsKLSAgaGVpZ2h0OjM5cHg7Ci0gIGJhY2tncm91bmQ6dXJsKC4uL2ltYWdlcy9tb3JlX3RvcC5wbmcpIG5vLXJlcGVhdDsKLX0KLQotLm1vcmVob3ZlciAubWlkIHsKLSAgd2lkdGg6MjI4cHg7Ci0gIGJhY2tncm91bmQ6dXJsKC4uL2ltYWdlcy9tb3JlX21pZC5wbmcpIHJlcGVhdC15OwotICBwYWRkaW5nOjEwcHggMjBweCAwIDIwcHg7Ci19Ci0KLS5tb3JlaG92ZXIgLm1pZCAuaGVhZGVyIHsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2NjYzsKLSAgZm9udC13ZWlnaHQ6Ym9sZDsKLX0KLQotLm1vcmVob3ZlciAuYm90dG9tIHsKLSAgd2lkdGg6MjY4cHg7Ci0gIGhlaWdodDo2cHg7Ci0gIGJhY2tncm91bmQ6dXJsKC4uL2ltYWdlcy9tb3JlX2JvdHRvbS5wbmcpIG5vLXJlcGVhdDsKLX0KLQotLm1vcmVob3ZlciB1bCB7Ci0gIG1hcmdpbjoxMHB4IDEwcHggMjBweCAwOwotfQotCi0ubW9yZWhvdmVyIHVsIGxpIHsKLSAgbGlzdC1zdHlsZTpub25lOwotfQotCi0ubW9yZWhvdmVyIHVsIGxpLmFjdGl2ZSBhLAotLm1vcmVob3ZlciB1bCBsaS5hY3RpdmUgYTpob3ZlciB7Ci0gIGNvbG9yOiMyMjIgIWltcG9ydGFudDsKLX0KLQotLm1vcmVob3ZlciB1bCBsaS5hY3RpdmUgaW1nIHsKLSAgbWFyZ2luLXJpZ2h0OjRweDsKLX0KLQotCi0KLQotLyogTUFSUVVFRSAqLwotLnNsaWRlc2hvdy1jb250YWluZXIgewotICB3aWR0aDoxMDAlOwotICBvdmVyZmxvdzpoaWRkZW47Ci0gIHBvc2l0aW9uOnJlbGF0aXZlOwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnNsaWRlc2hvdy1wcmV2IHsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHRvcDo1MCU7Ci0gIGxlZnQ6MHB4OwotICBtYXJnaW4tdG9wOi0zNnB4OwotICB6LWluZGV4Ojk5OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnNsaWRlc2hvdy1uZXh0IHsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIHRvcDo1MCU7Ci0gIG1hcmdpbi10b3A6LTM2cHg7Ci0gIHotaW5kZXg6OTk7Ci0gIHJpZ2h0OjBweDsKLX0KLQotLnNsaWRlc2hvdy1jb250YWluZXIgLnBhZ2luYXRpb24gewotICBwb3NpdGlvbjphYnNvbHV0ZTsKLSAgYm90dG9tOjIwcHg7Ci0gIHdpZHRoOjEwMCU7Ci0gIHRleHQtYWxpZ246Y2VudGVyOwotICB6LWluZGV4Ojk5OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnBhZ2luYXRpb24gdWwgewotICBtYXJnaW46MDsKLX0KLS5zbGlkZXNob3ctY29udGFpbmVyIC5wYWdpbmF0aW9uIHVsIGxpewotICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gIHdpZHRoOjEycHg7Ci0gIGhlaWdodDoxMnB4OwotICB0ZXh0LWluZGVudDotODAwMHB4OwotICBsaXN0LXN0eWxlOm5vbmU7Ci0gIG1hcmdpbjogMCAycHg7Ci0gIGJvcmRlci1yYWRpdXM6NnB4OwotICBiYWNrZ3JvdW5kLWNvbG9yOiNjY2M7Ci0gIGN1cnNvcjpwb2ludGVyOwotICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjVzIGVhc2UtaW47ICAKLSAgICAgICAgLW1vei10cmFuc2l0aW9uOmNvbG9yIC41cyBlYXNlLWluOyAgCi0gICAgICAgIC1vLXRyYW5zaXRpb246Y29sb3IgLjVzIGVhc2UtaW47ICAKLSAgICAgICAgdHJhbnNpdGlvbjpjb2xvciAuNXMgZWFzZS1pbjsKLX0KLS5zbGlkZXNob3ctY29udGFpbmVyIC5wYWdpbmF0aW9uIHVsIGxpOmhvdmVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojOTk5OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnBhZ2luYXRpb24gdWwgbGkuYWN0aXZlIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojMzNiNWU1OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgLnBhZ2luYXRpb24gdWwgbGkuYWN0aXZlOmhvdmVyIHsKLSAgYmFja2dyb3VuZC1jb2xvcjojMzNiNWU1OwotfQotLnNsaWRlc2hvdy1jb250YWluZXIgdWwgbGkgewotICBkaXNwbGF5OmlubGluZTsKLSAgbGlzdC1zdHlsZTpub25lOwotfQotCi0KLQotCi1hLmRvd25sb2FkLXNkayB7Ci0gICAgZmxvYXQ6cmlnaHQ7Ci0gICAgbWFyZ2luOi0xMHB4IDA7Ci0gICAgaGVpZ2h0OjMwcHg7Ci0gICAgcGFkZGluZy10b3A6NHB4OwotICAgIHBhZGRpbmctYm90dG9tOjBweDsKLX0KLQotI25hdi14IHsKLSAgcGFkZGluZy10b3A6IDE0cHg7Ci19Ci0KLSNuYXYteCAud3JhcCB7Ci0gIG1pbi1oZWlnaHQ6MzRweDsKLX0KLQotI25hdi14IC53cmFwLAotI3NlYXJjaFJlc3VsdHMud3JhcCB7Ci0gICAgbWF4LXdpZHRoOjk0MHB4OwotICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNDQ0M7Ci19Ci0KLSNzZWFyY2hSZXN1bHRzLndyYXAgI2xlZnRTZWFyY2hDb250cm9sIHsKLSAgbWluLWhlaWdodDo3MDBweAotfQotLm5hdi14IHsKLSAgICBtYXJnaW4tbGVmdDowOwotICAgIG1hcmdpbi1ib3R0b206MDsKLX0KLQotCi0KLQotCi0KLQotCi0KLQotLyoKLSAqIENTUyBTdHlsZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IGpTY3JvbGxQYW5lIGZvciBpdCB0byBvcGVyYXRlIGNvcnJlY3RseS4KLSAqLwotCi0uanNwQ29udGFpbmVyIHsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotfQotCi0uanNwUGFuZSB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgd2lkdGg6MTAwJSAhaW1wb3J0YW50OyAvKiB0byBhdm9pZCBjdXQtb2ZmIGFwaSBuYW1lcyBpbiByZWZlcmVuY2UgaW4gaG9yaXogc2Nyb2xsICovCi19Ci0KLS5qc3BWZXJ0aWNhbEJhciB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgdG9wOiAwOwotICByaWdodDogMDsKLSAgd2lkdGg6IDRweDsKLSAgaGVpZ2h0OiAxMDAlOwotICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwotfQotCi0uanNwSG9yaXpvbnRhbEJhciB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgYm90dG9tOiAwOwotICBsZWZ0OiAwOwotICB3aWR0aDogMTAwJTsKLSAgaGVpZ2h0OiA0cHg7Ci0gIGJhY2tncm91bmQ6ICNmNWY1ZjU7Ci19Ci0KLS5qc3BWZXJ0aWNhbEJhciAqLAotLmpzcEhvcml6b250YWxCYXIgKiB7Ci0gIG1hcmdpbjogMDsKLSAgcGFkZGluZzogMDsKLX0KLS5qc3BDYXAgewotICBkaXNwbGF5OiBibG9jazsKLX0KLQotLmpzcFZlcnRpY2FsQmFyIC5qc3BDYXAgewotICBoZWlnaHQ6IDRweDsKLX0KLQotLmpzcEhvcml6b250YWxCYXIgLmpzcENhcCB7Ci0gIHdpZHRoOiAwOwotICBoZWlnaHQ6IDEwMCU7Ci19Ci0KLS5qc3BIb3Jpem9udGFsQmFyIC5qc3BDYXAgewotICBmbG9hdDogbGVmdDsKLX0KLQotLmpzcFRyYWNrIHsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotfQotCi0uanNwRHJhZyB7Ci0gIGJhY2tncm91bmQ6ICNiYmI7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgdG9wOiAwOwotICBsZWZ0OiAwOwotICBjdXJzb3I6IHBvaW50ZXI7Ci19Ci0KLS5qc3BEcmFnOmhvdmVyLAotLmpzcERyYWc6YWN0aXZlIHsKLSAgYm9yZGVyLWNvbG9yOiAjMDljOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGNhZGNiOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIHJpZ2h0IHRvcCwgZnJvbSgjNWRiY2Q5KSwgdG8oIzRjYWRjYikpOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCAjNWRiY2Q5LCAjNGNhZGNiKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1saW5lYXItZ3JhZGllbnQobGVmdCwgIzVkYmNkOSwgIzRjYWRjYik7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1tcy1saW5lYXItZ3JhZGllbnQobGVmdCwgIzVkYmNkOSwgIzRjYWRjYik7Ci0gIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCAjNWRiY2Q5LCAjNGNhZGNiKTsKLSAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KGxlZnQsICM1ZGJjZDksICM0Y2FkY2IpOwotICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yU3RyPScjNWRiY2Q5JywgRW5kQ29sb3JTdHI9JyM0Y2FkY2InKTsgCi19Ci0KLS5qc3BIb3Jpem9udGFsQmFyIC5qc3BUcmFjaywKLS5qc3BIb3Jpem9udGFsQmFyIC5qc3BEcmFnIHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIGhlaWdodDogMTAwJTsKLX0KLQotLmpzcEFycm93IHsKLSAgYmFja2dyb3VuZDogIzk5OTsKLSAgdGV4dC1pbmRlbnQ6IC0yMDAwMHB4OwotICBkaXNwbGF5OiBibG9jazsKLSAgY3Vyc29yOiBwb2ludGVyOwotfQotCi0uanNwQXJyb3cuanNwRGlzYWJsZWQgewotICBjdXJzb3I6IGRlZmF1bHQ7Ci0gIGJhY2tncm91bmQ6ICNjY2M7Ci19Ci0KLS5qc3BWZXJ0aWNhbEJhciAuanNwQXJyb3cgewotICBoZWlnaHQ6IDE2cHg7Ci19Ci0KLS5qc3BIb3Jpem9udGFsQmFyIC5qc3BBcnJvdyB7Ci0gIHdpZHRoOiAxNnB4OwotICBmbG9hdDogbGVmdDsKLSAgaGVpZ2h0OiAxMDAlOwotfQotCi0uanNwVmVydGljYWxCYXIgLmpzcEFycm93OmZvY3VzIHsKLSAgb3V0bGluZTogbm9uZTsKLX0KLQotLmpzcENvcm5lciB7Ci0gIGZsb2F0OiBsZWZ0OwotICBoZWlnaHQ6IDEwMCU7Ci19Ci0KLS8qIFl1ayEgQ1NTIEhhY2sgZm9yIElFNiAzIHBpeGVsIGJ1ZyA6KCAqLwotKiBodG1sIC5qc3BDb3JuZXIgewotICBtYXJnaW46IDAgLTNweCAwIDA7Ci19Ci0vKioqKioqKiBlbmQgb2YganNjcm9sbHBhbmUgKioqKioqKioqLwotCi0KLQotCi0KLS8qKioqKioqKioqKiogREVWRUxPUCBIT01FUEFHRSAqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNsaWRlc2hvdyAqLwotLnNsaWRlc2hvdy1kZXZlbG9wIHsKLSAgaGVpZ2h0OiAzMDBweDsKLSAgd2lkdGg6IDk0MHB4OwotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIG92ZXJmbG93OmhpZGRlbjsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuZnJhbWUgewotICB3aWR0aDogOTQwcHg7Ci0gIGhlaWdodDogMzAwcHg7Ci19Ci0uc2xpZGVzaG93LWRldmVsb3AgaW1nLnBsYXkgewotICBtYXgtd2lkdGg6MzUwcHg7Ci0gIG1heC1oZWlnaHQ6MjQwcHg7Ci0gIG1hcmdpbjoyMHB4IDAgMCA5MHB4OwotICAtd2Via2l0LXRyYW5zZm9ybTogcGVyc3BlY3RpdmUoODAwcHggKSByb3RhdGVZKCAzNWRlZyApOwotICBib3gtc2hhZG93OiAtMTZweCAyMHB4IDQwcHggcmdiYSgwLCAwLCAwLCAwLjMpOwotICAtbW96LWJveC1zaGFkb3c6IC0xNnB4IDIwcHggNDBweCByZ2JhKDAsIDAsIDAsIDAuMyk7Ci0gIC13ZWJraXQtYm94LXNoYWRvdzogLTE2cHggMjBweCA0MHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCBpbWcucGxheS5uby1zaGFkb3cgewotICAgIGJveC1zaGFkb3c6IG5vbmU7Ci0gICAgLW1vei1ib3gtc2hhZG93OiBub25lOwotICAgIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCBpbWcucGxheS5uby10cmFuc2Zvcm0gewotICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCBhLnNsaWRlc2hvdy1uZXh0IHsKLSAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9hcnJvdy1yaWdodC1kZXZlbG9wLnBuZyk7Ci19Ci0uc2xpZGVzaG93LWRldmVsb3AgYS5zbGlkZXNob3ctcHJldiB7Ci0gIGJhY2tncm91bmQ6IHVybCguLi9pbWFnZXMvYXJyb3ctbGVmdC1kZXZlbG9wLnBuZyk7Ci19Ci0uc2xpZGVzaG93LWRldmVsb3AgLmNvbnRlbnQtcmlnaHQgewotICBmbG9hdDogbGVmdDsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuY29udGVudC1yaWdodCBoMiB7Ci0gIHBhZGRpbmc6MDsKLSAgbWFyZ2luLWJvdHRvbToxMHB4OwotICBib3JkZXI6bm9uZTsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuaXRlbSB7Ci0gIGhlaWdodDogMzAwcHg7Ci0gIHdpZHRoOiA5NDBweDsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAucGFnaW5hdGlvbiB1bCBsaS5hY3RpdmUgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjgwOwotfQotLnNsaWRlc2hvdy1kZXZlbG9wIC5wYWdpbmF0aW9uIHVsIGxpLmFjdGl2ZTpob3ZlciB7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNGODA7Ci19Ci0uc2xpZGVzaG93LWRldmVsb3AgLml0ZW0gaHIgewotICBtYXJnaW46NXB4IDAgMTBweDsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuaXRlbSBwIHsKLSAgbWFyZ2luOjEwcHggMDsKLX0KLS5zbGlkZXNob3ctZGV2ZWxvcCAuaXRlbSBwLnRpdGxlLWludHJvIHsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci0gIG1hcmdpbjowOwotfQotCi0vKiBGZWVkcyAqLwotLmZlZWQgdWwgewotICBtYXJnaW46IDA7Ci19Ci0uZmVlZCAuZmVlZC1uYXYgewotICBoZWlnaHQ6IDI1cHg7Ci0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQ0NDOwotfQotLmZlZWQgLmZlZWQtbmF2IGxpIHsKLSAgbGlzdC1zdHlsZTogbm9uZTsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIGhlaWdodDogMjFweDsgLyogKzRweCBib3R0b20gYm9yZGVyID0gMjVweDsgc2FtZSBhcyAuZmVlZC1uYXYgKi8KLSAgbWFyZ2luLXJpZ2h0OiAyNXB4OwotICBjdXJzb3I6IHBvaW50ZXI7Ci19Ci0uZmVlZCAuZmVlZC1uYXYgbGkuYWN0aXZlIHsKLSAgY29sb3I6ICMwMDA7Ci0gIGJvcmRlci1ib3R0b206IDRweCBzb2xpZCAjRjgwOwotfQotLmZlZWQgLmZlZWQtY29udGFpbmVyIHsKLSAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgd2lkdGg6IDQ2MHB4OwotfQotLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIHsKLSAgd2lkdGg6IDEwMDBweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSB1bCB7Ci0gIGZsb2F0OiBsZWZ0OwotICB3aWR0aDo0NjBweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSB1bCB1bCB7Ci0gIGZsb2F0OiBub25lOwotICBtYXJnaW46MTBweCAwIDAgMzBweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaSB7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIG1hcmdpbjogMjBweCAwIDIwcHggMDsKLSAgd2lkdGg6IDQ2MHB4OwotICBoZWlnaHQ6OTNweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5wbGF5bGlzdCB7Ci0gIGhlaWdodDphdXRvOwotfQotLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIGxpLnBsYXlsaXN0IGEgewotICBoZWlnaHQ6OTNweDsKLSAgZGlzcGxheTpibG9jazsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5tb3JlIHsKLSAgaGVpZ2h0OjIwcHg7Ci0gIG1hcmdpbjoxMHB4IDAgNXB4IDVweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5tb3JlIGEgewotICBoZWlnaHQ6aW5oZXJpdDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5wbGF5bGlzdC12aWRlbyB7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci0gIG1hcmdpbjogMDsKLSAgd2lkdGg6IDQ2MHB4OwotICBoZWlnaHQ6NTVweDsKLSAgZm9udC1zaXplOjEycHg7Ci19Ci0uZmVlZCAuZmVlZC1jb250YWluZXIgLmZlZWQtZnJhbWUgbGkucGxheWxpc3QtdmlkZW8gYSB7Ci0gIGhlaWdodDo0NXB4OwotICBwYWRkaW5nOjVweDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5wbGF5bGlzdC12aWRlbyBoNSB7Ci0gIGZvbnQtc2l6ZToxMnB4OwotICBsaW5lLWhlaWdodDoxM3B4OwotICBtYXJnaW46MDsKLX0KLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaS5wbGF5bGlzdC12aWRlbyBwIHsKLSAgbWFyZ2luOjVweCAwIDA7Ci0gIGxpbmUtaGVpZ2h0OjE1cHg7Ci19Ci0uZmVlZC1jb250YWluZXIgLmZlZWQtZnJhbWUgZGl2LmZlZWQtaW1hZ2UgewotICBmbG9hdDogbGVmdDsKLSAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKLSAgbWFyZ2luOjAgMjBweCAwIDA7Ci0gIHdpZHRoOjEyMnB4OwotICBoZWlnaHQ6OTJweDsKLSAgYmFja2dyb3VuZDp1cmwoJy4uL2ltYWdlcy9ibG9nLWRlZmF1bHQucG5nJykgbm8tcmVwZWF0IDAgMDsKLSAgYmFja2dyb3VuZC1zaXplOjE4MHB4OwotfQotI2pkLWNvbnRlbnQgLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIGxpIGltZyB7Ci0gIGZsb2F0OiBsZWZ0OwotICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwotICBtYXJnaW46MCAyMHB4IDAgMDsKLSAgd2lkdGg6MTIycHg7Ci0gIGhlaWdodDo5MnB4OwotfQotI2pkLWNvbnRlbnQgLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIGxpLnBsYXlsaXN0LXZpZGVvIGltZyB7Ci0gIHdpZHRoOmluaGVyaXQ7Ci0gIGhlaWdodDppbmhlcml0OwotfQotCi0uZmVlZCAuZmVlZC1jb250YWluZXIgLmZlZWQtZnJhbWUgbGkgYSwKLS5mZWVkIC5mZWVkLWNvbnRhaW5lciAuZmVlZC1mcmFtZSBsaSBhOmFjdGl2ZSB7Ci0gIGNvbG9yOiM1NTUgIWltcG9ydGFudDsKLX0KLQotLmZlZWQgLmZlZWQtY29udGFpbmVyIC5mZWVkLWZyYW1lIGxpIGE6aG92ZXIsCi0uZmVlZCAuZmVlZC1jb250YWluZXIgLmZlZWQtZnJhbWUgbGkgYTpob3ZlciAqIHsKLSAgY29sb3I6IzdBQTFCMCAhaW1wb3J0YW50OwotfQotCi0vKiBWaWRlbyBwbGF5ZXIgKi8KLSNwbGF5ZXItd3JhcHBlciB7Ci0gIGRpc3BsYXk6bm9uZTsKLSAgbWFyZ2luOiAtMXB4IGF1dG8gMDsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotICB3aWR0aDogOTQwcHg7Ci0gIGhlaWdodDogMHB4OwotfQotI3BsYXllci1mcmFtZSB7Ci0gIGJhY2tncm91bmQ6ICNFRkVGRUY7Ci0gIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7Ci0gIHBhZGRpbmc6IDBweCAyMDdweDsKLSAgei1pbmRleDogMTA7IC8qIHN0YXkgYWJvdmUgbWFycXVlLCBidXQgYmVsb3cgc2VhcmNoIHN1Z2dlc3Rpb25zICovCi0gIHdpZHRoOiA1MjVweDsKLSAgaGVpZ2h0OiAzMzBweDsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotfQotCi0KLQotLyoqKioqKioqKioqKiBESVNUUklCVVRFIEhPTUVQQUdFICoqKioqKioqKioqKioqKi8KLQotLm1hcnF1ZWUgewotICB3aWR0aDogNzYwcHg7Ci19Ci0ubWFycXVlZSAubWFpbi1pbWcgewotICBmbG9hdDogbGVmdDsKLSAgbWFyZ2luLXRvcDogMjBweDsKLSAgd2lkdGg6IDQ5MHB4OwotfQotLm1hcnF1ZWUgLmNvcHkgewotICB3aWR0aDogMjcwcHg7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW4tdG9wOiAzMHB4OwotfQotLmRpc3RyaWJ1dGUtZmVhdHVyZXMgewotICBtYXJnaW46IDA7Ci19Ci0uZGlzdHJpYnV0ZS1mZWF0dXJlcyB1bCB7Ci0gIG1hcmdpbjogMDsKLX0KLS5kaXN0cmlidXRlLWZlYXR1cmVzIHVsIGxpIHsKLSAgbGlzdC1zdHlsZTogbm9uZTsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjOUMwOwotICB3aWR0aDogMjIwcHg7Ci0gIG1hcmdpbi1yaWdodDogNTBweDsKLX0KLS5kaXN0cmlidXRlLWZlYXR1cmVzIHVsIGxpLmxhc3QgewotICBtYXJnaW4tcmlnaHQ6IDBweDsKLX0KLQotCi0KLS8qKioqKioqKioqKiogREVWRUxPUCBUT1BJQyBDT05UQUlORVJTICoqKioqKioqKioqKi8KLQotLmxhbmRpbmctYmFubmVyLAotLmxhbmRpbmctZG9jcyB7Ci0gIG1hcmdpbjoyMHB4IDAgMDsKLX0KLS5sYW5kaW5nLWJhbm5lciBkaXY6Zmlyc3QtY2hpbGQsCi0ubGFuZGluZy1kb2NzIGRpdjpmaXJzdC1jaGlsZCwKLS5sYW5kaW5nLWRvY3MgLmNvbC0xMiB7Ci0gIG1hcmdpbi1sZWZ0OjA7Ci0gIG1pbi1oZWlnaHQ6MjgwcHg7Ci19Ci0ubGFuZGluZy1iYW5uZXIgZGl2Omxhc3QtY2hpbGQsCi0ubGFuZGluZy1kb2NzIGRpdjpsYXN0LWNoaWxkLAotLmxhbmRpbmctZG9jcyAuY29sLTEyIHsKLSAgbWFyZ2luLXJpZ2h0OjA7Ci19Ci0KLS5sYW5kaW5nLWJhbm5lciBoMSB7Ci0gIG1hcmdpbi10b3A6MDsKLX0KLS5sYW5kaW5nLWRvY3MgewotICBjbGVhcjpsZWZ0OwotICBvdmVyZmxvdzpoaWRkZW47Ci19Ci0ubGFuZGluZy1kb2NzIGgzIHsKLSAgZm9udC1zaXplOjE0cHg7Ci0gIGxpbmUtaGVpZ2h0OjIxcHg7Ci0gIGNvbG9yOiM1NTU7Ci0gIHRleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTsKLSAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0NDQzsKLSAgbWFyZ2luOjAgMCAyMHB4OwotfQotLmxhbmRpbmctZG9jcyBhIHsKLSAgY29sb3I6IzMzMyAhaW1wb3J0YW50OwotfQotCi0ubGFuZGluZy1kb2NzIGE6aG92ZXIsCi0ubGFuZGluZy1kb2NzIGE6aG92ZXIgKiB7Ci0gIGNvbG9yOiM3QUExQjAgIWltcG9ydGFudAotfQotCi0ubGFuZGluZy1kb2NzIC5ub3JtYWwtbGlua3MgYSB7Ci0gIGNvbG9yOiMyNThhYWYgIWltcG9ydGFudDsKLX0KLQotLnBsdXNvbmUgewotICBmbG9hdDpyaWdodDsKLX0KLQotLmZlZWRiYWNrIHsKLSAgZmxvYXQ6cmlnaHQgIWltcG9ydGFudDsKLSAgbWFyZ2luOiAwIDAgMCAxMHB4OwotICBmb250LXNpemU6IDE0cHg7Ci19Ci0KLQotLyoqKioqKioqKioqKiogSE9NRS9MQU5ESU5HIFBBR0UgKioqKioqKioqKioqKioqKiovCi0KLS5zbGlkZXNob3ctaG9tZSB7Ci0gIGhlaWdodDogNTAwcHg7Ci0gIHdpZHRoOiA5NDBweDsKLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNDQ0M7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgbWFyZ2luOiAwOwotfQotLnNsaWRlc2hvdy1ob21lIC5mcmFtZSB7Ci0gIHdpZHRoOiA5NDBweDsKLSAgaGVpZ2h0OiA1MDBweDsKLX0KLS5zbGlkZXNob3ctaG9tZSAuY29udGVudC1sZWZ0IHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgdmVydGljYWwtYWxpZ246IGNlbnRlcjsKLSAgbWFyZ2luOiAwIDAgMCAzNXB4OwotfQotLnNsaWRlc2hvdy1ob21lIC5jb250ZW50LXJpZ2h0IHsKLSAgbWFyZ2luOiA4MHB4IDAgMCAwOwotfQotLnNsaWRlc2hvdy1ob21lIC5jb250ZW50LXJpZ2h0IHAgewotICBtYXJnaW4tYm90dG9tOiAxMHB4OwotfQotLnNsaWRlc2hvdy1ob21lIC5jb250ZW50LXJpZ2h0IHA6bGFzdC1jaGlsZCB7Ci0gIG1hcmdpbi10b3A6IDE1cHg7Ci19Ci0uc2xpZGVzaG93LWhvbWUgLmNvbnRlbnQtcmlnaHQgaDEgewotICBwYWRkaW5nOjA7Ci19Ci0uc2xpZGVzaG93LWhvbWUgLml0ZW0gewotICBoZWlnaHQ6IDUwMHB4OwotICB3aWR0aDogOTQwcHg7Ci19Ci0uaG9tZS1zZWN0aW9ucyB7Ci0gIHBhZGRpbmc6IDMwcHggMjBweCAyMHB4OwotICBtYXJnaW46IDIwcHggMDsKLSAgYmFja2dyb3VuZDogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodG9wLCAjRjZGNkY2LCNGOUY5RjkpOwotfQotLmhvbWUtc2VjdGlvbnMgdWwgewotICBtYXJnaW46IDA7Ci19Ci0uaG9tZS1zZWN0aW9ucyB1bCBsaSB7Ci0gIGZsb2F0OiBsZWZ0OwotICBkaXNwbGF5OiBibG9jazsKLSAgbGlzdC1zdHlsZTogbm9uZTsKLSAgd2lkdGg6IDE3MHB4OwotICBoZWlnaHQ6IDM1cHg7Ci0gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Ci0gIGJhY2tncm91bmQ6IHdoaXRlOwotICBtYXJnaW4tcmlnaHQ6IDEwcHg7Ci0gIGJvcmRlci1yYWRpdXM6IDFweDsKLSAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxcHg7Ci0gIC1tb3otYm9yZGVyLXJhZGl1czogMXB4OwotICBib3gtc2hhZG93OiAxcHggMXB4IDVweCAjRUVFOwotICAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggNXB4ICNFRUU7Ci0gIC1tb3otYm94LXNoYWRvdzogMXB4IDFweCA1cHggI0VFRTsKLSAgYmFja2dyb3VuZDogd2hpdGU7Ci19Ci0uaG9tZS1zZWN0aW9ucyB1bCBsaTpob3ZlciB7Ci0gIGJhY2tncm91bmQ6ICNGOUY5Rjk7Ci0gIGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7Ci19Ci0uaG9tZS1zZWN0aW9ucyB1bCBsaSBhLAotLmhvbWUtc2VjdGlvbnMgdWwgbGkgYTpob3ZlciB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotICBtYXJnaW4tdG9wOiA4cHg7Ci0gIGxpbmUtaGVpZ2h0OiAxOHB4OwotICBmbG9hdDogbGVmdDsKLSAgd2lkdGg6IDEwMCU7Ci0gIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgY29sb3I6ICMwOWMgIWltcG9ydGFudDsKLX0KLS5ob21lLXNlY3Rpb25zIHVsIGxpIGEgewotICBmb250LXdlaWdodDogYm9sZDsKLSAgbWFyZ2luLXRvcDogOHB4OwotICBsaW5lLWhlaWdodDogMThweDsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIHdpZHRoOjEwMCU7Ci0gIHRleHQtYWxpZ246Y2VudGVyOwotfQotLmhvbWUtc2VjdGlvbnMgdWwgbGkgaW1nIHsKLSAgZmxvYXQ6IGxlZnQ7Ci0gIG1hcmdpbjogLThweCAwIDAgMTBweDsKLX0KLS5ob21lLXNlY3Rpb25zIHVsIGxpLmxhc3QgewotICBtYXJnaW4tcmlnaHQ6IDBweDsKLX0KLS5mdWxscGFnZSAjZm9vdGVyIHsKLSAgbWFyZ2luLXRvcDogLTQwcHg7Ci19Ci0KLS5hbm5vdGF0aW9uLW1lc3NhZ2UgewotICBkaXNwbGF5OiBibG9jazsKLX0KLQotLmRhYy1jdXN0b20tc2VhcmNoIHsKLSAgYmFja2dyb3VuZDogI2ZmZjsKLSAgbWFyZ2luOiAwIC0xMHB4OwotICBwYWRkaW5nOiAyMHB4IDEwcHg7Ci0gIHotaW5kZXg6IDE7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaCAuZGFjLWZhYiwgLmRhYy1jdXN0b20tc2VhcmNoIC5kYWMtYnV0dG9uLXNvY2lhbCB7Ci0gIHRvcDogLTQ4cHg7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC1zZWN0aW9uLXRpdGxlIHsKLSAgY29sb3I6ICM1MDUwNTA7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC1lbnRyeSB7Ci0gIG1hcmdpbi1ib3R0b206IDM2cHg7Ci0gIG1hcmdpbi10b3A6IDI0cHg7Ci0gIG1hcmdpbi1sZWZ0OiAwZW07Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC1pbWFnZSB7Ci0gIGJhY2tncm91bmQtc2l6ZTogY292ZXI7Ci0gIGhlaWdodDogMTEycHg7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC10aXRsZSB7Ci0gIGNvbG9yOiAjMzMzOwotICBmb250LXNpemU6IDE0cHg7Ci0gIGZvbnQtd2VpZ2h0OiA3MDA7Ci0gIGxpbmUtaGVpZ2h0OiAwcHg7Ci0gIHBhZGRpbmc6IDA7Ci0gIG1hcmdpbjogMWVtIDBlbSAxZW0gMGVtOwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtdGl0bGUgYSB7Ci0gIGNvbG9yOiBpbmhlcml0OwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtc2VjdGlvbiB7Ci0gIGNvbG9yOiAjOTk5OwotICBmb250LXNpemU6IDE2cHg7Ci0gIGZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKLSAgZm9udC13ZWlnaHQ6IDcwMDsKLSAgbWFyZ2luOiAtNXB4IDAgMCAwOwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtc25pcHBldCB7Ci0gIGNvbG9yOiAjNjY2OwotICBtYXJnaW46IDBlbSAwZW0gLjI1ZW0gMGVtOwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtbGluayB7Ci0gIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gIHdvcmQtd3JhcDogYnJlYWstd29yZDsKLSAgd2lkdGg6IDEwMCU7Ci19Ci0KLS5kYWMtY3VzdG9tLXNlYXJjaC1sb2FkLW1vcmUgewotICBiYWNrZ3JvdW5kOiBub25lOwotICBib3JkZXI6IG5vbmU7Ci0gIGNvbG9yOiAjMzMzOwotICBjdXJzb3I6IHBvaW50ZXI7Ci0gIGRpc3BsYXk6IGJsb2NrOwotICBmb250LXNpemU6IDE0cHg7Ci0gIGZvbnQtd2VpZ2h0OiA3MDA7Ci0gIG1hcmdpbjogNzVweCBhdXRvOwotICBvdXRsaW5lOiBub25lOwotICBwYWRkaW5nOiAxMHB4OwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtbG9hZC1tb3JlOmhvdmVyIHsKLSAgb3BhY2l0eTogMC43OwotfQotCi0uZGFjLWN1c3RvbS1zZWFyY2gtbm8tcmVzdWx0cyB7Ci0gIGNvbG9yOiAjOTk5OwotfQotCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9jc3MvZnVsbHNjcmVlbi5jc3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9jc3MvZnVsbHNjcmVlbi5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxY2Y2NWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvY3NzL2Z1bGxzY3JlZW4uY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIENvbHVtbnMKLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiBBcHBsaWVkIHRvIGJvZHkgdG8gZGVidWcgbGF5b3V0IGFsaWdubWVudHMKLS5ncmlkIHsKLSAgd2lkdGg6MTAwJTsKLSAgaGVpZ2h0OjEwMCU7Ci0gIGJhY2tncm91bmQ6dXJsKC4uL2ltYWdlcy9ncmlkLnBuZykgY2VudGVyIHJlcGVhdC15OwotICB0b3A6MHB4OwotICBtYXJnaW46YXV0bzsKLSAgcG9zaXRpb246YWJzb2x1dGU7Ci19ICAgCi0qLwotCi1AbWVkaWEgc2NyZWVuLCBwcm9qZWN0aW9uLCBwcmludCB7Ci0uZnVsbCB7Ci0JcGFkZGluZzogMi41ZW0gMDsKLQlib3JkZXItdG9wOiBzb2xpZCAxcHggI2RkZDsKLQlib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2RkZDsKLQliYWNrZ3JvdW5kOiAjZjdmN2Y3OwkKLX0KLS53cmFwIHsKLQltYXJnaW46IDAgYXV0bzsKLQl3aWR0aDogMTAwJTsKLQltaW4td2lkdGg6NjAwcHg7Ci0JY2xlYXI6IGJvdGg7Ci19Ci0uY29scyB7Ci0gICAgaGVpZ2h0OiAxJTsKLSAgICBtYXJnaW46IDAgLTEuNTMzNzQyMzMxMjg4MzQzNTU4MjgyJTsKLSAgICB3aWR0aDogMTAzLjA2NzQ4NDY2MjU3NjY5JX0KLSoraHRtbCAuY29scyB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMjBweDsKLX0KLS5jb2xzOmFmdGVyIHsKLSAgICBjbGVhcjogYm90aDsKLSAgICBjb250ZW50OiAnICc7Ci0gICAgZGlzcGxheTogYmxvY2s7Ci0gICAgaGVpZ2h0OiAwOwotICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKLX0KLS5jb2wtMSwgLmNvbC0yLCAuY29sLTMsIC5jb2wtNCwgLmNvbC01LCAuY29sLTYsIC5jb2wtNywgLmNvbC04LCAuY29sLTksIC5jb2wtMTAsIC5jb2wtMTEsIC5jb2wtMTIsCi0uY29sLTEzLCAuY29sLTE0LCAuY29sLTE1LCAuY29sLTE2IHsKLSAgICBmbG9hdDogbGVmdDsKLSAgICBtYXJnaW46IDAgMS4wNjM4Mjk3ODcyMzQlIDIwcHggMS4wNjM4Mjk3ODcyMzQlOwotfQotKiBodG1sIC5jb2wtMSwgKiBodG1sIC5jb2wtMiwgKiBodG1sIC5jb2wtMywgKiBodG1sIC5jb2wtNCwgKiBodG1sIC5jb2wtNSwgKiBodG1sIC5jb2wtNiwgKiBodG1sCi0uY29sLTcsICogaHRtbCAuY29sLTgsICogaHRtbCAuY29sLTksICogaHRtbCAuY29sLTEwLCAqIGh0bWwgLmNvbC0xMSwgKiBodG1sIC5jb2wtMTIsICogaHRtbAotLmNvbC0xMywgKiBodG1sIC5jb2wtMTQsICogaHRtbCAuY29sLTE1LCAqIGh0bWwgLmNvbC0xNiAgewotICAgIG1hcmdpbjogMDsKLSAgICBtYXJnaW46IDAgMS4wNjM4Mjk3ODcyMzQlIDIwcHggMS4wNjM4Mjk3ODcyMzQlOwotfQotW2Rpcj0ncnRsJ10gLmNvbC0xLCBbZGlyPSdydGwnXSAuY29sLTIsIFtkaXI9J3J0bCddIC5jb2wtMywgW2Rpcj0ncnRsJ10gLmNvbC00LCBbZGlyPSdydGwnXSAuY29sLTUsCi1bZGlyPSdydGwnXSAuY29sLTYsIFtkaXI9J3J0bCddIC5jb2wtNywgW2Rpcj0ncnRsJ10gLmNvbC04LCBbZGlyPSdydGwnXSAuY29sLTksIFtkaXI9J3J0bCddIC5jb2wtMTAsCi1bZGlyPSdydGwnXSAuY29sLTExLCBbZGlyPSdydGwnXSAuY29sLTEyIHsKLSAgICBmbG9hdDogcmlnaHQ7Ci19Ci0uY29sLTEgewotICAgIHdpZHRoOiA0LjE2NjY2NjY2NjY2NjY3JTsKLX0KLS5jb2wtMiB7Ci0gICAgd2lkdGg6IDEwLjQxNjY2NjY2NjY2NjclOwotfQotLmNvbC0zIHsKLSAgICB3aWR0aDogMTYuNjY2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTQgewotICAgIHdpZHRoOiAyMi45MTY2NjY2NjY2NjY3JTsKLX0KLS5jb2wtNSB7Ci0gICAgd2lkdGg6IDI5LjE2NjY2NjY2NjY2NjclOwotfQotLmNvbC02IHsKLSAgICB3aWR0aDogMzUuNDE2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTcgewotICAgIHdpZHRoOiA0MS42NjY2NjY2NjY2NjY3JTsKLX0KLS5jb2wtOCB7Ci0gICAgd2lkdGg6IDQ3LjkxNjY2NjY2NjY2NjclOwotfQotLmNvbC05IHsKLSAgICB3aWR0aDogNTUuMzMzMzMzMzMzMzMzMyU7Ci19Ci0uY29sLTEwIHsKLSAgICB3aWR0aDogNjAuNDE2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTExIHsKLSAgICB3aWR0aDogNjYuNjY2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTEyIHsKLSAgICB3aWR0aDogNzIuOTE2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTEzIHsKLSAgICB3aWR0aDogNzkuMTY2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTE0IHsKLSAgICB3aWR0aDogODUuNDE2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTE1IHsKLSAgICB3aWR0aDogOTEuNjY2NjY2NjY2NjY2NyU7Ci19Ci0uY29sLTE2IHsKLSAgICB3aWR0aDogOTcuOTE2NjY2NjY2NjY2NyU7Ci19Ci0KLQotCi0KLQotCi0KLSNoZWFkZXIgLmNvbC0xLAotI25hdi14IC5jb2wtMSB7IHdpZHRoOiA0MHB4IH0KLSNoZWFkZXIgLmNvbC0yLAotI25hdi14IC5jb2wtMiB7IHdpZHRoOiAxMDBweCB9Ci0jaGVhZGVyIC5jb2wtMywKLSNuYXYteCAuY29sLTMgeyB3aWR0aDogMTYwcHggfQotI2hlYWRlciAuY29sLTQsCi0jbmF2LXggLmNvbC00IHsgd2lkdGg6IDIyMHB4IH0KLSNoZWFkZXIgLmNvbC01LAotI25hdi14IC5jb2wtNSB7IHdpZHRoOiAyODBweCB9Ci0jaGVhZGVyIC5jb2wtNiwKLSNuYXYteCAuY29sLTYgeyB3aWR0aDogMzQwcHggfQotI2hlYWRlciAuY29sLTcsCi0jbmF2LXggLmNvbC03IHsgd2lkdGg6IDQwMHB4IH0KLSNoZWFkZXIgLmNvbC04LAotI25hdi14IC5jb2wtOCB7IHdpZHRoOiA0NjBweCB9Ci0jaGVhZGVyIC5jb2wtOSwKLSNuYXYteCAuY29sLTkgeyB3aWR0aDogNTIwcHggfQotI2hlYWRlciAuY29sLTEwLAotI25hdi14IC5jb2wtMTAgeyB3aWR0aDogNTgwcHggfQotI2hlYWRlciAuY29sLTExLAotI25hdi14IC5jb2wtMTEgeyB3aWR0aDogNjQwcHggfQotI2hlYWRlciAuY29sLTEyLAotI25hdi14IC5jb2wtMTIgeyB3aWR0aDogNzAwcHggfQotI2hlYWRlciAuY29sLTEzLAotI25hdi14IC5jb2wtMTMgeyB3aWR0aDogNzYwcHggfQotI2hlYWRlciAuY29sLTE0LAotI25hdi14IC5jb2wtMTQgeyB3aWR0aDogODIwcHggfQotI2hlYWRlciAuY29sLTE1LAotI25hdi14IC5jb2wtMTUgeyB3aWR0aDogODgwcHggfQotI2hlYWRlciAuY29sLTE2LAotI25hdi14IC5jb2wtMTYgeyB3aWR0aDogOTQwcHggfQotCi0KLQotYm9keSB7Ci0gIHBhZGRpbmc6MCAyMHB4OwotfQotI2hlYWRlciwKLSNzZWFyY2hSZXN1bHRzLAotI25hdi14IHsKLSAgbWFyZ2luOjA7Ci19Ci0jYm9keS1jb250ZW50IHsKLSAgbWFyZ2luOjA7Ci19Ci0jYm9keS1jb250ZW50ID4gLmNvbC0xMiB7Ci0gIHdpZHRoOjc3Ljk4MDQ5NjUlOwotICBtYXJnaW46MCAwIDAgMC45NyU7IC8qIHRoaXMgcGVyY2VudGFnZSBjaG9zZW4gdG8gbWFrZSBJRTkgaGFwcHkgKi8KLX0KLSNzaWRlLW5hdiB7Ci0gIHdpZHRoOiAxOS45ODA0OTY1JTsKLSAgbWFyZ2luOjAgMS4wNjM4Mjk3ODcyMzQlIDAgMDsKLX0KLQotI2hlYWRlciAud3JhcCB7Ci0gIG1heC13aWR0aDogMTAwJTsKLX0KLQotI25hdi14IC53cmFwLAotI3NlYXJjaFJlc3VsdHMud3JhcCB7Ci0gICAgbWF4LXdpZHRoOjEwMCU7Ci19Ci0KLS5uYXYteCB7Ci0gIG1hcmdpbjotMnB4IDAgMCAwOwotfQotCi0jZGV2ZG9jLW5hdi5maXhlZCwKLSNkZXZkb2MtbmF2LmZpeGVkIGEudG90b3AgewotICBsZWZ0OjIwcHg7IC8qICFpbXBvcnRhbnQgLi4uIGZvciBJRSBpIHRoaW5rICovCi19Ci0KLQotCi0KLX0KLQotLmNvbC1yaWdodCB7Ci0gIG1hcmdpbi1yaWdodDowcHg7Ci19Ci0KLUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzcycHgpIHsKLS5jb2wtNSwgLmNvbC02LCAuY29sLTcgewotICAgIGNsZWFyOiBib3RoOwotICAgIHdpZHRoOiA5Ny4wMjM4MDk2JX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9kZXNpZ24vZGVmYXVsdC5qcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2Rlc2lnbi9kZWZhdWx0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmE4NDg2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2Rlc2lnbi9kZWZhdWx0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLSQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAvLyBwcmVwIG5hdiBleHBhbmRvcwotICB2YXIgcGFnZVBhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZTsKLSAgaWYgKHBhZ2VQYXRoLmluZGV4T2YoU0lURV9ST09UKSA9PSAwKSB7Ci0gICAgcGFnZVBhdGggPSBwYWdlUGF0aC5zdWJzdHIoU0lURV9ST09ULmxlbmd0aCk7Ci0gICAgaWYgKHBhZ2VQYXRoID09ICcnIHx8IHBhZ2VQYXRoLmNoYXJBdChwYWdlUGF0aC5sZW5ndGggLSAxKSA9PSAnLycpIHsKLSAgICAgIHBhZ2VQYXRoICs9ICdpbmRleC5odG1sJzsKLSAgICB9Ci0gIH0KLQotICBpZiAoU0lURV9ST09ULm1hdGNoKC9cLlwuXC8vKSB8fCBTSVRFX1JPT1QgPT0gJycpIHsKLSAgICAvLyBJZiBydW5uaW5nIGxvY2FsbHksIFNJVEVfUk9PVCB3aWxsIGJlIGEgcmVsYXRpdmUgcGF0aCwgc28gYWNjb3VudCBmb3IgdGhhdCBieQotICAgIC8vIGZpbmRpbmcgdGhlIHJlbGF0aXZlIFVSTCB0byB0aGlzIHBhZ2UuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBmaW5kIGxpbmtzIG9uIHRoZSBwYWdlCi0gICAgLy8gbGVhZGluZyBiYWNrIHRvIHRoaXMgcGFnZS4KLSAgICB2YXIgcGF0aFBhcnRzID0gcGFnZVBhdGguc3BsaXQoJy8nKTsKLSAgICB2YXIgcmVsYXRpdmVQYWdlUGF0aFBhcnRzID0gW107Ci0gICAgdmFyIHVwRGlycyA9IChTSVRFX1JPT1QubWF0Y2goLyhcLlwuXC8pKy8pIHx8IFsnJ10pWzBdLmxlbmd0aCAvIDM7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cERpcnM7IGkrKykgewotICAgICAgcmVsYXRpdmVQYWdlUGF0aFBhcnRzLnB1c2goJy4uJyk7Ci0gICAgfQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXBEaXJzOyBpKyspIHsKLSAgICAgIHJlbGF0aXZlUGFnZVBhdGhQYXJ0cy5wdXNoKHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gKHVwRGlycyAtIGkpIC0gMV0pOwotICAgIH0KLSAgICByZWxhdGl2ZVBhZ2VQYXRoUGFydHMucHVzaChwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdKTsKLSAgICBwYWdlUGF0aCA9IHJlbGF0aXZlUGFnZVBhdGhQYXJ0cy5qb2luKCcvJyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gT3RoZXJ3aXNlIHRoZSBwYWdlIHBhdGggc2hvdWxkIGJlIGFuIGFic29sdXRlIFVSTC4KLSAgICBwYWdlUGF0aCA9IFNJVEVfUk9PVCArIHBhZ2VQYXRoOwotICB9Ci0KLSAgLy8gc2VsZWN0IGN1cnJlbnQgcGFnZSBpbiBzaWRlbmF2IGFuZCBzZXQgdXAgcHJldi9uZXh0IGxpbmtzIGlmIHRoZXkgZXhpc3QKLSAgdmFyICRzZWxOYXZMaW5rID0gJCgnLm5hdi15JykuZmluZCgnYVtocmVmPSInICsgcGFnZVBhdGggKyAnIl0nKTsKLSAgaWYgKCRzZWxOYXZMaW5rLmxlbmd0aCkgewotICAgICRzZWxMaXN0SXRlbSA9ICRzZWxOYXZMaW5rLmNsb3Nlc3QoJ2xpJyk7Ci0KLSAgICAkc2VsTGlzdEl0ZW0uYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7Ci0gICAgJHNlbExpc3RJdGVtLmNsb3Nlc3QoJ2xpPnVsJykuYWRkQ2xhc3MoJ2V4cGFuZGVkJyk7Ci0KLSAgICAvLyBzZXQgdXAgcHJldiBsaW5rcwotICAgIHZhciAkcHJldkxpbmsgPSBbXTsKLSAgICB2YXIgJHByZXZMaXN0SXRlbSA9ICRzZWxMaXN0SXRlbS5wcmV2KCdsaScpOwotICAgIGlmICgkcHJldkxpc3RJdGVtLmxlbmd0aCkgewotICAgICAgaWYgKCRwcmV2TGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgICAgLy8ganVtcCB0byBsYXN0IHRvcGljIG9mIHByZXZpb3VzIHNlY3Rpb24KLSAgICAgICAgJHByZXZMaW5rID0gJHByZXZMaXN0SXRlbS5maW5kKCdhOmxhc3QnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGp1bXAgdG8gcHJldmlvdXMgdG9waWMgaW4gdGhpcyBzZWN0aW9uCi0gICAgICAgICRwcmV2TGluayA9ICRwcmV2TGlzdEl0ZW0uZmluZCgnYTplcSgwKScpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBqdW1wIHRvIHRoaXMgc2VjdGlvbidzIGluZGV4IHBhZ2UgKGlmIGl0IGV4aXN0cykKLSAgICAgICRwcmV2TGluayA9ICRzZWxMaXN0SXRlbS5wYXJlbnRzKCdsaScpLmZpbmQoJ2EnKTsKLSAgICB9Ci0KLSAgICBpZiAoJHByZXZMaW5rLmxlbmd0aCkgewotICAgICAgdmFyIHByZXZIcmVmID0gJHByZXZMaW5rLmF0dHIoJ2hyZWYnKTsKLSAgICAgIGlmIChwcmV2SHJlZiA9PSBTSVRFX1JPT1QgKyAnaW5kZXguaHRtbCcpIHsKLSAgICAgICAgLy8gRG9uJ3Qgc2hvdyBQcmV2aW91cyB3aGVuIGl0IGxlYWRzIHRvIHRoZSBob21lcGFnZQotICAgICAgICAkKCcucHJldi1wYWdlLWxpbmsnKS5oaWRlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkKCcucHJldi1wYWdlLWxpbmsnKS5hdHRyKCdocmVmJywgcHJldkhyZWYpLnNob3coKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgJCgnLnByZXYtcGFnZS1saW5rJykuaGlkZSgpOwotICAgIH0KLQotICAgIC8vIHNldCB1cCBuZXh0IGxpbmtzCi0gICAgdmFyICRuZXh0TGluayA9IFtdOwotICAgIGlmICgkc2VsTGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgIC8vIHdlJ3JlIG9uIGFuIGluZGV4IHBhZ2UsIGp1bXAgdG8gdGhlIGZpcnN0IHRvcGljCi0gICAgICAkbmV4dExpbmsgPSAkc2VsTGlzdEl0ZW0uZmluZCgndWwnKS5maW5kKCdhOmVxKDApJykKLSAgICB9IGVsc2UgewotICAgICAgLy8ganVtcCB0byB0aGUgbmV4dCB0b3BpYyBpbiB0aGlzIHNlY3Rpb24gKGlmIGl0IGV4aXN0cykKLSAgICAgICRuZXh0TGluayA9ICRzZWxMaXN0SXRlbS5uZXh0KCdsaScpLmZpbmQoJ2E6ZXEoMCknKTsKLSAgICAgIGlmICghJG5leHRMaW5rLmxlbmd0aCkgewotICAgICAgICAvLyBubyBtb3JlIHRvcGljcyBpbiB0aGlzIHNlY3Rpb24sIGp1bXAgdG8gdGhlIGZpcnN0IHRvcGljIGluIHRoZSBuZXh0IHNlY3Rpb24KLSAgICAgICAgJG5leHRMaW5rID0gJHNlbExpc3RJdGVtLnBhcmVudHMoJ2xpJykubmV4dCgnbGkubmF2LXNlY3Rpb24nKS5maW5kKCdhOmVxKDApJyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICgkbmV4dExpbmsubGVuZ3RoKSB7Ci0gICAgICAkKCcubmV4dC1wYWdlLWxpbmsnKS5hdHRyKCdocmVmJywgJG5leHRMaW5rLmF0dHIoJ2hyZWYnKSkuc2hvdygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkKCcubmV4dC1wYWdlLWxpbmsnKS5oaWRlKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2V0IHVwIGV4cGFuZC9jb2xsYXBzZSBiZWhhdmlvcgotICAkKCcubmF2LXkgbGknKS5oYXMoJ3VsJykuY2xpY2soZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2V4cGFuZGVkJykpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBoaWRlIG90aGVyCi0gICAgdmFyICRvbGQgPSAkKCcubmF2LXkgbGkuZXhwYW5kZWQnKTsKLSAgICBpZiAoJG9sZC5sZW5ndGgpIHsKLSAgICAgIHZhciAkb2xkVWwgPSAkb2xkLmNoaWxkcmVuKCd1bCcpOwotICAgICAgJG9sZFVsLmNzcygnaGVpZ2h0JywgJG9sZFVsLmhlaWdodCgpICsgJ3B4Jyk7Ci0gICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICAgJG9sZFVsCi0gICAgICAgICAgICAuYWRkQ2xhc3MoJ2FuaW1hdGUtaGVpZ2h0JykKLSAgICAgICAgICAgIC5jc3MoJ2hlaWdodCcsICcnKTsKLSAgICAgIH0sIDApOwotICAgICAgJG9sZC5yZW1vdmVDbGFzcygnZXhwYW5kZWQnKTsKLSAgICB9Ci0KLSAgICAvLyBzaG93IG1lCi0gICAgJCh0aGlzKS5hZGRDbGFzcygnZXhwYW5kZWQnKTsKLSAgICB2YXIgJHVsID0gJCh0aGlzKS5jaGlsZHJlbigndWwnKTsKLSAgICB2YXIgZXhwYW5kZWRIZWlnaHQgPSAkdWwuaGVpZ2h0KCk7Ci0gICAgJHVsCi0gICAgICAgIC5yZW1vdmVDbGFzcygnYW5pbWF0ZS1oZWlnaHQnKQotICAgICAgICAuY3NzKCdoZWlnaHQnLCAwKTsKLSAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICR1bAotICAgICAgICAgIC5hZGRDbGFzcygnYW5pbWF0ZS1oZWlnaHQnKQotICAgICAgICAgIC5jc3MoJ2hlaWdodCcsIGV4cGFuZGVkSGVpZ2h0ICsgJ3B4Jyk7Ci0gICAgfSwgMCk7Ci0gIH0pOwotCi0gIC8vIFN0b3AgZXhwYW5kL2NvbGxhcHNlIGJlaGF2aW9yIHdoZW4gY2xpY2tpbmcgb24gbmF2IHNlY3Rpb24gbGlua3MgKHNpbmNlIHdlJ3JlIG5hdmlnYXRpbmcgYXdheQotICAvLyBmcm9tIHRoZSBwYWdlKQotICAkKCcubmF2LXkgbGknKS5oYXMoJ3VsJykuZmluZCgnYTplcSgwKScpLmNsaWNrKGZ1bmN0aW9uKGV2dCkgewotICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9KTsKLQotICAvLyBTZXQgdXAgcGxheS1vbi1ob3ZlciA8dmlkZW8+IHRhZ3MuCi0gICQoJ3ZpZGVvLnBsYXktb24taG92ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7Ci0gICAgJCh0aGlzKS5nZXQoMCkubG9hZCgpOyAvLyBpbiBjYXNlIHRoZSB2aWRlbyBpc24ndCBzZWVrYWJsZQotICAgICQodGhpcykuZ2V0KDApLnBsYXkoKTsKLSAgfSk7Ci0KLSAgLy8gU2V0IHVwIHRvb2x0aXBzCi0gIHZhciBUT09MVElQX01BUkdJTiA9IDEwOwotICAkKCdhY3JvbnltJykuZWFjaChmdW5jdGlvbigpIHsKLSAgICB2YXIgJHRhcmdldCA9ICQodGhpcyk7Ci0gICAgdmFyICR0b29sdGlwID0gJCgnPGRpdj4nKQotICAgICAgICAuYWRkQ2xhc3MoJ3Rvb2x0aXAtYm94JykKLSAgICAgICAgLnRleHQoJHRhcmdldC5hdHRyKCd0aXRsZScpKQotICAgICAgICAuaGlkZSgpCi0gICAgICAgIC5hcHBlbmRUbygnYm9keScpOwotICAgICR0YXJnZXQucmVtb3ZlQXR0cigndGl0bGUnKTsKLQotICAgICR0YXJnZXQuaG92ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBpbgotICAgICAgdmFyIHRhcmdldFJlY3QgPSAkdGFyZ2V0Lm9mZnNldCgpOwotICAgICAgdGFyZ2V0UmVjdC53aWR0aCA9ICR0YXJnZXQud2lkdGgoKTsKLSAgICAgIHRhcmdldFJlY3QuaGVpZ2h0ID0gJHRhcmdldC5oZWlnaHQoKTsKLQotICAgICAgJHRvb2x0aXAuY3NzKHsKLSAgICAgICAgbGVmdDogdGFyZ2V0UmVjdC5sZWZ0LAotICAgICAgICB0b3A6IHRhcmdldFJlY3QudG9wICsgdGFyZ2V0UmVjdC5oZWlnaHQgKyBUT09MVElQX01BUkdJTgotICAgICAgfSk7Ci0gICAgICAkdG9vbHRpcC5hZGRDbGFzcygnYmVsb3cnKTsKLSAgICAgICR0b29sdGlwLnNob3coKTsKLSAgICB9LCBmdW5jdGlvbigpIHsKLSAgICAgIC8vIG91dAotICAgICAgJHRvb2x0aXAuaGlkZSgpOwotICAgIH0pOwotICB9KTsKLQotICAvLyBTZXQgdXAgPGgyPiBkZWVwbGlua3MKLSAgJCgnaDInKS5jbGljayhmdW5jdGlvbigpIHsKLSAgICB2YXIgaWQgPSAkKHRoaXMpLmF0dHIoJ2lkJyk7Ci0gICAgaWYgKGlkKSB7Ci0gICAgICBkb2N1bWVudC5sb2NhdGlvbi5oYXNoID0gaWQ7Ci0gICAgfQotICB9KTsKLQotICAvLyBTZXQgdXAgZml4ZWQgbmF2YmFyCi0gIHZhciBuYXZCYXJJc0ZpeGVkID0gZmFsc2U7Ci0gICQod2luZG93KS5zY3JvbGwoZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNjcm9sbFRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKTsKLSAgICB2YXIgbmF2QmFyU2hvdWxkQmVGaXhlZCA9IChzY3JvbGxUb3AgPiAoMTAwIC0gNDApKTsKLSAgICBpZiAobmF2QmFySXNGaXhlZCAhPSBuYXZCYXJTaG91bGRCZUZpeGVkKSB7Ci0gICAgICBpZiAobmF2QmFyU2hvdWxkQmVGaXhlZCkgewotICAgICAgICAkKCcjbmF2JykKLSAgICAgICAgICAgIC5hZGRDbGFzcygnZml4ZWQnKQotICAgICAgICAgICAgLnByZXBlbmRUbygnI3BhZ2UtY29udGFpbmVyJyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkKCcjbmF2JykKLSAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnZml4ZWQnKQotICAgICAgICAgICAgLnByZXBlbmRUbygnI25hdi1jb250YWluZXInKTsKLSAgICAgIH0KLSAgICAgIG5hdkJhcklzRml4ZWQgPSBuYXZCYXJTaG91bGRCZUZpeGVkOwotICAgIH0KLSAgfSk7Ci19KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYW5kcm9pZC1kZXZlbG9wZXJzLWxvZ28ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2FuZHJvaWQtZGV2ZWxvcGVycy1sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhOGY2Mi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYW5kcm9pZC1kZXZlbG9wZXJzLWxvZ28ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2FuZHJvaWRfd3JlbmNoLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hbmRyb2lkX3dyZW5jaC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOTBhMmQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2FuZHJvaWRfd3JlbmNoLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvdy1sZWZ0LWRldmVsb3AucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LWxlZnQtZGV2ZWxvcC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZGZhYTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LWxlZnQtZGV2ZWxvcC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3ctbGVmdC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3ctbGVmdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYWZlYzguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LWxlZnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LXJpZ2h0LWRldmVsb3AucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93LXJpZ2h0LWRldmVsb3AucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZmMWYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvdy1yaWdodC1kZXZlbG9wLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvdy1yaWdodC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3ctcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjdkNmRiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvdy1yaWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfYmx1ZWxpbmtfZG93bi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfYmx1ZWxpbmtfZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4YzI0OGEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X2JsdWVsaW5rX2Rvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X2JsdWVsaW5rX3VwLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19ibHVlbGlua191cC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdkMGYzOGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X2JsdWVsaW5rX3VwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19sZWZ0X29mZi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfbGVmdF9vZmYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDMyYTY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19sZWZ0X29mZi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfbGVmdF9vbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfbGVmdF9vbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MzE4NGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X2xlZnRfb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93X3JpZ2h0X29mZi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfcmlnaHRfb2ZmLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTdkMmVmZS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfcmlnaHRfb2ZmLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19yaWdodF9vbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dfcmlnaHRfb24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWEyYWYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9hcnJvd19yaWdodF9vbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dzLXVwLWRvd24ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Fycm93cy11cC1kb3duLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhOTFlZC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYXJyb3dzLXVwLWRvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2NvbW11bml0eV9sZWZ0RGl2LmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19jb21tdW5pdHlfbGVmdERpdi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2ZDZmMGUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2NvbW11bml0eV9sZWZ0RGl2LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19mYWRlLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19mYWRlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzZjNzBiNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmdfZmFkZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmdfZ3JhZGllbnQuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2dyYWRpZW50LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0ZjhmNS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmdfZ3JhZGllbnQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2ltYWdlc19zcHJpdGUucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JnX2ltYWdlc19zcHJpdGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDQzN2U3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19pbWFnZXNfc3ByaXRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19sb2dvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9iZ19sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NmMGNiOS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmdfbG9nby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYmxvZy1kZWZhdWx0LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ibG9nLWRlZmF1bHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGFiNmMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ibG9nLWRlZmF1bHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JvZHktZ3JhZGllbnQtdGFiLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ib2R5LWdyYWRpZW50LXRhYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjNhYzMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2JvZHktZ3JhZGllbnQtdGFiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ib2R5LWdyYWRpZW50LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ib2R5LWdyYWRpZW50LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ1OTg1NS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvYm9keS1ncmFkaWVudC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvY2xvc2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Nsb3NlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlMzM5MS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvY2xvc2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2RhY19sb2dvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9kYWNfbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTEwNDQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2RhY19sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9kZXZlbG9wZXJzLWxvZ28ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2RldmVsb3BlcnMtbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4MTIyZWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2RldmVsb3BlcnMtbG9nby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvZnVsbHNjcmVlbi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvZnVsbHNjcmVlbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjk3MWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2Z1bGxzY3JlZW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2dyYWQtcnVsZS1xdi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvZ3JhZC1ydWxlLXF2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlMmQxOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvZ3JhZC1ydWxlLXF2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0FuZHJvaWRfRGV2X0xhYl9sLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0FuZHJvaWRfRGV2X0xhYl9sLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwNGYyNC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9BbmRyb2lkX0Rldl9MYWJfbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9HREMyMDExLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dEQzIwMTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNlOTE4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dEQzIwMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvR1RWX2ljb25fbGFyZ2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvR1RWX2ljb25fbGFyZ2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmQ1NGFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dUVl9pY29uX2xhcmdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dUVl9pY29uX3NtYWxsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL0dUVl9pY29uX3NtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhMTY5OS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9HVFZfaWNvbl9zbWFsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9JTy1sb2dvLTIwMTEucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvSU8tbG9nby0yMDExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyODQ0Ny4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9JTy1sb2dvLTIwMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvSU8tbG9nby5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9JTy1sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUzMzRjOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9JTy1sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2FkYzJfbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9hZGMyX2wucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjEwMWE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2FkYzJfbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9hZGMyX3MucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYWRjMl9zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzNmJkYi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9hZGMyX3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYW5kcm9pZF9hZGMucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYW5kcm9pZF9hZGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU3ZjhmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2FuZHJvaWRfYWRjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfYW5ub3VuY2VtZW50LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfYW5ub3VuY2VtZW50LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE0ODVmZi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2Fubm91bmNlbWVudC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2JvdHRvbS5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2JvdHRvbS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhY2Q0MDEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYmdfaG9tZV9ib3R0b20uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2Nhcm91c2VsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNlNWUzMC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2Nhcm91c2VsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfY2Fyb3VzZWxfYm9hcmQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbF9ib2FyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1NzdlMDIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvYmdfaG9tZV9jYXJvdXNlbF9ib2FyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9iZ19ob21lX2Nhcm91c2VsX3doZWVsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfY2Fyb3VzZWxfd2hlZWwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYTIyNGFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2JnX2hvbWVfY2Fyb3VzZWxfd2hlZWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvY2Fyb3VzZWxfYnV0dG9uc19zcHJpdGUucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvY2Fyb3VzZWxfYnV0dG9uc19zcHJpdGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOThjOTQyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2Nhcm91c2VsX2J1dHRvbnNfc3ByaXRlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2RldnBob25lLWxhcmdlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2RldnBob25lLWxhcmdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiMGY2Yy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kZXZwaG9uZS1sYXJnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kZXZwaG9uZS1zbWFsbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kZXZwaG9uZS1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMGJmYTkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZGV2cGhvbmUtc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZG9udXQtYW5kcm9pZC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kb251dC1hbmRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmFiYTA2Yi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9kb251dC1hbmRyb2lkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2VjbGFpci1hbmRyb2lkLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2VjbGFpci1hbmRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NmNlOS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9lY2xhaXItYW5kcm9pZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9mcm95by1hbmRyb2lkLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2Zyb3lvLWFuZHJvaWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjNmN2YwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2Zyb3lvLWFuZHJvaWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ2RjLWxvZ28ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ2RjLWxvZ28ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI1M2ZiLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2dkYy1sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2dpbmdlcmRyb2lkLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2dpbmdlcmRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5OWQ4NC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9naW5nZXJkcm9pZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9nb29nbGUtcGx1cy1zbWFsbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9nb29nbGUtcGx1cy1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjdkN2EuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ29vZ2xlLXBsdXMtc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ29vZ2xlLXBsdXMucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvZ29vZ2xlLXBsdXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg3MWUxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2dvb2dsZS1wbHVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2hvbmV5Y29tYi1hbmRyb2lkLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2hvbmV5Y29tYi1hbmRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjNTAzMS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9ob25leWNvbWItYW5kcm9pZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWFib3V0LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tYWJvdXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM5NzYyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tYWJvdXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1kZXNpZ24ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1kZXNpZ24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDMxY2RmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tZGVzaWduLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tZGV2ZWxvcC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWRldmVsb3AucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJiMjBmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljb24tZGV2ZWxvcC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWRpc3RyaWJ1dGUucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNvbi1kaXN0cmlidXRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyNDA3Mi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pY29uLWRpc3RyaWJ1dGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNzLWFuZHJvaWQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaWNzLWFuZHJvaWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTYyY2E4Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2ljcy1hbmRyb2lkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2lvLWxhcmdlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL2lvLWxhcmdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTg2MDUzYy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pby1sYXJnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pby1zbWFsbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9pby1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhMjI1NDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvaW8tc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFwcy1sYXJnZS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tYXBzLWxhcmdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2ZjY1YS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tYXBzLWxhcmdlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL21hcHMtc21hbGwucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFwcy1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWYxZmEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFwcy1zbWFsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tYXJrZXQtbGFyZ2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFya2V0LWxhcmdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5ZmVlNy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9tYXJrZXQtbGFyZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFya2V0LXNtYWxsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL21hcmtldC1zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMTIwMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvbWFya2V0LXNtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL3Nkay1sYXJnZS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9zZGstbGFyZ2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTVhMWJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ob21lL3Nkay1sYXJnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9zZGstc21hbGwucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hvbWUvc2RrLXNtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxNjcwZC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaG9tZS9zZGstc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hyX2dyYXlfbWFpbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaHJfZ3JheV9tYWluLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdhMGEyZi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaHJfZ3JheV9tYWluLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9ocl9ncmF5X3NpZGUuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hyX2dyYXlfc2lkZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2Njc0NzYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2hyX2dyYXlfc2lkZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9jb250cmlidXRlLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2NvbnRyaWJ1dGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYWExMmI2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2NvbnRyaWJ1dGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZGVzaWduLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2Rlc2lnbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjkwN2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZGVzaWduLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2Rvd25sb2FkLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2Rvd25sb2FkLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjhjMTE2NS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9kb3dubG9hZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9kb3dubG9hZDIuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZG93bmxvYWQyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzBhZjdhMi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9kb3dubG9hZDIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZ3VpZGVsaW5lc19sb2dvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX2d1aWRlbGluZXNfbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNjJjOGYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fZ3VpZGVsaW5lc19sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9tYXJrZXQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmJiMTk3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9tb3JlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX21vcmUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2QwM2EzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX21vcmUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9wbGF5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmZGM3Yi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9wbGF5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX3JvYm90LmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX3JvYm90LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2EwZmQzOS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9yb2JvdC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9zZWFyY2gucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fc2VhcmNoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5MGExMi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvaWNvbl9zZWFyY2gucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fd29ybGQuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2ljb25fd29ybGQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NWI4ZmE2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9pY29uX3dvcmxkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9sZWZ0X29mZi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbGVmdF9vZmYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDMyYTY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9sZWZ0X29mZi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbGVmdF9vbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbGVmdF9vbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0MzE4NGIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2xlZnRfb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL2xvY2FsZS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbG9jYWxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzYWFlNy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbG9jYWxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9sb2dvX2JyZWFkY3J1bWJ6LmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9sb2dvX2JyZWFkY3J1bWJ6LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTc0M2Y4Ni4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbG9nb19icmVhZGNydW1iei5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV9ib3R0b20ucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL21vcmVfYm90dG9tLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyNTQ2YS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV9ib3R0b20ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL21vcmVfY2hlY2sucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL21vcmVfY2hlY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmZjYmZjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9tb3JlX2NoZWNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9tb3JlX21pZC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV9taWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWJjOTk5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9tb3JlX21pZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV90b3AucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL21vcmVfdG9wLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhZDFkMy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvbW9yZV90b3AucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL29wZW5fc291cmNlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9vcGVuX3NvdXJjZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEyYmIxZmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL29wZW5fc291cmNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9wcmVsaW1pbmFyeS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcHJlbGltaW5hcnkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBkYTNkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9wcmVsaW1pbmFyeS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcXVpY2tuYXZfYXJyb3cucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3F1aWNrbmF2X2Fycm93LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YWM4Mi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcXVpY2tuYXZfYXJyb3cucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3F1aWNrbmF2X2J0bl9iZy5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcXVpY2tuYXZfYnRuX2JnLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwYzlhOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcXVpY2tuYXZfYnRuX2JnLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtZS5naWYgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzQ4MDk3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLWUyLmdpZiBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtZTIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDVkMGM1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtZTIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc2l6YWJsZS1lZy5naWYgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLWVnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjE5NjYxNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLWVnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtcy5naWYgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjZhNGViLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLXMyLmdpZiBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtczIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5OWU4NjljLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtczIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc2l6YWJsZS1zMi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLXMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhNmQyZC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzaXphYmxlLXMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNpemFibGUtc2cuZ2lmIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc2l6YWJsZS1zZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0YmVhMTAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc2l6YWJsZS1zZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYXJ0aWNsZS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYXJ0aWNsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjQ5M2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWFydGljbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy1hcnRpY2xlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctYXJ0aWNsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzMyNzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy1hcnRpY2xlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctc2FtcGxlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctc2FtcGxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliNmI2OC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXNhbXBsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXR1dG9yaWFsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctdHV0b3JpYWwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzJlODlhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1iaWctdHV0b3JpYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLWJpZy12aWRlby5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXZpZGVvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkNDZhMC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtYmlnLXZpZGVvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1zYW1wbGUucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXNhbXBsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YTQxMWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXNhbXBsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtdHV0b3JpYWwucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXR1dG9yaWFsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMTRmZS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmVzb3VyY2UtdHV0b3JpYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXZpZGVvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS12aWRlby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDVjYWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3Jlc291cmNlLXZpZGVvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9yaWdodF9vZmYuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3JpZ2h0X29mZi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE3ZDJlZmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3JpZ2h0X29mZi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmlnaHRfb24uanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3JpZ2h0X29uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFhMmFmMS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvcmlnaHRfb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NhY19sb2dvLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zYWNfbG9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDExM2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NhY19sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zYWNfbG9nb0AyeC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2FjX2xvZ29AMngucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQwZjNmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zYWNfbG9nb0AyeC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2lkZW5hdi1ydWxlLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zaWRlbmF2LXJ1bGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWI5OTIwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zaWRlbmF2LXJ1bGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlXzEuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlXzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZDc1YmUxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV8xLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV8yLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV8yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWE5OTRjMi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfMy5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIwNGRlYjMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlXzMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlX2xhcmdlXzEuanBnIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlX2xhcmdlXzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhOTkyZTkyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9sYXJnZV8xLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9sYXJnZV8yLmpwZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9sYXJnZV8yLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWFmNjNmNC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfbGFyZ2VfMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfbGFyZ2VfMy5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfbGFyZ2VfMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjZjIzNmMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlX2xhcmdlXzMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3NsaWRlX29mZi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfb2ZmLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTk3MTIyNy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfb2ZmLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9vbi5qcGcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc2xpZGVfb24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Y2EzNTc3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zbGlkZV9vbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3BhY2VyLmdpZiBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zcGFjZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOTZiMzU1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zcGFjZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9jYWxsb3V0LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvY2FsbG91dC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDlmMzQuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9jYWxsb3V0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjEzLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiNmFjYS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19sYW5kX3NwYW4xMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19sYW5kX3NwYW44LnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjgucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE4MGJmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kZXZpY2VfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuNS5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19wb3J0X3NwYW41LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjY2MyZi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2RldmljZV9nYWxheHluZXh1c19ibGFua19wb3J0X3NwYW41LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGV2aWNlX2dhbGF4eW5leHVzX2JsYW5rX3BvcnRfc3BhbjkucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kZXZpY2VfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMDEzNWIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kZXZpY2VfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfZG93bi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMGE4ZWUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX2Rvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX2xlZnQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX2xlZnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODg3YjJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9sZWZ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9yaWdodC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQ3ZmE0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZGlzY2xvc3VyZV9yaWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfdXAucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9kaXNjbG9zdXJlX3VwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkNGVjOS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2Rpc2Nsb3N1cmVfdXAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9nb3RvdG9wLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvZ290b3RvcC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMDlhMjkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9nb3RvdG9wLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX2FjdGlvbi5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb19hY3Rpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU0Y2M3Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX2FjdGlvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb19nb29kLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX2dvb2QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmViZTFjLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX2dvb2QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fbW92aWVfaW5saW5lLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX21vdmllX2lubGluZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZmI1YzUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fbW92aWVfaW5saW5lLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3Bob25lX3RhYmxldC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb19waG9uZV90YWJsZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDNiODc2Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3Bob25lX3RhYmxldC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb191c2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fdXNlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NjhiMy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb191c2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fd2ViLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3dlYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDhlM2MuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9pY29fd2ViLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3dyb25nLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy9zdHlsZXMvaWNvX3dyb25nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkMDRjZS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL2ljb193cm9uZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL29wZW5fbmV3X3BhZ2UucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3N0eWxlcy9vcGVuX25ld19wYWdlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5N2UzYS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvc3R5bGVzL29wZW5fbmV3X3BhZ2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC1zbWFsbC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtY2xvc2VkLXNtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyMzY0YS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtY2xvc2VkLXNtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTY4ZDkuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtb3BlbmVkLXNtYWxsLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQtc21hbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWViNzg0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQtc21hbGwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmcgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtb3BlbmVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5ZjVmYS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdHJpYW5nbGUtb3BlbmVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy91aWd1aWRlbGluZXMxLnBuZyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2ltYWdlcy91aWd1aWRlbGluZXMxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlMTYxMS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdWlndWlkZWxpbmVzMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdmlkZW8tZHJvaWQucG5nIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvaW1hZ2VzL3ZpZGVvLWRyb2lkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxNjNiNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9pbWFnZXMvdmlkZW8tZHJvaWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvanMvYW5kcm9pZF8zcC1idW5kbGUuanMgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9qcy9hbmRyb2lkXzNwLWJ1bmRsZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3YjViMC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9qcy9hbmRyb2lkXzNwLWJ1bmRsZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDI3NjYgKzAsMCBAQAotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9wcmV0dGlmeS5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDYgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBzb21lIGZ1bmN0aW9ucyBmb3IgYnJvd3Nlci1zaWRlIHByZXR0eSBwcmludGluZyBvZiBjb2RlIGNvbnRhaW5lZCBpbiBodG1sLgotICogPHA+Ci0gKgotICogRm9yIGEgZmFpcmx5IGNvbXByZWhlbnNpdmUgc2V0IG9mIGxhbmd1YWdlcyBzZWUgdGhlCi0gKiA8YSBocmVmPSJodHRwOi8vZ29vZ2xlLWNvZGUtcHJldHRpZnkuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL1JFQURNRS5odG1sI2xhbmdzIj5SRUFETUU8L2E+Ci0gKiBmaWxlIHRoYXQgY2FtZSB3aXRoIHRoaXMgc291cmNlLiAgQXQgYSBtaW5pbXVtLCB0aGUgbGV4ZXIgc2hvdWxkIHdvcmsgb24gYQotICogbnVtYmVyIG9mIGxhbmd1YWdlcyBpbmNsdWRpbmcgQyBhbmQgZnJpZW5kcywgSmF2YSwgUHl0aG9uLCBCYXNoLCBTUUwsIEhUTUwsCi0gKiBYTUwsIENTUywgSmF2YXNjcmlwdCwgYW5kIE1ha2VmaWxlcy4gIEl0IHdvcmtzIHBhc3NhYmx5IG9uIFJ1YnksIFBIUCBhbmQgQXdrCi0gKiBhbmQgYSBzdWJzZXQgb2YgUGVybCwgYnV0LCBiZWNhdXNlIG9mIGNvbW1lbnRpbmcgY29udmVudGlvbnMsIGRvZXNuJ3Qgd29yayBvbgotICogU21hbGx0YWxrLCBMaXNwLWxpa2UsIG9yIENBTUwtbGlrZSBsYW5ndWFnZXMgd2l0aG91dCBhbiBleHBsaWNpdCBsYW5nIGNsYXNzLgotICogPHA+Ci0gKiBVc2FnZTogPG9sPgotICogPGxpPiBpbmNsdWRlIHRoaXMgc291cmNlIGZpbGUgaW4gYW4gaHRtbCBwYWdlIHZpYQotICogICB7QGNvZGUgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3BhdGgvdG8vcHJldHRpZnkuanMiPjwvc2NyaXB0Pn0KLSAqIDxsaT4gZGVmaW5lIHN0eWxlIHJ1bGVzLiAgU2VlIHRoZSBleGFtcGxlIHBhZ2UgZm9yIGV4YW1wbGVzLgotICogPGxpPiBtYXJrIHRoZSB7QGNvZGUgPHByZT59IGFuZCB7QGNvZGUgPGNvZGU+fSB0YWdzIGluIHlvdXIgc291cmNlIHdpdGgKLSAqICAgIHtAY29kZSBjbGFzcz1wcmV0dHlwcmludC59Ci0gKiAgICBZb3UgY2FuIGFsc28gdXNlIHRoZSAoaHRtbCBkZXByZWNhdGVkKSB7QGNvZGUgPHhtcD59IHRhZywgYnV0IHRoZSBwcmV0dHkKLSAqICAgIHByaW50ZXIgbmVlZHMgdG8gZG8gbW9yZSBzdWJzdGFudGlhbCBET00gbWFuaXB1bGF0aW9ucyB0byBzdXBwb3J0IHRoYXQsIHNvCi0gKiAgICBzb21lIGNzcyBzdHlsZXMgbWF5IG5vdCBiZSBwcmVzZXJ2ZWQuCi0gKiA8L29sPgotICogVGhhdCdzIGl0LiAgSSB3YW50ZWQgdG8ga2VlcCB0aGUgQVBJIGFzIHNpbXBsZSBhcyBwb3NzaWJsZSwgc28gdGhlcmUncyBubwotICogbmVlZCB0byBzcGVjaWZ5IHdoaWNoIGxhbmd1YWdlIHRoZSBjb2RlIGlzIGluLCBidXQgaWYgeW91IHdpc2gsIHlvdSBjYW4gYWRkCi0gKiBhbm90aGVyIGNsYXNzIHRvIHRoZSB7QGNvZGUgPHByZT59IG9yIHtAY29kZSA8Y29kZT59IGVsZW1lbnQgdG8gc3BlY2lmeSB0aGUKLSAqIGxhbmd1YWdlLCBhcyBpbiB7QGNvZGUgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1qYXZhIj59LiAgQW55IGNsYXNzIHRoYXQKLSAqIHN0YXJ0cyB3aXRoICJsYW5nLSIgZm9sbG93ZWQgYnkgYSBmaWxlIGV4dGVuc2lvbiwgc3BlY2lmaWVzIHRoZSBmaWxlIHR5cGUuCi0gKiBTZWUgdGhlICJsYW5nLSouanMiIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGZvciBjb2RlIHRoYXQgaW1wbGVtZW50cwotICogcGVyLWxhbmd1YWdlIGZpbGUgaGFuZGxlcnMuCi0gKiA8cD4KLSAqIENoYW5nZSBsb2c6PGJyPgotICogY2JldXN0LCAyMDA2LzA4LzIyCi0gKiA8YmxvY2txdW90ZT4KLSAqICAgSmF2YSBhbm5vdGF0aW9ucyAoc3RhcnQgd2l0aCAiQCIpIGFyZSBub3cgY2FwdHVyZWQgYXMgbGl0ZXJhbHMgKCJsaXQiKQotICogPC9ibG9ja3F1b3RlPgotICogQHJlcXVpcmVzIGNvbnNvbGUKLSAqLwotCi0vLyBKU0xpbnQgZGVjbGFyYXRpb25zCi0vKmdsb2JhbCBjb25zb2xlLCBkb2N1bWVudCwgbmF2aWdhdG9yLCBzZXRUaW1lb3V0LCB3aW5kb3cgKi8KLQotLyoqCi0gKiBTcGxpdCB7QGNvZGUgcHJldHR5UHJpbnR9IGludG8gbXVsdGlwbGUgdGltZW91dHMgc28gYXMgbm90IHRvIGludGVyZmVyZSB3aXRoCi0gKiBVSSBldmVudHMuCi0gKiBJZiBzZXQgdG8ge0Bjb2RlIGZhbHNlfSwge0Bjb2RlIHByZXR0eVByaW50KCl9IGlzIHN5bmNocm9ub3VzLgotICovCi13aW5kb3dbJ1BSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OJ10gPSB0cnVlOwotCi0vKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJldHdlZW4gdGFiIGNvbHVtbnMgKi8KLXdpbmRvd1snUFJfVEFCX1dJRFRIJ10gPSA4OwotCi0vKiogV2Fsa3MgdGhlIERPTSByZXR1cm5pbmcgYSBwcm9wZXJseSBlc2NhcGVkIHZlcnNpb24gb2YgaW5uZXJIVE1MLgotICAqIEBwYXJhbSB7Tm9kZX0gbm9kZQotICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IG91dCBvdXRwdXQgYnVmZmVyIHRoYXQgcmVjZWl2ZXMgY2h1bmtzIG9mIEhUTUwuCi0gICovCi13aW5kb3dbJ1BSX25vcm1hbGl6ZWRIdG1sJ10KLQotLyoqIENvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYW5kIHJlZ2lzdGVyaW5nIG5ldyBsYW5ndWFnZSBoYW5kbGVycy4KLSAgKiBAdHlwZSB7T2JqZWN0fQotICAqLwotICA9IHdpbmRvd1snUFInXQotCi0vKiogUHJldHR5IHByaW50IGEgY2h1bmsgb2YgY29kZS4KLSAgKgotICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VDb2RlSHRtbCBjb2RlIGFzIGh0bWwKLSAgKiBAcmV0dXJuIHtzdHJpbmd9IGNvZGUgYXMgaHRtbCwgYnV0IHByZXR0aWVyCi0gICovCi0gID0gd2luZG93WydwcmV0dHlQcmludE9uZSddCi0vKiogRmluZCBhbGwgdGhlIHtAY29kZSA8cHJlPn0gYW5kIHtAY29kZSA8Y29kZT59IHRhZ3MgaW4gdGhlIERPTSB3aXRoCi0gICoge0Bjb2RlIGNsYXNzPXByZXR0eXByaW50fSBhbmQgcHJldHRpZnkgdGhlbS4KLSAgKiBAcGFyYW0ge0Z1bmN0aW9uP30gb3B0X3doZW5Eb25lIGlmIHNwZWNpZmllZCwgY2FsbGVkIHdoZW4gdGhlIGxhc3QgZW50cnkKLSAgKiAgICAgaGFzIGJlZW4gZmluaXNoZWQuCi0gICovCi0gID0gd2luZG93WydwcmV0dHlQcmludCddID0gdm9pZCAwOwotCi0vKiogYnJvd3NlciBkZXRlY3Rpb24uIEBleHRlcm4gQHJldHVybnMgZmFsc2UgaWYgbm90IElFLCBvdGhlcndpc2UgdGhlIG1ham9yIHZlcnNpb24uICovCi13aW5kb3dbJ19wcl9pc0lFNiddID0gZnVuY3Rpb24gKCkgewotICB2YXIgaWVWZXJzaW9uID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYKLSAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1xiTVNJRSAoWzY3OF0pXC4vKTsKLSAgaWVWZXJzaW9uID0gaWVWZXJzaW9uID8gK2llVmVyc2lvblsxXSA6IGZhbHNlOwotICB3aW5kb3dbJ19wcl9pc0lFNiddID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaWVWZXJzaW9uOyB9OwotICByZXR1cm4gaWVWZXJzaW9uOwotfTsKLQotCi0oZnVuY3Rpb24gKCkgewotICAvLyBLZXl3b3JkIGxpc3RzIGZvciB2YXJpb3VzIGxhbmd1YWdlcy4KLSAgdmFyIEZMT1dfQ09OVFJPTF9LRVlXT1JEUyA9Ci0gICAgICAiYnJlYWsgY29udGludWUgZG8gZWxzZSBmb3IgaWYgcmV0dXJuIHdoaWxlICI7Ci0gIHZhciBDX0tFWVdPUkRTID0gRkxPV19DT05UUk9MX0tFWVdPUkRTICsgImF1dG8gY2FzZSBjaGFyIGNvbnN0IGRlZmF1bHQgIiArCi0gICAgICAiZG91YmxlIGVudW0gZXh0ZXJuIGZsb2F0IGdvdG8gaW50IGxvbmcgcmVnaXN0ZXIgc2hvcnQgc2lnbmVkIHNpemVvZiAiICsKLSAgICAgICJzdGF0aWMgc3RydWN0IHN3aXRjaCB0eXBlZGVmIHVuaW9uIHVuc2lnbmVkIHZvaWQgdm9sYXRpbGUgIjsKLSAgdmFyIENPTU1PTl9LRVlXT1JEUyA9IENfS0VZV09SRFMgKyAiY2F0Y2ggY2xhc3MgZGVsZXRlIGZhbHNlIGltcG9ydCAiICsKLSAgICAgICJuZXcgb3BlcmF0b3IgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHRoaXMgdGhyb3cgdHJ1ZSB0cnkgdHlwZW9mICI7Ci0gIHZhciBDUFBfS0VZV09SRFMgPSBDT01NT05fS0VZV09SRFMgKyAiYWxpZ25vZiBhbGlnbl91bmlvbiBhc20gYXhpb20gYm9vbCAiICsKLSAgICAgICJjb25jZXB0IGNvbmNlcHRfbWFwIGNvbnN0X2Nhc3QgY29uc3RleHByIGRlY2x0eXBlICIgKwotICAgICAgImR5bmFtaWNfY2FzdCBleHBsaWNpdCBleHBvcnQgZnJpZW5kIGlubGluZSBsYXRlX2NoZWNrICIgKwotICAgICAgIm11dGFibGUgbmFtZXNwYWNlIG51bGxwdHIgcmVpbnRlcnByZXRfY2FzdCBzdGF0aWNfYXNzZXJ0IHN0YXRpY19jYXN0ICIgKwotICAgICAgInRlbXBsYXRlIHR5cGVpZCB0eXBlbmFtZSB1c2luZyB2aXJ0dWFsIHdjaGFyX3Qgd2hlcmUgIjsKLSAgdmFyIEpBVkFfS0VZV09SRFMgPSBDT01NT05fS0VZV09SRFMgKwotICAgICAgImFic3RyYWN0IGJvb2xlYW4gYnl0ZSBleHRlbmRzIGZpbmFsIGZpbmFsbHkgaW1wbGVtZW50cyBpbXBvcnQgIiArCi0gICAgICAiaW5zdGFuY2VvZiBudWxsIG5hdGl2ZSBwYWNrYWdlIHN0cmljdGZwIHN1cGVyIHN5bmNocm9uaXplZCB0aHJvd3MgIiArCi0gICAgICAidHJhbnNpZW50ICI7Ci0gIHZhciBDU0hBUlBfS0VZV09SRFMgPSBKQVZBX0tFWVdPUkRTICsKLSAgICAgICJhcyBiYXNlIGJ5IGNoZWNrZWQgZGVjaW1hbCBkZWxlZ2F0ZSBkZXNjZW5kaW5nIGR5bmFtaWMgZXZlbnQgIiArCi0gICAgICAiZml4ZWQgZm9yZWFjaCBmcm9tIGdyb3VwIGltcGxpY2l0IGluIGludGVyZmFjZSBpbnRlcm5hbCBpbnRvIGlzIGxvY2sgIiArCi0gICAgICAib2JqZWN0IG91dCBvdmVycmlkZSBvcmRlcmJ5IHBhcmFtcyBwYXJ0aWFsIHJlYWRvbmx5IHJlZiBzYnl0ZSBzZWFsZWQgIiArCi0gICAgICAic3RhY2thbGxvYyBzdHJpbmcgc2VsZWN0IHVpbnQgdWxvbmcgdW5jaGVja2VkIHVuc2FmZSB1c2hvcnQgdmFyICI7Ci0gIHZhciBDT0ZGRUVfS0VZV09SRFMgPSAiYWxsIGFuZCBieSBjYXRjaCBjbGFzcyBlbHNlIGV4dGVuZHMgZmFsc2UgZmluYWxseSAiICsKLSAgICAgICJmb3IgaWYgaW4gaXMgaXNudCBsb29wIG5ldyBubyBub3QgbnVsbCBvZiBvZmYgb24gb3IgcmV0dXJuIHN1cGVyIHRoZW4gIiArCi0gICAgICAidHJ1ZSB0cnkgdW5sZXNzIHVudGlsIHdoZW4gd2hpbGUgeWVzICI7Ci0gIHZhciBKU0NSSVBUX0tFWVdPUkRTID0gQ09NTU9OX0tFWVdPUkRTICsKLSAgICAgICJkZWJ1Z2dlciBldmFsIGV4cG9ydCBmdW5jdGlvbiBnZXQgbnVsbCBzZXQgdW5kZWZpbmVkIHZhciB3aXRoICIgKwotICAgICAgIkluZmluaXR5IE5hTiAiOwotICB2YXIgUEVSTF9LRVlXT1JEUyA9ICJjYWxsZXIgZGVsZXRlIGRpZSBkbyBkdW1wIGVsc2lmIGV2YWwgZXhpdCBmb3JlYWNoIGZvciAiICsKLSAgICAgICJnb3RvIGlmIGltcG9ydCBsYXN0IGxvY2FsIG15IG5leHQgbm8gb3VyIHByaW50IHBhY2thZ2UgcmVkbyByZXF1aXJlICIgKwotICAgICAgInN1YiB1bmRlZiB1bmxlc3MgdW50aWwgdXNlIHdhbnRhcnJheSB3aGlsZSBCRUdJTiBFTkQgIjsKLSAgdmFyIFBZVEhPTl9LRVlXT1JEUyA9IEZMT1dfQ09OVFJPTF9LRVlXT1JEUyArICJhbmQgYXMgYXNzZXJ0IGNsYXNzIGRlZiBkZWwgIiArCi0gICAgICAiZWxpZiBleGNlcHQgZXhlYyBmaW5hbGx5IGZyb20gZ2xvYmFsIGltcG9ydCBpbiBpcyBsYW1iZGEgIiArCi0gICAgICAibm9ubG9jYWwgbm90IG9yIHBhc3MgcHJpbnQgcmFpc2UgdHJ5IHdpdGggeWllbGQgIiArCi0gICAgICAiRmFsc2UgVHJ1ZSBOb25lICI7Ci0gIHZhciBSVUJZX0tFWVdPUkRTID0gRkxPV19DT05UUk9MX0tFWVdPUkRTICsgImFsaWFzIGFuZCBiZWdpbiBjYXNlIGNsYXNzIGRlZiIgKwotICAgICAgIiBkZWZpbmVkIGVsc2lmIGVuZCBlbnN1cmUgZmFsc2UgaW4gbW9kdWxlIG5leHQgbmlsIG5vdCBvciByZWRvIHJlc2N1ZSAiICsKLSAgICAgICJyZXRyeSBzZWxmIHN1cGVyIHRoZW4gdHJ1ZSB1bmRlZiB1bmxlc3MgdW50aWwgd2hlbiB5aWVsZCBCRUdJTiBFTkQgIjsKLSAgdmFyIFNIX0tFWVdPUkRTID0gRkxPV19DT05UUk9MX0tFWVdPUkRTICsgImNhc2UgZG9uZSBlbGlmIGVzYWMgZXZhbCBmaSAiICsKLSAgICAgICJmdW5jdGlvbiBpbiBsb2NhbCBzZXQgdGhlbiB1bnRpbCAiOwotICB2YXIgQUxMX0tFWVdPUkRTID0gKAotICAgICAgQ1BQX0tFWVdPUkRTICsgQ1NIQVJQX0tFWVdPUkRTICsgSlNDUklQVF9LRVlXT1JEUyArIFBFUkxfS0VZV09SRFMgKwotICAgICAgUFlUSE9OX0tFWVdPUkRTICsgUlVCWV9LRVlXT1JEUyArIFNIX0tFWVdPUkRTKTsKLQotICAvLyB0b2tlbiBzdHlsZSBuYW1lcy4gIGNvcnJlc3BvbmQgdG8gY3NzIGNsYXNzZXMKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIHN0cmluZyBsaXRlcmFsICovCi0gIHZhciBQUl9TVFJJTkcgPSAnc3RyJzsKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIGtleXdvcmQgKi8KLSAgdmFyIFBSX0tFWVdPUkQgPSAna3dkJzsKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIGNvbW1lbnQgKi8KLSAgdmFyIFBSX0NPTU1FTlQgPSAnY29tJzsKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIHR5cGUgKi8KLSAgdmFyIFBSX1RZUEUgPSAndHlwJzsKLSAgLyoqIHRva2VuIHN0eWxlIGZvciBhIGxpdGVyYWwgdmFsdWUuICBlLmcuIDEsIG51bGwsIHRydWUuICovCi0gIHZhciBQUl9MSVRFUkFMID0gJ2xpdCc7Ci0gIC8qKiB0b2tlbiBzdHlsZSBmb3IgYSBwdW5jdHVhdGlvbiBzdHJpbmcuICovCi0gIHZhciBQUl9QVU5DVFVBVElPTiA9ICdwdW4nOwotICAvKiogdG9rZW4gc3R5bGUgZm9yIGEgcHVuY3R1YXRpb24gc3RyaW5nLiAqLwotICB2YXIgUFJfUExBSU4gPSAncGxuJzsKLQotICAvKiogdG9rZW4gc3R5bGUgZm9yIGFuIHNnbWwgdGFnLiAqLwotICB2YXIgUFJfVEFHID0gJ3RhZyc7Ci0gIC8qKiB0b2tlbiBzdHlsZSBmb3IgYSBtYXJrdXAgZGVjbGFyYXRpb24gc3VjaCBhcyBhIERPQ1RZUEUuICovCi0gIHZhciBQUl9ERUNMQVJBVElPTiA9ICdkZWMnOwotICAvKiogdG9rZW4gc3R5bGUgZm9yIGVtYmVkZGVkIHNvdXJjZS4gKi8KLSAgdmFyIFBSX1NPVVJDRSA9ICdzcmMnOwotICAvKiogdG9rZW4gc3R5bGUgZm9yIGFuIHNnbWwgYXR0cmlidXRlIG5hbWUuICovCi0gIHZhciBQUl9BVFRSSUJfTkFNRSA9ICdhdG4nOwotICAvKiogdG9rZW4gc3R5bGUgZm9yIGFuIHNnbWwgYXR0cmlidXRlIHZhbHVlLiAqLwotICB2YXIgUFJfQVRUUklCX1ZBTFVFID0gJ2F0dic7Ci0KLSAgLyoqCi0gICAqIEEgY2xhc3MgdGhhdCBpbmRpY2F0ZXMgYSBzZWN0aW9uIG9mIG1hcmt1cCB0aGF0IGlzIG5vdCBjb2RlLCBlLmcuIHRvIGFsbG93Ci0gICAqIGVtYmVkZGluZyBvZiBsaW5lIG51bWJlcnMgd2l0aGluIGNvZGUgbGlzdGluZ3MuCi0gICAqLwotICB2YXIgUFJfTk9DT0RFID0gJ25vY29kZSc7Ci0KLSAgLyoqIEEgc2V0IG9mIHRva2VucyB0aGF0IGNhbiBwcmVjZWRlIGEgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwgaW4KLSAgICAqIGphdmFzY3JpcHQuCi0gICAgKiBodHRwOi8vd3d3Lm1vemlsbGEub3JnL2pzL2xhbmd1YWdlL2pzMjAvcmF0aW9uYWxlL3N5bnRheC5odG1sIGhhcyB0aGUgZnVsbAotICAgICogbGlzdCwgYnV0IEkndmUgcmVtb3ZlZCBvbmVzIHRoYXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgd2hlbiBzZWVuIGluCi0gICAgKiBsYW5ndWFnZXMgdGhhdCBkb24ndCBzdXBwb3J0IHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFscy4KLSAgICAqCi0gICAgKiA8cD5TcGVjaWZpY2FsbHksIEkndmUgcmVtb3ZlZCBhbnkga2V5d29yZHMgdGhhdCBjYW4ndCBwcmVjZWRlIGEgcmVnZXhwCi0gICAgKiBsaXRlcmFsIGluIGEgc3ludGFjdGljYWxseSBsZWdhbCBqYXZhc2NyaXB0IHByb2dyYW0sIGFuZCBJJ3ZlIHJlbW92ZWQgdGhlCi0gICAgKiAiaW4iIGtleXdvcmQgc2luY2UgaXQncyBub3QgYSBrZXl3b3JkIGluIG1hbnkgbGFuZ3VhZ2VzLCBhbmQgbWlnaHQgYmUgdXNlZAotICAgICogYXMgYSBjb3VudCBvZiBpbmNoZXMuCi0gICAgKgotICAgICogPHA+VGhlIGxpbmsgYSBhYm92ZSBkb2VzIG5vdCBhY2N1cmF0ZWx5IGRlc2NyaWJlIEVjbWFTY3JpcHQgcnVsZXMgc2luY2UKLSAgICAqIGl0IGZhaWxzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gKGE9KysvYi9pKSBhbmQgKGErKy9iL2kpIGJ1dCBpdCB3b3JrcwotICAgICogdmVyeSB3ZWxsIGluIHByYWN0aWNlLgotICAgICoKLSAgICAqIEBwcml2YXRlCi0gICAgKi8KLSAgdmFyIFJFR0VYUF9QUkVDRURFUl9QQVRURVJOID0gZnVuY3Rpb24gKCkgewotICAgICAgdmFyIHByZWNlZGVycyA9IFsKLSAgICAgICAgICAiISIsICIhPSIsICIhPT0iLCAiIyIsICIlIiwgIiU9IiwgIiYiLCAiJiYiLCAiJiY9IiwKLSAgICAgICAgICAiJj0iLCAiKCIsICIqIiwgIio9IiwgLyogIisiLCAqLyAiKz0iLCAiLCIsIC8qICItIiwgKi8gIi09IiwKLSAgICAgICAgICAiLT4iLCAvKiIuIiwgIi4uIiwgIi4uLiIsIGhhbmRsZWQgYmVsb3cgKi8gIi8iLCAiLz0iLCAiOiIsICI6OiIsICI7IiwKLSAgICAgICAgICAiPCIsICI8PCIsICI8PD0iLCAiPD0iLCAiPSIsICI9PSIsICI9PT0iLCAiPiIsCi0gICAgICAgICAgIj49IiwgIj4+IiwgIj4+PSIsICI+Pj4iLCAiPj4+PSIsICI/IiwgIkAiLCAiWyIsCi0gICAgICAgICAgIl4iLCAiXj0iLCAiXl4iLCAiXl49IiwgInsiLCAifCIsICJ8PSIsICJ8fCIsCi0gICAgICAgICAgInx8PSIsICJ+IiAvKiBoYW5kbGVzID1+IGFuZCAhfiAqLywKLSAgICAgICAgICAiYnJlYWsiLCAiY2FzZSIsICJjb250aW51ZSIsICJkZWxldGUiLAotICAgICAgICAgICJkbyIsICJlbHNlIiwgImZpbmFsbHkiLCAiaW5zdGFuY2VvZiIsCi0gICAgICAgICAgInJldHVybiIsICJ0aHJvdyIsICJ0cnkiLCAidHlwZW9mIgotICAgICAgICAgIF07Ci0gICAgICB2YXIgcGF0dGVybiA9ICcoPzpeXnxbKy1dJzsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlY2VkZXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgIHBhdHRlcm4gKz0gJ3wnICsgcHJlY2VkZXJzW2ldLnJlcGxhY2UoLyhbXj08PjomYS16XSkvZywgJ1xcJDEnKTsKLSAgICAgIH0KLSAgICAgIHBhdHRlcm4gKz0gJylcXHMqJzsgIC8vIG1hdGNoZXMgYXQgZW5kLCBhbmQgbWF0Y2hlcyBlbXB0eSBzdHJpbmcKLSAgICAgIHJldHVybiBwYXR0ZXJuOwotICAgICAgLy8gQ0FWRUFUOiB0aGlzIGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIHJlZ3VsYXIKLSAgICAgIC8vIGV4cHJlc3Npb24gaW1tZWRpYXRlbHkgZm9sbG93cyBhbm90aGVyIHNpbmNlIGEgcmVndWxhciBleHByZXNzaW9uIG1heQotICAgICAgLy8gaGF2ZSBmbGFncyBmb3IgY2FzZS1zZW5zaXRpdml0eSBhbmQgdGhlIGxpa2UuICBIYXZpbmcgcmVnZXhwIHRva2VucwotICAgICAgLy8gYWRqYWNlbnQgaXMgbm90IHZhbGlkIGluIGFueSBsYW5ndWFnZSBJJ20gYXdhcmUgb2YsIHNvIEknbSBwdW50aW5nLgotICAgICAgLy8gVE9ETzogbWF5YmUgc3R5bGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluc2lkZSBhIHJlZ2V4cCBhcyBwdW5jdHVhdGlvbi4KLSAgICB9KCk7Ci0KLSAgLy8gRGVmaW5lIHJlZ2V4cHMgaGVyZSBzbyB0aGF0IHRoZSBpbnRlcnByZXRlciBkb2Vzbid0IGhhdmUgdG8gY3JlYXRlIGFuCi0gIC8vIG9iamVjdCBlYWNoIHRpbWUgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlbSBpcyBjYWxsZWQuCi0gIC8vIFRoZSBsYW5ndWFnZSBzcGVjIHJlcXVpcmVzIGEgbmV3IG9iamVjdCBjcmVhdGVkIGV2ZW4gaWYgeW91IGRvbid0IGFjY2VzcwotICAvLyB0aGUgJDEgbWVtYmVycy4KLSAgdmFyIHByX2FtcCA9IC8mL2c7Ci0gIHZhciBwcl9sdCA9IC88L2c7Ci0gIHZhciBwcl9ndCA9IC8+L2c7Ci0gIHZhciBwcl9xdW90ID0gL1wiL2c7Ci0gIC8qKiBsaWtlIHRleHRUb0h0bWwgYnV0IGVzY2FwZXMgZG91YmxlIHF1b3RlcyB0byBiZSBhdHRyaWJ1dGUgc2FmZS4gKi8KLSAgZnVuY3Rpb24gYXR0cmliVG9IdG1sKHN0cikgewotICAgIHJldHVybiBzdHIucmVwbGFjZShwcl9hbXAsICcmYW1wOycpCi0gICAgICAgIC5yZXBsYWNlKHByX2x0LCAnJmx0OycpCi0gICAgICAgIC5yZXBsYWNlKHByX2d0LCAnJmd0OycpCi0gICAgICAgIC5yZXBsYWNlKHByX3F1b3QsICcmcXVvdDsnKTsKLSAgfQotCi0gIC8qKiBlc2NhcGVzdCBodG1sIHNwZWNpYWwgY2hhcmFjdGVycyB0byBodG1sLiAqLwotICBmdW5jdGlvbiB0ZXh0VG9IdG1sKHN0cikgewotICAgIHJldHVybiBzdHIucmVwbGFjZShwcl9hbXAsICcmYW1wOycpCi0gICAgICAgIC5yZXBsYWNlKHByX2x0LCAnJmx0OycpCi0gICAgICAgIC5yZXBsYWNlKHByX2d0LCAnJmd0OycpOwotICB9Ci0KLQotICB2YXIgcHJfbHRFbnQgPSAvJmx0Oy9nOwotICB2YXIgcHJfZ3RFbnQgPSAvJmd0Oy9nOwotICB2YXIgcHJfYXBvc0VudCA9IC8mYXBvczsvZzsKLSAgdmFyIHByX3F1b3RFbnQgPSAvJnF1b3Q7L2c7Ci0gIHZhciBwcl9hbXBFbnQgPSAvJmFtcDsvZzsKLSAgdmFyIHByX25ic3BFbnQgPSAvJm5ic3A7L2c7Ci0gIC8qKiB1bmVzY2FwZXMgaHRtbCB0byBwbGFpbiB0ZXh0LiAqLwotICBmdW5jdGlvbiBodG1sVG9UZXh0KGh0bWwpIHsKLSAgICB2YXIgcG9zID0gaHRtbC5pbmRleE9mKCcmJyk7Ci0gICAgaWYgKHBvcyA8IDApIHsgcmV0dXJuIGh0bWw7IH0KLSAgICAvLyBIYW5kbGUgbnVtZXJpYyBlbnRpdGllcyBzcGVjaWFsbHkuICBXZSBjYW4ndCB1c2UgZnVuY3Rpb25hbCBzdWJzdGl0dXRpb24KLSAgICAvLyBzaW5jZSB0aGF0IGRvZXNuJ3Qgd29yayBpbiBvbGRlciB2ZXJzaW9ucyBvZiBTYWZhcmkuCi0gICAgLy8gVGhlc2Ugc2hvdWxkIGJlIHJhcmUgc2luY2UgbW9zdCBicm93c2VycyBjb252ZXJ0IHRoZW0gdG8gbm9ybWFsIGNoYXJzLgotICAgIGZvciAoLS1wb3M7IChwb3MgPSBodG1sLmluZGV4T2YoJyYjJywgcG9zICsgMSkpID49IDA7KSB7Ci0gICAgICB2YXIgZW5kID0gaHRtbC5pbmRleE9mKCc7JywgcG9zKTsKLSAgICAgIGlmIChlbmQgPj0gMCkgewotICAgICAgICB2YXIgbnVtID0gaHRtbC5zdWJzdHJpbmcocG9zICsgMywgZW5kKTsKLSAgICAgICAgdmFyIHJhZGl4ID0gMTA7Ci0gICAgICAgIGlmIChudW0gJiYgbnVtLmNoYXJBdCgwKSA9PT0gJ3gnKSB7Ci0gICAgICAgICAgbnVtID0gbnVtLnN1YnN0cmluZygxKTsKLSAgICAgICAgICByYWRpeCA9IDE2OwotICAgICAgICB9Ci0gICAgICAgIHZhciBjb2RlUG9pbnQgPSBwYXJzZUludChudW0sIHJhZGl4KTsKLSAgICAgICAgaWYgKCFpc05hTihjb2RlUG9pbnQpKSB7Ci0gICAgICAgICAgaHRtbCA9IChodG1sLnN1YnN0cmluZygwLCBwb3MpICsgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpICsKLSAgICAgICAgICAgICAgICAgIGh0bWwuc3Vic3RyaW5nKGVuZCArIDEpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBodG1sLnJlcGxhY2UocHJfbHRFbnQsICc8JykKLSAgICAgICAgLnJlcGxhY2UocHJfZ3RFbnQsICc+JykKLSAgICAgICAgLnJlcGxhY2UocHJfYXBvc0VudCwgIiciKQotICAgICAgICAucmVwbGFjZShwcl9xdW90RW50LCAnIicpCi0gICAgICAgIC5yZXBsYWNlKHByX25ic3BFbnQsICcgJykKLSAgICAgICAgLnJlcGxhY2UocHJfYW1wRW50LCAnJicpOwotICB9Ci0KLSAgLyoqIGlzIHRoZSBnaXZlbiBub2RlJ3MgaW5uZXJIVE1MIG5vcm1hbGx5IHVuZXNjYXBlZD8gKi8KLSAgZnVuY3Rpb24gaXNSYXdDb250ZW50KG5vZGUpIHsKLSAgICByZXR1cm4gJ1hNUCcgPT09IG5vZGUudGFnTmFtZTsKLSAgfQotCi0gIHZhciBuZXdsaW5lUmUgPSAvW1xyXG5dL2c7Ci0gIC8qKgotICAgKiBBcmUgbmV3bGluZXMgYW5kIGFkamFjZW50IHNwYWNlcyBzaWduaWZpY2FudCBpbiB0aGUgZ2l2ZW4gbm9kZSdzIGlubmVySFRNTD8KLSAgICovCi0gIGZ1bmN0aW9uIGlzUHJlZm9ybWF0dGVkKG5vZGUsIGNvbnRlbnQpIHsKLSAgICAvLyBQUkUgbWVhbnMgcHJlZm9ybWF0dGVkLCBhbmQgaXMgYSB2ZXJ5IGNvbW1vbiBjYXNlLCBzbyBkb24ndCBjcmVhdGUKLSAgICAvLyB1bm5lY2Vzc2FyeSBjb21wdXRlZCBzdHlsZSBvYmplY3RzLgotICAgIGlmICgnUFJFJyA9PT0gbm9kZS50YWdOYW1lKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgaWYgKCFuZXdsaW5lUmUudGVzdChjb250ZW50KSkgeyByZXR1cm4gdHJ1ZTsgfSAgLy8gRG9uJ3QgY2FyZQotICAgIHZhciB3aGl0ZXNwYWNlID0gJyc7Ci0gICAgLy8gRm9yIGRpc2Nvbm5lY3RlZCBub2RlcywgSUUgaGFzIG5vIGN1cnJlbnRTdHlsZS4KLSAgICBpZiAobm9kZS5jdXJyZW50U3R5bGUpIHsKLSAgICAgIHdoaXRlc3BhY2UgPSBub2RlLmN1cnJlbnRTdHlsZS53aGl0ZVNwYWNlOwotICAgIH0gZWxzZSBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUpIHsKLSAgICAgIC8vIEZpcmVmb3ggbWFrZXMgYSBiZXN0IGd1ZXNzIGlmIG5vZGUgaXMgZGlzY29ubmVjdGVkIHdoZXJlYXMgU2FmYXJpCi0gICAgICAvLyByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuCi0gICAgICB3aGl0ZXNwYWNlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkud2hpdGVTcGFjZTsKLSAgICB9Ci0gICAgcmV0dXJuICF3aGl0ZXNwYWNlIHx8IHdoaXRlc3BhY2UgPT09ICdwcmUnOwotICB9Ci0KLSAgZnVuY3Rpb24gbm9ybWFsaXplZEh0bWwobm9kZSwgb3V0LCBvcHRfc29ydEF0dHJzKSB7Ci0gICAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7Ci0gICAgICBjYXNlIDE6ICAvLyBhbiBlbGVtZW50Ci0gICAgICAgIHZhciBuYW1lID0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgb3V0LnB1c2goJzwnLCBuYW1lKTsKLSAgICAgICAgdmFyIGF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzOwotICAgICAgICB2YXIgbiA9IGF0dHJzLmxlbmd0aDsKLSAgICAgICAgaWYgKG4pIHsKLSAgICAgICAgICBpZiAob3B0X3NvcnRBdHRycykgewotICAgICAgICAgICAgdmFyIHNvcnRlZEF0dHJzID0gW107Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gbjsgLS1pID49IDA7KSB7IHNvcnRlZEF0dHJzW2ldID0gYXR0cnNbaV07IH0KLSAgICAgICAgICAgIHNvcnRlZEF0dHJzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGEubmFtZSA8IGIubmFtZSkgPyAtMSA6IGEubmFtZSA9PT0gYi5uYW1lID8gMCA6IDE7Ci0gICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYXR0cnMgPSBzb3J0ZWRBdHRyczsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIHZhciBhdHRyID0gYXR0cnNbaV07Ci0gICAgICAgICAgICBpZiAoIWF0dHIuc3BlY2lmaWVkKSB7IGNvbnRpbnVlOyB9Ci0gICAgICAgICAgICBvdXQucHVzaCgnICcsIGF0dHIubmFtZS50b0xvd2VyQ2FzZSgpLAotICAgICAgICAgICAgICAgICAgICAgJz0iJywgYXR0cmliVG9IdG1sKGF0dHIudmFsdWUpLCAnIicpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvdXQucHVzaCgnPicpOwotICAgICAgICBmb3IgKHZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcpIHsKLSAgICAgICAgICBub3JtYWxpemVkSHRtbChjaGlsZCwgb3V0LCBvcHRfc29ydEF0dHJzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZS5maXJzdENoaWxkIHx8ICEvXig/OmJyfGxpbmt8aW1nKSQvLnRlc3QobmFtZSkpIHsKLSAgICAgICAgICBvdXQucHVzaCgnPFwvJywgbmFtZSwgJz4nKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzogY2FzZSA0OiAvLyB0ZXh0Ci0gICAgICAgIG91dC5wdXNoKHRleHRUb0h0bWwobm9kZS5ub2RlVmFsdWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgZ3JvdXAgb2Yge0BsaW5rIFJlZ0V4cH1zLCByZXR1cm5zIGEge0Bjb2RlIFJlZ0V4cH0gdGhhdCBnbG9iYWxseQotICAgKiBtYXRjaGVzIHRoZSB1bmlvbiBvIHRoZSBzZXRzIG8gc3RyaW5ncyBtYXRjaGVkIGQgYnkgdGhlIGlucHV0IFJlZ0V4cC4KLSAgICogU2luY2UgaXQgbWF0Y2hlcyBnbG9iYWxseSwgaWYgdGhlIGlucHV0IHN0cmluZ3MgaGF2ZSBhIHN0YXJ0LW9mLWlucHV0Ci0gICAqIGFuY2hvciAoL14uLi4vKSwgaXQgaXMgaWdub3JlZCBmb3IgdGhlIHB1cnBvc2VzIG9mIHVuaW9uaW5nLgotICAgKiBAcGFyYW0ge0FycmF5LjxSZWdFeHA+fSByZWdleHMgbm9uIG11bHRpbGluZSwgbm9uLWdsb2JhbCByZWdleHMuCi0gICAqIEByZXR1cm4ge1JlZ0V4cH0gYSBnbG9iYWwgcmVnZXguCi0gICAqLwotICBmdW5jdGlvbiBjb21iaW5lUHJlZml4UGF0dGVybnMocmVnZXhzKSB7Ci0gICAgdmFyIGNhcHR1cmVkR3JvdXBJbmRleCA9IDA7Ci0KLSAgICB2YXIgbmVlZFRvRm9sZENhc2UgPSBmYWxzZTsKLSAgICB2YXIgaWdub3JlQ2FzZSA9IGZhbHNlOwotICAgIGZvciAodmFyIGkgPSAwLCBuID0gcmVnZXhzLmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgdmFyIHJlZ2V4ID0gcmVnZXhzW2ldOwotICAgICAgaWYgKHJlZ2V4Lmlnbm9yZUNhc2UpIHsKLSAgICAgICAgaWdub3JlQ2FzZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKC9bYS16XS9pLnRlc3QocmVnZXguc291cmNlLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgICAgICAvXFx1WzAtOWEtZl17NH18XFx4WzAtOWEtZl17Mn18XFxbXnV4XS9naSwgJycpKSkgewotICAgICAgICBuZWVkVG9Gb2xkQ2FzZSA9IHRydWU7Ci0gICAgICAgIGlnbm9yZUNhc2UgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gZGVjb2RlRXNjYXBlKGNoYXJzZXRQYXJ0KSB7Ci0gICAgICBpZiAoY2hhcnNldFBhcnQuY2hhckF0KDApICE9PSAnXFwnKSB7IHJldHVybiBjaGFyc2V0UGFydC5jaGFyQ29kZUF0KDApOyB9Ci0gICAgICBzd2l0Y2ggKGNoYXJzZXRQYXJ0LmNoYXJBdCgxKSkgewotICAgICAgICBjYXNlICdiJzogcmV0dXJuIDg7Ci0gICAgICAgIGNhc2UgJ3QnOiByZXR1cm4gOTsKLSAgICAgICAgY2FzZSAnbic6IHJldHVybiAweGE7Ci0gICAgICAgIGNhc2UgJ3YnOiByZXR1cm4gMHhiOwotICAgICAgICBjYXNlICdmJzogcmV0dXJuIDB4YzsKLSAgICAgICAgY2FzZSAncic6IHJldHVybiAweGQ7Ci0gICAgICAgIGNhc2UgJ3UnOiBjYXNlICd4JzoKLSAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoY2hhcnNldFBhcnQuc3Vic3RyaW5nKDIpLCAxNikKLSAgICAgICAgICAgICAgfHwgY2hhcnNldFBhcnQuY2hhckNvZGVBdCgxKTsKLSAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotICAgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgotICAgICAgICAgIHJldHVybiBwYXJzZUludChjaGFyc2V0UGFydC5zdWJzdHJpbmcoMSksIDgpOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gY2hhcnNldFBhcnQuY2hhckNvZGVBdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBlbmNvZGVFc2NhcGUoY2hhckNvZGUpIHsKLSAgICAgIGlmIChjaGFyQ29kZSA8IDB4MjApIHsKLSAgICAgICAgcmV0dXJuIChjaGFyQ29kZSA8IDB4MTAgPyAnXFx4MCcgOiAnXFx4JykgKyBjaGFyQ29kZS50b1N0cmluZygxNik7Ci0gICAgICB9Ci0gICAgICB2YXIgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTsKLSAgICAgIGlmIChjaCA9PT0gJ1xcJyB8fCBjaCA9PT0gJy0nIHx8IGNoID09PSAnWycgfHwgY2ggPT09ICddJykgewotICAgICAgICBjaCA9ICdcXCcgKyBjaDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjaDsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBjYXNlRm9sZENoYXJzZXQoY2hhclNldCkgewotICAgICAgdmFyIGNoYXJzZXRQYXJ0cyA9IGNoYXJTZXQuc3Vic3RyaW5nKDEsIGNoYXJTZXQubGVuZ3RoIC0gMSkubWF0Y2goCi0gICAgICAgICAgbmV3IFJlZ0V4cCgKLSAgICAgICAgICAgICAgJ1xcXFx1WzAtOUEtRmEtZl17NH0nCi0gICAgICAgICAgICAgICsgJ3xcXFxceFswLTlBLUZhLWZdezJ9JwotICAgICAgICAgICAgICArICd8XFxcXFswLTNdWzAtN117MCwyfScKLSAgICAgICAgICAgICAgKyAnfFxcXFxbMC03XXsxLDJ9JwotICAgICAgICAgICAgICArICd8XFxcXFtcXHNcXFNdJwotICAgICAgICAgICAgICArICd8LScKLSAgICAgICAgICAgICAgKyAnfFteLVxcXFxdJywKLSAgICAgICAgICAgICAgJ2cnKSk7Ci0gICAgICB2YXIgZ3JvdXBzID0gW107Ci0gICAgICB2YXIgcmFuZ2VzID0gW107Ci0gICAgICB2YXIgaW52ZXJzZSA9IGNoYXJzZXRQYXJ0c1swXSA9PT0gJ14nOwotICAgICAgZm9yICh2YXIgaSA9IGludmVyc2UgPyAxIDogMCwgbiA9IGNoYXJzZXRQYXJ0cy5sZW5ndGg7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgdmFyIHAgPSBjaGFyc2V0UGFydHNbaV07Ci0gICAgICAgIHN3aXRjaCAocCkgewotICAgICAgICAgIGNhc2UgJ1xcQic6IGNhc2UgJ1xcYic6Ci0gICAgICAgICAgY2FzZSAnXFxEJzogY2FzZSAnXFxkJzoKLSAgICAgICAgICBjYXNlICdcXFMnOiBjYXNlICdcXHMnOgotICAgICAgICAgIGNhc2UgJ1xcVyc6IGNhc2UgJ1xcdyc6Ci0gICAgICAgICAgICBncm91cHMucHVzaChwKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHZhciBzdGFydCA9IGRlY29kZUVzY2FwZShwKTsKLSAgICAgICAgdmFyIGVuZDsKLSAgICAgICAgaWYgKGkgKyAyIDwgbiAmJiAnLScgPT09IGNoYXJzZXRQYXJ0c1tpICsgMV0pIHsKLSAgICAgICAgICBlbmQgPSBkZWNvZGVFc2NhcGUoY2hhcnNldFBhcnRzW2kgKyAyXSk7Ci0gICAgICAgICAgaSArPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGVuZCA9IHN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIHJhbmdlcy5wdXNoKFtzdGFydCwgZW5kXSk7Ci0gICAgICAgIC8vIElmIHRoZSByYW5nZSBtaWdodCBpbnRlcnNlY3QgbGV0dGVycywgdGhlbiBleHBhbmQgaXQuCi0gICAgICAgIGlmICghKGVuZCA8IDY1IHx8IHN0YXJ0ID4gMTIyKSkgewotICAgICAgICAgIGlmICghKGVuZCA8IDY1IHx8IHN0YXJ0ID4gOTApKSB7Ci0gICAgICAgICAgICByYW5nZXMucHVzaChbTWF0aC5tYXgoNjUsIHN0YXJ0KSB8IDMyLCBNYXRoLm1pbihlbmQsIDkwKSB8IDMyXSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICghKGVuZCA8IDk3IHx8IHN0YXJ0ID4gMTIyKSkgewotICAgICAgICAgICAgcmFuZ2VzLnB1c2goW01hdGgubWF4KDk3LCBzdGFydCkgJiB+MzIsIE1hdGgubWluKGVuZCwgMTIyKSAmIH4zMl0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBbWzEsIDEwXSwgWzMsIDRdLCBbOCwgMTJdLCBbMTQsIDE0XSwgWzE2LCAxNl0sIFsxNywgMTddXQotICAgICAgLy8gLT4gW1sxLCAxMl0sIFsxNCwgMTRdLCBbMTYsIDE3XV0KLSAgICAgIHJhbmdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiAoYVswXSAtIGJbMF0pIHx8IChiWzFdICAtIGFbMV0pOyB9KTsKLSAgICAgIHZhciBjb25zb2xpZGF0ZWRSYW5nZXMgPSBbXTsKLSAgICAgIHZhciBsYXN0UmFuZ2UgPSBbTmFOLCBOYU5dOwotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldOwotICAgICAgICBpZiAocmFuZ2VbMF0gPD0gbGFzdFJhbmdlWzFdICsgMSkgewotICAgICAgICAgIGxhc3RSYW5nZVsxXSA9IE1hdGgubWF4KGxhc3RSYW5nZVsxXSwgcmFuZ2VbMV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNvbnNvbGlkYXRlZFJhbmdlcy5wdXNoKGxhc3RSYW5nZSA9IHJhbmdlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB2YXIgb3V0ID0gWydbJ107Ci0gICAgICBpZiAoaW52ZXJzZSkgeyBvdXQucHVzaCgnXicpOyB9Ci0gICAgICBvdXQucHVzaC5hcHBseShvdXQsIGdyb3Vwcyk7Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnNvbGlkYXRlZFJhbmdlcy5sZW5ndGg7ICsraSkgewotICAgICAgICB2YXIgcmFuZ2UgPSBjb25zb2xpZGF0ZWRSYW5nZXNbaV07Ci0gICAgICAgIG91dC5wdXNoKGVuY29kZUVzY2FwZShyYW5nZVswXSkpOwotICAgICAgICBpZiAocmFuZ2VbMV0gPiByYW5nZVswXSkgewotICAgICAgICAgIGlmIChyYW5nZVsxXSArIDEgPiByYW5nZVswXSkgeyBvdXQucHVzaCgnLScpOyB9Ci0gICAgICAgICAgb3V0LnB1c2goZW5jb2RlRXNjYXBlKHJhbmdlWzFdKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG91dC5wdXNoKCddJyk7Ci0gICAgICByZXR1cm4gb3V0LmpvaW4oJycpOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIGFsbG93QW55d2hlcmVGb2xkQ2FzZUFuZFJlbnVtYmVyR3JvdXBzKHJlZ2V4KSB7Ci0gICAgICAvLyBTcGxpdCBpbnRvIGNoYXJhY3RlciBzZXRzLCBlc2NhcGUgc2VxdWVuY2VzLCBwdW5jdHVhdGlvbiBzdHJpbmdzCi0gICAgICAvLyBsaWtlICgnKCcsICcoPzonLCAnKScsICdeJyksIGFuZCBydW5zIG9mIGNoYXJhY3RlcnMgdGhhdCBkbyBub3QKLSAgICAgIC8vIGluY2x1ZGUgYW55IG9mIHRoZSBhYm92ZS4KLSAgICAgIHZhciBwYXJ0cyA9IHJlZ2V4LnNvdXJjZS5tYXRjaCgKLSAgICAgICAgICBuZXcgUmVnRXhwKAotICAgICAgICAgICAgICAnKD86JwotICAgICAgICAgICAgICArICdcXFsoPzpbXlxceDVDXFx4NURdfFxcXFxbXFxzXFxTXSkqXFxdJyAgLy8gYSBjaGFyYWN0ZXIgc2V0Ci0gICAgICAgICAgICAgICsgJ3xcXFxcdVtBLUZhLWYwLTldezR9JyAgLy8gYSB1bmljb2RlIGVzY2FwZQotICAgICAgICAgICAgICArICd8XFxcXHhbQS1GYS1mMC05XXsyfScgIC8vIGEgaGV4IGVzY2FwZQotICAgICAgICAgICAgICArICd8XFxcXFswLTldKycgIC8vIGEgYmFjay1yZWZlcmVuY2Ugb3Igb2N0YWwgZXNjYXBlCi0gICAgICAgICAgICAgICsgJ3xcXFxcW151eDAtOV0nICAvLyBvdGhlciBlc2NhcGUgc2VxdWVuY2UKLSAgICAgICAgICAgICAgKyAnfFxcKFxcP1s6IT1dJyAgLy8gc3RhcnQgb2YgYSBub24tY2FwdHVyaW5nIGdyb3VwCi0gICAgICAgICAgICAgICsgJ3xbXFwoXFwpXFxeXScgIC8vIHN0YXJ0L2VtZCBvZiBhIGdyb3VwLCBvciBsaW5lIHN0YXJ0Ci0gICAgICAgICAgICAgICsgJ3xbXlxceDVCXFx4NUNcXChcXClcXF5dKycgIC8vIHJ1biBvZiBvdGhlciBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICsgJyknLAotICAgICAgICAgICAgICAnZycpKTsKLSAgICAgIHZhciBuID0gcGFydHMubGVuZ3RoOwotCi0gICAgICAvLyBNYXBzIGNhcHR1cmVkIGdyb3VwIG51bWJlcnMgdG8gdGhlIG51bWJlciB0aGV5IHdpbGwgb2NjdXB5IGluCi0gICAgICAvLyB0aGUgb3V0cHV0IG9yIHRvIC0xIGlmIHRoYXQgaGFzIG5vdCBiZWVuIGRldGVybWluZWQsIG9yIHRvCi0gICAgICAvLyB1bmRlZmluZWQgaWYgdGhleSBuZWVkIG5vdCBiZSBjYXB0dXJpbmcgaW4gdGhlIG91dHB1dC4KLSAgICAgIHZhciBjYXB0dXJlZEdyb3VwcyA9IFtdOwotCi0gICAgICAvLyBXYWxrIG92ZXIgYW5kIGlkZW50aWZ5IGJhY2sgcmVmZXJlbmNlcyB0byBidWlsZCB0aGUgY2FwdHVyZWRHcm91cHMKLSAgICAgIC8vIG1hcHBpbmcuCi0gICAgICBmb3IgKHZhciBpID0gMCwgZ3JvdXBJbmRleCA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgdmFyIHAgPSBwYXJ0c1tpXTsKLSAgICAgICAgaWYgKHAgPT09ICcoJykgewotICAgICAgICAgIC8vIGdyb3VwcyBhcmUgMS1pbmRleGVkLCBzbyBtYXggZ3JvdXAgaW5kZXggaXMgY291bnQgb2YgJygnCi0gICAgICAgICAgKytncm91cEluZGV4OwotICAgICAgICB9IGVsc2UgaWYgKCdcXCcgPT09IHAuY2hhckF0KDApKSB7Ci0gICAgICAgICAgdmFyIGRlY2ltYWxWYWx1ZSA9ICtwLnN1YnN0cmluZygxKTsKLSAgICAgICAgICBpZiAoZGVjaW1hbFZhbHVlICYmIGRlY2ltYWxWYWx1ZSA8PSBncm91cEluZGV4KSB7Ci0gICAgICAgICAgICBjYXB0dXJlZEdyb3Vwc1tkZWNpbWFsVmFsdWVdID0gLTE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIFJlbnVtYmVyIGdyb3VwcyBhbmQgcmVkdWNlIGNhcHR1cmluZyBncm91cHMgdG8gbm9uLWNhcHR1cmluZyBncm91cHMKLSAgICAgIC8vIHdoZXJlIHBvc3NpYmxlLgotICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBjYXB0dXJlZEdyb3Vwcy5sZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoLTEgPT09IGNhcHR1cmVkR3JvdXBzW2ldKSB7Ci0gICAgICAgICAgY2FwdHVyZWRHcm91cHNbaV0gPSArK2NhcHR1cmVkR3JvdXBJbmRleDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yICh2YXIgaSA9IDAsIGdyb3VwSW5kZXggPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIHZhciBwID0gcGFydHNbaV07Ci0gICAgICAgIGlmIChwID09PSAnKCcpIHsKLSAgICAgICAgICArK2dyb3VwSW5kZXg7Ci0gICAgICAgICAgaWYgKGNhcHR1cmVkR3JvdXBzW2dyb3VwSW5kZXhdID09PSB1bmRlZmluZWQpIHsKLSAgICAgICAgICAgIHBhcnRzW2ldID0gJyg/Oic7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCdcXCcgPT09IHAuY2hhckF0KDApKSB7Ci0gICAgICAgICAgdmFyIGRlY2ltYWxWYWx1ZSA9ICtwLnN1YnN0cmluZygxKTsKLSAgICAgICAgICBpZiAoZGVjaW1hbFZhbHVlICYmIGRlY2ltYWxWYWx1ZSA8PSBncm91cEluZGV4KSB7Ci0gICAgICAgICAgICBwYXJ0c1tpXSA9ICdcXCcgKyBjYXB0dXJlZEdyb3Vwc1tncm91cEluZGV4XTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gUmVtb3ZlIGFueSBwcmVmaXggYW5jaG9ycyBzbyB0aGF0IHRoZSBvdXRwdXQgd2lsbCBtYXRjaCBhbnl3aGVyZS4KLSAgICAgIC8vIF5eIHJlYWxseSBkb2VzIG1lYW4gYW4gYW5jaG9yZWQgbWF0Y2ggdGhvdWdoLgotICAgICAgZm9yICh2YXIgaSA9IDAsIGdyb3VwSW5kZXggPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGlmICgnXicgPT09IHBhcnRzW2ldICYmICdeJyAhPT0gcGFydHNbaSArIDFdKSB7IHBhcnRzW2ldID0gJyc7IH0KLSAgICAgIH0KLQotICAgICAgLy8gRXhwYW5kIGxldHRlcnMgdG8gZ3JvdXB0cyB0byBoYW5kbGUgbWl4aW5nIG9mIGNhc2Utc2Vuc2l0aXZlIGFuZAotICAgICAgLy8gY2FzZS1pbnNlbnNpdGl2ZSBwYXR0ZXJucyBpZiBuZWNlc3NhcnkuCi0gICAgICBpZiAocmVnZXguaWdub3JlQ2FzZSAmJiBuZWVkVG9Gb2xkQ2FzZSkgewotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgIHZhciBwID0gcGFydHNbaV07Ci0gICAgICAgICAgdmFyIGNoMCA9IHAuY2hhckF0KDApOwotICAgICAgICAgIGlmIChwLmxlbmd0aCA+PSAyICYmIGNoMCA9PT0gJ1snKSB7Ci0gICAgICAgICAgICBwYXJ0c1tpXSA9IGNhc2VGb2xkQ2hhcnNldChwKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoMCAhPT0gJ1xcJykgewotICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGxldHRlcnMgaW4gbnVtZXJpYyBlc2NhcGVzLgotICAgICAgICAgICAgcGFydHNbaV0gPSBwLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgL1thLXpBLVpdL2csCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGNoKSB7Ci0gICAgICAgICAgICAgICAgICB2YXIgY2MgPSBjaC5jaGFyQ29kZUF0KDApOwotICAgICAgICAgICAgICAgICAgcmV0dXJuICdbJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2MgJiB+MzIsIGNjIHwgMzIpICsgJ10nOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gcGFydHMuam9pbignJyk7Ci0gICAgfQotCi0gICAgdmFyIHJld3JpdHRlbiA9IFtdOwotICAgIGZvciAodmFyIGkgPSAwLCBuID0gcmVnZXhzLmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgdmFyIHJlZ2V4ID0gcmVnZXhzW2ldOwotICAgICAgaWYgKHJlZ2V4Lmdsb2JhbCB8fCByZWdleC5tdWx0aWxpbmUpIHsgdGhyb3cgbmV3IEVycm9yKCcnICsgcmVnZXgpOyB9Ci0gICAgICByZXdyaXR0ZW4ucHVzaCgKLSAgICAgICAgICAnKD86JyArIGFsbG93QW55d2hlcmVGb2xkQ2FzZUFuZFJlbnVtYmVyR3JvdXBzKHJlZ2V4KSArICcpJyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBSZWdFeHAocmV3cml0dGVuLmpvaW4oJ3wnKSwgaWdub3JlQ2FzZSA/ICdnaScgOiAnZycpOwotICB9Ci0KLSAgdmFyIFBSX2lubmVySHRtbFdvcmtzID0gbnVsbDsKLSAgZnVuY3Rpb24gZ2V0SW5uZXJIdG1sKG5vZGUpIHsKLSAgICAvLyBpbm5lciBodG1sIGlzIGhvcGVsZXNzbHkgYnJva2VuIGluIFNhZmFyaSAyLjAuNCB3aGVuIHRoZSBjb250ZW50IGlzCi0gICAgLy8gYW4gaHRtbCBkZXNjcmlwdGlvbiBvZiB3ZWxsIGZvcm1lZCBYTUwgYW5kIHRoZSBjb250YWluaW5nIHRhZyBpcyBhIFBSRQotICAgIC8vIHRhZywgc28gd2UgZGV0ZWN0IHRoYXQgY2FzZSBhbmQgZW11bGF0ZSBpbm5lckhUTUwuCi0gICAgaWYgKG51bGwgPT09IFBSX2lubmVySHRtbFdvcmtzKSB7Ci0gICAgICB2YXIgdGVzdE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQUkUnKTsKLSAgICAgIHRlc3ROb2RlLmFwcGVuZENoaWxkKAotICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCc8IURPQ1RZUEUgZm9vIFBVQkxJQyAiZm9vIGJhciI+XG48Zm9vIC8+JykpOwotICAgICAgUFJfaW5uZXJIdG1sV29ya3MgPSAhLzwvLnRlc3QodGVzdE5vZGUuaW5uZXJIVE1MKTsKLSAgICB9Ci0KLSAgICBpZiAoUFJfaW5uZXJIdG1sV29ya3MpIHsKLSAgICAgIHZhciBjb250ZW50ID0gbm9kZS5pbm5lckhUTUw7Ci0gICAgICAvLyBYTVAgdGFncyBjb250YWluIHVuZXNjYXBlZCBlbnRpdGllcyBzbyByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcuCi0gICAgICBpZiAoaXNSYXdDb250ZW50KG5vZGUpKSB7Ci0gICAgICAgIGNvbnRlbnQgPSB0ZXh0VG9IdG1sKGNvbnRlbnQpOwotICAgICAgfSBlbHNlIGlmICghaXNQcmVmb3JtYXR0ZWQobm9kZSwgY29udGVudCkpIHsKLSAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvKDxiclxzKlwvPz4pW1xyXG5dKy9nLCAnJDEnKQotICAgICAgICAgICAgLnJlcGxhY2UoLyg/OltcclxuXStbIFx0XSopKy9nLCAnICcpOwotICAgICAgfQotICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgdmFyIG91dCA9IFtdOwotICAgIGZvciAodmFyIGNoaWxkID0gbm9kZS5maXJzdENoaWxkOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykgewotICAgICAgbm9ybWFsaXplZEh0bWwoY2hpbGQsIG91dCk7Ci0gICAgfQotICAgIHJldHVybiBvdXQuam9pbignJyk7Ci0gIH0KLQotICAvKiogcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZXhwYW5kIHRhYnMgdG8gc3BhY2VzLiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgZmVkCi0gICAgKiBzdWNjZXNzaXZlIGNodW5rcyBvZiB0ZXh0LCBhbmQgd2lsbCBtYWludGFpbiBpdHMgb3duIGludGVybmFsIHN0YXRlIHRvCi0gICAgKiBrZWVwIHRyYWNrIG9mIGhvdyB0YWJzIGFyZSBleHBhbmRlZC4KLSAgICAqIEByZXR1cm4ge2Z1bmN0aW9uIChzdHJpbmcpIDogc3RyaW5nfSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMKLSAgICAqICAgcGxhaW4gdGV4dCBhbmQgcmV0dXJuIHRoZSB0ZXh0IHdpdGggdGFicyBleHBhbmRlZC4KLSAgICAqIEBwcml2YXRlCi0gICAgKi8KLSAgZnVuY3Rpb24gbWFrZVRhYkV4cGFuZGVyKHRhYldpZHRoKSB7Ci0gICAgdmFyIFNQQUNFUyA9ICcgICAgICAgICAgICAgICAgJzsKLSAgICB2YXIgY2hhckluTGluZSA9IDA7Ci0KLSAgICByZXR1cm4gZnVuY3Rpb24gKHBsYWluVGV4dCkgewotICAgICAgLy8gd2FsayBvdmVyIGVhY2ggY2hhcmFjdGVyIGxvb2tpbmcgZm9yIHRhYnMgYW5kIG5ld2xpbmVzLgotICAgICAgLy8gT24gdGFicywgZXhwYW5kIHRoZW0uICBPbiBuZXdsaW5lcywgcmVzZXQgY2hhckluTGluZS4KLSAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgY2hhckluTGluZQotICAgICAgdmFyIG91dCA9IG51bGw7Ci0gICAgICB2YXIgcG9zID0gMDsKLSAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcGxhaW5UZXh0Lmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgICB2YXIgY2ggPSBwbGFpblRleHQuY2hhckF0KGkpOwotCi0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICBpZiAoIW91dCkgeyBvdXQgPSBbXTsgfQotICAgICAgICAgICAgb3V0LnB1c2gocGxhaW5UZXh0LnN1YnN0cmluZyhwb3MsIGkpKTsKLSAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGluIGZyb250IG9mIHRoaXMgcGFydAotICAgICAgICAgICAgLy8gblNwYWNlcyBpcyB0aGUgYW1vdW50IG9mIHBhZGRpbmcgLS0gdGhlIG51bWJlciBvZiBzcGFjZXMgbmVlZGVkCi0gICAgICAgICAgICAvLyB0byBtb3ZlIHVzIHRvIHRoZSBuZXh0IGNvbHVtbiwgd2hlcmUgY29sdW1ucyBvY2N1ciBhdCBmYWN0b3JzIG9mCi0gICAgICAgICAgICAvLyB0YWJXaWR0aC4KLSAgICAgICAgICAgIHZhciBuU3BhY2VzID0gdGFiV2lkdGggLSAoY2hhckluTGluZSAlIHRhYldpZHRoKTsKLSAgICAgICAgICAgIGNoYXJJbkxpbmUgKz0gblNwYWNlczsKLSAgICAgICAgICAgIGZvciAoOyBuU3BhY2VzID49IDA7IG5TcGFjZXMgLT0gU1BBQ0VTLmxlbmd0aCkgewotICAgICAgICAgICAgICBvdXQucHVzaChTUEFDRVMuc3Vic3RyaW5nKDAsIG5TcGFjZXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyA9IGkgKyAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgY2hhckluTGluZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKytjaGFySW5MaW5lOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIW91dCkgeyByZXR1cm4gcGxhaW5UZXh0OyB9Ci0gICAgICBvdXQucHVzaChwbGFpblRleHQuc3Vic3RyaW5nKHBvcykpOwotICAgICAgcmV0dXJuIG91dC5qb2luKCcnKTsKLSAgICB9OwotICB9Ci0KLSAgdmFyIHByX2NodW5rUGF0dGVybiA9IG5ldyBSZWdFeHAoCi0gICAgICAnW148XSsnICAvLyBBIHJ1biBvZiBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gJzwnCi0gICAgICArICd8PFwhLS1bXFxzXFxTXSo/LS1cPicgIC8vIGFuIEhUTUwgY29tbWVudAotICAgICAgKyAnfDwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/XFxdXFxdPicgIC8vIGEgQ0RBVEEgc2VjdGlvbgotICAgICAgLy8gYSBwcm9iYWJsZSB0YWcgdGhhdCBzaG91bGQgbm90IGJlIGhpZ2hsaWdodGVkCi0gICAgICArICd8PFwvP1thLXpBLVpdKD86W14+XCJcJ118XCdbXlwnXSpcJ3xcIlteXCJdKlwiKSo+JwotICAgICAgKyAnfDwnLCAgLy8gQSAnPCcgdGhhdCBkb2VzIG5vdCBiZWdpbiBhIGxhcmdlciBjaHVuawotICAgICAgJ2cnKTsKLSAgdmFyIHByX2NvbW1lbnRQcmVmaXggPSAvXjxcIS0tLzsKLSAgdmFyIHByX2NkYXRhUHJlZml4ID0gL148IVxbQ0RBVEFcWy87Ci0gIHZhciBwcl9iclByZWZpeCA9IC9ePGJyXGIvaTsKLSAgdmFyIHByX3RhZ05hbWVSZSA9IC9ePChcLz8pKFthLXpBLVpdW2EtekEtWjAtOV0qKS87Ci0KLSAgLyoqIHNwbGl0IG1hcmt1cCBpbnRvIGNodW5rcyBvZiBodG1sIHRhZ3MgKHN0eWxlIG51bGwpIGFuZAotICAgICogcGxhaW4gdGV4dCAoc3R5bGUge0BsaW5rICNQUl9QTEFJTn0pLCBjb252ZXJ0aW5nIHRhZ3Mgd2hpY2ggYXJlCi0gICAgKiBzaWduaWZpY2FudCBmb3IgdG9rZW5pemF0aW9uICg8YnI+KSBpbnRvIHRoZWlyIHRleHR1YWwgZXF1aXZhbGVudC4KLSAgICAqCi0gICAgKiBAcGFyYW0ge3N0cmluZ30gcyBodG1sIHdoZXJlIHdoaXRlc3BhY2UgaXMgY29uc2lkZXJlZCBzaWduaWZpY2FudC4KLSAgICAqIEByZXR1cm4ge09iamVjdH0gc291cmNlIGNvZGUgYW5kIGV4dHJhY3RlZCB0YWdzLgotICAgICogQHByaXZhdGUKLSAgICAqLwotICBmdW5jdGlvbiBleHRyYWN0VGFncyhzKSB7Ci0gICAgLy8gc2luY2UgdGhlIHBhdHRlcm4gaGFzIHRoZSAnZycgbW9kaWZpZXIgYW5kIGRlZmluZXMgbm8gY2FwdHVyaW5nIGdyb3VwcywKLSAgICAvLyB0aGlzIHdpbGwgcmV0dXJuIGEgbGlzdCBvZiBhbGwgY2h1bmtzIHdoaWNoIHdlIHRoZW4gY2xhc3NpZnkgYW5kIHdyYXAgYXMKLSAgICAvLyBQUl9Ub2tlbnMKLSAgICB2YXIgbWF0Y2hlcyA9IHMubWF0Y2gocHJfY2h1bmtQYXR0ZXJuKTsKLSAgICB2YXIgc291cmNlQnVmID0gW107Ci0gICAgdmFyIHNvdXJjZUJ1ZkxlbiA9IDA7Ci0gICAgdmFyIGV4dHJhY3RlZFRhZ3MgPSBbXTsKLSAgICBpZiAobWF0Y2hlcykgewotICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBtYXRjaGVzLmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgICB2YXIgbWF0Y2ggPSBtYXRjaGVzW2ldOwotICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMSAmJiBtYXRjaC5jaGFyQXQoMCkgPT09ICc8JykgewotICAgICAgICAgIGlmIChwcl9jb21tZW50UHJlZml4LnRlc3QobWF0Y2gpKSB7IGNvbnRpbnVlOyB9Ci0gICAgICAgICAgaWYgKHByX2NkYXRhUHJlZml4LnRlc3QobWF0Y2gpKSB7Ci0gICAgICAgICAgICAvLyBzdHJpcCBDREFUQSBwcmVmaXggYW5kIHN1ZmZpeC4gIERvbid0IHVuZXNjYXBlIHNpbmNlIGl0J3MgQ0RBVEEKLSAgICAgICAgICAgIHNvdXJjZUJ1Zi5wdXNoKG1hdGNoLnN1YnN0cmluZyg5LCBtYXRjaC5sZW5ndGggLSAzKSk7Ci0gICAgICAgICAgICBzb3VyY2VCdWZMZW4gKz0gbWF0Y2gubGVuZ3RoIC0gMTI7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwcl9iclByZWZpeC50ZXN0KG1hdGNoKSkgewotICAgICAgICAgICAgLy8gPGJyPiB0YWdzIGFyZSBsZXhpY2FsbHkgc2lnbmlmaWNhbnQgc28gY29udmVydCB0aGVtIHRvIHRleHQuCi0gICAgICAgICAgICAvLyBUaGlzIGlzIHVuZG9uZSBsYXRlci4KLSAgICAgICAgICAgIHNvdXJjZUJ1Zi5wdXNoKCdcbicpOwotICAgICAgICAgICAgKytzb3VyY2VCdWZMZW47Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtYXRjaC5pbmRleE9mKFBSX05PQ09ERSkgPj0gMCAmJiBpc05vQ29kZVRhZyhtYXRjaCkpIHsKLSAgICAgICAgICAgICAgLy8gQSA8c3BhbiBjbGFzcz0ibm9jb2RlIj4gd2lsbCBzdGFydCBhIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgLy8gaWdub3JlZC4gIENvbnRpbnVlIHdhbGtpbmcgdGhlIGxpc3QgdW50aWwgd2Ugc2VlIGEgbWF0Y2hpbmcgZW5kCi0gICAgICAgICAgICAgIC8vIHRhZy4KLSAgICAgICAgICAgICAgdmFyIG5hbWUgPSBtYXRjaC5tYXRjaChwcl90YWdOYW1lUmUpWzJdOwotICAgICAgICAgICAgICB2YXIgZGVwdGggPSAxOwotICAgICAgICAgICAgICB2YXIgajsKLSAgICAgICAgICAgICAgZW5kX3RhZ19sb29wOgotICAgICAgICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IG47ICsraikgewotICAgICAgICAgICAgICAgIHZhciBuYW1lMiA9IG1hdGNoZXNbal0ubWF0Y2gocHJfdGFnTmFtZVJlKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZTIgJiYgbmFtZTJbMl0gPT09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgIGlmIChuYW1lMlsxXSA9PT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgtLWRlcHRoID09PSAwKSB7IGJyZWFrIGVuZF90YWdfbG9vcDsgfQotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKytkZXB0aDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGogPCBuKSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFjdGVkVGFncy5wdXNoKAotICAgICAgICAgICAgICAgICAgICBzb3VyY2VCdWZMZW4sIG1hdGNoZXMuc2xpY2UoaSwgaiArIDEpLmpvaW4oJycpKTsKLSAgICAgICAgICAgICAgICBpID0gajsKLSAgICAgICAgICAgICAgfSBlbHNlIHsgIC8vIElnbm9yZSB1bmNsb3NlZCBzZWN0aW9ucy4KLSAgICAgICAgICAgICAgICBleHRyYWN0ZWRUYWdzLnB1c2goc291cmNlQnVmTGVuLCBtYXRjaCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGV4dHJhY3RlZFRhZ3MucHVzaChzb3VyY2VCdWZMZW4sIG1hdGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdmFyIGxpdGVyYWxUZXh0ID0gaHRtbFRvVGV4dChtYXRjaCk7Ci0gICAgICAgICAgc291cmNlQnVmLnB1c2gobGl0ZXJhbFRleHQpOwotICAgICAgICAgIHNvdXJjZUJ1ZkxlbiArPSBsaXRlcmFsVGV4dC5sZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2VCdWYuam9pbignJyksIHRhZ3M6IGV4dHJhY3RlZFRhZ3MgfTsKLSAgfQotCi0gIC8qKiBUcnVlIGlmIHRoZSBnaXZlbiB0YWcgY29udGFpbnMgYSBjbGFzcyBhdHRyaWJ1dGUgd2l0aCB0aGUgbm9jb2RlIGNsYXNzLiAqLwotICBmdW5jdGlvbiBpc05vQ29kZVRhZyh0YWcpIHsKLSAgICByZXR1cm4gISF0YWcKLSAgICAgICAgLy8gRmlyc3QgY2Fub25pY2FsaXplIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhdHRyaWJ1dGVzCi0gICAgICAgIC5yZXBsYWNlKC9ccyhcdyspXHMqPVxzKig/OlwiKFteXCJdKilcInwnKFteXCddKiknfChcUyspKS9nLAotICAgICAgICAgICAgICAgICAnICQxPSIkMiQzJDQiJykKLSAgICAgICAgLy8gVGhlbiBsb29rIGZvciB0aGUgYXR0cmlidXRlIHdlIHdhbnQuCi0gICAgICAgIC5tYXRjaCgvW2NDXVtsTF1bYUFdW3NTXVtzU109XCJbXlwiXSpcYm5vY29kZVxiLyk7Ci0gIH0KLQotICAvKioKLSAgICogQXBwbHkgdGhlIGdpdmVuIGxhbmd1YWdlIGhhbmRsZXIgdG8gc291cmNlQ29kZSBhbmQgYWRkIHRoZSByZXN1bHRpbmcKLSAgICogZGVjb3JhdGlvbnMgdG8gb3V0LgotICAgKiBAcGFyYW0ge251bWJlcn0gYmFzZVBvcyB0aGUgaW5kZXggb2Ygc291cmNlQ29kZSB3aXRoaW4gdGhlIGNodW5rIG9mIHNvdXJjZQotICAgKiAgICB3aG9zZSBkZWNvcmF0aW9ucyBhcmUgYWxyZWFkeSBwcmVzZW50IG9uIG91dC4KLSAgICovCi0gIGZ1bmN0aW9uIGFwcGVuZERlY29yYXRpb25zKGJhc2VQb3MsIHNvdXJjZUNvZGUsIGxhbmdIYW5kbGVyLCBvdXQpIHsKLSAgICBpZiAoIXNvdXJjZUNvZGUpIHsgcmV0dXJuOyB9Ci0gICAgdmFyIGpvYiA9IHsKLSAgICAgIHNvdXJjZTogc291cmNlQ29kZSwKLSAgICAgIGJhc2VQb3M6IGJhc2VQb3MKLSAgICB9OwotICAgIGxhbmdIYW5kbGVyKGpvYik7Ci0gICAgb3V0LnB1c2guYXBwbHkob3V0LCBqb2IuZGVjb3JhdGlvbnMpOwotICB9Ci0KLSAgLyoqIEdpdmVuIHRyaXBsZXMgb2YgW3N0eWxlLCBwYXR0ZXJuLCBjb250ZXh0XSByZXR1cm5zIGEgbGV4aW5nIGZ1bmN0aW9uLAotICAgICogVGhlIGxleGluZyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoZSBwYXR0ZXJucyB0byBmaW5kIHRva2VuIGJvdW5kYXJpZXMgYW5kCi0gICAgKiByZXR1cm5zIGEgZGVjb3JhdGlvbiBsaXN0IG9mIHRoZSBmb3JtCi0gICAgKiBbaW5kZXhfMCwgc3R5bGVfMCwgaW5kZXhfMSwgc3R5bGVfMSwgLi4uLCBpbmRleF9uLCBzdHlsZV9uXQotICAgICogd2hlcmUgaW5kZXhfbiBpcyBhbiBpbmRleCBpbnRvIHRoZSBzb3VyY2VDb2RlLCBhbmQgc3R5bGVfbiBpcyBhIHN0eWxlCi0gICAgKiBjb25zdGFudCBsaWtlIFBSX1BMQUlOLiAgaW5kZXhfbi0xIDw9IGluZGV4X24sIGFuZCBzdHlsZV9uLTEgYXBwbGllcyB0bwotICAgICogYWxsIGNoYXJhY3RlcnMgaW4gc291cmNlQ29kZVtpbmRleF9uLTE6aW5kZXhfbl0uCi0gICAgKgotICAgICogVGhlIHN0eWxlUGF0dGVybnMgaXMgYSBsaXN0IHdob3NlIGVsZW1lbnRzIGhhdmUgdGhlIGZvcm0KLSAgICAqIFtzdHlsZSA6IHN0cmluZywgcGF0dGVybiA6IFJlZ0V4cCwgREVQUkVDQVRFRCwgc2hvcnRjdXQgOiBzdHJpbmddLgotICAgICoKLSAgICAqIFN0eWxlIGlzIGEgc3R5bGUgY29uc3RhbnQgbGlrZSBQUl9QTEFJTiwgb3IgY2FuIGJlIGEgc3RyaW5nIG9mIHRoZQotICAgICogZm9ybSAnbGFuZy1GT08nLCB3aGVyZSBGT08gaXMgYSBsYW5ndWFnZSBleHRlbnNpb24gZGVzY3JpYmluZyB0aGUKLSAgICAqIGxhbmd1YWdlIG9mIHRoZSBwb3J0aW9uIG9mIHRoZSB0b2tlbiBpbiAkMSBhZnRlciBwYXR0ZXJuIGV4ZWN1dGVzLgotICAgICogRS5nLiwgaWYgc3R5bGUgaXMgJ2xhbmctbGlzcCcsIGFuZCBncm91cCAxIGNvbnRhaW5zIHRoZSB0ZXh0Ci0gICAgKiAnKGhlbGxvICh3b3JsZCkpJywgdGhlbiB0aGF0IHBvcnRpb24gb2YgdGhlIHRva2VuIHdpbGwgYmUgcGFzc2VkIHRvIHRoZQotICAgICogcmVnaXN0ZXJlZCBsaXNwIGhhbmRsZXIgZm9yIGZvcm1hdHRpbmcuCi0gICAgKiBUaGUgdGV4dCBiZWZvcmUgYW5kIGFmdGVyIGdyb3VwIDEgd2lsbCBiZSByZXN0eWxlZCB1c2luZyB0aGlzIGRlY29yYXRvcgotICAgICogc28gZGVjb3JhdG9ycyBzaG91bGQgdGFrZSBjYXJlIHRoYXQgdGhpcyBkb2Vzbid0IHJlc3VsdCBpbiBpbmZpbml0ZQotICAgICogcmVjdXJzaW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBIVE1MIGxleGVyIHJ1bGUgZm9yIFNDUklQVCBlbGVtZW50cyBsb29rcwotICAgICogc29tZXRoaW5nIGxpa2UgWydsYW5nLWpzJywgLzxbc11jcmlwdD4oLis/KTxcL3NjcmlwdD4vXS4gIFRoaXMgbWF5IG1hdGNoCi0gICAgKiAnPHNjcmlwdD5mb28oKTxcL3NjcmlwdD4nLCB3aGljaCB3b3VsZCBjYXVzZSB0aGUgY3VycmVudCBkZWNvcmF0b3IgdG8KLSAgICAqIGJlIGNhbGxlZCB3aXRoICc8c2NyaXB0Picgd2hpY2ggd291bGQgbm90IG1hdGNoIHRoZSBzYW1lIHJ1bGUgc2luY2UKLSAgICAqIGdyb3VwIDEgbXVzdCBub3QgYmUgZW1wdHksIHNvIGl0IHdvdWxkIGJlIGluc3RlYWQgc3R5bGVkIGFzIFBSX1RBRyBieQotICAgICogdGhlIGdlbmVyaWMgdGFnIHJ1bGUuICBUaGUgaGFuZGxlciByZWdpc3RlcmVkIGZvciB0aGUgJ2pzJyBleHRlbnNpb24gd291bGQKLSAgICAqIHRoZW4gYmUgY2FsbGVkIHdpdGggJ2ZvbygpJywgYW5kIGZpbmFsbHksIHRoZSBjdXJyZW50IGRlY29yYXRvciB3b3VsZAotICAgICogYmUgY2FsbGVkIHdpdGggJzxcL3NjcmlwdD4nIHdoaWNoIHdvdWxkIG5vdCBtYXRjaCB0aGUgb3JpZ2luYWwgcnVsZSBhbmQKLSAgICAqIHNvIHRoZSBnZW5lcmljIHRhZyBydWxlIHdvdWxkIGlkZW50aWZ5IGl0IGFzIGEgdGFnLgotICAgICoKLSAgICAqIFBhdHRlcm4gbXVzdCBvbmx5IG1hdGNoIHByZWZpeGVzLCBhbmQgaWYgaXQgbWF0Y2hlcyBhIHByZWZpeCwgdGhlbiB0aGF0Ci0gICAgKiBtYXRjaCBpcyBjb25zaWRlcmVkIGEgdG9rZW4gd2l0aCB0aGUgc2FtZSBzdHlsZS4KLSAgICAqCi0gICAgKiBDb250ZXh0IGlzIGFwcGxpZWQgdG8gdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UsIG5vbi1jb21tZW50IHRva2VuCi0gICAgKiByZWNvZ25pemVkLgotICAgICoKLSAgICAqIFNob3J0Y3V0IGlzIGFuIG9wdGlvbmFsIHN0cmluZyBvZiBjaGFyYWN0ZXJzLCBhbnkgb2Ygd2hpY2gsIGlmIHRoZSBmaXJzdAotICAgICogY2hhcmFjdGVyLCBndXJhbnRlZSB0aGF0IHRoaXMgcGF0dGVybiBhbmQgb25seSB0aGlzIHBhdHRlcm4gbWF0Y2hlcy4KLSAgICAqCi0gICAgKiBAcGFyYW0ge0FycmF5fSBzaG9ydGN1dFN0eWxlUGF0dGVybnMgcGF0dGVybnMgdGhhdCBhbHdheXMgc3RhcnQgd2l0aAotICAgICogICBhIGtub3duIGNoYXJhY3Rlci4gIE11c3QgaGF2ZSBhIHNob3J0Y3V0IHN0cmluZy4KLSAgICAqIEBwYXJhbSB7QXJyYXl9IGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucyBwYXR0ZXJucyB0aGF0IHdpbGwgYmUgdHJpZWQgaW4KLSAgICAqICAgb3JkZXIgaWYgdGhlIHNob3J0Y3V0IG9uZXMgZmFpbC4gIE1heSBoYXZlIHNob3J0Y3V0cy4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHtmdW5jdGlvbiAoT2JqZWN0KX0gYQotICAgICogICBmdW5jdGlvbiB0aGF0IHRha2VzIHNvdXJjZSBjb2RlIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBkZWNvcmF0aW9ucy4KLSAgICAqLwotICBmdW5jdGlvbiBjcmVhdGVTaW1wbGVMZXhlcihzaG9ydGN1dFN0eWxlUGF0dGVybnMsIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucykgewotICAgIHZhciBzaG9ydGN1dHMgPSB7fTsKLSAgICB2YXIgdG9rZW5pemVyOwotICAgIChmdW5jdGlvbiAoKSB7Ci0gICAgICB2YXIgYWxsUGF0dGVybnMgPSBzaG9ydGN1dFN0eWxlUGF0dGVybnMuY29uY2F0KGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucyk7Ci0gICAgICB2YXIgYWxsUmVnZXhzID0gW107Ci0gICAgICB2YXIgcmVnZXhLZXlzID0ge307Ci0gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFsbFBhdHRlcm5zLmxlbmd0aDsgaSA8IG47ICsraSkgewotICAgICAgICB2YXIgcGF0dGVyblBhcnRzID0gYWxsUGF0dGVybnNbaV07Ci0gICAgICAgIHZhciBzaG9ydGN1dENoYXJzID0gcGF0dGVyblBhcnRzWzNdOwotICAgICAgICBpZiAoc2hvcnRjdXRDaGFycykgewotICAgICAgICAgIGZvciAodmFyIGMgPSBzaG9ydGN1dENoYXJzLmxlbmd0aDsgLS1jID49IDA7KSB7Ci0gICAgICAgICAgICBzaG9ydGN1dHNbc2hvcnRjdXRDaGFycy5jaGFyQXQoYyldID0gcGF0dGVyblBhcnRzOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2YXIgcmVnZXggPSBwYXR0ZXJuUGFydHNbMV07Ci0gICAgICAgIHZhciBrID0gJycgKyByZWdleDsKLSAgICAgICAgaWYgKCFyZWdleEtleXMuaGFzT3duUHJvcGVydHkoaykpIHsKLSAgICAgICAgICBhbGxSZWdleHMucHVzaChyZWdleCk7Ci0gICAgICAgICAgcmVnZXhLZXlzW2tdID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYWxsUmVnZXhzLnB1c2goL1tcMC1cdWZmZmZdLyk7Ci0gICAgICB0b2tlbml6ZXIgPSBjb21iaW5lUHJlZml4UGF0dGVybnMoYWxsUmVnZXhzKTsKLSAgICB9KSgpOwotCi0gICAgdmFyIG5QYXR0ZXJucyA9IGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucy5sZW5ndGg7Ci0gICAgdmFyIG5vdFdzID0gL1xTLzsKLQotICAgIC8qKgotICAgICAqIExleGVzIGpvYi5zb3VyY2UgYW5kIHByb2R1Y2VzIGFuIG91dHB1dCBhcnJheSBqb2IuZGVjb3JhdGlvbnMgb2Ygc3R5bGUKLSAgICAgKiBjbGFzc2VzIHByZWNlZGVkIGJ5IHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGV5IHN0YXJ0IGluIGpvYi5zb3VyY2UgaW4KLSAgICAgKiBvcmRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB7T2JqZWN0fSBqb2IgYW4gb2JqZWN0IGxpa2Uge0Bjb2RlCi0gICAgICogICAgc291cmNlOiB7c3RyaW5nfSBzb3VyY2VUZXh0IHBsYWluIHRleHQsCi0gICAgICogICAgYmFzZVBvczoge2ludH0gcG9zaXRpb24gb2Ygam9iLnNvdXJjZSBpbiB0aGUgbGFyZ2VyIGNodW5rIG9mCi0gICAgICogICAgICAgIHNvdXJjZUNvZGUuCi0gICAgICogfQotICAgICAqLwotICAgIHZhciBkZWNvcmF0ZSA9IGZ1bmN0aW9uIChqb2IpIHsKLSAgICAgIHZhciBzb3VyY2VDb2RlID0gam9iLnNvdXJjZSwgYmFzZVBvcyA9IGpvYi5iYXNlUG9zOwotICAgICAgLyoqIEV2ZW4gZW50cmllcyBhcmUgcG9zaXRpb25zIGluIHNvdXJjZSBpbiBhc2NlbmRpbmcgb3JkZXIuICBPZGQgZW50aWVzCi0gICAgICAgICogYXJlIHN0eWxlIG1hcmtlcnMgKGUuZy4sIFBSX0NPTU1FTlQpIHRoYXQgcnVuIGZyb20gdGhhdCBwb3NpdGlvbiB1bnRpbAotICAgICAgICAqIHRoZSBlbmQuCi0gICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXJ8c3RyaW5nPn0KLSAgICAgICAgKi8KLSAgICAgIHZhciBkZWNvcmF0aW9ucyA9IFtiYXNlUG9zLCBQUl9QTEFJTl07Ci0gICAgICB2YXIgcG9zID0gMDsgIC8vIGluZGV4IGludG8gc291cmNlQ29kZQotICAgICAgdmFyIHRva2VucyA9IHNvdXJjZUNvZGUubWF0Y2godG9rZW5pemVyKSB8fCBbXTsKLSAgICAgIHZhciBzdHlsZUNhY2hlID0ge307Ci0KLSAgICAgIGZvciAodmFyIHRpID0gMCwgblRva2VucyA9IHRva2Vucy5sZW5ndGg7IHRpIDwgblRva2VuczsgKyt0aSkgewotICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbdGldOwotICAgICAgICB2YXIgc3R5bGUgPSBzdHlsZUNhY2hlW3Rva2VuXTsKLSAgICAgICAgdmFyIG1hdGNoID0gdm9pZCAwOwotCi0gICAgICAgIHZhciBpc0VtYmVkZGVkOwotICAgICAgICBpZiAodHlwZW9mIHN0eWxlID09PSAnc3RyaW5nJykgewotICAgICAgICAgIGlzRW1iZWRkZWQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB2YXIgcGF0dGVyblBhcnRzID0gc2hvcnRjdXRzW3Rva2VuLmNoYXJBdCgwKV07Ci0gICAgICAgICAgaWYgKHBhdHRlcm5QYXJ0cykgewotICAgICAgICAgICAgbWF0Y2ggPSB0b2tlbi5tYXRjaChwYXR0ZXJuUGFydHNbMV0pOwotICAgICAgICAgICAgc3R5bGUgPSBwYXR0ZXJuUGFydHNbMF07Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgblBhdHRlcm5zOyArK2kpIHsKLSAgICAgICAgICAgICAgcGF0dGVyblBhcnRzID0gZmFsbHRocm91Z2hTdHlsZVBhdHRlcm5zW2ldOwotICAgICAgICAgICAgICBtYXRjaCA9IHRva2VuLm1hdGNoKHBhdHRlcm5QYXJ0c1sxXSk7Ci0gICAgICAgICAgICAgIGlmIChtYXRjaCkgewotICAgICAgICAgICAgICAgIHN0eWxlID0gcGF0dGVyblBhcnRzWzBdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbWF0Y2gpIHsgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIG1ha2UgcHJvZ3Jlc3MKLSAgICAgICAgICAgICAgc3R5bGUgPSBQUl9QTEFJTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpc0VtYmVkZGVkID0gc3R5bGUubGVuZ3RoID49IDUgJiYgJ2xhbmctJyA9PT0gc3R5bGUuc3Vic3RyaW5nKDAsIDUpOwotICAgICAgICAgIGlmIChpc0VtYmVkZGVkICYmICEobWF0Y2ggJiYgdHlwZW9mIG1hdGNoWzFdID09PSAnc3RyaW5nJykpIHsKLSAgICAgICAgICAgIGlzRW1iZWRkZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHN0eWxlID0gUFJfU09VUkNFOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICghaXNFbWJlZGRlZCkgeyBzdHlsZUNhY2hlW3Rva2VuXSA9IHN0eWxlOyB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgdG9rZW5TdGFydCA9IHBvczsKLSAgICAgICAgcG9zICs9IHRva2VuLmxlbmd0aDsKLQotICAgICAgICBpZiAoIWlzRW1iZWRkZWQpIHsKLSAgICAgICAgICBkZWNvcmF0aW9ucy5wdXNoKGJhc2VQb3MgKyB0b2tlblN0YXJ0LCBzdHlsZSk7Ci0gICAgICAgIH0gZWxzZSB7ICAvLyBUcmVhdCBncm91cCAxIGFzIGFuIGVtYmVkZGVkIGJsb2NrIG9mIHNvdXJjZSBjb2RlLgotICAgICAgICAgIHZhciBlbWJlZGRlZFNvdXJjZSA9IG1hdGNoWzFdOwotICAgICAgICAgIHZhciBlbWJlZGRlZFNvdXJjZVN0YXJ0ID0gdG9rZW4uaW5kZXhPZihlbWJlZGRlZFNvdXJjZSk7Ci0gICAgICAgICAgdmFyIGVtYmVkZGVkU291cmNlRW5kID0gZW1iZWRkZWRTb3VyY2VTdGFydCArIGVtYmVkZGVkU291cmNlLmxlbmd0aDsKLSAgICAgICAgICBpZiAobWF0Y2hbMl0pIHsKLSAgICAgICAgICAgIC8vIElmIGVtYmVkZGVkU291cmNlIGNhbiBiZSBibGFuaywgdGhlbiBpdCB3b3VsZCBtYXRjaCBhdCB0aGUKLSAgICAgICAgICAgIC8vIGJlZ2lubmluZyB3aGljaCB3b3VsZCBjYXVzZSB1cyB0byBpbmZpbml0ZWx5IHJlY3Vyc2Ugb24gdGhlCi0gICAgICAgICAgICAvLyBlbnRpcmUgdG9rZW4sIHNvIHdlIGNhdGNoIHRoZSByaWdodCBjb250ZXh0IGluIG1hdGNoWzJdLgotICAgICAgICAgICAgZW1iZWRkZWRTb3VyY2VFbmQgPSB0b2tlbi5sZW5ndGggLSBtYXRjaFsyXS5sZW5ndGg7Ci0gICAgICAgICAgICBlbWJlZGRlZFNvdXJjZVN0YXJ0ID0gZW1iZWRkZWRTb3VyY2VFbmQgLSBlbWJlZGRlZFNvdXJjZS5sZW5ndGg7Ci0gICAgICAgICAgfQotICAgICAgICAgIHZhciBsYW5nID0gc3R5bGUuc3Vic3RyaW5nKDUpOwotICAgICAgICAgIC8vIERlY29yYXRlIHRoZSBsZWZ0IG9mIHRoZSBlbWJlZGRlZCBzb3VyY2UKLSAgICAgICAgICBhcHBlbmREZWNvcmF0aW9ucygKLSAgICAgICAgICAgICAgYmFzZVBvcyArIHRva2VuU3RhcnQsCi0gICAgICAgICAgICAgIHRva2VuLnN1YnN0cmluZygwLCBlbWJlZGRlZFNvdXJjZVN0YXJ0KSwKLSAgICAgICAgICAgICAgZGVjb3JhdGUsIGRlY29yYXRpb25zKTsKLSAgICAgICAgICAvLyBEZWNvcmF0ZSB0aGUgZW1iZWRkZWQgc291cmNlCi0gICAgICAgICAgYXBwZW5kRGVjb3JhdGlvbnMoCi0gICAgICAgICAgICAgIGJhc2VQb3MgKyB0b2tlblN0YXJ0ICsgZW1iZWRkZWRTb3VyY2VTdGFydCwKLSAgICAgICAgICAgICAgZW1iZWRkZWRTb3VyY2UsCi0gICAgICAgICAgICAgIGxhbmdIYW5kbGVyRm9yRXh0ZW5zaW9uKGxhbmcsIGVtYmVkZGVkU291cmNlKSwKLSAgICAgICAgICAgICAgZGVjb3JhdGlvbnMpOwotICAgICAgICAgIC8vIERlY29yYXRlIHRoZSByaWdodCBvZiB0aGUgZW1iZWRkZWQgc2VjdGlvbgotICAgICAgICAgIGFwcGVuZERlY29yYXRpb25zKAotICAgICAgICAgICAgICBiYXNlUG9zICsgdG9rZW5TdGFydCArIGVtYmVkZGVkU291cmNlRW5kLAotICAgICAgICAgICAgICB0b2tlbi5zdWJzdHJpbmcoZW1iZWRkZWRTb3VyY2VFbmQpLAotICAgICAgICAgICAgICBkZWNvcmF0ZSwgZGVjb3JhdGlvbnMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBqb2IuZGVjb3JhdGlvbnMgPSBkZWNvcmF0aW9uczsKLSAgICB9OwotICAgIHJldHVybiBkZWNvcmF0ZTsKLSAgfQotCi0gIC8qKiByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIGxpc3Qgb2YgZGVjb3JhdGlvbnMgZnJvbSBzb3VyY2UgdGV4dC4KLSAgICAqCi0gICAgKiBUaGlzIGNvZGUgdHJlYXRzICIsICcsIGFuZCBgIGFzIHN0cmluZyBkZWxpbWl0ZXJzLCBhbmQgXCBhcyBhIHN0cmluZwotICAgICogZXNjYXBlLiAgSXQgZG9lcyBub3QgcmVjb2duaXplIHBlcmwncyBxcSgpIHN0eWxlIHN0cmluZ3MuCi0gICAgKiBJdCBoYXMgbm8gc3BlY2lhbCBoYW5kbGluZyBmb3IgZG91YmxlIGRlbGltaXRlciBlc2NhcGVzIGFzIGluIGJhc2ljLCBvcgotICAgICogdGhlIHRyaXBsZWQgZGVsaW1pdGVycyB1c2VkIGluIHB5dGhvbiwgYnV0IHNob3VsZCB3b3JrIG9uIHRob3NlIHJlZ2FyZGxlc3MKLSAgICAqIGFsdGhvdWdoIGluIHRob3NlIGNhc2VzIGEgc2luZ2xlIHN0cmluZyBsaXRlcmFsIG1heSBiZSBicm9rZW4gdXAgaW50bwotICAgICogbXVsdGlwbGUgYWRqYWNlbnQgc3RyaW5nIGxpdGVyYWxzLgotICAgICoKLSAgICAqIEl0IHJlY29nbml6ZXMgQywgQysrLCBhbmQgc2hlbGwgc3R5bGUgY29tbWVudHMuCi0gICAgKgotICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgYSBzZXQgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycy4KLSAgICAqIEByZXR1cm4ge2Z1bmN0aW9uIChPYmplY3QpfSBhIGZ1bmN0aW9uIHRoYXQgZXhhbWluZXMgdGhlIHNvdXJjZSBjb2RlCi0gICAgKiAgICAgaW4gdGhlIGlucHV0IGpvYiBhbmQgYnVpbGRzIHRoZSBkZWNvcmF0aW9uIGxpc3QuCi0gICAgKi8KLSAgZnVuY3Rpb24gc291cmNlRGVjb3JhdG9yKG9wdGlvbnMpIHsKLSAgICB2YXIgc2hvcnRjdXRTdHlsZVBhdHRlcm5zID0gW10sIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucyA9IFtdOwotICAgIGlmIChvcHRpb25zWyd0cmlwbGVRdW90ZWRTdHJpbmdzJ10pIHsKLSAgICAgIC8vICcnJ211bHRpLWxpbmUtc3RyaW5nJycnLCAnc2luZ2xlLWxpbmUtc3RyaW5nJywgYW5kIGRvdWJsZS1xdW90ZWQKLSAgICAgIHNob3J0Y3V0U3R5bGVQYXR0ZXJucy5wdXNoKAotICAgICAgICAgIFtQUl9TVFJJTkcsICAvXig/OlwnXCdcJyg/OlteXCdcXF18XFxbXHNcU118XCd7MSwyfSg/PVteXCddKSkqKD86XCdcJ1wnfCQpfFwiXCJcIig/OlteXCJcXF18XFxbXHNcU118XCJ7MSwyfSg/PVteXCJdKSkqKD86XCJcIlwifCQpfFwnKD86W15cXFwnXXxcXFtcc1xTXSkqKD86XCd8JCl8XCIoPzpbXlxcXCJdfFxcW1xzXFNdKSooPzpcInwkKSkvLAotICAgICAgICAgICBudWxsLCAnXCciJ10pOwotICAgIH0gZWxzZSBpZiAob3B0aW9uc1snbXVsdGlMaW5lU3RyaW5ncyddKSB7Ci0gICAgICAvLyAnbXVsdGktbGluZS1zdHJpbmcnLCAibXVsdGktbGluZS1zdHJpbmciCi0gICAgICBzaG9ydGN1dFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICBbUFJfU1RSSU5HLCAgL14oPzpcJyg/OlteXFxcJ118XFxbXHNcU10pKig/OlwnfCQpfFwiKD86W15cXFwiXXxcXFtcc1xTXSkqKD86XCJ8JCl8XGAoPzpbXlxcXGBdfFxcW1xzXFNdKSooPzpcYHwkKSkvLAotICAgICAgICAgICBudWxsLCAnXCciYCddKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gJ3NpbmdsZS1saW5lLXN0cmluZycsICJzaW5nbGUtbGluZS1zdHJpbmciCi0gICAgICBzaG9ydGN1dFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICBbUFJfU1RSSU5HLAotICAgICAgICAgICAvXig/OlwnKD86W15cXFwnXHJcbl18XFwuKSooPzpcJ3wkKXxcIig/OlteXFxcIlxyXG5dfFxcLikqKD86XCJ8JCkpLywKLSAgICAgICAgICAgbnVsbCwgJyJcJyddKTsKLSAgICB9Ci0gICAgaWYgKG9wdGlvbnNbJ3ZlcmJhdGltU3RyaW5ncyddKSB7Ci0gICAgICAvLyB2ZXJiYXRpbS1zdHJpbmctbGl0ZXJhbCBwcm9kdWN0aW9uIGZyb20gdGhlIEMjIGdyYW1tYXIuICBTZWUgaXNzdWUgOTMuCi0gICAgICBmYWxsdGhyb3VnaFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICBbUFJfU1RSSU5HLCAvXkBcIig/OlteXCJdfFwiXCIpKig/OlwifCQpLywgbnVsbF0pOwotICAgIH0KLSAgICB2YXIgaGMgPSBvcHRpb25zWydoYXNoQ29tbWVudHMnXTsKLSAgICBpZiAoaGMpIHsKLSAgICAgIGlmIChvcHRpb25zWydjU3R5bGVDb21tZW50cyddKSB7Ci0gICAgICAgIGlmIChoYyA+IDEpIHsgIC8vIG11bHRpbGluZSBoYXNoIGNvbW1lbnRzCi0gICAgICAgICAgc2hvcnRjdXRTdHlsZVBhdHRlcm5zLnB1c2goCi0gICAgICAgICAgICAgIFtQUl9DT01NRU5ULCAvXiMoPzojIyg/OlteI118Iyg/ISMjKSkqKD86IyMjfCQpfC4qKS8sIG51bGwsICcjJ10pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFN0b3AgQyBwcmVwcm9jZXNzb3IgZGVjbGFyYXRpb25zIGF0IGFuIHVuY2xvc2VkIG9wZW4gY29tbWVudAotICAgICAgICAgIHNob3J0Y3V0U3R5bGVQYXR0ZXJucy5wdXNoKAotICAgICAgICAgICAgICBbUFJfQ09NTUVOVCwgL14jKD86KD86ZGVmaW5lfGVsaWZ8ZWxzZXxlbmRpZnxlcnJvcnxpZmRlZnxpbmNsdWRlfGlmbmRlZnxsaW5lfHByYWdtYXx1bmRlZnx3YXJuaW5nKVxifFteXHJcbl0qKS8sCi0gICAgICAgICAgICAgICBudWxsLCAnIyddKTsKLSAgICAgICAgfQotICAgICAgICBmYWxsdGhyb3VnaFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICAgIFtQUl9TVFJJTkcsCi0gICAgICAgICAgICAgL148KD86KD86KD86XC5cLlwvKSp8XC8/KSg/Oltcdy1dKyg/OlwvW1x3LV0rKSspP1tcdy1dK1wuaHxbYS16XVx3Kik+LywKLSAgICAgICAgICAgICBudWxsXSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzaG9ydGN1dFN0eWxlUGF0dGVybnMucHVzaChbUFJfQ09NTUVOVCwgL14jW15cclxuXSovLCBudWxsLCAnIyddKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9wdGlvbnNbJ2NTdHlsZUNvbW1lbnRzJ10pIHsKLSAgICAgIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucy5wdXNoKFtQUl9DT01NRU5ULCAvXlwvXC9bXlxyXG5dKi8sIG51bGxdKTsKLSAgICAgIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucy5wdXNoKAotICAgICAgICAgIFtQUl9DT01NRU5ULCAvXlwvXCpbXHNcU10qPyg/OlwqXC98JCkvLCBudWxsXSk7Ci0gICAgfQotICAgIGlmIChvcHRpb25zWydyZWdleExpdGVyYWxzJ10pIHsKLSAgICAgIHZhciBSRUdFWF9MSVRFUkFMID0gKAotICAgICAgICAgIC8vIEEgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwgc3RhcnRzIHdpdGggYSBzbGFzaCB0aGF0IGlzCi0gICAgICAgICAgLy8gbm90IGZvbGxvd2VkIGJ5ICogb3IgLyBzbyB0aGF0IGl0IGlzIG5vdCBjb25mdXNlZCB3aXRoCi0gICAgICAgICAgLy8gY29tbWVudHMuCi0gICAgICAgICAgJy8oPz1bXi8qXSknCi0gICAgICAgICAgLy8gYW5kIHRoZW4gY29udGFpbnMgYW55IG51bWJlciBvZiByYXcgY2hhcmFjdGVycywKLSAgICAgICAgICArICcoPzpbXi9cXHg1QlxceDVDXScKLSAgICAgICAgICAvLyBlc2NhcGUgc2VxdWVuY2VzIChceDVDKSwKLSAgICAgICAgICArICAgICd8XFx4NUNbXFxzXFxTXScKLSAgICAgICAgICAvLyBvciBub24tbmVzdGluZyBjaGFyYWN0ZXIgc2V0cyAoXHg1Qlx4NUQpOwotICAgICAgICAgICsgICAgJ3xcXHg1Qig/OlteXFx4NUNcXHg1RF18XFx4NUNbXFxzXFxTXSkqKD86XFx4NUR8JCkpKycKLSAgICAgICAgICAvLyBmaW5hbGx5IGNsb3NlZCBieSBhIC8uCi0gICAgICAgICAgKyAnLycpOwotICAgICAgZmFsbHRocm91Z2hTdHlsZVBhdHRlcm5zLnB1c2goCi0gICAgICAgICAgWydsYW5nLXJlZ2V4JywKLSAgICAgICAgICAgbmV3IFJlZ0V4cCgnXicgKyBSRUdFWFBfUFJFQ0VERVJfUEFUVEVSTiArICcoJyArIFJFR0VYX0xJVEVSQUwgKyAnKScpCi0gICAgICAgICAgIF0pOwotICAgIH0KLQotICAgIHZhciBrZXl3b3JkcyA9IG9wdGlvbnNbJ2tleXdvcmRzJ10ucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKLSAgICBpZiAoa2V5d29yZHMubGVuZ3RoKSB7Ci0gICAgICBmYWxsdGhyb3VnaFN0eWxlUGF0dGVybnMucHVzaCgKLSAgICAgICAgICBbUFJfS0VZV09SRCwKLSAgICAgICAgICAgbmV3IFJlZ0V4cCgnXig/OicgKyBrZXl3b3Jkcy5yZXBsYWNlKC9ccysvZywgJ3wnKSArICcpXFxiJyksIG51bGxdKTsKLSAgICB9Ci0KLSAgICBzaG9ydGN1dFN0eWxlUGF0dGVybnMucHVzaChbUFJfUExBSU4sICAgICAgIC9eXHMrLywgbnVsbCwgJyBcclxuXHRceEEwJ10pOwotICAgIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucy5wdXNoKAotICAgICAgICAvLyBUT0RPKG1pa2VzYW11ZWwpOiByZWNvZ25pemUgbm9uLWxhdGluIGxldHRlcnMgYW5kIG51bWVyYWxzIGluIGlkZW50cwotICAgICAgICBbUFJfTElURVJBTCwgICAgIC9eQFthLXpfJF1bYS16XyRAMC05XSovaSwgbnVsbF0sCi0gICAgICAgIFtQUl9UWVBFLCAgICAgICAgL15AP1tBLVpdK1thLXpdW0EtWmEtel8kQDAtOV0qLywgbnVsbF0sCi0gICAgICAgIFtQUl9QTEFJTiwgICAgICAgL15bYS16XyRdW2Etel8kQDAtOV0qL2ksIG51bGxdLAotICAgICAgICBbUFJfTElURVJBTCwKLSAgICAgICAgIG5ldyBSZWdFeHAoCi0gICAgICAgICAgICAgJ14oPzonCi0gICAgICAgICAgICAgLy8gQSBoZXggbnVtYmVyCi0gICAgICAgICAgICAgKyAnMHhbYS1mMC05XSsnCi0gICAgICAgICAgICAgLy8gb3IgYW4gb2N0YWwgb3IgZGVjaW1hbCBudW1iZXIsCi0gICAgICAgICAgICAgKyAnfCg/OlxcZCg/Ol9cXGQrKSpcXGQqKD86XFwuXFxkKik/fFxcLlxcZFxcKyknCi0gICAgICAgICAgICAgLy8gcG9zc2libHkgaW4gc2NpZW50aWZpYyBub3RhdGlvbgotICAgICAgICAgICAgICsgJyg/OmVbK1xcLV0/XFxkKyk/JwotICAgICAgICAgICAgICsgJyknCi0gICAgICAgICAgICAgLy8gd2l0aCBhbiBvcHRpb25hbCBtb2RpZmllciBsaWtlIFVMIGZvciB1bnNpZ25lZCBsb25nCi0gICAgICAgICAgICAgKyAnW2Etel0qJywgJ2knKSwKLSAgICAgICAgIG51bGwsICcwMTIzNDU2Nzg5J10sCi0gICAgICAgIFtQUl9QVU5DVFVBVElPTiwgL14uW15cc1x3XC4kQFwnXCJcYFwvXCNdKi8sIG51bGxdKTsKLQotICAgIHJldHVybiBjcmVhdGVTaW1wbGVMZXhlcihzaG9ydGN1dFN0eWxlUGF0dGVybnMsIGZhbGx0aHJvdWdoU3R5bGVQYXR0ZXJucyk7Ci0gIH0KLQotICB2YXIgZGVjb3JhdGVTb3VyY2UgPSBzb3VyY2VEZWNvcmF0b3IoewotICAgICAgICAna2V5d29yZHMnOiBBTExfS0VZV09SRFMsCi0gICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAnY1N0eWxlQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAnbXVsdGlMaW5lU3RyaW5ncyc6IHRydWUsCi0gICAgICAgICdyZWdleExpdGVyYWxzJzogdHJ1ZQotICAgICAgfSk7Ci0KLSAgLyoqIEJyZWFrcyB7QGNvZGUgam9iLnNvdXJjZX0gYXJvdW5kIHN0eWxlIGJvdW5kYXJpZXMgaW4KLSAgICAqIHtAY29kZSBqb2IuZGVjb3JhdGlvbnN9IHdoaWxlIHJlLWludGVybGVhdmluZyB7QGNvZGUgam9iLmV4dHJhY3RlZFRhZ3N9LAotICAgICogYW5kIGxlYXZlcyB0aGUgcmVzdWx0IGluIHtAY29kZSBqb2IucHJldHR5UHJpbnRlZEh0bWx9LgotICAgICogQHBhcmFtIHtPYmplY3R9IGpvYiBsaWtlIHsKLSAgICAqICAgIHNvdXJjZToge3N0cmluZ30gc291cmNlIGFzIHBsYWluIHRleHQsCi0gICAgKiAgICBleHRyYWN0ZWRUYWdzOiB7QXJyYXkuPG51bWJlcnxzdHJpbmc+fSBleHRyYWN0ZWRUYWdzIGNodW5rcyBvZiByYXcKLSAgICAqICAgICAgICAgICAgICAgICAgIGh0bWwgcHJlY2VkZWQgYnkgdGhlaXIgcG9zaXRpb24gaW4ge0Bjb2RlIGpvYi5zb3VyY2V9Ci0gICAgKiAgICAgICAgICAgICAgICAgICBpbiBvcmRlcgotICAgICogICAgZGVjb3JhdGlvbnM6IHtBcnJheS48bnVtYmVyfHN0cmluZ30gYW4gYXJyYXkgb2Ygc3R5bGUgY2xhc3NlcyBwcmVjZWRlZAotICAgICogICAgICAgICAgICAgICAgIGJ5IHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0aGV5IHN0YXJ0IGluIGpvYi5zb3VyY2UgaW4gb3JkZXIKLSAgICAqIH0KLSAgICAqIEBwcml2YXRlCi0gICAgKi8KLSAgZnVuY3Rpb24gcmVjb21iaW5lVGFnc0FuZERlY29yYXRpb25zKGpvYikgewotICAgIHZhciBzb3VyY2VUZXh0ID0gam9iLnNvdXJjZTsKLSAgICB2YXIgZXh0cmFjdGVkVGFncyA9IGpvYi5leHRyYWN0ZWRUYWdzOwotICAgIHZhciBkZWNvcmF0aW9ucyA9IGpvYi5kZWNvcmF0aW9uczsKLSAgICB2YXIgbnVtYmVyTGluZXMgPSBqb2IubnVtYmVyTGluZXM7Ci0gICAgdmFyIHNvdXJjZU5vZGUgPSBqb2Iuc291cmNlTm9kZTsKLQotICAgIHZhciBodG1sID0gW107Ci0gICAgLy8gaW5kZXggcGFzdCB0aGUgbGFzdCBjaGFyIGluIHNvdXJjZVRleHQgd3JpdHRlbiB0byBodG1sCi0gICAgdmFyIG91dHB1dElkeCA9IDA7Ci0KLSAgICB2YXIgb3BlbkRlY29yYXRpb24gPSBudWxsOwotICAgIHZhciBjdXJyZW50RGVjb3JhdGlvbiA9IG51bGw7Ci0gICAgdmFyIHRhZ1BvcyA9IDA7ICAvLyBpbmRleCBpbnRvIGV4dHJhY3RlZFRhZ3MKLSAgICB2YXIgZGVjUG9zID0gMDsgIC8vIGluZGV4IGludG8gZGVjb3JhdGlvbnMKLSAgICB2YXIgdGFiRXhwYW5kZXIgPSBtYWtlVGFiRXhwYW5kZXIod2luZG93WydQUl9UQUJfV0lEVEgnXSk7Ci0KLSAgICB2YXIgYWRqYWNlbnRTcGFjZVJlID0gLyhbXHJcbiBdKSAvZzsKLSAgICB2YXIgc3RhcnRPclNwYWNlUmUgPSAvKF58ICkgL2dtOwotICAgIHZhciBuZXdsaW5lUmUgPSAvXHJcbj98XG4vZzsKLSAgICB2YXIgdHJhaWxpbmdTcGFjZVJlID0gL1sgXHJcbl0kLzsKLSAgICB2YXIgbGFzdFdhc1NwYWNlID0gdHJ1ZTsgIC8vIHRoZSBsYXN0IHRleHQgY2h1bmsgZW1pdHRlZCBlbmRlZCB3aXRoIGEgc3BhY2UuCi0KLSAgICAvLyBTZWUgYnVnIDcxIGFuZCBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEzNjQ0My93aHktZG9lc250LWllNy0KLSAgICB2YXIgaXNJRTY3OCA9IHdpbmRvd1snX3ByX2lzSUU2J10oKTsKLSAgICB2YXIgbGluZUJyZWFrSHRtbCA9ICgKLSAgICAgICAgaXNJRTY3OAotICAgICAgICA/IChzb3VyY2VOb2RlICYmIHNvdXJjZU5vZGUudGFnTmFtZSA9PT0gJ1BSRScKLSAgICAgICAgICAgLy8gVXNlIGxpbmUgZmVlZHMgaW5zdGVhZCBvZiA8YnI+cyBzbyB0aGF0IGNvcHlpbmcgYW5kIHBhc3Rpbmcgd29ya3MKLSAgICAgICAgICAgLy8gb24gSUUuCi0gICAgICAgICAgIC8vIFNlZSBJc3N1ZSAxMDQgZm9yIHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgbWVzcy4KLSAgICAgICAgICAgPyAoaXNJRTY3OCA9PT0gNiA/ICcmIzE2MDtcclxuJyA6Ci0gICAgICAgICAgICAgIGlzSUU2NzggPT09IDcgPyAnJiMxNjA7PGJyIC8+XHInIDoKLSAgICAgICAgICAgICAgaXNJRTY3OCA9PT0gOCA/ICcmIzE2MDs8YnIgLz4nIDogJyYjMTYwO1xyJykKLSAgICAgICAgICAgLy8gSUUgY29sbGFwc2VzIG11bHRpcGxlIGFkamFjZW50IDxicj5zIGludG8gMSBsaW5lIGJyZWFrLgotICAgICAgICAgICAvLyBQcmVmaXggZXZlcnkgbmV3bGluZSB3aXRoICcmIzE2MDsnIHRvIHByZXZlbnQgc3VjaCBiZWhhdmlvci4KLSAgICAgICAgICAgLy8gJm5ic3A7IGlzIHRoZSBzYW1lIGFzICYjMTYwOyBidXQgd29ya3MgaW4gWE1MIGFzIHdlbGwgYXMgSFRNTC4KLSAgICAgICAgICAgOiAnJiMxNjA7PGJyIC8+JykKLSAgICAgICAgOiAnPGJyIC8+Jyk7Ci0KLSAgICB2YXIgbGluZUJyZWFrZXI7Ci0gICAgaWYgKG51bWJlckxpbmVzKSB7Ci0gICAgICB2YXIgbGluZUJyZWFrcyA9IFtdOwotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgICAgIGxpbmVCcmVha3NbaV0gPSBsaW5lQnJlYWtIdG1sICsgJzwvbGk+PGxpIGNsYXNzPSJMJyArIGkgKyAnIj4nOwotICAgICAgfQotICAgICAgdmFyIGxpbmVOdW0gPSB0eXBlb2YgbnVtYmVyTGluZXMgPT09ICdudW1iZXInCi0gICAgICAgICAgPyBudW1iZXJMaW5lcyAtIDEgLyogbnVtYmVyIGxpbmVzIGFyZSAxIGluZGV4ZWQgKi8gOiAwOwotICAgICAgaHRtbC5wdXNoKCc8b2wgY2xhc3M9ImxpbmVudW1zIj48bGkgY2xhc3M9IkwnLCAobGluZU51bSkgJSAxMCwgJyInKTsKLSAgICAgIGlmIChsaW5lTnVtKSB7Ci0gICAgICAgIGh0bWwucHVzaCgnIHZhbHVlPSInLCBsaW5lTnVtICsgMSwgJyInKTsKLSAgICAgIH0KLSAgICAgIGh0bWwucHVzaCgnPicpOwotICAgICAgbGluZUJyZWFrZXIgPSBmdW5jdGlvbiAoKSB7Ci0gICAgICAgIHZhciBsYiA9IGxpbmVCcmVha3NbKytsaW5lTnVtICUgMTBdOwotICAgICAgICAvLyBJZiBhIGRlY29yYXRpb24gaXMgb3Blbiwgd2UgbmVlZCB0byBjbG9zZSBpdCBiZWZvcmUgY2xvc2luZyBhIGxpc3QtaXRlbQotICAgICAgICAvLyBhbmQgcmVvcGVuIGl0IG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBsaXN0IGl0ZW0uCi0gICAgICAgIHJldHVybiBvcGVuRGVjb3JhdGlvbgotICAgICAgICAgICAgPyAoJzwvc3Bhbj4nICsgbGIgKyAnPHNwYW4gY2xhc3M9IicgKyBvcGVuRGVjb3JhdGlvbiArICciPicpIDogbGI7Ci0gICAgICB9OwotICAgIH0gZWxzZSB7Ci0gICAgICBsaW5lQnJlYWtlciA9IGxpbmVCcmVha0h0bWw7Ci0gICAgfQotCi0gICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBpcyByZXNwb25zaWJsZSBmb3Igb3BlbmluZyBzZWN0aW9ucyBvZiBkZWNvcmF0aW9uCi0gICAgLy8gYW5kIG91dHB1dGluZyBwcm9wZXJseSBlc2NhcGVkIGNodW5rcyBvZiBzb3VyY2UKLSAgICBmdW5jdGlvbiBlbWl0VGV4dFVwVG8oc291cmNlSWR4KSB7Ci0gICAgICBpZiAoc291cmNlSWR4ID4gb3V0cHV0SWR4KSB7Ci0gICAgICAgIGlmIChvcGVuRGVjb3JhdGlvbiAmJiBvcGVuRGVjb3JhdGlvbiAhPT0gY3VycmVudERlY29yYXRpb24pIHsKLSAgICAgICAgICAvLyBDbG9zZSB0aGUgY3VycmVudCBkZWNvcmF0aW9uCi0gICAgICAgICAgaHRtbC5wdXNoKCc8L3NwYW4+Jyk7Ci0gICAgICAgICAgb3BlbkRlY29yYXRpb24gPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICghb3BlbkRlY29yYXRpb24gJiYgY3VycmVudERlY29yYXRpb24pIHsKLSAgICAgICAgICBvcGVuRGVjb3JhdGlvbiA9IGN1cnJlbnREZWNvcmF0aW9uOwotICAgICAgICAgIGh0bWwucHVzaCgnPHNwYW4gY2xhc3M9IicsIG9wZW5EZWNvcmF0aW9uLCAnIj4nKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGlzIGludGVyYWN0cyBiYWRseSB3aXRoIHNvbWUgd2lraXMgd2hpY2ggaW50cm9kdWNlcyBwYXJhZ3JhcGggdGFncwotICAgICAgICAvLyBpbnRvIHByZSBibG9ja3MgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24uCi0gICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IGZvciBJRSB0aG91Z2ggd2hpY2ggc2VlbXMgdG8gbG9zZSB0aGUgcHJlZm9ybWF0dGVkbmVzcwotICAgICAgICAvLyBvZiA8cHJlPiB0YWdzIHdoZW4gdGhlaXIgaW5uZXJIVE1MIGlzIGFzc2lnbmVkLgotICAgICAgICAvLyBodHRwOi8vc3R1ZDMudHV3aWVuLmFjLmF0L35lMDIyNjQzMC9pbm5lckh0bWxRdWlyay5odG1sCi0gICAgICAgIC8vIGFuZCBpdCBzZXJ2ZXMgdG8gdW5kbyB0aGUgY29udmVyc2lvbiBvZiA8YnI+cyB0byBuZXdsaW5lcyBkb25lIGluCi0gICAgICAgIC8vIGNodW5raWZ5LgotICAgICAgICB2YXIgaHRtbENodW5rID0gdGV4dFRvSHRtbCgKLSAgICAgICAgICAgIHRhYkV4cGFuZGVyKHNvdXJjZVRleHQuc3Vic3RyaW5nKG91dHB1dElkeCwgc291cmNlSWR4KSkpCi0gICAgICAgICAgICAucmVwbGFjZShsYXN0V2FzU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgID8gc3RhcnRPclNwYWNlUmUKLSAgICAgICAgICAgICAgICAgICAgIDogYWRqYWNlbnRTcGFjZVJlLCAnJDEmIzE2MDsnKTsKLSAgICAgICAgLy8gS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIG5lZWQgdG8gZXNjYXBlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgICAgIC8vIG5leHQgY2h1bmsuCi0gICAgICAgIGxhc3RXYXNTcGFjZSA9IHRyYWlsaW5nU3BhY2VSZS50ZXN0KGh0bWxDaHVuayk7Ci0gICAgICAgIGh0bWwucHVzaChodG1sQ2h1bmsucmVwbGFjZShuZXdsaW5lUmUsIGxpbmVCcmVha2VyKSk7Ci0gICAgICAgIG91dHB1dElkeCA9IHNvdXJjZUlkeDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlJ3JlIGdvaW5nIHRvIGNvbnN1bWUgYSB0YWcgdGhpcyB0aW1lIGFyb3VuZC4gIE90aGVyd2lzZQotICAgICAgLy8gd2UgY29uc3VtZSBhIGRlY29yYXRpb24gb3IgZXhpdC4KLSAgICAgIHZhciBvdXRwdXRUYWc7Ci0gICAgICBpZiAodGFnUG9zIDwgZXh0cmFjdGVkVGFncy5sZW5ndGgpIHsKLSAgICAgICAgaWYgKGRlY1BvcyA8IGRlY29yYXRpb25zLmxlbmd0aCkgewotICAgICAgICAgIC8vIFBpY2sgb25lIGdpdmluZyBwcmVmZXJlbmNlIHRvIGV4dHJhY3RlZFRhZ3Mgc2luY2Ugd2Ugc2hvdWxkbid0IG9wZW4KLSAgICAgICAgICAvLyBhIG5ldyBzdHlsZSB0aGF0IHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gaW1tZWRpYXRlbHkgY2xvc2UgaW4gb3JkZXIKLSAgICAgICAgICAvLyB0byBvdXRwdXQgYSB0YWcuCi0gICAgICAgICAgb3V0cHV0VGFnID0gZXh0cmFjdGVkVGFnc1t0YWdQb3NdIDw9IGRlY29yYXRpb25zW2RlY1Bvc107Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0cHV0VGFnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0cHV0VGFnID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAvLyBDb25zdW1lIGVpdGhlciBhIGRlY29yYXRpb24gb3IgYSB0YWcgb3IgZXhpdC4KLSAgICAgIGlmIChvdXRwdXRUYWcpIHsKLSAgICAgICAgZW1pdFRleHRVcFRvKGV4dHJhY3RlZFRhZ3NbdGFnUG9zXSk7Ci0gICAgICAgIGlmIChvcGVuRGVjb3JhdGlvbikgewotICAgICAgICAgIC8vIENsb3NlIHRoZSBjdXJyZW50IGRlY29yYXRpb24KLSAgICAgICAgICBodG1sLnB1c2goJzwvc3Bhbj4nKTsKLSAgICAgICAgICBvcGVuRGVjb3JhdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaHRtbC5wdXNoKGV4dHJhY3RlZFRhZ3NbdGFnUG9zICsgMV0pOwotICAgICAgICB0YWdQb3MgKz0gMjsKLSAgICAgIH0gZWxzZSBpZiAoZGVjUG9zIDwgZGVjb3JhdGlvbnMubGVuZ3RoKSB7Ci0gICAgICAgIGVtaXRUZXh0VXBUbyhkZWNvcmF0aW9uc1tkZWNQb3NdKTsKLSAgICAgICAgY3VycmVudERlY29yYXRpb24gPSBkZWNvcmF0aW9uc1tkZWNQb3MgKyAxXTsKLSAgICAgICAgZGVjUG9zICs9IDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZW1pdFRleHRVcFRvKHNvdXJjZVRleHQubGVuZ3RoKTsKLSAgICBpZiAob3BlbkRlY29yYXRpb24pIHsKLSAgICAgIGh0bWwucHVzaCgnPC9zcGFuPicpOwotICAgIH0KLSAgICBpZiAobnVtYmVyTGluZXMpIHsgaHRtbC5wdXNoKCc8L2xpPjwvb2w+Jyk7IH0KLSAgICBqb2IucHJldHR5UHJpbnRlZEh0bWwgPSBodG1sLmpvaW4oJycpOwotICB9Ci0KLSAgLyoqIE1hcHMgbGFuZ3VhZ2Utc3BlY2lmaWMgZmlsZSBleHRlbnNpb25zIHRvIGhhbmRsZXJzLiAqLwotICB2YXIgbGFuZ0hhbmRsZXJSZWdpc3RyeSA9IHt9OwotICAvKiogUmVnaXN0ZXIgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZmlsZSBleHRlbnNpb25zLgotICAgICogQHBhcmFtIHtmdW5jdGlvbiAoT2JqZWN0KX0gaGFuZGxlciBhIGZ1bmN0aW9uIGZyb20gc291cmNlIGNvZGUgdG8gYSBsaXN0Ci0gICAgKiAgICAgIG9mIGRlY29yYXRpb25zLiAgVGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgam9iIHdoaWNoIGRlc2NyaWJlcyB0aGUKLSAgICAqICAgICAgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLiAgIFRoZSBzaW5nbGUgcGFyYW1ldGVyIGhhcyB0aGUgZm9ybQotICAgICogICAgICB7QGNvZGUgewotICAgICogICAgICAgIHNvdXJjZToge3N0cmluZ30gYXMgcGxhaW4gdGV4dC4KLSAgICAqICAgICAgICBkZWNvcmF0aW9uczoge0FycmF5LjxudW1iZXJ8c3RyaW5nPn0gYW4gYXJyYXkgb2Ygc3R5bGUgY2xhc3NlcwotICAgICogICAgICAgICAgICAgICAgICAgICBwcmVjZWRlZCBieSB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhleSBzdGFydCBpbgotICAgICogICAgICAgICAgICAgICAgICAgICBqb2Iuc291cmNlIGluIG9yZGVyLgotICAgICogICAgICAgICAgICAgICAgICAgICBUaGUgbGFuZ3VhZ2UgaGFuZGxlciBzaG91bGQgYXNzaWduZWQgdGhpcyBmaWVsZC4KLSAgICAqICAgICAgICBiYXNlUG9zOiB7aW50fSB0aGUgcG9zaXRpb24gb2Ygc291cmNlIGluIHRoZSBsYXJnZXIgc291cmNlIGNodW5rLgotICAgICogICAgICAgICAgICAgICAgIEFsbCBwb3NpdGlvbnMgaW4gdGhlIG91dHB1dCBkZWNvcmF0aW9ucyBhcnJheSBhcmUgcmVsYXRpdmUKLSAgICAqICAgICAgICAgICAgICAgICB0byB0aGUgbGFyZ2VyIHNvdXJjZSBjaHVuay4KLSAgICAqICAgICAgfSB9Ci0gICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBmaWxlRXh0ZW5zaW9ucwotICAgICovCi0gIGZ1bmN0aW9uIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoaGFuZGxlciwgZmlsZUV4dGVuc2lvbnMpIHsKLSAgICBmb3IgKHZhciBpID0gZmlsZUV4dGVuc2lvbnMubGVuZ3RoOyAtLWkgPj0gMDspIHsKLSAgICAgIHZhciBleHQgPSBmaWxlRXh0ZW5zaW9uc1tpXTsKLSAgICAgIGlmICghbGFuZ0hhbmRsZXJSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShleHQpKSB7Ci0gICAgICAgIGxhbmdIYW5kbGVyUmVnaXN0cnlbZXh0XSA9IGhhbmRsZXI7Ci0gICAgICB9IGVsc2UgaWYgKCdjb25zb2xlJyBpbiB3aW5kb3cpIHsKLSAgICAgICAgY29uc29sZVsnd2FybiddKCdjYW5ub3Qgb3ZlcnJpZGUgbGFuZ3VhZ2UgaGFuZGxlciAlcycsIGV4dCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGZ1bmN0aW9uIGxhbmdIYW5kbGVyRm9yRXh0ZW5zaW9uKGV4dGVuc2lvbiwgc291cmNlKSB7Ci0gICAgaWYgKCEoZXh0ZW5zaW9uICYmIGxhbmdIYW5kbGVyUmVnaXN0cnkuaGFzT3duUHJvcGVydHkoZXh0ZW5zaW9uKSkpIHsKLSAgICAgIC8vIFRyZWF0IGl0IGFzIG1hcmt1cCBpZiB0aGUgZmlyc3Qgbm9uIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGEgPCBhbmQKLSAgICAgIC8vIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBhID4uCi0gICAgICBleHRlbnNpb24gPSAvXlxzKjwvLnRlc3Qoc291cmNlKQotICAgICAgICAgID8gJ2RlZmF1bHQtbWFya3VwJwotICAgICAgICAgIDogJ2RlZmF1bHQtY29kZSc7Ci0gICAgfQotICAgIHJldHVybiBsYW5nSGFuZGxlclJlZ2lzdHJ5W2V4dGVuc2lvbl07Ci0gIH0KLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihkZWNvcmF0ZVNvdXJjZSwgWydkZWZhdWx0LWNvZGUnXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoCi0gICAgICBjcmVhdGVTaW1wbGVMZXhlcigKLSAgICAgICAgICBbXSwKLSAgICAgICAgICBbCi0gICAgICAgICAgIFtQUl9QTEFJTiwgICAgICAgL15bXjw/XSsvXSwKLSAgICAgICAgICAgW1BSX0RFQ0xBUkFUSU9OLCAvXjwhXHdbXj5dKig/Oj58JCkvXSwKLSAgICAgICAgICAgW1BSX0NPTU1FTlQsICAgICAvXjxcIS0tW1xzXFNdKj8oPzotXC0+fCQpL10sCi0gICAgICAgICAgIC8vIFVuZXNjYXBlZCBjb250ZW50IGluIGFuIHVua25vd24gbGFuZ3VhZ2UKLSAgICAgICAgICAgWydsYW5nLScsICAgICAgICAvXjxcPyhbXHNcU10rPykoPzpcPz58JCkvXSwKLSAgICAgICAgICAgWydsYW5nLScsICAgICAgICAvXjwlKFtcc1xTXSs/KSg/OiU+fCQpL10sCi0gICAgICAgICAgIFtQUl9QVU5DVFVBVElPTiwgL14oPzo8WyU/XXxbJT9dPikvXSwKLSAgICAgICAgICAgWydsYW5nLScsICAgICAgICAvXjx4bXBcYltePl0qPihbXHNcU10rPyk8XC94bXBcYltePl0qPi9pXSwKLSAgICAgICAgICAgLy8gVW5lc2NhcGVkIGNvbnRlbnQgaW4gamF2YXNjcmlwdC4gIChPciBwb3NzaWJseSB2YnNjcmlwdCkuCi0gICAgICAgICAgIFsnbGFuZy1qcycsICAgICAgL148c2NyaXB0XGJbXj5dKj4oW1xzXFNdKj8pKDxcL3NjcmlwdFxiW14+XSo+KS9pXSwKLSAgICAgICAgICAgLy8gQ29udGFpbnMgdW5lc2NhcGVkIHN0eWxlc2hlZXQgY29udGVudAotICAgICAgICAgICBbJ2xhbmctY3NzJywgICAgIC9ePHN0eWxlXGJbXj5dKj4oW1xzXFNdKj8pKDxcL3N0eWxlXGJbXj5dKj4pL2ldLAotICAgICAgICAgICBbJ2xhbmctaW4udGFnJywgIC9eKDxcLz9bYS16XVtePD5dKj4pL2ldCi0gICAgICAgICAgXSksCi0gICAgICBbJ2RlZmF1bHQtbWFya3VwJywgJ2h0bScsICdodG1sJywgJ214bWwnLCAneGh0bWwnLCAneG1sJywgJ3hzbCddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcigKLSAgICAgIGNyZWF0ZVNpbXBsZUxleGVyKAotICAgICAgICAgIFsKLSAgICAgICAgICAgW1BSX1BMQUlOLCAgICAgICAgL15bXHNdKy8sIG51bGwsICcgXHRcclxuJ10sCi0gICAgICAgICAgIFtQUl9BVFRSSUJfVkFMVUUsIC9eKD86XCJbXlwiXSpcIj98XCdbXlwnXSpcJz8pLywgbnVsbCwgJ1wiXCcnXQotICAgICAgICAgICBdLAotICAgICAgICAgIFsKLSAgICAgICAgICAgW1BSX1RBRywgICAgICAgICAgL15ePFwvP1thLXpdKD86W1x3LjotXSpcdyk/fFwvPz4kL2ldLAotICAgICAgICAgICBbUFJfQVRUUklCX05BTUUsICAvXig/IXN0eWxlW1xzPV18b24pW2Etel0oPzpbXHc6LV0qXHcpPy9pXSwKLSAgICAgICAgICAgWydsYW5nLXVxLnZhbCcsICAgL149XHMqKFtePlwnXCJcc10qKD86W14+XCdcIlxzXC9dfFwvKD89XHMpKSkvXSwKLSAgICAgICAgICAgW1BSX1BVTkNUVUFUSU9OLCAgL15bPTw+XC9dKy9dLAotICAgICAgICAgICBbJ2xhbmctanMnLCAgICAgICAvXm9uXHcrXHMqPVxzKlwiKFteXCJdKylcIi9pXSwKLSAgICAgICAgICAgWydsYW5nLWpzJywgICAgICAgL15vblx3K1xzKj1ccypcJyhbXlwnXSspXCcvaV0sCi0gICAgICAgICAgIFsnbGFuZy1qcycsICAgICAgIC9eb25cdytccyo9XHMqKFteXCJcJz5cc10rKS9pXSwKLSAgICAgICAgICAgWydsYW5nLWNzcycsICAgICAgL15zdHlsZVxzKj1ccypcIihbXlwiXSspXCIvaV0sCi0gICAgICAgICAgIFsnbGFuZy1jc3MnLCAgICAgIC9ec3R5bGVccyo9XHMqXCcoW15cJ10rKVwnL2ldLAotICAgICAgICAgICBbJ2xhbmctY3NzJywgICAgICAvXnN0eWxlXHMqPVxzKihbXlwiXCc+XHNdKykvaV0KLSAgICAgICAgICAgXSksCi0gICAgICBbJ2luLnRhZyddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcigKLSAgICAgIGNyZWF0ZVNpbXBsZUxleGVyKFtdLCBbW1BSX0FUVFJJQl9WQUxVRSwgL15bXHNcU10rL11dKSwgWyd1cS52YWwnXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiBDUFBfS0VZV09SRFMsCi0gICAgICAgICAgJ2hhc2hDb21tZW50cyc6IHRydWUsCi0gICAgICAgICAgJ2NTdHlsZUNvbW1lbnRzJzogdHJ1ZQotICAgICAgICB9KSwgWydjJywgJ2NjJywgJ2NwcCcsICdjeHgnLCAnY3ljJywgJ20nXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiAnbnVsbCB0cnVlIGZhbHNlJwotICAgICAgICB9KSwgWydqc29uJ10pOwotICByZWdpc3RlckxhbmdIYW5kbGVyKHNvdXJjZURlY29yYXRvcih7Ci0gICAgICAgICAgJ2tleXdvcmRzJzogQ1NIQVJQX0tFWVdPUkRTLAotICAgICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdjU3R5bGVDb21tZW50cyc6IHRydWUsCi0gICAgICAgICAgJ3ZlcmJhdGltU3RyaW5ncyc6IHRydWUKLSAgICAgICAgfSksIFsnY3MnXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiBKQVZBX0tFWVdPUkRTLAotICAgICAgICAgICdjU3R5bGVDb21tZW50cyc6IHRydWUKLSAgICAgICAgfSksIFsnamF2YSddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihzb3VyY2VEZWNvcmF0b3IoewotICAgICAgICAgICdrZXl3b3Jkcyc6IFNIX0tFWVdPUkRTLAotICAgICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdtdWx0aUxpbmVTdHJpbmdzJzogdHJ1ZQotICAgICAgICB9KSwgWydic2gnLCAnY3NoJywgJ3NoJ10pOwotICByZWdpc3RlckxhbmdIYW5kbGVyKHNvdXJjZURlY29yYXRvcih7Ci0gICAgICAgICAgJ2tleXdvcmRzJzogUFlUSE9OX0tFWVdPUkRTLAotICAgICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdtdWx0aUxpbmVTdHJpbmdzJzogdHJ1ZSwKLSAgICAgICAgICAndHJpcGxlUXVvdGVkU3RyaW5ncyc6IHRydWUKLSAgICAgICAgfSksIFsnY3YnLCAncHknXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiBQRVJMX0tFWVdPUkRTLAotICAgICAgICAgICdoYXNoQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdtdWx0aUxpbmVTdHJpbmdzJzogdHJ1ZSwKLSAgICAgICAgICAncmVnZXhMaXRlcmFscyc6IHRydWUKLSAgICAgICAgfSksIFsncGVybCcsICdwbCcsICdwbSddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihzb3VyY2VEZWNvcmF0b3IoewotICAgICAgICAgICdrZXl3b3Jkcyc6IFJVQllfS0VZV09SRFMsCi0gICAgICAgICAgJ2hhc2hDb21tZW50cyc6IHRydWUsCi0gICAgICAgICAgJ211bHRpTGluZVN0cmluZ3MnOiB0cnVlLAotICAgICAgICAgICdyZWdleExpdGVyYWxzJzogdHJ1ZQotICAgICAgICB9KSwgWydyYiddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihzb3VyY2VEZWNvcmF0b3IoewotICAgICAgICAgICdrZXl3b3Jkcyc6IEpTQ1JJUFRfS0VZV09SRFMsCi0gICAgICAgICAgJ2NTdHlsZUNvbW1lbnRzJzogdHJ1ZSwKLSAgICAgICAgICAncmVnZXhMaXRlcmFscyc6IHRydWUKLSAgICAgICAgfSksIFsnanMnXSk7Ci0gIHJlZ2lzdGVyTGFuZ0hhbmRsZXIoc291cmNlRGVjb3JhdG9yKHsKLSAgICAgICAgICAna2V5d29yZHMnOiBDT0ZGRUVfS0VZV09SRFMsCi0gICAgICAgICAgJ2hhc2hDb21tZW50cyc6IDMsICAvLyAjIyMgc3R5bGUgYmxvY2sgY29tbWVudHMKLSAgICAgICAgICAnY1N0eWxlQ29tbWVudHMnOiB0cnVlLAotICAgICAgICAgICdtdWx0aWxpbmVTdHJpbmdzJzogdHJ1ZSwKLSAgICAgICAgICAndHJpcGxlUXVvdGVkU3RyaW5ncyc6IHRydWUsCi0gICAgICAgICAgJ3JlZ2V4TGl0ZXJhbHMnOiB0cnVlCi0gICAgICAgIH0pLCBbJ2NvZmZlZSddKTsKLSAgcmVnaXN0ZXJMYW5nSGFuZGxlcihjcmVhdGVTaW1wbGVMZXhlcihbXSwgW1tQUl9TVFJJTkcsIC9eW1xzXFNdKy9dXSksIFsncmVnZXgnXSk7Ci0KLSAgZnVuY3Rpb24gYXBwbHlEZWNvcmF0b3Ioam9iKSB7Ci0gICAgdmFyIHNvdXJjZUNvZGVIdG1sID0gam9iLnNvdXJjZUNvZGVIdG1sOwotICAgIHZhciBvcHRfbGFuZ0V4dGVuc2lvbiA9IGpvYi5sYW5nRXh0ZW5zaW9uOwotCi0gICAgLy8gUHJlcG9wdWxhdGUgb3V0cHV0IGluIGNhc2UgcHJvY2Vzc2luZyBmYWlscyB3aXRoIGFuIGV4Y2VwdGlvbi4KLSAgICBqb2IucHJldHR5UHJpbnRlZEh0bWwgPSBzb3VyY2VDb2RlSHRtbDsKLQotICAgIHRyeSB7Ci0gICAgICAvLyBFeHRyYWN0IHRhZ3MsIGFuZCBjb252ZXJ0IHRoZSBzb3VyY2UgY29kZSB0byBwbGFpbiB0ZXh0LgotICAgICAgdmFyIHNvdXJjZUFuZEV4dHJhY3RlZFRhZ3MgPSBleHRyYWN0VGFncyhzb3VyY2VDb2RlSHRtbCk7Ci0gICAgICAvKiogUGxhaW4gdGV4dC4gQHR5cGUge3N0cmluZ30gKi8KLSAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VBbmRFeHRyYWN0ZWRUYWdzLnNvdXJjZTsKLSAgICAgIGpvYi5zb3VyY2UgPSBzb3VyY2U7Ci0gICAgICBqb2IuYmFzZVBvcyA9IDA7Ci0KLSAgICAgIC8qKiBFdmVuIGVudHJpZXMgYXJlIHBvc2l0aW9ucyBpbiBzb3VyY2UgaW4gYXNjZW5kaW5nIG9yZGVyLiAgT2RkIGVudHJpZXMKLSAgICAgICAgKiBhcmUgdGFncyB0aGF0IHdlcmUgZXh0cmFjdGVkIGF0IHRoYXQgcG9zaXRpb24uCi0gICAgICAgICogQHR5cGUge0FycmF5LjxudW1iZXJ8c3RyaW5nPn0KLSAgICAgICAgKi8KLSAgICAgIGpvYi5leHRyYWN0ZWRUYWdzID0gc291cmNlQW5kRXh0cmFjdGVkVGFncy50YWdzOwotCi0gICAgICAvLyBBcHBseSB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgaGFuZGxlcgotICAgICAgbGFuZ0hhbmRsZXJGb3JFeHRlbnNpb24ob3B0X2xhbmdFeHRlbnNpb24sIHNvdXJjZSkoam9iKTsKLSAgICAgIC8vIEludGVncmF0ZSB0aGUgZGVjb3JhdGlvbnMgYW5kIHRhZ3MgYmFjayBpbnRvIHRoZSBzb3VyY2UgY29kZSB0byBwcm9kdWNlCi0gICAgICAvLyBhIGRlY29yYXRlZCBodG1sIHN0cmluZyB3aGljaCBpcyBsZWZ0IGluIGpvYi5wcmV0dHlQcmludGVkSHRtbC4KLSAgICAgIHJlY29tYmluZVRhZ3NBbmREZWNvcmF0aW9ucyhqb2IpOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgIGlmICgnY29uc29sZScgaW4gd2luZG93KSB7Ci0gICAgICAgIGNvbnNvbGVbJ2xvZyddKGUgJiYgZVsnc3RhY2snXSA/IGVbJ3N0YWNrJ10gOiBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNvdXJjZUNvZGVIdG1sIHtzdHJpbmd9IFRoZSBIVE1MIHRvIHByZXR0eSBwcmludC4KLSAgICogQHBhcmFtIG9wdF9sYW5nRXh0ZW5zaW9uIHtzdHJpbmd9IFRoZSBsYW5ndWFnZSBuYW1lIHRvIHVzZS4KLSAgICogICAgIFR5cGljYWxseSwgYSBmaWxlbmFtZSBleHRlbnNpb24gbGlrZSAnY3BwJyBvciAnamF2YScuCi0gICAqIEBwYXJhbSBvcHRfbnVtYmVyTGluZXMge251bWJlcnxib29sZWFufSBUcnVlIHRvIG51bWJlciBsaW5lcywKLSAgICogICAgIG9yIHRoZSAxLWluZGV4ZWQgbnVtYmVyIG9mIHRoZSBmaXJzdCBsaW5lIGluIHNvdXJjZUNvZGVIdG1sLgotICAgKi8KLSAgZnVuY3Rpb24gcHJldHR5UHJpbnRPbmUoc291cmNlQ29kZUh0bWwsIG9wdF9sYW5nRXh0ZW5zaW9uLCBvcHRfbnVtYmVyTGluZXMpIHsKLSAgICB2YXIgam9iID0gewotICAgICAgc291cmNlQ29kZUh0bWw6IHNvdXJjZUNvZGVIdG1sLAotICAgICAgbGFuZ0V4dGVuc2lvbjogb3B0X2xhbmdFeHRlbnNpb24sCi0gICAgICBudW1iZXJMaW5lczogb3B0X251bWJlckxpbmVzCi0gICAgfTsKLSAgICBhcHBseURlY29yYXRvcihqb2IpOwotICAgIHJldHVybiBqb2IucHJldHR5UHJpbnRlZEh0bWw7Ci0gIH0KLQotICBmdW5jdGlvbiBwcmV0dHlQcmludChvcHRfd2hlbkRvbmUpIHsKLSAgICBmdW5jdGlvbiBieVRhZ05hbWUodG4pIHsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRuKTsgfQotICAgIC8vIGZldGNoIGEgbGlzdCBvZiBub2RlcyB0byByZXdyaXRlCi0gICAgdmFyIGNvZGVTZWdtZW50cyA9IFtieVRhZ05hbWUoJ3ByZScpLCBieVRhZ05hbWUoJ2NvZGUnKSwgYnlUYWdOYW1lKCd4bXAnKV07Ci0gICAgdmFyIGVsZW1lbnRzID0gW107Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2RlU2VnbWVudHMubGVuZ3RoOyArK2kpIHsKLSAgICAgIGZvciAodmFyIGogPSAwLCBuID0gY29kZVNlZ21lbnRzW2ldLmxlbmd0aDsgaiA8IG47ICsraikgewotICAgICAgICBlbGVtZW50cy5wdXNoKGNvZGVTZWdtZW50c1tpXVtqXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvZGVTZWdtZW50cyA9IG51bGw7Ci0KLSAgICB2YXIgY2xvY2sgPSBEYXRlOwotICAgIGlmICghY2xvY2tbJ25vdyddKSB7Ci0gICAgICBjbG9jayA9IHsgJ25vdyc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChuZXcgRGF0ZSkuZ2V0VGltZSgpOyB9IH07Ci0gICAgfQotCi0gICAgLy8gVGhlIGxvb3AgaXMgYnJva2VuIGludG8gYSBzZXJpZXMgb2YgY29udGludWF0aW9ucyB0byBtYWtlIHN1cmUgdGhhdCB3ZQotICAgIC8vIGRvbid0IG1ha2UgdGhlIGJyb3dzZXIgdW5yZXNwb25zaXZlIHdoZW4gcmV3cml0aW5nIGEgbGFyZ2UgcGFnZS4KLSAgICB2YXIgayA9IDA7Ci0gICAgdmFyIHByZXR0eVByaW50aW5nSm9iOwotCi0gICAgZnVuY3Rpb24gZG9Xb3JrKCkgewotICAgICAgdmFyIGVuZFRpbWUgPSAod2luZG93WydQUl9TSE9VTERfVVNFX0NPTlRJTlVBVElPTiddID8KLSAgICAgICAgICAgICAgICAgICAgIGNsb2NrLm5vdygpICsgMjUwIC8qIG1zICovIDoKLSAgICAgICAgICAgICAgICAgICAgIEluZmluaXR5KTsKLSAgICAgIGZvciAoOyBrIDwgZWxlbWVudHMubGVuZ3RoICYmIGNsb2NrLm5vdygpIDwgZW5kVGltZTsgaysrKSB7Ci0gICAgICAgIHZhciBjcyA9IGVsZW1lbnRzW2tdOwotICAgICAgICBpZiAoY3MuY2xhc3NOYW1lICYmIGNzLmNsYXNzTmFtZS5pbmRleE9mKCdwcmV0dHlwcmludCcpID49IDApIHsKLSAgICAgICAgICAvLyBJZiB0aGUgY2xhc3NlcyBpbmNsdWRlcyBhIGxhbmd1YWdlIGV4dGVuc2lvbnMsIHVzZSBpdC4KLSAgICAgICAgICAvLyBMYW5ndWFnZSBleHRlbnNpb25zIGNhbiBiZSBzcGVjaWZpZWQgbGlrZQotICAgICAgICAgIC8vICAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNwcCI+Ci0gICAgICAgICAgLy8gdGhlIGxhbmd1YWdlIGV4dGVuc2lvbiAiY3BwIiBpcyB1c2VkIHRvIGZpbmQgYSBsYW5ndWFnZSBoYW5kbGVyIGFzCi0gICAgICAgICAgLy8gcGFzc2VkIHRvIFBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIuCi0gICAgICAgICAgdmFyIGxhbmdFeHRlbnNpb24gPSBjcy5jbGFzc05hbWUubWF0Y2goL1xibGFuZy0oXHcrKVxiLyk7Ci0gICAgICAgICAgaWYgKGxhbmdFeHRlbnNpb24pIHsgbGFuZ0V4dGVuc2lvbiA9IGxhbmdFeHRlbnNpb25bMV07IH0KLQotICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGlzIGlzIG5vdCBuZXN0ZWQgaW4gYW4gYWxyZWFkeSBwcmV0dGlmaWVkIGVsZW1lbnQKLSAgICAgICAgICB2YXIgbmVzdGVkID0gZmFsc2U7Ci0gICAgICAgICAgZm9yICh2YXIgcCA9IGNzLnBhcmVudE5vZGU7IHA7IHAgPSBwLnBhcmVudE5vZGUpIHsKLSAgICAgICAgICAgIGlmICgocC50YWdOYW1lID09PSAncHJlJyB8fCBwLnRhZ05hbWUgPT09ICdjb2RlJyB8fAotICAgICAgICAgICAgICAgICBwLnRhZ05hbWUgPT09ICd4bXAnKSAmJgotICAgICAgICAgICAgICAgIHAuY2xhc3NOYW1lICYmIHAuY2xhc3NOYW1lLmluZGV4T2YoJ3ByZXR0eXByaW50JykgPj0gMCkgewotICAgICAgICAgICAgICBuZXN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFuZXN0ZWQpIHsKLSAgICAgICAgICAgIC8vIGZldGNoIHRoZSBjb250ZW50IGFzIGEgc25pcHBldCBvZiBwcm9wZXJseSBlc2NhcGVkIEhUTUwuCi0gICAgICAgICAgICAvLyBGaXJlZm94IGFkZHMgbmV3bGluZXMgYXQgdGhlIGVuZC4KLSAgICAgICAgICAgIHZhciBjb250ZW50ID0gZ2V0SW5uZXJIdG1sKGNzKTsKLSAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyg/OlxyXG4/fFxuKSQvLCAnJyk7Ci0KLSAgICAgICAgICAgIC8vIExvb2sgZm9yIGEgY2xhc3MgbGlrZSBsaW5lbnVtcyBvciBsaW5lbnVtczo8bj4gd2hlcmUgPG4+IGlzIHRoZQotICAgICAgICAgICAgLy8gMS1pbmRleGVkIG51bWJlciBvZiB0aGUgZmlyc3QgbGluZS4KLSAgICAgICAgICAgIHZhciBudW1iZXJMaW5lcyA9IGNzLmNsYXNzTmFtZS5tYXRjaCgvXGJsaW5lbnVtc1xiKD86OihcZCspKT8vKTsKLQotICAgICAgICAgICAgLy8gZG8gdGhlIHByZXR0eSBwcmludGluZwotICAgICAgICAgICAgcHJldHR5UHJpbnRpbmdKb2IgPSB7Ci0gICAgICAgICAgICAgIHNvdXJjZUNvZGVIdG1sOiBjb250ZW50LAotICAgICAgICAgICAgICBsYW5nRXh0ZW5zaW9uOiBsYW5nRXh0ZW5zaW9uLAotICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjcywKLSAgICAgICAgICAgICAgbnVtYmVyTGluZXM6IG51bWJlckxpbmVzCi0gICAgICAgICAgICAgICAgICA/IG51bWJlckxpbmVzWzFdICYmIG51bWJlckxpbmVzWzFdLmxlbmd0aCA/ICtudW1iZXJMaW5lc1sxXSA6IHRydWUKLSAgICAgICAgICAgICAgICAgIDogZmFsc2UKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBhcHBseURlY29yYXRvcihwcmV0dHlQcmludGluZ0pvYik7Ci0gICAgICAgICAgICByZXBsYWNlV2l0aFByZXR0eVByaW50ZWRIdG1sKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoayA8IGVsZW1lbnRzLmxlbmd0aCkgewotICAgICAgICAvLyBmaW5pc2ggdXAgaW4gYSBjb250aW51YXRpb24KLSAgICAgICAgc2V0VGltZW91dChkb1dvcmssIDI1MCk7Ci0gICAgICB9IGVsc2UgaWYgKG9wdF93aGVuRG9uZSkgewotICAgICAgICBvcHRfd2hlbkRvbmUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZXBsYWNlV2l0aFByZXR0eVByaW50ZWRIdG1sKCkgewotICAgICAgdmFyIG5ld0NvbnRlbnQgPSBwcmV0dHlQcmludGluZ0pvYi5wcmV0dHlQcmludGVkSHRtbDsKLSAgICAgIGlmICghbmV3Q29udGVudCkgeyByZXR1cm47IH0KLSAgICAgIHZhciBjcyA9IHByZXR0eVByaW50aW5nSm9iLnNvdXJjZU5vZGU7Ci0KLSAgICAgIC8vIHB1c2ggdGhlIHByZXR0aWZpZWQgaHRtbCBiYWNrIGludG8gdGhlIHRhZy4KLSAgICAgIGlmICghaXNSYXdDb250ZW50KGNzKSkgewotICAgICAgICAvLyBqdXN0IHJlcGxhY2UgdGhlIG9sZCBodG1sIHdpdGggdGhlIG5ldwotICAgICAgICBjcy5pbm5lckhUTUwgPSBuZXdDb250ZW50OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHRhZyB0byBhIDxwcmU+IHNpbmNlIDx4bXA+cyBkbyBub3QgYWxsb3cKLSAgICAgICAgLy8gZW1iZWRkZWQgdGFncyBzdWNoIGFzIHRoZSBzcGFuIHRhZ3MgdXNlZCB0byBhdHRhY2ggc3R5bGVzIHRvCi0gICAgICAgIC8vIHNlY3Rpb25zIG9mIHNvdXJjZSBjb2RlLgotICAgICAgICB2YXIgcHJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnUFJFJyk7Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3MuYXR0cmlidXRlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgIHZhciBhID0gY3MuYXR0cmlidXRlc1tpXTsKLSAgICAgICAgICBpZiAoYS5zcGVjaWZpZWQpIHsKLSAgICAgICAgICAgIHZhciBhbmFtZSA9IGEubmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKGFuYW1lID09PSAnY2xhc3MnKSB7Ci0gICAgICAgICAgICAgIHByZS5jbGFzc05hbWUgPSBhLnZhbHVlOyAgLy8gRm9yIElFIDYKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHByZS5zZXRBdHRyaWJ1dGUoYS5uYW1lLCBhLnZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJlLmlubmVySFRNTCA9IG5ld0NvbnRlbnQ7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIHRoZSBvbGQKLSAgICAgICAgY3MucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQocHJlLCBjcyk7Ci0gICAgICAgIGNzID0gcHJlOwotICAgICAgfQotICAgIH0KLQotICAgIGRvV29yaygpOwotICB9Ci0KLSAgd2luZG93WydQUl9ub3JtYWxpemVkSHRtbCddID0gbm9ybWFsaXplZEh0bWw7Ci0gIHdpbmRvd1sncHJldHR5UHJpbnRPbmUnXSA9IHByZXR0eVByaW50T25lOwotICB3aW5kb3dbJ3ByZXR0eVByaW50J10gPSBwcmV0dHlQcmludDsKLSAgd2luZG93WydQUiddID0gewotICAgICAgICAnY29tYmluZVByZWZpeFBhdHRlcm5zJzogY29tYmluZVByZWZpeFBhdHRlcm5zLAotICAgICAgICAnY3JlYXRlU2ltcGxlTGV4ZXInOiBjcmVhdGVTaW1wbGVMZXhlciwKLSAgICAgICAgJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInOiByZWdpc3RlckxhbmdIYW5kbGVyLAotICAgICAgICAnc291cmNlRGVjb3JhdG9yJzogc291cmNlRGVjb3JhdG9yLAotICAgICAgICAnUFJfQVRUUklCX05BTUUnOiBQUl9BVFRSSUJfTkFNRSwKLSAgICAgICAgJ1BSX0FUVFJJQl9WQUxVRSc6IFBSX0FUVFJJQl9WQUxVRSwKLSAgICAgICAgJ1BSX0NPTU1FTlQnOiBQUl9DT01NRU5ULAotICAgICAgICAnUFJfREVDTEFSQVRJT04nOiBQUl9ERUNMQVJBVElPTiwKLSAgICAgICAgJ1BSX0tFWVdPUkQnOiBQUl9LRVlXT1JELAotICAgICAgICAnUFJfTElURVJBTCc6IFBSX0xJVEVSQUwsCi0gICAgICAgICdQUl9OT0NPREUnOiBQUl9OT0NPREUsCi0gICAgICAgICdQUl9QTEFJTic6IFBSX1BMQUlOLAotICAgICAgICAnUFJfUFVOQ1RVQVRJT04nOiBQUl9QVU5DVFVBVElPTiwKLSAgICAgICAgJ1BSX1NPVVJDRSc6IFBSX1NPVVJDRSwKLSAgICAgICAgJ1BSX1NUUklORyc6IFBSX1NUUklORywKLSAgICAgICAgJ1BSX1RBRyc6IFBSX1RBRywKLSAgICAgICAgJ1BSX1RZUEUnOiBQUl9UWVBFCi0gICAgICB9OwotfSkoKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWFwb2xsby5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDkgT25ubyBIb21tZXMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgdGhlIEFHQy9BRUEgQXNzZW1ibHkgTGFuZ3VhZ2UgYXMgZGVzY3JpYmVkCi0gKiBhdCBodHRwOi8vdmlydHVhbGFnYy5nb29nbGVjb2RlLmNvbQotICogPHA+Ci0gKiBUaGlzIGZpbGUgY291bGQgYmUgdXNlZCBieSBnb29kbGUgY29kZSB0byBhbGxvdyBzeW50YXggaGlnaGxpZ2h0IGZvcgotICogVmlydHVhbCBBR0MgU1ZOIHJlcG9zaXRvcnkgb3IgaWYgeW91IGRvbid0IHdhbnQgdG8gY29tbW9uaXplCi0gKiB0aGUgaGVhZGVyIGZvciB0aGUgYWdjL2FlYSBodG1sIGFzc2VtYmx5IGxpc3RpbmcuCi0gKgotICogQGF1dGhvciBvaG9tbWVzQGFsdW1uaS5jbXUuZWR1Ci0gKi8KLQotUFJbJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInXSgKLSAgICBQUlsnY3JlYXRlU2ltcGxlTGV4ZXInXSgKLSAgICAgICAgWwotICAgICAgICAgLy8gQSBsaW5lIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCA7Ci0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgICAgIC9eI1teXHJcbl0qLywgbnVsbCwgJyMnXSwKLSAgICAgICAgIC8vIFdoaXRlc3BhY2UKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgICAgICAgL15bXHRcblxyIFx4QTBdKy8sIG51bGwsICdcdFxuXHIgXHhBMCddLAotICAgICAgICAgLy8gQSBkb3VibGUgcXVvdGVkLCBwb3NzaWJseSBtdWx0aS1saW5lLCBzdHJpbmcuCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLCAgICAgIC9eXCIoPzpbXlwiXFxdfFxcW1xzXFNdKSooPzpcInwkKS8sIG51bGwsICciJ10KLSAgICAgICAgXSwKLSAgICAgICAgWwotICAgICAgICAgW1BSWydQUl9LRVlXT1JEJ10sIC9eKD86QURTfEFEfEFVR3xCWkZ8QlpNRnxDQUV8Q0FGfENBfENDU3xDT018Q1N8REFTfERDQXxEQ09NfERDU3xERE9VQkx8RElNfERPVUJMRXxEVENCfERUQ0Z8RFZ8RFhDSHxFRFJVUFR8RVhURU5EfElOQ1J8SU5ERVh8TkRYfElOSElOVHxMWENIfE1BU0t8TVNLfE1QfE1TVXxOT09QfE9WU0t8UVhDSHxSQU5EfFJFQUR8UkVMSU5UfFJFU1VNRXxSRVRVUk58Uk9SfFJYT1J8U1FVQVJFfFNVfFRDUnxUQ0FBfE9WU0t8VENGfFRDfFRTfFdBTkR8V09SfFdSSVRFfFhDSHxYTFF8WFhBTFF8Wkx8WlF8QUREfEFEWnxTVUJ8U1VafE1QWXxNUFJ8TVBafERWUHxDT018QUJTfENMQXxDTFp8TERRfFNUT3xTVFF8QUxTfExMU3xMUlN8VFJBfFRTUXxUTUl8VE9WfEFYVHxUSVh8RExZfElOUHxPVVQpXHMvLG51bGxdLAotICAgICAgICAgW1BSWydQUl9UWVBFJ10sIC9eKD86LT9HRU5BRFJ8PU1JTlVTfDJCQ0FEUnxWTnxCT0Z8TU18LT8yQ0FEUnwtP1sxLTZdRE5BRFJ8QURSRVN8QkJDT058W1NFXT9CQU5LXD0/fEJMT0NLfEJOS1NVTXxFP0NBRFJ8Q09VTlRcKj98Mj9ERUNcKj98LT9ETkNIQU58LT9ETlBUUnxFUVVBTFN8RVJBU0V8TUVNT1JZfDI/T0NUfFJFTUFEUnxTRVRMT0N8U1VCUk98T1JHfEJTU3xCRVN8U1lOfEVRVXxERUZJTkV8RU5EKVxzLyxudWxsXSwKLSAgICAgICAgIC8vIEEgc2luZ2xlIHF1b3RlIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGEgd29yZCB0aGF0IG9wdGlvbmFsbHkgZW5kcyB3aXRoCi0gICAgICAgICAvLyA9ICEgb3IgPy4KLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLAotICAgICAgICAgIC9eXCcoPzotKig/Olx3fFxcW1x4MjEtXHg3ZV0pKD86W1x3LV0qfFxcW1x4MjEtXHg3ZV0pWz0hP10/KT8vXSwKLSAgICAgICAgIC8vIEFueSB3b3JkIGluY2x1ZGluZyBsYWJlbHMgdGhhdCBvcHRpb25hbGx5IGVuZHMgd2l0aCA9ICEgb3IgPy4KLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwKLSAgICAgICAgICAvXi0qKD86WyEtel9dfFxcW1x4MjEtXHg3ZV0pKD86W1x3LV0qfFxcW1x4MjEtXHg3ZV0pWz0hP10/L2ldLAotICAgICAgICAgLy8gQSBwcmludGFibGUgbm9uLXNwYWNlIG5vbi1zcGVjaWFsIGNoYXJhY3RlcgotICAgICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXlteXHdcdFxuXHIgXHhBMCgpXCJcXFwnO10rL10KLSAgICAgICAgXSksCi0gICAgWydhcG9sbG8nLCAnYWdjJywgJ2FlYSddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWNsai5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciBDbG9qdXJlLgotICoKLSAqCi0gKiBUbyB1c2UsIGluY2x1ZGUgcHJldHRpZnkuanMgYW5kIHRoaXMgZmlsZSBpbiB5b3VyIEhUTUwgcGFnZS4KLSAqIFRoZW4gcHV0IHlvdXIgY29kZSBpbiBhbiBIVE1MIHRhZyBsaWtlCi0gKiAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctbGlzcCI+KG15IGxpc3AgY29kZSk8L3ByZT4KLSAqIFRoZSBsYW5nLWNsIGNsYXNzIGlkZW50aWZpZXMgdGhlIGxhbmd1YWdlIGFzIGNvbW1vbiBsaXNwLgotICogVGhpcyBmaWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2UgZXh0ZW5zaW9uczoKLSAqICAgICBsYW5nLWNsaiAtIENsb2p1cmUKLSAqCi0gKgotICogSSB1c2VkIGxhbmctbGlzcC5qcyBhcyB0aGUgYmFzaXMgZm9yIHRoaXMgYWRkaW5nIHRoZSBjbG9qdXJlIHNwZWNpZmljCi0gKiBrZXl3b3JkcyBhbmQgc3ludGF4LgotICoKLSAqICJOYW1lIiAgICA9ICdDbG9qdXJlJwotICogIkF1dGhvciIgID0gJ1JpY2ggSGlja2V5JwotICogIlZlcnNpb24iID0gJzEuMicKLSAqICJBYm91dCIgICA9ICdDbG9qdXJlIGlzIGEgbGlzcCBmb3IgdGhlIGp2bSB3aXRoIGNvbmN1cnJlbmN5IHByaW1pdGl2ZXMgYW5kIGEgcmljaGVyIHNldCBvZiB0eXBlcy4nCi0gKgotICoKLSAqIEkgdXNlZCA8YSBocmVmPSJodHRwOi8vY2xvanVyZS5vcmcvUmVmZXJlbmNlIj5DbG9qdXJlLm9yZyBSZWZlcmVuY2U8L2E+IGFzCi0gKiB0aGUgYmFzaXMgZm9yIHRoZSByZXNlcnZlZCB3b3JkIGxpc3QuCi0gKgotICoKLSAqIEBhdXRob3IgandhbGxAZ29vZ2xlLmNvbQotICovCi0KLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oCi0gICAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oCi0gICAgICAgIFsKLSAgICAgICAgIC8vIGNsb2p1cmUgaGFzIG1vcmUgcGFyZW4gdHlwZXMgdGhhbiBtaW5pbWFsIGxpc3AuCi0gICAgICAgICBbJ29wbicsICAgICAgICAgICAgIC9eW1woXHtcW10rLywgbnVsbCwgJyhbeyddLAotICAgICAgICAgWydjbG8nLCAgICAgICAgICAgICAvXltcKVx9XF1dKy8sIG51bGwsICcpXX0nXSwKLSAgICAgICAgIC8vIEEgbGluZSBjb21tZW50IHRoYXQgc3RhcnRzIHdpdGggOwotICAgICAgICAgW1BSWydQUl9DT01NRU5UJ10sICAgICAvXjtbXlxyXG5dKi8sIG51bGwsICc7J10sCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIHF1b3RlZCwgcG9zc2libHkgbXVsdGktbGluZSwgc3RyaW5nLgotICAgICAgICAgW1BSWydQUl9TVFJJTkcnXSwgICAgICAvXlwiKD86W15cIlxcXXxcXFtcc1xTXSkqKD86XCJ8JCkvLCBudWxsLCAnIiddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIGNsb2p1cmUgaGFzIGEgbXVjaCBsYXJnZXIgc2V0IG9mIGtleXdvcmRzCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwgICAgIC9eKD86ZGVmfGlmfGRvfGxldHxxdW90ZXx2YXJ8Zm58bG9vcHxyZWN1cnx0aHJvd3x0cnl8bW9uaXRvci1lbnRlcnxtb25pdG9yLWV4aXR8ZGVmbWFjcm98ZGVmbnxkZWZuLXxtYWNyb2V4cGFuZHxtYWNyb2V4cGFuZC0xfGZvcnxkb3NlcXxkb3N5bmN8ZG90aW1lc3xhbmR8b3J8d2hlbnxub3R8YXNzZXJ0fGRvdG98cHJveHl8ZGVmc3RydWN0fGZpcnN0fHJlc3R8Y29uc3xkZWZwcm90b2NvbHxkZWZ0eXBlfGRlZnJlY29yZHxyZWlmeXxkZWZtdWx0aXxkZWZtZXRob2R8bWV0YXx3aXRoLW1ldGF8bnN8aW4tbnN8Y3JlYXRlLW5zfGltcG9ydHxpbnRlcm58cmVmZXJ8YWxpYXN8bmFtZXNwYWNlfHJlc29sdmV8cmVmfGRlcmVmfHJlZnNldHxuZXd8c2V0IXxtZW1mbnx0by1hcnJheXxpbnRvLWFycmF5fGFzZXR8Z2VuLWNsYXNzfHJlZHVjZXxtYXB8ZmlsdGVyfGZpbmR8bmlsP3xlbXB0eT98aGFzaC1tYXB8aGFzaC1zZXR8dmVjfHZlY3RvcnxzZXF8ZmxhdHRlbnxyZXZlcnNlfGFzc29jfGRpc3NvY3xsaXN0fGxpc3Q/fGRpc2p8Z2V0fHVuaW9ufGRpZmZlcmVuY2V8aW50ZXJzZWN0aW9ufGV4dGVuZHxleHRlbmQtdHlwZXxleHRlbmQtcHJvdG9jb2x8cHJuKVxiLywgbnVsbF0sCi0gICAgICAgICBbUFJbJ1BSX1RZUEUnXSwgL146WzAtOWEtekEtWlwtXSsvXQotICAgICAgICBdKSwKLSAgICBbJ2NsaiddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWNzcy5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciBDU1MuCi0gKgotICoKLSAqIFRvIHVzZSwgaW5jbHVkZSBwcmV0dGlmeS5qcyBhbmQgdGhpcyBmaWxlIGluIHlvdXIgSFRNTCBwYWdlLgotICogVGhlbiBwdXQgeW91ciBjb2RlIGluIGFuIEhUTUwgdGFnIGxpa2UKLSAqICAgICAgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jc3MiPjwvcHJlPgotICoKLSAqCi0gKiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9ncmFtbWFyLmh0bWwgU2VjdGlvbiBHMiBkZWZpbmVzIHRoZSBsZXhpY2FsCi0gKiBncmFtbWFyLiAgVGhpcyBzY2hlbWUgZG9lcyBub3QgcmVjb2duaXplIGtleXdvcmRzIGNvbnRhaW5pbmcgZXNjYXBlcy4KLSAqCi0gKiBAYXV0aG9yIG1pa2VzYW11ZWxAZ21haWwuY29tCi0gKi8KLQotUFJbJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInXSgKLSAgICBQUlsnY3JlYXRlU2ltcGxlTGV4ZXInXSgKLSAgICAgICAgWwotICAgICAgICAgLy8gVGhlIHNwYWNlIHByb2R1Y3Rpb24gPHM+Ci0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eWyBcdFxyXG5cZl0rLywgbnVsbCwgJyBcdFxyXG5cZiddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIFF1b3RlZCBzdHJpbmdzLiAgPHN0cmluZzE+IGFuZCA8c3RyaW5nMj4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sCi0gICAgICAgICAgL15cIig/OlteXG5cclxmXFxcIl18XFwoPzpcclxuP3xcbnxcZil8XFxbXHNcU10pKlwiLywgbnVsbF0sCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLAotICAgICAgICAgIC9eXCcoPzpbXlxuXHJcZlxcXCddfFxcKD86XHJcbj98XG58XGYpfFxcW1xzXFNdKSpcJy8sIG51bGxdLAotICAgICAgICAgWydsYW5nLWNzcy1zdHInLCAvXnVybFwoKFteXClcIlwnXSopXCkvaV0sCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwKLSAgICAgICAgICAvXig/OnVybHxyZ2J8XCFpbXBvcnRhbnR8QGltcG9ydHxAcGFnZXxAbWVkaWF8QGNoYXJzZXR8aW5oZXJpdCkoPz1bXlwtXHddfCQpL2ksCi0gICAgICAgICAgbnVsbF0sCi0gICAgICAgICAvLyBBIHByb3BlcnR5IG5hbWUgLS0gYW4gaWRlbnRpZmllciBmb2xsb3dlZCBieSBhIGNvbG9uLgotICAgICAgICAgWydsYW5nLWNzcy1rdycsIC9eKC0/KD86W19hLXpdfCg/OlxcWzAtOWEtZl0rID8pKSg/OltfYS16MC05XC1dfFxcKD86XFxbMC05YS1mXSsgPykpKilccyo6L2ldLAotICAgICAgICAgLy8gQSBDIHN0eWxlIGJsb2NrIGNvbW1lbnQuICBUaGUgPGNvbW1lbnQ+IHByb2R1Y3Rpb24uCi0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgL15cL1wqW14qXSpcKisoPzpbXlwvKl1bXipdKlwqKykqXC8vXSwKLSAgICAgICAgIC8vIEVzY2FwaW5nIHRleHQgc3BhbnMKLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAvXig/OjwhLS18LS0+KS9dLAotICAgICAgICAgLy8gQSBudW1iZXIgcG9zc2libHkgY29udGFpbmluZyBhIHN1ZmZpeC4KLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLCAvXig/OlxkK3xcZCpcLlxkKykoPzolfFthLXpdKyk/L2ldLAotICAgICAgICAgLy8gQSBoZXggY29sb3IKLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLCAvXiMoPzpbMC05YS1mXXszfSl7MSwyfS9pXSwKLSAgICAgICAgIC8vIEFuIGlkZW50aWZpZXIKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwKLSAgICAgICAgICAvXi0/KD86W19hLXpdfCg/OlxcW1xkYS1mXSsgPykpKD86W19hLXpcZFwtXXxcXCg/OlxcW1xkYS1mXSsgPykpKi9pXSwKLSAgICAgICAgIC8vIEEgcnVuIG9mIHB1bmN0dWF0aW9uCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eW15cc1x3XCdcIl0rL10KLSAgICAgICAgXSksCi0gICAgWydjc3MnXSk7Ci1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKFtdLAotICAgICAgICBbCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwKLSAgICAgICAgICAvXi0/KD86W19hLXpdfCg/OlxcW1xkYS1mXSsgPykpKD86W19hLXpcZFwtXXxcXCg/OlxcW1xkYS1mXSsgPykpKi9pXQotICAgICAgICBdKSwKLSAgICBbJ2Nzcy1rdyddKTsKLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oCi0gICAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oW10sCi0gICAgICAgIFsKLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sIC9eW15cKVwiXCddKy9dCi0gICAgICAgIF0pLAotICAgIFsnY3NzLXN0ciddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWdvLmpzCi0vKioKLSAqIEBsaWNlbnNlIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIHRoZSBHbyBsYW5ndWFnZS4uCi0gKiA8cD4KLSAqIEJhc2VkIG9uIHRoZSBsZXhpY2FsIGdyYW1tYXIgYXQgCi0gKiBodHRwOi8vZ29sYW5nLm9yZy9kb2MvZ29fc3BlYy5odG1sI0xleGljYWxfZWxlbWVudHMKLSAqIDxwPgotICogR28gdXNlcyBhIG1pbmltYWwgc3R5bGUgZm9yIGhpZ2hsaWdodGluZyBzbyB0aGUgYmVsb3cgZG9lcyBub3QgZGlzdGluZ3Vpc2gKLSAqIHN0cmluZ3MsIGtleXdvcmRzLCBsaXRlcmFscywgZXRjLiBieSBkZXNpZ24uCi0gKiBGcm9tIGEgZGlzY3Vzc2lvbiB3aXRoIHRoZSBHbyBkZXNpZ25lcnM6Ci0gKiA8cHJlPgotICogT24gVGh1cnNkYXksIEp1bHkgMjIsIDIwMTAsIE1pa2UgU2FtdWVsIDwuLi4+IHdyb3RlOgotICogPiBPbiBUaHUsIEp1bCAyMiwgMjAxMCwgUm9iICdDb21tYW5kZXInIFBpa2UgPC4uLj4gd3JvdGU6Ci0gKiA+PiBQZXJzb25hbGx5LCBJIHdvdWxkIHZvdGUgZm9yIHRoZSBzdWJkdWVkIHN0eWxlIGdvZG9jIHByZXNlbnRzIGF0IGh0dHA6Ly9nb2xhbmcub3JnCi0gKiA+PgotICogPj4gTm90IGFzIGZhbmN5IGFzIHNvbWUgbGlrZSwgYnV0IGEgY2FzZSBjYW4gYmUgbWFkZSBpdCdzIHRoZSBvZmZpY2lhbCBzdHlsZS4KLSAqID4+IElmIHBlb3BsZSB3YW50IG1vcmUgY29sb3JzLCBJIHdvdWxkbid0IGZpZ2h0IHRvbyBoYXJkLCBpbiB0aGUgaW50ZXJlc3Qgb2YKLSAqID4+IGVuY291cmFnZW1lbnQgdGhyb3VnaCBmYW1pbGlhcml0eSwgYnV0IGV2ZW4gdGhlbiBJIHdvdWxkIGFzayB0byBzaHkgYXdheQotICogPj4gZnJvbSB0ZWNobmljb2xvciBzdGFyYnVyc3RzLgotICogPgotICogPiBMaWtlIGh0dHA6Ly9nb2xhbmcub3JnL3BrZy9nby9zY2FubmVyLyB3aGVyZSBjb21tZW50cyBhcmUgYmx1ZSBhbmQgYWxsCi0gKiA+IG90aGVyIGNvbnRlbnQgaXMgYmxhY2s/ICBJIGNhbiBkbyB0aGF0LgotICogPC9wcmU+Ci0gKgotICogQGF1dGhvciBtaWtlc2FtdWVsQGdtYWlsLmNvbQotICovCi0KLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oCi0gICAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oCi0gICAgICAgIFsKLSAgICAgICAgIC8vIFdoaXRlc3BhY2UgaXMgbWFkZSB1cCBvZiBzcGFjZXMsIHRhYnMgYW5kIG5ld2xpbmUgY2hhcmFjdGVycy4KLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgICAgICAgL15bXHRcblxyIFx4QTBdKy8sIG51bGwsICdcdFxuXHIgXHhBMCddLAotICAgICAgICAgLy8gTm90IGVzY2FwZWQgYXMgYSBzdHJpbmcuICBTZWUgbm90ZSBvbiBtaW5pbWFsaXNtIGFib3ZlLgotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAgICAgICAvXig/OlwiKD86W15cIlxcXXxcXFtcc1xTXSkqKD86XCJ8JCl8XCcoPzpbXlwnXFxdfFxcW1xzXFNdKSsoPzpcJ3wkKSkvLCBudWxsLCAnIlwnJ10KLSAgICAgICAgXSwKLSAgICAgICAgWwotICAgICAgICAgLy8gQmxvY2sgY29tbWVudHMgYXJlIGRlbGltaXRlZCBieSAvKiBhbmQgKi8uCi0gICAgICAgICAvLyBTaW5nbGUtbGluZSBjb21tZW50cyBiZWdpbiB3aXRoIC8vIGFuZCBleHRlbmQgdG8gdGhlIGVuZCBvZiBhIGxpbmUuCi0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgICAgIC9eKD86XC9cL1teXHJcbl0qfFwvXCpbXHNcU10qP1wqXC8pL10sCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eKD86W15cL1wiXCddfFwvKD8hW1wvXCpdKSkrL2ldCi0gICAgICAgIF0pLAotICAgIFsnZ28nXSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9nb29nbGVfY29kZV9wcmV0dGlmeS9zcmMvbGFuZy1ocy5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciBIYXNrZWxsLgotICoKLSAqCi0gKiBUbyB1c2UsIGluY2x1ZGUgcHJldHRpZnkuanMgYW5kIHRoaXMgZmlsZSBpbiB5b3VyIEhUTUwgcGFnZS4KLSAqIFRoZW4gcHV0IHlvdXIgY29kZSBpbiBhbiBIVE1MIHRhZyBsaWtlCi0gKiAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctaHMiPihteSBsaXNwIGNvZGUpPC9wcmU+Ci0gKiBUaGUgbGFuZy1jbCBjbGFzcyBpZGVudGlmaWVzIHRoZSBsYW5ndWFnZSBhcyBjb21tb24gbGlzcC4KLSAqIFRoaXMgZmlsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM6Ci0gKiAgICAgbGFuZy1jbCAtIENvbW1vbiBMaXNwCi0gKiAgICAgbGFuZy1lbCAtIEVtYWNzIExpc3AKLSAqICAgICBsYW5nLWxpc3AgLSBMaXNwCi0gKiAgICAgbGFuZy1zY20gLSBTY2hlbWUKLSAqCi0gKgotICogSSB1c2VkIGh0dHA6Ly93d3cuaW5mb3JtYXRpay51bmktZnJlaWJ1cmcuZGUvfnRoaWVtYW5uL2hhc2tlbGwvaGFza2VsbDk4LXJlcG9ydC1odG1sL3N5bnRheC1pc28uaHRtbAotICogYXMgdGhlIGJhc2lzLCBidXQgaWdub3JlIHRoZSB3YXkgdGhlIG5jb21tZW50IHByb2R1Y3Rpb24gbmVzdHMgc2luY2UgdGhpcwotICogbWFrZXMgdGhlIGxleGljYWwgZ3JhbW1hciBpcnJlZ3VsYXIuICBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBzdXBwb3J0Ci0gKiBuY29tbWVudHMgdXNpbmcgdGhlIGxvb2tiZWhpbmQgZmlsdGVyLgotICoKLSAqCi0gKiBAYXV0aG9yIG1pa2VzYW11ZWxAZ21haWwuY29tCi0gKi8KLQotUFJbJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInXSgKLSAgICBQUlsnY3JlYXRlU2ltcGxlTGV4ZXInXSgKLSAgICAgICAgWwotICAgICAgICAgLy8gV2hpdGVzcGFjZQotICAgICAgICAgLy8gd2hpdGVjaGFyICAgIC0+ICAgIG5ld2xpbmUgfCB2ZXJ0YWIgfCBzcGFjZSB8IHRhYiB8IHVuaVdoaXRlCi0gICAgICAgICAvLyBuZXdsaW5lICAgICAgLT4gICAgcmV0dXJuIGxpbmVmZWVkIHwgcmV0dXJuIHwgbGluZWZlZWQgfCBmb3JtZmVlZAotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAgICAgICAvXltcdFxuXHgwQlx4MENcciBdKy8sIG51bGwsICdcdFxuXHgwQlx4MENcciAnXSwKLSAgICAgICAgIC8vIFNpbmdsZSBsaW5lIGRvdWJsZSBhbmQgc2luZ2xlLXF1b3RlZCBzdHJpbmdzLgotICAgICAgICAgLy8gY2hhciAgICAgICAgIC0+ICAgICcgKGdyYXBoaWM8JyB8IFw+IHwgc3BhY2UgfCBlc2NhcGU8XCY+KSAnCi0gICAgICAgICAvLyBzdHJpbmcgICAgICAgLT4gICAgIiB7Z3JhcGhpYzwiIHwgXD4gfCBzcGFjZSB8IGVzY2FwZSB8IGdhcH0iCi0gICAgICAgICAvLyBlc2NhcGUgICAgICAgLT4gICAgXCAoIGNoYXJlc2MgfCBhc2NpaSB8IGRlY2ltYWwgfCBvIG9jdGFsCi0gICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHwgeCBoZXhhZGVjaW1hbCApCi0gICAgICAgICAvLyBjaGFyZXNjICAgICAgLT4gICAgYSB8IGIgfCBmIHwgbiB8IHIgfCB0IHwgdiB8IFwgfCAiIHwgJyB8ICYKLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sICAgICAgL15cIig/OlteXCJcXFxuXHgwQ1xyXXxcXFtcc1xTXSkqKD86XCJ8JCkvLAotICAgICAgICAgIG51bGwsICciJ10sCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLCAgICAgIC9eXCcoPzpbXlwnXFxcblx4MENccl18XFxbXiZdKVwnPy8sCi0gICAgICAgICAgbnVsbCwgIiciXSwKLSAgICAgICAgIC8vIGRlY2ltYWwgICAgICAtPiAgICBkaWdpdHtkaWdpdH0KLSAgICAgICAgIC8vIG9jdGFsICAgICAgICAtPiAgICBvY3RpdHtvY3RpdH0KLSAgICAgICAgIC8vIGhleGFkZWNpbWFsICAtPiAgICBoZXhpdHtoZXhpdH0KLSAgICAgICAgIC8vIGludGVnZXIgICAgICAtPiAgICBkZWNpbWFsCi0gICAgICAgICAvLyAgICAgICAgICAgICAgIHwgICAgMG8gb2N0YWwgfCAwTyBvY3RhbAotICAgICAgICAgLy8gICAgICAgICAgICAgICB8ICAgIDB4IGhleGFkZWNpbWFsIHwgMFggaGV4YWRlY2ltYWwKLSAgICAgICAgIC8vIGZsb2F0ICAgICAgICAtPiAgICBkZWNpbWFsIC4gZGVjaW1hbCBbZXhwb25lbnRdCi0gICAgICAgICAvLyAgICAgICAgICAgICAgIHwgICAgZGVjaW1hbCBleHBvbmVudAotICAgICAgICAgLy8gZXhwb25lbnQgICAgIC0+ICAgIChlIHwgRSkgWysgfCAtXSBkZWNpbWFsCi0gICAgICAgICBbUFJbJ1BSX0xJVEVSQUwnXSwKLSAgICAgICAgICAvXig/OjBvWzAtN10rfDB4W1xkYS1mXSt8XGQrKD86XC5cZCspPyg/OmVbK1wtXT9cZCspPykvaSwKLSAgICAgICAgICBudWxsLCAnMDEyMzQ1Njc4OSddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIEhhc2tlbGwgZG9lcyBub3QgaGF2ZSBhIHJlZ3VsYXIgbGV4aWNhbCBncmFtbWFyIGR1ZSB0byB0aGUgbmVzdGVkCi0gICAgICAgICAvLyBuY29tbWVudC4KLSAgICAgICAgIC8vIGNvbW1lbnQgICAgICAtPiAgICBkYXNoZXMgWyBhbnk8c3ltYm9sPiB7YW55fV0gbmV3bGluZQotICAgICAgICAgLy8gbmNvbW1lbnQgICAgIC0+ICAgIG9wZW5jb20gQU5Zc2VxIHtuY29tbWVudCBBTllzZXF9Y2xvc2Vjb20KLSAgICAgICAgIC8vIGRhc2hlcyAgICAgICAtPiAgICAnLS0nIHsnLSd9Ci0gICAgICAgICAvLyBvcGVuY29tICAgICAgLT4gICAgJ3stJwotICAgICAgICAgLy8gY2xvc2Vjb20gICAgIC0+ICAgICctfScKLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAgICAgL14oPzooPzotLSsoPzpbXlxyXG5ceDBDXSopPyl8KD86XHstKD86W14tXXwtK1teLVx9XSkqLVx9KSkvXSwKLSAgICAgICAgIC8vIHJlc2VydmVkaWQgICAtPiAgICBjYXNlIHwgY2xhc3MgfCBkYXRhIHwgZGVmYXVsdCB8IGRlcml2aW5nIHwgZG8KLSAgICAgICAgIC8vICAgICAgICAgICAgICAgfCAgICBlbHNlIHwgaWYgfCBpbXBvcnQgfCBpbiB8IGluZml4IHwgaW5maXhsIHwgaW5maXhyCi0gICAgICAgICAvLyAgICAgICAgICAgICAgIHwgICAgaW5zdGFuY2UgfCBsZXQgfCBtb2R1bGUgfCBuZXd0eXBlIHwgb2YgfCB0aGVuCi0gICAgICAgICAvLyAgICAgICAgICAgICAgIHwgICAgdHlwZSB8IHdoZXJlIHwgXwotICAgICAgICAgW1BSWydQUl9LRVlXT1JEJ10sICAgICAvXig/OmNhc2V8Y2xhc3N8ZGF0YXxkZWZhdWx0fGRlcml2aW5nfGRvfGVsc2V8aWZ8aW1wb3J0fGlufGluZml4fGluZml4bHxpbmZpeHJ8aW5zdGFuY2V8bGV0fG1vZHVsZXxuZXd0eXBlfG9mfHRoZW58dHlwZXx3aGVyZXxfKSg/PVteYS16QS1aMC05XCddfCQpLywgbnVsbF0sCi0gICAgICAgICAvLyBxdmFyaWQgICAgICAgLT4gICAgWyBtb2RpZCAuIF0gdmFyaWQKLSAgICAgICAgIC8vIHFjb25pZCAgICAgICAtPiAgICBbIG1vZGlkIC4gXSBjb25pZAotICAgICAgICAgLy8gdmFyaWQgICAgICAgIC0+ICAgIChzbWFsbCB7c21hbGwgfCBsYXJnZSB8IGRpZ2l0IHwgJyB9KTxyZXNlcnZlZGlkPgotICAgICAgICAgLy8gY29uaWQgICAgICAgIC0+ICAgIGxhcmdlIHtzbWFsbCB8IGxhcmdlIHwgZGlnaXQgfCAnIH0KLSAgICAgICAgIC8vIG1vZGlkICAgICAgICAtPiAgICBjb25pZAotICAgICAgICAgLy8gc21hbGwgICAgICAgIC0+ICAgIGFzY1NtYWxsIHwgdW5pU21hbGwgfCBfCi0gICAgICAgICAvLyBhc2NTbWFsbCAgICAgLT4gICAgYSB8IGIgfCAuLi4gfCB6Ci0gICAgICAgICAvLyB1bmlTbWFsbCAgICAgLT4gICAgYW55IFVuaWNvZGUgbG93ZXJjYXNlIGxldHRlcgotICAgICAgICAgLy8gbGFyZ2UgICAgICAgIC0+ICAgIGFzY0xhcmdlIHwgdW5pTGFyZ2UKLSAgICAgICAgIC8vIGFzY0xhcmdlICAgICAtPiAgICBBIHwgQiB8IC4uLiB8IFoKLSAgICAgICAgIC8vIHVuaUxhcmdlICAgICAtPiAgICBhbnkgdXBwZXJjYXNlIG9yIHRpdGxlY2FzZSBVbmljb2RlIGxldHRlcgotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAgL14oPzpbQS1aXVtcd1wnXSpcLikqW2EtekEtWl1bXHdcJ10qL10sCi0gICAgICAgICAvLyBtYXRjaGVzIHRoZSBzeW1ib2wgcHJvZHVjdGlvbgotICAgICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXlteXHRcblx4MEJceDBDXHIgYS16QS1aMC05XCdcIl0rL10KLSAgICAgICAgXSksCi0gICAgWydocyddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLWxpc3AuanMKLS8qKgotICogQGxpY2Vuc2UgQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgQ29tbW9uIExpc3AgYW5kIHJlbGF0ZWQgbGFuZ3VhZ2VzLgotICoKLSAqCi0gKiBUbyB1c2UsIGluY2x1ZGUgcHJldHRpZnkuanMgYW5kIHRoaXMgZmlsZSBpbiB5b3VyIEhUTUwgcGFnZS4KLSAqIFRoZW4gcHV0IHlvdXIgY29kZSBpbiBhbiBIVE1MIHRhZyBsaWtlCi0gKiAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctbGlzcCI+KG15IGxpc3AgY29kZSk8L3ByZT4KLSAqIFRoZSBsYW5nLWNsIGNsYXNzIGlkZW50aWZpZXMgdGhlIGxhbmd1YWdlIGFzIGNvbW1vbiBsaXNwLgotICogVGhpcyBmaWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2UgZXh0ZW5zaW9uczoKLSAqICAgICBsYW5nLWNsIC0gQ29tbW9uIExpc3AKLSAqICAgICBsYW5nLWVsIC0gRW1hY3MgTGlzcAotICogICAgIGxhbmctbGlzcCAtIExpc3AKLSAqICAgICBsYW5nLXNjbSAtIFNjaGVtZQotICoKLSAqCi0gKiBJIHVzZWQgaHR0cDovL3d3dy5kZXZpbmNvb2suY29tL2dvbGRwYXJzZXIvZG9jL21ldGEtbGFuZ3VhZ2UvZ3JhbW1hci1MSVNQLmh0bQotICogYXMgdGhlIGJhc2lzLCBidXQgYWRkZWQgbGluZSBjb21tZW50cyB0aGF0IHN0YXJ0IHdpdGggOyBhbmQgY2hhbmdlZCB0aGUgYXRvbQotICogcHJvZHVjdGlvbiB0byBkaXNhbGxvdyB1bnF1b3RlZCBzZW1pY29sb25zLgotICoKLSAqICJOYW1lIiAgICA9ICdMSVNQJwotICogIkF1dGhvciIgID0gJ0pvaG4gTWNDYXJ0aHknCi0gKiAiVmVyc2lvbiIgPSAnTWluaW1hbCcKLSAqICJBYm91dCIgICA9ICdMSVNQIGlzIGFuIGFic3RyYWN0IGxhbmd1YWdlIHRoYXQgb3JnYW5pemVzIEFMTCcKLSAqICAgICAgICAgICB8ICdkYXRhIGFyb3VuZCAibGlzdHMiLicKLSAqCi0gKiAiU3RhcnQgU3ltYm9sIiA9IFtzLUV4cHJlc3Npb25dCi0gKgotICoge0F0b20gQ2hhcn0gICA9IHtQcmludGFibGV9IC0ge1doaXRlc3BhY2V9IC0gWygpIlwnJ10KLSAqCi0gKiBBdG9tID0gKCB7QXRvbSBDaGFyfSB8ICdcJ3tQcmludGFibGV9ICkrCi0gKgotICogW3MtRXhwcmVzc2lvbl0gOjo9IFtRdW90ZV0gQXRvbQotICogICAgICAgICAgICAgICAgICB8IFtRdW90ZV0gJygnIFtTZXJpZXNdICcpJwotICogICAgICAgICAgICAgICAgICB8IFtRdW90ZV0gJygnIFtzLUV4cHJlc3Npb25dICcuJyBbcy1FeHByZXNzaW9uXSAnKScKLSAqCi0gKiBbU2VyaWVzXSA6Oj0gW3MtRXhwcmVzc2lvbl0gW1Nlcmllc10KLSAqICAgICAgICAgICAgfAotICoKLSAqIFtRdW90ZV0gIDo6PSAnJyAgICAgICFRdW90ZSA9IGRvIG5vdCBldmFsdWF0ZQotICogICAgICAgICAgICB8Ci0gKgotICoKLSAqIEkgdXNlZCA8YSBocmVmPSJodHRwOi8vZ2lnYW1vbmtleXMuY29tL2Jvb2svIj5QcmFjdGljYWwgQ29tbW9uIExpc3A8L2E+IGFzCi0gKiB0aGUgYmFzaXMgZm9yIHRoZSByZXNlcnZlZCB3b3JkIGxpc3QuCi0gKgotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICBbJ29wbicsICAgICAgICAgICAgIC9eXCgrLywgbnVsbCwgJygnXSwKLSAgICAgICAgIFsnY2xvJywgICAgICAgICAgICAgL15cKSsvLCBudWxsLCAnKSddLAotICAgICAgICAgLy8gQSBsaW5lIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCA7Ci0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgICAgIC9eO1teXHJcbl0qLywgbnVsbCwgJzsnXSwKLSAgICAgICAgIC8vIFdoaXRlc3BhY2UKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgICAgICAgL15bXHRcblxyIFx4QTBdKy8sIG51bGwsICdcdFxuXHIgXHhBMCddLAotICAgICAgICAgLy8gQSBkb3VibGUgcXVvdGVkLCBwb3NzaWJseSBtdWx0aS1saW5lLCBzdHJpbmcuCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLCAgICAgIC9eXCIoPzpbXlwiXFxdfFxcW1xzXFNdKSooPzpcInwkKS8sIG51bGwsICciJ10KLSAgICAgICAgXSwKLSAgICAgICAgWwotICAgICAgICAgW1BSWydQUl9LRVlXT1JEJ10sICAgICAvXig/OmJsb2NrfGNbYWRdK3J8Y2F0Y2h8Y29uW2RzXXxkZWYoPzppbmV8dW4pfGRvfGVxfGVxbHxlcXVhbHxlcXVhbHB8ZXZhbC13aGVufGZsZXR8Zm9ybWF0fGdvfGlmfGxhYmVsc3xsYW1iZGF8bGV0fGxvYWQtdGltZS12YWx1ZXxsb2NhbGx5fG1hY3JvbGV0fG11bHRpcGxlLXZhbHVlLWNhbGx8bmlsfHByb2dufHByb2d2fHF1b3RlfHJlcXVpcmV8cmV0dXJuLWZyb218c2V0cXxzeW1ib2wtbWFjcm9sZXR8dHx0YWdib2R5fHRoZXx0aHJvd3x1bndpbmQpXGIvLCBudWxsXSwKLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLAotICAgICAgICAgIC9eWytcLV0/KD86WzAjXXhbMC05YS1mXSt8XGQrXC9cZCt8KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzpbZWRdWytcLV0/XGQrKT8pL2ldLAotICAgICAgICAgLy8gQSBzaW5nbGUgcXVvdGUgcG9zc2libHkgZm9sbG93ZWQgYnkgYSB3b3JkIHRoYXQgb3B0aW9uYWxseSBlbmRzIHdpdGgKLSAgICAgICAgIC8vID0gISBvciA/LgotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sCi0gICAgICAgICAgL15cJyg/Oi0qKD86XHd8XFxbXHgyMS1ceDdlXSkoPzpbXHctXSp8XFxbXHgyMS1ceDdlXSlbPSE/XT8pPy9dLAotICAgICAgICAgLy8gQSB3b3JkIHRoYXQgb3B0aW9uYWxseSBlbmRzIHdpdGggPSAhIG9yID8uCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sCi0gICAgICAgICAgL14tKig/OlthLXpfXXxcXFtceDIxLVx4N2VdKSg/Oltcdy1dKnxcXFtceDIxLVx4N2VdKVs9IT9dPy9pXSwKLSAgICAgICAgIC8vIEEgcHJpbnRhYmxlIG5vbi1zcGFjZSBub24tc3BlY2lhbCBjaGFyYWN0ZXIKLSAgICAgICAgIFtQUlsnUFJfUFVOQ1RVQVRJT04nXSwgL15bXlx3XHRcblxyIFx4QTAoKVwiXFxcJztdKy9dCi0gICAgICAgIF0pLAotICAgIFsnY2wnLCAnZWwnLCAnbGlzcCcsICdzY20nXSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9nb29nbGVfY29kZV9wcmV0dGlmeS9zcmMvbGFuZy1sdWEuanMKLS8qKgotICogQGxpY2Vuc2UgQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgTHVhLgotICoKLSAqCi0gKiBUbyB1c2UsIGluY2x1ZGUgcHJldHRpZnkuanMgYW5kIHRoaXMgZmlsZSBpbiB5b3VyIEhUTUwgcGFnZS4KLSAqIFRoZW4gcHV0IHlvdXIgY29kZSBpbiBhbiBIVE1MIHRhZyBsaWtlCi0gKiAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctbHVhIj4obXkgTHVhIGNvZGUpPC9wcmU+Ci0gKgotICoKLSAqIEkgdXNlZCBodHRwOi8vd3d3Lmx1YS5vcmcvbWFudWFsLzUuMS9tYW51YWwuaHRtbCMyLjEKLSAqIEJlY2F1c2Ugb2YgdGhlIGxvbmctYnJhY2tldCBjb25jZXB0IHVzZWQgaW4gc3RyaW5ncyBhbmQgY29tbWVudHMsIEx1YSBkb2VzCi0gKiBub3QgaGF2ZSBhIHJlZ3VsYXIgbGV4aWNhbCBncmFtbWFyLCBidXQgbHVja2lseSBpdCBmaXRzIHdpdGhpbiB0aGUgc3BhY2UKLSAqIG9mIGlycmVndWxhciBncmFtbWFycyBzdXBwb3J0ZWQgYnkgamF2YXNjcmlwdCByZWd1bGFyIGV4cHJlc3Npb25zLgotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIG9yIHNpbmdsZSBxdW90ZWQsIHBvc3NpYmx5IG11bHRpLWxpbmUsIHN0cmluZy4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sICAgICAgL14oPzpcIig/OlteXCJcXF18XFxbXHNcU10pKig/OlwifCQpfFwnKD86W15cJ1xcXXxcXFtcc1xTXSkqKD86XCd8JCkpLywgbnVsbCwgJyJcJyddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIEEgY29tbWVudCBpcyBlaXRoZXIgYSBsaW5lIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCB0d28gZGFzaGVzLCBvcgotICAgICAgICAgLy8gdHdvIGRhc2hlcyBwcmVjZWRpbmcgYSBsb25nIGJyYWNrZXRlZCBibG9jay4KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAvXi0tKD86XFsoPSopXFtbXHNcU10qPyg/OlxdXDFcXXwkKXxbXlxyXG5dKikvXSwKLSAgICAgICAgIC8vIEEgbG9uZyBicmFja2V0ZWQgYmxvY2sgbm90IHByZWNlZGVkIGJ5IC0tIGlzIGEgc3RyaW5nLgotICAgICAgICAgW1BSWydQUl9TVFJJTkcnXSwgIC9eXFsoPSopXFtbXHNcU10qPyg/OlxdXDFcXXwkKS9dLAotICAgICAgICAgW1BSWydQUl9LRVlXT1JEJ10sIC9eKD86YW5kfGJyZWFrfGRvfGVsc2V8ZWxzZWlmfGVuZHxmYWxzZXxmb3J8ZnVuY3Rpb258aWZ8aW58bG9jYWx8bmlsfG5vdHxvcnxyZXBlYXR8cmV0dXJufHRoZW58dHJ1ZXx1bnRpbHx3aGlsZSlcYi8sIG51bGxdLAotICAgICAgICAgLy8gQSBudW1iZXIgaXMgYSBoZXggaW50ZWdlciBsaXRlcmFsLCBhIGRlY2ltYWwgcmVhbCBsaXRlcmFsLCBvciBpbgotICAgICAgICAgLy8gc2NpZW50aWZpYyBub3RhdGlvbi4KLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLAotICAgICAgICAgIC9eWystXT8oPzoweFtcZGEtZl0rfCg/Oig/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrXC1dP1xkKyk/KSkvaV0sCi0gICAgICAgICAvLyBBbiBpZGVudGlmaWVyCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sIC9eW2Etel9dXHcqL2ldLAotICAgICAgICAgLy8gQSBydW4gb2YgcHVuY3R1YXRpb24KLSAgICAgICAgIFtQUlsnUFJfUFVOQ1RVQVRJT04nXSwgL15bXlx3XHRcblxyIFx4QTBdW15cd1x0XG5cciBceEEwXCJcJ1wtXCs9XSovXQotICAgICAgICBdKSwKLSAgICBbJ2x1YSddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLW1sLmpzCi0vKioKLSAqIEBsaWNlbnNlIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIE9DYW1sLCBTTUwsIEYjIGFuZCBzaW1pbGFyIGxhbmd1YWdlcy4KLSAqCi0gKiBCYXNlZCBvbiB0aGUgbGV4aWNhbCBncmFtbWFyIGF0Ci0gKiBodHRwOi8vcmVzZWFyY2gubWljcm9zb2Z0LmNvbS9lbi11cy91bS9jYW1icmlkZ2UvcHJvamVjdHMvZnNoYXJwL21hbnVhbC9zcGVjLmh0bWwjX1RvYzI3MDU5NzM4OAotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlIGlzIG1hZGUgdXAgb2Ygc3BhY2VzLCB0YWJzIGFuZCBuZXdsaW5lIGNoYXJhY3RlcnMuCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vICNpZiBpZGVudC8jZWxzZS8jZW5kaWYgZGlyZWN0aXZlcyBkZWxpbWl0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uCi0gICAgICAgICAvLyBzZWN0aW9ucwotICAgICAgICAgW1BSWydQUl9DT01NRU5UJ10sCi0gICAgICAgICAgL14jKD86aWZbXHRcblxyIFx4QTBdKyg/OlthLXpfJF1bXHdcJ10qfGBgW15cclxuXHRgXSooPzpgYHwkKSl8ZWxzZXxlbmRpZnxsaWdodCkvaSwKLSAgICAgICAgICBudWxsLCAnIyddLAotICAgICAgICAgLy8gQSBkb3VibGUgb3Igc2luZ2xlIHF1b3RlZCwgcG9zc2libHkgbXVsdGktbGluZSwgc3RyaW5nLgotICAgICAgICAgLy8gRiMgYWxsb3dzIGVzY2FwZWQgbmV3bGluZXMgaW4gc3RyaW5ncy4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sICAgICAgL14oPzpcIig/OlteXCJcXF18XFxbXHNcU10pKig/OlwifCQpfFwnKD86W15cJ1xcXXxcXFtcc1xTXSkoPzpcJ3wkKSkvLCBudWxsLCAnIlwnJ10KLSAgICAgICAgXSwKLSAgICAgICAgWwotICAgICAgICAgLy8gQmxvY2sgY29tbWVudHMgYXJlIGRlbGltaXRlZCBieSAoKiBhbmQgKikgYW5kIG1heSBiZQotICAgICAgICAgLy8gbmVzdGVkLiBTaW5nbGUtbGluZSBjb21tZW50cyBiZWdpbiB3aXRoIC8vIGFuZCBleHRlbmQgdG8KLSAgICAgICAgIC8vIHRoZSBlbmQgb2YgYSBsaW5lLgotICAgICAgICAgLy8gVE9ETzogKCouLi4qKSBjb21tZW50cyBjYW4gYmUgbmVzdGVkLiAgVGhpcyBkb2VzIG5vdCBoYW5kbGUgdGhhdC4KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAgICAgL14oPzpcL1wvW15cclxuXSp8XChcKltcc1xTXSo/XCpcKSkvXSwKLSAgICAgICAgIFtQUlsnUFJfS0VZV09SRCddLCAgICAgL14oPzphYnN0cmFjdHxhbmR8YXN8YXNzZXJ0fGJlZ2lufGNsYXNzfGRlZmF1bHR8ZGVsZWdhdGV8ZG98ZG9uZXxkb3duY2FzdHxkb3dudG98ZWxpZnxlbHNlfGVuZHxleGNlcHRpb258ZXh0ZXJufGZhbHNlfGZpbmFsbHl8Zm9yfGZ1bnxmdW5jdGlvbnxpZnxpbnxpbmhlcml0fGlubGluZXxpbnRlcmZhY2V8aW50ZXJuYWx8bGF6eXxsZXR8bWF0Y2h8bWVtYmVyfG1vZHVsZXxtdXRhYmxlfG5hbWVzcGFjZXxuZXd8bnVsbHxvZnxvcGVufG9yfG92ZXJyaWRlfHByaXZhdGV8cHVibGljfHJlY3xyZXR1cm58c3RhdGljfHN0cnVjdHx0aGVufHRvfHRydWV8dHJ5fHR5cGV8dXBjYXN0fHVzZXx2YWx8dm9pZHx3aGVufHdoaWxlfHdpdGh8eWllbGR8YXNyfGxhbmR8bG9yfGxzbHxsc3J8bHhvcnxtb2R8c2lnfGF0b21pY3xicmVha3xjaGVja2VkfGNvbXBvbmVudHxjb25zdHxjb25zdHJhaW50fGNvbnN0cnVjdG9yfGNvbnRpbnVlfGVhZ2VyfGV2ZW50fGV4dGVybmFsfGZpeGVkfGZ1bmN0b3J8Z2xvYmFsfGluY2x1ZGV8bWV0aG9kfG1peGlufG9iamVjdHxwYXJhbGxlbHxwcm9jZXNzfHByb3RlY3RlZHxwdXJlfHNlYWxlZHx0cmFpdHx2aXJ0dWFsfHZvbGF0aWxlKVxiL10sCi0gICAgICAgICAvLyBBIG51bWJlciBpcyBhIGhleCBpbnRlZ2VyIGxpdGVyYWwsIGEgZGVjaW1hbCByZWFsIGxpdGVyYWwsIG9yIGluCi0gICAgICAgICAvLyBzY2llbnRpZmljIG5vdGF0aW9uLgotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sCi0gICAgICAgICAgL15bK1wtXT8oPzoweFtcZGEtZl0rfCg/Oig/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrXC1dP1xkKyk/KSkvaV0sCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eKD86W2Etel9dW1x3J10qWyE/I10/fGBgW15cclxuXHRgXSooPzpgYHwkKSkvaV0sCi0gICAgICAgICAvLyBBIHByaW50YWJsZSBub24tc3BhY2Ugbm9uLXNwZWNpYWwgY2hhcmFjdGVyCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eW15cdFxuXHIgXHhBMFwiXCdcd10rL10KLSAgICAgICAgXSksCi0gICAgWydmcycsICdtbCddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLXByb3RvLmpzCi0vKioKLSAqIEBsaWNlbnNlIENvcHlyaWdodCAoQykgMjAwNiBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIFByb3RvY29sIEJ1ZmZlcnMgYXMgZGVzY3JpYmVkIGF0Ci0gKiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvLgotICoKLSAqIEJhc2VkIG9uIHRoZSBsZXhpY2FsIGdyYW1tYXIgYXQKLSAqIGh0dHA6Ly9yZXNlYXJjaC5taWNyb3NvZnQuY29tL2ZzaGFycC9tYW51YWwvc3BlYzIuYXNweCNfVG9jMjAyMzgzNzE1Ci0gKgotICogQGF1dGhvciBtaWtlc2FtdWVsQGdtYWlsLmNvbQotICovCi0KLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oUFJbJ3NvdXJjZURlY29yYXRvciddKHsKLSAgICAgICAga2V5d29yZHM6ICgKLSAgICAgICAgICAgICdib29sIGJ5dGVzIGRlZmF1bHQgZG91YmxlIGVudW0gZXh0ZW5kIGV4dGVuc2lvbnMgZmFsc2UgZml4ZWQzMiAnCi0gICAgICAgICAgICArICdmaXhlZDY0IGZsb2F0IGdyb3VwIGltcG9ydCBpbnQzMiBpbnQ2NCBtYXggbWVzc2FnZSBvcHRpb24gJwotICAgICAgICAgICAgKyAnb3B0aW9uYWwgcGFja2FnZSByZXBlYXRlZCByZXF1aXJlZCByZXR1cm5zIHJwYyBzZXJ2aWNlICcKLSAgICAgICAgICAgICsgJ3NmaXhlZDMyIHNmaXhlZDY0IHNpbnQzMiBzaW50NjQgc3RyaW5nIHN5bnRheCB0byB0cnVlIHVpbnQzMiAnCi0gICAgICAgICAgICArICd1aW50NjQnKSwKLSAgICAgICAgY1N0eWxlQ29tbWVudHM6IHRydWUKLSAgICAgIH0pLCBbJ3Byb3RvJ10pOwotCi0vL3RoaXJkX3BhcnR5L2phdmFzY3JpcHQvZ29vZ2xlX2NvZGVfcHJldHRpZnkvc3JjL2xhbmctc2NhbGEuanMKLS8qKgotICogQGxpY2Vuc2UgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgU2NhbGEuCi0gKgotICogRGVyaXZlZCBmcm9tIGh0dHA6Ly9sYW1wc3ZuLmVwZmwuY2gvc3ZuLXJlcG9zL3NjYWxhL3NjYWxhLWRvY3VtZW50YXRpb24vdHJ1bmsvc3JjL3JlZmVyZW5jZS9TeW50YXhTdW1tYXJ5LnRleAotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIG9yIHNpbmdsZSBxdW90ZWQgc3RyaW5nCi0gICAgICAgICAgLy8gb3IgYSB0cmlwbGUgZG91YmxlLXF1b3RlZCBtdWx0aS1saW5lIHN0cmluZy4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sCi0gICAgICAgICAgL14oPzoiKD86KD86IiIoPzoiIj8oPyEiKXxbXlxcIl18XFwuKSoiezAsM30pfCg/OlteIlxyXG5cXF18XFwuKSoiPykpLywKLSAgICAgICAgICBudWxsLCAnIiddLAotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sICAgICAvXmAoPzpbXlxyXG5cXGBdfFxcLikqYD8vLCBudWxsLCAnYCddLAotICAgICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXlshIyUmKCkqKyxcLTo7PD0+P0BcW1xcXF1ee3x9fl0rLywgbnVsbCwKLSAgICAgICAgICAnISMlJigpKissLTo7PD0+P0BbXFxdXnt8fX4nXQotICAgICAgICBdLAotICAgICAgICBbCi0gICAgICAgICAvLyBBIHN5bWJvbCBsaXRlcmFsIGlzIGEgc2luZ2xlIHF1b3RlIGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXIgd2l0aCBubwotICAgICAgICAgLy8gc2luZ2xlIHF1b3RlIGZvbGxvd2luZwotICAgICAgICAgLy8gQSBjaGFyYWN0ZXIgbGl0ZXJhbCBoYXMgc2luZ2xlIHF1b3RlcyBvbiBlaXRoZXIgc2lkZQotICAgICAgICAgW1BSWydQUl9TVFJJTkcnXSwgICAgICAvXicoPzpbXlxyXG5cXCddfFxcKD86J3xbXlxyXG4nXSspKScvXSwKLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLCAgICAgL14nW2EtekEtWl8kXVtcdyRdKig/IVsnJFx3XSkvXSwKLSAgICAgICAgIFtQUlsnUFJfS0VZV09SRCddLCAgICAgL14oPzphYnN0cmFjdHxjYXNlfGNhdGNofGNsYXNzfGRlZnxkb3xlbHNlfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmb3J8Zm9yU29tZXxpZnxpbXBsaWNpdHxpbXBvcnR8bGF6eXxtYXRjaHxuZXd8b2JqZWN0fG92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVxdWlyZXN8cmV0dXJufHNlYWxlZHxzdXBlcnx0aHJvd3x0cmFpdHx0cnl8dHlwZXx2YWx8dmFyfHdoaWxlfHdpdGh8eWllbGQpXGIvXSwKLSAgICAgICAgIFtQUlsnUFJfTElURVJBTCddLCAgICAgL14oPzp0cnVlfGZhbHNlfG51bGx8dGhpcylcYi9dLAotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sICAgICAvXig/Oig/OjAoPzpbMC03XSt8WFswLTlBLUZdKykpTD98KD86KD86MHxbMS05XVswLTldKikoPzooPzpcLlswLTldKyk/KD86RVsrXC1dP1swLTldKyk/Rj98TD8pKXxcXC5bMC05XSsoPzpFWytcLV0/WzAtOV0rKT9GPykvaV0sCi0gICAgICAgICAvLyBUcmVhdCB1cHBlciBjYW1lbCBjYXNlIGlkZW50aWZpZXJzIGFzIHR5cGVzLgotICAgICAgICAgW1BSWydQUl9UWVBFJ10sICAgICAgICAvXlskX10qW0EtWl1bXyRBLVowLTldKlthLXpdW1x3JF0qL10sCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eWyRhLXpBLVpfXVtcdyRdKi9dLAotICAgICAgICAgW1BSWydQUl9DT01NRU5UJ10sICAgICAvXlwvKD86XC8uKnxcKig/OlwvfFwqKlteKi9dKSooPzpcKitcLz8pPykvXSwKLSAgICAgICAgIFtQUlsnUFJfUFVOQ1RVQVRJT04nXSwgL14oPzpcLit8XC8pL10KLSAgICAgICAgXSksCi0gICAgWydzY2FsYSddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLXNxbC5qcwotLyoqCi0gKiBAbGljZW5zZSBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIFNRTC4KLSAqCi0gKgotICogVG8gdXNlLCBpbmNsdWRlIHByZXR0aWZ5LmpzIGFuZCB0aGlzIGZpbGUgaW4geW91ciBIVE1MIHBhZ2UuCi0gKiBUaGVuIHB1dCB5b3VyIGNvZGUgaW4gYW4gSFRNTCB0YWcgbGlrZQotICogICAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLXNxbCI+KG15IFNRTCBjb2RlKTwvcHJlPgotICoKLSAqCi0gKiBodHRwOi8vc2F2YWdlLm5ldC5hdS9TUUwvc3FsLTk5LmJuZi5odG1sIGlzIHRoZSBiYXNpcyBmb3IgdGhlIGdyYW1tYXIsIGFuZAotICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FhMjM4NTA3KFNRTC44MCkuYXNweCBhcyB0aGUgYmFzaXMKLSAqIGZvciB0aGUga2V5d29yZCBsaXN0LgotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXSsvLCBudWxsLCAnXHRcblxyIFx4QTAnXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIG9yIHNpbmdsZSBxdW90ZWQsIHBvc3NpYmx5IG11bHRpLWxpbmUsIHN0cmluZy4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sICAgICAgL14oPzoiKD86W15cIlxcXXxcXC4pKiJ8Jyg/OlteXCdcXF18XFwuKSonKS8sIG51bGwsCi0gICAgICAgICAgJyJcJyddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIEEgY29tbWVudCBpcyBlaXRoZXIgYSBsaW5lIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCB0d28gZGFzaGVzLCBvcgotICAgICAgICAgLy8gdHdvIGRhc2hlcyBwcmVjZWRpbmcgYSBsb25nIGJyYWNrZXRlZCBibG9jay4KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAvXig/Oi0tW15cclxuXSp8XC9cKltcc1xTXSo/KD86XCpcL3wkKSkvXSwKLSAgICAgICAgIFtQUlsnUFJfS0VZV09SRCddLCAvXig/OkFERHxBTEx8QUxURVJ8QU5EfEFOWXxBU3xBU0N8QVVUSE9SSVpBVElPTnxCQUNLVVB8QkVHSU58QkVUV0VFTnxCUkVBS3xCUk9XU0V8QlVMS3xCWXxDQVNDQURFfENBU0V8Q0hFQ0t8Q0hFQ0tQT0lOVHxDTE9TRXxDTFVTVEVSRUR8Q09BTEVTQ0V8Q09MTEFURXxDT0xVTU58Q09NTUlUfENPTVBVVEV8Q09OU1RSQUlOVHxDT05UQUlOU3xDT05UQUlOU1RBQkxFfENPTlRJTlVFfENPTlZFUlR8Q1JFQVRFfENST1NTfENVUlJFTlR8Q1VSUkVOVF9EQVRFfENVUlJFTlRfVElNRXxDVVJSRU5UX1RJTUVTVEFNUHxDVVJSRU5UX1VTRVJ8Q1VSU09SfERBVEFCQVNFfERCQ0N8REVBTExPQ0FURXxERUNMQVJFfERFRkFVTFR8REVMRVRFfERFTll8REVTQ3xESVNLfERJU1RJTkNUfERJU1RSSUJVVEVEfERPVUJMRXxEUk9QfERVTU1ZfERVTVB8RUxTRXxFTkR8RVJSTFZMfEVTQ0FQRXxFWENFUFR8RVhFQ3xFWEVDVVRFfEVYSVNUU3xFWElUfEZFVENIfEZJTEV8RklMTEZBQ1RPUnxGT1J8Rk9SRUlHTnxGUkVFVEVYVHxGUkVFVEVYVFRBQkxFfEZST018RlVMTHxGVU5DVElPTnxHT1RPfEdSQU5UfEdST1VQfEhBVklOR3xIT0xETE9DS3xJREVOVElUWXxJREVOVElUWUNPTHxJREVOVElUWV9JTlNFUlR8SUZ8SU58SU5ERVh8SU5ORVJ8SU5TRVJUfElOVEVSU0VDVHxJTlRPfElTfEpPSU58S0VZfEtJTEx8TEVGVHxMSUtFfExJTkVOT3xMT0FEfE5BVElPTkFMfE5PQ0hFQ0t8Tk9OQ0xVU1RFUkVEfE5PVHxOVUxMfE5VTExJRnxPRnxPRkZ8T0ZGU0VUU3xPTnxPUEVOfE9QRU5EQVRBU09VUkNFfE9QRU5RVUVSWXxPUEVOUk9XU0VUfE9QRU5YTUx8T1BUSU9OfE9SfE9SREVSfE9VVEVSfE9WRVJ8UEVSQ0VOVHxQTEFOfFBSRUNJU0lPTnxQUklNQVJZfFBSSU5UfFBST0N8UFJPQ0VEVVJFfFBVQkxJQ3xSQUlTRVJST1J8UkVBRHxSRUFEVEVYVHxSRUNPTkZJR1VSRXxSRUZFUkVOQ0VTfFJFUExJQ0FUSU9OfFJFU1RPUkV8UkVTVFJJQ1R8UkVUVVJOfFJFVk9LRXxSSUdIVHxST0xMQkFDS3xST1dDT1VOVHxST1dHVUlEQ09MfFJVTEV8U0FWRXxTQ0hFTUF8U0VMRUNUfFNFU1NJT05fVVNFUnxTRVR8U0VUVVNFUnxTSFVURE9XTnxTT01FfFNUQVRJU1RJQ1N8U1lTVEVNX1VTRVJ8VEFCTEV8VEVYVFNJWkV8VEhFTnxUT3xUT1B8VFJBTnxUUkFOU0FDVElPTnxUUklHR0VSfFRSVU5DQVRFfFRTRVFVQUx8VU5JT058VU5JUVVFfFVQREFURXxVUERBVEVURVhUfFVTRXxVU0VSfFZBTFVFU3xWQVJZSU5HfFZJRVd8V0FJVEZPUnxXSEVOfFdIRVJFfFdISUxFfFdJVEh8V1JJVEVURVhUKSg/PVteXHctXXwkKS9pLCBudWxsXSwKLSAgICAgICAgIC8vIEEgbnVtYmVyIGlzIGEgaGV4IGludGVnZXIgbGl0ZXJhbCwgYSBkZWNpbWFsIHJlYWwgbGl0ZXJhbCwgb3IgaW4KLSAgICAgICAgIC8vIHNjaWVudGlmaWMgbm90YXRpb24uCi0gICAgICAgICBbUFJbJ1BSX0xJVEVSQUwnXSwKLSAgICAgICAgICAvXlsrLV0/KD86MHhbXGRhLWZdK3woPzooPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbK1wtXT9cZCspPykpL2ldLAotICAgICAgICAgLy8gQW4gaWRlbnRpZmllcgotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAvXlthLXpfXVtcdy1dKi9pXSwKLSAgICAgICAgIC8vIEEgcnVuIG9mIHB1bmN0dWF0aW9uCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eW15cd1x0XG5cciBceEEwXCJcJ11bXlx3XHRcblxyIFx4QTArXC1cIlwnXSovXQotICAgICAgICBdKSwKLSAgICBbJ3NxbCddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLXZiLmpzCi0vKioKLSAqIEBsaWNlbnNlIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciB2YXJpb3VzIGZsYXZvcnMgb2YgYmFzaWMuCi0gKgotICoKLSAqIFRvIHVzZSwgaW5jbHVkZSBwcmV0dGlmeS5qcyBhbmQgdGhpcyBmaWxlIGluIHlvdXIgSFRNTCBwYWdlLgotICogVGhlbiBwdXQgeW91ciBjb2RlIGluIGFuIEhUTUwgdGFnIGxpa2UKLSAqICAgICAgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy12YiI+PC9wcmU+Ci0gKgotICoKLSAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9hYTcxMTYzOChWUy43MSkuYXNweCBkZWZpbmVzIHRoZQotICogdmlzdWFsIGJhc2ljIGdyYW1tYXIgbGV4aWNhbCBncmFtbWFyLgotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0XG5cciBceEEwXHUyMDI4XHUyMDI5XSsvLCBudWxsLCAnXHRcblxyIFx4QTBcdTIwMjhcdTIwMjknXSwKLSAgICAgICAgIC8vIEEgZG91YmxlIHF1b3RlZCBzdHJpbmcgd2l0aCBxdW90ZXMgZXNjYXBlZCBieSBkb3VibGluZyB0aGVtLgotICAgICAgICAgLy8gQSBzaW5nbGUgY2hhcmFjdGVyIGNhbiBiZSBzdWZmaXhlZCB3aXRoIEMuCi0gICAgICAgICBbUFJbJ1BSX1NUUklORyddLCAgICAgIC9eKD86W1wiXHUyMDFDXHUyMDFEXSg/OlteXCJcdTIwMUNcdTIwMURdfFtcIlx1MjAxQ1x1MjAxRF17Mn0pKD86W1wiXHUyMDFDXHUyMDFEXWN8JCl8W1wiXHUyMDFDXHUyMDFEXSg/OlteXCJcdTIwMUNcdTIwMURdfFtcIlx1MjAxQ1x1MjAxRF17Mn0pKig/OltcIlx1MjAxQ1x1MjAxRF18JCkpL2ksIG51bGwsCi0gICAgICAgICAgJyJcdTIwMUNcdTIwMUQnXSwKLSAgICAgICAgIC8vIEEgY29tbWVudCBzdGFydHMgd2l0aCBhIHNpbmdsZSBxdW90ZSBhbmQgcnVucyB1bnRpbCB0aGUgZW5kIG9mIHRoZQotICAgICAgICAgLy8gbGluZS4KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAgICAgL15bXCdcdTIwMThcdTIwMTldW15cclxuXHUyMDI4XHUyMDI5XSovLCBudWxsLCAnXCdcdTIwMThcdTIwMTknXQotICAgICAgICBdLAotICAgICAgICBbCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwgL14oPzpBZGRIYW5kbGVyfEFkZHJlc3NPZnxBbGlhc3xBbmR8QW5kQWxzb3xBbnNpfEFzfEFzc2VtYmx5fEF1dG98Qm9vbGVhbnxCeVJlZnxCeXRlfEJ5VmFsfENhbGx8Q2FzZXxDYXRjaHxDQm9vbHxDQnl0ZXxDQ2hhcnxDRGF0ZXxDRGJsfENEZWN8Q2hhcnxDSW50fENsYXNzfENMbmd8Q09ianxDb25zdHxDU2hvcnR8Q1NuZ3xDU3RyfENUeXBlfERhdGV8RGVjaW1hbHxEZWNsYXJlfERlZmF1bHR8RGVsZWdhdGV8RGltfERpcmVjdENhc3R8RG98RG91YmxlfEVhY2h8RWxzZXxFbHNlSWZ8RW5kfEVuZElmfEVudW18RXJhc2V8RXJyb3J8RXZlbnR8RXhpdHxGaW5hbGx5fEZvcnxGcmllbmR8RnVuY3Rpb258R2V0fEdldFR5cGV8R29TdWJ8R29Ub3xIYW5kbGVzfElmfEltcGxlbWVudHN8SW1wb3J0c3xJbnxJbmhlcml0c3xJbnRlZ2VyfEludGVyZmFjZXxJc3xMZXR8TGlifExpa2V8TG9uZ3xMb29wfE1lfE1vZHxNb2R1bGV8TXVzdEluaGVyaXR8TXVzdE92ZXJyaWRlfE15QmFzZXxNeUNsYXNzfE5hbWVzcGFjZXxOZXd8TmV4dHxOb3R8Tm90SW5oZXJpdGFibGV8Tm90T3ZlcnJpZGFibGV8T2JqZWN0fE9ufE9wdGlvbnxPcHRpb25hbHxPcnxPckVsc2V8T3ZlcmxvYWRzfE92ZXJyaWRhYmxlfE92ZXJyaWRlc3xQYXJhbUFycmF5fFByZXNlcnZlfFByaXZhdGV8UHJvcGVydHl8UHJvdGVjdGVkfFB1YmxpY3xSYWlzZUV2ZW50fFJlYWRPbmx5fFJlRGltfFJlbW92ZUhhbmRsZXJ8UmVzdW1lfFJldHVybnxTZWxlY3R8U2V0fFNoYWRvd3N8U2hhcmVkfFNob3J0fFNpbmdsZXxTdGF0aWN8U3RlcHxTdG9wfFN0cmluZ3xTdHJ1Y3R1cmV8U3VifFN5bmNMb2NrfFRoZW58VGhyb3d8VG98VHJ5fFR5cGVPZnxVbmljb2RlfFVudGlsfFZhcmlhbnR8V2VuZHxXaGVufFdoaWxlfFdpdGh8V2l0aEV2ZW50c3xXcml0ZU9ubHl8WG9yfEVuZElmfEdvU3VifExldHxWYXJpYW50fFdlbmQpXGIvaSwgbnVsbF0sCi0gICAgICAgICAvLyBBIHNlY29uZCBjb21tZW50IGZvcm0KLSAgICAgICAgIFtQUlsnUFJfQ09NTUVOVCddLCAvXlJFTVteXHJcblx1MjAyOFx1MjAyOV0qL2ldLAotICAgICAgICAgLy8gQSBib29sZWFuLCBudW1lcmljLCBvciBkYXRlIGxpdGVyYWwuCi0gICAgICAgICBbUFJbJ1BSX0xJVEVSQUwnXSwKLSAgICAgICAgICAvXig/OlRydWVcYnxGYWxzZVxifE5vdGhpbmdcYnxcZCsoPzpFWytcLV0/XGQrW0ZSRF0/fFtGUkRTSUxdKT98KD86JkhbMC05QS1GXSt8Jk9bMC03XSspW1NJTF0/fFxkKlwuXGQrKD86RVsrXC1dP1xkKyk/W0ZSRF0/fCNccysoPzpcZCtbXC1cL11cZCtbXC1cL11cZCsoPzpccytcZCs6XGQrKD86OlxkKyk/KFxzKig/OkFNfFBNKSk/KT98XGQrOlxkKyg/OjpcZCspPyhccyooPzpBTXxQTSkpPylccysjKS9pXSwKLSAgICAgICAgIC8vIEFuIGlkZW50aWZpZXI/Ci0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sIC9eKD86KD86W2Etel18X1x3KVx3KnxcWyg/OlthLXpdfF9cdylcdypcXSkvaV0sCi0gICAgICAgICAvLyBBIHJ1biBvZiBwdW5jdHVhdGlvbgotICAgICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLAotICAgICAgICAgIC9eW15cd1x0XG5cciBcIlwnXFtcXVx4QTBcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjhcdTIwMjldKy9dLAotICAgICAgICAgLy8gU3F1YXJlIGJyYWNrZXRzCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eKD86XFt8XF0pL10KLSAgICAgICAgXSksCi0gICAgWyd2YicsICd2YnMnXSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9nb29nbGVfY29kZV9wcmV0dGlmeS9zcmMvbGFuZy12aGRsLmpzCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcKLSAqIFJlZ2lzdGVycyBhIGxhbmd1YWdlIGhhbmRsZXIgZm9yIFZIREwgJzkzLgotICoKLSAqIEJhc2VkIG9uIHRoZSBsZXhpY2FsIGdyYW1tYXIgYW5kIGtleXdvcmRzIGF0Ci0gKiBodHRwOi8vd3d3Lmlpcy5lZS5ldGh6LmNoL356aW1taS9kb3dubG9hZC92aGRsOTNfc3ludGF4Lmh0bWwKLSAqCi0gKiBAYXV0aG9yIGJlbm9pdEByeWRlci5mcgotICovCi0KLVBSWydyZWdpc3RlckxhbmdIYW5kbGVyJ10oCi0gICAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oCi0gICAgICAgIFsKLSAgICAgICAgIC8vIFdoaXRlc3BhY2UKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgL15bXHRcblxyIFx4QTBdKy8sIG51bGwsICdcdFxuXHIgXHhBMCddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIFN0cmluZywgY2hhcmFjdGVyIG9yIGJpdCBzdHJpbmcKLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sIC9eKD86W0JPWF0/Iig/OlteXCJdfCIiKSoifCcuJykvaV0sCi0gICAgICAgICAvLyBDb21tZW50LCBmcm9tIHR3byBkYXNoZXMgdW50aWwgZW5kIG9mIGxpbmUuCi0gICAgICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgL14tLVteXHJcbl0qL10sCi0gICAgICAgICBbUFJbJ1BSX0tFWVdPUkQnXSwgL14oPzphYnN8YWNjZXNzfGFmdGVyfGFsaWFzfGFsbHxhbmR8YXJjaGl0ZWN0dXJlfGFycmF5fGFzc2VydHxhdHRyaWJ1dGV8YmVnaW58YmxvY2t8Ym9keXxidWZmZXJ8YnVzfGNhc2V8Y29tcG9uZW50fGNvbmZpZ3VyYXRpb258Y29uc3RhbnR8ZGlzY29ubmVjdHxkb3dudG98ZWxzZXxlbHNpZnxlbmR8ZW50aXR5fGV4aXR8ZmlsZXxmb3J8ZnVuY3Rpb258Z2VuZXJhdGV8Z2VuZXJpY3xncm91cHxndWFyZGVkfGlmfGltcHVyZXxpbnxpbmVydGlhbHxpbm91dHxpc3xsYWJlbHxsaWJyYXJ5fGxpbmthZ2V8bGl0ZXJhbHxsb29wfG1hcHxtb2R8bmFuZHxuZXd8bmV4dHxub3J8bm90fG51bGx8b2Z8b258b3BlbnxvcnxvdGhlcnN8b3V0fHBhY2thZ2V8cG9ydHxwb3N0cG9uZWR8cHJvY2VkdXJlfHByb2Nlc3N8cHVyZXxyYW5nZXxyZWNvcmR8cmVnaXN0ZXJ8cmVqZWN0fHJlbXxyZXBvcnR8cmV0dXJufHJvbHxyb3J8c2VsZWN0fHNldmVyaXR5fHNoYXJlZHxzaWduYWx8c2xhfHNsbHxzcmF8c3JsfHN1YnR5cGV8dGhlbnx0b3x0cmFuc3BvcnR8dHlwZXx1bmFmZmVjdGVkfHVuaXRzfHVudGlsfHVzZXx2YXJpYWJsZXx3YWl0fHdoZW58d2hpbGV8d2l0aHx4bm9yfHhvcikoPz1bXlx3LV18JCkvaSwgbnVsbF0sCi0gICAgICAgICAvLyBUeXBlLCBwcmVkZWZpbmVkIG9yIHN0YW5kYXJkCi0gICAgICAgICBbUFJbJ1BSX1RZUEUnXSwgL14oPzpiaXR8Yml0X3ZlY3RvcnxjaGFyYWN0ZXJ8Ym9vbGVhbnxpbnRlZ2VyfHJlYWx8dGltZXxzdHJpbmd8c2V2ZXJpdHlfbGV2ZWx8cG9zaXRpdmV8bmF0dXJhbHxzaWduZWR8dW5zaWduZWR8bGluZXx0ZXh0fHN0ZF91P2xvZ2ljKD86X3ZlY3Rvcik/KSg/PVteXHctXXwkKS9pLCBudWxsXSwKLSAgICAgICAgIC8vIFByZWRlZmluZWQgYXR0cmlidXRlcwotICAgICAgICAgW1BSWydQUl9UWVBFJ10sIC9eXCcoPzpBQ1RJVkV8QVNDRU5ESU5HfEJBU0V8REVMQVlFRHxEUklWSU5HfERSSVZJTkdfVkFMVUV8RVZFTlR8SElHSHxJTUFHRXxJTlNUQU5DRV9OQU1FfExBU1RfQUNUSVZFfExBU1RfRVZFTlR8TEFTVF9WQUxVRXxMRUZUfExFRlRPRnxMRU5HVEh8TE9XfFBBVEhfTkFNRXxQT1N8UFJFRHxRVUlFVHxSQU5HRXxSRVZFUlNFX1JBTkdFfFJJR0hUfFJJR0hUT0Z8U0lNUExFX05BTUV8U1RBQkxFfFNVQ0N8VFJBTlNBQ1RJT058VkFMfFZBTFVFKSg/PVteXHctXXwkKS9pLCBudWxsXSwKLSAgICAgICAgIC8vIE51bWJlciwgZGVjaW1hbCBvciBiYXNlZCBsaXRlcmFsCi0gICAgICAgICBbUFJbJ1BSX0xJVEVSQUwnXSwgL15cZCsoPzpfXGQrKSooPzojW1x3XFwuXSsjKD86WytcLV0/XGQrKD86X1xkKykqKT98KD86XC5cZCsoPzpfXGQrKSopPyg/OkVbK1wtXT9cZCsoPzpfXGQrKSopPykvaV0sCi0gICAgICAgICAvLyBJZGVudGlmaWVyLCBiYXNpYyBvciBleHRlbmRlZAotICAgICAgICAgW1BSWydQUl9QTEFJTiddLCAvXig/OlthLXpdXHcqfFxcW15cXF0qXFwpL2ldLAotICAgICAgICAgLy8gUHVuY3R1YXRpb24KLSAgICAgICAgIFtQUlsnUFJfUFVOQ1RVQVRJT04nXSwgL15bXlx3XHRcblxyIFx4QTBcIlwnXVteXHdcdFxuXHIgXHhBMFwtXCJcJ10qL10KLSAgICAgICAgXSksCi0gICAgWyd2aGRsJywgJ3ZoZCddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2dvb2dsZV9jb2RlX3ByZXR0aWZ5L3NyYy9sYW5nLXdpa2kuanMKLS8qKgotICogQGxpY2Vuc2UgQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGZpbGVvdmVydmlldwotICogUmVnaXN0ZXJzIGEgbGFuZ3VhZ2UgaGFuZGxlciBmb3IgV2lraSBwYWdlcy4KLSAqCi0gKiBCYXNlZCBvbiBXaWtpU3ludGF4IGF0IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9zdXBwb3J0L3dpa2kvV2lraVN5bnRheAotICoKLSAqIEBhdXRob3IgbWlrZXNhbXVlbEBnbWFpbC5jb20KLSAqLwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKAotICAgICAgICBbCi0gICAgICAgICAvLyBXaGl0ZXNwYWNlCi0gICAgICAgICBbUFJbJ1BSX1BMQUlOJ10sICAgICAgIC9eW1x0IFx4QTBhLWdpLXowLTldKy8sIG51bGwsCi0gICAgICAgICAgJ1x0IFx4QTBhYmNkZWZnaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSddLAotICAgICAgICAgLy8gV2lraSBmb3JtYXR0aW5nCi0gICAgICAgICBbUFJbJ1BSX1BVTkNUVUFUSU9OJ10sIC9eWz0qflxeXFtcXV0rLywgbnVsbCwgJz0qfl5bXSddCi0gICAgICAgIF0sCi0gICAgICAgIFsKLSAgICAgICAgIC8vIE1ldGEtaW5mbyBsaWtlICNzdW1tYXJ5LCAjbGFiZWxzLCBldGMuCi0gICAgICAgICBbJ2xhbmctd2lraS5tZXRhJywgIC8oPzpeXnxcclxuP3xcbikoI1thLXpdKylcYi9dLAotICAgICAgICAgLy8gQSBXaWtpV29yZAotICAgICAgICAgW1BSWydQUl9MSVRFUkFMJ10sICAgICAvXig/OltBLVpdW2Etel1bYS16MC05XStbQS1aXVthLXpdW2EtekEtWjAtOV0rKVxiLwotICAgICAgICAgIF0sCi0gICAgICAgICAvLyBBIHByZWZvcm1hdHRlZCBibG9jayBpbiBhbiB1bmtub3duIGxhbmd1YWdlCi0gICAgICAgICBbJ2xhbmctJywgICAgICAgICAgIC9eXHtce1x7KFtcc1xTXSs/KVx9XH1cfS9dLAotICAgICAgICAgLy8gQSBibG9jayBvZiBzb3VyY2UgY29kZSBpbiBhbiB1bmtub3duIGxhbmd1YWdlCi0gICAgICAgICBbJ2xhbmctJywgICAgICAgICAgIC9eYChbXlxyXG5gXSspYC9dLAotICAgICAgICAgLy8gQW4gaW5saW5lIFVSTC4KLSAgICAgICAgIFtQUlsnUFJfU1RSSU5HJ10sCi0gICAgICAgICAgL15odHRwcz86XC9cL1teXC8/I1xzXSooPzpcL1tePyNcc10qKT8oPzpcP1teI1xzXSopPyg/OiNcUyopPy9pXSwKLSAgICAgICAgIFtQUlsnUFJfUExBSU4nXSwgICAgICAgL14oPzpcclxufFtcc1xTXSlbXiM9Kn5eQS1aaFx7YFxbXHJcbl0qL10KLSAgICAgICAgXSksCi0gICAgWyd3aWtpJ10pOwotCi1QUlsncmVnaXN0ZXJMYW5nSGFuZGxlciddKAotICAgIFBSWydjcmVhdGVTaW1wbGVMZXhlciddKFtbUFJbJ1BSX0tFWVdPUkQnXSwgL14jW2Etel0rL2ksIG51bGwsICcjJ11dLCBbXSksCi0gICAgWyd3aWtpLm1ldGEnXSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9nb29nbGVfY29kZV9wcmV0dGlmeS9zcmMvbGFuZy15YW1sLmpzCi0vKiogQ29udHJpYnV0ZWQgYnkgcmlicmRiIEAgY29kZS5nb29nbGUuY29tCi0gKi8KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3Ci0gKiBSZWdpc3RlcnMgYSBsYW5ndWFnZSBoYW5kbGVyIGZvciBZQU1MLgotICoKLSAqIEBhdXRob3IgcmlicmRiCi0gKi8KLQotUFJbJ3JlZ2lzdGVyTGFuZ0hhbmRsZXInXSgKLSAgUFJbJ2NyZWF0ZVNpbXBsZUxleGVyJ10oCi0gICAgWwotICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXls6fD4/XSsvLCBudWxsLCAnOnw+PyddLAotICAgICAgW1BSWydQUl9ERUNMQVJBVElPTiddLCAgL14lKD86WUFNTHxUQUcpW14jXHJcbl0rLywgbnVsbCwgJyUnXSwKLSAgICAgIFtQUlsnUFJfVFlQRSddLCAvXlsmXVxTKy8sIG51bGwsICcmJ10sCi0gICAgICBbUFJbJ1BSX1RZUEUnXSwgL14hXFMqLywgbnVsbCwgJyEnXSwKLSAgICAgIFtQUlsnUFJfU1RSSU5HJ10sIC9eIig/OlteXFwiXXxcXC4pKig/OiJ8JCkvLCBudWxsLCAnIiddLAotICAgICAgW1BSWydQUl9TVFJJTkcnXSwgL14nKD86W14nXXwnJykqKD86J3wkKS8sIG51bGwsICInIl0sCi0gICAgICBbUFJbJ1BSX0NPTU1FTlQnXSwgL14jW15cclxuXSovLCBudWxsLCAnIyddLAotICAgICAgW1BSWydQUl9QTEFJTiddLCAvXlxzKy8sIG51bGwsICcgXHRcclxuJ10KLSAgICBdLAotICAgIFsKLSAgICAgIFtQUlsnUFJfREVDTEFSQVRJT04nXSwgL14oPzotLS18XC5cLlwuKSg/OltcclxuXXwkKS9dLAotICAgICAgW1BSWydQUl9QVU5DVFVBVElPTiddLCAvXi0vXSwKLSAgICAgIFtQUlsnUFJfS0VZV09SRCddLCAvXlx3KzpbIFxyXG5dL10sCi0gICAgICBbUFJbJ1BSX1BMQUlOJ10sIC9eXHcrL10KLSAgICBdKSwgWyd5YW1sJywgJ3ltbCddKTsKLQotLy90aGlyZF9wYXJ0eS9qYXZhc2NyaXB0L2pxdWVyeS92MV83XzIvanF1ZXJ5LTEuNy4yLm1pbi5qcwotLyoqCi0gKiBAbGljZW5zZSBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYxLjcuMgotICogaHR0cDovL2pxdWVyeS5jb20vCi0gKgotICogQ29weXJpZ2h0IDIwMTEsIEpvaG4gUmVzaWcKLSAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgotICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQotICoKLSAqIEluY2x1ZGVzIFNpenpsZS5qcwotICogaHR0cDovL3NpenpsZWpzLmNvbS8KLSAqIENvcHlyaWdodCAyMDExLCBUaGUgRG9qbyBGb3VuZGF0aW9uCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCi0gKgotICogRGF0ZTogV2VkIE1hciAyMSAxMjo0NjozNCAyMDEyIC0wNzAwCi0gKi8KLShmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGN5KGEpe3JldHVybiBmLmlzV2luZG93KGEpP2E6YS5ub2RlVHlwZT09PTk/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9ZnVuY3Rpb24gY3UoYSl7aWYoIWNqW2FdKXt2YXIgYj1jLmJvZHksZD1mKCI8IithKyI+IikuYXBwZW5kVG8oYiksZT1kLmNzcygiZGlzcGxheSIpO2QucmVtb3ZlKCk7aWYoZT09PSJub25lInx8ZT09PSIiKXtja3x8KGNrPWMuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksY2suZnJhbWVCb3JkZXI9Y2sud2lkdGg9Y2suaGVpZ2h0PTApLGIuYXBwZW5kQ2hpbGQoY2spO2lmKCFjbHx8IWNrLmNyZWF0ZUVsZW1lbnQpY2w9KGNrLmNvbnRlbnRXaW5kb3d8fGNrLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsY2wud3JpdGUoKGYuc3VwcG9ydC5ib3hNb2RlbD8iPCFkb2N0eXBlIGh0bWw+IjoiIikrIjxodG1sPjxib2R5PiIpLGNsLmNsb3NlKCk7ZD1jbC5jcmVhdGVFbGVtZW50KGEpLGNsLmJvZHkuYXBwZW5kQ2hpbGQoZCksZT1mLmNzcyhkLCJkaXNwbGF5IiksYi5yZW1vdmVDaGlsZChjayl9Y2pbYV09ZX1yZXR1cm4gY2pbYV19ZnVuY3Rpb24gY3QoYSxiKXt2YXIgYz17fTtmLmVhY2goY3AuY29uY2F0LmFwcGx5KFtdLGNwLnNsaWNlKDAsYikpLGZ1bmN0aW9uKCl7Y1t0aGlzXT1hfSk7cmV0dXJuIGN9ZnVuY3Rpb24gY3MoKXtjcT1ifWZ1bmN0aW9uIGNyKCl7c2V0VGltZW91dChjcywwKTtyZXR1cm4gY3E9Zi5ub3coKX1mdW5jdGlvbiBjaSgpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fWZ1bmN0aW9uIGNoKCl7dHJ5e3JldHVybiBuZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChiKXt9fWZ1bmN0aW9uIGNiKGEsYyl7YS5kYXRhRmlsdGVyJiYoYz1hLmRhdGFGaWx0ZXIoYyxhLmRhdGFUeXBlKSk7dmFyIGQ9YS5kYXRhVHlwZXMsZT17fSxnLGgsaT1kLmxlbmd0aCxqLGs9ZFswXSxsLG0sbixvLHA7Zm9yKGc9MTtnPGk7ZysrKXtpZihnPT09MSlmb3IoaCBpbiBhLmNvbnZlcnRlcnMpdHlwZW9mIGg9PSJzdHJpbmciJiYoZVtoLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1toXSk7bD1rLGs9ZFtnXTtpZihrPT09IioiKWs9bDtlbHNlIGlmKGwhPT0iKiImJmwhPT1rKXttPWwrIiAiK2ssbj1lW21dfHxlWyIqICIra107aWYoIW4pe3A9Yjtmb3IobyBpbiBlKXtqPW8uc3BsaXQoIiAiKTtpZihqWzBdPT09bHx8alswXT09PSIqIil7cD1lW2pbMV0rIiAiK2tdO2lmKHApe289ZVtvXSxvPT09ITA/bj1wOnA9PT0hMCYmKG49byk7YnJlYWt9fX19IW4mJiFwJiZmLmVycm9yKCJObyBjb252ZXJzaW9uIGZyb20gIittLnJlcGxhY2UoIiAiLCIgdG8gIikpLG4hPT0hMCYmKGM9bj9uKGMpOnAobyhjKSkpfX1yZXR1cm4gY31mdW5jdGlvbiBjYShhLGMsZCl7dmFyIGU9YS5jb250ZW50cyxmPWEuZGF0YVR5cGVzLGc9YS5yZXNwb25zZUZpZWxkcyxoLGksaixrO2ZvcihpIGluIGcpaSBpbiBkJiYoY1tnW2ldXT1kW2ldKTt3aGlsZShmWzBdPT09IioiKWYuc2hpZnQoKSxoPT09YiYmKGg9YS5taW1lVHlwZXx8Yy5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGgpZm9yKGkgaW4gZSlpZihlW2ldJiZlW2ldLnRlc3QoaCkpe2YudW5zaGlmdChpKTticmVha31pZihmWzBdaW4gZClqPWZbMF07ZWxzZXtmb3IoaSBpbiBkKXtpZighZlswXXx8YS5jb252ZXJ0ZXJzW2krIiAiK2ZbMF1dKXtqPWk7YnJlYWt9a3x8KGs9aSl9aj1qfHxrfWlmKGope2ohPT1mWzBdJiZmLnVuc2hpZnQoaik7cmV0dXJuIGRbal19fWZ1bmN0aW9uIGJfKGEsYixjLGQpe2lmKGYuaXNBcnJheShiKSlmLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fGJELnRlc3QoYSk/ZChhLGUpOmJfKGErIlsiKyh0eXBlb2YgZT09Im9iamVjdCI/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmYudHlwZShiKT09PSJvYmplY3QiKWZvcih2YXIgZSBpbiBiKWJfKGErIlsiK2UrIl0iLGJbZV0sYyxkKTtlbHNlIGQoYSxiKX1mdW5jdGlvbiBiJChhLGMpe3ZhciBkLGUsZz1mLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYyljW2RdIT09YiYmKChnW2RdP2E6ZXx8KGU9e30pKVtkXT1jW2RdKTtlJiZmLmV4dGVuZCghMCxhLGUpfWZ1bmN0aW9uIGJaKGEsYyxkLGUsZixnKXtmPWZ8fGMuZGF0YVR5cGVzWzBdLGc9Z3x8e30sZ1tmXT0hMDt2YXIgaD1hW2ZdLGk9MCxqPWg/aC5sZW5ndGg6MCxrPWE9PT1iUyxsO2Zvcig7aTxqJiYoa3x8IWwpO2krKylsPWhbaV0oYyxkLGUpLHR5cGVvZiBsPT0ic3RyaW5nIiYmKCFrfHxnW2xdP2w9YjooYy5kYXRhVHlwZXMudW5zaGlmdChsKSxsPWJaKGEsYyxkLGUsbCxnKSkpOyhrfHwhbCkmJiFnWyIqIl0mJihsPWJaKGEsYyxkLGUsIioiLGcpKTtyZXR1cm4gbH1mdW5jdGlvbiBiWShhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXt0eXBlb2YgYiE9InN0cmluZyImJihjPWIsYj0iKiIpO2lmKGYuaXNGdW5jdGlvbihjKSl7dmFyIGQ9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KGJPKSxlPTAsZz1kLmxlbmd0aCxoLGksajtmb3IoO2U8ZztlKyspaD1kW2VdLGo9L15cKy8udGVzdChoKSxqJiYoaD1oLnN1YnN0cigxKXx8IioiKSxpPWFbaF09YVtoXXx8W10saVtqPyJ1bnNoaWZ0IjoicHVzaCJdKGMpfX19ZnVuY3Rpb24gYkIoYSxiLGMpe3ZhciBkPWI9PT0id2lkdGgiP2Eub2Zmc2V0V2lkdGg6YS5vZmZzZXRIZWlnaHQsZT1iPT09IndpZHRoIj8xOjAsZz00O2lmKGQ+MCl7aWYoYyE9PSJib3JkZXIiKWZvcig7ZTxnO2UrPTIpY3x8KGQtPXBhcnNlRmxvYXQoZi5jc3MoYSwicGFkZGluZyIrYnhbZV0pKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2J4W2VdKSl8fDA6ZC09cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2J4W2VdKyJXaWR0aCIpKXx8MDtyZXR1cm4gZCsicHgifWQ9YnkoYSxiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdO2lmKGJ0LnRlc3QoZCkpcmV0dXJuIGQ7ZD1wYXJzZUZsb2F0KGQpfHwwO2lmKGMpZm9yKDtlPGc7ZSs9MilkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2J4W2VdKSl8fDAsYyE9PSJwYWRkaW5nIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIitieFtlXSsiV2lkdGgiKSl8fDApLGM9PT0ibWFyZ2luIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2J4W2VdKSl8fDApO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYm8oYSl7dmFyIGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTtiaC5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD1hLm91dGVySFRNTDtyZXR1cm4gYi5maXJzdENoaWxkfWZ1bmN0aW9uIGJuKGEpe3ZhciBiPShhLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKTtiPT09ImlucHV0Ij9ibShhKTpiIT09InNjcmlwdCImJnR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIiYmZi5ncmVwKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksYm0pfWZ1bmN0aW9uIGJtKGEpe2lmKGEudHlwZT09PSJjaGVja2JveCJ8fGEudHlwZT09PSJyYWRpbyIpYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWR9ZnVuY3Rpb24gYmwoYSl7cmV0dXJuIHR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/YS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gYmsoYSxiKXt2YXIgYztiLm5vZGVUeXBlPT09MSYmKGIuY2xlYXJBdHRyaWJ1dGVzJiZiLmNsZWFyQXR0cmlidXRlcygpLGIubWVyZ2VBdHRyaWJ1dGVzJiZiLm1lcmdlQXR0cmlidXRlcyhhKSxjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxjPT09Im9iamVjdCI/Yi5vdXRlckhUTUw9YS5vdXRlckhUTUw6YyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyI/Yz09PSJvcHRpb24iP2Iuc2VsZWN0ZWQ9YS5kZWZhdWx0U2VsZWN0ZWQ6Yz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiP2IuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlOmM9PT0ic2NyaXB0IiYmYi50ZXh0IT09YS50ZXh0JiYoYi50ZXh0PWEudGV4dCk6KGEuY2hlY2tlZCYmKGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCksYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpKSxiLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGIucmVtb3ZlQXR0cmlidXRlKCJfc3VibWl0X2F0dGFjaGVkIiksYi5yZW1vdmVBdHRyaWJ1dGUoIl9jaGFuZ2VfYXR0YWNoZWQiKSl9ZnVuY3Rpb24gYmooYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMsaVtjXVtkXSl9aC5kYXRhJiYoaC5kYXRhPWYuZXh0ZW5kKHt9LGguZGF0YSkpfX1mdW5jdGlvbiBiaShhLGIpe3JldHVybiBmLm5vZGVOYW1lKGEsInRhYmxlIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBVKGEpe3ZhciBiPVYuc3BsaXQoInwiKSxjPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKGMuY3JlYXRlRWxlbWVudCl3aGlsZShiLmxlbmd0aCljLmNyZWF0ZUVsZW1lbnQoYi5wb3AoKSk7cmV0dXJuIGN9ZnVuY3Rpb24gVChhLGIsYyl7Yj1ifHwwO2lmKGYuaXNGdW5jdGlvbihiKSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1mLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihPLnRlc3QoYikpcmV0dXJuIGYuZmlsdGVyKGIsZCwhYyk7Yj1mLmZpbHRlcihiLGQpfXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBmLmluQXJyYXkoYSxiKT49MD09PWN9KX1mdW5jdGlvbiBTKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiBLKCl7cmV0dXJuITB9ZnVuY3Rpb24gSigpe3JldHVybiExfWZ1bmN0aW9uIG4oYSxiLGMpe3ZhciBkPWIrImRlZmVyIixlPWIrInF1ZXVlIixnPWIrIm1hcmsiLGg9Zi5fZGF0YShhLGQpO2gmJihjPT09InF1ZXVlInx8IWYuX2RhdGEoYSxlKSkmJihjPT09Im1hcmsifHwhZi5fZGF0YShhLGcpKSYmc2V0VGltZW91dChmdW5jdGlvbigpeyFmLl9kYXRhKGEsZSkmJiFmLl9kYXRhKGEsZykmJihmLnJlbW92ZURhdGEoYSxkLCEwKSxoLmZpcmUoKSl9LDApfWZ1bmN0aW9uIG0oYSl7Zm9yKHZhciBiIGluIGEpe2lmKGI9PT0iZGF0YSImJmYuaXNFbXB0eU9iamVjdChhW2JdKSljb250aW51ZTtpZihiIT09InRvSlNPTiIpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbChhLGMsZCl7aWYoZD09PWImJmEubm9kZVR5cGU9PT0xKXt2YXIgZT0iZGF0YS0iK2MucmVwbGFjZShrLCItJDEiKS50b0xvd2VyQ2FzZSgpO2Q9YS5nZXRBdHRyaWJ1dGUoZSk7aWYodHlwZW9mIGQ9PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiPyEwOmQ9PT0iZmFsc2UiPyExOmQ9PT0ibnVsbCI/bnVsbDpmLmlzTnVtZXJpYyhkKT8rZDpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxuPS9eW1xdLDp7fVxzXSokLyxvPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscD0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscT0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHI9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8scz0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdD0vKG1zaWUpIChbXHcuXSspLyx1PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdj0vLShbYS16XXxbMC05XSkvaWcsdz0vXi1tcy0vLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0seT1kLnVzZXJBZ2VudCx6LEEsQixDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEU9QXJyYXkucHJvdG90eXBlLnB1c2gsRj1BcnJheS5wcm90b3R5cGUuc2xpY2UsRz1TdHJpbmcucHJvdG90eXBlLnRyaW0sSD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixJPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1tLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNy4yIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmNvbnN0cnVjdG9yKCk7ZS5pc0FycmF5KGEpP0UuYXBwbHkoZCxhKTplLm1lcmdlKGQsYSksZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBkfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2UuYmluZFJlYWR5KCksQS5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe2E9K2E7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSxhKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhGLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEYuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkUsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0EuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFBKXtBPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhIT1udWxsJiZhPT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGEpKSYmaXNGaW5pdGUoYSl9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/U3RyaW5nKGEpOklbQy5jYWxsKGEpXXx8Im9iamVjdCJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fGUudHlwZShhKSE9PSJvYmplY3QifHxhLm5vZGVUeXBlfHxlLmlzV2luZG93KGEpKXJldHVybiExO3RyeXtpZihhLmNvbnN0cnVjdG9yJiYhRC5jYWxsKGEsImNvbnN0cnVjdG9yIikmJiFELmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChjKXtyZXR1cm4hMX12YXIgZDtmb3IoZCBpbiBhKTtyZXR1cm4gZD09PWJ8fEQuY2FsbChhLGQpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LHBhcnNlSlNPTjpmdW5jdGlvbihiKXtpZih0eXBlb2YgYiE9InN0cmluZyJ8fCFiKXJldHVybiBudWxsO2I9ZS50cmltKGIpO2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYik7aWYobi50ZXN0KGIucmVwbGFjZShvLCJAIikucmVwbGFjZShwLCJdIikucmVwbGFjZShxLCIiKSkpcmV0dXJuKG5ldyBGdW5jdGlvbigicmV0dXJuICIrYikpKCk7ZS5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxwYXJzZVhNTDpmdW5jdGlvbihjKXtpZih0eXBlb2YgYyE9InN0cmluZyJ8fCFjKXJldHVybiBudWxsO3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodywibXMtIikucmVwbGFjZSh2LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihIKXJldHVybiBILmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgsaSl7dmFyIGosaz1kPT1udWxsLGw9MCxtPWEubGVuZ3RoO2lmKGQmJnR5cGVvZiBkPT0ib2JqZWN0Iil7Zm9yKGwgaW4gZCllLmFjY2VzcyhhLGMsbCxkW2xdLDEsaCxmKTtnPTF9ZWxzZSBpZihmIT09Yil7aj1pPT09YiYmZS5pc0Z1bmN0aW9uKGYpLGsmJihqPyhqPWMsYz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGouY2FsbChlKGEpLGMpfSk6KGMuY2FsbChhLGYpLGM9bnVsbCkpO2lmKGMpZm9yKDtsPG07bCsrKWMoYVtsXSxkLGo/Zi5jYWxsKGFbbF0sbCxjKGFbbF0sZCkpOmYsaSk7Zz0xfXJldHVybiBnP2E6az9jLmNhbGwoYSk6bT9jKGFbMF0sZCk6aH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHVhTWF0Y2g6ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGI9ci5leGVjKGEpfHxzLmV4ZWMoYSl8fHQuZXhlYyhhKXx8YS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmdS5leGVjKGEpfHxbXTtyZXR1cm57YnJvd3NlcjpiWzFdfHwiIix2ZXJzaW9uOmJbMl18fCIwIn19LHN1YjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjKXtyZXR1cm4gbmV3IGEuZm4uaW5pdChiLGMpfWUuZXh0ZW5kKCEwLGEsdGhpcyksYS5zdXBlcmNsYXNzPXRoaXMsYS5mbj1hLnByb3RvdHlwZT10aGlzKCksYS5mbi5jb25zdHJ1Y3Rvcj1hLGEuc3ViPXRoaXMuc3ViLGEuZm4uaW5pdD1mdW5jdGlvbihkLGYpe2YmJmYgaW5zdGFuY2VvZiBlJiYhKGYgaW5zdGFuY2VvZiBhKSYmKGY9YShmKSk7cmV0dXJuIGUuZm4uaW5pdC5jYWxsKHRoaXMsZCxmLGIpfSxhLmZuLmluaXQucHJvdG90eXBlPWEuZm47dmFyIGI9YShjKTtyZXR1cm4gYX0sYnJvd3Nlcjp7fX0pLGUuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe0lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSksej1lLnVhTWF0Y2goeSksei5icm93c2VyJiYoZS5icm93c2VyW3ouYnJvd3Nlcl09ITAsZS5icm93c2VyLnZlcnNpb249ei52ZXJzaW9uKSxlLmJyb3dzZXIud2Via2l0JiYoZS5icm93c2VyLnNhZmFyaT0hMCksai50ZXN0KCLDgiAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtLG49ZnVuY3Rpb24oYil7dmFyIGQsZSxnLGgsaTtmb3IoZD0wLGU9Yi5sZW5ndGg7ZDxlO2QrKylnPWJbZF0saD1mLnR5cGUoZyksaD09PSJhcnJheSI/bihnKTpoPT09ImZ1bmN0aW9uIiYmKCFhLnVuaXF1ZXx8IXAuaGFzKGcpKSYmYy5wdXNoKGcpfSxvPWZ1bmN0aW9uKGIsZil7Zj1mfHxbXSxlPSFhLm1lbW9yeXx8W2IsZl0saT0hMCxqPSEwLG09a3x8MCxrPTAsbD1jLmxlbmd0aDtmb3IoO2MmJm08bDttKyspaWYoY1ttXS5hcHBseShiLGYpPT09ITEmJmEuc3RvcE9uRmFsc2Upe2U9ITA7YnJlYWt9aj0hMSxjJiYoYS5vbmNlP2U9PT0hMD9wLmRpc2FibGUoKTpjPVtdOmQmJmQubGVuZ3RoJiYoZT1kLnNoaWZ0KCkscC5maXJlV2l0aChlWzBdLGVbMV0pKSl9LHA9e2FkZDpmdW5jdGlvbigpe2lmKGMpe3ZhciBhPWMubGVuZ3RoO24oYXJndW1lbnRzKSxqP2w9Yy5sZW5ndGg6ZSYmZSE9PSEwJiYoaz1hLG8oZVswXSxlWzFdKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKGMpe3ZhciBiPWFyZ3VtZW50cyxkPTAsZT1iLmxlbmd0aDtmb3IoO2Q8ZTtkKyspZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoYltkXT09PWNbZl0pe2omJmY8PWwmJihsLS0sZjw9bSYmbS0tKSxjLnNwbGljZShmLS0sMSk7aWYoYS51bmlxdWUpYnJlYWt9fXJldHVybiB0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7aWYoYyl7dmFyIGI9MCxkPWMubGVuZ3RoO2Zvcig7YjxkO2IrKylpZihhPT09Y1tiXSlyZXR1cm4hMH1yZXR1cm4hMX0sZW1wdHk6ZnVuY3Rpb24oKXtjPVtdO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7Yz1kPWU9YjtyZXR1cm4gdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hY30sbG9jazpmdW5jdGlvbigpe2Q9YiwoIWV8fGU9PT0hMCkmJnAuZGlzYWJsZSgpO3JldHVybiB0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hZH0sZmlyZVdpdGg6ZnVuY3Rpb24oYixjKXtkJiYoaj9hLm9uY2V8fGQucHVzaChbYixjXSk6KCFhLm9uY2V8fCFlKSYmbyhiLGMpKTtyZXR1cm4gdGhpc30sZmlyZTpmdW5jdGlvbigpe3AuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhaX19O3JldHVybiBwfTt2YXIgaT1bXS5zbGljZTtmLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYz1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxkPWYuQ2FsbGJhY2tzKCJtZW1vcnkiKSxlPSJwZW5kaW5nIixnPXtyZXNvbHZlOmIscmVqZWN0OmMsbm90aWZ5OmR9LGg9e2RvbmU6Yi5hZGQsZmFpbDpjLmFkZCxwcm9ncmVzczpkLmFkZCxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBlfSxpc1Jlc29sdmVkOmIuZmlyZWQsaXNSZWplY3RlZDpjLmZpcmVkLHRoZW46ZnVuY3Rpb24oYSxiLGMpe2kuZG9uZShhKS5mYWlsKGIpLnByb2dyZXNzKGMpO3JldHVybiB0aGlzfSxhbHdheXM6ZnVuY3Rpb24oKXtpLmRvbmUuYXBwbHkoaSxhcmd1bWVudHMpLmZhaWwuYXBwbHkoaSxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxwaXBlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5EZWZlcnJlZChmdW5jdGlvbihkKXtmLmVhY2goe2RvbmU6W2EsInJlc29sdmUiXSxmYWlsOltiLCJyZWplY3QiXSxwcm9ncmVzczpbYywibm90aWZ5Il19LGZ1bmN0aW9uKGEsYil7dmFyIGM9YlswXSxlPWJbMV0sZztmLmlzRnVuY3Rpb24oYyk/aVthXShmdW5jdGlvbigpe2c9Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksZyYmZi5pc0Z1bmN0aW9uKGcucHJvbWlzZSk/Zy5wcm9taXNlKCkudGhlbihkLnJlc29sdmUsZC5yZWplY3QsZC5ub3RpZnkpOmRbZSsiV2l0aCJdKHRoaXM9PT1pP2Q6dGhpcyxbZ10pfSk6aVthXShkW2VdKX0pfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpYT1oO2Vsc2UgZm9yKHZhciBiIGluIGgpYVtiXT1oW2JdO3JldHVybiBhfX0saT1oLnByb21pc2Uoe30pLGo7Zm9yKGogaW4gZylpW2pdPWdbal0uZmlyZSxpW2orIldpdGgiXT1nW2pdLmZpcmVXaXRoO2kuZG9uZShmdW5jdGlvbigpe2U9InJlc29sdmVkIn0sYy5kaXNhYmxlLGQubG9jaykuZmFpbChmdW5jdGlvbigpe2U9InJlamVjdGVkIn0sYi5kaXNhYmxlLGQubG9jayksYSYmYS5jYWxsKGksaSk7cmV0dXJuIGl9LHdoZW46ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbShhKXtyZXR1cm4gZnVuY3Rpb24oYil7ZVthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpiLGoubm90aWZ5V2l0aChrLGUpfX1mdW5jdGlvbiBsKGEpe3JldHVybiBmdW5jdGlvbihjKXtiW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmMsLS1nfHxqLnJlc29sdmVXaXRoKGosYil9fXZhciBiPWkuY2FsbChhcmd1bWVudHMsMCksYz0wLGQ9Yi5sZW5ndGgsZT1BcnJheShkKSxnPWQsaD1kLGo9ZDw9MSYmYSYmZi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YTpmLkRlZmVycmVkKCksaz1qLnByb21pc2UoKTtpZihkPjEpe2Zvcig7YzxkO2MrKyliW2NdJiZiW2NdLnByb21pc2UmJmYuaXNGdW5jdGlvbihiW2NdLnByb21pc2UpP2JbY10ucHJvbWlzZSgpLnRoZW4obChjKSxqLnJlamVjdCxtKGMpKTotLWc7Z3x8ai5yZXNvbHZlV2l0aChqLGIpfWVsc2UgaiE9PWEmJmoucmVzb2x2ZVdpdGgoaixkP1thXTpbXSk7cmV0dXJuIGt9fSksZi5zdXBwb3J0PWZ1bmN0aW9uKCl7dmFyIGIsZCxlLGcsaCxpLGosayxsLG0sbixvLHA9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxxPWMuZG9jdW1lbnRFbGVtZW50O3Auc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IikscC5pbm5lckhUTUw9IiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J3RvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxlPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighZHx8IWQubGVuZ3RofHwhZSlyZXR1cm57fTtnPWMuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksaD1nLmFwcGVuZENoaWxkKGMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGk9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxiPXtsZWFkaW5nV2hpdGVzcGFjZTpwLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDplLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41NS8udGVzdChlLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhZS5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmkudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmguc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOnAuY2xhc3NOYW1lIT09InQiLGVuY3R5cGU6ISFjLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6Yy5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCE9PSI8Om5hdj48LzpuYXY+IixzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITAscGl4ZWxNYXJnaW46ITB9LGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1jLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCIsaS5jaGVja2VkPSEwLGIubm9DbG9uZUNoZWNrZWQ9aS5jbG9uZU5vZGUoITApLmNoZWNrZWQsZy5kaXNhYmxlZD0hMCxiLm9wdERpc2FibGVkPSFoLmRpc2FibGVkO3RyeXtkZWxldGUgcC50ZXN0fWNhdGNoKHIpe2IuZGVsZXRlRXhwYW5kbz0hMX0hcC5hZGRFdmVudExpc3RlbmVyJiZwLmF0dGFjaEV2ZW50JiZwLmZpcmVFdmVudCYmKHAuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7Yi5ub0Nsb25lRXZlbnQ9ITF9KSxwLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikpLGk9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGkudmFsdWU9InQiLGkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxiLnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0IixpLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxpLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxwLmFwcGVuZENoaWxkKGkpLGo9Yy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksai5hcHBlbmRDaGlsZChwLmxhc3RDaGlsZCksYi5jaGVja0Nsb25lPWouY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGIuYXBwZW5kQ2hlY2tlZD1pLmNoZWNrZWQsai5yZW1vdmVDaGlsZChpKSxqLmFwcGVuZENoaWxkKHApO2lmKHAuYXR0YWNoRXZlbnQpZm9yKG4gaW57c3VibWl0OjEsY2hhbmdlOjEsZm9jdXNpbjoxfSltPSJvbiIrbixvPW0gaW4gcCxvfHwocC5zZXRBdHRyaWJ1dGUobSwicmV0dXJuOyIpLG89dHlwZW9mIHBbbV09PSJmdW5jdGlvbiIpLGJbbisiQnViYmxlcyJdPW87ai5yZW1vdmVDaGlsZChwKSxqPWc9aD1wPWk9bnVsbCxmKGZ1bmN0aW9uKCl7dmFyIGQsZSxnLGgsaSxqLGwsbSxuLHEscixzLHQsdT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXV8fChtPTEsdD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjoiLHI9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiLHM9dCsiMDt2aXNpYmlsaXR5OmhpZGRlbjsiLG49InN0eWxlPSciK3IrdCsiNXB4IHNvbGlkICMwMDA7IixxPSI8ZGl2ICIrbisiZGlzcGxheTpibG9jazsnPjxkaXYgc3R5bGU9JyIrdCsiMDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PjwvZGl2PiIrIjx0YWJsZSAiK24rIicgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsZD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD1zKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIrbSsicHgiLHUuaW5zZXJ0QmVmb3JlKGQsdS5maXJzdENoaWxkKSxwPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5hcHBlbmRDaGlsZChwKSxwLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9JyIrdCsiMDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGs9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxvPWtbMF0ub2Zmc2V0SGVpZ2h0PT09MCxrWzBdLnN0eWxlLmRpc3BsYXk9IiIsa1sxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1vJiZrWzBdLm9mZnNldEhlaWdodD09PTAsYS5nZXRDb21wdXRlZFN0eWxlJiYocC5pbm5lckhUTUw9IiIsbD1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuc3R5bGUud2lkdGg9IjAiLGwuc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHAuc3R5bGUud2lkdGg9IjJweCIscC5hcHBlbmRDaGlsZChsKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUobCxudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCksdHlwZW9mIHAuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihwLmlubmVySFRNTD0iIixwLnN0eWxlLndpZHRoPXAuc3R5bGUucGFkZGluZz0iMXB4IixwLnN0eWxlLmJvcmRlcj0wLHAuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIscC5zdHlsZS5kaXNwbGF5PSJpbmxpbmUiLHAuc3R5bGUuem9vbT0xLGIuaW5saW5lQmxvY2tOZWVkc0xheW91dD1wLm9mZnNldFdpZHRoPT09MyxwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixwLnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixwLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NXB4Oyc+PC9kaXY+IixiLnNocmlua1dyYXBCbG9ja3M9cC5vZmZzZXRXaWR0aCE9PTMpLHAuc3R5bGUuY3NzVGV4dD1yK3MscC5pbm5lckhUTUw9cSxlPXAuZmlyc3RDaGlsZCxnPWUuZmlyc3RDaGlsZCxpPWUubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkLGo9e2RvZXNOb3RBZGRCb3JkZXI6Zy5vZmZzZXRUb3AhPT01LGRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzOmkub2Zmc2V0VG9wPT09NX0sZy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGcuc3R5bGUudG9wPSIyMHB4IixqLmZpeGVkUG9zaXRpb249Zy5vZmZzZXRUb3A9PT0yMHx8Zy5vZmZzZXRUb3A9PT0xNSxnLnN0eWxlLnBvc2l0aW9uPWcuc3R5bGUudG9wPSIiLGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGouc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlPWcub2Zmc2V0VG9wPT09LTUsai5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD11Lm9mZnNldFRvcCE9PW0sYS5nZXRDb21wdXRlZFN0eWxlJiYocC5zdHlsZS5tYXJnaW5Ub3A9IjElIixiLnBpeGVsTWFyZ2luPShhLmdldENvbXB1dGVkU3R5bGUocCxudWxsKXx8e21hcmdpblRvcDowfSkubWFyZ2luVG9wIT09IjElIiksdHlwZW9mIGQuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihkLnN0eWxlLnpvb209MSksdS5yZW1vdmVDaGlsZChkKSxsPXA9ZD1udWxsLGYuZXh0ZW5kKGIsaikpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaCxpLGo9dGhpc1swXSxrPTAsbT1udWxsO2lmKGE9PT1iKXtpZih0aGlzLmxlbmd0aCl7bT1mLmRhdGEoaik7aWYoai5ub2RlVHlwZT09PTEmJiFmLl9kYXRhKGosInBhcnNlZEF0dHJzIikpe2c9ai5hdHRyaWJ1dGVzO2ZvcihpPWcubGVuZ3RoO2s8aTtrKyspaD1nW2tdLm5hbWUsaC5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGg9Zi5jYW1lbENhc2UoaC5zdWJzdHJpbmcoNSkpLGwoaixoLG1baF0pKTtmLl9kYXRhKGosInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBtfWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iLDIpLGRbMV09ZFsxXT8iLiIrZFsxXToiIixlPWRbMV0rIiEiO3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGMpe2lmKGM9PT1iKXttPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2UsW2RbMF1dKSxtPT09YiYmaiYmKG09Zi5kYXRhKGosYSksbT1sKGosYSxtKSk7cmV0dXJuIG09PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTptfWRbMV09Yyx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2UsZCksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitlLGQpfSl9LG51bGwsYyxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSksZi5leHRlbmQoe19tYXJrOmZ1bmN0aW9uKGEsYil7YSYmKGI9KGJ8fCJmeCIpKyJtYXJrIixmLl9kYXRhKGEsYiwoZi5fZGF0YShhLGIpfHwwKSsxKSl9LF91bm1hcms6ZnVuY3Rpb24oYSxiLGMpe2EhPT0hMCYmKGM9YixiPWEsYT0hMSk7aWYoYil7Yz1jfHwiZngiO3ZhciBkPWMrIm1hcmsiLGU9YT8wOihmLl9kYXRhKGIsZCl8fDEpLTE7ZT9mLl9kYXRhKGIsZCxlKTooZi5yZW1vdmVEYXRhKGIsZCwhMCksbihiLGMsIm1hcmsiKSl9fSxxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYSl7Yj0oYnx8ImZ4IikrInF1ZXVlIixkPWYuX2RhdGEoYSxiKSxjJiYoIWR8fGYuaXNBcnJheShjKT9kPWYuX2RhdGEoYSxiLGYubWFrZUFycmF5KGMpKTpkLnB1c2goYykpO3JldHVybiBkfHxbXX19LGRlcXVldWU6ZnVuY3Rpb24oYSxiKXtiPWJ8fCJmeCI7dmFyIGM9Zi5xdWV1ZShhLGIpLGQ9Yy5zaGlmdCgpLGU9e307ZD09PSJpbnByb2dyZXNzIiYmKGQ9Yy5zaGlmdCgpKSxkJiYoYj09PSJmeCImJmMudW5zaGlmdCgiaW5wcm9ncmVzcyIpLGYuX2RhdGEoYSxiKyIucnVuIixlKSxkLmNhbGwoYSxmdW5jdGlvbigpe2YuZGVxdWV1ZShhLGIpfSxlKSksYy5sZW5ndGh8fChmLnJlbW92ZURhdGEoYSxiKyJxdWV1ZSAiK2IrIi5ydW4iLCEwKSxuKGEsYiwicXVldWUiKSl9fSksZi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9Mjt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiLGQtLSk7aWYoYXJndW1lbnRzLmxlbmd0aDxkKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIGM9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zi5xdWV1ZSh0aGlzLGEsYyk7YT09PSJmeCImJmJbMF0hPT0iaW5wcm9ncmVzcyImJmYuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1mLmZ4P2YuZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gbSgpey0taHx8ZC5yZXNvbHZlV2l0aChlLFtlXSl9dHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9YiksYT1hfHwiZngiO3ZhciBkPWYuRGVmZXJyZWQoKSxlPXRoaXMsZz1lLmxlbmd0aCxoPTEsaT1hKyJkZWZlciIsaj1hKyJxdWV1ZSIsaz1hKyJtYXJrIixsO3doaWxlKGctLSlpZihsPWYuZGF0YShlW2ddLGksYiwhMCl8fChmLmRhdGEoZVtnXSxqLGIsITApfHxmLmRhdGEoZVtnXSxrLGIsITApKSYmZi5kYXRhKGVbZ10saSxmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwhMCkpaCsrLGwuYWRkKG0pO20oKTtyZXR1cm4gZC5wcm9taXNlKGMpfX0pO3ZhciBvPS9bXG5cdFxyXS9nLHA9L1xzKy8scT0vXHIvZyxyPS9eKD86YnV0dG9ufGlucHV0KSQvaSxzPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLHQ9L15hKD86cmVhKT8kL2ksdT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSx2PWYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsdyx4LHk7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7YT1mLnByb3BGaXhbYV18fGE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPWIsZGVsZXRlIHRoaXNbYV19Y2F0Y2goYyl7fX0pfSxhZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnLGgsaTtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nIil7Yj1hLnNwbGl0KHApO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtlPXRoaXNbY107aWYoZS5ub2RlVHlwZT09PTEpaWYoIWUuY2xhc3NOYW1lJiZiLmxlbmd0aD09PTEpZS5jbGFzc05hbWU9YTtlbHNle2c9IiAiK2UuY2xhc3NOYW1lKyIgIjtmb3IoaD0wLGk9Yi5sZW5ndGg7aDxpO2grKyl+Zy5pbmRleE9mKCIgIitiW2hdKyIgIil8fChnKz1iW2hdKyIgIik7ZS5jbGFzc05hbWU9Zi50cmltKGcpfX19cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnLGgsaSxqO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmcifHxhPT09Yil7Yz0oYXx8IiIpLnNwbGl0KHApO2ZvcihkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKXtnPXRoaXNbZF07aWYoZy5ub2RlVHlwZT09PTEmJmcuY2xhc3NOYW1lKWlmKGEpe2g9KCIgIitnLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpO2ZvcihpPTAsaj1jLmxlbmd0aDtpPGo7aSsrKWg9aC5yZXBsYWNlKCIgIitjW2ldKyIgIiwiICIpO2cuY2xhc3NOYW1lPWYudHJpbShoKX1lbHNlIGcuY2xhc3NOYW1lPSIifX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYSxkPXR5cGVvZiBiPT0iYm9vbGVhbiI7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7Zih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGM9PT0ic3RyaW5nIil7dmFyIGUsZz0wLGg9Zih0aGlzKSxpPWIsaj1hLnNwbGl0KHApO3doaWxlKGU9altnKytdKWk9ZD9pOiFoLmhhc0NsYXNzKGUpLGhbaT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGUpfWVsc2UgaWYoYz09PSJ1bmRlZmluZWQifHxjPT09ImJvb2xlYW4iKXRoaXMuY2xhc3NOYW1lJiZmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PSExPyIiOmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXt2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7Zm9yKDtjPGQ7YysrKWlmKHRoaXNbY10ubm9kZVR5cGU9PT0xJiYoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxnPXRoaXNbMF07e2lmKCEhYXJndW1lbnRzLmxlbmd0aCl7ZT1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZz1mKHRoaXMpLGg7aWYodGhpcy5ub2RlVHlwZT09PTEpe2U/aD1hLmNhbGwodGhpcyxkLGcudmFsKCkpOmg9YSxoPT1udWxsP2g9IiI6dHlwZW9mIGg9PSJudW1iZXIiP2grPSIiOmYuaXNBcnJheShoKSYmKGg9Zi5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjphKyIifSkpLGM9Zi52YWxIb29rc1t0aGlzLnR5cGVdfHxmLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoIWN8fCEoInNldCJpbiBjKXx8Yy5zZXQodGhpcyxoLCJ2YWx1ZSIpPT09Yil0aGlzLnZhbHVlPWh9fSl9aWYoZyl7Yz1mLnZhbEhvb2tzW2cudHlwZV18fGYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZihjJiYiZ2V0ImluIGMmJihkPWMuZ2V0KGcsInZhbHVlIikpIT09YilyZXR1cm4gZDtkPWcudmFsdWU7cmV0dXJuIHR5cGVvZiBkPT0ic3RyaW5nIj9kLnJlcGxhY2UocSwiIik6ZD09bnVsbD8iIjpkfX19fSksZi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZz1hLnNlbGVjdGVkSW5kZXgsaD1bXSxpPWEub3B0aW9ucyxqPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihnPDApcmV0dXJuIG51bGw7Yz1qP2c6MCxkPWo/ZysxOmkubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1pW2NdO2lmKGUuc2VsZWN0ZWQmJihmLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9ZihlKS52YWwoKTtpZihqKXJldHVybiBiO2gucHVzaChiKX19aWYoaiYmIWgubGVuZ3RoJiZpLmxlbmd0aClyZXR1cm4gZihpW2ddKS52YWwoKTtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5tYWtlQXJyYXkoYik7ZihhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1mLmluQXJyYXkoZih0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKTtyZXR1cm4gY319fSxhdHRyRm46e3ZhbDohMCxjc3M6ITAsaHRtbDohMCx0ZXh0OiEwLGRhdGE6ITAsd2lkdGg6ITAsaGVpZ2h0OiEwLG9mZnNldDohMH0sYXR0cjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZyxoLGksaj1hLm5vZGVUeXBlO2lmKCEhYSYmaiE9PTMmJmohPT04JiZqIT09Mil7aWYoZSYmYyBpbiBmLmF0dHJGbilyZXR1cm4gZihhKVtjXShkKTtpZih0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PSJ1bmRlZmluZWQiKXJldHVybiBmLnByb3AoYSxjLGQpO2k9aiE9PTF8fCFmLmlzWE1MRG9jKGEpLGkmJihjPWMudG9Mb3dlckNhc2UoKSxoPWYuYXR0ckhvb2tzW2NdfHwodS50ZXN0KGMpP3g6dykpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7Zi5yZW1vdmVBdHRyKGEsYyk7cmV0dXJufWlmKGgmJiJzZXQiaW4gaCYmaSYmKGc9aC5zZXQoYSxkLGMpKSE9PWIpcmV0dXJuIGc7YS5zZXRBdHRyaWJ1dGUoYywiIitkKTtyZXR1cm4gZH1pZihoJiYiZ2V0ImluIGgmJmkmJihnPWguZ2V0KGEsYykpIT09bnVsbClyZXR1cm4gZztnPWEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBnPT09bnVsbD9iOmd9fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGcsaCxpPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtpPGc7aSsrKWU9ZFtpXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsaD11LnRlc3QoZSksaHx8Zi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLGgmJmMgaW4gYSYmKGFbY109ITEpKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoci50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUpZi5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7ZWxzZSBpZighZi5zdXBwb3J0LnJhZGlvVmFsdWUmJmI9PT0icmFkaW8iJiZmLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpO3JldHVybiBifX19LHZhbHVlOntnZXQ6ZnVuY3Rpb24oYSxiKXtpZih3JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB3LmdldChhLGIpO3JldHVybiBiIGluIGE/YS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuc2V0KGEsYixjKTthLnZhbHVlPWJ9fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaT1hLm5vZGVUeXBlO2lmKCEhYSYmaSE9PTMmJmkhPT04JiZpIT09Mil7aD1pIT09MXx8IWYuaXNYTUxEb2MoYSksaCYmKGM9Zi5wcm9wRml4W2NdfHxjLGc9Zi5wcm9wSG9va3NbY10pO3JldHVybiBkIT09Yj9nJiYic2V0ImluIGcmJihlPWcuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP3BhcnNlSW50KGMudmFsdWUsMTApOnMudGVzdChhLm5vZGVOYW1lKXx8dC50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDpifX19fSksZi5hdHRySG9va3MudGFiaW5kZXg9Zi5wcm9wSG9va3MudGFiSW5kZXgseD17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT1mLnByb3AoYSxjKTtyZXR1cm4gZT09PSEwfHx0eXBlb2YgZSE9ImJvb2xlYW4iJiYoZD1hLmdldEF0dHJpYnV0ZU5vZGUoYykpJiZkLm5vZGVWYWx1ZSE9PSExP2MudG9Mb3dlckNhc2UoKTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2I9PT0hMT9mLnJlbW92ZUF0dHIoYSxjKTooZD1mLnByb3BGaXhbY118fGMsZCBpbiBhJiYoYVtkXT0hMCksYS5zZXRBdHRyaWJ1dGUoYyxjLnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gY319LHZ8fCh5PXtuYW1lOiEwLGlkOiEwLGNvb3JkczohMH0sdz1mLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQ7ZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyk7cmV0dXJuIGQmJih5W2NdP2Qubm9kZVZhbHVlIT09IiI6ZC5zcGVjaWZpZWQpP2Qubm9kZVZhbHVlOmJ9LHNldDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9YS5nZXRBdHRyaWJ1dGVOb2RlKGQpO2V8fChlPWMuY3JlYXRlQXR0cmlidXRlKGQpLGEuc2V0QXR0cmlidXRlTm9kZShlKSk7cmV0dXJuIGUubm9kZVZhbHVlPWIrIiJ9fSxmLmF0dHJIb29rcy50YWJpbmRleC5zZXQ9dy5zZXQsZi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe2YuYXR0ckhvb2tzW2JdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZihjPT09IiIpe2Euc2V0QXR0cmlidXRlKGIsImF1dG8iKTtyZXR1cm4gY319fSl9KSxmLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e2dldDp3LmdldCxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2I9PT0iIiYmKGI9ImZhbHNlIiksdy5zZXQoYSxiLGMpfX0pLGYuc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8Zi5lYWNoKFsiaHJlZiIsInNyYyIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxjKXtmLmF0dHJIb29rc1tjXT1mLmV4dGVuZChmLmF0dHJIb29rc1tjXSx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKGMsMik7cmV0dXJuIGQ9PT1udWxsP2I6ZH19KX0pLGYuc3VwcG9ydC5zdHlsZXx8KGYuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfHxifSxzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0PSIiK2J9fSksZi5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwoZi5wcm9wSG9va3Muc2VsZWN0ZWQ9Zi5leHRlbmQoZi5wcm9wSG9va3Muc2VsZWN0ZWQse2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7YiYmKGIuc2VsZWN0ZWRJbmRleCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KTtyZXR1cm4gbnVsbH19KSksZi5zdXBwb3J0LmVuY3R5cGV8fChmLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSxmLnN1cHBvcnQuY2hlY2tPbnx8Zi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfX19KSxmLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtmLnZhbEhvb2tzW3RoaXNdPWYuZXh0ZW5kKGYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihhLGIpe2lmKGYuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPWYuaW5BcnJheShmKGEpLnZhbCgpLGIpPj0wfX0pfSk7dmFyIHo9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLEE9L14oW15cLl0qKT8oPzpcLiguKykpPyQvLEI9Lyg/Ol58XHMpaG92ZXIoXC5cUyspP1xiLyxDPS9ea2V5LyxEPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxFPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxGPS9eKFx3KikoPzojKFtcd1wtXSspKT8oPzpcLihbXHdcLV0rKSk/JC8sRz1mdW5jdGlvbigKLWEpe3ZhciBiPUYuZXhlYyhhKTtiJiYoYlsxXT0oYlsxXXx8IiIpLnRvTG93ZXJDYXNlKCksYlszXT1iWzNdJiZuZXcgUmVnRXhwKCIoPzpefFxccykiK2JbM10rIig/Olxcc3wkKSIpKTtyZXR1cm4gYn0sSD1mdW5jdGlvbihhLGIpe3ZhciBjPWEuYXR0cmlidXRlc3x8e307cmV0dXJuKCFiWzFdfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iWzFdKSYmKCFiWzJdfHwoYy5pZHx8e30pLnZhbHVlPT09YlsyXSkmJighYlszXXx8YlszXS50ZXN0KChjWyJjbGFzcyJdfHx7fSkudmFsdWUpKX0sST1mdW5jdGlvbihhKXtyZXR1cm4gZi5ldmVudC5zcGVjaWFsLmhvdmVyP2E6YS5yZXBsYWNlKEIsIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07Zi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlcixnPXAuc2VsZWN0b3IpLGQuZ3VpZHx8KGQuZ3VpZD1mLmd1aWQrKyksaj1oLmV2ZW50cyxqfHwoaC5ldmVudHM9aj17fSksaT1oLmhhbmRsZSxpfHwoaC5oYW5kbGU9aT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiYoIWF8fGYuZXZlbnQudHJpZ2dlcmVkIT09YS50eXBlKT9mLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGkuZWxlbSxhcmd1bWVudHMpOmJ9LGkuZWxlbT1hKSxjPWYudHJpbShJKGMpKS5zcGxpdCgiICIpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspe2w9QS5leGVjKGNba10pfHxbXSxtPWxbMV0sbj0obFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxtPShnP3MuZGVsZWdhdGVUeXBlOnMuYmluZFR5cGUpfHxtLHM9Zi5ldmVudC5zcGVjaWFsW21dfHx7fSxvPWYuZXh0ZW5kKHt0eXBlOm0sb3JpZ1R5cGU6bFsxXSxkYXRhOmUsaGFuZGxlcjpkLGd1aWQ6ZC5ndWlkLHNlbGVjdG9yOmcscXVpY2s6ZyYmRyhnKSxuYW1lc3BhY2U6bi5qb2luKCIuIil9LHApLHI9alttXTtpZighcil7cj1qW21dPVtdLHIuZGVsZWdhdGVDb3VudD0wO2lmKCFzLnNldHVwfHxzLnNldHVwLmNhbGwoYSxlLG4saSk9PT0hMSlhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKG0saSwhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib24iK20saSl9cy5hZGQmJihzLmFkZC5jYWxsKGEsbyksby5oYW5kbGVyLmd1aWR8fChvLmhhbmRsZXIuZ3VpZD1kLmd1aWQpKSxnP3Iuc3BsaWNlKHIuZGVsZWdhdGVDb3VudCsrLDAsbyk6ci5wdXNoKG8pLGYuZXZlbnQuZ2xvYmFsW21dPSEwfWE9bnVsbH19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZz1mLmhhc0RhdGEoYSkmJmYuX2RhdGEoYSksaCxpLGosayxsLG0sbixvLHAscSxyLHM7aWYoISFnJiYhIShvPWcuZXZlbnRzKSl7Yj1mLnRyaW0oSShifHwiIikpLnNwbGl0KCIgIik7Zm9yKGg9MDtoPGIubGVuZ3RoO2grKyl7aT1BLmV4ZWMoYltoXSl8fFtdLGo9az1pWzFdLGw9aVsyXTtpZighail7Zm9yKGogaW4gbylmLmV2ZW50LnJlbW92ZShhLGorYltoXSxjLGQsITApO2NvbnRpbnVlfXA9Zi5ldmVudC5zcGVjaWFsW2pdfHx7fSxqPShkP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxqLHI9b1tqXXx8W10sbT1yLmxlbmd0aCxsPWw/bmV3IFJlZ0V4cCgiKF58XFwuKSIrbC5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKTpudWxsO2ZvcihuPTA7bjxyLmxlbmd0aDtuKyspcz1yW25dLChlfHxrPT09cy5vcmlnVHlwZSkmJighY3x8Yy5ndWlkPT09cy5ndWlkKSYmKCFsfHxsLnRlc3Qocy5uYW1lc3BhY2UpKSYmKCFkfHxkPT09cy5zZWxlY3Rvcnx8ZD09PSIqKiImJnMuc2VsZWN0b3IpJiYoci5zcGxpY2Uobi0tLDEpLHMuc2VsZWN0b3ImJnIuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGEscykpO3IubGVuZ3RoPT09MCYmbSE9PXIubGVuZ3RoJiYoKCFwLnRlYXJkb3dufHxwLnRlYXJkb3duLmNhbGwoYSxsKT09PSExKSYmZi5yZW1vdmVFdmVudChhLGosZy5oYW5kbGUpLGRlbGV0ZSBvW2pdKX1mLmlzRW1wdHlPYmplY3QobykmJihxPWcuaGFuZGxlLHEmJihxLmVsZW09bnVsbCksZi5yZW1vdmVEYXRhKGEsWyJldmVudHMiLCJoYW5kbGUiXSwhMCkpfX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsZCxlLGcpe2lmKCFlfHxlLm5vZGVUeXBlIT09MyYmZS5ub2RlVHlwZSE9PTgpe3ZhciBoPWMudHlwZXx8YyxpPVtdLGosayxsLG0sbixvLHAscSxyLHM7aWYoRS50ZXN0KGgrZi5ldmVudC50cmlnZ2VyZWQpKXJldHVybjtoLmluZGV4T2YoIiEiKT49MCYmKGg9aC5zbGljZSgwLC0xKSxrPSEwKSxoLmluZGV4T2YoIi4iKT49MCYmKGk9aC5zcGxpdCgiLiIpLGg9aS5zaGlmdCgpLGkuc29ydCgpKTtpZigoIWV8fGYuZXZlbnQuY3VzdG9tRXZlbnRbaF0pJiYhZi5ldmVudC5nbG9iYWxbaF0pcmV0dXJuO2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbZi5leHBhbmRvXT9jOm5ldyBmLkV2ZW50KGgsYyk6bmV3IGYuRXZlbnQoaCksYy50eXBlPWgsYy5pc1RyaWdnZXI9ITAsYy5leGNsdXNpdmU9ayxjLm5hbWVzcGFjZT1pLmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1jLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGwsbz1oLmluZGV4T2YoIjoiKTwwPyJvbiIraDoiIjtpZighZSl7aj1mLmNhY2hlO2ZvcihsIGluIGopaltsXS5ldmVudHMmJmpbbF0uZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGpbbF0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZSksZD1kIT1udWxsP2YubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxwPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkoZSxkKT09PSExKXJldHVybjtyPVtbZSxwLmJpbmRUeXBlfHxoXV07aWYoIWcmJiFwLm5vQnViYmxlJiYhZi5pc1dpbmRvdyhlKSl7cz1wLmRlbGVnYXRlVHlwZXx8aCxtPUUudGVzdChzK2gpP2U6ZS5wYXJlbnROb2RlLG49bnVsbDtmb3IoO207bT1tLnBhcmVudE5vZGUpci5wdXNoKFttLHNdKSxuPW07biYmbj09PWUub3duZXJEb2N1bWVudCYmci5wdXNoKFtuLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvd3x8YSxzXSl9Zm9yKGw9MDtsPHIubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2wrKyltPXJbbF1bMF0sYy50eXBlPXJbbF1bMV0scT0oZi5fZGF0YShtLCJldmVudHMiKXx8e30pW2MudHlwZV0mJmYuX2RhdGEobSwiaGFuZGxlIikscSYmcS5hcHBseShtLGQpLHE9byYmbVtvXSxxJiZmLmFjY2VwdERhdGEobSkmJnEuYXBwbHkobSxkKT09PSExJiZjLnByZXZlbnREZWZhdWx0KCk7Yy50eXBlPWgsIWcmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYoIXAuX2RlZmF1bHR8fHAuX2RlZmF1bHQuYXBwbHkoZS5vd25lckRvY3VtZW50LGQpPT09ITEpJiYoaCE9PSJjbGljayJ8fCFmLm5vZGVOYW1lKGUsImEiKSkmJmYuYWNjZXB0RGF0YShlKSYmbyYmZVtoXSYmKGghPT0iZm9jdXMiJiZoIT09ImJsdXIifHxjLnRhcmdldC5vZmZzZXRXaWR0aCE9PTApJiYhZi5pc1dpbmRvdyhlKSYmKG49ZVtvXSxuJiYoZVtvXT1udWxsKSxmLmV2ZW50LnRyaWdnZXJlZD1oLGVbaF0oKSxmLmV2ZW50LnRyaWdnZXJlZD1iLG4mJihlW29dPW4pKTtyZXR1cm4gYy5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihjKXtjPWYuZXZlbnQuZml4KGN8fGEuZXZlbnQpO3ZhciBkPShmLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYy50eXBlXXx8W10sZT1kLmRlbGVnYXRlQ291bnQsZz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxoPSFjLmV4Y2x1c2l2ZSYmIWMubmFtZXNwYWNlLGk9Zi5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9LGo9W10sayxsLG0sbixvLHAscSxyLHMsdCx1O2dbMF09YyxjLmRlbGVnYXRlVGFyZ2V0PXRoaXM7aWYoIWkucHJlRGlzcGF0Y2h8fGkucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGMpIT09ITEpe2lmKGUmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXtuPWYodGhpcyksbi5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobT1jLnRhcmdldDttIT10aGlzO209bS5wYXJlbnROb2RlfHx0aGlzKWlmKG0uZGlzYWJsZWQhPT0hMCl7cD17fSxyPVtdLG5bMF09bTtmb3Ioaz0wO2s8ZTtrKyspcz1kW2tdLHQ9cy5zZWxlY3RvcixwW3RdPT09YiYmKHBbdF09cy5xdWljaz9IKG0scy5xdWljayk6bi5pcyh0KSkscFt0XSYmci5wdXNoKHMpO3IubGVuZ3RoJiZqLnB1c2goe2VsZW06bSxtYXRjaGVzOnJ9KX19ZC5sZW5ndGg+ZSYmai5wdXNoKHtlbGVtOnRoaXMsbWF0Y2hlczpkLnNsaWNlKGUpfSk7Zm9yKGs9MDtrPGoubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2srKyl7cT1qW2tdLGMuY3VycmVudFRhcmdldD1xLmVsZW07Zm9yKGw9MDtsPHEubWF0Y2hlcy5sZW5ndGgmJiFjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKXtzPXEubWF0Y2hlc1tsXTtpZihofHwhYy5uYW1lc3BhY2UmJiFzLm5hbWVzcGFjZXx8Yy5uYW1lc3BhY2VfcmUmJmMubmFtZXNwYWNlX3JlLnRlc3Qocy5uYW1lc3BhY2UpKWMuZGF0YT1zLmRhdGEsYy5oYW5kbGVPYmo9cyxvPSgoZi5ldmVudC5zcGVjaWFsW3Mub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxzLmhhbmRsZXIpLmFwcGx5KHEuZWxlbSxnKSxvIT09YiYmKGMucmVzdWx0PW8sbz09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKX19aS5wb3N0RGlzcGF0Y2gmJmkucG9zdERpc3BhdGNoLmNhbGwodGhpcyxjKTtyZXR1cm4gYy5yZXN1bHR9fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7YS53aGljaD09bnVsbCYmKGEud2hpY2g9Yi5jaGFyQ29kZSE9bnVsbD9iLmNoYXJDb2RlOmIua2V5Q29kZSk7cmV0dXJuIGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGQpe3ZhciBlLGYsZyxoPWQuYnV0dG9uLGk9ZC5mcm9tRWxlbWVudDthLnBhZ2VYPT1udWxsJiZkLmNsaWVudFghPW51bGwmJihlPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGMsZj1lLmRvY3VtZW50RWxlbWVudCxnPWUuYm9keSxhLnBhZ2VYPWQuY2xpZW50WCsoZiYmZi5zY3JvbGxMZWZ0fHxnJiZnLnNjcm9sbExlZnR8fDApLShmJiZmLmNsaWVudExlZnR8fGcmJmcuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1kLmNsaWVudFkrKGYmJmYuc2Nyb2xsVG9wfHxnJiZnLnNjcm9sbFRvcHx8MCktKGYmJmYuY2xpZW50VG9wfHxnJiZnLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmkmJihhLnJlbGF0ZWRUYXJnZXQ9aT09PWEudGFyZ2V0P2QudG9FbGVtZW50OmkpLCFhLndoaWNoJiZoIT09YiYmKGEud2hpY2g9aCYxPzE6aCYyPzM6aCY0PzI6MCk7cmV0dXJuIGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtmLmV4cGFuZG9dKXJldHVybiBhO3ZhciBkLGUsZz1hLGg9Zi5ldmVudC5maXhIb29rc1thLnR5cGVdfHx7fSxpPWgucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoaC5wcm9wcyk6dGhpcy5wcm9wczthPWYuRXZlbnQoZyk7Zm9yKGQ9aS5sZW5ndGg7ZDspZT1pWy0tZF0sYVtlXT1nW2VdO2EudGFyZ2V0fHwoYS50YXJnZXQ9Zy5zcmNFbGVtZW50fHxjKSxhLnRhcmdldC5ub2RlVHlwZT09PTMmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9PT1iJiYoYS5tZXRhS2V5PWEuY3RybEtleSk7cmV0dXJuIGguZmlsdGVyP2guZmlsdGVyKGEsZyk6YX0sc3BlY2lhbDp7cmVhZHk6e3NldHVwOmYuYmluZFJlYWR5fSxsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e2RlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e2RlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxiZWZvcmV1bmxvYWQ6e3NldHVwOmZ1bmN0aW9uKGEsYixjKXtmLmlzV2luZG93KHRoaXMpJiYodGhpcy5vbmJlZm9yZXVubG9hZD1jKX0sdGVhcmRvd246ZnVuY3Rpb24oYSxiKXt0aGlzLm9uYmVmb3JldW5sb2FkPT09YiYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Zi5leHRlbmQobmV3IGYuRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP2YuZXZlbnQudHJpZ2dlcihlLG51bGwsYik6Zi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sZi5ldmVudC5oYW5kbGU9Zi5ldmVudC5kaXNwYXRjaCxmLnJlbW92ZUV2ZW50PWMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX06ZnVuY3Rpb24oYSxiLGMpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsYil7aWYoISh0aGlzIGluc3RhbmNlb2YgZi5FdmVudCkpcmV0dXJuIG5ldyBmLkV2ZW50KGEsYik7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCk/SzpKKTp0aGlzLnR5cGU9YSxiJiZmLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxmLm5vdygpLHRoaXNbZi5leHBhbmRvXT0hMH0sZi5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Szt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1LLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpKLGlzUHJvcGFnYXRpb25TdG9wcGVkOkosaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6Sn0sZi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oYSxiKXtmLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZD1hLnJlbGF0ZWRUYXJnZXQsZT1hLmhhbmRsZU9iaixnPWUuc2VsZWN0b3IsaDtpZighZHx8ZCE9PWMmJiFmLmNvbnRhaW5zKGMsZCkpYS50eXBlPWUub3JpZ1R5cGUsaD1lLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iO3JldHVybiBofX19KSxmLnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KGYuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7aWYoZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7Zi5ldmVudC5hZGQodGhpcywiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihhKXt2YXIgYz1hLnRhcmdldCxkPWYubm9kZU5hbWUoYywiaW5wdXQiKXx8Zi5ub2RlTmFtZShjLCJidXR0b24iKT9jLmZvcm06YjtkJiYhZC5fc3VibWl0X2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoZCwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxkLl9zdWJtaXRfYXR0YWNoZWQ9ITApfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihhKXthLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGEuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX3N1Ym1pdCIpfX0pLGYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtpZih6LnRlc3QodGhpcy5ub2RlTmFtZSkpe2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpZi5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7YS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZT09PSJjaGVja2VkIiYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSxmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSxmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCkpfSk7cmV0dXJuITF9Zi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7ei50ZXN0KGIubm9kZU5hbWUpJiYhYi5fY2hhbmdlX2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoYiwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmIWEuaXNTaW11bGF0ZWQmJiFhLmlzVHJpZ2dlciYmZi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxiLl9jaGFuZ2VfYXR0YWNoZWQ9ITApfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtpZih0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fGIudHlwZSE9PSJyYWRpbyImJmIudHlwZSE9PSJjaGVja2JveCIpcmV0dXJuIGEuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIik7cmV0dXJuIHoudGVzdCh0aGlzLm5vZGVOYW1lKX19KSxmLnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fGYuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9ZnVuY3Rpb24oYSl7Zi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LGYuZXZlbnQuZml4KGEpLCEwKX07Zi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2QrKz09PTAmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLGUsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tZD09PTAmJmMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGUsITApfX19KSxmLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxjLGQsZSxnKXt2YXIgaCxpO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7dHlwZW9mIGMhPSJzdHJpbmciJiYoZD1kfHxjLGM9Yik7Zm9yKGkgaW4gYSl0aGlzLm9uKGksYyxkLGFbaV0sZyk7cmV0dXJuIHRoaXN9ZD09bnVsbCYmZT09bnVsbD8oZT1jLGQ9Yz1iKTplPT1udWxsJiYodHlwZW9mIGM9PSJzdHJpbmciPyhlPWQsZD1iKTooZT1kLGQ9YyxjPWIpKTtpZihlPT09ITEpZT1KO2Vsc2UgaWYoIWUpcmV0dXJuIHRoaXM7Zz09PTEmJihoPWUsZT1mdW5jdGlvbihhKXtmKCkub2ZmKGEpO3JldHVybiBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWguZ3VpZHx8KGguZ3VpZD1mLmd1aWQrKykpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LmFkZCh0aGlzLGEsZSxkLGMpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLm9yaWdUeXBlKyIuIitlLm5hbWVzcGFjZTplLm9yaWdUeXBlLGUuc2VsZWN0b3IsZS5oYW5kbGVyKTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09Im9iamVjdCIpe2Zvcih2YXIgZyBpbiBhKXRoaXMub2ZmKGcsYyxhW2ddKTtyZXR1cm4gdGhpc31pZihjPT09ITF8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWQ9YyxjPWI7ZD09PSExJiYoZD1KKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLGQsYyl9KX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGxpdmU6ZnVuY3Rpb24oYSxiLGMpe2YodGhpcy5jb250ZXh0KS5vbihhLHRoaXMuc2VsZWN0b3IsYixjKTtyZXR1cm4gdGhpc30sZGllOmZ1bmN0aW9uKGEsYil7Zih0aGlzLmNvbnRleHQpLm9mZihhLHRoaXMuc2VsZWN0b3J8fCIqKiIsYik7cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09MT90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYSxjKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gZi5ldmVudC50cmlnZ2VyKGEsYix0aGlzWzBdLCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWEuZ3VpZHx8Zi5ndWlkKyssZD0wLGU9ZnVuY3Rpb24oYyl7dmFyIGU9KGYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpLGMucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLGYuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSxjKXtjPT1udWxsJiYoYz1hLGE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX0sZi5hdHRyRm4mJihmLmF0dHJGbltiXT0hMCksQy50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50LmtleUhvb2tzKSxELnRlc3QoYikmJihmLmV2ZW50LmZpeEhvb2tzW2JdPWYuZXZlbnQubW91c2VIb29rcyl9KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHgoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9aWYoai5ub2RlVHlwZT09PTEpe2d8fChqW2RdPWMsai5zaXpzZXQ9aCk7aWYodHlwZW9mIGIhPSJzdHJpbmciKXtpZihqPT09Yil7az0hMDticmVha319ZWxzZSBpZihtLmZpbHRlcihiLFtqXSkubGVuZ3RoPjApe2s9ajticmVha319aj1qW2FdfWVbaF09a319fWZ1bmN0aW9uIHcoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9ai5ub2RlVHlwZT09PTEmJiFnJiYoaltkXT1jLGouc2l6c2V0PWgpO2lmKGoubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIpe2s9ajticmVha31qPWpbYV19ZVtoXT1rfX19dmFyIGE9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkPSJzaXpjYWNoZSIrKE1hdGgucmFuZG9tKCkrIiIpLnJlcGxhY2UoIi4iLCIiKSxlPTAsZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGg9ITEsaT0hMCxqPS9cXC9nLGs9L1xyXG4vZyxsPS9cVy87WzAsMF0uc29ydChmdW5jdGlvbigpe2k9ITE7cmV0dXJuIDB9KTt2YXIgbT1mdW5jdGlvbihiLGQsZSxmKXtlPWV8fFtdLGQ9ZHx8Yzt2YXIgaD1kO2lmKGQubm9kZVR5cGUhPT0xJiZkLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighYnx8dHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBlO3ZhciBpLGosayxsLG4scSxyLHQsdT0hMCx2PW0uaXNYTUwoZCksdz1bXSx4PWI7ZG97YS5leGVjKCIiKSxpPWEuZXhlYyh4KTtpZihpKXt4PWlbM10sdy5wdXNoKGlbMV0pO2lmKGlbMl0pe2w9aVszXTticmVha319fXdoaWxlKGkpO2lmKHcubGVuZ3RoPjEmJnAuZXhlYyhiKSlpZih3Lmxlbmd0aD09PTImJm8ucmVsYXRpdmVbd1swXV0paj15KHdbMF0rd1sxXSxkLGYpO2Vsc2V7aj1vLnJlbGF0aXZlW3dbMF1dP1tkXTptKHcuc2hpZnQoKSxkKTt3aGlsZSh3Lmxlbmd0aCliPXcuc2hpZnQoKSxvLnJlbGF0aXZlW2JdJiYoYis9dy5zaGlmdCgpKSxqPXkoYixqLGYpfWVsc2V7IWYmJncubGVuZ3RoPjEmJmQubm9kZVR5cGU9PT05JiYhdiYmby5tYXRjaC5JRC50ZXN0KHdbMF0pJiYhby5tYXRjaC5JRC50ZXN0KHdbdy5sZW5ndGgtMV0pJiYobj1tLmZpbmQody5zaGlmdCgpLGQsdiksZD1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KVswXTpuLnNldFswXSk7aWYoZCl7bj1mP3tleHByOncucG9wKCksc2V0OnMoZil9Om0uZmluZCh3LnBvcCgpLHcubGVuZ3RoPT09MSYmKHdbMF09PT0ifiJ8fHdbMF09PT0iKyIpJiZkLnBhcmVudE5vZGU/ZC5wYXJlbnROb2RlOmQsdiksaj1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KTpuLnNldCx3Lmxlbmd0aD4wP2s9cyhqKTp1PSExO3doaWxlKHcubGVuZ3RoKXE9dy5wb3AoKSxyPXEsby5yZWxhdGl2ZVtxXT9yPXcucG9wKCk6cT0iIixyPT1udWxsJiYocj1kKSxvLnJlbGF0aXZlW3FdKGsscix2KX1lbHNlIGs9dz1bXX1rfHwoaz1qKSxrfHxtLmVycm9yKHF8fGIpO2lmKGcuY2FsbChrKT09PSJbb2JqZWN0IEFycmF5XSIpaWYoIXUpZS5wdXNoLmFwcGx5KGUsayk7ZWxzZSBpZihkJiZkLm5vZGVUeXBlPT09MSlmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJihrW3RdPT09ITB8fGtbdF0ubm9kZVR5cGU9PT0xJiZtLmNvbnRhaW5zKGQsa1t0XSkpJiZlLnB1c2goalt0XSk7ZWxzZSBmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJmtbdF0ubm9kZVR5cGU9PT0xJiZlLnB1c2goalt0XSk7ZWxzZSBzKGssZSk7bCYmKG0obCxoLGUsZiksbS51bmlxdWVTb3J0KGUpKTtyZXR1cm4gZX07bS51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe2lmKHUpe2g9aSxhLnNvcnQodSk7aWYoaClmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sMSl9cmV0dXJuIGF9LG0ubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBtKGEsbnVsbCxudWxsLGIpfSxtLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe3JldHVybiBtKGIsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9LG0uZmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpO2lmKCFhKXJldHVybltdO2ZvcihlPTAsZj1vLm9yZGVyLmxlbmd0aDtlPGY7ZSsrKXtoPW8ub3JkZXJbZV07aWYoZz1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKXtpPWdbMV0sZy5zcGxpY2UoMSwxKTtpZihpLnN1YnN0cihpLmxlbmd0aC0xKSE9PSJcXCIpe2dbMV09KGdbMV18fCIiKS5yZXBsYWNlKGosIiIpLGQ9by5maW5kW2hdKGcsYixjKTtpZihkIT1udWxsKXthPWEucmVwbGFjZShvLm1hdGNoW2hdLCIiKTticmVha319fX1kfHwoZD10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOltdKTtyZXR1cm57c2V0OmQsZXhwcjphfX0sbS5maWx0ZXI9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixwLHE9YSxyPVtdLHM9Yyx0PWMmJmNbMF0mJm0uaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2ZvcihoIGluIG8uZmlsdGVyKWlmKChmPW8ubGVmdE1hdGNoW2hdLmV4ZWMoYSkpIT1udWxsJiZmWzJdKXtrPW8uZmlsdGVyW2hdLGw9ZlsxXSxnPSExLGYuc3BsaWNlKDEsMSk7aWYobC5zdWJzdHIobC5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO3M9PT1yJiYocj1bXSk7aWYoby5wcmVGaWx0ZXJbaF0pe2Y9by5wcmVGaWx0ZXJbaF0oZixzLGQscixlLHQpO2lmKCFmKWc9aT0hMDtlbHNlIGlmKGY9PT0hMCljb250aW51ZX1pZihmKWZvcihuPTA7KGo9c1tuXSkhPW51bGw7bisrKWomJihpPWsoaixmLG4scykscD1lXmksZCYmaSE9bnVsbD9wP2c9ITA6c1tuXT0hMTpwJiYoci5wdXNoKGopLGc9ITApKTtpZihpIT09Yil7ZHx8KHM9ciksYT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7aWYoIWcpcmV0dXJuW107YnJlYWt9fWlmKGE9PT1xKWlmKGc9PW51bGwpbS5lcnJvcihhKTtlbHNlIGJyZWFrO3E9YX1yZXR1cm4gc30sbS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9O3ZhciBuPW0uZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjLGQ9YS5ub2RlVHlwZSxlPSIiO2lmKGQpe2lmKGQ9PT0xfHxkPT09OXx8ZD09PTExKXtpZih0eXBlb2YgYS50ZXh0Q29udGVudD09InN0cmluZyIpcmV0dXJuIGEudGV4dENvbnRlbnQ7aWYodHlwZW9mIGEuaW5uZXJUZXh0PT0ic3RyaW5nIilyZXR1cm4gYS5pbm5lclRleHQucmVwbGFjZShrLCIiKTtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZSs9bihhKX1lbHNlIGlmKGQ9PT0zfHxkPT09NClyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSBmb3IoYj0wO2M9YVtiXTtiKyspYy5ub2RlVHlwZSE9PTgmJihlKz1uKGMpKTtyZXR1cm4gZX0sbz1tLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKFxzKihldmVufG9kZHwoPzpbK1wtXT9cZCt8KD86WytcLV0/XGQqKT9uXHMqKD86WytcLV1ccypcZCspPykpXHMqXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIixkPWMmJiFsLnRlc3QoYiksZT1jJiYhZDtkJiYoYj1iLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGgsaDtmPGc7ZisrKWlmKGg9YVtmXSl7d2hpbGUoKGg9aC5wcmV2aW91c1NpYmxpbmcpJiZoLm5vZGVUeXBlIT09MSk7YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJm0uZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PSJzdHJpbmciLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpe2I9Yi50b0xvd2VyQ2FzZSgpO2Zvcig7ZTxmO2UrKyl7Yz1hW2VdO2lmKGMpe3ZhciBnPWMucGFyZW50Tm9kZTthW2VdPWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/ZzohMX19fWVsc2V7Zm9yKDtlPGY7ZSsrKWM9YVtlXSxjJiYoYVtlXT1kP2MucGFyZW50Tm9kZTpjLnBhcmVudE5vZGU9PT1iKTtkJiZtLmZpbHRlcihiLGEsITApfX0sIiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwYXJlbnROb2RlIixiLGYsYSxkLGMpfSwifiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGQsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19LE5BTUU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSE9InVuZGVmaW5lZCIpe3ZhciBjPVtdLGQ9Yi5nZXRFbGVtZW50c0J5TmFtZShhWzFdKTtmb3IodmFyIGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspZFtlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWFbMV0mJmMucHVzaChkW2VdKTtyZXR1cm4gYy5sZW5ndGg9PT0wP251bGw6Y319LFRBRzpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShqLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxtLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmbS5lcnJvcihhWzBdKTthWzBdPWUrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaiwiIik7IWYmJm8uYXR0ck1hcFtnXSYmKGFbMV09by5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShqLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPW0oYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1tLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoYlswXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFtKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInRleHQiPT09YyYmKGI9PT1jfHxiPT09bnVsbCl9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicmFkaW8iPT09YS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInBhc3N3b3JkIj09PWEudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJzdWJtaXQiPT09YS50eXBlfSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiJidXR0b24iPT09YS50eXBlfHxiPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0wfSxsYXN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiPT09ZC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MX0sbHQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPGNbM10tMH0sZ3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPmNbM10tMH0sbnRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn0sZXE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsxXSxmPW8uZmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpO2lmKGU9PT0iY29udGFpbnMiKXJldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bihbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfW0uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz1iWzFdLGw9YTtzd2l0Y2goayl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShsPWwucHJldmlvdXNTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGs9PT0iZmlyc3QiKXJldHVybiEwO2w9YTtjYXNlImxhc3QiOndoaWxlKGw9bC5uZXh0U2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMDtjYXNlIm50aCI6Yz1iWzJdLGU9YlszXTtpZihjPT09MSYmZT09PTApcmV0dXJuITA7Zj1iWzBdLGc9YS5wYXJlbnROb2RlO2lmKGcmJihnW2RdIT09Znx8IWEubm9kZUluZGV4KSl7aT0wO2ZvcihsPWcuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZylsLm5vZGVUeXBlPT09MSYmKGwubm9kZUluZGV4PSsraSk7Z1tkXT1mfWo9YS5ub2RlSW5kZXgtZTtyZXR1cm4gYz09PTA/aj09PTA6aiVjPT09MCYmai9jPj0wfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0iKiImJmEubm9kZVR5cGU9PT0xfHwhIWEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bS5hdHRyP20uYXR0cihhLGMpOm8uYXR0ckhhbmRsZVtjXT9vLmF0dHJIYW5kbGVbY10oYSk6YVtjXSE9bnVsbD9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpLGU9ZCsiIixmPWJbMl0sZz1iWzRdO3JldHVybiBkPT1udWxsP2Y9PT0iIT0iOiFmJiZtLmF0dHI/ZCE9bnVsbDpmPT09Ij0iP2U9PT1nOmY9PT0iKj0iP2UuaW5kZXhPZihnKT49MDpmPT09In49Ij8oIiAiK2UrIiAiKS5pbmRleE9mKGcpPj0wOmc/Zj09PSIhPSI/ZSE9PWc6Zj09PSJePSI/ZS5pbmRleE9mKGcpPT09MDpmPT09IiQ9Ij9lLnN1YnN0cihlLmxlbmd0aC1nLmxlbmd0aCk9PT1nOmY9PT0ifD0iP2U9PT1nfHxlLnN1YnN0cigwLGcubGVuZ3RoKzEpPT09ZysiLSI6ITE6ZSYmZCE9PSExfSxQT1M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsyXSxmPW8uc2V0RmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpfX19LHA9by5tYXRjaC5QT1MscT1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX07Zm9yKHZhciByIGluIG8ubWF0Y2gpby5tYXRjaFtyXT1uZXcgUmVnRXhwKG8ubWF0Y2hbcl0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSksby5sZWZ0TWF0Y2hbcl09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbcl0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxxKSk7by5tYXRjaC5nbG9iYWxQT1M9cDt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLmdsb2JhbFBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIilbXFxzLz5dIiwiaSIpLGJkPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGJlPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksYmY9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sYmc9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYmg9VShjKTtiZy5vcHRncm91cD1iZy5vcHRpb24sYmcudGJvZHk9YmcudGZvb3Q9YmcuY29sZ3JvdXA9YmcuY2FwdGlvbj1iZy50aGVhZCxiZy50aD1iZy50ZCxmLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KGJnLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdKSxmLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWI/Zi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9ZgotLmNsZWFuKGFyZ3VtZW50cyk7YS5wdXNoLmFwcGx5KGEsdGhpcy50b0FycmF5KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhhLCJiZWZvcmUiLGFyZ3VtZW50cyl9fSxhZnRlcjpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9dGhpcy5wdXNoU3RhY2sodGhpcywiYWZ0ZXIiLGFyZ3VtZW50cyk7YS5wdXNoLmFwcGx5KGEsZi5jbGVhbihhcmd1bWVudHMpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ7KGQ9dGhpc1tjXSkhPW51bGw7YysrKWlmKCFhfHxmLmZpbHRlcihhLFtkXSkubGVuZ3RoKSFiJiZkLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksZi5jbGVhbkRhdGEoW2RdKSksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhKXt2YXIgYz10aGlzWzBdfHx7fSxkPTAsZT10aGlzLmxlbmd0aDtpZihhPT09YilyZXR1cm4gYy5ub2RlVHlwZT09PTE/Yy5pbm5lckhUTUwucmVwbGFjZShXLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJhLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCFYLnRlc3QoYSkpJiYhYmdbKFouZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKFksIjwkMT48LyQyPiIpO3RyeXtmb3IoO2Q8ZTtkKyspYz10aGlzW2RdfHx7fSxjLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksYy5pbm5lckhUTUw9YSk7Yz0wfWNhdGNoKGcpe319YyYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihhKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyksZD1jLmh0bWwoKTtjLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZCkpfSk7dHlwZW9mIGEhPSJzdHJpbmciJiYoYT1mKGEpLmRldGFjaCgpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxjPXRoaXMucGFyZW50Tm9kZTtmKHRoaXMpLnJlbW92ZSgpLGI/ZihiKS5iZWZvcmUoYSk6ZihjKS5hcHBlbmQoYSl9KX1yZXR1cm4gdGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2soZihmLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSk6dGhpc30sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpLGo9YVswXSxrPVtdO2lmKCFmLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBqPT0ic3RyaW5nIiYmYmQudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS5kb21NYW5pcChhLGMsZCwhMCl9KTtpZihmLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZz1mKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZSxjP2cuaHRtbCgpOmIpLGcuZG9tTWFuaXAoYSxjLGQpfSk7aWYodGhpc1swXSl7aT1qJiZqLnBhcmVudE5vZGUsZi5zdXBwb3J0LnBhcmVudE5vZGUmJmkmJmkubm9kZVR5cGU9PT0xMSYmaS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP2U9e2ZyYWdtZW50Oml9OmU9Zi5idWlsZEZyYWdtZW50KGEsdGhpcyxrKSxoPWUuZnJhZ21lbnQsaC5jaGlsZE5vZGVzLmxlbmd0aD09PTE/Zz1oPWguZmlyc3RDaGlsZDpnPWguZmlyc3RDaGlsZDtpZihnKXtjPWMmJmYubm9kZU5hbWUoZywidHIiKTtmb3IodmFyIGw9MCxtPXRoaXMubGVuZ3RoLG49bS0xO2w8bTtsKyspZC5jYWxsKGM/YmkodGhpc1tsXSxnKTp0aGlzW2xdLGUuY2FjaGVhYmxlfHxtPjEmJmw8bj9mLmNsb25lKGgsITAsITApOmgpfWsubGVuZ3RoJiZmLmVhY2goayxmdW5jdGlvbihhLGIpe2Iuc3JjP2YuYWpheCh7dHlwZToiR0VUIixnbG9iYWw6ITEsdXJsOmIuc3JjLGFzeW5jOiExLGRhdGFUeXBlOiJzY3JpcHQifSk6Zi5nbG9iYWxFdmFsKChiLnRleHR8fGIudGV4dENvbnRlbnR8fGIuaW5uZXJIVE1MfHwiIikucmVwbGFjZShiZiwiLyokMCovIikpLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpfSl9cmV0dXJuIHRoaXN9fSksZi5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxnLGgsaSxqPWFbMF07YiYmYlswXSYmKGk9YlswXS5vd25lckRvY3VtZW50fHxiWzBdKSxpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnR8fChpPWMpLGEubGVuZ3RoPT09MSYmdHlwZW9mIGo9PSJzdHJpbmciJiZqLmxlbmd0aDw1MTImJmk9PT1jJiZqLmNoYXJBdCgwKT09PSI8IiYmIWJiLnRlc3QoaikmJihmLnN1cHBvcnQuY2hlY2tDbG9uZXx8IWJkLnRlc3QoaikpJiYoZi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KGopKSYmKGc9ITAsaD1mLmZyYWdtZW50c1tqXSxoJiZoIT09MSYmKGU9aCkpLGV8fChlPWkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGYuY2xlYW4oYSxpLGUsZCkpLGcmJihmLmZyYWdtZW50c1tqXT1oP2U6MSk7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmd9fSxmLmZyYWdtZW50cz17fSxmLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYyl7dmFyIGQ9W10sZT1mKGMpLGc9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoZyYmZy5ub2RlVHlwZT09PTExJiZnLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmZS5sZW5ndGg9PT0xKXtlW2JdKHRoaXNbMF0pO3JldHVybiB0aGlzfWZvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9KGg+MD90aGlzLmNsb25lKCEwKTp0aGlzKS5nZXQoKTtmKGVbaF0pW2JdKGopLGQ9ZC5jb25jYXQoail9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQsYSxlLnNlbGVjdG9yKX19KSxmLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZyxoPWYuc3VwcG9ydC5odG1sNUNsb25lfHxmLmlzWE1MRG9jKGEpfHwhYmMudGVzdCgiPCIrYS5ub2RlTmFtZSsiPiIpP2EuY2xvbmVOb2RlKCEwKTpibyhhKTtpZigoIWYuc3VwcG9ydC5ub0Nsb25lRXZlbnR8fCFmLnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpJiYoYS5ub2RlVHlwZT09PTF8fGEubm9kZVR5cGU9PT0xMSkmJiFmLmlzWE1MRG9jKGEpKXtiayhhLGgpLGQ9YmwoYSksZT1ibChoKTtmb3IoZz0wO2RbZ107KytnKWVbZ10mJmJrKGRbZ10sZVtnXSl9aWYoYil7YmooYSxoKTtpZihjKXtkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyliaihkW2ddLGVbZ10pfX1kPWU9bnVsbDtyZXR1cm4gaH0sY2xlYW46ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGcsaCxpLGo9W107Yj1ifHxjLHR5cGVvZiBiLmNyZWF0ZUVsZW1lbnQ9PSJ1bmRlZmluZWQiJiYoYj1iLm93bmVyRG9jdW1lbnR8fGJbMF0mJmJbMF0ub3duZXJEb2N1bWVudHx8Yyk7Zm9yKHZhciBrPTAsbDsobD1hW2tdKSE9bnVsbDtrKyspe3R5cGVvZiBsPT0ibnVtYmVyIiYmKGwrPSIiKTtpZighbCljb250aW51ZTtpZih0eXBlb2YgbD09InN0cmluZyIpaWYoIV8udGVzdChsKSlsPWIuY3JlYXRlVGV4dE5vZGUobCk7ZWxzZXtsPWwucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt2YXIgbT0oWi5leGVjKGwpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG49YmdbbV18fGJnLl9kZWZhdWx0LG89blswXSxwPWIuY3JlYXRlRWxlbWVudCgiZGl2IikscT1iaC5jaGlsZE5vZGVzLHI7Yj09PWM/YmguYXBwZW5kQ2hpbGQocCk6VShiKS5hcHBlbmRDaGlsZChwKSxwLmlubmVySFRNTD1uWzFdK2wrblsyXTt3aGlsZShvLS0pcD1wLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcz0kLnRlc3QobCksdD1tPT09InRhYmxlIiYmIXM/cC5maXJzdENoaWxkJiZwLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpuWzFdPT09Ijx0YWJsZT4iJiYhcz9wLmNoaWxkTm9kZXM6W107Zm9yKGk9dC5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHRbaV0sInRib2R5IikmJiF0W2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZ0W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodFtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWC50ZXN0KGwpJiZwLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFguZXhlYyhsKVswXSkscC5maXJzdENoaWxkKSxsPXAuY2hpbGROb2RlcyxwJiYocC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHApLHEubGVuZ3RoPjAmJihyPXFbcS5sZW5ndGgtMV0sciYmci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpKX12YXIgdTtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYobFswXSYmdHlwZW9mICh1PWwubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHU7aSsrKWJuKGxbaV0pO2Vsc2UgYm4obCk7bC5ub2RlVHlwZT9qLnB1c2gobCk6aj1mLm1lcmdlKGosbCl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZS50ZXN0KGEudHlwZSl9O2ZvcihrPTA7altrXTtrKyspe2g9altrXTtpZihlJiZmLm5vZGVOYW1lKGgsInNjcmlwdCIpJiYoIWgudHlwZXx8YmUudGVzdChoLnR5cGUpKSllLnB1c2goaC5wYXJlbnROb2RlP2gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoKTpoKTtlbHNle2lmKGgubm9kZVR5cGU9PT0xKXt2YXIgdj1mLmdyZXAoaC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IiksZyk7ai5zcGxpY2UuYXBwbHkoaixbaysxLDBdLmNvbmNhdCh2KSl9ZC5hcHBlbmRDaGlsZChoKX19fXJldHVybiBqfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWYuY2FjaGUsZT1mLmV2ZW50LnNwZWNpYWwsZz1mLnN1cHBvcnQuZGVsZXRlRXhwYW5kbztmb3IodmFyIGg9MCxpOyhpPWFbaF0pIT1udWxsO2grKyl7aWYoaS5ub2RlTmFtZSYmZi5ub0RhdGFbaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSljb250aW51ZTtjPWlbZi5leHBhbmRvXTtpZihjKXtiPWRbY107aWYoYiYmYi5ldmVudHMpe2Zvcih2YXIgaiBpbiBiLmV2ZW50cyllW2pdP2YuZXZlbnQucmVtb3ZlKGksaik6Zi5yZW1vdmVFdmVudChpLGosYi5oYW5kbGUpO2IuaGFuZGxlJiYoYi5oYW5kbGUuZWxlbT1udWxsKX1nP2RlbGV0ZSBpW2YuZXhwYW5kb106aS5yZW1vdmVBdHRyaWJ1dGUmJmkucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyksZGVsZXRlIGRbY119fX19KTt2YXIgYnA9L2FscGhhXChbXildKlwpL2ksYnE9L29wYWNpdHk9KFteKV0qKS8sYnI9LyhbQS1aXXxebXMpL2csYnM9L15bXC0rXT8oPzpcZCpcLik/XGQrJC9pLGJ0PS9eLT8oPzpcZCpcLik/XGQrKD8hcHgpW15cZFxzXSskL2ksYnU9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnY9L15tYXJnaW4vLGJ3PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxieD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGJ5LGJ6LGJBO2YuZm4uY3NzPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSxhLGMsYXJndW1lbnRzLmxlbmd0aD4xKX0sZi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1ieShhLCJvcGFjaXR5Iik7cmV0dXJuIGM9PT0iIj8iMSI6Y31yZXR1cm4gYS5zdHlsZS5vcGFjaXR5fX19LGNzc051bWJlcjp7ZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOmYuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFhJiZhLm5vZGVUeXBlIT09MyYmYS5ub2RlVHlwZSE9PTgmJiEhYS5zdHlsZSl7dmFyIGcsaCxpPWYuY2FtZWxDYXNlKGMpLGo9YS5zdHlsZSxrPWYuY3NzSG9va3NbaV07Yz1mLmNzc1Byb3BzW2ldfHxpO2lmKGQ9PT1iKXtpZihrJiYiZ2V0ImluIGsmJihnPWsuZ2V0KGEsITEsZSkpIT09YilyZXR1cm4gZztyZXR1cm4galtjXX1oPXR5cGVvZiBkLGg9PT0ic3RyaW5nIiYmKGc9YnUuZXhlYyhkKSkmJihkPSsoZ1sxXSsxKSorZ1syXStwYXJzZUZsb2F0KGYuY3NzKGEsYykpLGg9Im51bWJlciIpO2lmKGQ9PW51bGx8fGg9PT0ibnVtYmVyIiYmaXNOYU4oZCkpcmV0dXJuO2g9PT0ibnVtYmVyIiYmIWYuY3NzTnVtYmVyW2ldJiYoZCs9InB4Iik7aWYoIWt8fCEoInNldCJpbiBrKXx8KGQ9ay5zZXQoYSxkKSkhPT1iKXRyeXtqW2NdPWR9Y2F0Y2gobCl7fX19LGNzczpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZztjPWYuY2FtZWxDYXNlKGMpLGc9Zi5jc3NIb29rc1tjXSxjPWYuY3NzUHJvcHNbY118fGMsYz09PSJjc3NGbG9hdCImJihjPSJmbG9hdCIpO2lmKGcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSwhMCxkKSkhPT1iKXJldHVybiBlO2lmKGJ5KXJldHVybiBieShhLGMpfSxzd2FwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fSxlLGY7Zm9yKGYgaW4gYilkW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5jYWxsKGEpO2ZvcihmIGluIGIpYS5zdHlsZVtmXT1kW2ZdO3JldHVybiBlfX0pLGYuY3VyQ1NTPWYuY3NzLGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGJ6PWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGcsaD1hLnN0eWxlO2I9Yi5yZXBsYWNlKGJyLCItJDEiKS50b0xvd2VyQ2FzZSgpLChkPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykmJihlPWQuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKSYmKGM9ZS5nZXRQcm9wZXJ0eVZhbHVlKGIpLGM9PT0iIiYmIWYuY29udGFpbnMoYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxhKSYmKGM9Zi5zdHlsZShhLGIpKSksIWYuc3VwcG9ydC5waXhlbE1hcmdpbiYmZSYmYnYudGVzdChiKSYmYnQudGVzdChjKSYmKGc9aC53aWR0aCxoLndpZHRoPWMsYz1lLndpZHRoLGgud2lkdGg9Zyk7cmV0dXJuIGN9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiQT1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxnPWEuc3R5bGU7Zj09bnVsbCYmZyYmKGU9Z1tiXSkmJihmPWUpLGJ0LnRlc3QoZikmJihjPWcubGVmdCxkPWEucnVudGltZVN0eWxlJiZhLnJ1bnRpbWVTdHlsZS5sZWZ0LGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGcubGVmdD1iPT09ImZvbnRTaXplIj8iMWVtIjpmLGY9Zy5waXhlbExlZnQrInB4IixnLmxlZnQ9YyxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1kKSk7cmV0dXJuIGY9PT0iIj8iYXV0byI6Zn0pLGJ5PWJ6fHxiQSxmLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7Zi5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtpZihjKXJldHVybiBhLm9mZnNldFdpZHRoIT09MD9iQihhLGIsZCk6Zi5zd2FwKGEsYncsZnVuY3Rpb24oKXtyZXR1cm4gYkIoYSxiLGQpfSl9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBicy50ZXN0KGIpP2IrInB4IjpifX19KSxmLnN1cHBvcnQub3BhY2l0eXx8KGYuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJxLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnN0eWxlLGQ9YS5jdXJyZW50U3R5bGUsZT1mLmlzTnVtZXJpYyhiKT8iYWxwaGEob3BhY2l0eT0iK2IqMTAwKyIpIjoiIixnPWQmJmQuZmlsdGVyfHxjLmZpbHRlcnx8IiI7Yy56b29tPTE7aWYoYj49MSYmZi50cmltKGcucmVwbGFjZShicCwiIikpPT09IiIpe2MucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKTtpZihkJiYhZC5maWx0ZXIpcmV0dXJufWMuZmlsdGVyPWJwLnRlc3QoZyk/Zy5yZXBsYWNlKGJwLGUpOmcrIiAiK2V9fSksZihmdW5jdGlvbigpe2Yuc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0fHwoZi5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe3JldHVybiBiP2J5KGEsIm1hcmdpbi1yaWdodCIpOmEuc3R5bGUubWFyZ2luUmlnaHR9KX19KX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KSxmLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe2YuY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe3ZhciBkLGU9dHlwZW9mIGM9PSJzdHJpbmciP2Muc3BsaXQoIiAiKTpbY10sZj17fTtmb3IoZD0wO2Q8NDtkKyspZlthK2J4W2RdK2JdPWVbZF18fGVbZC0yXXx8ZVswXTtyZXR1cm4gZn19fSk7dmFyIGJDPS8lMjAvZyxiRD0vXFtcXSQvLGJFPS9ccj9cbi9nLGJGPS8jLiokLyxiRz0vXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL21nLGJIPS9eKD86Y29sb3J8ZGF0ZXxkYXRldGltZXxkYXRldGltZS1sb2NhbHxlbWFpbHxoaWRkZW58bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrKSQvaSxiST0vXig/OmFib3V0fGFwcHxhcHBcLXN0b3JhZ2V8LitcLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLGJKPS9eKD86R0VUfEhFQUQpJC8sYks9L15cL1wvLyxiTD0vXD8vLGJNPS88c2NyaXB0XGJbXjxdKig/Oig/ITxcL3NjcmlwdD4pPFtePF0qKSo8XC9zY3JpcHQ+L2dpLGJOPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pLGJPPS9ccysvLGJQPS8oWz8mXSlfPVteJl0qLyxiUT0vXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspKT8pPy8sYlI9Zi5mbi5sb2FkLGJTPXt9LGJUPXt9LGJVLGJWLGJXPVsiKi8iXStbIioiXTt0cnl7YlU9ZS5ocmVmfWNhdGNoKGJYKXtiVT1jLmNyZWF0ZUVsZW1lbnQoImEiKSxiVS5ocmVmPSIiLGJVPWJVLmhyZWZ9YlY9YlEuZXhlYyhiVS50b0xvd2VyQ2FzZSgpKXx8W10sZi5mbi5leHRlbmQoe2xvYWQ6ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIiYmYlIpcmV0dXJuIGJSLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIGU9YS5pbmRleE9mKCIgIik7aWYoZT49MCl7dmFyIGc9YS5zbGljZShlLGEubGVuZ3RoKTthPWEuc2xpY2UoMCxlKX12YXIgaD0iR0VUIjtjJiYoZi5pc0Z1bmN0aW9uKGMpPyhkPWMsYz1iKTp0eXBlb2YgYz09Im9iamVjdCImJihjPWYucGFyYW0oYyxmLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksaD0iUE9TVCIpKTt2YXIgaT10aGlzO2YuYWpheCh7dXJsOmEsdHlwZTpoLGRhdGFUeXBlOiJodG1sIixkYXRhOmMsY29tcGxldGU6ZnVuY3Rpb24oYSxiLGMpe2M9YS5yZXNwb25zZVRleHQsYS5pc1Jlc29sdmVkKCkmJihhLmRvbmUoZnVuY3Rpb24oYSl7Yz1hfSksaS5odG1sKGc/ZigiPGRpdj4iKS5hcHBlbmQoYy5yZXBsYWNlKGJNLCIiKSkuZmluZChnKTpjKSksZCYmaS5lYWNoKGQsW2MsYixhXSl9fSk7cmV0dXJuIHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBmLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/Zi5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJiF0aGlzLmRpc2FibGVkJiYodGhpcy5jaGVja2VkfHxiTi50ZXN0KHRoaXMubm9kZU5hbWUpfHxiSC50ZXN0KHRoaXMudHlwZSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9Zih0aGlzKS52YWwoKTtyZXR1cm4gYz09bnVsbD9udWxsOmYuaXNBcnJheShjKT9mLm1hcChjLGZ1bmN0aW9uKGEsYyl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShiRSwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoYkUsIlxyXG4iKX19KS5nZXQoKX19KSxmLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Zi5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vbihiLGEpfX0pLGYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGMpe2ZbY109ZnVuY3Rpb24oYSxkLGUsZyl7Zi5pc0Z1bmN0aW9uKGQpJiYoZz1nfHxlLGU9ZCxkPWIpO3JldHVybiBmLmFqYXgoe3R5cGU6Yyx1cmw6YSxkYXRhOmQsc3VjY2VzczplLGRhdGFUeXBlOmd9KX19KSxmLmV4dGVuZCh7Z2V0U2NyaXB0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJqc29uIil9LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe2I/YiQoYSxmLmFqYXhTZXR0aW5ncyk6KGI9YSxhPWYuYWpheFNldHRpbmdzKSxiJChhLGIpO3JldHVybiBhfSxhamF4U2V0dGluZ3M6e3VybDpiVSxpc0xvY2FsOmJJLnRlc3QoYlZbMV0pLGdsb2JhbDohMCx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGFjY2VwdHM6e3htbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsaHRtbDoidGV4dC9odG1sIix0ZXh0OiJ0ZXh0L3BsYWluIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLCIqIjpiV30sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOmEuU3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOmYucGFyc2VKU09OLCJ0ZXh0IHhtbCI6Zi5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e2NvbnRleHQ6ITAsdXJsOiEwfX0sYWpheFByZWZpbHRlcjpiWShiUyksYWpheFRyYW5zcG9ydDpiWShiVCksYWpheDpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIHcoYSxjLGwsbSl7aWYocyE9PTIpe3M9MixxJiZjbGVhclRpbWVvdXQocSkscD1iLG49bXx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjA7dmFyIG8scix1LHc9Yyx4PWw/Y2EoZCx2LGwpOmIseSx6O2lmKGE+PTIwMCYmYTwzMDB8fGE9PT0zMDQpe2lmKGQuaWZNb2RpZmllZCl7aWYoeT12LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpZi5sYXN0TW9kaWZpZWRba109eTtpZih6PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKSlmLmV0YWdba109en1pZihhPT09MzA0KXc9Im5vdG1vZGlmaWVkIixvPSEwO2Vsc2UgdHJ5e3I9Y2IoZCx4KSx3PSJzdWNjZXNzIixvPSEwfWNhdGNoKEEpe3c9InBhcnNlcmVycm9yIix1PUF9fWVsc2V7dT13O2lmKCF3fHxhKXc9ImVycm9yIixhPDAmJihhPTApfXYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PSIiKyhjfHx3KSxvP2gucmVzb2x2ZVdpdGgoZSxbcix3LHZdKTpoLnJlamVjdFdpdGgoZSxbdix3LHVdKSx2LnN0YXR1c0NvZGUoaiksaj1iLHQmJmcudHJpZ2dlcigiYWpheCIrKG8/IlN1Y2Nlc3MiOiJFcnJvciIpLFt2LGQsbz9yOnVdKSxpLmZpcmVXaXRoKGUsW3Ysd10pLHQmJihnLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3YsZF0pLC0tZi5hY3RpdmV8fGYuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9fXR5cGVvZiBhPT0ib2JqZWN0IiYmKGM9YSxhPWIpLGM9Y3x8e307dmFyIGQ9Zi5hamF4U2V0dXAoe30sYyksZT1kLmNvbnRleHR8fGQsZz1lIT09ZCYmKGUubm9kZVR5cGV8fGUgaW5zdGFuY2VvZiBmKT9mKGUpOmYuZXZlbnQsaD1mLkRlZmVycmVkKCksaT1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxqPWQuc3RhdHVzQ29kZXx8e30sayxsPXt9LG09e30sbixvLHAscSxyLHM9MCx0LHUsdj17cmVhZHlTdGF0ZTowLHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXtpZighcyl7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO2E9bVtjXT1tW2NdfHxhLGxbYV09Yn1yZXR1cm4gdGhpc30sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHM9PT0yP246bnVsbH0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGM7aWYocz09PTIpe2lmKCFvKXtvPXt9O3doaWxlKGM9YkcuZXhlYyhuKSlvW2NbMV0udG9Mb3dlckNhc2UoKV09Y1syXX1jPW9bYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gYz09PWI/bnVsbDpjfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3N8fChkLm1pbWVUeXBlPWEpO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXthPWF8fCJhYm9ydCIscCYmcC5hYm9ydChhKSx3KDAsYSk7cmV0dXJuIHRoaXN9fTtoLnByb21pc2Uodiksdi5zdWNjZXNzPXYuZG9uZSx2LmVycm9yPXYuZmFpbCx2LmNvbXBsZXRlPWkuYWRkLHYuc3RhdHVzQ29kZT1mdW5jdGlvbihhKXtpZihhKXt2YXIgYjtpZihzPDIpZm9yKGIgaW4gYSlqW2JdPVtqW2JdLGFbYl1dO2Vsc2UgYj1hW3Yuc3RhdHVzXSx2LnRoZW4oYixiKX1yZXR1cm4gdGhpc30sZC51cmw9KChhfHxkLnVybCkrIiIpLnJlcGxhY2UoYkYsIiIpLnJlcGxhY2UoYkssYlZbMV0rIi8vIiksZC5kYXRhVHlwZXM9Zi50cmltKGQuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5zcGxpdChiTyksZC5jcm9zc0RvbWFpbj09bnVsbCYmKHI9YlEuZXhlYyhkLnVybC50b0xvd2VyQ2FzZSgpKSxkLmNyb3NzRG9tYWluPSEoIXJ8fHJbMV09PWJWWzFdJiZyWzJdPT1iVlsyXSYmKHJbM118fChyWzFdPT09Imh0dHA6Ij84MDo0NDMpKT09KGJWWzNdfHwoYlZbMV09PT0iaHR0cDoiPzgwOjQ0MykpKSksZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiZ0eXBlb2YgZC5kYXRhIT0ic3RyaW5nIiYmKGQuZGF0YT1mLnBhcmFtKGQuZGF0YSxkLnRyYWRpdGlvbmFsKSksYlooYlMsZCxjLHYpO2lmKHM9PT0yKXJldHVybiExO3Q9ZC5nbG9iYWwsZC50eXBlPWQudHlwZS50b1VwcGVyQ2FzZSgpLGQuaGFzQ29udGVudD0hYkoudGVzdChkLnR5cGUpLHQmJmYuYWN0aXZlKys9PT0wJiZmLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO2lmKCFkLmhhc0NvbnRlbnQpe2QuZGF0YSYmKGQudXJsKz0oYkwudGVzdChkLnVybCk/IiYiOiI/IikrZC5kYXRhLGRlbGV0ZSBkLmRhdGEpLGs9ZC51cmw7aWYoZC5jYWNoZT09PSExKXt2YXIgeD1mLm5vdygpLHk9ZC51cmwucmVwbGFjZShiUCwiJDFfPSIreCk7ZC51cmw9eSsoeT09PWQudXJsPyhiTC50ZXN0KGQudXJsKT8iJiI6Ij8iKSsiXz0iK3g6IiIpfX0oZC5kYXRhJiZkLmhhc0NvbnRlbnQmJmQuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixkLmNvbnRlbnRUeXBlKSxkLmlmTW9kaWZpZWQmJihrPWt8fGQudXJsLGYubGFzdE1vZGlmaWVkW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixmLmxhc3RNb2RpZmllZFtrXSksZi5ldGFnW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGYuZXRhZ1trXSkpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dKyhkLmRhdGFUeXBlc1swXSE9PSIqIj8iLCAiK2JXKyI7IHE9MC4wMSI6IiIpOmQuYWNjZXB0c1siKiJdKTtmb3IodSBpbiBkLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKHUsZC5oZWFkZXJzW3VdKTtpZihkLmJlZm9yZVNlbmQmJihkLmJlZm9yZVNlbmQuY2FsbChlLHYsZCk9PT0hMXx8cz09PTIpKXt2LmFib3J0KCk7cmV0dXJuITF9Zm9yKHUgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdlt1XShkW3VdKTtwPWJaKGJULGQsYyx2KTtpZighcCl3KC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle3YucmVhZHlTdGF0ZT0xLHQmJmcudHJpZ2dlcigiYWpheFNlbmQiLFt2LGRdKSxkLmFzeW5jJiZkLnRpbWVvdXQ+MCYmKHE9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0sZC50aW1lb3V0KSk7dHJ5e3M9MSxwLnNlbmQobCx3KX1jYXRjaCh6KXtpZihzPDIpdygtMSx6KTtlbHNlIHRocm93IHp9fXJldHVybiB2fSxwYXJhbTpmdW5jdGlvbihhLGMpe3ZhciBkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPWYuaXNGdW5jdGlvbihiKT9iKCk6YixkW2QubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiKX07Yz09PWImJihjPWYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKTtpZihmLmlzQXJyYXkoYSl8fGEuanF1ZXJ5JiYhZi5pc1BsYWluT2JqZWN0KGEpKWYuZWFjaChhLGZ1bmN0aW9uKCl7ZSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcih2YXIgZyBpbiBhKWJfKGcsYVtnXSxjLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKGJDLCIrIil9fSksZi5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9fSk7dmFyIGNjPWYubm93KCksY2Q9LyhcPSlcPygmfCQpfFw/XD8vaTtmLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZXhwYW5kbysiXyIrY2MrK319KSxmLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT10eXBlb2YgYi5kYXRhPT0ic3RyaW5nIiYmL15hcHBsaWNhdGlvblwveFwtd3d3XC1mb3JtXC11cmxlbmNvZGVkLy50ZXN0KGIuY29udGVudFR5cGUpO2lmKGIuZGF0YVR5cGVzWzBdPT09Impzb25wInx8Yi5qc29ucCE9PSExJiYoY2QudGVzdChiLnVybCl8fGUmJmNkLnRlc3QoYi5kYXRhKSkpe3ZhciBnLGg9Yi5qc29ucENhbGxiYWNrPWYuaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxpPWFbaF0saj1iLnVybCxrPWIuZGF0YSxsPSIkMSIraCsiJDIiO2IuanNvbnAhPT0hMSYmKGo9ai5yZXBsYWNlKGNkLGwpLGIudXJsPT09aiYmKGUmJihrPWsucmVwbGFjZShjZCxsKSksYi5kYXRhPT09ayYmKGorPSgvXD8vLnRlc3Qoaik/IiYiOiI/IikrYi5qc29ucCsiPSIraCkpKSxiLnVybD1qLGIuZGF0YT1rLGFbaF09ZnVuY3Rpb24oYSl7Zz1bYV19LGQuYWx3YXlzKGZ1bmN0aW9uKCl7YVtoXT1pLGcmJmYuaXNGdW5jdGlvbihpKSYmYVtoXShnWzBdKX0pLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe2d8fGYuZXJyb3IoaCsiIHdhcyBub3QgY2FsbGVkIik7cmV0dXJuIGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIjtyZXR1cm4ic2NyaXB0In19KSxmLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L2phdmFzY3JpcHR8ZWNtYXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7Zi5nbG9iYWxFdmFsKGEpO3JldHVybiBhfX19KSxmLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7YS5jYWNoZT09PWImJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLGYuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgZCxlPWMuaGVhZHx8Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxjLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihmLGcpe2Q9Yy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLmFzeW5jPSJhc3luYyIsYS5zY3JpcHRDaGFyc2V0JiYoZC5jaGFyc2V0PWEuc2NyaXB0Q2hhcnNldCksZC5zcmM9YS51cmwsZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oYSxjKXtpZihjfHwhZC5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGQucmVhZHlTdGF0ZSkpZC5vbmxvYWQ9ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxlJiZkLnBhcmVudE5vZGUmJmUucmVtb3ZlQ2hpbGQoZCksZD1iLGN8fGcoMjAwLCJzdWNjZXNzIil9LGUuaW5zZXJ0QmVmb3JlKGQsZS5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkLm9ubG9hZCgwLDEpfX19fSk7dmFyIGNlPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBjZyljZ1thXSgwLDEpfTohMSxjZj0wLGNnO2YuYWpheFNldHRpbmdzLnhocj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0xvY2FsJiZjaCgpfHxjaSgpfTpjaCxmdW5jdGlvbihhKXtmLmV4dGVuZChmLnN1cHBvcnQse2FqYXg6ISFhLGNvcnM6ISFhJiYid2l0aENyZWRlbnRpYWxzImluIGF9KX0oZi5hamF4U2V0dGluZ3MueGhyKCkpLGYuc3VwcG9ydC5hamF4JiZmLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oYyl7aWYoIWMuY3Jvc3NEb21haW58fGYuc3VwcG9ydC5jb3JzKXt2YXIgZDtyZXR1cm57c2VuZDpmdW5jdGlvbihlLGcpe3ZhciBoPWMueGhyKCksaSxqO2MudXNlcm5hbWU/aC5vcGVuKGMudHlwZSxjLnVybCxjLmFzeW5jLGMudXNlcm5hbWUsYy5wYXNzd29yZCk6aC5vcGVuKGMudHlwZSxjLnVybCxjLmFzeW5jKTtpZihjLnhockZpZWxkcylmb3IoaiBpbiBjLnhockZpZWxkcyloW2pdPWMueGhyRmllbGRzW2pdO2MubWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlKGMubWltZVR5cGUpLCFjLmNyb3NzRG9tYWluJiYhZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdJiYoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IoaiBpbiBlKWguc2V0UmVxdWVzdEhlYWRlcihqLGVbal0pfWNhdGNoKGspe31oLnNlbmQoYy5oYXNDb250ZW50JiZjLmRhdGF8fG51bGwpLGQ9ZnVuY3Rpb24oYSxlKXt2YXIgaixrLGwsbSxuO3RyeXtpZihkJiYoZXx8aC5yZWFkeVN0YXRlPT09NCkpe2Q9YixpJiYoaC5vbnJlYWR5c3RhdGVjaGFuZ2U9Zi5ub29wLGNlJiZkZWxldGUgY2dbaV0pO2lmKGUpaC5yZWFkeVN0YXRlIT09NCYmaC5hYm9ydCgpO2Vsc2V7aj1oLnN0YXR1cyxsPWguZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksbT17fSxuPWgucmVzcG9uc2VYTUwsbiYmbi5kb2N1bWVudEVsZW1lbnQmJihtLnhtbD1uKTt0cnl7bS50ZXh0PWgucmVzcG9uc2VUZXh0fWNhdGNoKGEpe310cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjZixjZSYmKGNnfHwoY2c9e30sZihhKS51bmxvYWQoY2UpKSxjZ1tpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY2o9e30sY2ssY2wsY209L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNuPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY28sY3A9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY3E7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdCgic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSwoZT09PSIiJiZmLmNzcyhkLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCFmLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZCkpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGN1KGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN0KCJoaWRlIiwzKSxhLGIsYyk7dmFyIGQsZSxnPTAsaD10aGlzLmxlbmd0aDtmb3IoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWYuY3NzKGQsImRpc3BsYXkiKSxlIT09Im5vbmUiJiYhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsZSkpO2ZvcihnPTA7ZzxoO2crKyl0aGlzW2ddLnN0eWxlJiYodGhpc1tnXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGN0KCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGcoKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbyxwLHE7Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSk7aWYoKGs9Zi5jc3NIb29rc1tnXSkmJiJleHBhbmQiaW4gayl7bD1rLmV4cGFuZChhW2ddKSxkZWxldGUgYVtnXTtmb3IoaSBpbiBsKWkgaW4gYXx8KGFbaV09bFtpXSl9fWZvcihnIGluIGEpe2g9YVtnXSxmLmlzQXJyYXkoaCk/KGIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddPWhbMV0saD1hW2ddPWhbMF0pOmIuYW5pbWF0ZWRQcm9wZXJ0aWVzW2ddPWIuc3BlY2lhbEVhc2luZyYmYi5zcGVjaWFsRWFzaW5nW2ddfHxiLmVhc2luZ3x8InN3aW5nIjtpZihoPT09ImhpZGUiJiZkfHxoPT09InNob3ciJiYhZClyZXR1cm4gYi5jb21wbGV0ZS5jYWxsKHRoaXMpO2MmJihnPT09ImhlaWdodCJ8fGc9PT0id2lkdGgiKSYmKGIub3ZlcmZsb3c9W3RoaXMuc3R5bGUub3ZlcmZsb3csdGhpcy5zdHlsZS5vdmVyZmxvd1gsdGhpcy5zdHlsZS5vdmVyZmxvd1ldLGYuY3NzKHRoaXMsImRpc3BsYXkiKT09PSJpbmxpbmUiJiZmLmNzcyh0aGlzLCJmbG9hdCIpPT09Im5vbmUiJiYoIWYuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0fHxjdSh0aGlzLm5vZGVOYW1lKT09PSJpbmxpbmUiP3RoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjp0aGlzLnN0eWxlLnpvb209MSkpfWIub3ZlcmZsb3chPW51bGwmJih0aGlzLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKTtmb3IoaSBpbiBhKWo9bmV3IGYuZngodGhpcyxiLGkpLGg9YVtpXSxjbS50ZXN0KGgpPyhxPWYuX2RhdGEodGhpcywidG9nZ2xlIitpKXx8KGg9PT0idG9nZ2xlIj9kPyJzaG93IjoiaGlkZSI6MCkscT8oZi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kscT09PSJzaG93Ij8iaGlkZSI6InNob3ciKSxqW3FdKCkpOmpbaF0oKSk6KG09Y24uZXhlYyhoKSxuPWouY3VyKCksbT8obz1wYXJzZUZsb2F0KG1bMl0pLHA9bVszXXx8KGYuY3NzTnVtYmVyW2ldPyIiOiJweCIpLHAhPT0icHgiJiYoZi5zdHlsZSh0aGlzLGksKG98fDEpK3ApLG49KG98fDEpL2ouY3VyKCkqbixmLnN0eWxlKHRoaXMsaSxuK3ApKSxtWzFdJiYobz0obVsxXT09PSItPSI/LTE6MSkqbytuKSxqLmN1c3RvbShuLG8scCkpOmouY3VzdG9tKG4saCwiIikpO3JldHVybiEwfXZhciBlPWYuc3BlZWQoYixjLGQpO2lmKGYuaXNFbXB0eU9iamVjdChhKSlyZXR1cm4gdGhpcy5lYWNoKGUuY29tcGxldGUsWyExXSk7YT1mLmV4dGVuZCh7fSxhKTtyZXR1cm4gZS5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGUucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxjLGQpe3R5cGVvZiBhIT0ic3RyaW5nIiYmKGQ9YyxjPWEsYT1iKSxjJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2Z1bmN0aW9uIGgoYSxiLGMpe3ZhciBlPWJbY107Zi5yZW1vdmVEYXRhKGEsYywhMCksZS5zdG9wKGQpfXZhciBiLGM9ITEsZT1mLnRpbWVycyxnPWYuX2RhdGEodGhpcyk7ZHx8Zi5fdW5tYXJrKCEwLHRoaXMpO2lmKGE9PW51bGwpZm9yKGIgaW4gZylnW2JdJiZnW2JdLnN0b3AmJmIuaW5kZXhPZigiLnJ1biIpPT09Yi5sZW5ndGgtNCYmaCh0aGlzLGcsYik7ZWxzZSBnW2I9YSsiLnJ1biJdJiZnW2JdLnN0b3AmJmgodGhpcyxnLGIpO2ZvcihiPWUubGVuZ3RoO2ItLTspZVtiXS5lbGVtPT09dGhpcyYmKGE9PW51bGx8fGVbYl0ucXVldWU9PT1hKSYmKGQ/ZVtiXSghMCk6ZVtiXS5zYXZlU3RhdGUoKSxjPSEwLGUuc3BsaWNlKGIsMSkpOyghZHx8IWMpJiZmLmRlcXVldWUodGhpcyxhKX0pfX0pLGYuZWFjaCh7c2xpZGVEb3duOmN0KCJzaG93IiwxKSxzbGlkZVVwOmN0KCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpjdCgidG9nZ2xlIiwxKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxmLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJnR5cGVvZiBhPT0ib2JqZWN0Ij9mLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fGYuaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhZi5pc0Z1bmN0aW9uKGIpJiZifTtkLmR1cmF0aW9uPWYuZngub2ZmPzA6dHlwZW9mIGQuZHVyYXRpb249PSJudW1iZXIiP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBmLmZ4LnNwZWVkcz9mLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTpmLmZ4LnNwZWVkcy5fZGVmYXVsdDtpZihkLnF1ZXVlPT1udWxsfHxkLnF1ZXVlPT09ITApZC5xdWV1ZT0iZngiO2Qub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbihhKXtmLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWU/Zi5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSk6YSE9PSExJiZmLl91bm1hcmsodGhpcyl9O3JldHVybiBkfSxlYXNpbmc6e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNX19LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGUuc3RlcChhKX12YXIgZT10aGlzLGc9Zi5meDt0aGlzLnN0YXJ0VGltZT1jcXx8Y3IoKSx0aGlzLmVuZD1jLHRoaXMubm93PXRoaXMuc3RhcnQ9YSx0aGlzLnBvcz10aGlzLnN0YXRlPTAsdGhpcy51bml0PWR8fHRoaXMudW5pdHx8KGYuY3NzTnVtYmVyW3RoaXMucHJvcF0/IiI6InB4IiksaC5xdWV1ZT10aGlzLm9wdGlvbnMucXVldWUsaC5lbGVtPXRoaXMuZWxlbSxoLnNhdmVTdGF0ZT1mdW5jdGlvbigpe2YuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCk9PT1iJiYoZS5vcHRpb25zLmhpZGU/Zi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuc3RhcnQpOmUub3B0aW9ucy5zaG93JiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5lbmQpKX0saCgpJiZmLnRpbWVycy5wdXNoKGgpJiYhY28mJihjbz1zZXRJbnRlcnZhbChnLnRpY2ssZy5pbnRlcnZhbCkpfSxzaG93OmZ1bmN0aW9uKCl7dmFyIGE9Zi5fZGF0YSh0aGlzLmVsZW0sImZ4c2hvdyIrdGhpcy5wcm9wKTt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWF8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLnNob3c9ITAsYSE9PWI/dGhpcy5jdXN0b20odGhpcy5jdXIoKSxhKTp0aGlzLmN1c3RvbSh0aGlzLnByb3A9PT0id2lkdGgifHx0aGlzLnByb3A9PT0iaGVpZ2h0Ij8xOjAsdGhpcy5jdXIoKSksZih0aGlzLmVsZW0pLnNob3coKX0saGlkZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Zi5fZGF0YSh0aGlzLmVsZW0sImZ4c2hvdyIrdGhpcy5wcm9wKXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuaGlkZT0hMCx0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPWNxfHxjcigpLGc9ITAsaD10aGlzLmVsZW0saT10aGlzLm9wdGlvbnM7aWYoYXx8ZT49aS5kdXJhdGlvbit0aGlzLnN0YXJ0VGltZSl7dGhpcy5ub3c9dGhpcy5lbmQsdGhpcy5wb3M9dGhpcy5zdGF0ZT0xLHRoaXMudXBkYXRlKCksaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXT0hMDtmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylpLmFuaW1hdGVkUHJvcGVydGllc1tiXSE9PSEwJiYoZz0hMSk7aWYoZyl7aS5vdmVyZmxvdyE9bnVsbCYmIWYuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzJiZmLmVhY2goWyIiLCJYIiwiWSJdLGZ1bmN0aW9uKGEsYil7aC5zdHlsZVsib3ZlcmZsb3ciK2JdPWkub3ZlcmZsb3dbYV19KSxpLmhpZGUmJmYoaCkuaGlkZSgpO2lmKGkuaGlkZXx8aS5zaG93KWZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWYuc3R5bGUoaCxiLGkub3JpZ1tiXSksZi5yZW1vdmVEYXRhKGgsImZ4c2hvdyIrYiwhMCksZi5yZW1vdmVEYXRhKGgsInRvZ2dsZSIrYiwhMCk7ZD1pLmNvbXBsZXRlLGQmJihpLmNvbXBsZXRlPSExLGQuY2FsbChoKSl9cmV0dXJuITF9aS5kdXJhdGlvbj09SW5maW5pdHk/dGhpcy5ub3c9ZTooYz1lLXRoaXMuc3RhcnRUaW1lLHRoaXMuc3RhdGU9Yy9pLmR1cmF0aW9uLHRoaXMucG9zPWYuZWFzaW5nW2kuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF1dKHRoaXMuc3RhdGUsYywwLDEsaS5kdXJhdGlvbiksdGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3MpLHRoaXMudXBkYXRlKCk7cmV0dXJuITB9fSxmLmV4dGVuZChmLmZ4LHt0aWNrOmZ1bmN0aW9uKCl7dmFyIGEsYj1mLnRpbWVycyxjPTA7Zm9yKDtjPGIubGVuZ3RoO2MrKylhPWJbY10sIWEoKSYmYltjXT09PWEmJmIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8Zi5meC5zdG9wKCl9LGludGVydmFsOjEzLHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGNvKSxjbz1udWxsfSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihhKXtmLnN0eWxlKGEuZWxlbSwib3BhY2l0eSIsYS5ub3cpfSxfZGVmYXVsdDpmdW5jdGlvbihhKXthLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsP2EuZWxlbS5zdHlsZVthLnByb3BdPWEubm93K2EudW5pdDphLmVsZW1bYS5wcm9wXT1hLm5vd319fSksZi5lYWNoKGNwLmNvbmNhdC5hcHBseShbXSxjcCksZnVuY3Rpb24oYSxiKXtiLmluZGV4T2YoIm1hcmdpbiIpJiYoZi5meC5zdGVwW2JdPWZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLGIsTWF0aC5tYXgoMCxhLm5vdykrYS51bml0KX0pfSksZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBmLmdyZXAoZi50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9KTt2YXIgY3YsY3c9L150KD86YWJsZXxkfGgpJC9pLGN4PS9eKD86Ym9keXxodG1sKSQvaTsiZ2V0Qm91bmRpbmdDbGllbnRSZWN0ImluIGMuZG9jdW1lbnRFbGVtZW50P2N2PWZ1bmN0aW9uKGEsYixjLGQpe3RyeXtkPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZSl7fWlmKCFkfHwhZi5jb250YWlucyhjLGEpKXJldHVybiBkP3t0b3A6ZC50b3AsbGVmdDpkLmxlZnR9Ont0b3A6MCxsZWZ0OjB9O3ZhciBnPWIuYm9keSxoPWN5KGIpLGk9Yy5jbGllbnRUb3B8fGcuY2xpZW50VG9wfHwwLGo9Yy5jbGllbnRMZWZ0fHxnLmNsaWVudExlZnR8fDAsaz1oLnBhZ2VZT2Zmc2V0fHxmLnN1cHBvcnQuYm94TW9kZWwmJmMuc2Nyb2xsVG9wfHxnLnNjcm9sbFRvcCxsPWgucGFnZVhPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmYy5zY3JvbGxMZWZ0fHxnLnNjcm9sbExlZnQsbT1kLnRvcCtrLWksbj1kLmxlZnQrbC1qO3JldHVybnt0b3A6bSxsZWZ0Om59fTpjdj1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT1hLm9mZnNldFBhcmVudCxnPWEsaD1iLmJvZHksaT1iLmRlZmF1bHRWaWV3LGo9aT9pLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKTphLmN1cnJlbnRTdHlsZSxrPWEub2Zmc2V0VG9wLGw9YS5vZmZzZXRMZWZ0O3doaWxlKChhPWEucGFyZW50Tm9kZSkmJmEhPT1oJiZhIT09Yyl7aWYoZi5zdXBwb3J0LmZpeGVkUG9zaXRpb24mJmoucG9zaXRpb249PT0iZml4ZWQiKWJyZWFrO2Q9aT9pLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKTphLmN1cnJlbnRTdHlsZSxrLT1hLnNjcm9sbFRvcCxsLT1hLnNjcm9sbExlZnQsYT09PWUmJihrKz1hLm9mZnNldFRvcCxsKz1hLm9mZnNldExlZnQsZi5zdXBwb3J0LmRvZXNOb3RBZGRCb3JkZXImJighZi5zdXBwb3J0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzfHwhY3cudGVzdChhLm5vZGVOYW1lKSkmJihrKz1wYXJzZUZsb2F0KGQuYm9yZGVyVG9wV2lkdGgpfHwwLGwrPXBhcnNlRmxvYXQoZC5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxnPWUsZT1hLm9mZnNldFBhcmVudCksZi5zdXBwb3J0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmZC5vdmVyZmxvdyE9PSJ2aXNpYmxlIiYmKGsrPXBhcnNlRmxvYXQoZC5ib3JkZXJUb3BXaWR0aCl8fDAsbCs9cGFyc2VGbG9hdChkLmJvcmRlckxlZnRXaWR0aCl8fDApLGo9ZH1pZihqLnBvc2l0aW9uPT09InJlbGF0aXZlInx8ai5wb3NpdGlvbj09PSJzdGF0aWMiKWsrPWgub2Zmc2V0VG9wLGwrPWgub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmai5wb3NpdGlvbj09PSJmaXhlZCImJihrKz1NYXRoLm1heChjLnNjcm9sbFRvcCxoLnNjcm9sbFRvcCksbCs9TWF0aC5tYXgoYy5zY3JvbGxMZWZ0LGguc2Nyb2xsTGVmdCkpO3JldHVybnt0b3A6ayxsZWZ0Omx9fSxmLmZuLm9mZnNldD1mdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGM9dGhpc1swXSxkPWMmJmMub3duZXJEb2N1bWVudDtpZighZClyZXR1cm4gbnVsbDtpZihjPT09ZC5ib2R5KXJldHVybiBmLm9mZnNldC5ib2R5T2Zmc2V0KGMpO3JldHVybiBjdihjLGQsZC5kb2N1bWVudEVsZW1lbnQpfSxmLm9mZnNldD17Ym9keU9mZnNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFRvcCxjPWEub2Zmc2V0TGVmdDtmLnN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQmJihiKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjKz1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDApO3JldHVybnt0b3A6YixsZWZ0OmN9fSxzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWYuY3NzKGEsInBvc2l0aW9uIik7ZD09PSJzdGF0aWMiJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgZT1mKGEpLGc9ZS5vZmZzZXQoKSxoPWYuY3NzKGEsInRvcCIpLGk9Zi5jc3MoYSwibGVmdCIpLGo9KGQ9PT0iYWJzb2x1dGUifHxkPT09ImZpeGVkIikmJmYuaW5BcnJheSgiYXV0byIsW2gsaV0pPi0xLGs9e30sbD17fSxtLG47aj8obD1lLnBvc2l0aW9uKCksbT1sLnRvcCxuPWwubGVmdCk6KG09cGFyc2VGbG9hdChoKXx8MCxuPXBhcnNlRmxvYXQoaSl8fDApLGYuaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxnKSksYi50b3AhPW51bGwmJihrLnRvcD1iLnRvcC1nLnRvcCttKSxiLmxlZnQhPW51bGwmJihrLmxlZnQ9Yi5sZWZ0LWcubGVmdCtuKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxrKTplLmNzcyhrKX19LGYuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGM9dGhpcy5vZmZzZXQoKSxkPWN4LnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtjLnRvcC09cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDAsYy5sZWZ0LT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpbkxlZnQiKSl8fDAsZC50b3ArPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDAsZC5sZWZ0Kz1wYXJzZUZsb2F0KGYuY3NzKGJbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MDtyZXR1cm57dG9wOmMudG9wLWQudG9wLGxlZnQ6Yy5sZWZ0LWQubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjLmJvZHk7d2hpbGUoYSYmIWN4LnRlc3QoYS5ub2RlTmFtZSkmJmYuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIilhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfSl9fSksZi5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGEsYyl7dmFyIGQ9L1kvLnRlc3QoYyk7Zi5mblthXT1mdW5jdGlvbihlKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxmdW5jdGlvbihhLGUsZyl7dmFyIGg9Y3koYSk7aWYoZz09PWIpcmV0dXJuIGg/YyBpbiBoP2hbY106Zi5zdXBwb3J0LmJveE1vZGVsJiZoLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtlXXx8aC5kb2N1bWVudC5ib2R5W2VdOmFbZV07aD9oLnNjcm9sbFRvKGQ/ZihoKS5zY3JvbGxMZWZ0KCk6ZyxkP2c6ZihoKS5zY3JvbGxUb3AoKSk6YVtlXT1nfSxhLGUsYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KSxmLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGMpe3ZhciBkPSJjbGllbnQiK2EsZT0ic2Nyb2xsIithLGc9Im9mZnNldCIrYTtmLmZuWyJpbm5lciIrYV09ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGMsInBhZGRpbmciKSk6dGhpc1tjXSgpOm51bGx9LGYuZm5bIm91dGVyIithXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGMsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbY10oKTpudWxsfSxmLmZuW2NdPWZ1bmN0aW9uKGEpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEsYyxoKXt2YXIgaSxqLGssbDtpZihmLmlzV2luZG93KGEpKXtpPWEuZG9jdW1lbnQsaj1pLmRvY3VtZW50RWxlbWVudFtkXTtyZXR1cm4gZi5zdXBwb3J0LmJveE1vZGVsJiZqfHxpLmJvZHkmJmkuYm9keVtkXXx8an1pZihhLm5vZGVUeXBlPT09OSl7aT1hLmRvY3VtZW50RWxlbWVudDtpZihpW2RdPj1pW2VdKXJldHVybiBpW2RdO3JldHVybiBNYXRoLm1heChhLmJvZHlbZV0saVtlXSxhLmJvZHlbZ10saVtnXSl9aWYoaD09PWIpe2s9Zi5jc3MoYSxjKSxsPXBhcnNlRmxvYXQoayk7cmV0dXJuIGYuaXNOdW1lcmljKGwpP2w6a31mKGEpLmNzcyhjLGgpfSxjLGEsYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KSxhLmpRdWVyeT1hLiQ9Zix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KX0pKHdpbmRvdyk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9qcXVlcnlfaGFzaGNoYW5nZS9qcXVlcnkuaGFzaGNoYW5nZS5qcwotLyoqCi0gKiBAbGljZW5zZQotICogalF1ZXJ5IGhhc2hjaGFuZ2UgMS4wLjAKLSAqIAotICogKGJhc2VkIG9uIGpxdWVyeS5oaXN0b3J5KQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDaHJpcyBMZWlzaG1hbiAoY2hyaXNsZWlzaG1hbi5jb20pCi0gKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4dCkKLSAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCi0gKi8KLShmdW5jdGlvbigkKSB7Ci0KLSQuZm4uZXh0ZW5kKHsKLSAgICBoYXNoY2hhbmdlOiBmdW5jdGlvbihjYWxsYmFjaykgeyB0aGlzLmJpbmQoJ2hhc2hjaGFuZ2UnLCBjYWxsYmFjaykgfSwKLSAgICBvcGVuT25DbGljazogZnVuY3Rpb24oaHJlZikgewotCQlpZiAoaHJlZiA9PT0gdW5kZWZpbmVkIHx8IGhyZWYubGVuZ3RoID09IDApCi0JCQlocmVmID0gJyMnOwotCQlyZXR1cm4gdGhpcy5jbGljayhmdW5jdGlvbihldikgewotCQkJaWYgKGhyZWYgJiYgaHJlZi5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0JCQkJLy8gZXhlY3V0ZSBsb2FkIGluIHNlcGFyYXRlIGNhbGwgc3RhY2sKLQkJCQl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsgJC5sb2NhdGlvbkhhc2goaHJlZikgfSwgMCk7Ci0JCQl9IGVsc2UgewotCQkJCXdpbmRvdy5sb2NhdGlvbihocmVmKTsKLQkJCX0KLQkJCWV2LnN0b3BQcm9wYWdhdGlvbigpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9KTsKLSAgICB9Ci19KTsKLQotLy8gSUUgOCBpbnRyb2R1Y2VzIHRoZSBoYXNoY2hhbmdlIGV2ZW50IG5hdGl2ZWx5IC0gc28gbm90aGluZyBtb3JlIHRvIGRvCi1pZiAoJC5icm93c2VyLm1zaWUgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA+PSA4KSB7Ci0JJC5leHRlbmQoewotCQlsb2NhdGlvbkhhc2g6IGZ1bmN0aW9uKGhhc2gpIHsKLQkgICAgICAgIGlmICghaGFzaCkgaGFzaCA9ICcjJzsKLQkgICAgICAgIGVsc2UgaWYgKGhhc2guY2hhckF0KDApICE9ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7Ci0JICAgICAgICBsb2NhdGlvbi5oYXNoID0gaGFzaDsKLQkgICAgfQotCX0pOwotCXJldHVybjsKLX0KLQotdmFyIGN1ckhhc2g7Ci0vLyBoaWRkZW4gaWZyYW1lIGZvciBJRSAoZWFybGllciB0aGFuIDgpCi12YXIgaWZyYW1lOwotCi0kLmV4dGVuZCh7Ci0JbG9jYXRpb25IYXNoOiBmdW5jdGlvbihoYXNoKSB7Ci0JCWlmIChjdXJIYXNoID09PSB1bmRlZmluZWQpIHJldHVybjsKLQotCQlpZiAoIWhhc2gpIGhhc2ggPSAnIyc7Ci0JCWVsc2UgaWYgKGhhc2guY2hhckF0KDApICE9ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7Ci0JCQotCQlsb2NhdGlvbi5oYXNoID0gaGFzaDsKLQkJCi0JCWlmIChjdXJIYXNoID09IGhhc2gpIHJldHVybjsKLQkJY3VySGFzaCA9IGhhc2g7Ci0JCQotCQlpZiAoJC5icm93c2VyLm1zaWUpIHVwZGF0ZUlFRnJhbWUoaGFzaCk7Ci0JCSQuZXZlbnQudHJpZ2dlcignaGFzaGNoYW5nZScpOwotCX0KLX0pOwotCi0kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLSAgICBjdXJIYXNoID0gbG9jYXRpb24uaGFzaDsKLSAgICBpZiAoJC5icm93c2VyLm1zaWUpIHsKLSAgICAgICAgLy8gc3RvcCB0aGUgY2FsbGJhY2sgZmlyaW5nIHR3aWNlIGR1cmluZyBpbml0IGlmIG5vIGhhc2ggcHJlc2VudAotICAgICAgICBpZiAoY3VySGFzaCA9PSAnJykgY3VySGFzaCA9ICcjJzsKLSAgICAgICAgLy8gYWRkIGhpZGRlbiBpZnJhbWUgZm9yIElFCi0gICAgICAgIGlmcmFtZSA9ICQoJzxpZnJhbWUgLz4nKS5oaWRlKCkuZ2V0KDApOwotICAgICAgICAkKCdib2R5JykucHJlcGVuZChpZnJhbWUpOwotICAgICAgICB1cGRhdGVJRUZyYW1lKGxvY2F0aW9uLmhhc2gpOwotICAgICAgICBzZXRJbnRlcnZhbChjaGVja0hhc2hJRSwgMTAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRJbnRlcnZhbChjaGVja0hhc2gsIDEwMCk7Ci0gICAgfQotfSk7Ci0kKHdpbmRvdykudW5sb2FkKGZ1bmN0aW9uKCkgeyBpZnJhbWUgPSBudWxsIH0pOwotCi1mdW5jdGlvbiBjaGVja0hhc2goKSB7Ci0gICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoOwotICAgIGlmIChoYXNoICE9IGN1ckhhc2gpIHsKLSAgICAgICAgY3VySGFzaCA9IGhhc2g7Ci0gICAgICAgICQuZXZlbnQudHJpZ2dlcignaGFzaGNoYW5nZScpOwotICAgIH0KLX0KLQotaWYgKCQuYnJvd3Nlci5tc2llKSB7Ci0gICAgLy8gQXR0YWNoIGEgbGl2ZSBoYW5kbGVyIGZvciBhbnkgYW5jaG9yIGxpbmtzCi0gICAgJCgnYVtocmVmXj0jXScpLmxpdmUoJ2NsaWNrJywgZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBoYXNoID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7Ci0gICAgICAgIC8vIERvbid0IGludGVyY2VwdCB0aGUgY2xpY2sgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgYW5jaG9yIG9uIHRoZSBwYWdlCi0gICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGlzIGhhc2gKLSAgICAgICAgaWYgKCQoaGFzaCkubGVuZ3RoID09IDAgJiYgJCgnYVtuYW1lPScraGFzaC5zbGljZSgxKSsnXScpLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAkLmxvY2F0aW9uSGFzaChoYXNoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0pOwotfQotCi1mdW5jdGlvbiBjaGVja0hhc2hJRSgpIHsKLSAgICAvLyBPbiBJRSwgY2hlY2sgZm9yIGxvY2F0aW9uLmhhc2ggb2YgaWZyYW1lCi0gICAgdmFyIGlkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OwotICAgIHZhciBoYXNoID0gaWRvYy5sb2NhdGlvbi5oYXNoOwotICAgIGlmIChoYXNoID09ICcnKSBoYXNoID0gJyMnOwotCi0gICAgaWYgKGhhc2ggIT0gY3VySGFzaCkgewotICAgICAgICBpZiAobG9jYXRpb24uaGFzaCAhPSBoYXNoKSBsb2NhdGlvbi5oYXNoID0gaGFzaDsKLSAgICAgICAgY3VySGFzaCA9IGhhc2g7Ci0gICAgICAgICQuZXZlbnQudHJpZ2dlcignaGFzaGNoYW5nZScpOwotICAgIH0KLX0KLQotZnVuY3Rpb24gdXBkYXRlSUVGcmFtZShoYXNoKSB7Ci0gICAgaWYgKGhhc2ggPT0gJyMnKSBoYXNoID0gJyc7Ci0gICAgdmFyIGlkb2MgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsKLSAgICBpZG9jLm9wZW4oKTsKLSAgICBpZG9jLmNsb3NlKCk7Ci0gICAgaWYgKGlkb2MubG9jYXRpb24uaGFzaCAhPSBoYXNoKSBpZG9jLmxvY2F0aW9uLmhhc2ggPSBoYXNoOwotfQotCi19KShqUXVlcnkpOwotCi0vL3RoaXJkX3BhcnR5L2phdmFzY3JpcHQvanF1ZXJ5X2pzY3JvbGxwYW5lL2pxdWVyeS5qc2Nyb2xscGFuZS5taW4uanMKLS8qCi0gKiBAbGljZW5zZQotICogalNjcm9sbFBhbmUgLSB2Mi4wLjBiZXRhMTIgLSAyMDEyLTA5LTI3Ci0gKiBodHRwOi8vanNjcm9sbHBhbmUua2VsdmlubHVjay5jb20vCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEtlbHZpbiBMdWNrCi0gKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIGxpY2Vuc2VzLgotICovCi0oZnVuY3Rpb24oYixhLGMpe2IuZm4ualNjcm9sbFBhbmU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gZChELE8pe3ZhciBheSxRPXRoaXMsWSxhaix2LGFsLFQsWix5LHEsYXosYUUsYXUsaSxJLGgsaixhYSxVLGFwLFgsdCxBLGFxLGFmLGFtLEcsbCxhdCxheCx4LGF2LGFILGYsTCxhaT10cnVlLFA9dHJ1ZSxhRz1mYWxzZSxrPWZhbHNlLGFvPUQuY2xvbmUoZmFsc2UsZmFsc2UpLmVtcHR5KCksYWM9Yi5mbi5td2hlZWxJbnRlbnQ/Im13aGVlbEludGVudC5qc3AiOiJtb3VzZXdoZWVsLmpzcCI7YUg9RC5jc3MoInBhZGRpbmdUb3AiKSsiICIrRC5jc3MoInBhZGRpbmdSaWdodCIpKyIgIitELmNzcygicGFkZGluZ0JvdHRvbSIpKyIgIitELmNzcygicGFkZGluZ0xlZnQiKTtmPShwYXJzZUludChELmNzcygicGFkZGluZ0xlZnQiKSwxMCl8fDApKyhwYXJzZUludChELmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKTtmdW5jdGlvbiBhcihhUSl7dmFyIGFMLGFOLGFNLGFKLGFJLGFQLGFPPWZhbHNlLGFLPWZhbHNlO2F5PWFRO2lmKFk9PT1jKXthST1ELnNjcm9sbFRvcCgpO2FQPUQuc2Nyb2xsTGVmdCgpO0QuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIixwYWRkaW5nOjB9KTthaj1ELmlubmVyV2lkdGgoKStmO3Y9RC5pbm5lckhlaWdodCgpO0Qud2lkdGgoYWopO1k9YignPGRpdiBjbGFzcz0ianNwUGFuZSIgLz4nKS5jc3MoInBhZGRpbmciLGFIKS5hcHBlbmQoRC5jaGlsZHJlbigpKTthbD1iKCc8ZGl2IGNsYXNzPSJqc3BDb250YWluZXIiIC8+JykuY3NzKHt3aWR0aDphaisicHgiLGhlaWdodDp2KyJweCJ9KS5hcHBlbmQoWSkuYXBwZW5kVG8oRCl9ZWxzZXtELmNzcygid2lkdGgiLCIiKTthTz1heS5zdGlja1RvQm90dG9tJiZLKCk7YUs9YXkuc3RpY2tUb1JpZ2h0JiZCKCk7YUo9RC5pbm5lcldpZHRoKCkrZiE9YWp8fEQub3V0ZXJIZWlnaHQoKSE9djtpZihhSil7YWo9RC5pbm5lcldpZHRoKCkrZjt2PUQuaW5uZXJIZWlnaHQoKTthbC5jc3Moe3dpZHRoOmFqKyJweCIsaGVpZ2h0OnYrInB4In0pfWlmKCFhSiYmTD09VCYmWS5vdXRlckhlaWdodCgpPT1aKXtELndpZHRoKGFqKTtyZXR1cm59TD1UO1kuY3NzKCJ3aWR0aCIsIiIpO0Qud2lkdGgoYWopO2FsLmZpbmQoIj4uanNwVmVydGljYWxCYXIsPi5qc3BIb3Jpem9udGFsQmFyIikucmVtb3ZlKCkuZW5kKCl9WS5jc3MoIm92ZXJmbG93IiwiYXV0byIpO2lmKGFRLmNvbnRlbnRXaWR0aCl7VD1hUS5jb250ZW50V2lkdGh9ZWxzZXtUPVlbMF0uc2Nyb2xsV2lkdGh9Wj1ZWzBdLnNjcm9sbEhlaWdodDtZLmNzcygib3ZlcmZsb3ciLCIiKTt5PVQvYWo7cT1aL3Y7YXo9cT4xO2FFPXk+MTtpZighKGFFfHxheikpe0QucmVtb3ZlQ2xhc3MoImpzcFNjcm9sbGFibGUiKTtZLmNzcyh7dG9wOjAsd2lkdGg6YWwud2lkdGgoKS1mfSk7bigpO0UoKTtSKCk7dygpfWVsc2V7RC5hZGRDbGFzcygianNwU2Nyb2xsYWJsZSIpO2FMPWF5Lm1haW50YWluUG9zaXRpb24mJihJfHxhYSk7aWYoYUwpe2FOPWFDKCk7YU09YUEoKX1hRigpO3ooKTtGKCk7aWYoYUwpe04oYUs/KFQtYWopOmFOLGZhbHNlKTtNKGFPPyhaLXYpOmFNLGZhbHNlKX1KKCk7YWcoKTthbigpO2lmKGF5LmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbil7UygpfWlmKGF5LmNsaWNrT25UcmFjayl7cCgpfUMoKTtpZihheS5oaWphY2tJbnRlcm5hbExpbmtzKXttKCl9fWlmKGF5LmF1dG9SZWluaXRpYWxpc2UmJiFhdil7YXY9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXthcihheSl9LGF5LmF1dG9SZWluaXRpYWxpc2VEZWxheSl9ZWxzZXtpZighYXkuYXV0b1JlaW5pdGlhbGlzZSYmYXYpe2NsZWFySW50ZXJ2YWwoYXYpfX1hSSYmRC5zY3JvbGxUb3AoMCkmJk0oYUksZmFsc2UpO2FQJiZELnNjcm9sbExlZnQoMCkmJk4oYVAsZmFsc2UpO0QudHJpZ2dlcigianNwLWluaXRpYWxpc2VkIixbYUV8fGF6XSl9ZnVuY3Rpb24gYUYoKXtpZihheil7YWwuYXBwZW5kKGIoJzxkaXYgY2xhc3M9ImpzcFZlcnRpY2FsQmFyIiAvPicpLmFwcGVuZChiKCc8ZGl2IGNsYXNzPSJqc3BDYXAganNwQ2FwVG9wIiAvPicpLGIoJzxkaXYgY2xhc3M9ImpzcFRyYWNrIiAvPicpLmFwcGVuZChiKCc8ZGl2IGNsYXNzPSJqc3BEcmFnIiAvPicpLmFwcGVuZChiKCc8ZGl2IGNsYXNzPSJqc3BEcmFnVG9wIiAvPicpLGIoJzxkaXYgY2xhc3M9ImpzcERyYWdCb3R0b20iIC8+JykpKSxiKCc8ZGl2IGNsYXNzPSJqc3BDYXAganNwQ2FwQm90dG9tIiAvPicpKSk7VT1hbC5maW5kKCI+LmpzcFZlcnRpY2FsQmFyIik7YXA9VS5maW5kKCI+LmpzcFRyYWNrIik7YXU9YXAuZmluZCgiPi5qc3BEcmFnIik7aWYoYXkuc2hvd0Fycm93cyl7YXE9YignPGEgY2xhc3M9ImpzcEFycm93IGpzcEFycm93VXAiIC8+JykuYmluZCgibW91c2Vkb3duLmpzcCIsYUQoMCwtMSkpLmJpbmQoImNsaWNrLmpzcCIsYUIpO2FmPWIoJzxhIGNsYXNzPSJqc3BBcnJvdyBqc3BBcnJvd0Rvd24iIC8+JykuYmluZCgibW91c2Vkb3duLmpzcCIsYUQoMCwxKSkuYmluZCgiY2xpY2suanNwIixhQik7aWYoYXkuYXJyb3dTY3JvbGxPbkhvdmVyKXthcS5iaW5kKCJtb3VzZW92ZXIuanNwIixhRCgwLC0xLGFxKSk7YWYuYmluZCgibW91c2VvdmVyLmpzcCIsYUQoMCwxLGFmKSl9YWsoYXAsYXkudmVydGljYWxBcnJvd1Bvc2l0aW9ucyxhcSxhZil9dD12O2FsLmZpbmQoIj4uanNwVmVydGljYWxCYXI+LmpzcENhcDp2aXNpYmxlLD4uanNwVmVydGljYWxCYXI+LmpzcEFycm93IikuZWFjaChmdW5jdGlvbigpe3QtPWIodGhpcykub3V0ZXJIZWlnaHQoKX0pO2F1LmhvdmVyKGZ1bmN0aW9uKCl7YXUuYWRkQ2xhc3MoImpzcEhvdmVyIil9LGZ1bmN0aW9uKCl7YXUucmVtb3ZlQ2xhc3MoImpzcEhvdmVyIil9KS5iaW5kKCJtb3VzZWRvd24uanNwIixmdW5jdGlvbihhSSl7YigiaHRtbCIpLmJpbmQoImRyYWdzdGFydC5qc3Agc2VsZWN0c3RhcnQuanNwIixhQik7YXUuYWRkQ2xhc3MoImpzcEFjdGl2ZSIpO3ZhciBzPWFJLnBhZ2VZLWF1LnBvc2l0aW9uKCkudG9wO2IoImh0bWwiKS5iaW5kKCJtb3VzZW1vdmUuanNwIixmdW5jdGlvbihhSil7VihhSi5wYWdlWS1zLGZhbHNlKX0pLmJpbmQoIm1vdXNldXAuanNwIG1vdXNlbGVhdmUuanNwIixhdyk7cmV0dXJuIGZhbHNlfSk7bygpfX1mdW5jdGlvbiBvKCl7YXAuaGVpZ2h0KHQrInB4Iik7ST0wO1g9YXkudmVydGljYWxHdXR0ZXIrYXAub3V0ZXJXaWR0aCgpO1kud2lkdGgoYWotWC1mKTt0cnl7aWYoVS5wb3NpdGlvbigpLmxlZnQ9PT0wKXtZLmNzcygibWFyZ2luLWxlZnQiLFgrInB4Iil9fWNhdGNoKHMpe319ZnVuY3Rpb24geigpe2lmKGFFKXthbC5hcHBlbmQoYignPGRpdiBjbGFzcz0ianNwSG9yaXpvbnRhbEJhciIgLz4nKS5hcHBlbmQoYignPGRpdiBjbGFzcz0ianNwQ2FwIGpzcENhcExlZnQiIC8+JyksYignPGRpdiBjbGFzcz0ianNwVHJhY2siIC8+JykuYXBwZW5kKGIoJzxkaXYgY2xhc3M9ImpzcERyYWciIC8+JykuYXBwZW5kKGIoJzxkaXYgY2xhc3M9ImpzcERyYWdMZWZ0IiAvPicpLGIoJzxkaXYgY2xhc3M9ImpzcERyYWdSaWdodCIgLz4nKSkpLGIoJzxkaXYgY2xhc3M9ImpzcENhcCBqc3BDYXBSaWdodCIgLz4nKSkpO2FtPWFsLmZpbmQoIj4uanNwSG9yaXpvbnRhbEJhciIpO0c9YW0uZmluZCgiPi5qc3BUcmFjayIpO2g9Ry5maW5kKCI+LmpzcERyYWciKTtpZihheS5zaG93QXJyb3dzKXtheD1iKCc8YSBjbGFzcz0ianNwQXJyb3cganNwQXJyb3dMZWZ0IiAvPicpLmJpbmQoIm1vdXNlZG93bi5qc3AiLGFEKC0xLDApKS5iaW5kKCJjbGljay5qc3AiLGFCKTt4PWIoJzxhIGNsYXNzPSJqc3BBcnJvdyBqc3BBcnJvd1JpZ2h0IiAvPicpLmJpbmQoIm1vdXNlZG93bi5qc3AiLGFEKDEsMCkpLmJpbmQoImNsaWNrLmpzcCIsYUIpOwotaWYoYXkuYXJyb3dTY3JvbGxPbkhvdmVyKXtheC5iaW5kKCJtb3VzZW92ZXIuanNwIixhRCgtMSwwLGF4KSk7eC5iaW5kKCJtb3VzZW92ZXIuanNwIixhRCgxLDAseCkpfWFrKEcsYXkuaG9yaXpvbnRhbEFycm93UG9zaXRpb25zLGF4LHgpfWguaG92ZXIoZnVuY3Rpb24oKXtoLmFkZENsYXNzKCJqc3BIb3ZlciIpfSxmdW5jdGlvbigpe2gucmVtb3ZlQ2xhc3MoImpzcEhvdmVyIil9KS5iaW5kKCJtb3VzZWRvd24uanNwIixmdW5jdGlvbihhSSl7YigiaHRtbCIpLmJpbmQoImRyYWdzdGFydC5qc3Agc2VsZWN0c3RhcnQuanNwIixhQik7aC5hZGRDbGFzcygianNwQWN0aXZlIik7dmFyIHM9YUkucGFnZVgtaC5wb3NpdGlvbigpLmxlZnQ7YigiaHRtbCIpLmJpbmQoIm1vdXNlbW92ZS5qc3AiLGZ1bmN0aW9uKGFKKXtXKGFKLnBhZ2VYLXMsZmFsc2UpfSkuYmluZCgibW91c2V1cC5qc3AgbW91c2VsZWF2ZS5qc3AiLGF3KTtyZXR1cm4gZmFsc2V9KTtsPWFsLmlubmVyV2lkdGgoKTthaCgpfX1mdW5jdGlvbiBhaCgpe2FsLmZpbmQoIj4uanNwSG9yaXpvbnRhbEJhcj4uanNwQ2FwOnZpc2libGUsPi5qc3BIb3Jpem9udGFsQmFyPi5qc3BBcnJvdyIpLmVhY2goZnVuY3Rpb24oKXtsLT1iKHRoaXMpLm91dGVyV2lkdGgoKX0pO0cud2lkdGgobCsicHgiKTthYT0wfWZ1bmN0aW9uIEYoKXtpZihhRSYmYXope3ZhciBhST1HLm91dGVySGVpZ2h0KCkscz1hcC5vdXRlcldpZHRoKCk7dC09YUk7YihhbSkuZmluZCgiPi5qc3BDYXA6dmlzaWJsZSw+LmpzcEFycm93IikuZWFjaChmdW5jdGlvbigpe2wrPWIodGhpcykub3V0ZXJXaWR0aCgpfSk7bC09czt2LT1zO2FqLT1hSTtHLnBhcmVudCgpLmFwcGVuZChiKCc8ZGl2IGNsYXNzPSJqc3BDb3JuZXIiIC8+JykuY3NzKCJ3aWR0aCIsYUkrInB4IikpO28oKTthaCgpfWlmKGFFKXtZLndpZHRoKChhbC5vdXRlcldpZHRoKCktZikrInB4Iil9Wj1ZLm91dGVySGVpZ2h0KCk7cT1aL3Y7aWYoYUUpe2F0PU1hdGguY2VpbCgxL3kqbCk7aWYoYXQ+YXkuaG9yaXpvbnRhbERyYWdNYXhXaWR0aCl7YXQ9YXkuaG9yaXpvbnRhbERyYWdNYXhXaWR0aH1lbHNle2lmKGF0PGF5Lmhvcml6b250YWxEcmFnTWluV2lkdGgpe2F0PWF5Lmhvcml6b250YWxEcmFnTWluV2lkdGh9fWgud2lkdGgoYXQrInB4Iik7aj1sLWF0O2FlKGFhKX1pZihheil7QT1NYXRoLmNlaWwoMS9xKnQpO2lmKEE+YXkudmVydGljYWxEcmFnTWF4SGVpZ2h0KXtBPWF5LnZlcnRpY2FsRHJhZ01heEhlaWdodH1lbHNle2lmKEE8YXkudmVydGljYWxEcmFnTWluSGVpZ2h0KXtBPWF5LnZlcnRpY2FsRHJhZ01pbkhlaWdodH19YXUuaGVpZ2h0KEErInB4Iik7aT10LUE7YWQoSSl9fWZ1bmN0aW9uIGFrKGFKLGFMLGFJLHMpe3ZhciBhTj0iYmVmb3JlIixhSz0iYWZ0ZXIiLGFNO2lmKGFMPT0ib3MiKXthTD0vTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSk/ImFmdGVyIjoic3BsaXQifWlmKGFMPT1hTil7YUs9YUx9ZWxzZXtpZihhTD09YUspe2FOPWFMO2FNPWFJO2FJPXM7cz1hTX19YUpbYU5dKGFJKVthS10ocyl9ZnVuY3Rpb24gYUQoYUkscyxhSil7cmV0dXJuIGZ1bmN0aW9uKCl7SChhSSxzLHRoaXMsYUopO3RoaXMuYmx1cigpO3JldHVybiBmYWxzZX19ZnVuY3Rpb24gSChhTCxhSyxhTyxhTil7YU89YihhTykuYWRkQ2xhc3MoImpzcEFjdGl2ZSIpO3ZhciBhTSxhSixhST10cnVlLHM9ZnVuY3Rpb24oKXtpZihhTCE9PTApe1Euc2Nyb2xsQnlYKGFMKmF5LmFycm93QnV0dG9uU3BlZWQpfWlmKGFLIT09MCl7US5zY3JvbGxCeVkoYUsqYXkuYXJyb3dCdXR0b25TcGVlZCl9YUo9c2V0VGltZW91dChzLGFJP2F5LmluaXRpYWxEZWxheTpheS5hcnJvd1JlcGVhdEZyZXEpO2FJPWZhbHNlfTtzKCk7YU09YU4/Im1vdXNlb3V0LmpzcCI6Im1vdXNldXAuanNwIjthTj1hTnx8YigiaHRtbCIpO2FOLmJpbmQoYU0sZnVuY3Rpb24oKXthTy5yZW1vdmVDbGFzcygianNwQWN0aXZlIik7YUomJmNsZWFyVGltZW91dChhSik7YUo9bnVsbDthTi51bmJpbmQoYU0pfSl9ZnVuY3Rpb24gcCgpe3coKTtpZihheil7YXAuYmluZCgibW91c2Vkb3duLmpzcCIsZnVuY3Rpb24oYU4pe2lmKGFOLm9yaWdpbmFsVGFyZ2V0PT09Y3x8YU4ub3JpZ2luYWxUYXJnZXQ9PWFOLmN1cnJlbnRUYXJnZXQpe3ZhciBhTD1iKHRoaXMpLGFPPWFMLm9mZnNldCgpLGFNPWFOLnBhZ2VZLWFPLnRvcC1JLGFKLGFJPXRydWUscz1mdW5jdGlvbigpe3ZhciBhUj1hTC5vZmZzZXQoKSxhUz1hTi5wYWdlWS1hUi50b3AtQS8yLGFQPXYqYXkuc2Nyb2xsUGFnZVBlcmNlbnQsYVE9aSphUC8oWi12KTtpZihhTTwwKXtpZihJLWFRPmFTKXtRLnNjcm9sbEJ5WSgtYVApfWVsc2V7VihhUyl9fWVsc2V7aWYoYU0+MCl7aWYoSSthUTxhUyl7US5zY3JvbGxCeVkoYVApfWVsc2V7VihhUyl9fWVsc2V7YUsoKTtyZXR1cm59fWFKPXNldFRpbWVvdXQocyxhST9heS5pbml0aWFsRGVsYXk6YXkudHJhY2tDbGlja1JlcGVhdEZyZXEpO2FJPWZhbHNlfSxhSz1mdW5jdGlvbigpe2FKJiZjbGVhclRpbWVvdXQoYUopO2FKPW51bGw7Yihkb2N1bWVudCkudW5iaW5kKCJtb3VzZXVwLmpzcCIsYUspfTtzKCk7Yihkb2N1bWVudCkuYmluZCgibW91c2V1cC5qc3AiLGFLKTtyZXR1cm4gZmFsc2V9fSl9aWYoYUUpe0cuYmluZCgibW91c2Vkb3duLmpzcCIsZnVuY3Rpb24oYU4pe2lmKGFOLm9yaWdpbmFsVGFyZ2V0PT09Y3x8YU4ub3JpZ2luYWxUYXJnZXQ9PWFOLmN1cnJlbnRUYXJnZXQpe3ZhciBhTD1iKHRoaXMpLGFPPWFMLm9mZnNldCgpLGFNPWFOLnBhZ2VYLWFPLmxlZnQtYWEsYUosYUk9dHJ1ZSxzPWZ1bmN0aW9uKCl7dmFyIGFSPWFMLm9mZnNldCgpLGFTPWFOLnBhZ2VYLWFSLmxlZnQtYXQvMixhUD1haipheS5zY3JvbGxQYWdlUGVyY2VudCxhUT1qKmFQLyhULWFqKTtpZihhTTwwKXtpZihhYS1hUT5hUyl7US5zY3JvbGxCeVgoLWFQKX1lbHNle1coYVMpfX1lbHNle2lmKGFNPjApe2lmKGFhK2FRPGFTKXtRLnNjcm9sbEJ5WChhUCl9ZWxzZXtXKGFTKX19ZWxzZXthSygpO3JldHVybn19YUo9c2V0VGltZW91dChzLGFJP2F5LmluaXRpYWxEZWxheTpheS50cmFja0NsaWNrUmVwZWF0RnJlcSk7YUk9ZmFsc2V9LGFLPWZ1bmN0aW9uKCl7YUomJmNsZWFyVGltZW91dChhSik7YUo9bnVsbDtiKGRvY3VtZW50KS51bmJpbmQoIm1vdXNldXAuanNwIixhSyl9O3MoKTtiKGRvY3VtZW50KS5iaW5kKCJtb3VzZXVwLmpzcCIsYUspO3JldHVybiBmYWxzZX19KX19ZnVuY3Rpb24gdygpe2lmKEcpe0cudW5iaW5kKCJtb3VzZWRvd24uanNwIil9aWYoYXApe2FwLnVuYmluZCgibW91c2Vkb3duLmpzcCIpfX1mdW5jdGlvbiBhdygpe2IoImh0bWwiKS51bmJpbmQoImRyYWdzdGFydC5qc3Agc2VsZWN0c3RhcnQuanNwIG1vdXNlbW92ZS5qc3AgbW91c2V1cC5qc3AgbW91c2VsZWF2ZS5qc3AiKTtpZihhdSl7YXUucmVtb3ZlQ2xhc3MoImpzcEFjdGl2ZSIpfWlmKGgpe2gucmVtb3ZlQ2xhc3MoImpzcEFjdGl2ZSIpfX1mdW5jdGlvbiBWKHMsYUkpe2lmKCFheil7cmV0dXJufWlmKHM8MCl7cz0wfWVsc2V7aWYocz5pKXtzPWl9fWlmKGFJPT09Yyl7YUk9YXkuYW5pbWF0ZVNjcm9sbH1pZihhSSl7US5hbmltYXRlKGF1LCJ0b3AiLHMsYWQpfWVsc2V7YXUuY3NzKCJ0b3AiLHMpO2FkKHMpfX1mdW5jdGlvbiBhZChhSSl7aWYoYUk9PT1jKXthST1hdS5wb3NpdGlvbigpLnRvcH1hbC5zY3JvbGxUb3AoMCk7ST1hSTt2YXIgYUw9ST09PTAsYUo9ST09aSxhSz1hSS9pLHM9LWFLKihaLXYpO2lmKGFpIT1hTHx8YUchPWFKKXthaT1hTDthRz1hSjtELnRyaWdnZXIoImpzcC1hcnJvdy1jaGFuZ2UiLFthaSxhRyxQLGtdKX11KGFMLGFKKTtZLmNzcygidG9wIixzKTtELnRyaWdnZXIoImpzcC1zY3JvbGwteSIsWy1zLGFMLGFKXSkudHJpZ2dlcigic2Nyb2xsIil9ZnVuY3Rpb24gVyhhSSxzKXtpZighYUUpe3JldHVybn1pZihhSTwwKXthST0wfWVsc2V7aWYoYUk+ail7YUk9an19aWYocz09PWMpe3M9YXkuYW5pbWF0ZVNjcm9sbH1pZihzKXtRLmFuaW1hdGUoaCwibGVmdCIsYUksYWUpCi19ZWxzZXtoLmNzcygibGVmdCIsYUkpO2FlKGFJKX19ZnVuY3Rpb24gYWUoYUkpe2lmKGFJPT09Yyl7YUk9aC5wb3NpdGlvbigpLmxlZnR9YWwuc2Nyb2xsVG9wKDApO2FhPWFJO3ZhciBhTD1hYT09PTAsYUs9YWE9PWosYUo9YUkvaixzPS1hSiooVC1haik7aWYoUCE9YUx8fGshPWFLKXtQPWFMO2s9YUs7RC50cmlnZ2VyKCJqc3AtYXJyb3ctY2hhbmdlIixbYWksYUcsUCxrXSl9cihhTCxhSyk7WS5jc3MoImxlZnQiLHMpO0QudHJpZ2dlcigianNwLXNjcm9sbC14IixbLXMsYUwsYUtdKS50cmlnZ2VyKCJzY3JvbGwiKX1mdW5jdGlvbiB1KGFJLHMpe2lmKGF5LnNob3dBcnJvd3Mpe2FxW2FJPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oImpzcERpc2FibGVkIik7YWZbcz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKCJqc3BEaXNhYmxlZCIpfX1mdW5jdGlvbiByKGFJLHMpe2lmKGF5LnNob3dBcnJvd3Mpe2F4W2FJPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oImpzcERpc2FibGVkIik7eFtzPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oImpzcERpc2FibGVkIil9fWZ1bmN0aW9uIE0ocyxhSSl7dmFyIGFKPXMvKFotdik7VihhSippLGFJKX1mdW5jdGlvbiBOKGFJLHMpe3ZhciBhSj1hSS8oVC1haik7VyhhSipqLHMpfWZ1bmN0aW9uIGFiKGFWLGFRLGFKKXt2YXIgYU4sYUssYUwscz0wLGFVPTAsYUksYVAsYU8sYVMsYVIsYVQ7dHJ5e2FOPWIoYVYpfWNhdGNoKGFNKXtyZXR1cm59YUs9YU4ub3V0ZXJIZWlnaHQoKTthTD1hTi5vdXRlcldpZHRoKCk7YWwuc2Nyb2xsVG9wKDApO2FsLnNjcm9sbExlZnQoMCk7d2hpbGUoIWFOLmlzKCIuanNwUGFuZSIpKXtzKz1hTi5wb3NpdGlvbigpLnRvcDthVSs9YU4ucG9zaXRpb24oKS5sZWZ0O2FOPWFOLm9mZnNldFBhcmVudCgpO2lmKC9eYm9keXxodG1sJC9pLnRlc3QoYU5bMF0ubm9kZU5hbWUpKXtyZXR1cm59fWFJPWFBKCk7YU89YUkrdjtpZihzPGFJfHxhUSl7YVI9cy1heS52ZXJ0aWNhbEd1dHRlcn1lbHNle2lmKHMrYUs+YU8pe2FSPXMtdithSytheS52ZXJ0aWNhbEd1dHRlcn19aWYoYVIpe00oYVIsYUopfWFQPWFDKCk7YVM9YVArYWo7aWYoYVU8YVB8fGFRKXthVD1hVS1heS5ob3Jpem9udGFsR3V0dGVyfWVsc2V7aWYoYVUrYUw+YVMpe2FUPWFVLWFqK2FMK2F5Lmhvcml6b250YWxHdXR0ZXJ9fWlmKGFUKXtOKGFULGFKKX19ZnVuY3Rpb24gYUMoKXtyZXR1cm4gLVkucG9zaXRpb24oKS5sZWZ0fWZ1bmN0aW9uIGFBKCl7cmV0dXJuIC1ZLnBvc2l0aW9uKCkudG9wfWZ1bmN0aW9uIEsoKXt2YXIgcz1aLXY7cmV0dXJuKHM+MjApJiYocy1hQSgpPDEwKX1mdW5jdGlvbiBCKCl7dmFyIHM9VC1hajtyZXR1cm4ocz4yMCkmJihzLWFDKCk8MTApfWZ1bmN0aW9uIGFnKCl7YWwudW5iaW5kKGFjKS5iaW5kKGFjLGZ1bmN0aW9uKGFMLGFNLGFLLGFJKXt2YXIgYUo9YWEscz1JO1Euc2Nyb2xsQnkoYUsqYXkubW91c2VXaGVlbFNwZWVkLC1hSSpheS5tb3VzZVdoZWVsU3BlZWQsZmFsc2UpO3JldHVybiBhSj09YWEmJnM9PUl9KX1mdW5jdGlvbiBuKCl7YWwudW5iaW5kKGFjKX1mdW5jdGlvbiBhQigpe3JldHVybiBmYWxzZX1mdW5jdGlvbiBKKCl7WS5maW5kKCI6aW5wdXQsYSIpLnVuYmluZCgiZm9jdXMuanNwIikuYmluZCgiZm9jdXMuanNwIixmdW5jdGlvbihzKXthYihzLnRhcmdldCxmYWxzZSl9KX1mdW5jdGlvbiBFKCl7WS5maW5kKCI6aW5wdXQsYSIpLnVuYmluZCgiZm9jdXMuanNwIil9ZnVuY3Rpb24gUygpe3ZhciBzLGFJLGFLPVtdO2FFJiZhSy5wdXNoKGFtWzBdKTtheiYmYUsucHVzaChVWzBdKTtZLmZvY3VzKGZ1bmN0aW9uKCl7RC5mb2N1cygpfSk7RC5hdHRyKCJ0YWJpbmRleCIsMCkudW5iaW5kKCJrZXlkb3duLmpzcCBrZXlwcmVzcy5qc3AiKS5iaW5kKCJrZXlkb3duLmpzcCIsZnVuY3Rpb24oYU4pe2lmKGFOLnRhcmdldCE9PXRoaXMmJiEoYUsubGVuZ3RoJiZiKGFOLnRhcmdldCkuY2xvc2VzdChhSykubGVuZ3RoKSl7cmV0dXJufXZhciBhTT1hYSxhTD1JO3N3aXRjaChhTi5rZXlDb2RlKXtjYXNlIDQwOmNhc2UgMzg6Y2FzZSAzNDpjYXNlIDMyOmNhc2UgMzM6Y2FzZSAzOTpjYXNlIDM3OnM9YU4ua2V5Q29kZTthSigpO2JyZWFrO2Nhc2UgMzU6TShaLXYpO3M9bnVsbDticmVhaztjYXNlIDM2Ok0oMCk7cz1udWxsO2JyZWFrfWFJPWFOLmtleUNvZGU9PXMmJmFNIT1hYXx8YUwhPUk7cmV0dXJuICFhSX0pLmJpbmQoImtleXByZXNzLmpzcCIsZnVuY3Rpb24oYUwpe2lmKGFMLmtleUNvZGU9PXMpe2FKKCl9cmV0dXJuICFhSX0pO2lmKGF5LmhpZGVGb2N1cyl7RC5jc3MoIm91dGxpbmUiLCJub25lIik7aWYoImhpZGVGb2N1cyIgaW4gYWxbMF0pe0QuYXR0cigiaGlkZUZvY3VzIix0cnVlKX19ZWxzZXtELmNzcygib3V0bGluZSIsIiIpO2lmKCJoaWRlRm9jdXMiIGluIGFsWzBdKXtELmF0dHIoImhpZGVGb2N1cyIsZmFsc2UpfX1mdW5jdGlvbiBhSigpe3ZhciBhTT1hYSxhTD1JO3N3aXRjaChzKXtjYXNlIDQwOlEuc2Nyb2xsQnlZKGF5LmtleWJvYXJkU3BlZWQsZmFsc2UpO2JyZWFrO2Nhc2UgMzg6US5zY3JvbGxCeVkoLWF5LmtleWJvYXJkU3BlZWQsZmFsc2UpO2JyZWFrO2Nhc2UgMzQ6Y2FzZSAzMjpRLnNjcm9sbEJ5WSh2KmF5LnNjcm9sbFBhZ2VQZXJjZW50LGZhbHNlKTticmVhaztjYXNlIDMzOlEuc2Nyb2xsQnlZKC12KmF5LnNjcm9sbFBhZ2VQZXJjZW50LGZhbHNlKTticmVhaztjYXNlIDM5OlEuc2Nyb2xsQnlYKGF5LmtleWJvYXJkU3BlZWQsZmFsc2UpO2JyZWFrO2Nhc2UgMzc6US5zY3JvbGxCeVgoLWF5LmtleWJvYXJkU3BlZWQsZmFsc2UpO2JyZWFrfWFJPWFNIT1hYXx8YUwhPUk7cmV0dXJuIGFJfX1mdW5jdGlvbiBSKCl7RC5hdHRyKCJ0YWJpbmRleCIsIi0xIikucmVtb3ZlQXR0cigidGFiaW5kZXgiKS51bmJpbmQoImtleWRvd24uanNwIGtleXByZXNzLmpzcCIpfWZ1bmN0aW9uIEMoKXtpZihsb2NhdGlvbi5oYXNoJiZsb2NhdGlvbi5oYXNoLmxlbmd0aD4xKXt2YXIgYUssYUksYUo9ZXNjYXBlKGxvY2F0aW9uLmhhc2guc3Vic3RyKDEpKTt0cnl7YUs9YigiIyIrYUorJywgYVtuYW1lPSInK2FKKyciXScpfWNhdGNoKHMpe3JldHVybn1pZihhSy5sZW5ndGgmJlkuZmluZChhSikpe2lmKGFsLnNjcm9sbFRvcCgpPT09MCl7YUk9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtpZihhbC5zY3JvbGxUb3AoKT4wKXthYihhSyx0cnVlKTtiKGRvY3VtZW50KS5zY3JvbGxUb3AoYWwucG9zaXRpb24oKS50b3ApO2NsZWFySW50ZXJ2YWwoYUkpfX0sNTApfWVsc2V7YWIoYUssdHJ1ZSk7Yihkb2N1bWVudCkuc2Nyb2xsVG9wKGFsLnBvc2l0aW9uKCkudG9wKX19fX1mdW5jdGlvbiBtKCl7aWYoYihkb2N1bWVudC5ib2R5KS5kYXRhKCJqc3BIaWphY2siKSl7cmV0dXJufWIoZG9jdW1lbnQuYm9keSkuZGF0YSgianNwSGlqYWNrIix0cnVlKTtiKGRvY3VtZW50LmJvZHkpLmRlbGVnYXRlKCJhW2hyZWYqPSNdIiwiY2xpY2siLGZ1bmN0aW9uKHMpe3ZhciBhST10aGlzLmhyZWYuc3Vic3RyKDAsdGhpcy5ocmVmLmluZGV4T2YoIiMiKSksYUs9bG9jYXRpb24uaHJlZixhTyxhUCxhSixhTSxhTCxhTjtpZihsb2NhdGlvbi5ocmVmLmluZGV4T2YoIiMiKSE9PS0xKXthSz1sb2NhdGlvbi5ocmVmLnN1YnN0cigwLGxvY2F0aW9uLmhyZWYuaW5kZXhPZigiIyIpKX1pZihhSSE9PWFLKXtyZXR1cm59YU89ZXNjYXBlKHRoaXMuaHJlZi5zdWJzdHIodGhpcy5ocmVmLmluZGV4T2YoIiMiKSsxKSk7YVA7dHJ5e2FQPWIoIiMiK2FPKycsIGFbbmFtZT0iJythTysnIl0nKX1jYXRjaChhUSl7cmV0dXJufWlmKCFhUC5sZW5ndGgpe3JldHVybn1hSj1hUC5jbG9zZXN0KCIuanNwU2Nyb2xsYWJsZSIpO2FNPWFKLmRhdGEoImpzcCIpO2FNLnNjcm9sbFRvRWxlbWVudChhUCx0cnVlKTtpZihhSlswXS5zY3JvbGxJbnRvVmlldyl7YUw9YihhKS5zY3JvbGxUb3AoKTthTj1hUC5vZmZzZXQoKS50b3A7aWYoYU48YUx8fGFOPmFMK2IoYSkuaGVpZ2h0KCkpe2FKWzBdLnNjcm9sbEludG9WaWV3KCl9fXMucHJldmVudERlZmF1bHQoKQotfSl9ZnVuY3Rpb24gYW4oKXt2YXIgYUosYUksYUwsYUssYU0scz1mYWxzZTthbC51bmJpbmQoInRvdWNoc3RhcnQuanNwIHRvdWNobW92ZS5qc3AgdG91Y2hlbmQuanNwIGNsaWNrLmpzcC10b3VjaGNsaWNrIikuYmluZCgidG91Y2hzdGFydC5qc3AiLGZ1bmN0aW9uKGFOKXt2YXIgYU89YU4ub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdO2FKPWFDKCk7YUk9YUEoKTthTD1hTy5wYWdlWDthSz1hTy5wYWdlWTthTT1mYWxzZTtzPXRydWV9KS5iaW5kKCJ0b3VjaG1vdmUuanNwIixmdW5jdGlvbihhUSl7aWYoIXMpe3JldHVybn12YXIgYVA9YVEub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLGFPPWFhLGFOPUk7US5zY3JvbGxUbyhhSithTC1hUC5wYWdlWCxhSSthSy1hUC5wYWdlWSk7YU09YU18fE1hdGguYWJzKGFMLWFQLnBhZ2VYKT41fHxNYXRoLmFicyhhSy1hUC5wYWdlWSk+NTtyZXR1cm4gYU89PWFhJiZhTj09SX0pLmJpbmQoInRvdWNoZW5kLmpzcCIsZnVuY3Rpb24oYU4pe3M9ZmFsc2V9KS5iaW5kKCJjbGljay5qc3AtdG91Y2hjbGljayIsZnVuY3Rpb24oYU4pe2lmKGFNKXthTT1mYWxzZTtyZXR1cm4gZmFsc2V9fSl9ZnVuY3Rpb24gZygpe3ZhciBzPWFBKCksYUk9YUMoKTtELnJlbW92ZUNsYXNzKCJqc3BTY3JvbGxhYmxlIikudW5iaW5kKCIuanNwIik7RC5yZXBsYWNlV2l0aChhby5hcHBlbmQoWS5jaGlsZHJlbigpKSk7YW8uc2Nyb2xsVG9wKHMpO2FvLnNjcm9sbExlZnQoYUkpO2lmKGF2KXtjbGVhckludGVydmFsKGF2KX19Yi5leHRlbmQoUSx7cmVpbml0aWFsaXNlOmZ1bmN0aW9uKGFJKXthST1iLmV4dGVuZCh7fSxheSxhSSk7YXIoYUkpfSxzY3JvbGxUb0VsZW1lbnQ6ZnVuY3Rpb24oYUosYUkscyl7YWIoYUosYUkscyl9LHNjcm9sbFRvOmZ1bmN0aW9uKGFKLHMsYUkpe04oYUosYUkpO00ocyxhSSl9LHNjcm9sbFRvWDpmdW5jdGlvbihhSSxzKXtOKGFJLHMpfSxzY3JvbGxUb1k6ZnVuY3Rpb24ocyxhSSl7TShzLGFJKX0sc2Nyb2xsVG9QZXJjZW50WDpmdW5jdGlvbihhSSxzKXtOKGFJKihULWFqKSxzKX0sc2Nyb2xsVG9QZXJjZW50WTpmdW5jdGlvbihhSSxzKXtNKGFJKihaLXYpLHMpfSxzY3JvbGxCeTpmdW5jdGlvbihhSSxzLGFKKXtRLnNjcm9sbEJ5WChhSSxhSik7US5zY3JvbGxCeVkocyxhSil9LHNjcm9sbEJ5WDpmdW5jdGlvbihzLGFKKXt2YXIgYUk9YUMoKStNYXRoW3M8MD8iZmxvb3IiOiJjZWlsIl0ocyksYUs9YUkvKFQtYWopO1coYUsqaixhSil9LHNjcm9sbEJ5WTpmdW5jdGlvbihzLGFKKXt2YXIgYUk9YUEoKStNYXRoW3M8MD8iZmxvb3IiOiJjZWlsIl0ocyksYUs9YUkvKFotdik7VihhSyppLGFKKX0scG9zaXRpb25EcmFnWDpmdW5jdGlvbihzLGFJKXtXKHMsYUkpfSxwb3NpdGlvbkRyYWdZOmZ1bmN0aW9uKGFJLHMpe1YoYUkscyl9LGFuaW1hdGU6ZnVuY3Rpb24oYUksYUwscyxhSyl7dmFyIGFKPXt9O2FKW2FMXT1zO2FJLmFuaW1hdGUoYUose2R1cmF0aW9uOmF5LmFuaW1hdGVEdXJhdGlvbixlYXNpbmc6YXkuYW5pbWF0ZUVhc2UscXVldWU6ZmFsc2Usc3RlcDphS30pfSxnZXRDb250ZW50UG9zaXRpb25YOmZ1bmN0aW9uKCl7cmV0dXJuIGFDKCl9LGdldENvbnRlbnRQb3NpdGlvblk6ZnVuY3Rpb24oKXtyZXR1cm4gYUEoKX0sZ2V0Q29udGVudFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIFR9LGdldENvbnRlbnRIZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gWn0sZ2V0UGVyY2VudFNjcm9sbGVkWDpmdW5jdGlvbigpe3JldHVybiBhQygpLyhULWFqKX0sZ2V0UGVyY2VudFNjcm9sbGVkWTpmdW5jdGlvbigpe3JldHVybiBhQSgpLyhaLXYpfSxnZXRJc1Njcm9sbGFibGVIOmZ1bmN0aW9uKCl7cmV0dXJuIGFFfSxnZXRJc1Njcm9sbGFibGVWOmZ1bmN0aW9uKCl7cmV0dXJuIGF6fSxnZXRDb250ZW50UGFuZTpmdW5jdGlvbigpe3JldHVybiBZfSxzY3JvbGxUb0JvdHRvbTpmdW5jdGlvbihzKXtWKGkscyl9LGhpamFja0ludGVybmFsTGlua3M6Yi5ub29wLGRlc3Ryb3k6ZnVuY3Rpb24oKXtnKCl9fSk7YXIoTyl9ZT1iLmV4dGVuZCh7fSxiLmZuLmpTY3JvbGxQYW5lLmRlZmF1bHRzLGUpO2IuZWFjaChbIm1vdXNlV2hlZWxTcGVlZCIsImFycm93QnV0dG9uU3BlZWQiLCJ0cmFja0NsaWNrU3BlZWQiLCJrZXlib2FyZFNwZWVkIl0sZnVuY3Rpb24oKXtlW3RoaXNdPWVbdGhpc118fGUuc3BlZWR9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGY9Yih0aGlzKSxnPWYuZGF0YSgianNwIik7aWYoZyl7Zy5yZWluaXRpYWxpc2UoZSl9ZWxzZXtiKCJzY3JpcHQiLGYpLmZpbHRlcignW3R5cGU9InRleHQvamF2YXNjcmlwdCJdLDpub3QoW3R5cGVdKScpLnJlbW92ZSgpO2c9bmV3IGQoZixlKTtmLmRhdGEoImpzcCIsZyl9fSl9O2IuZm4ualNjcm9sbFBhbmUuZGVmYXVsdHM9e3Nob3dBcnJvd3M6ZmFsc2UsbWFpbnRhaW5Qb3NpdGlvbjp0cnVlLHN0aWNrVG9Cb3R0b206ZmFsc2Usc3RpY2tUb1JpZ2h0OmZhbHNlLGNsaWNrT25UcmFjazp0cnVlLGF1dG9SZWluaXRpYWxpc2U6ZmFsc2UsYXV0b1JlaW5pdGlhbGlzZURlbGF5OjUwMCx2ZXJ0aWNhbERyYWdNaW5IZWlnaHQ6MCx2ZXJ0aWNhbERyYWdNYXhIZWlnaHQ6OTk5OTksaG9yaXpvbnRhbERyYWdNaW5XaWR0aDowLGhvcml6b250YWxEcmFnTWF4V2lkdGg6OTk5OTksY29udGVudFdpZHRoOmMsYW5pbWF0ZVNjcm9sbDpmYWxzZSxhbmltYXRlRHVyYXRpb246MzAwLGFuaW1hdGVFYXNlOiJsaW5lYXIiLGhpamFja0ludGVybmFsTGlua3M6ZmFsc2UsdmVydGljYWxHdXR0ZXI6NCxob3Jpem9udGFsR3V0dGVyOjQsbW91c2VXaGVlbFNwZWVkOjAsYXJyb3dCdXR0b25TcGVlZDowLGFycm93UmVwZWF0RnJlcTo1MCxhcnJvd1Njcm9sbE9uSG92ZXI6ZmFsc2UsdHJhY2tDbGlja1NwZWVkOjAsdHJhY2tDbGlja1JlcGVhdEZyZXE6NzAsdmVydGljYWxBcnJvd1Bvc2l0aW9uczoic3BsaXQiLGhvcml6b250YWxBcnJvd1Bvc2l0aW9uczoic3BsaXQiLGVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbjp0cnVlLGhpZGVGb2N1czpmYWxzZSxrZXlib2FyZFNwZWVkOjAsaW5pdGlhbERlbGF5OjMwMCxzcGVlZDozMCxzY3JvbGxQYWdlUGVyY2VudDowLjh9fSkoalF1ZXJ5LHRoaXMpOwotCi0vL3RoaXJkX3BhcnR5L2phdmFzY3JpcHQvanF1ZXJ5X21vdXNld2hlZWwvanF1ZXJ5Lm1vdXNld2hlZWwubWluLmpzCi0vKioKLSAqIEBsaWNlbnNlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgQnJhbmRvbiBBYXJvbiAoaHR0cDovL2JyYW5kb25hYXJvbi5uZXQpCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKExJQ0VOU0UudHh0KS4KLSAqCi0gKiBUaGFua3MgdG86IGh0dHA6Ly9hZG9tYXMub3JnL2phdmFzY3JpcHQtbW91c2Utd2hlZWwvIGZvciBzb21lIHBvaW50ZXJzLgotICogVGhhbmtzIHRvOiBNYXRoaWFzIEJhbmsoaHR0cDovL3d3dy5tYXRoaWFzLWJhbmsuZGUpIGZvciBhIHNjb3BlIGJ1ZyBmaXguCi0gKiBUaGFua3MgdG86IFNlYW11cyBMZWFoeSBmb3IgYWRkaW5nIGRlbHRhWCBhbmQgZGVsdGFZCi0gKgotICogVmVyc2lvbjogMy4wLjYKLSAqIAotICogUmVxdWlyZXM6IDEuMi4yKwotICovCi0oZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZChiKXt2YXIgYz1ifHx3aW5kb3cuZXZlbnQsZD1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxlPTAsZj0hMCxnPTAsaD0wO3JldHVybiBiPWEuZXZlbnQuZml4KGMpLGIudHlwZT0ibW91c2V3aGVlbCIsYy53aGVlbERlbHRhJiYoZT1jLndoZWVsRGVsdGEvMTIwKSxjLmRldGFpbCYmKGU9LWMuZGV0YWlsLzMpLGg9ZSxjLmF4aXMhPT11bmRlZmluZWQmJmMuYXhpcz09PWMuSE9SSVpPTlRBTF9BWElTJiYoaD0wLGc9LTEqZSksYy53aGVlbERlbHRhWSE9PXVuZGVmaW5lZCYmKGg9Yy53aGVlbERlbHRhWS8xMjApLGMud2hlZWxEZWx0YVghPT11bmRlZmluZWQmJihnPS0xKmMud2hlZWxEZWx0YVgvMTIwKSxkLnVuc2hpZnQoYixlLGcsaCksKGEuZXZlbnQuZGlzcGF0Y2h8fGEuZXZlbnQuaGFuZGxlKS5hcHBseSh0aGlzLGQpfXZhciBiPVsiRE9NTW91c2VTY3JvbGwiLCJtb3VzZXdoZWVsIl07aWYoYS5ldmVudC5maXhIb29rcylmb3IodmFyIGM9Yi5sZW5ndGg7YzspYS5ldmVudC5maXhIb29rc1tiWy0tY11dPWEuZXZlbnQubW91c2VIb29rczthLmV2ZW50LnNwZWNpYWwubW91c2V3aGVlbD17c2V0dXA6ZnVuY3Rpb24oKXtpZih0aGlzLmFkZEV2ZW50TGlzdGVuZXIpZm9yKHZhciBhPWIubGVuZ3RoO2E7KXRoaXMuYWRkRXZlbnRMaXN0ZW5lcihiWy0tYV0sZCwhMSk7ZWxzZSB0aGlzLm9ubW91c2V3aGVlbD1kfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcilmb3IodmFyIGE9Yi5sZW5ndGg7YTspdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGJbLS1hXSxkLCExKTtlbHNlIHRoaXMub25tb3VzZXdoZWVsPW51bGx9fSxhLmZuLmV4dGVuZCh7bW91c2V3aGVlbDpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmJpbmQoIm1vdXNld2hlZWwiLGEpOnRoaXMudHJpZ2dlcigibW91c2V3aGVlbCIpfSx1bm1vdXNld2hlZWw6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudW5iaW5kKCJtb3VzZXdoZWVsIixhKX19KX0pKGpRdWVyeSk7Ci0KLS8vdGhpcmRfcGFydHkvamF2YXNjcmlwdC9qcXVlcnlfdWkvdjFfOF8yMy9qcy9qcXVlcnktdWktMS44LjIzLmN1c3RvbS5taW4uanMKLS8qKgotICogalF1ZXJ5IFVJCi0gKiBAdmVyc2lvbiAxLjguMjMKLSAqIEBkYXRlIDIwMTItMDgtMTUKLSAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0gKiBJbmNsdWRlczoganF1ZXJ5LnVpLmNvcmUuanMKLSAqIENvcHlyaWdodCAyMDEyLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKLSAqIEBsaWNlbnNlIE1JVCAoRHVhbCBsaWNlbnNlZCB3aXRoIEdQTCBWZXJzaW9uIDIgbGljZW5zZSkuCi0gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCi0gKi8KLShmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYixjKXt2YXIgZT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoImFyZWEiPT09ZSl7dmFyIGY9Yi5wYXJlbnROb2RlLGc9Zi5uYW1lLGg7cmV0dXJuIWIuaHJlZnx8IWd8fGYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJtYXAiPyExOihoPWEoImltZ1t1c2VtYXA9IyIrZysiXSIpWzBdLCEhaCYmZChoKSl9cmV0dXJuKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdC8udGVzdChlKT8hYi5kaXNhYmxlZDoiYSI9PWU/Yi5ocmVmfHxjOmMpJiZkKGIpfWZ1bmN0aW9uIGQoYil7cmV0dXJuIWEoYikucGFyZW50cygpLmFuZFNlbGYoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gYS5jdXJDU1ModGhpcywidmlzaWJpbGl0eSIpPT09ImhpZGRlbiJ8fGEuZXhwci5maWx0ZXJzLmhpZGRlbih0aGlzKX0pLmxlbmd0aH1hLnVpPWEudWl8fHt9O2lmKGEudWkudmVyc2lvbilyZXR1cm47YS5leHRlbmQoYS51aSx7dmVyc2lvbjoiMS44LjIzIixrZXlDb2RlOntBTFQ6MTgsQkFDS1NQQUNFOjgsQ0FQU19MT0NLOjIwLENPTU1BOjE4OCxDT01NQU5EOjkxLENPTU1BTkRfTEVGVDo5MSxDT01NQU5EX1JJR0hUOjkzLENPTlRST0w6MTcsREVMRVRFOjQ2LERPV046NDAsRU5EOjM1LEVOVEVSOjEzLEVTQ0FQRToyNyxIT01FOjM2LElOU0VSVDo0NSxMRUZUOjM3LE1FTlU6OTMsTlVNUEFEX0FERDoxMDcsTlVNUEFEX0RFQ0lNQUw6MTEwLE5VTVBBRF9ESVZJREU6MTExLE5VTVBBRF9FTlRFUjoxMDgsTlVNUEFEX01VTFRJUExZOjEwNixOVU1QQURfU1VCVFJBQ1Q6MTA5LFBBR0VfRE9XTjozNCxQQUdFX1VQOjMzLFBFUklPRDoxOTAsUklHSFQ6MzksU0hJRlQ6MTYsU1BBQ0U6MzIsVEFCOjksVVA6MzgsV0lORE9XUzo5MX19KSxhLmZuLmV4dGVuZCh7cHJvcEF0dHI6YS5mbi5wcm9wfHxhLmZuLmF0dHIsX2ZvY3VzOmEuZm4uZm9jdXMsZm9jdXM6ZnVuY3Rpb24oYixjKXtyZXR1cm4gdHlwZW9mIGI9PSJudW1iZXIiP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2EoZCkuZm9jdXMoKSxjJiZjLmNhbGwoZCl9LGIpfSk6dGhpcy5fZm9jdXMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzY3JvbGxQYXJlbnQ6ZnVuY3Rpb24oKXt2YXIgYjtyZXR1cm4gYS5icm93c2VyLm1zaWUmJi8oc3RhdGljfHJlbGF0aXZlKS8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSl8fC9hYnNvbHV0ZS8udGVzdCh0aGlzLmNzcygicG9zaXRpb24iKSk/Yj10aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKHJlbGF0aXZlfGFic29sdXRlfGZpeGVkKS8udGVzdChhLmN1ckNTUyh0aGlzLCJwb3NpdGlvbiIsMSkpJiYvKGF1dG98c2Nyb2xsKS8udGVzdChhLmN1ckNTUyh0aGlzLCJvdmVyZmxvdyIsMSkrYS5jdXJDU1ModGhpcywib3ZlcmZsb3cteSIsMSkrYS5jdXJDU1ModGhpcywib3ZlcmZsb3cteCIsMSkpfSkuZXEoMCk6Yj10aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKGF1dG98c2Nyb2xsKS8udGVzdChhLmN1ckNTUyh0aGlzLCJvdmVyZmxvdyIsMSkrYS5jdXJDU1ModGhpcywib3ZlcmZsb3cteSIsMSkrYS5jdXJDU1ModGhpcywib3ZlcmZsb3cteCIsMSkpfSkuZXEoMCksL2ZpeGVkLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8IWIubGVuZ3RoP2EoZG9jdW1lbnQpOmJ9LHpJbmRleDpmdW5jdGlvbihjKXtpZihjIT09YilyZXR1cm4gdGhpcy5jc3MoInpJbmRleCIsYyk7aWYodGhpcy5sZW5ndGgpe3ZhciBkPWEodGhpc1swXSksZSxmO3doaWxlKGQubGVuZ3RoJiZkWzBdIT09ZG9jdW1lbnQpe2U9ZC5jc3MoInBvc2l0aW9uIik7aWYoZT09PSJhYnNvbHV0ZSJ8fGU9PT0icmVsYXRpdmUifHxlPT09ImZpeGVkIil7Zj1wYXJzZUludChkLmNzcygiekluZGV4IiksMTApO2lmKCFpc05hTihmKSYmZiE9PTApcmV0dXJuIGZ9ZD1kLnBhcmVudCgpfX1yZXR1cm4gMH0sZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmQoKGEuc3VwcG9ydC5zZWxlY3RzdGFydD8ic2VsZWN0c3RhcnQiOiJtb3VzZWRvd24iKSsiLnVpLWRpc2FibGVTZWxlY3Rpb24iLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX0pfSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmQoIi51aS1kaXNhYmxlU2VsZWN0aW9uIil9fSksYSgiPGE+Iikub3V0ZXJXaWR0aCgxKS5qcXVlcnl8fGEuZWFjaChbIldpZHRoIiwiSGVpZ2h0Il0sZnVuY3Rpb24oYyxkKXtmdW5jdGlvbiBoKGIsYyxkLGYpe3JldHVybiBhLmVhY2goZSxmdW5jdGlvbigpe2MtPXBhcnNlRmxvYXQoYS5jdXJDU1MoYiwicGFkZGluZyIrdGhpcywhMCkpfHwwLGQmJihjLT1wYXJzZUZsb2F0KGEuY3VyQ1NTKGIsImJvcmRlciIrdGhpcysiV2lkdGgiLCEwKSl8fDApLGYmJihjLT1wYXJzZUZsb2F0KGEuY3VyQ1NTKGIsIm1hcmdpbiIrdGhpcywhMCkpfHwwKX0pLGN9dmFyIGU9ZD09PSJXaWR0aCI/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLGY9ZC50b0xvd2VyQ2FzZSgpLGc9e2lubmVyV2lkdGg6YS5mbi5pbm5lcldpZHRoLGlubmVySGVpZ2h0OmEuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDphLmZuLm91dGVyV2lkdGgsb3V0ZXJIZWlnaHQ6YS5mbi5vdXRlckhlaWdodH07YS5mblsiaW5uZXIiK2RdPWZ1bmN0aW9uKGMpe3JldHVybiBjPT09Yj9nWyJpbm5lciIrZF0uY2FsbCh0aGlzKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLmNzcyhmLGgodGhpcyxjKSsicHgiKX0pfSxhLmZuWyJvdXRlciIrZF09ZnVuY3Rpb24oYixjKXtyZXR1cm4gdHlwZW9mIGIhPSJudW1iZXIiP2dbIm91dGVyIitkXS5jYWxsKHRoaXMsYik6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5jc3MoZixoKHRoaXMsYiwhMCxjKSsicHgiKX0pfX0pLGEuZXh0ZW5kKGEuZXhwclsiOiJdLHtkYXRhOmEuZXhwci5jcmVhdGVQc2V1ZG8/YS5leHByLmNyZWF0ZVBzZXVkbyhmdW5jdGlvbihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7cmV0dXJuISFhLmRhdGEoYyxiKX19KTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuISFhLmRhdGEoYixkWzNdKX0sZm9jdXNhYmxlOmZ1bmN0aW9uKGIpe3JldHVybiBjKGIsIWlzTmFOKGEuYXR0cihiLCJ0YWJpbmRleCIpKSl9LHRhYmJhYmxlOmZ1bmN0aW9uKGIpe3ZhciBkPWEuYXR0cihiLCJ0YWJpbmRleCIpLGU9aXNOYU4oZCk7cmV0dXJuKGV8fGQ+PTApJiZjKGIsIWUpfX0pLGEoZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5ib2R5LGM9Yi5hcHBlbmRDaGlsZChjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtjLm9mZnNldEhlaWdodCxhLmV4dGVuZChjLnN0eWxlLHttaW5IZWlnaHQ6IjEwMHB4IixoZWlnaHQ6ImF1dG8iLHBhZGRpbmc6MCxib3JkZXJXaWR0aDowfSksYS5zdXBwb3J0Lm1pbkhlaWdodD1jLm9mZnNldEhlaWdodD09PTEwMCxhLnN1cHBvcnQuc2VsZWN0c3RhcnQ9Im9uc2VsZWN0c3RhcnQiaW4gYyxiLnJlbW92ZUNoaWxkKGMpLnN0eWxlLmRpc3BsYXk9Im5vbmUifSksYS5jdXJDU1N8fChhLmN1ckNTUz1hLmNzcyksYS5leHRlbmQoYS51aSx7cGx1Z2luOnthZGQ6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEudWlbYl0ucHJvdG90eXBlO2Zvcih2YXIgZiBpbiBkKWUucGx1Z2luc1tmXT1lLnBsdWdpbnNbZl18fFtdLGUucGx1Z2luc1tmXS5wdXNoKFtjLGRbZl1dKX0sY2FsbDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5wbHVnaW5zW2JdO2lmKCFkfHwhYS5lbGVtZW50WzBdLnBhcmVudE5vZGUpcmV0dXJuO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKWEub3B0aW9uc1tkW2VdWzBdXSYmZFtlXVsxXS5hcHBseShhLmVsZW1lbnQsYyl9fSxjb250YWluczpmdW5jdGlvbihhLGIpe3JldHVybiBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2OmEhPT1iJiZhLmNvbnRhaW5zKGIpfSxoYXNTY3JvbGw6ZnVuY3Rpb24oYixjKXtpZihhKGIpLmNzcygib3ZlcmZsb3ciKT09PSJoaWRkZW4iKXJldHVybiExO3ZhciBkPWMmJmM9PT0ibGVmdCI/InNjcm9sbExlZnQiOiJzY3JvbGxUb3AiLGU9ITE7cmV0dXJuIGJbZF0+MD8hMDooYltkXT0xLGU9YltkXT4wLGJbZF09MCxlKX0saXNPdmVyQXhpczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGE+YiYmYTxiK2N9LGlzT3ZlcjpmdW5jdGlvbihiLGMsZCxlLGYsZyl7cmV0dXJuIGEudWkuaXNPdmVyQXhpcyhiLGQsZikmJmEudWkuaXNPdmVyQXhpcyhjLGUsZyl9fSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS53aWRnZXQuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7aWYoYS5jbGVhbkRhdGEpe3ZhciBjPWEuY2xlYW5EYXRhO2EuY2xlYW5EYXRhPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZD0wLGU7KGU9YltkXSkhPW51bGw7ZCsrKXRyeXthKGUpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX1jYXRjaChmKXt9YyhiKX19ZWxzZXt2YXIgZD1hLmZuLnJlbW92ZTthLmZuLnJlbW92ZT1mdW5jdGlvbihiLGMpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gY3x8KCFifHxhLmZpbHRlcihiLFt0aGlzXSkubGVuZ3RoKSYmYSgiKiIsdGhpcykuYWRkKFt0aGlzXSkuZWFjaChmdW5jdGlvbigpe3RyeXthKHRoaXMpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX1jYXRjaChiKXt9fSksZC5jYWxsKGEodGhpcyksYixjKX0pfX1hLndpZGdldD1mdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5zcGxpdCgiLiIpWzBdLGY7Yj1iLnNwbGl0KCIuIilbMV0sZj1lKyItIitiLGR8fChkPWMsYz1hLldpZGdldCksYS5leHByWyI6Il1bZl09ZnVuY3Rpb24oYyl7cmV0dXJuISFhLmRhdGEoYyxiKX0sYVtlXT1hW2VdfHx7fSxhW2VdW2JdPWZ1bmN0aW9uKGEsYil7YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KGEsYil9O3ZhciBnPW5ldyBjO2cub3B0aW9ucz1hLmV4dGVuZCghMCx7fSxnLm9wdGlvbnMpLGFbZV1bYl0ucHJvdG90eXBlPWEuZXh0ZW5kKCEwLGcse25hbWVzcGFjZTplLHdpZGdldE5hbWU6Yix3aWRnZXRFdmVudFByZWZpeDphW2VdW2JdLnByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeHx8Yix3aWRnZXRCYXNlQ2xhc3M6Zn0sZCksYS53aWRnZXQuYnJpZGdlKGIsYVtlXVtiXSl9LGEud2lkZ2V0LmJyaWRnZT1mdW5jdGlvbihjLGQpe2EuZm5bY109ZnVuY3Rpb24oZSl7dmFyIGY9dHlwZW9mIGU9PSJzdHJpbmciLGc9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGg9dGhpcztyZXR1cm4gZT0hZiYmZy5sZW5ndGg/YS5leHRlbmQuYXBwbHkobnVsbCxbITAsZV0uY29uY2F0KGcpKTplLGYmJmUuY2hhckF0KDApPT09Il8iP2g6KGY/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YS5kYXRhKHRoaXMsYyksZj1kJiZhLmlzRnVuY3Rpb24oZFtlXSk/ZFtlXS5hcHBseShkLGcpOmQ7aWYoZiE9PWQmJmYhPT1iKXJldHVybiBoPWYsITF9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hLmRhdGEodGhpcyxjKTtiP2Iub3B0aW9uKGV8fHt9KS5faW5pdCgpOmEuZGF0YSh0aGlzLGMsbmV3IGQoZSx0aGlzKSl9KSxoKX19LGEuV2lkZ2V0PWZ1bmN0aW9uKGEsYil7YXJndW1lbnRzLmxlbmd0aCYmdGhpcy5fY3JlYXRlV2lkZ2V0KGEsYil9LGEuV2lkZ2V0LnByb3RvdHlwZT17d2lkZ2V0TmFtZToid2lkZ2V0Iix3aWRnZXRFdmVudFByZWZpeDoiIixvcHRpb25zOntkaXNhYmxlZDohMX0sX2NyZWF0ZVdpZGdldDpmdW5jdGlvbihiLGMpe2EuZGF0YShjLHRoaXMud2lkZ2V0TmFtZSx0aGlzKSx0aGlzLmVsZW1lbnQ9YShjKSx0aGlzLm9wdGlvbnM9YS5leHRlbmQoITAse30sdGhpcy5vcHRpb25zLHRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSxiKTt2YXIgZD10aGlzO3RoaXMuZWxlbWVudC5iaW5kKCJyZW1vdmUuIit0aGlzLndpZGdldE5hbWUsZnVuY3Rpb24oKXtkLmRlc3Ryb3koKX0pLHRoaXMuX2NyZWF0ZSgpLHRoaXMuX3RyaWdnZXIoImNyZWF0ZSIpLHRoaXMuX2luaXQoKX0sX2dldENyZWF0ZU9wdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gYS5tZXRhZGF0YSYmYS5tZXRhZGF0YS5nZXQodGhpcy5lbGVtZW50WzBdKVt0aGlzLndpZGdldE5hbWVdfSxfY3JlYXRlOmZ1bmN0aW9uKCl7fSxfaW5pdDpmdW5jdGlvbigpe30sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC51bmJpbmQoIi4iK3RoaXMud2lkZ2V0TmFtZSkucmVtb3ZlRGF0YSh0aGlzLndpZGdldE5hbWUpLHRoaXMud2lkZ2V0KCkudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5yZW1vdmVDbGFzcyh0aGlzLndpZGdldEJhc2VDbGFzcysiLWRpc2FibGVkICIrInVpLXN0YXRlLWRpc2FibGVkIil9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnR9LG9wdGlvbjpmdW5jdGlvbihjLGQpe3ZhciBlPWM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApcmV0dXJuIGEuZXh0ZW5kKHt9LHRoaXMub3B0aW9ucyk7aWYodHlwZW9mIGM9PSJzdHJpbmciKXtpZihkPT09YilyZXR1cm4gdGhpcy5vcHRpb25zW2NdO2U9e30sZVtjXT1kfXJldHVybiB0aGlzLl9zZXRPcHRpb25zKGUpLHRoaXN9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7cmV0dXJuIGEuZWFjaChiLGZ1bmN0aW9uKGEsYil7Yy5fc2V0T3B0aW9uKGEsYil9KSx0aGlzfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub3B0aW9uc1thXT1iLGE9PT0iZGlzYWJsZWQiJiZ0aGlzLndpZGdldCgpW2I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSh0aGlzLndpZGdldEJhc2VDbGFzcysiLWRpc2FibGVkIisiICIrInVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsYiksdGhpc30sZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLCExKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIiwhMCl9LF90cmlnZ2VyOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGc9dGhpcy5vcHRpb25zW2JdO2Q9ZHx8e30sYz1hLkV2ZW50KGMpLGMudHlwZT0oYj09PXRoaXMud2lkZ2V0RXZlbnRQcmVmaXg/Yjp0aGlzLndpZGdldEV2ZW50UHJlZml4K2IpLnRvTG93ZXJDYXNlKCksYy50YXJnZXQ9dGhpcy5lbGVtZW50WzBdLGY9Yy5vcmlnaW5hbEV2ZW50O2lmKGYpZm9yKGUgaW4gZillIGluIGN8fChjW2VdPWZbZV0pO3JldHVybiB0aGlzLmVsZW1lbnQudHJpZ2dlcihjLGQpLCEoYS5pc0Z1bmN0aW9uKGcpJiZnLmNhbGwodGhpcy5lbGVtZW50WzBdLGMsZCk9PT0hMXx8Yy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl9fX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLm1vdXNlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe3ZhciBjPSExO2EoZG9jdW1lbnQpLm1vdXNldXAoZnVuY3Rpb24oYSl7Yz0hMX0pLGEud2lkZ2V0KCJ1aS5tb3VzZSIse29wdGlvbnM6e2NhbmNlbDoiOmlucHV0LG9wdGlvbiIsZGlzdGFuY2U6MSxkZWxheTowfSxfbW91c2VJbml0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpczt0aGlzLmVsZW1lbnQuYmluZCgibW91c2Vkb3duLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGEpe3JldHVybiBiLl9tb3VzZURvd24oYSl9KS5iaW5kKCJjbGljay4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihjKXtpZighMD09PWEuZGF0YShjLnRhcmdldCxiLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpKXJldHVybiBhLnJlbW92ZURhdGEoYy50YXJnZXQsYi53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSxjLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCExfSksdGhpcy5zdGFydGVkPSExfSxfbW91c2VEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSYmYShkb2N1bWVudCkudW5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLnVuYmluZCgibW91c2V1cC4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZVVwRGVsZWdhdGUpfSxfbW91c2VEb3duOmZ1bmN0aW9uKGIpe2lmKGMpcmV0dXJuO3RoaXMuX21vdXNlU3RhcnRlZCYmdGhpcy5fbW91c2VVcChiKSx0aGlzLl9tb3VzZURvd25FdmVudD1iO3ZhciBkPXRoaXMsZT1iLndoaWNoPT0xLGY9dHlwZW9mIHRoaXMub3B0aW9ucy5jYW5jZWw9PSJzdHJpbmciJiZiLnRhcmdldC5ub2RlTmFtZT9hKGIudGFyZ2V0KS5jbG9zZXN0KHRoaXMub3B0aW9ucy5jYW5jZWwpLmxlbmd0aDohMTtpZighZXx8Znx8IXRoaXMuX21vdXNlQ2FwdHVyZShiKSlyZXR1cm4hMDt0aGlzLm1vdXNlRGVsYXlNZXQ9IXRoaXMub3B0aW9ucy5kZWxheSx0aGlzLm1vdXNlRGVsYXlNZXR8fCh0aGlzLl9tb3VzZURlbGF5VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2QubW91c2VEZWxheU1ldD0hMH0sdGhpcy5vcHRpb25zLmRlbGF5KSk7aWYodGhpcy5fbW91c2VEaXN0YW5jZU1ldChiKSYmdGhpcy5fbW91c2VEZWxheU1ldChiKSl7dGhpcy5fbW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQoYikhPT0hMTtpZighdGhpcy5fbW91c2VTdGFydGVkKXJldHVybiBiLnByZXZlbnREZWZhdWx0KCksITB9cmV0dXJuITA9PT1hLmRhdGEoYi50YXJnZXQsdGhpcy53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSYmYS5yZW1vdmVEYXRhKGIudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IiksdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX21vdXNlTW92ZShhKX0sdGhpcy5fbW91c2VVcERlbGVnYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBkLl9tb3VzZVVwKGEpfSxhKGRvY3VtZW50KS5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSxiLnByZXZlbnREZWZhdWx0KCksYz0hMCwhMH0sX21vdXNlTW92ZTpmdW5jdGlvbihiKXtyZXR1cm4hYS5icm93c2VyLm1zaWV8fGRvY3VtZW50LmRvY3VtZW50TW9kZT49OXx8ISFiLmJ1dHRvbj90aGlzLl9tb3VzZVN0YXJ0ZWQ/KHRoaXMuX21vdXNlRHJhZyhiKSxiLnByZXZlbnREZWZhdWx0KCkpOih0aGlzLl9tb3VzZURpc3RhbmNlTWV0KGIpJiZ0aGlzLl9tb3VzZURlbGF5TWV0KGIpJiYodGhpcy5fbW91c2VTdGFydGVkPXRoaXMuX21vdXNlU3RhcnQodGhpcy5fbW91c2VEb3duRXZlbnQsYikhPT0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQ/dGhpcy5fbW91c2VEcmFnKGIpOnRoaXMuX21vdXNlVXAoYikpLCF0aGlzLl9tb3VzZVN0YXJ0ZWQpOnRoaXMuX21vdXNlVXAoYil9LF9tb3VzZVVwOmZ1bmN0aW9uKGIpe3JldHVybiBhKGRvY3VtZW50KS51bmJpbmQoIm1vdXNlbW92ZS4iK3RoaXMud2lkZ2V0TmFtZSx0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSkudW5iaW5kKCJtb3VzZXVwLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSksdGhpcy5fbW91c2VTdGFydGVkJiYodGhpcy5fbW91c2VTdGFydGVkPSExLGIudGFyZ2V0PT10aGlzLl9tb3VzZURvd25FdmVudC50YXJnZXQmJmEuZGF0YShiLnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIsITApLHRoaXMuX21vdXNlU3RvcChiKSksITF9LF9tb3VzZURpc3RhbmNlTWV0OmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLm1heChNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWC1hLnBhZ2VYKSxNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWS1hLnBhZ2VZKSk+PXRoaXMub3B0aW9ucy5kaXN0YW5jZX0sX21vdXNlRGVsYXlNZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubW91c2VEZWxheU1ldH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYSl7fSxfbW91c2VEcmFnOmZ1bmN0aW9uKGEpe30sX21vdXNlU3RvcDpmdW5jdGlvbihhKXt9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24oYSl7cmV0dXJuITB9fSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5wb3NpdGlvbi5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLnVpPWEudWl8fHt9O3ZhciBjPS9sZWZ0fGNlbnRlcnxyaWdodC8sZD0vdG9wfGNlbnRlcnxib3R0b20vLGU9ImNlbnRlciIsZj17fSxnPWEuZm4ucG9zaXRpb24saD1hLmZuLm9mZnNldDthLmZuLnBvc2l0aW9uPWZ1bmN0aW9uKGIpe2lmKCFifHwhYi5vZilyZXR1cm4gZy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yj1hLmV4dGVuZCh7fSxiKTt2YXIgaD1hKGIub2YpLGk9aFswXSxqPShiLmNvbGxpc2lvbnx8ImZsaXAiKS5zcGxpdCgiICIpLGs9Yi5vZmZzZXQ/Yi5vZmZzZXQuc3BsaXQoIiAiKTpbMCwwXSxsLG0sbjtyZXR1cm4gaS5ub2RlVHlwZT09PTk/KGw9aC53aWR0aCgpLG09aC5oZWlnaHQoKSxuPXt0b3A6MCxsZWZ0OjB9KTppLnNldFRpbWVvdXQ/KGw9aC53aWR0aCgpLG09aC5oZWlnaHQoKSxuPXt0b3A6aC5zY3JvbGxUb3AoKSxsZWZ0Omguc2Nyb2xsTGVmdCgpfSk6aS5wcmV2ZW50RGVmYXVsdD8oYi5hdD0ibGVmdCB0b3AiLGw9bT0wLG49e3RvcDpiLm9mLnBhZ2VZLGxlZnQ6Yi5vZi5wYWdlWH0pOihsPWgub3V0ZXJXaWR0aCgpLG09aC5vdXRlckhlaWdodCgpLG49aC5vZmZzZXQoKSksYS5lYWNoKFsibXkiLCJhdCJdLGZ1bmN0aW9uKCl7dmFyIGE9KGJbdGhpc118fCIiKS5zcGxpdCgiICIpO2EubGVuZ3RoPT09MSYmKGE9Yy50ZXN0KGFbMF0pP2EuY29uY2F0KFtlXSk6ZC50ZXN0KGFbMF0pP1tlXS5jb25jYXQoYSk6W2UsZV0pLGFbMF09Yy50ZXN0KGFbMF0pP2FbMF06ZSxhWzFdPWQudGVzdChhWzFdKT9hWzFdOmUsYlt0aGlzXT1hfSksai5sZW5ndGg9PT0xJiYoalsxXT1qWzBdKSxrWzBdPXBhcnNlSW50KGtbMF0sMTApfHwwLGsubGVuZ3RoPT09MSYmKGtbMV09a1swXSksa1sxXT1wYXJzZUludChrWzFdLDEwKXx8MCxiLmF0WzBdPT09InJpZ2h0Ij9uLmxlZnQrPWw6Yi5hdFswXT09PWUmJihuLmxlZnQrPWwvMiksYi5hdFsxXT09PSJib3R0b20iP24udG9wKz1tOmIuYXRbMV09PT1lJiYobi50b3ArPW0vMiksbi5sZWZ0Kz1rWzBdLG4udG9wKz1rWzFdLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1jLm91dGVyV2lkdGgoKSxnPWMub3V0ZXJIZWlnaHQoKSxoPXBhcnNlSW50KGEuY3VyQ1NTKHRoaXMsIm1hcmdpbkxlZnQiLCEwKSl8fDAsaT1wYXJzZUludChhLmN1ckNTUyh0aGlzLCJtYXJnaW5Ub3AiLCEwKSl8fDAsbz1kK2grKHBhcnNlSW50KGEuY3VyQ1NTKHRoaXMsIm1hcmdpblJpZ2h0IiwhMCkpfHwwKSxwPWcraSsocGFyc2VJbnQoYS5jdXJDU1ModGhpcywibWFyZ2luQm90dG9tIiwhMCkpfHwwKSxxPWEuZXh0ZW5kKHt9LG4pLHI7Yi5teVswXT09PSJyaWdodCI/cS5sZWZ0LT1kOmIubXlbMF09PT1lJiYocS5sZWZ0LT1kLzIpLGIubXlbMV09PT0iYm90dG9tIj9xLnRvcC09ZzpiLm15WzFdPT09ZSYmKHEudG9wLT1nLzIpLGYuZnJhY3Rpb25zfHwocS5sZWZ0PU1hdGgucm91bmQocS5sZWZ0KSxxLnRvcD1NYXRoLnJvdW5kKHEudG9wKSkscj17bGVmdDpxLmxlZnQtaCx0b3A6cS50b3AtaX0sYS5lYWNoKFsibGVmdCIsInRvcCJdLGZ1bmN0aW9uKGMsZSl7YS51aS5wb3NpdGlvbltqW2NdXSYmYS51aS5wb3NpdGlvbltqW2NdXVtlXShxLHt0YXJnZXRXaWR0aDpsLHRhcmdldEhlaWdodDptLGVsZW1XaWR0aDpkLGVsZW1IZWlnaHQ6Zyxjb2xsaXNpb25Qb3NpdGlvbjpyLGNvbGxpc2lvbldpZHRoOm8sY29sbGlzaW9uSGVpZ2h0OnAsb2Zmc2V0OmssbXk6Yi5teSxhdDpiLmF0fSl9KSxhLmZuLmJnaWZyYW1lJiZjLmJnaWZyYW1lKCksYy5vZmZzZXQoYS5leHRlbmQocSx7dXNpbmc6Yi51c2luZ30pKX0pfSxhLnVpLnBvc2l0aW9uPXtmaXQ6e2xlZnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHdpbmRvdyksZT1jLmNvbGxpc2lvblBvc2l0aW9uLmxlZnQrYy5jb2xsaXNpb25XaWR0aC1kLndpZHRoKCktZC5zY3JvbGxMZWZ0KCk7Yi5sZWZ0PWU+MD9iLmxlZnQtZTpNYXRoLm1heChiLmxlZnQtYy5jb2xsaXNpb25Qb3NpdGlvbi5sZWZ0LGIubGVmdCl9LHRvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEod2luZG93KSxlPWMuY29sbGlzaW9uUG9zaXRpb24udG9wK2MuY29sbGlzaW9uSGVpZ2h0LWQuaGVpZ2h0KCktZC5zY3JvbGxUb3AoKTtiLnRvcD1lPjA/Yi50b3AtZTpNYXRoLm1heChiLnRvcC1jLmNvbGxpc2lvblBvc2l0aW9uLnRvcCxiLnRvcCl9fSxmbGlwOntsZWZ0OmZ1bmN0aW9uKGIsYyl7aWYoYy5hdFswXT09PWUpcmV0dXJuO3ZhciBkPWEod2luZG93KSxmPWMuY29sbGlzaW9uUG9zaXRpb24ubGVmdCtjLmNvbGxpc2lvbldpZHRoLWQud2lkdGgoKS1kLnNjcm9sbExlZnQoKSxnPWMubXlbMF09PT0ibGVmdCI/LWMuZWxlbVdpZHRoOmMubXlbMF09PT0icmlnaHQiP2MuZWxlbVdpZHRoOjAsaD1jLmF0WzBdPT09ImxlZnQiP2MudGFyZ2V0V2lkdGg6LWMudGFyZ2V0V2lkdGgsaT0tMipjLm9mZnNldFswXTtiLmxlZnQrPWMuY29sbGlzaW9uUG9zaXRpb24ubGVmdDwwP2craCtpOmY+MD9nK2graTowfSx0b3A6ZnVuY3Rpb24oYixjKXtpZihjLmF0WzFdPT09ZSlyZXR1cm47dmFyIGQ9YSh3aW5kb3cpLGY9Yy5jb2xsaXNpb25Qb3NpdGlvbi50b3ArYy5jb2xsaXNpb25IZWlnaHQtZC5oZWlnaHQoKS1kLnNjcm9sbFRvcCgpLGc9Yy5teVsxXT09PSJ0b3AiPy1jLmVsZW1IZWlnaHQ6Yy5teVsxXT09PSJib3R0b20iP2MuZWxlbUhlaWdodDowLGg9Yy5hdFsxXT09PSJ0b3AiP2MudGFyZ2V0SGVpZ2h0Oi1jLnRhcmdldEhlaWdodCxpPS0yKmMub2Zmc2V0WzFdO2IudG9wKz1jLmNvbGxpc2lvblBvc2l0aW9uLnRvcDwwP2craCtpOmY+MD9nK2graTowfX19LGEub2Zmc2V0LnNldE9mZnNldHx8KGEub2Zmc2V0LnNldE9mZnNldD1mdW5jdGlvbihiLGMpey9zdGF0aWMvLnRlc3QoYS5jdXJDU1MoYiwicG9zaXRpb24iKSkmJihiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBkPWEoYiksZT1kLm9mZnNldCgpLGY9cGFyc2VJbnQoYS5jdXJDU1MoYiwidG9wIiwhMCksMTApfHwwLGc9cGFyc2VJbnQoYS5jdXJDU1MoYiwibGVmdCIsITApLDEwKXx8MCxoPXt0b3A6Yy50b3AtZS50b3ArZixsZWZ0OmMubGVmdC1lLmxlZnQrZ307InVzaW5nImluIGM/Yy51c2luZy5jYWxsKGIsaCk6ZC5jc3MoaCl9LGEuZm4ub2Zmc2V0PWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIWN8fCFjLm93bmVyRG9jdW1lbnQ/bnVsbDpiP2EuaXNGdW5jdGlvbihiKT90aGlzLmVhY2goZnVuY3Rpb24oYyl7YSh0aGlzKS5vZmZzZXQoYi5jYWxsKHRoaXMsYyxhKHRoaXMpLm9mZnNldCgpKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXthLm9mZnNldC5zZXRPZmZzZXQodGhpcyxiKX0pOmguY2FsbCh0aGlzKX0pLGEuY3VyQ1NTfHwoYS5jdXJDU1M9YS5jc3MpLGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQsZSxnLGgsaTtkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYj8iZGl2IjoiYm9keSIpLGc9e3Zpc2liaWxpdHk6ImhpZGRlbiIsd2lkdGg6MCxoZWlnaHQ6MCxib3JkZXI6MCxtYXJnaW46MCxiYWNrZ3JvdW5kOiJub25lIn0sYiYmYS5leHRlbmQoZyx7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiItMTAwMHB4Iix0b3A6Ii0xMDAwcHgifSk7Zm9yKHZhciBqIGluIGcpZC5zdHlsZVtqXT1nW2pdO2QuYXBwZW5kQ2hpbGQoYyksZT1ifHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAxMC43NDMyMjIycHg7IHRvcDogMTAuNDMyMzI1cHg7IGhlaWdodDogMzBweDsgd2lkdGg6IDIwMXB4OyIsaD1hKGMpLm9mZnNldChmdW5jdGlvbihhLGIpe3JldHVybiBifSkub2Zmc2V0KCksZC5pbm5lckhUTUw9IiIsZS5yZW1vdmVDaGlsZChkKSxpPWgudG9wK2gubGVmdCsoYj8yZTM6MCksZi5mcmFjdGlvbnM9aT4yMSYmaTwyMn0oKX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLmRyYWdnYWJsZS5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuZHJhZ2dhYmxlIixhLnVpLm1vdXNlLHt3aWRnZXRFdmVudFByZWZpeDoiZHJhZyIsb3B0aW9uczp7YWRkQ2xhc3NlczohMCxhcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RUb1NvcnRhYmxlOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaWZyYW1lRml4OiExLG9wYWNpdHk6ITEscmVmcmVzaFBvc2l0aW9uczohMSxyZXZlcnQ6ITEscmV2ZXJ0RHVyYXRpb246NTAwLHNjb3BlOiJkZWZhdWx0IixzY3JvbGw6ITAsc2Nyb2xsU2Vuc2l0aXZpdHk6MjAsc2Nyb2xsU3BlZWQ6MjAsc25hcDohMSxzbmFwTW9kZToiYm90aCIsc25hcFRvbGVyYW5jZToyMCxzdGFjazohMSx6SW5kZXg6ITF9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuaGVscGVyPT0ib3JpZ2luYWwiJiYhL14oPzpyfGF8ZikvLnRlc3QodGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSkmJih0aGlzLmVsZW1lbnRbMF0uc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksdGhpcy5vcHRpb25zLmFkZENsYXNzZXMmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlIiksdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlSW5pdCgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWxlbWVudC5kYXRhKCJkcmFnZ2FibGUiKSlyZXR1cm47cmV0dXJuIHRoaXMuZWxlbWVudC5yZW1vdmVEYXRhKCJkcmFnZ2FibGUiKS51bmJpbmQoIi5kcmFnZ2FibGUiKS5yZW1vdmVDbGFzcygidWktZHJhZ2dhYmxlIHVpLWRyYWdnYWJsZS1kcmFnZ2luZyB1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSx0aGlzLl9tb3VzZURlc3Ryb3koKSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5oZWxwZXJ8fGMuZGlzYWJsZWR8fGEoYi50YXJnZXQpLmlzKCIudWktcmVzaXphYmxlLWhhbmRsZSIpPyExOih0aGlzLmhhbmRsZT10aGlzLl9nZXRIYW5kbGUoYiksdGhpcy5oYW5kbGU/KGMuaWZyYW1lRml4JiZhKGMuaWZyYW1lRml4PT09ITA/ImlmcmFtZSI6Yy5pZnJhbWVGaXgpLmVhY2goZnVuY3Rpb24oKXthKCc8ZGl2IGNsYXNzPSJ1aS1kcmFnZ2FibGUtaWZyYW1lRml4IiBzdHlsZT0iYmFja2dyb3VuZDogI2ZmZjsiPjwvZGl2PicpLmNzcyh7d2lkdGg6dGhpcy5vZmZzZXRXaWR0aCsicHgiLGhlaWdodDp0aGlzLm9mZnNldEhlaWdodCsicHgiLHBvc2l0aW9uOiJhYnNvbHV0ZSIsb3BhY2l0eToiMC4wMDEiLHpJbmRleDoxZTN9KS5jc3MoYSh0aGlzKS5vZmZzZXQoKSkuYXBwZW5kVG8oImJvZHkiKX0pLCEwKTohMSl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKGIpLHRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksYS51aS5kZG1hbmFnZXImJihhLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXMpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuY3NzUG9zaXRpb249dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpLHRoaXMub2Zmc2V0PXRoaXMucG9zaXRpb25BYnM9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxhLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6Yi5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpiLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGIpLHRoaXMub3JpZ2luYWxQYWdlWD1iLnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT1iLnBhZ2VZLGMuY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoYy5jdXJzb3JBdCksYy5jb250YWlubWVudCYmdGhpcy5fc2V0Q29udGFpbm1lbnQoKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsYik9PT0hMT8odGhpcy5fY2xlYXIoKSwhMSk6KHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxhLnVpLmRkbWFuYWdlciYmIWMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxiKSx0aGlzLl9tb3VzZURyYWcoYiwhMCksYS51aS5kZG1hbmFnZXImJmEudWkuZGRtYW5hZ2VyLmRyYWdTdGFydCh0aGlzLGIpLCEwKX0sX21vdXNlRHJhZzpmdW5jdGlvbihiLGMpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCFjKXt2YXIgZD10aGlzLl91aUhhc2goKTtpZih0aGlzLl90cmlnZ2VyKCJkcmFnIixiLGQpPT09ITEpcmV0dXJuIHRoaXMuX21vdXNlVXAoe30pLCExO3RoaXMucG9zaXRpb249ZC5wb3NpdGlvbn1pZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieSIpdGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4IjtpZighdGhpcy5vcHRpb25zLmF4aXN8fHRoaXMub3B0aW9ucy5heGlzIT0ieCIpdGhpcy5oZWxwZXJbMF0uc3R5bGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCI7cmV0dXJuIGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsYiksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9ITE7YS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmKGM9YS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLGIpKSx0aGlzLmRyb3BwZWQmJihjPXRoaXMuZHJvcHBlZCx0aGlzLmRyb3BwZWQ9ITEpO3ZhciBkPXRoaXMuZWxlbWVudFswXSxlPSExO3doaWxlKGQmJihkPWQucGFyZW50Tm9kZSkpZD09ZG9jdW1lbnQmJihlPSEwKTtpZighZSYmdGhpcy5vcHRpb25zLmhlbHBlcj09PSJvcmlnaW5hbCIpcmV0dXJuITE7aWYodGhpcy5vcHRpb25zLnJldmVydD09ImludmFsaWQiJiYhY3x8dGhpcy5vcHRpb25zLnJldmVydD09InZhbGlkIiYmY3x8dGhpcy5vcHRpb25zLnJldmVydD09PSEwfHxhLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnJldmVydCkmJnRoaXMub3B0aW9ucy5yZXZlcnQuY2FsbCh0aGlzLmVsZW1lbnQsYykpe3ZhciBmPXRoaXM7YSh0aGlzLmhlbHBlcikuYW5pbWF0ZSh0aGlzLm9yaWdpbmFsUG9zaXRpb24scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uLDEwKSxmdW5jdGlvbigpe2YuX3RyaWdnZXIoInN0b3AiLGIpIT09ITEmJmYuX2NsZWFyKCl9KX1lbHNlIHRoaXMuX3RyaWdnZXIoInN0b3AiLGIpIT09ITEmJnRoaXMuX2NsZWFyKCk7cmV0dXJuITF9LF9tb3VzZVVwOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm9wdGlvbnMuaWZyYW1lRml4PT09ITAmJmEoImRpdi51aS1kcmFnZ2FibGUtaWZyYW1lRml4IikuZWFjaChmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX0pLGEudWkuZGRtYW5hZ2VyJiZhLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLGIpLGEudWkubW91c2UucHJvdG90eXBlLl9tb3VzZVVwLmNhbGwodGhpcyxiKX0sY2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKSx0aGlzfSxfZ2V0SGFuZGxlOmZ1bmN0aW9uKGIpe3ZhciBjPSF0aGlzLm9wdGlvbnMuaGFuZGxlfHwhYSh0aGlzLm9wdGlvbnMuaGFuZGxlLHRoaXMuZWxlbWVudCkubGVuZ3RoPyEwOiExO3JldHVybiBhKHRoaXMub3B0aW9ucy5oYW5kbGUsdGhpcy5lbGVtZW50KS5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt0aGlzPT1iLnRhcmdldCYmKGM9ITApfSksY30sX2NyZWF0ZUhlbHBlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZD1hLmlzRnVuY3Rpb24oYy5oZWxwZXIpP2EoYy5oZWxwZXIuYXBwbHkodGhpcy5lbGVtZW50WzBdLFtiXSkpOmMuaGVscGVyPT0iY2xvbmUiP3RoaXMuZWxlbWVudC5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIik6dGhpcy5lbGVtZW50O3JldHVybiBkLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGQuYXBwZW5kVG8oYy5hcHBlbmRUbz09InBhcmVudCI/dGhpcy5lbGVtZW50WzBdLnBhcmVudE5vZGU6Yy5hcHBlbmRUbyksZFswXSE9dGhpcy5lbGVtZW50WzBdJiYhLyhmaXhlZHxhYnNvbHV0ZSkvLnRlc3QoZC5jc3MoInBvc2l0aW9uIikpJiZkLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLGR9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGIpe3R5cGVvZiBiPT0ic3RyaW5nIiYmKGI9Yi5zcGxpdCgiICIpKSxhLmlzQXJyYXkoYikmJihiPXtsZWZ0OitiWzBdLHRvcDorYlsxXXx8MH0pLCJsZWZ0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWIubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYi5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWIudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1iLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciBiPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJihiLmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSxiLnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmYS5icm93c2VyLm1zaWUpYj17dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOmIudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmIubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIil7dmFyIGE9dGhpcy5lbGVtZW50LnBvc2l0aW9uKCk7cmV0dXJue3RvcDphLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6YS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MCx0b3A6cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luVG9wIiksMTApfHwwLHJpZ2h0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksMTApfHwwLGJvdHRvbTpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmNvbnRhaW5tZW50PT0icGFyZW50IiYmKGIuY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSk7aWYoYi5jb250YWlubWVudD09ImRvY3VtZW50Inx8Yi5jb250YWlubWVudD09IndpbmRvdyIpdGhpcy5jb250YWlubWVudD1bYi5jb250YWlubWVudD09ImRvY3VtZW50Ij8wOmEod2luZG93KS5zY3JvbGxMZWZ0KCktdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCxiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbExlZnQoKSkrYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LChiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiPzA6YSh3aW5kb3cpLnNjcm9sbFRvcCgpKSsoYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3QoYi5jb250YWlubWVudCkmJmIuY29udGFpbm1lbnQuY29uc3RydWN0b3IhPUFycmF5KXt2YXIgYz1hKGIuY29udGFpbm1lbnQpLGQ9Y1swXTtpZighZClyZXR1cm47dmFyIGU9Yy5vZmZzZXQoKSxmPWEoZCkuY3NzKCJvdmVyZmxvdyIpIT0iaGlkZGVuIjt0aGlzLmNvbnRhaW5tZW50PVsocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCksKHBhcnNlSW50KGEoZCkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoZCkuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKSwoZj9NYXRoLm1heChkLnNjcm9sbFdpZHRoLGQub2Zmc2V0V2lkdGgpOmQub2Zmc2V0V2lkdGgpLShwYXJzZUludChhKGQpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdC10aGlzLm1hcmdpbnMucmlnaHQsKGY/TWF0aC5tYXgoZC5zY3JvbGxIZWlnaHQsZC5vZmZzZXRIZWlnaHQpOmQub2Zmc2V0SGVpZ2h0KS0ocGFyc2VJbnQoYShkKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShkKS5jc3MoInBhZGRpbmdCb3R0b20iKSwxMCl8fDApLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3AtdGhpcy5tYXJnaW5zLmJvdHRvbV0sdGhpcy5yZWxhdGl2ZV9jb250YWluZXI9Y31lbHNlIGIuY29udGFpbm1lbnQuY29uc3RydWN0b3I9PUFycmF5JiYodGhpcy5jb250YWlubWVudD1iLmNvbnRhaW5tZW50KX0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGIsYyl7Y3x8KGM9dGhpcy5wb3NpdGlvbik7dmFyIGQ9Yj09ImFic29sdXRlIj8xOi0xLGU9dGhpcy5vcHRpb25zLGY9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxnPS8oaHRtbHxib2R5KS9pLnRlc3QoZlswXS50YWdOYW1lKTtyZXR1cm57dG9wOmMudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpkK3RoaXMub2Zmc2V0LnBhcmVudC50b3AqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmc/MDpmLnNjcm9sbFRvcCgpKSpkKSxsZWZ0OmMubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmQrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqZC0oYS5icm93c2VyLnNhZmFyaSYmYS5icm93c2VyLnZlcnNpb248NTI2JiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpnPzA6Zi5zY3JvbGxMZWZ0KCkpKmQpfX0sX2dlbmVyYXRlUG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5jc3NQb3NpdGlvbj09ImFic29sdXRlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8IWEudWkuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pKT90aGlzLm9mZnNldFBhcmVudDp0aGlzLnNjcm9sbFBhcmVudCxlPS8oaHRtbHxib2R5KS9pLnRlc3QoZFswXS50YWdOYW1lKSxmPWIucGFnZVgsZz1iLnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dmFyIGg7aWYodGhpcy5jb250YWlubWVudCl7aWYodGhpcy5yZWxhdGl2ZV9jb250YWluZXIpe3ZhciBpPXRoaXMucmVsYXRpdmVfY29udGFpbmVyLm9mZnNldCgpO2g9W3RoaXMuY29udGFpbm1lbnRbMF0raS5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0raS50b3AsdGhpcy5jb250YWlubWVudFsyXStpLmxlZnQsdGhpcy5jb250YWlubWVudFszXStpLnRvcF19ZWxzZSBoPXRoaXMuY29udGFpbm1lbnQ7Yi5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PGhbMF0mJihmPWhbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksYi5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXSYmKGc9aFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5oWzJdJiYoZj1oWzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPmhbM10mJihnPWhbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKX1pZihjLmdyaWQpe3ZhciBqPWMuZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoZy10aGlzLm9yaWdpbmFsUGFnZVkpL2MuZ3JpZFsxXSkqYy5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWTtnPWg/ai10aGlzLm9mZnNldC5jbGljay50b3A8aFsxXXx8ai10aGlzLm9mZnNldC5jbGljay50b3A+aFszXT9qLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDxoWzFdP2orYy5ncmlkWzFdOmotYy5ncmlkWzFdOmo6ajt2YXIgaz1jLmdyaWRbMF0/dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKGYtdGhpcy5vcmlnaW5hbFBhZ2VYKS9jLmdyaWRbMF0pKmMuZ3JpZFswXTp0aGlzLm9yaWdpbmFsUGFnZVg7Zj1oP2stdGhpcy5vZmZzZXQuY2xpY2subGVmdDxoWzBdfHxrLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+aFsyXT9rLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aFswXT9rK2MuZ3JpZFswXTprLWMuZ3JpZFswXTprOmt9fXJldHVybnt0b3A6Zy10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKGEuYnJvd3Nlci5zYWZhcmkmJmEuYnJvd3Nlci52ZXJzaW9uPDUyNiYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmU/MDpkLnNjcm9sbFRvcCgpKSxsZWZ0OmYtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KyhhLmJyb3dzZXIuc2FmYXJpJiZhLmJyb3dzZXIudmVyc2lvbjw1MjYmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6ZT8wOmQuc2Nyb2xsTGVmdCgpKX19LF9jbGVhcjpmdW5jdGlvbigpe3RoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLmhlbHBlclswXSE9dGhpcy5lbGVtZW50WzBdJiYhdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMX0sX3RyaWdnZXI6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBkPWR8fHRoaXMuX3VpSGFzaCgpLGEudWkucGx1Z2luLmNhbGwodGhpcyxiLFtjLGRdKSxiPT0iZHJhZyImJih0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpKSxhLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLGIsYyxkKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKGEpe3JldHVybntoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbixvZmZzZXQ6dGhpcy5wb3NpdGlvbkFic319fSksYS5leHRlbmQoYS51aS5kcmFnZ2FibGUse3ZlcnNpb246IjEuOC4yMyJ9KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9YS5leHRlbmQoe30sYyx7aXRlbTpkLmVsZW1lbnR9KTtkLnNvcnRhYmxlcz1bXSxhKGUuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hLmRhdGEodGhpcywic29ydGFibGUiKTtjJiYhYy5vcHRpb25zLmRpc2FibGVkJiYoZC5zb3J0YWJsZXMucHVzaCh7aW5zdGFuY2U6YyxzaG91bGRSZXZlcnQ6Yy5vcHRpb25zLnJldmVydH0pLGMucmVmcmVzaFBvc2l0aW9ucygpLGMuX3RyaWdnZXIoImFjdGl2YXRlIixiLGYpKX0pfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWEuZXh0ZW5kKHt9LGMse2l0ZW06ZC5lbGVtZW50fSk7YS5lYWNoKGQuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5pbnN0YW5jZS5pc092ZXI/KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsZC5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLnNob3VsZFJldmVydCYmKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChiKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyPXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyLGQub3B0aW9ucy5oZWxwZXI9PSJvcmlnaW5hbCImJnRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0uY3NzKHt0b3A6ImF1dG8iLGxlZnQ6ImF1dG8ifSkpOih0aGlzLmluc3RhbmNlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYixlKSl9KX0sZHJhZzpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT10aGlzLGY9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vZmZzZXQuY2xpY2sudG9wLGQ9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxlPXRoaXMucG9zaXRpb25BYnMudG9wLGY9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGc9Yi5oZWlnaHQsaD1iLndpZHRoLGk9Yi50b3Asaj1iLmxlZnQ7cmV0dXJuIGEudWkuaXNPdmVyKGUrYyxmK2QsaSxqLGcsaCl9O2EuZWFjaChkLnNvcnRhYmxlcyxmdW5jdGlvbihmKXt0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzPWQucG9zaXRpb25BYnMsdGhpcy5pbnN0YW5jZS5oZWxwZXJQcm9wb3J0aW9ucz1kLmhlbHBlclByb3BvcnRpb25zLHRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrPWQub2Zmc2V0LmNsaWNrLHRoaXMuaW5zdGFuY2UuX2ludGVyc2VjdHNXaXRoKHRoaXMuaW5zdGFuY2UuY29udGFpbmVyQ2FjaGUpPyh0aGlzLmluc3RhbmNlLmlzT3Zlcnx8KHRoaXMuaW5zdGFuY2UuaXNPdmVyPTEsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbT1hKGUpLmNsb25lKCkucmVtb3ZlQXR0cigiaWQiKS5hcHBlbmRUbyh0aGlzLmluc3RhbmNlLmVsZW1lbnQpLmRhdGEoInNvcnRhYmxlLWl0ZW0iLCEwKSx0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcj10aGlzLmluc3RhbmNlLm9wdGlvbnMuaGVscGVyLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYy5oZWxwZXJbMF19LGIudGFyZ2V0PXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW1bMF0sdGhpcy5pbnN0YW5jZS5fbW91c2VDYXB0dXJlKGIsITApLHRoaXMuaW5zdGFuY2UuX21vdXNlU3RhcnQoYiwhMCwhMCksdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wPWQub2Zmc2V0LmNsaWNrLnRvcCx0aGlzLmluc3RhbmNlLm9mZnNldC5jbGljay5sZWZ0PWQub2Zmc2V0LmNsaWNrLmxlZnQsdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQtPWQub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0LHRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC50b3AtPWQub2Zmc2V0LnBhcmVudC50b3AtdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcCxkLl90cmlnZ2VyKCJ0b1NvcnRhYmxlIixiKSxkLmRyb3BwZWQ9dGhpcy5pbnN0YW5jZS5lbGVtZW50LGQuY3VycmVudEl0ZW09ZC5lbGVtZW50LHRoaXMuaW5zdGFuY2UuZnJvbU91dHNpZGU9ZCksdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbSYmdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKGIpKTp0aGlzLmluc3RhbmNlLmlzT3ZlciYmKHRoaXMuaW5zdGFuY2UuaXNPdmVyPTAsdGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsPSEwLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQ9ITEsdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigib3V0IixiLHRoaXMuaW5zdGFuY2UuX3VpSGFzaCh0aGlzLmluc3RhbmNlKSksdGhpcy5pbnN0YW5jZS5fbW91c2VTdG9wKGIsITApLHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI9dGhpcy5pbnN0YW5jZS5vcHRpb25zLl9oZWxwZXIsdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbS5yZW1vdmUoKSx0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyJiZ0aGlzLmluc3RhbmNlLnBsYWNlaG9sZGVyLnJlbW92ZSgpLGQuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsYiksZC5kcm9wcGVkPSExKX0pfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiY3Vyc29yIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKCJib2R5IiksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoImN1cnNvciIpJiYoZS5fY3Vyc29yPWQuY3NzKCJjdXJzb3IiKSksZC5jc3MoImN1cnNvciIsZS5jdXJzb3IpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKS5vcHRpb25zO2QuX2N1cnNvciYmYSgiYm9keSIpLmNzcygiY3Vyc29yIixkLl9jdXJzb3IpfX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YShjLmhlbHBlciksZT1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5jc3MoIm9wYWNpdHkiKSYmKGUuX29wYWNpdHk9ZC5jc3MoIm9wYWNpdHkiKSksZC5jc3MoIm9wYWNpdHkiLGUub3BhY2l0eSl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fb3BhY2l0eSYmYShjLmhlbHBlcikuY3NzKCJvcGFjaXR5IixkLl9vcGFjaXR5KX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNjcm9sbCIse3N0YXJ0OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKTtkLnNjcm9sbFBhcmVudFswXSE9ZG9jdW1lbnQmJmQuc2Nyb2xsUGFyZW50WzBdLnRhZ05hbWUhPSJIVE1MIiYmKGQub3ZlcmZsb3dPZmZzZXQ9ZC5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpfSxkcmFnOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJkcmFnZ2FibGUiKSxlPWQub3B0aW9ucyxmPSExO2lmKGQuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmZC5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSE9IkhUTUwiKXtpZighZS5heGlzfHxlLmF4aXMhPSJ4IilkLm92ZXJmbG93T2Zmc2V0LnRvcCtkLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtYi5wYWdlWTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtlLnNjcm9sbFNwZWVkOmIucGFnZVktZC5vdmVyZmxvd09mZnNldC50b3A8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1mPWQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1lLnNjcm9sbFNwZWVkKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IilkLm92ZXJmbG93T2Zmc2V0LmxlZnQrZC5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtYi5wYWdlWDxlLnNjcm9sbFNlbnNpdGl2aXR5P2Quc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K2Uuc2Nyb2xsU3BlZWQ6Yi5wYWdlWC1kLm92ZXJmbG93T2Zmc2V0LmxlZnQ8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGQuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9Zj1kLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LWUuc2Nyb2xsU3BlZWQpfWVsc2V7aWYoIWUuYXhpc3x8ZS5heGlzIT0ieCIpYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLWUuc2Nyb2xsU3BlZWQpOmEod2luZG93KS5oZWlnaHQoKS0oYi5wYWdlWS1hKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk8ZS5zY3JvbGxTZW5zaXRpdml0eSYmKGY9YShkb2N1bWVudCkuc2Nyb2xsVG9wKGEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpK2Uuc2Nyb2xsU3BlZWQpKTtpZighZS5heGlzfHxlLmF4aXMhPSJ5IiliLnBhZ2VYLWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTxlLnNjcm9sbFNlbnNpdGl2aXR5P2Y9YShkb2N1bWVudCkuc2Nyb2xsTGVmdChhKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCktZS5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLndpZHRoKCktKGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKTxlLnNjcm9sbFNlbnNpdGl2aXR5JiYoZj1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKStlLnNjcm9sbFNwZWVkKSl9ZiE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWUuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoZCxiKX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInNuYXAiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIiksZT1kLm9wdGlvbnM7ZC5zbmFwRWxlbWVudHM9W10sYShlLnNuYXAuY29uc3RydWN0b3IhPVN0cmluZz9lLnNuYXAuaXRlbXN8fCI6ZGF0YShkcmFnZ2FibGUpIjplLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGM9Yi5vZmZzZXQoKTt0aGlzIT1kLmVsZW1lbnRbMF0mJmQuc25hcEVsZW1lbnRzLnB1c2goe2l0ZW06dGhpcyx3aWR0aDpiLm91dGVyV2lkdGgoKSxoZWlnaHQ6Yi5vdXRlckhlaWdodCgpLHRvcDpjLnRvcCxsZWZ0OmMubGVmdH0pfSl9LGRyYWc6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLGU9ZC5vcHRpb25zLGY9ZS5zbmFwVG9sZXJhbmNlLGc9Yy5vZmZzZXQubGVmdCxoPWcrZC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCxpPWMub2Zmc2V0LnRvcCxqPWkrZC5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQ7Zm9yKHZhciBrPWQuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2s+PTA7ay0tKXt2YXIgbD1kLnNuYXBFbGVtZW50c1trXS5sZWZ0LG09bCtkLnNuYXBFbGVtZW50c1trXS53aWR0aCxuPWQuc25hcEVsZW1lbnRzW2tdLnRvcCxvPW4rZC5zbmFwRWxlbWVudHNba10uaGVpZ2h0O2lmKCEobC1mPGcmJmc8bStmJiZuLWY8aSYmaTxvK2Z8fGwtZjxnJiZnPG0rZiYmbi1mPGomJmo8bytmfHxsLWY8aCYmaDxtK2YmJm4tZjxpJiZpPG8rZnx8bC1mPGgmJmg8bStmJiZuLWY8aiYmajxvK2YpKXtkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZyYmZC5vcHRpb25zLnNuYXAucmVsZWFzZSYmZC5vcHRpb25zLnNuYXAucmVsZWFzZS5jYWxsKGQuZWxlbWVudCxiLGEuZXh0ZW5kKGQuX3VpSGFzaCgpLHtzbmFwSXRlbTpkLnNuYXBFbGVtZW50c1trXS5pdGVtfSkpLGQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nPSExO2NvbnRpbnVlfWlmKGUuc25hcE1vZGUhPSJpbm5lciIpe3ZhciBwPU1hdGguYWJzKG4taik8PWYscT1NYXRoLmFicyhvLWkpPD1mLHI9TWF0aC5hYnMobC1oKTw9ZixzPU1hdGguYWJzKG0tZyk8PWY7cCYmKGMucG9zaXRpb24udG9wPWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDpuLWQuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGxlZnQ6MH0pLnRvcC1kLm1hcmdpbnMudG9wKSxxJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm8sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHImJihjLnBvc2l0aW9uLmxlZnQ9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpsLWQuaGVscGVyUHJvcG9ydGlvbnMud2lkdGh9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bX0pLmxlZnQtZC5tYXJnaW5zLmxlZnQpfXZhciB0PXB8fHF8fHJ8fHM7aWYoZS5zbmFwTW9kZSE9Im91dGVyIil7dmFyIHA9TWF0aC5hYnMobi1pKTw9ZixxPU1hdGguYWJzKG8taik8PWYscj1NYXRoLmFicyhsLWcpPD1mLHM9TWF0aC5hYnMobS1oKTw9ZjtwJiYoYy5wb3NpdGlvbi50b3A9ZC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOm4sbGVmdDowfSkudG9wLWQubWFyZ2lucy50b3ApLHEmJihjLnBvc2l0aW9uLnRvcD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6by1kLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3AtZC5tYXJnaW5zLnRvcCksciYmKGMucG9zaXRpb24ubGVmdD1kLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omx9KS5sZWZ0LWQubWFyZ2lucy5sZWZ0KSxzJiYoYy5wb3NpdGlvbi5sZWZ0PWQuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6bS1kLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdC1kLm1hcmdpbnMubGVmdCl9IWQuc25hcEVsZW1lbnRzW2tdLnNuYXBwaW5nJiYocHx8cXx8cnx8c3x8dCkmJmQub3B0aW9ucy5zbmFwLnNuYXAmJmQub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChkLmVsZW1lbnQsYixhLmV4dGVuZChkLl91aUhhc2goKSx7c25hcEl0ZW06ZC5zbmFwRWxlbWVudHNba10uaXRlbX0pKSxkLnNuYXBFbGVtZW50c1trXS5zbmFwcGluZz1wfHxxfHxyfHxzfHx0fX19KSxhLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsInN0YWNrIix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnMsZT1hLm1ha2VBcnJheShhKGQuc3RhY2spKS5zb3J0KGZ1bmN0aW9uKGIsYyl7cmV0dXJuKHBhcnNlSW50KGEoYikuY3NzKCJ6SW5kZXgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygiekluZGV4IiksMTApfHwwKX0pO2lmKCFlLmxlbmd0aClyZXR1cm47dmFyIGY9cGFyc2VJbnQoZVswXS5zdHlsZS56SW5kZXgpfHwwO2EoZSkuZWFjaChmdW5jdGlvbihhKXt0aGlzLnN0eWxlLnpJbmRleD1mK2F9KSx0aGlzWzBdLnN0eWxlLnpJbmRleD1mK2UubGVuZ3RofX0pLGEudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKGMuaGVscGVyKSxlPWEodGhpcykuZGF0YSgiZHJhZ2dhYmxlIikub3B0aW9ucztkLmNzcygiekluZGV4IikmJihlLl96SW5kZXg9ZC5jc3MoInpJbmRleCIpKSxkLmNzcygiekluZGV4IixlLnpJbmRleCl9LHN0b3A6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImRyYWdnYWJsZSIpLm9wdGlvbnM7ZC5fekluZGV4JiZhKGMuaGVscGVyKS5jc3MoInpJbmRleCIsZC5fekluZGV4KX19KX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLmRyb3BwYWJsZS5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuZHJvcHBhYmxlIix7d2lkZ2V0RXZlbnRQcmVmaXg6ImRyb3AiLG9wdGlvbnM6e2FjY2VwdDoiKiIsYWN0aXZlQ2xhc3M6ITEsYWRkQ2xhc3NlczohMCxncmVlZHk6ITEsaG92ZXJDbGFzczohMSxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QifSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zLGM9Yi5hY2NlcHQ7dGhpcy5pc292ZXI9MCx0aGlzLmlzb3V0PTEsdGhpcy5hY2NlcHQ9YS5pc0Z1bmN0aW9uKGMpP2M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXMoYyl9LHRoaXMucHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodH0sYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLnNjb3BlXT1hLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iuc2NvcGVdfHxbXSxhLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW2Iuc2NvcGVdLnB1c2godGhpcyksYi5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyb3BwYWJsZSIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGI9YS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0aGlzLm9wdGlvbnMuc2NvcGVdO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWJbY109PXRoaXMmJmIuc3BsaWNlKGMsMSk7cmV0dXJuIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJvcHBhYmxlIHVpLWRyb3BwYWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoImRyb3BwYWJsZSIpLnVuYmluZCgiLmRyb3BwYWJsZSIpLHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXtiPT0iYWNjZXB0IiYmKHRoaXMuYWNjZXB0PWEuaXNGdW5jdGlvbihjKT9jOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzKGMpfSksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5kZG1hbmFnZXIuY3VycmVudDt0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLGMmJnRoaXMuX3RyaWdnZXIoImFjdGl2YXRlIixiLHRoaXMudWkoYykpfSxfZGVhY3RpdmF0ZTpmdW5jdGlvbihiKXt2YXIgYz1hLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksYyYmdGhpcy5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsYix0aGlzLnVpKGMpKX0sX292ZXI6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5kZG1hbmFnZXIuY3VycmVudDtpZighY3x8KGMuY3VycmVudEl0ZW18fGMuZWxlbWVudClbMF09PXRoaXMuZWxlbWVudFswXSlyZXR1cm47dGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYy5jdXJyZW50SXRlbXx8Yy5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm92ZXIiLGIsdGhpcy51aShjKSkpfSxfb3V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoIWN8fChjLmN1cnJlbnRJdGVtfHxjLmVsZW1lbnQpWzBdPT10aGlzLmVsZW1lbnRbMF0pcmV0dXJuO3RoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLGMuY3VycmVudEl0ZW18fGMuZWxlbWVudCkmJih0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzKSx0aGlzLl90cmlnZ2VyKCJvdXQiLGIsdGhpcy51aShjKSkpfSxfZHJvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWN8fGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7aWYoIWR8fChkLmN1cnJlbnRJdGVtfHxkLmVsZW1lbnQpWzBdPT10aGlzLmVsZW1lbnRbMF0pcmV0dXJuITE7dmFyIGU9ITE7cmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikubm90KCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEuZGF0YSh0aGlzLCJkcm9wcGFibGUiKTtpZihiLm9wdGlvbnMuZ3JlZWR5JiYhYi5vcHRpb25zLmRpc2FibGVkJiZiLm9wdGlvbnMuc2NvcGU9PWQub3B0aW9ucy5zY29wZSYmYi5hY2NlcHQuY2FsbChiLmVsZW1lbnRbMF0sZC5jdXJyZW50SXRlbXx8ZC5lbGVtZW50KSYmYS51aS5pbnRlcnNlY3QoZCxhLmV4dGVuZChiLHtvZmZzZXQ6Yi5lbGVtZW50Lm9mZnNldCgpfSksYi5vcHRpb25zLnRvbGVyYW5jZSkpcmV0dXJuIGU9ITAsITF9KSxlPyExOnRoaXMuYWNjZXB0LmNhbGwodGhpcy5lbGVtZW50WzBdLGQuY3VycmVudEl0ZW18fGQuZWxlbWVudCk/KHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksdGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigiZHJvcCIsYix0aGlzLnVpKGQpKSx0aGlzLmVsZW1lbnQpOiExfSx1aTpmdW5jdGlvbihhKXtyZXR1cm57ZHJhZ2dhYmxlOmEuY3VycmVudEl0ZW18fGEuZWxlbWVudCxoZWxwZXI6YS5oZWxwZXIscG9zaXRpb246YS5wb3NpdGlvbixvZmZzZXQ6YS5wb3NpdGlvbkFic319fSksYS5leHRlbmQoYS51aS5kcm9wcGFibGUse3ZlcnNpb246IjEuOC4yMyJ9KSxhLnVpLmludGVyc2VjdD1mdW5jdGlvbihiLGMsZCl7aWYoIWMub2Zmc2V0KXJldHVybiExO3ZhciBlPShiLnBvc2l0aW9uQWJzfHxiLnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0LGY9ZStiLmhlbHBlclByb3BvcnRpb25zLndpZHRoLGc9KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLnRvcCxoPWcrYi5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsaT1jLm9mZnNldC5sZWZ0LGo9aStjLnByb3BvcnRpb25zLndpZHRoLGs9Yy5vZmZzZXQudG9wLGw9aytjLnByb3BvcnRpb25zLmhlaWdodDtzd2l0Y2goZCl7Y2FzZSJmaXQiOnJldHVybiBpPD1lJiZmPD1qJiZrPD1nJiZoPD1sO2Nhc2UiaW50ZXJzZWN0IjpyZXR1cm4gaTxlK2IuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmZi1iLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI8aiYmazxnK2IuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzImJmgtYi5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMjxsO2Nhc2UicG9pbnRlciI6dmFyIG09KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLmxlZnQrKGIuY2xpY2tPZmZzZXR8fGIub2Zmc2V0LmNsaWNrKS5sZWZ0LG49KGIucG9zaXRpb25BYnN8fGIucG9zaXRpb24uYWJzb2x1dGUpLnRvcCsoYi5jbGlja09mZnNldHx8Yi5vZmZzZXQuY2xpY2spLnRvcCxvPWEudWkuaXNPdmVyKG4sbSxrLGksYy5wcm9wb3J0aW9ucy5oZWlnaHQsYy5wcm9wb3J0aW9ucy53aWR0aCk7cmV0dXJuIG87Y2FzZSJ0b3VjaCI6cmV0dXJuKGc+PWsmJmc8PWx8fGg+PWsmJmg8PWx8fGc8ayYmaD5sKSYmKGU+PWkmJmU8PWp8fGY+PWkmJmY8PWp8fGU8aSYmZj5qKTtkZWZhdWx0OnJldHVybiExfX0sYS51aS5kZG1hbmFnZXI9e2N1cnJlbnQ6bnVsbCxkcm9wcGFibGVzOnsiZGVmYXVsdCI6W119LHByZXBhcmVPZmZzZXRzOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLm9wdGlvbnMuc2NvcGVdfHxbXSxlPWM/Yy50eXBlOm51bGwsZj0oYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KS5maW5kKCI6ZGF0YShkcm9wcGFibGUpIikuYW5kU2VsZigpO2c6Zm9yKHZhciBoPTA7aDxkLmxlbmd0aDtoKyspe2lmKGRbaF0ub3B0aW9ucy5kaXNhYmxlZHx8YiYmIWRbaF0uYWNjZXB0LmNhbGwoZFtoXS5lbGVtZW50WzBdLGIuY3VycmVudEl0ZW18fGIuZWxlbWVudCkpY29udGludWU7Zm9yKHZhciBpPTA7aTxmLmxlbmd0aDtpKyspaWYoZltpXT09ZFtoXS5lbGVtZW50WzBdKXtkW2hdLnByb3BvcnRpb25zLmhlaWdodD0wO2NvbnRpbnVlIGd9ZFtoXS52aXNpYmxlPWRbaF0uZWxlbWVudC5jc3MoImRpc3BsYXkiKSE9Im5vbmUiO2lmKCFkW2hdLnZpc2libGUpY29udGludWU7ZT09Im1vdXNlZG93biImJmRbaF0uX2FjdGl2YXRlLmNhbGwoZFtoXSxjKSxkW2hdLm9mZnNldD1kW2hdLmVsZW1lbnQub2Zmc2V0KCksZFtoXS5wcm9wb3J0aW9ucz17d2lkdGg6ZFtoXS5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDpkW2hdLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fX19LGRyb3A6ZnVuY3Rpb24oYixjKXt2YXIgZD0hMTtyZXR1cm4gYS5lYWNoKGEudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbYi5vcHRpb25zLnNjb3BlXXx8W10sZnVuY3Rpb24oKXtpZighdGhpcy5vcHRpb25zKXJldHVybjshdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJmEudWkuaW50ZXJzZWN0KGIsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlKSYmKGQ9dGhpcy5fZHJvcC5jYWxsKHRoaXMsYyl8fGQpLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMudmlzaWJsZSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYi5jdXJyZW50SXRlbXx8Yi5lbGVtZW50KSYmKHRoaXMuaXNvdXQ9MSx0aGlzLmlzb3Zlcj0wLHRoaXMuX2RlYWN0aXZhdGUuY2FsbCh0aGlzLGMpKX0pLGR9LGRyYWdTdGFydDpmdW5jdGlvbihiLGMpe2IuZWxlbWVudC5wYXJlbnRzKCI6bm90KGJvZHksaHRtbCkiKS5iaW5kKCJzY3JvbGwuZHJvcHBhYmxlIixmdW5jdGlvbigpe2Iub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zfHxhLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhiLGMpfSl9LGRyYWc6ZnVuY3Rpb24oYixjKXtiLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9ucyYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoYixjKSxhLmVhY2goYS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1tiLm9wdGlvbnMuc2NvcGVdfHxbXSxmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5ncmVlZHlDaGlsZHx8IXRoaXMudmlzaWJsZSlyZXR1cm47dmFyIGQ9YS51aS5pbnRlcnNlY3QoYix0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UpLGU9IWQmJnRoaXMuaXNvdmVyPT0xPyJpc291dCI6ZCYmdGhpcy5pc292ZXI9PTA/Imlzb3ZlciI6bnVsbDtpZighZSlyZXR1cm47dmFyIGY7aWYodGhpcy5vcHRpb25zLmdyZWVkeSl7dmFyIGc9dGhpcy5lbGVtZW50LnBhcmVudHMoIjpkYXRhKGRyb3BwYWJsZSk6ZXEoMCkiKTtnLmxlbmd0aCYmKGY9YS5kYXRhKGdbMF0sImRyb3BwYWJsZSIpLGYuZ3JlZWR5Q2hpbGQ9ZT09Imlzb3ZlciI/MTowKX1mJiZlPT0iaXNvdmVyIiYmKGYuaXNvdmVyPTAsZi5pc291dD0xLGYuX291dC5jYWxsKGYsYykpLHRoaXNbZV09MSx0aGlzW2U9PSJpc291dCI/Imlzb3ZlciI6Imlzb3V0Il09MCx0aGlzW2U9PSJpc292ZXIiPyJfb3ZlciI6Il9vdXQiXS5jYWxsKHRoaXMsYyksZiYmZT09Imlzb3V0IiYmKGYuaXNvdXQ9MCxmLmlzb3Zlcj0xLGYuX292ZXIuY2FsbChmLGMpKX0pfSxkcmFnU3RvcDpmdW5jdGlvbihiLGMpe2IuZWxlbWVudC5wYXJlbnRzKCI6bm90KGJvZHksaHRtbCkiKS51bmJpbmQoInNjcm9sbC5kcm9wcGFibGUiKSxiLm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8YS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHMoYixjKX19fSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkudWkucmVzaXphYmxlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2Eud2lkZ2V0KCJ1aS5yZXNpemFibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJyZXNpemUiLG9wdGlvbnM6e2Fsc29SZXNpemU6ITEsYW5pbWF0ZTohMSxhbmltYXRlRHVyYXRpb246InNsb3ciLGFuaW1hdGVFYXNpbmc6InN3aW5nIixhc3BlY3RSYXRpbzohMSxhdXRvSGlkZTohMSxjb250YWlubWVudDohMSxnaG9zdDohMSxncmlkOiExLGhhbmRsZXM6ImUscyxzZSIsaGVscGVyOiExLG1heEhlaWdodDpudWxsLG1heFdpZHRoOm51bGwsbWluSGVpZ2h0OjEwLG1pbldpZHRoOjEwLHpJbmRleDoxZTN9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktcmVzaXphYmxlIiksYS5leHRlbmQodGhpcyx7X2FzcGVjdFJhdGlvOiEhYy5hc3BlY3RSYXRpbyxhc3BlY3RSYXRpbzpjLmFzcGVjdFJhdGlvLG9yaWdpbmFsRWxlbWVudDp0aGlzLmVsZW1lbnQsX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHM6W10sX2hlbHBlcjpjLmhlbHBlcnx8Yy5naG9zdHx8Yy5hbmltYXRlP2MuaGVscGVyfHwidWktcmVzaXphYmxlLWhlbHBlciI6bnVsbH0pLHRoaXMuZWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvY2FudmFzfHRleHRhcmVhfGlucHV0fHNlbGVjdHxidXR0b258aW1nL2kpJiYodGhpcy5lbGVtZW50LndyYXAoYSgnPGRpdiBjbGFzcz0idWktd3JhcHBlciIgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW47Ij48L2Rpdj4nKS5jc3Moe3Bvc2l0aW9uOnRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIiksd2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCksdG9wOnRoaXMuZWxlbWVudC5jc3MoInRvcCIpLGxlZnQ6dGhpcy5lbGVtZW50LmNzcygibGVmdCIpfSkpLHRoaXMuZWxlbWVudD10aGlzLmVsZW1lbnQucGFyZW50KCkuZGF0YSgicmVzaXphYmxlIix0aGlzLmVsZW1lbnQuZGF0YSgicmVzaXphYmxlIikpLHRoaXMuZWxlbWVudElzV3JhcHBlcj0hMCx0aGlzLmVsZW1lbnQuY3NzKHttYXJnaW5MZWZ0OnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luTGVmdCIpLG1hcmdpblRvcDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLG1hcmdpblJpZ2h0OnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luUmlnaHQiKSxtYXJnaW5Cb3R0b206dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Cb3R0b20iKX0pLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7bWFyZ2luTGVmdDowLG1hcmdpblRvcDowLG1hcmdpblJpZ2h0OjAsbWFyZ2luQm90dG9tOjB9KSx0aGlzLm9yaWdpbmFsUmVzaXplU3R5bGU9dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsIm5vbmUiKSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLnB1c2godGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKHtwb3NpdGlvbjoic3RhdGljIix6b29tOjEsZGlzcGxheToiYmxvY2sifSkpLHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7bWFyZ2luOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luIil9KSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpKSx0aGlzLmhhbmRsZXM9Yy5oYW5kbGVzfHwoYSgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiLHRoaXMuZWxlbWVudCkubGVuZ3RoP3tuOiIudWktcmVzaXphYmxlLW4iLGU6Ii51aS1yZXNpemFibGUtZSIsczoiLnVpLXJlc2l6YWJsZS1zIix3OiIudWktcmVzaXphYmxlLXciLHNlOiIudWktcmVzaXphYmxlLXNlIixzdzoiLnVpLXJlc2l6YWJsZS1zdyIsbmU6Ii51aS1yZXNpemFibGUtbmUiLG53OiIudWktcmVzaXphYmxlLW53In06ImUscyxzZSIpO2lmKHRoaXMuaGFuZGxlcy5jb25zdHJ1Y3Rvcj09U3RyaW5nKXt0aGlzLmhhbmRsZXM9PSJhbGwiJiYodGhpcy5oYW5kbGVzPSJuLGUscyx3LHNlLHN3LG5lLG53Iik7dmFyIGQ9dGhpcy5oYW5kbGVzLnNwbGl0KCIsIik7dGhpcy5oYW5kbGVzPXt9O2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1hLnRyaW0oZFtlXSksZz0idWktcmVzaXphYmxlLSIrZixoPWEoJzxkaXYgY2xhc3M9InVpLXJlc2l6YWJsZS1oYW5kbGUgJytnKyciPjwvZGl2PicpO2guY3NzKHt6SW5kZXg6Yy56SW5kZXh9KSwic2UiPT1mJiZoLmFkZENsYXNzKCJ1aS1pY29uIHVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIiksdGhpcy5oYW5kbGVzW2ZdPSIudWktcmVzaXphYmxlLSIrZix0aGlzLmVsZW1lbnQuYXBwZW5kKGgpfX10aGlzLl9yZW5kZXJBeGlzPWZ1bmN0aW9uKGIpe2I9Ynx8dGhpcy5lbGVtZW50O2Zvcih2YXIgYyBpbiB0aGlzLmhhbmRsZXMpe3RoaXMuaGFuZGxlc1tjXS5jb25zdHJ1Y3Rvcj09U3RyaW5nJiYodGhpcy5oYW5kbGVzW2NdPWEodGhpcy5oYW5kbGVzW2NdLHRoaXMuZWxlbWVudCkuc2hvdygpKTtpZih0aGlzLmVsZW1lbnRJc1dyYXBwZXImJnRoaXMub3JpZ2luYWxFbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC90ZXh0YXJlYXxpbnB1dHxzZWxlY3R8YnV0dG9uL2kpKXt2YXIgZD1hKHRoaXMuaGFuZGxlc1tjXSx0aGlzLmVsZW1lbnQpLGU9MDtlPS9zd3xuZXxud3xzZXxufHMvLnRlc3QoYyk/ZC5vdXRlckhlaWdodCgpOmQub3V0ZXJXaWR0aCgpO3ZhciBmPVsicGFkZGluZyIsL25lfG53fG4vLnRlc3QoYyk/IlRvcCI6L3NlfHN3fHMvLnRlc3QoYyk/IkJvdHRvbSI6L15lJC8udGVzdChjKT8iUmlnaHQiOiJMZWZ0Il0uam9pbigiIik7Yi5jc3MoZixlKSx0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpfWlmKCFhKHRoaXMuaGFuZGxlc1tjXSkubGVuZ3RoKWNvbnRpbnVlfX0sdGhpcy5fcmVuZGVyQXhpcyh0aGlzLmVsZW1lbnQpLHRoaXMuX2hhbmRsZXM9YSgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiLHRoaXMuZWxlbWVudCkuZGlzYWJsZVNlbGVjdGlvbigpLHRoaXMuX2hhbmRsZXMubW91c2VvdmVyKGZ1bmN0aW9uKCl7aWYoIWIucmVzaXppbmcpe2lmKHRoaXMuY2xhc3NOYW1lKXZhciBhPXRoaXMuY2xhc3NOYW1lLm1hdGNoKC91aS1yZXNpemFibGUtKHNlfHN3fG5lfG53fG58ZXxzfHcpL2kpO2IuYXhpcz1hJiZhWzFdP2FbMV06InNlIn19KSxjLmF1dG9IaWRlJiYodGhpcy5faGFuZGxlcy5oaWRlKCksYSh0aGlzLmVsZW1lbnQpLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKS5ob3ZlcihmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLGIuX2hhbmRsZXMuc2hvdygpfSxmdW5jdGlvbigpe2lmKGMuZGlzYWJsZWQpcmV0dXJuO2IucmVzaXppbmd8fChhKHRoaXMpLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSxiLl9oYW5kbGVzLmhpZGUoKSl9KSksdGhpcy5fbW91c2VJbml0KCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTt2YXIgYj1mdW5jdGlvbihiKXthKGIpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUgdWktcmVzaXphYmxlLWRpc2FibGVkIHVpLXJlc2l6YWJsZS1yZXNpemluZyIpLnJlbW92ZURhdGEoInJlc2l6YWJsZSIpLnVuYmluZCgiLnJlc2l6YWJsZSIpLmZpbmQoIi51aS1yZXNpemFibGUtaGFuZGxlIikucmVtb3ZlKCl9O2lmKHRoaXMuZWxlbWVudElzV3JhcHBlcil7Yih0aGlzLmVsZW1lbnQpO3ZhciBjPXRoaXMuZWxlbWVudDtjLmFmdGVyKHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246Yy5jc3MoInBvc2l0aW9uIiksd2lkdGg6Yy5vdXRlcldpZHRoKCksaGVpZ2h0OmMub3V0ZXJIZWlnaHQoKSx0b3A6Yy5jc3MoInRvcCIpLGxlZnQ6Yy5jc3MoImxlZnQiKX0pKS5yZW1vdmUoKX1yZXR1cm4gdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLHRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSksYih0aGlzLm9yaWdpbmFsRWxlbWVudCksdGhpc30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihiKXt2YXIgYz0hMTtmb3IodmFyIGQgaW4gdGhpcy5oYW5kbGVzKWEodGhpcy5oYW5kbGVzW2RdKVswXT09Yi50YXJnZXQmJihjPSEwKTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZjfSxfbW91c2VTdGFydDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLmVsZW1lbnQucG9zaXRpb24oKSxmPXRoaXMuZWxlbWVudDt0aGlzLnJlc2l6aW5nPSEwLHRoaXMuZG9jdW1lbnRTY3JvbGw9e3RvcDphKGRvY3VtZW50KS5zY3JvbGxUb3AoKSxsZWZ0OmEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKX0sKGYuaXMoIi51aS1kcmFnZ2FibGUiKXx8L2Fic29sdXRlLy50ZXN0KGYuY3NzKCJwb3NpdGlvbiIpKSkmJmYuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDplLnRvcCxsZWZ0OmUubGVmdH0pLHRoaXMuX3JlbmRlclByb3h5KCk7dmFyIGc9Yyh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSksaD1jKHRoaXMuaGVscGVyLmNzcygidG9wIikpO2QuY29udGFpbm1lbnQmJihnKz1hKGQuY29udGFpbm1lbnQpLnNjcm9sbExlZnQoKXx8MCxoKz1hKGQuY29udGFpbm1lbnQpLnNjcm9sbFRvcCgpfHwwKSx0aGlzLm9mZnNldD10aGlzLmhlbHBlci5vZmZzZXQoKSx0aGlzLnBvc2l0aW9uPXtsZWZ0OmcsdG9wOmh9LHRoaXMuc2l6ZT10aGlzLl9oZWxwZXI/e3dpZHRoOmYub3V0ZXJXaWR0aCgpLGhlaWdodDpmLm91dGVySGVpZ2h0KCl9Ont3aWR0aDpmLndpZHRoKCksaGVpZ2h0OmYuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6Zi5vdXRlcldpZHRoKCksaGVpZ2h0OmYub3V0ZXJIZWlnaHQoKX06e3dpZHRoOmYud2lkdGgoKSxoZWlnaHQ6Zi5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0OmcsdG9wOmh9LHRoaXMuc2l6ZURpZmY9e3dpZHRoOmYub3V0ZXJXaWR0aCgpLWYud2lkdGgoKSxoZWlnaHQ6Zi5vdXRlckhlaWdodCgpLWYuaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OmIucGFnZVgsdG9wOmIucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89dHlwZW9mIGQuYXNwZWN0UmF0aW89PSJudW1iZXIiP2QuYXNwZWN0UmF0aW86dGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxO3ZhciBpPWEoIi51aS1yZXNpemFibGUtIit0aGlzLmF4aXMpLmNzcygiY3Vyc29yIik7cmV0dXJuIGEoImJvZHkiKS5jc3MoImN1cnNvciIsaT09ImF1dG8iP3RoaXMuYXhpcysiLXJlc2l6ZSI6aSksZi5hZGRDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdGFydCIsYiksITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5oZWxwZXIsZD10aGlzLm9wdGlvbnMsZT17fSxmPXRoaXMsZz10aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbixoPXRoaXMuYXhpcyxpPWIucGFnZVgtZy5sZWZ0fHwwLGo9Yi5wYWdlWS1nLnRvcHx8MCxrPXRoaXMuX2NoYW5nZVtoXTtpZighaylyZXR1cm4hMTt2YXIgbD1rLmFwcGx5KHRoaXMsW2IsaSxqXSksbT1hLmJyb3dzZXIubXNpZSYmYS5icm93c2VyLnZlcnNpb248NyxuPXRoaXMuc2l6ZURpZmY7dGhpcy5fdXBkYXRlVmlydHVhbEJvdW5kYXJpZXMoYi5zaGlmdEtleSk7aWYodGhpcy5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXkpbD10aGlzLl91cGRhdGVSYXRpbyhsLGIpO3JldHVybiBsPXRoaXMuX3Jlc3BlY3RTaXplKGwsYiksdGhpcy5fcHJvcGFnYXRlKCJyZXNpemUiLGIpLGMuY3NzKHt0b3A6dGhpcy5wb3NpdGlvbi50b3ArInB4IixsZWZ0OnRoaXMucG9zaXRpb24ubGVmdCsicHgiLHdpZHRoOnRoaXMuc2l6ZS53aWR0aCsicHgiLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0KyJweCJ9KSwhdGhpcy5faGVscGVyJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aCYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSx0aGlzLl91cGRhdGVDYWNoZShsKSx0aGlzLl90cmlnZ2VyKCJyZXNpemUiLGIsdGhpcy51aSgpKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihiKXt0aGlzLnJlc2l6aW5nPSExO3ZhciBjPXRoaXMub3B0aW9ucyxkPXRoaXM7aWYodGhpcy5faGVscGVyKXt2YXIgZT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGY9ZS5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoZVswXS5ub2RlTmFtZSksZz1mJiZhLnVpLmhhc1Njcm9sbChlWzBdLCJsZWZ0Iik/MDpkLnNpemVEaWZmLmhlaWdodCxoPWY/MDpkLnNpemVEaWZmLndpZHRoLGk9e3dpZHRoOmQuaGVscGVyLndpZHRoKCktaCxoZWlnaHQ6ZC5oZWxwZXIuaGVpZ2h0KCktZ30saj1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApKyhkLnBvc2l0aW9uLmxlZnQtZC5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLGs9cGFyc2VJbnQoZC5lbGVtZW50LmNzcygidG9wIiksMTApKyhkLnBvc2l0aW9uLnRvcC1kLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbDtjLmFuaW1hdGV8fHRoaXMuZWxlbWVudC5jc3MoYS5leHRlbmQoaSx7dG9wOmssbGVmdDpqfSkpLGQuaGVscGVyLmhlaWdodChkLnNpemUuaGVpZ2h0KSxkLmhlbHBlci53aWR0aChkLnNpemUud2lkdGgpLHRoaXMuX2hlbHBlciYmIWMuYW5pbWF0ZSYmdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKX1yZXR1cm4gYSgiYm9keSIpLmNzcygiY3Vyc29yIiwiYXV0byIpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktcmVzaXphYmxlLXJlc2l6aW5nIiksdGhpcy5fcHJvcGFnYXRlKCJzdG9wIixiKSx0aGlzLl9oZWxwZXImJnRoaXMuaGVscGVyLnJlbW92ZSgpLCExfSxfdXBkYXRlVmlydHVhbEJvdW5kYXJpZXM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGMsZSxmLGcsaDtoPXttaW5XaWR0aDpkKGIubWluV2lkdGgpP2IubWluV2lkdGg6MCxtYXhXaWR0aDpkKGIubWF4V2lkdGgpP2IubWF4V2lkdGg6SW5maW5pdHksbWluSGVpZ2h0OmQoYi5taW5IZWlnaHQpP2IubWluSGVpZ2h0OjAsbWF4SGVpZ2h0OmQoYi5tYXhIZWlnaHQpP2IubWF4SGVpZ2h0OkluZmluaXR5fTtpZih0aGlzLl9hc3BlY3RSYXRpb3x8YSljPWgubWluSGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW8sZj1oLm1pbldpZHRoL3RoaXMuYXNwZWN0UmF0aW8sZT1oLm1heEhlaWdodCp0aGlzLmFzcGVjdFJhdGlvLGc9aC5tYXhXaWR0aC90aGlzLmFzcGVjdFJhdGlvLGM+aC5taW5XaWR0aCYmKGgubWluV2lkdGg9YyksZj5oLm1pbkhlaWdodCYmKGgubWluSGVpZ2h0PWYpLGU8aC5tYXhXaWR0aCYmKGgubWF4V2lkdGg9ZSksZzxoLm1heEhlaWdodCYmKGgubWF4SGVpZ2h0PWcpO3RoaXMuX3ZCb3VuZGFyaWVzPWh9LF91cGRhdGVDYWNoZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnM7dGhpcy5vZmZzZXQ9dGhpcy5oZWxwZXIub2Zmc2V0KCksZChhLmxlZnQpJiYodGhpcy5wb3NpdGlvbi5sZWZ0PWEubGVmdCksZChhLnRvcCkmJih0aGlzLnBvc2l0aW9uLnRvcD1hLnRvcCksZChhLmhlaWdodCkmJih0aGlzLnNpemUuaGVpZ2h0PWEuaGVpZ2h0KSxkKGEud2lkdGgpJiYodGhpcy5zaXplLndpZHRoPWEud2lkdGgpfSxfdXBkYXRlUmF0aW86ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLm9wdGlvbnMsZT10aGlzLnBvc2l0aW9uLGY9dGhpcy5zaXplLGc9dGhpcy5heGlzO3JldHVybiBkKGEuaGVpZ2h0KT9hLndpZHRoPWEuaGVpZ2h0KnRoaXMuYXNwZWN0UmF0aW86ZChhLndpZHRoKSYmKGEuaGVpZ2h0PWEud2lkdGgvdGhpcy5hc3BlY3RSYXRpbyksZz09InN3IiYmKGEubGVmdD1lLmxlZnQrKGYud2lkdGgtYS53aWR0aCksYS50b3A9bnVsbCksZz09Im53IiYmKGEudG9wPWUudG9wKyhmLmhlaWdodC1hLmhlaWdodCksYS5sZWZ0PWUubGVmdCsoZi53aWR0aC1hLndpZHRoKSksYX0sX3Jlc3BlY3RTaXplOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5oZWxwZXIsZT10aGlzLl92Qm91bmRhcmllcyxmPXRoaXMuX2FzcGVjdFJhdGlvfHxiLnNoaWZ0S2V5LGc9dGhpcy5heGlzLGg9ZChhLndpZHRoKSYmZS5tYXhXaWR0aCYmZS5tYXhXaWR0aDxhLndpZHRoLGk9ZChhLmhlaWdodCkmJmUubWF4SGVpZ2h0JiZlLm1heEhlaWdodDxhLmhlaWdodCxqPWQoYS53aWR0aCkmJmUubWluV2lkdGgmJmUubWluV2lkdGg+YS53aWR0aCxrPWQoYS5oZWlnaHQpJiZlLm1pbkhlaWdodCYmZS5taW5IZWlnaHQ+YS5oZWlnaHQ7aiYmKGEud2lkdGg9ZS5taW5XaWR0aCksayYmKGEuaGVpZ2h0PWUubWluSGVpZ2h0KSxoJiYoYS53aWR0aD1lLm1heFdpZHRoKSxpJiYoYS5oZWlnaHQ9ZS5tYXhIZWlnaHQpO3ZhciBsPXRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0K3RoaXMub3JpZ2luYWxTaXplLndpZHRoLG09dGhpcy5wb3NpdGlvbi50b3ArdGhpcy5zaXplLmhlaWdodCxuPS9zd3xud3x3Ly50ZXN0KGcpLG89L253fG5lfG4vLnRlc3QoZyk7aiYmbiYmKGEubGVmdD1sLWUubWluV2lkdGgpLGgmJm4mJihhLmxlZnQ9bC1lLm1heFdpZHRoKSxrJiZvJiYoYS50b3A9bS1lLm1pbkhlaWdodCksaSYmbyYmKGEudG9wPW0tZS5tYXhIZWlnaHQpO3ZhciBwPSFhLndpZHRoJiYhYS5oZWlnaHQ7cmV0dXJuIHAmJiFhLmxlZnQmJmEudG9wP2EudG9wPW51bGw6cCYmIWEudG9wJiZhLmxlZnQmJihhLmxlZnQ9bnVsbCksYX0sX3Byb3BvcnRpb25hbGx5UmVzaXplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zO2lmKCF0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLmxlbmd0aClyZXR1cm47dmFyIGM9dGhpcy5oZWxwZXJ8fHRoaXMuZWxlbWVudDtmb3IodmFyIGQ9MDtkPHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1tkXTtpZighdGhpcy5ib3JkZXJEaWYpe3ZhciBmPVtlLmNzcygiYm9yZGVyVG9wV2lkdGgiKSxlLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpLGUuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLGUuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKV0sZz1bZS5jc3MoInBhZGRpbmdUb3AiKSxlLmNzcygicGFkZGluZ1JpZ2h0IiksZS5jc3MoInBhZGRpbmdCb3R0b20iKSxlLmNzcygicGFkZGluZ0xlZnQiKV07dGhpcy5ib3JkZXJEaWY9YS5tYXAoZixmdW5jdGlvbihhLGIpe3ZhciBjPXBhcnNlSW50KGEsMTApfHwwLGQ9cGFyc2VJbnQoZ1tiXSwxMCl8fDA7cmV0dXJuIGMrZH0pfWlmKCFhLmJyb3dzZXIubXNpZXx8IWEoYykuaXMoIjpoaWRkZW4iKSYmIWEoYykucGFyZW50cygiOmhpZGRlbiIpLmxlbmd0aCllLmNzcyh7aGVpZ2h0OmMuaGVpZ2h0KCktdGhpcy5ib3JkZXJEaWZbMF0tdGhpcy5ib3JkZXJEaWZbMl18fDAsd2lkdGg6Yy53aWR0aCgpLXRoaXMuYm9yZGVyRGlmWzFdLXRoaXMuYm9yZGVyRGlmWzNdfHwwfSk7ZWxzZSBjb250aW51ZX19LF9yZW5kZXJQcm94eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudCxjPXRoaXMub3B0aW9uczt0aGlzLmVsZW1lbnRPZmZzZXQ9Yi5vZmZzZXQoKTtpZih0aGlzLl9oZWxwZXIpe3RoaXMuaGVscGVyPXRoaXMuaGVscGVyfHxhKCc8ZGl2IHN0eWxlPSJvdmVyZmxvdzpoaWRkZW47Ij48L2Rpdj4nKTt2YXIgZD1hLmJyb3dzZXIubXNpZSYmYS5icm93c2VyLnZlcnNpb248NyxlPWQ/MTowLGY9ZD8yOi0xO3RoaXMuaGVscGVyLmFkZENsYXNzKHRoaXMuX2hlbHBlcikuY3NzKHt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpK2YsaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpK2YscG9zaXRpb246ImFic29sdXRlIixsZWZ0OnRoaXMuZWxlbWVudE9mZnNldC5sZWZ0LWUrInB4Iix0b3A6dGhpcy5lbGVtZW50T2Zmc2V0LnRvcC1lKyJweCIsekluZGV4OisrYy56SW5kZXh9KSx0aGlzLmhlbHBlci5hcHBlbmRUbygiYm9keSIpLmRpc2FibGVTZWxlY3Rpb24oKX1lbHNlIHRoaXMuaGVscGVyPXRoaXMuZWxlbWVudH0sX2NoYW5nZTp7ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJue3dpZHRoOnRoaXMub3JpZ2luYWxTaXplLndpZHRoK2J9fSx3OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLm9yaWdpbmFsU2l6ZSxmPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57bGVmdDpmLmxlZnQrYix3aWR0aDplLndpZHRoLWJ9fSxuOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm9wdGlvbnMsZT10aGlzLm9yaWdpbmFsU2l6ZSxmPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9wOmYudG9wK2MsaGVpZ2h0OmUuaGVpZ2h0LWN9fSxzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm57aGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodCtjfX0sc2U6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbYixjLGRdKSl9LHN3OmZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW2IsYyxkXSkpfSxuZTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGEuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFtiLGMsZF0pKX0sbnc6ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbYixjLGRdKSl9fSxfcHJvcGFnYXRlOmZ1bmN0aW9uKGIsYyl7YS51aS5wbHVnaW4uY2FsbCh0aGlzLGIsW2MsdGhpcy51aSgpXSksYiE9InJlc2l6ZSImJnRoaXMuX3RyaWdnZXIoYixjLHRoaXMudWkoKSl9LHBsdWdpbnM6e30sdWk6ZnVuY3Rpb24oKXtyZXR1cm57b3JpZ2luYWxFbGVtZW50OnRoaXMub3JpZ2luYWxFbGVtZW50LGVsZW1lbnQ6dGhpcy5lbGVtZW50LGhlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLHNpemU6dGhpcy5zaXplLG9yaWdpbmFsU2l6ZTp0aGlzLm9yaWdpbmFsU2l6ZSxvcmlnaW5hbFBvc2l0aW9uOnRoaXMub3JpZ2luYWxQb3NpdGlvbn19fSksYS5leHRlbmQoYS51aS5yZXNpemFibGUse3ZlcnNpb246IjEuOC4yMyJ9KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFsc29SZXNpemUiLHtzdGFydDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnMsZj1mdW5jdGlvbihiKXthKGIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpO2IuZGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiLHt3aWR0aDpwYXJzZUludChiLndpZHRoKCksMTApLGhlaWdodDpwYXJzZUludChiLmhlaWdodCgpLDEwKSxsZWZ0OnBhcnNlSW50KGIuY3NzKCJsZWZ0IiksMTApLHRvcDpwYXJzZUludChiLmNzcygidG9wIiksMTApfSl9KX07dHlwZW9mIGUuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFlLmFsc29SZXNpemUucGFyZW50Tm9kZT9lLmFsc29SZXNpemUubGVuZ3RoPyhlLmFsc29SZXNpemU9ZS5hbHNvUmVzaXplWzBdLGYoZS5hbHNvUmVzaXplKSk6YS5lYWNoKGUuYWxzb1Jlc2l6ZSxmdW5jdGlvbihhKXtmKGEpfSk6ZihlLmFsc29SZXNpemUpfSxyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5vcmlnaW5hbFNpemUsZz1kLm9yaWdpbmFsUG9zaXRpb24saD17aGVpZ2h0OmQuc2l6ZS5oZWlnaHQtZi5oZWlnaHR8fDAsd2lkdGg6ZC5zaXplLndpZHRoLWYud2lkdGh8fDAsdG9wOmQucG9zaXRpb24udG9wLWcudG9wfHwwLGxlZnQ6ZC5wb3NpdGlvbi5sZWZ0LWcubGVmdHx8MH0saT1mdW5jdGlvbihiLGQpe2EoYikuZWFjaChmdW5jdGlvbigpe3ZhciBiPWEodGhpcyksZT1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIiksZj17fSxnPWQmJmQubGVuZ3RoP2Q6Yi5wYXJlbnRzKGMub3JpZ2luYWxFbGVtZW50WzBdKS5sZW5ndGg/WyJ3aWR0aCIsImhlaWdodCJdOlsid2lkdGgiLCJoZWlnaHQiLCJ0b3AiLCJsZWZ0Il07YS5lYWNoKGcsZnVuY3Rpb24oYSxiKXt2YXIgYz0oZVtiXXx8MCkrKGhbYl18fDApO2MmJmM+PTAmJihmW2JdPWN8fG51bGwpfSksYi5jc3MoZil9KX07dHlwZW9mIGUuYWxzb1Jlc2l6ZT09Im9iamVjdCImJiFlLmFsc29SZXNpemUubm9kZVR5cGU/YS5lYWNoKGUuYWxzb1Jlc2l6ZSxmdW5jdGlvbihhLGIpe2koYSxiKX0pOmkoZS5hbHNvUmVzaXplKX0sc3RvcDpmdW5jdGlvbihiLGMpe2EodGhpcykucmVtb3ZlRGF0YSgicmVzaXphYmxlLWFsc29yZXNpemUiKX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFuaW1hdGUiLHtzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWQuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMsZz1mLmxlbmd0aCYmL3RleHRhcmVhL2kudGVzdChmWzBdLm5vZGVOYW1lKSxoPWcmJmEudWkuaGFzU2Nyb2xsKGZbMF0sImxlZnQiKT8wOmQuc2l6ZURpZmYuaGVpZ2h0LGk9Zz8wOmQuc2l6ZURpZmYud2lkdGgsaj17d2lkdGg6ZC5zaXplLndpZHRoLWksaGVpZ2h0OmQuc2l6ZS5oZWlnaHQtaH0saz1wYXJzZUludChkLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApKyhkLnBvc2l0aW9uLmxlZnQtZC5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpfHxudWxsLGw9cGFyc2VJbnQoZC5lbGVtZW50LmNzcygidG9wIiksMTApKyhkLnBvc2l0aW9uLnRvcC1kLm9yaWdpbmFsUG9zaXRpb24udG9wKXx8bnVsbDtkLmVsZW1lbnQuYW5pbWF0ZShhLmV4dGVuZChqLGwmJms/e3RvcDpsLGxlZnQ6a306e30pLHtkdXJhdGlvbjplLmFuaW1hdGVEdXJhdGlvbixlYXNpbmc6ZS5hbmltYXRlRWFzaW5nLHN0ZXA6ZnVuY3Rpb24oKXt2YXIgYz17d2lkdGg6cGFyc2VJbnQoZC5lbGVtZW50LmNzcygid2lkdGgiKSwxMCksaGVpZ2h0OnBhcnNlSW50KGQuZWxlbWVudC5jc3MoImhlaWdodCIpLDEwKSx0b3A6cGFyc2VJbnQoZC5lbGVtZW50LmNzcygidG9wIiksMTApLGxlZnQ6cGFyc2VJbnQoZC5lbGVtZW50LmNzcygibGVmdCIpLDEwKX07ZiYmZi5sZW5ndGgmJmEoZlswXSkuY3NzKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pLGQuX3VwZGF0ZUNhY2hlKGMpLGQuX3Byb3BhZ2F0ZSgicmVzaXplIixiKX19KX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImNvbnRhaW5tZW50Iix7c3RhcnQ6ZnVuY3Rpb24oYixkKXt2YXIgZT1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGY9ZS5vcHRpb25zLGc9ZS5lbGVtZW50LGg9Zi5jb250YWlubWVudCxpPWggaW5zdGFuY2VvZiBhP2guZ2V0KDApOi9wYXJlbnQvLnRlc3QoaCk/Zy5wYXJlbnQoKS5nZXQoMCk6aDtpZighaSlyZXR1cm47ZS5jb250YWluZXJFbGVtZW50PWEoaSk7aWYoL2RvY3VtZW50Ly50ZXN0KGgpfHxoPT1kb2N1bWVudCllLmNvbnRhaW5lck9mZnNldD17bGVmdDowLHRvcDowfSxlLmNvbnRhaW5lclBvc2l0aW9uPXtsZWZ0OjAsdG9wOjB9LGUucGFyZW50RGF0YT17ZWxlbWVudDphKGRvY3VtZW50KSxsZWZ0OjAsdG9wOjAsd2lkdGg6YShkb2N1bWVudCkud2lkdGgoKSxoZWlnaHQ6YShkb2N1bWVudCkuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHR9O2Vsc2V7dmFyIGo9YShpKSxrPVtdO2EoWyJUb3AiLCJSaWdodCIsIkxlZnQiLCJCb3R0b20iXSkuZWFjaChmdW5jdGlvbihhLGIpe2tbYV09YyhqLmNzcygicGFkZGluZyIrYikpfSksZS5jb250YWluZXJPZmZzZXQ9ai5vZmZzZXQoKSxlLmNvbnRhaW5lclBvc2l0aW9uPWoucG9zaXRpb24oKSxlLmNvbnRhaW5lclNpemU9e2hlaWdodDpqLmlubmVySGVpZ2h0KCkta1szXSx3aWR0aDpqLmlubmVyV2lkdGgoKS1rWzFdfTt2YXIgbD1lLmNvbnRhaW5lck9mZnNldCxtPWUuY29udGFpbmVyU2l6ZS5oZWlnaHQsbj1lLmNvbnRhaW5lclNpemUud2lkdGgsbz1hLnVpLmhhc1Njcm9sbChpLCJsZWZ0Iik/aS5zY3JvbGxXaWR0aDpuLHA9YS51aS5oYXNTY3JvbGwoaSk/aS5zY3JvbGxIZWlnaHQ6bTtlLnBhcmVudERhdGE9e2VsZW1lbnQ6aSxsZWZ0OmwubGVmdCx0b3A6bC50b3Asd2lkdGg6byxoZWlnaHQ6cH19fSxyZXNpemU6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5jb250YWluZXJTaXplLGc9ZC5jb250YWluZXJPZmZzZXQsaD1kLnNpemUsaT1kLnBvc2l0aW9uLGo9ZC5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXksaz17dG9wOjAsbGVmdDowfSxsPWQuY29udGFpbmVyRWxlbWVudDtsWzBdIT1kb2N1bWVudCYmL3N0YXRpYy8udGVzdChsLmNzcygicG9zaXRpb24iKSkmJihrPWcpLGkubGVmdDwoZC5faGVscGVyP2cubGVmdDowKSYmKGQuc2l6ZS53aWR0aD1kLnNpemUud2lkdGgrKGQuX2hlbHBlcj9kLnBvc2l0aW9uLmxlZnQtZy5sZWZ0OmQucG9zaXRpb24ubGVmdC1rLmxlZnQpLGomJihkLnNpemUuaGVpZ2h0PWQuc2l6ZS53aWR0aC9kLmFzcGVjdFJhdGlvKSxkLnBvc2l0aW9uLmxlZnQ9ZS5oZWxwZXI/Zy5sZWZ0OjApLGkudG9wPChkLl9oZWxwZXI/Zy50b3A6MCkmJihkLnNpemUuaGVpZ2h0PWQuc2l6ZS5oZWlnaHQrKGQuX2hlbHBlcj9kLnBvc2l0aW9uLnRvcC1nLnRvcDpkLnBvc2l0aW9uLnRvcCksaiYmKGQuc2l6ZS53aWR0aD1kLnNpemUuaGVpZ2h0KmQuYXNwZWN0UmF0aW8pLGQucG9zaXRpb24udG9wPWQuX2hlbHBlcj9nLnRvcDowKSxkLm9mZnNldC5sZWZ0PWQucGFyZW50RGF0YS5sZWZ0K2QucG9zaXRpb24ubGVmdCxkLm9mZnNldC50b3A9ZC5wYXJlbnREYXRhLnRvcCtkLnBvc2l0aW9uLnRvcDt2YXIgbT1NYXRoLmFicygoZC5faGVscGVyP2Qub2Zmc2V0LmxlZnQtay5sZWZ0OmQub2Zmc2V0LmxlZnQtay5sZWZ0KStkLnNpemVEaWZmLndpZHRoKSxuPU1hdGguYWJzKChkLl9oZWxwZXI/ZC5vZmZzZXQudG9wLWsudG9wOmQub2Zmc2V0LnRvcC1nLnRvcCkrZC5zaXplRGlmZi5oZWlnaHQpLG89ZC5jb250YWluZXJFbGVtZW50LmdldCgwKT09ZC5lbGVtZW50LnBhcmVudCgpLmdldCgwKSxwPS9yZWxhdGl2ZXxhYnNvbHV0ZS8udGVzdChkLmNvbnRhaW5lckVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKTtvJiZwJiYobS09ZC5wYXJlbnREYXRhLmxlZnQpLG0rZC5zaXplLndpZHRoPj1kLnBhcmVudERhdGEud2lkdGgmJihkLnNpemUud2lkdGg9ZC5wYXJlbnREYXRhLndpZHRoLW0saiYmKGQuc2l6ZS5oZWlnaHQ9ZC5zaXplLndpZHRoL2QuYXNwZWN0UmF0aW8pKSxuK2Quc2l6ZS5oZWlnaHQ+PWQucGFyZW50RGF0YS5oZWlnaHQmJihkLnNpemUuaGVpZ2h0PWQucGFyZW50RGF0YS5oZWlnaHQtbixqJiYoZC5zaXplLndpZHRoPWQuc2l6ZS5oZWlnaHQqZC5hc3BlY3RSYXRpbykpfSxzdG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWQucG9zaXRpb24sZz1kLmNvbnRhaW5lck9mZnNldCxoPWQuY29udGFpbmVyUG9zaXRpb24saT1kLmNvbnRhaW5lckVsZW1lbnQsaj1hKGQuaGVscGVyKSxrPWoub2Zmc2V0KCksbD1qLm91dGVyV2lkdGgoKS1kLnNpemVEaWZmLndpZHRoLG09ai5vdXRlckhlaWdodCgpLWQuc2l6ZURpZmYuaGVpZ2h0O2QuX2hlbHBlciYmIWUuYW5pbWF0ZSYmL3JlbGF0aXZlLy50ZXN0KGkuY3NzKCJwb3NpdGlvbiIpKSYmYSh0aGlzKS5jc3Moe2xlZnQ6ay5sZWZ0LWgubGVmdC1nLmxlZnQsd2lkdGg6bCxoZWlnaHQ6bX0pLGQuX2hlbHBlciYmIWUuYW5pbWF0ZSYmL3N0YXRpYy8udGVzdChpLmNzcygicG9zaXRpb24iKSkmJmEodGhpcykuY3NzKHtsZWZ0OmsubGVmdC1oLmxlZnQtZy5sZWZ0LHdpZHRoOmwsaGVpZ2h0Om19KX19KSxhLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdob3N0Iix7c3RhcnQ6ZnVuY3Rpb24oYixjKXt2YXIgZD1hKHRoaXMpLmRhdGEoInJlc2l6YWJsZSIpLGU9ZC5vcHRpb25zLGY9ZC5zaXplO2QuZ2hvc3Q9ZC5vcmlnaW5hbEVsZW1lbnQuY2xvbmUoKSxkLmdob3N0LmNzcyh7b3BhY2l0eTouMjUsZGlzcGxheToiYmxvY2siLHBvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OmYuaGVpZ2h0LHdpZHRoOmYud2lkdGgsbWFyZ2luOjAsbGVmdDowLHRvcDowfSkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1naG9zdCIpLmFkZENsYXNzKHR5cGVvZiBlLmdob3N0PT0ic3RyaW5nIj9lLmdob3N0OiIiKSxkLmdob3N0LmFwcGVuZFRvKGQuaGVscGVyKX0scmVzaXplOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucztkLmdob3N0JiZkLmdob3N0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIixoZWlnaHQ6ZC5zaXplLmhlaWdodCx3aWR0aDpkLnNpemUud2lkdGh9KX0sc3RvcDpmdW5jdGlvbihiLGMpe3ZhciBkPWEodGhpcykuZGF0YSgicmVzaXphYmxlIiksZT1kLm9wdGlvbnM7ZC5naG9zdCYmZC5oZWxwZXImJmQuaGVscGVyLmdldCgwKS5yZW1vdmVDaGlsZChkLmdob3N0LmdldCgwKSl9fSksYS51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCJncmlkIix7cmVzaXplOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9YSh0aGlzKS5kYXRhKCJyZXNpemFibGUiKSxlPWQub3B0aW9ucyxmPWQuc2l6ZSxnPWQub3JpZ2luYWxTaXplLGg9ZC5vcmlnaW5hbFBvc2l0aW9uLGk9ZC5heGlzLGo9ZS5fYXNwZWN0UmF0aW98fGIuc2hpZnRLZXk7ZS5ncmlkPXR5cGVvZiBlLmdyaWQ9PSJudW1iZXIiP1tlLmdyaWQsZS5ncmlkXTplLmdyaWQ7dmFyIGs9TWF0aC5yb3VuZCgoZi53aWR0aC1nLndpZHRoKS8oZS5ncmlkWzBdfHwxKSkqKGUuZ3JpZFswXXx8MSksbD1NYXRoLnJvdW5kKChmLmhlaWdodC1nLmhlaWdodCkvKGUuZ3JpZFsxXXx8MSkpKihlLmdyaWRbMV18fDEpOy9eKHNlfHN8ZSkkLy50ZXN0KGkpPyhkLnNpemUud2lkdGg9Zy53aWR0aCtrLGQuc2l6ZS5oZWlnaHQ9Zy5oZWlnaHQrbCk6L14obmUpJC8udGVzdChpKT8oZC5zaXplLndpZHRoPWcud2lkdGgrayxkLnNpemUuaGVpZ2h0PWcuaGVpZ2h0K2wsZC5wb3NpdGlvbi50b3A9aC50b3AtbCk6L14oc3cpJC8udGVzdChpKT8oZC5zaXplLndpZHRoPWcud2lkdGgrayxkLnNpemUuaGVpZ2h0PWcuaGVpZ2h0K2wsZC5wb3NpdGlvbi5sZWZ0PWgubGVmdC1rKTooZC5zaXplLndpZHRoPWcud2lkdGgrayxkLnNpemUuaGVpZ2h0PWcuaGVpZ2h0K2wsZC5wb3NpdGlvbi50b3A9aC50b3AtbCxkLnBvc2l0aW9uLmxlZnQ9aC5sZWZ0LWspfX0pO3ZhciBjPWZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUludChhLDEwKXx8MH0sZD1mdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VJbnQoYSwxMCkpfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLnNlbGVjdGFibGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGEudWkubW91c2Use29wdGlvbnM6e2FwcGVuZFRvOiJib2R5IixhdXRvUmVmcmVzaDohMCxkaXN0YW5jZTowLGZpbHRlcjoiKiIsdG9sZXJhbmNlOiJ0b3VjaCJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0YWJsZSIpLHRoaXMuZHJhZ2dlZD0hMTt2YXIgYzt0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXtjPWEoYi5vcHRpb25zLmZpbHRlcixiLmVsZW1lbnRbMF0pLGMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksYy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKSxjPWIub2Zmc2V0KCk7YS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIse2VsZW1lbnQ6dGhpcywkZWxlbWVudDpiLGxlZnQ6Yy5sZWZ0LHRvcDpjLnRvcCxyaWdodDpjLmxlZnQrYi5vdXRlcldpZHRoKCksYm90dG9tOmMudG9wK2Iub3V0ZXJIZWlnaHQoKSxzdGFydHNlbGVjdGVkOiExLHNlbGVjdGVkOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXNlbGVjdGluZyIpLHVuc2VsZWN0aW5nOmIuaGFzQ2xhc3MoInVpLXVuc2VsZWN0aW5nIil9KX0pfSx0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcz1jLmFkZENsYXNzKCJ1aS1zZWxlY3RlZSIpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuaGVscGVyPWEoIjxkaXYgY2xhc3M9J3VpLXNlbGVjdGFibGUtaGVscGVyJz48L2Rpdj4iKX0sZGVzdHJveTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLnJlbW92ZURhdGEoInNlbGVjdGFibGUiKS51bmJpbmQoIi5zZWxlY3RhYmxlIiksdGhpcy5fbW91c2VEZXN0cm95KCksdGhpc30sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLm9wb3M9W2IucGFnZVgsYi5wYWdlWV07aWYodGhpcy5vcHRpb25zLmRpc2FibGVkKXJldHVybjt2YXIgZD10aGlzLm9wdGlvbnM7dGhpcy5zZWxlY3RlZXM9YShkLmZpbHRlcix0aGlzLmVsZW1lbnRbMF0pLHRoaXMuX3RyaWdnZXIoInN0YXJ0IixiKSxhKGQuYXBwZW5kVG8pLmFwcGVuZCh0aGlzLmhlbHBlciksdGhpcy5oZWxwZXIuY3NzKHtsZWZ0OmIuY2xpZW50WCx0b3A6Yi5jbGllbnRZLHdpZHRoOjAsaGVpZ2h0OjB9KSxkLmF1dG9SZWZyZXNoJiZ0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcy5maWx0ZXIoIi51aS1zZWxlY3RlZCIpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC5zdGFydHNlbGVjdGVkPSEwLCFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJihkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGQuc2VsZWN0ZWQ9ITEsZC4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxkLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSl9KSxhKGIudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoZCl7dmFyIGU9IWIubWV0YUtleSYmIWIuY3RybEtleXx8IWQuJGVsZW1lbnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIik7cmV0dXJuIGQuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoZT8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLmFkZENsYXNzKGU/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIiksZC51bnNlbGVjdGluZz0hZSxkLnNlbGVjdGluZz1lLGQuc2VsZWN0ZWQ9ZSxlP2MuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmQuZWxlbWVudH0pOmMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzpkLmVsZW1lbnR9KSwhMX19KX0sX21vdXNlRHJhZzpmdW5jdGlvbihiKXt2YXIgYz10aGlzO3RoaXMuZHJhZ2dlZD0hMDtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO3ZhciBkPXRoaXMub3B0aW9ucyxlPXRoaXMub3Bvc1swXSxmPXRoaXMub3Bvc1sxXSxnPWIucGFnZVgsaD1iLnBhZ2VZO2lmKGU+Zyl7dmFyIGk9ZztnPWUsZT1pfWlmKGY+aCl7dmFyIGk9aDtoPWYsZj1pfXJldHVybiB0aGlzLmhlbHBlci5jc3Moe2xlZnQ6ZSx0b3A6Zix3aWR0aDpnLWUsaGVpZ2h0OmgtZn0pLHRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7aWYoIWl8fGkuZWxlbWVudD09Yy5lbGVtZW50WzBdKXJldHVybjt2YXIgaj0hMTtkLnRvbGVyYW5jZT09InRvdWNoIj9qPSEoaS5sZWZ0Pmd8fGkucmlnaHQ8ZXx8aS50b3A+aHx8aS5ib3R0b208Zik6ZC50b2xlcmFuY2U9PSJmaXQiJiYoaj1pLmxlZnQ+ZSYmaS5yaWdodDxnJiZpLnRvcD5mJiZpLmJvdHRvbTxoKSxqPyhpLnNlbGVjdGVkJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKSxpLnNlbGVjdGVkPSExKSxpLnVuc2VsZWN0aW5nJiYoaS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSExKSxpLnNlbGVjdGluZ3x8KGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInNlbGVjdGluZyIsYix7c2VsZWN0aW5nOmkuZWxlbWVudH0pKSk6KGkuc2VsZWN0aW5nJiYoKGIubWV0YUtleXx8Yi5jdHJsS2V5KSYmaS5zdGFydHNlbGVjdGVkPyhpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITApOihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKSxpLnNlbGVjdGluZz0hMSxpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITApLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpLGkuc2VsZWN0ZWQmJiFiLm1ldGFLZXkmJiFiLmN0cmxLZXkmJiFpLnN0YXJ0c2VsZWN0ZWQmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwLGMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIixiLHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpfSksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9dGhpczt0aGlzLmRyYWdnZWQ9ITE7dmFyIGQ9dGhpcy5vcHRpb25zO3JldHVybiBhKCIudWktdW5zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBkPWEuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtkLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGQudW5zZWxlY3Rpbmc9ITEsZC5zdGFydHNlbGVjdGVkPSExLGMuX3RyaWdnZXIoInVuc2VsZWN0ZWQiLGIse3Vuc2VsZWN0ZWQ6ZC5lbGVtZW50fSl9KSxhKCIudWktc2VsZWN0aW5nIix0aGlzLmVsZW1lbnRbMF0pLmVhY2goZnVuY3Rpb24oKXt2YXIgZD1hLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIik7ZC4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIikuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIiksZC5zZWxlY3Rpbmc9ITEsZC5zZWxlY3RlZD0hMCxkLnN0YXJ0c2VsZWN0ZWQ9ITAsYy5fdHJpZ2dlcigic2VsZWN0ZWQiLGIse3NlbGVjdGVkOmQuZWxlbWVudH0pfSksdGhpcy5fdHJpZ2dlcigic3RvcCIsYiksdGhpcy5oZWxwZXIucmVtb3ZlKCksITF9fSksYS5leHRlbmQoYS51aS5zZWxlY3RhYmxlLHt2ZXJzaW9uOiIxLjguMjMifSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5zb3J0YWJsZS5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkuc29ydGFibGUiLGEudWkubW91c2Use3dpZGdldEV2ZW50UHJlZml4OiJzb3J0IixyZWFkeTohMSxvcHRpb25zOnthcHBlbmRUbzoicGFyZW50IixheGlzOiExLGNvbm5lY3RXaXRoOiExLGNvbnRhaW5tZW50OiExLGN1cnNvcjoiYXV0byIsY3Vyc29yQXQ6ITEsZHJvcE9uRW1wdHk6ITAsZm9yY2VQbGFjZWhvbGRlclNpemU6ITEsZm9yY2VIZWxwZXJTaXplOiExLGdyaWQ6ITEsaGFuZGxlOiExLGhlbHBlcjoib3JpZ2luYWwiLGl0ZW1zOiI+ICoiLG9wYWNpdHk6ITEscGxhY2Vob2xkZXI6ITEscmV2ZXJ0OiExLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzY29wZToiZGVmYXVsdCIsdG9sZXJhbmNlOiJpbnRlcnNlY3QiLHpJbmRleDoxZTN9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnM7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNvcnRhYmxlIiksdGhpcy5yZWZyZXNoKCksdGhpcy5mbG9hdGluZz10aGlzLml0ZW1zLmxlbmd0aD9hLmF4aXM9PT0ieCJ8fC9sZWZ0fHJpZ2h0Ly50ZXN0KHRoaXMuaXRlbXNbMF0uaXRlbS5jc3MoImZsb2F0IikpfHwvaW5saW5lfHRhYmxlLWNlbGwvLnRlc3QodGhpcy5pdGVtc1swXS5pdGVtLmNzcygiZGlzcGxheSIpKTohMSx0aGlzLm9mZnNldD10aGlzLmVsZW1lbnQub2Zmc2V0KCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5yZWFkeT0hMH0sZGVzdHJveTpmdW5jdGlvbigpe2EuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpO2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aC0xO2I+PTA7Yi0tKXRoaXMuaXRlbXNbYl0uaXRlbS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSsiLWl0ZW0iKTtyZXR1cm4gdGhpc30sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2I9PT0iZGlzYWJsZWQiPyh0aGlzLm9wdGlvbnNbYl09Yyx0aGlzLndpZGdldCgpW2M/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc29ydGFibGUtZGlzYWJsZWQiKSk6YS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcztpZih0aGlzLnJldmVydGluZylyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fHRoaXMub3B0aW9ucy50eXBlPT0ic3RhdGljIilyZXR1cm4hMTt0aGlzLl9yZWZyZXNoSXRlbXMoYik7dmFyIGU9bnVsbCxmPXRoaXMsZz1hKGIudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe2lmKGEuZGF0YSh0aGlzLGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZilyZXR1cm4gZT1hKHRoaXMpLCExfSk7YS5kYXRhKGIudGFyZ2V0LGQud2lkZ2V0TmFtZSsiLWl0ZW0iKT09ZiYmKGU9YShiLnRhcmdldCkpO2lmKCFlKXJldHVybiExO2lmKHRoaXMub3B0aW9ucy5oYW5kbGUmJiFjKXt2YXIgaD0hMTthKHRoaXMub3B0aW9ucy5oYW5kbGUsZSkuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09Yi50YXJnZXQmJihoPSEwKX0pO2lmKCFoKXJldHVybiExfXJldHVybiB0aGlzLmN1cnJlbnRJdGVtPWUsdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKSwhMH0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPXRoaXMub3B0aW9ucyxmPXRoaXM7dGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMsdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKGIpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKSx0aGlzLm9mZnNldD10aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxhLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6Yi5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDpiLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLm9yaWdpbmFsUGFnZVg9Yi5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9Yi5wYWdlWSxlLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKGUuY3Vyc29yQXQpLHRoaXMuZG9tUG9zaXRpb249e3ByZXY6dGhpcy5jdXJyZW50SXRlbS5wcmV2KClbMF0scGFyZW50OnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF19LHRoaXMuaGVscGVyWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmN1cnJlbnRJdGVtLmhpZGUoKSx0aGlzLl9jcmVhdGVQbGFjZWhvbGRlcigpLGUuY29udGFpbm1lbnQmJnRoaXMuX3NldENvbnRhaW5tZW50KCksZS5jdXJzb3ImJihhKCJib2R5IikuY3NzKCJjdXJzb3IiKSYmKHRoaXMuX3N0b3JlZEN1cnNvcj1hKCJib2R5IikuY3NzKCJjdXJzb3IiKSksYSgiYm9keSIpLmNzcygiY3Vyc29yIixlLmN1cnNvcikpLGUub3BhY2l0eSYmKHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpJiYodGhpcy5fc3RvcmVkT3BhY2l0eT10aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSksdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IixlLm9wYWNpdHkpKSxlLnpJbmRleCYmKHRoaXMuaGVscGVyLmNzcygiekluZGV4IikmJih0aGlzLl9zdG9yZWRaSW5kZXg9dGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiKSksdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLGUuekluZGV4KSksdGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCImJih0aGlzLm92ZXJmbG93T2Zmc2V0PXRoaXMuc2Nyb2xsUGFyZW50Lm9mZnNldCgpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5fcHJlc2VydmVIZWxwZXJQcm9wb3J0aW9uc3x8dGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpO2lmKCFkKWZvcih2YXIgZz10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7Zz49MDtnLS0pdGhpcy5jb250YWluZXJzW2ddLl90cmlnZ2VyKCJhY3RpdmF0ZSIsYixmLl91aUhhc2godGhpcykpO3JldHVybiBhLnVpLmRkbWFuYWdlciYmKGEudWkuZGRtYW5hZ2VyLmN1cnJlbnQ9dGhpcyksYS51aS5kZG1hbmFnZXImJiFlLmRyb3BCZWhhdmlvdXImJmEudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsYiksdGhpcy5kcmFnZ2luZz0hMCx0aGlzLmhlbHBlci5hZGRDbGFzcygidWktc29ydGFibGUtaGVscGVyIiksdGhpcy5fbW91c2VEcmFnKGIpLCEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGIpe3RoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihiKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMubGFzdFBvc2l0aW9uQWJzfHwodGhpcy5sYXN0UG9zaXRpb25BYnM9dGhpcy5wb3NpdGlvbkFicyk7aWYodGhpcy5vcHRpb25zLnNjcm9sbCl7dmFyIGM9dGhpcy5vcHRpb25zLGQ9ITE7dGhpcy5zY3JvbGxQYXJlbnRbMF0hPWRvY3VtZW50JiZ0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lIT0iSFRNTCI/KHRoaXMub3ZlcmZsb3dPZmZzZXQudG9wK3RoaXMuc2Nyb2xsUGFyZW50WzBdLm9mZnNldEhlaWdodC1iLnBhZ2VZPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wK2Muc2Nyb2xsU3BlZWQ6Yi5wYWdlWS10aGlzLm92ZXJmbG93T2Zmc2V0LnRvcDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wPWQ9dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wLWMuc2Nyb2xsU3BlZWQpLHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aC1iLnBhZ2VYPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/dGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQrYy5zY3JvbGxTcGVlZDpiLnBhZ2VYLXRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdDxjLnNjcm9sbFNlbnNpdGl2aXR5JiYodGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsTGVmdD1kPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQtYy5zY3JvbGxTcGVlZCkpOihiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCktYy5zY3JvbGxTcGVlZCk6YSh3aW5kb3cpLmhlaWdodCgpLShiLnBhZ2VZLWEoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKTxjLnNjcm9sbFNlbnNpdGl2aXR5JiYoZD1hKGRvY3VtZW50KS5zY3JvbGxUb3AoYShkb2N1bWVudCkuc2Nyb2xsVG9wKCkrYy5zY3JvbGxTcGVlZCkpLGIucGFnZVgtYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpPGMuc2Nyb2xsU2Vuc2l0aXZpdHk/ZD1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KGEoZG9jdW1lbnQpLnNjcm9sbExlZnQoKS1jLnNjcm9sbFNwZWVkKTphKHdpbmRvdykud2lkdGgoKS0oYi5wYWdlWC1hKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpPGMuc2Nyb2xsU2Vuc2l0aXZpdHkmJihkPWEoZG9jdW1lbnQpLnNjcm9sbExlZnQoYShkb2N1bWVudCkuc2Nyb2xsTGVmdCgpK2Muc2Nyb2xsU3BlZWQpKSksZCE9PSExJiZhLnVpLmRkbWFuYWdlciYmIWMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyxiKX10aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ5Iil0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0PXRoaXMucG9zaXRpb24ubGVmdCsicHgiO2lmKCF0aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5vcHRpb25zLmF4aXMhPSJ4Iil0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4Ijtmb3IodmFyIGU9dGhpcy5pdGVtcy5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIGY9dGhpcy5pdGVtc1tlXSxnPWYuaXRlbVswXSxoPXRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihmKTtpZighaCljb250aW51ZTtpZihnIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLnBsYWNlaG9sZGVyW2g9PTE/Im5leHQiOiJwcmV2Il0oKVswXSE9ZyYmIWEudWkuY29udGFpbnModGhpcy5wbGFjZWhvbGRlclswXSxnKSYmKHRoaXMub3B0aW9ucy50eXBlPT0ic2VtaS1keW5hbWljIj8hYS51aS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sZyk6ITApKXt0aGlzLmRpcmVjdGlvbj1oPT0xPyJkb3duIjoidXAiO2lmKHRoaXMub3B0aW9ucy50b2xlcmFuY2U9PSJwb2ludGVyInx8dGhpcy5faW50ZXJzZWN0c1dpdGhTaWRlcyhmKSl0aGlzLl9yZWFycmFuZ2UoYixmKTtlbHNlIGJyZWFrO3RoaXMuX3RyaWdnZXIoImNoYW5nZSIsYix0aGlzLl91aUhhc2goKSk7YnJlYWt9fXJldHVybiB0aGlzLl9jb250YWN0Q29udGFpbmVycyhiKSxhLnVpLmRkbWFuYWdlciYmYS51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLGIpLHRoaXMuX3RyaWdnZXIoInNvcnQiLGIsdGhpcy5fdWlIYXNoKCkpLHRoaXMubGFzdFBvc2l0aW9uQWJzPXRoaXMucG9zaXRpb25BYnMsITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oYixjKXtpZighYilyZXR1cm47YS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmYS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLGIpO2lmKHRoaXMub3B0aW9ucy5yZXZlcnQpe3ZhciBkPXRoaXMsZT1kLnBsYWNlaG9sZGVyLm9mZnNldCgpO2QucmV2ZXJ0aW5nPSEwLGEodGhpcy5oZWxwZXIpLmFuaW1hdGUoe2xlZnQ6ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LWQubWFyZ2lucy5sZWZ0Kyh0aGlzLm9mZnNldFBhcmVudFswXT09ZG9jdW1lbnQuYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbExlZnQpLHRvcDplLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLWQubWFyZ2lucy50b3ArKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5PzA6dGhpcy5vZmZzZXRQYXJlbnRbMF0uc2Nyb2xsVG9wKX0scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydCwxMCl8fDUwMCxmdW5jdGlvbigpe2QuX2NsZWFyKGIpfSl9ZWxzZSB0aGlzLl9jbGVhcihiLGMpO3JldHVybiExfSxjYW5jZWw6ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2lmKHRoaXMuZHJhZ2dpbmcpe3RoaXMuX21vdXNlVXAoe3RhcmdldDpudWxsfSksdGhpcy5vcHRpb25zLmhlbHBlcj09Im9yaWdpbmFsIj90aGlzLmN1cnJlbnRJdGVtLmNzcyh0aGlzLl9zdG9yZWRDU1MpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTp0aGlzLmN1cnJlbnRJdGVtLnNob3coKTtmb3IodmFyIGM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2M+PTA7Yy0tKXRoaXMuY29udGFpbmVyc1tjXS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsbnVsbCxiLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5vdmVyJiYodGhpcy5jb250YWluZXJzW2NdLl90cmlnZ2VyKCJvdXQiLG51bGwsYi5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUub3Zlcj0wKX1yZXR1cm4gdGhpcy5wbGFjZWhvbGRlciYmKHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZSYmdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMub3B0aW9ucy5oZWxwZXIhPSJvcmlnaW5hbCImJnRoaXMuaGVscGVyJiZ0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSxhLmV4dGVuZCh0aGlzLHtoZWxwZXI6bnVsbCxkcmFnZ2luZzohMSxyZXZlcnRpbmc6ITEsX25vRmluYWxTb3J0Om51bGx9KSx0aGlzLmRvbVBvc2l0aW9uLnByZXY/YSh0aGlzLmRvbVBvc2l0aW9uLnByZXYpLmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOmEodGhpcy5kb21Qb3NpdGlvbi5wYXJlbnQpLnByZXBlbmQodGhpcy5jdXJyZW50SXRlbSkpLHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KGImJmIuY29ubmVjdGVkKSxkPVtdO3JldHVybiBiPWJ8fHt9LGEoYykuZWFjaChmdW5jdGlvbigpe3ZhciBjPShhKGIuaXRlbXx8dGhpcykuYXR0cihiLmF0dHJpYnV0ZXx8ImlkIil8fCIiKS5tYXRjaChiLmV4cHJlc3Npb258fC8oLispWy09X10oLispLyk7YyYmZC5wdXNoKChiLmtleXx8Y1sxXSsiW10iKSsiPSIrKGIua2V5JiZiLmV4cHJlc3Npb24/Y1sxXTpjWzJdKSl9KSwhZC5sZW5ndGgmJmIua2V5JiZkLnB1c2goYi5rZXkrIj0iKSxkLmpvaW4oIiYiKX0sdG9BcnJheTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KGImJmIuY29ubmVjdGVkKSxkPVtdO3JldHVybiBiPWJ8fHt9LGMuZWFjaChmdW5jdGlvbigpe2QucHVzaChhKGIuaXRlbXx8dGhpcykuYXR0cihiLmF0dHJpYnV0ZXx8ImlkIil8fCIiKX0pLGR9LF9pbnRlcnNlY3RzV2l0aDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBvc2l0aW9uQWJzLmxlZnQsYz1iK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsZD10aGlzLnBvc2l0aW9uQWJzLnRvcCxlPWQrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsZj1hLmxlZnQsZz1mK2Eud2lkdGgsaD1hLnRvcCxpPWgrYS5oZWlnaHQsaj10aGlzLm9mZnNldC5jbGljay50b3Asaz10aGlzLm9mZnNldC5jbGljay5sZWZ0LGw9ZCtqPmgmJmQrajxpJiZiK2s+ZiYmYitrPGc7cmV0dXJuIHRoaXMub3B0aW9ucy50b2xlcmFuY2U9PSJwb2ludGVyInx8dGhpcy5vcHRpb25zLmZvcmNlUG9pbnRlckZvckNvbnRhaW5lcnN8fHRoaXMub3B0aW9ucy50b2xlcmFuY2UhPSJwb2ludGVyIiYmdGhpcy5oZWxwZXJQcm9wb3J0aW9uc1t0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdPmFbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT9sOmY8Yit0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzImJmMtdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yPGcmJmg8ZCt0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yJiZlLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LzI8aX0sX2ludGVyc2VjdHNXaXRoUG9pbnRlcjpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMuYXhpcz09PSJ4Inx8YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCxiLnRvcCxiLmhlaWdodCksZD10aGlzLm9wdGlvbnMuYXhpcz09PSJ5Inx8YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCt0aGlzLm9mZnNldC5jbGljay5sZWZ0LGIubGVmdCxiLndpZHRoKSxlPWMmJmQsZj10aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSxnPXRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7cmV0dXJuIGU/dGhpcy5mbG9hdGluZz9nJiZnPT0icmlnaHQifHxmPT0iZG93biI/MjoxOmYmJihmPT0iZG93biI/MjoxKTohMX0sX2ludGVyc2VjdHNXaXRoU2lkZXM6ZnVuY3Rpb24oYil7dmFyIGM9YS51aS5pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCxiLnRvcCtiLmhlaWdodC8yLGIuaGVpZ2h0KSxkPWEudWkuaXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQrdGhpcy5vZmZzZXQuY2xpY2subGVmdCxiLmxlZnQrYi53aWR0aC8yLGIud2lkdGgpLGU9dGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksZj10aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpO3JldHVybiB0aGlzLmZsb2F0aW5nJiZmP2Y9PSJyaWdodCImJmR8fGY9PSJsZWZ0IiYmIWQ6ZSYmKGU9PSJkb3duIiYmY3x8ZT09InVwIiYmIWMpfSxfZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wb3NpdGlvbkFicy50b3AtdGhpcy5sYXN0UG9zaXRpb25BYnMudG9wO3JldHVybiBhIT0wJiYoYT4wPyJkb3duIjoidXAiKX0sX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LXRoaXMubGFzdFBvc2l0aW9uQWJzLmxlZnQ7cmV0dXJuIGEhPTAmJihhPjA/InJpZ2h0IjoibGVmdCIpfSxyZWZyZXNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9yZWZyZXNoSXRlbXMoYSksdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpc30sX2Nvbm5lY3RXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zO3JldHVybiBhLmNvbm5lY3RXaXRoLmNvbnN0cnVjdG9yPT1TdHJpbmc/W2EuY29ubmVjdFdpdGhdOmEuY29ubmVjdFdpdGh9LF9nZXRJdGVtc0FzalF1ZXJ5OmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZD1bXSxlPVtdLGY9dGhpcy5fY29ubmVjdFdpdGgoKTtpZihmJiZiKWZvcih2YXIgZz1mLmxlbmd0aC0xO2c+PTA7Zy0tKXt2YXIgaD1hKGZbZ10pO2Zvcih2YXIgaT1oLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgaj1hLmRhdGEoaFtpXSx0aGlzLndpZGdldE5hbWUpO2omJmohPXRoaXMmJiFqLm9wdGlvbnMuZGlzYWJsZWQmJmUucHVzaChbYS5pc0Z1bmN0aW9uKGoub3B0aW9ucy5pdGVtcyk/ai5vcHRpb25zLml0ZW1zLmNhbGwoai5lbGVtZW50KTphKGoub3B0aW9ucy5pdGVtcyxqLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksal0pfX1lLnB1c2goW2EuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudCxudWxsLHtvcHRpb25zOnRoaXMub3B0aW9ucyxpdGVtOnRoaXMuY3VycmVudEl0ZW19KTphKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksdGhpc10pO2Zvcih2YXIgZz1lLmxlbmd0aC0xO2c+PTA7Zy0tKWVbZ11bMF0uZWFjaChmdW5jdGlvbigpe2QucHVzaCh0aGlzKX0pO3JldHVybiBhKGQpfSxfcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmN1cnJlbnRJdGVtLmZpbmQoIjpkYXRhKCIrdGhpcy53aWRnZXROYW1lKyItaXRlbSkiKTtmb3IodmFyIGI9MDtiPHRoaXMuaXRlbXMubGVuZ3RoO2IrKylmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdPT10aGlzLml0ZW1zW2JdLml0ZW1bMF0mJnRoaXMuaXRlbXMuc3BsaWNlKGIsMSl9LF9yZWZyZXNoSXRlbXM6ZnVuY3Rpb24oYil7dGhpcy5pdGVtcz1bXSx0aGlzLmNvbnRhaW5lcnM9W3RoaXNdO3ZhciBjPXRoaXMuaXRlbXMsZD10aGlzLGU9W1thLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLml0ZW1zKT90aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnRbMF0sYix7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6YSh0aGlzLm9wdGlvbnMuaXRlbXMsdGhpcy5lbGVtZW50KSx0aGlzXV0sZj10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGYmJnRoaXMucmVhZHkpZm9yKHZhciBnPWYubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBoPWEoZltnXSk7Zm9yKHZhciBpPWgubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciBqPWEuZGF0YShoW2ldLHRoaXMud2lkZ2V0TmFtZSk7aiYmaiE9dGhpcyYmIWoub3B0aW9ucy5kaXNhYmxlZCYmKGUucHVzaChbYS5pc0Z1bmN0aW9uKGoub3B0aW9ucy5pdGVtcyk/ai5vcHRpb25zLml0ZW1zLmNhbGwoai5lbGVtZW50WzBdLGIse2l0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmEoai5vcHRpb25zLml0ZW1zLGouZWxlbWVudCksal0pLHRoaXMuY29udGFpbmVycy5wdXNoKGopKX19Zm9yKHZhciBnPWUubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBrPWVbZ11bMV0sbD1lW2ddWzBdO2Zvcih2YXIgaT0wLG09bC5sZW5ndGg7aTxtO2krKyl7dmFyIG49YShsW2ldKTtuLmRhdGEodGhpcy53aWRnZXROYW1lKyItaXRlbSIsayksYy5wdXNoKHtpdGVtOm4saW5zdGFuY2U6ayx3aWR0aDowLGhlaWdodDowLGxlZnQ6MCx0b3A6MH0pfX19LHJlZnJlc2hQb3NpdGlvbnM6ZnVuY3Rpb24oYil7dGhpcy5vZmZzZXRQYXJlbnQmJnRoaXMuaGVscGVyJiYodGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpKTtmb3IodmFyIGM9dGhpcy5pdGVtcy5sZW5ndGgtMTtjPj0wO2MtLSl7dmFyIGQ9dGhpcy5pdGVtc1tjXTtpZihkLmluc3RhbmNlIT10aGlzLmN1cnJlbnRDb250YWluZXImJnRoaXMuY3VycmVudENvbnRhaW5lciYmZC5pdGVtWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdKWNvbnRpbnVlO3ZhciBlPXRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50P2EodGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQsZC5pdGVtKTpkLml0ZW07Ynx8KGQud2lkdGg9ZS5vdXRlcldpZHRoKCksZC5oZWlnaHQ9ZS5vdXRlckhlaWdodCgpKTt2YXIgZj1lLm9mZnNldCgpO2QubGVmdD1mLmxlZnQsZC50b3A9Zi50b3B9aWYodGhpcy5vcHRpb25zLmN1c3RvbSYmdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycyl0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzLmNhbGwodGhpcyk7ZWxzZSBmb3IodmFyIGM9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2M+PTA7Yy0tKXt2YXIgZj10aGlzLmNvbnRhaW5lcnNbY10uZWxlbWVudC5vZmZzZXQoKTt0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUubGVmdD1mLmxlZnQsdGhpcy5jb250YWluZXJzW2NdLmNvbnRhaW5lckNhY2hlLnRvcD1mLnRvcCx0aGlzLmNvbnRhaW5lcnNbY10uY29udGFpbmVyQ2FjaGUud2lkdGg9dGhpcy5jb250YWluZXJzW2NdLmVsZW1lbnQub3V0ZXJXaWR0aCgpLHRoaXMuY29udGFpbmVyc1tjXS5jb250YWluZXJDYWNoZS5oZWlnaHQ9dGhpcy5jb250YWluZXJzW2NdLmVsZW1lbnQub3V0ZXJIZWlnaHQoKX1yZXR1cm4gdGhpc30sX2NyZWF0ZVBsYWNlaG9sZGVyOmZ1bmN0aW9uKGIpe3ZhciBjPWJ8fHRoaXMsZD1jLm9wdGlvbnM7aWYoIWQucGxhY2Vob2xkZXJ8fGQucGxhY2Vob2xkZXIuY29uc3RydWN0b3I9PVN0cmluZyl7dmFyIGU9ZC5wbGFjZWhvbGRlcjtkLnBsYWNlaG9sZGVyPXtlbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGI9YShkb2N1bWVudC5jcmVhdGVFbGVtZW50KGMuY3VycmVudEl0ZW1bMF0ubm9kZU5hbWUpKS5hZGRDbGFzcyhlfHxjLmN1cnJlbnRJdGVtWzBdLmNsYXNzTmFtZSsiIHVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIikucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpWzBdO3JldHVybiBlfHwoYi5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKSxifSx1cGRhdGU6ZnVuY3Rpb24oYSxiKXtpZihlJiYhZC5mb3JjZVBsYWNlaG9sZGVyU2l6ZSlyZXR1cm47Yi5oZWlnaHQoKXx8Yi5oZWlnaHQoYy5jdXJyZW50SXRlbS5pbm5lckhlaWdodCgpLXBhcnNlSW50KGMuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nVG9wIil8fDAsMTApLXBhcnNlSW50KGMuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nQm90dG9tIil8fDAsMTApKSxiLndpZHRoKCl8fGIud2lkdGgoYy5jdXJyZW50SXRlbS5pbm5lcldpZHRoKCktcGFyc2VJbnQoYy5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdMZWZ0Iil8fDAsMTApLXBhcnNlSW50KGMuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nUmlnaHQiKXx8MCwxMCkpfX19Yy5wbGFjZWhvbGRlcj1hKGQucGxhY2Vob2xkZXIuZWxlbWVudC5jYWxsKGMuZWxlbWVudCxjLmN1cnJlbnRJdGVtKSksYy5jdXJyZW50SXRlbS5hZnRlcihjLnBsYWNlaG9sZGVyKSxkLnBsYWNlaG9sZGVyLnVwZGF0ZShjLGMucGxhY2Vob2xkZXIpfSxfY29udGFjdENvbnRhaW5lcnM6ZnVuY3Rpb24oYil7dmFyIGM9bnVsbCxkPW51bGw7Zm9yKHZhciBlPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtlPj0wO2UtLSl7aWYoYS51aS5jb250YWlucyh0aGlzLmN1cnJlbnRJdGVtWzBdLHRoaXMuY29udGFpbmVyc1tlXS5lbGVtZW50WzBdKSljb250aW51ZTtpZih0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lcnNbZV0uY29udGFpbmVyQ2FjaGUpKXtpZihjJiZhLnVpLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tlXS5lbGVtZW50WzBdLGMuZWxlbWVudFswXSkpY29udGludWU7Yz10aGlzLmNvbnRhaW5lcnNbZV0sZD1lfWVsc2UgdGhpcy5jb250YWluZXJzW2VdLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbZV0uX3RyaWdnZXIoIm91dCIsYix0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tlXS5jb250YWluZXJDYWNoZS5vdmVyPTApfWlmKCFjKXJldHVybjtpZih0aGlzLmNvbnRhaW5lcnMubGVuZ3RoPT09MSl0aGlzLmNvbnRhaW5lcnNbZF0uX3RyaWdnZXIoIm92ZXIiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbZF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xO2Vsc2UgaWYodGhpcy5jdXJyZW50Q29udGFpbmVyIT10aGlzLmNvbnRhaW5lcnNbZF0pe3ZhciBmPTFlNCxnPW51bGwsaD10aGlzLnBvc2l0aW9uQWJzW3RoaXMuY29udGFpbmVyc1tkXS5mbG9hdGluZz8ibGVmdCI6InRvcCJdO2Zvcih2YXIgaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+PTA7aS0tKXtpZighYS51aS5jb250YWlucyh0aGlzLmNvbnRhaW5lcnNbZF0uZWxlbWVudFswXSx0aGlzLml0ZW1zW2ldLml0ZW1bMF0pKWNvbnRpbnVlO3ZhciBqPXRoaXMuY29udGFpbmVyc1tkXS5mbG9hdGluZz90aGlzLml0ZW1zW2ldLml0ZW0ub2Zmc2V0KCkubGVmdDp0aGlzLml0ZW1zW2ldLml0ZW0ub2Zmc2V0KCkudG9wO01hdGguYWJzKGotaCk8ZiYmKGY9TWF0aC5hYnMoai1oKSxnPXRoaXMuaXRlbXNbaV0sdGhpcy5kaXJlY3Rpb249ai1oPjA/ImRvd24iOiJ1cCIpfWlmKCFnJiYhdGhpcy5vcHRpb25zLmRyb3BPbkVtcHR5KXJldHVybjt0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcy5jb250YWluZXJzW2RdLGc/dGhpcy5fcmVhcnJhbmdlKGIsZyxudWxsLCEwKTp0aGlzLl9yZWFycmFuZ2UoYixudWxsLHRoaXMuY29udGFpbmVyc1tkXS5lbGVtZW50LCEwKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGIsdGhpcy5fdWlIYXNoKCkpLHRoaXMuY29udGFpbmVyc1tkXS5fdHJpZ2dlcigiY2hhbmdlIixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyLnVwZGF0ZSh0aGlzLmN1cnJlbnRDb250YWluZXIsdGhpcy5wbGFjZWhvbGRlciksdGhpcy5jb250YWluZXJzW2RdLl90cmlnZ2VyKCJvdmVyIixiLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW2RdLmNvbnRhaW5lckNhY2hlLm92ZXI9MX19LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5vcHRpb25zLGQ9YS5pc0Z1bmN0aW9uKGMuaGVscGVyKT9hKGMuaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFswXSxbYix0aGlzLmN1cnJlbnRJdGVtXSkpOmMuaGVscGVyPT0iY2xvbmUiP3RoaXMuY3VycmVudEl0ZW0uY2xvbmUoKTp0aGlzLmN1cnJlbnRJdGVtO3JldHVybiBkLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fGEoYy5hcHBlbmRUbyE9InBhcmVudCI/Yy5hcHBlbmRUbzp0aGlzLmN1cnJlbnRJdGVtWzBdLnBhcmVudE5vZGUpWzBdLmFwcGVuZENoaWxkKGRbMF0pLGRbMF09PXRoaXMuY3VycmVudEl0ZW1bMF0mJih0aGlzLl9zdG9yZWRDU1M9e3dpZHRoOnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUud2lkdGgsaGVpZ2h0OnRoaXMuY3VycmVudEl0ZW1bMF0uc3R5bGUuaGVpZ2h0LHBvc2l0aW9uOnRoaXMuY3VycmVudEl0ZW0uY3NzKCJwb3NpdGlvbiIpLHRvcDp0aGlzLmN1cnJlbnRJdGVtLmNzcygidG9wIiksbGVmdDp0aGlzLmN1cnJlbnRJdGVtLmNzcygibGVmdCIpfSksKGRbMF0uc3R5bGUud2lkdGg9PSIifHxjLmZvcmNlSGVscGVyU2l6ZSkmJmQud2lkdGgodGhpcy5jdXJyZW50SXRlbS53aWR0aCgpKSwoZFswXS5zdHlsZS5oZWlnaHQ9PSIifHxjLmZvcmNlSGVscGVyU2l6ZSkmJmQuaGVpZ2h0KHRoaXMuY3VycmVudEl0ZW0uaGVpZ2h0KCkpLGR9LF9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOmZ1bmN0aW9uKGIpe3R5cGVvZiBiPT0ic3RyaW5nIiYmKGI9Yi5zcGxpdCgiICIpKSxhLmlzQXJyYXkoYikmJihiPXtsZWZ0OitiWzBdLHRvcDorYlsxXXx8MH0pLCJsZWZ0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PWIubGVmdCt0aGlzLm1hcmdpbnMubGVmdCksInJpZ2h0ImluIGImJih0aGlzLm9mZnNldC5jbGljay5sZWZ0PXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtYi5yaWdodCt0aGlzLm1hcmdpbnMubGVmdCksInRvcCJpbiBiJiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPWIudG9wK3RoaXMubWFyZ2lucy50b3ApLCJib3R0b20iaW4gYiYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC1iLmJvdHRvbSt0aGlzLm1hcmdpbnMudG9wKX0sX2dldFBhcmVudE9mZnNldDpmdW5jdGlvbigpe3RoaXMub2Zmc2V0UGFyZW50PXRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpO3ZhciBiPXRoaXMub2Zmc2V0UGFyZW50Lm9mZnNldCgpO3RoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT1kb2N1bWVudCYmYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkmJihiLmxlZnQrPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSxiLnRvcCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkpO2lmKHRoaXMub2Zmc2V0UGFyZW50WzBdPT1kb2N1bWVudC5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiZ0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJodG1sIiYmYS5icm93c2VyLm1zaWUpYj17dG9wOjAsbGVmdDowfTtyZXR1cm57dG9wOmIudG9wKyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSxsZWZ0OmIubGVmdCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApfX0sX2dldFJlbGF0aXZlT2Zmc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIil7dmFyIGE9dGhpcy5jdXJyZW50SXRlbS5wb3NpdGlvbigpO3JldHVybnt0b3A6YS50b3AtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OmEubGVmdC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApfHwwKSt0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCl9fXJldHVybnt0b3A6MCxsZWZ0OjB9fSxfY2FjaGVNYXJnaW5zOmZ1bmN0aW9uKCl7dGhpcy5tYXJnaW5zPXtsZWZ0OnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5MZWZ0IiksMTApfHwwLHRvcDpwYXJzZUludCh0aGlzLmN1cnJlbnRJdGVtLmNzcygibWFyZ2luVG9wIiksMTApfHwwfX0sX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlclByb3BvcnRpb25zPXt3aWR0aDp0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuaGVscGVyLm91dGVySGVpZ2h0KCl9fSxfc2V0Q29udGFpbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnM7Yi5jb250YWlubWVudD09InBhcmVudCImJihiLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpO2lmKGIuY29udGFpbm1lbnQ9PSJkb2N1bWVudCJ8fGIuY29udGFpbm1lbnQ9PSJ3aW5kb3ciKXRoaXMuY29udGFpbm1lbnQ9WzAtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCwwLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLGEoYi5jb250YWlubWVudD09ImRvY3VtZW50Ij9kb2N1bWVudDp3aW5kb3cpLndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoYShiLmNvbnRhaW5tZW50PT0iZG9jdW1lbnQiP2RvY3VtZW50OndpbmRvdykuaGVpZ2h0KCl8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdO2lmKCEvXihkb2N1bWVudHx3aW5kb3d8cGFyZW50KSQvLnRlc3QoYi5jb250YWlubWVudCkpe3ZhciBjPWEoYi5jb250YWlubWVudClbMF0sZD1hKGIuY29udGFpbm1lbnQpLm9mZnNldCgpLGU9YShjKS5jc3MoIm92ZXJmbG93IikhPSJoaWRkZW4iO3RoaXMuY29udGFpbm1lbnQ9W2QubGVmdCsocGFyc2VJbnQoYShjKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nTGVmdCIpLDEwKXx8MCktdGhpcy5tYXJnaW5zLmxlZnQsZC50b3ArKHBhcnNlSW50KGEoYykuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGEoYykuY3NzKCJwYWRkaW5nVG9wIiksMTApfHwwKS10aGlzLm1hcmdpbnMudG9wLGQubGVmdCsoZT9NYXRoLm1heChjLnNjcm9sbFdpZHRoLGMub2Zmc2V0V2lkdGgpOmMub2Zmc2V0V2lkdGgpLShwYXJzZUludChhKGMpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYShjKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCxkLnRvcCsoZT9NYXRoLm1heChjLnNjcm9sbEhlaWdodCxjLm9mZnNldEhlaWdodCk6Yy5vZmZzZXRIZWlnaHQpLShwYXJzZUludChhKGMpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChhKGMpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcF19fSxfY29udmVydFBvc2l0aW9uVG86ZnVuY3Rpb24oYixjKXtjfHwoYz10aGlzLnBvc2l0aW9uKTt2YXIgZD1iPT0iYWJzb2x1dGUiPzE6LTEsZT10aGlzLm9wdGlvbnMsZj10aGlzLmNzc1Bvc2l0aW9uPT0iYWJzb2x1dGUiJiYodGhpcy5zY3JvbGxQYXJlbnRbMF09PWRvY3VtZW50fHwhYS51aS5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSx0aGlzLm9mZnNldFBhcmVudFswXSkpP3RoaXMub2Zmc2V0UGFyZW50OnRoaXMuc2Nyb2xsUGFyZW50LGc9LyhodG1sfGJvZHkpL2kudGVzdChmWzBdLnRhZ05hbWUpO3JldHVybnt0b3A6Yy50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKmQrdGhpcy5vZmZzZXQucGFyZW50LnRvcCpkLShhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6KHRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmc/MDpmLnNjcm9sbFRvcCgpKSpkKSxsZWZ0OmMubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmQrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqZC0oYS5icm93c2VyLnNhZmFyaSYmdGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8wOih0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6Zz8wOmYuc2Nyb2xsTGVmdCgpKSpkKX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucyxkPXRoaXMuY3NzUG9zaXRpb249PSJhYnNvbHV0ZSImJih0aGlzLnNjcm9sbFBhcmVudFswXT09ZG9jdW1lbnR8fCFhLnVpLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSk/dGhpcy5vZmZzZXRQYXJlbnQ6dGhpcy5zY3JvbGxQYXJlbnQsZT0vKGh0bWx8Ym9keSkvaS50ZXN0KGRbMF0udGFnTmFtZSk7dGhpcy5jc3NQb3NpdGlvbj09InJlbGF0aXZlIiYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdPT1kb2N1bWVudHx8dGhpcy5zY3JvbGxQYXJlbnRbMF09PXRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHRoaXMub2Zmc2V0LnJlbGF0aXZlPXRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCkpO3ZhciBmPWIucGFnZVgsZz1iLnBhZ2VZO2lmKHRoaXMub3JpZ2luYWxQb3NpdGlvbil7dGhpcy5jb250YWlubWVudCYmKGIucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdDx0aGlzLmNvbnRhaW5tZW50WzBdJiYoZj10aGlzLmNvbnRhaW5tZW50WzBdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLGIucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPHRoaXMuY29udGFpbm1lbnRbMV0mJihnPXRoaXMuY29udGFpbm1lbnRbMV0rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSxiLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+dGhpcy5jb250YWlubWVudFsyXSYmKGY9dGhpcy5jb250YWlubWVudFsyXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxiLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD50aGlzLmNvbnRhaW5tZW50WzNdJiYoZz10aGlzLmNvbnRhaW5tZW50WzNdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCkpO2lmKGMuZ3JpZCl7dmFyIGg9dGhpcy5vcmlnaW5hbFBhZ2VZK01hdGgucm91bmQoKGctdGhpcy5vcmlnaW5hbFBhZ2VZKS9jLmdyaWRbMV0pKmMuZ3JpZFsxXTtnPXRoaXMuY29udGFpbm1lbnQ/aC10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXXx8aC10aGlzLm9mZnNldC5jbGljay50b3A+dGhpcy5jb250YWlubWVudFszXT9oLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDx0aGlzLmNvbnRhaW5tZW50WzFdP2grYy5ncmlkWzFdOmgtYy5ncmlkWzFdOmg6aDt2YXIgaT10aGlzLm9yaWdpbmFsUGFnZVgrTWF0aC5yb3VuZCgoZi10aGlzLm9yaWdpbmFsUGFnZVgpL2MuZ3JpZFswXSkqYy5ncmlkWzBdO2Y9dGhpcy5jb250YWlubWVudD9pLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8dGhpcy5jb250YWlubWVudFswXXx8aS10aGlzLm9mZnNldC5jbGljay5sZWZ0PnRoaXMuY29udGFpbm1lbnRbMl0/aS10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0/aStjLmdyaWRbMF06aS1jLmdyaWRbMF06aTppfX1yZXR1cm57dG9wOmctdGhpcy5vZmZzZXQuY2xpY2sudG9wLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wKyhhLmJyb3dzZXIuc2FmYXJpJiZ0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPzA6dGhpcy5jc3NQb3NpdGlvbj09ImZpeGVkIj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCk6ZT8wOmQuc2Nyb2xsVG9wKCkpLGxlZnQ6Zi10aGlzLm9mZnNldC5jbGljay5sZWZ0LXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQtdGhpcy5vZmZzZXQucGFyZW50LmxlZnQrKGEuYnJvd3Nlci5zYWZhcmkmJnRoaXMuY3NzUG9zaXRpb249PSJmaXhlZCI/MDp0aGlzLmNzc1Bvc2l0aW9uPT0iZml4ZWQiPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk6ZT8wOmQuc2Nyb2xsTGVmdCgpKX19LF9yZWFycmFuZ2U6ZnVuY3Rpb24oYSxiLGMsZCl7Yz9jWzBdLmFwcGVuZENoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pOmIuaXRlbVswXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyWzBdLHRoaXMuZGlyZWN0aW9uPT0iZG93biI/Yi5pdGVtWzBdOmIuaXRlbVswXS5uZXh0U2libGluZyksdGhpcy5jb3VudGVyPXRoaXMuY291bnRlcj8rK3RoaXMuY291bnRlcjoxO3ZhciBlPXRoaXMsZj10aGlzLmNvdW50ZXI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPT1lLmNvdW50ZXImJmUucmVmcmVzaFBvc2l0aW9ucyghZCl9LDApfSxfY2xlYXI6ZnVuY3Rpb24oYixjKXt0aGlzLnJldmVydGluZz0hMTt2YXIgZD1bXSxlPXRoaXM7IXRoaXMuX25vRmluYWxTb3J0JiZ0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCYmdGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSksdGhpcy5fbm9GaW5hbFNvcnQ9bnVsbDtpZih0aGlzLmhlbHBlclswXT09dGhpcy5jdXJyZW50SXRlbVswXSl7Zm9yKHZhciBmIGluIHRoaXMuX3N0b3JlZENTUylpZih0aGlzLl9zdG9yZWRDU1NbZl09PSJhdXRvInx8dGhpcy5fc3RvcmVkQ1NTW2ZdPT0ic3RhdGljIil0aGlzLl9zdG9yZWRDU1NbZl09IiI7dGhpcy5jdXJyZW50SXRlbS5jc3ModGhpcy5fc3RvcmVkQ1NTKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGVscGVyIil9ZWxzZSB0aGlzLmN1cnJlbnRJdGVtLnNob3coKTt0aGlzLmZyb21PdXRzaWRlJiYhYyYmZC5wdXNoKGZ1bmN0aW9uKGEpe3RoaXMuX3RyaWdnZXIoInJlY2VpdmUiLGEsdGhpcy5fdWlIYXNoKHRoaXMuZnJvbU91dHNpZGUpKX0pLCh0aGlzLmZyb21PdXRzaWRlfHx0aGlzLmRvbVBvc2l0aW9uLnByZXYhPXRoaXMuY3VycmVudEl0ZW0ucHJldigpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpWzBdfHx0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCE9dGhpcy5jdXJyZW50SXRlbS5wYXJlbnQoKVswXSkmJiFjJiZkLnB1c2goZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigidXBkYXRlIixhLHRoaXMuX3VpSGFzaCgpKX0pO2lmKCFhLnVpLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSx0aGlzLmN1cnJlbnRJdGVtWzBdKSl7Y3x8ZC5wdXNoKGZ1bmN0aW9uKGEpe3RoaXMuX3RyaWdnZXIoInJlbW92ZSIsYSx0aGlzLl91aUhhc2goKSl9KTtmb3IodmFyIGY9dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO2Y+PTA7Zi0tKWEudWkuY29udGFpbnModGhpcy5jb250YWluZXJzW2ZdLmVsZW1lbnRbMF0sdGhpcy5jdXJyZW50SXRlbVswXSkmJiFjJiYoZC5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLl90cmlnZ2VyKCJyZWNlaXZlIixiLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2ZdKSksZC5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLl90cmlnZ2VyKCJ1cGRhdGUiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbZl0pKSl9Zm9yKHZhciBmPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtmPj0wO2YtLSljfHxkLnB1c2goZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2EuX3RyaWdnZXIoImRlYWN0aXZhdGUiLGIsdGhpcy5fdWlIYXNoKHRoaXMpKX19LmNhbGwodGhpcyx0aGlzLmNvbnRhaW5lcnNbZl0pKSx0aGlzLmNvbnRhaW5lcnNbZl0uY29udGFpbmVyQ2FjaGUub3ZlciYmKGQucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7YS5fdHJpZ2dlcigib3V0IixiLHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jb250YWluZXJzW2ZdKSksdGhpcy5jb250YWluZXJzW2ZdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCk7dGhpcy5fc3RvcmVkQ3Vyc29yJiZhKCJib2R5IikuY3NzKCJjdXJzb3IiLHRoaXMuX3N0b3JlZEN1cnNvciksdGhpcy5fc3RvcmVkT3BhY2l0eSYmdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iix0aGlzLl9zdG9yZWRPcGFjaXR5KSx0aGlzLl9zdG9yZWRaSW5kZXgmJnRoaXMuaGVscGVyLmNzcygiekluZGV4Iix0aGlzLl9zdG9yZWRaSW5kZXg9PSJhdXRvIj8iIjp0aGlzLl9zdG9yZWRaSW5kZXgpLHRoaXMuZHJhZ2dpbmc9ITE7aWYodGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsKXtpZighYyl7dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsYix0aGlzLl91aUhhc2goKSk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXS5jYWxsKHRoaXMsYik7dGhpcy5fdHJpZ2dlcigic3RvcCIsYix0aGlzLl91aUhhc2goKSl9cmV0dXJuIHRoaXMuZnJvbU91dHNpZGU9ITEsITF9Y3x8dGhpcy5fdHJpZ2dlcigiYmVmb3JlU3RvcCIsYix0aGlzLl91aUhhc2goKSksdGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGxhY2Vob2xkZXJbMF0pLHRoaXMuaGVscGVyWzBdIT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsO2lmKCFjKXtmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmNhbGwodGhpcyxiKTt0aGlzLl90cmlnZ2VyKCJzdG9wIixiLHRoaXMuX3VpSGFzaCgpKX1yZXR1cm4gdGhpcy5mcm9tT3V0c2lkZT0hMSwhMH0sX3RyaWdnZXI6ZnVuY3Rpb24oKXthLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpPT09ITEmJnRoaXMuY2FuY2VsKCl9LF91aUhhc2g6ZnVuY3Rpb24oYil7dmFyIGM9Ynx8dGhpcztyZXR1cm57aGVscGVyOmMuaGVscGVyLHBsYWNlaG9sZGVyOmMucGxhY2Vob2xkZXJ8fGEoW10pLHBvc2l0aW9uOmMucG9zaXRpb24sb3JpZ2luYWxQb3NpdGlvbjpjLm9yaWdpbmFsUG9zaXRpb24sb2Zmc2V0OmMucG9zaXRpb25BYnMsaXRlbTpjLmN1cnJlbnRJdGVtLHNlbmRlcjpiP2IuZWxlbWVudDpudWxsfX19KSxhLmV4dGVuZChhLnVpLnNvcnRhYmxlLHt2ZXJzaW9uOiIxLjguMjMifSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5hY2NvcmRpb24uanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS53aWRnZXQoInVpLmFjY29yZGlvbiIse29wdGlvbnM6e2FjdGl2ZTowLGFuaW1hdGVkOiJzbGlkZSIsYXV0b0hlaWdodDohMCxjbGVhclN0eWxlOiExLGNvbGxhcHNpYmxlOiExLGV2ZW50OiJjbGljayIsZmlsbFNwYWNlOiExLGhlYWRlcjoiPiBsaSA+IDpmaXJzdC1jaGlsZCw+IDpub3QobGkpOmV2ZW4iLGljb25zOntoZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1lIixoZWFkZXJTZWxlY3RlZDoidWktaWNvbi10cmlhbmdsZS0xLXMifSxuYXZpZ2F0aW9uOiExLG5hdmlnYXRpb25GaWx0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ocmVmLnRvTG93ZXJDYXNlKCk9PT1sb2NhdGlvbi5ocmVmLnRvTG93ZXJDYXNlKCl9fSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWIub3B0aW9ucztiLnJ1bm5pbmc9MCxiLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikuY2hpbGRyZW4oImxpIikuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1saS1maXgiKSxiLmhlYWRlcnM9Yi5lbGVtZW50LmZpbmQoYy5oZWFkZXIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWhlbHBlci1yZXNldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5iaW5kKCJtb3VzZWVudGVyLmFjY29yZGlvbiIsZnVuY3Rpb24oKXtpZihjLmRpc2FibGVkKXJldHVybjthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSkuYmluZCgibW91c2VsZWF2ZS5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmJpbmQoImZvY3VzLmFjY29yZGlvbiIsZnVuY3Rpb24oKXtpZihjLmRpc2FibGVkKXJldHVybjthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkuYmluZCgiYmx1ci5hY2NvcmRpb24iLGZ1bmN0aW9uKCl7aWYoYy5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLGIuaGVhZGVycy5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50IHVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIik7aWYoYy5uYXZpZ2F0aW9uKXt2YXIgZD1iLmVsZW1lbnQuZmluZCgiYSIpLmZpbHRlcihjLm5hdmlnYXRpb25GaWx0ZXIpLmVxKDApO2lmKGQubGVuZ3RoKXt2YXIgZT1kLmNsb3Nlc3QoIi51aS1hY2NvcmRpb24taGVhZGVyIik7ZS5sZW5ndGg/Yi5hY3RpdmU9ZTpiLmFjdGl2ZT1kLmNsb3Nlc3QoIi51aS1hY2NvcmRpb24tY29udGVudCIpLnByZXYoKX19Yi5hY3RpdmU9Yi5fZmluZEFjdGl2ZShiLmFjdGl2ZXx8Yy5hY3RpdmUpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLXN0YXRlLWFjdGl2ZSIpLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItYWxsIikudG9nZ2xlQ2xhc3MoInVpLWNvcm5lci10b3AiKSxiLmFjdGl2ZS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpLGIuX2NyZWF0ZUljb25zKCksYi5yZXNpemUoKSxiLmVsZW1lbnQuYXR0cigicm9sZSIsInRhYmxpc3QiKSxiLmhlYWRlcnMuYXR0cigicm9sZSIsInRhYiIpLmJpbmQoImtleWRvd24uYWNjb3JkaW9uIixmdW5jdGlvbihhKXtyZXR1cm4gYi5fa2V5ZG93bihhKX0pLm5leHQoKS5hdHRyKCJyb2xlIiwidGFicGFuZWwiKSxiLmhlYWRlcnMubm90KGIuYWN0aXZlfHwiIikuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KS5uZXh0KCkuaGlkZSgpLGIuYWN0aXZlLmxlbmd0aD9iLmFjdGl2ZS5hdHRyKHsiYXJpYS1leHBhbmRlZCI6InRydWUiLCJhcmlhLXNlbGVjdGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pOmIuaGVhZGVycy5lcSgwKS5hdHRyKCJ0YWJJbmRleCIsMCksYS5icm93c2VyLnNhZmFyaXx8Yi5oZWFkZXJzLmZpbmQoImEiKS5hdHRyKCJ0YWJJbmRleCIsLTEpLGMuZXZlbnQmJmIuaGVhZGVycy5iaW5kKGMuZXZlbnQuc3BsaXQoIiAiKS5qb2luKCIuYWNjb3JkaW9uICIpKyIuYWNjb3JkaW9uIixmdW5jdGlvbihhKXtiLl9jbGlja0hhbmRsZXIuY2FsbChiLGEsdGhpcyksYS5wcmV2ZW50RGVmYXVsdCgpfSl9LF9jcmVhdGVJY29uczpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztiLmljb25zJiYoYSgiPHNwYW4+PC9zcGFuPiIpLmFkZENsYXNzKCJ1aS1pY29uICIrYi5pY29ucy5oZWFkZXIpLnByZXBlbmRUbyh0aGlzLmhlYWRlcnMpLHRoaXMuYWN0aXZlLmNoaWxkcmVuKCIudWktaWNvbiIpLnRvZ2dsZUNsYXNzKGIuaWNvbnMuaGVhZGVyKS50b2dnbGVDbGFzcyhiLmljb25zLmhlYWRlclNlbGVjdGVkKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1pY29ucyIpKX0sX2Rlc3Ryb3lJY29uczpmdW5jdGlvbigpe3RoaXMuaGVhZGVycy5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmUoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1pY29ucyIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uIHVpLXdpZGdldCB1aS1oZWxwZXItcmVzZXQiKS5yZW1vdmVBdHRyKCJyb2xlIiksdGhpcy5oZWFkZXJzLnVuYmluZCgiLmFjY29yZGlvbiIpLnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLWFjY29yZGlvbi1kaXNhYmxlZCB1aS1oZWxwZXItcmVzZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZXhwYW5kZWQiKS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKSx0aGlzLmhlYWRlcnMuZmluZCgiYSIpLnJlbW92ZUF0dHIoInRhYkluZGV4IiksdGhpcy5fZGVzdHJveUljb25zKCk7dmFyIGM9dGhpcy5oZWFkZXJzLm5leHQoKS5jc3MoImRpc3BsYXkiLCIiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIHVpLWFjY29yZGlvbi1jb250ZW50IHVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSB1aS1hY2NvcmRpb24tZGlzYWJsZWQgdWktc3RhdGUtZGlzYWJsZWQiKTtyZXR1cm4oYi5hdXRvSGVpZ2h0fHxiLmZpbGxIZWlnaHQpJiZjLmNzcygiaGVpZ2h0IiwiIiksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX0sX3NldE9wdGlvbjpmdW5jdGlvbihiLGMpe2EuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxiPT0iYWN0aXZlIiYmdGhpcy5hY3RpdmF0ZShjKSxiPT0iaWNvbnMiJiYodGhpcy5fZGVzdHJveUljb25zKCksYyYmdGhpcy5fY3JlYXRlSWNvbnMoKSksYj09ImRpc2FibGVkIiYmdGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKVtjPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLWFjY29yZGlvbi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIpfSxfa2V5ZG93bjpmdW5jdGlvbihiKXtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fGIuYWx0S2V5fHxiLmN0cmxLZXkpcmV0dXJuO3ZhciBjPWEudWkua2V5Q29kZSxkPXRoaXMuaGVhZGVycy5sZW5ndGgsZT10aGlzLmhlYWRlcnMuaW5kZXgoYi50YXJnZXQpLGY9ITE7c3dpdGNoKGIua2V5Q29kZSl7Y2FzZSBjLlJJR0hUOmNhc2UgYy5ET1dOOmY9dGhpcy5oZWFkZXJzWyhlKzEpJWRdO2JyZWFrO2Nhc2UgYy5MRUZUOmNhc2UgYy5VUDpmPXRoaXMuaGVhZGVyc1soZS0xK2QpJWRdO2JyZWFrO2Nhc2UgYy5TUEFDRTpjYXNlIGMuRU5URVI6dGhpcy5fY2xpY2tIYW5kbGVyKHt0YXJnZXQ6Yi50YXJnZXR9LGIudGFyZ2V0KSxiLnByZXZlbnREZWZhdWx0KCl9cmV0dXJuIGY/KGEoYi50YXJnZXQpLmF0dHIoInRhYkluZGV4IiwtMSksYShmKS5hdHRyKCJ0YWJJbmRleCIsMCksZi5mb2N1cygpLCExKTohMH0scmVzaXplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zLGM7aWYoYi5maWxsU3BhY2Upe2lmKGEuYnJvd3Nlci5tc2llKXt2YXIgZD10aGlzLmVsZW1lbnQucGFyZW50KCkuY3NzKCJvdmVyZmxvdyIpO3RoaXMuZWxlbWVudC5wYXJlbnQoKS5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIil9Yz10aGlzLmVsZW1lbnQucGFyZW50KCkuaGVpZ2h0KCksYS5icm93c2VyLm1zaWUmJnRoaXMuZWxlbWVudC5wYXJlbnQoKS5jc3MoIm92ZXJmbG93IixkKSx0aGlzLmhlYWRlcnMuZWFjaChmdW5jdGlvbigpe2MtPWEodGhpcykub3V0ZXJIZWlnaHQoITApfSksdGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5oZWlnaHQoTWF0aC5tYXgoMCxjLWEodGhpcykuaW5uZXJIZWlnaHQoKSthKHRoaXMpLmhlaWdodCgpKSl9KS5jc3MoIm92ZXJmbG93IiwiYXV0byIpfWVsc2UgYi5hdXRvSGVpZ2h0JiYoYz0wLHRoaXMuaGVhZGVycy5uZXh0KCkuZWFjaChmdW5jdGlvbigpe2M9TWF0aC5tYXgoYyxhKHRoaXMpLmhlaWdodCgiIikuaGVpZ2h0KCkpfSkuaGVpZ2h0KGMpKTtyZXR1cm4gdGhpc30sYWN0aXZhdGU6ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zLmFjdGl2ZT1hO3ZhciBiPXRoaXMuX2ZpbmRBY3RpdmUoYSlbMF07cmV0dXJuIHRoaXMuX2NsaWNrSGFuZGxlcih7dGFyZ2V0OmJ9LGIpLHRoaXN9LF9maW5kQWN0aXZlOmZ1bmN0aW9uKGIpe3JldHVybiBiP3R5cGVvZiBiPT0ibnVtYmVyIj90aGlzLmhlYWRlcnMuZmlsdGVyKCI6ZXEoIitiKyIpIik6dGhpcy5oZWFkZXJzLm5vdCh0aGlzLmhlYWRlcnMubm90KGIpKTpiPT09ITE/YShbXSk6dGhpcy5oZWFkZXJzLmZpbHRlcigiOmVxKDApIil9LF9jbGlja0hhbmRsZXI6ZnVuY3Rpb24oYixjKXt2YXIgZD10aGlzLm9wdGlvbnM7aWYoZC5kaXNhYmxlZClyZXR1cm47aWYoIWIudGFyZ2V0KXtpZighZC5jb2xsYXBzaWJsZSlyZXR1cm47dGhpcy5hY3RpdmUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLmNoaWxkcmVuKCIudWktaWNvbiIpLnJlbW92ZUNsYXNzKGQuaWNvbnMuaGVhZGVyU2VsZWN0ZWQpLmFkZENsYXNzKGQuaWNvbnMuaGVhZGVyKSx0aGlzLmFjdGl2ZS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpO3ZhciBlPXRoaXMuYWN0aXZlLm5leHQoKSxmPXtvcHRpb25zOmQsbmV3SGVhZGVyOmEoW10pLG9sZEhlYWRlcjpkLmFjdGl2ZSxuZXdDb250ZW50OmEoW10pLG9sZENvbnRlbnQ6ZX0sZz10aGlzLmFjdGl2ZT1hKFtdKTt0aGlzLl90b2dnbGUoZyxlLGYpO3JldHVybn12YXIgaD1hKGIuY3VycmVudFRhcmdldHx8YyksaT1oWzBdPT09dGhpcy5hY3RpdmVbMF07ZC5hY3RpdmU9ZC5jb2xsYXBzaWJsZSYmaT8hMTp0aGlzLmhlYWRlcnMuaW5kZXgoaCk7aWYodGhpcy5ydW5uaW5nfHwhZC5jb2xsYXBzaWJsZSYmaSlyZXR1cm47dmFyIGo9dGhpcy5hY3RpdmUsZz1oLm5leHQoKSxlPXRoaXMuYWN0aXZlLm5leHQoKSxmPXtvcHRpb25zOmQsbmV3SGVhZGVyOmkmJmQuY29sbGFwc2libGU/YShbXSk6aCxvbGRIZWFkZXI6dGhpcy5hY3RpdmUsbmV3Q29udGVudDppJiZkLmNvbGxhcHNpYmxlP2EoW10pOmcsb2xkQ29udGVudDplfSxrPXRoaXMuaGVhZGVycy5pbmRleCh0aGlzLmFjdGl2ZVswXSk+dGhpcy5oZWFkZXJzLmluZGV4KGhbMF0pO3RoaXMuYWN0aXZlPWk/YShbXSk6aCx0aGlzLl90b2dnbGUoZyxlLGYsaSxrKSxqLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKS5jaGlsZHJlbigiLnVpLWljb24iKS5yZW1vdmVDbGFzcyhkLmljb25zLmhlYWRlclNlbGVjdGVkKS5hZGRDbGFzcyhkLmljb25zLmhlYWRlciksaXx8KGgucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIpLmNoaWxkcmVuKCIudWktaWNvbiIpLnJlbW92ZUNsYXNzKGQuaWNvbnMuaGVhZGVyKS5hZGRDbGFzcyhkLmljb25zLmhlYWRlclNlbGVjdGVkKSxoLm5leHQoKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIikpO3JldHVybn0sX3RvZ2dsZTpmdW5jdGlvbihiLGMsZCxlLGYpe3ZhciBnPXRoaXMsaD1nLm9wdGlvbnM7Zy50b1Nob3c9YixnLnRvSGlkZT1jLGcuZGF0YT1kO3ZhciBpPWZ1bmN0aW9uKCl7aWYoIWcpcmV0dXJuO3JldHVybiBnLl9jb21wbGV0ZWQuYXBwbHkoZyxhcmd1bWVudHMpfTtnLl90cmlnZ2VyKCJjaGFuZ2VzdGFydCIsbnVsbCxnLmRhdGEpLGcucnVubmluZz1jLnNpemUoKT09PTA/Yi5zaXplKCk6Yy5zaXplKCk7aWYoaC5hbmltYXRlZCl7dmFyIGo9e307aC5jb2xsYXBzaWJsZSYmZT9qPXt0b1Nob3c6YShbXSksdG9IaWRlOmMsY29tcGxldGU6aSxkb3duOmYsYXV0b0hlaWdodDpoLmF1dG9IZWlnaHR8fGguZmlsbFNwYWNlfTpqPXt0b1Nob3c6Yix0b0hpZGU6Yyxjb21wbGV0ZTppLGRvd246ZixhdXRvSGVpZ2h0OmguYXV0b0hlaWdodHx8aC5maWxsU3BhY2V9LGgucHJveGllZHx8KGgucHJveGllZD1oLmFuaW1hdGVkKSxoLnByb3hpZWREdXJhdGlvbnx8KGgucHJveGllZER1cmF0aW9uPWguZHVyYXRpb24pLGguYW5pbWF0ZWQ9YS5pc0Z1bmN0aW9uKGgucHJveGllZCk/aC5wcm94aWVkKGopOmgucHJveGllZCxoLmR1cmF0aW9uPWEuaXNGdW5jdGlvbihoLnByb3hpZWREdXJhdGlvbik/aC5wcm94aWVkRHVyYXRpb24oaik6aC5wcm94aWVkRHVyYXRpb247dmFyIGs9YS51aS5hY2NvcmRpb24uYW5pbWF0aW9ucyxsPWguZHVyYXRpb24sbT1oLmFuaW1hdGVkO20mJiFrW21dJiYhYS5lYXNpbmdbbV0mJihtPSJzbGlkZSIpLGtbbV18fChrW21dPWZ1bmN0aW9uKGEpe3RoaXMuc2xpZGUoYSx7ZWFzaW5nOm0sZHVyYXRpb246bHx8NzAwfSl9KSxrW21dKGopfWVsc2UgaC5jb2xsYXBzaWJsZSYmZT9iLnRvZ2dsZSgpOihjLmhpZGUoKSxiLnNob3coKSksaSghMCk7Yy5wcmV2KCkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KS5ibHVyKCksYi5wcmV2KCkuYXR0cih7ImFyaWEtZXhwYW5kZWQiOiJ0cnVlIiwiYXJpYS1zZWxlY3RlZCI6InRydWUiLHRhYkluZGV4OjB9KS5mb2N1cygpfSxfY29tcGxldGVkOmZ1bmN0aW9uKGEpe3RoaXMucnVubmluZz1hPzA6LS10aGlzLnJ1bm5pbmc7aWYodGhpcy5ydW5uaW5nKXJldHVybjt0aGlzLm9wdGlvbnMuY2xlYXJTdHlsZSYmdGhpcy50b1Nob3cuYWRkKHRoaXMudG9IaWRlKS5jc3Moe2hlaWdodDoiIixvdmVyZmxvdzoiIn0pLHRoaXMudG9IaWRlLnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiKSx0aGlzLnRvSGlkZS5sZW5ndGgmJih0aGlzLnRvSGlkZS5wYXJlbnQoKVswXS5jbGFzc05hbWU9dGhpcy50b0hpZGUucGFyZW50KClbMF0uY2xhc3NOYW1lKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLG51bGwsdGhpcy5kYXRhKX19KSxhLmV4dGVuZChhLnVpLmFjY29yZGlvbix7dmVyc2lvbjoiMS44LjIzIixhbmltYXRpb25zOntzbGlkZTpmdW5jdGlvbihiLGMpe2I9YS5leHRlbmQoe2Vhc2luZzoic3dpbmciLGR1cmF0aW9uOjMwMH0sYixjKTtpZighYi50b0hpZGUuc2l6ZSgpKXtiLnRvU2hvdy5hbmltYXRlKHtoZWlnaHQ6InNob3ciLHBhZGRpbmdUb3A6InNob3ciLHBhZGRpbmdCb3R0b206InNob3cifSxiKTtyZXR1cm59aWYoIWIudG9TaG93LnNpemUoKSl7Yi50b0hpZGUuYW5pbWF0ZSh7aGVpZ2h0OiJoaWRlIixwYWRkaW5nVG9wOiJoaWRlIixwYWRkaW5nQm90dG9tOiJoaWRlIn0sYik7cmV0dXJufXZhciBkPWIudG9TaG93LmNzcygib3ZlcmZsb3ciKSxlPTAsZj17fSxnPXt9LGg9WyJoZWlnaHQiLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLGksaj1iLnRvU2hvdztpPWpbMF0uc3R5bGUud2lkdGgsai53aWR0aChqLnBhcmVudCgpLndpZHRoKCktcGFyc2VGbG9hdChqLmNzcygicGFkZGluZ0xlZnQiKSktcGFyc2VGbG9hdChqLmNzcygicGFkZGluZ1JpZ2h0IikpLShwYXJzZUZsb2F0KGouY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSl8fDApLShwYXJzZUZsb2F0KGouY3NzKCJib3JkZXJSaWdodFdpZHRoIikpfHwwKSksYS5lYWNoKGgsZnVuY3Rpb24oYyxkKXtnW2RdPSJoaWRlIjt2YXIgZT0oIiIrYS5jc3MoYi50b1Nob3dbMF0sZCkpLm1hdGNoKC9eKFtcZCstLl0rKSguKikkLyk7ZltkXT17dmFsdWU6ZVsxXSx1bml0OmVbMl18fCJweCJ9fSksYi50b1Nob3cuY3NzKHtoZWlnaHQ6MCxvdmVyZmxvdzoiaGlkZGVuIn0pLnNob3coKSxiLnRvSGlkZS5maWx0ZXIoIjpoaWRkZW4iKS5lYWNoKGIuY29tcGxldGUpLmVuZCgpLmZpbHRlcigiOnZpc2libGUiKS5hbmltYXRlKGcse3N0ZXA6ZnVuY3Rpb24oYSxjKXtjLnByb3A9PSJoZWlnaHQiJiYoZT1jLmVuZC1jLnN0YXJ0PT09MD8wOihjLm5vdy1jLnN0YXJ0KS8oYy5lbmQtYy5zdGFydCkpLGIudG9TaG93WzBdLnN0eWxlW2MucHJvcF09ZSpmW2MucHJvcF0udmFsdWUrZltjLnByb3BdLnVuaXR9LGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yi5hdXRvSGVpZ2h0fHxiLnRvU2hvdy5jc3MoImhlaWdodCIsIiIpLGIudG9TaG93LmNzcyh7d2lkdGg6aSxvdmVyZmxvdzpkfSksYi5jb21wbGV0ZSgpfX0pfSxib3VuY2VzbGlkZTpmdW5jdGlvbihhKXt0aGlzLnNsaWRlKGEse2Vhc2luZzphLmRvd24/ImVhc2VPdXRCb3VuY2UiOiJzd2luZyIsZHVyYXRpb246YS5kb3duPzFlMzoyMDB9KX19fSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5hdXRvY29tcGxldGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7dmFyIGM9MDthLndpZGdldCgidWkuYXV0b2NvbXBsZXRlIix7b3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9Gb2N1czohMSxkZWxheTozMDAsbWluTGVuZ3RoOjEscG9zaXRpb246e215OiJsZWZ0IHRvcCIsYXQ6ImxlZnQgYm90dG9tIixjb2xsaXNpb246Im5vbmUifSxzb3VyY2U6bnVsbH0scGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGM9dGhpcy5lbGVtZW50WzBdLm93bmVyRG9jdW1lbnQsZDt0aGlzLmlzTXVsdGlMaW5lPXRoaXMuZWxlbWVudC5pcygidGV4dGFyZWEiKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIpLmF0dHIoImF1dG9jb21wbGV0ZSIsIm9mZiIpLmF0dHIoe3JvbGU6InRleHRib3giLCJhcmlhLWF1dG9jb21wbGV0ZSI6Imxpc3QiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9KS5iaW5kKCJrZXlkb3duLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYyl7aWYoYi5vcHRpb25zLmRpc2FibGVkfHxiLmVsZW1lbnQucHJvcEF0dHIoInJlYWRPbmx5IikpcmV0dXJuO2Q9ITE7dmFyIGU9YS51aS5rZXlDb2RlO3N3aXRjaChjLmtleUNvZGUpe2Nhc2UgZS5QQUdFX1VQOmIuX21vdmUoInByZXZpb3VzUGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlBBR0VfRE9XTjpiLl9tb3ZlKCJuZXh0UGFnZSIsYyk7YnJlYWs7Y2FzZSBlLlVQOmIuX2tleUV2ZW50KCJwcmV2aW91cyIsYyk7YnJlYWs7Y2FzZSBlLkRPV046Yi5fa2V5RXZlbnQoIm5leHQiLGMpO2JyZWFrO2Nhc2UgZS5FTlRFUjpjYXNlIGUuTlVNUEFEX0VOVEVSOmIubWVudS5hY3RpdmUmJihkPSEwLGMucHJldmVudERlZmF1bHQoKSk7Y2FzZSBlLlRBQjppZighYi5tZW51LmFjdGl2ZSlyZXR1cm47Yi5tZW51LnNlbGVjdChjKTticmVhaztjYXNlIGUuRVNDQVBFOmIuZWxlbWVudC52YWwoYi50ZXJtKSxiLmNsb3NlKGMpO2JyZWFrO2RlZmF1bHQ6Y2xlYXJUaW1lb3V0KGIuc2VhcmNoaW5nKSxiLnNlYXJjaGluZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi50ZXJtIT1iLmVsZW1lbnQudmFsKCkmJihiLnNlbGVjdGVkSXRlbT1udWxsLGIuc2VhcmNoKG51bGwsYykpfSxiLm9wdGlvbnMuZGVsYXkpfX0pLmJpbmQoImtleXByZXNzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7ZCYmKGQ9ITEsYS5wcmV2ZW50RGVmYXVsdCgpKX0pLmJpbmQoImZvY3VzLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oKXtpZihiLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuO2Iuc2VsZWN0ZWRJdGVtPW51bGwsYi5wcmV2aW91cz1iLmVsZW1lbnQudmFsKCl9KS5iaW5kKCJibHVyLmF1dG9jb21wbGV0ZSIsZnVuY3Rpb24oYSl7aWYoYi5vcHRpb25zLmRpc2FibGVkKXJldHVybjtjbGVhclRpbWVvdXQoYi5zZWFyY2hpbmcpLGIuY2xvc2luZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5jbG9zZShhKSxiLl9jaGFuZ2UoYSl9LDE1MCl9KSx0aGlzLl9pbml0U291cmNlKCksdGhpcy5tZW51PWEoIjx1bD48L3VsPiIpLmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUiKS5hcHBlbmRUbyhhKHRoaXMub3B0aW9ucy5hcHBlbmRUb3x8ImJvZHkiLGMpWzBdKS5tb3VzZWRvd24oZnVuY3Rpb24oYyl7dmFyIGQ9Yi5tZW51LmVsZW1lbnRbMF07YShjLnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aHx8c2V0VGltZW91dChmdW5jdGlvbigpe2EoZG9jdW1lbnQpLm9uZSgibW91c2Vkb3duIixmdW5jdGlvbihjKXtjLnRhcmdldCE9PWIuZWxlbWVudFswXSYmYy50YXJnZXQhPT1kJiYhYS51aS5jb250YWlucyhkLGMudGFyZ2V0KSYmYi5jbG9zZSgpfSl9LDEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoYi5jbG9zaW5nKX0sMTMpfSkubWVudSh7Zm9jdXM6ZnVuY3Rpb24oYSxjKXt2YXIgZD1jLml0ZW0uZGF0YSgiaXRlbS5hdXRvY29tcGxldGUiKTshMSE9PWIuX3RyaWdnZXIoImZvY3VzIixhLHtpdGVtOmR9KSYmL15rZXkvLnRlc3QoYS5vcmlnaW5hbEV2ZW50LnR5cGUpJiZiLmVsZW1lbnQudmFsKGQudmFsdWUpfSxzZWxlY3RlZDpmdW5jdGlvbihhLGQpe3ZhciBlPWQuaXRlbS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIpLGY9Yi5wcmV2aW91cztiLmVsZW1lbnRbMF0hPT1jLmFjdGl2ZUVsZW1lbnQmJihiLmVsZW1lbnQuZm9jdXMoKSxiLnByZXZpb3VzPWYsc2V0VGltZW91dChmdW5jdGlvbigpe2IucHJldmlvdXM9ZixiLnNlbGVjdGVkSXRlbT1lfSwxKSksITEhPT1iLl90cmlnZ2VyKCJzZWxlY3QiLGEse2l0ZW06ZX0pJiZiLmVsZW1lbnQudmFsKGUudmFsdWUpLGIudGVybT1iLmVsZW1lbnQudmFsKCksYi5jbG9zZShhKSxiLnNlbGVjdGVkSXRlbT1lfSxibHVyOmZ1bmN0aW9uKGEsYyl7Yi5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJmIuZWxlbWVudC52YWwoKSE9PWIudGVybSYmYi5lbGVtZW50LnZhbChiLnRlcm0pfX0pLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSkuY3NzKHt0b3A6MCxsZWZ0OjB9KS5oaWRlKCkuZGF0YSgibWVudSIpLGEuZm4uYmdpZnJhbWUmJnRoaXMubWVudS5lbGVtZW50LmJnaWZyYW1lKCksYi5iZWZvcmV1bmxvYWRIYW5kbGVyPWZ1bmN0aW9uKCl7Yi5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfSxhKHdpbmRvdykuYmluZCgiYmVmb3JldW5sb2FkIixiLmJlZm9yZXVubG9hZEhhbmRsZXIpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS1hdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJhcmlhLWhhc3BvcHVwIiksdGhpcy5tZW51LmVsZW1lbnQucmVtb3ZlKCksYSh3aW5kb3cpLnVuYmluZCgiYmVmb3JldW5sb2FkIix0aGlzLmJlZm9yZXVubG9hZEhhbmRsZXIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYj09PSJzb3VyY2UiJiZ0aGlzLl9pbml0U291cmNlKCksYj09PSJhcHBlbmRUbyImJnRoaXMubWVudS5lbGVtZW50LmFwcGVuZFRvKGEoY3x8ImJvZHkiLHRoaXMuZWxlbWVudFswXS5vd25lckRvY3VtZW50KVswXSksYj09PSJkaXNhYmxlZCImJmMmJnRoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpfSxfaW5pdFNvdXJjZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYyxkO2EuaXNBcnJheSh0aGlzLm9wdGlvbnMuc291cmNlKT8oYz10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGIsZCl7ZChhLnVpLmF1dG9jb21wbGV0ZS5maWx0ZXIoYyxiLnRlcm0pKX0pOnR5cGVvZiB0aGlzLm9wdGlvbnMuc291cmNlPT0ic3RyaW5nIj8oZD10aGlzLm9wdGlvbnMuc291cmNlLHRoaXMuc291cmNlPWZ1bmN0aW9uKGMsZSl7Yi54aHImJmIueGhyLmFib3J0KCksYi54aHI9YS5hamF4KHt1cmw6ZCxkYXRhOmMsZGF0YVR5cGU6Impzb24iLHN1Y2Nlc3M6ZnVuY3Rpb24oYSxiKXtlKGEpfSxlcnJvcjpmdW5jdGlvbigpe2UoW10pfX0pfSk6dGhpcy5zb3VyY2U9dGhpcy5vcHRpb25zLnNvdXJjZX0sc2VhcmNoOmZ1bmN0aW9uKGEsYil7YT1hIT1udWxsP2E6dGhpcy5lbGVtZW50LnZhbCgpLHRoaXMudGVybT10aGlzLmVsZW1lbnQudmFsKCk7aWYoYS5sZW5ndGg8dGhpcy5vcHRpb25zLm1pbkxlbmd0aClyZXR1cm4gdGhpcy5jbG9zZShiKTtjbGVhclRpbWVvdXQodGhpcy5jbG9zaW5nKTtpZih0aGlzLl90cmlnZ2VyKCJzZWFyY2giLGIpPT09ITEpcmV0dXJuO3JldHVybiB0aGlzLl9zZWFyY2goYSl9LF9zZWFyY2g6ZnVuY3Rpb24oYSl7dGhpcy5wZW5kaW5nKyssdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpLHRoaXMuc291cmNlKHt0ZXJtOmF9LHRoaXMuX3Jlc3BvbnNlKCkpfSxfcmVzcG9uc2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9KytjO3JldHVybiBmdW5jdGlvbihkKXtiPT09YyYmYS5fX3Jlc3BvbnNlKGQpLGEucGVuZGluZy0tLGEucGVuZGluZ3x8YS5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtbG9hZGluZyIpfX0sX19yZXNwb25zZTpmdW5jdGlvbihhKXshdGhpcy5vcHRpb25zLmRpc2FibGVkJiZhJiZhLmxlbmd0aD8oYT10aGlzLl9ub3JtYWxpemUoYSksdGhpcy5fc3VnZ2VzdChhKSx0aGlzLl90cmlnZ2VyKCJvcGVuIikpOnRoaXMuY2xvc2UoKX0sY2xvc2U6ZnVuY3Rpb24oYSl7Y2xlYXJUaW1lb3V0KHRoaXMuY2xvc2luZyksdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikmJih0aGlzLm1lbnUuZWxlbWVudC5oaWRlKCksdGhpcy5tZW51LmRlYWN0aXZhdGUoKSx0aGlzLl90cmlnZ2VyKCJjbG9zZSIsYSkpfSxfY2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMucHJldmlvdXMhPT10aGlzLmVsZW1lbnQudmFsKCkmJnRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYSx7aXRlbTp0aGlzLnNlbGVjdGVkSXRlbX0pfSxfbm9ybWFsaXplOmZ1bmN0aW9uKGIpe3JldHVybiBiLmxlbmd0aCYmYlswXS5sYWJlbCYmYlswXS52YWx1ZT9iOmEubWFwKGIsZnVuY3Rpb24oYil7cmV0dXJuIHR5cGVvZiBiPT0ic3RyaW5nIj97bGFiZWw6Yix2YWx1ZTpifTphLmV4dGVuZCh7bGFiZWw6Yi5sYWJlbHx8Yi52YWx1ZSx2YWx1ZTpiLnZhbHVlfHxiLmxhYmVsfSxiKX0pfSxfc3VnZ2VzdDpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm1lbnUuZWxlbWVudC5lbXB0eSgpLnpJbmRleCh0aGlzLmVsZW1lbnQuekluZGV4KCkrMSk7dGhpcy5fcmVuZGVyTWVudShjLGIpLHRoaXMubWVudS5kZWFjdGl2YXRlKCksdGhpcy5tZW51LnJlZnJlc2goKSxjLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksYy5wb3NpdGlvbihhLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dChuZXcgYS5FdmVudCgibW91c2VvdmVyIikpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWVudS5lbGVtZW50O2Eub3V0ZXJXaWR0aChNYXRoLm1heChhLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpczthLmVhY2goYyxmdW5jdGlvbihhLGMpe2QuX3JlbmRlckl0ZW0oYixjKX0pfSxfcmVuZGVySXRlbTpmdW5jdGlvbihiLGMpe3JldHVybiBhKCI8bGk+PC9saT4iKS5kYXRhKCJpdGVtLmF1dG9jb21wbGV0ZSIsYykuYXBwZW5kKGEoIjxhPjwvYT4iKS50ZXh0KGMubGFiZWwpKS5hcHBlbmRUbyhiKX0sX21vdmU6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5tZW51LmVsZW1lbnQuaXMoIjp2aXNpYmxlIikpe3RoaXMuc2VhcmNoKG51bGwsYik7cmV0dXJufWlmKHRoaXMubWVudS5maXJzdCgpJiYvXnByZXZpb3VzLy50ZXN0KGEpfHx0aGlzLm1lbnUubGFzdCgpJiYvXm5leHQvLnRlc3QoYSkpe3RoaXMuZWxlbWVudC52YWwodGhpcy50ZXJtKSx0aGlzLm1lbnUuZGVhY3RpdmF0ZSgpO3JldHVybn10aGlzLm1lbnVbYV0oYil9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudH0sX2tleUV2ZW50OmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKXRoaXMuX21vdmUoYSxiKSxiLnByZXZlbnREZWZhdWx0KCl9fSksYS5leHRlbmQoYS51aS5hdXRvY29tcGxldGUse2VzY2FwZVJlZ2V4OmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csIlxcJCYiKX0sZmlsdGVyOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bmV3IFJlZ0V4cChhLnVpLmF1dG9jb21wbGV0ZS5lc2NhcGVSZWdleChjKSwiaSIpO3JldHVybiBhLmdyZXAoYixmdW5jdGlvbihhKXtyZXR1cm4gZC50ZXN0KGEubGFiZWx8fGEudmFsdWV8fGEpfSl9fSl9KShqUXVlcnkpLGZ1bmN0aW9uKGEpe2Eud2lkZ2V0KCJ1aS5tZW51Iix7X2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXM7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikuYXR0cih7cm9sZToibGlzdGJveCIsImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6InVpLWFjdGl2ZS1tZW51aXRlbSJ9KS5jbGljayhmdW5jdGlvbihjKXtpZighYShjLnRhcmdldCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSBhIikubGVuZ3RoKXJldHVybjtjLnByZXZlbnREZWZhdWx0KCksYi5zZWxlY3QoYyl9KSx0aGlzLnJlZnJlc2goKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMsYz10aGlzLmVsZW1lbnQuY2hpbGRyZW4oImxpOm5vdCgudWktbWVudS1pdGVtKTpoYXMoYSkiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikuYXR0cigicm9sZSIsIm1lbnVpdGVtIik7Yy5jaGlsZHJlbigiYSIpLmFkZENsYXNzKCJ1aS1jb3JuZXItYWxsIikuYXR0cigidGFiaW5kZXgiLC0xKS5tb3VzZWVudGVyKGZ1bmN0aW9uKGMpe2IuYWN0aXZhdGUoYyxhKHRoaXMpLnBhcmVudCgpKX0pLm1vdXNlbGVhdmUoZnVuY3Rpb24oKXtiLmRlYWN0aXZhdGUoKX0pfSxhY3RpdmF0ZTpmdW5jdGlvbihhLGIpe3RoaXMuZGVhY3RpdmF0ZSgpO2lmKHRoaXMuaGFzU2Nyb2xsKCkpe3ZhciBjPWIub2Zmc2V0KCkudG9wLXRoaXMuZWxlbWVudC5vZmZzZXQoKS50b3AsZD10aGlzLmVsZW1lbnQuc2Nyb2xsVG9wKCksZT10aGlzLmVsZW1lbnQuaGVpZ2h0KCk7YzwwP3RoaXMuZWxlbWVudC5zY3JvbGxUb3AoZCtjKTpjPj1lJiZ0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wKGQrYy1lK2IuaGVpZ2h0KCkpfXRoaXMuYWN0aXZlPWIuZXEoMCkuY2hpbGRyZW4oImEiKS5hZGRDbGFzcygidWktc3RhdGUtaG92ZXIiKS5hdHRyKCJpZCIsInVpLWFjdGl2ZS1tZW51aXRlbSIpLmVuZCgpLHRoaXMuX3RyaWdnZXIoImZvY3VzIixhLHtpdGVtOmJ9KX0sZGVhY3RpdmF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmFjdGl2ZSlyZXR1cm47dGhpcy5hY3RpdmUuY2hpbGRyZW4oImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKS5yZW1vdmVBdHRyKCJpZCIpLHRoaXMuX3RyaWdnZXIoImJsdXIiKSx0aGlzLmFjdGl2ZT1udWxsfSxuZXh0OmZ1bmN0aW9uKGEpe3RoaXMubW92ZSgibmV4dCIsIi51aS1tZW51LWl0ZW06Zmlyc3QiLGEpfSxwcmV2aW91czpmdW5jdGlvbihhKXt0aGlzLm1vdmUoInByZXYiLCIudWktbWVudS1pdGVtOmxhc3QiLGEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLnByZXZBbGwoIi51aS1tZW51LWl0ZW0iKS5sZW5ndGh9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5uZXh0QWxsKCIudWktbWVudS1pdGVtIikubGVuZ3RofSxtb3ZlOmZ1bmN0aW9uKGEsYixjKXtpZighdGhpcy5hY3RpdmUpe3RoaXMuYWN0aXZhdGUoYyx0aGlzLmVsZW1lbnQuY2hpbGRyZW4oYikpO3JldHVybn12YXIgZD10aGlzLmFjdGl2ZVthKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApO2QubGVuZ3RoP3RoaXMuYWN0aXZhdGUoYyxkKTp0aGlzLmFjdGl2YXRlKGMsdGhpcy5lbGVtZW50LmNoaWxkcmVuKGIpKX0sbmV4dFBhZ2U6ZnVuY3Rpb24oYil7aWYodGhpcy5oYXNTY3JvbGwoKSl7aWYoIXRoaXMuYWN0aXZlfHx0aGlzLmxhc3QoKSl7dGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbTpmaXJzdCIpKTtyZXR1cm59dmFyIGM9dGhpcy5hY3RpdmUub2Zmc2V0KCkudG9wLGQ9dGhpcy5lbGVtZW50LmhlaWdodCgpLGU9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtIikuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKS5vZmZzZXQoKS50b3AtYy1kK2EodGhpcykuaGVpZ2h0KCk7cmV0dXJuIGI8MTAmJmI+LTEwfSk7ZS5sZW5ndGh8fChlPXRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbTpsYXN0IikpLHRoaXMuYWN0aXZhdGUoYixlKX1lbHNlIHRoaXMuYWN0aXZhdGUoYix0aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoIXRoaXMuYWN0aXZlfHx0aGlzLmxhc3QoKT8iOmZpcnN0IjoiOmxhc3QiKSl9LHByZXZpb3VzUGFnZTpmdW5jdGlvbihiKXtpZih0aGlzLmhhc1Njcm9sbCgpKXtpZighdGhpcy5hY3RpdmV8fHRoaXMuZmlyc3QoKSl7dGhpcy5hY3RpdmF0ZShiLHRoaXMuZWxlbWVudC5jaGlsZHJlbigiLnVpLW1lbnUtaXRlbTpsYXN0IikpO3JldHVybn12YXIgYz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3AsZD10aGlzLmVsZW1lbnQuaGVpZ2h0KCksZT10aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLm9mZnNldCgpLnRvcC1jK2QtYSh0aGlzKS5oZWlnaHQoKTtyZXR1cm4gYjwxMCYmYj4tMTB9KTtlLmxlbmd0aHx8KGU9dGhpcy5lbGVtZW50LmNoaWxkcmVuKCIudWktbWVudS1pdGVtOmZpcnN0IikpLHRoaXMuYWN0aXZhdGUoYixlKX1lbHNlIHRoaXMuYWN0aXZhdGUoYix0aGlzLmVsZW1lbnQuY2hpbGRyZW4oIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoIXRoaXMuYWN0aXZlfHx0aGlzLmZpcnN0KCk/IjpsYXN0IjoiOmZpcnN0IikpfSxoYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmhlaWdodCgpPHRoaXMuZWxlbWVudFthLmZuLnByb3A/InByb3AiOiJhdHRyIl0oInNjcm9sbEhlaWdodCIpfSxzZWxlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5fdHJpZ2dlcigic2VsZWN0ZWQiLGEse2l0ZW06dGhpcy5hY3RpdmV9KX19KX0oalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkudWkuYnV0dG9uLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9InVpLWJ1dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIixoPSJ1aS1zdGF0ZS1ob3ZlciB1aS1zdGF0ZS1hY3RpdmUgIixpPSJ1aS1idXR0b24taWNvbnMtb25seSB1aS1idXR0b24taWNvbi1vbmx5IHVpLWJ1dHRvbi10ZXh0LWljb25zIHVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSB1aS1idXR0b24tdGV4dC1pY29uLXNlY29uZGFyeSB1aS1idXR0b24tdGV4dC1vbmx5IixqPWZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKS5maW5kKCI6dWktYnV0dG9uIik7c2V0VGltZW91dChmdW5jdGlvbigpe2IuYnV0dG9uKCJyZWZyZXNoIil9LDEpfSxrPWZ1bmN0aW9uKGIpe3ZhciBjPWIubmFtZSxkPWIuZm9ybSxlPWEoW10pO3JldHVybiBjJiYoZD9lPWEoZCkuZmluZCgiW25hbWU9JyIrYysiJ10iKTplPWEoIltuYW1lPSciK2MrIiddIixiLm93bmVyRG9jdW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLmZvcm19KSksZX07YS53aWRnZXQoInVpLmJ1dHRvbiIse29wdGlvbnM6e2Rpc2FibGVkOm51bGwsdGV4dDohMCxsYWJlbDpudWxsLGljb25zOntwcmltYXJ5Om51bGwsc2Vjb25kYXJ5Om51bGx9fSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmNsb3Nlc3QoImZvcm0iKS51bmJpbmQoInJlc2V0LmJ1dHRvbiIpLmJpbmQoInJlc2V0LmJ1dHRvbiIsaiksdHlwZW9mIHRoaXMub3B0aW9ucy5kaXNhYmxlZCE9ImJvb2xlYW4iP3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hIXRoaXMuZWxlbWVudC5wcm9wQXR0cigiZGlzYWJsZWQiKTp0aGlzLmVsZW1lbnQucHJvcEF0dHIoImRpc2FibGVkIix0aGlzLm9wdGlvbnMuZGlzYWJsZWQpLHRoaXMuX2RldGVybWluZUJ1dHRvblR5cGUoKSx0aGlzLmhhc1RpdGxlPSEhdGhpcy5idXR0b25FbGVtZW50LmF0dHIoInRpdGxlIik7dmFyIGI9dGhpcyxoPXRoaXMub3B0aW9ucyxpPXRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIsbD0idWktc3RhdGUtaG92ZXIiKyhpPyIiOiIgdWktc3RhdGUtYWN0aXZlIiksbT0idWktc3RhdGUtZm9jdXMiO2gubGFiZWw9PT1udWxsJiYoaC5sYWJlbD10aGlzLmJ1dHRvbkVsZW1lbnQuaHRtbCgpKSx0aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoZykuYXR0cigicm9sZSIsImJ1dHRvbiIpLmJpbmQoIm1vdXNlZW50ZXIuYnV0dG9uIixmdW5jdGlvbigpe2lmKGguZGlzYWJsZWQpcmV0dXJuO2EodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcz09PWMmJmEodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgibW91c2VsZWF2ZS5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZClyZXR1cm47YSh0aGlzKS5yZW1vdmVDbGFzcyhsKX0pLmJpbmQoImNsaWNrLmJ1dHRvbiIsZnVuY3Rpb24oYSl7aC5kaXNhYmxlZCYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX0pLHRoaXMuZWxlbWVudC5iaW5kKCJmb2N1cy5idXR0b24iLGZ1bmN0aW9uKCl7Yi5idXR0b25FbGVtZW50LmFkZENsYXNzKG0pfSkuYmluZCgiYmx1ci5idXR0b24iLGZ1bmN0aW9uKCl7Yi5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKG0pfSksaSYmKHRoaXMuZWxlbWVudC5iaW5kKCJjaGFuZ2UuYnV0dG9uIixmdW5jdGlvbigpe2lmKGYpcmV0dXJuO2IucmVmcmVzaCgpfSksdGhpcy5idXR0b25FbGVtZW50LmJpbmQoIm1vdXNlZG93bi5idXR0b24iLGZ1bmN0aW9uKGEpe2lmKGguZGlzYWJsZWQpcmV0dXJuO2Y9ITEsZD1hLnBhZ2VYLGU9YS5wYWdlWX0pLmJpbmQoIm1vdXNldXAuYnV0dG9uIixmdW5jdGlvbihhKXtpZihoLmRpc2FibGVkKXJldHVybjtpZihkIT09YS5wYWdlWHx8ZSE9PWEucGFnZVkpZj0hMH0pKSx0aGlzLnR5cGU9PT0iY2hlY2tib3giP3RoaXMuYnV0dG9uRWxlbWVudC5iaW5kKCJjbGljay5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZHx8ZilyZXR1cm4hMTthKHRoaXMpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxiLmJ1dHRvbkVsZW1lbnQuYXR0cigiYXJpYS1wcmVzc2VkIixiLmVsZW1lbnRbMF0uY2hlY2tlZCl9KTp0aGlzLnR5cGU9PT0icmFkaW8iP3RoaXMuYnV0dG9uRWxlbWVudC5iaW5kKCJjbGljay5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZHx8ZilyZXR1cm4hMTthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxiLmJ1dHRvbkVsZW1lbnQuYXR0cigiYXJpYS1wcmVzc2VkIiwidHJ1ZSIpO3ZhciBjPWIuZWxlbWVudFswXTtrKGMpLm5vdChjKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzKS5idXR0b24oIndpZGdldCIpWzBdfSkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIil9KToodGhpcy5idXR0b25FbGVtZW50LmJpbmQoIm1vdXNlZG93bi5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZClyZXR1cm4hMTthKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxjPXRoaXMsYShkb2N1bWVudCkub25lKCJtb3VzZXVwIixmdW5jdGlvbigpe2M9bnVsbH0pfSkuYmluZCgibW91c2V1cC5idXR0b24iLGZ1bmN0aW9uKCl7aWYoaC5kaXNhYmxlZClyZXR1cm4hMTthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0pLmJpbmQoImtleWRvd24uYnV0dG9uIixmdW5jdGlvbihiKXtpZihoLmRpc2FibGVkKXJldHVybiExOyhiLmtleUNvZGU9PWEudWkua2V5Q29kZS5TUEFDRXx8Yi5rZXlDb2RlPT1hLnVpLmtleUNvZGUuRU5URVIpJiZhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0pLmJpbmQoImtleXVwLmJ1dHRvbiIsZnVuY3Rpb24oKXthKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0pLHRoaXMuYnV0dG9uRWxlbWVudC5pcygiYSIpJiZ0aGlzLmJ1dHRvbkVsZW1lbnQua2V5dXAoZnVuY3Rpb24oYil7Yi5rZXlDb2RlPT09YS51aS5rZXlDb2RlLlNQQUNFJiZhKHRoaXMpLmNsaWNrKCl9KSksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsaC5kaXNhYmxlZCksdGhpcy5fcmVzZXRCdXR0b24oKX0sX2RldGVybWluZUJ1dHRvblR5cGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuaXMoIjpjaGVja2JveCIpP3RoaXMudHlwZT0iY2hlY2tib3giOnRoaXMuZWxlbWVudC5pcygiOnJhZGlvIik/dGhpcy50eXBlPSJyYWRpbyI6dGhpcy5lbGVtZW50LmlzKCJpbnB1dCIpP3RoaXMudHlwZT0iaW5wdXQiOnRoaXMudHlwZT0iYnV0dG9uIjtpZih0aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFkaW8iKXt2YXIgYT10aGlzLmVsZW1lbnQucGFyZW50cygpLmZpbHRlcigiOmxhc3QiKSxiPSJsYWJlbFtmb3I9JyIrdGhpcy5lbGVtZW50LmF0dHIoImlkIikrIiddIjt0aGlzLmJ1dHRvbkVsZW1lbnQ9YS5maW5kKGIpLHRoaXMuYnV0dG9uRWxlbWVudC5sZW5ndGh8fChhPWEubGVuZ3RoP2Euc2libGluZ3MoKTp0aGlzLmVsZW1lbnQuc2libGluZ3MoKSx0aGlzLmJ1dHRvbkVsZW1lbnQ9YS5maWx0ZXIoYiksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KHRoaXMuYnV0dG9uRWxlbWVudD1hLmZpbmQoYikpKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpO3ZhciBjPXRoaXMuZWxlbWVudC5pcygiOmNoZWNrZWQiKTtjJiZ0aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHRoaXMuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLGMpfWVsc2UgdGhpcy5idXR0b25FbGVtZW50PXRoaXMuZWxlbWVudH0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnV0dG9uRWxlbWVudH0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiksdGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKGcrIiAiK2grIiAiK2kpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLXByZXNzZWQiKS5odG1sKHRoaXMuYnV0dG9uRWxlbWVudC5maW5kKCIudWktYnV0dG9uLXRleHQiKS5odG1sKCkpLHRoaXMuaGFzVGl0bGV8fHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVBdHRyKCJ0aXRsZSIpLGEuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXthLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoYj09PSJkaXNhYmxlZCIpe2M/dGhpcy5lbGVtZW50LnByb3BBdHRyKCJkaXNhYmxlZCIsITApOnRoaXMuZWxlbWVudC5wcm9wQXR0cigiZGlzYWJsZWQiLCExKTtyZXR1cm59dGhpcy5fcmVzZXRCdXR0b24oKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudC5pcygiOmRpc2FibGVkIik7YiE9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsYiksdGhpcy50eXBlPT09InJhZGlvIj9rKHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe2EodGhpcykuaXMoIjpjaGVja2VkIik/YSh0aGlzKS5idXR0b24oIndpZGdldCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik6YSh0aGlzKS5idXR0b24oIndpZGdldCIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpfSk6dGhpcy50eXBlPT09ImNoZWNrYm94IiYmKHRoaXMuZWxlbWVudC5pcygiOmNoZWNrZWQiKT90aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIikpfSxfcmVzZXRCdXR0b246ZnVuY3Rpb24oKXtpZih0aGlzLnR5cGU9PT0iaW5wdXQiKXt0aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMuZWxlbWVudC52YWwodGhpcy5vcHRpb25zLmxhYmVsKTtyZXR1cm59dmFyIGI9dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKGkpLGM9YSgiPHNwYW4+PC9zcGFuPiIsdGhpcy5lbGVtZW50WzBdLm93bmVyRG9jdW1lbnQpLmFkZENsYXNzKCJ1aS1idXR0b24tdGV4dCIpLmh0bWwodGhpcy5vcHRpb25zLmxhYmVsKS5hcHBlbmRUbyhiLmVtcHR5KCkpLnRleHQoKSxkPXRoaXMub3B0aW9ucy5pY29ucyxlPWQucHJpbWFyeSYmZC5zZWNvbmRhcnksZj1bXTtkLnByaW1hcnl8fGQuc2Vjb25kYXJ5Pyh0aGlzLm9wdGlvbnMudGV4dCYmZi5wdXNoKCJ1aS1idXR0b24tdGV4dC1pY29uIisoZT8icyI6ZC5wcmltYXJ5PyItcHJpbWFyeSI6Ii1zZWNvbmRhcnkiKSksZC5wcmltYXJ5JiZiLnByZXBlbmQoIjxzcGFuIGNsYXNzPSd1aS1idXR0b24taWNvbi1wcmltYXJ5IHVpLWljb24gIitkLnByaW1hcnkrIic+PC9zcGFuPiIpLGQuc2Vjb25kYXJ5JiZiLmFwcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSB1aS1pY29uICIrZC5zZWNvbmRhcnkrIic+PC9zcGFuPiIpLHRoaXMub3B0aW9ucy50ZXh0fHwoZi5wdXNoKGU/InVpLWJ1dHRvbi1pY29ucy1vbmx5IjoidWktYnV0dG9uLWljb24tb25seSIpLHRoaXMuaGFzVGl0bGV8fGIuYXR0cigidGl0bGUiLGMpKSk6Zi5wdXNoKCJ1aS1idXR0b24tdGV4dC1vbmx5IiksYi5hZGRDbGFzcyhmLmpvaW4oIiAiKSl9fSksYS53aWRnZXQoInVpLmJ1dHRvbnNldCIse29wdGlvbnM6e2l0ZW1zOiI6YnV0dG9uLCA6c3VibWl0LCA6cmVzZXQsIDpjaGVja2JveCwgOnJhZGlvLCBhLCA6ZGF0YShidXR0b24pIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYnV0dG9uc2V0Iil9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXtiPT09ImRpc2FibGVkIiYmdGhpcy5idXR0b25zLmJ1dHRvbigib3B0aW9uIixiLGMpLGEuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scmVmcmVzaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWxlbWVudC5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCI7dGhpcy5idXR0b25zPXRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZmlsdGVyKCI6dWktYnV0dG9uIikuYnV0dG9uKCJyZWZyZXNoIikuZW5kKCkubm90KCI6dWktYnV0dG9uIikuYnV0dG9uKCkuZW5kKCkubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItYWxsIHVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodCIpLmZpbHRlcigiOmZpcnN0IikuYWRkQ2xhc3MoYj8idWktY29ybmVyLXJpZ2h0IjoidWktY29ybmVyLWxlZnQiKS5lbmQoKS5maWx0ZXIoIjpsYXN0IikuYWRkQ2xhc3MoYj8idWktY29ybmVyLWxlZnQiOiJ1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5lbmQoKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktYnV0dG9uc2V0IiksdGhpcy5idXR0b25zLm1hcChmdW5jdGlvbigpe3JldHVybiBhKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktY29ybmVyLWxlZnQgdWktY29ybmVyLXJpZ2h0IikuZW5kKCkuYnV0dG9uKCJkZXN0cm95IiksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX19KX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLmRpYWxvZy5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXt2YXIgYz0idWktZGlhbG9nIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsICIsZD17YnV0dG9uczohMCxoZWlnaHQ6ITAsbWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMCx3aWR0aDohMH0sZT17bWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMH07YS53aWRnZXQoInVpLmRpYWxvZyIse29wdGlvbnM6e2F1dG9PcGVuOiEwLGJ1dHRvbnM6e30sY2xvc2VPbkVzY2FwZTohMCxjbG9zZVRleHQ6ImNsb3NlIixkaWFsb2dDbGFzczoiIixkcmFnZ2FibGU6ITAsaGlkZTpudWxsLGhlaWdodDoiYXV0byIsbWF4SGVpZ2h0OiExLG1heFdpZHRoOiExLG1pbkhlaWdodDoxNTAsbWluV2lkdGg6MTUwLG1vZGFsOiExLHBvc2l0aW9uOntteToiY2VudGVyIixhdDoiY2VudGVyIixjb2xsaXNpb246ImZpdCIsdXNpbmc6ZnVuY3Rpb24oYil7dmFyIGM9YSh0aGlzKS5jc3MoYikub2Zmc2V0KCkudG9wO2M8MCYmYSh0aGlzKS5jc3MoInRvcCIsYi50b3AtYyl9fSxyZXNpemFibGU6ITAsc2hvdzpudWxsLHN0YWNrOiEwLHRpdGxlOiIiLHdpZHRoOjMwMCx6SW5kZXg6MWUzfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcmlnaW5hbFRpdGxlPXRoaXMuZWxlbWVudC5hdHRyKCJ0aXRsZSIpLHR5cGVvZiB0aGlzLm9yaWdpbmFsVGl0bGUhPSJzdHJpbmciJiYodGhpcy5vcmlnaW5hbFRpdGxlPSIiKSx0aGlzLm9wdGlvbnMudGl0bGU9dGhpcy5vcHRpb25zLnRpdGxlfHx0aGlzLm9yaWdpbmFsVGl0bGU7dmFyIGI9dGhpcyxkPWIub3B0aW9ucyxlPWQudGl0bGV8fCImIzE2MDsiLGY9YS51aS5kaWFsb2cuZ2V0VGl0bGVJZChiLmVsZW1lbnQpLGc9KGIudWlEaWFsb2c9YSgiPGRpdj48L2Rpdj4iKSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSkuaGlkZSgpLmFkZENsYXNzKGMrZC5kaWFsb2dDbGFzcykuY3NzKHt6SW5kZXg6ZC56SW5kZXh9KS5hdHRyKCJ0YWJJbmRleCIsLTEpLmNzcygib3V0bGluZSIsMCkua2V5ZG93bihmdW5jdGlvbihjKXtkLmNsb3NlT25Fc2NhcGUmJiFjLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLmtleUNvZGUmJmMua2V5Q29kZT09PWEudWkua2V5Q29kZS5FU0NBUEUmJihiLmNsb3NlKGMpLGMucHJldmVudERlZmF1bHQoKSl9KS5hdHRyKHtyb2xlOiJkaWFsb2ciLCJhcmlhLWxhYmVsbGVkYnkiOmZ9KS5tb3VzZWRvd24oZnVuY3Rpb24oYSl7Yi5tb3ZlVG9Ub3AoITEsYSl9KSxoPWIuZWxlbWVudC5zaG93KCkucmVtb3ZlQXR0cigidGl0bGUiKS5hZGRDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5hcHBlbmRUbyhnKSxpPShiLnVpRGlhbG9nVGl0bGViYXI9YSgiPGRpdj48L2Rpdj4iKSkuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZWJhciB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwgdWktaGVscGVyLWNsZWFyZml4IikucHJlcGVuZFRvKGcpLGo9YSgnPGEgaHJlZj0iIyI+PC9hPicpLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXItY2xvc2UgdWktY29ybmVyLWFsbCIpLmF0dHIoInJvbGUiLCJidXR0b24iKS5ob3ZlcihmdW5jdGlvbigpe2ouYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LGZ1bmN0aW9uKCl7ai5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKX0pLmZvY3VzKGZ1bmN0aW9uKCl7ai5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLmJsdXIoZnVuY3Rpb24oKXtqLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSkuY2xpY2soZnVuY3Rpb24oYSl7cmV0dXJuIGIuY2xvc2UoYSksITF9KS5hcHBlbmRUbyhpKSxrPShiLnVpRGlhbG9nVGl0bGViYXJDbG9zZVRleHQ9YSgiPHNwYW4+PC9zcGFuPiIpKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWNsb3NldGhpY2siKS50ZXh0KGQuY2xvc2VUZXh0KS5hcHBlbmRUbyhqKSxsPWEoIjxzcGFuPjwvc3Bhbj4iKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlIikuYXR0cigiaWQiLGYpLmh0bWwoZSkucHJlcGVuZFRvKGkpO2EuaXNGdW5jdGlvbihkLmJlZm9yZWNsb3NlKSYmIWEuaXNGdW5jdGlvbihkLmJlZm9yZUNsb3NlKSYmKGQuYmVmb3JlQ2xvc2U9ZC5iZWZvcmVjbG9zZSksaS5maW5kKCIqIikuYWRkKGkpLmRpc2FibGVTZWxlY3Rpb24oKSxkLmRyYWdnYWJsZSYmYS5mbi5kcmFnZ2FibGUmJmIuX21ha2VEcmFnZ2FibGUoKSxkLnJlc2l6YWJsZSYmYS5mbi5yZXNpemFibGUmJmIuX21ha2VSZXNpemFibGUoKSxiLl9jcmVhdGVCdXR0b25zKGQuYnV0dG9ucyksYi5faXNPcGVuPSExLGEuZm4uYmdpZnJhbWUmJmcuYmdpZnJhbWUoKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gYS5vdmVybGF5JiZhLm92ZXJsYXkuZGVzdHJveSgpLGEudWlEaWFsb2cuaGlkZSgpLGEuZWxlbWVudC51bmJpbmQoIi5kaWFsb2ciKS5yZW1vdmVEYXRhKCJkaWFsb2ciKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5oaWRlKCkuYXBwZW5kVG8oImJvZHkiKSxhLnVpRGlhbG9nLnJlbW92ZSgpLGEub3JpZ2luYWxUaXRsZSYmYS5lbGVtZW50LmF0dHIoInRpdGxlIixhLm9yaWdpbmFsVGl0bGUpLGF9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVpRGlhbG9nfSxjbG9zZTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLGQsZTtpZighMT09PWMuX3RyaWdnZXIoImJlZm9yZUNsb3NlIixiKSlyZXR1cm47cmV0dXJuIGMub3ZlcmxheSYmYy5vdmVybGF5LmRlc3Ryb3koKSxjLnVpRGlhbG9nLnVuYmluZCgia2V5cHJlc3MudWktZGlhbG9nIiksYy5faXNPcGVuPSExLGMub3B0aW9ucy5oaWRlP2MudWlEaWFsb2cuaGlkZShjLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe2MuX3RyaWdnZXIoImNsb3NlIixiKX0pOihjLnVpRGlhbG9nLmhpZGUoKSxjLl90cmlnZ2VyKCJjbG9zZSIsYikpLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKCksYy5vcHRpb25zLm1vZGFsJiYoZD0wLGEoIi51aS1kaWFsb2ciKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcyE9PWMudWlEaWFsb2dbMF0mJihlPWEodGhpcykuY3NzKCJ6LWluZGV4IiksaXNOYU4oZSl8fChkPU1hdGgubWF4KGQsZSkpKX0pLGEudWkuZGlhbG9nLm1heFo9ZCksY30saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzT3Blbn0sbW92ZVRvVG9wOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcyxlPWQub3B0aW9ucyxmO3JldHVybiBlLm1vZGFsJiYhYnx8IWUuc3RhY2smJiFlLm1vZGFsP2QuX3RyaWdnZXIoImZvY3VzIixjKTooZS56SW5kZXg+YS51aS5kaWFsb2cubWF4WiYmKGEudWkuZGlhbG9nLm1heFo9ZS56SW5kZXgpLGQub3ZlcmxheSYmKGEudWkuZGlhbG9nLm1heForPTEsZC5vdmVybGF5LiRlbC5jc3MoInotaW5kZXgiLGEudWkuZGlhbG9nLm92ZXJsYXkubWF4Wj1hLnVpLmRpYWxvZy5tYXhaKSksZj17c2Nyb2xsVG9wOmQuZWxlbWVudC5zY3JvbGxUb3AoKSxzY3JvbGxMZWZ0OmQuZWxlbWVudC5zY3JvbGxMZWZ0KCl9LGEudWkuZGlhbG9nLm1heForPTEsZC51aURpYWxvZy5jc3MoInotaW5kZXgiLGEudWkuZGlhbG9nLm1heFopLGQuZWxlbWVudC5hdHRyKGYpLGQuX3RyaWdnZXIoImZvY3VzIixjKSxkKX0sb3BlbjpmdW5jdGlvbigpe2lmKHRoaXMuX2lzT3BlbilyZXR1cm47dmFyIGI9dGhpcyxjPWIub3B0aW9ucyxkPWIudWlEaWFsb2c7cmV0dXJuIGIub3ZlcmxheT1jLm1vZGFsP25ldyBhLnVpLmRpYWxvZy5vdmVybGF5KGIpOm51bGwsYi5fc2l6ZSgpLGIuX3Bvc2l0aW9uKGMucG9zaXRpb24pLGQuc2hvdyhjLnNob3cpLGIubW92ZVRvVG9wKCEwKSxjLm1vZGFsJiZkLmJpbmQoImtleWRvd24udWktZGlhbG9nIixmdW5jdGlvbihiKXtpZihiLmtleUNvZGUhPT1hLnVpLmtleUNvZGUuVEFCKXJldHVybjt2YXIgYz1hKCI6dGFiYmFibGUiLHRoaXMpLGQ9Yy5maWx0ZXIoIjpmaXJzdCIpLGU9Yy5maWx0ZXIoIjpsYXN0Iik7aWYoYi50YXJnZXQ9PT1lWzBdJiYhYi5zaGlmdEtleSlyZXR1cm4gZC5mb2N1cygxKSwhMTtpZihiLnRhcmdldD09PWRbMF0mJmIuc2hpZnRLZXkpcmV0dXJuIGUuZm9jdXMoMSksITF9KSxhKGIuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKS5nZXQoKS5jb25jYXQoZC5maW5kKCIudWktZGlhbG9nLWJ1dHRvbnBhbmUgOnRhYmJhYmxlIikuZ2V0KCkuY29uY2F0KGQuZ2V0KCkpKSkuZXEoMCkuZm9jdXMoKSxiLl9pc09wZW49ITAsYi5fdHJpZ2dlcigib3BlbiIpLGJ9LF9jcmVhdGVCdXR0b25zOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZD0hMSxlPWEoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25wYW5lIHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCIpLGY9YSgiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnNldCIpLmFwcGVuZFRvKGUpO2MudWlEaWFsb2cuZmluZCgiLnVpLWRpYWxvZy1idXR0b25wYW5lIikucmVtb3ZlKCksdHlwZW9mIGI9PSJvYmplY3QiJiZiIT09bnVsbCYmYS5lYWNoKGIsZnVuY3Rpb24oKXtyZXR1cm4hKGQ9ITApfSksZCYmKGEuZWFjaChiLGZ1bmN0aW9uKGIsZCl7ZD1hLmlzRnVuY3Rpb24oZCk/e2NsaWNrOmQsdGV4dDpifTpkO3ZhciBlPWEoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48L2J1dHRvbj4nKS5jbGljayhmdW5jdGlvbigpe2QuY2xpY2suYXBwbHkoYy5lbGVtZW50WzBdLGFyZ3VtZW50cyl9KS5hcHBlbmRUbyhmKTthLmVhY2goZCxmdW5jdGlvbihhLGIpe2lmKGE9PT0iY2xpY2siKXJldHVybjthIGluIGU/ZVthXShiKTplLmF0dHIoYSxiKX0pLGEuZm4uYnV0dG9uJiZlLmJ1dHRvbigpfSksZS5hcHBlbmRUbyhjLnVpRGlhbG9nKSl9LF9tYWtlRHJhZ2dhYmxlOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZihhKXtyZXR1cm57cG9zaXRpb246YS5wb3NpdGlvbixvZmZzZXQ6YS5vZmZzZXR9fXZhciBiPXRoaXMsYz1iLm9wdGlvbnMsZD1hKGRvY3VtZW50KSxlO2IudWlEaWFsb2cuZHJhZ2dhYmxlKHtjYW5jZWw6Ii51aS1kaWFsb2ctY29udGVudCwgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIsaGFuZGxlOiIudWktZGlhbG9nLXRpdGxlYmFyIixjb250YWlubWVudDoiZG9jdW1lbnQiLHN0YXJ0OmZ1bmN0aW9uKGQsZyl7ZT1jLmhlaWdodD09PSJhdXRvIj8iYXV0byI6YSh0aGlzKS5oZWlnaHQoKSxhKHRoaXMpLmhlaWdodChhKHRoaXMpLmhlaWdodCgpKS5hZGRDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIiksYi5fdHJpZ2dlcigiZHJhZ1N0YXJ0IixkLGYoZykpfSxkcmFnOmZ1bmN0aW9uKGEsYyl7Yi5fdHJpZ2dlcigiZHJhZyIsYSxmKGMpKX0sc3RvcDpmdW5jdGlvbihnLGgpe2MucG9zaXRpb249W2gucG9zaXRpb24ubGVmdC1kLnNjcm9sbExlZnQoKSxoLnBvc2l0aW9uLnRvcC1kLnNjcm9sbFRvcCgpXSxhKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctZHJhZ2dpbmciKS5oZWlnaHQoZSksYi5fdHJpZ2dlcigiZHJhZ1N0b3AiLGcsZihoKSksYS51aS5kaWFsb2cub3ZlcmxheS5yZXNpemUoKX19KX0sX21ha2VSZXNpemFibGU6ZnVuY3Rpb24oYyl7ZnVuY3Rpb24gaChhKXtyZXR1cm57b3JpZ2luYWxQb3NpdGlvbjphLm9yaWdpbmFsUG9zaXRpb24sb3JpZ2luYWxTaXplOmEub3JpZ2luYWxTaXplLHBvc2l0aW9uOmEucG9zaXRpb24sc2l6ZTphLnNpemV9fWM9Yz09PWI/dGhpcy5vcHRpb25zLnJlc2l6YWJsZTpjO3ZhciBkPXRoaXMsZT1kLm9wdGlvbnMsZj1kLnVpRGlhbG9nLmNzcygicG9zaXRpb24iKSxnPXR5cGVvZiBjPT0ic3RyaW5nIj9jOiJuLGUscyx3LHNlLHN3LG5lLG53IjtkLnVpRGlhbG9nLnJlc2l6YWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQiLGNvbnRhaW5tZW50OiJkb2N1bWVudCIsYWxzb1Jlc2l6ZTpkLmVsZW1lbnQsbWF4V2lkdGg6ZS5tYXhXaWR0aCxtYXhIZWlnaHQ6ZS5tYXhIZWlnaHQsbWluV2lkdGg6ZS5taW5XaWR0aCxtaW5IZWlnaHQ6ZC5fbWluSGVpZ2h0KCksaGFuZGxlczpnLHN0YXJ0OmZ1bmN0aW9uKGIsYyl7YSh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIiksZC5fdHJpZ2dlcigicmVzaXplU3RhcnQiLGIsaChjKSl9LHJlc2l6ZTpmdW5jdGlvbihhLGIpe2QuX3RyaWdnZXIoInJlc2l6ZSIsYSxoKGIpKX0sc3RvcDpmdW5jdGlvbihiLGMpe2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLWRpYWxvZy1yZXNpemluZyIpLGUuaGVpZ2h0PWEodGhpcykuaGVpZ2h0KCksZS53aWR0aD1hKHRoaXMpLndpZHRoKCksZC5fdHJpZ2dlcigicmVzaXplU3RvcCIsYixoKGMpKSxhLnVpLmRpYWxvZy5vdmVybGF5LnJlc2l6ZSgpfX0pLmNzcygicG9zaXRpb24iLGYpLmZpbmQoIi51aS1yZXNpemFibGUtc2UiKS5hZGRDbGFzcygidWktaWNvbiB1aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UiKX0sX21pbkhlaWdodDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucztyZXR1cm4gYS5oZWlnaHQ9PT0iYXV0byI/YS5taW5IZWlnaHQ6TWF0aC5taW4oYS5taW5IZWlnaHQsYS5oZWlnaHQpfSxfcG9zaXRpb246ZnVuY3Rpb24oYil7dmFyIGM9W10sZD1bMCwwXSxlO2lmKGIpe2lmKHR5cGVvZiBiPT0ic3RyaW5nInx8dHlwZW9mIGI9PSJvYmplY3QiJiYiMCJpbiBiKWM9Yi5zcGxpdD9iLnNwbGl0KCIgIik6W2JbMF0sYlsxXV0sYy5sZW5ndGg9PT0xJiYoY1sxXT1jWzBdKSxhLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24oYSxiKXsrY1thXT09PWNbYV0mJihkW2FdPWNbYV0sY1thXT1iKX0pLGI9e215OmMuam9pbigiICIpLGF0OmMuam9pbigiICIpLG9mZnNldDpkLmpvaW4oIiAiKX07Yj1hLmV4dGVuZCh7fSxhLnVpLmRpYWxvZy5wcm90b3R5cGUub3B0aW9ucy5wb3NpdGlvbixiKX1lbHNlIGI9YS51aS5kaWFsb2cucHJvdG90eXBlLm9wdGlvbnMucG9zaXRpb247ZT10aGlzLnVpRGlhbG9nLmlzKCI6dmlzaWJsZSIpLGV8fHRoaXMudWlEaWFsb2cuc2hvdygpLHRoaXMudWlEaWFsb2cuY3NzKHt0b3A6MCxsZWZ0OjB9KS5wb3NpdGlvbihhLmV4dGVuZCh7b2Y6d2luZG93fSxiKSksZXx8dGhpcy51aURpYWxvZy5oaWRlKCl9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMsZj17fSxnPSExO2EuZWFjaChiLGZ1bmN0aW9uKGEsYil7Yy5fc2V0T3B0aW9uKGEsYiksYSBpbiBkJiYoZz0hMCksYSBpbiBlJiYoZlthXT1iKX0pLGcmJnRoaXMuX3NpemUoKSx0aGlzLnVpRGlhbG9nLmlzKCI6ZGF0YShyZXNpemFibGUpIikmJnRoaXMudWlEaWFsb2cucmVzaXphYmxlKCJvcHRpb24iLGYpfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGIsZCl7dmFyIGU9dGhpcyxmPWUudWlEaWFsb2c7c3dpdGNoKGIpe2Nhc2UiYmVmb3JlY2xvc2UiOmI9ImJlZm9yZUNsb3NlIjticmVhaztjYXNlImJ1dHRvbnMiOmUuX2NyZWF0ZUJ1dHRvbnMoZCk7YnJlYWs7Y2FzZSJjbG9zZVRleHQiOmUudWlEaWFsb2dUaXRsZWJhckNsb3NlVGV4dC50ZXh0KCIiK2QpO2JyZWFrO2Nhc2UiZGlhbG9nQ2xhc3MiOmYucmVtb3ZlQ2xhc3MoZS5vcHRpb25zLmRpYWxvZ0NsYXNzKS5hZGRDbGFzcyhjK2QpO2JyZWFrO2Nhc2UiZGlzYWJsZWQiOmQ/Zi5hZGRDbGFzcygidWktZGlhbG9nLWRpc2FibGVkIik6Zi5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRpc2FibGVkIik7YnJlYWs7Y2FzZSJkcmFnZ2FibGUiOnZhciBnPWYuaXMoIjpkYXRhKGRyYWdnYWJsZSkiKTtnJiYhZCYmZi5kcmFnZ2FibGUoImRlc3Ryb3kiKSwhZyYmZCYmZS5fbWFrZURyYWdnYWJsZSgpO2JyZWFrO2Nhc2UicG9zaXRpb24iOmUuX3Bvc2l0aW9uKGQpO2JyZWFrO2Nhc2UicmVzaXphYmxlIjp2YXIgaD1mLmlzKCI6ZGF0YShyZXNpemFibGUpIik7aCYmIWQmJmYucmVzaXphYmxlKCJkZXN0cm95IiksaCYmdHlwZW9mIGQ9PSJzdHJpbmciJiZmLnJlc2l6YWJsZSgib3B0aW9uIiwiaGFuZGxlcyIsZCksIWgmJmQhPT0hMSYmZS5fbWFrZVJlc2l6YWJsZShkKTticmVhaztjYXNlInRpdGxlIjphKCIudWktZGlhbG9nLXRpdGxlIixlLnVpRGlhbG9nVGl0bGViYXIpLmh0bWwoIiIrKGR8fCImIzE2MDsiKSl9YS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkoZSxhcmd1bWVudHMpfSxfc2l6ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucyxjLGQsZT10aGlzLnVpRGlhbG9nLmlzKCI6dmlzaWJsZSIpO3RoaXMuZWxlbWVudC5zaG93KCkuY3NzKHt3aWR0aDoiYXV0byIsbWluSGVpZ2h0OjAsaGVpZ2h0OjB9KSxiLm1pbldpZHRoPmIud2lkdGgmJihiLndpZHRoPWIubWluV2lkdGgpLGM9dGhpcy51aURpYWxvZy5jc3Moe2hlaWdodDoiYXV0byIsd2lkdGg6Yi53aWR0aH0pLmhlaWdodCgpLGQ9TWF0aC5tYXgoMCxiLm1pbkhlaWdodC1jKTtpZihiLmhlaWdodD09PSJhdXRvIilpZihhLnN1cHBvcnQubWluSGVpZ2h0KXRoaXMuZWxlbWVudC5jc3Moe21pbkhlaWdodDpkLGhlaWdodDoiYXV0byJ9KTtlbHNle3RoaXMudWlEaWFsb2cuc2hvdygpO3ZhciBmPXRoaXMuZWxlbWVudC5jc3MoImhlaWdodCIsImF1dG8iKS5oZWlnaHQoKTtlfHx0aGlzLnVpRGlhbG9nLmhpZGUoKSx0aGlzLmVsZW1lbnQuaGVpZ2h0KE1hdGgubWF4KGYsZCkpfWVsc2UgdGhpcy5lbGVtZW50LmhlaWdodChNYXRoLm1heChiLmhlaWdodC1jLDApKTt0aGlzLnVpRGlhbG9nLmlzKCI6ZGF0YShyZXNpemFibGUpIikmJnRoaXMudWlEaWFsb2cucmVzaXphYmxlKCJvcHRpb24iLCJtaW5IZWlnaHQiLHRoaXMuX21pbkhlaWdodCgpKX19KSxhLmV4dGVuZChhLnVpLmRpYWxvZyx7dmVyc2lvbjoiMS44LjIzIix1dWlkOjAsbWF4WjowLGdldFRpdGxlSWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5hdHRyKCJpZCIpO3JldHVybiBifHwodGhpcy51dWlkKz0xLGI9dGhpcy51dWlkKSwidWktZGlhbG9nLXRpdGxlLSIrYn0sb3ZlcmxheTpmdW5jdGlvbihiKXt0aGlzLiRlbD1hLnVpLmRpYWxvZy5vdmVybGF5LmNyZWF0ZShiKX19KSxhLmV4dGVuZChhLnVpLmRpYWxvZy5vdmVybGF5LHtpbnN0YW5jZXM6W10sb2xkSW5zdGFuY2VzOltdLG1heFo6MCxldmVudHM6YS5tYXAoImZvY3VzLG1vdXNlZG93bixtb3VzZXVwLGtleWRvd24sa2V5cHJlc3MsY2xpY2siLnNwbGl0KCIsIiksZnVuY3Rpb24oYSl7cmV0dXJuIGErIi5kaWFsb2ctb3ZlcmxheSJ9KS5qb2luKCIgIiksY3JlYXRlOmZ1bmN0aW9uKGIpe3RoaXMuaW5zdGFuY2VzLmxlbmd0aD09PTAmJihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS51aS5kaWFsb2cub3ZlcmxheS5pbnN0YW5jZXMubGVuZ3RoJiZhKGRvY3VtZW50KS5iaW5kKGEudWkuZGlhbG9nLm92ZXJsYXkuZXZlbnRzLGZ1bmN0aW9uKGIpe2lmKGEoYi50YXJnZXQpLnpJbmRleCgpPGEudWkuZGlhbG9nLm92ZXJsYXkubWF4WilyZXR1cm4hMX0pfSwxKSxhKGRvY3VtZW50KS5iaW5kKCJrZXlkb3duLmRpYWxvZy1vdmVybGF5IixmdW5jdGlvbihjKXtiLm9wdGlvbnMuY2xvc2VPbkVzY2FwZSYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMua2V5Q29kZSYmYy5rZXlDb2RlPT09YS51aS5rZXlDb2RlLkVTQ0FQRSYmKGIuY2xvc2UoYyksYy5wcmV2ZW50RGVmYXVsdCgpKX0pLGEod2luZG93KS5iaW5kKCJyZXNpemUuZGlhbG9nLW92ZXJsYXkiLGEudWkuZGlhbG9nLm92ZXJsYXkucmVzaXplKSk7dmFyIGM9KHRoaXMub2xkSW5zdGFuY2VzLnBvcCgpfHxhKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSIpKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5jc3Moe3dpZHRoOnRoaXMud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWlnaHQoKX0pO3JldHVybiBhLmZuLmJnaWZyYW1lJiZjLmJnaWZyYW1lKCksdGhpcy5pbnN0YW5jZXMucHVzaChjKSxjfSxkZXN0cm95OmZ1bmN0aW9uKGIpe3ZhciBjPWEuaW5BcnJheShiLHRoaXMuaW5zdGFuY2VzKTtjIT0tMSYmdGhpcy5vbGRJbnN0YW5jZXMucHVzaCh0aGlzLmluc3RhbmNlcy5zcGxpY2UoYywxKVswXSksdGhpcy5pbnN0YW5jZXMubGVuZ3RoPT09MCYmYShbZG9jdW1lbnQsd2luZG93XSkudW5iaW5kKCIuZGlhbG9nLW92ZXJsYXkiKSxiLnJlbW92ZSgpO3ZhciBkPTA7YS5lYWNoKHRoaXMuaW5zdGFuY2VzLGZ1bmN0aW9uKCl7ZD1NYXRoLm1heChkLHRoaXMuY3NzKCJ6LWluZGV4IikpfSksdGhpcy5tYXhaPWR9LGhlaWdodDpmdW5jdGlvbigpe3ZhciBiLGM7cmV0dXJuIGEuYnJvd3Nlci5tc2llJiZhLmJyb3dzZXIudmVyc2lvbjw3PyhiPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpLGM9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCksYjxjP2Eod2luZG93KS5oZWlnaHQoKSsicHgiOmIrInB4Iik6YShkb2N1bWVudCkuaGVpZ2h0KCkrInB4In0sd2lkdGg6ZnVuY3Rpb24oKXt2YXIgYixjO3JldHVybiBhLmJyb3dzZXIubXNpZT8oYj1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aCksYz1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGgsZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCksYjxjP2Eod2luZG93KS53aWR0aCgpKyJweCI6YisicHgiKTphKGRvY3VtZW50KS53aWR0aCgpKyJweCJ9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciBiPWEoW10pO2EuZWFjaChhLnVpLmRpYWxvZy5vdmVybGF5Lmluc3RhbmNlcyxmdW5jdGlvbigpe2I9Yi5hZGQodGhpcyl9KSxiLmNzcyh7d2lkdGg6MCxoZWlnaHQ6MH0pLmNzcyh7d2lkdGg6YS51aS5kaWFsb2cub3ZlcmxheS53aWR0aCgpLGhlaWdodDphLnVpLmRpYWxvZy5vdmVybGF5LmhlaWdodCgpfSl9fSksYS5leHRlbmQoYS51aS5kaWFsb2cub3ZlcmxheS5wcm90b3R5cGUse2Rlc3Ryb3k6ZnVuY3Rpb24oKXthLnVpLmRpYWxvZy5vdmVybGF5LmRlc3Ryb3kodGhpcy4kZWwpfX0pfSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkudWkuc2xpZGVyLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe3ZhciBjPTU7YS53aWRnZXQoInVpLnNsaWRlciIsYS51aS5tb3VzZSx7d2lkZ2V0RXZlbnRQcmVmaXg6InNsaWRlIixvcHRpb25zOnthbmltYXRlOiExLGRpc3RhbmNlOjAsbWF4OjEwMCxtaW46MCxvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCIscmFuZ2U6ITEsc3RlcDoxLHZhbHVlOjAsdmFsdWVzOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGQ9dGhpcy5vcHRpb25zLGU9dGhpcy5lbGVtZW50LmZpbmQoIi51aS1zbGlkZXItaGFuZGxlIikuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIpLGY9IjxhIGNsYXNzPSd1aS1zbGlkZXItaGFuZGxlIHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCcgaHJlZj0nIyc+PC9hPiIsZz1kLnZhbHVlcyYmZC52YWx1ZXMubGVuZ3RofHwxLGg9W107dGhpcy5fa2V5U2xpZGluZz0hMSx0aGlzLl9tb3VzZVNsaWRpbmc9ITEsdGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9oYW5kbGVJbmRleD1udWxsLHRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5fbW91c2VJbml0KCksdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zbGlkZXIgdWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbisiIHVpLXdpZGdldCIrIiB1aS13aWRnZXQtY29udGVudCIrIiB1aS1jb3JuZXItYWxsIisoZC5kaXNhYmxlZD8iIHVpLXNsaWRlci1kaXNhYmxlZCB1aS1kaXNhYmxlZCI6IiIpKSx0aGlzLnJhbmdlPWEoW10pLGQucmFuZ2UmJihkLnJhbmdlPT09ITAmJihkLnZhbHVlc3x8KGQudmFsdWVzPVt0aGlzLl92YWx1ZU1pbigpLHRoaXMuX3ZhbHVlTWluKCldKSxkLnZhbHVlcy5sZW5ndGgmJmQudmFsdWVzLmxlbmd0aCE9PTImJihkLnZhbHVlcz1bZC52YWx1ZXNbMF0sZC52YWx1ZXNbMF1dKSksdGhpcy5yYW5nZT1hKCI8ZGl2PjwvZGl2PiIpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCkuYWRkQ2xhc3MoInVpLXNsaWRlci1yYW5nZSB1aS13aWRnZXQtaGVhZGVyIisoZC5yYW5nZT09PSJtaW4ifHxkLnJhbmdlPT09Im1heCI/IiB1aS1zbGlkZXItcmFuZ2UtIitkLnJhbmdlOiIiKSkpO2Zvcih2YXIgaT1lLmxlbmd0aDtpPGc7aSs9MSloLnB1c2goZik7dGhpcy5oYW5kbGVzPWUuYWRkKGEoaC5qb2luKCIiKSkuYXBwZW5kVG8oYi5lbGVtZW50KSksdGhpcy5oYW5kbGU9dGhpcy5oYW5kbGVzLmVxKDApLHRoaXMuaGFuZGxlcy5hZGQodGhpcy5yYW5nZSkuZmlsdGVyKCJhIikuY2xpY2soZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpfSkuaG92ZXIoZnVuY3Rpb24oKXtkLmRpc2FibGVkfHxhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfSxmdW5jdGlvbigpe2EodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9KS5mb2N1cyhmdW5jdGlvbigpe2QuZGlzYWJsZWQ/YSh0aGlzKS5ibHVyKCk6KGEoIi51aS1zbGlkZXIgLnVpLXN0YXRlLWZvY3VzIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIiksYSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKSl9KS5ibHVyKGZ1bmN0aW9uKCl7YSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKX0pLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGIpe2EodGhpcykuZGF0YSgiaW5kZXgudWktc2xpZGVyLWhhbmRsZSIsYil9KSx0aGlzLmhhbmRsZXMua2V5ZG93bihmdW5jdGlvbihkKXt2YXIgZT1hKHRoaXMpLmRhdGEoImluZGV4LnVpLXNsaWRlci1oYW5kbGUiKSxmLGcsaCxpO2lmKGIub3B0aW9ucy5kaXNhYmxlZClyZXR1cm47c3dpdGNoKGQua2V5Q29kZSl7Y2FzZSBhLnVpLmtleUNvZGUuSE9NRTpjYXNlIGEudWkua2V5Q29kZS5FTkQ6Y2FzZSBhLnVpLmtleUNvZGUuUEFHRV9VUDpjYXNlIGEudWkua2V5Q29kZS5QQUdFX0RPV046Y2FzZSBhLnVpLmtleUNvZGUuVVA6Y2FzZSBhLnVpLmtleUNvZGUuUklHSFQ6Y2FzZSBhLnVpLmtleUNvZGUuRE9XTjpjYXNlIGEudWkua2V5Q29kZS5MRUZUOmQucHJldmVudERlZmF1bHQoKTtpZighYi5fa2V5U2xpZGluZyl7Yi5fa2V5U2xpZGluZz0hMCxhKHRoaXMpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxmPWIuX3N0YXJ0KGQsZSk7aWYoZj09PSExKXJldHVybn19aT1iLm9wdGlvbnMuc3RlcCxiLm9wdGlvbnMudmFsdWVzJiZiLm9wdGlvbnMudmFsdWVzLmxlbmd0aD9nPWg9Yi52YWx1ZXMoZSk6Zz1oPWIudmFsdWUoKTtzd2l0Y2goZC5rZXlDb2RlKXtjYXNlIGEudWkua2V5Q29kZS5IT01FOmg9Yi5fdmFsdWVNaW4oKTticmVhaztjYXNlIGEudWkua2V5Q29kZS5FTkQ6aD1iLl92YWx1ZU1heCgpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLlBBR0VfVVA6aD1iLl90cmltQWxpZ25WYWx1ZShnKyhiLl92YWx1ZU1heCgpLWIuX3ZhbHVlTWluKCkpL2MpO2JyZWFrO2Nhc2UgYS51aS5rZXlDb2RlLlBBR0VfRE9XTjpoPWIuX3RyaW1BbGlnblZhbHVlKGctKGIuX3ZhbHVlTWF4KCktYi5fdmFsdWVNaW4oKSkvYyk7YnJlYWs7Y2FzZSBhLnVpLmtleUNvZGUuVVA6Y2FzZSBhLnVpLmtleUNvZGUuUklHSFQ6aWYoZz09PWIuX3ZhbHVlTWF4KCkpcmV0dXJuO2g9Yi5fdHJpbUFsaWduVmFsdWUoZytpKTticmVhaztjYXNlIGEudWkua2V5Q29kZS5ET1dOOmNhc2UgYS51aS5rZXlDb2RlLkxFRlQ6aWYoZz09PWIuX3ZhbHVlTWluKCkpcmV0dXJuO2g9Yi5fdHJpbUFsaWduVmFsdWUoZy1pKX1iLl9zbGlkZShkLGUsaCl9KS5rZXl1cChmdW5jdGlvbihjKXt2YXIgZD1hKHRoaXMpLmRhdGEoImluZGV4LnVpLXNsaWRlci1oYW5kbGUiKTtiLl9rZXlTbGlkaW5nJiYoYi5fa2V5U2xpZGluZz0hMSxiLl9zdG9wKGMsZCksYi5fY2hhbmdlKGMsZCksYSh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikpfSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fYW5pbWF0ZU9mZj0hMX0sZGVzdHJveTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhhbmRsZXMucmVtb3ZlKCksdGhpcy5yYW5nZS5yZW1vdmUoKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwgdWktc2xpZGVyLWRpc2FibGVkIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikucmVtb3ZlRGF0YSgic2xpZGVyIikudW5iaW5kKCIuc2xpZGVyIiksdGhpcy5fbW91c2VEZXN0cm95KCksdGhpc30sX21vdXNlQ2FwdHVyZTpmdW5jdGlvbihiKXt2YXIgYz10aGlzLm9wdGlvbnMsZCxlLGYsZyxoLGksaixrLGw7cmV0dXJuIGMuZGlzYWJsZWQ/ITE6KHRoaXMuZWxlbWVudFNpemU9e3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpfSx0aGlzLmVsZW1lbnRPZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLGQ9e3g6Yi5wYWdlWCx5OmIucGFnZVl9LGU9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGQpLGY9dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKzEsaD10aGlzLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPU1hdGguYWJzKGUtaC52YWx1ZXMoYikpO2Y+YyYmKGY9YyxnPWEodGhpcyksaT1iKX0pLGMucmFuZ2U9PT0hMCYmdGhpcy52YWx1ZXMoMSk9PT1jLm1pbiYmKGkrPTEsZz1hKHRoaXMuaGFuZGxlc1tpXSkpLGo9dGhpcy5fc3RhcnQoYixpKSxqPT09ITE/ITE6KHRoaXMuX21vdXNlU2xpZGluZz0hMCxoLl9oYW5kbGVJbmRleD1pLGcuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmZvY3VzKCksaz1nLm9mZnNldCgpLGw9IWEoYi50YXJnZXQpLnBhcmVudHMoKS5hbmRTZWxmKCkuaXMoIi51aS1zbGlkZXItaGFuZGxlIiksdGhpcy5fY2xpY2tPZmZzZXQ9bD97bGVmdDowLHRvcDowfTp7bGVmdDpiLnBhZ2VYLWsubGVmdC1nLndpZHRoKCkvMix0b3A6Yi5wYWdlWS1rLnRvcC1nLmhlaWdodCgpLzItKHBhcnNlSW50KGcuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGcuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLDEwKXx8MCkrKHBhcnNlSW50KGcuY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDApfSx0aGlzLmhhbmRsZXMuaGFzQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil8fHRoaXMuX3NsaWRlKGIsaSxlKSx0aGlzLl9hbmltYXRlT2ZmPSEwLCEwKSl9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKGEpe3JldHVybiEwfSxfbW91c2VEcmFnOmZ1bmN0aW9uKGEpe3ZhciBiPXt4OmEucGFnZVgseTphLnBhZ2VZfSxjPXRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZShiKTtyZXR1cm4gdGhpcy5fc2xpZGUoYSx0aGlzLl9oYW5kbGVJbmRleCxjKSwhMX0sX21vdXNlU3RvcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oYW5kbGVzLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLl9tb3VzZVNsaWRpbmc9ITEsdGhpcy5fc3RvcChhLHRoaXMuX2hhbmRsZUluZGV4KSx0aGlzLl9jaGFuZ2UoYSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5faGFuZGxlSW5kZXg9bnVsbCx0aGlzLl9jbGlja09mZnNldD1udWxsLHRoaXMuX2FuaW1hdGVPZmY9ITEsITF9LF9kZXRlY3RPcmllbnRhdGlvbjpmdW5jdGlvbigpe3RoaXMub3JpZW50YXRpb249dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIj8idmVydGljYWwiOiJob3Jpem9udGFsIn0sX25vcm1WYWx1ZUZyb21Nb3VzZTpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmO3JldHVybiB0aGlzLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiPyhiPXRoaXMuZWxlbWVudFNpemUud2lkdGgsYz1hLngtdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LmxlZnQ6MCkpOihiPXRoaXMuZWxlbWVudFNpemUuaGVpZ2h0LGM9YS55LXRoaXMuZWxlbWVudE9mZnNldC50b3AtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LnRvcDowKSksZD1jL2IsZD4xJiYoZD0xKSxkPDAmJihkPTApLHRoaXMub3JpZW50YXRpb249PT0idmVydGljYWwiJiYoZD0xLWQpLGU9dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpLGY9dGhpcy5fdmFsdWVNaW4oKStkKmUsdGhpcy5fdHJpbUFsaWduVmFsdWUoZil9LF9zdGFydDpmdW5jdGlvbihhLGIpe3ZhciBjPXtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOnRoaXMudmFsdWUoKX07cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoYy52YWx1ZT10aGlzLnZhbHVlcyhiKSxjLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsYSxjKX0sX3NsaWRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/KGQ9dGhpcy52YWx1ZXMoYj8wOjEpLHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoPT09MiYmdGhpcy5vcHRpb25zLnJhbmdlPT09ITAmJihiPT09MCYmYz5kfHxiPT09MSYmYzxkKSYmKGM9ZCksYyE9PXRoaXMudmFsdWVzKGIpJiYoZT10aGlzLnZhbHVlcygpLGVbYl09YyxmPXRoaXMuX3RyaWdnZXIoInNsaWRlIixhLHtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOmMsdmFsdWVzOmV9KSxkPXRoaXMudmFsdWVzKGI/MDoxKSxmIT09ITEmJnRoaXMudmFsdWVzKGIsYywhMCkpKTpjIT09dGhpcy52YWx1ZSgpJiYoZj10aGlzLl90cmlnZ2VyKCJzbGlkZSIsYSx7aGFuZGxlOnRoaXMuaGFuZGxlc1tiXSx2YWx1ZTpjfSksZiE9PSExJiZ0aGlzLnZhbHVlKGMpKX0sX3N0b3A6ZnVuY3Rpb24oYSxiKXt2YXIgYz17aGFuZGxlOnRoaXMuaGFuZGxlc1tiXSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoYy52YWx1ZT10aGlzLnZhbHVlcyhiKSxjLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdG9wIixhLGMpfSxfY2hhbmdlOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuX2tleVNsaWRpbmcmJiF0aGlzLl9tb3VzZVNsaWRpbmcpe3ZhciBjPXtoYW5kbGU6dGhpcy5oYW5kbGVzW2JdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihjLnZhbHVlPXRoaXMudmFsdWVzKGIpLGMudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsYSxjKX19LHZhbHVlOmZ1bmN0aW9uKGEpe2lmKGFyZ3VtZW50cy5sZW5ndGgpe3RoaXMub3B0aW9ucy52YWx1ZT10aGlzLl90cmltQWxpZ25WYWx1ZShhKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKTtyZXR1cm59cmV0dXJuIHRoaXMuX3ZhbHVlKCl9LHZhbHVlczpmdW5jdGlvbihiLGMpe3ZhciBkLGUsZjtpZihhcmd1bWVudHMubGVuZ3RoPjEpe3RoaXMub3B0aW9ucy52YWx1ZXNbYl09dGhpcy5fdHJpbUFsaWduVmFsdWUoYyksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsYik7cmV0dXJufWlmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl92YWx1ZXMoKTtpZighYS5pc0FycmF5KGFyZ3VtZW50c1swXSkpcmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoP3RoaXMuX3ZhbHVlcyhiKTp0aGlzLnZhbHVlKCk7ZD10aGlzLm9wdGlvbnMudmFsdWVzLGU9YXJndW1lbnRzWzBdO2ZvcihmPTA7ZjxkLmxlbmd0aDtmKz0xKWRbZl09dGhpcy5fdHJpbUFsaWduVmFsdWUoZVtmXSksdGhpcy5fY2hhbmdlKG51bGwsZik7dGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXt2YXIgZCxlPTA7YS5pc0FycmF5KHRoaXMub3B0aW9ucy52YWx1ZXMpJiYoZT10aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCksYS5XaWRnZXQucHJvdG90eXBlLl9zZXRPcHRpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpO3N3aXRjaChiKXtjYXNlImRpc2FibGVkIjpjPyh0aGlzLmhhbmRsZXMuZmlsdGVyKCIudWktc3RhdGUtZm9jdXMiKS5ibHVyKCksdGhpcy5oYW5kbGVzLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLHRoaXMuaGFuZGxlcy5wcm9wQXR0cigiZGlzYWJsZWQiLCEwKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRpc2FibGVkIikpOih0aGlzLmhhbmRsZXMucHJvcEF0dHIoImRpc2FibGVkIiwhMSksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kaXNhYmxlZCIpKTticmVhaztjYXNlIm9yaWVudGF0aW9uIjp0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIikuYWRkQ2xhc3MoInVpLXNsaWRlci0iK3RoaXMub3JpZW50YXRpb24pLHRoaXMuX3JlZnJlc2hWYWx1ZSgpO2JyZWFrO2Nhc2UidmFsdWUiOnRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5fY2hhbmdlKG51bGwsMCksdGhpcy5fYW5pbWF0ZU9mZj0hMTticmVhaztjYXNlInZhbHVlcyI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKTtmb3IoZD0wO2Q8ZTtkKz0xKXRoaXMuX2NoYW5nZShudWxsLGQpO3RoaXMuX2FuaW1hdGVPZmY9ITF9fSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMudmFsdWU7cmV0dXJuIGE9dGhpcy5fdHJpbUFsaWduVmFsdWUoYSksYX0sX3ZhbHVlczpmdW5jdGlvbihhKXt2YXIgYixjLGQ7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYj10aGlzLm9wdGlvbnMudmFsdWVzW2FdLGI9dGhpcy5fdHJpbUFsaWduVmFsdWUoYiksYjtjPXRoaXMub3B0aW9ucy52YWx1ZXMuc2xpY2UoKTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCs9MSljW2RdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGNbZF0pO3JldHVybiBjfSxfdHJpbUFsaWduVmFsdWU6ZnVuY3Rpb24oYSl7aWYoYTw9dGhpcy5fdmFsdWVNaW4oKSlyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTtpZihhPj10aGlzLl92YWx1ZU1heCgpKXJldHVybiB0aGlzLl92YWx1ZU1heCgpO3ZhciBiPXRoaXMub3B0aW9ucy5zdGVwPjA/dGhpcy5vcHRpb25zLnN0ZXA6MSxjPShhLXRoaXMuX3ZhbHVlTWluKCkpJWIsZD1hLWM7cmV0dXJuIE1hdGguYWJzKGMpKjI+PWImJihkKz1jPjA/YjotYikscGFyc2VGbG9hdChkLnRvRml4ZWQoNSkpfSxfdmFsdWVNaW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLm1pbn0sX3ZhbHVlTWF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5tYXh9LF9yZWZyZXNoVmFsdWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wdGlvbnMucmFuZ2UsYz10aGlzLm9wdGlvbnMsZD10aGlzLGU9dGhpcy5fYW5pbWF0ZU9mZj8hMTpjLmFuaW1hdGUsZixnPXt9LGgsaSxqLGs7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24oYixpKXtmPShkLnZhbHVlcyhiKS1kLl92YWx1ZU1pbigpKS8oZC5fdmFsdWVNYXgoKS1kLl92YWx1ZU1pbigpKSoxMDAsZ1tkLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiPyJsZWZ0IjoiYm90dG9tIl09ZisiJSIsYSh0aGlzKS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKGcsYy5hbmltYXRlKSxkLm9wdGlvbnMucmFuZ2U9PT0hMCYmKGQub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/KGI9PT0wJiZkLnJhbmdlLnN0b3AoMSwxKVtlPyJhbmltYXRlIjoiY3NzIl0oe2xlZnQ6ZisiJSJ9LGMuYW5pbWF0ZSksYj09PTEmJmQucmFuZ2VbZT8iYW5pbWF0ZSI6ImNzcyJdKHt3aWR0aDpmLWgrIiUifSx7cXVldWU6ITEsZHVyYXRpb246Yy5hbmltYXRlfSkpOihiPT09MCYmZC5yYW5nZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKHtib3R0b206ZisiJSJ9LGMuYW5pbWF0ZSksYj09PTEmJmQucmFuZ2VbZT8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6Zi1oKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOmMuYW5pbWF0ZX0pKSksaD1mfSk6KGk9dGhpcy52YWx1ZSgpLGo9dGhpcy5fdmFsdWVNaW4oKSxrPXRoaXMuX3ZhbHVlTWF4KCksZj1rIT09aj8oaS1qKS8oay1qKSoxMDA6MCxnW2Qub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI/ImxlZnQiOiJib3R0b20iXT1mKyIlIix0aGlzLmhhbmRsZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKGcsYy5hbmltYXRlKSxiPT09Im1pbiImJnRoaXMub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCImJnRoaXMucmFuZ2Uuc3RvcCgxLDEpW2U/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6ZisiJSJ9LGMuYW5pbWF0ZSksYj09PSJtYXgiJiZ0aGlzLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiJiZ0aGlzLnJhbmdlW2U/ImFuaW1hdGUiOiJjc3MiXSh7d2lkdGg6MTAwLWYrIiUifSx7cXVldWU6ITEsZHVyYXRpb246Yy5hbmltYXRlfSksYj09PSJtaW4iJiZ0aGlzLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIiYmdGhpcy5yYW5nZS5zdG9wKDEsMSlbZT8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6ZisiJSJ9LGMuYW5pbWF0ZSksYj09PSJtYXgiJiZ0aGlzLm9yaWVudGF0aW9uPT09InZlcnRpY2FsIiYmdGhpcy5yYW5nZVtlPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDoxMDAtZisiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpjLmFuaW1hdGV9KSl9fSksYS5leHRlbmQoYS51aS5zbGlkZXIse3ZlcnNpb246IjEuOC4yMyJ9KX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LnVpLnRhYnMuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZSgpe3JldHVybisrY31mdW5jdGlvbiBmKCl7cmV0dXJuKytkfXZhciBjPTAsZD0wO2Eud2lkZ2V0KCJ1aS50YWJzIix7b3B0aW9uczp7YWRkOm51bGwsYWpheE9wdGlvbnM6bnVsbCxjYWNoZTohMSxjb29raWU6bnVsbCxjb2xsYXBzaWJsZTohMSxkaXNhYmxlOm51bGwsZGlzYWJsZWQ6W10sZW5hYmxlOm51bGwsZXZlbnQ6ImNsaWNrIixmeDpudWxsLGlkUHJlZml4OiJ1aS10YWJzLSIsbG9hZDpudWxsLHBhbmVsVGVtcGxhdGU6IjxkaXY+PC9kaXY+IixyZW1vdmU6bnVsbCxzZWxlY3Q6bnVsbCxzaG93Om51bGwsc3Bpbm5lcjoiPGVtPkxvYWRpbmcmIzgyMzA7PC9lbT4iLHRhYlRlbXBsYXRlOiI8bGk+PGEgaHJlZj0nI3tocmVmfSc+PHNwYW4+I3tsYWJlbH08L3NwYW4+PC9hPjwvbGk+In0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX3RhYmlmeSghMCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYSxiKXtpZihhPT0ic2VsZWN0ZWQiKXtpZih0aGlzLm9wdGlvbnMuY29sbGFwc2libGUmJmI9PXRoaXMub3B0aW9ucy5zZWxlY3RlZClyZXR1cm47dGhpcy5zZWxlY3QoYil9ZWxzZSB0aGlzLm9wdGlvbnNbYV09Yix0aGlzLl90YWJpZnkoKX0sX3RhYklkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRpdGxlJiZhLnRpdGxlLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKC9bXlx3XHUwMGMwLVx1RkZGRi1dL2csIiIpfHx0aGlzLm9wdGlvbnMuaWRQcmVmaXgrZSgpfSxfc2FuaXRpemVTZWxlY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC86L2csIlxcOiIpfSxfY29va2llOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb29raWV8fCh0aGlzLmNvb2tpZT10aGlzLm9wdGlvbnMuY29va2llLm5hbWV8fCJ1aS10YWJzLSIrZigpKTtyZXR1cm4gYS5jb29raWUuYXBwbHkobnVsbCxbYl0uY29uY2F0KGEubWFrZUFycmF5KGFyZ3VtZW50cykpKX0sX3VpOmZ1bmN0aW9uKGEsYil7cmV0dXJue3RhYjphLHBhbmVsOmIsaW5kZXg6dGhpcy5hbmNob3JzLmluZGV4KGEpfX0sX2NsZWFudXA6ZnVuY3Rpb24oKXt0aGlzLmxpcy5maWx0ZXIoIi51aS1zdGF0ZS1wcm9jZXNzaW5nIikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLXByb2Nlc3NpbmciKS5maW5kKCJzcGFuOmRhdGEobGFiZWwudGFicykiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKTtiLmh0bWwoYi5kYXRhKCJsYWJlbC50YWJzIikpLnJlbW92ZURhdGEoImxhYmVsLnRhYnMiKX0pfSxfdGFiaWZ5OmZ1bmN0aW9uKGMpe2Z1bmN0aW9uIG0oYixjKXtiLmNzcygiZGlzcGxheSIsIiIpLCFhLnN1cHBvcnQub3BhY2l0eSYmYy5vcGFjaXR5JiZiWzBdLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIil9dmFyIGQ9dGhpcyxlPXRoaXMub3B0aW9ucyxmPS9eIy4rLzt0aGlzLmxpc3Q9dGhpcy5lbGVtZW50LmZpbmQoIm9sLHVsIikuZXEoMCksdGhpcy5saXM9YSgiID4gbGk6aGFzKGFbaHJlZl0pIix0aGlzLmxpc3QpLHRoaXMuYW5jaG9ycz10aGlzLmxpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gYSgiYSIsdGhpcylbMF19KSx0aGlzLnBhbmVscz1hKFtdKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihiLGMpe3ZhciBnPWEoYykuYXR0cigiaHJlZiIpLGg9Zy5zcGxpdCgiIyIpWzBdLGk7aCYmKGg9PT1sb2NhdGlvbi50b1N0cmluZygpLnNwbGl0KCIjIilbMF18fChpPWEoImJhc2UiKVswXSkmJmg9PT1pLmhyZWYpJiYoZz1jLmhhc2gsYy5ocmVmPWcpO2lmKGYudGVzdChnKSlkLnBhbmVscz1kLnBhbmVscy5hZGQoZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihnKSkpO2Vsc2UgaWYoZyYmZyE9PSIjIil7YS5kYXRhKGMsImhyZWYudGFicyIsZyksYS5kYXRhKGMsImxvYWQudGFicyIsZy5yZXBsYWNlKC8jLiokLywiIikpO3ZhciBqPWQuX3RhYklkKGMpO2MuaHJlZj0iIyIrajt2YXIgaz1kLmVsZW1lbnQuZmluZCgiIyIraik7ay5sZW5ndGh8fChrPWEoZS5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaikuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmluc2VydEFmdGVyKGQucGFuZWxzW2ItMV18fGQubGlzdCksay5kYXRhKCJkZXN0cm95LnRhYnMiLCEwKSksZC5wYW5lbHM9ZC5wYW5lbHMuYWRkKGspfWVsc2UgZS5kaXNhYmxlZC5wdXNoKGIpfSksYz8odGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5saXN0LmFkZENsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLHRoaXMubGlzLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci10b3AiKSx0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIiksZS5zZWxlY3RlZD09PWI/KGxvY2F0aW9uLmhhc2gmJnRoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGEsYil7aWYoYi5oYXNoPT1sb2NhdGlvbi5oYXNoKXJldHVybiBlLnNlbGVjdGVkPWEsITF9KSx0eXBlb2YgZS5zZWxlY3RlZCE9Im51bWJlciImJmUuY29va2llJiYoZS5zZWxlY3RlZD1wYXJzZUludChkLl9jb29raWUoKSwxMCkpLHR5cGVvZiBlLnNlbGVjdGVkIT0ibnVtYmVyIiYmdGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpLmxlbmd0aCYmKGUuc2VsZWN0ZWQ9dGhpcy5saXMuaW5kZXgodGhpcy5saXMuZmlsdGVyKCIudWktdGFicy1zZWxlY3RlZCIpKSksZS5zZWxlY3RlZD1lLnNlbGVjdGVkfHwodGhpcy5saXMubGVuZ3RoPzA6LTEpKTplLnNlbGVjdGVkPT09bnVsbCYmKGUuc2VsZWN0ZWQ9LTEpLGUuc2VsZWN0ZWQ9ZS5zZWxlY3RlZD49MCYmdGhpcy5hbmNob3JzW2Uuc2VsZWN0ZWRdfHxlLnNlbGVjdGVkPDA/ZS5zZWxlY3RlZDowLGUuZGlzYWJsZWQ9YS51bmlxdWUoZS5kaXNhYmxlZC5jb25jYXQoYS5tYXAodGhpcy5saXMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihhLGIpe3JldHVybiBkLmxpcy5pbmRleChhKX0pKSkuc29ydCgpLGEuaW5BcnJheShlLnNlbGVjdGVkLGUuZGlzYWJsZWQpIT0tMSYmZS5kaXNhYmxlZC5zcGxpY2UoYS5pbkFycmF5KGUuc2VsZWN0ZWQsZS5kaXNhYmxlZCksMSksdGhpcy5wYW5lbHMuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGUuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9ycy5sZW5ndGgmJihkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSkucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMubGlzLmVxKGUuc2VsZWN0ZWQpLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtkLl90cmlnZ2VyKCJzaG93IixudWxsLGQuX3VpKGQuYW5jaG9yc1tlLnNlbGVjdGVkXSxkLmVsZW1lbnQuZmluZChkLl9zYW5pdGl6ZVNlbGVjdG9yKGQuYW5jaG9yc1tlLnNlbGVjdGVkXS5oYXNoKSlbMF0pKX0pLHRoaXMubG9hZChlLnNlbGVjdGVkKSksYSh3aW5kb3cpLmJpbmQoInVubG9hZCIsZnVuY3Rpb24oKXtkLmxpcy5hZGQoZC5hbmNob3JzKS51bmJpbmQoIi50YWJzIiksZC5saXM9ZC5hbmNob3JzPWQucGFuZWxzPW51bGx9KSk6ZS5zZWxlY3RlZD10aGlzLmxpcy5pbmRleCh0aGlzLmxpcy5maWx0ZXIoIi51aS10YWJzLXNlbGVjdGVkIikpLHRoaXMuZWxlbWVudFtlLmNvbGxhcHNpYmxlPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLXRhYnMtY29sbGFwc2libGUiKSxlLmNvb2tpZSYmdGhpcy5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2Zvcih2YXIgZz0wLGg7aD10aGlzLmxpc1tnXTtnKyspYShoKVthLmluQXJyYXkoZyxlLmRpc2FibGVkKSE9LTEmJiFhKGgpLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIik/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc3RhdGUtZGlzYWJsZWQiKTtlLmNhY2hlPT09ITEmJnRoaXMuYW5jaG9ycy5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIiksdGhpcy5saXMuYWRkKHRoaXMuYW5jaG9ycykudW5iaW5kKCIudGFicyIpO2lmKGUuZXZlbnQhPT0ibW91c2VvdmVyIil7dmFyIGk9ZnVuY3Rpb24oYSxiKXtiLmlzKCI6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkiKSYmYi5hZGRDbGFzcygidWktc3RhdGUtIithKX0saj1mdW5jdGlvbihhLGIpe2IucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLSIrYSl9O3RoaXMubGlzLmJpbmQoIm1vdXNlb3Zlci50YWJzIixmdW5jdGlvbigpe2koImhvdmVyIixhKHRoaXMpKX0pLHRoaXMubGlzLmJpbmQoIm1vdXNlb3V0LnRhYnMiLGZ1bmN0aW9uKCl7aigiaG92ZXIiLGEodGhpcykpfSksdGhpcy5hbmNob3JzLmJpbmQoImZvY3VzLnRhYnMiLGZ1bmN0aW9uKCl7aSgiZm9jdXMiLGEodGhpcykuY2xvc2VzdCgibGkiKSl9KSx0aGlzLmFuY2hvcnMuYmluZCgiYmx1ci50YWJzIixmdW5jdGlvbigpe2ooImZvY3VzIixhKHRoaXMpLmNsb3Nlc3QoImxpIikpfSl9dmFyIGssbDtlLmZ4JiYoYS5pc0FycmF5KGUuZngpPyhrPWUuZnhbMF0sbD1lLmZ4WzFdKTprPWw9ZS5meCk7dmFyIG49bD9mdW5jdGlvbihiLGMpe2EoYikuY2xvc2VzdCgibGkiKS5hZGRDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxjLmhpZGUoKS5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIikuYW5pbWF0ZShsLGwuZHVyYXRpb258fCJub3JtYWwiLGZ1bmN0aW9uKCl7bShjLGwpLGQuX3RyaWdnZXIoInNob3ciLG51bGwsZC5fdWkoYixjWzBdKSl9KX06ZnVuY3Rpb24oYixjKXthKGIpLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYy5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIiksZC5fdHJpZ2dlcigic2hvdyIsbnVsbCxkLl91aShiLGNbMF0pKX0sbz1rP2Z1bmN0aW9uKGEsYil7Yi5hbmltYXRlKGssay5kdXJhdGlvbnx8Im5vcm1hbCIsZnVuY3Rpb24oKXtkLmxpcy5yZW1vdmVDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKSxiLmFkZENsYXNzKCJ1aS10YWJzLWhpZGUiKSxtKGIsayksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX0pfTpmdW5jdGlvbihhLGIsYyl7ZC5saXMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIiksYi5hZGRDbGFzcygidWktdGFicy1oaWRlIiksZC5lbGVtZW50LmRlcXVldWUoInRhYnMiKX07dGhpcy5hbmNob3JzLmJpbmQoZS5ldmVudCsiLnRhYnMiLGZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPWEoYikuY2xvc2VzdCgibGkiKSxmPWQucGFuZWxzLmZpbHRlcigiOm5vdCgudWktdGFicy1oaWRlKSIpLGc9ZC5lbGVtZW50LmZpbmQoZC5fc2FuaXRpemVTZWxlY3RvcihiLmhhc2gpKTtpZihjLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIikmJiFlLmNvbGxhcHNpYmxlfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxjLmhhc0NsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIil8fGQucGFuZWxzLmZpbHRlcigiOmFuaW1hdGVkIikubGVuZ3RofHxkLl90cmlnZ2VyKCJzZWxlY3QiLG51bGwsZC5fdWkodGhpcyxnWzBdKSk9PT0hMSlyZXR1cm4gdGhpcy5ibHVyKCksITE7ZS5zZWxlY3RlZD1kLmFuY2hvcnMuaW5kZXgodGhpcyksZC5hYm9ydCgpO2lmKGUuY29sbGFwc2libGUpe2lmKGMuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKSlyZXR1cm4gZS5zZWxlY3RlZD0tMSxlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtvKGIsZil9KS5kZXF1ZXVlKCJ0YWJzIiksdGhpcy5ibHVyKCksITE7aWYoIWYubGVuZ3RoKXJldHVybiBlLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpLGQuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtuKGIsZyl9KSxkLmxvYWQoZC5hbmNob3JzLmluZGV4KHRoaXMpKSx0aGlzLmJsdXIoKSwhMX1lLmNvb2tpZSYmZC5fY29va2llKGUuc2VsZWN0ZWQsZS5jb29raWUpO2lmKGcubGVuZ3RoKWYubGVuZ3RoJiZkLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7byhiLGYpfSksZC5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe24oYixnKX0pLGQubG9hZChkLmFuY2hvcnMuaW5kZXgodGhpcykpO2Vsc2UgdGhyb3cialF1ZXJ5IFVJIFRhYnM6IE1pc21hdGNoaW5nIGZyYWdtZW50IGlkZW50aWZpZXIuIjthLmJyb3dzZXIubXNpZSYmdGhpcy5ibHVyKCl9KSx0aGlzLmFuY2hvcnMuYmluZCgiY2xpY2sudGFicyIsZnVuY3Rpb24oKXtyZXR1cm4hMX0pfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIiYmKGE9dGhpcy5hbmNob3JzLmluZGV4KHRoaXMuYW5jaG9ycy5maWx0ZXIoIltocmVmJD0nIithKyInXSIpKSksYX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5hYm9ydCgpLHRoaXMuZWxlbWVudC51bmJpbmQoIi50YWJzIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwgdWktdGFicy1jb2xsYXBzaWJsZSIpLnJlbW92ZURhdGEoInRhYnMiKSx0aGlzLmxpc3QucmVtb3ZlQ2xhc3MoInVpLXRhYnMtbmF2IHVpLWhlbHBlci1yZXNldCB1aS1oZWxwZXItY2xlYXJmaXggdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiksdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hLmRhdGEodGhpcywiaHJlZi50YWJzIik7YiYmKHRoaXMuaHJlZj1iKTt2YXIgYz1hKHRoaXMpLnVuYmluZCgiLnRhYnMiKTthLmVhY2goWyJocmVmIiwibG9hZCIsImNhY2hlIl0sZnVuY3Rpb24oYSxiKXtjLnJlbW92ZURhdGEoYisiLnRhYnMiKX0pfSksdGhpcy5saXMudW5iaW5kKCIudGFicyIpLmFkZCh0aGlzLnBhbmVscykuZWFjaChmdW5jdGlvbigpe2EuZGF0YSh0aGlzLCJkZXN0cm95LnRhYnMiKT9hKHRoaXMpLnJlbW92ZSgpOmEodGhpcykucmVtb3ZlQ2xhc3MoWyJ1aS1zdGF0ZS1kZWZhdWx0IiwidWktY29ybmVyLXRvcCIsInVpLXRhYnMtc2VsZWN0ZWQiLCJ1aS1zdGF0ZS1hY3RpdmUiLCJ1aS1zdGF0ZS1ob3ZlciIsInVpLXN0YXRlLWZvY3VzIiwidWktc3RhdGUtZGlzYWJsZWQiLCJ1aS10YWJzLXBhbmVsIiwidWktd2lkZ2V0LWNvbnRlbnQiLCJ1aS1jb3JuZXItYm90dG9tIiwidWktdGFicy1oaWRlIl0uam9pbigiICIpKX0pLGIuY29va2llJiZ0aGlzLl9jb29raWUobnVsbCxiLmNvb2tpZSksdGhpc30sYWRkOmZ1bmN0aW9uKGMsZCxlKXtlPT09YiYmKGU9dGhpcy5hbmNob3JzLmxlbmd0aCk7dmFyIGY9dGhpcyxnPXRoaXMub3B0aW9ucyxoPWEoZy50YWJUZW1wbGF0ZS5yZXBsYWNlKC8jXHtocmVmXH0vZyxjKS5yZXBsYWNlKC8jXHtsYWJlbFx9L2csZCkpLGk9Yy5pbmRleE9mKCIjIik/dGhpcy5fdGFiSWQoYSgiYSIsaClbMF0pOmMucmVwbGFjZSgiIyIsIiIpO2guYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpLmRhdGEoImRlc3Ryb3kudGFicyIsITApO3ZhciBqPWYuZWxlbWVudC5maW5kKCIjIitpKTtyZXR1cm4gai5sZW5ndGh8fChqPWEoZy5wYW5lbFRlbXBsYXRlKS5hdHRyKCJpZCIsaSkuZGF0YSgiZGVzdHJveS50YWJzIiwhMCkpLGouYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS10YWJzLWhpZGUiKSxlPj10aGlzLmxpcy5sZW5ndGg/KGguYXBwZW5kVG8odGhpcy5saXN0KSxqLmFwcGVuZFRvKHRoaXMubGlzdFswXS5wYXJlbnROb2RlKSk6KGguaW5zZXJ0QmVmb3JlKHRoaXMubGlzW2VdKSxqLmluc2VydEJlZm9yZSh0aGlzLnBhbmVsc1tlXSkpLGcuZGlzYWJsZWQ9YS5tYXAoZy5kaXNhYmxlZCxmdW5jdGlvbihhLGIpe3JldHVybiBhPj1lPysrYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5hbmNob3JzLmxlbmd0aD09MSYmKGcuc2VsZWN0ZWQ9MCxoLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpLGoucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtmLl90cmlnZ2VyKCJzaG93IixudWxsLGYuX3VpKGYuYW5jaG9yc1swXSxmLnBhbmVsc1swXSkpfSksdGhpcy5sb2FkKDApKSx0aGlzLl90cmlnZ2VyKCJhZGQiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2VdLHRoaXMucGFuZWxzW2VdKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGIpe2I9dGhpcy5fZ2V0SW5kZXgoYik7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5saXMuZXEoYikucmVtb3ZlKCksZT10aGlzLnBhbmVscy5lcShiKS5yZW1vdmUoKTtyZXR1cm4gZC5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpJiZ0aGlzLmFuY2hvcnMubGVuZ3RoPjEmJnRoaXMuc2VsZWN0KGIrKGIrMTx0aGlzLmFuY2hvcnMubGVuZ3RoPzE6LTEpKSxjLmRpc2FibGVkPWEubWFwKGEuZ3JlcChjLmRpc2FibGVkLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEhPWJ9KSxmdW5jdGlvbihhLGMpe3JldHVybiBhPj1iPy0tYTphfSksdGhpcy5fdGFiaWZ5KCksdGhpcy5fdHJpZ2dlcigicmVtb3ZlIixudWxsLHRoaXMuX3VpKGQuZmluZCgiYSIpWzBdLGVbMF0pKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oYil7Yj10aGlzLl9nZXRJbmRleChiKTt2YXIgYz10aGlzLm9wdGlvbnM7aWYoYS5pbkFycmF5KGIsYy5kaXNhYmxlZCk9PS0xKXJldHVybjtyZXR1cm4gdGhpcy5saXMuZXEoYikucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZD1hLmdyZXAoYy5kaXNhYmxlZCxmdW5jdGlvbihhLGMpe3JldHVybiBhIT1ifSksdGhpcy5fdHJpZ2dlcigiZW5hYmxlIixudWxsLHRoaXMuX3VpKHRoaXMuYW5jaG9yc1tiXSx0aGlzLnBhbmVsc1tiXSkpLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oYSl7YT10aGlzLl9nZXRJbmRleChhKTt2YXIgYj10aGlzLGM9dGhpcy5vcHRpb25zO3JldHVybiBhIT1jLnNlbGVjdGVkJiYodGhpcy5saXMuZXEoYSkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksYy5kaXNhYmxlZC5wdXNoKGEpLGMuZGlzYWJsZWQuc29ydCgpLHRoaXMuX3RyaWdnZXIoImRpc2FibGUiLG51bGwsdGhpcy5fdWkodGhpcy5hbmNob3JzW2FdLHRoaXMucGFuZWxzW2FdKSkpLHRoaXN9LHNlbGVjdDpmdW5jdGlvbihhKXthPXRoaXMuX2dldEluZGV4KGEpO2lmKGE9PS0xKWlmKHRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSYmdGhpcy5vcHRpb25zLnNlbGVjdGVkIT0tMSlhPXRoaXMub3B0aW9ucy5zZWxlY3RlZDtlbHNlIHJldHVybiB0aGlzO3JldHVybiB0aGlzLmFuY2hvcnMuZXEoYSkudHJpZ2dlcih0aGlzLm9wdGlvbnMuZXZlbnQrIi50YWJzIiksdGhpc30sbG9hZDpmdW5jdGlvbihiKXtiPXRoaXMuX2dldEluZGV4KGIpO3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT10aGlzLmFuY2hvcnMuZXEoYilbMF0sZj1hLmRhdGEoZSwibG9hZC50YWJzIik7dGhpcy5hYm9ydCgpO2lmKCFmfHx0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5sZW5ndGghPT0wJiZhLmRhdGEoZSwiY2FjaGUudGFicyIpKXt0aGlzLmVsZW1lbnQuZGVxdWV1ZSgidGFicyIpO3JldHVybn10aGlzLmxpcy5lcShiKS5hZGRDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpO2lmKGQuc3Bpbm5lcil7dmFyIGc9YSgic3BhbiIsZSk7Zy5kYXRhKCJsYWJlbC50YWJzIixnLmh0bWwoKSkuaHRtbChkLnNwaW5uZXIpfXJldHVybiB0aGlzLnhocj1hLmFqYXgoYS5leHRlbmQoe30sZC5hamF4T3B0aW9ucyx7dXJsOmYsc3VjY2VzczpmdW5jdGlvbihmLGcpe2MuZWxlbWVudC5maW5kKGMuX3Nhbml0aXplU2VsZWN0b3IoZS5oYXNoKSkuaHRtbChmKSxjLl9jbGVhbnVwKCksZC5jYWNoZSYmYS5kYXRhKGUsImNhY2hlLnRhYnMiLCEwKSxjLl90cmlnZ2VyKCJsb2FkIixudWxsLGMuX3VpKGMuYW5jaG9yc1tiXSxjLnBhbmVsc1tiXSkpO3RyeXtkLmFqYXhPcHRpb25zLnN1Y2Nlc3MoZixnKX1jYXRjaChoKXt9fSxlcnJvcjpmdW5jdGlvbihhLGYsZyl7Yy5fY2xlYW51cCgpLGMuX3RyaWdnZXIoImxvYWQiLG51bGwsYy5fdWkoYy5hbmNob3JzW2JdLGMucGFuZWxzW2JdKSk7dHJ5e2QuYWpheE9wdGlvbnMuZXJyb3IoYSxmLGIsZSl9Y2F0Y2goZyl7fX19KSksYy5lbGVtZW50LmRlcXVldWUoInRhYnMiKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQucXVldWUoW10pLHRoaXMucGFuZWxzLnN0b3AoITEsITApLHRoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsdGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIikuc3BsaWNlKC0yLDIpKSx0aGlzLnhociYmKHRoaXMueGhyLmFib3J0KCksZGVsZXRlIHRoaXMueGhyKSx0aGlzLl9jbGVhbnVwKCksdGhpc30sdXJsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYW5jaG9ycy5lcShhKS5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIikuZGF0YSgibG9hZC50YWJzIixiKSx0aGlzfSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmNob3JzLmxlbmd0aH19KSxhLmV4dGVuZChhLnVpLnRhYnMse3ZlcnNpb246IjEuOC4yMyJ9KSxhLmV4dGVuZChhLnVpLnRhYnMucHJvdG90eXBlLHtyb3RhdGlvbjpudWxsLHJvdGF0ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD10aGlzLm9wdGlvbnMsZT1jLl9yb3RhdGV8fChjLl9yb3RhdGU9ZnVuY3Rpb24oYil7Y2xlYXJUaW1lb3V0KGMucm90YXRpb24pLGMucm90YXRpb249c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPWQuc2VsZWN0ZWQ7Yy5zZWxlY3QoKythPGMuYW5jaG9ycy5sZW5ndGg/YTowKX0sYSksYiYmYi5zdG9wUHJvcGFnYXRpb24oKX0pLGY9Yy5fdW5yb3RhdGV8fChjLl91bnJvdGF0ZT1iP2Z1bmN0aW9uKGEpe2UoKX06ZnVuY3Rpb24oYSl7YS5jbGllbnRYJiZjLnJvdGF0ZShudWxsKX0pO3JldHVybiBhPyh0aGlzLmVsZW1lbnQuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy5iaW5kKGQuZXZlbnQrIi50YWJzIixmKSxlKCkpOihjbGVhclRpbWVvdXQoYy5yb3RhdGlvbiksdGhpcy5lbGVtZW50LnVuYmluZCgidGFic3Nob3ciLGUpLHRoaXMuYW5jaG9ycy51bmJpbmQoZC5ldmVudCsiLnRhYnMiLGYpLGRlbGV0ZSB0aGlzLl9yb3RhdGUsZGVsZXRlIHRoaXMuX3Vucm90YXRlKSx0aGlzfX0pfSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkudWkuZGF0ZXBpY2tlci5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oJCx1bmRlZmluZWQpe2Z1bmN0aW9uIERhdGVwaWNrZXIoKXt0aGlzLmRlYnVnPSExLHRoaXMuX2N1ckluc3Q9bnVsbCx0aGlzLl9rZXlFdmVudD0hMSx0aGlzLl9kaXNhYmxlZElucHV0cz1bXSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMSx0aGlzLl9pbkRpYWxvZz0hMSx0aGlzLl9tYWluRGl2SWQ9InVpLWRhdGVwaWNrZXItZGl2Iix0aGlzLl9pbmxpbmVDbGFzcz0idWktZGF0ZXBpY2tlci1pbmxpbmUiLHRoaXMuX2FwcGVuZENsYXNzPSJ1aS1kYXRlcGlja2VyLWFwcGVuZCIsdGhpcy5fdHJpZ2dlckNsYXNzPSJ1aS1kYXRlcGlja2VyLXRyaWdnZXIiLHRoaXMuX2RpYWxvZ0NsYXNzPSJ1aS1kYXRlcGlja2VyLWRpYWxvZyIsdGhpcy5fZGlzYWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWRpc2FibGVkIix0aGlzLl91bnNlbGVjdGFibGVDbGFzcz0idWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGUiLHRoaXMuX2N1cnJlbnRDbGFzcz0idWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSIsdGhpcy5fZGF5T3ZlckNsYXNzPSJ1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyIix0aGlzLnJlZ2lvbmFsPVtdLHRoaXMucmVnaW9uYWxbIiJdPXtjbG9zZVRleHQ6IkRvbmUiLHByZXZUZXh0OiJQcmV2IixuZXh0VGV4dDoiTmV4dCIsY3VycmVudFRleHQ6IlRvZGF5Iixtb250aE5hbWVzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxtb250aE5hbWVzU2hvcnQ6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxkYXlOYW1lczpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sZGF5TmFtZXNTaG9ydDpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLGRheU5hbWVzTWluOlsiU3UiLCJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiXSx3ZWVrSGVhZGVyOiJXayIsZGF0ZUZvcm1hdDoibW0vZGQveXkiLGZpcnN0RGF5OjAsaXNSVEw6ITEsc2hvd01vbnRoQWZ0ZXJZZWFyOiExLHllYXJTdWZmaXg6IiJ9LHRoaXMuX2RlZmF1bHRzPXtzaG93T246ImZvY3VzIixzaG93QW5pbToiZmFkZUluIixzaG93T3B0aW9uczp7fSxkZWZhdWx0RGF0ZTpudWxsLGFwcGVuZFRleHQ6IiIsYnV0dG9uVGV4dDoiLi4uIixidXR0b25JbWFnZToiIixidXR0b25JbWFnZU9ubHk6ITEsaGlkZUlmTm9QcmV2TmV4dDohMSxuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0OiExLGdvdG9DdXJyZW50OiExLGNoYW5nZU1vbnRoOiExLGNoYW5nZVllYXI6ITEseWVhclJhbmdlOiJjLTEwOmMrMTAiLHNob3dPdGhlck1vbnRoczohMSxzZWxlY3RPdGhlck1vbnRoczohMSxzaG93V2VlazohMSxjYWxjdWxhdGVXZWVrOnRoaXMuaXNvODYwMVdlZWssc2hvcnRZZWFyQ3V0b2ZmOiIrMTAiLG1pbkRhdGU6bnVsbCxtYXhEYXRlOm51bGwsZHVyYXRpb246ImZhc3QiLGJlZm9yZVNob3dEYXk6bnVsbCxiZWZvcmVTaG93Om51bGwsb25TZWxlY3Q6bnVsbCxvbkNoYW5nZU1vbnRoWWVhcjpudWxsLG9uQ2xvc2U6bnVsbCxudW1iZXJPZk1vbnRoczoxLHNob3dDdXJyZW50QXRQb3M6MCxzdGVwTW9udGhzOjEsc3RlcEJpZ01vbnRoczoxMixhbHRGaWVsZDoiIixhbHRGb3JtYXQ6IiIsY29uc3RyYWluSW5wdXQ6ITAsc2hvd0J1dHRvblBhbmVsOiExLGF1dG9TaXplOiExLGRpc2FibGVkOiExfSwkLmV4dGVuZCh0aGlzLl9kZWZhdWx0cyx0aGlzLnJlZ2lvbmFsWyIiXSksdGhpcy5kcERpdj1iaW5kSG92ZXIoJCgnPGRpdiBpZD0iJyt0aGlzLl9tYWluRGl2SWQrJyIgY2xhc3M9InVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsIj48L2Rpdj4nKSl9ZnVuY3Rpb24gYmluZEhvdmVyKGEpe3ZhciBiPSJidXR0b24sIC51aS1kYXRlcGlja2VyLXByZXYsIC51aS1kYXRlcGlja2VyLW5leHQsIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIGEiO3JldHVybiBhLmJpbmQoIm1vdXNlb3V0IixmdW5jdGlvbihhKXt2YXIgYz0kKGEudGFyZ2V0KS5jbG9zZXN0KGIpO2lmKCFjLmxlbmd0aClyZXR1cm47Yy5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIgdWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIHVpLWRhdGVwaWNrZXItbmV4dC1ob3ZlciIpfSkuYmluZCgibW91c2VvdmVyIixmdW5jdGlvbihjKXt2YXIgZD0kKGMudGFyZ2V0KS5jbG9zZXN0KGIpO2lmKCQuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIoaW5zdEFjdGl2ZS5pbmxpbmU/YS5wYXJlbnQoKVswXTppbnN0QWN0aXZlLmlucHV0WzBdKXx8IWQubGVuZ3RoKXJldHVybjtkLnBhcmVudHMoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIikuZmluZCgiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLGQuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksZC5oYXNDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2IikmJmQuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItcHJldi1ob3ZlciIpLGQuaGFzQ2xhc3MoInVpLWRhdGVwaWNrZXItbmV4dCIpJiZkLmFkZENsYXNzKCJ1aS1kYXRlcGlja2VyLW5leHQtaG92ZXIiKX0pfWZ1bmN0aW9uIGV4dGVuZFJlbW92ZShhLGIpeyQuZXh0ZW5kKGEsYik7Zm9yKHZhciBjIGluIGIpaWYoYltjXT09bnVsbHx8YltjXT09dW5kZWZpbmVkKWFbY109YltjXTtyZXR1cm4gYX1mdW5jdGlvbiBpc0FycmF5KGEpe3JldHVybiBhJiYoJC5icm93c2VyLnNhZmFyaSYmdHlwZW9mIGE9PSJvYmplY3QiJiZhLmxlbmd0aHx8YS5jb25zdHJ1Y3RvciYmYS5jb25zdHJ1Y3Rvci50b1N0cmluZygpLm1hdGNoKC9cQXJyYXlcKFwpLykpfSQuZXh0ZW5kKCQudWkse2RhdGVwaWNrZXI6e3ZlcnNpb246IjEuOC4yMyJ9fSk7dmFyIFBST1BfTkFNRT0iZGF0ZXBpY2tlciIsZHB1dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGluc3RBY3RpdmU7JC5leHRlbmQoRGF0ZXBpY2tlci5wcm90b3R5cGUse21hcmtlckNsYXNzTmFtZToiaGFzRGF0ZXBpY2tlciIsbWF4Um93czo0LGxvZzpmdW5jdGlvbigpe3RoaXMuZGVidWcmJmNvbnNvbGUubG9nLmFwcGx5KCIiLGFyZ3VtZW50cyl9LF93aWRnZXREYXRlcGlja2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHBEaXZ9LHNldERlZmF1bHRzOmZ1bmN0aW9uKGEpe3JldHVybiBleHRlbmRSZW1vdmUodGhpcy5fZGVmYXVsdHMsYXx8e30pLHRoaXN9LF9hdHRhY2hEYXRlcGlja2VyOmZ1bmN0aW9uKHRhcmdldCxzZXR0aW5ncyl7dmFyIGlubGluZVNldHRpbmdzPW51bGw7Zm9yKHZhciBhdHRyTmFtZSBpbiB0aGlzLl9kZWZhdWx0cyl7dmFyIGF0dHJWYWx1ZT10YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRlOiIrYXR0ck5hbWUpO2lmKGF0dHJWYWx1ZSl7aW5saW5lU2V0dGluZ3M9aW5saW5lU2V0dGluZ3N8fHt9O3RyeXtpbmxpbmVTZXR0aW5nc1thdHRyTmFtZV09ZXZhbChhdHRyVmFsdWUpfWNhdGNoKGVycil7aW5saW5lU2V0dGluZ3NbYXR0ck5hbWVdPWF0dHJWYWx1ZX19fXZhciBub2RlTmFtZT10YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxpbmxpbmU9bm9kZU5hbWU9PSJkaXYifHxub2RlTmFtZT09InNwYW4iO3RhcmdldC5pZHx8KHRoaXMudXVpZCs9MSx0YXJnZXQuaWQ9ImRwIit0aGlzLnV1aWQpO3ZhciBpbnN0PXRoaXMuX25ld0luc3QoJCh0YXJnZXQpLGlubGluZSk7aW5zdC5zZXR0aW5ncz0kLmV4dGVuZCh7fSxzZXR0aW5nc3x8e30saW5saW5lU2V0dGluZ3N8fHt9KSxub2RlTmFtZT09ImlucHV0Ij90aGlzLl9jb25uZWN0RGF0ZXBpY2tlcih0YXJnZXQsaW5zdCk6aW5saW5lJiZ0aGlzLl9pbmxpbmVEYXRlcGlja2VyKHRhcmdldCxpbnN0KX0sX25ld0luc3Q6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hWzBdLmlkLnJlcGxhY2UoLyhbXkEtWmEtejAtOV8tXSkvZywiXFxcXCQxIik7cmV0dXJue2lkOmMsaW5wdXQ6YSxzZWxlY3RlZERheTowLHNlbGVjdGVkTW9udGg6MCxzZWxlY3RlZFllYXI6MCxkcmF3TW9udGg6MCxkcmF3WWVhcjowLGlubGluZTpiLGRwRGl2OmI/YmluZEhvdmVyKCQoJzxkaXYgY2xhc3M9IicrdGhpcy5faW5saW5lQ2xhc3MrJyB1aS1kYXRlcGlja2VyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1oZWxwZXItY2xlYXJmaXggdWktY29ybmVyLWFsbCI+PC9kaXY+JykpOnRoaXMuZHBEaXZ9fSxfY29ubmVjdERhdGVwaWNrZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz0kKGEpO2IuYXBwZW5kPSQoW10pLGIudHJpZ2dlcj0kKFtdKTtpZihjLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dGhpcy5fYXR0YWNobWVudHMoYyxiKSxjLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5rZXlkb3duKHRoaXMuX2RvS2V5RG93bikua2V5cHJlc3ModGhpcy5fZG9LZXlQcmVzcykua2V5dXAodGhpcy5fZG9LZXlVcCkuYmluZCgic2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihhLGMsZCl7Yi5zZXR0aW5nc1tjXT1kfSkuYmluZCgiZ2V0RGF0YS5kYXRlcGlja2VyIixmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLl9nZXQoYixjKX0pLHRoaXMuX2F1dG9TaXplKGIpLCQuZGF0YShhLFBST1BfTkFNRSxiKSxiLnNldHRpbmdzLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcihhKX0sX2F0dGFjaG1lbnRzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fZ2V0KGIsImFwcGVuZFRleHQiKSxkPXRoaXMuX2dldChiLCJpc1JUTCIpO2IuYXBwZW5kJiZiLmFwcGVuZC5yZW1vdmUoKSxjJiYoYi5hcHBlbmQ9JCgnPHNwYW4gY2xhc3M9IicrdGhpcy5fYXBwZW5kQ2xhc3MrJyI+JytjKyI8L3NwYW4+IiksYVtkPyJiZWZvcmUiOiJhZnRlciJdKGIuYXBwZW5kKSksYS51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlciksYi50cmlnZ2VyJiZiLnRyaWdnZXIucmVtb3ZlKCk7dmFyIGU9dGhpcy5fZ2V0KGIsInNob3dPbiIpOyhlPT0iZm9jdXMifHxlPT0iYm90aCIpJiZhLmZvY3VzKHRoaXMuX3Nob3dEYXRlcGlja2VyKTtpZihlPT0iYnV0dG9uInx8ZT09ImJvdGgiKXt2YXIgZj10aGlzLl9nZXQoYiwiYnV0dG9uVGV4dCIpLGc9dGhpcy5fZ2V0KGIsImJ1dHRvbkltYWdlIik7Yi50cmlnZ2VyPSQodGhpcy5fZ2V0KGIsImJ1dHRvbkltYWdlT25seSIpPyQoIjxpbWcvPiIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuYXR0cih7c3JjOmcsYWx0OmYsdGl0bGU6Zn0pOiQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLmh0bWwoZz09IiI/ZjokKCI8aW1nLz4iKS5hdHRyKHtzcmM6ZyxhbHQ6Zix0aXRsZTpmfSkpKSxhW2Q/ImJlZm9yZSI6ImFmdGVyIl0oYi50cmlnZ2VyKSxiLnRyaWdnZXIuY2xpY2soZnVuY3Rpb24oKXtyZXR1cm4gJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQ9PWFbMF0/JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJiQuZGF0ZXBpY2tlci5fbGFzdElucHV0IT1hWzBdPygkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksJC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihhWzBdKSk6JC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcihhWzBdKSwhMX0pfX0sX2F1dG9TaXplOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2dldChhLCJhdXRvU2l6ZSIpJiYhYS5pbmxpbmUpe3ZhciBiPW5ldyBEYXRlKDIwMDksMTEsMjApLGM9dGhpcy5fZ2V0KGEsImRhdGVGb3JtYXQiKTtpZihjLm1hdGNoKC9bRE1dLykpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPTAsYz0wO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWFbZF0ubGVuZ3RoPmImJihiPWFbZF0ubGVuZ3RoLGM9ZCk7cmV0dXJuIGN9O2Iuc2V0TW9udGgoZCh0aGlzLl9nZXQoYSxjLm1hdGNoKC9NTS8pPyJtb250aE5hbWVzIjoibW9udGhOYW1lc1Nob3J0IikpKSxiLnNldERhdGUoZCh0aGlzLl9nZXQoYSxjLm1hdGNoKC9ERC8pPyJkYXlOYW1lcyI6ImRheU5hbWVzU2hvcnQiKSkrMjAtYi5nZXREYXkoKSl9YS5pbnB1dC5hdHRyKCJzaXplIix0aGlzLl9mb3JtYXREYXRlKGEsYikubGVuZ3RoKX19LF9pbmxpbmVEYXRlcGlja2VyOmZ1bmN0aW9uKGEsYil7dmFyIGM9JChhKTtpZihjLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47Yy5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuYXBwZW5kKGIuZHBEaXYpLmJpbmQoInNldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjLGQpe2Iuc2V0dGluZ3NbY109ZH0pLmJpbmQoImdldERhdGEuZGF0ZXBpY2tlciIsZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5fZ2V0KGIsYyl9KSwkLmRhdGEoYSxQUk9QX05BTUUsYiksdGhpcy5fc2V0RGF0ZShiLHRoaXMuX2dldERlZmF1bHREYXRlKGIpLCEwKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGIpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShiKSxiLnNldHRpbmdzLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlRGF0ZXBpY2tlcihhKSxiLmRwRGl2LmNzcygiZGlzcGxheSIsImJsb2NrIil9LF9kaWFsb2dEYXRlcGlja2VyOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9dGhpcy5fZGlhbG9nSW5zdDtpZighZil7dGhpcy51dWlkKz0xO3ZhciBnPSJkcCIrdGhpcy51dWlkO3RoaXMuX2RpYWxvZ0lucHV0PSQoJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iJytnKyciIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMHB4OyB3aWR0aDogMHB4OyIvPicpLHRoaXMuX2RpYWxvZ0lucHV0LmtleWRvd24odGhpcy5fZG9LZXlEb3duKSwkKCJib2R5IikuYXBwZW5kKHRoaXMuX2RpYWxvZ0lucHV0KSxmPXRoaXMuX2RpYWxvZ0luc3Q9dGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1dCwhMSksZi5zZXR0aW5ncz17fSwkLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sUFJPUF9OQU1FLGYpfWV4dGVuZFJlbW92ZShmLnNldHRpbmdzLGR8fHt9KSxiPWImJmIuY29uc3RydWN0b3I9PURhdGU/dGhpcy5fZm9ybWF0RGF0ZShmLGIpOmIsdGhpcy5fZGlhbG9nSW5wdXQudmFsKGIpLHRoaXMuX3Bvcz1lP2UubGVuZ3RoP2U6W2UucGFnZVgsZS5wYWdlWV06bnVsbDtpZighdGhpcy5fcG9zKXt2YXIgaD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGo9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCxrPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO3RoaXMuX3Bvcz1baC8yLTEwMCtqLGkvMi0xNTAra119cmV0dXJuIHRoaXMuX2RpYWxvZ0lucHV0LmNzcygibGVmdCIsdGhpcy5fcG9zWzBdKzIwKyJweCIpLmNzcygidG9wIix0aGlzLl9wb3NbMV0rInB4IiksZi5zZXR0aW5ncy5vblNlbGVjdD1jLHRoaXMuX2luRGlhbG9nPSEwLHRoaXMuZHBEaXYuYWRkQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLHRoaXMuX3Nob3dEYXRlcGlja2VyKHRoaXMuX2RpYWxvZ0lucHV0WzBdKSwkLmJsb2NrVUkmJiQuYmxvY2tVSSh0aGlzLmRwRGl2KSwkLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sUFJPUF9OQU1FLGYpLHRoaXN9LF9kZXN0cm95RGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj0kKGEpLGM9JC5kYXRhKGEsUFJPUF9OQU1FKTtpZighYi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkpcmV0dXJuO3ZhciBkPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTskLnJlbW92ZURhdGEoYSxQUk9QX05BTUUpLGQ9PSJpbnB1dCI/KGMuYXBwZW5kLnJlbW92ZSgpLGMudHJpZ2dlci5yZW1vdmUoKSxiLnJlbW92ZUNsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlcikudW5iaW5kKCJrZXlkb3duIix0aGlzLl9kb0tleURvd24pLnVuYmluZCgia2V5cHJlc3MiLHRoaXMuX2RvS2V5UHJlc3MpLnVuYmluZCgia2V5dXAiLHRoaXMuX2RvS2V5VXApKTooZD09ImRpdiJ8fGQ9PSJzcGFuIikmJmIucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmVtcHR5KCl9LF9lbmFibGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz0kLmRhdGEoYSxQUk9QX05BTUUpO2lmKCFiLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dmFyIGQ9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGQ9PSJpbnB1dCIpYS5kaXNhYmxlZD0hMSxjLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMX0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIxLjAiLGN1cnNvcjoiIn0pO2Vsc2UgaWYoZD09ImRpdiJ8fGQ9PSJzcGFuIil7dmFyIGU9Yi5jaGlsZHJlbigiLiIrdGhpcy5faW5saW5lQ2xhc3MpO2UuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKSxlLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKX10aGlzLl9kaXNhYmxlZElucHV0cz0kLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbihiKXtyZXR1cm4gYj09YT9udWxsOmJ9KX0sX2Rpc2FibGVEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe3ZhciBiPSQoYSksYz0kLmRhdGEoYSxQUk9QX05BTUUpO2lmKCFiLmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSlyZXR1cm47dmFyIGQ9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGQ9PSJpbnB1dCIpYS5kaXNhYmxlZD0hMCxjLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMH0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIwLjUiLGN1cnNvcjoiZGVmYXVsdCJ9KTtlbHNlIGlmKGQ9PSJkaXYifHxkPT0ic3BhbiIpe3ZhciBlPWIuY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKTtlLmNoaWxkcmVuKCkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiksZS5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLmF0dHIoImRpc2FibGVkIiwiZGlzYWJsZWQiKX10aGlzLl9kaXNhYmxlZElucHV0cz0kLm1hcCh0aGlzLl9kaXNhYmxlZElucHV0cyxmdW5jdGlvbihiKXtyZXR1cm4gYj09YT9udWxsOmJ9KSx0aGlzLl9kaXNhYmxlZElucHV0c1t0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGhdPWF9LF9pc0Rpc2FibGVkRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTtmb3IodmFyIGI9MDtiPHRoaXMuX2Rpc2FibGVkSW5wdXRzLmxlbmd0aDtiKyspaWYodGhpcy5fZGlzYWJsZWRJbnB1dHNbYl09PWEpcmV0dXJuITA7cmV0dXJuITF9LF9nZXRJbnN0OmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gJC5kYXRhKGEsUFJPUF9OQU1FKX1jYXRjaChiKXt0aHJvdyJNaXNzaW5nIGluc3RhbmNlIGRhdGEgZm9yIHRoaXMgZGF0ZXBpY2tlciJ9fSxfb3B0aW9uRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fZ2V0SW5zdChhKTtpZihhcmd1bWVudHMubGVuZ3RoPT0yJiZ0eXBlb2YgYj09InN0cmluZyIpcmV0dXJuIGI9PSJkZWZhdWx0cyI/JC5leHRlbmQoe30sJC5kYXRlcGlja2VyLl9kZWZhdWx0cyk6ZD9iPT0iYWxsIj8kLmV4dGVuZCh7fSxkLnNldHRpbmdzKTp0aGlzLl9nZXQoZCxiKTpudWxsO3ZhciBlPWJ8fHt9O3R5cGVvZiBiPT0ic3RyaW5nIiYmKGU9e30sZVtiXT1jKTtpZihkKXt0aGlzLl9jdXJJbnN0PT1kJiZ0aGlzLl9oaWRlRGF0ZXBpY2tlcigpO3ZhciBmPXRoaXMuX2dldERhdGVEYXRlcGlja2VyKGEsITApLGc9dGhpcy5fZ2V0TWluTWF4RGF0ZShkLCJtaW4iKSxoPXRoaXMuX2dldE1pbk1heERhdGUoZCwibWF4Iik7ZXh0ZW5kUmVtb3ZlKGQuc2V0dGluZ3MsZSksZyE9PW51bGwmJmUuZGF0ZUZvcm1hdCE9PXVuZGVmaW5lZCYmZS5taW5EYXRlPT09dW5kZWZpbmVkJiYoZC5zZXR0aW5ncy5taW5EYXRlPXRoaXMuX2Zvcm1hdERhdGUoZCxnKSksaCE9PW51bGwmJmUuZGF0ZUZvcm1hdCE9PXVuZGVmaW5lZCYmZS5tYXhEYXRlPT09dW5kZWZpbmVkJiYoZC5zZXR0aW5ncy5tYXhEYXRlPXRoaXMuX2Zvcm1hdERhdGUoZCxoKSksdGhpcy5fYXR0YWNobWVudHMoJChhKSxkKSx0aGlzLl9hdXRvU2l6ZShkKSx0aGlzLl9zZXREYXRlKGQsZiksdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGQpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoZCl9fSxfY2hhbmdlRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5fb3B0aW9uRGF0ZXBpY2tlcihhLGIsYyl9LF9yZWZyZXNoRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9nZXRJbnN0KGEpO2ImJnRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoYil9LF9zZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldEluc3QoYSk7YyYmKHRoaXMuX3NldERhdGUoYyxiKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGMpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShjKSl9LF9nZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldEluc3QoYSk7cmV0dXJuIGMmJiFjLmlubGluZSYmdGhpcy5fc2V0RGF0ZUZyb21GaWVsZChjLGIpLGM/dGhpcy5fZ2V0RGF0ZShjKTpudWxsfSxfZG9LZXlEb3duOmZ1bmN0aW9uKGEpe3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhLnRhcmdldCksYz0hMCxkPWIuZHBEaXYuaXMoIi51aS1kYXRlcGlja2VyLXJ0bCIpO2IuX2tleUV2ZW50PSEwO2lmKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcpc3dpdGNoKGEua2V5Q29kZSl7Y2FzZSA5OiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKSxjPSExO2JyZWFrO2Nhc2UgMTM6dmFyIGU9JCgidGQuIiskLmRhdGVwaWNrZXIuX2RheU92ZXJDbGFzcysiOm5vdCguIiskLmRhdGVwaWNrZXIuX2N1cnJlbnRDbGFzcysiKSIsYi5kcERpdik7ZVswXSYmJC5kYXRlcGlja2VyLl9zZWxlY3REYXkoYS50YXJnZXQsYi5zZWxlY3RlZE1vbnRoLGIuc2VsZWN0ZWRZZWFyLGVbMF0pO3ZhciBmPSQuZGF0ZXBpY2tlci5fZ2V0KGIsIm9uU2VsZWN0Iik7aWYoZil7dmFyIGc9JC5kYXRlcGlja2VyLl9mb3JtYXREYXRlKGIpO2YuYXBwbHkoYi5pbnB1dD9iLmlucHV0WzBdOm51bGwsW2csYl0pfWVsc2UgJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO3JldHVybiExO2Nhc2UgMjc6JC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO2JyZWFrO2Nhc2UgMzM6JC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGEuY3RybEtleT8tJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcEJpZ01vbnRocyIpOi0kLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM0OiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCxhLmN0cmxLZXk/KyQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBCaWdNb250aHMiKTorJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNTooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZShhLnRhcmdldCksYz1hLmN0cmxLZXl8fGEubWV0YUtleTticmVhaztjYXNlIDM2OihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fZ290b1RvZGF5KGEudGFyZ2V0KSxjPWEuY3RybEtleXx8YS5tZXRhS2V5O2JyZWFrO2Nhc2UgMzc6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGQ/MTotMSwiRCIpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXksYS5vcmlnaW5hbEV2ZW50LmFsdEtleSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LGEuY3RybEtleT8tJC5kYXRlcGlja2VyLl9nZXQoYiwic3RlcEJpZ01vbnRocyIpOi0kLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM4OihhLmN0cmxLZXl8fGEubWV0YUtleSkmJiQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShhLnRhcmdldCwtNywiRCIpLGM9YS5jdHJsS2V5fHxhLm1ldGFLZXk7YnJlYWs7Y2FzZSAzOTooYS5jdHJsS2V5fHxhLm1ldGFLZXkpJiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsZD8tMToxLCJEIiksYz1hLmN0cmxLZXl8fGEubWV0YUtleSxhLm9yaWdpbmFsRXZlbnQuYWx0S2V5JiYkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoYS50YXJnZXQsYS5jdHJsS2V5PyskLmRhdGVwaWNrZXIuX2dldChiLCJzdGVwQmlnTW9udGhzIik6KyQuZGF0ZXBpY2tlci5fZ2V0KGIsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgNDA6KGEuY3RybEtleXx8YS5tZXRhS2V5KSYmJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGEudGFyZ2V0LDcsIkQiKSxjPWEuY3RybEtleXx8YS5tZXRhS2V5O2JyZWFrO2RlZmF1bHQ6Yz0hMX1lbHNlIGEua2V5Q29kZT09MzYmJmEuY3RybEtleT8kLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKHRoaXMpOmM9ITE7YyYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKX0sX2RvS2V5UHJlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9JC5kYXRlcGlja2VyLl9nZXRJbnN0KGEudGFyZ2V0KTtpZigkLmRhdGVwaWNrZXIuX2dldChiLCJjb25zdHJhaW5JbnB1dCIpKXt2YXIgYz0kLmRhdGVwaWNrZXIuX3Bvc3NpYmxlQ2hhcnMoJC5kYXRlcGlja2VyLl9nZXQoYiwiZGF0ZUZvcm1hdCIpKSxkPVN0cmluZy5mcm9tQ2hhckNvZGUoYS5jaGFyQ29kZT09dW5kZWZpbmVkP2Eua2V5Q29kZTphLmNoYXJDb2RlKTtyZXR1cm4gYS5jdHJsS2V5fHxhLm1ldGFLZXl8fGQ8IiAifHwhY3x8Yy5pbmRleE9mKGQpPi0xfX0sX2RvS2V5VXA6ZnVuY3Rpb24oYSl7dmFyIGI9JC5kYXRlcGlja2VyLl9nZXRJbnN0KGEudGFyZ2V0KTtpZihiLmlucHV0LnZhbCgpIT1iLmxhc3RWYWwpdHJ5e3ZhciBjPSQuZGF0ZXBpY2tlci5wYXJzZURhdGUoJC5kYXRlcGlja2VyLl9nZXQoYiwiZGF0ZUZvcm1hdCIpLGIuaW5wdXQ/Yi5pbnB1dC52YWwoKTpudWxsLCQuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKGIpKTtjJiYoJC5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKGIpLCQuZGF0ZXBpY2tlci5fdXBkYXRlQWx0ZXJuYXRlKGIpLCQuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcihiKSl9Y2F0Y2goZCl7JC5kYXRlcGlja2VyLmxvZyhkKX1yZXR1cm4hMH0sX3Nob3dEYXRlcGlja2VyOmZ1bmN0aW9uKGEpe2E9YS50YXJnZXR8fGEsYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT0iaW5wdXQiJiYoYT0kKCJpbnB1dCIsYS5wYXJlbnROb2RlKVswXSk7aWYoJC5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlcihhKXx8JC5kYXRlcGlja2VyLl9sYXN0SW5wdXQ9PWEpcmV0dXJuO3ZhciBiPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChhKTskLmRhdGVwaWNrZXIuX2N1ckluc3QmJiQuZGF0ZXBpY2tlci5fY3VySW5zdCE9YiYmKCQuZGF0ZXBpY2tlci5fY3VySW5zdC5kcERpdi5zdG9wKCEwLCEwKSxiJiYkLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCQuZGF0ZXBpY2tlci5fY3VySW5zdC5pbnB1dFswXSkpO3ZhciBjPSQuZGF0ZXBpY2tlci5fZ2V0KGIsImJlZm9yZVNob3ciKSxkPWM/Yy5hcHBseShhLFthLGJdKTp7fTtpZihkPT09ITEpcmV0dXJuO2V4dGVuZFJlbW92ZShiLnNldHRpbmdzLGQpLGIubGFzdFZhbD1udWxsLCQuZGF0ZXBpY2tlci5fbGFzdElucHV0PWEsJC5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKGIpLCQuZGF0ZXBpY2tlci5faW5EaWFsb2cmJihhLnZhbHVlPSIiKSwkLmRhdGVwaWNrZXIuX3Bvc3x8KCQuZGF0ZXBpY2tlci5fcG9zPSQuZGF0ZXBpY2tlci5fZmluZFBvcyhhKSwkLmRhdGVwaWNrZXIuX3Bvc1sxXSs9YS5vZmZzZXRIZWlnaHQpO3ZhciBlPSExOyQoYSkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gZXw9JCh0aGlzKS5jc3MoInBvc2l0aW9uIik9PSJmaXhlZCIsIWV9KSxlJiYkLmJyb3dzZXIub3BlcmEmJigkLmRhdGVwaWNrZXIuX3Bvc1swXS09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsJC5kYXRlcGlja2VyLl9wb3NbMV0tPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApO3ZhciBmPXtsZWZ0OiQuZGF0ZXBpY2tlci5fcG9zWzBdLHRvcDokLmRhdGVwaWNrZXIuX3Bvc1sxXX07JC5kYXRlcGlja2VyLl9wb3M9bnVsbCxiLmRwRGl2LmVtcHR5KCksYi5kcERpdi5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsZGlzcGxheToiYmxvY2siLHRvcDoiLTEwMDBweCJ9KSwkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoYiksZj0kLmRhdGVwaWNrZXIuX2NoZWNrT2Zmc2V0KGIsZixlKSxiLmRwRGl2LmNzcyh7cG9zaXRpb246JC5kYXRlcGlja2VyLl9pbkRpYWxvZyYmJC5ibG9ja1VJPyJzdGF0aWMiOmU/ImZpeGVkIjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLGxlZnQ6Zi5sZWZ0KyJweCIsdG9wOmYudG9wKyJweCJ9KTtpZighYi5pbmxpbmUpe3ZhciBnPSQuZGF0ZXBpY2tlci5fZ2V0KGIsInNob3dBbmltIiksaD0kLmRhdGVwaWNrZXIuX2dldChiLCJkdXJhdGlvbiIpLGk9ZnVuY3Rpb24oKXt2YXIgYT1iLmRwRGl2LmZpbmQoImlmcmFtZS51aS1kYXRlcGlja2VyLWNvdmVyIik7aWYoISFhLmxlbmd0aCl7dmFyIGM9JC5kYXRlcGlja2VyLl9nZXRCb3JkZXJzKGIuZHBEaXYpO2EuY3NzKHtsZWZ0Oi1jWzBdLHRvcDotY1sxXSx3aWR0aDpiLmRwRGl2Lm91dGVyV2lkdGgoKSxoZWlnaHQ6Yi5kcERpdi5vdXRlckhlaWdodCgpfSl9fTtiLmRwRGl2LnpJbmRleCgkKGEpLnpJbmRleCgpKzEpLCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmc9ITAsJC5lZmZlY3RzJiYkLmVmZmVjdHNbZ10/Yi5kcERpdi5zaG93KGcsJC5kYXRlcGlja2VyLl9nZXQoYiwic2hvd09wdGlvbnMiKSxoLGkpOmIuZHBEaXZbZ3x8InNob3ciXShnP2g6bnVsbCxpKSwoIWd8fCFoKSYmaSgpLGIuaW5wdXQuaXMoIjp2aXNpYmxlIikmJiFiLmlucHV0LmlzKCI6ZGlzYWJsZWQiKSYmYi5pbnB1dC5mb2N1cygpLCQuZGF0ZXBpY2tlci5fY3VySW5zdD1ifX0sX3VwZGF0ZURhdGVwaWNrZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztiLm1heFJvd3M9NDt2YXIgYz0kLmRhdGVwaWNrZXIuX2dldEJvcmRlcnMoYS5kcERpdik7aW5zdEFjdGl2ZT1hLGEuZHBEaXYuZW1wdHkoKS5hcHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKGEpKSx0aGlzLl9hdHRhY2hIYW5kbGVycyhhKTt2YXIgZD1hLmRwRGl2LmZpbmQoImlmcmFtZS51aS1kYXRlcGlja2VyLWNvdmVyIik7IWQubGVuZ3RofHxkLmNzcyh7bGVmdDotY1swXSx0b3A6LWNbMV0sd2lkdGg6YS5kcERpdi5vdXRlcldpZHRoKCksaGVpZ2h0OmEuZHBEaXYub3V0ZXJIZWlnaHQoKX0pLGEuZHBEaXYuZmluZCgiLiIrdGhpcy5fZGF5T3ZlckNsYXNzKyIgYSIpLm1vdXNlb3ZlcigpO3ZhciBlPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGEpLGY9ZVsxXSxnPTE3O2EuZHBEaXYucmVtb3ZlQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktMiB1aS1kYXRlcGlja2VyLW11bHRpLTMgdWktZGF0ZXBpY2tlci1tdWx0aS00Iikud2lkdGgoIiIpLGY+MSYmYS5kcERpdi5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0iK2YpLmNzcygid2lkdGgiLGcqZisiZW0iKSxhLmRwRGl2WyhlWzBdIT0xfHxlWzFdIT0xPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1tdWx0aSIpLGEuZHBEaXZbKHRoaXMuX2dldChhLCJpc1JUTCIpPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1ydGwiKSxhPT0kLmRhdGVwaWNrZXIuX2N1ckluc3QmJiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmEuaW5wdXQmJmEuaW5wdXQuaXMoIjp2aXNpYmxlIikmJiFhLmlucHV0LmlzKCI6ZGlzYWJsZWQiKSYmYS5pbnB1dFswXSE9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmYS5pbnB1dC5mb2N1cygpO2lmKGEueWVhcnNodG1sKXt2YXIgaD1hLnllYXJzaHRtbDtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aD09PWEueWVhcnNodG1sJiZhLnllYXJzaHRtbCYmYS5kcERpdi5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyOmZpcnN0IikucmVwbGFjZVdpdGgoYS55ZWFyc2h0bWwpLGg9YS55ZWFyc2h0bWw9bnVsbH0sMCl9fSxfZ2V0Qm9yZGVyczpmdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXtyZXR1cm57dGhpbjoxLG1lZGl1bToyLHRoaWNrOjN9W2FdfHxhfTtyZXR1cm5bcGFyc2VGbG9hdChiKGEuY3NzKCJib3JkZXItbGVmdC13aWR0aCIpKSkscGFyc2VGbG9hdChiKGEuY3NzKCJib3JkZXItdG9wLXdpZHRoIikpKV19LF9jaGVja09mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5kcERpdi5vdXRlcldpZHRoKCksZT1hLmRwRGl2Lm91dGVySGVpZ2h0KCksZj1hLmlucHV0P2EuaW5wdXQub3V0ZXJXaWR0aCgpOjAsZz1hLmlucHV0P2EuaW5wdXQub3V0ZXJIZWlnaHQoKTowLGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKyhjPzA6JChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKSxpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQrKGM/MDokKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk7cmV0dXJuIGIubGVmdC09dGhpcy5fZ2V0KGEsImlzUlRMIik/ZC1mOjAsYi5sZWZ0LT1jJiZiLmxlZnQ9PWEuaW5wdXQub2Zmc2V0KCkubGVmdD8kKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCk6MCxiLnRvcC09YyYmYi50b3A9PWEuaW5wdXQub2Zmc2V0KCkudG9wK2c/JChkb2N1bWVudCkuc2Nyb2xsVG9wKCk6MCxiLmxlZnQtPU1hdGgubWluKGIubGVmdCxiLmxlZnQrZD5oJiZoPmQ/TWF0aC5hYnMoYi5sZWZ0K2QtaCk6MCksYi50b3AtPU1hdGgubWluKGIudG9wLGIudG9wK2U+aSYmaT5lP01hdGguYWJzKGUrZyk6MCksYn0sX2ZpbmRQb3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0SW5zdChhKSxjPXRoaXMuX2dldChiLCJpc1JUTCIpO3doaWxlKGEmJihhLnR5cGU9PSJoaWRkZW4ifHxhLm5vZGVUeXBlIT0xfHwkLmV4cHIuZmlsdGVycy5oaWRkZW4oYSkpKWE9YVtjPyJwcmV2aW91c1NpYmxpbmciOiJuZXh0U2libGluZyJdO3ZhciBkPSQoYSkub2Zmc2V0KCk7cmV0dXJuW2QubGVmdCxkLnRvcF19LF9oaWRlRGF0ZXBpY2tlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9jdXJJbnN0O2lmKCFifHxhJiZiIT0kLmRhdGEoYSxQUk9QX05BTUUpKXJldHVybjtpZih0aGlzLl9kYXRlcGlja2VyU2hvd2luZyl7dmFyIGM9dGhpcy5fZ2V0KGIsInNob3dBbmltIiksZD10aGlzLl9nZXQoYiwiZHVyYXRpb24iKSxlPWZ1bmN0aW9uKCl7JC5kYXRlcGlja2VyLl90aWR5RGlhbG9nKGIpfTskLmVmZmVjdHMmJiQuZWZmZWN0c1tjXT9iLmRwRGl2LmhpZGUoYywkLmRhdGVwaWNrZXIuX2dldChiLCJzaG93T3B0aW9ucyIpLGQsZSk6Yi5kcERpdltjPT0ic2xpZGVEb3duIj8ic2xpZGVVcCI6Yz09ImZhZGVJbiI/ImZhZGVPdXQiOiJoaWRlIl0oYz9kOm51bGwsZSksY3x8ZSgpLHRoaXMuX2RhdGVwaWNrZXJTaG93aW5nPSExO3ZhciBmPXRoaXMuX2dldChiLCJvbkNsb3NlIik7ZiYmZi5hcHBseShiLmlucHV0P2IuaW5wdXRbMF06bnVsbCxbYi5pbnB1dD9iLmlucHV0LnZhbCgpOiIiLGJdKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCx0aGlzLl9pbkRpYWxvZyYmKHRoaXMuX2RpYWxvZ0lucHV0LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiIwIix0b3A6Ii0xMDBweCJ9KSwkLmJsb2NrVUkmJigkLnVuYmxvY2tVSSgpLCQoImJvZHkiKS5hcHBlbmQodGhpcy5kcERpdikpKSx0aGlzLl9pbkRpYWxvZz0hMX19LF90aWR5RGlhbG9nOmZ1bmN0aW9uKGEpe2EuZHBEaXYucmVtb3ZlQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLnVuYmluZCgiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKX0sX2NoZWNrRXh0ZXJuYWxDbGljazpmdW5jdGlvbihhKXtpZighJC5kYXRlcGlja2VyLl9jdXJJbnN0KXJldHVybjt2YXIgYj0kKGEudGFyZ2V0KSxjPSQuZGF0ZXBpY2tlci5fZ2V0SW5zdChiWzBdKTsoYlswXS5pZCE9JC5kYXRlcGlja2VyLl9tYWluRGl2SWQmJmIucGFyZW50cygiIyIrJC5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aD09MCYmIWIuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkmJiFiLmNsb3Nlc3QoIi4iKyQuZGF0ZXBpY2tlci5fdHJpZ2dlckNsYXNzKS5sZW5ndGgmJiQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJighJC5kYXRlcGlja2VyLl9pbkRpYWxvZ3x8ISQuYmxvY2tVSSl8fGIuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkmJiQuZGF0ZXBpY2tlci5fY3VySW5zdCE9YykmJiQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKX0sX2FkanVzdERhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSQoYSksZT10aGlzLl9nZXRJbnN0KGRbMF0pO2lmKHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKGRbMF0pKXJldHVybjt0aGlzLl9hZGp1c3RJbnN0RGF0ZShlLGIrKGM9PSJNIj90aGlzLl9nZXQoZSwic2hvd0N1cnJlbnRBdFBvcyIpOjApLGMpLHRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoZSl9LF9nb3RvVG9kYXk6ZnVuY3Rpb24oYSl7dmFyIGI9JChhKSxjPXRoaXMuX2dldEluc3QoYlswXSk7aWYodGhpcy5fZ2V0KGMsImdvdG9DdXJyZW50IikmJmMuY3VycmVudERheSljLnNlbGVjdGVkRGF5PWMuY3VycmVudERheSxjLmRyYXdNb250aD1jLnNlbGVjdGVkTW9udGg9Yy5jdXJyZW50TW9udGgsYy5kcmF3WWVhcj1jLnNlbGVjdGVkWWVhcj1jLmN1cnJlbnRZZWFyO2Vsc2V7dmFyIGQ9bmV3IERhdGU7Yy5zZWxlY3RlZERheT1kLmdldERhdGUoKSxjLmRyYXdNb250aD1jLnNlbGVjdGVkTW9udGg9ZC5nZXRNb250aCgpLGMuZHJhd1llYXI9Yy5zZWxlY3RlZFllYXI9ZC5nZXRGdWxsWWVhcigpfXRoaXMuX25vdGlmeUNoYW5nZShjKSx0aGlzLl9hZGp1c3REYXRlKGIpfSxfc2VsZWN0TW9udGhZZWFyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0kKGEpLGU9dGhpcy5fZ2V0SW5zdChkWzBdKTtlWyJzZWxlY3RlZCIrKGM9PSJNIj8iTW9udGgiOiJZZWFyIildPWVbImRyYXciKyhjPT0iTSI/Ik1vbnRoIjoiWWVhciIpXT1wYXJzZUludChiLm9wdGlvbnNbYi5zZWxlY3RlZEluZGV4XS52YWx1ZSwxMCksdGhpcy5fbm90aWZ5Q2hhbmdlKGUpLHRoaXMuX2FkanVzdERhdGUoZCl9LF9zZWxlY3REYXk6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9JChhKTtpZigkKGQpLmhhc0NsYXNzKHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzKXx8dGhpcy5faXNEaXNhYmxlZERhdGVwaWNrZXIoZVswXSkpcmV0dXJuO3ZhciBmPXRoaXMuX2dldEluc3QoZVswXSk7Zi5zZWxlY3RlZERheT1mLmN1cnJlbnREYXk9JCgiYSIsZCkuaHRtbCgpLGYuc2VsZWN0ZWRNb250aD1mLmN1cnJlbnRNb250aD1iLGYuc2VsZWN0ZWRZZWFyPWYuY3VycmVudFllYXI9Yyx0aGlzLl9zZWxlY3REYXRlKGEsdGhpcy5fZm9ybWF0RGF0ZShmLGYuY3VycmVudERheSxmLmN1cnJlbnRNb250aCxmLmN1cnJlbnRZZWFyKSl9LF9jbGVhckRhdGU6ZnVuY3Rpb24oYSl7dmFyIGI9JChhKSxjPXRoaXMuX2dldEluc3QoYlswXSk7dGhpcy5fc2VsZWN0RGF0ZShiLCIiKX0sX3NlbGVjdERhdGU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0kKGEpLGQ9dGhpcy5fZ2V0SW5zdChjWzBdKTtiPWIhPW51bGw/Yjp0aGlzLl9mb3JtYXREYXRlKGQpLGQuaW5wdXQmJmQuaW5wdXQudmFsKGIpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShkKTt2YXIgZT10aGlzLl9nZXQoZCwib25TZWxlY3QiKTtlP2UuYXBwbHkoZC5pbnB1dD9kLmlucHV0WzBdOm51bGwsW2IsZF0pOmQuaW5wdXQmJmQuaW5wdXQudHJpZ2dlcigiY2hhbmdlIiksZC5pbmxpbmU/dGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihkKToodGhpcy5faGlkZURhdGVwaWNrZXIoKSx0aGlzLl9sYXN0SW5wdXQ9ZC5pbnB1dFswXSx0eXBlb2YgZC5pbnB1dFswXSE9Im9iamVjdCImJmQuaW5wdXQuZm9jdXMoKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCl9LF91cGRhdGVBbHRlcm5hdGU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsImFsdEZpZWxkIik7aWYoYil7dmFyIGM9dGhpcy5fZ2V0KGEsImFsdEZvcm1hdCIpfHx0aGlzLl9nZXQoYSwiZGF0ZUZvcm1hdCIpLGQ9dGhpcy5fZ2V0RGF0ZShhKSxlPXRoaXMuZm9ybWF0RGF0ZShjLGQsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKTskKGIpLmVhY2goZnVuY3Rpb24oKXskKHRoaXMpLnZhbChlKX0pfX0sbm9XZWVrZW5kczpmdW5jdGlvbihhKXt2YXIgYj1hLmdldERheSgpO3JldHVybltiPjAmJmI8NiwiIl19LGlzbzg2MDFXZWVrOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBEYXRlKGEuZ2V0VGltZSgpKTtiLnNldERhdGUoYi5nZXREYXRlKCkrNC0oYi5nZXREYXkoKXx8NykpO3ZhciBjPWIuZ2V0VGltZSgpO3JldHVybiBiLnNldE1vbnRoKDApLGIuc2V0RGF0ZSgxKSxNYXRoLmZsb29yKE1hdGgucm91bmQoKGMtYikvODY0ZTUpLzcpKzF9LHBhcnNlRGF0ZTpmdW5jdGlvbihhLGIsYyl7aWYoYT09bnVsbHx8Yj09bnVsbCl0aHJvdyJJbnZhbGlkIGFyZ3VtZW50cyI7Yj10eXBlb2YgYj09Im9iamVjdCI/Yi50b1N0cmluZygpOmIrIiI7aWYoYj09IiIpcmV0dXJuIG51bGw7dmFyIGQ9KGM/Yy5zaG9ydFllYXJDdXRvZmY6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLnNob3J0WWVhckN1dG9mZjtkPXR5cGVvZiBkIT0ic3RyaW5nIj9kOihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJbnQoZCwxMCk7dmFyIGU9KGM/Yy5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LGY9KGM/Yy5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMsZz0oYz9jLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LGg9KGM/Yy5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLGk9LTEsaj0tMSxrPS0xLGw9LTEsbT0hMSxuPWZ1bmN0aW9uKGIpe3ZhciBjPXMrMTxhLmxlbmd0aCYmYS5jaGFyQXQocysxKT09YjtyZXR1cm4gYyYmcysrLGN9LG89ZnVuY3Rpb24oYSl7dmFyIGM9bihhKSxkPWE9PSJAIj8xNDphPT0iISI/MjA6YT09InkiJiZjPzQ6YT09Im8iPzM6MixlPW5ldyBSZWdFeHAoIl5cXGR7MSwiK2QrIn0iKSxmPWIuc3Vic3RyaW5nKHIpLm1hdGNoKGUpO2lmKCFmKXRocm93Ik1pc3NpbmcgbnVtYmVyIGF0IHBvc2l0aW9uICIrcjtyZXR1cm4gcis9ZlswXS5sZW5ndGgscGFyc2VJbnQoZlswXSwxMCl9LHA9ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSQubWFwKG4oYSk/ZDpjLGZ1bmN0aW9uKGEsYil7cmV0dXJuW1tiLGFdXX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4tKGFbMV0ubGVuZ3RoLWJbMV0ubGVuZ3RoKX0pLGY9LTE7JC5lYWNoKGUsZnVuY3Rpb24oYSxjKXt2YXIgZD1jWzFdO2lmKGIuc3Vic3RyKHIsZC5sZW5ndGgpLnRvTG93ZXJDYXNlKCk9PWQudG9Mb3dlckNhc2UoKSlyZXR1cm4gZj1jWzBdLHIrPWQubGVuZ3RoLCExfSk7aWYoZiE9LTEpcmV0dXJuIGYrMTt0aHJvdyJVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gIityfSxxPWZ1bmN0aW9uKCl7aWYoYi5jaGFyQXQocikhPWEuY2hhckF0KHMpKXRocm93IlVuZXhwZWN0ZWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiAiK3I7cisrfSxyPTA7Zm9yKHZhciBzPTA7czxhLmxlbmd0aDtzKyspaWYobSlhLmNoYXJBdChzKT09IiciJiYhbigiJyIpP209ITE6cSgpO2Vsc2Ugc3dpdGNoKGEuY2hhckF0KHMpKXtjYXNlImQiOms9bygiZCIpO2JyZWFrO2Nhc2UiRCI6cCgiRCIsZSxmKTticmVhaztjYXNlIm8iOmw9bygibyIpO2JyZWFrO2Nhc2UibSI6aj1vKCJtIik7YnJlYWs7Y2FzZSJNIjpqPXAoIk0iLGcsaCk7YnJlYWs7Y2FzZSJ5IjppPW8oInkiKTticmVhaztjYXNlIkAiOnZhciB0PW5ldyBEYXRlKG8oIkAiKSk7aT10LmdldEZ1bGxZZWFyKCksaj10LmdldE1vbnRoKCkrMSxrPXQuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiISI6dmFyIHQ9bmV3IERhdGUoKG8oIiEiKS10aGlzLl90aWNrc1RvMTk3MCkvMWU0KTtpPXQuZ2V0RnVsbFllYXIoKSxqPXQuZ2V0TW9udGgoKSsxLGs9dC5nZXREYXRlKCk7YnJlYWs7Y2FzZSInIjpuKCInIik/cSgpOm09ITA7YnJlYWs7ZGVmYXVsdDpxKCl9aWYocjxiLmxlbmd0aCl0aHJvdyJFeHRyYS91bnBhcnNlZCBjaGFyYWN0ZXJzIGZvdW5kIGluIGRhdGU6ICIrYi5zdWJzdHJpbmcocik7aT09LTE/aT0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCk6aTwxMDAmJihpKz0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCktKG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCsoaTw9ZD8wOi0xMDApKTtpZihsPi0xKXtqPTEsaz1sO2Rve3ZhciB1PXRoaXMuX2dldERheXNJbk1vbnRoKGksai0xKTtpZihrPD11KWJyZWFrO2orKyxrLT11fXdoaWxlKCEwKX12YXIgdD10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpLGotMSxrKSk7aWYodC5nZXRGdWxsWWVhcigpIT1pfHx0LmdldE1vbnRoKCkrMSE9anx8dC5nZXREYXRlKCkhPWspdGhyb3ciSW52YWxpZCBkYXRlIjtyZXR1cm4gdH0sQVRPTToieXktbW0tZGQiLENPT0tJRToiRCwgZGQgTSB5eSIsSVNPXzg2MDE6Inl5LW1tLWRkIixSRkNfODIyOiJELCBkIE0geSIsUkZDXzg1MDoiREQsIGRkLU0teSIsUkZDXzEwMzY6IkQsIGQgTSB5IixSRkNfMTEyMzoiRCwgZCBNIHl5IixSRkNfMjgyMjoiRCwgZCBNIHl5IixSU1M6IkQsIGQgTSB5IixUSUNLUzoiISIsVElNRVNUQU1QOiJAIixXM0M6Inl5LW1tLWRkIixfdGlja3NUbzE5NzA6KDcxODY4NStNYXRoLmZsb29yKDQ5Mi41KS1NYXRoLmZsb29yKDE5LjcpK01hdGguZmxvb3IoNC45MjUpKSoyNCo2MCo2MCoxZTcsZm9ybWF0RGF0ZTpmdW5jdGlvbihhLGIsYyl7aWYoIWIpcmV0dXJuIiI7dmFyIGQ9KGM/Yy5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LGU9KGM/Yy5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMsZj0oYz9jLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LGc9KGM/Yy5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLGg9ZnVuY3Rpb24oYil7dmFyIGM9bSsxPGEubGVuZ3RoJiZhLmNoYXJBdChtKzEpPT1iO3JldHVybiBjJiZtKyssY30saT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9IiIrYjtpZihoKGEpKXdoaWxlKGQubGVuZ3RoPGMpZD0iMCIrZDtyZXR1cm4gZH0saj1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gaChhKT9kW2JdOmNbYl19LGs9IiIsbD0hMTtpZihiKWZvcih2YXIgbT0wO208YS5sZW5ndGg7bSsrKWlmKGwpYS5jaGFyQXQobSk9PSInIiYmIWgoIiciKT9sPSExOmsrPWEuY2hhckF0KG0pO2Vsc2Ugc3dpdGNoKGEuY2hhckF0KG0pKXtjYXNlImQiOmsrPWkoImQiLGIuZ2V0RGF0ZSgpLDIpO2JyZWFrO2Nhc2UiRCI6ays9aigiRCIsYi5nZXREYXkoKSxkLGUpO2JyZWFrO2Nhc2UibyI6ays9aSgibyIsTWF0aC5yb3VuZCgoKG5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSxiLmdldE1vbnRoKCksYi5nZXREYXRlKCkpKS5nZXRUaW1lKCktKG5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSwwLDApKS5nZXRUaW1lKCkpLzg2NGU1KSwzKTticmVhaztjYXNlIm0iOmsrPWkoIm0iLGIuZ2V0TW9udGgoKSsxLDIpO2JyZWFrO2Nhc2UiTSI6ays9aigiTSIsYi5nZXRNb250aCgpLGYsZyk7YnJlYWs7Y2FzZSJ5IjprKz1oKCJ5Iik/Yi5nZXRGdWxsWWVhcigpOihiLmdldFllYXIoKSUxMDA8MTA/IjAiOiIiKStiLmdldFllYXIoKSUxMDA7YnJlYWs7Y2FzZSJAIjprKz1iLmdldFRpbWUoKTticmVhaztjYXNlIiEiOmsrPWIuZ2V0VGltZSgpKjFlNCt0aGlzLl90aWNrc1RvMTk3MDticmVhaztjYXNlIiciOmgoIiciKT9rKz0iJyI6bD0hMDticmVhaztkZWZhdWx0OmsrPWEuY2hhckF0KG0pfXJldHVybiBrfSxfcG9zc2libGVDaGFyczpmdW5jdGlvbihhKXt2YXIgYj0iIixjPSExLGQ9ZnVuY3Rpb24oYil7dmFyIGM9ZSsxPGEubGVuZ3RoJiZhLmNoYXJBdChlKzEpPT1iO3JldHVybiBjJiZlKyssY307Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspaWYoYylhLmNoYXJBdChlKT09IiciJiYhZCgiJyIpP2M9ITE6Yis9YS5jaGFyQXQoZSk7ZWxzZSBzd2l0Y2goYS5jaGFyQXQoZSkpe2Nhc2UiZCI6Y2FzZSJtIjpjYXNlInkiOmNhc2UiQCI6Yis9IjAxMjM0NTY3ODkiO2JyZWFrO2Nhc2UiRCI6Y2FzZSJNIjpyZXR1cm4gbnVsbDtjYXNlIiciOmQoIiciKT9iKz0iJyI6Yz0hMDticmVhaztkZWZhdWx0OmIrPWEuY2hhckF0KGUpfXJldHVybiBifSxfZ2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc2V0dGluZ3NbYl0hPT11bmRlZmluZWQ/YS5zZXR0aW5nc1tiXTp0aGlzLl9kZWZhdWx0c1tiXX0sX3NldERhdGVGcm9tRmllbGQ6ZnVuY3Rpb24oYSxiKXtpZihhLmlucHV0LnZhbCgpPT1hLmxhc3RWYWwpcmV0dXJuO3ZhciBjPXRoaXMuX2dldChhLCJkYXRlRm9ybWF0IiksZD1hLmxhc3RWYWw9YS5pbnB1dD9hLmlucHV0LnZhbCgpOm51bGwsZSxmO2U9Zj10aGlzLl9nZXREZWZhdWx0RGF0ZShhKTt2YXIgZz10aGlzLl9nZXRGb3JtYXRDb25maWcoYSk7dHJ5e2U9dGhpcy5wYXJzZURhdGUoYyxkLGcpfHxmfWNhdGNoKGgpe3RoaXMubG9nKGgpLGQ9Yj8iIjpkfWEuc2VsZWN0ZWREYXk9ZS5nZXREYXRlKCksYS5kcmF3TW9udGg9YS5zZWxlY3RlZE1vbnRoPWUuZ2V0TW9udGgoKSxhLmRyYXdZZWFyPWEuc2VsZWN0ZWRZZWFyPWUuZ2V0RnVsbFllYXIoKSxhLmN1cnJlbnREYXk9ZD9lLmdldERhdGUoKTowLGEuY3VycmVudE1vbnRoPWQ/ZS5nZXRNb250aCgpOjAsYS5jdXJyZW50WWVhcj1kP2UuZ2V0RnVsbFllYXIoKTowLHRoaXMuX2FkanVzdEluc3REYXRlKGEpfSxfZ2V0RGVmYXVsdERhdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3Jlc3RyaWN0TWluTWF4KGEsdGhpcy5fZGV0ZXJtaW5lRGF0ZShhLHRoaXMuX2dldChhLCJkZWZhdWx0RGF0ZSIpLG5ldyBEYXRlKSl9LF9kZXRlcm1pbmVEYXRlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZTtyZXR1cm4gYi5zZXREYXRlKGIuZ2V0RGF0ZSgpK2EpLGJ9LGU9ZnVuY3Rpb24oYil7dHJ5e3JldHVybiAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGEsImRhdGVGb3JtYXQiKSxiLCQuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKGEpKX1jYXRjaChjKXt9dmFyIGQ9KGIudG9Mb3dlckNhc2UoKS5tYXRjaCgvXmMvKT8kLmRhdGVwaWNrZXIuX2dldERhdGUoYSk6bnVsbCl8fG5ldyBEYXRlLGU9ZC5nZXRGdWxsWWVhcigpLGY9ZC5nZXRNb250aCgpLGc9ZC5nZXREYXRlKCksaD0vKFsrLV0/WzAtOV0rKVxzKihkfER8d3xXfG18TXx5fFkpPy9nLGk9aC5leGVjKGIpO3doaWxlKGkpe3N3aXRjaChpWzJdfHwiZCIpe2Nhc2UiZCI6Y2FzZSJEIjpnKz1wYXJzZUludChpWzFdLDEwKTticmVhaztjYXNlInciOmNhc2UiVyI6Zys9cGFyc2VJbnQoaVsxXSwxMCkqNzticmVhaztjYXNlIm0iOmNhc2UiTSI6Zis9cGFyc2VJbnQoaVsxXSwxMCksZz1NYXRoLm1pbihnLCQuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoZSxmKSk7YnJlYWs7Y2FzZSJ5IjpjYXNlIlkiOmUrPXBhcnNlSW50KGlbMV0sMTApLGc9TWF0aC5taW4oZywkLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGUsZikpfWk9aC5leGVjKGIpfXJldHVybiBuZXcgRGF0ZShlLGYsZyl9LGY9Yj09bnVsbHx8Yj09PSIiP2M6dHlwZW9mIGI9PSJzdHJpbmciP2UoYik6dHlwZW9mIGI9PSJudW1iZXIiP2lzTmFOKGIpP2M6ZChiKTpuZXcgRGF0ZShiLmdldFRpbWUoKSk7cmV0dXJuIGY9ZiYmZi50b1N0cmluZygpPT0iSW52YWxpZCBEYXRlIj9jOmYsZiYmKGYuc2V0SG91cnMoMCksZi5zZXRNaW51dGVzKDApLGYuc2V0U2Vjb25kcygwKSxmLnNldE1pbGxpc2Vjb25kcygwKSksdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoZil9LF9kYXlsaWdodFNhdmluZ0FkanVzdDpmdW5jdGlvbihhKXtyZXR1cm4gYT8oYS5zZXRIb3VycyhhLmdldEhvdXJzKCk+MTI/YS5nZXRIb3VycygpKzI6MCksYSk6bnVsbH0sX3NldERhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSFiLGU9YS5zZWxlY3RlZE1vbnRoLGY9YS5zZWxlY3RlZFllYXIsZz10aGlzLl9yZXN0cmljdE1pbk1heChhLHRoaXMuX2RldGVybWluZURhdGUoYSxiLG5ldyBEYXRlKSk7YS5zZWxlY3RlZERheT1hLmN1cnJlbnREYXk9Zy5nZXREYXRlKCksYS5kcmF3TW9udGg9YS5zZWxlY3RlZE1vbnRoPWEuY3VycmVudE1vbnRoPWcuZ2V0TW9udGgoKSxhLmRyYXdZZWFyPWEuc2VsZWN0ZWRZZWFyPWEuY3VycmVudFllYXI9Zy5nZXRGdWxsWWVhcigpLChlIT1hLnNlbGVjdGVkTW9udGh8fGYhPWEuc2VsZWN0ZWRZZWFyKSYmIWMmJnRoaXMuX25vdGlmeUNoYW5nZShhKSx0aGlzLl9hZGp1c3RJbnN0RGF0ZShhKSxhLmlucHV0JiZhLmlucHV0LnZhbChkPyIiOnRoaXMuX2Zvcm1hdERhdGUoYSkpfSxfZ2V0RGF0ZTpmdW5jdGlvbihhKXt2YXIgYj0hYS5jdXJyZW50WWVhcnx8YS5pbnB1dCYmYS5pbnB1dC52YWwoKT09IiI/bnVsbDp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShhLmN1cnJlbnRZZWFyLGEuY3VycmVudE1vbnRoLGEuY3VycmVudERheSkpO3JldHVybiBifSxfYXR0YWNoSGFuZGxlcnM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsInN0ZXBNb250aHMiKSxjPSIjIithLmlkLnJlcGxhY2UoL1xcXFwvZywiXFwiKTthLmRwRGl2LmZpbmQoIltkYXRhLWhhbmRsZXJdIikubWFwKGZ1bmN0aW9uKCl7dmFyIGE9e3ByZXY6ZnVuY3Rpb24oKXt3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShjLC1iLCJNIil9LG5leHQ6ZnVuY3Rpb24oKXt3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShjLCtiLCJNIil9LGhpZGU6ZnVuY3Rpb24oKXt3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKX0sdG9kYXk6ZnVuY3Rpb24oKXt3aW5kb3dbIkRQX2pRdWVyeV8iK2RwdXVpZF0uZGF0ZXBpY2tlci5fZ290b1RvZGF5KGMpfSxzZWxlY3REYXk6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX3NlbGVjdERheShjLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1tb250aCIpLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS15ZWFyIiksdGhpcyksITF9LHNlbGVjdE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvd1siRFBfalF1ZXJ5XyIrZHB1dWlkXS5kYXRlcGlja2VyLl9zZWxlY3RNb250aFllYXIoYyx0aGlzLCJNIiksITF9LHNlbGVjdFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihjLHRoaXMsIlkiKSwhMX19OyQodGhpcykuYmluZCh0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1ldmVudCIpLGFbdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtaGFuZGxlciIpXSl9KX0sX2dlbmVyYXRlSFRNTDpmdW5jdGlvbihhKXt2YXIgYj1uZXcgRGF0ZTtiPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSxiLmdldE1vbnRoKCksYi5nZXREYXRlKCkpKTt2YXIgYz10aGlzLl9nZXQoYSwiaXNSVEwiKSxkPXRoaXMuX2dldChhLCJzaG93QnV0dG9uUGFuZWwiKSxlPXRoaXMuX2dldChhLCJoaWRlSWZOb1ByZXZOZXh0IiksZj10aGlzLl9nZXQoYSwibmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCIpLGc9dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHMoYSksaD10aGlzLl9nZXQoYSwic2hvd0N1cnJlbnRBdFBvcyIpLGk9dGhpcy5fZ2V0KGEsInN0ZXBNb250aHMiKSxqPWdbMF0hPTF8fGdbMV0hPTEsaz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChhLmN1cnJlbnREYXk/bmV3IERhdGUoYS5jdXJyZW50WWVhcixhLmN1cnJlbnRNb250aCxhLmN1cnJlbnREYXkpOm5ldyBEYXRlKDk5OTksOSw5KSksbD10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1pbiIpLG09dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtYXgiKSxuPWEuZHJhd01vbnRoLWgsbz1hLmRyYXdZZWFyO248MCYmKG4rPTEyLG8tLSk7aWYobSl7dmFyIHA9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobS5nZXRGdWxsWWVhcigpLG0uZ2V0TW9udGgoKS1nWzBdKmdbMV0rMSxtLmdldERhdGUoKSkpO3A9bCYmcDxsP2w6cDt3aGlsZSh0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLG4sMSkpPnApbi0tLG48MCYmKG49MTEsby0tKX1hLmRyYXdNb250aD1uLGEuZHJhd1llYXI9bzt2YXIgcT10aGlzLl9nZXQoYSwicHJldlRleHQiKTtxPWY/dGhpcy5mb3JtYXREYXRlKHEsdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobyxuLWksMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhhKSk6cTt2YXIgcj10aGlzLl9jYW5BZGp1c3RNb250aChhLC0xLG8sbik/JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJwcmV2IiBkYXRhLWV2ZW50PSJjbGljayIgdGl0bGU9IicrcSsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJlIjoidyIpKyciPicrcSsiPC9zcGFuPjwvYT4iOmU/IiI6JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCIgdGl0bGU9IicrcSsnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJlIjoidyIpKyciPicrcSsiPC9zcGFuPjwvYT4iLHM9dGhpcy5fZ2V0KGEsIm5leHRUZXh0Iik7cz1mP3RoaXMuZm9ybWF0RGF0ZShzLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbitpLDEpKSx0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpOnM7dmFyIHQ9dGhpcy5fY2FuQWRqdXN0TW9udGgoYSwxLG8sbik/JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJuZXh0IiBkYXRhLWV2ZW50PSJjbGljayIgdGl0bGU9IicrcysnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJ3IjoiZSIpKyciPicrcysiPC9zcGFuPjwvYT4iOmU/IiI6JzxhIGNsYXNzPSJ1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCIgdGl0bGU9IicrcysnIj48c3BhbiBjbGFzcz0idWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0nKyhjPyJ3IjoiZSIpKyciPicrcysiPC9zcGFuPjwvYT4iLHU9dGhpcy5fZ2V0KGEsImN1cnJlbnRUZXh0Iiksdj10aGlzLl9nZXQoYSwiZ290b0N1cnJlbnQiKSYmYS5jdXJyZW50RGF5P2s6Yjt1PWY/dGhpcy5mb3JtYXREYXRlKHUsdix0aGlzLl9nZXRGb3JtYXRDb25maWcoYSkpOnU7dmFyIHc9YS5pbmxpbmU/IiI6JzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idWktZGF0ZXBpY2tlci1jbG9zZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXByaW1hcnkgdWktY29ybmVyLWFsbCIgZGF0YS1oYW5kbGVyPSJoaWRlIiBkYXRhLWV2ZW50PSJjbGljayI+Jyt0aGlzLl9nZXQoYSwiY2xvc2VUZXh0IikrIjwvYnV0dG9uPiIseD1kPyc8ZGl2IGNsYXNzPSJ1aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQiPicrKGM/dzoiIikrKHRoaXMuX2lzSW5SYW5nZShhLHYpPyc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InVpLWRhdGVwaWNrZXItY3VycmVudCB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXNlY29uZGFyeSB1aS1jb3JuZXItYWxsIiBkYXRhLWhhbmRsZXI9InRvZGF5IiBkYXRhLWV2ZW50PSJjbGljayI+Jyt1KyI8L2J1dHRvbj4iOiIiKSsoYz8iIjp3KSsiPC9kaXY+IjoiIix5PXBhcnNlSW50KHRoaXMuX2dldChhLCJmaXJzdERheSIpLDEwKTt5PWlzTmFOKHkpPzA6eTt2YXIgej10aGlzLl9nZXQoYSwic2hvd1dlZWsiKSxBPXRoaXMuX2dldChhLCJkYXlOYW1lcyIpLEI9dGhpcy5fZ2V0KGEsImRheU5hbWVzU2hvcnQiKSxDPXRoaXMuX2dldChhLCJkYXlOYW1lc01pbiIpLEQ9dGhpcy5fZ2V0KGEsIm1vbnRoTmFtZXMiKSxFPXRoaXMuX2dldChhLCJtb250aE5hbWVzU2hvcnQiKSxGPXRoaXMuX2dldChhLCJiZWZvcmVTaG93RGF5IiksRz10aGlzLl9nZXQoYSwic2hvd090aGVyTW9udGhzIiksSD10aGlzLl9nZXQoYSwic2VsZWN0T3RoZXJNb250aHMiKSxJPXRoaXMuX2dldChhLCJjYWxjdWxhdGVXZWVrIil8fHRoaXMuaXNvODYwMVdlZWssSj10aGlzLl9nZXREZWZhdWx0RGF0ZShhKSxLPSIiO2Zvcih2YXIgTD0wO0w8Z1swXTtMKyspe3ZhciBNPSIiO3RoaXMubWF4Um93cz00O2Zvcih2YXIgTj0wO048Z1sxXTtOKyspe3ZhciBPPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbixhLnNlbGVjdGVkRGF5KSksUD0iIHVpLWNvcm5lci1hbGwiLFE9IiI7aWYoail7USs9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItZ3JvdXAnO2lmKGdbMV0+MSlzd2l0Y2goTil7Y2FzZSAwOlErPSIgdWktZGF0ZXBpY2tlci1ncm91cC1maXJzdCIsUD0iIHVpLWNvcm5lci0iKyhjPyJyaWdodCI6ImxlZnQiKTticmVhaztjYXNlIGdbMV0tMTpRKz0iIHVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCIsUD0iIHVpLWNvcm5lci0iKyhjPyJsZWZ0IjoicmlnaHQiKTticmVhaztkZWZhdWx0OlErPSIgdWktZGF0ZXBpY2tlci1ncm91cC1taWRkbGUiLFA9IiJ9USs9JyI+J31RKz0nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgnK1ArJyI+JysoL2FsbHxsZWZ0Ly50ZXN0KFApJiZMPT0wP2M/dDpyOiIiKSsoL2FsbHxyaWdodC8udGVzdChQKSYmTD09MD9jP3I6dDoiIikrdGhpcy5fZ2VuZXJhdGVNb250aFllYXJIZWFkZXIoYSxuLG8sbCxtLEw+MHx8Tj4wLEQsRSkrJzwvZGl2Pjx0YWJsZSBjbGFzcz0idWktZGF0ZXBpY2tlci1jYWxlbmRhciI+PHRoZWFkPicrIjx0cj4iO3ZhciBSPXo/Jzx0aCBjbGFzcz0idWktZGF0ZXBpY2tlci13ZWVrLWNvbCI+Jyt0aGlzLl9nZXQoYSwid2Vla0hlYWRlciIpKyI8L3RoPiI6IiI7Zm9yKHZhciBTPTA7Uzw3O1MrKyl7dmFyIFQ9KFMreSklNztSKz0iPHRoIisoKFMreSs2KSU3Pj01PycgY2xhc3M9InVpLWRhdGVwaWNrZXItd2Vlay1lbmQiJzoiIikrIj4iKyc8c3BhbiB0aXRsZT0iJytBW1RdKyciPicrQ1tUXSsiPC9zcGFuPjwvdGg+In1RKz1SKyI8L3RyPjwvdGhlYWQ+PHRib2R5PiI7dmFyIFU9dGhpcy5fZ2V0RGF5c0luTW9udGgobyxuKTtvPT1hLnNlbGVjdGVkWWVhciYmbj09YS5zZWxlY3RlZE1vbnRoJiYoYS5zZWxlY3RlZERheT1NYXRoLm1pbihhLnNlbGVjdGVkRGF5LFUpKTt2YXIgVj0odGhpcy5fZ2V0Rmlyc3REYXlPZk1vbnRoKG8sbikteSs3KSU3LFc9TWF0aC5jZWlsKChWK1UpLzcpLFg9aj90aGlzLm1heFJvd3M+Vz90aGlzLm1heFJvd3M6VzpXO3RoaXMubWF4Um93cz1YO3ZhciBZPXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKG8sbiwxLVYpKTtmb3IodmFyIFo9MDtaPFg7WisrKXtRKz0iPHRyPiI7dmFyIF89ej8nPHRkIGNsYXNzPSJ1aS1kYXRlcGlja2VyLXdlZWstY29sIj4nK3RoaXMuX2dldChhLCJjYWxjdWxhdGVXZWVrIikoWSkrIjwvdGQ+IjoiIjtmb3IodmFyIFM9MDtTPDc7UysrKXt2YXIgYmE9Rj9GLmFwcGx5KGEuaW5wdXQ/YS5pbnB1dFswXTpudWxsLFtZXSk6WyEwLCIiXSxiYj1ZLmdldE1vbnRoKCkhPW4sYmM9YmImJiFIfHwhYmFbMF18fGwmJlk8bHx8bSYmWT5tO18rPSc8dGQgY2xhc3M9IicrKChTK3krNiklNz49NT8iIHVpLWRhdGVwaWNrZXItd2Vlay1lbmQiOiIiKSsoYmI/IiB1aS1kYXRlcGlja2VyLW90aGVyLW1vbnRoIjoiIikrKFkuZ2V0VGltZSgpPT1PLmdldFRpbWUoKSYmbj09YS5zZWxlY3RlZE1vbnRoJiZhLl9rZXlFdmVudHx8Si5nZXRUaW1lKCk9PVkuZ2V0VGltZSgpJiZKLmdldFRpbWUoKT09Ty5nZXRUaW1lKCk/IiAiK3RoaXMuX2RheU92ZXJDbGFzczoiIikrKGJjPyIgIit0aGlzLl91bnNlbGVjdGFibGVDbGFzcysiIHVpLXN0YXRlLWRpc2FibGVkIjoiIikrKGJiJiYhRz8iIjoiICIrYmFbMV0rKFkuZ2V0VGltZSgpPT1rLmdldFRpbWUoKT8iICIrdGhpcy5fY3VycmVudENsYXNzOiIiKSsoWS5nZXRUaW1lKCk9PWIuZ2V0VGltZSgpPyIgdWktZGF0ZXBpY2tlci10b2RheSI6IiIpKSsnIicrKCghYmJ8fEcpJiZiYVsyXT8nIHRpdGxlPSInK2JhWzJdKyciJzoiIikrKGJjPyIiOicgZGF0YS1oYW5kbGVyPSJzZWxlY3REYXkiIGRhdGEtZXZlbnQ9ImNsaWNrIiBkYXRhLW1vbnRoPSInK1kuZ2V0TW9udGgoKSsnIiBkYXRhLXllYXI9IicrWS5nZXRGdWxsWWVhcigpKyciJykrIj4iKyhiYiYmIUc/IiYjeGEwOyI6YmM/JzxzcGFuIGNsYXNzPSJ1aS1zdGF0ZS1kZWZhdWx0Ij4nK1kuZ2V0RGF0ZSgpKyI8L3NwYW4+IjonPGEgY2xhc3M9InVpLXN0YXRlLWRlZmF1bHQnKyhZLmdldFRpbWUoKT09Yi5nZXRUaW1lKCk/IiB1aS1zdGF0ZS1oaWdobGlnaHQiOiIiKSsoWS5nZXRUaW1lKCk9PWsuZ2V0VGltZSgpPyIgdWktc3RhdGUtYWN0aXZlIjoiIikrKGJiPyIgdWktcHJpb3JpdHktc2Vjb25kYXJ5IjoiIikrJyIgaHJlZj0iIyI+JytZLmdldERhdGUoKSsiPC9hPiIpKyI8L3RkPiIsWS5zZXREYXRlKFkuZ2V0RGF0ZSgpKzEpLFk9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QoWSl9USs9XysiPC90cj4ifW4rKyxuPjExJiYobj0wLG8rKyksUSs9IjwvdGJvZHk+PC90YWJsZT4iKyhqPyI8L2Rpdj4iKyhnWzBdPjAmJk49PWdbMV0tMT8nPGRpdiBjbGFzcz0idWktZGF0ZXBpY2tlci1yb3ctYnJlYWsiPjwvZGl2Pic6IiIpOiIiKSxNKz1RfUsrPU19cmV0dXJuIEsrPXgrKCQuYnJvd3Nlci5tc2llJiZwYXJzZUludCgkLmJyb3dzZXIudmVyc2lvbiwxMCk8NyYmIWEuaW5saW5lPyc8aWZyYW1lIHNyYz0iamF2YXNjcmlwdDpmYWxzZTsiIGNsYXNzPSJ1aS1kYXRlcGlja2VyLWNvdmVyIiBmcmFtZWJvcmRlcj0iMCI+PC9pZnJhbWU+JzoiIiksYS5fa2V5RXZlbnQ9ITEsS30sX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7dmFyIGk9dGhpcy5fZ2V0KGEsImNoYW5nZU1vbnRoIiksaj10aGlzLl9nZXQoYSwiY2hhbmdlWWVhciIpLGs9dGhpcy5fZ2V0KGEsInNob3dNb250aEFmdGVyWWVhciIpLGw9JzxkaXYgY2xhc3M9InVpLWRhdGVwaWNrZXItdGl0bGUiPicsbT0iIjtpZihmfHwhaSltKz0nPHNwYW4gY2xhc3M9InVpLWRhdGVwaWNrZXItbW9udGgiPicrZ1tiXSsiPC9zcGFuPiI7ZWxzZXt2YXIgbj1kJiZkLmdldEZ1bGxZZWFyKCk9PWMsbz1lJiZlLmdldEZ1bGxZZWFyKCk9PWM7bSs9JzxzZWxlY3QgY2xhc3M9InVpLWRhdGVwaWNrZXItbW9udGgiIGRhdGEtaGFuZGxlcj0ic2VsZWN0TW9udGgiIGRhdGEtZXZlbnQ9ImNoYW5nZSI+Jztmb3IodmFyIHA9MDtwPDEyO3ArKykoIW58fHA+PWQuZ2V0TW9udGgoKSkmJighb3x8cDw9ZS5nZXRNb250aCgpKSYmKG0rPSc8b3B0aW9uIHZhbHVlPSInK3ArJyInKyhwPT1iPycgc2VsZWN0ZWQ9InNlbGVjdGVkIic6IiIpKyI+IitoW3BdKyI8L29wdGlvbj4iKTttKz0iPC9zZWxlY3Q+In1rfHwobCs9bSsoZnx8IWl8fCFqPyImI3hhMDsiOiIiKSk7aWYoIWEueWVhcnNodG1sKXthLnllYXJzaHRtbD0iIjtpZihmfHwhailsKz0nPHNwYW4gY2xhc3M9InVpLWRhdGVwaWNrZXIteWVhciI+JytjKyI8L3NwYW4+IjtlbHNle3ZhciBxPXRoaXMuX2dldChhLCJ5ZWFyUmFuZ2UiKS5zcGxpdCgiOiIpLHI9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLHM9ZnVuY3Rpb24oYSl7dmFyIGI9YS5tYXRjaCgvY1srLV0uKi8pP2MrcGFyc2VJbnQoYS5zdWJzdHJpbmcoMSksMTApOmEubWF0Y2goL1srLV0uKi8pP3IrcGFyc2VJbnQoYSwxMCk6cGFyc2VJbnQoYSwxMCk7cmV0dXJuIGlzTmFOKGIpP3I6Yn0sdD1zKHFbMF0pLHU9TWF0aC5tYXgodCxzKHFbMV18fCIiKSk7dD1kP01hdGgubWF4KHQsZC5nZXRGdWxsWWVhcigpKTp0LHU9ZT9NYXRoLm1pbih1LGUuZ2V0RnVsbFllYXIoKSk6dSxhLnllYXJzaHRtbCs9JzxzZWxlY3QgY2xhc3M9InVpLWRhdGVwaWNrZXIteWVhciIgZGF0YS1oYW5kbGVyPSJzZWxlY3RZZWFyIiBkYXRhLWV2ZW50PSJjaGFuZ2UiPic7Zm9yKDt0PD11O3QrKylhLnllYXJzaHRtbCs9JzxvcHRpb24gdmFsdWU9IicrdCsnIicrKHQ9PWM/JyBzZWxlY3RlZD0ic2VsZWN0ZWQiJzoiIikrIj4iK3QrIjwvb3B0aW9uPiI7YS55ZWFyc2h0bWwrPSI8L3NlbGVjdD4iLGwrPWEueWVhcnNodG1sLGEueWVhcnNodG1sPW51bGx9fXJldHVybiBsKz10aGlzLl9nZXQoYSwieWVhclN1ZmZpeCIpLGsmJihsKz0oZnx8IWl8fCFqPyImI3hhMDsiOiIiKSttKSxsKz0iPC9kaXY+IixsfSxfYWRqdXN0SW5zdERhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZHJhd1llYXIrKGM9PSJZIj9iOjApLGU9YS5kcmF3TW9udGgrKGM9PSJNIj9iOjApLGY9TWF0aC5taW4oYS5zZWxlY3RlZERheSx0aGlzLl9nZXREYXlzSW5Nb250aChkLGUpKSsoYz09IkQiP2I6MCksZz10aGlzLl9yZXN0cmljdE1pbk1heChhLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGQsZSxmKSkpO2Euc2VsZWN0ZWREYXk9Zy5nZXREYXRlKCksYS5kcmF3TW9udGg9YS5zZWxlY3RlZE1vbnRoPWcuZ2V0TW9udGgoKSxhLmRyYXdZZWFyPWEuc2VsZWN0ZWRZZWFyPWcuZ2V0RnVsbFllYXIoKSwoYz09Ik0ifHxjPT0iWSIpJiZ0aGlzLl9ub3RpZnlDaGFuZ2UoYSl9LF9yZXN0cmljdE1pbk1heDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWluIiksZD10aGlzLl9nZXRNaW5NYXhEYXRlKGEsIm1heCIpLGU9YyYmYjxjP2M6YjtyZXR1cm4gZT1kJiZlPmQ/ZDplLGV9LF9ub3RpZnlDaGFuZ2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsIm9uQ2hhbmdlTW9udGhZZWFyIik7YiYmYi5hcHBseShhLmlucHV0P2EuaW5wdXRbMF06bnVsbCxbYS5zZWxlY3RlZFllYXIsYS5zZWxlY3RlZE1vbnRoKzEsYV0pfSxfZ2V0TnVtYmVyT2ZNb250aHM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsIm51bWJlck9mTW9udGhzIik7cmV0dXJuIGI9PW51bGw/WzEsMV06dHlwZW9mIGI9PSJudW1iZXIiP1sxLGJdOmJ9LF9nZXRNaW5NYXhEYXRlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2RldGVybWluZURhdGUoYSx0aGlzLl9nZXQoYSxiKyJEYXRlIiksbnVsbCl9LF9nZXREYXlzSW5Nb250aDpmdW5jdGlvbihhLGIpe3JldHVybiAzMi10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShhLGIsMzIpKS5nZXREYXRlKCl9LF9nZXRGaXJzdERheU9mTW9udGg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4obmV3IERhdGUoYSxiLDEpKS5nZXREYXkoKX0sX2NhbkFkanVzdE1vbnRoOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGEpLGY9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoYyxkKyhiPDA/YjplWzBdKmVbMV0pLDEpKTtyZXR1cm4gYjwwJiZmLnNldERhdGUodGhpcy5fZ2V0RGF5c0luTW9udGgoZi5nZXRGdWxsWWVhcigpLGYuZ2V0TW9udGgoKSkpLHRoaXMuX2lzSW5SYW5nZShhLGYpfSxfaXNJblJhbmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fZ2V0TWluTWF4RGF0ZShhLCJtaW4iKSxkPXRoaXMuX2dldE1pbk1heERhdGUoYSwibWF4Iik7cmV0dXJuKCFjfHxiLmdldFRpbWUoKT49Yy5nZXRUaW1lKCkpJiYoIWR8fGIuZ2V0VGltZSgpPD1kLmdldFRpbWUoKSl9LF9nZXRGb3JtYXRDb25maWc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fZ2V0KGEsInNob3J0WWVhckN1dG9mZiIpO3JldHVybiBiPXR5cGVvZiBiIT0ic3RyaW5nIj9iOihuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArcGFyc2VJbnQoYiwxMCkse3Nob3J0WWVhckN1dG9mZjpiLGRheU5hbWVzU2hvcnQ6dGhpcy5fZ2V0KGEsImRheU5hbWVzU2hvcnQiKSxkYXlOYW1lczp0aGlzLl9nZXQoYSwiZGF5TmFtZXMiKSxtb250aE5hbWVzU2hvcnQ6dGhpcy5fZ2V0KGEsIm1vbnRoTmFtZXNTaG9ydCIpLG1vbnRoTmFtZXM6dGhpcy5fZ2V0KGEsIm1vbnRoTmFtZXMiKX19LF9mb3JtYXREYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2J8fChhLmN1cnJlbnREYXk9YS5zZWxlY3RlZERheSxhLmN1cnJlbnRNb250aD1hLnNlbGVjdGVkTW9udGgsYS5jdXJyZW50WWVhcj1hLnNlbGVjdGVkWWVhcik7dmFyIGU9Yj90eXBlb2YgYj09Im9iamVjdCI/Yjp0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkLGMsYikpOnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGEuY3VycmVudFllYXIsYS5jdXJyZW50TW9udGgsYS5jdXJyZW50RGF5KSk7cmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9nZXQoYSwiZGF0ZUZvcm1hdCIpLGUsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGEpKX19KSwkLmZuLmRhdGVwaWNrZXI9ZnVuY3Rpb24oYSl7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzOyQuZGF0ZXBpY2tlci5pbml0aWFsaXplZHx8KCQoZG9jdW1lbnQpLm1vdXNlZG93bigkLmRhdGVwaWNrZXIuX2NoZWNrRXh0ZXJuYWxDbGljaykuZmluZCgiYm9keSIpLmFwcGVuZCgkLmRhdGVwaWNrZXIuZHBEaXYpLCQuZGF0ZXBpY2tlci5pbml0aWFsaXplZD0hMCk7dmFyIGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0eXBlb2YgYSE9InN0cmluZyJ8fGEhPSJpc0Rpc2FibGVkIiYmYSE9ImdldERhdGUiJiZhIT0id2lkZ2V0Ij9hPT0ib3B0aW9uIiYmYXJndW1lbnRzLmxlbmd0aD09MiYmdHlwZW9mIGFyZ3VtZW50c1sxXT09InN0cmluZyI/JC5kYXRlcGlja2VyWyJfIithKyJEYXRlcGlja2VyIl0uYXBwbHkoJC5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoYikpOnRoaXMuZWFjaChmdW5jdGlvbigpe3R5cGVvZiBhPT0ic3RyaW5nIj8kLmRhdGVwaWNrZXJbIl8iK2ErIkRhdGVwaWNrZXIiXS5hcHBseSgkLmRhdGVwaWNrZXIsW3RoaXNdLmNvbmNhdChiKSk6JC5kYXRlcGlja2VyLl9hdHRhY2hEYXRlcGlja2VyKHRoaXMsYSl9KTokLmRhdGVwaWNrZXJbIl8iK2ErIkRhdGVwaWNrZXIiXS5hcHBseSgkLmRhdGVwaWNrZXIsW3RoaXNbMF1dLmNvbmNhdChiKSl9LCQuZGF0ZXBpY2tlcj1uZXcgRGF0ZXBpY2tlciwkLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITEsJC5kYXRlcGlja2VyLnV1aWQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksJC5kYXRlcGlja2VyLnZlcnNpb249IjEuOC4yMyIsd2luZG93WyJEUF9qUXVlcnlfIitkcHV1aWRdPSR9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS51aS5wcm9ncmVzc2Jhci5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLndpZGdldCgidWkucHJvZ3Jlc3NiYXIiLHtvcHRpb25zOnt2YWx1ZTowLG1heDoxMDB9LG1pbjowLF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikuYXR0cih7cm9sZToicHJvZ3Jlc3NiYXIiLCJhcmlhLXZhbHVlbWluIjp0aGlzLm1pbiwiYXJpYS12YWx1ZW1heCI6dGhpcy5vcHRpb25zLm1heCwiYXJpYS12YWx1ZW5vdyI6dGhpcy5fdmFsdWUoKX0pLHRoaXMudmFsdWVEaXY9YSgiPGRpdiBjbGFzcz0ndWktcHJvZ3Jlc3NiYXItdmFsdWUgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItbGVmdCc+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSx0aGlzLm9sZFZhbHVlPXRoaXMuX3ZhbHVlKCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtaW4iKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWF4IikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW5vdyIpLHRoaXMudmFsdWVEaXYucmVtb3ZlKCksYS5XaWRnZXQucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWI/dGhpcy5fdmFsdWUoKToodGhpcy5fc2V0T3B0aW9uKCJ2YWx1ZSIsYSksdGhpcyl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixjKXtiPT09InZhbHVlIiYmKHRoaXMub3B0aW9ucy52YWx1ZT1jLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX3ZhbHVlKCk9PT10aGlzLm9wdGlvbnMubWF4JiZ0aGlzLl90cmlnZ2VyKCJjb21wbGV0ZSIpKSxhLldpZGdldC5wcm90b3R5cGUuX3NldE9wdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF92YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy52YWx1ZTtyZXR1cm4gdHlwZW9mIGEhPSJudW1iZXIiJiYoYT0wKSxNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4LE1hdGgubWF4KHRoaXMubWluLGEpKX0sX3BlcmNlbnRhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKnRoaXMuX3ZhbHVlKCkvdGhpcy5vcHRpb25zLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmFsdWUoKSxiPXRoaXMuX3BlcmNlbnRhZ2UoKTt0aGlzLm9sZFZhbHVlIT09YSYmKHRoaXMub2xkVmFsdWU9YSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiKSksdGhpcy52YWx1ZURpdi50b2dnbGUoYT50aGlzLm1pbikudG9nZ2xlQ2xhc3MoInVpLWNvcm5lci1yaWdodCIsYT09PXRoaXMub3B0aW9ucy5tYXgpLndpZHRoKGIudG9GaXhlZCgwKSsiJSIpLHRoaXMuZWxlbWVudC5hdHRyKCJhcmlhLXZhbHVlbm93IixhKX19KSxhLmV4dGVuZChhLnVpLnByb2dyZXNzYmFyLHt2ZXJzaW9uOiIxLjguMjMifSl9KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmNvcmUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotalF1ZXJ5LmVmZmVjdHN8fGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiKXt2YXIgYztyZXR1cm4gYiYmYi5jb25zdHJ1Y3Rvcj09QXJyYXkmJmIubGVuZ3RoPT0zP2I6KGM9L3JnYlwoXHMqKFswLTldezEsM30pXHMqLFxzKihbMC05XXsxLDN9KVxzKixccyooWzAtOV17MSwzfSlccypcKS8uZXhlYyhiKSk/W3BhcnNlSW50KGNbMV0sMTApLHBhcnNlSW50KGNbMl0sMTApLHBhcnNlSW50KGNbM10sMTApXTooYz0vcmdiXChccyooWzAtOV0rKD86XC5bMC05XSspPylcJVxzKixccyooWzAtOV0rKD86XC5bMC05XSspPylcJVxzKixccyooWzAtOV0rKD86XC5bMC05XSspPylcJVxzKlwpLy5leGVjKGIpKT9bcGFyc2VGbG9hdChjWzFdKSoyLjU1LHBhcnNlRmxvYXQoY1syXSkqMi41NSxwYXJzZUZsb2F0KGNbM10pKjIuNTVdOihjPS8jKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pLy5leGVjKGIpKT9bcGFyc2VJbnQoY1sxXSwxNikscGFyc2VJbnQoY1syXSwxNikscGFyc2VJbnQoY1szXSwxNildOihjPS8jKFthLWZBLUYwLTldKShbYS1mQS1GMC05XSkoW2EtZkEtRjAtOV0pLy5leGVjKGIpKT9bcGFyc2VJbnQoY1sxXStjWzFdLDE2KSxwYXJzZUludChjWzJdK2NbMl0sMTYpLHBhcnNlSW50KGNbM10rY1szXSwxNildOihjPS9yZ2JhXCgwLCAwLCAwLCAwXCkvLmV4ZWMoYikpP2UudHJhbnNwYXJlbnQ6ZVthLnRyaW0oYikudG9Mb3dlckNhc2UoKV19ZnVuY3Rpb24gZChiLGQpe3ZhciBlO2Rve2U9KGEuY3VyQ1NTfHxhLmNzcykoYixkKTtpZihlIT0iIiYmZSE9InRyYW5zcGFyZW50Inx8YS5ub2RlTmFtZShiLCJib2R5IikpYnJlYWs7ZD0iYmFja2dyb3VuZENvbG9yIn13aGlsZShiPWIucGFyZW50Tm9kZSk7cmV0dXJuIGMoZSl9ZnVuY3Rpb24gaCgpe3ZhciBhPWRvY3VtZW50LmRlZmF1bHRWaWV3P2RvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKTp0aGlzLmN1cnJlbnRTdHlsZSxiPXt9LGMsZDtpZihhJiZhLmxlbmd0aCYmYVswXSYmYVthWzBdXSl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWM9YVtlXSx0eXBlb2YgYVtjXT09InN0cmluZyImJihkPWMucmVwbGFjZSgvXC0oXHcpL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSksYltkXT1hW2NdKX1lbHNlIGZvcihjIGluIGEpdHlwZW9mIGFbY109PSJzdHJpbmciJiYoYltjXT1hW2NdKTtyZXR1cm4gYn1mdW5jdGlvbiBpKGIpe3ZhciBjLGQ7Zm9yKGMgaW4gYilkPWJbY10sKGQ9PW51bGx8fGEuaXNGdW5jdGlvbihkKXx8YyBpbiBnfHwvc2Nyb2xsYmFyLy50ZXN0KGMpfHwhL2NvbG9yL2kudGVzdChjKSYmaXNOYU4ocGFyc2VGbG9hdChkKSkpJiZkZWxldGUgYltjXTtyZXR1cm4gYn1mdW5jdGlvbiBqKGEsYil7dmFyIGM9e186MH0sZDtmb3IoZCBpbiBiKWFbZF0hPWJbZF0mJihjW2RdPWJbZF0pO3JldHVybiBjfWZ1bmN0aW9uIGsoYixjLGQsZSl7dHlwZW9mIGI9PSJvYmplY3QiJiYoZT1jLGQ9bnVsbCxjPWIsYj1jLmVmZmVjdCksYS5pc0Z1bmN0aW9uKGMpJiYoZT1jLGQ9bnVsbCxjPXt9KTtpZih0eXBlb2YgYz09Im51bWJlciJ8fGEuZnguc3BlZWRzW2NdKWU9ZCxkPWMsYz17fTtyZXR1cm4gYS5pc0Z1bmN0aW9uKGQpJiYoZT1kLGQ9bnVsbCksYz1jfHx7fSxkPWR8fGMuZHVyYXRpb24sZD1hLmZ4Lm9mZj8wOnR5cGVvZiBkPT0ibnVtYmVyIj9kOmQgaW4gYS5meC5zcGVlZHM/YS5meC5zcGVlZHNbZF06YS5meC5zcGVlZHMuX2RlZmF1bHQsZT1lfHxjLmNvbXBsZXRlLFtiLGMsZCxlXX1mdW5jdGlvbiBsKGIpe3JldHVybiFifHx0eXBlb2YgYj09Im51bWJlciJ8fGEuZnguc3BlZWRzW2JdPyEwOnR5cGVvZiBiPT0ic3RyaW5nIiYmIWEuZWZmZWN0c1tiXT8hMDohMX1hLmVmZmVjdHM9e30sYS5lYWNoKFsiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJDb2xvciIsImNvbG9yIiwib3V0bGluZUNvbG9yIl0sZnVuY3Rpb24oYixlKXthLmZ4LnN0ZXBbZV09ZnVuY3Rpb24oYSl7YS5jb2xvckluaXR8fChhLnN0YXJ0PWQoYS5lbGVtLGUpLGEuZW5kPWMoYS5lbmQpLGEuY29sb3JJbml0PSEwKSxhLmVsZW0uc3R5bGVbZV09InJnYigiK01hdGgubWF4KE1hdGgubWluKHBhcnNlSW50KGEucG9zKihhLmVuZFswXS1hLnN0YXJ0WzBdKSthLnN0YXJ0WzBdLDEwKSwyNTUpLDApKyIsIitNYXRoLm1heChNYXRoLm1pbihwYXJzZUludChhLnBvcyooYS5lbmRbMV0tYS5zdGFydFsxXSkrYS5zdGFydFsxXSwxMCksMjU1KSwwKSsiLCIrTWF0aC5tYXgoTWF0aC5taW4ocGFyc2VJbnQoYS5wb3MqKGEuZW5kWzJdLWEuc3RhcnRbMl0pK2Euc3RhcnRbMl0sMTApLDI1NSksMCkrIikifX0pO3ZhciBlPXthcXVhOlswLDI1NSwyNTVdLGF6dXJlOlsyNDAsMjU1LDI1NV0sYmVpZ2U6WzI0NSwyNDUsMjIwXSxibGFjazpbMCwwLDBdLGJsdWU6WzAsMCwyNTVdLGJyb3duOlsxNjUsNDIsNDJdLGN5YW46WzAsMjU1LDI1NV0sZGFya2JsdWU6WzAsMCwxMzldLGRhcmtjeWFuOlswLDEzOSwxMzldLGRhcmtncmV5OlsxNjksMTY5LDE2OV0sZGFya2dyZWVuOlswLDEwMCwwXSxkYXJra2hha2k6WzE4OSwxODMsMTA3XSxkYXJrbWFnZW50YTpbMTM5LDAsMTM5XSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3XSxkYXJrb3JhbmdlOlsyNTUsMTQwLDBdLGRhcmtvcmNoaWQ6WzE1Myw1MCwyMDRdLGRhcmtyZWQ6WzEzOSwwLDBdLGRhcmtzYWxtb246WzIzMywxNTAsMTIyXSxkYXJrdmlvbGV0OlsxNDgsMCwyMTFdLGZ1Y2hzaWE6WzI1NSwwLDI1NV0sZ29sZDpbMjU1LDIxNSwwXSxncmVlbjpbMCwxMjgsMF0saW5kaWdvOls3NSwwLDEzMF0sa2hha2k6WzI0MCwyMzAsMTQwXSxsaWdodGJsdWU6WzE3MywyMTYsMjMwXSxsaWdodGN5YW46WzIyNCwyNTUsMjU1XSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NF0sbGlnaHRncmV5OlsyMTEsMjExLDIxMV0sbGlnaHRwaW5rOlsyNTUsMTgyLDE5M10sbGlnaHR5ZWxsb3c6WzI1NSwyNTUsMjI0XSxsaW1lOlswLDI1NSwwXSxtYWdlbnRhOlsyNTUsMCwyNTVdLG1hcm9vbjpbMTI4LDAsMF0sbmF2eTpbMCwwLDEyOF0sb2xpdmU6WzEyOCwxMjgsMF0sb3JhbmdlOlsyNTUsMTY1LDBdLHBpbms6WzI1NSwxOTIsMjAzXSxwdXJwbGU6WzEyOCwwLDEyOF0sdmlvbGV0OlsxMjgsMCwxMjhdLHJlZDpbMjU1LDAsMF0sc2lsdmVyOlsxOTIsMTkyLDE5Ml0sd2hpdGU6WzI1NSwyNTUsMjU1XSx5ZWxsb3c6WzI1NSwyNTUsMF0sdHJhbnNwYXJlbnQ6WzI1NSwyNTUsMjU1XX0sZj1bImFkZCIsInJlbW92ZSIsInRvZ2dsZSJdLGc9e2JvcmRlcjoxLGJvcmRlckJvdHRvbToxLGJvcmRlckNvbG9yOjEsYm9yZGVyTGVmdDoxLGJvcmRlclJpZ2h0OjEsYm9yZGVyVG9wOjEsYm9yZGVyV2lkdGg6MSxtYXJnaW46MSxwYWRkaW5nOjF9O2EuZWZmZWN0cy5hbmltYXRlQ2xhc3M9ZnVuY3Rpb24oYixjLGQsZSl7cmV0dXJuIGEuaXNGdW5jdGlvbihkKSYmKGU9ZCxkPW51bGwpLHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgZz1hKHRoaXMpLGs9Zy5hdHRyKCJzdHlsZSIpfHwiICIsbD1pKGguY2FsbCh0aGlzKSksbSxuPWcuYXR0cigiY2xhc3MiKXx8IiI7YS5lYWNoKGYsZnVuY3Rpb24oYSxjKXtiW2NdJiZnW2MrIkNsYXNzIl0oYltjXSl9KSxtPWkoaC5jYWxsKHRoaXMpKSxnLmF0dHIoImNsYXNzIixuKSxnLmFuaW1hdGUoaihsLG0pLHtxdWV1ZTohMSxkdXJhdGlvbjpjLGVhc2luZzpkLGNvbXBsZXRlOmZ1bmN0aW9uKCl7YS5lYWNoKGYsZnVuY3Rpb24oYSxjKXtiW2NdJiZnW2MrIkNsYXNzIl0oYltjXSl9KSx0eXBlb2YgZy5hdHRyKCJzdHlsZSIpPT0ib2JqZWN0Ij8oZy5hdHRyKCJzdHlsZSIpLmNzc1RleHQ9IiIsZy5hdHRyKCJzdHlsZSIpLmNzc1RleHQ9ayk6Zy5hdHRyKCJzdHlsZSIsayksZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS5kZXF1ZXVlKHRoaXMpfX0pfSl9LGEuZm4uZXh0ZW5kKHtfYWRkQ2xhc3M6YS5mbi5hZGRDbGFzcyxhZGRDbGFzczpmdW5jdGlvbihiLGMsZCxlKXtyZXR1cm4gYz9hLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmFwcGx5KHRoaXMsW3thZGQ6Yn0sYyxkLGVdKTp0aGlzLl9hZGRDbGFzcyhiKX0sX3JlbW92ZUNsYXNzOmEuZm4ucmVtb3ZlQ2xhc3MscmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYixjLGQsZSl7cmV0dXJuIGM/YS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7cmVtb3ZlOmJ9LGMsZCxlXSk6dGhpcy5fcmVtb3ZlQ2xhc3MoYil9LF90b2dnbGVDbGFzczphLmZuLnRvZ2dsZUNsYXNzLHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGMsZCxlLGYsZyl7cmV0dXJuIHR5cGVvZiBkPT0iYm9vbGVhbiJ8fGQ9PT1iP2U/YS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFtkP3thZGQ6Y306e3JlbW92ZTpjfSxlLGYsZ10pOnRoaXMuX3RvZ2dsZUNsYXNzKGMsZCk6YS5lZmZlY3RzLmFuaW1hdGVDbGFzcy5hcHBseSh0aGlzLFt7dG9nZ2xlOmN9LGQsZSxmXSl9LHN3aXRjaENsYXNzOmZ1bmN0aW9uKGIsYyxkLGUsZil7cmV0dXJuIGEuZWZmZWN0cy5hbmltYXRlQ2xhc3MuYXBwbHkodGhpcyxbe2FkZDpjLHJlbW92ZTpifSxkLGUsZl0pfX0pLGEuZXh0ZW5kKGEuZWZmZWN0cyx7dmVyc2lvbjoiMS44LjIzIixzYXZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspYltjXSE9PW51bGwmJmEuZGF0YSgiZWMuc3RvcmFnZS4iK2JbY10sYVswXS5zdHlsZVtiW2NdXSl9LHJlc3RvcmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdIT09bnVsbCYmYS5jc3MoYltjXSxhLmRhdGEoImVjLnN0b3JhZ2UuIitiW2NdKSl9LHNldE1vZGU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09InRvZ2dsZSImJihiPWEuaXMoIjpoaWRkZW4iKT8ic2hvdyI6ImhpZGUiKSxifSxnZXRCYXNlbGluZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ7c3dpdGNoKGFbMF0pe2Nhc2UidG9wIjpjPTA7YnJlYWs7Y2FzZSJtaWRkbGUiOmM9LjU7YnJlYWs7Y2FzZSJib3R0b20iOmM9MTticmVhaztkZWZhdWx0OmM9YVswXS9iLmhlaWdodH1zd2l0Y2goYVsxXSl7Y2FzZSJsZWZ0IjpkPTA7YnJlYWs7Y2FzZSJjZW50ZXIiOmQ9LjU7YnJlYWs7Y2FzZSJyaWdodCI6ZD0xO2JyZWFrO2RlZmF1bHQ6ZD1hWzFdL2Iud2lkdGh9cmV0dXJue3g6ZCx5OmN9fSxjcmVhdGVXcmFwcGVyOmZ1bmN0aW9uKGIpe2lmKGIucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKSlyZXR1cm4gYi5wYXJlbnQoKTt2YXIgYz17d2lkdGg6Yi5vdXRlcldpZHRoKCEwKSxoZWlnaHQ6Yi5vdXRlckhlaWdodCghMCksImZsb2F0IjpiLmNzcygiZmxvYXQiKX0sZD1hKCI8ZGl2PjwvZGl2PiIpLmFkZENsYXNzKCJ1aS1lZmZlY3RzLXdyYXBwZXIiKS5jc3Moe2ZvbnRTaXplOiIxMDAlIixiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsYm9yZGVyOiJub25lIixtYXJnaW46MCxwYWRkaW5nOjB9KSxlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7dHJ5e2UuaWR9Y2F0Y2goZil7ZT1kb2N1bWVudC5ib2R5fXJldHVybiBiLndyYXAoZCksKGJbMF09PT1lfHxhLmNvbnRhaW5zKGJbMF0sZSkpJiZhKGUpLmZvY3VzKCksZD1iLnBhcmVudCgpLGIuY3NzKCJwb3NpdGlvbiIpPT0ic3RhdGljIj8oZC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9KSxiLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pKTooYS5leHRlbmQoYyx7cG9zaXRpb246Yi5jc3MoInBvc2l0aW9uIiksekluZGV4OmIuY3NzKCJ6LWluZGV4Iil9KSxhLmVhY2goWyJ0b3AiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiXSxmdW5jdGlvbihhLGQpe2NbZF09Yi5jc3MoZCksaXNOYU4ocGFyc2VJbnQoY1tkXSwxMCkpJiYoY1tkXT0iYXV0byIpfSksYi5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsdG9wOjAsbGVmdDowLHJpZ2h0OiJhdXRvIixib3R0b206ImF1dG8ifSkpLGQuY3NzKGMpLnNob3coKX0scmVtb3ZlV3JhcHBlcjpmdW5jdGlvbihiKXt2YXIgYyxkPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7cmV0dXJuIGIucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKT8oYz1iLnBhcmVudCgpLnJlcGxhY2VXaXRoKGIpLChiWzBdPT09ZHx8YS5jb250YWlucyhiWzBdLGQpKSYmYShkKS5mb2N1cygpLGMpOmJ9LHNldFRyYW5zaXRpb246ZnVuY3Rpb24oYixjLGQsZSl7cmV0dXJuIGU9ZXx8e30sYS5lYWNoKGMsZnVuY3Rpb24oYSxjKXt2YXIgZj1iLmNzc1VuaXQoYyk7ZlswXT4wJiYoZVtjXT1mWzBdKmQrZlsxXSl9KSxlfX0pLGEuZm4uZXh0ZW5kKHtlZmZlY3Q6ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY9ay5hcHBseSh0aGlzLGFyZ3VtZW50cyksZz17b3B0aW9uczpmWzFdLGR1cmF0aW9uOmZbMl0sY2FsbGJhY2s6ZlszXX0saD1nLm9wdGlvbnMubW9kZSxpPWEuZWZmZWN0c1tiXTtyZXR1cm4gYS5meC5vZmZ8fCFpP2g/dGhpc1toXShnLmR1cmF0aW9uLGcuY2FsbGJhY2spOnRoaXMuZWFjaChmdW5jdGlvbigpe2cuY2FsbGJhY2smJmcuY2FsbGJhY2suY2FsbCh0aGlzKX0pOmkuY2FsbCh0aGlzLGcpfSxfc2hvdzphLmZuLnNob3csc2hvdzpmdW5jdGlvbihhKXtpZihsKGEpKXJldHVybiB0aGlzLl9zaG93LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYj1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYlsxXS5tb2RlPSJzaG93Iix0aGlzLmVmZmVjdC5hcHBseSh0aGlzLGIpfSxfaGlkZTphLmZuLmhpZGUsaGlkZTpmdW5jdGlvbihhKXtpZihsKGEpKXJldHVybiB0aGlzLl9oaWRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYj1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYlsxXS5tb2RlPSJoaWRlIix0aGlzLmVmZmVjdC5hcHBseSh0aGlzLGIpfSxfX3RvZ2dsZTphLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYil7aWYobChiKXx8dHlwZW9mIGI9PSJib29sZWFuInx8YS5pc0Z1bmN0aW9uKGIpKXJldHVybiB0aGlzLl9fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYz1rLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gY1sxXS5tb2RlPSJ0b2dnbGUiLHRoaXMuZWZmZWN0LmFwcGx5KHRoaXMsYyl9LGNzc1VuaXQ6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5jc3MoYiksZD1bXTtyZXR1cm4gYS5lYWNoKFsiZW0iLCJweCIsIiUiLCJwdCJdLGZ1bmN0aW9uKGEsYil7Yy5pbmRleE9mKGIpPjAmJihkPVtwYXJzZUZsb2F0KGMpLGJdKX0pLGR9fSk7dmFyIG09e307YS5lYWNoKFsiUXVhZCIsIkN1YmljIiwiUXVhcnQiLCJRdWludCIsIkV4cG8iXSxmdW5jdGlvbihhLGIpe21bYl09ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucG93KGIsYSsyKX19KSxhLmV4dGVuZChtLHtTaW5lOmZ1bmN0aW9uKGEpe3JldHVybiAxLU1hdGguY29zKGEqTWF0aC5QSS8yKX0sQ2lyYzpmdW5jdGlvbihhKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1hKmEpfSxFbGFzdGljOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09MHx8YT09PTE/YTotTWF0aC5wb3coMiw4KihhLTEpKSpNYXRoLnNpbigoKGEtMSkqODAtNy41KSpNYXRoLlBJLzE1KX0sQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gYSphKigzKmEtMil9LEJvdW5jZTpmdW5jdGlvbihhKXt2YXIgYixjPTQ7d2hpbGUoYTwoKGI9TWF0aC5wb3coMiwtLWMpKS0xKS8xMSk7cmV0dXJuIDEvTWF0aC5wb3coNCwzLWMpLTcuNTYyNSpNYXRoLnBvdygoYiozLTIpLzIyLWEsMil9fSksYS5lYWNoKG0sZnVuY3Rpb24oYixjKXthLmVhc2luZ1siZWFzZUluIitiXT1jLGEuZWFzaW5nWyJlYXNlT3V0IitiXT1mdW5jdGlvbihhKXtyZXR1cm4gMS1jKDEtYSl9LGEuZWFzaW5nWyJlYXNlSW5PdXQiK2JdPWZ1bmN0aW9uKGEpe3JldHVybiBhPC41P2MoYSoyKS8yOmMoYSotMisyKS8tMisxfX0pfShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmJsaW5kLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5ibGluZD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InZlcnRpY2FsIjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBnPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxoPWY9PSJ2ZXJ0aWNhbCI/ImhlaWdodCI6IndpZHRoIixpPWY9PSJ2ZXJ0aWNhbCI/Zy5oZWlnaHQoKTpnLndpZHRoKCk7ZT09InNob3ciJiZnLmNzcyhoLDApO3ZhciBqPXt9O2pbaF09ZT09InNob3ciP2k6MCxnLmFuaW1hdGUoaixiLmR1cmF0aW9uLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9KX0pfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LmVmZmVjdHMuYm91bmNlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5ib3VuY2U9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InVwIixnPWIub3B0aW9ucy5kaXN0YW5jZXx8MjAsaD1iLm9wdGlvbnMudGltZXN8fDUsaT1iLmR1cmF0aW9ufHwyNTA7L3Nob3d8aGlkZS8udGVzdChlKSYmZC5wdXNoKCJvcGFjaXR5IiksYS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKSxhLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKTt2YXIgaj1mPT0idXAifHxmPT0iZG93biI/InRvcCI6ImxlZnQiLGs9Zj09InVwInx8Zj09ImxlZnQiPyJwb3MiOiJuZWciLGc9Yi5vcHRpb25zLmRpc3RhbmNlfHwoaj09InRvcCI/Yy5vdXRlckhlaWdodCghMCkvMzpjLm91dGVyV2lkdGgoITApLzMpO2U9PSJzaG93IiYmYy5jc3MoIm9wYWNpdHkiLDApLmNzcyhqLGs9PSJwb3MiPy1nOmcpLGU9PSJoaWRlIiYmKGc9Zy8oaCoyKSksZSE9ImhpZGUiJiZoLS07aWYoZT09InNob3ciKXt2YXIgbD17b3BhY2l0eToxfTtsW2pdPShrPT0icG9zIj8iKz0iOiItPSIpK2csYy5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcpLGc9Zy8yLGgtLX1mb3IodmFyIG09MDttPGg7bSsrKXt2YXIgbj17fSxwPXt9O25bal09KGs9PSJwb3MiPyItPSI6Iis9IikrZyxwW2pdPShrPT0icG9zIj8iKz0iOiItPSIpK2csYy5hbmltYXRlKG4saS8yLGIub3B0aW9ucy5lYXNpbmcpLmFuaW1hdGUocCxpLzIsYi5vcHRpb25zLmVhc2luZyksZz1lPT0iaGlkZSI/ZyoyOmcvMn1pZihlPT0iaGlkZSIpe3ZhciBsPXtvcGFjaXR5OjB9O2xbal09KGs9PSJwb3MiPyItPSI6Iis9IikrZyxjLmFuaW1hdGUobCxpLzIsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2MuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX1lbHNle3ZhciBuPXt9LHA9e307bltqXT0oaz09InBvcyI/Ii09IjoiKz0iKStnLHBbal09KGs9PSJwb3MiPyIrPSI6Ii09IikrZyxjLmFuaW1hdGUobixpLzIsYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShwLGkvMixiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7YS5lZmZlY3RzLnJlc3RvcmUoYyxkKSxhLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihjKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pfWMucXVldWUoImZ4IixmdW5jdGlvbigpe2MuZGVxdWV1ZSgpfSksYy5kZXF1ZXVlKCl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmNsaXAuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmNsaXA9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8InZlcnRpY2FsIjthLmVmZmVjdHMuc2F2ZShjLGQpLGMuc2hvdygpO3ZhciBnPWEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiJ9KSxoPWNbMF0udGFnTmFtZT09IklNRyI/ZzpjLGk9e3NpemU6Zj09InZlcnRpY2FsIj8iaGVpZ2h0Ijoid2lkdGgiLHBvc2l0aW9uOmY9PSJ2ZXJ0aWNhbCI/InRvcCI6ImxlZnQifSxqPWY9PSJ2ZXJ0aWNhbCI/aC5oZWlnaHQoKTpoLndpZHRoKCk7ZT09InNob3ciJiYoaC5jc3MoaS5zaXplLDApLGguY3NzKGkucG9zaXRpb24sai8yKSk7dmFyIGs9e307a1tpLnNpemVdPWU9PSJzaG93Ij9qOjAsa1tpLnBvc2l0aW9uXT1lPT0ic2hvdyI/MDpqLzIsaC5hbmltYXRlKGsse3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtlPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsZCksYS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYyksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShjWzBdLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmRyb3AuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmRyb3A9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIm9wYWNpdHkiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJoaWRlIiksZj1iLm9wdGlvbnMuZGlyZWN0aW9ufHwibGVmdCI7YS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKSxhLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKTt2YXIgZz1mPT0idXAifHxmPT0iZG93biI/InRvcCI6ImxlZnQiLGg9Zj09InVwInx8Zj09ImxlZnQiPyJwb3MiOiJuZWciLGk9Yi5vcHRpb25zLmRpc3RhbmNlfHwoZz09InRvcCI/Yy5vdXRlckhlaWdodCghMCkvMjpjLm91dGVyV2lkdGgoITApLzIpO2U9PSJzaG93IiYmYy5jc3MoIm9wYWNpdHkiLDApLmNzcyhnLGg9PSJwb3MiPy1pOmkpO3ZhciBqPXtvcGFjaXR5OmU9PSJzaG93Ij8xOjB9O2pbZ109KGU9PSJzaG93Ij9oPT0icG9zIj8iKz0iOiItPSI6aD09InBvcyI/Ii09IjoiKz0iKStpLGMuYW5pbWF0ZShqLHtxdWV1ZTohMSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfX0pfSl9fSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkuZWZmZWN0cy5leHBsb2RlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5leHBsb2RlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9Yi5vcHRpb25zLnBpZWNlcz9NYXRoLnJvdW5kKE1hdGguc3FydChiLm9wdGlvbnMucGllY2VzKSk6MyxkPWIub3B0aW9ucy5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQoYi5vcHRpb25zLnBpZWNlcykpOjM7Yi5vcHRpb25zLm1vZGU9Yi5vcHRpb25zLm1vZGU9PSJ0b2dnbGUiP2EodGhpcykuaXMoIjp2aXNpYmxlIik/ImhpZGUiOiJzaG93IjpiLm9wdGlvbnMubW9kZTt2YXIgZT1hKHRoaXMpLnNob3coKS5jc3MoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxmPWUub2Zmc2V0KCk7Zi50b3AtPXBhcnNlSW50KGUuY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDAsZi5sZWZ0LT1wYXJzZUludChlLmNzcygibWFyZ2luTGVmdCIpLDEwKXx8MDt2YXIgZz1lLm91dGVyV2lkdGgoITApLGg9ZS5vdXRlckhlaWdodCghMCk7Zm9yKHZhciBpPTA7aTxjO2krKylmb3IodmFyIGo9MDtqPGQ7aisrKWUuY2xvbmUoKS5hcHBlbmRUbygiYm9keSIpLndyYXAoIjxkaXY+PC9kaXY+IikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6InZpc2libGUiLGxlZnQ6LWoqKGcvZCksdG9wOi1pKihoL2MpfSkucGFyZW50KCkuYWRkQ2xhc3MoInVpLWVmZmVjdHMtZXhwbG9kZSIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixvdmVyZmxvdzoiaGlkZGVuIix3aWR0aDpnL2QsaGVpZ2h0OmgvYyxsZWZ0OmYubGVmdCtqKihnL2QpKyhiLm9wdGlvbnMubW9kZT09InNob3ciPyhqLU1hdGguZmxvb3IoZC8yKSkqKGcvZCk6MCksdG9wOmYudG9wK2kqKGgvYykrKGIub3B0aW9ucy5tb2RlPT0ic2hvdyI/KGktTWF0aC5mbG9vcihjLzIpKSooaC9jKTowKSxvcGFjaXR5OmIub3B0aW9ucy5tb2RlPT0ic2hvdyI/MDoxfSkuYW5pbWF0ZSh7bGVmdDpmLmxlZnQraiooZy9kKSsoYi5vcHRpb25zLm1vZGU9PSJzaG93Ij8wOihqLU1hdGguZmxvb3IoZC8yKSkqKGcvZCkpLHRvcDpmLnRvcCtpKihoL2MpKyhiLm9wdGlvbnMubW9kZT09InNob3ciPzA6KGktTWF0aC5mbG9vcihjLzIpKSooaC9jKSksb3BhY2l0eTpiLm9wdGlvbnMubW9kZT09InNob3ciPzE6MH0sYi5kdXJhdGlvbnx8NTAwKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5vcHRpb25zLm1vZGU9PSJzaG93Ij9lLmNzcyh7dmlzaWJpbGl0eToidmlzaWJsZSJ9KTplLmNzcyh7dmlzaWJpbGl0eToidmlzaWJsZSJ9KS5oaWRlKCksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseShlWzBdKSxlLmRlcXVldWUoKSxhKCJkaXYudWktZWZmZWN0cy1leHBsb2RlIikucmVtb3ZlKCl9LGIuZHVyYXRpb258fDUwMCl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmZhZGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLmZhZGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImhpZGUiKTtjLmFuaW1hdGUoe29wYWNpdHk6ZH0se3F1ZXVlOiExLGR1cmF0aW9uOmIuZHVyYXRpb24sZWFzaW5nOmIub3B0aW9ucy5lYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LmVmZmVjdHMuZm9sZC5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuZm9sZD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5xdWV1ZShmdW5jdGlvbigpe3ZhciBjPWEodGhpcyksZD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Il0sZT1hLmVmZmVjdHMuc2V0TW9kZShjLGIub3B0aW9ucy5tb2RlfHwiaGlkZSIpLGY9Yi5vcHRpb25zLnNpemV8fDE1LGc9ISFiLm9wdGlvbnMuaG9yaXpGaXJzdCxoPWIuZHVyYXRpb24/Yi5kdXJhdGlvbi8yOmEuZnguc3BlZWRzLl9kZWZhdWx0LzI7YS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKTt2YXIgaT1hLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksaj1lPT0ic2hvdyIhPWcsaz1qP1sid2lkdGgiLCJoZWlnaHQiXTpbImhlaWdodCIsIndpZHRoIl0sbD1qP1tpLndpZHRoKCksaS5oZWlnaHQoKV06W2kuaGVpZ2h0KCksaS53aWR0aCgpXSxtPS8oWzAtOV0rKSUvLmV4ZWMoZik7bSYmKGY9cGFyc2VJbnQobVsxXSwxMCkvMTAwKmxbZT09ImhpZGUiPzA6MV0pLGU9PSJzaG93IiYmaS5jc3MoZz97aGVpZ2h0OjAsd2lkdGg6Zn06e2hlaWdodDpmLHdpZHRoOjB9KTt2YXIgbj17fSxwPXt9O25ba1swXV09ZT09InNob3ciP2xbMF06ZixwW2tbMV1dPWU9PSJzaG93Ij9sWzFdOjAsaS5hbmltYXRlKG4saCxiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKHAsaCxiLm9wdGlvbnMuZWFzaW5nLGZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoY1swXSxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfSl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLmhpZ2hsaWdodC5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuaGlnaGxpZ2h0PWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsiYmFja2dyb3VuZEltYWdlIiwiYmFja2dyb3VuZENvbG9yIiwib3BhY2l0eSJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8InNob3ciKSxmPXtiYWNrZ3JvdW5kQ29sb3I6Yy5jc3MoImJhY2tncm91bmRDb2xvciIpfTtlPT0iaGlkZSImJihmLm9wYWNpdHk9MCksYS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKS5jc3Moe2JhY2tncm91bmRJbWFnZToibm9uZSIsYmFja2dyb3VuZENvbG9yOmIub3B0aW9ucy5jb2xvcnx8IiNmZmZmOTkifSkuYW5pbWF0ZShmLHtxdWV1ZTohMSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ZT09ImhpZGUiJiZjLmhpZGUoKSxhLmVmZmVjdHMucmVzdG9yZShjLGQpLGU9PSJzaG93IiYmIWEuc3VwcG9ydC5vcGFjaXR5JiZ0aGlzLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIiksYi5jYWxsYmFjayYmYi5jYWxsYmFjay5hcHBseSh0aGlzLGFyZ3VtZW50cyksYy5kZXF1ZXVlKCl9fSl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLnB1bHNhdGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnB1bHNhdGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8InNob3ciKSxlPShiLm9wdGlvbnMudGltZXN8fDUpKjItMSxmPWIuZHVyYXRpb24/Yi5kdXJhdGlvbi8yOmEuZnguc3BlZWRzLl9kZWZhdWx0LzIsZz1jLmlzKCI6dmlzaWJsZSIpLGg9MDtnfHwoYy5jc3MoIm9wYWNpdHkiLDApLnNob3coKSxoPTEpLChkPT0iaGlkZSImJmd8fGQ9PSJzaG93IiYmIWcpJiZlLS07Zm9yKHZhciBpPTA7aTxlO2krKyljLmFuaW1hdGUoe29wYWNpdHk6aH0sZixiLm9wdGlvbnMuZWFzaW5nKSxoPShoKzEpJTI7Yy5hbmltYXRlKHtvcGFjaXR5Omh9LGYsYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2g9PTAmJmMuaGlkZSgpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYy5xdWV1ZSgiZngiLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKCl9KS5kZXF1ZXVlKCl9KX19KShqUXVlcnkpOzsvKiEgalF1ZXJ5IFVJIC0gdjEuOC4yMyAtIDIwMTItMDgtMTUKLSogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkKLSogSW5jbHVkZXM6IGpxdWVyeS5lZmZlY3RzLnNjYWxlLmpzCi0qIENvcHlyaWdodCAoYykgMjAxMiBBVVRIT1JTLnR4dDsgTGljZW5zZWQgTUlULCBHUEwgKi8KLShmdW5jdGlvbihhLGIpe2EuZWZmZWN0cy5wdWZmPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJoaWRlIiksZT1wYXJzZUludChiLm9wdGlvbnMucGVyY2VudCwxMCl8fDE1MCxmPWUvMTAwLGc9e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07YS5leHRlbmQoYi5vcHRpb25zLHtmYWRlOiEwLG1vZGU6ZCxwZXJjZW50OmQ9PSJoaWRlIj9lOjEwMCxmcm9tOmQ9PSJoaWRlIj9nOntoZWlnaHQ6Zy5oZWlnaHQqZix3aWR0aDpnLndpZHRoKmZ9fSksYy5lZmZlY3QoInNjYWxlIixiLm9wdGlvbnMsYi5kdXJhdGlvbixiLmNhbGxiYWNrKSxjLmRlcXVldWUoKX0pfSxhLmVmZmVjdHMuc2NhbGU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9YS5leHRlbmQoITAse30sYi5vcHRpb25zKSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJlZmZlY3QiKSxmPXBhcnNlSW50KGIub3B0aW9ucy5wZXJjZW50LDEwKXx8KHBhcnNlSW50KGIub3B0aW9ucy5wZXJjZW50LDEwKT09MD8wOmU9PSJoaWRlIj8wOjEwMCksZz1iLm9wdGlvbnMuZGlyZWN0aW9ufHwiYm90aCIsaD1iLm9wdGlvbnMub3JpZ2luO2UhPSJlZmZlY3QiJiYoZC5vcmlnaW49aHx8WyJtaWRkbGUiLCJjZW50ZXIiXSxkLnJlc3RvcmU9ITApO3ZhciBpPXtoZWlnaHQ6Yy5oZWlnaHQoKSx3aWR0aDpjLndpZHRoKCl9O2MuZnJvbT1iLm9wdGlvbnMuZnJvbXx8KGU9PSJzaG93Ij97aGVpZ2h0OjAsd2lkdGg6MH06aSk7dmFyIGo9e3k6ZyE9Imhvcml6b250YWwiP2YvMTAwOjEseDpnIT0idmVydGljYWwiP2YvMTAwOjF9O2MudG89e2hlaWdodDppLmhlaWdodCpqLnksd2lkdGg6aS53aWR0aCpqLnh9LGIub3B0aW9ucy5mYWRlJiYoZT09InNob3ciJiYoYy5mcm9tLm9wYWNpdHk9MCxjLnRvLm9wYWNpdHk9MSksZT09ImhpZGUiJiYoYy5mcm9tLm9wYWNpdHk9MSxjLnRvLm9wYWNpdHk9MCkpLGQuZnJvbT1jLmZyb20sZC50bz1jLnRvLGQubW9kZT1lLGMuZWZmZWN0KCJzaXplIixkLGIuZHVyYXRpb24sYi5jYWxsYmFjayksYy5kZXF1ZXVlKCl9KX0sYS5lZmZlY3RzLnNpemU9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0sZT1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0sZj1bIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciXSxnPVsiZm9udFNpemUiXSxoPVsiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJCb3R0b21XaWR0aCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0saT1bImJvcmRlckxlZnRXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLGo9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGs9Yi5vcHRpb25zLnJlc3RvcmV8fCExLGw9Yi5vcHRpb25zLnNjYWxlfHwiYm90aCIsbT1iLm9wdGlvbnMub3JpZ2luLG49e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07Yy5mcm9tPWIub3B0aW9ucy5mcm9tfHxuLGMudG89Yi5vcHRpb25zLnRvfHxuO2lmKG0pe3ZhciBwPWEuZWZmZWN0cy5nZXRCYXNlbGluZShtLG4pO2MuZnJvbS50b3A9KG4uaGVpZ2h0LWMuZnJvbS5oZWlnaHQpKnAueSxjLmZyb20ubGVmdD0obi53aWR0aC1jLmZyb20ud2lkdGgpKnAueCxjLnRvLnRvcD0obi5oZWlnaHQtYy50by5oZWlnaHQpKnAueSxjLnRvLmxlZnQ9KG4ud2lkdGgtYy50by53aWR0aCkqcC54fXZhciBxPXtmcm9tOnt5OmMuZnJvbS5oZWlnaHQvbi5oZWlnaHQseDpjLmZyb20ud2lkdGgvbi53aWR0aH0sdG86e3k6Yy50by5oZWlnaHQvbi5oZWlnaHQseDpjLnRvLndpZHRoL24ud2lkdGh9fTtpZihsPT0iYm94Inx8bD09ImJvdGgiKXEuZnJvbS55IT1xLnRvLnkmJihkPWQuY29uY2F0KGgpLGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGgscS5mcm9tLnksYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLnRvLnksYy50bykpLHEuZnJvbS54IT1xLnRvLngmJihkPWQuY29uY2F0KGkpLGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGkscS5mcm9tLngsYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaSxxLnRvLngsYy50bykpOyhsPT0iY29udGVudCJ8fGw9PSJib3RoIikmJnEuZnJvbS55IT1xLnRvLnkmJihkPWQuY29uY2F0KGcpLGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGcscS5mcm9tLnksYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsZyxxLnRvLnksYy50bykpLGEuZWZmZWN0cy5zYXZlKGMsaz9kOmUpLGMuc2hvdygpLGEuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKGMpLGMuY3NzKCJvdmVyZmxvdyIsImhpZGRlbiIpLmNzcyhjLmZyb20pO2lmKGw9PSJjb250ZW50Inx8bD09ImJvdGgiKWg9aC5jb25jYXQoWyJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iXSkuY29uY2F0KGcpLGk9aS5jb25jYXQoWyJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiXSksZj1kLmNvbmNhdChoKS5jb25jYXQoaSksYy5maW5kKCIqW3dpZHRoXSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpO2smJmEuZWZmZWN0cy5zYXZlKGMsZik7dmFyIGQ9e2hlaWdodDpjLmhlaWdodCgpLHdpZHRoOmMud2lkdGgoKX07Yy5mcm9tPXtoZWlnaHQ6ZC5oZWlnaHQqcS5mcm9tLnksd2lkdGg6ZC53aWR0aCpxLmZyb20ueH0sYy50bz17aGVpZ2h0OmQuaGVpZ2h0KnEudG8ueSx3aWR0aDpkLndpZHRoKnEudG8ueH0scS5mcm9tLnkhPXEudG8ueSYmKGMuZnJvbT1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGgscS5mcm9tLnksYy5mcm9tKSxjLnRvPWEuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGMsaCxxLnRvLnksYy50bykpLHEuZnJvbS54IT1xLnRvLngmJihjLmZyb209YS5lZmZlY3RzLnNldFRyYW5zaXRpb24oYyxpLHEuZnJvbS54LGMuZnJvbSksYy50bz1hLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihjLGkscS50by54LGMudG8pKSxjLmNzcyhjLmZyb20pLGMuYW5pbWF0ZShjLnRvLGIuZHVyYXRpb24sYi5vcHRpb25zLmVhc2luZyxmdW5jdGlvbigpe2smJmEuZWZmZWN0cy5yZXN0b3JlKGMsZil9KX0pO2MuYW5pbWF0ZShjLnRvLHtxdWV1ZTohMSxkdXJhdGlvbjpiLmR1cmF0aW9uLGVhc2luZzpiLm9wdGlvbnMuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yy50by5vcGFjaXR5PT09MCYmYy5jc3MoIm9wYWNpdHkiLGMuZnJvbS5vcGFjaXR5KSxqPT0iaGlkZSImJmMuaGlkZSgpLGEuZWZmZWN0cy5yZXN0b3JlKGMsaz9kOmUpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfX0pfSl9fSkoalF1ZXJ5KTs7LyohIGpRdWVyeSBVSSAtIHYxLjguMjMgLSAyMDEyLTA4LTE1Ci0qIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXVpCi0qIEluY2x1ZGVzOiBqcXVlcnkuZWZmZWN0cy5zaGFrZS5qcwotKiBDb3B5cmlnaHQgKGMpIDIwMTIgQVVUSE9SUy50eHQ7IExpY2Vuc2VkIE1JVCwgR1BMICovCi0oZnVuY3Rpb24oYSxiKXthLmVmZmVjdHMuc2hha2U9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucXVldWUoZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLGQ9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLGU9YS5lZmZlY3RzLnNldE1vZGUoYyxiLm9wdGlvbnMubW9kZXx8ImVmZmVjdCIpLGY9Yi5vcHRpb25zLmRpcmVjdGlvbnx8ImxlZnQiLGc9Yi5vcHRpb25zLmRpc3RhbmNlfHwyMCxoPWIub3B0aW9ucy50aW1lc3x8MyxpPWIuZHVyYXRpb258fGIub3B0aW9ucy5kdXJhdGlvbnx8MTQwO2EuZWZmZWN0cy5zYXZlKGMsZCksYy5zaG93KCksYS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYyk7dmFyIGo9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixrPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixsPXt9LG09e30sbj17fTtsW2pdPShrPT0icG9zIj8iLT0iOiIrPSIpK2csbVtqXT0oaz09InBvcyI/Iis9IjoiLT0iKStnKjIsbltqXT0oaz09InBvcyI/Ii09IjoiKz0iKStnKjIsYy5hbmltYXRlKGwsaSxiLm9wdGlvbnMuZWFzaW5nKTtmb3IodmFyIHA9MTtwPGg7cCsrKWMuYW5pbWF0ZShtLGksYi5vcHRpb25zLmVhc2luZykuYW5pbWF0ZShuLGksYi5vcHRpb25zLmVhc2luZyk7Yy5hbmltYXRlKG0saSxiLm9wdGlvbnMuZWFzaW5nKS5hbmltYXRlKGwsaS8yLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXthLmVmZmVjdHMucmVzdG9yZShjLGQpLGEuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKGMpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkodGhpcyxhcmd1bWVudHMpfSksYy5xdWV1ZSgiZngiLGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKCl9KSxjLmRlcXVldWUoKX0pfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LmVmZmVjdHMuc2xpZGUuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnNsaWRlPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiXSxlPWEuZWZmZWN0cy5zZXRNb2RlKGMsYi5vcHRpb25zLm1vZGV8fCJzaG93IiksZj1iLm9wdGlvbnMuZGlyZWN0aW9ufHwibGVmdCI7YS5lZmZlY3RzLnNhdmUoYyxkKSxjLnNob3coKSxhLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihjKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSk7dmFyIGc9Zj09InVwInx8Zj09ImRvd24iPyJ0b3AiOiJsZWZ0IixoPWY9PSJ1cCJ8fGY9PSJsZWZ0Ij8icG9zIjoibmVnIixpPWIub3B0aW9ucy5kaXN0YW5jZXx8KGc9PSJ0b3AiP2Mub3V0ZXJIZWlnaHQoITApOmMub3V0ZXJXaWR0aCghMCkpO2U9PSJzaG93IiYmYy5jc3MoZyxoPT0icG9zIj9pc05hTihpKT8iLSIraTotaTppKTt2YXIgaj17fTtqW2ddPShlPT0ic2hvdyI/aD09InBvcyI/Iis9IjoiLT0iOmg9PSJwb3MiPyItPSI6Iis9IikraSxjLmFuaW1hdGUoaix7cXVldWU6ITEsZHVyYXRpb246Yi5kdXJhdGlvbixlYXNpbmc6Yi5vcHRpb25zLmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpe2U9PSJoaWRlIiYmYy5oaWRlKCksYS5lZmZlY3RzLnJlc3RvcmUoYyxkKSxhLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihjKSxiLmNhbGxiYWNrJiZiLmNhbGxiYWNrLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjLmRlcXVldWUoKX19KX0pfX0pKGpRdWVyeSk7Oy8qISBqUXVlcnkgVUkgLSB2MS44LjIzIC0gMjAxMi0wOC0xNQotKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aQotKiBJbmNsdWRlczoganF1ZXJ5LmVmZmVjdHMudHJhbnNmZXIuanMKLSogQ29weXJpZ2h0IChjKSAyMDEyIEFVVEhPUlMudHh0OyBMaWNlbnNlZCBNSVQsIEdQTCAqLwotKGZ1bmN0aW9uKGEsYil7YS5lZmZlY3RzLnRyYW5zZmVyPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGM9YSh0aGlzKSxkPWEoYi5vcHRpb25zLnRvKSxlPWQub2Zmc2V0KCksZj17dG9wOmUudG9wLGxlZnQ6ZS5sZWZ0LGhlaWdodDpkLmlubmVySGVpZ2h0KCksd2lkdGg6ZC5pbm5lcldpZHRoKCl9LGc9Yy5vZmZzZXQoKSxoPWEoJzxkaXYgY2xhc3M9InVpLWVmZmVjdHMtdHJhbnNmZXIiPjwvZGl2PicpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKGIub3B0aW9ucy5jbGFzc05hbWUpLmNzcyh7dG9wOmcudG9wLGxlZnQ6Zy5sZWZ0LGhlaWdodDpjLmlubmVySGVpZ2h0KCksd2lkdGg6Yy5pbm5lcldpZHRoKCkscG9zaXRpb246ImFic29sdXRlIn0pLmFuaW1hdGUoZixiLmR1cmF0aW9uLGIub3B0aW9ucy5lYXNpbmcsZnVuY3Rpb24oKXtoLnJlbW92ZSgpLGIuY2FsbGJhY2smJmIuY2FsbGJhY2suYXBwbHkoY1swXSxhcmd1bWVudHMpLGMuZGVxdWV1ZSgpfSl9KX19KShqUXVlcnkpOzsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9qcy9kb2NzLmpzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvanMvZG9jcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjMTJhOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Fzc2V0cy9qcy9kb2NzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjYwOSArMCwwIEBACi12YXIgY2xhc3Nlc05hdjsKLXZhciBkZXZkb2NOYXY7Ci12YXIgc2lkZW5hdjsKLXZhciBjb29raWVfbmFtZXNwYWNlID0gJ2FuZHJvaWRfZGV2ZWxvcGVyJzsKLXZhciBOQVZfUFJFRl9UUkVFID0gInRyZWUiOwotdmFyIE5BVl9QUkVGX1BBTkVMUyA9ICJwYW5lbHMiOwotdmFyIG5hdl9wcmVmOwotdmFyIGlzTW9iaWxlID0gZmFsc2U7IC8vIHRydWUgaWYgbW9iaWxlLCBzbyB3ZSBjYW4gYWRqdXN0IHNvbWUgbGF5b3V0Ci0KLXZhciBiYXNlUGF0aCA9IGdldEJhc2VVcmkobG9jYXRpb24ucGF0aG5hbWUpOwotdmFyIFNJVEVfUk9PVCA9IHRvUm9vdCArIGJhc2VQYXRoLnN1YnN0cmluZygxLGJhc2VQYXRoLmluZGV4T2YoIi8iLDEpKTsKLXZhciBHT09HTEVfREFUQTsgLy8gY29tYmluZWQgZGF0YSBmb3IgZ29vZ2xlIHNlcnZpY2UgYXBpcywgdXNlZCBmb3Igc2VhcmNoIHN1Z2dlc3QKLQotCi0vKioqKioqICBPTiBMT0FEIFNFVCBVUCBTVFVGRiAqKioqKioqKiovCi0KLXZhciBuYXZCYXJJc0ZpeGVkID0gZmFsc2U7Ci0kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLQotICAvLyBsb2FkIGpzb24gZmlsZSBmb3IgQW5kcm9pZCBBUEkgc2VhcmNoIHN1Z2dlc3Rpb25zCi0gICQuZ2V0U2NyaXB0KHRvUm9vdCArICdyZWZlcmVuY2UvbGlzdHMuanMnKTsKLSAgLy8gbG9hZCBqc29uIGZpbGVzIGZvciBHb29nbGUgc2VydmljZXMgQVBJIHN1Z2dlc3Rpb25zCi0gICQuZ2V0U2NyaXB0KHRvUm9vdCArICdyZWZlcmVuY2UvZ2NtX2xpc3RzLmpzJywgZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywganF4aHIpIHsKLSAgICAgIC8vIG9uY2UgdGhlIEdDTSBqc29uIChHQ01fREFUQSkgaXMgbG9hZGVkLCBsb2FkIHRoZSBHTVMganNvbiAoR01TX0RBVEEpIGFuZCBtZXJnZSB0aGUgZGF0YQotICAgICAgaWYoanF4aHIuc3RhdHVzID09PSAyMDApIHsKLSAgICAgICAgICAkLmdldFNjcmlwdCh0b1Jvb3QgKyAncmVmZXJlbmNlL2dtc19saXN0cy5qcycsIGZ1bmN0aW9uKGRhdGEsIHRleHRTdGF0dXMsIGpxeGhyKSB7Ci0gICAgICAgICAgICAgIGlmKGpxeGhyLnN0YXR1cyA9PT0gMjAwKSB7Ci0gICAgICAgICAgICAgICAgICAvLyBjb21iaW5lIEdDTSBhbmQgR01TIGRhdGEKLSAgICAgICAgICAgICAgICAgIEdPT0dMRV9EQVRBID0gR01TX0RBVEE7Ci0gICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBHT09HTEVfREFUQS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8R0NNX0RBVEEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICBHT09HTEVfREFUQS5wdXNoKHtpZDpzdGFydCtpLCBsYWJlbDpHQ01fREFUQVtpXS5sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbms6R0NNX0RBVEFbaV0ubGluaywgdHlwZTpHQ01fREFUQVtpXS50eXBlfSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICAgIH0KLSAgfSk7Ci0KLSAgLy8gbGF5b3V0IGhvc3RlZCBvbiBkZXZzaXRlIGlzIHNwZWNpYWwKLSAgaWYgKGRldnNpdGUpIHsKLSAgICAvLyBtb3ZlIHRoZSBsYW5nIHNlbGVjdG9yIGludG8gdGhlIG92ZXJmbG93IG1lbnUKLSAgICAkKCIjbW9yZW1lbnUgLm1pZCBkaXYuaGVhZGVyOmxhc3QiKS5hZnRlcigkKCIjbGFuZ3VhZ2UiKS5kZXRhY2goKSk7Ci0gIH0KLQotICAvLyBpbml0IHRoZSBmdWxsc2NyZWVuIHRvZ2dsZSBjbGljayBldmVudAotICAkKCcjbmF2LXN3YXAgLmZ1bGxzY3JlZW4nKS5jbGljayhmdW5jdGlvbigpewotICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7Ci0gICAgICB0b2dnbGVGdWxsc2NyZWVuKHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0b2dnbGVGdWxsc2NyZWVuKGZhbHNlKTsKLSAgICB9Ci0gIH0pOwotCi0gIC8vIGluaXRpYWxpemUgdGhlIGRpdnMgd2l0aCBjdXN0b20gc2Nyb2xsYmFycwotICAkKCcuc2Nyb2xsLXBhbmUnKS5qU2Nyb2xsUGFuZSgge3ZlcnRpY2FsR3V0dGVyOjB9ICk7Ci0KLSAgLy8gYWRkIEhScyBiZWxvdyBhbGwgSDJzIChleGNlcHQgZm9yIGEgZmV3IG90aGVyIGgyIHZhcmlhbnRzKQotICAkKCdoMicpLm5vdCgnI3F2IGgyJykubm90KCcjdGIgaDInKS5ub3QoJy5zaWRlYm94IGgyJykubm90KCcjZGV2ZG9jLW5hdiBoMicpLm5vdCgnaDIubm9ydWxlJykuY3NzKHttYXJnaW5Cb3R0b206MH0pLmFmdGVyKCc8aHIvPicpOwotCi0gIC8vIHNldCBzZWFyY2gncyBvbmtleXVwIGhhbmRsZXIgaGVyZSBzbyB3ZSBjYW4gc2hvdyBzdWdnZXN0aW9ucwotICAvLyBldmVuIHdoaWxlIHNlYXJjaCByZXN1bHRzIGFyZSB2aXNpYmxlCi0gICQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikua2V5dXAoZnVuY3Rpb24oKSB7cmV0dXJuIHNlYXJjaF9jaGFuZ2VkKGV2ZW50LCBmYWxzZSwgdG9Sb290KX0pOwotCi0gIC8vIHNldCB1cCB0aGUgc2VhcmNoIGNsb3NlIGJ1dHRvbgotICAkKCcuc2VhcmNoIC5jbG9zZScpLmNsaWNrKGZ1bmN0aW9uKCkgewotICAgICRzZWFyY2hJbnB1dCA9ICQoJyNzZWFyY2hfYXV0b2NvbXBsZXRlJyk7Ci0gICAgJHNlYXJjaElucHV0LmF0dHIoJ3ZhbHVlJywgJycpOwotICAgICQodGhpcykuYWRkQ2xhc3MoImhpZGUiKTsKLSAgICAkKCIjc2VhcmNoLWNvbnRhaW5lciIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKLSAgICAkKCIjc2VhcmNoX2F1dG9jb21wbGV0ZSIpLmJsdXIoKTsKLSAgICBzZWFyY2hfZm9jdXNfY2hhbmdlZCgkc2VhcmNoSW5wdXQuZ2V0KCksIGZhbHNlKTsgIC8vIHNlZSBzZWFyY2hfYXV0b2NvbXBsZXRlLmpzCi0gICAgaGlkZVJlc3VsdHMoKTsgIC8vIHNlZSBzZWFyY2hfYXV0b2NvbXBsZXRlLmpzCi0gIH0pOwotICAkKCcuc2VhcmNoJykuY2xpY2soZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCEkKCcjc2VhcmNoX2F1dG9jb21wbGV0ZScpLmlzKCI6Zm9jdXMiKSkgewotICAgICAgICAkKCcjc2VhcmNoX2F1dG9jb21wbGV0ZScpLmZvY3VzKCk7Ci0gICAgfQotICB9KTsKLQotICAvLyBTZXQgdXAgcXVpY2tuYXYKLSAgdmFyIHF1aWNrbmF2X29wZW4gPSBmYWxzZTsKLSAgJCgiI2J0bi1xdWlja25hdiIpLmNsaWNrKGZ1bmN0aW9uKCkgewotICAgIGlmIChxdWlja25hdl9vcGVuKSB7Ci0gICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKLSAgICAgIHF1aWNrbmF2X29wZW4gPSBmYWxzZTsKLSAgICAgIGNvbGxhcHNlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwotICAgICAgcXVpY2tuYXZfb3BlbiA9IHRydWU7Ci0gICAgICBleHBhbmQoKTsKLSAgICB9Ci0gIH0pCi0KLSAgdmFyIGV4cGFuZCA9IGZ1bmN0aW9uKCkgewotICAgJCgnI2hlYWRlci13cmFwJykuYWRkQ2xhc3MoJ3F1aWNrbmF2Jyk7Ci0gICAkKCcjcXVpY2tuYXYnKS5zdG9wKCkuc2hvdygpLmFuaW1hdGUoe29wYWNpdHk6JzEnfSk7Ci0gIH0KLQotICB2YXIgY29sbGFwc2UgPSBmdW5jdGlvbigpIHsKLSAgICAkKCcjcXVpY2tuYXYnKS5zdG9wKCkuYW5pbWF0ZSh7b3BhY2l0eTonMCd9LCAxMDAsIGZ1bmN0aW9uKCkgewotICAgICAgJCh0aGlzKS5oaWRlKCk7Ci0gICAgICAkKCcjaGVhZGVyLXdyYXAnKS5yZW1vdmVDbGFzcygncXVpY2tuYXYnKTsKLSAgICB9KTsKLSAgfQotCi0KLSAgLy9TZXQgdXAgc2VhcmNoCi0gICQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikuZm9jdXMoZnVuY3Rpb24oKSB7Ci0gICAgJCgiI3NlYXJjaC1jb250YWluZXIiKS5hZGRDbGFzcygnYWN0aXZlJyk7Ci0gIH0pCi0gICQoIiNzZWFyY2gtY29udGFpbmVyIikubW91c2VvdmVyKGZ1bmN0aW9uKCkgewotICAgICQoIiNzZWFyY2gtY29udGFpbmVyIikuYWRkQ2xhc3MoJ2FjdGl2ZScpOwotICAgICQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKLSAgfSkKLSAgJCgiI3NlYXJjaC1jb250YWluZXIiKS5tb3VzZW91dChmdW5jdGlvbigpIHsKLSAgICBpZiAoJCgiI3NlYXJjaF9hdXRvY29tcGxldGUiKS5pcygiOmZvY3VzIikpIHJldHVybjsKLSAgICBpZiAoJCgiI3NlYXJjaF9hdXRvY29tcGxldGUiKS52YWwoKSA9PSAnJykgewotICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewotICAgICAgICAkKCIjc2VhcmNoLWNvbnRhaW5lciIpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKLSAgICAgICAgJCgiI3NlYXJjaF9hdXRvY29tcGxldGUiKS5ibHVyKCk7Ci0gICAgICB9LDI1MCk7Ci0gICAgfQotICB9KQotICAkKCIjc2VhcmNoX2F1dG9jb21wbGV0ZSIpLmJsdXIoZnVuY3Rpb24oKSB7Ci0gICAgaWYgKCQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikudmFsKCkgPT0gJycpIHsKLSAgICAgICQoIiNzZWFyY2gtY29udGFpbmVyIikucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwotICAgIH0KLSAgfSkKLQotCi0gIC8vIHByZXAgbmF2IGV4cGFuZG9zCi0gIHZhciBwYWdlUGF0aCA9IGRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lOwotICAvLyBhY2NvdW50IGZvciBpbnRsIGRvY3MgYnkgcmVtb3ZpbmcgdGhlIGludGwvKi8gcGF0aAotICBpZiAocGFnZVBhdGguaW5kZXhPZigiL2ludGwvIikgPT0gMCkgewotICAgIHBhZ2VQYXRoID0gcGFnZVBhdGguc3Vic3RyKHBhZ2VQYXRoLmluZGV4T2YoIi8iLDYpKTsgLy8gc3RhcnQgYWZ0ZXIgaW50bC8gdG8gZ2V0IGxhc3QgLwotICB9Ci0KLSAgaWYgKHBhZ2VQYXRoLmluZGV4T2YoU0lURV9ST09UKSA9PSAwKSB7Ci0gICAgaWYgKHBhZ2VQYXRoID09ICcnIHx8IHBhZ2VQYXRoLmNoYXJBdChwYWdlUGF0aC5sZW5ndGggLSAxKSA9PSAnLycpIHsKLSAgICAgIHBhZ2VQYXRoICs9ICdpbmRleC5odG1sJzsKLSAgICB9Ci0gIH0KLQotICBpZiAoU0lURV9ST09ULm1hdGNoKC9cLlwuXC8vKSB8fCBTSVRFX1JPT1QgPT0gJycpIHsKLSAgICAvLyBJZiBydW5uaW5nIGxvY2FsbHksIFNJVEVfUk9PVCB3aWxsIGJlIGEgcmVsYXRpdmUgcGF0aCwgc28gYWNjb3VudCBmb3IgdGhhdCBieQotICAgIC8vIGZpbmRpbmcgdGhlIHJlbGF0aXZlIFVSTCB0byB0aGlzIHBhZ2UuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBmaW5kIGxpbmtzIG9uIHRoZSBwYWdlCi0gICAgLy8gbGVhZGluZyBiYWNrIHRvIHRoaXMgcGFnZS4KLSAgICB2YXIgcGF0aFBhcnRzID0gcGFnZVBhdGguc3BsaXQoJy8nKTsKLSAgICB2YXIgcmVsYXRpdmVQYWdlUGF0aFBhcnRzID0gW107Ci0gICAgdmFyIHVwRGlycyA9IChTSVRFX1JPT1QubWF0Y2goLyhcLlwuXC8pKy8pIHx8IFsnJ10pWzBdLmxlbmd0aCAvIDM7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cERpcnM7IGkrKykgewotICAgICAgcmVsYXRpdmVQYWdlUGF0aFBhcnRzLnB1c2goJy4uJyk7Ci0gICAgfQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXBEaXJzOyBpKyspIHsKLSAgICAgIHJlbGF0aXZlUGFnZVBhdGhQYXJ0cy5wdXNoKHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gKHVwRGlycyAtIGkpIC0gMV0pOwotICAgIH0KLSAgICByZWxhdGl2ZVBhZ2VQYXRoUGFydHMucHVzaChwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdKTsKLSAgICBwYWdlUGF0aCA9IHJlbGF0aXZlUGFnZVBhdGhQYXJ0cy5qb2luKCcvJyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gT3RoZXJ3aXNlIHRoZSBwYWdlIHBhdGggaXMgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwKLSAgfQotCi0gIC8vIEhpZ2hsaWdodCB0aGUgaGVhZGVyIHRhYnMuLi4KLSAgLy8gaGlnaGxpZ2h0IERlc2lnbiB0YWIKLSAgaWYgKCQoImJvZHkiKS5oYXNDbGFzcygiZGVzaWduIikpIHsKLSAgICAkKCIjaGVhZGVyIGxpLmRlc2lnbiBhIikuYWRkQ2xhc3MoInNlbGVjdGVkIik7Ci0KLSAgLy8gaGlnaGxpZ2h0IERldmVsb3AgdGFiCi0gIH0gZWxzZSBpZiAoJCgiYm9keSIpLmhhc0NsYXNzKCJkZXZlbG9wIikgfHwgJCgiYm9keSIpLmhhc0NsYXNzKCJnb29nbGUiKSkgewotICAgICQoIiNoZWFkZXIgbGkuZGV2ZWxvcCBhIikuYWRkQ2xhc3MoInNlbGVjdGVkIik7Ci0KLSAgICAvLyBJbiBEZXZlbG9wIGRvY3MsIGFsc28gaGlnaGxpZ2h0IGFwcHJvcHJpYXRlIHN1Yi10YWIKLSAgICB2YXIgcm9vdERpciA9IHBhZ2VQYXRoLnN1YnN0cmluZygxLHBhZ2VQYXRoLmluZGV4T2YoJy8nLCAxKSk7Ci0gICAgaWYgKHJvb3REaXIgPT0gInRyYWluaW5nIikgewotICAgICAgJCgiI25hdi14IGxpLnRyYWluaW5nIGEiKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKLSAgICB9IGVsc2UgaWYgKHJvb3REaXIgPT0gImd1aWRlIikgewotICAgICAgJCgiI25hdi14IGxpLmd1aWRlIGEiKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKLSAgICB9IGVsc2UgaWYgKHJvb3REaXIgPT0gInJlZmVyZW5jZSIpIHsKLSAgICAgIC8vIElmIHRoZSByb290IGlzIHJlZmVyZW5jZSwgYnV0IHBhZ2UgaXMgYWxzbyBwYXJ0IG9mIEdvb2dsZSBTZXJ2aWNlcywgc2VsZWN0IEdvb2dsZQotICAgICAgaWYgKCQoImJvZHkiKS5oYXNDbGFzcygiZ29vZ2xlIikpIHsKLSAgICAgICAgJCgiI25hdi14IGxpLmdvb2dsZSBhIikuYWRkQ2xhc3MoInNlbGVjdGVkIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkKCIjbmF2LXggbGkucmVmZXJlbmNlIGEiKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKChyb290RGlyID09ICJ0b29scyIpIHx8IChyb290RGlyID09ICJzZGsiKSkgewotICAgICAgJCgiI25hdi14IGxpLnRvb2xzIGEiKS5hZGRDbGFzcygic2VsZWN0ZWQiKTsKLSAgICB9IGVsc2UgaWYgKCQoImJvZHkiKS5oYXNDbGFzcygiZ29vZ2xlIikpIHsKLSAgICAgICQoIiNuYXYteCBsaS5nb29nbGUgYSIpLmFkZENsYXNzKCJzZWxlY3RlZCIpOwotICAgIH0KLQotICAvLyBoaWdobGlnaHQgRGlzdHJpYnV0ZSB0YWIKLSAgfSBlbHNlIGlmICgkKCJib2R5IikuaGFzQ2xhc3MoImRpc3RyaWJ1dGUiKSkgewotICAgICQoIiNoZWFkZXIgbGkuZGlzdHJpYnV0ZSBhIikuYWRkQ2xhc3MoInNlbGVjdGVkIik7Ci0gIH0KLQotCi0gIC8vIHNlbGVjdCBjdXJyZW50IHBhZ2UgaW4gc2lkZW5hdiBhbmQgaGVhZGVyLCBhbmQgc2V0IHVwIHByZXYvbmV4dCBsaW5rcyBpZiB0aGV5IGV4aXN0Ci0gIHZhciAkc2VsTmF2TGluayA9ICQoJyNuYXYnKS5maW5kKCdhW2hyZWY9IicgKyBwYWdlUGF0aCArICciXScpOwotICB2YXIgJHNlbExpc3RJdGVtOwotICBpZiAoJHNlbE5hdkxpbmsubGVuZ3RoKSB7Ci0KLSAgICAvLyBGaW5kIHRoaXMgcGFnZSdzIDxsaT4gaW4gc2lkZW5hdiBhbmQgc2V0IHNlbGVjdGVkCi0gICAgJHNlbExpc3RJdGVtID0gJHNlbE5hdkxpbmsuY2xvc2VzdCgnbGknKTsKLSAgICAkc2VsTGlzdEl0ZW0uYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7Ci0KLSAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZSBhbmQgZXhwYW5kIGFsbCBwYXJlbnQgbmF2LXNlY3Rpb25zCi0gICAgJHNlbE5hdkxpbmsucGFyZW50cygnbGkubmF2LXNlY3Rpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgJCh0aGlzKS5hZGRDbGFzcygnZXhwYW5kZWQnKTsKLSAgICAgICQodGhpcykuY2hpbGRyZW4oJ3VsJykuc2hvdygpOwotICAgIH0pOwotCi0gICAgLy8gc2V0IHVwIHByZXYgbGlua3MKLSAgICB2YXIgJHByZXZMaW5rID0gW107Ci0gICAgdmFyICRwcmV2TGlzdEl0ZW0gPSAkc2VsTGlzdEl0ZW0ucHJldignbGknKTsKLQotICAgIHZhciBjcm9zc0JvdW5kYXJpZXMgPSAoJCgiYm9keS5kZXNpZ24iKS5sZW5ndGggPiAwKSB8fCAoJCgiYm9keS5ndWlkZSIpLmxlbmd0aCA+IDApID8gdHJ1ZSA6Ci1mYWxzZTsgLy8gbmF2aWdhdGUgYWNyb3NzIHRvcGljIGJvdW5kYXJpZXMgb25seSBpbiBkZXNpZ24gZG9jcwotICAgIGlmICgkcHJldkxpc3RJdGVtLmxlbmd0aCkgewotICAgICAgaWYgKCRwcmV2TGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgICAgLy8ganVtcCB0byBsYXN0IHRvcGljIG9mIHByZXZpb3VzIHNlY3Rpb24KLSAgICAgICAgJHByZXZMaW5rID0gJHByZXZMaXN0SXRlbS5maW5kKCdhOmxhc3QnKTsKLSAgICAgIH0gZWxzZSBpZiAoISRzZWxMaXN0SXRlbS5oYXNDbGFzcygnbmF2LXNlY3Rpb24nKSkgewotICAgICAgICAvLyBqdW1wIHRvIHByZXZpb3VzIHRvcGljIGluIHRoaXMgc2VjdGlvbgotICAgICAgICAkcHJldkxpbmsgPSAkcHJldkxpc3RJdGVtLmZpbmQoJ2E6ZXEoMCknKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8ganVtcCB0byB0aGlzIHNlY3Rpb24ncyBpbmRleCBwYWdlIChpZiBpdCBleGlzdHMpCi0gICAgICB2YXIgJHBhcmVudExpc3RJdGVtID0gJHNlbExpc3RJdGVtLnBhcmVudHMoJ2xpJyk7Ci0gICAgICAkcHJldkxpbmsgPSAkc2VsTGlzdEl0ZW0ucGFyZW50cygnbGknKS5maW5kKCdhJyk7Ci0KLSAgICAgIC8vIGV4Y2VwdCBpZiBjcm9zcyBib3VuZGFyaWVzIGFyZW4ndCBhbGxvd2VkLCBhbmQgd2UncmUgYXQgdGhlIHRvcCBvZiBhIHNlY3Rpb24gYWxyZWFkeQotICAgICAgLy8gKGFuZCB0aGVyZSdzIGFub3RoZXIgcGFyZW50KQotICAgICAgaWYgKCFjcm9zc0JvdW5kYXJpZXMgJiYgJHBhcmVudExpc3RJdGVtLmhhc0NsYXNzKCduYXYtc2VjdGlvbicpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkc2VsTGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgICAgJHByZXZMaW5rID0gW107Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gc2V0IHVwIG5leHQgbGlua3MKLSAgICB2YXIgJG5leHRMaW5rID0gW107Ci0gICAgdmFyIHN0YXJ0Q2xhc3MgPSBmYWxzZTsKLSAgICB2YXIgdHJhaW5pbmcgPSAkKCIubmV4dC1jbGFzcy1saW5rIikubGVuZ3RoOyAvLyBkZWNpZGVzIHdoZXRoZXIgdG8gcHJvdmlkZSAibmV4dCBjbGFzcyIgbGluawotICAgIHZhciBpc0Nyb3NzaW5nQm91bmRhcnkgPSBmYWxzZTsKLQotICAgIGlmICgkc2VsTGlzdEl0ZW0uaGFzQ2xhc3MoJ25hdi1zZWN0aW9uJykpIHsKLSAgICAgIC8vIHdlJ3JlIG9uIGFuIGluZGV4IHBhZ2UsIGp1bXAgdG8gdGhlIGZpcnN0IHRvcGljCi0gICAgICAkbmV4dExpbmsgPSAkc2VsTGlzdEl0ZW0uZmluZCgndWw6ZXEoMCknKS5maW5kKCdhOmVxKDApJyk7Ci0KLSAgICAgIC8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgY2hpbGRyZW4sIGdvIHRvIHRoZSBuZXh0IHNlY3Rpb24gKHJlcXVpcmVkIGZvciBBYm91dCBwYWdlcykKLSAgICAgIGlmKCRuZXh0TGluay5sZW5ndGggPT0gMCkgewotICAgICAgICAkbmV4dExpbmsgPSAkc2VsTGlzdEl0ZW0ubmV4dCgnbGknKS5maW5kKCdhJyk7Ci0gICAgICB9IGVsc2UgaWYgKCQoJy50b3BpYy1zdGFydC1saW5rJykubGVuZ3RoKSB7Ci0gICAgICAgIC8vIGFzIGxvbmcgYXMgdGhlcmUncyBhIGNoaWxkIGxpbmsgYW5kIHRoZXJlIGlzIGEgInRvcGljIHN0YXJ0IGxpbmsiICh3ZSdyZSBvbiBhIGxhbmRpbmcpCi0gICAgICAgIC8vIHRoZW4gc2V0IHRoZSBsYW5kaW5nIHBhZ2UgInN0YXJ0IGxpbmsiIHRleHQgdG8gYmUgdGhlIGZpcnN0IGRvYyB0aXRsZQotICAgICAgICAkKCcudG9waWMtc3RhcnQtbGluaycpLnRleHQoJG5leHRMaW5rLnRleHQoKS50b1VwcGVyQ2FzZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIHBhZ2UgaGFzIGEgZGVzY3JpcHRpb24sIHRoZW4gaXQncyBhIGNsYXNzIG9yIGFydGljbGUgaG9tZXBhZ2UKLSAgICAgIGlmICgkc2VsTGlzdEl0ZW0uZmluZCgnYVtkZXNjcmlwdGlvbl0nKS5sZW5ndGgpIHsKLSAgICAgICAgLy8gdGhpcyBtZWFucyB3ZSdyZSBvbiBhIGNsYXNzIGxhbmRpbmcgcGFnZQotICAgICAgICBzdGFydENsYXNzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8ganVtcCB0byB0aGUgbmV4dCB0b3BpYyBpbiB0aGlzIHNlY3Rpb24gKGlmIGl0IGV4aXN0cykKLSAgICAgICRuZXh0TGluayA9ICRzZWxMaXN0SXRlbS5uZXh0KCdsaScpLmZpbmQoJ2E6ZXEoMCknKTsKLSAgICAgIGlmICghJG5leHRMaW5rLmxlbmd0aCkgewotICAgICAgICBpc0Nyb3NzaW5nQm91bmRhcnkgPSB0cnVlOwotICAgICAgICAvLyBubyBtb3JlIHRvcGljcyBpbiB0aGlzIHNlY3Rpb24sIGp1bXAgdG8gdGhlIGZpcnN0IHRvcGljIGluIHRoZSBuZXh0IHNlY3Rpb24KLSAgICAgICAgJG5leHRMaW5rID0gJHNlbExpc3RJdGVtLnBhcmVudHMoJ2xpOmVxKDApJykubmV4dCgnbGkubmF2LXNlY3Rpb24nKS5maW5kKCdhOmVxKDApJyk7Ci0gICAgICAgIGlmICghJG5leHRMaW5rLmxlbmd0aCkgeyAgLy8gR28gdXAgYW5vdGhlciBsYXllciB0byBsb29rIGZvciBuZXh0IHBhZ2UgKGxlc3NvbiA+IGNsYXNzID4gY291cnNlKQotICAgICAgICAgICRuZXh0TGluayA9ICRzZWxMaXN0SXRlbS5wYXJlbnRzKCdsaTplcSgxKScpLm5leHQoJ2xpLm5hdi1zZWN0aW9uJykuZmluZCgnYTplcSgwKScpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0YXJ0Q2xhc3MpIHsKLSAgICAgICQoJy5zdGFydC1jbGFzcy1saW5rJykuYXR0cignaHJlZicsICRuZXh0TGluay5hdHRyKCdocmVmJykpLnJlbW92ZUNsYXNzKCJoaWRlIik7Ci0KLSAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gdHJhaW5pbmcgYmFyIChiZWxvdyB0aGUgc3RhcnQgYnV0dG9uKSwKLSAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBhZGQgYSBib3R0b20gYm9yZGVyIHRvIGJ1dHRvbgotICAgICAgaWYgKCEkKCIjdGIiKS5sZW5ndGgpIHsKLSAgICAgICAgJCgnLnN0YXJ0LWNsYXNzLWxpbmsnKS5jc3Moeydib3JkZXItYm90dG9tJzonMXB4IHNvbGlkICNEQURBREEnfSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChpc0Nyb3NzaW5nQm91bmRhcnkgJiYgISQoJ2JvZHkuZGVzaWduJykubGVuZ3RoKSB7ICAvLyBEZXNpZ24gYWx3YXlzIGNyb3NzZXMgYm91bmRhcmllcwotICAgICAgJCgnLmNvbnRlbnQtZm9vdGVyLm5leHQtY2xhc3MnKS5zaG93KCk7Ci0gICAgICAkKCcubmV4dC1wYWdlLWxpbmsnKS5hdHRyKCdocmVmJywnJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCJoaWRlIikuYWRkQ2xhc3MoImRpc2FibGVkIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsaWNrKGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0pOwotCi0gICAgICAkKCcubmV4dC1jbGFzcy1saW5rJykuYXR0cignaHJlZicsJG5leHRMaW5rLmF0dHIoJ2hyZWYnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCJoaWRlIikuYXBwZW5kKCRuZXh0TGluay5odG1sKCkpOwotICAgICAgJCgnLm5leHQtY2xhc3MtbGluaycpLmZpbmQoJy5uZXcnKS5lbXB0eSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkKCcubmV4dC1wYWdlLWxpbmsnKS5hdHRyKCdocmVmJywgJG5leHRMaW5rLmF0dHIoJ2hyZWYnKSkucmVtb3ZlQ2xhc3MoImhpZGUiKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN0YXJ0Q2xhc3MgJiYgJHByZXZMaW5rLmxlbmd0aCkgewotICAgICAgdmFyIHByZXZIcmVmID0gJHByZXZMaW5rLmF0dHIoJ2hyZWYnKTsKLSAgICAgIGlmIChwcmV2SHJlZiA9PSBTSVRFX1JPT1QgKyAnaW5kZXguaHRtbCcpIHsKLSAgICAgICAgLy8gRG9uJ3Qgc2hvdyBQcmV2aW91cyB3aGVuIGl0IGxlYWRzIHRvIHRoZSBob21lcGFnZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCgnLnByZXYtcGFnZS1saW5rJykuYXR0cignaHJlZicsICRwcmV2TGluay5hdHRyKCdocmVmJykpLnJlbW92ZUNsYXNzKCJoaWRlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgdGhpcyBpcyBhIHRyYWluaW5nICdhcnRpY2xlJywgdGhlcmUgc2hvdWxkIGJlIG5vIHByZXYvbmV4dCBuYXYKLSAgICAvLyAuLi4gaWYgdGhlIGdyYW5kcGFyZW50IGlzIHRoZSAibmF2IiAuLi4gYW5kIGl0IGhhcyBubyBjaGlsZCBsaXN0IGl0ZW1zLi4uCi0gICAgaWYgKHRyYWluaW5nICYmICRzZWxMaXN0SXRlbS5wYXJlbnRzKCd1bCcpLmVxKDEpLmlzKCdbaWQ9Im5hdiJdJykgJiYKLSAgICAgICAgISRzZWxMaXN0SXRlbS5maW5kKCdsaScpLmxlbmd0aCkgewotICAgICAgJCgnLm5leHQtcGFnZS1saW5rLC5wcmV2LXBhZ2UtbGluaycpLmF0dHIoJ2hyZWYnLCcnKS5hZGRDbGFzcygiZGlzYWJsZWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xpY2soZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfSk7Ci0gICAgfQotCi0gIH0KLS8vSWYgYXV0by10b2MgZGl2IGlzIHByZXNlbnQsIGdlbmVyYXRlIHRoZSBhdXRvbWF0ZWQgVE9DCi1pZiAoJCgiI2F1dG8tdG9jIikuaXMoJyonKSkgewotICB2YXIgcHJldmlvdXMgPSAkKHRoaXMpOyAvL25lZWRzIHRvIGJlIG5vdCBudWxsIGZpcnN0IHRpbWUgdGhyb3VnaCBsb29wCi0gIHZhciB0b2MgPSAiIjsKLSAgJCgiI2pkLWNvbnRlbnQiKS5maW5kKCJoMiwgaDMiKS5ub3QoJzpmaXJzdC1jaGlsZCcpLmVhY2goZnVuY3Rpb24oaSkgeyAvLyBoYXZlIHRvIHNraXAgdGhlIGZpcnN0IGgyLCB3aGljaCBpcyAiSW4gdGhpcyBEb2N1bWVudCIgd2l0aCBub3Q6Zmlyc3QtY2hpbGQKLSAgICAgIHZhciBjdXJyZW50ID0gJCh0aGlzKTsKLSAgICAgIGlmKGN1cnJlbnQuaXMoImgzIikgJiYgcHJldmlvdXMuaXMoImgyIikpeyAvL25lZWQgbmVzdGVkIG9scyBmb3IgaDNzCi0gICAgICAgIHRvYys9IjxvbD4iOwotICAgICAgfQotICAgICAgZWxzZSBpZihjdXJyZW50LmlzKCJoMiIpICYmIHByZXZpb3VzLmlzKCJoMyIpKXsgLy9jbG9zZSB1cCB0aGUgbmVzdGVkIG9sCi0gICAgICAgIHRvYys9Ijwvb2w+IjsKLSAgICAgIH0KLSAgICAgICAgdG9jKz0iPGxpPjxhIGhyZWY9JyMiICsgY3VycmVudFswXS5pZCArICInPiIgKwotICAgICAgICAgIGN1cnJlbnQuaHRtbCgpICsgIjwvYT48L2xpPiI7Ci0KLSAgICAgIHByZXZpb3VzID0gY3VycmVudDsgIC8va2VlcCB0cmFjayBvZiBwcmV2aW91cyBlbGVtZW50IG5leHQgdGltZSB0aHJvdWdoIGxvb3AKLSAgfSk7Ci0gICQoIiNhdXRvLXRvYyIpLmFwcGVuZCh0b2MpOyAgLy9hcHBlbmQgdG8gdGhlIGRpdgotfQotCi0gIC8vIFNldCB1cCB0aGUgY291cnNlIGxhbmRpbmcgcGFnZXMgZm9yIFRyYWluaW5nIHdpdGggY2xhc3MgbmFtZXMgYW5kIGRlc2NyaXB0aW9ucwotICBpZiAoJCgnYm9keS50cmFpbmluZ2NvdXJzZScpLmxlbmd0aCkgewotICAgIHZhciAkY2xhc3NMaW5rcyA9ICRzZWxMaXN0SXRlbS5maW5kKCd1bCBsaSBhJykubm90KCcjbmF2IC5uYXYtc2VjdGlvbiAubmF2LXNlY3Rpb24gdWwgYScpOwotICAgIHZhciAkY2xhc3NEZXNjcmlwdGlvbnMgPSAkY2xhc3NMaW5rcy5hdHRyKCdkZXNjcmlwdGlvbicpOwotCi0gICAgdmFyICRvbENsYXNzZXMgID0gJCgnPG9sIGNsYXNzPSJjbGFzcy1saXN0Ij48L29sPicpOwotICAgIHZhciAkbGlDbGFzczsKLSAgICB2YXIgJGltZ0ljb247Ci0gICAgdmFyICRoMlRpdGxlOwotICAgIHZhciAkcFN1bW1hcnk7Ci0gICAgdmFyICRvbExlc3NvbnM7Ci0gICAgdmFyICRsaUxlc3NvbjsKLSAgICAkY2xhc3NMaW5rcy5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7Ci0gICAgICAkbGlDbGFzcyAgPSAkKCc8bGk+PC9saT4nKTsKLSAgICAgICRoMlRpdGxlICA9ICQoJzxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iJyskKHRoaXMpLmF0dHIoJ2hyZWYnKSsnIj48aDI+JyArICQodGhpcykuaHRtbCgpKyc8L2gyPjxzcGFuPjwvc3Bhbj48L2E+Jyk7Ci0gICAgICAkcFN1bW1hcnkgPSAkKCc8cCBjbGFzcz0iZGVzY3JpcHRpb24iPicgKyAkKHRoaXMpLmF0dHIoJ2Rlc2NyaXB0aW9uJykgKyAnPC9wPicpOwotCi0gICAgICAkb2xMZXNzb25zICA9ICQoJzxvbCBjbGFzcz0ibGVzc29uLWxpc3QiPjwvb2w+Jyk7Ci0KLSAgICAgICRsZXNzb25zID0gJCh0aGlzKS5jbG9zZXN0KCdsaScpLmZpbmQoJ3VsIGxpIGEnKTsKLQotICAgICAgaWYgKCRsZXNzb25zLmxlbmd0aCkgewotICAgICAgICAkaW1nSWNvbiA9ICQoJzxpbWcgc3JjPSInK3RvUm9vdCsnYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS10dXRvcmlhbC5wbmciIGFsdD0iIi8+Jyk7Ci0gICAgICAgICRsZXNzb25zLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKLSAgICAgICAgICAkb2xMZXNzb25zLmFwcGVuZCgnPGxpPjxhIGhyZWY9IicrJCh0aGlzKS5hdHRyKCdocmVmJykrJyI+JyArICQodGhpcykuaHRtbCgpKyc8L2E+PC9saT4nKTsKLSAgICAgICAgfSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkaW1nSWNvbiA9ICQoJzxpbWcgc3JjPSInK3RvUm9vdCsnYXNzZXRzL2ltYWdlcy9yZXNvdXJjZS1hcnRpY2xlLnBuZyIgYWx0PSIiLz4nKTsKLSAgICAgICAgJHBTdW1tYXJ5LmFkZENsYXNzKCdhcnRpY2xlJyk7Ci0gICAgICB9Ci0KLSAgICAgICRsaUNsYXNzLmFwcGVuZCgkaDJUaXRsZSkuYXBwZW5kKCRpbWdJY29uKS5hcHBlbmQoJHBTdW1tYXJ5KS5hcHBlbmQoJG9sTGVzc29ucyk7Ci0gICAgICAkb2xDbGFzc2VzLmFwcGVuZCgkbGlDbGFzcyk7Ci0gICAgfSk7Ci0gICAgJCgnLmpkLWRlc2NyJykuYXBwZW5kKCRvbENsYXNzZXMpOwotICB9Ci0KLQotCi0KLSAgLy8gU2V0IHVwIGV4cGFuZC9jb2xsYXBzZSBiZWhhdmlvcgotICAkKCcjbmF2IGxpLm5hdi1zZWN0aW9uIC5uYXYtc2VjdGlvbi1oZWFkZXInKS5jbGljayhmdW5jdGlvbigpIHsKLSAgICB2YXIgc2VjdGlvbiA9ICQodGhpcykuY2xvc2VzdCgnbGkubmF2LXNlY3Rpb24nKTsKLSAgICBpZiAoc2VjdGlvbi5oYXNDbGFzcygnZXhwYW5kZWQnKSkgewotICAgIC8qIGhpZGUgbWUgKi8KLSAgICAvLyAgaWYgKHNlY3Rpb24uaGFzQ2xhc3MoJ3NlbGVjdGVkJykgfHwgc2VjdGlvbi5maW5kKCdsaScpLmhhc0NsYXNzKCdzZWxlY3RlZCcpKSB7Ci0gICAvLyAgIC8qIGJ1dCBub3QgaWYgbXlzZWxmIG9yIG15IGRlc2NlbmRlbnRzIGFyZSBzZWxlY3RlZCAqLwotICAgLy8gICAgIHJldHVybjsKLSAgICAvLyAgfQotICAgICAgc2VjdGlvbi5jaGlsZHJlbigndWwnKS5zbGlkZVVwKDI1MCwgZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNlY3Rpb24uY2xvc2VzdCgnbGknKS5yZW1vdmVDbGFzcygnZXhwYW5kZWQnKTsKLSAgICAgICAgcmVzaXplTmF2KCk7Ci0gICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgIC8qIHNob3cgbWUgKi8KLSAgICAgIC8vIGZpcnN0IGhpZGUgYWxsIG90aGVyIHNpYmxpbmdzCi0gICAgICB2YXIgJG90aGVycyA9ICQoJ2xpLm5hdi1zZWN0aW9uLmV4cGFuZGVkJywgJCh0aGlzKS5jbG9zZXN0KCd1bCcpKTsKLSAgICAgICRvdGhlcnMucmVtb3ZlQ2xhc3MoJ2V4cGFuZGVkJykuY2hpbGRyZW4oJ3VsJykuc2xpZGVVcCgyNTApOwotCi0gICAgICAvLyBub3cgZXhwYW5kIG1lCi0gICAgICBzZWN0aW9uLmNsb3Nlc3QoJ2xpJykuYWRkQ2xhc3MoJ2V4cGFuZGVkJyk7Ci0gICAgICBzZWN0aW9uLmNoaWxkcmVuKCd1bCcpLnNsaWRlRG93bigyNTAsIGZ1bmN0aW9uKCkgewotICAgICAgICByZXNpemVOYXYoKTsKLSAgICAgIH0pOwotICAgIH0KLSAgfSk7Ci0KLSAgJCgiLnNjcm9sbC1wYW5lIikuc2Nyb2xsKGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9KTsKLQotICAvKiBSZXNpemUgbmF2IGhlaWdodCB3aGVuIHdpbmRvdyBoZWlnaHQgY2hhbmdlcyAqLwotICAkKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCkgewotICAgIGlmICgkKCcjc2lkZS1uYXYnKS5sZW5ndGggPT0gMCkgcmV0dXJuOwotICAgIHZhciBzdHlsZXNoZWV0ID0gJCgnbGlua1tyZWw9InN0eWxlc2hlZXQiXVtjbGFzcz0iZnVsbHNjcmVlbiJdJyk7Ci0gICAgc2V0TmF2QmFyTGVmdFBvcygpOyAvLyBkbyB0aGlzIGV2ZW4gaWYgc2lkZW5hdiBpc24ndCBmaXhlZCBiZWNhdXNlIGl0IGNvdWxkIGJlY29tZSBmaXhlZAotICAgIC8vIG1ha2Ugc2lkZW5hdiBiZWhhdmUgd2hlbiByZXNpemluZyB0aGUgd2luZG93IGFuZCBzaWRlLXNjb2xsaW5nIGlzIGEgY29uY2VybgotICAgIGlmIChuYXZCYXJJc0ZpeGVkKSB7Ci0gICAgICBpZiAoKHN0eWxlc2hlZXQuYXR0cigiZGlzYWJsZWQiKSA9PSAiZGlzYWJsZWQiKSB8fCBzdHlsZXNoZWV0Lmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgIHVwZGF0ZVNpZGVOYXZQb3NpdGlvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdXBkYXRlU2lkZW5hdkZ1bGxzY3JlZW5XaWR0aCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXNpemVOYXYoKTsKLSAgfSk7Ci0KLQotICAvLyBTZXQgdXAgZml4ZWQgbmF2YmFyCi0gIHZhciBwcmV2U2Nyb2xsTGVmdCA9IDA7IC8vIHVzZWQgdG8gY29tcGFyZSBjdXJyZW50IHBvc2l0aW9uIHRvIHByZXZpb3VzIHBvc2l0aW9uIG9mIGhvcml6IHNjcm9sbAotICAkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKGV2ZW50KSB7Ci0gICAgaWYgKCQoJyNzaWRlLW5hdicpLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0gICAgaWYgKGV2ZW50LnRhcmdldC5ub2RlTmFtZSA9PSAiRElWIikgewotICAgICAgLy8gRHVtcCBzY3JvbGwgZXZlbnQgaWYgdGhlIHRhcmdldCBpcyBhIERJViwgYmVjYXVzZSB0aGF0IG1lYW5zIHRoZSBldmVudCBpcyBjb21pbmcKLSAgICAgIC8vIGZyb20gYSBzY3JvbGxhYmxlIGRpdiBhbmQgc28gdGhlcmUncyBubyBuZWVkIHRvIG1ha2UgYWRqdXN0bWVudHMgdG8gb3VyIGxheW91dAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YXIgc2Nyb2xsVG9wID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpOwotICAgIHZhciBoZWFkZXJIZWlnaHQgPSAkKCcjaGVhZGVyJykub3V0ZXJIZWlnaHQoKTsKLSAgICB2YXIgc3ViaGVhZGVySGVpZ2h0ID0gJCgnI25hdi14Jykub3V0ZXJIZWlnaHQoKTsKLSAgICB2YXIgc2VhcmNoUmVzdWx0SGVpZ2h0ID0gJCgnI3NlYXJjaFJlc3VsdHMnKS5pcygiOnZpc2libGUiKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2hSZXN1bHRzJykub3V0ZXJIZWlnaHQoKSA6IDA7Ci0gICAgdmFyIHRvdGFsSGVhZGVySGVpZ2h0ID0gaGVhZGVySGVpZ2h0ICsgc3ViaGVhZGVySGVpZ2h0ICsgc2VhcmNoUmVzdWx0SGVpZ2h0OwotICAgIC8vIHdlIHNldCB0aGUgbmF2YmFyIGZpeGVkIHdoZW4gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBiZXlvbmQgdGhlIGhlaWdodCBvZiB0aGUgc2l0ZSBoZWFkZXIuLi4KLSAgICB2YXIgbmF2QmFyU2hvdWxkQmVGaXhlZCA9IHNjcm9sbFRvcCA+IHRvdGFsSGVhZGVySGVpZ2h0OwotICAgIC8vIC4uLiBleGNlcHQgaWYgdGhlIGRvY3VtZW50IGNvbnRlbnQgaXMgc2hvcnRlciB0aGFuIHRoZSBzaWRlbmF2IGhlaWdodC4KLSAgICAvLyAodGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgY3JhenkgYmVoYXZpb3Igb24gT1NYIExpb24gZHVlIHRvIG92ZXJzY3JvbGwgYm91bmNpbmcpCi0gICAgaWYgKCQoIiNkb2MtY29sIikuaGVpZ2h0KCkgPCAkKCIjc2lkZS1uYXYiKS5oZWlnaHQoKSkgewotICAgICAgbmF2QmFyU2hvdWxkQmVGaXhlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHZhciBzY3JvbGxMZWZ0ID0gJCh3aW5kb3cpLnNjcm9sbExlZnQoKTsKLSAgICAvLyBXaGVuIHRoZSBzaWRlbmF2IGlzIGZpeGVkIGFuZCB1c2VyIHNjcm9sbHMgaG9yaXpvbnRhbGx5LCByZXBvc2l0aW9uIHRoZSBzaWRlbmF2IHRvIG1hdGNoCi0gICAgaWYgKG5hdkJhcklzRml4ZWQgJiYgKHNjcm9sbExlZnQgIT0gcHJldlNjcm9sbExlZnQpKSB7Ci0gICAgICB1cGRhdGVTaWRlTmF2UG9zaXRpb24oKTsKLSAgICAgIHByZXZTY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDsKLSAgICB9Ci0KLSAgICAvLyBEb24ndCBjb250aW51ZSBpZiB0aGUgaGVhZGVyIGlzIHN1ZmZpY2VudGx5IGZhciBhd2F5Ci0gICAgLy8gKHRvIGF2b2lkIGludGVuc2l2ZSByZXNpemluZyB0aGF0IHNsb3dzIHNjcm9sbGluZykKLSAgICBpZiAobmF2QmFySXNGaXhlZCAmJiBuYXZCYXJTaG91bGRCZUZpeGVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG5hdkJhcklzRml4ZWQgIT0gbmF2QmFyU2hvdWxkQmVGaXhlZCkgewotICAgICAgaWYgKG5hdkJhclNob3VsZEJlRml4ZWQpIHsKLSAgICAgICAgLy8gbWFrZSBpdCBmaXhlZAotICAgICAgICB2YXIgd2lkdGggPSAkKCcjZGV2ZG9jLW5hdicpLndpZHRoKCk7Ci0gICAgICAgICQoJyNkZXZkb2MtbmF2JykKLSAgICAgICAgICAgIC5hZGRDbGFzcygnZml4ZWQnKQotICAgICAgICAgICAgLmNzcyh7J3dpZHRoJzp3aWR0aCsncHgnfSkKLSAgICAgICAgICAgIC5wcmVwZW5kVG8oJyNib2R5LWNvbnRlbnQnKTsKLSAgICAgICAgLy8gYWRkIG5lYXRvICJiYWNrIHRvIHRvcCIgYnV0dG9uCi0gICAgICAgICQoJyNkZXZkb2MtbmF2IGEudG90b3AnKS5jc3MoeydkaXNwbGF5JzonYmxvY2snLCd3aWR0aCc6JCgiI25hdiIpLmlubmVyV2lkdGgoKSsncHgnfSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBzaWRlbmFhdiBwb3NpdGlvbiBmb3Igc2lkZSBzY3JvbGxpbmcKLSAgICAgICAgdXBkYXRlU2lkZU5hdlBvc2l0aW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBtYWtlIGl0IHN0YXRpYyBhZ2FpbgotICAgICAgICAkKCcjZGV2ZG9jLW5hdicpCi0gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ZpeGVkJykKLSAgICAgICAgICAgIC5jc3Moeyd3aWR0aCc6J2F1dG8nLCdtYXJnaW4nOicnfSkKLSAgICAgICAgICAgIC5wcmVwZW5kVG8oJyNzaWRlLW5hdicpOwotICAgICAgICAkKCcjZGV2ZG9jLW5hdiBhLnRvdG9wJykuaGlkZSgpOwotICAgICAgfQotICAgICAgbmF2QmFySXNGaXhlZCA9IG5hdkJhclNob3VsZEJlRml4ZWQ7Ci0gICAgfQotCi0gICAgcmVzaXplTmF2KDI1MCk7IC8vIHBhc3MgdHJ1ZSBpbiBvcmRlciB0byBkZWxheSB0aGUgc2Nyb2xsYmFyIHJlLWluaXRpYWxpemF0aW9uIGZvciBwZXJmb3JtYW5jZQotICB9KTsKLQotCi0gIHZhciBuYXZCYXJMZWZ0UG9zOwotICBpZiAoJCgnI2RldmRvYy1uYXYnKS5sZW5ndGgpIHsKLSAgICBzZXROYXZCYXJMZWZ0UG9zKCk7Ci0gIH0KLQotCi0gIC8vIFN0b3AgZXhwYW5kL2NvbGxhcHNlIGJlaGF2aW9yIHdoZW4gY2xpY2tpbmcgb24gbmF2IHNlY3Rpb24gbGlua3MgKHNpbmNlIHdlJ3JlIG5hdmlnYXRpbmcgYXdheQotICAvLyBmcm9tIHRoZSBwYWdlKQotICAkKCcubmF2LXNlY3Rpb24taGVhZGVyJykuZmluZCgnYTplcSgwKScpLmNsaWNrKGZ1bmN0aW9uKGV2dCkgewotICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9KTsKLQotICAvLyBTZXQgdXAgcGxheS1vbi1ob3ZlciA8dmlkZW8+IHRhZ3MuCi0gICQoJ3ZpZGVvLnBsYXktb24taG92ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7Ci0gICAgJCh0aGlzKS5nZXQoMCkubG9hZCgpOyAvLyBpbiBjYXNlIHRoZSB2aWRlbyBpc24ndCBzZWVrYWJsZQotICAgICQodGhpcykuZ2V0KDApLnBsYXkoKTsKLSAgfSk7Ci0KLSAgLy8gU2V0IHVwIHRvb2x0aXBzCi0gIHZhciBUT09MVElQX01BUkdJTiA9IDEwOwotICAkKCdhY3JvbnltLC50b29sdGlwLWxpbmsnKS5lYWNoKGZ1bmN0aW9uKCkgewotICAgIHZhciAkdGFyZ2V0ID0gJCh0aGlzKTsKLSAgICB2YXIgJHRvb2x0aXAgPSAkKCc8ZGl2PicpCi0gICAgICAgIC5hZGRDbGFzcygndG9vbHRpcC1ib3gnKQotICAgICAgICAuYXBwZW5kKCR0YXJnZXQuYXR0cigndGl0bGUnKSkKLSAgICAgICAgLmhpZGUoKQotICAgICAgICAuYXBwZW5kVG8oJ2JvZHknKTsKLSAgICAkdGFyZ2V0LnJlbW92ZUF0dHIoJ3RpdGxlJyk7Ci0KLSAgICAkdGFyZ2V0LmhvdmVyKGZ1bmN0aW9uKCkgewotICAgICAgLy8gaW4KLSAgICAgIHZhciB0YXJnZXRSZWN0ID0gJHRhcmdldC5vZmZzZXQoKTsKLSAgICAgIHRhcmdldFJlY3Qud2lkdGggPSAkdGFyZ2V0LndpZHRoKCk7Ci0gICAgICB0YXJnZXRSZWN0LmhlaWdodCA9ICR0YXJnZXQuaGVpZ2h0KCk7Ci0KLSAgICAgICR0b29sdGlwLmNzcyh7Ci0gICAgICAgIGxlZnQ6IHRhcmdldFJlY3QubGVmdCwKLSAgICAgICAgdG9wOiB0YXJnZXRSZWN0LnRvcCArIHRhcmdldFJlY3QuaGVpZ2h0ICsgVE9PTFRJUF9NQVJHSU4KLSAgICAgIH0pOwotICAgICAgJHRvb2x0aXAuYWRkQ2xhc3MoJ2JlbG93Jyk7Ci0gICAgICAkdG9vbHRpcC5zaG93KCk7Ci0gICAgfSwgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBvdXQKLSAgICAgICR0b29sdGlwLmhpZGUoKTsKLSAgICB9KTsKLSAgfSk7Ci0KLSAgLy8gU2V0IHVwIDxoMj4gZGVlcGxpbmtzCi0gICQoJ2gyJykuY2xpY2soZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGlkID0gJCh0aGlzKS5hdHRyKCdpZCcpOwotICAgIGlmIChpZCkgewotICAgICAgZG9jdW1lbnQubG9jYXRpb24uaGFzaCA9IGlkOwotICAgIH0KLSAgfSk7Ci0KLSAgLy9Mb2FkcyB0aGUgKzEgYnV0dG9uCi0gIHZhciBwbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyBwby50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7IHBvLmFzeW5jID0gdHJ1ZTsKLSAgcG8uc3JjID0gJ2h0dHBzOi8vYXBpcy5nb29nbGUuY29tL2pzL3BsdXNvbmUuanMnOwotICB2YXIgcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTsgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwbywgcyk7Ci0KLQotICAvLyBSZXZpc2UgdGhlIHNpZGVuYXYgd2lkdGhzIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHNjcm9sbGJhcgotICAvLyB3aGljaCBhdm9pZHMgdGhlIHZpc2libGUgd2lkdGggZnJvbSBjaGFuZ2luZyBlYWNoIHRpbWUgdGhlIGJhciBhcHBlYXJzCi0gIHZhciAkc2lkZW5hdiA9ICQoIiNzaWRlLW5hdiIpOwotICB2YXIgc2lkZW5hdl93aWR0aCA9IHBhcnNlSW50KCRzaWRlbmF2LmlubmVyV2lkdGgoKSk7Ci0KLSAgJCgiI2RldmRvYy1uYXYgICNuYXYiKS5jc3MoIndpZHRoIiwgc2lkZW5hdl93aWR0aCAtIDQgKyAicHgiKTsgLy8gNHB4IGlzIHNjcm9sbGJhciB3aWR0aAotCi0KLSAgJCgiLnNjcm9sbC1wYW5lIikucmVtb3ZlQXR0cigidGFiaW5kZXgiKTsgLy8gZ2V0IHJpZCBvZiB0YWJpbmRleCBhZGRlZCBieSBqc2Nyb2xsZXIKLQotICBpZiAoJCgiLnNjcm9sbC1wYW5lIikubGVuZ3RoID4gMSkgewotICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSB1c2VyIHByZWZlcmVuY2UgZm9yIHRoZSBwYW5lbCBoZWlnaHRzCi0gICAgdmFyIGNvb2tpZUhlaWdodCA9IHJlYWRDb29raWUoInJlZmVyZW5jZV9oZWlnaHQiKTsKLSAgICBpZiAoY29va2llSGVpZ2h0KSB7Ci0gICAgICByZXN0b3JlSGVpZ2h0KGNvb2tpZUhlaWdodCk7Ci0gICAgfQotICB9Ci0KLSAgcmVzaXplTmF2KCk7Ci0KLSAgLyogaW5pdCB0aGUgbGFuZ3VhZ2Ugc2VsZWN0b3IgYmFzZWQgb24gdXNlciBjb29raWUgZm9yIGxhbmcgKi8KLSAgbG9hZExhbmdQcmVmKCk7Ci0gIGNoYW5nZU5hdkxhbmcoZ2V0TGFuZ1ByZWYoKSk7Ci0KLSAgLyogc2V0dXAgZXZlbnQgaGFuZGxlcnMgdG8gZW5zdXJlIHRoZSBvdmVyZmxvdyBtZW51IGlzIHZpc2libGUgd2hpbGUgcGlja2luZyBsYW5nICovCi0gICQoIiNsYW5ndWFnZSBzZWxlY3QiKQotICAgICAgLm1vdXNlZG93bihmdW5jdGlvbigpIHsKLSAgICAgICAgJCgiZGl2Lm1vcmVob3ZlciIpLmFkZENsYXNzKCJob3ZlciIpOyB9KQotICAgICAgLmJsdXIoZnVuY3Rpb24oKSB7Ci0gICAgICAgICQoImRpdi5tb3JlaG92ZXIiKS5yZW1vdmVDbGFzcygiaG92ZXIiKTsgfSk7Ci0KLSAgLyogc29tZSBnbG9iYWwgdmFyaWFibGUgc2V0dXAgKi8KLSAgcmVzaXplUGFja2FnZXNOYXYgPSAkKCIjcmVzaXplLXBhY2thZ2VzLW5hdiIpOwotICBjbGFzc2VzTmF2ID0gJCgiI2NsYXNzZXMtbmF2Iik7Ci0gIGRldmRvY05hdiA9ICQoIiNkZXZkb2MtbmF2Iik7Ci0KLSAgdmFyIGNvb2tpZVBhdGggPSAiIjsKLSAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZigiL3JlZmVyZW5jZS8iKSAhPSAtMSkgewotICAgIGNvb2tpZVBhdGggPSAicmVmZXJlbmNlXyI7Ci0gIH0gZWxzZSBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCIvZ3VpZGUvIikgIT0gLTEpIHsKLSAgICBjb29raWVQYXRoID0gImd1aWRlXyI7Ci0gIH0gZWxzZSBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCIvdG9vbHMvIikgIT0gLTEpIHsKLSAgICBjb29raWVQYXRoID0gInRvb2xzXyI7Ci0gIH0gZWxzZSBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCIvdHJhaW5pbmcvIikgIT0gLTEpIHsKLSAgICBjb29raWVQYXRoID0gInRyYWluaW5nXyI7Ci0gIH0gZWxzZSBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCIvZGVzaWduLyIpICE9IC0xKSB7Ci0gICAgY29va2llUGF0aCA9ICJkZXNpZ25fIjsKLSAgfSBlbHNlIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoIi9kaXN0cmlidXRlLyIpICE9IC0xKSB7Ci0gICAgY29va2llUGF0aCA9ICJkaXN0cmlidXRlXyI7Ci0gIH0KLQotfSk7Ci0vLyBFTkQgb2YgdGhlIG9ubG9hZCBldmVudAotCi0KLQotZnVuY3Rpb24gdG9nZ2xlRnVsbHNjcmVlbihlbmFibGUpIHsKLSAgdmFyIGRlbGF5ID0gMjA7Ci0gIHZhciBlbmFibGVkID0gdHJ1ZTsKLSAgdmFyIHN0eWxlc2hlZXQgPSAkKCdsaW5rW3JlbD0ic3R5bGVzaGVldCJdW2NsYXNzPSJmdWxsc2NyZWVuIl0nKTsKLSAgaWYgKGVuYWJsZSkgewotICAgIC8vIEN1cnJlbnRseSBOT1QgVVNJTkcgZnVsbHNjcmVlbjsgZW5hYmxlIGZ1bGxzY3JlZW4KLSAgICBzdHlsZXNoZWV0LnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7Ci0gICAgJCgnI25hdi1zd2FwIC5mdWxsc2NyZWVuJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7Ci0gICAgJCgnI2RldmRvYy1uYXYnKS5jc3Moe2xlZnQ6Jyd9KTsKLSAgICBzZXRUaW1lb3V0KHVwZGF0ZVNpZGVuYXZGdWxsc2NyZWVuV2lkdGgsZGVsYXkpOyAvLyBuZWVkIHRvIHdhaXQgYSBtb21lbnQgZm9yIGNzcyB0byBzd2l0Y2gKLSAgICBlbmFibGVkID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICAvLyBDdXJyZW50bHkgVVNJTkcgZnVsbHNjcmVlbjsgZGlzYWJsZSBmdWxsc2NyZWVuCi0gICAgc3R5bGVzaGVldC5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwotICAgICQoJyNuYXYtc3dhcCAuZnVsbHNjcmVlbicpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwotICAgIHNldFRpbWVvdXQodXBkYXRlU2lkZW5hdkZpeGVkV2lkdGgsZGVsYXkpOyAvLyBuZWVkIHRvIHdhaXQgYSBtb21lbnQgZm9yIGNzcyB0byBzd2l0Y2gKLSAgICBlbmFibGVkID0gZmFsc2U7Ci0gIH0KLSAgd3JpdGVDb29raWUoImZ1bGxzY3JlZW4iLCBlbmFibGVkLCBudWxsLCBudWxsKTsKLSAgc2V0TmF2QmFyTGVmdFBvcygpOwotICByZXNpemVOYXYoZGVsYXkpOwotICB1cGRhdGVTaWRlTmF2UG9zaXRpb24oKTsKLSAgc2V0VGltZW91dChpbml0U2lkZW5hdkhlaWdodFJlc2l6ZSxkZWxheSk7Ci19Ci0KLQotZnVuY3Rpb24gc2V0TmF2QmFyTGVmdFBvcygpIHsKLSAgbmF2QmFyTGVmdFBvcyA9ICQoJyNib2R5LWNvbnRlbnQnKS5vZmZzZXQoKS5sZWZ0OwotfQotCi0KLWZ1bmN0aW9uIHVwZGF0ZVNpZGVOYXZQb3NpdGlvbigpIHsKLSAgdmFyIG5ld0xlZnQgPSAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpIC0gbmF2QmFyTGVmdFBvczsKLSAgJCgnI2RldmRvYy1uYXYnKS5jc3Moe2xlZnQ6IC1uZXdMZWZ0fSk7Ci0gICQoJyNkZXZkb2MtbmF2IC50b3RvcCcpLmNzcyh7bGVmdDogLShuZXdMZWZ0IC0gcGFyc2VJbnQoJCgnI3NpZGUtbmF2JykuY3NzKCdtYXJnaW4tbGVmdCcpKSl9KTsKLX0KLQotCi0KLQotCi0KLQotCi0vLyBUT0RPOiB1c2UgJChkb2N1bWVudCkucmVhZHkgaW5zdGVhZAotZnVuY3Rpb24gYWRkTG9hZEV2ZW50KG5ld2Z1bikgewotICB2YXIgY3VycmVudCA9IHdpbmRvdy5vbmxvYWQ7Ci0gIGlmICh0eXBlb2Ygd2luZG93Lm9ubG9hZCAhPSAnZnVuY3Rpb24nKSB7Ci0gICAgd2luZG93Lm9ubG9hZCA9IG5ld2Z1bjsKLSAgfSBlbHNlIHsKLSAgICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7Ci0gICAgICBjdXJyZW50KCk7Ci0gICAgICBuZXdmdW4oKTsKLSAgICB9Ci0gIH0KLX0KLQotdmFyIGFnZW50ID0gbmF2aWdhdG9yWyd1c2VyQWdlbnQnXS50b0xvd2VyQ2FzZSgpOwotLy8gSWYgYSBtb2JpbGUgcGhvbmUsIHNldCBmbGFnIGFuZCBkbyBtb2JpbGUgc2V0dXAKLWlmICgoYWdlbnQuaW5kZXhPZigibW9iaWxlIikgIT0gLTEpIHx8ICAgICAgLy8gYW5kcm9pZCwgaXBob25lLCBpcG9kCi0gICAgKGFnZW50LmluZGV4T2YoImJsYWNrYmVycnkiKSAhPSAtMSkgfHwKLSAgICAoYWdlbnQuaW5kZXhPZigid2Vib3MiKSAhPSAtMSkgfHwKLSAgICAoYWdlbnQuaW5kZXhPZigibWluaSIpICE9IC0xKSkgeyAgICAgICAgLy8gb3BlcmEgbWluaSBicm93c2VycwotICBpc01vYmlsZSA9IHRydWU7Ci19Ci0KLQotYWRkTG9hZEV2ZW50KCBmdW5jdGlvbigpIHsKLSAgJCgicHJlOm5vdCgubm8tcHJldHR5LXByaW50KSIpLmFkZENsYXNzKCJwcmV0dHlwcmludCIpOwotICBwcmV0dHlQcmludCgpOwotfSApOwotCi0KLQotCi0vKiAjIyMjIyMjIyMgUkVTSVpFIFRIRSBTSURFTkFWIEhFSUdIVCAjIyMjIyMjIyMjICovCi0KLWZ1bmN0aW9uIHJlc2l6ZU5hdihkZWxheSkgewotICB2YXIgJG5hdiA9ICQoIiNkZXZkb2MtbmF2Iik7Ci0gIHZhciAkd2luZG93ID0gJCh3aW5kb3cpOwotICB2YXIgbmF2SGVpZ2h0OwotCi0gIC8vIEdldCB0aGUgaGVpZ2h0IG9mIGVudGlyZSB3aW5kb3cgYW5kIHRoZSB0b3RhbCBoZWFkZXIgaGVpZ2h0LgotICAvLyBUaGVuIGZpZ3VyZSBvdXQgYmFzZWQgb24gc2Nyb2xsIHBvc2l0aW9uIHdoZXRoZXIgdGhlIGhlYWRlciBpcyB2aXNpYmxlCi0gIHZhciB3aW5kb3dIZWlnaHQgPSAkd2luZG93LmhlaWdodCgpOwotICB2YXIgc2Nyb2xsVG9wID0gJHdpbmRvdy5zY3JvbGxUb3AoKTsKLSAgdmFyIGhlYWRlckhlaWdodCA9ICQoJyNoZWFkZXInKS5vdXRlckhlaWdodCgpOwotICB2YXIgc3ViaGVhZGVySGVpZ2h0ID0gJCgnI25hdi14Jykub3V0ZXJIZWlnaHQoKTsKLSAgdmFyIGhlYWRlclZpc2libGUgPSAoc2Nyb2xsVG9wIDwgKGhlYWRlckhlaWdodCArIHN1YmhlYWRlckhlaWdodCkpOwotCi0gIC8vIGdldCB0aGUgaGVpZ2h0IG9mIHNwYWNlIGJldHdlZW4gbmF2IGFuZCB0b3Agb2Ygd2luZG93LgotICAvLyBDb3VsZCBiZSBlaXRoZXIgbWFyZ2luIG9yIHRvcCBwb3NpdGlvbiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hdiBpcyBmaXhlZC4KLSAgdmFyIHRvcE1hcmdpbiA9IChwYXJzZUludCgkbmF2LmNzcygnbWFyZ2luLXRvcCcpKSB8fCBwYXJzZUludCgkbmF2LmNzcygndG9wJykpKSArIDE7Ci0gIC8vIGFkZCAxIGZvciB0aGUgI3NpZGUtbmF2IGJvdHRvbSBtYXJnaW4KLQotICAvLyBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgaGVhZGVyIGlzIHZpc2libGUsIHNldCB0aGUgc2lkZSBuYXYncyBoZWlnaHQuCi0gIGlmIChoZWFkZXJWaXNpYmxlKSB7Ci0gICAgLy8gVGhlIHNpZGVuYXYgaGVpZ2h0IGdyb3dzIGFzIHRoZSBoZWFkZXIgZ29lcyBvZmYgc2NyZWVuCi0gICAgbmF2SGVpZ2h0ID0gd2luZG93SGVpZ2h0IC0gKGhlYWRlckhlaWdodCArIHN1YmhlYWRlckhlaWdodCAtIHNjcm9sbFRvcCkgLSB0b3BNYXJnaW47Ci0gIH0gZWxzZSB7Ci0gICAgLy8gT25jZSBoZWFkZXIgaXMgb2ZmIHNjcmVlbiwgdGhlIG5hdiBoZWlnaHQgaXMgYWxtb3N0IGZ1bGwgd2luZG93IGhlaWdodAotICAgIG5hdkhlaWdodCA9IHdpbmRvd0hlaWdodCAtIHRvcE1hcmdpbjsKLSAgfQotCi0KLQotICAkc2Nyb2xsUGFuZXMgPSAkKCIuc2Nyb2xsLXBhbmUiKTsKLSAgaWYgKCRzY3JvbGxQYW5lcy5sZW5ndGggPiAxKSB7Ci0gICAgLy8gc3VidHJhY3QgdGhlIGhlaWdodCBvZiB0aGUgYXBpIGxldmVsIHdpZGdldCBhbmQgbmF2IHN3YXBwZXIgZnJvbSB0aGUgYXZhaWxhYmxlIG5hdiBoZWlnaHQKLSAgICBuYXZIZWlnaHQgLT0gKCQoJyNhcGktbmF2LWhlYWRlcicpLm91dGVySGVpZ2h0KHRydWUpICsgJCgnI25hdi1zd2FwJykub3V0ZXJIZWlnaHQodHJ1ZSkpOwotCi0gICAgJCgiI3N3YXBwZXIiKS5jc3Moe2hlaWdodDpuYXZIZWlnaHQgKyAicHgifSk7Ci0gICAgaWYgKCQoIiNuYXYtdHJlZSIpLmlzKCI6dmlzaWJsZSIpKSB7Ci0gICAgICAkKCIjbmF2LXRyZWUiKS5jc3Moe2hlaWdodDpuYXZIZWlnaHR9KTsKLSAgICB9Ci0KLSAgICB2YXIgY2xhc3Nlc0hlaWdodCA9IG5hdkhlaWdodCAtIHBhcnNlSW50KCQoIiNyZXNpemUtcGFja2FnZXMtbmF2IikuY3NzKCJoZWlnaHQiKSkgLSAxMCArICJweCI7Ci0gICAgLy9zdWJ0cmFjdCAxMHB4IHRvIGFjY291bnQgZm9yIGRyYWcgYmFyCi0KLSAgICAvLyBpZiB0aGUgd2luZG93IGJlY29tZXMgc21hbGwgZW5vdWdoIHRvIG1ha2UgdGhlIGNsYXNzIHBhbmVsIGhlaWdodCAwLAotICAgIC8vIHRoZW4gdGhlIHBhY2thZ2UgcGFuZWwgc2hvdWxkIGJlZ2luIHRvIHNocmluawotICAgIGlmIChwYXJzZUludChjbGFzc2VzSGVpZ2h0KSA8PSAwKSB7Ci0gICAgICAkKCIjcmVzaXplLXBhY2thZ2VzLW5hdiIpLmNzcyh7aGVpZ2h0Om5hdkhlaWdodCAtIDEwfSk7IC8vc3VidHJhY3QgMTBweCBmb3IgZHJhZyBiYXIKLSAgICAgICQoIiNwYWNrYWdlcy1uYXYiKS5jc3Moe2hlaWdodDpuYXZIZWlnaHQgLSAxMH0pOwotICAgIH0KLQotICAgICQoIiNjbGFzc2VzLW5hdiIpLmNzcyh7J2hlaWdodCc6Y2xhc3Nlc0hlaWdodCwgJ21hcmdpbi10b3AnOicxMHB4J30pOwotICAgICQoIiNjbGFzc2VzLW5hdiAuanNwQ29udGFpbmVyIikuY3NzKHtoZWlnaHQ6Y2xhc3Nlc0hlaWdodH0pOwotCi0KLSAgfSBlbHNlIHsKLSAgICAkbmF2LmhlaWdodChuYXZIZWlnaHQpOwotICB9Ci0KLSAgaWYgKGRlbGF5KSB7Ci0gICAgdXBkYXRlRnJvbVJlc2l6ZSA9IHRydWU7Ci0gICAgZGVsYXllZFJlSW5pdFNjcm9sbGJhcnMoZGVsYXkpOwotICB9IGVsc2UgewotICAgIHJlSW5pdFNjcm9sbGJhcnMoKTsKLSAgfQotCi19Ci0KLXZhciB1cGRhdGVTY3JvbGxiYXJzID0gZmFsc2U7Ci12YXIgdXBkYXRlRnJvbVJlc2l6ZSA9IGZhbHNlOwotCi0vKiBSZS1pbml0aWFsaXplIHRoZSBzY3JvbGxiYXJzIHRvIGFjY291bnQgZm9yIGNoYW5nZWQgbmF2IHNpemUuCi0gKiBUaGlzIG1ldGhvZCBwb3N0cG9uZXMgdGhlIGFjdHVhbCB1cGRhdGUgYnkgYSAxLzQgc2Vjb25kIGluIG9yZGVyIHRvIG9wdGltaXplIHRoZQotICogc2Nyb2xsIHBlcmZvcm1hbmNlIHdoaWxlIHRoZSBoZWFkZXIgaXMgc3RpbGwgdmlzaWJsZSwgYmVjYXVzZSByZS1pbml0aWFsaXppbmcgdGhlCi0gKiBzY3JvbGwgcGFuZXMgaXMgYW4gaW50ZW5zaXZlIHByb2Nlc3MuCi0gKi8KLWZ1bmN0aW9uIGRlbGF5ZWRSZUluaXRTY3JvbGxiYXJzKGRlbGF5KSB7Ci0gIC8vIElmIHdlJ3JlIHNjaGVkdWxlZCBmb3IgYW4gdXBkYXRlLCBidXQgaGF2ZSByZWNlaXZlZCBhbm90aGVyIHJlc2l6ZSByZXF1ZXN0Ci0gIC8vIGJlZm9yZSB0aGUgc2NoZWR1bGVkIHJlc2l6ZSBoYXMgb2NjdXJlZCwganVzdCBpZ25vcmUgdGhlIG5ldyByZXF1ZXN0Ci0gIC8vIChhbmQgd2FpdCBmb3IgdGhlIHNjaGVkdWxlZCBvbmUpLgotICBpZiAodXBkYXRlU2Nyb2xsYmFycyAmJiB1cGRhdGVGcm9tUmVzaXplKSB7Ci0gICAgdXBkYXRlRnJvbVJlc2l6ZSA9IGZhbHNlOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFdlJ3JlIHNjaGVkdWxlZCBmb3IgYW4gdXBkYXRlIGFuZCB0aGUgdXBkYXRlIHJlcXVlc3QgY2FtZSBmcm9tIHRoaXMgbWV0aG9kJ3Mgc2V0VGltZW91dAotICBpZiAodXBkYXRlU2Nyb2xsYmFycyAmJiAhdXBkYXRlRnJvbVJlc2l6ZSkgewotICAgIHJlSW5pdFNjcm9sbGJhcnMoKTsKLSAgICB1cGRhdGVTY3JvbGxiYXJzID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgdXBkYXRlU2Nyb2xsYmFycyA9IHRydWU7Ci0gICAgdXBkYXRlRnJvbVJlc2l6ZSA9IGZhbHNlOwotICAgIHNldFRpbWVvdXQoJ2RlbGF5ZWRSZUluaXRTY3JvbGxiYXJzKCknLGRlbGF5KTsKLSAgfQotfQotCi0vKiBSZS1pbml0aWFsaXplIHRoZSBzY3JvbGxiYXJzIHRvIGFjY291bnQgZm9yIGNoYW5nZWQgbmF2IHNpemUuICovCi1mdW5jdGlvbiByZUluaXRTY3JvbGxiYXJzKCkgewotICB2YXIgcGFuZSA9ICQoIi5zY3JvbGwtcGFuZSIpLmVhY2goZnVuY3Rpb24oKXsKLSAgICB2YXIgYXBpID0gJCh0aGlzKS5kYXRhKCdqc3AnKTsKLSAgICBpZiAoIWFwaSkgeyBzZXRUaW1lb3V0KHJlSW5pdFNjcm9sbGJhcnMsMzAwKTsgcmV0dXJuO30KLSAgICBhcGkucmVpbml0aWFsaXNlKCB7dmVydGljYWxHdXR0ZXI6MH0gKTsKLSAgfSk7Ci0gICQoIi5zY3JvbGwtcGFuZSIpLnJlbW92ZUF0dHIoInRhYmluZGV4Iik7IC8vIGdldCByaWQgb2YgdGFiaW5kZXggYWRkZWQgYnkganNjcm9sbGVyCi19Ci0KLQotLyogUmVzaXplIHRoZSBoZWlnaHQgb2YgdGhlIG5hdiBwYW5lbHMgaW4gdGhlIHJlZmVyZW5jZSwKLSAqIGFuZCBzYXZlIHRoZSBuZXcgc2l6ZSB0byBhIGNvb2tpZSAqLwotZnVuY3Rpb24gc2F2ZU5hdlBhbmVscygpIHsKLSAgdmFyIGJhc2VQYXRoID0gZ2V0QmFzZVVyaShsb2NhdGlvbi5wYXRobmFtZSk7Ci0gIHZhciBzZWN0aW9uID0gYmFzZVBhdGguc3Vic3RyaW5nKDEsYmFzZVBhdGguaW5kZXhPZigiLyIsMSkpOwotICB3cml0ZUNvb2tpZSgiaGVpZ2h0IiwgcmVzaXplUGFja2FnZXNOYXYuY3NzKCJoZWlnaHQiKSwgc2VjdGlvbiwgbnVsbCk7Ci19Ci0KLQotCi1mdW5jdGlvbiByZXN0b3JlSGVpZ2h0KHBhY2thZ2VIZWlnaHQpIHsKLSAgICAkKCIjcmVzaXplLXBhY2thZ2VzLW5hdiIpLmhlaWdodChwYWNrYWdlSGVpZ2h0KTsKLSAgICAkKCIjcGFja2FnZXMtbmF2IikuaGVpZ2h0KHBhY2thZ2VIZWlnaHQpOwotICAvLyAgdmFyIGNsYXNzZXNIZWlnaHQgPSBuYXZIZWlnaHQgLSBwYWNrYWdlSGVpZ2h0OwotIC8vICAgJCgiI2NsYXNzZXMtbmF2IikuY3NzKHtoZWlnaHQ6Y2xhc3Nlc0hlaWdodH0pOwotICAvLyAgJCgiI2NsYXNzZXMtbmF2IC5qc3BDb250YWluZXIiKS5jc3Moe2hlaWdodDpjbGFzc2VzSGVpZ2h0fSk7Ci19Ci0KLQotCi0vKiAjIyMjIyMjIyMgRU5EIFJFU0laRSBUSEUgU0lERU5BViBIRUlHSFQgIyMjIyMjIyMjIyAqLwotCi0KLQotCi0KLS8qKiBTY3JvbGwgdGhlIGpTY3JvbGxQYW5lIHRvIG1ha2UgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtIHZpc2libGUKLSAgICBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBwYWdlIGZpbmlzaGVkIGxvYWRpbmcuICovCi1mdW5jdGlvbiBzY3JvbGxJbnRvVmlldyhuYXYpIHsKLSAgdmFyICRuYXYgPSAkKCIjIituYXYpOwotICB2YXIgZWxlbWVudCA9ICRuYXYualNjcm9sbFBhbmUoey8qIC4uLnNldHRpbmdzLi4uICovfSk7Ci0gIHZhciBhcGkgPSBlbGVtZW50LmRhdGEoJ2pzcCcpOwotCi0gIGlmICgkbmF2LmlzKCc6dmlzaWJsZScpKSB7Ci0gICAgdmFyICRzZWxlY3RlZCA9ICQoIi5zZWxlY3RlZCIsICRuYXYpOwotICAgIGlmICgkc2VsZWN0ZWQubGVuZ3RoID09IDApIHJldHVybjsKLQotICAgIHZhciBzZWxlY3RlZE9mZnNldCA9ICRzZWxlY3RlZC5wb3NpdGlvbigpLnRvcDsKLSAgICBpZiAoc2VsZWN0ZWRPZmZzZXQgKyA5MCA+ICRuYXYuaGVpZ2h0KCkpIHsgIC8vIGFkZCA5MCBzbyB0aGF0IHdlIHNjcm9sbCB1cCBldmVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBpdGVtIGlzIGNsb3NlIHRvIHRoZSBib3R0b20KLSAgICAgIGFwaS5zY3JvbGxUbygwLCBzZWxlY3RlZE9mZnNldCAtICgkbmF2LmhlaWdodCgpIC8gNCksIGZhbHNlKTsgLy8gc2Nyb2xsIHRoZSBpdGVtIGludG8gdmlldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSAxLzQgb2YgdGhlIHdheSBmcm9tIHRoZSB0b3AKLSAgICB9Ci0gIH0KLX0KLQotCi0KLQotCi0KLS8qIFNob3cgcG9wdXAgZGlhbG9ncyAqLwotZnVuY3Rpb24gc2hvd0RpYWxvZyhpZCkgewotICAkZGlhbG9nID0gJCgiIyIraWQpOwotICAkZGlhbG9nLnByZXBlbmQoJzxkaXYgY2xhc3M9ImJveC1ib3JkZXIiPjxkaXYgY2xhc3M9InRvcCI+IDxkaXYgY2xhc3M9ImxlZnQiPjwvZGl2PiA8ZGl2IGNsYXNzPSJyaWdodCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iYm90dG9tIj4gPGRpdiBjbGFzcz0ibGVmdCI+PC9kaXY+IDxkaXYgY2xhc3M9InJpZ2h0Ij48L2Rpdj4gPC9kaXY+IDwvZGl2PicpOwotICAkZGlhbG9nLndyYXBJbm5lcignPGRpdi8+Jyk7Ci0gICRkaWFsb2cucmVtb3ZlQ2xhc3MoImhpZGUiKTsKLX0KLQotCi0KLQotCi0vKiAjIyMjIyMjIyMgICAgQ09PS0lFUyEgICAgICMjIyMjIyMjIyMgKi8KLQotZnVuY3Rpb24gcmVhZENvb2tpZShjb29raWUpIHsKLSAgdmFyIG15Q29va2llID0gY29va2llX25hbWVzcGFjZSsiXyIrY29va2llKyI9IjsKLSAgaWYgKGRvY3VtZW50LmNvb2tpZSkgewotICAgIHZhciBpbmRleCA9IGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKG15Q29va2llKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgIHZhciB2YWxTdGFydCA9IGluZGV4ICsgbXlDb29raWUubGVuZ3RoOwotICAgICAgdmFyIHZhbEVuZCA9IGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCI7IiwgdmFsU3RhcnQpOwotICAgICAgaWYgKHZhbEVuZCA9PSAtMSkgewotICAgICAgICB2YWxFbmQgPSBkb2N1bWVudC5jb29raWUubGVuZ3RoOwotICAgICAgfQotICAgICAgdmFyIHZhbCA9IGRvY3VtZW50LmNvb2tpZS5zdWJzdHJpbmcodmFsU3RhcnQsIHZhbEVuZCk7Ci0gICAgICByZXR1cm4gdmFsOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotZnVuY3Rpb24gd3JpdGVDb29raWUoY29va2llLCB2YWwsIHNlY3Rpb24sIGV4cGlyYXRpb24pIHsKLSAgaWYgKHZhbD09dW5kZWZpbmVkKSByZXR1cm47Ci0gIHNlY3Rpb24gPSBzZWN0aW9uID09IG51bGwgPyAiXyIgOiAiXyIrc2VjdGlvbisiXyI7Ci0gIGlmIChleHBpcmF0aW9uID09IG51bGwpIHsKLSAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7Ci0gICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpKygxMCozNjUqMjQqNjAqNjAqMTAwMCkpOyAvLyBkZWZhdWx0IGV4cGlyYXRpb24gaXMgb25lIHdlZWsKLSAgICBleHBpcmF0aW9uID0gZGF0ZS50b0dNVFN0cmluZygpOwotICB9Ci0gIHZhciBjb29raWVWYWx1ZSA9IGNvb2tpZV9uYW1lc3BhY2UgKyBzZWN0aW9uICsgY29va2llICsgIj0iICsgdmFsCi0gICAgICAgICAgICAgICAgICAgICsgIjsgZXhwaXJlcz0iICsgZXhwaXJhdGlvbisiOyBwYXRoPS8iOwotICBkb2N1bWVudC5jb29raWUgPSBjb29raWVWYWx1ZTsKLX0KLQotLyogIyMjIyMjIyMjICAgICBFTkQgQ09PS0lFUyEgICAgICMjIyMjIyMjIyMgKi8KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyoKLQotUkVNRU1CRVIgVEhFIFBSRVZJT1VTIFBBR0UgRk9SIEVBQ0ggVEFCCi0KLWZ1bmN0aW9uIGxvYWRMYXN0KGNvb2tpZVBhdGgpIHsKLSAgdmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWY7Ci0gIGlmIChsb2NhdGlvbi5pbmRleE9mKCIvIitjb29raWVQYXRoKyIvIikgIT0gLTEpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB2YXIgbGFzdFBhZ2UgPSByZWFkQ29va2llKGNvb2tpZVBhdGggKyAiX2xhc3RwYWdlIik7Ci0gIGlmIChsYXN0UGFnZSkgewotICAgIHdpbmRvdy5sb2NhdGlvbiA9IGxhc3RQYWdlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLSQod2luZG93KS51bmxvYWQoZnVuY3Rpb24oKXsKLSAgdmFyIHBhdGggPSBnZXRCYXNlVXJpKGxvY2F0aW9uLnBhdGhuYW1lKTsKLSAgaWYgKHBhdGguaW5kZXhPZigiL3JlZmVyZW5jZS8iKSAhPSAtMSkgewotICAgIHdyaXRlQ29va2llKCJsYXN0cGFnZSIsIHBhdGgsICJyZWZlcmVuY2UiLCBudWxsKTsKLSAgfSBlbHNlIGlmIChwYXRoLmluZGV4T2YoIi9ndWlkZS8iKSAhPSAtMSkgewotICAgIHdyaXRlQ29va2llKCJsYXN0cGFnZSIsIHBhdGgsICJndWlkZSIsIG51bGwpOwotICB9IGVsc2UgaWYgKChwYXRoLmluZGV4T2YoIi9yZXNvdXJjZXMvIikgIT0gLTEpIHx8IChwYXRoLmluZGV4T2YoIi90cmFpbmluZy8iKSAhPSAtMSkpIHsKLSAgICB3cml0ZUNvb2tpZSgibGFzdHBhZ2UiLCBwYXRoLCAicmVzb3VyY2VzIiwgbnVsbCk7Ci0gIH0KLX0pOwotCi0qLwotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWZ1bmN0aW9uIHRvZ2dsZShvYmosIHNsaWRlKSB7Ci0gIHZhciB1bCA9ICQoInVsOmZpcnN0Iiwgb2JqKTsKLSAgdmFyIGxpID0gdWwucGFyZW50KCk7Ci0gIGlmIChsaS5oYXNDbGFzcygiY2xvc2VkIikpIHsKLSAgICBpZiAoc2xpZGUpIHsKLSAgICAgIHVsLnNsaWRlRG93bigiZmFzdCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bC5zaG93KCk7Ci0gICAgfQotICAgIGxpLnJlbW92ZUNsYXNzKCJjbG9zZWQiKTsKLSAgICBsaS5hZGRDbGFzcygib3BlbiIpOwotICAgICQoIi50b2dnbGUtaW1nIiwgbGkpLmF0dHIoInRpdGxlIiwgImhpZGUgcGFnZXMiKTsKLSAgfSBlbHNlIHsKLSAgICB1bC5zbGlkZVVwKCJmYXN0Iik7Ci0gICAgbGkucmVtb3ZlQ2xhc3MoIm9wZW4iKTsKLSAgICBsaS5hZGRDbGFzcygiY2xvc2VkIik7Ci0gICAgJCgiLnRvZ2dsZS1pbWciLCBsaSkuYXR0cigidGl0bGUiLCAic2hvdyBwYWdlcyIpOwotICB9Ci19Ci0KLQotCi0KLQotZnVuY3Rpb24gYnVpbGRUb2dnbGVMaXN0cygpIHsKLSAgJCgiLnRvZ2dsZS1saXN0IikuZWFjaCgKLSAgICBmdW5jdGlvbihpKSB7Ci0gICAgICAkKCJkaXY6Zmlyc3QiLCB0aGlzKS5hcHBlbmQoIjxhIGNsYXNzPSd0b2dnbGUtaW1nJyBocmVmPScjJyB0aXRsZT0nc2hvdyBwYWdlcycgb25DbGljaz0ndG9nZ2xlKHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLCB0cnVlKTsgcmV0dXJuIGZhbHNlOyc+PC9hPiIpOwotICAgICAgJCh0aGlzKS5hZGRDbGFzcygiY2xvc2VkIik7Ci0gICAgfSk7Ci19Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotLyogICAgICBSRUZFUkVOQ0UgTkFWIFNXQVAgICAgICovCi0KLQotZnVuY3Rpb24gZ2V0TmF2UHJlZigpIHsKLSAgdmFyIHYgPSByZWFkQ29va2llKCdyZWZlcmVuY2VfbmF2Jyk7Ci0gIGlmICh2ICE9IE5BVl9QUkVGX1RSRUUpIHsKLSAgICB2ID0gTkFWX1BSRUZfUEFORUxTOwotICB9Ci0gIHJldHVybiB2OwotfQotCi1mdW5jdGlvbiBjaG9vc2VEZWZhdWx0TmF2KCkgewotICBuYXZfcHJlZiA9IGdldE5hdlByZWYoKTsKLSAgaWYgKG5hdl9wcmVmID09IE5BVl9QUkVGX1RSRUUpIHsKLSAgICAkKCIjbmF2LXBhbmVscyIpLnRvZ2dsZSgpOwotICAgICQoIiNwYW5lbC1saW5rIikudG9nZ2xlKCk7Ci0gICAgJCgiI25hdi10cmVlIikudG9nZ2xlKCk7Ci0gICAgJCgiI3RyZWUtbGluayIpLnRvZ2dsZSgpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHN3YXBOYXYoKSB7Ci0gIGlmIChuYXZfcHJlZiA9PSBOQVZfUFJFRl9UUkVFKSB7Ci0gICAgbmF2X3ByZWYgPSBOQVZfUFJFRl9QQU5FTFM7Ci0gIH0gZWxzZSB7Ci0gICAgbmF2X3ByZWYgPSBOQVZfUFJFRl9UUkVFOwotICAgIGluaXRfZGVmYXVsdF9uYXZ0cmVlKHRvUm9vdCk7Ci0gIH0KLSAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwotICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkrKDEwKjM2NSoyNCo2MCo2MCoxMDAwKSk7IC8vIGtlZXAgdGhpcyBmb3IgMTAgeWVhcnMKLSAgd3JpdGVDb29raWUoIm5hdiIsIG5hdl9wcmVmLCAicmVmZXJlbmNlIiwgZGF0ZS50b0dNVFN0cmluZygpKTsKLQotICAkKCIjbmF2LXBhbmVscyIpLnRvZ2dsZSgpOwotICAkKCIjcGFuZWwtbGluayIpLnRvZ2dsZSgpOwotICAkKCIjbmF2LXRyZWUiKS50b2dnbGUoKTsKLSAgJCgiI3RyZWUtbGluayIpLnRvZ2dsZSgpOwotCi0gIHJlc2l6ZU5hdigpOwotCi0gIC8vIEdyb3NzIG5hc3R5IGhhY2sgdG8gbWFrZSB0cmVlIHZpZXcgc2hvdyB1cCB1cG9uIGZpcnN0IHN3YXAgYnkgc2V0dGluZyBoZWlnaHQgbWFudWFsbHkKLSAgJCgiI25hdi10cmVlIC5qc3BDb250YWluZXI6dmlzaWJsZSIpCi0gICAgICAuY3NzKHsnaGVpZ2h0JzokKCIjbmF2LXRyZWUgLmpzcENvbnRhaW5lciAuanNwUGFuZSIpLmhlaWdodCgpICsncHgnfSk7Ci0gIC8vIEFub3RoZXIgbmFzdHkgaGFjayB0byBtYWtlIHRoZSBzY3JvbGxiYXIgYXBwZWFyIG5vdyB0aGF0IHdlIGhhdmUgaGVpZ2h0Ci0gIHJlc2l6ZU5hdigpOwotCi0gIGlmICgkKCIjbmF2LXRyZWUiKS5pcygnOnZpc2libGUnKSkgewotICAgIHNjcm9sbEludG9WaWV3KCJuYXYtdHJlZSIpOwotICB9IGVsc2UgewotICAgIHNjcm9sbEludG9WaWV3KCJwYWNrYWdlcy1uYXYiKTsKLSAgICBzY3JvbGxJbnRvVmlldygiY2xhc3Nlcy1uYXYiKTsKLSAgfQotfQotCi0KLQotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLS8qICMjIyMjIyMjIyMgICAgIExPQ0FMSVpBVElPTiAgICAgIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwotCi1mdW5jdGlvbiBnZXRCYXNlVXJpKHVyaSkgewotICB2YXIgaW50bFVybCA9ICh1cmkuc3Vic3RyaW5nKDAsNikgPT0gIi9pbnRsLyIpOwotICBpZiAoaW50bFVybCkgewotICAgIGJhc2UgPSB1cmkuc3Vic3RyaW5nKHVyaS5pbmRleE9mKCdpbnRsLycpKzUsdXJpLmxlbmd0aCk7Ci0gICAgYmFzZSA9IGJhc2Uuc3Vic3RyaW5nKGJhc2UuaW5kZXhPZignLycpKzEsIGJhc2UubGVuZ3RoKTsKLSAgICAgIC8vYWxlcnQoImludGwsIHJldHVybmluZyBiYXNlIHVybDogLyIgKyBiYXNlKTsKLSAgICByZXR1cm4gKCIvIiArIGJhc2UpOwotICB9IGVsc2UgewotICAgICAgLy9hbGVydCgibm90IGludGwsIHJldHVybmluZyB1cmkgYXMgZm91bmQuIik7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQotCi1mdW5jdGlvbiByZXF1ZXN0QXBwZW5kSEwodXJpKSB7Ci0vL2FwcGVuZCAiP2hsPTxsYW5nPiB0byBhbiBvdXRnb2luZyByZXF1ZXN0IChzdWNoIGFzIHRvIGJsb2cpCi0gIHZhciBsYW5nID0gZ2V0TGFuZ1ByZWYoKTsKLSAgaWYgKGxhbmcpIHsKLSAgICB2YXIgcSA9ICdobD0nICsgbGFuZzsKLSAgICB1cmkgKz0gJz8nICsgcTsKLSAgICB3aW5kb3cubG9jYXRpb24gPSB1cmk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLQotZnVuY3Rpb24gY2hhbmdlTmF2TGFuZyhsYW5nKSB7Ci0gIHZhciAkbGlua3MgPSAkKCIjZGV2ZG9jLW5hdiwjaGVhZGVyLCNuYXYteCwudHJhaW5pbmctbmF2LXRvcCwuY29udGVudC1mb290ZXIiKS5maW5kKCJhWyIrbGFuZysiLWxhbmddIik7Ci0gICRsaW5rcy5lYWNoKGZ1bmN0aW9uKGkpeyAvLyBmb3IgZWFjaCBsaW5rIHdpdGggYSB0cmFuc2xhdGlvbgotICAgIHZhciAkbGluayA9ICQodGhpcyk7Ci0gICAgaWYgKGxhbmcgIT0gImVuIikgeyAvLyBObyBuZWVkIHRvIHdvcnJ5IGFib3V0IEVuZ2xpc2gsIGJlY2F1c2UgYSBsYW5ndWFnZSBjaGFuZ2UgaW52b2tlcyBuZXcgcmVxdWVzdAotICAgICAgLy8gcHV0IHRoZSBkZXNpcmVkIGxhbmd1YWdlIGZyb20gdGhlIGF0dHJpYnV0ZSBhcyB0aGUgdGV4dAotICAgICAgJGxpbmsudGV4dCgkbGluay5hdHRyKGxhbmcrIi1sYW5nIikpCi0gICAgfQotICB9KTsKLX0KLQotZnVuY3Rpb24gY2hhbmdlTGFuZ1ByZWYobGFuZywgc3VibWl0KSB7Ci0gIHZhciBkYXRlID0gbmV3IERhdGUoKTsKLSAgZXhwaXJlcyA9IGRhdGUudG9HTVRTdHJpbmcoZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpKygxMCozNjUqMjQqNjAqNjAqMTAwMCkpKTsKLSAgLy8ga2VlcCB0aGlzIGZvciA1MCB5ZWFycwotICAvL2FsZXJ0KCJleHBpcmVzOiAiICsgZXhwaXJlcykKLSAgd3JpdGVDb29raWUoInByZWZfbGFuZyIsIGxhbmcsIG51bGwsIGV4cGlyZXMpOwotCi0gIC8vICAjIyMjIyMjICBUT0RPOiAgUmVtb3ZlIHRoaXMgY29uZGl0aW9uIG9uY2Ugd2UncmUgc3RhYmxlIG9uIGRldnNpdGUgIyMjIyMjIwotICAvLyAgVGhpcyBjb25kaXRpb24gaXMgb25seSBuZWVkZWQgaWYgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IGxlZ2FjeSBHQUUgc2VydmVyCi0gIGlmIChkZXZzaXRlKSB7Ci0gICAgLy8gU3dpdGNoIGxhbmd1YWdlIHdoZW4gb24gRGV2c2l0ZSBzZXJ2ZXIKLSAgICBpZiAoc3VibWl0KSB7Ci0gICAgICAkKCIjc2V0bGFuZyIpLnN1Ym1pdCgpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBTd2l0Y2ggbGFuZ3VhZ2Ugd2hlbiBvbiBsZWdhY3kgR0FFIHNlcnZlcgotICAgIGlmIChzdWJtaXQpIHsKLSAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGdldEJhc2VVcmkobG9jYXRpb24ucGF0aG5hbWUpOwotICAgIH0KLSAgfQotfQotCi1mdW5jdGlvbiBsb2FkTGFuZ1ByZWYoKSB7Ci0gIHZhciBsYW5nID0gcmVhZENvb2tpZSgicHJlZl9sYW5nIik7Ci0gIGlmIChsYW5nICE9IDApIHsKLSAgICAkKCIjbGFuZ3VhZ2UiKS5maW5kKCJvcHRpb25bdmFsdWU9JyIrbGFuZysiJ10iKS5hdHRyKCJzZWxlY3RlZCIsdHJ1ZSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gZ2V0TGFuZ1ByZWYoKSB7Ci0gIHZhciBsYW5nID0gJCgiI2xhbmd1YWdlIikuZmluZCgiOnNlbGVjdGVkIikuYXR0cigidmFsdWUiKTsKLSAgaWYgKCFsYW5nKSB7Ci0gICAgbGFuZyA9IHJlYWRDb29raWUoInByZWZfbGFuZyIpOwotICB9Ci0gIHJldHVybiAobGFuZyAhPSAwKSA/IGxhbmcgOiAnZW4nOwotfQotCi0vKiAjIyMjIyMjIyMjICAgICBFTkQgTE9DQUxJWkFUSU9OICAgICAjIyMjIyMjIyMjIyMgKi8KLQotCi0KLQotCi0KLS8qIFVzZWQgdG8gaGlkZSBhbmQgcmV2ZWFsIHN1cHBsZW1lbnRhbCBjb250ZW50LCBzdWNoIGFzIGxvbmcgY29kZSBzYW1wbGVzLgotICAgU2VlIHRoZSBjb21wYW5pb24gQ1NTIGluIGFuZHJvaWQtZGV2ZWxvcGVyLWRvY3MuY3NzICovCi1mdW5jdGlvbiB0b2dnbGVDb250ZW50KG9iaikgewotICB2YXIgZGl2ID0gJChvYmoucGFyZW50Tm9kZS5wYXJlbnROb2RlKTsKLSAgdmFyIHRvZ2dsZU1lID0gJCgiLnRvZ2dsZS1jb250ZW50LXRvZ2dsZW1lIixkaXYpOwotICBpZiAoZGl2Lmhhc0NsYXNzKCJjbG9zZWQiKSkgeyAvLyBpZiBpdCdzIGNsb3NlZCwgb3BlbiBpdAotICAgIHRvZ2dsZU1lLnNsaWRlRG93bigpOwotICAgICQoIi50b2dnbGUtY29udGVudC10ZXh0Iiwgb2JqKS50b2dnbGUoKTsKLSAgICBkaXYucmVtb3ZlQ2xhc3MoImNsb3NlZCIpLmFkZENsYXNzKCJvcGVuIik7Ci0gICAgJCgiLnRvZ2dsZS1jb250ZW50LWltZyIsIGRpdikuYXR0cigidGl0bGUiLCAiaGlkZSIpLmF0dHIoInNyYyIsIHRvUm9vdAotICAgICAgICAgICAgICAgICAgKyAiYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIik7Ci0gIH0gZWxzZSB7IC8vIGlmIGl0J3Mgb3BlbiwgY2xvc2UgaXQKLSAgICB0b2dnbGVNZS5zbGlkZVVwKCdmYXN0JywgZnVuY3Rpb24oKSB7ICAvLyBXYWl0IHVudGlsIHRoZSBhbmltYXRpb24gaXMgZG9uZSBiZWZvcmUgY2xvc2luZyBhcnJvdwotICAgICAgJCgiLnRvZ2dsZS1jb250ZW50LXRleHQiLCBvYmopLnRvZ2dsZSgpOwotICAgICAgZGl2LnJlbW92ZUNsYXNzKCJvcGVuIikuYWRkQ2xhc3MoImNsb3NlZCIpOwotICAgICAgJCgiLnRvZ2dsZS1jb250ZW50LWltZyIsIGRpdikuYXR0cigidGl0bGUiLCAic2hvdyIpLmF0dHIoInNyYyIsIHRvUm9vdAotICAgICAgICAgICAgICAgICAgKyAiYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIik7Ci0gICAgfSk7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIE5ldyB2ZXJzaW9uIG9mIGV4cGFuZGFibGUgY29udGVudCAqLwotZnVuY3Rpb24gdG9nZ2xlRXhwYW5kYWJsZShsaW5rLGlkKSB7Ci0gIGlmKCQoaWQpLmlzKCc6dmlzaWJsZScpKSB7Ci0gICAgJChpZCkuc2xpZGVVcCgpOwotICAgICQobGluaykucmVtb3ZlQ2xhc3MoJ2V4cGFuZGVkJyk7Ci0gIH0gZWxzZSB7Ci0gICAgJChpZCkuc2xpZGVEb3duKCk7Ci0gICAgJChsaW5rKS5hZGRDbGFzcygnZXhwYW5kZWQnKTsKLSAgfQotfQotCi1mdW5jdGlvbiBoaWRlRXhwYW5kYWJsZShpZHMpIHsKLSAgJChpZHMpLnNsaWRlVXAoKTsKLSAgJChpZHMpLnByZXYoJ2g0JykuZmluZCgnYS5leHBhbmRhYmxlJykucmVtb3ZlQ2xhc3MoJ2V4cGFuZGVkJyk7Ci19Ci0KLQotCi0KLQotLyoKLSAqICBTbGlkZXNob3cgMS4wCi0gKiAgVXNlZCBvbiAvaW5kZXguaHRtbCBhbmQgL2RldmVsb3AvaW5kZXguaHRtbCBmb3IgY2Fyb3VzZWwKLSAqCi0gKiAgU2FtcGxlIHVzYWdlOgotICogIEhUTUwgLQotICogIDxkaXYgY2xhc3M9InNsaWRlc2hvdy1jb250YWluZXIiPgotICogICA8YSBocmVmPSIiIGNsYXNzPSJzbGlkZXNob3ctcHJldiI+UHJldjwvYT4KLSAqICAgPGEgaHJlZj0iIiBjbGFzcz0ic2xpZGVzaG93LW5leHQiPk5leHQ8L2E+Ci0gKiAgIDx1bD4KLSAqICAgICAgIDxsaSBjbGFzcz0iaXRlbSI+PGltZyBzcmM9ImltYWdlcy9tYXJxdWVlMS5qcGciPjwvbGk+Ci0gKiAgICAgICA8bGkgY2xhc3M9Iml0ZW0iPjxpbWcgc3JjPSJpbWFnZXMvbWFycXVlZTIuanBnIj48L2xpPgotICogICAgICAgPGxpIGNsYXNzPSJpdGVtIj48aW1nIHNyYz0iaW1hZ2VzL21hcnF1ZWUzLmpwZyI+PC9saT4KLSAqICAgICAgIDxsaSBjbGFzcz0iaXRlbSI+PGltZyBzcmM9ImltYWdlcy9tYXJxdWVlNC5qcGciPjwvbGk+Ci0gKiAgIDwvdWw+Ci0gKiAgPC9kaXY+Ci0gKgotICogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gKiAgICQoJy5zbGlkZXNob3ctY29udGFpbmVyJykuZGFjU2xpZGVzaG93KHsKLSAqICAgICAgIGF1dG86IHRydWUsCi0gKiAgICAgICBidG5QcmV2OiAnLnNsaWRlc2hvdy1wcmV2JywKLSAqICAgICAgIGJ0bk5leHQ6ICcuc2xpZGVzaG93LW5leHQnCi0gKiAgIH0pOwotICogICA8L3NjcmlwdD4KLSAqCi0gKiAgT3B0aW9uczoKLSAqICBidG5QcmV2OiAgICBvcHRpb25hbCBpZGVudGlmaWVyIGZvciBwcmV2aW91cyBidXR0b24KLSAqICBidG5OZXh0OiAgICBvcHRpb25hbCBpZGVudGlmaWVyIGZvciBuZXh0IGJ1dHRvbgotICogIGJ0blBhdXNlOiAgIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHBhdXNlIGJ1dHRvbgotICogIGF1dG86ICAgICAgIHdoZXRoZXIgb3Igbm90IHRvIGF1dG8tcHJvY2VlZAotICogIHNwZWVkOiAgICAgIGFuaW1hdGlvbiBzcGVlZAotICogIGF1dG9UaW1lOiAgIHRpbWUgYmV0d2VlbiBhdXRvLXJvdGF0aW9uCi0gKiAgZWFzaW5nOiAgICAgZWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uCi0gKiAgc3RhcnQ6ICAgICAgaXRlbSB0byBzZWxlY3QgYnkgZGVmYXVsdAotICogIHNjcm9sbDogICAgIGRpcmVjdGlvbiB0byBzY3JvbGwgaW4KLSAqICBwYWdpbmF0aW9uOiB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGRvdHRlZCBwYWdpbmF0aW9uCi0gKgotICovCi0KLSAoZnVuY3Rpb24oJCkgewotICQuZm4uZGFjU2xpZGVzaG93ID0gZnVuY3Rpb24obykgewotCi0gICAgIC8vT3B0aW9ucyAtIHNlZSBhYm92ZQotICAgICBvID0gJC5leHRlbmQoewotICAgICAgICAgYnRuUHJldjogICBudWxsLAotICAgICAgICAgYnRuTmV4dDogICBudWxsLAotICAgICAgICAgYnRuUGF1c2U6ICBudWxsLAotICAgICAgICAgYXV0bzogICAgICB0cnVlLAotICAgICAgICAgc3BlZWQ6ICAgICA1MDAsCi0gICAgICAgICBhdXRvVGltZTogIDEyMDAwLAotICAgICAgICAgZWFzaW5nOiAgICBudWxsLAotICAgICAgICAgc3RhcnQ6ICAgICAwLAotICAgICAgICAgc2Nyb2xsOiAgICAxLAotICAgICAgICAgcGFnaW5hdGlvbjogdHJ1ZQotCi0gICAgIH0sIG8gfHwge30pOwotCi0gICAgIC8vU2V0IHVwIGEgY2Fyb3VzZWwgZm9yIGVhY2gKLSAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKLQotICAgICAgICAgdmFyIHJ1bm5pbmcgPSBmYWxzZTsKLSAgICAgICAgIHZhciBhbmltQ3NzID0gby52ZXJ0aWNhbCA/ICJ0b3AiIDogImxlZnQiOwotICAgICAgICAgdmFyIHNpemVDc3MgPSBvLnZlcnRpY2FsID8gImhlaWdodCIgOiAid2lkdGgiOwotICAgICAgICAgdmFyIGRpdiA9ICQodGhpcyk7Ci0gICAgICAgICB2YXIgdWwgPSAkKCJ1bCIsIGRpdik7Ci0gICAgICAgICB2YXIgdExpID0gJCgibGkiLCB1bCk7Ci0gICAgICAgICB2YXIgdGwgPSB0TGkuc2l6ZSgpOwotICAgICAgICAgdmFyIHRpbWVyID0gbnVsbDsKLQotICAgICAgICAgdmFyIGxpID0gJCgibGkiLCB1bCk7Ci0gICAgICAgICB2YXIgaXRlbUxlbmd0aCA9IGxpLnNpemUoKTsKLSAgICAgICAgIHZhciBjdXJyID0gby5zdGFydDsKLQotICAgICAgICAgbGkuY3NzKHtmbG9hdDogby52ZXJ0aWNhbCA/ICJub25lIiA6ICJsZWZ0In0pOwotICAgICAgICAgdWwuY3NzKHttYXJnaW46ICIwIiwgcGFkZGluZzogIjAiLCBwb3NpdGlvbjogInJlbGF0aXZlIiwgImxpc3Qtc3R5bGUtdHlwZSI6ICJub25lIiwgInotaW5kZXgiOiAiMSJ9KTsKLSAgICAgICAgIGRpdi5jc3Moe3Bvc2l0aW9uOiAicmVsYXRpdmUiLCAiei1pbmRleCI6ICIyIiwgbGVmdDogIjBweCJ9KTsKLQotICAgICAgICAgdmFyIGxpU2l6ZSA9IG8udmVydGljYWwgPyBoZWlnaHQobGkpIDogd2lkdGgobGkpOwotICAgICAgICAgdmFyIHVsU2l6ZSA9IGxpU2l6ZSAqIGl0ZW1MZW5ndGg7Ci0gICAgICAgICB2YXIgZGl2U2l6ZSA9IGxpU2l6ZTsKLQotICAgICAgICAgbGkuY3NzKHt3aWR0aDogbGkud2lkdGgoKSwgaGVpZ2h0OiBsaS5oZWlnaHQoKX0pOwotICAgICAgICAgdWwuY3NzKHNpemVDc3MsIHVsU2l6ZSsicHgiKS5jc3MoYW5pbUNzcywgLShjdXJyKmxpU2l6ZSkpOwotCi0gICAgICAgICBkaXYuY3NzKHNpemVDc3MsIGRpdlNpemUrInB4Iik7Ci0KLSAgICAgICAgIC8vUGFnaW5hdGlvbgotICAgICAgICAgaWYgKG8ucGFnaW5hdGlvbikgewotICAgICAgICAgICAgIHZhciBwYWdpbmF0aW9uID0gJCgiPGRpdiBjbGFzcz0ncGFnaW5hdGlvbic+PC9kaXY+Iik7Ci0gICAgICAgICAgICAgdmFyIHBhZ191bCA9ICQoIjx1bD48L3VsPiIpOwotICAgICAgICAgICAgIGlmICh0bCA+IDEpIHsKLSAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDtpPHRsO2krKykgewotICAgICAgICAgICAgICAgICAgICB2YXIgbGkgPSAkKCI8bGk+IitpKyI8L2xpPiIpOwotICAgICAgICAgICAgICAgICAgICBwYWdfdWwuYXBwZW5kKGxpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGk9PW8uc3RhcnQpIGxpLmFkZENsYXNzKCdhY3RpdmUnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpLmNsaWNrKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ28ocGFyc2VJbnQoJCh0aGlzKS50ZXh0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGFnaW5hdGlvbi5hcHBlbmQocGFnX3VsKTsKLSAgICAgICAgICAgICAgICBkaXYuYXBwZW5kKHBhZ2luYXRpb24pOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICAgLy9QcmV2aW91cyBidXR0b24KLSAgICAgICAgIGlmKG8uYnRuUHJldikKLSAgICAgICAgICAgICAkKG8uYnRuUHJldikuY2xpY2soZnVuY3Rpb24oZSkgewotICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgIHJldHVybiBnbyhjdXJyLW8uc2Nyb2xsKTsKLSAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgLy9OZXh0IGJ1dHRvbgotICAgICAgICAgaWYoby5idG5OZXh0KQotICAgICAgICAgICAgICQoby5idG5OZXh0KS5jbGljayhmdW5jdGlvbihlKSB7Ci0gICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIGdvKGN1cnIrby5zY3JvbGwpOwotICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAvL1BhdXNlIGJ1dHRvbgotICAgICAgICAgaWYoby5idG5QYXVzZSkKLSAgICAgICAgICAgICAkKG8uYnRuUGF1c2UpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKLSAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwotICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygncGF1c2VkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Um90YXRlVGltZXIoKTsKLSAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgIHBhdXNlUm90YXRlVGltZXIoKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAvL0F1dG8gcm90YXRpb24KLSAgICAgICAgIGlmKG8uYXV0bykgc3RhcnRSb3RhdGVUaW1lcigpOwotCi0gICAgICAgICBmdW5jdGlvbiBzdGFydFJvdGF0ZVRpbWVyKCkgewotICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwotICAgICAgICAgICAgIHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PSB0bC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvKDApOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ28oY3VycitvLnNjcm9sbCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0sIG8uYXV0b1RpbWUpOwotICAgICAgICAgICAgICQoby5idG5QYXVzZSkucmVtb3ZlQ2xhc3MoJ3BhdXNlZCcpOwotICAgICAgICAgfQotCi0gICAgICAgICBmdW5jdGlvbiBwYXVzZVJvdGF0ZVRpbWVyKCkgewotICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwotICAgICAgICAgICAgICQoby5idG5QYXVzZSkuYWRkQ2xhc3MoJ3BhdXNlZCcpOwotICAgICAgICAgfQotCi0gICAgICAgICAvL0dvIHRvIGFuIGl0ZW0KLSAgICAgICAgIGZ1bmN0aW9uIGdvKHRvKSB7Ci0gICAgICAgICAgICAgaWYoIXJ1bm5pbmcpIHsKLQotICAgICAgICAgICAgICAgICBpZih0bzwwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvID0gaXRlbUxlbmd0aC0xOwotICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvPml0ZW1MZW5ndGgtMSkgewotICAgICAgICAgICAgICAgICAgICB0byA9IDA7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgY3VyciA9IHRvOwotCi0gICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgIHVsLmFuaW1hdGUoCi0gICAgICAgICAgICAgICAgICAgICBhbmltQ3NzID09ICJsZWZ0IiA/IHsgbGVmdDogLShjdXJyKmxpU2l6ZSkgfSA6IHsgdG9wOiAtKGN1cnIqbGlTaXplKSB9ICwgby5zcGVlZCwgby5lYXNpbmcsCi0gICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICAgJChvLmJ0blByZXYgKyAiLCIgKyBvLmJ0bk5leHQpLnJlbW92ZUNsYXNzKCJkaXNhYmxlZCIpOwotICAgICAgICAgICAgICAgICAkKCAoY3Vyci1vLnNjcm9sbDwwICYmIG8uYnRuUHJldikKLSAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjdXJyK28uc2Nyb2xsID4gaXRlbUxlbmd0aCAmJiBvLmJ0bk5leHQpCi0gICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICBbXQotICAgICAgICAgICAgICAgICAgKS5hZGRDbGFzcygiZGlzYWJsZWQiKTsKLQotCi0gICAgICAgICAgICAgICAgIHZhciBuYXZfaXRlbXMgPSAkKCdsaScsIHBhZ2luYXRpb24pOwotICAgICAgICAgICAgICAgICBuYXZfaXRlbXMucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwotICAgICAgICAgICAgICAgICBuYXZfaXRlbXMuZXEodG8pLmFkZENsYXNzKCdhY3RpdmUnKTsKLQotCi0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmKG8uYXV0bykgc3RhcnRSb3RhdGVUaW1lcigpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH07Ci0gICAgIH0pOwotIH07Ci0KLSBmdW5jdGlvbiBjc3MoZWwsIHByb3ApIHsKLSAgICAgcmV0dXJuIHBhcnNlSW50KCQuY3NzKGVsWzBdLCBwcm9wKSkgfHwgMDsKLSB9OwotIGZ1bmN0aW9uIHdpZHRoKGVsKSB7Ci0gICAgIHJldHVybiAgZWxbMF0ub2Zmc2V0V2lkdGggKyBjc3MoZWwsICdtYXJnaW5MZWZ0JykgKyBjc3MoZWwsICdtYXJnaW5SaWdodCcpOwotIH07Ci0gZnVuY3Rpb24gaGVpZ2h0KGVsKSB7Ci0gICAgIHJldHVybiBlbFswXS5vZmZzZXRIZWlnaHQgKyBjc3MoZWwsICdtYXJnaW5Ub3AnKSArIGNzcyhlbCwgJ21hcmdpbkJvdHRvbScpOwotIH07Ci0KLSB9KShqUXVlcnkpOwotCi0KLS8qCi0gKiAgZGFjU2xpZGVzaG93IDEuMAotICogIFVzZWQgb24gZGV2ZWxvcC9pbmRleC5odG1sIGZvciBzaWRlLXNsaWRpbmcgdGFicwotICoKLSAqICBTYW1wbGUgdXNhZ2U6Ci0gKiAgSFRNTCAtCi0gKiAgPGRpdiBjbGFzcz0ic2xpZGVzaG93LWNvbnRhaW5lciI+Ci0gKiAgIDxhIGhyZWY9IiIgY2xhc3M9InNsaWRlc2hvdy1wcmV2Ij5QcmV2PC9hPgotICogICA8YSBocmVmPSIiIGNsYXNzPSJzbGlkZXNob3ctbmV4dCI+TmV4dDwvYT4KLSAqICAgPHVsPgotICogICAgICAgPGxpIGNsYXNzPSJpdGVtIj48aW1nIHNyYz0iaW1hZ2VzL21hcnF1ZWUxLmpwZyI+PC9saT4KLSAqICAgICAgIDxsaSBjbGFzcz0iaXRlbSI+PGltZyBzcmM9ImltYWdlcy9tYXJxdWVlMi5qcGciPjwvbGk+Ci0gKiAgICAgICA8bGkgY2xhc3M9Iml0ZW0iPjxpbWcgc3JjPSJpbWFnZXMvbWFycXVlZTMuanBnIj48L2xpPgotICogICAgICAgPGxpIGNsYXNzPSJpdGVtIj48aW1nIHNyYz0iaW1hZ2VzL21hcnF1ZWU0LmpwZyI+PC9saT4KLSAqICAgPC91bD4KLSAqICA8L2Rpdj4KLSAqCi0gKiAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAqICAgJCgnLnNsaWRlc2hvdy1jb250YWluZXInKS5kYWNTbGlkZXNob3coewotICogICAgICAgYXV0bzogdHJ1ZSwKLSAqICAgICAgIGJ0blByZXY6ICcuc2xpZGVzaG93LXByZXYnLAotICogICAgICAgYnRuTmV4dDogJy5zbGlkZXNob3ctbmV4dCcKLSAqICAgfSk7Ci0gKiAgIDwvc2NyaXB0PgotICoKLSAqICBPcHRpb25zOgotICogIGJ0blByZXY6ICAgIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHByZXZpb3VzIGJ1dHRvbgotICogIGJ0bk5leHQ6ICAgIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIG5leHQgYnV0dG9uCi0gKiAgYXV0bzogICAgICAgd2hldGhlciBvciBub3QgdG8gYXV0by1wcm9jZWVkCi0gKiAgc3BlZWQ6ICAgICAgYW5pbWF0aW9uIHNwZWVkCi0gKiAgYXV0b1RpbWU6ICAgdGltZSBiZXR3ZWVuIGF1dG8tcm90YXRpb24KLSAqICBlYXNpbmc6ICAgICBlYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb24KLSAqICBzdGFydDogICAgICBpdGVtIHRvIHNlbGVjdCBieSBkZWZhdWx0Ci0gKiAgc2Nyb2xsOiAgICAgZGlyZWN0aW9uIHRvIHNjcm9sbCBpbgotICogIHBhZ2luYXRpb246IHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgZG90dGVkIHBhZ2luYXRpb24KLSAqCi0gKi8KLSAoZnVuY3Rpb24oJCkgewotICQuZm4uZGFjVGFiYmVkTGlzdCA9IGZ1bmN0aW9uKG8pIHsKLQotICAgICAvL09wdGlvbnMgLSBzZWUgYWJvdmUKLSAgICAgbyA9ICQuZXh0ZW5kKHsKLSAgICAgICAgIHNwZWVkIDogMjUwLAotICAgICAgICAgZWFzaW5nOiBudWxsLAotICAgICAgICAgbmF2X2lkOiBudWxsLAotICAgICAgICAgZnJhbWVfaWQ6IG51bGwKLSAgICAgfSwgbyB8fCB7fSk7Ci0KLSAgICAgLy9TZXQgdXAgYSBjYXJvdXNlbCBmb3IgZWFjaAotICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewotCi0gICAgICAgICB2YXIgY3VyciA9IDA7Ci0gICAgICAgICB2YXIgcnVubmluZyA9IGZhbHNlOwotICAgICAgICAgdmFyIGFuaW1Dc3MgPSAibWFyZ2luLWxlZnQiOwotICAgICAgICAgdmFyIHNpemVDc3MgPSAid2lkdGgiOwotICAgICAgICAgdmFyIGRpdiA9ICQodGhpcyk7Ci0KLSAgICAgICAgIHZhciBuYXYgPSAkKG8ubmF2X2lkLCBkaXYpOwotICAgICAgICAgdmFyIG5hdl9saSA9ICQoImxpIiwgbmF2KTsKLSAgICAgICAgIHZhciBuYXZfc2l6ZSA9IG5hdl9saS5zaXplKCk7Ci0gICAgICAgICB2YXIgZnJhbWUgPSBkaXYuZmluZChvLmZyYW1lX2lkKTsKLSAgICAgICAgIHZhciBjb250ZW50X3dpZHRoID0gJChmcmFtZSkuZmluZCgndWwnKS53aWR0aCgpOwotICAgICAgICAgLy9CdXR0b25zCi0gICAgICAgICAkKG5hdl9saSkuY2xpY2soZnVuY3Rpb24oZSkgewotICAgICAgICAgICBnbygkKG5hdl9saSkuaW5kZXgoJCh0aGlzKSkpOwotICAgICAgICAgfSkKLQotICAgICAgICAgLy9HbyB0byBhbiBpdGVtCi0gICAgICAgICBmdW5jdGlvbiBnbyh0bykgewotICAgICAgICAgICAgIGlmKCFydW5uaW5nKSB7Ci0gICAgICAgICAgICAgICAgIGN1cnIgPSB0bzsKLSAgICAgICAgICAgICAgICAgcnVubmluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgZnJhbWUuYW5pbWF0ZSh7ICdtYXJnaW4tbGVmdCcgOiAtKGN1cnIqY29udGVudF93aWR0aCkgfSwgby5zcGVlZCwgby5lYXNpbmcsCi0gICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICk7Ci0KLQotICAgICAgICAgICAgICAgICBuYXZfbGkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwotICAgICAgICAgICAgICAgICBuYXZfbGkuZXEodG8pLmFkZENsYXNzKCdhY3RpdmUnKTsKLQotCi0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgIH07Ci0gICAgIH0pOwotIH07Ci0KLSBmdW5jdGlvbiBjc3MoZWwsIHByb3ApIHsKLSAgICAgcmV0dXJuIHBhcnNlSW50KCQuY3NzKGVsWzBdLCBwcm9wKSkgfHwgMDsKLSB9OwotIGZ1bmN0aW9uIHdpZHRoKGVsKSB7Ci0gICAgIHJldHVybiAgZWxbMF0ub2Zmc2V0V2lkdGggKyBjc3MoZWwsICdtYXJnaW5MZWZ0JykgKyBjc3MoZWwsICdtYXJnaW5SaWdodCcpOwotIH07Ci0gZnVuY3Rpb24gaGVpZ2h0KGVsKSB7Ci0gICAgIHJldHVybiBlbFswXS5vZmZzZXRIZWlnaHQgKyBjc3MoZWwsICdtYXJnaW5Ub3AnKSArIGNzcyhlbCwgJ21hcmdpbkJvdHRvbScpOwotIH07Ci0KLSB9KShqUXVlcnkpOwotCi0KLQotCi0KLS8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjICBTRUFSQ0ggU1VHR0VTVElPTlMgICMjIyMjIyMjIyMjIyMjIyMjIyAqLwotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLQotCi0KLXZhciBnU2VsZWN0ZWRJbmRleCA9IC0xOwotdmFyIGdNYXRjaGVzID0gbmV3IEFycmF5KCk7Ci12YXIgZ0xhc3RUZXh0ID0gIiI7Ci12YXIgZ0luaXRpYWxpemVkID0gZmFsc2U7Ci12YXIgUk9XX0NPVU5UX0ZSQU1FV09SSyA9IDIwOyAgICAgICAvLyBtYXggbnVtYmVyIG9mIHJlc3VsdHMgaW4gbGlzdAotdmFyIGdMaXN0TGVuZ3RoID0gMDsKLQotCi12YXIgZ0dvb2dsZU1hdGNoZXMgPSBuZXcgQXJyYXkoKTsKLXZhciBST1dfQ09VTlRfR09PR0xFID0gMTU7ICAgICAgICAgIC8vIG1heCBudW1iZXIgb2YgcmVzdWx0cyBpbiBsaXN0Ci12YXIgZ0dvb2dsZUxpc3RMZW5ndGggPSAwOwotCi1mdW5jdGlvbiBzZXRfaXRlbV9zZWxlY3RlZCgkbGksIHNlbGVjdGVkKQotewotICAgIGlmIChzZWxlY3RlZCkgewotICAgICAgICAkbGkuYXR0cignY2xhc3MnLCdqZC1hdXRvY29tcGxldGUgamQtc2VsZWN0ZWQnKTsKLSAgICB9IGVsc2UgewotICAgICAgICAkbGkuYXR0cignY2xhc3MnLCdqZC1hdXRvY29tcGxldGUnKTsKLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIHNldF9pdGVtX3ZhbHVlcyh0b3Jvb3QsICRsaSwgbWF0Y2gpCi17Ci0gICAgdmFyICRsaW5rID0gJCgnYScsJGxpKTsKLSAgICAkbGluay5odG1sKG1hdGNoLl9faGlsYWJlbCB8fCBtYXRjaC5sYWJlbCk7Ci0gICAgJGxpbmsuYXR0cignaHJlZicsdG9yb290ICsgbWF0Y2gubGluayk7Ci19Ci0KLWZ1bmN0aW9uIG5ld19zdWdnZXN0aW9uKCkgewotICAgIHZhciAkbGlzdCA9ICQoIiNzZWFyY2hfZmlsdGVyZWQiKTsKLSAgICB2YXIgJGxpID0gJCgiPGxpIGNsYXNzPSdqZC1hdXRvY29tcGxldGUnPjwvbGk+Iik7Ci0gICAgJGxpc3QuYXBwZW5kKCRsaSk7Ci0KLSAgICAkbGkubW91c2Vkb3duKGZ1bmN0aW9uKCkgewotICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0aGlzLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIik7Ci0gICAgfSk7Ci0gICAgJGxpLm1vdXNlb3ZlcihmdW5jdGlvbigpIHsKLSAgICAgICAgJCgnI3NlYXJjaF9maWx0ZXJlZCBsaScpLnJlbW92ZUNsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICBnU2VsZWN0ZWRJbmRleCA9ICQoJyNzZWFyY2hfZmlsdGVyZWQgbGknKS5pbmRleCh0aGlzKTsKLSAgICB9KTsKLSAgICAkbGkuYXBwZW5kKCc8YT48L2E+Jyk7Ci0gICAgJGxpLmF0dHIoJ2NsYXNzJywnc2hvdy1pdGVtJyk7Ci0gICAgcmV0dXJuICRsaTsKLX0KLQotZnVuY3Rpb24gc3luY19zZWxlY3Rpb25fdGFibGUodG9yb290KQotewotICAgIHZhciAkbGlzdCA9ICQoIiNzZWFyY2hfZmlsdGVyZWQiKTsKLSAgICB2YXIgJGxpOyAvL2xpc3QgaXRlbSBqcXVlcnkgb2JqZWN0Ci0gICAgdmFyIGk7IC8vbGlzdCBpdGVtIGl0ZXJhdG9yCi0KLSAgICAvLyByZXNldCB0aGUgbGlzdAotICAgICQoImxpIiwkbGlzdCkucmVtb3ZlKCk7Ci0KLSAgICAvL2lmIHdlIGhhdmUgcmVzdWx0cywgbWFrZSB0aGUgdGFibGUgdmlzaWJsZSBhbmQgaW5pdGlhbGl6ZSByZXN1bHQgaW5mbwotICAgIGlmICgoZ01hdGNoZXMubGVuZ3RoID4gMCkgfHwgKGdHb29nbGVNYXRjaGVzLmxlbmd0aCA+IDApKSB7Ci0gICAgICAgIC8vIHJldmVhbCBzdWdnZXN0aW9uIGxpc3QKLSAgICAgICAgJCgnI3NlYXJjaF9maWx0ZXJlZF9kaXYnKS5yZW1vdmVDbGFzcygnbm8tZGlzcGxheScpOwotICAgICAgICB2YXIgbGlzdEluZGV4ID0gMDsgLy8gbGlzdCBpbmRleCBwb3NpdGlvbgotCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIEFORFJPSUQgUkVTVUxUUyAjIyMjIyMjIyMjIyMjCi0gICAgICAgIGlmIChnTWF0Y2hlcy5sZW5ndGggPiAwKSB7Ci0KLSAgICAgICAgICAgIC8vIGRldGVybWluZSBhbmRyb2lkIHJlc3VsdHMgdG8gc2hvdwotICAgICAgICAgICAgZ0xpc3RMZW5ndGggPSBnTWF0Y2hlcy5sZW5ndGggPCBST1dfQ09VTlRfRlJBTUVXT1JLID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ01hdGNoZXMubGVuZ3RoIDogUk9XX0NPVU5UX0ZSQU1FV09SSzsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGdMaXN0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB2YXIgJGxpID0gbmV3X3N1Z2dlc3Rpb24oKTsKLSAgICAgICAgICAgICAgICBzZXRfaXRlbV92YWx1ZXModG9yb290LCAkbGksIGdNYXRjaGVzW2ldKTsKLSAgICAgICAgICAgICAgICBzZXRfaXRlbV9zZWxlY3RlZCgkbGksIGkgPT0gZ1NlbGVjdGVkSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIyMjIyMjIyMjIyMgR09PR0xFIFJFU1VMVFMgIyMjIyMjIyMjIyMjIwotICAgICAgICBpZiAoZ0dvb2dsZU1hdGNoZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgLy8gc2hvdyBoZWFkZXIgZm9yIGxpc3QKLSAgICAgICAgICAgICRsaXN0LmFwcGVuZCgiPGxpIGNsYXNzPSdoZWFkZXInPmluIEdvb2dsZSBTZXJ2aWNlczo8L2xpPiIpOwotCi0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgZ29vZ2xlIHJlc3VsdHMgdG8gc2hvdwotICAgICAgICAgICAgZ0dvb2dsZUxpc3RMZW5ndGggPSBnR29vZ2xlTWF0Y2hlcy5sZW5ndGggPCBST1dfQ09VTlRfR09PR0xFID8gZ0dvb2dsZU1hdGNoZXMubGVuZ3RoIDogUk9XX0NPVU5UX0dPT0dMRTsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGdHb29nbGVMaXN0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB2YXIgJGxpID0gbmV3X3N1Z2dlc3Rpb24oKTsKLSAgICAgICAgICAgICAgICBzZXRfaXRlbV92YWx1ZXModG9yb290LCAkbGksIGdHb29nbGVNYXRjaGVzW2ldKTsKLSAgICAgICAgICAgICAgICBzZXRfaXRlbV9zZWxlY3RlZCgkbGksIGkgPT0gZ1NlbGVjdGVkSW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAvL2lmIHdlIGhhdmUgbm8gcmVzdWx0cywgaGlkZSB0aGUgdGFibGUKLSAgICB9IGVsc2UgewotICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdicpLmFkZENsYXNzKCduby1kaXNwbGF5Jyk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBzZWFyY2hfY2hhbmdlZChlLCBrZCwgdG9yb290KQotewotICAgIHZhciBzZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VhcmNoX2F1dG9jb21wbGV0ZSIpOwotICAgIHZhciB0ZXh0ID0gc2VhcmNoLnZhbHVlLnJlcGxhY2UoLyheICspfCggKyQpL2csICcnKTsKLQotICAgIC8vIHNob3cvaGlkZSB0aGUgY2xvc2UgYnV0dG9uCi0gICAgaWYgKHRleHQgIT0gJycpIHsKLSAgICAgICAgJCgiLnNlYXJjaCAuY2xvc2UiKS5yZW1vdmVDbGFzcygiaGlkZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICQoIi5zZWFyY2ggLmNsb3NlIikuYWRkQ2xhc3MoImhpZGUiKTsKLSAgICB9Ci0KLSAgICAvLyAxMyA9IGVudGVyCi0gICAgaWYgKGUua2V5Q29kZSA9PSAxMykgewotICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdicpLmFkZENsYXNzKCduby1kaXNwbGF5Jyk7Ci0gICAgICAgIGlmICghJCgnI3NlYXJjaF9maWx0ZXJlZF9kaXYnKS5oYXNDbGFzcygnbm8tZGlzcGxheScpIHx8IChnU2VsZWN0ZWRJbmRleCA8IDApKSB7Ci0gICAgICAgICAgICBpZiAoJCgiI3NlYXJjaFJlc3VsdHMiKS5pcygiOmhpZGRlbiIpICYmIChzZWFyY2gudmFsdWUgIT0gIiIpKSB7Ci0gICAgICAgICAgICAgIC8vIGlmIHJlc3VsdHMgYXJlbid0IHNob3dpbmcgKGFuZCB0ZXh0IG5vdCBlbXB0eSksIHJldHVybiB0cnVlIHRvIGFsbG93IHNlYXJjaCB0byBleGVjdXRlCi0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXN1bHRzIGFyZSBhbHJlYWR5IHNob3dpbmcsIHNvIGFsbG93IGFqYXggdG8gYXV0byByZWZyZXNoIHRoZSByZXN1bHRzCi0gICAgICAgICAgICAgIC8vIGFuZCBpZ25vcmUgdGhpcyBFbnRlciBwcmVzcyB0byBhdm9pZCB0aGUgcmVsb2FkLgotICAgICAgICAgICAgICAvLyByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIC8vIEZvciBub3csIHdlJ3JlIG5vdCB1c2luZyBBSkFYIHNvIHdlIHJlc3BvbmQgdG8gZXZlcnkgRW50ZXIuCi0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGtkICYmIGdTZWxlY3RlZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQoImEiLCQoJyNzZWFyY2hfZmlsdGVyZWQgbGknKVtnU2VsZWN0ZWRJbmRleF0pLmF0dHIoImhyZWYiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyAzOCAtLSBhcnJvdyB1cAotICAgIGVsc2UgaWYgKGtkICYmIChlLmtleUNvZGUgPT0gMzgpKSB7Ci0gICAgICAgIGlmICgkKCQoIiNzZWFyY2hfZmlsdGVyZWQgbGkiKVtnU2VsZWN0ZWRJbmRleC0xXSkuaGFzQ2xhc3MoImhlYWRlciIpKSB7Ci0gICAgICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdiBsaScpLnJlbW92ZUNsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICAgICAgZ1NlbGVjdGVkSW5kZXgtLTsKLSAgICAgICAgICAgICQoJyNzZWFyY2hfZmlsdGVyZWRfZGl2IGxpOm50aC1jaGlsZCgnKyhnU2VsZWN0ZWRJbmRleCsxKSsnKScpLmFkZENsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnU2VsZWN0ZWRJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdiBsaScpLnJlbW92ZUNsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICAgICAgZ1NlbGVjdGVkSW5kZXgtLTsKLSAgICAgICAgICAgICQoJyNzZWFyY2hfZmlsdGVyZWRfZGl2IGxpOm50aC1jaGlsZCgnKyhnU2VsZWN0ZWRJbmRleCsxKSsnKScpLmFkZENsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gNDAgLS0gYXJyb3cgZG93bgotICAgIGVsc2UgaWYgKGtkICYmIChlLmtleUNvZGUgPT0gNDApKSB7Ci0gICAgICAgIGlmICgkKCQoIiNzZWFyY2hfZmlsdGVyZWQgbGkiKVtnU2VsZWN0ZWRJbmRleCsxXSkuaGFzQ2xhc3MoImhlYWRlciIpKSB7Ci0gICAgICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdiBsaScpLnJlbW92ZUNsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICAgICAgZ1NlbGVjdGVkSW5kZXgrKzsKLSAgICAgICAgICAgICQoJyNzZWFyY2hfZmlsdGVyZWRfZGl2IGxpOm50aC1jaGlsZCgnKyhnU2VsZWN0ZWRJbmRleCsxKSsnKScpLmFkZENsYXNzKCdqZC1zZWxlY3RlZCcpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZ1NlbGVjdGVkSW5kZXggPCAkKCJ1bCNzZWFyY2hfZmlsdGVyZWQgbGkiKS5sZW5ndGgtMSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgkKCQoIiNzZWFyY2hfZmlsdGVyZWQgbGkiKVtnU2VsZWN0ZWRJbmRleCsxXSkuaGFzQ2xhc3MoImhlYWRlciIpKSkgewotICAgICAgICAgICAgJCgnI3NlYXJjaF9maWx0ZXJlZF9kaXYgbGknKS5yZW1vdmVDbGFzcygnamQtc2VsZWN0ZWQnKTsKLSAgICAgICAgICAgIGdTZWxlY3RlZEluZGV4Kys7Ci0gICAgICAgICAgICAkKCcjc2VhcmNoX2ZpbHRlcmVkX2RpdiBsaTpudGgtY2hpbGQoJysoZ1NlbGVjdGVkSW5kZXgrMSkrJyknKS5hZGRDbGFzcygnamQtc2VsZWN0ZWQnKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIGlmIGtleS11cCBldmVudCBhbmQgbm90IGFycm93IGRvd24vdXAsCi0gICAgLy8gcmVhZCB0aGUgc2VhcmNoIHF1ZXJ5IGFuZCBhZGQgc3VnZ2VzdHNpb25zIHRvIGdNYXRjaGVzCi0gICAgZWxzZSBpZiAoIWtkICYmIChlLmtleUNvZGUgIT0gNDApICYmIChlLmtleUNvZGUgIT0gMzgpKSB7Ci0gICAgICAgIGdNYXRjaGVzID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIG1hdGNoZWRDb3VudCA9IDA7Ci0gICAgICAgIGdHb29nbGVNYXRjaGVzID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIG1hdGNoZWRDb3VudEdvb2dsZSA9IDA7Ci0gICAgICAgIGdTZWxlY3RlZEluZGV4ID0gLTE7Ci0KLSAgICAgICAgLy8gU2VhcmNoIGZvciBBbmRyb2lkIG1hdGNoZXMKLSAgICAgICAgZm9yICh2YXIgaT0wOyBpPERBVEEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhciBzID0gREFUQVtpXTsKLSAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCAhPSAwICYmCi0gICAgICAgICAgICAgICAgICBzLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXh0LnRvTG93ZXJDYXNlKCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZ01hdGNoZXNbbWF0Y2hlZENvdW50XSA9IHM7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlZENvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmFua19hdXRvY29tcGxldGVfcmVzdWx0cyh0ZXh0LCBnTWF0Y2hlcyk7Ci0gICAgICAgIGZvciAodmFyIGk9MDsgaTxnTWF0Y2hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIHMgPSBnTWF0Y2hlc1tpXTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gU2VhcmNoIGZvciBHb29nbGUgbWF0Y2hlcwotICAgICAgICAvKgotICAgICAgICAgKiAgQ29tbWVudGVkIHRoaXMgb3V0IGJlY2F1c2UgR09PR0xFX0RBVEEgbm90IGRlZmluZWQgZm9yIHVzIGFuZCBjb2RlCi0gICAgICAgICAqICBjYXVzZXMgYW4gZXJyb3IuICBUaGlzIHByb2JhYmx5IGhhcyB0byBkbyB3aXRoIHRoZSBtaXNzaW5nCi0gICAgICAgICAqICBnbXNfbGlzdHMuanMgZmlsZSBpbiBTQUMuIFRPRE8gZmlndXJlIGl0IGFsbCBvdXQuCi0gICAgICAgICAqCi0gICAgICAgIGZvciAodmFyIGk9MDsgaTxHT09HTEVfREFUQS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIHMgPSBHT09HTEVfREFUQVtpXTsKLSAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCAhPSAwICYmCi0gICAgICAgICAgICAgICAgICBzLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXh0LnRvTG93ZXJDYXNlKCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZ0dvb2dsZU1hdGNoZXNbbWF0Y2hlZENvdW50R29vZ2xlXSA9IHM7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlZENvdW50R29vZ2xlKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmFua19hdXRvY29tcGxldGVfcmVzdWx0cyh0ZXh0LCBnR29vZ2xlTWF0Y2hlcyk7Ci0gICAgICAgIGZvciAodmFyIGk9MDsgaTxnR29vZ2xlTWF0Y2hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIHMgPSBnR29vZ2xlTWF0Y2hlc1tpXTsKLSAgICAgICAgfQotICAgICAgICAqLwotCi0gICAgICAgIGhpZ2hsaWdodF9hdXRvY29tcGxldGVfcmVzdWx0X2xhYmVscyh0ZXh0KTsKLSAgICAgICAgc3luY19zZWxlY3Rpb25fdGFibGUodG9yb290KTsKLQotCi0gICAgICAgIHJldHVybiB0cnVlOyAvLyBhbGxvdyB0aGUgZXZlbnQgdG8gYnViYmxlIHVwIHRvIHRoZSBzZWFyY2ggYXBpCi0gICAgfQotfQotCi0vKiBPcmRlciB0aGUgcmVzdWx0IGxpc3QgYmFzZWQgb24gbWF0Y2ggcXVhbGl0eSAqLwotZnVuY3Rpb24gcmFua19hdXRvY29tcGxldGVfcmVzdWx0cyhxdWVyeSwgbWF0Y2hlcykgewotICAgIHF1ZXJ5ID0gcXVlcnkgfHwgJyc7Ci0gICAgaWYgKCFtYXRjaGVzIHx8ICFtYXRjaGVzLmxlbmd0aCkKLSAgICAgIHJldHVybjsKLQotICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGxhc3Qgb2NjdXJlbmNlIGluZGV4IG9mIHRoZSBnaXZlbiByZWdleAotICAgIC8vIGluIHRoZSBnaXZlbiBzdHJpbmcsIG9yIC0xIGlmIG5vdCBmb3VuZAotICAgIHZhciBfbGFzdFNlYXJjaCA9IGZ1bmN0aW9uKHMsIHJlKSB7Ci0gICAgICBpZiAocyA9PSAnJykKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgdmFyIGwgPSAtMTsKLSAgICAgIHZhciB0bXA7Ci0gICAgICB3aGlsZSAoKHRtcCA9IHMuc2VhcmNoKHJlKSkgPj0gMCkgewotICAgICAgICBpZiAobCA8IDApIGwgPSAwOwotICAgICAgICBsICs9IHRtcDsKLSAgICAgICAgcyA9IHMuc3Vic3RyKHRtcCArIDEpOwotICAgICAgfQotICAgICAgcmV0dXJuIGw7Ci0gICAgfTsKLQotICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0aGF0IGNvdW50cyB0aGUgb2NjdXJyZW5jZXMgb2YgYSBnaXZlbiBjaGFyYWN0ZXIgaW4KLSAgICAvLyBhIGdpdmVuIHN0cmluZwotICAgIHZhciBfY291bnRDaGFyID0gZnVuY3Rpb24ocywgYykgewotICAgICAgdmFyIG4gPSAwOwotICAgICAgZm9yICh2YXIgaT0wOyBpPHMubGVuZ3RoOyBpKyspCi0gICAgICAgIGlmIChzLmNoYXJBdChpKSA9PSBjKSArK247Ci0gICAgICByZXR1cm4gbjsKLSAgICB9OwotCi0gICAgdmFyIHF1ZXJ5TG93ZXIgPSBxdWVyeS50b0xvd2VyQ2FzZSgpOwotICAgIHZhciBxdWVyeUFsbnVtID0gKHF1ZXJ5TG93ZXIubWF0Y2goL1x3Ky8pIHx8IFsnJ10pWzBdOwotICAgIHZhciBwYXJ0UHJlZml4QWxudW1SRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyBxdWVyeUFsbnVtKTsKLSAgICB2YXIgcGFydEV4YWN0QWxudW1SRSA9IG5ldyBSZWdFeHAoJ1xcYicgKyBxdWVyeUFsbnVtICsgJ1xcYicpOwotCi0gICAgdmFyIF9yZXN1bHRTY29yZUZuID0gZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICAgIC8vIHNjb3JlcyBhcmUgY2FsY3VsYXRlZCBiYXNlZCBvbiBleGFjdCBhbmQgcHJlZml4IG1hdGNoZXMsCi0gICAgICAgIC8vIGFuZCB0aGVuIG51bWJlciBvZiBwYXRoIHNlcGFyYXRvcnMgKGRvdHMpIGZyb20gdGhlIGxhc3QKLSAgICAgICAgLy8gbWF0Y2ggKGkuZS4gZmF2b3JpbmcgY2xhc3NlcyBhbmQgZGVlcCBwYWNrYWdlIG5hbWVzKQotICAgICAgICB2YXIgc2NvcmUgPSAxLjA7Ci0gICAgICAgIHZhciBsYWJlbExvd2VyID0gcmVzdWx0LmxhYmVsLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIHZhciB0OwotICAgICAgICB0ID0gX2xhc3RTZWFyY2gobGFiZWxMb3dlciwgcGFydEV4YWN0QWxudW1SRSk7Ci0gICAgICAgIGlmICh0ID49IDApIHsKLSAgICAgICAgICAgIC8vIGV4YWN0IHBhcnQgbWF0Y2gKLSAgICAgICAgICAgIHZhciBwYXJ0c0FmdGVyID0gX2NvdW50Q2hhcihsYWJlbExvd2VyLnN1YnN0cih0ICsgMSksICcuJyk7Ci0gICAgICAgICAgICBzY29yZSAqPSAyMDAgLyAocGFydHNBZnRlciArIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdCA9IF9sYXN0U2VhcmNoKGxhYmVsTG93ZXIsIHBhcnRQcmVmaXhBbG51bVJFKTsKLSAgICAgICAgICAgIGlmICh0ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBwYXJ0IHByZWZpeCBtYXRjaAotICAgICAgICAgICAgICAgIHZhciBwYXJ0c0FmdGVyID0gX2NvdW50Q2hhcihsYWJlbExvd2VyLnN1YnN0cih0ICsgMSksICcuJyk7Ci0gICAgICAgICAgICAgICAgc2NvcmUgKj0gMjAgLyAocGFydHNBZnRlciArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjb3JlOwotICAgIH07Ci0KLSAgICBmb3IgKHZhciBpPTA7IGk8bWF0Y2hlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBtYXRjaGVzW2ldLl9fcmVzdWx0U2NvcmUgPSBfcmVzdWx0U2NvcmVGbihtYXRjaGVzW2ldKTsKLSAgICB9Ci0KLSAgICBtYXRjaGVzLnNvcnQoZnVuY3Rpb24oYSxiKXsKLSAgICAgICAgdmFyIG4gPSBiLl9fcmVzdWx0U2NvcmUgLSBhLl9fcmVzdWx0U2NvcmU7Ci0gICAgICAgIGlmIChuID09IDApIC8vIGxleGljb2dyYXBoaWNhbCBzb3J0IGlmIHNjb3JlcyBhcmUgdGhlIHNhbWUKLSAgICAgICAgICAgIG4gPSAoYS5sYWJlbCA8IGIubGFiZWwpID8gLTEgOiAxOwotICAgICAgICByZXR1cm4gbjsKLSAgICB9KTsKLX0KLQotLyogQWRkIGVtcGhhc2lzIHRvIHBhcnQgb2Ygc3RyaW5nIHRoYXQgbWF0Y2hlcyBxdWVyeSAqLwotZnVuY3Rpb24gaGlnaGxpZ2h0X2F1dG9jb21wbGV0ZV9yZXN1bHRfbGFiZWxzKHF1ZXJ5KSB7Ci0gICAgcXVlcnkgPSBxdWVyeSB8fCAnJzsKLSAgICBpZiAoKCFnTWF0Y2hlcyB8fCAhZ01hdGNoZXMubGVuZ3RoKSAmJiAoIWdHb29nbGVNYXRjaGVzIHx8ICFnR29vZ2xlTWF0Y2hlcy5sZW5ndGgpKQotICAgICAgcmV0dXJuOwotCi0gICAgdmFyIHF1ZXJ5TG93ZXIgPSBxdWVyeS50b0xvd2VyQ2FzZSgpOwotICAgIHZhciBxdWVyeUFsbnVtRG90ID0gKHF1ZXJ5TG93ZXIubWF0Y2goL1tcd1wuXSsvKSB8fCBbJyddKVswXTsKLSAgICB2YXIgcXVlcnlSRSA9IG5ldyBSZWdFeHAoCi0gICAgICAgICcoJyArIHF1ZXJ5QWxudW1Eb3QucmVwbGFjZSgvXC4vZywgJ1xcLicpICsgJyknLCAnaWcnKTsKLSAgICBmb3IgKHZhciBpPTA7IGk8Z01hdGNoZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgZ01hdGNoZXNbaV0uX19oaWxhYmVsID0gZ01hdGNoZXNbaV0ubGFiZWwucmVwbGFjZSgKLSAgICAgICAgICAgIHF1ZXJ5UkUsICc8Yj4kMTwvYj4nKTsKLSAgICB9Ci0gICAgZm9yICh2YXIgaT0wOyBpPGdHb29nbGVNYXRjaGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGdHb29nbGVNYXRjaGVzW2ldLl9faGlsYWJlbCA9IGdHb29nbGVNYXRjaGVzW2ldLmxhYmVsLnJlcGxhY2UoCi0gICAgICAgICAgICBxdWVyeVJFLCAnPGI+JDE8L2I+Jyk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBzZWFyY2hfZm9jdXNfY2hhbmdlZChvYmosIGZvY3VzZWQpCi17Ci0gICAgaWYgKCFmb2N1c2VkKSB7Ci0gICAgICAgIGlmKG9iai52YWx1ZSA9PSAiIil7Ci0gICAgICAgICAgJCgiLnNlYXJjaCAuY2xvc2UiKS5hZGRDbGFzcygiaGlkZSIpOwotICAgICAgICB9Ci0gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWFyY2hfZmlsdGVyZWRfZGl2IikuY2xhc3NOYW1lID0gIm5vLWRpc3BsYXkiOwotICAgIH0KLX0KLQotZnVuY3Rpb24gc3VibWl0X3NlYXJjaCgpIHsKLSAgdmFyIHF1ZXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaF9hdXRvY29tcGxldGUnKS52YWx1ZTsKLSAgbG9jYXRpb24uaGFzaCA9ICdxPScgKyBxdWVyeTsKLSAgbG9hZFNlYXJjaFJlc3VsdHMoKTsKLSAgJCgiI3NlYXJjaFJlc3VsdHMiKS5zbGlkZURvd24oJ3Nsb3cnKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLWZ1bmN0aW9uIGhpZGVSZXN1bHRzKCkgewotICAkKCIjc2VhcmNoUmVzdWx0cyIpLnNsaWRlVXAoKTsKLSAgJCgiLnNlYXJjaCAuY2xvc2UiKS5hZGRDbGFzcygiaGlkZSIpOwotICBsb2NhdGlvbi5oYXNoID0gJyc7Ci0KLSAgJCgiI3NlYXJjaF9hdXRvY29tcGxldGUiKS52YWwoIiIpLmJsdXIoKTsKLQotICAvLyByZXNldCB0aGUgYWpheCBzZWFyY2ggY2FsbGJhY2sgdG8gbm90aGluZywgc28gcmVzdWx0cyBkb24ndCBhcHBlYXIgdW5sZXNzIEVOVEVSCi0gIC8vICBzZWFyY2hDb250cm9sLnNldFNlYXJjaFN0YXJ0aW5nQ2FsbGJhY2sodGhpcywgZnVuY3Rpb24oY29udHJvbCwgc2VhcmNoZXIsIHF1ZXJ5KSB7fSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjICBDVVNUT00gU0VBUkNIIEVOR0lORSAgIyMjIyMjIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0KLS8vIFRPRE8sIGFkZCBsb2NhbGl6ZWQgc2VhcmNoLgotZnVuY3Rpb24gZ2V0TGFuZ1ByZWYoKSB7Ci0gIHJldHVybiAiZW4iOwotfQotCi0vLyBQYWNrYWdlIG9mIGZ1bmN0aW9ucyB0aGF0IGRvZXMgY3VzdG9tIHNlYXJjaCwgZnJvbSBEQUMgcmVkZXNpZ24uCi0oZnVuY3Rpb24oJCkgewotICB2YXIgTEFORzsKLQotICBmdW5jdGlvbiBnZXRTZWFyY2hMYW5nKCkgewotICAgIGlmICghTEFORykgewotICAgICAgTEFORyA9IGdldExhbmdQcmVmKCk7Ci0KLSAgICAgIC8vIEZpeCB6aC1jbiB0byBiZSB6aC1DTi4KLSAgICAgIExBTkcgPSBMQU5HLnJlcGxhY2UoLy1cdysvLCBmdW5jdGlvbihtKSB7IHJldHVybiBtLnRvVXBwZXJDYXNlKCk7IH0pOwotICAgIH0KLSAgICByZXR1cm4gTEFORzsKLSAgfQotCi0gIGZ1bmN0aW9uIGN1c3RvbVNlYXJjaChxdWVyeSwgc3RhcnQpIHsKLSAgICB2YXIgc2VhcmNoUGFyYW1zID0gewotICAgICAgLy8gS2V5cyBmb3IgU0FDCi0gICAgICBjeDonMDE2MjU4NjQzNDYyMTY4ODU5ODc1OnFxcG04Zml3Z2MwJywKLSAgICAgIGtleTogJ0FJemFTeUJPV0hEM0pBRjZROUxJSjROaWFoR0FGNzBXN2lEQUk5TScsCi0KLSAgICAgIC8vIEtleXMgZm9yIERBQwotICAgICAgLy8gY3g6ICcwMDA1MjE3NTAwOTUwNTAyODkwMTA6enBjcGkxZWE0czgnLAotICAgICAgLy8ga2V5OiAnQUl6YVN5Q0ZoYkdualcwNmRZd3ZSQ1U4aF96amRwUzRQWVliRWU4JywKLQotICAgICAgcTogcXVlcnksCi0gICAgICBzdGFydDogc3RhcnQgfHwgMSwKLSAgICAgIG51bTogNiwKLSAgICAgIGhsOiBnZXRTZWFyY2hMYW5nKCksCi0gICAgICBmaWVsZHM6ICdxdWVyaWVzLGl0ZW1zKHBhZ2VtYXAsbGluayx0aXRsZSxodG1sU25pcHBldCxmb3JtYXR0ZWRVcmwpJwotICAgIH07Ci0KLSAgICByZXR1cm4gJC5nZXQoJ2h0dHBzOi8vY29udGVudC5nb29nbGVhcGlzLmNvbS9jdXN0b21zZWFyY2gvdjE/JyArICAkLnBhcmFtKHNlYXJjaFBhcmFtcykpOwotICB9Ci0KLSAgZnVuY3Rpb24gcmVuZGVyUmVzdWx0cyhlbCwgcmVzdWx0cykgewotICAgIGlmICghcmVzdWx0cy5pdGVtcykgewotICAgICAgZWwuYXBwZW5kKCQoJzxkaXY+JykudGV4dCgnTm8gcmVzdWx0cycpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMuaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciBpdGVtID0gcmVzdWx0cy5pdGVtc1tpXTsKLSAgICAgIC8vIE5vIHRodW1ibmFpbCBpbWFnZXMgaW4gU0FDLgotICAgICAgLy8gdmFyIGhhc0ltYWdlID0gaXRlbS5wYWdlbWFwICYmIGl0ZW0ucGFnZW1hcC5jc2VfdGh1bWJuYWlsOwotICAgICAgdmFyIHNlY3Rpb25NYXRjaCA9IGl0ZW0ubGluay5tYXRjaCgvc291cmNlXC5hbmRyb2lkXC5jb21cLyhcdyopLyk7Ci0gICAgICB2YXIgc2VjdGlvbiA9IChzZWN0aW9uTWF0Y2ggJiYgc2VjdGlvbk1hdGNoWzFdKSB8fCAnYmxvZyc7Ci0KLSAgICAgIHZhciBlbnRyeSA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ2RhYy1jdXN0b20tc2VhcmNoLWVudHJ5IGNvbHMnKTsKLQotLy8gTm8gdGh1bWJuYWlsIGltYWdlcyBpbiBTQUMuCi0vLyAgICAgIGlmIChoYXNJbWFnZSkgewotLy8gICAgICAgIHZhciBpbWFnZSA9IGl0ZW0ucGFnZW1hcC5jc2VfdGh1bWJuYWlsWzBdOwotLy8gICAgICAgIGVudHJ5LmFwcGVuZCgkKCc8ZGl2PicpLmFkZENsYXNzKCdjb2wtMW9mNicpCi0vLyAgICAgICAgICAuYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ2RhYy1jdXN0b20tc2VhcmNoLWltYWdlJykuY3NzKCdiYWNrZ3JvdW5kLWltYWdlJywgJ3VybCgnICsgaW1hZ2Uuc3JjICsgJyknKSkpOwotLy8gICAgICB9Ci0vLyBlbnRyeS5hcHBlbmQoJCgnPGRpdj4nKS5hZGRDbGFzcyhoYXNJbWFnZSA/ICdjb2wtNW9mNicgOiAnY29sLTZvZjYnKQotICAgICAgZW50cnkuYXBwZW5kKCQoJzxkaXY+JykKLSAgICAgICAgLmFwcGVuZCgkKCc8cD4nKS5hZGRDbGFzcygnZGFjLWN1c3RvbS1zZWFyY2gtc2VjdGlvbicpLnRleHQoc2VjdGlvbikpCi0gICAgICAgIC5hcHBlbmQoCi0gICAgICAgICAgJCgnPGE+JykudGV4dChpdGVtLnRpdGxlKS5hdHRyKCdocmVmJywgaXRlbS5saW5rKS53cmFwKCc8aDI+JykucGFyZW50KCkuYWRkQ2xhc3MoJ2RhYy1jdXN0b20tc2VhcmNoLXRpdGxlJykKLSAgICAgICAgKQotICAgICAgICAuYXBwZW5kKCQoJzxwPicpLmFkZENsYXNzKCdkYWMtY3VzdG9tLXNlYXJjaC1zbmlwcGV0JykuaHRtbChpdGVtLmh0bWxTbmlwcGV0LnJlcGxhY2UoLzxicj4vZywgJycpKSkKLSAgICAgICAgLmFwcGVuZCgkKCc8YT4nKS5hZGRDbGFzcygnZGFjLWN1c3RvbS1zZWFyY2gtbGluaycpLnRleHQoaXRlbS5mb3JtYXR0ZWRVcmwpLmF0dHIoJ2hyZWYnLCBpdGVtLmxpbmspKSk7Ci0KLSAgICAgIGVsLmFwcGVuZChlbnRyeSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdHMucXVlcmllcy5uZXh0UGFnZSkgewotICAgICAgdmFyIGxvYWRNb3JlQnV0dG9uID0gJCgnPGJ1dHRvbiBpZD0iZGFjLWN1c3RvbS1zZWFyY2gtbG9hZC1tb3JlIj4nKQotICAgICAgICAuYWRkQ2xhc3MoJ2RhYy1jdXN0b20tc2VhcmNoLWxvYWQtbW9yZScpCi0gICAgICAgIC50ZXh0KCdMb2FkIG1vcmUnKQotICAgICAgICAuY2xpY2soZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgbG9hZE1vcmVSZXN1bHRzKGVsLCByZXN1bHRzKTsKLSAgICAgICAgfSk7Ci0KLSAgICAgIGVsLmFwcGVuZChsb2FkTW9yZUJ1dHRvbik7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gbG9hZE1vcmVSZXN1bHRzKGVsLCByZXN1bHRzKSB7Ci0gICAgdmFyIHF1ZXJ5ID0gcmVzdWx0cy5xdWVyaWVzLnJlcXVlc3Quc2VhcmNoVGVybXM7Ci0gICAgdmFyIHN0YXJ0ID0gcmVzdWx0cy5xdWVyaWVzLm5leHRQYWdlLnN0YXJ0SW5kZXg7Ci0gICAgdmFyIGxvYWRNb3JlQnV0dG9uID0gZWwuZmluZCgnI2RhYy1jdXN0b20tc2VhcmNoLWxvYWQtbW9yZScpOwotCi0gICAgbG9hZE1vcmVCdXR0b24udGV4dCgnTG9hZGluZyBtb3JlLi4uJyk7Ci0KLSAgICBjdXN0b21TZWFyY2gocXVlcnksIHN0YXJ0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdHMpIHsKLSAgICAgIGxvYWRNb3JlQnV0dG9uLnJlbW92ZSgpOwotICAgICAgcmVuZGVyUmVzdWx0cyhlbCwgcmVzdWx0cyk7Ci0gICAgfSk7Ci0gIH0KLQotICAkLmZuLmN1c3RvbVNlYXJjaCA9IGZ1bmN0aW9uKHF1ZXJ5KSB7Ci0gICAgdmFyIGVsID0gJCh0aGlzKTsKLQotICAgIGN1c3RvbVNlYXJjaChxdWVyeSkudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7Ci0gICAgICBlbC5lbXB0eSgpOwotICAgICAgcmVuZGVyUmVzdWx0cyhlbCwgcmVzdWx0cyk7Ci0gICAgfSk7Ci0gIH07Ci19KShqUXVlcnkpOwotCi0KLWZ1bmN0aW9uIGxvYWRTZWFyY2hSZXN1bHRzKCkgewotCi0gIC8vIERyYXcgdGhlIHNlYXJjaCByZXN1bHRzIGJveAotICAvL3NlYXJjaENvbnRyb2wuZHJhdyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGVmdFNlYXJjaENvbnRyb2wiKSwgZHJhd09wdGlvbnMpOwotICAkKHNlYXJjaFJlc3VsdHMpLmFwcGVuZCgnPGRpdiBjbGFzcz0ibGVmdFNlYXJjaENvbnRyb2wiPjwvZGl2PicpOwotCi0KLSAgLy8gUmVmcmVzaCB0aGUgdXJsIGFuZCBzZWFyY2ggdGl0bGUKLSAgdmFyIHF1ZXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaF9hdXRvY29tcGxldGUnKS52YWx1ZSB8fCBnZXRRdWVyeShsb2NhdGlvbi5oYXNoKTsKLSAgdXBkYXRlUmVzdWx0VGl0bGUocXVlcnkpOwotICBsb2NhdGlvbi5oYXNoID0gJ3E9JyArIHF1ZXJ5OwotCi0gIC8vIGdldCBxdWVyeSBhbmQgZXhlY3V0ZSB0aGUgc2VhcmNoCi0gIC8vc2VhcmNoQ29udHJvbC5leGVjdXRlKGRlY29kZVVSSShnZXRRdWVyeShsb2NhdGlvbi5oYXNoKSkpOwotICAkKGxlZnRTZWFyY2hDb250cm9sKS5jdXN0b21TZWFyY2goZ2V0UXVlcnkobG9jYXRpb24uaGFzaCkpOwotCi0gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWFyY2hfYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKLSAgYWRkVGFiTGlzdGVuZXJzKCk7Ci19Ci0vLyBFbmQgb2YgbG9hZFNlYXJjaFJlc3VsdHMKLQotZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7Ci0KLSAgdmFyIHF1ZXJ5ID0gZGVjb2RlVVJJKGdldFF1ZXJ5KGxvY2F0aW9uLmhhc2gpKTsKLSAgaWYgKGxvY2F0aW9uLmhhc2guaW5kZXhPZigicT0iKSA9PSAtMSB8fCBxdWVyeSA9PSAnJykgewotICAgIC8vIGlmIHRoZXJlJ3Mgbm8gcXVlcnkgaW4gdGhlIHVybCwgZG9uJ3Qgc2VhcmNoIGFuZCBtYWtlIHN1cmUgcmVzdWx0cyBhcmUgaGlkZGVuCi0gICAgJCgnI3NlYXJjaFJlc3VsdHMnKS5oaWRlKCk7Ci0gICAgcmV0dXJuOwotICB9IGVsc2UgewotICAgIC8vIGZpcnN0IHRpbWUgbG9hZGluZyBzZWFyY2ggcmVzdWx0cyBmb3IgdGhpcyBwYWdlCi0gICAgJCgnI3NlYXJjaFJlc3VsdHMnKS5zbGlkZURvd24oJ3Nsb3cnKTsKLSAgICAkKCIuc2VhcmNoIC5jbG9zZSIpLnJlbW92ZUNsYXNzKCJoaWRlIik7Ci0gICAgbG9hZFNlYXJjaFJlc3VsdHMoKTsKLSAgfQotfSwgdHJ1ZSk7Ci0KLS8vIHdoZW4gYW4gZXZlbnQgb24gdGhlIGJyb3dzZXIgaGlzdG9yeSBvY2N1cnMgKGJhY2ssIGZvcndhcmQsIGxvYWQpIHJlcXVlcnkgaGFzaCBhbmQgZG8gc2VhcmNoCi0kKHdpbmRvdykuaGFzaGNoYW5nZSggZnVuY3Rpb24oKXsKLSAgLy8gRXhpdCBpZiB0aGUgaGFzaCBpc24ndCBhIHNlYXJjaCBxdWVyeSBvciB0aGVyZSdzIGFuIGVycm9yIGluIHRoZSBxdWVyeQotICBpZiAoKGxvY2F0aW9uLmhhc2guaW5kZXhPZigicT0iKSA9PSAtMSkgfHwgKHF1ZXJ5ID09ICJ1bmRlZmluZWQiKSkgewotICAgIC8vIElmIHRoZSByZXN1bHRzIHBhbmUgaXMgb3BlbiwgY2xvc2UgaXQuCi0gICAgaWYgKCEkKCIjc2VhcmNoUmVzdWx0cyIpLmlzKCI6aGlkZGVuIikpIHsKLSAgICAgIGhpZGVSZXN1bHRzKCk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIE90aGVyd2lzZSwgd2UgaGF2ZSBhIHNlYXJjaCB0byBkbwotICB2YXIgcXVlcnkgPSBkZWNvZGVVUkkoZ2V0UXVlcnkobG9jYXRpb24uaGFzaCkpOwotICAvL3NlYXJjaENvbnRyb2wuZXhlY3V0ZShxdWVyeSk7Ci0gICQoJyNsZWZ0U2VhcmNoQ29udHJvbCcpLmN1c3RvbVNlYXJjaChxdWVyeSk7Ci0gICQoJyNzZWFyY2hSZXN1bHRzJykuc2xpZGVEb3duKCdzbG93Jyk7Ci0gICQoIiNzZWFyY2hfYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKLSAgJCgiLnNlYXJjaCAuY2xvc2UiKS5yZW1vdmVDbGFzcygiaGlkZSIpOwotCi0gIHVwZGF0ZVJlc3VsdFRpdGxlKHF1ZXJ5KTsKLX0pOwotCi1mdW5jdGlvbiB1cGRhdGVSZXN1bHRUaXRsZShxdWVyeSkgewotICAkKCIjc2VhcmNoVGl0bGUiKS5odG1sKCJSZXN1bHRzIGZvciA8ZW0+IiArIGVuY29kZVVSSUNvbXBvbmVudChxdWVyeSkgKyAiPC9lbT4iKTsKLX0KLQotLy8gZm9yY2VmdWxseSByZWdhaW4ga2V5LXVwIGV2ZW50IGNvbnRyb2wgKHByZXZpb3VzbHkgamFja2VkIGJ5IHNlYXJjaCBhcGkpCi0kKCIjc2VhcmNoX2F1dG9jb21wbGV0ZSIpLmtleXVwKGZ1bmN0aW9uKGV2ZW50KSB7Ci0gIHJldHVybiBzZWFyY2hfY2hhbmdlZChldmVudCwgZmFsc2UsIHRvUm9vdCk7Ci19KTsKLQotLy8gYWRkIGV2ZW50IGxpc3RlbmVycyB0byBlYWNoIHRhYiBzbyB3ZSBjYW4gdHJhY2sgdGhlIGJyb3dzZXIgaGlzdG9yeQotZnVuY3Rpb24gYWRkVGFiTGlzdGVuZXJzKCkgewotICB2YXIgdGFiSGVhZGVycyA9ICQoIi5nc2MtdGFiSGVhZGVyIik7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdGFiSGVhZGVycy5sZW5ndGg7IGkrKykgewotICAgICQodGFiSGVhZGVyc1tpXSkuYXR0cigiaWQiLGkpLmNsaWNrKGZ1bmN0aW9uKCkgewotICAgIC8qCi0gICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgcGFnZSBudW1iZXJzIGZvciB0aGUgc2VhcmNoIGxlZnQgcGFuZQotICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICAgLy8gcmVtb3ZlIGFueSByZXNpZHVhbCBwYWdlIG51bWJlcnMKLSAgICAgICAgJCgnI3NlYXJjaFJlc3VsdHMgLmdzYy10YWJzQXJlYSAuZ3NjLWN1cnNvci1ib3guZ3MtYmlkaS1zdGFydC1hbGlnbicpLnJlbW92ZSgpOwotICAgICAgICAvLyBtb3ZlIHRoZSBwYWdlIG51bWJlcnMgdG8gdGhlIGxlZnQgcG9zaXRpb247IG1ha2UgYSBjbG9uZSwKLSAgICAgICAgLy8gYmVjYXVzZSB0aGUgZWxlbWVudCBpcyBkcmF3biB0byB0aGUgRE9NIG9ubHkgb25jZQotICAgICAgICAvLyBhbmQgYmVjYXVzZSB3ZSdyZSBnb2luZyB0byByZW1vdmUgaXQgKHByZXZpb3VzIGxpbmUpLAotICAgICAgICAvLyB3ZSBuZWVkIGl0IHRvIGJlIGF2YWlsYWJsZSB0byBtb3ZlIGFnYWluIGFzIHRoZSB1c2VyIG5hdmlnYXRlcwotICAgICAgICAkKCcjc2VhcmNoUmVzdWx0cyAuZ3NjLXdlYlJlc3VsdCAuZ3NjLWN1cnNvci1ib3guZ3MtYmlkaS1zdGFydC1hbGlnbjp2aXNpYmxlJykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9uZSgpLmFwcGVuZFRvKCcjc2VhcmNoUmVzdWx0cyAuZ3NjLXRhYnNBcmVhJyk7Ci0gICAgICAgIH0sIDIwMCk7Ci0gICAgICAqLwotICAgIH0pOwotICB9Ci0gIHNldFRpbWVvdXQoZnVuY3Rpb24oKXskKHRhYkhlYWRlcnNbMF0pLmNsaWNrKCl9LDIwMCk7Ci19Ci0KLQotZnVuY3Rpb24gZ2V0UXVlcnkoaGFzaCkgewotICB2YXIgcXVlcnlQYXJ0cyA9IGhhc2guc3BsaXQoJz0nKTsKLSAgcmV0dXJuIHF1ZXJ5UGFydHNbMV07Ci19Ci0KLQotLyogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgKi8KLS8qICMjIyMjIyMjIyMjIyMjIyMjICBKQVZBRE9DIFJFRkVSRU5DRSAjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0vKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwotCi0vKiBJbml0aWFsaXplIHNvbWUgZHJvaWRkb2Mgc3R1ZmYsIGJ1dCBvbmx5IGlmIHdlJ3JlIGluIHRoZSByZWZlcmVuY2UgKi8KLWlmIChsb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCIvcmVmZXJlbmNlIikpIHsKLSAgaWYoIWxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoIi9yZWZlcmVuY2UtZ21zL3BhY2thZ2VzLmh0bWwiKQotICAgICYmICFsb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCIvcmVmZXJlbmNlLWdjbS9wYWNrYWdlcy5odG1sIikKLSAgICAmJiAhbG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZigiL3JlZmVyZW5jZS9jb20vZ29vZ2xlIikgPT0gMCkgewotICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgLy8gaW5pdCBhdmFpbGFibGUgYXBpcyBiYXNlZCBvbiB1c2VyIHByZWYKLSAgICAgIGNoYW5nZUFwaUxldmVsKCk7Ci0gICAgICBpbml0U2lkZW5hdkhlaWdodFJlc2l6ZSgpCi0gICAgICB9KTsKLSAgfQotfQotCi12YXIgQVBJX0xFVkVMX0NPT0tJRSA9ICJhcGlfbGV2ZWwiOwotdmFyIG1pbkxldmVsID0gMTsKLXZhciBtYXhMZXZlbCA9IDE7Ci0KLS8qKioqKioqIFNJREVOQVYgRElNRU5TSU9OUyAqKioqKioqKioqKiovCi0KLSAgZnVuY3Rpb24gaW5pdFNpZGVuYXZIZWlnaHRSZXNpemUoKSB7Ci0gICAgLy8gQ2hhbmdlIHRoZSBkcmFnIGJhciBzaXplIHRvIG5pY2VseSBmaXQgdGhlIHNjcm9sbGJhciBwb3NpdGlvbnMKLSAgICB2YXIgJGRyYWdCYXIgPSAkKCIudWktcmVzaXphYmxlLXMiKTsKLSAgICAkZHJhZ0Jhci5jc3Moeyd3aWR0aCc6ICRkcmFnQmFyLnBhcmVudCgpLndpZHRoKCkgLSA1ICsgInB4In0pOwotCi0gICAgJCggIiNyZXNpemUtcGFja2FnZXMtbmF2IiApLnJlc2l6YWJsZSh7Ci0gICAgICBjb250YWlubWVudDogIiNuYXYtcGFuZWxzIiwKLSAgICAgIGhhbmRsZXM6ICJzIiwKLSAgICAgIGFsc29SZXNpemU6ICIjcGFja2FnZXMtbmF2IiwKLSAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7IHJlc2l6ZU5hdigpOyB9LCAvKiByZXNpemUgdGhlIG5hdiB3aGlsZSBkcmFnZ2luZyAqLwotICAgICAgc3RvcDogZnVuY3Rpb24oZXZlbnQsIHVpKSB7IHNhdmVOYXZQYW5lbHMoKTsgfSAvKiBvbmNlIHN0b3BwZWQsIHNhdmUgdGhlIHNpemVzIHRvIGNvb2tpZSAgKi8KLSAgICAgIH0pOwotCi0gIH0KLQotZnVuY3Rpb24gdXBkYXRlU2lkZW5hdkZpeGVkV2lkdGgoKSB7Ci0gIGlmICghbmF2QmFySXNGaXhlZCkgcmV0dXJuOwotICAkKCcjZGV2ZG9jLW5hdicpLmNzcyh7Ci0gICAgJ3dpZHRoJyA6ICQoJyNzaWRlLW5hdicpLmNzcygnd2lkdGgnKSwKLSAgICAnbWFyZ2luJyA6ICQoJyNzaWRlLW5hdicpLmNzcygnbWFyZ2luJykKLSAgfSk7Ci0gICQoJyNkZXZkb2MtbmF2IGEudG90b3AnKS5jc3MoeydkaXNwbGF5JzonYmxvY2snLCd3aWR0aCc6JCgiI25hdiIpLmlubmVyV2lkdGgoKSsncHgnfSk7Ci0KLSAgaW5pdFNpZGVuYXZIZWlnaHRSZXNpemUoKTsKLX0KLQotZnVuY3Rpb24gdXBkYXRlU2lkZW5hdkZ1bGxzY3JlZW5XaWR0aCgpIHsKLSAgaWYgKCFuYXZCYXJJc0ZpeGVkKSByZXR1cm47Ci0gICQoJyNkZXZkb2MtbmF2JykuY3NzKHsKLSAgICAnd2lkdGgnIDogJCgnI3NpZGUtbmF2JykuY3NzKCd3aWR0aCcpLAotICAgICdtYXJnaW4nIDogJCgnI3NpZGUtbmF2JykuY3NzKCdtYXJnaW4nKQotICB9KTsKLSAgJCgnI2RldmRvYy1uYXYgLnRvdG9wJykuY3NzKHsnbGVmdCc6ICdpbmhlcml0J30pOwotCi0gIGluaXRTaWRlbmF2SGVpZ2h0UmVzaXplKCk7Ci19Ci0KLWZ1bmN0aW9uIGJ1aWxkQXBpTGV2ZWxTZWxlY3RvcigpIHsKLSAgbWF4TGV2ZWwgPSBTSU5DRV9EQVRBLmxlbmd0aDsKLSAgdmFyIHVzZXJBcGlMZXZlbCA9IHBhcnNlSW50KHJlYWRDb29raWUoQVBJX0xFVkVMX0NPT0tJRSkpOwotICB1c2VyQXBpTGV2ZWwgPSB1c2VyQXBpTGV2ZWwgPT0gMCA/IG1heExldmVsIDogdXNlckFwaUxldmVsOyAvLyBJZiB0aGVyZSdzIG5vIGNvb2tpZSAoemVybyksIHVzZSB0aGUgbWF4IGJ5IGRlZmF1bHQKLQotICBtaW5MZXZlbCA9IHBhcnNlSW50KCQoIiNkb2MtYXBpLWxldmVsIikuYXR0cigiY2xhc3MiKSk7Ci0gIC8vIEhhbmRsZSBwcm92aXNpb25hbCBhcGkgbGV2ZWxzOyB0aGUgcHJvdmlzaW9uYWwgbGV2ZWwgd2lsbCBhbHdheXMgYmUgdGhlIGhpZ2hlc3QgcG9zc2libGUgbGV2ZWwKLSAgLy8gUHJvdmlzaW9uYWwgYXBpIGxldmVscyB3aWxsIGFsc28gaGF2ZSBhIGxlbmd0aDsgb3RoZXIgc3R1ZmYgdGhhdCdzIGp1c3QgbWlzc2luZyBhIGxldmVsIHdvbid0LAotICAvLyBzbyBsZWF2ZSB0aG9zZSBraW5kcyBvZiBlbnRpdGllcyBhdCB0aGUgZGVmYXVsdCBsZXZlbCBvZiAxIChmb3IgZXhhbXBsZSwgdGhlIFIuc3R5bGVhYmxlIGNsYXNzKQotICBpZiAoaXNOYU4obWluTGV2ZWwpICYmIG1pbkxldmVsLmxlbmd0aCkgewotICAgIG1pbkxldmVsID0gbWF4TGV2ZWw7Ci0gIH0KLSAgdmFyIHNlbGVjdCA9ICQoIiNhcGlMZXZlbFNlbGVjdG9yIikuaHRtbCgiIikuY2hhbmdlKGNoYW5nZUFwaUxldmVsKTsKLSAgZm9yICh2YXIgaSA9IG1heExldmVsLTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgdmFyIG9wdGlvbiA9ICQoIjxvcHRpb24gLz4iKS5hdHRyKCJ2YWx1ZSIsIiIrU0lOQ0VfREFUQVtpXSkuYXBwZW5kKCIiK1NJTkNFX0RBVEFbaV0pOwotICAvLyAgaWYgKFNJTkNFX0RBVEFbaV0gPCBtaW5MZXZlbCkgb3B0aW9uLmFkZENsYXNzKCJhYnNlbnQiKTsgLy8gYWx3YXlzIGZhbHNlIGZvciBzdHJpbmdzIChjb2RlbmFtZXMpCi0gICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwotICB9Ci0KLSAgLy8gZ2V0IHRoZSBET00gZWxlbWVudCBhbmQgdXNlIHNldEF0dHJpYnV0ZSBjdXogSUU2IGZhaWxzIHdoZW4gdXNpbmcganF1ZXJ5IC5hdHRyKCdzZWxlY3RlZCcsdHJ1ZSkKLSAgdmFyIHNlbGVjdGVkTGV2ZWxJdGVtID0gJCgiI2FwaUxldmVsU2VsZWN0b3Igb3B0aW9uW3ZhbHVlPSciK3VzZXJBcGlMZXZlbCsiJ10iKS5nZXQoMCk7Ci0vLyAgQW5vdGhlciBwaWVjZSBvZiBmdW5jdGlvbmFsaXR5IHRoYXQgd2UgZG9uJ3QgdXNlIHRoYXQgcHJvZHVjZXMgYW4gZXJyb3IuCi0vLyAgVE9ETyBmaWd1cmUgaXQgYWxsIG91dC4KLS8vICBzZWxlY3RlZExldmVsSXRlbS5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJyx0cnVlKTsKLX0KLQotZnVuY3Rpb24gY2hhbmdlQXBpTGV2ZWwoKSB7Ci0gIG1heExldmVsID0gU0lOQ0VfREFUQS5sZW5ndGg7Ci0gIHZhciBzZWxlY3RlZExldmVsID0gbWF4TGV2ZWw7Ci0KLSAgc2VsZWN0ZWRMZXZlbCA9IHBhcnNlSW50KCQoIiNhcGlMZXZlbFNlbGVjdG9yIG9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpKTsKLSAgdG9nZ2xlVmlzaXNibGVBcGlzKHNlbGVjdGVkTGV2ZWwsICJib2R5Iik7Ci0KLSAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwotICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkrKDEwKjM2NSoyNCo2MCo2MCoxMDAwKSk7IC8vIGtlZXAgdGhpcyBmb3IgMTAgeWVhcnMKLSAgdmFyIGV4cGlyYXRpb24gPSBkYXRlLnRvR01UU3RyaW5nKCk7Ci0gIHdyaXRlQ29va2llKEFQSV9MRVZFTF9DT09LSUUsIHNlbGVjdGVkTGV2ZWwsIG51bGwsIGV4cGlyYXRpb24pOwotCi0gIGlmIChzZWxlY3RlZExldmVsIDwgbWluTGV2ZWwpIHsKLSAgICB2YXIgdGhpbmcgPSAoJCgiI2pkLWhlYWRlciIpLmh0bWwoKS5pbmRleE9mKCJwYWNrYWdlIikgIT0gLTEpID8gInBhY2thZ2UiIDogImNsYXNzIjsKLSAgICAkKCIjbmFNZXNzYWdlIikuc2hvdygpLmh0bWwoIjxkaXY+PHA+PHN0cm9uZz5UaGlzICIgKyB0aGluZwotICAgICAgICAgICAgICArICIgcmVxdWlyZXMgQVBJIGxldmVsICIgKyBtaW5MZXZlbCArICIgb3IgaGlnaGVyLjwvc3Ryb25nPjwvcD4iCi0gICAgICAgICAgICAgICsgIjxwPlRoaXMgZG9jdW1lbnQgaXMgaGlkZGVuIGJlY2F1c2UgeW91ciBzZWxlY3RlZCBBUEkgbGV2ZWwgZm9yIHRoZSBkb2N1bWVudGF0aW9uIGlzICIKLSAgICAgICAgICAgICAgKyBzZWxlY3RlZExldmVsICsgIi4gWW91IGNhbiBjaGFuZ2UgdGhlIGRvY3VtZW50YXRpb24gQVBJIGxldmVsIHdpdGggdGhlIHNlbGVjdG9yICIKLSAgICAgICAgICAgICAgKyAiYWJvdmUgdGhlIGxlZnQgbmF2aWdhdGlvbi48L3A+IgotICAgICAgICAgICAgICArICI8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzcGVjaWZ5aW5nIHRoZSBBUEkgbGV2ZWwgeW91ciBhcHAgcmVxdWlyZXMsICIKLSAgICAgICAgICAgICAgKyAicmVhZCA8YSBocmVmPSciICsgdG9Sb290ICsgInRyYWluaW5nL2Jhc2ljcy9zdXBwb3J0aW5nLWRldmljZXMvcGxhdGZvcm1zLmh0bWwnIgotICAgICAgICAgICAgICArICI+U3VwcG9ydGluZyBEaWZmZXJlbnQgUGxhdGZvcm0gVmVyc2lvbnM8L2E+LjwvcD4iCi0gICAgICAgICAgICAgICsgIjxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdPSywgbWFrZSB0aGlzIHBhZ2UgdmlzaWJsZScgIgotICAgICAgICAgICAgICArICJ0aXRsZT0nQ2hhbmdlIHRoZSBBUEkgbGV2ZWwgdG8gIiArIG1pbkxldmVsICsgIicgIgotICAgICAgICAgICAgICArICJvbmNsaWNrPSckKFwiI2FwaUxldmVsU2VsZWN0b3JcIikudmFsKFwiIiArIG1pbkxldmVsICsgIlwiKTtjaGFuZ2VBcGlMZXZlbCgpOycgLz4iCi0gICAgICAgICAgICAgICsgIjwvZGl2PiIpOwotICB9IGVsc2UgewotICAgICQoIiNuYU1lc3NhZ2UiKS5oaWRlKCk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gdG9nZ2xlVmlzaXNibGVBcGlzKHNlbGVjdGVkTGV2ZWwsIGNvbnRleHQpIHsKLSAgdmFyIGFwaXMgPSAkKCIuYXBpIixjb250ZXh0KTsKLSAgYXBpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKLSAgICB2YXIgb2JqID0gJCh0aGlzKTsKLSAgICB2YXIgY2xhc3NOYW1lID0gb2JqLmF0dHIoImNsYXNzIik7Ci0gICAgdmFyIGFwaUxldmVsSW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoIi0iKSsxOwotICAgIHZhciBhcGlMZXZlbEVuZEluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoIiAiLCBhcGlMZXZlbEluZGV4KTsKLSAgICBhcGlMZXZlbEVuZEluZGV4ID0gYXBpTGV2ZWxFbmRJbmRleCAhPSAtMSA/IGFwaUxldmVsRW5kSW5kZXggOiBjbGFzc05hbWUubGVuZ3RoOwotICAgIHZhciBhcGlMZXZlbCA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoYXBpTGV2ZWxJbmRleCwgYXBpTGV2ZWxFbmRJbmRleCk7Ci0gICAgaWYgKGFwaUxldmVsLmxlbmd0aCA9PSAwKSB7IC8vIGZvciBvZGQgY2FzZXMgd2hlbiB0aGUgc2luY2UgZGF0YSBpcyBhY3R1YWxseSBtaXNzaW5nLCBqdXN0IGJhaWwKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXBpTGV2ZWwgPSBwYXJzZUludChhcGlMZXZlbCk7Ci0KLSAgICAvLyBIYW5kbGUgcHJvdmlzaW9uYWwgYXBpIGxldmVsczsgaWYgdGhpcyBpdGVtJ3MgbGV2ZWwgaXMgdGhlIHByb3Zpc2lvbmFsIG9uZSwgc2V0IGl0IHRvIHRoZSBtYXgKLSAgICB2YXIgc2VsZWN0ZWRMZXZlbE51bSA9IHBhcnNlSW50KHNlbGVjdGVkTGV2ZWwpCi0gICAgdmFyIGFwaUxldmVsTnVtID0gcGFyc2VJbnQoYXBpTGV2ZWwpOwotICAgIGlmIChpc05hTihhcGlMZXZlbE51bSkpIHsKLSAgICAgICAgYXBpTGV2ZWxOdW0gPSBtYXhMZXZlbDsKLSAgICB9Ci0KLSAgICAvLyBHcmV5IHRoaW5ncyBvdXQgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIGFuZCBnaXZlIGEgdG9vbHRpcCB0aXRsZQotICAgIGlmIChhcGlMZXZlbE51bSA+IHNlbGVjdGVkTGV2ZWxOdW0pIHsKLSAgICAgIG9iai5hZGRDbGFzcygiYWJzZW50IikuYXR0cigidGl0bGUiLCJSZXF1aXJlcyBBUEkgTGV2ZWwgXCIiCi0gICAgICAgICAgICArIGFwaUxldmVsICsgIlwiIG9yIGhpZ2hlciIpOwotICAgIH0KLSAgICBlbHNlIG9iai5yZW1vdmVDbGFzcygiYWJzZW50IikucmVtb3ZlQXR0cigidGl0bGUiKTsKLSAgfSk7Ci19Ci0KLQotCi0KLS8qICMjIyMjIyMjIyMjIyMjIyMjICBTSURFTkFWIFRSRUUgVklFVyAjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0KLWZ1bmN0aW9uIG5ld19ub2RlKG1lLCBtb20sIHRleHQsIGxpbmssIGNoaWxkcmVuX2RhdGEsIGFwaV9sZXZlbCkKLXsKLSAgdmFyIG5vZGUgPSBuZXcgT2JqZWN0KCk7Ci0gIG5vZGUuY2hpbGRyZW4gPSBBcnJheSgpOwotICBub2RlLmNoaWxkcmVuX2RhdGEgPSBjaGlsZHJlbl9kYXRhOwotICBub2RlLmRlcHRoID0gbW9tLmRlcHRoICsgMTsKLQotICBub2RlLmxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTsKLSAgbW9tLmdldF9jaGlsZHJlbl91bCgpLmFwcGVuZENoaWxkKG5vZGUubGkpOwotCi0gIG5vZGUubGFiZWxfZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0gIG5vZGUubGFiZWxfZGl2LmNsYXNzTmFtZSA9ICJsYWJlbCI7Ci0gIGlmIChhcGlfbGV2ZWwgIT0gbnVsbCkgewotICAgICQobm9kZS5sYWJlbF9kaXYpLmFkZENsYXNzKCJhcGkiKTsKLSAgICAkKG5vZGUubGFiZWxfZGl2KS5hZGRDbGFzcygiYXBpLWxldmVsLSIrYXBpX2xldmVsKTsKLSAgfQotICBub2RlLmxpLmFwcGVuZENoaWxkKG5vZGUubGFiZWxfZGl2KTsKLQotICBpZiAoY2hpbGRyZW5fZGF0YSAhPSBudWxsKSB7Ci0gICAgbm9kZS5leHBhbmRfdG9nZ2xlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIG5vZGUuZXhwYW5kX3RvZ2dsZS5ocmVmID0gImphdmFzY3JpcHQ6dm9pZCgwKSI7Ci0gICAgbm9kZS5leHBhbmRfdG9nZ2xlLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKLSAgICAgICAgICBpZiAobm9kZS5leHBhbmRlZCkgewotICAgICAgICAgICAgJChub2RlLmdldF9jaGlsZHJlbl91bCgpKS5zbGlkZVVwKCJmYXN0Iik7Ci0gICAgICAgICAgICBub2RlLnBsdXNfaW1nLnNyYyA9IG1lLnRvcm9vdCArICJhc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC1zbWFsbC5wbmciOwotICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleHBhbmRfbm9kZShtZSwgbm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgIH07Ci0gICAgbm9kZS5sYWJlbF9kaXYuYXBwZW5kQ2hpbGQobm9kZS5leHBhbmRfdG9nZ2xlKTsKLQotICAgIG5vZGUucGx1c19pbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKLSAgICBub2RlLnBsdXNfaW1nLnNyYyA9IG1lLnRvcm9vdCArICJhc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC1zbWFsbC5wbmciOwotICAgIG5vZGUucGx1c19pbWcuY2xhc3NOYW1lID0gInBsdXMiOwotICAgIG5vZGUucGx1c19pbWcud2lkdGggPSAiOCI7Ci0gICAgbm9kZS5wbHVzX2ltZy5ib3JkZXIgPSAiMCI7Ci0gICAgbm9kZS5leHBhbmRfdG9nZ2xlLmFwcGVuZENoaWxkKG5vZGUucGx1c19pbWcpOwotCi0gICAgbm9kZS5leHBhbmRlZCA9IGZhbHNlOwotICB9Ci0KLSAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gIG5vZGUubGFiZWxfZGl2LmFwcGVuZENoaWxkKGEpOwotICBub2RlLmxhYmVsID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7Ci0gIGEuYXBwZW5kQ2hpbGQobm9kZS5sYWJlbCk7Ci0gIGlmIChsaW5rKSB7Ci0gICAgYS5ocmVmID0gbWUudG9yb290ICsgbGluazsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY2hpbGRyZW5fZGF0YSAhPSBudWxsKSB7Ci0gICAgICBhLmNsYXNzTmFtZSA9ICJub2xpbmsiOwotICAgICAgYS5ocmVmID0gImphdmFzY3JpcHQ6dm9pZCgwKSI7Ci0gICAgICBhLm9uY2xpY2sgPSBub2RlLmV4cGFuZF90b2dnbGUub25jbGljazsKLSAgICAgIC8vIFRoaXMgbmV4dCBsaW5lIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICBJJ2xsIGJ1eSBhIGJlZXIgZm9yIHRoZSBmaXJzdAotICAgICAgLy8gcGVyc29uIHdobyBmaWd1cmVzIG91dCBob3cgdG8gcmVtb3ZlIHRoaXMgbGluZSBhbmQgaGF2ZSB0aGUgbGluawotICAgICAgLy8gdG9nZ2xlIHNodXQgb24gdGhlIGZpcnN0IHRyeS4gLS1qb2VvQGFuZHJvaWQuY29tCi0gICAgICBub2RlLmV4cGFuZGVkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLQotICBub2RlLmNoaWxkcmVuX3VsID0gbnVsbDsKLSAgbm9kZS5nZXRfY2hpbGRyZW5fdWwgPSBmdW5jdGlvbigpIHsKLSAgICAgIGlmICghbm9kZS5jaGlsZHJlbl91bCkgewotICAgICAgICBub2RlLmNoaWxkcmVuX3VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidWwiKTsKLSAgICAgICAgbm9kZS5jaGlsZHJlbl91bC5jbGFzc05hbWUgPSAiY2hpbGRyZW5fdWwiOwotICAgICAgICBub2RlLmNoaWxkcmVuX3VsLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICAgIG5vZGUubGkuYXBwZW5kQ2hpbGQobm9kZS5jaGlsZHJlbl91bCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbl91bDsKLSAgICB9OwotCi0gIHJldHVybiBub2RlOwotfQotCi0KLQotCi1mdW5jdGlvbiBleHBhbmRfbm9kZShtZSwgbm9kZSkKLXsKLSAgaWYgKG5vZGUuY2hpbGRyZW5fZGF0YSAmJiAhbm9kZS5leHBhbmRlZCkgewotICAgIGlmIChub2RlLmNoaWxkcmVuX3Zpc2l0ZWQpIHsKLSAgICAgICQobm9kZS5nZXRfY2hpbGRyZW5fdWwoKSkuc2xpZGVEb3duKCJmYXN0Iik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdldF9ub2RlKG1lLCBub2RlKTsKLSAgICAgIGlmICgkKG5vZGUubGFiZWxfZGl2KS5oYXNDbGFzcygiYWJzZW50IikpIHsKLSAgICAgICAgJChub2RlLmdldF9jaGlsZHJlbl91bCgpKS5hZGRDbGFzcygiYWJzZW50Iik7Ci0gICAgICB9Ci0gICAgICAkKG5vZGUuZ2V0X2NoaWxkcmVuX3VsKCkpLnNsaWRlRG93bigiZmFzdCIpOwotICAgIH0KLSAgICBub2RlLnBsdXNfaW1nLnNyYyA9IG1lLnRvcm9vdCArICJhc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC1zbWFsbC5wbmciOwotICAgIG5vZGUuZXhwYW5kZWQgPSB0cnVlOwotCi0gICAgLy8gcGVyZm9ybSBhcGkgbGV2ZWwgdG9nZ2xpbmcgYmVjYXVzZSBuZXcgbm9kZXMgYXJlIG5ldyB0byB0aGUgRE9NCi0gICAgdmFyIHNlbGVjdGVkTGV2ZWwgPSAkKCIjYXBpTGV2ZWxTZWxlY3RvciBvcHRpb246c2VsZWN0ZWQiKS52YWwoKTsKLSAgICB0b2dnbGVWaXNpc2JsZUFwaXMoc2VsZWN0ZWRMZXZlbCwgIiNzaWRlLW5hdiIpOwotICB9Ci19Ci0KLWZ1bmN0aW9uIGdldF9ub2RlKG1lLCBtb20pCi17Ci0gIG1vbS5jaGlsZHJlbl92aXNpdGVkID0gdHJ1ZTsKLSAgZm9yICh2YXIgaSBpbiBtb20uY2hpbGRyZW5fZGF0YSkgewotICAgIHZhciBub2RlX2RhdGEgPSBtb20uY2hpbGRyZW5fZGF0YVtpXTsKLSAgICBtb20uY2hpbGRyZW5baV0gPSBuZXdfbm9kZShtZSwgbW9tLCBub2RlX2RhdGFbMF0sIG5vZGVfZGF0YVsxXSwKLSAgICAgICAgbm9kZV9kYXRhWzJdLCBub2RlX2RhdGFbM10pOwotICB9Ci19Ci0KLWZ1bmN0aW9uIHRoaXNfcGFnZV9yZWxhdGl2ZSh0b3Jvb3QpCi17Ci0gIHZhciBmdWxsID0gZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWU7Ci0gIHZhciBmaWxlID0gIiI7Ci0gIGlmICh0b3Jvb3Quc3Vic3RyKDAsIDEpID09ICIvIikgewotICAgIGlmIChmdWxsLnN1YnN0cigwLCB0b3Jvb3QubGVuZ3RoKSA9PSB0b3Jvb3QpIHsKLSAgICAgIHJldHVybiBmdWxsLnN1YnN0cih0b3Jvb3QubGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gdGhlIGZpbGUgaXNuJ3QgdW5kZXIgdG9yb290LiAgRmFpbC4KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAodG9yb290ICE9ICIuLyIpIHsKLSAgICAgIHRvcm9vdCA9ICIuLyIgKyB0b3Jvb3Q7Ci0gICAgfQotICAgIGRvIHsKLSAgICAgIGlmICh0b3Jvb3Quc3Vic3RyKHRvcm9vdC5sZW5ndGgtMywgMykgPT0gIi4uLyIgfHwgdG9yb290ID09ICIuLyIpIHsKLSAgICAgICAgdmFyIHBvcyA9IGZ1bGwubGFzdEluZGV4T2YoIi8iKTsKLSAgICAgICAgZmlsZSA9IGZ1bGwuc3Vic3RyKHBvcykgKyBmaWxlOwotICAgICAgICBmdWxsID0gZnVsbC5zdWJzdHIoMCwgcG9zKTsKLSAgICAgICAgdG9yb290ID0gdG9yb290LnN1YnN0cigwLCB0b3Jvb3QubGVuZ3RoLTMpOwotICAgICAgfQotICAgIH0gd2hpbGUgKHRvcm9vdCAhPSAiIiAmJiB0b3Jvb3QgIT0gIi8iKTsKLSAgICByZXR1cm4gZmlsZS5zdWJzdHIoMSk7Ci0gIH0KLX0KLQotZnVuY3Rpb24gZmluZF9wYWdlKHVybCwgZGF0YSkKLXsKLSAgdmFyIG5vZGVzID0gZGF0YTsKLSAgdmFyIHJlc3VsdCA9IG51bGw7Ci0gIGZvciAodmFyIGkgaW4gbm9kZXMpIHsKLSAgICB2YXIgZCA9IG5vZGVzW2ldOwotICAgIGlmIChkWzFdID09IHVybCkgewotICAgICAgcmV0dXJuIG5ldyBBcnJheShpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZFsyXSAhPSBudWxsKSB7Ci0gICAgICByZXN1bHQgPSBmaW5kX3BhZ2UodXJsLCBkWzJdKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gKG5ldyBBcnJheShpKS5jb25jYXQocmVzdWx0KSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBudWxsOwotfQotCi1mdW5jdGlvbiBpbml0X2RlZmF1bHRfbmF2dHJlZSh0b3Jvb3QpIHsKLSAgaW5pdF9uYXZ0cmVlKCJ0cmVlLWxpc3QiLCB0b3Jvb3QsIE5BVlRSRUVfREFUQSk7Ci0KLSAgLy8gcGVyZm9ybSBhcGkgbGV2ZWwgdG9nZ2xpbmcgYmVjYXVzZSBiZWNhdXNlIHRoZSB3aG9sZSB0cmVlIGlzIG5ldyB0byB0aGUgRE9NCi0gIHZhciBzZWxlY3RlZExldmVsID0gJCgiI2FwaUxldmVsU2VsZWN0b3Igb3B0aW9uOnNlbGVjdGVkIikudmFsKCk7Ci0gIHRvZ2dsZVZpc2lzYmxlQXBpcyhzZWxlY3RlZExldmVsLCAiI3NpZGUtbmF2Iik7Ci19Ci0KLWZ1bmN0aW9uIGluaXRfbmF2dHJlZShuYXZ0cmVlX2lkLCB0b3Jvb3QsIHJvb3Rfbm9kZXMpCi17Ci0gIHZhciBtZSA9IG5ldyBPYmplY3QoKTsKLSAgbWUudG9yb290ID0gdG9yb290OwotICBtZS5ub2RlID0gbmV3IE9iamVjdCgpOwotCi0gIG1lLm5vZGUubGkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuYXZ0cmVlX2lkKTsKLSAgbWUubm9kZS5jaGlsZHJlbl9kYXRhID0gcm9vdF9ub2RlczsKLSAgbWUubm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheSgpOwotICBtZS5ub2RlLmNoaWxkcmVuX3VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidWwiKTsKLSAgbWUubm9kZS5nZXRfY2hpbGRyZW5fdWwgPSBmdW5jdGlvbigpIHsgcmV0dXJuIG1lLm5vZGUuY2hpbGRyZW5fdWw7IH07Ci0gIC8vbWUubm9kZS5jaGlsZHJlbl91bC5jbGFzc05hbWUgPSAiY2hpbGRyZW5fdWwiOwotICBtZS5ub2RlLmxpLmFwcGVuZENoaWxkKG1lLm5vZGUuY2hpbGRyZW5fdWwpOwotICBtZS5ub2RlLmRlcHRoID0gMDsKLQotICBnZXRfbm9kZShtZSwgbWUubm9kZSk7Ci0KLSAgbWUudGhpc19wYWdlID0gdGhpc19wYWdlX3JlbGF0aXZlKHRvcm9vdCk7Ci0gIG1lLmJyZWFkY3J1bWJzID0gZmluZF9wYWdlKG1lLnRoaXNfcGFnZSwgcm9vdF9ub2Rlcyk7Ci0gIGlmIChtZS5icmVhZGNydW1icyAhPSBudWxsICYmIG1lLmJyZWFkY3J1bWJzLmxlbmd0aCAhPSAwKSB7Ci0gICAgdmFyIG1vbSA9IG1lLm5vZGU7Ci0gICAgZm9yICh2YXIgaSBpbiBtZS5icmVhZGNydW1icykgewotICAgICAgdmFyIGogPSBtZS5icmVhZGNydW1ic1tpXTsKLSAgICAgIG1vbSA9IG1vbS5jaGlsZHJlbltqXTsKLSAgICAgIGV4cGFuZF9ub2RlKG1lLCBtb20pOwotICAgIH0KLSAgICBtb20ubGFiZWxfZGl2LmNsYXNzTmFtZSA9IG1vbS5sYWJlbF9kaXYuY2xhc3NOYW1lICsgIiBzZWxlY3RlZCI7Ci0gICAgYWRkTG9hZEV2ZW50KGZ1bmN0aW9uKCkgewotICAgICAgc2Nyb2xsSW50b1ZpZXcoIm5hdi10cmVlIik7Ci0gICAgICB9KTsKLSAgfQotfQotCi0vKiBUT0RPOiBlbGltaW5hdGUgcmVkdW5kYW5jeSB3aXRoIG5vbi1nb29nbGUgZnVuY3Rpb25zICovCi1mdW5jdGlvbiBpbml0X2dvb2dsZV9uYXZ0cmVlKG5hdnRyZWVfaWQsIHRvcm9vdCwgcm9vdF9ub2RlcykKLXsKLSAgdmFyIG1lID0gbmV3IE9iamVjdCgpOwotICBtZS50b3Jvb3QgPSB0b3Jvb3Q7Ci0gIG1lLm5vZGUgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgbWUubm9kZS5saSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5hdnRyZWVfaWQpOwotICBtZS5ub2RlLmNoaWxkcmVuX2RhdGEgPSByb290X25vZGVzOwotICBtZS5ub2RlLmNoaWxkcmVuID0gbmV3IEFycmF5KCk7Ci0gIG1lLm5vZGUuY2hpbGRyZW5fdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpOwotICBtZS5ub2RlLmdldF9jaGlsZHJlbl91bCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbWUubm9kZS5jaGlsZHJlbl91bDsgfTsKLSAgLy9tZS5ub2RlLmNoaWxkcmVuX3VsLmNsYXNzTmFtZSA9ICJjaGlsZHJlbl91bCI7Ci0gIG1lLm5vZGUubGkuYXBwZW5kQ2hpbGQobWUubm9kZS5jaGlsZHJlbl91bCk7Ci0gIG1lLm5vZGUuZGVwdGggPSAwOwotCi0gIGdldF9nb29nbGVfbm9kZShtZSwgbWUubm9kZSk7Ci0KLX0KLQotZnVuY3Rpb24gbmV3X2dvb2dsZV9ub2RlKG1lLCBtb20sIHRleHQsIGxpbmssIGNoaWxkcmVuX2RhdGEsIGFwaV9sZXZlbCkKLXsKLSAgdmFyIG5vZGUgPSBuZXcgT2JqZWN0KCk7Ci0gIHZhciBjaGlsZDsKLSAgbm9kZS5jaGlsZHJlbiA9IEFycmF5KCk7Ci0gIG5vZGUuY2hpbGRyZW5fZGF0YSA9IGNoaWxkcmVuX2RhdGE7Ci0gIG5vZGUuZGVwdGggPSBtb20uZGVwdGggKyAxOwotICBub2RlLmdldF9jaGlsZHJlbl91bCA9IGZ1bmN0aW9uKCkgewotICAgICAgaWYgKCFub2RlLmNoaWxkcmVuX3VsKSB7Ci0gICAgICAgIG5vZGUuY2hpbGRyZW5fdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpOwotICAgICAgICBub2RlLmNoaWxkcmVuX3VsLmNsYXNzTmFtZSA9ICJ0cmVlLWxpc3QtY2hpbGRyZW4iOwotICAgICAgICBub2RlLmxpLmFwcGVuZENoaWxkKG5vZGUuY2hpbGRyZW5fdWwpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW5fdWw7Ci0gICAgfTsKLSAgbm9kZS5saSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIik7Ci0KLSAgbW9tLmdldF9jaGlsZHJlbl91bCgpLmFwcGVuZENoaWxkKG5vZGUubGkpOwotCi0KLSAgaWYobGluaykgewotICAgIGNoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotCi0gIH0KLSAgZWxzZSB7Ci0gICAgY2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Ci0gICAgY2hpbGQuY2xhc3NOYW1lID0gInRyZWUtbGlzdC1zdWJ0aXRsZSI7Ci0KLSAgfQotICBpZiAoY2hpbGRyZW5fZGF0YSAhPSBudWxsKSB7Ci0gICAgbm9kZS5saS5jbGFzc05hbWU9Im5hdi1zZWN0aW9uIjsKLSAgICBub2RlLmxhYmVsX2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICAgIG5vZGUubGFiZWxfZGl2LmNsYXNzTmFtZSA9ICJuYXYtc2VjdGlvbi1oZWFkZXItcmVmIjsKLSAgICBub2RlLmxpLmFwcGVuZENoaWxkKG5vZGUubGFiZWxfZGl2KTsKLSAgICBnZXRfZ29vZ2xlX25vZGUobWUsIG5vZGUpOwotICAgIG5vZGUubGFiZWxfZGl2LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgfQotICBlbHNlIHsKLSAgICBub2RlLmxpLmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgfQotICBpZihsaW5rKSB7Ci0gICAgY2hpbGQuaHJlZiA9IG1lLnRvcm9vdCArIGxpbms7Ci0gIH0KLSAgbm9kZS5sYWJlbCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpOwotICBjaGlsZC5hcHBlbmRDaGlsZChub2RlLmxhYmVsKTsKLQotICBub2RlLmNoaWxkcmVuX3VsID0gbnVsbDsKLQotICByZXR1cm4gbm9kZTsKLX0KLQotZnVuY3Rpb24gZ2V0X2dvb2dsZV9ub2RlKG1lLCBtb20pCi17Ci0gIG1vbS5jaGlsZHJlbl92aXNpdGVkID0gdHJ1ZTsKLSAgdmFyIGxpbmtUZXh0OwotICBmb3IgKHZhciBpIGluIG1vbS5jaGlsZHJlbl9kYXRhKSB7Ci0gICAgdmFyIG5vZGVfZGF0YSA9IG1vbS5jaGlsZHJlbl9kYXRhW2ldOwotICAgIGxpbmtUZXh0ID0gbm9kZV9kYXRhWzBdOwotCi0gICAgaWYobGlua1RleHQubWF0Y2goIl4iKyJjb20uZ29vZ2xlLmFuZHJvaWQiKT09ImNvbS5nb29nbGUuYW5kcm9pZCIpewotICAgICAgbGlua1RleHQgPSBsaW5rVGV4dC5zdWJzdHIoMTksIGxpbmtUZXh0Lmxlbmd0aCk7Ci0gICAgfQotICAgIGVsc2UgaWYobGlua1RleHQubWF0Y2goIl4iKyJjb20uYW5kcm9pZCIpPT0iY29tLmFuZHJvaWQiKXsKLSAgICAgIGxpbmtUZXh0ID0gbGlua1RleHQuc3Vic3RyKDEyLCBsaW5rVGV4dC5sZW5ndGgpOwotICAgIH0KLSAgICAgIG1vbS5jaGlsZHJlbltpXSA9IG5ld19nb29nbGVfbm9kZShtZSwgbW9tLCBsaW5rVGV4dCwgbm9kZV9kYXRhWzFdLAotICAgICAgICAgIG5vZGVfZGF0YVsyXSwgbm9kZV9kYXRhWzNdKTsKLSAgfQotfQotZnVuY3Rpb24gc2hvd0dvb2dsZVJlZlRyZWUoKSB7Ci0gIGluaXRfZGVmYXVsdF9nb29nbGVfbmF2dHJlZSh0b1Jvb3QpOwotICBpbml0X2RlZmF1bHRfZ2NtX25hdnRyZWUodG9Sb290KTsKLSAgcmVzaXplTmF2KCk7Ci19Ci0KLQotZnVuY3Rpb24gc2hvd1RyYWRlZmVkUmVmVHJlZSgpIHsKLSAgaW5pdF9kZWZhdWx0X3RyYWRlZmVkX25hdnRyZWUodG9Sb290KTsKLSAgcmVzaXplTmF2KCk7Ci19Ci0KLWZ1bmN0aW9uIGluaXRfZGVmYXVsdF9nb29nbGVfbmF2dHJlZSh0b3Jvb3QpIHsKLSAgaW5pdF9nb29nbGVfbmF2dHJlZSgiZ21zLXRyZWUtbGlzdCIsIHRvcm9vdCwgR01TX05BVlRSRUVfREFUQSk7Ci19Ci0KLWZ1bmN0aW9uIGluaXRfZGVmYXVsdF9nY21fbmF2dHJlZSh0b3Jvb3QpIHsKLSAgaW5pdF9nb29nbGVfbmF2dHJlZSgiZ2NtLXRyZWUtbGlzdCIsIHRvcm9vdCwgR0NNX05BVlRSRUVfREFUQSk7Ci19Ci0KLWZ1bmN0aW9uIGluaXRfZGVmYXVsdF90cmFkZWZlZF9uYXZ0cmVlKHRvcm9vdCkgewotICBpbml0X2dvb2dsZV9uYXZ0cmVlKCJ0cmFkZWZlZC10cmVlLWxpc3QiLCB0b3Jvb3QsIE5BVlRSRUVfREFUQSk7Ci19Ci0KLS8qIFRPR0dMRSBJTkhFUklURUQgTUVNQkVSUyAqLwotCi0vKiBUb2dnbGUgYW4gaW5oZXJpdGVkIGNsYXNzIChhcnJvdyB0b2dnbGUpCi0gKiBAcGFyYW0gbGlua09iaiAgVGhlIGxpbmsgdGhhdCB3YXMgY2xpY2tlZC4KLSAqIEBwYXJhbSBleHBhbmQgICd0cnVlJyB0byBlbnN1cmUgaXQncyBleHBhbmRlZC4gJ2ZhbHNlJyB0byBlbnN1cmUgaXQncyBjbG9zZWQuCi0gKiAgICAgICAgICAgICAgICAnbnVsbCcgdG8gc2ltcGx5IHRvZ2dsZS4KLSAqLwotZnVuY3Rpb24gdG9nZ2xlSW5oZXJpdGVkKGxpbmtPYmosIGV4cGFuZCkgewotICAgIHZhciBiYXNlID0gbGlua09iai5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgdmFyIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYXNlICsgIi1saXN0Iik7Ci0gICAgdmFyIHN1bW1hcnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYXNlICsgIi1zdW1tYXJ5Iik7Ci0gICAgdmFyIHRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiYXNlICsgIi10cmlnZ2VyIik7Ci0gICAgdmFyIGEgPSAkKGxpbmtPYmopOwotICAgIGlmICggKGV4cGFuZCA9PSBudWxsICYmIGEuaGFzQ2xhc3MoImNsb3NlZCIpKSB8fCBleHBhbmQgKSB7Ci0gICAgICAgIGxpc3Quc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgICAgc3VtbWFyeS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKLSAgICAgICAgdHJpZ2dlci5zcmMgPSB0b1Jvb3QgKyAiYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIjsKLSAgICAgICAgYS5yZW1vdmVDbGFzcygiY2xvc2VkIik7Ci0gICAgICAgIGEuYWRkQ2xhc3MoIm9wZW5lZCIpOwotICAgIH0gZWxzZSBpZiAoIChleHBhbmQgPT0gbnVsbCAmJiBhLmhhc0NsYXNzKCJvcGVuZWQiKSkgfHwgKGV4cGFuZCA9PSBmYWxzZSkgKSB7Ci0gICAgICAgIGxpc3Quc3R5bGUuZGlzcGxheSA9ICJibG9jayI7Ci0gICAgICAgIHN1bW1hcnkuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgICAgdHJpZ2dlci5zcmMgPSB0b1Jvb3QgKyAiYXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIjsKLSAgICAgICAgYS5yZW1vdmVDbGFzcygib3BlbmVkIik7Ci0gICAgICAgIGEuYWRkQ2xhc3MoImNsb3NlZCIpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRvZ2dsZSBhbGwgaW5oZXJpdGVkIGNsYXNzZXMgaW4gYSBzaW5nbGUgdGFibGUgKGUuZy4gYWxsIGluaGVyaXRlZCBtZXRob2RzKQotICogQHBhcmFtIGxpbmtPYmogIFRoZSBsaW5rIHRoYXQgd2FzIGNsaWNrZWQuCi0gKiBAcGFyYW0gZXhwYW5kICAndHJ1ZScgdG8gZW5zdXJlIGl0J3MgZXhwYW5kZWQuICdmYWxzZScgdG8gZW5zdXJlIGl0J3MgY2xvc2VkLgotICogICAgICAgICAgICAgICAgJ251bGwnIHRvIHNpbXBseSB0b2dnbGUuCi0gKi8KLWZ1bmN0aW9uIHRvZ2dsZUFsbEluaGVyaXRlZChsaW5rT2JqLCBleHBhbmQpIHsKLSAgdmFyIGEgPSAkKGxpbmtPYmopOwotICB2YXIgdGFibGUgPSAkKGEucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkpOyAvLyB1Z2x5IHdheSB0byBnZXQgdGFibGUvdGJvZHkKLSAgdmFyIGV4cGFuZG9zID0gJCgiLmpkLWV4cGFuZG8tdHJpZ2dlciIsIHRhYmxlKTsKLSAgaWYgKCAoZXhwYW5kID09IG51bGwgJiYgYS50ZXh0KCkgPT0gIltFeHBhbmRdIikgfHwgZXhwYW5kICkgewotICAgIGV4cGFuZG9zLmVhY2goZnVuY3Rpb24oaSkgewotICAgICAgdG9nZ2xlSW5oZXJpdGVkKHRoaXMsIHRydWUpOwotICAgIH0pOwotICAgIGEudGV4dCgiW0NvbGxhcHNlXSIpOwotICB9IGVsc2UgaWYgKCAoZXhwYW5kID09IG51bGwgJiYgYS50ZXh0KCkgPT0gIltDb2xsYXBzZV0iKSB8fCAoZXhwYW5kID09IGZhbHNlKSApIHsKLSAgICBleHBhbmRvcy5lYWNoKGZ1bmN0aW9uKGkpIHsKLSAgICAgIHRvZ2dsZUluaGVyaXRlZCh0aGlzLCBmYWxzZSk7Ci0gICAgfSk7Ci0gICAgYS50ZXh0KCJbRXhwYW5kXSIpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVG9nZ2xlIGFsbCBpbmhlcml0ZWQgbWVtYmVycyBpbiB0aGUgY2xhc3MgKGxpbmsgaW4gdGhlIGNsYXNzIHRpdGxlKQotICovCi1mdW5jdGlvbiB0b2dnbGVBbGxDbGFzc0luaGVyaXRlZCgpIHsKLSAgdmFyIGEgPSAkKCIjdG9nZ2xlQWxsQ2xhc3NJbmhlcml0ZWQiKTsgLy8gZ2V0IHRvZ2dsZSBsaW5rIGZyb20gY2xhc3MgdGl0bGUKLSAgdmFyIHRvZ2dsZXMgPSAkKCIudG9nZ2xlLWFsbCIsICQoIiNib2R5LWNvbnRlbnQiKSk7Ci0gIGlmIChhLnRleHQoKSA9PSAiW0V4cGFuZCBBbGxdIikgewotICAgIHRvZ2dsZXMuZWFjaChmdW5jdGlvbihpKSB7Ci0gICAgICB0b2dnbGVBbGxJbmhlcml0ZWQodGhpcywgdHJ1ZSk7Ci0gICAgfSk7Ci0gICAgYS50ZXh0KCJbQ29sbGFwc2UgQWxsXSIpOwotICB9IGVsc2UgewotICAgIHRvZ2dsZXMuZWFjaChmdW5jdGlvbihpKSB7Ci0gICAgICB0b2dnbGVBbGxJbmhlcml0ZWQodGhpcywgZmFsc2UpOwotICAgIH0pOwotICAgIGEudGV4dCgiW0V4cGFuZCBBbGxdIik7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBFeHBhbmQgYWxsIGluaGVyaXRlZCBtZW1iZXJzIGluIHRoZSBjbGFzcy4gVXNlZCB3aGVuIGluaXRpYXRpbmcgcGFnZSBzZWFyY2ggKi8KLWZ1bmN0aW9uIGVuc3VyZUFsbEluaGVyaXRlZEV4cGFuZGVkKCkgewotICB2YXIgdG9nZ2xlcyA9ICQoIi50b2dnbGUtYWxsIiwgJCgiI2JvZHktY29udGVudCIpKTsKLSAgdG9nZ2xlcy5lYWNoKGZ1bmN0aW9uKGkpIHsKLSAgICB0b2dnbGVBbGxJbmhlcml0ZWQodGhpcywgdHJ1ZSk7Ci0gIH0pOwotICAkKCIjdG9nZ2xlQWxsQ2xhc3NJbmhlcml0ZWQiKS50ZXh0KCJbQ29sbGFwc2UgQWxsXSIpOwotfQotCi0KLS8qIEhBTkRMRSBLRVkgRVZFTlRTCi0gKiAtIExpc3RlbiBmb3IgQ3RybCtGIChDbWQgb24gTWFjKSBhbmQgZXhwYW5kIGFsbCBpbmhlcml0ZWQgbWVtYmVycyAodG8gYWlkIHBhZ2Ugc2VhcmNoKQotICovCi12YXIgYWdlbnQgPSBuYXZpZ2F0b3JbJ3VzZXJBZ2VudCddLnRvTG93ZXJDYXNlKCk7Ci12YXIgbWFjID0gYWdlbnQuaW5kZXhPZigibWFjaW50b3NoIikgIT0gLTE7Ci0KLSQoZG9jdW1lbnQpLmtleWRvd24oIGZ1bmN0aW9uKGUpIHsKLXZhciBjb250cm9sID0gbWFjID8gZS5tZXRhS2V5ICYmICFlLmN0cmxLZXkgOiBlLmN0cmxLZXk7IC8vIGdldCBjdHJsIGtleQotICBpZiAoY29udHJvbCAmJiBlLndoaWNoID09IDcwKSB7ICAvLyA3MCBpcyAiRiIKLSAgICBlbnN1cmVBbGxJbmhlcml0ZWRFeHBhbmRlZCgpOwotICB9Ci19KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvYXNzZXRzL2pzL3ByZXR0aWZ5LmpzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvanMvcHJldHRpZnkuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjVhZDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9hc3NldHMvanMvcHJldHRpZnkuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi12YXIgcT1udWxsO3dpbmRvdy5QUl9TSE9VTERfVVNFX0NPTlRJTlVBVElPTj0hMDsKLShmdW5jdGlvbigpe2Z1bmN0aW9uIEwoYSl7ZnVuY3Rpb24gbShhKXt2YXIgZj1hLmNoYXJDb2RlQXQoMCk7aWYoZiE9PTkyKXJldHVybiBmO3ZhciBiPWEuY2hhckF0KDEpO3JldHVybihmPXJbYl0pP2Y6IjAiPD1iJiZiPD0iNyI/cGFyc2VJbnQoYS5zdWJzdHJpbmcoMSksOCk6Yj09PSJ1Inx8Yj09PSJ4Ij9wYXJzZUludChhLnN1YnN0cmluZygyKSwxNik6YS5jaGFyQ29kZUF0KDEpfWZ1bmN0aW9uIGUoYSl7aWYoYTwzMilyZXR1cm4oYTwxNj8iXFx4MCI6IlxceCIpK2EudG9TdHJpbmcoMTYpO2E9U3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZihhPT09IlxcInx8YT09PSItInx8YT09PSJbInx8YT09PSJdIilhPSJcXCIrYTtyZXR1cm4gYX1mdW5jdGlvbiBoKGEpe2Zvcih2YXIgZj1hLnN1YnN0cmluZygxLGEubGVuZ3RoLTEpLm1hdGNoKC9cXHVbXGRBLUZhLWZdezR9fFxceFtcZEEtRmEtZl17Mn18XFxbMC0zXVswLTddezAsMn18XFxbMC03XXsxLDJ9fFxcW1xTXHNdfFteXFxdL2cpLGE9Ci1bXSxiPVtdLG89ZlswXT09PSJeIixjPW8/MTowLGk9Zi5sZW5ndGg7YzxpOysrYyl7dmFyIGo9ZltjXTtpZigvXFxbYmRzd10vaS50ZXN0KGopKWEucHVzaChqKTtlbHNle3ZhciBqPW0oaiksZDtjKzI8aSYmIi0iPT09ZltjKzFdPyhkPW0oZltjKzJdKSxjKz0yKTpkPWo7Yi5wdXNoKFtqLGRdKTtkPDY1fHxqPjEyMnx8KGQ8NjV8fGo+OTB8fGIucHVzaChbTWF0aC5tYXgoNjUsail8MzIsTWF0aC5taW4oZCw5MCl8MzJdKSxkPDk3fHxqPjEyMnx8Yi5wdXNoKFtNYXRoLm1heCg5NyxqKSYtMzMsTWF0aC5taW4oZCwxMjIpJi0zM10pKX19Yi5zb3J0KGZ1bmN0aW9uKGEsZil7cmV0dXJuIGFbMF0tZlswXXx8ZlsxXS1hWzFdfSk7Zj1bXTtqPVtOYU4sTmFOXTtmb3IoYz0wO2M8Yi5sZW5ndGg7KytjKWk9YltjXSxpWzBdPD1qWzFdKzE/alsxXT1NYXRoLm1heChqWzFdLGlbMV0pOmYucHVzaChqPWkpO2I9WyJbIl07byYmYi5wdXNoKCJeIik7Yi5wdXNoLmFwcGx5KGIsYSk7Zm9yKGM9MDtjPAotZi5sZW5ndGg7KytjKWk9ZltjXSxiLnB1c2goZShpWzBdKSksaVsxXT5pWzBdJiYoaVsxXSsxPmlbMF0mJmIucHVzaCgiLSIpLGIucHVzaChlKGlbMV0pKSk7Yi5wdXNoKCJdIik7cmV0dXJuIGIuam9pbigiIil9ZnVuY3Rpb24geShhKXtmb3IodmFyIGY9YS5zb3VyY2UubWF0Y2goL1xbKD86W15cXFxdXXxcXFtcU1xzXSkqXXxcXHVbXGRBLUZhLWZdezR9fFxceFtcZEEtRmEtZl17Mn18XFxcZCt8XFxbXlxkdXhdfFwoXD9bITo9XXxbKCleXXxbXigpW1xcXl0rL2cpLGI9Zi5sZW5ndGgsZD1bXSxjPTAsaT0wO2M8YjsrK2Mpe3ZhciBqPWZbY107aj09PSIoIj8rK2k6IlxcIj09PWouY2hhckF0KDApJiYoaj0rai5zdWJzdHJpbmcoMSkpJiZqPD1pJiYoZFtqXT0tMSl9Zm9yKGM9MTtjPGQubGVuZ3RoOysrYyktMT09PWRbY10mJihkW2NdPSsrdCk7Zm9yKGk9Yz0wO2M8YjsrK2Mpaj1mW2NdLGo9PT0iKCI/KCsraSxkW2ldPT09dm9pZCAwJiYoZltjXT0iKD86IikpOiJcXCI9PT1qLmNoYXJBdCgwKSYmCi0oaj0rai5zdWJzdHJpbmcoMSkpJiZqPD1pJiYoZltjXT0iXFwiK2RbaV0pO2ZvcihpPWM9MDtjPGI7KytjKSJeIj09PWZbY10mJiJeIiE9PWZbYysxXSYmKGZbY109IiIpO2lmKGEuaWdub3JlQ2FzZSYmcylmb3IoYz0wO2M8YjsrK2Mpaj1mW2NdLGE9ai5jaGFyQXQoMCksai5sZW5ndGg+PTImJmE9PT0iWyI/ZltjXT1oKGopOmEhPT0iXFwiJiYoZltjXT1qLnJlcGxhY2UoL1tBLVphLXpdL2csZnVuY3Rpb24oYSl7YT1hLmNoYXJDb2RlQXQoMCk7cmV0dXJuIlsiK1N0cmluZy5mcm9tQ2hhckNvZGUoYSYtMzMsYXwzMikrIl0ifSkpO3JldHVybiBmLmpvaW4oIiIpfWZvcih2YXIgdD0wLHM9ITEsbD0hMSxwPTAsZD1hLmxlbmd0aDtwPGQ7KytwKXt2YXIgZz1hW3BdO2lmKGcuaWdub3JlQ2FzZSlsPSEwO2Vsc2UgaWYoL1thLXpdL2kudGVzdChnLnNvdXJjZS5yZXBsYWNlKC9cXHVbXGRhLWZdezR9fFxceFtcZGEtZl17Mn18XFxbXlVYdXhdL2dpLCIiKSkpe3M9ITA7bD0hMTticmVha319Zm9yKHZhciByPQote2I6OCx0OjksbjoxMCx2OjExLGY6MTIscjoxM30sbj1bXSxwPTAsZD1hLmxlbmd0aDtwPGQ7KytwKXtnPWFbcF07aWYoZy5nbG9iYWx8fGcubXVsdGlsaW5lKXRocm93IEVycm9yKCIiK2cpO24ucHVzaCgiKD86Iit5KGcpKyIpIil9cmV0dXJuIFJlZ0V4cChuLmpvaW4oInwiKSxsPyJnaSI6ImciKX1mdW5jdGlvbiBNKGEpe2Z1bmN0aW9uIG0oYSl7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTppZihlLnRlc3QoYS5jbGFzc05hbWUpKWJyZWFrO2Zvcih2YXIgZz1hLmZpcnN0Q2hpbGQ7ZztnPWcubmV4dFNpYmxpbmcpbShnKTtnPWEubm9kZU5hbWU7aWYoIkJSIj09PWd8fCJMSSI9PT1nKWhbc109IlxuIix0W3M8PDFdPXkrKyx0W3MrKzw8MXwxXT1hO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6Zz1hLm5vZGVWYWx1ZSxnLmxlbmd0aCYmKGc9cD9nLnJlcGxhY2UoL1xyXG4/L2csIlxuIik6Zy5yZXBsYWNlKC9bXHRcblxyIF0rL2csIiAiKSxoW3NdPWcsdFtzPDwxXT15LHkrPWcubGVuZ3RoLAotdFtzKys8PDF8MV09YSl9fXZhciBlPS8oPzpefFxzKW5vY29kZSg/OlxzfCQpLyxoPVtdLHk9MCx0PVtdLHM9MCxsO2EuY3VycmVudFN0eWxlP2w9YS5jdXJyZW50U3R5bGUud2hpdGVTcGFjZTp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSYmKGw9ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShhLHEpLmdldFByb3BlcnR5VmFsdWUoIndoaXRlLXNwYWNlIikpO3ZhciBwPWwmJiJwcmUiPT09bC5zdWJzdHJpbmcoMCwzKTttKGEpO3JldHVybnthOmguam9pbigiIikucmVwbGFjZSgvXG4kLywiIiksYzp0fX1mdW5jdGlvbiBCKGEsbSxlLGgpe20mJihhPXthOm0sZDphfSxlKGEpLGgucHVzaC5hcHBseShoLGEuZSkpfWZ1bmN0aW9uIHgoYSxtKXtmdW5jdGlvbiBlKGEpe2Zvcih2YXIgbD1hLmQscD1bbCwicGxuIl0sZD0wLGc9YS5hLm1hdGNoKHkpfHxbXSxyPXt9LG49MCx6PWcubGVuZ3RoO248ejsrK24pe3ZhciBmPWdbbl0sYj1yW2ZdLG89dm9pZCAwLGM7aWYodHlwZW9mIGI9PT0KLSJzdHJpbmciKWM9ITE7ZWxzZXt2YXIgaT1oW2YuY2hhckF0KDApXTtpZihpKW89Zi5tYXRjaChpWzFdKSxiPWlbMF07ZWxzZXtmb3IoYz0wO2M8dDsrK2MpaWYoaT1tW2NdLG89Zi5tYXRjaChpWzFdKSl7Yj1pWzBdO2JyZWFrfW98fChiPSJwbG4iKX1pZigoYz1iLmxlbmd0aD49NSYmImxhbmctIj09PWIuc3Vic3RyaW5nKDAsNSkpJiYhKG8mJnR5cGVvZiBvWzFdPT09InN0cmluZyIpKWM9ITEsYj0ic3JjIjtjfHwocltmXT1iKX1pPWQ7ZCs9Zi5sZW5ndGg7aWYoYyl7Yz1vWzFdO3ZhciBqPWYuaW5kZXhPZihjKSxrPWorYy5sZW5ndGg7b1syXSYmKGs9Zi5sZW5ndGgtb1syXS5sZW5ndGgsaj1rLWMubGVuZ3RoKTtiPWIuc3Vic3RyaW5nKDUpO0IobCtpLGYuc3Vic3RyaW5nKDAsaiksZSxwKTtCKGwraStqLGMsQyhiLGMpLHApO0IobCtpK2ssZi5zdWJzdHJpbmcoayksZSxwKX1lbHNlIHAucHVzaChsK2ksYil9YS5lPXB9dmFyIGg9e30seTsoZnVuY3Rpb24oKXtmb3IodmFyIGU9YS5jb25jYXQobSksCi1sPVtdLHA9e30sZD0wLGc9ZS5sZW5ndGg7ZDxnOysrZCl7dmFyIHI9ZVtkXSxuPXJbM107aWYobilmb3IodmFyIGs9bi5sZW5ndGg7LS1rPj0wOyloW24uY2hhckF0KGspXT1yO3I9clsxXTtuPSIiK3I7cC5oYXNPd25Qcm9wZXJ0eShuKXx8KGwucHVzaChyKSxwW25dPXEpfWwucHVzaCgvW1xTXHNdLyk7eT1MKGwpfSkoKTt2YXIgdD1tLmxlbmd0aDtyZXR1cm4gZX1mdW5jdGlvbiB1KGEpe3ZhciBtPVtdLGU9W107YS50cmlwbGVRdW90ZWRTdHJpbmdzP20ucHVzaChbInN0ciIsL14oPzonJycoPzpbXidcXF18XFxbXFNcc118Jyc/KD89W14nXSkpKig/OicnJ3wkKXwiIiIoPzpbXiJcXF18XFxbXFNcc118IiI/KD89W14iXSkpKig/OiIiInwkKXwnKD86W14nXFxdfFxcW1xTXHNdKSooPzonfCQpfCIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCkpLyxxLCInXCIiXSk6YS5tdWx0aUxpbmVTdHJpbmdzP20ucHVzaChbInN0ciIsL14oPzonKD86W14nXFxdfFxcW1xTXHNdKSooPzonfCQpfCIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCl8YCg/OlteXFxgXXxcXFtcU1xzXSkqKD86YHwkKSkvLAotcSwiJ1wiYCJdKTptLnB1c2goWyJzdHIiLC9eKD86Jyg/OlteXG5ccidcXF18XFwuKSooPzonfCQpfCIoPzpbXlxuXHIiXFxdfFxcLikqKD86InwkKSkvLHEsIlwiJyJdKTthLnZlcmJhdGltU3RyaW5ncyYmZS5wdXNoKFsic3RyIiwvXkAiKD86W14iXXwiIikqKD86InwkKS8scV0pO3ZhciBoPWEuaGFzaENvbW1lbnRzO2gmJihhLmNTdHlsZUNvbW1lbnRzPyhoPjE/bS5wdXNoKFsiY29tIiwvXiMoPzojIyg/OlteI118Iyg/ISMjKSkqKD86IyMjfCQpfC4qKS8scSwiIyJdKTptLnB1c2goWyJjb20iLC9eIyg/Oig/OmRlZmluZXxlbGlmfGVsc2V8ZW5kaWZ8ZXJyb3J8aWZkZWZ8aW5jbHVkZXxpZm5kZWZ8bGluZXxwcmFnbWF8dW5kZWZ8d2FybmluZylcYnxbXlxuXHJdKikvLHEsIiMiXSksZS5wdXNoKFsic3RyIiwvXjwoPzooPzooPzpcLlwuXC8pKnxcLz8pKD86W1x3LV0rKD86XC9bXHctXSspKyk/W1x3LV0rXC5ofFthLXpdXHcqKT4vLHFdKSk6bS5wdXNoKFsiY29tIiwvXiNbXlxuXHJdKi8sCi1xLCIjIl0pKTthLmNTdHlsZUNvbW1lbnRzJiYoZS5wdXNoKFsiY29tIiwvXlwvXC9bXlxuXHJdKi8scV0pLGUucHVzaChbImNvbSIsL15cL1wqW1xTXHNdKj8oPzpcKlwvfCQpLyxxXSkpO2EucmVnZXhMaXRlcmFscyYmZS5wdXNoKFsibGFuZy1yZWdleCIsL14oPzpeXlwuP3xbISstXXwhPXwhPT18I3wlfCU9fCZ8JiZ8JiY9fCY9fFwofFwqfFwqPXxcKz18LHwtPXwtPnxcL3xcLz18Onw6Onw7fDx8PDx8PDw9fDw9fD18PT18PT09fD58Pj18Pj58Pj49fD4+Pnw+Pj49fFs/QFteXXxcXj18XF5cXnxcXlxePXx7fFx8fFx8PXxcfFx8fFx8XHw9fH58YnJlYWt8Y2FzZXxjb250aW51ZXxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2YpXHMqKFwvKD89W14qL10pKD86W14vW1xcXXxcXFtcU1xzXXxcWyg/OlteXFxcXV18XFxbXFNcc10pKig/Ol18JCkpK1wvKS9dKTsoaD1hLnR5cGVzKSYmZS5wdXNoKFsidHlwIixoXSk7YT0oIiIrYS5rZXl3b3JkcykucmVwbGFjZSgvXiB8ICQvZywKLSIiKTthLmxlbmd0aCYmZS5wdXNoKFsia3dkIixSZWdFeHAoIl4oPzoiK2EucmVwbGFjZSgvW1xzLF0rL2csInwiKSsiKVxcYiIpLHFdKTttLnB1c2goWyJwbG4iLC9eXHMrLyxxLCIgXHJcblx0XHhhMCJdKTtlLnB1c2goWyJsaXQiLC9eQFskX2Etel1bXHckQF0qL2kscV0sWyJ0eXAiLC9eKD86W0BfXT9bQS1aXStbYS16XVtcdyRAXSp8XHcrX3RcYikvLHFdLFsicGxuIiwvXlskX2Etel1bXHckQF0qL2kscV0sWyJsaXQiLC9eKD86MHhbXGRhLWZdK3woPzpcZCg/Ol9cZCspKlxkKig/OlwuXGQqKT98XC5cZFwrKSg/OmVbKy1dP1xkKyk/KVthLXpdKi9pLHEsIjAxMjM0NTY3ODkiXSxbInBsbiIsL15cXFtcU1xzXT8vLHFdLFsicHVuIiwvXi5bXlxzXHciLSQnLi9AXFxgXSovLHFdKTtyZXR1cm4geChtLGUpfWZ1bmN0aW9uIEQoYSxtKXtmdW5jdGlvbiBlKGEpe3N3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6aWYoay50ZXN0KGEuY2xhc3NOYW1lKSlicmVhaztpZigiQlIiPT09YS5ub2RlTmFtZSloKGEpLAotYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7ZWxzZSBmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZShhKTticmVhaztjYXNlIDM6Y2FzZSA0OmlmKHApe3ZhciBiPWEubm9kZVZhbHVlLGQ9Yi5tYXRjaCh0KTtpZihkKXt2YXIgYz1iLnN1YnN0cmluZygwLGQuaW5kZXgpO2Eubm9kZVZhbHVlPWM7KGI9Yi5zdWJzdHJpbmcoZC5pbmRleCtkWzBdLmxlbmd0aCkpJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHMuY3JlYXRlVGV4dE5vZGUoYiksYS5uZXh0U2libGluZyk7aChhKTtjfHxhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9fX19ZnVuY3Rpb24gaChhKXtmdW5jdGlvbiBiKGEsZCl7dmFyIGU9ZD9hLmNsb25lTm9kZSghMSk6YSxmPWEucGFyZW50Tm9kZTtpZihmKXt2YXIgZj1iKGYsMSksZz1hLm5leHRTaWJsaW5nO2YuYXBwZW5kQ2hpbGQoZSk7Zm9yKHZhciBoPWc7aDtoPWcpZz1oLm5leHRTaWJsaW5nLGYuYXBwZW5kQ2hpbGQoaCl9cmV0dXJuIGV9Ci1mb3IoOyFhLm5leHRTaWJsaW5nOylpZihhPWEucGFyZW50Tm9kZSwhYSlyZXR1cm47Zm9yKHZhciBhPWIoYS5uZXh0U2libGluZywwKSxlOyhlPWEucGFyZW50Tm9kZSkmJmUubm9kZVR5cGU9PT0xOylhPWU7ZC5wdXNoKGEpfXZhciBrPS8oPzpefFxzKW5vY29kZSg/OlxzfCQpLyx0PS9cclxuP3xcbi8scz1hLm93bmVyRG9jdW1lbnQsbDthLmN1cnJlbnRTdHlsZT9sPWEuY3VycmVudFN0eWxlLndoaXRlU3BhY2U6d2luZG93LmdldENvbXB1dGVkU3R5bGUmJihsPXMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShhLHEpLmdldFByb3BlcnR5VmFsdWUoIndoaXRlLXNwYWNlIikpO3ZhciBwPWwmJiJwcmUiPT09bC5zdWJzdHJpbmcoMCwzKTtmb3IobD1zLmNyZWF0ZUVsZW1lbnQoIkxJIik7YS5maXJzdENoaWxkOylsLmFwcGVuZENoaWxkKGEuZmlyc3RDaGlsZCk7Zm9yKHZhciBkPVtsXSxnPTA7ZzxkLmxlbmd0aDsrK2cpZShkW2ddKTttPT09KG18MCkmJmRbMF0uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsCi1tKTt2YXIgcj1zLmNyZWF0ZUVsZW1lbnQoIk9MIik7ci5jbGFzc05hbWU9ImxpbmVudW1zIjtmb3IodmFyIG49TWF0aC5tYXgoMCxtLTF8MCl8fDAsZz0wLHo9ZC5sZW5ndGg7Zzx6OysrZylsPWRbZ10sbC5jbGFzc05hbWU9IkwiKyhnK24pJTEwLGwuZmlyc3RDaGlsZHx8bC5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKCJceGEwIikpLHIuYXBwZW5kQ2hpbGQobCk7YS5hcHBlbmRDaGlsZChyKX1mdW5jdGlvbiBrKGEsbSl7Zm9yKHZhciBlPW0ubGVuZ3RoOy0tZT49MDspe3ZhciBoPW1bZV07QS5oYXNPd25Qcm9wZXJ0eShoKT93aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuKCJjYW5ub3Qgb3ZlcnJpZGUgbGFuZ3VhZ2UgaGFuZGxlciAlcyIsaCk6QVtoXT1hfX1mdW5jdGlvbiBDKGEsbSl7aWYoIWF8fCFBLmhhc093blByb3BlcnR5KGEpKWE9L15ccyo8Ly50ZXN0KG0pPyJkZWZhdWx0LW1hcmt1cCI6ImRlZmF1bHQtY29kZSI7cmV0dXJuIEFbYV19ZnVuY3Rpb24gRShhKXt2YXIgbT0KLWEuZzt0cnl7dmFyIGU9TShhLmgpLGg9ZS5hO2EuYT1oO2EuYz1lLmM7YS5kPTA7QyhtLGgpKGEpO3ZhciBrPS9cYk1TSUVcYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxtPS9cbi9nLHQ9YS5hLHM9dC5sZW5ndGgsZT0wLGw9YS5jLHA9bC5sZW5ndGgsaD0wLGQ9YS5lLGc9ZC5sZW5ndGgsYT0wO2RbZ109czt2YXIgcixuO2ZvcihuPXI9MDtuPGc7KWRbbl0hPT1kW24rMl0/KGRbcisrXT1kW24rK10sZFtyKytdPWRbbisrXSk6bis9MjtnPXI7Zm9yKG49cj0wO248Zzspe2Zvcih2YXIgej1kW25dLGY9ZFtuKzFdLGI9bisyO2IrMjw9ZyYmZFtiKzFdPT09ZjspYis9MjtkW3IrK109ejtkW3IrK109ZjtuPWJ9Zm9yKGQubGVuZ3RoPXI7aDxwOyl7dmFyIG89bFtoKzJdfHxzLGM9ZFthKzJdfHxzLGI9TWF0aC5taW4obyxjKSxpPWxbaCsxXSxqO2lmKGkubm9kZVR5cGUhPT0xJiYoaj10LnN1YnN0cmluZyhlLGIpKSl7ayYmKGo9ai5yZXBsYWNlKG0sIlxyIikpO2kubm9kZVZhbHVlPQotajt2YXIgdT1pLm93bmVyRG9jdW1lbnQsdj11LmNyZWF0ZUVsZW1lbnQoIlNQQU4iKTt2LmNsYXNzTmFtZT1kW2ErMV07dmFyIHg9aS5wYXJlbnROb2RlO3gucmVwbGFjZUNoaWxkKHYsaSk7di5hcHBlbmRDaGlsZChpKTtlPG8mJihsW2grMV09aT11LmNyZWF0ZVRleHROb2RlKHQuc3Vic3RyaW5nKGIsbykpLHguaW5zZXJ0QmVmb3JlKGksdi5uZXh0U2libGluZykpfWU9YjtlPj1vJiYoaCs9Mik7ZT49YyYmKGErPTIpfX1jYXRjaCh3KXsiY29uc29sZSJpbiB3aW5kb3cmJmNvbnNvbGUubG9nKHcmJncuc3RhY2s/dy5zdGFjazp3KX19dmFyIHY9WyJicmVhayxjb250aW51ZSxkbyxlbHNlLGZvcixpZixyZXR1cm4sd2hpbGUiXSx3PVtbdiwiYXV0byxjYXNlLGNoYXIsY29uc3QsZGVmYXVsdCxkb3VibGUsZW51bSxleHRlcm4sZmxvYXQsZ290byxpbnQsbG9uZyxyZWdpc3RlcixzaG9ydCxzaWduZWQsc2l6ZW9mLHN0YXRpYyxzdHJ1Y3Qsc3dpdGNoLHR5cGVkZWYsdW5pb24sdW5zaWduZWQsdm9pZCx2b2xhdGlsZSJdLAotImNhdGNoLGNsYXNzLGRlbGV0ZSxmYWxzZSxpbXBvcnQsbmV3LG9wZXJhdG9yLHByaXZhdGUscHJvdGVjdGVkLHB1YmxpYyx0aGlzLHRocm93LHRydWUsdHJ5LHR5cGVvZiJdLEY9W3csImFsaWdub2YsYWxpZ25fdW5pb24sYXNtLGF4aW9tLGJvb2wsY29uY2VwdCxjb25jZXB0X21hcCxjb25zdF9jYXN0LGNvbnN0ZXhwcixkZWNsdHlwZSxkeW5hbWljX2Nhc3QsZXhwbGljaXQsZXhwb3J0LGZyaWVuZCxpbmxpbmUsbGF0ZV9jaGVjayxtdXRhYmxlLG5hbWVzcGFjZSxudWxscHRyLHJlaW50ZXJwcmV0X2Nhc3Qsc3RhdGljX2Fzc2VydCxzdGF0aWNfY2FzdCx0ZW1wbGF0ZSx0eXBlaWQsdHlwZW5hbWUsdXNpbmcsdmlydHVhbCx3aGVyZSJdLEc9W3csImFic3RyYWN0LGJvb2xlYW4sYnl0ZSxleHRlbmRzLGZpbmFsLGZpbmFsbHksaW1wbGVtZW50cyxpbXBvcnQsaW5zdGFuY2VvZixudWxsLG5hdGl2ZSxwYWNrYWdlLHN0cmljdGZwLHN1cGVyLHN5bmNocm9uaXplZCx0aHJvd3MsdHJhbnNpZW50Il0sCi1IPVtHLCJhcyxiYXNlLGJ5LGNoZWNrZWQsZGVjaW1hbCxkZWxlZ2F0ZSxkZXNjZW5kaW5nLGR5bmFtaWMsZXZlbnQsZml4ZWQsZm9yZWFjaCxmcm9tLGdyb3VwLGltcGxpY2l0LGluLGludGVyZmFjZSxpbnRlcm5hbCxpbnRvLGlzLGxvY2ssb2JqZWN0LG91dCxvdmVycmlkZSxvcmRlcmJ5LHBhcmFtcyxwYXJ0aWFsLHJlYWRvbmx5LHJlZixzYnl0ZSxzZWFsZWQsc3RhY2thbGxvYyxzdHJpbmcsc2VsZWN0LHVpbnQsdWxvbmcsdW5jaGVja2VkLHVuc2FmZSx1c2hvcnQsdmFyIl0sdz1bdywiZGVidWdnZXIsZXZhbCxleHBvcnQsZnVuY3Rpb24sZ2V0LG51bGwsc2V0LHVuZGVmaW5lZCx2YXIsd2l0aCxJbmZpbml0eSxOYU4iXSxJPVt2LCJhbmQsYXMsYXNzZXJ0LGNsYXNzLGRlZixkZWwsZWxpZixleGNlcHQsZXhlYyxmaW5hbGx5LGZyb20sZ2xvYmFsLGltcG9ydCxpbixpcyxsYW1iZGEsbm9ubG9jYWwsbm90LG9yLHBhc3MscHJpbnQscmFpc2UsdHJ5LHdpdGgseWllbGQsRmFsc2UsVHJ1ZSxOb25lIl0sCi1KPVt2LCJhbGlhcyxhbmQsYmVnaW4sY2FzZSxjbGFzcyxkZWYsZGVmaW5lZCxlbHNpZixlbmQsZW5zdXJlLGZhbHNlLGluLG1vZHVsZSxuZXh0LG5pbCxub3Qsb3IscmVkbyxyZXNjdWUscmV0cnksc2VsZixzdXBlcix0aGVuLHRydWUsdW5kZWYsdW5sZXNzLHVudGlsLHdoZW4seWllbGQsQkVHSU4sRU5EIl0sdj1bdiwiY2FzZSxkb25lLGVsaWYsZXNhYyxldmFsLGZpLGZ1bmN0aW9uLGluLGxvY2FsLHNldCx0aGVuLHVudGlsIl0sSz0vXihESVJ8RklMRXx2ZWN0b3J8KGRlfHByaW9yaXR5Xyk/cXVldWV8bGlzdHxzdGFja3woY29uc3RfKT9pdGVyYXRvcnwobXVsdGkpPyhzZXR8bWFwKXxiaXRzZXR8dT8oaW50fGZsb2F0KVxkKikvLE49L1xTLyxPPXUoe2tleXdvcmRzOltGLEgsdywiY2FsbGVyLGRlbGV0ZSxkaWUsZG8sZHVtcCxlbHNpZixldmFsLGV4aXQsZm9yZWFjaCxmb3IsZ290byxpZixpbXBvcnQsbGFzdCxsb2NhbCxteSxuZXh0LG5vLG91cixwcmludCxwYWNrYWdlLHJlZG8scmVxdWlyZSxzdWIsdW5kZWYsdW5sZXNzLHVudGlsLHVzZSx3YW50YXJyYXksd2hpbGUsQkVHSU4sRU5EIisKLUksSix2XSxoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksQT17fTtrKE8sWyJkZWZhdWx0LWNvZGUiXSk7ayh4KFtdLFtbInBsbiIsL15bXjw/XSsvXSxbImRlYyIsL148IVx3W14+XSooPzo+fCQpL10sWyJjb20iLC9ePFwhLS1bXFNcc10qPyg/Oi0tXD58JCkvXSxbImxhbmctIiwvXjxcPyhbXFNcc10rPykoPzpcPz58JCkvXSxbImxhbmctIiwvXjwlKFtcU1xzXSs/KSg/OiU+fCQpL10sWyJwdW4iLC9eKD86PFslP118WyU/XT4pL10sWyJsYW5nLSIsL148eG1wXGJbXj5dKj4oW1xTXHNdKz8pPFwveG1wXGJbXj5dKj4vaV0sWyJsYW5nLWpzIiwvXjxzY3JpcHRcYltePl0qPihbXFNcc10qPykoPFwvc2NyaXB0XGJbXj5dKj4pL2ldLFsibGFuZy1jc3MiLC9ePHN0eWxlXGJbXj5dKj4oW1xTXHNdKj8pKDxcL3N0eWxlXGJbXj5dKj4pL2ldLFsibGFuZy1pbi50YWciLC9eKDxcLz9bYS16XVtePD5dKj4pL2ldXSksCi1bImRlZmF1bHQtbWFya3VwIiwiaHRtIiwiaHRtbCIsIm14bWwiLCJ4aHRtbCIsInhtbCIsInhzbCJdKTtrKHgoW1sicGxuIiwvXlxzKy8scSwiIFx0XHJcbiJdLFsiYXR2IiwvXig/OiJbXiJdKiI/fCdbXiddKic/KS8scSwiXCInIl1dLFtbInRhZyIsL15ePFwvP1thLXpdKD86W1x3LS46XSpcdyk/fFwvPz4kL2ldLFsiYXRuIiwvXig/IXN0eWxlW1xzPV18b24pW2Etel0oPzpbXHc6LV0qXHcpPy9pXSxbImxhbmctdXEudmFsIiwvXj1ccyooW15ccyInPl0qKD86W15ccyInLz5dfFwvKD89XHMpKSkvXSxbInB1biIsL15bLzwtPl0rL10sWyJsYW5nLWpzIiwvXm9uXHcrXHMqPVxzKiIoW14iXSspIi9pXSxbImxhbmctanMiLC9eb25cdytccyo9XHMqJyhbXiddKyknL2ldLFsibGFuZy1qcyIsL15vblx3K1xzKj1ccyooW15ccyInPl0rKS9pXSxbImxhbmctY3NzIiwvXnN0eWxlXHMqPVxzKiIoW14iXSspIi9pXSxbImxhbmctY3NzIiwvXnN0eWxlXHMqPVxzKicoW14nXSspJy9pXSxbImxhbmctY3NzIiwKLS9ec3R5bGVccyo9XHMqKFteXHMiJz5dKykvaV1dKSxbImluLnRhZyJdKTtrKHgoW10sW1siYXR2IiwvXltcU1xzXSsvXV0pLFsidXEudmFsIl0pO2sodSh7a2V5d29yZHM6RixoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsdHlwZXM6S30pLFsiYyIsImNjIiwiY3BwIiwiY3h4IiwiY3ljIiwibSJdKTtrKHUoe2tleXdvcmRzOiJudWxsLHRydWUsZmFsc2UifSksWyJqc29uIl0pO2sodSh7a2V5d29yZHM6SCxoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsdmVyYmF0aW1TdHJpbmdzOiEwLHR5cGVzOkt9KSxbImNzIl0pO2sodSh7a2V5d29yZHM6RyxjU3R5bGVDb21tZW50czohMH0pLFsiamF2YSJdKTtrKHUoe2tleXdvcmRzOnYsaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITB9KSxbImJzaCIsImNzaCIsInNoIl0pO2sodSh7a2V5d29yZHM6SSxoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCx0cmlwbGVRdW90ZWRTdHJpbmdzOiEwfSksCi1bImN2IiwicHkiXSk7ayh1KHtrZXl3b3JkczoiY2FsbGVyLGRlbGV0ZSxkaWUsZG8sZHVtcCxlbHNpZixldmFsLGV4aXQsZm9yZWFjaCxmb3IsZ290byxpZixpbXBvcnQsbGFzdCxsb2NhbCxteSxuZXh0LG5vLG91cixwcmludCxwYWNrYWdlLHJlZG8scmVxdWlyZSxzdWIsdW5kZWYsdW5sZXNzLHVudGlsLHVzZSx3YW50YXJyYXksd2hpbGUsQkVHSU4sRU5EIixoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksWyJwZXJsIiwicGwiLCJwbSJdKTtrKHUoe2tleXdvcmRzOkosaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLFsicmIiXSk7ayh1KHtrZXl3b3Jkczp3LGNTdHlsZUNvbW1lbnRzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbImpzIl0pO2sodSh7a2V5d29yZHM6ImFsbCxhbmQsYnksY2F0Y2gsY2xhc3MsZWxzZSxleHRlbmRzLGZhbHNlLGZpbmFsbHksZm9yLGlmLGluLGlzLGlzbnQsbG9vcCxuZXcsbm8sbm90LG51bGwsb2Ysb2ZmLG9uLG9yLHJldHVybixzdXBlcix0aGVuLHRydWUsdHJ5LHVubGVzcyx1bnRpbCx3aGVuLHdoaWxlLHllcyIsCi1oYXNoQ29tbWVudHM6MyxjU3R5bGVDb21tZW50czohMCxtdWx0aWxpbmVTdHJpbmdzOiEwLHRyaXBsZVF1b3RlZFN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLFsiY29mZmVlIl0pO2soeChbXSxbWyJzdHIiLC9eW1xTXHNdKy9dXSksWyJyZWdleCJdKTt3aW5kb3cucHJldHR5UHJpbnRPbmU9ZnVuY3Rpb24oYSxtLGUpe3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlBSRSIpO2guaW5uZXJIVE1MPWE7ZSYmRChoLGUpO0Uoe2c6bSxpOmUsaDpofSk7cmV0dXJuIGguaW5uZXJIVE1MfTt3aW5kb3cucHJldHR5UHJpbnQ9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gbSgpe2Zvcih2YXIgZT13aW5kb3cuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT04/bC5ub3coKSsyNTA6SW5maW5pdHk7cDxoLmxlbmd0aCYmbC5ub3coKTxlO3ArKyl7dmFyIG49aFtwXSxrPW4uY2xhc3NOYW1lO2lmKGsuaW5kZXhPZigicHJldHR5cHJpbnQiKT49MCl7dmFyIGs9ay5tYXRjaChnKSxmLGI7aWYoYj0KLSFrKXtiPW47Zm9yKHZhciBvPXZvaWQgMCxjPWIuZmlyc3RDaGlsZDtjO2M9Yy5uZXh0U2libGluZyl2YXIgaT1jLm5vZGVUeXBlLG89aT09PTE/bz9iOmM6aT09PTM/Ti50ZXN0KGMubm9kZVZhbHVlKT9iOm86bztiPShmPW89PT1iP3ZvaWQgMDpvKSYmIkNPREUiPT09Zi50YWdOYW1lfWImJihrPWYuY2xhc3NOYW1lLm1hdGNoKGcpKTtrJiYoaz1rWzFdKTtiPSExO2ZvcihvPW4ucGFyZW50Tm9kZTtvO289by5wYXJlbnROb2RlKWlmKChvLnRhZ05hbWU9PT0icHJlInx8by50YWdOYW1lPT09ImNvZGUifHxvLnRhZ05hbWU9PT0ieG1wIikmJm8uY2xhc3NOYW1lJiZvLmNsYXNzTmFtZS5pbmRleE9mKCJwcmV0dHlwcmludCIpPj0wKXtiPSEwO2JyZWFrfWJ8fCgoYj0oYj1uLmNsYXNzTmFtZS5tYXRjaCgvXGJsaW5lbnVtc1xiKD86OihcZCspKT8vKSk/YlsxXSYmYlsxXS5sZW5ndGg/K2JbMV06ITA6ITEpJiZEKG4sYiksZD17ZzprLGg6bixpOmJ9LEUoZCkpfX1wPGgubGVuZ3RoP3NldFRpbWVvdXQobSwKLTI1MCk6YSYmYSgpfWZvcih2YXIgZT1bZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjb2RlIiksZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInhtcCIpXSxoPVtdLGs9MDtrPGUubGVuZ3RoOysraylmb3IodmFyIHQ9MCxzPWVba10ubGVuZ3RoO3Q8czsrK3QpaC5wdXNoKGVba11bdF0pO3ZhciBlPXEsbD1EYXRlO2wubm93fHwobD17bm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfX0pO3ZhciBwPTAsZCxnPS9cYmxhbmcoPzp1YWdlKT8tKFtcdy5dKykoPyFcUykvO20oKX07d2luZG93LlBSPXtjcmVhdGVTaW1wbGVMZXhlcjp4LHJlZ2lzdGVyTGFuZ0hhbmRsZXI6ayxzb3VyY2VEZWNvcmF0b3I6dSxQUl9BVFRSSUJfTkFNRToiYXRuIixQUl9BVFRSSUJfVkFMVUU6ImF0diIsUFJfQ09NTUVOVDoiY29tIixQUl9ERUNMQVJBVElPTjoiZGVjIixQUl9LRVlXT1JEOiJrd2QiLFBSX0xJVEVSQUw6ImxpdCIsCi1QUl9OT0NPREU6Im5vY29kZSIsUFJfUExBSU46InBsbiIsUFJfUFVOQ1RVQVRJT046InB1biIsUFJfU09VUkNFOiJzcmMiLFBSX1NUUklORzoic3RyIixQUl9UQUc6InRhZyIsUFJfVFlQRToidHlwIn19KSgpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9jbGFzcy5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvY2xhc3MuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjMzZmIuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9jbGFzcy5jcworKysgL2Rldi9udWxsCkBAIC0xLDY1OCArMCwwIEBACi08P2NzIGluY2x1ZGU6ImRvY3R5cGUuY3MiID8+Ci08P2NzIGluY2x1ZGU6Im1hY3Jvcy5jcyIgPz4KLTxodG1sPD9jcyBpZjpkZXZzaXRlID8+IGRldnNpdGU8P2NzIC9pZiA/Pj4KLTw/Y3MgaW5jbHVkZToiaGVhZF90YWcuY3MiID8+Ci08Ym9keSBjbGFzcz0iZ2MtZG9jdW1lbnRhdGlvbiA8P2NzIGlmOihyZWZlcmVuY2UuZ21zIHx8IHJlZmVyZW5jZS5nY20pID8+Z29vZ2xlPD9jcyAvaWYgPz4KLSAgPD9jcyBpZjooZ3VpZGV8fGRldmVsb3B8fHRyYWluaW5nfHxyZWZlcmVuY2V8fHRvb2xzfHxzZGspID8+ZGV2ZWxvcDw/Y3MKLSAgZWxpZjpkZXNpZ24gPz5kZXNpZ248P2NzCi0gIGVsaWY6ZGlzdHJpYnV0ZSA/PmRpc3RyaWJ1dGU8P2NzCi0gIC9pZiA/PiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9BcnRpY2xlIj4KLSAgPGRpdiBpZD0iZG9jLWFwaS1sZXZlbCIgY2xhc3M9Ijw/Y3MgdmFyOmNsYXNzLnNpbmNlID8+IiBzdHlsZT0iZGlzcGxheTpub25lIj48L2Rpdj4KLSAgPGEgbmFtZT0idG9wIj48L2E+Ci08P2NzIGluY2x1ZGU6ImhlYWRlci5jcyIgPz4KLQotPGRpdiBjbGFzcz0iY29sLTEyIiAgaWQ9ImRvYy1jb2wiPgotCi08ZGl2IGlkPSJhcGktaW5mby1ibG9jayI+Ci0KLTw/Y3MgIyBhcmUgdGhlcmUgaW5oZXJpdGVkIG1lbWJlcnMgPz4KLTw/Y3MgZWFjaDpjbD1jbGFzcy5pbmhlcml0ZWQgPz4KLSAgPD9jcyBpZjpzdWJjb3VudChjbC5tZXRob2RzKSA/PgotICAgPD9jcyBzZXQ6aW5obWV0aG9kcyA9ICMxID8+Ci0gIDw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6c3ViY291bnQoY2wuY29uc3RhbnRzKSA/PgotICAgPD9jcyBzZXQ6aW5oY29uc3RhbnRzID0gIzEgPz4KLSAgPD9jcyAvaWYgPz4KLSAgPD9jcyBpZjpzdWJjb3VudChjbC5maWVsZHMpID8+Ci0gICA8P2NzIHNldDppbmhmaWVsZHMgPSAjMSA/PgotICA8P2NzIC9pZiA/PgotICA8P2NzIGlmOnN1YmNvdW50KGNsLmF0dHJzKSA/PgotICAgPD9jcyBzZXQ6aW5oYXR0cnMgPSAjMSA/PgotICA8P2NzIC9pZiA/PgotPD9jcyAvZWFjaCA/PgotCi08ZGl2IGNsYXNzPSJzdW0tZGV0YWlscy1saW5rcyI+Ci08P2NzIGlmOmluaGF0dHJzIHx8IGluaGNvbnN0YW50cyB8fCBpbmhmaWVsZHMgfHwgaW5obWV0aG9kcyB8fCAoIWNsYXNzLnN1YmNsYXNzZXMuaGlkZGVuICYmCi0gICAgIChzdWJjb3VudChjbGFzcy5zdWJjbGFzc2VzLmRpcmVjdCkgfHwgc3ViY291bnQoY2xhc3Muc3ViY2xhc3Nlcy5pbmRpcmVjdCkpKSA/PgotU3VtbWFyeToKLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuaW5uZXJzKSA/PgotICA8YSBocmVmPSIjbmVzdGVkY2xhc3NlcyI+TmVzdGVkIENsYXNzZXM8L2E+Ci0gIDw/Y3Mgc2V0Omxpbmtjb3VudCA9ICMxID8+Ci08P2NzIC9pZiA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5hdHRycykgPz4KLSAgPD9jcyBpZjpsaW5rY291bnQgPz4mIzEyNDsgPD9jcyAvaWYgPz48YSBocmVmPSIjbGF0dHJzIj5YTUwgQXR0cnM8L2E+Ci0gIDw/Y3Mgc2V0Omxpbmtjb3VudCA9ICMxID8+Ci08P2NzIC9pZiA/PgotPD9jcyBpZjppbmhhdHRycyA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNpbmhhdHRycyI+SW5oZXJpdGVkIFhNTCBBdHRyczwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmVudW1Db25zdGFudHMpID8+Ci0gIDw/Y3MgaWY6bGlua2NvdW50ID8+JiMxMjQ7IDw/Y3MgL2lmID8+PGEgaHJlZj0iI2VudW1jb25zdGFudHMiPkVudW1zPC9hPgotICA8P2NzIHNldDpsaW5rY291bnQgPSAjMSA/PgotPD9jcyAvaWYgPz4KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuY29uc3RhbnRzKSA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNjb25zdGFudHMiPkNvbnN0YW50czwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOmluaGNvbnN0YW50cyA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNpbmhjb25zdGFudHMiPkluaGVyaXRlZCBDb25zdGFudHM8L2E+Ci0gIDw/Y3Mgc2V0Omxpbmtjb3VudCA9ICMxID8+Ci08P2NzIC9pZiA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5maWVsZHMpID8+Ci0gIDw/Y3MgaWY6bGlua2NvdW50ID8+JiMxMjQ7IDw/Y3MgL2lmID8+PGEgaHJlZj0iI2xmaWVsZHMiPkZpZWxkczwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOmluaGZpZWxkcyA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNpbmhmaWVsZHMiPkluaGVyaXRlZCBGaWVsZHM8L2E+Ci0gIDw/Y3Mgc2V0Omxpbmtjb3VudCA9ICMxID8+Ci08P2NzIC9pZiA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5jdG9ycy5wdWJsaWMpID8+Ci0gIDw/Y3MgaWY6bGlua2NvdW50ID8+JiMxMjQ7IDw/Y3MgL2lmID8+PGEgaHJlZj0iI3B1YmN0b3JzIj5DdG9yczwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmN0b3JzLnByb3RlY3RlZCkgPz4KLSAgPD9jcyBpZjpsaW5rY291bnQgPz4mIzEyNDsgPD9jcyAvaWYgPz48YSBocmVmPSIjcHJvY3RvcnMiPlByb3RlY3RlZCBDdG9yczwvYT4KLSAgPD9jcyBzZXQ6bGlua2NvdW50ID0gIzEgPz4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLm1ldGhvZHMucHVibGljKSA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNwdWJtZXRob2RzIj5NZXRob2RzPC9hPgotICA8P2NzIHNldDpsaW5rY291bnQgPSAjMSA/PgotPD9jcyAvaWYgPz4KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MubWV0aG9kcy5wcm90ZWN0ZWQpID8+Ci0gIDw/Y3MgaWY6bGlua2NvdW50ID8+JiMxMjQ7IDw/Y3MgL2lmID8+PGEgaHJlZj0iI3Byb21ldGhvZHMiPlByb3RlY3RlZCBNZXRob2RzPC9hPgotICA8P2NzIHNldDpsaW5rY291bnQgPSAjMSA/PgotPD9jcyAvaWYgPz4KLTw/Y3MgaWY6aW5obWV0aG9kcyA/PgotICA8P2NzIGlmOmxpbmtjb3VudCA/PiYjMTI0OyA8P2NzIC9pZiA/PjxhIGhyZWY9IiNpbmhtZXRob2RzIj5Jbmhlcml0ZWQgTWV0aG9kczwvYT4KLTw/Y3MgL2lmID8+Ci0mIzEyNDsgPGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIHRvZ2dsZUFsbENsYXNzSW5oZXJpdGVkKCkiIGlkPSJ0b2dnbGVBbGxDbGFzc0luaGVyaXRlZCI+W0V4cGFuZCBBbGxdPC9hPgotPD9jcyAvaWYgPz4KLTwvZGl2PjwhLS0gZW5kIHN1bS1kZXRhaWxzLWxpbmtzIC0tPgotPGRpdiBjbGFzcz0iYXBpLWxldmVsIj4KLSAgPD9jcyBjYWxsOnNpbmNlX3RhZ3MoY2xhc3MpID8+PD9jcwotICBpZjpjbGFzcy5kZXByZWNhdGVkc2luY2UKLSAgICA/Pjxicj5EZXByZWNhdGVkIHNpbmNlIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50Lmh0bWwjQXBpTGV2ZWxzIgotICAgICAgICA+QVBJIGxldmVsIDw/Y3MgdmFyOmNsYXNzLmRlcHJlY2F0ZWRzaW5jZSA/PjwvYT48P2NzCi0gIC9pZiA/PgotICA8P2NzIGNhbGw6ZmVkZXJhdGVkX3JlZnMoY2xhc3MpID8+Ci08L2Rpdj4KLTwvZGl2PjwhLS0gZW5kIGFwaS1pbmZvLWJsb2NrIC0tPgotCi08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgotCi08ZGl2IGlkPSJqZC1oZWFkZXIiPgotICAgIDw/Y3MgdmFyOmNsYXNzLnNjb3BlID8+Ci0gICAgPD9jcyB2YXI6Y2xhc3Muc3RhdGljID8+IAotICAgIDw/Y3MgdmFyOmNsYXNzLmZpbmFsID8+IAotICAgIDw/Y3MgdmFyOmNsYXNzLmFic3RyYWN0ID8+Ci0gICAgPD9jcyB2YXI6Y2xhc3Mua2luZCA/PgotPGgxIGl0ZW1wcm9wPSJuYW1lIj48P2NzIHZhcjpjbGFzcy5uYW1lID8+PC9oMT4KLQotPD9jcyBzZXQ6Y29sc3BhbiA9IHN1YmNvdW50KGNsYXNzLmluaGVyaXRhbmNlKSA/PgotPD9jcyBlYWNoOnN1cHIgPSBjbGFzcy5pbmhlcml0YW5jZSA/PgotICA8P2NzIGlmOmNvbHNwYW4gPT0gMiA/PgotICAgIGV4dGVuZHMgPD9jcyBjYWxsOnR5cGVfbGluayhzdXByLnNob3J0X2NsYXNzKSA/Pjxici8+Ci0gIDw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6bGFzdChzdXByKSAmJiBzdWJjb3VudChzdXByLmludGVyZmFjZXMpID8+Ci0gICAgICBpbXBsZW1lbnRzIAotICAgICAgPD9jcyBlYWNoOnQ9c3Vwci5pbnRlcmZhY2VzID8+Ci0gICAgICAgIDw/Y3MgY2FsbDp0eXBlX2xpbmsodCkgPz4gCi0gICAgICA8P2NzIC9lYWNoID8+Ci0gIDw/Y3MgL2lmID8+Ci0gIDw/Y3Mgc2V0OmNvbHNwYW4gPSBjb2xzcGFuLTEgPz4KLTw/Y3MgL2VhY2ggPz4KLTw/Y3MgY2FsbDpzaG93X2Fubm90YXRpb25zX2xpc3QoY2xhc3MsICI8c3BhbiBjbGFzcz0nYW5ub3RhdGlvbi1tZXNzYWdlJz4iLCAiPC9zcGFuPjxzcGFuIGNsYXNzPSdhbm5vdGF0aW9uLW1lc3NhZ2UnPiIsICI8L3NwYW4+IikgPz4KLQotPC9kaXY+PCEtLSBlbmQgaGVhZGVyIC0tPgotCi08ZGl2IGlkPSJuYU1lc3NhZ2UiPjwvZGl2PgotCi08ZGl2IGlkPSJqZC1jb250ZW50IiBjbGFzcz0iYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsYXNzLnNpbmNlID8+Ij4KLTx0YWJsZSBjbGFzcz0iamQtaW5oZXJpdGFuY2UtdGFibGUiPgotPD9jcyBzZXQ6Y29sc3BhbiA9IHN1YmNvdW50KGNsYXNzLmluaGVyaXRhbmNlKSA/PgotPD9jcyBlYWNoOnN1cHIgPSBjbGFzcy5pbmhlcml0YW5jZSA/PgotICAgIDx0cj4KLSAgICAgICAgPD9jcyBsb29wOmkgPSAxLCAoc3ViY291bnQoY2xhc3MuaW5oZXJpdGFuY2UpLWNvbHNwYW4pLCAxID8+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImpkLWluaGVyaXRhbmNlLXNwYWNlIj4mbmJzcDs8P2NzIGlmOihzdWJjb3VudChjbGFzcy5pbmhlcml0YW5jZSktY29sc3BhbikgPT0gaSA/PiZuYnNwOyZuYnNwOyYjeDIxYjM7PD9jcyAvaWYgPz48L3RkPgotICAgICAgICA8P2NzIC9sb29wID8+IAkKLSAgICAgICAgPHRkIGNvbHNwYW49Ijw/Y3MgdmFyOmNvbHNwYW4gPz4iIGNsYXNzPSJqZC1pbmhlcml0YW5jZS1jbGFzcy1jZWxsIj48P2NzCi0gICAgICAgICAgICBpZjpjb2xzcGFuID09IDEKLSAgICAgICAgICAgICAgICA/Pjw/Y3MgY2FsbDpjbGFzc19uYW1lKGNsYXNzLnF1YWxpZmllZFR5cGUpID8+PD9jcyAKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgPz48P2NzIGNhbGw6dHlwZV9saW5rKHN1cHIuY2xhc3MpID8+PD9jcwotICAgICAgICAgICAgL2lmID8+PC90ZD4KLSAgICA8L3RyPgotICAgIDw/Y3Mgc2V0OmNvbHNwYW4gPSBjb2xzcGFuLTEgPz4KLTw/Y3MgL2VhY2ggPz4KLTwvdGFibGU+Ci0KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci0KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3Muc3ViY2xhc3Nlcy5kaXJlY3QpICYmICFjbGFzcy5zdWJjbGFzc2VzLmhpZGRlbiA/PgotPHRhYmxlIGNsYXNzPSJqZC1zdW10YWJsZSBqZC1zdW10YWJsZS1zdWJjbGFzc2VzIj48dHI+PHRkIGNvbHNwYW49IjEyIiBzdHlsZT0iYm9yZGVyOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowOyI+Ci08P2NzIGNhbGw6ZXhwYW5kb190cmlnZ2VyKCJzdWJjbGFzc2VzLWRpcmVjdCIsICJjbG9zZWQiKSA/Pktub3duIERpcmVjdCBTdWJjbGFzc2VzCi08P2NzIGNhbGw6ZXhwYW5kYWJsZV9jbGFzc19saXN0KCJzdWJjbGFzc2VzLWRpcmVjdCIsIGNsYXNzLnN1YmNsYXNzZXMuZGlyZWN0LCAibGlzdCIpID8+Ci08L3RkPjwvdHI+PC90YWJsZT4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3Muc3ViY2xhc3Nlcy5pbmRpcmVjdCkgJiYgIWNsYXNzLnN1YmNsYXNzZXMuaGlkZGVuID8+Ci08dGFibGUgY2xhc3M9ImpkLXN1bXRhYmxlIGpkLXN1bXRhYmxlLXN1YmNsYXNzZXMiPjx0cj48dGQgY29sc3Bhbj0iMTIiIHN0eWxlPSJib3JkZXI6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7Ij4KLTw/Y3MgY2FsbDpleHBhbmRvX3RyaWdnZXIoInN1YmNsYXNzZXMtaW5kaXJlY3QiLCAiY2xvc2VkIikgPz5Lbm93biBJbmRpcmVjdCBTdWJjbGFzc2VzCi08P2NzIGNhbGw6ZXhwYW5kYWJsZV9jbGFzc19saXN0KCJzdWJjbGFzc2VzLWluZGlyZWN0IiwgY2xhc3Muc3ViY2xhc3Nlcy5pbmRpcmVjdCwgImxpc3QiKSA/PgotPC90ZD48L3RyPjwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08ZGl2IGNsYXNzPSJqZC1kZXNjciI+Ci08P2NzIGNhbGw6ZGVwcmVjYXRlZF93YXJuaW5nKGNsYXNzKSA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5kZXNjcikgPz4KLTxoMj5DbGFzcyBPdmVydmlldzwvaDI+Ci08cCBpdGVtcHJvcD0iYXJ0aWNsZUJvZHkiPjw/Y3MgY2FsbDp0YWdfbGlzdChjbGFzcy5kZXNjcikgPz48L3A+Ci08P2NzIC9pZiA/PgotCi08P2NzIGNhbGw6c2VlX2Fsc29fdGFncyhjbGFzcy5zZWVBbHNvKSA/PgotCi08L2Rpdj48IS0tIGpkLWRlc2NyIC0tPgotCi0KLTw/Y3MgIyBzdW1tYXJ5IG1hY3JvcyA/PgotCi08P2NzIGRlZjp3cml0ZV9tZXRob2Rfc3VtbWFyeShtZXRob2RzLCBpbmNsdWRlZCkgPz4KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLTw/Y3MgZWFjaDptZXRob2QgPSBtZXRob2RzID8+Ci0JIDw/Y3MgIyBUaGUgYXBpbGV2ZWwtTiBjbGFzcyBNVVNUIEJFIExBU1QgaW4gdGhlIHNlcXVlbmNlIG9mIGNsYXNzIG5hbWVzID8+Ci0gICAgPHRyIGNsYXNzPSI8P2NzIGlmOmNvdW50ICUgIzIgPz5hbHQtY29sb3I8P2NzIC9pZiA/PiBhcGkgYXBpbGV2ZWwtPD9jcyB2YXI6bWV0aG9kLnNpbmNlID8+IiA+Ci0gICAgICAgIDx0ZCBjbGFzcz0iamQtdHlwZWNvbCI+PG5vYnI+Ci0gICAgICAgICAgICA8P2NzIHZhcjptZXRob2QuYWJzdHJhY3QgPz4KLSAgICAgICAgICAgIDw/Y3MgdmFyOm1ldGhvZC5kZWZhdWx0ID8+Ci0gICAgICAgICAgICA8P2NzIHZhcjptZXRob2Quc3RhdGljID8+Ci0gICAgICAgICAgICA8P2NzIHZhcjptZXRob2QuZmluYWwgPz4KLSAgICAgICAgICAgIDw/Y3MgY2FsbDp0eXBlX2xpbmsobWV0aG9kLmdlbmVyaWMpID8+Ci0gICAgICAgICAgICA8P2NzIGNhbGw6dHlwZV9saW5rKG1ldGhvZC5yZXR1cm5UeXBlKSA/Pjwvbm9icj4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIiB3aWR0aD0iMTAwJSI+PG5vYnI+Ci0gICAgICAgIDxzcGFuIGNsYXNzPSJzeW1wYWQiPjw/Y3MgY2FsbDpjb25kX2xpbmsobWV0aG9kLm5hbWUsIHRvcm9vdCwgbWV0aG9kLmhyZWYsIGluY2x1ZGVkKSA/Pjwvc3Bhbj4oPD9jcyBjYWxsOnBhcmFtZXRlcl9saXN0KG1ldGhvZC5wYXJhbXMpID8+KTwvbm9icj4KLSAgICAgICAgPD9jcyBpZjpzdWJjb3VudChtZXRob2Quc2hvcnREZXNjcikgfHwgc3ViY291bnQobWV0aG9kLmRlcHJlY2F0ZWQpID8+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImpkLWRlc2NyZGl2Ij48P2NzIGNhbGw6c2hvcnRfZGVzY3IobWV0aG9kKSA/PjwvZGl2PgotICA8P2NzIC9pZiA/PgotICA8L3RkPjwvdHI+Ci08P2NzIHNldDpjb3VudCA9IGNvdW50ICsgIzEgPz4KLTw/Y3MgL2VhY2ggPz4KLTw/Y3MgL2RlZiA/PgotCi08P2NzIGRlZjp3cml0ZV9maWVsZF9zdW1tYXJ5KGZpZWxkcywgaW5jbHVkZWQpID8+Ci08P2NzIHNldDpjb3VudCA9ICMxID8+Ci0gICAgPD9jcyBlYWNoOmZpZWxkPWZpZWxkcyA/PgotICAgICAgPHRyIGNsYXNzPSI8P2NzIGlmOmNvdW50ICUgIzIgPz5hbHQtY29sb3I8P2NzIC9pZiA/PiBhcGkgYXBpbGV2ZWwtPD9jcyB2YXI6ZmllbGQuc2luY2UgPz4iID4KLSAgICAgICAgICA8dGQgY2xhc3M9ImpkLXR5cGVjb2wiPjxub2JyPgotICAgICAgICAgIDw/Y3MgdmFyOmZpZWxkLnNjb3BlID8+Ci0gICAgICAgICAgPD9jcyB2YXI6ZmllbGQuc3RhdGljID8+Ci0gICAgICAgICAgPD9jcyB2YXI6ZmllbGQuZmluYWwgPz4KLSAgICAgICAgICA8P2NzIGNhbGw6dHlwZV9saW5rKGZpZWxkLnR5cGUpID8+PC9ub2JyPjwvdGQ+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIj48P2NzIGNhbGw6Y29uZF9saW5rKGZpZWxkLm5hbWUsIHRvcm9vdCwgZmllbGQuaHJlZiwgaW5jbHVkZWQpID8+PC90ZD4KLSAgICAgICAgICA8dGQgY2xhc3M9ImpkLWRlc2NyY29sIiB3aWR0aD0iMTAwJSI+PD9jcyBjYWxsOnNob3J0X2Rlc2NyKGZpZWxkKSA/PgotICAgICAgICAgICAgICA8P2NzIGVhY2g6YW5ubyA9IGZpZWxkLnNob3dBbm5vdGF0aW9ucyA/PgotICAgICAgICAgICAgICAgICAgPD9jcyBjYWxsOnNob3dfYW5ub3RhdGlvbnNfbGlzdChmaWVsZCwgIjxzcGFuIGNsYXNzPSdhbm5vdGF0aW9uLW1lc3NhZ2UnPiIsICI8L3NwYW4+PHNwYW4gY2xhc3M9J2Fubm90YXRpb24tbWVzc2FnZSc+IiwgIjwvc3Bhbj4iKSA/PgotICAgICAgICAgICAgICA8P2NzIC9lYWNoID8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8P2NzIHNldDpjb3VudCA9IGNvdW50ICsgIzEgPz4KLSAgICA8P2NzIC9lYWNoID8+Ci08P2NzIC9kZWYgPz4KLQotPD9jcyBkZWY6d3JpdGVfY29uc3RhbnRfc3VtbWFyeShmaWVsZHMsIGluY2x1ZGVkKSA/PgotPD9jcyBzZXQ6Y291bnQgPSAjMSA/PgotICAgIDw/Y3MgZWFjaDpmaWVsZD1maWVsZHMgPz4KLSAgICA8dHIgY2xhc3M9Ijw/Y3MgaWY6Y291bnQgJSAjMiA/PmFsdC1jb2xvcjw/Y3MgL2lmID8+IGFwaSBhcGlsZXZlbC08P2NzIHZhcjpmaWVsZC5zaW5jZSA/PiIgPgotICAgICAgICA8dGQgY2xhc3M9ImpkLXR5cGVjb2wiPjw/Y3MgY2FsbDp0eXBlX2xpbmsoZmllbGQudHlwZSkgPz48L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWxpbmtjb2wiPjw/Y3MgY2FsbDpjb25kX2xpbmsoZmllbGQubmFtZSwgdG9yb290LCBmaWVsZC5ocmVmLCBpbmNsdWRlZCkgPz48L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWRlc2NyY29sIiB3aWR0aD0iMTAwJSI+PD9jcyBjYWxsOnNob3J0X2Rlc2NyKGZpZWxkKSA/PjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8P2NzIHNldDpjb3VudCA9IGNvdW50ICsgIzEgPz4KLSAgICA8P2NzIC9lYWNoID8+Ci08P2NzIC9kZWYgPz4KLQotPD9jcyBkZWY6d3JpdGVfYXR0cl9zdW1tYXJ5KGF0dHJzLCBpbmNsdWRlZCkgPz4KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZD48bm9icj48ZW0+QXR0cmlidXRlIE5hbWU8L2VtPjwvbm9icj48L3RkPgotICAgICAgICA8dGQ+PG5vYnI+PGVtPlJlbGF0ZWQgTWV0aG9kPC9lbT48L25vYnI+PC90ZD4KLSAgICAgICAgPHRkPjxub2JyPjxlbT5EZXNjcmlwdGlvbjwvZW0+PC9ub2JyPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8P2NzIGVhY2g6YXR0cj1hdHRycyA/PgotICAgIDx0ciBjbGFzcz0iPD9jcyBpZjpjb3VudCAlICMyID8+YWx0LWNvbG9yPD9jcyAvaWYgPz4gYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmF0dHIuc2luY2UgPz4iID4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIj48P2NzIGlmOmluY2x1ZGVkID8+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+PD9jcyB2YXI6YXR0ci5ocmVmID8+Ij48P2NzIC9pZiA/Pjw/Y3MgdmFyOmF0dHIubmFtZSA/Pjw/Y3MgaWY6aW5jbHVkZWQgPz48L2E+PD9jcyAvaWYgPz48L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWxpbmtjb2wiPjw/Y3MgZWFjaDptPWF0dHIubWV0aG9kcyA/PgotICAgICAgICAgICAgPD9jcyBjYWxsOmNvbmRfbGluayhtLm5hbWUsIHRvcm9vdCwgbS5ocmVmLCBpbmNsdWRlZCkgPz4KLSAgICAgICAgICAgIDw/Y3MgL2VhY2ggPz4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1kZXNjcmNvbCIgd2lkdGg9IjEwMCUiPjw/Y3MgY2FsbDpzaG9ydF9kZXNjcihhdHRyKSA/PiZuYnNwOzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8P2NzIHNldDpjb3VudCA9IGNvdW50ICsgIzEgPz4KLSAgICA8P2NzIC9lYWNoID8+Ci08P2NzIC9kZWYgPz4KLQotPD9jcyBkZWY6d3JpdGVfaW5uZXJzX3N1bW1hcnkoY2xhc3NlcykgPz4KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLSAgPD9jcyBlYWNoOmNsPWNsYXNzLmlubmVycyA/PgotICAgIDx0ciBjbGFzcz0iPD9jcyBpZjpjb3VudCAlICMyID8+YWx0LWNvbG9yPD9jcyAvaWYgPz4gYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsLnNpbmNlID8+IiA+Ci0gICAgICA8dGQgY2xhc3M9ImpkLXR5cGVjb2wiPjxub2JyPgotICAgICAgICA8P2NzIHZhcjpjbC5zY29wZSA/PgotICAgICAgICA8P2NzIHZhcjpjbC5zdGF0aWMgPz4gCi0gICAgICAgIDw/Y3MgdmFyOmNsLmZpbmFsID8+IAotICAgICAgICA8P2NzIHZhcjpjbC5hYnN0cmFjdCA/PgotICAgICAgICA8P2NzIHZhcjpjbC5raW5kID8+PC9ub2JyPjwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9ImpkLWxpbmtjb2wiPjw/Y3MgY2FsbDp0eXBlX2xpbmsoY2wudHlwZSkgPz48L3RkPgotICAgICAgPHRkIGNsYXNzPSJqZC1kZXNjcmNvbCIgd2lkdGg9IjEwMCUiPjw/Y3MgY2FsbDpzaG9ydF9kZXNjcihjbCkgPz4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPD9jcyBzZXQ6Y291bnQgPSBjb3VudCArICMxID8+Ci0gICAgPD9jcyAvZWFjaCA/PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MgIyBlbmQgbWFjcm9zID8+Ci0KLTxkaXYgY2xhc3M9ImpkLWRlc2NyIj4KLTw/Y3MgIyBtYWtlIHN1cmUgdGhlcmUncyBhIHN1bW1hcnkgdmlldyB0byBkaXNwbGF5ID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmlubmVycykKLSAgICAgfHwgc3ViY291bnQoY2xhc3MuYXR0cnMpCi0gICAgIHx8IGluaGF0dHJzCi0gICAgIHx8IHN1YmNvdW50KGNsYXNzLmVudW1Db25zdGFudHMpCi0gICAgIHx8IHN1YmNvdW50KGNsYXNzLmNvbnN0YW50cykKLSAgICAgfHwgaW5oY29uc3RhbnRzCi0gICAgIHx8IHN1YmNvdW50KGNsYXNzLmZpZWxkcykKLSAgICAgfHwgaW5oZmllbGRzCi0gICAgIHx8IHN1YmNvdW50KGNsYXNzLmN0b3JzLnB1YmxpYykKLSAgICAgfHwgc3ViY291bnQoY2xhc3MuY3RvcnMucHJvdGVjdGVkKQotICAgICB8fCBzdWJjb3VudChjbGFzcy5tZXRob2RzLnB1YmxpYykKLSAgICAgfHwgc3ViY291bnQoY2xhc3MubWV0aG9kcy5wcm90ZWN0ZWQpCi0gICAgIHx8IGluaG1ldGhvZHMgPz4KLTxoMj5TdW1tYXJ5PC9oMj4KLQotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5pbm5lcnMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PSBORVNURUQgQ0xBU1MgU1VNTUFSWSA9PT09PT09PSAtLT4KLTx0YWJsZSBpZD0ibmVzdGVkY2xhc3NlcyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5OZXN0ZWQgQ2xhc3NlczwvdGg+PC90cj4KLTw/Y3MgY2FsbDp3cml0ZV9pbm5lcnNfc3VtbWFyeShjbGFzcy5pbm5lcnMpID8+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5hdHRycykgPz4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0ibGF0dHJzIiBjbGFzcz0iamQtc3VtdGFibGUiPjx0cj48dGggY29sc3Bhbj0iMTIiPlhNTCBBdHRyaWJ1dGVzPC90aD48L3RyPgotPD9jcyBjYWxsOndyaXRlX2F0dHJfc3VtbWFyeShjbGFzcy5hdHRycywgMSkgPz4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgIyBpZiB0aGVyZSBhcmUgaW5oZXJpdGVkIGF0dHJzLCB3cml0ZSB0aGUgdGFibGUgPz4KLTw/Y3MgaWY6aW5oYXR0cnMgPz4KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImluaGF0dHJzIiBjbGFzcz0iamQtc3VtdGFibGUiPjx0cj48dGg+Ci0gIDxhIGhyZWY9IiMiIGNsYXNzPSJ0b2dnbGUtYWxsIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlQWxsSW5oZXJpdGVkKHRoaXMsIG51bGwpIj5bRXhwYW5kXTwvYT4KLSAgPGRpdiBzdHlsZT0iY2xlYXI6bGVmdDsiPkluaGVyaXRlZCBYTUwgQXR0cmlidXRlczwvZGl2PjwvdGg+PC90cj4KLTw/Y3MgZWFjaDpjbD1jbGFzcy5pbmhlcml0ZWQgPz4KLTw/Y3MgaWY6c3ViY291bnQoY2wuYXR0cnMpID8+Ci08dHIgY2xhc3M9ImFwaSBhcGlsZXZlbC08P2NzIHZhcjpjbC5zaW5jZSA/PiIgPgotPHRkIGNvbHNwYW49IjEyIj4KLTw/Y3MgY2FsbDpleHBhbmRvX3RyaWdnZXIoImluaGVyaXRlZC1hdHRycy0iK2NsLnF1YWxpZmllZCwgImNsb3NlZCIpID8+RnJvbSA8P2NzIHZhcjpjbC5raW5kID8+Ci08P2NzIGNhbGw6Y29uZF9saW5rKGNsLnF1YWxpZmllZCwgdG9yb290LCBjbC5saW5rLCBjbC5pbmNsdWRlZCkgPz4KLTxkaXYgaWQ9ImluaGVyaXRlZC1hdHRycy08P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4iPgotICA8ZGl2IGlkPSJpbmhlcml0ZWQtYXR0cnMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+LWxpc3QiCi0gICAgICAgIGNsYXNzPSJqZC1pbmhlcml0ZWRsaW5rcyI+Ci0gIDwvZGl2PgotICA8ZGl2IGlkPSJpbmhlcml0ZWQtYXR0cnMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+LXN1bW1hcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Ci0gICAgPHRhYmxlIGNsYXNzPSJqZC1zdW10YWJsZS1leHBhbmRvIj4KLSAgICA8P2NzIGNhbGw6d3JpdGVfYXR0cl9zdW1tYXJ5KGNsLmF0dHJzLCBjbC5pbmNsdWRlZCkgPz48L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPC90ZD48L3RyPgotPD9jcyAvaWYgPz4KLTw/Y3MgL2VhY2ggPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmVudW1Db25zdGFudHMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT09PSBFTlVNIENPTlNUQU5UIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImVudW1jb25zdGFudHMiIGNsYXNzPSJqZC1zdW10YWJsZSI+PHRyPjx0aCBjb2xzcGFuPSIxMiI+RW51bSBWYWx1ZXM8L3RoPjwvdHI+Ci08P2NzIHNldDpjb3VudCA9ICMxID8+Ci0gICAgPD9jcyBlYWNoOmZpZWxkPWNsYXNzLmVudW1Db25zdGFudHMgPz4KLSAgICA8dHIgY2xhc3M9Ijw/Y3MgaWY6Y291bnQgJSAjMiA/PmFsdC1jb2xvcjw/Y3MgL2lmID8+IGFwaSBhcGlsZXZlbC08P2NzIHZhcjpmaWVsZC5zaW5jZSA/PiIgPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWRlc2NyY29sIj48P2NzIGNhbGw6dHlwZV9saW5rKGZpZWxkLnR5cGUpID8+Jm5ic3A7PC90ZD4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIj48P2NzIGNhbGw6Y29uZF9saW5rKGZpZWxkLm5hbWUsIHRvcm9vdCwgZmllbGQuaHJlZiwgY2wuaW5jbHVkZWQpID8+Jm5ic3A7PC90ZD4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1kZXNjcmNvbCIgd2lkdGg9IjEwMCUiPjw/Y3MgY2FsbDpzaG9ydF9kZXNjcihmaWVsZCkgPz4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPD9jcyBzZXQ6Y291bnQgPSBjb3VudCArICMxID8+Ci0gICAgPD9jcyAvZWFjaCA/PgotPD9jcyAvaWYgPz4KLQotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5jb25zdGFudHMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT09PSBFTlVNIENPTlNUQU5UIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImNvbnN0YW50cyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5Db25zdGFudHM8L3RoPjwvdHI+Ci08P2NzIGNhbGw6d3JpdGVfY29uc3RhbnRfc3VtbWFyeShjbGFzcy5jb25zdGFudHMsIDEpID8+Ci08L3RhYmxlPgotPD9jcyAvaWYgPz4KLQotPD9jcyAjIGlmIHRoZXJlIGFyZSBpbmhlcml0ZWQgY29uc3RhbnRzLCB3cml0ZSB0aGUgdGFibGUgPz4KLTw/Y3MgaWY6aW5oY29uc3RhbnRzID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT09PSBFTlVNIENPTlNUQU5UIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImluaGNvbnN0YW50cyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoPgotICA8YSBocmVmPSIjIiBjbGFzcz0idG9nZ2xlLWFsbCIgb25jbGljaz0icmV0dXJuIHRvZ2dsZUFsbEluaGVyaXRlZCh0aGlzLCBudWxsKSI+W0V4cGFuZF08L2E+Ci0gIDxkaXYgc3R5bGU9ImNsZWFyOmxlZnQ7Ij5Jbmhlcml0ZWQgQ29uc3RhbnRzPC9kaXY+PC90aD48L3RyPgotPD9jcyBlYWNoOmNsPWNsYXNzLmluaGVyaXRlZCA/PgotPD9jcyBpZjpzdWJjb3VudChjbC5jb25zdGFudHMpID8+Ci08dHIgY2xhc3M9ImFwaSBhcGlsZXZlbC08P2NzIHZhcjpjbC5zaW5jZSA/PiIgPgotPHRkIGNvbHNwYW49IjEyIj4KLTw/Y3MgY2FsbDpleHBhbmRvX3RyaWdnZXIoImluaGVyaXRlZC1jb25zdGFudHMtIitjbC5xdWFsaWZpZWQsICJjbG9zZWQiKSA/PkZyb20gPD9jcyB2YXI6Y2wua2luZCA/PgotPD9jcyBjYWxsOmNvbmRfbGluayhjbC5xdWFsaWZpZWQsIHRvcm9vdCwgY2wubGluaywgY2wuaW5jbHVkZWQpID8+Ci08ZGl2IGlkPSJpbmhlcml0ZWQtY29uc3RhbnRzLTw/Y3MgdmFyOmNsLnF1YWxpZmllZCA/PiI+Ci0gIDxkaXYgaWQ9ImluaGVyaXRlZC1jb25zdGFudHMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+LWxpc3QiCi0gICAgICAgIGNsYXNzPSJqZC1pbmhlcml0ZWRsaW5rcyI+Ci0gIDwvZGl2PgotICA8ZGl2IGlkPSJpbmhlcml0ZWQtY29uc3RhbnRzLTw/Y3MgdmFyOmNsLnF1YWxpZmllZCA/Pi1zdW1tYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgotICAgIDx0YWJsZSBjbGFzcz0iamQtc3VtdGFibGUtZXhwYW5kbyI+Ci0gICAgPD9jcyBjYWxsOndyaXRlX2NvbnN0YW50X3N1bW1hcnkoY2wuY29uc3RhbnRzLCBjbC5pbmNsdWRlZCkgPz48L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPC90ZD48L3RyPgotPD9jcyAvaWYgPz4KLTw/Y3MgL2VhY2ggPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmZpZWxkcykgPz4KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci08IS0tID09PT09PT09PT09IEZJRUxEIFNVTU1BUlkgPT09PT09PT09PT0gLS0+Ci08dGFibGUgaWQ9ImxmaWVsZHMiIGNsYXNzPSJqZC1zdW10YWJsZSI+PHRyPjx0aCBjb2xzcGFuPSIxMiI+RmllbGRzPC90aD48L3RyPgotPD9jcyBjYWxsOndyaXRlX2ZpZWxkX3N1bW1hcnkoY2xhc3MuZmllbGRzLCAxKSA/PgotPC90YWJsZT4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgIyBpZiB0aGVyZSBhcmUgaW5oZXJpdGVkIGZpZWxkcywgd3JpdGUgdGhlIHRhYmxlID8+Ci08P2NzIGlmOmluaGZpZWxkcyA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09PT0gRklFTEQgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0iaW5oZmllbGRzIiBjbGFzcz0iamQtc3VtdGFibGUiPjx0cj48dGg+Ci0gIDxhIGhyZWY9IiMiIGNsYXNzPSJ0b2dnbGUtYWxsIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlQWxsSW5oZXJpdGVkKHRoaXMsIG51bGwpIj5bRXhwYW5kXTwvYT4KLSAgPGRpdiBzdHlsZT0iY2xlYXI6bGVmdDsiPkluaGVyaXRlZCBGaWVsZHM8L2Rpdj48L3RoPjwvdHI+Ci08P2NzIGVhY2g6Y2w9Y2xhc3MuaW5oZXJpdGVkID8+Ci08P2NzIGlmOnN1YmNvdW50KGNsLmZpZWxkcykgPz4KLTx0ciBjbGFzcz0iYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsLnNpbmNlID8+IiA+Ci08dGQgY29sc3Bhbj0iMTIiPgotPD9jcyBjYWxsOmV4cGFuZG9fdHJpZ2dlcigiaW5oZXJpdGVkLWZpZWxkcy0iK2NsLnF1YWxpZmllZCwgImNsb3NlZCIpID8+RnJvbSA8P2NzIHZhcjpjbC5raW5kID8+Ci08P2NzIGNhbGw6Y29uZF9saW5rKGNsLnF1YWxpZmllZCwgdG9yb290LCBjbC5saW5rLCBjbC5pbmNsdWRlZCkgPz4KLTxkaXYgaWQ9ImluaGVyaXRlZC1maWVsZHMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+Ij4KLSAgPGRpdiBpZD0iaW5oZXJpdGVkLWZpZWxkcy08P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4tbGlzdCIKLSAgICAgICAgY2xhc3M9ImpkLWluaGVyaXRlZGxpbmtzIj4KLSAgPC9kaXY+Ci0gIDxkaXYgaWQ9ImluaGVyaXRlZC1maWVsZHMtPD9jcyB2YXI6Y2wucXVhbGlmaWVkID8+LXN1bW1hcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Ci0gICAgPHRhYmxlIGNsYXNzPSJqZC1zdW10YWJsZS1leHBhbmRvIj4KLSAgICA8P2NzIGNhbGw6d3JpdGVfZmllbGRfc3VtbWFyeShjbC5maWVsZHMsIGNsLmluY2x1ZGVkKSA/PjwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L3RkPjwvdHI+Ci08P2NzIC9pZiA/PgotPD9jcyAvZWFjaCA/PgotPC90YWJsZT4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuY3RvcnMucHVibGljKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT0gQ09OU1RSVUNUT1IgU1VNTUFSWSA9PT09PT09PSAtLT4KLTx0YWJsZSBpZD0icHViY3RvcnMiIGNsYXNzPSJqZC1zdW10YWJsZSI+PHRyPjx0aCBjb2xzcGFuPSIxMiI+UHVibGljIENvbnN0cnVjdG9yczwvdGg+PC90cj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2Rfc3VtbWFyeShjbGFzcy5jdG9ycy5wdWJsaWMsIDEpID8+Ci08L3RhYmxlPgotPD9jcyAvaWYgPz4KLQotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5jdG9ycy5wcm90ZWN0ZWQpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PSBDT05TVFJVQ1RPUiBTVU1NQVJZID09PT09PT09IC0tPgotPHRhYmxlIGlkPSJwcm9jdG9ycyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5Qcm90ZWN0ZWQgQ29uc3RydWN0b3JzPC90aD48L3RyPgotPD9jcyBjYWxsOndyaXRlX21ldGhvZF9zdW1tYXJ5KGNsYXNzLmN0b3JzLnByb3RlY3RlZCwgMSkgPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzIGlmOnN1YmNvdW50KGNsYXNzLm1ldGhvZHMucHVibGljKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0icHVibWV0aG9kcyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5QdWJsaWMgTWV0aG9kczwvdGg+PC90cj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2Rfc3VtbWFyeShjbGFzcy5tZXRob2RzLnB1YmxpYywgMSkgPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzIGlmOnN1YmNvdW50KGNsYXNzLm1ldGhvZHMucHJvdGVjdGVkKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0icHJvbWV0aG9kcyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoIGNvbHNwYW49IjEyIj5Qcm90ZWN0ZWQgTWV0aG9kczwvdGg+PC90cj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2Rfc3VtbWFyeShjbGFzcy5tZXRob2RzLnByb3RlY3RlZCwgMSkgPz4KLTwvdGFibGU+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgaWYgdGhlcmUgYXJlIGluaGVyaXRlZCBtZXRob2RzLCB3cml0ZSB0aGUgdGFibGUgPz4KLTw/Y3MgaWY6aW5obWV0aG9kcyA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KLTx0YWJsZSBpZD0iaW5obWV0aG9kcyIgY2xhc3M9ImpkLXN1bXRhYmxlIj48dHI+PHRoPgotICA8YSBocmVmPSIjIiBjbGFzcz0idG9nZ2xlLWFsbCIgb25jbGljaz0icmV0dXJuIHRvZ2dsZUFsbEluaGVyaXRlZCh0aGlzLCBudWxsKSI+W0V4cGFuZF08L2E+Ci0gIDxkaXYgc3R5bGU9ImNsZWFyOmxlZnQ7Ij5Jbmhlcml0ZWQgTWV0aG9kczwvZGl2PjwvdGg+PC90cj4KLTw/Y3MgZWFjaDpjbD1jbGFzcy5pbmhlcml0ZWQgPz4KLTw/Y3MgaWY6c3ViY291bnQoY2wubWV0aG9kcykgPz4KLTx0ciBjbGFzcz0iYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsLnNpbmNlID8+IiA+Ci08dGQgY29sc3Bhbj0iMTIiPjw/Y3MgY2FsbDpleHBhbmRvX3RyaWdnZXIoImluaGVyaXRlZC1tZXRob2RzLSIrY2wucXVhbGlmaWVkLCAiY2xvc2VkIikgPz4KLUZyb20gPD9jcyB2YXI6Y2wua2luZCA/PgotPD9jcyBpZjpjbC5pbmNsdWRlZCA/PgotICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz48P2NzIHZhcjpjbC5saW5rID8+Ij48P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz48L2E+Ci08P2NzIGVsaWY6Y2wuZmVkZXJhdGVkID8+Ci0gIDxhIGhyZWY9Ijw/Y3MgdmFyOmNsLmxpbmsgPz4iPjw/Y3MgdmFyOmNsLnF1YWxpZmllZCA/PjwvYT4KLTw/Y3MgZWxzZSA/PgotICA8P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4KLTw/Y3MgL2lmID8+Ci08ZGl2IGlkPSJpbmhlcml0ZWQtbWV0aG9kcy08P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4iPgotICA8ZGl2IGlkPSJpbmhlcml0ZWQtbWV0aG9kcy08P2NzIHZhcjpjbC5xdWFsaWZpZWQgPz4tbGlzdCIKLSAgICAgICAgY2xhc3M9ImpkLWluaGVyaXRlZGxpbmtzIj4KLSAgPC9kaXY+Ci0gIDxkaXYgaWQ9ImluaGVyaXRlZC1tZXRob2RzLTw/Y3MgdmFyOmNsLnF1YWxpZmllZCA/Pi1zdW1tYXJ5IiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgotICAgIDx0YWJsZSBjbGFzcz0iamQtc3VtdGFibGUtZXhwYW5kbyI+Ci0gICAgPD9jcyBjYWxsOndyaXRlX21ldGhvZF9zdW1tYXJ5KGNsLm1ldGhvZHMsIGNsLmluY2x1ZGVkKSA/PjwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L3RkPjwvdHI+Ci08P2NzIC9pZiA/PgotPD9jcyAvZWFjaCA/PgotPC90YWJsZT4KLTw/Y3MgL2lmID8+Ci08P2NzIC9pZiA/PgotPC9kaXY+PCEtLSBqZC1kZXNjciAoc3VtbWFyeSkgLS0+Ci0KLTwhLS0gRGV0YWlscyAtLT4KLQotPD9jcyBkZWY6d3JpdGVfZmllbGRfZGV0YWlscyhmaWVsZHMpID8+Ci08P2NzIGVhY2g6ZmllbGQ9ZmllbGRzID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPD9jcyAjIHRoZSBBIHRhZyBpbiB0aGUgbmV4dCBsaW5lIG11c3QgcmVtYWluIHdoZXJlIGl0IGlzLCBzbyB0aGF0IEVjbGlwc2UgY2FuIHBhcnNlIHRoZSBkb2NzID8+Ci08QSBOQU1FPSI8P2NzIHZhcjpmaWVsZC5hbmNob3IgPz4iPjwvQT4KLTw/Y3MgIyBUaGUgYXBpbGV2ZWwtTiBjbGFzcyBNVVNUIEJFIExBU1QgaW4gdGhlIHNlcXVlbmNlIG9mIGNsYXNzIG5hbWVzID8+Ci08ZGl2IGNsYXNzPSJqZC1kZXRhaWxzIGFwaSBhcGlsZXZlbC08P2NzIHZhcjpmaWVsZC5zaW5jZSA/PiI+IAotICAgIDxoNCBjbGFzcz0iamQtZGV0YWlscy10aXRsZSI+Ci0gICAgICA8c3BhbiBjbGFzcz0ibm9ybWFsIj4KLSAgICAgICAgPD9jcyB2YXI6ZmllbGQuc2NvcGUgPz4gCi0gICAgICAgIDw/Y3MgdmFyOmZpZWxkLnN0YXRpYyA/PiAKLSAgICAgICAgPD9jcyB2YXI6ZmllbGQuZmluYWwgPz4gCi0gICAgICAgIDw/Y3MgY2FsbDp0eXBlX2xpbmsoZmllbGQudHlwZSkgPz4KLSAgICAgIDwvc3Bhbj4KLSAgICAgICAgPD9jcyB2YXI6ZmllbGQubmFtZSA/PgotICAgIDwvaDQ+Ci0gICAgICA8ZGl2IGNsYXNzPSJhcGktbGV2ZWwiPgotICAgICAgICA8P2NzIGNhbGw6c2luY2VfdGFncyhmaWVsZCkgPz4KLSAgICAgICAgPD9jcyBjYWxsOmZlZGVyYXRlZF9yZWZzKGZpZWxkKSA/PgotICAgICAgPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iamQtZGV0YWlscy1kZXNjciI+Ci0gICAgICA8P2NzIGNhbGw6ZGVzY3JpcHRpb24oZmllbGQpID8+Ci0gICAgPD9jcyBpZjpzdWJjb3VudChmaWVsZC5jb25zdGFudFZhbHVlKSA/PgotICAgICAgICA8ZGl2IGNsYXNzPSJqZC10YWdkYXRhIj4KLSAgICAgICAgPHNwYW4gY2xhc3M9ImpkLXRhZ3RpdGxlIj5Db25zdGFudCBWYWx1ZTogPC9zcGFuPgotICAgICAgICA8c3Bhbj4KLSAgICAgICAgICAgIDw/Y3MgaWY6ZmllbGQuY29uc3RhbnRWYWx1ZS5pc1N0cmluZyA/PgotICAgICAgICAgICAgICAgIDw/Y3MgdmFyOmZpZWxkLmNvbnN0YW50VmFsdWUuc3RyID8+Ci0gICAgICAgICAgICA8P2NzIGVsc2UgPz4KLSAgICAgICAgICAgICAgICA8P2NzIHZhcjpmaWVsZC5jb25zdGFudFZhbHVlLmRlYyA/PgotICAgICAgICAgICAgICAgICg8P2NzIHZhcjpmaWVsZC5jb25zdGFudFZhbHVlLmhleCA/PikKLSAgICAgICAgICAgIDw/Y3MgL2lmID8+Ci0gICAgICAgIDwvc3Bhbj4KLSAgICAgICAgPC9kaXY+Ci0gICAgPD9jcyAvaWYgPz4KLSAgICA8L2Rpdj4KLTwvZGl2PgotPD9jcyAvZWFjaCA/PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MgZGVmOndyaXRlX21ldGhvZF9kZXRhaWxzKG1ldGhvZHMpID8+Ci08P2NzIGVhY2g6bWV0aG9kPW1ldGhvZHMgPz4KLTw/Y3MgIyB0aGUgQSB0YWcgaW4gdGhlIG5leHQgbGluZSBtdXN0IHJlbWFpbiB3aGVyZSBpdCBpcywgc28gdGhhdCBFY2xpcHNlIGNhbiBwYXJzZSB0aGUgZG9jcyA/PgotPEEgTkFNRT0iPD9jcyB2YXI6bWV0aG9kLmFuY2hvciA/PiI+PC9BPgotPD9jcyAjIFRoZSBhcGlsZXZlbC1OIGNsYXNzIE1VU1QgQkUgTEFTVCBpbiB0aGUgc2VxdWVuY2Ugb2YgY2xhc3MgbmFtZXMgPz4KLTxkaXYgY2xhc3M9ImpkLWRldGFpbHMgYXBpIGFwaWxldmVsLTw/Y3MgdmFyOm1ldGhvZC5zaW5jZSA/PiI+IAotICAgIDxoNCBjbGFzcz0iamQtZGV0YWlscy10aXRsZSI+Ci0gICAgICA8c3BhbiBjbGFzcz0ibm9ybWFsIj4KLSAgICAgICAgPD9jcyB2YXI6bWV0aG9kLnNjb3BlID8+Ci0gICAgICAgIDw/Y3MgdmFyOm1ldGhvZC5hYnN0cmFjdCA/PgotICAgICAgICA8P2NzIHZhcjptZXRob2QuZGVmYXVsdCA/PgotICAgICAgICA8P2NzIHZhcjptZXRob2Quc3RhdGljID8+Ci0gICAgICAgIDw/Y3MgdmFyOm1ldGhvZC5maW5hbCA/PgotICAgICAgICA8P2NzIGNhbGw6dHlwZV9saW5rKG1ldGhvZC5yZXR1cm5UeXBlKSA/PgotICAgICAgPC9zcGFuPgotICAgICAgPHNwYW4gY2xhc3M9InN5bXBhZCI+PD9jcyB2YXI6bWV0aG9kLm5hbWUgPz48L3NwYW4+Ci0gICAgICA8c3BhbiBjbGFzcz0ibm9ybWFsIj4oPD9jcyBjYWxsOnBhcmFtZXRlcl9saXN0KG1ldGhvZC5wYXJhbXMpID8+KTwvc3Bhbj4KLSAgICA8L2g0PgotICAgICAgPGRpdiBjbGFzcz0iYXBpLWxldmVsIj4KLSAgICAgICAgPGRpdj48P2NzIGNhbGw6c2luY2VfdGFncyhtZXRob2QpID8+PC9kaXY+Ci0gICAgICAgIDw/Y3MgY2FsbDpmZWRlcmF0ZWRfcmVmcyhtZXRob2QpID8+Ci0gICAgICA8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJqZC1kZXRhaWxzLWRlc2NyIj4KLSAgICAgIDw/Y3MgY2FsbDpkZXNjcmlwdGlvbihtZXRob2QpID8+Ci0gICAgPC9kaXY+Ci08L2Rpdj4KLTw/Y3MgL2VhY2ggPz4KLTw/Y3MgL2RlZiA/PgotCi08P2NzIGRlZjp3cml0ZV9hdHRyX2RldGFpbHMoYXR0cnMpID8+Ci08P2NzIGVhY2g6YXR0cj1hdHRycyA/PgotPD9jcyAjIHRoZSBBIHRhZyBpbiB0aGUgbmV4dCBsaW5lIG11c3QgcmVtYWluIHdoZXJlIGl0IGlzLCBzbyB0aGF0IEVjbGlwc2UgY2FuIHBhcnNlIHRoZSBkb2NzID8+Ci08QSBOQU1FPSI8P2NzIHZhcjphdHRyLmFuY2hvciA/PiI+PC9BPgotPGRpdiBjbGFzcz0iamQtZGV0YWlscyI+IAotICAgIDxoNCBjbGFzcz0iamQtZGV0YWlscy10aXRsZSI+PD9jcyB2YXI6YXR0ci5uYW1lID8+Ci0gICAgPC9oND4KLSAgICA8ZGl2IGNsYXNzPSJqZC1kZXRhaWxzLWRlc2NyIj4KLSAgICAgICAgPD9jcyBjYWxsOmRlc2NyaXB0aW9uKGF0dHIpID8+Ci0KLSAgICAgICAgPGRpdiBjbGFzcz0iamQtdGFnZGF0YSI+Ci0gICAgICAgICAgICA8aDUgY2xhc3M9ImpkLXRhZ3RpdGxlIj5SZWxhdGVkIE1ldGhvZHM8L2g1PgotICAgICAgICAgICAgPHVsIGNsYXNzPSJub2xpc3QiPgotICAgICAgICAgICAgPD9jcyBlYWNoOm09YXR0ci5tZXRob2RzID8+Ci0gICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pjw/Y3MgdmFyOm0uaHJlZiA/PiI+PD9jcyB2YXI6bS5uYW1lID8+PC9hPjwvbGk+Ci0gICAgICAgICAgICA8P2NzIC9lYWNoID8+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLTwvZGl2PgotPD9jcyAvZWFjaCA/PgotPD9jcyAvZGVmID8+Ci0KLQotPCEtLSBYTUwgQXR0cmlidXRlcyAtLT4KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuYXR0cnMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09IC0tPgotPGgyPlhNTCBBdHRyaWJ1dGVzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9hdHRyX2RldGFpbHMoY2xhc3MuYXR0cnMpID8+Ci08P2NzIC9pZiA/PgotCi08IS0tIEVudW0gVmFsdWVzIC0tPgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5lbnVtQ29uc3RhbnRzKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09IEVOVU0gQ09OU1RBTlRTIERFVEFJTCA9PT09PT09PSAtLT4KLTxoMj5FbnVtIFZhbHVlczwvaDI+Ci08P2NzIGNhbGw6d3JpdGVfZmllbGRfZGV0YWlscyhjbGFzcy5lbnVtQ29uc3RhbnRzKSA/PgotPD9jcyAvaWYgPz4KLQotPCEtLSBDb25zdGFudHMgLS0+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmNvbnN0YW50cykgPz4KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci08IS0tID09PT09PT09PSBFTlVNIENPTlNUQU5UUyBERVRBSUwgPT09PT09PT0gLS0+Ci08aDI+Q29uc3RhbnRzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9maWVsZF9kZXRhaWxzKGNsYXNzLmNvbnN0YW50cykgPz4KLTw/Y3MgL2lmID8+Ci0KLTwhLS0gRmllbGRzIC0tPgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5maWVsZHMpID8+Ci08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT0gRklFTEQgREVUQUlMID09PT09PT09IC0tPgotPGgyPkZpZWxkczwvaDI+Ci08P2NzIGNhbGw6d3JpdGVfZmllbGRfZGV0YWlscyhjbGFzcy5maWVsZHMpID8+Ci08P2NzIC9pZiA/PgotCi08IS0tIFB1YmxpYyBjdG9ycyAtLT4KLTw/Y3MgaWY6c3ViY291bnQoY2xhc3MuY3RvcnMucHVibGljKSA/PgotPD9jcyAjIHRoaXMgbmV4dCBsaW5lIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09IENPTlNUUlVDVE9SIERFVEFJTCA9PT09PT09PSAtLT4KLTxoMj5QdWJsaWMgQ29uc3RydWN0b3JzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2RfZGV0YWlscyhjbGFzcy5jdG9ycy5wdWJsaWMpID8+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT0gQ09OU1RSVUNUT1IgREVUQUlMID09PT09PT09IC0tPgotPCEtLSBQcm90ZWN0ZWQgY3RvcnMgLS0+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLmN0b3JzLnByb3RlY3RlZCkgPz4KLTxoMj5Qcm90ZWN0ZWQgQ29uc3RydWN0b3JzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2RfZGV0YWlscyhjbGFzcy5jdG9ycy5wcm90ZWN0ZWQpID8+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgdGhpcyBuZXh0IGxpbmUgbXVzdCBiZSBleGFjdGx5IGxpa2UgdGhpcyB0byBiZSBwYXJzZWQgYnkgZWNsaXBzZSA/PgotPCEtLSA9PT09PT09PT0gTUVUSE9EIERFVEFJTCA9PT09PT09PSAtLT4KLTwhLS0gUHVibGljIG1ldGhkb3MgLS0+Ci08P2NzIGlmOnN1YmNvdW50KGNsYXNzLm1ldGhvZHMucHVibGljKSA/PgotPGgyPlB1YmxpYyBNZXRob2RzPC9oMj4KLTw/Y3MgY2FsbDp3cml0ZV9tZXRob2RfZGV0YWlscyhjbGFzcy5tZXRob2RzLnB1YmxpYykgPz4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgIyB0aGlzIG5leHQgbGluZSBtdXN0IGJlIGV4YWN0bHkgbGlrZSB0aGlzIHRvIGJlIHBhcnNlZCBieSBlY2xpcHNlID8+Ci08IS0tID09PT09PT09PSBNRVRIT0QgREVUQUlMID09PT09PT09IC0tPgotPD9jcyBpZjpzdWJjb3VudChjbGFzcy5tZXRob2RzLnByb3RlY3RlZCkgPz4KLTxoMj5Qcm90ZWN0ZWQgTWV0aG9kczwvaDI+Ci08P2NzIGNhbGw6d3JpdGVfbWV0aG9kX2RldGFpbHMoY2xhc3MubWV0aG9kcy5wcm90ZWN0ZWQpID8+Ci08P2NzIC9pZiA/PgotCi08P2NzICMgdGhlIG5leHQgdHdvIGxpbmVzIG11c3QgYmUgZXhhY3RseSBsaWtlIHRoaXMgdG8gYmUgcGFyc2VkIGJ5IGVjbGlwc2UgPz4KLTwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KLTxBIE5BTUU9Im5hdmJhcl90b3AiPjwvQT4KLQotPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci08L2Rpdj4gPCEtLSBqZC1jb250ZW50IC0tPgotCi08L2Rpdj48IS0tIGVuZCBkb2MtY29udGVudCAtLT4KLQotPD9jcyBpbmNsdWRlOiJ0cmFpbGVyLmNzIiA/PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2NsYXNzZXMuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2NsYXNzZXMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NjlmNDcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9jbGFzc2VzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD9jcyBpbmNsdWRlOiJkb2N0eXBlLmNzIiA/PgotPD9jcyBpbmNsdWRlOiJtYWNyb3MuY3MiID8+Ci08aHRtbDw/Y3MgaWY6ZGV2c2l0ZSA/PiBkZXZzaXRlPD9jcyAvaWYgPz4+Ci08P2NzIGluY2x1ZGU6ImhlYWRfdGFnLmNzIiA/PgotPGJvZHkgY2xhc3M9ImdjLWRvY3VtZW50YXRpb24gPD9jcyBpZjoocmVmZXJlbmNlLmdtcyB8fCByZWZlcmVuY2UuZ2NtKSA/Pmdvb2dsZTw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6KGd1aWRlfHxkZXZlbG9wfHx0cmFpbmluZ3x8cmVmZXJlbmNlfHx0b29sc3x8c2RrKSA/PmRldmVsb3A8P2NzCi0gIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICBlbGlmOmRpc3RyaWJ1dGUgPz5kaXN0cmlidXRlPD9jcwotICAvaWYgPz4iIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvQXJ0aWNsZSI+Ci0gIDxhIG5hbWU9InRvcCI+PC9hPgotPD9jcyBpbmNsdWRlOiJoZWFkZXIuY3MiID8+Ci0KLTxkaXYgY2xhc3M9ImNvbC0xMiIgaWQ9ImRvYy1jb2wiPgotCi08ZGl2IGlkPSJqZC1oZWFkZXIiPgotPGgxPjw/Y3MgdmFyOnBhZ2UudGl0bGUgPz48L2gxPgotPC9kaXY+Ci0KLTxkaXYgaWQ9ImpkLWNvbnRlbnQiPgotPHA+VGhlc2UgYXJlIHRoZSBBbmRyb2lkIEFQSSBjbGFzc2VzLiBTZWUgYWxsIDxhIGhyZWY9InBhY2thZ2VzLmh0bWwiPkFQSSBwYWNrYWdlczwvYT4uPC9wPgotPGRpdiBjbGFzcz0iamQtbGV0dGVybGlzdCI+PD9jcyBlYWNoOmxldHRlcj1kb2NzLmNsYXNzZXMgPz4KLSAgICA8YSBocmVmPSIjbGV0dGVyXzw/Y3MgbmFtZTpsZXR0ZXIgPz4iPjw/Y3MgbmFtZTpsZXR0ZXIgPz48L2E+Jm5ic3A7Jm5ic3A7PD9jcyAvZWFjaD8+Ci08L2Rpdj4KLQotPD9jcyBlYWNoOmxldHRlcj1kb2NzLmNsYXNzZXMgPz4KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLTxoMiBpZD0ibGV0dGVyXzw/Y3MgbmFtZTpsZXR0ZXIgPz4iPjw/Y3MgbmFtZTpsZXR0ZXIgPz48L2gyPgotPHRhYmxlIGNsYXNzPSJqZC1zdW10YWJsZSI+Ci0gICAgPD9jcyBzZXQ6Y3VyX3JvdyA9ICMwID8+Ci0gICAgPD9jcyBlYWNoOmNsID0gbGV0dGVyID8+Ci0gICAgICAgIDx0ciBjbGFzcz0iPD9jcyBpZjpjb3VudCAlICMyID8+YWx0LWNvbG9yPD9jcyAvaWYgPz4gYXBpIGFwaWxldmVsLTw/Y3MgdmFyOmNsLnNpbmNlID8+IiA+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImpkLWxpbmtjb2wiPjw/Y3MgY2FsbDp0eXBlX2xpbmsoY2wudHlwZSkgPz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJqZC1kZXNjcmNvbCIgd2lkdGg9IjEwMCUiPjw/Y3MgY2FsbDpzaG9ydF9kZXNjcihjbCkgPz4mbmJzcDs8L3RkPgotICAgICAgICA8L3RyPgotICAgIDw/Y3Mgc2V0OmNvdW50ID0gY291bnQgKyAjMSA/PgotICAgIDw/Y3MgL2VhY2ggPz4KLTwvdGFibGU+Ci08P2NzIC9lYWNoID8+Ci0KLTw/Y3MgaW5jbHVkZToiZm9vdGVyLmNzIiA/PgotPC9kaXY+PCEtLSBlbmQgamQtY29udGVudCAtLT4KLTwvZGl2PjwhLS0gZW5kIGRvYy1jb250ZW50IC0tPgotCi08P2NzIGluY2x1ZGU6InRyYWlsZXIuY3MiID8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2NvbXBvbmVudHMvbWFzdGhlYWQuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2NvbXBvbmVudHMvbWFzdGhlYWQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjU4MmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9jb21wb25lbnRzL21hc3RoZWFkLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLTw/Y3MgZGVmOmN1c3RvbV9tYXN0aGVhZCgpID8+Ci0gICAgPCEtLSBIZWFkZXIgLS0+Ci0gICAgPGRpdiBpZD0iaGVhZGVyIj4KLSAgICAgICAgPGRpdiBjbGFzcz0id3JhcCIgaWQ9ImhlYWRlci13cmFwIj4KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMyBsb2dvIj4KLSAgICAgICAgICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxpbWcgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz5hc3NldHMvaW1hZ2VzL2RhY19sb2dvLnBuZyIgd2lkdGg9IjEyMyIgaGVpZ2h0PSIyNSIgYWx0PSJBbmRyb2lkIERldmVsb3BlcnMiIC8+Ci0gICAgICAgICAgPC9hPgotICAgICAgICAgIDxkaXYgY2xhc3M9ImJ0bi1xdWlja25hdiIgaWQ9ImJ0bi1xdWlja25hdiI+Ci0gICAgICAgICAgCTxhIGhyZWY9IiMiIGNsYXNzPSJhcnJvdy1pbmFjdGl2ZSI+UXVpY2tuYXY8L2E+Ci0JCQkgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iYXJyb3ctYWN0aXZlIj5RdWlja25hdjwvYT4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2LXggY29sLTkiPgotICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGVzaWduIj4KLSAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9pbmRleC5odG1sIgotICAgICAgICAgICAgICAgICAgemgtVFctbGFuZz0i6Kit6KiIIgotICAgICAgICAgICAgICAgICAgemgtQ04tbGFuZz0i6K6+6K6hIgotICAgICAgICAgICAgICAgICAgcnUtbGFuZz0i0J/RgNC+0LXQutGC0LjRgNC+0LLQsNC90LjQtSIKLSAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuuUlOyekOyduCIKLSAgICAgICAgICAgICAgICAgIGphLWxhbmc9IuioreioiCIKLSAgICAgICAgICAgICAgICAgIGVzLWxhbmc9IkRpc2XDsWFyIgotICAgICAgICAgICAgICAgICAgPkRlc2lnbjwvYT48L2xpPgotICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGV2ZWxvcCI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGV2ZWxvcC9pbmRleC5odG1sIgotICAgICAgICAgICAgICAgICAgemgtVFctbGFuZz0i6ZaL55m8IgotICAgICAgICAgICAgICAgICAgemgtQ04tbGFuZz0i5byA5Y+RIgotICAgICAgICAgICAgICAgICAgcnUtbGFuZz0i0KDQsNC30YDQsNCx0L7RgtC60LAiCi0gICAgICAgICAgICAgICAgICBrby1sYW5nPSLqsJzrsJwiCi0gICAgICAgICAgICAgICAgICBqYS1sYW5nPSLplovnmboiCi0gICAgICAgICAgICAgICAgICBlcy1sYW5nPSJEZXNhcnJvbGxhciIKLSAgICAgICAgICAgICAgICAgID5EZXZlbG9wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJkaXN0cmlidXRlIGxhc3QiPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRpc3RyaWJ1dGUvaW5kZXguaHRtbCIKLSAgICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9IueZvOS9iCIKLSAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IuWIhuWPkSIKLSAgICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCg0LDRgdC/0YDQvtGB0YLRgNCw0L3QtdC90LjQtSIKLSAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuuwsO2PrCIKLSAgICAgICAgICAgICAgICAgIGphLWxhbmc9IumFjeW4gyIKLSAgICAgICAgICAgICAgICAgIGVzLWxhbmc9IkRpc3RyaWJ1aXIiCi0gICAgICAgICAgICAgICAgICA+RGlzdHJpYnV0ZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLQotICAgICAgICAgICAgPCEtLSBOZXcgU2VhcmNoIC0tPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVudS1jb250YWluZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9yZW1lbnUiPgotICAgIDxkaXYgaWQ9Im1vcmUtYnRuIj48L2Rpdj4KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9Im1vcmVob3ZlciIgaWQ9Im1vcmVtZW51Ij4KLSAgICA8ZGl2IGNsYXNzPSJ0b3AiPjwvZGl2PgotICAgIDxkaXYgY2xhc3M9Im1pZCI+Ci0gICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPkxpbmtzPC9kaXY+Ci0gICAgICA8dWw+Ci0gICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2gvIj5Hb29nbGUgUGxheSBEZXZlbG9wZXIgQ29uc29sZTwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FuZHJvaWQtZGV2ZWxvcGVycy5ibG9nc3BvdC5jb20vIj5BbmRyb2lkIERldmVsb3BlcnMgQmxvZzwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+YWJvdXQvaW5kZXguaHRtbCI+QWJvdXQgQW5kcm9pZDwvYT48L2xpPgotICAgICAgPC91bD4KLSAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+QW5kcm9pZCBTaXRlczwvZGl2PgotICAgICAgPHVsPgotICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbSI+QW5kcm9pZC5jb208L2E+PC9saT4KLSAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPjxhPkFuZHJvaWQgRGV2ZWxvcGVyczwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbSI+QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0PC9hPjwvbGk+Ci0gICAgICA8L3VsPgotCi08P2NzICMjIyMjIyMjIyMjIyBUT0RPOiBSZW1vdmUgd2hlbiB3ZSdyZSBoYXBweSB3aXRoIERldnNpdGUgIyMjIyMjIyMjIyMjIyA/PgotICAgICAgPD9jcyAjIFVzZSBkaWZmZXJlbmMgbGFuZyBzd2l0Y2hlciBmb3IgZGV2c2l0ZSBhbmQgZ2FlIHNlcnZlciA/PgotICAgICAgPD9jcyBpZjpkZXZzaXRlID8+Ci0gICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPkxhbmd1YWdlPC9kaXY+Ci0gICAgICA8P2NzIGVsaWY6YW5kcm9pZC53aGljaGRvYyA9PSAib25saW5lIiA/PgotICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXIiPkxhbmd1YWdlPC9kaXY+Ci0gICAgICAgICAgPGRpdiBpZD0ibGFuZ3VhZ2UiIGNsYXNzPSJsb2NhbGVzIj4KLSAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ibGFuZ3VhZ2UiIG9uQ2hhbmdlPSJjaGFuZ2VMYW5nUHJlZih0aGlzLnZhbHVlLCB0cnVlKSI+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZW4iPkVuZ2xpc2g8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJlcyI+RXNwYcOxb2w8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJqYSI+5pel5pys6KqePC9vcHRpb24+Ci0gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ia28iPu2VnOq1reyWtDwvb3B0aW9uPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InJ1Ij7QoNGD0YHRgdC60LjQuTwvb3B0aW9uPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InpoLUNOIj7kuK3mlocgKOS4reWbvSk8L29wdGlvbj4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ6aC1UVyI+5Lit5paHICjlj7DngaMpPC9vcHRpb24+Ci0gICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgICAgICAgIDwhLS0KLSAgICAgICAgICBsb2FkTGFuZ1ByZWYoKTsKLSAgICAgICAgICAgIC8vLS0+Ci0gICAgICAgIDwvc2NyaXB0PgotICAgICAgPD9jcyAvaWYgPz4KLSAgICAgIDw/Y3MgIyBFbmQgb2YgZGV2c2l0ZSB2cy4gZ2FlIHZlcnNpb24gb2YgbGFuZyBzd2l0Y2hlciA/PgotCi0KLSAgICAgIDxiciBjbGFzcz0iY2xlYXJmaXgiIC8+Ci0gICAgPC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0iYm90dG9tIj48L2Rpdj4KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9InNlYXJjaCIgaWQ9InNlYXJjaC1jb250YWluZXIiPgotICAgIDxkaXYgY2xhc3M9InNlYXJjaC1pbm5lciI+Ci0gICAgICA8ZGl2IGlkPSJzZWFyY2gtYnRuIj48L2Rpdj4KLSAgICAgIDxkaXYgY2xhc3M9ImxlZnQiPjwvZGl2PgotICAgICAgPGZvcm0gb25zdWJtaXQ9InJldHVybiBzdWJtaXRfc2VhcmNoKCkiPgotICAgICAgICA8aW5wdXQgaWQ9InNlYXJjaF9hdXRvY29tcGxldGUiIHR5cGU9InRleHQiIHZhbHVlPSIiIGF1dG9jb21wbGV0ZT0ib2ZmIiBuYW1lPSJxIgotb25mb2N1cz0ic2VhcmNoX2ZvY3VzX2NoYW5nZWQodGhpcywgdHJ1ZSkiIG9uYmx1cj0ic2VhcmNoX2ZvY3VzX2NoYW5nZWQodGhpcywgZmFsc2UpIgotb25rZXlkb3duPSJyZXR1cm4gc2VhcmNoX2NoYW5nZWQoZXZlbnQsIHRydWUsICc8P2NzIHZhcjp0b3Jvb3QgPz4nKSIKLW9ua2V5dXA9InJldHVybiBzZWFyY2hfY2hhbmdlZChldmVudCwgZmFsc2UsICc8P2NzIHZhcjp0b3Jvb3QgPz4nKSIgLz4KLSAgICAgIDwvZm9ybT4KLSAgICAgIDxkaXYgY2xhc3M9InJpZ2h0Ij48L2Rpdj4KLSAgICAgICAgPGEgY2xhc3M9ImNsb3NlIGhpZGUiPmNsb3NlPC9hPgotICAgICAgICA8ZGl2IGNsYXNzPSJsZWZ0Ij48L2Rpdj4KLSAgICAgICAgPGRpdiBjbGFzcz0icmlnaHQiPjwvZGl2PgotICAgIDwvZGl2PgotICA8L2Rpdj4KLSAgPGRpdiBpZD0ic2VhcmNoX2ZpbHRlcmVkX3dyYXBwZXIiPgotICAgIDxkaXYgaWQ9InNlYXJjaF9maWx0ZXJlZF9kaXYiIGNsYXNzPSJuby1kaXNwbGF5Ij4KLSAgICAgICAgPHVsIGlkPSJzZWFyY2hfZmlsdGVyZWQiPgotICAgICAgICA8L3VsPgotICAgIDwvZGl2PgotICA8L2Rpdj4KLQotICA8L2Rpdj4KLSAgPCEtLSAvTmV3IFNlYXJjaD4KLQotCi0gICAgICAgICAgPCEtLSBFeHBhbmRlZCBxdWlja25hdiAtLT4KLSAgICAgICAgICAgPGRpdiBpZD0icXVpY2tuYXYiIGNsYXNzPSJjb2wtOSI+Ci0gICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRlc2lnbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vdmlkZW9zL2luZGV4Lmh0bWwiPlZpZGVvczwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGV2ZWxvcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnRyYWluaW5nL2luZGV4Lmh0bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9Iuiok+e3tOiqsueoiyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgemgtQ04tbGFuZz0i5Z+56K6tIgotICAgICAgICAgICAgICAgICAgICAgICAgICBydS1sYW5nPSLQmtGD0YDRgdGLIgotICAgICAgICAgICAgICAgICAgICAgICAgICBrby1sYW5nPSLqtZDsnKEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGphLWxhbmc9IuODiOODrOODvOODi+ODs+OCsCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXMtbGFuZz0iQ2FwYWNpdGFjacOzbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPlRyYWluaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvY29tcG9uZW50cy9pbmRleC5odG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgICB6aC1UVy1sYW5nPSJBUEkg5oyH5Y2XIgotICAgICAgICAgICAgICAgICAgICAgICAgICB6aC1DTi1sYW5nPSJBUEkg5oyH5Y2XIgotICAgICAgICAgICAgICAgICAgICAgICAgICBydS1sYW5nPSLQoNGD0LrQvtCy0L7QtNGB0YLQstCwINC/0L4gQVBJIgotICAgICAgICAgICAgICAgICAgICAgICAgICBrby1sYW5nPSJBUEkg6rCA7J2065OcIgotICAgICAgICAgICAgICAgICAgICAgICAgICBqYS1sYW5nPSJBUEkg44Ks44Kk44OJIgotICAgICAgICAgICAgICAgICAgICAgICAgICBlcy1sYW5nPSJHdcOtYXMgZGUgbGEgQVBJIgotICAgICAgICAgICAgICAgICAgICAgICAgICA+QVBJIEd1aWRlczwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnJlZmVyZW5jZS9wYWNrYWdlcy5odG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgICB6aC1UVy1sYW5nPSLlj4PogIPos4fmupAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IuWPguiAgyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnUtbGFuZz0i0KHQv9GA0LDQstC+0YfQvdC40LoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuywuOyhsOusuOyEnCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamEtbGFuZz0i44Oq44OV44Kh44Os44Oz44K5IgotICAgICAgICAgICAgICAgICAgICAgICAgICBlcy1sYW5nPSJSZWZlcmVuY2lhIgotICAgICAgICAgICAgICAgICAgICAgICAgICA+UmVmZXJlbmNlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+dG9vbHMvaW5kZXguaHRtbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgemgtVFctbGFuZz0i55u46Zec5bel5YW3IgotICAgICAgICAgICAgICAgICAgICAgICAgICB6aC1DTi1sYW5nPSLlt6XlhbciCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCY0L3RgdGC0YDRg9C80LXQvdGC0YsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuuPhOq1rCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamEtbGFuZz0i44OE44O844OrIgotICAgICAgICAgICAgICAgICAgICAgICAgICBlcy1sYW5nPSJIZXJyYW1pZW50YXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgID5Ub29sczwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPjxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zZGsvaW5kZXguaHRtbCI+R2V0IHRoZSBTREs8L2E+PC9saT48L3VsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5nb29nbGUvaW5kZXguaHRtbCI+R29vZ2xlIFNlcnZpY2VzPC9hPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3VsPgotICAgICAgICAgICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpc3RyaWJ1dGUgbGFzdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRpc3RyaWJ1dGUvaW5kZXguaHRtbCI+R29vZ2xlIFBsYXk8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kaXN0cmlidXRlL2dvb2dsZXBsYXkvcHVibGlzaC9pbmRleC5odG1sIj5QdWJsaXNoaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGlzdHJpYnV0ZS9nb29nbGVwbGF5L3Byb21vdGUvaW5kZXguaHRtbCI+UHJvbW90aW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGlzdHJpYnV0ZS9nb29nbGVwbGF5L3F1YWxpdHkvaW5kZXguaHRtbCI+QXBwIFF1YWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kaXN0cmlidXRlL2dvb2dsZXBsYXkvc3BvdGxpZ2h0L2luZGV4Lmh0bWwiPlNwb3RsaWdodDwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRpc3RyaWJ1dGUvb3Blbi5odG1sIj5PcGVuIERpc3RyaWJ1dGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8IS0tIC9FeHBhbmRlZCBxdWlja25hdiAtLT4KLSAgICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gICAgPCEtLSAvSGVhZGVyIC0tPgotCi0KLSAgPGRpdiBpZD0ic2VhcmNoUmVzdWx0cyIgY2xhc3M9IndyYXAiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgICAgICAgICA8aDIgaWQ9InNlYXJjaFRpdGxlIj5SZXN1bHRzPC9oMj4KLSAgICAgICAgICA8ZGl2IGlkPSJsZWZ0U2VhcmNoQ29udHJvbCIgY2xhc3M9InNlYXJjaC1jb250cm9sIj5Mb2FkaW5nLi4uPC9kaXY+Ci0gIDwvZGl2PgotCi0KLQotPD9jcyBpZjp0cmFpbmluZyB8fCBndWlkZSB8fCByZWZlcmVuY2UgfHwgdG9vbHMgfHwgZGV2ZWxvcCB8fCBnb29nbGUgPz4KLSAgICA8IS0tIFNlY29uZGFyeSB4LW5hdiAtLT4KLSAgICA8ZGl2IGlkPSJuYXYteCI+Ci0gICAgICAgIDxkaXYgY2xhc3M9IndyYXAiPgotICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXYteCBjb2wtOSBkZXZlbG9wIiBzdHlsZT0id2lkdGg6MTAwJSI+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ0cmFpbmluZyI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+dHJhaW5pbmcvaW5kZXguaHRtbCIKLSAgICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9Iuiok+e3tOiqsueoiyIKLSAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IuWfueiurSIKLSAgICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCa0YPRgNGB0YsiCi0gICAgICAgICAgICAgICAgICBrby1sYW5nPSLqtZDsnKEiCi0gICAgICAgICAgICAgICAgICBqYS1sYW5nPSLjg4jjg6zjg7zjg4vjg7PjgrAiCi0gICAgICAgICAgICAgICAgICBlcy1sYW5nPSJDYXBhY2l0YWNpw7NuIgotICAgICAgICAgICAgICAgICAgPlRyYWluaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJndWlkZSI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvY29tcG9uZW50cy9pbmRleC5odG1sIgotICAgICAgICAgICAgICAgICAgemgtVFctbGFuZz0iQVBJIOaMh+WNlyIKLSAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IkFQSSDmjIfljZciCi0gICAgICAgICAgICAgICAgICBydS1sYW5nPSLQoNGD0LrQvtCy0L7QtNGB0YLQstCwINC/0L4gQVBJIgotICAgICAgICAgICAgICAgICAga28tbGFuZz0iQVBJIOqwgOydtOuTnCIKLSAgICAgICAgICAgICAgICAgIGphLWxhbmc9IkFQSSDjgqzjgqTjg4kiCi0gICAgICAgICAgICAgICAgICBlcy1sYW5nPSJHdcOtYXMgZGUgbGEgQVBJIgotICAgICAgICAgICAgICAgICAgPkFQSSBHdWlkZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InJlZmVyZW5jZSI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+cmVmZXJlbmNlL3BhY2thZ2VzLmh0bWwiCi0gICAgICAgICAgICAgICAgICB6aC1UVy1sYW5nPSLlj4PogIPos4fmupAiCi0gICAgICAgICAgICAgICAgICB6aC1DTi1sYW5nPSLlj4LogIMiCi0gICAgICAgICAgICAgICAgICBydS1sYW5nPSLQodC/0YDQsNCy0L7Rh9C90LjQuiIKLSAgICAgICAgICAgICAgICAgIGtvLWxhbmc9IuywuOyhsOusuOyEnCIKLSAgICAgICAgICAgICAgICAgIGphLWxhbmc9IuODquODleOCoeODrOODs+OCuSIKLSAgICAgICAgICAgICAgICAgIGVzLWxhbmc9IlJlZmVyZW5jaWEiCi0gICAgICAgICAgICAgICAgICA+UmVmZXJlbmNlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJ0b29scyI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+dG9vbHMvaW5kZXguaHRtbCIKLSAgICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9IuebuOmXnOW3peWFtyIKLSAgICAgICAgICAgICAgICAgIHpoLUNOLWxhbmc9IuW3peWFtyIKLSAgICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCY0L3RgdGC0YDRg9C80LXQvdGC0YsiCi0gICAgICAgICAgICAgICAgICBrby1sYW5nPSLrj4TqtawiCi0gICAgICAgICAgICAgICAgICBqYS1sYW5nPSLjg4Tjg7zjg6siCi0gICAgICAgICAgICAgICAgICBlcy1sYW5nPSJIZXJyYW1pZW50YXMiCi0gICAgICAgICAgICAgICAgICA+VG9vbHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Imdvb2dsZSI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z29vZ2xlL2luZGV4Lmh0bWwiCi0gICAgICAgICAgICAgICAgICA+R29vZ2xlIFNlcnZpY2VzPC9hPgotICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICA8L2Rpdj4KLQotICAgIDwvZGl2PgotICAgIDwhLS0gL1NlbmRvbmRhcnkgeC1uYXYgLS0+Ci08P2NzIC9pZiA/PgotICA8P2NzCi0vZGVmID8+Ci0KLQotCi0KLTw/Y3MgZGVmOnNhY19tYXN0aGVhZCgpID8+Ci0gICAgPCEtLSBIZWFkZXIgLS0+Ci0gICAgPGRpdiBpZD0iaGVhZGVyIj4KLSAgICAgICAgPGRpdiBjbGFzcz0id3JhcCIgaWQ9ImhlYWRlci13cmFwIj4KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMyBzYWNsb2dvIj4KLSAgICAgICAgICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5pbmRleC5odG1sIj4KLSAgICAgICAgICAgIDxpbWcgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz5hc3NldHMvaW1hZ2VzL3NhY19sb2dvLnBuZyIKLSAgICAgICAgICAgICAgICBzcmNzZXQ9Ijw/Y3MgdmFyOnRvcm9vdCA/PmFzc2V0cy9pbWFnZXMvc2FjX2xvZ29AMngucG5nIDJ4IgotICAgICAgICAgICAgICAgIHdpZHRoPSIxMjMiIGhlaWdodD0iMjUiIGFsdD0iQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiAvPgotICAgICAgICAgIDwvYT4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2LXggY29sLTkiPgotICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic291cmNlIj4KLSAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnNvdXJjZS9pbmRleC5odG1sIiA8P2NzCi0gICAgICAgICAgICAgICAgICBpZjpzb3VyY2UgPz5jbGFzcz0ic2VsZWN0ZWQiPD9jcyAvaWYgPz4KLSAgICAgICAgICAgICAgICAgID5Tb3VyY2U8L2E+PC9saT4KLSAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRldmljZXMiPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRldmljZXMvaW5kZXguaHRtbCIgPD9jcwotICAgICAgICAgICAgICAgICAgaWY6ZGV2aWNlcyA/PmNsYXNzPSJzZWxlY3RlZCI8P2NzIC9pZiA/PgotICAgICAgICAgICAgICAgICAgPkRldmljZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgICA8bGkgY2xhc3M9InNlY3VyaXR5Ij48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zZWN1cml0eS9pbmRleC5odG1sIiA8P2NzCi0gICAgICAgICAgICAgICAgICBpZjpzZWN1cml0eSA/PmNsYXNzPSJzZWxlY3RlZCI8P2NzIC9pZiA/PgotICAgICAgICAgICAgICAgICAgPlNlY3VyaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJjb21wYXRpYmlsaXR5IGxhc3QiPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmNvbXBhdGliaWxpdHkvaW5kZXguaHRtbCIgPD9jcwotICAgICAgICAgICAgICAgICAgaWY6Y29tcGF0aWJpbGl0eSA/PmNsYXNzPSJzZWxlY3RlZCI8P2NzIC9pZiA/PgotICAgICAgICAgICAgICAgICAgPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICA8IS0tIE5ldyBTZWFyY2ggLS0+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW51LWNvbnRhaW5lciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb3JlbWVudSI+Ci0gICAgPGRpdiBpZD0ibW9yZS1idG4iPjwvZGl2PgotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibW9yZWhvdmVyIiBpZD0ibW9yZW1lbnUiPgotICAgIDxkaXYgY2xhc3M9InRvcCI+PC9kaXY+Ci0gICAgPGRpdiBjbGFzcz0ibWlkIj4KLSAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+QW5kcm9pZCBTaXRlczwvZGl2PgotICAgICAgPHVsPgotICAgICAgICA8bGkgY2xhc3M9ImFjdGl2ZSI+PGE+QW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0PC9hPjwvbGk+Ci0gICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tIj5BbmRyb2lkLmNvbTwvYT48L2xpPgotICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbSI+QW5kcm9pZCBEZXZlbG9wZXJzPC9hPjwvbGk+Ci0gICAgICA8L3VsPgotICAgICAgPCEtLSA8ZGl2IGNsYXNzPSJoZWFkZXIiPlN1cHBvcnQ8L2Rpdj4KLSAgICAgIDx1bD4KLSAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnN1cHBvcnQuaHRtbCI+RGV2ZWxvcGVyIFN1cHBvcnQ8L2E+PC9saT4KLSAgICAgIDwvdWw+IC0tPgotICAgICAgPGJyIGNsYXNzPSJjbGVhcmZpeCIgLz4KLSAgICA8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSJib3R0b20iPjwvZGl2PgotICA8L2Rpdj4KLQotICA8ZGl2IGNsYXNzPSJzZWFyY2giIGlkPSJzZWFyY2gtY29udGFpbmVyIj4KLSAgICA8ZGl2IGNsYXNzPSJzZWFyY2gtaW5uZXIiPgotICAgICAgPGRpdiBpZD0ic2VhcmNoLWJ0biI+PC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSJsZWZ0Ij48L2Rpdj4KLSAgICAgIDxmb3JtIG9uc3VibWl0PSJyZXR1cm4gc3VibWl0X3NlYXJjaCgpIj4KLSAgICAgICAgPGlucHV0IGlkPSJzZWFyY2hfYXV0b2NvbXBsZXRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiBhdXRvY29tcGxldGU9Im9mZiIgbmFtZT0icSIKLW9uZm9jdXM9InNlYXJjaF9mb2N1c19jaGFuZ2VkKHRoaXMsIHRydWUpIiBvbmJsdXI9InNlYXJjaF9mb2N1c19jaGFuZ2VkKHRoaXMsIGZhbHNlKSIKLW9ua2V5ZG93bj0icmV0dXJuIHNlYXJjaF9jaGFuZ2VkKGV2ZW50LCB0cnVlLCAnPD9jcyB2YXI6dG9yb290ID8+JykiCi1vbmtleXVwPSJyZXR1cm4gc2VhcmNoX2NoYW5nZWQoZXZlbnQsIGZhbHNlLCAnPD9jcyB2YXI6dG9yb290ID8+JykiIC8+Ci0gICAgICA8L2Zvcm0+Ci0gICAgICA8ZGl2IGNsYXNzPSJyaWdodCI+PC9kaXY+Ci0gICAgICAgIDxhIGNsYXNzPSJjbG9zZSBoaWRlIj5jbG9zZTwvYT4KLSAgICAgICAgPGRpdiBjbGFzcz0ibGVmdCI+PC9kaXY+Ci0gICAgICAgIDxkaXYgY2xhc3M9InJpZ2h0Ij48L2Rpdj4KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0gIDxkaXYgaWQ9InNlYXJjaF9maWx0ZXJlZF93cmFwcGVyIj4KLSAgICA8ZGl2IGlkPSJzZWFyY2hfZmlsdGVyZWRfZGl2IiBjbGFzcz0ibm8tZGlzcGxheSI+Ci0gICAgICAgIDx1bCBpZD0ic2VhcmNoX2ZpbHRlcmVkIj4KLSAgICAgICAgPC91bD4KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0KLSAgPC9kaXY+Ci0gIDwhLS0gL05ldyBTZWFyY2g+IC0tPgotICAgICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLSAgICA8IS0tIC9IZWFkZXIgLS0+Ci0KLSAgPGRpdiBpZD0ic2VhcmNoUmVzdWx0cyIgY2xhc3M9IndyYXAiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgICAgICAgICA8aDIgaWQ9InNlYXJjaFRpdGxlIj5SZXN1bHRzPC9oMj4KLSAgICAgICAgICA8ZGl2IGlkPSJsZWZ0U2VhcmNoQ29udHJvbCIgY2xhc3M9InNlYXJjaC1jb250cm9sIj5Mb2FkaW5nLi4uPC9kaXY+Ci0gIDwvZGl2PgotCi0gIDw/Y3MKLS9kZWYgPz4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvY3VzdG9taXphdGlvbnMuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2N1c3RvbWl6YXRpb25zLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQzZDcyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvY3VzdG9taXphdGlvbnMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotPD9jcyAKLWRlZjpmdWxscGFnZSgpID8+Ci0gIDxkaXYgaWQ9ImJvZHktY29udGVudCI+Ci08P2NzIC9kZWYgPz4KLTw/Y3MgCi1kZWY6c2RrX25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MiID8+Ci0KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+IDwhLS0gZW5kIHNpZGUtbmF2IC0tPgotPD9jcyAvZGVmID8+Ci08P2NzIAotZGVmOnJlc291cmNlc190YWJfbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGEKLSAgICA8ZGl2IGNsYXNzPSJjb2wtNCIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi08P2NzIAotICAgICAgICBpbmNsdWRlOiIuLi8uLi8uLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXNfdG9jLmNzIiA/PgotCi0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci08P2NzCi1kZWY6dG9vbHNfbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGRpdiBjbGFzcz0iY29sLTMiIGlkPSJzaWRlLW5hdiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgICAgPGRpdiBpZD0iZGV2ZG9jLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLTxhIGNsYXNzPSJ0b3RvcCIgaHJlZj0iI3RvcCIgZGF0YS1nLWV2ZW50PSJsZWZ0LW5hdi10b3AiPnRvIHRvcDwvYT4KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvdG9vbHMvdG9vbHNfdG9jLmNzIiA/PgotICAgICAgICAKLSAgICAgICAgCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4gPCEtLSBlbmQgc2lkZS1uYXYgLS0+Ci0gICAgPHNjcmlwdD4KLSAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgICBzY3JvbGxJbnRvVmlldygiZGV2ZG9jLW5hdiIpOwotICAgICAgICB9KTsKLSAgICA8L3NjcmlwdD4KLTw/Y3MgL2RlZiA/PgotPD9jcwotZGVmOnRyYWluaW5nX25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLQotPD9jcyAKLSAgICAgICAgaW5jbHVkZToiLi4vLi4vLi4vLi4vLi4vZnJhbWV3b3Jrcy9iYXNlL2RvY3MvaHRtbC90cmFpbmluZy90cmFpbmluZ190b2MuY3MiID8+Ci0gICAgICAgIAotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4gPCEtLSBlbmQgc2lkZS1uYXYgLS0+Ci0gICAgPHNjcmlwdD4KLSAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgICBzY3JvbGxJbnRvVmlldygiZGV2ZG9jLW5hdiIpOwotICAgICAgICB9KTsKLSAgICA8L3NjcmlwdD4KLTw/Y3MgL2RlZiA/PgotPD9jcyAKLWRlZjpndWlkZV9uYXYoKSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtNCIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzIiA/PgotICAgICAgICAKLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+IDwhLS0gZW5kIHNpZGUtbmF2IC0tPgotICAgIDxzY3JpcHQ+Ci0gICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLSAgICAgICAgc2Nyb2xsSW50b1ZpZXcoImRldmRvYy1uYXYiKTsKLSAgICAgICAgfSk7Ci0gICAgPC9zY3JpcHQ+Ci08P2NzIC9kZWYgPz4KLTw/Y3MKLWRlZjpkZXNpZ25fbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGRpdiBjbGFzcz0iY29sLTMiIGlkPSJzaWRlLW5hdiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgICAgPGRpdiBpZD0iZGV2ZG9jLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLTxhIGNsYXNzPSJ0b3RvcCIgaHJlZj0iI3RvcCIgZGF0YS1nLWV2ZW50PSJsZWZ0LW5hdi10b3AiPnRvIHRvcDwvYT4KLQotCi08P2NzCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvZGVzaWduL2Rlc2lnbl90b2MuY3MiID8+Ci0gICAgICAgCi0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci08P2NzCi1kZWY6ZGlzdHJpYnV0ZV9uYXYoKSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtMyIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi08P2NzCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvZGlzdHJpYnV0ZS9kaXN0cmlidXRlX3RvYy5jcyIgPz4KLSAgICAgICAgCi0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MKLWRlZjpnb29nbGVfbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGRpdiBjbGFzcz0iY29sLTQiIGlkPSJzaWRlLW5hdiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgICAgPGRpdiBpZD0iZGV2ZG9jLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLTxhIGNsYXNzPSJ0b3RvcCIgaHJlZj0iI3RvcCIgZGF0YS1nLWV2ZW50PSJsZWZ0LW5hdi10b3AiPnRvIHRvcDwvYT4KLQotPD9jcwotICAgICAgICBpbmNsdWRlOiIuLi8uLi8uLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvZG9jcy9odG1sL2dvb2dsZS9nb29nbGVfdG9jLmNzIiA/PgotICAgICAgICAKLQotICAgICAgPC9kaXY+Ci0gICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgICAgc2hvd0dvb2dsZVJlZlRyZWUoKTsKLSAgICAKLSAgICAgIDwvc2NyaXB0PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MKLWRlZjphYm91dF9uYXYoKSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtMyIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi08P2NzCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9kb2NzL2h0bWwvYWJvdXQvYWJvdXRfdG9jLmNzIiA/PgotICAgICAgICAKLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+IDwhLS0gZW5kIHNpZGUtbmF2IC0tPgotICAgIDxzY3JpcHQ+Ci0gICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLSAgICAgICAgc2Nyb2xsSW50b1ZpZXcoImRldmRvYy1uYXYiKTsKLSAgICAgICAgfSk7Ci0gICAgPC9zY3JpcHQ+Ci08P2NzIC9kZWYgPz4KLTw/Y3MKLWRlZjpkaXN0X21vcmVfbmF2KCkgPz4KLSAgPGRpdiBjbGFzcz0id3JhcCBjbGVhcmZpeCIgaWQ9ImJvZHktY29udGVudCI+Ci0gICAgPGRpdiBjbGFzcz0iY29sLTQiIGlkPSJzaWRlLW5hdiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgICAgPGRpdiBpZD0iZGV2ZG9jLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLTxhIGNsYXNzPSJ0b3RvcCIgaHJlZj0iI3RvcCIgZGF0YS1nLWV2ZW50PSJsZWZ0LW5hdi10b3AiPnRvIHRvcDwvYT4KLQotCi08P2NzIAotICAgICAgICBpbmNsdWRlOiIuLi8uLi8uLi8uLi8uLi9mcmFtZXdvcmtzL2Jhc2UvZG9jcy9odG1sL2Rpc3RyaWJ1dGUvbW9yZS9tb3JlX3RvYy5jcyIgPz4KLSAgICAgICAgCi0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotOgotCi08P2NzIC9kZWYgPz4KLQotPD9jcyAjIFRoZSBkZWZhdWx0IHNpZGUgbmF2aWdhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZSBkb2NzID8+PD9jcyAKLWRlZjpkZWZhdWx0X2xlZnRfbmF2KCkgPz4KLTw/Y3MgaWY6cmVmZXJlbmNlLmdjbSB8fCByZWZlcmVuY2UuZ21zID8+Ci0gIDw/Y3MgY2FsbDpnb29nbGVfbmF2KCkgPz4KLTw/Y3MgZWxzZSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtNCIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2Ij4KLQotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotICAgICAgPGRpdiBpZD0iYXBpLW5hdi1oZWFkZXIiPgotICAgICAgICA8ZGl2IGlkPSJhcGktbGV2ZWwtdG9nZ2xlIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJhcGlMZXZlbENoZWNrYm94IiBjbGFzcz0iZGlzYWJsZWQiPkFQSSBsZXZlbDogPC9sYWJlbD4KLSAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWxlY3Qtd3JhcHBlciI+Ci0gICAgICAgICAgICA8c2VsZWN0IGlkPSJhcGlMZXZlbFNlbGVjdG9yIj4KLSAgICAgICAgICAgICAgPCEtLSBvcHRpb24gZWxlbWVudHMgYWRkZWQgYnkgYnVpbGRBcGlMZXZlbFNlbGVjdG9yKCkgLS0+Ci0gICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgPC9kaXY+PCEtLSBlbmQgdG9nZ2xlIC0tPgotICAgICAgICA8ZGl2IGlkPSJhcGktbmF2LXRpdGxlIj5BbmRyb2lkIEFQSXM8L2Rpdj4KLSAgICAgICAgPC9kaXY+PCEtLSBlbmQgbmF2IGhlYWRlciAtLT4KLSAgICAgIDxzY3JpcHQ+Ci0gICAgICAgIHZhciBTSU5DRV9EQVRBID0gWyA8P2NzIAotICAgICAgICAgIGVhY2g6c2luY2UgPSBzaW5jZSA/Pic8P2NzIAotICAgICAgICAgICAgdmFyOnNpbmNlLm5hbWUgPz4nPD9jcyAKLSAgICAgICAgICAgIGlmOiFsYXN0KHNpbmNlKSA/PiwgPD9jcyAvaWYgPz48P2NzCi0gICAgICAgICAgL2VhY2ggCi0gICAgICAgID8+IF07Ci0gICAgICAgIGJ1aWxkQXBpTGV2ZWxTZWxlY3RvcigpOwotICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgIDxkaXYgaWQ9InN3YXBwZXIiPgotICAgICAgICA8ZGl2IGlkPSJuYXYtcGFuZWxzIj4KLSAgICAgICAgICA8ZGl2IGlkPSJyZXNpemUtcGFja2FnZXMtbmF2Ij4KLSAgICAgICAgICAgIDxkaXYgaWQ9InBhY2thZ2VzLW5hdiIgY2xhc3M9InNjcm9sbC1wYW5lIj4KLQotICAgICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIAk8P2NzIGNhbGw6cGFja2FnZV9saW5rX2xpc3QoZG9jcy5wYWNrYWdlcykgPz4KLSAgICAgICAgICAgICAgPC91bD48YnIvPgotCi0gICAgICAgICAgICA8L2Rpdj4gPCEtLSBlbmQgcGFja2FnZXMtbmF2IC0tPgotICAgICAgICAgIDwvZGl2PiA8IS0tIGVuZCByZXNpemUtcGFja2FnZXMgLS0+Ci0gICAgICAgICAgPGRpdiBpZD0iY2xhc3Nlcy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci0KLQotPD9jcyAKLSAgICAgICAgICAgIGlmOnN1YmNvdW50KGNsYXNzLnBhY2thZ2UpID8+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDw/Y3MgY2FsbDpsaXN0KCJJbnRlcmZhY2VzIiwgY2xhc3MucGFja2FnZS5pbnRlcmZhY2VzKSA/PgotICAgICAgICAgICAgICA8P2NzIGNhbGw6bGlzdCgiQ2xhc3NlcyIsIGNsYXNzLnBhY2thZ2UuY2xhc3NlcykgPz4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmxpc3QoIkVudW1zIiwgY2xhc3MucGFja2FnZS5lbnVtcykgPz4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmxpc3QoIkV4Y2VwdGlvbnMiLCBjbGFzcy5wYWNrYWdlLmV4Y2VwdGlvbnMpID8+Ci0gICAgICAgICAgICAgIDw/Y3MgY2FsbDpsaXN0KCJFcnJvcnMiLCBjbGFzcy5wYWNrYWdlLmVycm9ycykgPz4KLSAgICAgICAgICAgIDwvdWw+PD9jcyAKLSAgICAgICAgICAgIGVsaWY6c3ViY291bnQocGFja2FnZSkgPz4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmNsYXNzX2xpbmtfbGlzdCgiSW50ZXJmYWNlcyIsIHBhY2thZ2UuaW50ZXJmYWNlcykgPz4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmNsYXNzX2xpbmtfbGlzdCgiQ2xhc3NlcyIsIHBhY2thZ2UuY2xhc3NlcykgPz4KLSAgICAgICAgICAgICAgPD9jcyBjYWxsOmNsYXNzX2xpbmtfbGlzdCgiRW51bXMiLCBwYWNrYWdlLmVudW1zKSA/PgotICAgICAgICAgICAgICA8P2NzIGNhbGw6Y2xhc3NfbGlua19saXN0KCJFeGNlcHRpb25zIiwgcGFja2FnZS5leGNlcHRpb25zKSA/PgotICAgICAgICAgICAgICA8P2NzIGNhbGw6Y2xhc3NfbGlua19saXN0KCJFcnJvcnMiLCBwYWNrYWdlLmVycm9ycykgPz4KLSAgICAgICAgICAgIDwvdWw+PD9jcyAKLSAgICAgICAgICAgIGVsc2UgPz4KLSAgICAgICAgICAgICAgPHAgc3R5bGU9InBhZGRpbmc6MTBweCI+U2VsZWN0IGEgcGFja2FnZSB0byB2aWV3IGl0cyBtZW1iZXJzPC9wPjw/Y3MgCi0gICAgICAgICAgICAvaWYgPz48YnIvPgotICAgICAgICAKLQotICAgICAgICAgIDwvZGl2PjwhLS0gZW5kIGNsYXNzZXMgLS0+Ci0gICAgICAgIDwvZGl2PjwhLS0gZW5kIG5hdi1wYW5lbHMgLS0+Ci0gICAgICAgIDxkaXYgaWQ9Im5hdi10cmVlIiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotICAgICAgICAgIDxkaXYgaWQ9InRyZWUtbGlzdCI+PC9kaXY+Ci0gICAgICAgIDwvZGl2PjwhLS0gZW5kIG5hdi10cmVlIC0tPgotICAgICAgPC9kaXY+PCEtLSBlbmQgc3dhcHBlciAtLT4KLSAgICAgIDxkaXYgaWQ9Im5hdi1zd2FwIj4KLSAgICAgIDxhIGNsYXNzPSJmdWxsc2NyZWVuIj5mdWxsc2NyZWVuPC9hPgotICAgICAgPGEgaHJlZj0nIycgb25jbGljaz0nc3dhcE5hdigpO3JldHVybiBmYWxzZTsnPjxzcGFuIGlkPSd0cmVlLWxpbmsnPlVzZSBUcmVlIE5hdmlnYXRpb248L3NwYW4+PHNwYW4gaWQ9J3BhbmVsLWxpbmsnIHN0eWxlPSdkaXNwbGF5Om5vbmUnPlVzZSBQYW5lbCBOYXZpZ2F0aW9uPC9zcGFuPjwvYT4KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBkZXZkb2MtbmF2IC0tPgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgICAvLyBpbml0IGZ1bGxzY3JlZW4gYmFzZWQgb24gdXNlciBwcmVmCi0gICAgICB2YXIgZnVsbHNjcmVlbiA9IHJlYWRDb29raWUoImZ1bGxzY3JlZW4iKTsKLSAgICAgIGlmIChmdWxsc2NyZWVuICE9IDApIHsKLSAgICAgICAgaWYgKGZ1bGxzY3JlZW4gPT0gImZhbHNlIikgewotICAgICAgICAgIHRvZ2dsZUZ1bGxzY3JlZW4oZmFsc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRvZ2dsZUZ1bGxzY3JlZW4odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGluaXQgbmF2IHZlcnNpb24gZm9yIG1vYmlsZQotICAgICAgaWYgKGlzTW9iaWxlKSB7Ci0gICAgICAgIHN3YXBOYXYoKTsgLy8gdHJlZSB2aWV3IHNob3VsZCBiZSB1c2VkIG9uIG1vYmlsZQotICAgICAgICAkKCcjbmF2LXN3YXAnKS5oaWRlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjaG9vc2VEZWZhdWx0TmF2KCk7Ci0gICAgICAgIGlmICgkKCIjbmF2LXRyZWUiKS5pcygnOnZpc2libGUnKSkgewotICAgICAgICAgIGluaXRfZGVmYXVsdF9uYXZ0cmVlKCI8P2NzIHZhcjp0b3Jvb3QgPz4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gc2Nyb2xsIHRoZSBzZWxlY3RlZCBwYWdlIGludG8gdmlldwotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJwYWNrYWdlcy1uYXYiKTsKLSAgICAgICAgc2Nyb2xsSW50b1ZpZXcoImNsYXNzZXMtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvaWYgPz4KLSAgICA8P2NzIAotL2RlZiA/PgotCi08P2NzIAotZGVmOmN1c3RvbV9sZWZ0X25hdigpID8+PD9jcwotICBpZjpmdWxscGFnZSA/Pjw/Y3MgCi0gICAgY2FsbDpmdWxscGFnZSgpID8+PD9jcyAKLSAgZWxpZjpndWlkZSA/Pjw/Y3MgCi0gICAgY2FsbDpndWlkZV9uYXYoKSA/Pjw/Y3MgCi0gIGVsaWY6ZGVzaWduID8+PD9jcwotICAgIGNhbGw6ZGVzaWduX25hdigpID8+PD9jcyAKLSAgZWxpZjp0cmFpbmluZyA/Pjw/Y3MgCi0gICAgY2FsbDp0cmFpbmluZ19uYXYoKSA/Pjw/Y3MgCi0gIGVsaWY6dG9vbHMgPz48P2NzIAotICAgIGNhbGw6dG9vbHNfbmF2KCkgPz48P2NzCi0gIGVsaWY6Z29vZ2xlID8+PD9jcyAKLSAgICBjYWxsOmdvb2dsZV9uYXYoKSA/Pjw/Y3MgCi0gIGVsaWY6bW9yZSA/Pjw/Y3MgCi0gICAgY2FsbDpkaXN0X21vcmVfbmF2KCkgPz48P2NzCi0gIGVsaWY6ZGlzdHJpYnV0ZSA/Pjw/Y3MgCi0gICAgY2FsbDpkaXN0cmlidXRlX25hdigpID8+PD9jcyAKLSAgZWxpZjphYm91dCA/Pjw/Y3MgCi0gICAgY2FsbDphYm91dF9uYXYoKSA/Pjw/Y3MgCi0gIGVsc2UgPz48P2NzIAotICAgIGNhbGw6ZGVmYXVsdF9sZWZ0X25hdigpID8+IDw/Y3MgCi0gIC9pZiA/Pjw/Y3MgCi0vZGVmID8+Ci0KLTw/Y3MgIyBhcHBlYXJzIGF0IHRoZSBib3R0b20gb2YgZXZlcnkgcGFnZSA/Pjw/Y3MgCi1kZWY6Y3VzdG9tX2NjX2NvcHlyaWdodCgpID8+Ci0gIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIAotICBsaWNlbnNlZCB1bmRlciA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+LiBGb3IgZGV0YWlscyBhbmQgCi0gIHJlc3RyaWN0aW9ucywgc2VlIHRoZSA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5saWNlbnNlLmh0bWwiPkNvbnRlbnQgCi0gIExpY2Vuc2U8L2E+Ljw/Y3MgCi0vZGVmID8+Ci0KLTw/Y3MgCi1kZWY6Y3VzdG9tX2NvcHlyaWdodCgpID8+Ci0gIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyIDxhCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+QXBhY2hlIDIuMDwvYT4uIAotICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmxpY2Vuc2UuaHRtbCI+Ci0gIENvbnRlbnQgTGljZW5zZTwvYT4uPD9jcyAKLS9kZWYgPz4KLQotPD9jcyAKLWRlZjpjdXN0b21fZm9vdGVybGlua3MoKSA/PgotICA8cD4KLSAgICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zb3VyY2UvaW5kZXguaHRtbCI+QWJvdXQgQW5kcm9pZDwvYT4mbmJzcDsmbmJzcDt8Jm5ic3A7Ci0gICAgPGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c291cmNlL2NvbW11bml0eS5odG1sIj5Db21tdW5pdHk8L2E+Jm5ic3A7Jm5ic3A7fCZuYnNwOwotICAgIDxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmxlZ2FsLmh0bWwiPkxlZ2FsPC9hPiZuYnNwOyZuYnNwO3wmbmJzcDsKLSAgPC9wPjw/Y3MgCi0vZGVmID8+Ci0KLTw/Y3MgIyBhcHBlYXJzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBibHVlIGJhciBhdCB0aGUgYm90dG9tIG9mZiBldmVyeSBwYWdlID8+PD9jcyAKLQotZGVmOmN1c3RvbV9idWlsZGluZm8oKSA/Pjw/Y3MKLSAgaWY6IWdvb2dsZSAmJiAhcmVmZXJlbmNlLmdtcyAmJiAhcmVmZXJlbmNlLmdjbT8+Ci0gICAgQW5kcm9pZCA8P2NzIHZhcjpzZGsudmVyc2lvbiA/PiZuYnNwO3I8P2NzIHZhcjpzZGsucmVsLmlkID8+ICZtZGFzaDsgPD9jcwotICAvaWYgPz4KLTxzY3JpcHQgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz50aW1lc3RhbXAuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08c2NyaXB0PmRvY3VtZW50LndyaXRlKEJVSUxEX1RJTUVTVEFNUCk8L3NjcmlwdD4KLTw/Y3MgL2RlZiA/PgotCi0KLQotPD9jcyAjLS0tLS0tLS0tLS0tLS0tLS0tLSBzLmEuYyBzcGVjaWZpYyB0ZW1wbGF0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT8+Ci0KLTw/Y3MgCi1kZWY6c2FjX2xlZnRfbmF2KCkgPz4KLSAgPD9jcyBpZjpkZXZpY2VzID8+Ci0gICAgPD9jcyBjYWxsOmRldmljZXNfbmF2KCkgPz4KLSAgPD9jcyBlbGlmOmNvbXBhdGliaWxpdHkgPz4KLSAgICA8P2NzIGNhbGw6Y29tcGF0aWJpbGl0eV9uYXYoKSA/PgotICA8P2NzIGVsaWY6c291cmNlID8+Ci0gICAgPD9jcyBjYWxsOnNvdXJjZV9uYXYoKSA/PgotICA8P2NzIGVsaWY6c2VjdXJpdHkgPz4KLSAgICA8P2NzIGNhbGw6c2VjdXJpdHlfbmF2KCkgPz4KLSAgPD9jcyBlbGlmOnJlZmVyZW5jZSA/PgotICAgIDw/Y3MgY2FsbDpkZWZhdWx0X2xlZnRfbmF2KCkgPz4KLSAgPD9jcyAvaWYgPz4KLTw/Y3MgL2RlZiA/PgotCi08P2NzCi1kZWY6ZGV2aWNlc19uYXYoKSA/PgotICA8ZGl2IGNsYXNzPSJ3cmFwIGNsZWFyZml4IiBpZD0iYm9keS1jb250ZW50Ij4KLSAgICA8ZGl2IGNsYXNzPSJjb2wtNCIgaWQ9InNpZGUtbmF2IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICA8ZGl2IGlkPSJkZXZkb2MtbmF2IiBjbGFzcz0ic2Nyb2xsLXBhbmUiPgotPGEgY2xhc3M9InRvdG9wIiBocmVmPSIjdG9wIiBkYXRhLWctZXZlbnQ9ImxlZnQtbmF2LXRvcCI+dG8gdG9wPC9hPgotCi08P2NzIAotICAgICAgICBpbmNsdWRlOiIuLi8uLi8uLi8uLi8uLi9kb2NzL3NvdXJjZS5hbmRyb2lkLmNvbS9zcmMvZGV2aWNlcy9kZXZpY2VzX3RvYy5jcyIgPz4KLQotICAgICAgPC9kaXY+Ci0gICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgICAgIHNob3dUcmFkZWZlZFJlZlRyZWUoKTsKLSAgICAgIDwvc2NyaXB0PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci0KLTw/Y3MKLWRlZjpjb21wYXRpYmlsaXR5X25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2RvY3Mvc291cmNlLmFuZHJvaWQuY29tL3NyYy9jb21wYXRpYmlsaXR5L2NvbXBhdGliaWxpdHlfdG9jLmNzIiA/PgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4gPCEtLSBlbmQgc2lkZS1uYXYgLS0+Ci0gICAgPHNjcmlwdD4KLSAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgICBzY3JvbGxJbnRvVmlldygiZGV2ZG9jLW5hdiIpOwotICAgICAgICB9KTsKLSAgICA8L3NjcmlwdD4KLTw/Y3MgL2RlZiA/PgotCi08P2NzCi1kZWY6c291cmNlX25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2RvY3Mvc291cmNlLmFuZHJvaWQuY29tL3NyYy9zb3VyY2Uvc291cmNlX3RvYy5jcyIgPz4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+IDwhLS0gZW5kIHNpZGUtbmF2IC0tPgotICAgIDxzY3JpcHQ+Ci0gICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLSAgICAgICAgc2Nyb2xsSW50b1ZpZXcoImRldmRvYy1uYXYiKTsKLSAgICAgICAgfSk7Ci0gICAgPC9zY3JpcHQ+Ci08P2NzIC9kZWYgPz4KLQotPD9jcwotZGVmOnNlY3VyaXR5X25hdigpID8+Ci0gIDxkaXYgY2xhc3M9IndyYXAgY2xlYXJmaXgiIGlkPSJib2R5LWNvbnRlbnQiPgotICAgIDxkaXYgY2xhc3M9ImNvbC00IiBpZD0ic2lkZS1uYXYiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgIDxkaXYgaWQ9ImRldmRvYy1uYXYiIGNsYXNzPSJzY3JvbGwtcGFuZSI+Ci08YSBjbGFzcz0idG90b3AiIGhyZWY9IiN0b3AiIGRhdGEtZy1ldmVudD0ibGVmdC1uYXYtdG9wIj50byB0b3A8L2E+Ci0KLTw/Y3MgCi0gICAgICAgIGluY2x1ZGU6Ii4uLy4uLy4uLy4uLy4uL2RvY3Mvc291cmNlLmFuZHJvaWQuY29tL3NyYy9zZWN1cml0eS9zZWN1cml0eV90b2MuY3MiID8+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PiA8IS0tIGVuZCBzaWRlLW5hdiAtLT4KLSAgICA8c2NyaXB0PgotICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7Ci0gICAgICAgIHNjcm9sbEludG9WaWV3KCJkZXZkb2MtbmF2Iik7Ci0gICAgICAgIH0pOwotICAgIDwvc2NyaXB0PgotPD9jcyAvZGVmID8+Ci0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9kYXRhLmhkZiBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZGF0YS5oZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTFiNzguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9kYXRhLmhkZgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotdGVtcGxhdGUgewotICAgIHdoaWNoID0gbm9ybWFsCi19Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZGVzaWducGFnZS5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZGVzaWducGFnZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMDNmZi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Rlc2lnbnBhZ2UuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTw/Y3MgaW5jbHVkZToibWFjcm9zLmNzIiA/PgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotICAgICAgQW5kcm9pZCBEZXNpZ248P2NzIGlmOnBhZ2UudGl0bGUgPz4gLSA8P2NzIHZhcjpwYWdlLnRpdGxlID8+PD9jcyAvaWYgPz4KLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5hc3NldHMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+YXNzZXRzL2Rlc2lnbi9kZWZhdWx0LmNzcyI+Ci0gICAgPHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/PmFzc2V0cy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PnZhciBTSVRFX1JPT1QgPSAnPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduJzs8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iPD9jcyB2YXI6dG9yb290ID8+YXNzZXRzL2Rlc2lnbi9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLSAgPC9oZWFkPgotICA8Ym9keSBjbGFzcz0iZ2MtZG9jdW1lbnRhdGlvbiAKLSAgICA8P2NzIGlmOihndWlkZXx8ZGV2ZWxvcHx8dHJhaW5pbmd8fHJlZmVyZW5jZXx8dG9vbHN8fHNkaykgPz5kZXZlbG9wPD9jcwotICAgIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICAgIGVsaWY6ZGlzdHJpYnV0ZSA/PmRpc3RyaWJ1dGU8P2NzCi0gICAgL2lmID8+IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL0FydGljbGUiPgotICAgIDxhIG5hbWU9InRvcCI+PC9hPgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9XUEhlYWRlciI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPGRpdiBpZD0ibmF2LWNvbnRhaW5lciIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotCi0gICAgICAgIDw/Y3MgY2FsbDpkZXNpZ25fbmF2KCkgPz4KLQotICAgICAgICA8L2Rpdj4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotPD9jcyBpZjpoZWFkZXIuaGlkZSA/PgotPD9jcyBlbHNlID8+Ci08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIgPD9jcyBpZjpoZWFkZXIuanVzdExpbmtzID8+anVzdC1saW5rczw/Y3MgL2lmID8+Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgPD9jcyBpZjpoZWFkZXIuanVzdExpbmtzID8+Jm5ic3A7Ci0gICAgICA8P2NzIGVsaWY6aGVhZGVyLnRpdGxlID8+PGgyPjw/Y3MgdmFyOmhlYWRlci50aXRsZSA/PjwvaDI+Ci0gICAgICAgICAgICAgICAgICAgPD9jcyBlbHNlID8+PGgyPjw/Y3MgdmFyOnBhZ2UudGl0bGUgPz48L2gyPgotICAgIDw/Y3MgL2lmID8+Ci0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9TaXRlTmF2aWdhdGlvbkVsZW1lbnQiPgotICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICA8L2Rpdj4KLTwvZGl2PgotPD9jcyAvaWYgPz4KLQotPD9jcyBjYWxsOnRhZ19saXN0KHJvb3QuZGVzY3IpID8+Ci0KLTw/Y3MgaWY6Zm9vdGVyLmhpZGUgPz4KLTw/Y3MgZWxzZSA/PgotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICA8L2Rpdj4KLTwvZGl2PgotPD9jcyAvaWYgPz4KLQotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1dQRm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZG9jcGFnZS5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZG9jcGFnZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxMjBiNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2RvY3BhZ2UuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotPD9jcyBpbmNsdWRlOiJkb2N0eXBlLmNzIiA/PgotPD9jcyBpbmNsdWRlOiJtYWNyb3MuY3MiID8+Ci08aHRtbDw/Y3MgaWY6ZGV2c2l0ZSA/PiBkZXZzaXRlPD9jcyAvaWYgPz4+Ci08P2NzIGluY2x1ZGU6ImhlYWRfdGFnLmNzIiA/PgotPGJvZHkgY2xhc3M9ImdjLWRvY3VtZW50YXRpb24gPD9jcyBpZjooZ29vZ2xlIHx8IHJlZmVyZW5jZS5nbXMgfHwgcmVmZXJlbmNlLmdjbSkgPz5nb29nbGU8P2NzIC9pZiA/PgotICA8P2NzIGlmOihndWlkZXx8ZGV2ZWxvcHx8dHJhaW5pbmd8fHJlZmVyZW5jZXx8dG9vbHN8fHNkaykgPz5kZXZlbG9wPD9jcyBpZjpndWlkZSA/PiBndWlkZTw/Y3MgL2lmID8+PD9jcwotICBlbGlmOmFib3V0ID8+YWJvdXQ8P2NzCi0gIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICBlbGlmOmRpc3RyaWJ1dGUgPz5kaXN0cmlidXRlPD9jcwotICAvaWYgPz48P2NzCi0gIGlmOnBhZ2UudHJhaW5pbmdjb3Vyc2UgPz4gdHJhaW5pbmdjb3Vyc2U8P2NzIC9pZiA/PiIgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9BcnRpY2xlIj4KLTxhIG5hbWU9InRvcCI+PC9hPgotPD9jcyBpbmNsdWRlOiJoZWFkZXIuY3MiID8+Ci0KLTxkaXYgPD9jcyBpZjpmdWxscGFnZQotPz5jbGFzcz0iZnVsbHBhZ2UiPD9jcyBlbGlmOmRlc2lnbnx8dG9vbHN8fGFib3V0fHxzZGt8fGRpc3RyaWJ1dGUKLT8+Y2xhc3M9ImNvbC0xMyIgaWQ9ImRvYy1jb2wiPD9jcyBlbHNlIAotPz5jbGFzcz0iY29sLTEyIiBpZD0iZG9jLWNvbCI8P2NzIC9pZiA/PiA+Ci0KLTw/Y3MgaWY6KGRlc2lnbnx8dHJhaW5pbmd8fHdhbGt0aHJ1KSAmJiAhcGFnZS50cmFpbmluZ2NvdXJzZSAmJiAhcGFnZS5hcnRpY2xlID8+PD9jcyAjIGhlYWRlciBsb2dpYyBmb3IgZG9jcyB0aGF0IHByb3ZpZGUgcHJldmlvdXMvbmV4dCBidXR0b25zID8+Ci0gIDw/Y3MgaWY6aGVhZGVyLmhpZGUgPz4KLSAgPD9jcyBlbHNlID8+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciA8P2NzIGlmOmhlYWRlci5qdXN0TGlua3MgPz5qdXN0LWxpbmtzPD9jcyAvaWYgPz4iPgotICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCA8P2NzIGlmOnRyYWluaW5nID8+c3Bhbi03PD9jcyBlbHNlID8+c3Bhbi05PD9jcyAvaWYgPz4iPgotICAgICAgPD9jcyBpZjpoZWFkZXIuanVzdExpbmtzID8+Jm5ic3A7Ci0gICAgICA8P2NzIGVsc2UgPz48aDEgaXRlbXByb3A9Im5hbWUiPjw/Y3MgdmFyOnBhZ2UudGl0bGUgPz48L2gxPgotICAgICAgPD9jcyAvaWYgPz4KLSAgICA8L2Rpdj4KLSAgICA8P2NzIGlmOnRyYWluaW5nID8+Ci0gICAgICA8ZGl2IGNsYXNzPSJ0cmFpbmluZy1uYXYtdG9wIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIGhpZGUiCi0gICAgICAgICAgICB6aC1UVy1sYW5nPSLkuIrkuIDloILoqrIiCi0gICAgICAgICAgICB6aC1DTi1sYW5nPSLkuIrkuIDor74iCi0gICAgICAgICAgICBydS1sYW5nPSLQn9GA0LXQtNGL0LTRg9GJ0LjQuSIKLSAgICAgICAgICAgIGtvLWxhbmc9IuydtOyghCIKLSAgICAgICAgICAgIGphLWxhbmc9IuWJjeOBuCIKLSAgICAgICAgICAgIGVzLWxhbmc9IkFudGVyaW9yIgotICAgICAgICAgICAgPlByZXZpb3VzPC9hPgotICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsgaGlkZSIKLSAgICAgICAgICAgIHpoLVRXLWxhbmc9IuS4i+S4gOWgguiqsiIKLSAgICAgICAgICAgIHpoLUNOLWxhbmc9IuS4i+S4gOivviIKLSAgICAgICAgICAgIHJ1LWxhbmc9ItCh0LvQtdC00YPRjtGJ0LjQuSIKLSAgICAgICAgICAgIGtvLWxhbmc9IuuLpOydjCIKLSAgICAgICAgICAgIGphLWxhbmc9IuasoeOBuCIKLSAgICAgICAgICAgIGVzLWxhbmc9IlNpZ3VpZW50ZSIKLSAgICAgICAgICAgID5OZXh0PC9hPgotICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ic3RhcnQtY2xhc3MtbGluayBoaWRlIgotICAgICAgICAgICAgemgtVFctbGFuZz0i6ZaL5aeL5LiK6KqyIgotICAgICAgICAgICAgemgtQ04tbGFuZz0i5byA5aeLIgotICAgICAgICAgICAgcnUtbGFuZz0i0J3QsNGH0LDQu9C+INGA0LDQsdC+0YLRiyIKLSAgICAgICAgICAgIGtvLWxhbmc9IuyLnOyeke2VmOq4sCIKLSAgICAgICAgICAgIGphLWxhbmc9IumWi+Wni+OBmeOCiyIKLSAgICAgICAgICAgIGVzLWxhbmc9IkVtcGV6YXIiCi0gICAgICAgICAgICA+R2V0IHN0YXJ0ZWQ8L2E+Ci0gICAgICA8L2Rpdj4KLSAgICA8P2NzIGVsaWY6IXBhZ2UudHJhaW5pbmdjb3Vyc2UgPz4KLSAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayBoaWRlIgotICAgICAgICAgICAgemgtVFctbGFuZz0i5LiK5LiA5aCC6KqyIgotICAgICAgICAgICAgemgtQ04tbGFuZz0i5LiK5LiA6K++IgotICAgICAgICAgICAgcnUtbGFuZz0i0J/RgNC10LTRi9C00YPRidC40LkiCi0gICAgICAgICAgICBrby1sYW5nPSLsnbTsoIQiCi0gICAgICAgICAgICBqYS1sYW5nPSLliY3jgbgiCi0gICAgICAgICAgICBlcy1sYW5nPSJBbnRlcmlvciIKLSAgICAgICAgICAgID5QcmV2aW91czwvYT4KLSAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIGhpZGUiCi0gICAgICAgICAgICB6aC1UVy1sYW5nPSLkuIvkuIDloILoqrIiCi0gICAgICAgICAgICB6aC1DTi1sYW5nPSLkuIvkuIDor74iCi0gICAgICAgICAgICBydS1sYW5nPSLQodC70LXQtNGD0Y7RidC40LkiCi0gICAgICAgICAgICBrby1sYW5nPSLri6TsnYwiCi0gICAgICAgICAgICBqYS1sYW5nPSLmrKHjgbgiCi0gICAgICAgICAgICBlcy1sYW5nPSJTaWd1aWVudGUiCi0gICAgICAgICAgICA+TmV4dDwvYT4KLSAgICAgIDwvZGl2PgotICAgIDw/Y3MgL2lmID8+PD9jcyAjIGVuZCBpZiB0cmFpbmluZyA/PgotICA8L2Rpdj4KLSAgPD9jcyAvaWYgPz4KLTw/Y3MgZWxzZSA/PgotICA8P2NzIGlmOighZnVsbHBhZ2UgJiYgIWhlYWRlci5oaWRlKSA/PgotICAgIDw/Y3MgaWY6cGFnZS5sYW5kaW5nID8+PD9jcyAjIGhlYWRlciBsb2dpYyBmb3IgZG9jcyB0aGF0IGFyZSBsYW5kaW5nIHBhZ2VzID8+Ci0gICAgICA8ZGl2IGNsYXNzPSJsYW5kaW5nLWJhbm5lciI+Ci0gICAgICAgIDw/Y3MgaWY6cGFnZS5sYW5kaW5nLmltYWdlID8+PD9jcyAjIHVzZSB0d28tY29sdW1uIGxheW91dCBvbmx5IGlmIHRoZXJlJ3MgYW4gaW1hZ2UgPz4KLSAgICAgICAgPGRpdiBjbGFzcz0iY29sLTYiPgotICAgICAgICAgIDxpbWcgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz48P2NzIHZhcjpwYWdlLmxhbmRpbmcuaW1hZ2UgPz4iIGFsdD0iIiAvPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPGRpdiBjbGFzcz0iY29sLTYiPgotICAgICAgICA8P2NzIC9pZiA/PgotICAgICAgICAgIDxoMSBpdGVtcHJvcD0ibmFtZSIgc3R5bGU9Im1hcmdpbi1ib3R0b206MDsiPjw/Y3MgdmFyOnBhZ2UudGl0bGUgPz48L2gxPgotICAgICAgICAgIDxwIGl0ZW1wcm9wPSJkZXNjcmlwdGlvbiI+PD9jcyB2YXI6cGFnZS5sYW5kaW5nLmludHJvID8+PC9wPgotICAgICAgICAgIDxwPjxhIGNsYXNzPSJuZXh0LXBhZ2UtbGluayB0b3BpYy1zdGFydC1saW5rIj48L2E+PC9wPgotICAgICAgICA8P2NzIGlmOnBhZ2UubGFuZGluZy5pbWFnZSA/PgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPD9jcyAvaWYgPz4KLSAgICAgIDwvZGl2PgotICAgIDw/Y3MgZWxzZSA/PgotICAgICAgPD9jcyBpZjp0YWIxID8+PGRpdiBpZD0idGl0bGUtdGFicy13cmFwcGVyIj48P2NzIC9pZiA/PgotICAgICAgICA8aDEgaXRlbXByb3A9Im5hbWUiIDw/Y3MgaWY6dGFiMSA/PmNsYXNzPSJ3aXRoLXRpdGxlLXRhYnMiPD9jcyAvaWYgPz4+PD9jcyB2YXI6cGFnZS50aXRsZSA/PjwvaDE+PD9jcwotICAgICAgICAgIGlmOnRhYjEgPz48dWwgaWQ9InRpdGxlLXRhYnMiPgotICAgICAgICAgICAgICA8bGkgY2xhc3M9InNlbGVjdGVkIj48YSBocmVmPSI8P2NzIHZhcjp0YWIxLmxpbmsgPz4iPjw/Y3MgdmFyOnRhYjEgPz48L2E+PC9saT4KLSAgICAgICAgICAgICAgPD9jcyBpZjp0YWIyID8+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0YWIyLmxpbmsgPz4iPjw/Y3MgdmFyOnRhYjIgPz48L2E+PC9saT48P2NzIC9pZiA/PgotICAgICAgICAgICAgICA8P2NzIGlmOnRhYjMgPz4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRhYjMubGluayA/PiI+PD9jcyB2YXI6dGFiMyA/PjwvYT48L2xpPjw/Y3MgL2lmID8+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDw/Y3MgL2lmID8+Ci0gICAgICA8P2NzIGlmOnRhYjEgPz48L2Rpdj48IS0tIGVuZCB0YWItd3JhcHBlciAtLT48P2NzIC9pZiA/PgotICAgIDw/Y3MgL2lmID8+Ci0gIDw/Y3MgL2lmID8+Ci08P2NzIC9pZiA/Pjw/Y3MgIyBlbmQgaWYgZGVzaWduID8+Ci0KLSAgPD9jcyAjIFRISVMgSVMgVEhFIE1BSU4gRE9DIENPTlRFTlQgPz4KLSAgPGRpdiBpZD0iamQtY29udGVudCI+Ci0KLSAgICA8ZGl2IGNsYXNzPSJqZC1kZXNjciIgaXRlbXByb3A9ImFydGljbGVCb2R5Ij4KLSAgICA8P2NzIGNhbGw6dGFnX2xpc3Qocm9vdC5kZXNjcikgPz4KLSAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBjbGFzcz0iY29udGVudC1mb290ZXItc2FjIgotICAgICAgICAgICAgICAgICAgICBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL1NpdGVOYXZpZ2F0aW9uRWxlbWVudCI+Ci0gICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCA8P2NzIAotICAgICAgICAgICAgICAgICAgICBpZjpmdWxscGFnZSA/PmNvbC0xNjw/Y3MgCi0gICAgICAgICAgICAgICAgICAgIGVsaWY6dHJhaW5pbmd8fGd1aWRlID8+Y29sLTg8P2NzIAotICAgICAgICAgICAgICAgICAgICBlbHNlID8+Y29sLTk8P2NzIC9pZiA/PiIgc3R5bGU9InBhZGRpbmctdG9wOjRweCI+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8P2NzIGlmOiFmdWxsc2NyZWVuID8+Ci0gICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgY29sLTQiPgotICAgICAgICAgIDw/Y3MgaWY6KGRlc2lnbnx8dHJhaW5pbmd8fGd1aWRlfHx3YWxrdGhydSkgJiYgIXBhZ2UubGFuZGluZyAmJiAhcGFnZS50cmFpbmluZ2NvdXJzZSAmJiAhZm9vdGVyLmhpZGUgPz4KLSAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayBoaWRlIgotICAgICAgICAgICAgICAgIHpoLVRXLWxhbmc9IuS4iuS4gOWgguiqsiIKLSAgICAgICAgICAgICAgICB6aC1DTi1sYW5nPSLkuIrkuIDor74iCi0gICAgICAgICAgICAgICAgcnUtbGFuZz0i0J/RgNC10LTRi9C00YPRidC40LkiCi0gICAgICAgICAgICAgICAga28tbGFuZz0i7J207KCEIgotICAgICAgICAgICAgICAgIGphLWxhbmc9IuWJjeOBuCIKLSAgICAgICAgICAgICAgICBlcy1sYW5nPSJBbnRlcmlvciIKLSAgICAgICAgICAgICAgICA+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsgaGlkZSIKLSAgICAgICAgICAgICAgICB6aC1UVy1sYW5nPSLkuIvkuIDloILoqrIiCi0gICAgICAgICAgICAgICAgemgtQ04tbGFuZz0i5LiL5LiA6K++IgotICAgICAgICAgICAgICAgIHJ1LWxhbmc9ItCh0LvQtdC00YPRjtGJ0LjQuSIKLSAgICAgICAgICAgICAgICBrby1sYW5nPSLri6TsnYwiCi0gICAgICAgICAgICAgICAgamEtbGFuZz0i5qyh44G4IgotICAgICAgICAgICAgICAgIGVzLWxhbmc9IlNpZ3VpZW50ZSIKLSAgICAgICAgICAgICAgICA+TmV4dDwvYT4KLSAgICAgICAgICA8P2NzIC9pZiA/PgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPD9jcyAvaWYgPz4KLSAgICAgIDwvZGl2PgotICAgICAgPD9jcyAjIGZvciB0cmFpbmluZyBjbGFzc2VzLCBwcm92aWRlIGEgZGlmZmVyZW50IGtpbmQgb2YgbGluayB3aGVuIHRoZSBuZXh0IHBhZ2UgaXMgYSBkaWZmZXJlbnQgY2xhc3MgPz4KLSAgICAgIDw/Y3MgaWY6dHJhaW5pbmcgJiYgIXBhZ2UuYXJ0aWNsZSA/PgotICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIG5leHQtY2xhc3MiIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cDovL3NjaGVtYS5vcmcvU2l0ZU5hdmlnYXRpb25FbGVtZW50Ij4KLSAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1jbGFzcy1saW5rIGhpZGUiPk5leHQgY2xhc3M6IDwvYT4KLSAgICAgIDwvZGl2PgotICAgICAgPD9jcyAvaWYgPz4KLSAgICA8L2Rpdj4gPCEtLSBlbmQgamQtY29udGVudCAtLT4KLSAgPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci08L2Rpdj48IS0tIGVuZCBkb2MtY29udGVudCAtLT4KLQotPD9jcyBpbmNsdWRlOiJ0cmFpbGVyLmNzIiA/PgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2Zvb3Rlci5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZm9vdGVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDNhZGIwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZm9vdGVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPGRpdiBpZD0iZm9vdGVyIiBjbGFzcz0id3JhcCIgPD9jcyBpZjpmdWxscGFnZSA/PnN0eWxlPSJ3aWR0aDo5NDBweCI8P2NzIC9pZiA/Pj4KLSAgPHN0eWxlPi5mZWVkYmFjayB7IGZsb2F0OiByaWdodCAhSW1wb3J0YW50IH08L3N0eWxlPgotICA8ZGl2IGNsYXNzPSJmZWVkYmFjayI+Ci0gICAgPGEgaHJlZj0iIyIgY2xhc3M9ImJ1dHRvbiIgb25jbGljaz0iIHRyeSB7Ci0gICAgICB1c2VyZmVlZGJhY2suYXBpLnN0YXJ0RmVlZGJhY2soeydwcm9kdWN0SWQnOic3MTU1NzEnLCdhdXRodXNlcic6JzEnfSk7cmV0dXJuIGZhbHNlO31jYXRjaChlKXt9Ij5TaXRlIEZlZWRiYWNrPC9hPgotICA8L2Rpdj4KLSAgPGRpdiBpZD0iY29weXJpZ2h0Ij4KLSAgICA8P2NzIGNhbGw6Y3VzdG9tX2NjX2NvcHlyaWdodCgpID8+Ci0gIDwvZGl2PgotICAgIDxkaXYgaWQ9ImZvb3RlcmxpbmtzIj4KLSAgICA8P2NzIGNhbGw6Y3VzdG9tX2Zvb3RlcmxpbmtzKCkgPz4KLSAgPC9kaXY+CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2djbV9uYXZ0cmVlX2RhdGEuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2djbV9uYXZ0cmVlX2RhdGEuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzNkODguLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9nY21fbmF2dHJlZV9kYXRhLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi12YXIgR0NNX05BVlRSRUVfREFUQSA9Ci08P2NzIHZhcjpyZWZlcmVuY2VfdHJlZSA/PgotOwpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9nbXNfbmF2dHJlZV9kYXRhLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9nbXNfbmF2dHJlZV9kYXRhLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmI3ZDU1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvZ21zX25hdnRyZWVfZGF0YS5jcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdmFyIEdNU19OQVZUUkVFX0RBVEEgPQotPD9jcyB2YXI6cmVmZXJlbmNlX3RyZWUgPz4KLTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvaGVhZF90YWcuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRfdGFnLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjcyYjI1Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvaGVhZF90YWcuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTw/Y3MgaWY6cGFnZS5tZXRhRGVzY3JpcHRpb24gPz4KLTxtZXRhIG5hbWU9IkRlc2NyaXB0aW9uIiBjb250ZW50PSI8P2NzIHZhcjpwYWdlLm1ldGFEZXNjcmlwdGlvbiA/PiI+Ci08P2NzIC9pZiA/PgotPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmZhdmljb24uaWNvIiAvPgotPHRpdGxlPjw/Y3MgCi0gIGlmOnBhZ2UudGl0bGUgPz48P2NzIAotICAgIHZhcjpwYWdlLnRpdGxlID8+IHwgPD9jcwotICAvaWYgPz5BbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3Q8L3RpdGxlPgotCi08IS0tIFNUWUxFU0hFRVRTIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IgotaHJlZj0iPD9jcyBpZjphbmRyb2lkLndoaWNoZG9jICE9ICdvbmxpbmUnID8+aHR0cDo8P2NzIC9pZiA/Pi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljLGJvbGQiIHRpdGxlPSJyb2JvdG8iPgotPGxpbmsgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+YXNzZXRzL2Nzcy9kZWZhdWx0LmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci0KLTw/Y3MgaWY6cmVmZXJlbmNlICYmICEocmVmZXJlbmNlLmdtcyB8fCByZWZlcmVuY2UuZ2NtIHx8IHNhYykgPz4KLTwhLS0gRlVMTFNDUkVFTiBTVFlMRVNIRUVUIC0tPgotPGxpbmsgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+YXNzZXRzL2Nzcy9mdWxsc2NyZWVuLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjbGFzcz0iZnVsbHNjcmVlbiIKLXR5cGU9InRleHQvY3NzIj4KLTw/Y3MgL2lmID8+Ci0KLTwhLS0gSkFWQVNDUklQVCAtLT4KLTxzY3JpcHQgc3JjPSI8P2NzIGlmOmFuZHJvaWQud2hpY2hkb2MgIT0gJ29ubGluZScgPz5odHRwOjw/Y3MgL2lmID8+Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLTw/Y3MKLWlmOmRldnNpdGUKLSAgPz48c2NyaXB0IHNyYz0iPD9jcyB2YXI6dG9yb290ID8+X3N0YXRpYy9qcy9hbmRyb2lkXzNwLWJ1bmRsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD48P2NzCi1lbHNlCi0gID8+PHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/PmFzc2V0cy9qcy9hbmRyb2lkXzNwLWJ1bmRsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD48P2NzCi0vaWYgPz4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgdmFyIHRvUm9vdCA9ICI8P2NzIHZhcjp0b3Jvb3QgPz4iOwotICA8P2NzIGlmOmRldnNpdGUgPz4KLSAgdmFyIGRldnNpdGUgPSB0cnVlOwotICA8P2NzIGVsc2UgPz4KLSAgdmFyIGRldnNpdGUgPSBmYWxzZTsKLSAgPD9jcyAvaWYgPz4KLTwvc2NyaXB0PgotPHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/PmFzc2V0cy9qcy9kb2NzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPD9jcyBpZjpyZWZlcmVuY2UuZ21zIHx8IHJlZmVyZW5jZS5nY20gfHwgZ29vZ2xlPz4KLTxzY3JpcHQgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz5nbXNfbmF2dHJlZV9kYXRhLmpzIiBhc3luYyB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/PmdjbV9uYXZ0cmVlX2RhdGEuanMiIGFzeW5jIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08P2NzIGVsaWY6ZGV2aWNlcyA/PgotPHNjcmlwdCBzcmM9Ijw/Y3MgdmFyOnRvcm9vdCA/Pm5hdnRyZWVfZGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KLTw/Y3MgZWxpZjpyZWZlcmVuY2UgPz4KLTxzY3JpcHQgc3JjPSI8P2NzIHZhcjp0b3Jvb3QgPz5uYXZ0cmVlX2RhdGEuanMiIGFzeW5jIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08P2NzIC9pZiA/PgotCi08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL3d3dy5nc3RhdGljLmNvbS9mZWVkYmFjay9hcGkuanMiPjwvc2NyaXB0PgotCi08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gIHZhciBfZ2FxID0gX2dhcSB8fCBbXTsKLSAgX2dhcS5wdXNoKFsnX3NldEFjY291bnQnLCAnVUEtNDU0NTUyOTctMSddKTsKLSAgX2dhcS5wdXNoKFsnX3RyYWNrUGFnZXZpZXcnXSk7Ci0KLSAgKGZ1bmN0aW9uKCkgewotICAgIHZhciBnYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyBnYS50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7IGdhLmFzeW5jID0gdHJ1ZTsKLSAgICBnYS5zcmMgPSAoJ2h0dHBzOicgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgPyAnaHR0cHM6Ly9zc2wnIDogJ2h0dHA6Ly93d3cnKSArICcuZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnOwotICAgIHZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdOyBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGdhLCBzKTsKLSAgfSkoKTsKLTwvc2NyaXB0PgotPC9oZWFkPgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9oZWFkZXIuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRlci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiN2JjMC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRlci5jcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD9jcyBpZjpzYWMgPz4KLSAgPD9jcyBjYWxsOnNhY19tYXN0aGVhZCgpID8+Ci0gIDw/Y3MgY2FsbDpzYWNfbGVmdF9uYXYoKSA/PgotPD9jcyBlbHNlID8+Ci0gIDw/Y3MgY2FsbDpjdXN0b21fbWFzdGhlYWQoKSA/PgotICA8P2NzIGNhbGw6Y3VzdG9tX2xlZnRfbmF2KCkgPz4KLTw/Y3MgL2lmID8+CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRlcl90YWJzLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9oZWFkZXJfdGFicy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjOWRhOC4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2hlYWRlcl90YWJzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0KLTwhLS0gQ1VSUkVOVExZIE5PVCBVU0VELi4uIEFMTCBUQUJTIEFSRSBJTiBtYXN0aGVhZC5jcyAtLT4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvamRfbGlzdHNfdW5pZmllZC5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvamRfbGlzdHNfdW5pZmllZC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3YTVjMS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL2pkX2xpc3RzX3VuaWZpZWQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P2NzIHZhcjpyZWZlcmVuY2VfdHJlZSA/PgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9uYXZ0cmVlX2RhdGEuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL25hdnRyZWVfZGF0YS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhYTE5OS4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL25hdnRyZWVfZGF0YS5jcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotdmFyIE5BVlRSRUVfREFUQSA9Ci08P2NzIHZhcjpyZWZlcmVuY2VfdHJlZSA/PgotOwpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9ub3NpZGVuYXZwYWdlLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9ub3NpZGVuYXZwYWdlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU5NjkzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvbm9zaWRlbmF2cGFnZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/Y3MgaW5jbHVkZToiZG9jdHlwZS5jcyIgPz4KLTw/Y3MgaW5jbHVkZToibWFjcm9zLmNzIiA/PgotPGh0bWw8P2NzIGlmOmRldnNpdGUgPz4gZGV2c2l0ZTw/Y3MgL2lmID8+PgotPD9jcyBpbmNsdWRlOiJoZWFkX3RhZy5jcyIgPz4KLTxib2R5IGNsYXNzPSJnYy1kb2N1bWVudGF0aW9uIAotICA8P2NzIGlmOihndWlkZXx8ZGV2ZWxvcHx8dHJhaW5pbmd8fHJlZmVyZW5jZXx8dG9vbHN8fHNkaykgPz5kZXZlbG9wPD9jcwotICBlbGlmOmRlc2lnbiA/PmRlc2lnbjw/Y3MKLSAgZWxpZjpkaXN0cmlidXRlID8+ZGlzdHJpYnV0ZTw/Y3MKLSAgL2lmID8+IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL0FydGljbGUiPgotPGEgbmFtZT0idG9wIj48L2E+Ci08P2NzIGNhbGw6Y3VzdG9tX21hc3RoZWFkKCkgPz4KLQotPGRpdiBpZD0iYm9keS1jb250ZW50Ij4KLTxkaXYgaWQ9ImRvYy1jb250ZW50IiBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7Ij4KLQotPD9jcyBjYWxsOnRhZ19saXN0KHJvb3QuZGVzY3IpID8+Ci0KLTw/Y3MgaW5jbHVkZToiZm9vdGVyLmNzIiA/PgotPC9kaXY+PCEtLSBlbmQgZG9jLWNvbnRlbnQgLS0+Ci0KLTw/Y3MgaW5jbHVkZToidHJhaWxlci5jcyIgPz4KLQotPC9ib2R5PgotPC9odG1sPgotCi0KLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9wYWNrYWdlLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9wYWNrYWdlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ0OWYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvcGFja2FnZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/Y3MgaW5jbHVkZToiZG9jdHlwZS5jcyIgPz4KLTw/Y3MgaW5jbHVkZToibWFjcm9zLmNzIiA/PgotPGh0bWw8P2NzIGlmOmRldnNpdGUgPz4gZGV2c2l0ZTw/Y3MgL2lmID8+PgotPD9jcyBpbmNsdWRlOiJoZWFkX3RhZy5jcyIgPz4KLQotPGJvZHkgY2xhc3M9ImdjLWRvY3VtZW50YXRpb24gPD9jcyBpZjoocmVmZXJlbmNlLmdtcyB8fCByZWZlcmVuY2UuZ2NtKSA/Pmdvb2dsZTw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6KGd1aWRlfHxkZXZlbG9wfHx0cmFpbmluZ3x8cmVmZXJlbmNlfHx0b29sc3x8c2RrKSA/PmRldmVsb3A8P2NzCi0gIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICBlbGlmOmRpc3RyaWJ1dGUgPz5kaXN0cmlidXRlPD9jcwotICAvaWYgPz4iPgotICA8ZGl2IGlkPSJkb2MtYXBpLWxldmVsIiBjbGFzcz0iPD9jcyB2YXI6cGFja2FnZS5zaW5jZSA/PiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9kaXY+Ci0gIDxhIG5hbWU9InRvcCI+PC9hPgotPD9jcyBpbmNsdWRlOiJoZWFkZXIuY3MiID8+Ci0KLTxkaXYgY2xhc3M9ImNvbC0xMiIgaWQ9ImRvYy1jb2wiPgotCi08ZGl2IGlkPSJhcGktaW5mby1ibG9jayI+Ci08ZGl2IGNsYXNzPSJhcGktbGV2ZWwiPgotICA8P2NzIGNhbGw6c2luY2VfdGFncyhwYWNrYWdlKSA/PgotICA8P2NzIGNhbGw6ZmVkZXJhdGVkX3JlZnMocGFja2FnZSkgPz4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgaWQ9ImpkLWhlYWRlciI+Ci0gIHBhY2thZ2UKLSAgPGgxPjw/Y3MgdmFyOnBhY2thZ2UubmFtZSA/PjwvaDE+Ci08L2Rpdj48IS0tIGVuZCBoZWFkZXIgLS0+Ci0KLTxkaXYgaWQ9Im5hTWVzc2FnZSI+PC9kaXY+Ci0KLTxkaXYgaWQ9ImpkLWNvbnRlbnQiIGNsYXNzPSJhcGkgYXBpbGV2ZWwtPD9jcyB2YXI6cGFja2FnZS5zaW5jZSA/PiI+Ci0KLTw/Y3MgaWY6c3ViY291bnQocGFja2FnZS5kZXNjcikgPz4KLSAgPGRpdiBjbGFzcz0iamQtZGVzY3IiPgotICAgIDw/Y3MgY2FsbDp0YWdfbGlzdChwYWNrYWdlLmRlc2NyKSA/PgotICA8L2Rpdj4KLTw/Y3MgL2lmID8+Ci0KLTw/Y3MgZGVmOmNsYXNzX3RhYmxlKGxhYmVsLCBjbGFzc2VzKSA/PgotICA8P2NzIGlmOnN1YmNvdW50KGNsYXNzZXMpID8+Ci0gICAgPGgyPjw/Y3MgdmFyOmxhYmVsID8+PC9oMj4KLSAgICA8ZGl2IGNsYXNzPSJqZC1zdW10YWJsZSI+Ci0gICAgPD9jcyBjYWxsOmNsYXNzX2xpbmtfdGFibGUoY2xhc3NlcykgPz4KLSAgICA8L2Rpdj4KLSAgPD9jcyAvaWYgPz4KLTw/Y3MgL2RlZiA/PgotCi08P2NzIGNhbGw6Y2xhc3NfdGFibGUoIkFubm90YXRpb25zIiwgcGFja2FnZS5hbm5vdGF0aW9ucykgPz4KLTw/Y3MgY2FsbDpjbGFzc190YWJsZSgiSW50ZXJmYWNlcyIsIHBhY2thZ2UuaW50ZXJmYWNlcykgPz4KLTw/Y3MgY2FsbDpjbGFzc190YWJsZSgiQ2xhc3NlcyIsIHBhY2thZ2UuY2xhc3NlcykgPz4KLTw/Y3MgY2FsbDpjbGFzc190YWJsZSgiRW51bXMiLCBwYWNrYWdlLmVudW1zKSA/PgotPD9jcyBjYWxsOmNsYXNzX3RhYmxlKCJFeGNlcHRpb25zIiwgcGFja2FnZS5leGNlcHRpb25zKSA/PgotPD9jcyBjYWxsOmNsYXNzX3RhYmxlKCJFcnJvcnMiLCBwYWNrYWdlLmVycm9ycykgPz4KLQotPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci08L2Rpdj48IS0tIGVuZCBqZC1jb250ZW50IC0tPgotPC9kaXY+PCEtLSBkb2MtY29udGVudCAtLT4KLQotPD9jcyBpbmNsdWRlOiJ0cmFpbGVyLmNzIiA/PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3BhY2thZ2VzLmNzIGIvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy9wYWNrYWdlcy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2ODBjMy4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3BhY2thZ2VzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD9jcyBpbmNsdWRlOiJkb2N0eXBlLmNzIiA/PgotPD9jcyBpbmNsdWRlOiJtYWNyb3MuY3MiID8+Ci08aHRtbDw/Y3MgaWY6ZGV2c2l0ZSA/PiBkZXZzaXRlPD9jcyAvaWYgPz4+Ci08P2NzIGluY2x1ZGU6ImhlYWRfdGFnLmNzIiA/PgotPGJvZHkgY2xhc3M9ImdjLWRvY3VtZW50YXRpb24gPD9jcyBpZjoocmVmZXJlbmNlLmdtcyB8fCByZWZlcmVuY2UuZ2NtKSA/Pmdvb2dsZTw/Y3MgL2lmID8+Ci0gIDw/Y3MgaWY6KGd1aWRlfHxkZXZlbG9wfHx0cmFpbmluZ3x8cmVmZXJlbmNlfHx0b29sc3x8c2RrKSA/PmRldmVsb3A8P2NzCi0gIGVsaWY6ZGVzaWduID8+ZGVzaWduPD9jcwotICBlbGlmOmRpc3RyaWJ1dGUgPz5kaXN0cmlidXRlPD9jcwotICAvaWYgPz4iPgotICA8YSBuYW1lPSJ0b3AiPjwvYT4KLTw/Y3MgaW5jbHVkZToiaGVhZGVyLmNzIiA/PgotCi08ZGl2IGNsYXNzPSJjb2wtMTIiIGlkPSJkb2MtY29sIj4KLQotPGRpdiBpZD0iamQtaGVhZGVyIj4KLTxoMT48P2NzIHZhcjpwYWdlLnRpdGxlID8+PC9oMT4KLTwvZGl2PgotCi08ZGl2IGlkPSJqZC1jb250ZW50Ij4KLQotPGRpdiBjbGFzcz0iamQtZGVzY3IiPgotPHA+PD9jcyBjYWxsOnRhZ19saXN0KHJvb3QuZGVzY3IpID8+PC9wPgotPC9kaXY+Ci0KLTw/Y3Mgc2V0OmNvdW50ID0gIzEgPz4KLTx0YWJsZSBjbGFzcz0iamQtc3VtdGFibGUiPgotPD9jcyBlYWNoOnBrZyA9IGRvY3MucGFja2FnZXMgPz4KLSAgICA8dHIgY2xhc3M9Ijw/Y3MgaWY6Y291bnQgJSAjMiA/PmFsdC1jb2xvcjw/Y3MgL2lmID8+IGFwaSBhcGlsZXZlbC08P2NzIHZhcjpwa2cuc2luY2UgPz4iID4KLSAgICAgICAgPHRkIGNsYXNzPSJqZC1saW5rY29sIj48P2NzIGNhbGw6cGFja2FnZV9saW5rKHBrZykgPz48L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImpkLWRlc2NyY29sIiB3aWR0aD0iMTAwJSI+PD9jcyBjYWxsOnRhZ19saXN0KHBrZy5zaG9ydERlc2NyKSA/PjwvdGQ+Ci0gICAgPC90cj4KLTw/Y3Mgc2V0OmNvdW50ID0gY291bnQgKyAjMSA/PgotPD9jcyAvZWFjaCA/PgotPC90YWJsZT4KLQotPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci08L2Rpdj48IS0tIGVuZCBqZC1jb250ZW50IC0tPgotPC9kaXY+IDwhLS0gZW5kIGRvYy1jb250ZW50IC0tPgotCi08P2NzIGluY2x1ZGU6InRyYWlsZXIuY3MiID8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvc2FtcGxlaW5kZXguY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3NhbXBsZWluZGV4LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTczMzYzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvc2FtcGxlaW5kZXguY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P2NzIGluY2x1ZGU6ImRvY3R5cGUuY3MiID8+Ci08P2NzIGluY2x1ZGU6Im1hY3Jvcy5jcyIgPz4KLTw/Y3Mgc2V0OnJlc291cmNlcz0idHJ1ZSIgPz4KLTxodG1sPD9jcyBpZjpkZXZzaXRlID8+IGRldnNpdGU8P2NzIC9pZiA/Pj4KLTw/Y3MgaW5jbHVkZToiaGVhZF90YWcuY3MiID8+Ci08P2NzIGluY2x1ZGU6ImhlYWRlci5jcyIgPz4KLTxib2R5IGNsYXNzPSJnYy1kb2N1bWVudGF0aW9uIj4KLQotCi08YSBuYW1lPSJ0b3AiPjwvYT4KLTxkaXYgY2xhc3M9ImctdW5pdCIgaWQ9ImRvYy1jb250ZW50Ij4KLSA8ZGl2IGlkPSJqZC1oZWFkZXIiIGNsYXNzPSJndWlkZS1oZWFkZXIiPgotICAgIDxzcGFuIGNsYXNzPSJjcnVtYiI+Ci0gICAgICA8YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5yZXNvdXJjZXMvYnJvd3Nlci5odG1sP3RhZz1zYW1wbGUiPlNhbXBsZSBDb2RlPC9hPiA+Ci0gICAgPC9zcGFuPgotICA8aDE+PD9jcyB2YXI6cGFnZS50aXRsZSA/PjwvaDE+Ci0gPC9kaXY+Ci0KLTxkaXYgaWQ9ImpkLWNvbnRlbnQiPgotPHA+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+JmxhcnI7IEJhY2s8L2E+PC9wPgotCi08P2NzIHZhcjpzdW1tYXJ5ID8+Ci0KLSAgPD9jcyBpZjpzdWJjb3VudChzdWJkaXJzKSA/PgotICAgICAgPGgyPlN1YmRpcmVjdG9yaWVzPC9oMj4KLSAgICAgIDx1bCBjbGFzcz0ibm9saXN0Ij4KLSAgICAgIDw/Y3MgZWFjaDpkaXI9c3ViZGlycyA/PgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6ZGlyLm5hbWUgPz4vaW5kZXguaHRtbCI+PD9jcwotICAgICAgICAgIHZhcjpkaXIubmFtZSA/Pi88L2E+PC9saT4KLSAgICAgIDw/Y3MgL2VhY2ggPz4KLSAgICAgIDwvdWw+Ci0gIDw/Y3MgL2lmID8+Ci0KLSAgPD9jcyBpZjpzdWJjb3VudChmaWxlcykgPz4KLSAgICAgIDxoMj5GaWxlczwvaDI+Ci0gICAgICA8dWwgY2xhc3M9Im5vbGlzdCI+Ci0gICAgICA8P2NzIGVhY2g6ZmlsZT1maWxlcyA/PgotICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6ZmlsZS5ocmVmID8+Ij48P2NzCi0gICAgICAgICAgdmFyOmZpbGUubmFtZSA/PjwvYT48L2xpPgotICAgICAgPD9jcyAvZWFjaCA/PgotICAgICAgPC91bD4KLSAgPD9jcyAvaWYgPz4KLQotPC9kaXY+PCEtLSBlbmQgamQtY29udGVudCAtLT4KLQotPD9jcyBpbmNsdWRlOiJmb290ZXIuY3MiID8+Ci0KLTwvZGl2PjwhLS0gZW5kIGRvYy1jb250ZW50IC0tPgotCi08P2NzIGluY2x1ZGU6InRyYWlsZXIuY3MiID8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvc2RrcGFnZS5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvc2RrcGFnZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjZmQyNi4uMDAwMDAwMAotLS0gYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3Nka3BhZ2UuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotPD9jcyBpbmNsdWRlOiJkb2N0eXBlLmNzIiA/PgotPD9jcyBpbmNsdWRlOiJtYWNyb3MuY3MiID8+Ci08aHRtbDw/Y3MgaWY6ZGV2c2l0ZSA/PiBkZXZzaXRlPD9jcyAvaWYgPz4+Ci08P2NzIGlmOnNkay5yZWRpcmVjdCA/PgotICA8aGVhZD4KLSAgICA8dGl0bGU+UmVkaXJlY3RpbmcuLi48L3RpdGxlPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7dXJsPTw/Y3MgdmFyOnRvcm9vdCA/PnNkay88P2NzCi0gICAgICBpZjpzZGsucmVkaXJlY3QucGF0aCA/Pjw/Y3MgdmFyOnNkay5yZWRpcmVjdC5wYXRoID8+PD9jcwotICAgICAgZWxzZSA/PmluZGV4Lmh0bWw8P2NzIC9pZiA/PiI+Ci0gIDwvaGVhZD4KLTw/Y3MgZWxzZSA/PgotICA8P2NzIGluY2x1ZGU6ImhlYWRfdGFnLmNzIiA/PgotPD9jcyAvaWYgPz4KLTxib2R5IGNsYXNzPSJnYy1kb2N1bWVudGF0aW9uIAotICA8P2NzIGlmOihndWlkZXx8ZGV2ZWxvcHx8dHJhaW5pbmd8fHJlZmVyZW5jZXx8dG9vbHN8fHNkaykgPz5kZXZlbG9wPD9jcwotICBlbGlmOmRlc2lnbiA/PmRlc2lnbjw/Y3MKLSAgZWxpZjpkaXN0cmlidXRlID8+ZGlzdHJpYnV0ZTw/Y3MKLSAgL2lmID8+IiBpdGVtc2NvcGUgaXRlbXR5cGU9Imh0dHA6Ly9zY2hlbWEub3JnL0NyZWF0aXZlV29yayI+Ci0gIDxhIG5hbWU9InRvcCI+PC9hPgotPD9jcyBpbmNsdWRlOiJoZWFkZXIuY3MiID8+Ci0KLQotPGRpdiA8P2NzIGlmOmZ1bGxwYWdlCi0/Pjw/Y3MgZWxzZQotPz5jbGFzcz0iY29sLTEzIiBpZD0iZG9jLWNvbCI8P2NzIC9pZiA/PiA+Ci0KLTw/Y3MgaWY6c2RrLnJlZGlyZWN0ID8+Ci0KLTxkaXYgY2xhc3M9ImctdW5pdCI+Ci0gIDxkaXYgaWQ9ImpkLWNvbnRlbnQiPgotICAgIDxwPlJlZGlyZWN0aW5nIHRvCi0gICAgPGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrLzw/Y3MKLSAgICAgIGlmOnNkay5yZWRpcmVjdC5wYXRoID8+PD9jcyB2YXI6c2RrLnJlZGlyZWN0LnBhdGggPz48P2NzCi0gICAgICBlbHNlID8+aW5kZXguaHRtbDw/Y3MgL2lmID8+Ij48P2NzCi0gICAgICBpZjpzZGsucmVkaXJlY3QucGF0aCA/Pjw/Y3MgdmFyOnNkay5yZWRpcmVjdC5wYXRoID8+PD9jcwotICAgICAgZWxzZSA/PkRvd25sb2FkIHRoZSBTREs8P2NzIC9pZiA/PgotICAgIDwvYT4gLi4uPC9wPgotCi08P2NzIGVsc2UgPz4KLTw/Y3MgIyBlbHNlLCBpZiBOT1QgcmVkaXJlY3QgLi4uCi0jCi0jCi0jIFRoZSBmb2xsb3dpbmcgaXMgZm9yIFNESy9OREsgcGFnZXMKLSMKLSMKLT8+Ci0KLTw/Y3MgaWY6aGVhZGVyLmhpZGUgPz48P2NzIGVsc2UgPz4KLTxoMSBpdGVtcHJvcD0ibmFtZSI+PD9jcyB2YXI6cGFnZS50aXRsZSA/PjwvaDE+Ci08P2NzIC9pZiA/PgotICA8ZGl2IGlkPSJqZC1jb250ZW50IiBpdGVtcHJvcD0iZGVzY3JpcHRpb24iPgotCi08P2NzIGlmOnNkay5ub3RfbGF0ZXN0X3ZlcnNpb24gPz4KLSAgPGRpdiBjbGFzcz0ic3BlY2lhbCI+Ci0gICAgPHA+PHN0cm9uZz5UaGlzIGlzIE5PVCB0aGUgY3VycmVudCBBbmRyb2lkIFNESyByZWxlYXNlLjwvc3Ryb25nPjwvcD4KLSAgICA8cD48YSBocmVmPSIvc2RrL2luZGV4Lmh0bWwiPkRvd25sb2FkIHRoZSBjdXJyZW50IEFuZHJvaWQgU0RLPC9hPjwvcD4KLSAgPC9kaXY+Ci08P2NzIC9pZiA/PgotCi0KLTw/Y3MgaWY6bmRrID8+Ci08P2NzICMKLSMKLSMKLSMKLSMKLSMKLSMKLSMgdGhlIGZvbGxvd2luZyBpcyBmb3IgdGhlIE5ESwotIwotIyAobmVzdGVkIGluIGlmL2Vsc2UgcmVkaXJlY3QpCi0jCi0jCi0jCi0jCi0/PgotCi0gIDx0YWJsZSBjbGFzcz0iZG93bmxvYWQiIGlkPSJkb3dubG9hZC10YWJsZSI+Ci0gICAgPHRyPgotICAgICAgPHRoPlBsYXRmb3JtPC90aD4KLSAgICAgIDx0aD5QYWNrYWdlPC90aD4KLSAgICAgIDx0aD5TaXplPC90aD4KLSAgICAgIDx0aD5NRDUgQ2hlY2tzdW08L3RoPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPldpbmRvd3M8L3RkPgotICAgIDx0ZD4KLSAgPGEgb25DbGljaz0icmV0dXJuIG9uRG93bmxvYWQodGhpcykiCi0gICAgIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvbmRrLzw/Y3MgdmFyOm5kay53aW5fZG93bmxvYWQgPz4iPjw/Y3MgdmFyOm5kay53aW5fZG93bmxvYWQgPz48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6bmRrLndpbl9ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOm5kay53aW5fY2hlY2tzdW0gPz48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPk1hYyBPUyBYIChpbnRlbCk8L3RkPgotICAgIDx0ZD4KLSAgPGEgb25DbGljaz0icmV0dXJuIG9uRG93bmxvYWQodGhpcykiCi0gICAgIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvbmRrLzw/Y3MgdmFyOm5kay5tYWNfZG93bmxvYWQgPz4iPjw/Y3MgdmFyOm5kay5tYWNfZG93bmxvYWQgPz48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6bmRrLm1hY19ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOm5kay5tYWNfY2hlY2tzdW0gPz48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPkxpbnV4IDMyLzY0LWJpdCAoeDg2KTwvdGQ+Ci0gICAgPHRkPgotICA8YSBvbkNsaWNrPSJyZXR1cm4gb25Eb3dubG9hZCh0aGlzKSIKLSAgICAgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9uZGsvPD9jcyB2YXI6bmRrLmxpbnV4X2Rvd25sb2FkID8+Ij48P2NzIHZhcjpuZGsubGludXhfZG93bmxvYWQgPz48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6bmRrLmxpbnV4X2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6bmRrLmxpbnV4X2NoZWNrc3VtID8+PC90ZD4KLSAgPC90cj4KLSAgPC90YWJsZT4KLSAgCi0gIDw/Y3MgIyMjIyMjIyMgIEhFUkUgSVMgVEhFIEpEIERPQyBDT05URU5UICMjIyMjIyMjIyA/PgotICA8P2NzIGNhbGw6dGFnX2xpc3Qocm9vdC5kZXNjcikgPz4KLQotCi0gIAotPHNjcmlwdD4KLSAgZnVuY3Rpb24gb25Eb3dubG9hZChsaW5rKSB7Ci0KLSAgICAkKCIjZG93bmxvYWRGb3JSZWFseiIpLmh0bWwoIkRvd25sb2FkICIgKyAkKGxpbmspLnRleHQoKSk7Ci0gICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCdocmVmJywkKGxpbmspLmF0dHIoJ2hyZWYnKSk7Ci0KLSAgICAkKCIjdG9zIikuZmFkZUluKCdzbG93Jyk7Ci0KLSAgICBsb2NhdGlvbi5oYXNoID0gImRvd25sb2FkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi0gIGZ1bmN0aW9uIG9uQWdyZWVDaGVja2VkKCkgewotICAgIGlmICgkKCJpbnB1dCNhZ3JlZSIpLmlzKCI6Y2hlY2tlZCIpKSB7Ci0gICAgICAkKCJhI2Rvd25sb2FkRm9yUmVhbHoiKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKLSAgICB9IGVsc2UgewotICAgICAgJCgiYSNkb3dubG9hZEZvclJlYWx6IikuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gb25Eb3dubG9hZE5ka0ZvclJlYWx6KGxpbmspIHsKLSAgICBpZiAoJCgiaW5wdXQjYWdyZWUiKS5pcygnOmNoZWNrZWQnKSkgewotICAgICAgJCgiI3RvcyIpLmZhZGVPdXQoJ3Nsb3cnKTsKLSAgICAgIAotICAgICAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoewotICAgICAgICAgIHNjcm9sbFRvcDogJCgiI0luc3RhbGxpbmciKS5vZmZzZXQoKS50b3AKLSAgICAgICAgfSwgODAwLCBmdW5jdGlvbigpIHsKLSAgICAgICAgICAkKCIjSW5zdGFsbGluZyIpLmNsaWNrKCk7Ci0gICAgICB9KTsKLSAgICAgCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgJCgibGFiZWwjYWdyZWVMYWJlbCIpLnBhcmVudCgpLnN0b3AoKS5hbmltYXRlKHtjb2xvcjogIiMyNThBQUYifSwgMjAwLAotICAgICAgICBmdW5jdGlvbigpIHskKCJsYWJlbCNhZ3JlZUxhYmVsIikucGFyZW50KCkuc3RvcCgpLmFuaW1hdGUoe2NvbG9yOiAiIzIyMiJ9LCAyMDApfQotICAgICAgKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAkKHdpbmRvdykuaGFzaGNoYW5nZSggZnVuY3Rpb24oKXsKLSAgICBpZiAobG9jYXRpb24uaGFzaCA9PSAiIikgewotICAgICAgbG9jYXRpb24ucmVsb2FkKCk7Ci0gICAgfQotICB9KTsKLQotPC9zY3JpcHQ+Ci0KLSAgPD9jcyBlbHNlID8+Ci08P2NzICMgZW5kIGlmIE5ESyAuLi4gCi0jCi0jCi0jCi0jCi0jCi0jCi0jIHRoZSBmb2xsb3dpbmcgaXMgZm9yIHRoZSBTREsKLSMKLSMgKG5lc3RlZCBpbiBpZi9lbHNlIHJlZGlyZWN0IGFuZCBpZi9lbHNlIE5ESykKLSMKLSMKLSMKLSMKLT8+Ci0gIDw/Y3MgaWY6YW5kcm9pZC53aGljaGRvYyA9PSAib25saW5lIiA/PgotCi0KLTw/Y3MgIyMjIyMjIyMgIEhFUkUgSVMgVEhFIEpEIERPQyBDT05URU5UIEZPUiBPTkxJTkUgIyMjIyMjIyMjID8+Ci08P2NzIGNhbGw6dGFnX2xpc3Qocm9vdC5kZXNjcikgPz4KLQotCi0KLQotPGg0PjxhIGhyZWY9JycgY2xhc3M9ImV4cGFuZGFibGUiCi0gIG9uY2xpY2s9InRvZ2dsZUV4cGFuZGFibGUodGhpcywnLnBheCcpO2hpZGVFeHBhbmRhYmxlKCcubXlpZGUsLnJlcXMnKTtyZXR1cm4gZmFsc2U7IgotICA+RE9XTkxPQUQgRk9SIE9USEVSIFBMQVRGT1JNUzwvYT48L2g0PgotICAKLSAgCi08ZGl2IGNsYXNzPSJwYXggY29sLTEzIG9ubGluZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTttYXJnaW46MDsiPgotCi0gIAotPHAgY2xhc3M9InRhYmxlLWNhcHRpb24iPjxzdHJvbmc+QURUIEJ1bmRsZTwvc3Ryb25nPjwvcD4KLSAgPHRhYmxlIGNsYXNzPSJkb3dubG9hZCI+Ci0gICAgPHRyPgotICAgICAgPHRoPlBsYXRmb3JtPC90aD4KLSAgICAgIDx0aD5QYWNrYWdlPC90aD4KLSAgICAgIDx0aD5TaXplPC90aD4KLSAgICAgIDx0aD5NRDUgQ2hlY2tzdW08L3RoPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPldpbmRvd3MgMzItYml0PC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uQ2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBpZD0id2luLWJ1bmRsZTMyIgotICAgICBocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL2FkdC88P2NzIHZhcjpzZGsud2luMzJfYnVuZGxlX2Rvd25sb2FkID8+Ij48P2NzIHZhcjpzZGsud2luMzJfYnVuZGxlX2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay53aW4zMl9idW5kbGVfYnl0ZXMgPz4gYnl0ZXM8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsud2luMzJfYnVuZGxlX2NoZWNrc3VtID8+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD5XaW5kb3dzIDY0LWJpdDwvdGQ+Ci0gICAgPHRkPgotICA8YSBvbkNsaWNrPSJyZXR1cm4gb25Eb3dubG9hZCh0aGlzKSIgaWQ9Indpbi1idW5kbGU2NCIKLSAgICAgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9hZHQvPD9jcyB2YXI6c2RrLndpbjY0X2J1bmRsZV9kb3dubG9hZCA/PiI+PD9jcyB2YXI6c2RrLndpbjY0X2J1bmRsZV9kb3dubG9hZCA/PjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsud2luNjRfYnVuZGxlX2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6c2RrLndpbjY0X2J1bmRsZV9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+PG5vYnI+TWFjIE9TIFggNjQtYml0PC9ub2JyPjwvdGQ+Ci0gICAgPHRkPgotICA8YSBvbkNsaWNrPSJyZXR1cm4gb25Eb3dubG9hZCh0aGlzKSIgaWQ9Im1hYy1idW5kbGU2NCIKLSAgICAgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9hZHQvPD9jcyB2YXI6c2RrLm1hYzY0X2J1bmRsZV9kb3dubG9hZCA/PiI+PD9jcyB2YXI6c2RrLm1hYzY0X2J1bmRsZV9kb3dubG9hZCA/PjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsubWFjNjRfYnVuZGxlX2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6c2RrLm1hYzY0X2J1bmRsZV9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+TGludXggMzItYml0PC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uQ2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBpZD0ibGludXgtYnVuZGxlMzIiCi0gICAgIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYWR0Lzw/Y3MgdmFyOnNkay5saW51eDMyX2J1bmRsZV9kb3dubG9hZCA/PiI+PD9jcyB2YXI6c2RrLmxpbnV4MzJfYnVuZGxlX2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eDMyX2J1bmRsZV9ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eDMyX2J1bmRsZV9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+TGludXggNjQtYml0PC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uQ2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBpZD0ibGludXgtYnVuZGxlNjQiCi0gICAgIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvYWR0Lzw/Y3MgdmFyOnNkay5saW51eDY0X2J1bmRsZV9kb3dubG9hZCA/PiI+PD9jcyB2YXI6c2RrLmxpbnV4NjRfYnVuZGxlX2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eDY0X2J1bmRsZV9ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eDY0X2J1bmRsZV9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDwvdGFibGU+Ci0KLQotPHAgY2xhc3M9InRhYmxlLWNhcHRpb24iPjxzdHJvbmc+U0RLIFRvb2xzIE9ubHk8L3N0cm9uZz48L3A+Ci0gIDx0YWJsZSBjbGFzcz0iZG93bmxvYWQiPgotICAgIDx0cj4KLSAgICAgIDx0aD5QbGF0Zm9ybTwvdGg+Ci0gICAgICA8dGg+UGFja2FnZTwvdGg+Ci0gICAgICA8dGg+U2l6ZTwvdGg+Ci0gICAgICA8dGg+TUQ1IENoZWNrc3VtPC90aD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCByb3dzcGFuPSIyIj5XaW5kb3dzPC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uY2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkLzw/Y3MgdmFyOnNkay53aW5fZG93bmxvYWQKLT8+Ij48P2NzIHZhcjpzZGsud2luX2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay53aW5fYnl0ZXMgPz4gYnl0ZXM8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsud2luX2NoZWNrc3VtID8+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDwhLS0gYmxhbmsgVEQgZnJvbSBXaW5kb3dzIHJvd3NwYW4gLS0+Ci0gICAgPHRkPgotICA8YSBvbmNsaWNrPSJyZXR1cm4gb25Eb3dubG9hZCh0aGlzKSIgaWQ9Indpbi10b29scyIgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC88P2NzCi12YXI6c2RrLndpbl9pbnN0YWxsZXIKLT8+Ij48P2NzIHZhcjpzZGsud2luX2luc3RhbGxlciA/PjwvYT4gKFJlY29tbWVuZGVkKQotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay53aW5faW5zdGFsbGVyX2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6c2RrLndpbl9pbnN0YWxsZXJfY2hlY2tzdW0gPz48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPk1hYyBPUyBYPC90ZD4KLSAgICA8dGQ+Ci0gIDxhIG9uY2xpY2s9InJldHVybiBvbkRvd25sb2FkKHRoaXMpIiBpZD0ibWFjLXRvb2xzIiBocmVmPSJodHRwOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkLzw/Y3MKLXZhcjpzZGsubWFjX2Rvd25sb2FkCi0/PiI+PD9jcyB2YXI6c2RrLm1hY19kb3dubG9hZCA/PjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZD48P2NzIHZhcjpzZGsubWFjX2J5dGVzID8+IGJ5dGVzPC90ZD4KLSAgICA8dGQ+PD9jcyB2YXI6c2RrLm1hY19jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQ+TGludXg8L3RkPgotICAgIDx0ZD4KLSAgPGEgb25jbGljaz0icmV0dXJuIG9uRG93bmxvYWQodGhpcykiIGlkPSJsaW51eC10b29scyIgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC88P2NzCi12YXI6c2RrLmxpbnV4X2Rvd25sb2FkCi0/PiI+PD9jcyB2YXI6c2RrLmxpbnV4X2Rvd25sb2FkID8+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eF9ieXRlcyA/PiBieXRlczwvdGQ+Ci0gICAgPHRkPjw/Y3MgdmFyOnNkay5saW51eF9jaGVja3N1bSA/PjwvdGQ+Ci0gIDwvdHI+Ci0gIDwvdGFibGU+Ci0KLTwvZGl2PjwhLS0gZW5kIHBheCAtLT4KLQotCi0KLTwvZGl2PjwhLS0gZW5kIGNvbC0xMyBmb3IgbG93ZXItaGFsZiBjb250ZW50IC0tPgotICAKLSAgCi0gIAotICAKLTxzY3JpcHQ+Ci0gIGlmIChsb2NhdGlvbi5oYXNoID09ICIjUmVxdWlyZW1lbnRzIikgewotICAgICQoJy5yZXFzJykuc2hvdygpOwotICB9IGVsc2UgaWYgKGxvY2F0aW9uLmhhc2ggPT0gIiNFeGlzdGluZ0lERSIpIHsKLQkgJCgnLmlkZScpLnNob3coKTsKLSAgfQotCi0gIHZhciBvczsKLSAgdmFyIGJ1bmRsZW5hbWU7Ci0gIHZhciAkdG9vbHNsaW5rOwotCi0gIGlmIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJXaW4iKSE9LTEpIHsKLSAgICBvcyA9ICJXaW5kb3dzIjsKLSAgICBidW5kbGVuYW1lID0gJyN3aW4tYnVuZGxlJzsKLSAgICAkdG9vbHNsaW5rID0gJCgnI3dpbi10b29scycpOwotICB9IGVsc2UgaWYgKG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoIk1hYyIpIT0tMSkgewotICAgIG9zID0gIk1hYyI7Ci0gICAgYnVuZGxlbmFtZSA9ICcjbWFjLWJ1bmRsZSc7Ci0gICAgJHRvb2xzbGluayA9ICQoJyNtYWMtdG9vbHMnKTsKLSAgfSBlbHNlIGlmIChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJMaW51eCIpIT0tMSkgewotICAgIG9zID0gIkxpbnV4IjsKLSAgICBidW5kbGVuYW1lID0gJyNsaW51eC1idW5kbGUnOwotICAgICR0b29sc2xpbmsgPSAkKCcjbGludXgtdG9vbHMnKTsKLSAgfQotCi0gIGlmIChvcykgewotICAgICQoJyNub3Qtc3VwcG9ydGVkJykuaGlkZSgpOwotCi0gICAgLyogc2V0IHVwIHByaW1hcnkgYWR0IGRvd25sb2FkIGJ1dHRvbiAqLwotICAgICQoJyNkb3dubG9hZC1idW5kbGUtYnV0dG9uJykuc2hvdygpOwotICAgICQoJyNkb3dubG9hZC1idW5kbGUtYnV0dG9uJykuYXBwZW5kKCJEb3dubG9hZCB0aGUgU0RLIDxici8+PHNwYW4gY2xhc3M9J3NtYWxsJz5BRFQgQnVuZGxlIGZvciAiICsgb3MgKyAiPC9zcGFuPiIpOwotICAgICQoJyNkb3dubG9hZC1idW5kbGUtYnV0dG9uJykuY2xpY2soZnVuY3Rpb24oKSB7cmV0dXJuIG9uRG93bmxvYWQodGhpcyx0cnVlLHRydWUpO30pLmF0dHIoJ2hyZWYnLCBidW5kbGVuYW1lKTsKLQotICAgIC8qIHNldCB1cCBzZGsgdG9vbHMgb25seSBidXR0b24gKi8KLSAgICAkKCcjZG93bmxvYWQtdG9vbHMtYnV0dG9uJykuc2hvdygpOwotICAgICQoJyNkb3dubG9hZC10b29scy1idXR0b24nKS5hcHBlbmQoIkRvd25sb2FkIHRoZSBTREsgVG9vbHMgZm9yICIgKyBvcyk7Ci0gICAgJCgnI2Rvd25sb2FkLXRvb2xzLWJ1dHRvbicpLmNsaWNrKGZ1bmN0aW9uKCkge3JldHVybiBvbkRvd25sb2FkKHRoaXMsdHJ1ZSk7fSkuYXR0cignaHJlZicsICR0b29sc2xpbmsuYXR0cignaHJlZicpKTsKLSAgfSBlbHNlIHsKLSAgICAkKCcucGF4Jykuc2hvdygpOwotICB9Ci0gIAotICAKLSAgZnVuY3Rpb24gb25Eb3dubG9hZChsaW5rLCBidXR0b24sIGJ1bmRsZSkgewotICAKLSAgICAvKiBzZXQgdGV4dCBmb3IgZG93bmxvYWQgYnV0dG9uICovCi0gICAgaWYgKGJ1dHRvbikgewotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5odG1sKCQobGluaykudGV4dCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5odG1sKCJEb3dubG9hZCAiICsgJChsaW5rKS50ZXh0KCkpOwotICAgIH0KLSAgICAKLSAgICAvKiBpZiBpdCdzIGEgYnVuZGxlLCBzaG93IHRoZSAzMi82NC1iaXQgcGlja2VyICovCi0gICAgaWYgKGJ1bmRsZSkgewotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCdidW5kbGUnLCd0cnVlJyk7Ci0gICAgICBpZiAoJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS50ZXh0KCkuaW5kZXhPZigiTWFjIikgPT0gLTEpIHsKLSAgICAgICAgJCgicCNiaXRwaWNrZXIiKS5zaG93KCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvKiBtYWMgaXMgYWx3YXlzIDY0IGJpdCwgc28gc2V0IGl0IGNoZWNrZWQgKi8KLSAgICAgICAgJCgicCNiaXRwaWNrZXIgaW5wdXRbdmFsdWU9NjRdIikuYXR0cignY2hlY2tlZCcsIHRydWUpOwotICAgICAgfQotICAgICAgLyogc2F2ZSBsaW5rIG5hbWUgdW50aWwgdGhlIGJpdCB2ZXJzaW9uIGlzIGNob3NlbiAqLwotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCduYW1lJywkKGxpbmspLmF0dHIoJ2hyZWYnKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGlmIG5vdCB1c2luZyBidW5kbGUsIHNldCBkb3dubG9hZCBidXR0b24gdG8gaWdub3JlIGJpdHBpY2tlciBhbmQgc2V0IHVybCAqLwotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCdidW5kbGUnLCdmYWxzZScpOwotICAgICAgJCgiI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCdocmVmJywkKGxpbmspLmF0dHIoJ2hyZWYnKSk7Ci0gICAgICAvKiBzZXQgcGlja2VyIGNoZWNrZWQgYXMgYSBmYWtlIGRlZmF1bHQgKi8KLSAgICAgICQoInAjYml0cGlja2VyIGlucHV0W3ZhbHVlPTY0XSIpLmF0dHIoJ2NoZWNrZWQnLCB0cnVlKTsKLSAgICAgICQoImEjbmV4dC1saW5rIikuaHRtbCgiU2V0dGluZyBVcCBhbiBFeGlzdGluZyBJREUiKS5hdHRyKCdocmVmJyx0b1Jvb3QgKyAnc2RrL2luc3RhbGxpbmcvaW5kZXguaHRtbCcpOwotICAgIH0KLQotICAgICQoIiN0b3MiKS5mYWRlSW4oJ2Zhc3QnKTsKLSAgICAkKCIjbGFuZGluZyIpLmZhZGVPdXQoJ2Zhc3QnKTsKLQotICAgIGxvY2F0aW9uLmhhc2ggPSAiZG93bmxvYWQiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLSAgZnVuY3Rpb24gb25BZ3JlZUNoZWNrZWQoKSB7Ci0gICAgLyogdmVyaWZ5IHRoYXQgdGhlIFRPUyBpcyBhZ3JlZWQgYW5kIGEgYml0IHZlcnNpb24gaXMgY2hvc2VuICovCi0gICAgaWYgKCQoImlucHV0I2FncmVlIikuaXMoIjpjaGVja2VkIikgJiYgJCgiI2JpdHBpY2tlciBpbnB1dDpjaGVja2VkIikubGVuZ3RoKSB7Ci0gICAgICAKLSAgICAgIC8qIGlmIGRvd25sb2FkaW5nIHRoZSBidW5kbGUgKi8KLSAgICAgIGlmICgkKCIjZG93bmxvYWRGb3JSZWFseiIpLmF0dHIoJ2J1bmRsZScpKSB7Ci0gICAgICAgIC8qIGNvbnN0cnVjdCB0aGUgbmFtZSBvZiB0aGUgbGluayB3ZSB3YW50IGJhc2VkIG9uIHRoZSBiaXQgdmVyc2lvbiAqLwotICAgICAgICBsaW5rSWQgPSAkKCJhI2Rvd25sb2FkRm9yUmVhbHoiKS5hdHRyKCJuYW1lIikgKyAkKCIjYml0cGlja2VyIGlucHV0OmNoZWNrZWQiKS52YWwoKTsKLSAgICAgICAgLyogc2V0IHRoZSByZWFsIHVybCBmb3IgZG93bmxvYWQgKi8KLSAgICAgICAgJCgiYSNkb3dubG9hZEZvclJlYWx6IikuYXR0cigiaHJlZiIsICQobGlua0lkKS5hdHRyKCJocmVmIikpOwotICAgICAgfQotICAgICAgCi0gICAgICAvKiByZXZlYWwgdGhlIGRvd25sb2FkIGJ1dHRvbiAqLwotICAgICAgJCgiYSNkb3dubG9hZEZvclJlYWx6IikucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICQoImEjZG93bmxvYWRGb3JSZWFseiIpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIG9uRG93bmxvYWRGb3JSZWFseihsaW5rKSB7Ci0gICAgaWYgKCQoImlucHV0I2FncmVlIikuaXMoJzpjaGVja2VkJykgJiYgJCgiI2JpdHBpY2tlciBpbnB1dDpjaGVja2VkIikubGVuZ3RoKSB7Ci0gICAgICAkKCJkaXYuc2RrLXRlcm1zIikuc2xpZGVVcCgpOwotICAgICAgJCgiI3Nkay10ZXJtcy1mb3JtLC5zZGstdGVybXMtaW50cm8iKS5mYWRlT3V0KCdzbG93Jyk7Ci0gICAgICAkKCIjbmV4dC1zdGVwcyIpLmZhZGVJbignc2xvdycpOwotICAgICAgJCgiaDEjdG9zLWhlYWRlciIpLnRleHQoJ0dldCBSZWFkeSB0byBDb2RlIScpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICQoImxhYmVsI2FncmVlTGFiZWwsI2JpdHBpY2tlciBpbnB1dCIpLnBhcmVudCgpLnN0b3AoKS5hbmltYXRlKHtjb2xvcjogIiMyNThBQUYifSwgMjAwLAotICAgICAgICBmdW5jdGlvbigpIHskKCJsYWJlbCNhZ3JlZUxhYmVsLCNiaXRwaWNrZXIgaW5wdXQiKS5wYXJlbnQoKS5zdG9wKCkuYW5pbWF0ZSh7Y29sb3I6ICIjMjIyIn0sIDIwMCl9Ci0gICAgICApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gICQod2luZG93KS5oYXNoY2hhbmdlKCBmdW5jdGlvbigpewotICAgIGlmIChsb2NhdGlvbi5oYXNoID09ICIiKSB7Ci0gICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKLSAgICB9Ci0gIH0pOwotCi08L3NjcmlwdD4KLQotCi0KLTwvZGl2PjwhLS0gZW5kIHRoZSB3cmFwcGVyIHVzZWQgZm9yIHJlbGF0aXZlL2Fic29sdXRlIHBvc2l0aW9ucyAgLS0+Ci08P2NzICMgVEhJUyBESVYgV0FTIE9QRU5FRCBJTiBJTkRFWC5KRCA/PgotCi0KLQotCi0gIDw/Y3MgZWxzZSA/PiA8P2NzICMgZW5kIGlmIG9ubGluZSA/PgotCi0gICAgPD9jcyBpZjpzZGsucHJldmlldyA/Pjw/Y3MgIyBpdCdzIHByZXZpZXcgb2ZmbGluZSBkb2NzID8+Ci0gICAgICA8cD5XZWxjb21lIGRldmVsb3BlcnMhIFdlIGFyZSBwbGVhc2VkIHRvIHByb3ZpZGUgeW91IHdpdGggYSBwcmV2aWV3IFNESyBmb3IgdGhlIHVwY29taW5nCi0gICAgQW5kcm9pZCAzLjAgcmVsZWFzZSwgdG8gZ2l2ZSB5b3UgYSBoZWFkLXN0YXJ0IG9uIGRldmVsb3BpbmcgYXBwbGljYXRpb25zIGZvciBpdC4KLSAgICA8L3A+Ci0gICAgCi0gICAgICA8cD5TZWUgdGhlIDxhCi0gICAgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL3ByZXZpZXcvc3RhcnQuaHRtbCI+R2V0dGluZyBTdGFydGVkPC9hPiBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotICAgIGFib3V0IGhvdyB0byBzZXQgdXAgdGhlIHByZXZpZXcgU0RLIGFuZCBnZXQgc3RhcnRlZC48L3A+Ci0gICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAubm9uLXByZXZpZXcgeyBkaXNwbGF5Om5vbmU7IH0KLSAgICA8L3N0eWxlPgotICAgIAotICAgIDw/Y3MgZWxzZSA/Pjw/Y3MgIyBpdCdzIG5vcm1hbCBvZmZsaW5lIGRvY3MgPz4KLSAgICAgIAotICAgICAgPD9jcyAjIyMjIyMjIyAgSEVSRSBJUyBUSEUgSkQgRE9DIENPTlRFTlQgRk9SIE9GRkxJTkUgIyMjIyMjIyMjID8+Ci0gICAgICA8P2NzIGNhbGw6dGFnX2xpc3Qocm9vdC5kZXNjcikgPz4KLSAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gICAgICAgIGJvZHkgLm9mZmxpbmUgeyBkaXNwbGF5OmJsb2NrOyB9Ci0gICAgICAgIGJvZHkgLm9ubGluZSB7IGRpc3BsYXk6bm9uZTsgfQotICAgICAgPC9zdHlsZT4gICAgICAKLSAgICAgIDxzY3JpcHQ+Ci0gICAgICAgICQoJy5yZXFzJykuc2hvdygpOwotICAgICAgPC9zY3JpcHQ+Ci0gICAgPD9jcyAvaWYgPz4KLSAgICAKLSAgPD9jcyAvaWYgPz4gPD9jcyAjIGVuZCBpZi9lbHNlIG9ubGluZSA/PgotICAKLTw/Y3MgL2lmID8+IDw/Y3MgIyBlbmQgaWYvZWxzZSBOREsgPz4KLQotPD9jcyAvaWYgPz4gPD9jcyAjIGVuZCBpZi9lbHNlIHJlZGlyZWN0ID8+Ci0KLQotPC9kaXY+PCEtLSBlbmQgamQtY29udGVudCAtLT4KLQotPD9jcyBpZjohc2RrLnJlZGlyZWN0ID8+Ci08P2NzIGluY2x1ZGU6ImZvb3Rlci5jcyIgPz4KLTw/Y3MgL2lmID8+Ci0KLTwvZGl2PjwhLS0gZW5kIGctdW5pdCAtLT4KLQotPD9jcyBpbmNsdWRlOiJ0cmFpbGVyLmNzIiA/PgotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3RpbWVzdGFtcC5jcyBiL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvdGltZXN0YW1wLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmY1MDJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Ryb2lkZG9jL3RlbXBsYXRlcy1zYWMvdGltZXN0YW1wLmNzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdmFyIEJVSUxEX1RJTUVTVEFNUCA9ICI8P2NzIHZhcjpwYWdlLm5vdyA/PiI7CmRpZmYgLS1naXQgYS90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3RyYWlsZXIuY3MgYi90b29scy9kcm9pZGRvYy90ZW1wbGF0ZXMtc2FjL3RyYWlsZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzN2Y4ZDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVtcGxhdGVzLXNhYy90cmFpbGVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPC9kaXY+IDwhLS0gZW5kIGJvZHktY29udGVudCAtLT4gPD9jcyAjIG5vcm1hbGx5IG9wZW5lZCBieSBoZWFkZXIuY3MgPz4KLQotPD9jcyBpZjpjYXJvdXNlbCA/PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotJCgnLnNsaWRlc2hvdy1jb250YWluZXInKS5kYWNTbGlkZXNob3coewotICAgIGJ0blByZXY6ICcuc2xpZGVzaG93LXByZXYnLAotICAgIGJ0bk5leHQ6ICcuc2xpZGVzaG93LW5leHQnLAotICAgIGJ0blBhdXNlOiAnI3BhdXNlQnV0dG9uJwotfSk7Ci08L3NjcmlwdD4KLTw/Y3MgL2lmID8+Ci08P2NzIGlmOnRhYmJlZExpc3QgPz4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSQoIi5mZWVkIikuZGFjVGFiYmVkTGlzdCh7Ci0gICAgbmF2X2lkOiAnLmZlZWQtbmF2JywKLSAgICBmcmFtZV9pZDogJy5mZWVkLWZyYW1lJwotfSk7Ci08L3NjcmlwdD4KLTw/Y3MgL2lmID8+Ci0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Ryb2lkZG9jL3Rlc3Qvc3R1YnMvcnVuLnNoIGIvdG9vbHMvZHJvaWRkb2MvdGVzdC9zdHVicy9ydW4uc2gKaW5kZXggMmVhMTVhNi4uN2M4YTg5NCAxMDA3NTUKLS0tIGEvdG9vbHMvZHJvaWRkb2MvdGVzdC9zdHVicy9ydW4uc2gKKysrIGIvdG9vbHMvZHJvaWRkb2MvdGVzdC9zdHVicy9ydW4uc2gKQEAgLTE0LDcgKzE0LDcgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotRElSPWJ1aWxkL3Rvb2xzL2Ryb2lkZG9jL3Rlc3Qvc3R1YnMKK0RJUj1idWlsZC9tYWtlL3Rvb2xzL2Ryb2lkZG9jL3Rlc3Qvc3R1YnMKIAogcHVzaGQgJFRPUAogCmRpZmYgLS1naXQgYS90b29scy9mc19jb25maWcvQW5kcm9pZC5icCBiL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2NmZTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9mc19jb25maWcvQW5kcm9pZC5icApAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJmc19jb25maWciLAorICAgIHNyY3M6IFsiZnNfY29uZmlnLmMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnNlbGludXgiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuaXQgdGVzdHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZXN0X2NfZmxhZ3MgPSBbCisgICAgIi1mc3RhY2stcHJvdGVjdG9yLWFsbCIsCisgICAgIi1nIiwKKyAgICAiLVdhbGwiLAorICAgICItV2V4dHJhIiwKKyAgICAiLVdlcnJvciIsCisgICAgIi1mbm8tYnVpbHRpbiIsCisgICAgIi1EQU5EUk9JRF9GSUxFU1lTVEVNX0NPTkZJRz1cImFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWdfdGVzdF9kYXRhLmhcIiIsCitdCisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyB0ZXN0IGV4ZWN1dGFibGUKK2NjX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImZzX2NvbmZpZ19nZW5lcmF0ZV90ZXN0IiwKKyAgICBzcmNzOiBbImZzX2NvbmZpZ19nZW5lcmF0ZS5jIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliY3V0aWxzIl0sCisgICAgY2ZsYWdzOiB0ZXN0X2NfZmxhZ3MsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZnNfY29uZmlnLXVuaXQtdGVzdHMiLAorICAgIG5vX25hbWVkX2luc3RhbGxfZGlyZWN0b3J5OiB0cnVlLAorICAgIGd0ZXN0OiBmYWxzZSwKKworfQorCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gZ1Rlc3QgdG9vbAorY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZnNfY29uZmlnLXVuaXQtdGVzdHMiLAorICAgIGNmbGFnczogdGVzdF9jX2ZsYWdzICsgWyItREhPU1QiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICBdLAorICAgIHNyY3M6IFsiZnNfY29uZmlnX3Rlc3QuY3BwIl0sCit9CmRpZmYgLS1naXQgYS90b29scy9mc19jb25maWcvQW5kcm9pZC5tayBiL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLm1rCmluZGV4IGFiN2Y5MmQuLjEyNDc4OTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLm1rCisrKyBiL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLm1rCkBAIC0xNCwxNSArMTQsNiBAQAogCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gZnNfY29uZmlnLmMKLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWcKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnNlbGludXgKLUxPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yCi0KLWluY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCi0KICMgT25lIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmggZmlsZSBpbiBvbmUgb2YgdHdvIHdheXM6CiAjCiAjIDEuIFRoZSBvbGQgd2F5OgpAQCAtMjcwLDYgKzI2MSw3IEBACiAKIExPQ0FMX01PRFVMRSA6PSBwYXNzd2QKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiAKQEAgLTI4OCw2ICsyODAsNyBAQAogCiBMT0NBTF9NT0RVTEUgOj0gZ3JvdXAKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCiAKQEAgLTMwNiwzNiArMjk5LDMgQEAKIGZzX2NvbmZpZ19nZW5lcmF0ZV9iaW4gOj0KIG15X2dlbl9vZW1fYWlkIDo9CiBmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QgOj0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBVbml0IHRlc3RzLgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZXN0X2NfZmxhZ3MgOj0gXAotICAgIC1mc3RhY2stcHJvdGVjdG9yLWFsbCBcCi0gICAgLWcgXAotICAgIC1XYWxsIFwKLSAgICAtV2V4dHJhIFwKLSAgICAtV2Vycm9yIFwKLSAgICAtZm5vLWJ1aWx0aW4gXAotICAgIC1EQU5EUk9JRF9GSUxFU1lTVEVNX0NPTkZJRz0nImFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWdfdGVzdF9kYXRhLmgiJwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHRlc3QgZXhlY3V0YWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2dlbmVyYXRlX3Rlc3QKLUxPQ0FMX1NSQ19GSUxFUyA6PSBmc19jb25maWdfZ2VuZXJhdGUuYwotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMKLUxPQ0FMX0NGTEFHUyA6PSAkKHRlc3RfY19mbGFncykKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGZzX2NvbmZpZy11bml0LXRlc3RzCi1MT0NBTF9HVEVTVCA6PSBmYWxzZQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfTkFUSVZFX1RFU1QpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZ1Rlc3QgdG9vbAotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnLXVuaXQtdGVzdHMKLUxPQ0FMX0NGTEFHUyArPSAkKHRlc3RfY19mbGFncykgLURIT1NUCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGliYmFzZQotTE9DQUxfU1JDX0ZJTEVTIDo9IGZzX2NvbmZpZ190ZXN0LmNwcAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS90b29scy9mc19jb25maWcvZnNfY29uZmlnLmMgYi90b29scy9mc19jb25maWcvZnNfY29uZmlnLmMKaW5kZXggNDhmMzAwYi4uMjk1Mjg3NSAxMDA2NDQKLS0tIGEvdG9vbHMvZnNfY29uZmlnL2ZzX2NvbmZpZy5jCisrKyBiL3Rvb2xzL2ZzX2NvbmZpZy9mc19jb25maWcuYwpAQCAtNjcsMTcgKzY3LDE4IEBACiB9CiAKIHN0YXRpYyB2b2lkIHVzYWdlKCkgewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBmc19jb25maWcgWy1EIHByb2R1Y3Rfb3V0X3BhdGhdIFstUyBjb250ZXh0X2ZpbGVdIFstQ11cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBmc19jb25maWcgWy1EIHByb2R1Y3Rfb3V0X3BhdGhdIFstUyBjb250ZXh0X2ZpbGVdIFstUiByb290XSBbLUNdXG4iKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgIGNoYXIgYnVmZmVyWzEwMjRdOwogICBjb25zdCBjaGFyKiBjb250ZXh0X2ZpbGUgPSBOVUxMOwogICBjb25zdCBjaGFyKiBwcm9kdWN0X291dF9wYXRoID0gTlVMTDsKKyAgY2hhciogcm9vdF9wYXRoID0gTlVMTDsKICAgc3RydWN0IHNlbGFiZWxfaGFuZGxlKiBzZWhuZCA9IE5VTEw7CiAgIGludCBwcmludF9jYXBhYmlsaXRpZXMgPSAwOwogICBpbnQgb3B0OwotICB3aGlsZSgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJDUzpEOiIpKSAhPSAtMSkgeworICB3aGlsZSgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJDUzpSOkQ6IikpICE9IC0xKSB7CiAgICAgc3dpdGNoKG9wdCkgewogICAgIGNhc2UgJ0MnOgogICAgICAgcHJpbnRfY2FwYWJpbGl0aWVzID0gMTsKQEAgLTg1LDYgKzg2LDkgQEAKICAgICBjYXNlICdTJzoKICAgICAgIGNvbnRleHRfZmlsZSA9IG9wdGFyZzsKICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1InOgorICAgICAgcm9vdF9wYXRoID0gb3B0YXJnOworICAgICAgYnJlYWs7CiAgICAgY2FzZSAnRCc6CiAgICAgICBwcm9kdWN0X291dF9wYXRoID0gb3B0YXJnOwogICAgICAgYnJlYWs7CkBAIC05OCw2ICsxMDIsMTQgQEAKICAgICBzZWhuZCA9IGdldF9zZWhuZChjb250ZXh0X2ZpbGUpOwogICB9CiAKKyAgaWYgKHJvb3RfcGF0aCAhPSBOVUxMKSB7CisgICAgc2l6ZV90IHJvb3RfbGVuID0gc3RybGVuKHJvb3RfcGF0aCk7CisgICAgLyogVHJpbSBhbnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHRoZSByb290IHBhdGguICovCisgICAgd2hpbGUgKHJvb3RfbGVuICYmIHJvb3RfcGF0aFstLXJvb3RfbGVuXSA9PSAnLycpIHsKKyAgICAgIHJvb3RfcGF0aFtyb290X2xlbl0gPSAnXDAnOworICAgIH0KKyAgfQorCiAgIHdoaWxlIChmZ2V0cyhidWZmZXIsIDEwMjMsIHN0ZGluKSAhPSBOVUxMKSB7CiAgICAgaW50IGlzX2RpciA9IDA7CiAgICAgaW50IGk7CkBAIC0xMjIsNiArMTM0LDEwIEBACiAgICAgdW5zaWduZWQgdWlkID0gMCwgZ2lkID0gMCwgbW9kZSA9IDA7CiAgICAgdWludDY0X3QgY2FwYWJpbGl0aWVzOwogICAgIGZzX2NvbmZpZyhidWZmZXIsIGlzX2RpciwgcHJvZHVjdF9vdXRfcGF0aCwgJnVpZCwgJmdpZCwgJm1vZGUsICZjYXBhYmlsaXRpZXMpOworICAgIGlmIChyb290X3BhdGggIT0gTlVMTCAmJiBzdHJjbXAoYnVmZmVyLCByb290X3BhdGgpID09IDApIHsKKyAgICAgIC8qIFRoZSByb290IG9mIHRoZSBmaWxlc3lzdGVtIG5lZWRzIHRvIGJlIGFuIGVtcHR5IHN0cmluZy4gKi8KKyAgICAgIHN0cmNweShidWZmZXIsICIiKTsKKyAgICB9CiAgICAgcHJpbnRmKCIlcyAlZCAlZCAlbyIsIGJ1ZmZlciwgdWlkLCBnaWQsIG1vZGUpOwogCiAgICAgaWYgKHNlaG5kICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2NvbmZpZy9mc19jb25maWdfZ2VuZXJhdG9yLnB5IGIvdG9vbHMvZnNfY29uZmlnL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkKaW5kZXggYzhkMWRkMy4uZDUxZDA3NSAxMDA3NTUKLS0tIGEvdG9vbHMvZnNfY29uZmlnL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkKKysrIGIvdG9vbHMvZnNfY29uZmlnL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkKQEAgLTE0NiwxOCArMTQ2LDI3IEBACiAgICAgICAgICAgICBmb3VuZCAoc3RyKTogVGhlIGZpbGUgZm91bmQgaW4sIG5vdCByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQuCiAKICAgICAgICAgUmFpc2VzOgorICAgICAgICAgICAgVmFsdWVFcnJvcjogaWYgdGhlIGZyaWVuZGx5IG5hbWUgaXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVycyBhcworICAgICAgICAgICAgICAgIHRoYXQgaXMgYmlvbmljJ3MgaW50ZXJuYWwgYnVmZmVyIHNpemUgZm9yIG5hbWUuCiAgICAgICAgICAgICBWYWx1ZUVycm9yOiBpZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbnVtYmVyIGFzIHByb2Nlc3NlZCBieQogICAgICAgICAgICAgICAgIGludCh4LCAwKQogICAgICAgICAiIiIKICAgICAgICAgc2VsZi5pZGVudGlmaWVyID0gaWRlbnRpZmllcgogICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKICAgICAgICAgc2VsZi5mb3VuZCA9IGZvdW5kCi0gICAgICAgIHNlbGYubm9ybWFsaXplZF92YWx1ZSA9IHN0cihpbnQodmFsdWUsIDApKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLm5vcm1hbGl6ZWRfdmFsdWUgPSBzdHIoaW50KHZhbHVlLCAwKSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXhjZXB0aW9uOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCAidmFsdWUiLCBub3QgYWlkIG51bWJlciwgZ290OiBcIiVzXCInICUgdmFsdWUpCiAKICAgICAgICAgIyBXaGVyZSB3ZSBjYWxjdWxhdGUgdGhlIGZyaWVuZGx5IG5hbWUKICAgICAgICAgZnJpZW5kbHkgPSBpZGVudGlmaWVyW2xlbihBSUQuUFJFRklYKTpdLmxvd2VyKCkKICAgICAgICAgc2VsZi5mcmllbmRseSA9IEFJRC5fZml4dXBfZnJpZW5kbHkoZnJpZW5kbHkpCiAKKyAgICAgICAgaWYgbGVuKHNlbGYuZnJpZW5kbHkpID4gMzE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdBSUQgbmFtZXMgbXVzdCBiZSB1bmRlciAzMiBjaGFyYWN0ZXJzICIlcyInICUgc2VsZi5mcmllbmRseSkKKworCiAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAKICAgICAgICAgcmV0dXJuIHNlbGYuaWRlbnRpZmllciA9PSBvdGhlci5pZGVudGlmaWVyIFwKQEAgLTYzOSwxMCArNjQ4LDggQEAKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBhaWQgPSBBSUQoc2VjdGlvbl9uYW1lLCB2YWx1ZSwgZmlsZV9uYW1lKQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHN5cy5leGl0KAotICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UoJ0ludmFsaWQgInZhbHVlIiwgbm90IGFpZCBudW1iZXIsIGdvdDogXCIlc1wiJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHN5cy5leGl0KGVycm9yX21lc3NhZ2UoZXhjZXB0aW9uKSkKIAogICAgICAgICAjIFZhbHVlcyBtdXN0IGJlIHdpdGhpbiBPRU0gcmFuZ2UKICAgICAgICAgaWYgbm90IFV0aWxzLmluX2FueV9yYW5nZShpbnQoYWlkLnZhbHVlLCAwKSwgc2VsZi5fb2VtX3Jhbmdlcyk6CmRpZmYgLS1naXQgYS90b29scy9mc19nZXRfc3RhdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2ZzX2dldF9zdGF0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzQyYjgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9mc19nZXRfc3RhdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDkgQEAKK2NjX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiZnNfZ2V0X3N0YXRzIiwKKyAgICBzcmNzOiBbImZzX2dldF9zdGF0cy5jIl0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2dldF9zdGF0cy9BbmRyb2lkLm1rIGIvdG9vbHMvZnNfZ2V0X3N0YXRzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MDFjMWYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvZnNfZ2V0X3N0YXRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBmc19nZXRfc3RhdHMuYwotCi1MT0NBTF9NT0RVTEUgOj0gZnNfZ2V0X3N0YXRzCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmxvZwotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZ2VuZXJhdGUtbm90aWNlLWZpbGVzLnB5IGIvdG9vbHMvZ2VuZXJhdGUtbm90aWNlLWZpbGVzLnB5CmluZGV4IGFkYmY3YzIuLmI3NTQxNzQgMTAwNzU1Ci0tLSBhL3Rvb2xzL2dlbmVyYXRlLW5vdGljZS1maWxlcy5weQorKysgYi90b29scy9nZW5lcmF0ZS1ub3RpY2UtZmlsZXMucHkKQEAgLTI1MywxNSArMjUzLDEyIEBACiAKICAgICBmaWxlc2V0cyA9IFtzb3J0ZWQoZmlsZXNfd2l0aF9zYW1lX2hhc2hbbWQ1XSkgZm9yIG1kNSBpbiBzb3J0ZWQoZmlsZXNfd2l0aF9zYW1lX2hhc2gua2V5cygpKV0KIAotICAgIHByaW50ICJDb21iaW5pbmcgTk9USUNFIGZpbGVzIGludG8gdGV4dCIKICAgICBjb21iaW5lX25vdGljZV9maWxlc190ZXh0KGZpbGVzZXRzLCBpbnB1dF9kaXIsIHR4dF9vdXRwdXRfZmlsZSwgZmlsZV90aXRsZSkKIAogICAgIGlmIGh0bWxfb3V0cHV0X2ZpbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgIHByaW50ICJDb21iaW5pbmcgTk9USUNFIGZpbGVzIGludG8gSFRNTCIKICAgICAgICAgY29tYmluZV9ub3RpY2VfZmlsZXNfaHRtbChmaWxlc2V0cywgaW5wdXRfZGlyLCBodG1sX291dHB1dF9maWxlKQogCiAgICAgaWYgeG1sX291dHB1dF9maWxlIGlzIG5vdCBOb25lOgotICAgICAgICBwcmludCAiQ29tYmluaW5nIE5PVElDRSBmaWxlcyBpbnRvIFhNTCIKICAgICAgICAgY29tYmluZV9ub3RpY2VfZmlsZXNfeG1sKGZpbGVzX3dpdGhfc2FtZV9oYXNoLCBpbnB1dF9kaXIsIHhtbF9vdXRwdXRfZmlsZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL3Rvb2xzL2lqYXIvQW5kcm9pZC5icCBiL3Rvb2xzL2lqYXIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0NGEyZC4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gVGhlIHJlc3Qgb2YgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgY29tZXMgZnJvbQotLy8gaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvdHJlZS9tYXN0ZXIvdGhpcmRfcGFydHkvaWphcgotCi1jY19iaW5hcnlfaG9zdCB7Ci0gICAgc3JjczogWwotICAgICAgICAiY2xhc3NmaWxlLmNjIiwKLSAgICAgICAgImlqYXIuY2MiLAotICAgICAgICAiemlwLmNjIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLSAgICBob3N0X2xkbGliczogWyItbHoiXSwKLSAgICBuYW1lOiAiaWphciIsCi19CmRpZmYgLS1naXQgYS90b29scy9pamFyL0xJQ0VOU0UgYi90b29scy9pamFyL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGIxMjcuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaWphci9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhL3Rvb2xzL2lqYXIvUkVBRE1FLnR4dCBiL3Rvb2xzL2lqYXIvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhNmEwZi4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotCi1pamFyOiBBIHRvb2wgZm9yIGdlbmVyYXRpbmcgaW50ZXJmYWNlIC5qYXJzIGZyb20gbm9ybWFsIC5qYXJzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUFsYW4gRG9ub3ZhbiwgMjYgTWF5IDIwMDcuCi0KLVJhdGlvbmFsZToKLQotICBJbiBvcmRlciB0byBpbXByb3ZlIHRoZSBzcGVlZCBvZiBjb21waWxhdGlvbiBvZiBKYXZhIHByb2dyYW1zIGluCi0gIEJhemVsLCB0aGUgb3V0cHV0IG9mIGJ1aWxkIHN0ZXBzIGlzIGNhY2hlZC4KLQotICBUaGlzIHdvcmtzIHZlcnkgbmljZWx5IGZvciBDKysgY29tcGlsYXRpb246IGEgY29tcGlsYXRpb24gdW5pdAotICBpbmNsdWRlcyBhIC5jYyBzb3VyY2UgZmlsZSBhbmQgdHlwaWNhbGx5IGRvemVucyBvZiBoZWFkZXIgZmlsZXMuCi0gIEhlYWRlciBmaWxlcyBjaGFuZ2UgcmVsYXRpdmVseSBpbmZyZXF1ZW50bHksIHNvIHRoZSBuZWVkIGZvciBhCi0gIHJlYnVpbGQgaXMgdXN1YWxseSBkcml2ZW4gYnkgYSBjaGFuZ2UgaW4gdGhlIC5jYyBmaWxlLiAgRXZlbiBhZnRlcgotICBzeW5jaW5nIGEgc2xpZ2h0bHkgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgdHJlZSBhbmQgZG9pbmcgYSByZWJ1aWxkLAotICBtYW55IGhpdHMgaW4gdGhlIGNhY2hlIGFyZSBzdGlsbCBvYnNlcnZlZC4KLQotICBJbiBKYXZhLCBieSBjb250cmFzdCwgYSBjb21waWxhdGlvbiB1bml0IGludm9sdmVzIGEgc2V0IG9mIC5qYXZhCi0gIHNvdXJjZSBmaWxlcywgcGx1cyBhIHNldCBvZiAuamFyIGZpbGVzIGNvbnRhaW5pbmcgYWxyZWFkeS1jb21waWxlZAotICBKVk0gLmNsYXNzIGZpbGVzLiAgQ2xhc3MgZmlsZXMgc2VydmUgYSBkdWFsIHB1cnBvc2U6IGZyb20gdGhlIEpWTSdzCi0gIHBlcnNwZWN0aXZlLCB0aGV5IGFyZSBjb250YWluZXJzIG9mIGV4ZWN1dGFibGUgY29kZSwgYnV0IGZyb20gdGhlCi0gIGNvbXBpbGVyJ3MgcGVyc3BlY3RpdmUsIHRoZXkgYXJlIGludGVyZmFjZSBkZWZpbml0aW9ucy4gIFRoZSBwcm9ibGVtCi0gIGhlcmUgaXMgdGhhdCAuamFyIGZpbGVzIGFyZSB2ZXJ5IG11Y2ggbW9yZSBzZW5zaXRpdmUgdG8gY2hhbmdlIHRoYW4KLSAgQysrIGhlYWRlciBmaWxlcywgc28gZXZlbiBhIGNoYW5nZSB0aGF0IGlzIGluc2lnbmlmaWNhbnQgdG8gdGhlCi0gIGNvbXBpbGVyIChzdWNoIGFzIHRoZSBhZGRpdGlvbiBvZiBhIHByaW50IHN0YXRlbWVudCB0byBhIG1ldGhvZCBpbiBhCi0gIHByZXJlcXVpc2l0ZSBjbGFzcykgd2lsbCBjYXVzZSB0aGUgamFyIHRvIGNoYW5nZSwgYW5kIGFueSBjb2RlIHRoYXQKLSAgZGVwZW5kcyBvbiB0aGlzIGphcidzIGludGVyZmFjZSB3aWxsIGJlIHJlY29tcGlsZWQgdW5uZWNlc3NhcmlseS4KLQotICBUaGUgcHVycG9zZSBvZiBpamFyIGlzIHRvIHByb2R1Y2UsIGZyb20gYSAuamFyIGZpbGUsIGEgbXVjaCBzbWFsbGVyLAotICBzaW1wbGVyIC5qYXIgZmlsZSBjb250YWluaW5nIG9ubHkgdGhlIHBhcnRzIHRoYXQgYXJlIHNpZ25pZmljYW50IGZvcgotICB0aGUgcHVycG9zZXMgb2YgY29tcGlsYXRpb24uICBJbiBvdGhlciB3b3JkcywgYW4gaW50ZXJmYWNlIC5qYXIKLSAgZmlsZS4gIEJ5IGNoYW5naW5nIG9uZXMgY29tcGlsYXRpb24gZGVwZW5kZW5jaWVzIHRvIGJlIHRoZSBpbnRlcmZhY2UKLSAgamFyIGZpbGVzLCB1bm5lY2Vzc2FyeSByZWNvbXBpbGF0aW9uIGlzIGF2b2lkZWQgd2hlbiB1cHN0cmVhbQotICBjaGFuZ2VzIGRvbid0IGFmZmVjdCB0aGUgaW50ZXJmYWNlLgotCi1EZXRhaWxzOgotCi0gIGlqYXIgaXMgYSB0b29sIHRoYXQgcmVhZHMgYSAuamFyIGZpbGUgYW5kIGVtaXRzIGEgLmphciBmaWxlCi0gIGNvbnRhaW5pbmcgb25seSB0aGUgcGFydHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gSmF2YSBjb21waWxhdGlvbi4KLSAgRm9yIGV4YW1wbGUsIGl0IHRocm93cyBhd2F5OgotCi0gIC0gRmlsZXMgd2hvc2UgbmFtZSBkb2VzIG5vdCBlbmQgaW4gIi5jbGFzcyIuCi0gIC0gQWxsIGV4ZWN1dGFibGUgbWV0aG9kIGNvZGUuCi0gIC0gQWxsIHByaXZhdGUgbWV0aG9kcyBhbmQgZmllbGRzLgotICAtIEFsbCBjb25zdGFudHMgYW5kIGF0dHJpYnV0ZXMgZXhjZXB0IHRoZSBtaW5pbWFsIHNldCBuZWNlc3NhcnkgdG8KLSAgICBkZXNjcmliZSB0aGUgY2xhc3MgaW50ZXJmYWNlLgotICAtIEFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSAgICAoTGluZU51bWJlclRhYmxlLCBTb3VyY2VGaWxlLCBMb2NhbFZhcmlhYmxlVGFibGVzIGF0dHJpYnV0ZXMpLgotCi0gIEl0IGFsc28gc2V0cyB0byB6ZXJvIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyBpbiB0aGUgaW5kZXggb2YgdGhlCi0gIC5qYXIgZmlsZS4KLQotSW1wbGVtZW50YXRpb246Ci0KLSAgaWphciBpcyBpbXBsZW1lbnRlZCBpbiBDKyssIGFuZCBydW5zIHZlcnkgcXVpY2tseS4gIEZvciBleGFtcGxlCi0gICh3aGVuIG9wdGltaXplZCkgaXQgdGFrZXMgb25seSA1MzBtcyB0byBwcm9jZXNzIGEgNDJNQgotICAuamFyIGZpbGUgY29udGFpbmluZyA1ODc4IGNsYXNzZSwgcmVzdWx0aW5nIGluIGFuIGludGVyZmFjZSAuamFyCi0gIGZpbGUgb2Ygb25seSAxMS40TUIgaW4gc2l6ZS4gIEZvciBtb3JlIHVzdWFsIC5qYXIgc2l6ZXMgb2YgYSBmZXcKLSAgbWVnYWJ5dGVzLCBhIHJ1bnRpbWUgb2YgNTBtcyBpcyB0eXBpY2FsLgotCi0gIFRoZSBpbXBsZW1lbnRhdGlvbiBzdHJhdGVneSBpcyB0byBtbWFwIGJvdGggdGhlIGlucHV0IGphciBhbmQgdGhlCi0gIG5ld2x5LWNyZWF0ZWQgX2ludGVyZmFjZS5qYXIsIGFuZCB0byBzY2FuIHRocm91Z2ggdGhlIGZvcm1lciBhbmQKLSAgZW1pdCB0aGUgbGF0dGVyIGluIGEgc2luZ2xlIHBhc3MuIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBsb2NhdGlvbnMKLSAgd2hlcmUgc29tZSBraW5kIG9mICJiYWNrcGF0Y2hpbmciIGlzIHJlcXVpcmVkOgotCi0gIC0gaW4gdGhlIC56aXAgZmlsZSBmb3JtYXQsIGZvciBlYWNoIGZpbGUsIHRoZSBzaXplIGZpZWxkIHByZWNlZGVzCi0gICAgdGhlIGRhdGEuICBXZSBlbWl0IGEgemVybyBidXQgbm90ZSBpdHMgbG9jYXRpb24sIGdlbmVyYXRlIGFuZCBlbWl0Ci0gICAgdGhlIHN0cmlwcGVkIGNsYXNzZmlsZSwgdGhlbiBwb2tlIHRoZSBjb3JyZWN0IHNpemUgaW50byB0aGUKLSAgICBsb2NhdGlvbi4KLQotICAtIGZvciBKVk0gLmNsYXNzIGZpbGVzLCB0aGUgaGVhZGVyIChpbmNsdWRpbmcgdGhlIGNvbnN0YW50IHRhYmxlKQotICAgIHByZWNlZGVzIHRoZSBib2R5LCBidXQgY2Fubm90IGJlIGVtaXR0ZWQgYmVmb3JlIGl0IGJlY2F1c2UgaXQncwotICAgIG5vdCB1bnRpbCB3ZSBlbWl0IHRoZSBib2R5IHRoYXQgd2Uga25vdyB3aGljaCBjb25zdGFudHMgYXJlCi0gICAgcmVmZXJlbmNlZCBhbmQgd2hpY2ggYXJlIGdhcmJhZ2UuICBTbyB3ZSBlbWl0IHRoZSBib2R5IGludG8gYQotICAgIHRlbXBvcmFyeSBidWZmZXIsIHRoZW4gZW1pdCB0aGUgaGVhZGVyIHRvIHRoZSBvdXRwdXQgamFyLCBmb2xsb3dlZAotICAgIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgdGVtcCBidWZmZXIuCi0KLSAgQWxzbyBub3RlIHRoYXQgdGhlIHppcCBmaWxlIGZvcm1hdCBoYXMgdW5uZWNlc3NhcnkgZHVwbGljYXRpb24gb2YKLSAgdGhlIGluZGV4IG1ldGFkYXRhOiBpdCBoYXMgaGVhZGVyK2RhdGEgZm9yIGVhY2ggZmlsZSwgdGhlbiBhbm90aGVyCi0gIHNldCBvZiAoc2ltaWxhcikgaGVhZGVycyBhdCB0aGUgZW5kLiAgUmF0aGVyIHRoYW4gc2F2ZSB0aGUgbWV0YWRhdGEKLSAgZXhwbGljaXRseSBpbiBzb21lIGRhdGFzdHJ1Y3R1cmUsIHdlIGp1c3QgcmVjb3JkIHRoZSBhZGRyZXNzZXMgb2YKLSAgdGhlIGFscmVhZHktZW1pdHRlZCB6aXAgbWV0YWRhdGEgZW50cmllcyBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZAotICB0aGVuIHJlYWQgZnJvbSB0aGVyZSBhcyBuZWNlc3NhcnkuCi0KLU5vdGVzOgotCi0gIFRoaXMgY29kZSBoYXMgbm8gZGVwZW5kZW5jeSBleGNlcHQgb24gdGhlIFNUTCBhbmQgb24gemxpYi4KLQotICBBbG1vc3QgYWxsIG9mIHRoZSBnZXRYL3B1dFgvUmVhZFgvV3JpdGVYIGZ1bmN0aW9ucyBpbiB0aGUgY29kZQotICBhZHZhbmNlIHRoZWlyIGZpcnN0IGFyZ3VtZW50IHBvaW50ZXIsIHdoaWNoIGlzIHBhc3NlZCBieSByZWZlcmVuY2UuCi0KLSAgSXQncyB0ZW1wdGluZyB0byBkaXNjYXJkIHBhY2thZ2UtcHJpdmF0ZSBjbGFzc2VzIGFuZCBjbGFzcyBtZW1iZXJzLgotICBIb3dldmVyLCB0aGlzIHdvdWxkIGJlIGluY29ycmVjdCBiZWNhdXNlIHRoZXkgYXJlIGEgbmVjZXNzYXJ5IHBhcnQKLSAgb2YgdGhlIHBhY2thZ2UgaW50ZXJmYWNlLCBhcyBhIEphdmEgcGFja2FnZSBpcyBvZnRlbiBjb21waWxlZCBpbgotICBtdWx0aXBsZSBzdGFnZXMuICBGb3IgZXhhbXBsZTogaW4gQmF6ZWwsIGJvdGggamF2YSB0ZXN0cyBhbmQgamF2YQotICBjb2RlIGluaGFiaXQgdGhlIHNhbWUgSmF2YSBwYWNrYWdlIGJ1dCBhcmUgY29tcGlsZWQgc2VwYXJhdGVseS4KLQotQXNzdW1wdGlvbnM6Ci0KLSAgV2UgYXNzdW1lIHRoYXQgamFyIGZpbGVzIGFyZSB1bmNvbXByZXNzZWQgdjEuMCB6aXAgZmlsZXMgKGNyZWF0ZWQKLSAgd2l0aCAnamFyIGMwZicpIHdpdGggYSB6ZXJvIGdlbmVyYWxfcHVycG9zZV9iaXRfZmxhZy4KLQotICBXZSBhc3N1bWUgdGhhdCBqYXZhcC9qYXZhYyBkb24ndCBuZWVkIHRoZSBjb3JyZWN0IENSQyBjaGVja3N1bXMgaW4KLSAgdGhlIC5qYXIgZmlsZS4KLQotICBXZSBhc3N1bWUgdGhhdCBpdCdzIGJldHRlciBzaW1wbHkgdG8gYWJvcnQgaW4gdGhlIGZhY2Ugb2YgdW5rbm93bgotICBpbnB1dCB0aGFuIHRvIHJpc2sgbGVhdmluZyBvdXQgc29tZXRoaW5nIGltcG9ydGFudCBmcm9tIHRoZSBvdXRwdXQKLSAgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mIGFubm90YXRpb25zLCBpdCBzaG91bGQgYmUgc2FmZSB0byBpZ25vcmUKLSAgb25lcyB3ZSBkb24ndCB1bmRlcnN0YW5kKS4KLQotVE9ETzoKLSAgTWF5YmU6IGVuc3VyZSBhIGNhbm9uaWNhbCBzb3J0IG9yZGVyIGlzIHVzZWQgZm9yIGV2ZXJ5IGxpc3QgKGphcgotICBlbnRyaWVzLCBjbGFzcyBtZW1iZXJzLCBhdHRyaWJ1dGVzLCBldGMuKSAgVGhpcyBpc24ndCBlc3NlbnRpYWwKLSAgYmVjYXVzZSB3ZSBjYW4gYXNzdW1lIHRoZSBjb21waWxlciBpcyBkZXRlcm1pbmlzdGljIGFuZCB0aGUgb3JkZXIgaW4KLSAgdGhlIHNvdXJjZSBmaWxlcyBjaGFuZ2VzIGxpdHRsZS4gIEFsc28sIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHBhc3Nlcy4gOigKLQotICBNYXliZTogZGVsZXRlIGR5bmFtaWNhbGx5LWFsbG9jYXRlZCBtZW1vcnkuCi0KLSAgQWRkIChhIGxvdCkgbW9yZSB0ZXN0cy4gIEluY2x1ZGUgYSB0ZXN0IG9mIGlkZW1wb3RlbmN5LgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWphci9jbGFzc2ZpbGUuY2MgYi90b29scy9pamFyL2NsYXNzZmlsZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzZTBkYi4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL2NsYXNzZmlsZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3ODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDEsMjAwNyBBbGFuIERvbm92YW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gQXV0aG9yOiBBbGFuIERvbm92YW4gPGFkb25vdmFuQGdvb2dsZS5jb20+Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0vLyBjbGFzc2ZpbGUuY2MgLS0gY2xhc3NmaWxlIHBhcnNpbmcgYW5kIHN0cmlwcGluZy4KLS8vCi0KLS8vIFRPRE8oYWRvbm92YW4pIGRvbid0IHBhc3MgcG9pbnRlcnMgYnkgcmVmZXJlbmNlOyB0aGlzIGlzIG5vdAotLy8gY29tcGF0aWJsZSB3aXRoIEdvb2dsZSBDKysgc3R5bGUuCi0KLS8vIFNlZSBSRUFETUUudHh0IGZvciBkZXRhaWxzLgotLy8KLS8vIEZvciBkZWZpbml0aW9uIG9mIEpWTSBjbGFzcyBmaWxlIGZvcm1hdCwgc2VlOgotLy8gSmF2YSBTRSA4IEVkaXRpb246Ci0vLyBodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qdm1zL3NlOC9odG1sL2p2bXMtNC5odG1sI2p2bXMtNAotCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TIDEKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUyAxCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4gLy8gZm9yIFBSSXgzMgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLS8vIFNlZSBUYWJsZSA0LjMgaW4gSlZNIFNwZWMuCi1lbnVtIENPTlNUQU5UIHsKLSAgQ09OU1RBTlRfQ2xhc3MgICAgICAgICAgICAgID0gNywKLSAgQ09OU1RBTlRfRmllbGRSZWYgICAgICAgICAgID0gOSwKLSAgQ09OU1RBTlRfTWV0aG9kcmVmICAgICAgICAgID0gMTAsCi0gIENPTlNUQU5UX0ludGVyZmFjZW1ldGhvZHJlZiA9IDExLAotICBDT05TVEFOVF9TdHJpbmcgICAgICAgICAgICAgPSA4LAotICBDT05TVEFOVF9JbnRlZ2VyICAgICAgICAgICAgPSAzLAotICBDT05TVEFOVF9GbG9hdCAgICAgICAgICAgICAgPSA0LAotICBDT05TVEFOVF9Mb25nICAgICAgICAgICAgICAgPSA1LAotICBDT05TVEFOVF9Eb3VibGUgICAgICAgICAgICAgPSA2LAotICBDT05TVEFOVF9OYW1lQW5kVHlwZSAgICAgICAgPSAxMiwKLSAgQ09OU1RBTlRfVXRmOCAgICAgICAgICAgICAgID0gMSwKLSAgQ09OU1RBTlRfTWV0aG9kSGFuZGxlICAgICAgID0gMTUsCi0gIENPTlNUQU5UX01ldGhvZFR5cGUgICAgICAgICA9IDE2LAotICBDT05TVEFOVF9JbnZva2VEeW5hbWljICAgICAgPSAxOAotfTsKLQotLy8gU2VlIFRhYmxlcyA0LjEsIDQuNCwgNC41IGluIEpWTSBTcGVjLgotZW51bSBBQ0NFU1MgIHsKLSAgQUNDX1BVQkxJQyAgICAgICAgICA9IDB4MDAwMSwKLSAgQUNDX1BSSVZBVEUgICAgICAgICA9IDB4MDAwMiwKLSAgQUNDX1BST1RFQ1RFRCAgICAgICA9IDB4MDAwNCwKLSAgQUNDX1NUQVRJQyAgICAgICAgICA9IDB4MDAwOCwKLSAgQUNDX0ZJTkFMICAgICAgICAgICA9IDB4MDAxMCwKLSAgQUNDX1NZTkNIUk9OSVpFRCAgICA9IDB4MDAyMCwKLSAgQUNDX1ZPTEFUSUxFICAgICAgICA9IDB4MDA0MCwKLSAgQUNDX1RSQU5TSUVOVCAgICAgICA9IDB4MDA4MCwKLSAgQUNDX0lOVEVSRkFDRSAgICAgICA9IDB4MDIwMCwKLSAgQUNDX0FCU1RSQUNUICAgICAgICA9IDB4MDQwMAotfTsKLQotLy8gU2VlIFRhYmxlIDQuNy4yMC1BIGluIEphdmEgOCBKVk0gU3BlYy4KLWVudW0gVEFSR0VUX1RZUEUgewotICAvLyBUYXJnZXRzIGZvciB0eXBlIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMgKEVsZW1lbnRUeXBlLlRZUEVfUEFSQU1FVEVSKToKLSAgQ0xBU1NfVFlQRV9QQVJBTUVURVIgICAgICAgID0gMHgwMCwKLSAgTUVUSE9EX1RZUEVfUEFSQU1FVEVSICAgICAgID0gMHgwMSwKLQotICAvLyBUYXJnZXRzIGZvciB0eXBlIHVzZXMgdGhhdCBtYXkgYmUgZXh0ZXJuYWxseSB2aXNpYmxlIGluIGNsYXNzZXMgYW5kIG1lbWJlcnMKLSAgLy8gKEVsZW1lbnRUeXBlLlRZUEVfVVNFKToKLSAgQ0xBU1NfRVhURU5EUyAgICAgICAgICAgICAgID0gMHgxMCwKLSAgQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkQgID0gMHgxMSwKLSAgTUVUSE9EX1RZUEVfUEFSQU1FVEVSX0JPVU5EID0gMHgxMiwKLSAgRklFTEQgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMywKLSAgTUVUSE9EX1JFVFVSTiAgICAgICAgICAgICAgID0gMHgxNCwKLSAgTUVUSE9EX1JFQ0VJVkVSICAgICAgICAgICAgID0gMHgxNSwKLSAgTUVUSE9EX0ZPUk1BTF9QQVJBTUVURVIgICAgID0gMHgxNiwKLSAgVEhST1dTICAgICAgICAgICAgICAgICAgICAgID0gMHgxNywKLQotICAvLyBUQVJHRVRfVFlQRSA+PSAweDQwIGlzIHJlc2VydmVkIGZvciB0eXBlIHVzZXMgdGhhdCBvY2N1ciBvbmx5IHdpdGhpbiBjb2RlCi0gIC8vIGJsb2Nrcy4gSWphciBkb2Vzbid0IG5lZWQgdG8ga25vdyBhYm91dCB0aGVzZS4KLX07Ci0KLXN0cnVjdCBDb25zdGFudDsKLQotLy8gVE9ETyhhZG9ub3ZhbikgdGhlc2UgZ2xvYmFscyBhcmUgdW5mb3J0dW5hdGUKLXN0YXRpYyBzdGQ6OnZlY3RvcjxDb25zdGFudCo+ICAgICAgICBjb25zdF9wb29sX2luOyAvLyBpbnB1dCBjb25zdGFudCBwb29sCi1zdGF0aWMgc3RkOjp2ZWN0b3I8Q29uc3RhbnQqPiAgICAgICAgY29uc3RfcG9vbF9vdXQ7IC8vIG91dHB1dCBjb25zdGFudF9wb29sCi1zdGF0aWMgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+ICAgICAgICAgdXNlZF9jbGFzc19uYW1lczsKLXN0YXRpYyBDb25zdGFudCAqICAgICAgICAgICAgICAgICAgICBjbGFzc19uYW1lOwotCi0vLyBSZXR1cm5zIHRoZSBDb25zdGFudCBvYmplY3QsIGdpdmVuIGFuIGluZGV4IGludG8gdGhlIGlucHV0IGNvbnN0YW50IHBvb2wuCi0vLyBOb3RlOiBjb25zdGFudCgwKSA9PSBOVUxMOyB0aGlzIGludmFyaWFudCBpcyBleHBsb2l0ZWQgYnkgdGhlCi0vLyBJbm5lckNsYXNzZXNBdHRyaWJ1dGUsIGludGVyIGFsaWEuCi1pbmxpbmUgQ29uc3RhbnQgKmNvbnN0YW50KGludCBpZHgpIHsKLSAgaWYgKGlkeCA8IDAgfHwgKHVuc2lnbmVkKWlkeCA+PSBjb25zdF9wb29sX2luLnNpemUoKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBjb25zdGFudCBwb29sIGluZGV4OiAlZFxuIiwgaWR4KTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIHJldHVybiBjb25zdF9wb29sX2luW2lkeF07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gU2VlIHNlYy40LjQgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnQgewotCi0gIGV4cGxpY2l0IENvbnN0YW50KHUxIHRhZykgOgotICAgICAgc2xvdF8oMCksCi0gICAgICB0YWdfKHRhZykge30KLQotICB2aXJ0dWFsIH5Db25zdGFudCgpIHt9Ci0KLSAgLy8gRm9yIFVURi04IHN0cmluZyBjb25zdGFudHMsIHJldHVybnMgdGhlIGVuY29kZWQgc3RyaW5nLgotICAvLyBPdGhlcndpc2UsIHJldHVybnMgYW4gdW5kZWZpbmVkIHN0cmluZyB2YWx1ZSBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLgotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFdyaXRlKHUxIComcCkgPSAwOwotCi0gIC8vIENhbGxlZCBieSBzbG90KCkgd2hlbiBhIGNvbnN0YW50IGhhcyBiZWVuIGlkZW50aWZpZWQgYXMgcmVxdWlyZWQKLSAgLy8gaW4gdGhlIG91dHB1dCBjbGFzc2ZpbGUncyBjb25zdGFudCBwb29sLiAgVGhpcyBpcyBhIGhvb2sgYWxsb3dpbmcKLSAgLy8gY29uc3RhbnRzIHRvIHJlZ2lzdGVyIHRoZWlyIGRlcGVuZGVuY3kgb24gb3RoZXIgY29uc3RhbnRzLCBieQotICAvLyBjYWxsaW5nIHNsb3QoKSBvbiB0aGVtIGluIHR1cm4uCi0gIHZpcnR1YWwgdm9pZCBLZWVwKCkge30KLQotICBib29sIEtlcHQoKSB7Ci0gICAgcmV0dXJuIHNsb3RfICE9IDA7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIGNvbnN0YW50IGluIHRoZSBvdXRwdXQgY2xhc3MncyBjb25zdGFudAotICAvLyBwb29sLCBhc3NpZ25pbmcgYSBzbG90IGlmIG5vdCBhbHJlYWR5IGRvbmUuCi0gIHUyIHNsb3QoKSB7Ci0gICAgaWYgKHNsb3RfID09IDApIHsKLSAgICAgIEtlZXAoKTsKLSAgICAgIHNsb3RfID0gY29uc3RfcG9vbF9vdXQuc2l6ZSgpOyAvLyBCdWdCb3QncyAibmFycm93aW5nIiB3YXJuaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgYm9ndXMuICBUaGUgbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGNvbnN0YW50cyBjYW4ndCBleGNlZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGlucHV0IGNvbnN0YW50cy4KLSAgICAgIGlmIChzbG90XyA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29uc3RhbnQ6OnNsb3QoKSBjYWxsZWQgYmVmb3JlIG91dHB1dCBwaGFzZS5cbiIpOwotICAgICAgICBhYm9ydCgpOwotICAgICAgfQotICAgICAgY29uc3RfcG9vbF9vdXQucHVzaF9iYWNrKHRoaXMpOwotICAgICAgaWYgKHRhZ18gPT0gQ09OU1RBTlRfTG9uZyB8fCB0YWdfID09IENPTlNUQU5UX0RvdWJsZSkgewotICAgICAgICBjb25zdF9wb29sX291dC5wdXNoX2JhY2soTlVMTCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzbG90XzsKLSAgfQotCi0gIHUyIHNsb3RfOyAvLyB6ZXJvID0+ICJ0aGlzIGNvbnN0YW50IGlzIHVucmVhY2hhYmxlIGdhcmJhZ2UiCi0gIHUxIHRhZ187Ci19OwotCi0vLyBFeHRyYWN0cyBjbGFzcyBuYW1lcyBmcm9tIGEgc2lnbmF0dXJlIGFuZCBwdXRzIHRoZW0gaW50byB0aGUgZ2xvYmFsCi0vLyB2YXJpYWJsZSB1c2VkX2NsYXNzX25hbWVzLgotLy8KLS8vIGRlc2M6IHRoZSBkZXNjcmlwdG9yIGNsYXNzIG5hbWVzIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbS4KLS8vIHA6IHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXh0cmFjdGlvbiBzaG91bGQgdGFydC4KLXZvaWQgRXh0cmFjdENsYXNzTmFtZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCk7Ci0KLS8vIFNlZSBzZWMuNC40LjEgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfQ2xhc3MgOiBDb25zdGFudAotewotICBleHBsaWNpdCBDb25zdGFudF9DbGFzcyh1MiBuYW1lX2luZGV4KSA6Ci0gICAgICBDb25zdGFudChDT05TVEFOVF9DbGFzcyksCi0gICAgICBuYW1lX2luZGV4XyhuYW1lX2luZGV4KSB7fQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhZ18pOwotICAgIHB1dF91MmJlKHAsIGNvbnN0YW50KG5hbWVfaW5kZXhfKS0+c2xvdCgpKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7Ci0gICAgcmV0dXJuIGNvbnN0YW50KG5hbWVfaW5kZXhfKS0+RGlzcGxheSgpOwotICB9Ci0KLSAgdm9pZCBLZWVwKCkgeyBjb25zdGFudChuYW1lX2luZGV4XyktPnNsb3QoKTsgfQotCi0gIHUyIG5hbWVfaW5kZXhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuMiBvZiBKVk0gc3BlYy4KLXN0cnVjdCBDb25zdGFudF9GTUlyZWYgOiBDb25zdGFudAotewotICBDb25zdGFudF9GTUlyZWYodTEgdGFnLAotICAgICAgICAgICAgICAgICAgdTIgY2xhc3NfaW5kZXgsCi0gICAgICAgICAgICAgICAgICB1MiBuYW1lX3R5cGVfaW5kZXgpIDoKLSAgICAgIENvbnN0YW50KHRhZyksCi0gICAgICBjbGFzc19pbmRleF8oY2xhc3NfaW5kZXgpLAotICAgICAgbmFtZV90eXBlX2luZGV4XyhuYW1lX3R5cGVfaW5kZXgpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RhbnQoY2xhc3NfaW5kZXhfKS0+c2xvdCgpKTsKLSAgICBwdXRfdTJiZShwLCBjb25zdGFudChuYW1lX3R5cGVfaW5kZXhfKS0+c2xvdCgpKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7Ci0gICAgcmV0dXJuIGNvbnN0YW50KGNsYXNzX2luZGV4XyktPkRpc3BsYXkoKSArICI6OiIgKwotICAgICAgICBjb25zdGFudChuYW1lX3R5cGVfaW5kZXhfKS0+RGlzcGxheSgpOwotICB9Ci0KLSAgdm9pZCBLZWVwKCkgewotICAgIGNvbnN0YW50KGNsYXNzX2luZGV4XyktPnNsb3QoKTsKLSAgICBjb25zdGFudChuYW1lX3R5cGVfaW5kZXhfKS0+c2xvdCgpOwotICB9Ci0KLSAgdTIgY2xhc3NfaW5kZXhfOwotICB1MiBuYW1lX3R5cGVfaW5kZXhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuMyBvZiBKVk0gc3BlYy4KLXN0cnVjdCBDb25zdGFudF9TdHJpbmcgOiBDb25zdGFudAotewotICBleHBsaWNpdCBDb25zdGFudF9TdHJpbmcodTIgc3RyaW5nX2luZGV4KSA6Ci0gICAgICBDb25zdGFudChDT05TVEFOVF9TdHJpbmcpLAotICAgICAgc3RyaW5nX2luZGV4XyhzdHJpbmdfaW5kZXgpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RhbnQoc3RyaW5nX2luZGV4XyktPnNsb3QoKSk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBEaXNwbGF5KCkgewotICAgIHJldHVybiAiXCIiICsgY29uc3RhbnQoc3RyaW5nX2luZGV4XyktPkRpc3BsYXkoKSArICJcIiI7Ci0gIH0KLQotICB2b2lkIEtlZXAoKSB7IGNvbnN0YW50KHN0cmluZ19pbmRleF8pLT5zbG90KCk7IH0KLQotICB1MiBzdHJpbmdfaW5kZXhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuNCBvZiBKVk0gc3BlYy4KLXN0cnVjdCBDb25zdGFudF9JbnRlZ2VyT3JGbG9hdCA6IENvbnN0YW50Ci17Ci0gIENvbnN0YW50X0ludGVnZXJPckZsb2F0KHUxIHRhZywgdTQgYnl0ZXMpIDoKLSAgICAgIENvbnN0YW50KHRhZyksCi0gICAgICBieXRlc18oYnl0ZXMpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3U0YmUocCwgYnl0ZXNfKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7IHJldHVybiAiaW50L2Zsb2F0IjsgfQotCi0gIHU0IGJ5dGVzXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC40LjUgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfTG9uZ09yRG91YmxlIDogQ29uc3RhbnRfSW50ZWdlck9yRmxvYXQKLXsKLSAgQ29uc3RhbnRfTG9uZ09yRG91YmxlKHUxIHRhZywgdTQgaGlnaF9ieXRlcywgdTQgbG93X2J5dGVzKSA6Ci0gICAgICBDb25zdGFudF9JbnRlZ2VyT3JGbG9hdCh0YWcsIGhpZ2hfYnl0ZXMpLAotICAgICAgbG93X2J5dGVzXyhsb3dfYnl0ZXMpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3U0YmUocCwgYnl0ZXNfKTsKLSAgICBwdXRfdTRiZShwLCBsb3dfYnl0ZXNfKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7IHJldHVybiAibG9uZy9kb3VibGUiOyB9Ci0KLSAgdTQgbG93X2J5dGVzXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC40LjYgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfTmFtZUFuZFR5cGUgOiBDb25zdGFudAotewotICBDb25zdGFudF9OYW1lQW5kVHlwZSh1MiBuYW1lX2luZGV4LCB1MiBkZXNjcl9pbmRleCkgOgotICAgICAgQ29uc3RhbnQoQ09OU1RBTlRfTmFtZUFuZFR5cGUpLAotICAgICAgbmFtZV9pbmRleF8obmFtZV9pbmRleCksCi0gICAgICBkZXNjcl9pbmRleF8oZGVzY3JfaW5kZXgpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RhbnQobmFtZV9pbmRleF8pLT5zbG90KCkpOwotICAgIHB1dF91MmJlKHAsIGNvbnN0YW50KGRlc2NyX2luZGV4XyktPnNsb3QoKSk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBEaXNwbGF5KCkgewotICAgIHJldHVybiBjb25zdGFudChuYW1lX2luZGV4XyktPkRpc3BsYXkoKSArICI6OiIgKwotICAgICAgICBjb25zdGFudChkZXNjcl9pbmRleF8pLT5EaXNwbGF5KCk7Ci0gIH0KLQotICB2b2lkIEtlZXAoKSB7Ci0gICAgY29uc3RhbnQobmFtZV9pbmRleF8pLT5zbG90KCk7Ci0gICAgY29uc3RhbnQoZGVzY3JfaW5kZXhfKS0+c2xvdCgpOwotICB9Ci0KLSAgdTIgbmFtZV9pbmRleF87Ci0gIHUyIGRlc2NyX2luZGV4XzsKLX07Ci0KLS8vIFNlZSBzZWMuNC40Ljcgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfVXRmOCA6IENvbnN0YW50Ci17Ci0gIENvbnN0YW50X1V0ZjgodTQgbGVuZ3RoLCBjb25zdCB1MSAqdXRmOCkgOgotICAgICAgQ29uc3RhbnQoQ09OU1RBTlRfVXRmOCksCi0gICAgICBsZW5ndGhfKGxlbmd0aCksCi0gICAgICB1dGY4Xyh1dGY4KSB7fQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhZ18pOwotICAgIHB1dF91MmJlKHAsIGxlbmd0aF8pOwotICAgIHB1dF9uKHAsIHV0ZjhfLCBsZW5ndGhfKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjb25zdCBjaGFyKikgdXRmOF8sIGxlbmd0aF8pOwotICB9Ci0KLSAgdTQgbGVuZ3RoXzsKLSAgY29uc3QgdTEgKnV0ZjhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuOCBvZiBKVk0gc3BlYy4KLXN0cnVjdCBDb25zdGFudF9NZXRob2RIYW5kbGUgOiBDb25zdGFudAotewotICBDb25zdGFudF9NZXRob2RIYW5kbGUodTEgcmVmZXJlbmNlX2tpbmQsIHUyIHJlZmVyZW5jZV9pbmRleCkgOgotICAgICAgQ29uc3RhbnQoQ09OU1RBTlRfTWV0aG9kSGFuZGxlKSwKLSAgICAgIHJlZmVyZW5jZV9raW5kXyhyZWZlcmVuY2Vfa2luZCksCi0gICAgICByZWZlcmVuY2VfaW5kZXhfKHJlZmVyZW5jZV9pbmRleCkge30KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIHB1dF91MShwLCB0YWdfKTsKLSAgICBwdXRfdTEocCwgcmVmZXJlbmNlX2tpbmRfKTsKLSAgICBwdXRfdTJiZShwLCByZWZlcmVuY2VfaW5kZXhfKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIERpc3BsYXkoKSB7Ci0gICAgcmV0dXJuICJDb25zdGFudF9NZXRob2RIYW5kbGU6OiIgKyBzdGQ6OnRvX3N0cmluZyhyZWZlcmVuY2Vfa2luZF8pICsgIjo6IgotICAgICAgICArIGNvbnN0YW50KHJlZmVyZW5jZV9pbmRleF8pLT5EaXNwbGF5KCk7Ci0gIH0KLQotICB1MSByZWZlcmVuY2Vfa2luZF87Ci0gIHUyIHJlZmVyZW5jZV9pbmRleF87Ci19OwotCi0vLyBTZWUgc2VjLjQuNC45IG9mIEpWTSBzcGVjLgotc3RydWN0IENvbnN0YW50X01ldGhvZFR5cGUgOiBDb25zdGFudAotewotICBleHBsaWNpdCBDb25zdGFudF9NZXRob2RUeXBlKHUyIGRlc2NyaXB0b3JfaW5kZXgpIDoKLSAgICAgIENvbnN0YW50KENPTlNUQU5UX01ldGhvZFR5cGUpLAotICAgICAgZGVzY3JpcHRvcl9pbmRleF8oZGVzY3JpcHRvcl9pbmRleCkge30KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIHB1dF91MShwLCB0YWdfKTsKLSAgICBwdXRfdTJiZShwLCBkZXNjcmlwdG9yX2luZGV4Xyk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBEaXNwbGF5KCkgewotICAgIHJldHVybiAgIkNvbnN0YW50X01ldGhvZFR5cGU6OiIgKyBjb25zdGFudChkZXNjcmlwdG9yX2luZGV4XyktPkRpc3BsYXkoKTsKLSAgfQotCi0gIHUyIGRlc2NyaXB0b3JfaW5kZXhfOwotfTsKLQotLy8gU2VlIHNlYy40LjQuMTAgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQ29uc3RhbnRfSW52b2tlRHluYW1pYyA6IENvbnN0YW50Ci17Ci0gIENvbnN0YW50X0ludm9rZUR5bmFtaWModTIgYm9vdHN0cmFwX21ldGhvZF9hdHRyX2luZGV4LCB1MiBuYW1lX2FuZF90eXBlX2luZGV4KSA6Ci0gICAgICBDb25zdGFudChDT05TVEFOVF9JbnZva2VEeW5hbWljKSwKLSAgICAgIGJvb3RzdHJhcF9tZXRob2RfYXR0cl9pbmRleF8oYm9vdHN0cmFwX21ldGhvZF9hdHRyX2luZGV4KSwKLSAgICAgIG5hbWVfYW5kX3R5cGVfaW5kZXhfKG5hbWVfYW5kX3R5cGVfaW5kZXgpIHt9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgYm9vdHN0cmFwX21ldGhvZF9hdHRyX2luZGV4Xyk7Ci0gICAgcHV0X3UyYmUocCwgbmFtZV9hbmRfdHlwZV9pbmRleF8pOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgRGlzcGxheSgpIHsKLSAgICByZXR1cm4gICJDb25zdGFudF9JbnZva2VEeW5hbWljOjoiCi0gICAgICAgICsgc3RkOjp0b19zdHJpbmcoYm9vdHN0cmFwX21ldGhvZF9hdHRyX2luZGV4XykgKyAiOjoiCi0gICAgICAgICsgY29uc3RhbnQobmFtZV9hbmRfdHlwZV9pbmRleF8pLT5EaXNwbGF5KCk7Ci0gIH0KLQotICB1MiBib290c3RyYXBfbWV0aG9kX2F0dHJfaW5kZXhfOwotICB1MiBuYW1lX2FuZF90eXBlX2luZGV4XzsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gU2VlIHNlYy40Ljcgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQXR0cmlidXRlIHsKLQotICB2aXJ0dWFsIH5BdHRyaWJ1dGUoKSB7fQotICB2aXJ0dWFsIHZvaWQgV3JpdGUodTEgKiZwKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHt9Ci0KLSAgdm9pZCBXcml0ZVByb2xvZyh1MSAqJnAsIHUyIGxlbmd0aCkgewotICAgIHB1dF91MmJlKHAsIGF0dHJpYnV0ZV9uYW1lXy0+c2xvdCgpKTsKLSAgICBwdXRfdTRiZShwLCBsZW5ndGgpOwotICB9Ci0KLSAgQ29uc3RhbnQgKmF0dHJpYnV0ZV9uYW1lXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC43LjUgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgRXhjZXB0aW9uc0F0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0KLSAgc3RhdGljIEV4Y2VwdGlvbnNBdHRyaWJ1dGUqIFJlYWQoY29uc3QgdTEgKiZwLCBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBFeGNlcHRpb25zQXR0cmlidXRlICphdHRyID0gbmV3IEV4Y2VwdGlvbnNBdHRyaWJ1dGU7Ci0gICAgYXR0ci0+YXR0cmlidXRlX25hbWVfID0gYXR0cmlidXRlX25hbWU7Ci0gICAgdTIgbnVtYmVyX29mX2V4Y2VwdGlvbnMgPSBnZXRfdTJiZShwKTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtYmVyX29mX2V4Y2VwdGlvbnM7ICsraWkpIHsKLSAgICAgIGF0dHItPmV4Y2VwdGlvbnNfLnB1c2hfYmFjayhjb25zdGFudChnZXRfdTJiZShwKSkpOwotICAgIH0KLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgV3JpdGVQcm9sb2cocCwgZXhjZXB0aW9uc18uc2l6ZSgpICogMiArIDIpOwotICAgIHB1dF91MmJlKHAsIGV4Y2VwdGlvbnNfLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGV4Y2VwdGlvbnNfLnNpemUoKTsgKytpaSkgewotICAgICAgcHV0X3UyYmUocCwgZXhjZXB0aW9uc19baWldLT5zbG90KCkpOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gZXhjZXB0aW9uc187Ci19OwotCi0vLyBTZWUgc2VjLjQuNy42IG9mIEpWTSBzcGVjLgotc3RydWN0IElubmVyQ2xhc3Nlc0F0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0KLSAgc3RydWN0IEVudHJ5IHsKLSAgICBDb25zdGFudCAqaW5uZXJfY2xhc3NfaW5mbzsKLSAgICBDb25zdGFudCAqb3V0ZXJfY2xhc3NfaW5mbzsKLSAgICBDb25zdGFudCAqaW5uZXJfbmFtZTsKLSAgICB1MiBpbm5lcl9jbGFzc19hY2Nlc3NfZmxhZ3M7Ci0gIH07Ci0KLSAgdmlydHVhbCB+SW5uZXJDbGFzc2VzQXR0cmlidXRlKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cmllc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBlbnRyaWVzX1tpXTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgSW5uZXJDbGFzc2VzQXR0cmlidXRlKiBSZWFkKGNvbnN0IHUxIComcCwgQ29uc3RhbnQgKmF0dHJpYnV0ZV9uYW1lKSB7Ci0gICAgSW5uZXJDbGFzc2VzQXR0cmlidXRlICphdHRyID0gbmV3IElubmVyQ2xhc3Nlc0F0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLQotICAgIHUyIG51bWJlcl9vZl9jbGFzc2VzID0gZ2V0X3UyYmUocCk7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bWJlcl9vZl9jbGFzc2VzOyArK2lpKSB7Ci0gICAgICBFbnRyeSAqZW50cnkgPSBuZXcgRW50cnk7Ci0gICAgICBlbnRyeS0+aW5uZXJfY2xhc3NfaW5mbyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICAgIGVudHJ5LT5vdXRlcl9jbGFzc19pbmZvID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgICAgZW50cnktPmlubmVyX25hbWUgPSBjb25zdGFudChnZXRfdTJiZShwKSk7Ci0gICAgICBlbnRyeS0+aW5uZXJfY2xhc3NfYWNjZXNzX2ZsYWdzID0gZ2V0X3UyYmUocCk7Ci0KLSAgICAgIGF0dHItPmVudHJpZXNfLnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgfQotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBzdGQ6OnNldDxpbnQ+IGtlcHRfZW50cmllczsKLSAgICAvLyBXZSBrZWVwIGFuIGVudHJ5IGlmIHRoZSBjb25zdGFudCByZWZlcnJpbmcgdG8gdGhlIGlubmVyIGNsYXNzIGlzIGFscmVhZHkKLSAgICAvLyBrZXB0LiBUaGVuIHdlIG1hcmsgaXRzIG91dGVyIGNsYXNzIGFuZCBpdHMgY2xhc3MgbmFtZSBhcyBrZXB0LCB0b28sIHRoZW4KLSAgICAvLyBpdGVyYXRlIHVudGlsIGEgZml4ZWQgcG9pbnQgaXMgcmVhY2hlZC4KLSAgICBzaXplX3QgZW50cnlfY291bnQ7Ci0gICAgaW50IGl0ZXJhdGlvbiA9IDA7Ci0KLSAgICBkbyB7Ci0gICAgICBlbnRyeV9jb3VudCA9IGtlcHRfZW50cmllcy5zaXplKCk7Ci0gICAgICBmb3IgKHNpemVfdCBpX2VudHJ5ID0gMDsgaV9lbnRyeSA8IGVudHJpZXNfLnNpemUoKTsgKytpX2VudHJ5KSB7Ci0gICAgICAgIEVudHJ5KiBlbnRyeSA9IGVudHJpZXNfW2lfZW50cnldOwotICAgICAgICBpZiAoZW50cnktPmlubmVyX2NsYXNzX2luZm8tPktlcHQoKSB8fAotICAgICAgICAgICAgdXNlZF9jbGFzc19uYW1lcy5maW5kKGVudHJ5LT5pbm5lcl9jbGFzc19pbmZvLT5EaXNwbGF5KCkpCi0gICAgICAgICAgICAgICAgIT0gdXNlZF9jbGFzc19uYW1lcy5lbmQoKSB8fAotICAgICAgICAgICAgZW50cnktPm91dGVyX2NsYXNzX2luZm8gPT0gY2xhc3NfbmFtZSB8fAotICAgICAgICAgICAgZW50cnktPm91dGVyX2NsYXNzX2luZm8gPT0gTlVMTCB8fAotICAgICAgICAgICAgZW50cnktPmlubmVyX25hbWUgPT0gTlVMTCkgewotICAgICAgICAgIGtlcHRfZW50cmllcy5pbnNlcnQoaV9lbnRyeSk7Ci0KLSAgICAgICAgICAvLyBUaGVzZSBhcmUgemVybyBmb3IgYW5vbnltb3VzIGlubmVyIGNsYXNzZXMKLSAgICAgICAgICBpZiAoZW50cnktPm91dGVyX2NsYXNzX2luZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgZW50cnktPm91dGVyX2NsYXNzX2luZm8tPnNsb3QoKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZW50cnktPmlubmVyX25hbWUgIT0gTlVMTCkgewotICAgICAgICAgICAgZW50cnktPmlubmVyX25hbWUtPnNsb3QoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGl0ZXJhdGlvbiArPSAxOwotICAgIH0gd2hpbGUgKGVudHJ5X2NvdW50ICE9IGtlcHRfZW50cmllcy5zaXplKCkpOwotCi0gICAgaWYgKGtlcHRfZW50cmllcy5zaXplKCkgPT0gMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFdyaXRlUHJvbG9nKHAsIDIgKyBrZXB0X2VudHJpZXMuc2l6ZSgpICogOCk7Ci0gICAgcHV0X3UyYmUocCwga2VwdF9lbnRyaWVzLnNpemUoKSk7Ci0KLSAgICBmb3IgKHN0ZDo6c2V0PGludD46Oml0ZXJhdG9yIGl0ID0ga2VwdF9lbnRyaWVzLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBrZXB0X2VudHJpZXMuZW5kKCk7Ci0gICAgICAgICArK2l0KSB7Ci0gICAgICBFbnRyeSAqZW50cnkgPSBlbnRyaWVzX1sqaXRdOwotICAgICAgcHV0X3UyYmUocCwgZW50cnktPmlubmVyX2NsYXNzX2luZm8gPT0gTlVMTAotICAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgICA6IGVudHJ5LT5pbm5lcl9jbGFzc19pbmZvLT5zbG90KCkpOwotICAgICAgcHV0X3UyYmUocCwgZW50cnktPm91dGVyX2NsYXNzX2luZm8gPT0gTlVMTAotICAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgICA6IGVudHJ5LT5vdXRlcl9jbGFzc19pbmZvLT5zbG90KCkpOwotICAgICAgcHV0X3UyYmUocCwgZW50cnktPmlubmVyX25hbWUgPT0gTlVMTAotICAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgICA6IGVudHJ5LT5pbm5lcl9uYW1lLT5zbG90KCkpOwotICAgICAgcHV0X3UyYmUocCwgZW50cnktPmlubmVyX2NsYXNzX2FjY2Vzc19mbGFncyk7Ci0gICAgfQotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8RW50cnkqPiBlbnRyaWVzXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC43Ljcgb2YgSlZNIHNwZWMuCi0vLyBXZSBwcmVzZXJ2ZSBFbmNsb3NpbmdNZXRob2QgYXR0cmlidXRlcyB0byBiZSBhYmxlIHRvIGlkZW50aWZ5IGxvY2FsIGFuZAotLy8gYW5vbnltb3VzIGNsYXNzZXMuIFRoZXNlIGNsYXNzZXMgd2lsbCBiZSBzdHJpcHBlZCBvZiBtb3N0IGNvbnRlbnQsIGFzIHRoZXkKLS8vIHJlcHJlc2VudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRoYXQgc2hvdWRuJ3QgbGVhayBpbnRvIHRoZSBpamFycy4gT21pdHRpbmcKLS8vIEVuY2xvc2luZ01ldGhvZCBhdHRyaWJ1dGVzIGNhbiBsZWFkIHRvIHR5cGUtY2hlY2tpbmcgZmFpbHVyZXMgaW4gdGhlIHByZXNlbmNlCi0vLyBvZiBnZW5lcmljcyAoc2VlIGIvOTA3MDkzOSkuCi1zdHJ1Y3QgRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlIDogQXR0cmlidXRlIHsKLQotICBzdGF0aWMgRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlKiBSZWFkKGNvbnN0IHUxIComcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBFbmNsb3NpbmdNZXRob2RBdHRyaWJ1dGUgKmF0dHIgPSBuZXcgRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlOwotICAgIGF0dHItPmF0dHJpYnV0ZV9uYW1lXyA9IGF0dHJpYnV0ZV9uYW1lOwotICAgIGF0dHItPmNsYXNzXyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICBhdHRyLT5tZXRob2RfID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBXcml0ZVByb2xvZyhwLCA0KTsKLSAgICBwdXRfdTJiZShwLCBjbGFzc18tPnNsb3QoKSk7Ci0gICAgcHV0X3UyYmUocCwgbWV0aG9kXyA9PSBOVUxMID8gMCA6IG1ldGhvZF8tPnNsb3QoKSk7Ci0gIH0KLQotICBDb25zdGFudCAqY2xhc3NfOwotICBDb25zdGFudCAqbWV0aG9kXzsKLX07Ci0KLS8vIFNlZSBzZWMuNC43LjE2LjEgb2YgSlZNIHNwZWMuCi0vLyBVc2VkIGJ5IEFubm90YXRpb25EZWZhdWx0IGFuZCBvdGhlciBhdHRyaWJ1dGVzLgotc3RydWN0IEVsZW1lbnRWYWx1ZSB7Ci0gIHZpcnR1YWwgfkVsZW1lbnRWYWx1ZSgpIHt9Ci0gIHZpcnR1YWwgdm9pZCBXcml0ZSh1MSAqJnApID0gMDsKLSAgdmlydHVhbCB2b2lkIEV4dHJhY3RDbGFzc05hbWVzKCkge30KLSAgc3RhdGljIEVsZW1lbnRWYWx1ZSogUmVhZChjb25zdCB1MSAqJnApOwotICB1MSB0YWdfOwotICB1NCBsZW5ndGhfOwotfTsKLQotc3RydWN0IEJhc2VUeXBlRWxlbWVudFZhbHVlIDogRWxlbWVudFZhbHVlIHsKLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RfdmFsdWVfLT5zbG90KCkpOwotICB9Ci0gIHN0YXRpYyBCYXNlVHlwZUVsZW1lbnRWYWx1ZSAqUmVhZChjb25zdCB1MSAqJnApIHsKLSAgICBCYXNlVHlwZUVsZW1lbnRWYWx1ZSAqdmFsdWUgPSBuZXcgQmFzZVR5cGVFbGVtZW50VmFsdWU7Ci0gICAgdmFsdWUtPmNvbnN0X3ZhbHVlXyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgQ29uc3RhbnQgKmNvbnN0X3ZhbHVlXzsKLX07Ci0KLXN0cnVjdCBFbnVtVHlwZUVsZW1lbnRWYWx1ZSA6IEVsZW1lbnRWYWx1ZSB7Ci0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhZ18pOwotICAgIHB1dF91MmJlKHAsIHR5cGVfbmFtZV8tPnNsb3QoKSk7Ci0gICAgcHV0X3UyYmUocCwgY29uc3RfbmFtZV8tPnNsb3QoKSk7Ci0gIH0KLSAgc3RhdGljIEVudW1UeXBlRWxlbWVudFZhbHVlICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgIEVudW1UeXBlRWxlbWVudFZhbHVlICp2YWx1ZSA9IG5ldyBFbnVtVHlwZUVsZW1lbnRWYWx1ZTsKLSAgICB2YWx1ZS0+dHlwZV9uYW1lXyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICB2YWx1ZS0+Y29uc3RfbmFtZV8gPSBjb25zdGFudChnZXRfdTJiZShwKSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIENvbnN0YW50ICp0eXBlX25hbWVfOwotICBDb25zdGFudCAqY29uc3RfbmFtZV87Ci19OwotCi1zdHJ1Y3QgQ2xhc3NUeXBlRWxlbWVudFZhbHVlIDogRWxlbWVudFZhbHVlIHsKLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgY2xhc3NfaW5mb18tPnNsb3QoKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRXh0cmFjdENsYXNzTmFtZXMoKSB7Ci0gICAgc2l6ZV90IGlkeCA9IDA7Ci0gICAgZGV2dG9vbHNfaWphcjo6RXh0cmFjdENsYXNzTmFtZXMoY2xhc3NfaW5mb18tPkRpc3BsYXkoKSwgJmlkeCk7Ci0gIH0KLQotICBzdGF0aWMgQ2xhc3NUeXBlRWxlbWVudFZhbHVlICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgIENsYXNzVHlwZUVsZW1lbnRWYWx1ZSAqdmFsdWUgPSBuZXcgQ2xhc3NUeXBlRWxlbWVudFZhbHVlOwotICAgIHZhbHVlLT5jbGFzc19pbmZvXyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgQ29uc3RhbnQgKmNsYXNzX2luZm9fOwotfTsKLQotc3RydWN0IEFycmF5VHlwZUVsZW1lbnRWYWx1ZSA6IEVsZW1lbnRWYWx1ZSB7Ci0gIHZpcnR1YWwgfkFycmF5VHlwZUVsZW1lbnRWYWx1ZSgpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSB2YWx1ZXNfW2ldOwotICAgIH0KLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIHZhbHVlc19baV0tPkV4dHJhY3RDbGFzc05hbWVzKCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBwdXRfdTEocCwgdGFnXyk7Ci0gICAgcHV0X3UyYmUocCwgdmFsdWVzXy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCB2YWx1ZXNfLnNpemUoKTsgKytpaSkgewotICAgICAgdmFsdWVzX1tpaV0tPldyaXRlKHApOwotICAgIH0KLSAgfQotICBzdGF0aWMgQXJyYXlUeXBlRWxlbWVudFZhbHVlICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgIEFycmF5VHlwZUVsZW1lbnRWYWx1ZSAqdmFsdWUgPSBuZXcgQXJyYXlUeXBlRWxlbWVudFZhbHVlOwotICAgIHUyIG51bV92YWx1ZXMgPSBnZXRfdTJiZShwKTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtX3ZhbHVlczsgKytpaSkgewotICAgICAgdmFsdWUtPnZhbHVlc18ucHVzaF9iYWNrKEVsZW1lbnRWYWx1ZTo6UmVhZChwKSk7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICBzdGQ6OnZlY3RvcjxFbGVtZW50VmFsdWUqPiB2YWx1ZXNfOwotfTsKLQotLy8gU2VlIHNlYy40LjcuMTYgb2YgSlZNIHNwZWMuCi1zdHJ1Y3QgQW5ub3RhdGlvbiB7Ci0gIHZpcnR1YWwgfkFubm90YXRpb24oKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbGVtZW50X3ZhbHVlX3BhaXJzXy5zaXplKCk7IGkrKykgewotICAgICAgZGVsZXRlIGVsZW1lbnRfdmFsdWVfcGFpcnNfW2ldLT5lbGVtZW50X3ZhbHVlXzsKLSAgICAgIGRlbGV0ZSBlbGVtZW50X3ZhbHVlX3BhaXJzX1tpXTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEV4dHJhY3RDbGFzc05hbWVzKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWxlbWVudF92YWx1ZV9wYWlyc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGVsZW1lbnRfdmFsdWVfcGFpcnNfW2ldLT5lbGVtZW50X3ZhbHVlXy0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIHB1dF91MmJlKHAsIHR5cGVfLT5zbG90KCkpOwotICAgIHB1dF91MmJlKHAsIGVsZW1lbnRfdmFsdWVfcGFpcnNfLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGVsZW1lbnRfdmFsdWVfcGFpcnNfLnNpemUoKTsgKytpaSkgewotICAgICAgcHV0X3UyYmUocCwgZWxlbWVudF92YWx1ZV9wYWlyc19baWldLT5lbGVtZW50X25hbWVfLT5zbG90KCkpOwotICAgICAgZWxlbWVudF92YWx1ZV9wYWlyc19baWldLT5lbGVtZW50X3ZhbHVlXy0+V3JpdGUocCk7Ci0gICAgfQotICB9Ci0gIHN0YXRpYyBBbm5vdGF0aW9uICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgIEFubm90YXRpb24gKnZhbHVlID0gbmV3IEFubm90YXRpb247Ci0gICAgdmFsdWUtPnR5cGVfID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgIHUyIG51bV9lbGVtZW50X3ZhbHVlX3BhaXJzID0gZ2V0X3UyYmUocCk7Ci0gICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bV9lbGVtZW50X3ZhbHVlX3BhaXJzOyArK2lpKSB7Ci0gICAgICBFbGVtZW50VmFsdWVQYWlyICpwYWlyID0gbmV3IEVsZW1lbnRWYWx1ZVBhaXI7Ci0gICAgICBwYWlyLT5lbGVtZW50X25hbWVfID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgICAgcGFpci0+ZWxlbWVudF92YWx1ZV8gPSBFbGVtZW50VmFsdWU6OlJlYWQocCk7Ci0gICAgICB2YWx1ZS0+ZWxlbWVudF92YWx1ZV9wYWlyc18ucHVzaF9iYWNrKHBhaXIpOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgQ29uc3RhbnQgKnR5cGVfOwotICBzdHJ1Y3QgRWxlbWVudFZhbHVlUGFpciB7Ci0gICAgQ29uc3RhbnQgKmVsZW1lbnRfbmFtZV87Ci0gICAgRWxlbWVudFZhbHVlICplbGVtZW50X3ZhbHVlXzsKLSAgfTsKLSAgc3RkOjp2ZWN0b3I8RWxlbWVudFZhbHVlUGFpcio+IGVsZW1lbnRfdmFsdWVfcGFpcnNfOwotfTsKLQotLy8gU2VlIHNlYyA0LjcuMjAgb2YgSmF2YSA4IEpWTSBTcGVjCi0vLwotLy8gRWFjaCBlbnRyeSBpbiB0aGUgYW5ub3RhdGlvbnMgdGFibGUgcmVwcmVzZW50cyBhIHNpbmdsZSBydW4tdGltZSB2aXNpYmxlCi0vLyBhbm5vdGF0aW9uIG9uIGEgdHlwZSB1c2VkIGluIGEgZGVjbGFyYXRpb24gb3IgZXhwcmVzc2lvbi4gVGhlIHR5cGVfYW5ub3RhdGlvbgotLy8gc3RydWN0dXJlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLS8vCi0vLyB0eXBlX2Fubm90YXRpb24gewotLy8gICB1MSB0YXJnZXRfdHlwZTsKLS8vICAgdW5pb24gewotLy8gICAgIHR5cGVfcGFyYW1ldGVyX3RhcmdldDsKLS8vICAgICBzdXBlcnR5cGVfdGFyZ2V0OwotLy8gICAgIHR5cGVfcGFyYW1ldGVyX2JvdW5kX3RhcmdldDsKLS8vICAgICBlbXB0eV90YXJnZXQ7Ci0vLyAgICAgbWV0aG9kX2Zvcm1hbF9wYXJhbWV0ZXJfdGFyZ2V0OwotLy8gICAgIHRocm93c190YXJnZXQ7Ci0vLyAgICAgbG9jYWx2YXJfdGFyZ2V0OwotLy8gICAgIGNhdGNoX3RhcmdldDsKLS8vICAgICBvZmZzZXRfdGFyZ2V0OwotLy8gICAgIHR5cGVfYXJndW1lbnRfdGFyZ2V0OwotLy8gICB9IHRhcmdldF9pbmZvOwotLy8gICB0eXBlX3BhdGggdGFyZ2V0X3BhdGg7Ci0vLyAgIHUyICAgICAgICB0eXBlX2luZGV4OwotLy8gICB1MiAgICAgICAgbnVtX2VsZW1lbnRfdmFsdWVfcGFpcnM7Ci0vLyAgIHsKLS8vICAgICB1MiAgICAgICAgICAgIGVsZW1lbnRfbmFtZV9pbmRleDsKLS8vICAgICBlbGVtZW50X3ZhbHVlIHZhbHVlOwotLy8gICB9Ci0vLyAgIGVsZW1lbnRfdmFsdWVfcGFpcnNbbnVtX2VsZW1lbnRfdmFsdWVfcGFpcnNdOwotLy8gfQotLy8KLXN0cnVjdCBUeXBlQW5ub3RhdGlvbiB7Ci0gIHZpcnR1YWwgflR5cGVBbm5vdGF0aW9uKCkgewotICAgIGRlbGV0ZSB0YXJnZXRfaW5mb187Ci0gICAgZGVsZXRlIHR5cGVfcGF0aF87Ci0gICAgZGVsZXRlIGFubm90YXRpb25fOwotICB9Ci0KLSAgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBhbm5vdGF0aW9uXy0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhcmdldF90eXBlXyk7Ci0gICAgdGFyZ2V0X2luZm9fLT5Xcml0ZShwKTsKLSAgICB0eXBlX3BhdGhfLT5Xcml0ZShwKTsKLSAgICBhbm5vdGF0aW9uXy0+V3JpdGUocCk7Ci0gIH0KLQotICBzdGF0aWMgVHlwZUFubm90YXRpb24gKlJlYWQoY29uc3QgdTEgKiZwKSB7Ci0gICAgVHlwZUFubm90YXRpb24gKnZhbHVlID0gbmV3IFR5cGVBbm5vdGF0aW9uOwotICAgIHZhbHVlLT50YXJnZXRfdHlwZV8gPSBnZXRfdTEocCk7Ci0gICAgdmFsdWUtPnRhcmdldF9pbmZvXyA9IFJlYWRUYXJnZXRJbmZvKHAsIHZhbHVlLT50YXJnZXRfdHlwZV8pOwotICAgIHZhbHVlLT50eXBlX3BhdGhfID0gVHlwZVBhdGg6OlJlYWQocCk7Ci0gICAgdmFsdWUtPmFubm90YXRpb25fID0gQW5ub3RhdGlvbjo6UmVhZChwKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICBzdHJ1Y3QgVGFyZ2V0SW5mbyB7Ci0gICAgdmlydHVhbCB+VGFyZ2V0SW5mbygpIHt9Ci0gICAgdmlydHVhbCB2b2lkIFdyaXRlKHUxIComcCkgPSAwOwotICB9OwotCi0gIHN0cnVjdCBUeXBlUGFyYW1ldGVyVGFyZ2V0SW5mbyA6IFRhcmdldEluZm8gewotICAgIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgICBwdXRfdTEocCwgdHlwZV9wYXJhbWV0ZXJfaW5kZXhfKTsKLSAgICB9Ci0gICAgc3RhdGljIFR5cGVQYXJhbWV0ZXJUYXJnZXRJbmZvICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgICAgVHlwZVBhcmFtZXRlclRhcmdldEluZm8gKnZhbHVlID0gbmV3IFR5cGVQYXJhbWV0ZXJUYXJnZXRJbmZvOwotICAgICAgdmFsdWUtPnR5cGVfcGFyYW1ldGVyX2luZGV4XyA9IGdldF91MShwKTsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgdTEgdHlwZV9wYXJhbWV0ZXJfaW5kZXhfOwotICB9OwotCi0gIHN0cnVjdCBDbGFzc0V4dGVuZHNJbmZvIDogVGFyZ2V0SW5mbyB7Ci0gICAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICAgIHB1dF91MmJlKHAsIHN1cGVydHlwZV9pbmRleF8pOwotICAgIH0KLSAgICBzdGF0aWMgQ2xhc3NFeHRlbmRzSW5mbyAqUmVhZChjb25zdCB1MSAqJnApIHsKLSAgICAgIENsYXNzRXh0ZW5kc0luZm8gKnZhbHVlID0gbmV3IENsYXNzRXh0ZW5kc0luZm87Ci0gICAgICB2YWx1ZS0+c3VwZXJ0eXBlX2luZGV4XyA9IGdldF91MmJlKHApOwotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICB1MiBzdXBlcnR5cGVfaW5kZXhfOwotICB9OwotCi0gIHN0cnVjdCBUeXBlUGFyYW1ldGVyQm91bmRJbmZvIDogVGFyZ2V0SW5mbyB7Ci0gICAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICAgIHB1dF91MShwLCB0eXBlX3BhcmFtZXRlcl9pbmRleF8pOwotICAgICAgcHV0X3UxKHAsIGJvdW5kX2luZGV4Xyk7Ci0gICAgfQotICAgIHN0YXRpYyBUeXBlUGFyYW1ldGVyQm91bmRJbmZvICpSZWFkKGNvbnN0IHUxIComcCkgewotICAgICAgVHlwZVBhcmFtZXRlckJvdW5kSW5mbyAqdmFsdWUgPSBuZXcgVHlwZVBhcmFtZXRlckJvdW5kSW5mbzsKLSAgICAgIHZhbHVlLT50eXBlX3BhcmFtZXRlcl9pbmRleF8gPSBnZXRfdTEocCk7Ci0gICAgICB2YWx1ZS0+Ym91bmRfaW5kZXhfID0gZ2V0X3UxKHApOwotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICB1MSB0eXBlX3BhcmFtZXRlcl9pbmRleF87Ci0gICAgdTEgYm91bmRfaW5kZXhfOwotICB9OwotCi0gIHN0cnVjdCBFbXB0eUluZm8gOiBUYXJnZXRJbmZvIHsKLSAgICB2b2lkIFdyaXRlKHUxIComKSB7fQotICAgIHN0YXRpYyBFbXB0eUluZm8gKlJlYWQoY29uc3QgdTEgKiYpIHsKLSAgICAgIHJldHVybiBuZXcgRW1wdHlJbmZvOwotICAgIH0KLSAgfTsKLQotICBzdHJ1Y3QgTWV0aG9kRm9ybWFsUGFyYW1ldGVySW5mbyA6IFRhcmdldEluZm8gewotICAgIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgICBwdXRfdTEocCwgbWV0aG9kX2Zvcm1hbF9wYXJhbWV0ZXJfaW5kZXhfKTsKLSAgICB9Ci0gICAgc3RhdGljIE1ldGhvZEZvcm1hbFBhcmFtZXRlckluZm8gKlJlYWQoY29uc3QgdTEgKiZwKSB7Ci0gICAgICBNZXRob2RGb3JtYWxQYXJhbWV0ZXJJbmZvICp2YWx1ZSA9IG5ldyBNZXRob2RGb3JtYWxQYXJhbWV0ZXJJbmZvOwotICAgICAgdmFsdWUtPm1ldGhvZF9mb3JtYWxfcGFyYW1ldGVyX2luZGV4XyA9IGdldF91MShwKTsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgdTEgbWV0aG9kX2Zvcm1hbF9wYXJhbWV0ZXJfaW5kZXhfOwotICB9OwotCi0gIHN0cnVjdCBUaHJvd3NUeXBlSW5mbyA6IFRhcmdldEluZm8gewotICAgIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgICBwdXRfdTJiZShwLCB0aHJvd3NfdHlwZV9pbmRleF8pOwotICAgIH0KLSAgICBzdGF0aWMgVGhyb3dzVHlwZUluZm8gKlJlYWQoY29uc3QgdTEgKiZwKSB7Ci0gICAgICBUaHJvd3NUeXBlSW5mbyAqdmFsdWUgPSBuZXcgVGhyb3dzVHlwZUluZm87Ci0gICAgICB2YWx1ZS0+dGhyb3dzX3R5cGVfaW5kZXhfID0gZ2V0X3UyYmUocCk7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIHUyIHRocm93c190eXBlX2luZGV4XzsKLSAgfTsKLQotICBzdGF0aWMgVGFyZ2V0SW5mbyAqUmVhZFRhcmdldEluZm8oY29uc3QgdTEgKiZwLCB1MSB0YXJnZXRfdHlwZSkgewotICAgIHN3aXRjaCAodGFyZ2V0X3R5cGUpIHsKLSAgICAgIGNhc2UgQ0xBU1NfVFlQRV9QQVJBTUVURVI6Ci0gICAgICBjYXNlIE1FVEhPRF9UWVBFX1BBUkFNRVRFUjoKLSAgICAgICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJUYXJnZXRJbmZvOjpSZWFkKHApOwotICAgICAgY2FzZSBDTEFTU19FWFRFTkRTOgotICAgICAgICByZXR1cm4gQ2xhc3NFeHRlbmRzSW5mbzo6UmVhZChwKTsKLSAgICAgIGNhc2UgQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkQ6Ci0gICAgICBjYXNlIE1FVEhPRF9UWVBFX1BBUkFNRVRFUl9CT1VORDoKLSAgICAgICAgcmV0dXJuIFR5cGVQYXJhbWV0ZXJCb3VuZEluZm86OlJlYWQocCk7Ci0gICAgICBjYXNlIEZJRUxEOgotICAgICAgY2FzZSBNRVRIT0RfUkVUVVJOOgotICAgICAgY2FzZSBNRVRIT0RfUkVDRUlWRVI6Ci0gICAgICAgIHJldHVybiBuZXcgRW1wdHlJbmZvOwotICAgICAgY2FzZSBNRVRIT0RfRk9STUFMX1BBUkFNRVRFUjoKLSAgICAgICAgcmV0dXJuIE1ldGhvZEZvcm1hbFBhcmFtZXRlckluZm86OlJlYWQocCk7Ci0gICAgICBjYXNlIFRIUk9XUzoKLSAgICAgICAgcmV0dXJuIFRocm93c1R5cGVJbmZvOjpSZWFkKHApOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIHR5cGUgYW5ub3RhdGlvbiB0YXJnZXQgdHlwZTogJWRcbiIsCi0gICAgICAgICAgICAgICAgdGFyZ2V0X3R5cGUpOwotICAgICAgICBhYm9ydCgpOwotICAgIH0KLSAgfQotCi0gIHN0cnVjdCBUeXBlUGF0aCB7Ci0gICAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICAgIHB1dF91MShwLCBwYXRoXy5zaXplKCkpOwotICAgICAgZm9yIChUeXBlUGF0aEVudHJ5IGVudHJ5IDogcGF0aF8pIHsKLSAgICAgICAgcHV0X3UxKHAsIGVudHJ5LnR5cGVfcGF0aF9raW5kXyk7Ci0gICAgICAgIHB1dF91MShwLCBlbnRyeS50eXBlX2FyZ3VtZW50X2luZGV4Xyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN0YXRpYyBUeXBlUGF0aCAqUmVhZChjb25zdCB1MSAqJnApIHsKLSAgICAgIFR5cGVQYXRoICp2YWx1ZSA9IG5ldyBUeXBlUGF0aDsKLSAgICAgIHUxIHBhdGhfbGVuZ3RoID0gZ2V0X3UxKHApOwotICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IHBhdGhfbGVuZ3RoOyArK2lpKSB7Ci0gICAgICAgIFR5cGVQYXRoRW50cnkgZW50cnk7Ci0gICAgICAgIGVudHJ5LnR5cGVfcGF0aF9raW5kXyA9IGdldF91MShwKTsKLSAgICAgICAgZW50cnkudHlwZV9hcmd1bWVudF9pbmRleF8gPSBnZXRfdTEocCk7Ci0gICAgICAgIHZhbHVlLT5wYXRoXy5wdXNoX2JhY2soZW50cnkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHN0cnVjdCBUeXBlUGF0aEVudHJ5IHsKLSAgICAgIHUxIHR5cGVfcGF0aF9raW5kXzsKLSAgICAgIHUxIHR5cGVfYXJndW1lbnRfaW5kZXhfOwotICAgIH07Ci0gICAgc3RkOjp2ZWN0b3I8VHlwZVBhdGhFbnRyeT4gcGF0aF87Ci0gIH07Ci0KLSAgdTEgdGFyZ2V0X3R5cGVfOwotICBUYXJnZXRJbmZvICp0YXJnZXRfaW5mb187Ci0gIFR5cGVQYXRoICp0eXBlX3BhdGhfOwotICBBbm5vdGF0aW9uICphbm5vdGF0aW9uXzsKLX07Ci0KLXN0cnVjdCBBbm5vdGF0aW9uVHlwZUVsZW1lbnRWYWx1ZSA6IEVsZW1lbnRWYWx1ZSB7Ci0gIHZpcnR1YWwgfkFubm90YXRpb25UeXBlRWxlbWVudFZhbHVlKCkgewotICAgIGRlbGV0ZSBhbm5vdGF0aW9uXzsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgcHV0X3UxKHAsIHRhZ18pOwotICAgIGFubm90YXRpb25fLT5Xcml0ZShwKTsKLSAgfQotICBzdGF0aWMgQW5ub3RhdGlvblR5cGVFbGVtZW50VmFsdWUgKlJlYWQoY29uc3QgdTEgKiZwKSB7Ci0gICAgQW5ub3RhdGlvblR5cGVFbGVtZW50VmFsdWUgKnZhbHVlID0gbmV3IEFubm90YXRpb25UeXBlRWxlbWVudFZhbHVlOwotICAgIHZhbHVlLT5hbm5vdGF0aW9uXyA9IEFubm90YXRpb246OlJlYWQocCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgQW5ub3RhdGlvbiAqYW5ub3RhdGlvbl87Ci19OwotCi1FbGVtZW50VmFsdWUqIEVsZW1lbnRWYWx1ZTo6UmVhZChjb25zdCB1MSAqJnApIHsKLSAgY29uc3QgdTEqIHN0YXJ0ID0gcDsKLSAgRWxlbWVudFZhbHVlICpyZXN1bHQ7Ci0gIHUxIHRhZyA9IGdldF91MShwKTsKLSAgaWYgKHRhZyAhPSAwICYmIHN0cmNocigiQkNERklKU1pzIiwgKGNoYXIpIHRhZykgIT0gTlVMTCkgewotICAgIHJlc3VsdCA9IEJhc2VUeXBlRWxlbWVudFZhbHVlOjpSZWFkKHApOwotICB9IGVsc2UgaWYgKChjaGFyKSB0YWcgPT0gJ2UnKSB7Ci0gICAgcmVzdWx0ID0gRW51bVR5cGVFbGVtZW50VmFsdWU6OlJlYWQocCk7Ci0gIH0gZWxzZSBpZiAoKGNoYXIpIHRhZyA9PSAnYycpIHsKLSAgICByZXN1bHQgPSBDbGFzc1R5cGVFbGVtZW50VmFsdWU6OlJlYWQocCk7Ci0gIH0gZWxzZSBpZiAoKGNoYXIpIHRhZyA9PSAnWycpIHsKLSAgICByZXN1bHQgPSBBcnJheVR5cGVFbGVtZW50VmFsdWU6OlJlYWQocCk7Ci0gIH0gZWxzZSBpZiAoKGNoYXIpIHRhZyA9PSAnQCcpIHsKLSAgICByZXN1bHQgPSBBbm5vdGF0aW9uVHlwZUVsZW1lbnRWYWx1ZTo6UmVhZChwKTsKLSAgfSBlbHNlIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIklsbGVnYWwgZWxlbWVudF92YWx1ZTo6dGFnOiAlZFxuIiwgdGFnKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIHJlc3VsdC0+dGFnXyA9IHRhZzsKLSAgcmVzdWx0LT5sZW5ndGhfID0gcCAtIHN0YXJ0OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBTZWUgc2VjLjQuNy4yMCBvZiBKVk0gc3BlYy4KLS8vIFdlIHByZXNlcnZlIEFubm90YXRpb25EZWZhdWx0IGF0dHJpYnV0ZXMgYmVjYXVzZSB0aGV5IGFyZSByZXF1aXJlZAotLy8gaW4gb3JkZXIgdG8gbWFrZSB1c2Ugb2YgYW4gYW5ub3RhdGlvbiBpbiBuZXcgY29kZS4KLXN0cnVjdCBBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0gIHZpcnR1YWwgfkFubm90YXRpb25EZWZhdWx0QXR0cmlidXRlKCkgewotICAgIGRlbGV0ZSBkZWZhdWx0X3ZhbHVlXzsKLSAgfQotCi0gIHN0YXRpYyBBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSogUmVhZChjb25zdCB1MSAqJnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZSAqYXR0ciA9IG5ldyBBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLSAgICBhdHRyLT5kZWZhdWx0X3ZhbHVlXyA9IEVsZW1lbnRWYWx1ZTo6UmVhZChwKTsKLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgV3JpdGVQcm9sb2cocCwgZGVmYXVsdF92YWx1ZV8tPmxlbmd0aF8pOwotICAgIGRlZmF1bHRfdmFsdWVfLT5Xcml0ZShwKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBkZWZhdWx0X3ZhbHVlXy0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgfQotCi0gIEVsZW1lbnRWYWx1ZSAqZGVmYXVsdF92YWx1ZV87Ci19OwotCi0vLyBTZWUgc2VjLjQuNy4yIG9mIEpWTSBzcGVjLgotLy8gV2UgcHJlc2VydmUgQ29uc3RhbnRWYWx1ZSBhdHRyaWJ1dGVzIGJlY2F1c2UgdGhleSBhcmUgcmVxdWlyZWQgZm9yCi0vLyBjb21waWxlLXRpbWUgY29uc3RhbnQgcHJvcGFnYXRpb24uCi1zdHJ1Y3QgQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0KLSAgc3RhdGljIENvbnN0YW50VmFsdWVBdHRyaWJ1dGUqIFJlYWQoY29uc3QgdTEgKiZwLCBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBDb25zdGFudFZhbHVlQXR0cmlidXRlICphdHRyID0gbmV3IENvbnN0YW50VmFsdWVBdHRyaWJ1dGU7Ci0gICAgYXR0ci0+YXR0cmlidXRlX25hbWVfID0gYXR0cmlidXRlX25hbWU7Ci0gICAgYXR0ci0+Y29uc3RhbnR2YWx1ZV8gPSBjb25zdGFudChnZXRfdTJiZShwKSk7Ci0gICAgcmV0dXJuIGF0dHI7Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIFdyaXRlUHJvbG9nKHAsIDIpOwotICAgIHB1dF91MmJlKHAsIGNvbnN0YW50dmFsdWVfLT5zbG90KCkpOwotICB9Ci0KLSAgQ29uc3RhbnQgKmNvbnN0YW50dmFsdWVfOwotfTsKLQotLy8gU2VlIHNlYy40LjcuOSBvZiBKVk0gc3BlYy4KLS8vIFdlIHByZXNlcnZlIFNpZ25hdHVyZSBhdHRyaWJ1dGVzIGJlY2F1c2UgdGhleSBhcmUgcmVxdWlyZWQgYnkgdGhlCi0vLyBjb21waWxlciBmb3IgdHlwZS1jaGVja2luZyBvZiBnZW5lcmljcy4KLXN0cnVjdCBTaWduYXR1cmVBdHRyaWJ1dGUgOiBBdHRyaWJ1dGUgewotCi0gIHN0YXRpYyBTaWduYXR1cmVBdHRyaWJ1dGUqIFJlYWQoY29uc3QgdTEgKiZwLCBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBTaWduYXR1cmVBdHRyaWJ1dGUgKmF0dHIgPSBuZXcgU2lnbmF0dXJlQXR0cmlidXRlOwotICAgIGF0dHItPmF0dHJpYnV0ZV9uYW1lXyA9IGF0dHJpYnV0ZV9uYW1lOwotICAgIGF0dHItPnNpZ25hdHVyZV8gID0gY29uc3RhbnQoZ2V0X3UyYmUocCkpOwotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBXcml0ZVByb2xvZyhwLCAyKTsKLSAgICBwdXRfdTJiZShwLCBzaWduYXR1cmVfLT5zbG90KCkpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIEV4dHJhY3RDbGFzc05hbWVzKCkgewotICAgIHNpemVfdCBzaWduYXR1cmVfaWR4ID0gMDsKLSAgICBkZXZ0b29sc19pamFyOjpFeHRyYWN0Q2xhc3NOYW1lcyhzaWduYXR1cmVfLT5EaXNwbGF5KCksICZzaWduYXR1cmVfaWR4KTsKLSAgfQotCi0gIENvbnN0YW50ICpzaWduYXR1cmVfOwotfTsKLQotLy8gU2VlIHNlYy40LjcuMTUgb2YgSlZNIHNwZWMuCi0vLyBXZSBwcmVzZXJ2ZSBEZXByZWNhdGVkIGF0dHJpYnV0ZXMgYmVjYXVzZSB0aGV5IGFyZSByZXF1aXJlZCBieSB0aGUKLS8vIGNvbXBpbGVyIHRvIGdlbmVyYXRlIHdhcm5pbmcgbWVzc2FnZXMuCi1zdHJ1Y3QgRGVwcmVjYXRlZEF0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0KLSAgc3RhdGljIERlcHJlY2F0ZWRBdHRyaWJ1dGUqIFJlYWQoY29uc3QgdTEgKiYsIENvbnN0YW50ICphdHRyaWJ1dGVfbmFtZSkgewotICAgIERlcHJlY2F0ZWRBdHRyaWJ1dGUgKmF0dHIgPSBuZXcgRGVwcmVjYXRlZEF0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZvaWQgV3JpdGUodTEgKiZwKSB7Ci0gICAgV3JpdGVQcm9sb2cocCwgMCk7Ci0gIH0KLX07Ci0KLS8vIFNlZSBzZWMuNC43LjE2LTE3IG9mIEpWTSBzcGVjIHYzLiAgSW5jbHVkZXMgUnVudGltZVZpc2libGUgYW5kCi0vLyBSdW50aW1lSW52aXNpYmxlLgotLy8KLS8vIFdlIHByZXNlcnZlIGFsbCBhbm5vdGF0aW9ucy4KLXN0cnVjdCBBbm5vdGF0aW9uc0F0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0gIHZpcnR1YWwgfkFubm90YXRpb25zQXR0cmlidXRlKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICBkZWxldGUgYW5ub3RhdGlvbnNfW2ldOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBBbm5vdGF0aW9uc0F0dHJpYnV0ZSogUmVhZChjb25zdCB1MSAqJnAsIENvbnN0YW50ICphdHRyaWJ1dGVfbmFtZSkgewotICAgIEFubm90YXRpb25zQXR0cmlidXRlICphdHRyID0gbmV3IEFubm90YXRpb25zQXR0cmlidXRlOwotICAgIGF0dHItPmF0dHJpYnV0ZV9uYW1lXyA9IGF0dHJpYnV0ZV9uYW1lOwotICAgIHUyIG51bV9hbm5vdGF0aW9ucyA9IGdldF91MmJlKHApOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBudW1fYW5ub3RhdGlvbnM7ICsraWkpIHsKLSAgICAgIEFubm90YXRpb24gKmFubm90YXRpb24gPSBBbm5vdGF0aW9uOjpSZWFkKHApOwotICAgICAgYXR0ci0+YW5ub3RhdGlvbnNfLnB1c2hfYmFjayhhbm5vdGF0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIGF0dHI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgRXh0cmFjdENsYXNzTmFtZXMoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFubm90YXRpb25zX1tpXS0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIFdyaXRlUHJvbG9nKHAsIC0xKTsKLSAgICB1MSAqcGF5bG9hZF9zdGFydCA9IHAgLSA0OwotICAgIHB1dF91MmJlKHAsIGFubm90YXRpb25zXy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBhbm5vdGF0aW9uc18uc2l6ZSgpOyArK2lpKSB7Ci0gICAgICBhbm5vdGF0aW9uc19baWldLT5Xcml0ZShwKTsKLSAgICB9Ci0gICAgcHV0X3U0YmUocGF5bG9hZF9zdGFydCwgcCAtIDQgLSBwYXlsb2FkX3N0YXJ0KTsgIC8vIGJhY2twYXRjaCBsZW5ndGgKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPEFubm90YXRpb24qPiBhbm5vdGF0aW9uc187Ci19OwotCi0vLyBTZWUgc2VjLjQuNy4xOC0xOSBvZiBKVk0gc3BlYy4gIEluY2x1ZGVzIFJ1bnRpbWVWaXNpYmxlIGFuZAotLy8gUnVudGltZUludmlzaWJsZS4KLS8vCi0vLyBXZSBwcmVzZXJ2ZSBhbGwgYW5ub3RhdGlvbnMuCi1zdHJ1Y3QgUGFyYW1ldGVyQW5ub3RhdGlvbnNBdHRyaWJ1dGUgOiBBdHRyaWJ1dGUgewotCi0gIHN0YXRpYyBQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZSogUmVhZChjb25zdCB1MSAqJnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqYXR0cmlidXRlX25hbWUpIHsKLSAgICBQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZSAqYXR0ciA9IG5ldyBQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLSAgICB1MSBudW1fcGFyYW1ldGVycyA9IGdldF91MShwKTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtX3BhcmFtZXRlcnM7ICsraWkpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPEFubm90YXRpb24qPiBhbm5vdGF0aW9uczsKLSAgICAgIHUyIG51bV9hbm5vdGF0aW9ucyA9IGdldF91MmJlKHApOwotICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG51bV9hbm5vdGF0aW9uczsgKytpaSkgewotICAgICAgICBBbm5vdGF0aW9uICphbm5vdGF0aW9uID0gQW5ub3RhdGlvbjo6UmVhZChwKTsKLSAgICAgICAgYW5ub3RhdGlvbnMucHVzaF9iYWNrKGFubm90YXRpb24pOwotICAgICAgfQotICAgICAgYXR0ci0+cGFyYW1ldGVyX2Fubm90YXRpb25zXy5wdXNoX2JhY2soYW5ub3RhdGlvbnMpOwotICAgIH0KLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtZXRlcl9hbm5vdGF0aW9uc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEFubm90YXRpb24qPiYgYW5ub3RhdGlvbnMgPSBwYXJhbWV0ZXJfYW5ub3RhdGlvbnNfW2ldOwotICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhbm5vdGF0aW9ucy5zaXplKCk7IGorKykgewotICAgICAgICBhbm5vdGF0aW9uc1tqXS0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIFdyaXRlUHJvbG9nKHAsIC0xKTsKLSAgICB1MSAqcGF5bG9hZF9zdGFydCA9IHAgLSA0OwotICAgIHB1dF91MShwLCBwYXJhbWV0ZXJfYW5ub3RhdGlvbnNfLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IHBhcmFtZXRlcl9hbm5vdGF0aW9uc18uc2l6ZSgpOyArK2lpKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxBbm5vdGF0aW9uICo+ICZhbm5vdGF0aW9ucyA9IHBhcmFtZXRlcl9hbm5vdGF0aW9uc19baWldOwotICAgICAgcHV0X3UyYmUocCwgYW5ub3RhdGlvbnMuc2l6ZSgpKTsKLSAgICAgIGZvciAoc2l6ZV90IGpqID0gMDsgamogPCBhbm5vdGF0aW9ucy5zaXplKCk7ICsramopIHsKLSAgICAgICAgYW5ub3RhdGlvbnNbampdLT5Xcml0ZShwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcHV0X3U0YmUocGF5bG9hZF9zdGFydCwgcCAtIDQgLSBwYXlsb2FkX3N0YXJ0KTsgIC8vIGJhY2twYXRjaCBsZW5ndGgKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEFubm90YXRpb24qPiA+IHBhcmFtZXRlcl9hbm5vdGF0aW9uc187Ci19OwotCi0vLyBTZWUgc2VjLjQuNy4yMCBvZiBKYXZhIDggSlZNIHNwZWMuIEluY2x1ZGVzIFJ1bnRpbWVWaXNpYmxlVHlwZUFubm90YXRpb25zCi0vLyBhbmQgUnVudGltZUludmlzaWJsZVR5cGVBbm5vdGF0aW9ucy4KLXN0cnVjdCBUeXBlQW5ub3RhdGlvbnNBdHRyaWJ1dGUgOiBBdHRyaWJ1dGUgewotICBzdGF0aWMgVHlwZUFubm90YXRpb25zQXR0cmlidXRlKiBSZWFkKGNvbnN0IHUxIComcCwgQ29uc3RhbnQgKmF0dHJpYnV0ZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0KSB7Ci0gICAgYXV0byBhdHRyID0gbmV3IFR5cGVBbm5vdGF0aW9uc0F0dHJpYnV0ZTsKLSAgICBhdHRyLT5hdHRyaWJ1dGVfbmFtZV8gPSBhdHRyaWJ1dGVfbmFtZTsKLSAgICB1MiBudW1fYW5ub3RhdGlvbnMgPSBnZXRfdTJiZShwKTsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbnVtX2Fubm90YXRpb25zOyArK2lpKSB7Ci0gICAgICBUeXBlQW5ub3RhdGlvbiAqYW5ub3RhdGlvbiA9IFR5cGVBbm5vdGF0aW9uOjpSZWFkKHApOwotICAgICAgYXR0ci0+dHlwZV9hbm5vdGF0aW9uc18ucHVzaF9iYWNrKGFubm90YXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHR5cGVfYW5ub3RhdGlvbnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICB0eXBlX2Fubm90YXRpb25zX1tpXS0+RXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIFdyaXRlUHJvbG9nKHAsIC0xKTsKLSAgICB1MSAqcGF5bG9hZF9zdGFydCA9IHAgLSA0OwotICAgIHB1dF91MmJlKHAsIHR5cGVfYW5ub3RhdGlvbnNfLnNpemUoKSk7Ci0gICAgZm9yIChUeXBlQW5ub3RhdGlvbiAqYW5ub3RhdGlvbiA6IHR5cGVfYW5ub3RhdGlvbnNfKSB7Ci0gICAgICBhbm5vdGF0aW9uLT5Xcml0ZShwKTsKLSAgICB9Ci0gICAgcHV0X3U0YmUocGF5bG9hZF9zdGFydCwgcCAtIDQgLSBwYXlsb2FkX3N0YXJ0KTsgIC8vIGJhY2twYXRjaCBsZW5ndGgKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPFR5cGVBbm5vdGF0aW9uKj4gdHlwZV9hbm5vdGF0aW9uc187Ci19OwotCi1zdHJ1Y3QgR2VuZXJhbEF0dHJpYnV0ZSA6IEF0dHJpYnV0ZSB7Ci0gIHN0YXRpYyBHZW5lcmFsQXR0cmlidXRlKiBSZWFkKGNvbnN0IHUxIComcCwgQ29uc3RhbnQgKmF0dHJpYnV0ZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NCBhdHRyaWJ1dGVfbGVuZ3RoKSB7Ci0gICAgYXV0byBhdHRyID0gbmV3IEdlbmVyYWxBdHRyaWJ1dGU7Ci0gICAgYXR0ci0+YXR0cmlidXRlX25hbWVfID0gYXR0cmlidXRlX25hbWU7Ci0gICAgYXR0ci0+YXR0cmlidXRlX2xlbmd0aF8gPSBhdHRyaWJ1dGVfbGVuZ3RoOwotICAgIGF0dHItPmF0dHJpYnV0ZV9jb250ZW50XyA9IHA7Ci0gICAgcCArPSBhdHRyaWJ1dGVfbGVuZ3RoOwotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgdm9pZCBXcml0ZSh1MSAqJnApIHsKLSAgICBXcml0ZVByb2xvZyhwLCBhdHRyaWJ1dGVfbGVuZ3RoXyk7Ci0gICAgcHV0X24ocCwgYXR0cmlidXRlX2NvbnRlbnRfLCBhdHRyaWJ1dGVfbGVuZ3RoXyk7Ci0gIH0KLQotICB1NCBhdHRyaWJ1dGVfbGVuZ3RoXzsKLSAgY29uc3QgdTEgKmF0dHJpYnV0ZV9jb250ZW50XzsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IEhhc0F0dHJzIHsKLSAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlKj4gYXR0cmlidXRlczsKLQotICB2b2lkIFdyaXRlQXR0cnModTEgKiZwKTsKLSAgdm9pZCBSZWFkQXR0cnMoY29uc3QgdTEgKiZwKTsKLQotICB2aXJ0dWFsIH5IYXNBdHRycygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzW2ldOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRXh0cmFjdENsYXNzTmFtZXMoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhdHRyaWJ1dGVzW2ldLT5FeHRyYWN0Q2xhc3NOYW1lcygpOwotICAgIH0KLSAgfQotfTsKLQotLy8gQSBmaWVsZCBvciBtZXRob2QuCi0vLyBTZWUgc2VjLjQuNSBhbmQgNC42IG9mIEpWTSBzcGVjLgotc3RydWN0IE1lbWJlciA6IEhhc0F0dHJzIHsKLSAgdTIgYWNjZXNzX2ZsYWdzOwotICBDb25zdGFudCAqbmFtZTsKLSAgQ29uc3RhbnQgKmRlc2NyaXB0b3I7Ci0KLSAgc3RhdGljIE1lbWJlciogUmVhZChjb25zdCB1MSAqJnApIHsKLSAgICBNZW1iZXIgKm0gPSBuZXcgTWVtYmVyOwotICAgIG0tPmFjY2Vzc19mbGFncyA9IGdldF91MmJlKHApOwotICAgIG0tPm5hbWUgPSBjb25zdGFudChnZXRfdTJiZShwKSk7Ci0gICAgbS0+ZGVzY3JpcHRvciA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICBtLT5SZWFkQXR0cnMocCk7Ci0gICAgcmV0dXJuIG07Ci0gIH0KLQotICB2b2lkIFdyaXRlKHUxIComcCkgewotICAgIHB1dF91MmJlKHAsIGFjY2Vzc19mbGFncyk7Ci0gICAgcHV0X3UyYmUocCwgbmFtZS0+c2xvdCgpKTsKLSAgICBwdXRfdTJiZShwLCBkZXNjcmlwdG9yLT5zbG90KCkpOwotICAgIFdyaXRlQXR0cnMocCk7Ci0gIH0KLX07Ci0KLS8vIFNlZSBzZWMuNC4xIG9mIEpWTSBzcGVjLgotc3RydWN0IENsYXNzRmlsZSA6IEhhc0F0dHJzIHsKLQotICBzaXplX3QgbGVuZ3RoOwotCi0gIC8vIEhlYWRlcjoKLSAgdTQgbWFnaWM7Ci0gIHUyIG1ham9yOwotICB1MiBtaW5vcjsKLQotICAvLyBCb2R5OgotICB1MiBhY2Nlc3NfZmxhZ3M7Ci0gIENvbnN0YW50ICp0aGlzX2NsYXNzOwotICBDb25zdGFudCAqc3VwZXJfY2xhc3M7Ci0gIHN0ZDo6dmVjdG9yPENvbnN0YW50Kj4gaW50ZXJmYWNlczsKLSAgc3RkOjp2ZWN0b3I8TWVtYmVyKj4gZmllbGRzOwotICBzdGQ6OnZlY3RvcjxNZW1iZXIqPiBtZXRob2RzOwotCi0gIHZpcnR1YWwgfkNsYXNzRmlsZSgpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotICAgICAgZGVsZXRlIGZpZWxkc1tpXTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBtZXRob2RzW2ldOwotICAgIH0KLQotICAgIC8vIENvbnN0YW50cyBkbyBub3QgbmVlZCB0byBiZSBkZWxldGVkOyB0aGV5IGFyZSBvd25lZCBieSB0aGUgY29uc3RhbnQgcG9vbC4KLSAgfQotCi0gIHZvaWQgV3JpdGVDbGFzcyh1MSAqJnApOwotCi0gIGJvb2wgUmVhZENvbnN0YW50UG9vbChjb25zdCB1MSAqJnApOwotCi0gIHZvaWQgU3RyaXBJZkFub255bW91cygpOwotCi0gIHZvaWQgV3JpdGVIZWFkZXIodTEgKiZwKSB7Ci0gICAgcHV0X3U0YmUocCwgbWFnaWMpOwotICAgIHB1dF91MmJlKHAsIG1ham9yKTsKLSAgICBwdXRfdTJiZShwLCBtaW5vcik7Ci0KLSAgICBwdXRfdTJiZShwLCBjb25zdF9wb29sX291dC5zaXplKCkpOwotICAgIGZvciAodTIgaWkgPSAxOyBpaSA8IGNvbnN0X3Bvb2xfb3V0LnNpemUoKTsgKytpaSkgewotICAgICAgaWYgKGNvbnN0X3Bvb2xfb3V0W2lpXSAhPSBOVUxMKSB7IC8vIE5COiBOVUxMcyBhcHBlYXIgYWZ0ZXIgbG9uZy9kb3VibGUuCi0gICAgICAgIGNvbnN0X3Bvb2xfb3V0W2lpXS0+V3JpdGUocCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBXcml0ZUJvZHkodTEgKiZwKSB7Ci0gICAgcHV0X3UyYmUocCwgYWNjZXNzX2ZsYWdzKTsKLSAgICBwdXRfdTJiZShwLCB0aGlzX2NsYXNzLT5zbG90KCkpOwotICAgIHB1dF91MmJlKHAsIHN1cGVyX2NsYXNzID09IE5VTEwgPyAwIDogc3VwZXJfY2xhc3MtPnNsb3QoKSk7Ci0gICAgcHV0X3UyYmUocCwgaW50ZXJmYWNlcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBpbnRlcmZhY2VzLnNpemUoKTsgKytpaSkgewotICAgICAgcHV0X3UyYmUocCwgaW50ZXJmYWNlc1tpaV0tPnNsb3QoKSk7Ci0gICAgfQotICAgIHB1dF91MmJlKHAsIGZpZWxkcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBmaWVsZHMuc2l6ZSgpOyArK2lpKSB7Ci0gICAgICBmaWVsZHNbaWldLT5Xcml0ZShwKTsKLSAgICB9Ci0gICAgcHV0X3UyYmUocCwgbWV0aG9kcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBtZXRob2RzLnNpemUoKTsgKytpaSkgewotICAgICAgbWV0aG9kc1tpaV0tPldyaXRlKHApOwotICAgIH0KLQotICAgIEF0dHJpYnV0ZSogaW5uZXJfY2xhc3NlcyA9IE5VTEw7Ci0KLSAgICAvLyBNYWtlIHRoZSBpbm5lciBjbGFzc2VzIGF0dHJpYnV0ZSB0aGUgbGFzdCwgc28gdGhhdCBpdCBjYW4ga25vdyB3aGljaAotICAgIC8vIGNvbnN0YW50cyB3ZXJlIG5lZWRlZAotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaWkrKykgewotICAgICAgaWYgKGF0dHJpYnV0ZXNbaWldLT5hdHRyaWJ1dGVfbmFtZV8tPkRpc3BsYXkoKSA9PSAiSW5uZXJDbGFzc2VzIikgewotICAgICAgICBpbm5lcl9jbGFzc2VzID0gYXR0cmlidXRlc1tpaV07Ci0gICAgICAgIGF0dHJpYnV0ZXMuZXJhc2UoYXR0cmlidXRlcy5iZWdpbigpICsgaWkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaW5uZXJfY2xhc3NlcyAhPSBOVUxMKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhpbm5lcl9jbGFzc2VzKTsKLSAgICB9Ci0KLSAgICBXcml0ZUF0dHJzKHApOwotICB9Ci0KLX07Ci0KLXZvaWQgSGFzQXR0cnM6OlJlYWRBdHRycyhjb25zdCB1MSAqJnApIHsKLSAgdTIgYXR0cmlidXRlc19jb3VudCA9IGdldF91MmJlKHApOwotICBmb3IgKGludCBpaSA9IDA7IGlpIDwgYXR0cmlidXRlc19jb3VudDsgaWkrKykgewotICAgIENvbnN0YW50ICphdHRyaWJ1dGVfbmFtZSA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgICB1NCBhdHRyaWJ1dGVfbGVuZ3RoID0gZ2V0X3U0YmUocCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBhdHRyX25hbWUgPSBhdHRyaWJ1dGVfbmFtZS0+RGlzcGxheSgpOwotICAgIGlmIChhdHRyX25hbWUgPT0gIlNvdXJjZUZpbGUiIHx8Ci0gICAgICAgIGF0dHJfbmFtZSA9PSAiTGluZU51bWJlclRhYmxlIiB8fAotICAgICAgICBhdHRyX25hbWUgPT0gIkxvY2FsVmFyaWFibGVUYWJsZSIgfHwKLSAgICAgICAgYXR0cl9uYW1lID09ICJMb2NhbFZhcmlhYmxlVHlwZVRhYmxlIiB8fAotICAgICAgICBhdHRyX25hbWUgPT0gIkNvZGUiIHx8Ci0gICAgICAgIGF0dHJfbmFtZSA9PSAiU3ludGhldGljIiB8fAotICAgICAgICBhdHRyX25hbWUgPT0gIkJvb3RzdHJhcE1ldGhvZHMiKSB7Ci0gICAgICBwICs9IGF0dHJpYnV0ZV9sZW5ndGg7IC8vIGRyb3AgdGhlc2UgYXR0cmlidXRlcwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJFeGNlcHRpb25zIikgewotICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soRXhjZXB0aW9uc0F0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJTaWduYXR1cmUiKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhTaWduYXR1cmVBdHRyaWJ1dGU6OlJlYWQocCwgYXR0cmlidXRlX25hbWUpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHJfbmFtZSA9PSAiRGVwcmVjYXRlZCIpIHsKLSAgICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKERlcHJlY2F0ZWRBdHRyaWJ1dGU6OlJlYWQocCwgYXR0cmlidXRlX25hbWUpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHJfbmFtZSA9PSAiRW5jbG9zaW5nTWV0aG9kIikgewotICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soRW5jbG9zaW5nTWV0aG9kQXR0cmlidXRlOjpSZWFkKHAsIGF0dHJpYnV0ZV9uYW1lKSk7Ci0gICAgfSBlbHNlIGlmIChhdHRyX25hbWUgPT0gIklubmVyQ2xhc3NlcyIpIHsKLSAgICAgIC8vIFRPRE8oYmF6ZWwtdGVhbSk6IG9taXQgcHJpdmF0ZSBpbm5lciBjbGFzc2VzCi0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhJbm5lckNsYXNzZXNBdHRyaWJ1dGU6OlJlYWQocCwgYXR0cmlidXRlX25hbWUpKTsKLSAgICB9IGVsc2UgaWYgKGF0dHJfbmFtZSA9PSAiQW5ub3RhdGlvbkRlZmF1bHQiKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhBbm5vdGF0aW9uRGVmYXVsdEF0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJDb25zdGFudFZhbHVlIikgewotICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soQ29uc3RhbnRWYWx1ZUF0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJSdW50aW1lVmlzaWJsZUFubm90YXRpb25zIiB8fAotICAgICAgICAgICAgICAgYXR0cl9uYW1lID09ICJSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnMiKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhBbm5vdGF0aW9uc0F0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJSdW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zIiB8fAotICAgICAgICAgICAgICAgYXR0cl9uYW1lID09ICJSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMiKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjaygKLSAgICAgICAgICBQYXJhbWV0ZXJBbm5vdGF0aW9uc0F0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJTY2FsYSIgfHwKLSAgICAgICAgICAgICAgIGF0dHJfbmFtZSA9PSAiU2NhbGFTaWciIHx8Ci0gICAgICAgICAgICAgICBhdHRyX25hbWUgPT0gIlNjYWxhSW5saW5lSW5mbyIpIHsKLSAgICAgIC8vIFRoZXNlIGFyZSBvcGFxdWUgYmxvYnMsIHNvIGNhbiBiZSBoYW5kbGVkIHdpdGggYSBnZW5lcmFsCi0gICAgICAvLyBhdHRyaWJ1dGUgaGFuZGxlcgotICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soR2VuZXJhbEF0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlX2xlbmd0aCkpOwotICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lID09ICJSdW50aW1lVmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIgfHwKLSAgICAgICAgICAgICAgIGF0dHJfbmFtZSA9PSAiUnVudGltZUludmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIpIHsKLSAgICAgIC8vIEpTUiAzMDg6IGFubm90YXRpb25zIG9uIHR5cGVzLiBKREsgNyBoYXMgbm8gdXNlIGZvciB0aGVzZSB5ZXQsIGJ1dCB0aGUKLSAgICAgIC8vIENoZWNrZXJzIEZyYW1ld29yayByZWxpZXMgb24gdGhlbS4KLSAgICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKFR5cGVBbm5vdGF0aW9uc0F0dHJpYnV0ZTo6UmVhZChwLCBhdHRyaWJ1dGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfbGVuZ3RoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFNraXAgb3ZlciB1bmtub3duIGF0dHJpYnV0ZXMgd2l0aCBhIHdhcm5pbmcuICBUaGUgSlZNIHNwZWMKLSAgICAgIC8vIHNheXMgdGhpcyBpcyBvaywgc28gbG9uZyBhcyB3ZSBoYW5kbGUgdGhlIG1hbmRhdG9yeSBhdHRyaWJ1dGVzLgotICAgICAgZnByaW50ZihzdGRlcnIsICJpamFyOiBza2lwcGluZyB1bmtub3duIGF0dHJpYnV0ZTogXCIlc1wiLlxuIiwKLSAgICAgICAgICAgICAgYXR0cl9uYW1lLmNfc3RyKCkpOwotICAgICAgcCArPSBhdHRyaWJ1dGVfbGVuZ3RoOwotICAgIH0KLSAgfQotfQotCi12b2lkIEhhc0F0dHJzOjpXcml0ZUF0dHJzKHUxIComcCkgewotICB1MSogcF9zaXplID0gcDsKLQotICBwdXRfdTJiZShwLCAwKTsKLSAgaW50IG5fd3JpdHRlbl9hdHRycyA9IDA7Ci0gIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaWkrKykgewotICAgIHUxKiBiZWZvcmUgPSBwOwotICAgIGF0dHJpYnV0ZXNbaWldLT5Xcml0ZShwKTsKLSAgICBpZiAocCAhPSBiZWZvcmUpIHsKLSAgICAgIG5fd3JpdHRlbl9hdHRycysrOwotICAgIH0KLSAgfQotCi0gIHB1dF91MmJlKHBfc2l6ZSwgbl93cml0dGVuX2F0dHJzKTsKLX0KLQotLy8gU2VlIHNlYy40LjQgb2YgSlZNIHNwZWMuCi1ib29sIENsYXNzRmlsZTo6UmVhZENvbnN0YW50UG9vbChjb25zdCB1MSAqJnApIHsKLQotICBjb25zdF9wb29sX2luLmNsZWFyKCk7Ci0gIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKE5VTEwpOyAvLyBkdW1teSBmaXJzdCBpdGVtCi0KLSAgdTIgY3BfY291bnQgPSBnZXRfdTJiZShwKTsKLSAgZm9yIChpbnQgaWkgPSAxOyBpaSA8IGNwX2NvdW50OyArK2lpKSB7Ci0gICAgdTEgdGFnID0gZ2V0X3UxKHApOwotCi0gICAgaWYgKGRldnRvb2xzX2lqYXI6OnZlcmJvc2UpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY3BbJWQvJWRdID0gdGFnICVkXG4iLCBpaSwgY3BfY291bnQsIHRhZyk7Ci0gICAgfQotCi0gICAgc3dpdGNoKHRhZykgewotICAgICAgY2FzZSBDT05TVEFOVF9DbGFzczogewotICAgICAgICB1MiBuYW1lX2luZGV4ID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKG5ldyBDb25zdGFudF9DbGFzcyhuYW1lX2luZGV4KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9GaWVsZFJlZjoKLSAgICAgIGNhc2UgQ09OU1RBTlRfTWV0aG9kcmVmOgotICAgICAgY2FzZSBDT05TVEFOVF9JbnRlcmZhY2VtZXRob2RyZWY6IHsKLSAgICAgICAgdTIgY2xhc3NfaW5kZXggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgdTIgbnRpID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKG5ldyBDb25zdGFudF9GTUlyZWYodGFnLCBjbGFzc19pbmRleCwgbnRpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9TdHJpbmc6IHsKLSAgICAgICAgdTIgc3RyaW5nX2luZGV4ID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKG5ldyBDb25zdGFudF9TdHJpbmcoc3RyaW5nX2luZGV4KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9OYW1lQW5kVHlwZTogewotICAgICAgICB1MiBuYW1lX2luZGV4ID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIHUyIGRlc2NyaXB0b3JfaW5kZXggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgY29uc3RfcG9vbF9pbi5wdXNoX2JhY2soCi0gICAgICAgICAgICBuZXcgQ29uc3RhbnRfTmFtZUFuZFR5cGUobmFtZV9pbmRleCwgZGVzY3JpcHRvcl9pbmRleCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ09OU1RBTlRfVXRmODogewotICAgICAgICB1MiBsZW5ndGggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgaWYgKGRldnRvb2xzX2lqYXI6OnZlcmJvc2UpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlV0Zjg6IFwiJXNcIiAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKSBwLCBsZW5ndGgpLmNfc3RyKCksIGxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdF9wb29sX2luLnB1c2hfYmFjayhuZXcgQ29uc3RhbnRfVXRmOChsZW5ndGgsIHApKTsKLSAgICAgICAgcCArPSBsZW5ndGg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9JbnRlZ2VyOgotICAgICAgY2FzZSBDT05TVEFOVF9GbG9hdDogewotICAgICAgICB1NCBieXRlcyA9IGdldF91NGJlKHApOwotICAgICAgICBjb25zdF9wb29sX2luLnB1c2hfYmFjayhuZXcgQ29uc3RhbnRfSW50ZWdlck9yRmxvYXQodGFnLCBieXRlcykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ09OU1RBTlRfTG9uZzoKLSAgICAgIGNhc2UgQ09OU1RBTlRfRG91YmxlOiB7Ci0gICAgICAgIHU0IGhpZ2hfYnl0ZXMgPSBnZXRfdTRiZShwKTsKLSAgICAgICAgdTQgbG93X2J5dGVzID0gZ2V0X3U0YmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKAotICAgICAgICAgICAgbmV3IENvbnN0YW50X0xvbmdPckRvdWJsZSh0YWcsIGhpZ2hfYnl0ZXMsIGxvd19ieXRlcykpOwotICAgICAgICAvLyBMb25ncyBhbmQgZG91YmxlcyBvY2N1cHkgdHdvIGNvbnN0YW50IHBvb2wgc2xvdHMuCi0gICAgICAgIC8vICgiSW4gcmV0cm9zcGVjdCwgbWFraW5nIDgtYnl0ZSBjb25zdGFudHMgdGFrZSB0d28gImNvbnN0YW50Ci0gICAgICAgIC8vIHBvb2wgZW50cmllcyB3YXMgYSBwb29yIGNob2ljZS4iIC0tSlZNIFNwZWMuKQotICAgICAgICBjb25zdF9wb29sX2luLnB1c2hfYmFjayhOVUxMKTsKLSAgICAgICAgaWkrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENPTlNUQU5UX01ldGhvZEhhbmRsZTogewotICAgICAgICB1MSByZWZlcmVuY2Vfa2luZCA9IGdldF91MShwKTsKLSAgICAgICAgdTIgcmVmZXJlbmNlX2luZGV4ID0gZ2V0X3UyYmUocCk7Ci0gICAgICAgIGNvbnN0X3Bvb2xfaW4ucHVzaF9iYWNrKAotICAgICAgICAgICAgbmV3IENvbnN0YW50X01ldGhvZEhhbmRsZShyZWZlcmVuY2Vfa2luZCwgcmVmZXJlbmNlX2luZGV4KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDT05TVEFOVF9NZXRob2RUeXBlOiB7Ci0gICAgICAgIHUyIGRlc2NyaXB0b3JfaW5kZXggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgY29uc3RfcG9vbF9pbi5wdXNoX2JhY2sobmV3IENvbnN0YW50X01ldGhvZFR5cGUoZGVzY3JpcHRvcl9pbmRleCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ09OU1RBTlRfSW52b2tlRHluYW1pYzogewotICAgICAgICB1MiBib290c3RyYXBfbWV0aG9kX2F0dHIgPSBnZXRfdTJiZShwKTsKLSAgICAgICAgdTIgbmFtZV9uYW1lX3R5cGVfaW5kZXggPSBnZXRfdTJiZShwKTsKLSAgICAgICAgY29uc3RfcG9vbF9pbi5wdXNoX2JhY2sobmV3IENvbnN0YW50X0ludm9rZUR5bmFtaWMoCi0gICAgICAgICAgICBib290c3RyYXBfbWV0aG9kX2F0dHIsIG5hbWVfbmFtZV90eXBlX2luZGV4KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDogewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gY29uc3RhbnQ6ICUwMnguIFBhc3NpbmcgY2xhc3MgdGhyb3VnaC5cbiIsCi0gICAgICAgICAgICAgICAgdGFnKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBBbm9ueW1vdXMgaW5uZXIgY2xhc3NlcyBhcmUgc3RyaXBwZWQgdG8gb3BhcXVlIGNsYXNzZXMgdGhhdCBvbmx5IGV4dGVuZAotLy8gT2JqZWN0LiBOb25lIG9mIHRoZWlyIG1ldGhvZHMgb3IgZmllbGRzIGFyZSBhY2Nlc3NpYmxlIGFueXdheS4KLXZvaWQgQ2xhc3NGaWxlOjpTdHJpcElmQW5vbnltb3VzKCkgewotICBpbnQgZW5jbG9zaW5nX2luZGV4ID0gLTE7Ci0gIGludCBpbm5lcl9jbGFzc2VzX2luZGV4ID0gLTE7Ci0KLSAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyArK2lpKSB7Ci0gICAgaWYgKGF0dHJpYnV0ZXNbaWldLT5hdHRyaWJ1dGVfbmFtZV8tPkRpc3BsYXkoKSA9PSAiRW5jbG9zaW5nTWV0aG9kIikgewotICAgICAgZW5jbG9zaW5nX2luZGV4ID0gaWk7Ci0gICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzW2lpXS0+YXR0cmlidXRlX25hbWVfLT5EaXNwbGF5KCkgPT0gIklubmVyQ2xhc3NlcyIpIHsKLSAgICAgIGlubmVyX2NsYXNzZXNfaW5kZXggPSBpaTsKLSAgICB9Ci0gIH0KLQotICAvLyBQcmVzZW5jZSBvZiBhbiBFbmNsb3NpbmdNZXRob2QgYXR0cmlidXRlIGluZGljYXRlcyBhIGxvY2FsIG9yIGFub255bW91cwotICAvLyBjbGFzcywgd2hpY2ggY2FuIGJlIHN0cmlwcGVkLgotICBpZiAoZW5jbG9zaW5nX2luZGV4ID4gLTEpIHsKLSAgICAvLyBDbGVhciB0aGUgc2lnbmF0dXJlIHRvIG9ubHkgZXh0ZW5kIGphdmEubGFuZy5PYmplY3QuCi0gICAgc3VwZXJfY2xhc3MgPSBOVUxMOwotICAgIGludGVyZmFjZXMuY2xlYXIoKTsKLQotICAgIC8vIENsZWFyIGF3YXkgYWxsIGZpZWxkcyAoaW1wbGVtZW50YXRpb24gZGV0YWlscykuCi0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGZpZWxkcy5zaXplKCk7ICsraWkpIHsKLSAgICAgIGRlbGV0ZSBmaWVsZHNbaWldOwotICAgIH0KLSAgICBmaWVsZHMuY2xlYXIoKTsKLQotICAgIC8vIENsZWFyIGF3YXkgYWxsIG1ldGhvZHMgKGltcGxlbWVudGF0aW9uIGRldGFpbHMpLgotICAgIGZvciAoc2l6ZV90IGlpID0gMDsgaWkgPCBtZXRob2RzLnNpemUoKTsgKytpaSkgewotICAgICAgZGVsZXRlIG1ldGhvZHNbaWldOwotICAgIH0KLSAgICBtZXRob2RzLmNsZWFyKCk7Ci0KLSAgICAvLyBPbmx5IHByZXNlcnZlIHRoZSBJbm5lckNsYXNzZXMgYXR0cmlidXRlIHRvIGNvbXBseSB3aXRoIHRoZSBzcGVjLgotICAgIEF0dHJpYnV0ZSAqYXR0ciA9IE5VTEw7Ci0gICAgZm9yIChzaXplX3QgaWkgPSAwOyBpaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyArK2lpKSB7Ci0gICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihpaSkgIT0gaW5uZXJfY2xhc3Nlc19pbmRleCkgewotICAgICAgICBkZWxldGUgYXR0cmlidXRlc1tpaV07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhdHRyID0gYXR0cmlidXRlc1tpaV07Ci0gICAgICB9Ci0gICAgfQotICAgIGF0dHJpYnV0ZXMuY2xlYXIoKTsKLSAgICBpZiAoYXR0ciAhPSBOVUxMKSB7Ci0gICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhhdHRyKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIENsYXNzRmlsZSAqUmVhZENsYXNzKGNvbnN0IHZvaWQgKmNsYXNzZGF0YSwgc2l6ZV90IGxlbmd0aCkgewotICBjb25zdCB1MSAqcCA9ICh1MSopIGNsYXNzZGF0YTsKLQotICBDbGFzc0ZpbGUgKmNsYXp6ID0gbmV3IENsYXNzRmlsZTsKLQotICBjbGF6ei0+bGVuZ3RoID0gbGVuZ3RoOwotCi0gIGNsYXp6LT5tYWdpYyA9IGdldF91NGJlKHApOwotICBpZiAoY2xhenotPm1hZ2ljICE9IDB4Q0FGRUJBQkUpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBtYWdpYyAlIiBQUkl4MzIgIlxuIiwgY2xhenotPm1hZ2ljKTsKLSAgICBhYm9ydCgpOwotICB9Ci0gIGNsYXp6LT5tYWpvciA9IGdldF91MmJlKHApOwotICBjbGF6ei0+bWlub3IgPSBnZXRfdTJiZShwKTsKLQotICBpZiAoIWNsYXp6LT5SZWFkQ29uc3RhbnRQb29sKHApKSB7Ci0gICAgZGVsZXRlIGNsYXp6OwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY2xhenotPmFjY2Vzc19mbGFncyA9IGdldF91MmJlKHApOwotICBjbGF6ei0+dGhpc19jbGFzcyA9IGNvbnN0YW50KGdldF91MmJlKHApKTsKLSAgY2xhc3NfbmFtZSA9IGNsYXp6LT50aGlzX2NsYXNzOwotCi0gIHUyIHN1cGVyX2NsYXNzX2lkID0gZ2V0X3UyYmUocCk7Ci0gIGNsYXp6LT5zdXBlcl9jbGFzcyA9IHN1cGVyX2NsYXNzX2lkID09IDAgPyBOVUxMIDogY29uc3RhbnQoc3VwZXJfY2xhc3NfaWQpOwotCi0gIHUyIGludGVyZmFjZXNfY291bnQgPSBnZXRfdTJiZShwKTsKLSAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGludGVyZmFjZXNfY291bnQ7ICsraWkpIHsKLSAgICBjbGF6ei0+aW50ZXJmYWNlcy5wdXNoX2JhY2soY29uc3RhbnQoZ2V0X3UyYmUocCkpKTsKLSAgfQotCi0gIHUyIGZpZWxkc19jb3VudCA9IGdldF91MmJlKHApOwotICBmb3IgKGludCBpaSA9IDA7IGlpIDwgZmllbGRzX2NvdW50OyArK2lpKSB7Ci0gICAgTWVtYmVyICpmaWVsZCA9IE1lbWJlcjo6UmVhZChwKTsKLQotICAgIGlmICghKGZpZWxkLT5hY2Nlc3NfZmxhZ3MgJiBBQ0NfUFJJVkFURSkpIHsgLy8gZHJvcCBwcml2YXRlIGZpZWxkcwotICAgICAgY2xhenotPmZpZWxkcy5wdXNoX2JhY2soZmllbGQpOwotICAgIH0KLSAgfQotCi0gIHUyIG1ldGhvZHNfY291bnQgPSBnZXRfdTJiZShwKTsKLSAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG1ldGhvZHNfY291bnQ7ICsraWkpIHsKLSAgICBNZW1iZXIgKm1ldGhvZCA9IE1lbWJlcjo6UmVhZChwKTsKLQotICAgIC8vIGRyb3AgY2xhc3MgaW5pdGlhbGl6ZXJzCi0gICAgaWYgKG1ldGhvZC0+bmFtZS0+RGlzcGxheSgpID09ICI8Y2xpbml0PiIpIGNvbnRpbnVlOwotCi0gICAgaWYgKCEobWV0aG9kLT5hY2Nlc3NfZmxhZ3MgJiBBQ0NfUFJJVkFURSkpIHsgLy8gZHJvcCBwcml2YXRlIG1ldGhvZHMKLSAgICAgIGNsYXp6LT5tZXRob2RzLnB1c2hfYmFjayhtZXRob2QpOwotICAgIH0KLSAgfQotCi0gIGNsYXp6LT5SZWFkQXR0cnMocCk7Ci0gIGNsYXp6LT5TdHJpcElmQW5vbnltb3VzKCk7Ci0KLSAgcmV0dXJuIGNsYXp6OwotfQotCi0vLyBJbiB0aGVvcnksICcvJyBpcyBhbHNvIHJlc2VydmVkLCBidXQgaXQncyBva2F5IGlmIHdlIGp1c3QgcGFyc2UgcGFja2FnZQotLy8gaWRlbnRpZmllcnMgYXMgcGFydCBvZiB0aGUgY2xhc3MgbmFtZS4gTm90ZSB0aGF0IHNpZ25hdHVyZXMgYXJlIFVURi04LCBidXQKLS8vIHRoaXMgd29ya3MganVzdCBhcyB3ZWxsIGFzIGluIHBsYWluIEFTQ0lJLgotc3RhdGljIGNvbnN0IGNoYXIgKlNJR05BVFVSRV9OT05fSURFTlRJRklFUl9DSEFSUyA9ICIuO1s8PjoiOwotCi12b2lkIEV4cGVjdChjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwLCBjaGFyIGV4cGVjdGVkKSB7Ci0gIGlmIChkZXNjWypwXSAhPSBleHBlY3RlZCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiRXhwZWN0ZWQgJyVjJyBpbiAnJXMnIGF0ICV6ZCBpbiBzaWduYXR1cmVcbiIsCi0gICAgICAgICAgICBleHBlY3RlZCwgZGVzYy5zdWJzdHIoKnApLmNfc3RyKCksICpwKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgKnAgKz0gMTsKLX0KLQotLy8gVGhlc2UgZnVuY3Rpb25zIGZvcm0gYSBjcnVkZSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgZm9yIGRlc2NyaXB0b3JzIGFuZAotLy8gc2lnbmF0dXJlcyBpbiBjbGFzcyBmaWxlcyAoc2VlIEpWTSBzcGVjIDQuMykuCi0vLwotLy8gVGhpcyBwYXJzZXIgaXMgYSBiaXQgbW9yZSBsaWJlcmFsIHRoYW4gdGhlIHNwZWMsIGJ1dCB0aGlzIHNob3VsZCBiZSBmaW5lLAotLy8gYmVjYXVzZSBpdCBhY2NlcHRzIGFsbCB2YWxpZCBjbGFzcyBmaWxlcyBhbmQgY3JvYWtzIG9ubHkgb24gaW52YWxpZCBvbmVzLgotdm9pZCBQYXJzZUZyb21DbGFzc1R5cGVTaWduYXR1cmUoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCk7Ci12b2lkIFBhcnNlU2ltcGxlQ2xhc3NUeXBlU2lnbmF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjLCBzaXplX3QqIHApOwotdm9pZCBQYXJzZUNsYXNzVHlwZVNpZ25hdHVyZVN1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKTsKLXZvaWQgUGFyc2VJZGVudGlmaWVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjLCBzaXplX3QqIHApOwotdm9pZCBQYXJzZVR5cGVBcmd1bWVudHNPcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCk7Ci12b2lkIFBhcnNlTWV0aG9kRGVzY3JpcHRvcihjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKTsKLQotdm9pZCBQYXJzZUNsYXNzVHlwZVNpZ25hdHVyZShjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKSB7Ci0gIEV4cGVjdChkZXNjLCBwLCAnTCcpOwotICBQYXJzZVNpbXBsZUNsYXNzVHlwZVNpZ25hdHVyZShkZXNjLCBwKTsKLSAgUGFyc2VDbGFzc1R5cGVTaWduYXR1cmVTdWZmaXgoZGVzYywgcCk7Ci0gIEV4cGVjdChkZXNjLCBwLCAnOycpOwotfQotCi12b2lkIFBhcnNlU2ltcGxlQ2xhc3NUeXBlU2lnbmF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjLCBzaXplX3QqIHApIHsKLSAgUGFyc2VJZGVudGlmaWVyKGRlc2MsIHApOwotICBQYXJzZVR5cGVBcmd1bWVudHNPcHQoZGVzYywgcCk7Ci19Ci0KLXZvaWQgUGFyc2VDbGFzc1R5cGVTaWduYXR1cmVTdWZmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCkgewotICB3aGlsZSAoZGVzY1sqcF0gPT0gJy4nKSB7Ci0gICAgKnAgKz0gMTsKLSAgICBQYXJzZVNpbXBsZUNsYXNzVHlwZVNpZ25hdHVyZShkZXNjLCBwKTsKLSAgfQotfQotCi12b2lkIFBhcnNlSWRlbnRpZmllcihjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKSB7Ci0gIHNpemVfdCBuZXh0ID0gZGVzYy5maW5kX2ZpcnN0X29mKFNJR05BVFVSRV9OT05fSURFTlRJRklFUl9DSEFSUywgKnApOwotICBzdGQ6OnN0cmluZyBpZCA9IGRlc2Muc3Vic3RyKCpwLCBuZXh0IC0gKnApOwotICB1c2VkX2NsYXNzX25hbWVzLmluc2VydChpZCk7Ci0gICpwID0gbmV4dDsKLX0KLQotdm9pZCBQYXJzZVR5cGVBcmd1bWVudHNPcHQoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCkgewotICBpZiAoZGVzY1sqcF0gIT0gJzwnKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgKnAgKz0gMTsKLSAgd2hpbGUgKGRlc2NbKnBdICE9ICc+JykgewotICAgIHN3aXRjaCAoZGVzY1sqcF0pIHsKLSAgICAgIGNhc2UgJyonOgotICAgICAgICAqcCArPSAxOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAnKyc6Ci0gICAgICBjYXNlICctJzoKLSAgICAgICAgKnAgKz0gMTsKLSAgICAgICAgRXh0cmFjdENsYXNzTmFtZXMoZGVzYywgcCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBFeHRyYWN0Q2xhc3NOYW1lcyhkZXNjLCBwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgKnAgKz0gMTsKLX0KLQotdm9pZCBQYXJzZU1ldGhvZERlc2NyaXB0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCkgewotICBFeHBlY3QoZGVzYywgcCwgJygnKTsKLSAgd2hpbGUgKGRlc2NbKnBdICE9ICcpJykgewotICAgIEV4dHJhY3RDbGFzc05hbWVzKGRlc2MsIHApOwotICB9Ci0KLSAgRXhwZWN0KGRlc2MsIHAsICcpJyk7Ci0gIEV4dHJhY3RDbGFzc05hbWVzKGRlc2MsIHApOwotfQotCi12b2lkIFBhcnNlRm9ybWFsVHlwZVBhcmFtZXRlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2MsIHNpemVfdCogcCkgewotICBFeHBlY3QoZGVzYywgcCwgJzwnKTsKLSAgd2hpbGUgKGRlc2NbKnBdICE9ICc+JykgewotICAgIFBhcnNlSWRlbnRpZmllcihkZXNjLCBwKTsKLSAgICBFeHBlY3QoZGVzYywgcCwgJzonKTsKLSAgICBpZiAoZGVzY1sqcF0gIT0gJzonICYmIGRlc2NbKnBdICE9ICc+JykgewotICAgICAgRXh0cmFjdENsYXNzTmFtZXMoZGVzYywgcCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKGRlc2NbKnBdID09ICc6JykgewotICAgICAgRXhwZWN0KGRlc2MsIHAsICc6Jyk7Ci0gICAgICBFeHRyYWN0Q2xhc3NOYW1lcyhkZXNjLCBwKTsKLSAgICB9Ci0gIH0KLQotICBFeHBlY3QoZGVzYywgcCwgJz4nKTsKLX0KLQotdm9pZCBFeHRyYWN0Q2xhc3NOYW1lcyhjb25zdCBzdGQ6OnN0cmluZyYgZGVzYywgc2l6ZV90KiBwKSB7Ci0gIHN3aXRjaCAoZGVzY1sqcF0pIHsKLSAgICBjYXNlICc8JzoKLSAgICAgIFBhcnNlRm9ybWFsVHlwZVBhcmFtZXRlcnMoZGVzYywgcCk7Ci0gICAgICBFeHRyYWN0Q2xhc3NOYW1lcyhkZXNjLCBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTCc6Ci0gICAgICBQYXJzZUNsYXNzVHlwZVNpZ25hdHVyZShkZXNjLCBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnWyc6Ci0gICAgICAqcCArPSAxOwotICAgICAgRXh0cmFjdENsYXNzTmFtZXMoZGVzYywgcCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgKnAgKz0gMTsKLSAgICAgIFBhcnNlSWRlbnRpZmllcihkZXNjLCBwKTsKLSAgICAgIEV4cGVjdChkZXNjLCBwLCAnOycpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcoJzoKLSAgICAgIFBhcnNlTWV0aG9kRGVzY3JpcHRvcihkZXNjLCBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgY2FzZSAnQyc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAnSSc6Ci0gICAgY2FzZSAnSic6Ci0gICAgY2FzZSAnUyc6Ci0gICAgY2FzZSAnWic6Ci0gICAgY2FzZSAnVic6Ci0gICAgICAqcCArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHNpZ25hdHVyZSAlc1xuIiwgZGVzYy5zdWJzdHIoKnApLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgQ2xhc3NGaWxlOjpXcml0ZUNsYXNzKHUxIComcCkgewotICB1c2VkX2NsYXNzX25hbWVzLmNsZWFyKCk7Ci0gIHN0ZDo6dmVjdG9yPE1lbWJlciAqPiBtZW1iZXJzOwotICBtZW1iZXJzLmluc2VydChtZW1iZXJzLmVuZCgpLCBmaWVsZHMuYmVnaW4oKSwgZmllbGRzLmVuZCgpKTsKLSAgbWVtYmVycy5pbnNlcnQobWVtYmVycy5lbmQoKSwgbWV0aG9kcy5iZWdpbigpLCBtZXRob2RzLmVuZCgpKTsKLSAgRXh0cmFjdENsYXNzTmFtZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZW1iZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgTWVtYmVyICptZW1iZXIgPSBtZW1iZXJzW2ldOwotICAgIHNpemVfdCBpZHggPSAwOwotICAgIGRldnRvb2xzX2lqYXI6OkV4dHJhY3RDbGFzc05hbWVzKG1lbWJlci0+ZGVzY3JpcHRvci0+RGlzcGxheSgpLCAmaWR4KTsKLSAgICBtZW1iZXItPkV4dHJhY3RDbGFzc05hbWVzKCk7Ci0gIH0KLQotICAvLyBXZSBoYXZlIHRvIHdyaXRlIHRoZSBib2R5IG91dCBiZWZvcmUgdGhlIGhlYWRlciBpbiBvcmRlciB0byByZWZlcmVuY2UKLSAgLy8gdGhlIGVzc2VudGlhbCBjb25zdGFudHMgYW5kIHBvcHVsYXRlIHRoZSBvdXRwdXQgY29uc3RhbnQgcG9vbDoKLSAgdTEgKmJvZHkgPSBuZXcgdTFbbGVuZ3RoXTsKLSAgdTEgKnEgPSBib2R5OwotICBXcml0ZUJvZHkocSk7IC8vIGFkdmFuY2VzIHEKLSAgdTQgYm9keV9sZW5ndGggPSBxIC0gYm9keTsKLQotICBXcml0ZUhlYWRlcihwKTsgLy8gYWR2YW5jZXMgcAotICBwdXRfbihwLCBib2R5LCBib2R5X2xlbmd0aCk7Ci0gIGRlbGV0ZVtdIGJvZHk7Ci19Ci0KLQotdm9pZCBTdHJpcENsYXNzKHUxIComY2xhc3NkYXRhX291dCwgY29uc3QgdTEgKmNsYXNzZGF0YV9pbiwgc2l6ZV90IGluX2xlbmd0aCkgewotICBDbGFzc0ZpbGUgKmNsYXp6ID0gUmVhZENsYXNzKGNsYXNzZGF0YV9pbiwgaW5fbGVuZ3RoKTsKLSAgaWYgKGNsYXp6ID09IE5VTEwpIHsKLSAgICAvLyBDbGFzcyBpcyBpbnZhbGlkLiBTaW1wbHkgY29weSBpdCB0byB0aGUgb3V0cHV0IGFuZCBjYWxsIGl0IGEgZGF5LgotICAgIHB1dF9uKGNsYXNzZGF0YV9vdXQsIGNsYXNzZGF0YV9pbiwgaW5fbGVuZ3RoKTsKLSAgfSBlbHNlIHsKLQotICAgIC8vIENvbnN0YW50IHBvb2wgaXRlbSB6ZXJvIGlzIGEgZHVtbXkgZW50cnkuICBTZXR0aW5nIGl0IG1hcmtzIHRoZQotICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBoYXNlOyBjYWxscyB0byBDb25zdGFudDo6c2xvdCgpIHdpbGwKLSAgICAvLyBmYWlsIGlmIGNhbGxlZCBwcmlvciB0byB0aGlzLgotICAgIGNvbnN0X3Bvb2xfb3V0LnB1c2hfYmFjayhOVUxMKTsKLSAgICBjbGF6ei0+V3JpdGVDbGFzcyhjbGFzc2RhdGFfb3V0KTsKLQotICAgIGRlbGV0ZSBjbGF6ejsKLSAgfQotCi0gIC8vIE5vdyBjbGVhbiB1cCBhbGwgdGhlIG1lc3Mgd2UgbGVmdCBiZWhpbmQuCi0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25zdF9wb29sX2luLnNpemUoKTsgaSsrKSB7Ci0gICAgZGVsZXRlIGNvbnN0X3Bvb2xfaW5baV07Ci0gIH0KLQotICBjb25zdF9wb29sX2luLmNsZWFyKCk7Ci0gIGNvbnN0X3Bvb2xfb3V0LmNsZWFyKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXZ0b29sc19pamFyCmRpZmYgLS1naXQgYS90b29scy9pamFyL2NvbW1vbi5oIGIvdG9vbHMvaWphci9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MDQxYi4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDAxLDIwMDcgQWxhbiBEb25vdmFuLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIEF1dGhvcjogQWxhbiBEb25vdmFuIDxhZG9ub3ZhbkBnb29nbGUuY29tPgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotLy8gY29tbW9uLmggLS0gY29tbW9uIGRlZmluaXRpb25zLgotLy8KLQotI2lmbmRlZiBJTkNMVURFRF9ERVZUT09MU19JSkFSX0NPTU1PTl9ICi0jZGVmaW5lIElOQ0xVREVEX0RFVlRPT0xTX0lKQVJfQ09NTU9OX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU4OwotdHlwZWRlZiB1aW50MzJfdCB1NDsKLXR5cGVkZWYgdWludDE2X3QgdTI7Ci10eXBlZGVmIHVpbnQ4X3QgIHUxOwotCi0vLyBiZSA9IGJpZyBlbmRpYW4sIGxlID0gbGl0dGxlIGVuZGlhbgotCi1pbmxpbmUgdTEgZ2V0X3UxKGNvbnN0IHUxIComcCkgewotICAgIHJldHVybiAqcCsrOwotfQotCi1pbmxpbmUgdTIgZ2V0X3UyYmUoY29uc3QgdTEgKiZwKSB7Ci0gICAgdTQgeCA9IChwWzBdIDw8IDgpIHwgcFsxXTsKLSAgICBwICs9IDI7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLWlubGluZSB1MiBnZXRfdTJsZShjb25zdCB1MSAqJnApIHsKLSAgICB1NCB4ID0gKHBbMV0gPDwgOCkgfCBwWzBdOwotICAgIHAgKz0gMjsKLSAgICByZXR1cm4geDsKLX0KLQotaW5saW5lIHU0IGdldF91NGJlKGNvbnN0IHUxIComcCkgewotICAgIHU0IHggPSAocFswXSA8PCAyNCkgfCAocFsxXSA8PCAxNikgfCAocFsyXSA8PCA4KSB8IHBbM107Ci0gICAgcCArPSA0OwotICAgIHJldHVybiB4OwotfQotCi1pbmxpbmUgdTQgZ2V0X3U0bGUoY29uc3QgdTEgKiZwKSB7Ci0gICAgdTQgeCA9IChwWzNdIDw8IDI0KSB8IChwWzJdIDw8IDE2KSB8IChwWzFdIDw8IDgpIHwgcFswXTsKLSAgICBwICs9IDQ7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLWlubGluZSB2b2lkIHB1dF91MSh1MSAqJnAsIHUxIHgpIHsKLSAgICAqcCsrID0geDsKLX0KLQotaW5saW5lIHZvaWQgcHV0X3UyYmUodTEgKiZwLCB1MiB4KSB7Ci0gICAgKnArKyA9IHggPj4gODsKLSAgICAqcCsrID0geCAmIDB4ZmY7Ci19Ci0KLWlubGluZSB2b2lkIHB1dF91MmxlKHUxIComcCwgdTIgeCkgewotICAgICpwKysgPSB4ICYgMHhmZjsKLSAgICAqcCsrID0geCA+PiA4OzsKLX0KLQotaW5saW5lIHZvaWQgcHV0X3U0YmUodTEgKiZwLCB1NCB4KSB7Ci0gICAgKnArKyA9IHggPj4gMjQ7Ci0gICAgKnArKyA9ICh4ID4+IDE2KSAmIDB4ZmY7Ci0gICAgKnArKyA9ICh4ID4+IDgpICYgMHhmZjsKLSAgICAqcCsrID0geCAmIDB4ZmY7Ci19Ci0KLWlubGluZSB2b2lkIHB1dF91NGxlKHUxIComcCwgdTQgeCkgewotICAgICpwKysgPSB4ICYgMHhmZjsKLSAgICAqcCsrID0gKHggPj4gOCkgJiAweGZmOwotICAgICpwKysgPSAoeCA+PiAxNikgJiAweGZmOwotICAgICpwKysgPSB4ID4+IDI0OwotfQotCi0vLyBDb3B5IG4gYnl0ZXMgZnJvbSBzcmMgdG8gcCwgYW5kIGFkdmFuY2UgcC4KLWlubGluZSB2b2lkIHB1dF9uKHUxIComcCwgY29uc3QgdTEgKnNyYywgc2l6ZV90IG4pIHsKLSAgbWVtY3B5KHAsIHNyYywgbik7Ci0gIHAgKz0gbjsKLX0KLQotZXh0ZXJuIGJvb2wgdmVyYm9zZTsKLQotfSAgLy8gbmFtZXNwYWNlIGRldnRvb2xzX2lqYXIKLQotI2VuZGlmIC8vIElOQ0xVREVEX0RFVlRPT0xTX0lKQVJfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL3Rvb2xzL2lqYXIvaWphci5jYyBiL3Rvb2xzL2lqYXIvaWphci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyNWI0OC4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL2lqYXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDEsMjAwNyBBbGFuIERvbm92YW4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gQXV0aG9yOiBBbGFuIERvbm92YW4gPGFkb25vdmFuQGdvb2dsZS5jb20+Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0vLyBpamFyLmNwcCAtLSAuamFyIC0+IF9pbnRlcmZhY2UuamFyIHRvb2wuCi0vLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInppcC5oIgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLWJvb2wgdmVyYm9zZSA9IGZhbHNlOwotCi0vLyBSZWFkcyBhIEpWTSBjbGFzcyBmcm9tIGNsYXNzZGF0YV9pbiAob2YgdGhlIHNwZWNpZmllZCBsZW5ndGgpLCBhbmQKLS8vIHdyaXRlcyBvdXQgYSBzaW1wbGlmaWVkIGNsYXNzIHRvIGNsYXNzZGF0YV9vdXQsIGFkdmFuY2luZyB0aGUKLS8vIHBvaW50ZXIuCi12b2lkIFN0cmlwQ2xhc3ModTEgKiZjbGFzc2RhdGFfb3V0LCBjb25zdCB1MSAqY2xhc3NkYXRhX2luLCBzaXplX3QgaW5fbGVuZ3RoKTsKLQotY29uc3QgY2hhciogQ0xBU1NfRVhURU5TSU9OID0gIi5jbGFzcyI7Ci1jb25zdCBzaXplX3QgQ0xBU1NfRVhURU5TSU9OX0xFTkdUSCA9IHN0cmxlbihDTEFTU19FWFRFTlNJT04pOwotCi0vLyBaaXBFeHRyYWN0b3JQcm9jZXNzb3IgdGhhdCBzZWxlY3Qgb25seSAuY2xhc3MgZmlsZSBhbmQgdXNlCi0vLyBTdHJpcENsYXNzIHRvIGdlbmVyYXRlIGFuIGludGVyZmFjZSBjbGFzcywgc3RvcmluZyBhcyBhIG5ldyBmaWxlCi0vLyBpbiB0aGUgc3BlY2lmaWVkIFppcEJ1aWxkZXIuCi1jbGFzcyBKYXJTdHJpcHBlclByb2Nlc3NvciA6IHB1YmxpYyBaaXBFeHRyYWN0b3JQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgSmFyU3RyaXBwZXJQcm9jZXNzb3IoKSB7fQotICB2aXJ0dWFsIH5KYXJTdHJpcHBlclByb2Nlc3NvcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUxKiBkYXRhLCBjb25zdCBzaXplX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgYm9vbCBBY2NlcHQoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIpOwotCi0gcHJpdmF0ZToKLSAgLy8gTm90IG93bmVkIGJ5IEphclN0cmlwcGVyUHJvY2Vzc29yLCBzZWUgU2V0WmlwQnVpbGRlcigpLgotICBaaXBCdWlsZGVyKiBidWlsZGVyOwotCi0gcHVibGljOgotICAvLyBTZXQgdGhlIFppcEJ1aWxkZXIgdG8gYWRkIHRoZSBpamFyIGNsYXNzIHRvIHRoZSBvdXRwdXQgemlwIGZpbGUuCi0gIC8vIFRoaXMgcG9pbnRlciBzaG91bGQgbm90IGJlIGRlbGV0ZWQgd2hpbGUgdGhpcyBjbGFzcyBpcyBzdGlsbCBpbiB1c2UgYW5kCi0gIC8vIGl0IHNob3VsZCBiZSBzZXQgYmVmb3JlIGFueSBjYWxsIHRvIHRoZSBQcm9jZXNzKCkgbWV0aG9kLgotICB2b2lkIFNldFppcEJ1aWxkZXIoWmlwQnVpbGRlciogYnVpbGRlcikgewotICAgIHRoaXMtPmJ1aWxkZXIgPSBidWlsZGVyOwotICB9Ci19OwotCi1ib29sIEphclN0cmlwcGVyUHJvY2Vzc29yOjpBY2NlcHQoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0KSB7Ci0gIHNzaXplX3Qgb2Zmc2V0ID0gc3RybGVuKGZpbGVuYW1lKSAtIENMQVNTX0VYVEVOU0lPTl9MRU5HVEg7Ci0gIGlmIChvZmZzZXQgPj0gMCkgewotICAgIHJldHVybiBzdHJjbXAoZmlsZW5hbWUgKyBvZmZzZXQsIENMQVNTX0VYVEVOU0lPTikgPT0gMDsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgSmFyU3RyaXBwZXJQcm9jZXNzb3I6OlByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1MSogZGF0YSwgY29uc3Qgc2l6ZV90IHNpemUpIHsKLSAgaWYgKHZlcmJvc2UpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIklORk86IFN0cmlwQ2xhc3M6ICVzXG4iLCBmaWxlbmFtZSk7Ci0gIH0KLSAgdTEgKnEgPSBidWlsZGVyLT5OZXdGaWxlKGZpbGVuYW1lLCAwKTsKLSAgdTEgKmNsYXNzZGF0YV9vdXQgPSBxOwotICBTdHJpcENsYXNzKHEsIGRhdGEsIHNpemUpOyAgLy8gYWN0dWFsbHkgcHJvY2VzcyBpdAotICBzaXplX3Qgb3V0X2xlbmd0aCA9IHEgLSBjbGFzc2RhdGFfb3V0OwotICBidWlsZGVyLT5GaW5pc2hGaWxlKG91dF9sZW5ndGgpOwotfQotCi0vLyBPcGVucyAiZmlsZV9pbiIgKGEgLmphciBmaWxlKSBmb3IgcmVhZGluZywgYW5kIHdyaXRlcyBhbiBpbnRlcmZhY2UKLS8vIC5qYXIgdG8gImZpbGVfb3V0Ii4KLXZvaWQgT3BlbkZpbGVzQW5kUHJvY2Vzc0phcihjb25zdCBjaGFyICpmaWxlX291dCwgY29uc3QgY2hhciAqZmlsZV9pbikgewotICBKYXJTdHJpcHBlclByb2Nlc3NvciBwcm9jZXNzb3I7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxaaXBFeHRyYWN0b3I+IGluKFppcEV4dHJhY3Rvcjo6Q3JlYXRlKGZpbGVfaW4sICZwcm9jZXNzb3IpKTsKLSAgaWYgKGluLmdldCgpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIFppcCBmaWxlICVzOiAlc1xuIiwgZmlsZV9pbiwKLSAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgYWJvcnQoKTsKLSAgfQotICB1OCBvdXRwdXRfbGVuZ3RoID0gaW4tPkNhbGN1bGF0ZU91dHB1dExlbmd0aCgpOwotICBzdGQ6OnVuaXF1ZV9wdHI8WmlwQnVpbGRlcj4gb3V0KFppcEJ1aWxkZXI6OkNyZWF0ZShmaWxlX291dCwgb3V0cHV0X2xlbmd0aCkpOwotICBpZiAob3V0LmdldCgpID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlICVzOiAlc1xuIiwgZmlsZV9vdXQsCi0gICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgcHJvY2Vzc29yLlNldFppcEJ1aWxkZXIob3V0LmdldCgpKTsKLQotICAvLyBQcm9jZXNzIGFsbCBmaWxlcyBpbiB0aGUgemlwCi0gIGlmIChpbi0+UHJvY2Vzc0FsbCgpIDwgMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGluLT5HZXRFcnJvcigpKTsKLSAgICBhYm9ydCgpOwotICB9Ci0KLSAgLy8gQWRkIGR1bW15IGZpbGUsIHNpbmNlIGphdmFjIGRvZXNuJ3QgbGlrZSB0cnVseSBlbXB0eSBqYXJzLgotICBpZiAob3V0LT5HZXROdW1iZXJGaWxlcygpID09IDApIHsKLSAgICBvdXQtPldyaXRlRW1wdHlGaWxlKCJkdW1teSIpOwotICB9Ci0gIC8vIEZpbmlzaCB3cml0aW5nIHRoZSBvdXRwdXQgZmlsZQotICBpZiAob3V0LT5GaW5pc2goKSA8IDApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBvdXQtPkdldEVycm9yKCkpOwotICAgIGFib3J0KCk7Ci0gIH0KLSAgLy8gR2V0IGFsbCBmaWxlIHNpemUKLSAgc2l6ZV90IGluX2xlbmd0aCA9IGluLT5HZXRTaXplKCk7Ci0gIHNpemVfdCBvdXRfbGVuZ3RoID0gb3V0LT5HZXRTaXplKCk7Ci0gIGlmICh2ZXJib3NlKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJJTkZPOiBwcm9kdWNlZCBpbnRlcmZhY2UgamFyOiAlcyAtPiAlcyAoJWQlJSkuXG4iLAotICAgICAgICAgICAgZmlsZV9pbiwgZmlsZV9vdXQsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KDEwMC4wICogb3V0X2xlbmd0aCAvIGluX2xlbmd0aCkpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXZ0b29sc19pamFyCi0KLS8vCi0vLyBtYWluIG1ldGhvZAotLy8KLXN0YXRpYyB2b2lkIHVzYWdlKCkgewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBpamFyIFstdl0geC5qYXIgW3hfaW50ZXJmYWNlLmphcj5dXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJDcmVhdGVzIGFuIGludGVyZmFjZSBqYXIgZnJvbSB0aGUgc3BlY2lmaWVkIGphciBmaWxlLlxuIik7Ci0gIGV4aXQoMSk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBjb25zdCBjaGFyICpmaWxlbmFtZV9pbiA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lX291dCA9IE5VTEw7Ci0KLSAgZm9yIChpbnQgaWkgPSAxOyBpaSA8IGFyZ2M7ICsraWkpIHsKLSAgICBpZiAoc3RyY21wKGFyZ3ZbaWldLCAiLXYiKSA9PSAwKSB7Ci0gICAgICBkZXZ0b29sc19pamFyOjp2ZXJib3NlID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGZpbGVuYW1lX2luID09IE5VTEwpIHsKLSAgICAgIGZpbGVuYW1lX2luID0gYXJndltpaV07Ci0gICAgfSBlbHNlIGlmIChmaWxlbmFtZV9vdXQgPT0gTlVMTCkgewotICAgICAgZmlsZW5hbWVfb3V0ID0gYXJndltpaV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGZpbGVuYW1lX2luID09IE5VTEwpIHsKLSAgICB1c2FnZSgpOwotICB9Ci0KLSAgLy8gR3Vlc3Mgb3V0cHV0IGZpbGVuYW1lIGZyb20gaW5wdXQ6Ci0gIGNoYXIgZmlsZW5hbWVfb3V0X2J1ZltQQVRIX01BWF07Ci0gIGlmIChmaWxlbmFtZV9vdXQgPT0gTlVMTCkgewotICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oZmlsZW5hbWVfaW4pOwotICAgIGlmIChsZW4gPiA0ICYmIHN0cm5jbXAoZmlsZW5hbWVfaW4gKyBsZW4gLSA0LCAiLmphciIsIDQpID09IDApIHsKLSAgICAgIHN0cmNweShmaWxlbmFtZV9vdXRfYnVmLCBmaWxlbmFtZV9pbik7Ci0gICAgICBzdHJjcHkoZmlsZW5hbWVfb3V0X2J1ZiArIGxlbiAtIDQsICItaW50ZXJmYWNlLmphciIpOwotICAgICAgZmlsZW5hbWVfb3V0ID0gZmlsZW5hbWVfb3V0X2J1ZjsKLSAgICB9IGVsc2UgewotICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBkZXRlcm1pbmUgb3V0cHV0IGZpbGVuYW1lIHNpbmNlIGlucHV0IGZpbGVuYW1lICIKLSAgICAgICAgICAgICAgImRvZXNuJ3QgZW5kIHdpdGggJy5qYXInLlxuIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZGV2dG9vbHNfaWphcjo6dmVyYm9zZSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiSU5GTzogd3JpdGluZyB0byAnJXMnLlxuIiwgZmlsZW5hbWVfb3V0KTsKLSAgfQotCi0gIGRldnRvb2xzX2lqYXI6Ok9wZW5GaWxlc0FuZFByb2Nlc3NKYXIoZmlsZW5hbWVfb3V0LCBmaWxlbmFtZV9pbik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWphci96aXAuY2MgYi90b29scy9pamFyL3ppcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhMDZkYi4uMDAwMDAwMAotLS0gYS90b29scy9pamFyL3ppcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDcgQWxhbiBEb25vdmFuLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIEF1dGhvcjogQWxhbiBEb25vdmFuIDxhZG9ub3ZhbkBnb29nbGUuY29tPgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotLy8gemlwLmNjIC0tIC56aXAgKC5qYXIpIGZpbGUgcmVhZGluZy93cml0aW5nIHJvdXRpbmVzLgotLy8KLQotLy8gU2VlIFJFQURNRS50eHQgZm9yIGRldGFpbHMuCi0vLwotLy8gU2VlIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQKLS8vIGZvciBkZWZpbml0aW9uIG9mIFBLWklQIGZpbGUgZm9ybWF0LgotCi0jZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0ICAvLyBTdXBwb3J0IHppcCBmaWxlcyBsYXJnZXIgdGhhbiAyR0IKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInppcC5oIgotI2luY2x1ZGUgPHpsaWIuaD4KLQotI2RlZmluZSBMT0NBTF9GSUxFX0hFQURFUl9TSUdOQVRVUkUgICAgICAgICAgIDB4MDQwMzRiNTAKLSNkZWZpbmUgQ0VOVFJBTF9GSUxFX0hFQURFUl9TSUdOQVRVUkUgICAgICAgICAweDAyMDE0YjUwCi0jZGVmaW5lIEVORF9PRl9DRU5UUkFMX0RJUl9TSUdOQVRVUkUgICAgICAgICAgMHgwNjA1NGI1MAotI2RlZmluZSBEQVRBX0RFU0NSSVBUT1JfU0lHTkFUVVJFICAgICAgICAgICAgIDB4MDgwNzRiNTAKLQotLy8gdmVyc2lvbiB0byBleHRyYWN0OiAxLjAgLSBkZWZhdWx0IHZhbHVlIGZyb20gQVBQTk9URS5UWFQuCi0vLyBPdXRwdXQgSkFSIGZpbGVzIGNvbnRhaW4gbm8gZXh0cmEgWklQIGZlYXR1cmVzLCBzbyB0aGlzIGlzIGVub3VnaC4KLSNkZWZpbmUgWklQX1ZFUlNJT05fVE9fRVhUUkFDVCAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBDT01QUkVTU0lPTl9NRVRIT0RfU1RPUkVEICAgICAgICAgICAgIDAgICAvLyBubyBjb21wcmVzc2lvbgotI2RlZmluZSBDT01QUkVTU0lPTl9NRVRIT0RfREVGTEFURUQgICAgICAgICAgIDgKLQotI2RlZmluZSBHRU5FUkFMX1BVUlBPU0VfQklUX0ZMQUdfQ09NUFJFU1NFRCAoMSA8PCAzKQotI2RlZmluZSBHRU5FUkFMX1BVUlBPU0VfQklUX0ZMQUdfVVRGOF9FTkNPREVEICgxIDw8IDExKQotI2RlZmluZSBHRU5FUkFMX1BVUlBPU0VfQklUX0ZMQUdfQ09NUFJFU1NJT05fU1BFRUQgKCgxIDw8IDIpIHwgKDEgPDwgMSkpCi0jZGVmaW5lIEdFTkVSQUxfUFVSUE9TRV9CSVRfRkxBR19TVVBQT1JURUQgXAotICAoR0VORVJBTF9QVVJQT1NFX0JJVF9GTEFHX0NPTVBSRVNTRUQgXAotICB8IEdFTkVSQUxfUFVSUE9TRV9CSVRfRkxBR19VVEY4X0VOQ09ERUQgXAotICB8IEdFTkVSQUxfUFVSUE9TRV9CSVRfRkxBR19DT01QUkVTU0lPTl9TUEVFRCkKLQotbmFtZXNwYWNlIGRldnRvb2xzX2lqYXIgewotLy8gSW4gdGhlIGFic2VuY2Ugb2YgWklQNjQgc3VwcG9ydCwgemlwIGZpbGVzIGFyZSBsaW1pdGVkIHRvIDRHQi4KLS8vIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2xpbWl0cwotc3RhdGljIGNvbnN0IHU4IGtNYXhpbXVtT3V0cHV0U2l6ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKLQotc3RhdGljIGJvb2wgUHJvY2Vzc0NlbnRyYWxEaXJFbnRyeShjb25zdCB1MSAqJnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY29tcHJlc3NlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnVuY29tcHJlc3NlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZpbGVuYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU0ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NCAqb2Zmc2V0KTsKLQotLy8KLS8vIEEgY2xhc3MgcmVwcmVzZW50aW5nIGEgWmlwRmlsZSBmb3IgcmVhZGluZy4gSXRzIHB1YmxpYyBBUEkgaXMgZXhwb3NlZAotLy8gdXNpbmcgdGhlIFppcEV4dHJhY3RvciBhYnN0cmFjdCBjbGFzcy4KLS8vCi1jbGFzcyBJbnB1dFppcEZpbGUgOiBwdWJsaWMgWmlwRXh0cmFjdG9yIHsKLSBwdWJsaWM6Ci0gIElucHV0WmlwRmlsZShaaXBFeHRyYWN0b3JQcm9jZXNzb3IgKnByb2Nlc3NvciwgaW50IGZkLCBvZmZfdCBpbl9sZW5ndGgsCi0gICAgICAgICAgICAgICBvZmZfdCBpbl9vZmZzZXQsIGNvbnN0IHUxKiB6aXBkYXRhX2luLCBjb25zdCB1MSogY2VudHJhbF9kaXIpOwotICB2aXJ0dWFsIH5JbnB1dFppcEZpbGUoKTsKLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIEdldEVycm9yKCkgewotICAgIGlmIChlcnJtc2dbMF0gPT0gMCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBlcnJtc2c7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgUHJvY2Vzc05leHQoKTsKLSAgdmlydHVhbCB2b2lkIFJlc2V0KCk7Ci0gIHZpcnR1YWwgc2l6ZV90IEdldFNpemUoKSB7Ci0gICAgcmV0dXJuIGluX2xlbmd0aF87Ci0gIH0KLQotICB2aXJ0dWFsIHU4IENhbGN1bGF0ZU91dHB1dExlbmd0aCgpOwotCi0gcHJpdmF0ZToKLSAgWmlwRXh0cmFjdG9yUHJvY2Vzc29yICpwcm9jZXNzb3I7Ci0KLSAgaW50IGZkX2luOyAgLy8gSW5wdXQgZmlsZSBkZXNjcmlwb3IKLQotICAvLyBJbnB1dFppcEZpbGUgaXMgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSBmb2xsb3dpbmcKLSAgLy8gcG9pbnRlcnMuIFRoZXkgYXJlIGFsbG9jYXRlZCBieSB0aGUgQ3JlYXRlKCkgbWV0aG9kIGJlZm9yZQotICAvLyB0aGUgb2JqZWN0IGlzIGFjdHVhbGx5IGNyZWF0ZWQgdXNpbmcgbW1hcC4KLSAgY29uc3QgdTEgKiBjb25zdCB6aXBkYXRhX2luXzsgICAvLyBzdGFydCBvZiBpbnB1dCBmaWxlIG1tYXAKLSAgY29uc3QgdTEgKiB6aXBkYXRhX2luX21hcHBlZF87ICAvLyBzdGFydCBvZiBzdGlsbCBtYXBwZWQgcmVnaW9uCi0gIGNvbnN0IHUxICogY29uc3QgY2VudHJhbF9kaXJfOyAgLy8gY2VudHJhbCBkaXJlY3RvcnkgaW4gaW5wdXQgZmlsZQotCi0gIHNpemVfdCBpbl9sZW5ndGhfOyAgLy8gc2l6ZSBvZiB0aGUgaW5wdXQgZmlsZQotICBzaXplX3QgaW5fb2Zmc2V0XzsgIC8vIG9mZnNldCAgdGhlIGlucHV0IGZpbGUKLQotICBjb25zdCB1MSAqcDsgIC8vIGlucHV0IGN1cnNvcgotCi0gIGNvbnN0IHUxKiBjZW50cmFsX2Rpcl9jdXJyZW50XzsgIC8vIGNlbnRyYWwgZGlyIGlucHV0IGN1cnNvcgotCi0gIC8vIEJ1ZmZlciBzaXplIGlzIGluaXRpYWxseSBJTklUSUFMX0JVRkZFUl9TSVpFLiBJdCBkb3VibGVzIGluIHNpemUgZXZlcnkKLSAgLy8gdGltZSBpdCBpcyBmb3VuZCB0b28gc21hbGwsIHVudGlsIGl0IHJlYWNoZXMgTUFYX0JVRkZFUl9TSVpFLiBJZiB0aGF0IGlzCi0gIC8vIG5vdCBlbm91Z2gsIHdlIGJhaWwgb3V0LiBXZSBvbmx5IGRlY29tcHJlc3MgY2xhc3MgZmlsZXMsIHNvIHRoZXkgc2hvdWxkCi0gIC8vIGJlIHNtYWxsZXIgdGhhbiA2NEsgYW55d2F5LCBidXQgd2UgZ2l2ZSBhIGxpdHRsZSBsZWV3YXkuCi0gIC8vIE1BWF9CVUZGRVJfU0laRSBtdXN0IGJlIGJpZ2dlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBiaWdnZXN0IGZpbGUgaW4gdGhlCi0gIC8vIFpJUC4gSXQgaXMgc2V0IHRvIDEyOE0gaGVyZSBzbyB3ZSBjYW4gdW5jb21wcmVzcyB0aGUgQmF6ZWwgc2VydmVyIHdpdGgKLSAgLy8gdGhpcyBsaWJyYXJ5LgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IElOSVRJQUxfQlVGRkVSX1NJWkUgPSAyNTYgKiAxMDI0OyAgLy8gMjU2SwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9CVUZGRVJfU0laRSA9IDEyOCAqIDEwMjQgKiAxMDI0OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1BWF9NQVBQRURfUkVHSU9OID0gMzIgKiAxMDI0ICogMTAyNDsKLQotICAvLyBUaGVzZSBtZXRhZGF0YSBmaWVsZHMgYXJlIHRoZSBmaWVsZHMgb2YgdGhlIFpJUCBoZWFkZXIgb2YgdGhlIGZpbGUgYmVpbmcKLSAgLy8gcHJvY2Vzc2VkLgotICB1MiBleHRyYWN0X3ZlcnNpb25fOwotICB1MiBnZW5lcmFsX3B1cnBvc2VfYml0X2ZsYWdfOwotICB1MiBjb21wcmVzc2lvbl9tZXRob2RfOwotICB1NCB1bmNvbXByZXNzZWRfc2l6ZV87Ci0gIHU0IGNvbXByZXNzZWRfc2l6ZV87Ci0gIHUyIGZpbGVfbmFtZV9sZW5ndGhfOwotICB1MiBleHRyYV9maWVsZF9sZW5ndGhfOwotICBjb25zdCB1MSAqZmlsZV9uYW1lXzsKLSAgY29uc3QgdTEgKmV4dHJhX2ZpZWxkXzsKLQotICAvLyBBZG1pbmlzdHJhdGlvbiBvZiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIGRlY29tcHJlc3NlZCBkYXRhLiBXZSB1c2UgdGhlIHNhbWUKLSAgLy8gYnVmZmVyIGZvciBlYWNoIGZpbGUgdG8gYXZvaWQgc29tZSBtYWxsb2MoKS9mcmVlKCkgY2FsbHMgYW5kIGZyZWUgdGhlCi0gIC8vIG1lbW9yeSBvbmx5IGluIHRoZSBkdG9yLiBDLXN0eWxlIG1lbW9yeSBtYW5hZ2VtZW50IGlzIHVzZWQgc28gdGhhdCB3ZQotICAvLyBjYW4gY2FsbCByZWFsbG9jLgotICB1MSAqdW5jb21wcmVzc2VkX2RhdGFfOwotICBzaXplX3QgdW5jb21wcmVzc2VkX2RhdGFfYWxsb2NhdGVkXzsKLQotICAvLyBDb3B5IG9mIHRoZSBsYXN0IGZpbGVuYW1lIGVudHJ5IC0gTnVsbC10ZXJtaW5hdGVkLgotICBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKLSAgLy8gVGhlIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlIGZpZWxkCi0gIHU0IGF0dHI7Ci0KLSAgLy8gbGFzdCBlcnJvcgotICBjaGFyIGVycm1zZ1s0KlBBVEhfTUFYXTsKLQotICBpbnQgZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pIHsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIHZzbnByaW50ZihlcnJtc2csIDQqUEFUSF9NQVgsIGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gQ2hlY2sgdGhhdCBhdCBsZWFzdCBuIGJ5dGVzIHJlbWFpbiBpbiB0aGUgaW5wdXQgZmlsZSwgb3RoZXJ3aXNlCi0gIC8vIGFib3J0IHdpdGggYW4gZXJyb3IgbWVzc2FnZS4gICJzdGF0ZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0gIC8vIHdlJ3JlIGFib3V0IHRvIHJlYWQsIGZvciBkaWFnbm9zdGljcy4KLSAgaW50IEVuc3VyZVJlbWFpbmluZyhzaXplX3QgbiwgY29uc3QgY2hhciAqc3RhdGUpIHsKLSAgICBzaXplX3QgaW5fb2Zmc2V0ID0gcCAtIHppcGRhdGFfaW5fOwotICAgIHNpemVfdCByZW1haW5pbmcgPSBpbl9sZW5ndGhfIC0gaW5fb2Zmc2V0OwotICAgIGlmIChuID4gcmVtYWluaW5nKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoIlByZW1hdHVyZSBlbmQgb2YgZmlsZSAoYXQgb2Zmc2V0ICV6ZCwgc3RhdGU9JXMpOyAiCi0gICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICV6ZCBtb3JlIGJ5dGVzIGJ1dCBmb3VuZCAlemQuXG4iLAotICAgICAgICAgICAgICAgICAgIGluX29mZnNldCwgc3RhdGUsIG4sIHJlbWFpbmluZyk7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gUmVhZCBvbmUgZW50cnkgZnJvbSBpbnB1dCB6aXAgZmlsZQotICBpbnQgUHJvY2Vzc0xvY2FsRmlsZUVudHJ5KHNpemVfdCBjb21wcmVzc2VkX3NpemUsIHNpemVfdCB1bmNvbXByZXNzZWRfc2l6ZSk7Ci0KLSAgLy8gVW5jb21wcmVzcyBhIGZpbGUgZnJvbSB0aGUgYXJjaGl2ZSB1c2luZyB6bGliLiBUaGUgcG9pbnRlciByZXR1cm5lZAotICAvLyBpcyBvd25lZCBieSBJbnB1dFppcEZpbGUsIHNvIGl0IG11c3Qgbm90IGJlIGZyZWVkLiBBZHZhbmNlcyB0aGUgaW5wdXQKLSAgLy8gY3Vyc29yIHRvIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBjb21wcmVzc2VkIGRhdGEuCi0gIHUxKiBVbmNvbXByZXNzRmlsZSgpOwotCi0gIC8vIFNraXAgYSBmaWxlCi0gIGludCBTa2lwRmlsZShjb25zdCBib29sIGNvbXByZXNzZWQpOwotCi0gIC8vIFByb2Nlc3MgYSBmaWxlCi0gIGludCBQcm9jZXNzRmlsZShjb25zdCBib29sIGNvbXByZXNzZWQpOwotfTsKLQotLy8KLS8vIEEgY2xhc3MgaW1wbGVtZW50aW5nIFppcEJ1aWxkZXIgdGhhdCByZXByZXNlbnQgYW4gb3BlbiB6aXAgZmlsZSBmb3Igd3JpdGluZy4KLS8vCi1jbGFzcyBPdXRwdXRaaXBGaWxlIDogcHVibGljIFppcEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgT3V0cHV0WmlwRmlsZShpbnQgZmQsIHUxICogY29uc3QgemlwZGF0YV9vdXQpIDoKLSAgICAgIGZkX291dChmZCksCi0gICAgICB6aXBkYXRhX291dF8oemlwZGF0YV9vdXQpLAotICAgICAgcSh6aXBkYXRhX291dCkgewotICAgIGVycm1zZ1swXSA9IDA7Ci0gIH0KLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIEdldEVycm9yKCkgewotICAgIGlmIChlcnJtc2dbMF0gPT0gMCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBlcnJtc2c7Ci0gIH0KLQotICB2aXJ0dWFsIH5PdXRwdXRaaXBGaWxlKCkgeyBGaW5pc2goKTsgfQotICB2aXJ0dWFsIHUxKiBOZXdGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKTsKLSAgdmlydHVhbCBpbnQgRmluaXNoRmlsZShzaXplX3QgZmlsZWxlbmd0aCwgYm9vbCBjb21wcmVzcyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29tcHV0ZV9jcmMgPSBmYWxzZSk7Ci0gIHZpcnR1YWwgaW50IFdyaXRlRW1wdHlGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKLSAgdmlydHVhbCBzaXplX3QgR2V0U2l6ZSgpIHsKLSAgICByZXR1cm4gT2Zmc2V0KHEpOwotICB9Ci0gIHZpcnR1YWwgaW50IEdldE51bWJlckZpbGVzKCkgewotICAgIHJldHVybiBlbnRyaWVzXy5zaXplKCk7Ci0gIH0KLSAgdmlydHVhbCBpbnQgRmluaXNoKCk7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgTG9jYWxGaWxlRW50cnkgewotICAgIC8vIFN0YXJ0IG9mIHRoZSBsb2NhbCBoZWFkZXIgKGluIHRoZSBvdXRwdXQgYnVmZmVyKS4KLSAgICBzaXplX3QgbG9jYWxfaGVhZGVyX29mZnNldDsKLQotICAgIC8vIFNpemVzIG9mIHRoZSBmaWxlIGVudHJ5Ci0gICAgc2l6ZV90IHVuY29tcHJlc3NlZF9sZW5ndGg7Ci0gICAgc2l6ZV90IGNvbXByZXNzZWRfbGVuZ3RoOwotCi0gICAgLy8gQ29tcHJlc3Npb24gbWV0aG9kCi0gICAgdTIgY29tcHJlc3Npb25fbWV0aG9kOwotCi0gICAgLy8gQ1JDMzIKLSAgICB1NCBjcmMzMjsKLQotICAgIC8vIGV4dGVybmFsIGF0dHJpYnV0ZXMgZmllbGQKLSAgICB1NCBleHRlcm5hbF9hdHRyOwotCi0gICAgLy8gU3RhcnQvbGVuZ3RoIG9mIHRoZSBmaWxlX25hbWUgaW4gdGhlIGxvY2FsIGhlYWRlci4KLSAgICB1MSAqZmlsZV9uYW1lOwotICAgIHUyIGZpbGVfbmFtZV9sZW5ndGg7Ci0KLSAgICAvLyBTdGFydC9sZW5ndGggb2YgdGhlIGV4dHJhX2ZpZWxkIGluIHRoZSBsb2NhbCBoZWFkZXIuCi0gICAgY29uc3QgdTEgKmV4dHJhX2ZpZWxkOwotICAgIHUyIGV4dHJhX2ZpZWxkX2xlbmd0aDsKLSAgfTsKLQotICBpbnQgZmRfb3V0OyAgLy8gZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUgb3V0cHV0IGZpbGUKLQotICAvLyBPdXRwdXRaaXBGaWxlIGlzIHJlc3BvbnNpYmxlIGZvciBtYWludGFpbmluZyB0aGUgZm9sbG93aW5nCi0gIC8vIHBvaW50ZXJzLiBUaGV5IGFyZSBhbGxvY2F0ZWQgYnkgdGhlIENyZWF0ZSgpIG1ldGhvZCBiZWZvcmUKLSAgLy8gdGhlIG9iamVjdCBpcyBhY3R1YWxseSBjcmVhdGVkIHVzaW5nIG1tYXAuCi0gIHUxICogY29uc3QgemlwZGF0YV9vdXRfOyAgICAgICAgLy8gc3RhcnQgb2Ygb3V0cHV0IGZpbGUgbW1hcAotICB1MSAqcTsgIC8vIG91dHB1dCBjdXJzb3IKLQotICB1MSAqaGVhZGVyX3B0cjsgIC8vIEN1cnJlbnQgcG9pbnRlciB0byAiY29tcHJlc3Npb24gbWV0aG9kIiBlbnRyeS4KLQotICAvLyBMaXN0IG9mIGVudHJpZXMgdG8gd3JpdGUgdGhlIGNlbnRyYWwgZGlyZWN0b3J5Ci0gIHN0ZDo6dmVjdG9yPExvY2FsRmlsZUVudHJ5Kj4gZW50cmllc187Ci0KLSAgLy8gbGFzdCBlcnJvcgotICBjaGFyIGVycm1zZ1s0KlBBVEhfTUFYXTsKLQotICBpbnQgZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pIHsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIHZzbnByaW50ZihlcnJtc2csIDQqUEFUSF9NQVgsIGZtdCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIFpJUCBjZW50cmFsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGVhY2ggbG9jYWwgZmlsZQotICAvLyBlbnRyeSBpbiAiZW50cmllcyIuCi0gIHZvaWQgV3JpdGVDZW50cmFsRGlyZWN0b3J5KCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBwb2ludGVyIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgLy8gb3V0cHV0IHppcCBmaWxlLgotICBzaXplX3QgT2Zmc2V0KGNvbnN0IHUxICpjb25zdCB4KSB7Ci0gICAgcmV0dXJuIHggLSB6aXBkYXRhX291dF87Ci0gIH0KLQotICAvLyBXcml0ZSBaSVAgZmlsZSBoZWFkZXIgaW4gdGhlIG91dHB1dC4gU2luY2UgdGhlIGNvbXByZXNzZWQgc2l6ZSBpcyBub3QKLSAgLy8ga25vd24gaW4gYWR2YW5jZSwgaXQgbXVzdCBiZSByZWNvcmRlZCBsYXRlci4gVGhpcyBtZXRob2QgcmV0dXJucyBhIHBvaW50ZXIKLSAgLy8gdG8gImNvbXByZXNzZWQgc2l6ZSIgaW4gdGhlIGZpbGUgaGVhZGVyIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0bwotICAvLyBXcml0ZUZpbGVTaXplSW5Mb2NhbEZpbGVIZWFkZXIoKSBsYXRlci4KLSAgdTEqIFdyaXRlTG9jYWxGaWxlSGVhZGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKTsKLQotICAvLyBGaWxsIGluIHRoZSAiY29tcHJlc3NlZCBzaXplIiBhbmQgInVuY29tcHJlc3NlZCBzaXplIiBmaWVsZHMgaW4gYSBsb2NhbAotICAvLyBmaWxlIGhlYWRlciBwcmV2aW91c2x5IHdyaXR0ZW4gYnkgV3JpdGVMb2NhbEZpbGVIZWFkZXIoKS4KLSAgc2l6ZV90IFdyaXRlRmlsZVNpemVJbkxvY2FsRmlsZUhlYWRlcih1MSAqaGVhZGVyX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbXByZXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTQgY3JjID0gMCk7Ci19OwotCi0vLwotLy8gSW1wbGVtZW50YXRpb24gb2YgSW5wdXRaaXBGaWxlCi0vLwotYm9vbCBJbnB1dFppcEZpbGU6OlByb2Nlc3NOZXh0KCkgewotICAvLyBQcm9jZXNzIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeS4gQWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUKLSAgLy8gY29udGVudCBwb2ludGVyIGlzIGluIHN5bmMuCi0gIHNpemVfdCBjb21wcmVzc2VkLCB1bmNvbXByZXNzZWQ7Ci0gIHU0IG9mZnNldDsKLSAgaWYgKCFQcm9jZXNzQ2VudHJhbERpckVudHJ5KGNlbnRyYWxfZGlyX2N1cnJlbnRfLCAmY29tcHJlc3NlZCwgJnVuY29tcHJlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBQQVRIX01BWCwgJmF0dHIsICZvZmZzZXQpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVGhlcmUgbWlnaHQgYmUgYW4gb2Zmc2V0IHNwZWNpZmllZCBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgdGhhdCBkb2VzCi0gIC8vIG5vdCBtYXRjaCB0aGUgZmlsZSBvZmZzZXQsIGlmIHNvLCBjb3JyZWN0IHRoZSBwb2ludGVyLgotICBpZiAob2Zmc2V0ICE9IDAgJiYgKHAgIT0gKHppcGRhdGFfaW5fICsgaW5fb2Zmc2V0XyArIG9mZnNldCkpKSB7Ci0gICAgcCA9IHppcGRhdGFfaW5fICsgb2Zmc2V0OwotICB9Ci0KLSAgaWYgKEVuc3VyZVJlbWFpbmluZyg0LCAic2lnbmF0dXJlIikgPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHU0IHNpZ25hdHVyZSA9IGdldF91NGxlKHApOwotICBpZiAoc2lnbmF0dXJlID09IExPQ0FMX0ZJTEVfSEVBREVSX1NJR05BVFVSRSkgewotICAgIGlmIChQcm9jZXNzTG9jYWxGaWxlRW50cnkoY29tcHJlc3NlZCwgdW5jb21wcmVzc2VkKSA8IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZXJyb3IoImxvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZSBmb3IgZmlsZSAlcyBub3QgZm91bmRcbiIsIGZpbGVuYW1lKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IElucHV0WmlwRmlsZTo6UHJvY2Vzc0xvY2FsRmlsZUVudHJ5KAotICAgIHNpemVfdCBjb21wcmVzc2VkX3NpemUsIHNpemVfdCB1bmNvbXByZXNzZWRfc2l6ZSkgewotICBpZiAoRW5zdXJlUmVtYWluaW5nKDI2LCAiZXh0cmFjdF92ZXJzaW9uIikgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGV4dHJhY3RfdmVyc2lvbl8gPSBnZXRfdTJsZShwKTsKLSAgZ2VuZXJhbF9wdXJwb3NlX2JpdF9mbGFnXyA9IGdldF91MmxlKHApOwotCi0gIGlmICgoZ2VuZXJhbF9wdXJwb3NlX2JpdF9mbGFnXyAmIH5HRU5FUkFMX1BVUlBPU0VfQklUX0ZMQUdfU1VQUE9SVEVEKSAhPSAwKSB7Ci0gICAgcmV0dXJuIGVycm9yKCJVbnN1cHBvcnRlZCB2YWx1ZSAoMHglMDR4KSBpbiBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcuXG4iLAotICAgICAgICAgICAgICAgICBnZW5lcmFsX3B1cnBvc2VfYml0X2ZsYWdfKTsKLSAgfQotCi0gIGNvbXByZXNzaW9uX21ldGhvZF8gPSBnZXRfdTJsZShwKTsKLQotICBpZiAoY29tcHJlc3Npb25fbWV0aG9kXyAhPSBDT01QUkVTU0lPTl9NRVRIT0RfREVGTEFURUQgJiYKLSAgICAgIGNvbXByZXNzaW9uX21ldGhvZF8gIT0gQ09NUFJFU1NJT05fTUVUSE9EX1NUT1JFRCkgewotICAgIHJldHVybiBlcnJvcigiVW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kICglZCkuXG4iLAotICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbl9tZXRob2RfKTsKLSAgfQotCi0gIC8vIHNraXAgb3ZlcjogbGFzdF9tb2RfZmlsZV90aW1lLCBsYXN0X21vZF9maWxlX2RhdGUsIGNyYzMyCi0gIHAgKz0gMiArIDIgKyA0OwotICBjb21wcmVzc2VkX3NpemVfID0gZ2V0X3U0bGUocCk7Ci0gIHVuY29tcHJlc3NlZF9zaXplXyA9IGdldF91NGxlKHApOwotICBmaWxlX25hbWVfbGVuZ3RoXyA9IGdldF91MmxlKHApOwotICBleHRyYV9maWVsZF9sZW5ndGhfID0gZ2V0X3UybGUocCk7Ci0KLSAgaWYgKEVuc3VyZVJlbWFpbmluZyhmaWxlX25hbWVfbGVuZ3RoXywgImZpbGVfbmFtZSIpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBmaWxlX25hbWVfID0gcDsKLSAgcCArPSBmaWxlX25hbWVfbGVuZ3RoXzsKLQotICBpZiAoRW5zdXJlUmVtYWluaW5nKGV4dHJhX2ZpZWxkX2xlbmd0aF8sICJleHRyYV9maWVsZCIpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBleHRyYV9maWVsZF8gPSBwOwotICBwICs9IGV4dHJhX2ZpZWxkX2xlbmd0aF87Ci0KLSAgYm9vbCBpc19jb21wcmVzc2VkID0gY29tcHJlc3Npb25fbWV0aG9kXyA9PSBDT01QUkVTU0lPTl9NRVRIT0RfREVGTEFURUQ7Ci0KLSAgLy8gSWYgdGhlIHppcCBpcyBjb21wcmVzc2VkLCBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgc2l6ZSBtZW1iZXJzIGFyZQotICAvLyB6ZXJvIGluIHRoZSBsb2NhbCBmaWxlIGhlYWRlci4gSWYgbm90LCBjaGVjayB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZQotICAvLyBsZW5ndGhzIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5LCBvdGhlcndpc2UsIGp1c3QgYmVsaWV2ZSB0aGUgY2VudHJhbAotICAvLyBkaXJlY3RvcnkKLSAgaWYgKGNvbXByZXNzZWRfc2l6ZV8gPT0gMCkgewotICAgIGNvbXByZXNzZWRfc2l6ZV8gPSBjb21wcmVzc2VkX3NpemU7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNvbXByZXNzZWRfc2l6ZV8gIT0gY29tcHJlc3NlZF9zaXplKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImNlbnRyYWwgZGlyZWN0b3J5IGFuZCBmaWxlIGhlYWRlciBpbmNvbnNpc3RlbnRcbiIpOwotICAgIH0KLSAgfQotCi0gIGlmICh1bmNvbXByZXNzZWRfc2l6ZV8gPT0gMCkgewotICAgIHVuY29tcHJlc3NlZF9zaXplXyA9IHVuY29tcHJlc3NlZF9zaXplOwotICB9IGVsc2UgewotICAgIGlmICh1bmNvbXByZXNzZWRfc2l6ZV8gIT0gdW5jb21wcmVzc2VkX3NpemUpIHsKLSAgICAgIHJldHVybiBlcnJvcigiY2VudHJhbCBkaXJlY3RvcnkgYW5kIGZpbGUgaGVhZGVyIGluY29uc2lzdGVudFxuIik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHByb2Nlc3Nvci0+QWNjZXB0KGZpbGVuYW1lLCBhdHRyKSkgewotICAgIGlmIChQcm9jZXNzRmlsZShpc19jb21wcmVzc2VkKSA8IDApIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKFNraXBGaWxlKGlzX2NvbXByZXNzZWQpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotCi0gIGlmIChnZW5lcmFsX3B1cnBvc2VfYml0X2ZsYWdfICYgR0VORVJBTF9QVVJQT1NFX0JJVF9GTEFHX0NPTVBSRVNTRUQpIHsKLSAgICAvLyBTa2lwIHRoZSBkYXRhIGRlc2NyaXB0b3IuIFNvbWUgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBwdXQgdGhlIHNpZ25hdHVyZQotICAgIC8vIGhlcmUsIHNvIGNoZWNrIGlmIHRoZSBuZXh0IDQgYnl0ZXMgYXJlIGEgc2lnbmF0dXJlLCBhbmQgaWYgc28sIHNraXAgdGhlCi0gICAgLy8gbmV4dCAxMiBieXRlcyAoZm9yIENSQywgY29tcHJlc3NlZC91bmNvbXByZXNzZWQgc2l6ZSksIG90aGVyd2lzZSBza2lwCi0gICAgLy8gdGhlIG5leHQgOCBieXRlcyAoYmVjYXVzZSB0aGUgdmFsdWUganVzdCByZWFkIHdhcyB0aGUgQ1JDKS4KLSAgICB1NCBzaWduYXR1cmUgPSBnZXRfdTRsZShwKTsKLSAgICBpZiAoc2lnbmF0dXJlID09IERBVEFfREVTQ1JJUFRPUl9TSUdOQVRVUkUpIHsKLSAgICAgIHAgKz0gNCAqIDM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHAgKz0gNCAqIDI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHAgPiB6aXBkYXRhX2luX21hcHBlZF8gKyBNQVhfTUFQUEVEX1JFR0lPTikgewotICAgIG11bm1hcChjb25zdF9jYXN0PHUxICo+KHppcGRhdGFfaW5fbWFwcGVkXyksIE1BWF9NQVBQRURfUkVHSU9OKTsKLSAgICB6aXBkYXRhX2luX21hcHBlZF8gKz0gTUFYX01BUFBFRF9SRUdJT047Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotaW50IElucHV0WmlwRmlsZTo6U2tpcEZpbGUoY29uc3QgYm9vbCBjb21wcmVzc2VkKSB7Ci0gIGlmICghY29tcHJlc3NlZCkgewotICAgIC8vIEluIHRoaXMgY2FzZSwgY29tcHJlc3NlZF9zaXplXyA9PSB1bmNvbXByZXNzZWRfc2l6ZV8gKHNpbmNlIHRoZSBmaWxlIGlzCi0gICAgLy8gdW5jb21wcmVzc2VkKSwgc28gd2UgY2FuIHVzZSBlaXRoZXIuCi0gICAgaWYgKGNvbXByZXNzZWRfc2l6ZV8gIT0gdW5jb21wcmVzc2VkX3NpemVfKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImNvbXByZXNzZWQgc2l6ZSAhPSB1bmNvbXByZXNzZWQgc2l6ZSwgYWx0aG91Z2ggdGhlIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICJpcyB1bmNvbXByZXNzZWQuXG4iKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoRW5zdXJlUmVtYWluaW5nKGNvbXByZXNzZWRfc2l6ZV8sICJmaWxlX2RhdGEiKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcCArPSBjb21wcmVzc2VkX3NpemVfOwotICByZXR1cm4gMDsKLX0KLQotdTEqIElucHV0WmlwRmlsZTo6VW5jb21wcmVzc0ZpbGUoKSB7Ci0gIHNpemVfdCBpbl9vZmZzZXQgPSBwIC0gemlwZGF0YV9pbl87Ci0gIHNpemVfdCByZW1haW5pbmcgPSBpbl9sZW5ndGhfIC0gaW5fb2Zmc2V0OwotICB6X3N0cmVhbSBzdHJlYW07Ci0KLSAgc3RyZWFtLnphbGxvYyA9IFpfTlVMTDsKLSAgc3RyZWFtLnpmcmVlID0gWl9OVUxMOwotICBzdHJlYW0ub3BhcXVlID0gWl9OVUxMOwotICBzdHJlYW0uYXZhaWxfaW4gPSByZW1haW5pbmc7Ci0gIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmICopIHA7Ci0KLSAgaW50IHJldCA9IGluZmxhdGVJbml0Migmc3RyZWFtLCAtTUFYX1dCSVRTKTsKLSAgaWYgKHJldCAhPSBaX09LKSB7Ci0gICAgZXJyb3IoImluZmxhdGVJbml0OiAlZFxuIiwgcmV0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGludCB1bmNvbXByZXNzZWRfdW50aWxfbm93ID0gMDsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHN0cmVhbS5hdmFpbF9vdXQgPSB1bmNvbXByZXNzZWRfZGF0YV9hbGxvY2F0ZWRfIC0gdW5jb21wcmVzc2VkX3VudGlsX25vdzsKLSAgICBzdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByZXNzZWRfZGF0YV8gKyB1bmNvbXByZXNzZWRfdW50aWxfbm93OwotICAgIGludCBvbGRfYXZhaWxfb3V0ID0gc3RyZWFtLmF2YWlsX291dDsKLQotICAgIHJldCA9IGluZmxhdGUoJnN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKLSAgICBpbnQgdW5jb21wcmVzc2VkX25vdyA9IG9sZF9hdmFpbF9vdXQgLSBzdHJlYW0uYXZhaWxfb3V0OwotICAgIHVuY29tcHJlc3NlZF91bnRpbF9ub3cgKz0gdW5jb21wcmVzc2VkX25vdzsKLQotICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICBjYXNlIFpfU1RSRUFNX0VORDogewotICAgICAgICAvLyB6bGliIHNhaWQgdGhhdCB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gZGVjb21wcmVzcy4KLQotICAgICAgICB1MSAqbmV3X3AgPSByZWludGVycHJldF9jYXN0PHUxKj4oc3RyZWFtLm5leHRfaW4pOwotICAgICAgICBjb21wcmVzc2VkX3NpemVfID0gbmV3X3AgLSBwOwotICAgICAgICB1bmNvbXByZXNzZWRfc2l6ZV8gPSB1bmNvbXByZXNzZWRfdW50aWxfbm93OwotICAgICAgICBwID0gbmV3X3A7Ci0gICAgICAgIGluZmxhdGVFbmQoJnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiB1bmNvbXByZXNzZWRfZGF0YV87Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgWl9PSzogewotICAgICAgICAvLyB6bGliIHNhaWQgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHJvb20gaW4gdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yCi0gICAgICAgIC8vIHRoZSBkZWNvbXByZXNzZWQgZGF0YS4gRW5sYXJnZSB0aGF0IGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgotCi0gICAgICAgIGlmICh1bmNvbXByZXNzZWRfZGF0YV9hbGxvY2F0ZWRfID09IE1BWF9CVUZGRVJfU0laRSkgewotICAgICAgICAgIGVycm9yKCJpamFyIGRvZXMgbm90IHN1cHBvcnQgZGVjb21wcmVzc2luZyBmaWxlcyAiCi0gICAgICAgICAgICAgICAgImxhcmdlciB0aGFuICVkTUIuXG4iLAotICAgICAgICAgICAgICAgIChpbnQpIChNQVhfQlVGRkVSX1NJWkUvKDEwMjQqMTAyNCkpKTsKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHVuY29tcHJlc3NlZF9kYXRhX2FsbG9jYXRlZF8gKj0gMjsKLSAgICAgICAgaWYgKHVuY29tcHJlc3NlZF9kYXRhX2FsbG9jYXRlZF8gPiBNQVhfQlVGRkVSX1NJWkUpIHsKLSAgICAgICAgICB1bmNvbXByZXNzZWRfZGF0YV9hbGxvY2F0ZWRfID0gTUFYX0JVRkZFUl9TSVpFOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5jb21wcmVzc2VkX2RhdGFfID0gcmVpbnRlcnByZXRfY2FzdDx1MSo+KAotICAgICAgICAgICAgcmVhbGxvYyh1bmNvbXByZXNzZWRfZGF0YV8sIHVuY29tcHJlc3NlZF9kYXRhX2FsbG9jYXRlZF8pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgWl9EQVRBX0VSUk9SOgotICAgICAgY2FzZSBaX0JVRl9FUlJPUjoKLSAgICAgIGNhc2UgWl9TVFJFQU1fRVJST1I6Ci0gICAgICBjYXNlIFpfTkVFRF9ESUNUOgotICAgICAgZGVmYXVsdDogewotICAgICAgICBlcnJvcigiemxpYiByZXR1cm5lZCBlcnJvciBjb2RlICVkIGR1cmluZyBpbmZsYXRlLlxuIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWludCBJbnB1dFppcEZpbGU6OlByb2Nlc3NGaWxlKGNvbnN0IGJvb2wgY29tcHJlc3NlZCkgewotICBjb25zdCB1MSAqZmlsZV9kYXRhOwotICBpZiAoY29tcHJlc3NlZCkgewotICAgIGZpbGVfZGF0YSA9IFVuY29tcHJlc3NGaWxlKCk7Ci0gICAgaWYgKGZpbGVfZGF0YSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIEluIHRoaXMgY2FzZSwgY29tcHJlc3NlZF9zaXplXyA9PSB1bmNvbXByZXNzZWRfc2l6ZV8gKHNpbmNlIHRoZSBmaWxlIGlzCi0gICAgLy8gdW5jb21wcmVzc2VkKSwgc28gd2UgY2FuIHVzZSBlaXRoZXIuCi0gICAgaWYgKGNvbXByZXNzZWRfc2l6ZV8gIT0gdW5jb21wcmVzc2VkX3NpemVfKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImNvbXByZXNzZWQgc2l6ZSAhPSB1bmNvbXByZXNzZWQgc2l6ZSwgYWx0aG91Z2ggdGhlIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICJpcyB1bmNvbXByZXNzZWQuXG4iKTsKLSAgICB9Ci0KLSAgICBpZiAoRW5zdXJlUmVtYWluaW5nKGNvbXByZXNzZWRfc2l6ZV8sICJmaWxlX2RhdGEiKSA8IDApIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZmlsZV9kYXRhID0gcDsKLSAgICBwICs9IGNvbXByZXNzZWRfc2l6ZV87Ci0gIH0KLSAgcHJvY2Vzc29yLT5Qcm9jZXNzKGZpbGVuYW1lLCBhdHRyLCBmaWxlX2RhdGEsIHVuY29tcHJlc3NlZF9zaXplXyk7Ci0gIHJldHVybiAwOwotfQotCi0KLS8vIFJlYWRzIGFuZCByZXR1cm5zIHNvbWUgbWV0YWRhdGEgb2YgdGhlIG5leHQgZmlsZSBmcm9tIHRoZSBjZW50cmFsIGRpcmVjdG9yeToKLS8vIC0gY29tcHJlc3NlZCBzaXplCi0vLyAtIHVuY29tcHJlc3NlZCBzaXplCi0vLyAtIHdoZXRoZXIgdGhlIGVudHJ5IGlzIGEgY2xhc3MgZmlsZSAodG8gYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCkuCi0vLyBQcmVjb25kaXRpb246IHAgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYW4gZW50cnkgaW4gdGhlIGNlbnRyYWwgZGlyCi0vLyBQb3N0Y29uZGl0aW9uOiBwIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjZW50cmFsIGRpcgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBjb250YWlucyBhbm90aGVyIGZpbGUgYW5kIGZhbHNlIGlmIG5vdC4KLS8vIE9mIGNvdXJzZSwgaW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgc2l6ZSBvdXRwdXQgdmFyaWFibGVzIGFyZSBub3QgY2hhbmdlZC4KLS8vIE5vdGUgdGhhdCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaXMgYWx3YXlzIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGF0YSBzdHJ1Y3R1cmUKLS8vIHRoYXQgaGFzIGEgc2lnbmF0dXJlLCBzbyBwYXJzaW5nIGl0IHRoaXMgd2F5IGlzIHNhZmUuCi1zdGF0aWMgYm9vbCBQcm9jZXNzQ2VudHJhbERpckVudHJ5KAotICAgIGNvbnN0IHUxIComcCwgc2l6ZV90ICpjb21wcmVzc2VkX3NpemUsIHNpemVfdCAqdW5jb21wcmVzc2VkX3NpemUsCi0gICAgY2hhciAqZmlsZW5hbWUsIHNpemVfdCBmaWxlbmFtZV9zaXplLCB1NCAqYXR0ciwgdTQgKm9mZnNldCkgewotICB1NCBzaWduYXR1cmUgPSBnZXRfdTRsZShwKTsKLSAgaWYgKHNpZ25hdHVyZSAhPSBDRU5UUkFMX0ZJTEVfSEVBREVSX1NJR05BVFVSRSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHAgKz0gMTY7ICAvLyBza2lwIHRvICdjb21wcmVzc2VkIHNpemUnIGZpZWxkCi0gICpjb21wcmVzc2VkX3NpemUgPSBnZXRfdTRsZShwKTsKLSAgKnVuY29tcHJlc3NlZF9zaXplID0gZ2V0X3U0bGUocCk7Ci0gIHUyIGZpbGVfbmFtZV9sZW5ndGggPSBnZXRfdTJsZShwKTsKLSAgdTIgZXh0cmFfZmllbGRfbGVuZ3RoID0gZ2V0X3UybGUocCk7Ci0gIHUyIGZpbGVfY29tbWVudF9sZW5ndGggPSBnZXRfdTJsZShwKTsKLSAgcCArPSA0OyAgLy8gc2tpcCB0byBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgZmllbGQKLSAgKmF0dHIgPSBnZXRfdTRsZShwKTsKLSAgKm9mZnNldCA9IGdldF91NGxlKHApOwotICB7Ci0gICAgc2l6ZV90IGxlbiA9IChmaWxlX25hbWVfbGVuZ3RoIDwgZmlsZW5hbWVfc2l6ZSkKLSAgICAgID8gZmlsZV9uYW1lX2xlbmd0aAotICAgICAgOiAoZmlsZW5hbWVfc2l6ZSAtIDEpOwotICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHZvaWQqPihmaWxlbmFtZSksIHAsIGxlbik7Ci0gICAgZmlsZW5hbWVbbGVuXSA9IDA7Ci0gIH0KLSAgcCArPSBmaWxlX25hbWVfbGVuZ3RoOwotICBwICs9IGV4dHJhX2ZpZWxkX2xlbmd0aDsKLSAgcCArPSBmaWxlX2NvbW1lbnRfbGVuZ3RoOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gR2l2ZXMgYSBtYXhpbXVtIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBpbnRlcmZhY2UgSkFSLiBCYXNpY2FsbHksIGFkZHMKLS8vIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzaXplcyB0byB0aGUgc2l6ZQotLy8gb2YgdGhlIGlucHV0IGZpbGUuCi11OCBJbnB1dFppcEZpbGU6OkNhbGN1bGF0ZU91dHB1dExlbmd0aCgpIHsKLSAgY29uc3QgdTEqIGN1cnJlbnQgPSBjZW50cmFsX2Rpcl87Ci0KLSAgdTggY29tcHJlc3NlZF9zaXplID0gMDsKLSAgdTggdW5jb21wcmVzc2VkX3NpemUgPSAwOwotICB1OCBza2lwcGVkX2NvbXByZXNzZWRfc2l6ZSA9IDA7Ci0gIHU0IGF0dHI7Ci0gIHU0IG9mZnNldDsKLSAgY2hhciBmaWxlbmFtZVtQQVRIX01BWF07Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBzaXplX3QgZmlsZV9jb21wcmVzc2VkLCBmaWxlX3VuY29tcHJlc3NlZDsKLSAgICBpZiAoIVByb2Nlc3NDZW50cmFsRGlyRW50cnkoY3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVfY29tcHJlc3NlZCwgJmZpbGVfdW5jb21wcmVzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgUEFUSF9NQVgsICZhdHRyLCAmb2Zmc2V0KSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHByb2Nlc3Nvci0+QWNjZXB0KGZpbGVuYW1lLCBhdHRyKSkgewotICAgICAgY29tcHJlc3NlZF9zaXplICs9ICh1OCkgZmlsZV9jb21wcmVzc2VkOwotICAgICAgdW5jb21wcmVzc2VkX3NpemUgKz0gKHU4KSBmaWxlX3VuY29tcHJlc3NlZDsKLSAgICB9IGVsc2UgewotICAgICAgc2tpcHBlZF9jb21wcmVzc2VkX3NpemUgKz0gZmlsZV9jb21wcmVzc2VkOwotICAgIH0KLSAgfQotCi0gIC8vIFRoZSB3b3JzdCBjYXNlIGlzIHdoZW4gdGhlIG91dHB1dCBpcyBzaW1wbHkgdGhlIGlucHV0IHVuY29tcHJlc3NlZC4gVGhlCi0gIC8vIG1ldGFkYXRhIGluIHRoZSB6aXAgZmlsZSB3aWxsIHN0YXkgdGhlIHNhbWUsIHNvIHRoZSBmaWxlIHdpbGwgZ3JvdyBieSB0aGUKLSAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQgc2l6ZXMuCi0gIHJldHVybiAodTgpIGluX2xlbmd0aF8gLSBza2lwcGVkX2NvbXByZXNzZWRfc2l6ZQotICAgICAgKyAodW5jb21wcmVzc2VkX3NpemUgLSBjb21wcmVzc2VkX3NpemUpOwotfQotCi0vLyBHaXZlbiB0aGUgZGF0YSBpbiB0aGUgemlwIGZpbGUsIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkKLS8vIGFuZCB0aGUgbnVtYmVyIG9mIGZpbGVzIGNvbnRhaW5lZCBpbiBpdC4KLWJvb2wgRmluZFppcENlbnRyYWxEaXJlY3RvcnkoY29uc3QgdTEqIGJ5dGVzLCBzaXplX3QgaW5fbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NCogb2Zmc2V0LCBjb25zdCB1MSoqIGNlbnRyYWxfZGlyKSB7Ci0gIHN0YXRpYyBjb25zdCBpbnQgTUFYX0NPTU1FTlRfTEVOR1RIID0gMHhmZmZmOwotICBzdGF0aWMgY29uc3QgaW50IENFTlRSQUxfRElSX0xPQ0FUT1JfU0laRSA9IDIyOwotICAvLyBNYXhpbXVtIGRpc3RhbmNlIG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyIGxvY2F0b3IgZnJvbSBlbmQgb2YgZmlsZQotICBzdGF0aWMgY29uc3QgaW50IE1BWF9ERUxUQSA9IE1BWF9DT01NRU5UX0xFTkdUSCArIENFTlRSQUxfRElSX0xPQ0FUT1JfU0laRTsKLSAgY29uc3QgdTEqIGxhc3RfcG9zX3RvX2NoZWNrID0gaW5fbGVuZ3RoIDwgTUFYX0RFTFRBCi0gICAgICA/IGJ5dGVzCi0gICAgICA6IGJ5dGVzICsgKGluX2xlbmd0aCAtIE1BWF9ERUxUQSk7Ci0gIGNvbnN0IHUxKiBjdXJyZW50OwotICBib29sIGZvdW5kID0gZmFsc2U7Ci0KLSAgZm9yIChjdXJyZW50ID0gYnl0ZXMgKyBpbl9sZW5ndGggLSBDRU5UUkFMX0RJUl9MT0NBVE9SX1NJWkU7Ci0gICAgICAgY3VycmVudCA+PSBsYXN0X3Bvc190b19jaGVjazsKLSAgICAgICBjdXJyZW50LS0gKSB7Ci0gICAgY29uc3QgdTEqIHAgPSBjdXJyZW50OwotICAgIGlmIChnZXRfdTRsZShwKSAhPSBFTkRfT0ZfQ0VOVFJBTF9ESVJfU0lHTkFUVVJFKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBwICs9IDE2OyAgLy8gc2tpcCB0byBjb21tZW50IGxlbmd0aCBmaWVsZAotICAgIHUyIGNvbW1lbnRfbGVuZ3RoID0gZ2V0X3UybGUocCk7Ci0KLSAgICAvLyBEb2VzIHRoZSBjb21tZW50IGdvIGV4YWN0bHkgdGlsbCB0aGUgZW5kIG9mIHRoZSBmaWxlPwotICAgIGlmIChjdXJyZW50ICsgY29tbWVudF9sZW5ndGggKyBDRU5UUkFMX0RJUl9MT0NBVE9SX1NJWkUKLSAgICAgICAgIT0gYnl0ZXMgKyBpbl9sZW5ndGgpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIEhvb3JheSwgd2UgZm91bmQgaXQhCi0gICAgZm91bmQgPSB0cnVlOwotICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKCFmb3VuZCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiZmlsZSBpcyBpbnZhbGlkIG9yIGNvcnJ1cHRlZCAobWlzc2luZyBlbmQgb2YgY2VudHJhbCAiCi0gICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgcmVjb3JkKVxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY29uc3QgdTEqIGVuZF9vZl9jZW50cmFsX2RpciA9IGN1cnJlbnQ7Ci0gIGdldF91NGxlKGN1cnJlbnQpOyAgLy8gY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciBzaWduYXR1cmUsIGFscmVhZHkgY2hlY2tlZAotICB1MiBudW1iZXJfb2ZfdGhpc19kaXNrID0gZ2V0X3UybGUoY3VycmVudCk7Ci0gIHUyIGRpc2tfd2l0aF9jZW50cmFsX2RpciA9IGdldF91MmxlKGN1cnJlbnQpOwotICB1MiBjZW50cmFsX2Rpcl9lbnRyaWVzX29uX3RoaXNfZGlzayA9IGdldF91MmxlKGN1cnJlbnQpOwotICB1MiBjZW50cmFsX2Rpcl9lbnRyaWVzID0gZ2V0X3UybGUoY3VycmVudCk7Ci0gIHU0IGNlbnRyYWxfZGlyX3NpemUgPSBnZXRfdTRsZShjdXJyZW50KTsKLSAgdTQgY2VudHJhbF9kaXJfb2Zmc2V0ID0gZ2V0X3U0bGUoY3VycmVudCk7Ci0gIHUyIGZpbGVfY29tbWVudF9sZW5ndGggPSBnZXRfdTJsZShjdXJyZW50KTsKLSAgY3VycmVudCArPSBmaWxlX2NvbW1lbnRfbGVuZ3RoOyAgLy8gc2V0IGN1cnJlbnQgdG8gdGhlIGVuZCBvZiB0aGUgY2VudHJhbCBkaXIKLQotICBpZiAobnVtYmVyX29mX3RoaXNfZGlzayAhPSAwCi0gICAgfHwgZGlza193aXRoX2NlbnRyYWxfZGlyICE9IDAKLSAgICB8fCBjZW50cmFsX2Rpcl9lbnRyaWVzX29uX3RoaXNfZGlzayAhPSBjZW50cmFsX2Rpcl9lbnRyaWVzKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJtdWx0aS1kaXNrIEpBUiBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRG8gbm90IGNoYW5nZSBvdXRwdXQgdmFsdWVzIGJlZm9yZSBkZXRlcm1pbmluZyB0aGF0IHRoZXkgYXJlIE9LLgotICAqb2Zmc2V0ID0gY2VudHJhbF9kaXJfb2Zmc2V0OwotICAvLyBDZW50cmFsIGRpcmVjdG9yeSBzdGFydCBjYW4gdGhlbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgYWN0dWFsCi0gIC8vIHN0YXJ0cyBvZiB0aGUgemlwIGZpbGUgKHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgaW4gY2FzZSBvZiBhIG5vbi16aXAKLSAgLy8gaGVhZGVyIGxpa2UgZm9yIGF1dG8tZXh0cmFjdGFibGUgYmluYXJpZXMpLgotICAqY2VudHJhbF9kaXIgPSBlbmRfb2ZfY2VudHJhbF9kaXIgLSBjZW50cmFsX2Rpcl9zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBJbnB1dFppcEZpbGU6OlJlc2V0KCkgewotICBjZW50cmFsX2Rpcl9jdXJyZW50XyA9IGNlbnRyYWxfZGlyXzsKLSAgemlwZGF0YV9pbl9tYXBwZWRfID0gemlwZGF0YV9pbl87Ci0gIHAgPSB6aXBkYXRhX2luXyArIGluX29mZnNldF87Ci19Ci0KLWludCBaaXBFeHRyYWN0b3I6OlByb2Nlc3NBbGwoKSB7Ci0gIHdoaWxlIChQcm9jZXNzTmV4dCgpKSB7fQotICBpZiAoR2V0RXJyb3IoKSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1aaXBFeHRyYWN0b3IqIFppcEV4dHJhY3Rvcjo6Q3JlYXRlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaaXBFeHRyYWN0b3JQcm9jZXNzb3IgKnByb2Nlc3NvcikgewotICBpbnQgZmRfaW4gPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7Ci0gIGlmIChmZF9pbiA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIG9mZl90IGxlbmd0aCA9IGxzZWVrKGZkX2luLCAwLCBTRUVLX0VORCk7Ci0gIGlmIChsZW5ndGggPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICB2b2lkICp6aXBkYXRhX2luID0gbW1hcChOVUxMLCBsZW5ndGgsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkX2luLCAwKTsKLSAgaWYgKHppcGRhdGFfaW4gPT0gTUFQX0ZBSUxFRCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgdTQgY2VudHJhbF9kaXJfb2Zmc2V0OwotICBjb25zdCB1MSAqY2VudHJhbF9kaXIgPSBOVUxMOwotCi0gIGlmICghZGV2dG9vbHNfaWphcjo6RmluZFppcENlbnRyYWxEaXJlY3RvcnkoCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgdTEqPih6aXBkYXRhX2luKSwgbGVuZ3RoLAotICAgICAgICAgICZjZW50cmFsX2Rpcl9vZmZzZXQsICZjZW50cmFsX2RpcikpIHsKLSAgICBlcnJubyA9IEVJTzsgIC8vIHdlIGRvbid0IHJlYWxseSBoYXZlIGEgZ29vZCBlcnJvciBudW1iZXIKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjb25zdCB1MSAqemlwZGF0YV9zdGFydCA9IHN0YXRpY19jYXN0PGNvbnN0IHUxKj4oemlwZGF0YV9pbik7Ci0gIG9mZl90IG9mZnNldCA9IC0gc3RhdGljX2Nhc3Q8b2ZmX3Q+KHppcGRhdGFfc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjZW50cmFsX2Rpcl9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjZW50cmFsX2Rpcik7Ci0KLSAgcmV0dXJuIG5ldyBJbnB1dFppcEZpbGUocHJvY2Vzc29yLCBmZF9pbiwgbGVuZ3RoLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHppcGRhdGFfc3RhcnQsIGNlbnRyYWxfZGlyKTsKLX0KLQotSW5wdXRaaXBGaWxlOjpJbnB1dFppcEZpbGUoWmlwRXh0cmFjdG9yUHJvY2Vzc29yICpwcm9jZXNzb3IsIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IGluX2xlbmd0aCwgb2ZmX3QgaW5fb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTEqIHppcGRhdGFfaW4sIGNvbnN0IHUxKiBjZW50cmFsX2RpcikKLSAgOiBwcm9jZXNzb3IocHJvY2Vzc29yKSwgZmRfaW4oZmQpLAotICAgIHppcGRhdGFfaW5fKHppcGRhdGFfaW4pLCB6aXBkYXRhX2luX21hcHBlZF8oemlwZGF0YV9pbiksCi0gICAgY2VudHJhbF9kaXJfKGNlbnRyYWxfZGlyKSwgaW5fbGVuZ3RoXyhpbl9sZW5ndGgpLCBpbl9vZmZzZXRfKGluX29mZnNldCksCi0gICAgcCh6aXBkYXRhX2luICsgaW5fb2Zmc2V0KSwgY2VudHJhbF9kaXJfY3VycmVudF8oY2VudHJhbF9kaXIpIHsKLSAgdW5jb21wcmVzc2VkX2RhdGFfYWxsb2NhdGVkXyA9IElOSVRJQUxfQlVGRkVSX1NJWkU7Ci0gIHVuY29tcHJlc3NlZF9kYXRhXyA9Ci0gICAgcmVpbnRlcnByZXRfY2FzdDx1MSo+KG1hbGxvYyh1bmNvbXByZXNzZWRfZGF0YV9hbGxvY2F0ZWRfKSk7Ci0gIGVycm1zZ1swXSA9IDA7Ci19Ci0KLUlucHV0WmlwRmlsZTo6fklucHV0WmlwRmlsZSgpIHsKLSAgZnJlZSh1bmNvbXByZXNzZWRfZGF0YV8pOwotICBjbG9zZShmZF9pbik7Ci19Ci0KLQotLy8KLS8vIEltcGxlbWVudGF0aW9uIG9mIE91dHB1dFppcEZpbGUKLS8vCi1pbnQgT3V0cHV0WmlwRmlsZTo6V3JpdGVFbXB0eUZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKLSAgY29uc3QgdTEqIGZpbGVfbmFtZSA9IChjb25zdCB1MSopIGZpbGVuYW1lOwotICBzaXplX3QgZmlsZV9uYW1lX2xlbmd0aCA9IHN0cmxlbihmaWxlbmFtZSk7Ci0KLSAgTG9jYWxGaWxlRW50cnkgKmVudHJ5ID0gbmV3IExvY2FsRmlsZUVudHJ5OwotICBlbnRyeS0+bG9jYWxfaGVhZGVyX29mZnNldCA9IE9mZnNldChxKTsKLSAgZW50cnktPmV4dGVybmFsX2F0dHIgPSAwOwotICBlbnRyeS0+Y3JjMzIgPSAwOwotCi0gIC8vIE91dHB1dCB0aGUgWklQIGxvY2FsX2ZpbGVfaGVhZGVyOgotICBwdXRfdTRsZShxLCBMT0NBTF9GSUxFX0hFQURFUl9TSUdOQVRVUkUpOwotICBwdXRfdTJsZShxLCAxMCk7ICAvLyBleHRyYWN0X3ZlcnNpb24KLSAgcHV0X3UybGUocSwgMCk7ICAvLyBnZW5lcmFsX3B1cnBvc2VfYml0X2ZsYWcKLSAgcHV0X3UybGUocSwgMCk7ICAvLyBjb21wcmVzc2lvbl9tZXRob2QKLSAgcHV0X3UybGUocSwgMCk7ICAvLyBsYXN0X21vZF9maWxlX3RpbWUKLSAgcHV0X3UybGUocSwgMCk7ICAvLyBsYXN0X21vZF9maWxlX2RhdGUKLSAgcHV0X3U0bGUocSwgZW50cnktPmNyYzMyKTsgIC8vIGNyYzMyCi0gIHB1dF91NGxlKHEsIDApOyAgLy8gY29tcHJlc3NlZF9zaXplCi0gIHB1dF91NGxlKHEsIDApOyAgLy8gdW5jb21wcmVzc2VkX3NpemUKLSAgcHV0X3UybGUocSwgZmlsZV9uYW1lX2xlbmd0aCk7Ci0gIHB1dF91MmxlKHEsIDApOyAgLy8gZXh0cmFfZmllbGRfbGVuZ3RoCi0gIHB1dF9uKHEsIGZpbGVfbmFtZSwgZmlsZV9uYW1lX2xlbmd0aCk7Ci0KLSAgZW50cnktPmZpbGVfbmFtZV9sZW5ndGggPSBmaWxlX25hbWVfbGVuZ3RoOwotICBlbnRyeS0+ZXh0cmFfZmllbGRfbGVuZ3RoID0gMDsKLSAgZW50cnktPmNvbXByZXNzZWRfbGVuZ3RoID0gMDsKLSAgZW50cnktPnVuY29tcHJlc3NlZF9sZW5ndGggPSAwOwotICBlbnRyeS0+Y29tcHJlc3Npb25fbWV0aG9kID0gMDsKLSAgZW50cnktPmV4dHJhX2ZpZWxkID0gKGNvbnN0IHUxICopIiI7Ci0gIGVudHJ5LT5maWxlX25hbWUgPSAodTEqKSBzdHJkdXAoKGNvbnN0IGNoYXIgKikgZmlsZV9uYW1lKTsKLSAgZW50cmllc18ucHVzaF9iYWNrKGVudHJ5KTsKLQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBPdXRwdXRaaXBGaWxlOjpXcml0ZUNlbnRyYWxEaXJlY3RvcnkoKSB7Ci0gIC8vIGNlbnRyYWwgZGlyZWN0b3J5OgotICBjb25zdCB1MSAqY2VudHJhbF9kaXJlY3Rvcnlfc3RhcnQgPSBxOwotICBmb3IgKHNpemVfdCBpaSA9IDA7IGlpIDwgZW50cmllc18uc2l6ZSgpOyArK2lpKSB7Ci0gICAgTG9jYWxGaWxlRW50cnkgKmVudHJ5ID0gZW50cmllc19baWldOwotICAgIHB1dF91NGxlKHEsIENFTlRSQUxfRklMRV9IRUFERVJfU0lHTkFUVVJFKTsKLSAgICBwdXRfdTJsZShxLCAwKTsgIC8vIHZlcnNpb24gbWFkZSBieQotCi0gICAgcHV0X3UybGUocSwgWklQX1ZFUlNJT05fVE9fRVhUUkFDVCk7ICAvLyB2ZXJzaW9uIHRvIGV4dHJhY3QKLSAgICBwdXRfdTJsZShxLCAwKTsgIC8vIGdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZwotICAgIHB1dF91MmxlKHEsIGVudHJ5LT5jb21wcmVzc2lvbl9tZXRob2QpOyAgLy8gY29tcHJlc3Npb24gbWV0aG9kOgotICAgIHB1dF91MmxlKHEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdF9tb2RfZmlsZV90aW1lCi0gICAgcHV0X3UybGUocSwgMCk7ICAvLyBsYXN0X21vZF9maWxlX2RhdGUKLSAgICBwdXRfdTRsZShxLCBlbnRyeS0+Y3JjMzIpOyAgLy8gY3JjMzIKLSAgICBwdXRfdTRsZShxLCBlbnRyeS0+Y29tcHJlc3NlZF9sZW5ndGgpOyAgICAvLyBjb21wcmVzc2VkX3NpemUKLSAgICBwdXRfdTRsZShxLCBlbnRyeS0+dW5jb21wcmVzc2VkX2xlbmd0aCk7ICAvLyB1bmNvbXByZXNzZWRfc2l6ZQotICAgIHB1dF91MmxlKHEsIGVudHJ5LT5maWxlX25hbWVfbGVuZ3RoKTsKLSAgICBwdXRfdTJsZShxLCBlbnRyeS0+ZXh0cmFfZmllbGRfbGVuZ3RoKTsKLQotICAgIHB1dF91MmxlKHEsIDApOyAgLy8gZmlsZSBjb21tZW50IGxlbmd0aAotICAgIHB1dF91MmxlKHEsIDApOyAgLy8gZGlzayBudW1iZXIgc3RhcnQKLSAgICBwdXRfdTJsZShxLCAwKTsgIC8vIGludGVybmFsIGZpbGUgYXR0cmlidXRlcwotICAgIHB1dF91NGxlKHEsIGVudHJ5LT5leHRlcm5hbF9hdHRyKTsgIC8vIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcwotICAgIC8vIHJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBoZWFkZXI6Ci0gICAgcHV0X3U0bGUocSwgZW50cnktPmxvY2FsX2hlYWRlcl9vZmZzZXQpOwotCi0gICAgcHV0X24ocSwgZW50cnktPmZpbGVfbmFtZSwgZW50cnktPmZpbGVfbmFtZV9sZW5ndGgpOwotICAgIHB1dF9uKHEsIGVudHJ5LT5leHRyYV9maWVsZCwgZW50cnktPmV4dHJhX2ZpZWxkX2xlbmd0aCk7Ci0gIH0KLSAgdTQgY2VudHJhbF9kaXJlY3Rvcnlfc2l6ZSA9IHEgLSBjZW50cmFsX2RpcmVjdG9yeV9zdGFydDsKLQotICBwdXRfdTRsZShxLCBFTkRfT0ZfQ0VOVFJBTF9ESVJfU0lHTkFUVVJFKTsKLSAgcHV0X3UybGUocSwgMCk7ICAvLyBudW1iZXIgb2YgdGhpcyBkaXNrCi0gIHB1dF91MmxlKHEsIDApOyAgLy8gbnVtYmVyIG9mIHRoZSBkaXNrIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeQotICBwdXRfdTJsZShxLCBlbnRyaWVzXy5zaXplKCkpOyAgLy8gIyBjZW50cmFsIGRpciBlbnRyaWVzIG9uIHRoaXMgZGlzawotICBwdXRfdTJsZShxLCBlbnRyaWVzXy5zaXplKCkpOyAgLy8gdG90YWwgIyBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeQotICBwdXRfdTRsZShxLCBjZW50cmFsX2RpcmVjdG9yeV9zaXplKTsgIC8vIHNpemUgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5Ci0gIHB1dF91NGxlKHEsIE9mZnNldChjZW50cmFsX2RpcmVjdG9yeV9zdGFydCkpOyAgLy8gb2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Rvcnkgd3J0IHN0YXJ0aW5nIGRpc2sKLSAgcHV0X3UybGUocSwgMCk7ICAvLyAuWklQIGZpbGUgY29tbWVudCBsZW5ndGgKLX0KLQotdTEqIE91dHB1dFppcEZpbGU6OldyaXRlTG9jYWxGaWxlSGVhZGVyKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKSB7Ci0gIG9mZl90IGZpbGVfbmFtZV9sZW5ndGhfID0gc3RybGVuKGZpbGVuYW1lKTsKLSAgTG9jYWxGaWxlRW50cnkgKmVudHJ5ID0gbmV3IExvY2FsRmlsZUVudHJ5OwotICBlbnRyeS0+bG9jYWxfaGVhZGVyX29mZnNldCA9IE9mZnNldChxKTsKLSAgZW50cnktPmZpbGVfbmFtZV9sZW5ndGggPSBmaWxlX25hbWVfbGVuZ3RoXzsKLSAgZW50cnktPmZpbGVfbmFtZSA9IG5ldyB1MVtmaWxlX25hbWVfbGVuZ3RoX107Ci0gIGVudHJ5LT5leHRlcm5hbF9hdHRyID0gYXR0cjsKLSAgbWVtY3B5KGVudHJ5LT5maWxlX25hbWUsIGZpbGVuYW1lLCBmaWxlX25hbWVfbGVuZ3RoXyk7Ci0gIGVudHJ5LT5leHRyYV9maWVsZF9sZW5ndGggPSAwOwotICBlbnRyeS0+ZXh0cmFfZmllbGQgPSAoY29uc3QgdTEgKikiIjsKLSAgZW50cnktPmNyYzMyID0gMDsKLQotICAvLyBPdXRwdXQgdGhlIFpJUCBsb2NhbF9maWxlX2hlYWRlcjoKLSAgcHV0X3U0bGUocSwgTE9DQUxfRklMRV9IRUFERVJfU0lHTkFUVVJFKTsKLSAgcHV0X3UybGUocSwgWklQX1ZFUlNJT05fVE9fRVhUUkFDVCk7ICAgICAvLyB2ZXJzaW9uIHRvIGV4dHJhY3QKLSAgcHV0X3UybGUocSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmFsIHB1cnBvc2UgYml0IGZsYWcKLSAgdTEgKmhlYWRlcl9wdHIgPSBxOwotICBwdXRfdTJsZShxLCBDT01QUkVTU0lPTl9NRVRIT0RfU1RPUkVEKTsgIC8vIGNvbXByZXNzaW9uIG1ldGhvZCA9IHBsYWNlaG9sZGVyCi0gIHB1dF91MmxlKHEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdF9tb2RfZmlsZV90aW1lCi0gIHB1dF91MmxlKHEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdF9tb2RfZmlsZV9kYXRlCi0gIHB1dF91NGxlKHEsIGVudHJ5LT5jcmMzMik7ICAgICAgICAgICAgICAgLy8gY3JjMzIKLSAgcHV0X3U0bGUocSwgMCk7ICAvLyBjb21wcmVzc2VkX3NpemUgPSBwbGFjZWhvbGRlcgotICBwdXRfdTRsZShxLCAwKTsgIC8vIHVuY29tcHJlc3NlZF9zaXplID0gcGxhY2Vob2xkZXIKLSAgcHV0X3UybGUocSwgZW50cnktPmZpbGVfbmFtZV9sZW5ndGgpOwotICBwdXRfdTJsZShxLCBlbnRyeS0+ZXh0cmFfZmllbGRfbGVuZ3RoKTsKLQotICBwdXRfbihxLCBlbnRyeS0+ZmlsZV9uYW1lLCBlbnRyeS0+ZmlsZV9uYW1lX2xlbmd0aCk7Ci0gIHB1dF9uKHEsIGVudHJ5LT5leHRyYV9maWVsZCwgZW50cnktPmV4dHJhX2ZpZWxkX2xlbmd0aCk7Ci0gIGVudHJpZXNfLnB1c2hfYmFjayhlbnRyeSk7Ci0KLSAgcmV0dXJuIGhlYWRlcl9wdHI7Ci19Ci0KLS8vIFRyeSB0byBjb21wcmVzcyBhIGZpbGUgZW50cnkgaW4gbWVtb3J5IHVzaW5nIHRoZSBkZWZsYXRlIGFsZ29yaXRobS4KLS8vIEl0IHdpbGwgY29tcHJlc3MgYnVmIChvZiBzaXplIGxlbmd0aCkgdW5sZXNzIHRoZSBjb21wcmVzc2VkIHNpemUgaXMgYmlnZ2VyCi0vLyB0aGFuIHRoZSBpbnB1dCBzaXplLiBUaGUgcmVzdWx0IHdpbGwgb3ZlcndyaXRlIHRoZSBjb250ZW50IG9mIGJ1ZiBhbmQgdGhlCi0vLyBmaW5hbCBzaXplIGlzIHJldHVybmVkLgotc2l6ZV90IFRyeURlZmxhdGUodTEgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkgewotICB1MSAqb3V0YnVmID0gcmVpbnRlcnByZXRfY2FzdDx1MSAqPihtYWxsb2MobGVuZ3RoKSk7Ci0gIHpfc3RyZWFtIHN0cmVhbTsKLQotICAvLyBJbml0aWFsaXplIHRoZSB6X3N0cmVhbSBzdHJjdXQgZm9yIHJlYWRpbmcgZnJvbSBidWYgYW5kIHdyaW50aW5nIGluIG91dGJ1Zi4KLSAgc3RyZWFtLnphbGxvYyA9IFpfTlVMTDsKLSAgc3RyZWFtLnpmcmVlID0gWl9OVUxMOwotICBzdHJlYW0ub3BhcXVlID0gWl9OVUxMOwotICBzdHJlYW0udG90YWxfaW4gPSBsZW5ndGg7Ci0gIHN0cmVhbS5hdmFpbF9pbiA9IGxlbmd0aDsKLSAgc3RyZWFtLnRvdGFsX291dCA9IGxlbmd0aDsKLSAgc3RyZWFtLmF2YWlsX291dCA9IGxlbmd0aDsKLSAgc3RyZWFtLm5leHRfaW4gPSBidWY7Ci0gIHN0cmVhbS5uZXh0X291dCA9IG91dGJ1ZjsKLQotICAvLyBkZWZsYXRlSW5pdDIgbmVnYXRpdmUgd2luZG93cyBzaXplIHByZXZlbnQgdGhlIHpsaWIgd3JhcHBlciB0byBiZSB1c2VkLgotICBpZiAoZGVmbGF0ZUluaXQyKCZzdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgWl9ERUZMQVRFRCwKLSAgICAgICAgICAgICAgICAgIC1NQVhfV0JJVFMsIDgsIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykgewotICAgIC8vIEZhaWx1cmUgdG8gY29tcHJlc3MgPT4gcmV0dXJuIHRoZSBidWZmZXIgdW5jb21wcmVzc2VkCi0gICAgZnJlZShvdXRidWYpOwotICAgIHJldHVybiBsZW5ndGg7Ci0gIH0KLQotICBpZiAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgLy8gQ29tcHJlc3Npb24gc3VjY2Vzc2Z1bCBhbmQgZml0cyBpbiBvdXRidWYsIGxldCdzIGNvcHkgdGhlIHJlc3VsdCBpbiBidWYuCi0gICAgbGVuZ3RoID0gc3RyZWFtLnRvdGFsX291dDsKLSAgICBtZW1jcHkoYnVmLCBvdXRidWYsIGxlbmd0aCk7Ci0gIH0KLQotICBkZWZsYXRlRW5kKCZzdHJlYW0pOwotICBmcmVlKG91dGJ1Zik7Ci0KLSAgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBidWZmZXIKLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotc2l6ZV90IE91dHB1dFppcEZpbGU6OldyaXRlRmlsZVNpemVJbkxvY2FsRmlsZUhlYWRlcih1MSAqaGVhZGVyX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG91dF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29tcHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU0IGNyYykgewotICBzaXplX3QgY29tcHJlc3NlZF9zaXplID0gb3V0X2xlbmd0aDsKLSAgaWYgKGNvbXByZXNzKSB7Ci0gICAgY29tcHJlc3NlZF9zaXplID0gVHJ5RGVmbGF0ZShxLCBvdXRfbGVuZ3RoKTsKLSAgfQotICAvLyBjb21wcmVzc2lvbiBtZXRob2QKLSAgaWYgKGNvbXByZXNzZWRfc2l6ZSA8IG91dF9sZW5ndGgpIHsKLSAgICBwdXRfdTJsZShoZWFkZXJfcHRyLCBDT01QUkVTU0lPTl9NRVRIT0RfREVGTEFURUQpOwotICB9IGVsc2UgewotICAgIHB1dF91MmxlKGhlYWRlcl9wdHIsIENPTVBSRVNTSU9OX01FVEhPRF9TVE9SRUQpOwotICB9Ci0gIGhlYWRlcl9wdHIgKz0gNDsKLSAgcHV0X3U0bGUoaGVhZGVyX3B0ciwgY3JjKTsgICAgICAgICAgICAgIC8vIGNyYzMyCi0gIHB1dF91NGxlKGhlYWRlcl9wdHIsIGNvbXByZXNzZWRfc2l6ZSk7ICAvLyBjb21wcmVzc2VkX3NpemUKLSAgcHV0X3U0bGUoaGVhZGVyX3B0ciwgb3V0X2xlbmd0aCk7ICAgICAgIC8vIHVuY29tcHJlc3NlZF9zaXplCi0gIHJldHVybiBjb21wcmVzc2VkX3NpemU7Ci19Ci0KLWludCBPdXRwdXRaaXBGaWxlOjpGaW5pc2goKSB7Ci0gIGlmIChmZF9vdXQgPiAwKSB7Ci0gICAgV3JpdGVDZW50cmFsRGlyZWN0b3J5KCk7Ci0gICAgaWYgKGZ0cnVuY2F0ZShmZF9vdXQsIEdldFNpemUoKSkgPCAwKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImZ0cnVuY2F0ZShmZF9vdXQsIEdldFNpemUoKSk6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgaWYgKGNsb3NlKGZkX291dCkgPCAwKSB7Ci0gICAgICByZXR1cm4gZXJyb3IoImNsb3NlKGZkX291dCk6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci0gICAgZmRfb3V0ID0gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXUxKiBPdXRwdXRaaXBGaWxlOjpOZXdGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKSB7Ci0gIGhlYWRlcl9wdHIgPSBXcml0ZUxvY2FsRmlsZUhlYWRlcihmaWxlbmFtZSwgYXR0cik7Ci0gIHJldHVybiBxOwotfQotCi1pbnQgT3V0cHV0WmlwRmlsZTo6RmluaXNoRmlsZShzaXplX3QgZmlsZWxlbmd0aCwgYm9vbCBjb21wcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29tcHV0ZV9jcmMpIHsKLSAgdTQgY3JjID0gMDsKLSAgaWYgKGNvbXB1dGVfY3JjKSB7Ci0gICAgY3JjID0gY3JjMzIoY3JjLCBxLCBmaWxlbGVuZ3RoKTsKLSAgfQotICBzaXplX3QgY29tcHJlc3NlZF9zaXplID0KLSAgICAgIFdyaXRlRmlsZVNpemVJbkxvY2FsRmlsZUhlYWRlcihoZWFkZXJfcHRyLCBmaWxlbGVuZ3RoLCBjb21wcmVzcywgY3JjKTsKLSAgZW50cmllc18uYmFjaygpLT5jcmMzMiA9IGNyYzsKLSAgZW50cmllc18uYmFjaygpLT5jb21wcmVzc2VkX2xlbmd0aCA9IGNvbXByZXNzZWRfc2l6ZTsKLSAgZW50cmllc18uYmFjaygpLT51bmNvbXByZXNzZWRfbGVuZ3RoID0gZmlsZWxlbmd0aDsKLSAgaWYgKGNvbXByZXNzZWRfc2l6ZSA8IGZpbGVsZW5ndGgpIHsKLSAgICBlbnRyaWVzXy5iYWNrKCktPmNvbXByZXNzaW9uX21ldGhvZCA9IENPTVBSRVNTSU9OX01FVEhPRF9ERUZMQVRFRDsKLSAgfSBlbHNlIHsKLSAgICBlbnRyaWVzXy5iYWNrKCktPmNvbXByZXNzaW9uX21ldGhvZCA9IENPTVBSRVNTSU9OX01FVEhPRF9TVE9SRUQ7Ci0gIH0KLSAgcSArPSBjb21wcmVzc2VkX3NpemU7Ci0gIHJldHVybiAwOwotfQotCi1aaXBCdWlsZGVyKiBaaXBCdWlsZGVyOjpDcmVhdGUoY29uc3QgY2hhciogemlwX2ZpbGUsIHU4IGVzdGltYXRlZF9zaXplKSB7Ci0gIGlmIChlc3RpbWF0ZWRfc2l6ZSA+IGtNYXhpbXVtT3V0cHV0U2l6ZSkgewotICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgIlVuY29tcHJlc3NlZCBpbnB1dCBqYXIgaGFzIHNpemUgJWxsdSwgIgotICAgICAgICAgICAgIndoaWNoIGV4Y2VlZHMgdGhlIG1heGltdW0gc3VwcG9ydGVkIG91dHB1dCBzaXplICVsbHUuXG4iCi0gICAgICAgICAgICAiQXNzdW1pbmcgdGhhdCBpamFyIHdpbGwgYmUgc21hbGxlciBhbmQgaG9waW5nIGZvciB0aGUgYmVzdC5cbiIsCi0gICAgICAgICAgICBlc3RpbWF0ZWRfc2l6ZSwga01heGltdW1PdXRwdXRTaXplKTsKLSAgICBlc3RpbWF0ZWRfc2l6ZSA9IGtNYXhpbXVtT3V0cHV0U2l6ZTsKLSAgfQotCi0gIGludCBmZF9vdXQgPSBvcGVuKHppcF9maWxlLCBPX0NSRUFUfE9fUkRXUnxPX1RSVU5DLCAwNjQ0KTsKLSAgaWYgKGZkX291dCA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIENyZWF0ZSBtbWFwLWFibGUgc3BhcnNlIGZpbGUKLSAgaWYgKGZ0cnVuY2F0ZShmZF9vdXQsIGVzdGltYXRlZF9zaXplKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIEVuc3VyZSB0aGF0IGFueSBidWZmZXIgb3ZlcmZsb3cgaW4gSmFyU3RyaXBwZXIgd2lsbCByZXN1bHQgaW4KLSAgLy8gU0lHU0VHViBvciBTSUdCVVMgYnkgb3Zlci1hbGxvY2F0aW5nIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICBzaXplX3QgbW1hcF9sZW5ndGggPSBzdGQ6Om1pbihlc3RpbWF0ZWRfc2l6ZSArIHN5c2NvbmYoX1NDX1BBR0VTSVpFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4KSBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpKTsKLQotICB2b2lkICp6aXBkYXRhX291dCA9IG1tYXAoTlVMTCwgbW1hcF9sZW5ndGgsIFBST1RfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZF9vdXQsIDApOwotICBpZiAoemlwZGF0YV9vdXQgPT0gTUFQX0ZBSUxFRCkgewotICAgIGZwcmludGYoc3RkZXJyLCAib3V0cHV0X2xlbmd0aD0lbGx1XG4iLCBlc3RpbWF0ZWRfc2l6ZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gbmV3IE91dHB1dFppcEZpbGUoZmRfb3V0LCAodTEqKSB6aXBkYXRhX291dCk7Ci19Ci0KLXU4IFppcEJ1aWxkZXI6OkVzdGltYXRlU2l6ZShjaGFyICoqZmlsZXMpIHsKLSAgc3RydWN0IHN0YXQgc3RhdHN0OwotICAvLyBEaWdpdGFsIHNpZ25hdHVyZSBmaWVsZCBzaXplID0gNiwgRW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5ID0gMjIsIFRvdGFsID0gMjgKLSAgdTggc2l6ZSA9IDI4OwotICAvLyBDb3VudCB0aGUgc2l6ZSBvZiBhbGwgdGhlIGZpbGVzIGluIHRoZSBpbnB1dCB0byBlc3RpbWF0ZSB0aGUgc2l6ZSBvZiB0aGUKLSAgLy8gb3V0cHV0LgotICBmb3IgKGludCBpID0gMDsgZmlsZXNbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgaWYgKHN0YXQoZmlsZXNbaV0sICZzdGF0c3QpICE9IDApIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZSAlcyBkb2VzIG5vdCBzZWVtIHRvIGV4aXN0LiIsIGZpbGVzW2ldKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzaXplICs9IHN0YXRzdC5zdF9zaXplOwotICAgIC8vIEFkZCBzaXplcyBvZiBaaXAgbWV0YSBkYXRhCi0gICAgLy8gbG9jYWwgZmlsZSBoZWFkZXIgPSAzMCBieXRlcwotICAgIC8vIGRhdGEgZGVzY3JpcHRvciA9IDEyIGJ5dGVzCi0gICAgLy8gY2VudHJhbCBkaXJlY3RvcnkgZGVzY3JpcHRvciA9IDQ2IGJ5dGVzCi0gICAgLy8gICAgVG90YWw6IDg4Ynl0ZXMKLSAgICBzaXplICs9IDg4OwotICAgIC8vIFRoZSBmaWxlbmFtZSBpcyBzdG9yZWQgdHdpY2UgKG9uY2UgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5Ci0gICAgLy8gYW5kIG9uY2UgaW4gdGhlIGxvY2FsIGZpbGUgaGVhZGVyKS4KLSAgICBzaXplICs9IHN0cmxlbihmaWxlc1tpXSkgKiAyOwotICB9Ci0gIHJldHVybiBzaXplOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZGV2dG9vbHNfaWphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWphci96aXAuaCBiL3Rvb2xzL2lqYXIvemlwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTJjNmUuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaWphci96aXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotLy8gemlwLmggLS0gLnppcCAoLmphcikgZmlsZSByZWFkaW5nL3dyaXRpbmcgcm91dGluZXMuCi0vLwotLy8gVGhpcyBmaWxlIHNwZWNpZmllcyB0aGUgaW50ZXJmYWNlIHRvIHVzZSB0aGUgWklQIGltcGxlbWVudGF0aW9uIG9mIGlqYXIuCi0vLwotCi0jaWZuZGVmIElOQ0xVREVEX1RISVJEX1BBUlRZX0lKQVJfWklQX0gKLSNkZWZpbmUgSU5DTFVERURfVEhJUkRfUEFSVFlfSUpBUl9aSVBfSAotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLS8vIFRlbGxzIGlmIHRoaXMgaXMgYSBkaXJlY3RvcnkgZW50cnkgZnJvbSB0aGUgbW9kZS4gVGhpcyBtZXRob2QKLS8vIGlzIHNhZmVyIHRoYW4gemlwYXR0cl90b19tb2RlKGF0dHIpICYgU19JRkRJUiBiZWNhdXNlIHRoZSB1bml4Ci0vLyBtb2RlIG1pZ2h0IG5vdCBiZSBzZXQgaW4gRE9TIHppcCBmaWxlcy4KLWlubGluZSBib29sIHppcGF0dHJfaXNfZGlyKHU0IGF0dHIpIHsgcmV0dXJuIChhdHRyICYgMHgxMCkgIT0gMDsgfQotCi0vLyBDb252ZXJ0IGEgVW5peCBmaWxlIG1vZGUgdG8gYSBaSVAgZmlsZSBhdHRyaWJ1dGUKLWlubGluZSB1NCBtb2RlX3RvX3ppcGF0dHIobW9kZV90IG0pIHsKLSAgcmV0dXJuICgoKHU0KSBtKSA8PCAxNikgKyAoKG0gJiBTX0lGRElSKSAhPSAwID8gMHgxMCA6IDApOwotfQotCi0vLyBDb252ZXJ0IGEgWklQIGZpbGUgYXR0cmlidXRlIHRvIGEgVW5peCBmaWxlIG1vZGUKLWlubGluZSBtb2RlX3QgemlwYXR0cl90b19tb2RlKHU0IGF0dHIpIHsKLSAgcmV0dXJuICgobW9kZV90KSAoKGF0dHIgPj4gMTYpICYgMHhmZmZmKSk7Ci19Ci0KLS8vCi0vLyBDbGFzcyBpbnRlcmZhY2UgZm9yIGJ1aWxkaW5nIFpJUCBmaWxlcwotLy8KLWNsYXNzIFppcEJ1aWxkZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+WmlwQnVpbGRlcigpIHt9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhc3QgZXJyb3IsIG9yIG51bGwgb24gbm8gbGFzdCBlcnJvci4KLSAgdmlydHVhbCBjb25zdCBjaGFyKiBHZXRFcnJvcigpID0gMDsKLQotICAvLyBBZGQgYSBuZXcgZmlsZSB0byB0aGUgWklQLCB0aGUgZmlsZSB3aWxsIGhhdmUgcGF0aCAiZmlsZW5hbWUiCi0gIC8vIGFuZCBleHRlcm5hbCBhdHRyaWJ1dGVzICJhdHRyIi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlcgotICAvLyB0byBhIG1lbW9yeSBidWZmZXIgdG8gd3JpdGUgdGhlIGRhdGEgb2YgdGhlIGZpbGUgaW50by4gVGhpcyBidWZmZXIKLSAgLy8gaXMgb3duZWQgYnkgWmlwQnVpbGRlciBhbmQgc2hvdWxkIG5vdCBiZSBmcmVlJ2QgYnkgdGhlIGNhbGxlci4gVGhlCi0gIC8vIGZpbGUgbGVuZ3RoIGlzIHRoZW4gc3BlY2lmaWVkIHdoZW4gdGhlIGZpbGVzIGlzIGZpbmlzaGVkIHdyaXR0ZW4KLSAgLy8gdXNpbmcgdGhlIEZpbmlzaEZpbGUoc2l6ZV90KSBmdW5jdGlvbi4KLSAgLy8gT24gZmFpbHVyZSwgcmV0dXJucyBOVUxMIGFuZCBHZXRFcnJvcigpIHdpbGwgcmV0dXJuIGFuIG5vbi1lbXB0eSBtZXNzYWdlLgotICB2aXJ0dWFsIHUxKiBOZXdGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCB1NCBhdHRyKSA9IDA7Ci0KLSAgLy8gRmluaXNoIHdyaXRpbmcgYSBmaWxlIGFuZCBzcGVjaWZ5IGl0cyBsZW5ndGguIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKLSAgLy8gb25lIHNob3VsZCBub3QgcmV1c2UgdGhlIHBvaW50ZXIgZ2l2ZW4gYnkgTmV3RmlsZS4gVGhlIGZpbGUgY2FuIGJlCi0gIC8vIGNvbXByZXNzZWQgdXNpbmcgdGhlIGRlZmxhdGUgYWxnb3JpdGhtIGJ5IHNldHRpbmcgYGNvbXByZXNzYCB0byB0cnVlLgotICAvLyBCeSBkZWZhdWx0LCBDUkMzMiBhcmUgbm90IGNvbXB1dGVkIGFzIGphdmEgdG9vbGluZyBkb2Vzbid0IGNhcmUsIGJ1dAotICAvLyBjb21wdXRpbmcgaXQgY2FuIGJlIGFjdGl2YXRlZCBieSBzZXR0aW5nIGBjb21wdXRlX2NyY2AgdG8gdHJ1ZS4KLSAgLy8gT24gZmFpbHVyZSwgcmV0dXJucyAtMSBhbmQgR2V0RXJyb3IoKSB3aWxsIHJldHVybiBhbiBub24tZW1wdHkgbWVzc2FnZS4KLSAgdmlydHVhbCBpbnQgRmluaXNoRmlsZShzaXplX3QgZmlsZWxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbXByZXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb21wdXRlX2NyYyA9IGZhbHNlKSA9IDA7Ci0KLSAgLy8gV3JpdGUgYW4gZW1wdHkgZmlsZSwgaXQgaXMgZXF1aXZhbGVudCB0bzoKLSAgLy8gICBOZXdGaWxlKGZpbGVuYW1lLCAwKTsKLSAgLy8gICBGaW5pc2hGaWxlKDApOwotICAvLyBPbiBmYWlsdXJlLCByZXR1cm5zIC0xIGFuZCBHZXRFcnJvcigpIHdpbGwgcmV0dXJuIGFuIG5vbi1lbXB0eSBtZXNzYWdlLgotICB2aXJ0dWFsIGludCBXcml0ZUVtcHR5RmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSkgPSAwOwotCi0gIC8vIEZpbmlzaCB3cml0aW5nIHRoZSBaSVAgZmlsZS4gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UKLSAgLy8gKHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBkbyBub3RoaW5nKSBhbmQgbm9uZSBvZgotICAvLyBOZXdGaWxlL0ZpbmlzaEZpbGUvV3JpdGVFbXB0eUZpbGUgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIEZpbmlzaC4gSWYKLSAgLy8gdGhpcyBtZXRob2Qgd2FzIG5vdCBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZCwgaXQgd2lsbCBiZSBjYWxsZWQuCi0gIC8vIEl0IGlzIGhlcmUgYXMgYSBjb252ZW5pZW5jZSB0byBnZXQgaW5mb3JtYXRpb24gb24gdGhlIGZpbmFsIGdlbmVyYXRlZCBaSVAKLSAgLy8gZmlsZS4KLSAgLy8gT24gZmFpbHVyZSwgcmV0dXJucyAtMSBhbmQgR2V0RXJyb3IoKSB3aWxsIHJldHVybiBhbiBub24tZW1wdHkgbWVzc2FnZS4KLSAgdmlydHVhbCBpbnQgRmluaXNoKCkgPSAwOwotCi0gIC8vIEdldCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBaSVAgZmlsZS4gVGhpcyBzaXplIHdpbGwgbm90IGJlIG1hdGNoaW5nIHRoZQotICAvLyBmaW5hbCBaSVAgZmlsZSB1bnRpbCBGaW5pc2goKSBoYXMgYmVlbiBjYWxsZWQgYmVjYXVzZSBGaW5pc2goKSBpcyBhY3R1YWxseQotICAvLyB3cml0aW5nIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBvZiB0aGUgWklQIEZpbGUuCi0gIHZpcnR1YWwgc2l6ZV90IEdldFNpemUoKSA9IDA7Ci0KLSAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBudW1iZXIgb2YgZmlsZXMgc3RvcmVkIGluIHRoZSBaSVAuCi0gIHZpcnR1YWwgaW50IEdldE51bWJlckZpbGVzKCkgPSAwOwotCi0gIC8vIENyZWF0ZSBhIG5ldyBaaXBCdWlsZGVyIHdyaXRpbmcgdGhlIGZpbGUgemlwX2ZpbGUgYW5kIHRoZSBzaXplIG9mIHRoZQotICAvLyBvdXRwdXQgd2lsbCBiZSBhdCBtb3N0IGVzdGltYXRlZF9zaXplLiBVc2UgWmlwQnVpbGRlcjo6RXN0aW1hdGVTaXplKCkgb3IKLSAgLy8gWmlwRXh0cmFjdG9yOjpDYWxjdWxhdGVPdXB1dExlbmd0aCgpIHRvIGhhdmUgYW4gZXN0aW1hdGVkX3NpemUgZGVwZW5kaW5nIG9uCi0gIC8vIGEgbGlzdCBvZiBmaWxlIHRvIHN0b3JlLgotICAvLyBPbiBmYWlsdXJlLCByZXR1cm5zIE5VTEwuIFJlZmVyIHRvIGVycm5vIGZvciBlcnJvciBjb2RlLgotICBzdGF0aWMgWmlwQnVpbGRlciogQ3JlYXRlKGNvbnN0IGNoYXIqIHppcF9maWxlLCB1OCBlc3RpbWF0ZWRfc2l6ZSk7Ci0KLSAgLy8gRXN0aW1hdGUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgWklQIGZpbGVzIGNvbnRhaW5pbmcgZmlsZXMgaW4gdGhlICJmaWxlcyIKLSAgLy8gbnVsbC10ZXJtaW5hdGVkIGFycmF5LgotICAvLyBSZXR1cm5zIDAgb24gZXJyb3IuCi0gIHN0YXRpYyB1OCBFc3RpbWF0ZVNpemUoY2hhciAqKmZpbGVzKTsKLX07Ci0KLS8vCi0vLyBBbiBhYnN0cmFjdCBjbGFzcyB0byBwcm9jZXNzIGRhdGEgZnJvbSBhIFppcEV4dHJhY3Rvci4KLS8vIERlcml2ZSBmcm9tIHRoaXMgY2xhc3MgaWYgeW91IHdpc2ggdG8gcHJvY2VzcyBkYXRhIGZyb20gYSBaaXBFeHRyYWN0b3IuCi0vLwotY2xhc3MgWmlwRXh0cmFjdG9yUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgflppcEV4dHJhY3RvclByb2Nlc3NvcigpIHt9Ci0KLSAgLy8gVGVsbHMgd2hldGhlciB0byBza2lwIG9yIHByb2Nlc3MgdGhlIGZpbGUgImZpbGVuYW1lIi4gImF0dHIiIGlzIHRoZQotICAvLyBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgYW5kIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdW5peCBtb2RlIHVzaW5nIHRoZQotICAvLyB6aXBhdHRyX3RvX21vZGUoKSBmdW5jdGlvbi4gVGhpcyBtZXRob2QgaXMgc3VwcG9lZCB0byByZXR1cm5zIHRydWUKLSAgLy8gaWYgdGhlIGZpbGUgc2hvdWxkIGJlIHByb2Nlc3NlZCBhbmQgZmFsc2UgaWYgaXQgc2hvdWxkIGJlIHNraXBwZWQuCi0gIHZpcnR1YWwgYm9vbCBBY2NlcHQoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIpID0gMDsKLQotICAvLyBQcm9jZXNzIGEgZmlsZSBhY2NlcHRlZCBieSBBY2NlcHQuIFRoZSBmaWxlICJmaWxlbmFtZSIgaGFzIGV4dGVybmFsCi0gIC8vIGF0dHJpYnV0ZXMgImF0dHIiIGFuZCBsZW5ndGggInNpemUiLiBUaGUgZmlsZSBjb250ZW50IGlzIGFjY2Vzc2libGUKLSAgLy8gaW4gdGhlIGJ1ZmZlciBwb2ludGVkIGJ5ICJkYXRhIi4KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUxKiBkYXRhLCBjb25zdCBzaXplX3Qgc2l6ZSkgPSAwOwotfTsKLQotLy8KLS8vIENsYXNzIGludGVyZmFjZSBmb3IgcmVhZGluZyBaSVAgZmlsZXMKLS8vCi1jbGFzcyBaaXBFeHRyYWN0b3IgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+WmlwRXh0cmFjdG9yKCkge30KLQotICAvLyBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbGFzdCBlcnJvciwgb3IgbnVsbCBvbiBubyBsYXN0IGVycm9yLgotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIEdldEVycm9yKCkgPSAwOwotCi0gIC8vIFByb2Nlc3MgdGhlIG5leHQgZmlsZXMsIHJldHVybnMgZmFsc2UgaWYgdGhlIGVuZCBvZiBaSVAgZmlsZSBoYXMgYmVlbgotICAvLyByZWFjaGVkLiBUaGUgcHJvY2Vzc29yIHByb3ZpZGVkIGJ5IHRoZSBDcmVhdGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCi0gIC8vIGlmIGEgZmlsZSBpcyBlbmNvdW50ZXJlZC4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKLSAgLy8gb2YgR2V0RXJyb3IoKSBmb3IgcG90ZW50aWFsIGVycm9ycy4KLSAgdmlydHVhbCBib29sIFByb2Nlc3NOZXh0KCkgPSAwOwotCi0gIC8vIFByb2Nlc3MgdGhlIGFsbCBmaWxlcywgcmV0dXJucyAtMSBvbiBlcnJvciAoR2V0RXJyb3IoKSB3aWxsIGJlIHBvcHVsYXRlZAotICAvLyBvbiBlcnJvcikuCi0gIHZpcnR1YWwgaW50IFByb2Nlc3NBbGwoKTsKLQotICAvLyBSZXNldCB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcuCi0gIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsKLQotICAvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIFpJUCBmaWxlLgotICB2aXJ0dWFsIHNpemVfdCBHZXRTaXplKCkgPSAwOwotCi0gIC8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHppcCBmaWxlIGJ5IGtlZXBpbmcgb25seSBmaWxlCi0gIC8vIGFjY2VwdGVkIGJ5IHRoZSBwcm9jZXNzb3IgYW5kIHN0b3JpbmcgdGhlbSB1bmNvbXByZXNzZWQuIFRoaXMKLSAgLy8gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIFppcEJ1aWxkZXIgZm9yIHN0b3JpbmcgYSBzdWJzZXQKLSAgLy8gb2YgdGhlIGlucHV0IGZpbGVzLgotICAvLyBPbiBlcnJvciwgMCBpcyByZXR1cm5lZCBhbmQgR2V0RXJyb3IoKSByZXR1cm5zIGEgbm9uLWVtcHR5IG1lc3NhZ2UuCi0gIHZpcnR1YWwgdTggQ2FsY3VsYXRlT3V0cHV0TGVuZ3RoKCkgPSAwOwotCi0gIC8vIENyZWF0ZSBhIFppcEV4dHJhY3RvciB0aGF0IGV4dHJhY3QgdGhlIHppcCBmaWxlICJmaWxlbmFtZSIgYW5kIHByb2Nlc3MKLSAgLy8gaXQgd2l0aCAicHJvY2Vzc29yIi4KLSAgLy8gT24gZXJyb3IsIGEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkIGFuZCB0aGUgdmFsdWUgb2YgZXJybm8gc2hvdWxkIGJlCi0gIC8vIGNoZWNrZWQuCi0gIHN0YXRpYyBaaXBFeHRyYWN0b3IqIENyZWF0ZShjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFppcEV4dHJhY3RvclByb2Nlc3NvciAqcHJvY2Vzc29yKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXZ0b29sc19pamFyCi0KLSNlbmRpZiAgLy8gSU5DTFVERURfVEhJUkRfUEFSVFlfSUpBUl9aSVBfSApkaWZmIC0tZ2l0IGEvdG9vbHMvaWphci96aXBfbWFpbi5jYyBiL3Rvb2xzL2lqYXIvemlwX21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNGE1MGMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvaWphci96aXBfbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIEF1dGhvcjogQWxhbiBEb25vdmFuIDxhZG9ub3ZhbkBnb29nbGUuY29tPgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS8vCi0vLyBaaXAgLyBVbnppcCBmaWxlIHVzaW5nIGlqYXIgemlwIGltcGxlbWVudGF0aW9uLgotLy8KLS8vIE5vdGUgdGhhdCB0aGlzIFppcCBpbXBsZW1lbnRhdGlvbiBpbnRlbnRpb25hbGx5IGRvbid0IGNvbXB1dGUgQ1JDLTMyCi0vLyBiZWNhdXNlIGl0IGlzIHVzZWxlc3MgY29tcHV0YXRpb24gZm9yIGphciBiZWNhdXNlIEphdmEgZG9lc24ndCBjYXJlLgotLy8gQ1JDLTMyIG9mIGFsbCBmaWxlcyBpbiB0aGUgemlwIGZpbGUgd2lsbCBiZSBzZXQgdG8gMC4KLS8vCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInppcC5oIgotCi1uYW1lc3BhY2UgZGV2dG9vbHNfaWphciB7Ci0KLSNkZWZpbmUgU1lTQ0FMTChleHByKSAgZG8geyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChleHByKSA8IDApIHsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCNleHByKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQotCi0vLwotLy8gQSBaaXBFeHRyYWN0b3JQcm9jZXNzb3IgdGhhdCBleHRyYWN0IGFsbCBmaWxlcyBpbiB0aGUgWklQIGZpbGUuCi0vLwotY2xhc3MgVW56aXBQcm9jZXNzb3IgOiBwdWJsaWMgWmlwRXh0cmFjdG9yUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZSBhIHByb2Nlc3NvciB3aG8gd2lsbCBleHRyYWN0IHRoZSBmaWxlcyBpbnRvIG91dHB1dF9yb290Ci0gIC8vIGlmICJleHRyYWN0IiBpcyBzZXQgdG8gdHJ1ZSBhbmQgd2lsbCBwcmludCB0aGUgbGlzdCBvZiBmaWxlcyBhbmQKLSAgLy8gdGhlaXIgdW5peCBtb2RlcyBpZiAidmVyYm9zZSIgaXMgc2V0IHRvIHRydWUuCi0gIFVuemlwUHJvY2Vzc29yKGNvbnN0IGNoYXIgKm91dHB1dF9yb290LCBib29sIHZlcmJvc2UsIGJvb2wgZXh0cmFjdCkKLSAgICA6IG91dHB1dF9yb290XyhvdXRwdXRfcm9vdCksIHZlcmJvc2VfKHZlcmJvc2UpLCBleHRyYWN0XyhleHRyYWN0KSB7fQotICB2aXJ0dWFsIH5VbnppcFByb2Nlc3NvcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIFByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUxKiBkYXRhLCBjb25zdCBzaXplX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgYm9vbCBBY2NlcHQoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgY2hhciAqb3V0cHV0X3Jvb3RfOwotICBjb25zdCBib29sIHZlcmJvc2VfOwotICBjb25zdCBib29sIGV4dHJhY3RfOwotfTsKLQotLy8gQ29uY2F0ZW5lIDIgcGF0aCwgcGF0aDEgYW5kIHBhdGgyLCB1c2luZyAvIGFzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBhbmQKLS8vIHB1dGluZyB0aGUgcmVzdWx0IGluICJvdXQiLiAic2l6ZSIgc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgotdm9pZCBjb25jYXRfcGF0aChjaGFyKiBvdXQsIGNvbnN0IHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoMSwgY29uc3QgY2hhciAqcGF0aDIpIHsKLSAgaW50IGxlbjEgPSBzdHJsZW4ocGF0aDEpOwotICBzaXplX3QgbCA9IGxlbjE7Ci0gIHN0cm5jcHkob3V0LCBwYXRoMSwgc2l6ZSAtIDEpOwotICBvdXRbc2l6ZS0xXSA9IDA7Ci0gIGlmIChsIDwgc2l6ZSAtIDEgJiYgcGF0aDFbbGVuMV0gIT0gJy8nICYmIHBhdGgyWzBdICE9ICcvJykgewotICAgIG91dFtsXSA9ICcvJzsKLSAgICBsKys7Ci0gICAgb3V0W2xdID0gMDsKLSAgfQotICBpZiAobCA8IHNpemUgLSAxKSB7Ci0gICAgc3RybmNhdChvdXQsIHBhdGgyLCBzaXplIC0gMSAtIGwpOwotICB9Ci19Ci0KLS8vIERvIGEgcmVjdXJzaXZlIG1rZGlyIG9mIGFsbCBmb2xkZXJzIG9mIHBhdGggZXhjZXB0IHRoZSBsYXN0IHBhdGgKLS8vIHNlZ21lbnQgKGlmIHBhdGggZW5kcyB3aXRoIGEgLyB0aGVuIHRoZSBsYXN0IHBhdGggc2VnbWVudCBpcyBlbXB0eSkuCi0vLyBBbGwgZm9sZGVycyBhcmUgY3JlYXRlZCB1c2luZyAibW9kZSIgZm9yIGNyZWF0aW9uIG1vZGUuCi12b2lkIG1rZGlycyhjb25zdCBjaGFyICpwYXRoLCBtb2RlX3QgbW9kZSkgewotICBjaGFyIHBhdGhfW1BBVEhfTUFYXTsKLSAgc3RydWN0IHN0YXQgc3RhdHN0OwotICBzdHJuY3B5KHBhdGhfLCBwYXRoLCBQQVRIX01BWCk7Ci0gIHBhdGhfW1BBVEhfTUFYLTFdID0gMDsKLSAgY2hhciAqcG9pbnRlciA9IHBhdGhfOwotICB3aGlsZSAoKHBvaW50ZXIgPSBzdHJjaHIocG9pbnRlciwgJy8nKSkgIT0gTlVMTCkgewotICAgIGlmIChwYXRoXyAhPSBwb2ludGVyKSB7ICAvLyBza2lwIGxlYWRpbmcgc2xhc2gKLSAgICAgICpwb2ludGVyID0gMDsKLSAgICAgIGlmIChzdGF0KHBhdGhfLCAmc3RhdHN0KSAhPSAwKSB7Ci0gICAgICAgIGlmIChta2RpcihwYXRoXywgbW9kZSkgPCAwKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgY3JlYXRlIGZvbGRlciAlczogJXNcbiIsCi0gICAgICAgICAgICAgICAgICBwYXRoXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICBhYm9ydCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAqcG9pbnRlciA9ICcvJzsKLSAgICB9Ci0gICAgcG9pbnRlcisrOwotICB9Ci19Ci0KLXZvaWQgVW56aXBQcm9jZXNzb3I6OlByb2Nlc3MoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IHU0IGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUxKiBkYXRhLCBjb25zdCBzaXplX3Qgc2l6ZSkgewotICBtb2RlX3QgbW9kZSA9IHppcGF0dHJfdG9fbW9kZShhdHRyKTsKLSAgbW9kZV90IHBlcm0gPSBtb2RlICYgMDc3NzsKLSAgYm9vbCBpc2RpciA9IChtb2RlICYgU19JRkRJUikgIT0gMDsKLSAgaWYgKGF0dHIgPT0gMCkgewotICAgIC8vIEZhbGxiYWNrIHdoZW4gdGhlIGV4dGVybmFsIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LgotICAgIGlzZGlyID0gZmlsZW5hbWVbc3RybGVuKGZpbGVuYW1lKS0xXSA9PSAnLyc7Ci0gICAgcGVybSA9IDA3Nzc7Ci0gIH0KLSAgaWYgKHZlcmJvc2VfKSB7Ci0gICAgcHJpbnRmKCIlYyAlbyAlc1xuIiwgaXNkaXIgPyAnZCcgOiAnZicsIHBlcm0sIGZpbGVuYW1lKTsKLSAgfQotICBpZiAoZXh0cmFjdF8pIHsKLSAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOwotICAgIGludCBmZDsKLSAgICBjb25jYXRfcGF0aChwYXRoLCBQQVRIX01BWCwgb3V0cHV0X3Jvb3RfLCBmaWxlbmFtZSk7Ci0gICAgbWtkaXJzKHBhdGgsIHBlcm0pOwotICAgIGlmICghaXNkaXIpIHsKLSAgICAgIGZkID0gb3BlbihwYXRoLCBPX0NSRUFUIHwgT19XUk9OTFksIHBlcm0pOwotICAgICAgaWYgKGZkIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGZpbGUgJXMgZm9yIHdyaXRpbmc6ICVzXG4iLAotICAgICAgICAgICAgICAgIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGFib3J0KCk7Ci0gICAgICB9Ci0gICAgICBTWVNDQUxMKHdyaXRlKGZkLCBkYXRhLCBzaXplKSk7Ci0gICAgICBTWVNDQUxMKGNsb3NlKGZkKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEdldCB0aGUgYmFzZW5hbWUgb2YgcGF0aCBhbmQgc3RvcmUgaXQgaW4gb3V0cHV0LiBvdXRwdXRfc2l6ZQotLy8gaXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCi12b2lkIGJhc2VuYW1lKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKm91dHB1dCwgc2l6ZV90IG91dHB1dF9zaXplKSB7Ci0gIGNvbnN0IGNoYXIgKnBvaW50ZXIgPSBzdHJyY2hyKHBhdGgsICcvJyk7Ci0gIGlmIChwb2ludGVyID09IE5VTEwpIHsKLSAgICBwb2ludGVyID0gcGF0aDsKLSAgfSBlbHNlIHsKLSAgICBwb2ludGVyKys7ICAvLyBTa2lwIHRoZSBsZWFkaW5nIHNsYXNoLgotICB9Ci0gIHN0cm5jcHkob3V0cHV0LCBwb2ludGVyLCBvdXRwdXRfc2l6ZSk7Ci0gIG91dHB1dFtvdXRwdXRfc2l6ZS0xXSA9IDA7Ci19Ci0KLQotLy8gRXhlY3V0ZSB0aGUgZXh0cmFjdGlvbiAob3IganVzdCBsaXN0aW5nIGlmIGp1c3QgdiBpcyBwcm92aWRlZCkKLWludCBleHRyYWN0KGNoYXIgKnppcGZpbGUsIGJvb2wgdmVyYm9zZSwgYm9vbCBleHRyYWN0KSB7Ci0gIGNoYXIgb3V0cHV0X3Jvb3RbUEFUSF9NQVhdOwotICBnZXRjd2Qob3V0cHV0X3Jvb3QsIFBBVEhfTUFYKTsKLQotICBVbnppcFByb2Nlc3NvciBwcm9jZXNzb3Iob3V0cHV0X3Jvb3QsIHZlcmJvc2UsIGV4dHJhY3QpOwotICBzdGQ6OnVuaXF1ZV9wdHI8WmlwRXh0cmFjdG9yPiBleHRyYWN0b3IoWmlwRXh0cmFjdG9yOjpDcmVhdGUoemlwZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jZXNzb3IpKTsKLSAgaWYgKGV4dHJhY3Rvci5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiB6aXAgZmlsZSAlczogJXMuXG4iLCB6aXBmaWxlLAotICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoZXh0cmFjdG9yLT5Qcm9jZXNzQWxsKCkgPCAwKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICIlcy5cbiIsIGV4dHJhY3Rvci0+R2V0RXJyb3IoKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vLyBFeGVjdXRlIHRoZSBjcmVhdGUgb3BlcmF0aW9uCi1pbnQgY3JlYXRlKGNoYXIgKnppcGZpbGUsIGNoYXIgKipmaWxlcywgYm9vbCBmbGF0dGVuLCBib29sIHZlcmJvc2UsCi0gICAgICAgICAgIGJvb2wgY29tcHJlc3MpIHsKLSAgc3RydWN0IHN0YXQgc3RhdHN0OwotICB1OCBzaXplID0gWmlwQnVpbGRlcjo6RXN0aW1hdGVTaXplKGZpbGVzKTsKLSAgaWYgKHNpemUgPT0gMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8WmlwQnVpbGRlcj4gYnVpbGRlcihaaXBCdWlsZGVyOjpDcmVhdGUoemlwZmlsZSwgc2l6ZSkpOwotICBpZiAoYnVpbGRlci5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIHppcCBmaWxlICVzOiAlcy5cbiIsCi0gICAgICAgICAgICB6aXBmaWxlLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgZmlsZXNbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgc3RhdChmaWxlc1tpXSwgJnN0YXRzdCk7Ci0gICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKLSAgICBib29sIGlzZGlyID0gKHN0YXRzdC5zdF9tb2RlICYgU19JRkRJUikgIT0gMDsKLQotICAgIGlmIChmbGF0dGVuICYmIGlzZGlyKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBwYXRoLCBmbGF0dGVuaW5nIGl0IGlmIHJlcXVlc3RlZAotICAgIGlmIChmbGF0dGVuKSB7Ci0gICAgICBiYXNlbmFtZShmaWxlc1tpXSwgcGF0aCwgUEFUSF9NQVgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJuY3B5KHBhdGgsIGZpbGVzW2ldLCBQQVRIX01BWCk7Ci0gICAgICBwYXRoW1BBVEhfTUFYLTFdID0gMDsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4ocGF0aCk7Ci0gICAgICBpZiAoaXNkaXIgJiYgbGVuIDwgUEFUSF9NQVggLSAxKSB7Ci0gICAgICAgIC8vIEFkZCB0aGUgdHJhaWxpbmcgc2xhc2ggZm9yIGZvbGRlcnMKLSAgICAgICAgcGF0aFtsZW5dID0gJy8nOwotICAgICAgICBwYXRoW2xlbisxXSA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgIG1vZGVfdCBwZXJtID0gc3RhdHN0LnN0X21vZGUgJiAwNzc3OwotICAgICAgcHJpbnRmKCIlYyAlbyAlc1xuIiwgaXNkaXIgPyAnZCcgOiAnZicsIHBlcm0sIHBhdGgpOwotICAgIH0KLQotICAgIHUxICpidWZmZXIgPSBidWlsZGVyLT5OZXdGaWxlKHBhdGgsIG1vZGVfdG9femlwYXR0cihzdGF0c3Quc3RfbW9kZSkpOwotICAgIGlmIChpc2RpciB8fCBzdGF0c3Quc3Rfc2l6ZSA9PSAwKSB7Ci0gICAgICBidWlsZGVyLT5GaW5pc2hGaWxlKDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBtbWFwIHRoZSBpbnB1dCBmaWxlIGFuZCBtZW1jcHkKLSAgICAgIGludCBmZCA9IG9wZW4oZmlsZXNbaV0sIE9fUkRPTkxZKTsKLSAgICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzLlxuIiwKLSAgICAgICAgICAgICAgICBmaWxlc1tpXSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgdm9pZCAqZGF0YSA9IG1tYXAoTlVMTCwgc3RhdHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLSAgICAgIGlmIChkYXRhID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBtbWFwIGZpbGUgJXMgZm9yIHJlYWRpbmc6ICVzLlxuIiwKLSAgICAgICAgICAgICAgICBmaWxlc1tpXSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc3RhdHN0LnN0X3NpemUpOwotICAgICAgbXVubWFwKGRhdGEsIHN0YXRzdC5zdF9zaXplKTsKLSAgICAgIGJ1aWxkZXItPkZpbmlzaEZpbGUoc3RhdHN0LnN0X3NpemUsIGNvbXByZXNzLCB0cnVlKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGJ1aWxkZXItPkZpbmlzaCgpIDwgMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1aWxkZXItPkdldEVycm9yKCkpOwotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGRldnRvb2xzX2lqYXIKLQotLy8KLS8vIG1haW4gbWV0aG9kCi0vLwotc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqcHJvZ25hbWUpIHsKLSAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW3Z4Y1tmQ11dIHguemlwIFtmaWxlMS4uLmZpbGVuXVxuIiwgcHJvZ25hbWUpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgdiB2ZXJib3NlIC0gbGlzdCBhbGwgZmlsZSBpbiB4LnppcFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICB4IGV4dHJhY3QgLSBleHRyYWN0IGZpbGUgaW4geC56aXAgaW4gY3VycmVudCBkaXJlY3RvcnlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgYyBjcmVhdGUgIC0gYWRkIGZpbGVzIHRvIHguemlwXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIGYgZmxhdHRlbiAtIGZsYXR0ZW4gZmlsZXMgdG8gdXNlIHdpdGggY3JlYXRlIG9wZXJhdGlvblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICIgIEMgY29tcHJlc3MgLSBjb21wcmVzcyBmaWxlcyB3aGVuIHVzaW5nIHRoZSBjcmVhdGUgb3BlcmF0aW9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJ4IGFuZCBjIGNhbm5vdCBiZSB1c2VkIGluIHRoZSBzYW1lIGNvbW1hbmQtbGluZS5cbiIpOwotICBleGl0KDEpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgYm9vbCBleHRyYWN0ID0gZmFsc2U7Ci0gIGJvb2wgdmVyYm9zZSA9IGZhbHNlOwotICBib29sIGNyZWF0ZSA9IGZhbHNlOwotICBib29sIGNvbXByZXNzID0gZmFsc2U7Ci0gIGJvb2wgZmxhdHRlbiA9IGZhbHNlOwotCi0gIGlmIChhcmdjIDwgMykgewotICAgIHVzYWdlKGFyZ3ZbMF0pOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGFyZ3ZbMV1baV0gIT0gMDsgaSsrKSB7Ci0gICAgc3dpdGNoIChhcmd2WzFdW2ldKSB7Ci0gICAgY2FzZSAneCc6Ci0gICAgICBleHRyYWN0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3YnOgotICAgICAgdmVyYm9zZSA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgIGNyZWF0ZSA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICAgIGZsYXR0ZW4gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICBjb21wcmVzcyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdXNhZ2UoYXJndlswXSk7Ci0gICAgfQotICB9Ci0gIGlmIChjcmVhdGUpIHsKLSAgICBpZiAoZXh0cmFjdCkgewotICAgICAgdXNhZ2UoYXJndlswXSk7Ci0gICAgfQotICAgIC8vIENyZWF0ZSBhIHppcAotICAgIHJldHVybiBkZXZ0b29sc19pamFyOjpjcmVhdGUoYXJndlsyXSwgYXJndiArIDMsIGZsYXR0ZW4sIHZlcmJvc2UsIGNvbXByZXNzKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZmxhdHRlbikgewotICAgICAgdXNhZ2UoYXJndlswXSk7Ci0gICAgfQotICAgIC8vIEV4dHJhY3Rpb24gLyBsaXN0IG1vZGUKLSAgICByZXR1cm4gZGV2dG9vbHNfaWphcjo6ZXh0cmFjdChhcmd2WzJdLCB2ZXJib3NlLCBleHRyYWN0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvamF2YS1ldmVudC1sb2ctdGFncy5weSBiL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKaW5kZXggZjM2NDc1MS4uMzdjZDcxMiAxMDA3NTUKLS0tIGEvdG9vbHMvamF2YS1ldmVudC1sb2ctdGFncy5weQorKysgYi90b29scy9qYXZhLWV2ZW50LWxvZy10YWdzLnB5CkBAIC01MSwzMCArNTEsMzcgQEAKICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAidW5oYW5kbGVkIG9wdGlvbiAlcyIgJSAobywpCiAgICAgc3lzLmV4aXQoMSkKIAotaWYgbGVuKGFyZ3MpICE9IDI6Ci0gIHByaW50ICJuZWVkIGV4YWN0bHkgdHdvIGlucHV0IGZpbGVzLCBub3QgJWQiICUgKGxlbihhcmdzKSwpCitpZiBsZW4oYXJncykgIT0gMSBhbmQgbGVuKGFyZ3MpICE9IDI6CisgIHByaW50ICJuZWVkIG9uZSBvciB0d28gaW5wdXQgZmlsZXMsIG5vdCAlZCIgJSAobGVuKGFyZ3MpLCkKICAgcHJpbnQgX19kb2NfXwogICBzeXMuZXhpdCgxKQogCiBmbiA9IGFyZ3NbMF0KIHRhZ2ZpbGUgPSBldmVudF9sb2dfdGFncy5UYWdGaWxlKGZuKQogCi0jIExvYWQgdGhlIG1lcmdlZCB0YWcgZmlsZSAod2hpY2ggc2hvdWxkIGhhdmUgbnVtYmVycyBhc3NpZ25lZCBmb3IgYWxsCi0jIHRhZ3MuICBVc2UgdGhlIG51bWJlcnMgZnJvbSB0aGUgbWVyZ2VkIGZpbGUgdG8gZmlsbCBpbiBhbnkgbWlzc2luZwotIyBudW1iZXJzIGZyb20gdGhlIGlucHV0IGZpbGUuCi1tZXJnZWRfZm4gPSBhcmdzWzFdCi1tZXJnZWRfdGFnZmlsZSA9IGV2ZW50X2xvZ190YWdzLlRhZ0ZpbGUobWVyZ2VkX2ZuKQotbWVyZ2VkX2J5X25hbWUgPSBkaWN0KFsodC50YWduYW1lLCB0KSBmb3IgdCBpbiBtZXJnZWRfdGFnZmlsZS50YWdzXSkKLWZvciB0IGluIHRhZ2ZpbGUudGFnczoKLSAgaWYgdC50YWdudW0gaXMgTm9uZToKLSAgICBpZiB0LnRhZ25hbWUgaW4gbWVyZ2VkX2J5X25hbWU6Ci0gICAgICB0LnRhZ251bSA9IG1lcmdlZF9ieV9uYW1lW3QudGFnbmFtZV0udGFnbnVtCi0gICAgZWxzZToKLSAgICAgICMgV2UncmUgYnVpbGRpbmcgc29tZXRoaW5nIHRoYXQncyBub3QgYmVpbmcgaW5jbHVkZWQgaW4gdGhlCi0gICAgICAjIHByb2R1Y3QsIHNvIGl0cyB0YWdzIGRvbid0IGFwcGVhciBpbiB0aGUgbWVyZ2VkIGZpbGUuICBBc3NpZ24KLSAgICAgICMgdGhlbSBhbGwgYW4gYXJiaXRyYXJ5IG51bWJlciBzbyB3ZSBjYW4gZW1pdCB0aGUgamF2YSBhbmQKLSAgICAgICMgY29tcGlsZSB0aGUgKHVudXNlZCkgcGFja2FnZS4KLSAgICAgIHQudGFnbnVtID0gOTk5OTk5CitpZiBsZW4oYXJncykgPiAxOgorICAjIExvYWQgdGhlIG1lcmdlZCB0YWcgZmlsZSAod2hpY2ggc2hvdWxkIGhhdmUgbnVtYmVycyBhc3NpZ25lZCBmb3IgYWxsCisgICMgdGFncy4gIFVzZSB0aGUgbnVtYmVycyBmcm9tIHRoZSBtZXJnZWQgZmlsZSB0byBmaWxsIGluIGFueSBtaXNzaW5nCisgICMgbnVtYmVycyBmcm9tIHRoZSBpbnB1dCBmaWxlLgorICBtZXJnZWRfZm4gPSBhcmdzWzFdCisgIG1lcmdlZF90YWdmaWxlID0gZXZlbnRfbG9nX3RhZ3MuVGFnRmlsZShtZXJnZWRfZm4pCisgIG1lcmdlZF9ieV9uYW1lID0gZGljdChbKHQudGFnbmFtZSwgdCkgZm9yIHQgaW4gbWVyZ2VkX3RhZ2ZpbGUudGFnc10pCisgIGZvciB0IGluIHRhZ2ZpbGUudGFnczoKKyAgICBpZiB0LnRhZ251bSBpcyBOb25lOgorICAgICAgaWYgdC50YWduYW1lIGluIG1lcmdlZF9ieV9uYW1lOgorICAgICAgICB0LnRhZ251bSA9IG1lcmdlZF9ieV9uYW1lW3QudGFnbmFtZV0udGFnbnVtCisgICAgICBlbHNlOgorICAgICAgICAjIFdlJ3JlIGJ1aWxkaW5nIHNvbWV0aGluZyB0aGF0J3Mgbm90IGJlaW5nIGluY2x1ZGVkIGluIHRoZQorICAgICAgICAjIHByb2R1Y3QsIHNvIGl0cyB0YWdzIGRvbid0IGFwcGVhciBpbiB0aGUgbWVyZ2VkIGZpbGUuICBBc3NpZ24KKyAgICAgICAgIyB0aGVtIGFsbCBhbiBhcmJpdHJhcnkgbnVtYmVyIHNvIHdlIGNhbiBlbWl0IHRoZSBqYXZhIGFuZAorICAgICAgICAjIGNvbXBpbGUgdGhlICh1bnVzZWQpIHBhY2thZ2UuCisgICAgICAgIHQudGFnbnVtID0gOTk5OTk5CitlbHNlOgorICAjIE5vdCB1c2luZyB0aGUgbWVyZ2VkIHRhZyBmaWxlLCBzbyBhbGwgdGFncyBtdXN0IGhhdmUgbWFudWFsbHkgYXNzaWduZWQKKyAgIyBudW1iZXJzCisgIGZvciB0IGluIHRhZ2ZpbGUudGFnczoKKyAgICBpZiB0LnRhZ251bSBpcyBOb25lOgorICAgICAgdGFnZmlsZWYuQWRkRXJyb3IoInRhZyBcIiVzXCIgaGFzIG5vIG51bWJlciIgJSAodGFnbmFtZSwpLCB0YWcubGluZW51bSkKIAogaWYgImphdmFfcGFja2FnZSIgbm90IGluIHRhZ2ZpbGUub3B0aW9uczoKICAgdGFnZmlsZS5BZGRFcnJvcigiamF2YV9wYWNrYWdlIG9wdGlvbiBub3Qgc3BlY2lmaWVkIiwgbGluZW51bT0wKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliaG9zdC9BbmRyb2lkLmJwIGIvdG9vbHMvbGliaG9zdC9BbmRyb2lkLmJwCmluZGV4IGU1YTVlY2YuLjRjOTEwMGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYmhvc3QvQW5kcm9pZC5icAorKysgYi90b29scy9saWJob3N0L0FuZHJvaWQuYnAKQEAgLTEwLDYgKzEwLDcgQEAKICAgICBuYW1lOiAibGliaG9zdCIsCiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGNmbGFnczogWyItV25vLXVudXNlZC1wYXJhbWV0ZXIiXSwKICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYmhvc3QvQ29weUZpbGUuYyBiL3Rvb2xzL2xpYmhvc3QvQ29weUZpbGUuYwppbmRleCBiZDY1ZjFlLi5mOWJkYTg2IDEwMDY0NAotLS0gYS90b29scy9saWJob3N0L0NvcHlGaWxlLmMKKysrIGIvdG9vbHMvbGliaG9zdC9Db3B5RmlsZS5jCkBAIC0zNTIsNyArMzUyLDEyIEBACiAgKiBuZWVkIHRvIHRyYXNoIGl0IHNvIHdlIGNhbiBjcmVhdGUgb25lLgogICovCiAjaWYgZGVmaW5lZChfV0lOMzIpCi1leHRlcm4gaW50IGNvcHlTeW1saW5rKGNvbnN0IGNoYXIqIHNyYywgY29uc3QgY2hhciogZHN0LCBjb25zdCBzdHJ1Y3Qgc3RhdCogcFNyY1N0YXQsIHVuc2lnbmVkIGludCBvcHRpb25zKSBfX2F0dHJpYnV0ZV9fKChlcnJvcigibm8gc3ltbGlua3Mgb24gV2luZG93cyIpKSk7CitleHRlcm4gaW50IGNvcHlTeW1saW5rKGNvbnN0IGNoYXIqIHNyYywgY29uc3QgY2hhciogZHN0LCBjb25zdCBzdHJ1Y3Qgc3RhdCogcFNyY1N0YXQsIHVuc2lnbmVkIGludCBvcHRpb25zKQorI2lmZGVmIF9fY2xhbmdfXworICBfX2F0dHJpYnV0ZV9fKCh1bmF2YWlsYWJsZSgibm8gc3ltbGlua3Mgb24gV2luZG93cyIpKSk7CisjZWxzZQorICBfX2F0dHJpYnV0ZV9fKChlcnJvcigibm8gc3ltbGlua3Mgb24gV2luZG93cyIpKSk7CisjZW5kaWYKICNlbHNlCiBzdGF0aWMgaW50IGNvcHlTeW1saW5rKGNvbnN0IGNoYXIqIHNyYywgY29uc3QgY2hhciogZHN0LCBjb25zdCBzdHJ1Y3Qgc3RhdCogcFNyY1N0YXQsIHVuc2lnbmVkIGludCBvcHRpb25zKQogewpAQCAtNTc0LDggKzU3OSwxMCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0VmFsID0gY29weURpcmVjdG9yeShzcmMsIGRzdCwgJnNyY1N0YXQsIG9wdGlvbnMpOwogICAgICAgICB9CisjaWYgIWRlZmluZWQoX1dJTjMyKQogICAgIH0gZWxzZSBpZiAoU19JU0xOSyhzcmNTdGF0LnN0X21vZGUpKSB7CiAgICAgICAgIHJldFZhbCA9IGNvcHlTeW1saW5rKHNyYywgZHN0LCAmc3JjU3RhdCwgb3B0aW9ucyk7CisjZW5kaWYKICAgICB9IGVsc2UgaWYgKFNfSVNSRUcoc3JjU3RhdC5zdF9tb2RlKSkgewogICAgICAgICByZXRWYWwgPSBjb3B5UmVndWxhcihzcmMsIGRzdCwgJnNyY1N0YXQsIG9wdGlvbnMpOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS90b29scy9tYWtlcGFyYWxsZWwvQW5kcm9pZC5icCBiL3Rvb2xzL21ha2VwYXJhbGxlbC9BbmRyb2lkLmJwCmluZGV4IGNiODE4MTcuLjg5OGRiNjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL21ha2VwYXJhbGxlbC9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL21ha2VwYXJhbGxlbC9BbmRyb2lkLmJwCkBAIC0xOCw5ICsxOCw0IEBACiAgICAgICAgICJtYWtlcGFyYWxsZWwuY3BwIiwKICAgICBdLAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGxpbnV4OiB7Ci0gICAgICAgICAgICBob3N0X2xkbGliczogWyItbHJ0IiwgIi1scHRocmVhZCJdLAotICAgICAgICB9LAotICAgIH0sCiB9CmRpZmYgLS1naXQgYS90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkgYi90b29scy9wb3N0X3Byb2Nlc3NfcHJvcHMucHkKaW5kZXggOTM1NWU0Yi4uOWRkZDVkNyAxMDA3NTUKLS0tIGEvdG9vbHMvcG9zdF9wcm9jZXNzX3Byb3BzLnB5CisrKyBiL3Rvb2xzL3Bvc3RfcHJvY2Vzc19wcm9wcy5weQpAQCAtNjQsNyArNjQsNyBAQAogICBidWlsZHByb3BzID0gcHJvcC50b19kaWN0KCkKICAgZm9yIGtleSwgdmFsdWUgaW4gYnVpbGRwcm9wcy5pdGVyaXRlbXMoKToKICAgICAjIENoZWNrIGJ1aWxkIHByb3BlcnRpZXMnIGxlbmd0aC4KLSAgICBpZiBsZW4odmFsdWUpID4gUFJPUF9WQUxVRV9NQVg6CisgICAgaWYgbGVuKHZhbHVlKSA+IFBST1BfVkFMVUVfTUFYIGFuZCBub3Qga2V5LnN0YXJ0c3dpdGgoInJvLiIpOgogICAgICAgY2hlY2tfcGFzcyA9IEZhbHNlCiAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJlcnJvcjogJXMgY2Fubm90IGV4Y2VlZCAlZCBieXRlczogIiAlCiAgICAgICAgICAgICAgICAgICAgICAgIChrZXksIFBST1BfVkFMVUVfTUFYKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weQppbmRleCAxYTA4Y2I2Li5mNjg5NzZlIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvYWRkX2ltZ190b190YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5CkBAIC00NSwyMCArNDUsMTIgQEAKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgogCi1pbXBvcnQgc3lzCi0KLWlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMjA3MDAwMDoKLSAgcHJpbnQoIlB5dGhvbiAyLjcgb3IgbmV3ZXIgaXMgcmVxdWlyZWQuIiwgZmlsZT1zeXMuc3RkZXJyKQotICBzeXMuZXhpdCgxKQotCiBpbXBvcnQgZGF0ZXRpbWUKLWltcG9ydCBlcnJubwotaW1wb3J0IGhhc2hsaWIKIGltcG9ydCBvcwogaW1wb3J0IHNobGV4CiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3VicHJvY2VzcwotaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc3lzCiBpbXBvcnQgdXVpZAogaW1wb3J0IHppcGZpbGUKIApAQCAtNjcsNiArNTksMTAgQEAKIGltcG9ydCByYW5nZWxpYgogaW1wb3J0IHNwYXJzZV9pbWcKIAoraWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgorICBwcmludCgiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iLCBmaWxlPXN5cy5zdGRlcnIpCisgIHN5cy5leGl0KDEpCisKIE9QVElPTlMgPSBjb21tb24uT1BUSU9OUwogCiBPUFRJT05TLmFkZF9taXNzaW5nID0gRmFsc2UKQEAgLTc3LDYgKzczLDEwIEBACiBPUFRJT05TLmlzX3NpZ25pbmcgPSBGYWxzZQogCiAKKyMgUGFydGl0aW9ucyB0aGF0IHNob3VsZCBoYXZlIHRoZWlyIGNhcmVfbWFwIGFkZGVkIHRvIE1FVEEvY2FyZV9tYXAudHh0LgorUEFSVElUSU9OU19XSVRIX0NBUkVfTUFQID0gKCdzeXN0ZW0nLCAndmVuZG9yJywgJ3Byb2R1Y3QnKQorCisKIGNsYXNzIE91dHB1dEZpbGUob2JqZWN0KToKICAgZGVmIF9faW5pdF9fKHNlbGYsIG91dHB1dF96aXAsIGlucHV0X2RpciwgcHJlZml4LCBuYW1lKToKICAgICBzZWxmLl9vdXRwdXRfemlwID0gb3V0cHV0X3ppcApAQCAtOTYsMTMgKzk2LDE5IEBACiAKIAogZGVmIEdldENhcmVNYXAod2hpY2gsIGltZ25hbWUpOgotICAiIiJHZW5lcmF0ZSBjYXJlX21hcCBvZiBzeXN0ZW0gKG9yIHZlbmRvcikgcGFydGl0aW9uIiIiCisgICIiIlJldHVybnMgdGhlIGNhcmVfbWFwIHN0cmluZyBmb3IgdGhlIGdpdmVuIHBhcnRpdGlvbi4KIAotICBhc3NlcnQgd2hpY2ggaW4gKCJzeXN0ZW0iLCAidmVuZG9yIikKKyAgQXJnczoKKyAgICB3aGljaDogVGhlIHBhcnRpdGlvbiBuYW1lLCBtdXN0IGJlIGxpc3RlZCBpbiBQQVJUSVRJT05TX1dJVEhfQ0FSRV9NQVAuCisgICAgaW1nbmFtZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBpbWFnZS4KKworICBSZXR1cm5zOgorICAgICh3aGljaCwgY2FyZV9tYXBfcmFuZ2VzKTogY2FyZV9tYXBfcmFuZ2VzIGlzIHRoZSByYXcgc3RyaW5nIG9mIHRoZSBjYXJlX21hcAorICAgIFJhbmdlU2V0LgorICAiIiIKKyAgYXNzZXJ0IHdoaWNoIGluIFBBUlRJVElPTlNfV0lUSF9DQVJFX01BUAogCiAgIHNpbWcgPSBzcGFyc2VfaW1nLlNwYXJzZUltYWdlKGltZ25hbWUpCi0gIGNhcmVfbWFwX2xpc3QgPSBbd2hpY2hdCi0KICAgY2FyZV9tYXBfcmFuZ2VzID0gc2ltZy5jYXJlX21hcAogICBrZXkgPSB3aGljaCArICJfYWRqdXN0ZWRfcGFydGl0aW9uX3NpemUiCiAgIGFkanVzdGVkX2Jsb2NrcyA9IE9QVElPTlMuaW5mb19kaWN0LmdldChrZXkpCkBAIC0xMTEsMTcgKzExNywxNiBAQAogICAgIGNhcmVfbWFwX3JhbmdlcyA9IGNhcmVfbWFwX3Jhbmdlcy5pbnRlcnNlY3QocmFuZ2VsaWIuUmFuZ2VTZXQoCiAgICAgICAgICIwLSVkIiAlIChhZGp1c3RlZF9ibG9ja3MsKSkpCiAKLSAgY2FyZV9tYXBfbGlzdC5hcHBlbmQoY2FyZV9tYXBfcmFuZ2VzLnRvX3N0cmluZ19yYXcoKSkKLSAgcmV0dXJuIGNhcmVfbWFwX2xpc3QKKyAgcmV0dXJuIFt3aGljaCwgY2FyZV9tYXBfcmFuZ2VzLnRvX3N0cmluZ19yYXcoKV0KIAogCi1kZWYgQWRkU3lzdGVtKG91dHB1dF96aXAsIHByZWZpeD0iSU1BR0VTLyIsIHJlY292ZXJ5X2ltZz1Ob25lLCBib290X2ltZz1Ob25lKToKK2RlZiBBZGRTeXN0ZW0ob3V0cHV0X3ppcCwgcmVjb3ZlcnlfaW1nPU5vbmUsIGJvb3RfaW1nPU5vbmUpOgogICAiIiJUdXJuIHRoZSBjb250ZW50cyBvZiBTWVNURU0gaW50byBhIHN5c3RlbSBpbWFnZSBhbmQgc3RvcmUgaXQgaW4KICAgb3V0cHV0X3ppcC4gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3lzdGVtIGltYWdlIGZpbGUuIiIiCiAKLSAgaW1nID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgcHJlZml4LCAic3lzdGVtLmltZyIpCisgIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAic3lzdGVtLmltZyIpCiAgIGlmIG9zLnBhdGguZXhpc3RzKGltZy5pbnB1dF9uYW1lKToKLSAgICBwcmludCgic3lzdGVtLmltZyBhbHJlYWR5IGV4aXN0cyBpbiAlcywgbm8gbmVlZCB0byByZWJ1aWxkLi4uIiAlIChwcmVmaXgsKSkKKyAgICBwcmludCgic3lzdGVtLmltZyBhbHJlYWR5IGV4aXN0czsgbm8gbmVlZCB0byByZWJ1aWxkLi4uIikKICAgICByZXR1cm4gaW1nLmlucHV0X25hbWUKIAogICBkZWYgb3V0cHV0X3NpbmsoZm4sIGRhdGEpOgpAQCAtMTQwLDUxICsxNDUsNjYgQEAKICAgICBjb21tb24uTWFrZVJlY292ZXJ5UGF0Y2goT1BUSU9OUy5pbnB1dF90bXAsIG91dHB1dF9zaW5rLCByZWNvdmVyeV9pbWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RfaW1nLCBpbmZvX2RpY3Q9T1BUSU9OUy5pbmZvX2RpY3QpCiAKLSAgYmxvY2tfbGlzdCA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInN5c3RlbS5tYXAiKQorICBibG9ja19saXN0ID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJzeXN0ZW0ubWFwIikKICAgQ3JlYXRlSW1hZ2UoT1BUSU9OUy5pbnB1dF90bXAsIE9QVElPTlMuaW5mb19kaWN0LCAic3lzdGVtIiwgaW1nLAogICAgICAgICAgICAgICBibG9ja19saXN0PWJsb2NrX2xpc3QpCiAKICAgcmV0dXJuIGltZy5uYW1lCiAKIAotZGVmIEFkZFN5c3RlbU90aGVyKG91dHB1dF96aXAsIHByZWZpeD0iSU1BR0VTLyIpOgorZGVmIEFkZFN5c3RlbU90aGVyKG91dHB1dF96aXApOgogICAiIiJUdXJuIHRoZSBjb250ZW50cyBvZiBTWVNURU1fT1RIRVIgaW50byBhIHN5c3RlbV9vdGhlciBpbWFnZQogICBhbmQgc3RvcmUgaXQgaW4gb3V0cHV0X3ppcC4iIiIKIAotICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCBwcmVmaXgsICJzeXN0ZW1fb3RoZXIuaW1nIikKKyAgaW1nID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJzeXN0ZW1fb3RoZXIuaW1nIikKICAgaWYgb3MucGF0aC5leGlzdHMoaW1nLmlucHV0X25hbWUpOgotICAgIHByaW50KCJzeXN0ZW1fb3RoZXIuaW1nIGFscmVhZHkgZXhpc3RzIGluICVzLCBubyBuZWVkIHRvIHJlYnVpbGQuLi4iICUgKAotICAgICAgICBwcmVmaXgsKSkKKyAgICBwcmludCgic3lzdGVtX290aGVyLmltZyBhbHJlYWR5IGV4aXN0czsgbm8gbmVlZCB0byByZWJ1aWxkLi4uIikKICAgICByZXR1cm4KIAogICBDcmVhdGVJbWFnZShPUFRJT05TLmlucHV0X3RtcCwgT1BUSU9OUy5pbmZvX2RpY3QsICJzeXN0ZW1fb3RoZXIiLCBpbWcpCiAKIAotZGVmIEFkZFZlbmRvcihvdXRwdXRfemlwLCBwcmVmaXg9IklNQUdFUy8iKToKK2RlZiBBZGRWZW5kb3Iob3V0cHV0X3ppcCk6CiAgICIiIlR1cm4gdGhlIGNvbnRlbnRzIG9mIFZFTkRPUiBpbnRvIGEgdmVuZG9yIGltYWdlIGFuZCBzdG9yZSBpbiBpdAogICBvdXRwdXRfemlwLiIiIgogCi0gIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInZlbmRvci5pbWciKQorICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInZlbmRvci5pbWciKQogICBpZiBvcy5wYXRoLmV4aXN0cyhpbWcuaW5wdXRfbmFtZSk6Ci0gICAgcHJpbnQoInZlbmRvci5pbWcgYWxyZWFkeSBleGlzdHMgaW4gJXMsIG5vIG5lZWQgdG8gcmVidWlsZC4uLiIgJSAocHJlZml4LCkpCisgICAgcHJpbnQoInZlbmRvci5pbWcgYWxyZWFkeSBleGlzdHM7IG5vIG5lZWQgdG8gcmVidWlsZC4uLiIpCiAgICAgcmV0dXJuIGltZy5pbnB1dF9uYW1lCiAKLSAgYmxvY2tfbGlzdCA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInZlbmRvci5tYXAiKQorICBibG9ja19saXN0ID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJ2ZW5kb3IubWFwIikKICAgQ3JlYXRlSW1hZ2UoT1BUSU9OUy5pbnB1dF90bXAsIE9QVElPTlMuaW5mb19kaWN0LCAidmVuZG9yIiwgaW1nLAogICAgICAgICAgICAgICBibG9ja19saXN0PWJsb2NrX2xpc3QpCiAgIHJldHVybiBpbWcubmFtZQogCiAKLWRlZiBBZGREdGJvKG91dHB1dF96aXAsIHByZWZpeD0iSU1BR0VTLyIpOgorZGVmIEFkZFByb2R1Y3Qob3V0cHV0X3ppcCk6CisgICIiIlR1cm4gdGhlIGNvbnRlbnRzIG9mIFBST0RVQ1QgaW50byBhIHByb2R1Y3QgaW1hZ2UgYW5kIHN0b3JlIGl0IGluCisgIG91dHB1dF96aXAuIiIiCisKKyAgaW1nID0gT3V0cHV0RmlsZShvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJwcm9kdWN0LmltZyIpCisgIGlmIG9zLnBhdGguZXhpc3RzKGltZy5pbnB1dF9uYW1lKToKKyAgICBwcmludCgicHJvZHVjdC5pbWcgYWxyZWFkeSBleGlzdHM7IG5vIG5lZWQgdG8gcmVidWlsZC4uLiIpCisgICAgcmV0dXJuIGltZy5pbnB1dF9uYW1lCisKKyAgYmxvY2tfbGlzdCA9IE91dHB1dEZpbGUoCisgICAgICBvdXRwdXRfemlwLCBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJwcm9kdWN0Lm1hcCIpCisgIENyZWF0ZUltYWdlKAorICAgICAgT1BUSU9OUy5pbnB1dF90bXAsIE9QVElPTlMuaW5mb19kaWN0LCAicHJvZHVjdCIsIGltZywKKyAgICAgIGJsb2NrX2xpc3Q9YmxvY2tfbGlzdCkKKyAgcmV0dXJuIGltZy5uYW1lCisKKworZGVmIEFkZER0Ym8ob3V0cHV0X3ppcCk6CiAgICIiIkFkZHMgdGhlIERUQk8gaW1hZ2UuCiAKLSAgVXNlcyB0aGUgaW1hZ2UgdW5kZXIgcHJlZml4IGlmIGl0IGFscmVhZHkgZXhpc3RzLiBPdGhlcndpc2UgbG9va3MgZm9yIHRoZQorICBVc2VzIHRoZSBpbWFnZSB1bmRlciBJTUFHRVMvIGlmIGl0IGFscmVhZHkgZXhpc3RzLiBPdGhlcndpc2UgbG9va3MgZm9yIHRoZQogICBpbWFnZSB1bmRlciBQUkVCVUlMVF9JTUFHRVMvLCBzaWducyBpdCBhcyBuZWVkZWQsIGFuZCByZXR1cm5zIHRoZSBpbWFnZSBuYW1lLgogICAiIiIKLQotICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCBwcmVmaXgsICJkdGJvLmltZyIpCisgIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAiZHRiby5pbWciKQogICBpZiBvcy5wYXRoLmV4aXN0cyhpbWcuaW5wdXRfbmFtZSk6Ci0gICAgcHJpbnQoImR0Ym8uaW1nIGFscmVhZHkgZXhpc3RzIGluICVzLCBubyBuZWVkIHRvIHJlYnVpbGQuLi4iICUgKHByZWZpeCwpKQorICAgIHByaW50KCJkdGJvLmltZyBhbHJlYWR5IGV4aXN0czsgbm8gbmVlZCB0byByZWJ1aWxkLi4uIikKICAgICByZXR1cm4gaW1nLmlucHV0X25hbWUKIAogICBkdGJvX3ByZWJ1aWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oCkBAIC0yMTUsMjIgKzIzNSw2IEBACiBkZWYgQ3JlYXRlSW1hZ2UoaW5wdXRfZGlyLCBpbmZvX2RpY3QsIHdoYXQsIG91dHB1dF9maWxlLCBibG9ja19saXN0PU5vbmUpOgogICBwcmludCgiY3JlYXRpbmcgIiArIHdoYXQgKyAiLmltZy4uLiIpCiAKLSAgIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGl0IGlzIG1ha2luZyBhbiBpbWFnZSBvdXQgb2YgbWF0dGVycyB0bwotICAjIG1reWFmZnMyaW1hZ2UuICBJdCB3YW50cyAic3lzdGVtIiBidXQgd2UgaGF2ZSBhIGRpcmVjdG9yeSBuYW1lZAotICAjICJTWVNURU0iLCBzbyBjcmVhdGUgYSBzeW1saW5rLgotICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQotICBPUFRJT05TLnRlbXBmaWxlcy5hcHBlbmQodGVtcF9kaXIpCi0gIHRyeToKLSAgICBvcy5zeW1saW5rKG9zLnBhdGguam9pbihpbnB1dF9kaXIsIHdoYXQudXBwZXIoKSksCi0gICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4odGVtcF9kaXIsIHdoYXQpKQotICBleGNlcHQgT1NFcnJvciBhcyBlOgotICAgICMgYm9ndXMgZXJyb3Igb24gbXkgbWFjIHZlcnNpb24/Ci0gICAgIyAgIEZpbGUgIi4vYnVpbGQvdG9vbHMvcmVsZWFzZXRvb2xzL2ltZ19mcm9tX3RhcmdldF9maWxlcyIKLSAgICAjICAgICBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJzeXN0ZW0iKSkKLSAgICAjIE9TRXJyb3I6IFtFcnJubyAxN10gRmlsZSBleGlzdHMKLSAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVDoKLSAgICAgIHBhc3MKLQogICBpbWFnZV9wcm9wcyA9IGJ1aWxkX2ltYWdlLkltYWdlUHJvcEZyb21HbG9iYWxEaWN0KGluZm9fZGljdCwgd2hhdCkKICAgZnN0YWIgPSBpbmZvX2RpY3RbImZzdGFiIl0KICAgbW91bnRfcG9pbnQgPSAiLyIgKyB3aGF0CkBAIC0yNzIsNyArMjc2LDcgQEAKICAgaGFzaF9zZWVkID0gImhhc2hfc2VlZC0iICsgdXVpZF9zZWVkCiAgIGltYWdlX3Byb3BzWyJoYXNoX3NlZWQiXSA9IHN0cih1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX1VSTCwgaGFzaF9zZWVkKSkKIAotICBzdWNjID0gYnVpbGRfaW1hZ2UuQnVpbGRJbWFnZShvcy5wYXRoLmpvaW4odGVtcF9kaXIsIHdoYXQpLAorICBzdWNjID0gYnVpbGRfaW1hZ2UuQnVpbGRJbWFnZShvcy5wYXRoLmpvaW4oaW5wdXRfZGlyLCB3aGF0LnVwcGVyKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9wcm9wcywgb3V0cHV0X2ZpbGUubmFtZSkKICAgYXNzZXJ0IHN1Y2MsICJidWlsZCAiICsgd2hhdCArICIuaW1nIGltYWdlIGZhaWxlZCIKIApAQCAtMjk0LDcgKzI5OCw3IEBACiAgICAgICBpbmZvX2RpY3RbYWRqdXN0ZWRfYmxvY2tzX2tleV0gPSBpbnQoYWRqdXN0ZWRfYmxvY2tzX3ZhbHVlKS80MDk2IC0gMQogCiAKLWRlZiBBZGRVc2VyZGF0YShvdXRwdXRfemlwLCBwcmVmaXg9IklNQUdFUy8iKToKK2RlZiBBZGRVc2VyZGF0YShvdXRwdXRfemlwKToKICAgIiIiQ3JlYXRlIGEgdXNlcmRhdGEgaW1hZ2UgYW5kIHN0b3JlIGl0IGluIG91dHB1dF96aXAuCiAKICAgSW4gbW9zdCBjYXNlIHdlIGp1c3QgY3JlYXRlIGFuZCBzdG9yZSBhbiBlbXB0eSB1c2VyZGF0YS5pbWc7CkBAIC0zMDMsMTAgKzMwNyw5IEBACiAgIGluIE9QVElPTlMuaW5mb19kaWN0LgogICAiIiIKIAotICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCBwcmVmaXgsICJ1c2VyZGF0YS5pbWciKQorICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInVzZXJkYXRhLmltZyIpCiAgIGlmIG9zLnBhdGguZXhpc3RzKGltZy5pbnB1dF9uYW1lKToKLSAgICBwcmludCgidXNlcmRhdGEuaW1nIGFscmVhZHkgZXhpc3RzIGluICVzLCBubyBuZWVkIHRvIHJlYnVpbGQuLi4iICUgKAotICAgICAgICBwcmVmaXgsKSkKKyAgICBwcmludCgidXNlcmRhdGEuaW1nIGFscmVhZHkgZXhpc3RzOyBubyBuZWVkIHRvIHJlYnVpbGQuLi4iKQogICAgIHJldHVybgogCiAgICMgU2tpcCB1c2VyZGF0YS5pbWcgaWYgbm8gc2l6ZS4KQEAgLTMyMiwyMSArMzI1LDEwIEBACiAgIHRpbWVzdGFtcCA9IChkYXRldGltZS5kYXRldGltZSgyMDA5LCAxLCAxKSAtIGVwb2NoKS50b3RhbF9zZWNvbmRzKCkKICAgaW1hZ2VfcHJvcHNbInRpbWVzdGFtcCJdID0gaW50KHRpbWVzdGFtcCkKIAotICAjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaXQgaXMgbWFraW5nIGFuIGltYWdlIG91dCBvZiBtYXR0ZXJzIHRvCi0gICMgbWt5YWZmczJpbWFnZS4gIFNvIHdlIGNyZWF0ZSBhIHRlbXAgZGlyLCBhbmQgd2l0aGluIGl0IHdlIGNyZWF0ZSBhbgotICAjIGVtcHR5IGRpciBuYW1lZCAiZGF0YSIsIG9yIGEgc3ltbGluayB0byB0aGUgREFUQSBkaXIsCi0gICMgYW5kIGJ1aWxkIHRoZSBpbWFnZSBmcm9tIHRoYXQuCi0gIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCi0gIE9QVElPTlMudGVtcGZpbGVzLmFwcGVuZCh0ZW1wX2RpcikKLSAgdXNlcl9kaXIgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJkYXRhIikKLSAgZW1wdHkgPSAoT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJ1c2VyZGF0YV9pbWdfd2l0aF9kYXRhIikgIT0gInRydWUiKQotICBpZiBlbXB0eToKLSAgICAjIENyZWF0ZSBhbiBlbXB0eSBkaXIuCi0gICAgb3MubWtkaXIodXNlcl9kaXIpCisgIGlmIE9QVElPTlMuaW5mb19kaWN0LmdldCgidXNlcmRhdGFfaW1nX3dpdGhfZGF0YSIpID09ICJ0cnVlIjoKKyAgICB1c2VyX2RpciA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIkRBVEEiKQogICBlbHNlOgotICAgICMgU3ltbGluayB0byB0aGUgREFUQSBkaXIuCi0gICAgb3Muc3ltbGluayhvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJEQVRBIiksCi0gICAgICAgICAgICAgICB1c2VyX2RpcikKKyAgICB1c2VyX2RpciA9IGNvbW1vbi5NYWtlVGVtcERpcigpCiAKICAgZnN0YWIgPSBPUFRJT05TLmluZm9fZGljdFsiZnN0YWIiXQogICBpZiBmc3RhYjoKQEAgLTM3MywyMSArMzY1LDMxIEBACiAgICAgY21kLmV4dGVuZChbIi0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlIiwgaW1nX3BhdGhdKQogCiAKLWRlZiBBZGRWQk1ldGEob3V0cHV0X3ppcCwgYm9vdF9pbWdfcGF0aCwgc3lzdGVtX2ltZ19wYXRoLCB2ZW5kb3JfaW1nX3BhdGgsCi0gICAgICAgICAgICAgIGR0Ym9faW1nX3BhdGgsIHByZWZpeD0iSU1BR0VTLyIpOgotICAiIiJDcmVhdGUgYSBWQk1ldGEgaW1hZ2UgYW5kIHN0b3JlIGl0IGluIG91dHB1dF96aXAuIiIiCi0gIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInZibWV0YS5pbWciKQorZGVmIEFkZFZCTWV0YShvdXRwdXRfemlwLCBwYXJ0aXRpb25zKToKKyAgIiIiQ3JlYXRlcyBhIFZCTWV0YSBpbWFnZSBhbmQgc3RvcmUgaXQgaW4gb3V0cHV0X3ppcC4KKworICBBcmdzOgorICAgIG91dHB1dF96aXA6IFRoZSBvdXRwdXQgemlwIGZpbGUsIHdoaWNoIG5lZWRzIHRvIGJlIGFscmVhZHkgb3Blbi4KKyAgICBwYXJ0aXRpb25zOiBBIGRpY3QgdGhhdCdzIGtleWVkIGJ5IHBhcnRpdGlvbiBuYW1lcyB3aXRoIGltYWdlIHBhdGhzIGFzCisgICAgICAgIHZhbHVlcy4gT25seSB2YWxpZCBwYXJ0aXRpb24gbmFtZXMgYXJlIGFjY2VwdGVkLCB3aGljaCBpbmNsdWRlICdib290JywKKyAgICAgICAgJ3JlY292ZXJ5JywgJ3N5c3RlbScsICd2ZW5kb3InLCAnZHRibycuCisgICIiIgorICBpbWcgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInZibWV0YS5pbWciKQorICBpZiBvcy5wYXRoLmV4aXN0cyhpbWcuaW5wdXRfbmFtZSk6CisgICAgcHJpbnQoInZibWV0YS5pbWcgYWxyZWFkeSBleGlzdHM7IG5vdCByZWJ1aWxkaW5nLi4uIikKKyAgICByZXR1cm4gaW1nLmlucHV0X25hbWUKKwogICBhdmJ0b29sID0gb3MuZ2V0ZW52KCdBVkJUT09MJykgb3IgT1BUSU9OUy5pbmZvX2RpY3RbImF2Yl9hdmJ0b29sIl0KICAgY21kID0gW2F2YnRvb2wsICJtYWtlX3ZibWV0YV9pbWFnZSIsICItLW91dHB1dCIsIGltZy5uYW1lXQogICBjb21tb24uQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCAidmJtZXRhIikKIAotICBwdWJsaWNfa2V5X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSJhdmJwdWJrZXktIikKLSAgT1BUSU9OUy50ZW1wZmlsZXMuYXBwZW5kKHB1YmxpY19rZXlfZGlyKQotCi0gIEFwcGVuZFZCTWV0YUFyZ3NGb3JQYXJ0aXRpb24oY21kLCAiYm9vdCIsIGJvb3RfaW1nX3BhdGgsIHB1YmxpY19rZXlfZGlyKQotICBBcHBlbmRWQk1ldGFBcmdzRm9yUGFydGl0aW9uKGNtZCwgInN5c3RlbSIsIHN5c3RlbV9pbWdfcGF0aCwgcHVibGljX2tleV9kaXIpCi0gIEFwcGVuZFZCTWV0YUFyZ3NGb3JQYXJ0aXRpb24oY21kLCAidmVuZG9yIiwgdmVuZG9yX2ltZ19wYXRoLCBwdWJsaWNfa2V5X2RpcikKLSAgQXBwZW5kVkJNZXRhQXJnc0ZvclBhcnRpdGlvbihjbWQsICJkdGJvIiwgZHRib19pbWdfcGF0aCwgcHVibGljX2tleV9kaXIpCisgIHB1YmxpY19rZXlfZGlyID0gY29tbW9uLk1ha2VUZW1wRGlyKHByZWZpeD0iYXZicHVia2V5LSIpCisgIGZvciBwYXJ0aXRpb24sIHBhdGggaW4gcGFydGl0aW9ucy5pdGVtcygpOgorICAgIGFzc2VydCBwYXJ0aXRpb24gaW4gY29tbW9uLkFWQl9QQVJUSVRJT05TLCAnVW5rbm93biBwYXJ0aXRpb246ICVzJyAlICgKKyAgICAgICAgcGFydGl0aW9uLCkKKyAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMocGF0aCksICdGYWlsZWQgdG8gZmluZCAlcyBmb3IgcGFydGl0aW9uICVzJyAlICgKKyAgICAgICAgcGF0aCwgcGFydGl0aW9uKQorICAgIEFwcGVuZFZCTWV0YUFyZ3NGb3JQYXJ0aXRpb24oY21kLCBwYXJ0aXRpb24sIHBhdGgsIHB1YmxpY19rZXlfZGlyKQogCiAgIGFyZ3MgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl92Ym1ldGFfYXJncyIpCiAgIGlmIGFyZ3MgYW5kIGFyZ3Muc3RyaXAoKToKQEAgLTQwMyw5ICs0MDUsOSBAQAogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbWFnZV9wYXRoKToKICAgICAgICAgICBjb250aW51ZQogICAgICAgICBmb3VuZCA9IEZhbHNlCi0gICAgICAgIGZvciBkaXIgaW4gWydJTUFHRVMnLCAnUkFESU8nLCAnVkVORE9SX0lNQUdFUycsICdQUkVCVUlMVF9JTUFHRVMnXToKKyAgICAgICAgZm9yIGRpcl9uYW1lIGluIFsnSU1BR0VTJywgJ1JBRElPJywgJ1ZFTkRPUl9JTUFHRVMnLCAnUFJFQlVJTFRfSU1BR0VTJ106CiAgICAgICAgICAgYWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCBkaXIsIG9zLnBhdGguYmFzZW5hbWUoaW1hZ2VfcGF0aCkpCisgICAgICAgICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCBkaXJfbmFtZSwgb3MucGF0aC5iYXNlbmFtZShpbWFnZV9wYXRoKSkKICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhhbHRfcGF0aCk6CiAgICAgICAgICAgICBzcGxpdF9hcmdzW2luZGV4ICsgMV0gPSBhbHRfcGF0aAogICAgICAgICAgICAgZm91bmQgPSBUcnVlCkBAIC00MTksMTEgKzQyMSwxMyBAQAogICBpbWcuV3JpdGUoKQogCiAKLWRlZiBBZGRQYXJ0aXRpb25UYWJsZShvdXRwdXRfemlwLCBwcmVmaXg9IklNQUdFUy8iKToKK2RlZiBBZGRQYXJ0aXRpb25UYWJsZShvdXRwdXRfemlwKToKICAgIiIiQ3JlYXRlIGEgcGFydGl0aW9uIHRhYmxlIGltYWdlIGFuZCBzdG9yZSBpdCBpbiBvdXRwdXRfemlwLiIiIgogCi0gIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgInBhcnRpdGlvbi10YWJsZS5pbWciKQotICBicHQgPSBPdXRwdXRGaWxlKG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCBwcmVmaXgsICJwYXJ0aXRpb24tdGFibGUuYnB0IikKKyAgaW1nID0gT3V0cHV0RmlsZSgKKyAgICAgIG91dHB1dF96aXAsIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInBhcnRpdGlvbi10YWJsZS5pbWciKQorICBicHQgPSBPdXRwdXRGaWxlKAorICAgICAgb3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAicGFydGl0aW9uLXRhYmxlLmJwdCIpCiAKICAgIyB1c2UgQlBUVE9PTCBmcm9tIGVudmlyb24sIG9yICJicHR0b29sIiBpZiBlbXB0eSBvciBub3Qgc2V0LgogICBicHR0b29sID0gb3MuZ2V0ZW52KCJCUFRUT09MIikgb3IgImJwdHRvb2wiCkBAIC00NDgsMTIgKzQ1MiwxMiBAQAogICBicHQuV3JpdGUoKQogCiAKLWRlZiBBZGRDYWNoZShvdXRwdXRfemlwLCBwcmVmaXg9IklNQUdFUy8iKToKK2RlZiBBZGRDYWNoZShvdXRwdXRfemlwKToKICAgIiIiQ3JlYXRlIGFuIGVtcHR5IGNhY2hlIGltYWdlIGFuZCBzdG9yZSBpdCBpbiBvdXRwdXRfemlwLiIiIgogCi0gIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsIHByZWZpeCwgImNhY2hlLmltZyIpCisgIGltZyA9IE91dHB1dEZpbGUob3V0cHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAiY2FjaGUuaW1nIikKICAgaWYgb3MucGF0aC5leGlzdHMoaW1nLmlucHV0X25hbWUpOgotICAgIHByaW50KCJjYWNoZS5pbWcgYWxyZWFkeSBleGlzdHMgaW4gJXMsIG5vIG5lZWQgdG8gcmVidWlsZC4uLiIgJSAocHJlZml4LCkpCisgICAgcHJpbnQoImNhY2hlLmltZyBhbHJlYWR5IGV4aXN0czsgbm8gbmVlZCB0byByZWJ1aWxkLi4uIikKICAgICByZXR1cm4KIAogICBpbWFnZV9wcm9wcyA9IGJ1aWxkX2ltYWdlLkltYWdlUHJvcEZyb21HbG9iYWxEaWN0KE9QVElPTlMuaW5mb19kaWN0LCAiY2FjaGUiKQpAQCAtNDY5LDEzICs0NzMsNyBAQAogICB0aW1lc3RhbXAgPSAoZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwOSwgMSwgMSkgLSBlcG9jaCkudG90YWxfc2Vjb25kcygpCiAgIGltYWdlX3Byb3BzWyJ0aW1lc3RhbXAiXSA9IGludCh0aW1lc3RhbXApCiAKLSAgIyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGl0IGlzIG1ha2luZyBhbiBpbWFnZSBvdXQgb2YgbWF0dGVycyB0bwotICAjIG1reWFmZnMyaW1hZ2UuICBTbyB3ZSBjcmVhdGUgYSB0ZW1wIGRpciwgYW5kIHdpdGhpbiBpdCB3ZSBjcmVhdGUgYW4KLSAgIyBlbXB0eSBkaXIgbmFtZWQgImNhY2hlIiwgYW5kIGJ1aWxkIHRoZSBpbWFnZSBmcm9tIHRoYXQuCi0gIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCi0gIE9QVElPTlMudGVtcGZpbGVzLmFwcGVuZCh0ZW1wX2RpcikKLSAgdXNlcl9kaXIgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJjYWNoZSIpCi0gIG9zLm1rZGlyKHVzZXJfZGlyKQorICB1c2VyX2RpciA9IGNvbW1vbi5NYWtlVGVtcERpcigpCiAKICAgZnN0YWIgPSBPUFRJT05TLmluZm9fZGljdFsiZnN0YWIiXQogICBpZiBmc3RhYjoKQEAgLTQ4NywxNyArNDg1LDEzMyBAQAogICBpbWcuV3JpdGUoKQogCiAKK2RlZiBBZGRSYWRpb0ltYWdlc0ZvckFiT3RhKG91dHB1dF96aXAsIGFiX3BhcnRpdGlvbnMpOgorICAiIiJBZGRzIHRoZSByYWRpbyBpbWFnZXMgbmVlZGVkIGZvciBBL0IgT1RBIHRvIHRoZSBvdXRwdXQgZmlsZS4KKworICBJdCBwYXJzZXMgdGhlIGxpc3Qgb2YgQS9CIHBhcnRpdGlvbnMsIGxvb2tzIGZvciB0aGUgbWlzc2luZyBvbmVzIGZyb20gUkFESU8vCisgIG9yIFZFTkRPUl9JTUFHRVMvIGRpcnMsIGFuZCBjb3BpZXMgdGhlbSB0byBJTUFHRVMvIG9mIHRoZSBvdXRwdXQgZmlsZSAob3IKKyAgZGlyKS4KKworICBJdCBhbHNvIGVuc3VyZXMgdGhhdCBvbiByZXR1cm5pbmcgZnJvbSB0aGUgZnVuY3Rpb24gYWxsIHRoZSBsaXN0ZWQgQS9CCisgIHBhcnRpdGlvbnMgbXVzdCBoYXZlIHRoZWlyIGltYWdlcyBhdmFpbGFibGUgdW5kZXIgSU1BR0VTLy4KKworICBBcmdzOgorICAgIG91dHB1dF96aXA6IFRoZSBvdXRwdXQgemlwIGZpbGUgKG5lZWRzIHRvIGJlIGFscmVhZHkgb3BlbiksIG9yIE5vbmUgdG8KKyAgICAgICAgd3JpdGUgaW1hZ2VzIHRvIE9QVElPTlMuaW5wdXRfdG1wLy4KKyAgICBhYl9wYXJ0aXRpb25zOiBUaGUgbGlzdCBvZiBBL0IgcGFydGl0aW9ucy4KKworICBSYWlzZXM6CisgICAgQXNzZXJ0aW9uRXJyb3I6IElmIGl0IGNhbid0IGZpbmQgYW4gaW1hZ2UuCisgICIiIgorICBmb3IgcGFydGl0aW9uIGluIGFiX3BhcnRpdGlvbnM6CisgICAgaW1nX25hbWUgPSBwYXJ0aXRpb24uc3RyaXAoKSArICIuaW1nIgorICAgIHByZWJ1aWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCBpbWdfbmFtZSkKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhwcmVidWlsdF9wYXRoKToKKyAgICAgIHByaW50KCIlcyBhbHJlYWR5IGV4aXN0cywgbm8gbmVlZCB0byBvdmVyd3JpdGUuLi4iICUgKGltZ19uYW1lLCkpCisgICAgICBjb250aW51ZQorCisgICAgaW1nX3JhZGlvX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJSQURJTyIsIGltZ19uYW1lKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKGltZ19yYWRpb19wYXRoKToKKyAgICAgIGlmIG91dHB1dF96aXA6CisgICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBpbWdfcmFkaW9fcGF0aCwgIklNQUdFUy8iICsgaW1nX25hbWUpCisgICAgICBlbHNlOgorICAgICAgICBzaHV0aWwuY29weShpbWdfcmFkaW9fcGF0aCwgcHJlYnVpbHRfcGF0aCkKKyAgICAgIGNvbnRpbnVlCisKKyAgICAjIFdhbGsgdGhyb3VnaCBWRU5ET1JfSU1BR0VTLyBzaW5jZSBmaWxlcyBjb3VsZCBiZSB1bmRlciBzdWJkaXJzLgorICAgIGltZ192ZW5kb3JfZGlyID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiVkVORE9SX0lNQUdFUyIpCisgICAgZm9yIHJvb3QsIF8sIGZpbGVzIGluIG9zLndhbGsoaW1nX3ZlbmRvcl9kaXIpOgorICAgICAgaWYgaW1nX25hbWUgaW4gZmlsZXM6CisgICAgICAgIGlmIG91dHB1dF96aXA6CisgICAgICAgICAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIG9zLnBhdGguam9pbihyb290LCBpbWdfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJTUFHRVMvIiArIGltZ19uYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgIHNodXRpbC5jb3B5KG9zLnBhdGguam9pbihyb290LCBpbWdfbmFtZSksIHByZWJ1aWx0X3BhdGgpCisgICAgICAgIGJyZWFrCisKKyAgICAjIEFzc2VydCB0aGF0IHRoZSBpbWFnZSBpcyBwcmVzZW50IHVuZGVyIElNQUdFUy8gbm93LgorICAgIGlmIG91dHB1dF96aXA6CisgICAgICAjIFppcCBzcGVjIHNheXM6IEFsbCBzbGFzaGVzIE1VU1QgYmUgZm9yd2FyZCBzbGFzaGVzLgorICAgICAgaW1nX3BhdGggPSAnSU1BR0VTLycgKyBpbWdfbmFtZQorICAgICAgYXNzZXJ0IGltZ19wYXRoIGluIG91dHB1dF96aXAubmFtZWxpc3QoKSwgImNhbm5vdCBmaW5kICIgKyBpbWdfbmFtZQorICAgIGVsc2U6CisgICAgICBpbWdfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsIGltZ19uYW1lKQorICAgICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKGltZ19wYXRoKSwgImNhbm5vdCBmaW5kICIgKyBpbWdfbmFtZQorCisKK2RlZiBBZGRDYXJlTWFwVHh0Rm9yQWJPdGEob3V0cHV0X3ppcCwgYWJfcGFydGl0aW9ucywgaW1hZ2VfcGF0aHMpOgorICAiIiJHZW5lcmF0ZXMgYW5kIGFkZHMgY2FyZV9tYXAudHh0IGZvciBzeXN0ZW0gYW5kIHZlbmRvciBwYXJ0aXRpb25zLgorCisgIEFyZ3M6CisgICAgb3V0cHV0X3ppcDogVGhlIG91dHB1dCB6aXAgZmlsZSAobmVlZHMgdG8gYmUgYWxyZWFkeSBvcGVuKSwgb3IgTm9uZSB0bworICAgICAgICB3cml0ZSBpbWFnZXMgdG8gT1BUSU9OUy5pbnB1dF90bXAvLgorICAgIGFiX3BhcnRpdGlvbnM6IFRoZSBsaXN0IG9mIEEvQiBwYXJ0aXRpb25zLgorICAgIGltYWdlX3BhdGhzOiBBIG1hcCBmcm9tIHRoZSBwYXJ0aXRpb24gbmFtZSB0byB0aGUgaW1hZ2UgcGF0aC4KKyAgIiIiCisgIGNhcmVfbWFwX2xpc3QgPSBbXQorICBmb3IgcGFydGl0aW9uIGluIGFiX3BhcnRpdGlvbnM6CisgICAgcGFydGl0aW9uID0gcGFydGl0aW9uLnN0cmlwKCkKKyAgICBpZiBwYXJ0aXRpb24gbm90IGluIFBBUlRJVElPTlNfV0lUSF9DQVJFX01BUDoKKyAgICAgIGNvbnRpbnVlCisKKyAgICB2ZXJpdHlfYmxvY2tfZGV2aWNlID0gInt9X3Zlcml0eV9ibG9ja19kZXZpY2UiLmZvcm1hdChwYXJ0aXRpb24pCisgICAgYXZiX2hhc2h0cmVlX2VuYWJsZSA9ICJhdmJfe31faGFzaHRyZWVfZW5hYmxlIi5mb3JtYXQocGFydGl0aW9uKQorICAgIGlmICh2ZXJpdHlfYmxvY2tfZGV2aWNlIGluIE9QVElPTlMuaW5mb19kaWN0IG9yCisgICAgICAgIE9QVElPTlMuaW5mb19kaWN0LmdldChhdmJfaGFzaHRyZWVfZW5hYmxlKSA9PSAidHJ1ZSIpOgorICAgICAgaW1hZ2VfcGF0aCA9IGltYWdlX3BhdGhzW3BhcnRpdGlvbl0KKyAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhpbWFnZV9wYXRoKQorICAgICAgY2FyZV9tYXBfbGlzdCArPSBHZXRDYXJlTWFwKHBhcnRpdGlvbiwgaW1hZ2VfcGF0aCkKKworICBpZiBjYXJlX21hcF9saXN0OgorICAgIGNhcmVfbWFwX3BhdGggPSAiTUVUQS9jYXJlX21hcC50eHQiCisgICAgaWYgb3V0cHV0X3ppcCBhbmQgY2FyZV9tYXBfcGF0aCBub3QgaW4gb3V0cHV0X3ppcC5uYW1lbGlzdCgpOgorICAgICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF96aXAsIGNhcmVfbWFwX3BhdGgsICdcbicuam9pbihjYXJlX21hcF9saXN0KSkKKyAgICBlbHNlOgorICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgY2FyZV9tYXBfcGF0aCksICd3JykgYXMgZnA6CisgICAgICAgIGZwLndyaXRlKCdcbicuam9pbihjYXJlX21hcF9saXN0KSkKKyAgICAgIGlmIG91dHB1dF96aXA6CisgICAgICAgIE9QVElPTlMucmVwbGFjZV91cGRhdGVkX2ZpbGVzX2xpc3QuYXBwZW5kKGNhcmVfbWFwX3BhdGgpCisKKworZGVmIEFkZFBhY2tSYWRpb0ltYWdlcyhvdXRwdXRfemlwLCBpbWFnZXMpOgorICAiIiJDb3BpZXMgaW1hZ2VzIGxpc3RlZCBpbiBNRVRBL3BhY2tfcmFkaW9pbWFnZXMudHh0IGZyb20gUkFESU8vIHRvIElNQUdFUy8uCisKKyAgQXJnczoKKyAgICBvdXRwdXRfemlwOiBUaGUgb3V0cHV0IHppcCBmaWxlIChuZWVkcyB0byBiZSBhbHJlYWR5IG9wZW4pLCBvciBOb25lIHRvCisgICAgICAgIHdyaXRlIGltYWdlcyB0byBPUFRJT05TLmlucHV0X3RtcC8uCisgICAgaW1hZ2VzOiBBIGxpc3Qgb2YgaW1hZ2UgbmFtZXMuCisKKyAgUmFpc2VzOgorICAgIEFzc2VydGlvbkVycm9yOiBJZiBhIGxpc3RlZCBpbWFnZSBjYW4ndCBiZSBmb3VuZC4KKyAgIiIiCisgIGZvciBpbWFnZSBpbiBpbWFnZXM6CisgICAgaW1nX25hbWUgPSBpbWFnZS5zdHJpcCgpCisgICAgXywgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChpbWdfbmFtZSkKKyAgICBpZiBub3QgZXh0OgorICAgICAgaW1nX25hbWUgKz0gIi5pbWciCisKKyAgICBwcmVidWlsdF9wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgaW1nX25hbWUpCisgICAgaWYgb3MucGF0aC5leGlzdHMocHJlYnVpbHRfcGF0aCk6CisgICAgICBwcmludCgiJXMgYWxyZWFkeSBleGlzdHMsIG5vIG5lZWQgdG8gb3ZlcndyaXRlLi4uIiAlIChpbWdfbmFtZSwpKQorICAgICAgY29udGludWUKKworICAgIGltZ19yYWRpb19wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiUkFESU8iLCBpbWdfbmFtZSkKKyAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoaW1nX3JhZGlvX3BhdGgpLCBcCisgICAgICAgICJGYWlsZWQgdG8gZmluZCAlcyBhdCAlcyIgJSAoaW1nX25hbWUsIGltZ19yYWRpb19wYXRoKQorCisgICAgaWYgb3V0cHV0X3ppcDoKKyAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBpbWdfcmFkaW9fcGF0aCwgIklNQUdFUy8iICsgaW1nX25hbWUpCisgICAgZWxzZToKKyAgICAgIHNodXRpbC5jb3B5KGltZ19yYWRpb19wYXRoLCBwcmVidWlsdF9wYXRoKQorCisKIGRlZiBSZXBsYWNlVXBkYXRlZEZpbGVzKHppcF9maWxlbmFtZSwgZmlsZXNfbGlzdCk6Ci0gICIiIlVwZGF0ZSBhbGwgdGhlIHppcCBlbnRyaWVzIGxpc3RlZCBpbiB0aGUgZmlsZXNfbGlzdC4KKyAgIiIiVXBkYXRlcyBhbGwgdGhlIFpJUCBlbnRyaWVzIGxpc3RlZCBpbiBmaWxlc19saXN0LgogCiAgIEZvciBub3cgdGhlIGxpc3QgaW5jbHVkZXMgTUVUQS9jYXJlX21hcC50eHQsIGFuZCB0aGUgcmVsYXRlZCBmaWxlcyB1bmRlcgogICBTWVNURU0vIGFmdGVyIHJlYnVpbGRpbmcgcmVjb3ZlcnkuCiAgICIiIgotCi0gIGNtZCA9IFsiemlwIiwgIi1kIiwgemlwX2ZpbGVuYW1lXSArIGZpbGVzX2xpc3QKLSAgcCA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCi0gIHAuY29tbXVuaWNhdGUoKQotCisgIGNvbW1vbi5aaXBEZWxldGUoemlwX2ZpbGVuYW1lLCBmaWxlc19saXN0KQogICBvdXRwdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgImEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZSkKQEAgLTUwOSwxMTYgKzYyMywxMjEgQEAKIAogCiBkZWYgQWRkSW1hZ2VzVG9UYXJnZXRGaWxlcyhmaWxlbmFtZSk6CisgICIiIkNyZWF0ZXMgYW5kIGFkZHMgaW1hZ2VzIChib290L3JlY292ZXJ5L3N5c3RlbS8uLi4pIHRvIGEgdGFyZ2V0X2ZpbGVzLnppcC4KKworICBJdCB3b3JrcyB3aXRoIGVpdGhlciBhIHppcCBmaWxlICh6aXAgbW9kZSksIG9yIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlCisgIGZpbGVzIHRvIGJlIHBhY2tlZCBpbnRvIGEgdGFyZ2V0X2ZpbGVzLnppcCAoZGlyIG1vZGUpLiBUaGUgbGF0dGVyIGlzIHVzZWQgd2hlbgorICBiZWluZyBjYWxsZWQgZnJvbSBidWlsZC9tYWtlL2NvcmUvTWFrZWZpbGUuCisKKyAgVGhlIGltYWdlcyB3aWxsIGJlIGNyZWF0ZWQgdW5kZXIgSU1BR0VTLyBpbiB0aGUgaW5wdXQgdGFyZ2V0X2ZpbGVzLnppcC4KKworICBBcmdzOgorICAgIGZpbGVuYW1lOiB0aGUgdGFyZ2V0X2ZpbGVzLnppcCwgb3IgdGhlIHppcCByb290IGRpcmVjdG9yeS4KKyAgIiIiCiAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgogICAgIE9QVElPTlMuaW5wdXRfdG1wID0gb3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKQotICAgIGlucHV0X3ppcCA9IE5vbmUKICAgZWxzZToKLSAgICBPUFRJT05TLmlucHV0X3RtcCwgaW5wdXRfemlwID0gY29tbW9uLlVuemlwVGVtcChmaWxlbmFtZSkKKyAgICBPUFRJT05TLmlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoZmlsZW5hbWUpCiAKICAgaWYgbm90IE9QVElPTlMuYWRkX21pc3Npbmc6CiAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiKSk6CiAgICAgICBwcmludCgidGFyZ2V0X2ZpbGVzIGFwcGVhcnMgdG8gYWxyZWFkeSBjb250YWluIGltYWdlcy4iKQogICAgICAgc3lzLmV4aXQoMSkKIAotICAjIHZlbmRvci5pbWcgaXMgdW5saWtlIHN5c3RlbS5pbWcgb3Igc3lzdGVtX290aGVyLmltZy4gQmVjYXVzZSBpdCBjb3VsZCBiZQotICAjIGJ1aWx0IGZyb20gc291cmNlLCBvciBkcm9wcGVkIGludG8gdGFyZ2V0X2ZpbGVzLnppcCBhcyBhIHByZWJ1aWx0IGJsb2IuIFdlCi0gICMgY29uc2lkZXIgZWl0aGVyIG9mIHRoZW0gYXMgdmVuZG9yLmltZyBiZWluZyBhdmFpbGFibGUsIHdoaWNoIGNvdWxkIGJlIHVzZWQKLSAgIyB3aGVuIGdlbmVyYXRpbmcgdmJtZXRhLmltZyBmb3IgQVZCLgorICBPUFRJT05TLmluZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QoT1BUSU9OUy5pbnB1dF90bXAsIE9QVElPTlMuaW5wdXRfdG1wKQorCisgIGhhc19yZWNvdmVyeSA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgibm9fcmVjb3ZlcnkiKSAhPSAidHJ1ZSIKKworICAjIHt2ZW5kb3IscHJvZHVjdH0uaW1nIGlzIHVubGlrZSBzeXN0ZW0uaW1nIG9yIHN5c3RlbV9vdGhlci5pbWcuIEJlY2F1c2UgaXQKKyAgIyBjb3VsZCBiZSBidWlsdCBmcm9tIHNvdXJjZSwgb3IgZHJvcHBlZCBpbnRvIHRhcmdldF9maWxlcy56aXAgYXMgYSBwcmVidWlsdAorICAjIGJsb2IuIFdlIGNvbnNpZGVyIGVpdGhlciBvZiB0aGVtIGFzIHt2ZW5kb3IscHJvZHVjdH0uaW1nIGJlaW5nIGF2YWlsYWJsZSwKKyAgIyB3aGljaCBjb3VsZCBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB2Ym1ldGEuaW1nIGZvciBBVkIuCiAgIGhhc192ZW5kb3IgPSAob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJWRU5ET1IiKSkgb3IKICAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVuZG9yLmltZyIpKSkKKyAgaGFzX3Byb2R1Y3QgPSAob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJQUk9EVUNUIikpIG9yCisgICAgICAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZHVjdC5pbWciKSkpCiAgIGhhc19zeXN0ZW1fb3RoZXIgPSBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTWVNURU1fT1RIRVIiKSkKIAotICBpZiBpbnB1dF96aXA6Ci0gICAgT1BUSU9OUy5pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KGlucHV0X3ppcCwgT1BUSU9OUy5pbnB1dF90bXApCi0KLSAgICBjb21tb24uWmlwQ2xvc2UoaW5wdXRfemlwKQorICAjIFNldCB1cCB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uLiBJdCB3cml0ZXMgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSBmb3IgZGlyCisgICMgbW9kZTsgb3RoZXJ3aXNlIGFwcGVuZHMgdG8gdGhlIGdpdmVuIFpJUC4KKyAgaWYgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CisgICAgb3V0cHV0X3ppcCA9IE5vbmUKKyAgZWxzZToKICAgICBvdXRwdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lLCAiYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZSkKLSAgZWxzZToKLSAgICBPUFRJT05TLmluZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QoZmlsZW5hbWUsIGZpbGVuYW1lKQotICAgIG91dHB1dF96aXAgPSBOb25lCi0gICAgaW1hZ2VzX2RpciA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIpCi0gICAgaWYgbm90IG9zLnBhdGguaXNkaXIoaW1hZ2VzX2Rpcik6Ci0gICAgICBvcy5tYWtlZGlycyhpbWFnZXNfZGlyKQotICAgIGltYWdlc19kaXIgPSBOb25lCiAKLSAgaGFzX3JlY292ZXJ5ID0gKE9QVElPTlMuaW5mb19kaWN0LmdldCgibm9fcmVjb3ZlcnkiKSAhPSAidHJ1ZSIpCisgICMgQWx3YXlzIG1ha2UgaW5wdXRfdG1wL0lNQUdFUyBhdmFpbGFibGUsIHNpbmNlIHdlIG1heSBzdGFnZSBib290IC8gcmVjb3ZlcnkKKyAgIyBpbWFnZXMgdGhlcmUgZXZlbiB1bmRlciB6aXAgbW9kZS4gVGhlIGRpcmVjdG9yeSB3aWxsIGJlIGNsZWFuZWQgdXAgYXMgcGFydAorICAjIG9mIE9QVElPTlMuaW5wdXRfdG1wLgorICBpbWFnZXNfZGlyID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIikKKyAgaWYgbm90IG9zLnBhdGguaXNkaXIoaW1hZ2VzX2Rpcik6CisgICAgb3MubWFrZWRpcnMoaW1hZ2VzX2RpcikKIAotICBpZiBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl9lbmFibGUiKSA9PSAidHJ1ZSI6Ci0gICAgZnAgPSBOb25lCi0gICAgaWYgImJ1aWxkLnByb3AiIGluIE9QVElPTlMuaW5mb19kaWN0OgotICAgICAgYnVpbGRfcHJvcCA9IE9QVElPTlMuaW5mb19kaWN0WyJidWlsZC5wcm9wIl0KLSAgICAgIGlmICJyby5idWlsZC5maW5nZXJwcmludCIgaW4gYnVpbGRfcHJvcDoKLSAgICAgICAgZnAgPSBidWlsZF9wcm9wWyJyby5idWlsZC5maW5nZXJwcmludCJdCi0gICAgICBlbGlmICJyby5idWlsZC50aHVtYnByaW50IiBpbiBidWlsZF9wcm9wOgotICAgICAgICBmcCA9IGJ1aWxkX3Byb3BbInJvLmJ1aWxkLnRodW1icHJpbnQiXQotICAgIGlmIGZwOgotICAgICAgT1BUSU9OUy5pbmZvX2RpY3RbImF2Yl9zYWx0Il0gPSBoYXNobGliLnNoYTI1NihmcCkuaGV4ZGlnZXN0KCkKKyAgIyBBIG1hcCBiZXR3ZWVuIHBhcnRpdGlvbiBuYW1lcyBhbmQgdGhlaXIgcGF0aHMsIHdoaWNoIGNvdWxkIGJlIHVzZWQgd2hlbgorICAjIGdlbmVyYXRpbmcgQVZCIHZibWV0YSBpbWFnZS4KKyAgcGFydGl0aW9ucyA9IGRpY3QoKQogCiAgIGRlZiBiYW5uZXIocyk6CiAgICAgcHJpbnQoIlxuXG4rKysrICIgKyBzICsgIiArKysrXG5cbiIpCiAKLSAgcHJlYnVpbHRfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJib290LmltZyIpCi0gIGJvb3RfaW1hZ2UgPSBOb25lCi0gIGlmIG9zLnBhdGguZXhpc3RzKHByZWJ1aWx0X3BhdGgpOgotICAgIGJhbm5lcigiYm9vdCIpCi0gICAgcHJpbnQoImJvb3QuaW1nIGFscmVhZHkgZXhpc3RzIGluIElNQUdFUy8sIG5vIG5lZWQgdG8gcmVidWlsZC4uLiIpCi0gICAgaWYgT1BUSU9OUy5yZWJ1aWxkX3JlY292ZXJ5OgotICAgICAgYm9vdF9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgICAgICJJTUFHRVMvYm9vdC5pbWciLCAiYm9vdC5pbWciLCBPUFRJT05TLmlucHV0X3RtcCwgIkJPT1QiKQotICBlbHNlOgotICAgIGJhbm5lcigiYm9vdCIpCi0gICAgYm9vdF9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgICAiSU1BR0VTL2Jvb3QuaW1nIiwgImJvb3QuaW1nIiwgT1BUSU9OUy5pbnB1dF90bXAsICJCT09UIikKLSAgICBpZiBib290X2ltYWdlOgorICBiYW5uZXIoImJvb3QiKQorICAjIGNvbW1vbi5HZXRCb290YWJsZUltYWdlKCkgcmV0dXJucyB0aGUgaW1hZ2UgZGlyZWN0bHkgaWYgcHJlc2VudC4KKyAgYm9vdF9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAorICAgICAgIklNQUdFUy9ib290LmltZyIsICJib290LmltZyIsIE9QVElPTlMuaW5wdXRfdG1wLCAiQk9PVCIpCisgICMgYm9vdC5pbWcgbWF5IGJlIHVuYXZhaWxhYmxlIGluIHNvbWUgdGFyZ2V0cyAoZS5nLiBhb3NwX2FybTY0KS4KKyAgaWYgYm9vdF9pbWFnZToKKyAgICBwYXJ0aXRpb25zWydib290J10gPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCAiYm9vdC5pbWciKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXJ0aXRpb25zWydib290J10pOgorICAgICAgYm9vdF9pbWFnZS5Xcml0ZVRvRGlyKE9QVElPTlMuaW5wdXRfdG1wKQogICAgICAgaWYgb3V0cHV0X3ppcDoKICAgICAgICAgYm9vdF9pbWFnZS5BZGRUb1ppcChvdXRwdXRfemlwKQotICAgICAgZWxzZToKLSAgICAgICAgYm9vdF9pbWFnZS5Xcml0ZVRvRGlyKE9QVElPTlMuaW5wdXRfdG1wKQogCiAgIHJlY292ZXJ5X2ltYWdlID0gTm9uZQogICBpZiBoYXNfcmVjb3Zlcnk6CiAgICAgYmFubmVyKCJyZWNvdmVyeSIpCi0gICAgcHJlYnVpbHRfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJyZWNvdmVyeS5pbWciKQotICAgIGlmIG9zLnBhdGguZXhpc3RzKHByZWJ1aWx0X3BhdGgpOgotICAgICAgcHJpbnQoInJlY292ZXJ5LmltZyBhbHJlYWR5IGV4aXN0cyBpbiBJTUFHRVMvLCBubyBuZWVkIHRvIHJlYnVpbGQuLi4iKQotICAgICAgaWYgT1BUSU9OUy5yZWJ1aWxkX3JlY292ZXJ5OgotICAgICAgICByZWNvdmVyeV9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgICAgICAgIklNQUdFUy9yZWNvdmVyeS5pbWciLCAicmVjb3ZlcnkuaW1nIiwgT1BUSU9OUy5pbnB1dF90bXAsCi0gICAgICAgICAgICAiUkVDT1ZFUlkiKQotICAgIGVsc2U6Ci0gICAgICByZWNvdmVyeV9pbWFnZSA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgICAgICJJTUFHRVMvcmVjb3ZlcnkuaW1nIiwgInJlY292ZXJ5LmltZyIsIE9QVElPTlMuaW5wdXRfdG1wLCAiUkVDT1ZFUlkiKQotICAgICAgaWYgcmVjb3ZlcnlfaW1hZ2U6Ci0gICAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICAgcmVjb3ZlcnlfaW1hZ2UuQWRkVG9aaXAob3V0cHV0X3ppcCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICByZWNvdmVyeV9pbWFnZS5Xcml0ZVRvRGlyKE9QVElPTlMuaW5wdXRfdG1wKQorICAgIHJlY292ZXJ5X2ltYWdlID0gY29tbW9uLkdldEJvb3RhYmxlSW1hZ2UoCisgICAgICAgICJJTUFHRVMvcmVjb3ZlcnkuaW1nIiwgInJlY292ZXJ5LmltZyIsIE9QVElPTlMuaW5wdXRfdG1wLCAiUkVDT1ZFUlkiKQorICAgIGFzc2VydCByZWNvdmVyeV9pbWFnZSwgIkZhaWxlZCB0byBjcmVhdGUgcmVjb3ZlcnkuaW1nLiIKKyAgICBwYXJ0aXRpb25zWydyZWNvdmVyeSddID0gb3MucGF0aC5qb2luKAorICAgICAgICBPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsICJyZWNvdmVyeS5pbWciKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXJ0aXRpb25zWydyZWNvdmVyeSddKToKKyAgICAgIHJlY292ZXJ5X2ltYWdlLldyaXRlVG9EaXIoT1BUSU9OUy5pbnB1dF90bXApCisgICAgICBpZiBvdXRwdXRfemlwOgorICAgICAgICByZWNvdmVyeV9pbWFnZS5BZGRUb1ppcChvdXRwdXRfemlwKQogCiAgICAgICBiYW5uZXIoInJlY292ZXJ5ICh0d28tc3RlcCBpbWFnZSkiKQogICAgICAgIyBUaGUgc3BlY2lhbCByZWNvdmVyeS5pbWcgZm9yIHR3by1zdGVwIHBhY2thZ2UgdXNlLgogICAgICAgcmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2UgPSBjb21tb24uR2V0Qm9vdGFibGVJbWFnZSgKICAgICAgICAgICAiSU1BR0VTL3JlY292ZXJ5LXR3by1zdGVwLmltZyIsICJyZWNvdmVyeS10d28tc3RlcC5pbWciLAogICAgICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCAiUkVDT1ZFUlkiLCB0d29fc3RlcF9pbWFnZT1UcnVlKQotICAgICAgaWYgcmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2U6CisgICAgICBhc3NlcnQgcmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2UsICJGYWlsZWQgdG8gY3JlYXRlIHJlY292ZXJ5LXR3by1zdGVwLmltZy4iCisgICAgICByZWNvdmVyeV90d29fc3RlcF9pbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCAiSU1BR0VTIiwgInJlY292ZXJ5LXR3by1zdGVwLmltZyIpCisgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2VfcGF0aCk6CisgICAgICAgIHJlY292ZXJ5X3R3b19zdGVwX2ltYWdlLldyaXRlVG9EaXIoT1BUSU9OUy5pbnB1dF90bXApCiAgICAgICAgIGlmIG91dHB1dF96aXA6CiAgICAgICAgICAgcmVjb3ZlcnlfdHdvX3N0ZXBfaW1hZ2UuQWRkVG9aaXAob3V0cHV0X3ppcCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICByZWNvdmVyeV90d29fc3RlcF9pbWFnZS5Xcml0ZVRvRGlyKE9QVElPTlMuaW5wdXRfdG1wKQogCiAgIGJhbm5lcigic3lzdGVtIikKLSAgc3lzdGVtX2ltZ19wYXRoID0gQWRkU3lzdGVtKAorICBwYXJ0aXRpb25zWydzeXN0ZW0nXSA9IEFkZFN5c3RlbSgKICAgICAgIG91dHB1dF96aXAsIHJlY292ZXJ5X2ltZz1yZWNvdmVyeV9pbWFnZSwgYm9vdF9pbWc9Ym9vdF9pbWFnZSkKLSAgdmVuZG9yX2ltZ19wYXRoID0gTm9uZQorCiAgIGlmIGhhc192ZW5kb3I6CiAgICAgYmFubmVyKCJ2ZW5kb3IiKQotICAgIHZlbmRvcl9pbWdfcGF0aCA9IEFkZFZlbmRvcihvdXRwdXRfemlwKQorICAgIHBhcnRpdGlvbnNbJ3ZlbmRvciddID0gQWRkVmVuZG9yKG91dHB1dF96aXApCisKKyAgaWYgaGFzX3Byb2R1Y3Q6CisgICAgYmFubmVyKCJwcm9kdWN0IikKKyAgICBwYXJ0aXRpb25zWydwcm9kdWN0J10gPSBBZGRQcm9kdWN0KG91dHB1dF96aXApCisKICAgaWYgaGFzX3N5c3RlbV9vdGhlcjoKICAgICBiYW5uZXIoInN5c3RlbV9vdGhlciIpCiAgICAgQWRkU3lzdGVtT3RoZXIob3V0cHV0X3ppcCkKKwogICBpZiBub3QgT1BUSU9OUy5pc19zaWduaW5nOgogICAgIGJhbm5lcigidXNlcmRhdGEiKQogICAgIEFkZFVzZXJkYXRhKG91dHB1dF96aXApCkBAIC02MjksMTA3ICs3NDgsMzYgQEAKICAgICBiYW5uZXIoInBhcnRpdGlvbi10YWJsZSIpCiAgICAgQWRkUGFydGl0aW9uVGFibGUob3V0cHV0X3ppcCkKIAotICBkdGJvX2ltZ19wYXRoID0gTm9uZQogICBpZiBPUFRJT05TLmluZm9fZGljdC5nZXQoImhhc19kdGJvIikgPT0gInRydWUiOgogICAgIGJhbm5lcigiZHRibyIpCi0gICAgZHRib19pbWdfcGF0aCA9IEFkZER0Ym8ob3V0cHV0X3ppcCkKKyAgICBwYXJ0aXRpb25zWydkdGJvJ10gPSBBZGREdGJvKG91dHB1dF96aXApCiAKICAgaWYgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfZW5hYmxlIikgPT0gInRydWUiOgogICAgIGJhbm5lcigidmJtZXRhIikKLSAgICBib290X2NvbnRlbnRzID0gYm9vdF9pbWFnZS5Xcml0ZVRvVGVtcCgpCi0gICAgQWRkVkJNZXRhKG91dHB1dF96aXAsIGJvb3RfY29udGVudHMubmFtZSwgc3lzdGVtX2ltZ19wYXRoLAotICAgICAgICAgICAgICB2ZW5kb3JfaW1nX3BhdGgsIGR0Ym9faW1nX3BhdGgpCisgICAgQWRkVkJNZXRhKG91dHB1dF96aXAsIHBhcnRpdGlvbnMpCiAKLSAgIyBGb3IgZGV2aWNlcyB1c2luZyBBL0IgdXBkYXRlLCBjb3B5IG92ZXIgaW1hZ2VzIGZyb20gUkFESU8vIGFuZC9vcgotICAjIFZFTkRPUl9JTUFHRVMvIHRvIElNQUdFUy8gYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCB0aGUgbmVlZGVkCi0gICMgaW1hZ2VzIHJlYWR5IHVuZGVyIElNQUdFUy8uIEFsbCBpbWFnZXMgc2hvdWxkIGhhdmUgJy5pbWcnIGFzIGV4dGVuc2lvbi4KICAgYmFubmVyKCJyYWRpbyIpCi0gIGFiX3BhcnRpdGlvbnMgPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJNRVRBIiwgImFiX3BhcnRpdGlvbnMudHh0IikKLSAgaWYgb3MucGF0aC5leGlzdHMoYWJfcGFydGl0aW9ucyk6Ci0gICAgd2l0aCBvcGVuKGFiX3BhcnRpdGlvbnMsICdyJykgYXMgZjoKLSAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQotICAgICMgRm9yIGRldmljZXMgdXNpbmcgQS9CIHVwZGF0ZSwgZ2VuZXJhdGUgY2FyZV9tYXAgZm9yIHN5c3RlbSBhbmQgdmVuZG9yCi0gICAgIyBwYXJ0aXRpb25zIChpZiBwcmVzZW50KSwgdGhlbiB3cml0ZSB0aGlzIGZpbGUgdG8gdGFyZ2V0X2ZpbGVzIHBhY2thZ2UuCi0gICAgY2FyZV9tYXBfbGlzdCA9IFtdCi0gICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICBpZiBsaW5lLnN0cmlwKCkgPT0gInN5c3RlbSIgYW5kICgKLSAgICAgICAgICAic3lzdGVtX3Zlcml0eV9ibG9ja19kZXZpY2UiIGluIE9QVElPTlMuaW5mb19kaWN0IG9yCi0gICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfc3lzdGVtX2hhc2h0cmVlX2VuYWJsZSIpID09ICJ0cnVlIik6Ci0gICAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhzeXN0ZW1faW1nX3BhdGgpCi0gICAgICAgIGNhcmVfbWFwX2xpc3QgKz0gR2V0Q2FyZU1hcCgic3lzdGVtIiwgc3lzdGVtX2ltZ19wYXRoKQotICAgICAgaWYgbGluZS5zdHJpcCgpID09ICJ2ZW5kb3IiIGFuZCAoCi0gICAgICAgICAgInZlbmRvcl92ZXJpdHlfYmxvY2tfZGV2aWNlIiBpbiBPUFRJT05TLmluZm9fZGljdCBvcgotICAgICAgICAgIE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3ZlbmRvcl9oYXNodHJlZV9lbmFibGUiKSA9PSAidHJ1ZSIpOgotICAgICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHModmVuZG9yX2ltZ19wYXRoKQotICAgICAgICBjYXJlX21hcF9saXN0ICs9IEdldENhcmVNYXAoInZlbmRvciIsIHZlbmRvcl9pbWdfcGF0aCkKKyAgYWJfcGFydGl0aW9uc190eHQgPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJNRVRBIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiX3BhcnRpdGlvbnMudHh0IikKKyAgaWYgb3MucGF0aC5leGlzdHMoYWJfcGFydGl0aW9uc190eHQpOgorICAgIHdpdGggb3BlbihhYl9wYXJ0aXRpb25zX3R4dCwgJ3InKSBhcyBmOgorICAgICAgYWJfcGFydGl0aW9ucyA9IGYucmVhZGxpbmVzKCkKIAotICAgICAgaW1nX25hbWUgPSBsaW5lLnN0cmlwKCkgKyAiLmltZyIKLSAgICAgIHByZWJ1aWx0X3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCBpbWdfbmFtZSkKLSAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHByZWJ1aWx0X3BhdGgpOgotICAgICAgICBwcmludCgiJXMgYWxyZWFkeSBleGlzdHMsIG5vIG5lZWQgdG8gb3ZlcndyaXRlLi4uIiAlIChpbWdfbmFtZSwpKQotICAgICAgICBjb250aW51ZQorICAgICMgRm9yIGRldmljZXMgdXNpbmcgQS9CIHVwZGF0ZSwgY29weSBvdmVyIGltYWdlcyBmcm9tIFJBRElPLyBhbmQvb3IKKyAgICAjIFZFTkRPUl9JTUFHRVMvIHRvIElNQUdFUy8gYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCB0aGUgbmVlZGVkCisgICAgIyBpbWFnZXMgcmVhZHkgdW5kZXIgSU1BR0VTLy4gQWxsIGltYWdlcyBzaG91bGQgaGF2ZSAnLmltZycgYXMgZXh0ZW5zaW9uLgorICAgIEFkZFJhZGlvSW1hZ2VzRm9yQWJPdGEob3V0cHV0X3ppcCwgYWJfcGFydGl0aW9ucykKIAotICAgICAgaW1nX3JhZGlvX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJSQURJTyIsIGltZ19uYW1lKQotICAgICAgaW1nX3ZlbmRvcl9kaXIgPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgIE9QVElPTlMuaW5wdXRfdG1wLCAiVkVORE9SX0lNQUdFUyIpCi0gICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbWdfcmFkaW9fcGF0aCk6Ci0gICAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIGltZ19yYWRpb19wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oIklNQUdFUyIsIGltZ19uYW1lKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBzaHV0aWwuY29weShpbWdfcmFkaW9fcGF0aCwgcHJlYnVpbHRfcGF0aCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGZvciByb290LCBfLCBmaWxlcyBpbiBvcy53YWxrKGltZ192ZW5kb3JfZGlyKToKLSAgICAgICAgICBpZiBpbWdfbmFtZSBpbiBmaWxlczoKLSAgICAgICAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBvcy5wYXRoLmpvaW4ocm9vdCwgaW1nX25hbWUpLAotICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiSU1BR0VTIiwgaW1nX25hbWUpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgc2h1dGlsLmNvcHkob3MucGF0aC5qb2luKHJvb3QsIGltZ19uYW1lKSwgcHJlYnVpbHRfcGF0aCkKLSAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICMgWmlwIHNwZWMgc2F5czogQWxsIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMuCi0gICAgICAgIGltZ19wYXRoID0gJ0lNQUdFUy8nICsgaW1nX25hbWUKLSAgICAgICAgYXNzZXJ0IGltZ19wYXRoIGluIG91dHB1dF96aXAubmFtZWxpc3QoKSwgImNhbm5vdCBmaW5kICIgKyBpbWdfbmFtZQotICAgICAgZWxzZToKLSAgICAgICAgaW1nX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICJJTUFHRVMiLCBpbWdfbmFtZSkKLSAgICAgICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKGltZ19wYXRoKSwgImNhbm5vdCBmaW5kICIgKyBpbWdfbmFtZQotCi0gICAgaWYgY2FyZV9tYXBfbGlzdDoKLSAgICAgIGNhcmVfbWFwX3BhdGggPSAiTUVUQS9jYXJlX21hcC50eHQiCi0gICAgICBpZiBvdXRwdXRfemlwIGFuZCBjYXJlX21hcF9wYXRoIG5vdCBpbiBvdXRwdXRfemlwLm5hbWVsaXN0KCk6Ci0gICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCBjYXJlX21hcF9wYXRoLCAnXG4nLmpvaW4oY2FyZV9tYXBfbGlzdCkpCi0gICAgICBlbHNlOgotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCBjYXJlX21hcF9wYXRoKSwgJ3cnKSBhcyBmcDoKLSAgICAgICAgICBmcC53cml0ZSgnXG4nLmpvaW4oY2FyZV9tYXBfbGlzdCkpCi0gICAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgICAgT1BUSU9OUy5yZXBsYWNlX3VwZGF0ZWRfZmlsZXNfbGlzdC5hcHBlbmQoY2FyZV9tYXBfcGF0aCkKKyAgICAjIEdlbmVyYXRlIGNhcmVfbWFwLnR4dCBmb3Igc3lzdGVtIGFuZCB2ZW5kb3IgcGFydGl0aW9ucyAoaWYgcHJlc2VudCksIHRoZW4KKyAgICAjIHdyaXRlIHRoaXMgZmlsZSB0byB0YXJnZXRfZmlsZXMgcGFja2FnZS4KKyAgICBBZGRDYXJlTWFwVHh0Rm9yQWJPdGEob3V0cHV0X3ppcCwgYWJfcGFydGl0aW9ucywgcGFydGl0aW9ucykKIAogICAjIFJhZGlvIGltYWdlcyB0aGF0IG5lZWQgdG8gYmUgcGFja2VkIGludG8gSU1BR0VTLywgYW5kIHByb2R1Y3QtaW1nLnppcC4KLSAgcGFja19yYWRpb2ltYWdlcyA9IG9zLnBhdGguam9pbigKKyAgcGFja19yYWRpb2ltYWdlc190eHQgPSBvcy5wYXRoLmpvaW4oCiAgICAgICBPUFRJT05TLmlucHV0X3RtcCwgIk1FVEEiLCAicGFja19yYWRpb2ltYWdlcy50eHQiKQotICBpZiBvcy5wYXRoLmV4aXN0cyhwYWNrX3JhZGlvaW1hZ2VzKToKLSAgICB3aXRoIG9wZW4ocGFja19yYWRpb2ltYWdlcywgJ3InKSBhcyBmOgotICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCi0gICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICBpbWdfbmFtZSA9IGxpbmUuc3RyaXAoKQotICAgICAgXywgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChpbWdfbmFtZSkKLSAgICAgIGlmIG5vdCBleHQ6Ci0gICAgICAgIGltZ19uYW1lICs9ICIuaW1nIgotICAgICAgcHJlYnVpbHRfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIklNQUdFUyIsIGltZ19uYW1lKQotICAgICAgaWYgb3MucGF0aC5leGlzdHMocHJlYnVpbHRfcGF0aCk6Ci0gICAgICAgIHByaW50KCIlcyBhbHJlYWR5IGV4aXN0cywgbm8gbmVlZCB0byBvdmVyd3JpdGUuLi4iICUgKGltZ19uYW1lLCkpCi0gICAgICAgIGNvbnRpbnVlCi0KLSAgICAgIGltZ19yYWRpb19wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAiUkFESU8iLCBpbWdfbmFtZSkKLSAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhpbWdfcmFkaW9fcGF0aCksIFwKLSAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgJXMgYXQgJXMiICUgKGltZ19uYW1lLCBpbWdfcmFkaW9fcGF0aCkKLSAgICAgIGlmIG91dHB1dF96aXA6Ci0gICAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBpbWdfcmFkaW9fcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiSU1BR0VTIiwgaW1nX25hbWUpKQotICAgICAgZWxzZToKLSAgICAgICAgc2h1dGlsLmNvcHkoaW1nX3JhZGlvX3BhdGgsIHByZWJ1aWx0X3BhdGgpCisgIGlmIG9zLnBhdGguZXhpc3RzKHBhY2tfcmFkaW9pbWFnZXNfdHh0KToKKyAgICB3aXRoIG9wZW4ocGFja19yYWRpb2ltYWdlc190eHQsICdyJykgYXMgZjoKKyAgICAgIEFkZFBhY2tSYWRpb0ltYWdlcyhvdXRwdXRfemlwLCBmLnJlYWRsaW5lcygpKQogCiAgIGlmIG91dHB1dF96aXA6CiAgICAgY29tbW9uLlppcENsb3NlKG91dHB1dF96aXApCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvYmxvY2tpbWdkaWZmLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2Jsb2NraW1nZGlmZi5weQppbmRleCBiODEyM2MwLi4yNGM1YjJkIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvYmxvY2tpbWdkaWZmLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9ibG9ja2ltZ2RpZmYucHkKQEAgLTE1LDcgKzE1LDcgQEAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIAogaW1wb3J0IGFycmF5Ci1pbXBvcnQgY29tbW9uCitpbXBvcnQgY29weQogaW1wb3J0IGZ1bmN0b29scwogaW1wb3J0IGhlYXBxCiBpbXBvcnQgaXRlcnRvb2xzCkBAIC0yNiw5ICsyNiwxMCBAQAogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKIGltcG9ydCB0aHJlYWRpbmcKLQogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUsIE9yZGVyZWREaWN0CiBmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEKKworaW1wb3J0IGNvbW1vbgogZnJvbSByYW5nZWxpYiBpbXBvcnQgUmFuZ2VTZXQKIAogCkBAIC0xOTAsOCArMTkxLDYgQEAKICAgICBzZWxmLnRndF9zaGExID0gdGd0X3NoYTEKICAgICBzZWxmLnNyY19zaGExID0gc3JjX3NoYTEKICAgICBzZWxmLnN0eWxlID0gc3R5bGUKLSAgICBzZWxmLmludGFjdCA9IChnZXRhdHRyKHRndF9yYW5nZXMsICJtb25vdG9uaWMiLCBGYWxzZSkgYW5kCi0gICAgICAgICAgICAgICAgICAgZ2V0YXR0cihzcmNfcmFuZ2VzLCAibW9ub3RvbmljIiwgRmFsc2UpKQogCiAgICAgIyBXZSB1c2UgT3JkZXJlZERpY3QgcmF0aGVyIHRoYW4gZGljdCBzbyB0aGF0IHRoZSBvdXRwdXQgaXMgcmVwZWF0YWJsZTsKICAgICAjIG90aGVyd2lzZSBpdCB3b3VsZCBkZXBlbmQgb24gdGhlIGhhc2ggdmFsdWVzIG9mIHRoZSBUcmFuc2ZlciBvYmplY3RzLgpAQCAtMjA0LDYgKzIwMywxOCBAQAogICAgIHNlbGYuaWQgPSBsZW4oYnlfaWQpCiAgICAgYnlfaWQuYXBwZW5kKHNlbGYpCiAKKyAgICBzZWxmLl9wYXRjaCA9IE5vbmUKKworICBAcHJvcGVydHkKKyAgZGVmIHBhdGNoKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9wYXRjaAorCisgIEBwYXRjaC5zZXR0ZXIKKyAgZGVmIHBhdGNoKHNlbGYsIHBhdGNoKToKKyAgICBpZiBwYXRjaDoKKyAgICAgIGFzc2VydCBzZWxmLnN0eWxlID09ICJkaWZmIgorICAgIHNlbGYuX3BhdGNoID0gcGF0Y2gKKwogICBkZWYgTmV0U3Rhc2hDaGFuZ2Uoc2VsZik6CiAgICAgcmV0dXJuIChzdW0oc3Iuc2l6ZSgpIGZvciAoXywgc3IpIGluIHNlbGYuc3Rhc2hfYmVmb3JlKSAtCiAgICAgICAgICAgICBzdW0oc3Iuc2l6ZSgpIGZvciAoXywgc3IpIGluIHNlbGYudXNlX3N0YXNoKSkKQEAgLTIxMyw2ICsyMjQsNyBAQAogICAgIHNlbGYudXNlX3N0YXNoID0gW10KICAgICBzZWxmLnN0eWxlID0gIm5ldyIKICAgICBzZWxmLnNyY19yYW5nZXMgPSBSYW5nZVNldCgpCisgICAgc2VsZi5wYXRjaCA9IE5vbmUKIAogICBkZWYgX19zdHJfXyhzZWxmKToKICAgICByZXR1cm4gKHN0cihzZWxmLmlkKSArICI6IDwiICsgc3RyKHNlbGYuc3JjX3JhbmdlcykgKyAiICIgKyBzZWxmLnN0eWxlICsKQEAgLTIyMywxOSArMjM1LDkzIEBACiBjbGFzcyBIZWFwSXRlbShvYmplY3QpOgogICBkZWYgX19pbml0X18oc2VsZiwgaXRlbSk6CiAgICAgc2VsZi5pdGVtID0gaXRlbQotICAgICMgTmVnYXRlIHRoZSBzY29yZSBzaW5jZSBweXRob24ncyBoZWFwIGlzIGEgbWluLWhlYXAgYW5kIHdlIHdhbnQKLSAgICAjIHRoZSBtYXhpbXVtIHNjb3JlLgorICAgICMgTmVnYXRlIHRoZSBzY29yZSBzaW5jZSBweXRob24ncyBoZWFwIGlzIGEgbWluLWhlYXAgYW5kIHdlIHdhbnQgdGhlCisgICAgIyBtYXhpbXVtIHNjb3JlLgogICAgIHNlbGYuc2NvcmUgPSAtaXRlbS5zY29yZQorCiAgIGRlZiBjbGVhcihzZWxmKToKICAgICBzZWxmLml0ZW0gPSBOb25lCisKICAgZGVmIF9fYm9vbF9fKHNlbGYpOgotICAgIHJldHVybiBzZWxmLml0ZW0gaXMgTm9uZQorICAgIHJldHVybiBzZWxmLml0ZW0gaXMgbm90IE5vbmUKKworICAjIFB5dGhvbiAyIHVzZXMgX19ub256ZXJvX18sIHdoaWxlIFB5dGhvbiAzIHVzZXMgX19ib29sX18uCisgIF9fbm9uemVyb19fID0gX19ib29sX18KKworICAjIFRoZSByZXN0IG9wZXJhdGlvbnMgYXJlIGdlbmVyYXRlZCBieSBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcgZGVjb3JhdG9yLgogICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICByZXR1cm4gc2VsZi5zY29yZSA9PSBvdGhlci5zY29yZQorCiAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgIHJldHVybiBzZWxmLnNjb3JlIDw9IG90aGVyLnNjb3JlCiAKIAorY2xhc3MgSW1nZGlmZlN0YXRzKG9iamVjdCk6CisgICIiIkEgY2xhc3MgdGhhdCBjb2xsZWN0cyBpbWdkaWZmIHN0YXRzLgorCisgIEl0IGtlZXBzIHRyYWNrIG9mIHRoZSBmaWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCBpbWdkaWZmIHdoaWxlIGdlbmVyYXRpbmcKKyAgQmxvY2tJbWFnZURpZmYuIEl0IGFsc28gbG9ncyB0aGUgb25lcyB0aGF0IGNhbm5vdCB1c2UgaW1nZGlmZiwgd2l0aCBzcGVjaWZpYworICByZWFzb25zLiBUaGUgc3RhdHMgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gaW1nZGlmZiBub3QgYmVpbmcgZGlzYWJsZWQgYnkgdGhlCisgIGNhbGxlciBvZiBCbG9ja0ltYWdlRGlmZi4gSW4gYWRkaXRpb24sIG9ubHkgZmlsZXMgd2l0aCBzdXBwb3J0ZWQgdHlwZXMKKyAgKEJsb2NrSW1hZ2VEaWZmLkZpbGVUeXBlU3VwcG9ydGVkQnlJbWdkaWZmKCkpIGFyZSBhbGxvd2VkIHRvIGJlIGxvZ2dlZC4KKyAgIiIiCisKKyAgVVNFRF9JTUdESUZGID0gIkFQSyBmaWxlcyBkaWZmJ2Qgd2l0aCBpbWdkaWZmIgorICBVU0VEX0lNR0RJRkZfTEFSR0VfQVBLID0gIkxhcmdlIEFQSyBmaWxlcyBzcGxpdCBhbmQgZGlmZidkIHdpdGggaW1nZGlmZiIKKworICAjIFJlYXNvbnMgZm9yIG5vdCBhcHBseWluZyBpbWdkaWZmIG9uIEFQS3MuCisgIFNLSVBQRURfVFJJTU1FRCA9ICJOb3QgdXNlZCBpbWdkaWZmIGR1ZSB0byB0cmltbWVkIFJhbmdlU2V0IgorICBTS0lQUEVEX05PTk1PTk9UT05JQyA9ICJOb3QgdXNlZCBpbWdkaWZmIGR1ZSB0byBoYXZpbmcgbm9uLW1vbm90b25pYyByYW5nZXMiCisgIFNLSVBQRURfU0hBUkVEX0JMT0NLUyA9ICJOb3QgdXNlZCBpbWdkaWZmIGR1ZSB0byB1c2luZyBzaGFyZWQgYmxvY2tzIgorICBTS0lQUEVEX0lOQ09NUExFVEUgPSAiTm90IHVzZWQgaW1nZGlmZiBkdWUgdG8gaW5jb21wbGV0ZSBSYW5nZVNldCIKKworICAjIFRoZSBsaXN0IG9mIHZhbGlkIHJlYXNvbnMsIHdoaWNoIHdpbGwgYWxzbyBiZSB0aGUgZHVtcGVkIG9yZGVyIGluIGEgcmVwb3J0LgorICBSRUFTT05TID0gKAorICAgICAgVVNFRF9JTUdESUZGLAorICAgICAgVVNFRF9JTUdESUZGX0xBUkdFX0FQSywKKyAgICAgIFNLSVBQRURfVFJJTU1FRCwKKyAgICAgIFNLSVBQRURfTk9OTU9OT1RPTklDLAorICAgICAgU0tJUFBFRF9TSEFSRURfQkxPQ0tTLAorICAgICAgU0tJUFBFRF9JTkNPTVBMRVRFLAorICApCisKKyAgZGVmICBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnN0YXRzID0ge30KKworICBkZWYgTG9nKHNlbGYsIGZpbGVuYW1lLCByZWFzb24pOgorICAgICIiIkxvZ3Mgd2h5IGltZ2RpZmYgY2FuIG9yIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoZSBnaXZlbiBmaWxlbmFtZS4KKworICAgIEFyZ3M6CisgICAgICBmaWxlbmFtZTogVGhlIGZpbGVuYW1lIHN0cmluZy4KKyAgICAgIHJlYXNvbjogT25lIG9mIHRoZSByZWFzb24gY29uc3RhbnRzIGxpc3RlZCBpbiBSRUFTT05TLgorCisgICAgUmFpc2VzOgorICAgICAgQXNzZXJ0aW9uRXJyb3I6IE9uIHVuc3VwcG9ydGVkIGZpbGV0eXBlcyBvciBpbnZhbGlkIHJlYXNvbi4KKyAgICAiIiIKKyAgICBhc3NlcnQgQmxvY2tJbWFnZURpZmYuRmlsZVR5cGVTdXBwb3J0ZWRCeUltZ2RpZmYoZmlsZW5hbWUpCisgICAgYXNzZXJ0IHJlYXNvbiBpbiBzZWxmLlJFQVNPTlMKKworICAgIGlmIHJlYXNvbiBub3QgaW4gc2VsZi5zdGF0czoKKyAgICAgIHNlbGYuc3RhdHNbcmVhc29uXSA9IHNldCgpCisgICAgc2VsZi5zdGF0c1tyZWFzb25dLmFkZChmaWxlbmFtZSkKKworICBkZWYgUmVwb3J0KHNlbGYpOgorICAgICIiIlByaW50cyBhIHJlcG9ydCBvZiB0aGUgY29sbGVjdGVkIGltZ2RpZmYgc3RhdHMuIiIiCisKKyAgICBkZWYgcHJpbnRfaGVhZGVyKGhlYWRlciwgc2VwYXJhdG9yKToKKyAgICAgIHByaW50KGhlYWRlcikKKyAgICAgIHByaW50KHNlcGFyYXRvciAqIGxlbihoZWFkZXIpICsgJ1xuJykKKworICAgIHByaW50X2hlYWRlcignICBJbWdkaWZmIFN0YXRzIFJlcG9ydCAgJywgJz0nKQorICAgIGZvciBrZXkgaW4gc2VsZi5SRUFTT05TOgorICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLnN0YXRzOgorICAgICAgICBjb250aW51ZQorICAgICAgdmFsdWVzID0gc2VsZi5zdGF0c1trZXldCisgICAgICBzZWN0aW9uX2hlYWRlciA9ICcge30gKGNvdW50OiB7fSkgJy5mb3JtYXQoa2V5LCBsZW4odmFsdWVzKSkKKyAgICAgIHByaW50X2hlYWRlcihzZWN0aW9uX2hlYWRlciwgJy0nKQorICAgICAgcHJpbnQoJycuam9pbihbJyAge31cbicuZm9ybWF0KG5hbWUpIGZvciBuYW1lIGluIHZhbHVlc10pKQorCisKICMgQmxvY2tJbWFnZURpZmYgd29ya3Mgb24gdHdvIGltYWdlIG9iamVjdHMuICBBbiBpbWFnZSBvYmplY3QgaXMKICMgYW55dGhpbmcgdGhhdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CiAjCkBAIC0yOTEsNiArMzc3LDcgQEAKICAgICBzZWxmLnRvdWNoZWRfc3JjX3JhbmdlcyA9IFJhbmdlU2V0KCkKICAgICBzZWxmLnRvdWNoZWRfc3JjX3NoYTEgPSBOb25lCiAgICAgc2VsZi5kaXNhYmxlX2ltZ2RpZmYgPSBkaXNhYmxlX2ltZ2RpZmYKKyAgICBzZWxmLmltZ2RpZmZfc3RhdHMgPSBJbWdkaWZmU3RhdHMoKSBpZiBub3QgZGlzYWJsZV9pbWdkaWZmIGVsc2UgTm9uZQogCiAgICAgYXNzZXJ0IHZlcnNpb24gaW4gKDMsIDQpCiAKQEAgLTMxMiw2ICszOTksNjUgQEAKICAgZGVmIG1heF9zdGFzaGVkX3NpemUoc2VsZik6CiAgICAgcmV0dXJuIHNlbGYuX21heF9zdGFzaGVkX3NpemUKIAorICBAc3RhdGljbWV0aG9kCisgIGRlZiBGaWxlVHlwZVN1cHBvcnRlZEJ5SW1nZGlmZihmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IGltZ2RpZmYuIiIiCisgICAgcmV0dXJuIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoKCcuYXBrJywgJy5qYXInLCAnLnppcCcpKQorCisgIGRlZiBDYW5Vc2VJbWdkaWZmKHNlbGYsIG5hbWUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsIGxhcmdlX2Fwaz1GYWxzZSk6CisgICAgIiIiQ2hlY2tzIHdoZXRoZXIgd2UgY2FuIGFwcGx5IGltZ2RpZmYgZm9yIHRoZSBnaXZlbiBSYW5nZVNldHMuCisKKyAgICBGb3IgZmlsZXMgaW4gWklQIGZvcm1hdCAoZS5nLiwgQVBLcywgSkFScywgZXRjLikgd2Ugd291bGQgbGlrZSB0byB1c2UKKyAgICAnaW1nZGlmZiAteicgaWYgcG9zc2libGUuIEJlY2F1c2UgaXQgdXN1YWxseSBwcm9kdWNlcyBzaWduaWZpY2FudGx5IHNtYWxsZXIKKyAgICBwYXRjaGVzIHRoYW4gYnNkaWZmLgorCisgICAgVGhpcyBpcyBwZXJtaXNzaWJsZSBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGhvbGQuCisgICAgICAtIFRoZSBpbWdkaWZmIGhhc24ndCBiZWVuIGRpc2FibGVkIGJ5IHRoZSBjYWxsZXIgKGUuZy4gc3F1YXNoZnMpOworICAgICAgLSBUaGUgZmlsZSB0eXBlIGlzIHN1cHBvcnRlZCBieSBpbWdkaWZmOworICAgICAgLSBUaGUgc291cmNlIGFuZCB0YXJnZXQgYmxvY2tzIGFyZSBtb25vdG9uaWMgKGkuZS4gdGhlIGRhdGEgaXMgc3RvcmVkIHdpdGgKKyAgICAgICAgYmxvY2tzIGluIGluY3JlYXNpbmcgb3JkZXIpOworICAgICAgLSBCb3RoIGZpbGVzIGRvbid0IGNvbnRhaW4gc2hhcmVkIGJsb2NrczsKKyAgICAgIC0gQm90aCBmaWxlcyBoYXZlIGNvbXBsZXRlIGxpc3RzIG9mIGJsb2NrczsKKyAgICAgIC0gV2UgaGF2ZW4ndCByZW1vdmVkIGFueSBibG9ja3MgZnJvbSB0aGUgc291cmNlIHNldC4KKworICAgIElmIGFsbCB0aGVzZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQsIGNvbmNhdGVuYXRpbmcgYWxsIHRoZSBibG9ja3MgaW4gdGhlCisgICAgUmFuZ2VTZXQgaW4gb3JkZXIgd2lsbCBwcm9kdWNlIGEgdmFsaWQgWklQIGZpbGUgKHBsdXMgcG9zc2libHkgZXh0cmEgemVyb3MKKyAgICBpbiB0aGUgbGFzdCBibG9jaykuIGltZ2RpZmYgaXMgZmluZSB3aXRoIGV4dHJhIHplcm9zIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogVGhlIGZpbGVuYW1lIHRvIGJlIGRpZmYnZC4KKyAgICAgIHRndF9yYW5nZXM6IFRoZSB0YXJnZXQgUmFuZ2VTZXQuCisgICAgICBzcmNfcmFuZ2VzOiBUaGUgc291cmNlIFJhbmdlU2V0LgorICAgICAgbGFyZ2VfYXBrOiBXaGV0aGVyIHRoaXMgaXMgdG8gc3BsaXQgYSBsYXJnZSBBUEsuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBib29sZWFuIHJlc3VsdC4KKyAgICAiIiIKKyAgICBpZiBzZWxmLmRpc2FibGVfaW1nZGlmZiBvciBub3Qgc2VsZi5GaWxlVHlwZVN1cHBvcnRlZEJ5SW1nZGlmZihuYW1lKToKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgbm90IHRndF9yYW5nZXMubW9ub3RvbmljIG9yIG5vdCBzcmNfcmFuZ2VzLm1vbm90b25pYzoKKyAgICAgIHNlbGYuaW1nZGlmZl9zdGF0cy5Mb2cobmFtZSwgSW1nZGlmZlN0YXRzLlNLSVBQRURfTk9OTU9OT1RPTklDKQorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBpZiAodGd0X3Jhbmdlcy5leHRyYS5nZXQoJ3VzZXNfc2hhcmVkX2Jsb2NrcycpIG9yCisgICAgICAgIHNyY19yYW5nZXMuZXh0cmEuZ2V0KCd1c2VzX3NoYXJlZF9ibG9ja3MnKSk6CisgICAgICBzZWxmLmltZ2RpZmZfc3RhdHMuTG9nKG5hbWUsIEltZ2RpZmZTdGF0cy5TS0lQUEVEX1NIQVJFRF9CTE9DS1MpCisgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIHRndF9yYW5nZXMuZXh0cmEuZ2V0KCdpbmNvbXBsZXRlJykgb3Igc3JjX3Jhbmdlcy5leHRyYS5nZXQoJ2luY29tcGxldGUnKToKKyAgICAgIHNlbGYuaW1nZGlmZl9zdGF0cy5Mb2cobmFtZSwgSW1nZGlmZlN0YXRzLlNLSVBQRURfSU5DT01QTEVURSkKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgdGd0X3Jhbmdlcy5leHRyYS5nZXQoJ3RyaW1tZWQnKSBvciBzcmNfcmFuZ2VzLmV4dHJhLmdldCgndHJpbW1lZCcpOgorICAgICAgc2VsZi5pbWdkaWZmX3N0YXRzLkxvZyhuYW1lLCBJbWdkaWZmU3RhdHMuU0tJUFBFRF9UUklNTUVEKQorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICByZWFzb24gPSAoSW1nZGlmZlN0YXRzLlVTRURfSU1HRElGRl9MQVJHRV9BUEsgaWYgbGFyZ2VfYXBrCisgICAgICAgICAgICAgIGVsc2UgSW1nZGlmZlN0YXRzLlVTRURfSU1HRElGRikKKyAgICBzZWxmLmltZ2RpZmZfc3RhdHMuTG9nKG5hbWUsIHJlYXNvbikKKyAgICByZXR1cm4gVHJ1ZQorCiAgIGRlZiBDb21wdXRlKHNlbGYsIHByZWZpeCk6CiAgICAgIyBXaGVuIGxvb2tpbmcgZm9yIGEgc291cmNlIGZpbGUgdG8gdXNlIGFzIHRoZSBkaWZmIGlucHV0IGZvciBhCiAgICAgIyB0YXJnZXQgZmlsZSwgd2UgdHJ5OgpAQCAtMzQwLDEwICs0ODYsMTUgQEAKIAogICAgICMgRG91YmxlLWNoZWNrIG91ciB3b3JrLgogICAgIHNlbGYuQXNzZXJ0U2VxdWVuY2VHb29kKCkKKyAgICBzZWxmLkFzc2VydFNoYTFHb29kKCkKIAogICAgIHNlbGYuQ29tcHV0ZVBhdGNoZXMocHJlZml4KQogICAgIHNlbGYuV3JpdGVUcmFuc2ZlcnMocHJlZml4KQogCisgICAgIyBSZXBvcnQgdGhlIGltZ2RpZmYgc3RhdHMuCisgICAgaWYgY29tbW9uLk9QVElPTlMudmVyYm9zZSBhbmQgbm90IHNlbGYuZGlzYWJsZV9pbWdkaWZmOgorICAgICAgc2VsZi5pbWdkaWZmX3N0YXRzLlJlcG9ydCgpCisKICAgZGVmIFdyaXRlVHJhbnNmZXJzKHNlbGYsIHByZWZpeCk6CiAgICAgZGVmIFdyaXRlU3BsaXRUcmFuc2ZlcnMob3V0LCBzdHlsZSwgdGFyZ2V0X2Jsb2Nrcyk6CiAgICAgICAiIiJMaW1pdCB0aGUgc2l6ZSBvZiBvcGVyYW5kIGluIGNvbW1hbmQgJ25ldycgYW5kICd6ZXJvJyB0byAxMDI0IGJsb2Nrcy4KQEAgLTM5Niw3ICs1NDcsNyBAQAogICAgICAgIyAgIDwjIGJsb2Nrcz4gLSA8c3Rhc2ggcmVmcy4uLj4KIAogICAgICAgc2l6ZSA9IHhmLnNyY19yYW5nZXMuc2l6ZSgpCi0gICAgICBzcmNfc3RyID0gW3N0cihzaXplKV0KKyAgICAgIHNyY19zdHJfYnVmZmVyID0gW3N0cihzaXplKV0KIAogICAgICAgdW5zdGFzaGVkX3NyY19yYW5nZXMgPSB4Zi5zcmNfcmFuZ2VzCiAgICAgICBtYXBwZWRfc3Rhc2hlcyA9IFtdCkBAIC00MDYsNyArNTU3LDcgQEAKICAgICAgICAgc3IgPSB4Zi5zcmNfcmFuZ2VzLm1hcF93aXRoaW4oc3IpCiAgICAgICAgIG1hcHBlZF9zdGFzaGVzLmFwcGVuZChzcikKICAgICAgICAgYXNzZXJ0IHNoIGluIHN0YXNoZXMKLSAgICAgICAgc3JjX3N0ci5hcHBlbmQoIiVzOiVzIiAlIChzaCwgc3IudG9fc3RyaW5nX3JhdygpKSkKKyAgICAgICAgc3JjX3N0cl9idWZmZXIuYXBwZW5kKCIlczolcyIgJSAoc2gsIHNyLnRvX3N0cmluZ19yYXcoKSkpCiAgICAgICAgIHN0YXNoZXNbc2hdIC09IDEKICAgICAgICAgaWYgc3Rhc2hlc1tzaF0gPT0gMDoKICAgICAgICAgICBmcmVlX3N0cmluZy5hcHBlbmQoImZyZWUgJXNcbiIgJSAoc2gsKSkKQEAgLTQxNCwxNyArNTY1LDE3IEBACiAgICAgICAgICAgc3Rhc2hlcy5wb3Aoc2gpCiAKICAgICAgIGlmIHVuc3Rhc2hlZF9zcmNfcmFuZ2VzOgotICAgICAgICBzcmNfc3RyLmluc2VydCgxLCB1bnN0YXNoZWRfc3JjX3Jhbmdlcy50b19zdHJpbmdfcmF3KCkpCisgICAgICAgIHNyY19zdHJfYnVmZmVyLmluc2VydCgxLCB1bnN0YXNoZWRfc3JjX3Jhbmdlcy50b19zdHJpbmdfcmF3KCkpCiAgICAgICAgIGlmIHhmLnVzZV9zdGFzaDoKICAgICAgICAgICBtYXBwZWRfdW5zdGFzaGVkID0geGYuc3JjX3Jhbmdlcy5tYXBfd2l0aGluKHVuc3Rhc2hlZF9zcmNfcmFuZ2VzKQotICAgICAgICAgIHNyY19zdHIuaW5zZXJ0KDIsIG1hcHBlZF91bnN0YXNoZWQudG9fc3RyaW5nX3JhdygpKQorICAgICAgICAgIHNyY19zdHJfYnVmZmVyLmluc2VydCgyLCBtYXBwZWRfdW5zdGFzaGVkLnRvX3N0cmluZ19yYXcoKSkKICAgICAgICAgICBtYXBwZWRfc3Rhc2hlcy5hcHBlbmQobWFwcGVkX3Vuc3Rhc2hlZCkKICAgICAgICAgICBzZWxmLkFzc2VydFBhcnRpdGlvbihSYW5nZVNldChkYXRhPSgwLCBzaXplKSksIG1hcHBlZF9zdGFzaGVzKQogICAgICAgZWxzZToKLSAgICAgICAgc3JjX3N0ci5pbnNlcnQoMSwgIi0iKQorICAgICAgICBzcmNfc3RyX2J1ZmZlci5pbnNlcnQoMSwgIi0iKQogICAgICAgICBzZWxmLkFzc2VydFBhcnRpdGlvbihSYW5nZVNldChkYXRhPSgwLCBzaXplKSksIG1hcHBlZF9zdGFzaGVzKQogCi0gICAgICBzcmNfc3RyID0gIiAiLmpvaW4oc3JjX3N0cikKKyAgICAgIHNyY19zdHIgPSAiICIuam9pbihzcmNfc3RyX2J1ZmZlcikKIAogICAgICAgIyB2ZXJzaW9uIDMrOgogICAgICAgIyAgIHplcm8gPHJhbmdlc2V0PgpAQCAtNTQ1LDExICs2OTYsMTEgQEAKICAgICAgIG1heF9hbGxvd2VkID0gT1BUSU9OUy5jYWNoZV9zaXplICogT1BUSU9OUy5zdGFzaF90aHJlc2hvbGQKICAgICAgIHByaW50KCJtYXggc3Rhc2hlZCBibG9ja3M6ICVkICAoJWQgYnl0ZXMpLCAiCiAgICAgICAgICAgICAibGltaXQ6ICVkIGJ5dGVzICglLjJmJSUpXG4iICUgKAotICAgICAgICAgICAgbWF4X3N0YXNoZWRfYmxvY2tzLCBzZWxmLl9tYXhfc3Rhc2hlZF9zaXplLCBtYXhfYWxsb3dlZCwKLSAgICAgICAgICAgIHNlbGYuX21heF9zdGFzaGVkX3NpemUgKiAxMDAuMCAvIG1heF9hbGxvd2VkKSkKKyAgICAgICAgICAgICAgICBtYXhfc3Rhc2hlZF9ibG9ja3MsIHNlbGYuX21heF9zdGFzaGVkX3NpemUsIG1heF9hbGxvd2VkLAorICAgICAgICAgICAgICAgIHNlbGYuX21heF9zdGFzaGVkX3NpemUgKiAxMDAuMCAvIG1heF9hbGxvd2VkKSkKICAgICBlbHNlOgogICAgICAgcHJpbnQoIm1heCBzdGFzaGVkIGJsb2NrczogJWQgICglZCBieXRlcyksIGxpbWl0OiA8dW5rbm93bj5cbiIgJSAoCi0gICAgICAgICAgICBtYXhfc3Rhc2hlZF9ibG9ja3MsIHNlbGYuX21heF9zdGFzaGVkX3NpemUpKQorICAgICAgICAgIG1heF9zdGFzaGVkX2Jsb2Nrcywgc2VsZi5fbWF4X3N0YXNoZWRfc2l6ZSkpCiAKICAgZGVmIFJldmlzZVN0YXNoU2l6ZShzZWxmKToKICAgICBwcmludCgiUmV2aXNpbmcgc3Rhc2ggc2l6ZS4uLiIpCkBAIC02NzUsNiArODI2LDcgQEAKICAgICAgICAgICAgICMgVGhlc2UgYXJlIGlkZW50aWNhbDsgd2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIHBhdGNoLAogICAgICAgICAgICAgIyBqdXN0IGlzc3VlIGNvcHkgY29tbWFuZHMgb24gdGhlIGRldmljZS4KICAgICAgICAgICAgIHhmLnN0eWxlID0gIm1vdmUiCisgICAgICAgICAgICB4Zi5wYXRjaCA9IE5vbmUKICAgICAgICAgICAgIHRndF9zaXplID0geGYudGd0X3Jhbmdlcy5zaXplKCkgKiBzZWxmLnRndC5ibG9ja3NpemUKICAgICAgICAgICAgIGlmIHhmLnNyY19yYW5nZXMgIT0geGYudGd0X3JhbmdlczoKICAgICAgICAgICAgICAgcHJpbnQoIiUxMGQgJTEwZCAoJTYuMmYlJSkgJTdzICVzICVzIChmcm9tICVzKSIgJSAoCkBAIC02ODMsMjQgKzgzNSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgIHhmLnRndF9uYW1lICsgIiAoZnJvbSAiICsgeGYuc3JjX25hbWUgKyAiKSIpLAogICAgICAgICAgICAgICAgICAgc3RyKHhmLnRndF9yYW5nZXMpLCBzdHIoeGYuc3JjX3JhbmdlcykpKQogICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIEZvciBmaWxlcyBpbiB6aXAgZm9ybWF0IChlZywgQVBLcywgSkFScywgZXRjLikgd2Ugd291bGQKLSAgICAgICAgICAgICMgbGlrZSB0byB1c2UgaW1nZGlmZiAteiBpZiBwb3NzaWJsZSAoYmVjYXVzZSBpdCB1c3VhbGx5Ci0gICAgICAgICAgICAjIHByb2R1Y2VzIHNpZ25pZmljYW50bHkgc21hbGxlciBwYXRjaGVzIHRoYW4gYnNkaWZmKS4KLSAgICAgICAgICAgICMgVGhpcyBpcyBwZXJtaXNzaWJsZSBpZjoKLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgIC0gaW1nZGlmZiBpcyBub3QgZGlzYWJsZWQsIGFuZAotICAgICAgICAgICAgIyAgLSB0aGUgc291cmNlIGFuZCB0YXJnZXQgZmlsZXMgYXJlIG1vbm90b25pYyAoaWUsIHRoZQotICAgICAgICAgICAgIyAgICBkYXRhIGlzIHN0b3JlZCB3aXRoIGJsb2NrcyBpbiBpbmNyZWFzaW5nIG9yZGVyKSwgYW5kCi0gICAgICAgICAgICAjICAtIHdlIGhhdmVuJ3QgcmVtb3ZlZCBhbnkgYmxvY2tzIGZyb20gdGhlIHNvdXJjZSBzZXQuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCB0aGVuIGFwcGVuZGluZyBhbGwgdGhlCi0gICAgICAgICAgICAjIGJsb2NrcyBpbiB0aGUgc2V0IHRvZ2V0aGVyIGluIG9yZGVyIHdpbGwgcHJvZHVjZSBhIHZhbGlkCi0gICAgICAgICAgICAjIHppcCBmaWxlIChwbHVzIHBvc3NpYmx5IGV4dHJhIHplcm9zIGluIHRoZSBsYXN0IGJsb2NrKSwKLSAgICAgICAgICAgICMgd2hpY2ggaXMgd2hhdCBpbWdkaWZmIG5lZWRzIHRvIG9wZXJhdGUuICAoaW1nZGlmZiBpcwotICAgICAgICAgICAgIyBmaW5lIHdpdGggZXh0cmEgemVyb3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4pCi0gICAgICAgICAgICBpbWdkaWZmID0gKG5vdCBzZWxmLmRpc2FibGVfaW1nZGlmZiBhbmQgeGYuaW50YWN0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICB4Zi50Z3RfbmFtZS5zcGxpdCgiLiIpWy0xXS5sb3dlcigpCi0gICAgICAgICAgICAgICAgICAgICAgIGluICgiYXBrIiwgImphciIsICJ6aXAiKSkKKyAgICAgICAgICAgIGlmIHhmLnBhdGNoOgorICAgICAgICAgICAgICAjIFdlIGhhdmUgYWxyZWFkeSBnZW5lcmF0ZWQgdGhlIHBhdGNoIHdpdGggaW1nZGlmZi4gQ2hlY2sgaWYgdGhlCisgICAgICAgICAgICAgICMgdHJhbnNmZXIgaXMgaW50YWN0LgorICAgICAgICAgICAgICBhc3NlcnQgbm90IHNlbGYuZGlzYWJsZV9pbWdkaWZmCisgICAgICAgICAgICAgIGltZ2RpZmYgPSBUcnVlCisgICAgICAgICAgICAgIGlmICh4Zi5zcmNfcmFuZ2VzLmV4dHJhLmdldCgndHJpbW1lZCcpIG9yCisgICAgICAgICAgICAgICAgICB4Zi50Z3RfcmFuZ2VzLmV4dHJhLmdldCgndHJpbW1lZCcpKToKKyAgICAgICAgICAgICAgICBpbWdkaWZmID0gRmFsc2UKKyAgICAgICAgICAgICAgICB4Zi5wYXRjaCA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgIGltZ2RpZmYgPSBzZWxmLkNhblVzZUltZ2RpZmYoCisgICAgICAgICAgICAgICAgICB4Zi50Z3RfbmFtZSwgeGYudGd0X3JhbmdlcywgeGYuc3JjX3JhbmdlcykKICAgICAgICAgICAgIHhmLnN0eWxlID0gImltZ2RpZmYiIGlmIGltZ2RpZmYgZWxzZSAiYnNkaWZmIgogICAgICAgICAgICAgZGlmZl9xdWV1ZS5hcHBlbmQoKGluZGV4LCBpbWdkaWZmLCBwYXRjaF9udW0pKQogICAgICAgICAgICAgcGF0Y2hfbnVtICs9IDEKQEAgLTcxNyw5ICs4NjMsNiBAQAogICAgICAgZGlmZl90b3RhbCA9IGxlbihkaWZmX3F1ZXVlKQogICAgICAgcGF0Y2hlcyA9IFtOb25lXSAqIGRpZmZfdG90YWwKICAgICAgIGVycm9yX21lc3NhZ2VzID0gW10KLSAgICAgIGlmIHN5cy5zdGRvdXQuaXNhdHR5KCk6Ci0gICAgICAgIGdsb2JhbCBkaWZmX2RvbmUKLSAgICAgICAgZGlmZl9kb25lID0gMAogCiAgICAgICAjIFVzaW5nIG11bHRpcHJvY2Vzc2luZyBkb2Vzbid0IGdpdmUgYWRkaXRpb25hbCBiZW5lZml0cywgZHVlIHRvIHRoZQogICAgICAgIyBwYXR0ZXJuIG9mIHRoZSBjb2RlLiBUaGUgZGlmZmluZyB3b3JrIGlzIGRvbmUgYnkgc3VicHJvY2Vzcy5jYWxsLCB3aGljaApAQCAtNzM1LDEzICs4NzgsMjAgQEAKICAgICAgICAgICAgIGlmIG5vdCBkaWZmX3F1ZXVlOgogICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgIHhmX2luZGV4LCBpbWdkaWZmLCBwYXRjaF9pbmRleCA9IGRpZmZfcXVldWUucG9wKCkKKyAgICAgICAgICAgIHhmID0gc2VsZi50cmFuc2ZlcnNbeGZfaW5kZXhdCiAKLSAgICAgICAgICB4ZiA9IHNlbGYudHJhbnNmZXJzW3hmX2luZGV4XQotICAgICAgICAgIHNyY19yYW5nZXMgPSB4Zi5zcmNfcmFuZ2VzCi0gICAgICAgICAgdGd0X3JhbmdlcyA9IHhmLnRndF9yYW5nZXMKKyAgICAgICAgICAgIGlmIHN5cy5zdGRvdXQuaXNhdHR5KCk6CisgICAgICAgICAgICAgIGRpZmZfbGVmdCA9IGxlbihkaWZmX3F1ZXVlKQorICAgICAgICAgICAgICBwcm9ncmVzcyA9IChkaWZmX3RvdGFsIC0gZGlmZl9sZWZ0KSAqIDEwMCAvIGRpZmZfdG90YWwKKyAgICAgICAgICAgICAgIyAnXDAzM1tLJyBpcyB0byBjbGVhciB0byBFT0wuCisgICAgICAgICAgICAgIHByaW50KCcgWyUzZCUlXSAlc1wwMzNbSycgJSAocHJvZ3Jlc3MsIHhmLnRndF9uYW1lKSwgZW5kPSdccicpCisgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQogCi0gICAgICAgICAgIyBOZWVkcyBsb2NrIHNpbmNlIFdyaXRlUmFuZ2VEYXRhVG9GZCgpIGlzIHN0YXRlZnVsIChjYWxsaW5nIHNlZWspLgotICAgICAgICAgIHdpdGggbG9jazoKKyAgICAgICAgICBwYXRjaCA9IHhmLnBhdGNoCisgICAgICAgICAgaWYgbm90IHBhdGNoOgorICAgICAgICAgICAgc3JjX3JhbmdlcyA9IHhmLnNyY19yYW5nZXMKKyAgICAgICAgICAgIHRndF9yYW5nZXMgPSB4Zi50Z3RfcmFuZ2VzCisKICAgICAgICAgICAgIHNyY19maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InNyYy0iKQogICAgICAgICAgICAgd2l0aCBvcGVuKHNyY19maWxlLCAid2IiKSBhcyBmZDoKICAgICAgICAgICAgICAgc2VsZi5zcmMuV3JpdGVSYW5nZURhdGFUb0ZkKHNyY19yYW5nZXMsIGZkKQpAQCAtNzUwLDI2ICs5MDAsMjIgQEAKICAgICAgICAgICAgIHdpdGggb3Blbih0Z3RfZmlsZSwgIndiIikgYXMgZmQ6CiAgICAgICAgICAgICAgIHNlbGYudGd0LldyaXRlUmFuZ2VEYXRhVG9GZCh0Z3RfcmFuZ2VzLCBmZCkKIAotICAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHBhdGNoID0gY29tcHV0ZV9wYXRjaChzcmNfZmlsZSwgdGd0X2ZpbGUsIGltZ2RpZmYpCi0gICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHdpdGggbG9jazoKLSAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZXMuYXBwZW5kKAorICAgICAgICAgICAgbWVzc2FnZSA9IFtdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgIHBhdGNoID0gY29tcHV0ZV9wYXRjaChzcmNfZmlsZSwgdGd0X2ZpbGUsIGltZ2RpZmYpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2VuZXJhdGUgJXMgZm9yICVzOiB0Z3Q9JXMsIHNyYz0lczpcbiVzIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAiaW1nZGlmZiIgaWYgaW1nZGlmZiBlbHNlICJic2RpZmYiLAogICAgICAgICAgICAgICAgICAgICAgIHhmLnRndF9uYW1lIGlmIHhmLnRndF9uYW1lID09IHhmLnNyY19uYW1lIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeGYudGd0X25hbWUgKyAiIChmcm9tICIgKyB4Zi5zcmNfbmFtZSArICIpIiwKKyAgICAgICAgICAgICAgICAgICAgICB4Zi50Z3RfbmFtZSArICIgKGZyb20gIiArIHhmLnNyY19uYW1lICsgIikiLAogICAgICAgICAgICAgICAgICAgICAgIHhmLnRndF9yYW5nZXMsIHhmLnNyY19yYW5nZXMsIGUubWVzc2FnZSkpCisgICAgICAgICAgICBpZiBtZXNzYWdlOgorICAgICAgICAgICAgICB3aXRoIGxvY2s6CisgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZXMuZXh0ZW5kKG1lc3NhZ2UpCiAKICAgICAgICAgICB3aXRoIGxvY2s6CiAgICAgICAgICAgICBwYXRjaGVzW3BhdGNoX2luZGV4XSA9ICh4Zl9pbmRleCwgcGF0Y2gpCi0gICAgICAgICAgICBpZiBzeXMuc3Rkb3V0LmlzYXR0eSgpOgotICAgICAgICAgICAgICBnbG9iYWwgZGlmZl9kb25lCi0gICAgICAgICAgICAgIGRpZmZfZG9uZSArPSAxCi0gICAgICAgICAgICAgIHByb2dyZXNzID0gZGlmZl9kb25lICogMTAwIC8gZGlmZl90b3RhbAotICAgICAgICAgICAgICAjICdcMDMzW0snIGlzIHRvIGNsZWFyIHRvIEVPTC4KLSAgICAgICAgICAgICAgcHJpbnQoJyBbJWQlJV0gJXNcMDMzW0snICUgKHByb2dyZXNzLCB4Zi50Z3RfbmFtZSksIGVuZD0nXHInKQotICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKIAogICAgICAgdGhyZWFkcyA9IFt0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1kaWZmX3dvcmtlcikKICAgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKV0KQEAgLTc4Miw3ICs5MjgsOSBAQAogICAgICAgICBwcmludCgnXG4nKQogCiAgICAgICBpZiBlcnJvcl9tZXNzYWdlczoKKyAgICAgICAgcHJpbnQoJ0VSUk9SOicpCiAgICAgICAgIHByaW50KCdcbicuam9pbihlcnJvcl9tZXNzYWdlcykpCisgICAgICAgIHByaW50KCdcblxuXG4nKQogICAgICAgICBzeXMuZXhpdCgxKQogICAgIGVsc2U6CiAgICAgICBwYXRjaGVzID0gW10KQEAgLTc5OSwxMSArOTQ3LDI2IEBACiAgICAgICAgIGlmIGNvbW1vbi5PUFRJT05TLnZlcmJvc2U6CiAgICAgICAgICAgdGd0X3NpemUgPSB4Zi50Z3RfcmFuZ2VzLnNpemUoKSAqIHNlbGYudGd0LmJsb2Nrc2l6ZQogICAgICAgICAgIHByaW50KCIlMTBkICUxMGQgKCU2LjJmJSUpICU3cyAlcyAlcyAlcyIgJSAoCi0gICAgICAgICAgICAgICAgeGYucGF0Y2hfbGVuLCB0Z3Rfc2l6ZSwgeGYucGF0Y2hfbGVuICogMTAwLjAgLyB0Z3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICB4Zi5zdHlsZSwKLSAgICAgICAgICAgICAgICB4Zi50Z3RfbmFtZSBpZiB4Zi50Z3RfbmFtZSA9PSB4Zi5zcmNfbmFtZSBlbHNlICgKLSAgICAgICAgICAgICAgICAgICAgeGYudGd0X25hbWUgKyAiIChmcm9tICIgKyB4Zi5zcmNfbmFtZSArICIpIiksCi0gICAgICAgICAgICAgICAgeGYudGd0X3JhbmdlcywgeGYuc3JjX3JhbmdlcykpCisgICAgICAgICAgICAgIHhmLnBhdGNoX2xlbiwgdGd0X3NpemUsIHhmLnBhdGNoX2xlbiAqIDEwMC4wIC8gdGd0X3NpemUsCisgICAgICAgICAgICAgIHhmLnN0eWxlLAorICAgICAgICAgICAgICB4Zi50Z3RfbmFtZSBpZiB4Zi50Z3RfbmFtZSA9PSB4Zi5zcmNfbmFtZSBlbHNlICgKKyAgICAgICAgICAgICAgICAgIHhmLnRndF9uYW1lICsgIiAoZnJvbSAiICsgeGYuc3JjX25hbWUgKyAiKSIpLAorICAgICAgICAgICAgICB4Zi50Z3RfcmFuZ2VzLCB4Zi5zcmNfcmFuZ2VzKSkKKworICBkZWYgQXNzZXJ0U2hhMUdvb2Qoc2VsZik6CisgICAgIiIiQ2hlY2sgdGhlIFNIQS0xIG9mIHRoZSBzcmMgJiB0Z3QgYmxvY2tzIGluIHRoZSB0cmFuc2ZlciBsaXN0LgorCisgICAgRG91YmxlIGNoZWNrIHRoZSBTSEEtMSB2YWx1ZSB0byBhdm9pZCB0aGUgaXNzdWUgaW4gYi83MTkwODcxMywgd2hlcmUKKyAgICBTcGFyc2VJbWFnZS5SYW5nZVNoYTEoKSBtZXNzZWQgdXAgd2l0aCB0aGUgaGFzaCBjYWxjdWxhdGlvbiBpbiBtdWx0aS10aHJlYWQKKyAgICBlbnZpcm9ubWVudC4gVGhhdCBzcGVjaWZpYyBwcm9ibGVtIGhhcyBiZWVuIGZpeGVkIGJ5IHByb3RlY3RpbmcgdGhlCisgICAgdW5kZXJseWluZyBnZW5lcmF0b3IgZnVuY3Rpb24gJ1NwYXJzZUltYWdlLl9HZXRSYW5nZURhdGEoKScgd2l0aCBsb2NrLgorICAgICIiIgorICAgIGZvciB4ZiBpbiBzZWxmLnRyYW5zZmVyczoKKyAgICAgIHRndF9zaGExID0gc2VsZi50Z3QuUmFuZ2VTaGExKHhmLnRndF9yYW5nZXMpCisgICAgICBhc3NlcnQgeGYudGd0X3NoYTEgPT0gdGd0X3NoYTEKKyAgICAgIGlmIHhmLnN0eWxlID09ICJkaWZmIjoKKyAgICAgICAgc3JjX3NoYTEgPSBzZWxmLnNyYy5SYW5nZVNoYTEoeGYuc3JjX3JhbmdlcykKKyAgICAgICAgYXNzZXJ0IHhmLnNyY19zaGExID09IHNyY19zaGExCiAKICAgZGVmIEFzc2VydFNlcXVlbmNlR29vZChzZWxmKToKICAgICAjIFNpbXVsYXRlIHRoZSBzZXF1ZW5jZXMgb2YgdHJhbnNmZXJzIHdlIHdpbGwgb3V0cHV0LCBhbmQgY2hlY2sgdGhhdDoKQEAgLTkwMiw3ICsxMDY1LDcgQEAKICAgICAgICAgICBvdXRfb2Zfb3JkZXIgKz0gMQogICAgICAgICAgIGFzc2VydCB4Zi5zcmNfcmFuZ2VzLm92ZXJsYXBzKHUudGd0X3JhbmdlcykKICAgICAgICAgICB4Zi5zcmNfcmFuZ2VzID0geGYuc3JjX3Jhbmdlcy5zdWJ0cmFjdCh1LnRndF9yYW5nZXMpCi0gICAgICAgICAgeGYuaW50YWN0ID0gRmFsc2UKKyAgICAgICAgICB4Zi5zcmNfcmFuZ2VzLmV4dHJhWyd0cmltbWVkJ10gPSBUcnVlCiAKICAgICAgIGlmIHhmLnN0eWxlID09ICJkaWZmIiBhbmQgbm90IHhmLnNyY19yYW5nZXM6CiAgICAgICAgICMgbm90aGluZyBsZWZ0IHRvIGRpZmYgZnJvbTsgdHJlYXQgYXMgbmV3IGRhdGEKQEAgLTEwMjEsNyArMTE4NCw4IEBACiAgICAgICB3aGlsZSBzaW5rczoKICAgICAgICAgbmV3X3NpbmtzID0gT3JkZXJlZERpY3QoKQogICAgICAgICBmb3IgdSBpbiBzaW5rczoKLSAgICAgICAgICBpZiB1IG5vdCBpbiBHOiBjb250aW51ZQorICAgICAgICAgIGlmIHUgbm90IGluIEc6CisgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgIHMyLmFwcGVuZGxlZnQodSkKICAgICAgICAgICBkZWwgR1t1XQogICAgICAgICAgIGZvciBpdSBpbiB1LmluY29taW5nOgpAQCAtMTAzNCw3ICsxMTk4LDggQEAKICAgICAgIHdoaWxlIHNvdXJjZXM6CiAgICAgICAgIG5ld19zb3VyY2VzID0gT3JkZXJlZERpY3QoKQogICAgICAgICBmb3IgdSBpbiBzb3VyY2VzOgotICAgICAgICAgIGlmIHUgbm90IGluIEc6IGNvbnRpbnVlCisgICAgICAgICAgaWYgdSBub3QgaW4gRzoKKyAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgczEuYXBwZW5kKHUpCiAgICAgICAgICAgZGVsIEdbdV0KICAgICAgICAgICBmb3IgaXUgaW4gdS5vdXRnb2luZzoKQEAgLTEwNDMsNyArMTIwOCw4IEBACiAgICAgICAgICAgICAgIG5ld19zb3VyY2VzW2l1XSA9IE5vbmUKICAgICAgICAgc291cmNlcyA9IG5ld19zb3VyY2VzCiAKLSAgICAgIGlmIG5vdCBHOiBicmVhaworICAgICAgaWYgbm90IEc6CisgICAgICAgIGJyZWFrCiAKICAgICAgICMgRmluZCB0aGUgImJlc3QiIHZlcnRleCB0byBwdXQgbmV4dC4gICJCZXN0IiBpcyB0aGUgb25lIHRoYXQKICAgICAgICMgbWF4aW1pemVzIHRoZSBuZXQgZGlmZmVyZW5jZSBpbiBzb3VyY2UgYmxvY2tzIHNhdmVkIHdlIGdldCBieQpAQCAtMTEwMCwxNCArMTI2NiwxNiBAQAogICAgICAgaW50ZXJzZWN0aW9ucyA9IE9yZGVyZWREaWN0KCkKICAgICAgIGZvciBzLCBlIGluIGEudGd0X3JhbmdlczoKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocywgZSk6Ci0gICAgICAgICAgaWYgaSA+PSBsZW4oc291cmNlX3Jhbmdlcyk6IGJyZWFrCisgICAgICAgICAgaWYgaSA+PSBsZW4oc291cmNlX3Jhbmdlcyk6CisgICAgICAgICAgICBicmVhawogICAgICAgICAgICMgQWRkIGFsbCB0aGUgVHJhbnNmZXJzIGluIHNvdXJjZV9yYW5nZXNbaV0gdG8gdGhlIChvcmRlcmVkKSBzZXQuCiAgICAgICAgICAgaWYgc291cmNlX3Jhbmdlc1tpXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGZvciBqIGluIHNvdXJjZV9yYW5nZXNbaV06CiAgICAgICAgICAgICAgIGludGVyc2VjdGlvbnNbal0gPSBOb25lCiAKICAgICAgIGZvciBiIGluIGludGVyc2VjdGlvbnM6Ci0gICAgICAgIGlmIGEgaXMgYjogY29udGludWUKKyAgICAgICAgaWYgYSBpcyBiOgorICAgICAgICAgIGNvbnRpbnVlCiAKICAgICAgICAgIyBJZiB0aGUgYmxvY2tzIHdyaXR0ZW4gYnkgQSBhcmUgcmVhZCBieSBCLCB0aGVuIEIgbmVlZHMgdG8gZ28gYmVmb3JlIEEuCiAgICAgICAgIGkgPSBhLnRndF9yYW5nZXMuaW50ZXJzZWN0KGIuc3JjX3JhbmdlcykKQEAgLTExMjQsOCArMTI5Miw4IEBACiAgIGRlZiBGaW5kVHJhbnNmZXJzKHNlbGYpOgogICAgICIiIlBhcnNlIHRoZSBmaWxlX21hcCB0byBnZW5lcmF0ZSBhbGwgdGhlIHRyYW5zZmVycy4iIiIKIAotICAgIGRlZiBBZGRTcGxpdFRyYW5zZmVycyh0Z3RfbmFtZSwgc3JjX25hbWUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLCBieV9pZCk6CisgICAgZGVmIEFkZFNwbGl0VHJhbnNmZXJzV2l0aEZpeGVkU2l6ZUNodW5rcyh0Z3RfbmFtZSwgc3JjX25hbWUsIHRndF9yYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcmFuZ2VzLCBzdHlsZSwgYnlfaWQpOgogICAgICAgIiIiQWRkIG9uZSBvciBtdWx0aXBsZSBUcmFuc2ZlcigpcyBieSBzcGxpdHRpbmcgbGFyZ2UgZmlsZXMuCiAKICAgICAgIEZvciBCQk9UQSB2Mywgd2UgbmVlZCB0byBzdGFzaCBzb3VyY2UgYmxvY2tzIGZvciByZXN1bWFibGUgZmVhdHVyZS4KQEAgLTExNDAsMjEgKzEzMDgsNyBAQAogICAgICAgQ29tcGFyZWQgdG8gdGhlIGZpeGVkIDEwMjQtYmxvY2sgbGltaXQsIGl0IHJlZHVjZXMgdGhlIG92ZXJhbGwgcGFja2FnZQogICAgICAgc2l6ZSBieSAzMCUgZm9yIHZvbGFudGlzLCBhbmQgMjAlIGZvciBhbmdsZXIgYW5kIGJ1bGxoZWFkLiIiIgogCi0gICAgICAjIFBvc3NpYmx5IHNwbGl0IGxhcmdlIGZpbGVzIGludG8gc21hbGxlciBjaHVua3MuCiAgICAgICBwaWVjZXMgPSAwCi0gICAgICBjYWNoZV9zaXplID0gY29tbW9uLk9QVElPTlMuY2FjaGVfc2l6ZQotICAgICAgc3BsaXRfdGhyZXNob2xkID0gMC4xMjUKLSAgICAgIG1heF9ibG9ja3NfcGVyX3RyYW5zZmVyID0gaW50KGNhY2hlX3NpemUgKiBzcGxpdF90aHJlc2hvbGQgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50Z3QuYmxvY2tzaXplKQotCi0gICAgICAjIENoYW5nZSBub3RoaW5nIGZvciBzbWFsbCBmaWxlcy4KLSAgICAgIGlmICh0Z3RfcmFuZ2VzLnNpemUoKSA8PSBtYXhfYmxvY2tzX3Blcl90cmFuc2ZlciBhbmQKLSAgICAgICAgICBzcmNfcmFuZ2VzLnNpemUoKSA8PSBtYXhfYmxvY2tzX3Blcl90cmFuc2Zlcik6Ci0gICAgICAgIFRyYW5zZmVyKHRndF9uYW1lLCBzcmNfbmFtZSwgdGd0X3Jhbmdlcywgc3JjX3JhbmdlcywKLSAgICAgICAgICAgICAgICAgc2VsZi50Z3QuUmFuZ2VTaGExKHRndF9yYW5nZXMpLCBzZWxmLnNyYy5SYW5nZVNoYTEoc3JjX3JhbmdlcyksCi0gICAgICAgICAgICAgICAgIHN0eWxlLCBieV9pZCkKLSAgICAgICAgcmV0dXJuCi0KICAgICAgIHdoaWxlICh0Z3RfcmFuZ2VzLnNpemUoKSA+IG1heF9ibG9ja3NfcGVyX3RyYW5zZmVyIGFuZAogICAgICAgICAgICAgIHNyY19yYW5nZXMuc2l6ZSgpID4gbWF4X2Jsb2Nrc19wZXJfdHJhbnNmZXIpOgogICAgICAgICB0Z3Rfc3BsaXRfbmFtZSA9ICIlcy0lZCIgJSAodGd0X25hbWUsIHBpZWNlcykKQEAgLTExODAsNiArMTMzNCwzOCBAQAogICAgICAgICAgICAgICAgICBzZWxmLnRndC5SYW5nZVNoYTEodGd0X3JhbmdlcyksIHNlbGYuc3JjLlJhbmdlU2hhMShzcmNfcmFuZ2VzKSwKICAgICAgICAgICAgICAgICAgc3R5bGUsIGJ5X2lkKQogCisgICAgZGVmIEFkZFNwbGl0VHJhbnNmZXJzKHRndF9uYW1lLCBzcmNfbmFtZSwgdGd0X3Jhbmdlcywgc3JjX3Jhbmdlcywgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5X2lkKToKKyAgICAgICIiIkZpbmQgYWxsIHRoZSB6aXAgZmlsZXMgYW5kIHNwbGl0IHRoZSBvdGhlcnMgd2l0aCBhIGZpeGVkIGNodW5rIHNpemUuCisKKyAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBjb25zdHJ1Y3QgYSBsaXN0IG9mIHppcCBhcmNoaXZlcywgd2hpY2ggd2lsbCBsYXRlciBiZQorICAgICAgc3BsaXQgYnkgaW1nZGlmZiB0byByZWR1Y2UgdGhlIGZpbmFsIHBhdGNoIHNpemUuIEZvciB0aGUgb3RoZXIgZmlsZXMsCisgICAgICB3ZSB3aWxsIHBsYWlubHkgc3BsaXQgdGhlbSBiYXNlZCBvbiBhIGZpeGVkIGNodW5rIHNpemUgd2l0aCB0aGUgcG90ZW50aWFsCisgICAgICBwYXRjaCBzaXplIHBlbmFsdHkuCisgICAgICAiIiIKKworICAgICAgYXNzZXJ0IHN0eWxlID09ICJkaWZmIgorCisgICAgICAjIENoYW5nZSBub3RoaW5nIGZvciBzbWFsbCBmaWxlcy4KKyAgICAgIGlmICh0Z3RfcmFuZ2VzLnNpemUoKSA8PSBtYXhfYmxvY2tzX3Blcl90cmFuc2ZlciBhbmQKKyAgICAgICAgICBzcmNfcmFuZ2VzLnNpemUoKSA8PSBtYXhfYmxvY2tzX3Blcl90cmFuc2Zlcik6CisgICAgICAgIFRyYW5zZmVyKHRndF9uYW1lLCBzcmNfbmFtZSwgdGd0X3Jhbmdlcywgc3JjX3JhbmdlcywKKyAgICAgICAgICAgICAgICAgc2VsZi50Z3QuUmFuZ2VTaGExKHRndF9yYW5nZXMpLCBzZWxmLnNyYy5SYW5nZVNoYTEoc3JjX3JhbmdlcyksCisgICAgICAgICAgICAgICAgIHN0eWxlLCBieV9pZCkKKyAgICAgICAgcmV0dXJuCisKKyAgICAgICMgU3BsaXQgbGFyZ2UgQVBLcyB3aXRoIGltZ2RpZmYsIGlmIHBvc3NpYmxlLiBXZSdyZSBpbnRlbnRpb25hbGx5IGNoZWNraW5nCisgICAgICAjIGZpbGUgdHlwZXMgb25lIG1vcmUgdGltZSAoQ2FuVXNlSW1nZGlmZigpIGNoZWNrcyB0aGF0IGFzIHdlbGwpLCBiZWZvcmUKKyAgICAgICMgY2FsbGluZyB0aGUgY29zdGx5IFJhbmdlU2hhMSgpcy4KKyAgICAgIGlmIChzZWxmLkZpbGVUeXBlU3VwcG9ydGVkQnlJbWdkaWZmKHRndF9uYW1lKSBhbmQKKyAgICAgICAgICBzZWxmLnRndC5SYW5nZVNoYTEodGd0X3JhbmdlcykgIT0gc2VsZi5zcmMuUmFuZ2VTaGExKHNyY19yYW5nZXMpKToKKyAgICAgICAgaWYgc2VsZi5DYW5Vc2VJbWdkaWZmKHRndF9uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzLCBUcnVlKToKKyAgICAgICAgICBsYXJnZV9hcGtzLmFwcGVuZCgodGd0X25hbWUsIHNyY19uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzKSkKKyAgICAgICAgICByZXR1cm4KKworICAgICAgQWRkU3BsaXRUcmFuc2ZlcnNXaXRoRml4ZWRTaXplQ2h1bmtzKHRndF9uYW1lLCBzcmNfbmFtZSwgdGd0X3JhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcmFuZ2VzLCBzdHlsZSwgYnlfaWQpCisKICAgICBkZWYgQWRkVHJhbnNmZXIodGd0X25hbWUsIHNyY19uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzLCBzdHlsZSwgYnlfaWQsCiAgICAgICAgICAgICAgICAgICAgIHNwbGl0PUZhbHNlKToKICAgICAgICIiIldyYXBwZXIgZnVuY3Rpb24gZm9yIGFkZGluZyBhIFRyYW5zZmVyKCkuIiIiCkBAIC0xMjI2LDggKzE0MTIsOSBAQAogCiAgICAgICAgIGlmIHRndF9jaGFuZ2VkIDwgdGd0X3NpemUgKiBjcm9wX3RocmVzaG9sZDoKICAgICAgICAgICBhc3NlcnQgdGd0X2NoYW5nZWQgKyB0Z3Rfc2tpcHBlZC5zaXplKCkgPT0gdGd0X3NpemUKLSAgICAgICAgICBwcmludCgnJTEwZCAlMTBkICglNi4yZiUlKSAlcycgJSAodGd0X3NraXBwZWQuc2l6ZSgpLCB0Z3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICB0Z3Rfc2tpcHBlZC5zaXplKCkgKiAxMDAuMCAvIHRndF9zaXplLCB0Z3RfbmFtZSkpCisgICAgICAgICAgcHJpbnQoJyUxMGQgJTEwZCAoJTYuMmYlJSkgJXMnICUgKAorICAgICAgICAgICAgICB0Z3Rfc2tpcHBlZC5zaXplKCksIHRndF9zaXplLAorICAgICAgICAgICAgICB0Z3Rfc2tpcHBlZC5zaXplKCkgKiAxMDAuMCAvIHRndF9zaXplLCB0Z3RfbmFtZSkpCiAgICAgICAgICAgQWRkU3BsaXRUcmFuc2ZlcnMoCiAgICAgICAgICAgICAgICIlcy1za2lwcGVkIiAlICh0Z3RfbmFtZSwpLAogICAgICAgICAgICAgICAiJXMtc2tpcHBlZCIgJSAoc3JjX25hbWUsKSwKQEAgLTEyNDgsMTAgKzE0MzUsMTM2IEBACiAgICAgICBBZGRTcGxpdFRyYW5zZmVycygKICAgICAgICAgICB0Z3RfbmFtZSwgc3JjX25hbWUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsIHN0eWxlLCBieV9pZCkKIAorICAgIGRlZiBQYXJzZUFuZFZhbGlkYXRlU3BsaXRJbmZvKHBhdGNoX3NpemUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfaW5mbyk6CisgICAgICAiIiJQYXJzZSB0aGUgc3BsaXRfaW5mbyBhbmQgcmV0dXJuIGEgbGlzdCBvZiBpbmZvIHR1cGxlcy4KKworICAgICAgQXJnczoKKyAgICAgICAgcGF0Y2hfc2l6ZTogdG90YWwgc2l6ZSBvZiB0aGUgcGF0Y2ggZmlsZS4KKyAgICAgICAgdGd0X3JhbmdlczogUmFuZ2VzIG9mIHRoZSB0YXJnZXQgZmlsZSB3aXRoaW4gdGhlIG9yaWdpbmFsIGltYWdlLgorICAgICAgICBzcmNfcmFuZ2VzOiBSYW5nZXMgb2YgdGhlIHNvdXJjZSBmaWxlIHdpdGhpbiB0aGUgb3JpZ2luYWwgaW1hZ2UuCisgICAgICAgIHNwbGl0X2luZm8gZm9ybWF0OgorICAgICAgICAgIGltZ2RpZmYgdmVyc2lvbiMKKyAgICAgICAgICBjb3VudCBvZiBwaWVjZXMKKyAgICAgICAgICA8cGF0Y2hfc2l6ZV8xPiA8dGd0X3NpemVfMT4gPHNyY19yYW5nZXNfMT4KKyAgICAgICAgICAuLi4KKyAgICAgICAgICA8cGF0Y2hfc2l6ZV9uPiA8dGd0X3NpemVfbj4gPHNyY19yYW5nZXNfbj4KKworICAgICAgUmV0dXJuczoKKyAgICAgICAgW3BhdGNoX3N0YXJ0LCBwYXRjaF9sZW4sIHNwbGl0X3RndF9yYW5nZXMsIHNwbGl0X3NyY19yYW5nZXNdCisgICAgICAiIiIKKworICAgICAgdmVyc2lvbiA9IGludChzcGxpdF9pbmZvWzBdKQorICAgICAgYXNzZXJ0IHZlcnNpb24gPT0gMgorICAgICAgY291bnQgPSBpbnQoc3BsaXRfaW5mb1sxXSkKKyAgICAgIGFzc2VydCBsZW4oc3BsaXRfaW5mbykgLSAyID09IGNvdW50CisKKyAgICAgIHNwbGl0X2luZm9fbGlzdCA9IFtdCisgICAgICBwYXRjaF9zdGFydCA9IDAKKyAgICAgIHRndF9yZW1haW4gPSBjb3B5LmRlZXBjb3B5KHRndF9yYW5nZXMpCisgICAgICAjIGVhY2ggbGluZSBoYXMgdGhlIGZvcm1hdCA8cGF0Y2hfc2l6ZT4sIDx0Z3Rfc2l6ZT4sIDxzcmNfcmFuZ2VzPgorICAgICAgZm9yIGxpbmUgaW4gc3BsaXRfaW5mb1syOl06CisgICAgICAgIGluZm8gPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgYXNzZXJ0IGxlbihpbmZvKSA9PSAzCisgICAgICAgIHBhdGNoX2xlbmd0aCA9IGludChpbmZvWzBdKQorCisgICAgICAgIHNwbGl0X3RndF9zaXplID0gaW50KGluZm9bMV0pCisgICAgICAgIGFzc2VydCBzcGxpdF90Z3Rfc2l6ZSAlIDQwOTYgPT0gMAorICAgICAgICBhc3NlcnQgc3BsaXRfdGd0X3NpemUgLyA0MDk2IDw9IHRndF9yZW1haW4uc2l6ZSgpCisgICAgICAgIHNwbGl0X3RndF9yYW5nZXMgPSB0Z3RfcmVtYWluLmZpcnN0KHNwbGl0X3RndF9zaXplIC8gNDA5NikKKyAgICAgICAgdGd0X3JlbWFpbiA9IHRndF9yZW1haW4uc3VidHJhY3Qoc3BsaXRfdGd0X3JhbmdlcykKKworICAgICAgICAjIEZpbmQgdGhlIHNwbGl0X3NyY19yYW5nZXMgd2l0aGluIHRoZSBpbWFnZSBmaWxlIGZyb20gaXRzIHJlbGF0aXZlCisgICAgICAgICMgcG9zaXRpb24gaW4gZmlsZS4KKyAgICAgICAgc3BsaXRfc3JjX2luZGljZXMgPSBSYW5nZVNldC5wYXJzZV9yYXcoaW5mb1syXSkKKyAgICAgICAgc3BsaXRfc3JjX3JhbmdlcyA9IFJhbmdlU2V0KCkKKyAgICAgICAgZm9yIHIgaW4gc3BsaXRfc3JjX2luZGljZXM6CisgICAgICAgICAgY3Vycl9yYW5nZSA9IHNyY19yYW5nZXMuZmlyc3QoclsxXSkuc3VidHJhY3Qoc3JjX3Jhbmdlcy5maXJzdChyWzBdKSkKKyAgICAgICAgICBhc3NlcnQgbm90IHNwbGl0X3NyY19yYW5nZXMub3ZlcmxhcHMoY3Vycl9yYW5nZSkKKyAgICAgICAgICBzcGxpdF9zcmNfcmFuZ2VzID0gc3BsaXRfc3JjX3Jhbmdlcy51bmlvbihjdXJyX3JhbmdlKQorCisgICAgICAgIHNwbGl0X2luZm9fbGlzdC5hcHBlbmQoKHBhdGNoX3N0YXJ0LCBwYXRjaF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0X3RndF9yYW5nZXMsIHNwbGl0X3NyY19yYW5nZXMpKQorICAgICAgICBwYXRjaF9zdGFydCArPSBwYXRjaF9sZW5ndGgKKworICAgICAgIyBDaGVjayB0aGF0IHRoZSBzaXplcyBvZiBhbGwgdGhlIHNwbGl0IHBpZWNlcyBhZGQgdXAgdG8gdGhlIGZpbmFsIGZpbGUKKyAgICAgICMgc2l6ZSBmb3IgcGF0Y2ggYW5kIHRhcmdldC4KKyAgICAgIGFzc2VydCB0Z3RfcmVtYWluLnNpemUoKSA9PSAwCisgICAgICBhc3NlcnQgcGF0Y2hfc3RhcnQgPT0gcGF0Y2hfc2l6ZQorICAgICAgcmV0dXJuIHNwbGl0X2luZm9fbGlzdAorCisgICAgZGVmIFNwbGl0TGFyZ2VBcGtzKCk6CisgICAgICAiIiJTcGxpdCB0aGUgbGFyZ2UgYXBrcyBmaWxlcy4KKworICAgICAgRXhhbXBsZTogQ2hyb21lLmFwayB3aWxsIGJlIHNwbGl0IGludG8KKyAgICAgICAgc3JjLTA6IENocm9tZS5hcGstMCwgdGd0LTA6IENocm9tZS5hcGstMAorICAgICAgICBzcmMtMTogQ2hyb21lLmFway0xLCB0Z3QtMTogQ2hyb21lLmFway0xCisgICAgICAgIC4uLgorCisgICAgICBBZnRlciB0aGUgc3BsaXQsIHRoZSB0YXJnZXQgcGllY2VzIGFyZSBjb250aW51b3VzIGFuZCBibG9jayBhbGlnbmVkOyBhbmQKKyAgICAgIHRoZSBzb3VyY2UgcGllY2VzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIER1cmluZyB0aGUgc3BsaXQsIHdlIGFsc28KKyAgICAgIGdlbmVyYXRlIGFuZCBzYXZlIHRoZSBpbWFnZSBwYXRjaCBiZXR3ZWVuIHNyYy1YICYgdGd0LVguIFRoaXMgcGF0Y2ggd2lsbAorICAgICAgYmUgdmFsaWQgYmVjYXVzZSB0aGUgYmxvY2sgcmFuZ2VzIG9mIHNyYy1YICYgdGd0LVggd2lsbCBhbHdheXMgc3RheSB0aGUKKyAgICAgIHNhbWUgYWZ0ZXJ3YXJkczsgYnV0IHRoZXJlJ3MgYSBjaGFuY2Ugd2UgZG9uJ3QgdXNlIHRoZSBwYXRjaCBpZiB3ZQorICAgICAgY29udmVydCB0aGUgImRpZmYiIGNvbW1hbmQgaW50byAibmV3IiBvciAibW92ZSIgbGF0ZXIuCisgICAgICAiIiIKKworICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgd2l0aCB0cmFuc2Zlcl9sb2NrOgorICAgICAgICAgIGlmIG5vdCBsYXJnZV9hcGtzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgdGd0X25hbWUsIHNyY19uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzID0gbGFyZ2VfYXBrcy5wb3AoMCkKKworICAgICAgICBzcmNfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzcmMtIikKKyAgICAgICAgdGd0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0idGd0LSIpCisgICAgICAgIHdpdGggb3BlbihzcmNfZmlsZSwgIndiIikgYXMgc3JjX2ZkOgorICAgICAgICAgIHNlbGYuc3JjLldyaXRlUmFuZ2VEYXRhVG9GZChzcmNfcmFuZ2VzLCBzcmNfZmQpCisgICAgICAgIHdpdGggb3Blbih0Z3RfZmlsZSwgIndiIikgYXMgdGd0X2ZkOgorICAgICAgICAgIHNlbGYudGd0LldyaXRlUmFuZ2VEYXRhVG9GZCh0Z3RfcmFuZ2VzLCB0Z3RfZmQpCisKKyAgICAgICAgcGF0Y2hfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJwYXRjaC0iKQorICAgICAgICBwYXRjaF9pbmZvX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic3BsaXRfaW5mby0iKQorICAgICAgICBjbWQgPSBbImltZ2RpZmYiLCAiLXoiLAorICAgICAgICAgICAgICAgIi0tYmxvY2stbGltaXQ9e30iLmZvcm1hdChtYXhfYmxvY2tzX3Blcl90cmFuc2ZlciksCisgICAgICAgICAgICAgICAiLS1zcGxpdC1pbmZvPSIgKyBwYXRjaF9pbmZvX2ZpbGUsCisgICAgICAgICAgICAgICBzcmNfZmlsZSwgdGd0X2ZpbGUsIHBhdGNoX2ZpbGVdCisgICAgICAgIHAgPSBjb21tb24uUnVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgICBpbWdkaWZmX291dHB1dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBhc3NlcnQgcC5yZXR1cm5jb2RlID09IDAsIFwKKyAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGltZ2RpZmYgcGF0Y2ggYmV0d2VlbiB7fSBhbmQge306XG57fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgIHNyY19uYW1lLCB0Z3RfbmFtZSwgaW1nZGlmZl9vdXRwdXQpCisKKyAgICAgICAgd2l0aCBvcGVuKHBhdGNoX2luZm9fZmlsZSkgYXMgcGF0Y2hfaW5mbzoKKyAgICAgICAgICBsaW5lcyA9IHBhdGNoX2luZm8ucmVhZGxpbmVzKCkKKworICAgICAgICBwYXRjaF9zaXplX3RvdGFsID0gb3MucGF0aC5nZXRzaXplKHBhdGNoX2ZpbGUpCisgICAgICAgIHNwbGl0X2luZm9fbGlzdCA9IFBhcnNlQW5kVmFsaWRhdGVTcGxpdEluZm8ocGF0Y2hfc2l6ZV90b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzKQorICAgICAgICBmb3IgaW5kZXgsIChwYXRjaF9zdGFydCwgcGF0Y2hfbGVuZ3RoLCBzcGxpdF90Z3RfcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICBzcGxpdF9zcmNfcmFuZ2VzKSBpbiBlbnVtZXJhdGUoc3BsaXRfaW5mb19saXN0KToKKyAgICAgICAgICB3aXRoIG9wZW4ocGF0Y2hfZmlsZSkgYXMgZjoKKyAgICAgICAgICAgIGYuc2VlayhwYXRjaF9zdGFydCkKKyAgICAgICAgICAgIHBhdGNoX2NvbnRlbnQgPSBmLnJlYWQocGF0Y2hfbGVuZ3RoKQorCisgICAgICAgICAgc3BsaXRfc3JjX25hbWUgPSAie30te30iLmZvcm1hdChzcmNfbmFtZSwgaW5kZXgpCisgICAgICAgICAgc3BsaXRfdGd0X25hbWUgPSAie30te30iLmZvcm1hdCh0Z3RfbmFtZSwgaW5kZXgpCisgICAgICAgICAgc3BsaXRfbGFyZ2VfYXBrcy5hcHBlbmQoKHNwbGl0X3RndF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdF9zcmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfdGd0X3JhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRfc3JjX3JhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hfY29udGVudCkpCisKICAgICBwcmludCgiRmluZGluZyB0cmFuc2ZlcnMuLi4iKQogCisgICAgbGFyZ2VfYXBrcyA9IFtdCisgICAgc3BsaXRfbGFyZ2VfYXBrcyA9IFtdCisgICAgY2FjaGVfc2l6ZSA9IGNvbW1vbi5PUFRJT05TLmNhY2hlX3NpemUKKyAgICBzcGxpdF90aHJlc2hvbGQgPSAwLjEyNQorICAgIG1heF9ibG9ja3NfcGVyX3RyYW5zZmVyID0gaW50KGNhY2hlX3NpemUgKiBzcGxpdF90aHJlc2hvbGQgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGd0LmJsb2Nrc2l6ZSkKICAgICBlbXB0eSA9IFJhbmdlU2V0KCkKLSAgICBmb3IgdGd0X2ZuLCB0Z3RfcmFuZ2VzIGluIHNlbGYudGd0LmZpbGVfbWFwLml0ZW1zKCk6CisgICAgZm9yIHRndF9mbiwgdGd0X3JhbmdlcyBpbiBzb3J0ZWQoc2VsZi50Z3QuZmlsZV9tYXAuaXRlbXMoKSk6CiAgICAgICBpZiB0Z3RfZm4gPT0gIl9fWkVSTyI6CiAgICAgICAgICMgdGhlIHNwZWNpYWwgIl9fWkVSTyIgZG9tYWluIGlzIGFsbCB0aGUgYmxvY2tzIG5vdCBjb250YWluZWQKICAgICAgICAgIyBpbiBhbnkgZmlsZSBhbmQgdGhhdCBhcmUgZmlsbGVkIHdpdGggemVyb3MuICBXZSBoYXZlIGEKQEAgLTEyOTQsNiArMTYwNywyNCBAQAogCiAgICAgICBBZGRUcmFuc2Zlcih0Z3RfZm4sIE5vbmUsIHRndF9yYW5nZXMsIGVtcHR5LCAibmV3Iiwgc2VsZi50cmFuc2ZlcnMpCiAKKyAgICB0cmFuc2Zlcl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgIHRocmVhZHMgPSBbdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9U3BsaXRMYXJnZUFwa3MpCisgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpXQorICAgIGZvciB0aCBpbiB0aHJlYWRzOgorICAgICAgdGguc3RhcnQoKQorICAgIHdoaWxlIHRocmVhZHM6CisgICAgICB0aHJlYWRzLnBvcCgpLmpvaW4oKQorCisgICAgIyBTb3J0IHRoZSBzcGxpdCB0cmFuc2ZlcnMgZm9yIGxhcmdlIGFwa3MgdG8gZ2VuZXJhdGUgYSBkZXRlcm1pbmF0ZSBwYWNrYWdlLgorICAgIHNwbGl0X2xhcmdlX2Fwa3Muc29ydCgpCisgICAgZm9yICh0Z3RfbmFtZSwgc3JjX25hbWUsIHRndF9yYW5nZXMsIHNyY19yYW5nZXMsCisgICAgICAgICBwYXRjaCkgaW4gc3BsaXRfbGFyZ2VfYXBrczoKKyAgICAgIHRyYW5zZmVyX3NwbGl0ID0gVHJhbnNmZXIodGd0X25hbWUsIHNyY19uYW1lLCB0Z3RfcmFuZ2VzLCBzcmNfcmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRndC5SYW5nZVNoYTEodGd0X3JhbmdlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3JjLlJhbmdlU2hhMShzcmNfcmFuZ2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpZmYiLCBzZWxmLnRyYW5zZmVycykKKyAgICAgIHRyYW5zZmVyX3NwbGl0LnBhdGNoID0gcGF0Y2gKKwogICBkZWYgQWJicmV2aWF0ZVNvdXJjZU5hbWVzKHNlbGYpOgogICAgIGZvciBrIGluIHNlbGYuc3JjLmZpbGVfbWFwLmtleXMoKToKICAgICAgIGIgPSBvcy5wYXRoLmJhc2VuYW1lKGspCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgYi90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkKaW5kZXggY2NmYTM1Zi4uMTIzZWM3YyAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weQpAQCAtMTUsNjMgKzE1LDc5IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAiIiIKLUJ1aWxkIGltYWdlIG91dHB1dF9pbWFnZV9maWxlIGZyb20gaW5wdXRfZGlyZWN0b3J5LCBwcm9wZXJ0aWVzX2ZpbGUsIGFuZCB0YXJnZXRfb3V0X2RpcgorQnVpbGRzIG91dHB1dF9pbWFnZSBmcm9tIHRoZSBnaXZlbiBpbnB1dF9kaXJlY3RvcnksIHByb3BlcnRpZXNfZmlsZSwKK2FuZCB3cml0ZXMgdGhlIGltYWdlIHRvIHRhcmdldF9vdXRwdXRfZGlyZWN0b3J5LgogCi1Vc2FnZTogIGJ1aWxkX2ltYWdlIGlucHV0X2RpcmVjdG9yeSBwcm9wZXJ0aWVzX2ZpbGUgb3V0cHV0X2ltYWdlX2ZpbGUgdGFyZ2V0X291dF9kaXIKLQorVXNhZ2U6ICBidWlsZF9pbWFnZS5weSBpbnB1dF9kaXJlY3RvcnkgcHJvcGVydGllc19maWxlIG91dHB1dF9pbWFnZSBcXAorICAgICAgICAgICAgdGFyZ2V0X291dHB1dF9kaXJlY3RvcnkKICIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKIGltcG9ydCBvcwogaW1wb3J0IG9zLnBhdGgKIGltcG9ydCByZQotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCBzeXMKLWltcG9ydCBjb21tb24KIGltcG9ydCBzaGxleAogaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworaW1wb3J0IGNvbW1vbgogaW1wb3J0IHNwYXJzZV9pbWcKLWltcG9ydCB0ZW1wZmlsZQorCiAKIE9QVElPTlMgPSBjb21tb24uT1BUSU9OUwogCiBGSVhFRF9TQUxUID0gImFlZTA4N2E1YmUzYjk4Mjk3OGM5MjNmNTY2YTk0NjEzNDk2YjQxN2YyYWY1OTI2MzliYzgwZDE0MWUzNGRmZTciCiBCTE9DS19TSVpFID0gNDA5NgogCi1kZWYgUnVuQ29tbWFuZChjbWQpOgorCitkZWYgUnVuQ29tbWFuZChjbWQsIHZlcmJvc2U9Tm9uZSk6CiAgICIiIkVjaG8gYW5kIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZC4KIAogICBBcmdzOgogICAgIGNtZDogdGhlIGNvbW1hbmQgcmVwcmVzZW50ZWQgYXMgYSBsaXN0IG9mIHN0cmluZ3MuCisgICAgdmVyYm9zZTogc2hvdyBjb21tYW5kcyBiZWluZyBleGVjdXRlZC4KICAgUmV0dXJuczoKICAgICBBIHR1cGxlIG9mIHRoZSBvdXRwdXQgYW5kIHRoZSBleGl0IGNvZGUuCiAgICIiIgotICBwcmludCAiUnVubmluZzogIiwgIiAiLmpvaW4oY21kKQorICBpZiB2ZXJib3NlIGlzIE5vbmU6CisgICAgdmVyYm9zZSA9IE9QVElPTlMudmVyYm9zZQorICBpZiB2ZXJib3NlOgorICAgIHByaW50KCJSdW5uaW5nOiAiICsgIiAiLmpvaW4oY21kKSkKICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCiAgIG91dHB1dCwgXyA9IHAuY29tbXVuaWNhdGUoKQotICBwcmludCAiJXMiICUgKG91dHB1dC5yc3RyaXAoKSwpCisKKyAgaWYgdmVyYm9zZToKKyAgICBwcmludChvdXRwdXQucnN0cmlwKCkpCiAgIHJldHVybiAob3V0cHV0LCBwLnJldHVybmNvZGUpCiAKKwogZGVmIEdldFZlcml0eUZFQ1NpemUocGFydGl0aW9uX3NpemUpOgogICBjbWQgPSBbImZlYyIsICItcyIsIHN0cihwYXJ0aXRpb25fc2l6ZSldCi0gIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQpCisgIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQsIEZhbHNlKQogICBpZiBleGl0X2NvZGUgIT0gMDoKICAgICByZXR1cm4gRmFsc2UsIDAKICAgcmV0dXJuIFRydWUsIGludChvdXRwdXQpCiAKKwogZGVmIEdldFZlcml0eVRyZWVTaXplKHBhcnRpdGlvbl9zaXplKToKICAgY21kID0gWyJidWlsZF92ZXJpdHlfdHJlZSIsICItcyIsIHN0cihwYXJ0aXRpb25fc2l6ZSldCi0gIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQpCisgIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQsIEZhbHNlKQogICBpZiBleGl0X2NvZGUgIT0gMDoKICAgICByZXR1cm4gRmFsc2UsIDAKICAgcmV0dXJuIFRydWUsIGludChvdXRwdXQpCiAKKwogZGVmIEdldFZlcml0eU1ldGFkYXRhU2l6ZShwYXJ0aXRpb25fc2l6ZSk6CiAgIGNtZCA9IFsic3lzdGVtL2V4dHJhcy92ZXJpdHkvYnVpbGRfdmVyaXR5X21ldGFkYXRhLnB5IiwgInNpemUiLAogICAgICAgICAgc3RyKHBhcnRpdGlvbl9zaXplKV0KLSAgb3V0cHV0LCBleGl0X2NvZGUgPSBSdW5Db21tYW5kKGNtZCkKKyAgb3V0cHV0LCBleGl0X2NvZGUgPSBSdW5Db21tYW5kKGNtZCwgRmFsc2UpCiAgIGlmIGV4aXRfY29kZSAhPSAwOgogICAgIHJldHVybiBGYWxzZSwgMAogICByZXR1cm4gVHJ1ZSwgaW50KG91dHB1dCkKIAorCiBkZWYgR2V0VmVyaXR5U2l6ZShwYXJ0aXRpb25fc2l6ZSwgZmVjX3N1cHBvcnRlZCk6CiAgIHN1Y2Nlc3MsIHZlcml0eV90cmVlX3NpemUgPSBHZXRWZXJpdHlUcmVlU2l6ZShwYXJ0aXRpb25fc2l6ZSkKICAgaWYgbm90IHN1Y2Nlc3M6CkBAIC04NywxNiArMTAzLDE5IEBACiAgICAgcmV0dXJuIHZlcml0eV9zaXplICsgZmVjX3NpemUKICAgcmV0dXJuIHZlcml0eV9zaXplCiAKKwogZGVmIEdldFNpbWdTaXplKGltYWdlX2ZpbGUpOgogICBzaW1nID0gc3BhcnNlX2ltZy5TcGFyc2VJbWFnZShpbWFnZV9maWxlLCBidWlsZF9tYXA9RmFsc2UpCiAgIHJldHVybiBzaW1nLmJsb2Nrc2l6ZSAqIHNpbWcudG90YWxfYmxvY2tzCiAKKwogZGVmIFplcm9QYWRTaW1nKGltYWdlX2ZpbGUsIHBhZF9zaXplKToKICAgYmxvY2tzID0gcGFkX3NpemUgLy8gQkxPQ0tfU0laRQogICBwcmludCgiUGFkZGluZyAlZCBibG9ja3MgKCVkIGJ5dGVzKSIgJSAoYmxvY2tzLCBwYWRfc2l6ZSkpCiAgIHNpbWcgPSBzcGFyc2VfaW1nLlNwYXJzZUltYWdlKGltYWdlX2ZpbGUsIG1vZGU9InIrYiIsIGJ1aWxkX21hcD1GYWxzZSkKICAgc2ltZy5BcHBlbmRGaWxsQ2h1bmsoMCwgYmxvY2tzKQogCisKIGRlZiBBVkJDYWxjTWF4SW1hZ2VTaXplKGF2YnRvb2wsIGZvb3Rlcl90eXBlLCBwYXJ0aXRpb25fc2l6ZSwgYWRkaXRpb25hbF9hcmdzKToKICAgIiIiQ2FsY3VsYXRlcyBtYXggaW1hZ2Ugc2l6ZSBmb3IgYSBnaXZlbiBwYXJ0aXRpb24gc2l6ZS4KIApAQCAtMTA5LDggKzEyOCw4IEBACiAgIFJldHVybnM6CiAgICAgVGhlIG1heGltdW0gaW1hZ2Ugc2l6ZSBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICAiIiIKLSAgY21kID1bYXZidG9vbCwgImFkZF8lc19mb290ZXIiICUgZm9vdGVyX3R5cGUsCi0gICAgICAgICItLXBhcnRpdGlvbl9zaXplIiwgcGFydGl0aW9uX3NpemUsICItLWNhbGNfbWF4X2ltYWdlX3NpemUiXQorICBjbWQgPSBbYXZidG9vbCwgImFkZF8lc19mb290ZXIiICUgZm9vdGVyX3R5cGUsCisgICAgICAgICAiLS1wYXJ0aXRpb25fc2l6ZSIsIHBhcnRpdGlvbl9zaXplLCAiLS1jYWxjX21heF9pbWFnZV9zaXplIl0KICAgY21kLmV4dGVuZChzaGxleC5zcGxpdChhZGRpdGlvbmFsX2FyZ3MpKQogCiAgIChvdXRwdXQsIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGNtZCkKQEAgLTExOSw2ICsxMzgsNyBAQAogICBlbHNlOgogICAgIHJldHVybiBpbnQob3V0cHV0KQogCisKIGRlZiBBVkJBZGRGb290ZXIoaW1hZ2VfcGF0aCwgYXZidG9vbCwgZm9vdGVyX3R5cGUsIHBhcnRpdGlvbl9zaXplLAogICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fbmFtZSwga2V5X3BhdGgsIGFsZ29yaXRobSwgc2FsdCwKICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9hcmdzKToKQEAgLTEzNCwxNCArMTU0LDE1IEBACiAgICAgYWxnb3JpdGhtOiBOYW1lIG9mIGFsZ29yaXRobSB0byB1c2Ugb3IgTm9uZS4KICAgICBzYWx0OiBUaGUgc2FsdCB0byB1c2UgKGEgaGV4YWRlY2ltYWwgc3RyaW5nKSBvciBOb25lLgogICAgIGFkZGl0aW9uYWxfYXJnczogQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byAnYXZidG9vbAotICAgICAgYWRkX2hhc2h0cmVlX2ltYWdlJy4KKyAgICAgICAgYWRkX2hhc2h0cmVlX2ltYWdlJy4KKwogICBSZXR1cm5zOgogICAgIFRydWUgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQuCiAgICIiIgotICBjbWQgPVthdmJ0b29sLCAiYWRkXyVzX2Zvb3RlciIgJSBmb290ZXJfdHlwZSwKLSAgICAgICAgIi0tcGFydGl0aW9uX3NpemUiLCBwYXJ0aXRpb25fc2l6ZSwKLSAgICAgICAgIi0tcGFydGl0aW9uX25hbWUiLCBwYXJ0aXRpb25fbmFtZSwKLSAgICAgICAgIi0taW1hZ2UiLCBpbWFnZV9wYXRoXQorICBjbWQgPSBbYXZidG9vbCwgImFkZF8lc19mb290ZXIiICUgZm9vdGVyX3R5cGUsCisgICAgICAgICAiLS1wYXJ0aXRpb25fc2l6ZSIsIHBhcnRpdGlvbl9zaXplLAorICAgICAgICAgIi0tcGFydGl0aW9uX25hbWUiLCBwYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICItLWltYWdlIiwgaW1hZ2VfcGF0aF0KIAogICBpZiBrZXlfcGF0aCBhbmQgYWxnb3JpdGhtOgogICAgIGNtZC5leHRlbmQoWyItLWtleSIsIGtleV9wYXRoLCAiLS1hbGdvcml0aG0iLCBhbGdvcml0aG1dKQpAQCAtMTUzLDEyICsxNzQsMTUgQEAKICAgKF8sIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGNtZCkKICAgcmV0dXJuIGV4aXRfY29kZSA9PSAwCiAKKwogZGVmIEFkanVzdFBhcnRpdGlvblNpemVGb3JWZXJpdHkocGFydGl0aW9uX3NpemUsIGZlY19zdXBwb3J0ZWQpOgogICAiIiJNb2RpZmllcyB0aGUgcHJvdmlkZWQgcGFydGl0aW9uIHNpemUgdG8gYWNjb3VudCBmb3IgdGhlIHZlcml0eSBtZXRhZGF0YS4KIAogICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gc2l6ZSB0aGUgY3JlYXRlZCBpbWFnZSBhcHByb3ByaWF0ZWx5LgorCiAgIEFyZ3M6CiAgICAgcGFydGl0aW9uX3NpemU6IHRoZSBzaXplIG9mIHRoZSBwYXJ0aXRpb24gdG8gYmUgdmVyaWZpZWQuCisKICAgUmV0dXJuczoKICAgICBBIHR1cGxlIG9mIHRoZSBzaXplIG9mIHRoZSBwYXJ0aXRpb24gYWRqdXN0ZWQgZm9yIHZlcml0eSBtZXRhZGF0YSwgYW5kCiAgICAgdGhlIHNpemUgb2YgdmVyaXR5IG1ldGFkYXRhLgpAQCAtMTg5LDQ2ICsyMTMsNTcgQEAKICAgICBlbHNlOgogICAgICAgaGkgPSBpCiAKKyAgaWYgT1BUSU9OUy52ZXJib3NlOgorICAgIHByaW50KCJBZGp1c3RlZCBwYXJ0aXRpb24gc2l6ZSBmb3IgdmVyaXR5LCBwYXJ0aXRpb25fc2l6ZToge30sIgorICAgICAgICAgICIgdmVyaXR5X3NpemU6IHt9Ii5mb3JtYXQocmVzdWx0LCB2ZXJpdHlfc2l6ZSkpCiAgIEFkanVzdFBhcnRpdGlvblNpemVGb3JWZXJpdHkucmVzdWx0c1trZXldID0gKHJlc3VsdCwgdmVyaXR5X3NpemUpCiAgIHJldHVybiAocmVzdWx0LCB2ZXJpdHlfc2l6ZSkKIAorCiBBZGp1c3RQYXJ0aXRpb25TaXplRm9yVmVyaXR5LnJlc3VsdHMgPSB7fQogCisKIGRlZiBCdWlsZFZlcml0eUZFQyhzcGFyc2VfaW1hZ2VfcGF0aCwgdmVyaXR5X3BhdGgsIHZlcml0eV9mZWNfcGF0aCwKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nX3NpemUpOgogICBjbWQgPSBbImZlYyIsICItZSIsICItcCIsIHN0cihwYWRkaW5nX3NpemUpLCBzcGFyc2VfaW1hZ2VfcGF0aCwKICAgICAgICAgIHZlcml0eV9wYXRoLCB2ZXJpdHlfZmVjX3BhdGhdCiAgIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQpCiAgIGlmIGV4aXRfY29kZSAhPSAwOgotICAgIHByaW50ICJDb3VsZCBub3QgYnVpbGQgRkVDIGRhdGEhIEVycm9yOiAlcyIgJSBvdXRwdXQKKyAgICBwcmludCgiQ291bGQgbm90IGJ1aWxkIEZFQyBkYXRhISBFcnJvcjogJXMiICUgb3V0cHV0KQogICAgIHJldHVybiBGYWxzZQogICByZXR1cm4gVHJ1ZQogCisKIGRlZiBCdWlsZFZlcml0eVRyZWUoc3BhcnNlX2ltYWdlX3BhdGgsIHZlcml0eV9pbWFnZV9wYXRoLCBwcm9wX2RpY3QpOgogICBjbWQgPSBbImJ1aWxkX3Zlcml0eV90cmVlIiwgIi1BIiwgRklYRURfU0FMVCwgc3BhcnNlX2ltYWdlX3BhdGgsCiAgICAgICAgICB2ZXJpdHlfaW1hZ2VfcGF0aF0KICAgb3V0cHV0LCBleGl0X2NvZGUgPSBSdW5Db21tYW5kKGNtZCkKICAgaWYgZXhpdF9jb2RlICE9IDA6Ci0gICAgcHJpbnQgIkNvdWxkIG5vdCBidWlsZCB2ZXJpdHkgdHJlZSEgRXJyb3I6ICVzIiAlIG91dHB1dAorICAgIHByaW50KCJDb3VsZCBub3QgYnVpbGQgdmVyaXR5IHRyZWUhIEVycm9yOiAlcyIgJSBvdXRwdXQpCiAgICAgcmV0dXJuIEZhbHNlCiAgIHJvb3QsIHNhbHQgPSBvdXRwdXQuc3BsaXQoKQogICBwcm9wX2RpY3RbInZlcml0eV9yb290X2hhc2giXSA9IHJvb3QKICAgcHJvcF9kaWN0WyJ2ZXJpdHlfc2FsdCJdID0gc2FsdAogICByZXR1cm4gVHJ1ZQogCisKIGRlZiBCdWlsZFZlcml0eU1ldGFkYXRhKGltYWdlX3NpemUsIHZlcml0eV9tZXRhZGF0YV9wYXRoLCByb290X2hhc2gsIHNhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBibG9ja19kZXZpY2UsIHNpZ25lcl9wYXRoLCBrZXksIHNpZ25lcl9hcmdzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2RldmljZSwgc2lnbmVyX3BhdGgsIGtleSwgc2lnbmVyX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpdHlfZGlzYWJsZSk6CiAgIGNtZCA9IFsic3lzdGVtL2V4dHJhcy92ZXJpdHkvYnVpbGRfdmVyaXR5X21ldGFkYXRhLnB5IiwgImJ1aWxkIiwKICAgICAgICAgIHN0cihpbWFnZV9zaXplKSwgdmVyaXR5X21ldGFkYXRhX3BhdGgsIHJvb3RfaGFzaCwgc2FsdCwgYmxvY2tfZGV2aWNlLAogICAgICAgICAgc2lnbmVyX3BhdGgsIGtleV0KICAgaWYgc2lnbmVyX2FyZ3M6CiAgICAgY21kLmFwcGVuZCgiLS1zaWduZXJfYXJncz1cIiVzXCIiICUgKCcgJy5qb2luKHNpZ25lcl9hcmdzKSwpKQorICBpZiB2ZXJpdHlfZGlzYWJsZToKKyAgICBjbWQuYXBwZW5kKCItLXZlcml0eV9kaXNhYmxlIikKICAgb3V0cHV0LCBleGl0X2NvZGUgPSBSdW5Db21tYW5kKGNtZCkKICAgaWYgZXhpdF9jb2RlICE9IDA6Ci0gICAgcHJpbnQgIkNvdWxkIG5vdCBidWlsZCB2ZXJpdHkgbWV0YWRhdGEhIEVycm9yOiAlcyIgJSBvdXRwdXQKKyAgICBwcmludCgiQ291bGQgbm90IGJ1aWxkIHZlcml0eSBtZXRhZGF0YSEgRXJyb3I6ICVzIiAlIG91dHB1dCkKICAgICByZXR1cm4gRmFsc2UKICAgcmV0dXJuIFRydWUKIAorCiBkZWYgQXBwZW5kMlNpbWcoc3BhcnNlX2ltYWdlX3BhdGgsIHVuc3BhcnNlX2ltYWdlX3BhdGgsIGVycm9yX21lc3NhZ2UpOgogICAiIiJBcHBlbmRzIHRoZSB1bnNwYXJzZSBpbWFnZSB0byB0aGUgZ2l2ZW4gc3BhcnNlIGltYWdlLgogCkBAIC0yNDEsMTggKzI3NiwyMyBAQAogICBjbWQgPSBbImFwcGVuZDJzaW1nIiwgc3BhcnNlX2ltYWdlX3BhdGgsIHVuc3BhcnNlX2ltYWdlX3BhdGhdCiAgIG91dHB1dCwgZXhpdF9jb2RlID0gUnVuQ29tbWFuZChjbWQpCiAgIGlmIGV4aXRfY29kZSAhPSAwOgotICAgIHByaW50ICIlczogJXMiICUgKGVycm9yX21lc3NhZ2UsIG91dHB1dCkKKyAgICBwcmludCgiJXM6ICVzIiAlIChlcnJvcl9tZXNzYWdlLCBvdXRwdXQpKQogICAgIHJldHVybiBGYWxzZQogICByZXR1cm4gVHJ1ZQogCisKIGRlZiBBcHBlbmQodGFyZ2V0LCBmaWxlX3RvX2FwcGVuZCwgZXJyb3JfbWVzc2FnZSk6Ci0gIHByaW50ICJhcHBlbmRpbmcgJXMgdG8gJXMiICUgKGZpbGVfdG9fYXBwZW5kLCB0YXJnZXQpCi0gIHdpdGggb3Blbih0YXJnZXQsICJhIikgYXMgb3V0X2ZpbGU6Ci0gICAgd2l0aCBvcGVuKGZpbGVfdG9fYXBwZW5kLCAiciIpIGFzIGlucHV0X2ZpbGU6CisgICIiIkFwcGVuZHMgZmlsZV90b19hcHBlbmQgdG8gdGFyZ2V0LiIiIgorICB0cnk6CisgICAgd2l0aCBvcGVuKHRhcmdldCwgImEiKSBhcyBvdXRfZmlsZSwgb3BlbihmaWxlX3RvX2FwcGVuZCwgInIiKSBhcyBpbnB1dF9maWxlOgogICAgICAgZm9yIGxpbmUgaW4gaW5wdXRfZmlsZToKICAgICAgICAgb3V0X2ZpbGUud3JpdGUobGluZSkKKyAgZXhjZXB0IElPRXJyb3I6CisgICAgcHJpbnQoZXJyb3JfbWVzc2FnZSkKKyAgICByZXR1cm4gRmFsc2UKICAgcmV0dXJuIFRydWUKIAorCiBkZWYgQnVpbGRWZXJpZmllZEltYWdlKGRhdGFfaW1hZ2VfcGF0aCwgdmVyaXR5X2ltYWdlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcml0eV9tZXRhZGF0YV9wYXRoLCB2ZXJpdHlfZmVjX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdfc2l6ZSwgZmVjX3N1cHBvcnRlZCk6CkBAIC0yNzQsNiArMzE0LDcgQEAKICAgICByZXR1cm4gRmFsc2UKICAgcmV0dXJuIFRydWUKIAorCiBkZWYgVW5zcGFyc2VJbWFnZShzcGFyc2VfaW1hZ2VfcGF0aCwgcmVwbGFjZT1UcnVlKToKICAgaW1nX2RpciA9IG9zLnBhdGguZGlybmFtZShzcGFyc2VfaW1hZ2VfcGF0aCkKICAgdW5zcGFyc2VfaW1hZ2VfcGF0aCA9ICJ1bnNwYXJzZV8iICsgb3MucGF0aC5iYXNlbmFtZShzcGFyc2VfaW1hZ2VfcGF0aCkKQEAgLTI4NCwxMiArMzI1LDE1IEBACiAgICAgZWxzZToKICAgICAgIHJldHVybiBUcnVlLCB1bnNwYXJzZV9pbWFnZV9wYXRoCiAgIGluZmxhdGVfY29tbWFuZCA9IFsic2ltZzJpbWciLCBzcGFyc2VfaW1hZ2VfcGF0aCwgdW5zcGFyc2VfaW1hZ2VfcGF0aF0KLSAgKF8sIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGluZmxhdGVfY29tbWFuZCkKKyAgKGluZmxhdGVfb3V0cHV0LCBleGl0X2NvZGUpID0gUnVuQ29tbWFuZChpbmZsYXRlX2NvbW1hbmQpCiAgIGlmIGV4aXRfY29kZSAhPSAwOgorICAgIHByaW50KCJFcnJvcjogJyVzJyBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJWQ6XG4lcyIgJSAoCisgICAgICAgIGluZmxhdGVfY29tbWFuZCwgZXhpdF9jb2RlLCBpbmZsYXRlX291dHB1dCkpCiAgICAgb3MucmVtb3ZlKHVuc3BhcnNlX2ltYWdlX3BhdGgpCiAgICAgcmV0dXJuIEZhbHNlLCBOb25lCiAgIHJldHVybiBUcnVlLCB1bnNwYXJzZV9pbWFnZV9wYXRoCiAKKwogZGVmIE1ha2VWZXJpdHlFbmFibGVkSW1hZ2Uob3V0X2ZpbGUsIGZlY19zdXBwb3J0ZWQsIHByb3BfZGljdCk6CiAgICIiIkNyZWF0ZXMgYW4gaW1hZ2UgdGhhdCBpcyB2ZXJpZmlhYmxlIHVzaW5nIGRtLXZlcml0eS4KIApAQCAtMzExLDcgKzM1NSw3IEBACiAgIHNpZ25lcl9hcmdzID0gT1BUSU9OUy52ZXJpdHlfc2lnbmVyX2FyZ3MKIAogICAjIG1ha2UgYSB0ZW1wZGlyCi0gIHRlbXBkaXJfbmFtZSA9IHRlbXBmaWxlLm1rZHRlbXAoc3VmZml4PSJfdmVyaXR5X2ltYWdlcyIpCisgIHRlbXBkaXJfbmFtZSA9IGNvbW1vbi5NYWtlVGVtcERpcihzdWZmaXg9Il92ZXJpdHlfaW1hZ2VzIikKIAogICAjIGdldCBwYXJ0aWFsIGltYWdlIHBhdGhzCiAgIHZlcml0eV9pbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBkaXJfbmFtZSwgInZlcml0eS5pbWciKQpAQCAtMzIwLDE1ICszNjQsMTUgQEAKIAogICAjIGJ1aWxkIHRoZSB2ZXJpdHkgdHJlZSBhbmQgZ2V0IHRoZSByb290IGhhc2ggYW5kIHNhbHQKICAgaWYgbm90IEJ1aWxkVmVyaXR5VHJlZShvdXRfZmlsZSwgdmVyaXR5X2ltYWdlX3BhdGgsIHByb3BfZGljdCk6Ci0gICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyX25hbWUsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKICAgICByZXR1cm4gRmFsc2UKIAogICAjIGJ1aWxkIHRoZSBtZXRhZGF0YSBibG9ja3MKICAgcm9vdF9oYXNoID0gcHJvcF9kaWN0WyJ2ZXJpdHlfcm9vdF9oYXNoIl0KICAgc2FsdCA9IHByb3BfZGljdFsidmVyaXR5X3NhbHQiXQorICB2ZXJpdHlfZGlzYWJsZSA9ICJ2ZXJpdHlfZGlzYWJsZSIgaW4gcHJvcF9kaWN0CiAgIGlmIG5vdCBCdWlsZFZlcml0eU1ldGFkYXRhKGltYWdlX3NpemUsIHZlcml0eV9tZXRhZGF0YV9wYXRoLCByb290X2hhc2gsIHNhbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2Rldiwgc2lnbmVyX3BhdGgsIHNpZ25lcl9rZXksIHNpZ25lcl9hcmdzKToKLSAgICBzaHV0aWwucm10cmVlKHRlbXBkaXJfbmFtZSwgaWdub3JlX2Vycm9ycz1UcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19kZXYsIHNpZ25lcl9wYXRoLCBzaWduZXJfa2V5LCBzaWduZXJfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaXR5X2Rpc2FibGUpOgogICAgIHJldHVybiBGYWxzZQogCiAgICMgYnVpbGQgdGhlIGZ1bGwgdmVyaWZpZWQgaW1hZ2UKQEAgLTM0NCwyMyArMzg4LDU5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaXR5X2ZlY19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNfc3VwcG9ydGVkKToKLSAgICBzaHV0aWwucm10cmVlKHRlbXBkaXJfbmFtZSwgaWdub3JlX2Vycm9ycz1UcnVlKQogICAgIHJldHVybiBGYWxzZQogCi0gIHNodXRpbC5ybXRyZWUodGVtcGRpcl9uYW1lLCBpZ25vcmVfZXJyb3JzPVRydWUpCiAgIHJldHVybiBUcnVlCiAKLWRlZiBDb252ZXJ0QmxvY2tNYXBUb0Jhc2VGcyhibG9ja19tYXBfZmlsZSk6Ci0gIGZkLCBiYXNlX2ZzX2ZpbGUgPSB0ZW1wZmlsZS5ta3N0ZW1wKHByZWZpeD0ic2NyaXB0X2dlbl8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9Ii5iYXNlX2ZzIikKLSAgb3MuY2xvc2UoZmQpCiAKK2RlZiBDb252ZXJ0QmxvY2tNYXBUb0Jhc2VGcyhibG9ja19tYXBfZmlsZSk6CisgIGJhc2VfZnNfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzY3JpcHRfZ2VuXyIsIHN1ZmZpeD0iLmJhc2VfZnMiKQogICBjb252ZXJ0X2NvbW1hbmQgPSBbImJsa19hbGxvY190b19iYXNlX2ZzIiwgYmxvY2tfbWFwX2ZpbGUsIGJhc2VfZnNfZmlsZV0KICAgKF8sIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGNvbnZlcnRfY29tbWFuZCkKLSAgaWYgZXhpdF9jb2RlICE9IDA6Ci0gICAgb3MucmVtb3ZlKGJhc2VfZnNfZmlsZSkKLSAgICByZXR1cm4gTm9uZQotICByZXR1cm4gYmFzZV9mc19maWxlCisgIHJldHVybiBiYXNlX2ZzX2ZpbGUgaWYgZXhpdF9jb2RlID09IDAgZWxzZSBOb25lCisKKworZGVmIENoZWNrSGVhZHJvb20oZXh0NGZzX291dHB1dCwgcHJvcF9kaWN0KToKKyAgIiIiQ2hlY2tzIGlmIHRoZXJlJ3MgZW5vdWdoIGhlYWRyb29tIHNwYWNlIGF2YWlsYWJsZS4KKworICBIZWFkcm9vbSBpcyB0aGUgcmVzZXJ2ZWQgc3BhY2Ugb24gc3lzdGVtIGltYWdlICh2aWEgUFJPRFVDVF9TWVNURU1fSEVBRFJPT00pLAorICB3aGljaCBpcyB1c2VmdWwgZm9yIGRldmljZXMgd2l0aCBsb3cgZGlzayBzcGFjZSB0aGF0IGhhdmUgc3lzdGVtIGltYWdlCisgIHZhcmlhdGlvbiBiZXR3ZWVuIGJ1aWxkcy4gVGhlICdwYXJ0aXRpb25faGVhZHJvb20nIGluIHByb3BfZGljdCBpcyB0aGUgc2l6ZQorICBpbiBieXRlcywgd2hpbGUgdGhlIG51bWJlcnMgaW4gJ2V4dDRmc19vdXRwdXQnIGFyZSBmb3IgNEstYmxvY2tzLgorCisgIEFyZ3M6CisgICAgZXh0NGZzX291dHB1dDogVGhlIG91dHB1dCBzdHJpbmcgZnJvbSBta2UyZnMgY29tbWFuZC4KKyAgICBwcm9wX2RpY3Q6IFRoZSBwcm9wZXJ0eSBkaWN0LgorCisgIFJldHVybnM6CisgICAgVGhlIGNoZWNrIHJlc3VsdC4KKworICBSYWlzZXM6CisgICAgQXNzZXJ0aW9uRXJyb3I6IE9uIGludmFsaWQgaW5wdXQuCisgICIiIgorICBhc3NlcnQgZXh0NGZzX291dHB1dCBpcyBub3QgTm9uZQorICBhc3NlcnQgcHJvcF9kaWN0LmdldCgnZnNfdHlwZScsICcnKS5zdGFydHN3aXRoKCdleHQ0JykKKyAgYXNzZXJ0ICdwYXJ0aXRpb25faGVhZHJvb20nIGluIHByb3BfZGljdAorICBhc3NlcnQgJ21vdW50X3BvaW50JyBpbiBwcm9wX2RpY3QKKworICBleHQ0ZnNfc3RhdHMgPSByZS5jb21waWxlKAorICAgICAgcidDcmVhdGVkIGZpbGVzeXN0ZW0gd2l0aCAuKiAoP1A8dXNlZF9ibG9ja3M+WzAtOV0rKS8nCisgICAgICByJyg/UDx0b3RhbF9ibG9ja3M+WzAtOV0rKSBibG9ja3MnKQorICBsYXN0X2xpbmUgPSBleHQ0ZnNfb3V0cHV0LnN0cmlwKCkuc3BsaXQoJ1xuJylbLTFdCisgIG0gPSBleHQ0ZnNfc3RhdHMubWF0Y2gobGFzdF9saW5lKQorICB1c2VkX2Jsb2NrcyA9IGludChtLmdyb3VwZGljdCgpLmdldCgndXNlZF9ibG9ja3MnKSkKKyAgdG90YWxfYmxvY2tzID0gaW50KG0uZ3JvdXBkaWN0KCkuZ2V0KCd0b3RhbF9ibG9ja3MnKSkKKyAgaGVhZHJvb21fYmxvY2tzID0gaW50KHByb3BfZGljdFsncGFydGl0aW9uX2hlYWRyb29tJ10pIC8gQkxPQ0tfU0laRQorICBhZGp1c3RlZF9ibG9ja3MgPSB0b3RhbF9ibG9ja3MgLSBoZWFkcm9vbV9ibG9ja3MKKyAgaWYgdXNlZF9ibG9ja3MgPiBhZGp1c3RlZF9ibG9ja3M6CisgICAgbW91bnRfcG9pbnQgPSBwcm9wX2RpY3RbIm1vdW50X3BvaW50Il0KKyAgICBwcmludCgiRXJyb3I6IE5vdCBlbm91Z2ggcm9vbSBvbiAlcyAodG90YWw6ICVkIGJsb2NrcywgdXNlZDogJWQgYmxvY2tzLCAiCisgICAgICAgICAgImhlYWRyb29tOiAlZCBibG9ja3MsIGF2YWlsYWJsZTogJWQgYmxvY2tzKSIgJSAoCisgICAgICAgICAgICAgIG1vdW50X3BvaW50LCB0b3RhbF9ibG9ja3MsIHVzZWRfYmxvY2tzLCBoZWFkcm9vbV9ibG9ja3MsCisgICAgICAgICAgICAgIGFkanVzdGVkX2Jsb2NrcykpCisgICAgcmV0dXJuIEZhbHNlCisgIHJldHVybiBUcnVlCisKIAogZGVmIEJ1aWxkSW1hZ2UoaW5fZGlyLCBwcm9wX2RpY3QsIG91dF9maWxlLCB0YXJnZXRfb3V0PU5vbmUpOgogICAiIiJCdWlsZCBhbiBpbWFnZSB0byBvdXRfZmlsZSBmcm9tIGluX2RpciB3aXRoIHByb3BlcnR5IHByb3BfZGljdC4KQEAgLTM2OSw3ICs0NDksOCBAQAogICAgIGluX2RpcjogcGF0aCBvZiBpbnB1dCBkaXJlY3RvcnkuCiAgICAgcHJvcF9kaWN0OiBwcm9wZXJ0eSBkaWN0aW9uYXJ5LgogICAgIG91dF9maWxlOiBwYXRoIG9mIHRoZSBvdXRwdXQgaW1hZ2UgZmlsZS4KLSAgICB0YXJnZXRfb3V0OiBwYXRoIG9mIHRoZSBwcm9kdWN0IG91dCBkaXJlY3RvcnkgdG8gcmVhZCBkZXZpY2Ugc3BlY2lmaWMgRlMgY29uZmlnIGZpbGVzLgorICAgIHRhcmdldF9vdXQ6IHBhdGggb2YgdGhlIHByb2R1Y3Qgb3V0IGRpcmVjdG9yeSB0byByZWFkIGRldmljZSBzcGVjaWZpYyBGUworICAgICAgICBjb25maWcgZmlsZXMuCiAKICAgUmV0dXJuczoKICAgICBUcnVlIGlmZiB0aGUgaW1hZ2UgaXMgYnVpbHQgc3VjY2Vzc2Z1bGx5LgpAQCAtMzc4LDE3ICs0NTksMTUgQEAKICAgIyAvc3lzdGVtIGFuZCB0aGUgcmFtZGlzaywgYW5kIGNhbiBiZSBtb3VudGVkIGF0IHRoZSByb290IG9mIHRoZSBmaWxlIHN5c3RlbS4KICAgb3JpZ2luX2luID0gaW5fZGlyCiAgIGZzX2NvbmZpZyA9IHByb3BfZGljdC5nZXQoImZzX2NvbmZpZyIpCi0gIGJhc2VfZnNfZmlsZSA9IE5vbmUKLSAgaWYgKHByb3BfZGljdC5nZXQoInN5c3RlbV9yb290X2ltYWdlIikgPT0gInRydWUiCi0gICAgICBhbmQgcHJvcF9kaWN0WyJtb3VudF9wb2ludCJdID09ICJzeXN0ZW0iKToKLSAgICBpbl9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKLSAgICAjIENoYW5nZSB0aGUgbW91bnQgcG9pbnQgdG8gIi8iCisgIGlmIChwcm9wX2RpY3QuZ2V0KCJzeXN0ZW1fcm9vdF9pbWFnZSIpID09ICJ0cnVlIiBhbmQKKyAgICAgIHByb3BfZGljdFsibW91bnRfcG9pbnQiXSA9PSAic3lzdGVtIik6CisgICAgaW5fZGlyID0gY29tbW9uLk1ha2VUZW1wRGlyKCkKKyAgICAjIENoYW5nZSB0aGUgbW91bnQgcG9pbnQgdG8gIi8iLgogICAgIHByb3BfZGljdFsibW91bnRfcG9pbnQiXSA9ICIvIgogICAgIGlmIGZzX2NvbmZpZzoKICAgICAgICMgV2UgbmVlZCB0byBtZXJnZSB0aGUgZnNfY29uZmlnIGZpbGVzIG9mIHN5c3RlbSBhbmQgcmFtZGlzay4KLSAgICAgIGZkLCBtZXJnZWRfZnNfY29uZmlnID0gdGVtcGZpbGUubWtzdGVtcChwcmVmaXg9InJvb3RfZnNfY29uZmlnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9Ii50eHQiKQotICAgICAgb3MuY2xvc2UoZmQpCisgICAgICBtZXJnZWRfZnNfY29uZmlnID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InJvb3RfZnNfY29uZmlnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0iLnR4dCIpCiAgICAgICB3aXRoIG9wZW4obWVyZ2VkX2ZzX2NvbmZpZywgInciKSBhcyBmdzoKICAgICAgICAgaWYgInJhbWRpc2tfZnNfY29uZmlnIiBpbiBwcm9wX2RpY3Q6CiAgICAgICAgICAgd2l0aCBvcGVuKHByb3BfZGljdFsicmFtZGlza19mc19jb25maWciXSkgYXMgZnI6CkBAIC0zOTksNyArNDc4LDcgQEAKIAogICBidWlsZF9jb21tYW5kID0gW10KICAgZnNfdHlwZSA9IHByb3BfZGljdC5nZXQoImZzX3R5cGUiLCAiIikKLSAgcnVuX2ZzY2sgPSBGYWxzZQorICBydW5fZTJmc2NrID0gRmFsc2UKIAogICBmc19zcGFuc19wYXJ0aXRpb24gPSBUcnVlCiAgIGlmIGZzX3R5cGUuc3RhcnRzd2l0aCgic3F1YXNoIik6CkBAIC00MTMsOCArNDkyLDggQEAKICAgIyB2ZXJpZmllZC4KICAgaWYgdmVyaXR5X3N1cHBvcnRlZCBhbmQgaXNfdmVyaXR5X3BhcnRpdGlvbjoKICAgICBwYXJ0aXRpb25fc2l6ZSA9IGludChwcm9wX2RpY3QuZ2V0KCJwYXJ0aXRpb25fc2l6ZSIpKQotICAgIChhZGp1c3RlZF9zaXplLCB2ZXJpdHlfc2l6ZSkgPSBBZGp1c3RQYXJ0aXRpb25TaXplRm9yVmVyaXR5KHBhcnRpdGlvbl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcml0eV9mZWNfc3VwcG9ydGVkKQorICAgIChhZGp1c3RlZF9zaXplLCB2ZXJpdHlfc2l6ZSkgPSBBZGp1c3RQYXJ0aXRpb25TaXplRm9yVmVyaXR5KAorICAgICAgICBwYXJ0aXRpb25fc2l6ZSwgdmVyaXR5X2ZlY19zdXBwb3J0ZWQpCiAgICAgaWYgbm90IGFkanVzdGVkX3NpemU6CiAgICAgICByZXR1cm4gRmFsc2UKICAgICBwcm9wX2RpY3RbInBhcnRpdGlvbl9zaXplIl0gPSBzdHIoYWRqdXN0ZWRfc2l6ZSkKQEAgLTQzMyw4ICs1MTIsOCBAQAogICAgIHBhcnRpdGlvbl9zaXplID0gcHJvcF9kaWN0WyJwYXJ0aXRpb25fc2l6ZSJdCiAgICAgIyBhdmJfYWRkX2hhc2hfZm9vdGVyX2FyZ3Mgb3IgYXZiX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncy4KICAgICBhZGRpdGlvbmFsX2FyZ3MgPSBwcm9wX2RpY3RbImF2Yl9hZGRfIiArIGF2Yl9mb290ZXJfdHlwZSArICJfZm9vdGVyX2FyZ3MiXQotICAgIG1heF9pbWFnZV9zaXplID0gQVZCQ2FsY01heEltYWdlU2l6ZShhdmJ0b29sLCBhdmJfZm9vdGVyX3R5cGUsIHBhcnRpdGlvbl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsX2FyZ3MpCisgICAgbWF4X2ltYWdlX3NpemUgPSBBVkJDYWxjTWF4SW1hZ2VTaXplKGF2YnRvb2wsIGF2Yl9mb290ZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUsIGFkZGl0aW9uYWxfYXJncykKICAgICBpZiBtYXhfaW1hZ2Vfc2l6ZSA9PSAwOgogICAgICAgcmV0dXJuIEZhbHNlCiAgICAgcHJvcF9kaWN0WyJwYXJ0aXRpb25fc2l6ZSJdID0gc3RyKG1heF9pbWFnZV9zaXplKQpAQCAtNDQ0LDcgKzUyMyw3IEBACiAgICAgYnVpbGRfY29tbWFuZCA9IFtwcm9wX2RpY3RbImV4dF9ta3VzZXJpbWciXV0KICAgICBpZiAiZXh0ZnNfc3BhcnNlX2ZsYWciIGluIHByb3BfZGljdDoKICAgICAgIGJ1aWxkX2NvbW1hbmQuYXBwZW5kKHByb3BfZGljdFsiZXh0ZnNfc3BhcnNlX2ZsYWciXSkKLSAgICAgIHJ1bl9mc2NrID0gVHJ1ZQorICAgICAgcnVuX2UyZnNjayA9IFRydWUKICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbaW5fZGlyLCBvdXRfZmlsZSwgZnNfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcF9kaWN0WyJtb3VudF9wb2ludCJdXSkKICAgICBidWlsZF9jb21tYW5kLmFwcGVuZChwcm9wX2RpY3RbInBhcnRpdGlvbl9zaXplIl0pCkBAIC00NzYsNiArNTU1LDggQEAKICAgICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItVSIsIHByb3BfZGljdFsidXVpZCJdXSkKICAgICAgIGlmICJoYXNoX3NlZWQiIGluIHByb3BfZGljdDoKICAgICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItUyIsIHByb3BfZGljdFsiaGFzaF9zZWVkIl1dKQorICAgIGlmICJleHQ0X3NoYXJlX2R1cF9ibG9ja3MiIGluIHByb3BfZGljdDoKKyAgICAgIGJ1aWxkX2NvbW1hbmQuYXBwZW5kKCItYyIpCiAgICAgaWYgInNlbGludXhfZmMiIGluIHByb3BfZGljdDoKICAgICAgIGJ1aWxkX2NvbW1hbmQuYXBwZW5kKHByb3BfZGljdFsic2VsaW51eF9mYyJdKQogICBlbGlmIGZzX3R5cGUuc3RhcnRzd2l0aCgic3F1YXNoIik6CkBAIC00OTIsMTcgKzU3MywyOCBAQAogICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItYyIsIHByb3BfZGljdFsic2VsaW51eF9mYyJdXSkKICAgICBpZiAiYmxvY2tfbGlzdCIgaW4gcHJvcF9kaWN0OgogICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItQiIsIHByb3BfZGljdFsiYmxvY2tfbGlzdCJdXSkKKyAgICBpZiAic3F1YXNoZnNfYmxvY2tfc2l6ZSIgaW4gcHJvcF9kaWN0OgorICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItYiIsIHByb3BfZGljdFsic3F1YXNoZnNfYmxvY2tfc2l6ZSJdXSkKICAgICBpZiAic3F1YXNoZnNfY29tcHJlc3NvciIgaW4gcHJvcF9kaWN0OgogICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyIteiIsIHByb3BfZGljdFsic3F1YXNoZnNfY29tcHJlc3NvciJdXSkKICAgICBpZiAic3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiIGluIHByb3BfZGljdDoKICAgICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLXpvIiwgcHJvcF9kaWN0WyJzcXVhc2hmc19jb21wcmVzc29yX29wdCJdXSkKLSAgICBpZiAic3F1YXNoZnNfYmxvY2tfc2l6ZSIgaW4gcHJvcF9kaWN0OgotICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItYiIsIHByb3BfZGljdFsic3F1YXNoZnNfYmxvY2tfc2l6ZSJdXSkKLSAgICBpZiAic3F1YXNoZnNfZGlzYWJsZV80a19hbGlnbiIgaW4gcHJvcF9kaWN0IGFuZCBwcm9wX2RpY3QuZ2V0KCJzcXVhc2hmc19kaXNhYmxlXzRrX2FsaWduIikgPT0gInRydWUiOgorICAgIGlmIHByb3BfZGljdC5nZXQoInNxdWFzaGZzX2Rpc2FibGVfNGtfYWxpZ24iKSA9PSAidHJ1ZSI6CiAgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1hIl0pCiAgIGVsaWYgZnNfdHlwZS5zdGFydHN3aXRoKCJmMmZzIik6CiAgICAgYnVpbGRfY29tbWFuZCA9IFsibWtmMmZzdXNlcmltZy5zaCJdCiAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoW291dF9maWxlLCBwcm9wX2RpY3RbInBhcnRpdGlvbl9zaXplIl1dKQorICAgIGlmIGZzX2NvbmZpZzoKKyAgICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLUMiLCBmc19jb25maWddKQorICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLWYiLCBpbl9kaXJdKQorICAgIGlmIHRhcmdldF9vdXQ6CisgICAgICBidWlsZF9jb21tYW5kLmV4dGVuZChbIi1EIiwgdGFyZ2V0X291dF0pCisgICAgaWYgInNlbGludXhfZmMiIGluIHByb3BfZGljdDoKKyAgICAgIGJ1aWxkX2NvbW1hbmQuZXh0ZW5kKFsiLXMiLCBwcm9wX2RpY3RbInNlbGludXhfZmMiXV0pCisgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItdCIsIHByb3BfZGljdFsibW91bnRfcG9pbnQiXV0pCisgICAgaWYgInRpbWVzdGFtcCIgaW4gcHJvcF9kaWN0OgorICAgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItVCIsIHN0cihwcm9wX2RpY3RbInRpbWVzdGFtcCJdKV0pCisgICAgYnVpbGRfY29tbWFuZC5leHRlbmQoWyItTCIsIHByb3BfZGljdFsibW91bnRfcG9pbnQiXV0pCiAgIGVsc2U6CiAgICAgcHJpbnQoIkVycm9yOiB1bmtub3duIGZpbGVzeXN0ZW0gdHlwZSAnJXMnIiAlIChmc190eXBlKSkKICAgICByZXR1cm4gRmFsc2UKQEAgLTUxNyw1NiArNjA5LDE1IEBACiAgICAgc2h1dGlsLnJtdHJlZShzdGFnaW5nX3N5c3RlbSwgaWdub3JlX2Vycm9ycz1UcnVlKQogICAgIHNodXRpbC5jb3B5dHJlZShvcmlnaW5faW4sIHN0YWdpbmdfc3lzdGVtLCBzeW1saW5rcz1UcnVlKQogCi0gIGhhc19yZXNlcnZlZF9ibG9ja3MgPSBwcm9wX2RpY3QuZ2V0KCJoYXNfZXh0NF9yZXNlcnZlZF9ibG9ja3MiKSA9PSAidHJ1ZSIKLSAgZXh0NGZzX291dHB1dCA9IE5vbmUKLQotICB0cnk6Ci0gICAgaWYgZnNfdHlwZS5zdGFydHN3aXRoKCJleHQ0Iik6Ci0gICAgICAoZXh0NGZzX291dHB1dCwgZXhpdF9jb2RlKSA9IFJ1bkNvbW1hbmQoYnVpbGRfY29tbWFuZCkKLSAgICBlbHNlOgotICAgICAgKF8sIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGJ1aWxkX2NvbW1hbmQpCi0gIGZpbmFsbHk6Ci0gICAgaWYgaW5fZGlyICE9IG9yaWdpbl9pbjoKLSAgICAgICMgQ2xlYW4gdXAgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KLSAgICAgIHNodXRpbC5ybXRyZWUoaW5fZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCi0gICAgICBpZiBmc19jb25maWc6Ci0gICAgICAgIG9zLnJlbW92ZShmc19jb25maWcpCi0gICAgaWYgYmFzZV9mc19maWxlIGlzIG5vdCBOb25lOgotICAgICAgb3MucmVtb3ZlKGJhc2VfZnNfZmlsZSkKKyAgKG1rZnNfb3V0cHV0LCBleGl0X2NvZGUpID0gUnVuQ29tbWFuZChidWlsZF9jb21tYW5kKQogICBpZiBleGl0X2NvZGUgIT0gMDoKKyAgICBwcmludCgiRXJyb3I6ICclcycgZmFpbGVkIHdpdGggZXhpdCBjb2RlICVkOlxuJXMiICUgKAorICAgICAgICBidWlsZF9jb21tYW5kLCBleGl0X2NvZGUsIG1rZnNfb3V0cHV0KSkKICAgICByZXR1cm4gRmFsc2UKIAotICAjIEJ1ZzogMjE1MjI3MTksIDIyMDIzNDY1Ci0gICMgVGhlcmUgYXJlIHNvbWUgcmVzZXJ2ZWQgYmxvY2tzIG9uIGV4dDQgRlMgKGxlc3NlciBvZiA0MDk2IGJsb2NrcyBhbmQgMiUpLgotICAjIFdlIG5lZWQgdG8gZGVkdWN0IHRob3NlIGJsb2NrcyBmcm9tIHRoZSBhdmFpbGFibGUgc3BhY2UsIHNpbmNlIHRoZXkgYXJlCi0gICMgbm90IHdyaXRhYmxlIGV2ZW4gd2l0aCByb290IHByaXZpbGVnZS4gSXQgb25seSBhZmZlY3RzIGRldmljZXMgdXNpbmcKLSAgIyBmaWxlLWJhc2VkIE9UQSBhbmQgYSBrZXJuZWwgdmVyc2lvbiBvZiAzLjEwIG9yIGdyZWF0ZXIgKGN1cnJlbnRseSBqdXN0Ci0gICMgc3Byb3V0KS4KLSAgIyBTZXBhcmF0ZWx5LCBjaGVjayBpZiB0aGVyZSdzIGVub3VnaCBoZWFkcm9vbSBzcGFjZSBhdmFpbGFibGUuIFRoaXMgaXMgdXNlZnVsIGZvcgotICAjIGRldmljZXMgd2l0aCBsb3cgZGlzayBzcGFjZSB0aGF0IGhhdmUgc3lzdGVtIGltYWdlIHZhcmlhdGlvbiBiZXR3ZWVuIGJ1aWxkcy4KLSAgaWYgKGhhc19yZXNlcnZlZF9ibG9ja3Mgb3IgInBhcnRpdGlvbl9oZWFkcm9vbSIgaW4gcHJvcF9kaWN0KSBhbmQgZnNfdHlwZS5zdGFydHN3aXRoKCJleHQ0Iik6Ci0gICAgYXNzZXJ0IGV4dDRmc19vdXRwdXQgaXMgbm90IE5vbmUKLSAgICBleHQ0ZnNfc3RhdHMgPSByZS5jb21waWxlKAotICAgICAgICByJ0NyZWF0ZWQgZmlsZXN5c3RlbSB3aXRoIC4qICg/UDx1c2VkX2Jsb2Nrcz5bMC05XSspLycKLSAgICAgICAgcicoP1A8dG90YWxfYmxvY2tzPlswLTldKykgYmxvY2tzJykKLSAgICBtID0gZXh0NGZzX3N0YXRzLm1hdGNoKGV4dDRmc19vdXRwdXQuc3RyaXAoKS5zcGxpdCgnXG4nKVstMV0pCi0gICAgdXNlZF9ibG9ja3MgPSBpbnQobS5ncm91cGRpY3QoKS5nZXQoJ3VzZWRfYmxvY2tzJykpCi0gICAgdG90YWxfYmxvY2tzID0gaW50KG0uZ3JvdXBkaWN0KCkuZ2V0KCd0b3RhbF9ibG9ja3MnKSkKLSAgICByZXNlcnZlZF9ibG9ja3MgPSAwCi0gICAgaGVhZHJvb21fYmxvY2tzID0gMAotICAgIGFkanVzdGVkX2Jsb2NrcyA9IHRvdGFsX2Jsb2NrcwotICAgIGlmIGhhc19yZXNlcnZlZF9ibG9ja3M6Ci0gICAgICByZXNlcnZlZF9ibG9ja3MgPSBtaW4oNDA5NiwgaW50KHRvdGFsX2Jsb2NrcyAqIDAuMDIpKQotICAgICAgYWRqdXN0ZWRfYmxvY2tzIC09IHJlc2VydmVkX2Jsb2NrcwotICAgIGlmICJwYXJ0aXRpb25faGVhZHJvb20iIGluIHByb3BfZGljdDoKLSAgICAgIGhlYWRyb29tX2Jsb2NrcyA9IGludChwcm9wX2RpY3QuZ2V0KCdwYXJ0aXRpb25faGVhZHJvb20nKSkgLyBCTE9DS19TSVpFCi0gICAgICBhZGp1c3RlZF9ibG9ja3MgLT0gaGVhZHJvb21fYmxvY2tzCi0gICAgaWYgdXNlZF9ibG9ja3MgPiBhZGp1c3RlZF9ibG9ja3M6Ci0gICAgICBtb3VudF9wb2ludCA9IHByb3BfZGljdC5nZXQoIm1vdW50X3BvaW50IikKLSAgICAgIHByaW50KCJFcnJvcjogTm90IGVub3VnaCByb29tIG9uICVzICh0b3RhbDogJWQgYmxvY2tzLCB1c2VkOiAlZCBibG9ja3MsICIKLSAgICAgICAgICAgICJyZXNlcnZlZDogJWQgYmxvY2tzLCBoZWFkcm9vbTogJWQgYmxvY2tzLCBhdmFpbGFibGU6ICVkIGJsb2NrcykiICUgKAotICAgICAgICAgICAgICAgIG1vdW50X3BvaW50LCB0b3RhbF9ibG9ja3MsIHVzZWRfYmxvY2tzLCByZXNlcnZlZF9ibG9ja3MsCi0gICAgICAgICAgICAgICAgaGVhZHJvb21fYmxvY2tzLCBhZGp1c3RlZF9ibG9ja3MpKQorICAjIENoZWNrIGlmIHRoZXJlJ3MgZW5vdWdoIGhlYWRyb29tIHNwYWNlIGF2YWlsYWJsZSBmb3IgZXh0NCBpbWFnZS4KKyAgaWYgInBhcnRpdGlvbl9oZWFkcm9vbSIgaW4gcHJvcF9kaWN0IGFuZCBmc190eXBlLnN0YXJ0c3dpdGgoImV4dDQiKToKKyAgICBpZiBub3QgQ2hlY2tIZWFkcm9vbShta2ZzX291dHB1dCwgcHJvcF9kaWN0KToKICAgICAgIHJldHVybiBGYWxzZQogCiAgIGlmIG5vdCBmc19zcGFuc19wYXJ0aXRpb246CkBAIC01ODAsNyArNjMxLDcgQEAKICAgICBpZiB2ZXJpdHlfc3VwcG9ydGVkIGFuZCBpc192ZXJpdHlfcGFydGl0aW9uOgogICAgICAgWmVyb1BhZFNpbWcob3V0X2ZpbGUsIHBhcnRpdGlvbl9zaXplIC0gaW1hZ2Vfc2l6ZSkKIAotICAjIGNyZWF0ZSB0aGUgdmVyaWZpZWQgaW1hZ2UgaWYgdGhpcyBpcyB0byBiZSB2ZXJpZmllZAorICAjIENyZWF0ZSB0aGUgdmVyaWZpZWQgaW1hZ2UgaWYgdGhpcyBpcyB0byBiZSB2ZXJpZmllZC4KICAgaWYgdmVyaXR5X3N1cHBvcnRlZCBhbmQgaXNfdmVyaXR5X3BhcnRpdGlvbjoKICAgICBpZiBub3QgTWFrZVZlcml0eUVuYWJsZWRJbWFnZShvdXRfZmlsZSwgdmVyaXR5X2ZlY19zdXBwb3J0ZWQsIHByb3BfZGljdCk6CiAgICAgICByZXR1cm4gRmFsc2UKQEAgLTU5NiwyMiArNjQ3LDI4IEBACiAgICAgc2FsdCA9IHByb3BfZGljdC5nZXQoImF2Yl9zYWx0IikKICAgICAjIGF2Yl9hZGRfaGFzaF9mb290ZXJfYXJncyBvciBhdmJfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzCiAgICAgYWRkaXRpb25hbF9hcmdzID0gcHJvcF9kaWN0WyJhdmJfYWRkXyIgKyBhdmJfZm9vdGVyX3R5cGUgKyAiX2Zvb3Rlcl9hcmdzIl0KLSAgICBpZiBub3QgQVZCQWRkRm9vdGVyKG91dF9maWxlLCBhdmJ0b29sLCBhdmJfZm9vdGVyX3R5cGUsIG9yaWdpbmFsX3BhcnRpdGlvbl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX25hbWUsIGtleV9wYXRoLCBhbGdvcml0aG0sIHNhbHQsIGFkZGl0aW9uYWxfYXJncyk6CisgICAgaWYgbm90IEFWQkFkZEZvb3RlcihvdXRfZmlsZSwgYXZidG9vbCwgYXZiX2Zvb3Rlcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfcGFydGl0aW9uX3NpemUsIHBhcnRpdGlvbl9uYW1lLCBrZXlfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc2FsdCwgYWRkaXRpb25hbF9hcmdzKToKICAgICAgIHJldHVybiBGYWxzZQogCi0gIGlmIHJ1bl9mc2NrIGFuZCBwcm9wX2RpY3QuZ2V0KCJza2lwX2ZzY2siKSAhPSAidHJ1ZSI6CisgIGlmIHJ1bl9lMmZzY2sgYW5kIHByb3BfZGljdC5nZXQoInNraXBfZnNjayIpICE9ICJ0cnVlIjoKICAgICBzdWNjZXNzLCB1bnNwYXJzZV9pbWFnZSA9IFVuc3BhcnNlSW1hZ2Uob3V0X2ZpbGUsIHJlcGxhY2U9RmFsc2UpCiAgICAgaWYgbm90IHN1Y2Nlc3M6CiAgICAgICByZXR1cm4gRmFsc2UKIAogICAgICMgUnVuIGUyZnNjayBvbiB0aGUgaW5mbGF0ZWQgaW1hZ2UgZmlsZQogICAgIGUyZnNja19jb21tYW5kID0gWyJlMmZzY2siLCAiLWYiLCAiLW4iLCB1bnNwYXJzZV9pbWFnZV0KLSAgICAoXywgZXhpdF9jb2RlKSA9IFJ1bkNvbW1hbmQoZTJmc2NrX2NvbW1hbmQpCisgICAgKGUyZnNja19vdXRwdXQsIGV4aXRfY29kZSkgPSBSdW5Db21tYW5kKGUyZnNja19jb21tYW5kKQogCiAgICAgb3MucmVtb3ZlKHVuc3BhcnNlX2ltYWdlKQogCi0gIHJldHVybiBleGl0X2NvZGUgPT0gMAorICAgIGlmIGV4aXRfY29kZSAhPSAwOgorICAgICAgcHJpbnQoIkVycm9yOiAnJXMnIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAlZDpcbiVzIiAlICgKKyAgICAgICAgICBlMmZzY2tfY29tbWFuZCwgZXhpdF9jb2RlLCBlMmZzY2tfb3V0cHV0KSkKKyAgICAgIHJldHVybiBGYWxzZQorCisgIHJldHVybiBUcnVlCiAKIAogZGVmIEltYWdlUHJvcEZyb21HbG9iYWxEaWN0KGdsb2JfZGljdCwgbW91bnRfcG9pbnQpOgpAQCAtNjQyLDYgKzY5OSw3IEBACiAgICAgICAidmVyaXR5X2tleSIsCiAgICAgICAidmVyaXR5X3NpZ25lcl9jbWQiLAogICAgICAgInZlcml0eV9mZWMiLAorICAgICAgInZlcml0eV9kaXNhYmxlIiwKICAgICAgICJhdmJfZW5hYmxlIiwKICAgICAgICJhdmJfYXZidG9vbCIsCiAgICAgICAiYXZiX3NhbHQiLApAQCAtNjY3LDcgKzcyNSw3IEBACiAgICAgY29weV9wcm9wKCJzeXN0ZW1fcm9vdF9pbWFnZSIsICJzeXN0ZW1fcm9vdF9pbWFnZSIpCiAgICAgY29weV9wcm9wKCJyYW1kaXNrX2RpciIsICJyYW1kaXNrX2RpciIpCiAgICAgY29weV9wcm9wKCJyYW1kaXNrX2ZzX2NvbmZpZyIsICJyYW1kaXNrX2ZzX2NvbmZpZyIpCi0gICAgY29weV9wcm9wKCJoYXNfZXh0NF9yZXNlcnZlZF9ibG9ja3MiLCAiaGFzX2V4dDRfcmVzZXJ2ZWRfYmxvY2tzIikKKyAgICBjb3B5X3Byb3AoImV4dDRfc2hhcmVfZHVwX2Jsb2NrcyIsICJleHQ0X3NoYXJlX2R1cF9ibG9ja3MiKQogICAgIGNvcHlfcHJvcCgic3lzdGVtX3NxdWFzaGZzX2NvbXByZXNzb3IiLCAic3F1YXNoZnNfY29tcHJlc3NvciIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fc3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiLCAic3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiKQogICAgIGNvcHlfcHJvcCgic3lzdGVtX3NxdWFzaGZzX2Jsb2NrX3NpemUiLCAic3F1YXNoZnNfYmxvY2tfc2l6ZSIpCkBAIC02NzUsNyArNzMzLDggQEAKICAgICBjb3B5X3Byb3AoInN5c3RlbV9iYXNlX2ZzX2ZpbGUiLCAiYmFzZV9mc19maWxlIikKICAgICBjb3B5X3Byb3AoInN5c3RlbV9leHRmc19pbm9kZV9jb3VudCIsICJleHRmc19pbm9kZV9jb3VudCIpCiAgIGVsaWYgbW91bnRfcG9pbnQgPT0gInN5c3RlbV9vdGhlciI6Ci0gICAgIyBXZSBpbmhlcml0IHRoZSBzZWxpbnV4IHBvbGljaWVzIG9mIC9zeXN0ZW0gc2luY2Ugd2UgY29udGFpbiBzb21lIG9mIGl0cyBmaWxlcy4KKyAgICAjIFdlIGluaGVyaXQgdGhlIHNlbGludXggcG9saWNpZXMgb2YgL3N5c3RlbSBzaW5jZSB3ZSBjb250YWluIHNvbWUgb2YgaXRzCisgICAgIyBmaWxlcy4KICAgICBkWyJtb3VudF9wb2ludCJdID0gInN5c3RlbSIKICAgICBjb3B5X3Byb3AoImF2Yl9zeXN0ZW1faGFzaHRyZWVfZW5hYmxlIiwgImF2Yl9oYXNodHJlZV9lbmFibGUiKQogICAgIGNvcHlfcHJvcCgiYXZiX3N5c3RlbV9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3MiLApAQCAtNjg3LDcgKzc0Niw2IEBACiAgICAgY29weV9wcm9wKCJzeXN0ZW1fc2l6ZSIsICJwYXJ0aXRpb25fc2l6ZSIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fam91cm5hbF9zaXplIiwgImpvdXJuYWxfc2l6ZSIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fdmVyaXR5X2Jsb2NrX2RldmljZSIsICJ2ZXJpdHlfYmxvY2tfZGV2aWNlIikKLSAgICBjb3B5X3Byb3AoImhhc19leHQ0X3Jlc2VydmVkX2Jsb2NrcyIsICJoYXNfZXh0NF9yZXNlcnZlZF9ibG9ja3MiKQogICAgIGNvcHlfcHJvcCgic3lzdGVtX3NxdWFzaGZzX2NvbXByZXNzb3IiLCAic3F1YXNoZnNfY29tcHJlc3NvciIpCiAgICAgY29weV9wcm9wKCJzeXN0ZW1fc3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiLCAic3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiKQogICAgIGNvcHlfcHJvcCgic3lzdGVtX3NxdWFzaGZzX2Jsb2NrX3NpemUiLCAic3F1YXNoZnNfYmxvY2tfc2l6ZSIpCkBAIC02OTgsNyArNzU2LDcgQEAKICAgICBjb3B5X3Byb3AoImZzX3R5cGUiLCAiZnNfdHlwZSIpCiAgICAgY29weV9wcm9wKCJ1c2VyZGF0YV9mc190eXBlIiwgImZzX3R5cGUiKQogICAgIGNvcHlfcHJvcCgidXNlcmRhdGFfc2l6ZSIsICJwYXJ0aXRpb25fc2l6ZSIpCi0gICAgY29weV9wcm9wKCJmbGFzaF9sb2dpY2FsX2Jsb2NrX3NpemUiLCJmbGFzaF9sb2dpY2FsX2Jsb2NrX3NpemUiKQorICAgIGNvcHlfcHJvcCgiZmxhc2hfbG9naWNhbF9ibG9ja19zaXplIiwgImZsYXNoX2xvZ2ljYWxfYmxvY2tfc2l6ZSIpCiAgICAgY29weV9wcm9wKCJmbGFzaF9lcmFzZV9ibG9ja19zaXplIiwgImZsYXNoX2VyYXNlX2Jsb2NrX3NpemUiKQogICBlbGlmIG1vdW50X3BvaW50ID09ICJjYWNoZSI6CiAgICAgY29weV9wcm9wKCJjYWNoZV9mc190eXBlIiwgImZzX3R5cGUiKQpAQCAtNzEzLDE4ICs3NzEsMzMgQEAKICAgICBjb3B5X3Byb3AoInZlbmRvcl9zaXplIiwgInBhcnRpdGlvbl9zaXplIikKICAgICBjb3B5X3Byb3AoInZlbmRvcl9qb3VybmFsX3NpemUiLCAiam91cm5hbF9zaXplIikKICAgICBjb3B5X3Byb3AoInZlbmRvcl92ZXJpdHlfYmxvY2tfZGV2aWNlIiwgInZlcml0eV9ibG9ja19kZXZpY2UiKQotICAgIGNvcHlfcHJvcCgiaGFzX2V4dDRfcmVzZXJ2ZWRfYmxvY2tzIiwgImhhc19leHQ0X3Jlc2VydmVkX2Jsb2NrcyIpCisgICAgY29weV9wcm9wKCJleHQ0X3NoYXJlX2R1cF9ibG9ja3MiLCAiZXh0NF9zaGFyZV9kdXBfYmxvY2tzIikKICAgICBjb3B5X3Byb3AoInZlbmRvcl9zcXVhc2hmc19jb21wcmVzc29yIiwgInNxdWFzaGZzX2NvbXByZXNzb3IiKQogICAgIGNvcHlfcHJvcCgidmVuZG9yX3NxdWFzaGZzX2NvbXByZXNzb3Jfb3B0IiwgInNxdWFzaGZzX2NvbXByZXNzb3Jfb3B0IikKICAgICBjb3B5X3Byb3AoInZlbmRvcl9zcXVhc2hmc19ibG9ja19zaXplIiwgInNxdWFzaGZzX2Jsb2NrX3NpemUiKQogICAgIGNvcHlfcHJvcCgidmVuZG9yX3NxdWFzaGZzX2Rpc2FibGVfNGtfYWxpZ24iLCAic3F1YXNoZnNfZGlzYWJsZV80a19hbGlnbiIpCiAgICAgY29weV9wcm9wKCJ2ZW5kb3JfYmFzZV9mc19maWxlIiwgImJhc2VfZnNfZmlsZSIpCiAgICAgY29weV9wcm9wKCJ2ZW5kb3JfZXh0ZnNfaW5vZGVfY291bnQiLCAiZXh0ZnNfaW5vZGVfY291bnQiKQorICBlbGlmIG1vdW50X3BvaW50ID09ICJwcm9kdWN0IjoKKyAgICBjb3B5X3Byb3AoImF2Yl9wcm9kdWN0X2hhc2h0cmVlX2VuYWJsZSIsICJhdmJfaGFzaHRyZWVfZW5hYmxlIikKKyAgICBjb3B5X3Byb3AoImF2Yl9wcm9kdWN0X2FkZF9oYXNodHJlZV9mb290ZXJfYXJncyIsCisgICAgICAgICAgICAgICJhdmJfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzIikKKyAgICBjb3B5X3Byb3AoImF2Yl9wcm9kdWN0X2tleV9wYXRoIiwgImF2Yl9rZXlfcGF0aCIpCisgICAgY29weV9wcm9wKCJhdmJfcHJvZHVjdF9hbGdvcml0aG0iLCAiYXZiX2FsZ29yaXRobSIpCisgICAgY29weV9wcm9wKCJwcm9kdWN0X2ZzX3R5cGUiLCAiZnNfdHlwZSIpCisgICAgY29weV9wcm9wKCJwcm9kdWN0X3NpemUiLCAicGFydGl0aW9uX3NpemUiKQorICAgIGNvcHlfcHJvcCgicHJvZHVjdF9qb3VybmFsX3NpemUiLCAiam91cm5hbF9zaXplIikKKyAgICBjb3B5X3Byb3AoInByb2R1Y3RfdmVyaXR5X2Jsb2NrX2RldmljZSIsICJ2ZXJpdHlfYmxvY2tfZGV2aWNlIikKKyAgICBjb3B5X3Byb3AoInByb2R1Y3Rfc3F1YXNoZnNfY29tcHJlc3NvciIsICJzcXVhc2hmc19jb21wcmVzc29yIikKKyAgICBjb3B5X3Byb3AoInByb2R1Y3Rfc3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiLCAic3F1YXNoZnNfY29tcHJlc3Nvcl9vcHQiKQorICAgIGNvcHlfcHJvcCgicHJvZHVjdF9zcXVhc2hmc19ibG9ja19zaXplIiwgInNxdWFzaGZzX2Jsb2NrX3NpemUiKQorICAgIGNvcHlfcHJvcCgicHJvZHVjdF9zcXVhc2hmc19kaXNhYmxlXzRrX2FsaWduIiwgInNxdWFzaGZzX2Rpc2FibGVfNGtfYWxpZ24iKQorICAgIGNvcHlfcHJvcCgicHJvZHVjdF9iYXNlX2ZzX2ZpbGUiLCAiYmFzZV9mc19maWxlIikKKyAgICBjb3B5X3Byb3AoInByb2R1Y3RfZXh0ZnNfaW5vZGVfY291bnQiLCAiZXh0ZnNfaW5vZGVfY291bnQiKQogICBlbGlmIG1vdW50X3BvaW50ID09ICJvZW0iOgogICAgIGNvcHlfcHJvcCgiZnNfdHlwZSIsICJmc190eXBlIikKICAgICBjb3B5X3Byb3AoIm9lbV9zaXplIiwgInBhcnRpdGlvbl9zaXplIikKICAgICBjb3B5X3Byb3AoIm9lbV9qb3VybmFsX3NpemUiLCAiam91cm5hbF9zaXplIikKLSAgICBjb3B5X3Byb3AoImhhc19leHQ0X3Jlc2VydmVkX2Jsb2NrcyIsICJoYXNfZXh0NF9yZXNlcnZlZF9ibG9ja3MiKQogICAgIGNvcHlfcHJvcCgib2VtX2V4dGZzX2lub2RlX2NvdW50IiwgImV4dGZzX2lub2RlX2NvdW50IikKICAgZFsicGFydGl0aW9uX25hbWUiXSA9IG1vdW50X3BvaW50CiAgIHJldHVybiBkCkBAIC03NDYsNyArODE5LDcgQEAKIAogZGVmIG1haW4oYXJndik6CiAgIGlmIGxlbihhcmd2KSAhPSA0OgotICAgIHByaW50IF9fZG9jX18KKyAgICBwcmludChfX2RvY19fKQogICAgIHN5cy5leGl0KDEpCiAKICAgaW5fZGlyID0gYXJndlswXQpAQCAtNzc0LDE3ICs4NDcsMjIgQEAKICAgICAgIG1vdW50X3BvaW50ID0gInZlbmRvciIKICAgICBlbGlmIGltYWdlX2ZpbGVuYW1lID09ICJvZW0uaW1nIjoKICAgICAgIG1vdW50X3BvaW50ID0gIm9lbSIKKyAgICBlbGlmIGltYWdlX2ZpbGVuYW1lID09ICJwcm9kdWN0LmltZyI6CisgICAgICBtb3VudF9wb2ludCA9ICJwcm9kdWN0IgogICAgIGVsc2U6Ci0gICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiZXJyb3I6IHVua25vd24gaW1hZ2UgZmlsZSBuYW1lICIsIGltYWdlX2ZpbGVuYW1lCi0gICAgICBleGl0KDEpCisgICAgICBwcmludCgiZXJyb3I6IHVua25vd24gaW1hZ2UgZmlsZSBuYW1lICIsIGltYWdlX2ZpbGVuYW1lLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICBzeXMuZXhpdCgxKQogCiAgICAgaW1hZ2VfcHJvcGVydGllcyA9IEltYWdlUHJvcEZyb21HbG9iYWxEaWN0KGdsb2JfZGljdCwgbW91bnRfcG9pbnQpCiAKICAgaWYgbm90IEJ1aWxkSW1hZ2UoaW5fZGlyLCBpbWFnZV9wcm9wZXJ0aWVzLCBvdXRfZmlsZSwgdGFyZ2V0X291dCk6Ci0gICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgImVycm9yOiBmYWlsZWQgdG8gYnVpbGQgJXMgZnJvbSAlcyIgJSAob3V0X2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZGlyKQotICAgIGV4aXQoMSkKKyAgICBwcmludCgiZXJyb3I6IGZhaWxlZCB0byBidWlsZCAlcyBmcm9tICVzIiAlIChvdXRfZmlsZSwgaW5fZGlyKSwKKyAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCisgICAgc3lzLmV4aXQoMSkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBtYWluKHN5cy5hcmd2WzE6XSkKKyAgdHJ5OgorICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQorICBmaW5hbGx5OgorICAgIGNvbW1vbi5DbGVhbnVwKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja19vdGFfcGFja2FnZV9zaWduYXR1cmUucHkgYi90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfb3RhX3BhY2thZ2Vfc2lnbmF0dXJlLnB5CmluZGV4IDU0OGI2MTkuLjNjYWM5MGEgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja19vdGFfcGFja2FnZV9zaWduYXR1cmUucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX290YV9wYWNrYWdlX3NpZ25hdHVyZS5weQpAQCAtMjEsMTYgKzIxLDE5IEBACiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCiAKIGltcG9ydCBhcmdwYXJzZQotaW1wb3J0IGNvbW1vbgogaW1wb3J0IHJlCiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgemlwZmlsZQogCiBmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEKIGZyb20gaGFzaGxpYiBpbXBvcnQgc2hhMjU2CiAKK2ltcG9ydCBjb21tb24KIAotZGVmIGNlcnRfdXNlc19zaGEyNTYoY2VydCk6CisKK2RlZiBDZXJ0VXNlc1NoYTI1NihjZXJ0KToKICAgIiIiQ2hlY2sgaWYgdGhlIGNlcnQgdXNlcyBTSEEtMjU2IGhhc2hpbmcgYWxnb3JpdGhtLiIiIgogCiAgIGNtZCA9IFsnb3BlbnNzbCcsICd4NTA5JywgJy10ZXh0JywgJy1ub291dCcsICctaW4nLCBjZXJ0XQpAQCAtNDYsNyArNDksNyBAQAogICByZXR1cm4gYWxnb3JpdGhtLmdyb3VwKDEpLnN0YXJ0c3dpdGgoJ3NoYTI1NicpCiAKIAotZGVmIHZlcmlmeV9wYWNrYWdlKGNlcnQsIHBhY2thZ2UpOgorZGVmIFZlcmlmeVBhY2thZ2UoY2VydCwgcGFja2FnZSk6CiAgICIiIlZlcmlmeSB0aGUgZ2l2ZW4gcGFja2FnZSB3aXRoIHRoZSBjZXJ0aWZpY2F0ZS4KIAogICAoQ29tbWVudHMgZnJvbSBib290YWJsZS9yZWNvdmVyeS92ZXJpZmllci5jcHA6KQpAQCAtOTAsMTcgKzkzLDE0IEBACiAgIHByaW50KCdTaWduZWQgZGF0YSBsZW5ndGg6ICVkJyAlIChzaWduZWRfbGVuLCkpCiAgIHByaW50KCdTaWduYXR1cmUgc3RhcnQ6ICVkJyAlIChzaWduYXR1cmVfc3RhcnQsKSkKIAotICB1c2Vfc2hhMjU2ID0gY2VydF91c2VzX3NoYTI1NihjZXJ0KQorICB1c2Vfc2hhMjU2ID0gQ2VydFVzZXNTaGEyNTYoY2VydCkKICAgcHJpbnQoJ1VzZSBTSEEtMjU2OiAlcycgJSAodXNlX3NoYTI1NiwpKQogCi0gIGlmIHVzZV9zaGEyNTY6Ci0gICAgaCA9IHNoYTI1NigpCi0gIGVsc2U6Ci0gICAgaCA9IHNoYTEoKQorICBoID0gc2hhMjU2KCkgaWYgdXNlX3NoYTI1NiBlbHNlIHNoYTEoKQogICBoLnVwZGF0ZShwYWNrYWdlX2J5dGVzWzpzaWduZWRfbGVuXSkKICAgcGFja2FnZV9kaWdlc3QgPSBoLmhleGRpZ2VzdCgpLmxvd2VyKCkKIAotICBwcmludCgnRGlnZXN0OiAlc1xuJyAlIChwYWNrYWdlX2RpZ2VzdCwpKQorICBwcmludCgnRGlnZXN0OiAlcycgJSAocGFja2FnZV9kaWdlc3QsKSkKIAogICAjIEdldCB0aGUgc2lnbmF0dXJlIGZyb20gdGhlIGlucHV0IHBhY2thZ2UuCiAgIHNpZ25hdHVyZSA9IHBhY2thZ2VfYnl0ZXNbc2lnbmF0dXJlX3N0YXJ0Oi02XQpAQCAtMTQxLDcgKzE0MSwzOSBAQAogICBhc3NlcnQgcGFja2FnZV9kaWdlc3QgPT0gZGlnZXN0X3N0cmluZywgIlZlcmlmaWNhdGlvbiBmYWlsZWQuIgogCiAgICMgVmVyaWZpZWQgc3VjY2Vzc2Z1bGx5IHVwb24gcmVhY2hpbmcgaGVyZS4KLSAgcHJpbnQoJ1ZFUklGSUVEXG4nKQorICBwcmludCgnXG5XaG9sZSBwYWNrYWdlIHNpZ25hdHVyZSBWRVJJRklFRFxuJykKKworCitkZWYgVmVyaWZ5QWJPdGFQYXlsb2FkKGNlcnQsIHBhY2thZ2UpOgorICAiIiJWZXJpZmllcyB0aGUgcGF5bG9hZCBhbmQgbWV0YWRhdGEgc2lnbmF0dXJlcyBpbiBhbiBBL0IgT1RBIHBheWxvYWQuIiIiCisgIHBhY2thZ2VfemlwID0gemlwZmlsZS5aaXBGaWxlKHBhY2thZ2UsICdyJykKKyAgaWYgJ3BheWxvYWQuYmluJyBub3QgaW4gcGFja2FnZV96aXAubmFtZWxpc3QoKToKKyAgICBjb21tb24uWmlwQ2xvc2UocGFja2FnZV96aXApCisgICAgcmV0dXJuCisKKyAgcHJpbnQoJ1ZlcmlmeWluZyBBL0IgT1RBIHBheWxvYWQgc2lnbmF0dXJlcy4uLicpCisKKyAgIyBEdW1wIHB1YmtleSBmcm9tIHRoZSBjZXJ0aWZpY2F0ZS4KKyAgcHVia2V5ID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9ImtleS0iLCBzdWZmaXg9Ii5wZW0iKQorICB3aXRoIG9wZW4ocHVia2V5LCAnd2InKSBhcyBwdWJrZXlfZnA6CisgICAgcHVia2V5X2ZwLndyaXRlKGNvbW1vbi5FeHRyYWN0UHVibGljS2V5KGNlcnQpKQorCisgIHBhY2thZ2VfZGlyID0gY29tbW9uLk1ha2VUZW1wRGlyKHByZWZpeD0ncGFja2FnZS0nKQorCisgICMgU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiB3aXRoIGRlbHRhX2dlbmVyYXRvci4KKyAgcGF5bG9hZF9maWxlID0gcGFja2FnZV96aXAuZXh0cmFjdCgncGF5bG9hZC5iaW4nLCBwYWNrYWdlX2RpcikKKyAgY21kID0gWydkZWx0YV9nZW5lcmF0b3InLAorICAgICAgICAgJy0taW5fZmlsZT0nICsgcGF5bG9hZF9maWxlLAorICAgICAgICAgJy0tcHVibGljX2tleT0nICsgcHVia2V5XQorICBwcm9jID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgc3Rkb3V0ZGF0YSwgXyA9IHByb2MuY29tbXVuaWNhdGUoKQorICBhc3NlcnQgcHJvYy5yZXR1cm5jb2RlID09IDAsIFwKKyAgICAgICdGYWlsZWQgdG8gdmVyaWZ5IHBheWxvYWQgd2l0aCBkZWx0YV9nZW5lcmF0b3I6ICVzXG4lcycgJSAocGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ZGF0YSkKKyAgY29tbW9uLlppcENsb3NlKHBhY2thZ2VfemlwKQorCisgICMgVmVyaWZpZWQgc3VjY2Vzc2Z1bGx5IHVwb24gcmVhY2hpbmcgaGVyZS4KKyAgcHJpbnQoJ1xuUGF5bG9hZCBzaWduYXR1cmVzIFZFUklGSUVEXG5cbicpCiAKIAogZGVmIG1haW4oKToKQEAgLTE1MCw3ICsxODIsOCBAQAogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdwYWNrYWdlJywgaGVscD0nVGhlIE9UQSBwYWNrYWdlIHRvIGJlIHZlcmlmaWVkLicpCiAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKLSAgdmVyaWZ5X3BhY2thZ2UoYXJncy5jZXJ0aWZpY2F0ZSwgYXJncy5wYWNrYWdlKQorICBWZXJpZnlQYWNrYWdlKGFyZ3MuY2VydGlmaWNhdGUsIGFyZ3MucGFja2FnZSkKKyAgVmVyaWZ5QWJPdGFQYXlsb2FkKGFyZ3MuY2VydGlmaWNhdGUsIGFyZ3MucGFja2FnZSkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpAQCAtMTU5LDMgKzE5Miw1IEBACiAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvciBhcyBlcnI6CiAgICAgcHJpbnQoJ1xuICAgIEVSUk9SOiAlc1xuJyAlIChlcnIsKSkKICAgICBzeXMuZXhpdCgxKQorICBmaW5hbGx5OgorICAgIGNvbW1vbi5DbGVhbnVwKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfc2lnbmF0dXJlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9jaGVja190YXJnZXRfZmlsZXNfc2lnbmF0dXJlcy5weQppbmRleCBjNDg3N2UwLi5iOWYzOWE2IDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvY2hlY2tfdGFyZ2V0X2ZpbGVzX3NpZ25hdHVyZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NoZWNrX3RhcmdldF9maWxlc19zaWduYXR1cmVzLnB5CkBAIC0zOSwyNSArMzksMjYgQEAKIAogIiIiCiAKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cworaW1wb3J0IHppcGZpbGUKKworaW1wb3J0IGNvbW1vbgogCiBpZiBzeXMuaGV4dmVyc2lvbiA8IDB4MDIwNzAwMDA6CiAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJQeXRob24gMi43IG9yIG5ld2VyIGlzIHJlcXVpcmVkLiIKICAgc3lzLmV4aXQoMSkKIAotaW1wb3J0IG9zCi1pbXBvcnQgcmUKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgemlwZmlsZQogCi1pbXBvcnQgY29tbW9uCi0KLSMgV29yayBhcm91bmQgYSBidWcgaW4gcHl0aG9uJ3MgemlwZmlsZSBtb2R1bGUgdGhhdCBwcmV2ZW50cyBvcGVuaW5nCi0jIG9mIHppcGZpbGVzIGlmIGFueSBlbnRyeSBoYXMgYW4gZXh0cmEgZmllbGQgb2YgYmV0d2VlbiAxIGFuZCAzIGJ5dGVzCi0jICh3aGljaCBpcyBjb21tb24gd2l0aCB6aXBhbGlnbmVkIEFQS3MpLiAgVGhpcyBvdmVycmlkZXMgdGhlCi0jIFppcEluZm8uX2RlY29kZUV4dHJhKCkgbWV0aG9kICh3aGljaCBjb250YWlucyB0aGUgYnVnKSB3aXRoIGFuIGVtcHR5Ci0jIHZlcnNpb24gKHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gZGVjb2RlIHRoZSBleHRyYSBmaWVsZCBhbnl3YXkpLgorIyBXb3JrIGFyb3VuZCBhIGJ1ZyBpbiBQeXRob24ncyB6aXBmaWxlIG1vZHVsZSB0aGF0IHByZXZlbnRzIG9wZW5pbmcgb2YgemlwZmlsZXMKKyMgaWYgYW55IGVudHJ5IGhhcyBhbiBleHRyYSBmaWVsZCBvZiBiZXR3ZWVuIDEgYW5kIDMgYnl0ZXMgKHdoaWNoIGlzIGNvbW1vbiB3aXRoCisjIHppcGFsaWduZWQgQVBLcykuIFRoaXMgb3ZlcnJpZGVzIHRoZSBaaXBJbmZvLl9kZWNvZGVFeHRyYSgpIG1ldGhvZCAod2hpY2gKKyMgY29udGFpbnMgdGhlIGJ1Zykgd2l0aCBhbiBlbXB0eSB2ZXJzaW9uIChzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRlY29kZSB0aGUKKyMgZXh0cmEgZmllbGQgYW55d2F5KS4KKyMgSXNzdWUgIzE0MzE1OiBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE0MzE1LCBmaXhlZCBpbiBQeXRob24gMi43LjggYW5kCisjIFB5dGhvbiAzLjUuMCBhbHBoYSAxLgogY2xhc3MgTXlaaXBJbmZvKHppcGZpbGUuWmlwSW5mbyk6CiAgIGRlZiBfZGVjb2RlRXh0cmEoc2VsZik6CiAgICAgcGFzcwpAQCAtMjQyLDQ2ICsyNDMsNDEgQEAKICAgICAjIFRoaXMgaXMgdGhlIGxpc3Qgb2Ygd2lsZGNhcmRzIG9mIGZpbGVzIHdlIGV4dHJhY3QgZnJvbSB8ZmlsZW5hbWV8LgogICAgIGFwa19leHRlbnNpb25zID0gWycqLmFwayddCiAKLSAgICBzZWxmLmNlcnRtYXAsIGNvbXByZXNzZWRfZXh0ZW5zaW9uID0gY29tbW9uLlJlYWRBcGtDZXJ0cyh6aXBmaWxlLlppcEZpbGUoZmlsZW5hbWUsICJyIikpCisgICAgc2VsZi5jZXJ0bWFwLCBjb21wcmVzc2VkX2V4dGVuc2lvbiA9IGNvbW1vbi5SZWFkQXBrQ2VydHMoCisgICAgICAgIHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSwgInIiKSkKICAgICBpZiBjb21wcmVzc2VkX2V4dGVuc2lvbjoKICAgICAgIGFwa19leHRlbnNpb25zLmFwcGVuZCgiKi5hcGsiICsgY29tcHJlc3NlZF9leHRlbnNpb24pCiAKLSAgICBkLCB6ID0gY29tbW9uLlVuemlwVGVtcChmaWxlbmFtZSwgYXBrX2V4dGVuc2lvbnMpCi0gICAgdHJ5OgotICAgICAgc2VsZi5hcGtzID0ge30KLSAgICAgIHNlbGYuYXBrc19ieV9iYXNlbmFtZSA9IHt9Ci0gICAgICBmb3IgZGlycGF0aCwgXywgZmlsZW5hbWVzIGluIG9zLndhbGsoZCk6Ci0gICAgICAgIGZvciBmbiBpbiBmaWxlbmFtZXM6Ci0gICAgICAgICAgIyBEZWNvbXByZXNzIGNvbXByZXNzZWQgQVBLcyBiZWZvcmUgd2UgYmVnaW4gcHJvY2Vzc2luZyB0aGVtLgotICAgICAgICAgIGlmIGNvbXByZXNzZWRfZXh0ZW5zaW9uIGFuZCBmbi5lbmRzd2l0aChjb21wcmVzc2VkX2V4dGVuc2lvbik6Ci0gICAgICAgICAgICAjIEZpcnN0IHN0cmlwIHRoZSBjb21wcmVzc2VkIGV4dGVuc2lvbiBmcm9tIHRoZSBmaWxlLgotICAgICAgICAgICAgdW5jb21wcmVzc2VkX2ZuID0gZm5bOi1sZW4oY29tcHJlc3NlZF9leHRlbnNpb24pXQorICAgIGQgPSBjb21tb24uVW56aXBUZW1wKGZpbGVuYW1lLCBhcGtfZXh0ZW5zaW9ucykKKyAgICBzZWxmLmFwa3MgPSB7fQorICAgIHNlbGYuYXBrc19ieV9iYXNlbmFtZSA9IHt9CisgICAgZm9yIGRpcnBhdGgsIF8sIGZpbGVuYW1lcyBpbiBvcy53YWxrKGQpOgorICAgICAgZm9yIGZuIGluIGZpbGVuYW1lczoKKyAgICAgICAgIyBEZWNvbXByZXNzIGNvbXByZXNzZWQgQVBLcyBiZWZvcmUgd2UgYmVnaW4gcHJvY2Vzc2luZyB0aGVtLgorICAgICAgICBpZiBjb21wcmVzc2VkX2V4dGVuc2lvbiBhbmQgZm4uZW5kc3dpdGgoY29tcHJlc3NlZF9leHRlbnNpb24pOgorICAgICAgICAgICMgRmlyc3Qgc3RyaXAgdGhlIGNvbXByZXNzZWQgZXh0ZW5zaW9uIGZyb20gdGhlIGZpbGUuCisgICAgICAgICAgdW5jb21wcmVzc2VkX2ZuID0gZm5bOi1sZW4oY29tcHJlc3NlZF9leHRlbnNpb24pXQogCi0gICAgICAgICAgICAjIERlY29tcHJlc3MgdGhlIGNvbXByZXNzZWQgZmlsZSB0byB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICAgICAgICBjb21tb24uR3VuemlwKG9zLnBhdGguam9pbihkaXJwYXRoLCBmbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkaXJwYXRoLCB1bmNvbXByZXNzZWRfZm4pKQorICAgICAgICAgICMgRGVjb21wcmVzcyB0aGUgY29tcHJlc3NlZCBmaWxlIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgICAgICBjb21tb24uR3VuemlwKG9zLnBhdGguam9pbihkaXJwYXRoLCBmbiksCisgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlycGF0aCwgdW5jb21wcmVzc2VkX2ZuKSkKIAotICAgICAgICAgICAgIyBGaW5hbGx5LCBkZWxldGUgdGhlIGNvbXByZXNzZWQgZmlsZSBhbmQgdXNlIHRoZSB1bmNvbXByZXNzZWQgZmlsZQotICAgICAgICAgICAgIyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBOb3RlIHRoYXQgdGhlIGRlbGV0aW9uIGlzIG5vdCBzdHJpY3RseSByZXF1aXJlZCwKLSAgICAgICAgICAgICMgYnV0IGlzIGRvbmUgaGVyZSB0byBlbnN1cmUgdGhhdCB3ZSdyZSBub3QgdXNpbmcgdG9vIG11Y2ggc3BhY2UgaW4KLSAgICAgICAgICAgICMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0gICAgICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKGRpcnBhdGgsIGZuKSkKLSAgICAgICAgICAgIGZuID0gdW5jb21wcmVzc2VkX2ZuCisgICAgICAgICAgIyBGaW5hbGx5LCBkZWxldGUgdGhlIGNvbXByZXNzZWQgZmlsZSBhbmQgdXNlIHRoZSB1bmNvbXByZXNzZWQgZmlsZQorICAgICAgICAgICMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gTm90ZSB0aGF0IHRoZSBkZWxldGlvbiBpcyBub3Qgc3RyaWN0bHkKKyAgICAgICAgICAjIHJlcXVpcmVkLCBidXQgaXMgZG9uZSBoZXJlIHRvIGVuc3VyZSB0aGF0IHdlJ3JlIG5vdCB1c2luZyB0b28gbXVjaAorICAgICAgICAgICMgc3BhY2UgaW4gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCisgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihkaXJwYXRoLCBmbikpCisgICAgICAgICAgZm4gPSB1bmNvbXByZXNzZWRfZm4KIAorICAgICAgICBpZiBmbi5lbmRzd2l0aCgiLmFwayIpOgorICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGZuKQorICAgICAgICAgIGRpc3BsYXluYW1lID0gZnVsbG5hbWVbbGVuKGQpKzE6XQorICAgICAgICAgIGFwayA9IEFQSyhmdWxsbmFtZSwgZGlzcGxheW5hbWUpCisgICAgICAgICAgc2VsZi5hcGtzW2Fway5maWxlbmFtZV0gPSBhcGsKKyAgICAgICAgICBzZWxmLmFwa3NfYnlfYmFzZW5hbWVbb3MucGF0aC5iYXNlbmFtZShhcGsuZmlsZW5hbWUpXSA9IGFwawogCi0gICAgICAgICAgaWYgZm4uZW5kc3dpdGgoIi5hcGsiKToKLSAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGZuKQotICAgICAgICAgICAgZGlzcGxheW5hbWUgPSBmdWxsbmFtZVtsZW4oZCkrMTpdCi0gICAgICAgICAgICBhcGsgPSBBUEsoZnVsbG5hbWUsIGRpc3BsYXluYW1lKQotICAgICAgICAgICAgc2VsZi5hcGtzW2Fway5maWxlbmFtZV0gPSBhcGsKLSAgICAgICAgICAgIHNlbGYuYXBrc19ieV9iYXNlbmFtZVtvcy5wYXRoLmJhc2VuYW1lKGFway5maWxlbmFtZSldID0gYXBrCi0KLSAgICAgICAgICAgIHNlbGYubWF4X3BrZ19sZW4gPSBtYXgoc2VsZi5tYXhfcGtnX2xlbiwgbGVuKGFway5wYWNrYWdlKSkKLSAgICAgICAgICAgIHNlbGYubWF4X2ZuX2xlbiA9IG1heChzZWxmLm1heF9mbl9sZW4sIGxlbihhcGsuZmlsZW5hbWUpKQotICAgIGZpbmFsbHk6Ci0gICAgICBzaHV0aWwucm10cmVlKGQpCi0KLSAgICB6LmNsb3NlKCkKKyAgICAgICAgICBzZWxmLm1heF9wa2dfbGVuID0gbWF4KHNlbGYubWF4X3BrZ19sZW4sIGxlbihhcGsucGFja2FnZSkpCisgICAgICAgICAgc2VsZi5tYXhfZm5fbGVuID0gbWF4KHNlbGYubWF4X2ZuX2xlbiwgbGVuKGFway5maWxlbmFtZSkpCiAKICAgZGVmIENoZWNrU2hhcmVkVWlkcyhzZWxmKToKICAgICAiIiJMb29rIGZvciBhbnkgaW5zdGFuY2VzIHdoZXJlIHBhY2thZ2VzIHNpZ25lZCB3aXRoIGRpZmZlcmVudApAQCAtMjkxLDcgKzI4Nyw3IEBACiAgICAgICBpZiBhcGsuc2hhcmVkX3VpZDoKICAgICAgICAgYXBrc19ieV91aWQuc2V0ZGVmYXVsdChhcGsuc2hhcmVkX3VpZCwgW10pLmFwcGVuZChhcGspCiAKLSAgICBmb3IgdWlkIGluIHNvcnRlZChhcGtzX2J5X3VpZC5rZXlzKCkpOgorICAgIGZvciB1aWQgaW4gc29ydGVkKGFwa3NfYnlfdWlkKToKICAgICAgIGFwa3MgPSBhcGtzX2J5X3VpZFt1aWRdCiAgICAgICBmb3IgYXBrIGluIGFwa3NbMTpdOgogICAgICAgICBpZiBhcGsuY2VydHMgIT0gYXBrc1swXS5jZXJ0czoKQEAgLTQ2NiwzICs0NjIsNSBAQAogICAgIHByaW50ICIgICBFUlJPUjogJXMiICUgKGUsKQogICAgIHByaW50CiAgICAgc3lzLmV4aXQoMSkKKyAgZmluYWxseToKKyAgICBjb21tb24uQ2xlYW51cCgpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2NvbW1vbi5weQppbmRleCBmMzA5NmM5Li43NDNjNmEwIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9jb21tb24ucHkKQEAgLTI1LDE3ICsyNSwxNyBAQAogaW1wb3J0IHJlCiBpbXBvcnQgc2hsZXgKIGltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdHJpbmcKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB0aHJlYWRpbmcKIGltcG9ydCB0aW1lCiBpbXBvcnQgemlwZmlsZQorZnJvbSBoYXNobGliIGltcG9ydCBzaGExLCBzaGEyNTYKIAogaW1wb3J0IGJsb2NraW1nZGlmZgotCi1mcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEgYXMgc2hhMQotCitpbXBvcnQgc3BhcnNlX2ltZwogCiBjbGFzcyBPcHRpb25zKG9iamVjdCk6CiAgIGRlZiBfX2luaXRfXyhzZWxmKToKQEAgLTc2LDYgKzc2LDExIEBACiAjIFZhbHVlcyBmb3IgImNlcnRpZmljYXRlIiBpbiBhcGtjZXJ0cyB0aGF0IG1lYW4gc3BlY2lhbCB0aGluZ3MuCiBTUEVDSUFMX0NFUlRfU1RSSU5HUyA9ICgiUFJFU0lHTkVEIiwgIkVYVEVSTkFMIikKIAorCisjIFRoZSBwYXJ0aXRpb25zIGFsbG93ZWQgdG8gYmUgc2lnbmVkIGJ5IEFWQiAoQW5kcm9pZCB2ZXJpZmllZCBib290IDIuMCkuCitBVkJfUEFSVElUSU9OUyA9ICgnYm9vdCcsICdyZWNvdmVyeScsICdzeXN0ZW0nLCAndmVuZG9yJywgJ3Byb2R1Y3QnLCAnZHRibycpCisKKwogY2xhc3MgRXJyb3JDb2RlKG9iamVjdCk6CiAgICIiIkRlZmluZSBlcnJvcl9jb2RlcyBmb3IgZmFpbHVyZXMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBhY3R1YWwKICAgdXBkYXRlIHBhY2thZ2UgaW5zdGFsbGF0aW9uLgpAQCAtMTIxLDYgKzEyNiwxMSBAQAogICByZXR1cm4gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCAqKmt3YXJncykKIAogCitkZWYgUm91bmRVcFRvNEsodmFsdWUpOgorICByb3VuZGVkX3VwID0gdmFsdWUgKyA0MDk1CisgIHJldHVybiByb3VuZGVkX3VwIC0gKHJvdW5kZWRfdXAgJSA0MDk2KQorCisKIGRlZiBDbG9zZUluaGVyaXRlZFBpcGVzKCk6CiAgICIiIiBHbWFrZSBpbiBNQUMgT1MgaGFzIGZpbGUgZGVzY3JpcHRvciAoUElQRSkgbGVhay4gV2UgY2xvc2UgdGhvc2UgZmRzCiAgIGJlZm9yZSBkb2luZyBvdGhlciB3b3JrLiIiIgpAQCAtMjExLDIxICsyMjEsNiBAQAogICAgICAgICAgICAgdmVuZG9yX2Jhc2VfZnNfZmlsZSwpKQogICAgICAgICBkZWwgZFsidmVuZG9yX2Jhc2VfZnNfZmlsZSJdCiAKLSAgdHJ5OgotICAgIGRhdGEgPSByZWFkX2hlbHBlcigiTUVUQS9pbWFnZXNpemVzLnR4dCIpCi0gICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdCgiXG4iKToKLSAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICBjb250aW51ZQotICAgICAgbmFtZSwgdmFsdWUgPSBsaW5lLnNwbGl0KCIgIiwgMSkKLSAgICAgIGlmIG5vdCB2YWx1ZToKLSAgICAgICAgY29udGludWUKLSAgICAgIGlmIG5hbWUgPT0gImJsb2Nrc2l6ZSI6Ci0gICAgICAgIGRbbmFtZV0gPSB2YWx1ZQotICAgICAgZWxzZToKLSAgICAgICAgZFtuYW1lICsgIl9zaXplIl0gPSB2YWx1ZQotICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgcGFzcwotCiAgIGRlZiBtYWtlaW50KGtleSk6CiAgICAgaWYga2V5IGluIGQ6CiAgICAgICBkW2tleV0gPSBpbnQoZFtrZXldLCAwKQpAQCAtMjUyLDE1ICsyNDcsMzAgQEAKICAgZWxzZToKICAgICBkWyJmc3RhYiJdID0gTm9uZQogCi0gIGRbImJ1aWxkLnByb3AiXSA9IExvYWRCdWlsZFByb3AocmVhZF9oZWxwZXIpCisgIGRbImJ1aWxkLnByb3AiXSA9IExvYWRCdWlsZFByb3AocmVhZF9oZWxwZXIsICdTWVNURU0vYnVpbGQucHJvcCcpCisgIGRbInZlbmRvci5idWlsZC5wcm9wIl0gPSBMb2FkQnVpbGRQcm9wKHJlYWRfaGVscGVyLCAnVkVORE9SL2J1aWxkLnByb3AnKQorCisgICMgU2V0IHVwIHRoZSBzYWx0IChiYXNlZCBvbiBmaW5nZXJwcmludCBvciB0aHVtYnByaW50KSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuCisgICMgYWRkaW5nIEFWQiBmb290ZXIuCisgIGlmIGQuZ2V0KCJhdmJfZW5hYmxlIikgPT0gInRydWUiOgorICAgIGZwID0gTm9uZQorICAgIGlmICJidWlsZC5wcm9wIiBpbiBkOgorICAgICAgYnVpbGRfcHJvcCA9IGRbImJ1aWxkLnByb3AiXQorICAgICAgaWYgInJvLmJ1aWxkLmZpbmdlcnByaW50IiBpbiBidWlsZF9wcm9wOgorICAgICAgICBmcCA9IGJ1aWxkX3Byb3BbInJvLmJ1aWxkLmZpbmdlcnByaW50Il0KKyAgICAgIGVsaWYgInJvLmJ1aWxkLnRodW1icHJpbnQiIGluIGJ1aWxkX3Byb3A6CisgICAgICAgIGZwID0gYnVpbGRfcHJvcFsicm8uYnVpbGQudGh1bWJwcmludCJdCisgICAgaWYgZnA6CisgICAgICBkWyJhdmJfc2FsdCJdID0gc2hhMjU2KGZwKS5oZXhkaWdlc3QoKQorCiAgIHJldHVybiBkCiAKIAotZGVmIExvYWRCdWlsZFByb3AocmVhZF9oZWxwZXIpOgorZGVmIExvYWRCdWlsZFByb3AocmVhZF9oZWxwZXIsIHByb3BfZmlsZSk6CiAgIHRyeToKLSAgICBkYXRhID0gcmVhZF9oZWxwZXIoIlNZU1RFTS9idWlsZC5wcm9wIikKKyAgICBkYXRhID0gcmVhZF9oZWxwZXIocHJvcF9maWxlKQogICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgcHJpbnQoIldhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIFNZU1RFTS9idWlsZC5wcm9wIGluICVzIiAlICh6aXAsKSkKKyAgICBwcmludCgiV2FybmluZzogY291bGQgbm90IHJlYWQgJXMiICUgKHByb3BfZmlsZSwpKQogICAgIGRhdGEgPSAiIgogICByZXR1cm4gTG9hZERpY3Rpb25hcnlGcm9tTGluZXMoZGF0YS5zcGxpdCgiXG4iKSkKIApAQCAtNDQ3LDEwICs0NTcsMTIgQEAKICAgZWxzZToKICAgICBjbWQuZXh0ZW5kKFsiLS1vdXRwdXQiLCBpbWcubmFtZV0pCiAKKyAgIyAiYm9vdCIgb3IgInJlY292ZXJ5Iiwgd2l0aG91dCBleHRlbnNpb24uCisgIHBhcnRpdGlvbl9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShzb3VyY2VkaXIpLmxvd2VyKCkKKwogICBwID0gUnVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKICAgcC5jb21tdW5pY2F0ZSgpCi0gIGFzc2VydCBwLnJldHVybmNvZGUgPT0gMCwgIm1rYm9vdGltZyBvZiAlcyBpbWFnZSBmYWlsZWQiICUgKAotICAgICAgb3MucGF0aC5iYXNlbmFtZShzb3VyY2VkaXIpLCkKKyAgYXNzZXJ0IHAucmV0dXJuY29kZSA9PSAwLCAibWtib290aW1nIG9mICVzIGltYWdlIGZhaWxlZCIgJSAocGFydGl0aW9uX25hbWUsKQogCiAgIGlmIChpbmZvX2RpY3QuZ2V0KCJib290X3NpZ25lciIsIE5vbmUpID09ICJ0cnVlIiBhbmQKICAgICAgIGluZm9fZGljdC5nZXQoInZlcml0eV9rZXkiLCBOb25lKSk6CkBAIC00NTksNyArNDcxLDcgQEAKICAgICBpZiB0d29fc3RlcF9pbWFnZToKICAgICAgIHBhdGggPSAiL2Jvb3QiCiAgICAgZWxzZToKLSAgICAgIHBhdGggPSAiLyIgKyBvcy5wYXRoLmJhc2VuYW1lKHNvdXJjZWRpcikubG93ZXIoKQorICAgICAgcGF0aCA9ICIvIiArIHBhcnRpdGlvbl9uYW1lCiAgICAgY21kID0gW09QVElPTlMuYm9vdF9zaWduZXJfcGF0aF0KICAgICBjbWQuZXh0ZW5kKE9QVElPTlMuYm9vdF9zaWduZXJfYXJncykKICAgICBjbWQuZXh0ZW5kKFtwYXRoLCBpbWcubmFtZSwKQEAgLTQ3MSw3ICs0ODMsNyBAQAogCiAgICMgU2lnbiB0aGUgaW1hZ2UgaWYgdmJvb3QgaXMgbm9uLWVtcHR5LgogICBlbGlmIGluZm9fZGljdC5nZXQoInZib290IiwgTm9uZSk6Ci0gICAgcGF0aCA9ICIvIiArIG9zLnBhdGguYmFzZW5hbWUoc291cmNlZGlyKS5sb3dlcigpCisgICAgcGF0aCA9ICIvIiArIHBhcnRpdGlvbl9uYW1lCiAgICAgaW1nX2tleWJsb2NrID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKICAgICAjIFdlIGhhdmUgc3dpdGNoZWQgZnJvbSB0aGUgcHJlYnVpbHQgZnV0aWxpdHkgYmluYXJ5IHRvIHVzaW5nIHRoZSB0b29sCiAgICAgIyAoZnV0aWxpdHktaG9zdCkgYnVpbHQgZnJvbSB0aGUgc291cmNlLiBPdmVycmlkZSB0aGUgc2V0dGluZyBpbiB0aGUgb2xkCkBAIC00OTMsMjAgKzUwNSwyMSBAQAogICAgIGltZ191bnNpZ25lZC5jbG9zZSgpCiAgICAgaW1nX2tleWJsb2NrLmNsb3NlKCkKIAotICAjIEFWQjogaWYgZW5hYmxlZCwgY2FsY3VsYXRlIGFuZCBhZGQgaGFzaCB0byBib290LmltZy4KKyAgIyBBVkI6IGlmIGVuYWJsZWQsIGNhbGN1bGF0ZSBhbmQgYWRkIGhhc2ggdG8gYm9vdC5pbWcgb3IgcmVjb3ZlcnkuaW1nLgogICBpZiBpbmZvX2RpY3QuZ2V0KCJhdmJfZW5hYmxlIikgPT0gInRydWUiOgogICAgIGF2YnRvb2wgPSBvcy5nZXRlbnYoJ0FWQlRPT0wnKSBvciBpbmZvX2RpY3RbImF2Yl9hdmJ0b29sIl0KLSAgICBwYXJ0X3NpemUgPSBpbmZvX2RpY3RbImJvb3Rfc2l6ZSJdCisgICAgcGFydF9zaXplID0gaW5mb19kaWN0W3BhcnRpdGlvbl9uYW1lICsgIl9zaXplIl0KICAgICBjbWQgPSBbYXZidG9vbCwgImFkZF9oYXNoX2Zvb3RlciIsICItLWltYWdlIiwgaW1nLm5hbWUsCi0gICAgICAgICAgICItLXBhcnRpdGlvbl9zaXplIiwgc3RyKHBhcnRfc2l6ZSksICItLXBhcnRpdGlvbl9uYW1lIiwgImJvb3QiXQotICAgIEFwcGVuZEFWQlNpZ25pbmdBcmdzKGNtZCwgImJvb3QiKQotICAgIGFyZ3MgPSBpbmZvX2RpY3QuZ2V0KCJhdmJfYm9vdF9hZGRfaGFzaF9mb290ZXJfYXJncyIpCisgICAgICAgICAgICItLXBhcnRpdGlvbl9zaXplIiwgc3RyKHBhcnRfc2l6ZSksICItLXBhcnRpdGlvbl9uYW1lIiwKKyAgICAgICAgICAgcGFydGl0aW9uX25hbWVdCisgICAgQXBwZW5kQVZCU2lnbmluZ0FyZ3MoY21kLCBwYXJ0aXRpb25fbmFtZSkKKyAgICBhcmdzID0gaW5mb19kaWN0LmdldCgiYXZiXyIgKyBwYXJ0aXRpb25fbmFtZSArICJfYWRkX2hhc2hfZm9vdGVyX2FyZ3MiKQogICAgIGlmIGFyZ3MgYW5kIGFyZ3Muc3RyaXAoKToKICAgICAgIGNtZC5leHRlbmQoc2hsZXguc3BsaXQoYXJncykpCiAgICAgcCA9IFJ1bihjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCiAgICAgcC5jb21tdW5pY2F0ZSgpCiAgICAgYXNzZXJ0IHAucmV0dXJuY29kZSA9PSAwLCAiYXZidG9vbCBhZGRfaGFzaF9mb290ZXIgb2YgJXMgZmFpbGVkIiAlICgKLSAgICAgICAgb3MucGF0aC5iYXNlbmFtZShPUFRJT05TLmlucHV0X3RtcCkpCisgICAgICAgIHBhcnRpdGlvbl9uYW1lLCkKIAogICBpbWcuc2Vlayhvcy5TRUVLX1NFVCwgMCkKICAgZGF0YSA9IGltZy5yZWFkKCkKQEAgLTU2NSwxOCArNTc4LDE1IEBACiAKIAogZGVmIFVuemlwVGVtcChmaWxlbmFtZSwgcGF0dGVybj1Ob25lKToKLSAgIiIiVW56aXAgdGhlIGdpdmVuIGFyY2hpdmUgaW50byBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgYW5kIHJldHVybiB0aGUgbmFtZS4KKyAgIiIiVW56aXBzIHRoZSBnaXZlbiBhcmNoaXZlIGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCByZXR1cm5zIHRoZSBuYW1lLgogCi0gIElmIGZpbGVuYW1lIGlzIG9mIHRoZSBmb3JtICJmb28uemlwK2Jhci56aXAiLCB1bnppcCBmb28uemlwIGludG8gYQotICB0ZW1wIGRpciwgdGhlbiB1bnppcCBiYXIuemlwIGludG8gdGhhdF9kaXIvQk9PVEFCTEVfSU1BR0VTLgorICBJZiBmaWxlbmFtZSBpcyBvZiB0aGUgZm9ybSAiZm9vLnppcCtiYXIuemlwIiwgdW56aXAgZm9vLnppcCBpbnRvIGEgdGVtcCBkaXIsCisgIHRoZW4gdW56aXAgYmFyLnppcCBpbnRvIHRoYXRfZGlyL0JPT1RBQkxFX0lNQUdFUy4KIAotICBSZXR1cm5zICh0ZW1wZGlyLCB6aXBvYmopIHdoZXJlIHppcG9iaiBpcyBhIHppcGZpbGUuWmlwRmlsZSAob2YgdGhlCi0gIG1haW4gZmlsZSksIG9wZW4gZm9yIHJlYWRpbmcuCisgIFJldHVybnM6CisgICAgVGhlIG5hbWUgb2YgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCiAgICIiIgogCi0gIHRtcCA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSJ0YXJnZXRmaWxlcy0iKQotICBPUFRJT05TLnRlbXBmaWxlcy5hcHBlbmQodG1wKQotCiAgIGRlZiB1bnppcF90b19kaXIoZmlsZW5hbWUsIGRpcm5hbWUpOgogICAgIGNtZCA9IFsidW56aXAiLCAiLW8iLCAiLXEiLCBmaWxlbmFtZSwgIi1kIiwgZGlybmFtZV0KICAgICBpZiBwYXR0ZXJuIGlzIG5vdCBOb25lOgpAQCAtNTg3LDYgKzU5Nyw3IEBACiAgICAgICByYWlzZSBFeHRlcm5hbEVycm9yKCJmYWlsZWQgdG8gdW56aXAgaW5wdXQgdGFyZ2V0LWZpbGVzIFwiJXNcIiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWUsKSkKIAorICB0bXAgPSBNYWtlVGVtcERpcihwcmVmaXg9InRhcmdldGZpbGVzLSIpCiAgIG0gPSByZS5tYXRjaChyIl4oLipbLl16aXApXCsoLipbLl16aXApJCIsIGZpbGVuYW1lLCByZS5JR05PUkVDQVNFKQogICBpZiBtOgogICAgIHVuemlwX3RvX2RpcihtLmdyb3VwKDEpLCB0bXApCkBAIC01OTUsNyArNjA2LDY2IEBACiAgIGVsc2U6CiAgICAgdW56aXBfdG9fZGlyKGZpbGVuYW1lLCB0bXApCiAKLSAgcmV0dXJuIHRtcCwgemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lLCAiciIpCisgIHJldHVybiB0bXAKKworCitkZWYgR2V0U3BhcnNlSW1hZ2Uod2hpY2gsIHRtcGRpciwgaW5wdXRfemlwLCBhbGxvd19zaGFyZWRfYmxvY2tzKToKKyAgIiIiUmV0dXJucyBhIFNwYXJzZUltYWdlIG9iamVjdCBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBCbG9ja0ltYWdlRGlmZi4KKworICBUaGlzIGZ1bmN0aW9uIGxvYWRzIHRoZSBzcGVjaWZpZWQgc3BhcnNlIGltYWdlIGZyb20gdGhlIGdpdmVuIHBhdGgsIGFuZAorICBwZXJmb3JtcyBhZGRpdGlvbmFsIHByb2Nlc3NpbmcgZm9yIE9UQSBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgaXQgYWx3YXlzIGFkZHMKKyAgYmxvY2sgMCB0byBjbG9iYmVyZWQgYmxvY2tzIGxpc3QuIEl0IGFsc28gZGV0ZWN0cyBmaWxlcyB0aGF0IGNhbm5vdCBiZQorICByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGJsb2NrIGxpc3QsIGZvciB3aG9tIHdlIHNob3VsZCBhdm9pZCBhcHBseWluZyBpbWdkaWZmLgorCisgIEFyZ3M6CisgICAgd2hpY2g6IFRoZSBwYXJ0aXRpb24gbmFtZSwgd2hpY2ggbXVzdCBiZSAic3lzdGVtIiBvciAidmVuZG9yIi4KKyAgICB0bXBkaXI6IFRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgcHJlYnVpbHQgaW1hZ2UgYW5kIGJsb2NrIG1hcCBmaWxlLgorICAgIGlucHV0X3ppcDogVGhlIHRhcmdldC1maWxlcyBaSVAgYXJjaGl2ZS4KKyAgICBhbGxvd19zaGFyZWRfYmxvY2tzOiBXaGV0aGVyIGhhdmluZyBzaGFyZWQgYmxvY2tzIGlzIGFsbG93ZWQuCisKKyAgUmV0dXJuczoKKyAgICBBIFNwYXJzZUltYWdlIG9iamVjdCwgd2l0aCBmaWxlX21hcCBpbmZvIGxvYWRlZC4KKyAgIiIiCisgIGFzc2VydCB3aGljaCBpbiAoInN5c3RlbSIsICJ2ZW5kb3IiKQorCisgIHBhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAiSU1BR0VTIiwgd2hpY2ggKyAiLmltZyIpCisgIG1hcHBhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAiSU1BR0VTIiwgd2hpY2ggKyAiLm1hcCIpCisKKyAgIyBUaGUgaW1hZ2UgYW5kIG1hcCBmaWxlcyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHByaW9yIHRvIGNhbGxpbmcKKyAgIyBvdGFfZnJvbV90YXJnZXRfZmlsZXMucHkgKHNpbmNlIExNUCkuCisgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhwYXRoKSBhbmQgb3MucGF0aC5leGlzdHMobWFwcGF0aCkKKworICAjIEluIGV4dDQgZmlsZXN5c3RlbXMsIGJsb2NrIDAgbWlnaHQgYmUgY2hhbmdlZCBldmVuIGJlaW5nIG1vdW50ZWQgUi9PLiBXZSBhZGQKKyAgIyBpdCB0byBjbG9iYmVyZWRfYmxvY2tzIHNvIHRoYXQgaXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSB0YXJnZXQKKyAgIyB1bmNvbmRpdGlvbmFsbHkuIE5vdGUgdGhhdCB0aGV5IGFyZSBzdGlsbCBwYXJ0IG9mIGNhcmVfbWFwLiAoQnVnOiAyMDkzOTEzMSkKKyAgY2xvYmJlcmVkX2Jsb2NrcyA9ICIwIgorCisgIGltYWdlID0gc3BhcnNlX2ltZy5TcGFyc2VJbWFnZShwYXRoLCBtYXBwYXRoLCBjbG9iYmVyZWRfYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfc2hhcmVkX2Jsb2Nrcz1hbGxvd19zaGFyZWRfYmxvY2tzKQorCisgICMgYmxvY2subWFwIG1heSBjb250YWluIGxlc3MgYmxvY2tzLCBiZWNhdXNlIG1rZTJmcyBtYXkgc2tpcCBhbGxvY2F0aW5nIGJsb2NrcworICAjIGlmIHRoZXkgY29udGFpbiBhbGwgemVyb3MuIFdlIGNhbid0IHJlY29uc3RydWN0IHN1Y2ggYSBmaWxlIGZyb20gaXRzIGJsb2NrCisgICMgbGlzdC4gVGFnIHN1Y2ggZW50cmllcyBhY2NvcmRpbmdseS4gKEJ1ZzogNjUyMTM2MTYpCisgIGZvciBlbnRyeSBpbiBpbWFnZS5maWxlX21hcDoKKyAgICAjICIvc3lzdGVtL2ZyYW1ld29yay9hbS5qYXIiID0+ICJTWVNURU0vZnJhbWV3b3JrL2FtLmphciIuCisgICAgYXJjbmFtZSA9IHN0cmluZy5yZXBsYWNlKGVudHJ5LCB3aGljaCwgd2hpY2gudXBwZXIoKSwgMSlbMTpdCisgICAgIyBTa2lwIGFydGlmaWNpYWwgbmFtZXMsIHN1Y2ggYXMgIl9fWkVSTyIsICJfX05PTlpFUk8tMSIuCisgICAgaWYgYXJjbmFtZSBub3QgaW4gaW5wdXRfemlwLm5hbWVsaXN0KCk6CisgICAgICBjb250aW51ZQorCisgICAgaW5mbyA9IGlucHV0X3ppcC5nZXRpbmZvKGFyY25hbWUpCisgICAgcmFuZ2VzID0gaW1hZ2UuZmlsZV9tYXBbZW50cnldCisKKyAgICAjIElmIGEgUmFuZ2VTZXQgaGFzIGJlZW4gdGFnZ2VkIGFzIHVzaW5nIHNoYXJlZCBibG9ja3Mgd2hpbGUgbG9hZGluZyB0aGUKKyAgICAjIGltYWdlLCBpdHMgYmxvY2sgbGlzdCBtdXN0IGJlIGFscmVhZHkgaW5jb21wbGV0ZSBkdWUgdG8gdGhhdCByZWFzb24uIERvbid0CisgICAgIyBnaXZlIGl0ICdpbmNvbXBsZXRlJyB0YWcgdG8gYXZvaWQgbWVzc2luZyB1cCB0aGUgaW1nZGlmZiBzdGF0cy4KKyAgICBpZiByYW5nZXMuZXh0cmEuZ2V0KCd1c2VzX3NoYXJlZF9ibG9ja3MnKToKKyAgICAgIGNvbnRpbnVlCisKKyAgICBpZiBSb3VuZFVwVG80SyhpbmZvLmZpbGVfc2l6ZSkgPiByYW5nZXMuc2l6ZSgpICogNDA5NjoKKyAgICAgIHJhbmdlcy5leHRyYVsnaW5jb21wbGV0ZSddID0gVHJ1ZQorCisgIHJldHVybiBpbWFnZQogCiAKIGRlZiBHZXRLZXlQYXNzd29yZHMoa2V5bGlzdCk6CkBAIC03MzQsMTAgKzgwNCwxOCBAQAogCiAKIGRlZiBDaGVja1NpemUoZGF0YSwgdGFyZ2V0LCBpbmZvX2RpY3QpOgotICAiIiJDaGVjayB0aGUgZGF0YSBzdHJpbmcgcGFzc2VkIGFnYWluc3QgdGhlIG1heCBzaXplIGxpbWl0LCBpZgotICBhbnksIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0LiAgUmFpc2UgZXhjZXB0aW9uIGlmIHRoZSBkYXRhIGlzIHRvbyBiaWcuCi0gIFByaW50IGEgd2FybmluZyBpZiB0aGUgZGF0YSBpcyBuZWFyaW5nIHRoZSBtYXhpbXVtIHNpemUuIiIiCisgICIiIkNoZWNrcyB0aGUgZGF0YSBzdHJpbmcgcGFzc2VkIGFnYWluc3QgdGhlIG1heCBzaXplIGxpbWl0LgogCisgIEZvciBub24tQVZCIGltYWdlcywgcmFpc2UgZXhjZXB0aW9uIGlmIHRoZSBkYXRhIGlzIHRvbyBiaWcuIFByaW50IGEgd2FybmluZworICBpZiB0aGUgZGF0YSBpcyBuZWFyaW5nIHRoZSBtYXhpbXVtIHNpemUuCisKKyAgRm9yIEFWQiBpbWFnZXMsIHRoZSBhY3R1YWwgaW1hZ2Ugc2l6ZSBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIHRoZSBsaW1pdC4KKworICBBcmdzOgorICAgIGRhdGE6IEEgc3RyaW5nIHRoYXQgY29udGFpbnMgYWxsIHRoZSBkYXRhIGZvciB0aGUgcGFydGl0aW9uLgorICAgIHRhcmdldDogVGhlIHBhcnRpdGlvbiBuYW1lLiBUaGUgIi5pbWciIHN1ZmZpeCBpcyBvcHRpb25hbC4KKyAgICBpbmZvX2RpY3Q6IFRoZSBkaWN0IHRvIGJlIGxvb2tlZCB1cCBmb3IgcmVsZXZhbnQgaW5mby4KKyAgIiIiCiAgIGlmIHRhcmdldC5lbmRzd2l0aCgiLmltZyIpOgogICAgIHRhcmdldCA9IHRhcmdldFs6LTRdCiAgIG1vdW50X3BvaW50ID0gIi8iICsgdGFyZ2V0CkBAIC03NTcsMjIgKzgzNSw0MSBAQAogICAgIHJldHVybgogCiAgIHNpemUgPSBsZW4oZGF0YSkKLSAgcGN0ID0gZmxvYXQoc2l6ZSkgKiAxMDAuMCAvIGxpbWl0Ci0gIG1zZyA9ICIlcyBzaXplICglZCkgaXMgJS4yZiUlIG9mIGxpbWl0ICglZCkiICUgKHRhcmdldCwgc2l6ZSwgcGN0LCBsaW1pdCkKLSAgaWYgcGN0ID49IDk5LjA6Ci0gICAgcmFpc2UgRXh0ZXJuYWxFcnJvcihtc2cpCi0gIGVsaWYgcGN0ID49IDk1LjA6Ci0gICAgcHJpbnQoIlxuICBXQVJOSU5HOiAlc1xuIiAlIChtc2csKSkKLSAgZWxpZiBPUFRJT05TLnZlcmJvc2U6Ci0gICAgcHJpbnQoIiAgIiwgbXNnKQorICAjIHRhcmdldCBjb3VsZCBiZSAndXNlcmRhdGEnIG9yICdjYWNoZScuIFRoZXkgc2hvdWxkIGZvbGxvdyB0aGUgbm9uLUFWQiBpbWFnZQorICAjIHBhdGguCisgIGlmIGluZm9fZGljdC5nZXQoImF2Yl9lbmFibGUiKSA9PSAidHJ1ZSIgYW5kIHRhcmdldCBpbiBBVkJfUEFSVElUSU9OUzoKKyAgICBpZiBzaXplICE9IGxpbWl0OgorICAgICAgcmFpc2UgRXh0ZXJuYWxFcnJvcigKKyAgICAgICAgICAiTWlzbWF0Y2hpbmcgaW1hZ2Ugc2l6ZSBmb3IgJXM6IGV4cGVjdGVkICVkIGFjdHVhbCAlZCIgJSAoCisgICAgICAgICAgICAgIHRhcmdldCwgbGltaXQsIHNpemUpKQorICBlbHNlOgorICAgIHBjdCA9IGZsb2F0KHNpemUpICogMTAwLjAgLyBsaW1pdAorICAgIG1zZyA9ICIlcyBzaXplICglZCkgaXMgJS4yZiUlIG9mIGxpbWl0ICglZCkiICUgKHRhcmdldCwgc2l6ZSwgcGN0LCBsaW1pdCkKKyAgICBpZiBwY3QgPj0gOTkuMDoKKyAgICAgIHJhaXNlIEV4dGVybmFsRXJyb3IobXNnKQorICAgIGVsaWYgcGN0ID49IDk1LjA6CisgICAgICBwcmludCgiXG4gIFdBUk5JTkc6ICVzXG4iICUgKG1zZywpKQorICAgIGVsaWYgT1BUSU9OUy52ZXJib3NlOgorICAgICAgcHJpbnQoIiAgIiwgbXNnKQogCiAKIGRlZiBSZWFkQXBrQ2VydHModGZfemlwKToKLSAgIiIiR2l2ZW4gYSB0YXJnZXRfZmlsZXMgWmlwRmlsZSwgcGFyc2UgdGhlIE1FVEEvYXBrY2VydHMudHh0IGZpbGUKLSAgYW5kIHJldHVybiBhIHR1cGxlIHdpdGggdGhlIGZvbGxvd2luZyBlbGVtZW50czogKDEpIGEgZGljdGlvbmFyeSB0aGF0IG1hcHMKLSAgcGFja2FnZXMgdG8gY2VydHMgKGJhc2VkIG9uIHRoZSAiY2VydGlmaWNhdGUiIGFuZCAicHJpdmF0ZV9rZXkiIGF0dHJpYnV0ZXMKLSAgaW4gdGhlIGZpbGUuICgyKSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV4dGVuc2lvbiBvZiBjb21wcmVzc2VkIEFQS3MgaW4KLSAgdGhlIHRhcmdldCBmaWxlcyAoZS5nICIuZ3oiICIuYnJvIikuIiIiCisgICIiIlBhcnNlcyB0aGUgQVBLIGNlcnRzIGluZm8gZnJvbSBhIGdpdmVuIHRhcmdldC1maWxlcyB6aXAuCisKKyAgR2l2ZW4gYSB0YXJnZXQtZmlsZXMgWmlwRmlsZSwgcGFyc2VzIHRoZSBNRVRBL2Fwa2NlcnRzLnR4dCBlbnRyeSBhbmQgcmV0dXJucyBhCisgIHR1cGxlIHdpdGggdGhlIGZvbGxvd2luZyBlbGVtZW50czogKDEpIGEgZGljdGlvbmFyeSB0aGF0IG1hcHMgcGFja2FnZXMgdG8KKyAgY2VydHMgKGJhc2VkIG9uIHRoZSAiY2VydGlmaWNhdGUiIGFuZCAicHJpdmF0ZV9rZXkiIGF0dHJpYnV0ZXMgaW4gdGhlIGZpbGU7CisgICgyKSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV4dGVuc2lvbiBvZiBjb21wcmVzc2VkIEFQS3MgaW4gdGhlIHRhcmdldCBmaWxlcworICAoZS5nICIuZ3oiLCAiLmJybyIpLgorCisgIEFyZ3M6CisgICAgdGZfemlwOiBUaGUgaW5wdXQgdGFyZ2V0X2ZpbGVzIFppcEZpbGUgKGFscmVhZHkgb3BlbikuCisKKyAgUmV0dXJuczoKKyAgICAoY2VydG1hcCwgZXh0KTogY2VydG1hcCBpcyBhIGRpY3Rpb25hcnkgdGhhdCBtYXBzIHBhY2thZ2VzIHRvIGNlcnRzOyBleHQgaXMKKyAgICAgICAgdGhlIGV4dGVuc2lvbiBzdHJpbmcgb2YgY29tcHJlc3NlZCBBUEtzIChlLmcuICIuZ3oiKSwgb3IgTm9uZSBpZiB0aGVyZSdzCisgICAgICAgIG5vIGNvbXByZXNzZWQgQVBLcy4KKyAgIiIiCiAgIGNlcnRtYXAgPSB7fQogICBjb21wcmVzc2VkX2V4dGVuc2lvbiA9IE5vbmUKIApAQCAtNzg4LDQxICs4ODUsNTEgQEAKICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgaWYgbm90IGxpbmU6CiAgICAgICBjb250aW51ZQotICAgIG0gPSByZS5tYXRjaChyJ15uYW1lPSIoP1A8TkFNRT4uKikiXHMrY2VydGlmaWNhdGU9Iig/UDxDRVJUPi4qKSJccysnCi0gICAgICAgICAgICAgICAgIHIncHJpdmF0ZV9rZXk9Iig/UDxQUklWS0VZPi4qPykiKFxzK2NvbXByZXNzZWQ9Iig/UDxDT01QUkVTU0VEPi4qKSIpPyQnLAotICAgICAgICAgICAgICAgICBsaW5lKQotICAgIGlmIG06Ci0gICAgICBtYXRjaGVzID0gbS5ncm91cGRpY3QoKQotICAgICAgY2VydCA9IG1hdGNoZXNbIkNFUlQiXQotICAgICAgcHJpdmtleSA9IG1hdGNoZXNbIlBSSVZLRVkiXQotICAgICAgbmFtZSA9IG1hdGNoZXNbIk5BTUUiXQotICAgICAgdGhpc19jb21wcmVzc2VkX2V4dGVuc2lvbiA9IG1hdGNoZXNbIkNPTVBSRVNTRUQiXQotICAgICAgcHVibGljX2tleV9zdWZmaXhfbGVuID0gbGVuKE9QVElPTlMucHVibGljX2tleV9zdWZmaXgpCi0gICAgICBwcml2YXRlX2tleV9zdWZmaXhfbGVuID0gbGVuKE9QVElPTlMucHJpdmF0ZV9rZXlfc3VmZml4KQotICAgICAgaWYgY2VydCBpbiBTUEVDSUFMX0NFUlRfU1RSSU5HUyBhbmQgbm90IHByaXZrZXk6Ci0gICAgICAgIGNlcnRtYXBbbmFtZV0gPSBjZXJ0Ci0gICAgICBlbGlmIChjZXJ0LmVuZHN3aXRoKE9QVElPTlMucHVibGljX2tleV9zdWZmaXgpIGFuZAotICAgICAgICAgICAgcHJpdmtleS5lbmRzd2l0aChPUFRJT05TLnByaXZhdGVfa2V5X3N1ZmZpeCkgYW5kCi0gICAgICAgICAgICBjZXJ0WzotcHVibGljX2tleV9zdWZmaXhfbGVuXSA9PSBwcml2a2V5WzotcHJpdmF0ZV9rZXlfc3VmZml4X2xlbl0pOgotICAgICAgICBjZXJ0bWFwW25hbWVdID0gY2VydFs6LXB1YmxpY19rZXlfc3VmZml4X2xlbl0KLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZhaWxlZCB0byBwYXJzZSBsaW5lIGZyb20gYXBrY2VydHMudHh0OlxuIiArIGxpbmUpCi0gICAgICBpZiB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uOgotICAgICAgICAjIE9ubHkgY291bnQgdGhlIGluc3RhbGxlZCBmaWxlcy4KLSAgICAgICAgZmlsZW5hbWUgPSBuYW1lICsgJy4nICsgdGhpc19jb21wcmVzc2VkX2V4dGVuc2lvbgotICAgICAgICBpZiBmaWxlbmFtZSBub3QgaW4gaW5zdGFsbGVkX2ZpbGVzOgotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICMgTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIGNvbXByZXNzaW9uIG1hcCBoYXZlIHRoZSBzYW1lCi0gICAgICAgICMgZXh0ZW5zaW9uLiBXZSBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGNvbXByZXNzaW9uIG1ldGhvZHMgaW4gdGhlIHNhbWUKLSAgICAgICAgIyBzeXN0ZW0gaW1hZ2UuCi0gICAgICAgIGlmIGNvbXByZXNzZWRfZXh0ZW5zaW9uOgotICAgICAgICAgIGlmIHRoaXNfY29tcHJlc3NlZF9leHRlbnNpb24gIT0gY29tcHJlc3NlZF9leHRlbnNpb246Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtdWx0aXBsZSBjb21wcmVzc2VkIGV4dGVuc2lvbnMgOiAlcyB2cyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wcmVzc2VkX2V4dGVuc2lvbiwgdGhpc19jb21wcmVzc2VkX2V4dGVuc2lvbikpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgY29tcHJlc3NlZF9leHRlbnNpb24gPSB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uCisgICAgbSA9IHJlLm1hdGNoKAorICAgICAgICByJ15uYW1lPSIoP1A8TkFNRT4uKikiXHMrY2VydGlmaWNhdGU9Iig/UDxDRVJUPi4qKSJccysnCisgICAgICAgIHIncHJpdmF0ZV9rZXk9Iig/UDxQUklWS0VZPi4qPykiKFxzK2NvbXByZXNzZWQ9Iig/UDxDT01QUkVTU0VEPi4qKSIpPyQnLAorICAgICAgICBsaW5lKQorICAgIGlmIG5vdCBtOgorICAgICAgY29udGludWUKIAotICByZXR1cm4gKGNlcnRtYXAsICgiLiIgKyBjb21wcmVzc2VkX2V4dGVuc2lvbikgaWYgY29tcHJlc3NlZF9leHRlbnNpb24gZWxzZSBOb25lKQorICAgIG1hdGNoZXMgPSBtLmdyb3VwZGljdCgpCisgICAgY2VydCA9IG1hdGNoZXNbIkNFUlQiXQorICAgIHByaXZrZXkgPSBtYXRjaGVzWyJQUklWS0VZIl0KKyAgICBuYW1lID0gbWF0Y2hlc1siTkFNRSJdCisgICAgdGhpc19jb21wcmVzc2VkX2V4dGVuc2lvbiA9IG1hdGNoZXNbIkNPTVBSRVNTRUQiXQorCisgICAgcHVibGljX2tleV9zdWZmaXhfbGVuID0gbGVuKE9QVElPTlMucHVibGljX2tleV9zdWZmaXgpCisgICAgcHJpdmF0ZV9rZXlfc3VmZml4X2xlbiA9IGxlbihPUFRJT05TLnByaXZhdGVfa2V5X3N1ZmZpeCkKKyAgICBpZiBjZXJ0IGluIFNQRUNJQUxfQ0VSVF9TVFJJTkdTIGFuZCBub3QgcHJpdmtleToKKyAgICAgIGNlcnRtYXBbbmFtZV0gPSBjZXJ0CisgICAgZWxpZiAoY2VydC5lbmRzd2l0aChPUFRJT05TLnB1YmxpY19rZXlfc3VmZml4KSBhbmQKKyAgICAgICAgICBwcml2a2V5LmVuZHN3aXRoKE9QVElPTlMucHJpdmF0ZV9rZXlfc3VmZml4KSBhbmQKKyAgICAgICAgICBjZXJ0WzotcHVibGljX2tleV9zdWZmaXhfbGVuXSA9PSBwcml2a2V5WzotcHJpdmF0ZV9rZXlfc3VmZml4X2xlbl0pOgorICAgICAgY2VydG1hcFtuYW1lXSA9IGNlcnRbOi1wdWJsaWNfa2V5X3N1ZmZpeF9sZW5dCisgICAgZWxzZToKKyAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkZhaWxlZCB0byBwYXJzZSBsaW5lIGZyb20gYXBrY2VydHMudHh0OlxuIiArIGxpbmUpCisKKyAgICBpZiBub3QgdGhpc19jb21wcmVzc2VkX2V4dGVuc2lvbjoKKyAgICAgIGNvbnRpbnVlCisKKyAgICAjIE9ubHkgY291bnQgdGhlIGluc3RhbGxlZCBmaWxlcy4KKyAgICBmaWxlbmFtZSA9IG5hbWUgKyAnLicgKyB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uCisgICAgaWYgZmlsZW5hbWUgbm90IGluIGluc3RhbGxlZF9maWxlczoKKyAgICAgIGNvbnRpbnVlCisKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgdmFsdWVzIGluIHRoZSBjb21wcmVzc2lvbiBtYXAgaGF2ZSB0aGUgc2FtZQorICAgICMgZXh0ZW5zaW9uLiBXZSBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGNvbXByZXNzaW9uIG1ldGhvZHMgaW4gdGhlIHNhbWUKKyAgICAjIHN5c3RlbSBpbWFnZS4KKyAgICBpZiBjb21wcmVzc2VkX2V4dGVuc2lvbjoKKyAgICAgIGlmIHRoaXNfY29tcHJlc3NlZF9leHRlbnNpb24gIT0gY29tcHJlc3NlZF9leHRlbnNpb246CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAiTXVsdGlwbGUgY29tcHJlc3NlZCBleHRlbnNpb25zOiB7fSB2cyB7fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfZXh0ZW5zaW9uLCB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uKSkKKyAgICBlbHNlOgorICAgICAgY29tcHJlc3NlZF9leHRlbnNpb24gPSB0aGlzX2NvbXByZXNzZWRfZXh0ZW5zaW9uCisKKyAgcmV0dXJuIChjZXJ0bWFwLAorICAgICAgICAgICgiLiIgKyBjb21wcmVzc2VkX2V4dGVuc2lvbikgaWYgY29tcHJlc3NlZF9leHRlbnNpb24gZWxzZSBOb25lKQogCiAKIENPTU1PTl9ET0NTVFJJTkcgPSAiIiIKQEAgLTkzMCwxMiArMTAzNywyNCBAQAogICByZXR1cm4gZm4KIAogCitkZWYgTWFrZVRlbXBEaXIocHJlZml4PSd0bXAnLCBzdWZmaXg9JycpOgorICAiIiJNYWtlcyBhIHRlbXBvcmFyeSBkaXIgdGhhdCB3aWxsIGJlIGNsZWFuZWQgdXAgd2l0aCBhIGNhbGwgdG8gQ2xlYW51cCgpLgorCisgIFJldHVybnM6CisgICAgVGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBuZXcgZGlyZWN0b3J5LgorICAiIiIKKyAgZGlyX25hbWUgPSB0ZW1wZmlsZS5ta2R0ZW1wKHN1ZmZpeD1zdWZmaXgsIHByZWZpeD1wcmVmaXgpCisgIE9QVElPTlMudGVtcGZpbGVzLmFwcGVuZChkaXJfbmFtZSkKKyAgcmV0dXJuIGRpcl9uYW1lCisKKwogZGVmIENsZWFudXAoKToKICAgZm9yIGkgaW4gT1BUSU9OUy50ZW1wZmlsZXM6CiAgICAgaWYgb3MucGF0aC5pc2RpcihpKToKLSAgICAgIHNodXRpbC5ybXRyZWUoaSkKKyAgICAgIHNodXRpbC5ybXRyZWUoaSwgaWdub3JlX2Vycm9ycz1UcnVlKQogICAgIGVsc2U6CiAgICAgICBvcy5yZW1vdmUoaSkKKyAgZGVsIE9QVElPTlMudGVtcGZpbGVzWzpdCiAKIAogY2xhc3MgUGFzc3dvcmRNYW5hZ2VyKG9iamVjdCk6CkBAIC0xMTIyLDYgKzEyNDEsMjggQEAKICAgemlwZmlsZS5aSVA2NF9MSU1JVCA9IHNhdmVkX3ppcDY0X2xpbWl0CiAKIAorZGVmIFppcERlbGV0ZSh6aXBfZmlsZW5hbWUsIGVudHJpZXMpOgorICAiIiJEZWxldGVzIGVudHJpZXMgZnJvbSBhIFpJUCBmaWxlLgorCisgIFNpbmNlIGRlbGV0aW5nIGVudHJpZXMgZnJvbSBhIFpJUCBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQsIGl0IHNoZWxscyBvdXQgdG8KKyAgJ3ppcCAtZCcuCisKKyAgQXJnczoKKyAgICB6aXBfZmlsZW5hbWU6IFRoZSBuYW1lIG9mIHRoZSBaSVAgZmlsZS4KKyAgICBlbnRyaWVzOiBUaGUgbmFtZSBvZiB0aGUgZW50cnksIG9yIHRoZSBsaXN0IG9mIG5hbWVzIHRvIGJlIGRlbGV0ZWQuCisKKyAgUmFpc2VzOgorICAgIEFzc2VydGlvbkVycm9yOiBJbiBjYXNlIG9mIG5vbi16ZXJvIHJldHVybiBmcm9tICd6aXAnLgorICAiIiIKKyAgaWYgaXNpbnN0YW5jZShlbnRyaWVzLCBiYXNlc3RyaW5nKToKKyAgICBlbnRyaWVzID0gW2VudHJpZXNdCisgIGNtZCA9IFsiemlwIiwgIi1kIiwgemlwX2ZpbGVuYW1lXSArIGVudHJpZXMKKyAgcHJvYyA9IFJ1bihjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgc3Rkb3V0ZGF0YSwgXyA9IHByb2MuY29tbXVuaWNhdGUoKQorICBhc3NlcnQgcHJvYy5yZXR1cm5jb2RlID09IDAsICJGYWlsZWQgdG8gZGVsZXRlICVzOlxuJXMiICUgKGVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ZGF0YSkKKworCiBkZWYgWmlwQ2xvc2UoemlwX2ZpbGUpOgogICAjIGh0dHA6Ly9iLzE4MDE1MjQ2CiAgICMgemlwZmlsZSBhbHNvIHJlZmVycyB0byBaSVA2NF9MSU1JVCBkdXJpbmcgY2xvc2UoKSB3aGVuIGl0IHdyaXRlcyBvdXQgdGhlCkBAIC0xMzA2LDcgKzE0NDcsNyBAQAogICAgICAgICAgIHAua2lsbCgpCiAgICAgICAgICAgdGguam9pbigpCiAKLSAgICAgIGlmIGVyciBvciBwLnJldHVybmNvZGUgIT0gMDoKKyAgICAgIGlmIHAucmV0dXJuY29kZSAhPSAwOgogICAgICAgICBwcmludCgiV0FSTklORzogZmFpbHVyZSBydW5uaW5nICVzOlxuJXNcbiIgJSAoCiAgICAgICAgICAgICBkaWZmX3Byb2dyYW0sICIiLmpvaW4oZXJyKSkpCiAgICAgICAgIHNlbGYucGF0Y2ggPSBOb25lCkBAIC0xMzg0LDIwICsxNTI1LDE2IEBACiAgICAgc2VsZi5kaXNhYmxlX2ltZ2RpZmYgPSBkaXNhYmxlX2ltZ2RpZmYKIAogICAgIGlmIHZlcnNpb24gaXMgTm9uZToKLSAgICAgIHZlcnNpb24gPSAxCi0gICAgICBpZiBPUFRJT05TLmluZm9fZGljdDoKLSAgICAgICAgdmVyc2lvbiA9IG1heCgKLSAgICAgICAgICAgIGludChpKSBmb3IgaSBpbgotICAgICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJibG9ja2ltZ2RpZmZfdmVyc2lvbnMiLCAiMSIpLnNwbGl0KCIsIikpCisgICAgICB2ZXJzaW9uID0gbWF4KAorICAgICAgICAgIGludChpKSBmb3IgaSBpbgorICAgICAgICAgIE9QVElPTlMuaW5mb19kaWN0LmdldCgiYmxvY2tpbWdkaWZmX3ZlcnNpb25zIiwgIjEiKS5zcGxpdCgiLCIpKQogICAgIGFzc2VydCB2ZXJzaW9uID49IDMKICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCiAKICAgICBiID0gYmxvY2tpbWdkaWZmLkJsb2NrSW1hZ2VEaWZmKHRndCwgc3JjLCB0aHJlYWRzPU9QVElPTlMud29ya2VyX3RocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVfaW1nZGlmZj1zZWxmLmRpc2FibGVfaW1nZGlmZikKLSAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKLSAgICBPUFRJT05TLnRlbXBmaWxlcy5hcHBlbmQodG1wZGlyKQotICAgIHNlbGYucGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIHBhcnRpdGlvbikKKyAgICBzZWxmLnBhdGggPSBvcy5wYXRoLmpvaW4oTWFrZVRlbXBEaXIoKSwgcGFydGl0aW9uKQogICAgIGIuQ29tcHV0ZShzZWxmLnBhdGgpCiAgICAgc2VsZi5fcmVxdWlyZWRfY2FjaGUgPSBiLm1heF9zdGFzaGVkX3NpemUKICAgICBzZWxmLnRvdWNoZWRfc3JjX3JhbmdlcyA9IGIudG91Y2hlZF9zcmNfcmFuZ2VzCkBAIC0xNTcwLDExICsxNzA3LDExIEBACiAgICAgIyAgIGRlY29tcHJlc3Npb25fdGltZTogMTVzICB8IDI1cyAgICAgICAgICAgICAgICB8IDI1cwogCiAgICAgaWYgbm90IHNlbGYuc3JjOgotICAgICAgYnJvX2NtZCA9IFsnYnJvJywgJy0tcXVhbGl0eScsICc2JywKLSAgICAgICAgICAgICAgICAgJy0taW5wdXQnLCAne30ubmV3LmRhdCcuZm9ybWF0KHNlbGYucGF0aCksCi0gICAgICAgICAgICAgICAgICctLW91dHB1dCcsICd7fS5uZXcuZGF0LmJyJy5mb3JtYXQoc2VsZi5wYXRoKV0KKyAgICAgIGJyb3RsaV9jbWQgPSBbJ2Jyb3RsaScsICctLXF1YWxpdHk9NicsCisgICAgICAgICAgICAgICAgICAgICctLW91dHB1dD17fS5uZXcuZGF0LmJyJy5mb3JtYXQoc2VsZi5wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgJ3t9Lm5ldy5kYXQnLmZvcm1hdChzZWxmLnBhdGgpXQogICAgICAgcHJpbnQoIkNvbXByZXNzaW5nIHt9Lm5ldy5kYXQgd2l0aCBicm90bGkiLmZvcm1hdChzZWxmLnBhcnRpdGlvbikpCi0gICAgICBwID0gUnVuKGJyb19jbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICBwID0gUnVuKGJyb3RsaV9jbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCiAgICAgICBwLmNvbW11bmljYXRlKCkKICAgICAgIGFzc2VydCBwLnJldHVybmNvZGUgPT0gMCxcCiAgICAgICAgICAgJ2NvbXByZXNzaW9uIG9mIHt9Lm5ldy5kYXQgZmFpbGVkJy5mb3JtYXQoc2VsZi5wYXJ0aXRpb24pCkBAIC0xNjQ1LDE5ICsxNzgyLDUwIEBACiAKIAogZGVmIFBhcnNlQ2VydGlmaWNhdGUoZGF0YSk6Ci0gICIiIlBhcnNlIGEgUEVNLWZvcm1hdCBjZXJ0aWZpY2F0ZS4iIiIKLSAgY2VydCA9IFtdCisgICIiIlBhcnNlcyBhbmQgY29udmVydHMgYSBQRU0tZW5jb2RlZCBjZXJ0aWZpY2F0ZSBpbnRvIERFUi1lbmNvZGVkLgorCisgIFRoaXMgZ2l2ZXMgdGhlIHNhbWUgcmVzdWx0IGFzIGBvcGVuc3NsIHg1MDkgLWluIDxmaWxlbmFtZT4gLW91dGZvcm0gREVSYC4KKworICBSZXR1cm5zOgorICAgIFRoZSBkZWNvZGVkIGNlcnRpZmljYXRlIHN0cmluZy4KKyAgIiIiCisgIGNlcnRfYnVmZmVyID0gW10KICAgc2F2ZSA9IEZhbHNlCiAgIGZvciBsaW5lIGluIGRhdGEuc3BsaXQoIlxuIik6CiAgICAgaWYgIi0tRU5EIENFUlRJRklDQVRFLS0iIGluIGxpbmU6CiAgICAgICBicmVhawogICAgIGlmIHNhdmU6Ci0gICAgICBjZXJ0LmFwcGVuZChsaW5lKQorICAgICAgY2VydF9idWZmZXIuYXBwZW5kKGxpbmUpCiAgICAgaWYgIi0tQkVHSU4gQ0VSVElGSUNBVEUtLSIgaW4gbGluZToKICAgICAgIHNhdmUgPSBUcnVlCi0gIGNlcnQgPSAiIi5qb2luKGNlcnQpLmRlY29kZSgnYmFzZTY0JykKKyAgY2VydCA9ICIiLmpvaW4oY2VydF9idWZmZXIpLmRlY29kZSgnYmFzZTY0JykKICAgcmV0dXJuIGNlcnQKIAorCitkZWYgRXh0cmFjdFB1YmxpY0tleShjZXJ0KToKKyAgIiIiRXh0cmFjdHMgdGhlIHB1YmxpYyBrZXkgKFBFTS1lbmNvZGVkKSBmcm9tIHRoZSBnaXZlbiBjZXJ0aWZpY2F0ZSBmaWxlLgorCisgIEFyZ3M6CisgICAgY2VydDogVGhlIGNlcnRpZmljYXRlIGZpbGVuYW1lLgorCisgIFJldHVybnM6CisgICAgVGhlIHB1YmxpYyBrZXkgc3RyaW5nLgorCisgIFJhaXNlczoKKyAgICBBc3NlcnRpb25FcnJvcjogT24gbm9uLXplcm8gcmV0dXJuIGZyb20gJ29wZW5zc2wnLgorICAiIiIKKyAgIyBUaGUgYmVoYXZpb3Igd2l0aCAnLW91dCcgaXMgZGlmZmVyZW50IGJldHdlZW4gb3BlbnNzbCAxLjEgYW5kIG9wZW5zc2wgMS4wLgorICAjIFdoaWxlIG9wZW5zc2wgMS4xIHdyaXRlcyB0aGUga2V5IGludG8gdGhlIGdpdmVuIGZpbGVuYW1lIGZvbGxvd2VkIGJ5ICctb3V0JywKKyAgIyBvcGVuc3NsIDEuMCAoYm90aCBvZiAxLjAuMSBhbmQgMS4wLjIpIGRvZXNuJ3QuIFNvIHdlIGNvbGxlY3QgdGhlIG91dHB1dCBmcm9tCisgICMgc3Rkb3V0IGluc3RlYWQuCisgIGNtZCA9IFsnb3BlbnNzbCcsICd4NTA5JywgJy1wdWJrZXknLCAnLW5vb3V0JywgJy1pbicsIGNlcnRdCisgIHByb2MgPSBSdW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICBwdWJrZXksIHN0ZGVycmRhdGEgPSBwcm9jLmNvbW11bmljYXRlKCkKKyAgYXNzZXJ0IHByb2MucmV0dXJuY29kZSA9PSAwLCBcCisgICAgICAnRmFpbGVkIHRvIGR1bXAgcHVibGljIGtleSBmcm9tIGNlcnRpZmljYXRlOiAlc1xuJXMnICUgKGNlcnQsIHN0ZGVycmRhdGEpCisgIHJldHVybiBwdWJrZXkKKworCiBkZWYgTWFrZVJlY292ZXJ5UGF0Y2goaW5wdXRfZGlyLCBvdXRwdXRfc2luaywgcmVjb3ZlcnlfaW1nLCBib290X2ltZywKICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2RpY3Q9Tm9uZSk6CiAgICIiIkdlbmVyYXRlIGEgYmluYXJ5IHBhdGNoIHRoYXQgY3JlYXRlcyB0aGUgcmVjb3ZlcnkgaW1hZ2Ugc3RhcnRpbmcKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9lZGlmeV9nZW5lcmF0b3IucHkgYi90b29scy9yZWxlYXNldG9vbHMvZWRpZnlfZ2VuZXJhdG9yLnB5CmluZGV4IDBjNDRmYWYuLjdhODE5MjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9lZGlmeV9nZW5lcmF0b3IucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2VkaWZ5X2dlbmVyYXRvci5weQpAQCAtNzcsMTQgKzc3LDE0IEBACiAgICAgd2l0aCB0ZW1wb3Jhcnk9VHJ1ZSkgdG8gdGhpcyBvbmUuIiIiCiAgICAgc2VsZi5zY3JpcHQuZXh0ZW5kKG90aGVyLnNjcmlwdCkKIAotICBkZWYgQXNzZXJ0T2VtUHJvcGVydHkoc2VsZiwgbmFtZSwgdmFsdWVzKToKKyAgZGVmIEFzc2VydE9lbVByb3BlcnR5KHNlbGYsIG5hbWUsIHZhbHVlcywgb2VtX25vX21vdW50KToKICAgICAiIiJBc3NlcnQgdGhhdCBhIHByb3BlcnR5IG9uIHRoZSBPRU0gcGFyaXRpdGlvbiBtYXRjaGVzIGFsbG93ZWQgdmFsdWVzLiIiIgogICAgIGlmIG5vdCBuYW1lOgogICAgICAgcmFpc2UgVmFsdWVFcnJvcigibXVzdCBzcGVjaWZ5IGFuIE9FTSBwcm9wZXJ0eSIpCiAgICAgaWYgbm90IHZhbHVlczoKICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm11c3Qgc3BlY2lmeSB0aGUgT0VNIHZhbHVlIikKLSAgICBnZXRfcHJvcF9jb21tYW5kID0gTm9uZQotICAgIGlmIGNvbW1vbi5PUFRJT05TLm9lbV9ub19tb3VudDoKKworICAgIGlmIG9lbV9ub19tb3VudDoKICAgICAgIGdldF9wcm9wX2NvbW1hbmQgPSAnZ2V0cHJvcCgiJXMiKScgJSBuYW1lCiAgICAgZWxzZToKICAgICAgIGdldF9wcm9wX2NvbW1hbmQgPSAnZmlsZV9nZXRwcm9wKCIvb2VtL29lbS5wcm9wIiwgIiVzIiknICUgbmFtZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2ltZ19mcm9tX3RhcmdldF9maWxlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9pbWdfZnJvbV90YXJnZXRfZmlsZXMucHkKaW5kZXggNDQyMmI1My4uZTZlOGM5ZiAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2ltZ19mcm9tX3RhcmdldF9maWxlcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvaW1nX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CkBAIC03MSw4ICs3MSw3IEBACiAgICAgY29tbW9uLlVzYWdlKF9fZG9jX18pCiAgICAgc3lzLmV4aXQoMSkKIAotICBPUFRJT05TLmlucHV0X3RtcCwgaW5wdXRfemlwID0gY29tbW9uLlVuemlwVGVtcCgKLSAgICAgIGFyZ3NbMF0sIFsiSU1BR0VTLyoiLCAiT1RBLyoiXSkKKyAgT1BUSU9OUy5pbnB1dF90bXAgPSBjb21tb24uVW56aXBUZW1wKGFyZ3NbMF0sIFsiSU1BR0VTLyoiLCAiT1RBLyoiXSkKICAgb3V0cHV0X3ppcCA9IHppcGZpbGUuWmlwRmlsZShhcmdzWzFdLCAidyIsIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQogICBDb3B5SW5mbyhvdXRwdXRfemlwKQogCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3RhcmdldF9maWxlcy5weQppbmRleCAzYmFhY2RjLi4zNGRiNzA2IDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkKQEAgLTIxLDkgKzIxLDYgQEAKIAogVXNhZ2U6ICBvdGFfZnJvbV90YXJnZXRfZmlsZXMgW2ZsYWdzXSBpbnB1dF90YXJnZXRfZmlsZXMgb3V0cHV0X290YV9wYWNrYWdlCiAKLSAgLS1ib2FyZF9jb25maWcgIDxmaWxlPgotICAgICAgRGVwcmVjYXRlZC4KLQogICAtayAoLS1wYWNrYWdlX2tleSkgPGtleT4gS2V5IHRvIHVzZSB0byBzaWduIHRoZSBwYWNrYWdlIChkZWZhdWx0IGlzCiAgICAgICB0aGUgdmFsdWUgb2YgZGVmYXVsdF9zeXN0ZW1fZGV2X2NlcnRpZmljYXRlIGZyb20gdGhlIGlucHV0CiAgICAgICB0YXJnZXQtZmlsZXMncyBNRVRBL21pc2NfaW5mby50eHQsIG9yCkBAIC00NiwxNCArNDMsMTYgQEAKICAgICAgIFNpbWlsYXIgdG8gLS1mdWxsX3JhZGlvLiBXaGVuIGdlbmVyYXRpbmcgYW4gaW5jcmVtZW50YWwgT1RBLCBhbHdheXMKICAgICAgIGluY2x1ZGUgYSBmdWxsIGNvcHkgb2YgYm9vdGxvYWRlciBpbWFnZS4KIAotICAtdiAgKC0tdmVyaWZ5KQotICAgICAgUmVtb3VudCBhbmQgdmVyaWZ5IHRoZSBjaGVja3N1bXMgb2YgdGhlIGZpbGVzIHdyaXR0ZW4gdG8gdGhlCi0gICAgICBzeXN0ZW0gYW5kIHZlbmRvciAoaWYgdXNlZCkgcGFydGl0aW9ucy4gIEluY3JlbWVudGFsIGJ1aWxkcyBvbmx5LgorICAtLXZlcmlmeQorICAgICAgUmVtb3VudCBhbmQgdmVyaWZ5IHRoZSBjaGVja3N1bXMgb2YgdGhlIGZpbGVzIHdyaXR0ZW4gdG8gdGhlIHN5c3RlbSBhbmQKKyAgICAgIHZlbmRvciAoaWYgdXNlZCkgcGFydGl0aW9ucy4gTm9uLUEvQiBpbmNyZW1lbnRhbCBPVEFzIG9ubHkuCiAKICAgLW8gICgtLW9lbV9zZXR0aW5ncykgIDxtYWluX2ZpbGVbLGFkZGl0aW9uYWxfZmlsZXMuLi5dPgogICAgICAgQ29tbWEgc2VwZXJhdGVkIGxpc3Qgb2YgZmlsZXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBleHBlY3RlZCBPRU0tc3BlY2lmaWMKLSAgICAgIHByb3BlcnRpZXMgb24gdGhlIE9FTSBwYXJ0aXRpb24gb2YgdGhlIGludGVuZGVkIGRldmljZS4KLSAgICAgIE11bHRpcGxlIGV4cGVjdGVkIHZhbHVlcyBjYW4gYmUgdXNlZCBieSBwcm92aWRpbmcgbXVsdGlwbGUgZmlsZXMuCisgICAgICBwcm9wZXJ0aWVzIG9uIHRoZSBPRU0gcGFydGl0aW9uIG9mIHRoZSBpbnRlbmRlZCBkZXZpY2UuIE11bHRpcGxlIGV4cGVjdGVkCisgICAgICB2YWx1ZXMgY2FuIGJlIHVzZWQgYnkgcHJvdmlkaW5nIG11bHRpcGxlIGZpbGVzLiBPbmx5IHRoZSBmaXJzdCBkaWN0IHdpbGwKKyAgICAgIGJlIHVzZWQgdG8gY29tcHV0ZSBmaW5nZXJwcmludCwgd2hpbGUgdGhlIHJlc3Qgd2lsbCBiZSB1c2VkIHRvIGFzc2VydAorICAgICAgT0VNLXNwZWNpZmljIHByb3BlcnRpZXMuCiAKICAgLS1vZW1fbm9fbW91bnQKICAgICAgIEZvciBkZXZpY2VzIHdpdGggT0VNLXNwZWNpZmljIHByb3BlcnRpZXMgYnV0IHdpdGhvdXQgYW4gT0VNIHBhcnRpdGlvbiwKQEAgLTYxLDcgKzYwLDcgQEAKICAgICAgIHZlcnkgcmFyZWx5IHVzZWQsIHNpbmNlIGl0J3MgZXhwZWN0ZWQgdG8gaGF2ZSBhIGRlZGljYXRlZCBPRU0gcGFydGl0aW9uCiAgICAgICBmb3IgT0VNLXNwZWNpZmljIHByb3BlcnRpZXMuIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIC1vIGlzIHNwZWNpZmllZC4KIAotICAtdyAgKC0td2lwZV91c2VyX2RhdGEpCisgIC0td2lwZV91c2VyX2RhdGEKICAgICAgIEdlbmVyYXRlIGFuIE9UQSBwYWNrYWdlIHRoYXQgd2lsbCB3aXBlIHRoZSB1c2VyIGRhdGEgcGFydGl0aW9uCiAgICAgICB3aGVuIGluc3RhbGxlZC4KIApAQCAtOTMsNiArOTIsMjQgQEAKICAgICAgIGZpcnN0LCBzbyB0aGF0IGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIHN5c3RlbSBwYXJ0aXRpb24gYXJlIGRvbmUKICAgICAgIHVzaW5nIHRoZSBuZXcgcmVjb3ZlcnkgKG5ldyBrZXJuZWwsIGV0Yy4pLgogCisgIC0taW5jbHVkZV9zZWNvbmRhcnkKKyAgICAgIEFkZGl0aW9uYWxseSBpbmNsdWRlIHRoZSBwYXlsb2FkIGZvciBzZWNvbmRhcnkgc2xvdCBpbWFnZXMgKGRlZmF1bHQ6CisgICAgICBGYWxzZSkuIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQS9CIE9UQXMuCisKKyAgICAgIEJ5IGRlZmF1bHQsIGFuIEEvQiBPVEEgcGFja2FnZSBkb2Vzbid0IGNvbnRhaW4gdGhlIGltYWdlcyBmb3IgdGhlCisgICAgICBzZWNvbmRhcnkgc2xvdCAoZS5nLiBzeXN0ZW1fb3RoZXIuaW1nKS4gU3BlY2lmeWluZyB0aGlzIGZsYWcgYWxsb3dzCisgICAgICBnZW5lcmF0aW5nIGEgc2VwYXJhdGUgcGF5bG9hZCB0aGF0IHdpbGwgaW5zdGFsbCBzZWNvbmRhcnkgc2xvdCBpbWFnZXMuCisKKyAgICAgIFN1Y2ggYSBwYWNrYWdlIG5lZWRzIHRvIGJlIGFwcGxpZWQgaW4gYSB0d28tc3RhZ2UgbWFubmVyLCB3aXRoIGEgcmVib290CisgICAgICBpbi1iZXR3ZWVuLiBEdXJpbmcgdGhlIGZpcnN0IHN0YWdlLCB0aGUgdXBkYXRlciBhcHBsaWVzIHRoZSBwcmltYXJ5CisgICAgICBwYXlsb2FkIG9ubHkuIFVwb24gZmluaXNoaW5nLCBpdCByZWJvb3RzIHRoZSBkZXZpY2UgaW50byB0aGUgbmV3bHkgdXBkYXRlZAorICAgICAgc2xvdC4gSXQgdGhlbiBjb250aW51ZXMgdG8gaW5zdGFsbCB0aGUgc2Vjb25kYXJ5IHBheWxvYWQgdG8gdGhlIGluYWN0aXZlCisgICAgICBzbG90LCBidXQgd2l0aG91dCBzd2l0Y2hpbmcgdGhlIGFjdGl2ZSBzbG90IGF0IHRoZSBlbmQgKG5lZWRzIHRoZSBtYXRjaGluZworICAgICAgc3VwcG9ydCBpbiB1cGRhdGVfZW5naW5lLCBpLmUuIFNXSVRDSF9TTE9UX09OX1JFQk9PVCBmbGFnKS4KKworICAgICAgRHVlIHRvIHRoZSBzcGVjaWFsIGluc3RhbGwgcHJvY2VkdXJlLCB0aGUgc2Vjb25kYXJ5IHBheWxvYWQgd2lsbCBiZSBhbHdheXMKKyAgICAgIGdlbmVyYXRlZCBhcyBhIGZ1bGwgcGF5bG9hZC4KKwogICAtLWJsb2NrCiAgICAgICBHZW5lcmF0ZSBhIGJsb2NrLWJhc2VkIE9UQSBmb3Igbm9uLUEvQiBkZXZpY2UuIFdlIGhhdmUgZGVwcmVjYXRlZCB0aGUKICAgICAgIHN1cHBvcnQgZm9yIGZpbGUtYmFzZWQgT1RBIHNpbmNlIE8uIEJsb2NrLWJhc2VkIE9UQSB3aWxsIGJlIHVzZWQgYnkKQEAgLTExMiw5ICsxMjksNiBAQAogICAgICAgU3BlY2lmaWVzIHRoZSB0aHJlc2hvbGQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bQogICAgICAgYWxsb3dlZCBzdGFzaCBzaXplIChkZWZhdWx0cyB0byAwLjgpLgogCi0gIC0tZ2VuX3ZlcmlmeQotICAgICAgR2VuZXJhdGUgYW4gT1RBIHBhY2thZ2UgdGhhdCB2ZXJpZmllcyB0aGUgcGFydGl0aW9ucy4KLQogICAtLWxvZ19kaWZmIDxmaWxlPgogICAgICAgR2VuZXJhdGUgYSBsb2cgZmlsZSB0aGF0IHNob3dzIHRoZSBkaWZmZXJlbmNlcyBpbiB0aGUgc291cmNlIGFuZCB0YXJnZXQKICAgICAgIGJ1aWxkcyBmb3IgYW4gaW5jcmVtZW50YWwgcGFja2FnZS4gVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4KQEAgLTEzMCwyNyArMTQ0LDMzIEBACiAKICAgLS1wYXlsb2FkX3NpZ25lcl9hcmdzIDxhcmdzPgogICAgICAgU3BlY2lmeSB0aGUgYXJndW1lbnRzIG5lZWRlZCBmb3IgcGF5bG9hZCBzaWduZXIuCisKKyAgLS1za2lwX3Bvc3RpbnN0YWxsCisgICAgICBTa2lwIHRoZSBwb3N0aW5zdGFsbCBob29rcyB3aGVuIGdlbmVyYXRpbmcgYW4gQS9CIE9UQSBwYWNrYWdlIChkZWZhdWx0OgorICAgICAgRmFsc2UpLiBOb3RlIHRoYXQgdGhpcyBkaXNjYXJkcyBBTEwgdGhlIGhvb2tzLCBpbmNsdWRpbmcgbm9uLW9wdGlvbmFsCisgICAgICBvbmVzLiBTaG91bGQgb25seSBiZSB1c2VkIGlmIGNhbGxlciBrbm93cyBpdCdzIHNhZmUgdG8gZG8gc28gKGUuZy4gYWxsIHRoZQorICAgICAgcG9zdGluc3RhbGwgd29yayBpcyB0byBkZXhvcHQgYXBwcyBhbmQgYSBkYXRhIHdpcGUgd2lsbCBoYXBwZW4gaW1tZWRpYXRlbHkKKyAgICAgIGFmdGVyKS4gT25seSBtZWFuaW5nZnVsIHdoZW4gZ2VuZXJhdGluZyBBL0IgT1RBcy4KICIiIgogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCiAKLWltcG9ydCBzeXMKLQotaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgotICBwcmludCgiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iLCBmaWxlPXN5cy5zdGRlcnIpCi0gIHN5cy5leGl0KDEpCi0KLWltcG9ydCBjb3B5CiBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCiBpbXBvcnQgb3MucGF0aAotaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzaGxleAoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHppcGZpbGUKIAogaW1wb3J0IGNvbW1vbgogaW1wb3J0IGVkaWZ5X2dlbmVyYXRvcgotaW1wb3J0IHNwYXJzZV9pbWcKKworaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgorICBwcmludCgiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iLCBmaWxlPXN5cy5zdGRlcnIpCisgIHN5cy5leGl0KDEpCisKIAogT1BUSU9OUyA9IGNvbW1vbi5PUFRJT05TCiBPUFRJT05TLnBhY2thZ2Vfa2V5ID0gTm9uZQpAQCAtMTY1LDI4ICsxODUsMzQ1IEBACiBpZiBPUFRJT05TLndvcmtlcl90aHJlYWRzID09IDA6CiAgIE9QVElPTlMud29ya2VyX3RocmVhZHMgPSAxCiBPUFRJT05TLnR3b19zdGVwID0gRmFsc2UKK09QVElPTlMuaW5jbHVkZV9zZWNvbmRhcnkgPSBGYWxzZQogT1BUSU9OUy5ub19zaWduaW5nID0gRmFsc2UKIE9QVElPTlMuYmxvY2tfYmFzZWQgPSBUcnVlCiBPUFRJT05TLnVwZGF0ZXJfYmluYXJ5ID0gTm9uZQogT1BUSU9OUy5vZW1fc291cmNlID0gTm9uZQogT1BUSU9OUy5vZW1fbm9fbW91bnQgPSBGYWxzZQotT1BUSU9OUy5mYWxsYmFja190b19mdWxsID0gVHJ1ZQogT1BUSU9OUy5mdWxsX3JhZGlvID0gRmFsc2UKIE9QVElPTlMuZnVsbF9ib290bG9hZGVyID0gRmFsc2UKICMgU3Rhc2ggc2l6ZSBjYW5ub3QgZXhjZWVkIGNhY2hlX3NpemUgKiB0aHJlc2hvbGQuCiBPUFRJT05TLmNhY2hlX3NpemUgPSBOb25lCiBPUFRJT05TLnN0YXNoX3RocmVzaG9sZCA9IDAuOAotT1BUSU9OUy5nZW5fdmVyaWZ5ID0gRmFsc2UKIE9QVElPTlMubG9nX2RpZmYgPSBOb25lCiBPUFRJT05TLnBheWxvYWRfc2lnbmVyID0gTm9uZQogT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzID0gW10KIE9QVElPTlMuZXh0cmFjdGVkX2lucHV0ID0gTm9uZQogT1BUSU9OUy5rZXlfcGFzc3dvcmRzID0gW10KK09QVElPTlMuc2tpcF9wb3N0aW5zdGFsbCA9IEZhbHNlCisKIAogTUVUQURBVEFfTkFNRSA9ICdNRVRBLUlORi9jb20vYW5kcm9pZC9tZXRhZGF0YScKK1BPU1RJTlNUQUxMX0NPTkZJRyA9ICdNRVRBL3Bvc3RpbnN0YWxsX2NvbmZpZy50eHQnCiBVTlpJUF9QQVRURVJOID0gWydJTUFHRVMvKicsICdNRVRBLyonXQogCiAKK2NsYXNzIEJ1aWxkSW5mbyhvYmplY3QpOgorICAiIiJBIGNsYXNzIHRoYXQgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGJ1aWxkLgorCisgIFRoaXMgY2xhc3Mgd3JhcHMgdXAgdGhlIHByb3BlcnR5IHF1ZXJ5aW5nIGZvciBhIGdpdmVuIHNvdXJjZSBvciB0YXJnZXQgYnVpbGQuCisgIEl0IGFic3RyYWN0cyBhd2F5IHRoZSBsb2dpYyBvZiBoYW5kbGluZyBPRU0tc3BlY2lmaWMgcHJvcGVydGllcywgYW5kIGNhY2hlcworICB0aGUgY29tbW9ubHkgdXNlZCBwcm9wZXJ0aWVzIHN1Y2ggYXMgZmluZ2VycHJpbnQuCisKKyAgVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBpbmZvIGRpY3RzOiBhKSBidWlsZC10aW1lIGluZm8gZGljdCwgd2hpY2ggaXMgZ2VuZXJhdGVkCisgIGF0IGJ1aWxkIHRpbWUgKGkuZS4gaW5jbHVkZWQgaW4gYSB0YXJnZXRfZmlsZXMgemlwKTsgYikgT0VNIGluZm8gZGljdCB0aGF0IGlzCisgIHNwZWNpZmllZCBhdCBwYWNrYWdlIGdlbmVyYXRpb24gdGltZSAodmlhIGNvbW1hbmQgbGluZSBhcmd1bWVudAorICAnLS1vZW1fc2V0dGluZ3MnKS4gSWYgYSBidWlsZCBkb2Vzbid0IHVzZSBPRU0tc3BlY2lmaWMgcHJvcGVydGllcyAoaS5lLiBub3QKKyAgaGF2aW5nICJvZW1fZmluZ2VycHJpbnRfcHJvcGVydGllcyIgaW4gYnVpbGQtdGltZSBpbmZvIGRpY3QpLCBhbGwgdGhlIHF1ZXJpZXMKKyAgd291bGQgYmUgYW5zd2VyZWQgYmFzZWQgb24gYnVpbGQtdGltZSBpbmZvIGRpY3Qgb25seS4gT3RoZXJ3aXNlIGlmIHVzaW5nCisgIE9FTS1zcGVjaWZpYyBwcm9wZXJ0aWVzLCBzb21lIG9mIHRoZW0gd2lsbCBiZSBjYWxjdWxhdGVkIGZyb20gdHdvIGluZm8gZGljdHMuCisKKyAgVXNlcnMgY2FuIHF1ZXJ5IHByb3BlcnRpZXMgc2ltaWxhcmx5IGFzIHVzaW5nIGEgZGljdCgpIChlLmcuIGluZm9bJ2ZzdGFiJ10pLAorICBvciB0byBxdWVyeSBidWlsZCBwcm9wZXJ0aWVzIHZpYSBHZXRCdWlsZFByb3AoKSBvciBHZXRWZW5kb3JCdWlsZFByb3AoKS4KKworICBBdHRyaWJ1dGVzOgorICAgIGluZm9fZGljdDogVGhlIGJ1aWxkLXRpbWUgaW5mbyBkaWN0LgorICAgIGlzX2FiOiBXaGV0aGVyIGl0J3MgYSBidWlsZCB0aGF0IHVzZXMgQS9CIE9UQS4KKyAgICBvZW1fZGljdHM6IEEgbGlzdCBvZiBPRU0gZGljdHMuCisgICAgb2VtX3Byb3BzOiBBIGxpc3Qgb2YgT0VNIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgcmVhZCBmcm9tIE9FTSBkaWN0czsgTm9uZQorICAgICAgICBpZiB0aGUgYnVpbGQgZG9lc24ndCB1c2UgYW55IE9FTS1zcGVjaWZpYyBwcm9wZXJ0eS4KKyAgICBmaW5nZXJwcmludDogVGhlIGZpbmdlcnByaW50IG9mIHRoZSBidWlsZCwgd2hpY2ggd291bGQgYmUgY2FsY3VsYXRlZCBiYXNlZAorICAgICAgICBvbiBPRU0gcHJvcGVydGllcyBpZiBhcHBsaWNhYmxlLgorICAgIGRldmljZTogVGhlIGRldmljZSBuYW1lLCB3aGljaCBjb3VsZCBjb21lIGZyb20gT0VNIGRpY3RzIGlmIGFwcGxpY2FibGUuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmZvX2RpY3QsIG9lbV9kaWN0cyk6CisgICAgIiIiSW5pdGlhbGl6ZXMgYSBCdWlsZEluZm8gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gZGljdHMuCisKKyAgICBBcmd1bWVudHM6CisgICAgICBpbmZvX2RpY3Q6IFRoZSBidWlsZC10aW1lIGluZm8gZGljdC4KKyAgICAgIG9lbV9kaWN0czogQSBsaXN0IG9mIE9FTSBkaWN0cyAod2hpY2ggaXMgcGFyc2VkIGZyb20gLS1vZW1fc2V0dGluZ3MpLiBOb3RlCisgICAgICAgICAgdGhhdCBpdCBhbHdheXMgdXNlcyB0aGUgZmlyc3QgZGljdCB0byBjYWxjdWxhdGUgdGhlIGZpbmdlcnByaW50IG9yIHRoZQorICAgICAgICAgIGRldmljZSBuYW1lLiBUaGUgcmVzdCB3b3VsZCBiZSB1c2VkIGZvciBhc3NlcnRpbmcgT0VNIHByb3BlcnRpZXMgb25seQorICAgICAgICAgIChlLmcuICBvbmUgcGFja2FnZSBjYW4gYmUgaW5zdGFsbGVkIG9uIG9uZSBvZiB0aGVzZSBkZXZpY2VzKS4KKyAgICAiIiIKKyAgICBzZWxmLmluZm9fZGljdCA9IGluZm9fZGljdAorICAgIHNlbGYub2VtX2RpY3RzID0gb2VtX2RpY3RzCisKKyAgICBzZWxmLl9pc19hYiA9IGluZm9fZGljdC5nZXQoImFiX3VwZGF0ZSIpID09ICJ0cnVlIgorICAgIHNlbGYuX29lbV9wcm9wcyA9IGluZm9fZGljdC5nZXQoIm9lbV9maW5nZXJwcmludF9wcm9wZXJ0aWVzIikKKworICAgIGlmIHNlbGYuX29lbV9wcm9wczoKKyAgICAgIGFzc2VydCBvZW1fZGljdHMsICJPRU0gc291cmNlIHJlcXVpcmVkIGZvciB0aGlzIGJ1aWxkIgorCisgICAgIyBUaGVzZSB0d28gc2hvdWxkIGJlIGNvbXB1dGVkIG9ubHkgYWZ0ZXIgc2V0dGluZyBzZWxmLl9vZW1fcHJvcHMuCisgICAgc2VsZi5fZGV2aWNlID0gc2VsZi5HZXRPZW1Qcm9wZXJ0eSgicm8ucHJvZHVjdC5kZXZpY2UiKQorICAgIHNlbGYuX2ZpbmdlcnByaW50ID0gc2VsZi5DYWxjdWxhdGVGaW5nZXJwcmludCgpCisKKyAgQHByb3BlcnR5CisgIGRlZiBpc19hYihzZWxmKToKKyAgICByZXR1cm4gc2VsZi5faXNfYWIKKworICBAcHJvcGVydHkKKyAgZGVmIGRldmljZShzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fZGV2aWNlCisKKyAgQHByb3BlcnR5CisgIGRlZiBmaW5nZXJwcmludChzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fZmluZ2VycHJpbnQKKworICBAcHJvcGVydHkKKyAgZGVmIG9lbV9wcm9wcyhzZWxmKToKKyAgICByZXR1cm4gc2VsZi5fb2VtX3Byb3BzCisKKyAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgcmV0dXJuIHNlbGYuaW5mb19kaWN0W2tleV0KKworICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICByZXR1cm4gc2VsZi5pbmZvX2RpY3QuZ2V0KGtleSwgZGVmYXVsdCkKKworICBkZWYgR2V0QnVpbGRQcm9wKHNlbGYsIHByb3ApOgorICAgICIiIlJldHVybnMgdGhlIGlucXVpcmVkIGJ1aWxkIHByb3BlcnR5LiIiIgorICAgIHRyeToKKyAgICAgIHJldHVybiBzZWxmLmluZm9fZGljdC5nZXQoImJ1aWxkLnByb3AiLCB7fSlbcHJvcF0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICByYWlzZSBjb21tb24uRXh0ZXJuYWxFcnJvcigiY291bGRuJ3QgZmluZCAlcyBpbiBidWlsZC5wcm9wIiAlIChwcm9wLCkpCisKKyAgZGVmIEdldFZlbmRvckJ1aWxkUHJvcChzZWxmLCBwcm9wKToKKyAgICAiIiJSZXR1cm5zIHRoZSBpbnF1aXJlZCB2ZW5kb3IgYnVpbGQgcHJvcGVydHkuIiIiCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHNlbGYuaW5mb19kaWN0LmdldCgidmVuZG9yLmJ1aWxkLnByb3AiLCB7fSlbcHJvcF0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICByYWlzZSBjb21tb24uRXh0ZXJuYWxFcnJvcigKKyAgICAgICAgICAiY291bGRuJ3QgZmluZCAlcyBpbiB2ZW5kb3IuYnVpbGQucHJvcCIgJSAocHJvcCwpKQorCisgIGRlZiBHZXRPZW1Qcm9wZXJ0eShzZWxmLCBrZXkpOgorICAgIGlmIHNlbGYub2VtX3Byb3BzIGlzIG5vdCBOb25lIGFuZCBrZXkgaW4gc2VsZi5vZW1fcHJvcHM6CisgICAgICByZXR1cm4gc2VsZi5vZW1fZGljdHNbMF1ba2V5XQorICAgIHJldHVybiBzZWxmLkdldEJ1aWxkUHJvcChrZXkpCisKKyAgZGVmIENhbGN1bGF0ZUZpbmdlcnByaW50KHNlbGYpOgorICAgIGlmIHNlbGYub2VtX3Byb3BzIGlzIE5vbmU6CisgICAgICByZXR1cm4gc2VsZi5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLmZpbmdlcnByaW50IikKKyAgICByZXR1cm4gIiVzLyVzLyVzOiVzIiAlICgKKyAgICAgICAgc2VsZi5HZXRPZW1Qcm9wZXJ0eSgicm8ucHJvZHVjdC5icmFuZCIpLAorICAgICAgICBzZWxmLkdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0Lm5hbWUiKSwKKyAgICAgICAgc2VsZi5HZXRPZW1Qcm9wZXJ0eSgicm8ucHJvZHVjdC5kZXZpY2UiKSwKKyAgICAgICAgc2VsZi5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLnRodW1icHJpbnQiKSkKKworICBkZWYgV3JpdGVNb3VudE9lbVNjcmlwdChzZWxmLCBzY3JpcHQpOgorICAgIGFzc2VydCBzZWxmLm9lbV9wcm9wcyBpcyBub3QgTm9uZQorICAgIHJlY292ZXJ5X21vdW50X29wdGlvbnMgPSBzZWxmLmluZm9fZGljdC5nZXQoInJlY292ZXJ5X21vdW50X29wdGlvbnMiKQorICAgIHNjcmlwdC5Nb3VudCgiL29lbSIsIHJlY292ZXJ5X21vdW50X29wdGlvbnMpCisKKyAgZGVmIFdyaXRlRGV2aWNlQXNzZXJ0aW9ucyhzZWxmLCBzY3JpcHQsIG9lbV9ub19tb3VudCk6CisgICAgIyBSZWFkIHRoZSBwcm9wZXJ0eSBkaXJlY3RseSBpZiBub3QgdXNpbmcgT0VNIHByb3BlcnRpZXMuCisgICAgaWYgbm90IHNlbGYub2VtX3Byb3BzOgorICAgICAgc2NyaXB0LkFzc2VydERldmljZShzZWxmLmRldmljZSkKKyAgICAgIHJldHVybgorCisgICAgIyBPdGhlcndpc2UgYXNzZXJ0IE9FTSBwcm9wZXJ0aWVzLgorICAgIGlmIG5vdCBzZWxmLm9lbV9kaWN0czoKKyAgICAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKAorICAgICAgICAgICJObyBPRU0gZmlsZSBwcm92aWRlZCB0byBhbnN3ZXIgZXhwZWN0ZWQgYXNzZXJ0aW9ucyIpCisKKyAgICBmb3IgcHJvcCBpbiBzZWxmLm9lbV9wcm9wcy5zcGxpdCgpOgorICAgICAgdmFsdWVzID0gW10KKyAgICAgIGZvciBvZW1fZGljdCBpbiBzZWxmLm9lbV9kaWN0czoKKyAgICAgICAgaWYgcHJvcCBpbiBvZW1fZGljdDoKKyAgICAgICAgICB2YWx1ZXMuYXBwZW5kKG9lbV9kaWN0W3Byb3BdKQorICAgICAgaWYgbm90IHZhbHVlczoKKyAgICAgICAgcmFpc2UgY29tbW9uLkV4dGVybmFsRXJyb3IoCisgICAgICAgICAgICAiVGhlIE9FTSBmaWxlIGlzIG1pc3NpbmcgdGhlIHByb3BlcnR5ICVzIiAlIChwcm9wLCkpCisgICAgICBzY3JpcHQuQXNzZXJ0T2VtUHJvcGVydHkocHJvcCwgdmFsdWVzLCBvZW1fbm9fbW91bnQpCisKKworY2xhc3MgUGF5bG9hZFNpZ25lcihvYmplY3QpOgorICAiIiJBIGNsYXNzIHRoYXQgd3JhcHMgdGhlIHBheWxvYWQgc2lnbmluZyB3b3Jrcy4KKworICBXaGVuIGdlbmVyYXRpbmcgYSBQYXlsb2FkLCBoYXNoZXMgb2YgdGhlIHBheWxvYWQgYW5kIG1ldGFkYXRhIGZpbGVzIHdpbGwgYmUKKyAgc2lnbmVkIHdpdGggdGhlIGRldmljZSBrZXksIGVpdGhlciBieSBjYWxsaW5nIGFuIGV4dGVybmFsIHBheWxvYWQgc2lnbmVyIG9yCisgIGJ5IGNhbGxpbmcgb3BlbnNzbCB3aXRoIHRoZSBwYWNrYWdlIGtleS4gVGhpcyBjbGFzcyBwcm92aWRlcyBhIHVuaWZpZWQKKyAgaW50ZXJmYWNlLCBzbyB0aGF0IGNhbGxlcnMgY2FuIGp1c3QgY2FsbCBQYXlsb2FkU2lnbmVyLlNpZ24oKS4KKworICBJZiBhbiBleHRlcm5hbCBwYXlsb2FkIHNpZ25lciBoYXMgYmVlbiBzcGVjaWZpZWQgKE9QVElPTlMucGF5bG9hZF9zaWduZXIpLCBpdAorICBjYWxscyB0aGUgc2lnbmVyIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3MgKE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncykuIE5vdGUKKyAgdGhhdCB0aGUgc2lnbmluZyBrZXkgc2hvdWxkIGJlIHByb3ZpZGVkIGFzIHBhcnQgb2YgdGhlIHBheWxvYWRfc2lnbmVyX2FyZ3MuCisgIE90aGVyd2lzZSB3aXRob3V0IGFuIGV4dGVybmFsIHNpZ25lciwgaXQgdXNlcyB0aGUgcGFja2FnZSBrZXkKKyAgKE9QVElPTlMucGFja2FnZV9rZXkpIGFuZCBjYWxscyBvcGVuc3NsIGZvciB0aGUgc2lnbmluZyB3b3Jrcy4KKyAgIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIGlmIE9QVElPTlMucGF5bG9hZF9zaWduZXIgaXMgTm9uZToKKyAgICAgICMgUHJlcGFyZSB0aGUgcGF5bG9hZCBzaWduaW5nIGtleS4KKyAgICAgIHByaXZhdGVfa2V5ID0gT1BUSU9OUy5wYWNrYWdlX2tleSArIE9QVElPTlMucHJpdmF0ZV9rZXlfc3VmZml4CisgICAgICBwdyA9IE9QVElPTlMua2V5X3Bhc3N3b3Jkc1tPUFRJT05TLnBhY2thZ2Vfa2V5XQorCisgICAgICBjbWQgPSBbIm9wZW5zc2wiLCAicGtjczgiLCAiLWluIiwgcHJpdmF0ZV9rZXksICItaW5mb3JtIiwgIkRFUiJdCisgICAgICBjbWQuZXh0ZW5kKFsiLXBhc3NpbiIsICJwYXNzOiIgKyBwd10gaWYgcHcgZWxzZSBbIi1ub2NyeXB0Il0pCisgICAgICBzaWduaW5nX2tleSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJrZXktIiwgc3VmZml4PSIua2V5IikKKyAgICAgIGNtZC5leHRlbmQoWyItb3V0Iiwgc2lnbmluZ19rZXldKQorCisgICAgICBnZXRfc2lnbmluZ19rZXkgPSBjb21tb24uUnVuKGNtZCwgdmVyYm9zZT1GYWxzZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgc3Rkb3V0ZGF0YSwgXyA9IGdldF9zaWduaW5nX2tleS5jb21tdW5pY2F0ZSgpCisgICAgICBhc3NlcnQgZ2V0X3NpZ25pbmdfa2V5LnJldHVybmNvZGUgPT0gMCwgXAorICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHNpZ25pbmcga2V5OiB7fSIuZm9ybWF0KHN0ZG91dGRhdGEpCisKKyAgICAgIHNlbGYuc2lnbmVyID0gIm9wZW5zc2wiCisgICAgICBzZWxmLnNpZ25lcl9hcmdzID0gWyJwa2V5dXRsIiwgIi1zaWduIiwgIi1pbmtleSIsIHNpZ25pbmdfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiLXBrZXlvcHQiLCAiZGlnZXN0OnNoYTI1NiJdCisgICAgZWxzZToKKyAgICAgIHNlbGYuc2lnbmVyID0gT1BUSU9OUy5wYXlsb2FkX3NpZ25lcgorICAgICAgc2VsZi5zaWduZXJfYXJncyA9IE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncworCisgIGRlZiBTaWduKHNlbGYsIGluX2ZpbGUpOgorICAgICIiIlNpZ25zIHRoZSBnaXZlbiBpbnB1dCBmaWxlLiBSZXR1cm5zIHRoZSBvdXRwdXQgZmlsZW5hbWUuIiIiCisgICAgb3V0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnbmVkLSIsIHN1ZmZpeD0iLmJpbiIpCisgICAgY21kID0gW3NlbGYuc2lnbmVyXSArIHNlbGYuc2lnbmVyX2FyZ3MgKyBbJy1pbicsIGluX2ZpbGUsICctb3V0Jywgb3V0X2ZpbGVdCisgICAgc2lnbmluZyA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgc3Rkb3V0ZGF0YSwgXyA9IHNpZ25pbmcuY29tbXVuaWNhdGUoKQorICAgIGFzc2VydCBzaWduaW5nLnJldHVybmNvZGUgPT0gMCwgXAorICAgICAgICAiRmFpbGVkIHRvIHNpZ24gdGhlIGlucHV0IGZpbGU6IHt9Ii5mb3JtYXQoc3Rkb3V0ZGF0YSkKKyAgICByZXR1cm4gb3V0X2ZpbGUKKworCitjbGFzcyBQYXlsb2FkKG9iamVjdCk6CisgICIiIk1hbmFnZXMgdGhlIGNyZWF0aW9uIGFuZCB0aGUgc2lnbmluZyBvZiBhbiBBL0IgT1RBIFBheWxvYWQuIiIiCisKKyAgUEFZTE9BRF9CSU4gPSAncGF5bG9hZC5iaW4nCisgIFBBWUxPQURfUFJPUEVSVElFU19UWFQgPSAncGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCcKKyAgU0VDT05EQVJZX1BBWUxPQURfQklOID0gJ3NlY29uZGFyeS9wYXlsb2FkLmJpbicKKyAgU0VDT05EQVJZX1BBWUxPQURfUFJPUEVSVElFU19UWFQgPSAnc2Vjb25kYXJ5L3BheWxvYWRfcHJvcGVydGllcy50eHQnCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHNlY29uZGFyeT1GYWxzZSk6CisgICAgIiIiSW5pdGlhbGl6ZXMgYSBQYXlsb2FkIGluc3RhbmNlLgorCisgICAgQXJnczoKKyAgICAgIHNlY29uZGFyeTogV2hldGhlciBpdCdzIGdlbmVyYXRpbmcgYSBzZWNvbmRhcnkgcGF5bG9hZCAoZGVmYXVsdDogRmFsc2UpLgorICAgICIiIgorICAgICMgVGhlIHBsYWNlIHdoZXJlIHRoZSBvdXRwdXQgZnJvbSB0aGUgc3VicHJvY2VzcyBzaG91bGQgZ28uCisgICAgc2VsZi5fbG9nX2ZpbGUgPSBzeXMuc3Rkb3V0IGlmIE9QVElPTlMudmVyYm9zZSBlbHNlIHN1YnByb2Nlc3MuUElQRQorICAgIHNlbGYucGF5bG9hZF9maWxlID0gTm9uZQorICAgIHNlbGYucGF5bG9hZF9wcm9wZXJ0aWVzID0gTm9uZQorICAgIHNlbGYuc2Vjb25kYXJ5ID0gc2Vjb25kYXJ5CisKKyAgZGVmIEdlbmVyYXRlKHNlbGYsIHRhcmdldF9maWxlLCBzb3VyY2VfZmlsZT1Ob25lLCBhZGRpdGlvbmFsX2FyZ3M9Tm9uZSk6CisgICAgIiIiR2VuZXJhdGVzIGEgcGF5bG9hZCBmcm9tIHRoZSBnaXZlbiB0YXJnZXQtZmlsZXMgemlwKHMpLgorCisgICAgQXJnczoKKyAgICAgIHRhcmdldF9maWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIHRhcmdldCBidWlsZCB0YXJnZXQtZmlsZXMgemlwLgorICAgICAgc291cmNlX2ZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGJ1aWxkIHRhcmdldC1maWxlcyB6aXA7IG9yIE5vbmUgaWYKKyAgICAgICAgICBnZW5lcmF0aW5nIGEgZnVsbCBPVEEuCisgICAgICBhZGRpdGlvbmFsX2FyZ3M6IEEgbGlzdCBvZiBhZGRpdGlvbmFsIGFyZ3MgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvCisgICAgICAgICAgYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIHNjcmlwdDsgb3IgTm9uZS4KKyAgICAiIiIKKyAgICBpZiBhZGRpdGlvbmFsX2FyZ3MgaXMgTm9uZToKKyAgICAgIGFkZGl0aW9uYWxfYXJncyA9IFtdCisKKyAgICBwYXlsb2FkX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0icGF5bG9hZC0iLCBzdWZmaXg9Ii5iaW4iKQorICAgIGNtZCA9IFsiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIiwgImdlbmVyYXRlIiwKKyAgICAgICAgICAgIi0tcGF5bG9hZCIsIHBheWxvYWRfZmlsZSwKKyAgICAgICAgICAgIi0tdGFyZ2V0X2ltYWdlIiwgdGFyZ2V0X2ZpbGVdCisgICAgaWYgc291cmNlX2ZpbGUgaXMgbm90IE5vbmU6CisgICAgICBjbWQuZXh0ZW5kKFsiLS1zb3VyY2VfaW1hZ2UiLCBzb3VyY2VfZmlsZV0pCisgICAgY21kLmV4dGVuZChhZGRpdGlvbmFsX2FyZ3MpCisgICAgcCA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9c2VsZi5fbG9nX2ZpbGUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICBzdGRvdXRkYXRhLCBfID0gcC5jb21tdW5pY2F0ZSgpCisgICAgYXNzZXJ0IHAucmV0dXJuY29kZSA9PSAwLCBcCisgICAgICAgICJicmlsbG9fdXBkYXRlX3BheWxvYWQgZ2VuZXJhdGUgZmFpbGVkOiB7fSIuZm9ybWF0KHN0ZG91dGRhdGEpCisKKyAgICBzZWxmLnBheWxvYWRfZmlsZSA9IHBheWxvYWRfZmlsZQorICAgIHNlbGYucGF5bG9hZF9wcm9wZXJ0aWVzID0gTm9uZQorCisgIGRlZiBTaWduKHNlbGYsIHBheWxvYWRfc2lnbmVyKToKKyAgICAiIiJHZW5lcmF0ZXMgYW5kIHNpZ25zIHRoZSBoYXNoZXMgb2YgdGhlIHBheWxvYWQgYW5kIG1ldGFkYXRhLgorCisgICAgQXJnczoKKyAgICAgIHBheWxvYWRfc2lnbmVyOiBBIFBheWxvYWRTaWduZXIoKSBpbnN0YW5jZSB0aGF0IHNlcnZlcyB0aGUgc2lnbmluZyB3b3JrLgorCisgICAgUmFpc2VzOgorICAgICAgQXNzZXJ0aW9uRXJyb3I6IE9uIGFueSBmYWlsdXJlIHdoZW4gY2FsbGluZyBicmlsbG9fdXBkYXRlX3BheWxvYWQgc2NyaXB0LgorICAgICIiIgorICAgIGFzc2VydCBpc2luc3RhbmNlKHBheWxvYWRfc2lnbmVyLCBQYXlsb2FkU2lnbmVyKQorCisgICAgIyAxLiBHZW5lcmF0ZSBoYXNoZXMgb2YgdGhlIHBheWxvYWQgYW5kIG1ldGFkYXRhIGZpbGVzLgorICAgIHBheWxvYWRfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnLSIsIHN1ZmZpeD0iLmJpbiIpCisgICAgbWV0YWRhdGFfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnLSIsIHN1ZmZpeD0iLmJpbiIpCisgICAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAiaGFzaCIsCisgICAgICAgICAgICItLXVuc2lnbmVkX3BheWxvYWQiLCBzZWxmLnBheWxvYWRfZmlsZSwKKyAgICAgICAgICAgIi0tc2lnbmF0dXJlX3NpemUiLCAiMjU2IiwKKyAgICAgICAgICAgIi0tbWV0YWRhdGFfaGFzaF9maWxlIiwgbWV0YWRhdGFfc2lnX2ZpbGUsCisgICAgICAgICAgICItLXBheWxvYWRfaGFzaF9maWxlIiwgcGF5bG9hZF9zaWdfZmlsZV0KKyAgICBwMSA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9c2VsZi5fbG9nX2ZpbGUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICBwMS5jb21tdW5pY2F0ZSgpCisgICAgYXNzZXJ0IHAxLnJldHVybmNvZGUgPT0gMCwgImJyaWxsb191cGRhdGVfcGF5bG9hZCBoYXNoIGZhaWxlZCIKKworICAgICMgMi4gU2lnbiB0aGUgaGFzaGVzLgorICAgIHNpZ25lZF9wYXlsb2FkX3NpZ19maWxlID0gcGF5bG9hZF9zaWduZXIuU2lnbihwYXlsb2FkX3NpZ19maWxlKQorICAgIHNpZ25lZF9tZXRhZGF0YV9zaWdfZmlsZSA9IHBheWxvYWRfc2lnbmVyLlNpZ24obWV0YWRhdGFfc2lnX2ZpbGUpCisKKyAgICAjIDMuIEluc2VydCB0aGUgc2lnbmF0dXJlcyBiYWNrIGludG8gdGhlIHBheWxvYWQgZmlsZS4KKyAgICBzaWduZWRfcGF5bG9hZF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InNpZ25lZC1wYXlsb2FkLSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4PSIuYmluIikKKyAgICBjbWQgPSBbImJyaWxsb191cGRhdGVfcGF5bG9hZCIsICJzaWduIiwKKyAgICAgICAgICAgIi0tdW5zaWduZWRfcGF5bG9hZCIsIHNlbGYucGF5bG9hZF9maWxlLAorICAgICAgICAgICAiLS1wYXlsb2FkIiwgc2lnbmVkX3BheWxvYWRfZmlsZSwKKyAgICAgICAgICAgIi0tc2lnbmF0dXJlX3NpemUiLCAiMjU2IiwKKyAgICAgICAgICAgIi0tbWV0YWRhdGFfc2lnbmF0dXJlX2ZpbGUiLCBzaWduZWRfbWV0YWRhdGFfc2lnX2ZpbGUsCisgICAgICAgICAgICItLXBheWxvYWRfc2lnbmF0dXJlX2ZpbGUiLCBzaWduZWRfcGF5bG9hZF9zaWdfZmlsZV0KKyAgICBwMSA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9c2VsZi5fbG9nX2ZpbGUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICBwMS5jb21tdW5pY2F0ZSgpCisgICAgYXNzZXJ0IHAxLnJldHVybmNvZGUgPT0gMCwgImJyaWxsb191cGRhdGVfcGF5bG9hZCBzaWduIGZhaWxlZCIKKworICAgICMgNC4gRHVtcCB0aGUgc2lnbmVkIHBheWxvYWQgcHJvcGVydGllcy4KKyAgICBwcm9wZXJ0aWVzX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0icGF5bG9hZC1wcm9wZXJ0aWVzLSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9Ii50eHQiKQorICAgIGNtZCA9IFsiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIiwgInByb3BlcnRpZXMiLAorICAgICAgICAgICAiLS1wYXlsb2FkIiwgc2lnbmVkX3BheWxvYWRfZmlsZSwKKyAgICAgICAgICAgIi0tcHJvcGVydGllc19maWxlIiwgcHJvcGVydGllc19maWxlXQorICAgIHAxID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1zZWxmLl9sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgIHAxLmNvbW11bmljYXRlKCkKKyAgICBhc3NlcnQgcDEucmV0dXJuY29kZSA9PSAwLCAiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIHByb3BlcnRpZXMgZmFpbGVkIgorCisgICAgaWYgc2VsZi5zZWNvbmRhcnk6CisgICAgICB3aXRoIG9wZW4ocHJvcGVydGllc19maWxlLCAiYSIpIGFzIGY6CisgICAgICAgIGYud3JpdGUoIlNXSVRDSF9TTE9UX09OX1JFQk9PVD0wXG4iKQorCisgICAgaWYgT1BUSU9OUy53aXBlX3VzZXJfZGF0YToKKyAgICAgIHdpdGggb3Blbihwcm9wZXJ0aWVzX2ZpbGUsICJhIikgYXMgZjoKKyAgICAgICAgZi53cml0ZSgiUE9XRVJXQVNIPTFcbiIpCisKKyAgICBzZWxmLnBheWxvYWRfZmlsZSA9IHNpZ25lZF9wYXlsb2FkX2ZpbGUKKyAgICBzZWxmLnBheWxvYWRfcHJvcGVydGllcyA9IHByb3BlcnRpZXNfZmlsZQorCisgIGRlZiBXcml0ZVRvWmlwKHNlbGYsIG91dHB1dF96aXApOgorICAgICIiIldyaXRlcyB0aGUgcGF5bG9hZCB0byB0aGUgZ2l2ZW4gemlwLgorCisgICAgQXJnczoKKyAgICAgIG91dHB1dF96aXA6IFRoZSBvdXRwdXQgWmlwRmlsZSBpbnN0YW5jZS4KKyAgICAiIiIKKyAgICBhc3NlcnQgc2VsZi5wYXlsb2FkX2ZpbGUgaXMgbm90IE5vbmUKKyAgICBhc3NlcnQgc2VsZi5wYXlsb2FkX3Byb3BlcnRpZXMgaXMgbm90IE5vbmUKKworICAgIGlmIHNlbGYuc2Vjb25kYXJ5OgorICAgICAgcGF5bG9hZF9hcmNuYW1lID0gUGF5bG9hZC5TRUNPTkRBUllfUEFZTE9BRF9CSU4KKyAgICAgIHBheWxvYWRfcHJvcGVydGllc19hcmNuYW1lID0gUGF5bG9hZC5TRUNPTkRBUllfUEFZTE9BRF9QUk9QRVJUSUVTX1RYVAorICAgIGVsc2U6CisgICAgICBwYXlsb2FkX2FyY25hbWUgPSBQYXlsb2FkLlBBWUxPQURfQklOCisgICAgICBwYXlsb2FkX3Byb3BlcnRpZXNfYXJjbmFtZSA9IFBheWxvYWQuUEFZTE9BRF9QUk9QRVJUSUVTX1RYVAorCisgICAgIyBBZGQgdGhlIHNpZ25lZCBwYXlsb2FkIGZpbGUgYW5kIHByb3BlcnRpZXMgaW50byB0aGUgemlwLiBJbiBvcmRlciB0bworICAgICMgc3VwcG9ydCBzdHJlYW1pbmcsIHdlIHBhY2sgdGhlbSBhcyBaSVBfU1RPUkVELiBTbyB0aGVzZSBlbnRyaWVzIGNhbiBiZQorICAgICMgcmVhZCBkaXJlY3RseSB3aXRoIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBwYWlycy4KKyAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3ppcCwgc2VsZi5wYXlsb2FkX2ZpbGUsIGFyY25hbWU9cGF5bG9hZF9hcmNuYW1lLAorICAgICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKKyAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3ppcCwgc2VsZi5wYXlsb2FkX3Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgIGFyY25hbWU9cGF5bG9hZF9wcm9wZXJ0aWVzX2FyY25hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3R5cGU9emlwZmlsZS5aSVBfU1RPUkVEKQorCisKIGRlZiBTaWduT3V0cHV0KHRlbXBfemlwX25hbWUsIG91dHB1dF96aXBfbmFtZSk6CiAgIHB3ID0gT1BUSU9OUy5rZXlfcGFzc3dvcmRzW09QVElPTlMucGFja2FnZV9rZXldCiAKQEAgLTE5NCwzNyArNTMxLDE1IEBACiAgICAgICAgICAgICAgICAgICB3aG9sZV9maWxlPVRydWUpCiAKIAotZGVmIEFwcGVuZEFzc2VydGlvbnMoc2NyaXB0LCBpbmZvX2RpY3QsIG9lbV9kaWN0cz1Ob25lKToKLSAgb2VtX3Byb3BzID0gaW5mb19kaWN0LmdldCgib2VtX2ZpbmdlcnByaW50X3Byb3BlcnRpZXMiKQotICBpZiBub3Qgb2VtX3Byb3BzOgotICAgIGRldmljZSA9IEdldEJ1aWxkUHJvcCgicm8ucHJvZHVjdC5kZXZpY2UiLCBpbmZvX2RpY3QpCi0gICAgc2NyaXB0LkFzc2VydERldmljZShkZXZpY2UpCi0gIGVsc2U6Ci0gICAgaWYgbm90IG9lbV9kaWN0czoKLSAgICAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKAotICAgICAgICAgICJObyBPRU0gZmlsZSBwcm92aWRlZCB0byBhbnN3ZXIgZXhwZWN0ZWQgYXNzZXJ0aW9ucyIpCi0gICAgZm9yIHByb3AgaW4gb2VtX3Byb3BzLnNwbGl0KCk6Ci0gICAgICB2YWx1ZXMgPSBbXQotICAgICAgZm9yIG9lbV9kaWN0IGluIG9lbV9kaWN0czoKLSAgICAgICAgaWYgb2VtX2RpY3QuZ2V0KHByb3ApOgotICAgICAgICAgIHZhbHVlcy5hcHBlbmQob2VtX2RpY3RbcHJvcF0pCi0gICAgICBpZiBub3QgdmFsdWVzOgotICAgICAgICByYWlzZSBjb21tb24uRXh0ZXJuYWxFcnJvcigKLSAgICAgICAgICAgICJUaGUgT0VNIGZpbGUgaXMgbWlzc2luZyB0aGUgcHJvcGVydHkgJXMiICUgcHJvcCkKLSAgICAgIHNjcmlwdC5Bc3NlcnRPZW1Qcm9wZXJ0eShwcm9wLCB2YWx1ZXMpCi0KLQotZGVmIF9Mb2FkT2VtRGljdHMoc2NyaXB0LCByZWNvdmVyeV9tb3VudF9vcHRpb25zPU5vbmUpOgorZGVmIF9Mb2FkT2VtRGljdHMob2VtX3NvdXJjZSk6CiAgICIiIlJldHVybnMgdGhlIGxpc3Qgb2YgbG9hZGVkIE9FTSBwcm9wZXJ0aWVzIGRpY3QuIiIiCi0gIG9lbV9kaWN0cyA9IE5vbmUKLSAgaWYgT1BUSU9OUy5vZW1fc291cmNlIGlzIE5vbmU6Ci0gICAgcmFpc2UgY29tbW9uLkV4dGVybmFsRXJyb3IoIk9FTSBzb3VyY2UgcmVxdWlyZWQgZm9yIHRoaXMgYnVpbGQiKQotICBpZiBub3QgT1BUSU9OUy5vZW1fbm9fbW91bnQgYW5kIHNjcmlwdDoKLSAgICBzY3JpcHQuTW91bnQoIi9vZW0iLCByZWNvdmVyeV9tb3VudF9vcHRpb25zKQorICBpZiBub3Qgb2VtX3NvdXJjZToKKyAgICByZXR1cm4gTm9uZQorCiAgIG9lbV9kaWN0cyA9IFtdCi0gIGZvciBvZW1fZmlsZSBpbiBPUFRJT05TLm9lbV9zb3VyY2U6Ci0gICAgb2VtX2RpY3RzLmFwcGVuZChjb21tb24uTG9hZERpY3Rpb25hcnlGcm9tTGluZXMoCi0gICAgICAgIG9wZW4ob2VtX2ZpbGUpLnJlYWRsaW5lcygpKSkKKyAgZm9yIG9lbV9maWxlIGluIG9lbV9zb3VyY2U6CisgICAgd2l0aCBvcGVuKG9lbV9maWxlKSBhcyBmcDoKKyAgICAgIG9lbV9kaWN0cy5hcHBlbmQoY29tbW9uLkxvYWREaWN0aW9uYXJ5RnJvbUxpbmVzKGZwLnJlYWRsaW5lcygpKSkKICAgcmV0dXJuIG9lbV9kaWN0cwogCiAKQEAgLTI3NSwxMjYgKzU5MCwxMzcgQEAKICAgICByZXR1cm4gRmFsc2UKIAogCi1kZWYgR2V0T2VtUHJvcGVydHkobmFtZSwgb2VtX3Byb3BzLCBvZW1fZGljdCwgaW5mb19kaWN0KToKLSAgaWYgb2VtX3Byb3BzIGlzIG5vdCBOb25lIGFuZCBuYW1lIGluIG9lbV9wcm9wczoKLSAgICByZXR1cm4gb2VtX2RpY3RbbmFtZV0KLSAgcmV0dXJuIEdldEJ1aWxkUHJvcChuYW1lLCBpbmZvX2RpY3QpCitkZWYgSGFzVHJlYmxlRW5hYmxlZCh0YXJnZXRfZmlsZXNfemlwLCB0YXJnZXRfaW5mbyk6CisgIHJldHVybiAoSGFzVmVuZG9yUGFydGl0aW9uKHRhcmdldF9maWxlc196aXApIGFuZAorICAgICAgICAgIHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCgicm8udHJlYmxlLmVuYWJsZWQiKSA9PSAidHJ1ZSIpCiAKIAotZGVmIENhbGN1bGF0ZUZpbmdlcnByaW50KG9lbV9wcm9wcywgb2VtX2RpY3QsIGluZm9fZGljdCk6Ci0gIGlmIG9lbV9wcm9wcyBpcyBOb25lOgotICAgIHJldHVybiBHZXRCdWlsZFByb3AoInJvLmJ1aWxkLmZpbmdlcnByaW50IiwgaW5mb19kaWN0KQotICByZXR1cm4gIiVzLyVzLyVzOiVzIiAlICgKLSAgICAgIEdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0LmJyYW5kIiwgb2VtX3Byb3BzLCBvZW1fZGljdCwgaW5mb19kaWN0KSwKLSAgICAgIEdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0Lm5hbWUiLCBvZW1fcHJvcHMsIG9lbV9kaWN0LCBpbmZvX2RpY3QpLAotICAgICAgR2V0T2VtUHJvcGVydHkoInJvLnByb2R1Y3QuZGV2aWNlIiwgb2VtX3Byb3BzLCBvZW1fZGljdCwgaW5mb19kaWN0KSwKLSAgICAgIEdldEJ1aWxkUHJvcCgicm8uYnVpbGQudGh1bWJwcmludCIsIGluZm9fZGljdCkpCitkZWYgV3JpdGVGaW5nZXJwcmludEFzc2VydGlvbihzY3JpcHQsIHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbyk6CisgIHNvdXJjZV9vZW1fcHJvcHMgPSBzb3VyY2VfaW5mby5vZW1fcHJvcHMKKyAgdGFyZ2V0X29lbV9wcm9wcyA9IHRhcmdldF9pbmZvLm9lbV9wcm9wcworCisgIGlmIHNvdXJjZV9vZW1fcHJvcHMgaXMgTm9uZSBhbmQgdGFyZ2V0X29lbV9wcm9wcyBpcyBOb25lOgorICAgIHNjcmlwdC5Bc3NlcnRTb21lRmluZ2VycHJpbnQoCisgICAgICAgIHNvdXJjZV9pbmZvLmZpbmdlcnByaW50LCB0YXJnZXRfaW5mby5maW5nZXJwcmludCkKKyAgZWxpZiBzb3VyY2Vfb2VtX3Byb3BzIGlzIG5vdCBOb25lIGFuZCB0YXJnZXRfb2VtX3Byb3BzIGlzIG5vdCBOb25lOgorICAgIHNjcmlwdC5Bc3NlcnRTb21lVGh1bWJwcmludCgKKyAgICAgICAgdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKCJyby5idWlsZC50aHVtYnByaW50IiksCisgICAgICAgIHNvdXJjZV9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQudGh1bWJwcmludCIpKQorICBlbGlmIHNvdXJjZV9vZW1fcHJvcHMgaXMgTm9uZSBhbmQgdGFyZ2V0X29lbV9wcm9wcyBpcyBub3QgTm9uZToKKyAgICBzY3JpcHQuQXNzZXJ0RmluZ2VycHJpbnRPclRodW1icHJpbnQoCisgICAgICAgIHNvdXJjZV9pbmZvLmZpbmdlcnByaW50LAorICAgICAgICB0YXJnZXRfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLnRodW1icHJpbnQiKSkKKyAgZWxzZToKKyAgICBzY3JpcHQuQXNzZXJ0RmluZ2VycHJpbnRPclRodW1icHJpbnQoCisgICAgICAgIHRhcmdldF9pbmZvLmZpbmdlcnByaW50LAorICAgICAgICBzb3VyY2VfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLnRodW1icHJpbnQiKSkKIAogCi1kZWYgR2V0SW1hZ2Uod2hpY2gsIHRtcGRpcik6Ci0gICIiIlJldHVybnMgYW4gaW1hZ2Ugb2JqZWN0IHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIEJsb2NrSW1hZ2VEaWZmLgotCi0gICd3aGljaCcgcGFydGl0aW9uIG11c3QgYmUgInN5c3RlbSIgb3IgInZlbmRvciIuIEEgcHJlYnVpbHQgaW1hZ2UgYW5kIGZpbGUKLSAgbWFwIG11c3QgYWxyZWFkeSBleGlzdCBpbiB0bXBkaXIuCi0gICIiIgotCi0gIGFzc2VydCB3aGljaCBpbiAoInN5c3RlbSIsICJ2ZW5kb3IiKQotCi0gIHBhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAiSU1BR0VTIiwgd2hpY2ggKyAiLmltZyIpCi0gIG1hcHBhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAiSU1BR0VTIiwgd2hpY2ggKyAiLm1hcCIpCi0KLSAgIyBUaGUgaW1hZ2UgYW5kIG1hcCBmaWxlcyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHByaW9yIHRvIGNhbGxpbmcKLSAgIyBvdGFfZnJvbV90YXJnZXRfZmlsZXMucHkgKHNpbmNlIExNUCkuCi0gIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhwYXRoKSBhbmQgb3MucGF0aC5leGlzdHMobWFwcGF0aCkKLQotICAjIEJ1ZzogaHR0cDovL2IvMjA5MzkxMzEKLSAgIyBJbiBleHQ0IGZpbGVzeXN0ZW1zLCBibG9jayAwIG1pZ2h0IGJlIGNoYW5nZWQgZXZlbiBiZWluZyBtb3VudGVkCi0gICMgUi9PLiBXZSBhZGQgaXQgdG8gY2xvYmJlcmVkX2Jsb2NrcyBzbyB0aGF0IGl0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUKLSAgIyB0YXJnZXQgdW5jb25kaXRpb25hbGx5LiBOb3RlIHRoYXQgdGhleSBhcmUgc3RpbGwgcGFydCBvZiBjYXJlX21hcC4KLSAgY2xvYmJlcmVkX2Jsb2NrcyA9ICIwIgotCi0gIHJldHVybiBzcGFyc2VfaW1nLlNwYXJzZUltYWdlKHBhdGgsIG1hcHBhdGgsIGNsb2JiZXJlZF9ibG9ja3MpCi0KLQotZGVmIEFkZENvbXBhdGliaWxpdHlBcmNoaXZlKHRhcmdldF96aXAsIG91dHB1dF96aXAsIHN5c3RlbV9pbmNsdWRlZD1UcnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcl9pbmNsdWRlZD1UcnVlKToKLSAgIiIiQWRkcyBjb21wYXRpYmlsaXR5IGluZm8gZnJvbSB0YXJnZXQgZmlsZXMgaW50byB0aGUgb3V0cHV0IHppcC4KK2RlZiBBZGRDb21wYXRpYmlsaXR5QXJjaGl2ZUlmVHJlYmxlRW5hYmxlZCh0YXJnZXRfemlwLCBvdXRwdXRfemlwLCB0YXJnZXRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfaW5mbz1Ob25lKToKKyAgIiIiQWRkcyBjb21wYXRpYmlsaXR5IGluZm8gaW50byB0aGUgb3V0cHV0IHppcCBpZiBpdCdzIFRyZWJsZS1lbmFibGVkIHRhcmdldC4KIAogICBNZXRhZGF0YSB1c2VkIGZvciBvbi1kZXZpY2UgY29tcGF0aWJpbGl0eSB2ZXJpZmljYXRpb24gaXMgcmV0cmlldmVkIGZyb20KICAgdGFyZ2V0X3ppcCB0aGVuIGFkZGVkIHRvIGNvbXBhdGliaWxpdHkuemlwIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBvdXRwdXRfemlwCiAgIGFyY2hpdmUuCiAKLSAgQ29tcGF0aWJpbGl0eSBhcmNoaXZlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZvciBkZXZpY2VzIHdpdGggYSB2ZW5kb3IKLSAgcGFydGl0aW9uIGFzIGNoZWNraW5nIHByb3ZpZGVzIHZhbHVlIHdoZW4gc3lzdGVtIGFuZCB2ZW5kb3IgYXJlIGluZGVwZW5kZW50bHkKLSAgdmVyc2lvbmVkLgorICBDb21wYXRpYmlsaXR5IGFyY2hpdmUgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZm9yIGRldmljZXMgdGhhdCBoYXZlIGVuYWJsZWQKKyAgVHJlYmxlIHN1cHBvcnQuCiAKICAgQXJnczoKICAgICB0YXJnZXRfemlwOiBaaXAgZmlsZSBjb250YWluaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYmUgaW5jbHVkZWQgZm9yIE9UQS4KICAgICBvdXRwdXRfemlwOiBaaXAgZmlsZSB0aGF0IHdpbGwgYmUgc2VudCBmb3IgT1RBLgotICAgIHN5c3RlbV9pbmNsdWRlZDogSWYgVHJ1ZSwgdGhlIHN5c3RlbSBpbWFnZSB3aWxsIGJlIHVwZGF0ZWQgYW5kIHRoZXJlZm9yZQotICAgICAgICBpdHMgbWV0YWRhdGEgc2hvdWxkIGJlIGluY2x1ZGVkLgotICAgIHZlbmRvcl9pbmNsdWRlZDogSWYgVHJ1ZSwgdGhlIHZlbmRvciBpbWFnZSB3aWxsIGJlIHVwZGF0ZWQgYW5kIHRoZXJlZm9yZQotICAgICAgICBpdHMgbWV0YWRhdGEgc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgIHRhcmdldF9pbmZvOiBUaGUgQnVpbGRJbmZvIGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHRhcmdldCBidWlsZCBpbmZvLgorICAgIHNvdXJjZV9pbmZvOiBUaGUgQnVpbGRJbmZvIGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHNvdXJjZSBidWlsZCBpbmZvLCBpZgorICAgICAgICBnZW5lcmF0aW5nIGFuIGluY3JlbWVudGFsIE9UQTsgTm9uZSBvdGhlcndpc2UuCiAgICIiIgogCi0gICMgRGV0ZXJtaW5lIHdoYXQgbWV0YWRhdGEgd2UgbmVlZC4gRmlsZXMgYXJlIG5hbWVzIHJlbGF0aXZlIHRvIE1FVEEvLgotICBjb21wYXRpYmlsaXR5X2ZpbGVzID0gW10KLSAgdmVuZG9yX21ldGFkYXRhID0gKCJ2ZW5kb3JfbWFuaWZlc3QueG1sIiwgInZlbmRvcl9tYXRyaXgueG1sIikKLSAgc3lzdGVtX21ldGFkYXRhID0gKCJzeXN0ZW1fbWFuaWZlc3QueG1sIiwgInN5c3RlbV9tYXRyaXgueG1sIikKLSAgaWYgdmVuZG9yX2luY2x1ZGVkOgotICAgIGNvbXBhdGliaWxpdHlfZmlsZXMgKz0gdmVuZG9yX21ldGFkYXRhCi0gIGlmIHN5c3RlbV9pbmNsdWRlZDoKLSAgICBjb21wYXRpYmlsaXR5X2ZpbGVzICs9IHN5c3RlbV9tZXRhZGF0YQorICBkZWYgQWRkQ29tcGF0aWJpbGl0eUFyY2hpdmUoc3lzdGVtX3VwZGF0ZWQsIHZlbmRvcl91cGRhdGVkKToKKyAgICAiIiJBZGRzIGNvbXBhdGliaWxpdHkgaW5mbyBiYXNlZCBvbiBzeXN0ZW0vdmVuZG9yIHVwZGF0ZSBzdGF0dXMuCiAKLSAgIyBDcmVhdGUgbmV3IGFyY2hpdmUuCi0gIGNvbXBhdGliaWxpdHlfYXJjaGl2ZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gIGNvbXBhdGliaWxpdHlfYXJjaGl2ZV96aXAgPSB6aXBmaWxlLlppcEZpbGUoY29tcGF0aWJpbGl0eV9hcmNoaXZlLCAidyIsCi0gICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKKyAgICBBcmdzOgorICAgICAgc3lzdGVtX3VwZGF0ZWQ6IElmIFRydWUsIHRoZSBzeXN0ZW0gaW1hZ2Ugd2lsbCBiZSB1cGRhdGVkIGFuZCB0aGVyZWZvcmUKKyAgICAgICAgICBpdHMgbWV0YWRhdGEgc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgICAgdmVuZG9yX3VwZGF0ZWQ6IElmIFRydWUsIHRoZSB2ZW5kb3IgaW1hZ2Ugd2lsbCBiZSB1cGRhdGVkIGFuZCB0aGVyZWZvcmUKKyAgICAgICAgICBpdHMgbWV0YWRhdGEgc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgICIiIgorICAgICMgRGV0ZXJtaW5lIHdoYXQgbWV0YWRhdGEgd2UgbmVlZC4gRmlsZXMgYXJlIG5hbWVzIHJlbGF0aXZlIHRvIE1FVEEvLgorICAgIGNvbXBhdGliaWxpdHlfZmlsZXMgPSBbXQorICAgIHZlbmRvcl9tZXRhZGF0YSA9ICgidmVuZG9yX21hbmlmZXN0LnhtbCIsICJ2ZW5kb3JfbWF0cml4LnhtbCIpCisgICAgc3lzdGVtX21ldGFkYXRhID0gKCJzeXN0ZW1fbWFuaWZlc3QueG1sIiwgInN5c3RlbV9tYXRyaXgueG1sIikKKyAgICBpZiB2ZW5kb3JfdXBkYXRlZDoKKyAgICAgIGNvbXBhdGliaWxpdHlfZmlsZXMgKz0gdmVuZG9yX21ldGFkYXRhCisgICAgaWYgc3lzdGVtX3VwZGF0ZWQ6CisgICAgICBjb21wYXRpYmlsaXR5X2ZpbGVzICs9IHN5c3RlbV9tZXRhZGF0YQogCi0gICMgQWRkIG1ldGFkYXRhLgotICBmb3IgZmlsZV9uYW1lIGluIGNvbXBhdGliaWxpdHlfZmlsZXM6Ci0gICAgdGFyZ2V0X2ZpbGVfbmFtZSA9ICJNRVRBLyIgKyBmaWxlX25hbWUKKyAgICAjIENyZWF0ZSBuZXcgYXJjaGl2ZS4KKyAgICBjb21wYXRpYmlsaXR5X2FyY2hpdmUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQorICAgIGNvbXBhdGliaWxpdHlfYXJjaGl2ZV96aXAgPSB6aXBmaWxlLlppcEZpbGUoCisgICAgICAgIGNvbXBhdGliaWxpdHlfYXJjaGl2ZSwgInciLCBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKIAotICAgIGlmIHRhcmdldF9maWxlX25hbWUgaW4gdGFyZ2V0X3ppcC5uYW1lbGlzdCgpOgotICAgICAgZGF0YSA9IHRhcmdldF96aXAucmVhZCh0YXJnZXRfZmlsZV9uYW1lKQotICAgICAgY29tbW9uLlppcFdyaXRlU3RyKGNvbXBhdGliaWxpdHlfYXJjaGl2ZV96aXAsIGZpbGVfbmFtZSwgZGF0YSkKKyAgICAjIEFkZCBtZXRhZGF0YS4KKyAgICBmb3IgZmlsZV9uYW1lIGluIGNvbXBhdGliaWxpdHlfZmlsZXM6CisgICAgICB0YXJnZXRfZmlsZV9uYW1lID0gIk1FVEEvIiArIGZpbGVfbmFtZQogCi0gICMgRW5zdXJlIGZpbGVzIGFyZSB3cml0dGVuIGJlZm9yZSB3ZSBjb3B5IGludG8gb3V0cHV0X3ppcC4KLSAgY29tcGF0aWJpbGl0eV9hcmNoaXZlX3ppcC5jbG9zZSgpCisgICAgICBpZiB0YXJnZXRfZmlsZV9uYW1lIGluIHRhcmdldF96aXAubmFtZWxpc3QoKToKKyAgICAgICAgZGF0YSA9IHRhcmdldF96aXAucmVhZCh0YXJnZXRfZmlsZV9uYW1lKQorICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIoY29tcGF0aWJpbGl0eV9hcmNoaXZlX3ppcCwgZmlsZV9uYW1lLCBkYXRhKQogCi0gICMgT25seSBhZGQgdGhlIGFyY2hpdmUgaWYgd2UgaGF2ZSBhbnkgY29tcGF0aWJpbGl0eSBpbmZvLgotICBpZiBjb21wYXRpYmlsaXR5X2FyY2hpdmVfemlwLm5hbWVsaXN0KCk6Ci0gICAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIGNvbXBhdGliaWxpdHlfYXJjaGl2ZS5uYW1lLAotICAgICAgICAgICAgICAgICAgICBhcmNuYW1lPSJjb21wYXRpYmlsaXR5LnppcCIsCi0gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3R5cGU9emlwZmlsZS5aSVBfU1RPUkVEKQorICAgICMgRW5zdXJlIGZpbGVzIGFyZSB3cml0dGVuIGJlZm9yZSB3ZSBjb3B5IGludG8gb3V0cHV0X3ppcC4KKyAgICBjb21wYXRpYmlsaXR5X2FyY2hpdmVfemlwLmNsb3NlKCkKKworICAgICMgT25seSBhZGQgdGhlIGFyY2hpdmUgaWYgd2UgaGF2ZSBhbnkgY29tcGF0aWJpbGl0eSBpbmZvLgorICAgIGlmIGNvbXBhdGliaWxpdHlfYXJjaGl2ZV96aXAubmFtZWxpc3QoKToKKyAgICAgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBjb21wYXRpYmlsaXR5X2FyY2hpdmUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBhcmNuYW1lPSJjb21wYXRpYmlsaXR5LnppcCIsCisgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgIyBXaWxsIG9ubHkgcHJvY2VlZCBpZiB0aGUgdGFyZ2V0IGhhcyBlbmFibGVkIHRoZSBUcmVibGUgc3VwcG9ydCAoYXMgd2VsbCBhcworICAjIGhhdmluZyBhIC92ZW5kb3IgcGFydGl0aW9uKS4KKyAgaWYgbm90IEhhc1RyZWJsZUVuYWJsZWQodGFyZ2V0X3ppcCwgdGFyZ2V0X2luZm8pOgorICAgIHJldHVybgorCisgICMgV2UgZG9uJ3Qgc3VwcG9ydCBPRU0gdGh1bWJwcmludCBpbiBUcmVibGUgd29ybGQgKHdoaWNoIGNhbGN1bGF0ZXMKKyAgIyBmaW5nZXJwcmludHMgaW4gYSBkaWZmZXJlbnQgd2F5IGFzIHNob3duIGluIENhbGN1bGF0ZUZpbmdlcnByaW50KCkpLgorICBhc3NlcnQgbm90IHRhcmdldF9pbmZvLm9lbV9wcm9wcworCisgICMgRnVsbCBPVEEgY2FycmllcyB0aGUgaW5mbyBmb3Igc3lzdGVtL3ZlbmRvciBib3RoLgorICBpZiBzb3VyY2VfaW5mbyBpcyBOb25lOgorICAgIEFkZENvbXBhdGliaWxpdHlBcmNoaXZlKFRydWUsIFRydWUpCisgICAgcmV0dXJuCisKKyAgYXNzZXJ0IG5vdCBzb3VyY2VfaW5mby5vZW1fcHJvcHMKKworICBzb3VyY2VfZnAgPSBzb3VyY2VfaW5mby5maW5nZXJwcmludAorICB0YXJnZXRfZnAgPSB0YXJnZXRfaW5mby5maW5nZXJwcmludAorICBzeXN0ZW1fdXBkYXRlZCA9IHNvdXJjZV9mcCAhPSB0YXJnZXRfZnAKKworICBzb3VyY2VfZnBfdmVuZG9yID0gc291cmNlX2luZm8uR2V0VmVuZG9yQnVpbGRQcm9wKAorICAgICAgInJvLnZlbmRvci5idWlsZC5maW5nZXJwcmludCIpCisgIHRhcmdldF9mcF92ZW5kb3IgPSB0YXJnZXRfaW5mby5HZXRWZW5kb3JCdWlsZFByb3AoCisgICAgICAicm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50IikKKyAgdmVuZG9yX3VwZGF0ZWQgPSBzb3VyY2VfZnBfdmVuZG9yICE9IHRhcmdldF9mcF92ZW5kb3IKKworICBBZGRDb21wYXRpYmlsaXR5QXJjaGl2ZShzeXN0ZW1fdXBkYXRlZCwgdmVuZG9yX3VwZGF0ZWQpCiAKIAogZGVmIFdyaXRlRnVsbE9UQVBhY2thZ2UoaW5wdXRfemlwLCBvdXRwdXRfemlwKToKLSAgIyBUT0RPOiBob3cgdG8gZGV0ZXJtaW5lIHRoaXM/ICBXZSBkb24ndCBrbm93IHdoYXQgdmVyc2lvbiBpdCB3aWxsCi0gICMgYmUgaW5zdGFsbGVkIG9uIHRvcCBvZi4gRm9yIG5vdywgd2UgZXhwZWN0IHRoZSBBUEkganVzdCB3b24ndAotICAjIGNoYW5nZSB2ZXJ5IG9mdGVuLiBTaW1pbGFybHkgZm9yIGZzdGFiLCBpdCBtaWdodCBoYXZlIGNoYW5nZWQKLSAgIyBpbiB0aGUgdGFyZ2V0IGJ1aWxkLgotICBzY3JpcHQgPSBlZGlmeV9nZW5lcmF0b3IuRWRpZnlHZW5lcmF0b3IoMywgT1BUSU9OUy5pbmZvX2RpY3QpCisgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKE9QVElPTlMuaW5mb19kaWN0LCBPUFRJT05TLm9lbV9kaWN0cykKIAotICByZWNvdmVyeV9tb3VudF9vcHRpb25zID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJyZWNvdmVyeV9tb3VudF9vcHRpb25zIikKLSAgb2VtX3Byb3BzID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJvZW1fZmluZ2VycHJpbnRfcHJvcGVydGllcyIpCi0gIG9lbV9kaWN0cyA9IE5vbmUKLSAgaWYgb2VtX3Byb3BzOgotICAgIG9lbV9kaWN0cyA9IF9Mb2FkT2VtRGljdHMoc2NyaXB0LCByZWNvdmVyeV9tb3VudF9vcHRpb25zKQorICAjIFdlIGRvbid0IGtub3cgd2hhdCB2ZXJzaW9uIGl0IHdpbGwgYmUgaW5zdGFsbGVkIG9uIHRvcCBvZi4gV2UgZXhwZWN0IHRoZSBBUEkKKyAgIyBqdXN0IHdvbid0IGNoYW5nZSB2ZXJ5IG9mdGVuLiBTaW1pbGFybHkgZm9yIGZzdGFiLCBpdCBtaWdodCBoYXZlIGNoYW5nZWQgaW4KKyAgIyB0aGUgdGFyZ2V0IGJ1aWxkLgorICB0YXJnZXRfYXBpX3ZlcnNpb24gPSB0YXJnZXRfaW5mb1sicmVjb3ZlcnlfYXBpX3ZlcnNpb24iXQorICBzY3JpcHQgPSBlZGlmeV9nZW5lcmF0b3IuRWRpZnlHZW5lcmF0b3IodGFyZ2V0X2FwaV92ZXJzaW9uLCB0YXJnZXRfaW5mbykKIAotICB0YXJnZXRfZnAgPSBDYWxjdWxhdGVGaW5nZXJwcmludChvZW1fcHJvcHMsIG9lbV9kaWN0cyBhbmQgb2VtX2RpY3RzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLmluZm9fZGljdCkKLSAgbWV0YWRhdGEgPSB7Ci0gICAgICAicG9zdC1idWlsZCI6IHRhcmdldF9mcCwKLSAgICAgICJwcmUtZGV2aWNlIjogR2V0T2VtUHJvcGVydHkoInJvLnByb2R1Y3QuZGV2aWNlIiwgb2VtX3Byb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZW1fZGljdHMgYW5kIG9lbV9kaWN0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QpLAotICAgICAgInBvc3QtdGltZXN0YW1wIjogR2V0QnVpbGRQcm9wKCJyby5idWlsZC5kYXRlLnV0YyIsIE9QVElPTlMuaW5mb19kaWN0KSwKLSAgfQorICBpZiB0YXJnZXRfaW5mby5vZW1fcHJvcHMgYW5kIG5vdCBPUFRJT05TLm9lbV9ub19tb3VudDoKKyAgICB0YXJnZXRfaW5mby5Xcml0ZU1vdW50T2VtU2NyaXB0KHNjcmlwdCkKKworICBtZXRhZGF0YSA9IEdldFBhY2thZ2VNZXRhZGF0YSh0YXJnZXRfaW5mbykKIAogICBkZXZpY2Vfc3BlY2lmaWMgPSBjb21tb24uRGV2aWNlU3BlY2lmaWNQYXJhbXMoCiAgICAgICBpbnB1dF96aXA9aW5wdXRfemlwLAotICAgICAgaW5wdXRfdmVyc2lvbj1PUFRJT05TLmluZm9fZGljdFsicmVjb3ZlcnlfYXBpX3ZlcnNpb24iXSwKKyAgICAgIGlucHV0X3ZlcnNpb249dGFyZ2V0X2FwaV92ZXJzaW9uLAogICAgICAgb3V0cHV0X3ppcD1vdXRwdXRfemlwLAogICAgICAgc2NyaXB0PXNjcmlwdCwKICAgICAgIGlucHV0X3RtcD1PUFRJT05TLmlucHV0X3RtcCwKQEAgLTQwMywxMyArNzI5LDEyIEBACiAKICAgYXNzZXJ0IEhhc1JlY292ZXJ5UGF0Y2goaW5wdXRfemlwKQogCi0gIG1ldGFkYXRhWyJvdGEtdHlwZSJdID0gIkJMT0NLIgotCi0gIHRzID0gR2V0QnVpbGRQcm9wKCJyby5idWlsZC5kYXRlLnV0YyIsIE9QVElPTlMuaW5mb19kaWN0KQotICB0c190ZXh0ID0gR2V0QnVpbGRQcm9wKCJyby5idWlsZC5kYXRlIiwgT1BUSU9OUy5pbmZvX2RpY3QpCisgICMgQXNzZXJ0aW9ucyAoZS5nLiBkb3duZ3JhZGUgY2hlY2ssIGRldmljZSBwcm9wZXJ0aWVzIGNoZWNrKS4KKyAgdHMgPSB0YXJnZXRfaW5mby5HZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIikKKyAgdHNfdGV4dCA9IHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZSIpCiAgIHNjcmlwdC5Bc3NlcnRPbGRlckJ1aWxkKHRzLCB0c190ZXh0KQogCi0gIEFwcGVuZEFzc2VydGlvbnMoc2NyaXB0LCBPUFRJT05TLmluZm9fZGljdCwgb2VtX2RpY3RzKQorICB0YXJnZXRfaW5mby5Xcml0ZURldmljZUFzc2VydGlvbnMoc2NyaXB0LCBPUFRJT05TLm9lbV9ub19tb3VudCkKICAgZGV2aWNlX3NwZWNpZmljLkZ1bGxPVEFfQXNzZXJ0aW9ucygpCiAKICAgIyBUd28tc3RlcCBwYWNrYWdlIHN0cmF0ZWd5IChpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aGljaCBpcyAqbm90KgpAQCAtNDM1LDkgKzc2MCw5IEBACiAgIHJlY292ZXJ5X2ltZyA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKCJyZWNvdmVyeS5pbWciLCAicmVjb3ZlcnkuaW1nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5pbnB1dF90bXAsICJSRUNPVkVSWSIpCiAgIGlmIE9QVElPTlMudHdvX3N0ZXA6Ci0gICAgaWYgbm90IE9QVElPTlMuaW5mb19kaWN0LmdldCgibXVsdGlzdGFnZV9zdXBwb3J0IiwgTm9uZSk6CisgICAgaWYgbm90IHRhcmdldF9pbmZvLmdldCgibXVsdGlzdGFnZV9zdXBwb3J0Iik6CiAgICAgICBhc3NlcnQgRmFsc2UsICJ0d28tc3RlcCBwYWNrYWdlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQiCi0gICAgZnMgPSBPUFRJT05TLmluZm9fZGljdFsiZnN0YWIiXVsiL21pc2MiXQorICAgIGZzID0gdGFyZ2V0X2luZm9bImZzdGFiIl1bIi9taXNjIl0KICAgICBhc3NlcnQgZnMuZnNfdHlwZS51cHBlcigpID09ICJFTU1DIiwgXAogICAgICAgICAidHdvLXN0ZXAgcGFja2FnZXMgb25seSBzdXBwb3J0ZWQgb24gZGV2aWNlcyB3aXRoIEVNTUMgL21pc2MgcGFydGl0aW9ucyIKICAgICBiY2JfZGV2ID0geyJiY2JfZGV2IjogZnMuZGV2aWNlfQpAQCAtNDU5LDcgKzc4NCw3IEBACiAgICAgc2NyaXB0LkNvbW1lbnQoIlN0YWdlIDMvMyIpCiAKICAgIyBEdW1wIGZpbmdlcnByaW50cwotICBzY3JpcHQuUHJpbnQoIlRhcmdldDogJXMiICUgdGFyZ2V0X2ZwKQorICBzY3JpcHQuUHJpbnQoIlRhcmdldDoge30iLmZvcm1hdCh0YXJnZXRfaW5mby5maW5nZXJwcmludCkpCiAKICAgZGV2aWNlX3NwZWNpZmljLkZ1bGxPVEFfSW5zdGFsbEJlZ2luKCkKIApAQCAtNDcwLDIwICs3OTUsMTcgQEAKICAgaWYgSGFzVmVuZG9yUGFydGl0aW9uKGlucHV0X3ppcCk6CiAgICAgc3lzdGVtX3Byb2dyZXNzIC09IDAuMQogCi0gICMgUGxhY2UgYSBjb3B5IG9mIGZpbGVfY29udGV4dHMuYmluIGludG8gdGhlIE9UQSBwYWNrYWdlIHdoaWNoIHdpbGwgYmUgdXNlZAotICAjIGJ5IHRoZSByZWNvdmVyeSBwcm9ncmFtLgotICBpZiAic2VsaW51eF9mYyIgaW4gT1BUSU9OUy5pbmZvX2RpY3Q6Ci0gICAgV3JpdGVQb2xpY3lDb25maWcoT1BUSU9OUy5pbmZvX2RpY3RbInNlbGludXhfZmMiXSwgb3V0cHV0X3ppcCkKLQotICByZWNvdmVyeV9tb3VudF9vcHRpb25zID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJyZWNvdmVyeV9tb3VudF9vcHRpb25zIikKLQogICBzY3JpcHQuU2hvd1Byb2dyZXNzKHN5c3RlbV9wcm9ncmVzcywgMCkKIAorICAjIFNlZSB0aGUgbm90ZXMgaW4gV3JpdGVCbG9ja0luY3JlbWVudGFsT1RBUGFja2FnZSgpLgorICBhbGxvd19zaGFyZWRfYmxvY2tzID0gdGFyZ2V0X2luZm8uZ2V0KCdleHQ0X3NoYXJlX2R1cF9ibG9ja3MnKSA9PSAidHJ1ZSIKKwogICAjIEZ1bGwgT1RBIGlzIGRvbmUgYXMgYW4gImluY3JlbWVudGFsIiBhZ2FpbnN0IGFuIGVtcHR5IHNvdXJjZSBpbWFnZS4gVGhpcwogICAjIGhhcyB0aGUgZWZmZWN0IG9mIHdyaXRpbmcgbmV3IGRhdGEgZnJvbSB0aGUgcGFja2FnZSB0byB0aGUgZW50aXJlCiAgICMgcGFydGl0aW9uLCBidXQgbGV0cyB1cyByZXVzZSB0aGUgdXBkYXRlciBjb2RlIHRoYXQgd3JpdGVzIGluY3JlbWVudGFscyB0bwogICAjIGRvIGl0LgotICBzeXN0ZW1fdGd0ID0gR2V0SW1hZ2UoInN5c3RlbSIsIE9QVElPTlMuaW5wdXRfdG1wKQorICBzeXN0ZW1fdGd0ID0gY29tbW9uLkdldFNwYXJzZUltYWdlKCJzeXN0ZW0iLCBPUFRJT05TLmlucHV0X3RtcCwgaW5wdXRfemlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3NoYXJlZF9ibG9ja3MpCiAgIHN5c3RlbV90Z3QuUmVzZXRGaWxlTWFwKCkKICAgc3lzdGVtX2RpZmYgPSBjb21tb24uQmxvY2tEaWZmZXJlbmNlKCJzeXN0ZW0iLCBzeXN0ZW1fdGd0LCBzcmM9Tm9uZSkKICAgc3lzdGVtX2RpZmYuV3JpdGVTY3JpcHQoc2NyaXB0LCBvdXRwdXRfemlwKQpAQCAtNDk0LDEyICs4MTYsMTUgQEAKICAgaWYgSGFzVmVuZG9yUGFydGl0aW9uKGlucHV0X3ppcCk6CiAgICAgc2NyaXB0LlNob3dQcm9ncmVzcygwLjEsIDApCiAKLSAgICB2ZW5kb3JfdGd0ID0gR2V0SW1hZ2UoInZlbmRvciIsIE9QVElPTlMuaW5wdXRfdG1wKQorICAgIHZlbmRvcl90Z3QgPSBjb21tb24uR2V0U3BhcnNlSW1hZ2UoInZlbmRvciIsIE9QVElPTlMuaW5wdXRfdG1wLCBpbnB1dF96aXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19zaGFyZWRfYmxvY2tzKQogICAgIHZlbmRvcl90Z3QuUmVzZXRGaWxlTWFwKCkKICAgICB2ZW5kb3JfZGlmZiA9IGNvbW1vbi5CbG9ja0RpZmZlcmVuY2UoInZlbmRvciIsIHZlbmRvcl90Z3QpCiAgICAgdmVuZG9yX2RpZmYuV3JpdGVTY3JpcHQoc2NyaXB0LCBvdXRwdXRfemlwKQogCi0gIGNvbW1vbi5DaGVja1NpemUoYm9vdF9pbWcuZGF0YSwgImJvb3QuaW1nIiwgT1BUSU9OUy5pbmZvX2RpY3QpCisgIEFkZENvbXBhdGliaWxpdHlBcmNoaXZlSWZUcmVibGVFbmFibGVkKGlucHV0X3ppcCwgb3V0cHV0X3ppcCwgdGFyZ2V0X2luZm8pCisKKyAgY29tbW9uLkNoZWNrU2l6ZShib290X2ltZy5kYXRhLCAiYm9vdC5pbWciLCB0YXJnZXRfaW5mbykKICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF96aXAsICJib290LmltZyIsIGJvb3RfaW1nLmRhdGEpCiAKICAgc2NyaXB0LlNob3dQcm9ncmVzcygwLjA1LCA1KQpAQCAtNTQwLDMwICs4NjUsMTggQEAKICAgV3JpdGVNZXRhZGF0YShtZXRhZGF0YSwgb3V0cHV0X3ppcCkKIAogCi1kZWYgV3JpdGVQb2xpY3lDb25maWcoZmlsZV9uYW1lLCBvdXRwdXRfemlwKToKLSAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIGZpbGVfbmFtZSwgb3MucGF0aC5iYXNlbmFtZShmaWxlX25hbWUpKQotCi0KIGRlZiBXcml0ZU1ldGFkYXRhKG1ldGFkYXRhLCBvdXRwdXRfemlwKToKICAgdmFsdWUgPSAiIi5qb2luKFsiJXM9JXNcbiIgJSBrdiBmb3Iga3YgaW4gc29ydGVkKG1ldGFkYXRhLml0ZXJpdGVtcygpKV0pCiAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCBNRVRBREFUQV9OQU1FLCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3R5cGU9emlwZmlsZS5aSVBfU1RPUkVEKQogCiAKLWRlZiBHZXRCdWlsZFByb3AocHJvcCwgaW5mb19kaWN0KToKLSAgIiIiUmV0dXJuIHRoZSBmaW5nZXJwcmludCBvZiB0aGUgYnVpbGQgb2YgYSBnaXZlbiB0YXJnZXQtZmlsZXMgaW5mb19kaWN0LiIiIgotICB0cnk6Ci0gICAgcmV0dXJuIGluZm9fZGljdC5nZXQoImJ1aWxkLnByb3AiLCB7fSlbcHJvcF0KLSAgZXhjZXB0IEtleUVycm9yOgotICAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKCJjb3VsZG4ndCBmaW5kICVzIGluIGJ1aWxkLnByb3AiICUgKHByb3AsKSkKLQotCi1kZWYgSGFuZGxlRG93bmdyYWRlTWV0YWRhdGEobWV0YWRhdGEpOgorZGVmIEhhbmRsZURvd25ncmFkZU1ldGFkYXRhKG1ldGFkYXRhLCB0YXJnZXRfaW5mbywgc291cmNlX2luZm8pOgogICAjIE9ubHkgaW5jcmVtZW50YWwgT1RBcyBhcmUgYWxsb3dlZCB0byByZWFjaCBoZXJlLgogICBhc3NlcnQgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgaXMgbm90IE5vbmUKIAotICBwb3N0X3RpbWVzdGFtcCA9IEdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiLCBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QpCi0gIHByZV90aW1lc3RhbXAgPSBHZXRCdWlsZFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIiwgT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KQorICBwb3N0X3RpbWVzdGFtcCA9IHRhcmdldF9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiKQorICBwcmVfdGltZXN0YW1wID0gc291cmNlX2luZm8uR2V0QnVpbGRQcm9wKCJyby5idWlsZC5kYXRlLnV0YyIpCiAgIGlzX2Rvd25ncmFkZSA9IGxvbmcocG9zdF90aW1lc3RhbXApIDwgbG9uZyhwcmVfdGltZXN0YW1wKQogCiAgIGlmIE9QVElPTlMuZG93bmdyYWRlOgpAQCAtNTczLDk2ICs4ODYsMzI1IEBACiAgICAgbWV0YWRhdGFbIm90YS1kb3duZ3JhZGUiXSA9ICJ5ZXMiCiAgIGVsaWYgT1BUSU9OUy50aW1lc3RhbXA6CiAgICAgaWYgbm90IGlzX2Rvd25ncmFkZToKLSAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiLS10aW1lc3RhbXAgc3BlY2lmaWVkIGJ1dCBubyB0aW1lc3RhbXAgaGFjayBuZWVkZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAicHJlOiAlcywgcG9zdDogJXMiICUgKHByZV90aW1lc3RhbXAsIHBvc3RfdGltZXN0YW1wKSkKKyAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiLS1vdmVycmlkZV90aW1lc3RhbXAgc3BlY2lmaWVkIGJ1dCBubyB0aW1lc3RhbXAgaGFjayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRlZDogcHJlOiAlcywgcG9zdDogJXMiICUgKHByZV90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfdGltZXN0YW1wKSkKICAgICBtZXRhZGF0YVsicG9zdC10aW1lc3RhbXAiXSA9IHN0cihsb25nKHByZV90aW1lc3RhbXApICsgMSkKICAgZWxzZToKICAgICBpZiBpc19kb3duZ3JhZGU6CiAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkRvd25ncmFkZSBkZXRlY3RlZCBiYXNlZCBvbiB0aW1lc3RhbXAgY2hlY2s6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAicHJlOiAlcywgcG9zdDogJXMuIE5lZWQgdG8gc3BlY2lmeSAtLXRpbWVzdGFtcCBPUiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIi0tZG93bmdyYWRlIHRvIGFsbG93IGJ1aWxkaW5nIHRoZSBpbmNyZW1lbnRhbC4iICUgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfdGltZXN0YW1wLCBwb3N0X3RpbWVzdGFtcCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgInByZTogJXMsIHBvc3Q6ICVzLiBOZWVkIHRvIHNwZWNpZnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICItLW92ZXJyaWRlX3RpbWVzdGFtcCBPUiAtLWRvd25ncmFkZSB0byBhbGxvdyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1aWxkaW5nIHRoZSBpbmNyZW1lbnRhbC4iICUgKHByZV90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfdGltZXN0YW1wKSkKICAgICBtZXRhZGF0YVsicG9zdC10aW1lc3RhbXAiXSA9IHBvc3RfdGltZXN0YW1wCiAKIAotZGVmIFdyaXRlQmxvY2tJbmNyZW1lbnRhbE9UQVBhY2thZ2UodGFyZ2V0X3ppcCwgc291cmNlX3ppcCwgb3V0cHV0X3ppcCk6Ci0gIHNvdXJjZV92ZXJzaW9uID0gT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0WyJyZWNvdmVyeV9hcGlfdmVyc2lvbiJdCi0gIHRhcmdldF92ZXJzaW9uID0gT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0WyJyZWNvdmVyeV9hcGlfdmVyc2lvbiJdCitkZWYgR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbz1Ob25lKToKKyAgIiIiR2VuZXJhdGVzIGFuZCByZXR1cm5zIHRoZSBtZXRhZGF0YSBkaWN0LgogCi0gIGlmIHNvdXJjZV92ZXJzaW9uID09IDA6Ci0gICAgcHJpbnQoIldBUk5JTkc6IGdlbmVyYXRpbmcgZWRpZnkgc2NyaXB0IGZvciBhIHNvdXJjZSB0aGF0ICIKLSAgICAgICAgICAiY2FuJ3QgaW5zdGFsbCBpdC4iKQotICBzY3JpcHQgPSBlZGlmeV9nZW5lcmF0b3IuRWRpZnlHZW5lcmF0b3IoCi0gICAgICBzb3VyY2VfdmVyc2lvbiwgT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0LAotICAgICAgZnN0YWI9T1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0WyJmc3RhYiJdKQorICBJdCBnZW5lcmF0ZXMgYSBkaWN0KCkgdGhhdCBjb250YWlucyB0aGUgaW5mbyB0byBiZSB3cml0dGVuIGludG8gYW4gT1RBCisgIHBhY2thZ2UgKE1FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhKS4gSXQgYWxzbyBoYW5kbGVzIHRoZSBkZXRlY3Rpb24gb2YKKyAgZG93bmdyYWRlIC8gdGltZXN0YW1wIG92ZXJyaWRlIC8gZGF0YSB3aXBlIGJhc2VkIG9uIHRoZSBnbG9iYWwgb3B0aW9ucy4KIAotICByZWNvdmVyeV9tb3VudF9vcHRpb25zID0gT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0LmdldCgKLSAgICAgICJyZWNvdmVyeV9tb3VudF9vcHRpb25zIikKLSAgc291cmNlX29lbV9wcm9wcyA9IE9QVElPTlMuc291cmNlX2luZm9fZGljdC5nZXQoIm9lbV9maW5nZXJwcmludF9wcm9wZXJ0aWVzIikKLSAgdGFyZ2V0X29lbV9wcm9wcyA9IE9QVElPTlMudGFyZ2V0X2luZm9fZGljdC5nZXQoIm9lbV9maW5nZXJwcmludF9wcm9wZXJ0aWVzIikKLSAgb2VtX2RpY3RzID0gTm9uZQotICBpZiBzb3VyY2Vfb2VtX3Byb3BzIGFuZCB0YXJnZXRfb2VtX3Byb3BzOgotICAgIG9lbV9kaWN0cyA9IF9Mb2FkT2VtRGljdHMoc2NyaXB0LCByZWNvdmVyeV9tb3VudF9vcHRpb25zKQorICBBcmdzOgorICAgIHRhcmdldF9pbmZvOiBUaGUgQnVpbGRJbmZvIGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHRhcmdldCBidWlsZCBpbmZvLgorICAgIHNvdXJjZV9pbmZvOiBUaGUgQnVpbGRJbmZvIGluc3RhbmNlIHRoYXQgaG9sZHMgdGhlIHNvdXJjZSBidWlsZCBpbmZvLCBvcgorICAgICAgICBOb25lIGlmIGdlbmVyYXRpbmcgZnVsbCBPVEEuCisKKyAgUmV0dXJuczoKKyAgICBBIGRpY3QgdG8gYmUgd3JpdHRlbiBpbnRvIHBhY2thZ2UgbWV0YWRhdGEgZW50cnkuCisgICIiIgorICBhc3NlcnQgaXNpbnN0YW5jZSh0YXJnZXRfaW5mbywgQnVpbGRJbmZvKQorICBhc3NlcnQgc291cmNlX2luZm8gaXMgTm9uZSBvciBpc2luc3RhbmNlKHNvdXJjZV9pbmZvLCBCdWlsZEluZm8pCiAKICAgbWV0YWRhdGEgPSB7Ci0gICAgICAicHJlLWRldmljZSI6IEdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0LmRldmljZSIsIHNvdXJjZV9vZW1fcHJvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9lbV9kaWN0cyBhbmQgb2VtX2RpY3RzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpLAotICAgICAgIm90YS10eXBlIjogIkJMT0NLIiwKKyAgICAgICdwb3N0LWJ1aWxkJyA6IHRhcmdldF9pbmZvLmZpbmdlcnByaW50LAorICAgICAgJ3Bvc3QtYnVpbGQtaW5jcmVtZW50YWwnIDogdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKAorICAgICAgICAgICdyby5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsJyksCisgICAgICAncG9zdC1zZGstbGV2ZWwnIDogdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKAorICAgICAgICAgICdyby5idWlsZC52ZXJzaW9uLnNkaycpLAorICAgICAgJ3Bvc3Qtc2VjdXJpdHktcGF0Y2gtbGV2ZWwnIDogdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKAorICAgICAgICAgICdyby5idWlsZC52ZXJzaW9uLnNlY3VyaXR5X3BhdGNoJyksCiAgIH0KIAotICBIYW5kbGVEb3duZ3JhZGVNZXRhZGF0YShtZXRhZGF0YSkKKyAgaWYgdGFyZ2V0X2luZm8uaXNfYWI6CisgICAgbWV0YWRhdGFbJ290YS10eXBlJ10gPSAnQUInCisgICAgbWV0YWRhdGFbJ290YS1yZXF1aXJlZC1jYWNoZSddID0gJzAnCisgIGVsc2U6CisgICAgbWV0YWRhdGFbJ290YS10eXBlJ10gPSAnQkxPQ0snCisKKyAgaWYgT1BUSU9OUy53aXBlX3VzZXJfZGF0YToKKyAgICBtZXRhZGF0YVsnb3RhLXdpcGUnXSA9ICd5ZXMnCisKKyAgaXNfaW5jcmVtZW50YWwgPSBzb3VyY2VfaW5mbyBpcyBub3QgTm9uZQorICBpZiBpc19pbmNyZW1lbnRhbDoKKyAgICBtZXRhZGF0YVsncHJlLWJ1aWxkJ10gPSBzb3VyY2VfaW5mby5maW5nZXJwcmludAorICAgIG1ldGFkYXRhWydwcmUtYnVpbGQtaW5jcmVtZW50YWwnXSA9IHNvdXJjZV9pbmZvLkdldEJ1aWxkUHJvcCgKKyAgICAgICAgJ3JvLmJ1aWxkLnZlcnNpb24uaW5jcmVtZW50YWwnKQorICAgIG1ldGFkYXRhWydwcmUtZGV2aWNlJ10gPSBzb3VyY2VfaW5mby5kZXZpY2UKKyAgZWxzZToKKyAgICBtZXRhZGF0YVsncHJlLWRldmljZSddID0gdGFyZ2V0X2luZm8uZGV2aWNlCisKKyAgIyBEZXRlY3QgZG93bmdyYWRlcywgb3IgZmlsbCBpbiB0aGUgcG9zdC10aW1lc3RhbXAuCisgIGlmIGlzX2luY3JlbWVudGFsOgorICAgIEhhbmRsZURvd25ncmFkZU1ldGFkYXRhKG1ldGFkYXRhLCB0YXJnZXRfaW5mbywgc291cmNlX2luZm8pCisgIGVsc2U6CisgICAgbWV0YWRhdGFbJ3Bvc3QtdGltZXN0YW1wJ10gPSB0YXJnZXRfaW5mby5HZXRCdWlsZFByb3AoJ3JvLmJ1aWxkLmRhdGUudXRjJykKKworICByZXR1cm4gbWV0YWRhdGEKKworCitjbGFzcyBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzKG9iamVjdCk6CisgICIiIkNvbXB1dGVzIHRoZSBvdGEtc3RyZWFtaW5nLXByb3BlcnR5LWZpbGVzIHN0cmluZyBmb3Igc3RyZWFtaW5nIEEvQiBPVEEuCisKKyAgQ29tcHV0aW5nIHRoZSBmaW5hbCBwcm9wZXJ0eS1maWxlcyBzdHJpbmcgcmVxdWlyZXMgdHdvIHBhc3Nlcy4gQmVjYXVzZSBkb2luZworICB0aGUgd2hvbGUgcGFja2FnZSBzaWduaW5nICh3aXRoIHNpZ25hcGsuamFyKSB3aWxsIHBvc3NpYmx5IHJlb3JkZXIgdGhlIFpJUAorICBlbnRyaWVzLCB3aGljaCBtYXkgaW4gdHVybiBpbnZhbGlkYXRlIGVhcmxpZXIgY29tcHV0ZWQgWklQIGVudHJ5IG9mZnNldC9zaXplCisgIHZhbHVlcy4KKworICBUaGlzIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQgZm9yIGVhY2ggcGFzcy4gVGhlIGdlbmVyYWwgZmxvdyBpcworICBhcyBmb2xsb3dzLgorCisgICAgcHJvcGVydHlfZmlsZXMgPSBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzKCkKKyAgICAjIFRoZSBmaXJzdCBwYXNzLCB3aGljaCB3cml0ZXMgcGxhY2Vob2xkZXJzIGJlZm9yZSBkb2luZyBpbml0aWFsIHNpZ25pbmcuCisgICAgcHJvcGVydHlfZmlsZXMuQ29tcHV0ZSgpCisgICAgU2lnbk91dHB1dCgpCisKKyAgICAjIFRoZSBzZWNvbmQgcGFzcywgYnkgcmVwbGFjaW5nIHRoZSBwbGFjZWhvbGRlcnMgd2l0aCBhY3R1YWwgZGF0YS4KKyAgICBwcm9wZXJ0eV9maWxlcy5GaW5hbGl6ZSgpCisgICAgU2lnbk91dHB1dCgpCisKKyAgQW5kIHRoZSBjYWxsZXIgY2FuIGFkZGl0aW9uYWxseSB2ZXJpZnkgdGhlIGZpbmFsIHJlc3VsdC4KKworICAgIHByb3BlcnR5X2ZpbGVzLlZlcmlmeSgpCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnJlcXVpcmVkID0gKAorICAgICAgICAjIHBheWxvYWQuYmluIGFuZCBwYXlsb2FkX3Byb3BlcnRpZXMudHh0IG11c3QgZXhpc3QuCisgICAgICAgICdwYXlsb2FkLmJpbicsCisgICAgICAgICdwYXlsb2FkX3Byb3BlcnRpZXMudHh0JywKKyAgICApCisgICAgc2VsZi5vcHRpb25hbCA9ICgKKyAgICAgICAgIyBjYXJlX21hcC50eHQgaXMgYXZhaWxhYmxlIG9ubHkgaWYgZG0tdmVyaXR5IGlzIGVuYWJsZWQuCisgICAgICAgICdjYXJlX21hcC50eHQnLAorICAgICAgICAjIGNvbXBhdGliaWxpdHkuemlwIGlzIGF2YWlsYWJsZSBvbmx5IGlmIHRhcmdldCBzdXBwb3J0cyBUcmVibGUuCisgICAgICAgICdjb21wYXRpYmlsaXR5LnppcCcsCisgICAgKQorCisgIGRlZiBDb21wdXRlKHNlbGYsIGlucHV0X3ppcCk6CisgICAgIiIiQ29tcHV0ZXMgYW5kIHJldHVybnMgYSBwcm9wZXJ0eS1maWxlcyBzdHJpbmcgd2l0aCBwbGFjZWhvbGRlcnMuCisKKyAgICBXZSByZXNlcnZlIGV4dHJhIHNwYWNlIGZvciB0aGUgb2Zmc2V0IGFuZCBzaXplIG9mIHRoZSBtZXRhZGF0YSBlbnRyeSBpdHNlbGYsCisgICAgYWx0aG91Z2ggd2UgZG9uJ3Qga25vdyB0aGUgZmluYWwgdmFsdWVzIHVudGlsIHRoZSBwYWNrYWdlIGdldHMgc2lnbmVkLgorCisgICAgQXJnczoKKyAgICAgIGlucHV0X3ppcDogVGhlIGlucHV0IFpJUCBmaWxlLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzIGZvciB0aGUgbWV0YWRhdGEgb2Zmc2V0L3NpemUgaW5mbywgZS5nLgorICAgICAgInBheWxvYWQuYmluOjY3OTozNDMscGF5bG9hZF9wcm9wZXJ0aWVzLnR4dDozNzg6NDUsbWV0YWRhdGE6ICAgICAgICAiLgorICAgICIiIgorICAgIHJldHVybiBzZWxmLl9HZXRQcm9wZXJ0eUZpbGVzU3RyaW5nKGlucHV0X3ppcCwgcmVzZXJ2ZV9zcGFjZT1UcnVlKQorCisgIGRlZiBGaW5hbGl6ZShzZWxmLCBpbnB1dF96aXAsIHJlc2VydmVkX2xlbmd0aCk6CisgICAgIiIiRmluYWxpemVzIGEgcHJvcGVydHktZmlsZXMgc3RyaW5nIHdpdGggYWN0dWFsIE1FVEFEQVRBIG9mZnNldC9zaXplIGluZm8uCisKKyAgICBUaGUgaW5wdXQgWklQIGZpbGUgaGFzIGJlZW4gc2lnbmVkLCB3aXRoIHRoZSBaSVAgZW50cmllcyBpbiB0aGUgZGVzaXJlZAorICAgIHBsYWNlIChzaWduYXBrLmphciB3aWxsIHBvc3NpYmx5IHJlb3JkZXIgdGhlIFpJUCBlbnRyaWVzKS4gTm93IHdlIGNvbXB1dGUKKyAgICB0aGUgWklQIGVudHJ5IG9mZnNldHMgYW5kIGNvbnN0cnVjdCB0aGUgcHJvcGVydHktZmlsZXMgc3RyaW5nIHdpdGggYWN0dWFsCisgICAgZGF0YS4gTm90ZSB0aGF0IGR1cmluZyB0aGlzIHByb2Nlc3MsIHdlIG11c3QgcGFkIHRoZSBwcm9wZXJ0eS1maWxlcyBzdHJpbmcKKyAgICB0byB0aGUgcmVzZXJ2ZWQgbGVuZ3RoLCBzbyB0aGF0IHRoZSBNRVRBREFUQSBlbnRyeSBzaXplIHJlbWFpbnMgdGhlIHNhbWUuCisgICAgT3RoZXJ3aXNlIHRoZSBlbnRyaWVzJyBvZmZzZXRzIGFuZCBzaXplcyBtYXkgY2hhbmdlIGFnYWluLgorCisgICAgQXJnczoKKyAgICAgIGlucHV0X3ppcDogVGhlIGlucHV0IFpJUCBmaWxlLgorICAgICAgcmVzZXJ2ZWRfbGVuZ3RoOiBUaGUgcmVzZXJ2ZWQgbGVuZ3RoIG9mIHRoZSBwcm9wZXJ0eS1maWxlcyBzdHJpbmcgZHVyaW5nCisgICAgICAgICAgdGhlIGNhbGwgdG8gQ29tcHV0ZSgpLiBUaGUgZmluYWwgc3RyaW5nIG11c3QgYmUgbm8gbW9yZSB0aGFuIHRoaXMKKyAgICAgICAgICBzaXplLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgcHJvcGVydHktZmlsZXMgc3RyaW5nIGluY2x1ZGluZyB0aGUgbWV0YWRhdGEgb2Zmc2V0L3NpemUgaW5mbywgZS5nLgorICAgICAgInBheWxvYWQuYmluOjY3OTozNDMscGF5bG9hZF9wcm9wZXJ0aWVzLnR4dDozNzg6NDUsbWV0YWRhdGE6Njk6Mzc5ICAiLgorCisgICAgUmFpc2VzOgorICAgICAgQXNzZXJ0aW9uRXJyb3I6IElmIHRoZSByZXNlcnZlZCBsZW5ndGggaXMgaW5zdWZmaWNpZW50IHRvIGhvbGQgdGhlIGZpbmFsCisgICAgICAgICAgc3RyaW5nLgorICAgICIiIgorICAgIHJlc3VsdCA9IHNlbGYuX0dldFByb3BlcnR5RmlsZXNTdHJpbmcoaW5wdXRfemlwLCByZXNlcnZlX3NwYWNlPUZhbHNlKQorICAgIGFzc2VydCBsZW4ocmVzdWx0KSA8PSByZXNlcnZlZF9sZW5ndGgsIFwKKyAgICAgICAgJ0luc3VmZmljaWVudCByZXNlcnZlZCBzcGFjZTogcmVzZXJ2ZWQ9e30sIGFjdHVhbD17fScuZm9ybWF0KAorICAgICAgICAgICAgcmVzZXJ2ZWRfbGVuZ3RoLCBsZW4ocmVzdWx0KSkKKyAgICByZXN1bHQgKz0gJyAnICogKHJlc2VydmVkX2xlbmd0aCAtIGxlbihyZXN1bHQpKQorICAgIHJldHVybiByZXN1bHQKKworICBkZWYgVmVyaWZ5KHNlbGYsIGlucHV0X3ppcCwgZXhwZWN0ZWQpOgorICAgICIiIlZlcmlmaWVzIHRoZSBpbnB1dCBaSVAgZmlsZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgcHJvcGVydHktZmlsZXMgc3RyaW5nLgorCisgICAgQXJnczoKKyAgICAgIGlucHV0X3ppcDogVGhlIGlucHV0IFpJUCBmaWxlLgorICAgICAgZXhwZWN0ZWQ6IFRoZSBwcm9wZXJ0eS1maWxlcyBzdHJpbmcgdGhhdCdzIGNvbXB1dGVkIGZyb20gRmluYWxpemUoKS4KKworICAgIFJhaXNlczoKKyAgICAgIEFzc2VydGlvbkVycm9yOiBPbiBmaW5kaW5nIGEgbWlzbWF0Y2guCisgICAgIiIiCisgICAgYWN0dWFsID0gc2VsZi5fR2V0UHJvcGVydHlGaWxlc1N0cmluZyhpbnB1dF96aXApCisgICAgYXNzZXJ0IGFjdHVhbCA9PSBleHBlY3RlZCwgXAorICAgICAgICAiTWlzbWF0Y2hpbmcgc3RyZWFtaW5nIG1ldGFkYXRhOiB7fSB2cyB7fS4iLmZvcm1hdChhY3R1YWwsIGV4cGVjdGVkKQorCisgIGRlZiBfR2V0UHJvcGVydHlGaWxlc1N0cmluZyhzZWxmLCB6aXBfZmlsZSwgcmVzZXJ2ZV9zcGFjZT1GYWxzZSk6CisgICAgIiIiQ29uc3RydWN0cyB0aGUgcHJvcGVydHktZmlsZXMgc3RyaW5nIHBlciByZXF1ZXN0LiIiIgorCisgICAgZGVmIENvbXB1dGVFbnRyeU9mZnNldFNpemUobmFtZSk6CisgICAgICAiIiJDb21wdXRlcyB0aGUgemlwIGVudHJ5IG9mZnNldCBhbmQgc2l6ZS4iIiIKKyAgICAgIGluZm8gPSB6aXBfZmlsZS5nZXRpbmZvKG5hbWUpCisgICAgICBvZmZzZXQgPSBpbmZvLmhlYWRlcl9vZmZzZXQgKyBsZW4oaW5mby5GaWxlSGVhZGVyKCkpCisgICAgICBzaXplID0gaW5mby5maWxlX3NpemUKKyAgICAgIHJldHVybiAnJXM6JWQ6JWQnICUgKG9zLnBhdGguYmFzZW5hbWUobmFtZSksIG9mZnNldCwgc2l6ZSkKKworICAgIHRva2VucyA9IFtdCisgICAgZm9yIGVudHJ5IGluIHNlbGYucmVxdWlyZWQ6CisgICAgICB0b2tlbnMuYXBwZW5kKENvbXB1dGVFbnRyeU9mZnNldFNpemUoZW50cnkpKQorICAgIGZvciBlbnRyeSBpbiBzZWxmLm9wdGlvbmFsOgorICAgICAgaWYgZW50cnkgaW4gemlwX2ZpbGUubmFtZWxpc3QoKToKKyAgICAgICAgdG9rZW5zLmFwcGVuZChDb21wdXRlRW50cnlPZmZzZXRTaXplKGVudHJ5KSkKKworICAgICMgJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJyBpcyByZXF1aXJlZC4gV2UgZG9uJ3Qga25vdyBpdHMgYWN0dWFsCisgICAgIyBvZmZzZXQgYW5kIGxlbmd0aCAoYXMgd2VsbCBhcyB0aGUgdmFsdWVzIGZvciBvdGhlciBlbnRyaWVzKS4gU28gd2UgcmVzZXJ2ZQorICAgICMgMTAtYnl0ZSBhcyBhIHBsYWNlaG9sZGVyLCB3aGljaCBpcyB0byBjb3ZlciB0aGUgc3BhY2UgZm9yIG1ldGFkYXRhIGVudHJ5CisgICAgIyAoJ3h4Onh4eCcsIHNpbmNlIGl0J3MgWklQX1NUT1JFRCB3aGljaCBzaG91bGQgYXBwZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YKKyAgICAjIHRoZSB6aXApLCBhcyB3ZWxsIGFzIHRoZSBwb3NzaWJsZSB2YWx1ZSBjaGFuZ2VzIGluIG90aGVyIGVudHJpZXMuCisgICAgaWYgcmVzZXJ2ZV9zcGFjZToKKyAgICAgIHRva2Vucy5hcHBlbmQoJ21ldGFkYXRhOicgKyAnICcgKiAxMCkKKyAgICBlbHNlOgorICAgICAgdG9rZW5zLmFwcGVuZChDb21wdXRlRW50cnlPZmZzZXRTaXplKE1FVEFEQVRBX05BTUUpKQorCisgICAgcmV0dXJuICcsJy5qb2luKHRva2VucykKKworCitkZWYgRmluYWxpemVNZXRhZGF0YShtZXRhZGF0YSwgaW5wdXRfZmlsZSwgb3V0cHV0X2ZpbGUpOgorICAiIiJGaW5hbGl6ZXMgdGhlIG1ldGFkYXRhIGFuZCBzaWducyBhbiBBL0IgT1RBIHBhY2thZ2UuCisKKyAgSW4gb3JkZXIgdG8gc3RyZWFtIGFuIEEvQiBPVEEgcGFja2FnZSwgd2UgbmVlZCAnb3RhLXN0cmVhbWluZy1wcm9wZXJ0eS1maWxlcycKKyAgdGhhdCBjb250YWlucyB0aGUgb2Zmc2V0cyBhbmQgc2l6ZXMgZm9yIHRoZSBaSVAgZW50cmllcy4gQW4gZXhhbXBsZQorICBwcm9wZXJ0eS1maWxlcyBzdHJpbmcgaXMgYXMgZm9sbG93cy4KKworICAgICJwYXlsb2FkLmJpbjo2Nzk6MzQzLHBheWxvYWRfcHJvcGVydGllcy50eHQ6Mzc4OjQ1LG1ldGFkYXRhOjY5OjM3OSIKKworICBPVEEgc2VydmVyIGNhbiBwYXNzIGRvd24gdGhpcyBzdHJpbmcsIGluIGFkZGl0aW9uIHRvIHRoZSBwYWNrYWdlIFVSTCwgdG8gdGhlCisgIHN5c3RlbSB1cGRhdGUgY2xpZW50LiBTeXN0ZW0gdXBkYXRlIGNsaWVudCBjYW4gdGhlbiBmZXRjaCBpbmRpdmlkdWFsIFpJUAorICBlbnRyaWVzIChaSVBfU1RPUkVEKSBkaXJlY3RseSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IG9mIHRoZSBVUkwuCisKKyAgQXJnczoKKyAgICBtZXRhZGF0YTogVGhlIG1ldGFkYXRhIGRpY3QgZm9yIHRoZSBwYWNrYWdlLgorICAgIGlucHV0X2ZpbGU6IFRoZSBpbnB1dCBaSVAgZmlsZW5hbWUgdGhhdCBkb2Vzbid0IGNvbnRhaW4gdGhlIHBhY2thZ2UgTUVUQURBVEEKKyAgICAgICAgZW50cnkgeWV0LgorICAgIG91dHB1dF9maWxlOiBUaGUgZmluYWwgb3V0cHV0IFpJUCBmaWxlbmFtZS4KKyAgIiIiCisgIG91dHB1dF96aXAgPSB6aXBmaWxlLlppcEZpbGUoCisgICAgICBpbnB1dF9maWxlLCAnYScsIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgIHByb3BlcnR5X2ZpbGVzID0gU3RyZWFtaW5nUHJvcGVydHlGaWxlcygpCisKKyAgIyBXcml0ZSB0aGUgY3VycmVudCBtZXRhZGF0YSBlbnRyeSB3aXRoIHBsYWNlaG9sZGVycy4KKyAgbWV0YWRhdGFbJ290YS1zdHJlYW1pbmctcHJvcGVydHktZmlsZXMnXSA9IHByb3BlcnR5X2ZpbGVzLkNvbXB1dGUob3V0cHV0X3ppcCkKKyAgV3JpdGVNZXRhZGF0YShtZXRhZGF0YSwgb3V0cHV0X3ppcCkKKyAgY29tbW9uLlppcENsb3NlKG91dHB1dF96aXApCisKKyAgIyBTaWduT3V0cHV0KCksIHdoaWNoIGluIHR1cm4gY2FsbHMgc2lnbmFway5qYXIsIHdpbGwgcG9zc2libHkgcmVvcmRlciB0aGUKKyAgIyBaSVAgZW50cmllcywgYXMgd2VsbCBhcyBwYWRkaW5nIHRoZSBlbnRyeSBoZWFkZXJzLiBXZSBkbyBhIHByZWxpbWluYXJ5CisgICMgc2lnbmluZyAod2l0aCBhbiBpbmNvbXBsZXRlIG1ldGFkYXRhIGVudHJ5KSB0byBhbGxvdyB0aGF0IHRvIGhhcHBlbi4gVGhlbgorICAjIGNvbXB1dGUgdGhlIFpJUCBlbnRyeSBvZmZzZXRzLCB3cml0ZSBiYWNrIHRoZSBmaW5hbCBtZXRhZGF0YSBhbmQgZG8gdGhlCisgICMgZmluYWwgc2lnbmluZy4KKyAgcHJlbGltX3NpZ25pbmcgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgIFNpZ25PdXRwdXQoaW5wdXRfZmlsZSwgcHJlbGltX3NpZ25pbmcpCisKKyAgIyBPcGVuIHRoZSBzaWduZWQgemlwLiBDb21wdXRlIHRoZSBmaW5hbCBtZXRhZGF0YSB0aGF0J3MgbmVlZGVkIGZvciBzdHJlYW1pbmcuCisgIHdpdGggemlwZmlsZS5aaXBGaWxlKHByZWxpbV9zaWduaW5nLCAncicpIGFzIHByZWxpbV9zaWduaW5nX3ppcDoKKyAgICBleHBlY3RlZF9sZW5ndGggPSBsZW4obWV0YWRhdGFbJ290YS1zdHJlYW1pbmctcHJvcGVydHktZmlsZXMnXSkKKyAgICBtZXRhZGF0YVsnb3RhLXN0cmVhbWluZy1wcm9wZXJ0eS1maWxlcyddID0gcHJvcGVydHlfZmlsZXMuRmluYWxpemUoCisgICAgICAgIHByZWxpbV9zaWduaW5nX3ppcCwgZXhwZWN0ZWRfbGVuZ3RoKQorCisgICMgUmVwbGFjZSB0aGUgTUVUQURBVEEgZW50cnkuCisgIGNvbW1vbi5aaXBEZWxldGUocHJlbGltX3NpZ25pbmcsIE1FVEFEQVRBX05BTUUpCisgIG91dHB1dF96aXAgPSB6aXBmaWxlLlppcEZpbGUocHJlbGltX3NpZ25pbmcsICdhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKKyAgV3JpdGVNZXRhZGF0YShtZXRhZGF0YSwgb3V0cHV0X3ppcCkKKyAgY29tbW9uLlppcENsb3NlKG91dHB1dF96aXApCisKKyAgIyBSZS1zaWduIHRoZSBwYWNrYWdlIGFmdGVyIHVwZGF0aW5nIHRoZSBtZXRhZGF0YSBlbnRyeS4KKyAgU2lnbk91dHB1dChwcmVsaW1fc2lnbmluZywgb3V0cHV0X2ZpbGUpCisKKyAgIyBSZW9wZW4gdGhlIGZpbmFsIHNpZ25lZCB6aXAgdG8gZG91YmxlIGNoZWNrIHRoZSBzdHJlYW1pbmcgbWV0YWRhdGEuCisgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAncicpIGFzIG91dHB1dF96aXA6CisgICAgcHJvcGVydHlfZmlsZXMuVmVyaWZ5KAorICAgICAgICBvdXRwdXRfemlwLCBtZXRhZGF0YVsnb3RhLXN0cmVhbWluZy1wcm9wZXJ0eS1maWxlcyddLnN0cmlwKCkpCisKKworZGVmIFdyaXRlQmxvY2tJbmNyZW1lbnRhbE9UQVBhY2thZ2UodGFyZ2V0X3ppcCwgc291cmNlX3ppcCwgb3V0cHV0X3ppcCk6CisgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCwgT1BUSU9OUy5vZW1fZGljdHMpCisgIHNvdXJjZV9pbmZvID0gQnVpbGRJbmZvKE9QVElPTlMuc291cmNlX2luZm9fZGljdCwgT1BUSU9OUy5vZW1fZGljdHMpCisKKyAgdGFyZ2V0X2FwaV92ZXJzaW9uID0gdGFyZ2V0X2luZm9bInJlY292ZXJ5X2FwaV92ZXJzaW9uIl0KKyAgc291cmNlX2FwaV92ZXJzaW9uID0gc291cmNlX2luZm9bInJlY292ZXJ5X2FwaV92ZXJzaW9uIl0KKyAgaWYgc291cmNlX2FwaV92ZXJzaW9uID09IDA6CisgICAgcHJpbnQoIldBUk5JTkc6IGdlbmVyYXRpbmcgZWRpZnkgc2NyaXB0IGZvciBhIHNvdXJjZSB0aGF0ICIKKyAgICAgICAgICAiY2FuJ3QgaW5zdGFsbCBpdC4iKQorCisgIHNjcmlwdCA9IGVkaWZ5X2dlbmVyYXRvci5FZGlmeUdlbmVyYXRvcigKKyAgICAgIHNvdXJjZV9hcGlfdmVyc2lvbiwgdGFyZ2V0X2luZm8sIGZzdGFiPXNvdXJjZV9pbmZvWyJmc3RhYiJdKQorCisgIGlmIHRhcmdldF9pbmZvLm9lbV9wcm9wcyBvciBzb3VyY2VfaW5mby5vZW1fcHJvcHM6CisgICAgaWYgbm90IE9QVElPTlMub2VtX25vX21vdW50OgorICAgICAgc291cmNlX2luZm8uV3JpdGVNb3VudE9lbVNjcmlwdChzY3JpcHQpCisKKyAgbWV0YWRhdGEgPSBHZXRQYWNrYWdlTWV0YWRhdGEodGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKQogCiAgIGRldmljZV9zcGVjaWZpYyA9IGNvbW1vbi5EZXZpY2VTcGVjaWZpY1BhcmFtcygKICAgICAgIHNvdXJjZV96aXA9c291cmNlX3ppcCwKLSAgICAgIHNvdXJjZV92ZXJzaW9uPXNvdXJjZV92ZXJzaW9uLAorICAgICAgc291cmNlX3ZlcnNpb249c291cmNlX2FwaV92ZXJzaW9uLAogICAgICAgdGFyZ2V0X3ppcD10YXJnZXRfemlwLAotICAgICAgdGFyZ2V0X3ZlcnNpb249dGFyZ2V0X3ZlcnNpb24sCisgICAgICB0YXJnZXRfdmVyc2lvbj10YXJnZXRfYXBpX3ZlcnNpb24sCiAgICAgICBvdXRwdXRfemlwPW91dHB1dF96aXAsCiAgICAgICBzY3JpcHQ9c2NyaXB0LAogICAgICAgbWV0YWRhdGE9bWV0YWRhdGEsCi0gICAgICBpbmZvX2RpY3Q9T1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KQotCi0gIHNvdXJjZV9mcCA9IENhbGN1bGF0ZUZpbmdlcnByaW50KHNvdXJjZV9vZW1fcHJvcHMsIG9lbV9kaWN0cyBhbmQgb2VtX2RpY3RzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpCi0gIHRhcmdldF9mcCA9IENhbGN1bGF0ZUZpbmdlcnByaW50KHRhcmdldF9vZW1fcHJvcHMsIG9lbV9kaWN0cyBhbmQgb2VtX2RpY3RzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QpCi0gIG1ldGFkYXRhWyJwcmUtYnVpbGQiXSA9IHNvdXJjZV9mcAotICBtZXRhZGF0YVsicG9zdC1idWlsZCJdID0gdGFyZ2V0X2ZwCi0gIG1ldGFkYXRhWyJwcmUtYnVpbGQtaW5jcmVtZW50YWwiXSA9IEdldEJ1aWxkUHJvcCgKLSAgICAgICJyby5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsIiwgT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KQotICBtZXRhZGF0YVsicG9zdC1idWlsZC1pbmNyZW1lbnRhbCJdID0gR2V0QnVpbGRQcm9wKAotICAgICAgInJvLmJ1aWxkLnZlcnNpb24uaW5jcmVtZW50YWwiLCBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QpCisgICAgICBpbmZvX2RpY3Q9c291cmNlX2luZm8pCiAKICAgc291cmNlX2Jvb3QgPSBjb21tb24uR2V0Qm9vdGFibGVJbWFnZSgKLSAgICAgICIvdG1wL2Jvb3QuaW1nIiwgImJvb3QuaW1nIiwgT1BUSU9OUy5zb3VyY2VfdG1wLCAiQk9PVCIsCi0gICAgICBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpCisgICAgICAiL3RtcC9ib290LmltZyIsICJib290LmltZyIsIE9QVElPTlMuc291cmNlX3RtcCwgIkJPT1QiLCBzb3VyY2VfaW5mbykKICAgdGFyZ2V0X2Jvb3QgPSBjb21tb24uR2V0Qm9vdGFibGVJbWFnZSgKLSAgICAgICIvdG1wL2Jvb3QuaW1nIiwgImJvb3QuaW1nIiwgT1BUSU9OUy50YXJnZXRfdG1wLCAiQk9PVCIpCisgICAgICAiL3RtcC9ib290LmltZyIsICJib290LmltZyIsIE9QVElPTlMudGFyZ2V0X3RtcCwgIkJPT1QiLCB0YXJnZXRfaW5mbykKICAgdXBkYXRpbmdfYm9vdCA9IChub3QgT1BUSU9OUy50d29fc3RlcCBhbmQKICAgICAgICAgICAgICAgICAgICAoc291cmNlX2Jvb3QuZGF0YSAhPSB0YXJnZXRfYm9vdC5kYXRhKSkKIAogICB0YXJnZXRfcmVjb3ZlcnkgPSBjb21tb24uR2V0Qm9vdGFibGVJbWFnZSgKICAgICAgICIvdG1wL3JlY292ZXJ5LmltZyIsICJyZWNvdmVyeS5pbWciLCBPUFRJT05TLnRhcmdldF90bXAsICJSRUNPVkVSWSIpCiAKLSAgc3lzdGVtX3NyYyA9IEdldEltYWdlKCJzeXN0ZW0iLCBPUFRJT05TLnNvdXJjZV90bXApCi0gIHN5c3RlbV90Z3QgPSBHZXRJbWFnZSgic3lzdGVtIiwgT1BUSU9OUy50YXJnZXRfdG1wKQorICAjIFdoZW4gdGFyZ2V0IHVzZXMgJ0JPQVJEX0VYVDRfU0hBUkVfRFVQX0JMT0NLUyA6PSB0cnVlJywgaW1hZ2VzIG1heSBjb250YWluCisgICMgc2hhcmVkIGJsb2NrcyAoaS5lLiBzb21lIGJsb2NrcyB3aWxsIHNob3cgdXAgaW4gbXVsdGlwbGUgZmlsZXMnIGJsb2NrCisgICMgbGlzdCkuIFdlIGNhbiBvbmx5IGFsbG9jYXRlIHN1Y2ggc2hhcmVkIGJsb2NrcyB0byB0aGUgZmlyc3QgIm93bmVyIiwgYW5kCisgICMgZGlzYWJsZSBpbWdkaWZmIGZvciBhbGwgbGF0ZXIgb2NjdXJyZW5jZXMuCisgIGFsbG93X3NoYXJlZF9ibG9ja3MgPSAoc291cmNlX2luZm8uZ2V0KCdleHQ0X3NoYXJlX2R1cF9ibG9ja3MnKSA9PSAidHJ1ZSIgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaW5mby5nZXQoJ2V4dDRfc2hhcmVfZHVwX2Jsb2NrcycpID09ICJ0cnVlIikKKyAgc3lzdGVtX3NyYyA9IGNvbW1vbi5HZXRTcGFyc2VJbWFnZSgic3lzdGVtIiwgT1BUSU9OUy5zb3VyY2VfdG1wLCBzb3VyY2VfemlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3NoYXJlZF9ibG9ja3MpCisgIHN5c3RlbV90Z3QgPSBjb21tb24uR2V0U3BhcnNlSW1hZ2UoInN5c3RlbSIsIE9QVElPTlMudGFyZ2V0X3RtcCwgdGFyZ2V0X3ppcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19zaGFyZWRfYmxvY2tzKQogCi0gIGJsb2NraW1nZGlmZl92ZXJzaW9uID0gMQotICBpZiBPUFRJT05TLmluZm9fZGljdDoKLSAgICBibG9ja2ltZ2RpZmZfdmVyc2lvbiA9IG1heCgKLSAgICAgICAgaW50KGkpIGZvciBpIGluCi0gICAgICAgIE9QVElPTlMuaW5mb19kaWN0LmdldCgiYmxvY2tpbWdkaWZmX3ZlcnNpb25zIiwgIjEiKS5zcGxpdCgiLCIpKQorICBibG9ja2ltZ2RpZmZfdmVyc2lvbiA9IG1heCgKKyAgICAgIGludChpKSBmb3IgaSBpbiB0YXJnZXRfaW5mby5nZXQoImJsb2NraW1nZGlmZl92ZXJzaW9ucyIsICIxIikuc3BsaXQoIiwiKSkKKyAgYXNzZXJ0IGJsb2NraW1nZGlmZl92ZXJzaW9uID49IDMKIAogICAjIENoZWNrIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgc291cmNlIHN5c3RlbSBwYXJ0aXRpb24gZm9yIHJlbW91bnQgUi9XIG9ubHkKICAgIyBpZiB0aGUgZmlsZXN5c3RlbSBpcyBleHQ0LgotICBzeXN0ZW1fc3JjX3BhcnRpdGlvbiA9IE9QVElPTlMuc291cmNlX2luZm9fZGljdFsiZnN0YWIiXVsiL3N5c3RlbSJdCisgIHN5c3RlbV9zcmNfcGFydGl0aW9uID0gc291cmNlX2luZm9bImZzdGFiIl1bIi9zeXN0ZW0iXQogICBjaGVja19maXJzdF9ibG9jayA9IHN5c3RlbV9zcmNfcGFydGl0aW9uLmZzX3R5cGUgPT0gImV4dDQiCiAgICMgRGlzYWJsZSB1c2luZyBpbWdkaWZmIGZvciBzcXVhc2hmcy4gJ2ltZ2RpZmYgLXonIGV4cGVjdHMgaW5wdXQgZmlsZXMgdG8gYmUKICAgIyBpbiB6aXAgZm9ybWF0cy4gSG93ZXZlciB3aXRoIHNxdWFzaGZzLCBhKSBhbGwgZmlsZXMgYXJlIGNvbXByZXNzZWQgaW4gTFo0OwogICAjIGIpIHRoZSBibG9ja3MgbGlzdGVkIGluIGJsb2NrIG1hcCBtYXkgbm90IGNvbnRhaW4gYWxsIHRoZSBieXRlcyBmb3IgYSBnaXZlbgogICAjIGZpbGUgKGJlY2F1c2UgdGhleSdyZSByb3VuZGVkIHRvIGJlIDRLLWFsaWduZWQpLgotICBzeXN0ZW1fdGd0X3BhcnRpdGlvbiA9IE9QVElPTlMudGFyZ2V0X2luZm9fZGljdFsiZnN0YWIiXVsiL3N5c3RlbSJdCisgIHN5c3RlbV90Z3RfcGFydGl0aW9uID0gdGFyZ2V0X2luZm9bImZzdGFiIl1bIi9zeXN0ZW0iXQogICBkaXNhYmxlX2ltZ2RpZmYgPSAoc3lzdGVtX3NyY19wYXJ0aXRpb24uZnNfdHlwZSA9PSAic3F1YXNoZnMiIG9yCiAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fdGd0X3BhcnRpdGlvbi5mc190eXBlID09ICJzcXVhc2hmcyIpCiAgIHN5c3RlbV9kaWZmID0gY29tbW9uLkJsb2NrRGlmZmVyZW5jZSgic3lzdGVtIiwgc3lzdGVtX3RndCwgc3lzdGVtX3NyYywKQEAgLTY3MywxMiArMTIxNSwxNCBAQAogICBpZiBIYXNWZW5kb3JQYXJ0aXRpb24odGFyZ2V0X3ppcCk6CiAgICAgaWYgbm90IEhhc1ZlbmRvclBhcnRpdGlvbihzb3VyY2VfemlwKToKICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY2FuJ3QgZ2VuZXJhdGUgaW5jcmVtZW50YWwgdGhhdCBhZGRzIC92ZW5kb3IiKQotICAgIHZlbmRvcl9zcmMgPSBHZXRJbWFnZSgidmVuZG9yIiwgT1BUSU9OUy5zb3VyY2VfdG1wKQotICAgIHZlbmRvcl90Z3QgPSBHZXRJbWFnZSgidmVuZG9yIiwgT1BUSU9OUy50YXJnZXRfdG1wKQorICAgIHZlbmRvcl9zcmMgPSBjb21tb24uR2V0U3BhcnNlSW1hZ2UoInZlbmRvciIsIE9QVElPTlMuc291cmNlX3RtcCwgc291cmNlX3ppcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3NoYXJlZF9ibG9ja3MpCisgICAgdmVuZG9yX3RndCA9IGNvbW1vbi5HZXRTcGFyc2VJbWFnZSgidmVuZG9yIiwgT1BUSU9OUy50YXJnZXRfdG1wLCB0YXJnZXRfemlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfc2hhcmVkX2Jsb2NrcykKIAogICAgICMgQ2hlY2sgZmlyc3QgYmxvY2sgb2YgdmVuZG9yIHBhcnRpdGlvbiBmb3IgcmVtb3VudCBSL1cgb25seSBpZgogICAgICMgZGlzayB0eXBlIGlzIGV4dDQKLSAgICB2ZW5kb3JfcGFydGl0aW9uID0gT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0WyJmc3RhYiJdWyIvdmVuZG9yIl0KKyAgICB2ZW5kb3JfcGFydGl0aW9uID0gc291cmNlX2luZm9bImZzdGFiIl1bIi92ZW5kb3IiXQogICAgIGNoZWNrX2ZpcnN0X2Jsb2NrID0gdmVuZG9yX3BhcnRpdGlvbi5mc190eXBlID09ICJleHQ0IgogICAgIGRpc2FibGVfaW1nZGlmZiA9IHZlbmRvcl9wYXJ0aXRpb24uZnNfdHlwZSA9PSAic3F1YXNoZnMiCiAgICAgdmVuZG9yX2RpZmYgPSBjb21tb24uQmxvY2tEaWZmZXJlbmNlKCJ2ZW5kb3IiLCB2ZW5kb3JfdGd0LCB2ZW5kb3Jfc3JjLApAQCAtNjg4LDcgKzEyMzIsMTEgQEAKICAgZWxzZToKICAgICB2ZW5kb3JfZGlmZiA9IE5vbmUKIAotICBBcHBlbmRBc3NlcnRpb25zKHNjcmlwdCwgT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0LCBvZW1fZGljdHMpCisgIEFkZENvbXBhdGliaWxpdHlBcmNoaXZlSWZUcmVibGVFbmFibGVkKAorICAgICAgdGFyZ2V0X3ppcCwgb3V0cHV0X3ppcCwgdGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKQorCisgICMgQXNzZXJ0aW9ucyAoZS5nLiBkZXZpY2UgcHJvcGVydGllcyBjaGVjaykuCisgIHRhcmdldF9pbmZvLldyaXRlRGV2aWNlQXNzZXJ0aW9ucyhzY3JpcHQsIE9QVElPTlMub2VtX25vX21vdW50KQogICBkZXZpY2Vfc3BlY2lmaWMuSW5jcmVtZW50YWxPVEFfQXNzZXJ0aW9ucygpCiAKICAgIyBUd28tc3RlcCBpbmNyZW1lbnRhbCBwYWNrYWdlIHN0cmF0ZWd5IChpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLApAQCAtNzE0LDEyICsxMjYyLDEyIEBACiAgICMgICAgKGFsbG93IHJlY292ZXJ5IHRvIG1hcmsgaXRzZWxmIGZpbmlzaGVkIGFuZCByZWJvb3QpCiAKICAgaWYgT1BUSU9OUy50d29fc3RlcDoKLSAgICBpZiBub3QgT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0LmdldCgibXVsdGlzdGFnZV9zdXBwb3J0IiwgTm9uZSk6CisgICAgaWYgbm90IHNvdXJjZV9pbmZvLmdldCgibXVsdGlzdGFnZV9zdXBwb3J0Iik6CiAgICAgICBhc3NlcnQgRmFsc2UsICJ0d28tc3RlcCBwYWNrYWdlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQiCi0gICAgZnMgPSBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3RbImZzdGFiIl1bIi9taXNjIl0KKyAgICBmcyA9IHNvdXJjZV9pbmZvWyJmc3RhYiJdWyIvbWlzYyJdCiAgICAgYXNzZXJ0IGZzLmZzX3R5cGUudXBwZXIoKSA9PSAiRU1NQyIsIFwKICAgICAgICAgInR3by1zdGVwIHBhY2thZ2VzIG9ubHkgc3VwcG9ydGVkIG9uIGRldmljZXMgd2l0aCBFTU1DIC9taXNjIHBhcnRpdGlvbnMiCi0gICAgYmNiX2RldiA9IHsiYmNiX2RldiI6IGZzLmRldmljZX0KKyAgICBiY2JfZGV2ID0geyJiY2JfZGV2IiA6IGZzLmRldmljZX0KICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3ppcCwgInJlY292ZXJ5LmltZyIsIHRhcmdldF9yZWNvdmVyeS5kYXRhKQogICAgIHNjcmlwdC5BcHBlbmRFeHRyYSgiIiIKIGlmIGdldF9zdGFnZSgiJShiY2JfZGV2KXMiKSA9PSAiMi8zIiB0aGVuCkBAIC03MzksMzkgKzEyODcsMTQgQEAKICAgICBzY3JpcHQuQ29tbWVudCgiU3RhZ2UgMS8zIikKIAogICAjIER1bXAgZmluZ2VycHJpbnRzCi0gIHNjcmlwdC5QcmludCgiU291cmNlOiAlcyIgJSAoc291cmNlX2ZwLCkpCi0gIHNjcmlwdC5QcmludCgiVGFyZ2V0OiAlcyIgJSAodGFyZ2V0X2ZwLCkpCisgIHNjcmlwdC5QcmludCgiU291cmNlOiB7fSIuZm9ybWF0KHNvdXJjZV9pbmZvLmZpbmdlcnByaW50KSkKKyAgc2NyaXB0LlByaW50KCJUYXJnZXQ6IHt9Ii5mb3JtYXQodGFyZ2V0X2luZm8uZmluZ2VycHJpbnQpKQogCiAgIHNjcmlwdC5QcmludCgiVmVyaWZ5aW5nIGN1cnJlbnQgc3lzdGVtLi4uIikKIAogICBkZXZpY2Vfc3BlY2lmaWMuSW5jcmVtZW50YWxPVEFfVmVyaWZ5QmVnaW4oKQogCi0gICMgV2hlbiBibG9ja2ltZ2RpZmYgdmVyc2lvbiBpcyBsZXNzIHRoYW4gMyAobm9uLXJlc3VtYWJsZSBibG9jay1iYXNlZCBPVEEpLAotICAjIHBhdGNoaW5nIG9uIGEgZGV2aWNlIHRoYXQncyBhbHJlYWR5IG9uIHRoZSB0YXJnZXQgYnVpbGQgd2lsbCBkYW1hZ2UgdGhlCi0gICMgc3lzdGVtLiBCZWNhdXNlIG9wZXJhdGlvbnMgbGlrZSBtb3ZlIGRvbid0IGNoZWNrIHRoZSBibG9jayBzdGF0ZSwgdGhleQotICAjIGFsd2F5cyBhcHBseSB0aGUgY2hhbmdlcyB1bmNvbmRpdGlvbmFsbHkuCi0gIGlmIGJsb2NraW1nZGlmZl92ZXJzaW9uIDw9IDI6Ci0gICAgaWYgc291cmNlX29lbV9wcm9wcyBpcyBOb25lOgotICAgICAgc2NyaXB0LkFzc2VydFNvbWVGaW5nZXJwcmludChzb3VyY2VfZnApCi0gICAgZWxzZToKLSAgICAgIHNjcmlwdC5Bc3NlcnRTb21lVGh1bWJwcmludCgKLSAgICAgICAgICBHZXRCdWlsZFByb3AoInJvLmJ1aWxkLnRodW1icHJpbnQiLCBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpKQotCi0gIGVsc2U6ICMgYmxvY2tpbWdkaWZmX3ZlcnNpb24gPiAyCi0gICAgaWYgc291cmNlX29lbV9wcm9wcyBpcyBOb25lIGFuZCB0YXJnZXRfb2VtX3Byb3BzIGlzIE5vbmU6Ci0gICAgICBzY3JpcHQuQXNzZXJ0U29tZUZpbmdlcnByaW50KHNvdXJjZV9mcCwgdGFyZ2V0X2ZwKQotICAgIGVsaWYgc291cmNlX29lbV9wcm9wcyBpcyBub3QgTm9uZSBhbmQgdGFyZ2V0X29lbV9wcm9wcyBpcyBub3QgTm9uZToKLSAgICAgIHNjcmlwdC5Bc3NlcnRTb21lVGh1bWJwcmludCgKLSAgICAgICAgICBHZXRCdWlsZFByb3AoInJvLmJ1aWxkLnRodW1icHJpbnQiLCBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QpLAotICAgICAgICAgIEdldEJ1aWxkUHJvcCgicm8uYnVpbGQudGh1bWJwcmludCIsIE9QVElPTlMuc291cmNlX2luZm9fZGljdCkpCi0gICAgZWxpZiBzb3VyY2Vfb2VtX3Byb3BzIGlzIE5vbmUgYW5kIHRhcmdldF9vZW1fcHJvcHMgaXMgbm90IE5vbmU6Ci0gICAgICBzY3JpcHQuQXNzZXJ0RmluZ2VycHJpbnRPclRodW1icHJpbnQoCi0gICAgICAgICAgc291cmNlX2ZwLAotICAgICAgICAgIEdldEJ1aWxkUHJvcCgicm8uYnVpbGQudGh1bWJwcmludCIsIE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCkpCi0gICAgZWxzZToKLSAgICAgIHNjcmlwdC5Bc3NlcnRGaW5nZXJwcmludE9yVGh1bWJwcmludCgKLSAgICAgICAgICB0YXJnZXRfZnAsCi0gICAgICAgICAgR2V0QnVpbGRQcm9wKCJyby5idWlsZC50aHVtYnByaW50IiwgT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KSkKKyAgV3JpdGVGaW5nZXJwcmludEFzc2VydGlvbihzY3JpcHQsIHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKIAogICAjIENoZWNrIHRoZSByZXF1aXJlZCBjYWNoZSBzaXplIChpLmUuIHN0YXNoZWQgYmxvY2tzKS4KICAgc2l6ZSA9IFtdCkBAIC03ODEsOCArMTMwNCw3IEBACiAgICAgc2l6ZS5hcHBlbmQodmVuZG9yX2RpZmYucmVxdWlyZWRfY2FjaGUpCiAKICAgaWYgdXBkYXRpbmdfYm9vdDoKLSAgICBib290X3R5cGUsIGJvb3RfZGV2aWNlID0gY29tbW9uLkdldFR5cGVBbmREZXZpY2UoCi0gICAgICAgICIvYm9vdCIsIE9QVElPTlMuc291cmNlX2luZm9fZGljdCkKKyAgICBib290X3R5cGUsIGJvb3RfZGV2aWNlID0gY29tbW9uLkdldFR5cGVBbmREZXZpY2UoIi9ib290Iiwgc291cmNlX2luZm8pCiAgICAgZCA9IGNvbW1vbi5EaWZmZXJlbmNlKHRhcmdldF9ib290LCBzb3VyY2VfYm9vdCkKICAgICBfLCBfLCBkID0gZC5Db21wdXRlUGF0Y2goKQogICAgIGlmIGQgaXMgTm9uZToKQEAgLTg3Miw3ICsxMzk0LDYgQEAKICAgaWYgT1BUSU9OUy53aXBlX3VzZXJfZGF0YToKICAgICBzY3JpcHQuUHJpbnQoIkVyYXNpbmcgdXNlciBkYXRhLi4uIikKICAgICBzY3JpcHQuRm9ybWF0UGFydGl0aW9uKCIvZGF0YSIpCi0gICAgbWV0YWRhdGFbIm90YS13aXBlIl0gPSAieWVzIgogCiAgIGlmIE9QVElPTlMudHdvX3N0ZXA6CiAgICAgc2NyaXB0LkFwcGVuZEV4dHJhKCIiIgpAQCAtODkyLDM4MyArMTQxMywxNjQgQEAKICAgV3JpdGVNZXRhZGF0YShtZXRhZGF0YSwgb3V0cHV0X3ppcCkKIAogCi1kZWYgV3JpdGVWZXJpZnlQYWNrYWdlKGlucHV0X3ppcCwgb3V0cHV0X3ppcCk6Ci0gIHNjcmlwdCA9IGVkaWZ5X2dlbmVyYXRvci5FZGlmeUdlbmVyYXRvcigzLCBPUFRJT05TLmluZm9fZGljdCkKK2RlZiBHZXRUYXJnZXRGaWxlc1ppcEZvclNlY29uZGFyeUltYWdlcyhpbnB1dF9maWxlLCBza2lwX3Bvc3RpbnN0YWxsPUZhbHNlKToKKyAgIiIiUmV0dXJucyBhIHRhcmdldC1maWxlcy56aXAgZmlsZSBmb3IgZ2VuZXJhdGluZyBzZWNvbmRhcnkgcGF5bG9hZC4KIAotICBvZW1fcHJvcHMgPSBPUFRJT05TLmluZm9fZGljdC5nZXQoIm9lbV9maW5nZXJwcmludF9wcm9wZXJ0aWVzIikKLSAgcmVjb3ZlcnlfbW91bnRfb3B0aW9ucyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgKLSAgICAgICJyZWNvdmVyeV9tb3VudF9vcHRpb25zIikKLSAgb2VtX2RpY3RzID0gTm9uZQotICBpZiBvZW1fcHJvcHM6Ci0gICAgb2VtX2RpY3RzID0gX0xvYWRPZW1EaWN0cyhzY3JpcHQsIHJlY292ZXJ5X21vdW50X29wdGlvbnMpCisgIEFsdGhvdWdoIHRoZSBvcmlnaW5hbCB0YXJnZXQtZmlsZXMuemlwIGFscmVhZHkgY29udGFpbnMgc2Vjb25kYXJ5IHNsb3QKKyAgaW1hZ2VzIChpLmUuIElNQUdFUy9zeXN0ZW1fb3RoZXIuaW1nKSwgd2UgbmVlZCB0byByZW5hbWUgdGhlIGZpbGVzIHRvIHRoZQorICBvbmVzIHdpdGhvdXQgX290aGVyIHN1ZmZpeC4gTm90ZSB0aGF0IHdlIGNhbm5vdCBpbnN0ZWFkIG1vZGlmeSB0aGUgbmFtZXMgaW4KKyAgTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCwgYmVjYXVzZSB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgcGFydGl0aW9ucyBvbiBkZXZpY2UuCiAKLSAgdGFyZ2V0X2ZwID0gQ2FsY3VsYXRlRmluZ2VycHJpbnQob2VtX3Byb3BzLCBvZW1fZGljdHMgYW5kIG9lbV9kaWN0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QpCi0gIG1ldGFkYXRhID0gewotICAgICAgInBvc3QtYnVpbGQiOiB0YXJnZXRfZnAsCi0gICAgICAicHJlLWRldmljZSI6IEdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0LmRldmljZSIsIG9lbV9wcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX2RpY3RzIGFuZCBvZW1fZGljdHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuaW5mb19kaWN0KSwKLSAgICAgICJwb3N0LXRpbWVzdGFtcCI6IEdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiLCBPUFRJT05TLmluZm9fZGljdCksCi0gIH0KKyAgRm9yIHRoZSBwYXJ0aXRpb25zIHRoYXQgZG9uJ3QgaGF2ZSBzZWNvbmRhcnkgaW1hZ2VzLCB0aGUgb25lcyBmb3IgcHJpbWFyeQorICBzbG90IHdpbGwgYmUgdXNlZC4gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSB2YWxpZCBib290LCB2Ym1ldGEsCisgIGJvb3Rsb2FkZXIgaW1hZ2VzIGluIHRoZSBpbmFjdGl2ZSBzbG90LgogCi0gIGRldmljZV9zcGVjaWZpYyA9IGNvbW1vbi5EZXZpY2VTcGVjaWZpY1BhcmFtcygKLSAgICAgIGlucHV0X3ppcD1pbnB1dF96aXAsCi0gICAgICBpbnB1dF92ZXJzaW9uPU9QVElPTlMuaW5mb19kaWN0WyJyZWNvdmVyeV9hcGlfdmVyc2lvbiJdLAotICAgICAgb3V0cHV0X3ppcD1vdXRwdXRfemlwLAotICAgICAgc2NyaXB0PXNjcmlwdCwKLSAgICAgIGlucHV0X3RtcD1PUFRJT05TLmlucHV0X3RtcCwKLSAgICAgIG1ldGFkYXRhPW1ldGFkYXRhLAotICAgICAgaW5mb19kaWN0PU9QVElPTlMuaW5mb19kaWN0KQorICBBcmdzOgorICAgIGlucHV0X2ZpbGU6IFRoZSBpbnB1dCB0YXJnZXQtZmlsZXMuemlwIGZpbGUuCisgICAgc2tpcF9wb3N0aW5zdGFsbDogV2hldGhlciB0byBza2lwIGNvcHlpbmcgdGhlIHBvc3RpbnN0YWxsIGNvbmZpZyBmaWxlLgogCi0gIEFwcGVuZEFzc2VydGlvbnMoc2NyaXB0LCBPUFRJT05TLmluZm9fZGljdCwgb2VtX2RpY3RzKQorICBSZXR1cm5zOgorICAgIFRoZSBmaWxlbmFtZSBvZiB0aGUgdGFyZ2V0LWZpbGVzLnppcCBmb3IgZ2VuZXJhdGluZyBzZWNvbmRhcnkgcGF5bG9hZC4KKyAgIiIiCisgIHRhcmdldF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InRhcmdldGZpbGVzLSIsIHN1ZmZpeD0iLnppcCIpCisgIHRhcmdldF96aXAgPSB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUsICd3JywgYWxsb3daaXA2ND1UcnVlKQogCi0gIHNjcmlwdC5QcmludCgiVmVyaWZ5aW5nIGRldmljZSBpbWFnZXMgYWdhaW5zdCAlcy4uLiIgJSB0YXJnZXRfZnApCi0gIHNjcmlwdC5BcHBlbmRFeHRyYSgiIikKKyAgaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcChpbnB1dF9maWxlLCBVTlpJUF9QQVRURVJOKQorICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICBpbmZvbGlzdCA9IGlucHV0X3ppcC5pbmZvbGlzdCgpCiAKLSAgc2NyaXB0LlByaW50KCJWZXJpZnlpbmcgYm9vdC4uLiIpCi0gIGJvb3RfaW1nID0gY29tbW9uLkdldEJvb3RhYmxlSW1hZ2UoCi0gICAgICAiYm9vdC5pbWciLCAiYm9vdC5pbWciLCBPUFRJT05TLmlucHV0X3RtcCwgIkJPT1QiKQotICBib290X3R5cGUsIGJvb3RfZGV2aWNlID0gY29tbW9uLkdldFR5cGVBbmREZXZpY2UoCi0gICAgICAiL2Jvb3QiLCBPUFRJT05TLmluZm9fZGljdCkKLSAgc2NyaXB0LlZlcmlmeSgiJXM6JXM6JWQ6JXMiICUgKAotICAgICAgYm9vdF90eXBlLCBib290X2RldmljZSwgYm9vdF9pbWcuc2l6ZSwgYm9vdF9pbWcuc2hhMSkpCi0gIHNjcmlwdC5BcHBlbmRFeHRyYSgiIikKKyAgZm9yIGluZm8gaW4gaW5mb2xpc3Q6CisgICAgdW56aXBwZWRfZmlsZSA9IG9zLnBhdGguam9pbihpbnB1dF90bXAsICppbmZvLmZpbGVuYW1lLnNwbGl0KCcvJykpCisgICAgaWYgaW5mby5maWxlbmFtZSA9PSAnSU1BR0VTL3N5c3RlbV9vdGhlci5pbWcnOgorICAgICAgY29tbW9uLlppcFdyaXRlKHRhcmdldF96aXAsIHVuemlwcGVkX2ZpbGUsIGFyY25hbWU9J0lNQUdFUy9zeXN0ZW0uaW1nJykKIAotICBzY3JpcHQuUHJpbnQoIlZlcmlmeWluZyByZWNvdmVyeS4uLiIpCi0gIHJlY292ZXJ5X2ltZyA9IGNvbW1vbi5HZXRCb290YWJsZUltYWdlKAotICAgICAgInJlY292ZXJ5LmltZyIsICJyZWNvdmVyeS5pbWciLCBPUFRJT05TLmlucHV0X3RtcCwgIlJFQ09WRVJZIikKLSAgcmVjb3ZlcnlfdHlwZSwgcmVjb3ZlcnlfZGV2aWNlID0gY29tbW9uLkdldFR5cGVBbmREZXZpY2UoCi0gICAgICAiL3JlY292ZXJ5IiwgT1BUSU9OUy5pbmZvX2RpY3QpCi0gIHNjcmlwdC5WZXJpZnkoIiVzOiVzOiVkOiVzIiAlICgKLSAgICAgIHJlY292ZXJ5X3R5cGUsIHJlY292ZXJ5X2RldmljZSwgcmVjb3ZlcnlfaW1nLnNpemUsIHJlY292ZXJ5X2ltZy5zaGExKSkKLSAgc2NyaXB0LkFwcGVuZEV4dHJhKCIiKQorICAgICMgUHJpbWFyeSBpbWFnZXMgYW5kIGZyaWVuZHMgbmVlZCB0byBiZSBza2lwcGVkIGV4cGxpY2l0bHkuCisgICAgZWxpZiBpbmZvLmZpbGVuYW1lIGluICgnSU1BR0VTL3N5c3RlbS5pbWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lNQUdFUy9zeXN0ZW0ubWFwJyk6CisgICAgICBwYXNzCiAKLSAgc3lzdGVtX3RndCA9IEdldEltYWdlKCJzeXN0ZW0iLCBPUFRJT05TLmlucHV0X3RtcCkKLSAgc3lzdGVtX3RndC5SZXNldEZpbGVNYXAoKQotICBzeXN0ZW1fZGlmZiA9IGNvbW1vbi5CbG9ja0RpZmZlcmVuY2UoInN5c3RlbSIsIHN5c3RlbV90Z3QsIHNyYz1Ob25lKQotICBzeXN0ZW1fZGlmZi5Xcml0ZVN0cmljdFZlcmlmeVNjcmlwdChzY3JpcHQpCisgICAgIyBTa2lwIGNvcHlpbmcgdGhlIHBvc3RpbnN0YWxsIGNvbmZpZyBpZiByZXF1ZXN0ZWQuCisgICAgZWxpZiBza2lwX3Bvc3RpbnN0YWxsIGFuZCBpbmZvLmZpbGVuYW1lID09IFBPU1RJTlNUQUxMX0NPTkZJRzoKKyAgICAgIHBhc3MKIAotICBpZiBIYXNWZW5kb3JQYXJ0aXRpb24oaW5wdXRfemlwKToKLSAgICB2ZW5kb3JfdGd0ID0gR2V0SW1hZ2UoInZlbmRvciIsIE9QVElPTlMuaW5wdXRfdG1wKQotICAgIHZlbmRvcl90Z3QuUmVzZXRGaWxlTWFwKCkKLSAgICB2ZW5kb3JfZGlmZiA9IGNvbW1vbi5CbG9ja0RpZmZlcmVuY2UoInZlbmRvciIsIHZlbmRvcl90Z3QsIHNyYz1Ob25lKQotICAgIHZlbmRvcl9kaWZmLldyaXRlU3RyaWN0VmVyaWZ5U2NyaXB0KHNjcmlwdCkKKyAgICBlbGlmIGluZm8uZmlsZW5hbWUuc3RhcnRzd2l0aCgoJ01FVEEvJywgJ0lNQUdFUy8nKSk6CisgICAgICBjb21tb24uWmlwV3JpdGUodGFyZ2V0X3ppcCwgdW56aXBwZWRfZmlsZSwgYXJjbmFtZT1pbmZvLmZpbGVuYW1lKQogCi0gICMgRGV2aWNlIHNwZWNpZmljIHBhcnRpdGlvbnMsIHN1Y2ggYXMgcmFkaW8sIGJvb3Rsb2FkZXIgYW5kIGV0Yy4KLSAgZGV2aWNlX3NwZWNpZmljLlZlcmlmeU9UQV9Bc3NlcnRpb25zKCkKKyAgY29tbW9uLlppcENsb3NlKHRhcmdldF96aXApCiAKLSAgc2NyaXB0LlNldFByb2dyZXNzKDEuMCkKLSAgc2NyaXB0LkFkZFRvWmlwKGlucHV0X3ppcCwgb3V0cHV0X3ppcCwgaW5wdXRfcGF0aD1PUFRJT05TLnVwZGF0ZXJfYmluYXJ5KQotICBtZXRhZGF0YVsib3RhLXJlcXVpcmVkLWNhY2hlIl0gPSBzdHIoc2NyaXB0LnJlcXVpcmVkX2NhY2hlKQotICBXcml0ZU1ldGFkYXRhKG1ldGFkYXRhLCBvdXRwdXRfemlwKQorICByZXR1cm4gdGFyZ2V0X2ZpbGUKKworCitkZWYgR2V0VGFyZ2V0RmlsZXNaaXBXaXRob3V0UG9zdGluc3RhbGxDb25maWcoaW5wdXRfZmlsZSk6CisgICIiIlJldHVybnMgYSB0YXJnZXQtZmlsZXMuemlwIHRoYXQncyBub3QgY29udGFpbmluZyBwb3N0aW5zdGFsbF9jb25maWcudHh0LgorCisgIFRoaXMgYWxsb3dzIGJyaWxsb191cGRhdGVfcGF5bG9hZCBzY3JpcHQgdG8gc2tpcCB3cml0aW5nIGFsbCB0aGUgcG9zdGluc3RhbGwKKyAgaG9va3MgaW4gdGhlIGdlbmVyYXRlZCBwYXlsb2FkLiBUaGUgaW5wdXQgdGFyZ2V0LWZpbGVzLnppcCBmaWxlIHdpbGwgYmUKKyAgZHVwbGljYXRlZCwgd2l0aCAnTUVUQS9wb3N0aW5zdGFsbF9jb25maWcudHh0JyBza2lwcGVkLiBJZiBpbnB1dF9maWxlIGRvZXNuJ3QKKyAgY29udGFpbiB0aGUgcG9zdGluc3RhbGxfY29uZmlnLnR4dCBlbnRyeSwgdGhlIGlucHV0IGZpbGUgd2lsbCBiZSByZXR1cm5lZC4KKworICBBcmdzOgorICAgIGlucHV0X2ZpbGU6IFRoZSBpbnB1dCB0YXJnZXQtZmlsZXMuemlwIGZpbGVuYW1lLgorCisgIFJldHVybnM6CisgICAgVGhlIGZpbGVuYW1lIG9mIHRhcmdldC1maWxlcy56aXAgdGhhdCBkb2Vzbid0IGNvbnRhaW4gcG9zdGluc3RhbGwgY29uZmlnLgorICAiIiIKKyAgIyBXZSBzaG91bGQgb25seSBtYWtlIGEgY29weSBpZiBwb3N0aW5zdGFsbF9jb25maWcgZW50cnkgZXhpc3RzLgorICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICBpZiBQT1NUSU5TVEFMTF9DT05GSUcgbm90IGluIGlucHV0X3ppcC5uYW1lbGlzdCgpOgorICAgICAgcmV0dXJuIGlucHV0X2ZpbGUKKworICB0YXJnZXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJ0YXJnZXRmaWxlcy0iLCBzdWZmaXg9Ii56aXAiKQorICBzaHV0aWwuY29weWZpbGUoaW5wdXRfZmlsZSwgdGFyZ2V0X2ZpbGUpCisgIGNvbW1vbi5aaXBEZWxldGUodGFyZ2V0X2ZpbGUsIFBPU1RJTlNUQUxMX0NPTkZJRykKKyAgcmV0dXJuIHRhcmdldF9maWxlCiAKIAogZGVmIFdyaXRlQUJPVEFQYWNrYWdlV2l0aEJyaWxsb1NjcmlwdCh0YXJnZXRfZmlsZSwgb3V0cHV0X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9maWxlPU5vbmUpOgotICAiIiJHZW5lcmF0ZSBhbiBBbmRyb2lkIE9UQSBwYWNrYWdlIHRoYXQgaGFzIEEvQiB1cGRhdGUgcGF5bG9hZC4iIiIKLQotICBkZWYgQ29tcHV0ZVN0cmVhbWluZ01ldGFkYXRhKHppcF9maWxlLCByZXNlcnZlX3NwYWNlPUZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2xlbmd0aD1Ob25lKToKLSAgICAiIiJDb21wdXRlIHRoZSBzdHJlYW1pbmcgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gemlwLgotCi0gICAgV2hlbiAncmVzZXJ2ZV9zcGFjZScgaXMgVHJ1ZSwgd2UgcmVzZXJ2ZSBleHRyYSBzcGFjZSBmb3IgdGhlIG9mZnNldCBhbmQKLSAgICBsZW5ndGggb2YgdGhlIG1ldGFkYXRhIGVudHJ5IGl0c2VsZiwgYWx0aG91Z2ggd2UgZG9uJ3Qga25vdyB0aGUgZmluYWwKLSAgICB2YWx1ZXMgdW50aWwgdGhlIHBhY2thZ2UgZ2V0cyBzaWduZWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4KLSAgICBhZnRlciBzaWduaW5nLiBXZSB0aGVuIHdyaXRlIHRoZSBhY3R1YWwgdmFsdWVzIGFuZCBwYWQgdGhlIHN0cmluZyB0byB0aGUKLSAgICBsZW5ndGggd2Ugc2V0IGVhcmxpZXIuIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlCi0gICAgbWV0YWRhdGEgZW50cnkgaW4gdGhlIHNlY29uZCBydW4uIE90aGVyd2lzZSB0aGUgb2Zmc2V0cyBmb3Igb3RoZXIgZW50cmllcwotICAgIHdpbGwgYmUgY2hhbmdpbmcgYWdhaW4uCi0gICAgIiIiCi0KLSAgICBkZWYgQ29tcHV0ZUVudHJ5T2Zmc2V0U2l6ZShuYW1lKToKLSAgICAgICIiIkNvbXB1dGUgdGhlIHppcCBlbnRyeSBvZmZzZXQgYW5kIHNpemUuIiIiCi0gICAgICBpbmZvID0gemlwX2ZpbGUuZ2V0aW5mbyhuYW1lKQotICAgICAgb2Zmc2V0ID0gaW5mby5oZWFkZXJfb2Zmc2V0ICsgbGVuKGluZm8uRmlsZUhlYWRlcigpKQotICAgICAgc2l6ZSA9IGluZm8uZmlsZV9zaXplCi0gICAgICByZXR1cm4gJyVzOiVkOiVkJyAlIChvcy5wYXRoLmJhc2VuYW1lKG5hbWUpLCBvZmZzZXQsIHNpemUpCi0KLSAgICAjIHBheWxvYWQuYmluIGFuZCBwYXlsb2FkX3Byb3BlcnRpZXMudHh0IG11c3QgZXhpc3QuCi0gICAgb2Zmc2V0cyA9IFtDb21wdXRlRW50cnlPZmZzZXRTaXplKCdwYXlsb2FkLmJpbicpLAotICAgICAgICAgICAgICAgQ29tcHV0ZUVudHJ5T2Zmc2V0U2l6ZSgncGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCcpXQotCi0gICAgIyBjYXJlX21hcC50eHQgaXMgYXZhaWxhYmxlIG9ubHkgaWYgZG0tdmVyaXR5IGlzIGVuYWJsZWQuCi0gICAgaWYgJ2NhcmVfbWFwLnR4dCcgaW4gemlwX2ZpbGUubmFtZWxpc3QoKToKLSAgICAgIG9mZnNldHMuYXBwZW5kKENvbXB1dGVFbnRyeU9mZnNldFNpemUoJ2NhcmVfbWFwLnR4dCcpKQotCi0gICAgaWYgJ2NvbXBhdGliaWxpdHkuemlwJyBpbiB6aXBfZmlsZS5uYW1lbGlzdCgpOgotICAgICAgb2Zmc2V0cy5hcHBlbmQoQ29tcHV0ZUVudHJ5T2Zmc2V0U2l6ZSgnY29tcGF0aWJpbGl0eS56aXAnKSkKLQotICAgICMgJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJyBpcyByZXF1aXJlZC4gV2UgZG9uJ3Qga25vdyBpdHMgYWN0dWFsCi0gICAgIyBvZmZzZXQgYW5kIGxlbmd0aCAoYXMgd2VsbCBhcyB0aGUgdmFsdWVzIGZvciBvdGhlciBlbnRyaWVzKS4gU28gd2UKLSAgICAjIHJlc2VydmUgMTAtYnl0ZSBhcyBhIHBsYWNlaG9sZGVyLCB3aGljaCBpcyB0byBjb3ZlciB0aGUgc3BhY2UgZm9yIG1ldGFkYXRhCi0gICAgIyBlbnRyeSAoJ3h4Onh4eCcsIHNpbmNlIGl0J3MgWklQX1NUT1JFRCB3aGljaCBzaG91bGQgYXBwZWFyIGF0IHRoZQotICAgICMgYmVnaW5uaW5nIG9mIHRoZSB6aXApLCBhcyB3ZWxsIGFzIHRoZSBwb3NzaWJsZSB2YWx1ZSBjaGFuZ2VzIGluIG90aGVyCi0gICAgIyBlbnRyaWVzLgotICAgIGlmIHJlc2VydmVfc3BhY2U6Ci0gICAgICBvZmZzZXRzLmFwcGVuZCgnbWV0YWRhdGE6JyArICcgJyAqIDEwKQotICAgIGVsc2U6Ci0gICAgICBvZmZzZXRzLmFwcGVuZChDb21wdXRlRW50cnlPZmZzZXRTaXplKE1FVEFEQVRBX05BTUUpKQotCi0gICAgdmFsdWUgPSAnLCcuam9pbihvZmZzZXRzKQotICAgIGlmIGV4cGVjdGVkX2xlbmd0aCBpcyBub3QgTm9uZToKLSAgICAgIGFzc2VydCBsZW4odmFsdWUpIDw9IGV4cGVjdGVkX2xlbmd0aCwgXAotICAgICAgICAgICdJbnN1ZmZpY2llbnQgcmVzZXJ2ZWQgc3BhY2U6IHJlc2VydmVkPSVkLCBhY3R1YWw9JWQnICUgKAotICAgICAgICAgICAgICBleHBlY3RlZF9sZW5ndGgsIGxlbih2YWx1ZSkpCi0gICAgICB2YWx1ZSArPSAnICcgKiAoZXhwZWN0ZWRfbGVuZ3RoIC0gbGVuKHZhbHVlKSkKLSAgICByZXR1cm4gdmFsdWUKLQotICAjIFRoZSBwbGFjZSB3aGVyZSB0aGUgb3V0cHV0IGZyb20gdGhlIHN1YnByb2Nlc3Mgc2hvdWxkIGdvLgotICBsb2dfZmlsZSA9IHN5cy5zdGRvdXQgaWYgT1BUSU9OUy52ZXJib3NlIGVsc2Ugc3VicHJvY2Vzcy5QSVBFCi0KLSAgIyBBL0IgdXBkYXRlciBleHBlY3RzIGEgc2lnbmluZyBrZXkgaW4gUlNBIGZvcm1hdC4gR2V0cyB0aGUga2V5IHJlYWR5IGZvcgotICAjIGxhdGVyIHVzZSBpbiBzdGVwIDMsIHVubGVzcyBhIHBheWxvYWRfc2lnbmVyIGhhcyBiZWVuIHNwZWNpZmllZC4KLSAgaWYgT1BUSU9OUy5wYXlsb2FkX3NpZ25lciBpcyBOb25lOgotICAgIGNtZCA9IFsib3BlbnNzbCIsICJwa2NzOCIsCi0gICAgICAgICAgICItaW4iLCBPUFRJT05TLnBhY2thZ2Vfa2V5ICsgT1BUSU9OUy5wcml2YXRlX2tleV9zdWZmaXgsCi0gICAgICAgICAgICItaW5mb3JtIiwgIkRFUiJdCi0gICAgcHcgPSBPUFRJT05TLmtleV9wYXNzd29yZHNbT1BUSU9OUy5wYWNrYWdlX2tleV0KLSAgICBjbWQuZXh0ZW5kKFsiLXBhc3NpbiIsICJwYXNzOiIgKyBwd10gaWYgcHcgZWxzZSBbIi1ub2NyeXB0Il0pCi0gICAgcnNhX2tleSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJrZXktIiwgc3VmZml4PSIua2V5IikKLSAgICBjbWQuZXh0ZW5kKFsiLW91dCIsIHJzYV9rZXldKQotICAgIHAxID0gY29tbW9uLlJ1bihjbWQsIHZlcmJvc2U9RmFsc2UsIHN0ZG91dD1sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICAgIHAxLmNvbW11bmljYXRlKCkKLSAgICBhc3NlcnQgcDEucmV0dXJuY29kZSA9PSAwLCAib3BlbnNzbCBwa2NzOCBmYWlsZWQiCi0KKyAgIiIiR2VuZXJhdGVzIGFuIEFuZHJvaWQgT1RBIHBhY2thZ2UgdGhhdCBoYXMgQS9CIHVwZGF0ZSBwYXlsb2FkLiIiIgogICAjIFN0YWdlIHRoZSBvdXRwdXQgemlwIHBhY2thZ2UgZm9yIHBhY2thZ2Ugc2lnbmluZy4KLSAgdGVtcF96aXBfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gIG91dHB1dF96aXAgPSB6aXBmaWxlLlppcEZpbGUodGVtcF96aXBfZmlsZSwgInciLAorICBzdGFnaW5nX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgIG91dHB1dF96aXAgPSB6aXBmaWxlLlppcEZpbGUoc3RhZ2luZ19maWxlLCAidyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQpCiAKLSAgIyBNZXRhZGF0YSB0byBjb21wbHkgd2l0aCBBbmRyb2lkIE9UQSBwYWNrYWdlIGZvcm1hdC4KLSAgb2VtX3Byb3BzID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJvZW1fZmluZ2VycHJpbnRfcHJvcGVydGllcyIsIE5vbmUpCi0gIG9lbV9kaWN0cyA9IE5vbmUKLSAgaWYgb2VtX3Byb3BzOgotICAgIG9lbV9kaWN0cyA9IF9Mb2FkT2VtRGljdHMoTm9uZSkKLQotICBtZXRhZGF0YSA9IHsKLSAgICAgICJwb3N0LWJ1aWxkIjogQ2FsY3VsYXRlRmluZ2VycHJpbnQob2VtX3Byb3BzLCBvZW1fZGljdHMgYW5kIG9lbV9kaWN0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5pbmZvX2RpY3QpLAotICAgICAgInBvc3QtYnVpbGQtaW5jcmVtZW50YWwiIDogR2V0QnVpbGRQcm9wKCJyby5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLmluZm9fZGljdCksCi0gICAgICAicHJlLWRldmljZSI6IEdldE9lbVByb3BlcnR5KCJyby5wcm9kdWN0LmRldmljZSIsIG9lbV9wcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX2RpY3RzIGFuZCBvZW1fZGljdHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuaW5mb19kaWN0KSwKLSAgICAgICJvdGEtcmVxdWlyZWQtY2FjaGUiOiAiMCIsCi0gICAgICAib3RhLXR5cGUiOiAiQUIiLAotICB9Ci0KICAgaWYgc291cmNlX2ZpbGUgaXMgbm90IE5vbmU6Ci0gICAgbWV0YWRhdGFbInByZS1idWlsZCJdID0gQ2FsY3VsYXRlRmluZ2VycHJpbnQob2VtX3Byb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9lbV9kaWN0cyBhbmQgb2VtX2RpY3RzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMuc291cmNlX2luZm9fZGljdCkKLSAgICBtZXRhZGF0YVsicHJlLWJ1aWxkLWluY3JlbWVudGFsIl0gPSBHZXRCdWlsZFByb3AoCi0gICAgICAgICJyby5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsIiwgT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KQotCi0gICAgSGFuZGxlRG93bmdyYWRlTWV0YWRhdGEobWV0YWRhdGEpCisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0LCBPUFRJT05TLm9lbV9kaWN0cykKKyAgICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QsIE9QVElPTlMub2VtX2RpY3RzKQogICBlbHNlOgotICAgIG1ldGFkYXRhWyJwb3N0LXRpbWVzdGFtcCJdID0gR2V0QnVpbGRQcm9wKAotICAgICAgICAicm8uYnVpbGQuZGF0ZS51dGMiLCBPUFRJT05TLmluZm9fZGljdCkKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhPUFRJT05TLmluZm9fZGljdCwgT1BUSU9OUy5vZW1fZGljdHMpCisgICAgc291cmNlX2luZm8gPSBOb25lCiAKLSAgIyAxLiBHZW5lcmF0ZSBwYXlsb2FkLgotICBwYXlsb2FkX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0icGF5bG9hZC0iLCBzdWZmaXg9Ii5iaW4iKQotICBjbWQgPSBbImJyaWxsb191cGRhdGVfcGF5bG9hZCIsICJnZW5lcmF0ZSIsCi0gICAgICAgICAiLS1wYXlsb2FkIiwgcGF5bG9hZF9maWxlLAotICAgICAgICAgIi0tdGFyZ2V0X2ltYWdlIiwgdGFyZ2V0X2ZpbGVdCi0gIGlmIHNvdXJjZV9maWxlIGlzIG5vdCBOb25lOgotICAgIGNtZC5leHRlbmQoWyItLXNvdXJjZV9pbWFnZSIsIHNvdXJjZV9maWxlXSkKKyAgIyBNZXRhZGF0YSB0byBjb21wbHkgd2l0aCBBbmRyb2lkIE9UQSBwYWNrYWdlIGZvcm1hdC4KKyAgbWV0YWRhdGEgPSBHZXRQYWNrYWdlTWV0YWRhdGEodGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKQorCisgIGlmIE9QVElPTlMuc2tpcF9wb3N0aW5zdGFsbDoKKyAgICB0YXJnZXRfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwV2l0aG91dFBvc3RpbnN0YWxsQ29uZmlnKHRhcmdldF9maWxlKQorCisgICMgR2VuZXJhdGUgcGF5bG9hZC4KKyAgcGF5bG9hZCA9IFBheWxvYWQoKQorCisgICMgRW5mb3JjZSBhIG1heCB0aW1lc3RhbXAgdGhpcyBwYXlsb2FkIGNhbiBiZSBhcHBsaWVkIG9uIHRvcCBvZi4KICAgaWYgT1BUSU9OUy5kb3duZ3JhZGU6Ci0gICAgbWF4X3RpbWVzdGFtcCA9IEdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiLCBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpCisgICAgbWF4X3RpbWVzdGFtcCA9IHNvdXJjZV9pbmZvLkdldEJ1aWxkUHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiKQogICBlbHNlOgogICAgIG1heF90aW1lc3RhbXAgPSBtZXRhZGF0YVsicG9zdC10aW1lc3RhbXAiXQotICBjbWQuZXh0ZW5kKFsiLS1tYXhfdGltZXN0YW1wIiwgbWF4X3RpbWVzdGFtcF0pCi0gIHAxID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICBwMS5jb21tdW5pY2F0ZSgpCi0gIGFzc2VydCBwMS5yZXR1cm5jb2RlID09IDAsICJicmlsbG9fdXBkYXRlX3BheWxvYWQgZ2VuZXJhdGUgZmFpbGVkIgorICBhZGRpdGlvbmFsX2FyZ3MgPSBbIi0tbWF4X3RpbWVzdGFtcCIsIG1heF90aW1lc3RhbXBdCiAKLSAgIyAyLiBHZW5lcmF0ZSBoYXNoZXMgb2YgdGhlIHBheWxvYWQgYW5kIG1ldGFkYXRhIGZpbGVzLgotICBwYXlsb2FkX3NpZ19maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InNpZy0iLCBzdWZmaXg9Ii5iaW4iKQotICBtZXRhZGF0YV9zaWdfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSJzaWctIiwgc3VmZml4PSIuYmluIikKLSAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAiaGFzaCIsCi0gICAgICAgICAiLS11bnNpZ25lZF9wYXlsb2FkIiwgcGF5bG9hZF9maWxlLAotICAgICAgICAgIi0tc2lnbmF0dXJlX3NpemUiLCAiMjU2IiwKLSAgICAgICAgICItLW1ldGFkYXRhX2hhc2hfZmlsZSIsIG1ldGFkYXRhX3NpZ19maWxlLAotICAgICAgICAgIi0tcGF5bG9hZF9oYXNoX2ZpbGUiLCBwYXlsb2FkX3NpZ19maWxlXQotICBwMSA9IGNvbW1vbi5SdW4oY21kLCBzdGRvdXQ9bG9nX2ZpbGUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKLSAgcDEuY29tbXVuaWNhdGUoKQotICBhc3NlcnQgcDEucmV0dXJuY29kZSA9PSAwLCAiYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIGhhc2ggZmFpbGVkIgorICBwYXlsb2FkLkdlbmVyYXRlKHRhcmdldF9maWxlLCBzb3VyY2VfZmlsZSwgYWRkaXRpb25hbF9hcmdzKQogCi0gICMgMy4gU2lnbiB0aGUgaGFzaGVzIGFuZCBpbnNlcnQgdGhlbSBiYWNrIGludG8gdGhlIHBheWxvYWQgZmlsZS4KLSAgc2lnbmVkX3BheWxvYWRfc2lnX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnbmVkLXNpZy0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4PSIuYmluIikKLSAgc2lnbmVkX21ldGFkYXRhX3NpZ19maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9InNpZ25lZC1zaWctIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXg9Ii5iaW4iKQotICAjIDNhLiBTaWduIHRoZSBwYXlsb2FkIGhhc2guCi0gIGlmIE9QVElPTlMucGF5bG9hZF9zaWduZXIgaXMgbm90IE5vbmU6Ci0gICAgY21kID0gW09QVElPTlMucGF5bG9hZF9zaWduZXJdCi0gICAgY21kLmV4dGVuZChPUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MpCi0gIGVsc2U6Ci0gICAgY21kID0gWyJvcGVuc3NsIiwgInBrZXl1dGwiLCAiLXNpZ24iLAotICAgICAgICAgICAiLWlua2V5IiwgcnNhX2tleSwKLSAgICAgICAgICAgIi1wa2V5b3B0IiwgImRpZ2VzdDpzaGEyNTYiXQotICBjbWQuZXh0ZW5kKFsiLWluIiwgcGF5bG9hZF9zaWdfZmlsZSwKLSAgICAgICAgICAgICAgIi1vdXQiLCBzaWduZWRfcGF5bG9hZF9zaWdfZmlsZV0pCi0gIHAxID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICBwMS5jb21tdW5pY2F0ZSgpCi0gIGFzc2VydCBwMS5yZXR1cm5jb2RlID09IDAsICJvcGVuc3NsIHNpZ24gcGF5bG9hZCBmYWlsZWQiCisgICMgU2lnbiB0aGUgcGF5bG9hZC4KKyAgcGF5bG9hZF9zaWduZXIgPSBQYXlsb2FkU2lnbmVyKCkKKyAgcGF5bG9hZC5TaWduKHBheWxvYWRfc2lnbmVyKQogCi0gICMgM2IuIFNpZ24gdGhlIG1ldGFkYXRhIGhhc2guCi0gIGlmIE9QVElPTlMucGF5bG9hZF9zaWduZXIgaXMgbm90IE5vbmU6Ci0gICAgY21kID0gW09QVElPTlMucGF5bG9hZF9zaWduZXJdCi0gICAgY21kLmV4dGVuZChPUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MpCi0gIGVsc2U6Ci0gICAgY21kID0gWyJvcGVuc3NsIiwgInBrZXl1dGwiLCAiLXNpZ24iLAotICAgICAgICAgICAiLWlua2V5IiwgcnNhX2tleSwKLSAgICAgICAgICAgIi1wa2V5b3B0IiwgImRpZ2VzdDpzaGEyNTYiXQotICBjbWQuZXh0ZW5kKFsiLWluIiwgbWV0YWRhdGFfc2lnX2ZpbGUsCi0gICAgICAgICAgICAgICItb3V0Iiwgc2lnbmVkX21ldGFkYXRhX3NpZ19maWxlXSkKLSAgcDEgPSBjb21tb24uUnVuKGNtZCwgc3Rkb3V0PWxvZ19maWxlLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCi0gIHAxLmNvbW11bmljYXRlKCkKLSAgYXNzZXJ0IHAxLnJldHVybmNvZGUgPT0gMCwgIm9wZW5zc2wgc2lnbiBtZXRhZGF0YSBmYWlsZWQiCisgICMgV3JpdGUgdGhlIHBheWxvYWQgaW50byBvdXRwdXQgemlwLgorICBwYXlsb2FkLldyaXRlVG9aaXAob3V0cHV0X3ppcCkKIAotICAjIDNjLiBJbnNlcnQgdGhlIHNpZ25hdHVyZXMgYmFjayBpbnRvIHRoZSBwYXlsb2FkIGZpbGUuCi0gIHNpZ25lZF9wYXlsb2FkX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ic2lnbmVkLXBheWxvYWQtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4PSIuYmluIikKLSAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAic2lnbiIsCi0gICAgICAgICAiLS11bnNpZ25lZF9wYXlsb2FkIiwgcGF5bG9hZF9maWxlLAotICAgICAgICAgIi0tcGF5bG9hZCIsIHNpZ25lZF9wYXlsb2FkX2ZpbGUsCi0gICAgICAgICAiLS1zaWduYXR1cmVfc2l6ZSIsICIyNTYiLAotICAgICAgICAgIi0tbWV0YWRhdGFfc2lnbmF0dXJlX2ZpbGUiLCBzaWduZWRfbWV0YWRhdGFfc2lnX2ZpbGUsCi0gICAgICAgICAiLS1wYXlsb2FkX3NpZ25hdHVyZV9maWxlIiwgc2lnbmVkX3BheWxvYWRfc2lnX2ZpbGVdCi0gIHAxID0gY29tbW9uLlJ1bihjbWQsIHN0ZG91dD1sb2dfZmlsZSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQotICBwMS5jb21tdW5pY2F0ZSgpCi0gIGFzc2VydCBwMS5yZXR1cm5jb2RlID09IDAsICJicmlsbG9fdXBkYXRlX3BheWxvYWQgc2lnbiBmYWlsZWQiCi0KLSAgIyA0LiBEdW1wIHRoZSBzaWduZWQgcGF5bG9hZCBwcm9wZXJ0aWVzLgotICBwcm9wZXJ0aWVzX2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0icGF5bG9hZC1wcm9wZXJ0aWVzLSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4PSIudHh0IikKLSAgY21kID0gWyJicmlsbG9fdXBkYXRlX3BheWxvYWQiLCAicHJvcGVydGllcyIsCi0gICAgICAgICAiLS1wYXlsb2FkIiwgc2lnbmVkX3BheWxvYWRfZmlsZSwKLSAgICAgICAgICItLXByb3BlcnRpZXNfZmlsZSIsIHByb3BlcnRpZXNfZmlsZV0KLSAgcDEgPSBjb21tb24uUnVuKGNtZCwgc3Rkb3V0PWxvZ19maWxlLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCi0gIHAxLmNvbW11bmljYXRlKCkKLSAgYXNzZXJ0IHAxLnJldHVybmNvZGUgPT0gMCwgImJyaWxsb191cGRhdGVfcGF5bG9hZCBwcm9wZXJ0aWVzIGZhaWxlZCIKLQotICBpZiBPUFRJT05TLndpcGVfdXNlcl9kYXRhOgotICAgIHdpdGggb3Blbihwcm9wZXJ0aWVzX2ZpbGUsICJhIikgYXMgZjoKLSAgICAgIGYud3JpdGUoIlBPV0VSV0FTSD0xXG4iKQotICAgIG1ldGFkYXRhWyJvdGEtd2lwZSJdID0gInllcyIKLQotICAjIEFkZCB0aGUgc2lnbmVkIHBheWxvYWQgZmlsZSBhbmQgcHJvcGVydGllcyBpbnRvIHRoZSB6aXAuIEluIG9yZGVyIHRvCi0gICMgc3VwcG9ydCBzdHJlYW1pbmcsIHdlIHBhY2sgcGF5bG9hZC5iaW4sIHBheWxvYWRfcHJvcGVydGllcy50eHQgYW5kCi0gICMgY2FyZV9tYXAudHh0IGFzIFpJUF9TVE9SRUQuIFNvIHRoZXNlIGVudHJpZXMgY2FuIGJlIHJlYWQgZGlyZWN0bHkgd2l0aAotICAjIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBwYWlycy4KLSAgY29tbW9uLlppcFdyaXRlKG91dHB1dF96aXAsIHNpZ25lZF9wYXlsb2FkX2ZpbGUsIGFyY25hbWU9InBheWxvYWQuYmluIiwKLSAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3R5cGU9emlwZmlsZS5aSVBfU1RPUkVEKQotICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3ppcCwgcHJvcGVydGllc19maWxlLAotICAgICAgICAgICAgICAgICAgYXJjbmFtZT0icGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCIsCi0gICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKKyAgIyBHZW5lcmF0ZSBhbmQgaW5jbHVkZSB0aGUgc2Vjb25kYXJ5IHBheWxvYWQgdGhhdCBpbnN0YWxscyBzZWNvbmRhcnkgaW1hZ2VzCisgICMgKGUuZy4gc3lzdGVtX290aGVyLmltZykuCisgIGlmIE9QVElPTlMuaW5jbHVkZV9zZWNvbmRhcnk6CisgICAgIyBXZSBhbHdheXMgaW5jbHVkZSBhIGZ1bGwgcGF5bG9hZCBmb3IgdGhlIHNlY29uZGFyeSBzbG90LCBldmVuIHdoZW4KKyAgICAjIGJ1aWxkaW5nIGFuIGluY3JlbWVudGFsIE9UQS4gU2VlIHRoZSBjb21tZW50cyBmb3IgIi0taW5jbHVkZV9zZWNvbmRhcnkiLgorICAgIHNlY29uZGFyeV90YXJnZXRfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwRm9yU2Vjb25kYXJ5SW1hZ2VzKAorICAgICAgICB0YXJnZXRfZmlsZSwgT1BUSU9OUy5za2lwX3Bvc3RpbnN0YWxsKQorICAgIHNlY29uZGFyeV9wYXlsb2FkID0gUGF5bG9hZChzZWNvbmRhcnk9VHJ1ZSkKKyAgICBzZWNvbmRhcnlfcGF5bG9hZC5HZW5lcmF0ZShzZWNvbmRhcnlfdGFyZ2V0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9hcmdzPWFkZGl0aW9uYWxfYXJncykKKyAgICBzZWNvbmRhcnlfcGF5bG9hZC5TaWduKHBheWxvYWRfc2lnbmVyKQorICAgIHNlY29uZGFyeV9wYXlsb2FkLldyaXRlVG9aaXAob3V0cHV0X3ppcCkKIAogICAjIElmIGRtLXZlcml0eSBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBkZXZpY2UsIGNvcHkgY29udGVudHMgb2YgY2FyZV9tYXAKICAgIyBpbnRvIEEvQiBPVEEgcGFja2FnZS4KICAgdGFyZ2V0X3ppcCA9IHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZSwgInIiKQotICBpZiAoT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJ2ZXJpdHkiKSA9PSAidHJ1ZSIgb3IKLSAgICAgIE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX2VuYWJsZSIpID09ICJ0cnVlIik6CisgIGlmICh0YXJnZXRfaW5mby5nZXQoInZlcml0eSIpID09ICJ0cnVlIiBvcgorICAgICAgdGFyZ2V0X2luZm8uZ2V0KCJhdmJfZW5hYmxlIikgPT0gInRydWUiKToKICAgICBjYXJlX21hcF9wYXRoID0gIk1FVEEvY2FyZV9tYXAudHh0IgogICAgIG5hbWVsaXN0ID0gdGFyZ2V0X3ppcC5uYW1lbGlzdCgpCiAgICAgaWYgY2FyZV9tYXBfcGF0aCBpbiBuYW1lbGlzdDoKICAgICAgIGNhcmVfbWFwX2RhdGEgPSB0YXJnZXRfemlwLnJlYWQoY2FyZV9tYXBfcGF0aCkKKyAgICAgICMgSW4gb3JkZXIgdG8gc3VwcG9ydCBzdHJlYW1pbmcsIGNhcmVfbWFwLnR4dCBuZWVkcyB0byBiZSBwYWNrZWQgYXMKKyAgICAgICMgWklQX1NUT1JFRC4KICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCAiY2FyZV9tYXAudHh0IiwgY2FyZV9tYXBfZGF0YSwKLSAgICAgICAgICBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKICAgICBlbHNlOgogICAgICAgcHJpbnQoIldhcm5pbmc6IGNhbm5vdCBmaW5kIGNhcmUgbWFwIGZpbGUgaW4gdGFyZ2V0X2ZpbGUgcGFja2FnZSIpCiAKLSAgaWYgSGFzVmVuZG9yUGFydGl0aW9uKHRhcmdldF96aXApOgotICAgIHVwZGF0ZV92ZW5kb3IgPSBUcnVlCi0gICAgdXBkYXRlX3N5c3RlbSA9IFRydWUKKyAgQWRkQ29tcGF0aWJpbGl0eUFyY2hpdmVJZlRyZWJsZUVuYWJsZWQoCisgICAgICB0YXJnZXRfemlwLCBvdXRwdXRfemlwLCB0YXJnZXRfaW5mbywgc291cmNlX2luZm8pCiAKLSAgICAjIElmIGluY3JlbWVudGFsIHRoZW4gZmlndXJlIG91dCB3aGF0IGlzIGJlaW5nIHVwZGF0ZWQgc28gbWV0YWRhdGEgb25seSBmb3IKLSAgICAjIHRoZSB1cGRhdGVkIGltYWdlIGlzIGluY2x1ZGVkLgotICAgIGlmIHNvdXJjZV9maWxlIGlzIG5vdCBOb25lOgotICAgICAgaW5wdXRfdG1wLCBpbnB1dF96aXAgPSBjb21tb24uVW56aXBUZW1wKAotICAgICAgICAgIHRhcmdldF9maWxlLCBVTlpJUF9QQVRURVJOKQotICAgICAgc291cmNlX3RtcCwgc291cmNlX3ppcCA9IGNvbW1vbi5VbnppcFRlbXAoCi0gICAgICAgICAgc291cmNlX2ZpbGUsIFVOWklQX1BBVFRFUk4pCi0KLSAgICAgIHZlbmRvcl9zcmMgPSBHZXRJbWFnZSgidmVuZG9yIiwgc291cmNlX3RtcCkKLSAgICAgIHZlbmRvcl90Z3QgPSBHZXRJbWFnZSgidmVuZG9yIiwgaW5wdXRfdG1wKQotICAgICAgc3lzdGVtX3NyYyA9IEdldEltYWdlKCJzeXN0ZW0iLCBzb3VyY2VfdG1wKQotICAgICAgc3lzdGVtX3RndCA9IEdldEltYWdlKCJzeXN0ZW0iLCBpbnB1dF90bXApCi0KLSAgICAgIHVwZGF0ZV9zeXN0ZW0gPSBzeXN0ZW1fc3JjLlRvdGFsU2hhMSgpICE9IHN5c3RlbV90Z3QuVG90YWxTaGExKCkKLSAgICAgIHVwZGF0ZV92ZW5kb3IgPSB2ZW5kb3Jfc3JjLlRvdGFsU2hhMSgpICE9IHZlbmRvcl90Z3QuVG90YWxTaGExKCkKLQotICAgICAgaW5wdXRfemlwLmNsb3NlKCkKLSAgICAgIHNvdXJjZV96aXAuY2xvc2UoKQotCi0gICAgdGFyZ2V0X3ppcCA9IHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZSwgInIiKQotICAgIEFkZENvbXBhdGliaWxpdHlBcmNoaXZlKHRhcmdldF96aXAsIG91dHB1dF96aXAsIHVwZGF0ZV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3ZlbmRvcikKICAgY29tbW9uLlppcENsb3NlKHRhcmdldF96aXApCiAKLSAgIyBXcml0ZSB0aGUgY3VycmVudCBtZXRhZGF0YSBlbnRyeSB3aXRoIHBsYWNlaG9sZGVycy4KLSAgbWV0YWRhdGFbJ290YS1zdHJlYW1pbmctcHJvcGVydHktZmlsZXMnXSA9IENvbXB1dGVTdHJlYW1pbmdNZXRhZGF0YSgKLSAgICAgIG91dHB1dF96aXAsIHJlc2VydmVfc3BhY2U9VHJ1ZSkKLSAgV3JpdGVNZXRhZGF0YShtZXRhZGF0YSwgb3V0cHV0X3ppcCkKKyAgIyBXZSBoYXZlbid0IHdyaXR0ZW4gdGhlIG1ldGFkYXRhIGVudHJ5IHlldCwgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIGluCisgICMgRmluYWxpemVNZXRhZGF0YSgpLgogICBjb21tb24uWmlwQ2xvc2Uob3V0cHV0X3ppcCkKIAotICAjIFNpZ25PdXRwdXQoKSwgd2hpY2ggaW4gdHVybiBjYWxscyBzaWduYXBrLmphciwgd2lsbCBwb3NzaWJseSByZW9yZGVyIHRoZQotICAjIHppcCBlbnRyaWVzLCBhcyB3ZWxsIGFzIHBhZGRpbmcgdGhlIGVudHJ5IGhlYWRlcnMuIFdlIGRvIGEgcHJlbGltaW5hcnkKLSAgIyBzaWduaW5nICh3aXRoIGFuIGluY29tcGxldGUgbWV0YWRhdGEgZW50cnkpIHRvIGFsbG93IHRoYXQgdG8gaGFwcGVuLiBUaGVuCi0gICMgY29tcHV0ZSB0aGUgemlwIGVudHJ5IG9mZnNldHMsIHdyaXRlIGJhY2sgdGhlIGZpbmFsIG1ldGFkYXRhIGFuZCBkbyB0aGUKLSAgIyBmaW5hbCBzaWduaW5nLgotICBwcmVsaW1fc2lnbmluZyA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gIFNpZ25PdXRwdXQodGVtcF96aXBfZmlsZS5uYW1lLCBwcmVsaW1fc2lnbmluZy5uYW1lKQotICBjb21tb24uWmlwQ2xvc2UodGVtcF96aXBfZmlsZSkKLQotICAjIE9wZW4gdGhlIHNpZ25lZCB6aXAuIENvbXB1dGUgdGhlIGZpbmFsIG1ldGFkYXRhIHRoYXQncyBuZWVkZWQgZm9yIHN0cmVhbWluZy4KLSAgcHJlbGltX3ppcCA9IHppcGZpbGUuWmlwRmlsZShwcmVsaW1fc2lnbmluZywgInIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQotICBleHBlY3RlZF9sZW5ndGggPSBsZW4obWV0YWRhdGFbJ290YS1zdHJlYW1pbmctcHJvcGVydHktZmlsZXMnXSkKLSAgbWV0YWRhdGFbJ290YS1zdHJlYW1pbmctcHJvcGVydHktZmlsZXMnXSA9IENvbXB1dGVTdHJlYW1pbmdNZXRhZGF0YSgKLSAgICAgIHByZWxpbV96aXAsIHJlc2VydmVfc3BhY2U9RmFsc2UsIGV4cGVjdGVkX2xlbmd0aD1leHBlY3RlZF9sZW5ndGgpCi0KLSAgIyBDb3B5IHRoZSB6aXAgZW50cmllcywgYXMgd2UgY2Fubm90IHVwZGF0ZSAvIGRlbGV0ZSBlbnRyaWVzIHdpdGggemlwZmlsZS4KLSAgZmluYWxfc2lnbmluZyA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gIG91dHB1dF96aXAgPSB6aXBmaWxlLlppcEZpbGUoZmluYWxfc2lnbmluZywgInciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQotICBmb3IgaXRlbSBpbiBwcmVsaW1femlwLmluZm9saXN0KCk6Ci0gICAgaWYgaXRlbS5maWxlbmFtZSA9PSBNRVRBREFUQV9OQU1FOgotICAgICAgY29udGludWUKLQotICAgIGRhdGEgPSBwcmVsaW1femlwLnJlYWQoaXRlbS5maWxlbmFtZSkKLSAgICBvdXRfaW5mbyA9IGNvcHkuY29weShpdGVtKQotICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCBvdXRfaW5mbywgZGF0YSkKLQotICAjIE5vdyB3cml0ZSB0aGUgZmluYWwgbWV0YWRhdGEgZW50cnkuCi0gIFdyaXRlTWV0YWRhdGEobWV0YWRhdGEsIG91dHB1dF96aXApCi0gIGNvbW1vbi5aaXBDbG9zZShwcmVsaW1femlwKQotICBjb21tb24uWmlwQ2xvc2Uob3V0cHV0X3ppcCkKLQotICAjIFJlLXNpZ24gdGhlIHBhY2thZ2UgYWZ0ZXIgdXBkYXRpbmcgdGhlIG1ldGFkYXRhIGVudHJ5LgotICBTaWduT3V0cHV0KGZpbmFsX3NpZ25pbmcubmFtZSwgb3V0cHV0X2ZpbGUpCi0gIGZpbmFsX3NpZ25pbmcuY2xvc2UoKQotCi0gICMgUmVvcGVuIHRoZSBmaW5hbCBzaWduZWQgemlwIHRvIGRvdWJsZSBjaGVjayB0aGUgc3RyZWFtaW5nIG1ldGFkYXRhLgotICBvdXRwdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAiciIpCi0gIGFjdHVhbCA9IG1ldGFkYXRhWydvdGEtc3RyZWFtaW5nLXByb3BlcnR5LWZpbGVzJ10uc3RyaXAoKQotICBleHBlY3RlZCA9IENvbXB1dGVTdHJlYW1pbmdNZXRhZGF0YShvdXRwdXRfemlwKQotICBhc3NlcnQgYWN0dWFsID09IGV4cGVjdGVkLCBcCi0gICAgICAiTWlzbWF0Y2hpbmcgc3RyZWFtaW5nIG1ldGFkYXRhOiAlcyB2cyAlcy4iICUgKGFjdHVhbCwgZXhwZWN0ZWQpCi0gIGNvbW1vbi5aaXBDbG9zZShvdXRwdXRfemlwKQorICBGaW5hbGl6ZU1ldGFkYXRhKG1ldGFkYXRhLCBzdGFnaW5nX2ZpbGUsIG91dHB1dF9maWxlKQogCiAKIGRlZiBtYWluKGFyZ3YpOgogCiAgIGRlZiBvcHRpb25faGFuZGxlcihvLCBhKToKLSAgICBpZiBvID09ICItLWJvYXJkX2NvbmZpZyI6Ci0gICAgICBwYXNzICAgIyBkZXByZWNhdGVkCi0gICAgZWxpZiBvIGluICgiLWsiLCAiLS1wYWNrYWdlX2tleSIpOgorICAgIGlmIG8gaW4gKCItayIsICItLXBhY2thZ2Vfa2V5Iik6CiAgICAgICBPUFRJT05TLnBhY2thZ2Vfa2V5ID0gYQogICAgIGVsaWYgbyBpbiAoIi1pIiwgIi0taW5jcmVtZW50YWxfZnJvbSIpOgogICAgICAgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSBhCkBAIC0xMjc2LDcgKzE1NzgsNyBAQAogICAgICAgT1BUSU9OUy5mdWxsX3JhZGlvID0gVHJ1ZQogICAgIGVsaWYgbyA9PSAiLS1mdWxsX2Jvb3Rsb2FkZXIiOgogICAgICAgT1BUSU9OUy5mdWxsX2Jvb3Rsb2FkZXIgPSBUcnVlCi0gICAgZWxpZiBvIGluICgiLXciLCAiLS13aXBlX3VzZXJfZGF0YSIpOgorICAgIGVsaWYgbyA9PSAiLS13aXBlX3VzZXJfZGF0YSI6CiAgICAgICBPUFRJT05TLndpcGVfdXNlcl9kYXRhID0gVHJ1ZQogICAgIGVsaWYgbyA9PSAiLS1kb3duZ3JhZGUiOgogICAgICAgT1BUSU9OUy5kb3duZ3JhZGUgPSBUcnVlCkBAIC0xMjk3LDYgKzE1OTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VycyBhcmUgYWxsb3dlZC4iICUgKGEsIG8pKQogICAgIGVsaWYgbyBpbiAoIi0yIiwgIi0tdHdvX3N0ZXAiKToKICAgICAgIE9QVElPTlMudHdvX3N0ZXAgPSBUcnVlCisgICAgZWxpZiBvID09ICItLWluY2x1ZGVfc2Vjb25kYXJ5IjoKKyAgICAgIE9QVElPTlMuaW5jbHVkZV9zZWNvbmRhcnkgPSBUcnVlCiAgICAgZWxpZiBvID09ICItLW5vX3NpZ25pbmciOgogICAgICAgT1BUSU9OUy5ub19zaWduaW5nID0gVHJ1ZQogICAgIGVsaWYgbyA9PSAiLS12ZXJpZnkiOgpAQCAtMTMwNSwxNiArMTYwOSwxMiBAQAogICAgICAgT1BUSU9OUy5ibG9ja19iYXNlZCA9IFRydWUKICAgICBlbGlmIG8gaW4gKCItYiIsICItLWJpbmFyeSIpOgogICAgICAgT1BUSU9OUy51cGRhdGVyX2JpbmFyeSA9IGEKLSAgICBlbGlmIG8gaW4gKCItLW5vX2ZhbGxiYWNrX3RvX2Z1bGwiLCk6Ci0gICAgICBPUFRJT05TLmZhbGxiYWNrX3RvX2Z1bGwgPSBGYWxzZQogICAgIGVsaWYgbyA9PSAiLS1zdGFzaF90aHJlc2hvbGQiOgogICAgICAgdHJ5OgogICAgICAgICBPUFRJT05TLnN0YXNoX3RocmVzaG9sZCA9IGZsb2F0KGEpCiAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IHBhcnNlIHZhbHVlICVyIGZvciBvcHRpb24gJXIgLSBleHBlY3RpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJhIGZsb2F0IiAlIChhLCBvKSkKLSAgICBlbGlmIG8gPT0gIi0tZ2VuX3ZlcmlmeSI6Ci0gICAgICBPUFRJT05TLmdlbl92ZXJpZnkgPSBUcnVlCiAgICAgZWxpZiBvID09ICItLWxvZ19kaWZmIjoKICAgICAgIE9QVElPTlMubG9nX2RpZmYgPSBhCiAgICAgZWxpZiBvID09ICItLXBheWxvYWRfc2lnbmVyIjoKQEAgLTEzMjMsMTQgKzE2MjMsMTUgQEAKICAgICAgIE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IHNobGV4LnNwbGl0KGEpCiAgICAgZWxpZiBvID09ICItLWV4dHJhY3RlZF9pbnB1dF90YXJnZXRfZmlsZXMiOgogICAgICAgT1BUSU9OUy5leHRyYWN0ZWRfaW5wdXQgPSBhCisgICAgZWxpZiBvID09ICItLXNraXBfcG9zdGluc3RhbGwiOgorICAgICAgT1BUSU9OUy5za2lwX3Bvc3RpbnN0YWxsID0gVHJ1ZQogICAgIGVsc2U6CiAgICAgICByZXR1cm4gRmFsc2UKICAgICByZXR1cm4gVHJ1ZQogCiAgIGFyZ3MgPSBjb21tb24uUGFyc2VPcHRpb25zKGFyZ3YsIF9fZG9jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX29wdHM9ImI6azppOmQ6d2U6dDoybzoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9vcHRzPSJiOms6aTpkOmU6dDoybzoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9sb25nX29wdHM9WwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvYXJkX2NvbmZpZz0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2Vfa2V5PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jcmVtZW50YWxfZnJvbT0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bGxfcmFkaW8iLApAQCAtMTM0MSwxOSArMTY0MiwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhX3NjcmlwdD0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndvcmtlcl90aHJlYWRzPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHdvX3N0ZXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVfc2Vjb25kYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub19zaWduaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibG9jayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmluYXJ5PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2VtX3NldHRpbmdzPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2VtX25vX21vdW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vX2ZhbGxiYWNrX3RvX2Z1bGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXNoX3RocmVzaG9sZD0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbl92ZXJpZnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ19kaWZmPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF5bG9hZF9zaWduZXI9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXlsb2FkX3NpZ25lcl9hcmdzPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFjdGVkX2lucHV0X3RhcmdldF9maWxlcz0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNraXBfcG9zdGluc3RhbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBleHRyYV9vcHRpb25faGFuZGxlcj1vcHRpb25faGFuZGxlcikKIAogICBpZiBsZW4oYXJncykgIT0gMjoKQEAgLTEzNzQsMTQgKzE2NzUsMzUgQEAKICAgYXNzZXJ0IG5vdCAoT1BUSU9OUy5kb3duZ3JhZGUgYW5kIE9QVElPTlMudGltZXN0YW1wKSwgXAogICAgICAgIkNhbm5vdCBoYXZlIC0tZG93bmdyYWRlIEFORCAtLW92ZXJyaWRlX3RpbWVzdGFtcCBib3RoIgogCi0gICMgTG9hZCB0aGUgZGljdCBmaWxlIGZyb20gdGhlIHppcCBkaXJlY3RseSB0byBoYXZlIGEgcGVlayBhdCB0aGUgT1RBIHR5cGUuCi0gICMgRm9yIHBhY2thZ2VzIHVzaW5nIEEvQiB1cGRhdGUsIHVuemlwcGluZyBpcyBub3QgbmVlZGVkLgorICAjIExvYWQgdGhlIGJ1aWxkIGluZm8gZGljdHMgZnJvbSB0aGUgemlwIGRpcmVjdGx5IG9yIHRoZSBleHRyYWN0ZWQgaW5wdXQKKyAgIyBkaXJlY3RvcnkuIFdlIGRvbid0IG5lZWQgdG8gdW56aXAgdGhlIGVudGlyZSB0YXJnZXQtZmlsZXMgemlwcywgYmVjYXVzZSB0aGV5CisgICMgd29uJ3QgYmUgbmVlZGVkIGZvciBBL0IgT1RBcyAoYnJpbGxvX3VwZGF0ZV9wYXlsb2FkIGRvZXMgdGhhdCBvbiBpdHMgb3duKS4KKyAgIyBXaGVuIGxvYWRpbmcgdGhlIGluZm8gZGljdHMsIHdlIGRvbid0IG5lZWQgdG8gcHJvdmlkZSB0aGUgc2Vjb25kIHBhcmFtZXRlcgorICAjIHRvIGNvbW1vbi5Mb2FkSW5mb0RpY3QoKS4gU3BlY2lmeWluZyB0aGUgc2Vjb25kIHBhcmFtZXRlciBhbGxvd3MgcmVwbGFjaW5nCisgICMgc29tZSBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgYWN0dWFsIHBhdGhzLCBzdWNoIGFzICdzZWxpbnV4X2ZjJywKKyAgIyAncmFtZGlza19kaXInLCB3aGljaCB3b24ndCBiZSB1c2VkIGR1cmluZyBPVEEgZ2VuZXJhdGlvbi4KICAgaWYgT1BUSU9OUy5leHRyYWN0ZWRfaW5wdXQgaXMgbm90IE5vbmU6Ci0gICAgT1BUSU9OUy5pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KE9QVElPTlMuZXh0cmFjdGVkX2lucHV0LCBPUFRJT05TLmV4dHJhY3RlZF9pbnB1dCkKKyAgICBPUFRJT05TLmluZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QoT1BUSU9OUy5leHRyYWN0ZWRfaW5wdXQpCiAgIGVsc2U6Ci0gICAgaW5wdXRfemlwID0gemlwZmlsZS5aaXBGaWxlKGFyZ3NbMF0sICJyIikKLSAgICBPUFRJT05TLmluZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QoaW5wdXRfemlwKQotICAgIGNvbW1vbi5aaXBDbG9zZShpbnB1dF96aXApCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoYXJnc1swXSwgJ3InKSBhcyBpbnB1dF96aXA6CisgICAgICBPUFRJT05TLmluZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QoaW5wdXRfemlwKQorCisgIGlmIE9QVElPTlMudmVyYm9zZToKKyAgICBwcmludCgiLS0tIHRhcmdldCBpbmZvIC0tLSIpCisgICAgY29tbW9uLkR1bXBJbmZvRGljdChPUFRJT05TLmluZm9fZGljdCkKKworICAjIExvYWQgdGhlIHNvdXJjZSBidWlsZCBkaWN0IGlmIGFwcGxpY2FibGUuCisgIGlmIE9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlIGlzIG5vdCBOb25lOgorICAgIE9QVElPTlMudGFyZ2V0X2luZm9fZGljdCA9IE9QVElPTlMuaW5mb19kaWN0CisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UsICdyJykgYXMgc291cmNlX3ppcDoKKyAgICAgIE9QVElPTlMuc291cmNlX2luZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3Qoc291cmNlX3ppcCkKKworICAgIGlmIE9QVElPTlMudmVyYm9zZToKKyAgICAgIHByaW50KCItLS0gc291cmNlIGluZm8gLS0tIikKKyAgICAgIGNvbW1vbi5EdW1wSW5mb0RpY3QoT1BUSU9OUy5zb3VyY2VfaW5mb19kaWN0KQorCisgICMgTG9hZCBPRU0gZGljdHMgaWYgcHJvdmlkZWQuCisgIE9QVElPTlMub2VtX2RpY3RzID0gX0xvYWRPZW1EaWN0cyhPUFRJT05TLm9lbV9zb3VyY2UpCiAKICAgYWJfdXBkYXRlID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhYl91cGRhdGUiKSA9PSAidHJ1ZSIKIApAQCAtMTM5NywyMCArMTcxOSw2IEBACiAgICAgT1BUSU9OUy5rZXlfcGFzc3dvcmRzID0gY29tbW9uLkdldEtleVBhc3N3b3JkcyhbT1BUSU9OUy5wYWNrYWdlX2tleV0pCiAKICAgaWYgYWJfdXBkYXRlOgotICAgIGlmIE9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlIGlzIG5vdCBOb25lOgotICAgICAgT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0ID0gT1BUSU9OUy5pbmZvX2RpY3QKLSAgICAgIHNvdXJjZV96aXAgPSB6aXBmaWxlLlppcEZpbGUoT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UsICJyIikKLSAgICAgIE9QVElPTlMuc291cmNlX2luZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3Qoc291cmNlX3ppcCkKLSAgICAgIGNvbW1vbi5aaXBDbG9zZShzb3VyY2VfemlwKQotCi0gICAgaWYgT1BUSU9OUy52ZXJib3NlOgotICAgICAgcHJpbnQoIi0tLSB0YXJnZXQgaW5mbyAtLS0iKQotICAgICAgY29tbW9uLkR1bXBJbmZvRGljdChPUFRJT05TLmluZm9fZGljdCkKLQotICAgICAgaWYgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgaXMgbm90IE5vbmU6Ci0gICAgICAgIHByaW50KCItLS0gc291cmNlIGluZm8gLS0tIikKLSAgICAgICAgY29tbW9uLkR1bXBJbmZvRGljdChPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpCi0KICAgICBXcml0ZUFCT1RBUGFja2FnZVdpdGhCcmlsbG9TY3JpcHQoCiAgICAgICAgIHRhcmdldF9maWxlPWFyZ3NbMF0sCiAgICAgICAgIG91dHB1dF9maWxlPWFyZ3NbMV0sCkBAIC0xNDE5LDQ4ICsxNzI3LDQzIEBACiAgICAgcHJpbnQoImRvbmUuIikKICAgICByZXR1cm4KIAorICAjIFNhbml0eSBjaGVjayB0aGUgbG9hZGVkIGluZm8gZGljdHMgZmlyc3QuCisgIGlmIE9QVElPTlMuaW5mb19kaWN0LmdldCgibm9fcmVjb3ZlcnkiKSA9PSAidHJ1ZSI6CisgICAgcmFpc2UgY29tbW9uLkV4dGVybmFsRXJyb3IoCisgICAgICAgICItLS0gdGFyZ2V0IGJ1aWxkIGhhcyBzcGVjaWZpZWQgbm8gcmVjb3ZlcnkgLS0tIikKKworICAjIE5vbi1BL0IgT1RBcyByZWx5IG9uIC9jYWNoZSBwYXJ0aXRpb24gdG8gc3RvcmUgdGVtcG9yYXJ5IGZpbGVzLgorICBjYWNoZV9zaXplID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJjYWNoZV9zaXplIikKKyAgaWYgY2FjaGVfc2l6ZSBpcyBOb25lOgorICAgIHByaW50KCItLS0gY2FuJ3QgZGV0ZXJtaW5lIHRoZSBjYWNoZSBwYXJ0aXRpb24gc2l6ZSAtLS0iKQorICBPUFRJT05TLmNhY2hlX3NpemUgPSBjYWNoZV9zaXplCisKICAgaWYgT1BUSU9OUy5leHRyYV9zY3JpcHQgaXMgbm90IE5vbmU6CiAgICAgT1BUSU9OUy5leHRyYV9zY3JpcHQgPSBvcGVuKE9QVElPTlMuZXh0cmFfc2NyaXB0KS5yZWFkKCkKIAogICBpZiBPUFRJT05TLmV4dHJhY3RlZF9pbnB1dCBpcyBub3QgTm9uZToKICAgICBPUFRJT05TLmlucHV0X3RtcCA9IE9QVElPTlMuZXh0cmFjdGVkX2lucHV0Ci0gICAgT1BUSU9OUy50YXJnZXRfdG1wID0gT1BUSU9OUy5pbnB1dF90bXAKLSAgICBPUFRJT05TLmluZm9fZGljdCA9IGNvbW1vbi5Mb2FkSW5mb0RpY3QoT1BUSU9OUy5pbnB1dF90bXAsIE9QVElPTlMuaW5wdXRfdG1wKQotICAgIGlucHV0X3ppcCA9IHppcGZpbGUuWmlwRmlsZShhcmdzWzBdLCAiciIpCiAgIGVsc2U6CiAgICAgcHJpbnQoInVuemlwcGluZyB0YXJnZXQgdGFyZ2V0LWZpbGVzLi4uIikKLSAgICBPUFRJT05TLmlucHV0X3RtcCwgaW5wdXRfemlwID0gY29tbW9uLlVuemlwVGVtcCgKLSAgICAgICAgYXJnc1swXSwgVU5aSVBfUEFUVEVSTikKKyAgICBPUFRJT05TLmlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoYXJnc1swXSwgVU5aSVBfUEFUVEVSTikKKyAgT1BUSU9OUy50YXJnZXRfdG1wID0gT1BUSU9OUy5pbnB1dF90bXAKIAotICAgIE9QVElPTlMudGFyZ2V0X3RtcCA9IE9QVElPTlMuaW5wdXRfdG1wCi0gICAgT1BUSU9OUy5pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KGlucHV0X3ppcCwgT1BUSU9OUy50YXJnZXRfdG1wKQotCi0gIGlmIE9QVElPTlMudmVyYm9zZToKLSAgICBwcmludCgiLS0tIHRhcmdldCBpbmZvIC0tLSIpCi0gICAgY29tbW9uLkR1bXBJbmZvRGljdChPUFRJT05TLmluZm9fZGljdCkKLQotICAjIElmIHRoZSBjYWxsZXIgZXhwbGljaXRseSBzcGVjaWZpZWQgdGhlIGRldmljZS1zcGVjaWZpYyBleHRlbnNpb25zCi0gICMgcGF0aCB2aWEgLXMvLS1kZXZpY2Vfc3BlY2lmaWMsIHVzZSB0aGF0LiAgT3RoZXJ3aXNlLCB1c2UKLSAgIyBNRVRBL3JlbGVhc2V0b29scy5weSBpZiBpdCBpcyBwcmVzZW50IGluIHRoZSB0YXJnZXQgdGFyZ2V0X2ZpbGVzLgotICAjIE90aGVyd2lzZSwgdGFrZSB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tICd0b29sX2V4dGVuc2lvbnMnIGluIHRoZQotICAjIGluZm8gZGljdCBhbmQgbG9vayBmb3IgdGhhdCBpbiB0aGUgbG9jYWwgZmlsZXN5c3RlbSwgcmVsYXRpdmUgdG8KLSAgIyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0KKyAgIyBJZiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHRoZSBkZXZpY2Utc3BlY2lmaWMgZXh0ZW5zaW9ucyBwYXRoIHZpYQorICAjIC1zIC8gLS1kZXZpY2Vfc3BlY2lmaWMsIHVzZSB0aGF0LiBPdGhlcndpc2UsIHVzZSBNRVRBL3JlbGVhc2V0b29scy5weSBpZiBpdAorICAjIGlzIHByZXNlbnQgaW4gdGhlIHRhcmdldCB0YXJnZXRfZmlsZXMuIE90aGVyd2lzZSwgdGFrZSB0aGUgcGF0aCBvZiB0aGUgZmlsZQorICAjIGZyb20gJ3Rvb2xfZXh0ZW5zaW9ucycgaW4gdGhlIGluZm8gZGljdCBhbmQgbG9vayBmb3IgdGhhdCBpbiB0aGUgbG9jYWwKKyAgIyBmaWxlc3lzdGVtLCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuCiAgIGlmIE9QVElPTlMuZGV2aWNlX3NwZWNpZmljIGlzIE5vbmU6CiAgICAgZnJvbV9pbnB1dCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgIk1FVEEiLCAicmVsZWFzZXRvb2xzLnB5IikKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmcm9tX2lucHV0KToKICAgICAgIHByaW50KCIodXNpbmcgZGV2aWNlLXNwZWNpZmljIGV4dGVuc2lvbnMgZnJvbSB0YXJnZXRfZmlsZXMpIikKICAgICAgIE9QVElPTlMuZGV2aWNlX3NwZWNpZmljID0gZnJvbV9pbnB1dAogICAgIGVsc2U6Ci0gICAgICBPUFRJT05TLmRldmljZV9zcGVjaWZpYyA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgidG9vbF9leHRlbnNpb25zIiwgTm9uZSkKKyAgICAgIE9QVElPTlMuZGV2aWNlX3NwZWNpZmljID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJ0b29sX2V4dGVuc2lvbnMiKQogCiAgIGlmIE9QVElPTlMuZGV2aWNlX3NwZWNpZmljIGlzIG5vdCBOb25lOgogICAgIE9QVElPTlMuZGV2aWNlX3NwZWNpZmljID0gb3MucGF0aC5hYnNwYXRoKE9QVElPTlMuZGV2aWNlX3NwZWNpZmljKQogCi0gIGlmIE9QVElPTlMuaW5mb19kaWN0LmdldCgibm9fcmVjb3ZlcnkiKSA9PSAidHJ1ZSI6Ci0gICAgcmFpc2UgY29tbW9uLkV4dGVybmFsRXJyb3IoCi0gICAgICAgICItLS0gdGFyZ2V0IGJ1aWxkIGhhcyBzcGVjaWZpZWQgbm8gcmVjb3ZlcnkgLS0tIikKLQogICAjIFNldCB1cCB0aGUgb3V0cHV0IHppcC4gQ3JlYXRlIGEgdGVtcG9yYXJ5IHppcCBmaWxlIGlmIHNpZ25pbmcgaXMgbmVlZGVkLgogICBpZiBPUFRJT05TLm5vX3NpZ25pbmc6CiAgICAgaWYgb3MucGF0aC5leGlzdHMoYXJnc1sxXSk6CkBAIC0xNDcyLDQ5ICsxNzc1LDI1IEBACiAgICAgb3V0cHV0X3ppcCA9IHppcGZpbGUuWmlwRmlsZSh0ZW1wX3ppcF9maWxlLCAidyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKIAotICAjIE5vbiBBL0IgT1RBcyByZWx5IG9uIC9jYWNoZSBwYXJ0aXRpb24gdG8gc3RvcmUgdGVtcG9yYXJ5IGZpbGVzLgotICBjYWNoZV9zaXplID0gT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJjYWNoZV9zaXplIiwgTm9uZSkKLSAgaWYgY2FjaGVfc2l6ZSBpcyBOb25lOgotICAgIHByaW50KCItLS0gY2FuJ3QgZGV0ZXJtaW5lIHRoZSBjYWNoZSBwYXJ0aXRpb24gc2l6ZSAtLS0iKQotICBPUFRJT05TLmNhY2hlX3NpemUgPSBjYWNoZV9zaXplCi0KLSAgIyBHZW5lcmF0ZSBhIHZlcmlmeSBwYWNrYWdlLgotICBpZiBPUFRJT05TLmdlbl92ZXJpZnk6Ci0gICAgV3JpdGVWZXJpZnlQYWNrYWdlKGlucHV0X3ppcCwgb3V0cHV0X3ppcCkKLQogICAjIEdlbmVyYXRlIGEgZnVsbCBPVEEuCi0gIGVsaWYgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgaXMgTm9uZToKLSAgICBXcml0ZUZ1bGxPVEFQYWNrYWdlKGlucHV0X3ppcCwgb3V0cHV0X3ppcCkKKyAgaWYgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgaXMgTm9uZToKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShhcmdzWzBdLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIFdyaXRlRnVsbE9UQVBhY2thZ2UoaW5wdXRfemlwLCBvdXRwdXRfemlwKQogCi0gICMgR2VuZXJhdGUgYW4gaW5jcmVtZW50YWwgT1RBLiBJdCB3aWxsIGZhbGwgYmFjayB0byBnZW5lcmF0ZSBhIGZ1bGwgT1RBIG9uCi0gICMgZmFpbHVyZSB1bmxlc3Mgbm9fZmFsbGJhY2tfdG9fZnVsbCBpcyBzcGVjaWZpZWQuCisgICMgR2VuZXJhdGUgYW4gaW5jcmVtZW50YWwgT1RBLgogICBlbHNlOgogICAgIHByaW50KCJ1bnppcHBpbmcgc291cmNlIHRhcmdldC1maWxlcy4uLiIpCi0gICAgT1BUSU9OUy5zb3VyY2VfdG1wLCBzb3VyY2VfemlwID0gY29tbW9uLlVuemlwVGVtcCgKLSAgICAgICAgT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UsCi0gICAgICAgIFVOWklQX1BBVFRFUk4pCi0gICAgT1BUSU9OUy50YXJnZXRfaW5mb19kaWN0ID0gT1BUSU9OUy5pbmZvX2RpY3QKLSAgICBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QgPSBjb21tb24uTG9hZEluZm9EaWN0KHNvdXJjZV96aXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLnNvdXJjZV90bXApCi0gICAgaWYgT1BUSU9OUy52ZXJib3NlOgotICAgICAgcHJpbnQoIi0tLSBzb3VyY2UgaW5mbyAtLS0iKQotICAgICAgY29tbW9uLkR1bXBJbmZvRGljdChPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QpCi0gICAgdHJ5OgorICAgIE9QVElPTlMuc291cmNlX3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoCisgICAgICAgIE9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlLCBVTlpJUF9QQVRURVJOKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGFyZ3NbMF0sICdyJykgYXMgaW5wdXRfemlwLCBcCisgICAgICAgIHppcGZpbGUuWmlwRmlsZShPUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSwgJ3InKSBhcyBzb3VyY2VfemlwOgogICAgICAgV3JpdGVCbG9ja0luY3JlbWVudGFsT1RBUGFja2FnZShpbnB1dF96aXAsIHNvdXJjZV96aXAsIG91dHB1dF96aXApCi0gICAgICBpZiBPUFRJT05TLmxvZ19kaWZmOgotICAgICAgICBvdXRfZmlsZSA9IG9wZW4oT1BUSU9OUy5sb2dfZGlmZiwgJ3cnKQorCisgICAgaWYgT1BUSU9OUy5sb2dfZGlmZjoKKyAgICAgIHdpdGggb3BlbihPUFRJT05TLmxvZ19kaWZmLCAndycpIGFzIG91dF9maWxlOgogICAgICAgICBpbXBvcnQgdGFyZ2V0X2ZpbGVzX2RpZmYKLSAgICAgICAgdGFyZ2V0X2ZpbGVzX2RpZmYucmVjdXJzaXZlRGlmZignJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05TLnNvdXJjZV90bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUSU9OUy5pbnB1dF90bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2ZpbGUpCi0gICAgICAgIG91dF9maWxlLmNsb3NlKCkKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgIGlmIG5vdCBPUFRJT05TLmZhbGxiYWNrX3RvX2Z1bGw6Ci0gICAgICAgIHJhaXNlCi0gICAgICBwcmludCgiLS0tIGZhaWxlZCB0byBidWlsZCBpbmNyZW1lbnRhbDsgZmFsbGluZyBiYWNrIHRvIGZ1bGwgLS0tIikKLSAgICAgIE9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlID0gTm9uZQotICAgICAgV3JpdGVGdWxsT1RBUGFja2FnZShpbnB1dF96aXAsIG91dHB1dF96aXApCisgICAgICAgIHRhcmdldF9maWxlc19kaWZmLnJlY3Vyc2l2ZURpZmYoCisgICAgICAgICAgICAnJywgT1BUSU9OUy5zb3VyY2VfdG1wLCBPUFRJT05TLmlucHV0X3RtcCwgb3V0X2ZpbGUpCiAKICAgY29tbW9uLlppcENsb3NlKG91dHB1dF96aXApCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9weWxpbnRyYyBiL3Rvb2xzL3JlbGVhc2V0b29scy9weWxpbnRyYwppbmRleCA5MGRlMWFmLi43YjM0MDVjIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvcHlsaW50cmMKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3B5bGludHJjCkBAIC0xNDQsOSArMTQ0LDYgQEAKIAogW0JBU0lDXQogCi0jIFJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIG1vZHVsZSwgc2VwYXJhdGVkIGJ5IGEgY29tbWEKLXJlcXVpcmVkLWF0dHJpYnV0ZXM9Ci0KICMgTGlzdCBvZiBidWlsdGlucyBmdW5jdGlvbiBuYW1lcyB0aGF0IHNob3VsZCBub3QgYmUgdXNlZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEKIGJhZC1mdW5jdGlvbnM9bWFwLGZpbHRlcixpbnB1dAogCkBAIC0zNTcsMTAgKzM1NCw2IEBACiAKIFtDTEFTU0VTXQogCi0jIExpc3Qgb2YgaW50ZXJmYWNlIG1ldGhvZHMgdG8gaWdub3JlLCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4gVGhpcyBpcyB1c2VkIGZvcgotIyBpbnN0YW5jZSB0byBub3QgY2hlY2sgbWV0aG9kcyBkZWZpbmVzIGluIFpvcGUncyBJbnRlcmZhY2UgYmFzZSBjbGFzcy4KLWlnbm9yZS1pZmFjZS1tZXRob2RzPWlzSW1wbGVtZW50ZWRCeSxkZWZlcnJlZCxleHRlbmRzLG5hbWVzLG5hbWVzQW5kRGVzY3JpcHRpb25zLHF1ZXJ5RGVzY3JpcHRpb25Gb3IsZ2V0QmFzZXMsZ2V0RGVzY3JpcHRpb25Gb3IsZ2V0RG9jLGdldE5hbWUsZ2V0VGFnZ2VkVmFsdWUsZ2V0VGFnZ2VkVmFsdWVUYWdzLGlzRXF1YWxPckV4dGVuZGVkQnksc2V0VGFnZ2VkVmFsdWUsaXNJbXBsZW1lbnRlZEJ5SW5zdGFuY2VzT2YsYWRhcHRXaXRoLGlzX2ltcGxlbWVudGVkX2J5Ci0KICMgTGlzdCBvZiBtZXRob2QgbmFtZXMgdXNlZCB0byBkZWNsYXJlIChpLmUuIGFzc2lnbikgaW5zdGFuY2UgYXR0cmlidXRlcy4KIGRlZmluaW5nLWF0dHItbWV0aG9kcz1fX2luaXRfXyxfX25ld19fLHNldFVwCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9yYW5nZWxpYi5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9yYW5nZWxpYi5weQppbmRleCBmYTZlZWMxLi4zNmJlY2Y0IDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvcmFuZ2VsaWIucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3JhbmdlbGliLnB5CkBAIC0xMywxOCArMTMsMjYgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKwogaW1wb3J0IGhlYXBxCiBpbXBvcnQgaXRlcnRvb2xzCiAKKwogX19hbGxfXyA9IFsiUmFuZ2VTZXQiXQogCisKIGNsYXNzIFJhbmdlU2V0KG9iamVjdCk6Ci0gICIiIkEgUmFuZ2VTZXQgcmVwcmVzZW50cyBhIHNldCBvZiBub25vdmVybGFwcGluZyByYW5nZXMgb24gdGhlCi0gIGludGVnZXJzIChpZSwgYSBzZXQgb2YgaW50ZWdlcnMsIGJ1dCBlZmZpY2llbnQgd2hlbiB0aGUgc2V0IGNvbnRhaW5zCi0gIGxvdHMgb2YgcnVucy4iIiIKKyAgIiIiQSBSYW5nZVNldCByZXByZXNlbnRzIGEgc2V0IG9mIG5vbi1vdmVybGFwcGluZyByYW5nZXMgb24gaW50ZWdlcnMuCisKKyAgQXR0cmlidXRlczoKKyAgICBtb25vdG9uaWM6IFdoZXRoZXIgdGhlIGlucHV0IGhhcyBhbGwgaXRzIGludGVnZXJzIGluIGluY3JlYXNpbmcgb3JkZXIuCisgICAgZXh0cmE6IEEgZGljdCB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBjYWxsZXIsIGUuZy4gdG8gc3RvcmUgaW5mbyB0aGF0J3MKKyAgICAgICAgb25seSBtZWFuaW5nZnVsIHRvIGNhbGxlci4KKyAgIiIiCiAKICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGE9Tm9uZSk6CiAgICAgc2VsZi5tb25vdG9uaWMgPSBGYWxzZQorICAgIHNlbGYuX2V4dHJhID0ge30KICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHN0cik6CiAgICAgICBzZWxmLl9wYXJzZV9pbnRlcm5hbChkYXRhKQogICAgIGVsaWYgZGF0YToKQEAgLTU2LDE4ICs2NCwyNCBAQAogICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgcmV0dXJuICc8UmFuZ2VTZXQoIicgKyBzZWxmLnRvX3N0cmluZygpICsgJyIpPicKIAorICBAcHJvcGVydHkKKyAgZGVmIGV4dHJhKHNlbGYpOgorICAgIHJldHVybiBzZWxmLl9leHRyYQorCiAgIEBjbGFzc21ldGhvZAogICBkZWYgcGFyc2UoY2xzLCB0ZXh0KToKLSAgICAiIiJQYXJzZSBhIHRleHQgc3RyaW5nIGNvbnNpc3Rpbmcgb2YgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZgotICAgIGJsb2NrcyBhbmQgcmFuZ2VzLCBlZyAiMTAtMjAgMzAgMzUtNDAiLiAgUmFuZ2VzIGFyZSBpbnRlcnByZXRlZCB0bwotICAgIGluY2x1ZGUgYm90aCB0aGVpciBlbmRzIChzbyB0aGUgYWJvdmUgZXhhbXBsZSByZXByZXNlbnRzIDE4Ci0gICAgaW5kaXZpZHVhbCBibG9ja3MuICBSZXR1cm5zIGEgUmFuZ2VTZXQgb2JqZWN0LgorICAgICIiIlBhcnNlcyBhIHRleHQgc3RyaW5nIGludG8gYSBSYW5nZVNldC4KIAotICAgIElmIHRoZSBpbnB1dCBoYXMgYWxsIGl0cyBibG9ja3MgaW4gaW5jcmVhc2luZyBvcmRlciwgdGhlbiByZXR1cm5lZAotICAgIFJhbmdlU2V0IHdpbGwgaGF2ZSBhbiBleHRyYSBhdHRyaWJ1dGUgJ21vbm90b25pYycgdGhhdCBpcyBzZXQgdG8KLSAgICBUcnVlLiAgRm9yIGV4YW1wbGUgdGhlIGlucHV0ICIxMC0yMCAzMCIgaXMgbW9ub3RvbmljLCBidXQgdGhlIGlucHV0Ci0gICAgIjE1LTIwIDMwIDEwLTE0IiBpcyBub3QsIGV2ZW4gdGhvdWdoIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIHNldAotICAgIG9mIGJsb2NrcyAoYW5kIHRoZSB0d28gUmFuZ2VTZXRzIHdpbGwgY29tcGFyZSBlcXVhbCB3aXRoID09KS4KKyAgICBUaGUgaW5wdXQgdGV4dCBzdHJpbmcgY29uc2lzdHMgb2YgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBibG9ja3MgYW5kCisgICAgcmFuZ2VzLCBlLmcuICIxMC0yMCAzMCAzNS00MCIuIFJhbmdlcyBhcmUgaW50ZXJwcmV0ZWQgdG8gaW5jbHVkZSBib3RoIHRoZWlyCisgICAgZW5kcyAoc28gdGhlIGFib3ZlIGV4YW1wbGUgcmVwcmVzZW50cyAxOCBpbmRpdmlkdWFsIGJsb2NrcykuIFJldHVybnMgYQorICAgIFJhbmdlU2V0IG9iamVjdC4KKworICAgIElmIHRoZSBpbnB1dCBoYXMgYWxsIGl0cyBibG9ja3MgaW4gaW5jcmVhc2luZyBvcmRlciwgdGhlbiB0aGUgJ21vbm90b25pYycKKyAgICBhdHRyaWJ1dGUgb2YgdGhlIHJldHVybmVkIFJhbmdlU2V0IHdpbGwgYmUgc2V0IHRvIFRydWUuIEZvciBleGFtcGxlIHRoZQorICAgIGlucHV0ICIxMC0yMCAzMCIgaXMgbW9ub3RvbmljLCBidXQgdGhlIGlucHV0ICIxNS0yMCAzMCAxMC0xNCIgaXMgbm90LCBldmVuCisgICAgdGhvdWdoIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIHNldCBvZiBibG9ja3MgKGFuZCB0aGUgdHdvIFJhbmdlU2V0cyB3aWxsCisgICAgY29tcGFyZSBlcXVhbCB3aXRoID09KS4KICAgICAiIiIKICAgICByZXR1cm4gY2xzKHRleHQpCiAKQEAgLTMyMCw3ICszMzQsNyBAQAogICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgID4+PiBsaXN0KFJhbmdlU2V0KCIxMC0xOSAzLTUiKS5uZXh0X2l0ZW0oKSkKICAgICBbMywgNCwgNSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTldCi0gICAgPj4+IGxpc3QocmFuZ2VsaWIuUmFuZ2VTZXQoIjEwLTE5IDMgNSA3IikubmV4dF9pdGVtKCkpCisgICAgPj4+IGxpc3QoUmFuZ2VTZXQoIjEwLTE5IDMgNSA3IikubmV4dF9pdGVtKCkpCiAgICAgWzMsIDUsIDcsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5XQogICAgICIiIgogICAgIGZvciBzLCBlIGluIHNlbGY6CmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5CmluZGV4IDgzYzI0ODcuLmZhNjJjOGYgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5CkBAIC05MCwxNCArOTAsOSBAQAogICAgICAgdGhlIGV4aXN0aW5nIG9uZXMgaW4gaW5mbyBkaWN0LgogIiIiCiAKLWltcG9ydCBzeXMKLQotaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgotICBwcmludCA+PiBzeXMuc3RkZXJyLCAiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iCi0gIHN5cy5leGl0KDEpCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCiAKIGltcG9ydCBiYXNlNjQKLWltcG9ydCBjU3RyaW5nSU8KIGltcG9ydCBjb3B5CiBpbXBvcnQgZXJybm8KIGltcG9ydCBnemlwCkBAIC0xMDYsMTIgKzEwMSwyMCBAQAogaW1wb3J0IHNodXRpbAogaW1wb3J0IHN0YXQKIGltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB6aXBmaWxlCitmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKIAogaW1wb3J0IGFkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzCiBpbXBvcnQgY29tbW9uCiAKKworaWYgc3lzLmhleHZlcnNpb24gPCAweDAyMDcwMDAwOgorICBwcmludCgiUHl0aG9uIDIuNyBvciBuZXdlciBpcyByZXF1aXJlZC4iLCBmaWxlPXN5cy5zdGRlcnIpCisgIHN5cy5leGl0KDEpCisKKwogT1BUSU9OUyA9IGNvbW1vbi5PUFRJT05TCiAKIE9QVElPTlMuZXh0cmFfYXBrcyA9IHt9CkBAIC0xMjYsNiArMTI5LDcgQEAKIE9QVElPTlMuYXZiX2FsZ29yaXRobXMgPSB7fQogT1BUSU9OUy5hdmJfZXh0cmFfYXJncyA9IHt9CiAKKwogZGVmIEdldEFwa0NlcnRzKGNlcnRtYXApOgogICAjIGFwcGx5IHRoZSBrZXkgcmVtYXBwaW5nIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQogICBmb3IgYXBrLCBjZXJ0IGluIGNlcnRtYXAuaXRlcml0ZW1zKCk6CkBAIC0xNDksMTcgKzE1MywxOCBAQAogICAgIGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbiA9ICIuYXBrIiArIGNvbXByZXNzZWRfZXh0ZW5zaW9uCiAgIGZvciBpbmZvIGluIGlucHV0X3RmX3ppcC5pbmZvbGlzdCgpOgogICAgIGlmIChpbmZvLmZpbGVuYW1lLmVuZHN3aXRoKCIuYXBrIikgb3IKLSAgICAgICAgKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbiBhbmQgaW5mby5maWxlbmFtZS5lbmRzd2l0aChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24pKSk6CisgICAgICAgIChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24gYW5kCisgICAgICAgICBpbmZvLmZpbGVuYW1lLmVuZHN3aXRoKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbikpKToKICAgICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGluZm8uZmlsZW5hbWUpCiAgICAgICBpZiBjb21wcmVzc2VkX2Fwa19leHRlbnNpb24gYW5kIG5hbWUuZW5kc3dpdGgoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uKToKICAgICAgICAgbmFtZSA9IG5hbWVbOi1sZW4oY29tcHJlc3NlZF9leHRlbnNpb24pXQogICAgICAgaWYgbmFtZSBub3QgaW4gYXBrX2tleV9tYXA6CiAgICAgICAgIHVua25vd25fYXBrcy5hcHBlbmQobmFtZSkKICAgaWYgdW5rbm93bl9hcGtzOgotICAgIHByaW50ICJFUlJPUjogbm8ga2V5IHNwZWNpZmllZCBmb3I6XG5cbiAiLAotICAgIHByaW50ICJcbiAgIi5qb2luKHVua25vd25fYXBrcykKLSAgICBwcmludCAiXG5Vc2UgJy1lIDxhcGtuYW1lPj0nIHRvIHNwZWNpZnkgYSBrZXkgKHdoaWNoIG1heSBiZSBhbiIKLSAgICBwcmludCAiZW1wdHkgc3RyaW5nIHRvIG5vdCBzaWduIHRoaXMgYXBrKS4iCisgICAgcHJpbnQoIkVSUk9SOiBubyBrZXkgc3BlY2lmaWVkIGZvcjpcbiIpCisgICAgcHJpbnQoIiAgIiArICJcbiAgIi5qb2luKHVua25vd25fYXBrcykpCisgICAgcHJpbnQoIlxuVXNlICctZSA8YXBrbmFtZT49JyB0byBzcGVjaWZ5IGEga2V5ICh3aGljaCBtYXkgYmUgYW4gZW1wdHkgIgorICAgICAgICAgICJzdHJpbmcgdG8gbm90IHNpZ24gdGhpcyBhcGspLiIpCiAgICAgc3lzLmV4aXQoMSkKIAogCkBAIC0xNzEsNyArMTc2LDggQEAKIAogICBpZiBpc19jb21wcmVzc2VkOgogICAgIHVuY29tcHJlc3NlZCA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCi0gICAgd2l0aCBnemlwLm9wZW4odW5zaWduZWQubmFtZSwgInJiIikgYXMgaW5fZmlsZSwgb3Blbih1bmNvbXByZXNzZWQubmFtZSwgIndiIikgYXMgb3V0X2ZpbGU6CisgICAgd2l0aCBnemlwLm9wZW4odW5zaWduZWQubmFtZSwgInJiIikgYXMgaW5fZmlsZSwgXAorICAgICAgICAgb3Blbih1bmNvbXByZXNzZWQubmFtZSwgIndiIikgYXMgb3V0X2ZpbGU6CiAgICAgICBzaHV0aWwuY29weWZpbGVvYmooaW5fZmlsZSwgb3V0X2ZpbGUpCiAKICAgICAjIEZpbmFsbHksIGNsb3NlIHRoZSAidW5zaWduZWQiIGZpbGUgKHdoaWNoIGlzIGd6aXAgY29tcHJlc3NlZCksIGFuZCB0aGVuCkBAIC0yMDMsMTQgKzIwOSwxNSBAQAogICAgIG1pbl9hcGlfbGV2ZWwgPSAxCiAKICAgY29tbW9uLlNpZ25GaWxlKHVuc2lnbmVkLm5hbWUsIHNpZ25lZC5uYW1lLCBrZXluYW1lLCBwdywKLSAgICAgIG1pbl9hcGlfbGV2ZWw9bWluX2FwaV9sZXZlbCwKLSAgICAgIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXA9Y29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCkKKyAgICAgICAgICAgICAgICAgIG1pbl9hcGlfbGV2ZWw9bWluX2FwaV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXA9Y29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCkKIAotICBkYXRhID0gTm9uZTsKKyAgZGF0YSA9IE5vbmUKICAgaWYgaXNfY29tcHJlc3NlZDoKICAgICAjIFJlY29tcHJlc3MgdGhlIGZpbGUgYWZ0ZXIgaXQgaGFzIGJlZW4gc2lnbmVkLgogICAgIGNvbXByZXNzZWQgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQotICAgIHdpdGggb3BlbihzaWduZWQubmFtZSwgInJiIikgYXMgaW5fZmlsZSwgZ3ppcC5vcGVuKGNvbXByZXNzZWQubmFtZSwgIndiIikgYXMgb3V0X2ZpbGU6CisgICAgd2l0aCBvcGVuKHNpZ25lZC5uYW1lLCAicmIiKSBhcyBpbl9maWxlLCBcCisgICAgICAgICBnemlwLm9wZW4oY29tcHJlc3NlZC5uYW1lLCAid2IiKSBhcyBvdXRfZmlsZToKICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihpbl9maWxlLCBvdXRfZmlsZSkKIAogICAgIGRhdGEgPSBjb21wcmVzc2VkLnJlYWQoKQpAQCAtMjMzLDEwICsyNDAsMTEgQEAKICAgaWYgY29tcHJlc3NlZF9leHRlbnNpb246CiAgICAgY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uID0gIi5hcGsiICsgY29tcHJlc3NlZF9leHRlbnNpb24KIAotICBtYXhzaXplID0gbWF4KFtsZW4ob3MucGF0aC5iYXNlbmFtZShpLmZpbGVuYW1lKSkKLSAgICAgICAgICAgICAgICAgZm9yIGkgaW4gaW5wdXRfdGZfemlwLmluZm9saXN0KCkKLSAgICAgICAgICAgICAgICAgaWYgaS5maWxlbmFtZS5lbmRzd2l0aCgnLmFwaycpIG9yCi0gICAgICAgICAgICAgICAgIChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24gYW5kIGkuZmlsZW5hbWUuZW5kc3dpdGgoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uKSldKQorICBtYXhzaXplID0gbWF4KAorICAgICAgW2xlbihvcy5wYXRoLmJhc2VuYW1lKGkuZmlsZW5hbWUpKSBmb3IgaSBpbiBpbnB1dF90Zl96aXAuaW5mb2xpc3QoKQorICAgICAgIGlmIChpLmZpbGVuYW1lLmVuZHN3aXRoKCcuYXBrJykgb3IKKyAgICAgICAgICAgKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbiBhbmQKKyAgICAgICAgICAgIGkuZmlsZW5hbWUuZW5kc3dpdGgoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uKSkpXSkKICAgc3lzdGVtX3Jvb3RfaW1hZ2UgPSBtaXNjX2luZm8uZ2V0KCJzeXN0ZW1fcm9vdF9pbWFnZSIpID09ICJ0cnVlIgogCiAgIGZvciBpbmZvIGluIGlucHV0X3RmX3ppcC5pbmZvbGlzdCgpOgpAQCAtMjQ4LDIxICsyNTYsMjMgQEAKIAogICAgICMgU2lnbiBBUEtzLgogICAgIGlmIChpbmZvLmZpbGVuYW1lLmVuZHN3aXRoKCIuYXBrIikgb3IKLSAgICAgICAgKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbiBhbmQgaW5mby5maWxlbmFtZS5lbmRzd2l0aChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24pKSk6Ci0gICAgICBpc19jb21wcmVzc2VkID0gY29tcHJlc3NlZF9leHRlbnNpb24gYW5kIGluZm8uZmlsZW5hbWUuZW5kc3dpdGgoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uKQorICAgICAgICAoY29tcHJlc3NlZF9hcGtfZXh0ZW5zaW9uIGFuZAorICAgICAgICAgaW5mby5maWxlbmFtZS5lbmRzd2l0aChjb21wcmVzc2VkX2Fwa19leHRlbnNpb24pKSk6CisgICAgICBpc19jb21wcmVzc2VkID0gKGNvbXByZXNzZWRfZXh0ZW5zaW9uIGFuZAorICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmZpbGVuYW1lLmVuZHN3aXRoKGNvbXByZXNzZWRfYXBrX2V4dGVuc2lvbikpCiAgICAgICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShpbmZvLmZpbGVuYW1lKQogICAgICAgaWYgaXNfY29tcHJlc3NlZDoKICAgICAgICAgbmFtZSA9IG5hbWVbOi1sZW4oY29tcHJlc3NlZF9leHRlbnNpb24pXQogCiAgICAgICBrZXkgPSBhcGtfa2V5X21hcFtuYW1lXQogICAgICAgaWYga2V5IG5vdCBpbiBjb21tb24uU1BFQ0lBTF9DRVJUX1NUUklOR1M6Ci0gICAgICAgIHByaW50ICIgICAgc2lnbmluZzogJS0qcyAoJXMpIiAlIChtYXhzaXplLCBuYW1lLCBrZXkpCisgICAgICAgIHByaW50KCIgICAgc2lnbmluZzogJS0qcyAoJXMpIiAlIChtYXhzaXplLCBuYW1lLCBrZXkpKQogICAgICAgICBzaWduZWRfZGF0YSA9IFNpZ25BcGsoZGF0YSwga2V5LCBrZXlfcGFzc3dvcmRzW2tleV0sIHBsYXRmb3JtX2FwaV9sZXZlbCwKLSAgICAgICAgICAgIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXAsIGlzX2NvbXByZXNzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZV90b19hcGlfbGV2ZWxfbWFwLCBpc19jb21wcmVzc2VkKQogICAgICAgICBjb21tb24uWmlwV3JpdGVTdHIob3V0cHV0X3RmX3ppcCwgb3V0X2luZm8sIHNpZ25lZF9kYXRhKQogICAgICAgZWxzZToKICAgICAgICAgIyBhbiBBUEsgd2UncmUgbm90IHN1cHBvc2VkIHRvIHNpZ24uCi0gICAgICAgIHByaW50ICJOT1Qgc2lnbmluZzogJXMiICUgKG5hbWUsKQorICAgICAgICBwcmludCgiTk9UIHNpZ25pbmc6ICVzIiAlIChuYW1lLCkpCiAgICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfdGZfemlwLCBvdXRfaW5mbywgZGF0YSkKIAogICAgICMgU3lzdGVtIHByb3BlcnRpZXMuCkBAIC0yNzQsMTUgKzI4NCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJPT1QvZGVmYXVsdC5wcm9wIiwgICMgbGVnYWN5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVDT1ZFUlkvUkFNRElTSy9wcm9wLmRlZmF1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFQ09WRVJZL1JBTURJU0svZGVmYXVsdC5wcm9wIik6ICAjIGxlZ2FjeQotICAgICAgcHJpbnQgInJld3JpdGluZyAlczoiICUgKGluZm8uZmlsZW5hbWUsKQorICAgICAgcHJpbnQoIlJld3JpdGluZyAlczoiICUgKGluZm8uZmlsZW5hbWUsKSkKICAgICAgIGlmIHN0YXQuU19JU0xOSyhpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYpOgogICAgICAgICBuZXdfZGF0YSA9IGRhdGEKICAgICAgIGVsc2U6Ci0gICAgICAgIG5ld19kYXRhID0gUmV3cml0ZVByb3BzKGRhdGEsIG1pc2NfaW5mbykKKyAgICAgICAgbmV3X2RhdGEgPSBSZXdyaXRlUHJvcHMoZGF0YSkKICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfdGZfemlwLCBvdXRfaW5mbywgbmV3X2RhdGEpCiAKKyAgICAjIFJlcGxhY2UgdGhlIGNlcnRzIGluICptYWNfcGVybWlzc2lvbnMueG1sICh0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSwgc3VjaAorICAgICMgYXMge3N5c3RlbSx2ZW5kb3J9L2V0Yy9zZWxpbnV4L3twbGF0LG5vbnBsYXR9X21hY19wZXJtaXNzaW9ucy54bWwpLgogICAgIGVsaWYgaW5mby5maWxlbmFtZS5lbmRzd2l0aCgibWFjX3Blcm1pc3Npb25zLnhtbCIpOgotICAgICAgcHJpbnQgInJld3JpdGluZyAlcyB3aXRoIG5ldyBrZXlzLiIgJSAoaW5mby5maWxlbmFtZSwpCisgICAgICBwcmludCgiUmV3cml0aW5nICVzIHdpdGggbmV3IGtleXMuIiAlIChpbmZvLmZpbGVuYW1lLCkpCiAgICAgICBuZXdfZGF0YSA9IFJlcGxhY2VDZXJ0cyhkYXRhKQogICAgICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF90Zl96aXAsIG91dF9pbmZvLCBuZXdfZGF0YSkKIApAQCAtMzMzLDEwICszNDUsNyBAQAogICAgIFJlcGxhY2VWZXJpdHlQcml2YXRlS2V5KG1pc2NfaW5mbywgT1BUSU9OUy5yZXBsYWNlX3Zlcml0eV9wcml2YXRlX2tleVsxXSkKIAogICBpZiBPUFRJT05TLnJlcGxhY2VfdmVyaXR5X3B1YmxpY19rZXk6Ci0gICAgaWYgc3lzdGVtX3Jvb3RfaW1hZ2U6Ci0gICAgICBkZXN0ID0gIlJPT1QvdmVyaXR5X2tleSIKLSAgICBlbHNlOgotICAgICAgZGVzdCA9ICJCT09UL1JBTURJU0svdmVyaXR5X2tleSIKKyAgICBkZXN0ID0gIlJPT1QvdmVyaXR5X2tleSIgaWYgc3lzdGVtX3Jvb3RfaW1hZ2UgZWxzZSAiQk9PVC9SQU1ESVNLL3Zlcml0eV9rZXkiCiAgICAgIyBXZSBhcmUgcmVwbGFjaW5nIHRoZSBvbmUgaW4gYm9vdCBpbWFnZSBvbmx5LCBzaW5jZSB0aGUgb25lIHVuZGVyCiAgICAgIyByZWNvdmVyeSB3b24ndCBldmVyIGJlIG5lZWRlZC4KICAgICBSZXBsYWNlVmVyaXR5UHVibGljS2V5KApAQCAtMzU1LDM4ICszNjQsNjcgQEAKIAogCiBkZWYgUmVwbGFjZUNlcnRzKGRhdGEpOgotICAiIiJHaXZlbiBhIHN0cmluZyBvZiBkYXRhLCByZXBsYWNlIGFsbCBvY2N1cmVuY2VzIG9mIGEgc2V0Ci0gIG9mIFg1MDkgY2VydHMgd2l0aCBhIG5ld2VyIHNldCBvZiBYNTA5IGNlcnRzIGFuZCByZXR1cm4KLSAgdGhlIHVwZGF0ZWQgZGF0YSBzdHJpbmcuIiIiCi0gIGZvciBvbGQsIG5ldyBpbiBPUFRJT05TLmtleV9tYXAuaXRlcml0ZW1zKCk6Ci0gICAgdHJ5OgotICAgICAgaWYgT1BUSU9OUy52ZXJib3NlOgotICAgICAgICBwcmludCAiICAgIFJlcGxhY2luZyAlcy54NTA5LnBlbSB3aXRoICVzLng1MDkucGVtIiAlIChvbGQsIG5ldykKLSAgICAgIGYgPSBvcGVuKG9sZCArICIueDUwOS5wZW0iKQotICAgICAgb2xkX2NlcnQxNiA9IGJhc2U2NC5iMTZlbmNvZGUoY29tbW9uLlBhcnNlQ2VydGlmaWNhdGUoZi5yZWFkKCkpKS5sb3dlcigpCi0gICAgICBmLmNsb3NlKCkKLSAgICAgIGYgPSBvcGVuKG5ldyArICIueDUwOS5wZW0iKQotICAgICAgbmV3X2NlcnQxNiA9IGJhc2U2NC5iMTZlbmNvZGUoY29tbW9uLlBhcnNlQ2VydGlmaWNhdGUoZi5yZWFkKCkpKS5sb3dlcigpCi0gICAgICBmLmNsb3NlKCkKLSAgICAgICMgT25seSBtYXRjaCBlbnRpcmUgY2VydHMuCi0gICAgICBwYXR0ZXJuID0gIlxcYiIrb2xkX2NlcnQxNisiXFxiIgotICAgICAgKGRhdGEsIG51bSkgPSByZS5zdWJuKHBhdHRlcm4sIG5ld19jZXJ0MTYsIGRhdGEsIGZsYWdzPXJlLklHTk9SRUNBU0UpCi0gICAgICBpZiBPUFRJT05TLnZlcmJvc2U6Ci0gICAgICAgIHByaW50ICIgICAgUmVwbGFjZWQgJWQgb2NjdXJlbmNlKHMpIG9mICVzLng1MDkucGVtIHdpdGggIiBcCi0gICAgICAgICAgICAiJXMueDUwOS5wZW0iICUgKG51bSwgb2xkLCBuZXcpCi0gICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UIGFuZCBub3QgT1BUSU9OUy52ZXJib3NlOgotICAgICAgICBjb250aW51ZQorICAiIiJSZXBsYWNlcyBhbGwgdGhlIG9jY3VyZW5jZXMgb2YgWC41MDkgY2VydHMgd2l0aCB0aGUgbmV3IG9uZXMuCiAKLSAgICAgIHByaW50ICIgICAgRXJyb3IgYWNjZXNzaW5nICVzLiAlcy4gU2tpcCByZXBsYWNpbmcgJXMueDUwOS5wZW0gIiBcCi0gICAgICAgICAgIndpdGggJXMueDUwOS5wZW0uIiAlIChlLmZpbGVuYW1lLCBlLnN0cmVycm9yLCBvbGQsIG5ldykKKyAgVGhlIG1hcHBpbmcgaW5mbyBpcyByZWFkIGZyb20gT1BUSU9OUy5rZXlfbWFwLiBOb24tZXhpc3RlbnQgY2VydGlmaWNhdGUgd2lsbAorICBiZSBza2lwcGVkLiBBZnRlciB0aGUgcmVwbGFjZW1lbnQsIGl0IGFkZGl0aW9uYWxseSBjaGVja3MgZm9yIGR1cGxpY2F0ZQorICBlbnRyaWVzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgZmFpbCB0aGUgcG9saWN5IGxvYWRpbmcgY29kZSBpbgorICBmcmFtZXdvcmtzL2Jhc2Uvc2VydmljZXMvY29yZS9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9TRUxpbnV4TU1BQy5qYXZhLgorCisgIEFyZ3M6CisgICAgZGF0YTogSW5wdXQgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBzZXQgb2YgWC41MDkgY2VydHMuCisKKyAgUmV0dXJuczoKKyAgICBBIHN0cmluZyBhZnRlciB0aGUgcmVwbGFjZW1lbnQuCisKKyAgUmFpc2VzOgorICAgIEFzc2VydGlvbkVycm9yOiBPbiBmaW5kaW5nIGR1cGxpY2F0ZSBlbnRyaWVzLgorICAiIiIKKyAgZm9yIG9sZCwgbmV3IGluIE9QVElPTlMua2V5X21hcC5pdGVyaXRlbXMoKToKKyAgICBpZiBPUFRJT05TLnZlcmJvc2U6CisgICAgICBwcmludCgiICAgIFJlcGxhY2luZyAlcy54NTA5LnBlbSB3aXRoICVzLng1MDkucGVtIiAlIChvbGQsIG5ldykpCisKKyAgICB0cnk6CisgICAgICB3aXRoIG9wZW4ob2xkICsgIi54NTA5LnBlbSIpIGFzIG9sZF9mcDoKKyAgICAgICAgb2xkX2NlcnQxNiA9IGJhc2U2NC5iMTZlbmNvZGUoCisgICAgICAgICAgICBjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShvbGRfZnAucmVhZCgpKSkubG93ZXIoKQorICAgICAgd2l0aCBvcGVuKG5ldyArICIueDUwOS5wZW0iKSBhcyBuZXdfZnA6CisgICAgICAgIG5ld19jZXJ0MTYgPSBiYXNlNjQuYjE2ZW5jb2RlKAorICAgICAgICAgICAgY29tbW9uLlBhcnNlQ2VydGlmaWNhdGUobmV3X2ZwLnJlYWQoKSkpLmxvd2VyKCkKKyAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgaWYgT1BUSU9OUy52ZXJib3NlIG9yIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICBwcmludCgiICAgIEVycm9yIGFjY2Vzc2luZyAlczogJXMuXG5Ta2lwIHJlcGxhY2luZyAlcy54NTA5LnBlbSB3aXRoICIKKyAgICAgICAgICAgICAgIiVzLng1MDkucGVtLiIgJSAoZS5maWxlbmFtZSwgZS5zdHJlcnJvciwgb2xkLCBuZXcpKQorICAgICAgY29udGludWUKKworICAgICMgT25seSBtYXRjaCBlbnRpcmUgY2VydHMuCisgICAgcGF0dGVybiA9ICJcXGIiICsgb2xkX2NlcnQxNiArICJcXGIiCisgICAgKGRhdGEsIG51bSkgPSByZS5zdWJuKHBhdHRlcm4sIG5ld19jZXJ0MTYsIGRhdGEsIGZsYWdzPXJlLklHTk9SRUNBU0UpCisKKyAgICBpZiBPUFRJT05TLnZlcmJvc2U6CisgICAgICBwcmludCgiICAgIFJlcGxhY2VkICVkIG9jY3VyZW5jZShzKSBvZiAlcy54NTA5LnBlbSB3aXRoICVzLng1MDkucGVtIiAlICgKKyAgICAgICAgICBudW0sIG9sZCwgbmV3KSkKKworICAjIFZlcmlmeSB0aGF0IHRoZXJlJ3JlIG5vIGR1cGxpY2F0ZSBlbnRyaWVzIGFmdGVyIHRoZSByZXBsYWNlbWVudC4gTm90ZSB0aGF0CisgICMgaXQncyBvbmx5IGNoZWNraW5nIGVudHJpZXMgd2l0aCBnbG9iYWwgc2VpbmZvIGF0IHRoZSBtb21lbnQgKGkuZS4gaWdub3JpbmcKKyAgIyB0aGUgb25lcyB3aXRoIGlubmVyIHBhY2thZ2VzKS4gKEJ1ZzogNjk0NzkzNjYpCisgIHJvb3QgPSBFbGVtZW50VHJlZS5mcm9tc3RyaW5nKGRhdGEpCisgIHNpZ25hdHVyZXMgPSBbc2lnbmVyLmF0dHJpYlsnc2lnbmF0dXJlJ10gZm9yIHNpZ25lciBpbiByb290LmZpbmRhbGwoJ3NpZ25lcicpXQorICBhc3NlcnQgbGVuKHNpZ25hdHVyZXMpID09IGxlbihzZXQoc2lnbmF0dXJlcykpLCBcCisgICAgICAiRm91bmQgZHVwbGljYXRlIGVudHJpZXMgYWZ0ZXIgY2VydCByZXBsYWNlbWVudDoge30iLmZvcm1hdChkYXRhKQogCiAgIHJldHVybiBkYXRhCiAKIAogZGVmIEVkaXRUYWdzKHRhZ3MpOgotICAiIiJHaXZlbiBhIHN0cmluZyBjb250YWluaW5nIGNvbW1hLXNlcGFyYXRlZCB0YWdzLCBhcHBseSB0aGUgZWRpdHMKLSAgc3BlY2lmaWVkIGluIE9QVElPTlMudGFnX2NoYW5nZXMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBzdHJpbmcuIiIiCisgICIiIkFwcGxpZXMgdGhlIGVkaXRzIHRvIHRoZSB0YWcgc3RyaW5nIGFzIHNwZWNpZmllZCBpbiBPUFRJT05TLnRhZ19jaGFuZ2VzLgorCisgIEFyZ3M6CisgICAgdGFnczogVGhlIGlucHV0IHN0cmluZyB0aGF0IGNvbnRhaW5zIGNvbW1hLXNlcGFyYXRlZCB0YWdzLgorCisgIFJldHVybnM6CisgICAgVGhlIHVwZGF0ZWQgdGFncyAoY29tbWEtc2VwYXJhdGVkIGFuZCBzb3J0ZWQpLgorICAiIiIKICAgdGFncyA9IHNldCh0YWdzLnNwbGl0KCIsIikpCiAgIGZvciBjaCBpbiBPUFRJT05TLnRhZ19jaGFuZ2VzOgogICAgIGlmIGNoWzBdID09ICItIjoKQEAgLTM5NiwyMCArNDM0LDI3IEBACiAgIHJldHVybiAiLCIuam9pbihzb3J0ZWQodGFncykpCiAKIAotZGVmIFJld3JpdGVQcm9wcyhkYXRhLCBtaXNjX2luZm8pOgorZGVmIFJld3JpdGVQcm9wcyhkYXRhKToKKyAgIiIiUmV3cml0ZXMgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGluIHRoZSBnaXZlbiBzdHJpbmcuCisKKyAgRWFjaCBwcm9wZXJ0eSBpcyBleHBlY3RlZCBpbiAna2V5PXZhbHVlJyBmb3JtYXQuIFRoZSBwcm9wZXJ0aWVzIHRoYXQgY29udGFpbgorICBidWlsZCB0YWdzIChpLmUuIHRlc3Qta2V5cywgZGV2LWtleXMpIHdpbGwgYmUgdXBkYXRlZCBhY2NvcmRpbmdseSBieSBjYWxsaW5nCisgIEVkaXRUYWdzKCkuCisKKyAgQXJnczoKKyAgICBkYXRhOiBJbnB1dCBzdHJpbmcsIHNlcGFyYXRlZCBieSBuZXdsaW5lcy4KKworICBSZXR1cm5zOgorICAgIFRoZSBzdHJpbmcgd2l0aCBtb2RpZmllZCBwcm9wZXJ0aWVzLgorICAiIiIKICAgb3V0cHV0ID0gW10KICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdCgiXG4iKToKICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgb3JpZ2luYWxfbGluZSA9IGxpbmUKICAgICBpZiBsaW5lIGFuZCBsaW5lWzBdICE9ICcjJyBhbmQgIj0iIGluIGxpbmU6CiAgICAgICBrZXksIHZhbHVlID0gbGluZS5zcGxpdCgiPSIsIDEpCi0gICAgICBpZiAoa2V5IGluICgicm8uYnVpbGQuZmluZ2VycHJpbnQiLCAicm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50IikKLSAgICAgICAgICBhbmQgbWlzY19pbmZvLmdldCgib2VtX2ZpbmdlcnByaW50X3Byb3BlcnRpZXMiKSBpcyBOb25lKToKLSAgICAgICAgcGllY2VzID0gdmFsdWUuc3BsaXQoIi8iKQotICAgICAgICBwaWVjZXNbLTFdID0gRWRpdFRhZ3MocGllY2VzWy0xXSkKLSAgICAgICAgdmFsdWUgPSAiLyIuam9pbihwaWVjZXMpCi0gICAgICBlbGlmIChrZXkgaW4gKCJyby5idWlsZC50aHVtYnByaW50IiwgInJvLnZlbmRvci5idWlsZC50aHVtYnByaW50IikKLSAgICAgICAgICAgIGFuZCBtaXNjX2luZm8uZ2V0KCJvZW1fZmluZ2VycHJpbnRfcHJvcGVydGllcyIpIGlzIG5vdCBOb25lKToKKyAgICAgIGlmIGtleSBpbiAoInJvLmJ1aWxkLmZpbmdlcnByaW50IiwgInJvLmJ1aWxkLnRodW1icHJpbnQiLAorICAgICAgICAgICAgICAgICAicm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50IiwgInJvLnZlbmRvci5idWlsZC50aHVtYnByaW50Iik6CiAgICAgICAgIHBpZWNlcyA9IHZhbHVlLnNwbGl0KCIvIikKICAgICAgICAgcGllY2VzWy0xXSA9IEVkaXRUYWdzKHBpZWNlc1stMV0pCiAgICAgICAgIHZhbHVlID0gIi8iLmpvaW4ocGllY2VzKQpAQCAtNDMyLDggKzQ3Nyw4IEBACiAgICAgICAgIHZhbHVlID0gIiAiLmpvaW4odmFsdWUpCiAgICAgICBsaW5lID0ga2V5ICsgIj0iICsgdmFsdWUKICAgICBpZiBsaW5lICE9IG9yaWdpbmFsX2xpbmU6Ci0gICAgICBwcmludCAiICByZXBsYWNlOiAiLCBvcmlnaW5hbF9saW5lCi0gICAgICBwcmludCAiICAgICB3aXRoOiAiLCBsaW5lCisgICAgICBwcmludCgiICByZXBsYWNlOiAiLCBvcmlnaW5hbF9saW5lKQorICAgICAgcHJpbnQoIiAgICAgd2l0aDogIiwgbGluZSkKICAgICBvdXRwdXQuYXBwZW5kKGxpbmUpCiAgIHJldHVybiAiXG4iLmpvaW4ob3V0cHV0KSArICJcbiIKIApAQCAtNDQ0LDEyICs0ODksMTIgQEAKICAgZXhjZXB0IEtleUVycm9yOgogICAgIHJhaXNlIGNvbW1vbi5FeHRlcm5hbEVycm9yKCJjYW4ndCByZWFkIE1FVEEvb3Rha2V5cy50eHQgZnJvbSBpbnB1dCIpCiAKLSAgZXh0cmFfcmVjb3Zlcnlfa2V5cyA9IG1pc2NfaW5mby5nZXQoImV4dHJhX3JlY292ZXJ5X2tleXMiLCBOb25lKQorICBleHRyYV9yZWNvdmVyeV9rZXlzID0gbWlzY19pbmZvLmdldCgiZXh0cmFfcmVjb3Zlcnlfa2V5cyIpCiAgIGlmIGV4dHJhX3JlY292ZXJ5X2tleXM6CiAgICAgZXh0cmFfcmVjb3Zlcnlfa2V5cyA9IFtPUFRJT05TLmtleV9tYXAuZ2V0KGssIGspICsgIi54NTA5LnBlbSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrIGluIGV4dHJhX3JlY292ZXJ5X2tleXMuc3BsaXQoKV0KICAgICBpZiBleHRyYV9yZWNvdmVyeV9rZXlzOgotICAgICAgcHJpbnQgImV4dHJhIHJlY292ZXJ5LW9ubHkga2V5KHMpOiAiICsgIiwgIi5qb2luKGV4dHJhX3JlY292ZXJ5X2tleXMpCisgICAgICBwcmludCgiZXh0cmEgcmVjb3Zlcnktb25seSBrZXkocyk6ICIgKyAiLCAiLmpvaW4oZXh0cmFfcmVjb3Zlcnlfa2V5cykpCiAgIGVsc2U6CiAgICAgZXh0cmFfcmVjb3Zlcnlfa2V5cyA9IFtdCiAKQEAgLTQ2MywxMyArNTA4LDE1IEBACiAgICAgbWFwcGVkX2tleXMuYXBwZW5kKE9QVElPTlMua2V5X21hcC5nZXQoaywgaykgKyAiLng1MDkucGVtIikKIAogICBpZiBtYXBwZWRfa2V5czoKLSAgICBwcmludCAidXNpbmc6XG4gICAiLCAiXG4gICAiLmpvaW4obWFwcGVkX2tleXMpCi0gICAgcHJpbnQgImZvciBPVEEgcGFja2FnZSB2ZXJpZmljYXRpb24iCisgICAgcHJpbnQoInVzaW5nOlxuICAgIiwgIlxuICAgIi5qb2luKG1hcHBlZF9rZXlzKSkKKyAgICBwcmludCgiZm9yIE9UQSBwYWNrYWdlIHZlcmlmaWNhdGlvbiIpCiAgIGVsc2U6CiAgICAgZGV2a2V5ID0gbWlzY19pbmZvLmdldCgiZGVmYXVsdF9zeXN0ZW1fZGV2X2NlcnRpZmljYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5IikKLSAgICBtYXBwZWRfa2V5cy5hcHBlbmQoCi0gICAgICAgIE9QVElPTlMua2V5X21hcC5nZXQoZGV2a2V5LCBkZXZrZXkpICsgIi54NTA5LnBlbSIpCisgICAgbWFwcGVkX2RldmtleSA9IE9QVElPTlMua2V5X21hcC5nZXQoZGV2a2V5LCBkZXZrZXkpCisgICAgaWYgbWFwcGVkX2RldmtleSAhPSBkZXZrZXk6CisgICAgICBtaXNjX2luZm9bImRlZmF1bHRfc3lzdGVtX2Rldl9jZXJ0aWZpY2F0ZSJdID0gbWFwcGVkX2RldmtleQorICAgIG1hcHBlZF9rZXlzLmFwcGVuZChtYXBwZWRfZGV2a2V5ICsgIi54NTA5LnBlbSIpCiAgICAgcHJpbnQoIk1FVEEvb3Rha2V5cy50eHQgaGFzIG5vIGtleXM7IHVzaW5nICVzIGZvciBPVEEgcGFja2FnZSIKICAgICAgICAgICAiIHZlcmlmaWNhdGlvbi4iICUgKG1hcHBlZF9rZXlzWzBdLCkpCiAKQEAgLTQ5Niw3ICs1NDMsMTEgQEAKICAgIyBwdXQgaW50byBhIHppcGZpbGUgc3lzdGVtL2V0Yy9zZWN1cml0eS9vdGFjZXJ0cy56aXAuCiAgICMgV2UgRE8gTk9UIGluY2x1ZGUgdGhlIGV4dHJhX3JlY292ZXJ5X2tleXMgKGlmIGFueSkgaGVyZS4KIAotICB0ZW1wX2ZpbGUgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICB0cnk6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCisgIHRlbXBfZmlsZSA9IFN0cmluZ0lPKCkKICAgY2VydHNfemlwID0gemlwZmlsZS5aaXBGaWxlKHRlbXBfZmlsZSwgInciKQogICBmb3IgayBpbiBtYXBwZWRfa2V5czoKICAgICBjb21tb24uWmlwV3JpdGUoY2VydHNfemlwLCBrKQpAQCAtNTEyLDExICs1NjMsOCBAQAogICAgICAgcHJpbnQoIlxuICBXQVJOSU5HOiBGb3VuZCBtb3JlIHRoYW4gb25lIE9UQSBrZXlzOyBVc2luZyB0aGUgZmlyc3Qgb25lIgogICAgICAgICAgICAgIiBhcyBwYXlsb2FkIHZlcmlmaWNhdGlvbiBrZXkuXG5cbiIpCiAKLSAgICBwcmludCAiVXNpbmcgJXMgZm9yIHBheWxvYWQgdmVyaWZpY2F0aW9uLiIgJSAobWFwcGVkX2tleXNbMF0sKQotICAgIGNtZCA9IGNvbW1vbi5SdW4oCi0gICAgICAgIFsib3BlbnNzbCIsICJ4NTA5IiwgIi1wdWJrZXkiLCAiLW5vb3V0IiwgIi1pbiIsIG1hcHBlZF9rZXlzWzBdXSwKLSAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICBwdWJrZXksIF8gPSBjbWQuY29tbXVuaWNhdGUoKQorICAgIHByaW50KCJVc2luZyAlcyBmb3IgcGF5bG9hZCB2ZXJpZmljYXRpb24uIiAlIChtYXBwZWRfa2V5c1swXSwpKQorICAgIHB1YmtleSA9IGNvbW1vbi5FeHRyYWN0UHVibGljS2V5KG1hcHBlZF9rZXlzWzBdKQogICAgIGNvbW1vbi5aaXBXcml0ZVN0cigKICAgICAgICAgb3V0cHV0X3RmX3ppcCwKICAgICAgICAgIlNZU1RFTS9ldGMvdXBkYXRlX2VuZ2luZS91cGRhdGUtcGF5bG9hZC1rZXkucHViLnBlbSIsCkBAIC01MjksNDEgKzU3Nyw2MiBAQAogICByZXR1cm4gbmV3X3JlY292ZXJ5X2tleXMKIAogCi1kZWYgUmVwbGFjZVZlcml0eVB1YmxpY0tleSh0YXJnZXRmaWxlX3ppcCwgZmlsZW5hbWUsIGtleV9wYXRoKToKLSAgcHJpbnQgIlJlcGxhY2luZyB2ZXJpdHkgcHVibGljIGtleSB3aXRoICVzIiAlIChrZXlfcGF0aCwpCi0gIGNvbW1vbi5aaXBXcml0ZSh0YXJnZXRmaWxlX3ppcCwga2V5X3BhdGgsIGFyY25hbWU9ZmlsZW5hbWUpCitkZWYgUmVwbGFjZVZlcml0eVB1YmxpY0tleShvdXRwdXRfemlwLCBmaWxlbmFtZSwga2V5X3BhdGgpOgorICAiIiJSZXBsYWNlcyB0aGUgdmVyaXR5IHB1YmxpYyBrZXkgYXQgdGhlIGdpdmVuIHBhdGggaW4gdGhlIGdpdmVuIHppcC4KKworICBBcmdzOgorICAgIG91dHB1dF96aXA6IFRoZSBvdXRwdXQgdGFyZ2V0X2ZpbGVzIHppcC4KKyAgICBmaWxlbmFtZTogVGhlIGFyY2hpdmUgbmFtZSBpbiB0aGUgb3V0cHV0IHppcC4KKyAgICBrZXlfcGF0aDogVGhlIHBhdGggdG8gdGhlIHB1YmxpYyBrZXkuCisgICIiIgorICBwcmludCgiUmVwbGFjaW5nIHZlcml0eSBwdWJsaWMga2V5IHdpdGggJXMiICUgKGtleV9wYXRoLCkpCisgIGNvbW1vbi5aaXBXcml0ZShvdXRwdXRfemlwLCBrZXlfcGF0aCwgYXJjbmFtZT1maWxlbmFtZSkKIAogCiBkZWYgUmVwbGFjZVZlcml0eVByaXZhdGVLZXkobWlzY19pbmZvLCBrZXlfcGF0aCk6Ci0gIHByaW50ICJSZXBsYWNpbmcgdmVyaXR5IHByaXZhdGUga2V5IHdpdGggJXMiICUgKGtleV9wYXRoLCkKKyAgIiIiUmVwbGFjZXMgdGhlIHZlcml0eSBwcml2YXRlIGtleSBpbiBtaXNjX2luZm8gZGljdC4KKworICBBcmdzOgorICAgIG1pc2NfaW5mbzogVGhlIGluZm8gZGljdC4KKyAgICBrZXlfcGF0aDogVGhlIHBhdGggdG8gdGhlIHByaXZhdGUga2V5IGluIFBLQ1MjOCBmb3JtYXQuCisgICIiIgorICBwcmludCgiUmVwbGFjaW5nIHZlcml0eSBwcml2YXRlIGtleSB3aXRoICVzIiAlIChrZXlfcGF0aCwpKQogICBtaXNjX2luZm9bInZlcml0eV9rZXkiXSA9IGtleV9wYXRoCiAKIAotZGVmIFJlcGxhY2VWZXJpdHlLZXlJZCh0YXJnZXRmaWxlX2lucHV0X3ppcCwgdGFyZ2V0ZmlsZV9vdXRwdXRfemlwLCBrZXlwYXRoKToKLSAgaW5fY21kbGluZSA9IHRhcmdldGZpbGVfaW5wdXRfemlwLnJlYWQoIkJPT1QvY21kbGluZSIpCi0gICMgY29weSBpbl9jbWRsaW5lIHRvIG91dHB1dF96aXAgaWYgdmVyaXR5a2V5aWQgaXMgbm90IHByZXNlbnQgaW4gaW5fY21kbGluZQotICBpZiAidmVyaXR5a2V5aWQiIG5vdCBpbiBpbl9jbWRsaW5lOgotICAgIGNvbW1vbi5aaXBXcml0ZVN0cih0YXJnZXRmaWxlX291dHB1dF96aXAsICJCT09UL2NtZGxpbmUiLCBpbl9jbWRsaW5lKQotICAgIHJldHVybiBpbl9jbWRsaW5lCi0gIG91dF9jbWRsaW5lID0gW10KLSAgZm9yIHBhcmFtIGluIGluX2NtZGxpbmUuc3BsaXQoKToKLSAgICBpZiAidmVyaXR5a2V5aWQiIGluIHBhcmFtOgotICAgICAgIyBleHRyYWN0IGtleWlkIHVzaW5nIG9wZW5zc2wgY29tbWFuZAotICAgICAgcCA9IGNvbW1vbi5SdW4oCi0gICAgICAgICAgWyJvcGVuc3NsIiwgIng1MDkiLCAiLWluIiwga2V5cGF0aCwgIi10ZXh0Il0sCi0gICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICAgIGtleWlkLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKLSAgICAgIGtleWlkID0gcmUuc2VhcmNoKAotICAgICAgICAgIHIna2V5aWQ6KFswLTlhLWZBLUY6XSopJywga2V5aWQpLmdyb3VwKDEpLnJlcGxhY2UoJzonLCAnJykubG93ZXIoKQotICAgICAgcHJpbnQgIlJlcGxhY2luZyB2ZXJpdHkga2V5aWQgd2l0aCAlcyBlcnJvcj0lcyIgJSAoa2V5aWQsIHN0ZGVycikKLSAgICAgIG91dF9jbWRsaW5lLmFwcGVuZCgidmVyaXR5a2V5aWQ9aWQ6JXMiICUgKGtleWlkLCkpCi0gICAgZWxzZToKLSAgICAgIG91dF9jbWRsaW5lLmFwcGVuZChwYXJhbSkKK2RlZiBSZXBsYWNlVmVyaXR5S2V5SWQoaW5wdXRfemlwLCBvdXRwdXRfemlwLCBrZXlfcGF0aCk6CisgICIiIlJlcGxhY2VzIHRoZSB2ZXJpdHlrZXlpZCBwYXJhbWV0ZXIgaW4gQk9PVC9jbWRsaW5lLgogCi0gIG91dF9jbWRsaW5lID0gJyAnLmpvaW4ob3V0X2NtZGxpbmUpCi0gIG91dF9jbWRsaW5lID0gb3V0X2NtZGxpbmUuc3RyaXAoKQotICBwcmludCAib3V0X2NtZGxpbmUgJXMiICUgKG91dF9jbWRsaW5lKQotICBjb21tb24uWmlwV3JpdGVTdHIodGFyZ2V0ZmlsZV9vdXRwdXRfemlwLCAiQk9PVC9jbWRsaW5lIiwgb3V0X2NtZGxpbmUpCisgIEFyZ3M6CisgICAgaW5wdXRfemlwOiBUaGUgaW5wdXQgdGFyZ2V0X2ZpbGVzIHppcCwgd2hpY2ggc2hvdWxkIGJlIGFscmVhZHkgb3Blbi4KKyAgICBvdXRwdXRfemlwOiBUaGUgb3V0cHV0IHRhcmdldF9maWxlcyB6aXAsIHdoaWNoIHNob3VsZCBiZSBhbHJlYWR5IG9wZW4gYW5kCisgICAgICAgIHdyaXRhYmxlLgorICAgIGtleV9wYXRoOiBUaGUgcGF0aCB0byB0aGUgUEVNIGVuY29kZWQgWC41MDkgY2VydGlmaWNhdGUuCisgICIiIgorICBpbl9jbWRsaW5lID0gaW5wdXRfemlwLnJlYWQoIkJPT1QvY21kbGluZSIpCisgICMgQ29weSBpbl9jbWRsaW5lIHRvIG91dHB1dF96aXAgaWYgdmVyaXR5a2V5aWQgaXMgbm90IHByZXNlbnQuCisgIGlmICJ2ZXJpdHlrZXlpZCIgbm90IGluIGluX2NtZGxpbmU6CisgICAgY29tbW9uLlppcFdyaXRlU3RyKG91dHB1dF96aXAsICJCT09UL2NtZGxpbmUiLCBpbl9jbWRsaW5lKQorICAgIHJldHVybgorCisgIG91dF9idWZmZXIgPSBbXQorICBmb3IgcGFyYW0gaW4gaW5fY21kbGluZS5zcGxpdCgpOgorICAgIGlmICJ2ZXJpdHlrZXlpZCIgbm90IGluIHBhcmFtOgorICAgICAgb3V0X2J1ZmZlci5hcHBlbmQocGFyYW0pCisgICAgICBjb250aW51ZQorCisgICAgIyBFeHRyYWN0IGtleWlkIHVzaW5nIG9wZW5zc2wgY29tbWFuZC4KKyAgICBwID0gY29tbW9uLlJ1bihbIm9wZW5zc2wiLCAieDUwOSIsICItaW4iLCBrZXlfcGF0aCwgIi10ZXh0Il0sCisgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICBrZXlpZCwgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgYXNzZXJ0IHAucmV0dXJuY29kZSA9PSAwLCAiRmFpbGVkIHRvIGR1bXAgY2VydGlmaWNhdGU6IHt9Ii5mb3JtYXQoc3RkZXJyKQorICAgIGtleWlkID0gcmUuc2VhcmNoKAorICAgICAgICByJ2tleWlkOihbMC05YS1mQS1GOl0qKScsIGtleWlkKS5ncm91cCgxKS5yZXBsYWNlKCc6JywgJycpLmxvd2VyKCkKKyAgICBwcmludCgiUmVwbGFjaW5nIHZlcml0eSBrZXlpZCB3aXRoIHt9Ii5mb3JtYXQoa2V5aWQpKQorICAgIG91dF9idWZmZXIuYXBwZW5kKCJ2ZXJpdHlrZXlpZD1pZDolcyIgJSAoa2V5aWQsKSkKKworICBvdXRfY21kbGluZSA9ICcgJy5qb2luKG91dF9idWZmZXIpLnN0cmlwKCkgKyAnXG4nCisgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCAiQk9PVC9jbWRsaW5lIiwgb3V0X2NtZGxpbmUpCiAKIAogZGVmIFJlcGxhY2VNaXNjSW5mb1R4dChpbnB1dF96aXAsIG91dHB1dF96aXAsIG1pc2NfaW5mbyk6CkBAIC01ODUsMTEgKzY1NCwxMiBAQAogICAiIiJSZXBsYWNlcyB0aGUgQVZCIHNpZ25pbmcga2V5cy4iIiIKIAogICBBVkJfRk9PVEVSX0FSR1NfQllfUEFSVElUSU9OID0gewotICAgICdib290JyA6ICdhdmJfYm9vdF9hZGRfaGFzaF9mb290ZXJfYXJncycsCi0gICAgJ2R0Ym8nIDogJ2F2Yl9kdGJvX2FkZF9oYXNoX2Zvb3Rlcl9hcmdzJywKLSAgICAnc3lzdGVtJyA6ICdhdmJfc3lzdGVtX2FkZF9oYXNodHJlZV9mb290ZXJfYXJncycsCi0gICAgJ3ZlbmRvcicgOiAnYXZiX3ZlbmRvcl9hZGRfaGFzaHRyZWVfZm9vdGVyX2FyZ3MnLAotICAgICd2Ym1ldGEnIDogJ2F2Yl92Ym1ldGFfYXJncycsCisgICAgICAnYm9vdCcgOiAnYXZiX2Jvb3RfYWRkX2hhc2hfZm9vdGVyX2FyZ3MnLAorICAgICAgJ2R0Ym8nIDogJ2F2Yl9kdGJvX2FkZF9oYXNoX2Zvb3Rlcl9hcmdzJywKKyAgICAgICdyZWNvdmVyeScgOiAnYXZiX3JlY292ZXJ5X2FkZF9oYXNoX2Zvb3Rlcl9hcmdzJywKKyAgICAgICdzeXN0ZW0nIDogJ2F2Yl9zeXN0ZW1fYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzJywKKyAgICAgICd2ZW5kb3InIDogJ2F2Yl92ZW5kb3JfYWRkX2hhc2h0cmVlX2Zvb3Rlcl9hcmdzJywKKyAgICAgICd2Ym1ldGEnIDogJ2F2Yl92Ym1ldGFfYXJncycsCiAgIH0KIAogICBkZWYgUmVwbGFjZUF2YlBhcnRpdGlvblNpZ25pbmdLZXkocGFydGl0aW9uKToKQEAgLTYwMCwxNSArNjcwLDE1IEBACiAgICAgYWxnb3JpdGhtID0gT1BUSU9OUy5hdmJfYWxnb3JpdGhtcy5nZXQocGFydGl0aW9uKQogICAgIGFzc2VydCBhbGdvcml0aG0sICdNaXNzaW5nIEFWQiBzaWduaW5nIGFsZ29yaXRobSBmb3IgJXMnICUgKHBhcnRpdGlvbiwpCiAKLSAgICBwcmludCAnUmVwbGFjaW5nIEFWQiBzaWduaW5nIGtleSBmb3IgJXMgd2l0aCAiJXMiICglcyknICUgKAotICAgICAgICBwYXJ0aXRpb24sIGtleSwgYWxnb3JpdGhtKQorICAgIHByaW50KCdSZXBsYWNpbmcgQVZCIHNpZ25pbmcga2V5IGZvciAlcyB3aXRoICIlcyIgKCVzKScgJSAoCisgICAgICAgIHBhcnRpdGlvbiwga2V5LCBhbGdvcml0aG0pKQogICAgIG1pc2NfaW5mb1snYXZiXycgKyBwYXJ0aXRpb24gKyAnX2FsZ29yaXRobSddID0gYWxnb3JpdGhtCiAgICAgbWlzY19pbmZvWydhdmJfJyArIHBhcnRpdGlvbiArICdfa2V5X3BhdGgnXSA9IGtleQogCiAgICAgZXh0cmFfYXJncyA9IE9QVElPTlMuYXZiX2V4dHJhX2FyZ3MuZ2V0KHBhcnRpdGlvbikKICAgICBpZiBleHRyYV9hcmdzOgotICAgICAgcHJpbnQgJ1NldHRpbmcgZXh0cmEgQVZCIHNpZ25pbmcgYXJncyBmb3IgJXMgdG8gIiVzIicgJSAoCi0gICAgICAgICAgcGFydGl0aW9uLCBleHRyYV9hcmdzKQorICAgICAgcHJpbnQoJ1NldHRpbmcgZXh0cmEgQVZCIHNpZ25pbmcgYXJncyBmb3IgJXMgdG8gIiVzIicgJSAoCisgICAgICAgICAgcGFydGl0aW9uLCBleHRyYV9hcmdzKSkKICAgICAgIGFyZ3Nfa2V5ID0gQVZCX0ZPT1RFUl9BUkdTX0JZX1BBUlRJVElPTltwYXJ0aXRpb25dCiAgICAgICBtaXNjX2luZm9bYXJnc19rZXldID0gKG1pc2NfaW5mby5nZXQoYXJnc19rZXksICcnKSArICcgJyArIGV4dHJhX2FyZ3MpCiAKQEAgLTc1MSwyOSArODIxLDI5IEBACiAgICAgICBhcmd2LCBfX2RvY19fLAogICAgICAgZXh0cmFfb3B0cz0iZTpkOms6b3Q6IiwKICAgICAgIGV4dHJhX2xvbmdfb3B0cz1bCi0gICAgICAgICJleHRyYV9hcGtzPSIsCi0gICAgICAgICJkZWZhdWx0X2tleV9tYXBwaW5ncz0iLAotICAgICAgICAia2V5X21hcHBpbmc9IiwKLSAgICAgICAgInJlcGxhY2Vfb3RhX2tleXMiLAotICAgICAgICAidGFnX2NoYW5nZXM9IiwKLSAgICAgICAgInJlcGxhY2VfdmVyaXR5X3B1YmxpY19rZXk9IiwKLSAgICAgICAgInJlcGxhY2VfdmVyaXR5X3ByaXZhdGVfa2V5PSIsCi0gICAgICAgICJyZXBsYWNlX3Zlcml0eV9rZXlpZD0iLAotICAgICAgICAiYXZiX3ZibWV0YV9hbGdvcml0aG09IiwKLSAgICAgICAgImF2Yl92Ym1ldGFfa2V5PSIsCi0gICAgICAgICJhdmJfdmJtZXRhX2V4dHJhX2FyZ3M9IiwKLSAgICAgICAgImF2Yl9ib290X2FsZ29yaXRobT0iLAotICAgICAgICAiYXZiX2Jvb3Rfa2V5PSIsCi0gICAgICAgICJhdmJfYm9vdF9leHRyYV9hcmdzPSIsCi0gICAgICAgICJhdmJfZHRib19hbGdvcml0aG09IiwKLSAgICAgICAgImF2Yl9kdGJvX2tleT0iLAotICAgICAgICAiYXZiX2R0Ym9fZXh0cmFfYXJncz0iLAotICAgICAgICAiYXZiX3N5c3RlbV9hbGdvcml0aG09IiwKLSAgICAgICAgImF2Yl9zeXN0ZW1fa2V5PSIsCi0gICAgICAgICJhdmJfc3lzdGVtX2V4dHJhX2FyZ3M9IiwKLSAgICAgICAgImF2Yl92ZW5kb3JfYWxnb3JpdGhtPSIsCi0gICAgICAgICJhdmJfdmVuZG9yX2tleT0iLAotICAgICAgICAiYXZiX3ZlbmRvcl9leHRyYV9hcmdzPSIsCisgICAgICAgICAgImV4dHJhX2Fwa3M9IiwKKyAgICAgICAgICAiZGVmYXVsdF9rZXlfbWFwcGluZ3M9IiwKKyAgICAgICAgICAia2V5X21hcHBpbmc9IiwKKyAgICAgICAgICAicmVwbGFjZV9vdGFfa2V5cyIsCisgICAgICAgICAgInRhZ19jaGFuZ2VzPSIsCisgICAgICAgICAgInJlcGxhY2VfdmVyaXR5X3B1YmxpY19rZXk9IiwKKyAgICAgICAgICAicmVwbGFjZV92ZXJpdHlfcHJpdmF0ZV9rZXk9IiwKKyAgICAgICAgICAicmVwbGFjZV92ZXJpdHlfa2V5aWQ9IiwKKyAgICAgICAgICAiYXZiX3ZibWV0YV9hbGdvcml0aG09IiwKKyAgICAgICAgICAiYXZiX3ZibWV0YV9rZXk9IiwKKyAgICAgICAgICAiYXZiX3ZibWV0YV9leHRyYV9hcmdzPSIsCisgICAgICAgICAgImF2Yl9ib290X2FsZ29yaXRobT0iLAorICAgICAgICAgICJhdmJfYm9vdF9rZXk9IiwKKyAgICAgICAgICAiYXZiX2Jvb3RfZXh0cmFfYXJncz0iLAorICAgICAgICAgICJhdmJfZHRib19hbGdvcml0aG09IiwKKyAgICAgICAgICAiYXZiX2R0Ym9fa2V5PSIsCisgICAgICAgICAgImF2Yl9kdGJvX2V4dHJhX2FyZ3M9IiwKKyAgICAgICAgICAiYXZiX3N5c3RlbV9hbGdvcml0aG09IiwKKyAgICAgICAgICAiYXZiX3N5c3RlbV9rZXk9IiwKKyAgICAgICAgICAiYXZiX3N5c3RlbV9leHRyYV9hcmdzPSIsCisgICAgICAgICAgImF2Yl92ZW5kb3JfYWxnb3JpdGhtPSIsCisgICAgICAgICAgImF2Yl92ZW5kb3Jfa2V5PSIsCisgICAgICAgICAgImF2Yl92ZW5kb3JfZXh0cmFfYXJncz0iLAogICAgICAgXSwKICAgICAgIGV4dHJhX29wdGlvbl9oYW5kbGVyPW9wdGlvbl9oYW5kbGVyKQogCkBAIC04MTYsMTYgKzg4NiwxNCBAQAogICBuZXdfYXJncy5hcHBlbmQoYXJnc1sxXSkKICAgYWRkX2ltZ190b190YXJnZXRfZmlsZXMubWFpbihuZXdfYXJncykKIAotICBwcmludCAiZG9uZS4iCisgIHByaW50KCJkb25lLiIpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgdHJ5OgogICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQotICBleGNlcHQgY29tbW9uLkV4dGVybmFsRXJyb3IsIGU6Ci0gICAgcHJpbnQKLSAgICBwcmludCAiICAgRVJST1I6ICVzIiAlIChlLCkKLSAgICBwcmludAorICBleGNlcHQgY29tbW9uLkV4dGVybmFsRXJyb3IgYXMgZToKKyAgICBwcmludCgiXG4gICBFUlJPUjogJXNcbiIgJSAoZSwpKQogICAgIHN5cy5leGl0KDEpCiAgIGZpbmFsbHk6CiAgICAgY29tbW9uLkNsZWFudXAoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3NwYXJzZV9pbWcucHkgYi90b29scy9yZWxlYXNldG9vbHMvc3BhcnNlX2ltZy5weQppbmRleCA3ZWI2MGQ5Li4wODNkYTdhIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvc3BhcnNlX2ltZy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvc3BhcnNlX2ltZy5weQpAQCAtMTUsNiArMTUsNyBAQAogaW1wb3J0IGJpc2VjdAogaW1wb3J0IG9zCiBpbXBvcnQgc3RydWN0CitpbXBvcnQgdGhyZWFkaW5nCiBmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEKIAogaW1wb3J0IHJhbmdlbGliCkBAIC0zMiw3ICszMyw3IEBACiAgICIiIgogCiAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaW1nX2ZuLCBmaWxlX21hcF9mbj1Ob25lLCBjbG9iYmVyZWRfYmxvY2tzPU5vbmUsCi0gICAgICAgICAgICAgICBtb2RlPSJyYiIsIGJ1aWxkX21hcD1UcnVlKToKKyAgICAgICAgICAgICAgIG1vZGU9InJiIiwgYnVpbGRfbWFwPVRydWUsIGFsbG93X3NoYXJlZF9ibG9ja3M9RmFsc2UpOgogICAgIHNlbGYuc2ltZ19mID0gZiA9IG9wZW4oc2ltZ19mbiwgbW9kZSkKIAogICAgIGhlYWRlcl9iaW4gPSBmLnJlYWQoMjgpCkBAIC0xMTEsNiArMTEyLDggQEAKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biBjaHVuayB0eXBlIDB4JTA0WCBub3Qgc3VwcG9ydGVkIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNodW5rX3R5cGUsKSkKIAorICAgIHNlbGYuZ2VuZXJhdG9yX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisKICAgICBzZWxmLmNhcmVfbWFwID0gcmFuZ2VsaWIuUmFuZ2VTZXQoY2FyZV9kYXRhKQogICAgIHNlbGYub2Zmc2V0X2luZGV4ID0gW2lbMF0gZm9yIGkgaW4gb2Zmc2V0X21hcF0KIApAQCAtMTI2LDcgKzEyOSw4IEBACiAgICAgc2VsZi5leHRlbmRlZCA9IGV4dGVuZGVkCiAKICAgICBpZiBmaWxlX21hcF9mbjoKLSAgICAgIHNlbGYuTG9hZEZpbGVCbG9ja01hcChmaWxlX21hcF9mbiwgc2VsZi5jbG9iYmVyZWRfYmxvY2tzKQorICAgICAgc2VsZi5Mb2FkRmlsZUJsb2NrTWFwKGZpbGVfbWFwX2ZuLCBzZWxmLmNsb2JiZXJlZF9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfc2hhcmVkX2Jsb2NrcykKICAgICBlbHNlOgogICAgICAgc2VsZi5maWxlX21hcCA9IHsiX19EQVRBIjogc2VsZi5jYXJlX21hcH0KIApAQCAtMTczLDQwICsxNzcsNDcgQEAKICAgICBwYXJ0aWN1bGFyIGlzIG5vdCBuZWNlc3NhcmlseSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHJhbmdlcyBpbgogICAgICdyYW5nZXMnLgogCi0gICAgVGhpcyBnZW5lcmF0b3IgaXMgc3RhdGVmdWwgLS0gaXQgZGVwZW5kcyBvbiB0aGUgb3BlbiBmaWxlIG9iamVjdAotICAgIGNvbnRhaW5lZCBpbiB0aGlzIFNwYXJzZUltYWdlLCBzbyB5b3Ugc2hvdWxkIG5vdCB0cnkgdG8gcnVuIHR3bworICAgIFVzZSBhIGxvY2sgdG8gcHJvdGVjdCB0aGUgZ2VuZXJhdG9yIHNvIHRoYXQgd2Ugd2lsbCBub3QgcnVuIHR3bwogICAgIGluc3RhbmNlcyBvZiB0aGlzIGdlbmVyYXRvciBvbiB0aGUgc2FtZSBvYmplY3Qgc2ltdWx0YW5lb3VzbHkuIiIiCiAKICAgICBmID0gc2VsZi5zaW1nX2YKLSAgICBmb3IgcywgZSBpbiByYW5nZXM6Ci0gICAgICB0b19yZWFkID0gZS1zCi0gICAgICBpZHggPSBiaXNlY3QuYmlzZWN0X3JpZ2h0KHNlbGYub2Zmc2V0X2luZGV4LCBzKSAtIDEKLSAgICAgIGNodW5rX3N0YXJ0LCBjaHVua19sZW4sIGZpbGVwb3MsIGZpbGxfZGF0YSA9IHNlbGYub2Zmc2V0X21hcFtpZHhdCi0KLSAgICAgICMgZm9yIHRoZSBmaXJzdCBjaHVuayB3ZSBtYXkgYmUgc3RhcnRpbmcgcGFydHdheSB0aHJvdWdoIGl0LgotICAgICAgcmVtYWluID0gY2h1bmtfbGVuIC0gKHMgLSBjaHVua19zdGFydCkKLSAgICAgIHRoaXNfcmVhZCA9IG1pbihyZW1haW4sIHRvX3JlYWQpCi0gICAgICBpZiBmaWxlcG9zIGlzIG5vdCBOb25lOgotICAgICAgICBwID0gZmlsZXBvcyArICgocyAtIGNodW5rX3N0YXJ0KSAqIHNlbGYuYmxvY2tzaXplKQotICAgICAgICBmLnNlZWsocCwgb3MuU0VFS19TRVQpCi0gICAgICAgIHlpZWxkIGYucmVhZCh0aGlzX3JlYWQgKiBzZWxmLmJsb2Nrc2l6ZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHlpZWxkIGZpbGxfZGF0YSAqICh0aGlzX3JlYWQgKiAoc2VsZi5ibG9ja3NpemUgPj4gMikpCi0gICAgICB0b19yZWFkIC09IHRoaXNfcmVhZAotCi0gICAgICB3aGlsZSB0b19yZWFkID4gMDoKLSAgICAgICAgIyBjb250aW51ZSB3aXRoIGZvbGxvd2luZyBjaHVua3MgaWYgdGhpcyByYW5nZSBzcGFucyBtdWx0aXBsZSBjaHVua3MuCi0gICAgICAgIGlkeCArPSAxCisgICAgd2l0aCBzZWxmLmdlbmVyYXRvcl9sb2NrOgorICAgICAgZm9yIHMsIGUgaW4gcmFuZ2VzOgorICAgICAgICB0b19yZWFkID0gZS1zCisgICAgICAgIGlkeCA9IGJpc2VjdC5iaXNlY3RfcmlnaHQoc2VsZi5vZmZzZXRfaW5kZXgsIHMpIC0gMQogICAgICAgICBjaHVua19zdGFydCwgY2h1bmtfbGVuLCBmaWxlcG9zLCBmaWxsX2RhdGEgPSBzZWxmLm9mZnNldF9tYXBbaWR4XQotICAgICAgICB0aGlzX3JlYWQgPSBtaW4oY2h1bmtfbGVuLCB0b19yZWFkKQorCisgICAgICAgICMgZm9yIHRoZSBmaXJzdCBjaHVuayB3ZSBtYXkgYmUgc3RhcnRpbmcgcGFydHdheSB0aHJvdWdoIGl0LgorICAgICAgICByZW1haW4gPSBjaHVua19sZW4gLSAocyAtIGNodW5rX3N0YXJ0KQorICAgICAgICB0aGlzX3JlYWQgPSBtaW4ocmVtYWluLCB0b19yZWFkKQogICAgICAgICBpZiBmaWxlcG9zIGlzIG5vdCBOb25lOgotICAgICAgICAgIGYuc2VlayhmaWxlcG9zLCBvcy5TRUVLX1NFVCkKKyAgICAgICAgICBwID0gZmlsZXBvcyArICgocyAtIGNodW5rX3N0YXJ0KSAqIHNlbGYuYmxvY2tzaXplKQorICAgICAgICAgIGYuc2VlayhwLCBvcy5TRUVLX1NFVCkKICAgICAgICAgICB5aWVsZCBmLnJlYWQodGhpc19yZWFkICogc2VsZi5ibG9ja3NpemUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgeWllbGQgZmlsbF9kYXRhICogKHRoaXNfcmVhZCAqIChzZWxmLmJsb2Nrc2l6ZSA+PiAyKSkKICAgICAgICAgdG9fcmVhZCAtPSB0aGlzX3JlYWQKIAotICBkZWYgTG9hZEZpbGVCbG9ja01hcChzZWxmLCBmbiwgY2xvYmJlcmVkX2Jsb2Nrcyk6CisgICAgICAgIHdoaWxlIHRvX3JlYWQgPiAwOgorICAgICAgICAgICMgY29udGludWUgd2l0aCBmb2xsb3dpbmcgY2h1bmtzIGlmIHRoaXMgcmFuZ2Ugc3BhbnMgbXVsdGlwbGUgY2h1bmtzLgorICAgICAgICAgIGlkeCArPSAxCisgICAgICAgICAgY2h1bmtfc3RhcnQsIGNodW5rX2xlbiwgZmlsZXBvcywgZmlsbF9kYXRhID0gc2VsZi5vZmZzZXRfbWFwW2lkeF0KKyAgICAgICAgICB0aGlzX3JlYWQgPSBtaW4oY2h1bmtfbGVuLCB0b19yZWFkKQorICAgICAgICAgIGlmIGZpbGVwb3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmLnNlZWsoZmlsZXBvcywgb3MuU0VFS19TRVQpCisgICAgICAgICAgICB5aWVsZCBmLnJlYWQodGhpc19yZWFkICogc2VsZi5ibG9ja3NpemUpCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHlpZWxkIGZpbGxfZGF0YSAqICh0aGlzX3JlYWQgKiAoc2VsZi5ibG9ja3NpemUgPj4gMikpCisgICAgICAgICAgdG9fcmVhZCAtPSB0aGlzX3JlYWQKKworICBkZWYgTG9hZEZpbGVCbG9ja01hcChzZWxmLCBmbiwgY2xvYmJlcmVkX2Jsb2NrcywgYWxsb3dfc2hhcmVkX2Jsb2Nrcyk6CisgICAgIiIiTG9hZHMgdGhlIGdpdmVuIGJsb2NrIG1hcCBmaWxlLgorCisgICAgQXJnczoKKyAgICAgIGZuOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGJsb2NrIG1hcCBmaWxlLgorICAgICAgY2xvYmJlcmVkX2Jsb2NrczogQSBSYW5nZVNldCBpbnN0YW5jZSBmb3IgdGhlIGNsb2JiZXJlZCBibG9ja3MuCisgICAgICBhbGxvd19zaGFyZWRfYmxvY2tzOiBXaGV0aGVyIGhhdmluZyBzaGFyZWQgYmxvY2tzIGlzIGFsbG93ZWQuCisgICAgIiIiCiAgICAgcmVtYWluaW5nID0gc2VsZi5jYXJlX21hcAogICAgIHNlbGYuZmlsZV9tYXAgPSBvdXQgPSB7fQogCkBAIC0yMTQsNiArMjI1LDE4IEBACiAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICBmbiwgcmFuZ2VzID0gbGluZS5zcGxpdChOb25lLCAxKQogICAgICAgICByYW5nZXMgPSByYW5nZWxpYi5SYW5nZVNldC5wYXJzZShyYW5nZXMpCisKKyAgICAgICAgaWYgYWxsb3dfc2hhcmVkX2Jsb2NrczoKKyAgICAgICAgICAjIEZpbmQgdGhlIHNoYXJlZCBibG9ja3MgdGhhdCBoYXZlIGJlZW4gY2xhaW1lZCBieSBvdGhlcnMuCisgICAgICAgICAgc2hhcmVkX2Jsb2NrcyA9IHJhbmdlcy5zdWJ0cmFjdChyZW1haW5pbmcpCisgICAgICAgICAgaWYgc2hhcmVkX2Jsb2NrczoKKyAgICAgICAgICAgIHJhbmdlcyA9IHJhbmdlcy5zdWJ0cmFjdChzaGFyZWRfYmxvY2tzKQorICAgICAgICAgICAgaWYgbm90IHJhbmdlczoKKyAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBUYWcgdGhlIGVudHJ5IHNvIHRoYXQgd2UgY2FuIHNraXAgYXBwbHlpbmcgaW1nZGlmZiBvbiB0aGlzIGZpbGUuCisgICAgICAgICAgICByYW5nZXMuZXh0cmFbJ3VzZXNfc2hhcmVkX2Jsb2NrcyddID0gVHJ1ZQorCiAgICAgICAgIG91dFtmbl0gPSByYW5nZXMKICAgICAgICAgYXNzZXJ0IHJhbmdlcy5zaXplKCkgPT0gcmFuZ2VzLmludGVyc2VjdChyZW1haW5pbmcpLnNpemUoKQogCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMGY3OGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weQpAQCAtMCwwICsxLDMzOSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgemlwZmlsZQorCitpbXBvcnQgY29tbW9uCitpbXBvcnQgdGVzdF91dGlscworZnJvbSBhZGRfaW1nX3RvX3RhcmdldF9maWxlcyBpbXBvcnQgKAorICAgIEFkZENhcmVNYXBUeHRGb3JBYk90YSwgQWRkUGFja1JhZGlvSW1hZ2VzLCBBZGRSYWRpb0ltYWdlc0ZvckFiT3RhLAorICAgIEdldENhcmVNYXApCitmcm9tIHJhbmdlbGliIGltcG9ydCBSYW5nZVNldAorCisKK09QVElPTlMgPSBjb21tb24uT1BUSU9OUworCisKK2NsYXNzIEFkZEltYWdlc1RvVGFyZ2V0RmlsZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgT1BUSU9OUy5pbnB1dF90bXAgPSBjb21tb24uTWFrZVRlbXBEaXIoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBjb21tb24uQ2xlYW51cCgpCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgX2NyZWF0ZV9pbWFnZXMoaW1hZ2VzLCBwcmVmaXgpOgorICAgICIiIkNyZWF0ZXMgaW1hZ2VzIHVuZGVyIE9QVElPTlMuaW5wdXRfdG1wL3ByZWZpeC4iIiIKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCBwcmVmaXgpCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgb3MubWtkaXIocGF0aCkKKworICAgIGZvciBpbWFnZSBpbiBpbWFnZXM6CisgICAgICBpbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGltYWdlICsgJy5pbWcnKQorICAgICAgd2l0aCBvcGVuKGltYWdlX3BhdGgsICd3YicpIGFzIGltYWdlX2ZwOgorICAgICAgICBpbWFnZV9mcC53cml0ZShpbWFnZS5lbmNvZGUoKSkKKworICAgIGltYWdlc19wYXRoID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAnSU1BR0VTJykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW1hZ2VzX3BhdGgpOgorICAgICAgb3MubWtkaXIoaW1hZ2VzX3BhdGgpCisgICAgcmV0dXJuIGltYWdlcywgaW1hZ2VzX3BhdGgKKworICBkZWYgdGVzdF9BZGRSYWRpb0ltYWdlc0ZvckFiT3RhX2ltYWdlRXhpc3RzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHdpdGggZXhpc3RpbmcgaW1hZ2VzIHVuZGVyIElNQUdFUy8uIiIiCisgICAgaW1hZ2VzLCBpbWFnZXNfcGF0aCA9IHNlbGYuX2NyZWF0ZV9pbWFnZXMoWydhYm9vdCcsICd4YmwnXSwgJ0lNQUdFUycpCisgICAgQWRkUmFkaW9JbWFnZXNGb3JBYk90YShOb25lLCBpbWFnZXMpCisKKyAgICBmb3IgaW1hZ2UgaW4gaW1hZ2VzOgorICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbWFnZXNfcGF0aCwgaW1hZ2UgKyAnLmltZycpKSkKKworICBkZWYgdGVzdF9BZGRSYWRpb0ltYWdlc0ZvckFiT3RhX2NvcHlGcm9tUmFkaW8oc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2UgdGhhdCBjb3BpZXMgaW1hZ2VzIGZyb20gUkFESU8vLiIiIgorICAgIGltYWdlcywgaW1hZ2VzX3BhdGggPSBzZWxmLl9jcmVhdGVfaW1hZ2VzKFsnYWJvb3QnLCAneGJsJ10sICdSQURJTycpCisgICAgQWRkUmFkaW9JbWFnZXNGb3JBYk90YShOb25lLCBpbWFnZXMpCisKKyAgICBmb3IgaW1hZ2UgaW4gaW1hZ2VzOgorICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbWFnZXNfcGF0aCwgaW1hZ2UgKyAnLmltZycpKSkKKworICBkZWYgdGVzdF9BZGRSYWRpb0ltYWdlc0ZvckFiT3RhX2NvcHlGcm9tUmFkaW9femlwT3V0cHV0KHNlbGYpOgorICAgIGltYWdlcywgXyA9IHNlbGYuX2NyZWF0ZV9pbWFnZXMoWydhYm9vdCcsICd4YmwnXSwgJ1JBRElPJykKKworICAgICMgU2V0IHVwIHRoZSBvdXRwdXQgemlwLgorICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBBZGRSYWRpb0ltYWdlc0ZvckFiT3RhKG91dHB1dF96aXAsIGltYWdlcykKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAncicpIGFzIHZlcmlmeV96aXA6CisgICAgICBmb3IgaW1hZ2UgaW4gaW1hZ2VzOgorICAgICAgICBzZWxmLmFzc2VydEluKCdJTUFHRVMvJyArIGltYWdlICsgJy5pbWcnLCB2ZXJpZnlfemlwLm5hbWVsaXN0KCkpCisKKyAgZGVmIHRlc3RfQWRkUmFkaW9JbWFnZXNGb3JBYk90YV9jb3B5RnJvbVZlbmRvckltYWdlcyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSB0aGF0IGNvcGllcyBpbWFnZXMgZnJvbSBWRU5ET1JfSU1BR0VTLy4iIiIKKyAgICB2ZW5kb3JfaW1hZ2VzX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICdWRU5ET1JfSU1BR0VTJykKKyAgICBvcy5ta2Rpcih2ZW5kb3JfaW1hZ2VzX3BhdGgpCisKKyAgICBwYXJ0aXRpb25zID0gWydhYm9vdCcsICd4YmwnXQorICAgIGZvciBpbmRleCwgcGFydGl0aW9uIGluIGVudW1lcmF0ZShwYXJ0aXRpb25zKToKKyAgICAgIHN1YmRpciA9IG9zLnBhdGguam9pbih2ZW5kb3JfaW1hZ2VzX3BhdGgsICdzdWJkaXIte30nLmZvcm1hdChpbmRleCkpCisgICAgICBvcy5ta2RpcihzdWJkaXIpCisKKyAgICAgIHBhcnRpdGlvbl9pbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKHN1YmRpciwgcGFydGl0aW9uICsgJy5pbWcnKQorICAgICAgd2l0aCBvcGVuKHBhcnRpdGlvbl9pbWFnZV9wYXRoLCAnd2InKSBhcyBwYXJ0aXRpb25fZnA6CisgICAgICAgIHBhcnRpdGlvbl9mcC53cml0ZShwYXJ0aXRpb24uZW5jb2RlKCkpCisKKyAgICAjIFNldCB1cCB0aGUgb3V0cHV0IGRpci4KKyAgICBpbWFnZXNfcGF0aCA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgJ0lNQUdFUycpCisgICAgb3MubWtkaXIoaW1hZ2VzX3BhdGgpCisKKyAgICBBZGRSYWRpb0ltYWdlc0ZvckFiT3RhKE5vbmUsIHBhcnRpdGlvbnMpCisKKyAgICBmb3IgcGFydGl0aW9uIGluIHBhcnRpdGlvbnM6CisgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGltYWdlc19wYXRoLCBwYXJ0aXRpb24gKyAnLmltZycpKSkKKworICBkZWYgdGVzdF9BZGRSYWRpb0ltYWdlc0ZvckFiT3RhX21pc3NpbmdJbWFnZXMoc2VsZik6CisgICAgaW1hZ2VzLCBfID0gc2VsZi5fY3JlYXRlX2ltYWdlcyhbJ2Fib290JywgJ3hibCddLCAnUkFESU8nKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBBZGRSYWRpb0ltYWdlc0ZvckFiT3RhLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgIGltYWdlcyArIFsnYmF6J10pCisKKyAgZGVmIHRlc3RfQWRkUmFkaW9JbWFnZXNGb3JBYk90YV9taXNzaW5nSW1hZ2VzX3ppcE91dHB1dChzZWxmKToKKyAgICBpbWFnZXMsIF8gPSBzZWxmLl9jcmVhdGVfaW1hZ2VzKFsnYWJvb3QnLCAneGJsJ10sICdSQURJTycpCisKKyAgICAjIFNldCB1cCB0aGUgb3V0cHV0IHppcC4KKyAgICBvdXRwdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSwgJ3cnKSBhcyBvdXRwdXRfemlwOgorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIEFkZFJhZGlvSW1hZ2VzRm9yQWJPdGEsIG91dHB1dF96aXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMgKyBbJ2JheiddKQorCisgIGRlZiB0ZXN0X0FkZFBhY2tSYWRpb0ltYWdlcyhzZWxmKToKKyAgICBpbWFnZXMsIGltYWdlc19wYXRoID0gc2VsZi5fY3JlYXRlX2ltYWdlcyhbJ2ZvbycsICdiYXInXSwgJ1JBRElPJykKKyAgICBBZGRQYWNrUmFkaW9JbWFnZXMoTm9uZSwgaW1hZ2VzKQorCisgICAgZm9yIGltYWdlIGluIGltYWdlczoKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW1hZ2VzX3BhdGgsIGltYWdlICsgJy5pbWcnKSkpCisKKyAgZGVmIHRlc3RfQWRkUGFja1JhZGlvSW1hZ2VzX3dpdGhfc3VmZml4KHNlbGYpOgorICAgIGltYWdlcywgaW1hZ2VzX3BhdGggPSBzZWxmLl9jcmVhdGVfaW1hZ2VzKFsnZm9vJywgJ2JhciddLCAnUkFESU8nKQorICAgIGltYWdlc193aXRoX3N1ZmZpeCA9IFtpbWFnZSArICcuaW1nJyBmb3IgaW1hZ2UgaW4gaW1hZ2VzXQorICAgIEFkZFBhY2tSYWRpb0ltYWdlcyhOb25lLCBpbWFnZXNfd2l0aF9zdWZmaXgpCisKKyAgICBmb3IgaW1hZ2UgaW4gaW1hZ2VzOgorICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbWFnZXNfcGF0aCwgaW1hZ2UgKyAnLmltZycpKSkKKworICBkZWYgdGVzdF9BZGRQYWNrUmFkaW9JbWFnZXNfemlwT3V0cHV0KHNlbGYpOgorICAgIGltYWdlcywgXyA9IHNlbGYuX2NyZWF0ZV9pbWFnZXMoWydmb28nLCAnYmFyJ10sICdSQURJTycpCisKKyAgICAjIFNldCB1cCB0aGUgb3V0cHV0IHppcC4KKyAgICBvdXRwdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSwgJ3cnKSBhcyBvdXRwdXRfemlwOgorICAgICAgQWRkUGFja1JhZGlvSW1hZ2VzKG91dHB1dF96aXAsIGltYWdlcykKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAncicpIGFzIHZlcmlmeV96aXA6CisgICAgICBmb3IgaW1hZ2UgaW4gaW1hZ2VzOgorICAgICAgICBzZWxmLmFzc2VydEluKCdJTUFHRVMvJyArIGltYWdlICsgJy5pbWcnLCB2ZXJpZnlfemlwLm5hbWVsaXN0KCkpCisKKyAgZGVmIHRlc3RfQWRkUGFja1JhZGlvSW1hZ2VzX2ltYWdlRXhpc3RzKHNlbGYpOgorICAgIGltYWdlcywgaW1hZ2VzX3BhdGggPSBzZWxmLl9jcmVhdGVfaW1hZ2VzKFsnZm9vJywgJ2JhciddLCAnUkFESU8nKQorCisgICAgIyBBZGRpdGlvbmFsbHkgY3JlYXRlIGltYWdlcyB1bmRlciBJTUFHRVMvIHNvIHRoYXQgdGhleSBzaG91bGQgYmUgc2tpcHBlZC4KKyAgICBpbWFnZXMsIGltYWdlc19wYXRoID0gc2VsZi5fY3JlYXRlX2ltYWdlcyhbJ2ZvbycsICdiYXInXSwgJ0lNQUdFUycpCisKKyAgICBBZGRQYWNrUmFkaW9JbWFnZXMoTm9uZSwgaW1hZ2VzKQorCisgICAgZm9yIGltYWdlIGluIGltYWdlczoKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW1hZ2VzX3BhdGgsIGltYWdlICsgJy5pbWcnKSkpCisKKyAgZGVmIHRlc3RfQWRkUGFja1JhZGlvSW1hZ2VzX21pc3NpbmdJbWFnZXMoc2VsZik6CisgICAgaW1hZ2VzLCBfID0gc2VsZi5fY3JlYXRlX2ltYWdlcyhbJ2ZvbycsICdiYXInXSwgJ1JBRElPJykKKyAgICBBZGRQYWNrUmFkaW9JbWFnZXMoTm9uZSwgaW1hZ2VzKQorCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIEFkZFBhY2tSYWRpb0ltYWdlcywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMgKyBbJ2JheiddKQorCisgIEBzdGF0aWNtZXRob2QKKyAgZGVmIF90ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YSgpOgorICAgICIiIkhlbHBlciBmdW5jdGlvbiB0byBzZXQgdXAgdGhlIHRlc3QgZm9yIHRlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhKCkuIiIiCisgICAgT1BUSU9OUy5pbmZvX2RpY3QgPSB7CisgICAgICAgICdzeXN0ZW1fdmVyaXR5X2Jsb2NrX2RldmljZScgOiAnL2Rldi9ibG9jay9zeXN0ZW0nLAorICAgICAgICAndmVuZG9yX3Zlcml0eV9ibG9ja19kZXZpY2UnIDogJy9kZXYvYmxvY2svdmVuZG9yJywKKyAgICB9CisKKyAgICAjIFByZXBhcmUgdGhlIE1FVEEvIGZvbGRlci4KKyAgICBtZXRhX3BhdGggPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICdNRVRBJykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobWV0YV9wYXRoKToKKyAgICAgIG9zLm1rZGlyKG1ldGFfcGF0aCkKKworICAgIHN5c3RlbV9pbWFnZSA9IHRlc3RfdXRpbHMuY29uc3RydWN0X3NwYXJzZV9pbWFnZShbCisgICAgICAgICgweENBQzEsIDYpLAorICAgICAgICAoMHhDQUMzLCA0KSwKKyAgICAgICAgKDB4Q0FDMSwgNildKQorICAgIHZlbmRvcl9pbWFnZSA9IHRlc3RfdXRpbHMuY29uc3RydWN0X3NwYXJzZV9pbWFnZShbCisgICAgICAgICgweENBQzIsIDEwKV0pCisKKyAgICBpbWFnZV9wYXRocyA9IHsKKyAgICAgICAgJ3N5c3RlbScgOiBzeXN0ZW1faW1hZ2UsCisgICAgICAgICd2ZW5kb3InIDogdmVuZG9yX2ltYWdlLAorICAgIH0KKyAgICByZXR1cm4gaW1hZ2VfcGF0aHMKKworICBkZWYgdGVzdF9BZGRDYXJlTWFwVHh0Rm9yQWJPdGEoc2VsZik6CisgICAgaW1hZ2VfcGF0aHMgPSBzZWxmLl90ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YSgpCisKKyAgICBBZGRDYXJlTWFwVHh0Rm9yQWJPdGEoTm9uZSwgWydzeXN0ZW0nLCAndmVuZG9yJ10sIGltYWdlX3BhdGhzKQorCisgICAgY2FyZV9tYXBfZmlsZSA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgJ01FVEEnLCAnY2FyZV9tYXAudHh0JykKKyAgICB3aXRoIG9wZW4oY2FyZV9tYXBfZmlsZSwgJ3InKSBhcyB2ZXJpZnlfZnA6CisgICAgICBjYXJlX21hcCA9IHZlcmlmeV9mcC5yZWFkKCkKKworICAgIGxpbmVzID0gY2FyZV9tYXAuc3BsaXQoJ1xuJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGxlbihsaW5lcykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc3lzdGVtJywgbGluZXNbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChSYW5nZVNldCgiMC01IDEwLTE1IikudG9fc3RyaW5nX3JhdygpLCBsaW5lc1sxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2ZW5kb3InLCBsaW5lc1syXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFJhbmdlU2V0KCIwLTkiKS50b19zdHJpbmdfcmF3KCksIGxpbmVzWzNdKQorCisgIGRlZiB0ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YV93aXRoTm9uQ2FyZU1hcFBhcnRpdGlvbnMoc2VsZik6CisgICAgIiIiUGFydGl0aW9ucyB3aXRob3V0IGNhcmVfbWFwIHNob3VsZCBiZSBpZ25vcmVkLiIiIgorICAgIGltYWdlX3BhdGhzID0gc2VsZi5fdGVzdF9BZGRDYXJlTWFwVHh0Rm9yQWJPdGEoKQorCisgICAgQWRkQ2FyZU1hcFR4dEZvckFiT3RhKAorICAgICAgICBOb25lLCBbJ2Jvb3QnLCAnc3lzdGVtJywgJ3ZlbmRvcicsICd2Ym1ldGEnXSwgaW1hZ2VfcGF0aHMpCisKKyAgICBjYXJlX21hcF9maWxlID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAnTUVUQScsICdjYXJlX21hcC50eHQnKQorICAgIHdpdGggb3BlbihjYXJlX21hcF9maWxlLCAncicpIGFzIHZlcmlmeV9mcDoKKyAgICAgIGNhcmVfbWFwID0gdmVyaWZ5X2ZwLnJlYWQoKQorCisgICAgbGluZXMgPSBjYXJlX21hcC5zcGxpdCgnXG4nKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbGVuKGxpbmVzKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdzeXN0ZW0nLCBsaW5lc1swXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFJhbmdlU2V0KCIwLTUgMTAtMTUiKS50b19zdHJpbmdfcmF3KCksIGxpbmVzWzFdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZlbmRvcicsIGxpbmVzWzJdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmFuZ2VTZXQoIjAtOSIpLnRvX3N0cmluZ19yYXcoKSwgbGluZXNbM10pCisKKyAgZGVmIHRlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhX3dpdGhBdmIoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIGNhc2UgZm9yIGRldmljZSB1c2luZyBBVkIuIiIiCisgICAgaW1hZ2VfcGF0aHMgPSBzZWxmLl90ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YSgpCisgICAgT1BUSU9OUy5pbmZvX2RpY3QgPSB7CisgICAgICAgICdhdmJfc3lzdGVtX2hhc2h0cmVlX2VuYWJsZScgOiAndHJ1ZScsCisgICAgICAgICdhdmJfdmVuZG9yX2hhc2h0cmVlX2VuYWJsZScgOiAndHJ1ZScsCisgICAgfQorCisgICAgQWRkQ2FyZU1hcFR4dEZvckFiT3RhKE5vbmUsIFsnc3lzdGVtJywgJ3ZlbmRvciddLCBpbWFnZV9wYXRocykKKworICAgIGNhcmVfbWFwX2ZpbGUgPSBvcy5wYXRoLmpvaW4oT1BUSU9OUy5pbnB1dF90bXAsICdNRVRBJywgJ2NhcmVfbWFwLnR4dCcpCisgICAgd2l0aCBvcGVuKGNhcmVfbWFwX2ZpbGUsICdyJykgYXMgdmVyaWZ5X2ZwOgorICAgICAgY2FyZV9tYXAgPSB2ZXJpZnlfZnAucmVhZCgpCisKKyAgICBsaW5lcyA9IGNhcmVfbWFwLnNwbGl0KCdcbicpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBsZW4obGluZXMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3N5c3RlbScsIGxpbmVzWzBdKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmFuZ2VTZXQoIjAtNSAxMC0xNSIpLnRvX3N0cmluZ19yYXcoKSwgbGluZXNbMV0pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmVuZG9yJywgbGluZXNbMl0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChSYW5nZVNldCgiMC05IikudG9fc3RyaW5nX3JhdygpLCBsaW5lc1szXSkKKworICBkZWYgdGVzdF9BZGRDYXJlTWFwVHh0Rm9yQWJPdGFfdmVyaXR5Tm90RW5hYmxlZChzZWxmKToKKyAgICAiIiJObyBjYXJlX21hcC50eHQgc2hvdWxkIGJlIGdlbmVyYXRlZCBpZiB2ZXJpdHkgbm90IGVuYWJsZWQuIiIiCisgICAgaW1hZ2VfcGF0aHMgPSBzZWxmLl90ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YSgpCisgICAgT1BUSU9OUy5pbmZvX2RpY3QgPSB7fQorICAgIEFkZENhcmVNYXBUeHRGb3JBYk90YShOb25lLCBbJ3N5c3RlbScsICd2ZW5kb3InXSwgaW1hZ2VfcGF0aHMpCisKKyAgICBjYXJlX21hcF9maWxlID0gb3MucGF0aC5qb2luKE9QVElPTlMuaW5wdXRfdG1wLCAnTUVUQScsICdjYXJlX21hcC50eHQnKQorICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoY2FyZV9tYXBfZmlsZSkpCisKKyAgZGVmIHRlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhX21pc3NpbmdJbWFnZUZpbGUoc2VsZik6CisgICAgIiIiTWlzc2luZyBpbWFnZSBmaWxlIHNob3VsZCBiZSBjb25zaWRlcmVkIGZhdGFsLiIiIgorICAgIGltYWdlX3BhdGhzID0gc2VsZi5fdGVzdF9BZGRDYXJlTWFwVHh0Rm9yQWJPdGEoKQorICAgIGltYWdlX3BhdGhzWyd2ZW5kb3InXSA9ICcnCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIEFkZENhcmVNYXBUeHRGb3JBYk90YSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBbJ3N5c3RlbScsICd2ZW5kb3InXSwgaW1hZ2VfcGF0aHMpCisKKyAgZGVmIHRlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhX3ppcE91dHB1dChzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSB3aXRoIFpJUCBvdXRwdXQuIiIiCisgICAgaW1hZ2VfcGF0aHMgPSBzZWxmLl90ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YSgpCisKKyAgICBvdXRwdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSwgJ3cnKSBhcyBvdXRwdXRfemlwOgorICAgICAgQWRkQ2FyZU1hcFR4dEZvckFiT3RhKG91dHB1dF96aXAsIFsnc3lzdGVtJywgJ3ZlbmRvciddLCBpbWFnZV9wYXRocykKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAncicpIGFzIHZlcmlmeV96aXA6CisgICAgICBjYXJlX21hcCA9IHZlcmlmeV96aXAucmVhZCgnTUVUQS9jYXJlX21hcC50eHQnKS5kZWNvZGUoJ2FzY2lpJykKKworICAgIGxpbmVzID0gY2FyZV9tYXAuc3BsaXQoJ1xuJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGxlbihsaW5lcykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc3lzdGVtJywgbGluZXNbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChSYW5nZVNldCgiMC01IDEwLTE1IikudG9fc3RyaW5nX3JhdygpLCBsaW5lc1sxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2ZW5kb3InLCBsaW5lc1syXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFJhbmdlU2V0KCIwLTkiKS50b19zdHJpbmdfcmF3KCksIGxpbmVzWzNdKQorCisgIGRlZiB0ZXN0X0FkZENhcmVNYXBUeHRGb3JBYk90YV96aXBPdXRwdXRfY2FyZU1hcEVudHJ5RXhpc3RzKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIHdpdGggWklQIG91dHB1dCB3aGljaCBhbHJlYWR5IGhhcyBjYXJlX21hcCBlbnRyeS4iIiIKKyAgICBpbWFnZV9wYXRocyA9IHNlbGYuX3Rlc3RfQWRkQ2FyZU1hcFR4dEZvckFiT3RhKCkKKworICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICAjIENyZWF0ZSBhbiBleGlzdGluZyBNRVRBL2NhcmVfbWFwLnR4dCBlbnRyeS4KKyAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cihvdXRwdXRfemlwLCAnTUVUQS9jYXJlX21hcC50eHQnLCAnZHVtbXkgY2FyZV9tYXAudHh0JykKKworICAgICAgIyBSZXF1ZXN0IHRvIGFkZCBNRVRBL2NhcmVfbWFwLnR4dCBhZ2Fpbi4KKyAgICAgIEFkZENhcmVNYXBUeHRGb3JBYk90YShvdXRwdXRfemlwLCBbJ3N5c3RlbScsICd2ZW5kb3InXSwgaW1hZ2VfcGF0aHMpCisKKyAgICAjIFRoZSBvbmUgdW5kZXIgT1BUSU9OUy5pbnB1dF90bXAgbXVzdCBoYXZlIGJlZW4gcmVwbGFjZWQuCisgICAgY2FyZV9tYXBfZmlsZSA9IG9zLnBhdGguam9pbihPUFRJT05TLmlucHV0X3RtcCwgJ01FVEEnLCAnY2FyZV9tYXAudHh0JykKKyAgICB3aXRoIG9wZW4oY2FyZV9tYXBfZmlsZSwgJ3InKSBhcyB2ZXJpZnlfZnA6CisgICAgICBjYXJlX21hcCA9IHZlcmlmeV9mcC5yZWFkKCkKKworICAgIGxpbmVzID0gY2FyZV9tYXAuc3BsaXQoJ1xuJykKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGxlbihsaW5lcykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc3lzdGVtJywgbGluZXNbMF0pCisgICAgc2VsZi5hc3NlcnRFcXVhbChSYW5nZVNldCgiMC01IDEwLTE1IikudG9fc3RyaW5nX3JhdygpLCBsaW5lc1sxXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2ZW5kb3InLCBsaW5lc1syXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFJhbmdlU2V0KCIwLTkiKS50b19zdHJpbmdfcmF3KCksIGxpbmVzWzNdKQorCisgICAgIyBUaGUgZXhpc3RpbmcgZW50cnkgc2hvdWxkIGJlIHNjaGVkdWxlZCB0byBiZSByZXBsYWNlZC4KKyAgICBzZWxmLmFzc2VydEluKCdNRVRBL2NhcmVfbWFwLnR4dCcsIE9QVElPTlMucmVwbGFjZV91cGRhdGVkX2ZpbGVzX2xpc3QpCisKKyAgZGVmIHRlc3RfR2V0Q2FyZU1hcChzZWxmKToKKyAgICBzcGFyc2VfaW1hZ2UgPSB0ZXN0X3V0aWxzLmNvbnN0cnVjdF9zcGFyc2VfaW1hZ2UoWworICAgICAgICAoMHhDQUMxLCA2KSwKKyAgICAgICAgKDB4Q0FDMywgNCksCisgICAgICAgICgweENBQzEsIDYpXSkKKyAgICBPUFRJT05TLmluZm9fZGljdCA9IHsKKyAgICAgICAgJ3N5c3RlbV9hZGp1c3RlZF9wYXJ0aXRpb25fc2l6ZScgOiAxMiwKKyAgICB9CisgICAgbmFtZSwgY2FyZV9tYXAgPSBHZXRDYXJlTWFwKCdzeXN0ZW0nLCBzcGFyc2VfaW1hZ2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnc3lzdGVtJywgbmFtZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKFJhbmdlU2V0KCIwLTUgMTAtMTIiKS50b19zdHJpbmdfcmF3KCksIGNhcmVfbWFwKQorCisgIGRlZiB0ZXN0X0dldENhcmVNYXBfaW52YWxpZFBhcnRpdGlvbihzZWxmKToKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgR2V0Q2FyZU1hcCwgJ29lbScsIE5vbmUpCisKKyAgZGVmIHRlc3RfR2V0Q2FyZU1hcF9pbnZhbGlkQWRqdXN0ZWRQYXJ0aXRpb25TaXplKHNlbGYpOgorICAgIHNwYXJzZV9pbWFnZSA9IHRlc3RfdXRpbHMuY29uc3RydWN0X3NwYXJzZV9pbWFnZShbCisgICAgICAgICgweENBQzEsIDYpLAorICAgICAgICAoMHhDQUMzLCA0KSwKKyAgICAgICAgKDB4Q0FDMSwgNildKQorICAgIE9QVElPTlMuaW5mb19kaWN0ID0geworICAgICAgICAnc3lzdGVtX2FkanVzdGVkX3BhcnRpdGlvbl9zaXplJyA6IC0xMiwKKyAgICB9CisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIEdldENhcmVNYXAsICdzeXN0ZW0nLCBzcGFyc2VfaW1hZ2UpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9ibG9ja2ltZ2RpZmYucHkgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9ibG9ja2ltZ2RpZmYucHkKaW5kZXggZTVhMzY5NC4uY2VhZGExOCAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfYmxvY2tpbWdkaWZmLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2Jsb2NraW1nZGlmZi5weQpAQCAtMTYsMTIgKzE2LDQ0IEBACiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIAotaW1wb3J0IGNvbW1vbgogaW1wb3J0IHVuaXR0ZXN0CiAKLWZyb20gYmxvY2tpbWdkaWZmIGltcG9ydCBCbG9ja0ltYWdlRGlmZiwgRW1wdHlJbWFnZSwgVHJhbnNmZXIKK2ltcG9ydCBjb21tb24KK2Zyb20gYmxvY2tpbWdkaWZmIGltcG9ydCAoQmxvY2tJbWFnZURpZmYsIEVtcHR5SW1hZ2UsIEhlYXBJdGVtLCBJbWdkaWZmU3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyKQogZnJvbSByYW5nZWxpYiBpbXBvcnQgUmFuZ2VTZXQKIAorCitjbGFzcyBIZWFscEl0ZW1UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBjbGFzcyBJdGVtKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjb3JlKToKKyAgICAgIHNlbGYuc2NvcmUgPSBzY29yZQorCisgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgaXRlbTEgPSBIZWFwSXRlbShzZWxmLkl0ZW0oMTUpKQorICAgIGl0ZW0yID0gSGVhcEl0ZW0oc2VsZi5JdGVtKDIwKSkKKyAgICBpdGVtMyA9IEhlYXBJdGVtKHNlbGYuSXRlbSgxNSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKGl0ZW0xKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShpdGVtMikKKyAgICBzZWxmLmFzc2VydFRydWUoaXRlbTMpCisKKyAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGl0ZW0xLCBpdGVtMikKKyAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW0xLCBpdGVtMykKKyAgICAjIEhlYXBJdGVtIHVzZXMgbmVnYXRlZCBzY29yZXMuCisgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGl0ZW0xLCBpdGVtMikKKyAgICBzZWxmLmFzc2VydExlc3NFcXVhbChpdGVtMSwgaXRlbTMpCisgICAgc2VsZi5hc3NlcnRUcnVlKGl0ZW0xIDw9IGl0ZW0zKQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXRlbTIgPj0gaXRlbTEpCisKKyAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgaXRlbSA9IEhlYXBJdGVtKHNlbGYuSXRlbSgxNSkpCisgICAgc2VsZi5hc3NlcnRUcnVlKGl0ZW0pCisKKyAgICBpdGVtLmNsZWFyKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGl0ZW0pCisKKwogY2xhc3MgQmxvY2tJbWFnZURpZmZUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICBkZWYgdGVzdF9HZW5lcmF0ZURpZ3JhcGhPcmRlcihzZWxmKToKQEAgLTE0MSwzICsxNzMsMTAyIEBACiAgICAgIyBJbnN1ZmZpY2llbnQgY2FjaGUgdG8gc3Rhc2ggMTUgYmxvY2tzIChzaXplICogMC44IDwgMTUpLgogICAgIGNvbW1vbi5PUFRJT05TLmNhY2hlX3NpemUgPSAxNSAqIDQwOTYKICAgICBzZWxmLmFzc2VydEVxdWFsKDE1LCBibG9ja19pbWFnZV9kaWZmLlJldmlzZVN0YXNoU2l6ZSgpKQorCisgIGRlZiB0ZXN0X0ZpbGVUeXBlU3VwcG9ydGVkQnlJbWdkaWZmKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgQmxvY2tJbWFnZURpZmYuRmlsZVR5cGVTdXBwb3J0ZWRCeUltZ2RpZmYoCisgICAgICAgICAgICAiL3N5c3RlbS9wcml2LWFwcC9TZXR0aW5ncy9TZXR0aW5ncy5hcGsiKSkKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIEJsb2NrSW1hZ2VEaWZmLkZpbGVUeXBlU3VwcG9ydGVkQnlJbWdkaWZmKAorICAgICAgICAgICAgIi9zeXN0ZW0vZnJhbWV3b3JrL2FtLmphciIpKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgQmxvY2tJbWFnZURpZmYuRmlsZVR5cGVTdXBwb3J0ZWRCeUltZ2RpZmYoCisgICAgICAgICAgICAiL3N5c3RlbS9ldGMvc2VjdXJpdHkvb3RhY2VydHMuemlwIikpCisKKyAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICBCbG9ja0ltYWdlRGlmZi5GaWxlVHlwZVN1cHBvcnRlZEJ5SW1nZGlmZigKKyAgICAgICAgICAgICIvc3lzdGVtL2ZyYW1ld29yay9hcm0vYm9vdC5vYXQiKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICBCbG9ja0ltYWdlRGlmZi5GaWxlVHlwZVN1cHBvcnRlZEJ5SW1nZGlmZigKKyAgICAgICAgICAgICIvc3lzdGVtL3ByaXYtYXBwL25vdGFuYXBrIikpCisKKyAgZGVmIHRlc3RfQ2FuVXNlSW1nZGlmZihzZWxmKToKKyAgICBibG9ja19pbWFnZV9kaWZmID0gQmxvY2tJbWFnZURpZmYoRW1wdHlJbWFnZSgpLCBFbXB0eUltYWdlKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBibG9ja19pbWFnZV9kaWZmLkNhblVzZUltZ2RpZmYoCisgICAgICAgICAgICAiL3N5c3RlbS9hcHAvYXBwMS5hcGsiLCBSYW5nZVNldCgiMTAtMTUiKSwgUmFuZ2VTZXQoIjAtNSIpKSkKKyAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgIGJsb2NrX2ltYWdlX2RpZmYuQ2FuVXNlSW1nZGlmZigKKyAgICAgICAgICAgICIvdmVuZG9yL2FwcC9hcHAyLmFwayIsIFJhbmdlU2V0KCIyMCAyNSIpLCBSYW5nZVNldCgiMzAtMzEiKSwgVHJ1ZSkpCisKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgSW1nZGlmZlN0YXRzLlVTRURfSU1HRElGRiA6IHsiL3N5c3RlbS9hcHAvYXBwMS5hcGsifSwKKyAgICAgICAgICAgIEltZ2RpZmZTdGF0cy5VU0VEX0lNR0RJRkZfTEFSR0VfQVBLIDogeyIvdmVuZG9yL2FwcC9hcHAyLmFwayJ9LAorICAgICAgICB9LAorICAgICAgICBibG9ja19pbWFnZV9kaWZmLmltZ2RpZmZfc3RhdHMuc3RhdHMpCisKKworICBkZWYgdGVzdF9DYW5Vc2VJbWdkaWZmX2luZWxpZ2libGUoc2VsZik6CisgICAgIyBEaXNhYmxlZCBieSBjYWxsZXIuCisgICAgYmxvY2tfaW1hZ2VfZGlmZiA9IEJsb2NrSW1hZ2VEaWZmKEVtcHR5SW1hZ2UoKSwgRW1wdHlJbWFnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlX2ltZ2RpZmY9VHJ1ZSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICBibG9ja19pbWFnZV9kaWZmLkNhblVzZUltZ2RpZmYoCisgICAgICAgICAgICAiL3N5c3RlbS9hcHAvYXBwMS5hcGsiLCBSYW5nZVNldCgiMTAtMTUiKSwgUmFuZ2VTZXQoIjAtNSIpKSkKKworICAgICMgVW5zdXBwb3J0ZWQgZmlsZSB0eXBlLgorICAgIGJsb2NrX2ltYWdlX2RpZmYgPSBCbG9ja0ltYWdlRGlmZihFbXB0eUltYWdlKCksIEVtcHR5SW1hZ2UoKSkKKyAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICBibG9ja19pbWFnZV9kaWZmLkNhblVzZUltZ2RpZmYoCisgICAgICAgICAgICAiL3N5c3RlbS9iaW4vZ3ppcCIsIFJhbmdlU2V0KCIxMC0xNSIpLCBSYW5nZVNldCgiMC01IikpKQorCisgICAgIyBBdCBsZWFzdCBvbmUgb2YgdGhlIHJhbmdlcyBpcyBpbiBub24tbW9ub3RvbmljIG9yZGVyLgorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIGJsb2NrX2ltYWdlX2RpZmYuQ2FuVXNlSW1nZGlmZigKKyAgICAgICAgICAgICIvc3lzdGVtL2FwcC9hcHAyLmFwayIsIFJhbmdlU2V0KCIxMC0xNSIpLAorICAgICAgICAgICAgUmFuZ2VTZXQoIjE1LTIwIDMwIDEwLTE0IikpKQorCisgICAgIyBBdCBsZWFzdCBvbmUgb2YgdGhlIHJhbmdlcyBoYXMgYmVlbiBtb2RpZmllZC4KKyAgICBzcmNfcmFuZ2VzID0gUmFuZ2VTZXQoIjAtNSIpCisgICAgc3JjX3Jhbmdlcy5leHRyYVsndHJpbW1lZCddID0gVHJ1ZQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIGJsb2NrX2ltYWdlX2RpZmYuQ2FuVXNlSW1nZGlmZigKKyAgICAgICAgICAgICIvdmVuZG9yL2FwcC9hcHAzLmFwayIsIFJhbmdlU2V0KCIxMC0xNSIpLCBzcmNfcmFuZ2VzKSkKKworICAgICMgQXQgbGVhc3Qgb25lIG9mIHRoZSByYW5nZXMgaXMgaW5jb21wbGV0ZS4KKyAgICBzcmNfcmFuZ2VzID0gUmFuZ2VTZXQoIjAtNSIpCisgICAgc3JjX3Jhbmdlcy5leHRyYVsnaW5jb21wbGV0ZSddID0gVHJ1ZQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIGJsb2NrX2ltYWdlX2RpZmYuQ2FuVXNlSW1nZGlmZigKKyAgICAgICAgICAgICIvdmVuZG9yL2FwcC9hcHA0LmFwayIsIFJhbmdlU2V0KCIxMC0xNSIpLCBzcmNfcmFuZ2VzKSkKKworICAgICMgVGhlIHN0YXRzIGFyZSBjb3JyZWN0bHkgbG9nZ2VkLgorICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKAorICAgICAgICB7CisgICAgICAgICAgICBJbWdkaWZmU3RhdHMuU0tJUFBFRF9OT05NT05PVE9OSUMgOiB7Jy9zeXN0ZW0vYXBwL2FwcDIuYXBrJ30sCisgICAgICAgICAgICBJbWdkaWZmU3RhdHMuU0tJUFBFRF9UUklNTUVEIDogeycvdmVuZG9yL2FwcC9hcHAzLmFwayd9LAorICAgICAgICAgICAgSW1nZGlmZlN0YXRzLlNLSVBQRURfSU5DT01QTEVURTogeycvdmVuZG9yL2FwcC9hcHA0LmFwayd9LAorICAgICAgICB9LAorICAgICAgICBibG9ja19pbWFnZV9kaWZmLmltZ2RpZmZfc3RhdHMuc3RhdHMpCisKKworY2xhc3MgSW1nZGlmZlN0YXRzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RfTG9nKHNlbGYpOgorICAgIGltZ2RpZmZfc3RhdHMgPSBJbWdkaWZmU3RhdHMoKQorICAgIGltZ2RpZmZfc3RhdHMuTG9nKCIvc3lzdGVtL2FwcC9hcHAyLmFwayIsIEltZ2RpZmZTdGF0cy5VU0VEX0lNR0RJRkYpCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoCisgICAgICAgIHsKKyAgICAgICAgICAgIEltZ2RpZmZTdGF0cy5VU0VEX0lNR0RJRkY6IHsnL3N5c3RlbS9hcHAvYXBwMi5hcGsnfSwKKyAgICAgICAgfSwKKyAgICAgICAgaW1nZGlmZl9zdGF0cy5zdGF0cykKKworICBkZWYgdGVzdF9Mb2dfaW52YWxpZElucHV0cyhzZWxmKToKKyAgICBpbWdkaWZmX3N0YXRzID0gSW1nZGlmZlN0YXRzKCkKKworICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBpbWdkaWZmX3N0YXRzLkxvZywgIi9zeXN0ZW0vYmluL2d6aXAiLAorICAgICAgICAgICAgICAgICAgICAgIEltZ2RpZmZTdGF0cy5VU0VEX0lNR0RJRkYpCisKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgaW1nZGlmZl9zdGF0cy5Mb2csICIvc3lzdGVtL2FwcC9hcHAxLmFwayIsCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmVhc29uIikKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2J1aWxkX2ltYWdlLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfYnVpbGRfaW1hZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZmFmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2J1aWxkX2ltYWdlLnB5CkBAIC0wLDAgKzEsOTQgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgY29tbW9uCitmcm9tIGJ1aWxkX2ltYWdlIGltcG9ydCBDaGVja0hlYWRyb29tLCBSdW5Db21tYW5kCisKKworY2xhc3MgQnVpbGRJbWFnZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICMgQXZhaWxhYmxlOiAxMDAwIGJsb2Nrcy4KKyAgRVhUNEZTX09VVFBVVCA9ICgKKyAgICAgICJDcmVhdGVkIGZpbGVzeXN0ZW0gd2l0aCAyNzc3LzEyOTAyNCBpbm9kZXMgYW5kIDUxNTA5OS81MTYwOTkgYmxvY2tzIikKKworICBkZWYgdGVzdF9DaGVja0hlYWRyb29tX1NpemVVbmRlckxpbWl0KHNlbGYpOgorICAgICMgUmVxdWlyZWQgaGVhZHJvb206IDEwMDAgYmxvY2tzLgorICAgIHByb3BfZGljdCA9IHsKKyAgICAgICAgJ2ZzX3R5cGUnIDogJ2V4dDQnLAorICAgICAgICAncGFydGl0aW9uX2hlYWRyb29tJyA6ICc0MDk2MDAwJywKKyAgICAgICAgJ21vdW50X3BvaW50JyA6ICdzeXN0ZW0nLAorICAgIH0KKyAgICBzZWxmLmFzc2VydFRydWUoQ2hlY2tIZWFkcm9vbShzZWxmLkVYVDRGU19PVVRQVVQsIHByb3BfZGljdCkpCisKKyAgZGVmIHRlc3RfQ2hlY2tIZWFkcm9vbV9JbnN1ZmZpY2llbnRIZWFkcm9vbShzZWxmKToKKyAgICAjIFJlcXVpcmVkIGhlYWRyb29tOiAxMDAxIGJsb2Nrcy4KKyAgICBwcm9wX2RpY3QgPSB7CisgICAgICAgICdmc190eXBlJyA6ICdleHQ0JywKKyAgICAgICAgJ3BhcnRpdGlvbl9oZWFkcm9vbScgOiAnNDEwMDA5NicsCisgICAgICAgICdtb3VudF9wb2ludCcgOiAnc3lzdGVtJywKKyAgICB9CisgICAgc2VsZi5hc3NlcnRGYWxzZShDaGVja0hlYWRyb29tKHNlbGYuRVhUNEZTX09VVFBVVCwgcHJvcF9kaWN0KSkKKworICBkZWYgdGVzdF9DaGVja0hlYWRyb29tX1dyb25nRnNUeXBlKHNlbGYpOgorICAgIHByb3BfZGljdCA9IHsKKyAgICAgICAgJ2ZzX3R5cGUnIDogJ2YyZnMnLAorICAgICAgICAncGFydGl0aW9uX2hlYWRyb29tJyA6ICc0MTAwMDk2JywKKyAgICAgICAgJ21vdW50X3BvaW50JyA6ICdzeXN0ZW0nLAorICAgIH0KKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgQXNzZXJ0aW9uRXJyb3IsIENoZWNrSGVhZHJvb20sIHNlbGYuRVhUNEZTX09VVFBVVCwgcHJvcF9kaWN0KQorCisgIGRlZiB0ZXN0X0NoZWNrSGVhZHJvb21fTWlzc2luZ1Byb3BlcnRpZXMoc2VsZik6CisgICAgcHJvcF9kaWN0ID0geworICAgICAgICAnZnNfdHlwZScgOiAnZXh0NCcsCisgICAgICAgICdwYXJ0aXRpb25faGVhZHJvb20nIDogJzQxMDAwOTYnLAorICAgIH0KKyAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgQXNzZXJ0aW9uRXJyb3IsIENoZWNrSGVhZHJvb20sIHNlbGYuRVhUNEZTX09VVFBVVCwgcHJvcF9kaWN0KQorCisgICAgcHJvcF9kaWN0ID0geworICAgICAgICAnZnNfdHlwZScgOiAnZXh0NCcsCisgICAgICAgICdtb3VudF9wb2ludCcgOiAnc3lzdGVtJywKKyAgICB9CisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIEFzc2VydGlvbkVycm9yLCBDaGVja0hlYWRyb29tLCBzZWxmLkVYVDRGU19PVVRQVVQsIHByb3BfZGljdCkKKworICBkZWYgdGVzdF9DaGVja0hlYWRyb29tX1dpdGhNa2UyZnNPdXRwdXQoc2VsZik6CisgICAgIiIiVGVzdHMgdGhlIHJlc3VsdCBwYXJzaW5nIGZyb20gYWN0dWFsIGNhbGwgdG8gbWtlMmZzLiIiIgorICAgIGlucHV0X2RpciA9IGNvbW1vbi5NYWtlVGVtcERpcigpCisgICAgb3V0cHV0X2ltYWdlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy5pbWcnKQorICAgIGNvbW1hbmQgPSBbJ21rdXNlcmltZ19ta2UyZnMuc2gnLCBpbnB1dF9kaXIsIG91dHB1dF9pbWFnZSwgJ2V4dDQnLAorICAgICAgICAgICAgICAgJy9zeXN0ZW0nLCAnNDA5NjAwJywgJy1qJywgJzAnXQorICAgIGV4dDRmc19vdXRwdXQsIGV4aXRfY29kZSA9IFJ1bkNvbW1hbmQoY29tbWFuZCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4aXRfY29kZSkKKworICAgIHByb3BfZGljdCA9IHsKKyAgICAgICAgJ2ZzX3R5cGUnIDogJ2V4dDQnLAorICAgICAgICAncGFydGl0aW9uX2hlYWRyb29tJyA6ICc0MDk2MCcsCisgICAgICAgICdtb3VudF9wb2ludCcgOiAnc3lzdGVtJywKKyAgICB9CisgICAgc2VsZi5hc3NlcnRUcnVlKENoZWNrSGVhZHJvb20oZXh0NGZzX291dHB1dCwgcHJvcF9kaWN0KSkKKworICAgIHByb3BfZGljdCA9IHsKKyAgICAgICAgJ2ZzX3R5cGUnIDogJ2V4dDQnLAorICAgICAgICAncGFydGl0aW9uX2hlYWRyb29tJyA6ICc0MTM2OTYnLAorICAgICAgICAnbW91bnRfcG9pbnQnIDogJ3N5c3RlbScsCisgICAgfQorICAgIHNlbGYuYXNzZXJ0RmFsc2UoQ2hlY2tIZWFkcm9vbShleHQ0ZnNfb3V0cHV0LCBwcm9wX2RpY3QpKQorCisgICAgY29tbW9uLkNsZWFudXAoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfY29tbW9uLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfY29tbW9uLnB5CmluZGV4IDM2ZjI1NmQuLmZiMjZiNjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2NvbW1vbi5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9jb21tb24ucHkKQEAgLTEzLDM5ICsxMywzOCBAQAogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogIworCiBpbXBvcnQgb3MKLWltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB6aXBmaWxlCitmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEKIAogaW1wb3J0IGNvbW1vbgoraW1wb3J0IHRlc3RfdXRpbHMKIGltcG9ydCB2YWxpZGF0ZV90YXJnZXRfZmlsZXMKK2Zyb20gcmFuZ2VsaWIgaW1wb3J0IFJhbmdlU2V0CiAKIAotZGVmIHJhbmRvbV9zdHJpbmdfd2l0aF9ob2xlcyhzaXplLCBibG9ja19zaXplLCBzdGVwX3NpemUpOgotICBkYXRhID0gWyJcMCJdICogc2l6ZQotICBmb3IgYmVnaW4gaW4gcmFuZ2UoMCwgc2l6ZSwgc3RlcF9zaXplKToKLSAgICBlbmQgPSBiZWdpbiArIGJsb2NrX3NpemUKLSAgICBkYXRhW2JlZ2luOmVuZF0gPSBvcy51cmFuZG9tKGJsb2NrX3NpemUpCi0gIHJldHVybiAiIi5qb2luKGRhdGEpCitLaUIgPSAxMDI0CitNaUIgPSAxMDI0ICogS2lCCitHaUIgPSAxMDI0ICogTWlCCisKIAogZGVmIGdldF8yZ2Jfc3RyaW5nKCk6Ci0gIGtpbG9ieXRlcyA9IDEwMjQKLSAgbWVnYWJ5dGVzID0gMTAyNCAqIGtpbG9ieXRlcwotICBnaWdhYnl0ZXMgPSAxMDI0ICogbWVnYWJ5dGVzCi0KLSAgc2l6ZSA9IGludCgyICogZ2lnYWJ5dGVzICsgMSkKLSAgYmxvY2tfc2l6ZSA9IDQgKiBraWxvYnl0ZXMKLSAgc3RlcF9zaXplID0gNCAqIG1lZ2FieXRlcwotICB0d29fZ2Jfc3RyaW5nID0gcmFuZG9tX3N0cmluZ193aXRoX2hvbGVzKAotICAgICAgICBzaXplLCBibG9ja19zaXplLCBzdGVwX3NpemUpCi0gIHJldHVybiB0d29fZ2Jfc3RyaW5nCisgIHNpemUgPSBpbnQoMiAqIEdpQiArIDEpCisgIGJsb2NrX3NpemUgPSA0ICogS2lCCisgIHN0ZXBfc2l6ZSA9IDQgKiBNaUIKKyAgIyBHZW5lcmF0ZSBhIGxvbmcgc3RyaW5nIHdpdGggaG9sZXMsIGUuZy4gJ3h5elx4MDBhYmNceDAwLi4uJy4KKyAgZm9yIF8gaW4gcmFuZ2UoMCwgc2l6ZSwgc3RlcF9zaXplKToKKyAgICB5aWVsZCBvcy51cmFuZG9tKGJsb2NrX3NpemUpCisgICAgeWllbGQgJ1wwJyAqIChzdGVwX3NpemUgLSBibG9ja19zaXplKQogCiAKIGNsYXNzIENvbW1vblppcFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICBkZWYgX3ZlcmlmeShzZWxmLCB6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgYXJjbmFtZSwgY29udGVudHMsCisgIGRlZiBfdmVyaWZ5KHNlbGYsIHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCBhcmNuYW1lLCBleHBlY3RlZF9oYXNoLAogICAgICAgICAgICAgICB0ZXN0X2ZpbGVfbmFtZT1Ob25lLCBleHBlY3RlZF9zdGF0PU5vbmUsIGV4cGVjdGVkX21vZGU9MG82NDQsCiAgICAgICAgICAgICAgIGV4cGVjdGVkX2NvbXByZXNzX3R5cGU9emlwZmlsZS5aSVBfU1RPUkVEKToKICAgICAjIFZlcmlmeSB0aGUgc3RhdCBpZiBwcmVzZW50LgpAQCAtNjksNyArNjgsMTEgQEAKICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8uY29tcHJlc3NfdHlwZSwgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZSkKIAogICAgICMgVmVyaWZ5IHRoZSB6aXAgY29udGVudHMuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBfZmlsZS5yZWFkKGFyY25hbWUpLCBjb250ZW50cykKKyAgICBlbnRyeSA9IHppcF9maWxlLm9wZW4oYXJjbmFtZSkKKyAgICBzaGExX2hhc2ggPSBzaGExKCkKKyAgICBmb3IgY2h1bmsgaW4gaXRlcihsYW1iZGE6IGVudHJ5LnJlYWQoNCAqIE1pQiksICcnKToKKyAgICAgIHNoYTFfaGFzaC51cGRhdGUoY2h1bmspCisgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9oYXNoLCBzaGExX2hhc2guaGV4ZGlnZXN0KCkpCiAgICAgc2VsZi5hc3NlcnRJc05vbmUoemlwX2ZpbGUudGVzdHppcCgpKQogCiAgIGRlZiBfdGVzdF9aaXBXcml0ZShzZWxmLCBjb250ZW50cywgZXh0cmFfemlwd3JpdGVfYXJncz1Ob25lKToKQEAgLTkwLDcgKzkzLDEwIEBACiAgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVfbmFtZSwgInciKQogCiAgICAgdHJ5OgotICAgICAgdGVzdF9maWxlLndyaXRlKGNvbnRlbnRzKQorICAgICAgc2hhMV9oYXNoID0gc2hhMSgpCisgICAgICBmb3IgZGF0YSBpbiBjb250ZW50czoKKyAgICAgICAgc2hhMV9oYXNoLnVwZGF0ZShkYXRhKQorICAgICAgICB0ZXN0X2ZpbGUud3JpdGUoZGF0YSkKICAgICAgIHRlc3RfZmlsZS5jbG9zZSgpCiAKICAgICAgIGV4cGVjdGVkX3N0YXQgPSBvcy5zdGF0KHRlc3RfZmlsZV9uYW1lKQpAQCAtMTAyLDggKzEwOCw5IEBACiAgICAgICBjb21tb24uWmlwV3JpdGUoemlwX2ZpbGUsIHRlc3RfZmlsZV9uYW1lLCAqKmV4dHJhX3ppcHdyaXRlX2FyZ3MpCiAgICAgICBjb21tb24uWmlwQ2xvc2UoemlwX2ZpbGUpCiAKLSAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgYXJjbmFtZSwgY29udGVudHMsIHRlc3RfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3N0YXQsIGV4cGVjdGVkX21vZGUsIGV4cGVjdGVkX2NvbXByZXNzX3R5cGUpCisgICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsIGFyY25hbWUsIHNoYTFfaGFzaC5oZXhkaWdlc3QoKSwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X2ZpbGVfbmFtZSwgZXhwZWN0ZWRfc3RhdCwgZXhwZWN0ZWRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9jb21wcmVzc190eXBlKQogICAgIGZpbmFsbHk6CiAgICAgICBvcy5yZW1vdmUodGVzdF9maWxlX25hbWUpCiAgICAgICBvcy5yZW1vdmUoemlwX2ZpbGVfbmFtZSkKQEAgLTEzMyw3ICsxNDAsNyBAQAogICAgICAgY29tbW9uLlppcFdyaXRlU3RyKHppcF9maWxlLCB6aW5mb19vcl9hcmNuYW1lLCBjb250ZW50cywgKipleHRyYV9hcmdzKQogICAgICAgY29tbW9uLlppcENsb3NlKHppcF9maWxlKQogCi0gICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsIGFyY25hbWUsIGNvbnRlbnRzLAorICAgICAgc2VsZi5fdmVyaWZ5KHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCBhcmNuYW1lLCBzaGExKGNvbnRlbnRzKS5oZXhkaWdlc3QoKSwKICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9tb2RlPWV4cGVjdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZT1leHBlY3RlZF9jb21wcmVzc190eXBlKQogICAgIGZpbmFsbHk6CkBAIC0xNTksNyArMTY2LDEwIEBACiAgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVfbmFtZSwgInciKQogCiAgICAgdHJ5OgotICAgICAgdGVzdF9maWxlLndyaXRlKGxhcmdlKQorICAgICAgc2hhMV9oYXNoID0gc2hhMSgpCisgICAgICBmb3IgZGF0YSBpbiBsYXJnZToKKyAgICAgICAgc2hhMV9oYXNoLnVwZGF0ZShkYXRhKQorICAgICAgICB0ZXN0X2ZpbGUud3JpdGUoZGF0YSkKICAgICAgIHRlc3RfZmlsZS5jbG9zZSgpCiAKICAgICAgIGV4cGVjdGVkX3N0YXQgPSBvcy5zdGF0KHRlc3RfZmlsZV9uYW1lKQpAQCAtMTczLDEyICsxODMsMTMgQEAKICAgICAgIGNvbW1vbi5aaXBDbG9zZSh6aXBfZmlsZSkKIAogICAgICAgIyBWZXJpZnkgdGhlIGNvbnRlbnRzIHdyaXR0ZW4gYnkgWmlwV3JpdGUoKS4KLSAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgYXJjbmFtZV9sYXJnZSwgbGFyZ2UsCi0gICAgICAgICAgICAgICAgICAgdGVzdF9maWxlX25hbWUsIGV4cGVjdGVkX3N0YXQsIGV4cGVjdGVkX21vZGUsCi0gICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY29tcHJlc3NfdHlwZSkKKyAgICAgIHNlbGYuX3ZlcmlmeSh6aXBfZmlsZSwgemlwX2ZpbGVfbmFtZSwgYXJjbmFtZV9sYXJnZSwKKyAgICAgICAgICAgICAgICAgICBzaGExX2hhc2guaGV4ZGlnZXN0KCksIHRlc3RfZmlsZV9uYW1lLCBleHBlY3RlZF9zdGF0LAorICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21vZGUsIGV4cGVjdGVkX2NvbXByZXNzX3R5cGUpCiAKICAgICAgICMgVmVyaWZ5IHRoZSBjb250ZW50cyB3cml0dGVuIGJ5IFppcFdyaXRlU3RyKCkuCi0gICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsIGFyY25hbWVfc21hbGwsIHNtYWxsLAorICAgICAgc2VsZi5fdmVyaWZ5KHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCBhcmNuYW1lX3NtYWxsLAorICAgICAgICAgICAgICAgICAgIHNoYTEoc21hbGwpLmhleGRpZ2VzdCgpLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2NvbXByZXNzX3R5cGU9ZXhwZWN0ZWRfY29tcHJlc3NfdHlwZSkKICAgICBmaW5hbGx5OgogICAgICAgb3MucmVtb3ZlKHppcF9maWxlX25hbWUpCkBAIC0yODcsMzEgKzI5OCwzNzkgQEAKICAgICAgIGNvbW1vbi5aaXBXcml0ZVN0cih6aXBfZmlsZSwgemluZm8sIHJhbmRvbV9zdHJpbmcsIHBlcm1zPTBvNDAwKQogICAgICAgY29tbW9uLlppcENsb3NlKHppcF9maWxlKQogCi0gICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsICJmb28iLCByYW5kb21fc3RyaW5nLAorICAgICAgc2VsZi5fdmVyaWZ5KHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCAiZm9vIiwKKyAgICAgICAgICAgICAgICAgICBzaGExKHJhbmRvbV9zdHJpbmcpLmhleGRpZ2VzdCgpLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21vZGU9MG82NDQpCi0gICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsICJiYXIiLCByYW5kb21fc3RyaW5nLAorICAgICAgc2VsZi5fdmVyaWZ5KHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCAiYmFyIiwKKyAgICAgICAgICAgICAgICAgICBzaGExKHJhbmRvbV9zdHJpbmcpLmhleGRpZ2VzdCgpLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21vZGU9MG83NTUpCi0gICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsICJiYXoiLCByYW5kb21fc3RyaW5nLAorICAgICAgc2VsZi5fdmVyaWZ5KHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCAiYmF6IiwKKyAgICAgICAgICAgICAgICAgICBzaGExKHJhbmRvbV9zdHJpbmcpLmhleGRpZ2VzdCgpLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21vZGU9MG83NDApCi0gICAgICBzZWxmLl92ZXJpZnkoemlwX2ZpbGUsIHppcF9maWxlX25hbWUsICJxdXgiLCByYW5kb21fc3RyaW5nLAorICAgICAgc2VsZi5fdmVyaWZ5KHppcF9maWxlLCB6aXBfZmlsZV9uYW1lLCAicXV4IiwKKyAgICAgICAgICAgICAgICAgICBzaGExKHJhbmRvbV9zdHJpbmcpLmhleGRpZ2VzdCgpLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21vZGU9MG80MDApCiAgICAgZmluYWxseToKICAgICAgIG9zLnJlbW92ZSh6aXBfZmlsZV9uYW1lKQogCi1jbGFzcyBJbnN0YWxsUmVjb3ZlcnlTY3JpcHRGb3JtYXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgIiIiQ2hlY2sgdGhlIGZvcm1hdCBvZiBpbnN0YWxsLXJlY292ZXJ5LnNoCisgIGRlZiB0ZXN0X1ppcERlbGV0ZShzZWxmKToKKyAgICB6aXBfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShkZWxldGU9RmFsc2UsIHN1ZmZpeD0nLnppcCcpCisgICAgb3V0cHV0X3ppcCA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZS5uYW1lLCAndycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKKyAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIGVudHJ5X2ZpbGU6CisgICAgICBlbnRyeV9maWxlLndyaXRlKG9zLnVyYW5kb20oMTAyNCkpCisgICAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3ppcCwgZW50cnlfZmlsZS5uYW1lLCBhcmNuYW1lPSdUZXN0MScpCisgICAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3ppcCwgZW50cnlfZmlsZS5uYW1lLCBhcmNuYW1lPSdUZXN0MicpCisgICAgICBjb21tb24uWmlwV3JpdGUob3V0cHV0X3ppcCwgZW50cnlfZmlsZS5uYW1lLCBhcmNuYW1lPSdUZXN0MycpCisgICAgICBjb21tb24uWmlwQ2xvc2Uob3V0cHV0X3ppcCkKKyAgICB6aXBfZmlsZS5jbG9zZSgpCiAKLSAgSXRzIGZvcm1hdCBzaG91bGQgbWF0Y2ggYmV0d2VlbiBjb21tb24ucHkgYW5kIHZhbGlkYXRlX3RhcmdldF9maWxlcy5weS4iIiIKKyAgICB0cnk6CisgICAgICBjb21tb24uWmlwRGVsZXRlKHppcF9maWxlLm5hbWUsICdUZXN0MicpCisgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZS5uYW1lLCAncicpIGFzIGNoZWNrX3ppcDoKKyAgICAgICAgZW50cmllcyA9IGNoZWNrX3ppcC5uYW1lbGlzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVGVzdDEnIGluIGVudHJpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ1Rlc3QyJyBpbiBlbnRyaWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1Rlc3QzJyBpbiBlbnRyaWVzKQorCisgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgY29tbW9uLlppcERlbGV0ZSwgemlwX2ZpbGUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdUZXN0MicpCisgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZS5uYW1lLCAncicpIGFzIGNoZWNrX3ppcDoKKyAgICAgICAgZW50cmllcyA9IGNoZWNrX3ppcC5uYW1lbGlzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVGVzdDEnIGluIGVudHJpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ1Rlc3QyJyBpbiBlbnRyaWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1Rlc3QzJyBpbiBlbnRyaWVzKQorCisgICAgICBjb21tb24uWmlwRGVsZXRlKHppcF9maWxlLm5hbWUsIFsnVGVzdDMnXSkKKyAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLm5hbWUsICdyJykgYXMgY2hlY2tfemlwOgorICAgICAgICBlbnRyaWVzID0gY2hlY2tfemlwLm5hbWVsaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUZXN0MScgaW4gZW50cmllcykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgnVGVzdDInIGluIGVudHJpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ1Rlc3QzJyBpbiBlbnRyaWVzKQorCisgICAgICBjb21tb24uWmlwRGVsZXRlKHppcF9maWxlLm5hbWUsIFsnVGVzdDEnLCAnVGVzdDInXSkKKyAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLm5hbWUsICdyJykgYXMgY2hlY2tfemlwOgorICAgICAgICBlbnRyaWVzID0gY2hlY2tfemlwLm5hbWVsaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgnVGVzdDEnIGluIGVudHJpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ1Rlc3QyJyBpbiBlbnRyaWVzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCdUZXN0MycgaW4gZW50cmllcykKKyAgICBmaW5hbGx5OgorICAgICAgb3MucmVtb3ZlKHppcF9maWxlLm5hbWUpCisKKworY2xhc3MgQ29tbW9uQXBrVXRpbHNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgIiIiVGVzdHMgdGhlIEFQSyB1dGlscyByZWxhdGVkIGZ1bmN0aW9ucy4iIiIKKworICBBUEtDRVJUU19UWFQxID0gKAorICAgICAgJ25hbWU9IlJlY292ZXJ5TG9jYWxpemVyLmFwayIgY2VydGlmaWNhdGU9ImNlcnRzL2RldmtleS54NTA5LnBlbSInCisgICAgICAnIHByaXZhdGVfa2V5PSJjZXJ0cy9kZXZrZXkucGs4IlxuJworICAgICAgJ25hbWU9IlNldHRpbmdzLmFwayInCisgICAgICAnIGNlcnRpZmljYXRlPSJidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9wbGF0Zm9ybS54NTA5LnBlbSInCisgICAgICAnIHByaXZhdGVfa2V5PSJidWlsZC90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9wbGF0Zm9ybS5wazgiXG4nCisgICAgICAnbmFtZT0iVFYuYXBrIiBjZXJ0aWZpY2F0ZT0iUFJFU0lHTkVEIiBwcml2YXRlX2tleT0iIlxuJworICApCisKKyAgQVBLQ0VSVFNfQ0VSVE1BUDEgPSB7CisgICAgICAnUmVjb3ZlcnlMb2NhbGl6ZXIuYXBrJyA6ICdjZXJ0cy9kZXZrZXknLAorICAgICAgJ1NldHRpbmdzLmFwaycgOiAnYnVpbGQvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvcGxhdGZvcm0nLAorICAgICAgJ1RWLmFwaycgOiAnUFJFU0lHTkVEJywKKyAgfQorCisgIEFQS0NFUlRTX1RYVDIgPSAoCisgICAgICAnbmFtZT0iQ29tcHJlc3NlZDEuYXBrIiBjZXJ0aWZpY2F0ZT0iY2VydHMvY29tcHJlc3NlZDEueDUwOS5wZW0iJworICAgICAgJyBwcml2YXRlX2tleT0iY2VydHMvY29tcHJlc3NlZDEucGs4IiBjb21wcmVzc2VkPSJneiJcbicKKyAgICAgICduYW1lPSJDb21wcmVzc2VkMmEuYXBrIiBjZXJ0aWZpY2F0ZT0iY2VydHMvY29tcHJlc3NlZDIueDUwOS5wZW0iJworICAgICAgJyBwcml2YXRlX2tleT0iY2VydHMvY29tcHJlc3NlZDIucGs4IiBjb21wcmVzc2VkPSJneiJcbicKKyAgICAgICduYW1lPSJDb21wcmVzc2VkMmIuYXBrIiBjZXJ0aWZpY2F0ZT0iY2VydHMvY29tcHJlc3NlZDIueDUwOS5wZW0iJworICAgICAgJyBwcml2YXRlX2tleT0iY2VydHMvY29tcHJlc3NlZDIucGs4IiBjb21wcmVzc2VkPSJneiJcbicKKyAgICAgICduYW1lPSJDb21wcmVzc2VkMy5hcGsiIGNlcnRpZmljYXRlPSJjZXJ0cy9jb21wcmVzc2VkMy54NTA5LnBlbSInCisgICAgICAnIHByaXZhdGVfa2V5PSJjZXJ0cy9jb21wcmVzc2VkMy5wazgiIGNvbXByZXNzZWQ9Imd6IlxuJworICApCisKKyAgQVBLQ0VSVFNfQ0VSVE1BUDIgPSB7CisgICAgICAnQ29tcHJlc3NlZDEuYXBrJyA6ICdjZXJ0cy9jb21wcmVzc2VkMScsCisgICAgICAnQ29tcHJlc3NlZDJhLmFwaycgOiAnY2VydHMvY29tcHJlc3NlZDInLAorICAgICAgJ0NvbXByZXNzZWQyYi5hcGsnIDogJ2NlcnRzL2NvbXByZXNzZWQyJywKKyAgICAgICdDb21wcmVzc2VkMy5hcGsnIDogJ2NlcnRzL2NvbXByZXNzZWQzJywKKyAgfQorCisgIEFQS0NFUlRTX1RYVDMgPSAoCisgICAgICAnbmFtZT0iQ29tcHJlc3NlZDQuYXBrIiBjZXJ0aWZpY2F0ZT0iY2VydHMvY29tcHJlc3NlZDQueDUwOS5wZW0iJworICAgICAgJyBwcml2YXRlX2tleT0iY2VydHMvY29tcHJlc3NlZDQucGs4IiBjb21wcmVzc2VkPSJ4eiJcbicKKyAgKQorCisgIEFQS0NFUlRTX0NFUlRNQVAzID0geworICAgICAgJ0NvbXByZXNzZWQ0LmFwaycgOiAnY2VydHMvY29tcHJlc3NlZDQnLAorICB9CiAKICAgZGVmIHNldFVwKHNlbGYpOgotICAgIHNlbGYuX3RlbXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICBzZWxmLnRlc3RkYXRhX2RpciA9IHRlc3RfdXRpbHMuZ2V0X3Rlc3RkYXRhX2RpcigpCisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIGNvbW1vbi5DbGVhbnVwKCkKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBfd3JpdGVfYXBrY2VydHNfdHh0KGFwa2NlcnRzX3R4dCwgYWRkaXRpb25hbD1Ob25lKToKKyAgICBpZiBhZGRpdGlvbmFsIGlzIE5vbmU6CisgICAgICBhZGRpdGlvbmFsID0gW10KKyAgICB0YXJnZXRfZmlsZXMgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAndycpIGFzIHRhcmdldF9maWxlc196aXA6CisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKCdNRVRBL2Fwa2NlcnRzLnR4dCcsIGFwa2NlcnRzX3R4dCkKKyAgICAgIGZvciBlbnRyeSBpbiBhZGRpdGlvbmFsOgorICAgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKGVudHJ5LCAnJykKKyAgICByZXR1cm4gdGFyZ2V0X2ZpbGVzCisKKyAgZGVmIHRlc3RfUmVhZEFwa0NlcnRzX05vbmNvbXByZXNzZWRBcGtzKHNlbGYpOgorICAgIHRhcmdldF9maWxlcyA9IHNlbGYuX3dyaXRlX2Fwa2NlcnRzX3R4dChzZWxmLkFQS0NFUlRTX1RYVDEpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIGNlcnRtYXAsIGV4dCA9IGNvbW1vbi5SZWFkQXBrQ2VydHMoaW5wdXRfemlwKQorCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoc2VsZi5BUEtDRVJUU19DRVJUTUFQMSwgY2VydG1hcCkKKyAgICBzZWxmLmFzc2VydElzTm9uZShleHQpCisKKyAgZGVmIHRlc3RfUmVhZEFwa0NlcnRzX0NvbXByZXNzZWRBcGtzKHNlbGYpOgorICAgICMgV2UgaGF2ZSAiaW5zdGFsbGVkIiBDb21wcmVzc2VkMS5hcGsuZ3ogb25seS4gTm90ZSB0aGF0IENvbXByZXNzZWQzLmFwayBpcworICAgICMgbm90IHN0b3JlZCBpbiAnLmd6JyBmb3JtYXQsIHNvIGl0IHNob3VsZG4ndCBiZSBjb25zaWRlcmVkIGFzIGluc3RhbGxlZC4KKyAgICB0YXJnZXRfZmlsZXMgPSBzZWxmLl93cml0ZV9hcGtjZXJ0c190eHQoCisgICAgICAgIHNlbGYuQVBLQ0VSVFNfVFhUMiwKKyAgICAgICAgWydDb21wcmVzc2VkMS5hcGsuZ3onLCAnQ29tcHJlc3NlZDMuYXBrJ10pCisKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICdyJykgYXMgaW5wdXRfemlwOgorICAgICAgY2VydG1hcCwgZXh0ID0gY29tbW9uLlJlYWRBcGtDZXJ0cyhpbnB1dF96aXApCisKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbChzZWxmLkFQS0NFUlRTX0NFUlRNQVAyLCBjZXJ0bWFwKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy5neicsIGV4dCkKKworICAgICMgQWx0ZXJuYXRpdmUgY2FzZSB3aXRoICcueHonLgorICAgIHRhcmdldF9maWxlcyA9IHNlbGYuX3dyaXRlX2Fwa2NlcnRzX3R4dCgKKyAgICAgICAgc2VsZi5BUEtDRVJUU19UWFQzLCBbJ0NvbXByZXNzZWQ0LmFway54eiddKQorCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIGNlcnRtYXAsIGV4dCA9IGNvbW1vbi5SZWFkQXBrQ2VydHMoaW5wdXRfemlwKQorCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoc2VsZi5BUEtDRVJUU19DRVJUTUFQMywgY2VydG1hcCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCcueHonLCBleHQpCisKKyAgZGVmIHRlc3RfUmVhZEFwa0NlcnRzX0NvbXByZXNzZWRBbmROb25jb21wcmVzc2VkQXBrcyhzZWxmKToKKyAgICB0YXJnZXRfZmlsZXMgPSBzZWxmLl93cml0ZV9hcGtjZXJ0c190eHQoCisgICAgICAgIHNlbGYuQVBLQ0VSVFNfVFhUMSArIHNlbGYuQVBLQ0VSVFNfVFhUMiwKKyAgICAgICAgWydDb21wcmVzc2VkMS5hcGsuZ3onLCAnQ29tcHJlc3NlZDMuYXBrJ10pCisKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICdyJykgYXMgaW5wdXRfemlwOgorICAgICAgY2VydG1hcCwgZXh0ID0gY29tbW9uLlJlYWRBcGtDZXJ0cyhpbnB1dF96aXApCisKKyAgICBjZXJ0bWFwX21lcmdlZCA9IHNlbGYuQVBLQ0VSVFNfQ0VSVE1BUDEuY29weSgpCisgICAgY2VydG1hcF9tZXJnZWQudXBkYXRlKHNlbGYuQVBLQ0VSVFNfQ0VSVE1BUDIpCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoY2VydG1hcF9tZXJnZWQsIGNlcnRtYXApCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnLmd6JywgZXh0KQorCisgIGRlZiB0ZXN0X1JlYWRBcGtDZXJ0c19NdWx0aXBsZUNvbXByZXNzaW9uTWV0aG9kcyhzZWxmKToKKyAgICB0YXJnZXRfZmlsZXMgPSBzZWxmLl93cml0ZV9hcGtjZXJ0c190eHQoCisgICAgICAgIHNlbGYuQVBLQ0VSVFNfVFhUMiArIHNlbGYuQVBLQ0VSVFNfVFhUMywKKyAgICAgICAgWydDb21wcmVzc2VkMS5hcGsuZ3onLCAnQ29tcHJlc3NlZDQuYXBrLnh6J10pCisKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICdyJykgYXMgaW5wdXRfemlwOgorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tbW9uLlJlYWRBcGtDZXJ0cywgaW5wdXRfemlwKQorCisgIGRlZiB0ZXN0X1JlYWRBcGtDZXJ0c19NaXNtYXRjaGluZ0tleXMoc2VsZik6CisgICAgbWFsZm9ybWVkX2Fwa2NlcnRzX3R4dCA9ICgKKyAgICAgICAgJ25hbWU9IkFwcDEuYXBrIiBjZXJ0aWZpY2F0ZT0iY2VydHMvY2VydDEueDUwOS5wZW0iJworICAgICAgICAnIHByaXZhdGVfa2V5PSJjZXJ0cy9jZXJ0Mi5wazgiXG4nCisgICAgKQorICAgIHRhcmdldF9maWxlcyA9IHNlbGYuX3dyaXRlX2Fwa2NlcnRzX3R4dChtYWxmb3JtZWRfYXBrY2VydHNfdHh0KQorCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbW1vbi5SZWFkQXBrQ2VydHMsIGlucHV0X3ppcCkKKworICBkZWYgdGVzdF9FeHRyYWN0UHVibGljS2V5KHNlbGYpOgorICAgIGNlcnQgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5Lng1MDkucGVtJykKKyAgICBwdWJrZXkgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5LnB1YmtleS5wZW0nKQorICAgIHdpdGggb3BlbihwdWJrZXksICdyYicpIGFzIHB1YmtleV9mcDoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHVia2V5X2ZwLnJlYWQoKSwgY29tbW9uLkV4dHJhY3RQdWJsaWNLZXkoY2VydCkpCisKKyAgZGVmIHRlc3RfRXh0cmFjdFB1YmxpY0tleV9pbnZhbGlkSW5wdXQoc2VsZik6CisgICAgd3JvbmdfaW5wdXQgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5LnBrOCcpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIGNvbW1vbi5FeHRyYWN0UHVibGljS2V5LCB3cm9uZ19pbnB1dCkKKworICBkZWYgdGVzdF9QYXJzZUNlcnRpZmljYXRlKHNlbGYpOgorICAgIGNlcnQgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5Lng1MDkucGVtJykKKworICAgIGNtZCA9IFsnb3BlbnNzbCcsICd4NTA5JywgJy1pbicsIGNlcnQsICctb3V0Zm9ybScsICdERVInXQorICAgIHByb2MgPSBjb21tb24uUnVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICBleHBlY3RlZCwgXyA9IHByb2MuY29tbXVuaWNhdGUoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvYy5yZXR1cm5jb2RlKQorCisgICAgd2l0aCBvcGVuKGNlcnQpIGFzIGNlcnRfZnA6CisgICAgICBhY3R1YWwgPSBjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShjZXJ0X2ZwLnJlYWQoKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpCisKKworY2xhc3MgQ29tbW9uVXRpbHNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgY29tbW9uLkNsZWFudXAoKQorCisgIGRlZiB0ZXN0X0dldFNwYXJzZUltYWdlX2VtcHR5QmxvY2tNYXBGaWxlKHNlbGYpOgorICAgIHRhcmdldF9maWxlcyA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSd0YXJnZXRfZmlsZXMtJywgc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICd3JykgYXMgdGFyZ2V0X2ZpbGVzX3ppcDoKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGUoCisgICAgICAgICAgdGVzdF91dGlscy5jb25zdHJ1Y3Rfc3BhcnNlX2ltYWdlKFsKKyAgICAgICAgICAgICAgKDB4Q0FDMSwgNiksCisgICAgICAgICAgICAgICgweENBQzMsIDMpLAorICAgICAgICAgICAgICAoMHhDQUMxLCA0KV0pLAorICAgICAgICAgIGFyY25hbWU9J0lNQUdFUy9zeXN0ZW0uaW1nJykKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ0lNQUdFUy9zeXN0ZW0ubWFwJywgJycpCisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKCdTWVNURU0vZmlsZTEnLCBvcy51cmFuZG9tKDQwOTYgKiA4KSkKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ1NZU1RFTS9maWxlMicsIG9zLnVyYW5kb20oNDA5NiAqIDMpKQorCisgICAgdGVtcGRpciA9IGNvbW1vbi5VbnppcFRlbXAodGFyZ2V0X2ZpbGVzKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3InKSBhcyBpbnB1dF96aXA6CisgICAgICBzcGFyc2VfaW1hZ2UgPSBjb21tb24uR2V0U3BhcnNlSW1hZ2UoJ3N5c3RlbScsIHRlbXBkaXIsIGlucHV0X3ppcCwgRmFsc2UpCisKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgJ19fQ09QWSc6IFJhbmdlU2V0KCIwIiksCisgICAgICAgICAgICAnX19OT05aRVJPLTAnOiBSYW5nZVNldCgiMS01IDktMTIiKSwKKyAgICAgICAgfSwKKyAgICAgICAgc3BhcnNlX2ltYWdlLmZpbGVfbWFwKQorCisgIGRlZiB0ZXN0X0dldFNwYXJzZUltYWdlX2ludmFsaWRJbWFnZU5hbWUoc2VsZik6CisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIEFzc2VydGlvbkVycm9yLCBjb21tb24uR2V0U3BhcnNlSW1hZ2UsICdzeXN0ZW0yJywgTm9uZSwgTm9uZSwgRmFsc2UpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgIEFzc2VydGlvbkVycm9yLCBjb21tb24uR2V0U3BhcnNlSW1hZ2UsICd1bmtub3duJywgTm9uZSwgTm9uZSwgRmFsc2UpCisKKyAgZGVmIHRlc3RfR2V0U3BhcnNlSW1hZ2VfbWlzc2luZ0Jsb2NrTWFwRmlsZShzZWxmKToKKyAgICB0YXJnZXRfZmlsZXMgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0ndGFyZ2V0X2ZpbGVzLScsIHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAndycpIGFzIHRhcmdldF9maWxlc196aXA6CisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlKAorICAgICAgICAgIHRlc3RfdXRpbHMuY29uc3RydWN0X3NwYXJzZV9pbWFnZShbCisgICAgICAgICAgICAgICgweENBQzEsIDYpLAorICAgICAgICAgICAgICAoMHhDQUMzLCAzKSwKKyAgICAgICAgICAgICAgKDB4Q0FDMSwgNCldKSwKKyAgICAgICAgICBhcmNuYW1lPSdJTUFHRVMvc3lzdGVtLmltZycpCisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKCdTWVNURU0vZmlsZTEnLCBvcy51cmFuZG9tKDQwOTYgKiA4KSkKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ1NZU1RFTS9maWxlMicsIG9zLnVyYW5kb20oNDA5NiAqIDMpKQorCisgICAgdGVtcGRpciA9IGNvbW1vbi5VbnppcFRlbXAodGFyZ2V0X2ZpbGVzKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3InKSBhcyBpbnB1dF96aXA6CisgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICBBc3NlcnRpb25FcnJvciwgY29tbW9uLkdldFNwYXJzZUltYWdlLCAnc3lzdGVtJywgdGVtcGRpciwgaW5wdXRfemlwLAorICAgICAgICAgIEZhbHNlKQorCisgIGRlZiB0ZXN0X0dldFNwYXJzZUltYWdlX3NoYXJlZEJsb2Nrc19ub3RBbGxvd2VkKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIG9mIGhhdmluZyBvdmVybGFwcGluZyBibG9ja3MgYnV0IGRpc2FsbG93ZWQuIiIiCisgICAgdGFyZ2V0X2ZpbGVzID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9J3RhcmdldF9maWxlcy0nLCBzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3cnKSBhcyB0YXJnZXRfZmlsZXNfemlwOgorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZSgKKyAgICAgICAgICB0ZXN0X3V0aWxzLmNvbnN0cnVjdF9zcGFyc2VfaW1hZ2UoWygweENBQzIsIDE2KV0pLAorICAgICAgICAgIGFyY25hbWU9J0lNQUdFUy9zeXN0ZW0uaW1nJykKKyAgICAgICMgQmxvY2sgMTAgaXMgc2hhcmVkIGJldHdlZW4gdHdvIGZpbGVzLgorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cigKKyAgICAgICAgICAnSU1BR0VTL3N5c3RlbS5tYXAnLAorICAgICAgICAgICdcbicuam9pbihbCisgICAgICAgICAgICAgICcvc3lzdGVtL2ZpbGUxIDEtNSA5LTEwJywKKyAgICAgICAgICAgICAgJy9zeXN0ZW0vZmlsZTIgMTAtMTInXSkpCisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKCdTWVNURU0vZmlsZTEnLCBvcy51cmFuZG9tKDQwOTYgKiA3KSkKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ1NZU1RFTS9maWxlMicsIG9zLnVyYW5kb20oNDA5NiAqIDMpKQorCisgICAgdGVtcGRpciA9IGNvbW1vbi5VbnppcFRlbXAodGFyZ2V0X2ZpbGVzKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3InKSBhcyBpbnB1dF96aXA6CisgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICBBc3NlcnRpb25FcnJvciwgY29tbW9uLkdldFNwYXJzZUltYWdlLCAnc3lzdGVtJywgdGVtcGRpciwgaW5wdXRfemlwLAorICAgICAgICAgIEZhbHNlKQorCisgIGRlZiB0ZXN0X0dldFNwYXJzZUltYWdlX3NoYXJlZEJsb2Nrc19hbGxvd2VkKHNlbGYpOgorICAgICIiIlRlc3RzIHRoZSBjYXNlIGZvciB0YXJnZXQgdXNpbmcgQk9BUkRfRVhUNF9TSEFSRV9EVVBfQkxPQ0tTIDo9IHRydWUuIiIiCisgICAgdGFyZ2V0X2ZpbGVzID0gY29tbW9uLk1ha2VUZW1wRmlsZShwcmVmaXg9J3RhcmdldF9maWxlcy0nLCBzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlcywgJ3cnKSBhcyB0YXJnZXRfZmlsZXNfemlwOgorICAgICAgIyBDb25zdHJ1Y3QgYW4gaW1hZ2Ugd2l0aCBhIGNhcmVfbWFwIG9mICIwLTUgOS0xMiIuCisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlKAorICAgICAgICAgIHRlc3RfdXRpbHMuY29uc3RydWN0X3NwYXJzZV9pbWFnZShbKDB4Q0FDMiwgMTYpXSksCisgICAgICAgICAgYXJjbmFtZT0nSU1BR0VTL3N5c3RlbS5pbWcnKQorICAgICAgIyBCbG9jayAxMCBpcyBzaGFyZWQgYmV0d2VlbiB0d28gZmlsZXMuCisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKAorICAgICAgICAgICdJTUFHRVMvc3lzdGVtLm1hcCcsCisgICAgICAgICAgJ1xuJy5qb2luKFsKKyAgICAgICAgICAgICAgJy9zeXN0ZW0vZmlsZTEgMS01IDktMTAnLAorICAgICAgICAgICAgICAnL3N5c3RlbS9maWxlMiAxMC0xMiddKSkKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ1NZU1RFTS9maWxlMScsIG9zLnVyYW5kb20oNDA5NiAqIDcpKQorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignU1lTVEVNL2ZpbGUyJywgb3MudXJhbmRvbSg0MDk2ICogMykpCisKKyAgICB0ZW1wZGlyID0gY29tbW9uLlVuemlwVGVtcCh0YXJnZXRfZmlsZXMpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIHNwYXJzZV9pbWFnZSA9IGNvbW1vbi5HZXRTcGFyc2VJbWFnZSgnc3lzdGVtJywgdGVtcGRpciwgaW5wdXRfemlwLCBUcnVlKQorCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoCisgICAgICAgIHsKKyAgICAgICAgICAgICdfX0NPUFknOiBSYW5nZVNldCgiMCIpLAorICAgICAgICAgICAgJ19fTk9OWkVSTy0wJzogUmFuZ2VTZXQoIjYtOCAxMy0xNSIpLAorICAgICAgICAgICAgJy9zeXN0ZW0vZmlsZTEnOiBSYW5nZVNldCgiMS01IDktMTAiKSwKKyAgICAgICAgICAgICcvc3lzdGVtL2ZpbGUyJzogUmFuZ2VTZXQoIjExLTEyIiksCisgICAgICAgIH0sCisgICAgICAgIHNwYXJzZV9pbWFnZS5maWxlX21hcCkKKworICAgICMgJy9zeXN0ZW0vZmlsZTInIHNob3VsZCBiZSBtYXJrZWQgd2l0aCAndXNlc19zaGFyZWRfYmxvY2tzJywgYnV0IG5vdCB3aXRoCisgICAgIyAnaW5jb21wbGV0ZScuCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBzcGFyc2VfaW1hZ2UuZmlsZV9tYXBbJy9zeXN0ZW0vZmlsZTInXS5leHRyYVsndXNlc19zaGFyZWRfYmxvY2tzJ10pCisgICAgc2VsZi5hc3NlcnROb3RJbigKKyAgICAgICAgJ2luY29tcGxldGUnLCBzcGFyc2VfaW1hZ2UuZmlsZV9tYXBbJy9zeXN0ZW0vZmlsZTInXS5leHRyYSkKKworICAgICMgQWxsIG90aGVyIGVudHJpZXMgc2hvdWxkIGxvb2sgbm9ybWFsIHdpdGhvdXQgYW55IHRhZ3MuCisgICAgc2VsZi5hc3NlcnRGYWxzZShzcGFyc2VfaW1hZ2UuZmlsZV9tYXBbJ19fQ09QWSddLmV4dHJhKQorICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3BhcnNlX2ltYWdlLmZpbGVfbWFwWydfX05PTlpFUk8tMCddLmV4dHJhKQorICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3BhcnNlX2ltYWdlLmZpbGVfbWFwWycvc3lzdGVtL2ZpbGUxJ10uZXh0cmEpCisKKyAgZGVmIHRlc3RfR2V0U3BhcnNlSW1hZ2VfaW5jb21wbGV0ZVJhbmdlcyhzZWxmKToKKyAgICAiIiJUZXN0cyB0aGUgY2FzZSBvZiBleHQ0IGltYWdlcyB3aXRoIGhvbGVzLiIiIgorICAgIHRhcmdldF9maWxlcyA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSd0YXJnZXRfZmlsZXMtJywgc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh0YXJnZXRfZmlsZXMsICd3JykgYXMgdGFyZ2V0X2ZpbGVzX3ppcDoKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGUoCisgICAgICAgICAgdGVzdF91dGlscy5jb25zdHJ1Y3Rfc3BhcnNlX2ltYWdlKFsoMHhDQUMyLCAxNildKSwKKyAgICAgICAgICBhcmNuYW1lPSdJTUFHRVMvc3lzdGVtLmltZycpCisgICAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKAorICAgICAgICAgICdJTUFHRVMvc3lzdGVtLm1hcCcsCisgICAgICAgICAgJ1xuJy5qb2luKFsKKyAgICAgICAgICAgICAgJy9zeXN0ZW0vZmlsZTEgMS01IDktMTAnLAorICAgICAgICAgICAgICAnL3N5c3RlbS9maWxlMiAxMS0xMiddKSkKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ1NZU1RFTS9maWxlMScsIG9zLnVyYW5kb20oNDA5NiAqIDcpKQorICAgICAgIyAnL3N5c3RlbS9maWxlMicgaGFzIGxlc3MgYmxvY2tzIGxpc3RlZCAoMikgdGhhbiBhY3R1YWwgKDMpLgorICAgICAgdGFyZ2V0X2ZpbGVzX3ppcC53cml0ZXN0cignU1lTVEVNL2ZpbGUyJywgb3MudXJhbmRvbSg0MDk2ICogMykpCisKKyAgICB0ZW1wZGlyID0gY29tbW9uLlVuemlwVGVtcCh0YXJnZXRfZmlsZXMpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAncicpIGFzIGlucHV0X3ppcDoKKyAgICAgIHNwYXJzZV9pbWFnZSA9IGNvbW1vbi5HZXRTcGFyc2VJbWFnZSgnc3lzdGVtJywgdGVtcGRpciwgaW5wdXRfemlwLCBGYWxzZSkKKworICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3BhcnNlX2ltYWdlLmZpbGVfbWFwWycvc3lzdGVtL2ZpbGUxJ10uZXh0cmEpCisgICAgc2VsZi5hc3NlcnRUcnVlKHNwYXJzZV9pbWFnZS5maWxlX21hcFsnL3N5c3RlbS9maWxlMiddLmV4dHJhWydpbmNvbXBsZXRlJ10pCisKKworY2xhc3MgSW5zdGFsbFJlY292ZXJ5U2NyaXB0Rm9ybWF0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICIiIkNoZWNrcyB0aGUgZm9ybWF0IG9mIGluc3RhbGwtcmVjb3Zlcnkuc2guCisKKyAgSXRzIGZvcm1hdCBzaG91bGQgbWF0Y2ggYmV0d2VlbiBjb21tb24ucHkgYW5kIHZhbGlkYXRlX3RhcmdldF9maWxlcy5weS4KKyAgIiIiCisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYuX3RlbXBkaXIgPSBjb21tb24uTWFrZVRlbXBEaXIoKQogICAgICMgQ3JlYXRlIGEgZHVtbXkgZGljdCB0aGF0IGNvbnRhaW5zIHRoZSBmc3RhYiBpbmZvIGZvciBib290JnJlY292ZXJ5LgogICAgIHNlbGYuX2luZm8gPSB7ImZzdGFiIiA6IHt9fQotICAgIGR1bW15X2ZzdGFiID0gXAotICAgICAgICBbIi9kZXYvc29jLjAvYnktbmFtZS9ib290IC9ib290IGVtbWMgZGVmYXVsdHMgZGVmYXVsdHMiLAotICAgICAgICAgIi9kZXYvc29jLjAvYnktbmFtZS9yZWNvdmVyeSAvcmVjb3ZlcnkgZW1tYyBkZWZhdWx0cyBkZWZhdWx0cyJdCi0gICAgc2VsZi5faW5mb1siZnN0YWIiXSA9IGNvbW1vbi5Mb2FkUmVjb3ZlcnlGU1RhYihsYW1iZGEgeCA6ICJcbiIuam9pbih4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIGR1bW15X2ZzdGFiKQorICAgIGR1bW15X2ZzdGFiID0gWworICAgICAgICAiL2Rldi9zb2MuMC9ieS1uYW1lL2Jvb3QgL2Jvb3QgZW1tYyBkZWZhdWx0cyBkZWZhdWx0cyIsCisgICAgICAgICIvZGV2L3NvYy4wL2J5LW5hbWUvcmVjb3ZlcnkgL3JlY292ZXJ5IGVtbWMgZGVmYXVsdHMgZGVmYXVsdHMiXQorICAgIHNlbGYuX2luZm9bImZzdGFiIl0gPSBjb21tb24uTG9hZFJlY292ZXJ5RlNUYWIoIlxuIi5qb2luLCAyLCBkdW1teV9mc3RhYikKKyAgICAjIENvbnN0cnVjdCB0aGUgZ3ppcHBlZCByZWNvdmVyeS5pbWcgYW5kIGJvb3QuaW1nCisgICAgc2VsZi5yZWNvdmVyeV9kYXRhID0gYnl0ZWFycmF5KFsKKyAgICAgICAgMHgxZiwgMHg4YiwgMHgwOCwgMHgwMCwgMHg4MSwgMHgxMSwgMHgwMiwgMHg1YSwgMHgwMCwgMHgwMywgMHgyYiwgMHg0YSwKKyAgICAgICAgMHg0ZCwgMHhjZSwgMHgyZiwgMHg0YiwgMHgyZCwgMHhhYSwgMHgwNCwgMHgwMCwgMHhjOSwgMHg5MywgMHg0MywgMHhmMywKKyAgICAgICAgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMAorICAgIF0pCisgICAgIyBlY2hvIC1uICJib290IiB8IGd6aXAgLWYgfCBoZAorICAgIHNlbGYuYm9vdF9kYXRhID0gYnl0ZWFycmF5KFsKKyAgICAgICAgMHgxZiwgMHg4YiwgMHgwOCwgMHgwMCwgMHg4YywgMHgxMiwgMHgwMiwgMHg1YSwgMHgwMCwgMHgwMywgMHg0YiwgMHhjYSwKKyAgICAgICAgMHhjZiwgMHgyZiwgMHgwMSwgMHgwMCwgMHhjNCwgMHhhZSwgMHhlZCwgMHg0NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMAorICAgIF0pCiAKICAgZGVmIF9vdXRfdG1wX3Npbmsoc2VsZiwgbmFtZSwgZGF0YSwgcHJlZml4PSJTWVNURU0iKToKICAgICBsb2MgPSBvcy5wYXRoLmpvaW4oc2VsZi5fdGVtcGRpciwgcHJlZml4LCBuYW1lKQpAQCAtMzIxLDggKzY4MCw4IEBACiAgICAgICBmLndyaXRlKGRhdGEpCiAKICAgZGVmIHRlc3RfZnVsbF9yZWNvdmVyeShzZWxmKToKLSAgICByZWNvdmVyeV9pbWFnZSA9IGNvbW1vbi5GaWxlKCJyZWNvdmVyeS5pbWciLCAicmVjb3ZlcnkiKTsKLSAgICBib290X2ltYWdlID0gY29tbW9uLkZpbGUoImJvb3QuaW1nIiwgImJvb3QiKTsKKyAgICByZWNvdmVyeV9pbWFnZSA9IGNvbW1vbi5GaWxlKCJyZWNvdmVyeS5pbWciLCBzZWxmLnJlY292ZXJ5X2RhdGEpCisgICAgYm9vdF9pbWFnZSA9IGNvbW1vbi5GaWxlKCJib290LmltZyIsIHNlbGYuYm9vdF9kYXRhKQogICAgIHNlbGYuX2luZm9bImZ1bGxfcmVjb3ZlcnlfaW1hZ2UiXSA9ICJ0cnVlIgogCiAgICAgY29tbW9uLk1ha2VSZWNvdmVyeVBhdGNoKHNlbGYuX3RlbXBkaXIsIHNlbGYuX291dF90bXBfc2luaywKQEAgLTMzMSw5ICs2OTAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbmZvKQogCiAgIGRlZiB0ZXN0X3JlY292ZXJ5X2Zyb21fYm9vdChzZWxmKToKLSAgICByZWNvdmVyeV9pbWFnZSA9IGNvbW1vbi5GaWxlKCJyZWNvdmVyeS5pbWciLCAicmVjb3ZlcnkiKTsKKyAgICByZWNvdmVyeV9pbWFnZSA9IGNvbW1vbi5GaWxlKCJyZWNvdmVyeS5pbWciLCBzZWxmLnJlY292ZXJ5X2RhdGEpCiAgICAgc2VsZi5fb3V0X3RtcF9zaW5rKCJyZWNvdmVyeS5pbWciLCByZWNvdmVyeV9pbWFnZS5kYXRhLCAiSU1BR0VTIikKLSAgICBib290X2ltYWdlID0gY29tbW9uLkZpbGUoImJvb3QuaW1nIiwgImJvb3QiKTsKKyAgICBib290X2ltYWdlID0gY29tbW9uLkZpbGUoImJvb3QuaW1nIiwgc2VsZi5ib290X2RhdGEpCiAgICAgc2VsZi5fb3V0X3RtcF9zaW5rKCJib290LmltZyIsIGJvb3RfaW1hZ2UuZGF0YSwgIklNQUdFUyIpCiAKICAgICBjb21tb24uTWFrZVJlY292ZXJ5UGF0Y2goc2VsZi5fdGVtcGRpciwgc2VsZi5fb3V0X3RtcF9zaW5rLApAQCAtMzQ4LDQgKzcwNyw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luZm8pCiAKICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgIHNodXRpbC5ybXRyZWUoc2VsZi5fdGVtcGRpcikKKyAgICBjb21tb24uQ2xlYW51cCgpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdF9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlODdiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X290YV9mcm9tX3RhcmdldF9maWxlcy5weQpAQCAtMCwwICsxLDk3MiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHppcGZpbGUKKworaW1wb3J0IGNvbW1vbgoraW1wb3J0IHRlc3RfdXRpbHMKK2Zyb20gb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzIGltcG9ydCAoCisgICAgX0xvYWRPZW1EaWN0cywgQnVpbGRJbmZvLCBHZXRQYWNrYWdlTWV0YWRhdGEsCisgICAgR2V0VGFyZ2V0RmlsZXNaaXBGb3JTZWNvbmRhcnlJbWFnZXMsCisgICAgR2V0VGFyZ2V0RmlsZXNaaXBXaXRob3V0UG9zdGluc3RhbGxDb25maWcsCisgICAgUGF5bG9hZCwgUGF5bG9hZFNpZ25lciwgUE9TVElOU1RBTExfQ09ORklHLCBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzLAorICAgIFdyaXRlRmluZ2VycHJpbnRBc3NlcnRpb24pCisKKworZGVmIGNvbnN0cnVjdF90YXJnZXRfZmlsZXMoc2Vjb25kYXJ5PUZhbHNlKToKKyAgIiIiUmV0dXJucyBhIHRhcmdldC1maWxlcy56aXAgZmlsZSBmb3IgZ2VuZXJhdGluZyBPVEEgcGFja2FnZXMuIiIiCisgIHRhcmdldF9maWxlcyA9IGNvbW1vbi5NYWtlVGVtcEZpbGUocHJlZml4PSd0YXJnZXRfZmlsZXMtJywgc3VmZml4PScuemlwJykKKyAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGVzLCAndycpIGFzIHRhcmdldF9maWxlc196aXA6CisgICAgIyBNRVRBL3VwZGF0ZV9lbmdpbmVfY29uZmlnLnR4dAorICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoCisgICAgICAgICdNRVRBL3VwZGF0ZV9lbmdpbmVfY29uZmlnLnR4dCcsCisgICAgICAgICJQQVlMT0FEX01BSk9SX1ZFUlNJT049MlxuUEFZTE9BRF9NSU5PUl9WRVJTSU9OPTRcbiIpCisKKyAgICAjIE1FVEEvcG9zdGluc3RhbGxfY29uZmlnLnR4dAorICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoCisgICAgICAgIFBPU1RJTlNUQUxMX0NPTkZJRywKKyAgICAgICAgJ1xuJy5qb2luKFsKKyAgICAgICAgICAgICJSVU5fUE9TVElOU1RBTExfc3lzdGVtPXRydWUiLAorICAgICAgICAgICAgIlBPU1RJTlNUQUxMX1BBVEhfc3lzdGVtPXN5c3RlbS9iaW4vb3RhcHJlb3B0X3NjcmlwdCIsCisgICAgICAgICAgICAiRklMRVNZU1RFTV9UWVBFX3N5c3RlbT1leHQ0IiwKKyAgICAgICAgICAgICJQT1NUSU5TVEFMTF9PUFRJT05BTF9zeXN0ZW09dHJ1ZSIsCisgICAgICAgIF0pKQorCisgICAgIyBNRVRBL2FiX3BhcnRpdGlvbnMudHh0CisgICAgYWJfcGFydGl0aW9ucyA9IFsnYm9vdCcsICdzeXN0ZW0nLCAndmVuZG9yJ10KKyAgICB0YXJnZXRfZmlsZXNfemlwLndyaXRlc3RyKAorICAgICAgICAnTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCcsCisgICAgICAgICdcbicuam9pbihhYl9wYXJ0aXRpb25zKSkKKworICAgICMgQ3JlYXRlIGR1bW15IGltYWdlcyBmb3IgZWFjaCBvZiB0aGVtLgorICAgIGZvciBwYXJ0aXRpb24gaW4gYWJfcGFydGl0aW9uczoKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ0lNQUdFUy8nICsgcGFydGl0aW9uICsgJy5pbWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy51cmFuZG9tKGxlbihwYXJ0aXRpb24pKSkKKworICAgIGlmIHNlY29uZGFyeToKKyAgICAgIHRhcmdldF9maWxlc196aXAud3JpdGVzdHIoJ0lNQUdFUy9zeXN0ZW1fb3RoZXIuaW1nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MudXJhbmRvbShsZW4oInN5c3RlbV9vdGhlciIpKSkKKworICByZXR1cm4gdGFyZ2V0X2ZpbGVzCisKKworY2xhc3MgTW9ja1NjcmlwdFdyaXRlcihvYmplY3QpOgorICAiIiJBIGNsYXNzIHRoYXQgbW9ja3MgZWRpZnlfZ2VuZXJhdG9yLkVkaWZ5R2VuZXJhdG9yLgorCisgIEl0IHNpbXBseSBwdXNoZXMgdGhlIGluY29taW5nIGFyZ3VtZW50cyBvbnRvIHNjcmlwdCBzdGFjaywgd2hpY2ggaXMgdG8gYXNzZXJ0CisgIHRoZSBjYWxscyB0byBFZGlmeUdlbmVyYXRvciBmdW5jdGlvbnMuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnNjcmlwdCA9IFtdCisKKyAgZGVmIE1vdW50KHNlbGYsICphcmdzKToKKyAgICBzZWxmLnNjcmlwdC5hcHBlbmQoKCdNb3VudCcsKSArIGFyZ3MpCisKKyAgZGVmIEFzc2VydERldmljZShzZWxmLCAqYXJncyk6CisgICAgc2VsZi5zY3JpcHQuYXBwZW5kKCgnQXNzZXJ0RGV2aWNlJywpICsgYXJncykKKworICBkZWYgQXNzZXJ0T2VtUHJvcGVydHkoc2VsZiwgKmFyZ3MpOgorICAgIHNlbGYuc2NyaXB0LmFwcGVuZCgoJ0Fzc2VydE9lbVByb3BlcnR5JywpICsgYXJncykKKworICBkZWYgQXNzZXJ0RmluZ2VycHJpbnRPclRodW1icHJpbnQoc2VsZiwgKmFyZ3MpOgorICAgIHNlbGYuc2NyaXB0LmFwcGVuZCgoJ0Fzc2VydEZpbmdlcnByaW50T3JUaHVtYnByaW50JywpICsgYXJncykKKworICBkZWYgQXNzZXJ0U29tZUZpbmdlcnByaW50KHNlbGYsICphcmdzKToKKyAgICBzZWxmLnNjcmlwdC5hcHBlbmQoKCdBc3NlcnRTb21lRmluZ2VycHJpbnQnLCkgKyBhcmdzKQorCisgIGRlZiBBc3NlcnRTb21lVGh1bWJwcmludChzZWxmLCAqYXJncyk6CisgICAgc2VsZi5zY3JpcHQuYXBwZW5kKCgnQXNzZXJ0U29tZVRodW1icHJpbnQnLCkgKyBhcmdzKQorCisKK2NsYXNzIEJ1aWxkSW5mb1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIFRFU1RfSU5GT19ESUNUID0geworICAgICAgJ2J1aWxkLnByb3AnIDogeworICAgICAgICAgICdyby5wcm9kdWN0LmRldmljZScgOiAncHJvZHVjdC1kZXZpY2UnLAorICAgICAgICAgICdyby5wcm9kdWN0Lm5hbWUnIDogJ3Byb2R1Y3QtbmFtZScsCisgICAgICAgICAgJ3JvLmJ1aWxkLmZpbmdlcnByaW50JyA6ICdidWlsZC1maW5nZXJwcmludCcsCisgICAgICAgICAgJ3JvLmJ1aWxkLmZvbycgOiAnYnVpbGQtZm9vJywKKyAgICAgIH0sCisgICAgICAndmVuZG9yLmJ1aWxkLnByb3AnIDogeworICAgICAgICAgICdyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQnIDogJ3ZlbmRvci1idWlsZC1maW5nZXJwcmludCcsCisgICAgICB9LAorICAgICAgJ3Byb3BlcnR5MScgOiAndmFsdWUxJywKKyAgICAgICdwcm9wZXJ0eTInIDogNDA5NiwKKyAgfQorCisgIFRFU1RfSU5GT19ESUNUX1VTRVNfT0VNX1BST1BTID0geworICAgICAgJ2J1aWxkLnByb3AnIDogeworICAgICAgICAgICdyby5wcm9kdWN0Lm5hbWUnIDogJ3Byb2R1Y3QtbmFtZScsCisgICAgICAgICAgJ3JvLmJ1aWxkLnRodW1icHJpbnQnIDogJ2J1aWxkLXRodW1icHJpbnQnLAorICAgICAgICAgICdyby5idWlsZC5iYXInIDogJ2J1aWxkLWJhcicsCisgICAgICB9LAorICAgICAgJ3ZlbmRvci5idWlsZC5wcm9wJyA6IHsKKyAgICAgICAgICAncm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50JyA6ICd2ZW5kb3ItYnVpbGQtZmluZ2VycHJpbnQnLAorICAgICAgfSwKKyAgICAgICdwcm9wZXJ0eTEnIDogJ3ZhbHVlMScsCisgICAgICAncHJvcGVydHkyJyA6IDQwOTYsCisgICAgICAnb2VtX2ZpbmdlcnByaW50X3Byb3BlcnRpZXMnIDogJ3JvLnByb2R1Y3QuZGV2aWNlIHJvLnByb2R1Y3QuYnJhbmQnLAorICB9CisKKyAgVEVTVF9PRU1fRElDVFMgPSBbCisgICAgICB7CisgICAgICAgICAgJ3JvLnByb2R1Y3QuYnJhbmQnIDogJ2JyYW5kMScsCisgICAgICAgICAgJ3JvLnByb2R1Y3QuZGV2aWNlJyA6ICdkZXZpY2UxJywKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICAgJ3JvLnByb2R1Y3QuYnJhbmQnIDogJ2JyYW5kMicsCisgICAgICAgICAgJ3JvLnByb2R1Y3QuZGV2aWNlJyA6ICdkZXZpY2UyJywKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICAgJ3JvLnByb2R1Y3QuYnJhbmQnIDogJ2JyYW5kMycsCisgICAgICAgICAgJ3JvLnByb2R1Y3QuZGV2aWNlJyA6ICdkZXZpY2UzJywKKyAgICAgIH0sCisgIF0KKworICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1QsIE5vbmUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgncHJvZHVjdC1kZXZpY2UnLCB0YXJnZXRfaW5mby5kZXZpY2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYnVpbGQtZmluZ2VycHJpbnQnLCB0YXJnZXRfaW5mby5maW5nZXJwcmludCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKHRhcmdldF9pbmZvLmlzX2FiKQorICAgIHNlbGYuYXNzZXJ0SXNOb25lKHRhcmdldF9pbmZvLm9lbV9wcm9wcykKKworICBkZWYgdGVzdF9pbml0X3dpdGhfb2VtX3Byb3BzKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1RfVVNFU19PRU1fUFJPUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX09FTV9ESUNUUykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdkZXZpY2UxJywgdGFyZ2V0X2luZm8uZGV2aWNlKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2JyYW5kMS9wcm9kdWN0LW5hbWUvZGV2aWNlMTpidWlsZC10aHVtYnByaW50JywKKyAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pbmZvLmZpbmdlcnByaW50KQorCisgICAgIyBTd2FwIHRoZSBvcmRlciBpbiBvZW1fZGljdHMsIHdoaWNoIHdvdWxkIGxlYWQgdG8gZGlmZmVyZW50IEJ1aWxkSW5mby4KKyAgICBvZW1fZGljdHMgPSBjb3B5LmNvcHkoc2VsZi5URVNUX09FTV9ESUNUUykKKyAgICBvZW1fZGljdHNbMF0sIG9lbV9kaWN0c1syXSA9IG9lbV9kaWN0c1syXSwgb2VtX2RpY3RzWzBdCisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUywgb2VtX2RpY3RzKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2RldmljZTMnLCB0YXJnZXRfaW5mby5kZXZpY2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYnJhbmQzL3Byb2R1Y3QtbmFtZS9kZXZpY2UzOmJ1aWxkLXRodW1icHJpbnQnLAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2luZm8uZmluZ2VycHJpbnQpCisKKyAgICAjIE1pc3Npbmcgb2VtX2RpY3Qgc2hvdWxkIGJlIHJlamVjdGVkLgorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBCdWlsZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUywgTm9uZSkKKworICBkZWYgdGVzdF9fX2dldGl0ZW1fXyhzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNULCBOb25lKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZhbHVlMScsIHRhcmdldF9pbmZvWydwcm9wZXJ0eTEnXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQwOTYsIHRhcmdldF9pbmZvWydwcm9wZXJ0eTInXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdidWlsZC1mb28nLCB0YXJnZXRfaW5mb1snYnVpbGQucHJvcCddWydyby5idWlsZC5mb28nXSkKKworICBkZWYgdGVzdF9fX2dldGl0ZW1fX3dpdGhfb2VtX3Byb3BzKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1RfVVNFU19PRU1fUFJPUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX09FTV9ESUNUUykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2YWx1ZTEnLCB0YXJnZXRfaW5mb1sncHJvcGVydHkxJ10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0MDk2LCB0YXJnZXRfaW5mb1sncHJvcGVydHkyJ10pCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB0YXJnZXRfaW5mb1snYnVpbGQucHJvcCddWydyby5idWlsZC5mb28nXSkKKworICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVCwgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2YWx1ZTEnLCB0YXJnZXRfaW5mby5nZXQoJ3Byb3BlcnR5MScpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDA5NiwgdGFyZ2V0X2luZm8uZ2V0KCdwcm9wZXJ0eTInKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQwOTYsIHRhcmdldF9pbmZvLmdldCgncHJvcGVydHkyJywgMTAyNCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgxMDI0LCB0YXJnZXRfaW5mby5nZXQoJ3Byb3BlcnR5LW5vbmV4aXN0ZW50JywgMTAyNCkpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYnVpbGQtZm9vJywgdGFyZ2V0X2luZm8uZ2V0KCdidWlsZC5wcm9wJylbJ3JvLmJ1aWxkLmZvbyddKQorCisgIGRlZiB0ZXN0X2dldF93aXRoX29lbV9wcm9wcyhzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNUX1VTRVNfT0VNX1BST1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9PRU1fRElDVFMpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgndmFsdWUxJywgdGFyZ2V0X2luZm8uZ2V0KCdwcm9wZXJ0eTEnKSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDQwOTYsIHRhcmdldF9pbmZvLmdldCgncHJvcGVydHkyJykpCisgICAgc2VsZi5hc3NlcnRFcXVhbCg0MDk2LCB0YXJnZXRfaW5mby5nZXQoJ3Byb3BlcnR5MicsIDEwMjQpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAyNCwgdGFyZ2V0X2luZm8uZ2V0KCdwcm9wZXJ0eS1ub25leGlzdGVudCcsIDEwMjQpKQorICAgIHNlbGYuYXNzZXJ0SXNOb25lKHRhcmdldF9pbmZvLmdldCgnYnVpbGQucHJvcCcpLmdldCgncm8uYnVpbGQuZm9vJykpCisgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB0YXJnZXRfaW5mby5nZXQoJ2J1aWxkLnByb3AnKVsncm8uYnVpbGQuZm9vJ10pCisKKyAgZGVmIHRlc3RfR2V0QnVpbGRQcm9wKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1QsIE5vbmUpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYnVpbGQtZm9vJywgdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wKCdyby5idWlsZC5mb28nKSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhjb21tb24uRXh0ZXJuYWxFcnJvciwgdGFyZ2V0X2luZm8uR2V0QnVpbGRQcm9wLAorICAgICAgICAgICAgICAgICAgICAgICdyby5idWlsZC5ub25leGlzdGVudCcpCisKKyAgZGVmIHRlc3RfR2V0QnVpbGRQcm9wX3dpdGhfb2VtX3Byb3BzKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1RfVVNFU19PRU1fUFJPUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX09FTV9ESUNUUykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdidWlsZC1iYXInLCB0YXJnZXRfaW5mby5HZXRCdWlsZFByb3AoJ3JvLmJ1aWxkLmJhcicpKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvbW1vbi5FeHRlcm5hbEVycm9yLCB0YXJnZXRfaW5mby5HZXRCdWlsZFByb3AsCisgICAgICAgICAgICAgICAgICAgICAgJ3JvLmJ1aWxkLm5vbmV4aXN0ZW50JykKKworICBkZWYgdGVzdF9HZXRWZW5kb3JCdWlsZFByb3Aoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVCwgTm9uZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2ZW5kb3ItYnVpbGQtZmluZ2VycHJpbnQnLAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2luZm8uR2V0VmVuZG9yQnVpbGRQcm9wKAorICAgICAgICAgICAgICAgICAgICAgICAgICdyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQnKSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhjb21tb24uRXh0ZXJuYWxFcnJvciwgdGFyZ2V0X2luZm8uR2V0VmVuZG9yQnVpbGRQcm9wLAorICAgICAgICAgICAgICAgICAgICAgICdyby5idWlsZC5ub25leGlzdGVudCcpCisKKyAgZGVmIHRlc3RfR2V0VmVuZG9yQnVpbGRQcm9wX3dpdGhfb2VtX3Byb3BzKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1RfVVNFU19PRU1fUFJPUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5URVNUX09FTV9ESUNUUykKKyAgICBzZWxmLmFzc2VydEVxdWFsKCd2ZW5kb3ItYnVpbGQtZmluZ2VycHJpbnQnLAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2luZm8uR2V0VmVuZG9yQnVpbGRQcm9wKAorICAgICAgICAgICAgICAgICAgICAgICAgICdyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQnKSkKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhjb21tb24uRXh0ZXJuYWxFcnJvciwgdGFyZ2V0X2luZm8uR2V0VmVuZG9yQnVpbGRQcm9wLAorICAgICAgICAgICAgICAgICAgICAgICdyby5idWlsZC5ub25leGlzdGVudCcpCisKKyAgZGVmIHRlc3RfV3JpdGVNb3VudE9lbVNjcmlwdChzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNUX1VTRVNfT0VNX1BST1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9PRU1fRElDVFMpCisgICAgc2NyaXB0X3dyaXRlciA9IE1vY2tTY3JpcHRXcml0ZXIoKQorICAgIHRhcmdldF9pbmZvLldyaXRlTW91bnRPZW1TY3JpcHQoc2NyaXB0X3dyaXRlcikKKyAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ01vdW50JywgJy9vZW0nLCBOb25lKV0sIHNjcmlwdF93cml0ZXIuc2NyaXB0KQorCisgIGRlZiB0ZXN0X1dyaXRlRGV2aWNlQXNzZXJ0aW9ucyhzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNULCBOb25lKQorICAgIHNjcmlwdF93cml0ZXIgPSBNb2NrU2NyaXB0V3JpdGVyKCkKKyAgICB0YXJnZXRfaW5mby5Xcml0ZURldmljZUFzc2VydGlvbnMoc2NyaXB0X3dyaXRlciwgRmFsc2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbKCdBc3NlcnREZXZpY2UnLCAncHJvZHVjdC1kZXZpY2UnKV0sIHNjcmlwdF93cml0ZXIuc2NyaXB0KQorCisgIGRlZiB0ZXN0X1dyaXRlRGV2aWNlQXNzZXJ0aW9uc193aXRoX29lbV9wcm9wcyhzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfSU5GT19ESUNUX1VTRVNfT0VNX1BST1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVEVTVF9PRU1fRElDVFMpCisgICAgc2NyaXB0X3dyaXRlciA9IE1vY2tTY3JpcHRXcml0ZXIoKQorICAgIHRhcmdldF9pbmZvLldyaXRlRGV2aWNlQXNzZXJ0aW9ucyhzY3JpcHRfd3JpdGVyLCBGYWxzZSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbCisgICAgICAgICAgICAoJ0Fzc2VydE9lbVByb3BlcnR5JywgJ3JvLnByb2R1Y3QuZGV2aWNlJywKKyAgICAgICAgICAgICBbJ2RldmljZTEnLCAnZGV2aWNlMicsICdkZXZpY2UzJ10sIEZhbHNlKSwKKyAgICAgICAgICAgICgnQXNzZXJ0T2VtUHJvcGVydHknLCAncm8ucHJvZHVjdC5icmFuZCcsCisgICAgICAgICAgICAgWydicmFuZDEnLCAnYnJhbmQyJywgJ2JyYW5kMyddLCBGYWxzZSksCisgICAgICAgIF0sCisgICAgICAgIHNjcmlwdF93cml0ZXIuc2NyaXB0KQorCisgIGRlZiB0ZXN0X1dyaXRlRmluZ2VycHJpbnRBc3NlcnRpb25fd2l0aG91dF9vZW1fcHJvcHMoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfSU5GT19ESUNUKQorICAgIHNvdXJjZV9pbmZvX2RpY3RbJ2J1aWxkLnByb3AnXVsncm8uYnVpbGQuZmluZ2VycHJpbnQnXSA9ICgKKyAgICAgICAgJ3NvdXJjZS1idWlsZC1maW5nZXJwcmludCcpCisgICAgc291cmNlX2luZm8gPSBCdWlsZEluZm8oc291cmNlX2luZm9fZGljdCwgTm9uZSkKKworICAgIHNjcmlwdF93cml0ZXIgPSBNb2NrU2NyaXB0V3JpdGVyKCkKKyAgICBXcml0ZUZpbmdlcnByaW50QXNzZXJ0aW9uKHNjcmlwdF93cml0ZXIsIHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbKCdBc3NlcnRTb21lRmluZ2VycHJpbnQnLCAnc291cmNlLWJ1aWxkLWZpbmdlcnByaW50JywKKyAgICAgICAgICAnYnVpbGQtZmluZ2VycHJpbnQnKV0sCisgICAgICAgIHNjcmlwdF93cml0ZXIuc2NyaXB0KQorCisgIGRlZiB0ZXN0X1dyaXRlRmluZ2VycHJpbnRBc3NlcnRpb25fd2l0aF9zb3VyY2Vfb2VtX3Byb3BzKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1QsIE5vbmUpCisgICAgc291cmNlX2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfT0VNX0RJQ1RTKQorCisgICAgc2NyaXB0X3dyaXRlciA9IE1vY2tTY3JpcHRXcml0ZXIoKQorICAgIFdyaXRlRmluZ2VycHJpbnRBc3NlcnRpb24oc2NyaXB0X3dyaXRlciwgdGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIFsoJ0Fzc2VydEZpbmdlcnByaW50T3JUaHVtYnByaW50JywgJ2J1aWxkLWZpbmdlcnByaW50JywKKyAgICAgICAgICAnYnVpbGQtdGh1bWJwcmludCcpXSwKKyAgICAgICAgc2NyaXB0X3dyaXRlci5zY3JpcHQpCisKKyAgZGVmIHRlc3RfV3JpdGVGaW5nZXJwcmludEFzc2VydGlvbl93aXRoX3RhcmdldF9vZW1fcHJvcHMoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfT0VNX0RJQ1RTKQorICAgIHNvdXJjZV9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9JTkZPX0RJQ1QsIE5vbmUpCisKKyAgICBzY3JpcHRfd3JpdGVyID0gTW9ja1NjcmlwdFdyaXRlcigpCisgICAgV3JpdGVGaW5nZXJwcmludEFzc2VydGlvbihzY3JpcHRfd3JpdGVyLCB0YXJnZXRfaW5mbywgc291cmNlX2luZm8pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgWygnQXNzZXJ0RmluZ2VycHJpbnRPclRodW1icHJpbnQnLCAnYnVpbGQtZmluZ2VycHJpbnQnLAorICAgICAgICAgICdidWlsZC10aHVtYnByaW50JyldLAorICAgICAgICBzY3JpcHRfd3JpdGVyLnNjcmlwdCkKKworICBkZWYgdGVzdF9Xcml0ZUZpbmdlcnByaW50QXNzZXJ0aW9uX3dpdGhfYm90aF9vZW1fcHJvcHMoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX0lORk9fRElDVF9VU0VTX09FTV9QUk9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlRFU1RfT0VNX0RJQ1RTKQorICAgIHNvdXJjZV9pbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9JTkZPX0RJQ1RfVVNFU19PRU1fUFJPUFMpCisgICAgc291cmNlX2luZm9fZGljdFsnYnVpbGQucHJvcCddWydyby5idWlsZC50aHVtYnByaW50J10gPSAoCisgICAgICAgICdzb3VyY2UtYnVpbGQtdGh1bWJwcmludCcpCisgICAgc291cmNlX2luZm8gPSBCdWlsZEluZm8oc291cmNlX2luZm9fZGljdCwgc2VsZi5URVNUX09FTV9ESUNUUykKKworICAgIHNjcmlwdF93cml0ZXIgPSBNb2NrU2NyaXB0V3JpdGVyKCkKKyAgICBXcml0ZUZpbmdlcnByaW50QXNzZXJ0aW9uKHNjcmlwdF93cml0ZXIsIHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBbKCdBc3NlcnRTb21lVGh1bWJwcmludCcsICdidWlsZC10aHVtYnByaW50JywKKyAgICAgICAgICAnc291cmNlLWJ1aWxkLXRodW1icHJpbnQnKV0sCisgICAgICAgIHNjcmlwdF93cml0ZXIuc2NyaXB0KQorCisKK2NsYXNzIExvYWRPZW1EaWN0c1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBjb21tb24uQ2xlYW51cCgpCisKKyAgZGVmIHRlc3RfTm9uZURpY3Qoc2VsZik6CisgICAgc2VsZi5hc3NlcnRJc05vbmUoX0xvYWRPZW1EaWN0cyhOb25lKSkKKworICBkZWYgdGVzdF9TaW5nbGVEaWN0KHNlbGYpOgorICAgIGRpY3RfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoKQorICAgIHdpdGggb3BlbihkaWN0X2ZpbGUsICd3JykgYXMgZGljdF9mcDoKKyAgICAgIGRpY3RfZnAud3JpdGUoJ2FiYz0xXG5kZWY9MlxueHl6PWZvb1xuYS5iLmM9YmFyXG4nKQorCisgICAgb2VtX2RpY3RzID0gX0xvYWRPZW1EaWN0cyhbZGljdF9maWxlXSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihvZW1fZGljdHMpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIG9lbV9kaWN0c1swXVsneHl6J10pCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyJywgb2VtX2RpY3RzWzBdWydhLmIuYyddKQorCisgIGRlZiB0ZXN0X011bHRpcGxlRGljdHMoc2VsZik6CisgICAgb2VtX3NvdXJjZSA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICBkaWN0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKCkKKyAgICAgIHdpdGggb3BlbihkaWN0X2ZpbGUsICd3JykgYXMgZGljdF9mcDoKKyAgICAgICAgZGljdF9mcC53cml0ZSgKKyAgICAgICAgICAgICdyby5idWlsZC5pbmRleD17fVxuZGVmPTJcbnh5ej1mb29cbmEuYi5jPWJhclxuJy5mb3JtYXQoaSkpCisgICAgICBvZW1fc291cmNlLmFwcGVuZChkaWN0X2ZpbGUpCisKKyAgICBvZW1fZGljdHMgPSBfTG9hZE9lbURpY3RzKG9lbV9zb3VyY2UpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4ob2VtX2RpY3RzKSkKKyAgICBmb3IgaSwgb2VtX2RpY3QgaW4gZW51bWVyYXRlKG9lbV9kaWN0cyk6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKCcyJywgb2VtX2RpY3RbJ2RlZiddKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vJywgb2VtX2RpY3RbJ3h5eiddKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyJywgb2VtX2RpY3RbJ2EuYi5jJ10pCisgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7fScuZm9ybWF0KGkpLCBvZW1fZGljdFsncm8uYnVpbGQuaW5kZXgnXSkKKworCitjbGFzcyBPdGFGcm9tVGFyZ2V0RmlsZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBURVNUX1RBUkdFVF9JTkZPX0RJQ1QgPSB7CisgICAgICAnYnVpbGQucHJvcCcgOiB7CisgICAgICAgICAgJ3JvLnByb2R1Y3QuZGV2aWNlJyA6ICdwcm9kdWN0LWRldmljZScsCisgICAgICAgICAgJ3JvLmJ1aWxkLmZpbmdlcnByaW50JyA6ICdidWlsZC1maW5nZXJwcmludC10YXJnZXQnLAorICAgICAgICAgICdyby5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXRhcmdldCcsCisgICAgICAgICAgJ3JvLmJ1aWxkLnZlcnNpb24uc2RrJyA6ICcyNycsCisgICAgICAgICAgJ3JvLmJ1aWxkLnZlcnNpb24uc2VjdXJpdHlfcGF0Y2gnIDogJzIwMTctMTItMDEnLAorICAgICAgICAgICdyby5idWlsZC5kYXRlLnV0YycgOiAnMTUwMDAwMDAwMCcsCisgICAgICB9LAorICB9CisKKyAgVEVTVF9TT1VSQ0VfSU5GT19ESUNUID0geworICAgICAgJ2J1aWxkLnByb3AnIDogeworICAgICAgICAgICdyby5wcm9kdWN0LmRldmljZScgOiAncHJvZHVjdC1kZXZpY2UnLAorICAgICAgICAgICdyby5idWlsZC5maW5nZXJwcmludCcgOiAnYnVpbGQtZmluZ2VycHJpbnQtc291cmNlJywKKyAgICAgICAgICAncm8uYnVpbGQudmVyc2lvbi5pbmNyZW1lbnRhbCcgOiAnYnVpbGQtdmVyc2lvbi1pbmNyZW1lbnRhbC1zb3VyY2UnLAorICAgICAgICAgICdyby5idWlsZC52ZXJzaW9uLnNkaycgOiAnMjUnLAorICAgICAgICAgICdyby5idWlsZC52ZXJzaW9uLnNlY3VyaXR5X3BhdGNoJyA6ICcyMDE2LTEyLTAxJywKKyAgICAgICAgICAncm8uYnVpbGQuZGF0ZS51dGMnIDogJzE0MDAwMDAwMDAnLAorICAgICAgfSwKKyAgfQorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICAjIFJlc2V0IHRoZSBnbG9iYWwgb3B0aW9ucyBhcyBpbiBvdGFfZnJvbV90YXJnZXRfZmlsZXMucHkuCisgICAgY29tbW9uLk9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlID0gTm9uZQorICAgIGNvbW1vbi5PUFRJT05TLmRvd25ncmFkZSA9IEZhbHNlCisgICAgY29tbW9uLk9QVElPTlMudGltZXN0YW1wID0gRmFsc2UKKyAgICBjb21tb24uT1BUSU9OUy53aXBlX3VzZXJfZGF0YSA9IEZhbHNlCisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIGNvbW1vbi5DbGVhbnVwKCkKKworICBkZWYgdGVzdF9HZXRQYWNrYWdlTWV0YWRhdGFfYWJPdGFfZnVsbChzZWxmKToKKyAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKKyAgICB0YXJnZXRfaW5mb19kaWN0WydhYl91cGRhdGUnXSA9ICd0cnVlJworICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHRhcmdldF9pbmZvX2RpY3QsIE5vbmUpCisgICAgbWV0YWRhdGEgPSBHZXRQYWNrYWdlTWV0YWRhdGEodGFyZ2V0X2luZm8pCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoCisgICAgICAgIHsKKyAgICAgICAgICAgICdvdGEtdHlwZScgOiAnQUInLAorICAgICAgICAgICAgJ290YS1yZXF1aXJlZC1jYWNoZScgOiAnMCcsCisgICAgICAgICAgICAncG9zdC1idWlsZCcgOiAnYnVpbGQtZmluZ2VycHJpbnQtdGFyZ2V0JywKKyAgICAgICAgICAgICdwb3N0LWJ1aWxkLWluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXRhcmdldCcsCisgICAgICAgICAgICAncG9zdC1zZGstbGV2ZWwnIDogJzI3JywKKyAgICAgICAgICAgICdwb3N0LXNlY3VyaXR5LXBhdGNoLWxldmVsJyA6ICcyMDE3LTEyLTAxJywKKyAgICAgICAgICAgICdwb3N0LXRpbWVzdGFtcCcgOiAnMTUwMDAwMDAwMCcsCisgICAgICAgICAgICAncHJlLWRldmljZScgOiAncHJvZHVjdC1kZXZpY2UnLAorICAgICAgICB9LAorICAgICAgICBtZXRhZGF0YSkKKworICBkZWYgdGVzdF9HZXRQYWNrYWdlTWV0YWRhdGFfYWJPdGFfaW5jcmVtZW50YWwoc2VsZik6CisgICAgdGFyZ2V0X2luZm9fZGljdCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5URVNUX1RBUkdFVF9JTkZPX0RJQ1QpCisgICAgdGFyZ2V0X2luZm9fZGljdFsnYWJfdXBkYXRlJ10gPSAndHJ1ZScKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyh0YXJnZXRfaW5mb19kaWN0LCBOb25lKQorICAgIHNvdXJjZV9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9TT1VSQ0VfSU5GT19ESUNULCBOb25lKQorICAgIGNvbW1vbi5PUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSA9ICcnCisgICAgbWV0YWRhdGEgPSBHZXRQYWNrYWdlTWV0YWRhdGEodGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKQorICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKAorICAgICAgICB7CisgICAgICAgICAgICAnb3RhLXR5cGUnIDogJ0FCJywKKyAgICAgICAgICAgICdvdGEtcmVxdWlyZWQtY2FjaGUnIDogJzAnLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQnIDogJ2J1aWxkLWZpbmdlcnByaW50LXRhcmdldCcsCisgICAgICAgICAgICAncG9zdC1idWlsZC1pbmNyZW1lbnRhbCcgOiAnYnVpbGQtdmVyc2lvbi1pbmNyZW1lbnRhbC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3Qtc2RrLWxldmVsJyA6ICcyNycsCisgICAgICAgICAgICAncG9zdC1zZWN1cml0eS1wYXRjaC1sZXZlbCcgOiAnMjAxNy0xMi0wMScsCisgICAgICAgICAgICAncG9zdC10aW1lc3RhbXAnIDogJzE1MDAwMDAwMDAnLAorICAgICAgICAgICAgJ3ByZS1kZXZpY2UnIDogJ3Byb2R1Y3QtZGV2aWNlJywKKyAgICAgICAgICAgICdwcmUtYnVpbGQnIDogJ2J1aWxkLWZpbmdlcnByaW50LXNvdXJjZScsCisgICAgICAgICAgICAncHJlLWJ1aWxkLWluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXNvdXJjZScsCisgICAgICAgIH0sCisgICAgICAgIG1ldGFkYXRhKQorCisgIGRlZiB0ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9ub25BYk90YV9mdWxsKHNlbGYpOgorICAgIHRhcmdldF9pbmZvID0gQnVpbGRJbmZvKHNlbGYuVEVTVF9UQVJHRVRfSU5GT19ESUNULCBOb25lKQorICAgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvKQorICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKAorICAgICAgICB7CisgICAgICAgICAgICAnb3RhLXR5cGUnIDogJ0JMT0NLJywKKyAgICAgICAgICAgICdwb3N0LWJ1aWxkJyA6ICdidWlsZC1maW5nZXJwcmludC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQtaW5jcmVtZW50YWwnIDogJ2J1aWxkLXZlcnNpb24taW5jcmVtZW50YWwtdGFyZ2V0JywKKyAgICAgICAgICAgICdwb3N0LXNkay1sZXZlbCcgOiAnMjcnLAorICAgICAgICAgICAgJ3Bvc3Qtc2VjdXJpdHktcGF0Y2gtbGV2ZWwnIDogJzIwMTctMTItMDEnLAorICAgICAgICAgICAgJ3Bvc3QtdGltZXN0YW1wJyA6ICcxNTAwMDAwMDAwJywKKyAgICAgICAgICAgICdwcmUtZGV2aWNlJyA6ICdwcm9kdWN0LWRldmljZScsCisgICAgICAgIH0sCisgICAgICAgIG1ldGFkYXRhKQorCisgIGRlZiB0ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9ub25BYk90YV9pbmNyZW1lbnRhbChzZWxmKToKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhzZWxmLlRFU1RfU09VUkNFX0lORk9fRElDVCwgTm9uZSkKKyAgICBjb21tb24uT1BUSU9OUy5pbmNyZW1lbnRhbF9zb3VyY2UgPSAnJworICAgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgJ290YS10eXBlJyA6ICdCTE9DSycsCisgICAgICAgICAgICAncG9zdC1idWlsZCcgOiAnYnVpbGQtZmluZ2VycHJpbnQtdGFyZ2V0JywKKyAgICAgICAgICAgICdwb3N0LWJ1aWxkLWluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXRhcmdldCcsCisgICAgICAgICAgICAncG9zdC1zZGstbGV2ZWwnIDogJzI3JywKKyAgICAgICAgICAgICdwb3N0LXNlY3VyaXR5LXBhdGNoLWxldmVsJyA6ICcyMDE3LTEyLTAxJywKKyAgICAgICAgICAgICdwb3N0LXRpbWVzdGFtcCcgOiAnMTUwMDAwMDAwMCcsCisgICAgICAgICAgICAncHJlLWRldmljZScgOiAncHJvZHVjdC1kZXZpY2UnLAorICAgICAgICAgICAgJ3ByZS1idWlsZCcgOiAnYnVpbGQtZmluZ2VycHJpbnQtc291cmNlJywKKyAgICAgICAgICAgICdwcmUtYnVpbGQtaW5jcmVtZW50YWwnIDogJ2J1aWxkLXZlcnNpb24taW5jcmVtZW50YWwtc291cmNlJywKKyAgICAgICAgfSwKKyAgICAgICAgbWV0YWRhdGEpCisKKyAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3dpcGUoc2VsZik6CisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8oc2VsZi5URVNUX1RBUkdFVF9JTkZPX0RJQ1QsIE5vbmUpCisgICAgY29tbW9uLk9QVElPTlMud2lwZV91c2VyX2RhdGEgPSBUcnVlCisgICAgbWV0YWRhdGEgPSBHZXRQYWNrYWdlTWV0YWRhdGEodGFyZ2V0X2luZm8pCisgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoCisgICAgICAgIHsKKyAgICAgICAgICAgICdvdGEtdHlwZScgOiAnQkxPQ0snLAorICAgICAgICAgICAgJ290YS13aXBlJyA6ICd5ZXMnLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQnIDogJ2J1aWxkLWZpbmdlcnByaW50LXRhcmdldCcsCisgICAgICAgICAgICAncG9zdC1idWlsZC1pbmNyZW1lbnRhbCcgOiAnYnVpbGQtdmVyc2lvbi1pbmNyZW1lbnRhbC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3Qtc2RrLWxldmVsJyA6ICcyNycsCisgICAgICAgICAgICAncG9zdC1zZWN1cml0eS1wYXRjaC1sZXZlbCcgOiAnMjAxNy0xMi0wMScsCisgICAgICAgICAgICAncG9zdC10aW1lc3RhbXAnIDogJzE1MDAwMDAwMDAnLAorICAgICAgICAgICAgJ3ByZS1kZXZpY2UnIDogJ3Byb2R1Y3QtZGV2aWNlJywKKyAgICAgICAgfSwKKyAgICAgICAgbWV0YWRhdGEpCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgX3Rlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3N3YXBCdWlsZFRpbWVzdGFtcHModGFyZ2V0X2luZm8sIHNvdXJjZV9pbmZvKToKKyAgICAodGFyZ2V0X2luZm9bJ2J1aWxkLnByb3AnXVsncm8uYnVpbGQuZGF0ZS51dGMnXSwKKyAgICAgc291cmNlX2luZm9bJ2J1aWxkLnByb3AnXVsncm8uYnVpbGQuZGF0ZS51dGMnXSkgPSAoCisgICAgICAgICBzb3VyY2VfaW5mb1snYnVpbGQucHJvcCddWydyby5idWlsZC5kYXRlLnV0YyddLAorICAgICAgICAgdGFyZ2V0X2luZm9bJ2J1aWxkLnByb3AnXVsncm8uYnVpbGQuZGF0ZS51dGMnXSkKKworICBkZWYgdGVzdF9HZXRQYWNrYWdlTWV0YWRhdGFfdW5pbnRlbnRpb25hbERvd25ncmFkZURldGVjdGVkKHNlbGYpOgorICAgIHRhcmdldF9pbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9UQVJHRVRfSU5GT19ESUNUKQorICAgIHNvdXJjZV9pbmZvX2RpY3QgPSBjb3B5LmRlZXBjb3B5KHNlbGYuVEVTVF9TT1VSQ0VfSU5GT19ESUNUKQorICAgIHNlbGYuX3Rlc3RfR2V0UGFja2FnZU1ldGFkYXRhX3N3YXBCdWlsZFRpbWVzdGFtcHMoCisgICAgICAgIHRhcmdldF9pbmZvX2RpY3QsIHNvdXJjZV9pbmZvX2RpY3QpCisKKyAgICB0YXJnZXRfaW5mbyA9IEJ1aWxkSW5mbyh0YXJnZXRfaW5mb19kaWN0LCBOb25lKQorICAgIHNvdXJjZV9pbmZvID0gQnVpbGRJbmZvKHNvdXJjZV9pbmZvX2RpY3QsIE5vbmUpCisgICAgY29tbW9uLk9QVElPTlMuaW5jcmVtZW50YWxfc291cmNlID0gJycKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIEdldFBhY2thZ2VNZXRhZGF0YSwgdGFyZ2V0X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2luZm8pCisKKyAgZGVmIHRlc3RfR2V0UGFja2FnZU1ldGFkYXRhX2Rvd25ncmFkZShzZWxmKToKKyAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKKyAgICBzb3VyY2VfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfU09VUkNFX0lORk9fRElDVCkKKyAgICBzZWxmLl90ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9zd2FwQnVpbGRUaW1lc3RhbXBzKAorICAgICAgICB0YXJnZXRfaW5mb19kaWN0LCBzb3VyY2VfaW5mb19kaWN0KQorCisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8odGFyZ2V0X2luZm9fZGljdCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhzb3VyY2VfaW5mb19kaWN0LCBOb25lKQorICAgIGNvbW1vbi5PUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSA9ICcnCisgICAgY29tbW9uLk9QVElPTlMuZG93bmdyYWRlID0gVHJ1ZQorICAgIGNvbW1vbi5PUFRJT05TLndpcGVfdXNlcl9kYXRhID0gVHJ1ZQorICAgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgJ290YS1kb3duZ3JhZGUnIDogJ3llcycsCisgICAgICAgICAgICAnb3RhLXR5cGUnIDogJ0JMT0NLJywKKyAgICAgICAgICAgICdvdGEtd2lwZScgOiAneWVzJywKKyAgICAgICAgICAgICdwb3N0LWJ1aWxkJyA6ICdidWlsZC1maW5nZXJwcmludC10YXJnZXQnLAorICAgICAgICAgICAgJ3Bvc3QtYnVpbGQtaW5jcmVtZW50YWwnIDogJ2J1aWxkLXZlcnNpb24taW5jcmVtZW50YWwtdGFyZ2V0JywKKyAgICAgICAgICAgICdwb3N0LXNkay1sZXZlbCcgOiAnMjcnLAorICAgICAgICAgICAgJ3Bvc3Qtc2VjdXJpdHktcGF0Y2gtbGV2ZWwnIDogJzIwMTctMTItMDEnLAorICAgICAgICAgICAgJ3ByZS1kZXZpY2UnIDogJ3Byb2R1Y3QtZGV2aWNlJywKKyAgICAgICAgICAgICdwcmUtYnVpbGQnIDogJ2J1aWxkLWZpbmdlcnByaW50LXNvdXJjZScsCisgICAgICAgICAgICAncHJlLWJ1aWxkLWluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXNvdXJjZScsCisgICAgICAgIH0sCisgICAgICAgIG1ldGFkYXRhKQorCisgIGRlZiB0ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9vdmVycmlkZVRpbWVzdGFtcChzZWxmKToKKyAgICB0YXJnZXRfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfVEFSR0VUX0lORk9fRElDVCkKKyAgICBzb3VyY2VfaW5mb19kaWN0ID0gY29weS5kZWVwY29weShzZWxmLlRFU1RfU09VUkNFX0lORk9fRElDVCkKKyAgICBzZWxmLl90ZXN0X0dldFBhY2thZ2VNZXRhZGF0YV9zd2FwQnVpbGRUaW1lc3RhbXBzKAorICAgICAgICB0YXJnZXRfaW5mb19kaWN0LCBzb3VyY2VfaW5mb19kaWN0KQorCisgICAgdGFyZ2V0X2luZm8gPSBCdWlsZEluZm8odGFyZ2V0X2luZm9fZGljdCwgTm9uZSkKKyAgICBzb3VyY2VfaW5mbyA9IEJ1aWxkSW5mbyhzb3VyY2VfaW5mb19kaWN0LCBOb25lKQorICAgIGNvbW1vbi5PUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSA9ICcnCisgICAgY29tbW9uLk9QVElPTlMudGltZXN0YW1wID0gVHJ1ZQorICAgIG1ldGFkYXRhID0gR2V0UGFja2FnZU1ldGFkYXRhKHRhcmdldF9pbmZvLCBzb3VyY2VfaW5mbykKKyAgICBzZWxmLmFzc2VydERpY3RFcXVhbCgKKyAgICAgICAgeworICAgICAgICAgICAgJ290YS10eXBlJyA6ICdCTE9DSycsCisgICAgICAgICAgICAncG9zdC1idWlsZCcgOiAnYnVpbGQtZmluZ2VycHJpbnQtdGFyZ2V0JywKKyAgICAgICAgICAgICdwb3N0LWJ1aWxkLWluY3JlbWVudGFsJyA6ICdidWlsZC12ZXJzaW9uLWluY3JlbWVudGFsLXRhcmdldCcsCisgICAgICAgICAgICAncG9zdC1zZGstbGV2ZWwnIDogJzI3JywKKyAgICAgICAgICAgICdwb3N0LXNlY3VyaXR5LXBhdGNoLWxldmVsJyA6ICcyMDE3LTEyLTAxJywKKyAgICAgICAgICAgICdwb3N0LXRpbWVzdGFtcCcgOiAnMTUwMDAwMDAwMScsCisgICAgICAgICAgICAncHJlLWRldmljZScgOiAncHJvZHVjdC1kZXZpY2UnLAorICAgICAgICAgICAgJ3ByZS1idWlsZCcgOiAnYnVpbGQtZmluZ2VycHJpbnQtc291cmNlJywKKyAgICAgICAgICAgICdwcmUtYnVpbGQtaW5jcmVtZW50YWwnIDogJ2J1aWxkLXZlcnNpb24taW5jcmVtZW50YWwtc291cmNlJywKKyAgICAgICAgfSwKKyAgICAgICAgbWV0YWRhdGEpCisKKyAgZGVmIHRlc3RfR2V0VGFyZ2V0RmlsZXNaaXBGb3JTZWNvbmRhcnlJbWFnZXMoc2VsZik6CisgICAgaW5wdXRfZmlsZSA9IGNvbnN0cnVjdF90YXJnZXRfZmlsZXMoc2Vjb25kYXJ5PVRydWUpCisgICAgdGFyZ2V0X2ZpbGUgPSBHZXRUYXJnZXRGaWxlc1ppcEZvclNlY29uZGFyeUltYWdlcyhpbnB1dF9maWxlKQorCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUpIGFzIHZlcmlmeV96aXA6CisgICAgICBuYW1lbGlzdCA9IHZlcmlmeV96aXAubmFtZWxpc3QoKQorCisgICAgc2VsZi5hc3NlcnRJbignTUVUQS9hYl9wYXJ0aXRpb25zLnR4dCcsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0SW4oJ0lNQUdFUy9ib290LmltZycsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0SW4oJ0lNQUdFUy9zeXN0ZW0uaW1nJywgbmFtZWxpc3QpCisgICAgc2VsZi5hc3NlcnRJbignSU1BR0VTL3ZlbmRvci5pbWcnLCBuYW1lbGlzdCkKKyAgICBzZWxmLmFzc2VydEluKFBPU1RJTlNUQUxMX0NPTkZJRywgbmFtZWxpc3QpCisKKyAgICBzZWxmLmFzc2VydE5vdEluKCdJTUFHRVMvc3lzdGVtX290aGVyLmltZycsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0lNQUdFUy9zeXN0ZW0ubWFwJywgbmFtZWxpc3QpCisKKyAgZGVmIHRlc3RfR2V0VGFyZ2V0RmlsZXNaaXBGb3JTZWNvbmRhcnlJbWFnZXNfc2tpcFBvc3RpbnN0YWxsKHNlbGYpOgorICAgIGlucHV0X2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKHNlY29uZGFyeT1UcnVlKQorICAgIHRhcmdldF9maWxlID0gR2V0VGFyZ2V0RmlsZXNaaXBGb3JTZWNvbmRhcnlJbWFnZXMoCisgICAgICAgIGlucHV0X2ZpbGUsIHNraXBfcG9zdGluc3RhbGw9VHJ1ZSkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlKSBhcyB2ZXJpZnlfemlwOgorICAgICAgbmFtZWxpc3QgPSB2ZXJpZnlfemlwLm5hbWVsaXN0KCkKKworICAgIHNlbGYuYXNzZXJ0SW4oJ01FVEEvYWJfcGFydGl0aW9ucy50eHQnLCBuYW1lbGlzdCkKKyAgICBzZWxmLmFzc2VydEluKCdJTUFHRVMvYm9vdC5pbWcnLCBuYW1lbGlzdCkKKyAgICBzZWxmLmFzc2VydEluKCdJTUFHRVMvc3lzdGVtLmltZycsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0SW4oJ0lNQUdFUy92ZW5kb3IuaW1nJywgbmFtZWxpc3QpCisKKyAgICBzZWxmLmFzc2VydE5vdEluKCdJTUFHRVMvc3lzdGVtX290aGVyLmltZycsIG5hbWVsaXN0KQorICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0lNQUdFUy9zeXN0ZW0ubWFwJywgbmFtZWxpc3QpCisgICAgc2VsZi5hc3NlcnROb3RJbihQT1NUSU5TVEFMTF9DT05GSUcsIG5hbWVsaXN0KQorCisgIGRlZiB0ZXN0X0dldFRhcmdldEZpbGVzWmlwV2l0aG91dFBvc3RpbnN0YWxsQ29uZmlnKHNlbGYpOgorICAgIGlucHV0X2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKCkKKyAgICB0YXJnZXRfZmlsZSA9IEdldFRhcmdldEZpbGVzWmlwV2l0aG91dFBvc3RpbnN0YWxsQ29uZmlnKGlucHV0X2ZpbGUpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUodGFyZ2V0X2ZpbGUpIGFzIHZlcmlmeV96aXA6CisgICAgICBzZWxmLmFzc2VydE5vdEluKFBPU1RJTlNUQUxMX0NPTkZJRywgdmVyaWZ5X3ppcC5uYW1lbGlzdCgpKQorCisgIGRlZiB0ZXN0X0dldFRhcmdldEZpbGVzWmlwV2l0aG91dFBvc3RpbnN0YWxsQ29uZmlnX21pc3NpbmdFbnRyeShzZWxmKToKKyAgICBpbnB1dF9maWxlID0gY29uc3RydWN0X3RhcmdldF9maWxlcygpCisgICAgY29tbW9uLlppcERlbGV0ZShpbnB1dF9maWxlLCBQT1NUSU5TVEFMTF9DT05GSUcpCisgICAgdGFyZ2V0X2ZpbGUgPSBHZXRUYXJnZXRGaWxlc1ppcFdpdGhvdXRQb3N0aW5zdGFsbENvbmZpZyhpbnB1dF9maWxlKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHRhcmdldF9maWxlKSBhcyB2ZXJpZnlfemlwOgorICAgICAgc2VsZi5hc3NlcnROb3RJbihQT1NUSU5TVEFMTF9DT05GSUcsIHZlcmlmeV96aXAubmFtZWxpc3QoKSkKKworCitjbGFzcyBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIGNvbW1vbi5DbGVhbnVwKCkKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBfY29uc3RydWN0X3ppcF9wYWNrYWdlKGVudHJpZXMpOgorICAgIHppcF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAndycpIGFzIHppcF9mcDoKKyAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICB6aXBfZnAud3JpdGVzdHIoCisgICAgICAgICAgICBlbnRyeSwKKyAgICAgICAgICAgIGVudHJ5LnJlcGxhY2UoJy4nLCAnLScpLnVwcGVyKCksCisgICAgICAgICAgICB6aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgcmV0dXJuIHppcF9maWxlCisKKyAgQHN0YXRpY21ldGhvZAorICBkZWYgX3BhcnNlX3N0cmVhbWluZ19tZXRhZGF0YV9zdHJpbmcoZGF0YSk6CisgICAgcmVzdWx0ID0ge30KKyAgICBmb3IgdG9rZW4gaW4gZGF0YS5zcGxpdCgnLCcpOgorICAgICAgbmFtZSwgaW5mbyA9IHRva2VuLnNwbGl0KCc6JywgMSkKKyAgICAgIHJlc3VsdFtuYW1lXSA9IGluZm8KKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIF92ZXJpZnlfZW50cmllcyhzZWxmLCBpbnB1dF9maWxlLCB0b2tlbnMsIGVudHJpZXMpOgorICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgb2Zmc2V0LCBzaXplID0gbWFwKGludCwgdG9rZW5zW2VudHJ5XS5zcGxpdCgnOicpKQorICAgICAgd2l0aCBvcGVuKGlucHV0X2ZpbGUsICdyYicpIGFzIGlucHV0X2ZwOgorICAgICAgICBpbnB1dF9mcC5zZWVrKG9mZnNldCkKKyAgICAgICAgaWYgZW50cnkgPT0gJ21ldGFkYXRhJzoKKyAgICAgICAgICBleHBlY3RlZCA9IGInTUVUQS1JTkYvQ09NL0FORFJPSUQvTUVUQURBVEEnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgZXhwZWN0ZWQgPSBlbnRyeS5yZXBsYWNlKCcuJywgJy0nKS51cHBlcigpLmVuY29kZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGlucHV0X2ZwLnJlYWQoc2l6ZSkpCisKKyAgZGVmIHRlc3RfQ29tcHV0ZShzZWxmKToKKyAgICBlbnRyaWVzID0gKAorICAgICAgICAncGF5bG9hZC5iaW4nLAorICAgICAgICAncGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCcsCisgICAgKQorICAgIHppcF9maWxlID0gc2VsZi5fY29uc3RydWN0X3ppcF9wYWNrYWdlKGVudHJpZXMpCisgICAgcHJvcGVydHlfZmlsZXMgPSBTdHJlYW1pbmdQcm9wZXJ0eUZpbGVzKCkKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZSwgJ3InKSBhcyB6aXBfZnA6CisgICAgICBzdHJlYW1pbmdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5Db21wdXRlKHppcF9mcCkKKworICAgIHRva2VucyA9IHNlbGYuX3BhcnNlX3N0cmVhbWluZ19tZXRhZGF0YV9zdHJpbmcoc3RyZWFtaW5nX21ldGFkYXRhKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKHRva2VucykpCisgICAgc2VsZi5fdmVyaWZ5X2VudHJpZXMoemlwX2ZpbGUsIHRva2VucywgZW50cmllcykKKworICBkZWYgdGVzdF9Db21wdXRlX3dpdGhDYXJlTWFwVHh0QW5kQ29tcGF0aWJpbGl0eVppcChzZWxmKToKKyAgICBlbnRyaWVzID0gKAorICAgICAgICAncGF5bG9hZC5iaW4nLAorICAgICAgICAncGF5bG9hZF9wcm9wZXJ0aWVzLnR4dCcsCisgICAgICAgICdjYXJlX21hcC50eHQnLAorICAgICAgICAnY29tcGF0aWJpbGl0eS56aXAnLAorICAgICkKKyAgICB6aXBfZmlsZSA9IHNlbGYuX2NvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgIHByb3BlcnR5X2ZpbGVzID0gU3RyZWFtaW5nUHJvcGVydHlGaWxlcygpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGUsICdyJykgYXMgemlwX2ZwOgorICAgICAgc3RyZWFtaW5nX21ldGFkYXRhID0gcHJvcGVydHlfZmlsZXMuQ29tcHV0ZSh6aXBfZnApCisKKyAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZV9zdHJlYW1pbmdfbWV0YWRhdGFfc3RyaW5nKHN0cmVhbWluZ19tZXRhZGF0YSkKKyAgICBzZWxmLmFzc2VydEVxdWFsKDUsIGxlbih0b2tlbnMpKQorICAgIHNlbGYuX3ZlcmlmeV9lbnRyaWVzKHppcF9maWxlLCB0b2tlbnMsIGVudHJpZXMpCisKKyAgZGVmIHRlc3RfRmluYWxpemUoc2VsZik6CisgICAgZW50cmllcyA9IFsKKyAgICAgICAgJ3BheWxvYWQuYmluJywKKyAgICAgICAgJ3BheWxvYWRfcHJvcGVydGllcy50eHQnLAorICAgICAgICAnTUVUQS1JTkYvY29tL2FuZHJvaWQvbWV0YWRhdGEnLAorICAgIF0KKyAgICB6aXBfZmlsZSA9IHNlbGYuX2NvbnN0cnVjdF96aXBfcGFja2FnZShlbnRyaWVzKQorICAgIHByb3BlcnR5X2ZpbGVzID0gU3RyZWFtaW5nUHJvcGVydHlGaWxlcygpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGUsICdyJykgYXMgemlwX2ZwOgorICAgICAgcmF3X21ldGFkYXRhID0gcHJvcGVydHlfZmlsZXMuX0dldFByb3BlcnR5RmlsZXNTdHJpbmcoCisgICAgICAgICAgemlwX2ZwLCByZXNlcnZlX3NwYWNlPUZhbHNlKQorICAgICAgc3RyZWFtaW5nX21ldGFkYXRhID0gcHJvcGVydHlfZmlsZXMuRmluYWxpemUoemlwX2ZwLCBsZW4ocmF3X21ldGFkYXRhKSkKKyAgICB0b2tlbnMgPSBzZWxmLl9wYXJzZV9zdHJlYW1pbmdfbWV0YWRhdGFfc3RyaW5nKHN0cmVhbWluZ19tZXRhZGF0YSkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKHRva2VucykpCisgICAgIyAnTUVUQS1JTkYvY29tL2FuZHJvaWQvbWV0YWRhdGEnIHdpbGwgYmUga2V5J2QgYXMgJ21ldGFkYXRhJyBpbiB0aGUKKyAgICAjIHN0cmVhbWluZyBtZXRhZGF0YS4KKyAgICBlbnRyaWVzWzJdID0gJ21ldGFkYXRhJworICAgIHNlbGYuX3ZlcmlmeV9lbnRyaWVzKHppcF9maWxlLCB0b2tlbnMsIGVudHJpZXMpCisKKyAgZGVmIHRlc3RfRmluYWxpemVfYXNzZXJ0UmVzZXJ2ZWRMZW5ndGgoc2VsZik6CisgICAgZW50cmllcyA9ICgKKyAgICAgICAgJ3BheWxvYWQuYmluJywKKyAgICAgICAgJ3BheWxvYWRfcHJvcGVydGllcy50eHQnLAorICAgICAgICAnY2FyZV9tYXAudHh0JywKKyAgICAgICAgJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJywKKyAgICApCisgICAgemlwX2ZpbGUgPSBzZWxmLl9jb25zdHJ1Y3RfemlwX3BhY2thZ2UoZW50cmllcykKKyAgICBwcm9wZXJ0eV9maWxlcyA9IFN0cmVhbWluZ1Byb3BlcnR5RmlsZXMoKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAncicpIGFzIHppcF9mcDoKKyAgICAgICMgRmlyc3QgZ2V0IHRoZSByYXcgbWV0YWRhdGEgc3RyaW5nIChpLmUuIHdpdGhvdXQgcGFkZGluZyBzcGFjZSkuCisgICAgICByYXdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5fR2V0UHJvcGVydHlGaWxlc1N0cmluZygKKyAgICAgICAgICB6aXBfZnAsIHJlc2VydmVfc3BhY2U9RmFsc2UpCisgICAgICByYXdfbGVuZ3RoID0gbGVuKHJhd19tZXRhZGF0YSkKKworICAgICAgIyBOb3cgcGFzcyBpbiB0aGUgZXhhY3QgZXhwZWN0ZWQgbGVuZ3RoLgorICAgICAgc3RyZWFtaW5nX21ldGFkYXRhID0gcHJvcGVydHlfZmlsZXMuRmluYWxpemUoemlwX2ZwLCByYXdfbGVuZ3RoKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdfbGVuZ3RoLCBsZW4oc3RyZWFtaW5nX21ldGFkYXRhKSkKKworICAgICAgIyBPciBwYXNzIGluIGluc3VmZmljaWVudCBsZW5ndGguCisgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICBBc3NlcnRpb25FcnJvciwKKyAgICAgICAgICBwcm9wZXJ0eV9maWxlcy5GaW5hbGl6ZSwKKyAgICAgICAgICB6aXBfZnAsCisgICAgICAgICAgcmF3X2xlbmd0aCAtIDEpCisKKyAgICAgICMgT3IgcGFzcyBpbiBhIG11Y2ggbGFyZ2VyIHNpemUuCisgICAgICBzdHJlYW1pbmdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5GaW5hbGl6ZSgKKyAgICAgICAgICB6aXBfZnAsCisgICAgICAgICAgcmF3X2xlbmd0aCArIDIwKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdfbGVuZ3RoICsgMjAsIGxlbihzdHJlYW1pbmdfbWV0YWRhdGEpKQorICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnICcgKiAyMCwgc3RyZWFtaW5nX21ldGFkYXRhW3Jhd19sZW5ndGg6XSkKKworICBkZWYgdGVzdF9WZXJpZnkoc2VsZik6CisgICAgZW50cmllcyA9ICgKKyAgICAgICAgJ3BheWxvYWQuYmluJywKKyAgICAgICAgJ3BheWxvYWRfcHJvcGVydGllcy50eHQnLAorICAgICAgICAnY2FyZV9tYXAudHh0JywKKyAgICAgICAgJ01FVEEtSU5GL2NvbS9hbmRyb2lkL21ldGFkYXRhJywKKyAgICApCisgICAgemlwX2ZpbGUgPSBzZWxmLl9jb25zdHJ1Y3RfemlwX3BhY2thZ2UoZW50cmllcykKKyAgICBwcm9wZXJ0eV9maWxlcyA9IFN0cmVhbWluZ1Byb3BlcnR5RmlsZXMoKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAncicpIGFzIHppcF9mcDoKKyAgICAgICMgRmlyc3QgZ2V0IHRoZSByYXcgbWV0YWRhdGEgc3RyaW5nIChpLmUuIHdpdGhvdXQgcGFkZGluZyBzcGFjZSkuCisgICAgICByYXdfbWV0YWRhdGEgPSBwcm9wZXJ0eV9maWxlcy5fR2V0UHJvcGVydHlGaWxlc1N0cmluZygKKyAgICAgICAgICB6aXBfZnAsIHJlc2VydmVfc3BhY2U9RmFsc2UpCisKKyAgICAgICMgU2hvdWxkIHBhc3MgdGhlIHRlc3QgaWYgdmVyaWZpY2F0aW9uIHBhc3Nlcy4KKyAgICAgIHByb3BlcnR5X2ZpbGVzLlZlcmlmeSh6aXBfZnAsIHJhd19tZXRhZGF0YSkKKworICAgICAgIyBPciByYWlzZSBvbiB2ZXJpZmljYXRpb24gZmFpbHVyZS4KKyAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgIEFzc2VydGlvbkVycm9yLCBwcm9wZXJ0eV9maWxlcy5WZXJpZnksIHppcF9mcCwgcmF3X21ldGFkYXRhICsgJ3gnKQorCisKK2NsYXNzIFBheWxvYWRTaWduZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBTSUdGSUxFID0gJ3NpZ2ZpbGUuYmluJworICBTSUdORURfU0lHRklMRSA9ICdzaWduZWQtc2lnZmlsZS5iaW4nCisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHNlbGYudGVzdGRhdGFfZGlyID0gdGVzdF91dGlscy5nZXRfdGVzdGRhdGFfZGlyKCkKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi50ZXN0ZGF0YV9kaXIpKQorCisgICAgY29tbW9uLk9QVElPTlMucGF5bG9hZF9zaWduZXIgPSBOb25lCisgICAgY29tbW9uLk9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IFtdCisgICAgY29tbW9uLk9QVElPTlMucGFja2FnZV9rZXkgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5JykKKyAgICBjb21tb24uT1BUSU9OUy5rZXlfcGFzc3dvcmRzID0geworICAgICAgICBjb21tb24uT1BUSU9OUy5wYWNrYWdlX2tleSA6IE5vbmUsCisgICAgfQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBjb21tb24uQ2xlYW51cCgpCisKKyAgZGVmIF9hc3NlcnRGaWxlc0VxdWFsKHNlbGYsIGZpbGUxLCBmaWxlMik6CisgICAgd2l0aCBvcGVuKGZpbGUxLCAncmInKSBhcyBmcDEsIG9wZW4oZmlsZTIsICdyYicpIGFzIGZwMjoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAxLnJlYWQoKSwgZnAyLnJlYWQoKSkKKworICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgIHBheWxvYWRfc2lnbmVyID0gUGF5bG9hZFNpZ25lcigpCisgICAgc2VsZi5hc3NlcnRFcXVhbCgnb3BlbnNzbCcsIHBheWxvYWRfc2lnbmVyLnNpZ25lcikKKworICBkZWYgdGVzdF9pbml0X3dpdGhQYXNzd29yZChzZWxmKToKKyAgICBjb21tb24uT1BUSU9OUy5wYWNrYWdlX2tleSA9IG9zLnBhdGguam9pbigKKyAgICAgICAgc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5X3dpdGhfcGFzc3dkJykKKyAgICBjb21tb24uT1BUSU9OUy5rZXlfcGFzc3dvcmRzID0geworICAgICAgICBjb21tb24uT1BUSU9OUy5wYWNrYWdlX2tleSA6ICdmb28nLAorICAgIH0KKyAgICBwYXlsb2FkX3NpZ25lciA9IFBheWxvYWRTaWduZXIoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29wZW5zc2wnLCBwYXlsb2FkX3NpZ25lci5zaWduZXIpCisKKyAgZGVmIHRlc3RfaW5pdF93aXRoRXh0ZXJuYWxTaWduZXIoc2VsZik6CisgICAgY29tbW9uLk9QVElPTlMucGF5bG9hZF9zaWduZXIgPSAnYWJjJworICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBbJ2FyZzEnLCAnYXJnMiddCisgICAgcGF5bG9hZF9zaWduZXIgPSBQYXlsb2FkU2lnbmVyKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnLCBwYXlsb2FkX3NpZ25lci5zaWduZXIpCisgICAgc2VsZi5hc3NlcnRFcXVhbChbJ2FyZzEnLCAnYXJnMiddLCBwYXlsb2FkX3NpZ25lci5zaWduZXJfYXJncykKKworICBkZWYgdGVzdF9TaWduKHNlbGYpOgorICAgIHBheWxvYWRfc2lnbmVyID0gUGF5bG9hZFNpZ25lcigpCisgICAgaW5wdXRfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2Rpciwgc2VsZi5TSUdGSUxFKQorICAgIHNpZ25lZF9maWxlID0gcGF5bG9hZF9zaWduZXIuU2lnbihpbnB1dF9maWxlKQorCisgICAgdmVyaWZ5X2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsIHNlbGYuU0lHTkVEX1NJR0ZJTEUpCisgICAgc2VsZi5fYXNzZXJ0RmlsZXNFcXVhbCh2ZXJpZnlfZmlsZSwgc2lnbmVkX2ZpbGUpCisKKyAgZGVmIHRlc3RfU2lnbl93aXRoRXh0ZXJuYWxTaWduZXJfb3BlbnNzbChzZWxmKToKKyAgICAiIiJVc2VzIG9wZW5zc2wgYXMgdGhlIGV4dGVybmFsIHBheWxvYWQgc2lnbmVyLiIiIgorICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyID0gJ29wZW5zc2wnCisgICAgY29tbW9uLk9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IFsKKyAgICAgICAgJ3BrZXl1dGwnLCAnLXNpZ24nLCAnLWtleWZvcm0nLCAnREVSJywgJy1pbmtleScsCisgICAgICAgIG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXkucGs4JyksCisgICAgICAgICctcGtleW9wdCcsICdkaWdlc3Q6c2hhMjU2J10KKyAgICBwYXlsb2FkX3NpZ25lciA9IFBheWxvYWRTaWduZXIoKQorICAgIGlucHV0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsIHNlbGYuU0lHRklMRSkKKyAgICBzaWduZWRfZmlsZSA9IHBheWxvYWRfc2lnbmVyLlNpZ24oaW5wdXRfZmlsZSkKKworICAgIHZlcmlmeV9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCBzZWxmLlNJR05FRF9TSUdGSUxFKQorICAgIHNlbGYuX2Fzc2VydEZpbGVzRXF1YWwodmVyaWZ5X2ZpbGUsIHNpZ25lZF9maWxlKQorCisgIGRlZiB0ZXN0X1NpZ25fd2l0aEV4dGVybmFsU2lnbmVyX3NjcmlwdChzZWxmKToKKyAgICAiIiJVc2VzIHRlc3RkYXRhL3BheWxvYWRfc2lnbmVyLnNoIGFzIHRoZSBleHRlcm5hbCBwYXlsb2FkIHNpZ25lci4iIiIKKyAgICBjb21tb24uT1BUSU9OUy5wYXlsb2FkX3NpZ25lciA9IG9zLnBhdGguam9pbigKKyAgICAgICAgc2VsZi50ZXN0ZGF0YV9kaXIsICdwYXlsb2FkX3NpZ25lci5zaCcpCisgICAgY29tbW9uLk9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IFsKKyAgICAgICAgb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleS5wazgnKV0KKyAgICBwYXlsb2FkX3NpZ25lciA9IFBheWxvYWRTaWduZXIoKQorICAgIGlucHV0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsIHNlbGYuU0lHRklMRSkKKyAgICBzaWduZWRfZmlsZSA9IHBheWxvYWRfc2lnbmVyLlNpZ24oaW5wdXRfZmlsZSkKKworICAgIHZlcmlmeV9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCBzZWxmLlNJR05FRF9TSUdGSUxFKQorICAgIHNlbGYuX2Fzc2VydEZpbGVzRXF1YWwodmVyaWZ5X2ZpbGUsIHNpZ25lZF9maWxlKQorCisKK2NsYXNzIFBheWxvYWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi50ZXN0ZGF0YV9kaXIgPSB0ZXN0X3V0aWxzLmdldF90ZXN0ZGF0YV9kaXIoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLnRlc3RkYXRhX2RpcikpCisKKyAgICBjb21tb24uT1BUSU9OUy53aXBlX3VzZXJfZGF0YSA9IEZhbHNlCisgICAgY29tbW9uLk9QVElPTlMucGF5bG9hZF9zaWduZXIgPSBOb25lCisgICAgY29tbW9uLk9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyA9IE5vbmUKKyAgICBjb21tb24uT1BUSU9OUy5wYWNrYWdlX2tleSA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXknKQorICAgIGNvbW1vbi5PUFRJT05TLmtleV9wYXNzd29yZHMgPSB7CisgICAgICAgIGNvbW1vbi5PUFRJT05TLnBhY2thZ2Vfa2V5IDogTm9uZSwKKyAgICB9CisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIGNvbW1vbi5DbGVhbnVwKCkKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBfY3JlYXRlX3BheWxvYWRfZnVsbChzZWNvbmRhcnk9RmFsc2UpOgorICAgIHRhcmdldF9maWxlID0gY29uc3RydWN0X3RhcmdldF9maWxlcyhzZWNvbmRhcnkpCisgICAgcGF5bG9hZCA9IFBheWxvYWQoc2Vjb25kYXJ5KQorICAgIHBheWxvYWQuR2VuZXJhdGUodGFyZ2V0X2ZpbGUpCisgICAgcmV0dXJuIHBheWxvYWQKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBfY3JlYXRlX3BheWxvYWRfaW5jcmVtZW50YWwoKToKKyAgICB0YXJnZXRfZmlsZSA9IGNvbnN0cnVjdF90YXJnZXRfZmlsZXMoKQorICAgIHNvdXJjZV9maWxlID0gY29uc3RydWN0X3RhcmdldF9maWxlcygpCisgICAgcGF5bG9hZCA9IFBheWxvYWQoKQorICAgIHBheWxvYWQuR2VuZXJhdGUodGFyZ2V0X2ZpbGUsIHNvdXJjZV9maWxlKQorICAgIHJldHVybiBwYXlsb2FkCisKKyAgZGVmIHRlc3RfR2VuZXJhdGVfZnVsbChzZWxmKToKKyAgICBwYXlsb2FkID0gc2VsZi5fY3JlYXRlX3BheWxvYWRfZnVsbCgpCisgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHBheWxvYWQucGF5bG9hZF9maWxlKSkKKworICBkZWYgdGVzdF9HZW5lcmF0ZV9pbmNyZW1lbnRhbChzZWxmKToKKyAgICBwYXlsb2FkID0gc2VsZi5fY3JlYXRlX3BheWxvYWRfaW5jcmVtZW50YWwoKQorICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhwYXlsb2FkLnBheWxvYWRfZmlsZSkpCisKKyAgZGVmIHRlc3RfR2VuZXJhdGVfYWRkaXRpb25hbEFyZ3Moc2VsZik6CisgICAgdGFyZ2V0X2ZpbGUgPSBjb25zdHJ1Y3RfdGFyZ2V0X2ZpbGVzKCkKKyAgICBzb3VyY2VfZmlsZSA9IGNvbnN0cnVjdF90YXJnZXRfZmlsZXMoKQorICAgIHBheWxvYWQgPSBQYXlsb2FkKCkKKyAgICAjIFRoaXMgc2hvdWxkIHdvcmsgdGhlIHNhbWUgYXMgY2FsbGluZyBwYXlsb2FkLkdlbmVyYXRlKHRhcmdldF9maWxlLAorICAgICMgc291cmNlX2ZpbGUpLgorICAgIHBheWxvYWQuR2VuZXJhdGUoCisgICAgICAgIHRhcmdldF9maWxlLCBhZGRpdGlvbmFsX2FyZ3M9WyItLXNvdXJjZV9pbWFnZSIsIHNvdXJjZV9maWxlXSkKKyAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMocGF5bG9hZC5wYXlsb2FkX2ZpbGUpKQorCisgIGRlZiB0ZXN0X0dlbmVyYXRlX2ludmFsaWRJbnB1dChzZWxmKToKKyAgICB0YXJnZXRfZmlsZSA9IGNvbnN0cnVjdF90YXJnZXRfZmlsZXMoKQorICAgIGNvbW1vbi5aaXBEZWxldGUodGFyZ2V0X2ZpbGUsICdJTUFHRVMvdmVuZG9yLmltZycpCisgICAgcGF5bG9hZCA9IFBheWxvYWQoKQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBwYXlsb2FkLkdlbmVyYXRlLCB0YXJnZXRfZmlsZSkKKworICBkZWYgdGVzdF9TaWduX2Z1bGwoc2VsZik6CisgICAgcGF5bG9hZCA9IHNlbGYuX2NyZWF0ZV9wYXlsb2FkX2Z1bGwoKQorICAgIHBheWxvYWQuU2lnbihQYXlsb2FkU2lnbmVyKCkpCisKKyAgICBvdXRwdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSwgJ3cnKSBhcyBvdXRwdXRfemlwOgorICAgICAgcGF5bG9hZC5Xcml0ZVRvWmlwKG91dHB1dF96aXApCisKKyAgICBpbXBvcnQgY2hlY2tfb3RhX3BhY2thZ2Vfc2lnbmF0dXJlCisgICAgY2hlY2tfb3RhX3BhY2thZ2Vfc2lnbmF0dXJlLlZlcmlmeUFiT3RhUGF5bG9hZCgKKyAgICAgICAgb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleS54NTA5LnBlbScpLAorICAgICAgICBvdXRwdXRfZmlsZSkKKworICBkZWYgdGVzdF9TaWduX2luY3JlbWVudGFsKHNlbGYpOgorICAgIHBheWxvYWQgPSBzZWxmLl9jcmVhdGVfcGF5bG9hZF9pbmNyZW1lbnRhbCgpCisgICAgcGF5bG9hZC5TaWduKFBheWxvYWRTaWduZXIoKSkKKworICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBwYXlsb2FkLldyaXRlVG9aaXAob3V0cHV0X3ppcCkKKworICAgIGltcG9ydCBjaGVja19vdGFfcGFja2FnZV9zaWduYXR1cmUKKyAgICBjaGVja19vdGFfcGFja2FnZV9zaWduYXR1cmUuVmVyaWZ5QWJPdGFQYXlsb2FkKAorICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5Lng1MDkucGVtJyksCisgICAgICAgIG91dHB1dF9maWxlKQorCisgIGRlZiB0ZXN0X1NpZ25fd2l0aERhdGFXaXBlKHNlbGYpOgorICAgIGNvbW1vbi5PUFRJT05TLndpcGVfdXNlcl9kYXRhID0gVHJ1ZQorICAgIHBheWxvYWQgPSBzZWxmLl9jcmVhdGVfcGF5bG9hZF9mdWxsKCkKKyAgICBwYXlsb2FkLlNpZ24oUGF5bG9hZFNpZ25lcigpKQorCisgICAgd2l0aCBvcGVuKHBheWxvYWQucGF5bG9hZF9wcm9wZXJ0aWVzKSBhcyBwcm9wZXJ0aWVzX2ZwOgorICAgICAgc2VsZi5hc3NlcnRJbigiUE9XRVJXQVNIPTEiLCBwcm9wZXJ0aWVzX2ZwLnJlYWQoKSkKKworICBkZWYgdGVzdF9TaWduX3NlY29uZGFyeShzZWxmKToKKyAgICBwYXlsb2FkID0gc2VsZi5fY3JlYXRlX3BheWxvYWRfZnVsbChzZWNvbmRhcnk9VHJ1ZSkKKyAgICBwYXlsb2FkLlNpZ24oUGF5bG9hZFNpZ25lcigpKQorCisgICAgd2l0aCBvcGVuKHBheWxvYWQucGF5bG9hZF9wcm9wZXJ0aWVzKSBhcyBwcm9wZXJ0aWVzX2ZwOgorICAgICAgc2VsZi5hc3NlcnRJbigiU1dJVENIX1NMT1RfT05fUkVCT09UPTAiLCBwcm9wZXJ0aWVzX2ZwLnJlYWQoKSkKKworICBkZWYgdGVzdF9TaWduX2JhZFNpZ25lcihzZWxmKToKKyAgICAiIiJUZXN0cyB0aGF0IHNpZ25pbmcgZmFpbHVyZSBjYW4gYmUgY2FwdHVyZWQuIiIiCisgICAgcGF5bG9hZCA9IHNlbGYuX2NyZWF0ZV9wYXlsb2FkX2Z1bGwoKQorICAgIHBheWxvYWRfc2lnbmVyID0gUGF5bG9hZFNpZ25lcigpCisgICAgcGF5bG9hZF9zaWduZXIuc2lnbmVyX2FyZ3MuYXBwZW5kKCdiYWQtb3B0aW9uJykKKyAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgcGF5bG9hZC5TaWduLCBwYXlsb2FkX3NpZ25lcikKKworICBkZWYgdGVzdF9Xcml0ZVRvWmlwKHNlbGYpOgorICAgIHBheWxvYWQgPSBzZWxmLl9jcmVhdGVfcGF5bG9hZF9mdWxsKCkKKyAgICBwYXlsb2FkLlNpZ24oUGF5bG9hZFNpZ25lcigpKQorCisgICAgb3V0cHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICd3JykgYXMgb3V0cHV0X3ppcDoKKyAgICAgIHBheWxvYWQuV3JpdGVUb1ppcChvdXRwdXRfemlwKQorCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUpIGFzIHZlcmlmeV96aXA6CisgICAgICAjIEZpcnN0IG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBlc3NlbnRpYWwgZW50cmllcy4KKyAgICAgIG5hbWVsaXN0ID0gdmVyaWZ5X3ppcC5uYW1lbGlzdCgpCisgICAgICBzZWxmLmFzc2VydEluKFBheWxvYWQuUEFZTE9BRF9CSU4sIG5hbWVsaXN0KQorICAgICAgc2VsZi5hc3NlcnRJbihQYXlsb2FkLlBBWUxPQURfUFJPUEVSVElFU19UWFQsIG5hbWVsaXN0KQorCisgICAgICAjIFRoZW4gYXNzZXJ0IHRoZXNlIGVudHJpZXMgYXJlIHN0b3JlZC4KKyAgICAgIGZvciBlbnRyeV9pbmZvIGluIHZlcmlmeV96aXAuaW5mb2xpc3QoKToKKyAgICAgICAgaWYgZW50cnlfaW5mby5maWxlbmFtZSBub3QgaW4gKFBheWxvYWQuUEFZTE9BRF9CSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkLlBBWUxPQURfUFJPUEVSVElFU19UWFQpOgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZmlsZS5aSVBfU1RPUkVELCBlbnRyeV9pbmZvLmNvbXByZXNzX3R5cGUpCisKKyAgZGVmIHRlc3RfV3JpdGVUb1ppcF91bnNpZ25lZFBheWxvYWQoc2VsZik6CisgICAgIiIiVW5zaWduZWQgcGF5bG9hZHMgc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIGJlIHdyaXR0ZW4gdG8gemlwLiIiIgorICAgIHBheWxvYWQgPSBzZWxmLl9jcmVhdGVfcGF5bG9hZF9mdWxsKCkKKworICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlLCAndycpIGFzIG91dHB1dF96aXA6CisgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgcGF5bG9hZC5Xcml0ZVRvWmlwLCBvdXRwdXRfemlwKQorCisgICAgIyBBbHNvIHRlc3Qgd2l0aCBpbmNyZW1lbnRhbCBwYXlsb2FkLgorICAgIHBheWxvYWQgPSBzZWxmLl9jcmVhdGVfcGF5bG9hZF9pbmNyZW1lbnRhbCgpCisKKyAgICBvdXRwdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSwgJ3cnKSBhcyBvdXRwdXRfemlwOgorICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIHBheWxvYWQuV3JpdGVUb1ppcCwgb3V0cHV0X3ppcCkKKworICBkZWYgdGVzdF9Xcml0ZVRvWmlwX3NlY29uZGFyeShzZWxmKToKKyAgICBwYXlsb2FkID0gc2VsZi5fY3JlYXRlX3BheWxvYWRfZnVsbChzZWNvbmRhcnk9VHJ1ZSkKKyAgICBwYXlsb2FkLlNpZ24oUGF5bG9hZFNpZ25lcigpKQorCisgICAgb3V0cHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICd3JykgYXMgb3V0cHV0X3ppcDoKKyAgICAgIHBheWxvYWQuV3JpdGVUb1ppcChvdXRwdXRfemlwKQorCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUpIGFzIHZlcmlmeV96aXA6CisgICAgICAjIEZpcnN0IG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBlc3NlbnRpYWwgZW50cmllcy4KKyAgICAgIG5hbWVsaXN0ID0gdmVyaWZ5X3ppcC5uYW1lbGlzdCgpCisgICAgICBzZWxmLmFzc2VydEluKFBheWxvYWQuU0VDT05EQVJZX1BBWUxPQURfQklOLCBuYW1lbGlzdCkKKyAgICAgIHNlbGYuYXNzZXJ0SW4oUGF5bG9hZC5TRUNPTkRBUllfUEFZTE9BRF9QUk9QRVJUSUVTX1RYVCwgbmFtZWxpc3QpCisKKyAgICAgICMgVGhlbiBhc3NlcnQgdGhlc2UgZW50cmllcyBhcmUgc3RvcmVkLgorICAgICAgZm9yIGVudHJ5X2luZm8gaW4gdmVyaWZ5X3ppcC5pbmZvbGlzdCgpOgorICAgICAgICBpZiBlbnRyeV9pbmZvLmZpbGVuYW1lIG5vdCBpbiAoCisgICAgICAgICAgICBQYXlsb2FkLlNFQ09OREFSWV9QQVlMT0FEX0JJTiwKKyAgICAgICAgICAgIFBheWxvYWQuU0VDT05EQVJZX1BBWUxPQURfUFJPUEVSVElFU19UWFQpOgorICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZmlsZS5aSVBfU1RPUkVELCBlbnRyeV9pbmZvLmNvbXByZXNzX3R5cGUpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9zaWduX3RhcmdldF9maWxlc19hcGtzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmY5ZTEwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3Rfc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQpAQCAtMCwwICsxLDIxMyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgemlwZmlsZQorCitpbXBvcnQgY29tbW9uCitpbXBvcnQgdGVzdF91dGlscworZnJvbSBzaWduX3RhcmdldF9maWxlc19hcGtzIGltcG9ydCAoCisgICAgRWRpdFRhZ3MsIFJlcGxhY2VDZXJ0cywgUmVwbGFjZVZlcml0eUtleUlkLCBSZXdyaXRlUHJvcHMpCisKKworY2xhc3MgU2lnblRhcmdldEZpbGVzQXBrc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgIE1BQ19QRVJNSVNTSU9OU19YTUwgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Cis8cG9saWN5PgorICA8c2lnbmVyIHNpZ25hdHVyZT0ie30iPjxzZWluZm8gdmFsdWU9InBsYXRmb3JtIi8+PC9zaWduZXI+CisgIDxzaWduZXIgc2lnbmF0dXJlPSJ7fSI+PHNlaW5mbyB2YWx1ZT0ibWVkaWEiLz48L3NpZ25lcj4KKzwvcG9saWN5PiIiIgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLnRlc3RkYXRhX2RpciA9IHRlc3RfdXRpbHMuZ2V0X3Rlc3RkYXRhX2RpcigpCisKKyAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgIGNvbW1vbi5DbGVhbnVwKCkKKworICBkZWYgdGVzdF9FZGl0VGFncyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFsKEVkaXRUYWdzKCdkZXYta2V5cycpLCAoJ3JlbGVhc2Uta2V5cycpKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRWRpdFRhZ3MoJ3Rlc3Qta2V5cycpLCAoJ3JlbGVhc2Uta2V5cycpKQorCisgICAgIyBNdWx0aXBsZSB0YWdzLgorICAgIHNlbGYuYXNzZXJ0RXF1YWwoRWRpdFRhZ3MoJ2FiYyxkZXYta2V5cyx4eXonKSwgKCdhYmMscmVsZWFzZS1rZXlzLHh5eicpKQorCisgICAgIyBUYWdzIGFyZSBzb3J0ZWQuCisgICAgc2VsZi5hc3NlcnRFcXVhbChFZGl0VGFncygneHl6LGFiYyxkZXYta2V5cyx4eXonKSwgKCdhYmMscmVsZWFzZS1rZXlzLHh5eicpKQorCisgIGRlZiB0ZXN0X1Jld3JpdGVQcm9wcyhzZWxmKToKKyAgICBwcm9wcyA9ICgKKyAgICAgICAgKCcnLCAnXG4nKSwKKyAgICAgICAgKCdyby5idWlsZC5maW5nZXJwcmludD1mb28vYmFyL2Rldi1rZXlzJywKKyAgICAgICAgICdyby5idWlsZC5maW5nZXJwcmludD1mb28vYmFyL3JlbGVhc2Uta2V5c1xuJyksCisgICAgICAgICgncm8uYnVpbGQudGh1bWJwcmludD1mb28vYmFyL2Rldi1rZXlzJywKKyAgICAgICAgICdyby5idWlsZC50aHVtYnByaW50PWZvby9iYXIvcmVsZWFzZS1rZXlzXG4nKSwKKyAgICAgICAgKCdyby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQ9Zm9vL2Jhci9kZXYta2V5cycsCisgICAgICAgICAncm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50PWZvby9iYXIvcmVsZWFzZS1rZXlzXG4nKSwKKyAgICAgICAgKCdyby52ZW5kb3IuYnVpbGQudGh1bWJwcmludD1mb28vYmFyL2Rldi1rZXlzJywKKyAgICAgICAgICdyby52ZW5kb3IuYnVpbGQudGh1bWJwcmludD1mb28vYmFyL3JlbGVhc2Uta2V5c1xuJyksCisgICAgICAgICgnIyBjb21tZW50IGxpbmUgMScsICcjIGNvbW1lbnQgbGluZSAxXG4nKSwKKyAgICAgICAgKCdyby5ib290aW1hZ2UuYnVpbGQuZmluZ2VycHJpbnQ9Zm9vL2Jhci9kZXYta2V5cycsCisgICAgICAgICAncm8uYm9vdGltYWdlLmJ1aWxkLmZpbmdlcnByaW50PWZvby9iYXIvcmVsZWFzZS1rZXlzXG4nKSwKKyAgICAgICAgKCdyby5idWlsZC5kZXNjcmlwdGlvbj0nCisgICAgICAgICAnc2FpbGZpc2gtdXNlciA4LjAuMCBPUFI2LjE3MDYyMy4wMTIgNDI4MzQyOCBkZXYta2V5cycsCisgICAgICAgICAncm8uYnVpbGQuZGVzY3JpcHRpb249JworICAgICAgICAgJ3NhaWxmaXNoLXVzZXIgOC4wLjAgT1BSNi4xNzA2MjMuMDEyIDQyODM0MjggcmVsZWFzZS1rZXlzXG4nKSwKKyAgICAgICAgKCdyby5idWlsZC50YWdzPWRldi1rZXlzJywgJ3JvLmJ1aWxkLnRhZ3M9cmVsZWFzZS1rZXlzXG4nKSwKKyAgICAgICAgKCcjIGNvbW1lbnQgbGluZSAyJywgJyMgY29tbWVudCBsaW5lIDJcbicpLAorICAgICAgICAoJ3JvLmJ1aWxkLmRpc3BsYXkuaWQ9T1BSNi4xNzA2MjMuMDEyIGRldi1rZXlzJywKKyAgICAgICAgICdyby5idWlsZC5kaXNwbGF5LmlkPU9QUjYuMTcwNjIzLjAxMlxuJyksCisgICAgICAgICgnIyBjb21tZW50IGxpbmUgMycsICcjIGNvbW1lbnQgbGluZSAzXG4nKSwKKyAgICApCisKKyAgICAjIEFzc2VydCB0aGUgY2FzZSBmb3IgZWFjaCBpbmRpdmlkdWFsIGxpbmUuCisgICAgZm9yIHByb3AsIG91dHB1dCBpbiBwcm9wczoKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmV3cml0ZVByb3BzKHByb3ApLCBvdXRwdXQpCisKKyAgICAjIENvbmNhdGVuYXRlIGFsbCB0aGUgaW5wdXQgbGluZXMuCisgICAgc2VsZi5hc3NlcnRFcXVhbChSZXdyaXRlUHJvcHMoJ1xuJy5qb2luKFtwcm9wWzBdIGZvciBwcm9wIGluIHByb3BzXSkpLAorICAgICAgICAgICAgICAgICAgICAgJycuam9pbihbcHJvcFsxXSBmb3IgcHJvcCBpbiBwcm9wc10pKQorCisgIGRlZiB0ZXN0X1JlcGxhY2VWZXJpdHlLZXlJZChzZWxmKToKKyAgICBCT09UX0NNRExJTkUxID0gKAorICAgICAgICAiY29uc29sZT10dHlIU0wwLDExNTIwMCxuOCBhbmRyb2lkYm9vdC5jb25zb2xlPXR0eUhTTDAgIgorICAgICAgICAiYW5kcm9pZGJvb3QuaGFyZHdhcmU9bWFybGluIHVzZXJfZGVidWc9MzEgZWhjaS1oY2QucGFyaz0zICIKKyAgICAgICAgImxwbV9sZXZlbHMuc2xlZXBfZGlzYWJsZWQ9MSBjbWE9MzJNQDAtMHhmZmZmZmZmZiBsb29wLm1heF9wYXJ0PTcgIgorICAgICAgICAiYnVpbGR2YXJpYW50PXVzZXJkZWJ1ZyAiCisgICAgICAgICJ2ZXJpdHlrZXlpZD1pZDo3ZTQzMzNmOWJiYTAwYWRmZTBlZGU5NzllMjhlZDE5MjA0OTJiNDBmXG4iKQorCisgICAgQk9PVF9DTURMSU5FMiA9ICgKKyAgICAgICAgImNvbnNvbGU9dHR5SFNMMCwxMTUyMDAsbjggYW5kcm9pZGJvb3QuY29uc29sZT10dHlIU0wwICIKKyAgICAgICAgImFuZHJvaWRib290LmhhcmR3YXJlPW1hcmxpbiB1c2VyX2RlYnVnPTMxIGVoY2ktaGNkLnBhcms9MyAiCisgICAgICAgICJscG1fbGV2ZWxzLnNsZWVwX2Rpc2FibGVkPTEgY21hPTMyTUAwLTB4ZmZmZmZmZmYgbG9vcC5tYXhfcGFydD03ICIKKyAgICAgICAgImJ1aWxkdmFyaWFudD11c2VyZGVidWcgIgorICAgICAgICAidmVyaXR5a2V5aWQ9aWQ6ZDI0ZjI1OTBlOWFiYWI1Y2ZmNWY1OWRhNGM0ZjAzNjZlM2Y0M2U5NFxuIikKKworICAgIGlucHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgJ3cnKSBhcyBpbnB1dF96aXA6CisgICAgICBpbnB1dF96aXAud3JpdGVzdHIoJ0JPT1QvY21kbGluZScsIEJPT1RfQ01ETElORTEpCisKKyAgICAjIFRlc3Qgd2l0aCB0aGUgZmlyc3QgY2VydGlmaWNhdGUuCisgICAgY2VydF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndmVyaXR5Lng1MDkucGVtJykKKworICAgIG91dHB1dF9maWxlID0gY29tbW9uLk1ha2VUZW1wRmlsZShzdWZmaXg9Jy56aXAnKQorICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsICdyJykgYXMgaW5wdXRfemlwLCBcCisgICAgICAgICB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICd3JykgYXMgb3V0cHV0X3ppcDoKKyAgICAgIFJlcGxhY2VWZXJpdHlLZXlJZChpbnB1dF96aXAsIG91dHB1dF96aXAsIGNlcnRfZmlsZSkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlKSBhcyBvdXRwdXRfemlwOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChCT09UX0NNRExJTkUxLCBvdXRwdXRfemlwLnJlYWQoJ0JPT1QvY21kbGluZScpKQorCisgICAgIyBUZXN0IHdpdGggdGhlIHNlY29uZCBjZXJ0aWZpY2F0ZS4KKyAgICBjZXJ0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICd0ZXN0a2V5Lng1MDkucGVtJykKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlucHV0X2ZpbGUsICdyJykgYXMgaW5wdXRfemlwLCBcCisgICAgICAgICB6aXBmaWxlLlppcEZpbGUob3V0cHV0X2ZpbGUsICd3JykgYXMgb3V0cHV0X3ppcDoKKyAgICAgIFJlcGxhY2VWZXJpdHlLZXlJZChpbnB1dF96aXAsIG91dHB1dF96aXAsIGNlcnRfZmlsZSkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlKSBhcyBvdXRwdXRfemlwOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChCT09UX0NNRExJTkUyLCBvdXRwdXRfemlwLnJlYWQoJ0JPT1QvY21kbGluZScpKQorCisgIGRlZiB0ZXN0X1JlcGxhY2VWZXJpdHlLZXlJZF9ub192ZXJpdHlrZXlpZChzZWxmKToKKyAgICBCT09UX0NNRExJTkUgPSAoCisgICAgICAgICJjb25zb2xlPXR0eUhTTDAsMTE1MjAwLG44IGFuZHJvaWRib290LmhhcmR3YXJlPWJ1bGxoZWFkIGJvb3RfY3B1cz0wLTUgIgorICAgICAgICAibHBtX2xldmVscy5zbGVlcF9kaXNhYmxlZD0xIG1zbV9wb3dlcm9mZi5kb3dubG9hZF9tb2RlPTAgIgorICAgICAgICAibG9vcC5tYXhfcGFydD03XG4iKQorCisgICAgaW5wdXRfZmlsZSA9IGNvbW1vbi5NYWtlVGVtcEZpbGUoc3VmZml4PScuemlwJykKKyAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShpbnB1dF9maWxlLCAndycpIGFzIGlucHV0X3ppcDoKKyAgICAgIGlucHV0X3ppcC53cml0ZXN0cignQk9PVC9jbWRsaW5lJywgQk9PVF9DTURMSU5FKQorCisgICAgb3V0cHV0X2ZpbGUgPSBjb21tb24uTWFrZVRlbXBGaWxlKHN1ZmZpeD0nLnppcCcpCisgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW5wdXRfZmlsZSwgJ3InKSBhcyBpbnB1dF96aXAsIFwKKyAgICAgICAgIHppcGZpbGUuWmlwRmlsZShvdXRwdXRfZmlsZSwgJ3cnKSBhcyBvdXRwdXRfemlwOgorICAgICAgUmVwbGFjZVZlcml0eUtleUlkKGlucHV0X3ppcCwgb3V0cHV0X3ppcCwgTm9uZSkKKworICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKG91dHB1dF9maWxlKSBhcyBvdXRwdXRfemlwOgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChCT09UX0NNRExJTkUsIG91dHB1dF96aXAucmVhZCgnQk9PVC9jbWRsaW5lJykpCisKKyAgZGVmIHRlc3RfUmVwbGFjZUNlcnRzKHNlbGYpOgorICAgIGNlcnQxX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICdwbGF0Zm9ybS54NTA5LnBlbScpCisgICAgd2l0aCBvcGVuKGNlcnQxX3BhdGgpIGFzIGNlcnQxX2ZwOgorICAgICAgY2VydDEgPSBjZXJ0MV9mcC5yZWFkKCkKKyAgICBjZXJ0Ml9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAnbWVkaWEueDUwOS5wZW0nKQorICAgIHdpdGggb3BlbihjZXJ0Ml9wYXRoKSBhcyBjZXJ0Ml9mcDoKKyAgICAgIGNlcnQyID0gY2VydDJfZnAucmVhZCgpCisgICAgY2VydDNfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3Rlc3RrZXkueDUwOS5wZW0nKQorICAgIHdpdGggb3BlbihjZXJ0M19wYXRoKSBhcyBjZXJ0M19mcDoKKyAgICAgIGNlcnQzID0gY2VydDNfZnAucmVhZCgpCisKKyAgICAjIFJlcGxhY2UgY2VydDEgd2l0aCBjZXJ0My4KKyAgICBpbnB1dF94bWwgPSBzZWxmLk1BQ19QRVJNSVNTSU9OU19YTUwuZm9ybWF0KAorICAgICAgICBiYXNlNjQuYjE2ZW5jb2RlKGNvbW1vbi5QYXJzZUNlcnRpZmljYXRlKGNlcnQxKSkubG93ZXIoKSwKKyAgICAgICAgYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShjZXJ0MikpLmxvd2VyKCkpCisKKyAgICBvdXRwdXRfeG1sID0gc2VsZi5NQUNfUEVSTUlTU0lPTlNfWE1MLmZvcm1hdCgKKyAgICAgICAgYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShjZXJ0MykpLmxvd2VyKCksCisgICAgICAgIGJhc2U2NC5iMTZlbmNvZGUoY29tbW9uLlBhcnNlQ2VydGlmaWNhdGUoY2VydDIpKS5sb3dlcigpKQorCisgICAgY29tbW9uLk9QVElPTlMua2V5X21hcCA9IHsKKyAgICAgICAgY2VydDFfcGF0aFs6LTldIDogY2VydDNfcGF0aFs6LTldLAorICAgIH0KKworICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0X3htbCwgUmVwbGFjZUNlcnRzKGlucHV0X3htbCkpCisKKyAgZGVmIHRlc3RfUmVwbGFjZUNlcnRzX2R1cGxpY2F0ZUVudHJpZXMoc2VsZik6CisgICAgY2VydDFfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3BsYXRmb3JtLng1MDkucGVtJykKKyAgICB3aXRoIG9wZW4oY2VydDFfcGF0aCkgYXMgY2VydDFfZnA6CisgICAgICBjZXJ0MSA9IGNlcnQxX2ZwLnJlYWQoKQorICAgIGNlcnQyX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICdtZWRpYS54NTA5LnBlbScpCisgICAgd2l0aCBvcGVuKGNlcnQyX3BhdGgpIGFzIGNlcnQyX2ZwOgorICAgICAgY2VydDIgPSBjZXJ0Ml9mcC5yZWFkKCkKKworICAgICMgUmVwbGFjZSBjZXJ0MSB3aXRoIGNlcnQyLCB3aGljaCBsZWFkcyB0byBkdXBsaWNhdGUgZW50cmllcy4KKyAgICBpbnB1dF94bWwgPSBzZWxmLk1BQ19QRVJNSVNTSU9OU19YTUwuZm9ybWF0KAorICAgICAgICBiYXNlNjQuYjE2ZW5jb2RlKGNvbW1vbi5QYXJzZUNlcnRpZmljYXRlKGNlcnQxKSkubG93ZXIoKSwKKyAgICAgICAgYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShjZXJ0MikpLmxvd2VyKCkpCisKKyAgICBjb21tb24uT1BUSU9OUy5rZXlfbWFwID0geworICAgICAgICBjZXJ0MV9wYXRoWzotOV0gOiBjZXJ0Ml9wYXRoWzotOV0sCisgICAgfQorICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBSZXBsYWNlQ2VydHMsIGlucHV0X3htbCkKKworICBkZWYgdGVzdF9SZXBsYWNlQ2VydHNfc2tpcE5vbkV4aXN0ZW50Q2VydHMoc2VsZik6CisgICAgY2VydDFfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkYXRhX2RpciwgJ3BsYXRmb3JtLng1MDkucGVtJykKKyAgICB3aXRoIG9wZW4oY2VydDFfcGF0aCkgYXMgY2VydDFfZnA6CisgICAgICBjZXJ0MSA9IGNlcnQxX2ZwLnJlYWQoKQorICAgIGNlcnQyX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGF0YV9kaXIsICdtZWRpYS54NTA5LnBlbScpCisgICAgd2l0aCBvcGVuKGNlcnQyX3BhdGgpIGFzIGNlcnQyX2ZwOgorICAgICAgY2VydDIgPSBjZXJ0Ml9mcC5yZWFkKCkKKyAgICBjZXJ0M19wYXRoID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRhdGFfZGlyLCAndGVzdGtleS54NTA5LnBlbScpCisgICAgd2l0aCBvcGVuKGNlcnQzX3BhdGgpIGFzIGNlcnQzX2ZwOgorICAgICAgY2VydDMgPSBjZXJ0M19mcC5yZWFkKCkKKworICAgIGlucHV0X3htbCA9IHNlbGYuTUFDX1BFUk1JU1NJT05TX1hNTC5mb3JtYXQoCisgICAgICAgIGJhc2U2NC5iMTZlbmNvZGUoY29tbW9uLlBhcnNlQ2VydGlmaWNhdGUoY2VydDEpKS5sb3dlcigpLAorICAgICAgICBiYXNlNjQuYjE2ZW5jb2RlKGNvbW1vbi5QYXJzZUNlcnRpZmljYXRlKGNlcnQyKSkubG93ZXIoKSkKKworICAgIG91dHB1dF94bWwgPSBzZWxmLk1BQ19QRVJNSVNTSU9OU19YTUwuZm9ybWF0KAorICAgICAgICBiYXNlNjQuYjE2ZW5jb2RlKGNvbW1vbi5QYXJzZUNlcnRpZmljYXRlKGNlcnQzKSkubG93ZXIoKSwKKyAgICAgICAgYmFzZTY0LmIxNmVuY29kZShjb21tb24uUGFyc2VDZXJ0aWZpY2F0ZShjZXJ0MikpLmxvd2VyKCkpCisKKyAgICBjb21tb24uT1BUSU9OUy5rZXlfbWFwID0geworICAgICAgICBjZXJ0MV9wYXRoWzotOV0gOiBjZXJ0M19wYXRoWzotOV0sCisgICAgICAgICdub24tZXhpc3RlbnQnIDogY2VydDNfcGF0aFs6LTldLAorICAgICAgICBjZXJ0Ml9wYXRoWzotOV0gOiAnbm9uLWV4aXN0ZW50JywKKyAgICB9CisgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXRfeG1sLCBSZXBsYWNlQ2VydHMoaW5wdXRfeG1sKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3V0aWxzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0MzU1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X3V0aWxzLnB5CkBAIC0wLDAgKzEsOTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyIiIgorVXRpbHMgZm9yIHJ1bm5pbmcgdW5pdHRlc3RzLgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzdHJ1Y3QKKworaW1wb3J0IGNvbW1vbgorCisKK2RlZiBnZXRfdGVzdGRhdGFfZGlyKCk6CisgICIiIlJldHVybnMgdGhlIHRlc3RkYXRhIGRpciwgaW4gcmVsYXRpdmUgdG8gdGhlIHNjcmlwdCBkaXIuIiIiCisgICMgVGhlIHNjcmlwdCBkaXIgaXMgdGhlIG9uZSB3ZSB3YW50LCB3aGljaCBjb3VsZCBiZSBkaWZmZXJlbnQgZnJvbSBwd2QuCisgIGN1cnJlbnRfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKQorICByZXR1cm4gb3MucGF0aC5qb2luKGN1cnJlbnRfZGlyLCAndGVzdGRhdGEnKQorCisKK2RlZiBjb25zdHJ1Y3Rfc3BhcnNlX2ltYWdlKGNodW5rcyk6CisgICIiIlJldHVybnMgYSBzcGFyc2UgaW1hZ2UgZmlsZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBnaXZlbiBjaHVua3MuCisKKyAgRnJvbSBzeXN0ZW0vY29yZS9saWJzcGFyc2Uvc3BhcnNlX2Zvcm1hdC5oLgorICB0eXBlZGVmIHN0cnVjdCBzcGFyc2VfaGVhZGVyIHsKKyAgICBfX2xlMzIgbWFnaWM7ICAvLyAweGVkMjZmZjNhCisgICAgX19sZTE2IG1ham9yX3ZlcnNpb247ICAvLyAoMHgxKSAtIHJlamVjdCBpbWFnZXMgd2l0aCBoaWdoZXIgbWFqb3IgdmVyc2lvbnMKKyAgICBfX2xlMTYgbWlub3JfdmVyc2lvbjsgIC8vICgweDApIC0gYWxsb3cgaW1hZ2VzIHdpdGggaGlnZXIgbWlub3IgdmVyc2lvbnMKKyAgICBfX2xlMTYgZmlsZV9oZHJfc3o7ICAvLyAyOCBieXRlcyBmb3IgZmlyc3QgcmV2aXNpb24gb2YgdGhlIGZpbGUgZm9ybWF0CisgICAgX19sZTE2IGNodW5rX2hkcl9zejsgIC8vIDEyIGJ5dGVzIGZvciBmaXJzdCByZXZpc2lvbiBvZiB0aGUgZmlsZSBmb3JtYXQKKyAgICBfX2xlMzIgYmxrX3N6OyAgLy8gYmxvY2sgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKDQwOTYpCisgICAgX19sZTMyIHRvdGFsX2Jsa3M7ICAvLyB0b3RhbCBibG9ja3MgaW4gdGhlIG5vbi1zcGFyc2Ugb3V0cHV0IGltYWdlCisgICAgX19sZTMyIHRvdGFsX2NodW5rczsgIC8vIHRvdGFsIGNodW5rcyBpbiB0aGUgc3BhcnNlIGlucHV0IGltYWdlCisgICAgX19sZTMyIGltYWdlX2NoZWNrc3VtOyAgLy8gQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIG9yaWdpbmFsIGRhdGEsIGNvdW50aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImRvbid0IGNhcmUiIGFzIDAuIFN0YW5kYXJkIDgwMi4zIHBvbHlub21pYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGEgUHVibGljIERvbWFpbiB0YWJsZSBpbXBsZW1lbnRhdGlvbgorICB9IHNwYXJzZV9oZWFkZXJfdDsKKworICB0eXBlZGVmIHN0cnVjdCBjaHVua19oZWFkZXIgeworICAgIF9fbGUxNiBjaHVua190eXBlOyAgLy8gMHhDQUMxIC0+IHJhdzsgMHhDQUMyIC0+IGZpbGw7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAweENBQzMgLT4gZG9uJ3QgY2FyZQorICAgIF9fbGUxNiByZXNlcnZlZDE7CisgICAgX19sZTMyIGNodW5rX3N6OyAgLy8gaW4gYmxvY2tzIGluIG91dHB1dCBpbWFnZQorICAgIF9fbGUzMiB0b3RhbF9zejsgIC8vIGluIGJ5dGVzIG9mIGNodW5rIGlucHV0IGZpbGUgaW5jbHVkaW5nIGNodW5rIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkYXRhCisgIH0gY2h1bmtfaGVhZGVyX3Q7CisKKyAgQXJnczoKKyAgICBjaHVua3M6IEEgbGlzdCBvZiBjaHVua3MgdG8gYmUgd3JpdHRlbi4gRWFjaCBlbnRyeSBzaG91bGQgYmUgYSB0dXBsZSBvZgorICAgICAgICAoY2h1bmtfdHlwZSwgYmxvY2tfbnVtYmVyKS4KKworICBSZXR1cm5zOgorICAgIEZpbGVuYW1lIG9mIHRoZSBjcmVhdGVkIHNwYXJzZSBpbWFnZS4KKyAgIiIiCisgIFNQQVJTRV9IRUFERVJfTUFHSUMgPSAweEVEMjZGRjNBCisgIFNQQVJTRV9IRUFERVJfRk9STUFUID0gIjxJNEg0SSIKKyAgQ0hVTktfSEVBREVSX0ZPUk1BVCA9ICI8MkgySSIKKworICBzcGFyc2VfaW1hZ2UgPSBjb21tb24uTWFrZVRlbXBGaWxlKHByZWZpeD0nc3BhcnNlLScsIHN1ZmZpeD0nLmltZycpCisgIHdpdGggb3BlbihzcGFyc2VfaW1hZ2UsICd3YicpIGFzIGZwOgorICAgIGZwLndyaXRlKHN0cnVjdC5wYWNrKAorICAgICAgICBTUEFSU0VfSEVBREVSX0ZPUk1BVCwgU1BBUlNFX0hFQURFUl9NQUdJQywgMSwgMCwgMjgsIDEyLCA0MDk2LAorICAgICAgICBzdW0oY2h1bmtbMV0gZm9yIGNodW5rIGluIGNodW5rcyksCisgICAgICAgIGxlbihjaHVua3MpLCAwKSkKKworICAgIGZvciBjaHVuayBpbiBjaHVua3M6CisgICAgICBkYXRhX3NpemUgPSAwCisgICAgICBpZiBjaHVua1swXSA9PSAweENBQzE6CisgICAgICAgIGRhdGFfc2l6ZSA9IDQwOTYgKiBjaHVua1sxXQorICAgICAgZWxpZiBjaHVua1swXSA9PSAweENBQzI6CisgICAgICAgIGRhdGFfc2l6ZSA9IDQKKyAgICAgIGVsaWYgY2h1bmtbMF0gPT0gMHhDQUMzOgorICAgICAgICBwYXNzCisgICAgICBlbHNlOgorICAgICAgICBhc3NlcnQgRmFsc2UsICJVbnN1cHBvcnRlZCBjaHVuayB0eXBlOiB7fSIuZm9ybWF0KGNodW5rWzBdKQorCisgICAgICBmcC53cml0ZShzdHJ1Y3QucGFjaygKKyAgICAgICAgICBDSFVOS19IRUFERVJfRk9STUFULCBjaHVua1swXSwgMCwgY2h1bmtbMV0sIGRhdGFfc2l6ZSArIDEyKSkKKyAgICAgIGlmIGRhdGFfc2l6ZSAhPSAwOgorICAgICAgICBmcC53cml0ZShvcy51cmFuZG9tKGRhdGFfc2l6ZSkpCisKKyAgcmV0dXJuIHNwYXJzZV9pbWFnZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL21lZGlhLng1MDkucGVtIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL21lZGlhLng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Y2Q0NDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvbWVkaWEueDUwOS5wZW0KQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFcURDQ0E1Q2dBd0lCQWdJSkFQSzVqbUVqVnl4T01BMEdDU3FHU0liM0RRRUJCQVVBTUlHVU1Rc3dDUVlECitWUVFHRXdKVlV6RVRNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVFc5MWJuUmhhVzRnCitWbWxsZHpFUU1BNEdBMVVFQ2hNSFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3hNSFFXNWtjbTlwWkRFUU1BNEdBMVVFCitBeE1IUVc1a2NtOXBaREVpTUNBR0NTcUdTSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVEFlCitGdzB3T0RBME1UVXlNelF3TlRkYUZ3MHpOVEE1TURFeU16UXdOVGRhTUlHVU1Rc3dDUVlEVlFRR0V3SlZVekVUCitNQkVHQTFVRUNCTUtRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCeE1OVFc5MWJuUmhhVzRnVm1sbGR6RVFNQTRHCitBMVVFQ2hNSFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3hNSFFXNWtjbTlwWkRFUU1BNEdBMVVFQXhNSFFXNWtjbTlwCitaREVpTUNBR0NTcUdTSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVENDQVNBd0RRWUpLb1pJCitodmNOQVFFQkJRQURnZ0VOQURDQ0FRZ0NnZ0VCQUs0bERGb1c3NWY4S0dtc1pSc3lGOHcydWc2R2xrRm8xWW9FCituMERPaFlaeEk2UC90UGJaU2NNODh0bzZCY0krcktwWDJBT0lteGRadlBXZWZHOGhpUXJpVUlXMzdWYXFZbXdKCitpZStjelRZMkxLRG8wYmxnUDlUWU1vZG5rbXpNQ1F4b3QzV3VmL01KTk13Mm52S0ZXaVpuM3d4bWY5REh6MTJPCit1bVZZQm5OekE3dGlSeWJxdXUzN2N2QisxNmRxczh1YU9CeExmYzJBbXhRTmlSOEFJVHZrQWZXTmFnYW1IcTNECitxY0x4eGxaeWhiQ2E0Sk5DcG0ra0llcjVPdDkxYzZBb3d6SFhCZ0dyT3ZmTWhBTSt6bngzS2pwYmhyRGI2ZGQzCit3NlNLcVlBZTNPNG5nVmlmUk5ua0VUbDVZQVYycVpRUXVvRUpFbG5hMll4c2FQOTRTNDhDQVFPamdmd3dnZmt3CitIUVlEVlIwT0JCWUVGTW9wUEtxTHdPMCtWQzd2UWdXaXYvSzFmazExTUlISkJnTlZIU01FZ2NFd2diNkFGTW9wCitQS3FMd08wK1ZDN3ZRZ1dpdi9LMWZrMTFvWUdhcElHWE1JR1VNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFCitDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTlRXOTFiblJoYVc0Z1ZtbGxkekVRTUE0R0ExVUVDaE1ICitRVzVrY205cFpERVFNQTRHQTFVRUN4TUhRVzVrY205cFpERVFNQTRHQTFVRUF4TUhRVzVrY205cFpERWlNQ0FHCitDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YllJSkFQSzVqbUVqVnl4T01Bd0dBMVVkCitFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVFQlFBRGdnRUJBSVRlbFJiVjVLaHlGNmM5cUVod1NQVXpjNlgzCitNL09RMWh2ZlBNbmxKUllsdjhxbnd4V2NyaWRkRnlxYTRlaDIxVVdCSjZ4VUwyZ3BEZFVRd0FLZGoxSGc3aFZyCitlM3RhemJPVUpCdU94NHQwNWNRc1hLK3VGV3l2VzlHWm9qb25VazJnY3Q2NzQzaEdTbE0yTUxEazBQKzM0STdMCitjQit0dGplY2RFWi9iZ0RHN1lpRmxUZ0hrZ09IVmdCNGNzampBSHIwSTZWNkxLczZLQ2hwdGt4TGU5WDhHSDBLCitmaVFWbGwxYXJrNEhwdDkxRzBwMTZYazhrWXBoSzRITkMyS0s3Z0ZvM0VUa2V4RFRXVEpnaEoxcTMyMXlmY0pFCitSTUloMC9uc3cyakswSG1aOHJnUVc4SHlEVGpVRUdiTUZCSENWNmx1cERTZlYwWldWUWZrNkFJS0dvRT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9wYXlsb2FkX3NpZ25lci5zaCBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9wYXlsb2FkX3NpZ25lci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDRlZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3BheWxvYWRfc2lnbmVyLnNoCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKKyMgVGhlIHNjcmlwdCB3aWxsIGJlIGNhbGxlZCB3aXRoICdwYXlsb2FkX3NpZ25lci5zaCA8a2V5PiAtaW4gPGlucHV0PiAtb3V0IDxvdXRwdXQ+Jy4KK29wZW5zc2wgcGtleXV0bCAtc2lnbiAta2V5Zm9ybSBERVIgLWlua2V5ICQxIC1wa2V5b3B0IGRpZ2VzdDpzaGEyNTYgLWluICQzIC1vdXQgJDUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9wbGF0Zm9ybS54NTA5LnBlbSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9wbGF0Zm9ybS54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODdmMDJlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3BsYXRmb3JtLng1MDkucGVtCkBAIC0wLDAgKzEsMjcgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRXFEQ0NBNUNnQXdJQkFnSUpBTE9aZ0liUVZzLzZNQTBHQ1NxR1NJYjNEUUVCQkFVQU1JR1VNUXN3Q1FZRAorVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTlRXOTFiblJoYVc0ZworVm1sbGR6RVFNQTRHQTFVRUNoTUhRVzVrY205cFpERVFNQTRHQTFVRUN4TUhRVzVrY205cFpERVFNQTRHQTFVRQorQXhNSFFXNWtjbTlwWkRFaU1DQUdDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRBZQorRncwd09EQTBNVFV5TWpRd05UQmFGdzB6TlRBNU1ERXlNalF3TlRCYU1JR1VNUXN3Q1FZRFZRUUdFd0pWVXpFVAorTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnhNTlRXOTFiblJoYVc0Z1ZtbGxkekVRTUE0RworQTFVRUNoTUhRVzVrY205cFpERVFNQTRHQTFVRUN4TUhRVzVrY205cFpERVFNQTRHQTFVRUF4TUhRVzVrY205cAorWkRFaU1DQUdDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRDQ0FTQXdEUVlKS29aSQoraHZjTkFRRUJCUUFEZ2dFTkFEQ0NBUWdDZ2dFQkFKeDRCWktzRFYwNEhONnFaZXpJcGdCdU5rZ01iWElIc1NBUgordmxDR09xdml0VjBBbXQ5eFJ0YnlJQ0tBeDgxTmU5c21KRHVLZ0d3bXMwc1RkU09ra21naVNRVGNBVWsrZkFyUAorR2dYSWRQYWJBM3RnTUoyUWROSkNnT0ZyclNxSE5EWVpVZXIzS2tndENiSUVzWWRlRXF5WXdhcDNQV2dBdWVyOQorNVcxWXZ0am8yaGI1bzJBSm5EZW9OS2JmN2JlMnRFb0VuZ2VpYWZ6UExGU1c4czgyMWszNUNqdU5qelNqdXF0TQorOVROeHF5ZHhtenVsaDFTdERGUDhGT0hiUmRVZUkwKzc2VHlicE8zNXpsUW1FMURzVTFZSHYybWkvMHFnZmJYMworNmlBTkNhYkJ0SjRoUUMrSjdSR1FpVHFyV3BHQThWTG9MNFdrVjFQUFg4R1FjY1h1eUNjQ0FRT2pnZnd3Z2ZrdworSFFZRFZSME9CQllFRkUva29MUGRuTG9wOXgxeWg4VG53NDhnaHNLWk1JSEpCZ05WSFNNRWdjRXdnYjZBRkUvaworb0xQZG5Mb3A5eDF5aDhUbnc0OGdoc0tab1lHYXBJR1hNSUdVTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHQTFVRQorQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5UVzkxYm5SaGFXNGdWbWxsZHpFUU1BNEdBMVVFQ2hNSAorUVc1a2NtOXBaREVRTUE0R0ExVUVDeE1IUVc1a2NtOXBaREVRTUE0R0ExVUVBeE1IUVc1a2NtOXBaREVpTUNBRworQ1NxR1NJYjNEUUVKQVJZVFlXNWtjbTlwWkVCaGJtUnliMmxrTG1OdmJZSUpBTE9aZ0liUVZzLzZNQXdHQTFVZAorRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRUJRQURnZ0VCQUZjbFVialpPaDl6M2c5dFJwK0cydFp3RkFBcAorUElpZ3pYelhlTGM5cjh3WmY2dDI1aUV1VnNISFljL0VMOWN6M2xMRkN1Q0lGTTc4Q2p0YUdrTkdCVTJDbngyQwordENzZ1NMK0l0ZEZKS2UrRjlnN2RFdGN0VldWK0l1UG9YUVRJTWRZVDBaazR1NG1DSkgraklTVnJvUzBkYW8rUworNmgyeHczTXhlNkRBTi9EUnIvWkZydklrbDUrNmJub1V2QUpjY2JtQk9NN3ozZndGbGhmUEpJUmM5N1FOWTRMMworSjE3WE9FbGF0dVdURzVRaGRseEpHM0w3YU9DQTI5dFl3Z0tkTkh5TE1vemtQdmFvc1ZVejdmdnBpYjFxU04xTAorSUM3YWxNYXJqZFc0T1pJRDJxNHUxRVlqTGsvcHZaWVRsTVl3RGxFNDQ4L1NoZWJrNUlOVGpMaXhzMWM9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvc2lnZmlsZS5iaW4gYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvc2lnZmlsZS5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4MjIxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9zaWdmaWxlLmJpbgpAQCAtMCwwICsxIEBACisHulHgwtyilKG9qEdw+KPV+RD5sNTWJ1s0S+kQTKEIYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS9zaWduZWQtc2lnZmlsZS5iaW4gYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvc2lnbmVkLXNpZ2ZpbGUuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZDJmOWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvc2lnbmVkLXNpZ2ZpbGUuYmluCkBAIC0wLDAgKzEsMiBAQAorUqEFE50mi0X/c8ERJfg/uXyknCaPzYDxemJTikFb33Rx5xuGV0vSkWwUpuDZ2eVzpdJ+RmPmCY8OYJ6vvs0jCitUe93X271GrQbSwZ94g/gxiR82zIs9UbCVjFbmGl5U37DYDnhYo7Yv/iOp6kkn3BfudGNMBBxwk5OsBq2f6292etGSUuE69fNX/jkoucEEMjbbzKzhHWLCQlAxuDYW427S37FR1UOpZ5BoO3KJsk99ECXEvfWIkBjhbzYU45RkE5PqAhS0yeMH5TJZYKbVDNu8qqVfUpNPckNhLOhJIm4oYJbtbvHc0GJhafa5xajUGuRThNfKKWueHE9bYDZjrGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS5wazggYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS5wazgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZTI5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5LnBrOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS5wdWJrZXkucGVtIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Rlc3RrZXkucHVia2V5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MThhZTYwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Rlc3RrZXkucHVia2V5LnBlbQpAQCAtMCwwICsxLDkgQEAKKy0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCitNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZqdnlPMkx3V2dtUU55cTd6K3hLCiswNGVnMHQzQUw0eTJOaHBBQU96Vm5GeUNBckZjRmpMVEdRRER2a2JaUDZOMTJPNitkd0pvUExudG5tOUErVm5QCitJRkZSSGcwSFVXU2JITStRazhKZ3YyLzJBVmtBVWo1SjFyOXQ0WCsyV0kwZVJ6SlAxNVpqbjY4cFFLR21jeWNpCityeTBnYnZtWXZYTDJaVW1UbTU2RG1FZkNVQ1JJWTJJR0ovQ2NNbkZlSXRWVTBMeEtzVjVNbHQ1Qk8wVnYvQ1Y0CitFYWlPTHd5Q25vWnVVaFl0bzdkSGxPLzQ3di9IOXpoa0pDNTRPQTFka0QzOEVQZ081R25maEdGU05YUVJtSkRUCitYckZnZDZPK1FPNHlVTlg4bFlQMTBNemltVXBJdFphMDV0NjhOQURxd1lsM1Q3bld6dnVDOXI0SXFaRHlQZjIxCitUUUlEQVFBQgorLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS54NTA5LnBlbSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5Lng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzgwODUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWxlYXNldG9vbHMvdGVzdGRhdGEvdGVzdGtleS54NTA5LnBlbQpAQCAtMCwwICsxLDI0IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVBRENDQXVpZ0F3SUJBZ0lKQU4vRnZqWXpHTk9LTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdVTVFzd0NRWUQKK1ZRUUdFd0pWVXpFVE1CRUdBMVVFQ0F3S1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ3d05UVzkxYm5SaGFXNGcKK1ZtbGxkekVRTUE0R0ExVUVDZ3dIUVc1a2NtOXBaREVRTUE0R0ExVUVDd3dIUVc1a2NtOXBaREVRTUE0R0ExVUUKK0F3d0hRVzVrY205cFpERWlNQ0FHQ1NxR1NJYjNEUUVKQVJZVFlXNWtjbTlwWkVCaGJtUnliMmxrTG1OdmJUQWUKK0Z3MHhPREF4TVRnd01ETTBOVEZhRncwME5UQTJNRFV3TURNME5URmFNSUdVTVFzd0NRWURWUVFHRXdKVlV6RVQKK01CRUdBMVVFQ0F3S1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ3d05UVzkxYm5SaGFXNGdWbWxsZHpFUU1BNEcKK0ExVUVDZ3dIUVc1a2NtOXBaREVRTUE0R0ExVUVDd3dIUVc1a2NtOXBaREVRTUE0R0ExVUVBd3dIUVc1a2NtOXAKK1pERWlNQ0FHQ1NxR1NJYjNEUUVKQVJZVFlXNWtjbTlwWkVCaGJtUnliMmxrTG1OdmJUQ0NBU0l3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDQ3OGp0aThGb0prRGNxdTgvc1N0T0hvTkxkd0MrTXRqWWEKK1FBRHMxWnhjZ2dLeFhCWXkweGtBdzc1RzJUK2pkZGp1dm5jQ2FEeTU3WjV2UVBsWnp5QlJVUjROQjFGa214elAKK2tKUENZTDl2OWdGWkFGSStTZGEvYmVGL3RsaU5Ia2N5VDllV1k1K3ZLVUNocG5NbklxOHRJRzc1bUwxeTltVkoKK2s1dWVnNWhId2xBa1NHTmlCaWZ3bkRKeFhpTFZWTkM4U3JGZVRKYmVRVHRGYi93bGVCR29qaThNZ3A2R2JsSVcKK0xhTzNSNVR2K083L3gvYzRaQ1F1ZURnTlhaQTkvQkQ0RHVScDM0UmhValYwRVppUTAxNnhZSGVqdmtEdU1sRFYKKy9KV0Q5ZERNNHBsS1NMV1d0T2JldkRRQTZzR0pkMCs1MXM3N2d2YStDS21ROGozOXRVMENBd0VBQWFOVE1GRXcKK0hRWURWUjBPQkJZRUZOSlBKWkRwcTZ0Yy8xOVoya3hQQTJiajlENlVNQjhHQTFVZEl3UVlNQmFBRk5KUEpaRHAKK3E2dGMvMTlaMmt4UEEyYmo5RDZVTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQUQKK2dnRUJBQlNVRzlxcndWM1djQ2xESndxa05MTjR5ZVZWWXprUk1HQTgvWHFPaVlyVzR6aDBtS0RMZnI2T2VVMUMKK0FLd1pCTGhocWw1OVBvMjVyNGdjd1BpVE4yRGtvQ2ZiM1Q1OVhHOEo1NFBBZ1RRaklBWjNKK21HWnBsbm11RDMKK3dqK1VHVXBQZTBxVHIzM1pQb0pmd3hWbzRSVm5PdC9VQ3NJR1hjaDBIUy9CSWRwZWNocVAwdzRyT0hVYnE2RUEKKzhVRWk1aXJLU0RPVTliLzVyRC90WDJmNG5Hd0psS1FFSFdyc2o5TExLbGFMN2ZYMzZnaG9TeE4vcEJKT2hlZGcKKy9WalQ2eGJhRXdmeWhDNlpqOWF2NVhsN1VkcFl0K3JCTXJvQUdlbnowT1N4S2hJcGhkY3g0Wk1odmZrQm9ZRzkKK0NydXBkcWUra1VzZmcyUmxQYjVnclEza2xNbz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5X3dpdGhfcGFzc3dkLnBrOCBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5X3dpdGhfcGFzc3dkLnBrOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDU2N2RlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Rlc3RrZXlfd2l0aF9wYXNzd2QucGs4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5X3dpdGhfcGFzc3dkLng1MDkucGVtIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Rlc3RrZXlfd2l0aF9wYXNzd2QueDUwOS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5Mzk2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS90ZXN0a2V5X3dpdGhfcGFzc3dkLng1MDkucGVtCkBAIC0wLDAgKzEsMjQgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUFEQ0NBdWlnQXdJQkFnSUpBTmVmVWQzUGl1MHlNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR1VNUXN3Q1FZRAorVlFRR0V3SlZVekVUTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlRXOTFiblJoYVc0ZworVm1sbGR6RVFNQTRHQTFVRUNnd0hRVzVrY205cFpERVFNQTRHQTFVRUN3d0hRVzVrY205cFpERVFNQTRHQTFVRQorQXd3SFFXNWtjbTlwWkRFaU1DQUdDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRBZQorRncweE9EQXhNVGd3TURJM05EUmFGdzAwTlRBMk1EVXdNREkzTkRSYU1JR1VNUXN3Q1FZRFZRUUdFd0pWVXpFVAorTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlRXOTFiblJoYVc0Z1ZtbGxkekVRTUE0RworQTFVRUNnd0hRVzVrY205cFpERVFNQTRHQTFVRUN3d0hRVzVrY205cFpERVFNQTRHQTFVRUF3d0hRVzVrY205cAorWkRFaU1DQUdDU3FHU0liM0RRRUpBUllUWVc1a2NtOXBaRUJoYm1SeWIybGtMbU52YlRDQ0FTSXdEUVlKS29aSQoraHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMQm9BNGMrcUNRS2FwUUFWR2NsYm91c0M1Si9MMFROWkpFZAorS1NXMm56WFVISXdnVFEzcjgyMjI3eGtJdmpucVhNQ3NjMHEzL04yZ0dLUjRzSHFBMzBKTzlEeWZnc3gxSVNhUgorR1hlNWNHMDQ4bTVVNXNucGxRZ3ZQb3Z0YWg5Wnl2d05QeldQWUMzdWNlSmFEeEtRS3dWZHNWK21PV002V21wUQorYmRMTzM3anhmeXR5QWJ6YXozc0c1SEEzRlNCOHJYL3hETTZJZjE4TnN4U0hwY2phT2paWEM0Rmc2d2xwMGtsWQorNS9xaEZFZG1pZXUyelFWZWxYam9KZktTa3U4dFBhN2taZURVL0YzdUxVcS9VL3h2Rms3TlZzUlYrUXZZT2RRSworMVFFQ2MvM3l2MVRLTkFOM2h1V1RnekNYNmJNSG1pMDlOcHczTVFhR1kwb1MzNGNIOXgwQ0F3RUFBYU5UTUZFdworSFFZRFZSME9CQllFRk5zSlowbjlPcGVlYTByVkF6TCsxandrREt6UE1COEdBMVVkSXdRWU1CYUFGTnNKWjBuOQorT3BlZWEwclZBekwrMWp3a0RLelBNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRAorZ2dFQkFKL2J6SXpBK05yWXdQRXY1NlhLZjZWdWo4MStNMXJUSEFzSDlQcWJPdkpUN2lNN2FVN3dBbDZ2bVhBbworRFF0dktvT0JNZElYcHJhcHdlMHF1SENRbTdQR3hnK1JSZWdyK2RjVFNWSkZ2MXBsbk9ET0JPRUFWbEVmRnd1VworQ3owVVNGMmpyTnErNGNpSDV6UEwxYTMxT05iMXJNa3hKWFEvdEFpMHg4bTZ0WnoranNiRTB3TzZxQjgwVW1rQQorNFdZMlR1L2duQXZGcEQ4cGxraVUwRUt3ZWRCSEFjYUZGWmtRcDIzTUtzVlozVUJxc3F6emZYRFlWMU9hNnJJeQorWElacEkyR3g3NXB2QWI1N1QyYXAveWwwREJFQXU3Tm1wbGwwR0NzZ2VKVmR5N3RTNExOajk2UXV5YTNDSFdRdworV05UVnVhbjBLWnF3REltNFhuMW9IVUZROXZjPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RkYXRhL3Zlcml0eS54NTA5LnBlbSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS92ZXJpdHkueDUwOS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzOTljMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0ZGF0YS92ZXJpdHkueDUwOS5wZW0KQEAgLTAsMCArMSwyNCBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEL1RDQ0F1V2dBd0lCQWdJSkFKY1BtRGtKcW9sSk1BMEdDU3FHU0liM0RRRUJCUVVBTUlHVU1Rc3dDUVlECitWUVFHRXdKVlV6RVRNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCd3dOVFc5MWJuUmhhVzRnCitWbWxsZHpFUU1BNEdBMVVFQ2d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFCitBd3dIUVc1a2NtOXBaREVpTUNBR0NTcUdTSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVEFlCitGdzB4TkRFeE1EWXhPVEEzTkRCYUZ3MDBNakF6TWpReE9UQTNOREJhTUlHVU1Rc3dDUVlEVlFRR0V3SlZVekVUCitNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCd3dOVFc5MWJuUmhhVzRnVm1sbGR6RVFNQTRHCitBMVVFQ2d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFQXd3SFFXNWtjbTlwCitaREVpTUNBR0NTcUdTSWIzRFFFSkFSWVRZVzVrY205cFpFQmhibVJ5YjJsa0xtTnZiVENDQVNJd0RRWUpLb1pJCitodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9qcmVFMHZUVlNSZW51ek85dm5hV2ZrMGVRellhYjBncXBpCis2eEF6aTZkbUQrdWdvRUtKbWJQaXVFNUR3ZjIxaXNaOXVoVVV1MGRRTTQ2ZEs0b2NLeE1ScmNubUd4eWRGbjZvCitmczNPREpNWE9rdjJnS1hML0ZkYkVQZERieHpkdTh6M3lrK1c2N3VkTS9mVzdXYmFRM0RPMGtudStpekthay8zCitUNDFjNXVvWG1RODFVTnRBelJHekdjaE5WWE1tV3VUR09rZzZVKzBJMlRkN0s4eXZVTVdoQVdQUHBLTHRWSDlyCitBTDVUempZTlI5Mml6ZEtjejNBalJzSTNDVGp0cGlWQUJHZVgwVGNqUlN1WkI3SzlFSzU2SFYrT0ZOUzZJMU5QCitqZEQ3RklTaHlHbHFxWmRVT2tBVVpZYW5icGdlVDVON1FMNnV1cWNHcG9UT2thbHU2a2tDQXdFQUFhTlFNRTR3CitIUVlEVlIwT0JCWUVGSDVETS9tN29BcmY0TzNwZWVLTzBaSUVrclFQTUI4R0ExVWRJd1FZTUJhQUZINURNL203CitvQXJmNE8zcGVlS08wWklFa3JRUE1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCCitBSE8zTlN2REU1akZ2TWVoR0d0UzhCbkZZZEZLUklnbERNYzRuaVdTemh6T1ZZUkg0V2FqeGR0QldjNWZ4MGl4CitORi8raFZLVmhQNkFJT1FhKysrc2srSElpN1J2aW9QUGJoamNzVmxaZTdjVUVHckxTU3ZlR291UXljK2owK202CitKRjg0a3N6SWw1R0dOTVRueDBYUlBPK2c4dDZoNUxXZm5WeWRnWmZwR1JSZytXSGV3azFVMkhsdlRqSWNlYjBOCitkY29KOFdLSkFGV2RjdUU3VkltNHcrdkYvRFlYL0EyT3l6cjIrUVJobVlTdjFjdXNnQWVDMXR2SDRhcCtKMUxnCitVbk91NUtoL0ZxUExMU3dOVlFwNEJ1N2I5UUZmcUs4TW9qODRiajg4TnFSR1pnRHlxenVUckZ4bjZGVzdkbXlBCit5dHR1QUpBRUF5bWsxbWlwZDkrenAzOD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy92YWxpZGF0ZV90YXJnZXRfZmlsZXMucHkgYi90b29scy9yZWxlYXNldG9vbHMvdmFsaWRhdGVfdGFyZ2V0X2ZpbGVzLnB5CmluZGV4IDRiMzQ4MjAuLmRiMWJhMmUgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy92YWxpZGF0ZV90YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3ZhbGlkYXRlX3RhcmdldF9maWxlcy5weQpAQCAtMjMsNDAgKzIzLDI0IEBACiAgICBzYW1lIGNoZWNrIGFsc28gYXBwbGllcyB0byB0aGUgdmVuZG9yIGltYWdlIGlmIHByZXNlbnQuCiAiIiIKIAotaW1wb3J0IGNvbW1vbgogaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcy5wYXRoCiBpbXBvcnQgcmUKLWltcG9ydCBzcGFyc2VfaW1nCiBpbXBvcnQgc3lzCitpbXBvcnQgemlwZmlsZQogCi0KLWRlZiBfR2V0SW1hZ2Uod2hpY2gsIHRtcGRpcik6Ci0gIGFzc2VydCB3aGljaCBpbiAoJ3N5c3RlbScsICd2ZW5kb3InKQotCi0gIHBhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnSU1BR0VTJywgd2hpY2ggKyAnLmltZycpCi0gIG1hcHBhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnSU1BR0VTJywgd2hpY2ggKyAnLm1hcCcpCi0KLSAgIyBNYXAgZmlsZSBtdXN0IGV4aXN0IChhbGxvd2VkIHRvIGJlIGVtcHR5KS4KLSAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKHBhdGgpIGFuZCBvcy5wYXRoLmV4aXN0cyhtYXBwYXRoKQotCi0gIGNsb2JiZXJlZF9ibG9ja3MgPSAnMCcKLSAgcmV0dXJuIHNwYXJzZV9pbWcuU3BhcnNlSW1hZ2UocGF0aCwgbWFwcGF0aCwgY2xvYmJlcmVkX2Jsb2NrcykKK2ltcG9ydCBjb21tb24KIAogCiBkZWYgX1JlYWRGaWxlKGZpbGVfbmFtZSwgdW5wYWNrZWRfbmFtZSwgcm91bmRfdXA9RmFsc2UpOgogICAiIiJDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGEgRmlsZSBvYmplY3QuIFJvdW5kcyB1cCBpdHMgc2l6ZSBpZiBuZWVkZWQuIiIiCiAKLSAgZGVmIFJvdW5kVXBUbzRLKHZhbHVlKToKLSAgICByb3VuZGVkX3VwID0gdmFsdWUgKyA0MDk1Ci0gICAgcmV0dXJuIHJvdW5kZWRfdXAgLSAocm91bmRlZF91cCAlIDQwOTYpCi0KICAgYXNzZXJ0IG9zLnBhdGguZXhpc3RzKHVucGFja2VkX25hbWUpCiAgIHdpdGggb3Blbih1bnBhY2tlZF9uYW1lLCAncicpIGFzIGY6CiAgICAgZmlsZV9kYXRhID0gZi5yZWFkKCkKICAgZmlsZV9zaXplID0gbGVuKGZpbGVfZGF0YSkKICAgaWYgcm91bmRfdXA6Ci0gICAgZmlsZV9zaXplX3JvdW5kZWRfdXAgPSBSb3VuZFVwVG80SyhmaWxlX3NpemUpCisgICAgZmlsZV9zaXplX3JvdW5kZWRfdXAgPSBjb21tb24uUm91bmRVcFRvNEsoZmlsZV9zaXplKQogICAgIGZpbGVfZGF0YSArPSAnXDAnICogKGZpbGVfc2l6ZV9yb3VuZGVkX3VwIC0gZmlsZV9zaXplKQogICByZXR1cm4gY29tbW9uLkZpbGUoZmlsZV9uYW1lLCBmaWxlX2RhdGEpCiAKQEAgLTY0LDEzICs0OCwxMyBAQAogZGVmIFZhbGlkYXRlRmlsZUFnYWluc3RTaGExKGlucHV0X3RtcCwgZmlsZV9uYW1lLCBmaWxlX3BhdGgsIGV4cGVjdGVkX3NoYTEpOgogICAiIiJDaGVjayBpZiB0aGUgZmlsZSBoYXMgdGhlIGV4cGVjdGVkIFNIQS0xLiIiIgogCi0gIGxvZ2dpbmcuaW5mbygnVmFsaWRhdGluZyB0aGUgU0hBLTEgb2Yge30nLmZvcm1hdChmaWxlX25hbWUpKQorICBsb2dnaW5nLmluZm8oJ1ZhbGlkYXRpbmcgdGhlIFNIQS0xIG9mICVzJywgZmlsZV9uYW1lKQogICB1bnBhY2tlZF9uYW1lID0gb3MucGF0aC5qb2luKGlucHV0X3RtcCwgZmlsZV9wYXRoKQogICBhc3NlcnQgb3MucGF0aC5leGlzdHModW5wYWNrZWRfbmFtZSkKICAgYWN0dWFsX3NoYTEgPSBfUmVhZEZpbGUoZmlsZV9uYW1lLCB1bnBhY2tlZF9uYW1lLCBGYWxzZSkuc2hhMQogICBhc3NlcnQgYWN0dWFsX3NoYTEgPT0gZXhwZWN0ZWRfc2hhMSwgXAogICAgICAgJ1NIQS0xIG1pc21hdGNoZXMgZm9yIHt9LiBhY3R1YWwge30sIGV4cGVjdGVkIHt9Jy5mb3JtYXQoCi0gICAgICBmaWxlX25hbWUsIGFjdHVhbF9zaGExLCBleHBlY3RlZF9zaGExKQorICAgICAgICAgIGZpbGVfbmFtZSwgYWN0dWFsX3NoYTEsIGV4cGVjdGVkX3NoYTEpCiAKIAogZGVmIFZhbGlkYXRlRmlsZUNvbnNpc3RlbmN5KGlucHV0X3ppcCwgaW5wdXRfdG1wKToKQEAgLTc4LDMzICs2MiwzMSBAQAogCiAgIGRlZiBDaGVja0FsbEZpbGVzKHdoaWNoKToKICAgICBsb2dnaW5nLmluZm8oJ0NoZWNraW5nICVzIGltYWdlLicsIHdoaWNoKQotICAgIGltYWdlID0gX0dldEltYWdlKHdoaWNoLCBpbnB1dF90bXApCisgICAgIyBBbGxvdyBoYXZpbmcgc2hhcmVkIGJsb2NrcyB3aGVuIGxvYWRpbmcgdGhlIHNwYXJzZSBpbWFnZSwgYmVjYXVzZSBhbGxvd2luZworICAgICMgdGhhdCBkb2Vzbid0IGFmZmVjdCB0aGUgY2hlY2tzIGJlbG93ICh3ZSB3aWxsIGhhdmUgYWxsIHRoZSBibG9ja3Mgb24gZmlsZSwKKyAgICAjIHVubGVzcyBpdCdzIHNraXBwZWQgZHVlIHRvIHRoZSBob2xlcykuCisgICAgaW1hZ2UgPSBjb21tb24uR2V0U3BhcnNlSW1hZ2Uod2hpY2gsIGlucHV0X3RtcCwgaW5wdXRfemlwLCBUcnVlKQogICAgIHByZWZpeCA9ICcvJyArIHdoaWNoCiAgICAgZm9yIGVudHJ5IGluIGltYWdlLmZpbGVfbWFwOgorICAgICAgIyBTa2lwIGVudHJpZXMgbGlrZSAnX19OT05aRVJPLTAnLgogICAgICAgaWYgbm90IGVudHJ5LnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgY29udGludWUKIAogICAgICAgIyBSZWFkIHRoZSBibG9ja3MgdGhhdCB0aGUgZmlsZSByZXNpZGVzLiBOb3RlIHRoYXQgaXQgd2lsbCBjb250YWluIHRoZQogICAgICAgIyBieXRlcyBwYXN0IHRoZSBmaWxlIGxlbmd0aCwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgcGFkZGVkIHdpdGggJ1wwJ3MuCiAgICAgICByYW5nZXMgPSBpbWFnZS5maWxlX21hcFtlbnRyeV0KKworICAgICAgaW5jb21wbGV0ZSA9IHJhbmdlcy5leHRyYS5nZXQoJ2luY29tcGxldGUnLCBGYWxzZSkKKyAgICAgIGlmIGluY29tcGxldGU6CisgICAgICAgIGxvZ2dpbmcud2FybmluZygnU2tpcHBpbmcgJXMgdGhhdCBoYXMgaW5jb21wbGV0ZSBibG9jayBsaXN0JywgZW50cnkpCisgICAgICAgIGNvbnRpbnVlCisKICAgICAgIGJsb2Nrc19zaGExID0gaW1hZ2UuUmFuZ2VTaGExKHJhbmdlcykKIAogICAgICAgIyBUaGUgZmlsZW5hbWUgdW5kZXIgdW5wYWNrZWQgZGlyZWN0b3J5LCBzdWNoIGFzIFNZU1RFTS9iaW4vc2guCiAgICAgICB1bnBhY2tlZF9uYW1lID0gb3MucGF0aC5qb2luKAogICAgICAgICAgIGlucHV0X3RtcCwgd2hpY2gudXBwZXIoKSwgZW50cnlbKGxlbihwcmVmaXgpICsgMSk6XSkKICAgICAgIHVucGFja2VkX2ZpbGUgPSBfUmVhZEZpbGUoZW50cnksIHVucGFja2VkX25hbWUsIFRydWUpCi0gICAgICBmaWxlX3NpemUgPSB1bnBhY2tlZF9maWxlLnNpemUKLQotICAgICAgIyBibG9jay5tYXAgbWF5IGNvbnRhaW4gbGVzcyBibG9ja3MsIGJlY2F1c2UgbWtlMmZzIG1heSBza2lwIGFsbG9jYXRpbmcKLSAgICAgICMgYmxvY2tzIGlmIHRoZXkgY29udGFpbiBhbGwgemVyb3MuIFdlIGNhbid0IHJlY29uc3RydWN0IHN1Y2ggYSBmaWxlIGZyb20KLSAgICAgICMgaXRzIGJsb2NrIGxpc3QuIChCdWc6IDY1MjEzNjE2KQotICAgICAgaWYgZmlsZV9zaXplID4gcmFuZ2VzLnNpemUoKSAqIDQwOTY6Ci0gICAgICAgIGxvZ2dpbmcud2FybmluZygKLSAgICAgICAgICAgICdTa2lwcGluZyAlcyB0aGF0IGhhcyBsZXNzIGJsb2NrczogZmlsZSBzaXplICVkLWJ5dGUsJwotICAgICAgICAgICAgJyByYW5nZXMgJXMgKCVkLWJ5dGUpJywgZW50cnksIGZpbGVfc2l6ZSwgcmFuZ2VzLAotICAgICAgICAgICAgcmFuZ2VzLnNpemUoKSAqIDQwOTYpCi0gICAgICAgIGNvbnRpbnVlCi0KICAgICAgIGZpbGVfc2hhMSA9IHVucGFja2VkX2ZpbGUuc2hhMQogICAgICAgYXNzZXJ0IGJsb2Nrc19zaGExID09IGZpbGVfc2hhMSwgXAogICAgICAgICAgICdmaWxlOiAlcywgcmFuZ2U6ICVzLCBibG9ja3Nfc2hhMTogJXMsIGZpbGVfc2hhMTogJXMnICUgKApAQCAtMTQ3LDEwICsxMjksMTAgQEAKIAogICBzY3JpcHRfcGF0aCA9ICdTWVNURU0vYmluL2luc3RhbGwtcmVjb3Zlcnkuc2gnCiAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW5wdXRfdG1wLCBzY3JpcHRfcGF0aCkpOgotICAgIGxvZ2dpbmcuaW5mbygne30gZG9lcyBub3QgZXhpc3QgaW4gaW5wdXRfdG1wJy5mb3JtYXQoc2NyaXB0X3BhdGgpKQorICAgIGxvZ2dpbmcuaW5mbygnJXMgZG9lcyBub3QgZXhpc3QgaW4gaW5wdXRfdG1wJywgc2NyaXB0X3BhdGgpCiAgICAgcmV0dXJuCiAKLSAgbG9nZ2luZy5pbmZvKCdDaGVja2luZyB7fScuZm9ybWF0KHNjcmlwdF9wYXRoKSkKKyAgbG9nZ2luZy5pbmZvKCdDaGVja2luZyAlcycsIHNjcmlwdF9wYXRoKQogICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGlucHV0X3RtcCwgc2NyaXB0X3BhdGgpLCAncicpIGFzIHNjcmlwdDoKICAgICBsaW5lcyA9IHNjcmlwdC5yZWFkKCkuc3RyaXAoKS5zcGxpdCgnXG4nKQogICBhc3NlcnQgbGVuKGxpbmVzKSA+PSA2CkBAIC0xNjgsNyArMTUwLDcgQEAKICAgICBleHBlY3RlZF9yZWNvdmVyeV9zaGExID0gYXBwbHlwYXRjaF9hcmd2WzNdLnN0cmlwKCkKICAgICBhc3NlcnQgZXhwZWN0ZWRfcmVjb3ZlcnlfY2hlY2tfc2hhMSA9PSBleHBlY3RlZF9yZWNvdmVyeV9zaGExCiAgICAgVmFsaWRhdGVGaWxlQWdhaW5zdFNoYTEoaW5wdXRfdG1wLCAncmVjb3ZlcnkuaW1nJywKLSAgICAgICAgJ1NZU1RFTS9ldGMvcmVjb3ZlcnkuaW1nJywgZXhwZWN0ZWRfcmVjb3Zlcnlfc2hhMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU1lTVEVNL2V0Yy9yZWNvdmVyeS5pbWcnLCBleHBlY3RlZF9yZWNvdmVyeV9zaGExKQogICBlbHNlOgogICAgICMgV2UncmUgcGF0Y2hpbmcgYm9vdC5pbWcgdG8gZ2V0IHJlY292ZXJ5LmltZyB3aGVyZSBib251c19hcmdzIGlzIG9wdGlvbmFsCiAgICAgaWYgYXBwbHlwYXRjaF9hcmd2WzFdID09ICItYiI6CkBAIC0xODIsMTYgKzE2NCwxNyBAQAogICAgIGJvb3RfaW5mbyA9IGFwcGx5cGF0Y2hfYXJndltib290X2luZm9faW5kZXhdLnN0cmlwKCkuc3BsaXQoJzonKQogICAgIGFzc2VydCBsZW4oYm9vdF9pbmZvKSA9PSA0CiAgICAgVmFsaWRhdGVGaWxlQWdhaW5zdFNoYTEoaW5wdXRfdG1wLCBmaWxlX25hbWU9J2Jvb3QuaW1nJywKLSAgICAgICAgZmlsZV9wYXRoPSdJTUFHRVMvYm9vdC5pbWcnLCBleHBlY3RlZF9zaGExPWJvb3RfaW5mb1szXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3BhdGg9J0lNQUdFUy9ib290LmltZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc2hhMT1ib290X2luZm9bM10pCiAKICAgICByZWNvdmVyeV9zaGExX2luZGV4ID0gYm9vdF9pbmZvX2luZGV4ICsgMgogICAgIGV4cGVjdGVkX3JlY292ZXJ5X3NoYTEgPSBhcHBseXBhdGNoX2FyZ3ZbcmVjb3Zlcnlfc2hhMV9pbmRleF0KICAgICBhc3NlcnQgZXhwZWN0ZWRfcmVjb3ZlcnlfY2hlY2tfc2hhMSA9PSBleHBlY3RlZF9yZWNvdmVyeV9zaGExCiAgICAgVmFsaWRhdGVGaWxlQWdhaW5zdFNoYTEoaW5wdXRfdG1wLCBmaWxlX25hbWU9J3JlY292ZXJ5LmltZycsCi0gICAgICAgIGZpbGVfcGF0aD0nSU1BR0VTL3JlY292ZXJ5LmltZycsCi0gICAgICAgIGV4cGVjdGVkX3NoYTE9ZXhwZWN0ZWRfcmVjb3Zlcnlfc2hhMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3BhdGg9J0lNQUdFUy9yZWNvdmVyeS5pbWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3NoYTE9ZXhwZWN0ZWRfcmVjb3Zlcnlfc2hhMSkKIAotICBsb2dnaW5nLmluZm8oJ0RvbmUgY2hlY2tpbmcge30nLmZvcm1hdChzY3JpcHRfcGF0aCkpCisgIGxvZ2dpbmcuaW5mbygnRG9uZSBjaGVja2luZyAlcycsIHNjcmlwdF9wYXRoKQogCiAKIGRlZiBtYWluKGFyZ3YpOgpAQCAtMjEzLDkgKzE5NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgIGRhdGVmbXQ9ZGF0ZV9mb3JtYXQpCiAKICAgbG9nZ2luZy5pbmZvKCJVbnppcHBpbmcgdGhlIGlucHV0IHRhcmdldF9maWxlcy56aXA6ICVzIiwgYXJnc1swXSkKLSAgaW5wdXRfdG1wLCBpbnB1dF96aXAgPSBjb21tb24uVW56aXBUZW1wKGFyZ3NbMF0pCisgIGlucHV0X3RtcCA9IGNvbW1vbi5VbnppcFRlbXAoYXJnc1swXSkKIAotICBWYWxpZGF0ZUZpbGVDb25zaXN0ZW5jeShpbnB1dF96aXAsIGlucHV0X3RtcCkKKyAgd2l0aCB6aXBmaWxlLlppcEZpbGUoYXJnc1swXSwgJ3InKSBhcyBpbnB1dF96aXA6CisgICAgVmFsaWRhdGVGaWxlQ29uc2lzdGVuY3koaW5wdXRfemlwLCBpbnB1dF90bXApCiAKICAgaW5mb19kaWN0ID0gY29tbW9uLkxvYWRJbmZvRGljdChpbnB1dF90bXApCiAgIFZhbGlkYXRlSW5zdGFsbFJlY292ZXJ5U2NyaXB0KGlucHV0X3RtcCwgaW5mb19kaWN0KQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2lnbmFway9BbmRyb2lkLmJwIGIvdG9vbHMvc2lnbmFway9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTRjZjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zaWduYXBrL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMSBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworLy8gdGhlIHNpZ25hcGsgdG9vbCAoYSAuamFyIGFwcGxpY2F0aW9uIHVzZWQgdG8gc2lnbiBwYWNrYWdlcykKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoramF2YV9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJzaWduYXBrIiwKKyAgICBzcmNzOiBbInNyYy8qKi8qLmphdmEiXSwKKyAgICBtYW5pZmVzdDogIlNpZ25BcGsubWYiLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhcGtzaWciLAorICAgICAgICAiYm91bmN5Y2FzdGxlIiwKKyAgICAgICAgImJvdW5jeWNhc3RsZS1iY3BraXgiLAorICAgICAgICAiY29uc2NyeXB0IiwKKyAgICBdLAorCisgICAgcmVxdWlyZWQ6IFsibGliY29uc2NyeXB0X29wZW5qZGtfam5pIl0sCit9CmRpZmYgLS1naXQgYS90b29scy9zaWduYXBrL0FuZHJvaWQubWsgYi90b29scy9zaWduYXBrL0FuZHJvaWQubWsKaW5kZXggMDUxYTUxZC4uZmY1NGQ2ZCAxMDA2NDQKLS0tIGEvdG9vbHMvc2lnbmFway9BbmRyb2lkLm1rCisrKyBiL3Rvb2xzL3NpZ25hcGsvQW5kcm9pZC5tawpAQCAtMTUsMjQgKzE1LDEwIEBACiAjCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKLSMgdGhlIHNpZ25hcGsgdG9vbCAoYSAuamFyIGFwcGxpY2F0aW9uIHVzZWQgdG8gc2lnbiBwYWNrYWdlcykKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBzaWduYXBrCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi1MT0NBTF9KQVJfTUFOSUZFU1QgOj0gU2lnbkFway5tZgotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhcGtzaWcgXAotICAgIGJvdW5jeWNhc3RsZS1ob3N0IFwKLSAgICBib3VuY3ljYXN0bGUtYmNwa2l4LWhvc3QgXAotICAgIGNvbnNjcnlwdC1ob3N0Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGxpYmNvbnNjcnlwdF9vcGVuamRrX2puaQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQotCiBpZmVxICgkKFRBUkdFVF9CVUlMRF9BUFBTKSwpCiAjIFRoZSBwb3N0LWJ1aWxkIHNpZ25pbmcgdG9vbHMgbmVlZCBzaWduYXBrLmphciBhbmQgaXRzIHNoYXJlZCBsaWJyYXJpZXMsCiAjIGJ1dCB3ZSBkb24ndCBuZWVkIHRoaXMgaWYgd2UncmUganVzdCBkb2luZyB1bmJ1bmRsZWQgYXBwcy4KLW15X2Rpc3RfZmlsZXMgOj0gJChMT0NBTF9JTlNUQUxMRURfTU9EVUxFKSBcCitteV9kaXN0X2ZpbGVzIDo9ICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL3NpZ25hcGsuamFyIFwKICAgICAkKEhPU1RfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL2xpYmNvbnNjcnlwdF9vcGVuamRrX2puaSQoSE9TVF9TSExJQl9TVUZGSVgpCiAKICQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUsJChteV9kaXN0X2ZpbGVzKSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3NpZ25hcGsvT1dORVJTIGIvdG9vbHMvc2lnbmFway9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4ZDM5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3NpZ25hcGsvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorY2JydWJha2VyQGdvb2dsZS5jb20KK2tseXViaW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2lnbmFway9zcmMvY29tL2FuZHJvaWQvc2lnbmFway9TaWduQXBrLmphdmEgYi90b29scy9zaWduYXBrL3NyYy9jb20vYW5kcm9pZC9zaWduYXBrL1NpZ25BcGsuamF2YQppbmRleCAzYjAwNTk5Li5mZGY2MjgzIDEwMDY0NAotLS0gYS90b29scy9zaWduYXBrL3NyYy9jb20vYW5kcm9pZC9zaWduYXBrL1NpZ25BcGsuamF2YQorKysgYi90b29scy9zaWduYXBrL3NyYy9jb20vYW5kcm9pZC9zaWduYXBrL1NpZ25BcGsuamF2YQpAQCAtMTA4MiwxNCArMTA4MiwxNSBAQAogICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gb3V0cHV0Q2h1bmtzID0gbmV3IEJ5dGVCdWZmZXJbXSB7djFTaWduZWRBcGt9OwogCiAgICAgICAgICAgICAgICAgICAgIFppcFNlY3Rpb25zIHppcFNlY3Rpb25zID0gZmluZE1haW5aaXBTZWN0aW9ucyh2MVNpZ25lZEFwayk7Ci0gICAgICAgICAgICAgICAgICAgIEFwa1NpZ25lckVuZ2luZS5PdXRwdXRBcGtTaWduaW5nQmxvY2tSZXF1ZXN0IGFkZFYyU2lnbmF0dXJlUmVxdWVzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBrU2lnbmVyLm91dHB1dFppcFNlY3Rpb25zKAorICAgICAgICAgICAgICAgICAgICBBcGtTaWduZXJFbmdpbmUuT3V0cHV0QXBrU2lnbmluZ0Jsb2NrUmVxdWVzdDIgYWRkVjJTaWduYXR1cmVSZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGtTaWduZXIub3V0cHV0WmlwU2VjdGlvbnMyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZXMuYXNEYXRhU291cmNlKHppcFNlY3Rpb25zLmJlZm9yZUNlbnRyYWxEaXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZXMuYXNEYXRhU291cmNlKHppcFNlY3Rpb25zLmNlbnRyYWxEaXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZXMuYXNEYXRhU291cmNlKHppcFNlY3Rpb25zLmVvY2QpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZFYyU2lnbmF0dXJlUmVxdWVzdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGluc2VydCB0aGUgcmV0dXJuZWQgQVBLIFNpZ25pbmcgQmxvY2sgYmVmb3JlIFpJUCBDZW50cmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFkZGluZyA9IGFkZFYyU2lnbmF0dXJlUmVxdWVzdC5nZXRQYWRkaW5nU2l6ZUJlZm9yZUFwa1NpZ25pbmdCbG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGFwa1NpZ25pbmdCbG9jayA9IGFkZFYyU2lnbmF0dXJlUmVxdWVzdC5nZXRBcGtTaWduaW5nQmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIEFQSyBTaWduaW5nIEJsb2NrIGlzIGluc2VydGVkIGJlZm9yZSB0aGUgQ2VudHJhbCBEaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCBhY2NvcmRpbmdseSB0aGUgb2Zmc2V0IG9mIENlbnRyYWwgRGlyZWN0b3J5IGluc2lkZSB0aGUKQEAgLTExMDAsMTAgKzExMDEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW9jZC5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7CiAgICAgICAgICAgICAgICAgICAgICAgICBBcGtVdGlscy5zZXRaaXBFb2NkQ2VudHJhbERpcmVjdG9yeU9mZnNldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFb2NkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBTZWN0aW9ucy5iZWZvcmVDZW50cmFsRGlyLnJlbWFpbmluZygpICsgYXBrU2lnbmluZ0Jsb2NrLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcFNlY3Rpb25zLmJlZm9yZUNlbnRyYWxEaXIucmVtYWluaW5nKCkgKyBwYWRkaW5nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBrU2lnbmluZ0Jsb2NrLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDaHVua3MgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBTZWN0aW9ucy5iZWZvcmVDZW50cmFsRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIuYWxsb2NhdGUocGFkZGluZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKGFwa1NpZ25pbmdCbG9jayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwU2VjdGlvbnMuY2VudHJhbERpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEVvY2R9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvc2lnbnRvcy9BbmRyb2lkLmJwIGIvdG9vbHMvc2lnbnRvcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjYzMWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zaWdudG9zL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNyBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworLy8gdGhlIHNpZ250b3MgdG9vbCAtIHNpZ25zIFRydXN0eSBpbWFnZXMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoramF2YV9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJzaWdudG9zIiwKKyAgICBzcmNzOiBbIlNpZ25Ub3MuamF2YSJdLAorICAgIG1hbmlmZXN0OiAiU2lnblRvcy5tZiIsCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImJvdW5jeWNhc3RsZSIsCisgICAgICAgICJib3VuY3ljYXN0bGUtYmNwa2l4IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2lnbnRvcy9BbmRyb2lkLm1rIGIvdG9vbHMvc2lnbnRvcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGFiOTQ0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL3NpZ250b3MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgdGhlIHNpZ250b3MgdG9vbCAtIHNpZ25zIFRydXN0eSBpbWFnZXMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBzaWdudG9zCi1MT0NBTF9TUkNfRklMRVMgOj0gU2lnblRvcy5qYXZhCi1MT0NBTF9KQVJfTUFOSUZFU1QgOj0gU2lnblRvcy5tZgotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGJvdW5jeWNhc3RsZS1ob3N0IGJvdW5jeWNhc3RsZS1iY3BraXgtaG9zdAotaW5jbHVkZSAkKEJVSUxEX0hPU1RfSkFWQV9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc29vbmdfdG9fY29udmVydC5weSBiL3Rvb2xzL3Nvb25nX3RvX2NvbnZlcnQucHkKaW5kZXggM2Q2MmQ0My4uMDgzZjZmNyAxMDA3NTUKLS0tIGEvdG9vbHMvc29vbmdfdG9fY29udmVydC5weQorKysgYi90b29scy9zb29uZ190b19jb252ZXJ0LnB5CkBAIC03Niw4ICs3NiwxMCBAQAogICAgIHByb2JsZW1zID0gZGljdCgpCiAgICAgZGVwcyA9IGRpY3QoKQogICAgIHJldmVyc2VfZGVwcyA9IGRpY3QoKQorICAgIG1vZHVsZV90eXBlcyA9IGRpY3QoKQogCi0gICAgZm9yIChtb2R1bGUsIHByb2JsZW0sIGRlcGVuZGVuY2llcykgaW4gcmVhZGVyOgorICAgIGZvciAobW9kdWxlLCBtb2R1bGVfdHlwZSwgcHJvYmxlbSwgZGVwZW5kZW5jaWVzKSBpbiByZWFkZXI6CisgICAgICAgIG1vZHVsZV90eXBlc1ttb2R1bGVdID0gbW9kdWxlX3R5cGUKICAgICAgICAgcHJvYmxlbXNbbW9kdWxlXSA9IHByb2JsZW0KICAgICAgICAgZGVwc1ttb2R1bGVdID0gW2QgZm9yIGQgaW4gZGVwZW5kZW5jaWVzLnN0cmlwKCkuc3BsaXQoJyAnKSBpZiBkICE9ICIiXQogICAgICAgICBmb3IgZGVwIGluIGRlcHNbbW9kdWxlXToKQEAgLTk0LDE2ICs5NiwxOSBAQAogICAgICAgICBleHRyYSA9ICIiCiAgICAgICAgIGlmIGxlbihwcm9ibGVtc1ttb2R1bGVdKSA+IDA6CiAgICAgICAgICAgICBleHRyYSA9ICIgKHt9KSIuZm9ybWF0KHByb2JsZW1zW21vZHVsZV0pCi0gICAgICAgIHJlc3VsdHMuYXBwZW5kKChjb3VudF9kZXBzKHJldmVyc2VfZGVwcywgbW9kdWxlLCBbXSksIG1vZHVsZSArIGV4dHJhKSkKKyAgICAgICAgcmVzdWx0cy5hcHBlbmQoKGNvdW50X2RlcHMocmV2ZXJzZV9kZXBzLCBtb2R1bGUsIFtdKSwgbW9kdWxlICsgZXh0cmEsIG1vZHVsZV90eXBlc1ttb2R1bGVdKSkKIAogICAgIHJldHVybiBzb3J0ZWQocmVzdWx0cywga2V5PWxhbWJkYSByZXN1bHQ6ICgtcmVzdWx0WzBdLCByZXN1bHRbMV0pKQogCitkZWYgZmlsdGVyKHJlc3VsdHMsIG1vZHVsZV90eXBlKToKKyAgICByZXR1cm4gW3ggZm9yIHggaW4gcmVzdWx0cyBpZiB4WzJdID09IG1vZHVsZV90eXBlXQorCiBkZWYgZGlzcGxheShyZXN1bHRzKToKICAgICAiIiJEaXNwbGF5cyB0aGUgcmVzdWx0cyIiIgogICAgIGNvdW50X2hlYWRlciA9ICIjIEJsb2NrZWQgb24iCiAgICAgY291bnRfd2lkdGggPSBsZW4oY291bnRfaGVhZGVyKQogICAgIHByaW50KCJ7fSBNb2R1bGUgKHBvdGVudGlhbCBwcm9ibGVtcykiLmZvcm1hdChjb3VudF9oZWFkZXIpKQotICAgIGZvciAoY291bnQsIG1vZHVsZSkgaW4gcmVzdWx0czoKKyAgICBmb3IgKGNvdW50LCBtb2R1bGUsIG1vZHVsZV90eXBlKSBpbiByZXN1bHRzOgogICAgICAgICBwcmludCgiezo+e319IHt9Ii5mb3JtYXQoY291bnQsIGNvdW50X3dpZHRoLCBtb2R1bGUpKQogCiBkZWYgbWFpbihmaWxlbmFtZSk6CkBAIC0xMTEsNyArMTE2LDE1IEBACiAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBjc3ZmaWxlOgogICAgICAgICByZXN1bHRzID0gcHJvY2Vzcyhjc3YucmVhZGVyKGNzdmZpbGUpKQogCi0gICAgZGlzcGxheShyZXN1bHRzKQorICAgIG5hdGl2ZV9yZXN1bHRzID0gZmlsdGVyKHJlc3VsdHMsICJuYXRpdmUiKQorICAgIGphdmFfcmVzdWx0cyA9IGZpbHRlcihyZXN1bHRzLCAiamF2YSIpCisKKyAgICBwcmludCgibmF0aXZlIG1vZHVsZXMgcmVhZHkgdG8gY29udmVydCIpCisgICAgZGlzcGxheShuYXRpdmVfcmVzdWx0cykKKworICAgIHByaW50KCIiKQorICAgIHByaW50KCJqYXZhIG1vZHVsZXMgcmVhZHkgdG8gY29udmVydCIpCisgICAgZGlzcGxheShqYXZhX3Jlc3VsdHMpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaWYgbGVuKHN5cy5hcmd2KSAhPSAyOgpkaWZmIC0tZ2l0IGEvdG9vbHMvdmVuZG9yX2J1aWxkaW5mby5zaCBiL3Rvb2xzL3ZlbmRvcl9idWlsZGluZm8uc2gKaW5kZXggNDg1YWRhMy4uYzEyZjdjYiAxMDA3NTUKLS0tIGEvdG9vbHMvdmVuZG9yX2J1aWxkaW5mby5zaAorKysgYi90b29scy92ZW5kb3JfYnVpbGRpbmZvLnNoCkBAIC02LDEwICs2LDEwIEBACiBlY2hvICJyby5wcm9kdWN0LmJvYXJkPSRUQVJHRVRfQk9PVExPQURFUl9CT0FSRF9OQU1FIgogZWNobyAicm8uYm9hcmQucGxhdGZvcm09JFRBUkdFVF9CT0FSRF9QTEFURk9STSIKIAotZWNobyAicm8udmVuZG9yLnByb2R1Y3QubWFudWZhY3R1cmVyPSRQUk9EVUNUX01BTlVGQUNUVVJFUiIKLWVjaG8gInJvLnZlbmRvci5wcm9kdWN0Lm1vZGVsPSRQUk9EVUNUX01PREVMIgotZWNobyAicm8udmVuZG9yLnByb2R1Y3QuYnJhbmQ9JFBST0RVQ1RfQlJBTkQiCi1lY2hvICJyby52ZW5kb3IucHJvZHVjdC5uYW1lPSRQUk9EVUNUX05BTUUiCi1lY2hvICJyby52ZW5kb3IucHJvZHVjdC5kZXZpY2U9JFRBUkdFVF9ERVZJQ0UiCitlY2hvICJyby5wcm9kdWN0LnZlbmRvci5tYW51ZmFjdHVyZXI9JFBST0RVQ1RfTUFOVUZBQ1RVUkVSIgorZWNobyAicm8ucHJvZHVjdC52ZW5kb3IubW9kZWw9JFBST0RVQ1RfTU9ERUwiCitlY2hvICJyby5wcm9kdWN0LnZlbmRvci5icmFuZD0kUFJPRFVDVF9CUkFORCIKK2VjaG8gInJvLnByb2R1Y3QudmVuZG9yLm5hbWU9JFBST0RVQ1RfTkFNRSIKK2VjaG8gInJvLnByb2R1Y3QudmVuZG9yLmRldmljZT0kVEFSR0VUX0RFVklDRSIKIAogZWNobyAiIyBlbmQgYnVpbGQgcHJvcGVydGllcyIKZGlmZiAtLWdpdCBhL3Rvb2xzL3dhcm4ucHkgYi90b29scy93YXJuLnB5CmluZGV4IDQ0YWQzNjguLjAxMzk4YmUgMTAwNzU1Ci0tLSBhL3Rvb2xzL3dhcm4ucHkKKysrIGIvdG9vbHMvd2Fybi5weQpAQCAtNTA5LDYgKzUwOSwyNiBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBGaWVsZHMgdGhhdCBjYW4gYmUgbnVsbCBzaG91bGQgYmUgYW5ub3RhdGVkIEBOdWxsYWJsZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0ZpZWxkTWlzc2luZ051bGxhYmxlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE1ldGhvZCBwYXJhbWV0ZXJzIHRoYXQgYXJlblwndCBjaGVja2VkIGZvciBudWxsIHNob3VsZG5cJ3QgYmUgYW5ub3RhdGVkIEBOdWxsYWJsZScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1BhcmFtZXRlck5vdE51bGxhYmxlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE1ldGhvZHMgdGhhdCBjYW4gcmV0dXJuIG51bGwgc2hvdWxkIGJlIGFubm90YXRlZCBATnVsbGFibGUnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtSZXR1cm5NaXNzaW5nTnVsbGFibGVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIHBhcmFtZXRlciBjb21tZW50cyB0byBkb2N1bWVudCBhbWJpZ3VvdXMgbGl0ZXJhbHMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtCb29sZWFuUGFyYW1ldGVyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IEZpZWxkIG5hbWUgaXMgQ09OU1RBTlQgQ0FTRSwgYnV0IGZpZWxkIGlzIG5vdCBzdGF0aWMgYW5kIGZpbmFsJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29uc3RhbnRGaWVsZFxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC01MTksMTEgKzUzOSwyMSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2UgSmF2YVwncyB1dGlsaXR5IGZ1bmN0aW9uYWwgaW50ZXJmYWNlcyBpbnN0ZWFkIG9mIEZ1bmN0aW9uXHUwMDNjQSwgQj4gZm9yIHByaW1pdGl2ZSB0eXBlcy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtMYW1iZGFGdW5jdGlvbmFsSW50ZXJmYWNlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFByZWZlciBcJ0xcJyB0byBcJ2xcJyBmb3IgdGhlIHN1ZmZpeCB0byBsb25nIGxpdGVyYWxzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTG9uZ0xpdGVyYWxMb3dlckNhc2VTdWZmaXhcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQSBwcml2YXRlIG1ldGhvZCB0aGF0IGRvZXMgbm90IHJlZmVyZW5jZSB0aGUgZW5jbG9zaW5nIGluc3RhbmNlIGNhbiBiZSBzdGF0aWMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNZXRob2RDYW5CZVN0YXRpY1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBDLXN0eWxlIGFycmF5IGRlY2xhcmF0aW9ucyBzaG91bGQgbm90IGJlIHVzZWQnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNaXhlZEFycmF5RGltZW5zaW9uc1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC01MzksMTEgKzU2OSwyMSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBBdm9pZCBoYXZpbmcgbXVsdGlwbGUgdW5hcnkgb3BlcmF0b3JzIGFjdGluZyBvbiB0aGUgc2FtZSB2YXJpYWJsZSBpbiBhIG1ldGhvZCBjYWxsJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTXVsdGlwbGVVbmFyeU9wZXJhdG9yc0luTWV0aG9kQ2FsbFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBQYWNrYWdlIG5hbWVzIHNob3VsZCBtYXRjaCB0aGUgZGlyZWN0b3J5IHRoZXkgYXJlIGRlY2xhcmVkIGluJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUGFja2FnZUxvY2F0aW9uXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE5vbi1zdGFuZGFyZCBwYXJhbWV0ZXIgY29tbWVudDsgcHJlZmVyIGAvKnBhcmFtTmFtZT0qLyBhcmdgJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUGFyYW1ldGVyQ29tbWVudFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBVdGlsaXR5IGNsYXNzZXMgKG9ubHkgc3RhdGljIG1lbWJlcnMpIGFyZSBub3QgZGVzaWduZWQgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCBzaG91bGQgYmUgbWFkZSBub25pbnN0YW50aWFibGUgd2l0aCBhIGRlZmF1bHQgY29uc3RydWN0b3IuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUHJpdmF0ZUNvbnN0cnVjdG9yRm9yVXRpbGl0eUNsYXNzXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTU1NCwxMSArNTk0LDMxIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoZSBkZWZhdWx0IGNhc2Ugb2YgYSBzd2l0Y2ggc2hvdWxkIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBncm91cCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1N3aXRjaERlZmF1bHRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVW5jaGVja2VkIGV4Y2VwdGlvbnMgZG8gbm90IG5lZWQgdG8gYmUgZGVjbGFyZWQgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVGhyb3dzVW5jaGVja2VkRXhjZXB0aW9uXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFR5cGUgcGFyYW1ldGVycyBtdXN0IGJlIGEgc2luZ2xlIGxldHRlciB3aXRoIGFuIG9wdGlvbmFsIG51bWVyaWMgc3VmZml4LCBvciBhbiBVcHBlckNhbWVsQ2FzZSBuYW1lIGZvbGxvd2VkIGJ5IHRoZSBsZXR0ZXIgXCdUXCcuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVHlwZVBhcmFtZXRlck5hbWluZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBDb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIHNob3VsZCBhcHBlYXIgc2VxdWVudGlhbGx5IHdpdGggbm8gb3RoZXIgY29kZSBpbiBiZXR3ZWVuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVW5ncm91cGVkT3ZlcmxvYWRzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVubmVjZXNzYXJ5IGNhbGwgdG8gTnVsbFBvaW50ZXJUZXN0ZXIjc2V0RGVmYXVsdCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1VubmVjZXNzYXJ5U2V0RGVmYXVsdFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBVc2luZyBzdGF0aWMgaW1wb3J0cyBmb3IgdHlwZXMgaXMgdW5uZWNlc3NhcnknLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtVbm5lY2Vzc2FyeVN0YXRpY0ltcG9ydFxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC01NjcsNiArNjI3LDYxIEBACiAgICAgICAgICAnSmF2YTogV2lsZGNhcmQgaW1wb3J0cywgc3RhdGljIG9yIG90aGVyd2lzZSwgc2hvdWxkIG5vdCBiZSB1c2VkJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbV2lsZGNhcmRJbXBvcnRcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUmVtb3ZlRmllbGRQcmVmaXhlc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkxPVywKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBQcmVmZXIgYXNzZXJ0VGhyb3dzIHRvIEV4cGVjdGVkRXhjZXB0aW9uJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRXhwZWN0ZWRFeGNlcHRpb25NaWdyYXRpb25cXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5MT1csCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTG9nZ2VyIGluc3RhbmNlcyBhcmUgbm90IGNvbnN0YW50cyAtLSB0aGV5IGFyZSBtdXRhYmxlIGFuZCBoYXZlIHNpZGUgZWZmZWN0cyAtLSBhbmQgc2hvdWxkIG5vdCBiZSBuYW1lZCB1c2luZyBDT05TVEFOVCBDQVNFJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTG9nZ2VyVmFyaWFibGVDYXNlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTE9XLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFByZWZlciBhc3NlcnRUaHJvd3MgdG8gQFRlc3QoZXhwZWN0ZWQ9Li4uKScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Rlc3RFeGNlcHRpb25NaWdyYXRpb25cXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUHVibGljIGZpZWxkcyBtdXN0IGJlIGZpbmFsLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW05vbkZpbmFsUHVibGljRmllbGRzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFByaXZhdGUgZmllbGRzIHRoYXQgYXJlIG9ubHkgYXNzaWduZWQgaW4gdGhlIGluaXRpYWxpemVyIHNob3VsZCBiZSBtYWRlIGZpbmFsLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1ByaXZhdGVGaWVsZHNOb3RBc3NpZ25lZFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBMaXN0cyByZXR1cm5lZCBieSBtZXRob2RzIHNob3VsZCBiZSBpbW11dGFibGUuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUmV0dXJuZWRMaXN0Tm90SW1tdXRhYmxlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFBhcmFtZXRlcnMgdG8gbG9nIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSBnZW5lcmF0ZWQgYnkgYSBjYWxsIHRvIFN0cmluZy5mb3JtYXQoKSBvciBNZXNzYWdlRm9ybWF0LmZvcm1hdCgpLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1NhZmVyTG9nZ2VyRm9ybWF0XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFBhcmFtZXRlcnMgdG8gbG9nIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSBnZW5lcmF0ZWQgYnkgYSBjYWxsIHRvIHRvU3RyaW5nKCk7IHNlZSBiLzIyOTg2NjY1LicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1NhZmVyTG9nZ2VyVG9TdHJpbmdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQSBjYWxsIHRvIEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpIHNob3VsZCBiZSBmb2xsb3dlZCBieSBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eSgpIGluIGEgZmluYWxseSBibG9jay4gT3RoZXJ3aXNlIHRoZSB3cm9uZyBCaW5kZXIgaWRlbnRpdHkgbWF5IGJlIHVzZWQgYnkgc3Vic2VxdWVudCBjb2RlLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0JpbmRlcklkZW50aXR5UmVzdG9yZWREYW5nZXJvdXNseVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBDbGFzc2VzIGV4dGVuZGluZyBQcmVmZXJlbmNlQWN0aXZpdHkgbXVzdCBpbXBsZW1lbnQgaXNWYWxpZEZyYWdtZW50IHN1Y2ggdGhhdCBpdCBkb2VzIG5vdCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuIHRydWUgdG8gcHJldmVudCB2dWxuZXJhYmlsaXR5IHRvIGZyYWdtZW50IGluamVjdGlvbiBhdHRhY2tzLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0ZyYWdtZW50SW5qZWN0aW9uXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFN1YmNsYXNzZXMgb2YgRnJhZ21lbnQgbXVzdCBiZSBpbnN0YW50aWFibGUgdmlhIENsYXNzI25ld0luc3RhbmNlKCk6IHRoZSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgc3RhdGljIGFuZCBoYXZlIGEgcHVibGljIG51bGxhcnkgY29uc3RydWN0b3InLApAQCAtNTc5LDYgKzY5NCwyNiBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBBIHdha2Vsb2NrIGFjcXVpcmVkIHdpdGggYSB0aW1lb3V0IG1heSBiZSByZWxlYXNlZCBieSB0aGUgc3lzdGVtIGJlZm9yZSBjYWxsaW5nIGByZWxlYXNlYCwgZXZlbiBhZnRlciBjaGVja2luZyBgaXNIZWxkKClgLiBJZiBzbywgaXQgd2lsbCB0aHJvdyBhIFJ1bnRpbWVFeGNlcHRpb24uIFBsZWFzZSB3cmFwIGluIGEgdHJ5L2NhdGNoIGJsb2NrLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1dha2Vsb2NrUmVsZWFzZWREYW5nZXJvdXNseVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBBcmd1bWVudHMgYXJlIGluIHRoZSB3cm9uZyBvcmRlciBvciBjb3VsZCBiZSBjb21tZW50ZWQgZm9yIGNsYXJpdHkuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQXJndW1lbnRTZWxlY3Rpb25EZWZlY3RDaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEFyZ3VtZW50cyBhcmUgc3dhcHBlZCBpbiBhc3NlcnRFcXVhbHMtbGlrZSBjYWxsJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQXNzZXJ0RXF1YWxzQXJndW1lbnRPcmRlckNoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQW4gZXF1YWxpdHkgdGVzdCBiZXR3ZWVuIG9iamVjdHMgd2l0aCBpbmNvbXBhdGlibGUgdHlwZXMgYWx3YXlzIHJldHVybnMgZmFsc2UnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtFcXVhbHNJbmNvbXBhdGlibGVUeXBlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IEBBc3Npc3RlZEluamVjdCBhbmQgQEluamVjdCBzaG91bGQgbm90IGJlIHVzZWQgb24gZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBpbiB0aGUgc2FtZSBjbGFzcy4nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBc3Npc3RlZEluamVjdEFuZEluamVjdE9uQ29uc3RydWN0b3JzXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTYwNCwxMSArNzM5LDIxIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoZSBvcmRlcmluZyBvZiBwYXJhbWV0ZXJzIGluIG92ZXJsb2FkZWQgbWV0aG9kcyBzaG91bGQgYmUgYXMgY29uc2lzdGVudCBhcyBwb3NzaWJsZSAod2hlbiB2aWV3ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0KScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0luY29uc2lzdGVudE92ZXJsb2Fkc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBEb3VibGUtY2hlY2tlZCBsb2NraW5nIG9uIG5vbi12b2xhdGlsZSBmaWVsZHMgaXMgdW5zYWZlJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRG91YmxlQ2hlY2tlZExvY2tpbmdcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQW5ub3RhdGlvbnMgc2hvdWxkIGFsd2F5cyBiZSBpbW11dGFibGUnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbW11dGFibGVBbm5vdGF0aW9uQ2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBFbnVtcyBzaG91bGQgYWx3YXlzIGJlIGltbXV0YWJsZScsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0ltbXV0YWJsZUVudW1DaGVja2VyXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTYyOSwxMyArNzc0LDEzIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEEgZGlmZmVyZW50IHBvdGVudGlhbCBhcmd1bWVudCBpcyBtb3JlIHNpbWlsYXIgdG8gdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0aGFuIHRoZSBleGlzdGluZyBhcmd1bWVudDsgdGhpcyBtYXkgYmUgYW4gZXJyb3InLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBcmd1bWVudFBhcmFtZXRlck1pc21hdGNoXF0gLisiXX0sCisgICAgICAgICAnSmF2YTogQXNzZXJ0aW9ucyBtYXkgYmUgZGlzYWJsZWQgYXQgcnVudGltZSBhbmQgZG8gbm90IGd1YXJhbnRlZSB0aGF0IGV4ZWN1dGlvbiB3aWxsIGhhbHQgaGVyZTsgY29uc2lkZXIgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGluc3RlYWQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBc3NlcnRGYWxzZVxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBc3NlcnRpb25zIG1heSBiZSBkaXNhYmxlZCBhdCBydW50aW1lIGFuZCBkbyBub3QgZ3VhcmFudGVlIHRoYXQgZXhlY3V0aW9uIHdpbGwgaGFsdCBoZXJlOyBjb25zaWRlciB0aHJvd2luZyBhbiBleGNlcHRpb24gaW5zdGVhZCcsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Fzc2VydEZhbHNlXF0gLisiXX0sCisgICAgICAgICAnSmF2YTogVGhpcyBhc3NlcnRpb24gdGhyb3dzIGFuIEFzc2VydGlvbkVycm9yIGlmIGl0IGZhaWxzLCB3aGljaCB3aWxsIGJlIGNhdWdodCBieSBhbiBlbmNsb3NpbmcgdHJ5IGJsb2NrLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Fzc2VydGlvbkZhaWx1cmVJZ25vcmVkXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgpAQCAtNjY0LDIzICs4MDksNjMgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRHVyYXRpb24gY2FuIGJlIGV4cHJlc3NlZCBtb3JlIGNsZWFybHkgd2l0aCBkaWZmZXJlbnQgdW5pdHMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtDYW5vbmljYWxEdXJhdGlvblxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBMb2dnaW5nIG9yIHJldGhyb3dpbmcgZXhjZXB0aW9ucyBzaG91bGQgdXN1YWxseSBiZSBwcmVmZXJyZWQgdG8gY2F0Y2hpbmcgYW5kIGNhbGxpbmcgcHJpbnRTdGFja1RyYWNlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ2F0Y2hBbmRQcmludFN0YWNrVHJhY2VcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogSWdub3JpbmcgZXhjZXB0aW9ucyBhbmQgY2FsbGluZyBmYWlsKCkgaXMgdW5uZWNlc3NhcnksIGFuZCBtYWtlcyB0ZXN0IG91dHB1dCBsZXNzIHVzZWZ1bCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NhdGNoRmFpbFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBJbm5lciBjbGFzcyBpcyBub24tc3RhdGljIGJ1dCBkb2VzIG5vdCByZWZlcmVuY2UgZW5jbG9zaW5nIGNsYXNzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ2xhc3NDYW5CZVN0YXRpY1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBDbGFzcy5uZXdJbnN0YW5jZSgpIGJ5cGFzc2VzIGV4Y2VwdGlvbiBjaGVja2luZzsgcHJlZmVyIGdldENvbnN0cnVjdG9yKCkubmV3SW5zdGFuY2UoKScsCisgICAgICAgICAnSmF2YTogQ2xhc3MubmV3SW5zdGFuY2UoKSBieXBhc3NlcyBleGNlcHRpb24gY2hlY2tpbmc7IHByZWZlciBnZXREZWNsYXJlZENvbnN0cnVjdG9yKCkubmV3SW5zdGFuY2UoKScsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NsYXNzTmV3SW5zdGFuY2VcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogSW1wbGljaXQgdXNlIG9mIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGNoYXJzZXQsIHdoaWNoIGNhbiByZXN1bHQgaW4gZS5nLiBub24tQVNDSUkgY2hhcmFjdGVycyBiZWluZyBzaWxlbnRseSByZXBsYWNlZCB3aXRoIFwnP1wnIGluIG1hbnkgZW52aXJvbm1lbnRzJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRGVmYXVsdENoYXJzZXRcXSAuKyJdfSwKKyAgICAgICAgICdKYXZhOiBUaGUgdHlwZSBvZiB0aGUgYXJyYXkgcGFyYW1ldGVyIG9mIENvbGxlY3Rpb24udG9BcnJheSBuZWVkcyB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGFycmF5IHR5cGUnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtDb2xsZWN0aW9uVG9BcnJheVNhZmVQYXJhbWV0ZXJcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogVGhpcyBjb2RlLCB3aGljaCBjb3VudHMgZWxlbWVudHMgdXNpbmcgYSBsb29wLCBjYW4gYmUgcmVwbGFjZWQgYnkgYSBzaW1wbGVyIGxpYnJhcnkgbWV0aG9kJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRWxlbWVudHNDb3VudGVkSW5Mb29wXF0gLisiXX0sCisgICAgICAgICAnSmF2YTogQ29sbGVjdG9yLm9mKCkgc2hvdWxkIG5vdCB1c2Ugc3RhdGUnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtDb2xsZWN0b3JTaG91bGROb3RVc2VTdGF0ZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBDbGFzcyBzaG91bGQgbm90IGltcGxlbWVudCBib3RoIGBDb21wYXJhYmxlYCBhbmQgYENvbXBhcmF0b3JgJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29tcGFyYWJsZUFuZENvbXBhcmF0b3JcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ29uc3RydWN0b3JzIHNob3VsZCBub3QgaW52b2tlIG92ZXJyaWRhYmxlIG1ldGhvZHMuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29uc3RydWN0b3JJbnZva2VzT3ZlcnJpZGFibGVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ29uc3RydWN0b3JzIHNob3VsZCBub3QgcGFzcyB0aGUgXCd0aGlzXCcgcmVmZXJlbmNlIG91dCBpbiBtZXRob2QgaW52b2NhdGlvbnMsIHNpbmNlIHRoZSBvYmplY3QgbWF5IG5vdCBiZSBmdWxseSBjb25zdHJ1Y3RlZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtDb25zdHJ1Y3RvckxlYWtzVGhpc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBEYXRlRm9ybWF0IGlzIG5vdCB0aHJlYWQtc2FmZSwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBhcyBhIGNvbnN0YW50IGZpZWxkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0RhdGVGb3JtYXRDb25zdGFudFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBJbXBsaWNpdCB1c2Ugb2YgdGhlIHBsYXRmb3JtIGRlZmF1bHQgY2hhcnNldCwgd2hpY2ggY2FuIHJlc3VsdCBpbiBkaWZmZXJpbmcgYmVoYXZpb3IgYmV0d2VlbiBKVk0gZXhlY3V0aW9ucyBvciBpbmNvcnJlY3QgYmVoYXZpb3IgaWYgdGhlIGVuY29kaW5nIG9mIHRoZSBkYXRhIHNvdXJjZSBkb2VzblwndCBtYXRjaCBleHBlY3RhdGlvbnMuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRGVmYXVsdENoYXJzZXRcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CkBAIC02OTQsOCArODc5LDEzIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEFuIGVxdWFsaXR5IHRlc3QgYmV0d2VlbiBvYmplY3RzIHdpdGggaW5jb21wYXRpYmxlIHR5cGVzIGFsd2F5cyByZXR1cm5zIGZhbHNlJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRXF1YWxzSW5jb21wYXRpYmxlVHlwZVxdIC4rIl19LAorICAgICAgICAgJ0phdmE6IENhbGxzIHRvIEV4cGVjdGVkRXhjZXB0aW9uI2V4cGVjdCBzaG91bGQgYWx3YXlzIGJlIGZvbGxvd2VkIGJ5IGV4YWN0bHkgb25lIHN0YXRlbWVudC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtFeHBlY3RlZEV4Y2VwdGlvbkNoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogU3dpdGNoIGNhc2UgbWF5IGZhbGwgdGhyb3VnaCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0ZhbGxUaHJvdWdoXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgpAQCAtNzA0LDI2ICs4OTQsNjEgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIHBhcmVudGhlc2VzIHRvIG1ha2UgdGhlIHByZWNlZGVuY2UgZXhwbGljaXQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGbG9hdENhc3RcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbCBsb3NlcyBwcmVjaXNpb24nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGbG9hdGluZ1BvaW50TGl0ZXJhbFByZWNpc2lvblxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBPdmVybG9hZHMgd2lsbCBiZSBhbWJpZ3VvdXMgd2hlbiBwYXNzaW5nIGxhbWJkYSBhcmd1bWVudHMnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGdW5jdGlvbmFsSW50ZXJmYWNlQ2xhc2hcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUmV0dXJuIHZhbHVlIG9mIG1ldGhvZHMgcmV0dXJuaW5nIEZ1dHVyZSBtdXN0IGJlIGNoZWNrZWQuIElnbm9yaW5nIHJldHVybmVkIEZ1dHVyZXMgc3VwcHJlc3NlcyBleGNlcHRpb25zIHRocm93biBmcm9tIHRoZSBjb2RlIHRoYXQgY29tcGxldGVzIHRoZSBGdXR1cmUuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRnV0dXJlUmV0dXJuVmFsdWVJZ25vcmVkXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IENhbGxpbmcgZ2V0Q2xhc3MoKSBvbiBhbiBlbnVtIG1heSByZXR1cm4gYSBzdWJjbGFzcyBvZiB0aGUgZW51bSB0eXBlJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbR2V0Q2xhc3NPbkVudW1cXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogSGlkaW5nIGZpZWxkcyBvZiBzdXBlcmNsYXNzZXMgbWF5IGNhdXNlIGNvbmZ1c2lvbiBhbmQgZXJyb3JzJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSGlkaW5nRmllbGRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVGhpcyBhbm5vdGF0aW9uIGhhcyBpbmNvbXBhdGlibGUgbW9kaWZpZXJzIGFzIHNwZWNpZmllZCBieSBpdHMgQEluY29tcGF0aWJsZU1vZGlmaWVycyBhbm5vdGF0aW9uJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5jb21wYXRpYmxlTW9kaWZpZXJzXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoaXMgZm9yIGxvb3AgaW5jcmVtZW50cyB0aGUgc2FtZSB2YXJpYWJsZSBpbiB0aGUgaGVhZGVyIGFuZCBpbiB0aGUgYm9keScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0luY3JlbWVudEluRm9yTG9vcEFuZEhlYWRlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBQbGVhc2UgYWxzbyBvdmVycmlkZSBpbnQgcmVhZChieXRlW10sIGludCwgaW50KSwgb3RoZXJ3aXNlIG11bHRpLWJ5dGUgcmVhZHMgZnJvbSB0aGlzIGlucHV0IHN0cmVhbSBhcmUgbGlrZWx5IHRvIGJlIHNsb3cuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5wdXRTdHJlYW1TbG93TXVsdGlieXRlUmVhZFxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBDYXN0aW5nIGluc2lkZSBhbiBpZiBibG9jayBzaG91bGQgYmUgcGxhdXNpYmx5IGNvbnNpc3RlbnQgd2l0aCB0aGUgaW5zdGFuY2VvZiB0eXBlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5zdGFuY2VPZkFuZENhc3RNYXRjaFdyb25nVHlwZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBFeHByZXNzaW9uIG9mIHR5cGUgaW50IG1heSBvdmVyZmxvdyBiZWZvcmUgYmVpbmcgYXNzaWduZWQgdG8gYSBsb25nJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW50TG9uZ01hdGhcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogQ2xhc3Mgc2hvdWxkIG5vdCBpbXBsZW1lbnQgYm90aCBgSXRlcmFibGVgIGFuZCBgSXRlcmF0b3JgJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSXRlcmFibGVBbmRJdGVyYXRvclxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC03MzQsMTYgKzk1OSw0MSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBTb21lIEpVbml0NCBjb25zdHJ1Y3QgY2Fubm90IGJlIHVzZWQgaW4gYSBKVW5pdDMgY29udGV4dC4gQ29udmVydCB5b3VyIGNsYXNzIHRvIEpVbml0NCBzdHlsZSB0byB1c2UgdGhlbS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdDRDbGFzc1VzZWRJbkpVbml0M1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBUZXN0IGNsYXNzIGluaGVyaXRzIGZyb20gSlVuaXQgM1wncyBUZXN0Q2FzZSBidXQgaGFzIEpVbml0IDQgQFRlc3QgYW5ub3RhdGlvbnMuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSlVuaXRBbWJpZ3VvdXNUZXN0Q2xhc3NcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogVGhlIEdvb2dsZSBKYXZhIFN0eWxlIEd1aWRlIHJlcXVpcmVzIHN3aXRjaCBzdGF0ZW1lbnRzIHRvIGhhdmUgYW4gZXhwbGljaXQgZGVmYXVsdCcsCisgICAgICAgICAnSmF2YTogTmV2ZXIgcmV1c2UgY2xhc3MgbmFtZXMgZnJvbSBqYXZhLmxhbmcnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKYXZhTGFuZ0NsYXNoXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFN1Z2dlc3RzIGFsdGVybmF0aXZlcyB0byBvYnNvbGV0ZSBKREsgY2xhc3Nlcy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKZGtPYnNvbGV0ZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBBc3NpZ25tZW50IHdoZXJlIGEgYm9vbGVhbiBleHByZXNzaW9uIHdhcyBleHBlY3RlZDsgdXNlID09IGlmIHRoaXMgYXNzaWdubWVudCB3YXNuXCd0IGV4cGVjdGVkIG9yIGFkZCBwYXJlbnRoZXNlcyBmb3IgY2xhcml0eS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtMb2dpY2FsQXNzaWdubWVudFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBTd2l0Y2hlcyBvbiBlbnVtIHR5cGVzIHNob3VsZCBlaXRoZXIgaGFuZGxlIGFsbCB2YWx1ZXMsIG9yIGhhdmUgYSBkZWZhdWx0IGNhc2UuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTWlzc2luZ0Nhc2VzSW5FbnVtU3dpdGNoXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoZSBHb29nbGUgSmF2YSBTdHlsZSBHdWlkZSByZXF1aXJlcyB0aGF0IGVhY2ggc3dpdGNoIHN0YXRlbWVudCBpbmNsdWRlcyBhIGRlZmF1bHQgc3RhdGVtZW50IGdyb3VwLCBldmVuIGlmIGl0IGNvbnRhaW5zIG5vIGNvZGUuIChUaGlzIHJlcXVpcmVtZW50IGlzIGxpZnRlZCBmb3IgYW55IHN3aXRjaCBzdGF0ZW1lbnQgdGhhdCBjb3ZlcnMgYWxsIHZhbHVlcyBvZiBhbiBlbnVtLiknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNaXNzaW5nRGVmYXVsdFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBOb3QgY2FsbGluZyBmYWlsKCkgd2hlbiBleHBlY3RpbmcgYW4gZXhjZXB0aW9uIG1hc2tzIGJ1Z3MnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNaXNzaW5nRmFpbFxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC03NTQsMTEgKzEwMDQsMzYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQ29tcG91bmQgYXNzaWdubWVudHMgdG8gYnl0ZXMsIHNob3J0cywgY2hhcnMsIGFuZCBmbG9hdHMgaGlkZSBkYW5nZXJvdXMgY2FzdHMnLAorICAgICAgICAgJ0phdmE6IE1vZGlmeWluZyBhIGNvbGxlY3Rpb24gd2hpbGUgaXRlcmF0aW5nIG92ZXIgaXQgaW4gYSBsb29wIG1heSBjYXVzZSBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gdG8gYmUgdGhyb3duLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW01vZGlmeUNvbGxlY3Rpb25JbkVuaGFuY2VkRm9yTG9vcFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBNdWx0aXBsZSBjYWxscyB0byBlaXRoZXIgcGFyYWxsZWwgb3Igc2VxdWVudGlhbCBhcmUgdW5uZWNlc3NhcnkgYW5kIGNhdXNlIGNvbmZ1c2lvbi4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNdWx0aXBsZVBhcmFsbGVsT3JTZXF1ZW50aWFsQ2FsbHNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ29uc3RhbnQgZmllbGQgZGVjbGFyYXRpb25zIHNob3VsZCB1c2UgdGhlIGltbXV0YWJsZSB0eXBlIChzdWNoIGFzIEltbXV0YWJsZUxpc3QpIGluc3RlYWQgb2YgdGhlIGdlbmVyYWwgY29sbGVjdGlvbiBpbnRlcmZhY2UgdHlwZSAoc3VjaCBhcyBMaXN0KScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW011dGFibGVDb25zdGFudEZpZWxkXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE1ldGhvZCByZXR1cm4gdHlwZSBzaG91bGQgdXNlIHRoZSBpbW11dGFibGUgdHlwZSAoc3VjaCBhcyBJbW11dGFibGVMaXN0KSBpbnN0ZWFkIG9mIHRoZSBnZW5lcmFsIGNvbGxlY3Rpb24gaW50ZXJmYWNlIHR5cGUgKHN1Y2ggYXMgTGlzdCknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtNdXRhYmxlTWV0aG9kUmV0dXJuVHlwZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBDb21wb3VuZCBhc3NpZ25tZW50cyBtYXkgaGlkZSBkYW5nZXJvdXMgY2FzdHMnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtOYXJyb3dpbmdDb21wb3VuZEFzc2lnbm1lbnRcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTmVzdGVkIGluc3RhbmNlT2YgY29uZGl0aW9ucyBvZiBkaXNqb2ludCB0eXBlcyBjcmVhdGUgYmxvY2tzIG9mIGNvZGUgdGhhdCBuZXZlciBleGVjdXRlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTmVzdGVkSW5zdGFuY2VPZkNvbmRpdGlvbnNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVGhpcyB1cGRhdGUgb2YgYSB2b2xhdGlsZSB2YXJpYWJsZSBpcyBub24tYXRvbWljJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTm9uQXRvbWljVm9sYXRpbGVVcGRhdGVcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtNzk0LDYgKzEwNjksMzEgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogT25lIHNob3VsZCBub3QgY2FsbCBvcHRpb25hbC5nZXQoKSBpbnNpZGUgYW4gaWYgc3RhdGVtZW50IHRoYXQgY2hlY2tzICFvcHRpb25hbC5pc1ByZXNlbnQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtPcHRpb25hbE5vdFByZXNlbnRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogU3RyaW5nIGxpdGVyYWwgY29udGFpbnMgZm9ybWF0IHNwZWNpZmllcnMsIGJ1dCBpcyBub3QgcGFzc2VkIHRvIGEgZm9ybWF0IG1ldGhvZCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW09ycGhhbmVkRm9ybWF0U3RyaW5nXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRvIHJldHVybiBhIGN1c3RvbSBtZXNzYWdlIHdpdGggYSBUaHJvd2FibGUgY2xhc3MsIG9uZSBzaG91bGQgb3ZlcnJpZGUgZ2V0TWVzc2FnZSgpIGluc3RlYWQgb2YgdG9TdHJpbmcoKSBmb3IgVGhyb3dhYmxlLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW092ZXJyaWRlVGhyb3dhYmxlVG9TdHJpbmdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVmFyYXJncyBkb2VzblwndCBhZ3JlZSBmb3Igb3ZlcnJpZGRlbiBtZXRob2QnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtPdmVycmlkZXNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRGV0ZWN0cyBgLyogbmFtZT0gKi9gLXN0eWxlIGNvbW1lbnRzIG9uIGFjdHVhbCBwYXJhbWV0ZXJzIHdoZXJlIHRoZSBuYW1lIGRvZXNuXCd0IG1hdGNoIHRoZSBmb3JtYWwgcGFyYW1ldGVyJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUGFyYW1ldGVyTmFtZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBQcmVjb25kaXRpb25zIG9ubHkgYWNjZXB0cyB0aGUgJXMgcGxhY2Vob2xkZXIgaW4gZXJyb3IgbWVzc2FnZSBzdHJpbmdzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUHJlY29uZGl0aW9uc0ludmFsaWRQbGFjZWhvbGRlclxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC04MDksNiArMTEwOSwxNiBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBCdWdDaGVja2VyIGhhcyBpbmNvcnJlY3QgUHJvdmlkZXNGaXggdGFnLCBwbGVhc2UgdXBkYXRlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUHJvdmlkZXNGaXhcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogcmVhY2hhYmlsaXR5RmVuY2Ugc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgaW5zaWRlIGEgZmluYWxseSBibG9jaycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1JlYWNoYWJpbGl0eUZlbmNlVXNhZ2VcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVGhyb3duIGV4Y2VwdGlvbiBpcyBhIHN1YnR5cGUgb2YgYW5vdGhlcicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1JlZHVuZGFudFRocm93c1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC04MjQsOCArMTEzNCwxOCBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBIHN0YXRpYyB2YXJpYWJsZSBvciBtZXRob2Qgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZCBmcm9tIGFuIG9iamVjdCBpbnN0YW5jZScsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1N0YXRpY0FjY2Vzc2VkRnJvbUluc3RhbmNlXF0gLisiXX0sCisgICAgICAgICAnSmF2YTogUHJlZmVyIHRoZSBzaG9ydC1jaXJjdWl0aW5nIGJvb2xlYW4gb3BlcmF0b3JzIFx1MDAyNlx1MDAyNiBhbmQgfHwgdG8gXHUwMDI2IGFuZCB8LicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Nob3J0Q2lyY3VpdEJvb2xlYW5cXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQSBzdGF0aWMgdmFyaWFibGUgb3IgbWV0aG9kIHNob3VsZCBiZSBxdWFsaWZpZWQgd2l0aCBhIGNsYXNzIG5hbWUsIG5vdCBleHByZXNzaW9uJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU3RhdGljUXVhbGlmaWVkVXNpbmdFeHByZXNzaW9uXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFN0cmVhbXMgdGhhdCBlbmNhcHN1bGF0ZSBhIGNsb3NlYWJsZSByZXNvdXJjZSBzaG91bGQgYmUgY2xvc2VkIHVzaW5nIHRyeS13aXRoLXJlc291cmNlcycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1N0cmVhbVJlc291cmNlTGVha1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKQEAgLTgzNCwxMyArMTE1NCw0MyBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBTdHJpbmcuc3BsaXQgc2hvdWxkIG5ldmVyIHRha2Ugb25seSBhIHNpbmdsZSBhcmd1bWVudDsgaXQgaGFzIHN1cnByaXNpbmcgYmVoYXZpb3InLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTdHJpbmdTcGxpdFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBQcmVmZXIgU3BsaXR0ZXIgdG8gU3RyaW5nLnNwbGl0JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU3RyaW5nU3BsaXR0ZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNpbmcgQFRlc3QoZXhwZWN0ZWQ9Li4uKSBpcyBkaXNjb3VyYWdlZCwgc2luY2UgdGhlIHRlc3Qgd2lsbCBwYXNzIGlmICphbnkqIHN0YXRlbWVudCBpbiB0aGUgdGVzdCBtZXRob2QgdGhyb3dzIHRoZSBleHBlY3RlZCBleGNlcHRpb24nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUZXN0RXhjZXB0aW9uQ2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaHJlYWQuam9pbiBuZWVkcyB0byBiZSBzdXJyb3VuZGVkIGJ5IGEgbG9vcCB1bnRpbCBpdCBzdWNjZWVkcywgYXMgaW4gVW5pbnRlcnJ1cHRpYmxlcy5qb2luVW5pbnRlcnJ1cHRpYmx5LicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1RocmVhZEpvaW5Mb29wXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRocmVhZExvY2FscyBzaG91bGQgYmUgc3RvcmVkIGluIHN0YXRpYyBmaWVsZHMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUaHJlYWRMb2NhbFVzYWdlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRocmVlLWxldHRlciB0aW1lIHpvbmUgaWRlbnRpZmllcnMgYXJlIGRlcHJlY2F0ZWQsIG1heSBiZSBhbWJpZ3VvdXMsIGFuZCBtaWdodCBub3QgZG8gd2hhdCB5b3UgaW50ZW5kOyB0aGUgZnVsbCBJQU5BIHRpbWUgem9uZSBJRCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1RocmVlTGV0dGVyVGltZVpvbmVJRFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBUcnV0aCBMaWJyYXJ5IGFzc2VydCBpcyBjYWxsZWQgb24gYSBjb25zdGFudC4nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUcnV0aENvbnN0YW50QXNzZXJ0c1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBbiBvYmplY3QgaXMgdGVzdGVkIGZvciBlcXVhbGl0eSB0byBpdHNlbGYgdXNpbmcgVHJ1dGggTGlicmFyaWVzLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1RydXRoU2VsZkVxdWFsc1xdIC4rIl19LAorICAgICAgICAgJ0phdmE6IFR5cGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIG92ZXJyaWRlcyBhbm90aGVyIHR5cGUgcGFyYW1ldGVyIGFscmVhZHkgZGVjbGFyZWQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUeXBlUGFyYW1ldGVyU2hhZG93aW5nXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgpAQCAtODQ5LDExICsxMTk5LDMxIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IENyZWF0aW9uIG9mIGEgU2V0L0hhc2hTZXQvSGFzaE1hcCBvZiBqYXZhLm5ldC5VUkwuIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpIG9mIGphdmEubmV0LlVSTCBjbGFzcyBtYWtlIGJsb2NraW5nIGludGVybmV0IGNvbm5lY3Rpb25zLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1VSTEVxdWFsc0hhc2hDb2RlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFN3aXRjaCBoYW5kbGVzIGFsbCBlbnVtIHZhbHVlczsgYW4gZXhwbGljaXQgZGVmYXVsdCBjYXNlIGlzIHVubmVjZXNzYXJ5IGFuZCBkZWZlYXRzIGVycm9yIGNoZWNraW5nIGZvciBub24tZXhoYXVzdGl2ZSBzd2l0Y2hlcy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtVbm5lY2Vzc2FyeURlZmF1bHRJbkVudW1Td2l0Y2hcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRmluYWxpemVyIG1heSBydW4gYmVmb3JlIG5hdGl2ZSBjb2RlIGZpbmlzaGVzIGV4ZWN1dGlvbicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Vuc2FmZUZpbmFsaXphdGlvblxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBVbnN5bmNocm9uaXplZCBtZXRob2Qgb3ZlcnJpZGVzIGEgc3luY2hyb25pemVkIG1ldGhvZC4nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtVbnN5bmNocm9uaXplZE92ZXJyaWRlc1N5bmNocm9uaXplZFxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBKYXZhIGFzc2VydCBpcyB1c2VkIGluIHRlc3QuIEZvciB0ZXN0aW5nIHB1cnBvc2VzIEFzc2VydC4qIG1hdGNoZXJzIHNob3VsZCBiZSB1c2VkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1VzZUNvcnJlY3RBc3NlcnRJblRlc3RzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IE5vbi1jb25zdGFudCB2YXJpYWJsZSBtaXNzaW5nIEBWYXIgYW5ub3RhdGlvbicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1ZhclxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC04NjIsNiArMTIzMiwxNTEgQEAKICAgICAgICAgICdKYXZhOiBCZWNhdXNlIG9mIHNwdXJpb3VzIHdha2V1cHMsIE9iamVjdC53YWl0KCkgYW5kIENvbmRpdGlvbi5hd2FpdCgpIG11c3QgYWx3YXlzIGJlIGNhbGxlZCBpbiBhIGxvb3AnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtXYWl0Tm90SW5Mb29wXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFBsdWdnYWJsZSBUeXBlIGNoZWNrZXIgaW50ZXJuYWwgZXJyb3InLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtQbHVnZ2FibGVUeXBlQ2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBJbnZhbGlkIG1lc3NhZ2UgZm9ybWF0LXN0eWxlIGZvcm1hdCBzcGVjaWZpZXIgKHswfSksIGV4cGVjdGVkIHByaW50Zi1zdHlsZSAoJXMpJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRmxvZ2dlck1lc3NhZ2VGb3JtYXRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTG9nZ2VyIGxldmVsIGNoZWNrIGlzIGFscmVhZHkgaW1wbGllZCBpbiB0aGUgbG9nKCkgY2FsbC4gQW4gZXhwbGljaXQgYXRbTGV2ZWxdKCkuaXNFbmFibGVkKCkgY2hlY2sgaXMgcmVkdW5kYW50LicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Zsb2dnZXJSZWR1bmRhbnRJc0VuYWJsZWRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ2FsbGluZyB3aXRoQ2F1c2UoVGhyb3dhYmxlKSB3aXRoIGFuIGlubGluZSBhbGxvY2F0ZWQgVGhyb3dhYmxlIGlzIGRpc2NvdXJhZ2VkLiBDb25zaWRlciB1c2luZyB3aXRoU3RhY2tUcmFjZShTdGFja1NpemUpIGluc3RlYWQsIGFuZCBzcGVjaWZ5aW5nIGEgcmVkdWNlZCBzdGFjayBzaXplIChlLmcuIFNNQUxMLCBNRURJVU0gb3IgTEFSR0UpIGluc3RlYWQgb2YgRlVMTCwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGbG9nZ2VyV2l0aENhdXNlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSB3aXRoQ2F1c2UgdG8gYXNzb2NpYXRlIEV4Y2VwdGlvbnMgd2l0aCBsb2cgc3RhdGVtZW50cycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Zsb2dnZXJXaXRob3V0Q2F1c2VcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTm8gYnVnIGV4aXN0cyB0byB0cmFjayBhbiBpZ25vcmVkIHRlc3QnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJZ25vcmVkVGVzdFdpdGhvdXRCdWdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQElnbm9yZSBpcyBwcmVmZXJyZWQgdG8gQFN1cHByZXNzIGZvciBKVW5pdDQgdGVzdHMuIEBTdXBwcmVzcyBtYXkgc2lsZW50bHkgZmFpbCBpbiBKVW5pdDQgKHRoYXQgaXMsIHRlc3RzIG1heSBydW4gYW55d2F5LiknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdDRTdXBwcmVzc1dpdGhvdXRJZ25vcmVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTWVkaXVtIGFuZCBsYXJnZSB0ZXN0IGNsYXNzZXMgc2hvdWxkIGRvY3VtZW50IHdoeSB0aGV5IGFyZSBtZWRpdW0gb3IgbGFyZ2UnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdDRUZXN0QXR0cmlidXRlTWlzc2luZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBqYXZhLm5ldC5JRE4gaW1wbGVtZW50cyB0aGUgb2xkZXIgSUROQTIwMDMgc3RhbmRhcmQuIFByZWZlciBjb20uZ29vZ2xlLmkxOG4uSWRuLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBuZXdlciBVVFMgIzQ2IHN0YW5kYXJkJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSmF2YU5ldElkblxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBDb25zaWRlciByZXF1aXJpbmcgc3RyaWN0IHBhcnNpbmcgb24gSm9kYUR1cmF0aW9uRmxhZyBpbnN0YW5jZXMuIEJlZm9yZSBhZGp1c3RpbmcgZXhpc3RpbmcgZmxhZ3MsIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB5b3VyIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gdG8gYXZvaWQgY3Jhc2hlcyEnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKb2RhRHVyYXRpb25GbGFnU3RyaWN0UGFyc2luZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBMb2dnaW5nIGFuIGV4Y2VwdGlvbiBhbmQgdGhyb3dpbmcgaXQgKG9yIGEgbmV3IGV4Y2VwdGlvbikgZm9yIHRoZSBzYW1lIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbiBpcyBhbiBhbnRpLXBhdHRlcm4uJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTG9nQW5kVGhyb3dcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRm9ybWF0dGluZ0xvZ2dlciB1c2VzIHdyb25nIG9yIG1pc21hdGNoZWQgZm9ybWF0IHN0cmluZycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW01pc3VzZWRGb3JtYXR0aW5nTG9nZ2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuTUVESVVNLAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEZsYWdzIHNob3VsZCBiZSBmaW5hbCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW05vbkZpbmFsRmxhZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5Lk1FRElVTSwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBSZWFkaW5nIGEgZmxhZyBmcm9tIGEgc3RhdGljIGZpZWxkIG9yIGluaXRpYWxpemVyIGJsb2NrIHdpbGwgY2F1c2UgaXQgdG8gYWx3YXlzIHJlY2VpdmUgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIHdpbGwgY2F1c2UgYW4gSWxsZWdhbEZsYWdTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZmxhZyBpcyBldmVyIHNldC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTdGF0aWNGbGFnVXNhZ2VcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5NRURJVU0sCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQXBwcyBtdXN0IHVzZSBCdWlsZENvbXBhdC5pc0F0TGVhc3RPIHRvIGNoZWNrIHdoZXRoZXIgdGhleVwncmUgcnVubmluZyBvbiBBbmRyb2lkIE8nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtVbnNhZmVTZGtWZXJzaW9uQ2hlY2tcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IExvZ2dpbmcgdGFnIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAyMyBjaGFyYWN0ZXJzLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0xvZ1RhZ0xlbmd0aFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUmVsYXRpdmUgY2xhc3MgbmFtZSBwYXNzZWQgdG8gQ29tcG9uZW50TmFtZSBjb25zdHJ1Y3RvcicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1JlbGF0aXZlQ29tcG9uZW50TmFtZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRXhwbGljaXRseSBlbnVtZXJhdGUgYWxsIGNhc2VzIGluIHN3aXRjaCBzdGF0ZW1lbnRzIGZvciBjZXJ0YWluIGVudW0gdHlwZXMuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRW51bWVyYXRlQWxsQ2FzZXNJbkVudW1Td2l0Y2hcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IERvIG5vdCBjYWxsIGFzc3VtZVRydWUodGVzdGVyLmdldEV4cGVyaW1lbnRWYWx1ZUZvciguLi4pKS4gVXNlIEBSZXF1aXJlRW5kVG9FbmRUZXN0RXhwZXJpbWVudCBpbnN0ZWFkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pVbml0QXNzdW1lRXhwZXJpbWVudFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGhlIGFjY2Vzc2VkIGZpZWxkIG9yIG1ldGhvZCBpcyBub3QgdmlzaWJsZSBoZXJlLiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgcHJvZHVjdGlvbiB2aXNpYmlsaXR5IGZvciBAVmlzaWJsZUZvclRlc3RpbmcgaXMgVmlzaWJpbGl0eS5QUklWQVRFLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Zpc2libGVGb3JUZXN0aW5nQ2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRGV0ZWN0cyBlcnJvcnMgZW5jb3VudGVyZWQgYnVpbGRpbmcgRXJyb3IgUHJvbmUgcGx1Z2lucycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Vycm9yUHJvbmVQbHVnaW5Db3JyZWN0bmVzc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUGFyY2VsYWJsZSBDUkVBVE9SIGZpZWxkcyBzaG91bGQgYmUgQ3JlYXRvclx1MDAzY1Q+JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUGFyY2VsYWJsZUNyZWF0b3JUeXBlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBFbmZvcmNlIHJlZmxlY3RlZCBQYXJjZWxhYmxlcyBhcmUga2VwdCBieSBQcm9ndWFyZCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1JlZmxlY3RlZFBhcmNlbGFibGVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEFueSBjbGFzcyB0aGF0IGV4dGVuZHMgSW50ZW50U2VydmljZSBzaG91bGQgaGF2ZSBATnVsbGFibGUgbm90YXRpb24gb24gbWV0aG9kIG9uSGFuZGxlSW50ZW50KEBOdWxsYWJsZSBJbnRlbnQgaW50ZW50KSBhbmQgaGFuZGxlIHRoZSBjYXNlIGlmIGludGVudCBpcyBudWxsLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW09uSGFuZGxlSW50ZW50TnVsbGFibGVDaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBJbiBtYW55IGNhc2VzLCByYW5kb21VVUlEIGlzIG5vdCBuZWNlc3NhcnksIGFuZCBpdCBzbG93cyB0aGUgcGVyZm9ybWFuY2UsIHdoaWNoIGNhbiBiZSBxdWl0ZSBzZXZlcmUgZXNwZWNpYWxseSB3aGVuIHRoaXMgb3BlcmF0aW9uIGhhcHBlbnMgYXQgc3RhcnQgdXAgdGltZS4gQ29uc2lkZXIgcmVwbGFjaW5nIGl0IHdpdGggY2hlYXBlciBhbHRlcm5hdGl2ZXMsIGxpa2Ugb2JqZWN0Lmhhc2hDb2RlKCkgb3IgSWRHZW5lcmF0b3IuSU5TVEFOQ0UuZ2V0UmFuZG9tSWQoKScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1VVSURDaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBEeW5hbWljQWN0aXZpdHkuZmluZFZpZXdCeUlkKGludCkgaXMgc2xvdyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBWaWV3Lm9uRHJhdyhDYW52YXMpIScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW05vRmluZFZpZXdCeUlkSW5PbkRyYXdDaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBQYXNzaW5nIFRocm93YWJsZS9FeGNlcHRpb24gYXJndW1lbnQgdG8gdGhlIG1lc3NhZ2UgZm9ybWF0IEwueCgpLiBDYWxsaW5nIEwudyh0YWcsIG1lc3NhZ2UsIGV4KSBpbnN0ZWFkIG9mIEwudyh0YWcsIGV4LCBtZXNzYWdlKScsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1dyb25nVGhyb3dhYmxlQXJndW1lbnRJbkxvZ0NoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE5ldyBzcGxpY2VycyBhcmUgZGlzYWxsb3dlZCBvbiBwYXRocyB0aGF0IGFyZSBiZWluZyBMaWJzZWFyY2hlZCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0JsYWNrbGlzdGVkU3BsaWNlclBhdGhDaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBPYmplY3Qgc2VyaWFsaXplZCBpbiBCdW5kbGUgbWF5IGhhdmUgYmVlbiBmbGF0dGVuZWQgdG8gYmFzZSB0eXBlLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0J1bmRsZURlc2VyaWFsaXphdGlvbkNhc3RcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IExvZyB0YWcgdG9vIGxvbmcsIGNhbm5vdCBleGNlZWQgMjMgY2hhcmFjdGVycy4nLApAQCAtODc5LDExICsxMzk0LDYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFN0YXRpYyBhbmQgZGVmYXVsdCBtZXRob2RzIGluIGludGVyZmFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIGFuZHJvaWQgYnVpbGRzLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1N0YXRpY09yRGVmYXVsdEludGVyZmFjZU1ldGhvZFxdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogSW5jb21wYXRpYmxlIHR5cGUgYXMgYXJndW1lbnQgdG8gT2JqZWN0LWFjY2VwdGluZyBKYXZhIGNvbGxlY3Rpb25zIG1ldGhvZCcsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0NvbGxlY3Rpb25JbmNvbXBhdGlibGVUeXBlXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTkwOSwxMTMgKzE0MTksOCBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQEFzc2lzdGVkSW5qZWN0IGFuZCBASW5qZWN0IGNhbm5vdCBiZSB1c2VkIG9uIHRoZSBzYW1lIGNvbnN0cnVjdG9yLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Fzc2lzdGVkSW5qZWN0QW5kSW5qZWN0T25TYW1lQ29uc3RydWN0b3JcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEBBdXRvRmFjdG9yeSBhbmQgQEluamVjdCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgdHlwZS4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBdXRvRmFjdG9yeUF0SW5qZWN0XF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBJbmplY3RlZCBjb25zdHJ1Y3RvcnMgY2Fubm90IGJlIG9wdGlvbmFsIG5vciBoYXZlIGJpbmRpbmcgYW5ub3RhdGlvbnMnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbmplY3RlZENvbnN0cnVjdG9yQW5ub3RhdGlvbnNcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEEgc2NvcGluZyBhbm5vdGF0aW9uXCdzIFRhcmdldCBzaG91bGQgaW5jbHVkZSBUWVBFIGFuZCBNRVRIT0QuJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5qZWN0SW52YWxpZFRhcmdldGluZ09uU2NvcGluZ0Fubm90YXRpb25cXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEFic3RyYWN0IGFuZCBkZWZhdWx0IG1ldGhvZHMgYXJlIG5vdCBpbmplY3RhYmxlIHdpdGggamF2YXguaW5qZWN0LkluamVjdCcsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0phdmF4SW5qZWN0T25BYnN0cmFjdE1ldGhvZFxdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQGphdmF4LmluamVjdC5JbmplY3QgY2Fubm90IGJlIHB1dCBvbiBhIGZpbmFsIGZpZWxkLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0phdmF4SW5qZWN0T25GaW5hbEZpZWxkXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBUaGlzIGNsYXNzIGhhcyBtb3JlIHRoYW4gb25lIEBJbmplY3QtYW5ub3RhdGVkIGNvbnN0cnVjdG9yLiBQbGVhc2UgcmVtb3ZlIHRoZSBASW5qZWN0IGFubm90YXRpb24gZnJvbSBhbGwgYnV0IG9uZSBvZiB0aGVtLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW01vcmVUaGFuT25lSW5qZWN0YWJsZUNvbnN0cnVjdG9yXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBVc2luZyBtb3JlIHRoYW4gb25lIHF1YWxpZmllciBhbm5vdGF0aW9uIG9uIHRoZSBzYW1lIGVsZW1lbnQgaXMgbm90IGFsbG93ZWQuJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5qZWN0TW9yZVRoYW5PbmVRdWFsaWZpZXJcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEEgY2xhc3MgY2FuIGJlIGFubm90YXRlZCB3aXRoIGF0IG1vc3Qgb25lIHNjb3BlIGFubm90YXRpb24uJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5qZWN0TW9yZVRoYW5PbmVTY29wZUFubm90YXRpb25PbkNsYXNzXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBbm5vdGF0aW9ucyBjYW5ub3QgYmUgYm90aCBTY29wZSBhbm5vdGF0aW9ucyBhbmQgUXVhbGlmaWVyIGFubm90YXRpb25zOiB0aGlzIGNhdXNlcyBjb25mdXNpb24gd2hlbiB0cnlpbmcgdG8gdXNlIHRoZW0uJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbT3ZlcmxhcHBpbmdRdWFsaWZpZXJBbmRTY29wZUFubm90YXRpb25cXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFF1YWxpZmllciBhcHBsaWVkIHRvIGEgbWV0aG9kIHRoYXQgaXNuXCd0IGEgQFByb3ZpZGVzIG1ldGhvZC4gVGhpcyBtZXRob2Qgd29uXCd0IGJlIHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUXVhbGlmaWVyT25NZXRob2RXaXRob3V0UHJvdmlkZXNcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFNjb3BlIGFubm90YXRpb24gb24gYW4gaW50ZXJmYWNlIG9yIGFic3RhY3QgY2xhc3MgaXMgbm90IGFsbG93ZWQnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbmplY3RTY29wZUFubm90YXRpb25PbkludGVyZmFjZU9yQWJzdHJhY3RDbGFzc1xdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogU2NvcGluZyBhbmQgcXVhbGlmaWVyIGFubm90YXRpb25zIG11c3QgaGF2ZSBydW50aW1lIHJldGVudGlvbi4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbmplY3RTY29wZU9yUXVhbGlmaWVyQW5ub3RhdGlvblJldGVudGlvblxdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogYEBNdWx0aWJpbmRzYCBpcyB0aGUgbmV3IHdheSB0byBkZWNsYXJlIG11bHRpYmluZGluZ3MuJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTXVsdGliaW5kc0luc3RlYWRPZk11bHRpYmluZGluZ3NcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IERhZ2dlciBAUHJvdmlkZXMgbWV0aG9kcyBtYXkgbm90IHJldHVybiBudWxsIHVubGVzcyBhbm5vdGF0ZWQgd2l0aCBATnVsbGFibGUnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtEYWdnZXJQcm92aWRlc051bGxcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFNjb3BlIGFubm90YXRpb24gb24gaW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgQXNzaXN0ZWRJbmplY3QgZmFjdG9yeSBpcyBub3QgYWxsb3dlZCcsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0d1aWNlQXNzaXN0ZWRJbmplY3RTY29waW5nXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBIGNvbnN0cnVjdG9yIGNhbm5vdCBoYXZlIHR3byBAQXNzaXN0ZWQgcGFyYW1ldGVycyBvZiB0aGUgc2FtZSB0eXBlIHVubGVzcyB0aGV5IGFyZSBkaXNhbWJpZ3VhdGVkIHdpdGggbmFtZWQgQEFzc2lzdGVkIGFubm90YXRpb25zLicsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0d1aWNlQXNzaXN0ZWRQYXJhbWV0ZXJzXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBbHRob3VnaCBHdWljZSBhbGxvd3MgaW5qZWN0aW5nIGZpbmFsIGZpZWxkcywgZG9pbmcgc28gaXMgZGlzYWxsb3dlZCBiZWNhdXNlIHRoZSBpbmplY3RlZCB2YWx1ZSBtYXkgbm90IGJlIHZpc2libGUgdG8gb3RoZXIgdGhyZWFkcy4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtHdWljZUluamVjdE9uRmluYWxGaWVsZFxdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogVGhpcyBtZXRob2QgaXMgbm90IGFubm90YXRlZCB3aXRoIEBJbmplY3QsIGJ1dCBpdCBvdmVycmlkZXMgYSBtZXRob2QgdGhhdCBpcyAgYW5ub3RhdGVkIHdpdGggQGphdmF4LmluamVjdC5JbmplY3QuIFRoZSBtZXRob2Qgd2lsbCBub3QgYmUgSW5qZWN0ZWQuJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbT3ZlcnJpZGVzSmF2YXhJbmplY3RhYmxlTWV0aG9kXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBAUHJvdmlkZXMgbWV0aG9kcyBuZWVkIHRvIGJlIGRlY2xhcmVkIGluIGEgTW9kdWxlIHRvIGhhdmUgYW55IGVmZmVjdC4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtQcm92aWRlc01ldGhvZE91dHNpZGVPZk1vZHVsZVxdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogQ2hlY2tzIGZvciB1bmd1YXJkZWQgYWNjZXNzZXMgdG8gZmllbGRzIGFuZCBtZXRob2RzIHdpdGggQEd1YXJkZWRCeSBhbm5vdGF0aW9ucycsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0d1YXJkZWRCeUNoZWNrZXJcXSAuKyJdfSwKLSAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAotICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAotICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IEludmFsaWQgQEd1YXJkZWRCeSBleHByZXNzaW9uJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbR3VhcmRlZEJ5VmFsaWRhdG9yXF0gLisiXX0sCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0d1YXJkZWRCeVxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CkBAIC0xMDM0LDEzICsxNDM5LDEzIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBbiBhcmd1bWVudCBpcyBtb3JlIHNpbWlsYXIgdG8gYSBkaWZmZXJlbnQgcGFyYW1ldGVyOyB0aGUgYXJndW1lbnRzIG1heSBoYXZlIGJlZW4gc3dhcHBlZC4nLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtBcmd1bWVudFBhcmFtZXRlclN3YXBcXSAuKyJdfSwKKyAgICAgICAgICdKYXZhOiBSZWZlcmVuY2UgZXF1YWxpdHkgdXNlZCB0byBjb21wYXJlIGFycmF5cycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0FycmF5RXF1YWxzXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBSZWZlcmVuY2UgZXF1YWxpdHkgdXNlZCB0byBjb21wYXJlIGFycmF5cycsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0FycmF5RXF1YWxzXF0gLisiXX0sCisgICAgICAgICAnSmF2YTogQXJyYXlzLmZpbGwoT2JqZWN0W10sIE9iamVjdCkgY2FsbGVkIHdpdGggaW5jb21wYXRpYmxlIHR5cGVzLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0FycmF5RmlsbEluY29tcGF0aWJsZVR5cGVcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgpAQCAtMTA4OSw2ICsxNDk0LDExIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiAgSW1wbGVtZW50aW5nIFwnQ29tcGFyYWJsZVx1MDAzY1Q+XCcgd2hlcmUgVCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29tcGFyYWJsZVR5cGVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IFRoaXMgY29tcGFyaXNvbiBtZXRob2QgdmlvbGF0ZXMgdGhlIGNvbnRyYWN0JywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29tcGFyaXNvbkNvbnRyYWN0VmlvbGF0ZWRcXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtMTEwNCw2ICsxNTE0LDE2IEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBOb24tdHJpdmlhbCBjb21waWxlIHRpbWUgY29uc3RhbnQgYm9vbGVhbiBleHByZXNzaW9ucyBzaG91bGRuXCd0IGJlIHVzZWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29tcGxleEJvb2xlYW5Db25zdGFudFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQSBjb25kaXRpb25hbCBleHByZXNzaW9uIHdpdGggbnVtZXJpYyBvcGVyYW5kcyBvZiBkaWZmZXJpbmcgdHlwZXMgd2lsbCBwZXJmb3JtIGJpbmFyeSBudW1lcmljIHByb21vdGlvbiBvZiB0aGUgb3BlcmFuZHM7IHdoZW4gdGhlc2Ugb3BlcmFuZHMgYXJlIG9mIHJlZmVyZW5jZSB0eXBlcywgdGhlIGV4cHJlc3Npb25cJ3MgcmVzdWx0IG1heSBub3QgYmUgb2YgdGhlIGV4cGVjdGVkIHR5cGUuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29uZGl0aW9uYWxFeHByZXNzaW9uTnVtZXJpY1Byb21vdGlvblxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogQ29tcGlsZS10aW1lIGNvbnN0YW50IGV4cHJlc3Npb24gb3ZlcmZsb3dzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQ29uc3RhbnRPdmVyZmxvd1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC0xMTE0LDExICsxNTM0LDIxIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUaHJlYWQgY3JlYXRlZCBidXQgbm90IHN0YXJ0ZWQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtEZWFkVGhyZWFkXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBEaXZpc2lvbiBieSBpbnRlZ2VyIGxpdGVyYWwgemVybycsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Rpdlplcm9cXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0RvTm90Q2FsbFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogRW1wdHkgc3RhdGVtZW50IGFmdGVyIGlmJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRW1wdHlJZlxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC0xMTI5LDcgKzE1NTksMTIgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IE1ldGhvZCBhbm5vdGF0ZWQgQEZvck92ZXJyaWRlIG11c3QgYmUgcHJvdGVjdGVkIG9yIHBhY2thZ2UtcHJpdmF0ZSBhbmQgb25seSBpbnZva2VkIGZyb20gZGVjbGFyaW5nIGNsYXNzJywKKyAgICAgICAgICdKYXZhOiA9PSBtdXN0IGJlIHVzZWQgaW4gZXF1YWxzIG1ldGhvZCB0byBjaGVjayBlcXVhbGl0eSB0byBpdHNlbGYgb3IgYW4gaW5maW5pdGUgbG9vcCB3aWxsIG9jY3VyLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0VxdWFsc1JlZmVyZW5jZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTWV0aG9kIGFubm90YXRlZCBARm9yT3ZlcnJpZGUgbXVzdCBiZSBwcm90ZWN0ZWQgb3IgcGFja2FnZS1wcml2YXRlIGFuZCBvbmx5IGludm9rZWQgZnJvbSBkZWNsYXJpbmcgY2xhc3MsIG9yIGZyb20gYW4gb3ZlcnJpZGUgb2YgdGhlIG1ldGhvZCcsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Zvck92ZXJyaWRlXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKQEAgLTExNDQsNiArMTU3OSwxMSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRG91YmxlTWF0aC5mdXp6eUVxdWFscyBzaG91bGQgbmV2ZXIgYmUgdXNlZCBpbiBhbiBPYmplY3QuZXF1YWxzKCkgbWV0aG9kJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRnV6enlFcXVhbHNTaG91bGROb3RCZVVzZWRJbkVxdWFsc01ldGhvZFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogQ2FsbGluZyBnZXRDbGFzcygpIG9uIGFuIGFubm90YXRpb24gbWF5IHJldHVybiBhIHByb3h5IGNsYXNzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbR2V0Q2xhc3NPbkFubm90YXRpb25cXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtMTE1NCwxNyArMTU5NCwxMiBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogQW4gb2JqZWN0IGlzIHRlc3RlZCBmb3IgZXF1YWxpdHkgdG8gaXRzZWxmIHVzaW5nIEd1YXZhIExpYnJhcmllcycsCi0gICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0d1YXZhU2VsZkVxdWFsc1xdIC4rIl19LAotICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCi0gICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCi0gICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogY29udGFpbnMoKSBpcyBhIGxlZ2FjeSBtZXRob2QgdGhhdCBpcyBlcXVpdmFsZW50IHRvIGNvbnRhaW5zVmFsdWUoKScsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0hhc2h0YWJsZUNvbnRhaW5zXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBXcml0aW5nICJhICYmIGEiLCAiYSB8fCBhIiwgImEgJiBhIiwgb3IgImEgfCBhIiBpcyBlcXVpdmFsZW50IHRvICJhIi4nLAorICAgICAgICAgJ0phdmE6IEEgYmluYXJ5IGV4cHJlc3Npb24gd2hlcmUgYm90aCBvcGVyYW5kcyBhcmUgdGhlIHNhbWUgaXMgdXN1YWxseSBpbmNvcnJlY3QuJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSWRlbnRpdHlCaW5hcnlFeHByZXNzaW9uXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKQEAgLTExNzQsNiArMTYwOSwxNiBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGhlIGZpcnN0IGFyZ3VtZW50IHRvIGluZGV4T2YgaXMgYSBVbmljb2RlIGNvZGUgcG9pbnQsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBpbmRleCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbmRleE9mQ2hhclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpbiB2YXJhcmdzIGNhbGwgY29udGFpbnMgYXJyYXkgYW5kIG5vbi1hcnJheSBhcmd1bWVudHMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbmV4YWN0VmFyYXJnc0NvbmRpdGlvbmFsXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBUaGlzIG1ldGhvZCBhbHdheXMgcmVjdXJzZXMsIGFuZCB3aWxsIGNhdXNlIGEgU3RhY2tPdmVyZmxvd0Vycm9yJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSW5maW5pdGVSZWN1cnNpb25cXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLApAQCAtMTE4OSwzNiArMTYzNCw3MSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogSW52YWxpZCB0aW1lIHpvbmUgaWRlbnRpZmllci4gVGltZVpvbmUuZ2V0VGltZVpvbmUoU3RyaW5nKSB3aWxsIHNpbGVudGx5IHJldHVybiBHTVQgaW5zdGVhZCBvZiB0aGUgdGltZSB6b25lIHlvdSBpbnRlbmRlZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJbnZhbGlkVGltZVpvbmVJRFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVGhlIGFyZ3VtZW50IHRvIENsYXNzI2lzSW5zdGFuY2UoT2JqZWN0KSBzaG91bGQgbm90IGJlIGEgQ2xhc3MnLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJc0luc3RhbmNlT2ZDbGFzc1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUGF0aCBpbXBsZW1lbnRzIEl0ZXJhYmxlXHUwMDNjUGF0aD47IHByZWZlciBDb2xsZWN0aW9uXHUwMDNjUGF0aD4gZm9yIGNsYXJpdHknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtJdGVyYWJsZVBhdGhQYXJhbWV0ZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IGpNb2NrIHRlc3RzIG11c3QgaGF2ZSBhIEBSdW5XaXRoKEpNb2NrLmNsYXNzKSBhbm5vdGF0aW9uLCBvciB0aGUgTW9ja2VyeSBmaWVsZCBtdXN0IGhhdmUgYSBAUnVsZSBKVW5pdCBhbm5vdGF0aW9uJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSk1vY2tUZXN0V2l0aG91dFJ1bldpdGhPclJ1bGVBbm5vdGF0aW9uXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBUZXN0IG1ldGhvZCB3aWxsIG5vdCBiZSBydW47IHBsZWFzZSBwcmVmaXggbmFtZSB3aXRoICJ0ZXN0IicsCisgICAgICAgICAnSmF2YTogVGVzdCBtZXRob2Qgd2lsbCBub3QgYmUgcnVuOyBwbGVhc2UgY29ycmVjdCBtZXRob2Qgc2lnbmF0dXJlIChTaG91bGQgYmUgcHVibGljLCBub24tc3RhdGljLCBhbmQgbWV0aG9kIG5hbWUgc2hvdWxkIGJlZ2luIHdpdGggInRlc3QiKS4nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdDNUZXN0Tm90UnVuXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBzZXRVcCgpIG1ldGhvZCB3aWxsIG5vdCBiZSBydW47IFBsZWFzZSBhZGQgYSBAQmVmb3JlIGFubm90YXRpb24nLAorICAgICAgICAgJ0phdmE6IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzdGF0aWMnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdDRDbGFzc0Fubm90YXRpb25Ob25TdGF0aWNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IHNldFVwKCkgbWV0aG9kIHdpbGwgbm90IGJlIHJ1bjsgcGxlYXNlIGFkZCBKVW5pdFwncyBAQmVmb3JlIGFubm90YXRpb24nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdDRTZXRVcE5vdFJ1blxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogdGVhckRvd24oKSBtZXRob2Qgd2lsbCBub3QgYmUgcnVuOyBQbGVhc2UgYWRkIGFuIEBBZnRlciBhbm5vdGF0aW9uJywKKyAgICAgICAgICdKYXZhOiB0ZWFyRG93bigpIG1ldGhvZCB3aWxsIG5vdCBiZSBydW47IHBsZWFzZSBhZGQgSlVuaXRcJ3MgQEFmdGVyIGFubm90YXRpb24nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdDRUZWFyRG93bk5vdFJ1blxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6Ci0gICAgICAgICAnSmF2YTogVGVzdCBtZXRob2Qgd2lsbCBub3QgYmUgcnVuOyBwbGVhc2UgYWRkIEBUZXN0IGFubm90YXRpb24nLAorICAgICAgICAgJ0phdmE6IFRoaXMgbG9va3MgbGlrZSBhIHRlc3QgbWV0aG9kIGJ1dCBpcyBub3QgcnVuOyBwbGVhc2UgYWRkIEBUZXN0IG9yIEBJZ25vcmUsIG9yLCBpZiB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgcmVkdWNlIGl0cyB2aXNpYmlsaXR5LicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pVbml0NFRlc3ROb3RSdW5cXSAuKyJdfSwKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEFuIG9iamVjdCBpcyB0ZXN0ZWQgZm9yIHJlZmVyZW5jZSBlcXVhbGl0eSB0byBpdHNlbGYgdXNpbmcgSlVuaXQgbGlicmFyeS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKVW5pdEFzc2VydFNhbWVDaGVja1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGhpcyBwYXR0ZXJuIHdpbGwgc2lsZW50bHkgY29ycnVwdCBjZXJ0YWluIGJ5dGUgc2VxdWVuY2VzIGZyb20gdGhlIHNlcmlhbGl6ZWQgcHJvdG9jb2wgbWVzc2FnZS4gVXNlIEJ5dGVTdHJpbmcgb3IgYnl0ZVtdIGRpcmVjdGx5JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTGl0ZUJ5dGVTdHJpbmdVdGY4XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBMb29wIGNvbmRpdGlvbiBpcyBuZXZlciBtb2RpZmllZCBpbiBsb29wIGJvZHkuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTG9vcENvbmRpdGlvbkNoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IE92ZXJyaWRpbmcgbWV0aG9kIGlzIG1pc3NpbmcgYSBjYWxsIHRvIG92ZXJyaWRkZW4gc3VwZXIgbWV0aG9kJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTWlzc2luZ1N1cGVyQ2FsbFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVXNlIG9mICJZWVlZIiAod2VlayB5ZWFyKSBpbiBhIGRhdGUgcGF0dGVybiB3aXRob3V0ICJ3dyIgKHdlZWsgaW4geWVhcikuIFlvdSBwcm9iYWJseSBtZWFudCB0byB1c2UgInl5eXkiICh5ZWFyKSBpbnN0ZWFkLicsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW01pc3VzZWRXZWVrWWVhclxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC0xMjM5LDYgKzE3MTksMTYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgbXVzdCBiZSBjbG9zZWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTXVzdEJlQ2xvc2VkQ2hlY2tlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGhlIGZpcnN0IGFyZ3VtZW50IHRvIG5Db3BpZXMgaXMgdGhlIG51bWJlciBvZiBjb3BpZXMsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBpdGVtIHRvIGNvcHknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtOQ29waWVzT2ZDaGFyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBATm9BbGxvY2F0aW9uIHdhcyBzcGVjaWZpZWQgb24gdGhpcyBtZXRob2QsIGJ1dCBzb21ldGhpbmcgd2FzIGZvdW5kIHRoYXQgd291bGQgdHJpZ2dlciBhbiBhbGxvY2F0aW9uJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTm9BbGxvY2F0aW9uXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTEyNTksNiArMTc0OSwxMSBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGhpcyBjb25kaXRpb25hbCBleHByZXNzaW9uIG1heSBldmFsdWF0ZSB0byBudWxsLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhbiBOUEUgd2hlbiB0aGUgcmVzdWx0IGlzIHVuYm94ZWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbTnVsbFRlcm5hcnlcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgogICAgICAgICAgJ0phdmE6IE51bWVyaWMgY29tcGFyaXNvbiB1c2luZyByZWZlcmVuY2UgZXF1YWxpdHkgaW5zdGVhZCBvZiB2YWx1ZSBlcXVhbGl0eScsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW051bWVyaWNFcXVhbGl0eVxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC0xMjY5LDExICsxNzY0LDYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgotICAgICAgICAgJ0phdmE6IFZhcmFyZ3MgZG9lc25cJ3QgYWdyZWUgZm9yIG92ZXJyaWRkZW4gbWV0aG9kJywKLSAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbT3ZlcnJpZGVzXF0gLisiXX0sCi0gICAgeydjYXRlZ29yeSc6ICdqYXZhJywKLSAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKLSAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBEZWNsYXJpbmcgdHlwZXMgaW5zaWRlIHBhY2thZ2UtaW5mby5qYXZhIGZpbGVzIGlzIHZlcnkgYmFkIGZvcm0nLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtQYWNrYWdlSW5mb1xdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC0xMjg5LDYgKzE3NzksMTYgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzaW5nIDo6ZXF1YWxzIGFzIGFuIGluY29tcGF0aWJsZSBQcmVkaWNhdGU7IHRoZSBwcmVkaWNhdGUgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUHJlZGljYXRlSW5jb21wYXRpYmxlVHlwZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQWNjZXNzIHRvIGEgcHJpdmF0ZSBwcm90b2NvbCBidWZmZXIgZmllbGQgaXMgZm9yYmlkZGVuLiBUaGlzIHByb3RvY29sIGJ1ZmZlciBjYXJyaWVzIGEgc2VjdXJpdHkgY29udHJhY3QsIGFuZCBjYW4gb25seSBiZSBjcmVhdGVkIHVzaW5nIGFuIGFwcHJvdmVkIGxpYnJhcnkuIERpcmVjdCBhY2Nlc3MgdG8gdGhlIGZpZWxkcyBpcyBmb3JiaWRkZW4uJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUHJpdmF0ZVNlY3VyaXR5Q29udHJhY3RQcm90b0FjY2Vzc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogUHJvdG9idWYgZmllbGRzIGNhbm5vdCBiZSBudWxsJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUHJvdG9GaWVsZE51bGxDb21wYXJpc29uXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTEyOTksNiArMTc5OSwxNiBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVG8gZ2V0IHRoZSB0YWcgbnVtYmVyIG9mIGEgcHJvdG9jb2wgYnVmZmVyIGVudW0sIHVzZSBnZXROdW1iZXIoKSBpbnN0ZWFkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Byb3RvY29sQnVmZmVyT3JkaW5hbFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ2FzdGluZyBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLjAsIDEuMCkgdG8gYW4gaW50ZWdlciBvciBsb25nIGFsd2F5cyByZXN1bHRzIGluIDAuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUmFuZG9tQ2FzdFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogVXNlIFJhbmRvbS5uZXh0SW50KGludCkuICBSYW5kb20ubmV4dEludCgpICUgbiBjYW4gaGF2ZSBuZWdhdGl2ZSByZXN1bHRzJywKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUmFuZG9tTW9kSW50ZWdlclxdIC4rIl19LAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCkBAIC0xMzI0LDEzICsxODM0LDEzIEBACiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBWYXJpYWJsZSBjb21wYXJlZCB0byBpdHNlbGYnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTZWxmRXF1YWxpdHlcXSAuKyJdfSwKKyAgICAgICAgICdKYXZhOiBUZXN0aW5nIGFuIG9iamVjdCBmb3IgZXF1YWxpdHkgd2l0aCBpdHNlbGYgd2lsbCBhbHdheXMgYmUgdHJ1ZS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTZWxmRXF1YWxzXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKLSAgICAgICAgICdKYXZhOiBBbiBvYmplY3QgaXMgdGVzdGVkIGZvciBlcXVhbGl0eSB0byBpdHNlbGYnLAotICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTZWxmRXF1YWxzXF0gLisiXX0sCisgICAgICAgICAnSmF2YTogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU2hvdWxkSGF2ZUV2ZW5BcmdzXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKICAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKICAgICAgJ2Rlc2NyaXB0aW9uJzoKQEAgLTEzNTksNiArMTg2OSwxNiBAQAogICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCiAgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCiAgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGhyb3dpbmcgXCdudWxsXCcgYWx3YXlzIHJlc3VsdHMgaW4gYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBiZWluZyB0aHJvd24uJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVGhyb3dOdWxsXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBpc0VxdWFsVG8gc2hvdWxkIG5vdCBiZSB1c2VkIHRvIHRlc3QgYW4gb2JqZWN0IGZvciBlcXVhbGl0eSB3aXRoIGl0c2VsZjsgdGhlIGFzc2VydGlvbiB3aWxsIG5ldmVyIGZhaWwuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVHJ1dGhTZWxmRXF1YWxzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKICAgICAgICAgICdKYXZhOiBDYXRjaGluZyBUaHJvd2FibGUvRXJyb3IgbWFza3MgZmFpbHVyZXMgZnJvbSBmYWlsKCkgb3IgYXNzZXJ0KigpIGluIHRoZSB0cnkgYmxvY2snLAogICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtUcnlGYWlsVGhyb3dhYmxlXF0gLisiXX0sCiAgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKQEAgLTEzODQsOCArMTkwNCwxOTMgQEAKICAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAogICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAogICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IGB2YXJgIHNob3VsZCBub3QgYmUgdXNlZCBhcyBhIHR5cGUgbmFtZS4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtWYXJUeXBlTmFtZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CiAgICAgICAgICAnSmF2YTogTWV0aG9kIHBhcmFtZXRlciBoYXMgd3JvbmcgcGFja2FnZScsCiAgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1BhcmFtZXRlclBhY2thZ2VcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFR5cGUgZGVjbGFyYXRpb24gYW5ub3RhdGVkIHdpdGggQFRocmVhZFNhZmUgaXMgbm90IHRocmVhZCBzYWZlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbVGhyZWFkU2FmZVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIG9mIGNsYXNzLCBmaWVsZCwgb3IgbWV0aG9kIHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBsZWdhY3kgQW5kcm9pZCBkZXZpY2VzJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbQW5kcm9pZEFwaUNoZWNrZXJcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEludmFsaWQgdXNlIG9mIEZsb2dnZXIgZm9ybWF0IHN0cmluZycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0FuZHJvaWRGbG9nZ2VyRm9ybWF0U3RyaW5nXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2UgVHVubmVsRXhjZXB0aW9uLmdldENhdXNlQXMoQ2xhc3MpIGluc3RlYWQgb2YgY2FzdGluZyB0aGUgcmVzdWx0IG9mIFR1bm5lbEV4Y2VwdGlvbi5nZXRDYXVzZSgpLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0RvTm90Q2FzdFR1bm5lbEV4Y2VwdGlvbkNhdXNlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBJZGVudGlmaWVzIHVuZGVzaXJhYmxlIG1vY2tzLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0RvTm90TW9ja19Gb3JKYXZhQnVpbGRlclxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRHVyYXRpb24gRmxhZyBzaG91bGQgTk9UIGhhdmUgdW5pdHMgaW4gdGhlIHZhcmlhYmxlIG5hbWUgb3IgdGhlIEBGbGFnU3BlY1wncyBuYW1lIG9yIGFsdE5hbWUgZmllbGQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRHVyYXRpb25GbGFnV2l0aFVuaXRzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBEdXJhdGlvbi5nZXQoKSBvbmx5IHdvcmtzIHdpdGggU0VDT05EUyBvciBOQU5PUy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtEdXJhdGlvbkdldFRlbXBvcmFsVW5pdFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogSW52YWxpZCBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZycsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0Zsb2dnZXJGb3JtYXRTdHJpbmdcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFRlc3QgY2xhc3MgbWF5IG5vdCBiZSBydW4gYmVjYXVzZSBpdCBpcyBtaXNzaW5nIGEgQFJ1bldpdGggYW5ub3RhdGlvbicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pVbml0NFJ1bldpdGhNaXNzaW5nXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2Ugb2YgY2xhc3MsIGZpZWxkLCBvciBtZXRob2QgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIEpESyA3JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSmF2YTdBcGlDaGVja2VyXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2Ugb2YgamF2YS50aW1lLkR1cmF0aW9uLndpdGhOYW5vcyhpbnQpIGlzIG5vdCBhbGxvd2VkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0phdmFEdXJhdGlvbldpdGhOYW5vc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIG9mIGphdmEudGltZS5EdXJhdGlvbi53aXRoU2Vjb25kcyhsb25nKSBpcyBub3QgYWxsb3dlZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKYXZhRHVyYXRpb25XaXRoU2Vjb25kc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogamF2YS50aW1lIEFQSXMgdGhhdCBzaWxlbnRseSB1c2UgdGhlIGRlZmF1bHQgc3lzdGVtIHRpbWUtem9uZSBhcmUgbm90IGFsbG93ZWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSmF2YVRpbWVEZWZhdWx0VGltZVpvbmVcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSBvZiBuZXcgRHVyYXRpb24obG9uZykgaXMgbm90IGFsbG93ZWQuIFBsZWFzZSB1c2UgRHVyYXRpb24ubWlsbGlzKGxvbmcpIGluc3RlYWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSm9kYUR1cmF0aW9uQ29uc3RydWN0b3JcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSBvZiBkdXJhdGlvbi53aXRoTWlsbGlzKGxvbmcpIGlzIG5vdCBhbGxvd2VkLiBQbGVhc2UgdXNlIER1cmF0aW9uLm1pbGxpcyhsb25nKSBpbnN0ZWFkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pvZGFEdXJhdGlvbldpdGhNaWxsaXNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSBvZiBpbnN0YW50LndpdGhNaWxsaXMobG9uZykgaXMgbm90IGFsbG93ZWQuIFBsZWFzZSB1c2UgbmV3IEluc3RhbnQobG9uZykgaW5zdGVhZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKb2RhSW5zdGFudFdpdGhNaWxsaXNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFVzZSBvZiBKb2RhVGltZVwncyB0eXBlLnBsdXMobG9uZykgb3IgdHlwZS5taW51cyhsb25nKSBpcyBub3QgYWxsb3dlZCAod2hlcmUgXHUwMDNjdHlwZT4gPSB7RHVyYXRpb24sSW5zdGFudCxEYXRlVGltZSxEYXRlTWlkbmlnaHR9KS4gUGxlYXNlIHVzZSB0eXBlLnBsdXMoRHVyYXRpb24ubWlsbGlzKGxvbmcpKSBvciB0eXBlLm1pbnVzKER1cmF0aW9uLm1pbGxpcyhsb25nKSkgaW5zdGVhZC4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtKb2RhUGx1c01pbnVzTG9uZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQ2hhbmdpbmcgSm9kYVRpbWVcJ3MgY3VycmVudCB0aW1lIGlzIG5vdCBhbGxvd2VkIGluIG5vbi10ZXN0b25seSBjb2RlLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0pvZGFTZXRDdXJyZW50TWlsbGlzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBVc2Ugb2YgSm9kYS1UaW1lXCdzIERhdGVUaW1lLnRvRGF0ZVRpbWUoKSwgRHVyYXRpb24udG9EdXJhdGlvbigpLCBJbnN0YW50LnRvSW5zdGFudCgpLCBJbnRlcnZhbC50b0ludGVydmFsKCksIGFuZCBQZXJpb2QudG9QZXJpb2QoKSBhcmUgbm90IGFsbG93ZWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSm9kYVRvU2VsZlxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVXNlIG9mIEpvZGFUaW1lXCdzIHR5cGUud2l0aER1cmF0aW9uQWRkZWQobG9uZywgaW50KSAod2hlcmUgXHUwMDNjdHlwZT4gPSB7RHVyYXRpb24sSW5zdGFudCxEYXRlVGltZX0pLiBQbGVhc2UgdXNlIHR5cGUud2l0aER1cmF0aW9uQWRkZWQoRHVyYXRpb24ubWlsbGlzKGxvbmcpLCBpbnQpIGluc3RlYWQuJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbSm9kYVdpdGhEdXJhdGlvbkFkZGVkTG9uZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogTGFuZ3VhZ2VDb2RlIGNvbXBhcmlzb24gdXNpbmcgcmVmZXJlbmNlIGVxdWFsaXR5IGluc3RlYWQgb2YgdmFsdWUgZXF1YWxpdHknLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtMYW5ndWFnZUNvZGVFcXVhbGl0eVxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVGhlIHplcm8gYXJndW1lbnQgdG9TdHJpbmcgaXMgbm90IHBhcnQgb2YgdGhlIExvY2FsaXphYmxlIGludGVyZmFjZSBhbmQgbGlrZWx5IGlzIGp1c3QgdGhlIGphdmEgT2JqZWN0IHRvU3RyaW5nLiAgWW91IHByb2JhYmx5IHdhbnQgdG8gY2FsbCB0b1N0cmluZyhMb2NhbGUpLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0xvY2FsaXphYmxlV3JvbmdUb1N0cmluZ1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUGVyaW9kLmdldCgpIG9ubHkgd29ya3Mgd2l0aCBZRUFSUywgTU9OVEhTLCBvciBEQVlTLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1BlcmlvZEdldFRlbXBvcmFsVW5pdFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogUmV0dXJuIHZhbHVlIG9mIG1ldGhvZHMgcmV0dXJuaW5nIFByb21pc2UgbXVzdCBiZSBjaGVja2VkLiBJZ25vcmluZyByZXR1cm5lZCBQcm9taXNlcyBzdXBwcmVzc2VzIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gdGhlIGNvZGUgdGhhdCBjb21wbGV0ZXMgdGhlIFByb21pc2VzLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1Byb21pc2VSZXR1cm5WYWx1ZUlnbm9yZWRcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IFdoZW4gcmV0dXJuaW5nIGEgUHJvbWlzZSwgdXNlIHRoZW5DaGFpbigpIGluc3RlYWQgb2YgdGhlbigpJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUHJvbWlzZVRoZW5SZXR1cm5pbmdQcm9taXNlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBTdHJlYW1zLml0ZXJhdGluZygpIGlzIHVuc2FmZSBmb3IgdXNlIGV4Y2VwdCBpbiB0aGUgaGVhZGVyIG9mIGEgZm9yLWVhY2ggbG9vcDsgcGxlYXNlIHNlZSBpdHMgSmF2YWRvYyBmb3IgZGV0YWlscy4nLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtTdHJlYW1zSXRlcmF0aW5nTm90SW5Mb29wXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBUZW1wb3JhbEFjY2Vzc29yLmdldCgpIG9ubHkgd29ya3MgZm9yIGNlcnRhaW4gdmFsdWVzIG9mIENocm9ub0ZpZWxkLicsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1RlbXBvcmFsQWNjZXNzb3JHZXRDaHJvbm9GaWVsZFxdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogVHJ5LXdpdGgtcmVzb3VyY2VzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBjb2RlLCB1c2UgdHJ5L2ZpbmFsbHkgaW5zdGVhZCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW1RyeVdpdGhSZXNvdXJjZXNcXSAuKyJdfSwKKyAgICB7J2NhdGVnb3J5JzogJ2phdmEnLAorICAgICAnc2V2ZXJpdHknOiBTZXZlcml0eS5ISUdILAorICAgICAnZGVzY3JpcHRpb24nOgorICAgICAgICAgJ0phdmE6IEFkZHMgY2hlY2tPclRocm93IGNhbGxzIHdoZXJlIG5lZWRlZCcsCisgICAgICdwYXR0ZXJucyc6IFtyIi4qOiB3YXJuaW5nOiBcW0FkZENoZWNrT3JUaHJvd1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogRXF1YWxpdHkgb24gTmFubyBwcm90b3MgKD09IG9yIC5lcXVhbHMpIG1pZ2h0IG5vdCBiZSB0aGUgc2FtZSBpbiBMaXRlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRm9yYmlkTmFub0VxdWFsaXR5XF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBTdWJtZXNzYWdlcyBvZiBhIHByb3RvIGNhbm5vdCBiZSBtdXRhdGVkJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbRm9yYmlkU3VibWVzc2FnZU11dGF0aW9uXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBSZXBlYXRlZCBmaWVsZHMgb24gcHJvdG8gbWVzc2FnZXMgY2Fubm90IGJlIGRpcmVjdGx5IHJlZmVyZW5jZWQnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtOYW5vVW5zYWZlUmVwZWF0ZWRGaWVsZFVzYWdlXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBSZXF1aXJlcyB0aGF0IG5vbi1AZW51bSBpbnQgYXNzaWdubWVudHMgdG8gQGVudW0gaW50cyBpcyB3cmFwcGVkIGluIGEgY2hlY2tPclRocm93JywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbUmVxdWlyZUNoZWNrT3JUaHJvd1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQXNzaWdubWVudHMgaW50byByZXBlYXRlZCBmaWVsZCBlbGVtZW50cyBtdXN0IGJlIHNlcXVlbnRpYWwnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtSZXF1aXJlU2VxdWVudGlhbFJlcGVhdGVkRmllbGRzXF0gLisiXX0sCisgICAgeydjYXRlZ29yeSc6ICdqYXZhJywKKyAgICAgJ3NldmVyaXR5JzogU2V2ZXJpdHkuSElHSCwKKyAgICAgJ2Rlc2NyaXB0aW9uJzoKKyAgICAgICAgICdKYXZhOiBGdXR1cmUuZ2V0IGluIEdvb2dsZSBOb3cgUHJvZHVjZXJzIGNvZGUnLAorICAgICAncGF0dGVybnMnOiBbciIuKjogd2FybmluZzogXFtGdXR1cmVHZXRJbk5vd1Byb2R1Y2Vyc1xdIC4rIl19LAorICAgIHsnY2F0ZWdvcnknOiAnamF2YScsCisgICAgICdzZXZlcml0eSc6IFNldmVyaXR5LkhJR0gsCisgICAgICdkZXNjcmlwdGlvbic6CisgICAgICAgICAnSmF2YTogQFNpbXBsZUVudW0gYXBwbGllZCB0byBub24tZW51bSB0eXBlJywKKyAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IFxbU2ltcGxlRW51bVVzYWdlXF0gLisiXX0sCiAKICAgICAjIEVuZCB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgRXJyb3IgUHJvbmUKIApAQCAtMTgwNyw2ICsyNTEyLDcgQEAKICAgICAgJ3BhdHRlcm5zJzogW3IiLio6IHdhcm5pbmc6IEluIGZpbGUgaW5jbHVkZWQgZnJvbSAuKywiXX0sCiAKICAgICAjIHdhcm5pbmdzIGZyb20gY2xhbmctdGlkeQorICAgIGdyb3VwX3RpZHlfd2Fybl9wYXR0ZXJuKCdhbmRyb2lkJyksCiAgICAgZ3JvdXBfdGlkeV93YXJuX3BhdHRlcm4oJ2NlcnQnKSwKICAgICBncm91cF90aWR5X3dhcm5fcGF0dGVybignY2xhbmctZGlhZ25vc3RpYycpLAogICAgIGdyb3VwX3RpZHlfd2Fybl9wYXR0ZXJuKCdjcHBjb3JlZ3VpZGVsaW5lcycpLApAQCAtMjM3MCw3ICszMDc2LDcgQEAKICAgZm9yIGlkeCBpbiByZXZlcnNlZChyYW5nZSgyLCBsZW4ocGFydHMpKSk6CiAgICAgcm9vdF9wYXRoID0gJy8nLmpvaW4ocGFydHNbOmlkeF0pCiAgICAgIyBBbmRyb2lkIHJvb3QgZGlyZWN0b3J5IHNob3VsZCBjb250YWluIHRoaXMgc2NyaXB0LgotICAgIGlmIG9zLnBhdGguZXhpc3RzKHJvb3RfcGF0aCArICcvYnVpbGQvdG9vbHMvd2Fybi5weScpOgorICAgIGlmIG9zLnBhdGguZXhpc3RzKHJvb3RfcGF0aCArICcvYnVpbGQvbWFrZS90b29scy93YXJuLnB5Jyk6CiAgICAgICBhbmRyb2lkX3Jvb3QgPSByb290X3BhdGgKICAgICAgIHJldHVybiByb290X3BhdGgKICAgcmV0dXJuICcnCmRpZmYgLS1naXQgYS90b29scy96aXBhbGlnbi9BbmRyb2lkLmJwIGIvdG9vbHMvemlwYWxpZ24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTYxOTZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvemlwYWxpZ24vQW5kcm9pZC5icApAQCAtMCwwICsxLDM2IEBACisvLworLy8gQ29weXJpZ2h0IDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFppcCBhbGlnbm1lbnQgdG9vbAorLy8KKworY2NfYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJ6aXBhbGlnbiIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJaaXBBbGlnbi5jcHAiLAorICAgICAgICAiWmlwRW50cnkuY3BwIiwKKyAgICAgICAgIlppcEZpbGUuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKworICAgIC8vIE5PVEU6IERvIG5vdCBhZGQgYW55IHNoYXJlZF9saWJzIGRlcGVuZGVuY2llcyBiZWNhdXNlIHRoZXkgd2lsbCBicmVhayB0aGUKKyAgICAvLyBzdGF0aWNfc2RrX3Rvb2xzIHRhcmdldC4KKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJ6b3BmbGkiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgd2luZG93czogeworICAgICAgICAgICAgaG9zdF9sZGxpYnM6IFsiLWxwdGhyZWFkIl0sCisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS90b29scy96aXBhbGlnbi9BbmRyb2lkLm1rIGIvdG9vbHMvemlwYWxpZ24vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwMjQwYS4uMDAwMDAwMAotLS0gYS90b29scy96aXBhbGlnbi9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyAKLSMgQ29weXJpZ2h0IDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBaaXAgYWxpZ25tZW50IHRvb2wKLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLQlaaXBBbGlnbi5jcHAgXAotCVppcEVudHJ5LmNwcCBcCi0JWmlwRmlsZS5jcHAKLQotTE9DQUxfQ19JTkNMVURFUyArPSBleHRlcm5hbC96bGliIFwKLQlleHRlcm5hbC96b3BmbGkvc3JjCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotCWxpYmFuZHJvaWRmdyBcCi0JbGlidXRpbHMgXAotCWxpYmN1dGlscyBcCi0JbGlibG9nIFwKLQlsaWJ6b3BmbGkKLQotTE9DQUxfTERMSUJTX2xpbnV4ICs9IC1scnQKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFU193aW5kb3dzICs9IGxpYnoKLUxPQ0FMX0xETElCU19saW51eCArPSAtbHoKLUxPQ0FMX0xETElCU19kYXJ3aW4gKz0gLWx6Ci0KLWlmbmVxICgkKHN0cmlwICQoQlVJTERfSE9TVF9zdGF0aWMpKSwpCi1MT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCi1lbmRpZiAjIEJVSUxEX0hPU1Rfc3RhdGljCi0KLUxPQ0FMX01PRFVMRSA6PSB6aXBhbGlnbgotTE9DQUxfTU9EVUxFX0hPU1RfT1MgOj0gZGFyd2luIGxpbnV4IHdpbmRvd3MKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3ppcGFsaWduL1ppcEZpbGUuY3BwIGIvdG9vbHMvemlwYWxpZ24vWmlwRmlsZS5jcHAKaW5kZXggMWIzOTkwMi4uNDNiYzliZiAxMDA2NDQKLS0tIGEvdG9vbHMvemlwYWxpZ24vWmlwRmlsZS5jcHAKKysrIGIvdG9vbHMvemlwYWxpZ24vWmlwRmlsZS5jcHAKQEAgLTIwLDEzICsyMCwxMiBAQAogCiAjZGVmaW5lIExPR19UQUcgInppcCIKIAotI2luY2x1ZGUgPGFuZHJvaWRmdy9aaXBVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHppcGFyY2hpdmUvemlwX2FyY2hpdmUuaD4KIAogI2luY2x1ZGUgIlppcEZpbGUuaCIKIAogI2luY2x1ZGUgPHpsaWIuaD4KLSNkZWZpbmUgREVGX01FTV9MRVZFTCA4ICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5IGluIHp1dGlsLmg/CiAKICNpbmNsdWRlICJ6b3BmbGkvZGVmbGF0ZS5oIgogCkBAIC0xMzUsNyArMTM0LDcgQEAKIC8qCiAgKiBSZXR1cm4gdGhlIE50aCBlbnRyeSBpbiB0aGUgYXJjaGl2ZS4KICAqLwotWmlwRW50cnkqIFppcEZpbGU6OmdldEVudHJ5QnlJbmRleChpbnQgaWR4KSBjb25zdAorYW5kcm9pZDo6WmlwRW50cnkqIFppcEZpbGU6OmdldEVudHJ5QnlJbmRleChpbnQgaWR4KSBjb25zdAogewogICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSAoaW50KSBtRW50cmllcy5zaXplKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTQ2LDcgKzE0NSw3IEBACiAvKgogICogRmluZCBhbiBlbnRyeSBieSBuYW1lLgogICovCi1aaXBFbnRyeSogWmlwRmlsZTo6Z2V0RW50cnlCeU5hbWUoY29uc3QgY2hhciogZmlsZU5hbWUpIGNvbnN0CithbmRyb2lkOjpaaXBFbnRyeSogWmlwRmlsZTo6Z2V0RW50cnlCeU5hbWUoY29uc3QgY2hhciogZmlsZU5hbWUpIGNvbnN0CiB7CiAgICAgLyoKICAgICAgKiBEbyBhIHN0dXBpZCBsaW5lYXIgc3RyaW5nLWNvbXBhcmUgc2VhcmNoLgpAQCAtNzg1LDggKzc4NCw2IEBACiBzdGF0dXNfdCBaaXBGaWxlOjpjb3B5RGF0YVRvRnAoRklMRSogZHN0RnAsCiAgICAgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIHVpbnQzMl90KiBwQ1JDMzIpCiB7Ci0gICAgc2l6ZV90IGNvdW50OwotCiAgICAgKnBDUkMzMiA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwogICAgIGlmIChzaXplID4gMCkgewogICAgICAgICAqcENSQzMyID0gY3JjMzIoKnBDUkMzMiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWRhdGEsIHNpemUpOwpAQCAtMTE5OCw2ICsxMTk1LDU4IEBACiB9CiAjZW5kaWYKIAorY2xhc3MgQnVmZmVyV3JpdGVyIDogcHVibGljIHppcF9hcmNoaXZlOjpXcml0ZXIgeworICBwdWJsaWM6CisgICAgQnVmZmVyV3JpdGVyKHZvaWQqIGJ1Ziwgc2l6ZV90IHNpemUpIDogV3JpdGVyKCksCisgICAgICAgIGJ1Zl8ocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmKSksIHNpemVfKHNpemUpLCBieXRlc193cml0dGVuXygwKSB7fQorCisgICAgYm9vbCBBcHBlbmQodWludDhfdCogYnVmLCBzaXplX3QgYnVmX3NpemUpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKGJ5dGVzX3dyaXR0ZW5fICsgYnVmX3NpemUgPiBzaXplXykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KGJ1Zl8gKyBieXRlc193cml0dGVuXywgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIGJ5dGVzX3dyaXR0ZW5fICs9IGJ1Zl9zaXplOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB1aW50OF90KiBjb25zdCBidWZfOworICAgIGNvbnN0IHNpemVfdCBzaXplXzsKKyAgICBzaXplX3QgYnl0ZXNfd3JpdHRlbl87Cit9OworCitjbGFzcyBGaWxlUmVhZGVyIDogcHVibGljIHppcF9hcmNoaXZlOjpSZWFkZXIgeworICBwdWJsaWM6CisgICAgRmlsZVJlYWRlcihGSUxFKiBmcCkgOiBSZWFkZXIoKSwgZnBfKGZwKSwgY3VycmVudF9vZmZzZXRfKDApIHsKKyAgICB9CisKKyAgICBib29sIFJlYWRBdE9mZnNldCh1aW50OF90KiBidWYsIHNpemVfdCBsZW4sIHVpbnQzMl90IG9mZnNldCkgY29uc3QgeworICAgICAgICAvLyBEYXRhIGlzIHVzdWFsbHkgcmVxdWVzdGVkIHNlcXVlbnRpYWxseSwgc28gdGhpcyBoZWxwcyBhdm9pZCBwb2ludGxlc3MKKyAgICAgICAgLy8gZnNlZWtzIGV2ZXJ5IHRpbWUgd2UgcGVyZm9ybSBhIHJlYWQuIFRoZXJlJ3MgYW4gaW1wZWRlbmNlIG1pc21hdGNoCisgICAgICAgIC8vIGhlcmUgYmVjYXVzZSB0aGUgb3JpZ2luYWwgQVBJIHdhcyBkZXNpZ25lZCBhcm91bmQgcHJlYWQgYW5kIHB3cml0ZS4KKyAgICAgICAgaWYgKG9mZnNldCAhPSBjdXJyZW50X29mZnNldF8pIHsKKyAgICAgICAgICAgIGlmIChmc2VlayhmcF8sIG9mZnNldCwgU0VFS19TRVQpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cnJlbnRfb2Zmc2V0XyA9IG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCByZWFkID0gZnJlYWQoYnVmLCAxLCBsZW4sIGZwXyk7CisgICAgICAgIGlmIChyZWFkICE9IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudF9vZmZzZXRfICs9IHJlYWQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICBwcml2YXRlOgorICAgIEZJTEUqIGZwXzsKKyAgICBtdXRhYmxlIHVpbnQzMl90IGN1cnJlbnRfb2Zmc2V0XzsKK307CisKIC8vIGZyZWUgdGhlIG1lbW9yeSB3aGVuIHlvdSdyZSBkb25lCiB2b2lkKiBaaXBGaWxlOjp1bmNvbXByZXNzKGNvbnN0IFppcEVudHJ5KiBlbnRyeSkgY29uc3QKIHsKQEAgLTEyNDAsMTEgKzEyODksMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFppcEVudHJ5OjprQ29tcHJlc3NEZWZsYXRlZDogewotICAgICAgICAgICAgaWYgKCFaaXBVdGlsczo6aW5mbGF0ZVRvQnVmZmVyKG1aaXBGcCwgYnVmLCB1bmxlbiwgY2xlbikpIHsKKyAgICAgICAgICAgIGNvbnN0IEZpbGVSZWFkZXIgcmVhZGVyKG1aaXBGcCk7CisgICAgICAgICAgICBCdWZmZXJXcml0ZXIgd3JpdGVyKGJ1ZiwgdW5sZW4pOworICAgICAgICAgICAgaWYgKHppcF9hcmNoaXZlOjpJbmZsYXRlKHJlYWRlciwgY2xlbiwgdW5sZW4sICZ3cml0ZXIsIG51bGxwdHIpICE9IDApIHsKICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgZ290byBiYWlsOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3ppcHRpbWUvQW5kcm9pZC5icCBiL3Rvb2xzL3ppcHRpbWUvQW5kcm9pZC5icAppbmRleCA4NzRkMzQ2Li41ZWY0NWVkIDEwMDY0NAotLS0gYS90b29scy96aXB0aW1lL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvemlwdGltZS9BbmRyb2lkLmJwCkBAIC0yNyw2ICsyNyw3IEBACiAgICAgXSwKIAogICAgIG5hbWU6ICJ6aXB0aW1lIiwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogICAgIHRhcmdldDogewogICAgICAgICB3aW5kb3dzOiB7CiAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLApkaWZmIC0tZ2l0IGEvdG9vbHMvemlwdGltZS9aaXBFbnRyeS5jcHAgYi90b29scy96aXB0aW1lL1ppcEVudHJ5LmNwcAppbmRleCA1MWNlMDlmLi5lN2I1MmVkIDEwMDY0NAotLS0gYS90b29scy96aXB0aW1lL1ppcEVudHJ5LmNwcAorKysgYi90b29scy96aXB0aW1lL1ppcEVudHJ5LmNwcApAQCAtODYsNyArODYsNiBAQAogICovCiBzdGF0dXNfdCBaaXBFbnRyeTo6TG9jYWxGaWxlSGVhZGVyOjpyZXdyaXRlKEZJTEUqIGZwKQogewotICAgIHN0YXR1c190IHJlc3VsdCA9IDA7CiAgICAgdWludDhfdCBidWZba0xGSExlbl07CiAKICAgICBpZiAoZnJlYWQoYnVmLCAxLCBrTEZITGVuLCBmcCkgIT0ga0xGSExlbikKQEAgLTEyNCw3ICsxMjMsNiBAQAogICovCiBzdGF0dXNfdCBaaXBFbnRyeTo6Q2VudHJhbERpckVudHJ5OjpyZXdyaXRlKEZJTEUqIGZwKQogewotICAgIHN0YXR1c190IHJlc3VsdCA9IDA7CiAgICAgdWludDhfdCBidWZba0NERUxlbl07CiAgICAgdWludDE2X3QgZmlsZU5hbWVMZW5ndGgsIGV4dHJhRmllbGRMZW5ndGgsIGZpbGVDb21tZW50TGVuZ3RoOwogCg==